Revert "Merge changes from topic "protobuf3.5.2""

This reverts commit 584979bf55601bd23e533d704a75cd0e95af66b9, reversing
changes made to 219bbcdcd5b1dbf19758ff2e75d971b98215896d:
      Remove libprotobuf-java-lite
      Update stubs
      Revert "Wrap liblog dependency in GOOGLE_PROTOBUF_MIN_LOG_LEVEL"
      Update javamicro to compile against v3.5.2
      Update Android.bp to match BUILD
      Rerun configure
      Merge tag 'v3.5.2' into master
      Revert "Remove 2 usage of isspace as they are not stl port compatible"
      Revert "Use GOOGLE_CHECK Macro for validation"
      Revert "Emit macros with proper parentheses."
      Revert "Generate syntactically correct java for imports from classes with no packages."
      Revert "Fix some unused parameter warnings"
      Revert "protobuf: work around a static analyzer bug"
      Revert "Suppress clang-analyzer-core.uninitialized.UndefReturn warning."

Change-Id: Ia04c0b15ebd45e8c7e02edaa6e1f10aeb11ef337
(cherry picked from commit 11fb7aeddd6ff7229bcf0834017f8091f97d7edb)
diff --git a/.gitignore b/.gitignore
index af88e22..27eeb9c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,7 +47,6 @@
 map*unittest.pb.*
 unittest*.pb.*
 cpp_test*.pb.*
-src/google/protobuf/compiler/js/well_known_types_embed.cc
 src/google/protobuf/util/**/*.pb.cc
 src/google/protobuf/util/**/*.pb.h
 
@@ -61,16 +60,10 @@
 python/google/protobuf/compiler/
 python/google/protobuf/util/
 
-src/js_embed
 src/protoc
 src/unittest_proto_middleman
 
-# vim generated
-*.swp
-
 # Generated test scaffolding
-src/no_warning_test.cc
-src/no-warning-test
 src/protobuf*-test
 src/test_plugin
 src/testzip.*
@@ -84,11 +77,8 @@
 src/**/*.trs
 
 # JavaBuild output.
-java/core/target
-java/util/target
+java/target
 javanano/target
-java/.idea
-java/**/*.iml
 
 # Windows native output.
 cmake/build
@@ -98,14 +88,16 @@
 # packages themselves.
 /csharp/src/packages/*/
 
+# Directories created by opening the Objective C Xcode projects.
+objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcuserdata/
+objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcshareddata/ProtocolBuffers_OSX.xccheckout
+objectivec/ProtocolBuffers_OSX.xcodeproj/xcuserdata/
+objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcuserdata/
+objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/ProtocolBuffers_iOS.xccheckout
+objectivec/ProtocolBuffers_iOS.xcodeproj/xcuserdata/
 # OS X's Finder creates these for state about opened windows/etc.
 **/.DS_Store
 
-# Cocoapods artifacts
-# Podfile.lock and the workspace file are tracked, to ease deleting them. That's
-# needed to trigger "pod install" to rerun the preinstall commands.
-Pods/
-
 # Comformance test output
 conformance/.libs/
 conformance/com/
@@ -118,65 +110,8 @@
 conformance/conformance.pb.h
 conformance/Conformance.pbobjc.h
 conformance/Conformance.pbobjc.m
-conformance/conformance_pb.js
-conformance/conformance_pb.rb
-conformance/failing_tests.txt
+conformance/conformance.rb
 conformance/google/
-conformance/google-protobuf/
 conformance/javac_middleman
 conformance/lite/
-conformance/nonexistent_tests.txt
 conformance/protoc_middleman
-conformance/succeeding_tests.txt
-conformance/Conformance/
-conformance/GPBMetadata/
-conformance/Google/
-conformance/Protobuf_test_messages/
-conformance/conformance-php
-conformance/conformance-php-c
-conformance/*.class
-
-# php test output
-composer.lock
-php/tests/generated/
-php/tests/old_protoc
-php/tests/protobuf/
-php/ext/google/protobuf/.libs/
-php/ext/google/protobuf/Makefile.fragments
-php/ext/google/protobuf/Makefile.global
-php/ext/google/protobuf/Makefile.objects
-php/ext/google/protobuf/acinclude.m4
-php/ext/google/protobuf/build/
-php/ext/google/protobuf/config.h
-php/ext/google/protobuf/config.nice
-php/ext/google/protobuf/configure.in
-php/ext/google/protobuf/mkinstalldirs
-php/ext/google/protobuf/run-tests.php
-vendor/
-
-# JavaScript artifacts
-js/commonjs_out/
-js/compatibility_tests/v3.0.0/commonjs_out*
-js/compatibility_tests/v3.0.0/protoc
-js/compatibility_tests/v3.0.0/testproto_libs1.js
-js/compatibility_tests/v3.0.0/testproto_libs1_new.js
-js/compatibility_tests/v3.0.0/testproto_libs2.js
-js/compatibility_tests/v3.0.0/testproto_libs2_new.js
-js/deps.js
-js/google-protobuf.js
-js/google/
-js/node_modules/
-js/testproto_libs1.js
-js/testproto_libs2.js
-
-# Ignore the bazel symlinks
-/bazel-*
-
-# ruby test output
-ruby/lib/
-ruby/tests/generated_code_pb.rb
-ruby/tests/test_import_pb.rb
-ruby/Gemfile.lock
-ruby/compatibility_tests/v3.0.0/protoc
-ruby/compatibility_tests/v3.0.0/tests/generated_code_pb.rb
-ruby/compatibility_tests/v3.0.0/tests/test_import_pb.rb
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 55a47ce..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "third_party/benchmark"]
-	path = third_party/benchmark
-	url = https://github.com/google/benchmark.git
diff --git a/.travis.yml b/.travis.yml
index e7853eb..bcf3851 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,76 +1,66 @@
 sudo: required
-dist: trusty
 # Note: travis currently does not support listing more than one language so
 # this cheats and claims to only be cpp.  If they add multiple language
 # support, this should probably get updated to install steps and/or
 # rvm/gemfile/jdk/etc. entries rather than manually doing the work.
 language: cpp
 os:
+  - linux
   - osx
 # The Objective C build needs Xcode 7.0 or later.
-osx_image: xcode8.3
+osx_image: xcode7.2
 script:
   - ./tests.sh $CONFIG
 env:
   - CONFIG=cpp
   - CONFIG=cpp_distcheck
+  - CONFIG=csharp
   - CONFIG=golang
+  - CONFIG=java_jdk6
   - CONFIG=java_jdk7
   - CONFIG=java_oracle7
+  - CONFIG=javanano_jdk6
   - CONFIG=javanano_jdk7
   - CONFIG=javanano_oracle7
   - CONFIG=javascript
-  # iOS build log was starting to choke travis UI, so split to cover the
-  # Xcode Debug and Release Configurations independently.
-  - CONFIG=objectivec_ios_debug
-  - CONFIG=objectivec_ios_release
-  - CONFIG=objectivec_osx
-  - CONFIG=objectivec_cocoapods_integration
   - CONFIG=python
   - CONFIG=python_cpp
+  - CONFIG=ruby19
+  - CONFIG=ruby20
   - CONFIG=ruby21
   - CONFIG=ruby22
   - CONFIG=jruby
-  - CONFIG=php5.6_mac
-  - CONFIG=php7.0_mac
 matrix:
   exclude:
     # It's nontrivial to programmatically install a new JDK from the command
     # line on OS X, so we rely on testing on Linux for Java code.
     - os: osx
+      env: CONFIG=java_jdk6
+    - os: osx
       env: CONFIG=java_jdk7
     - os: osx
       env: CONFIG=java_oracle7
     - os: osx
+      env: CONFIG=javanano_jdk6
+    - os: osx
       env: CONFIG=javanano_jdk7
     - os: osx
       env: CONFIG=javanano_oracle7
+    # Requires installing mono, currently travis.sh is doing that with apt-get
+    # which doesn't work on OS X.
+    - os: osx
+      env: CONFIG=csharp
     # Requires installing golang, currently travis.sh is doing that with apt-get
     # which doesn't work on OS X.
     - os: osx
       env: CONFIG=golang
+  # Add into the matrix OS X tests of Objective C (needs Xcode, so it won't
+  # work on other platforms). These are split so it doesn't take as long to run.
   include:
-    # The dotnet environment requires Ubuntu 14.04 or 16.04. This
-    # configuration is effectively an "extra" one, outside the
-    # autogenerated matrix.
-    - os: linux
-      env: CONFIG=csharp
-      language: csharp
-      dist: trusty
-      dotnet: 1.0.1
-      mono: none
-    # This test is kept on travis because it doesn't play nicely with other
-    # tests on jenkins running in parallel.
-    - os: linux
-      env: CONFIG=cpp_distcheck
-    # The Java compatibility test currently only runs on Linux because it will
-    # fetch pre-built Linux protoc binaries in the test.
-    - os: linux
-      env: CONFIG=java_compatibility
-    # The Python compatibility test currently only runs on Linux because it will
-    # fetch pre-built Linux protoc binaries in the test.
-    - os: linux
-      env: CONFIG=python_compatibility
+    - os: osx
+      env: CONFIG=objectivec_ios
+    - os: osx
+      env: CONFIG=objectivec_osx
   allow_failures:
     # These currently do not work on OS X but are being worked on by @haberman.
     - os: osx
@@ -81,11 +71,14 @@
     # we moved to an OS X image that is 10.11.
     - os: osx
       env: CONFIG=python_cpp
-    # Mark the iOS test as flakey as xcodebuild some times fails to start the
-    # iOS Simulator.
+    # xctool 0.2.8 seems to have a bug where it randomly kills tests saying
+    # they failed.
+    #   https://github.com/facebook/xctool/issues/619
+    #   https://github.com/google/protobuf/issues/1232
+    # travis updated their images to include 0.2.8:
+    #   https://blog.travis-ci.com/2016-03-23-xcode-image-updates
+    # Mark the iOS test as flakey so these failures don't turn things red.
     - os: osx
-      env: CONFIG=objectivec_ios_debug
-    - os: osx
-      env: CONFIG=objectivec_ios_release
+      env: CONFIG=objectivec_ios
 notifications:
   email: false
diff --git a/Android.bp b/Android.bp
index 578a2ab..c63d138 100644
--- a/Android.bp
+++ b/Android.bp
@@ -14,20 +14,37 @@
 //
 //
 
+IGNORED_WARNINGS = [
+    "-Wno-sign-compare",
+    "-Wno-unused-parameter",
+    "-Wno-sign-promo",
+    "-Wno-error=return-type",
+]
+
 cc_defaults {
     name: "protobuf-cflags-defaults",
+    clang_cflags: [
+        "-Wno-error=unused-const-variable",
+        "-Wno-error=user-defined-warnings",
+    ],
     cflags: [
         "-Wall",
-        "-Werror",
+        "-Wno-error=format",
+        "-Wno-error=format-extra-args",
+        "-Wno-error=ignored-qualifiers",
+        "-Wno-error=sign-promo",
         "-Wno-unused-function",
-        "-Wno-sign-compare",
-        "-Wno-unused-parameter",
-        "-Wno-sign-promo",
     ],
-
     target: {
         windows: {
-            cflags: ["-Wno-macro-redefined"],
+            cflags: ["-Wno-error"],
+        },
+        // cannot suppress gcc warning on redefined macros
+        not_windows: {
+            cflags: ["-Werror"],
+        },
+        android: {
+            cflags: ["-Werror"],
         },
     },
 }
@@ -36,22 +53,11 @@
     name: "libprotobuf-cpp-lite-defaults",
     defaults: ["protobuf-cflags-defaults"],
     srcs: [
-        "src/google/protobuf/arena.cc",
-        "src/google/protobuf/arenastring.cc",
-        "src/google/protobuf/extension_set.cc",
-        "src/google/protobuf/generated_message_table_driven_lite.cc",
-        "src/google/protobuf/generated_message_util.cc",
-        "src/google/protobuf/io/coded_stream.cc",
-        "src/google/protobuf/io/zero_copy_stream.cc",
-        "src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
-        "src/google/protobuf/message_lite.cc",
-        "src/google/protobuf/repeated_field.cc",
         "src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc",
         "src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc",
         "src/google/protobuf/stubs/bytestream.cc",
         "src/google/protobuf/stubs/common.cc",
         "src/google/protobuf/stubs/int128.cc",
-        "src/google/protobuf/stubs/io_win32.cc",
         "src/google/protobuf/stubs/once.cc",
         "src/google/protobuf/stubs/status.cc",
         "src/google/protobuf/stubs/statusor.cc",
@@ -60,7 +66,16 @@
         "src/google/protobuf/stubs/structurally_valid.cc",
         "src/google/protobuf/stubs/strutil.cc",
         "src/google/protobuf/stubs/time.cc",
+        "src/google/protobuf/arena.cc",
+        "src/google/protobuf/arenastring.cc",
+        "src/google/protobuf/extension_set.cc",
+        "src/google/protobuf/generated_message_util.cc",
+        "src/google/protobuf/message_lite.cc",
+        "src/google/protobuf/repeated_field.cc",
         "src/google/protobuf/wire_format_lite.cc",
+        "src/google/protobuf/io/coded_stream.cc",
+        "src/google/protobuf/io/zero_copy_stream.cc",
+        "src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
     ],
 
     local_include_dirs: [
@@ -69,30 +84,7 @@
     ],
     export_include_dirs: ["src"],
 
-    target: {
-        android: {
-            shared_libs: ["liblog"],
-        },
-    },
-}
-
-cc_binary_host {
-    name: "js_embed",
-    defaults: ["protobuf-cflags-defaults"],
-    srcs: ["src/google/protobuf/compiler/js/embed.cc"],
-    cflags: ["-Wno-unused-const-variable"],
-}
-
-genrule {
-    name: "generate_js_well_known_types_embed",
-    srcs: [
-        "src/google/protobuf/compiler/js/well_known_types/any.js",
-        "src/google/protobuf/compiler/js/well_known_types/struct.js",
-        "src/google/protobuf/compiler/js/well_known_types/timestamp.js",
-    ],
-    out: ["src/google/protobuf/compiler/js/well_known_types_embed.cc"],
-    cmd: "$(location :js_embed) $(in) > $(out)",
-    tools: [":js_embed"],
+    cflags: IGNORED_WARNINGS,
 }
 
 // C++ lite library for the NDK.
@@ -156,39 +148,39 @@
     defaults: ["libprotobuf-cpp-lite-defaults"],
 
     srcs: [
-        "src/google/protobuf/any.cc",
         "src/google/protobuf/any.pb.cc",
         "src/google/protobuf/api.pb.cc",
-        "src/google/protobuf/compiler/importer.cc",
-        "src/google/protobuf/compiler/parser.cc",
+        "src/google/protobuf/stubs/mathlimits.cc",
+        "src/google/protobuf/any.cc",
         "src/google/protobuf/descriptor.cc",
-        "src/google/protobuf/descriptor.pb.cc",
         "src/google/protobuf/descriptor_database.cc",
+        "src/google/protobuf/descriptor.pb.cc",
         "src/google/protobuf/duration.pb.cc",
         "src/google/protobuf/dynamic_message.cc",
         "src/google/protobuf/empty.pb.cc",
         "src/google/protobuf/extension_set_heavy.cc",
         "src/google/protobuf/field_mask.pb.cc",
         "src/google/protobuf/generated_message_reflection.cc",
-        "src/google/protobuf/generated_message_table_driven.cc",
-        "src/google/protobuf/io/gzip_stream.cc",
-        "src/google/protobuf/io/printer.cc",
-        "src/google/protobuf/io/strtod.cc",
-        "src/google/protobuf/io/tokenizer.cc",
-        "src/google/protobuf/io/zero_copy_stream_impl.cc",
         "src/google/protobuf/map_field.cc",
         "src/google/protobuf/message.cc",
         "src/google/protobuf/reflection_ops.cc",
         "src/google/protobuf/service.cc",
         "src/google/protobuf/source_context.pb.cc",
         "src/google/protobuf/struct.pb.cc",
-        "src/google/protobuf/stubs/mathlimits.cc",
         "src/google/protobuf/stubs/substitute.cc",
         "src/google/protobuf/text_format.cc",
         "src/google/protobuf/timestamp.pb.cc",
         "src/google/protobuf/type.pb.cc",
         "src/google/protobuf/unknown_field_set.cc",
-        "src/google/protobuf/util/delimited_message_util.cc",
+        "src/google/protobuf/wire_format.cc",
+        "src/google/protobuf/wrappers.pb.cc",
+        "src/google/protobuf/io/gzip_stream.cc",
+        "src/google/protobuf/io/printer.cc",
+        "src/google/protobuf/io/strtod.cc",
+        "src/google/protobuf/io/tokenizer.cc",
+        "src/google/protobuf/io/zero_copy_stream_impl.cc",
+        "src/google/protobuf/compiler/importer.cc",
+        "src/google/protobuf/compiler/parser.cc",
         "src/google/protobuf/util/field_comparator.cc",
         "src/google/protobuf/util/field_mask_util.cc",
         "src/google/protobuf/util/internal/datapiece.cc",
@@ -199,9 +191,9 @@
         "src/google/protobuf/util/internal/json_objectwriter.cc",
         "src/google/protobuf/util/internal/json_stream_parser.cc",
         "src/google/protobuf/util/internal/object_writer.cc",
-        "src/google/protobuf/util/internal/proto_writer.cc",
         "src/google/protobuf/util/internal/protostream_objectsource.cc",
         "src/google/protobuf/util/internal/protostream_objectwriter.cc",
+        "src/google/protobuf/util/internal/proto_writer.cc",
         "src/google/protobuf/util/internal/type_info.cc",
         "src/google/protobuf/util/internal/type_info_test_helper.cc",
         "src/google/protobuf/util/internal/utility.cc",
@@ -209,8 +201,6 @@
         "src/google/protobuf/util/message_differencer.cc",
         "src/google/protobuf/util/time_util.cc",
         "src/google/protobuf/util/type_resolver_util.cc",
-        "src/google/protobuf/wire_format.cc",
-        "src/google/protobuf/wrappers.pb.cc",
     ],
 
     cflags: ["-DHAVE_ZLIB=1"],
@@ -242,6 +232,11 @@
     },
 
     cflags: ["-DGOOGLE_PROTOBUF_NO_RTTI"],
+    target: {
+        android: {
+            shared_libs: ["liblog"],
+        },
+    },
 }
 
 // C++ full library + rtti for the platform and host
@@ -261,11 +256,8 @@
 
 // Compiler library for the host
 // =======================================================
-cc_library {
+cc_library_host_shared {
     name: "libprotoc",
-    host_supported: true,
-    device_supported: false,
-
     defaults: ["libprotobuf-cpp-full-defaults"],
 
     srcs: [
@@ -282,14 +274,6 @@
         "config",
     ],
 
-    target: {
-        windows: {
-            enabled: true,
-            // defined by the global cflags, but redefined by protobuf
-            cflags: ["-UWIN32_LEAN_AND_MEAN"],
-        },
-    },
-
     rtti: true,
 }
 
@@ -304,8 +288,6 @@
     target: {
         windows: {
             enabled: true,
-            // defined by the global cflags, but redefined by protobuf
-            cflags: ["-UWIN32_LEAN_AND_MEAN"],
         },
     },
 
@@ -314,8 +296,27 @@
     stl: "libc++_static",
 
     srcs: [
-        "src/google/protobuf/compiler/main.cc",
-        ":generate_js_well_known_types_embed",
+        "src/google/protobuf/any.cc",
+        "src/google/protobuf/arena.cc",
+        "src/google/protobuf/arenastring.cc",
+        "src/google/protobuf/descriptor.cc",
+        "src/google/protobuf/descriptor.pb.cc",
+        "src/google/protobuf/descriptor_database.cc",
+        "src/google/protobuf/dynamic_message.cc",
+        "src/google/protobuf/extension_set.cc",
+        "src/google/protobuf/extension_set_heavy.cc",
+        "src/google/protobuf/generated_message_reflection.cc",
+        "src/google/protobuf/generated_message_util.cc",
+        "src/google/protobuf/map_field.cc",
+        "src/google/protobuf/message.cc",
+        "src/google/protobuf/message_lite.cc",
+        "src/google/protobuf/reflection_ops.cc",
+        "src/google/protobuf/repeated_field.cc",
+        "src/google/protobuf/service.cc",
+        "src/google/protobuf/text_format.cc",
+        "src/google/protobuf/unknown_field_set.cc",
+        "src/google/protobuf/wire_format.cc",
+        "src/google/protobuf/wire_format_lite.cc",
         "src/google/protobuf/compiler/code_generator.cc",
         "src/google/protobuf/compiler/command_line_interface.cc",
         "src/google/protobuf/compiler/cpp/cpp_enum.cc",
@@ -328,7 +329,6 @@
         "src/google/protobuf/compiler/cpp/cpp_map_field.cc",
         "src/google/protobuf/compiler/cpp/cpp_message.cc",
         "src/google/protobuf/compiler/cpp/cpp_message_field.cc",
-        "src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc",
         "src/google/protobuf/compiler/cpp/cpp_primitive_field.cc",
         "src/google/protobuf/compiler/cpp/cpp_service.cc",
         "src/google/protobuf/compiler/cpp/cpp_string_field.cc",
@@ -348,6 +348,7 @@
         "src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc",
         "src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc",
         "src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc",
+        "src/google/protobuf/compiler/importer.cc",
         "src/google/protobuf/compiler/java/java_context.cc",
         "src/google/protobuf/compiler/java/java_doc_comment.cc",
         "src/google/protobuf/compiler/java/java_enum.cc",
@@ -365,9 +366,9 @@
         "src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc",
         "src/google/protobuf/compiler/java/java_map_field.cc",
         "src/google/protobuf/compiler/java/java_map_field_lite.cc",
-        "src/google/protobuf/compiler/java/java_message.cc",
         "src/google/protobuf/compiler/java/java_message_builder.cc",
         "src/google/protobuf/compiler/java/java_message_builder_lite.cc",
+        "src/google/protobuf/compiler/java/java_message.cc",
         "src/google/protobuf/compiler/java/java_message_field.cc",
         "src/google/protobuf/compiler/java/java_message_field_lite.cc",
         "src/google/protobuf/compiler/java/java_message_lite.cc",
@@ -399,6 +400,7 @@
         "src/google/protobuf/compiler/javanano/javanano_message_field.cc",
         "src/google/protobuf/compiler/javanano/javanano_primitive_field.cc",
         "src/google/protobuf/compiler/js/js_generator.cc",
+        "src/google/protobuf/compiler/main.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_enum.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_extension.cc",
@@ -411,13 +413,32 @@
         "src/google/protobuf/compiler/objectivec/objectivec_message_field.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_oneof.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc",
-        "src/google/protobuf/compiler/php/php_generator.cc",
+        "src/google/protobuf/compiler/parser.cc",
         "src/google/protobuf/compiler/plugin.cc",
         "src/google/protobuf/compiler/plugin.pb.cc",
         "src/google/protobuf/compiler/python/python_generator.cc",
         "src/google/protobuf/compiler/ruby/ruby_generator.cc",
         "src/google/protobuf/compiler/subprocess.cc",
         "src/google/protobuf/compiler/zip_writer.cc",
+        "src/google/protobuf/io/coded_stream.cc",
+        "src/google/protobuf/io/gzip_stream.cc",
+        "src/google/protobuf/io/printer.cc",
+        "src/google/protobuf/io/strtod.cc",
+        "src/google/protobuf/io/tokenizer.cc",
+        "src/google/protobuf/io/zero_copy_stream.cc",
+        "src/google/protobuf/io/zero_copy_stream_impl.cc",
+        "src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
+        "src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc",
+        "src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc",
+        "src/google/protobuf/stubs/common.cc",
+        "src/google/protobuf/stubs/int128.cc",
+        "src/google/protobuf/stubs/once.cc",
+        "src/google/protobuf/stubs/status.cc",
+        "src/google/protobuf/stubs/stringpiece.cc",
+        "src/google/protobuf/stubs/structurally_valid.cc",
+        "src/google/protobuf/stubs/strutil.cc",
+        "src/google/protobuf/stubs/substitute.cc",
+        "src/google/protobuf/stubs/stringprintf.cc",
     ],
 
     local_include_dirs: [
@@ -425,16 +446,12 @@
         "src",
     ],
 
-    static_libs: [
-        "libprotoc",
-        "libz",
-    ],
+    static_libs: ["libz"],
 
-    cflags: [
+    cflags: IGNORED_WARNINGS + [
         "-DHAVE_ZLIB=1",
     ],
 
-    rtti: true,
 }
 
 java_defaults {
@@ -494,6 +511,71 @@
     static_libs: ["libprotobuf-java-micro"],
 }
 
+// Java lite library
+// =======================================================
+java_library_static {
+    name: "libprotobuf-java-lite",
+    host_supported: true,
+    sdk_version: "core_current",
+
+    srcs: [
+        "java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java",
+        "java/core/src/main/java/com/google/protobuf/AbstractParser.java",
+        "java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java",
+        "java/core/src/main/java/com/google/protobuf/ByteOutput.java",
+        "java/core/src/main/java/com/google/protobuf/ByteString.java",
+        "java/core/src/main/java/com/google/protobuf/BooleanArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/CodedInputStream.java",
+        "java/core/src/main/java/com/google/protobuf/CodedOutputStream.java",
+        "java/core/src/main/java/com/google/protobuf/DoubleArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/ExperimentalApi.java",
+        "java/core/src/main/java/com/google/protobuf/ExtensionLite.java",
+        "java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java",
+        "java/core/src/main/java/com/google/protobuf/FieldSet.java",
+        "java/core/src/main/java/com/google/protobuf/FloatArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java",
+        "java/core/src/main/java/com/google/protobuf/IntArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/Internal.java",
+        "java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java",
+        "java/core/src/main/java/com/google/protobuf/LazyField.java",
+        "java/core/src/main/java/com/google/protobuf/LazyFieldLite.java",
+        "java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/LazyStringList.java",
+        "java/core/src/main/java/com/google/protobuf/LongArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/MapFieldLite.java",
+        "java/core/src/main/java/com/google/protobuf/MessageLite.java",
+        "java/core/src/main/java/com/google/protobuf/MessageLiteToString.java",
+        "java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java",
+        "java/core/src/main/java/com/google/protobuf/MutabilityOracle.java",
+        "java/core/src/main/java/com/google/protobuf/Parser.java",
+        "java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java",
+        "java/core/src/main/java/com/google/protobuf/ProtocolStringList.java",
+        "java/core/src/main/java/com/google/protobuf/RopeByteString.java",
+        "java/core/src/main/java/com/google/protobuf/SmallSortedMap.java",
+        "java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java",
+        "java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java",
+        "java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java",
+        "java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java",
+        "java/core/src/main/java/com/google/protobuf/Utf8.java",
+        "java/core/src/main/java/com/google/protobuf/WireFormat.java",
+    ],
+
+    target: {
+        android: {
+            libs: ["libcore_private.stubs"],
+        },
+    },
+
+    java_version: "1.7",
+}
+
+// Java lite library (compatibility for old host-side users)
+// =======================================================
+java_library_host {
+    name: "host-libprotobuf-java-lite",
+    static_libs: ["libprotobuf-java-lite"],
+}
+
 // Java full library (for host-side users)
 // =======================================================
 java_library_host {
diff --git a/BUILD b/BUILD
index bcaf9cd..8b1046b 100644
--- a/BUILD
+++ b/BUILD
@@ -2,41 +2,19 @@
 
 licenses(["notice"])
 
-exports_files(["LICENSE"])
-
 ################################################################################
 # Protobuf Runtime Library
 ################################################################################
 
-WIN_COPTS = [
-    "/DHAVE_PTHREAD",
-    "/wd4018", # -Wno-sign-compare
-    "/wd4514", # -Wno-unused-function
+COPTS = [
+    "-DHAVE_PTHREAD",
+    "-Wall",
+    "-Wwrite-strings",
+    "-Woverloaded-virtual",
+    "-Wno-sign-compare",
+    "-Wno-error=unused-function",
 ]
 
-COPTS = select({
-    ":windows" : WIN_COPTS,
-    ":windows_msvc" : WIN_COPTS,
-    "//conditions:default": [
-        "-DHAVE_PTHREAD",
-        "-Wall",
-        "-Wwrite-strings",
-        "-Woverloaded-virtual",
-        "-Wno-sign-compare",
-        "-Wno-unused-function",
-    ],
-})
-
-config_setting(
-    name = "windows",
-    values = { "cpu": "x64_windows" },
-)
-
-config_setting(
-    name = "windows_msvc",
-    values = { "cpu": "x64_windows_msvc" },
-)
-
 config_setting(
     name = "android",
     values = {
@@ -44,23 +22,51 @@
     },
 )
 
-# Android and Windows builds do not need to link in a separate pthread library.
+# Android builds do not need to link in a separate pthread library.
 LINK_OPTS = select({
     ":android": [],
-    ":windows": [],
-    ":windows_msvc": [],
-    "//conditions:default": ["-lpthread", "-lm"],
+    "//conditions:default": ["-lpthread"],
 })
 
 load(
-    ":protobuf.bzl",
+    "protobuf",
     "cc_proto_library",
     "py_proto_library",
-    "internal_copied_filegroup",
     "internal_gen_well_known_protos_java",
     "internal_protobuf_py_tests",
 )
 
+config_setting(
+    name = "ios_armv7",
+    values = {
+        "ios_cpu": "armv7",
+    },
+)
+
+config_setting(
+    name = "ios_armv7s",
+    values = {
+        "ios_cpu": "armv7s",
+    },
+)
+
+config_setting(
+    name = "ios_arm64",
+    values = {
+        "ios_cpu": "arm64",
+    },
+)
+
+IOS_ARM_COPTS = COPTS + [
+    "-DOS_IOS",
+    "-miphoneos-version-min=7.0",
+    "-arch armv7",
+    "-arch armv7s",
+    "-arch arm64",
+    "-D__thread=",
+    "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/",
+]
+
 cc_library(
     name = "protobuf_lite",
     srcs = [
@@ -68,7 +74,6 @@
         "src/google/protobuf/arena.cc",
         "src/google/protobuf/arenastring.cc",
         "src/google/protobuf/extension_set.cc",
-        "src/google/protobuf/generated_message_table_driven_lite.cc",
         "src/google/protobuf/generated_message_util.cc",
         "src/google/protobuf/io/coded_stream.cc",
         "src/google/protobuf/io/zero_copy_stream.cc",
@@ -80,7 +85,6 @@
         "src/google/protobuf/stubs/bytestream.cc",
         "src/google/protobuf/stubs/common.cc",
         "src/google/protobuf/stubs/int128.cc",
-        "src/google/protobuf/stubs/io_win32.cc",
         "src/google/protobuf/stubs/once.cc",
         "src/google/protobuf/stubs/status.cc",
         "src/google/protobuf/stubs/statusor.cc",
@@ -92,7 +96,12 @@
         "src/google/protobuf/wire_format_lite.cc",
     ],
     hdrs = glob(["src/google/protobuf/**/*.h"]),
-    copts = COPTS,
+    copts = select({
+        ":ios_armv7": IOS_ARM_COPTS,
+        ":ios_armv7s": IOS_ARM_COPTS,
+        ":ios_arm64": IOS_ARM_COPTS,
+        "//conditions:default": COPTS,
+    }),
     includes = ["src/"],
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
@@ -116,7 +125,6 @@
         "src/google/protobuf/extension_set_heavy.cc",
         "src/google/protobuf/field_mask.pb.cc",
         "src/google/protobuf/generated_message_reflection.cc",
-        "src/google/protobuf/generated_message_table_driven.cc",
         "src/google/protobuf/io/gzip_stream.cc",
         "src/google/protobuf/io/printer.cc",
         "src/google/protobuf/io/strtod.cc",
@@ -134,7 +142,6 @@
         "src/google/protobuf/timestamp.pb.cc",
         "src/google/protobuf/type.pb.cc",
         "src/google/protobuf/unknown_field_set.cc",
-        "src/google/protobuf/util/delimited_message_util.cc",
         "src/google/protobuf/util/field_comparator.cc",
         "src/google/protobuf/util/field_mask_util.cc",
         "src/google/protobuf/util/internal/datapiece.cc",
@@ -159,24 +166,18 @@
         "src/google/protobuf/wrappers.pb.cc",
     ],
     hdrs = glob(["src/**/*.h"]),
-    copts = COPTS,
+    copts = select({
+        ":ios_armv7": IOS_ARM_COPTS,
+        ":ios_armv7s": IOS_ARM_COPTS,
+        ":ios_arm64": IOS_ARM_COPTS,
+        "//conditions:default": COPTS,
+    }),
     includes = ["src/"],
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
     deps = [":protobuf_lite"],
 )
 
-# This provides just the header files for use in projects that need to build
-# shared libraries for dynamic loading. This target is available until Bazel
-# adds native support for such use cases.
-# TODO(keveman): Remove this target once the support gets added to Bazel.
-cc_library(
-    name = "protobuf_headers",
-    hdrs = glob(["src/**/*.h"]),
-    includes = ["src/"],
-    visibility = ["//visibility:public"],
-)
-
 objc_library(
     name = "protobuf_objc",
     hdrs = ["objectivec/GPBProtocolBuffers.h"],
@@ -185,24 +186,21 @@
     visibility = ["//visibility:public"],
 )
 
-# Map of all well known protos.
-# name => (include path, imports)
-WELL_KNOWN_PROTO_MAP = {
-    "any" : ("google/protobuf/any.proto", []),
-    "api" : ("google/protobuf/api.proto", ["source_context", "type"]),
-    "compiler_plugin" : ("google/protobuf/compiler/plugin.proto", ["descriptor"]),
-    "descriptor" : ("google/protobuf/descriptor.proto", []),
-    "duration" : ("google/protobuf/duration.proto", []),
-    "empty" : ("google/protobuf/empty.proto", []),
-    "field_mask" : ("google/protobuf/field_mask.proto", []),
-    "source_context" : ("google/protobuf/source_context.proto", []),
-    "struct" : ("google/protobuf/struct.proto", []),
-    "timestamp" : ("google/protobuf/timestamp.proto", []),
-    "type" : ("google/protobuf/type.proto", ["any", "source_context"]),
-    "wrappers" : ("google/protobuf/wrappers.proto", []),
-}
-
-RELATIVE_WELL_KNOWN_PROTOS = [proto[1][0] for proto in WELL_KNOWN_PROTO_MAP.items()]
+RELATIVE_WELL_KNOWN_PROTOS = [
+    # AUTOGEN(well_known_protos)
+    "google/protobuf/any.proto",
+    "google/protobuf/api.proto",
+    "google/protobuf/compiler/plugin.proto",
+    "google/protobuf/descriptor.proto",
+    "google/protobuf/duration.proto",
+    "google/protobuf/empty.proto",
+    "google/protobuf/field_mask.proto",
+    "google/protobuf/source_context.proto",
+    "google/protobuf/struct.proto",
+    "google/protobuf/timestamp.proto",
+    "google/protobuf/type.proto",
+    "google/protobuf/wrappers.proto",
+]
 
 WELL_KNOWN_PROTOS = ["src/" + s for s in RELATIVE_WELL_KNOWN_PROTOS]
 
@@ -223,54 +221,9 @@
 )
 
 ################################################################################
-# Well Known Types Proto Library Rules
-#
-# These proto_library rules can be used with one of the language specific proto
-# library rules i.e. java_proto_library:
-#
-# java_proto_library(
-#   name = "any_java_proto",
-#   deps = ["@com_google_protobuf//:any_proto],
-# )
-################################################################################
-
-internal_copied_filegroup(
-    name = "_internal_wkt_protos",
-    srcs = WELL_KNOWN_PROTOS,
-    dest = "",
-    strip_prefix = "src",
-    visibility = ["//visibility:hidden"],
-)
-
-[proto_library(
-    name = proto[0] + "_proto",
-    srcs = [proto[1][0]],
-    deps = [dep + "_proto" for dep in proto[1][1]],
-    visibility = ["//visibility:public"],
-    ) for proto in WELL_KNOWN_PROTO_MAP.items()]
-
-################################################################################
 # Protocol Buffers Compiler
 ################################################################################
 
-cc_binary(
-    name = "js_embed",
-    srcs = ["src/google/protobuf/compiler/js/embed.cc"],
-    visibility = ["//visibility:public"],
-)
-
-genrule(
-    name = "generate_js_well_known_types_embed",
-    srcs = [
-        "src/google/protobuf/compiler/js/well_known_types/any.js",
-        "src/google/protobuf/compiler/js/well_known_types/struct.js",
-        "src/google/protobuf/compiler/js/well_known_types/timestamp.js",
-    ],
-    outs = ["src/google/protobuf/compiler/js/well_known_types_embed.cc"],
-    cmd = "$(location :js_embed) $(SRCS) > $@",
-    tools = [":js_embed"],
-)
-
 cc_library(
     name = "protoc_lib",
     srcs = [
@@ -287,7 +240,6 @@
         "src/google/protobuf/compiler/cpp/cpp_map_field.cc",
         "src/google/protobuf/compiler/cpp/cpp_message.cc",
         "src/google/protobuf/compiler/cpp/cpp_message_field.cc",
-        "src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc",
         "src/google/protobuf/compiler/cpp/cpp_primitive_field.cc",
         "src/google/protobuf/compiler/cpp/cpp_service.cc",
         "src/google/protobuf/compiler/cpp/cpp_string_field.cc",
@@ -349,7 +301,6 @@
         "src/google/protobuf/compiler/javanano/javanano_message_field.cc",
         "src/google/protobuf/compiler/javanano/javanano_primitive_field.cc",
         "src/google/protobuf/compiler/js/js_generator.cc",
-        "src/google/protobuf/compiler/js/well_known_types_embed.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_enum.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_extension.cc",
@@ -362,7 +313,6 @@
         "src/google/protobuf/compiler/objectivec/objectivec_message_field.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_oneof.cc",
         "src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc",
-        "src/google/protobuf/compiler/php/php_generator.cc",
         "src/google/protobuf/compiler/plugin.cc",
         "src/google/protobuf/compiler/plugin.pb.cc",
         "src/google/protobuf/compiler/python/python_generator.cc",
@@ -416,9 +366,6 @@
     "google/protobuf/unittest_enormous_descriptor.proto",
     "google/protobuf/unittest_import.proto",
     "google/protobuf/unittest_import_public.proto",
-    "google/protobuf/unittest_lazy_dependencies.proto",
-    "google/protobuf/unittest_lazy_dependencies_custom_option.proto",
-    "google/protobuf/unittest_lazy_dependencies_enum.proto",
     "google/protobuf/unittest_lite_imports_nonlite.proto",
     "google/protobuf/unittest_mset.proto",
     "google/protobuf/unittest_mset_wire_format.proto",
@@ -440,10 +387,8 @@
     "google/protobuf/util/internal/testdata/field_mask.proto",
     "google/protobuf/util/internal/testdata/maps.proto",
     "google/protobuf/util/internal/testdata/oneofs.proto",
-    "google/protobuf/util/internal/testdata/proto3.proto",
     "google/protobuf/util/internal/testdata/struct.proto",
     "google/protobuf/util/internal/testdata/timestamp_duration.proto",
-    "google/protobuf/util/internal/testdata/wrappers.proto",
     "google/protobuf/util/json_format_proto3.proto",
     "google/protobuf/util/message_differencer_unittest.proto",
 ]
@@ -484,30 +429,17 @@
 )
 
 cc_test(
-    name = "win32_test",
-    srcs = ["src/google/protobuf/stubs/io_win32_unittest.cc"],
-    deps = [
-        ":protobuf_lite",
-        "//external:gtest_main",
-    ],
-    tags = ["manual", "windows"],
-)
-
-cc_test(
     name = "protobuf_test",
     srcs = COMMON_TEST_SRCS + [
         # AUTOGEN(test_srcs)
         "src/google/protobuf/any_test.cc",
         "src/google/protobuf/arena_unittest.cc",
         "src/google/protobuf/arenastring_unittest.cc",
-        "src/google/protobuf/compiler/annotation_test_util.cc",
         "src/google/protobuf/compiler/command_line_interface_unittest.cc",
         "src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc",
-        "src/google/protobuf/compiler/cpp/cpp_move_unittest.cc",
         "src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc",
         "src/google/protobuf/compiler/cpp/cpp_unittest.cc",
         "src/google/protobuf/compiler/cpp/metadata_test.cc",
-        "src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc",
         "src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc",
         "src/google/protobuf/compiler/importer_unittest.cc",
         "src/google/protobuf/compiler/java/java_doc_comment_unittest.cc",
@@ -541,7 +473,6 @@
         "src/google/protobuf/stubs/bytestream_unittest.cc",
         "src/google/protobuf/stubs/common_unittest.cc",
         "src/google/protobuf/stubs/int128_unittest.cc",
-        "src/google/protobuf/stubs/io_win32_unittest.cc",
         "src/google/protobuf/stubs/once_unittest.cc",
         "src/google/protobuf/stubs/status_test.cc",
         "src/google/protobuf/stubs/statusor_test.cc",
@@ -554,7 +485,6 @@
         "src/google/protobuf/stubs/type_traits_unittest.cc",
         "src/google/protobuf/text_format_unittest.cc",
         "src/google/protobuf/unknown_field_set_unittest.cc",
-        "src/google/protobuf/util/delimited_message_util_test.cc",
         "src/google/protobuf/util/field_comparator_test.cc",
         "src/google/protobuf/util/field_mask_util_test.cc",
         "src/google/protobuf/util/internal/default_value_objectwriter_test.cc",
@@ -575,9 +505,6 @@
         ":test_plugin",
     ] + glob([
         "src/google/protobuf/**/*",
-        # Files for csharp_bootstrap_unittest.cc.
-        "conformance/**/*",
-        "csharp/src/**/*",
     ]),
     includes = [
         "src/",
@@ -605,7 +532,6 @@
     ]) + [
         ":gen_well_known_protos_java",
     ],
-    javacopts = ["-source 6", "-target 6"],
     visibility = ["//visibility:public"],
 )
 
@@ -614,13 +540,12 @@
     srcs = glob([
         "java/util/src/main/java/com/google/protobuf/util/*.java",
     ]),
-    javacopts = ["-source 6", "-target 6"],
-    visibility = ["//visibility:public"],
     deps = [
         "protobuf_java",
         "//external:gson",
         "//external:guava",
     ],
+    visibility = ["//visibility:public"],
 )
 
 ################################################################################
@@ -635,18 +560,16 @@
             "python/google/protobuf/**/*.py",
         ],
         exclude = [
-            "python/google/protobuf/__init__.py",
-            "python/google/protobuf/**/__init__.py",
             "python/google/protobuf/internal/*_test.py",
             "python/google/protobuf/internal/test_util.py",
         ],
     ),
-    imports = ["python"],
     srcs_version = "PY2AND3",
+    imports = ["python"],
 )
 
 cc_binary(
-    name = "python/google/protobuf/internal/_api_implementation.so",
+    name = "internal/_api_implementation.so",
     srcs = ["python/google/protobuf/internal/api_implementation.cc"],
     copts = COPTS + [
         "-DPYTHON_PROTO2_CPP_IMPL_V2",
@@ -660,7 +583,7 @@
 )
 
 cc_binary(
-    name = "python/google/protobuf/pyext/_message.so",
+    name = "pyext/_message.so",
     srcs = glob([
         "python/google/protobuf/pyext/*.cc",
         "python/google/protobuf/pyext/*.h",
@@ -699,65 +622,31 @@
     },
 )
 
-# Copy the builtin proto files from src/google/protobuf to
-# python/google/protobuf. This way, the generated Python sources will be in the
-# same directory as the Python runtime sources. This is necessary for the
-# modules to be imported correctly since they are all part of the same Python
-# package.
-internal_copied_filegroup(
-    name = "protos_python",
-    srcs = WELL_KNOWN_PROTOS,
-    dest = "python",
-    strip_prefix = "src",
-)
-
-# TODO(dzc): Remove this once py_proto_library can have labels in srcs, in
-# which case we can simply add :protos_python in srcs.
-COPIED_WELL_KNOWN_PROTOS = ["python/" + s for s in RELATIVE_WELL_KNOWN_PROTOS]
-
 py_proto_library(
     name = "protobuf_python",
-    srcs = COPIED_WELL_KNOWN_PROTOS,
-    include = "python",
+    srcs = WELL_KNOWN_PROTOS,
+    include = "src",
     data = select({
         "//conditions:default": [],
         ":use_fast_cpp_protos": [
-            ":python/google/protobuf/internal/_api_implementation.so",
-            ":python/google/protobuf/pyext/_message.so",
+            ":internal/_api_implementation.so",
+            ":pyext/_message.so",
         ],
     }),
     default_runtime = "",
     protoc = ":protoc",
     py_libs = [
         ":python_srcs",
-        "//external:six",
+        "//external:six"
     ],
     srcs_version = "PY2AND3",
     visibility = ["//visibility:public"],
 )
 
-# Copy the test proto files from src/google/protobuf to
-# python/google/protobuf. This way, the generated Python sources will be in the
-# same directory as the Python runtime sources. This is necessary for the
-# modules to be imported correctly by the tests since they are all part of the
-# same Python package.
-internal_copied_filegroup(
-    name = "protos_python_test",
-    srcs = LITE_TEST_PROTOS + TEST_PROTOS,
-    dest = "python",
-    strip_prefix = "src",
-)
-
-# TODO(dzc): Remove this once py_proto_library can have labels in srcs, in
-# which case we can simply add :protos_python_test in srcs.
-COPIED_LITE_TEST_PROTOS = ["python/" + s for s in RELATIVE_LITE_TEST_PROTOS]
-
-COPIED_TEST_PROTOS = ["python/" + s for s in RELATIVE_TEST_PROTOS]
-
 py_proto_library(
     name = "python_common_test_protos",
-    srcs = COPIED_LITE_TEST_PROTOS + COPIED_TEST_PROTOS,
-    include = "python",
+    srcs = LITE_TEST_PROTOS + TEST_PROTOS,
+    include = "src",
     default_runtime = "",
     protoc = ":protoc",
     srcs_version = "PY2AND3",
@@ -783,7 +672,6 @@
         [
             "python/google/protobuf/internal/*_test.py",
             "python/google/protobuf/internal/test_util.py",
-            "python/google/protobuf/internal/import_test_package/__init__.py",
         ],
     ),
     imports = ["python"],
@@ -819,98 +707,3 @@
     ],
     deps = [":python_tests"],
 )
-
-proto_lang_toolchain(
-    name = "cc_toolchain",
-    command_line = "--cpp_out=$(OUT)",
-    runtime = ":protobuf",
-    visibility = ["//visibility:public"],
-)
-
-proto_lang_toolchain(
-    name = "java_toolchain",
-    command_line = "--java_out=$(OUT)",
-    runtime = ":protobuf_java",
-    visibility = ["//visibility:public"],
-)
-
-OBJC_HDRS = [
-    "objectivec/GPBArray.h",
-    "objectivec/GPBBootstrap.h",
-    "objectivec/GPBCodedInputStream.h",
-    "objectivec/GPBCodedOutputStream.h",
-    "objectivec/GPBDescriptor.h",
-    "objectivec/GPBDictionary.h",
-    "objectivec/GPBExtensionInternals.h",
-    "objectivec/GPBExtensionRegistry.h",
-    "objectivec/GPBMessage.h",
-    "objectivec/GPBProtocolBuffers.h",
-    "objectivec/GPBProtocolBuffers_RuntimeSupport.h",
-    "objectivec/GPBRootObject.h",
-    "objectivec/GPBRuntimeTypes.h",
-    "objectivec/GPBUnknownField.h",
-    "objectivec/GPBUnknownFieldSet.h",
-    "objectivec/GPBUtilities.h",
-    "objectivec/GPBWellKnownTypes.h",
-    "objectivec/GPBWireFormat.h",
-    "objectivec/google/protobuf/Any.pbobjc.h",
-    "objectivec/google/protobuf/Api.pbobjc.h",
-    "objectivec/google/protobuf/Duration.pbobjc.h",
-    "objectivec/google/protobuf/Empty.pbobjc.h",
-    "objectivec/google/protobuf/FieldMask.pbobjc.h",
-    "objectivec/google/protobuf/SourceContext.pbobjc.h",
-    "objectivec/google/protobuf/Struct.pbobjc.h",
-    "objectivec/google/protobuf/Timestamp.pbobjc.h",
-    "objectivec/google/protobuf/Type.pbobjc.h",
-    "objectivec/google/protobuf/Wrappers.pbobjc.h",
-]
-
-OBJC_PRIVATE_HDRS = [
-    "objectivec/GPBArray_PackagePrivate.h",
-    "objectivec/GPBCodedInputStream_PackagePrivate.h",
-    "objectivec/GPBCodedOutputStream_PackagePrivate.h",
-    "objectivec/GPBDescriptor_PackagePrivate.h",
-    "objectivec/GPBDictionary_PackagePrivate.h",
-    "objectivec/GPBMessage_PackagePrivate.h",
-    "objectivec/GPBRootObject_PackagePrivate.h",
-    "objectivec/GPBUnknownFieldSet_PackagePrivate.h",
-    "objectivec/GPBUnknownField_PackagePrivate.h",
-    "objectivec/GPBUtilities_PackagePrivate.h",
-]
-
-OBJC_SRCS = [
-    "objectivec/GPBArray.m",
-    "objectivec/GPBCodedInputStream.m",
-    "objectivec/GPBCodedOutputStream.m",
-    "objectivec/GPBDescriptor.m",
-    "objectivec/GPBDictionary.m",
-    "objectivec/GPBExtensionInternals.m",
-    "objectivec/GPBExtensionRegistry.m",
-    "objectivec/GPBMessage.m",
-    "objectivec/GPBRootObject.m",
-    "objectivec/GPBUnknownField.m",
-    "objectivec/GPBUnknownFieldSet.m",
-    "objectivec/GPBUtilities.m",
-    "objectivec/GPBWellKnownTypes.m",
-    "objectivec/GPBWireFormat.m",
-    "objectivec/google/protobuf/Any.pbobjc.m",
-    "objectivec/google/protobuf/Api.pbobjc.m",
-    "objectivec/google/protobuf/Duration.pbobjc.m",
-    "objectivec/google/protobuf/Empty.pbobjc.m",
-    "objectivec/google/protobuf/FieldMask.pbobjc.m",
-    "objectivec/google/protobuf/SourceContext.pbobjc.m",
-    "objectivec/google/protobuf/Struct.pbobjc.m",
-    "objectivec/google/protobuf/Timestamp.pbobjc.m",
-    "objectivec/google/protobuf/Type.pbobjc.m",
-    "objectivec/google/protobuf/Wrappers.pbobjc.m",
-]
-
-objc_library(
-    name = "objectivec",
-    hdrs = OBJC_HDRS + OBJC_PRIVATE_HDRS,
-    includes = [
-        "objectivec",
-    ],
-    non_arc_srcs = OBJC_SRCS,
-    visibility = ["//visibility:public"],
-)
diff --git a/CHANGES.txt b/CHANGES.txt
index c7c4291..3459ccc 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,654 +1,3 @@
-2017-12-20 version 3.5.1 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
-  Planned Future Changes
-  * Make C++ implementation C++11 only: we plan to require C++11 to build
-    protobuf code starting from 3.6.0 release. Please join this github issue:
-    https://github.com/google/protobuf/issues/2780 to provide your feedback.
-
-  protoc
-  * Fixed a bug introduced in 3.5.0 and protoc in Windows now accepts non-ascii
-    characters in paths again.
-
-  C++
-  * Removed several usages of C++11 features in the code base.
-  * Fixed some compiler warnings.
-
-  PHP
-  * Fixed memory leak in C-extension implementation.
-  * Added discardUnknokwnFields API.
-  * Removed duplicatd typedef in C-extension headers.
-  * Avoided calling private php methods (timelib_update_ts).
-  * Fixed Any.php to use fully-qualified name for DescriptorPool.
-
-  Ruby
-  * Added Google_Protobuf_discard_unknown for discarding unknown fields in
-    messages.
-
-  C#
-  * Unknown fields are now preserved by default.
-  * Floating point values are now bitwise compared, affecting message equality
-    check and Contains() API in map and repeated fields.
-
-
-2017-11-13 version 3.5.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
-  Planned Future Changes
-  * Make C++ implementation C++11 only: we plan to require C++11 to build
-    protobuf code starting from 3.6.0 release. Please join this github issue:
-    https://github.com/google/protobuf/issues/2780 to provide your feedback.
-
-  General
-  * Unknown fields are now preserved in proto3 for most of the language
-    implementations for proto3 by default. See the per-language section for
-    details.
-  * reserve keyword are now supported in enums
-
-  C++
-  * Proto3 messages are now preserving unknown fields by default. If you rely on
-    unknowns fields being dropped. Please use DiscardUnknownFields() explicitly.
-  * Deprecated the unsafe_arena_release_* and unsafe_arena_add_allocated_*
-    methods for string fields.
-  * Added move constructor and move assignment to RepeatedField,
-    RepeatedPtrField and google::protobuf::Any.
-  * Added perfect forwarding in Arena::CreateMessage
-  * In-progress experimental support for implicit weak fields with lite protos.
-    This feature allows the linker to strip out more unused messages and reduce
-    binary size.
-  * Various performance optimizations.
-
-  Java
-  * Proto3 messages are now preserving unknown fields by default. If you’d like
-    to drop unknown fields, please use the DiscardUnknownFieldsParser API. For
-    example:
-      Parser<Foo> parser = DiscardUnknownFieldsParser.wrap(Foo.parser());
-      Foo foo = parser.parseFrom(input);
-  * Added a new CodedInputStream decoder for Iterable<ByteBuffer> with direct
-    ByteBuffers.
-  * TextFormat now prints unknown length-delimited fields as messages if
-    possible.
-  * FieldMaskUtil.merge() no longer creates unnecessary empty messages when a
-    message field is unset in both source message and destination message.
-  * Various performance optimizations.
-
-  Python
-  * Proto3 messages are now preserving unknown fields by default. Use
-    message.DiscardUnknownFields() to drop unknown fields.
-  * Add FieldDescriptor.file in generated code.
-  * Add descriptor pool FindOneofByName in pure python.
-  * Change unknown enum values into unknown field set .
-  * Add more Python dict/list compatibility for Struct/ListValue.
-  * Add utf-8 support for text_format.Merge()/Parse().
-  * Support numeric unknown enum values for proto3 JSON format.
-  * Add warning for Unexpected end-group tag in cpp extension.
-
-  PHP
-  * Proto3 messages are now preserving unknown fields.
-  * Provide well known type messages in runtime.
-  * Add prefix ‘PB’ to generated class of reserved names.
-  * Fixed all conformance tests for encode/decode json in php runtime. C
-    extension needs more work.
-
-  Objective-C
-  * Fixed some issues around copying of messages with unknown fields and then
-    mutating the unknown fields in the copy.
-
-  C#
-  * Added unknown field support in JsonParser.
-  * Fixed oneof message field merge.
-  * Simplify parsing messages from array slices.
-
-  Ruby
-  * Unknown fields are now preserved by default.
-  * Fixed several bugs for segment fault.
-
-  Javascript
-  * Decoder can handle both paced and unpacked data no matter how the proto is
-    defined.
-  * Decoder now accept long varint for 32 bit integers.
-
-
-2017-08-14 version 3.4.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
-  Planned Future Changes
-  * There are some changes that are not included in this release but are planned
-    for the near future
-      - Preserve unknown fields in proto3: We are going to bring unknown fields
-        back into proto3. In this release, some languages start to support
-        preserving unknown fields in proto3, controlled by flags/options. Some
-        languages also introduce explicit APIs to drop unknown fields for
-        migration. Please read the change log sections by languages for details.
-        For general timeline and plan:
-
-          https://docs.google.com/document/d/1KMRX-G91Aa-Y2FkEaHeeviLRRNblgIahbsk4wA14gRk/view
-
-        For issues and discussions:
-
-          https://github.com/google/protobuf/issues/272
-
-      - Make C++ implementation C++11 only: we plan to require C++11 to build
-        protobuf code starting from 3.5.0 or 3.6.0 release, after unknown fields
-        semantic changes are finished. Please join this
-        github issue:
-
-          https://github.com/google/protobuf/issues/2780
-
-        to provide your feedback.
-
-  General
-  * Extension ranges now accept options and are customizable.
-  * "reserve" keyword now supports “max” in field number ranges,
-    e.g.  reserve 1000 to max;
-
-  C++
-  * Proto3 messages are now able to preserve unknown fields. The default
-    behavior is still to drop unknowns, which will be flipped in a future
-    release. If you rely on unknowns fields being dropped. Please use
-    Message::DiscardUnknownFields() explicitly.
-  * Packable proto3 fields are now packed by default in serialization.
-  * Following C++11 features are introduced when C++11 is available:
-      - move-constructor and move-assignment are introduced to messages
-      - Repeated fields constructor now takes std::initializer_list
-      - rvalue setters are introduced for string fields
-  * Experimental Table-Driven parsing and serialization available to test. To
-    enable it, pass in table_driven_parsing table_driven_serialization protoc
-    generator flags for C++
-
-      $ protoc --cpp_out=table_driven_parsing,table_driven_serialization:./ \
-        test.proto
-
-  * lite generator parameter supported by the generator. Once set, all generated
-    files, use lite runtime regardless of the optimizer_for setting in the
-    .proto file.
-  * Various optimizations to make C++ code more performant on PowerPC platform
-  * Fixed maps data corruption when the maps are modified by both reflection API
-    and generated API.
-  * Deterministic serialization on maps reflection now uses stable sort.
-  * file() accessors are introduced to various *Descriptor classes to make
-    writing template function easier.
-  * ByteSize() and SpaceUsed() are deprecated.Use ByteSizeLong() and
-    SpaceUsedLong() instead
-  * Consistent hash function is used for maps in DEBUG and NDEBUG build.
-  * "using namespace std" is removed from stubs/common.h
-  * Various performance optimizations and bug fixes
-
-  Java
-  * Introduced new parser API DiscardUnknownFieldsParser in preparation of
-    proto3 unknown fields preservation change. Users who want to drop unknown
-    fields should migrate to use this new parser API. For example:
-
-      Parser<Foo> parser = DiscardUnknownFieldsParser.wrap(Foo.parser());
-      Foo foo = parser.parseFrom(input);
-
-  * Introduced new TextFormat API printUnicodeFieldValue() that prints field
-    value without escaping unicode characters.
-  * Added Durations.compare(Duration, Duration) and
-    Timestamps.compare(Timestamp, Timestamp).
-  * JsonFormat now accepts base64url encoded bytes fields.
-  * Optimized CodedInputStream to do less copies when parsing large bytes
-    fields.
-  * Optimized TextFormat to allocate less memory when printing.
-
-  Python
-  * SerializeToString API is changed to SerializeToString(self, **kwargs),
-    deterministic parameter is accepted for deterministic serialization.
-  * Added sort_keys parameter in json format to make the output deterministic.
-  * Added indent parameter in json format.
-  * Added extension support in json format.
-  * Added __repr__ support for repeated field in cpp implementation.
-  * Added file in FieldDescriptor.
-  * Added pretty-print filter to text format.
-  * Services and method descriptors are always printed even if generic_service
-    option is turned off.
-  * Note: AppEngine 2.5 is deprecated on June 2017 that AppEngine 2.5 will
-    never update protobuf runtime. Users who depend on AppEngine 2.5 should use
-    old protoc.
-
-  PHP
-  * Support PHP generic services. Specify file option php_generic_service=true
-    to enable generating service interface.
-  * Message, repeated and map fields setters take value instead of reference.
-  * Added map iterator in c extension.
-  * Support json  encode/decode.
-  * Added more type info in getter/setter phpdoc
-  * Fixed the problem that c extension and php implementation cannot be used
-    together.
-  * Added file option php_namespace to use custom php namespace instead of
-    package.
-  * Added fluent setter.
-  * Added descriptor API in runtime for custom encode/decode.
-  * Various bug fixes.
-
-  Objective-C
-  * Fix for GPBExtensionRegistry copying and add tests.
-  * Optimize GPBDictionary.m codegen to reduce size of overall library by 46K
-    per architecture.
-  * Fix some cases of reading of 64bit map values.
-  * Properly error on a tag with field number zero.
-  * Preserve unknown fields in proto3 syntax files.
-  * Document the exceptions on some of the writing apis.
-
-  C#
-  * Implemented IReadOnlyDictionary<K,V> in MapField<K,V>
-  * Added TryUnpack method for Any message in addition to Unpack.
-  * Converted C# projects to MSBuild (csproj) format.
-
-  Ruby
-  * Several bug fixes.
-
-  Javascript
-  * Added support of field option js_type. Now one can specify the JS type of a
-    64-bit integer field to be string in the generated code by adding option
-    [jstype = JS_STRING] on the field.
-
-2017-04-05 version 3.3.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
-  Planned Future Changes
-  * There are some changes that are not included in this release but are
-    planned for the near future:
-      - Preserve unknown fields in proto3: please read this doc:
-
-          https://docs.google.com/document/d/1KMRX-G91Aa-Y2FkEaHeeviLRRNblgIahbsk4wA14gRk/view
-
-        for the timeline and follow up this github issue:
-
-          https://github.com/google/protobuf/issues/272
-
-        for discussion.
-      - Make C++ implementation C++11 only: we plan to require C++11 to build
-        protobuf code starting from 3.4.0 or 3.5.0 release. Please join this
-        github issue:
-
-          https://github.com/google/protobuf/issues/2780
-
-        to provide your feedback.
-
-  C++
-  * Fixed map fields serialization of DynamicMessage to correctly serialize
-    both key and value regardless of their presence.
-  * Parser now rejects field number 0 correctly.
-  * New API Message::SpaceUsedLong() that’s equivalent to
-    Message::SpaceUsed() but returns the value in size_t.
-  * JSON support
-    - New flag always_print_enums_as_ints in JsonPrintOptions.
-    - New flag preserve_proto_field_names in JsonPrintOptions. It will instruct
-      the JSON printer to use the original field name declared in the .proto
-      file instead of converting them to lowerCamelCase when printing JSON.
-    - JsonPrintOptions.always_print_primtive_fields now works for oneof message
-      fields.
-    - Fixed a bug that doesn’t allow different fields to set the same json_name
-      value.
-    - Fixed a performance bug that causes excessive memory copy when printing
-      large messages.
-  * Various performance optimizations.
-
-  Java
-  * Map field setters eagerly validate inputs and throw NullPointerExceptions
-    as appropriate.
-  * Added ByteBuffer overloads to the generated parsing methods and the Parser
-    interface.
-  * proto3 enum's getNumber() method now throws on UNRECOGNIZED values.
-  * Output of JsonFormat is now locale independent.
-
-  Python
-  * Added FindServiceByName() in the pure-Python DescriptorPool. This works only
-    for descriptors added with DescriptorPool.Add(). Generated descriptor_pool
-    does not support this yet.
-  * Added a descriptor_pool parameter for parsing Any in text_format.Parse().
-  * descriptor_pool.FindFileContainingSymbol() now is able to find nested
-    extensions.
-  * Extending empty [] to repeated field now sets parent message presence.
-
-  PHP
-  * Added file option php_class_prefix. The prefix will be prepended to all
-    generated classes defined in the file.
-  * When encoding, negative int32 values are sign-extended to int64.
-  * Repeated/Map field setter accepts a regular PHP array. Type checking is
-    done on the array elements.
-  * encode/decode are renamed to serializeToString/mergeFromString.
-  * Added mergeFrom, clear method on Message.
-  * Fixed a bug that oneof accessor didn’t return the field name that is
-    actually set.
-  * C extension now works with php7.
-  * This is the first GA release of PHP. We guarantee that old generated code
-    can always work with new runtime and new generated code.
-
-  Objective-C
-  * Fixed help for GPBTimestamp for dates before the epoch that contain
-    fractional seconds.
-  * Added GPBMessageDropUnknownFieldsRecursively() to remove unknowns from a
-    message and any sub messages.
-  * Addressed a threading race in extension registration/lookup.
-  * Increased the max message parsing depth to 100 to match the other languages.
-  * Removed some use of dispatch_once in favor of atomic compare/set since it
-    needs to be heap based.
-  * Fixes for new Xcode 8.3 warnings.
-
-  C#
-  * Fixed MapField.Values.CopyTo, which would throw an exception unnecessarily
-    if provided exactly the right size of array to copy to.
-  * Fixed enum JSON formatting when multiple names mapped to the same numeric
-    value.
-  * Added JSON formatting option to format enums as integers.
-  * Modified RepeatedField<T> to implement IReadOnlyList<T>.
-  * Introduced the start of custom option handling; it's not as pleasant as it
-    might be, but the information is at least present. We expect to extend code
-    generation to improve this in the future.
-  * Introduced ByteString.FromStream and ByteString.FromStreamAsync to
-    efficiently create a ByteString from a stream.
-  * Added whole-message deprecation, which decorates the class with [Obsolete].
-
-  Ruby
-  * Fixed Message#to_h for messages with map fields.
-  * Fixed memcpy() in binary gems to work for old glibc, without breaking the
-    build for non-glibc libc’s like musl.
-
-  Javascript
-  * Added compatibility tests for version 3.0.0.
-  * Added conformance tests.
-  * Fixed serialization of extensions: we need to emit a value even if it is
-    falsy (like the number 0).
-  * Use closurebuilder.py in favor of calcdeps.py for compiling JavaScript.
-
-2017-01-23 version 3.2.0 (C++/Java/Python/PHP/Ruby/Objective-C/C#/JavaScript/Lite)
-  General
-  * Added protoc version number to protoc plugin protocol. It can be used by
-    protoc plugin to detect which version of protoc is used with the plugin and
-    mitigate known problems in certain version of protoc.
-
-  C++
-  * The default parsing byte size limit has been raised from 64MB to 2GB.
-  * Added rvalue setters for non-arena string fields.
-  * Enabled debug logging for Android.
-  * Fixed a double-free problem when using Reflection::SetAllocatedMessage()
-    with extension fields.
-  * Fixed several deterministic serialization bugs:
-    * MessageLite::SerializeAsString() now respects the global deterministic
-      serialization flag.
-    * Extension fields are serialized deterministically as well.  Fixed protocol
-      compiler to correctly report importing-self as an error.
-  * Fixed FileDescriptor::DebugString() to print custom options correctly.
-  * Various performance/codesize optimizations and cleanups.
-
-  Java
-  * The default parsing byte size limit has been raised from 64MB to 2GB.
-  * Added recursion limit when parsing JSON.
-  * Fixed a bug that enumType.getDescriptor().getOptions() doesn't have custom
-    options.
-  * Fixed generated code to support field numbers up to 2^29-1.
-
-  Python
-  * You can now assign NumPy scalars/arrays (np.int32, np.int64) to protobuf
-    fields, and assigning other numeric types has been optimized for
-    performance.
-  * Pure-Python: message types are now garbage-collectable.
-  * Python/C++: a lot of internal cleanup/refactoring.
-
-  PHP (Alpha)
-  * For 64-bit integers type (int64/uint64/sfixed64/fixed64/sint64), use PHP
-    integer on 64-bit environment and PHP string on 32-bit environment.
-  * PHP generated code also conforms to PSR-4 now.
-  * Fixed ZTS build for c extension.
-  * Fixed c extension build on Mac.
-  * Fixed c extension build on 32-bit linux.
-  * Fixed the bug that message without namespace is not found in the descriptor
-    pool. (#2240)
-  * Fixed the bug that repeated field is not iterable in c extension.
-  * Message names Empty will be converted to GPBEmpty in generated code.
-  * Added phpdoc in generated files.
-  * The released API is almost stable. Unless there is large problem, we won't
-    change it. See
-    https://developers.google.com/protocol-buffers/docs/reference/php-generated
-    for more details.
-
-  Objective-C
-  * Added support for push/pop of the stream limit on CodedInputStream for
-    anyone doing manual parsing.
-
-  C#
-  * No changes.
-
-  Ruby
-  * Message objects now support #respond_to? for field getters/setters.
-  * You can now compare “message == non_message_object” and it will return false
-    instead of throwing an exception.
-  * JRuby: fixed #hashCode to properly reflect the values in the message.
-
-  Javascript
-  * Deserialization of repeated fields no longer has quadratic performance
-    behavior.
-  * UTF-8 encoding/decoding now properly supports high codepoints.
-  * Added convenience methods for some well-known types: Any, Struct, and
-    Timestamp. These make it easier to convert data between native JavaScript
-    types and the well-known protobuf types.
-
-2016-09-23 version 3.1.0 (C++/Java/Python/PHP/Ruby/Objective-C/C#/JavaScript/Lite)
-  General
-  * Proto3 support in PHP (alpha).
-  * Various bug fixes.
-
-  C++
-  * Added MessageLite::ByteSizeLong() that’s equivalent to
-    MessageLite::ByteSize() but returns the value in size_t. Useful to check
-    whether a message is over the 2G size limit that protobuf can support.
-  * Moved default_instances to global variables. This allows default_instance
-    addresses to be known at compile time.
-  * Adding missing generic gcc 64-bit atomicops.
-  * Restore New*Callback into google::protobuf namespace since these are used
-    by the service stubs code
-  * JSON support.
-    * Fixed some conformance issues.
-  * Fixed a JSON serialization bug for bytes fields.
-
-  Java
-  * Fixed a bug in TextFormat that doesn’t accept empty repeated fields (i.e.,
-    “field: [ ]”).
-  * JSON support
-    * Fixed JsonFormat to do correct snake_case-to-camelCase conversion for
-      non-style-conforming field names.
-    * Fixed JsonFormat to parse empty Any message correctly.
-    * Added an option to JsonFormat.Parser to ignore unknown fields.
-  * Experimental API
-    * Added UnsafeByteOperations.unsafeWrap(byte[]) to wrap a byte array into
-      ByteString without copy.
-
-  Python
-  * JSON support
-    * Fixed some conformance issues.
-
-  PHP (Alpha)
-  * We have added the proto3 support for PHP via both a pure PHP package and a
-    native c extension. The pure PHP package is intended to provide usability
-    to wider range of PHP platforms, while the c extension is intended to
-    provide higher performance. Both implementations provide the same runtime
-    APIs and share the same generated code. Users don’t need to re-generate
-    code for the same proto definition when they want to switch the
-    implementation later. The pure PHP package is included in the php/src
-    directory, and the c extension is included in the php/ext directory.
-
-    Both implementations provide idiomatic PHP APIs:
-    * All messages and enums are defined as PHP classes.
-    * All message fields can only be accessed via getter/setter.
-    * Both repeated field elements and map elements are stored in containers
-      that act like a normal PHP array.
-
-    Unlike several existing third-party PHP implementations for protobuf, our
-    implementations are built on a "strongly-typed" philosophy: message fields
-    and array/map containers will throw exceptions eagerly when values of the
-    incorrect type (not including those that can be type converted, e.g.,
-    double <-> integer <-> numeric string) are inserted.
-
-    Currently, pure PHP runtime supports php5.5, 5.6 and 7 on linux. C
-    extension runtime supports php5.5 and 5.6 on linux.
-
-    See php/README.md for more details about installment. See
-    https://developers.google.com/protocol-buffers/docs/phptutorial for more
-    details about APIs.
-
-  Objective-C
-  * Helpers are now provided for working the the Any well known type (see
-    GPBWellKnownTypes.h for the api additions).
-  * Some improvements in startup code (especially when extensions aren’t used).
-
-  Javascript
-  * Fixed missing import of jspb.Map
-  * Fixed valueWriterFn variable name
-
-  Ruby
-  * Fixed hash computation for JRuby's RubyMessage
-  * Make sure map parsing frames are GC-rooted.
-  * Added API support for well-known types.
-
-  C#
-  * Removed check on dependency in the C# reflection API.
-
-2016-09-06 version 3.0.2 (C++/Java/Python/Ruby/Objective-C/C#/JavaScript/Lite)
-  General
-  * Various bug fixes.
-
-  Objective C
-  * Fix for oneofs in proto3 syntax files where fields were set to the zero
-    value.
-  * Fix for embedded null character in strings.
-  * CocoaDocs support
-
-  Ruby
-  * Fixed memory corruption bug in parsing that could occur under GC pressure.
-
-  Javascript
-  * jspb.Map is now properly exported to CommonJS modules.
-
-  C#
-  * Removed legacy_enum_values flag.
-
-
-2016-07-27 version 3.0.0 (C++/Java/Python/Ruby/Objective-C/C#/JavaScript/Lite)
-  General
-  * This log only contains changes since the beta-4 release. Summarized change
-    log since the last stable release (v2.6.1) can be found in the github
-    release page.
-
-  Compatibility Notice
-  * v3.0.0 is the first API stable release of the v3.x series. We do not expect
-    any future API breaking changes.
-  * For C++, Java Lite and Objective-C, source level compatibility is
-    guaranteed.  Upgrading from v3.0.0 to newer minor version releases will be
-    source compatible. For example, if your code compiles against protobuf
-    v3.0.0, it will continue to compile after you upgrade protobuf library to
-    v3.1.0.
-  * For other languages, both source level compatibility and binary level
-    compatibility are guaranteed. For example, if you have a Java binary built
-    against protobuf v3.0.0. After switching the protobuf runtime binary to
-    v3.1.0, your built binary should continue to work.
-  * Compatibility is only guaranteed for documented API and documented
-    behaviors. If you are using undocumented API (e.g., use anything in the C++
-    internal namespace), it can be broken by minor version releases in an
-    undetermined manner.
-
-  Ruby
-  * When you assign a string field `a.string_field = "X"`, we now call
-    #encode(UTF-8) on the string and freeze the copy. This saves you from
-    needing to ensure the string is already encoded as UTF-8. It also prevents
-    you from mutating the string after it has been assigned (this is how we
-    ensure it stays valid UTF-8).
-  * The generated file for `foo.proto` is now `foo_pb.rb` instead of just
-    `foo.rb`. This makes it easier to see which imports/requires are from
-    protobuf generated code, and also prevents conflicts with any `foo.rb` file
-    you might have written directly in Ruby. It is a backward-incompatible
-    change: you will need to update all of your `require` statements.
-  * For package names like `foo_bar`, we now translate this to the Ruby module
-    `FooBar`. This is more idiomatic Ruby than what we used to do (`Foo_bar`).
-
-  JavaScript
-  * Scalar fields like numbers and boolean now return defaults instead of
-    `undefined` or `null` when they are unset. You can test for presence
-    explicitly by calling `hasFoo()`, which we now generate for scalar fields.
-
-  Java Lite
-  * Java Lite is now implemented as a separate plugin, maintained in the
-    `javalite` branch. Both lite runtime and protoc artifacts will be available
-    in Maven.
-
-  C#
-  * Target platforms now .NET 4.5, selected portable subsets and .NET Core.
-  * legacy_enum_values option is no longer supported.
-
-2016-07-15 version 3.0.0-beta-4 (C++/Java/Python/Ruby/Objective-C/C#/JavaScript)
-  General
-  * Added a deterministic serialization API for C++. The deterministic
-    serialization guarantees that given a binary, equal messages will be
-    serialized to the same bytes. This allows applications like MapReduce to
-    group equal messages based on the serialized bytes. The deterministic
-    serialization is, however, NOT canonical across languages; it is also
-    unstable across different builds with schema changes due to unknown fields.
-    Users who need canonical serialization, e.g. persistent storage in a
-    canonical form, fingerprinting, etc, should define their own
-    canonicalization specification and implement the serializer using reflection
-    APIs rather than relying on this API.
-  * Added OneofOptions. You can now define custom options for oneof groups.
-      import "google/protobuf/descriptor.proto";
-      extend google.protobuf.OneofOptions {
-        optional int32 my_oneof_extension = 12345;
-      }
-      message Foo {
-        oneof oneof_group {
-          (my_oneof_extension) = 54321;
-          ...
-        }
-      }
-
-  C++ (beta)
-  * Introduced a deterministic serialization API in
-    CodedOutputStream::SetSerializationDeterministic(bool). See the notes about
-    deterministic serialization in the General section.
-  * Added google::protobuf::Map::swap() to swap two map fields.
-  * Fixed a memory leak when calling Reflection::ReleaseMessage() on a message
-    allocated on arena.
-  * Improved error reporting when parsing text format protos.
-  * JSON
-      - Added a new parser option to ignore unknown fields when parsing JSON.
-      - Added convenient methods for message to/from JSON conversion.
-  * Various performance optimizations.
-
-  Java (beta)
-  * File option "java_generate_equals_and_hash" is now deprecated. equals() and
-    hashCode() methods are generated by default.
-  * Added a new JSON printer option "omittingInsignificantWhitespace" to produce
-    a more compact JSON output. The printer will pretty-print by default.
-  * Updated Java runtime to be compatible with 2.5.0/2.6.1 generated protos.
-
-  Python (beta)
-  * Added support to pretty print Any messages in text format.
-  * Added a flag to ignore unknown fields when parsing JSON.
-  * Bugfix: "@type" field of a JSON Any message is now correctly put before
-    other fields.
-
-  Objective-C (beta)
-  * Updated the code to support compiling with more compiler warnings
-    enabled. (Issue 1616)
-  * Exposing more detailed errors for parsing failures. (PR 1623)
-  * Small (breaking) change to the naming of some methods on the support classes
-    for map<>. There were collisions with the system provided KVO support, so
-    the names were changed to avoid those issues.  (PR 1699)
-  * Fixed for proper Swift bridging of error handling during parsing. (PR 1712)
-  * Complete support for generating sources that will go into a Framework and
-    depend on generated sources from other Frameworks. (Issue 1457)
-
-  C# (beta)
-  * RepeatedField optimizations.
-  * Support for .NET Core.
-  * Minor bug fixes.
-  * Ability to format a single value in JsonFormatter (advanced usage only).
-  * Modifications to attributes applied to generated code.
-
-  Javascript (alpha)
-  * Maps now have a real map API instead of being treated as repeated fields.
-  * Well-known types are now provided in the google-protobuf package, and the
-    code generator knows to require() them from that package.
-  * Bugfix: non-canonical varints are correctly decoded.
-
-  Ruby (alpha)
-  * Accessors for oneof fields now return default values instead of nil.
-
-  Java Lite
-  * Java lite support is removed from protocol compiler. It will be supported
-    as a protocol compiler plugin in a separate code branch.
-
 2016-05-16 version 3.0.0-beta-3 (C++/Java/Python/Ruby/Nano/Objective-C/C#/JavaScript)
   General
   * Supported Proto3 lite-runtime in C++/Java for mobile platforms.
@@ -1728,7 +1077,7 @@
 2008-09-29 version 2.0.2:
 
   General
-  * License changed from Apache 2.0 to 3-Clause BSD.
+  * License changed from Apache 2.0 to New BSD.
   * It is now possible to define custom "options", which are basically
     annotations which may be placed on definitions in a .proto file.
     For example, you might define a field option called "foo" like so:
diff --git a/Makefile.am b/Makefile.am
index 19a1607..3e98881 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -51,43 +51,37 @@
 csharp_EXTRA_DIST=                                                           \
   csharp/.gitignore                                                          \
   csharp/CHANGES.txt                                                         \
-  csharp/Google.Protobuf.Tools.nuspec                                        \
   csharp/README.md                                                           \
   csharp/build_packages.bat                                                  \
-  csharp/build_tools.sh                                                      \
   csharp/buildall.sh                                                         \
   csharp/generate_protos.sh                                                  \
-  csharp/global.json                                                         \
   csharp/keys/Google.Protobuf.public.snk                                     \
-  csharp/keys/Google.Protobuf.snk                                            \
   csharp/keys/README.md                                                      \
-  csharp/protos/README.md                                                    \
-  csharp/protos/map_unittest_proto3.proto                                    \
-  csharp/protos/unittest_custom_options_proto3.proto                         \
-  csharp/protos/unittest_import_public_proto3.proto                          \
-  csharp/protos/unittest_import_proto3.proto                                 \
   csharp/protos/unittest_issues.proto                                        \
-  csharp/protos/unittest_proto3.proto                                        \
   csharp/src/AddressBook/AddPerson.cs                                        \
-  csharp/src/AddressBook/Addressbook.cs                                      \
   csharp/src/AddressBook/AddressBook.csproj                                  \
+  csharp/src/AddressBook/Addressbook.cs                                      \
   csharp/src/AddressBook/ListPeople.cs                                       \
   csharp/src/AddressBook/Program.cs                                          \
+  csharp/src/AddressBook/Properties/AssemblyInfo.cs                          \
   csharp/src/AddressBook/SampleUsage.cs                                      \
+  csharp/src/AddressBook/app.config                                          \
+  csharp/src/Google.Protobuf.Conformance/App.config                          \
   csharp/src/Google.Protobuf.Conformance/Conformance.cs                      \
   csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj  \
   csharp/src/Google.Protobuf.Conformance/Program.cs                          \
+  csharp/src/Google.Protobuf.Conformance/Properties/AssemblyInfo.cs          \
   csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj        \
   csharp/src/Google.Protobuf.JsonDump/Program.cs                             \
+  csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs             \
+  csharp/src/Google.Protobuf.JsonDump/app.config                             \
   csharp/src/Google.Protobuf.Test/ByteStringTest.cs                          \
   csharp/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs              \
   csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs                    \
   csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs                   \
   csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs                \
-  csharp/src/Google.Protobuf.Test/Collections/ProtobufEqualityComparersTest.cs \
   csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs           \
   csharp/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs \
-  csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs      \
   csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs        \
   csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs                    \
   csharp/src/Google.Protobuf.Test/EqualityTester.cs                          \
@@ -98,19 +92,15 @@
   csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs                       \
   csharp/src/Google.Protobuf.Test/JsonParserTest.cs                          \
   csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs                       \
-  csharp/src/Google.Protobuf.Test/Program.cs                                 \
-  csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs            \
+  csharp/src/Google.Protobuf.Test/Properties/AppManifest.xml                 \
+  csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs                 \
   csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs              \
   csharp/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs              \
   csharp/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs             \
   csharp/src/Google.Protobuf.Test/SampleEnum.cs                              \
   csharp/src/Google.Protobuf.Test/SampleMessages.cs                          \
-  csharp/src/Google.Protobuf.Test/SampleNaNs.cs                              \
   csharp/src/Google.Protobuf.Test/TestCornerCases.cs                         \
-  csharp/src/Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs        \
   csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs            \
-  csharp/src/Google.Protobuf.Test/TestProtos/TestMessagesProto3.cs           \
-  csharp/src/Google.Protobuf.Test/TestProtos/UnittestCustomOptionsProto3.cs  \
   csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs         \
   csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs   \
   csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs               \
@@ -118,28 +108,24 @@
   csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs       \
   csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs                  \
   csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs             \
-  csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs            \
   csharp/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs            \
   csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs             \
-  csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs                     \
+  csharp/src/Google.Protobuf.Test/packages.config                            \
   csharp/src/Google.Protobuf.sln                                             \
   csharp/src/Google.Protobuf/ByteArray.cs                                    \
   csharp/src/Google.Protobuf/ByteString.cs                                   \
   csharp/src/Google.Protobuf/CodedInputStream.cs                             \
   csharp/src/Google.Protobuf/CodedOutputStream.ComputeSize.cs                \
   csharp/src/Google.Protobuf/CodedOutputStream.cs                            \
-  csharp/src/Google.Protobuf/Collections/Lists.cs                            \
   csharp/src/Google.Protobuf/Collections/MapField.cs                         \
-  csharp/src/Google.Protobuf/Collections/ProtobufEqualityComparers.cs        \
   csharp/src/Google.Protobuf/Collections/ReadOnlyDictionary.cs               \
   csharp/src/Google.Protobuf/Collections/RepeatedField.cs                    \
   csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs         \
-  csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs               \
   csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs                 \
   csharp/src/Google.Protobuf/FieldCodec.cs                                   \
   csharp/src/Google.Protobuf/FrameworkPortability.cs                         \
   csharp/src/Google.Protobuf/Google.Protobuf.csproj                          \
-  csharp/src/Google.Protobuf/ICustomDiagnosticMessage.cs                     \
+  csharp/src/Google.Protobuf/Google.Protobuf.nuspec                          \
   csharp/src/Google.Protobuf/IDeepCloneable.cs                               \
   csharp/src/Google.Protobuf/IMessage.cs                                     \
   csharp/src/Google.Protobuf/InvalidJsonException.cs                         \
@@ -153,7 +139,6 @@
   csharp/src/Google.Protobuf/MessageParser.cs                                \
   csharp/src/Google.Protobuf/ProtoPreconditions.cs                           \
   csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs                      \
-  csharp/src/Google.Protobuf/Reflection/CustomOptions.cs                     \
   csharp/src/Google.Protobuf/Reflection/Descriptor.cs                        \
   csharp/src/Google.Protobuf/Reflection/DescriptorBase.cs                    \
   csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs                    \
@@ -188,7 +173,6 @@
   csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs               \
   csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs                         \
   csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs                     \
-  csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs              \
   csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs                 \
   csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs                        \
   csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs                \
@@ -199,8 +183,8 @@
   csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs                      \
   csharp/src/Google.Protobuf/WellKnownTypes/WrappersPartial.cs               \
   csharp/src/Google.Protobuf/WireFormat.cs                                   \
-  csharp/src/Google.Protobuf/UnknownField.cs                                 \
-  csharp/src/Google.Protobuf/UnknownFieldSet.cs
+  csharp/src/Google.Protobuf/packages.config                                 \
+  csharp/src/packages/repositories.config
 
 java_EXTRA_DIST=                                                                   \
   java/README.md                                                                   \
@@ -219,25 +203,20 @@
   java/core/src/main/java/com/google/protobuf/ByteString.java                      \
   java/core/src/main/java/com/google/protobuf/CodedInputStream.java                \
   java/core/src/main/java/com/google/protobuf/CodedOutputStream.java               \
-  java/core/src/main/java/com/google/protobuf/DiscardUnknownFieldsParser.java      \
   java/core/src/main/java/com/google/protobuf/Descriptors.java                     \
   java/core/src/main/java/com/google/protobuf/DoubleArrayList.java                 \
   java/core/src/main/java/com/google/protobuf/DynamicMessage.java                  \
-  java/core/src/main/java/com/google/protobuf/ExperimentalApi.java                 \
   java/core/src/main/java/com/google/protobuf/Extension.java                       \
   java/core/src/main/java/com/google/protobuf/ExtensionLite.java                   \
   java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java               \
-  java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java        \
   java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java           \
   java/core/src/main/java/com/google/protobuf/FieldSet.java                        \
   java/core/src/main/java/com/google/protobuf/FloatArrayList.java                  \
   java/core/src/main/java/com/google/protobuf/GeneratedMessage.java                \
   java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java            \
-  java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java              \
   java/core/src/main/java/com/google/protobuf/IntArrayList.java                    \
   java/core/src/main/java/com/google/protobuf/Internal.java                        \
   java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java  \
-  java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java   \
   java/core/src/main/java/com/google/protobuf/LazyField.java                       \
   java/core/src/main/java/com/google/protobuf/LazyFieldLite.java                   \
   java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java             \
@@ -256,12 +235,10 @@
   java/core/src/main/java/com/google/protobuf/MutabilityOracle.java                \
   java/core/src/main/java/com/google/protobuf/NioByteString.java                   \
   java/core/src/main/java/com/google/protobuf/Parser.java                          \
-  java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java    \
   java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java               \
   java/core/src/main/java/com/google/protobuf/ProtocolMessageEnum.java             \
   java/core/src/main/java/com/google/protobuf/ProtocolStringList.java              \
   java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java            \
-  java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java          \
   java/core/src/main/java/com/google/protobuf/RopeByteString.java                  \
   java/core/src/main/java/com/google/protobuf/RpcCallback.java                     \
   java/core/src/main/java/com/google/protobuf/RpcChannel.java                      \
@@ -270,7 +247,6 @@
   java/core/src/main/java/com/google/protobuf/Service.java                         \
   java/core/src/main/java/com/google/protobuf/ServiceException.java                \
   java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java              \
-  java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java            \
   java/core/src/main/java/com/google/protobuf/SmallSortedMap.java                  \
   java/core/src/main/java/com/google/protobuf/TextFormat.java                      \
   java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java               \
@@ -281,7 +257,6 @@
   java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java             \
   java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java      \
   java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java            \
-  java/core/src/main/java/com/google/protobuf/UnsafeUtil.java                      \
   java/core/src/main/java/com/google/protobuf/Utf8.java                            \
   java/core/src/main/java/com/google/protobuf/WireFormat.java                      \
   java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java             \
@@ -295,11 +270,9 @@
   java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java           \
   java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java             \
   java/core/src/test/java/com/google/protobuf/DescriptorsTest.java                 \
-  java/core/src/test/java/com/google/protobuf/DiscardUnknownFieldsTest.java        \
   java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java             \
   java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java              \
   java/core/src/test/java/com/google/protobuf/EnumTest.java                        \
-  java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java    \
   java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java               \
   java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java              \
   java/core/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java        \
@@ -322,19 +295,16 @@
   java/core/src/test/java/com/google/protobuf/MessageTest.java                     \
   java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java              \
   java/core/src/test/java/com/google/protobuf/NioByteStringTest.java               \
-  java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java             \
   java/core/src/test/java/com/google/protobuf/ParserTest.java                      \
   java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java           \
-  java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java      \
+  java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java        \
   java/core/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java     \
   java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java              \
   java/core/src/test/java/com/google/protobuf/ServiceTest.java                     \
-  java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java        \
+  java/core/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java          \
   java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java              \
   java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java              \
-  java/core/src/test/java/com/google/protobuf/TestBadIdentifiersLite.java          \
   java/core/src/test/java/com/google/protobuf/TestUtil.java                        \
-  java/core/src/test/java/com/google/protobuf/TestUtilLite.java                    \
   java/core/src/test/java/com/google/protobuf/TextFormatParseInfoTreeTest.java     \
   java/core/src/test/java/com/google/protobuf/TextFormatParseLocationTest.java     \
   java/core/src/test/java/com/google/protobuf/TextFormatTest.java                  \
@@ -345,7 +315,6 @@
   java/core/src/test/java/com/google/protobuf/WellKnownTypesTest.java              \
   java/core/src/test/java/com/google/protobuf/WireFormatTest.java                  \
   java/core/src/test/proto/com/google/protobuf/any_test.proto                      \
-  java/core/src/test/proto/com/google/protobuf/deprecated_file.proto               \
   java/core/src/test/proto/com/google/protobuf/field_presence_test.proto           \
   java/core/src/test/proto/com/google/protobuf/lazy_fields_lite.proto              \
   java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto          \
@@ -367,17 +336,13 @@
   java/core/src/test/proto/com/google/protobuf/test_check_utf8_size.proto          \
   java/core/src/test/proto/com/google/protobuf/test_custom_options.proto           \
   java/core/src/test/proto/com/google/protobuf/test_extra_interfaces.proto         \
-  java/lite/generate-sources-build.xml                                             \
-  java/lite/generate-test-sources-build.xml                                        \
   java/lite/pom.xml                                                                \
   java/pom.xml                                                                     \
   java/util/pom.xml                                                                \
-  java/util/src/main/java/com/google/protobuf/util/Durations.java                  \
   java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java              \
   java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java              \
   java/util/src/main/java/com/google/protobuf/util/JsonFormat.java                 \
   java/util/src/main/java/com/google/protobuf/util/TimeUtil.java                   \
-  java/util/src/main/java/com/google/protobuf/util/Timestamps.java                 \
   java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java          \
   java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java          \
   java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java             \
@@ -496,6 +461,8 @@
   objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj                   \
   objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
   objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
+  objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/FFE465CA-0E74-40E8-9F09-500B66B7DCB2.plist \
+  objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/Info.plist \
   objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
   objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
   objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj                   \
@@ -504,33 +471,6 @@
   objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
   objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
   objectivec/README.md                                                       \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.pbxproj \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/OSXCocoaPodsTester.xcscheme \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.h \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.m \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Base.lproj/MainMenu.xib \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Info.plist \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/main.m    \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-framework            \
-  objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-static               \
-  objectivec/Tests/CocoaPods/README.md                                       \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-framework            \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-static               \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.pbxproj \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/iOSCocoaPodsTester.xcscheme \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.h \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.m \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/LaunchScreen.storyboard \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/Main.storyboard \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Info.plist \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.h \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.m \
-  objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/main.m    \
-  objectivec/Tests/CocoaPods/run_tests.sh                                    \
   objectivec/Tests/golden_message                                            \
   objectivec/Tests/golden_packed_fields_message                              \
   objectivec/Tests/GPBARCUnittestProtos.m                                    \
@@ -545,9 +485,7 @@
   objectivec/Tests/GPBDictionaryTests+String.m                               \
   objectivec/Tests/GPBDictionaryTests+UInt32.m                               \
   objectivec/Tests/GPBDictionaryTests+UInt64.m                               \
-  objectivec/Tests/GPBDictionaryTests.m                                      \
   objectivec/Tests/GPBDictionaryTests.pddm                                   \
-  objectivec/Tests/GPBExtensionRegistryTest.m                                \
   objectivec/Tests/GPBMessageTests+Merge.m                                   \
   objectivec/Tests/GPBMessageTests+Runtime.m                                 \
   objectivec/Tests/GPBMessageTests+Serialization.m                           \
@@ -558,7 +496,6 @@
   objectivec/Tests/GPBTestUtilities.h                                        \
   objectivec/Tests/GPBTestUtilities.m                                        \
   objectivec/Tests/GPBUnittestProtos.m                                       \
-  objectivec/Tests/GPBUnittestProtos2.m                                      \
   objectivec/Tests/GPBUnknownFieldSetTest.m                                  \
   objectivec/Tests/GPBUtilitiesTests.m                                       \
   objectivec/Tests/GPBWellKnownTypesTest.m                                   \
@@ -580,15 +517,6 @@
   objectivec/Tests/text_format_map_unittest_data.txt                          \
   objectivec/Tests/text_format_unittest_data.txt                              \
   objectivec/Tests/unittest_cycle.proto                                       \
-  objectivec/Tests/unittest_deprecated.proto                                  \
-  objectivec/Tests/unittest_deprecated_file.proto                             \
-  objectivec/Tests/unittest_extension_chain_a.proto                           \
-  objectivec/Tests/unittest_extension_chain_b.proto                           \
-  objectivec/Tests/unittest_extension_chain_c.proto                           \
-  objectivec/Tests/unittest_extension_chain_d.proto                           \
-  objectivec/Tests/unittest_extension_chain_e.proto                           \
-  objectivec/Tests/unittest_extension_chain_f.proto                           \
-  objectivec/Tests/unittest_extension_chain_g.proto                           \
   objectivec/Tests/unittest_objc.proto                                        \
   objectivec/Tests/unittest_objc_startup.proto                                \
   objectivec/Tests/unittest_runtime_proto2.proto                              \
@@ -597,172 +525,6 @@
   objectivec/Tests/UnitTests-Info.plist                                       \
   Protobuf.podspec
 
-php_EXTRA_DIST=                                                       \
-  composer.json                                                       \
-  php/README.md                                                       \
-  php/composer.json                                                   \
-  php/ext/google/protobuf/array.c                                     \
-  php/ext/google/protobuf/config.m4                                   \
-  php/ext/google/protobuf/def.c                                       \
-  php/ext/google/protobuf/encode_decode.c                             \
-  php/ext/google/protobuf/map.c                                       \
-  php/ext/google/protobuf/message.c                                   \
-  php/ext/google/protobuf/package.xml                                 \
-  php/ext/google/protobuf/protobuf.c                                  \
-  php/ext/google/protobuf/protobuf.h                                  \
-  php/ext/google/protobuf/storage.c                                   \
-  php/ext/google/protobuf/type_check.c                                \
-  php/ext/google/protobuf/upb.c                                       \
-  php/ext/google/protobuf/upb.h                                       \
-  php/ext/google/protobuf/utf8.c                                      \
-  php/ext/google/protobuf/utf8.h                                      \
-  php/generate_descriptor_protos.sh                                   \
-  php/phpunit.xml                                                     \
-  php/src/GPBMetadata/Google/Protobuf/Any.php                         \
-  php/src/GPBMetadata/Google/Protobuf/Api.php                         \
-  php/src/GPBMetadata/Google/Protobuf/Duration.php                    \
-  php/src/GPBMetadata/Google/Protobuf/FieldMask.php                   \
-  php/src/GPBMetadata/Google/Protobuf/GPBEmpty.php                    \
-  php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php         \
-  php/src/GPBMetadata/Google/Protobuf/SourceContext.php               \
-  php/src/GPBMetadata/Google/Protobuf/Struct.php                      \
-  php/src/GPBMetadata/Google/Protobuf/Timestamp.php                   \
-  php/src/GPBMetadata/Google/Protobuf/Type.php                        \
-  php/src/GPBMetadata/Google/Protobuf/Wrappers.php                    \
-  php/src/Google/Protobuf/Any.php                                     \
-  php/src/Google/Protobuf/Api.php                                     \
-  php/src/Google/Protobuf/BoolValue.php                               \
-  php/src/Google/Protobuf/BytesValue.php                              \
-  php/src/Google/Protobuf/Descriptor.php                              \
-  php/src/Google/Protobuf/DescriptorPool.php                          \
-  php/src/Google/Protobuf/DoubleValue.php                             \
-  php/src/Google/Protobuf/Duration.php                                \
-  php/src/Google/Protobuf/Enum.php                                    \
-  php/src/Google/Protobuf/EnumDescriptor.php                          \
-  php/src/Google/Protobuf/EnumValue.php                               \
-  php/src/Google/Protobuf/EnumValueDescriptor.php                     \
-  php/src/Google/Protobuf/Field.php                                   \
-  php/src/Google/Protobuf/FieldDescriptor.php                         \
-  php/src/Google/Protobuf/FieldMask.php                               \
-  php/src/Google/Protobuf/Field_Cardinality.php                       \
-  php/src/Google/Protobuf/Field_Kind.php                              \
-  php/src/Google/Protobuf/FloatValue.php                              \
-  php/src/Google/Protobuf/GPBEmpty.php                                \
-  php/src/Google/Protobuf/Int32Value.php                              \
-  php/src/Google/Protobuf/Int64Value.php                              \
-  php/src/Google/Protobuf/Internal/CodedInputStream.php               \
-  php/src/Google/Protobuf/Internal/CodedOutputStream.php              \
-  php/src/Google/Protobuf/Internal/Descriptor.php                     \
-  php/src/Google/Protobuf/Internal/DescriptorPool.php                 \
-  php/src/Google/Protobuf/Internal/DescriptorProto.php                \
-  php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php \
-  php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php  \
-  php/src/Google/Protobuf/Internal/EnumBuilderContext.php             \
-  php/src/Google/Protobuf/Internal/EnumDescriptor.php                 \
-  php/src/Google/Protobuf/Internal/EnumDescriptorProto.php            \
-  php/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php \
-  php/src/Google/Protobuf/Internal/EnumOptions.php                    \
-  php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php       \
-  php/src/Google/Protobuf/Internal/EnumValueOptions.php               \
-  php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php          \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php     \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto.php           \
-  php/src/Google/Protobuf/Internal/FieldDescriptor.php                \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto.php           \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php     \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php      \
-  php/src/Google/Protobuf/Internal/FieldOptions.php                   \
-  php/src/Google/Protobuf/Internal/FieldOptions_CType.php             \
-  php/src/Google/Protobuf/Internal/FieldOptions_JSType.php            \
-  php/src/Google/Protobuf/Internal/FileDescriptor.php                 \
-  php/src/Google/Protobuf/Internal/FileDescriptorProto.php            \
-  php/src/Google/Protobuf/Internal/FileDescriptorSet.php              \
-  php/src/Google/Protobuf/Internal/FileOptions.php                    \
-  php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php       \
-  php/src/Google/Protobuf/Internal/GPBDecodeException.php             \
-  php/src/Google/Protobuf/Internal/GPBJsonWire.php                    \
-  php/src/Google/Protobuf/Internal/GPBLabel.php                       \
-  php/src/Google/Protobuf/Internal/GPBType.php                        \
-  php/src/Google/Protobuf/Internal/GPBUtil.php                        \
-  php/src/Google/Protobuf/Internal/GPBWire.php                        \
-  php/src/Google/Protobuf/Internal/GPBWireType.php                    \
-  php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php              \
-  php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php   \
-  php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php       \
-  php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php       \
-  php/src/Google/Protobuf/Internal/MapEntry.php                       \
-  php/src/Google/Protobuf/Internal/MapField.php                       \
-  php/src/Google/Protobuf/Internal/MapFieldIter.php                   \
-  php/src/Google/Protobuf/Internal/Message.php                        \
-  php/src/Google/Protobuf/Internal/MessageBuilderContext.php          \
-  php/src/Google/Protobuf/Internal/MessageOptions.php                 \
-  php/src/Google/Protobuf/Internal/MethodDescriptorProto.php          \
-  php/src/Google/Protobuf/Internal/MethodOptions.php                  \
-  php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php \
-  php/src/Google/Protobuf/Internal/OneofDescriptor.php                \
-  php/src/Google/Protobuf/Internal/OneofDescriptorProto.php           \
-  php/src/Google/Protobuf/Internal/OneofField.php                     \
-  php/src/Google/Protobuf/Internal/OneofOptions.php                   \
-  php/src/Google/Protobuf/Internal/RawInputStream.php                 \
-  php/src/Google/Protobuf/Internal/RepeatedField.php                  \
-  php/src/Google/Protobuf/Internal/RepeatedFieldIter.php              \
-  php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php         \
-  php/src/Google/Protobuf/Internal/ServiceOptions.php                 \
-  php/src/Google/Protobuf/Internal/SourceCodeInfo.php                 \
-  php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php        \
-  php/src/Google/Protobuf/Internal/UninterpretedOption.php            \
-  php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php   \
-  php/src/Google/Protobuf/ListValue.php                               \
-  php/src/Google/Protobuf/Method.php                                  \
-  php/src/Google/Protobuf/Mixin.php                                   \
-  php/src/Google/Protobuf/NullValue.php                               \
-  php/src/Google/Protobuf/OneofDescriptor.php                         \
-  php/src/Google/Protobuf/Option.php                                  \
-  php/src/Google/Protobuf/SourceContext.php                           \
-  php/src/Google/Protobuf/StringValue.php                             \
-  php/src/Google/Protobuf/Struct.php                                  \
-  php/src/Google/Protobuf/Syntax.php                                  \
-  php/src/Google/Protobuf/Timestamp.php                               \
-  php/src/Google/Protobuf/Type.php                                    \
-  php/src/Google/Protobuf/UInt32Value.php                             \
-  php/src/Google/Protobuf/UInt64Value.php                             \
-  php/src/Google/Protobuf/Value.php                                   \
-  php/src/phpdoc.dist.xml                                             \
-  php/tests/array_test.php                                            \
-  php/tests/autoload.php                                              \
-  php/tests/bootstrap_phpunit.php                                     \
-  php/tests/compatibility_test.sh                                     \
-  php/tests/descriptors_test.php                                      \
-  php/tests/encode_decode_test.php                                    \
-  php/tests/gdb_test.sh                                               \
-  php/tests/generated_class_test.php                                  \
-  php/tests/generated_phpdoc_test.php                                 \
-  php/tests/generated_service_test.php                                \
-  php/tests/map_field_test.php                                        \
-  php/tests/memory_leak_test.php                                      \
-  php/tests/php_implementation_test.php                               \
-  php/tests/proto/test.proto                                          \
-  php/tests/proto/test_descriptors.proto                              \
-  php/tests/proto/test_empty_php_namespace.proto                      \
-  php/tests/proto/test_import_descriptor_proto.proto                  \
-  php/tests/proto/test_include.proto                                  \
-  php/tests/proto/test_no_namespace.proto                             \
-  php/tests/proto/test_php_namespace.proto                            \
-  php/tests/proto/test_prefix.proto                                   \
-  php/tests/proto/test_reserved_enum_lower.proto                      \
-  php/tests/proto/test_reserved_enum_upper.proto                      \
-  php/tests/proto/test_reserved_enum_value_lower.proto                \
-  php/tests/proto/test_reserved_enum_value_upper.proto                \
-  php/tests/proto/test_reserved_message_lower.proto                   \
-  php/tests/proto/test_reserved_message_upper.proto                   \
-  php/tests/proto/test_service.proto                                  \
-  php/tests/proto/test_service_namespace.proto                        \
-  php/tests/test.sh                                                   \
-  php/tests/test_base.php                                             \
-  php/tests/test_util.php                                             \
-  php/tests/undefined_test.php                                        \
-  php/tests/well_known_test.php
-
 python_EXTRA_DIST=                                                           \
   python/MANIFEST.in                                                         \
   python/google/__init__.py                                                  \
@@ -787,7 +549,6 @@
   python/google/protobuf/internal/enum_type_wrapper.py                       \
   python/google/protobuf/internal/factory_test1.proto                        \
   python/google/protobuf/internal/factory_test2.proto                        \
-  python/google/protobuf/internal/file_options_test.proto                    \
   python/google/protobuf/internal/generator_test.py                          \
   python/google/protobuf/internal/import_test_package/__init__.py            \
   python/google/protobuf/internal/import_test_package/inner.proto            \
@@ -804,13 +565,11 @@
   python/google/protobuf/internal/packed_field_test.proto                    \
   python/google/protobuf/internal/proto_builder_test.py                      \
   python/google/protobuf/internal/python_message.py                          \
-  python/google/protobuf/internal/python_protobuf.cc                         \
   python/google/protobuf/internal/reflection_test.py                         \
   python/google/protobuf/internal/service_reflection_test.py                 \
   python/google/protobuf/internal/symbol_database_test.py                    \
   python/google/protobuf/internal/test_bad_identifiers.proto                 \
   python/google/protobuf/internal/test_util.py                               \
-  python/google/protobuf/internal/testing_refleaks.py                        \
   python/google/protobuf/internal/text_encoding_test.py                      \
   python/google/protobuf/internal/text_format_test.py                        \
   python/google/protobuf/internal/type_checkers.py                           \
@@ -824,7 +583,6 @@
   python/google/protobuf/json_format.py                                      \
   python/google/protobuf/message.py                                          \
   python/google/protobuf/message_factory.py                                  \
-  python/google/protobuf/python_protobuf.h                                   \
   python/google/protobuf/proto_builder.py                                    \
   python/google/protobuf/pyext/README                                        \
   python/google/protobuf/pyext/__init__.py                                   \
@@ -843,16 +601,13 @@
   python/google/protobuf/pyext/map_container.h                               \
   python/google/protobuf/pyext/message.cc                                    \
   python/google/protobuf/pyext/message.h                                     \
-  python/google/protobuf/pyext/message_factory.cc                            \
-  python/google/protobuf/pyext/message_factory.h                             \
-  python/google/protobuf/pyext/message_module.cc                             \
   python/google/protobuf/pyext/proto2_api_test.proto                         \
   python/google/protobuf/pyext/python.proto                                  \
+  python/google/protobuf/pyext/python_protobuf.h                             \
   python/google/protobuf/pyext/repeated_composite_container.cc               \
   python/google/protobuf/pyext/repeated_composite_container.h                \
   python/google/protobuf/pyext/repeated_scalar_container.cc                  \
   python/google/protobuf/pyext/repeated_scalar_container.h                   \
-  python/google/protobuf/pyext/safe_numerics.h                               \
   python/google/protobuf/pyext/scoped_pyobject_ptr.h                         \
   python/google/protobuf/reflection.py                                       \
   python/google/protobuf/service.py                                          \
@@ -860,9 +615,7 @@
   python/google/protobuf/symbol_database.py                                  \
   python/google/protobuf/text_encoding.py                                    \
   python/google/protobuf/text_format.py                                      \
-  python/release.sh                                                          \
   python/mox.py                                                              \
-  python/setup.cfg                                                           \
   python/setup.py                                                            \
   python/stubout.py                                                          \
   python/tox.ini                                                             \
@@ -870,18 +623,10 @@
 
 ruby_EXTRA_DIST=                                                             \
   ruby/Gemfile                                                               \
+  ruby/Gemfile.lock                                                          \
   ruby/.gitignore                                                            \
   ruby/README.md                                                             \
   ruby/Rakefile                                                              \
-  ruby/compatibility_tests/v3.0.0/tests/test_import.proto                    \
-  ruby/compatibility_tests/v3.0.0/tests/stress.rb                            \
-  ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb               \
-  ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb               \
-  ruby/compatibility_tests/v3.0.0/tests/generated_code.proto                 \
-  ruby/compatibility_tests/v3.0.0/tests/basic.rb                             \
-  ruby/compatibility_tests/v3.0.0/test.sh                                    \
-  ruby/compatibility_tests/v3.0.0/Rakefile                                   \
-  ruby/compatibility_tests/v3.0.0/README.md                                  \
   ruby/ext/google/protobuf_c/defs.c                                          \
   ruby/ext/google/protobuf_c/encode_decode.c                                 \
   ruby/ext/google/protobuf_c/extconf.rb                                      \
@@ -893,11 +638,9 @@
   ruby/ext/google/protobuf_c/storage.c                                       \
   ruby/ext/google/protobuf_c/upb.c                                           \
   ruby/ext/google/protobuf_c/upb.h                                           \
-  ruby/ext/google/protobuf_c/wrap_memcpy.c                                   \
   ruby/google-protobuf.gemspec                                               \
   ruby/lib/google/protobuf/message_exts.rb                                   \
   ruby/lib/google/protobuf/repeated_field.rb                                 \
-  ruby/lib/google/protobuf/well_known_types.rb                               \
   ruby/lib/google/protobuf.rb                                                \
   ruby/pom.xml                                                               \
   ruby/src/main/java/com/google/protobuf/jruby/RubyBuilder.java              \
@@ -919,114 +662,47 @@
   ruby/src/main/java/google/ProtobufJavaService.java                         \
   ruby/src/main/sentinel.proto                                               \
   ruby/tests/basic.rb                                                        \
-  ruby/tests/encode_decode_test.rb                                           \
-  ruby/tests/gc_test.rb                                                      \
   ruby/tests/repeated_field_test.rb                                          \
   ruby/tests/stress.rb                                                       \
   ruby/tests/generated_code.proto                                            \
-  ruby/tests/test_import.proto                                               \
   ruby/tests/generated_code_test.rb                                          \
-  ruby/tests/well_known_types_test.rb                                        \
   ruby/travis-test.sh
 
-js_EXTRA_DIST=                                                         \
-  js/README.md                                                         \
-  js/binary/arith.js                                                   \
-  js/binary/arith_test.js                                              \
-  js/binary/constants.js                                               \
-  js/binary/decoder.js                                                 \
-  js/binary/decoder_test.js                                            \
-  js/binary/encoder.js                                                 \
-  js/binary/message_test.js                                            \
-  js/binary/proto_test.js                                              \
-  js/binary/reader.js                                                  \
-  js/binary/reader_test.js                                             \
-  js/binary/utils.js                                                   \
-  js/binary/utils_test.js                                              \
-  js/binary/writer.js                                                  \
-  js/binary/writer_test.js                                             \
-  js/commonjs/export.js                                                \
-  js/commonjs/export_asserts.js                                        \
-  js/commonjs/export_testdeps.js                                       \
-  js/commonjs/import_test.js                                           \
-  js/commonjs/jasmine.json                                             \
-  js/commonjs/rewrite_tests_for_commonjs.js                            \
-  js/commonjs/test6/test6.proto                                        \
-  js/commonjs/test7/test7.proto                                        \
-  js/compatibility_tests/v3.0.0/binary/arith_test.js                   \
-  js/compatibility_tests/v3.0.0/binary/decoder_test.js                 \
-  js/compatibility_tests/v3.0.0/binary/proto_test.js                   \
-  js/compatibility_tests/v3.0.0/binary/reader_test.js                  \
-  js/compatibility_tests/v3.0.0/binary/utils_test.js                   \
-  js/compatibility_tests/v3.0.0/binary/writer_test.js                  \
-  js/compatibility_tests/v3.0.0/commonjs/export_asserts.js             \
-  js/compatibility_tests/v3.0.0/commonjs/export_testdeps.js            \
-  js/compatibility_tests/v3.0.0/commonjs/import_test.js                \
-  js/compatibility_tests/v3.0.0/commonjs/jasmine.json                  \
-  js/compatibility_tests/v3.0.0/commonjs/rewrite_tests_for_commonjs.js \
-  js/compatibility_tests/v3.0.0/commonjs/test6/test6.proto             \
-  js/compatibility_tests/v3.0.0/commonjs/test7/test7.proto             \
-  js/compatibility_tests/v3.0.0/data.proto                             \
-  js/compatibility_tests/v3.0.0/debug_test.js                          \
-  js/compatibility_tests/v3.0.0/jasmine1.json                          \
-  js/compatibility_tests/v3.0.0/jasmine2.json                          \
-  js/compatibility_tests/v3.0.0/jasmine3.json                          \
-  js/compatibility_tests/v3.0.0/message_test.js                        \
-  js/compatibility_tests/v3.0.0/proto3_test.js                         \
-  js/compatibility_tests/v3.0.0/proto3_test.proto                      \
-  js/compatibility_tests/v3.0.0/test2.proto                            \
-  js/compatibility_tests/v3.0.0/test3.proto                            \
-  js/compatibility_tests/v3.0.0/test4.proto                            \
-  js/compatibility_tests/v3.0.0/test5.proto                            \
-  js/compatibility_tests/v3.0.0/testbinary.proto                       \
-  js/compatibility_tests/v3.0.0/testempty.proto                        \
-  js/compatibility_tests/v3.0.0/test.proto                             \
-  js/compatibility_tests/v3.0.0/test.sh                                \
-  js/compatibility_tests/v3.1.0/testempty.proto                        \
-  js/compatibility_tests/v3.1.0/testbinary.proto                       \
-  js/compatibility_tests/v3.1.0/test5.proto                            \
-  js/compatibility_tests/v3.1.0/test4.proto                            \
-  js/compatibility_tests/v3.1.0/test3.proto                            \
-  js/compatibility_tests/v3.1.0/test2.proto                            \
-  js/compatibility_tests/v3.1.0/test.proto                             \
-  js/compatibility_tests/v3.1.0/proto3_test.proto                      \
-  js/compatibility_tests/v3.1.0/proto3_test.js                         \
-  js/compatibility_tests/v3.1.0/message_test.js                        \
-  js/compatibility_tests/v3.1.0/maps_test.js                           \
-  js/compatibility_tests/v3.1.0/debug_test.js                          \
-  js/compatibility_tests/v3.1.0/data.proto                             \
-  js/compatibility_tests/v3.1.0/commonjs/test7/test7.proto             \
-  js/compatibility_tests/v3.1.0/commonjs/test6/test6.proto             \
-  js/compatibility_tests/v3.1.0/binary/writer_test.js                  \
-  js/compatibility_tests/v3.1.0/binary/utils_test.js                   \
-  js/compatibility_tests/v3.1.0/binary/reader_test.js                  \
-  js/compatibility_tests/v3.1.0/binary/proto_test.js                   \
-  js/compatibility_tests/v3.1.0/binary/decoder_test.js                 \
-  js/compatibility_tests/v3.1.0/binary/arith_test.js                   \
-  js/data.proto                                                        \
-  js/debug.js                                                          \
-  js/debug_test.js                                                     \
-  js/gulpfile.js                                                       \
-  js/jasmine.json                                                      \
-  js/map.js                                                            \
-  js/maps_test.js                                                      \
-  js/message.js                                                        \
-  js/message_test.js                                                   \
-  js/node_loader.js                                                    \
-  js/package.json                                                      \
-  js/proto3_test.js                                                    \
-  js/proto3_test.proto                                                 \
-  js/test.proto                                                        \
-  js/test2.proto                                                       \
-  js/test3.proto                                                       \
-  js/test4.proto                                                       \
-  js/test5.proto                                                       \
-  js/test8.proto                                                       \
-  js/test_bootstrap.js                                                 \
-  js/testbinary.proto                                                  \
+js_EXTRA_DIST=              \
+  js/README.md              \
+  js/binary/arith.js        \
+  js/binary/arith_test.js   \
+  js/binary/constants.js    \
+  js/binary/decoder.js      \
+  js/binary/decoder_test.js \
+  js/binary/proto_test.js   \
+  js/binary/reader.js       \
+  js/binary/reader_test.js  \
+  js/binary/utils.js        \
+  js/binary/utils_test.js   \
+  js/binary/writer.js       \
+  js/binary/writer_test.js  \
+  js/data.proto             \
+  js/debug.js               \
+  js/debug_test.js          \
+  js/gulpfile.js            \
+  js/jasmine.json           \
+  js/message.js             \
+  js/message_test.js        \
+  js/node_loader.js         \
+  js/package.json           \
+  js/proto3_test.js         \
+  js/proto3_test.proto      \
+  js/test.proto             \
+  js/test2.proto            \
+  js/test3.proto            \
+  js/test4.proto            \
+  js/test5.proto            \
+  js/test_bootstrap.js      \
+  js/testbinary.proto       \
   js/testempty.proto
 
-all_EXTRA_DIST=$(csharp_EXTRA_DIST) $(java_EXTRA_DIST) $(javanano_EXTRA_DIST) $(objectivec_EXTRA_DIST) $(php_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST) $(js_EXTRA_DIST)
+all_EXTRA_DIST=$(csharp_EXTRA_DIST) $(java_EXTRA_DIST) $(javanano_EXTRA_DIST) $(objectivec_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST) $(js_EXTRA_DIST)
 
 EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST)   \
   autogen.sh                             \
@@ -1041,7 +717,6 @@
   WORKSPACE                              \
   cmake/CMakeLists.txt                   \
   cmake/README.md                        \
-  cmake/examples.cmake                   \
   cmake/extract_includes.bat.in          \
   cmake/install.cmake                    \
   cmake/libprotobuf.cmake                \
@@ -1049,40 +724,29 @@
   cmake/libprotoc.cmake                  \
   cmake/protobuf-config-version.cmake.in \
   cmake/protobuf-config.cmake.in         \
-  cmake/protobuf-lite.pc.cmake           \
   cmake/protobuf-module.cmake.in         \
-  cmake/protobuf-options.cmake           \
-  cmake/protobuf.pc.cmake                \
   cmake/protoc.cmake                     \
   cmake/tests.cmake                      \
   editors/README.txt                     \
   editors/proto.vim                      \
   editors/protobuf-mode.el               \
-  examples/AddPerson.java                \
-  examples/BUILD                         \
-  examples/CMakeLists.txt                \
-  examples/ListPeople.java               \
+  examples/README.txt                    \
   examples/Makefile                      \
-  examples/README.md                     \
-  examples/WORKSPACE                     \
+  examples/addressbook.proto             \
   examples/add_person.cc                 \
   examples/add_person.go                 \
-  examples/add_person.py                 \
   examples/add_person_test.go            \
-  examples/addressbook.proto             \
   examples/list_people.cc                \
   examples/list_people.go                \
+  examples/AddPerson.java                \
+  examples/ListPeople.java               \
+  examples/add_person.py                 \
   examples/list_people.py                \
   examples/list_people_test.go           \
   protobuf.bzl                           \
-  python/release/wheel/build_wheel_manylinux.sh  \
-  python/release/wheel/Dockerfile                \
-  python/release/wheel/protobuf_optimized_pip.sh \
-  python/release/wheel/README.md         \
   six.BUILD                              \
   util/python/BUILD
 
-
 # Deletes all the files generated by autogen.sh.
 MAINTAINERCLEANFILES =   \
   aclocal.m4             \
diff --git a/Protobuf.podspec b/Protobuf.podspec
index 24498a2..0bbd06d 100644
--- a/Protobuf.podspec
+++ b/Protobuf.podspec
@@ -5,12 +5,11 @@
 # dependent projects use the :git notation to refer to the library.
 Pod::Spec.new do |s|
   s.name     = 'Protobuf'
-  s.version  = '3.5.2'
+  s.version  = '3.0.0-beta-2'
   s.summary  = 'Protocol Buffers v.3 runtime library for Objective-C.'
   s.homepage = 'https://github.com/google/protobuf'
-  s.license  = '3-Clause BSD License'
+  s.license  = 'New BSD'
   s.authors  = { 'The Protocol Buffers contributors' => 'protobuf@googlegroups.com' }
-  s.cocoapods_version = '>= 1.0'
 
   s.source = { :git => 'https://github.com/google/protobuf.git',
                :tag => "v#{s.version}" }
@@ -18,25 +17,24 @@
   s.source_files = 'objectivec/*.{h,m}',
                    'objectivec/google/protobuf/Any.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Api.pbobjc.{h,m}',
-                   'objectivec/google/protobuf/Duration.pbobjc.{h,m}',
+                   'objectivec/google/protobuf/Duration.pbobjc.h',
                    'objectivec/google/protobuf/Empty.pbobjc.{h,m}',
                    'objectivec/google/protobuf/FieldMask.pbobjc.{h,m}',
                    'objectivec/google/protobuf/SourceContext.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Struct.pbobjc.{h,m}',
-                   'objectivec/google/protobuf/Timestamp.pbobjc.{h,m}',
+                   'objectivec/google/protobuf/Timestamp.pbobjc.h',
                    'objectivec/google/protobuf/Type.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Wrappers.pbobjc.{h,m}'
+  # Timestamp.pbobjc.m and Duration.pbobjc.m are #imported by GPBWellKnownTypes.m. So we can't
+  # compile them (duplicate symbols), but we need them available for the importing:
+  s.preserve_paths = 'objectivec/google/protobuf/Duration.pbobjc.m',
+                     'objectivec/google/protobuf/Timestamp.pbobjc.m'
   # The following would cause duplicate symbol definitions. GPBProtocolBuffers is expected to be
   # left out, as it's an umbrella implementation file.
   s.exclude_files = 'objectivec/GPBProtocolBuffers.m'
+  s.header_mappings_dir = 'objectivec'
 
-  # Set a CPP symbol so the code knows to use framework imports.
-  s.user_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1' }
-  s.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1' }
-
-  s.ios.deployment_target = '7.0'
+  s.ios.deployment_target = '7.1'
   s.osx.deployment_target = '10.9'
-  s.tvos.deployment_target = '9.0'
-  s.watchos.deployment_target = '2.0'
   s.requires_arc = false
 end
diff --git a/README.android b/README.android
index f1e97d9..0f7d5e1 100644
--- a/README.android
+++ b/README.android
@@ -9,6 +9,7 @@
  - Initial changes include support for the micro protobuf compiler and the
    assoicated runtime.
  - https://github.com/google/protobuf/pull/2732: const FieldDescriptorCompare
+ - Add NOLINT to "return *default_instance_;" in cpp_message.cc.
 
 Protocol Buffers are a way of encoding structured data in an efficient
 yet extensible format. Google uses Protocol Buffers for almost all
diff --git a/README.md b/README.md
index 3a4e6ed..ba9c589 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 Protocol Buffers - Google's data interchange format
 ===================================================
 
-[![Build Status](https://travis-ci.org/google/protobuf.svg?branch=master)](https://travis-ci.org/google/protobuf) [![Build status](https://ci.appveyor.com/api/projects/status/73ctee6ua4w2ruin?svg=true)](https://ci.appveyor.com/project/protobuf/protobuf) [![Build Status](https://grpc-testing.appspot.com/buildStatus/icon?job=protobuf_branch)](https://grpc-testing.appspot.com/job/protobuf_branch) [![Build Status](https://grpc-testing.appspot.com/job/protobuf_branch_32/badge/icon)](https://grpc-testing.appspot.com/job/protobuf_branch_32) [![Build Status](http://ci.bazel.io/buildStatus/icon?job=protobuf)](http://ci.bazel.io/job/protobuf/)
+[![Build Status](https://travis-ci.org/google/protobuf.svg?branch=master)](https://travis-ci.org/google/protobuf) [![Build status](https://ci.appveyor.com/api/projects/status/73ctee6ua4w2ruin?svg=true)](https://ci.appveyor.com/project/protobuf/protobuf)
 
 Copyright 2008 Google Inc.
 
@@ -37,7 +37,7 @@
 If you are looking for an old version that is not available in the release
 page, check out the maven repo here:
 
-  [https://repo1.maven.org/maven2/com/google/protobuf/protoc/](https://repo1.maven.org/maven2/com/google/protobuf/protoc/)
+  [http://repo1.maven.org/maven2/com/google/protobuf/protoc/](http://repo1.maven.org/maven2/com/google/protobuf/protoc/)
 
 These pre-built binaries are only provided for released versions. If you want
 to use the github master version at HEAD, or you need to modify protobuf code,
@@ -54,35 +54,24 @@
 language, you can find instructions in the corresponding source directory about
 how to install protobuf runtime for that specific language:
 
-| Language                             | Source                                                      |
-|--------------------------------------|-------------------------------------------------------------|
-| C++ (include C++ runtime and protoc) | [src](src)                                                  |
-| Java                                 | [java](java)                                                |
-| Python                               | [python](python)                                            |
-| Objective-C                          | [objectivec](objectivec)                                    |
-| C#                                   | [csharp](csharp)                                            |
-| JavaNano                             | [javanano](javanano)                                        |
-| JavaScript                           | [js](js)                                                    |
-| Ruby                                 | [ruby](ruby)                                                |
-| Go                                   | [golang/protobuf](https://github.com/golang/protobuf)       |
-| PHP                                  | [php](php)                                                  |
-| Dart                                 | [dart-lang/protobuf](https://github.com/dart-lang/protobuf) |
+| Language                             | Source                                                |
+|--------------------------------------|-------------------------------------------------------|
+| C++ (include C++ runtime and protoc) | [src](src)                                            |
+| Java                                 | [java](java)                                          |
+| Python                               | [python](python)                                      |
+| Objective-C                          | [objectivec](objectivec)                              |
+| C#                                   | [csharp](csharp)                                      |
+| JavaNano                             | [javanano](javanano)                                  |
+| JavaScript                           | [js](js)                                              |
+| Ruby                                 | [ruby](ruby)                                          |
+| Go                                   | [golang/protobuf](https://github.com/golang/protobuf) |
+| PHP                                  | TBD                                                   |
 
-Quick Start
------------
 
-The best way to learn how to use protobuf is to follow the tutorials in our
-developer guide:
-
-https://developers.google.com/protocol-buffers/docs/tutorials
-
-If you want to learn from code examples, take a look at the examples in the
-[examples](examples) directory.
-
-Documentation
--------------
+Usage
+-----
 
 The complete documentation for Protocol Buffers is available via the
 web at:
 
-https://developers.google.com/protocol-buffers/
+    https://developers.google.com/protocol-buffers/
diff --git a/WORKSPACE b/WORKSPACE
index 1066a0e..065dc81 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,17 +1,15 @@
-workspace(name = "com_google_protobuf")
-
-new_git_repository(
-    name = "googletest",
+new_http_archive(
+    name = "gmock_archive",
+    url = "https://googlemock.googlecode.com/files/gmock-1.7.0.zip",
+    sha256 = "26fcbb5925b74ad5fc8c26b0495dfc96353f4d553492eb97e85a8a6d2f43095b",
     build_file = "gmock.BUILD",
-    remote = "https://github.com/google/googletest",
-    tag = "release-1.8.0",
 )
 
 new_http_archive(
     name = "six_archive",
-    build_file = "six.BUILD",
-    sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a",
     url = "https://pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz#md5=34eed507548117b2ab523ab14b2f8b55",
+    sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a",
+    build_file = "six.BUILD",
 )
 
 bind(
@@ -21,12 +19,12 @@
 
 bind(
     name = "gtest",
-    actual = "@googletest//:gtest",
+    actual = "@gmock_archive//:gtest",
 )
 
 bind(
     name = "gtest_main",
-    actual = "@googletest//:gtest_main",
+    actual = "@gmock_archive//:gtest_main",
 )
 
 bind(
@@ -35,8 +33,8 @@
 )
 
 maven_jar(
-    name = "guava_maven",
-    artifact = "com.google.guava:guava:18.0",
+  name = "guava_maven",
+  artifact = "com.google.guava:guava:18.0",
 )
 
 bind(
@@ -45,8 +43,8 @@
 )
 
 maven_jar(
-    name = "gson_maven",
-    artifact = "com.google.code.gson:gson:2.7",
+  name = "gson_maven",
+  artifact = "com.google.code.gson:gson:2.3",
 )
 
 bind(
diff --git a/android/config.h b/android/config.h
index 0f2d562..180a577 100644
--- a/android/config.h
+++ b/android/config.h
@@ -1,10 +1,10 @@
 /* config.h.  Generated from config.h.in by configure.  */
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
-/* the name of <hash_map> */
+/* the name of <hash_set> */
 #define HASH_MAP_CLASS unordered_map
 
-/* the location of <unordered_map> or <hash_map> */
+/* the location of <hash_map> */
 #define HASH_MAP_H <unordered_map>
 
 /* the namespace of hash_map/hash_set */
@@ -13,12 +13,9 @@
 /* the name of <hash_set> */
 #define HASH_SET_CLASS unordered_set
 
-/* the location of <unordered_set> or <hash_set> */
+/* the location of <hash_set> */
 #define HASH_SET_H <unordered_set>
 
-/* define if the compiler supports basic C++11 syntax */
-#define HAVE_CXX11 1
-
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #define HAVE_DLFCN_H 1
 
@@ -28,11 +25,26 @@
 /* Define to 1 if you have the `ftruncate' function. */
 #define HAVE_FTRUNCATE 1
 
+#if defined(ANDROID)
+/*
+ * TODO: Figure out how to use stlport unordered_map and set.
+ * For some reason they don't work when I try to point the
+ * HASH_MAP_H and HASH_SET_H to the stlport files, I get
+ * compile timer errors.
+ */
+
+/* define if the compiler has hash_map */
+#undef HAVE_HASH_MAP
+
+/* define if the compiler has hash_set */
+#undef HAVE_HASH_SET
+#else
 /* define if the compiler has hash_map */
 #define HAVE_HASH_MAP 1
 
 /* define if the compiler has hash_set */
 #define HAVE_HASH_SET 1
+#endif
 
 /* Define to 1 if you have the <inttypes.h> header file. */
 #define HAVE_INTTYPES_H 1
@@ -85,7 +97,8 @@
 /* Enable classes using zlib compression. */
 #define HAVE_ZLIB 1
 
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
 #define LT_OBJDIR ".libs/"
 
 /* Name of package */
@@ -98,16 +111,13 @@
 #define PACKAGE_NAME "Protocol Buffers"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "Protocol Buffers 3.5.2"
+#define PACKAGE_STRING "Protocol Buffers 2.3.0"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "protobuf"
 
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "3.5.2"
+#define PACKAGE_VERSION "2.3.0"
 
 /* Define to necessary symbol if this constant uses a non-standard name on
    your system. */
@@ -116,30 +126,20 @@
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
 
-/* Enable extensions on AIX 3, Interix.  */
+/* Version number of package */
+#define VERSION "2.3.0"
+
+/* Define to 1 if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
 #ifndef _ALL_SOURCE
-# define _ALL_SOURCE 1
+/* # undef _ALL_SOURCE */
 #endif
+
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE 1
 #endif
-/* Enable threading extensions on Solaris.  */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# define _POSIX_PTHREAD_SEMANTICS 1
-#endif
-/* Enable extensions on HP NonStop.  */
-#ifndef _TANDEM_SOURCE
-# define _TANDEM_SOURCE 1
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
-
-
-/* Version number of package */
-#define VERSION "3.5.2"
 
 /* Define to 1 if on MINIX. */
 /* #undef _MINIX */
@@ -150,3 +150,14 @@
 
 /* Define to 1 if you need to in order for `stat' and other things to work. */
 /* #undef _POSIX_SOURCE */
+
+/* Enable extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
diff --git a/appveyor.bat b/appveyor.bat
index ca88b25..9a46b92 100644
--- a/appveyor.bat
+++ b/appveyor.bat
@@ -10,7 +10,7 @@
 echo Building C++
 mkdir build_msvc
 cd build_msvc
-cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% -Dprotobuf_UNICODE=%UNICODE% ../cmake
+cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% ../cmake
 msbuild protobuf.sln /p:Platform=%vcplatform% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" || goto error
 cd %configuration%
 tests.exe || goto error
@@ -19,16 +19,9 @@
 :build_csharp
 echo Building C#
 cd csharp\src
-REM The platform environment variable is implicitly used by msbuild;
-REM we don't want it.
-set platform=
-dotnet restore
-dotnet build -c %configuration% || goto error
-
-echo Testing C#
-dotnet run -c %configuration% -f netcoreapp1.0 -p Google.Protobuf.Test\Google.Protobuf.Test.csproj || goto error
-dotnet run -c %configuration% -f net451 -p Google.Protobuf.Test\Google.Protobuf.Test.csproj || goto error
-
+nuget restore
+msbuild Google.Protobuf.sln /p:Platform="Any CPU" /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" || goto error
+nunit-console Google.Protobuf.Test\bin\%configuration%\Google.Protobuf.Test.dll || goto error
 goto :EOF
 
 :error
diff --git a/appveyor.yml b/appveyor.yml
index 8b440b6..c84ecae 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -11,25 +11,13 @@
   matrix:
     - language: cpp
       BUILD_DLL: ON
-      UNICODE: ON
 
     - language: csharp
-      image: Visual Studio 2017
-
-# Our build scripts run tests automatically; we don't want AppVeyor
-# to try to detect them itself.
-test: off
 
 install:
-  - curl -L -o release-1.7.0.zip https://github.com/google/googlemock/archive/release-1.7.0.zip
-  - 7z x release-1.7.0.zip
-  - del /Q release-1.7.0.zip
-  - rename googlemock-release-1.7.0 gmock
-  - curl -L -o release-1.7.0.zip "https://github.com/google/googletest/archive/release-1.7.0.zip"
-  - 7z x release-1.7.0.zip
-  - del /Q release-1.7.0.zip
-  - rename googletest-release-1.7.0 gtest
-  - move gtest gmock
+  - ps: Start-FileDownload https://googlemock.googlecode.com/files/gmock-1.7.0.zip
+  - 7z x gmock-1.7.0.zip
+  - rename gmock-1.7.0 gmock
 
 before_build:
   - if %platform%==Win32 set generator=Visual Studio 12
diff --git a/autogen.sh b/autogen.sh
index 9560aaf..5b4c29f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -31,17 +31,10 @@
 # directory is set up as an SVN external.
 if test ! -e gmock; then
   echo "Google Mock not present.  Fetching gmock-1.7.0 from the web..."
-  curl $curlopts -L -O https://github.com/google/googlemock/archive/release-1.7.0.zip
-  unzip -q release-1.7.0.zip
-  rm release-1.7.0.zip
-  mv googlemock-release-1.7.0 gmock
-fi
-
-if test ! -e gmock/gtest; then
-  curl $curlopts -L -O https://github.com/google/googletest/archive/release-1.7.0.zip
-  unzip -q release-1.7.0.zip
-  rm release-1.7.0.zip
-  mv googletest-release-1.7.0 gmock/gtest
+  curl $curlopts -O https://googlemock.googlecode.com/files/gmock-1.7.0.zip
+  unzip -q gmock-1.7.0.zip
+  rm gmock-1.7.0.zip
+  mv gmock-1.7.0 gmock
 fi
 
 set -ex
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
index d98eae5..f730afe 100644
--- a/benchmarks/Makefile.am
+++ b/benchmarks/Makefile.am
@@ -16,9 +16,7 @@
   benchmark_messages_proto2.pb.cc                              \
   benchmark_messages_proto2.pb.h
 
-AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG) -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
-
-bin_PROGRAMS = generate-datasets cpp-benchmark
+bin_PROGRAMS = generate-datasets
 
 generate_datasets_LDADD = $(top_srcdir)/src/libprotobuf.la
 generate_datasets_SOURCES = generate_datasets.cc
@@ -32,13 +30,6 @@
 # See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
 generate_datasets-generate_datasets.$(OBJEXT): benchmarks.pb.h
 
-cpp_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp_benchmark_SOURCES = cpp_benchmark.cc
-cpp_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir) -I$(top_srcdir)/third_party/benchmark/include
-nodist_cpp_benchmark_SOURCES =                             \
-  $(benchmarks_protoc_outputs)                                 \
-  $(benchmarks_protoc_outputs_proto2)
-
 $(benchmarks_protoc_outputs): protoc_middleman
 $(benchmarks_protoc_outputs_proto2): protoc_middleman2
 
diff --git a/benchmarks/benchmark_messages_proto2.proto b/benchmarks/benchmark_messages_proto2.proto
index 5908550..01f67a1 100644
--- a/benchmarks/benchmark_messages_proto2.proto
+++ b/benchmarks/benchmark_messages_proto2.proto
@@ -8,8 +8,6 @@
 // This is the default, but we specify it here explicitly.
 option optimize_for = SPEED;
 
-option cc_enable_arenas = true;
-
 message GoogleMessage1 {
   required string field1 = 1;
   optional string field9 = 9;
diff --git a/benchmarks/benchmark_messages_proto3.proto b/benchmarks/benchmark_messages_proto3.proto
index 090b554..32f5869 100644
--- a/benchmarks/benchmark_messages_proto3.proto
+++ b/benchmarks/benchmark_messages_proto3.proto
@@ -8,8 +8,6 @@
 // This is the default, but we specify it here explicitly.
 option optimize_for = SPEED;
 
-option cc_enable_arenas = true;
-
 message GoogleMessage1 {
   string field1 = 1;
   string field9 = 9;
diff --git a/benchmarks/cpp_benchmark.cc b/benchmarks/cpp_benchmark.cc
deleted file mode 100644
index 0e6febc..0000000
--- a/benchmarks/cpp_benchmark.cc
+++ /dev/null
@@ -1,242 +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.
-
-#include <glob.h>
-#include <iostream>
-#include <fstream>
-#include "benchmark/benchmark_api.h"
-#include "benchmarks.pb.h"
-#include "benchmark_messages_proto2.pb.h"
-#include "benchmark_messages_proto3.pb.h"
-
-#define PREFIX "dataset."
-#define SUFFIX ".pb"
-
-using benchmarks::BenchmarkDataset;
-using google::protobuf::Arena;
-using google::protobuf::Descriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::Message;
-using google::protobuf::MessageFactory;
-
-class Fixture : public benchmark::Fixture {
- public:
-  Fixture(const BenchmarkDataset& dataset, const std::string& suffix) {
-    for (int i = 0; i < dataset.payload_size(); i++) {
-      payloads_.push_back(dataset.payload(i));
-    }
-
-    const Descriptor* d =
-        DescriptorPool::generated_pool()->FindMessageTypeByName(
-            dataset.message_name());
-
-    if (!d) {
-      std::cerr << "Couldn't find message named '" << dataset.message_name()
-                << "\n";
-    }
-
-    prototype_ = MessageFactory::generated_factory()->GetPrototype(d);
-    SetName((dataset.name() + suffix).c_str());
-  }
-
- protected:
-  std::vector<std::string> payloads_;
-  const Message* prototype_;
-};
-
-class WrappingCounter {
- public:
-  WrappingCounter(size_t limit) : value_(0), limit_(limit) {}
-
-  size_t Next() {
-    size_t ret = value_;
-    if (++value_ == limit_) {
-      value_ = 0;
-    }
-    return ret;
-  }
-
- private:
-  size_t value_;
-  size_t limit_;
-};
-
-template <class T>
-class ParseNewFixture : public Fixture {
- public:
-  ParseNewFixture(const BenchmarkDataset& dataset)
-      : Fixture(dataset, "_parse_new") {}
-
-  virtual void BenchmarkCase(benchmark::State& state) {
-    WrappingCounter i(payloads_.size());
-    size_t total = 0;
-
-    while (state.KeepRunning()) {
-      T m;
-      const std::string& payload = payloads_[i.Next()];
-      total += payload.size();
-      m.ParseFromString(payload);
-    }
-
-    state.SetBytesProcessed(total);
-  }
-};
-
-template <class T>
-class ParseNewArenaFixture : public Fixture {
- public:
-  ParseNewArenaFixture(const BenchmarkDataset& dataset)
-      : Fixture(dataset, "_parse_newarena") {}
-
-  virtual void BenchmarkCase(benchmark::State& state) {
-    WrappingCounter i(payloads_.size());
-    size_t total = 0;
-
-    while (state.KeepRunning()) {
-      Arena arena;
-      Message* m = Arena::CreateMessage<T>(&arena);
-      const std::string& payload = payloads_[i.Next()];
-      total += payload.size();
-      m->ParseFromString(payload);
-    }
-
-    state.SetBytesProcessed(total);
-  }
-};
-
-template <class T>
-class ParseReuseFixture : public Fixture {
- public:
-  ParseReuseFixture(const BenchmarkDataset& dataset)
-      : Fixture(dataset, "_parse_reuse") {}
-
-  virtual void BenchmarkCase(benchmark::State& state) {
-    T m;
-    WrappingCounter i(payloads_.size());
-    size_t total = 0;
-
-    while (state.KeepRunning()) {
-      const std::string& payload = payloads_[i.Next()];
-      total += payload.size();
-      m.ParseFromString(payload);
-    }
-
-    state.SetBytesProcessed(total);
-  }
-};
-
-template <class T>
-class SerializeFixture : public Fixture {
- public:
-  SerializeFixture(const BenchmarkDataset& dataset)
-      : Fixture(dataset, "_serialize") {
-    for (size_t i = 0; i < payloads_.size(); i++) {
-      message_.push_back(new T);
-      message_.back()->ParseFromString(payloads_[i]);
-    }
-  }
-
-  ~SerializeFixture() {
-    for (size_t i = 0; i < message_.size(); i++) {
-      delete message_[i];
-    }
-  }
-
-  virtual void BenchmarkCase(benchmark::State& state) {
-    size_t total = 0;
-    std::string str;
-    WrappingCounter i(payloads_.size());
-
-    while (state.KeepRunning()) {
-      str.clear();
-      message_[i.Next()]->SerializeToString(&str);
-      total += str.size();
-    }
-
-    state.SetBytesProcessed(total);
-  }
-
- private:
-  std::vector<T*> message_;
-};
-
-std::string ReadFile(const std::string& name) {
-  std::ifstream file(name.c_str());
-  GOOGLE_CHECK(file.is_open()) << "Couldn't find file '" << name <<
-                                  "', please make sure you are running "
-                                  "this command from the benchmarks/ "
-                                  "directory.\n";
-  return std::string((std::istreambuf_iterator<char>(file)),
-                     std::istreambuf_iterator<char>());
-}
-
-template <class T>
-void RegisterBenchmarksForType(const BenchmarkDataset& dataset) {
-  ::benchmark::internal::RegisterBenchmarkInternal(
-      new ParseNewFixture<T>(dataset));
-  ::benchmark::internal::RegisterBenchmarkInternal(
-      new ParseReuseFixture<T>(dataset));
-  ::benchmark::internal::RegisterBenchmarkInternal(
-      new ParseNewArenaFixture<T>(dataset));
-  ::benchmark::internal::RegisterBenchmarkInternal(
-      new SerializeFixture<T>(dataset));
-}
-
-void RegisterBenchmarks(const std::string& dataset_bytes) {
-  BenchmarkDataset dataset;
-  GOOGLE_CHECK(dataset.ParseFromString(dataset_bytes));
-
-  if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
-    RegisterBenchmarksForType<benchmarks::proto3::GoogleMessage1>(dataset);
-  } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
-    RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage1>(dataset);
-  } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
-    RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage2>(dataset);
-  } else {
-    std::cerr << "Unknown message type: " << dataset.message_name();
-    exit(1);
-  }
-}
-
-int main(int argc, char *argv[]) {
-  glob_t glob_result;
-  if (glob("dataset.*.pb", 0, NULL, &glob_result) != 0) {
-    fprintf(stderr, "No dataset files found.\n");
-    return 1;
-  }
-
-  for (size_t i = 0; i < glob_result.gl_pathc; i++) {
-    fprintf(stderr, "Found input dataset: %s\n", glob_result.gl_pathv[i]);
-    RegisterBenchmarks(ReadFile(glob_result.gl_pathv[i]));
-  }
-
-  ::benchmark::Initialize(&argc, argv);
-  ::benchmark::RunSpecifiedBenchmarks();
-}
diff --git a/benchmarks/readme.txt b/benchmarks/readme.txt
index b08b8bc..2c836d0 100644
--- a/benchmarks/readme.txt
+++ b/benchmarks/readme.txt
@@ -22,25 +22,29 @@
    $ javac -d tmp -cp protobuf.jar ProtoBench.java
    
 3) Generate code for the relevant benchmark protocol buffer, e.g.
-   $ protoc --java_out=tmp google_size.proto
+   $ protoc --java_out=tmp google_size.proto google_speed.proto
    
 4) Build the generated code, e.g.
-   $ javac -d tmp -cp protobuf.jar tmp/benchmarks/*.java
+   $ cd tmp
+   $ javac -d . -cp ../protobuf.jar benchmarks/*.java
            
 5) Run the test. Arguments are given in pairs - the first argument
    is the descriptor type; the second is the filename. For example:
-   $ java -cp tmp:protobuf.jar com.google.protocolbuffers.ProtoBench \
-       'benchmarks.GoogleSize$SizeMessage1' google_message1.dat \
-       'benchmarks.GoogleSize$SizeMessage2' google_message2.dat
+   $ java -cp .;../protobuf.jar com.google.protocolbuffers.ProtoBench
+          benchmarks.GoogleSize$SizeMessage1 ../google_message1.dat
+          benchmarks.GoogleSpeed$SpeedMessage1 ../google_message1.dat
+          benchmarks.GoogleSize$SizeMessage2 ../google_message2.dat
+          benchmarks.GoogleSpeed$SpeedMessage2 ../google_message2.dat
           
-6) Wait! Each test runs for around 30 seconds, and there are 8 tests
+6) Wait! Each test runs for around 30 seconds, and there are 6 tests
    per class/data combination. The above command would therefore take
-   about 8 minutes to run.
+   about 12 minutes to run.
 
    
 Benchmarks available
 --------------------
 
 From Google:
-google_size.proto,
-messages google_message1.dat and google_message2.dat.
+google_size.proto and google_speed.proto, messages
+google_message1.dat and google_message2.dat. The proto files are
+equivalent, but optimized differently.
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
index f159f60..f32a0e4 100644
--- a/cmake/CMakeLists.txt
+++ b/cmake/CMakeLists.txt
@@ -1,28 +1,22 @@
 # Minimum CMake required
-cmake_minimum_required(VERSION 2.8.12)
-
-if(protobuf_VERBOSE)
-  message(STATUS "Protocol Buffers Configuring...")
-endif()
-
-# CMake policies
-cmake_policy(SET CMP0022 NEW)
+cmake_minimum_required(VERSION 2.8)
 
 # Project
 project(protobuf C CXX)
 
+# CMake policies
+cmake_policy(SET CMP0022 NEW)
+
 # Options
+option(protobuf_VERBOSE "Enable for verbose output" OFF)
 option(protobuf_BUILD_TESTS "Build tests" ON)
-option(protobuf_BUILD_EXAMPLES "Build examples" OFF)
 if (BUILD_SHARED_LIBS)
   set(protobuf_BUILD_SHARED_LIBS_DEFAULT ON)
 else (BUILD_SHARED_LIBS)
   set(protobuf_BUILD_SHARED_LIBS_DEFAULT OFF)
 endif (BUILD_SHARED_LIBS)
 option(protobuf_BUILD_SHARED_LIBS "Build Shared Libraries" ${protobuf_BUILD_SHARED_LIBS_DEFAULT})
-include(CMakeDependentOption)
-cmake_dependent_option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON
-  "NOT protobuf_BUILD_SHARED_LIBS" OFF)
+option(protobuf_MSVC_STATIC_RUNTIME "Link static runtime libraries" ON)
 if (MSVC)
   set(protobuf_WITH_ZLIB_DEFAULT OFF)
 else (MSVC)
@@ -31,9 +25,6 @@
 option(protobuf_WITH_ZLIB "Build with zlib support" ${protobuf_WITH_ZLIB_DEFAULT})
 set(protobuf_DEBUG_POSTFIX "d"
   CACHE STRING "Default debug postfix")
-mark_as_advanced(protobuf_DEBUG_POSTFIX)
-# User options
-include(protobuf-options.cmake)
 
 # Path to main configure script
 set(protobuf_CONFIGURE_SCRIPT "../configure.ac")
@@ -53,24 +44,17 @@
 string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\3"
     protobuf_CONTACT        "${protobuf_AC_INIT_LINE}")
 # Parse version tweaks
-set(protobuf_VERSION_REGEX "^([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)$")
+set(protobuf_VERSION_REGEX "^([0-9]+)\\.([0-9]+)\\.([0-9]+).*$")
 string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\1"
   protobuf_VERSION_MAJOR "${protobuf_VERSION_STRING}")
 string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\2"
   protobuf_VERSION_MINOR "${protobuf_VERSION_STRING}")
 string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\3"
   protobuf_VERSION_PATCH "${protobuf_VERSION_STRING}")
-string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\4"
-  protobuf_VERSION_PRERELEASE "${protobuf_VERSION_STRING}")
-
 # Package version
 set(protobuf_VERSION
   "${protobuf_VERSION_MAJOR}.${protobuf_VERSION_MINOR}.${protobuf_VERSION_PATCH}")
 
-if(protobuf_VERSION_PRERELEASE)
-  set(protobuf_VERSION "${protobuf_VERSION}-${protobuf_VERSION_PRERELEASE}")
-endif()
-
 if(protobuf_VERBOSE)
   message(STATUS "Configuration script parsing status [")
   message(STATUS "  Description : ${protobuf_DESCRIPTION}")
@@ -86,7 +70,6 @@
   add_definitions(-DHAVE_PTHREAD)
 endif (CMAKE_USE_PTHREADS_INIT)
 
-set(_protobuf_FIND_ZLIB)
 if (protobuf_WITH_ZLIB)
   find_package(ZLIB)
   if (ZLIB_FOUND)
@@ -97,7 +80,6 @@
     # Using imported target if exists
     if (TARGET ZLIB::ZLIB)
       set(ZLIB_LIBRARIES ZLIB::ZLIB)
-      set(_protobuf_FIND_ZLIB "if(NOT ZLIB_FOUND)\n  find_package(ZLIB)\nendif()")
     endif (TARGET ZLIB::ZLIB)
   else (ZLIB_FOUND)
     set(HAVE_ZLIB 0)
@@ -135,31 +117,12 @@
 if (MSVC)
   # Build with multiple processes
   add_definitions(/MP)
-  # MSVC warning suppressions
-  add_definitions(
-    /wd4018 # 'expression' : signed/unsigned mismatch
-    /wd4065 # switch statement contains 'default' but no 'case' labels
-    /wd4146 # unary minus operator applied to unsigned type, result still unsigned
-    /wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
-    /wd4251 # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
-    /wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
-    /wd4305 # 'identifier' : truncation from 'type1' to 'type2'
-    /wd4307 # 'operator' : integral constant overflow
-    /wd4309 # 'conversion' : truncation of constant value
-    /wd4334 # 'operator' : result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
-    /wd4355 # 'this' : used in base member initializer list
-    /wd4506 # no definition for inline function 'function'
-    /wd4800 # 'type' : forcing value to bool 'true' or 'false' (performance warning)
-    /wd4996 # The compiler encountered a deprecated declaration.
-  )
+  add_definitions(/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305)
   # Allow big object
   add_definitions(/bigobj)
   string(REPLACE "/" "\\" PROTOBUF_SOURCE_WIN32_PATH ${protobuf_SOURCE_DIR})
   string(REPLACE "/" "\\" PROTOBUF_BINARY_WIN32_PATH ${protobuf_BINARY_DIR})
   configure_file(extract_includes.bat.in extract_includes.bat)
-  
-  # Suppress linker warnings about files with no symbols defined.
-  set(CMAKE_STATIC_LINKER_FLAGS /ignore:4221)
 endif (MSVC)
 
 get_filename_component(protobuf_source_dir ${protobuf_SOURCE_DIR} PATH)
@@ -178,10 +141,6 @@
   set(LIB_PREFIX)
 endif (MSVC)
 
-if (protobuf_UNICODE)
-  add_definitions(-DUNICODE -D_UNICODE)
-endif (protobuf_UNICODE)
-
 include(libprotobuf-lite.cmake)
 include(libprotobuf.cmake)
 include(libprotoc.cmake)
@@ -192,11 +151,3 @@
 endif (protobuf_BUILD_TESTS)
 
 include(install.cmake)
-
-if (protobuf_BUILD_EXAMPLES)
-  include(examples.cmake)
-endif (protobuf_BUILD_EXAMPLES)
-
-if(protobuf_VERBOSE)
-    message(STATUS "Protocol Buffers Configuring done")
-endif()
diff --git a/cmake/examples.cmake b/cmake/examples.cmake
deleted file mode 100644
index e5cad63..0000000
--- a/cmake/examples.cmake
+++ /dev/null
@@ -1,57 +0,0 @@
-if(protobuf_VERBOSE)
-  message(STATUS "Protocol Buffers Examples Configuring...")
-endif()
-
-get_filename_component(examples_dir "../examples" ABSOLUTE)
-
-if(protobuf_VERBOSE)
-  message(STATUS "Protocol Buffers Examples Configuring done")
-endif()
-include(ExternalProject)
-
-# Internal utility function: Create a custom target representing a build of examples with custom options.
-function(add_examples_build NAME)
-
-  ExternalProject_Add(${NAME}
-    PREFIX ${NAME}
-    SOURCE_DIR "${examples_dir}"
-    BINARY_DIR ${NAME}
-    STAMP_DIR ${NAME}/logs
-    INSTALL_COMMAND "" #Skip
-    LOG_CONFIGURE 1
-    CMAKE_CACHE_ARGS "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
-                     "-Dprotobuf_VERBOSE:BOOL=${protobuf_VERBOSE}"
-                     ${ARGN}
-  )
-  set_property(TARGET ${NAME} PROPERTY FOLDER "Examples")
-  set_property(TARGET ${NAME} PROPERTY EXCLUDE_FROM_ALL TRUE)
-endfunction()
-
-# Add examples as an external project.
-# sub_directory cannot be used because the find_package(protobuf) call would cause failures with redefined targets.
-add_examples_build(examples "-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}")
-add_dependencies(examples libprotobuf protoc)
-
-option(protobuf_BUILD_EXAMPLES_MULTITEST "Build Examples in multiple configurations. Useful for testing." OFF)
-mark_as_advanced(protobuf_BUILD_EXAMPLES_MULTITEST)
-if(protobuf_BUILD_EXAMPLES_MULTITEST)
-  set_property(GLOBAL PROPERTY USE_FOLDERS ON)
-
-  #Build using the legacy compatibility module.
-  add_examples_build(examples-legacy
-    "-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}"
-    "-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
-  )
-  add_dependencies(examples-legacy libprotobuf protoc)
-
-  #Build using the installed library.
-  add_examples_build(examples-installed
-    "-Dprotobuf_DIR:PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}"
-  )
-
-  #Build using the installed library in legacy compatibility mode.
-  add_examples_build(examples-installed-legacy
-    "-Dprotobuf_DIR:PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}"
-    "-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
-  )
-endif()
diff --git a/cmake/extract_includes.bat.in b/cmake/extract_includes.bat.in
index 5212d00..b593e0c 100644
--- a/cmake/extract_includes.bat.in
+++ b/cmake/extract_includes.bat.in
@@ -8,123 +8,117 @@
 mkdir include\google\protobuf\compiler\javanano
 mkdir include\google\protobuf\compiler\js
 mkdir include\google\protobuf\compiler\objectivec
-mkdir include\google\protobuf\compiler\php
 mkdir include\google\protobuf\compiler\python
 mkdir include\google\protobuf\compiler\ruby
 mkdir include\google\protobuf\io
 mkdir include\google\protobuf\stubs
 mkdir include\google\protobuf\util
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.h" include\google\protobuf\any.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.pb.h" include\google\protobuf\any.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\api.pb.h" include\google\protobuf\api.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena.h" include\google\protobuf\arena.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena_impl.h" include\google\protobuf\arena_impl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arenastring.h" include\google\protobuf\arenastring.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\code_generator.h" include\google\protobuf\compiler\code_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\command_line_interface.h" include\google\protobuf\compiler\command_line_interface.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\cpp_generator.h" include\google\protobuf\compiler\cpp\cpp_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_generator.h" include\google\protobuf\compiler\csharp\csharp_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_names.h" include\google\protobuf\compiler\csharp\csharp_names.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\importer.h" include\google\protobuf\compiler\importer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_generator.h" include\google\protobuf\compiler\java\java_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_names.h" include\google\protobuf\compiler\java\java_names.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\javanano\javanano_generator.h" include\google\protobuf\compiler\javanano\javanano_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\js\js_generator.h" include\google\protobuf\compiler\js\js_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\js\well_known_types_embed.h" include\google\protobuf\compiler\js\well_known_types_embed.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_generator.h" include\google\protobuf\compiler\objectivec\objectivec_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_helpers.h" include\google\protobuf\compiler\objectivec\objectivec_helpers.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\parser.h" include\google\protobuf\compiler\parser.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\php\php_generator.h" include\google\protobuf\compiler\php\php_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.h" include\google\protobuf\compiler\plugin.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.pb.h" include\google\protobuf\compiler\plugin.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\python_generator.h" include\google\protobuf\compiler\python\python_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\ruby\ruby_generator.h" include\google\protobuf\compiler\ruby\ruby_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.h" include\google\protobuf\descriptor.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.pb.h" include\google\protobuf\descriptor.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor_database.h" include\google\protobuf\descriptor_database.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\duration.pb.h" include\google\protobuf\duration.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\dynamic_message.h" include\google\protobuf\dynamic_message.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\empty.pb.h" include\google\protobuf\empty.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\extension_set.h" include\google\protobuf\extension_set.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_mask.pb.h" include\google\protobuf\field_mask.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_reflection.h" include\google\protobuf\generated_enum_reflection.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_util.h" include\google\protobuf\generated_enum_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_reflection.h" include\google\protobuf\generated_message_reflection.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_table_driven.h" include\google\protobuf\generated_message_table_driven.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_util.h" include\google\protobuf\generated_message_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\has_bits.h" include\google\protobuf\has_bits.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\coded_stream.h" include\google\protobuf\io\coded_stream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\gzip_stream.h" include\google\protobuf\io\gzip_stream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\printer.h" include\google\protobuf\io\printer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\strtod.h" include\google\protobuf\io\strtod.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\tokenizer.h" include\google\protobuf\io\tokenizer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream.h" include\google\protobuf\io\zero_copy_stream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl.h" include\google\protobuf\io\zero_copy_stream_impl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl_lite.h" include\google\protobuf\io\zero_copy_stream_impl_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map.h" include\google\protobuf\map.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry.h" include\google\protobuf\map_entry.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry_lite.h" include\google\protobuf\map_entry_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field.h" include\google\protobuf\map_field.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_inl.h" include\google\protobuf\map_field_inl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_lite.h" include\google\protobuf\map_field_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_type_handler.h" include\google\protobuf\map_type_handler.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message.h" include\google\protobuf\message.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message_lite.h" include\google\protobuf\message_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata.h" include\google\protobuf\metadata.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata_lite.h" include\google\protobuf\metadata_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection.h" include\google\protobuf\reflection.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection_ops.h" include\google\protobuf\reflection_ops.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field.h" include\google\protobuf\repeated_field.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\service.h" include\google\protobuf\service.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\source_context.pb.h" include\google\protobuf\source_context.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\struct.pb.h" include\google\protobuf\struct.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomic_sequence_num.h" include\google\protobuf\stubs\atomic_sequence_num.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops.h" include\google\protobuf\stubs\atomicops.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm64_gcc.h" include\google\protobuf\stubs\atomicops_internals_arm64_gcc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_gcc.h" include\google\protobuf\stubs\atomicops_internals_arm_gcc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_qnx.h" include\google\protobuf\stubs\atomicops_internals_arm_qnx.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_generic_c11_atomic.h" include\google\protobuf\stubs\atomicops_internals_generic_c11_atomic.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_generic_gcc.h" include\google\protobuf\stubs\atomicops_internals_generic_gcc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_mips_gcc.h" include\google\protobuf\stubs\atomicops_internals_mips_gcc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_power.h" include\google\protobuf\stubs\atomicops_internals_power.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_ppc_gcc.h" include\google\protobuf\stubs\atomicops_internals_ppc_gcc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_solaris.h" include\google\protobuf\stubs\atomicops_internals_solaris.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_tsan.h" include\google\protobuf\stubs\atomicops_internals_tsan.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_gcc.h" include\google\protobuf\stubs\atomicops_internals_x86_gcc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_msvc.h" include\google\protobuf\stubs\atomicops_internals_x86_msvc.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\bytestream.h" include\google\protobuf\stubs\bytestream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\callback.h" include\google\protobuf\stubs\callback.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\casts.h" include\google\protobuf\stubs\casts.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\common.h" include\google\protobuf\stubs\common.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\fastmem.h" include\google\protobuf\stubs\fastmem.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\hash.h" include\google\protobuf\stubs\hash.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\logging.h" include\google\protobuf\stubs\logging.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\macros.h" include\google\protobuf\stubs\macros.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\mutex.h" include\google\protobuf\stubs\mutex.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\once.h" include\google\protobuf\stubs\once.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\platform_macros.h" include\google\protobuf\stubs\platform_macros.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\port.h" include\google\protobuf\stubs\port.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\scoped_ptr.h" include\google\protobuf\stubs\scoped_ptr.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\shared_ptr.h" include\google\protobuf\stubs\shared_ptr.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\singleton.h" include\google\protobuf\stubs\singleton.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\status.h" include\google\protobuf\stubs\status.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stl_util.h" include\google\protobuf\stubs\stl_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stringpiece.h" include\google\protobuf\stubs\stringpiece.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\template_util.h" include\google\protobuf\stubs\template_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\type_traits.h" include\google\protobuf\stubs\type_traits.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\text_format.h" include\google\protobuf\text_format.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\timestamp.pb.h" include\google\protobuf\timestamp.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\type.pb.h" include\google\protobuf\type.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\unknown_field_set.h" include\google\protobuf\unknown_field_set.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\delimited_message_util.h" include\google\protobuf\util\delimited_message_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_comparator.h" include\google\protobuf\util\field_comparator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_mask_util.h" include\google\protobuf\util\field_mask_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\json_util.h" include\google\protobuf\util\json_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\message_differencer.h" include\google\protobuf\util\message_differencer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\time_util.h" include\google\protobuf\util\time_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver.h" include\google\protobuf\util\type_resolver.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver_util.h" include\google\protobuf\util\type_resolver_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format.h" include\google\protobuf\wire_format.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite.h" include\google\protobuf\wire_format_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite_inl.h" include\google\protobuf\wire_format_lite_inl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wrappers.pb.h" include\google\protobuf\wrappers.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.h include\google\protobuf\any.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.pb.h include\google\protobuf\any.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\api.pb.h include\google\protobuf\api.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena.h include\google\protobuf\arena.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arenastring.h include\google\protobuf\arenastring.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\code_generator.h include\google\protobuf\compiler\code_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\command_line_interface.h include\google\protobuf\compiler\command_line_interface.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\cpp_generator.h include\google\protobuf\compiler\cpp\cpp_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_generator.h include\google\protobuf\compiler\csharp\csharp_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_names.h include\google\protobuf\compiler\csharp\csharp_names.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\importer.h include\google\protobuf\compiler\importer.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_generator.h include\google\protobuf\compiler\java\java_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_names.h include\google\protobuf\compiler\java\java_names.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\javanano\javanano_generator.h include\google\protobuf\compiler\javanano\javanano_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\js\js_generator.h include\google\protobuf\compiler\js\js_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_generator.h include\google\protobuf\compiler\objectivec\objectivec_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_helpers.h include\google\protobuf\compiler\objectivec\objectivec_helpers.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\parser.h include\google\protobuf\compiler\parser.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.h include\google\protobuf\compiler\plugin.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.pb.h include\google\protobuf\compiler\plugin.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\python_generator.h include\google\protobuf\compiler\python\python_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\ruby\ruby_generator.h include\google\protobuf\compiler\ruby\ruby_generator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.h include\google\protobuf\descriptor.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.pb.h include\google\protobuf\descriptor.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor_database.h include\google\protobuf\descriptor_database.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\duration.pb.h include\google\protobuf\duration.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\dynamic_message.h include\google\protobuf\dynamic_message.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\empty.pb.h include\google\protobuf\empty.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\extension_set.h include\google\protobuf\extension_set.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_mask.pb.h include\google\protobuf\field_mask.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_reflection.h include\google\protobuf\generated_enum_reflection.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_util.h include\google\protobuf\generated_enum_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_reflection.h include\google\protobuf\generated_message_reflection.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_util.h include\google\protobuf\generated_message_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\coded_stream.h include\google\protobuf\io\coded_stream.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\gzip_stream.h include\google\protobuf\io\gzip_stream.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\printer.h include\google\protobuf\io\printer.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\strtod.h include\google\protobuf\io\strtod.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\tokenizer.h include\google\protobuf\io\tokenizer.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream.h include\google\protobuf\io\zero_copy_stream.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl.h include\google\protobuf\io\zero_copy_stream_impl.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl_lite.h include\google\protobuf\io\zero_copy_stream_impl_lite.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map.h include\google\protobuf\map.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry.h include\google\protobuf\map_entry.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry_lite.h include\google\protobuf\map_entry_lite.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field.h include\google\protobuf\map_field.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_inl.h include\google\protobuf\map_field_inl.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_lite.h include\google\protobuf\map_field_lite.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_type_handler.h include\google\protobuf\map_type_handler.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message.h include\google\protobuf\message.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message_lite.h include\google\protobuf\message_lite.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata.h include\google\protobuf\metadata.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection.h include\google\protobuf\reflection.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection_ops.h include\google\protobuf\reflection_ops.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field.h include\google\protobuf\repeated_field.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field_reflection.h include\google\protobuf\repeated_field_reflection.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\service.h include\google\protobuf\service.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\source_context.pb.h include\google\protobuf\source_context.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\struct.pb.h include\google\protobuf\struct.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomic_sequence_num.h include\google\protobuf\stubs\atomic_sequence_num.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops.h include\google\protobuf\stubs\atomicops.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm64_gcc.h include\google\protobuf\stubs\atomicops_internals_arm64_gcc.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_gcc.h include\google\protobuf\stubs\atomicops_internals_arm_gcc.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_qnx.h include\google\protobuf\stubs\atomicops_internals_arm_qnx.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_atomicword_compat.h include\google\protobuf\stubs\atomicops_internals_atomicword_compat.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_generic_gcc.h include\google\protobuf\stubs\atomicops_internals_generic_gcc.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_macosx.h include\google\protobuf\stubs\atomicops_internals_macosx.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_mips_gcc.h include\google\protobuf\stubs\atomicops_internals_mips_gcc.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_pnacl.h include\google\protobuf\stubs\atomicops_internals_pnacl.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_power.h include\google\protobuf\stubs\atomicops_internals_power.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_solaris.h include\google\protobuf\stubs\atomicops_internals_solaris.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_tsan.h include\google\protobuf\stubs\atomicops_internals_tsan.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_gcc.h include\google\protobuf\stubs\atomicops_internals_x86_gcc.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_msvc.h include\google\protobuf\stubs\atomicops_internals_x86_msvc.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\bytestream.h include\google\protobuf\stubs\bytestream.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\callback.h include\google\protobuf\stubs\callback.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\casts.h include\google\protobuf\stubs\casts.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\common.h include\google\protobuf\stubs\common.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\fastmem.h include\google\protobuf\stubs\fastmem.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\hash.h include\google\protobuf\stubs\hash.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\logging.h include\google\protobuf\stubs\logging.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\macros.h include\google\protobuf\stubs\macros.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\mutex.h include\google\protobuf\stubs\mutex.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\once.h include\google\protobuf\stubs\once.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\platform_macros.h include\google\protobuf\stubs\platform_macros.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\port.h include\google\protobuf\stubs\port.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\scoped_ptr.h include\google\protobuf\stubs\scoped_ptr.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\shared_ptr.h include\google\protobuf\stubs\shared_ptr.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\singleton.h include\google\protobuf\stubs\singleton.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\status.h include\google\protobuf\stubs\status.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stl_util.h include\google\protobuf\stubs\stl_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stringpiece.h include\google\protobuf\stubs\stringpiece.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\template_util.h include\google\protobuf\stubs\template_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\type_traits.h include\google\protobuf\stubs\type_traits.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\text_format.h include\google\protobuf\text_format.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\timestamp.pb.h include\google\protobuf\timestamp.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\type.pb.h include\google\protobuf\type.pb.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\unknown_field_set.h include\google\protobuf\unknown_field_set.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_comparator.h include\google\protobuf\util\field_comparator.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_mask_util.h include\google\protobuf\util\field_mask_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\json_util.h include\google\protobuf\util\json_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\message_differencer.h include\google\protobuf\util\message_differencer.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\time_util.h include\google\protobuf\util\time_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver.h include\google\protobuf\util\type_resolver.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver_util.h include\google\protobuf\util\type_resolver_util.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format.h include\google\protobuf\wire_format.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite.h include\google\protobuf\wire_format_lite.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite_inl.h include\google\protobuf\wire_format_lite_inl.h
+copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wrappers.pb.h include\google\protobuf\wrappers.pb.h
diff --git a/cmake/install.cmake b/cmake/install.cmake
index 441bf55..dbb4265 100644
--- a/cmake/install.cmake
+++ b/cmake/install.cmake
@@ -1,17 +1,11 @@
 include(GNUInstallDirs)
 
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/protobuf.pc.cmake
-               ${CMAKE_CURRENT_BINARY_DIR}/protobuf.pc @ONLY)
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/protobuf-lite.pc.cmake
-               ${CMAKE_CURRENT_BINARY_DIR}/protobuf-lite.pc @ONLY)
-
 foreach(_library
   libprotobuf-lite
   libprotobuf
   libprotoc)
   set_property(TARGET ${_library}
     PROPERTY INTERFACE_INCLUDE_DIRECTORIES
-    $<BUILD_INTERFACE:${protobuf_source_dir}/src>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
   install(TARGETS ${_library} EXPORT protobuf-targets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${_library}
@@ -22,28 +16,34 @@
 install(TARGETS protoc EXPORT protobuf-targets
   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT protoc)
 
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/protobuf.pc ${CMAKE_CURRENT_BINARY_DIR}/protobuf-lite.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
-
-file(STRINGS extract_includes.bat.in _extract_strings
-  REGEX "^copy")
-foreach(_extract_string ${_extract_strings})
-  string(REGEX REPLACE "^.* .+ include\\\\(.+)$" "\\1"
-    _header ${_extract_string})
-  string(REPLACE "\\" "/" _header ${_header})
-  get_filename_component(_extract_from "${protobuf_SOURCE_DIR}/../src/${_header}" ABSOLUTE)
-  get_filename_component(_extract_name ${_header} NAME)
-  get_filename_component(_extract_to "${CMAKE_INSTALL_INCLUDEDIR}/${_header}" PATH)
-  if(EXISTS "${_extract_from}")
-    install(FILES "${_extract_from}"
-      DESTINATION "${_extract_to}"
-      COMPONENT protobuf-headers
-      RENAME "${_extract_name}")
-  else()
-    message(AUTHOR_WARNING "The file \"${_extract_from}\" is listed in "
-      "\"${protobuf_SOURCE_DIR}/cmake/extract_includes.bat.in\" "
-      "but there not exists. The file will not be installed.")
-  endif()
-endforeach()
+if(TRUE)
+  file(STRINGS extract_includes.bat.in _extract_strings
+    REGEX "^copy")
+  foreach(_extract_string ${_extract_strings})
+    string(REPLACE "copy \${PROTOBUF_SOURCE_WIN32_PATH}\\" ""
+      _extract_string ${_extract_string})
+    string(REPLACE "\\" "/" _extract_string ${_extract_string})
+    string(REGEX MATCH "^[^ ]+"
+      _extract_from ${_extract_string})
+    string(REGEX REPLACE "^${_extract_from} ([^$]+)" "\\1"
+      _extract_to ${_extract_string})
+    get_filename_component(_extract_from "${protobuf_SOURCE_DIR}/${_extract_from}" ABSOLUTE)
+    get_filename_component(_extract_name ${_extract_to} NAME)
+    get_filename_component(_extract_to ${_extract_to} PATH)
+    string(REPLACE "include/" "${CMAKE_INSTALL_INCLUDEDIR}/"
+      _extract_to "${_extract_to}")
+    if(EXISTS "${_extract_from}")
+      install(FILES "${_extract_from}"
+        DESTINATION "${_extract_to}"
+        COMPONENT protobuf-headers
+        RENAME "${_extract_name}")
+    else()
+      message(AUTHOR_WARNING "The file \"${_extract_from}\" is listed in "
+        "\"${protobuf_SOURCE_DIR}/cmake/extract_includes.bat.in\" "
+        "but there not exists. The file will not be installed.")
+    endif()
+  endforeach()
+endif()
 
 # Internal function for parsing auto tools scripts
 function(_protobuf_auto_list FILE_NAME VARIABLE)
@@ -82,43 +82,22 @@
   endif()
 endforeach()
 
-# Install configuration
-set(_cmakedir_desc "Directory relative to CMAKE_INSTALL to install the cmake configuration files")
-if(NOT MSVC)
-  set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/protobuf" CACHE STRING "${_cmakedir_desc}")
-else()
-  set(CMAKE_INSTALL_CMAKEDIR "cmake" CACHE STRING "${_cmakedir_desc}")
-endif()
-mark_as_advanced(CMAKE_INSTALL_CMAKEDIR)
-
-configure_file(protobuf-config.cmake.in
-  ${CMAKE_INSTALL_CMAKEDIR}/protobuf-config.cmake @ONLY)
-configure_file(protobuf-config-version.cmake.in
-  ${CMAKE_INSTALL_CMAKEDIR}/protobuf-config-version.cmake @ONLY)
-configure_file(protobuf-module.cmake.in
-  ${CMAKE_INSTALL_CMAKEDIR}/protobuf-module.cmake @ONLY)
-configure_file(protobuf-options.cmake
-  ${CMAKE_INSTALL_CMAKEDIR}/protobuf-options.cmake @ONLY)
-
-# Allows the build directory to be used as a find directory.
-export(TARGETS libprotobuf-lite libprotobuf libprotoc protoc
-  NAMESPACE protobuf::
-  FILE ${CMAKE_INSTALL_CMAKEDIR}/protobuf-targets.cmake
-)
+# Export configuration
 
 install(EXPORT protobuf-targets
-  DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
-  NAMESPACE protobuf::
+  DESTINATION "lib/cmake/protobuf"
   COMPONENT protobuf-export)
 
-install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/
-  DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
-  COMPONENT protobuf-export
-  PATTERN protobuf-targets.cmake EXCLUDE
-)
+configure_file(protobuf-config.cmake.in
+  protobuf-config.cmake @ONLY)
+configure_file(protobuf-config-version.cmake.in
+  protobuf-config-version.cmake @ONLY)
+configure_file(protobuf-module.cmake.in
+  protobuf-module.cmake @ONLY)
 
-option(protobuf_INSTALL_EXAMPLES "Install the examples folder" OFF)
-if(protobuf_INSTALL_EXAMPLES)
-  install(DIRECTORY ../examples/ DESTINATION examples
-    COMPONENT protobuf-examples)
-endif()
+install(FILES
+  "${protobuf_BINARY_DIR}/protobuf-config.cmake"
+  "${protobuf_BINARY_DIR}/protobuf-config-version.cmake"
+  "${protobuf_BINARY_DIR}/protobuf-module.cmake"
+  DESTINATION "lib/cmake/protobuf"
+  COMPONENT protobuf-export)
diff --git a/cmake/libprotobuf-lite.cmake b/cmake/libprotobuf-lite.cmake
index 9e1fab0..036b051 100644
--- a/cmake/libprotobuf-lite.cmake
+++ b/cmake/libprotobuf-lite.cmake
@@ -2,7 +2,6 @@
   ${protobuf_source_dir}/src/google/protobuf/arena.cc
   ${protobuf_source_dir}/src/google/protobuf/arenastring.cc
   ${protobuf_source_dir}/src/google/protobuf/extension_set.cc
-  ${protobuf_source_dir}/src/google/protobuf/generated_message_table_driven_lite.cc
   ${protobuf_source_dir}/src/google/protobuf/generated_message_util.cc
   ${protobuf_source_dir}/src/google/protobuf/io/coded_stream.cc
   ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream.cc
@@ -14,7 +13,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/once.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/status.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/statusor.cc
@@ -26,32 +24,8 @@
   ${protobuf_source_dir}/src/google/protobuf/wire_format_lite.cc
 )
 
-set(libprotobuf_lite_includes
-  ${protobuf_source_dir}/src/google/protobuf/arena.h
-  ${protobuf_source_dir}/src/google/protobuf/arenastring.h
-  ${protobuf_source_dir}/src/google/protobuf/extension_set.h
-  ${protobuf_source_dir}/src/google/protobuf/generated_message_util.h
-  ${protobuf_source_dir}/src/google/protobuf/io/coded_stream.h
-  ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream.h
-  ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream_impl_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/message_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/repeated_field.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/bytestream.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/common.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/int128.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/once.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/status.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/statusor.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/stringpiece.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/stringprintf.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/strutil.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/time.h
-  ${protobuf_source_dir}/src/google/protobuf/wire_format_lite.h
-)
-
 add_library(libprotobuf-lite ${protobuf_SHARED_OR_STATIC}
-  ${libprotobuf_lite_files} ${libprotobuf_lite_includes})
+  ${libprotobuf_lite_files})
 target_link_libraries(libprotobuf-lite ${CMAKE_THREAD_LIBS_INIT})
 target_include_directories(libprotobuf-lite PUBLIC ${protobuf_source_dir}/src)
 if(MSVC AND protobuf_BUILD_SHARED_LIBS)
diff --git a/cmake/libprotobuf.cmake b/cmake/libprotobuf.cmake
index 72db915..8930c1c 100644
--- a/cmake/libprotobuf.cmake
+++ b/cmake/libprotobuf.cmake
@@ -13,7 +13,6 @@
   ${protobuf_source_dir}/src/google/protobuf/extension_set_heavy.cc
   ${protobuf_source_dir}/src/google/protobuf/field_mask.pb.cc
   ${protobuf_source_dir}/src/google/protobuf/generated_message_reflection.cc
-  ${protobuf_source_dir}/src/google/protobuf/generated_message_table_driven.cc
   ${protobuf_source_dir}/src/google/protobuf/io/gzip_stream.cc
   ${protobuf_source_dir}/src/google/protobuf/io/printer.cc
   ${protobuf_source_dir}/src/google/protobuf/io/strtod.cc
@@ -31,7 +30,6 @@
   ${protobuf_source_dir}/src/google/protobuf/timestamp.pb.cc
   ${protobuf_source_dir}/src/google/protobuf/type.pb.cc
   ${protobuf_source_dir}/src/google/protobuf/unknown_field_set.cc
-  ${protobuf_source_dir}/src/google/protobuf/util/delimited_message_util.cc
   ${protobuf_source_dir}/src/google/protobuf/util/field_comparator.cc
   ${protobuf_source_dir}/src/google/protobuf/util/field_mask_util.cc
   ${protobuf_source_dir}/src/google/protobuf/util/internal/datapiece.cc
@@ -56,68 +54,9 @@
   ${protobuf_source_dir}/src/google/protobuf/wrappers.pb.cc
 )
 
-set(libprotobuf_includes
-  ${protobuf_source_dir}/src/google/protobuf/any.h
-  ${protobuf_source_dir}/src/google/protobuf/any.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/api.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/importer.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/parser.h
-  ${protobuf_source_dir}/src/google/protobuf/descriptor.h
-  ${protobuf_source_dir}/src/google/protobuf/descriptor.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/descriptor_database.h
-  ${protobuf_source_dir}/src/google/protobuf/duration.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/dynamic_message.h
-  ${protobuf_source_dir}/src/google/protobuf/empty.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/field_mask.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/generated_message_reflection.h
-  ${protobuf_source_dir}/src/google/protobuf/io/gzip_stream.h
-  ${protobuf_source_dir}/src/google/protobuf/io/printer.h
-  ${protobuf_source_dir}/src/google/protobuf/io/strtod.h
-  ${protobuf_source_dir}/src/google/protobuf/io/tokenizer.h
-  ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream_impl.h
-  ${protobuf_source_dir}/src/google/protobuf/map_field.h
-  ${protobuf_source_dir}/src/google/protobuf/message.h
-  ${protobuf_source_dir}/src/google/protobuf/reflection_ops.h
-  ${protobuf_source_dir}/src/google/protobuf/service.h
-  ${protobuf_source_dir}/src/google/protobuf/source_context.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/struct.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/mathlimits.h
-  ${protobuf_source_dir}/src/google/protobuf/stubs/substitute.h
-  ${protobuf_source_dir}/src/google/protobuf/text_format.h
-  ${protobuf_source_dir}/src/google/protobuf/timestamp.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/type.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/unknown_field_set.h
-  ${protobuf_source_dir}/src/google/protobuf/util/delimited_message_util.h
-  ${protobuf_source_dir}/src/google/protobuf/util/field_comparator.h
-  ${protobuf_source_dir}/src/google/protobuf/util/field_mask_util.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/datapiece.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/default_value_objectwriter.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/error_listener.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/field_mask_utility.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/json_escaping.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/json_objectwriter.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/json_stream_parser.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/object_writer.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/proto_writer.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/protostream_objectsource.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/protostream_objectwriter.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/type_info.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/type_info_test_helper.h
-  ${protobuf_source_dir}/src/google/protobuf/util/internal/utility.h
-  ${protobuf_source_dir}/src/google/protobuf/util/json_util.h
-  ${protobuf_source_dir}/src/google/protobuf/util/message_differencer.h
-  ${protobuf_source_dir}/src/google/protobuf/util/time_util.h
-  ${protobuf_source_dir}/src/google/protobuf/util/type_resolver_util.h
-  ${protobuf_source_dir}/src/google/protobuf/wire_format.h
-  ${protobuf_source_dir}/src/google/protobuf/wrappers.pb.h
-)
-
 add_library(libprotobuf ${protobuf_SHARED_OR_STATIC}
-  ${libprotobuf_lite_files} ${libprotobuf_files} ${libprotobuf_includes})
-target_link_libraries(libprotobuf ${CMAKE_THREAD_LIBS_INIT})
-if(protobuf_WITH_ZLIB)
-    target_link_libraries(libprotobuf ${ZLIB_LIBRARIES})
-endif()
+  ${libprotobuf_lite_files} ${libprotobuf_files})
+target_link_libraries(libprotobuf ${CMAKE_THREAD_LIBS_INIT} ${ZLIB_LIBRARIES})
 target_include_directories(libprotobuf PUBLIC ${protobuf_source_dir}/src)
 if(MSVC AND protobuf_BUILD_SHARED_LIBS)
   target_compile_definitions(libprotobuf
diff --git a/cmake/libprotoc.cmake b/cmake/libprotoc.cmake
index 107c1c5..8df8986 100644
--- a/cmake/libprotoc.cmake
+++ b/cmake/libprotoc.cmake
@@ -11,7 +11,6 @@
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_map_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_message.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_message_field.cc
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_service.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_string_field.cc
@@ -73,7 +72,6 @@
   ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_message_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/js/js_generator.cc
-  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
@@ -86,7 +84,6 @@
   ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
-  ${protobuf_source_dir}/src/google/protobuf/compiler/php/php_generator.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/plugin.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/plugin.pb.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/python/python_generator.cc
@@ -95,128 +92,8 @@
   ${protobuf_source_dir}/src/google/protobuf/compiler/zip_writer.cc
 )
 
-set(libprotoc_headers
-  ${protobuf_source_dir}/src/google/protobuf/compiler/code_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/command_line_interface.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/importer.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/mock_code_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/package_info.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/parser.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/plugin.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/plugin.pb.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/subprocess.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/zip_writer.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_enum.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_enum_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_extension.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_file.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_helpers.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_map_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_message.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_options.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_primitive_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_service.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_string_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_unittest.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_doc_comment.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_enum.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_enum_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_field_base.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_helpers.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_map_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_message.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_names.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_options.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_reflection_class.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_context.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_doc_comment.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_enum.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_enum_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_enum_field_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_enum_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_extension.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_extension_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_file.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_generator_factory.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_helpers.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_lazy_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_lazy_message_field_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_map_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_map_field_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_message.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_message_builder.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_message_builder_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_message_field_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_message_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_names.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_name_resolver.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_options.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_primitive_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_primitive_field_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_service.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_shared_code_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_string_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_string_field_lite.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_enum.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_enum_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_extension.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_file.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_helpers.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_map_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_message.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_params.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_primitive_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/js/js_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_enum.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_extension.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_file.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_message.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/php/php_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/python/python_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/ruby/ruby_generator.h
-  ${protobuf_source_dir}/src/google/protobuf/compiler/plugin.pb.h
-)
-
-set(js_well_known_types_sources
-  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/any.js
-  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/struct.js
-  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/timestamp.js
-)
-add_executable(js_embed ${protobuf_source_dir}/src/google/protobuf/compiler/js/embed.cc)
-add_custom_command(
-  OUTPUT ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
-  DEPENDS js_embed ${js_well_known_types_sources}
-  COMMAND js_embed ${js_well_known_types_sources} > ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
-)
-
 add_library(libprotoc ${protobuf_SHARED_OR_STATIC}
-  ${libprotoc_files} ${libprotoc_headers})
+  ${libprotoc_files})
 target_link_libraries(libprotoc libprotobuf)
 if(MSVC AND protobuf_BUILD_SHARED_LIBS)
   target_compile_definitions(libprotoc
diff --git a/cmake/protobuf-config-version.cmake.in b/cmake/protobuf-config-version.cmake.in
index 3fa0176..1f171c6 100644
--- a/cmake/protobuf-config-version.cmake.in
+++ b/cmake/protobuf-config-version.cmake.in
@@ -1,60 +1 @@
-set(PACKAGE_VERSION "@protobuf_VERSION@")
-set(${PACKAGE_FIND_NAME}_VERSION_PRERELEASE "@protobuf_VERSION_PRERELEASE@" PARENT_SCOPE)
-
-# Prerelease versions cannot be passed in directly via the find_package command,
-# so we allow users to specify it in a variable
-if(NOT DEFINED "${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE")
-  set("${${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE}" "")
-else()
-  set(PACKAGE_FIND_VERSION ${PACKAGE_FIND_VERSION}-${${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE})
-endif()
-set(PACKAGE_FIND_VERSION_PRERELEASE "${${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE}")
-
-# VERSION_EQUAL ignores the prerelease strings, so we use STREQUAL.
-if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
-  set(PACKAGE_VERSION_EXACT TRUE)
-endif()
-
-set(PACKAGE_VERSION_COMPATIBLE TRUE) #Assume true until shown otherwise
-
-if(PACKAGE_FIND_VERSION) #Only perform version checks if one is given
-  if(NOT PACKAGE_FIND_VERSION_MAJOR EQUAL "@protobuf_VERSION_MAJOR@")
-    set(PACKAGE_VERSION_COMPATIBLE FALSE)
-  elseif(PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
-    set(PACKAGE_VERSION_COMPATIBLE FALSE)
-  elseif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
-    # Do not match prerelease versions to non-prerelease version requests.
-      if(NOT "@protobuf_VERSION_PRERELEASE@" STREQUAL "" AND PACKAGE_FIND_VERSION_PRERELEASE STREQUAL "")
-      message(AUTHOR_WARNING "To use this prerelease version of ${PACKAGE_FIND_NAME}, set ${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE to '@protobuf_VERSION_PRERELEASE@' or greater.")
-      set(PACKAGE_VERSION_COMPATIBLE FALSE)
-    endif()
-
-    # Not robustly SemVer compliant, but protobuf never uses '.' separated prerelease identifiers.
-    if(PACKAGE_FIND_VERSION_PRERELEASE STRGREATER "@protobuf_VERSION_PRERELEASE@")
-      set(PACKAGE_VERSION_COMPATIBLE FALSE)
-    endif()
-  endif()
-endif()
-
-# Check and save build options used to create this package
-macro(_check_and_save_build_option OPTION VALUE)
-  if(DEFINED ${PACKAGE_FIND_NAME}_${OPTION} AND
-    NOT ${PACKAGE_FIND_NAME}_${OPTION} STREQUAL ${VALUE})
-    set(PACKAGE_VERSION_UNSUITABLE TRUE)
-  endif()
-  set(${PACKAGE_FIND_NAME}_${OPTION} ${VALUE} PARENT_SCOPE)
-endmacro()
-_check_and_save_build_option(WITH_ZLIB @protobuf_WITH_ZLIB@)
-_check_and_save_build_option(MSVC_STATIC_RUNTIME @protobuf_MSVC_STATIC_RUNTIME@)
-_check_and_save_build_option(BUILD_SHARED_LIBS @protobuf_BUILD_SHARED_LIBS@)
-
-# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
-if(CMAKE_SIZEOF_VOID_P AND "@CMAKE_SIZEOF_VOID_P@")
-  # check that the installed version has the same 32/64bit-ness as the one which is currently searching:
-  if(NOT CMAKE_SIZEOF_VOID_P EQUAL "@CMAKE_SIZEOF_VOID_P@")
-    math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8")
-    set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
-    set(PACKAGE_VERSION_UNSUITABLE TRUE)
-  endif()
-endif()
-
+set(PACKAGE_VERSION @protobuf_VERSION@)
diff --git a/cmake/protobuf-config.cmake.in b/cmake/protobuf-config.cmake.in
index fd67edc..bb0997b 100644
--- a/cmake/protobuf-config.cmake.in
+++ b/cmake/protobuf-config.cmake.in
@@ -1,121 +1,27 @@
-# User options
-include("${CMAKE_CURRENT_LIST_DIR}/protobuf-options.cmake")
+# Version info variables
+set(PROTOBUF_VERSION        "@protobuf_VERSION@")
+set(PROTOBUF_VERSION_STRING "@protobuf_VERSION_STRING@")
 
-# Depend packages
-@_protobuf_FIND_ZLIB@
+# Current dir
+get_filename_component(_PROTOBUF_PACKAGE_PREFIX
+  "${CMAKE_CURRENT_LIST_FILE}" PATH)
 
 # Imported targets
-include("${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake")
+include("${_PROTOBUF_PACKAGE_PREFIX}/protobuf-targets.cmake")
 
-function(protobuf_generate)
-  include(CMakeParseArguments)
-
-  set(_options APPEND_PATH)
-  set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO)
-  if(COMMAND target_sources)
-    list(APPEND _singleargs TARGET)
-  endif()
-  set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS)
-
-  cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")
-
-  if(NOT protobuf_generate_PROTOS AND NOT protobuf_generate_TARGET)
-    message(SEND_ERROR "Error: protobuf_generate called without any targets or source files")
-    return()
-  endif()
-
-  if(NOT protobuf_generate_OUT_VAR AND NOT protobuf_generate_TARGET)
-    message(SEND_ERROR "Error: protobuf_generate called without a target or output variable")
-    return()
-  endif()
-
-  if(NOT protobuf_generate_LANGUAGE)
-    set(protobuf_generate_LANGUAGE cpp)
-  endif()
-  string(TOLOWER ${protobuf_generate_LANGUAGE} protobuf_generate_LANGUAGE)
-
-  if(protobuf_generate_EXPORT_MACRO AND protobuf_generate_LANGUAGE STREQUAL cpp)
-    set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}:")
-  endif()
-
-  if(NOT protobuf_GENERATE_EXTENSIONS)
-    if(protobuf_generate_LANGUAGE STREQUAL cpp)
-      set(protobuf_GENERATE_EXTENSIONS .pb.h .pb.cc)
-    elseif(protobuf_generate_LANGUAGE STREQUAL python)
-      set(protobuf_GENERATE_EXTENSIONS _pb2.py)
-    else()
-      message(SEND_ERROR "Error: protobuf_generate given unknown Language ${LANGUAGE}, please provide a value for GENERATE_EXTENSIONS")
-      return()
-    endif()
-  endif()
-
-  if(protobuf_generate_TARGET)
-    get_target_property(_source_list ${protobuf_generate_TARGET} SOURCES)
-    foreach(_file ${_source_list})
-      if(_file MATCHES "proto$")
-        list(APPEND protobuf_generate_PROTOS ${_file})
-      endif()
-    endforeach()
-  endif()
-
-  if(NOT protobuf_generate_PROTOS)
-    message(SEND_ERROR "Error: protobuf_generate could not find any .proto files")
-    return()
-  endif()
-
-  if(protobuf_generate_APPEND_PATH)
-    # Create an include path for each file specified
-    foreach(_file ${protobuf_generate_PROTOS})
-      get_filename_component(_abs_file ${_file} ABSOLUTE)
-      get_filename_component(_abs_path ${_abs_file} PATH)
-      list(FIND _protobuf_include_path ${_abs_path} _contains_already)
-      if(${_contains_already} EQUAL -1)
-          list(APPEND _protobuf_include_path -I ${_abs_path})
-      endif()
-    endforeach()
-  else()
-    set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
-  endif()
-
-  foreach(DIR ${protobuf_generate_IMPORT_DIRS})
-    get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
-    list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
-    if(${_contains_already} EQUAL -1)
-        list(APPEND _protobuf_include_path -I ${ABS_PATH})
-    endif()
-  endforeach()
-
-  set(_generated_srcs_all)
-  foreach(_proto ${protobuf_generate_PROTOS})
-    get_filename_component(_abs_file ${_proto} ABSOLUTE)
-    get_filename_component(_basename ${_proto} NAME_WE)
-
-    set(_generated_srcs)
-    foreach(_ext ${protobuf_GENERATE_EXTENSIONS})
-      list(APPEND _generated_srcs "${CMAKE_CURRENT_BINARY_DIR}/${_basename}${_ext}")
-    endforeach()
-    list(APPEND _generated_srcs_all ${_generated_srcs})
-
-    add_custom_command(
-      OUTPUT ${_generated_srcs}
-      COMMAND  protobuf::protoc
-      ARGS --${protobuf_generate_LANGUAGE}_out ${_dll_export_decl}${CMAKE_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${_abs_file}
-      DEPENDS ${ABS_FIL} protobuf::protoc
-      COMMENT "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}"
-      VERBATIM )
-  endforeach()
-
-  set_source_files_properties(${_generated_srcs_all} PROPERTIES GENERATED TRUE)
-  if(protobuf_generate_OUT_VAR)
-    set(${protobuf_generate_OUT_VAR} ${_generated_srcs_all} PARENT_SCOPE)
-  endif()
-  if(protobuf_generate_TARGET)
-    target_sources(${protobuf_generate_TARGET} PUBLIC ${_generated_srcs_all})
-  endif()
-
-endfunction()
+# Compute the installation prefix relative to this file.
+get_filename_component(_PROTOBUF_IMPORT_PREFIX
+  "${_PROTOBUF_PACKAGE_PREFIX}" PATH)
+get_filename_component(_PROTOBUF_IMPORT_PREFIX
+  "${_PROTOBUF_IMPORT_PREFIX}" PATH)
+get_filename_component(_PROTOBUF_IMPORT_PREFIX
+  "${_PROTOBUF_IMPORT_PREFIX}" PATH)
 
 # CMake FindProtobuf module compatible file
-if(protobuf_MODULE_COMPATIBLE)
-  include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
+if(NOT DEFINED PROTOBUF_MODULE_COMPATIBLE OR "${PROTOBUF_MODULE_COMPATIBLE}")
+  include("${_PROTOBUF_PACKAGE_PREFIX}/protobuf-module.cmake")
 endif()
+
+# Cleanup temporary variables.
+set(_PROTOBUF_PACKAGE_PREFIX)
+set(_PROTOBUF_IMPORT_PREFIX)
diff --git a/cmake/protobuf-lite.pc.cmake b/cmake/protobuf-lite.pc.cmake
deleted file mode 100644
index cbe5426..0000000
--- a/cmake/protobuf-lite.pc.cmake
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=@CMAKE_INSTALL_PREFIX@
-libdir=@CMAKE_INSTALL_FULL_LIBDIR@
-includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
-
-Name: Protocol Buffers
-Description: Google's Data Interchange Format
-Version: @protobuf_VERSION@
-Libs: -L${libdir} -lprotobuf-lite @CMAKE_THREAD_LIBS_INIT@
-Cflags: -I${includedir} @CMAKE_THREAD_LIBS_INIT@
-Conflicts: protobuf
diff --git a/cmake/protobuf-module.cmake.in b/cmake/protobuf-module.cmake.in
index 74c5488..d81dc45 100644
--- a/cmake/protobuf-module.cmake.in
+++ b/cmake/protobuf-module.cmake.in
@@ -1,109 +1,89 @@
-# This file contains backwards compatibility patches for various legacy functions and variables
-# Functions
+if(PROTOBUF_SRC_ROOT_FOLDER)
+  message(AUTHOR_WARNING "Variable PROTOBUF_SRC_ROOT_FOLDER defined, but not"
+    " used in CONFIG mode")
+endif()
 
 function(PROTOBUF_GENERATE_CPP SRCS HDRS)
-  cmake_parse_arguments(protobuf_generate_cpp "" "EXPORT_MACRO" "" ${ARGN})
-
-  set(_proto_files "${protobuf_generate_cpp_UNPARSED_ARGUMENTS}")
-  if(NOT _proto_files)
+  if(NOT ARGN)
     message(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files")
     return()
   endif()
 
   if(PROTOBUF_GENERATE_CPP_APPEND_PATH)
-    set(_append_arg APPEND_PATH)
+    # Create an include path for each file specified
+    foreach(FIL ${ARGN})
+      get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
+      get_filename_component(ABS_PATH ${ABS_FIL} PATH)
+      list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
+      if(${_contains_already} EQUAL -1)
+          list(APPEND _protobuf_include_path -I ${ABS_PATH})
+      endif()
+    endforeach()
+  else()
+    set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
   endif()
 
-  if(DEFINED Protobuf_IMPORT_DIRS)
-    set(_import_arg IMPORT_DIRS ${Protobuf_IMPORT_DIRS})
-  endif()
+  # Add well-known type protos include path
+  list(APPEND _protobuf_include_path
+    -I "${_PROTOBUF_IMPORT_PREFIX}/@CMAKE_INSTALL_INCLUDEDIR@")
 
-  set(_outvar)
-  protobuf_generate(${_append_arg} LANGUAGE cpp EXPORT_MACRO ${protobuf_generate_cpp_EXPORT_MACRO} OUT_VAR _outvar ${_import_arg} PROTOS ${_proto_files})
+  if(DEFINED PROTOBUF_IMPORT_DIRS)
+    foreach(DIR ${PROTOBUF_IMPORT_DIRS})
+      get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
+      list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
+      if(${_contains_already} EQUAL -1)
+          list(APPEND _protobuf_include_path -I ${ABS_PATH})
+      endif()
+    endforeach()
+  endif()
 
   set(${SRCS})
   set(${HDRS})
-  foreach(_file ${_outvar})
-    if(_file MATCHES "cc$")
-      list(APPEND ${SRCS} ${_file})
-    else()
-      list(APPEND ${HDRS} ${_file})
-    endif()
+  foreach(FIL ${ARGN})
+    get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
+    get_filename_component(FIL_WE ${FIL} NAME_WE)
+
+    list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
+    list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
+
+    add_custom_command(
+      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
+             "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
+      COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
+      ARGS --cpp_out  ${CMAKE_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${ABS_FIL}
+      DEPENDS ${ABS_FIL} ${PROTOBUF_PROTOC_EXECUTABLE}
+      COMMENT "Running C++ protocol buffer compiler on ${FIL}"
+      VERBATIM)
   endforeach()
+
+  set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
   set(${SRCS} ${${SRCS}} PARENT_SCOPE)
   set(${HDRS} ${${HDRS}} PARENT_SCOPE)
 endfunction()
 
-function(PROTOBUF_GENERATE_PYTHON SRCS)
-  if(NOT ARGN)
-    message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called without any proto files")
-    return()
-  endif()
-
-  if(PROTOBUF_GENERATE_CPP_APPEND_PATH)
-    set(_append_arg APPEND_PATH)
-  endif()
-
-  if(DEFINED Protobuf_IMPORT_DIRS)
-    set(_import_arg IMPORT_DIRS ${Protobuf_IMPORT_DIRS})
-  endif()
-
-  set(_outvar)
-  protobuf_generate(${_append_arg} LANGUAGE python OUT_VAR _outvar ${_import_arg} PROTOS ${ARGN})
-  set(${SRCS} ${_outvar} PARENT_SCOPE)
-endfunction()
-
-# Environment
-
-# Backwards compatibility
-# Define camel case versions of input variables
-foreach(UPPER
-    PROTOBUF_SRC_ROOT_FOLDER
-    PROTOBUF_IMPORT_DIRS
-    PROTOBUF_DEBUG
-    PROTOBUF_LIBRARY
-    PROTOBUF_PROTOC_LIBRARY
-    PROTOBUF_INCLUDE_DIR
-    PROTOBUF_PROTOC_EXECUTABLE
-    PROTOBUF_LIBRARY_DEBUG
-    PROTOBUF_PROTOC_LIBRARY_DEBUG
-    PROTOBUF_LITE_LIBRARY
-    PROTOBUF_LITE_LIBRARY_DEBUG
-    )
-    if (DEFINED ${UPPER})
-        string(REPLACE "PROTOBUF_" "Protobuf_" Camel ${UPPER})
-        if (NOT DEFINED ${Camel})
-            set(${Camel} ${${UPPER}})
-        endif()
-    endif()
-endforeach()
-
-if(DEFINED Protobuf_SRC_ROOT_FOLDER)
-  message(AUTHOR_WARNING "Variable Protobuf_SRC_ROOT_FOLDER defined, but not"
-    " used in CONFIG mode")
-endif()
-
-include(SelectLibraryConfigurations)
-
 # Internal function: search for normal library as well as a debug one
 #    if the debug one is specified also include debug/optimized keywords
 #    in *_LIBRARIES variable
 function(_protobuf_find_libraries name filename)
-  if(${name}_LIBRARIES)
-    # Use result recorded by a previous call.
-  elseif(${name}_LIBRARY)
-    # Honor cache entry used by CMake 3.5 and lower.
-    set(${name}_LIBRARIES "${${name}_LIBRARY}" PARENT_SCOPE)
-  else()
-    get_target_property(${name}_LIBRARY_RELEASE protobuf::lib${filename}
-      LOCATION_RELEASE)
-    get_target_property(${name}_LIBRARY_DEBUG protobuf::lib${filename}
-      LOCATION_DEBUG)
+   get_target_property(${name}_LIBRARY lib${filename}
+     IMPORTED_LOCATION_RELEASE)
+   set(${name}_LIBRARY "${${name}_LIBRARY}" PARENT_SCOPE)
+   get_target_property(${name}_LIBRARY_DEBUG lib${filename}
+     IMPORTED_LOCATION_DEBUG)
+   set(${name}_LIBRARY_DEBUG "${${name}_LIBRARY_DEBUG}" PARENT_SCOPE)
 
-    select_library_configurations(${name})
-    set(${name}_LIBRARY ${${name}_LIBRARY} PARENT_SCOPE)
-    set(${name}_LIBRARIES ${${name}_LIBRARIES} PARENT_SCOPE)
-  endif()
+   if(NOT ${name}_LIBRARY_DEBUG)
+      # There is no debug library
+      set(${name}_LIBRARY_DEBUG ${${name}_LIBRARY} PARENT_SCOPE)
+      set(${name}_LIBRARIES     ${${name}_LIBRARY} PARENT_SCOPE)
+   else()
+      # There IS a debug library
+      set(${name}_LIBRARIES
+          optimized ${${name}_LIBRARY}
+          debug     ${${name}_LIBRARY_DEBUG}
+          PARENT_SCOPE
+      )
+   endif()
 endfunction()
 
 # Internal function: find threads library
@@ -127,63 +107,33 @@
 endif()
 
 # The Protobuf library
-_protobuf_find_libraries(Protobuf protobuf)
+_protobuf_find_libraries(PROTOBUF protobuf)
 
 # The Protobuf Lite library
-_protobuf_find_libraries(Protobuf_LITE protobuf-lite)
+_protobuf_find_libraries(PROTOBUF_LITE protobuf-lite)
 
 # The Protobuf Protoc Library
-_protobuf_find_libraries(Protobuf_PROTOC protoc)
+_protobuf_find_libraries(PROTOBUF_PROTOC protoc)
 
 if(UNIX)
   _protobuf_find_threads()
 endif()
 
 # Set the include directory
-get_target_property(Protobuf_INCLUDE_DIRS protobuf::libprotobuf
-  INTERFACE_INCLUDE_DIRECTORIES)
+set(PROTOBUF_INCLUDE_DIR "${_PROTOBUF_IMPORT_PREFIX}/@CMAKE_INSTALL_INCLUDEDIR@")
 
 # Set the protoc Executable
-get_target_property(Protobuf_PROTOC_EXECUTABLE protobuf::protoc
+get_target_property(PROTOBUF_PROTOC_EXECUTABLE protoc
   IMPORTED_LOCATION_RELEASE)
-if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
-  get_target_property(Protobuf_PROTOC_EXECUTABLE protobuf::protoc
+if(NOT PROTOBUF_PROTOC_EXECUTABLE)
+  get_target_property(PROTOBUF_PROTOC_EXECUTABLE protoc
     IMPORTED_LOCATION_DEBUG)
 endif()
-if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
-  get_target_property(Protobuf_PROTOC_EXECUTABLE protobuf::protoc
-    IMPORTED_LOCATION_NOCONFIG)
-endif()
-
-# Version info variable
-set(Protobuf_VERSION "@protobuf_VERSION@")
 
 include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(Protobuf
-    REQUIRED_VARS Protobuf_PROTOC_EXECUTABLE Protobuf_LIBRARIES Protobuf_INCLUDE_DIRS
-    VERSION_VAR Protobuf_VERSION
-)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROTOBUF DEFAULT_MSG
+    PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR)
 
-# Backwards compatibility
-# Define upper case versions of output variables
-foreach(Camel
-    Protobuf_VERSION
-    Protobuf_SRC_ROOT_FOLDER
-    Protobuf_IMPORT_DIRS
-    Protobuf_DEBUG
-    Protobuf_INCLUDE_DIRS
-    Protobuf_LIBRARIES
-    Protobuf_PROTOC_LIBRARIES
-    Protobuf_LITE_LIBRARIES
-    Protobuf_LIBRARY
-    Protobuf_PROTOC_LIBRARY
-    Protobuf_INCLUDE_DIR
-    Protobuf_PROTOC_EXECUTABLE
-    Protobuf_LIBRARY_DEBUG
-    Protobuf_PROTOC_LIBRARY_DEBUG
-    Protobuf_LITE_LIBRARY
-    Protobuf_LITE_LIBRARY_DEBUG
-    )
-    string(TOUPPER ${Camel} UPPER)
-    set(${UPPER} ${${Camel}})
-endforeach()
+if(PROTOBUF_FOUND)
+    set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR})
+endif()
diff --git a/cmake/protobuf-options.cmake b/cmake/protobuf-options.cmake
deleted file mode 100644
index 47fb158..0000000
--- a/cmake/protobuf-options.cmake
+++ /dev/null
@@ -1,7 +0,0 @@
-# Verbose output
-option(protobuf_VERBOSE "Enable for verbose output" OFF)
-mark_as_advanced(protobuf_VERBOSE)
-
-# FindProtobuf module compatibel
-option(protobuf_MODULE_COMPATIBLE "CMake build-in FindProtobuf.cmake module compatible" OFF)
-mark_as_advanced(protobuf_MODULE_COMPATIBLE)
diff --git a/cmake/protobuf.pc.cmake b/cmake/protobuf.pc.cmake
deleted file mode 100644
index d33e98c..0000000
--- a/cmake/protobuf.pc.cmake
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=@CMAKE_INSTALL_PREFIX@
-libdir=@CMAKE_INSTALL_FULL_LIBDIR@
-includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
-
-Name: Protocol Buffers
-Description: Google's Data Interchange Format
-Version: @protobuf_VERSION@
-Libs: -L${libdir} -lprotobuf @CMAKE_THREAD_LIBS_INIT@
-Cflags: -I${includedir} @CMAKE_THREAD_LIBS_INIT@
-Conflicts: protobuf-lite
diff --git a/cmake/tests.cmake b/cmake/tests.cmake
index d4622c6..76fdf8e 100644
--- a/cmake/tests.cmake
+++ b/cmake/tests.cmake
@@ -4,7 +4,6 @@
 
 option(protobuf_ABSOLUTE_TEST_PLUGIN_PATH
   "Using absolute test_plugin path in tests" ON)
-mark_as_advanced(protobuf_ABSOLUTE_TEST_PLUGIN_PATH)
 
 include_directories(
   ${protobuf_source_dir}/gmock
@@ -17,7 +16,6 @@
   ${protobuf_source_dir}/gmock/src/gmock-all.cc
   ${protobuf_source_dir}/gmock/gtest/src/gtest-all.cc
 )
-target_link_libraries(gmock ${CMAKE_THREAD_LIBS_INIT})
 add_library(gmock_main STATIC ${protobuf_source_dir}/gmock/src/gmock_main.cc)
 target_link_libraries(gmock_main gmock)
 
@@ -43,9 +41,6 @@
   google/protobuf/unittest_empty.proto
   google/protobuf/unittest_import.proto
   google/protobuf/unittest_import_public.proto
-  google/protobuf/unittest_lazy_dependencies.proto
-  google/protobuf/unittest_lazy_dependencies_custom_option.proto
-  google/protobuf/unittest_lazy_dependencies_enum.proto
   google/protobuf/unittest_lite_imports_nonlite.proto
   google/protobuf/unittest_mset.proto
   google/protobuf/unittest_mset_wire_format.proto
@@ -67,10 +62,8 @@
   google/protobuf/util/internal/testdata/field_mask.proto
   google/protobuf/util/internal/testdata/maps.proto
   google/protobuf/util/internal/testdata/oneofs.proto
-  google/protobuf/util/internal/testdata/proto3.proto
   google/protobuf/util/internal/testdata/struct.proto
   google/protobuf/util/internal/testdata/timestamp_duration.proto
-  google/protobuf/util/internal/testdata/wrappers.proto
   google/protobuf/util/json_format_proto3.proto
   google/protobuf/util/message_differencer_unittest.proto
 )
@@ -121,14 +114,11 @@
   ${protobuf_source_dir}/src/google/protobuf/any_test.cc
   ${protobuf_source_dir}/src/google/protobuf/arena_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/arenastring_unittest.cc
-  ${protobuf_source_dir}/src/google/protobuf/compiler/annotation_test_util.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/command_line_interface_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
-  ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_move_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/cpp/metadata_test.cc
-  ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/importer_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc
@@ -162,7 +152,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/once_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/status_test.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/statusor_test.cc
@@ -175,7 +164,6 @@
   ${protobuf_source_dir}/src/google/protobuf/stubs/type_traits_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/text_format_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/unknown_field_set_unittest.cc
-  ${protobuf_source_dir}/src/google/protobuf/util/delimited_message_util_test.cc
   ${protobuf_source_dir}/src/google/protobuf/util/field_comparator_test.cc
   ${protobuf_source_dir}/src/google/protobuf/util/field_mask_util_test.cc
   ${protobuf_source_dir}/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
@@ -213,7 +201,7 @@
   ${protobuf_source_dir}/src/google/protobuf/lite_unittest.cc
 )
 add_executable(lite-test ${lite_test_files} ${common_lite_test_files} ${lite_test_proto_files})
-target_link_libraries(lite-test libprotobuf-lite gmock_main)
+target_link_libraries(lite-test libprotobuf-lite)
 
 set(lite_arena_test_files
   ${protobuf_source_dir}/src/google/protobuf/lite_arena_unittest.cc
@@ -223,5 +211,4 @@
 
 add_custom_target(check
   COMMAND tests
-  DEPENDS tests test_plugin
   WORKING_DIRECTORY ${protobuf_source_dir})
diff --git a/composer.json b/composer.json
deleted file mode 100644
index 2c64ad2..0000000
--- a/composer.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "google/protobuf",
-  "type": "library",
-  "description": "proto library for PHP",
-  "keywords": ["proto"],
-  "homepage": "https://developers.google.com/protocol-buffers/",
-  "license": "BSD-3-Clause",
-  "require": {
-    "php": ">=5.5.0"
-  },
-  "require-dev": {
-    "phpunit/phpunit": ">=4.8.0"
-  },
-  "suggest": {
-    "ext-bcmath": "Need to support JSON deserialization"
-  },
-  "autoload": {
-    "psr-4": {
-      "Google\\Protobuf\\": "php/src/Google/Protobuf",
-      "GPBMetadata\\Google\\Protobuf\\": "php/src/GPBMetadata/Google/Protobuf"
-    }
-  }
-}
diff --git a/config/config.h b/config/config.h
index 0f2d562..366aa84 100644
--- a/config/config.h
+++ b/config/config.h
@@ -5,19 +5,16 @@
 #define HASH_MAP_CLASS unordered_map
 
 /* the location of <unordered_map> or <hash_map> */
-#define HASH_MAP_H <unordered_map>
+#define HASH_MAP_H <tr1/unordered_map>
 
 /* the namespace of hash_map/hash_set */
-#define HASH_NAMESPACE std
+#define HASH_NAMESPACE std::tr1
 
 /* the name of <hash_set> */
 #define HASH_SET_CLASS unordered_set
 
 /* the location of <unordered_set> or <hash_set> */
-#define HASH_SET_H <unordered_set>
-
-/* define if the compiler supports basic C++11 syntax */
-#define HAVE_CXX11 1
+#define HASH_SET_H <tr1/unordered_set>
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #define HAVE_DLFCN_H 1
@@ -85,7 +82,8 @@
 /* Enable classes using zlib compression. */
 #define HAVE_ZLIB 1
 
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
 #define LT_OBJDIR ".libs/"
 
 /* Name of package */
@@ -98,7 +96,7 @@
 #define PACKAGE_NAME "Protocol Buffers"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "Protocol Buffers 3.5.2"
+#define PACKAGE_STRING "Protocol Buffers 2.6.1"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "protobuf"
@@ -107,12 +105,15 @@
 #define PACKAGE_URL ""
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "3.5.2"
+#define PACKAGE_VERSION "2.6.1"
 
 /* Define to necessary symbol if this constant uses a non-standard name on
    your system. */
 /* #undef PTHREAD_CREATE_JOINABLE */
 
+/* 64bit enabled */
+/* #undef SOLARIS_64BIT_ENABLED */
+
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
 
@@ -139,7 +140,7 @@
 
 
 /* Version number of package */
-#define VERSION "3.5.2"
+#define VERSION "2.6.1"
 
 /* Define to 1 if on MINIX. */
 /* #undef _MINIX */
diff --git a/configure.ac b/configure.ac
index 839aa04..bdc72ee 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,20 +4,15 @@
 AC_PREREQ(2.59)
 
 # Note:  If you change the version, you must also update it in:
-# * Protobuf.podspec
-# * csharp/Google.Protobuf.Tools.nuspec
-# * csharp/src/*/AssemblyInfo.cs
-# * csharp/src/Google.Protobuf/Google.Protobuf.nuspec
-# * java/*/pom.xml
-# * python/google/protobuf/__init__.py
-# * protoc-artifacts/pom.xml
+# * java/pom.xml
+# * python/setup.py
 # * src/google/protobuf/stubs/common.h
 # * src/Makefile.am (Update -version-info for LDFLAGS if needed)
 #
 # In the SVN trunk, the version should always be the next anticipated release
 # version with the "-pre" suffix.  (We used to use "-SNAPSHOT" but this pushed
 # the size of one file name in the dist tarfile over the 99-char limit.)
-AC_INIT([Protocol Buffers],[3.5.2],[protobuf@googlegroups.com],[protobuf])
+AC_INIT([Protocol Buffers],[3.0.0-beta-3],[protobuf@googlegroups.com],[protobuf])
 
 AM_MAINTAINER_MODE([enable])
 
@@ -31,7 +26,7 @@
 AC_ARG_VAR(DIST_LANG, [language to include in the distribution package (i.e., make dist)])
 case "$DIST_LANG" in
   "") DIST_LANG=all ;;
-  all | cpp | csharp | java | python | javanano | objectivec | ruby | js | php) ;;
+  all | cpp | csharp | java | python | javanano | objectivec | ruby | js) ;;
   *) AC_MSG_FAILURE([unknown language: $DIST_LANG]) ;;
 esac
 AC_SUBST(DIST_LANG)
@@ -60,7 +55,6 @@
 # Checks for programs.
 AC_PROG_CC
 AC_PROG_CXX
-AC_PROG_CXX_FOR_BUILD
 AC_LANG([C++])
 ACX_USE_SYSTEM_EXTENSIONS
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
@@ -93,25 +87,6 @@
 # to the link
 AC_PROG_LIBTOOL
 
-# Check whether the linker supports version scripts
-AC_MSG_CHECKING([whether the linker supports version scripts])
-save_LDFLAGS=$LDFLAGS
-LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
-cat > conftest.map <<EOF
-{
-  global:
-    main;
-  local:
-    *;
-};
-EOF
-AC_LINK_IFELSE(
-  [AC_LANG_SOURCE([int main() { return 0; }])],
-  [have_ld_version_script=yes; AC_MSG_RESULT(yes)],
-  [have_ld_version_script=no; AC_MSG_RESULT(no)])
-LDFLAGS=$save_LDFLAGS
-AM_CONDITIONAL([HAVE_LD_VERSION_SCRIPT], [test "$have_ld_version_script" == "yes"])
-
 # Checks for header files.
 AC_HEADER_STDC
 AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h stdlib.h unistd.h])
@@ -198,8 +173,6 @@
 esac
 AM_CONDITIONAL([OBJC_CONFORMANCE_TEST], [test $OBJC_CONFORMANCE_TEST = 1])
 
-AX_CXX_COMPILE_STDCXX([11], [noext], [optional])
-
 # HACK:  Make gmock's configure script pick up our copy of CFLAGS and CXXFLAGS,
 #   since the flags added by ACX_CHECK_SUNCC must be used when compiling gmock
 #   too.
diff --git a/conformance/ConformanceJava.java b/conformance/ConformanceJava.java
index 596d113..43787ff 100644
--- a/conformance/ConformanceJava.java
+++ b/conformance/ConformanceJava.java
@@ -1,18 +1,8 @@
-import com.google.protobuf.ByteString;
-import com.google.protobuf.AbstractMessage;
-import com.google.protobuf.Parser;
-import com.google.protobuf.CodedInputStream;
+
 import com.google.protobuf.conformance.Conformance;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf_test_messages.proto3.TestMessagesProto3;
-import com.google.protobuf_test_messages.proto3.TestMessagesProto3.TestAllTypesProto3;
-import com.google.protobuf_test_messages.proto2.TestMessagesProto2;
-import com.google.protobuf_test_messages.proto2.TestMessagesProto2.TestAllTypesProto2;
-import com.google.protobuf.ExtensionRegistry;
 import com.google.protobuf.util.JsonFormat;
 import com.google.protobuf.util.JsonFormat.TypeRegistry;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
+import com.google.protobuf.InvalidProtocolBufferException;
 
 class ConformanceJava {
   private int testCount = 0;
@@ -56,185 +46,22 @@
     buf[3] = (byte)(val >> 24);
     writeToStdout(buf);
   }
-  
-  private enum BinaryDecoderType {
-    BTYE_STRING_DECODER,
-    BYTE_ARRAY_DECODER,
-    ARRAY_BYTE_BUFFER_DECODER,
-    READONLY_ARRAY_BYTE_BUFFER_DECODER,
-    DIRECT_BYTE_BUFFER_DECODER,
-    READONLY_DIRECT_BYTE_BUFFER_DECODER,
-    INPUT_STREAM_DECODER;
-  }
-
-  private static class BinaryDecoder <MessageType extends AbstractMessage> {
-    public MessageType decode (ByteString bytes, BinaryDecoderType type, 
-        Parser <MessageType> parser, ExtensionRegistry extensions)
-      throws InvalidProtocolBufferException {
-      switch (type) {
-        case BTYE_STRING_DECODER: 
-          return parser.parseFrom(bytes, extensions);
-        case BYTE_ARRAY_DECODER:
-          return parser.parseFrom(bytes.toByteArray(), extensions);
-        case ARRAY_BYTE_BUFFER_DECODER: {
-          ByteBuffer buffer = ByteBuffer.allocate(bytes.size());
-          bytes.copyTo(buffer);
-          buffer.flip();
-          try {
-            return parser.parseFrom(CodedInputStream.newInstance(buffer), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            throw e;
-          }
-        }
-        case READONLY_ARRAY_BYTE_BUFFER_DECODER: {
-          try {
-            return parser.parseFrom(
-                CodedInputStream.newInstance(bytes.asReadOnlyByteBuffer()), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            throw e;
-          }
-        } 
-        case DIRECT_BYTE_BUFFER_DECODER: {
-          ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.size());
-          bytes.copyTo(buffer);
-          buffer.flip();
-          try {
-            return parser.parseFrom(CodedInputStream.newInstance(buffer), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            throw e;
-          }
-        }
-        case READONLY_DIRECT_BYTE_BUFFER_DECODER: {
-          ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.size());
-          bytes.copyTo(buffer);
-          buffer.flip();
-          try {
-            return parser.parseFrom(
-                CodedInputStream.newInstance(buffer.asReadOnlyBuffer()), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            throw e;
-          }
-        }
-        case INPUT_STREAM_DECODER: {
-          try {
-            return parser.parseFrom(bytes.newInput(), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            throw e;
-          }
-        }
-        default :
-          return null;
-      }
-    }
-  }
-
-  private <MessageType extends AbstractMessage> MessageType parseBinary(
-      ByteString bytes, Parser <MessageType> parser, ExtensionRegistry extensions)
-      throws InvalidProtocolBufferException {
-    ArrayList <MessageType> messages = new ArrayList <MessageType> ();
-    ArrayList <InvalidProtocolBufferException> exceptions =
-        new ArrayList <InvalidProtocolBufferException>();
-    
-    for (int i = 0; i < BinaryDecoderType.values().length; i++) {
-      messages.add(null);
-      exceptions.add(null);
-    }
-    BinaryDecoder <MessageType> decoder = new BinaryDecoder <MessageType> ();
-
-    boolean hasMessage = false;
-    boolean hasException = false;
-    for (int i = 0; i < BinaryDecoderType.values().length; ++i) {
-      try {
-        //= BinaryDecoderType.values()[i].parseProto3(bytes);
-        messages.set(i, decoder.decode(bytes, BinaryDecoderType.values()[i], parser, extensions));
-        hasMessage = true;
-      } catch (InvalidProtocolBufferException e) {
-        exceptions.set(i, e);
-        hasException = true;
-      }
-    }
-
-    if (hasMessage && hasException) {
-      StringBuilder sb =
-          new StringBuilder("Binary decoders disagreed on whether the payload was valid.\n");
-      for (int i = 0; i < BinaryDecoderType.values().length; ++i) {
-        sb.append(BinaryDecoderType.values()[i].name());
-        if (messages.get(i) != null) {
-          sb.append(" accepted the payload.\n");
-        } else {
-          sb.append(" rejected the payload.\n");
-        }
-      }
-      throw new RuntimeException(sb.toString());
-    }
-
-    if (hasException) {
-      // We do not check if exceptions are equal. Different implementations may return different
-      // exception messages. Throw an arbitrary one out instead.
-      throw exceptions.get(0);
-    }
-
-    // Fast path comparing all the messages with the first message, assuming equality being
-    // symmetric and transitive.
-    boolean allEqual = true;
-    for (int i = 1; i < messages.size(); ++i) {
-      if (!messages.get(0).equals(messages.get(i))) {
-        allEqual = false;
-        break;
-      }
-    }
-
-    // Slow path: compare and find out all unequal pairs.
-    if (!allEqual) {
-      StringBuilder sb = new StringBuilder();
-      for (int i = 0; i < messages.size() - 1; ++i) {
-        for (int j = i + 1; j < messages.size(); ++j) {
-          if (!messages.get(i).equals(messages.get(j))) {
-            sb.append(BinaryDecoderType.values()[i].name())
-                .append(" and ")
-                .append(BinaryDecoderType.values()[j].name())
-                .append(" parsed the payload differently.\n");
-          }
-        }
-      }
-      throw new RuntimeException(sb.toString());
-    }
-
-    return messages.get(0);
-  }
 
   private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest request) {
-    com.google.protobuf.AbstractMessage testMessage;
-    boolean isProto3 = request.getMessageType().equals("protobuf_test_messages.proto3.TestAllTypesProto3");
-    boolean isProto2 = request.getMessageType().equals("protobuf_test_messages.proto2.TestAllTypesProto2");
+    Conformance.TestAllTypes testMessage;
 
     switch (request.getPayloadCase()) {
       case PROTOBUF_PAYLOAD: {
-        if (isProto3) {
-          try {
-            ExtensionRegistry extensions = ExtensionRegistry.newInstance();
-            TestMessagesProto3.registerAllExtensions(extensions);
-            testMessage = parseBinary(request.getProtobufPayload(), TestAllTypesProto3.parser(), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
-          }
-        } else if (isProto2) {
-          try {
-            ExtensionRegistry extensions = ExtensionRegistry.newInstance();
-            TestMessagesProto2.registerAllExtensions(extensions);
-            testMessage = parseBinary(request.getProtobufPayload(), TestAllTypesProto2.parser(), extensions);
-          } catch (InvalidProtocolBufferException e) {
-            return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
-          }
-        } else {
-          throw new RuntimeException("Protobuf request doesn't have specific payload type.");
+        try {
+          testMessage = Conformance.TestAllTypes.parseFrom(request.getProtobufPayload());
+        } catch (InvalidProtocolBufferException e) {
+          return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
         }
         break;
       }
       case JSON_PAYLOAD: {
         try {
-          TestMessagesProto3.TestAllTypesProto3.Builder builder = 
-              TestMessagesProto3.TestAllTypesProto3.newBuilder();
+          Conformance.TestAllTypes.Builder builder = Conformance.TestAllTypes.newBuilder();
           JsonFormat.parser().usingTypeRegistry(typeRegistry)
               .merge(request.getJsonPayload(), builder);
           testMessage = builder.build();
@@ -256,10 +83,8 @@
       case UNSPECIFIED:
         throw new RuntimeException("Unspecified output format.");
 
-      case PROTOBUF: {
-        ByteString MessageString = testMessage.toByteString(); 
-        return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(MessageString).build();
-      }
+      case PROTOBUF:
+        return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(testMessage.toByteString()).build();
 
       case JSON:
         try {
@@ -302,7 +127,7 @@
 
   public void run() throws Exception {
     typeRegistry = TypeRegistry.newBuilder().add(
-        TestMessagesProto3.TestAllTypesProto3.getDescriptor()).build();
+        Conformance.TestAllTypes.getDescriptor()).build();
     while (doTestIo()) {
       this.testCount++;
     }
diff --git a/conformance/ConformanceJavaLite.java b/conformance/ConformanceJavaLite.java
index 016f793..121dc7d 100644
--- a/conformance/ConformanceJavaLite.java
+++ b/conformance/ConformanceJavaLite.java
@@ -58,7 +58,7 @@
       }
       case JSON_PAYLOAD: {
         return Conformance.ConformanceResponse.newBuilder().setSkipped(
-            "Lite runtime does not support JSON format.").build();
+            "Lite runtime does not suport Json Formant.").build();
       }
       case PAYLOAD_NOT_SET: {
         throw new RuntimeException("Request didn't have payload.");
@@ -78,7 +78,7 @@
 
       case JSON:
         return Conformance.ConformanceResponse.newBuilder().setSkipped(
-            "Lite runtime does not support JSON format.").build();
+            "Lite runtime does not suport Json Formant.").build();
 
       default: {
         throw new RuntimeException("Unexpected request output.");
diff --git a/conformance/Makefile.am b/conformance/Makefile.am
index 765f358..31a9e40 100644
--- a/conformance/Makefile.am
+++ b/conformance/Makefile.am
@@ -1,13 +1,7 @@
 ## Process this file with automake to produce Makefile.in
 
 conformance_protoc_inputs =                                    \
-  conformance.proto                                            \
-  $(top_srcdir)/src/google/protobuf/test_messages_proto3.proto
-
-# proto2 input files, should be separated with proto3, as we
-# can't generate proto2 files for ruby, php and objc
-conformance_proto2_protoc_inputs =                             \
-  $(top_srcdir)/src/google/protobuf/test_messages_proto2.proto
+  conformance.proto
 
 well_known_type_protoc_inputs =                                \
   $(top_srcdir)/src/google/protobuf/any.proto                  \
@@ -26,8 +20,7 @@
   conformance_pb2.py                                           \
   Conformance.pbobjc.h                                         \
   Conformance.pbobjc.m                                         \
-  conformance_pb.js                                            \
-  conformance_pb.rb                                            \
+  conformance.rb                                               \
   com/google/protobuf/Any.java                                 \
   com/google/protobuf/AnyOrBuilder.java                        \
   com/google/protobuf/AnyProto.java                            \
@@ -68,8 +61,6 @@
   com/google/protobuf/Value.java                               \
   com/google/protobuf/ValueOrBuilder.java                      \
   com/google/protobuf/WrappersProto.java                       \
-  com/google/protobuf_test_messages/proto3/TestMessagesProto3.java \
-  com/google/protobuf_test_messages/proto2/TestMessagesProto2.java \
   google/protobuf/any.pb.cc                                    \
   google/protobuf/any.pb.h                                     \
   google/protobuf/any.rb                                       \
@@ -86,17 +77,6 @@
   google/protobuf/struct.pb.h                                  \
   google/protobuf/struct.rb                                    \
   google/protobuf/struct_pb2.py                                \
-  google/protobuf/TestMessagesProto2.pbobjc.h                  \
-  google/protobuf/TestMessagesProto2.pbobjc.m                  \
-  google/protobuf/TestMessagesProto3.pbobjc.h                  \
-  google/protobuf/TestMessagesProto3.pbobjc.m                  \
-  google/protobuf/test_messages_proto3.pb.cc                   \
-  google/protobuf/test_messages_proto3.pb.h                    \
-  google/protobuf/test_messages_proto2.pb.cc                   \
-  google/protobuf/test_messages_proto2.pb.h                    \
-  google/protobuf/test_messages_proto3_pb.rb                   \
-  google/protobuf/test_messages_proto3_pb2.py                  \
-  google/protobuf/test_messages_proto2_pb2.py                  \
   google/protobuf/timestamp.pb.cc                              \
   google/protobuf/timestamp.pb.h                               \
   google/protobuf/timestamp.rb                                 \
@@ -105,79 +85,46 @@
   google/protobuf/wrappers.pb.h                                \
   google/protobuf/wrappers.rb                                  \
   google/protobuf/wrappers_pb2.py                              \
-  Conformance/ConformanceRequest.php                           \
-  Conformance/ConformanceResponse.php                          \
-  Conformance/WireFormat.php                                   \
-  GPBMetadata/Conformance.php                                  \
-  GPBMetadata/Google/Protobuf/Any.php                          \
-  GPBMetadata/Google/Protobuf/Duration.php                     \
-  GPBMetadata/Google/Protobuf/FieldMask.php                    \
-  GPBMetadata/Google/Protobuf/Struct.php                       \
-  GPBMetadata/Google/Protobuf/TestMessagesProto3.php           \
-  GPBMetadata/Google/Protobuf/Timestamp.php                    \
-  GPBMetadata/Google/Protobuf/Wrappers.php                     \
-  Google/Protobuf/Any.php                                      \
-  Google/Protobuf/BoolValue.php                                \
-  Google/Protobuf/BytesValue.php                               \
-  Google/Protobuf/DoubleValue.php                              \
-  Google/Protobuf/Duration.php                                 \
-  Google/Protobuf/FieldMask.php                                \
-  Google/Protobuf/FloatValue.php                               \
-  Google/Protobuf/Int32Value.php                               \
-  Google/Protobuf/Int64Value.php                               \
-  Google/Protobuf/ListValue.php                                \
-  Google/Protobuf/NullValue.php                                \
-  Google/Protobuf/StringValue.php                              \
-  Google/Protobuf/Struct.php                                   \
-  Google/Protobuf/Timestamp.php                                \
-  Google/Protobuf/UInt32Value.php                              \
-  Google/Protobuf/UInt64Value.php                              \
-  Google/Protobuf/Value.php                                    \
-  Protobuf_test_messages/Proto3/ForeignEnum.php                \
-  Protobuf_test_messages/Proto3/ForeignMessage.php             \
-  Protobuf_test_messages/Proto3/TestAllTypes_NestedEnum.php    \
-  Protobuf_test_messages/Proto3/TestAllTypes_NestedMessage.php \
-  Protobuf_test_messages/Proto3/TestAllTypes.php
-  # lite/com/google/protobuf/Any.java                            \
-  # lite/com/google/protobuf/AnyOrBuilder.java                   \
-  # lite/com/google/protobuf/AnyProto.java                       \
-  # lite/com/google/protobuf/BoolValue.java                      \
-  # lite/com/google/protobuf/BoolValueOrBuilder.java             \
-  # lite/com/google/protobuf/BytesValue.java                     \
-  # lite/com/google/protobuf/BytesValueOrBuilder.java            \
-  # lite/com/google/protobuf/conformance/Conformance.java        \
-  # lite/com/google/protobuf/DoubleValue.java                    \
-  # lite/com/google/protobuf/DoubleValueOrBuilder.java           \
-  # lite/com/google/protobuf/Duration.java                       \
-  # lite/com/google/protobuf/DurationOrBuilder.java              \
-  # lite/com/google/protobuf/DurationProto.java                  \
-  # lite/com/google/protobuf/FieldMask.java                      \
-  # lite/com/google/protobuf/FieldMaskOrBuilder.java             \
-  # lite/com/google/protobuf/FieldMaskProto.java                 \
-  # lite/com/google/protobuf/FloatValue.java                     \
-  # lite/com/google/protobuf/FloatValueOrBuilder.java            \
-  # lite/com/google/protobuf/Int32Value.java                     \
-  # lite/com/google/protobuf/Int32ValueOrBuilder.java            \
-  # lite/com/google/protobuf/Int64Value.java                     \
-  # lite/com/google/protobuf/Int64ValueOrBuilder.java            \
-  # lite/com/google/protobuf/ListValue.java                      \
-  # lite/com/google/protobuf/ListValueOrBuilder.java             \
-  # lite/com/google/protobuf/NullValue.java                      \
-  # lite/com/google/protobuf/StringValue.java                    \
-  # lite/com/google/protobuf/StringValueOrBuilder.java           \
-  # lite/com/google/protobuf/Struct.java                         \
-  # lite/com/google/protobuf/StructOrBuilder.java                \
-  # lite/com/google/protobuf/StructProto.java                    \
-  # lite/com/google/protobuf/Timestamp.java                      \
-  # lite/com/google/protobuf/TimestampOrBuilder.java             \
-  # lite/com/google/protobuf/TimestampProto.java                 \
-  # lite/com/google/protobuf/UInt32Value.java                    \
-  # lite/com/google/protobuf/UInt32ValueOrBuilder.java           \
-  # lite/com/google/protobuf/UInt64Value.java                    \
-  # lite/com/google/protobuf/UInt64ValueOrBuilder.java           \
-  # lite/com/google/protobuf/Value.java                          \
-  # lite/com/google/protobuf/ValueOrBuilder.java                 \
-  # lite/com/google/protobuf/WrappersProto.java
+  lite/com/google/protobuf/Any.java                            \
+  lite/com/google/protobuf/AnyOrBuilder.java                   \
+  lite/com/google/protobuf/AnyProto.java                       \
+  lite/com/google/protobuf/BoolValue.java                      \
+  lite/com/google/protobuf/BoolValueOrBuilder.java             \
+  lite/com/google/protobuf/BytesValue.java                     \
+  lite/com/google/protobuf/BytesValueOrBuilder.java            \
+  lite/com/google/protobuf/conformance/Conformance.java        \
+  lite/com/google/protobuf/DoubleValue.java                    \
+  lite/com/google/protobuf/DoubleValueOrBuilder.java           \
+  lite/com/google/protobuf/Duration.java                       \
+  lite/com/google/protobuf/DurationOrBuilder.java              \
+  lite/com/google/protobuf/DurationProto.java                  \
+  lite/com/google/protobuf/FieldMask.java                      \
+  lite/com/google/protobuf/FieldMaskOrBuilder.java             \
+  lite/com/google/protobuf/FieldMaskProto.java                 \
+  lite/com/google/protobuf/FloatValue.java                     \
+  lite/com/google/protobuf/FloatValueOrBuilder.java            \
+  lite/com/google/protobuf/Int32Value.java                     \
+  lite/com/google/protobuf/Int32ValueOrBuilder.java            \
+  lite/com/google/protobuf/Int64Value.java                     \
+  lite/com/google/protobuf/Int64ValueOrBuilder.java            \
+  lite/com/google/protobuf/ListValue.java                      \
+  lite/com/google/protobuf/ListValueOrBuilder.java             \
+  lite/com/google/protobuf/NullValue.java                      \
+  lite/com/google/protobuf/StringValue.java                    \
+  lite/com/google/protobuf/StringValueOrBuilder.java           \
+  lite/com/google/protobuf/Struct.java                         \
+  lite/com/google/protobuf/StructOrBuilder.java                \
+  lite/com/google/protobuf/StructProto.java                    \
+  lite/com/google/protobuf/Timestamp.java                      \
+  lite/com/google/protobuf/TimestampOrBuilder.java             \
+  lite/com/google/protobuf/TimestampProto.java                 \
+  lite/com/google/protobuf/UInt32Value.java                    \
+  lite/com/google/protobuf/UInt32ValueOrBuilder.java           \
+  lite/com/google/protobuf/UInt64Value.java                    \
+  lite/com/google/protobuf/UInt64ValueOrBuilder.java           \
+  lite/com/google/protobuf/Value.java                          \
+  lite/com/google/protobuf/ValueOrBuilder.java                 \
+  lite/com/google/protobuf/WrappersProto.java
 
 bin_PROGRAMS = conformance-test-runner conformance-cpp
 
@@ -191,25 +138,21 @@
   conformance.proto           \
   conformance_python.py       \
   conformance_ruby.rb         \
-  conformance_php.php         \
   failure_list_cpp.txt        \
   failure_list_csharp.txt     \
   failure_list_java.txt       \
-  failure_list_js.txt         \
   failure_list_objc.txt       \
   failure_list_python.txt     \
   failure_list_python_cpp.txt \
   failure_list_python-post26.txt \
-  failure_list_ruby.txt       \
-  failure_list_php.txt        \
-  failure_list_php_c.txt
+  failure_list_ruby.txt
 
 conformance_test_runner_LDADD = $(top_srcdir)/src/libprotobuf.la
 conformance_test_runner_SOURCES = conformance_test.h conformance_test.cc \
                                   conformance_test_runner.cc             \
                                   third_party/jsoncpp/json.h             \
                                   third_party/jsoncpp/jsoncpp.cpp
-nodist_conformance_test_runner_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc google/protobuf/test_messages_proto2.pb.cc
+nodist_conformance_test_runner_SOURCES = conformance.pb.cc
 conformance_test_runner_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)
 conformance_test_runner_CXXFLAGS = -std=c++11
 # Explicit deps beacuse BUILT_SOURCES are only done before a "make all/check"
@@ -219,7 +162,7 @@
 
 conformance_cpp_LDADD = $(top_srcdir)/src/libprotobuf.la
 conformance_cpp_SOURCES = conformance_cpp.cc
-nodist_conformance_cpp_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc google/protobuf/test_messages_proto2.pb.cc
+nodist_conformance_cpp_SOURCES = conformance.pb.cc
 conformance_cpp_CPPFLAGS = -I$(top_srcdir)/src
 # Explicit dep beacuse BUILT_SOURCES are only done before a "make all/check"
 # so a direct "make test_cpp" could fail if parallel enough.
@@ -230,7 +173,7 @@
 bin_PROGRAMS += conformance-objc
 
 conformance_objc_SOURCES = conformance_objc.m ../objectivec/GPBProtocolBuffers.m
-nodist_conformance_objc_SOURCES = Conformance.pbobjc.m google/protobuf/TestMessagesProto2.pbobjc.m google/protobuf/TestMessagesProto3.pbobjc.m
+nodist_conformance_objc_SOURCES = Conformance.pbobjc.m
 # On travis, the build fails without the isysroot because whatever system
 # headers are being found don't include generics support for
 # NSArray/NSDictionary, the only guess is their image at one time had an odd
@@ -239,25 +182,17 @@
 conformance_objc_LDFLAGS = -framework Foundation
 # Explicit dep beacuse BUILT_SOURCES are only done before a "make all/check"
 # so a direct "make test_objc" could fail if parallel enough.
-conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h google/protobuf/TestMessagesProto2.pbobjc.h google/protobuf/TestMessagesProto3.pbobjc.h
+conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h
 
 endif
 
-# JavaScript well-known types are expected to be in a directory called
-# google-protobuf, because they are usually in the google-protobuf npm
-# package.  But we want to use the sources from our tree, so we recreate
-# that directory structure here.
-google-protobuf:
-	mkdir google-protobuf
-
 if USE_EXTERNAL_PROTOC
 
 # Some implementations include pre-generated versions of well-known types.
-protoc_middleman: $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
-	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:. $(conformance_protoc_inputs)
-	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --objc_out=. --python_out=. --js_out=import_style=commonjs,binary:. $(conformance_proto2_protoc_inputs)
-	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. --js_out=import_style=commonjs,binary:google-protobuf $(well_known_type_protoc_inputs)
-	## $(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
+protoc_middleman: $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
+	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. $(conformance_protoc_inputs)
+	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. $(well_known_type_protoc_inputs)
+	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
 	touch protoc_middleman
 
 else
@@ -265,12 +200,11 @@
 # We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
 # relative to srcdir, which may not be the same as the current directory when
 # building out-of-tree.
-protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --objc_out=. --python_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_proto2_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd/google-protobuf $(well_known_type_protoc_inputs) )
-	## @mkdir -p lite
-	## oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
+protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd $(conformance_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd $(well_known_type_protoc_inputs) )
+	@mkdir -p lite
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
 	touch protoc_middleman
 
 endif
@@ -281,13 +215,13 @@
 
 BUILT_SOURCES = $(protoc_outputs) $(other_language_protoc_outputs)
 
-CLEANFILES = $(protoc_outputs) protoc_middleman javac_middleman conformance-java javac_middleman_lite conformance-java-lite conformance-csharp conformance-php conformance-php-c $(other_language_protoc_outputs)
+CLEANFILES = $(protoc_outputs) protoc_middleman javac_middleman conformance-java javac_middleman_lite conformance-java-lite conformance-csharp $(other_language_protoc_outputs)
 
 MAINTAINERCLEANFILES =   \
   Makefile.in
 
 javac_middleman: ConformanceJava.java protoc_middleman $(other_language_protoc_outputs)
-	jar=`ls ../java/util/target/*jar-with-dependencies.jar` && javac -classpath ../java/target/classes:$$jar ConformanceJava.java com/google/protobuf/conformance/Conformance.java com/google/protobuf_test_messages/proto3/TestMessagesProto3.java com/google/protobuf_test_messages/proto2/TestMessagesProto2.java
+	jar=`ls ../java/util/target/*jar-with-dependencies.jar` && javac -classpath ../java/target/classes:$$jar ConformanceJava.java com/google/protobuf/conformance/Conformance.java
 	@touch javac_middleman
 
 conformance-java: javac_middleman
@@ -312,60 +246,36 @@
 conformance-csharp: $(other_language_protoc_outputs)
 	@echo "Writing shortcut script conformance-csharp..."
 	@echo '#! /bin/sh' > conformance-csharp
-	@echo 'dotnet ../csharp/src/Google.Protobuf.Conformance/bin/Release/netcoreapp1.0/Google.Protobuf.Conformance.dll "$$@"' >> conformance-csharp
+	@echo 'mono ../csharp/src/Google.Protobuf.Conformance/bin/Release/Google.Protobuf.Conformance.exe "$$@"' >> conformance-csharp
 	@chmod +x conformance-csharp
 
-conformance-php:
-	@echo "Writing shortcut script conformance-php..."
-	@echo '#! /bin/sh' > conformance-php
-	@echo 'php -d auto_prepend_file=autoload.php ./conformance_php.php' >> conformance-php
-	@chmod +x conformance-php
-
-conformance-php-c:
-	@echo "Writing shortcut script conformance-php-c..."
-	@echo '#! /bin/sh' > conformance-php-c
-	@echo 'php -dextension=../php/ext/google/protobuf/modules/protobuf.so ./conformance_php.php' >> conformance-php-c
-	@chmod +x conformance-php-c
-
 # Targets for actually running tests.
 test_cpp: protoc_middleman conformance-test-runner conformance-cpp
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_cpp.txt ./conformance-cpp
+	./conformance-test-runner --failure_list failure_list_cpp.txt ./conformance-cpp
 
 test_java: protoc_middleman conformance-test-runner conformance-java
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_java.txt ./conformance-java
+	./conformance-test-runner --failure_list failure_list_java.txt ./conformance-java
 
 test_java_lite: protoc_middleman conformance-test-runner conformance-java-lite
-	./conformance-test-runner --enforce_recommended ./conformance-java-lite
+	./conformance-test-runner ./conformance-java-lite
 
 test_csharp: protoc_middleman conformance-test-runner conformance-csharp
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_csharp.txt ./conformance-csharp
+	./conformance-test-runner --failure_list failure_list_csharp.txt ./conformance-csharp
 
 test_ruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
-	RUBYLIB=../ruby/lib:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_ruby.txt ./conformance_ruby.rb
-
-test_php: protoc_middleman conformance-test-runner conformance-php $(other_language_protoc_outputs)
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_php.txt ./conformance-php
-
-test_php_c: protoc_middleman conformance-test-runner conformance-php-c $(other_language_protoc_outputs)
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_php_c.txt ./conformance-php-c
-
-test_php_zts_c: protoc_middleman conformance-test-runner conformance-php-c $(other_language_protoc_outputs)
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_php_zts_c.txt ./conformance-php-c
+	RUBYLIB=../ruby/lib:. ./conformance-test-runner --failure_list failure_list_ruby.txt ./conformance_ruby.rb
 
 # These depend on library paths being properly set up.  The easiest way to
 # run them is to just use "tox" from the python dir.
 test_python: protoc_middleman conformance-test-runner
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_python.txt ./conformance_python.py
+	./conformance-test-runner --failure_list failure_list_python.txt $(CONFORMANCE_PYTHON_EXTRA_FAILURES) ./conformance_python.py
 
 test_python_cpp: protoc_middleman conformance-test-runner
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_python_cpp.txt ./conformance_python.py
-
-test_nodejs: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
-	NODE_PATH=../js:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_js.txt ./conformance_nodejs.js
+	./conformance-test-runner --failure_list failure_list_python_cpp.txt $(CONFORMANCE_PYTHON_EXTRA_FAILURES) ./conformance_python.py
 
 if OBJC_CONFORMANCE_TEST
 
 test_objc: protoc_middleman conformance-test-runner conformance-objc
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_objc.txt ./conformance-objc
+	./conformance-test-runner --failure_list failure_list_objc.txt ./conformance-objc
 
 endif
diff --git a/conformance/README.md b/conformance/README.md
index 971fe8f..9388055 100644
--- a/conformance/README.md
+++ b/conformance/README.md
@@ -19,39 +19,11 @@
 
     $ make
 
-Running the tests for C++
--------------------------
-
-To run the tests against the C++ implementation, run:
+Then to run the tests against the C++ implementation, run:
 
     $ cd conformance && make test_cpp
 
-Running the tests for JavaScript (Node.js)
-------------------------------------------
-
-To run the JavaScript tests against Node.js, make sure you have "node"
-on your path and then run:
-
-    $ cd conformance && make test_nodejs
-
-Running the tests for Ruby (MRI)
---------------------------------
-
-To run the Ruby tests against MRI, first build the C extension:
-
-    $ cd ruby && rake
-
-Then run the tests like so:
-
-    $ cd conformance && make test_ruby
-
-Running the tests for other languages
--------------------------------------
-
-Most of the languages in the Protobuf source tree are set up to run
-conformance tests.  However some of them are more tricky to set up
-properly.  See `tests.sh` in the base of the repository to see how
-Travis runs the tests.
+More tests and languages will be added soon!
 
 Testing other Protocol Buffer implementations
 ---------------------------------------------
diff --git a/conformance/autoload.php b/conformance/autoload.php
deleted file mode 100644
index 0f49aec..0000000
--- a/conformance/autoload.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-define("GOOGLE_INTERNAL_NAMESPACE", "Google\\Protobuf\\Internal\\");
-define("GOOGLE_NAMESPACE", "Google\\Protobuf\\");
-define("GOOGLE_GPBMETADATA_NAMESPACE", "GPBMetadata\\Google\\Protobuf\\");
-
-function protobuf_autoloader_impl($class, $prefix) {
-    $length = strlen($prefix);
-    if ((substr($class, 0, $length) === $prefix)) {
-        $path = '../php/src/' . implode('/', array_map('ucwords', explode('\\', $class))) . '.php';
-        include_once $path;
-    }
-}
-
-function protobuf_autoloader($class) {
-    protobuf_autoloader_impl($class, GOOGLE_INTERNAL_NAMESPACE);
-    protobuf_autoloader_impl($class, GOOGLE_NAMESPACE);
-    protobuf_autoloader_impl($class, GOOGLE_GPBMETADATA_NAMESPACE);
-}
-
-spl_autoload_register('protobuf_autoloader');
diff --git a/conformance/conformance.proto b/conformance/conformance.proto
index 525140e..fc96074 100644
--- a/conformance/conformance.proto
+++ b/conformance/conformance.proto
@@ -32,6 +32,13 @@
 package conformance;
 option java_package = "com.google.protobuf.conformance";
 
+import "google/protobuf/any.proto";
+import "google/protobuf/duration.proto";
+import "google/protobuf/field_mask.proto";
+import "google/protobuf/struct.proto";
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/wrappers.proto";
+
 // This defines the conformance testing protocol.  This protocol exists between
 // the conformance test suite itself and the code being tested.  For each test,
 // the suite will send a ConformanceRequest message and expect a
@@ -63,13 +70,8 @@
 //   2. parse the protobuf or JSON payload in "payload" (which may fail)
 //   3. if the parse succeeded, serialize the message in the requested format.
 message ConformanceRequest {
-  // The payload (whether protobuf of JSON) is always for a
-  // protobuf_test_messages.proto3.TestAllTypes proto (as defined in
-  // src/google/protobuf/proto3_test_messages.proto).
-  //
-  // TODO(haberman): if/when we expand the conformance tests to support proto2,
-  // we will want to include a field that lets the payload/response be a
-  // protobuf_test_messages.proto2.TestAllTypes message instead.
+  // The payload (whether protobuf of JSON) is always for a TestAllTypes proto
+  // (see below).
   oneof payload {
     bytes protobuf_payload = 1;
     string json_payload = 2;
@@ -77,11 +79,6 @@
 
   // Which format should the testee serialize its message to?
   WireFormat requested_output_format = 3;
-
-  // The full name for the test message to use; for the moment, either:
-  // protobuf_test_messages.proto3.TestAllTypesProto3 or
-  // protobuf_test_messages.proto2.TestAllTypesProto2.
-  string message_type = 4;
 }
 
 // Represents a single test case's output.
@@ -117,3 +114,160 @@
     string skipped = 5;
   }
 }
+
+// This proto includes every type of field in both singular and repeated
+// forms.
+message TestAllTypes {
+  message NestedMessage {
+    int32 a = 1;
+    TestAllTypes corecursive = 2;
+  }
+
+  enum NestedEnum {
+    FOO = 0;
+    BAR = 1;
+    BAZ = 2;
+    NEG = -1;  // Intentionally negative.
+  }
+
+  // Singular
+  int32 optional_int32    =  1;
+  int64 optional_int64    =  2;
+  uint32 optional_uint32   =  3;
+  uint64 optional_uint64   =  4;
+  sint32 optional_sint32   =  5;
+  sint64 optional_sint64   =  6;
+  fixed32 optional_fixed32  =  7;
+  fixed64 optional_fixed64  =  8;
+  sfixed32 optional_sfixed32 =  9;
+  sfixed64 optional_sfixed64 = 10;
+  float optional_float    = 11;
+  double optional_double   = 12;
+  bool optional_bool     = 13;
+  string optional_string   = 14;
+  bytes optional_bytes    = 15;
+
+  NestedMessage                        optional_nested_message  = 18;
+  ForeignMessage                       optional_foreign_message = 19;
+
+  NestedEnum                           optional_nested_enum     = 21;
+  ForeignEnum                          optional_foreign_enum    = 22;
+
+  string optional_string_piece = 24 [ctype=STRING_PIECE];
+  string optional_cord = 25 [ctype=CORD];
+
+  TestAllTypes recursive_message = 27;
+
+  // Repeated
+  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   string repeated_string   = 44;
+  repeated    bytes repeated_bytes    = 45;
+
+  repeated NestedMessage                        repeated_nested_message  = 48;
+  repeated ForeignMessage                       repeated_foreign_message = 49;
+
+  repeated NestedEnum                           repeated_nested_enum     = 51;
+  repeated ForeignEnum                          repeated_foreign_enum    = 52;
+
+  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
+  repeated string repeated_cord = 55 [ctype=CORD];
+
+  // Map
+  map <   int32, int32>    map_int32_int32 = 56;
+  map <   int64, int64>    map_int64_int64 = 57;
+  map <  uint32, uint32>   map_uint32_uint32 = 58;
+  map <  uint64, uint64>   map_uint64_uint64 = 59;
+  map <  sint32, sint32>   map_sint32_sint32 = 60;
+  map <  sint64, sint64>   map_sint64_sint64 = 61;
+  map < fixed32, fixed32>  map_fixed32_fixed32 = 62;
+  map < fixed64, fixed64>  map_fixed64_fixed64 = 63;
+  map <sfixed32, sfixed32> map_sfixed32_sfixed32 = 64;
+  map <sfixed64, sfixed64> map_sfixed64_sfixed64 = 65;
+  map <   int32, float>    map_int32_float = 66;
+  map <   int32, double>   map_int32_double = 67;
+  map <    bool, bool>     map_bool_bool = 68;
+  map <  string, string>   map_string_string = 69;
+  map <  string, bytes>    map_string_bytes = 70;
+  map <  string, NestedMessage>  map_string_nested_message = 71;
+  map <  string, ForeignMessage> map_string_foreign_message = 72;
+  map <  string, NestedEnum>     map_string_nested_enum = 73;
+  map <  string, ForeignEnum>    map_string_foreign_enum = 74;
+
+  oneof oneof_field {
+    uint32 oneof_uint32 = 111;
+    NestedMessage oneof_nested_message = 112;
+    string oneof_string = 113;
+    bytes oneof_bytes = 114;
+  }
+
+  // Well-known types
+  google.protobuf.BoolValue optional_bool_wrapper = 201;
+  google.protobuf.Int32Value optional_int32_wrapper = 202;
+  google.protobuf.Int64Value optional_int64_wrapper = 203;
+  google.protobuf.UInt32Value optional_uint32_wrapper = 204;
+  google.protobuf.UInt64Value optional_uint64_wrapper = 205;
+  google.protobuf.FloatValue optional_float_wrapper = 206;
+  google.protobuf.DoubleValue optional_double_wrapper = 207;
+  google.protobuf.StringValue optional_string_wrapper = 208;
+  google.protobuf.BytesValue optional_bytes_wrapper = 209;
+
+  repeated google.protobuf.BoolValue repeated_bool_wrapper = 211;
+  repeated google.protobuf.Int32Value repeated_int32_wrapper = 212;
+  repeated google.protobuf.Int64Value repeated_int64_wrapper = 213;
+  repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214;
+  repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215;
+  repeated google.protobuf.FloatValue repeated_float_wrapper = 216;
+  repeated google.protobuf.DoubleValue repeated_double_wrapper = 217;
+  repeated google.protobuf.StringValue repeated_string_wrapper = 218;
+  repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219;
+
+  google.protobuf.Duration optional_duration = 301;
+  google.protobuf.Timestamp optional_timestamp = 302;
+  google.protobuf.FieldMask optional_field_mask = 303;
+  google.protobuf.Struct optional_struct = 304;
+  google.protobuf.Any optional_any = 305;
+  google.protobuf.Value optional_value = 306;
+
+  repeated google.protobuf.Duration repeated_duration = 311;
+  repeated google.protobuf.Timestamp repeated_timestamp = 312;
+  repeated google.protobuf.FieldMask repeated_fieldmask = 313;
+  repeated google.protobuf.Struct repeated_struct = 324;
+  repeated google.protobuf.Any repeated_any = 315;
+  repeated google.protobuf.Value repeated_value = 316;
+
+  // Test field-name-to-JSON-name convention.
+  int32 fieldname1 = 401;
+  int32 field_name2 = 402;
+  int32 _field_name3 = 403;
+  int32 field__name4_ = 404;
+  int32 field0name5 = 405;
+  int32 field_0_name6 = 406;
+  int32 fieldName7 = 407;
+  int32 FieldName8 = 408;
+  int32 field_Name9 = 409;
+  int32 Field_Name10 = 410;
+  int32 FIELD_NAME11 = 411;
+  int32 FIELD_name12 = 412;
+}
+
+message ForeignMessage {
+  int32 c = 1;
+}
+
+enum ForeignEnum {
+  FOREIGN_FOO = 0;
+  FOREIGN_BAR = 1;
+  FOREIGN_BAZ = 2;
+}
diff --git a/conformance/conformance_cpp.cc b/conformance/conformance_cpp.cc
index 9540b50..1a26549 100644
--- a/conformance/conformance_cpp.cc
+++ b/conformance/conformance_cpp.cc
@@ -33,26 +33,20 @@
 #include <unistd.h>
 
 #include "conformance.pb.h"
-#include <google/protobuf/test_messages_proto3.pb.h>
-#include <google/protobuf/test_messages_proto2.pb.h>
-#include <google/protobuf/message.h>
 #include <google/protobuf/util/json_util.h>
 #include <google/protobuf/util/type_resolver_util.h>
 
 using conformance::ConformanceRequest;
 using conformance::ConformanceResponse;
+using conformance::TestAllTypes;
 using google::protobuf::Descriptor;
 using google::protobuf::DescriptorPool;
-using google::protobuf::Message;
-using google::protobuf::MessageFactory;
 using google::protobuf::internal::scoped_ptr;
 using google::protobuf::util::BinaryToJsonString;
 using google::protobuf::util::JsonToBinaryString;
 using google::protobuf::util::NewTypeResolverForDescriptorPool;
 using google::protobuf::util::Status;
 using google::protobuf::util::TypeResolver;
-using protobuf_test_messages::proto3::TestAllTypesProto3;
-using protobuf_test_messages::proto2::TestAllTypesProto2;
 using std::string;
 
 static const char kTypeUrlPrefix[] = "type.googleapis.com";
@@ -92,24 +86,17 @@
 }
 
 void DoTest(const ConformanceRequest& request, ConformanceResponse* response) {
-  Message *test_message;
-  const Descriptor *descriptor = DescriptorPool::generated_pool()->FindMessageTypeByName(
-      request.message_type());
-  if (!descriptor) {
-    GOOGLE_LOG(FATAL) << "No such message type: " << request.message_type();
-  }
-  test_message = MessageFactory::generated_factory()->GetPrototype(descriptor)->New();
+  TestAllTypes test_message;
 
   switch (request.payload_case()) {
-    case ConformanceRequest::kProtobufPayload: {
-      if (!test_message->ParseFromString(request.protobuf_payload())) {
+    case ConformanceRequest::kProtobufPayload:
+      if (!test_message.ParseFromString(request.protobuf_payload())) {
         // Getting parse details would involve something like:
         //   http://stackoverflow.com/questions/22121922/how-can-i-get-more-details-about-errors-generated-during-protobuf-parsing-c
         response->set_parse_error("Parse error (no more details available).");
         return;
       }
       break;
-    }
 
     case ConformanceRequest::kJsonPayload: {
       string proto_binary;
@@ -121,7 +108,7 @@
         return;
       }
 
-      if (!test_message->ParseFromString(proto_binary)) {
+      if (!test_message.ParseFromString(proto_binary)) {
         response->set_runtime_error(
             "Parsing JSON generates invalid proto output.");
         return;
@@ -139,14 +126,14 @@
       GOOGLE_LOG(FATAL) << "Unspecified output format";
       break;
 
-    case conformance::PROTOBUF: {
-      GOOGLE_CHECK(test_message->SerializeToString(response->mutable_protobuf_payload()));
+    case conformance::PROTOBUF:
+      GOOGLE_CHECK(
+          test_message.SerializeToString(response->mutable_protobuf_payload()));
       break;
-    }
 
     case conformance::JSON: {
       string proto_binary;
-      GOOGLE_CHECK(test_message->SerializeToString(&proto_binary));
+      GOOGLE_CHECK(test_message.SerializeToString(&proto_binary));
       Status status = BinaryToJsonString(type_resolver, *type_url, proto_binary,
                                          response->mutable_json_payload());
       if (!status.ok()) {
@@ -209,7 +196,7 @@
 int main() {
   type_resolver = NewTypeResolverForDescriptorPool(
       kTypeUrlPrefix, DescriptorPool::generated_pool());
-  type_url = new string(GetTypeUrl(TestAllTypesProto3::descriptor()));
+  type_url = new string(GetTypeUrl(TestAllTypes::descriptor()));
   while (1) {
     if (!DoTestIo()) {
       fprintf(stderr, "conformance-cpp: received EOF from test runner "
diff --git a/conformance/conformance_nodejs.js b/conformance/conformance_nodejs.js
deleted file mode 100755
index 5d3955f..0000000
--- a/conformance/conformance_nodejs.js
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/usr/bin/env node
-
-/*
- * 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.
- */
-
-var conformance = require('conformance_pb');
-var test_messages_proto3 = require('google/protobuf/test_messages_proto3_pb');
-var test_messages_proto2 = require('google/protobuf/test_messages_proto2_pb');
-var fs = require('fs');
-
-var testCount = 0;
-
-function doTest(request) {
-  var testMessage;
-  var response = new conformance.ConformanceResponse();
-
-  try {
-    if (request.getRequestedOutputFormat() === conformance.WireFormat.JSON) {
-      response.setSkipped("JSON not supported.");
-      return response;
-    }
-
-    switch (request.getPayloadCase()) {
-      case conformance.ConformanceRequest.PayloadCase.PROTOBUF_PAYLOAD: {
-        if (request.getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
-          try {
-            testMessage = test_messages_proto3.TestAllTypesProto3.deserializeBinary(
-                request.getProtobufPayload());
-          } catch (err) {
-            response.setParseError(err.toString());
-            return response;
-          }
-        } else if (request.getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2"){
-          try {
-            testMessage = test_messages_proto2.TestAllTypesProto2.deserializeBinary(
-                request.getProtobufPayload());
-          } catch (err) {
-            response.setParseError(err.toString());
-            return response;
-          }
-        } else {
-          throw "Protobuf request doesn\'t have specific payload type";
-        }
-      }
-
-      case conformance.ConformanceRequest.PayloadCase.JSON_PAYLOAD:
-        response.setSkipped("JSON not supported.");
-        return response;
-
-      case conformance.ConformanceRequest.PayloadCase.PAYLOAD_NOT_SET:
-        response.setRuntimeError("Request didn't have payload");
-        return response;
-    }
-
-    switch (request.getRequestedOutputFormat()) {
-      case conformance.WireFormat.UNSPECIFIED:
-        response.setRuntimeError("Unspecified output format");
-        return response;
-
-      case conformance.WireFormat.PROTOBUF:
-        response.setProtobufPayload(testMessage.serializeBinary());
-
-      case conformance.WireFormat.JSON:
-        response.setSkipped("JSON not supported.");
-        return response;
-
-      default:
-        throw "Request didn't have requested output format";
-    }
-  } catch (err) {
-    response.setRuntimeError(err.toString());
-  }
-
-  return response;
-}
-
-function onEof(totalRead) {
-  if (totalRead == 0) {
-    return undefined;
-  } else {
-    throw "conformance_nodejs: premature EOF on stdin.";
-  }
-}
-
-// Utility function to read a buffer of N bytes.
-function readBuffer(bytes) {
-  var buf = new Buffer(bytes);
-  var totalRead = 0;
-  while (totalRead < bytes) {
-    var read = 0;
-    try {
-      read = fs.readSync(process.stdin.fd, buf, totalRead, bytes - totalRead);
-    } catch (e) {
-      if (e.code == 'EOF') {
-        return onEof(totalRead)
-      } else if (e.code == 'EAGAIN') {
-      } else {
-        throw "conformance_nodejs: Error reading from stdin." + e;
-      }
-    }
-
-    totalRead += read;
-  }
-
-  return buf;
-}
-
-function writeBuffer(buffer) {
-  var totalWritten = 0;
-  while (totalWritten < buffer.length) {
-    totalWritten += fs.writeSync(
-        process.stdout.fd, buffer, totalWritten, buffer.length - totalWritten);
-  }
-}
-
-// Returns true if the test ran successfully, false on legitimate EOF.
-// If EOF is encountered in an unexpected place, raises IOError.
-function doTestIo() {
-  var lengthBuf = readBuffer(4);
-  if (!lengthBuf) {
-    return false;
-  }
-
-  var length = lengthBuf.readInt32LE(0);
-  var serializedRequest = readBuffer(length);
-  if (!serializedRequest) {
-    throw "conformance_nodejs: Failed to read request.";
-  }
-
-  serializedRequest = new Uint8Array(serializedRequest);
-  var request =
-      conformance.ConformanceRequest.deserializeBinary(serializedRequest);
-  var response = doTest(request);
-
-  var serializedResponse = response.serializeBinary();
-
-  lengthBuf = new Buffer(4);
-  lengthBuf.writeInt32LE(serializedResponse.length, 0);
-  writeBuffer(lengthBuf);
-  writeBuffer(new Buffer(serializedResponse));
-
-  testCount += 1
-
-  return true;
-}
-
-while (true) {
-  if (!doTestIo()) {
-    console.error('conformance_nodejs: received EOF from test runner ' +
-                  "after " + testCount + " tests, exiting")
-    break;
-  }
-}
diff --git a/conformance/conformance_objc.m b/conformance/conformance_objc.m
index 84a4381..1124bfe 100644
--- a/conformance/conformance_objc.m
+++ b/conformance/conformance_objc.m
@@ -31,8 +31,6 @@
 #import <Foundation/Foundation.h>
 
 #import "Conformance.pbobjc.h"
-#import "google/protobuf/TestMessagesProto2.pbobjc.h"
-#import "google/protobuf/TestMessagesProto3.pbobjc.h"
 
 static void Die(NSString *format, ...) __dead2;
 
@@ -64,7 +62,7 @@
 
 static ConformanceResponse *DoTest(ConformanceRequest *request) {
   ConformanceResponse *response = [ConformanceResponse message];
-  GPBMessage *testMessage = nil;
+  TestAllTypes *testMessage = nil;
 
   switch (request.payloadOneOfCase) {
     case ConformanceRequest_Payload_OneOfCase_GPBUnsetOneOfCase:
@@ -72,16 +70,9 @@
       break;
 
     case ConformanceRequest_Payload_OneOfCase_ProtobufPayload: {
-      Class msgClass = nil;
-      if ([request.messageType isEqual:@"protobuf_test_messages.proto3.TestAllTypesProto3"]) {
-        msgClass = [Proto3TestAllTypesProto3 class];
-      } else if ([request.messageType isEqual:@"protobuf_test_messages.proto2.TestAllTypesProto2"]) {
-        msgClass = [TestAllTypesProto2 class];
-      } else {
-        Die(@"Protobuf request had an unknown message_type: %@", request.messageType);
-      }
       NSError *error = nil;
-      testMessage = [msgClass parseFromData:request.protobufPayload error:&error];
+      testMessage = [TestAllTypes parseFromData:request.protobufPayload
+                                          error:&error];
       if (!testMessage) {
         response.parseError =
             [NSString stringWithFormat:@"Parse error: %@", error];
diff --git a/conformance/conformance_php.php b/conformance/conformance_php.php
deleted file mode 100755
index 19f9a09..0000000
--- a/conformance/conformance_php.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-require_once("Conformance/WireFormat.php");
-require_once("Conformance/ConformanceResponse.php");
-require_once("Conformance/ConformanceRequest.php");
-require_once("Protobuf_test_messages/Proto3/ForeignMessage.php");
-require_once("Protobuf_test_messages/Proto3/ForeignEnum.php");
-require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php");
-require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3_NestedMessage.php");
-require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3_NestedEnum.php");
-
-require_once("GPBMetadata/Conformance.php");
-require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
-
-use  \Conformance\WireFormat;
-
-if (!ini_get("date.timezone")) {
-  ini_set("date.timezone", "UTC");
-}
-
-$test_count = 0;
-
-function doTest($request)
-{
-    $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3();
-    $response = new \Conformance\ConformanceResponse();
-    if ($request->getPayload() == "protobuf_payload") {
-      if ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
-        try {
-          $test_message->mergeFromString($request->getProtobufPayload());
-        } catch (Exception $e) {
-          $response->setParseError($e->getMessage());
-          return $response;
-        }
-      } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") {
-        $response->setSkipped("PHP doesn't support proto2");
-        return $response;
-      } else {
-        trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR);
-      }
-    } elseif ($request->getPayload() == "json_payload") {
-      try {
-          $test_message->mergeFromJsonString($request->getJsonPayload());
-      } catch (Exception $e) {
-          $response->setParseError($e->getMessage());
-          return $response;
-      }
-    } else {
-      trigger_error("Request didn't have payload.", E_USER_ERROR);
-    }
-
-    if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) {
-      trigger_error("Unspecified output format.", E_USER_ERROR);
-    } elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) {
-      $response->setProtobufPayload($test_message->serializeToString());
-    } elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) {
-      try {
-          $response->setJsonPayload($test_message->serializeToJsonString());
-      } catch (Exception $e) {
-          $response->setSerializeError($e->getMessage());
-          return $response;
-      }
-    }
-
-    return $response;
-}
-
-function doTestIO()
-{
-    $length_bytes = fread(STDIN, 4);
-    if (strlen($length_bytes) == 0) {
-      return false;   # EOF
-    } elseif (strlen($length_bytes) != 4) {
-      fwrite(STDERR, "I/O error\n");
-      return false;
-    }
-
-    $length = unpack("V", $length_bytes)[1];
-    $serialized_request = fread(STDIN, $length);
-    if (strlen($serialized_request) != $length) {
-      trigger_error("I/O error", E_USER_ERROR);
-    }
-
-    $request = new \Conformance\ConformanceRequest();
-    $request->mergeFromString($serialized_request);
-
-    $response = doTest($request);
-
-    $serialized_response = $response->serializeToString();
-    fwrite(STDOUT, pack("V", strlen($serialized_response)));
-    fwrite(STDOUT, $serialized_response);
-
-    $GLOBALS['test_count'] += 1;
-
-    return true;
-}
-
-while(true){
-  if (!doTestIO()) {
-      fprintf(STDERR,
-             "conformance_php: received EOF from test runner " +
-             "after %d tests, exiting\n", $test_count);
-      exit;
-  }
-}
diff --git a/conformance/conformance_python.py b/conformance/conformance_python.py
index c5ba246..a490c8e 100755
--- a/conformance/conformance_python.py
+++ b/conformance/conformance_python.py
@@ -38,12 +38,8 @@
 import struct
 import sys
 import os
-from google.protobuf import descriptor
-from google.protobuf import descriptor_pool
-from google.protobuf import json_format
 from google.protobuf import message
-from google.protobuf import test_messages_proto3_pb2
-from google.protobuf import test_messages_proto2_pb2
+from google.protobuf import json_format
 import conformance_pb2
 
 sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
@@ -56,17 +52,9 @@
   pass
 
 def do_test(request):
-  isProto3 = (request.message_type == "protobuf_test_messages.proto3.TestAllTypesProto3")
-  isJson = (request.WhichOneof('payload') == 'json_payload')
-  isProto2 = (request.message_type == "protobuf_test_messages.proto2.TestAllTypesProto2")
-  
-  if (not isProto3) and (not isJson) and (not isProto2):
-    raise ProtocolError("Protobuf request doesn't have specific payload type")
-      
-  test_message = test_messages_proto2_pb2.TestAllTypesProto2() if isProto2 else \
-    test_messages_proto3_pb2.TestAllTypesProto3()
-
+  test_message = conformance_pb2.TestAllTypes()
   response = conformance_pb2.ConformanceResponse()
+  test_message = conformance_pb2.TestAllTypes()
 
   try:
     if request.WhichOneof('payload') == 'protobuf_payload':
@@ -74,12 +62,12 @@
         test_message.ParseFromString(request.protobuf_payload)
       except message.DecodeError as e:
         response.parse_error = str(e)
-        return response  
-      
+        return response
+
     elif request.WhichOneof('payload') == 'json_payload':
       try:
         json_format.Parse(request.json_payload, test_message)
-      except Exception as e:
+      except json_format.ParseError as e:
         response.parse_error = str(e)
         return response
 
@@ -93,11 +81,7 @@
       response.protobuf_payload = test_message.SerializeToString()
 
     elif request.requested_output_format == conformance_pb2.JSON:
-      try: 
-        response.json_payload = json_format.MessageToJson(test_message)
-      except Exception as e:
-        response.serialize_error = str(e)
-        return response
+      response.json_payload = json_format.MessageToJson(test_message)
 
   except Exception as e:
     response.runtime_error = str(e)
diff --git a/conformance/conformance_ruby.rb b/conformance/conformance_ruby.rb
index df63bf7..c716fac 100755
--- a/conformance/conformance_ruby.rb
+++ b/conformance/conformance_ruby.rb
@@ -30,38 +30,29 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-require 'conformance_pb'
-require 'google/protobuf/test_messages_proto3_pb'
+require 'conformance'
 
 $test_count = 0
 $verbose = false
 
 def do_test(request)
-  test_message = ProtobufTestMessages::Proto3::TestAllTypesProto3.new
+  test_message = Conformance::TestAllTypes.new
   response = Conformance::ConformanceResponse.new
 
   begin
     case request.payload
     when :protobuf_payload
-      if request.message_type.eql?('protobuf_test_messages.proto3.TestAllTypesProto3')
-        begin
-          test_message = ProtobufTestMessages::Proto3::TestAllTypesProto3.decode(
-              request.protobuf_payload)
-        rescue Google::Protobuf::ParseError => err
-          response.parse_error = err.message.encode('utf-8')
-          return response
-        end
-      elsif request.message_type.eql?('protobuf_test_messages.proto2.TestAllTypesProto2')
-        response.skipped = "Ruby doesn't support proto2"
+      begin
+        test_message =
+          Conformance::TestAllTypes.decode(request.protobuf_payload)
+      rescue Google::Protobuf::ParseError => err
+        response.parse_error = err.message.encode('utf-8')
         return response
-      else 
-        fail "Protobuf request doesn't have specific payload type"
       end
 
     when :json_payload
       begin
-        test_message = ProtobufTestMessages::Proto3::TestAllTypesProto3.decode_json(
-            request.json_payload)
+        test_message = Conformance::TestAllTypes.decode_json(request.json_payload)
       rescue Google::Protobuf::ParseError => err
         response.parse_error = err.message.encode('utf-8')
         return response
diff --git a/conformance/conformance_test.cc b/conformance/conformance_test.cc
index 98c2eae..fc0605b 100644
--- a/conformance/conformance_test.cc
+++ b/conformance/conformance_test.cc
@@ -30,18 +30,14 @@
 
 #include <stdarg.h>
 #include <string>
-#include <fstream>
 
 #include "conformance.pb.h"
 #include "conformance_test.h"
-#include <google/protobuf/test_messages_proto3.pb.h>
-#include <google/protobuf/test_messages_proto2.pb.h>
-
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/text_format.h>
-#include <google/protobuf/util/field_comparator.h>
 #include <google/protobuf/util/json_util.h>
+#include <google/protobuf/util/field_comparator.h>
 #include <google/protobuf/util/message_differencer.h>
 #include <google/protobuf/util/type_resolver_util.h>
 #include <google/protobuf/wire_format_lite.h>
@@ -50,6 +46,7 @@
 
 using conformance::ConformanceRequest;
 using conformance::ConformanceResponse;
+using conformance::TestAllTypes;
 using conformance::WireFormat;
 using google::protobuf::Descriptor;
 using google::protobuf::FieldDescriptor;
@@ -60,8 +57,6 @@
 using google::protobuf::util::MessageDifferencer;
 using google::protobuf::util::NewTypeResolverForDescriptorPool;
 using google::protobuf::util::Status;
-using protobuf_test_messages::proto3::TestAllTypesProto3;
-using protobuf_test_messages::proto2::TestAllTypesProto2;
 using std::string;
 
 namespace {
@@ -111,18 +106,13 @@
 // The maximum number of bytes that it takes to encode a 64-bit varint.
 #define VARINT_MAX_LEN 10
 
-size_t vencode64(uint64_t val, int over_encoded_bytes, char *buf) {
+size_t vencode64(uint64_t val, char *buf) {
   if (val == 0) { buf[0] = 0; return 1; }
   size_t i = 0;
   while (val) {
     uint8_t byte = val & 0x7fU;
     val >>= 7;
-    if (val || over_encoded_bytes) byte |= 0x80U;
-    buf[i++] = byte;
-  }
-  while (over_encoded_bytes--) {
-    assert(i < 10);
-    uint8_t byte = over_encoded_bytes ? 0x80 : 0;
+    if (val) byte |= 0x80U;
     buf[i++] = byte;
   }
   return i;
@@ -130,15 +120,7 @@
 
 string varint(uint64_t x) {
   char buf[VARINT_MAX_LEN];
-  size_t len = vencode64(x, 0, buf);
-  return string(buf, len);
-}
-
-// Encodes a varint that is |extra| bytes longer than it needs to be, but still
-// valid.
-string longvarint(uint64_t x, int extra) {
-  char buf[VARINT_MAX_LEN];
-  size_t len = vencode64(x, extra, buf);
+  size_t len = vencode64(x, buf);
   return string(buf, len);
 }
 
@@ -147,8 +129,8 @@
 string fixed64(void *data) { return string(static_cast<char*>(data), 8); }
 
 string delim(const string& buf) { return cat(varint(buf.size()), buf); }
-string u32(uint32_t u32) { return fixed32(&u32); }
-string u64(uint64_t u64) { return fixed64(&u64); }
+string uint32(uint32_t u32) { return fixed32(&u32); }
+string uint64(uint64_t u64) { return fixed64(&u64); }
 string flt(float f) { return fixed32(&f); }
 string dbl(double d) { return fixed64(&d); }
 string zz32(int32_t x) { return varint(WireFormatLite::ZigZagEncode32(x)); }
@@ -164,19 +146,16 @@
 
 #define UNKNOWN_FIELD 666
 
-const FieldDescriptor* GetFieldForType(FieldDescriptor::Type type,
-                                       bool repeated, bool isProto3) {
-
-  const Descriptor* d = isProto3 ?
-      TestAllTypesProto3().GetDescriptor() : TestAllTypesProto2().GetDescriptor();
+uint32_t GetFieldNumberForType(FieldDescriptor::Type type, bool repeated) {
+  const Descriptor* d = TestAllTypes().GetDescriptor();
   for (int i = 0; i < d->field_count(); i++) {
     const FieldDescriptor* f = d->field(i);
     if (f->type() == type && f->is_repeated() == repeated) {
-      return f;
+      return f->number();
     }
   }
   GOOGLE_LOG(FATAL) << "Couldn't find field with type " << (int)type;
-  return nullptr;
+  return 0;
 }
 
 string UpperCase(string str) {
@@ -203,7 +182,6 @@
 }
 
 void ConformanceTestSuite::ReportFailure(const string& test_name,
-                                         ConformanceLevel level,
                                          const ConformanceRequest& request,
                                          const ConformanceResponse& response,
                                          const char* fmt, ...) {
@@ -211,8 +189,6 @@
     expected_failures_++;
     if (!verbose_)
       return;
-  } else if (level == RECOMMENDED && !enforce_recommended_) {
-    StringAppendF(&output_, "WARNING, test=%s: ", test_name.c_str());
   } else {
     StringAppendF(&output_, "ERROR, test=%s: ", test_name.c_str());
     unexpected_failing_tests_.insert(test_name);
@@ -237,15 +213,6 @@
   skipped_.insert(test_name);
 }
 
-string ConformanceTestSuite::ConformanceLevelToString(ConformanceLevel level) {
-  switch (level) {
-    case REQUIRED: return "Required";
-    case RECOMMENDED: return "Recommended";
-  }
-  GOOGLE_LOG(FATAL) << "Unknown value: " << level;
-  return "";
-}
-
 void ConformanceTestSuite::RunTest(const string& test_name,
                                    const ConformanceRequest& request,
                                    ConformanceResponse* response) {
@@ -273,65 +240,25 @@
 }
 
 void ConformanceTestSuite::RunValidInputTest(
-    const string& test_name, ConformanceLevel level, const string& input,
-    WireFormat input_format, const string& equivalent_text_format,
-    WireFormat requested_output, bool isProto3) {
-  auto newTestMessage = [&isProto3]() {
-    Message* newMessage;
-    if (isProto3) {
-      newMessage = new TestAllTypesProto3;
-    } else {
-      newMessage = new TestAllTypesProto2;
-    }
-    return newMessage;
-  };
-  Message* reference_message = newTestMessage();
+    const string& test_name, const string& input, WireFormat input_format,
+    const string& equivalent_text_format, WireFormat requested_output) {
+  TestAllTypes reference_message;
   GOOGLE_CHECK(
-      TextFormat::ParseFromString(equivalent_text_format, reference_message))
+      TextFormat::ParseFromString(equivalent_text_format, &reference_message))
           << "Failed to parse data for test case: " << test_name
           << ", data: " << equivalent_text_format;
-  const string equivalent_wire_format = reference_message->SerializeAsString();
-  RunValidBinaryInputTest(test_name, level, input, input_format,
-                          equivalent_wire_format, requested_output, isProto3);
-}
-
-void ConformanceTestSuite::RunValidBinaryInputTest(
-    const string& test_name, ConformanceLevel level, const string& input,
-    WireFormat input_format, const string& equivalent_wire_format,
-    WireFormat requested_output, bool isProto3) {
-  auto newTestMessage = [&isProto3]() {
-    Message* newMessage;
-    if (isProto3) {
-      newMessage = new TestAllTypesProto3;
-    } else {
-      newMessage = new TestAllTypesProto2;
-    }
-    return newMessage;
-  };
-  Message* reference_message = newTestMessage();
-  GOOGLE_CHECK(
-      reference_message->ParseFromString(equivalent_wire_format))
-          << "Failed to parse wire data for test case: " << test_name;
 
   ConformanceRequest request;
   ConformanceResponse response;
 
   switch (input_format) {
-    case conformance::PROTOBUF: {
+    case conformance::PROTOBUF:
       request.set_protobuf_payload(input);
-      if (isProto3) {
-        request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
-      } else {
-        request.set_message_type("protobuf_test_messages.proto2.TestAllTypesProto2");
-      }
       break;
-    }
 
-    case conformance::JSON: {
-      request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
+    case conformance::JSON:
       request.set_json_payload(input);
       break;
-    }
 
     default:
       GOOGLE_LOG(FATAL) << "Unspecified input format";
@@ -341,19 +268,14 @@
 
   RunTest(test_name, request, &response);
 
-  Message *test_message = newTestMessage();
+  TestAllTypes test_message;
 
   switch (response.result_case()) {
-    case ConformanceResponse::RESULT_NOT_SET:
-      ReportFailure(test_name, level, request, response,
-                    "Response didn't have any field in the Response.");
-      return;
-
     case ConformanceResponse::kParseError:
     case ConformanceResponse::kRuntimeError:
     case ConformanceResponse::kSerializeError:
-      ReportFailure(test_name, level, request, response,
-                    "Failed to parse input or produce output.");
+      ReportFailure(test_name, request, response,
+                    "Failed to parse JSON input or produce JSON output.");
       return;
 
     case ConformanceResponse::kSkipped:
@@ -363,7 +285,7 @@
     case ConformanceResponse::kJsonPayload: {
       if (requested_output != conformance::JSON) {
         ReportFailure(
-            test_name, level, request, response,
+            test_name, request, response,
             "Test was asked for protobuf output but provided JSON instead.");
         return;
       }
@@ -372,15 +294,15 @@
           JsonToBinaryString(type_resolver_.get(), type_url_,
                              response.json_payload(), &binary_protobuf);
       if (!status.ok()) {
-        ReportFailure(test_name, level, request, response,
+        ReportFailure(test_name, request, response,
                       "JSON output we received from test was unparseable.");
         return;
       }
 
-      if (!test_message->ParseFromString(binary_protobuf)) {
-        ReportFailure(test_name, level, request, response,
-                    "INTERNAL ERROR: internal JSON->protobuf transcode "
-                    "yielded unparseable proto.");
+      if (!test_message.ParseFromString(binary_protobuf)) {
+        ReportFailure(test_name, request, response,
+                      "INTERNAL ERROR: internal JSON->protobuf transcode "
+                      "yielded unparseable proto.");
         return;
       }
 
@@ -390,14 +312,14 @@
     case ConformanceResponse::kProtobufPayload: {
       if (requested_output != conformance::PROTOBUF) {
         ReportFailure(
-            test_name, level, request, response,
+            test_name, request, response,
             "Test was asked for JSON output but provided protobuf instead.");
         return;
       }
 
-      if (!test_message->ParseFromString(response.protobuf_payload())) {
-        ReportFailure(test_name, level, request, response,
-                   "Protobuf output we received from test was unparseable.");
+      if (!test_message.ParseFromString(response.protobuf_payload())) {
+        ReportFailure(test_name, request, response,
+                      "Protobuf output we received from test was unparseable.");
         return;
       }
 
@@ -416,30 +338,22 @@
   string differences;
   differencer.ReportDifferencesToString(&differences);
 
-  bool check;
-  check = differencer.Compare(*reference_message, *test_message);
-  if (check) {
+  if (differencer.Compare(reference_message, test_message)) {
     ReportSuccess(test_name);
   } else {
-    ReportFailure(test_name, level, request, response,
+    ReportFailure(test_name, request, response,
                   "Output was not equivalent to reference message: %s.",
                   differences.c_str());
   }
 }
-void ConformanceTestSuite::ExpectParseFailureForProtoWithProtoVersion (
-    const string& proto, const string& test_name, ConformanceLevel level,
-    bool isProto3) {
+
+// Expect that this precise protobuf will cause a parse error.
+void ConformanceTestSuite::ExpectParseFailureForProto(
+    const string& proto, const string& test_name) {
   ConformanceRequest request;
   ConformanceResponse response;
   request.set_protobuf_payload(proto);
-  if (isProto3) {
-    request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
-  } else {
-    request.set_message_type("protobuf_test_messages.proto2.TestAllTypesProto2");
-  }
-  string effective_test_name = ConformanceLevelToString(level) +
-      (isProto3 ? ".Proto3" : ".Proto2") +
-      ".ProtobufInput." + test_name;
+  string effective_test_name = "ProtobufInput." + test_name;
 
   // We don't expect output, but if the program erroneously accepts the protobuf
   // we let it send its response as this.  We must not leave it unspecified.
@@ -451,87 +365,38 @@
   } else if (response.result_case() == ConformanceResponse::kSkipped) {
     ReportSkip(effective_test_name, request, response);
   } else {
-    ReportFailure(effective_test_name, level, request, response,
+    ReportFailure(effective_test_name, request, response,
                   "Should have failed to parse, but didn't.");
   }
 }
 
-// Expect that this precise protobuf will cause a parse error.
-void ConformanceTestSuite::ExpectParseFailureForProto(
-    const string& proto, const string& test_name, ConformanceLevel level) {
-  ExpectParseFailureForProtoWithProtoVersion(proto, test_name, level, true);
-  ExpectParseFailureForProtoWithProtoVersion(proto, test_name, level, false);
-}
-
 // Expect that this protobuf will cause a parse error, even if it is followed
 // by valid protobuf data.  We can try running this twice: once with this
 // data verbatim and once with this data followed by some valid data.
 //
 // TODO(haberman): implement the second of these.
 void ConformanceTestSuite::ExpectHardParseFailureForProto(
-    const string& proto, const string& test_name, ConformanceLevel level) {
-  return ExpectParseFailureForProto(proto, test_name, level);
+    const string& proto, const string& test_name) {
+  return ExpectParseFailureForProto(proto, test_name);
 }
 
 void ConformanceTestSuite::RunValidJsonTest(
-    const string& test_name, ConformanceLevel level, const string& input_json,
+    const string& test_name, const string& input_json,
     const string& equivalent_text_format) {
-  RunValidInputTest(
-      ConformanceLevelToString(level) + ".Proto3.JsonInput." + test_name +
-      ".ProtobufOutput", level, input_json, conformance::JSON,
-      equivalent_text_format, conformance::PROTOBUF, true);
-  RunValidInputTest(
-      ConformanceLevelToString(level) + ".Proto3.JsonInput." + test_name +
-      ".JsonOutput", level, input_json, conformance::JSON,
-      equivalent_text_format, conformance::JSON, true);
+  RunValidInputTest("JsonInput." + test_name + ".ProtobufOutput", input_json,
+                    conformance::JSON, equivalent_text_format,
+                    conformance::PROTOBUF);
+  RunValidInputTest("JsonInput." + test_name + ".JsonOutput", input_json,
+                    conformance::JSON, equivalent_text_format,
+                    conformance::JSON);
 }
 
 void ConformanceTestSuite::RunValidJsonTestWithProtobufInput(
-    const string& test_name, ConformanceLevel level, const TestAllTypesProto3& input,
+    const string& test_name, const TestAllTypes& input,
     const string& equivalent_text_format) {
-  RunValidInputTest(
-      ConformanceLevelToString(level) + ".Proto3" + ".ProtobufInput." + test_name +
-      ".JsonOutput", level, input.SerializeAsString(), conformance::PROTOBUF,
-      equivalent_text_format, conformance::JSON, true);
-}
-
-void ConformanceTestSuite::RunValidProtobufTest(
-    const string& test_name, ConformanceLevel level,
-    const string& input_protobuf, const string& equivalent_text_format,
-    bool isProto3) {
-  string rname = ".Proto3";
-  if (!isProto3) {
-    rname = ".Proto2";
-  }
-  RunValidInputTest(
-      ConformanceLevelToString(level) + rname + ".ProtobufInput." + test_name +
-      ".ProtobufOutput", level, input_protobuf, conformance::PROTOBUF,
-      equivalent_text_format, conformance::PROTOBUF, isProto3);
-  if (isProto3) {
-    RunValidInputTest(
-        ConformanceLevelToString(level) + rname + ".ProtobufInput." +  test_name +
-        ".JsonOutput", level, input_protobuf, conformance::PROTOBUF,
-        equivalent_text_format, conformance::JSON, isProto3);
-  }
-}
-
-void ConformanceTestSuite::RunValidBinaryProtobufTest(
-    const string& test_name, ConformanceLevel level,
-    const string& input_protobuf, bool isProto3) {
-  string rname = ".Proto3";
-  if (!isProto3) {
-    rname = ".Proto2";
-  }
-  RunValidBinaryInputTest(
-      ConformanceLevelToString(level) + rname + ".ProtobufInput." + test_name +
-      ".ProtobufOutput", level, input_protobuf, conformance::PROTOBUF,
-      input_protobuf, conformance::PROTOBUF, isProto3);
-}
-
-void ConformanceTestSuite::RunValidProtobufTestWithMessage(
-    const string& test_name, ConformanceLevel level, const Message *input,
-    const string& equivalent_text_format, bool isProto3) {
-  RunValidProtobufTest(test_name, level, input->SerializeAsString(), equivalent_text_format, isProto3);
+  RunValidInputTest("ProtobufInput." + test_name + ".JsonOutput",
+                    input.SerializeAsString(), conformance::PROTOBUF,
+                    equivalent_text_format, conformance::JSON);
 }
 
 // According to proto3 JSON specification, JSON serializers follow more strict
@@ -540,16 +405,14 @@
 // method allows strict checking on a proto3 JSON serializer by inspecting
 // the JSON output directly.
 void ConformanceTestSuite::RunValidJsonTestWithValidator(
-    const string& test_name, ConformanceLevel level, const string& input_json,
+    const string& test_name, const string& input_json,
     const Validator& validator) {
   ConformanceRequest request;
   ConformanceResponse response;
   request.set_json_payload(input_json);
   request.set_requested_output_format(conformance::JSON);
-  request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
 
-  string effective_test_name = ConformanceLevelToString(level) +
-      ".Proto3.JsonInput." + test_name + ".Validator";
+  string effective_test_name = "JsonInput." + test_name + ".Validator";
 
   RunTest(effective_test_name, request, &response);
 
@@ -559,7 +422,7 @@
   }
 
   if (response.result_case() != ConformanceResponse::kJsonPayload) {
-    ReportFailure(effective_test_name, level, request, response,
+    ReportFailure(effective_test_name, request, response,
                   "Expected JSON payload but got type %d.",
                   response.result_case());
     return;
@@ -567,13 +430,13 @@
   Json::Reader reader;
   Json::Value value;
   if (!reader.parse(response.json_payload(), value)) {
-    ReportFailure(effective_test_name, level, request, response,
+    ReportFailure(effective_test_name, request, response,
                   "JSON payload cannot be parsed as valid JSON: %s",
                   reader.getFormattedErrorMessages().c_str());
     return;
   }
   if (!validator(value)) {
-    ReportFailure(effective_test_name, level, request, response,
+    ReportFailure(effective_test_name, request, response,
                   "JSON payload validation failed.");
     return;
   }
@@ -581,13 +444,11 @@
 }
 
 void ConformanceTestSuite::ExpectParseFailureForJson(
-    const string& test_name, ConformanceLevel level, const string& input_json) {
+    const string& test_name, const string& input_json) {
   ConformanceRequest request;
   ConformanceResponse response;
   request.set_json_payload(input_json);
-  request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
-  string effective_test_name =
-      ConformanceLevelToString(level) + ".Proto3.JsonInput." + test_name;
+  string effective_test_name = "JsonInput." + test_name;
 
   // We don't expect output, but if the program erroneously accepts the protobuf
   // we let it send its response as this.  We must not leave it unspecified.
@@ -599,14 +460,14 @@
   } else if (response.result_case() == ConformanceResponse::kSkipped) {
     ReportSkip(effective_test_name, request, response);
   } else {
-    ReportFailure(effective_test_name, level, request, response,
+    ReportFailure(effective_test_name, request, response,
                   "Should have failed to parse, but didn't.");
   }
 }
 
 void ConformanceTestSuite::ExpectSerializeFailureForJson(
-    const string& test_name, ConformanceLevel level, const string& text_format) {
-  TestAllTypesProto3 payload_message;
+    const string& test_name, const string& text_format) {
+  TestAllTypes payload_message;
   GOOGLE_CHECK(
       TextFormat::ParseFromString(text_format, &payload_message))
           << "Failed to parse: " << text_format;
@@ -614,9 +475,7 @@
   ConformanceRequest request;
   ConformanceResponse response;
   request.set_protobuf_payload(payload_message.SerializeAsString());
-  request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
-  string effective_test_name =
-      ConformanceLevelToString(level) + "." + test_name + ".JsonOutput";
+  string effective_test_name = test_name + ".JsonOutput";
   request.set_requested_output_format(conformance::JSON);
 
   RunTest(effective_test_name, request, &response);
@@ -625,12 +484,11 @@
   } else if (response.result_case() == ConformanceResponse::kSkipped) {
     ReportSkip(effective_test_name, request, response);
   } else {
-    ReportFailure(effective_test_name, level, request, response,
+    ReportFailure(effective_test_name, request, response,
                   "Should have failed to serialize, but didn't.");
   }
 }
 
-//TODO: proto2?
 void ConformanceTestSuite::TestPrematureEOFForType(FieldDescriptor::Type type) {
   // Incomplete values for each wire type.
   static const string incompletes[6] = {
@@ -642,8 +500,8 @@
     string("abc")       // 32BIT
   };
 
-  const FieldDescriptor* field = GetFieldForType(type, false, true);
-  const FieldDescriptor* rep_field = GetFieldForType(type, true, true);
+  uint32_t fieldnum = GetFieldNumberForType(type, false);
+  uint32_t rep_fieldnum = GetFieldNumberForType(type, true);
   WireFormatLite::WireType wire_type = WireFormatLite::WireTypeForFieldType(
       static_cast<WireFormatLite::FieldType>(type));
   const string& incomplete = incompletes[wire_type];
@@ -651,44 +509,42 @@
       UpperCase(string(".") + FieldDescriptor::TypeName(type));
 
   ExpectParseFailureForProto(
-      tag(field->number(), wire_type),
-      "PrematureEofBeforeKnownNonRepeatedValue" + type_name, REQUIRED);
+      tag(fieldnum, wire_type),
+      "PrematureEofBeforeKnownNonRepeatedValue" + type_name);
 
   ExpectParseFailureForProto(
-      tag(rep_field->number(), wire_type),
-      "PrematureEofBeforeKnownRepeatedValue" + type_name, REQUIRED);
+      tag(rep_fieldnum, wire_type),
+      "PrematureEofBeforeKnownRepeatedValue" + type_name);
 
   ExpectParseFailureForProto(
       tag(UNKNOWN_FIELD, wire_type),
-      "PrematureEofBeforeUnknownValue" + type_name, REQUIRED);
+      "PrematureEofBeforeUnknownValue" + type_name);
 
   ExpectParseFailureForProto(
-      cat( tag(field->number(), wire_type), incomplete ),
-      "PrematureEofInsideKnownNonRepeatedValue" + type_name, REQUIRED);
+      cat( tag(fieldnum, wire_type), incomplete ),
+      "PrematureEofInsideKnownNonRepeatedValue" + type_name);
 
   ExpectParseFailureForProto(
-      cat( tag(rep_field->number(), wire_type), incomplete ),
-      "PrematureEofInsideKnownRepeatedValue" + type_name, REQUIRED);
+      cat( tag(rep_fieldnum, wire_type), incomplete ),
+      "PrematureEofInsideKnownRepeatedValue" + type_name);
 
   ExpectParseFailureForProto(
       cat( tag(UNKNOWN_FIELD, wire_type), incomplete ),
-      "PrematureEofInsideUnknownValue" + type_name, REQUIRED);
+      "PrematureEofInsideUnknownValue" + type_name);
 
   if (wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
     ExpectParseFailureForProto(
-        cat( tag(field->number(), wire_type), varint(1) ),
-        "PrematureEofInDelimitedDataForKnownNonRepeatedValue" + type_name,
-        REQUIRED);
+        cat( tag(fieldnum, wire_type), varint(1) ),
+        "PrematureEofInDelimitedDataForKnownNonRepeatedValue" + type_name);
 
     ExpectParseFailureForProto(
-        cat( tag(rep_field->number(), wire_type), varint(1) ),
-        "PrematureEofInDelimitedDataForKnownRepeatedValue" + type_name,
-        REQUIRED);
+        cat( tag(rep_fieldnum, wire_type), varint(1) ),
+        "PrematureEofInDelimitedDataForKnownRepeatedValue" + type_name);
 
     // EOF in the middle of delimited data for unknown value.
     ExpectParseFailureForProto(
         cat( tag(UNKNOWN_FIELD, wire_type), varint(1) ),
-        "PrematureEofInDelimitedDataForUnknownValue" + type_name, REQUIRED);
+        "PrematureEofInDelimitedDataForUnknownValue" + type_name);
 
     if (type == FieldDescriptor::TYPE_MESSAGE) {
       // Submessage ends in the middle of a value.
@@ -696,164 +552,51 @@
           cat( tag(WireFormatLite::TYPE_INT32, WireFormatLite::WIRETYPE_VARINT),
                 incompletes[WireFormatLite::WIRETYPE_VARINT] );
       ExpectHardParseFailureForProto(
-          cat( tag(field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
+          cat( tag(fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
                varint(incomplete_submsg.size()),
                incomplete_submsg ),
-          "PrematureEofInSubmessageValue" + type_name, REQUIRED);
+          "PrematureEofInSubmessageValue" + type_name);
     }
   } else if (type != FieldDescriptor::TYPE_GROUP) {
     // Non-delimited, non-group: eligible for packing.
 
     // Packed region ends in the middle of a value.
     ExpectHardParseFailureForProto(
-        cat(tag(rep_field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
-            varint(incomplete.size()), incomplete),
-        "PrematureEofInPackedFieldValue" + type_name, REQUIRED);
+        cat( tag(rep_fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
+             varint(incomplete.size()),
+             incomplete ),
+        "PrematureEofInPackedFieldValue" + type_name);
 
     // EOF in the middle of packed region.
     ExpectParseFailureForProto(
-        cat(tag(rep_field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
-            varint(1)),
-        "PrematureEofInPackedField" + type_name, REQUIRED);
+        cat( tag(rep_fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
+             varint(1) ),
+        "PrematureEofInPackedField" + type_name);
   }
 }
 
-void ConformanceTestSuite::TestValidDataForType(
-    FieldDescriptor::Type type,
-    std::vector<std::pair<std::string, std::string>> values) {
-  for (int isProto3 = 0; isProto3 < 2; isProto3++) {
-    const string type_name =
-        UpperCase(string(".") + FieldDescriptor::TypeName(type));
-    WireFormatLite::WireType wire_type = WireFormatLite::WireTypeForFieldType(
-        static_cast<WireFormatLite::FieldType>(type));
-    const FieldDescriptor* field = GetFieldForType(type, false, isProto3);
-    const FieldDescriptor* rep_field = GetFieldForType(type, true, isProto3);
-
-    RunValidProtobufTest("ValidDataScalar" + type_name, REQUIRED,
-                         cat(tag(field->number(), wire_type), values[0].first),
-                         field->name() + ": " + values[0].second, isProto3);
-
-    string proto;
-    string text = field->name() + ": " + values.back().second;
-    for (size_t i = 0; i < values.size(); i++) {
-      proto += cat(tag(field->number(), wire_type), values[i].first);
-    }
-    RunValidProtobufTest("RepeatedScalarSelectsLast" + type_name, REQUIRED,
-                         proto, text, isProto3);
-
-    proto.clear();
-    text.clear();
-
-    for (size_t i = 0; i < values.size(); i++) {
-      proto += cat(tag(rep_field->number(), wire_type), values[i].first);
-      text += rep_field->name() + ": " + values[i].second + " ";
-    }
-    RunValidProtobufTest("ValidDataRepeated" + type_name, REQUIRED,
-                         proto, text, isProto3);
-  }
-}
-
-void ConformanceTestSuite::SetFailureList(const string& filename,
-                                          const vector<string>& failure_list) {
-  failure_list_filename_ = filename;
+void ConformanceTestSuite::SetFailureList(const vector<string>& failure_list) {
   expected_to_fail_.clear();
   std::copy(failure_list.begin(), failure_list.end(),
             std::inserter(expected_to_fail_, expected_to_fail_.end()));
 }
 
-bool ConformanceTestSuite::CheckSetEmpty(const std::set<string>& set_to_check,
-                                         const std::string& write_to_file,
-                                         const std::string& msg) {
+bool ConformanceTestSuite::CheckSetEmpty(const set<string>& set_to_check,
+                                         const char* msg) {
   if (set_to_check.empty()) {
     return true;
   } else {
     StringAppendF(&output_, "\n");
-    StringAppendF(&output_, "%s\n\n", msg.c_str());
-    for (std::set<string>::const_iterator iter = set_to_check.begin();
+    StringAppendF(&output_, "%s:\n", msg);
+    for (set<string>::const_iterator iter = set_to_check.begin();
          iter != set_to_check.end(); ++iter) {
       StringAppendF(&output_, "  %s\n", iter->c_str());
     }
     StringAppendF(&output_, "\n");
-
-    if (!write_to_file.empty()) {
-      std::ofstream os(write_to_file);
-      if (os) {
-        for (std::set<string>::const_iterator iter = set_to_check.begin();
-             iter != set_to_check.end(); ++iter) {
-          os << *iter << "\n";
-        }
-      } else {
-        StringAppendF(&output_, "Failed to open file: %s\n",
-                      write_to_file.c_str());
-      }
-    }
-
     return false;
   }
 }
 
-// TODO: proto2?
-void ConformanceTestSuite::TestIllegalTags() {
-  // field num 0 is illegal
-  string nullfield[] = {
-    "\1DEADBEEF",
-    "\2\1\1",
-    "\3\4",
-    "\5DEAD"
-  };
-  for (int i = 0; i < 4; i++) {
-    string name = "IllegalZeroFieldNum_Case_0";
-    name.back() += i;
-    ExpectParseFailureForProto(nullfield[i], name, REQUIRED);
-  }
-}
-template <class MessageType>
-void ConformanceTestSuite::TestOneofMessage (MessageType &message,
-                                             bool isProto3) {
-  message.set_oneof_uint32(0);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroUint32", RECOMMENDED, &message, "oneof_uint32: 0", isProto3);
-  message.mutable_oneof_nested_message()->set_a(0);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroMessage", RECOMMENDED, &message,
-      isProto3 ? "oneof_nested_message: {}" : "oneof_nested_message: {a: 0}",
-      isProto3);
-  message.mutable_oneof_nested_message()->set_a(1);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroMessageSetTwice", RECOMMENDED, &message,
-      "oneof_nested_message: {a: 1}",
-      isProto3);
-  message.set_oneof_string("");
-  RunValidProtobufTestWithMessage(
-      "OneofZeroString", RECOMMENDED, &message, "oneof_string: \"\"", isProto3);
-  message.set_oneof_bytes("");
-  RunValidProtobufTestWithMessage(
-      "OneofZeroBytes", RECOMMENDED, &message, "oneof_bytes: \"\"", isProto3);
-  message.set_oneof_bool(false);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroBool", RECOMMENDED, &message, "oneof_bool: false", isProto3);
-  message.set_oneof_uint64(0);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroUint64", RECOMMENDED, &message, "oneof_uint64: 0", isProto3);
-  message.set_oneof_float(0.0f);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroFloat", RECOMMENDED, &message, "oneof_float: 0", isProto3);
-  message.set_oneof_double(0.0);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroDouble", RECOMMENDED, &message, "oneof_double: 0", isProto3);
-  message.set_oneof_enum(MessageType::FOO);
-  RunValidProtobufTestWithMessage(
-      "OneofZeroEnum", RECOMMENDED, &message, "oneof_enum: FOO", isProto3);
-}
-
-template <class MessageType>
-void ConformanceTestSuite::TestUnknownMessage(MessageType& message,
-                                              bool isProto3) {
-  message.ParseFromString("\xA8\x1F\x01");
-  RunValidBinaryProtobufTest("UnknownVarint", REQUIRED,
-                             message.SerializeAsString(), isProto3);
-}
-
 bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
                                     std::string* output) {
   runner_ = runner;
@@ -865,7 +608,7 @@
   unexpected_succeeding_tests_.clear();
   type_resolver_.reset(NewTypeResolverForDescriptorPool(
       kTypeUrlPrefix, DescriptorPool::generated_pool()));
-  type_url_ = GetTypeUrl(TestAllTypesProto3::descriptor());
+  type_url_ = GetTypeUrl(TestAllTypes::descriptor());
 
   output_ = "\nCONFORMANCE TEST BEGIN ====================================\n\n";
 
@@ -874,122 +617,24 @@
     TestPrematureEOFForType(static_cast<FieldDescriptor::Type>(i));
   }
 
-  TestIllegalTags();
-
-  int64 kInt64Min = -9223372036854775808ULL;
-  int64 kInt64Max = 9223372036854775807ULL;
-  uint64 kUint64Max = 18446744073709551615ULL;
-  int32 kInt32Max = 2147483647;
-  int32 kInt32Min = -2147483648;
-  uint32 kUint32Max = 4294967295UL;
-
-  TestValidDataForType(FieldDescriptor::TYPE_DOUBLE, {
-    {dbl(0.1), "0.1"},
-    {dbl(1.7976931348623157e+308), "1.7976931348623157e+308"},
-    {dbl(2.22507385850720138309e-308), "2.22507385850720138309e-308"}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_FLOAT, {
-    {flt(0.1), "0.1"},
-    {flt(1.00000075e-36), "1.00000075e-36"},
-    {flt(3.402823e+38), "3.402823e+38"},  // 3.40282347e+38
-    {flt(1.17549435e-38f), "1.17549435e-38"}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_INT64, {
-    {varint(12345), "12345"},
-    {varint(kInt64Max), std::to_string(kInt64Max)},
-    {varint(kInt64Min), std::to_string(kInt64Min)}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_UINT64, {
-    {varint(12345), "12345"},
-    {varint(kUint64Max), std::to_string(kUint64Max)},
-    {varint(0), "0"}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_INT32, {
-    {varint(12345), "12345"},
-    {longvarint(12345, 2), "12345"},
-    {longvarint(12345, 7), "12345"},
-    {varint(kInt32Max), std::to_string(kInt32Max)},
-    {varint(kInt32Min), std::to_string(kInt32Min)},
-    {varint(1LL << 33), std::to_string(static_cast<int32>(1LL << 33))},
-    {varint((1LL << 33) - 1),
-     std::to_string(static_cast<int32>((1LL << 33) - 1))},
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_UINT32, {
-    {varint(12345), "12345"},
-    {longvarint(12345, 2), "12345"},
-    {longvarint(12345, 7), "12345"},
-    {varint(kUint32Max), std::to_string(kUint32Max)},  // UINT32_MAX
-    {varint(0), "0"},
-    {varint(1LL << 33), std::to_string(static_cast<uint32>(1LL << 33))},
-    {varint((1LL << 33) - 1),
-     std::to_string(static_cast<uint32>((1LL << 33) - 1))},
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_FIXED64, {
-    {u64(12345), "12345"},
-    {u64(kUint64Max), std::to_string(kUint64Max)},
-    {u64(0), "0"}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_FIXED32, {
-    {u32(12345), "12345"},
-    {u32(kUint32Max), std::to_string(kUint32Max)},  // UINT32_MAX
-    {u32(0), "0"}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_SFIXED64, {
-    {u64(12345), "12345"},
-    {u64(kInt64Max), std::to_string(kInt64Max)},
-    {u64(kInt64Min), std::to_string(kInt64Min)}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_SFIXED32, {
-    {u32(12345), "12345"},
-    {u32(kInt32Max), std::to_string(kInt32Max)},
-    {u32(kInt32Min), std::to_string(kInt32Min)}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_BOOL, {
-    {varint(1), "true"},
-    {varint(0), "false"},
-    {varint(12345678), "true"}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_SINT32, {
-    {zz32(12345), "12345"},
-    {zz32(kInt32Max), std::to_string(kInt32Max)},
-    {zz32(kInt32Min), std::to_string(kInt32Min)}
-  });
-  TestValidDataForType(FieldDescriptor::TYPE_SINT64, {
-    {zz64(12345), "12345"},
-    {zz64(kInt64Max), std::to_string(kInt64Max)},
-    {zz64(kInt64Min), std::to_string(kInt64Min)}
-  });
-
-  // TODO(haberman):
-  // TestValidDataForType(FieldDescriptor::TYPE_STRING
-  // TestValidDataForType(FieldDescriptor::TYPE_GROUP
-  // TestValidDataForType(FieldDescriptor::TYPE_MESSAGE
-  // TestValidDataForType(FieldDescriptor::TYPE_BYTES
-  // TestValidDataForType(FieldDescriptor::TYPE_ENUM
-
-  RunValidJsonTest("HelloWorld", REQUIRED,
-                   "{\"optionalString\":\"Hello, World!\"}",
+  RunValidJsonTest("HelloWorld", "{\"optionalString\":\"Hello, World!\"}",
                    "optional_string: 'Hello, World!'");
 
-  // NOTE: The spec for JSON support is still being sorted out, these may not
-  // all be correct.
   // Test field name conventions.
   RunValidJsonTest(
-      "FieldNameInSnakeCase", REQUIRED,
+      "FieldNameInSnakeCase",
       R"({
         "fieldname1": 1,
         "fieldName2": 2,
-        "FieldName3": 3,
-        "fieldName4": 4
+        "FieldName3": 3
       })",
       R"(
         fieldname1: 1
         field_name2: 2
         _field_name3: 3
-        field__name4_: 4
       )");
   RunValidJsonTest(
-      "FieldNameWithNumbers", REQUIRED,
+      "FieldNameWithNumbers",
       R"({
         "field0name5": 5,
         "field0Name6": 6
@@ -999,14 +644,14 @@
         field_0_name6: 6
       )");
   RunValidJsonTest(
-      "FieldNameWithMixedCases", REQUIRED,
+      "FieldNameWithMixedCases",
       R"({
         "fieldName7": 7,
-        "FieldName8": 8,
+        "fieldName8": 8,
         "fieldName9": 9,
-        "FieldName10": 10,
-        "FIELDNAME11": 11,
-        "FIELDName12": 12
+        "fieldName10": 10,
+        "fIELDNAME11": 11,
+        "fIELDName12": 12
       })",
       R"(
         fieldName7: 7
@@ -1016,32 +661,13 @@
         FIELD_NAME11: 11
         FIELD_name12: 12
       )");
-  RunValidJsonTest(
-      "FieldNameWithDoubleUnderscores", RECOMMENDED,
-      R"({
-        "FieldName13": 13,
-        "FieldName14": 14,
-        "fieldName15": 15,
-        "fieldName16": 16,
-        "fieldName17": 17,
-        "FieldName18": 18
-      })",
-      R"(
-        __field_name13: 13
-        __Field_name14: 14
-        field__name15: 15
-        field__Name16: 16
-        field_name17__: 17
-        Field_name18__: 18
-      )");
   // Using the original proto field name in JSON is also allowed.
   RunValidJsonTest(
-      "OriginalProtoFieldName", REQUIRED,
+      "OriginalProtoFieldName",
       R"({
         "fieldname1": 1,
         "field_name2": 2,
         "_field_name3": 3,
-        "field__name4_": 4,
         "field0name5": 5,
         "field_0_name6": 6,
         "fieldName7": 7,
@@ -1049,19 +675,12 @@
         "field_Name9": 9,
         "Field_Name10": 10,
         "FIELD_NAME11": 11,
-        "FIELD_name12": 12,
-        "__field_name13": 13,
-        "__Field_name14": 14,
-        "field__name15": 15,
-        "field__Name16": 16,
-        "field_name17__": 17,
-        "Field_name18__": 18
+        "FIELD_name12": 12
       })",
       R"(
         fieldname1: 1
         field_name2: 2
         _field_name3: 3
-        field__name4_: 4
         field0name5: 5
         field_0_name6: 6
         fieldName7: 7
@@ -1070,120 +689,61 @@
         Field_Name10: 10
         FIELD_NAME11: 11
         FIELD_name12: 12
-        __field_name13: 13
-        __Field_name14: 14
-        field__name15: 15
-        field__Name16: 16
-        field_name17__: 17
-        Field_name18__: 18
       )");
   // Field names can be escaped.
   RunValidJsonTest(
-      "FieldNameEscaped", REQUIRED,
+      "FieldNameEscaped",
       R"({"fieldn\u0061me1": 1})",
       "fieldname1: 1");
-  // String ends with escape character.
-  ExpectParseFailureForJson(
-      "StringEndsWithEscapeChar", RECOMMENDED,
-      "{\"optionalString\": \"abc\\");
   // Field names must be quoted (or it's not valid JSON).
   ExpectParseFailureForJson(
-      "FieldNameNotQuoted", RECOMMENDED,
+      "FieldNameNotQuoted",
       "{fieldname1: 1}");
   // Trailing comma is not allowed (not valid JSON).
   ExpectParseFailureForJson(
-      "TrailingCommaInAnObject", RECOMMENDED,
+      "TrailingCommaInAnObject",
       R"({"fieldname1":1,})");
-  ExpectParseFailureForJson(
-      "TrailingCommaInAnObjectWithSpace", RECOMMENDED,
-      R"({"fieldname1":1 ,})");
-  ExpectParseFailureForJson(
-      "TrailingCommaInAnObjectWithSpaceCommaSpace", RECOMMENDED,
-      R"({"fieldname1":1 , })");
-  ExpectParseFailureForJson(
-      "TrailingCommaInAnObjectWithNewlines", RECOMMENDED,
-      R"({
-        "fieldname1":1,
-      })");
   // JSON doesn't support comments.
   ExpectParseFailureForJson(
-      "JsonWithComments", RECOMMENDED,
+      "JsonWithComments",
       R"({
         // This is a comment.
         "fieldname1": 1
       })");
-  // JSON spec says whitespace doesn't matter, so try a few spacings to be sure.
-  RunValidJsonTest(
-      "OneLineNoSpaces", RECOMMENDED,
-      "{\"optionalInt32\":1,\"optionalInt64\":2}",
-      R"(
-        optional_int32: 1
-        optional_int64: 2
-      )");
-  RunValidJsonTest(
-      "OneLineWithSpaces", RECOMMENDED,
-      "{ \"optionalInt32\" : 1 , \"optionalInt64\" : 2 }",
-      R"(
-        optional_int32: 1
-        optional_int64: 2
-      )");
-  RunValidJsonTest(
-      "MultilineNoSpaces", RECOMMENDED,
-      "{\n\"optionalInt32\"\n:\n1\n,\n\"optionalInt64\"\n:\n2\n}",
-      R"(
-        optional_int32: 1
-        optional_int64: 2
-      )");
-  RunValidJsonTest(
-      "MultilineWithSpaces", RECOMMENDED,
-      "{\n  \"optionalInt32\"  :  1\n  ,\n  \"optionalInt64\"  :  2\n}\n",
-      R"(
-        optional_int32: 1
-        optional_int64: 2
-      )");
-  // Missing comma between key/value pairs.
-  ExpectParseFailureForJson(
-      "MissingCommaOneLine", RECOMMENDED,
-      "{ \"optionalInt32\": 1 \"optionalInt64\": 2 }");
-  ExpectParseFailureForJson(
-      "MissingCommaMultiline", RECOMMENDED,
-      "{\n  \"optionalInt32\": 1\n  \"optionalInt64\": 2\n}");
   // Duplicated field names are not allowed.
   ExpectParseFailureForJson(
-      "FieldNameDuplicate", RECOMMENDED,
+      "FieldNameDuplicate",
       R"({
         "optionalNestedMessage": {a: 1},
         "optionalNestedMessage": {}
       })");
   ExpectParseFailureForJson(
-      "FieldNameDuplicateDifferentCasing1", RECOMMENDED,
+      "FieldNameDuplicateDifferentCasing1",
       R"({
         "optional_nested_message": {a: 1},
         "optionalNestedMessage": {}
       })");
   ExpectParseFailureForJson(
-      "FieldNameDuplicateDifferentCasing2", RECOMMENDED,
+      "FieldNameDuplicateDifferentCasing2",
       R"({
         "optionalNestedMessage": {a: 1},
         "optional_nested_message": {}
       })");
   // Serializers should use lowerCamelCase by default.
   RunValidJsonTestWithValidator(
-      "FieldNameInLowerCamelCase", REQUIRED,
+      "FieldNameInLowerCamelCase",
       R"({
         "fieldname1": 1,
         "fieldName2": 2,
-        "FieldName3": 3,
-        "fieldName4": 4
+        "FieldName3": 3
       })",
       [](const Json::Value& value) {
         return value.isMember("fieldname1") &&
             value.isMember("fieldName2") &&
-            value.isMember("FieldName3") &&
-            value.isMember("fieldName4");
+            value.isMember("FieldName3");
       });
   RunValidJsonTestWithValidator(
-      "FieldNameWithNumbers", REQUIRED,
+      "FieldNameWithNumbers",
       R"({
         "field0name5": 5,
         "field0Name6": 6
@@ -1193,195 +753,169 @@
             value.isMember("field0Name6");
       });
   RunValidJsonTestWithValidator(
-      "FieldNameWithMixedCases", REQUIRED,
+      "FieldNameWithMixedCases",
       R"({
         "fieldName7": 7,
-        "FieldName8": 8,
+        "fieldName8": 8,
         "fieldName9": 9,
-        "FieldName10": 10,
-        "FIELDNAME11": 11,
-        "FIELDName12": 12
+        "fieldName10": 10,
+        "fIELDNAME11": 11,
+        "fIELDName12": 12
       })",
       [](const Json::Value& value) {
         return value.isMember("fieldName7") &&
-            value.isMember("FieldName8") &&
+            value.isMember("fieldName8") &&
             value.isMember("fieldName9") &&
-            value.isMember("FieldName10") &&
-            value.isMember("FIELDNAME11") &&
-            value.isMember("FIELDName12");
-      });
-  RunValidJsonTestWithValidator(
-      "FieldNameWithDoubleUnderscores", RECOMMENDED,
-      R"({
-        "FieldName13": 13,
-        "FieldName14": 14,
-        "fieldName15": 15,
-        "fieldName16": 16,
-        "fieldName17": 17,
-        "FieldName18": 18
-      })",
-      [](const Json::Value& value) {
-        return value.isMember("FieldName13") &&
-            value.isMember("FieldName14") &&
-            value.isMember("fieldName15") &&
-            value.isMember("fieldName16") &&
-            value.isMember("fieldName17") &&
-            value.isMember("FieldName18");
+            value.isMember("fieldName10") &&
+            value.isMember("fIELDNAME11") &&
+            value.isMember("fIELDName12");
       });
 
   // Integer fields.
   RunValidJsonTest(
-      "Int32FieldMaxValue", REQUIRED,
+      "Int32FieldMaxValue",
       R"({"optionalInt32": 2147483647})",
       "optional_int32: 2147483647");
   RunValidJsonTest(
-      "Int32FieldMinValue", REQUIRED,
+      "Int32FieldMinValue",
       R"({"optionalInt32": -2147483648})",
       "optional_int32: -2147483648");
   RunValidJsonTest(
-      "Uint32FieldMaxValue", REQUIRED,
+      "Uint32FieldMaxValue",
       R"({"optionalUint32": 4294967295})",
       "optional_uint32: 4294967295");
   RunValidJsonTest(
-      "Int64FieldMaxValue", REQUIRED,
+      "Int64FieldMaxValue",
       R"({"optionalInt64": "9223372036854775807"})",
       "optional_int64: 9223372036854775807");
   RunValidJsonTest(
-      "Int64FieldMinValue", REQUIRED,
+      "Int64FieldMinValue",
       R"({"optionalInt64": "-9223372036854775808"})",
       "optional_int64: -9223372036854775808");
   RunValidJsonTest(
-      "Uint64FieldMaxValue", REQUIRED,
+      "Uint64FieldMaxValue",
       R"({"optionalUint64": "18446744073709551615"})",
       "optional_uint64: 18446744073709551615");
-  // While not the largest Int64, this is the largest
-  // Int64 which can be exactly represented within an
-  // IEEE-754 64-bit float, which is the expected level
-  // of interoperability guarantee. Larger values may
-  // work in some implementations, but should not be
-  // relied upon.
   RunValidJsonTest(
-      "Int64FieldMaxValueNotQuoted", REQUIRED,
-      R"({"optionalInt64": 9223372036854774784})",
-      "optional_int64: 9223372036854774784");
+      "Int64FieldMaxValueNotQuoted",
+      R"({"optionalInt64": 9223372036854775807})",
+      "optional_int64: 9223372036854775807");
   RunValidJsonTest(
-      "Int64FieldMinValueNotQuoted", REQUIRED,
+      "Int64FieldMinValueNotQuoted",
       R"({"optionalInt64": -9223372036854775808})",
       "optional_int64: -9223372036854775808");
-  // Largest interoperable Uint64; see comment above
-  // for Int64FieldMaxValueNotQuoted.
   RunValidJsonTest(
-      "Uint64FieldMaxValueNotQuoted", REQUIRED,
-      R"({"optionalUint64": 18446744073709549568})",
-      "optional_uint64: 18446744073709549568");
+      "Uint64FieldMaxValueNotQuoted",
+      R"({"optionalUint64": 18446744073709551615})",
+      "optional_uint64: 18446744073709551615");
   // Values can be represented as JSON strings.
   RunValidJsonTest(
-      "Int32FieldStringValue", REQUIRED,
+      "Int32FieldStringValue",
       R"({"optionalInt32": "2147483647"})",
       "optional_int32: 2147483647");
   RunValidJsonTest(
-      "Int32FieldStringValueEscaped", REQUIRED,
+      "Int32FieldStringValueEscaped",
       R"({"optionalInt32": "2\u003147483647"})",
       "optional_int32: 2147483647");
 
   // Parsers reject out-of-bound integer values.
   ExpectParseFailureForJson(
-      "Int32FieldTooLarge", REQUIRED,
+      "Int32FieldTooLarge",
       R"({"optionalInt32": 2147483648})");
   ExpectParseFailureForJson(
-      "Int32FieldTooSmall", REQUIRED,
+      "Int32FieldTooSmall",
       R"({"optionalInt32": -2147483649})");
   ExpectParseFailureForJson(
-      "Uint32FieldTooLarge", REQUIRED,
+      "Uint32FieldTooLarge",
       R"({"optionalUint32": 4294967296})");
   ExpectParseFailureForJson(
-      "Int64FieldTooLarge", REQUIRED,
+      "Int64FieldTooLarge",
       R"({"optionalInt64": "9223372036854775808"})");
   ExpectParseFailureForJson(
-      "Int64FieldTooSmall", REQUIRED,
+      "Int64FieldTooSmall",
       R"({"optionalInt64": "-9223372036854775809"})");
   ExpectParseFailureForJson(
-      "Uint64FieldTooLarge", REQUIRED,
+      "Uint64FieldTooLarge",
       R"({"optionalUint64": "18446744073709551616"})");
   // Parser reject non-integer numeric values as well.
   ExpectParseFailureForJson(
-      "Int32FieldNotInteger", REQUIRED,
+      "Int32FieldNotInteger",
       R"({"optionalInt32": 0.5})");
   ExpectParseFailureForJson(
-      "Uint32FieldNotInteger", REQUIRED,
+      "Uint32FieldNotInteger",
       R"({"optionalUint32": 0.5})");
   ExpectParseFailureForJson(
-      "Int64FieldNotInteger", REQUIRED,
+      "Int64FieldNotInteger",
       R"({"optionalInt64": "0.5"})");
   ExpectParseFailureForJson(
-      "Uint64FieldNotInteger", REQUIRED,
+      "Uint64FieldNotInteger",
       R"({"optionalUint64": "0.5"})");
 
   // Integers but represented as float values are accepted.
   RunValidJsonTest(
-      "Int32FieldFloatTrailingZero", REQUIRED,
+      "Int32FieldFloatTrailingZero",
       R"({"optionalInt32": 100000.000})",
       "optional_int32: 100000");
   RunValidJsonTest(
-      "Int32FieldExponentialFormat", REQUIRED,
+      "Int32FieldExponentialFormat",
       R"({"optionalInt32": 1e5})",
       "optional_int32: 100000");
   RunValidJsonTest(
-      "Int32FieldMaxFloatValue", REQUIRED,
+      "Int32FieldMaxFloatValue",
       R"({"optionalInt32": 2.147483647e9})",
       "optional_int32: 2147483647");
   RunValidJsonTest(
-      "Int32FieldMinFloatValue", REQUIRED,
+      "Int32FieldMinFloatValue",
       R"({"optionalInt32": -2.147483648e9})",
       "optional_int32: -2147483648");
   RunValidJsonTest(
-      "Uint32FieldMaxFloatValue", REQUIRED,
+      "Uint32FieldMaxFloatValue",
       R"({"optionalUint32": 4.294967295e9})",
       "optional_uint32: 4294967295");
 
   // Parser reject non-numeric values.
   ExpectParseFailureForJson(
-      "Int32FieldNotNumber", REQUIRED,
+      "Int32FieldNotNumber",
       R"({"optionalInt32": "3x3"})");
   ExpectParseFailureForJson(
-      "Uint32FieldNotNumber", REQUIRED,
+      "Uint32FieldNotNumber",
       R"({"optionalUint32": "3x3"})");
   ExpectParseFailureForJson(
-      "Int64FieldNotNumber", REQUIRED,
+      "Int64FieldNotNumber",
       R"({"optionalInt64": "3x3"})");
   ExpectParseFailureForJson(
-      "Uint64FieldNotNumber", REQUIRED,
+      "Uint64FieldNotNumber",
       R"({"optionalUint64": "3x3"})");
   // JSON does not allow "+" on numric values.
   ExpectParseFailureForJson(
-      "Int32FieldPlusSign", REQUIRED,
+      "Int32FieldPlusSign",
       R"({"optionalInt32": +1})");
   // JSON doesn't allow leading 0s.
   ExpectParseFailureForJson(
-      "Int32FieldLeadingZero", REQUIRED,
+      "Int32FieldLeadingZero",
       R"({"optionalInt32": 01})");
   ExpectParseFailureForJson(
-      "Int32FieldNegativeWithLeadingZero", REQUIRED,
+      "Int32FieldNegativeWithLeadingZero",
       R"({"optionalInt32": -01})");
   // String values must follow the same syntax rule. Specifically leading
-  // or trailing spaces are not allowed.
+  // or traling spaces are not allowed.
   ExpectParseFailureForJson(
-      "Int32FieldLeadingSpace", REQUIRED,
+      "Int32FieldLeadingSpace",
       R"({"optionalInt32": " 1"})");
   ExpectParseFailureForJson(
-      "Int32FieldTrailingSpace", REQUIRED,
+      "Int32FieldTrailingSpace",
       R"({"optionalInt32": "1 "})");
 
   // 64-bit values are serialized as strings.
   RunValidJsonTestWithValidator(
-      "Int64FieldBeString", RECOMMENDED,
+      "Int64FieldBeString",
       R"({"optionalInt64": 1})",
       [](const Json::Value& value) {
         return value["optionalInt64"].type() == Json::stringValue &&
             value["optionalInt64"].asString() == "1";
       });
   RunValidJsonTestWithValidator(
-      "Uint64FieldBeString", RECOMMENDED,
+      "Uint64FieldBeString",
       R"({"optionalUint64": 1})",
       [](const Json::Value& value) {
         return value["optionalUint64"].type() == Json::stringValue &&
@@ -1390,202 +924,202 @@
 
   // Bool fields.
   RunValidJsonTest(
-      "BoolFieldTrue", REQUIRED,
+      "BoolFieldTrue",
       R"({"optionalBool":true})",
       "optional_bool: true");
   RunValidJsonTest(
-      "BoolFieldFalse", REQUIRED,
+      "BoolFieldFalse",
       R"({"optionalBool":false})",
       "optional_bool: false");
 
   // Other forms are not allowed.
   ExpectParseFailureForJson(
-      "BoolFieldIntegerZero", RECOMMENDED,
+      "BoolFieldIntegerZero",
       R"({"optionalBool":0})");
   ExpectParseFailureForJson(
-      "BoolFieldIntegerOne", RECOMMENDED,
+      "BoolFieldIntegerOne",
       R"({"optionalBool":1})");
   ExpectParseFailureForJson(
-      "BoolFieldCamelCaseTrue", RECOMMENDED,
+      "BoolFieldCamelCaseTrue",
       R"({"optionalBool":True})");
   ExpectParseFailureForJson(
-      "BoolFieldCamelCaseFalse", RECOMMENDED,
+      "BoolFieldCamelCaseFalse",
       R"({"optionalBool":False})");
   ExpectParseFailureForJson(
-      "BoolFieldAllCapitalTrue", RECOMMENDED,
+      "BoolFieldAllCapitalTrue",
       R"({"optionalBool":TRUE})");
   ExpectParseFailureForJson(
-      "BoolFieldAllCapitalFalse", RECOMMENDED,
+      "BoolFieldAllCapitalFalse",
       R"({"optionalBool":FALSE})");
   ExpectParseFailureForJson(
-      "BoolFieldDoubleQuotedTrue", RECOMMENDED,
+      "BoolFieldDoubleQuotedTrue",
       R"({"optionalBool":"true"})");
   ExpectParseFailureForJson(
-      "BoolFieldDoubleQuotedFalse", RECOMMENDED,
+      "BoolFieldDoubleQuotedFalse",
       R"({"optionalBool":"false"})");
 
   // Float fields.
   RunValidJsonTest(
-      "FloatFieldMinPositiveValue", REQUIRED,
+      "FloatFieldMinPositiveValue",
       R"({"optionalFloat": 1.175494e-38})",
       "optional_float: 1.175494e-38");
   RunValidJsonTest(
-      "FloatFieldMaxNegativeValue", REQUIRED,
+      "FloatFieldMaxNegativeValue",
       R"({"optionalFloat": -1.175494e-38})",
       "optional_float: -1.175494e-38");
   RunValidJsonTest(
-      "FloatFieldMaxPositiveValue", REQUIRED,
+      "FloatFieldMaxPositiveValue",
       R"({"optionalFloat": 3.402823e+38})",
       "optional_float: 3.402823e+38");
   RunValidJsonTest(
-      "FloatFieldMinNegativeValue", REQUIRED,
+      "FloatFieldMinNegativeValue",
       R"({"optionalFloat": 3.402823e+38})",
       "optional_float: 3.402823e+38");
   // Values can be quoted.
   RunValidJsonTest(
-      "FloatFieldQuotedValue", REQUIRED,
+      "FloatFieldQuotedValue",
       R"({"optionalFloat": "1"})",
       "optional_float: 1");
   // Special values.
   RunValidJsonTest(
-      "FloatFieldNan", REQUIRED,
+      "FloatFieldNan",
       R"({"optionalFloat": "NaN"})",
       "optional_float: nan");
   RunValidJsonTest(
-      "FloatFieldInfinity", REQUIRED,
+      "FloatFieldInfinity",
       R"({"optionalFloat": "Infinity"})",
       "optional_float: inf");
   RunValidJsonTest(
-      "FloatFieldNegativeInfinity", REQUIRED,
+      "FloatFieldNegativeInfinity",
       R"({"optionalFloat": "-Infinity"})",
       "optional_float: -inf");
   // Non-cannonical Nan will be correctly normalized.
   {
-    TestAllTypesProto3 message;
+    TestAllTypes message;
     // IEEE floating-point standard 32-bit quiet NaN:
     //   0111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
     message.set_optional_float(
         WireFormatLite::DecodeFloat(0x7FA12345));
     RunValidJsonTestWithProtobufInput(
-        "FloatFieldNormalizeQuietNan", REQUIRED, message,
+        "FloatFieldNormalizeQuietNan", message,
         "optional_float: nan");
     // IEEE floating-point standard 64-bit signaling NaN:
     //   1111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
     message.set_optional_float(
         WireFormatLite::DecodeFloat(0xFFB54321));
     RunValidJsonTestWithProtobufInput(
-        "FloatFieldNormalizeSignalingNan", REQUIRED, message,
+        "FloatFieldNormalizeSignalingNan", message,
         "optional_float: nan");
   }
 
   // Special values must be quoted.
   ExpectParseFailureForJson(
-      "FloatFieldNanNotQuoted", RECOMMENDED,
+      "FloatFieldNanNotQuoted",
       R"({"optionalFloat": NaN})");
   ExpectParseFailureForJson(
-      "FloatFieldInfinityNotQuoted", RECOMMENDED,
+      "FloatFieldInfinityNotQuoted",
       R"({"optionalFloat": Infinity})");
   ExpectParseFailureForJson(
-      "FloatFieldNegativeInfinityNotQuoted", RECOMMENDED,
+      "FloatFieldNegativeInfinityNotQuoted",
       R"({"optionalFloat": -Infinity})");
   // Parsers should reject out-of-bound values.
   ExpectParseFailureForJson(
-      "FloatFieldTooSmall", REQUIRED,
+      "FloatFieldTooSmall",
       R"({"optionalFloat": -3.502823e+38})");
   ExpectParseFailureForJson(
-      "FloatFieldTooLarge", REQUIRED,
+      "FloatFieldTooLarge",
       R"({"optionalFloat": 3.502823e+38})");
 
   // Double fields.
   RunValidJsonTest(
-      "DoubleFieldMinPositiveValue", REQUIRED,
+      "DoubleFieldMinPositiveValue",
       R"({"optionalDouble": 2.22507e-308})",
       "optional_double: 2.22507e-308");
   RunValidJsonTest(
-      "DoubleFieldMaxNegativeValue", REQUIRED,
+      "DoubleFieldMaxNegativeValue",
       R"({"optionalDouble": -2.22507e-308})",
       "optional_double: -2.22507e-308");
   RunValidJsonTest(
-      "DoubleFieldMaxPositiveValue", REQUIRED,
+      "DoubleFieldMaxPositiveValue",
       R"({"optionalDouble": 1.79769e+308})",
       "optional_double: 1.79769e+308");
   RunValidJsonTest(
-      "DoubleFieldMinNegativeValue", REQUIRED,
+      "DoubleFieldMinNegativeValue",
       R"({"optionalDouble": -1.79769e+308})",
       "optional_double: -1.79769e+308");
   // Values can be quoted.
   RunValidJsonTest(
-      "DoubleFieldQuotedValue", REQUIRED,
+      "DoubleFieldQuotedValue",
       R"({"optionalDouble": "1"})",
       "optional_double: 1");
   // Speical values.
   RunValidJsonTest(
-      "DoubleFieldNan", REQUIRED,
+      "DoubleFieldNan",
       R"({"optionalDouble": "NaN"})",
       "optional_double: nan");
   RunValidJsonTest(
-      "DoubleFieldInfinity", REQUIRED,
+      "DoubleFieldInfinity",
       R"({"optionalDouble": "Infinity"})",
       "optional_double: inf");
   RunValidJsonTest(
-      "DoubleFieldNegativeInfinity", REQUIRED,
+      "DoubleFieldNegativeInfinity",
       R"({"optionalDouble": "-Infinity"})",
       "optional_double: -inf");
   // Non-cannonical Nan will be correctly normalized.
   {
-    TestAllTypesProto3 message;
+    TestAllTypes message;
     message.set_optional_double(
         WireFormatLite::DecodeDouble(0x7FFA123456789ABCLL));
     RunValidJsonTestWithProtobufInput(
-        "DoubleFieldNormalizeQuietNan", REQUIRED, message,
+        "DoubleFieldNormalizeQuietNan", message,
         "optional_double: nan");
     message.set_optional_double(
         WireFormatLite::DecodeDouble(0xFFFBCBA987654321LL));
     RunValidJsonTestWithProtobufInput(
-        "DoubleFieldNormalizeSignalingNan", REQUIRED, message,
+        "DoubleFieldNormalizeSignalingNan", message,
         "optional_double: nan");
   }
 
   // Special values must be quoted.
   ExpectParseFailureForJson(
-      "DoubleFieldNanNotQuoted", RECOMMENDED,
+      "DoubleFieldNanNotQuoted",
       R"({"optionalDouble": NaN})");
   ExpectParseFailureForJson(
-      "DoubleFieldInfinityNotQuoted", RECOMMENDED,
+      "DoubleFieldInfinityNotQuoted",
       R"({"optionalDouble": Infinity})");
   ExpectParseFailureForJson(
-      "DoubleFieldNegativeInfinityNotQuoted", RECOMMENDED,
+      "DoubleFieldNegativeInfinityNotQuoted",
       R"({"optionalDouble": -Infinity})");
 
   // Parsers should reject out-of-bound values.
   ExpectParseFailureForJson(
-      "DoubleFieldTooSmall", REQUIRED,
+      "DoubleFieldTooSmall",
       R"({"optionalDouble": -1.89769e+308})");
   ExpectParseFailureForJson(
-      "DoubleFieldTooLarge", REQUIRED,
+      "DoubleFieldTooLarge",
       R"({"optionalDouble": +1.89769e+308})");
 
   // Enum fields.
   RunValidJsonTest(
-      "EnumField", REQUIRED,
+      "EnumField",
       R"({"optionalNestedEnum": "FOO"})",
       "optional_nested_enum: FOO");
   // Enum values must be represented as strings.
   ExpectParseFailureForJson(
-      "EnumFieldNotQuoted", REQUIRED,
+      "EnumFieldNotQuoted",
       R"({"optionalNestedEnum": FOO})");
   // Numeric values are allowed.
   RunValidJsonTest(
-      "EnumFieldNumericValueZero", REQUIRED,
+      "EnumFieldNumericValueZero",
       R"({"optionalNestedEnum": 0})",
       "optional_nested_enum: FOO");
   RunValidJsonTest(
-      "EnumFieldNumericValueNonZero", REQUIRED,
+      "EnumFieldNumericValueNonZero",
       R"({"optionalNestedEnum": 1})",
       "optional_nested_enum: BAR");
   // Unknown enum values are represented as numeric values.
   RunValidJsonTestWithValidator(
-      "EnumFieldUnknownValue", REQUIRED,
+      "EnumFieldUnknownValue",
       R"({"optionalNestedEnum": 123})",
       [](const Json::Value& value) {
         return value["optionalNestedEnum"].type() == Json::intValue &&
@@ -1594,216 +1128,177 @@
 
   // String fields.
   RunValidJsonTest(
-      "StringField", REQUIRED,
+      "StringField",
       R"({"optionalString": "Hello world!"})",
       "optional_string: \"Hello world!\"");
   RunValidJsonTest(
-      "StringFieldUnicode", REQUIRED,
+      "StringFieldUnicode",
       // Google in Chinese.
       R"({"optionalString": "谷歌"})",
       R"(optional_string: "谷歌")");
   RunValidJsonTest(
-      "StringFieldEscape", REQUIRED,
+      "StringFieldEscape",
       R"({"optionalString": "\"\\\/\b\f\n\r\t"})",
       R"(optional_string: "\"\\/\b\f\n\r\t")");
   RunValidJsonTest(
-      "StringFieldUnicodeEscape", REQUIRED,
+      "StringFieldUnicodeEscape",
       R"({"optionalString": "\u8C37\u6B4C"})",
       R"(optional_string: "谷歌")");
   RunValidJsonTest(
-      "StringFieldUnicodeEscapeWithLowercaseHexLetters", REQUIRED,
+      "StringFieldUnicodeEscapeWithLowercaseHexLetters",
       R"({"optionalString": "\u8c37\u6b4c"})",
       R"(optional_string: "谷歌")");
   RunValidJsonTest(
-      "StringFieldSurrogatePair", REQUIRED,
+      "StringFieldSurrogatePair",
       // The character is an emoji: grinning face with smiling eyes. 😁
       R"({"optionalString": "\uD83D\uDE01"})",
       R"(optional_string: "\xF0\x9F\x98\x81")");
 
   // Unicode escapes must start with "\u" (lowercase u).
   ExpectParseFailureForJson(
-      "StringFieldUppercaseEscapeLetter", RECOMMENDED,
+      "StringFieldUppercaseEscapeLetter",
       R"({"optionalString": "\U8C37\U6b4C"})");
   ExpectParseFailureForJson(
-      "StringFieldInvalidEscape", RECOMMENDED,
+      "StringFieldInvalidEscape",
       R"({"optionalString": "\uXXXX\u6B4C"})");
   ExpectParseFailureForJson(
-      "StringFieldUnterminatedEscape", RECOMMENDED,
+      "StringFieldUnterminatedEscape",
       R"({"optionalString": "\u8C3"})");
   ExpectParseFailureForJson(
-      "StringFieldUnpairedHighSurrogate", RECOMMENDED,
+      "StringFieldUnpairedHighSurrogate",
       R"({"optionalString": "\uD800"})");
   ExpectParseFailureForJson(
-      "StringFieldUnpairedLowSurrogate", RECOMMENDED,
+      "StringFieldUnpairedLowSurrogate",
       R"({"optionalString": "\uDC00"})");
   ExpectParseFailureForJson(
-      "StringFieldSurrogateInWrongOrder", RECOMMENDED,
+      "StringFieldSurrogateInWrongOrder",
       R"({"optionalString": "\uDE01\uD83D"})");
   ExpectParseFailureForJson(
-      "StringFieldNotAString", REQUIRED,
+      "StringFieldNotAString",
       R"({"optionalString": 12345})");
 
   // Bytes fields.
   RunValidJsonTest(
-      "BytesField", REQUIRED,
+      "BytesField",
       R"({"optionalBytes": "AQI="})",
       R"(optional_bytes: "\x01\x02")");
-  RunValidJsonTest(
-      "BytesFieldBase64Url", RECOMMENDED,
-      R"({"optionalBytes": "-_"})",
-      R"(optional_bytes: "\xfb")");
+  ExpectParseFailureForJson(
+      "BytesFieldNoPadding",
+      R"({"optionalBytes": "AQI"})");
+  ExpectParseFailureForJson(
+      "BytesFieldInvalidBase64Characters",
+      R"({"optionalBytes": "-_=="})");
 
   // Message fields.
   RunValidJsonTest(
-      "MessageField", REQUIRED,
+      "MessageField",
       R"({"optionalNestedMessage": {"a": 1234}})",
       "optional_nested_message: {a: 1234}");
 
   // Oneof fields.
   ExpectParseFailureForJson(
-      "OneofFieldDuplicate", REQUIRED,
+      "OneofFieldDuplicate",
       R"({"oneofUint32": 1, "oneofString": "test"})");
-  // Ensure zero values for oneof make it out/backs.
-  TestAllTypesProto3 messageProto3;
-  TestAllTypesProto2 messageProto2;
-  TestOneofMessage(messageProto3, true);
-  TestOneofMessage(messageProto2, false);
-  RunValidJsonTest(
-      "OneofZeroUint32", RECOMMENDED,
-      R"({"oneofUint32": 0})", "oneof_uint32: 0");
-  RunValidJsonTest(
-      "OneofZeroMessage", RECOMMENDED,
-      R"({"oneofNestedMessage": {}})", "oneof_nested_message: {}");
-  RunValidJsonTest(
-      "OneofZeroString", RECOMMENDED,
-      R"({"oneofString": ""})", "oneof_string: \"\"");
-  RunValidJsonTest(
-      "OneofZeroBytes", RECOMMENDED,
-      R"({"oneofBytes": ""})", "oneof_bytes: \"\"");
-  RunValidJsonTest(
-      "OneofZeroBool", RECOMMENDED,
-      R"({"oneofBool": false})", "oneof_bool: false");
-  RunValidJsonTest(
-      "OneofZeroUint64", RECOMMENDED,
-      R"({"oneofUint64": 0})", "oneof_uint64: 0");
-  RunValidJsonTest(
-      "OneofZeroFloat", RECOMMENDED,
-      R"({"oneofFloat": 0.0})", "oneof_float: 0");
-  RunValidJsonTest(
-      "OneofZeroDouble", RECOMMENDED,
-      R"({"oneofDouble": 0.0})", "oneof_double: 0");
-  RunValidJsonTest(
-      "OneofZeroEnum", RECOMMENDED,
-      R"({"oneofEnum":"FOO"})", "oneof_enum: FOO");
 
   // Repeated fields.
   RunValidJsonTest(
-      "PrimitiveRepeatedField", REQUIRED,
+      "PrimitiveRepeatedField",
       R"({"repeatedInt32": [1, 2, 3, 4]})",
       "repeated_int32: [1, 2, 3, 4]");
   RunValidJsonTest(
-      "EnumRepeatedField", REQUIRED,
+      "EnumRepeatedField",
       R"({"repeatedNestedEnum": ["FOO", "BAR", "BAZ"]})",
       "repeated_nested_enum: [FOO, BAR, BAZ]");
   RunValidJsonTest(
-      "StringRepeatedField", REQUIRED,
+      "StringRepeatedField",
       R"({"repeatedString": ["Hello", "world"]})",
       R"(repeated_string: ["Hello", "world"])");
   RunValidJsonTest(
-      "BytesRepeatedField", REQUIRED,
+      "BytesRepeatedField",
       R"({"repeatedBytes": ["AAEC", "AQI="]})",
       R"(repeated_bytes: ["\x00\x01\x02", "\x01\x02"])");
   RunValidJsonTest(
-      "MessageRepeatedField", REQUIRED,
+      "MessageRepeatedField",
       R"({"repeatedNestedMessage": [{"a": 1234}, {"a": 5678}]})",
       "repeated_nested_message: {a: 1234}"
       "repeated_nested_message: {a: 5678}");
 
   // Repeated field elements are of incorrect type.
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingIntegersGotBool", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingIntegersGotBool",
       R"({"repeatedInt32": [1, false, 3, 4]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingIntegersGotString", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingIntegersGotString",
       R"({"repeatedInt32": [1, 2, "name", 4]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingIntegersGotMessage", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingIntegersGotMessage",
       R"({"repeatedInt32": [1, 2, 3, {"a": 4}]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingStringsGotInt", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingStringsGotInt",
       R"({"repeatedString": ["1", 2, "3", "4"]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingStringsGotBool", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingStringsGotBool",
       R"({"repeatedString": ["1", "2", false, "4"]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingStringsGotMessage", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingStringsGotMessage",
       R"({"repeatedString": ["1", 2, "3", {"a": 4}]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingMessagesGotInt", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingMessagesGotInt",
       R"({"repeatedNestedMessage": [{"a": 1}, 2]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingMessagesGotBool", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingMessagesGotBool",
       R"({"repeatedNestedMessage": [{"a": 1}, false]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldWrongElementTypeExpectingMessagesGotString", REQUIRED,
+      "RepeatedFieldWrongElementTypeExpectingMessagesGotString",
       R"({"repeatedNestedMessage": [{"a": 1}, "2"]})");
   // Trailing comma in the repeated field is not allowed.
   ExpectParseFailureForJson(
-      "RepeatedFieldTrailingComma", RECOMMENDED,
+      "RepeatedFieldTrailingComma",
       R"({"repeatedInt32": [1, 2, 3, 4,]})");
-  ExpectParseFailureForJson(
-      "RepeatedFieldTrailingCommaWithSpace", RECOMMENDED,
-      "{\"repeatedInt32\": [1, 2, 3, 4 ,]}");
-  ExpectParseFailureForJson(
-      "RepeatedFieldTrailingCommaWithSpaceCommaSpace", RECOMMENDED,
-      "{\"repeatedInt32\": [1, 2, 3, 4 , ]}");
-  ExpectParseFailureForJson(
-      "RepeatedFieldTrailingCommaWithNewlines", RECOMMENDED,
-      "{\"repeatedInt32\": [\n  1,\n  2,\n  3,\n  4,\n]}");
 
   // Map fields.
   RunValidJsonTest(
-      "Int32MapField", REQUIRED,
+      "Int32MapField",
       R"({"mapInt32Int32": {"1": 2, "3": 4}})",
       "map_int32_int32: {key: 1 value: 2}"
       "map_int32_int32: {key: 3 value: 4}");
   ExpectParseFailureForJson(
-      "Int32MapFieldKeyNotQuoted", RECOMMENDED,
+      "Int32MapFieldKeyNotQuoted",
       R"({"mapInt32Int32": {1: 2, 3: 4}})");
   RunValidJsonTest(
-      "Uint32MapField", REQUIRED,
+      "Uint32MapField",
       R"({"mapUint32Uint32": {"1": 2, "3": 4}})",
       "map_uint32_uint32: {key: 1 value: 2}"
       "map_uint32_uint32: {key: 3 value: 4}");
   ExpectParseFailureForJson(
-      "Uint32MapFieldKeyNotQuoted", RECOMMENDED,
+      "Uint32MapFieldKeyNotQuoted",
       R"({"mapUint32Uint32": {1: 2, 3: 4}})");
   RunValidJsonTest(
-      "Int64MapField", REQUIRED,
+      "Int64MapField",
       R"({"mapInt64Int64": {"1": 2, "3": 4}})",
       "map_int64_int64: {key: 1 value: 2}"
       "map_int64_int64: {key: 3 value: 4}");
   ExpectParseFailureForJson(
-      "Int64MapFieldKeyNotQuoted", RECOMMENDED,
+      "Int64MapFieldKeyNotQuoted",
       R"({"mapInt64Int64": {1: 2, 3: 4}})");
   RunValidJsonTest(
-      "Uint64MapField", REQUIRED,
+      "Uint64MapField",
       R"({"mapUint64Uint64": {"1": 2, "3": 4}})",
       "map_uint64_uint64: {key: 1 value: 2}"
       "map_uint64_uint64: {key: 3 value: 4}");
   ExpectParseFailureForJson(
-      "Uint64MapFieldKeyNotQuoted", RECOMMENDED,
+      "Uint64MapFieldKeyNotQuoted",
       R"({"mapUint64Uint64": {1: 2, 3: 4}})");
   RunValidJsonTest(
-      "BoolMapField", REQUIRED,
+      "BoolMapField",
       R"({"mapBoolBool": {"true": true, "false": false}})",
       "map_bool_bool: {key: true value: true}"
       "map_bool_bool: {key: false value: false}");
   ExpectParseFailureForJson(
-      "BoolMapFieldKeyNotQuoted", RECOMMENDED,
+      "BoolMapFieldKeyNotQuoted",
       R"({"mapBoolBool": {true: true, false: false}})");
   RunValidJsonTest(
-      "MessageMapField", REQUIRED,
+      "MessageMapField",
       R"({
         "mapStringNestedMessage": {
           "hello": {"a": 1234},
@@ -1822,34 +1317,26 @@
       )");
   // Since Map keys are represented as JSON strings, escaping should be allowed.
   RunValidJsonTest(
-      "Int32MapEscapedKey", REQUIRED,
+      "Int32MapEscapedKey",
       R"({"mapInt32Int32": {"\u0031": 2}})",
       "map_int32_int32: {key: 1 value: 2}");
   RunValidJsonTest(
-      "Int64MapEscapedKey", REQUIRED,
+      "Int64MapEscapedKey",
       R"({"mapInt64Int64": {"\u0031": 2}})",
       "map_int64_int64: {key: 1 value: 2}");
   RunValidJsonTest(
-      "BoolMapEscapedKey", REQUIRED,
+      "BoolMapEscapedKey",
       R"({"mapBoolBool": {"tr\u0075e": true}})",
       "map_bool_bool: {key: true value: true}");
 
   // "null" is accepted for all fields types.
   RunValidJsonTest(
-      "AllFieldAcceptNull", REQUIRED,
+      "AllFieldAcceptNull",
       R"({
         "optionalInt32": null,
         "optionalInt64": null,
         "optionalUint32": null,
         "optionalUint64": null,
-        "optionalSint32": null,
-        "optionalSint64": null,
-        "optionalFixed32": null,
-        "optionalFixed64": null,
-        "optionalSfixed32": null,
-        "optionalSfixed64": null,
-        "optionalFloat": null,
-        "optionalDouble": null,
         "optionalBool": null,
         "optionalString": null,
         "optionalBytes": null,
@@ -1859,14 +1346,6 @@
         "repeatedInt64": null,
         "repeatedUint32": null,
         "repeatedUint64": null,
-        "repeatedSint32": null,
-        "repeatedSint64": null,
-        "repeatedFixed32": null,
-        "repeatedFixed64": null,
-        "repeatedSfixed32": null,
-        "repeatedSfixed64": null,
-        "repeatedFloat": null,
-        "repeatedDouble": null,
         "repeatedBool": null,
         "repeatedString": null,
         "repeatedBytes": null,
@@ -1880,79 +1359,59 @@
 
   // Repeated field elements cannot be null.
   ExpectParseFailureForJson(
-      "RepeatedFieldPrimitiveElementIsNull", RECOMMENDED,
+      "RepeatedFieldPrimitiveElementIsNull",
       R"({"repeatedInt32": [1, null, 2]})");
   ExpectParseFailureForJson(
-      "RepeatedFieldMessageElementIsNull", RECOMMENDED,
+      "RepeatedFieldMessageElementIsNull",
       R"({"repeatedNestedMessage": [{"a":1}, null, {"a":2}]})");
   // Map field keys cannot be null.
   ExpectParseFailureForJson(
-      "MapFieldKeyIsNull", RECOMMENDED,
+      "MapFieldKeyIsNull",
       R"({"mapInt32Int32": {null: 1}})");
   // Map field values cannot be null.
   ExpectParseFailureForJson(
-      "MapFieldValueIsNull", RECOMMENDED,
+      "MapFieldValueIsNull",
       R"({"mapInt32Int32": {"0": null}})");
 
-  // http://www.rfc-editor.org/rfc/rfc7159.txt says strings have to use double
-  // quotes.
-  ExpectParseFailureForJson(
-      "StringFieldSingleQuoteKey", RECOMMENDED,
-      R"({'optionalString': "Hello world!"})");
-  ExpectParseFailureForJson(
-      "StringFieldSingleQuoteValue", RECOMMENDED,
-      R"({"optionalString": 'Hello world!'})");
-  ExpectParseFailureForJson(
-      "StringFieldSingleQuoteBoth", RECOMMENDED,
-      R"({'optionalString': 'Hello world!'})");
-
-  // Unknown fields.
-  {
-    TestAllTypesProto3 messageProto3;
-    TestAllTypesProto2 messageProto2;
-    TestUnknownMessage(messageProto3, true);
-    TestUnknownMessage(messageProto2, false);
-  }
-
   // Wrapper types.
   RunValidJsonTest(
-      "OptionalBoolWrapper", REQUIRED,
+      "OptionalBoolWrapper",
       R"({"optionalBoolWrapper": false})",
       "optional_bool_wrapper: {value: false}");
   RunValidJsonTest(
-      "OptionalInt32Wrapper", REQUIRED,
+      "OptionalInt32Wrapper",
       R"({"optionalInt32Wrapper": 0})",
       "optional_int32_wrapper: {value: 0}");
   RunValidJsonTest(
-      "OptionalUint32Wrapper", REQUIRED,
+      "OptionalUint32Wrapper",
       R"({"optionalUint32Wrapper": 0})",
       "optional_uint32_wrapper: {value: 0}");
   RunValidJsonTest(
-      "OptionalInt64Wrapper", REQUIRED,
+      "OptionalInt64Wrapper",
       R"({"optionalInt64Wrapper": 0})",
       "optional_int64_wrapper: {value: 0}");
   RunValidJsonTest(
-      "OptionalUint64Wrapper", REQUIRED,
+      "OptionalUint64Wrapper",
       R"({"optionalUint64Wrapper": 0})",
       "optional_uint64_wrapper: {value: 0}");
   RunValidJsonTest(
-      "OptionalFloatWrapper", REQUIRED,
+      "OptionalFloatWrapper",
       R"({"optionalFloatWrapper": 0})",
       "optional_float_wrapper: {value: 0}");
   RunValidJsonTest(
-      "OptionalDoubleWrapper", REQUIRED,
+      "OptionalDoubleWrapper",
       R"({"optionalDoubleWrapper": 0})",
       "optional_double_wrapper: {value: 0}");
   RunValidJsonTest(
-      "OptionalStringWrapper", REQUIRED,
+      "OptionalStringWrapper",
       R"({"optionalStringWrapper": ""})",
       R"(optional_string_wrapper: {value: ""})");
   RunValidJsonTest(
-      "OptionalBytesWrapper", REQUIRED,
+      "OptionalBytesWrapper",
       R"({"optionalBytesWrapper": ""})",
       R"(optional_bytes_wrapper: {value: ""})");
   RunValidJsonTest(
-      "OptionalWrapperTypesWithNonDefaultValue", REQUIRED,
+      "OptionalWrapperTypesWithNonDefaultValue",
       R"({
         "optionalBoolWrapper": true,
         "optionalInt32Wrapper": 1,
@@ -1976,56 +1435,56 @@
         optional_bytes_wrapper: {value: "\x01\x02"}
       )");
   RunValidJsonTest(
-      "RepeatedBoolWrapper", REQUIRED,
+      "RepeatedBoolWrapper",
       R"({"repeatedBoolWrapper": [true, false]})",
       "repeated_bool_wrapper: {value: true}"
       "repeated_bool_wrapper: {value: false}");
   RunValidJsonTest(
-      "RepeatedInt32Wrapper", REQUIRED,
+      "RepeatedInt32Wrapper",
       R"({"repeatedInt32Wrapper": [0, 1]})",
       "repeated_int32_wrapper: {value: 0}"
       "repeated_int32_wrapper: {value: 1}");
   RunValidJsonTest(
-      "RepeatedUint32Wrapper", REQUIRED,
+      "RepeatedUint32Wrapper",
       R"({"repeatedUint32Wrapper": [0, 1]})",
       "repeated_uint32_wrapper: {value: 0}"
       "repeated_uint32_wrapper: {value: 1}");
   RunValidJsonTest(
-      "RepeatedInt64Wrapper", REQUIRED,
+      "RepeatedInt64Wrapper",
       R"({"repeatedInt64Wrapper": [0, 1]})",
       "repeated_int64_wrapper: {value: 0}"
       "repeated_int64_wrapper: {value: 1}");
   RunValidJsonTest(
-      "RepeatedUint64Wrapper", REQUIRED,
+      "RepeatedUint64Wrapper",
       R"({"repeatedUint64Wrapper": [0, 1]})",
       "repeated_uint64_wrapper: {value: 0}"
       "repeated_uint64_wrapper: {value: 1}");
   RunValidJsonTest(
-      "RepeatedFloatWrapper", REQUIRED,
+      "RepeatedFloatWrapper",
       R"({"repeatedFloatWrapper": [0, 1]})",
       "repeated_float_wrapper: {value: 0}"
       "repeated_float_wrapper: {value: 1}");
   RunValidJsonTest(
-      "RepeatedDoubleWrapper", REQUIRED,
+      "RepeatedDoubleWrapper",
       R"({"repeatedDoubleWrapper": [0, 1]})",
       "repeated_double_wrapper: {value: 0}"
       "repeated_double_wrapper: {value: 1}");
   RunValidJsonTest(
-      "RepeatedStringWrapper", REQUIRED,
+      "RepeatedStringWrapper",
       R"({"repeatedStringWrapper": ["", "AQI="]})",
       R"(
         repeated_string_wrapper: {value: ""}
         repeated_string_wrapper: {value: "AQI="}
       )");
   RunValidJsonTest(
-      "RepeatedBytesWrapper", REQUIRED,
+      "RepeatedBytesWrapper",
       R"({"repeatedBytesWrapper": ["", "AQI="]})",
       R"(
         repeated_bytes_wrapper: {value: ""}
         repeated_bytes_wrapper: {value: "\x01\x02"}
       )");
   RunValidJsonTest(
-      "WrapperTypesWithNullValue", REQUIRED,
+      "WrapperTypesWithNullValue",
       R"({
         "optionalBoolWrapper": null,
         "optionalInt32Wrapper": null,
@@ -2050,59 +1509,55 @@
 
   // Duration
   RunValidJsonTest(
-      "DurationMinValue", REQUIRED,
+      "DurationMinValue",
       R"({"optionalDuration": "-315576000000.999999999s"})",
       "optional_duration: {seconds: -315576000000 nanos: -999999999}");
   RunValidJsonTest(
-      "DurationMaxValue", REQUIRED,
+      "DurationMaxValue",
       R"({"optionalDuration": "315576000000.999999999s"})",
       "optional_duration: {seconds: 315576000000 nanos: 999999999}");
   RunValidJsonTest(
-      "DurationRepeatedValue", REQUIRED,
+      "DurationRepeatedValue",
       R"({"repeatedDuration": ["1.5s", "-1.5s"]})",
       "repeated_duration: {seconds: 1 nanos: 500000000}"
       "repeated_duration: {seconds: -1 nanos: -500000000}");
-  RunValidJsonTest(
-      "DurationNull", REQUIRED,
-      R"({"optionalDuration": null})",
-      "");
 
   ExpectParseFailureForJson(
-      "DurationMissingS", REQUIRED,
+      "DurationMissingS",
       R"({"optionalDuration": "1"})");
   ExpectParseFailureForJson(
-      "DurationJsonInputTooSmall", REQUIRED,
+      "DurationJsonInputTooSmall",
       R"({"optionalDuration": "-315576000001.000000000s"})");
   ExpectParseFailureForJson(
-      "DurationJsonInputTooLarge", REQUIRED,
+      "DurationJsonInputTooLarge",
       R"({"optionalDuration": "315576000001.000000000s"})");
   ExpectSerializeFailureForJson(
-      "DurationProtoInputTooSmall", REQUIRED,
+      "DurationProtoInputTooSmall",
       "optional_duration: {seconds: -315576000001 nanos: 0}");
   ExpectSerializeFailureForJson(
-      "DurationProtoInputTooLarge", REQUIRED,
+      "DurationProtoInputTooLarge",
       "optional_duration: {seconds: 315576000001 nanos: 0}");
 
   RunValidJsonTestWithValidator(
-      "DurationHasZeroFractionalDigit", RECOMMENDED,
+      "DurationHasZeroFractionalDigit",
       R"({"optionalDuration": "1.000000000s"})",
       [](const Json::Value& value) {
         return value["optionalDuration"].asString() == "1s";
       });
   RunValidJsonTestWithValidator(
-      "DurationHas3FractionalDigits", RECOMMENDED,
+      "DurationHas3FractionalDigits",
       R"({"optionalDuration": "1.010000000s"})",
       [](const Json::Value& value) {
         return value["optionalDuration"].asString() == "1.010s";
       });
   RunValidJsonTestWithValidator(
-      "DurationHas6FractionalDigits", RECOMMENDED,
+      "DurationHas6FractionalDigits",
       R"({"optionalDuration": "1.000010000s"})",
       [](const Json::Value& value) {
         return value["optionalDuration"].asString() == "1.000010s";
       });
   RunValidJsonTestWithValidator(
-      "DurationHas9FractionalDigits", RECOMMENDED,
+      "DurationHas9FractionalDigits",
       R"({"optionalDuration": "1.000000010s"})",
       [](const Json::Value& value) {
         return value["optionalDuration"].asString() == "1.000000010s";
@@ -2110,15 +1565,15 @@
 
   // Timestamp
   RunValidJsonTest(
-      "TimestampMinValue", REQUIRED,
+      "TimestampMinValue",
       R"({"optionalTimestamp": "0001-01-01T00:00:00Z"})",
       "optional_timestamp: {seconds: -62135596800}");
   RunValidJsonTest(
-      "TimestampMaxValue", REQUIRED,
+      "TimestampMaxValue",
       R"({"optionalTimestamp": "9999-12-31T23:59:59.999999999Z"})",
       "optional_timestamp: {seconds: 253402300799 nanos: 999999999}");
   RunValidJsonTest(
-      "TimestampRepeatedValue", REQUIRED,
+      "TimestampRepeatedValue",
       R"({
         "repeatedTimestamp": [
           "0001-01-01T00:00:00Z",
@@ -2128,72 +1583,68 @@
       "repeated_timestamp: {seconds: -62135596800}"
       "repeated_timestamp: {seconds: 253402300799 nanos: 999999999}");
   RunValidJsonTest(
-      "TimestampWithPositiveOffset", REQUIRED,
+      "TimestampWithPositiveOffset",
       R"({"optionalTimestamp": "1970-01-01T08:00:00+08:00"})",
       "optional_timestamp: {seconds: 0}");
   RunValidJsonTest(
-      "TimestampWithNegativeOffset", REQUIRED,
+      "TimestampWithNegativeOffset",
       R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})",
       "optional_timestamp: {seconds: 0}");
-  RunValidJsonTest(
-      "TimestampNull", REQUIRED,
-      R"({"optionalTimestamp": null})",
-      "");
 
   ExpectParseFailureForJson(
-      "TimestampJsonInputTooSmall", REQUIRED,
+      "TimestampJsonInputTooSmall",
       R"({"optionalTimestamp": "0000-01-01T00:00:00Z"})");
   ExpectParseFailureForJson(
-      "TimestampJsonInputTooLarge", REQUIRED,
+      "TimestampJsonInputTooLarge",
       R"({"optionalTimestamp": "10000-01-01T00:00:00Z"})");
   ExpectParseFailureForJson(
-      "TimestampJsonInputMissingZ", REQUIRED,
+      "TimestampJsonInputMissingZ",
       R"({"optionalTimestamp": "0001-01-01T00:00:00"})");
   ExpectParseFailureForJson(
-      "TimestampJsonInputMissingT", REQUIRED,
+      "TimestampJsonInputMissingT",
       R"({"optionalTimestamp": "0001-01-01 00:00:00Z"})");
   ExpectParseFailureForJson(
-      "TimestampJsonInputLowercaseZ", REQUIRED,
+      "TimestampJsonInputLowercaseZ",
       R"({"optionalTimestamp": "0001-01-01T00:00:00z"})");
   ExpectParseFailureForJson(
-      "TimestampJsonInputLowercaseT", REQUIRED,
+      "TimestampJsonInputLowercaseT",
       R"({"optionalTimestamp": "0001-01-01t00:00:00Z"})");
   ExpectSerializeFailureForJson(
-      "TimestampProtoInputTooSmall", REQUIRED,
+      "TimestampProtoInputTooSmall",
       "optional_timestamp: {seconds: -62135596801}");
   ExpectSerializeFailureForJson(
-      "TimestampProtoInputTooLarge", REQUIRED,
+      "TimestampProtoInputTooLarge",
       "optional_timestamp: {seconds: 253402300800}");
   RunValidJsonTestWithValidator(
-      "TimestampZeroNormalized", RECOMMENDED,
+      "TimestampZeroNormalized",
       R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})",
       [](const Json::Value& value) {
         return value["optionalTimestamp"].asString() ==
             "1970-01-01T00:00:00Z";
       });
   RunValidJsonTestWithValidator(
-      "TimestampHasZeroFractionalDigit", RECOMMENDED,
+      "TimestampHasZeroFractionalDigit",
       R"({"optionalTimestamp": "1970-01-01T00:00:00.000000000Z"})",
       [](const Json::Value& value) {
         return value["optionalTimestamp"].asString() ==
             "1970-01-01T00:00:00Z";
       });
   RunValidJsonTestWithValidator(
-      "TimestampHas3FractionalDigits", RECOMMENDED,
+      "TimestampHas3FractionalDigits",
       R"({"optionalTimestamp": "1970-01-01T00:00:00.010000000Z"})",
       [](const Json::Value& value) {
         return value["optionalTimestamp"].asString() ==
             "1970-01-01T00:00:00.010Z";
       });
   RunValidJsonTestWithValidator(
-      "TimestampHas6FractionalDigits", RECOMMENDED,
+      "TimestampHas6FractionalDigits",
       R"({"optionalTimestamp": "1970-01-01T00:00:00.000010000Z"})",
       [](const Json::Value& value) {
         return value["optionalTimestamp"].asString() ==
             "1970-01-01T00:00:00.000010Z";
       });
   RunValidJsonTestWithValidator(
-      "TimestampHas9FractionalDigits", RECOMMENDED,
+      "TimestampHas9FractionalDigits",
       R"({"optionalTimestamp": "1970-01-01T00:00:00.000000010Z"})",
       [](const Json::Value& value) {
         return value["optionalTimestamp"].asString() ==
@@ -2202,25 +1653,25 @@
 
   // FieldMask
   RunValidJsonTest(
-      "FieldMask", REQUIRED,
+      "FieldMask",
       R"({"optionalFieldMask": "foo,barBaz"})",
       R"(optional_field_mask: {paths: "foo" paths: "bar_baz"})");
   ExpectParseFailureForJson(
-      "FieldMaskInvalidCharacter", RECOMMENDED,
+      "FieldMaskInvalidCharacter",
       R"({"optionalFieldMask": "foo,bar_bar"})");
   ExpectSerializeFailureForJson(
-      "FieldMaskPathsDontRoundTrip", RECOMMENDED,
+      "FieldMaskPathsDontRoundTrip",
       R"(optional_field_mask: {paths: "fooBar"})");
   ExpectSerializeFailureForJson(
-      "FieldMaskNumbersDontRoundTrip", RECOMMENDED,
+      "FieldMaskNumbersDontRoundTrip",
       R"(optional_field_mask: {paths: "foo_3_bar"})");
   ExpectSerializeFailureForJson(
-      "FieldMaskTooManyUnderscore", RECOMMENDED,
+      "FieldMaskTooManyUnderscore",
       R"(optional_field_mask: {paths: "foo__bar"})");
 
   // Struct
   RunValidJsonTest(
-      "Struct", REQUIRED,
+      "Struct",
       R"({
         "optionalStruct": {
           "nullValue": null,
@@ -2286,27 +1737,27 @@
       )");
   // Value
   RunValidJsonTest(
-      "ValueAcceptInteger", REQUIRED,
+      "ValueAcceptInteger",
       R"({"optionalValue": 1})",
       "optional_value: { number_value: 1}");
   RunValidJsonTest(
-      "ValueAcceptFloat", REQUIRED,
+      "ValueAcceptFloat",
       R"({"optionalValue": 1.5})",
       "optional_value: { number_value: 1.5}");
   RunValidJsonTest(
-      "ValueAcceptBool", REQUIRED,
+      "ValueAcceptBool",
       R"({"optionalValue": false})",
       "optional_value: { bool_value: false}");
   RunValidJsonTest(
-      "ValueAcceptNull", REQUIRED,
+      "ValueAcceptNull",
       R"({"optionalValue": null})",
       "optional_value: { null_value: NULL_VALUE}");
   RunValidJsonTest(
-      "ValueAcceptString", REQUIRED,
+      "ValueAcceptString",
       R"({"optionalValue": "hello"})",
       R"(optional_value: { string_value: "hello"})");
   RunValidJsonTest(
-      "ValueAcceptList", REQUIRED,
+      "ValueAcceptList",
       R"({"optionalValue": [0, "hello"]})",
       R"(
         optional_value: {
@@ -2321,7 +1772,7 @@
         }
       )");
   RunValidJsonTest(
-      "ValueAcceptObject", REQUIRED,
+      "ValueAcceptObject",
       R"({"optionalValue": {"value": 1}})",
       R"(
         optional_value: {
@@ -2338,27 +1789,27 @@
 
   // Any
   RunValidJsonTest(
-      "Any", REQUIRED,
+      "Any",
       R"({
         "optionalAny": {
-          "@type": "type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3",
+          "@type": "type.googleapis.com/conformance.TestAllTypes",
           "optionalInt32": 12345
         }
       })",
       R"(
         optional_any: {
-          [type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3] {
+          [type.googleapis.com/conformance.TestAllTypes] {
             optional_int32: 12345
           }
         }
       )");
   RunValidJsonTest(
-      "AnyNested", REQUIRED,
+      "AnyNested",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Any",
           "value": {
-            "@type": "type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3",
+            "@type": "type.googleapis.com/conformance.TestAllTypes",
             "optionalInt32": 12345
           }
         }
@@ -2366,7 +1817,7 @@
       R"(
         optional_any: {
           [type.googleapis.com/google.protobuf.Any] {
-            [type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3] {
+            [type.googleapis.com/conformance.TestAllTypes] {
               optional_int32: 12345
             }
           }
@@ -2374,23 +1825,23 @@
       )");
   // The special "@type" tag is not required to appear first.
   RunValidJsonTest(
-      "AnyUnorderedTypeTag", REQUIRED,
+      "AnyUnorderedTypeTag",
       R"({
         "optionalAny": {
           "optionalInt32": 12345,
-          "@type": "type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3"
+          "@type": "type.googleapis.com/conformance.TestAllTypes"
         }
       })",
       R"(
         optional_any: {
-          [type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3] {
+          [type.googleapis.com/conformance.TestAllTypes] {
             optional_int32: 12345
           }
         }
       )");
   // Well-known types in Any.
   RunValidJsonTest(
-      "AnyWithInt32ValueWrapper", REQUIRED,
+      "AnyWithInt32ValueWrapper",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Int32Value",
@@ -2405,7 +1856,7 @@
         }
       )");
   RunValidJsonTest(
-      "AnyWithDuration", REQUIRED,
+      "AnyWithDuration",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Duration",
@@ -2421,7 +1872,7 @@
         }
       )");
   RunValidJsonTest(
-      "AnyWithTimestamp", REQUIRED,
+      "AnyWithTimestamp",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Timestamp",
@@ -2437,7 +1888,7 @@
         }
       )");
   RunValidJsonTest(
-      "AnyWithFieldMask", REQUIRED,
+      "AnyWithFieldMask",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.FieldMask",
@@ -2452,7 +1903,7 @@
         }
       )");
   RunValidJsonTest(
-      "AnyWithStruct", REQUIRED,
+      "AnyWithStruct",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Struct",
@@ -2474,7 +1925,7 @@
         }
       )");
   RunValidJsonTest(
-      "AnyWithValueForJsonObject", REQUIRED,
+      "AnyWithValueForJsonObject",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Value",
@@ -2498,7 +1949,7 @@
         }
       )");
   RunValidJsonTest(
-      "AnyWithValueForInteger", REQUIRED,
+      "AnyWithValueForInteger",
       R"({
         "optionalAny": {
           "@type": "type.googleapis.com/google.protobuf.Value",
@@ -2514,34 +1965,27 @@
       )");
 
   bool ok = true;
-  if (!CheckSetEmpty(expected_to_fail_, "nonexistent_tests.txt",
+  if (!CheckSetEmpty(expected_to_fail_,
                      "These tests were listed in the failure list, but they "
-                     "don't exist.  Remove them from the failure list by "
-                     "running:\n"
-                     "  ./update_failure_list.py " + failure_list_filename_ +
-                     " --remove nonexistent_tests.txt")) {
+                     "don't exist.  Remove them from the failure list")) {
     ok = false;
   }
-  if (!CheckSetEmpty(unexpected_failing_tests_, "failing_tests.txt",
+  if (!CheckSetEmpty(unexpected_failing_tests_,
                      "These tests failed.  If they can't be fixed right now, "
                      "you can add them to the failure list so the overall "
-                     "suite can succeed.  Add them to the failure list by "
-                     "running:\n"
-                     "  ./update_failure_list.py " + failure_list_filename_ +
-                     " --add failing_tests.txt")) {
-    ok = false;
-  }
-  if (!CheckSetEmpty(unexpected_succeeding_tests_, "succeeding_tests.txt",
-                     "These tests succeeded, even though they were listed in "
-                     "the failure list.  Remove them from the failure list "
-                     "by running:\n"
-                     "  ./update_failure_list.py " + failure_list_filename_ +
-                     " --remove succeeding_tests.txt")) {
+                     "suite can succeed")) {
     ok = false;
   }
 
+  // Sometimes the testee may be fixed before we update the failure list (e.g.,
+  // the testee is from a different component). We warn about this case but
+  // don't consider it an overall test failure.
+  CheckSetEmpty(unexpected_succeeding_tests_,
+                "These tests succeeded, even though they were listed in "
+                "the failure list.  Remove them from the failure list");
+
   if (verbose_) {
-    CheckSetEmpty(skipped_, "",
+    CheckSetEmpty(skipped_,
                   "These tests were skipped (probably because support for some "
                   "features is not implemented)");
   }
diff --git a/conformance/conformance_test.h b/conformance/conformance_test.h
index 4882412..75fc97b 100644
--- a/conformance/conformance_test.h
+++ b/conformance/conformance_test.h
@@ -49,14 +49,9 @@
 namespace conformance {
 class ConformanceRequest;
 class ConformanceResponse;
+class TestAllTypes;
 }  // namespace conformance
 
-namespace protobuf_test_messages {
-namespace proto3 {
-class TestAllTypesProto3;
-}  // namespace proto3
-}  // namespace protobuf_test_messages
-
 namespace google {
 namespace protobuf {
 
@@ -96,30 +91,14 @@
 //
 class ConformanceTestSuite {
  public:
-  ConformanceTestSuite() : verbose_(false), enforce_recommended_(false) {}
+  ConformanceTestSuite() : verbose_(false) {}
 
   void SetVerbose(bool verbose) { verbose_ = verbose; }
 
   // Sets the list of tests that are expected to fail when RunSuite() is called.
   // RunSuite() will fail unless the set of failing tests is exactly the same
   // as this list.
-  //
-  // The filename here is *only* used to create/format useful error messages for
-  // how to update the failure list.  We do NOT read this file at all.
-  void SetFailureList(const std::string& filename,
-                      const std::vector<std::string>& failure_list);
-
-  // Whether to require the testee to pass RECOMMENDED tests. By default failing
-  // a RECOMMENDED test case will not fail the entire suite but will only
-  // generated a warning. If this flag is set to true, RECOMMENDED tests will
-  // be treated the same way as REQUIRED tests and failing a RECOMMENDED test
-  // case will cause the entire test suite to fail as well. An implementation
-  // can enable this if it wants to be strictly conforming to protobuf spec.
-  // See the comments about ConformanceLevel below to learn more about the
-  // difference between REQUIRED and RECOMMENDED test cases.
-  void SetEnforceRecommended(bool value) {
-    enforce_recommended_ = value;
-  }
+  void SetFailureList(const std::vector<std::string>& failure_list);
 
   // Run all the conformance tests against the given test runner.
   // Test output will be stored in "output".
@@ -130,27 +109,8 @@
   bool RunSuite(ConformanceTestRunner* runner, std::string* output);
 
  private:
-  // Test cases are classified into a few categories:
-  //   REQUIRED: the test case must be passed for an implementation to be
-  //             interoperable with other implementations. For example, a
-  //             parser implementaiton must accept both packed and unpacked
-  //             form of repeated primitive fields.
-  //   RECOMMENDED: the test case is not required for the implementation to
-  //                be interoperable with other implementations, but is
-  //                recommended for best performance and compatibility. For
-  //                example, a proto3 serializer should serialize repeated
-  //                primitive fields in packed form, but an implementation
-  //                failing to do so will still be able to communicate with
-  //                other implementations.
-  enum ConformanceLevel {
-    REQUIRED = 0,
-    RECOMMENDED = 1,
-  };
-  string ConformanceLevelToString(ConformanceLevel level);
-
   void ReportSuccess(const std::string& test_name);
   void ReportFailure(const string& test_name,
-                     ConformanceLevel level,
                      const conformance::ConformanceRequest& request,
                      const conformance::ConformanceResponse& response,
                      const char* fmt, ...);
@@ -160,84 +120,35 @@
   void RunTest(const std::string& test_name,
                const conformance::ConformanceRequest& request,
                conformance::ConformanceResponse* response);
-  void RunValidInputTest(const string& test_name,
-                         ConformanceLevel level,
-                         const string& input,
+  void RunValidInputTest(const string& test_name, const string& input,
                          conformance::WireFormat input_format,
                          const string& equivalent_text_format,
-                         conformance::WireFormat requested_output,
-                         bool isProto3);
-  void RunValidBinaryInputTest(const string& test_name,
-                               ConformanceLevel level,
-                               const string& input,
-                               conformance::WireFormat input_format,
-                               const string& equivalent_wire_format,
-                               conformance::WireFormat requested_output,
-                               bool isProto3);
-  void RunValidJsonTest(const string& test_name,
-                        ConformanceLevel level,
-                        const string& input_json,
+                         conformance::WireFormat requested_output);
+  void RunValidJsonTest(const string& test_name, const string& input_json,
                         const string& equivalent_text_format);
-  void RunValidJsonTestWithProtobufInput(
-      const string& test_name,
-      ConformanceLevel level,
-      const protobuf_test_messages::proto3::TestAllTypesProto3& input,
-      const string& equivalent_text_format);
-  void RunValidProtobufTest(const string& test_name, ConformanceLevel level,
-                            const string& input_protobuf,
-                            const string& equivalent_text_format,
-                            bool isProto3);
-  void RunValidBinaryProtobufTest(const string& test_name,
-                                  ConformanceLevel level,
-                                  const string& input_protobuf,
-                                  bool isProto3);
-  void RunValidProtobufTestWithMessage(
-      const string& test_name, ConformanceLevel level,
-      const Message *input,
-      const string& equivalent_text_format,
-      bool isProto3);
+  void RunValidJsonTestWithProtobufInput(const string& test_name,
+                                         const conformance::TestAllTypes& input,
+                                         const string& equivalent_text_format);
 
   typedef std::function<bool(const Json::Value&)> Validator;
   void RunValidJsonTestWithValidator(const string& test_name,
-                                     ConformanceLevel level,
                                      const string& input_json,
                                      const Validator& validator);
   void ExpectParseFailureForJson(const string& test_name,
-                                 ConformanceLevel level,
                                  const string& input_json);
   void ExpectSerializeFailureForJson(const string& test_name,
-                                     ConformanceLevel level,
                                      const string& text_format);
-  void ExpectParseFailureForProtoWithProtoVersion (const string& proto,
-                                                   const string& test_name,
-                                                   ConformanceLevel level,
-                                                   bool isProto3);
   void ExpectParseFailureForProto(const std::string& proto,
-                                  const std::string& test_name,
-                                  ConformanceLevel level);
+                                  const std::string& test_name);
   void ExpectHardParseFailureForProto(const std::string& proto,
-                                      const std::string& test_name,
-                                      ConformanceLevel level);
+                                      const std::string& test_name);
   void TestPrematureEOFForType(google::protobuf::FieldDescriptor::Type type);
-  void TestIllegalTags();
-  template <class MessageType>
-  void TestOneofMessage (MessageType &message,
-                         bool isProto3);
-  template <class MessageType>
-  void TestUnknownMessage (MessageType &message,
-                           bool isProto3);
-  void TestValidDataForType(
-      google::protobuf::FieldDescriptor::Type,
-      std::vector<std::pair<std::string, std::string>> values);
-  bool CheckSetEmpty(const std::set<string>& set_to_check,
-                     const std::string& write_to_file, const std::string& msg);
+  bool CheckSetEmpty(const set<string>& set_to_check, const char* msg);
   ConformanceTestRunner* runner_;
   int successes_;
   int expected_failures_;
   bool verbose_;
-  bool enforce_recommended_;
   std::string output_;
-  std::string failure_list_filename_;
 
   // The set of test names that are expected to fail in this run, but haven't
   // failed yet.
diff --git a/conformance/conformance_test_runner.cc b/conformance/conformance_test_runner.cc
index 7e91d38..376a60b 100644
--- a/conformance/conformance_test_runner.cc
+++ b/conformance/conformance_test_runner.cc
@@ -251,16 +251,6 @@
           "                              should contain one test name per\n");
   fprintf(stderr,
           "                              line.  Use '#' for comments.\n");
-  fprintf(stderr,
-          "  --enforce_recommended       Enforce that recommended test\n");
-  fprintf(stderr,
-          "                              cases are also passing. Specify\n");
-  fprintf(stderr,
-          "                              this flag if you want to be\n");
-  fprintf(stderr,
-          "                              strictly conforming to protobuf\n");
-  fprintf(stderr,
-          "                              spec.\n");
   exit(1);
 }
 
@@ -290,18 +280,14 @@
   char *program;
   google::protobuf::ConformanceTestSuite suite;
 
-  string failure_list_filename;
   vector<string> failure_list;
 
   for (int arg = 1; arg < argc; ++arg) {
     if (strcmp(argv[arg], "--failure_list") == 0) {
       if (++arg == argc) UsageError();
-      failure_list_filename = argv[arg];
       ParseFailureList(argv[arg], &failure_list);
     } else if (strcmp(argv[arg], "--verbose") == 0) {
       suite.SetVerbose(true);
-    } else if (strcmp(argv[arg], "--enforce_recommended") == 0) {
-      suite.SetEnforceRecommended(true);
     } else if (argv[arg][0] == '-') {
       fprintf(stderr, "Unknown option: %s\n", argv[arg]);
       UsageError();
@@ -314,7 +300,7 @@
     }
   }
 
-  suite.SetFailureList(failure_list_filename, failure_list);
+  suite.SetFailureList(failure_list);
   ForkPipeRunner runner(program);
 
   std::string output;
diff --git a/conformance/failure_list_cpp.txt b/conformance/failure_list_cpp.txt
index 8c32889..2ddf831 100644
--- a/conformance/failure_list_cpp.txt
+++ b/conformance/failure_list_cpp.txt
@@ -7,51 +7,100 @@
 # TODO(haberman): insert links to corresponding bugs tracking the issue.
 # Should we use GitHub issues or the Google-internal bug tracker?
 
-Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
-Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
-Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.Proto3.JsonInput.BoolFieldDoubleQuotedFalse
-Recommended.Proto3.JsonInput.BoolFieldDoubleQuotedTrue
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
-Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
-Recommended.Proto3.JsonInput.FieldNameDuplicate
-Recommended.Proto3.JsonInput.FieldNameDuplicateDifferentCasing1
-Recommended.Proto3.JsonInput.FieldNameDuplicateDifferentCasing2
-Recommended.Proto3.JsonInput.FieldNameNotQuoted
-Recommended.Proto3.JsonInput.MapFieldValueIsNull
-Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
-Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull
-Recommended.Proto3.JsonInput.RepeatedFieldTrailingComma
-Recommended.Proto3.JsonInput.RepeatedFieldTrailingCommaWithNewlines
-Recommended.Proto3.JsonInput.RepeatedFieldTrailingCommaWithSpace
-Recommended.Proto3.JsonInput.RepeatedFieldTrailingCommaWithSpaceCommaSpace
-Recommended.Proto3.JsonInput.StringFieldSingleQuoteBoth
-Recommended.Proto3.JsonInput.StringFieldSingleQuoteKey
-Recommended.Proto3.JsonInput.StringFieldSingleQuoteValue
-Recommended.Proto3.JsonInput.StringFieldUppercaseEscapeLetter
-Recommended.Proto3.JsonInput.TrailingCommaInAnObject
-Recommended.Proto3.JsonInput.TrailingCommaInAnObjectWithNewlines
-Recommended.Proto3.JsonInput.TrailingCommaInAnObjectWithSpace
-Recommended.Proto3.JsonInput.TrailingCommaInAnObjectWithSpaceCommaSpace
-Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
-Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.BOOL
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.ENUM
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.INT32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.INT64
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.SINT32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.SINT64
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.UINT32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.UINT64
-Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
-Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.BOOL
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.ENUM
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.INT32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.INT64
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT64
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT64
-
+FieldMaskNumbersDontRoundTrip.JsonOutput
+FieldMaskPathsDontRoundTrip.JsonOutput
+FieldMaskTooManyUnderscore.JsonOutput
+JsonInput.AnyUnorderedTypeTag.JsonOutput
+JsonInput.AnyUnorderedTypeTag.ProtobufOutput
+JsonInput.AnyWithValueForInteger.JsonOutput
+JsonInput.AnyWithValueForInteger.ProtobufOutput
+JsonInput.AnyWithValueForJsonObject.JsonOutput
+JsonInput.AnyWithValueForJsonObject.ProtobufOutput
+JsonInput.BoolFieldDoubleQuotedFalse
+JsonInput.BoolFieldDoubleQuotedTrue
+JsonInput.BoolFieldIntegerOne
+JsonInput.BoolFieldIntegerZero
+JsonInput.BytesFieldInvalidBase64Characters
+JsonInput.BytesFieldNoPadding
+JsonInput.DoubleFieldTooSmall
+JsonInput.DurationHasZeroFractionalDigit.Validator
+JsonInput.DurationJsonInputTooLarge
+JsonInput.DurationJsonInputTooSmall
+JsonInput.DurationMissingS
+JsonInput.EnumFieldUnknownValue.Validator
+JsonInput.FieldMaskInvalidCharacter
+JsonInput.FieldNameDuplicate
+JsonInput.FieldNameDuplicateDifferentCasing1
+JsonInput.FieldNameDuplicateDifferentCasing2
+JsonInput.FieldNameInLowerCamelCase.Validator
+JsonInput.FieldNameInSnakeCase.JsonOutput
+JsonInput.FieldNameInSnakeCase.ProtobufOutput
+JsonInput.FieldNameNotQuoted
+JsonInput.FloatFieldTooLarge
+JsonInput.FloatFieldTooSmall
+JsonInput.Int32FieldLeadingSpace
+JsonInput.Int32FieldLeadingZero
+JsonInput.Int32FieldMinFloatValue.JsonOutput
+JsonInput.Int32FieldMinFloatValue.ProtobufOutput
+JsonInput.Int32FieldMinValue.JsonOutput
+JsonInput.Int32FieldMinValue.ProtobufOutput
+JsonInput.Int32FieldNegativeWithLeadingZero
+JsonInput.Int32FieldNotInteger
+JsonInput.Int32FieldNotNumber
+JsonInput.Int32FieldTooLarge
+JsonInput.Int32FieldTooSmall
+JsonInput.Int32FieldTrailingSpace
+JsonInput.Int64FieldNotInteger
+JsonInput.Int64FieldNotNumber
+JsonInput.Int64FieldTooLarge
+JsonInput.Int64FieldTooSmall
+JsonInput.MapFieldValueIsNull
+JsonInput.OneofFieldDuplicate
+JsonInput.RepeatedFieldMessageElementIsNull
+JsonInput.RepeatedFieldPrimitiveElementIsNull
+JsonInput.RepeatedFieldTrailingComma
+JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
+JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotMessage
+JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotString
+JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotBool
+JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotInt
+JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotString
+JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
+JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
+JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotMessage
+JsonInput.StringFieldNotAString
+JsonInput.StringFieldSurrogateInWrongOrder
+JsonInput.StringFieldSurrogatePair.JsonOutput
+JsonInput.StringFieldSurrogatePair.ProtobufOutput
+JsonInput.StringFieldUnpairedHighSurrogate
+JsonInput.StringFieldUnpairedLowSurrogate
+JsonInput.StringFieldUppercaseEscapeLetter
+JsonInput.TimestampJsonInputLowercaseT
+JsonInput.TimestampJsonInputLowercaseZ
+JsonInput.TimestampJsonInputMissingT
+JsonInput.TimestampJsonInputMissingZ
+JsonInput.TimestampJsonInputTooLarge
+JsonInput.TimestampJsonInputTooSmall
+JsonInput.TrailingCommaInAnObject
+JsonInput.Uint32FieldNotInteger
+JsonInput.Uint32FieldNotNumber
+JsonInput.Uint32FieldTooLarge
+JsonInput.Uint64FieldNotInteger
+JsonInput.Uint64FieldNotNumber
+JsonInput.Uint64FieldTooLarge
+JsonInput.WrapperTypesWithNullValue.JsonOutput
+JsonInput.WrapperTypesWithNullValue.ProtobufOutput
+ProtobufInput.PrematureEofBeforeKnownRepeatedValue.MESSAGE
+ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
+ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
+ProtobufInput.PrematureEofInPackedField.BOOL
+ProtobufInput.PrematureEofInPackedField.ENUM
+ProtobufInput.PrematureEofInPackedField.INT32
+ProtobufInput.PrematureEofInPackedField.INT64
+ProtobufInput.PrematureEofInPackedField.SINT32
+ProtobufInput.PrematureEofInPackedField.SINT64
+ProtobufInput.PrematureEofInPackedField.UINT32
+ProtobufInput.PrematureEofInPackedField.UINT64
+ProtobufInput.PrematureEofInsideKnownRepeatedValue.MESSAGE
+TimestampProtoInputTooLarge.JsonOutput
+TimestampProtoInputTooSmall.JsonOutput
diff --git a/conformance/failure_list_csharp.txt b/conformance/failure_list_csharp.txt
index 2a20aa7..a46cee4 100644
--- a/conformance/failure_list_csharp.txt
+++ b/conformance/failure_list_csharp.txt
@@ -1,2 +1,16 @@
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
+JsonInput.AnyWithValueForInteger.JsonOutput
+JsonInput.AnyWithValueForJsonObject.JsonOutput
+JsonInput.FieldNameInLowerCamelCase.Validator
+JsonInput.FieldNameInSnakeCase.JsonOutput
+JsonInput.FieldNameInSnakeCase.ProtobufOutput
+JsonInput.FieldNameWithMixedCases.JsonOutput
+JsonInput.FieldNameWithMixedCases.ProtobufOutput
+JsonInput.FieldNameWithMixedCases.Validator
+JsonInput.Int32FieldMinFloatValue.JsonOutput
+JsonInput.Int32FieldMinValue.JsonOutput
+JsonInput.Int64FieldMaxValueNotQuoted.JsonOutput
+JsonInput.Int64FieldMaxValueNotQuoted.ProtobufOutput
+JsonInput.OriginalProtoFieldName.JsonOutput
+JsonInput.StringFieldSurrogatePair.JsonOutput
+JsonInput.Uint64FieldMaxValueNotQuoted.JsonOutput
+JsonInput.Uint64FieldMaxValueNotQuoted.ProtobufOutput
diff --git a/conformance/failure_list_java.txt b/conformance/failure_list_java.txt
index 5116c56..552c0cc 100644
--- a/conformance/failure_list_java.txt
+++ b/conformance/failure_list_java.txt
@@ -4,44 +4,46 @@
 # By listing them here we can keep tabs on which ones are failing and be sure
 # that we don't introduce regressions in other tests.
 
-Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
-Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
-Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.Proto3.JsonInput.BoolFieldAllCapitalFalse
-Recommended.Proto3.JsonInput.BoolFieldAllCapitalTrue
-Recommended.Proto3.JsonInput.BoolFieldCamelCaseFalse
-Recommended.Proto3.JsonInput.BoolFieldCamelCaseTrue
-Recommended.Proto3.JsonInput.BoolFieldDoubleQuotedFalse
-Recommended.Proto3.JsonInput.BoolFieldDoubleQuotedTrue
-Recommended.Proto3.JsonInput.BoolMapFieldKeyNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldInfinityNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldNanNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldNegativeInfinityNotQuoted
-Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
-Recommended.Proto3.JsonInput.FieldNameDuplicate
-Recommended.Proto3.JsonInput.FieldNameNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldInfinityNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldNanNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldNegativeInfinityNotQuoted
-Recommended.Proto3.JsonInput.Int32MapFieldKeyNotQuoted
-Recommended.Proto3.JsonInput.Int64MapFieldKeyNotQuoted
-Recommended.Proto3.JsonInput.JsonWithComments
-Recommended.Proto3.JsonInput.StringFieldSingleQuoteBoth
-Recommended.Proto3.JsonInput.StringFieldSingleQuoteKey
-Recommended.Proto3.JsonInput.StringFieldSingleQuoteValue
-Recommended.Proto3.JsonInput.StringFieldSurrogateInWrongOrder
-Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
-Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
-Recommended.Proto3.JsonInput.Uint32MapFieldKeyNotQuoted
-Recommended.Proto3.JsonInput.Uint64MapFieldKeyNotQuoted
-Required.Proto3.JsonInput.EnumFieldNotQuoted
-Required.Proto3.JsonInput.Int32FieldLeadingZero
-Required.Proto3.JsonInput.Int32FieldNegativeWithLeadingZero
-Required.Proto3.JsonInput.Int32FieldPlusSign
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
-Required.Proto3.JsonInput.StringFieldNotAString
-Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
-Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
-Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
-Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
\ No newline at end of file
+FieldMaskNumbersDontRoundTrip.JsonOutput
+FieldMaskPathsDontRoundTrip.JsonOutput
+FieldMaskTooManyUnderscore.JsonOutput
+JsonInput.AnyWithFieldMask.ProtobufOutput
+JsonInput.AnyWithValueForInteger.JsonOutput
+JsonInput.AnyWithValueForJsonObject.JsonOutput
+JsonInput.BoolFieldAllCapitalFalse
+JsonInput.BoolFieldAllCapitalTrue
+JsonInput.BoolFieldCamelCaseFalse
+JsonInput.BoolFieldCamelCaseTrue
+JsonInput.BoolFieldDoubleQuotedFalse
+JsonInput.BoolFieldDoubleQuotedTrue
+JsonInput.BoolMapFieldKeyNotQuoted
+JsonInput.DoubleFieldInfinityNotQuoted
+JsonInput.DoubleFieldNanNotQuoted
+JsonInput.DoubleFieldNegativeInfinityNotQuoted
+JsonInput.EnumFieldNotQuoted
+JsonInput.FieldMask.ProtobufOutput
+JsonInput.FieldMaskInvalidCharacter
+JsonInput.FieldNameDuplicate
+JsonInput.FieldNameInSnakeCase.JsonOutput
+JsonInput.FieldNameNotQuoted
+JsonInput.FloatFieldInfinityNotQuoted
+JsonInput.FloatFieldNanNotQuoted
+JsonInput.FloatFieldNegativeInfinityNotQuoted
+JsonInput.Int32FieldLeadingZero
+JsonInput.Int32FieldMinFloatValue.JsonOutput
+JsonInput.Int32FieldMinValue.JsonOutput
+JsonInput.Int32FieldNegativeWithLeadingZero
+JsonInput.Int32FieldPlusSign
+JsonInput.Int32MapFieldKeyNotQuoted
+JsonInput.Int64MapFieldKeyNotQuoted
+JsonInput.JsonWithComments
+JsonInput.OriginalProtoFieldName.JsonOutput
+JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
+JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
+JsonInput.StringFieldNotAString
+JsonInput.StringFieldSurrogateInWrongOrder
+JsonInput.StringFieldUnpairedHighSurrogate
+JsonInput.StringFieldUnpairedLowSurrogate
+JsonInput.StringFieldUppercaseEscapeLetter
+JsonInput.Uint32MapFieldKeyNotQuoted
+JsonInput.Uint64MapFieldKeyNotQuoted
diff --git a/conformance/failure_list_js.txt b/conformance/failure_list_js.txt
deleted file mode 100644
index f8f6a57..0000000
--- a/conformance/failure_list_js.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Required.Proto3.ProtobufInput.ValidDataRepeated.BOOL.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.DOUBLE.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED32.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED32.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SINT32.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.ProtobufOutput
diff --git a/conformance/failure_list_objc.txt b/conformance/failure_list_objc.txt
index e34501e..5dac350 100644
--- a/conformance/failure_list_objc.txt
+++ b/conformance/failure_list_objc.txt
@@ -1,2 +1,4 @@
-# JSON input or output tests are skipped (in conformance_objc.m) as mobile
-# platforms don't support JSON wire format to avoid code bloat.
+# No tests currently failing.
+#
+# json input or output tests are skipped (in conformance_objc.m) as mobile
+# platforms don't support json wire format to avoid code bloat.
diff --git a/conformance/failure_list_php.txt b/conformance/failure_list_php.txt
deleted file mode 100644
index 0d23411..0000000
--- a/conformance/failure_list_php.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
-Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
-Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
-Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHas9FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHasZeroFractionalDigit.Validator
-Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
-Required.Proto3.JsonInput.FloatFieldTooLarge
-Required.Proto3.JsonInput.FloatFieldTooSmall
-Required.Proto3.JsonInput.DoubleFieldTooSmall
-Required.Proto3.JsonInput.Int32FieldNotInteger
-Required.Proto3.JsonInput.Int64FieldNotInteger
-Required.Proto3.JsonInput.Uint32FieldNotInteger
-Required.Proto3.JsonInput.Uint64FieldNotInteger
-Required.Proto3.JsonInput.Int32FieldLeadingSpace
-Required.Proto3.JsonInput.OneofFieldDuplicate
-Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.JsonOutput
diff --git a/conformance/failure_list_php_c.txt b/conformance/failure_list_php_c.txt
deleted file mode 100644
index 088708e..0000000
--- a/conformance/failure_list_php_c.txt
+++ /dev/null
@@ -1,182 +0,0 @@
-Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
-Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
-Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.Proto3.JsonInput.BoolFieldIntegerOne
-Recommended.Proto3.JsonInput.BoolFieldIntegerZero
-Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHas9FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHasZeroFractionalDigit.Validator
-Recommended.Proto3.JsonInput.Int64FieldBeString.Validator
-Recommended.Proto3.JsonInput.MapFieldValueIsNull
-Recommended.Proto3.JsonInput.OneofZeroBytes.JsonOutput
-Recommended.Proto3.JsonInput.OneofZeroBytes.ProtobufOutput
-Recommended.Proto3.JsonInput.OneofZeroString.JsonOutput
-Recommended.Proto3.JsonInput.OneofZeroString.ProtobufOutput
-Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
-Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull
-Recommended.Proto3.JsonInput.StringEndsWithEscapeChar
-Recommended.Proto3.JsonInput.StringFieldSurrogateInWrongOrder
-Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
-Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
-Recommended.Proto3.JsonInput.Uint64FieldBeString.Validator
-Recommended.Proto3.ProtobufInput.OneofZeroBytes.JsonOutput
-Recommended.Proto3.ProtobufInput.OneofZeroBytes.ProtobufOutput
-Recommended.Proto3.ProtobufInput.OneofZeroString.JsonOutput
-Recommended.Proto3.ProtobufInput.OneofZeroString.ProtobufOutput
-Required.DurationProtoInputTooLarge.JsonOutput
-Required.DurationProtoInputTooSmall.JsonOutput
-Required.Proto3.JsonInput.Any.JsonOutput
-Required.Proto3.JsonInput.Any.ProtobufOutput
-Required.Proto3.JsonInput.AnyNested.JsonOutput
-Required.Proto3.JsonInput.AnyNested.ProtobufOutput
-Required.Proto3.JsonInput.AnyUnorderedTypeTag.JsonOutput
-Required.Proto3.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithDuration.JsonOutput
-Required.Proto3.JsonInput.AnyWithDuration.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithFieldMask.JsonOutput
-Required.Proto3.JsonInput.AnyWithFieldMask.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithInt32ValueWrapper.JsonOutput
-Required.Proto3.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithStruct.JsonOutput
-Required.Proto3.JsonInput.AnyWithStruct.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithTimestamp.JsonOutput
-Required.Proto3.JsonInput.AnyWithTimestamp.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithValueForInteger.JsonOutput
-Required.Proto3.JsonInput.AnyWithValueForInteger.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithValueForJsonObject.JsonOutput
-Required.Proto3.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
-Required.Proto3.JsonInput.BoolMapField.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldInfinity.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldInfinity.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMinNegativeValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldNan.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldNan.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldNegativeInfinity.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldQuotedValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
-Required.Proto3.JsonInput.DurationMaxValue.JsonOutput
-Required.Proto3.JsonInput.DurationMaxValue.ProtobufOutput
-Required.Proto3.JsonInput.DurationMinValue.JsonOutput
-Required.Proto3.JsonInput.DurationMinValue.ProtobufOutput
-Required.Proto3.JsonInput.DurationRepeatedValue.JsonOutput
-Required.Proto3.JsonInput.DurationRepeatedValue.ProtobufOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueNonZero.JsonOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueZero.JsonOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueZero.ProtobufOutput
-Required.Proto3.JsonInput.EnumFieldUnknownValue.Validator
-Required.Proto3.JsonInput.FieldMask.JsonOutput
-Required.Proto3.JsonInput.FieldMask.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldInfinity.JsonOutput
-Required.Proto3.JsonInput.FloatFieldInfinity.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldNan.JsonOutput
-Required.Proto3.JsonInput.FloatFieldNan.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldNegativeInfinity.JsonOutput
-Required.Proto3.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldQuotedValue.JsonOutput
-Required.Proto3.JsonInput.FloatFieldQuotedValue.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldTooLarge
-Required.Proto3.JsonInput.FloatFieldTooSmall
-Required.Proto3.JsonInput.Int32FieldExponentialFormat.JsonOutput
-Required.Proto3.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldFloatTrailingZero.JsonOutput
-Required.Proto3.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldMaxFloatValue.JsonOutput
-Required.Proto3.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldMinFloatValue.JsonOutput
-Required.Proto3.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldStringValue.JsonOutput
-Required.Proto3.JsonInput.Int32FieldStringValue.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldStringValueEscaped.JsonOutput
-Required.Proto3.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
-Required.Proto3.JsonInput.Int64FieldMaxValue.JsonOutput
-Required.Proto3.JsonInput.Int64FieldMaxValue.ProtobufOutput
-Required.Proto3.JsonInput.Int64FieldMinValue.JsonOutput
-Required.Proto3.JsonInput.Int64FieldMinValue.ProtobufOutput
-Required.Proto3.JsonInput.MessageField.JsonOutput
-Required.Proto3.JsonInput.MessageField.ProtobufOutput
-Required.Proto3.JsonInput.OptionalBoolWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalBoolWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalBytesWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalBytesWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalDoubleWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalDoubleWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalFloatWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalFloatWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalInt32Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalInt32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalInt64Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalInt64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalStringWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalStringWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalUint32Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalUint32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalUint64Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalUint64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
-Required.Proto3.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedBoolWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedBoolWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedBytesWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedBytesWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedDoubleWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotInt
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
-Required.Proto3.JsonInput.RepeatedFloatWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedFloatWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedInt32Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedInt64Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedStringWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedStringWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedUint32Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedUint64Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.StringFieldEscape.JsonOutput
-Required.Proto3.JsonInput.StringFieldEscape.ProtobufOutput
-Required.Proto3.JsonInput.StringFieldNotAString
-Required.Proto3.JsonInput.StringFieldSurrogatePair.JsonOutput
-Required.Proto3.JsonInput.StringFieldSurrogatePair.ProtobufOutput
-Required.Proto3.JsonInput.StringFieldUnicodeEscape.JsonOutput
-Required.Proto3.JsonInput.StringFieldUnicodeEscape.ProtobufOutput
-Required.Proto3.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.JsonOutput
-Required.Proto3.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
-Required.Proto3.JsonInput.Struct.JsonOutput
-Required.Proto3.JsonInput.Struct.ProtobufOutput
-Required.Proto3.JsonInput.Uint32FieldMaxFloatValue.JsonOutput
-Required.Proto3.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
-Required.Proto3.JsonInput.Uint64FieldMaxValue.JsonOutput
-Required.Proto3.JsonInput.Uint64FieldMaxValue.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptBool.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptBool.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptFloat.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptFloat.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptInteger.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptInteger.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptList.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptList.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptNull.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptNull.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptObject.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptObject.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptString.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptString.ProtobufOutput
-Required.Proto3.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
-Required.Proto3.ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
-Required.Proto3.ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
-Required.Proto3.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.JsonOutput
-Required.TimestampProtoInputTooLarge.JsonOutput
-Required.TimestampProtoInputTooSmall.JsonOutput
diff --git a/conformance/failure_list_php_zts_c.txt b/conformance/failure_list_php_zts_c.txt
deleted file mode 100644
index d9a8fe3..0000000
--- a/conformance/failure_list_php_zts_c.txt
+++ /dev/null
@@ -1,225 +0,0 @@
-Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
-Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
-Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.JsonInput.BoolFieldIntegerOne
-Recommended.JsonInput.BoolFieldIntegerZero
-Recommended.JsonInput.DurationHas3FractionalDigits.Validator
-Recommended.JsonInput.DurationHas6FractionalDigits.Validator
-Recommended.JsonInput.DurationHas9FractionalDigits.Validator
-Recommended.JsonInput.DurationHasZeroFractionalDigit.Validator
-Recommended.JsonInput.Int64FieldBeString.Validator
-Recommended.JsonInput.OneofZeroBytes.JsonOutput
-Recommended.JsonInput.OneofZeroBytes.ProtobufOutput
-Recommended.JsonInput.OneofZeroDouble.JsonOutput
-Recommended.JsonInput.OneofZeroDouble.ProtobufOutput
-Recommended.JsonInput.OneofZeroFloat.JsonOutput
-Recommended.JsonInput.OneofZeroFloat.ProtobufOutput
-Recommended.JsonInput.OneofZeroString.JsonOutput
-Recommended.JsonInput.OneofZeroString.ProtobufOutput
-Recommended.JsonInput.OneofZeroUint32.JsonOutput
-Recommended.JsonInput.OneofZeroUint32.ProtobufOutput
-Recommended.JsonInput.OneofZeroUint64.JsonOutput
-Recommended.JsonInput.OneofZeroUint64.ProtobufOutput
-Recommended.JsonInput.StringEndsWithEscapeChar
-Recommended.JsonInput.StringFieldSurrogateInWrongOrder
-Recommended.JsonInput.StringFieldUnpairedHighSurrogate
-Recommended.JsonInput.StringFieldUnpairedLowSurrogate
-Recommended.JsonInput.TimestampHas3FractionalDigits.Validator
-Recommended.JsonInput.TimestampHas6FractionalDigits.Validator
-Recommended.JsonInput.TimestampHas9FractionalDigits.Validator
-Recommended.JsonInput.TimestampHasZeroFractionalDigit.Validator
-Recommended.JsonInput.TimestampZeroNormalized.Validator
-Recommended.JsonInput.Uint64FieldBeString.Validator
-Recommended.ProtobufInput.OneofZeroBytes.JsonOutput
-Recommended.ProtobufInput.OneofZeroBytes.ProtobufOutput
-Recommended.ProtobufInput.OneofZeroString.JsonOutput
-Recommended.ProtobufInput.OneofZeroString.ProtobufOutput
-Required.DurationProtoInputTooLarge.JsonOutput
-Required.DurationProtoInputTooSmall.JsonOutput
-Required.JsonInput.AllFieldAcceptNull.ProtobufOutput
-Required.JsonInput.Any.JsonOutput
-Required.JsonInput.Any.ProtobufOutput
-Required.JsonInput.AnyNested.JsonOutput
-Required.JsonInput.AnyNested.ProtobufOutput
-Required.JsonInput.AnyUnorderedTypeTag.JsonOutput
-Required.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
-Required.JsonInput.AnyWithDuration.JsonOutput
-Required.JsonInput.AnyWithDuration.ProtobufOutput
-Required.JsonInput.AnyWithFieldMask.JsonOutput
-Required.JsonInput.AnyWithFieldMask.ProtobufOutput
-Required.JsonInput.AnyWithInt32ValueWrapper.JsonOutput
-Required.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
-Required.JsonInput.AnyWithStruct.JsonOutput
-Required.JsonInput.AnyWithStruct.ProtobufOutput
-Required.JsonInput.AnyWithTimestamp.JsonOutput
-Required.JsonInput.AnyWithTimestamp.ProtobufOutput
-Required.JsonInput.AnyWithValueForInteger.JsonOutput
-Required.JsonInput.AnyWithValueForInteger.ProtobufOutput
-Required.JsonInput.AnyWithValueForJsonObject.JsonOutput
-Required.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
-Required.JsonInput.BoolFieldFalse.ProtobufOutput
-Required.JsonInput.BoolMapField.JsonOutput
-Required.JsonInput.DoubleFieldInfinity.JsonOutput
-Required.JsonInput.DoubleFieldInfinity.ProtobufOutput
-Required.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
-Required.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
-Required.JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
-Required.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
-Required.JsonInput.DoubleFieldMinNegativeValue.JsonOutput
-Required.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
-Required.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
-Required.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
-Required.JsonInput.DoubleFieldNan.JsonOutput
-Required.JsonInput.DoubleFieldNan.ProtobufOutput
-Required.JsonInput.DoubleFieldNegativeInfinity.JsonOutput
-Required.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
-Required.JsonInput.DoubleFieldQuotedValue.JsonOutput
-Required.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
-Required.JsonInput.DurationMaxValue.JsonOutput
-Required.JsonInput.DurationMaxValue.ProtobufOutput
-Required.JsonInput.DurationMinValue.JsonOutput
-Required.JsonInput.DurationMinValue.ProtobufOutput
-Required.JsonInput.DurationRepeatedValue.JsonOutput
-Required.JsonInput.DurationRepeatedValue.ProtobufOutput
-Required.JsonInput.EnumField.ProtobufOutput
-Required.JsonInput.EnumFieldNumericValueNonZero.JsonOutput
-Required.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
-Required.JsonInput.EnumFieldNumericValueZero.JsonOutput
-Required.JsonInput.EnumFieldNumericValueZero.ProtobufOutput
-Required.JsonInput.EnumFieldUnknownValue.Validator
-Required.JsonInput.FieldMask.JsonOutput
-Required.JsonInput.FieldMask.ProtobufOutput
-Required.JsonInput.FloatFieldInfinity.JsonOutput
-Required.JsonInput.FloatFieldInfinity.ProtobufOutput
-Required.JsonInput.FloatFieldNan.JsonOutput
-Required.JsonInput.FloatFieldNan.ProtobufOutput
-Required.JsonInput.FloatFieldNegativeInfinity.JsonOutput
-Required.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
-Required.JsonInput.FloatFieldQuotedValue.JsonOutput
-Required.JsonInput.FloatFieldQuotedValue.ProtobufOutput
-Required.JsonInput.FloatFieldTooLarge
-Required.JsonInput.FloatFieldTooSmall
-Required.JsonInput.Int32FieldExponentialFormat.JsonOutput
-Required.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
-Required.JsonInput.Int32FieldFloatTrailingZero.JsonOutput
-Required.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
-Required.JsonInput.Int32FieldMaxFloatValue.JsonOutput
-Required.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
-Required.JsonInput.Int32FieldMinFloatValue.JsonOutput
-Required.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
-Required.JsonInput.Int32FieldStringValue.JsonOutput
-Required.JsonInput.Int32FieldStringValue.ProtobufOutput
-Required.JsonInput.Int32FieldStringValueEscaped.JsonOutput
-Required.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
-Required.JsonInput.Int32MapEscapedKey.JsonOutput
-Required.JsonInput.Int32MapEscapedKey.ProtobufOutput
-Required.JsonInput.Int32MapField.JsonOutput
-Required.JsonInput.Int32MapField.ProtobufOutput
-Required.JsonInput.Int64FieldMaxValue.JsonOutput
-Required.JsonInput.Int64FieldMaxValue.ProtobufOutput
-Required.JsonInput.Int64FieldMinValue.JsonOutput
-Required.JsonInput.Int64FieldMinValue.ProtobufOutput
-Required.JsonInput.Int64MapEscapedKey.JsonOutput
-Required.JsonInput.Int64MapEscapedKey.ProtobufOutput
-Required.JsonInput.Int64MapField.JsonOutput
-Required.JsonInput.Int64MapField.ProtobufOutput
-Required.JsonInput.MessageField.JsonOutput
-Required.JsonInput.MessageField.ProtobufOutput
-Required.JsonInput.MessageMapField.JsonOutput
-Required.JsonInput.MessageMapField.ProtobufOutput
-Required.JsonInput.MessageRepeatedField.JsonOutput
-Required.JsonInput.MessageRepeatedField.ProtobufOutput
-Required.JsonInput.OptionalBoolWrapper.JsonOutput
-Required.JsonInput.OptionalBoolWrapper.ProtobufOutput
-Required.JsonInput.OptionalBytesWrapper.JsonOutput
-Required.JsonInput.OptionalBytesWrapper.ProtobufOutput
-Required.JsonInput.OptionalDoubleWrapper.JsonOutput
-Required.JsonInput.OptionalDoubleWrapper.ProtobufOutput
-Required.JsonInput.OptionalFloatWrapper.JsonOutput
-Required.JsonInput.OptionalFloatWrapper.ProtobufOutput
-Required.JsonInput.OptionalInt32Wrapper.JsonOutput
-Required.JsonInput.OptionalInt32Wrapper.ProtobufOutput
-Required.JsonInput.OptionalInt64Wrapper.JsonOutput
-Required.JsonInput.OptionalInt64Wrapper.ProtobufOutput
-Required.JsonInput.OptionalStringWrapper.JsonOutput
-Required.JsonInput.OptionalStringWrapper.ProtobufOutput
-Required.JsonInput.OptionalUint32Wrapper.JsonOutput
-Required.JsonInput.OptionalUint32Wrapper.ProtobufOutput
-Required.JsonInput.OptionalUint64Wrapper.JsonOutput
-Required.JsonInput.OptionalUint64Wrapper.ProtobufOutput
-Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
-Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
-Required.JsonInput.PrimitiveRepeatedField.JsonOutput
-Required.JsonInput.PrimitiveRepeatedField.ProtobufOutput
-Required.JsonInput.RepeatedBoolWrapper.JsonOutput
-Required.JsonInput.RepeatedBoolWrapper.ProtobufOutput
-Required.JsonInput.RepeatedBytesWrapper.JsonOutput
-Required.JsonInput.RepeatedBytesWrapper.ProtobufOutput
-Required.JsonInput.RepeatedDoubleWrapper.JsonOutput
-Required.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
-Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
-Required.JsonInput.RepeatedFloatWrapper.JsonOutput
-Required.JsonInput.RepeatedFloatWrapper.ProtobufOutput
-Required.JsonInput.RepeatedInt32Wrapper.JsonOutput
-Required.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
-Required.JsonInput.RepeatedInt64Wrapper.JsonOutput
-Required.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
-Required.JsonInput.RepeatedStringWrapper.JsonOutput
-Required.JsonInput.RepeatedStringWrapper.ProtobufOutput
-Required.JsonInput.RepeatedUint32Wrapper.JsonOutput
-Required.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
-Required.JsonInput.RepeatedUint64Wrapper.JsonOutput
-Required.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
-Required.JsonInput.StringFieldEscape.JsonOutput
-Required.JsonInput.StringFieldEscape.ProtobufOutput
-Required.JsonInput.StringFieldNotAString
-Required.JsonInput.StringFieldSurrogatePair.JsonOutput
-Required.JsonInput.StringFieldSurrogatePair.ProtobufOutput
-Required.JsonInput.StringFieldUnicodeEscape.JsonOutput
-Required.JsonInput.StringFieldUnicodeEscape.ProtobufOutput
-Required.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.JsonOutput
-Required.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
-Required.JsonInput.Struct.JsonOutput
-Required.JsonInput.Struct.ProtobufOutput
-Required.JsonInput.TimestampMaxValue.JsonOutput
-Required.JsonInput.TimestampMaxValue.ProtobufOutput
-Required.JsonInput.TimestampMinValue.JsonOutput
-Required.JsonInput.TimestampMinValue.ProtobufOutput
-Required.JsonInput.TimestampRepeatedValue.JsonOutput
-Required.JsonInput.TimestampRepeatedValue.ProtobufOutput
-Required.JsonInput.TimestampWithNegativeOffset.JsonOutput
-Required.JsonInput.TimestampWithNegativeOffset.ProtobufOutput
-Required.JsonInput.TimestampWithPositiveOffset.JsonOutput
-Required.JsonInput.TimestampWithPositiveOffset.ProtobufOutput
-Required.JsonInput.Uint32FieldMaxFloatValue.JsonOutput
-Required.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
-Required.JsonInput.Uint32MapField.JsonOutput
-Required.JsonInput.Uint32MapField.ProtobufOutput
-Required.JsonInput.Uint64FieldMaxValue.JsonOutput
-Required.JsonInput.Uint64FieldMaxValue.ProtobufOutput
-Required.JsonInput.Uint64MapField.JsonOutput
-Required.JsonInput.Uint64MapField.ProtobufOutput
-Required.JsonInput.ValueAcceptBool.JsonOutput
-Required.JsonInput.ValueAcceptBool.ProtobufOutput
-Required.JsonInput.ValueAcceptFloat.JsonOutput
-Required.JsonInput.ValueAcceptFloat.ProtobufOutput
-Required.JsonInput.ValueAcceptInteger.JsonOutput
-Required.JsonInput.ValueAcceptInteger.ProtobufOutput
-Required.JsonInput.ValueAcceptList.JsonOutput
-Required.JsonInput.ValueAcceptList.ProtobufOutput
-Required.JsonInput.ValueAcceptNull.JsonOutput
-Required.JsonInput.ValueAcceptNull.ProtobufOutput
-Required.JsonInput.ValueAcceptObject.JsonOutput
-Required.JsonInput.ValueAcceptObject.ProtobufOutput
-Required.JsonInput.ValueAcceptString.JsonOutput
-Required.JsonInput.ValueAcceptString.ProtobufOutput
-Required.JsonInput.WrapperTypesWithNullValue.ProtobufOutput
-Required.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
-Required.ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
-Required.ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
-Required.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
-Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput
-Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
-Required.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
-Required.TimestampProtoInputTooLarge.JsonOutput
-Required.TimestampProtoInputTooSmall.JsonOutput
diff --git a/conformance/failure_list_python.txt b/conformance/failure_list_python.txt
index e3ce7af..d2e5263 100644
--- a/conformance/failure_list_python.txt
+++ b/conformance/failure_list_python.txt
@@ -1,21 +1,85 @@
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
-Recommended.Proto3.JsonInput.DoubleFieldInfinityNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldNanNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldNegativeInfinityNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldInfinityNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldNanNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldNegativeInfinityNotQuoted
-Required.Proto3.JsonInput.DoubleFieldTooSmall
-Required.Proto3.JsonInput.FloatFieldTooLarge
-Required.Proto3.JsonInput.FloatFieldTooSmall
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
-Required.Proto3.JsonInput.TimestampJsonInputLowercaseT
-Required.Proto2.ProtobufInput.IllegalZeroFieldNum_Case_0
-Required.Proto2.ProtobufInput.IllegalZeroFieldNum_Case_1
-Required.Proto2.ProtobufInput.IllegalZeroFieldNum_Case_2
-Required.Proto2.ProtobufInput.IllegalZeroFieldNum_Case_3
-Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_0
-Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_1
-Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_2
-Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_3
+DurationProtoInputTooLarge.JsonOutput
+DurationProtoInputTooSmall.JsonOutput
+FieldMaskNumbersDontRoundTrip.JsonOutput
+FieldMaskPathsDontRoundTrip.JsonOutput
+FieldMaskTooManyUnderscore.JsonOutput
+JsonInput.Any.JsonOutput
+JsonInput.Any.ProtobufOutput
+JsonInput.AnyNested.JsonOutput
+JsonInput.AnyNested.ProtobufOutput
+JsonInput.AnyUnorderedTypeTag.JsonOutput
+JsonInput.AnyUnorderedTypeTag.ProtobufOutput
+JsonInput.AnyWithDuration.JsonOutput
+JsonInput.AnyWithDuration.ProtobufOutput
+JsonInput.AnyWithFieldMask.JsonOutput
+JsonInput.AnyWithFieldMask.ProtobufOutput
+JsonInput.AnyWithInt32ValueWrapper.JsonOutput
+JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
+JsonInput.AnyWithStruct.JsonOutput
+JsonInput.AnyWithStruct.ProtobufOutput
+JsonInput.AnyWithTimestamp.JsonOutput
+JsonInput.AnyWithTimestamp.ProtobufOutput
+JsonInput.AnyWithValueForInteger.JsonOutput
+JsonInput.AnyWithValueForInteger.ProtobufOutput
+JsonInput.AnyWithValueForJsonObject.JsonOutput
+JsonInput.AnyWithValueForJsonObject.ProtobufOutput
+JsonInput.BytesFieldInvalidBase64Characters
+JsonInput.DoubleFieldInfinityNotQuoted
+JsonInput.DoubleFieldNanNotQuoted
+JsonInput.DoubleFieldNegativeInfinityNotQuoted
+JsonInput.DoubleFieldTooSmall
+JsonInput.DurationJsonInputTooLarge
+JsonInput.DurationJsonInputTooSmall
+JsonInput.DurationMissingS
+JsonInput.EnumFieldNumericValueNonZero.JsonOutput
+JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
+JsonInput.EnumFieldNumericValueZero.JsonOutput
+JsonInput.EnumFieldNumericValueZero.ProtobufOutput
+JsonInput.EnumFieldUnknownValue.Validator
+JsonInput.FieldMask.ProtobufOutput
+JsonInput.FieldMaskInvalidCharacter
+JsonInput.FieldNameInLowerCamelCase.Validator
+JsonInput.FieldNameInSnakeCase.JsonOutput
+JsonInput.FieldNameInSnakeCase.ProtobufOutput
+JsonInput.FloatFieldInfinityNotQuoted
+JsonInput.FloatFieldNanNotQuoted
+JsonInput.FloatFieldNegativeInfinityNotQuoted
+JsonInput.FloatFieldTooLarge
+JsonInput.FloatFieldTooSmall
+JsonInput.Int32FieldExponentialFormat.JsonOutput
+JsonInput.Int32FieldExponentialFormat.ProtobufOutput
+JsonInput.Int32FieldFloatTrailingZero.JsonOutput
+JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
+JsonInput.Int32FieldMaxFloatValue.JsonOutput
+JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
+JsonInput.Int32FieldMinFloatValue.JsonOutput
+JsonInput.Int32FieldMinFloatValue.ProtobufOutput
+JsonInput.Int32FieldMinValue.JsonOutput
+JsonInput.OriginalProtoFieldName.JsonOutput
+JsonInput.OriginalProtoFieldName.ProtobufOutput
+JsonInput.RepeatedFieldMessageElementIsNull
+JsonInput.RepeatedFieldPrimitiveElementIsNull
+JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
+JsonInput.StringFieldSurrogatePair.JsonOutput
+JsonInput.StringFieldUnpairedLowSurrogate
+JsonInput.Struct.JsonOutput
+JsonInput.Struct.ProtobufOutput
+JsonInput.TimestampJsonInputLowercaseT
+JsonInput.Uint32FieldMaxFloatValue.JsonOutput
+JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
+JsonInput.ValueAcceptBool.JsonOutput
+JsonInput.ValueAcceptBool.ProtobufOutput
+JsonInput.ValueAcceptFloat.JsonOutput
+JsonInput.ValueAcceptFloat.ProtobufOutput
+JsonInput.ValueAcceptInteger.JsonOutput
+JsonInput.ValueAcceptInteger.ProtobufOutput
+JsonInput.ValueAcceptList.JsonOutput
+JsonInput.ValueAcceptList.ProtobufOutput
+JsonInput.ValueAcceptNull.JsonOutput
+JsonInput.ValueAcceptNull.ProtobufOutput
+JsonInput.ValueAcceptObject.JsonOutput
+JsonInput.ValueAcceptObject.ProtobufOutput
+JsonInput.ValueAcceptString.JsonOutput
+JsonInput.ValueAcceptString.ProtobufOutput
+TimestampProtoInputTooLarge.JsonOutput
+TimestampProtoInputTooSmall.JsonOutput
diff --git a/conformance/failure_list_python_cpp.txt b/conformance/failure_list_python_cpp.txt
index a498ad1..7b5e45f 100644
--- a/conformance/failure_list_python_cpp.txt
+++ b/conformance/failure_list_python_cpp.txt
@@ -7,48 +7,104 @@
 # TODO(haberman): insert links to corresponding bugs tracking the issue.
 # Should we use GitHub issues or the Google-internal bug tracker?
 
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
-Recommended.Proto3.JsonInput.DoubleFieldInfinityNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldNanNotQuoted
-Recommended.Proto3.JsonInput.DoubleFieldNegativeInfinityNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldInfinityNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldNanNotQuoted
-Recommended.Proto3.JsonInput.FloatFieldNegativeInfinityNotQuoted
-Required.Proto3.JsonInput.DoubleFieldTooSmall
-Required.Proto3.JsonInput.FloatFieldTooLarge
-Required.Proto3.JsonInput.FloatFieldTooSmall
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
-Required.Proto3.JsonInput.TimestampJsonInputLowercaseT
-Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
-Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.BOOL
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.DOUBLE
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.ENUM
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.FIXED32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.FIXED64
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.FLOAT
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.INT32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.INT64
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.SFIXED32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.SFIXED64
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.SINT32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.SINT64
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.UINT32
-Required.Proto3.ProtobufInput.PrematureEofInPackedField.UINT64
-Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
-Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.BOOL
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.DOUBLE
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.ENUM
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.FIXED32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.FIXED64
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.FLOAT
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.INT32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.INT64
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.SFIXED32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.SFIXED64
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT64
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT32
-Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT64
+DurationProtoInputTooLarge.JsonOutput
+DurationProtoInputTooSmall.JsonOutput
+FieldMaskNumbersDontRoundTrip.JsonOutput
+FieldMaskPathsDontRoundTrip.JsonOutput
+FieldMaskTooManyUnderscore.JsonOutput
+JsonInput.Any.JsonOutput
+JsonInput.Any.ProtobufOutput
+JsonInput.AnyNested.JsonOutput
+JsonInput.AnyNested.ProtobufOutput
+JsonInput.AnyUnorderedTypeTag.JsonOutput
+JsonInput.AnyUnorderedTypeTag.ProtobufOutput
+JsonInput.AnyWithDuration.JsonOutput
+JsonInput.AnyWithDuration.ProtobufOutput
+JsonInput.AnyWithFieldMask.JsonOutput
+JsonInput.AnyWithFieldMask.ProtobufOutput
+JsonInput.AnyWithInt32ValueWrapper.JsonOutput
+JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
+JsonInput.AnyWithStruct.JsonOutput
+JsonInput.AnyWithStruct.ProtobufOutput
+JsonInput.AnyWithTimestamp.JsonOutput
+JsonInput.AnyWithTimestamp.ProtobufOutput
+JsonInput.AnyWithValueForInteger.JsonOutput
+JsonInput.AnyWithValueForInteger.ProtobufOutput
+JsonInput.AnyWithValueForJsonObject.JsonOutput
+JsonInput.AnyWithValueForJsonObject.ProtobufOutput
+JsonInput.BytesFieldInvalidBase64Characters
+JsonInput.DoubleFieldInfinityNotQuoted
+JsonInput.DoubleFieldNanNotQuoted
+JsonInput.DoubleFieldNegativeInfinityNotQuoted
+JsonInput.DoubleFieldTooSmall
+JsonInput.DurationJsonInputTooLarge
+JsonInput.DurationJsonInputTooSmall
+JsonInput.DurationMissingS
+JsonInput.EnumFieldNumericValueNonZero.JsonOutput
+JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
+JsonInput.EnumFieldNumericValueZero.JsonOutput
+JsonInput.EnumFieldNumericValueZero.ProtobufOutput
+JsonInput.EnumFieldUnknownValue.Validator
+JsonInput.FieldMask.ProtobufOutput
+JsonInput.FieldMaskInvalidCharacter
+JsonInput.FieldNameInLowerCamelCase.Validator
+JsonInput.FieldNameInSnakeCase.JsonOutput
+JsonInput.FieldNameInSnakeCase.ProtobufOutput
+JsonInput.FloatFieldInfinityNotQuoted
+JsonInput.FloatFieldNanNotQuoted
+JsonInput.FloatFieldNegativeInfinityNotQuoted
+JsonInput.FloatFieldTooLarge
+JsonInput.FloatFieldTooSmall
+JsonInput.Int32FieldExponentialFormat.JsonOutput
+JsonInput.Int32FieldExponentialFormat.ProtobufOutput
+JsonInput.Int32FieldFloatTrailingZero.JsonOutput
+JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
+JsonInput.Int32FieldMaxFloatValue.JsonOutput
+JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
+JsonInput.Int32FieldMinFloatValue.JsonOutput
+JsonInput.Int32FieldMinFloatValue.ProtobufOutput
+JsonInput.Int32FieldMinValue.JsonOutput
+JsonInput.OriginalProtoFieldName.JsonOutput
+JsonInput.OriginalProtoFieldName.ProtobufOutput
+JsonInput.RepeatedFieldMessageElementIsNull
+JsonInput.RepeatedFieldPrimitiveElementIsNull
+JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
+JsonInput.StringFieldSurrogatePair.JsonOutput
+JsonInput.StringFieldUnpairedLowSurrogate
+JsonInput.Struct.JsonOutput
+JsonInput.Struct.ProtobufOutput
+JsonInput.TimestampJsonInputLowercaseT
+JsonInput.Uint32FieldMaxFloatValue.JsonOutput
+JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
+JsonInput.ValueAcceptBool.JsonOutput
+JsonInput.ValueAcceptBool.ProtobufOutput
+JsonInput.ValueAcceptFloat.JsonOutput
+JsonInput.ValueAcceptFloat.ProtobufOutput
+JsonInput.ValueAcceptInteger.JsonOutput
+JsonInput.ValueAcceptInteger.ProtobufOutput
+JsonInput.ValueAcceptList.JsonOutput
+JsonInput.ValueAcceptList.ProtobufOutput
+JsonInput.ValueAcceptNull.JsonOutput
+JsonInput.ValueAcceptNull.ProtobufOutput
+JsonInput.ValueAcceptObject.JsonOutput
+JsonInput.ValueAcceptObject.ProtobufOutput
+JsonInput.ValueAcceptString.JsonOutput
+JsonInput.ValueAcceptString.ProtobufOutput
+ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
+ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
+ProtobufInput.PrematureEofInPackedField.BOOL
+ProtobufInput.PrematureEofInPackedField.DOUBLE
+ProtobufInput.PrematureEofInPackedField.ENUM
+ProtobufInput.PrematureEofInPackedField.FIXED32
+ProtobufInput.PrematureEofInPackedField.FIXED64
+ProtobufInput.PrematureEofInPackedField.FLOAT
+ProtobufInput.PrematureEofInPackedField.INT32
+ProtobufInput.PrematureEofInPackedField.INT64
+ProtobufInput.PrematureEofInPackedField.SFIXED32
+ProtobufInput.PrematureEofInPackedField.SFIXED64
+ProtobufInput.PrematureEofInPackedField.SINT32
+ProtobufInput.PrematureEofInPackedField.SINT64
+ProtobufInput.PrematureEofInPackedField.UINT32
+ProtobufInput.PrematureEofInPackedField.UINT64
+TimestampProtoInputTooLarge.JsonOutput
+TimestampProtoInputTooSmall.JsonOutput
diff --git a/conformance/failure_list_ruby.txt b/conformance/failure_list_ruby.txt
index 1bab135..7c12da0 100644
--- a/conformance/failure_list_ruby.txt
+++ b/conformance/failure_list_ruby.txt
@@ -1,135 +1,199 @@
-Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
-Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
-Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
-Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHas9FractionalDigits.Validator
-Recommended.Proto3.JsonInput.DurationHasZeroFractionalDigit.Validator
-Recommended.Proto3.JsonInput.Int64FieldBeString.Validator
-Recommended.Proto3.JsonInput.MapFieldValueIsNull
-Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
-Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull
-Recommended.Proto3.JsonInput.StringEndsWithEscapeChar
-Recommended.Proto3.JsonInput.StringFieldSurrogateInWrongOrder
-Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
-Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
-Recommended.Proto3.JsonInput.TimestampHas3FractionalDigits.Validator
-Recommended.Proto3.JsonInput.TimestampHas6FractionalDigits.Validator
-Recommended.Proto3.JsonInput.TimestampHas9FractionalDigits.Validator
-Recommended.Proto3.JsonInput.TimestampHasZeroFractionalDigit.Validator
-Recommended.Proto3.JsonInput.TimestampZeroNormalized.Validator
-Recommended.Proto3.JsonInput.Uint64FieldBeString.Validator
-Required.DurationProtoInputTooLarge.JsonOutput
-Required.DurationProtoInputTooSmall.JsonOutput
-Required.Proto3.JsonInput.Any.JsonOutput
-Required.Proto3.JsonInput.Any.ProtobufOutput
-Required.Proto3.JsonInput.AnyNested.JsonOutput
-Required.Proto3.JsonInput.AnyNested.ProtobufOutput
-Required.Proto3.JsonInput.AnyUnorderedTypeTag.JsonOutput
-Required.Proto3.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithDuration.JsonOutput
-Required.Proto3.JsonInput.AnyWithDuration.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithFieldMask.JsonOutput
-Required.Proto3.JsonInput.AnyWithFieldMask.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithInt32ValueWrapper.JsonOutput
-Required.Proto3.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithStruct.JsonOutput
-Required.Proto3.JsonInput.AnyWithStruct.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithTimestamp.JsonOutput
-Required.Proto3.JsonInput.AnyWithTimestamp.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithValueForInteger.JsonOutput
-Required.Proto3.JsonInput.AnyWithValueForInteger.ProtobufOutput
-Required.Proto3.JsonInput.AnyWithValueForJsonObject.JsonOutput
-Required.Proto3.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldNan.JsonOutput
-Required.Proto3.JsonInput.DurationMaxValue.JsonOutput
-Required.Proto3.JsonInput.DurationMaxValue.ProtobufOutput
-Required.Proto3.JsonInput.DurationMinValue.JsonOutput
-Required.Proto3.JsonInput.DurationMinValue.ProtobufOutput
-Required.Proto3.JsonInput.DurationRepeatedValue.JsonOutput
-Required.Proto3.JsonInput.DurationRepeatedValue.ProtobufOutput
-Required.Proto3.JsonInput.FieldMask.JsonOutput
-Required.Proto3.JsonInput.FieldMask.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldInfinity.JsonOutput
-Required.Proto3.JsonInput.FloatFieldNan.JsonOutput
-Required.Proto3.JsonInput.FloatFieldNegativeInfinity.JsonOutput
-Required.Proto3.JsonInput.OneofFieldDuplicate
-Required.Proto3.JsonInput.OptionalBoolWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalBoolWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalBytesWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalBytesWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalDoubleWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalDoubleWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalFloatWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalFloatWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalInt32Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalInt32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalInt64Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalInt64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalStringWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalStringWrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalUint32Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalUint32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalUint64Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalUint64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
-Required.Proto3.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedBoolWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedBoolWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedBytesWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedBytesWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedDoubleWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedFloatWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedFloatWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedInt32Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedInt64Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedStringWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedStringWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedUint32Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedUint64Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
-Required.Proto3.JsonInput.StringFieldSurrogatePair.JsonOutput
-Required.Proto3.JsonInput.StringFieldSurrogatePair.ProtobufOutput
-Required.Proto3.JsonInput.Struct.JsonOutput
-Required.Proto3.JsonInput.Struct.ProtobufOutput
-Required.Proto3.JsonInput.TimestampMaxValue.JsonOutput
-Required.Proto3.JsonInput.TimestampMaxValue.ProtobufOutput
-Required.Proto3.JsonInput.TimestampMinValue.JsonOutput
-Required.Proto3.JsonInput.TimestampMinValue.ProtobufOutput
-Required.Proto3.JsonInput.TimestampRepeatedValue.JsonOutput
-Required.Proto3.JsonInput.TimestampRepeatedValue.ProtobufOutput
-Required.Proto3.JsonInput.TimestampWithNegativeOffset.JsonOutput
-Required.Proto3.JsonInput.TimestampWithNegativeOffset.ProtobufOutput
-Required.Proto3.JsonInput.TimestampWithPositiveOffset.JsonOutput
-Required.Proto3.JsonInput.TimestampWithPositiveOffset.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptBool.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptBool.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptFloat.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptFloat.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptInteger.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptInteger.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptList.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptList.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptNull.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptNull.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptObject.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptObject.ProtobufOutput
-Required.Proto3.JsonInput.ValueAcceptString.JsonOutput
-Required.Proto3.JsonInput.ValueAcceptString.ProtobufOutput
-Required.Proto3.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
-Required.Proto3.ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
-Required.Proto3.ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
-Required.Proto3.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.JsonOutput
-Required.TimestampProtoInputTooLarge.JsonOutput
-Required.TimestampProtoInputTooSmall.JsonOutput
+DurationProtoInputTooLarge.JsonOutput
+DurationProtoInputTooSmall.JsonOutput
+FieldMaskNumbersDontRoundTrip.JsonOutput
+FieldMaskPathsDontRoundTrip.JsonOutput
+FieldMaskTooManyUnderscore.JsonOutput
+JsonInput.Any.JsonOutput
+JsonInput.Any.ProtobufOutput
+JsonInput.AnyNested.JsonOutput
+JsonInput.AnyNested.ProtobufOutput
+JsonInput.AnyUnorderedTypeTag.JsonOutput
+JsonInput.AnyUnorderedTypeTag.ProtobufOutput
+JsonInput.AnyWithDuration.JsonOutput
+JsonInput.AnyWithDuration.ProtobufOutput
+JsonInput.AnyWithFieldMask.JsonOutput
+JsonInput.AnyWithFieldMask.ProtobufOutput
+JsonInput.AnyWithInt32ValueWrapper.JsonOutput
+JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
+JsonInput.AnyWithStruct.JsonOutput
+JsonInput.AnyWithStruct.ProtobufOutput
+JsonInput.AnyWithTimestamp.JsonOutput
+JsonInput.AnyWithTimestamp.ProtobufOutput
+JsonInput.AnyWithValueForInteger.JsonOutput
+JsonInput.AnyWithValueForInteger.ProtobufOutput
+JsonInput.AnyWithValueForJsonObject.JsonOutput
+JsonInput.AnyWithValueForJsonObject.ProtobufOutput
+JsonInput.BoolFieldIntegerOne
+JsonInput.BoolFieldIntegerZero
+JsonInput.DoubleFieldInfinity.JsonOutput
+JsonInput.DoubleFieldInfinity.ProtobufOutput
+JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
+JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
+JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
+JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
+JsonInput.DoubleFieldMinNegativeValue.JsonOutput
+JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
+JsonInput.DoubleFieldMinPositiveValue.JsonOutput
+JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
+JsonInput.DoubleFieldNan.JsonOutput
+JsonInput.DoubleFieldNan.ProtobufOutput
+JsonInput.DoubleFieldNegativeInfinity.JsonOutput
+JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
+JsonInput.DoubleFieldQuotedValue.JsonOutput
+JsonInput.DoubleFieldQuotedValue.ProtobufOutput
+JsonInput.DurationHas3FractionalDigits.Validator
+JsonInput.DurationHas6FractionalDigits.Validator
+JsonInput.DurationHas9FractionalDigits.Validator
+JsonInput.DurationHasZeroFractionalDigit.Validator
+JsonInput.DurationMaxValue.JsonOutput
+JsonInput.DurationMaxValue.ProtobufOutput
+JsonInput.DurationMinValue.JsonOutput
+JsonInput.DurationMinValue.ProtobufOutput
+JsonInput.DurationRepeatedValue.JsonOutput
+JsonInput.DurationRepeatedValue.ProtobufOutput
+JsonInput.EnumFieldNumericValueNonZero.JsonOutput
+JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
+JsonInput.EnumFieldNumericValueZero.JsonOutput
+JsonInput.EnumFieldNumericValueZero.ProtobufOutput
+JsonInput.EnumFieldUnknownValue.Validator
+JsonInput.FieldMask.JsonOutput
+JsonInput.FieldMask.ProtobufOutput
+JsonInput.FieldNameInSnakeCase.JsonOutput
+JsonInput.FieldNameWithMixedCases.JsonOutput
+JsonInput.FieldNameWithMixedCases.ProtobufOutput
+JsonInput.FieldNameWithMixedCases.Validator
+JsonInput.FloatFieldInfinity.JsonOutput
+JsonInput.FloatFieldInfinity.ProtobufOutput
+JsonInput.FloatFieldNan.JsonOutput
+JsonInput.FloatFieldNan.ProtobufOutput
+JsonInput.FloatFieldNegativeInfinity.JsonOutput
+JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
+JsonInput.FloatFieldQuotedValue.JsonOutput
+JsonInput.FloatFieldQuotedValue.ProtobufOutput
+JsonInput.FloatFieldTooLarge
+JsonInput.FloatFieldTooSmall
+JsonInput.Int32FieldExponentialFormat.JsonOutput
+JsonInput.Int32FieldExponentialFormat.ProtobufOutput
+JsonInput.Int32FieldFloatTrailingZero.JsonOutput
+JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
+JsonInput.Int32FieldMaxFloatValue.JsonOutput
+JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
+JsonInput.Int32FieldMinFloatValue.JsonOutput
+JsonInput.Int32FieldMinFloatValue.ProtobufOutput
+JsonInput.Int32FieldStringValue.JsonOutput
+JsonInput.Int32FieldStringValue.ProtobufOutput
+JsonInput.Int32FieldStringValueEscaped.JsonOutput
+JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
+JsonInput.Int32MapEscapedKey.JsonOutput
+JsonInput.Int32MapEscapedKey.ProtobufOutput
+JsonInput.Int32MapField.JsonOutput
+JsonInput.Int32MapField.ProtobufOutput
+JsonInput.Int64FieldBeString.Validator
+JsonInput.Int64FieldMaxValue.JsonOutput
+JsonInput.Int64FieldMaxValue.ProtobufOutput
+JsonInput.Int64FieldMinValue.JsonOutput
+JsonInput.Int64FieldMinValue.ProtobufOutput
+JsonInput.Int64MapEscapedKey.JsonOutput
+JsonInput.Int64MapEscapedKey.ProtobufOutput
+JsonInput.Int64MapField.JsonOutput
+JsonInput.Int64MapField.ProtobufOutput
+JsonInput.MessageField.JsonOutput
+JsonInput.MessageField.ProtobufOutput
+JsonInput.MessageMapField.JsonOutput
+JsonInput.MessageMapField.ProtobufOutput
+JsonInput.MessageRepeatedField.JsonOutput
+JsonInput.MessageRepeatedField.ProtobufOutput
+JsonInput.OptionalBoolWrapper.JsonOutput
+JsonInput.OptionalBoolWrapper.ProtobufOutput
+JsonInput.OptionalBytesWrapper.JsonOutput
+JsonInput.OptionalBytesWrapper.ProtobufOutput
+JsonInput.OptionalDoubleWrapper.JsonOutput
+JsonInput.OptionalDoubleWrapper.ProtobufOutput
+JsonInput.OptionalFloatWrapper.JsonOutput
+JsonInput.OptionalFloatWrapper.ProtobufOutput
+JsonInput.OptionalInt32Wrapper.JsonOutput
+JsonInput.OptionalInt32Wrapper.ProtobufOutput
+JsonInput.OptionalInt64Wrapper.JsonOutput
+JsonInput.OptionalInt64Wrapper.ProtobufOutput
+JsonInput.OptionalStringWrapper.JsonOutput
+JsonInput.OptionalStringWrapper.ProtobufOutput
+JsonInput.OptionalUint32Wrapper.JsonOutput
+JsonInput.OptionalUint32Wrapper.ProtobufOutput
+JsonInput.OptionalUint64Wrapper.JsonOutput
+JsonInput.OptionalUint64Wrapper.ProtobufOutput
+JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
+JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
+JsonInput.OriginalProtoFieldName.JsonOutput
+JsonInput.PrimitiveRepeatedField.JsonOutput
+JsonInput.PrimitiveRepeatedField.ProtobufOutput
+JsonInput.RepeatedBoolWrapper.JsonOutput
+JsonInput.RepeatedBoolWrapper.ProtobufOutput
+JsonInput.RepeatedBytesWrapper.JsonOutput
+JsonInput.RepeatedBytesWrapper.ProtobufOutput
+JsonInput.RepeatedDoubleWrapper.JsonOutput
+JsonInput.RepeatedDoubleWrapper.ProtobufOutput
+JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
+JsonInput.RepeatedFloatWrapper.JsonOutput
+JsonInput.RepeatedFloatWrapper.ProtobufOutput
+JsonInput.RepeatedInt32Wrapper.JsonOutput
+JsonInput.RepeatedInt32Wrapper.ProtobufOutput
+JsonInput.RepeatedInt64Wrapper.JsonOutput
+JsonInput.RepeatedInt64Wrapper.ProtobufOutput
+JsonInput.RepeatedStringWrapper.JsonOutput
+JsonInput.RepeatedStringWrapper.ProtobufOutput
+JsonInput.RepeatedUint32Wrapper.JsonOutput
+JsonInput.RepeatedUint32Wrapper.ProtobufOutput
+JsonInput.RepeatedUint64Wrapper.JsonOutput
+JsonInput.RepeatedUint64Wrapper.ProtobufOutput
+JsonInput.StringFieldNotAString
+JsonInput.StringFieldSurrogateInWrongOrder
+JsonInput.StringFieldSurrogatePair.JsonOutput
+JsonInput.StringFieldSurrogatePair.ProtobufOutput
+JsonInput.StringFieldUnpairedHighSurrogate
+JsonInput.StringFieldUnpairedLowSurrogate
+JsonInput.Struct.JsonOutput
+JsonInput.Struct.ProtobufOutput
+JsonInput.TimestampHas3FractionalDigits.Validator
+JsonInput.TimestampHas6FractionalDigits.Validator
+JsonInput.TimestampHas9FractionalDigits.Validator
+JsonInput.TimestampHasZeroFractionalDigit.Validator
+JsonInput.TimestampMaxValue.JsonOutput
+JsonInput.TimestampMaxValue.ProtobufOutput
+JsonInput.TimestampMinValue.JsonOutput
+JsonInput.TimestampMinValue.ProtobufOutput
+JsonInput.TimestampRepeatedValue.JsonOutput
+JsonInput.TimestampRepeatedValue.ProtobufOutput
+JsonInput.TimestampWithNegativeOffset.JsonOutput
+JsonInput.TimestampWithNegativeOffset.ProtobufOutput
+JsonInput.TimestampWithPositiveOffset.JsonOutput
+JsonInput.TimestampWithPositiveOffset.ProtobufOutput
+JsonInput.TimestampZeroNormalized.Validator
+JsonInput.Uint32FieldMaxFloatValue.JsonOutput
+JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
+JsonInput.Uint32MapField.JsonOutput
+JsonInput.Uint32MapField.ProtobufOutput
+JsonInput.Uint64FieldBeString.Validator
+JsonInput.Uint64FieldMaxValue.JsonOutput
+JsonInput.Uint64FieldMaxValue.ProtobufOutput
+JsonInput.Uint64MapField.JsonOutput
+JsonInput.Uint64MapField.ProtobufOutput
+JsonInput.ValueAcceptBool.JsonOutput
+JsonInput.ValueAcceptBool.ProtobufOutput
+JsonInput.ValueAcceptFloat.JsonOutput
+JsonInput.ValueAcceptFloat.ProtobufOutput
+JsonInput.ValueAcceptInteger.JsonOutput
+JsonInput.ValueAcceptInteger.ProtobufOutput
+JsonInput.ValueAcceptList.JsonOutput
+JsonInput.ValueAcceptList.ProtobufOutput
+JsonInput.ValueAcceptNull.JsonOutput
+JsonInput.ValueAcceptNull.ProtobufOutput
+JsonInput.ValueAcceptObject.JsonOutput
+JsonInput.ValueAcceptObject.ProtobufOutput
+JsonInput.ValueAcceptString.JsonOutput
+JsonInput.ValueAcceptString.ProtobufOutput
+ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
+ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
+ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
+ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
+TimestampProtoInputTooLarge.JsonOutput
+TimestampProtoInputTooSmall.JsonOutput
diff --git a/conformance/update_failure_list.py b/conformance/update_failure_list.py
deleted file mode 100755
index ad42ed3..0000000
--- a/conformance/update_failure_list.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/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.
-
-"""Script to update a failure list file to add/remove failures.
-
-This is sort of like comm(1), except it recognizes comments and ignores them.
-"""
-
-import argparse
-
-parser = argparse.ArgumentParser(
-    description='Adds/removes failures from the failure list.')
-parser.add_argument('filename', type=str, help='failure list file to update')
-parser.add_argument('--add', dest='add_list', action='append')
-parser.add_argument('--remove', dest='remove_list', action='append')
-
-args = parser.parse_args()
-
-add_set = set()
-remove_set = set()
-
-for add_file in (args.add_list or []):
-  with open(add_file) as f:
-    for line in f:
-      add_set.add(line)
-
-for remove_file in (args.remove_list or []):
-  with open(remove_file) as f:
-    for line in f:
-      if line in add_set:
-        raise Exception("Asked to both add and remove test: " + line)
-      remove_set.add(line.strip())
-
-add_list = sorted(add_set, reverse=True)
-
-with open(args.filename) as in_file:
-    existing_list = in_file.read()
-
-with open(args.filename, "w") as f:
-  for line in existing_list.splitlines(True):
-    test = line.split("#")[0].strip()
-    while len(add_list) > 0 and test > add_list[-1]:
-      f.write(add_list.pop())
-    if test not in remove_set:
-      f.write(line)
diff --git a/csharp/.gitignore b/csharp/.gitignore
index 8ba8849..c88f741 100644
--- a/csharp/.gitignore
+++ b/csharp/.gitignore
@@ -1,10 +1,16 @@
-# Output
-bin
-obj
-project.lock.json
-TestResult.xml
-
-# Possibly legacy now?
+#
+# 	Untracked directories
+#
+src/AddressBook/bin
+src/AddressBook/obj
+src/Google.Protobuf/bin/
+src/Google.Protobuf/obj/
+src/Google.Protobuf.Conformance/bin/
+src/Google.Protobuf.Conformance/obj/
+src/Google.Protobuf.Test/bin/
+src/Google.Protobuf.Test/obj/
+src/Google.Protobuf.JsonDump/bin/
+src/Google.Protobuf.JsonDump/obj/
 mono/bin
 mono/tmp
 mono/protoc
@@ -17,7 +23,6 @@
 #
 # 	Untracked files
 #
-.vs
 *.user
 *.suo
 *.nupkg
diff --git a/csharp/Google.Protobuf.Tools.nuspec b/csharp/Google.Protobuf.Tools.nuspec
index 4294949..e4240da 100644
--- a/csharp/Google.Protobuf.Tools.nuspec
+++ b/csharp/Google.Protobuf.Tools.nuspec
@@ -5,7 +5,7 @@
     <title>Google Protocol Buffers tools</title>
     <summary>Tools for Protocol Buffers - Google's data interchange format.</summary>
     <description>See project site for more info.</description>
-    <version>3.5.2</version>
+    <version>3.0.0-beta3</version>
     <authors>Google Inc.</authors>
     <owners>protobuf-packages</owners>
     <licenseUrl>https://github.com/google/protobuf/blob/master/LICENSE</licenseUrl>
diff --git a/csharp/README.md b/csharp/README.md
index c1d1241..8c3993e 100644
--- a/csharp/README.md
+++ b/csharp/README.md
@@ -1,13 +1,16 @@
 This directory contains the C# Protocol Buffers runtime library.
 
+Status: Beta - ready for external testing
+=========================================
+
 Usage
 =====
 
 The easiest way how to use C# protobufs is via the `Google.Protobuf`
 NuGet package. Just add the NuGet package to your VS project.
 
-You will also want to install the `Google.Protobuf.Tools` NuGet package, which
-contains precompiled version of `protoc.exe` and a copy of well known `.proto`
+Besides C# runtime library, the NuGet package also contains 
+precompiled version of `protoc.exe` and a copy of well known `.proto`
 files under the package's `tools` directory.
 
 To generate C# files from your `.proto` files, invoke `protoc` with the 
@@ -31,41 +34,16 @@
 Building
 ========
 
-Open the `src/Google.Protobuf.sln` solution in Visual Studio 2017 or
-later.
+Open the `src/Google.Protobuf.sln` solution in Visual Studio 2015 or
+later. You should be able to run the NUnit test from Test Explorer
+(you might need to install NUnit Visual Studio add-in).
 
 Although *users* of this project are only expected to have Visual
 Studio 2012 or later, *developers* of the library are required to
-have Visual Studio 2017 or later, as the library uses C# 6 features
-in its implementation, as well as the new Visual Studio 2017 csproj 
-format. These features have no impact when using the compiled code - 
-they're only relevant when building the `Google.Protobuf` assembly.
-
-Testing
-=======
-
-The unit tests use [NUnit 3](https://github.com/nunit/nunit). NUnit doesn't yet
-support `dotnet test`, so for now the test project is a console application 
-using NUnitLite. Simply run `Google.Protobuf.Test.exe` to run the unit tests 
-directly, or else use `dotnet run`.
-
-.NET 3.5
-========
-
-We don't officially support .NET 3.5. However, there has been some effort 
-to make enabling .NET 3.5 support relatively painless in case you require it. 
-There's no guarantee that this will continue in the future, so rely on .NET 
-3.5 support at your peril.
-
-To enable .NET 3.5 support, you must edit the `TargetFrameworks` elements of 
-[src/Google.Protobuf/Google.Protobuf.csproj](src/Google.Protobuf/Google.Protobuf.csproj) 
-(and [src/Google.Protobuf.Test/Google.Protobuf.Test.csproj](src/Google.Protobuf.Test/Google.Protobuf.Test.csproj) 
-if you want to run the unit tests): 
-
-Open the .csproj file in a text editor and simply add `net35` to the list of 
-target frameworks, noting that the `TargetFrameworks` element appears twice in 
-the file (once in the first `PropertyGroup` element, and again in the second 
-`PropertyGroup` element, i.e., the one with the conditional).
+have Visual Studio 2015 or later, as the library uses C# 6 features
+in its implementation. These features have no impact when using the
+compiled code - they're only relevant when building the
+`Google.Protobuf` assembly.
 
 History of C# protobufs
 =======================
diff --git a/csharp/build_packages.bat b/csharp/build_packages.bat
index d720565..1502f06 100644
--- a/csharp/build_packages.bat
+++ b/csharp/build_packages.bat
@@ -1,7 +1,10 @@
 @rem Builds Google.Protobuf NuGet packages
 
-dotnet restore src/Google.Protobuf.sln
-dotnet pack -c Release src/Google.Protobuf.sln || goto :error
+@rem Adjust the location of nuget.exe
+set NUGET=C:\nuget\nuget.exe
+
+@rem Build src/Google.Protobuf.sln solution in Release configuration first.
+%NUGET% pack src\Google.Protobuf\Google.Protobuf.nuspec -Symbols || goto :error
 
 goto :EOF
 
diff --git a/csharp/build_tools.sh b/csharp/build_tools.sh
deleted file mode 100755
index 182c5c5..0000000
--- a/csharp/build_tools.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/bash
-
-if [ $# -ne 1 ]; then
-  cat <<EOF
-Usage: $0 <VERSION_NUMBER>
-
-Example:
-  $ $0 3.0.0
-
-This script will download pre-built protoc binaries from maven repository and
-create the Google.Protobuf.Tools package. Well-known type .proto files will also
-be included.
-EOF
-  exit 1
-fi
-
-VERSION_NUMBER=$1
-# <directory name> <binary file name> pairs.
-declare -a FILE_NAMES=(          \
-  windows_x86 windows-x86_32.exe \
-  windows_x64 windows-x86_64.exe \
-  macosx_x86  osx-x86_32.exe     \
-  macosx_x64  osx-x86_64.exe     \
-  linux_x86   linux-x86_32.exe   \
-  linux_x64   linux-x86_64.exe   \
-)
-
-set -e
-
-mkdir -p protoc
-# Create a zip file for each binary.
-for((i=0;i<${#FILE_NAMES[@]};i+=2));do
-  DIR_NAME=${FILE_NAMES[$i]}
-  mkdir -p protoc/$DIR_NAME
-
-  if [ ${DIR_NAME:0:3} = "win" ]; then
-    TARGET_BINARY="protoc.exe"
-  else
-    TARGET_BINARY="protoc"
-  fi
-
-  BINARY_NAME=${FILE_NAMES[$(($i+1))]}
-  BINARY_URL=http://repo1.maven.org/maven2/com/google/protobuf/protoc/${VERSION_NUMBER}/protoc-${VERSION_NUMBER}-${BINARY_NAME}
-
-  if ! wget ${BINARY_URL} -O protoc/$DIR_NAME/$TARGET_BINARY &> /dev/null; then
-    echo "[ERROR] Failed to download ${BINARY_URL}" >&2
-    echo "[ERROR] Skipped $protoc-${VERSION_NAME}-${DIR_NAME}" >&2
-    continue
-  fi
-done
-
-nuget pack Google.Protobuf.Tools.nuspec
diff --git a/csharp/buildall.sh b/csharp/buildall.sh
index dd4b463..45af705 100755
--- a/csharp/buildall.sh
+++ b/csharp/buildall.sh
@@ -1,17 +1,17 @@
 #!/bin/bash
+# Use mono to build solution and run all tests.
 
+# Adjust these to reflect the location of nunit-console in your system.
+NUNIT_CONSOLE=nunit-console
+
+# The rest you can leave intact
 CONFIG=Release
 SRC=$(dirname $0)/src
 
 set -ex
 
-echo Building relevant projects.
-dotnet restore $SRC/Google.Protobuf.sln
-dotnet build -c $CONFIG $SRC/Google.Protobuf.sln
+echo Building the solution.
+xbuild /p:Configuration=$CONFIG $SRC/Google.Protobuf.sln
 
 echo Running tests.
-# Only test netcoreapp1.0, which uses the .NET Core runtime.
-# If we want to test the .NET 4.5 version separately, we could
-# run Mono explicitly. However, we don't have any differences between
-# the .NET 4.5 and netstandard1.0 assemblies.
-dotnet run -c $CONFIG -f netcoreapp1.0 -p $SRC/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+$NUNIT_CONSOLE $SRC/Google.Protobuf.Test/bin/$CONFIG/Google.Protobuf.Test.dll
diff --git a/csharp/compatibility_tests/v3.0.0/protos/csharp/protos/unittest_issues.proto b/csharp/compatibility_tests/v3.0.0/protos/csharp/protos/unittest_issues.proto
deleted file mode 100644
index 6c9f763..0000000
--- a/csharp/compatibility_tests/v3.0.0/protos/csharp/protos/unittest_issues.proto
+++ /dev/null
@@ -1,126 +0,0 @@
-syntax = "proto3";
-
-// These proto descriptors have at one time been reported as an issue or defect.
-// They are kept here to replicate the issue, and continue to verify the fix.
-
-// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified
-option csharp_namespace = "UnitTest.Issues.TestProtos";
-
-package unittest_issues;
-option optimize_for = SPEED;
-
-// Issue 307: when generating doubly-nested types, any references
-// should be of the form A.Types.B.Types.C.
-message Issue307 {
-  message NestedOnce {
-    message NestedTwice {
-    }
-  }
-}
-
-// Old issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13
-// New issue 309: https://github.com/google/protobuf/issues/309
- 
-// message A {
-//    optional int32 _A = 1;
-// }
-
-// message B {
-//    optional int32 B_ = 1;
-// }
-
-//message AB {
-//    optional int32 a_b = 1;
-//}
-
-// Similar issue with numeric names
-// Java code failed too, so probably best for this to be a restriction.
-// See https://github.com/google/protobuf/issues/308
-// message NumberField {
-//    optional int32 _01 = 1;
-// }
-
-// issue 19 - negative enum values
-
-enum NegativeEnum {
-    NEGATIVE_ENUM_ZERO = 0;
-    FiveBelow = -5;
-    MinusOne = -1;
-}
-
-message NegativeEnumMessage {
-    NegativeEnum value = 1;
-    repeated NegativeEnum values = 2 [packed = false];
-    repeated NegativeEnum packed_values = 3 [packed=true];
-}
-
-// Issue 21: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=21
-// Decorate fields with [deprecated=true] as [System.Obsolete]
-
-message DeprecatedChild {
-}
-
-enum DeprecatedEnum {
-    DEPRECATED_ZERO = 0;
-    one = 1;
-}
-
-message DeprecatedFieldsMessage {
-    int32 PrimitiveValue = 1 [deprecated = true];
-    repeated int32 PrimitiveArray = 2 [deprecated = true];
-
-    DeprecatedChild MessageValue = 3 [deprecated = true];
-    repeated DeprecatedChild MessageArray = 4 [deprecated = true];
-
-    DeprecatedEnum EnumValue = 5 [deprecated = true];
-    repeated DeprecatedEnum EnumArray = 6 [deprecated = true];
-}
-
-// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
-message ItemField {
-  int32 item = 1;
-}
-
-message ReservedNames {
-  // Force a nested type called Types
-  message SomeNestedType {
-  }
-
-  int32 types = 1;
-  int32 descriptor = 2;
-}
-
-message TestJsonFieldOrdering {
-  // These fields are deliberately not declared in numeric
-  // order, and the oneof fields aren't contiguous either.
-  // This allows for reasonably robust tests of JSON output
-  // ordering.
-  // TestFieldOrderings in unittest_proto3.proto is similar,
-  // but doesn't include oneofs.
-  // TODO: Consider adding oneofs to TestFieldOrderings, although
-  // that will require fixing other tests in multiple platforms.
-  // Alternatively, consider just adding this to
-  // unittest_proto3.proto if multiple platforms want it.
-  
-  int32 plain_int32 = 4;
-
-  oneof o1 {
-    string o1_string = 2;
-    int32 o1_int32 = 5;
-  }
-  
-  string plain_string = 1;
-  
-  oneof o2 {
-    int32 o2_int32 = 6;
-    string o2_string = 3;
-  }
-  
-}
-
-message TestJsonName {
-  // Message for testing the effects for of the json_name option
-  string name = 1;
-  string description = 2 [json_name = "desc"];
-  string guid = 3 [json_name = "exid"];
-}
diff --git a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/map_unittest_proto3.proto b/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/map_unittest_proto3.proto
deleted file mode 100644
index 16be277..0000000
--- a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/map_unittest_proto3.proto
+++ /dev/null
@@ -1,120 +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.
-
-// This file is mostly equivalent to map_unittest.proto, but imports
-// unittest_proto3.proto instead of unittest.proto, so that it only
-// uses proto3 messages. This makes it suitable for testing
-// implementations which only support proto3.
-// The TestRequiredMessageMap message has been removed as there are no
-// required fields in proto3.
-syntax = "proto3";
-
-option cc_enable_arenas = true;
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-import "google/protobuf/unittest_proto3.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In map_test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest;
-
-// Tests maps.
-message TestMap {
-  map<int32   , int32   > map_int32_int32       = 1;
-  map<int64   , int64   > map_int64_int64       = 2;
-  map<uint32  , uint32  > map_uint32_uint32     = 3;
-  map<uint64  , uint64  > map_uint64_uint64     = 4;
-  map<sint32  , sint32  > map_sint32_sint32     = 5;
-  map<sint64  , sint64  > map_sint64_sint64     = 6;
-  map<fixed32 , fixed32 > map_fixed32_fixed32   = 7;
-  map<fixed64 , fixed64 > map_fixed64_fixed64   = 8;
-  map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
-  map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
-  map<int32   , float   > map_int32_float       = 11;
-  map<int32   , double  > map_int32_double      = 12;
-  map<bool    , bool    > map_bool_bool         = 13;
-  map<string  , string  > map_string_string     = 14;
-  map<int32   , bytes   > map_int32_bytes       = 15;
-  map<int32   , MapEnum > map_int32_enum        = 16;
-  map<int32   , ForeignMessage> map_int32_foreign_message = 17;
-}
-
-message TestMapSubmessage {
-  TestMap test_map = 1;
-}
-
-message TestMessageMap {
-  map<int32, TestAllTypes> map_int32_message = 1;
-}
-
-// Two map fields share the same entry default instance.
-message TestSameTypeMap {
-  map<int32, int32> map1 = 1;
-  map<int32, int32> map2 = 2;
-}
-
-enum MapEnum {
-  MAP_ENUM_FOO = 0;
-  MAP_ENUM_BAR = 1;
-  MAP_ENUM_BAZ = 2;
-}
-
-message TestArenaMap {
-  map<int32   , int32   > map_int32_int32       = 1;
-  map<int64   , int64   > map_int64_int64       = 2;
-  map<uint32  , uint32  > map_uint32_uint32     = 3;
-  map<uint64  , uint64  > map_uint64_uint64     = 4;
-  map<sint32  , sint32  > map_sint32_sint32     = 5;
-  map<sint64  , sint64  > map_sint64_sint64     = 6;
-  map<fixed32 , fixed32 > map_fixed32_fixed32   = 7;
-  map<fixed64 , fixed64 > map_fixed64_fixed64   = 8;
-  map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
-  map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
-  map<int32   , float   > map_int32_float       = 11;
-  map<int32   , double  > map_int32_double      = 12;
-  map<bool    , bool    > map_bool_bool         = 13;
-  map<int32   , MapEnum > map_int32_enum        = 14;
-  map<int32   , ForeignMessage> map_int32_foreign_message = 15;
-}
-
-// Previously, message containing enum called Type cannot be used as value of
-// map field.
-message MessageContainingEnumCalledType {
-  enum Type {
-    TYPE_FOO = 0;
-  }
-  map<int32, MessageContainingEnumCalledType> type = 1;
-}
-
-// Previously, message cannot contain map field called "entry".
-message MessageContainingMapCalledEntry {
-  map<int32, int32> entry = 1;
-}
diff --git a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_import_proto3.proto b/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_import_proto3.proto
deleted file mode 100644
index 59673ea..0000000
--- a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_import_proto3.proto
+++ /dev/null
@@ -1,68 +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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which is imported by unittest_proto3.proto to test importing.
-
-syntax = "proto3";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do
-// "using namespace unittest_import = protobuf_unittest_import".
-package protobuf_unittest_import;
-
-option optimize_for = SPEED;
-option cc_enable_arenas = true;
-
-// Exercise the java_package option.
-option java_package = "com.google.protobuf.test";
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-// Do not set a java_outer_classname here to verify that Proto2 works without
-// one.
-
-// Test public import
-import public "google/protobuf/unittest_import_public_proto3.proto";
-
-message ImportMessage {
-  int32 d = 1;
-}
-
-enum ImportEnum {
-  IMPORT_ENUM_UNSPECIFIED = 0;
-  IMPORT_FOO = 7;
-  IMPORT_BAR = 8;
-  IMPORT_BAZ = 9;
-}
-
diff --git a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_import_public_proto3.proto b/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_import_public_proto3.proto
deleted file mode 100644
index d6f11e2..0000000
--- a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_import_public_proto3.proto
+++ /dev/null
@@ -1,42 +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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-syntax = "proto3";
-
-package protobuf_unittest_import;
-
-option java_package = "com.google.protobuf.test";
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-message PublicImportMessage {
- int32 e = 1;
-}
diff --git a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_proto3.proto b/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_proto3.proto
deleted file mode 100644
index f59d217..0000000
--- a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_proto3.proto
+++ /dev/null
@@ -1,388 +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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-syntax = "proto3";
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;     // auto-added
-option cc_enable_arenas = true;
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-import "google/protobuf/unittest_import_proto3.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestProto";
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-message TestAllTypes {
-  message NestedMessage {
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    NESTED_ENUM_UNSPECIFIED = 0;
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-    NEG = -1;  // Intentionally negative.
-  }
-
-  // Singular
-  int32 single_int32 = 1;
-  int64 single_int64 = 2;
-  uint32 single_uint32 = 3;
-  uint64 single_uint64 = 4;
-  sint32 single_sint32 = 5;
-  sint64 single_sint64 = 6;
-  fixed32 single_fixed32 = 7;
-  fixed64 single_fixed64 = 8;
-  sfixed32 single_sfixed32 = 9;
-  sfixed64 single_sfixed64 = 10;
-  float single_float = 11;
-  double single_double = 12;
-  bool single_bool = 13;
-  string single_string = 14;
-  bytes single_bytes = 15;
-
-  NestedMessage single_nested_message = 18;
-  ForeignMessage single_foreign_message = 19;
-  protobuf_unittest_import.ImportMessage single_import_message = 20;
-
-  NestedEnum single_nested_enum = 21;
-  ForeignEnum single_foreign_enum = 22;
-  protobuf_unittest_import.ImportEnum single_import_enum = 23;
-
-  // Defined in unittest_import_public.proto
-  protobuf_unittest_import.PublicImportMessage
-      single_public_import_message = 26;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated NestedMessage                        repeated_nested_message  = 48;
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
-
-  repeated NestedEnum                           repeated_nested_enum     = 51;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
-  // Defined in unittest_import_public.proto
-  repeated protobuf_unittest_import.PublicImportMessage
-      repeated_public_import_message = 54;
-
-  // For oneof test
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    NestedMessage oneof_nested_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-  }
-}
-
-// This proto includes a recusively nested message.
-message NestedTestAllTypes {
-  NestedTestAllTypes child = 1;
-  TestAllTypes payload = 2;
-  repeated NestedTestAllTypes repeated_child = 3;
-}
-
-message TestDeprecatedFields {
-  int32 deprecated_int32 = 1 [deprecated=true];
-}
-
-// Define these after TestAllTypes to make sure the compiler can handle
-// that.
-message ForeignMessage {
-  int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_UNSPECIFIED = 0;
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestReservedFields {
-  reserved 2, 15, 9 to 11;
-  reserved "bar", "baz";
-}
-
-
-// Test that we can use NestedMessage from outside TestAllTypes.
-message TestForeignNested {
-  TestAllTypes.NestedMessage foreign_nested = 1;
-}
-
-// Test that really large tag numbers don't break anything.
-message TestReallyLargeTagNumber {
-  // The largest possible tag number is 2^28 - 1, since the wire format uses
-  // three bits to communicate wire type.
-  int32 a = 1;
-  int32 bb = 268435455;
-}
-
-message TestRecursiveMessage {
-  TestRecursiveMessage a = 1;
-  int32 i = 2;
-}
-
-// Test that mutual recursion works.
-message TestMutualRecursionA {
-  TestMutualRecursionB bb = 1;
-}
-
-message TestMutualRecursionB {
-  TestMutualRecursionA a = 1;
-  int32 optional_int32 = 2;
-}
-
-
-// Test an enum that has multiple values with the same number.
-enum TestEnumWithDupValue {
-  TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
-  option allow_alias = true;
-
-  FOO1 = 1;
-  BAR1 = 2;
-  BAZ = 3;
-  FOO2 = 1;
-  BAR2 = 2;
-}
-
-// Test an enum with large, unordered values.
-enum TestSparseEnum {
-  TEST_SPARSE_ENUM_UNSPECIFIED = 0;
-  SPARSE_A = 123;
-  SPARSE_B = 62374;
-  SPARSE_C = 12589234;
-  SPARSE_D = -15;
-  SPARSE_E = -53452;
-  // In proto3, value 0 must be the first one specified
-  // SPARSE_F = 0;
-  SPARSE_G = 2;
-}
-
-// Test message with CamelCase field names.  This violates Protocol Buffer
-// standard style.
-message TestCamelCaseFieldNames {
-  int32 PrimitiveField = 1;
-  string StringField = 2;
-  ForeignEnum EnumField = 3;
-  ForeignMessage MessageField = 4;
-
-  repeated int32 RepeatedPrimitiveField = 7;
-  repeated string RepeatedStringField = 8;
-  repeated ForeignEnum RepeatedEnumField = 9;
-  repeated ForeignMessage RepeatedMessageField = 10;
-}
-
-
-// We list fields out of order, to ensure that we're using field number and not
-// field index to determine serialization order.
-message TestFieldOrderings {
-  string my_string = 11;
-  int64 my_int = 1;
-  float my_float = 101;
-  message NestedMessage {
-    int64 oo = 2;
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    int32 bb = 1;
-  }
-
-  NestedMessage single_nested_message  = 200;
-}
-
-message SparseEnumMessage {
-  TestSparseEnum sparse_enum = 1;
-}
-
-// Test String and Bytes: string is for valid UTF-8 strings
-message OneString {
-  string data = 1;
-}
-
-message MoreString {
-  repeated string data = 1;
-}
-
-message OneBytes {
-  bytes data = 1;
-}
-
-message MoreBytes {
-  bytes data = 1;
-}
-
-// Test int32, uint32, int64, uint64, and bool are all compatible
-message Int32Message {
-  int32 data = 1;
-}
-
-message Uint32Message {
-  uint32 data = 1;
-}
-
-message Int64Message {
-  int64 data = 1;
-}
-
-message Uint64Message {
-  uint64 data = 1;
-}
-
-message BoolMessage {
-  bool data = 1;
-}
-
-// Test oneofs.
-message TestOneof {
-  oneof foo {
-    int32 foo_int = 1;
-    string foo_string = 2;
-    TestAllTypes foo_message = 3;
-  }
-}
-
-// Test messages for packed fields
-
-message TestPackedTypes {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnum packed_enum  = 103 [packed = true];
-}
-
-// A message with the same fields as TestPackedTypes, but without packing. Used
-// to test packed <-> unpacked wire compatibility.
-message TestUnpackedTypes {
-  repeated    int32 unpacked_int32    =  90 [packed = false];
-  repeated    int64 unpacked_int64    =  91 [packed = false];
-  repeated   uint32 unpacked_uint32   =  92 [packed = false];
-  repeated   uint64 unpacked_uint64   =  93 [packed = false];
-  repeated   sint32 unpacked_sint32   =  94 [packed = false];
-  repeated   sint64 unpacked_sint64   =  95 [packed = false];
-  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
-  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
-  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
-  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
-  repeated    float unpacked_float    = 100 [packed = false];
-  repeated   double unpacked_double   = 101 [packed = false];
-  repeated     bool unpacked_bool     = 102 [packed = false];
-  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
-}
-
-message TestRepeatedScalarDifferentTagSizes {
-  // Parsing repeated fixed size values used to fail. This message needs to be
-  // used in order to get a tag of the right size; all of the repeated fields
-  // in TestAllTypes didn't trigger the check.
-  repeated fixed32 repeated_fixed32 = 12;
-  // Check for a varint type, just for good measure.
-  repeated int32   repeated_int32   = 13;
-
-  // These have two-byte tags.
-  repeated fixed64 repeated_fixed64 = 2046;
-  repeated int64   repeated_int64   = 2047;
-
-  // Three byte tags.
-  repeated float   repeated_float   = 262142;
-  repeated uint64  repeated_uint64  = 262143;
-}
-
-message TestCommentInjectionMessage {
-  // */ <- This should not close the generated doc comment
-  string a = 1;
-}
-
-
-// Test that RPC services work.
-message FooRequest  {}
-message FooResponse {}
-
-message FooClientMessage {}
-message FooServerMessage{}
-
-service TestService {
-  rpc Foo(FooRequest) returns (FooResponse);
-  rpc Bar(BarRequest) returns (BarResponse);
-}
-
-
-message BarRequest  {}
-message BarResponse {}
-
diff --git a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_well_known_types.proto b/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_well_known_types.proto
deleted file mode 100644
index c907524..0000000
--- a/csharp/compatibility_tests/v3.0.0/protos/src/google/protobuf/unittest_well_known_types.proto
+++ /dev/null
@@ -1,114 +0,0 @@
-syntax = "proto3";
-
-package protobuf_unittest;
-
-option csharp_namespace = "Google.Protobuf.TestProtos";
-option java_multiple_files = true;
-option java_package = "com.google.protobuf.test";
-
-import "google/protobuf/any.proto";
-import "google/protobuf/api.proto";
-import "google/protobuf/duration.proto";
-import "google/protobuf/empty.proto";
-import "google/protobuf/field_mask.proto";
-import "google/protobuf/source_context.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/type.proto";
-import "google/protobuf/wrappers.proto";
-
-// Test that we can include all well-known types.
-// Each wrapper type is included separately, as languages
-// map handle different wrappers in different ways.
-message TestWellKnownTypes {
-  google.protobuf.Any any_field = 1;
-  google.protobuf.Api api_field = 2;
-  google.protobuf.Duration duration_field = 3;
-  google.protobuf.Empty empty_field = 4;
-  google.protobuf.FieldMask field_mask_field = 5;
-  google.protobuf.SourceContext source_context_field = 6;
-  google.protobuf.Struct struct_field = 7;
-  google.protobuf.Timestamp timestamp_field = 8;
-  google.protobuf.Type type_field = 9;
-  google.protobuf.DoubleValue double_field = 10;
-  google.protobuf.FloatValue float_field = 11;
-  google.protobuf.Int64Value int64_field = 12;
-  google.protobuf.UInt64Value uint64_field = 13;
-  google.protobuf.Int32Value int32_field = 14;
-  google.protobuf.UInt32Value uint32_field = 15;
-  google.protobuf.BoolValue bool_field = 16;
-  google.protobuf.StringValue string_field = 17;
-  google.protobuf.BytesValue bytes_field = 18;
-  // Part of struct, but useful to be able to test separately
-  google.protobuf.Value value_field = 19;
-}
-
-// A repeated field for each well-known type.
-message RepeatedWellKnownTypes {
-  repeated google.protobuf.Any any_field = 1;
-  repeated google.protobuf.Api api_field = 2;
-  repeated google.protobuf.Duration duration_field = 3;
-  repeated google.protobuf.Empty empty_field = 4;
-  repeated google.protobuf.FieldMask field_mask_field = 5;
-  repeated google.protobuf.SourceContext source_context_field = 6;
-  repeated google.protobuf.Struct struct_field = 7;
-  repeated google.protobuf.Timestamp timestamp_field = 8;
-  repeated google.protobuf.Type type_field = 9;
-  // These don't actually make a lot of sense, but they're not prohibited...
-  repeated google.protobuf.DoubleValue double_field = 10;
-  repeated google.protobuf.FloatValue float_field = 11;
-  repeated google.protobuf.Int64Value int64_field = 12;
-  repeated google.protobuf.UInt64Value uint64_field = 13;
-  repeated google.protobuf.Int32Value int32_field = 14;
-  repeated google.protobuf.UInt32Value uint32_field = 15;
-  repeated google.protobuf.BoolValue bool_field = 16;
-  repeated google.protobuf.StringValue string_field = 17;
-  repeated google.protobuf.BytesValue bytes_field = 18;
-}
-
-message OneofWellKnownTypes {
-  oneof oneof_field {
-    google.protobuf.Any any_field = 1;
-    google.protobuf.Api api_field = 2;
-    google.protobuf.Duration duration_field = 3;
-    google.protobuf.Empty empty_field = 4;
-    google.protobuf.FieldMask field_mask_field = 5;
-    google.protobuf.SourceContext source_context_field = 6;
-    google.protobuf.Struct struct_field = 7;
-    google.protobuf.Timestamp timestamp_field = 8;
-    google.protobuf.Type type_field = 9;
-    google.protobuf.DoubleValue double_field = 10;
-    google.protobuf.FloatValue float_field = 11;
-    google.protobuf.Int64Value int64_field = 12;
-    google.protobuf.UInt64Value uint64_field = 13;
-    google.protobuf.Int32Value int32_field = 14;
-    google.protobuf.UInt32Value uint32_field = 15;
-    google.protobuf.BoolValue bool_field = 16;
-    google.protobuf.StringValue string_field = 17;
-    google.protobuf.BytesValue bytes_field = 18;
-  }
-}
-
-// A map field for each well-known type. We only
-// need to worry about the value part of the map being the
-// well-known types, as messages can't be map keys.
-message MapWellKnownTypes {
-  map<int32,google.protobuf.Any> any_field = 1;
-  map<int32,google.protobuf.Api> api_field = 2;
-  map<int32,google.protobuf.Duration> duration_field = 3;
-  map<int32,google.protobuf.Empty> empty_field = 4;
-  map<int32,google.protobuf.FieldMask> field_mask_field = 5;
-  map<int32,google.protobuf.SourceContext> source_context_field = 6;
-  map<int32,google.protobuf.Struct> struct_field = 7;
-  map<int32,google.protobuf.Timestamp> timestamp_field = 8;
-  map<int32,google.protobuf.Type> type_field = 9;
-  map<int32,google.protobuf.DoubleValue> double_field = 10;
-  map<int32,google.protobuf.FloatValue> float_field = 11;
-  map<int32,google.protobuf.Int64Value> int64_field = 12;
-  map<int32,google.protobuf.UInt64Value> uint64_field = 13;
-  map<int32,google.protobuf.Int32Value> int32_field = 14;
-  map<int32,google.protobuf.UInt32Value> uint32_field = 15;
-  map<int32,google.protobuf.BoolValue> bool_field = 16;
-  map<int32,google.protobuf.StringValue> string_field = 17;
-  map<int32,google.protobuf.BytesValue> bytes_field = 18;
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/ByteStringTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/ByteStringTest.cs
deleted file mode 100644
index 685e130..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/ByteStringTest.cs
+++ /dev/null
@@ -1,171 +0,0 @@
-#region Copyright notice and license

-// 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.

-#endregion

-

-using System;

-using System.Text;

-using NUnit.Framework;

-

-namespace Google.Protobuf

-{

-    public class ByteStringTest

-    {

-        [Test]

-        public void Equality()

-        {

-            ByteString b1 = ByteString.CopyFrom(1, 2, 3);

-            ByteString b2 = ByteString.CopyFrom(1, 2, 3);

-            ByteString b3 = ByteString.CopyFrom(1, 2, 4);

-            ByteString b4 = ByteString.CopyFrom(1, 2, 3, 4);

-            EqualityTester.AssertEquality(b1, b1);

-            EqualityTester.AssertEquality(b1, b2);

-            EqualityTester.AssertInequality(b1, b3);

-            EqualityTester.AssertInequality(b1, b4);

-            EqualityTester.AssertInequality(b1, null);

-#pragma warning disable 1718 // Deliberately calling ==(b1, b1) and !=(b1, b1)

-            Assert.IsTrue(b1 == b1);

-            Assert.IsTrue(b1 == b2);

-            Assert.IsFalse(b1 == b3);

-            Assert.IsFalse(b1 == b4);

-            Assert.IsFalse(b1 == null);

-            Assert.IsTrue((ByteString) null == null);

-            Assert.IsFalse(b1 != b1);

-            Assert.IsFalse(b1 != b2);

-#pragma warning disable 1718

-            Assert.IsTrue(b1 != b3);

-            Assert.IsTrue(b1 != b4);

-            Assert.IsTrue(b1 != null);

-            Assert.IsFalse((ByteString) null != null);

-        }

-

-        [Test]

-        public void EmptyByteStringHasZeroSize()

-        {

-            Assert.AreEqual(0, ByteString.Empty.Length);

-        }

-

-        [Test]

-        public void CopyFromStringWithExplicitEncoding()

-        {

-            ByteString bs = ByteString.CopyFrom("AB", Encoding.Unicode);

-            Assert.AreEqual(4, bs.Length);

-            Assert.AreEqual(65, bs[0]);

-            Assert.AreEqual(0, bs[1]);

-            Assert.AreEqual(66, bs[2]);

-            Assert.AreEqual(0, bs[3]);

-        }

-

-        [Test]

-        public void IsEmptyWhenEmpty()

-        {

-            Assert.IsTrue(ByteString.CopyFromUtf8("").IsEmpty);

-        }

-

-        [Test]

-        public void IsEmptyWhenNotEmpty()

-        {

-            Assert.IsFalse(ByteString.CopyFromUtf8("X").IsEmpty);

-        }

-

-        [Test]

-        public void CopyFromByteArrayCopiesContents()

-        {

-            byte[] data = new byte[1];

-            data[0] = 10;

-            ByteString bs = ByteString.CopyFrom(data);

-            Assert.AreEqual(10, bs[0]);

-            data[0] = 5;

-            Assert.AreEqual(10, bs[0]);

-        }

-

-        [Test]

-        public void ToByteArrayCopiesContents()

-        {

-            ByteString bs = ByteString.CopyFromUtf8("Hello");

-            byte[] data = bs.ToByteArray();

-            Assert.AreEqual((byte)'H', data[0]);

-            Assert.AreEqual((byte)'H', bs[0]);

-            data[0] = 0;

-            Assert.AreEqual(0, data[0]);

-            Assert.AreEqual((byte)'H', bs[0]);

-        }

-

-        [Test]

-        public void CopyFromUtf8UsesUtf8()

-        {

-            ByteString bs = ByteString.CopyFromUtf8("\u20ac");

-            Assert.AreEqual(3, bs.Length);

-            Assert.AreEqual(0xe2, bs[0]);

-            Assert.AreEqual(0x82, bs[1]);

-            Assert.AreEqual(0xac, bs[2]);

-        }

-

-        [Test]

-        public void CopyFromPortion()

-        {

-            byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6};

-            ByteString bs = ByteString.CopyFrom(data, 2, 3);

-            Assert.AreEqual(3, bs.Length);

-            Assert.AreEqual(2, bs[0]);

-            Assert.AreEqual(3, bs[1]);

-        }

-

-        [Test]

-        public void ToStringUtf8()

-        {

-            ByteString bs = ByteString.CopyFromUtf8("\u20ac");

-            Assert.AreEqual("\u20ac", bs.ToStringUtf8());

-        }

-

-        [Test]

-        public void ToStringWithExplicitEncoding()

-        {

-            ByteString bs = ByteString.CopyFrom("\u20ac", Encoding.Unicode);

-            Assert.AreEqual("\u20ac", bs.ToString(Encoding.Unicode));

-        }

-

-        [Test]

-        public void FromBase64_WithText()

-        {

-            byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6};

-            string base64 = Convert.ToBase64String(data);

-            ByteString bs = ByteString.FromBase64(base64);

-            Assert.AreEqual(data, bs.ToByteArray());

-        }

-

-        [Test]

-        public void FromBase64_Empty()

-        {

-            // Optimization which also fixes issue 61.

-            Assert.AreSame(ByteString.Empty, ByteString.FromBase64(""));

-        }

-    }

-}
\ No newline at end of file
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs
deleted file mode 100644
index 23af288..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using NUnit.Framework;
-
-namespace Google.Protobuf
-{
-    internal static class CodedInputStreamExtensions
-    {
-        public static void AssertNextTag(this CodedInputStream input, uint expectedTag)
-        {
-            uint tag = input.ReadTag();
-            Assert.AreEqual(expectedTag, tag);
-        }
-
-        public static T ReadMessage<T>(this CodedInputStream stream, MessageParser<T> parser)
-            where T : IMessage<T>
-        {
-            var message = parser.CreateTemplate();
-            stream.ReadMessage(message);
-            return message;
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedInputStreamTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedInputStreamTest.cs
deleted file mode 100644
index ff44895..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedInputStreamTest.cs
+++ /dev/null
@@ -1,598 +0,0 @@
-#region Copyright notice and license

-// 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.

-#endregion

-

-using System;

-using System.IO;

-using Google.Protobuf.TestProtos;

-using NUnit.Framework;

-

-namespace Google.Protobuf

-{

-    public class CodedInputStreamTest

-    {

-        /// <summary>

-        /// Helper to construct a byte array from a bunch of bytes.  The inputs are

-        /// actually ints so that I can use hex notation and not get stupid errors

-        /// about precision.

-        /// </summary>

-        private static byte[] Bytes(params int[] bytesAsInts)

-        {

-            byte[] bytes = new byte[bytesAsInts.Length];

-            for (int i = 0; i < bytesAsInts.Length; i++)

-            {

-                bytes[i] = (byte) bytesAsInts[i];

-            }

-            return bytes;

-        }

-

-        /// <summary>

-        /// Parses the given bytes using ReadRawVarint32() and ReadRawVarint64()

-        /// </summary>

-        private static void AssertReadVarint(byte[] data, ulong value)

-        {

-            CodedInputStream input = new CodedInputStream(data);

-            Assert.AreEqual((uint) value, input.ReadRawVarint32());

-

-            input = new CodedInputStream(data);

-            Assert.AreEqual(value, input.ReadRawVarint64());

-            Assert.IsTrue(input.IsAtEnd);

-

-            // Try different block sizes.

-            for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)

-            {

-                input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));

-                Assert.AreEqual((uint) value, input.ReadRawVarint32());

-

-                input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));

-                Assert.AreEqual(value, input.ReadRawVarint64());

-                Assert.IsTrue(input.IsAtEnd);

-            }

-

-            // Try reading directly from a MemoryStream. We want to verify that it

-            // doesn't read past the end of the input, so write an extra byte - this

-            // lets us test the position at the end.

-            MemoryStream memoryStream = new MemoryStream();

-            memoryStream.Write(data, 0, data.Length);

-            memoryStream.WriteByte(0);

-            memoryStream.Position = 0;

-            Assert.AreEqual((uint) value, CodedInputStream.ReadRawVarint32(memoryStream));

-            Assert.AreEqual(data.Length, memoryStream.Position);

-        }

-

-        /// <summary>

-        /// Parses the given bytes using ReadRawVarint32() and ReadRawVarint64() and

-        /// expects them to fail with an InvalidProtocolBufferException whose

-        /// description matches the given one.

-        /// </summary>

-        private static void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data)

-        {

-            CodedInputStream input = new CodedInputStream(data);

-            var exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint32());

-            Assert.AreEqual(expected.Message, exception.Message);

-

-            input = new CodedInputStream(data);

-            exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint64());

-            Assert.AreEqual(expected.Message, exception.Message);

-

-            // Make sure we get the same error when reading directly from a Stream.

-            exception = Assert.Throws<InvalidProtocolBufferException>(() => CodedInputStream.ReadRawVarint32(new MemoryStream(data)));

-            Assert.AreEqual(expected.Message, exception.Message);

-        }

-

-        [Test]

-        public void ReadVarint()

-        {

-            AssertReadVarint(Bytes(0x00), 0);

-            AssertReadVarint(Bytes(0x01), 1);

-            AssertReadVarint(Bytes(0x7f), 127);

-            // 14882

-            AssertReadVarint(Bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));

-            // 2961488830

-            AssertReadVarint(Bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),

-                             (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |

-                             (0x0bL << 28));

-

-            // 64-bit

-            // 7256456126

-            AssertReadVarint(Bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),

-                             (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |

-                             (0x1bL << 28));

-            // 41256202580718336

-            AssertReadVarint(Bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),

-                             (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |

-                             (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));

-            // 11964378330978735131

-            AssertReadVarint(Bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),

-                             (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |

-                             (0x3bUL << 28) | (0x56UL << 35) | (0x00UL << 42) |

-                             (0x05UL << 49) | (0x26UL << 56) | (0x01UL << 63));

-

-            // Failures

-            AssertReadVarintFailure(

-                InvalidProtocolBufferException.MalformedVarint(),

-                Bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,

-                      0x00));

-            AssertReadVarintFailure(

-                InvalidProtocolBufferException.TruncatedMessage(),

-                Bytes(0x80));

-        }

-

-        /// <summary>

-        /// Parses the given bytes using ReadRawLittleEndian32() and checks

-        /// that the result matches the given value.

-        /// </summary>

-        private static void AssertReadLittleEndian32(byte[] data, uint value)

-        {

-            CodedInputStream input = new CodedInputStream(data);

-            Assert.AreEqual(value, input.ReadRawLittleEndian32());

-            Assert.IsTrue(input.IsAtEnd);

-

-            // Try different block sizes.

-            for (int blockSize = 1; blockSize <= 16; blockSize *= 2)

-            {

-                input = new CodedInputStream(

-                    new SmallBlockInputStream(data, blockSize));

-                Assert.AreEqual(value, input.ReadRawLittleEndian32());

-                Assert.IsTrue(input.IsAtEnd);

-            }

-        }

-

-        /// <summary>

-        /// Parses the given bytes using ReadRawLittleEndian64() and checks

-        /// that the result matches the given value.

-        /// </summary>

-        private static void AssertReadLittleEndian64(byte[] data, ulong value)

-        {

-            CodedInputStream input = new CodedInputStream(data);

-            Assert.AreEqual(value, input.ReadRawLittleEndian64());

-            Assert.IsTrue(input.IsAtEnd);

-

-            // Try different block sizes.

-            for (int blockSize = 1; blockSize <= 16; blockSize *= 2)

-            {

-                input = new CodedInputStream(

-                    new SmallBlockInputStream(data, blockSize));

-                Assert.AreEqual(value, input.ReadRawLittleEndian64());

-                Assert.IsTrue(input.IsAtEnd);

-            }

-        }

-

-        [Test]

-        public void ReadLittleEndian()

-        {

-            AssertReadLittleEndian32(Bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);

-            AssertReadLittleEndian32(Bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);

-

-            AssertReadLittleEndian64(Bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),

-                                     0x123456789abcdef0L);

-            AssertReadLittleEndian64(

-                Bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef012345678UL);

-        }

-

-        [Test]

-        public void DecodeZigZag32()

-        {

-            Assert.AreEqual(0, CodedInputStream.DecodeZigZag32(0));

-            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag32(1));

-            Assert.AreEqual(1, CodedInputStream.DecodeZigZag32(2));

-            Assert.AreEqual(-2, CodedInputStream.DecodeZigZag32(3));

-            Assert.AreEqual(0x3FFFFFFF, CodedInputStream.DecodeZigZag32(0x7FFFFFFE));

-            Assert.AreEqual(unchecked((int) 0xC0000000), CodedInputStream.DecodeZigZag32(0x7FFFFFFF));

-            Assert.AreEqual(0x7FFFFFFF, CodedInputStream.DecodeZigZag32(0xFFFFFFFE));

-            Assert.AreEqual(unchecked((int) 0x80000000), CodedInputStream.DecodeZigZag32(0xFFFFFFFF));

-        }

-

-        [Test]

-        public void DecodeZigZag64()

-        {

-            Assert.AreEqual(0, CodedInputStream.DecodeZigZag64(0));

-            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag64(1));

-            Assert.AreEqual(1, CodedInputStream.DecodeZigZag64(2));

-            Assert.AreEqual(-2, CodedInputStream.DecodeZigZag64(3));

-            Assert.AreEqual(0x000000003FFFFFFFL, CodedInputStream.DecodeZigZag64(0x000000007FFFFFFEL));

-            Assert.AreEqual(unchecked((long) 0xFFFFFFFFC0000000L), CodedInputStream.DecodeZigZag64(0x000000007FFFFFFFL));

-            Assert.AreEqual(0x000000007FFFFFFFL, CodedInputStream.DecodeZigZag64(0x00000000FFFFFFFEL));

-            Assert.AreEqual(unchecked((long) 0xFFFFFFFF80000000L), CodedInputStream.DecodeZigZag64(0x00000000FFFFFFFFL));

-            Assert.AreEqual(0x7FFFFFFFFFFFFFFFL, CodedInputStream.DecodeZigZag64(0xFFFFFFFFFFFFFFFEL));

-            Assert.AreEqual(unchecked((long) 0x8000000000000000L), CodedInputStream.DecodeZigZag64(0xFFFFFFFFFFFFFFFFL));

-        }

-        

-        [Test]

-        public void ReadWholeMessage_VaryingBlockSizes()

-        {

-            TestAllTypes message = SampleMessages.CreateFullTestAllTypes();

-

-            byte[] rawBytes = message.ToByteArray();

-            Assert.AreEqual(rawBytes.Length, message.CalculateSize());

-            TestAllTypes message2 = TestAllTypes.Parser.ParseFrom(rawBytes);

-            Assert.AreEqual(message, message2);

-

-            // Try different block sizes.

-            for (int blockSize = 1; blockSize < 256; blockSize *= 2)

-            {

-                message2 = TestAllTypes.Parser.ParseFrom(new SmallBlockInputStream(rawBytes, blockSize));

-                Assert.AreEqual(message, message2);

-            }

-        }

-                

-        [Test]

-        public void ReadHugeBlob()

-        {

-            // Allocate and initialize a 1MB blob.

-            byte[] blob = new byte[1 << 20];

-            for (int i = 0; i < blob.Length; i++)

-            {

-                blob[i] = (byte) i;

-            }

-

-            // Make a message containing it.

-            var message = new TestAllTypes { SingleBytes = ByteString.CopyFrom(blob) };

-

-            // Serialize and parse it.  Make sure to parse from an InputStream, not

-            // directly from a ByteString, so that CodedInputStream uses buffered

-            // reading.

-            TestAllTypes message2 = TestAllTypes.Parser.ParseFrom(message.ToByteString());

-

-            Assert.AreEqual(message, message2);

-        }

-

-        [Test]

-        public void ReadMaliciouslyLargeBlob()

-        {

-            MemoryStream ms = new MemoryStream();

-            CodedOutputStream output = new CodedOutputStream(ms);

-

-            uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);

-            output.WriteRawVarint32(tag);

-            output.WriteRawVarint32(0x7FFFFFFF);

-            output.WriteRawBytes(new byte[32]); // Pad with a few random bytes.

-            output.Flush();

-            ms.Position = 0;

-

-            CodedInputStream input = new CodedInputStream(ms);

-            Assert.AreEqual(tag, input.ReadTag());

-

-            Assert.Throws<InvalidProtocolBufferException>(() => input.ReadBytes());

-        }

-

-        internal static TestRecursiveMessage MakeRecursiveMessage(int depth)

-        {

-            if (depth == 0)

-            {

-                return new TestRecursiveMessage { I = 5 };

-            }

-            else

-            {

-                return new TestRecursiveMessage { A = MakeRecursiveMessage(depth - 1) };

-            }

-        }

-

-        internal static void AssertMessageDepth(TestRecursiveMessage message, int depth)

-        {

-            if (depth == 0)

-            {

-                Assert.IsNull(message.A);

-                Assert.AreEqual(5, message.I);

-            }

-            else

-            {

-                Assert.IsNotNull(message.A);

-                AssertMessageDepth(message.A, depth - 1);

-            }

-        }

-

-        [Test]

-        public void MaliciousRecursion()

-        {

-            ByteString data64 = MakeRecursiveMessage(64).ToByteString();

-            ByteString data65 = MakeRecursiveMessage(65).ToByteString();

-

-            AssertMessageDepth(TestRecursiveMessage.Parser.ParseFrom(data64), 64);

-

-            Assert.Throws<InvalidProtocolBufferException>(() => TestRecursiveMessage.Parser.ParseFrom(data65));

-

-            CodedInputStream input = CodedInputStream.CreateWithLimits(new MemoryStream(data64.ToByteArray()), 1000000, 63);

-            Assert.Throws<InvalidProtocolBufferException>(() => TestRecursiveMessage.Parser.ParseFrom(input));

-        }

-

-        [Test]

-        public void SizeLimit()

-        {

-            // Have to use a Stream rather than ByteString.CreateCodedInput as SizeLimit doesn't

-            // apply to the latter case.

-            MemoryStream ms = new MemoryStream(SampleMessages.CreateFullTestAllTypes().ToByteArray());

-            CodedInputStream input = CodedInputStream.CreateWithLimits(ms, 16, 100);

-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(input));

-        }

-

-        /// <summary>

-        /// Tests that if we read an string that contains invalid UTF-8, no exception

-        /// is thrown.  Instead, the invalid bytes are replaced with the Unicode

-        /// "replacement character" U+FFFD.

-        /// </summary>

-        [Test]

-        public void ReadInvalidUtf8()

-        {

-            MemoryStream ms = new MemoryStream();

-            CodedOutputStream output = new CodedOutputStream(ms);

-

-            uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);

-            output.WriteRawVarint32(tag);

-            output.WriteRawVarint32(1);

-            output.WriteRawBytes(new byte[] {0x80});

-            output.Flush();

-            ms.Position = 0;

-

-            CodedInputStream input = new CodedInputStream(ms);

-

-            Assert.AreEqual(tag, input.ReadTag());

-            string text = input.ReadString();

-            Assert.AreEqual('\ufffd', text[0]);

-        }

-

-        /// <summary>

-        /// A stream which limits the number of bytes it reads at a time.

-        /// We use this to make sure that CodedInputStream doesn't screw up when

-        /// reading in small blocks.

-        /// </summary>

-        private sealed class SmallBlockInputStream : MemoryStream

-        {

-            private readonly int blockSize;

-

-            public SmallBlockInputStream(byte[] data, int blockSize)

-                : base(data)

-            {

-                this.blockSize = blockSize;

-            }

-

-            public override int Read(byte[] buffer, int offset, int count)

-            {

-                return base.Read(buffer, offset, Math.Min(count, blockSize));

-            }

-        }

-

-        [Test]

-        public void TestNegativeEnum()

-        {

-            byte[] bytes = { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01 };

-            CodedInputStream input = new CodedInputStream(bytes);

-            Assert.AreEqual((int)SampleEnum.NegativeValue, input.ReadEnum());

-            Assert.IsTrue(input.IsAtEnd);

-        }

-

-        //Issue 71:	CodedInputStream.ReadBytes go to slow path unnecessarily

-        [Test]

-        public void TestSlowPathAvoidance()

-        {

-            using (var ms = new MemoryStream())

-            {

-                CodedOutputStream output = new CodedOutputStream(ms);

-                output.WriteTag(1, WireFormat.WireType.LengthDelimited);

-                output.WriteBytes(ByteString.CopyFrom(new byte[100]));

-                output.WriteTag(2, WireFormat.WireType.LengthDelimited);

-                output.WriteBytes(ByteString.CopyFrom(new byte[100]));

-                output.Flush();

-

-                ms.Position = 0;

-                CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2], 0, 0, false);

-

-                uint tag = input.ReadTag();

-                Assert.AreEqual(1, WireFormat.GetTagFieldNumber(tag));

-                Assert.AreEqual(100, input.ReadBytes().Length);

-

-                tag = input.ReadTag();

-                Assert.AreEqual(2, WireFormat.GetTagFieldNumber(tag));

-                Assert.AreEqual(100, input.ReadBytes().Length);

-            }

-        }

-

-        [Test]

-        public void Tag0Throws()

-        {

-            var input = new CodedInputStream(new byte[] { 0 });

-            Assert.Throws<InvalidProtocolBufferException>(() => input.ReadTag());

-        }

-

-        [Test]

-        public void SkipGroup()

-        {

-            // Create an output stream with a group in:

-            // Field 1: string "field 1"

-            // Field 2: group containing:

-            //   Field 1: fixed int32 value 100

-            //   Field 2: string "ignore me"

-            //   Field 3: nested group containing

-            //      Field 1: fixed int64 value 1000

-            // Field 3: string "field 3"

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-            output.WriteTag(1, WireFormat.WireType.LengthDelimited);

-            output.WriteString("field 1");

-            

-            // The outer group...

-            output.WriteTag(2, WireFormat.WireType.StartGroup);

-            output.WriteTag(1, WireFormat.WireType.Fixed32);

-            output.WriteFixed32(100);

-            output.WriteTag(2, WireFormat.WireType.LengthDelimited);

-            output.WriteString("ignore me");

-            // The nested group...

-            output.WriteTag(3, WireFormat.WireType.StartGroup);

-            output.WriteTag(1, WireFormat.WireType.Fixed64);

-            output.WriteFixed64(1000);

-            // Note: Not sure the field number is relevant for end group...

-            output.WriteTag(3, WireFormat.WireType.EndGroup);

-

-            // End the outer group

-            output.WriteTag(2, WireFormat.WireType.EndGroup);

-

-            output.WriteTag(3, WireFormat.WireType.LengthDelimited);

-            output.WriteString("field 3");

-            output.Flush();

-            stream.Position = 0;

-

-            // Now act like a generated client

-            var input = new CodedInputStream(stream);

-            Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited), input.ReadTag());

-            Assert.AreEqual("field 1", input.ReadString());

-            Assert.AreEqual(WireFormat.MakeTag(2, WireFormat.WireType.StartGroup), input.ReadTag());

-            input.SkipLastField(); // Should consume the whole group, including the nested one.

-            Assert.AreEqual(WireFormat.MakeTag(3, WireFormat.WireType.LengthDelimited), input.ReadTag());

-            Assert.AreEqual("field 3", input.ReadString());

-        }

-

-        [Test]

-        public void SkipGroup_WrongEndGroupTag()

-        {

-            // Create an output stream with:

-            // Field 1: string "field 1"

-            // Start group 2

-            //   Field 3: fixed int32

-            // End group 4 (should give an error)

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-            output.WriteTag(1, WireFormat.WireType.LengthDelimited);

-            output.WriteString("field 1");

-

-            // The outer group...

-            output.WriteTag(2, WireFormat.WireType.StartGroup);

-            output.WriteTag(3, WireFormat.WireType.Fixed32);

-            output.WriteFixed32(100);

-            output.WriteTag(4, WireFormat.WireType.EndGroup);

-            output.Flush();

-            stream.Position = 0;

-

-            // Now act like a generated client

-            var input = new CodedInputStream(stream);

-            Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited), input.ReadTag());

-            Assert.AreEqual("field 1", input.ReadString());

-            Assert.AreEqual(WireFormat.MakeTag(2, WireFormat.WireType.StartGroup), input.ReadTag());

-            Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);

-        }

-

-        [Test]

-        public void RogueEndGroupTag()

-        {

-            // If we have an end-group tag without a leading start-group tag, generated

-            // code will just call SkipLastField... so that should fail.

-

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-            output.WriteTag(1, WireFormat.WireType.EndGroup);

-            output.Flush();

-            stream.Position = 0;

-

-            var input = new CodedInputStream(stream);

-            Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.EndGroup), input.ReadTag());

-            Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);

-        }

-

-        [Test]

-        public void EndOfStreamReachedWhileSkippingGroup()

-        {

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-            output.WriteTag(1, WireFormat.WireType.StartGroup);

-            output.WriteTag(2, WireFormat.WireType.StartGroup);

-            output.WriteTag(2, WireFormat.WireType.EndGroup);

-

-            output.Flush();

-            stream.Position = 0;

-

-            // Now act like a generated client

-            var input = new CodedInputStream(stream);

-            input.ReadTag();

-            Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);

-        }

-

-        [Test]

-        public void RecursionLimitAppliedWhileSkippingGroup()

-        {

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-            for (int i = 0; i < CodedInputStream.DefaultRecursionLimit + 1; i++)

-            {

-                output.WriteTag(1, WireFormat.WireType.StartGroup);

-            }

-            for (int i = 0; i < CodedInputStream.DefaultRecursionLimit + 1; i++)

-            {

-                output.WriteTag(1, WireFormat.WireType.EndGroup);

-            }

-            output.Flush();

-            stream.Position = 0;

-

-            // Now act like a generated client

-            var input = new CodedInputStream(stream);

-            Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.StartGroup), input.ReadTag());

-            Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);

-        }

-

-        [Test]

-        public void Construction_Invalid()

-        {

-            Assert.Throws<ArgumentNullException>(() => new CodedInputStream((byte[]) null));

-            Assert.Throws<ArgumentNullException>(() => new CodedInputStream(null, 0, 0));

-            Assert.Throws<ArgumentNullException>(() => new CodedInputStream((Stream) null));

-            Assert.Throws<ArgumentOutOfRangeException>(() => new CodedInputStream(new byte[10], 100, 0));

-            Assert.Throws<ArgumentOutOfRangeException>(() => new CodedInputStream(new byte[10], 5, 10));

-        }

-

-        [Test]

-        public void CreateWithLimits_InvalidLimits()

-        {

-            var stream = new MemoryStream();

-            Assert.Throws<ArgumentOutOfRangeException>(() => CodedInputStream.CreateWithLimits(stream, 0, 1));

-            Assert.Throws<ArgumentOutOfRangeException>(() => CodedInputStream.CreateWithLimits(stream, 1, 0));

-        }

-

-        [Test]

-        public void Dispose_DisposesUnderlyingStream()

-        {

-            var memoryStream = new MemoryStream();

-            Assert.IsTrue(memoryStream.CanRead);

-            using (var cis = new CodedInputStream(memoryStream))

-            {

-            }

-            Assert.IsFalse(memoryStream.CanRead); // Disposed

-        }

-

-        [Test]

-        public void Dispose_WithLeaveOpen()

-        {

-            var memoryStream = new MemoryStream();

-            Assert.IsTrue(memoryStream.CanRead);

-            using (var cis = new CodedInputStream(memoryStream, true))

-            {

-            }

-            Assert.IsTrue(memoryStream.CanRead); // We left the stream open

-        }

-    }

-}
\ No newline at end of file
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedOutputStreamTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
deleted file mode 100644
index 01bd321..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
+++ /dev/null
@@ -1,419 +0,0 @@
-#region Copyright notice and license

-// 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.

-#endregion

-

-using System;

-using System.IO;

-using Google.Protobuf.TestProtos;

-using NUnit.Framework;

-

-namespace Google.Protobuf

-{

-    public class CodedOutputStreamTest

-    {

-        /// <summary>

-        /// Writes the given value using WriteRawVarint32() and WriteRawVarint64() and

-        /// checks that the result matches the given bytes

-        /// </summary>

-        private static void AssertWriteVarint(byte[] data, ulong value)

-        {

-            // Only do 32-bit write if the value fits in 32 bits.

-            if ((value >> 32) == 0)

-            {

-                MemoryStream rawOutput = new MemoryStream();

-                CodedOutputStream output = new CodedOutputStream(rawOutput);

-                output.WriteRawVarint32((uint) value);

-                output.Flush();

-                Assert.AreEqual(data, rawOutput.ToArray());

-                // Also try computing size.

-                Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint32Size((uint) value));

-            }

-

-            {

-                MemoryStream rawOutput = new MemoryStream();

-                CodedOutputStream output = new CodedOutputStream(rawOutput);

-                output.WriteRawVarint64(value);

-                output.Flush();

-                Assert.AreEqual(data, rawOutput.ToArray());

-

-                // Also try computing size.

-                Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint64Size(value));

-            }

-

-            // Try different buffer sizes.

-            for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)

-            {

-                // Only do 32-bit write if the value fits in 32 bits.

-                if ((value >> 32) == 0)

-                {

-                    MemoryStream rawOutput = new MemoryStream();

-                    CodedOutputStream output =

-                        new CodedOutputStream(rawOutput, bufferSize);

-                    output.WriteRawVarint32((uint) value);

-                    output.Flush();

-                    Assert.AreEqual(data, rawOutput.ToArray());

-                }

-

-                {

-                    MemoryStream rawOutput = new MemoryStream();

-                    CodedOutputStream output = new CodedOutputStream(rawOutput, bufferSize);

-                    output.WriteRawVarint64(value);

-                    output.Flush();

-                    Assert.AreEqual(data, rawOutput.ToArray());

-                }

-            }

-        }

-

-        /// <summary>

-        /// Tests WriteRawVarint32() and WriteRawVarint64()

-        /// </summary>

-        [Test]

-        public void WriteVarint()

-        {

-            AssertWriteVarint(new byte[] {0x00}, 0);

-            AssertWriteVarint(new byte[] {0x01}, 1);

-            AssertWriteVarint(new byte[] {0x7f}, 127);

-            // 14882

-            AssertWriteVarint(new byte[] {0xa2, 0x74}, (0x22 << 0) | (0x74 << 7));

-            // 2961488830

-            AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x0b},

-                              (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |

-                              (0x0bL << 28));

-

-            // 64-bit

-            // 7256456126

-            AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x1b},

-                              (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |

-                              (0x1bL << 28));

-            // 41256202580718336

-            AssertWriteVarint(

-                new byte[] {0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49},

-                (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |

-                (0x43UL << 28) | (0x49L << 35) | (0x24UL << 42) | (0x49UL << 49));

-            // 11964378330978735131

-            AssertWriteVarint(

-                new byte[] {0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01},

-                unchecked((ulong)

-                          ((0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |

-                           (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |

-                           (0x05L << 49) | (0x26L << 56) | (0x01L << 63))));

-        }

-

-        /// <summary>

-        /// Parses the given bytes using WriteRawLittleEndian32() and checks

-        /// that the result matches the given value.

-        /// </summary>

-        private static void AssertWriteLittleEndian32(byte[] data, uint value)

-        {

-            MemoryStream rawOutput = new MemoryStream();

-            CodedOutputStream output = new CodedOutputStream(rawOutput);

-            output.WriteRawLittleEndian32(value);

-            output.Flush();

-            Assert.AreEqual(data, rawOutput.ToArray());

-

-            // Try different buffer sizes.

-            for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)

-            {

-                rawOutput = new MemoryStream();

-                output = new CodedOutputStream(rawOutput, bufferSize);

-                output.WriteRawLittleEndian32(value);

-                output.Flush();

-                Assert.AreEqual(data, rawOutput.ToArray());

-            }

-        }

-

-        /// <summary>

-        /// Parses the given bytes using WriteRawLittleEndian64() and checks

-        /// that the result matches the given value.

-        /// </summary>

-        private static void AssertWriteLittleEndian64(byte[] data, ulong value)

-        {

-            MemoryStream rawOutput = new MemoryStream();

-            CodedOutputStream output = new CodedOutputStream(rawOutput);

-            output.WriteRawLittleEndian64(value);

-            output.Flush();

-            Assert.AreEqual(data, rawOutput.ToArray());

-

-            // Try different block sizes.

-            for (int blockSize = 1; blockSize <= 16; blockSize *= 2)

-            {

-                rawOutput = new MemoryStream();

-                output = new CodedOutputStream(rawOutput, blockSize);

-                output.WriteRawLittleEndian64(value);

-                output.Flush();

-                Assert.AreEqual(data, rawOutput.ToArray());

-            }

-        }

-

-        /// <summary>

-        /// Tests writeRawLittleEndian32() and writeRawLittleEndian64().

-        /// </summary>

-        [Test]

-        public void WriteLittleEndian()

-        {

-            AssertWriteLittleEndian32(new byte[] {0x78, 0x56, 0x34, 0x12}, 0x12345678);

-            AssertWriteLittleEndian32(new byte[] {0xf0, 0xde, 0xbc, 0x9a}, 0x9abcdef0);

-

-            AssertWriteLittleEndian64(

-                new byte[] {0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12},

-                0x123456789abcdef0L);

-            AssertWriteLittleEndian64(

-                new byte[] {0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a},

-                0x9abcdef012345678UL);

-        }

-

-        [Test]

-        public void WriteWholeMessage_VaryingBlockSizes()

-        {

-            TestAllTypes message = SampleMessages.CreateFullTestAllTypes();

-

-            byte[] rawBytes = message.ToByteArray();

-

-            // Try different block sizes.

-            for (int blockSize = 1; blockSize < 256; blockSize *= 2)

-            {

-                MemoryStream rawOutput = new MemoryStream();

-                CodedOutputStream output = new CodedOutputStream(rawOutput, blockSize);

-                message.WriteTo(output);

-                output.Flush();

-                Assert.AreEqual(rawBytes, rawOutput.ToArray());

-            }

-        }

-        

-        [Test]

-        public void EncodeZigZag32()

-        {

-            Assert.AreEqual(0u, CodedOutputStream.EncodeZigZag32(0));

-            Assert.AreEqual(1u, CodedOutputStream.EncodeZigZag32(-1));

-            Assert.AreEqual(2u, CodedOutputStream.EncodeZigZag32(1));

-            Assert.AreEqual(3u, CodedOutputStream.EncodeZigZag32(-2));

-            Assert.AreEqual(0x7FFFFFFEu, CodedOutputStream.EncodeZigZag32(0x3FFFFFFF));

-            Assert.AreEqual(0x7FFFFFFFu, CodedOutputStream.EncodeZigZag32(unchecked((int) 0xC0000000)));

-            Assert.AreEqual(0xFFFFFFFEu, CodedOutputStream.EncodeZigZag32(0x7FFFFFFF));

-            Assert.AreEqual(0xFFFFFFFFu, CodedOutputStream.EncodeZigZag32(unchecked((int) 0x80000000)));

-        }

-

-        [Test]

-        public void EncodeZigZag64()

-        {

-            Assert.AreEqual(0u, CodedOutputStream.EncodeZigZag64(0));

-            Assert.AreEqual(1u, CodedOutputStream.EncodeZigZag64(-1));

-            Assert.AreEqual(2u, CodedOutputStream.EncodeZigZag64(1));

-            Assert.AreEqual(3u, CodedOutputStream.EncodeZigZag64(-2));

-            Assert.AreEqual(0x000000007FFFFFFEuL,

-                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x000000003FFFFFFFUL)));

-            Assert.AreEqual(0x000000007FFFFFFFuL,

-                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0xFFFFFFFFC0000000UL)));

-            Assert.AreEqual(0x00000000FFFFFFFEuL,

-                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x000000007FFFFFFFUL)));

-            Assert.AreEqual(0x00000000FFFFFFFFuL,

-                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0xFFFFFFFF80000000UL)));

-            Assert.AreEqual(0xFFFFFFFFFFFFFFFEL,

-                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x7FFFFFFFFFFFFFFFUL)));

-            Assert.AreEqual(0xFFFFFFFFFFFFFFFFL,

-                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x8000000000000000UL)));

-        }

-

-        [Test]

-        public void RoundTripZigZag32()

-        {

-            // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)

-            // were chosen semi-randomly via keyboard bashing.

-            Assert.AreEqual(0, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(0)));

-            Assert.AreEqual(1, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(1)));

-            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(-1)));

-            Assert.AreEqual(14927, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(14927)));

-            Assert.AreEqual(-3612, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(-3612)));

-        }

-

-        [Test]

-        public void RoundTripZigZag64()

-        {

-            Assert.AreEqual(0, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(0)));

-            Assert.AreEqual(1, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(1)));

-            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-1)));

-            Assert.AreEqual(14927, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(14927)));

-            Assert.AreEqual(-3612, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-3612)));

-

-            Assert.AreEqual(856912304801416L,

-                            CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(856912304801416L)));

-            Assert.AreEqual(-75123905439571256L,

-                            CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-75123905439571256L)));

-        }

-

-        [Test]

-        public void TestNegativeEnumNoTag()

-        {

-            Assert.AreEqual(10, CodedOutputStream.ComputeInt32Size(-2));

-            Assert.AreEqual(10, CodedOutputStream.ComputeEnumSize((int) SampleEnum.NegativeValue));

-

-            byte[] bytes = new byte[10];

-            CodedOutputStream output = new CodedOutputStream(bytes);

-            output.WriteEnum((int) SampleEnum.NegativeValue);

-

-            Assert.AreEqual(0, output.SpaceLeft);

-            Assert.AreEqual("FE-FF-FF-FF-FF-FF-FF-FF-FF-01", BitConverter.ToString(bytes));

-        }

-

-        [Test]

-        public void TestCodedInputOutputPosition()

-        {

-            byte[] content = new byte[110];

-            for (int i = 0; i < content.Length; i++)

-                content[i] = (byte)i;

-

-            byte[] child = new byte[120];

-            {

-                MemoryStream ms = new MemoryStream(child);

-                CodedOutputStream cout = new CodedOutputStream(ms, 20);

-                // Field 11: numeric value: 500

-                cout.WriteTag(11, WireFormat.WireType.Varint);

-                Assert.AreEqual(1, cout.Position);

-                cout.WriteInt32(500);

-                Assert.AreEqual(3, cout.Position);

-                //Field 12: length delimited 120 bytes

-                cout.WriteTag(12, WireFormat.WireType.LengthDelimited);

-                Assert.AreEqual(4, cout.Position);

-                cout.WriteBytes(ByteString.CopyFrom(content));

-                Assert.AreEqual(115, cout.Position);

-                // Field 13: fixed numeric value: 501

-                cout.WriteTag(13, WireFormat.WireType.Fixed32);

-                Assert.AreEqual(116, cout.Position);

-                cout.WriteSFixed32(501);

-                Assert.AreEqual(120, cout.Position);

-                cout.Flush();

-            }

-

-            byte[] bytes = new byte[130];

-            {

-                CodedOutputStream cout = new CodedOutputStream(bytes);

-                // Field 1: numeric value: 500

-                cout.WriteTag(1, WireFormat.WireType.Varint);

-                Assert.AreEqual(1, cout.Position);

-                cout.WriteInt32(500);

-                Assert.AreEqual(3, cout.Position);

-                //Field 2: length delimited 120 bytes

-                cout.WriteTag(2, WireFormat.WireType.LengthDelimited);

-                Assert.AreEqual(4, cout.Position);

-                cout.WriteBytes(ByteString.CopyFrom(child));

-                Assert.AreEqual(125, cout.Position);

-                // Field 3: fixed numeric value: 500

-                cout.WriteTag(3, WireFormat.WireType.Fixed32);

-                Assert.AreEqual(126, cout.Position);

-                cout.WriteSFixed32(501);

-                Assert.AreEqual(130, cout.Position);

-                cout.Flush();

-            }

-            // Now test Input stream:

-            {

-                CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50], 0, 0, false);

-                Assert.AreEqual(0, cin.Position);

-                // Field 1:

-                uint tag = cin.ReadTag();

-                Assert.AreEqual(1, tag >> 3);

-                Assert.AreEqual(1, cin.Position);

-                Assert.AreEqual(500, cin.ReadInt32());

-                Assert.AreEqual(3, cin.Position);

-                //Field 2:

-                tag = cin.ReadTag();

-                Assert.AreEqual(2, tag >> 3);

-                Assert.AreEqual(4, cin.Position);

-                int childlen = cin.ReadLength();

-                Assert.AreEqual(120, childlen);

-                Assert.AreEqual(5, cin.Position);

-                int oldlimit = cin.PushLimit((int)childlen);

-                Assert.AreEqual(5, cin.Position);

-                // Now we are reading child message

-                {

-                    // Field 11: numeric value: 500

-                    tag = cin.ReadTag();

-                    Assert.AreEqual(11, tag >> 3);

-                    Assert.AreEqual(6, cin.Position);

-                    Assert.AreEqual(500, cin.ReadInt32());

-                    Assert.AreEqual(8, cin.Position);

-                    //Field 12: length delimited 120 bytes

-                    tag = cin.ReadTag();

-                    Assert.AreEqual(12, tag >> 3);

-                    Assert.AreEqual(9, cin.Position);

-                    ByteString bstr = cin.ReadBytes();

-                    Assert.AreEqual(110, bstr.Length);

-                    Assert.AreEqual((byte) 109, bstr[109]);

-                    Assert.AreEqual(120, cin.Position);

-                    // Field 13: fixed numeric value: 501

-                    tag = cin.ReadTag();

-                    Assert.AreEqual(13, tag >> 3);

-                    // ROK - Previously broken here, this returned 126 failing to account for bufferSizeAfterLimit

-                    Assert.AreEqual(121, cin.Position);

-                    Assert.AreEqual(501, cin.ReadSFixed32());

-                    Assert.AreEqual(125, cin.Position);

-                    Assert.IsTrue(cin.IsAtEnd);

-                }

-                cin.PopLimit(oldlimit);

-                Assert.AreEqual(125, cin.Position);

-                // Field 3: fixed numeric value: 501

-                tag = cin.ReadTag();

-                Assert.AreEqual(3, tag >> 3);

-                Assert.AreEqual(126, cin.Position);

-                Assert.AreEqual(501, cin.ReadSFixed32());

-                Assert.AreEqual(130, cin.Position);

-                Assert.IsTrue(cin.IsAtEnd);

-            }

-        }

-

-        [Test]

-        public void Dispose_DisposesUnderlyingStream()

-        {

-            var memoryStream = new MemoryStream();

-            Assert.IsTrue(memoryStream.CanWrite);

-            using (var cos = new CodedOutputStream(memoryStream))

-            {

-                cos.WriteRawByte(0);

-                Assert.AreEqual(0, memoryStream.Position); // Not flushed yet

-            }

-            Assert.AreEqual(1, memoryStream.ToArray().Length); // Flushed data from CodedOutputStream to MemoryStream

-            Assert.IsFalse(memoryStream.CanWrite); // Disposed

-        }

-

-        [Test]

-        public void Dispose_WithLeaveOpen()

-        {

-            var memoryStream = new MemoryStream();

-            Assert.IsTrue(memoryStream.CanWrite);

-            using (var cos = new CodedOutputStream(memoryStream, true))

-            {

-                cos.WriteRawByte(0);

-                Assert.AreEqual(0, memoryStream.Position); // Not flushed yet

-            }

-            Assert.AreEqual(1, memoryStream.Position); // Flushed data from CodedOutputStream to MemoryStream

-            Assert.IsTrue(memoryStream.CanWrite); // We left the stream open

-        }

-    }

-}
\ No newline at end of file
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Collections/MapFieldTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
deleted file mode 100644
index 9c84590..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
+++ /dev/null
@@ -1,532 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System;
-using System.Collections.Generic;
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-using System.Collections;
-using System.Linq;
-
-namespace Google.Protobuf.Collections
-{
-    /// <summary>
-    /// Tests for MapField which aren't reliant on the encoded format -
-    /// tests for serialization/deserialization are part of GeneratedMessageTest.
-    /// </summary>
-    public class MapFieldTest
-    {
-        [Test]
-        public void Clone_ClonesMessages()
-        {
-            var message = new ForeignMessage { C = 20 };
-            var map = new MapField<string, ForeignMessage> { { "x", message } };
-            var clone = map.Clone();
-            map["x"].C = 30;
-            Assert.AreEqual(20, clone["x"].C);
-        }
-
-        [Test]
-        public void NullValuesProhibited()
-        {
-            TestNullValues<int?>(0);
-            TestNullValues("");
-            TestNullValues(new TestAllTypes());
-        }
-
-        private void TestNullValues<T>(T nonNullValue)
-        {
-            var map = new MapField<int, T>();
-            var nullValue = (T) (object) null;
-            Assert.Throws<ArgumentNullException>(() => map.Add(0, nullValue));
-            Assert.Throws<ArgumentNullException>(() => map[0] = nullValue);
-            map.Add(1, nonNullValue);
-            map[1] = nonNullValue;
-        }
-
-        [Test]
-        public void Add_ForbidsNullKeys()
-        {
-            var map = new MapField<string, ForeignMessage>();
-            Assert.Throws<ArgumentNullException>(() => map.Add(null, new ForeignMessage()));
-        }
-
-        [Test]
-        public void Indexer_ForbidsNullKeys()
-        {
-            var map = new MapField<string, ForeignMessage>();
-            Assert.Throws<ArgumentNullException>(() => map[null] = new ForeignMessage());
-        }
-        
-        [Test]
-        public void AddPreservesInsertionOrder()
-        {
-            var map = new MapField<string, string>();
-            map.Add("a", "v1");
-            map.Add("b", "v2");
-            map.Add("c", "v3");
-            map.Remove("b");
-            map.Add("d", "v4");
-            CollectionAssert.AreEqual(new[] { "a", "c", "d" }, map.Keys);
-            CollectionAssert.AreEqual(new[] { "v1", "v3", "v4" }, map.Values);
-        }
-
-        [Test]
-        public void EqualityIsOrderInsensitive()
-        {
-            var map1 = new MapField<string, string>();
-            map1.Add("a", "v1");
-            map1.Add("b", "v2");
-
-            var map2 = new MapField<string, string>();
-            map2.Add("b", "v2");
-            map2.Add("a", "v1");
-
-            EqualityTester.AssertEquality(map1, map2);
-        }
-
-        [Test]
-        public void EqualityIsKeySensitive()
-        {
-            var map1 = new MapField<string, string>();
-            map1.Add("first key", "v1");
-            map1.Add("second key", "v2");
-
-            var map2 = new MapField<string, string>();
-            map2.Add("third key", "v1");
-            map2.Add("fourth key", "v2");
-
-            EqualityTester.AssertInequality(map1, map2);
-        }
-
-        [Test]
-        public void Equality_Simple()
-        {
-            var map = new MapField<string, string>();
-            EqualityTester.AssertEquality(map, map);
-            EqualityTester.AssertInequality(map, null);
-            Assert.IsFalse(map.Equals(new object()));
-        }
-
-        [Test]
-        public void EqualityIsValueSensitive()
-        {
-            // Note: Without some care, it's a little easier than one might
-            // hope to see hash collisions, but only in some environments...
-            var map1 = new MapField<string, string>();
-            map1.Add("a", "first value");
-            map1.Add("b", "second value");
-
-            var map2 = new MapField<string, string>();
-            map2.Add("a", "third value");
-            map2.Add("b", "fourth value");
-
-            EqualityTester.AssertInequality(map1, map2);
-        }
-
-        [Test]
-        public void Add_Dictionary()
-        {
-            var map1 = new MapField<string, string>
-            {
-                { "x", "y" },
-                { "a", "b" }
-            };
-            var map2 = new MapField<string, string>
-            {
-                { "before", "" },
-                map1,
-                { "after", "" }
-            };
-            var expected = new MapField<string, string>
-            {
-                { "before", "" },
-                { "x", "y" },
-                { "a", "b" },
-                { "after", "" }
-            };
-            Assert.AreEqual(expected, map2);
-            CollectionAssert.AreEqual(new[] { "before", "x", "a", "after" }, map2.Keys);
-        }
-
-        // General IDictionary<TKey, TValue> behavior tests
-        [Test]
-        public void Add_KeyAlreadyExists()
-        {
-            var map = new MapField<string, string>();
-            map.Add("foo", "bar");
-            Assert.Throws<ArgumentException>(() => map.Add("foo", "baz"));
-        }
-
-        [Test]
-        public void Add_Pair()
-        {
-            var map = new MapField<string, string>();
-            ICollection<KeyValuePair<string, string>> collection = map;
-            collection.Add(NewKeyValuePair("x", "y"));
-            Assert.AreEqual("y", map["x"]);
-            Assert.Throws<ArgumentException>(() => collection.Add(NewKeyValuePair("x", "z")));
-        }
-
-        [Test]
-        public void Contains_Pair()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            ICollection<KeyValuePair<string, string>> collection = map;
-            Assert.IsTrue(collection.Contains(NewKeyValuePair("x", "y")));
-            Assert.IsFalse(collection.Contains(NewKeyValuePair("x", "z")));
-            Assert.IsFalse(collection.Contains(NewKeyValuePair("z", "y")));
-        }
-
-        [Test]
-        public void Remove_Key()
-        {
-            var map = new MapField<string, string>();
-            map.Add("foo", "bar");
-            Assert.AreEqual(1, map.Count);
-            Assert.IsFalse(map.Remove("missing"));
-            Assert.AreEqual(1, map.Count);
-            Assert.IsTrue(map.Remove("foo"));
-            Assert.AreEqual(0, map.Count);
-            Assert.Throws<ArgumentNullException>(() => map.Remove(null));
-        }
-
-        [Test]
-        public void Remove_Pair()
-        {
-            var map = new MapField<string, string>();
-            map.Add("foo", "bar");
-            ICollection<KeyValuePair<string, string>> collection = map;
-            Assert.AreEqual(1, map.Count);
-            Assert.IsFalse(collection.Remove(NewKeyValuePair("wrong key", "bar")));
-            Assert.AreEqual(1, map.Count);
-            Assert.IsFalse(collection.Remove(NewKeyValuePair("foo", "wrong value")));
-            Assert.AreEqual(1, map.Count);
-            Assert.IsTrue(collection.Remove(NewKeyValuePair("foo", "bar")));
-            Assert.AreEqual(0, map.Count);
-            Assert.Throws<ArgumentException>(() => collection.Remove(new KeyValuePair<string, string>(null, "")));
-        }
-
-        [Test]
-        public void CopyTo_Pair()
-        {
-            var map = new MapField<string, string>();
-            map.Add("foo", "bar");
-            ICollection<KeyValuePair<string, string>> collection = map;
-            KeyValuePair<string, string>[] array = new KeyValuePair<string, string>[3];
-            collection.CopyTo(array, 1);
-            Assert.AreEqual(NewKeyValuePair("foo", "bar"), array[1]);
-        }
-
-        [Test]
-        public void Clear()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            Assert.AreEqual(1, map.Count);
-            map.Clear();
-            Assert.AreEqual(0, map.Count);
-            map.Add("x", "y");
-            Assert.AreEqual(1, map.Count);
-        }
-
-        [Test]
-        public void Indexer_Get()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            Assert.AreEqual("y", map["x"]);
-            Assert.Throws<KeyNotFoundException>(() => { var ignored = map["z"]; });
-        }
-
-        [Test]
-        public void Indexer_Set()
-        {
-            var map = new MapField<string, string>();
-            map["x"] = "y";
-            Assert.AreEqual("y", map["x"]);
-            map["x"] = "z"; // This won't throw, unlike Add.
-            Assert.AreEqual("z", map["x"]);
-        }
-
-        [Test]
-        public void GetEnumerator_NonGeneric()
-        {
-            IEnumerable map = new MapField<string, string> { { "x", "y" } };
-            CollectionAssert.AreEqual(new[] { new KeyValuePair<string, string>("x", "y") },
-                map.Cast<object>().ToList());
-        }
-
-        // Test for the explicitly-implemented non-generic IDictionary interface
-        [Test]
-        public void IDictionary_GetEnumerator()
-        {
-            IDictionary map = new MapField<string, string> { { "x", "y" } };
-            var enumerator = map.GetEnumerator();
-
-            // Commented assertions show an ideal situation - it looks like
-            // the LinkedList enumerator doesn't throw when you ask for the current entry
-            // at an inappropriate time; fixing this would be more work than it's worth.
-            // Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
-            Assert.IsTrue(enumerator.MoveNext());
-            Assert.AreEqual("x", enumerator.Key);
-            Assert.AreEqual("y", enumerator.Value);
-            Assert.AreEqual(new DictionaryEntry("x", "y"), enumerator.Current);
-            Assert.AreEqual(new DictionaryEntry("x", "y"), enumerator.Entry);
-            Assert.IsFalse(enumerator.MoveNext());
-            // Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
-            enumerator.Reset();
-            // Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
-            Assert.IsTrue(enumerator.MoveNext());
-            Assert.AreEqual("x", enumerator.Key); // Assume the rest are okay
-        }
-
-        [Test]
-        public void IDictionary_Add()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            IDictionary dictionary = map;
-            dictionary.Add("a", "b");
-            Assert.AreEqual("b", map["a"]);
-            Assert.Throws<ArgumentException>(() => dictionary.Add("a", "duplicate"));
-            Assert.Throws<InvalidCastException>(() => dictionary.Add(new object(), "key is bad"));
-            Assert.Throws<InvalidCastException>(() => dictionary.Add("value is bad", new object()));
-        }
-
-        [Test]
-        public void IDictionary_Contains()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            IDictionary dictionary = map;
-
-            Assert.IsFalse(dictionary.Contains("a"));
-            Assert.IsFalse(dictionary.Contains(5));
-            // Surprising, but IDictionary.Contains is only about keys.
-            Assert.IsFalse(dictionary.Contains(new DictionaryEntry("x", "y")));
-            Assert.IsTrue(dictionary.Contains("x"));
-        }
-
-        [Test]
-        public void IDictionary_Remove()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            IDictionary dictionary = map;
-            dictionary.Remove("a");
-            Assert.AreEqual(1, dictionary.Count);
-            dictionary.Remove(5);
-            Assert.AreEqual(1, dictionary.Count);
-            dictionary.Remove(new DictionaryEntry("x", "y"));
-            Assert.AreEqual(1, dictionary.Count);
-            dictionary.Remove("x");
-            Assert.AreEqual(0, dictionary.Count);
-            Assert.Throws<ArgumentNullException>(() => dictionary.Remove(null));
-        }
-
-        [Test]
-        public void IDictionary_CopyTo()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            IDictionary dictionary = map;
-            var array = new DictionaryEntry[3];
-            dictionary.CopyTo(array, 1);
-            CollectionAssert.AreEqual(new[] { default(DictionaryEntry), new DictionaryEntry("x", "y"), default(DictionaryEntry) },
-                array);
-            var objectArray = new object[3];
-            dictionary.CopyTo(objectArray, 1);
-            CollectionAssert.AreEqual(new object[] { null, new DictionaryEntry("x", "y"), null },
-                objectArray);
-        }
-
-        [Test]
-        public void IDictionary_IsFixedSize()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            IDictionary dictionary = map;
-            Assert.IsFalse(dictionary.IsFixedSize);
-        }
-
-        [Test]
-        public void IDictionary_Keys()
-        {
-            IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
-            CollectionAssert.AreEqual(new[] { "x" }, dictionary.Keys);
-        }
-
-        [Test]
-        public void IDictionary_Values()
-        {
-            IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
-            CollectionAssert.AreEqual(new[] { "y" }, dictionary.Values);
-        }
-
-        [Test]
-        public void IDictionary_IsSynchronized()
-        {
-            IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
-            Assert.IsFalse(dictionary.IsSynchronized);
-        }
-
-        [Test]
-        public void IDictionary_SyncRoot()
-        {
-            IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
-            Assert.AreSame(dictionary, dictionary.SyncRoot);
-        }
-
-        [Test]
-        public void IDictionary_Indexer_Get()
-        {
-            IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
-            Assert.AreEqual("y", dictionary["x"]);
-            Assert.IsNull(dictionary["a"]);
-            Assert.IsNull(dictionary[5]);
-            Assert.Throws<ArgumentNullException>(() => dictionary[null].GetHashCode());
-        }
-
-        [Test]
-        public void IDictionary_Indexer_Set()
-        {
-            var map = new MapField<string, string> { { "x", "y" } };
-            IDictionary dictionary = map;
-            map["a"] = "b";
-            Assert.AreEqual("b", map["a"]);
-            map["a"] = "c";
-            Assert.AreEqual("c", map["a"]);
-            Assert.Throws<InvalidCastException>(() => dictionary[5] = "x");
-            Assert.Throws<InvalidCastException>(() => dictionary["x"] = 5);
-            Assert.Throws<ArgumentNullException>(() => dictionary[null] = "z");
-            Assert.Throws<ArgumentNullException>(() => dictionary["x"] = null);
-        }
-
-        [Test]
-        public void KeysReturnsLiveView()
-        {
-            var map = new MapField<string, string>();
-            var keys = map.Keys;
-            CollectionAssert.AreEqual(new string[0], keys);
-            map["foo"] = "bar";
-            map["x"] = "y";
-            CollectionAssert.AreEqual(new[] { "foo", "x" }, keys);
-        }
-
-        [Test]
-        public void ValuesReturnsLiveView()
-        {
-            var map = new MapField<string, string>();
-            var values = map.Values;
-            CollectionAssert.AreEqual(new string[0], values);
-            map["foo"] = "bar";
-            map["x"] = "y";
-            CollectionAssert.AreEqual(new[] { "bar", "y" }, values);
-        }
-
-        // Just test keys - we know the implementation is the same for values
-        [Test]
-        public void ViewsAreReadOnly()
-        {
-            var map = new MapField<string, string>();
-            var keys = map.Keys;
-            Assert.IsTrue(keys.IsReadOnly);
-            Assert.Throws<NotSupportedException>(() => keys.Clear());
-            Assert.Throws<NotSupportedException>(() => keys.Remove("a"));
-            Assert.Throws<NotSupportedException>(() => keys.Add("a"));
-        }
-
-        // Just test keys - we know the implementation is the same for values
-        [Test]
-        public void ViewCopyTo()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            var keys = map.Keys;
-            var array = new string[4];
-            Assert.Throws<ArgumentException>(() => keys.CopyTo(array, 3));
-            Assert.Throws<ArgumentOutOfRangeException>(() => keys.CopyTo(array, -1));
-            keys.CopyTo(array, 1);
-            CollectionAssert.AreEqual(new[] { null, "foo", "x", null }, array);
-        }
-        
-        // Just test keys - we know the implementation is the same for values
-        [Test]
-        public void NonGenericViewCopyTo()
-        {
-            IDictionary map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            ICollection keys = map.Keys;
-            // Note the use of the Array type here rather than string[]
-            Array array = new string[4];
-            Assert.Throws<ArgumentException>(() => keys.CopyTo(array, 3));
-            Assert.Throws<ArgumentOutOfRangeException>(() => keys.CopyTo(array, -1));
-            keys.CopyTo(array, 1);
-            CollectionAssert.AreEqual(new[] { null, "foo", "x", null }, array);
-        }
-
-        [Test]
-        public void KeysContains()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            var keys = map.Keys;
-            Assert.IsTrue(keys.Contains("foo"));
-            Assert.IsFalse(keys.Contains("bar")); // It's a value!
-            Assert.IsFalse(keys.Contains("1"));
-            // Keys can't be null, so we should prevent contains check
-            Assert.Throws<ArgumentNullException>(() => keys.Contains(null));
-        }
-
-        [Test]
-        public void ValuesContains()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            var values = map.Values;
-            Assert.IsTrue(values.Contains("bar"));
-            Assert.IsFalse(values.Contains("foo")); // It's a key!
-            Assert.IsFalse(values.Contains("1"));
-            // Values can be null, so this makes sense
-            Assert.IsFalse(values.Contains(null));
-        }
-
-        [Test]
-        public void ToString_StringToString()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            Assert.AreEqual("{ \"foo\": \"bar\", \"x\": \"y\" }", map.ToString());
-        }
-
-        [Test]
-        public void ToString_UnsupportedKeyType()
-        {
-            var map = new MapField<byte, string> { { 10, "foo" } };
-            Assert.Throws<ArgumentException>(() => map.ToString());
-        }
-
-        private static KeyValuePair<TKey, TValue> NewKeyValuePair<TKey, TValue>(TKey key, TValue value)
-        {
-            return new KeyValuePair<TKey, TValue>(key, value);
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
deleted file mode 100644
index 6852f75..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
+++ /dev/null
@@ -1,746 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-using Google.Protobuf.TestProtos;
-using Google.Protobuf.WellKnownTypes;
-using NUnit.Framework;
-
-namespace Google.Protobuf.Collections
-{
-    public class RepeatedFieldTest
-    {
-        [Test]
-        public void NullValuesRejected()
-        {
-            var list = new RepeatedField<string>();
-            Assert.Throws<ArgumentNullException>(() => list.Add((string)null));
-            Assert.Throws<ArgumentNullException>(() => list.Add((IEnumerable<string>)null));
-            Assert.Throws<ArgumentNullException>(() => list.Add((RepeatedField<string>)null));
-            Assert.Throws<ArgumentNullException>(() => list.Contains(null));
-            Assert.Throws<ArgumentNullException>(() => list.IndexOf(null));
-        }
-
-        [Test]
-        public void Add_SingleItem()
-        {
-            var list = new RepeatedField<string>();
-            list.Add("foo");
-            Assert.AreEqual(1, list.Count);
-            Assert.AreEqual("foo", list[0]);
-        }
-
-        [Test]
-        public void Add_Sequence()
-        {
-            var list = new RepeatedField<string>();
-            list.Add(new[] { "foo", "bar" });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual("foo", list[0]);
-            Assert.AreEqual("bar", list[1]);
-        }
-
-        [Test]
-        public void AddRange_SlowPath()
-        {
-            var list = new RepeatedField<string>();
-            list.AddRange(new[] { "foo", "bar" }.Select(x => x));
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual("foo", list[0]);
-            Assert.AreEqual("bar", list[1]);
-        }
-
-        [Test]
-        public void AddRange_SlowPath_NullsProhibited_ReferenceType()
-        {
-            var list = new RepeatedField<string>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new[] { "foo", null }.Select(x => x)));
-        }
-
-        [Test]
-        public void AddRange_SlowPath_NullsProhibited_NullableValueType()
-        {
-            var list = new RepeatedField<int?>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new[] { 20, (int?)null }.Select(x => x)));
-        }
-
-        [Test]
-        public void AddRange_Optimized_NonNullableValueType()
-        {
-            var list = new RepeatedField<int>();
-            list.AddRange(new List<int> { 20, 30 });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual(20, list[0]);
-            Assert.AreEqual(30, list[1]);
-        }
-
-        [Test]
-        public void AddRange_Optimized_ReferenceType()
-        {
-            var list = new RepeatedField<string>();
-            list.AddRange(new List<string> { "foo", "bar" });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual("foo", list[0]);
-            Assert.AreEqual("bar", list[1]);
-        }
-
-        [Test]
-        public void AddRange_Optimized_NullableValueType()
-        {
-            var list = new RepeatedField<int?>();
-            list.AddRange(new List<int?> { 20, 30 });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual((int?) 20, list[0]);
-            Assert.AreEqual((int?) 30, list[1]);
-        }
-
-        [Test]
-        public void AddRange_Optimized_NullsProhibited_ReferenceType()
-        {
-            // We don't just trust that a collection with a nullable element type doesn't contain nulls
-            var list = new RepeatedField<string>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new List<string> { "foo", null }));
-        }
-
-        [Test]
-        public void AddRange_Optimized_NullsProhibited_NullableValueType()
-        {
-            // We don't just trust that a collection with a nullable element type doesn't contain nulls
-            var list = new RepeatedField<int?>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new List<int?> { 20, null }));
-        }
-
-        [Test]
-        public void AddRange_AlreadyNotEmpty()
-        {
-            var list = new RepeatedField<int> { 1, 2, 3 };
-            list.AddRange(new List<int> { 4, 5, 6 });
-            CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, list);
-        }
-
-        [Test]
-        public void AddRange_RepeatedField()
-        {
-            var list = new RepeatedField<string> { "original" };
-            list.AddRange(new RepeatedField<string> { "foo", "bar" });
-            Assert.AreEqual(3, list.Count);
-            Assert.AreEqual("original", list[0]);
-            Assert.AreEqual("foo", list[1]);
-            Assert.AreEqual("bar", list[2]);
-        }
-
-        [Test]
-        public void RemoveAt_Valid()
-        {
-            var list = new RepeatedField<string> { "first", "second", "third" };
-            list.RemoveAt(1);
-            CollectionAssert.AreEqual(new[] { "first", "third" }, list);
-            // Just check that these don't throw...
-            list.RemoveAt(list.Count - 1); // Now the count will be 1...
-            list.RemoveAt(0);
-            Assert.AreEqual(0, list.Count);
-        }
-
-        [Test]
-        public void RemoveAt_Invalid()
-        {
-            var list = new RepeatedField<string> { "first", "second", "third" };
-            Assert.Throws<ArgumentOutOfRangeException>(() => list.RemoveAt(-1));
-            Assert.Throws<ArgumentOutOfRangeException>(() => list.RemoveAt(3));
-        }
-
-        [Test]
-        public void Insert_Valid()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            list.Insert(1, "middle");
-            CollectionAssert.AreEqual(new[] { "first", "middle", "second" }, list);
-            list.Insert(3, "end");
-            CollectionAssert.AreEqual(new[] { "first", "middle", "second", "end" }, list);
-            list.Insert(0, "start");
-            CollectionAssert.AreEqual(new[] { "start", "first", "middle", "second", "end" }, list);
-        }
-
-        [Test]
-        public void Insert_Invalid()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            Assert.Throws<ArgumentOutOfRangeException>(() => list.Insert(-1, "foo"));
-            Assert.Throws<ArgumentOutOfRangeException>(() => list.Insert(3, "foo"));
-            Assert.Throws<ArgumentNullException>(() => list.Insert(0, null));
-        }
-
-        [Test]
-        public void Equals_RepeatedField()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            Assert.IsFalse(list.Equals((RepeatedField<string>) null));
-            Assert.IsTrue(list.Equals(list));
-            Assert.IsFalse(list.Equals(new RepeatedField<string> { "first", "third" }));
-            Assert.IsFalse(list.Equals(new RepeatedField<string> { "first" }));
-            Assert.IsTrue(list.Equals(new RepeatedField<string> { "first", "second" }));
-        }
-
-        [Test]
-        public void Equals_Object()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            Assert.IsFalse(list.Equals((object) null));
-            Assert.IsTrue(list.Equals((object) list));
-            Assert.IsFalse(list.Equals((object) new RepeatedField<string> { "first", "third" }));
-            Assert.IsFalse(list.Equals((object) new RepeatedField<string> { "first" }));
-            Assert.IsTrue(list.Equals((object) new RepeatedField<string> { "first", "second" }));
-            Assert.IsFalse(list.Equals(new object()));
-        }
-
-        [Test]
-        public void GetEnumerator_GenericInterface()
-        {
-            IEnumerable<string> list = new RepeatedField<string> { "first", "second" };
-            // Select gets rid of the optimizations in ToList...
-            CollectionAssert.AreEqual(new[] { "first", "second" }, list.Select(x => x).ToList());
-        }
-
-        [Test]
-        public void GetEnumerator_NonGenericInterface()
-        {
-            IEnumerable list = new RepeatedField<string> { "first", "second" };
-            CollectionAssert.AreEqual(new[] { "first", "second" }, list.Cast<object>().ToList());
-        }
-
-        [Test]
-        public void CopyTo()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            string[] stringArray = new string[4];
-            list.CopyTo(stringArray, 1);
-            CollectionAssert.AreEqual(new[] { null, "first", "second", null }, stringArray);
-        }
-
-        [Test]
-        public void Indexer_Get()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            Assert.AreEqual("first", list[0]);
-            Assert.AreEqual("second", list[1]);
-            Assert.Throws<ArgumentOutOfRangeException>(() => list[-1].GetHashCode());
-            Assert.Throws<ArgumentOutOfRangeException>(() => list[2].GetHashCode());
-        }
-
-        [Test]
-        public void Indexer_Set()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            list[0] = "changed";
-            Assert.AreEqual("changed", list[0]);
-            Assert.Throws<ArgumentNullException>(() => list[0] = null);
-            Assert.Throws<ArgumentOutOfRangeException>(() => list[-1] = "bad");
-            Assert.Throws<ArgumentOutOfRangeException>(() => list[2] = "bad");
-        }
-
-        [Test]
-        public void Clone_ReturnsMutable()
-        {
-            var list = new RepeatedField<int> { 0 };
-            var clone = list.Clone();
-            clone[0] = 1;
-        }
-
-        [Test]
-        public void Enumerator()
-        {
-            var list = new RepeatedField<string> { "first", "second" };
-            using (var enumerator = list.GetEnumerator())
-            {
-                Assert.IsTrue(enumerator.MoveNext());
-                Assert.AreEqual("first", enumerator.Current);
-                Assert.IsTrue(enumerator.MoveNext());
-                Assert.AreEqual("second", enumerator.Current);
-                Assert.IsFalse(enumerator.MoveNext());
-                Assert.IsFalse(enumerator.MoveNext());
-            }
-        }
-
-        [Test]
-        public void AddEntriesFrom_PackedInt32()
-        {
-            uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            var length = CodedOutputStream.ComputeInt32Size(10)
-                + CodedOutputStream.ComputeInt32Size(999)
-                + CodedOutputStream.ComputeInt32Size(-1000);
-            output.WriteTag(packedTag);
-            output.WriteRawVarint32((uint) length);
-            output.WriteInt32(10);
-            output.WriteInt32(999);
-            output.WriteInt32(-1000);
-            output.Flush();
-            stream.Position = 0;
-
-            // Deliberately "expecting" a non-packed tag, but we detect that the data is
-            // actually packed.
-            uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var field = new RepeatedField<int>();
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(packedTag);
-            field.AddEntriesFrom(input, FieldCodec.ForInt32(nonPackedTag));
-            CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void AddEntriesFrom_NonPackedInt32()
-        {
-            uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            output.WriteTag(nonPackedTag);
-            output.WriteInt32(10);
-            output.WriteTag(nonPackedTag);
-            output.WriteInt32(999);
-            output.WriteTag(nonPackedTag);
-            output.WriteInt32(-1000); // Just for variety...
-            output.Flush();
-            stream.Position = 0;
-
-            // Deliberately "expecting" a packed tag, but we detect that the data is
-            // actually not packed.
-            uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var field = new RepeatedField<int>();
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(nonPackedTag);
-            field.AddEntriesFrom(input, FieldCodec.ForInt32(packedTag));
-            CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void AddEntriesFrom_String()
-        {
-            uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            output.WriteTag(tag);
-            output.WriteString("Foo");
-            output.WriteTag(tag);
-            output.WriteString("");
-            output.WriteTag(tag);
-            output.WriteString("Bar");
-            output.Flush();
-            stream.Position = 0;
-
-            var field = new RepeatedField<string>();
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(tag);
-            field.AddEntriesFrom(input, FieldCodec.ForString(tag));
-            CollectionAssert.AreEqual(new[] { "Foo", "", "Bar" }, field);
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void AddEntriesFrom_Message()
-        {
-            var message1 = new ForeignMessage { C = 2000 };
-            var message2 = new ForeignMessage { C = -250 };
-
-            uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            output.WriteTag(tag);
-            output.WriteMessage(message1);
-            output.WriteTag(tag);
-            output.WriteMessage(message2);
-            output.Flush();
-            stream.Position = 0;
-
-            var field = new RepeatedField<ForeignMessage>();
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(tag);
-            field.AddEntriesFrom(input, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
-            CollectionAssert.AreEqual(new[] { message1, message2}, field);
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void WriteTo_PackedInt32()
-        {
-            uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var field = new RepeatedField<int> { 10, 1000, 1000000 };
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            field.WriteTo(output, FieldCodec.ForInt32(tag));
-            output.Flush();
-            stream.Position = 0;
-
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(tag);
-            var length = input.ReadLength();
-            Assert.AreEqual(10, input.ReadInt32());
-            Assert.AreEqual(1000, input.ReadInt32());
-            Assert.AreEqual(1000000, input.ReadInt32());
-            Assert.IsTrue(input.IsAtEnd);
-            Assert.AreEqual(1 + CodedOutputStream.ComputeLengthSize(length) + length, stream.Length);
-        }
-
-        [Test]
-        public void WriteTo_NonPackedInt32()
-        {
-            uint tag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
-            var field = new RepeatedField<int> { 10, 1000, 1000000};
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            field.WriteTo(output, FieldCodec.ForInt32(tag));
-            output.Flush();
-            stream.Position = 0;
-
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(tag);
-            Assert.AreEqual(10, input.ReadInt32());
-            input.AssertNextTag(tag);
-            Assert.AreEqual(1000, input.ReadInt32());
-            input.AssertNextTag(tag);
-            Assert.AreEqual(1000000, input.ReadInt32());
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void WriteTo_String()
-        {
-            uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var field = new RepeatedField<string> { "Foo", "", "Bar" };
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            field.WriteTo(output, FieldCodec.ForString(tag));
-            output.Flush();
-            stream.Position = 0;
-
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(tag);
-            Assert.AreEqual("Foo", input.ReadString());
-            input.AssertNextTag(tag);
-            Assert.AreEqual("", input.ReadString());
-            input.AssertNextTag(tag);
-            Assert.AreEqual("Bar", input.ReadString());
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void WriteTo_Message()
-        {
-            var message1 = new ForeignMessage { C = 20 };
-            var message2 = new ForeignMessage { C = 25 };
-            uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
-            var field = new RepeatedField<ForeignMessage> { message1, message2 };
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            field.WriteTo(output, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
-            output.Flush();
-            stream.Position = 0;
-
-            var input = new CodedInputStream(stream);
-            input.AssertNextTag(tag);
-            Assert.AreEqual(message1, input.ReadMessage(ForeignMessage.Parser));
-            input.AssertNextTag(tag);
-            Assert.AreEqual(message2, input.ReadMessage(ForeignMessage.Parser));
-            Assert.IsTrue(input.IsAtEnd);
-        }
-
-        [Test]
-        public void CalculateSize_VariableSizeNonPacked()
-        {
-            var list = new RepeatedField<int> { 1, 500, 1 };
-            var tag = WireFormat.MakeTag(1, WireFormat.WireType.Varint);
-            // 2 bytes for the first entry, 3 bytes for the second, 2 bytes for the third
-            Assert.AreEqual(7, list.CalculateSize(FieldCodec.ForInt32(tag)));
-        }
-
-        [Test]
-        public void CalculateSize_FixedSizeNonPacked()
-        {
-            var list = new RepeatedField<int> { 1, 500, 1 };
-            var tag = WireFormat.MakeTag(1, WireFormat.WireType.Fixed32);
-            // 5 bytes for the each entry
-            Assert.AreEqual(15, list.CalculateSize(FieldCodec.ForSFixed32(tag)));
-        }
-
-        [Test]
-        public void CalculateSize_VariableSizePacked()
-        {
-            var list = new RepeatedField<int> { 1, 500, 1};
-            var tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
-            // 1 byte for the tag, 1 byte for the length,
-            // 1 byte for the first entry, 2 bytes for the second, 1 byte for the third
-            Assert.AreEqual(6, list.CalculateSize(FieldCodec.ForInt32(tag)));
-        }
-
-        [Test]
-        public void CalculateSize_FixedSizePacked()
-        {
-            var list = new RepeatedField<int> { 1, 500, 1 };
-            var tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
-            // 1 byte for the tag, 1 byte for the length, 4 bytes per entry
-            Assert.AreEqual(14, list.CalculateSize(FieldCodec.ForSFixed32(tag)));
-        }
-
-        [Test]
-        public void TestNegativeEnumArray()
-        {
-            int arraySize = 1 + 1 + (11 * 5);
-            int msgSize = arraySize;
-            byte[] bytes = new byte[msgSize];
-            CodedOutputStream output = new CodedOutputStream(bytes);
-            uint tag = WireFormat.MakeTag(8, WireFormat.WireType.Varint);
-            for (int i = 0; i >= -5; i--)
-            {
-                output.WriteTag(tag);
-                output.WriteEnum(i);
-            }
-
-            Assert.AreEqual(0, output.SpaceLeft);
-
-            CodedInputStream input = new CodedInputStream(bytes);
-            tag = input.ReadTag();
-
-            RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
-            values.AddEntriesFrom(input, FieldCodec.ForEnum(tag, x => (int)x, x => (SampleEnum)x));
-
-            Assert.AreEqual(6, values.Count);
-            Assert.AreEqual(SampleEnum.None, values[0]);
-            Assert.AreEqual(((SampleEnum)(-1)), values[1]);
-            Assert.AreEqual(SampleEnum.NegativeValue, values[2]);
-            Assert.AreEqual(((SampleEnum)(-3)), values[3]);
-            Assert.AreEqual(((SampleEnum)(-4)), values[4]);
-            Assert.AreEqual(((SampleEnum)(-5)), values[5]);
-        }
-
-
-        [Test]
-        public void TestNegativeEnumPackedArray()
-        {
-            int arraySize = 1 + (10 * 5);
-            int msgSize = 1 + 1 + arraySize;
-            byte[] bytes = new byte[msgSize];
-            CodedOutputStream output = new CodedOutputStream(bytes);
-            // Length-delimited to show we want the packed representation
-            uint tag = WireFormat.MakeTag(8, WireFormat.WireType.LengthDelimited);
-            output.WriteTag(tag);
-            int size = 0;
-            for (int i = 0; i >= -5; i--)
-            {
-                size += CodedOutputStream.ComputeEnumSize(i);
-            }
-            output.WriteRawVarint32((uint)size);
-            for (int i = 0; i >= -5; i--)
-            {
-                output.WriteEnum(i);
-            }
-            Assert.AreEqual(0, output.SpaceLeft);
-
-            CodedInputStream input = new CodedInputStream(bytes);
-            tag = input.ReadTag();
-
-            RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
-            values.AddEntriesFrom(input, FieldCodec.ForEnum(tag, x => (int)x, x => (SampleEnum)x));
-
-            Assert.AreEqual(6, values.Count);
-            Assert.AreEqual(SampleEnum.None, values[0]);
-            Assert.AreEqual(((SampleEnum)(-1)), values[1]);
-            Assert.AreEqual(SampleEnum.NegativeValue, values[2]);
-            Assert.AreEqual(((SampleEnum)(-3)), values[3]);
-            Assert.AreEqual(((SampleEnum)(-4)), values[4]);
-            Assert.AreEqual(((SampleEnum)(-5)), values[5]);
-        }
-
-        // Fairly perfunctory tests for the non-generic IList implementation
-        [Test]
-        public void IList_Indexer()
-        {
-            var field = new RepeatedField<string> { "first", "second" };
-            IList list = field;
-            Assert.AreEqual("first", list[0]);
-            list[1] = "changed";
-            Assert.AreEqual("changed", field[1]);
-        }
-
-        [Test]
-        public void IList_Contains()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            Assert.IsTrue(list.Contains("second"));
-            Assert.IsFalse(list.Contains("third"));
-            Assert.IsFalse(list.Contains(new object()));
-        }
-
-        [Test]
-        public void IList_Add()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            list.Add("third");
-            CollectionAssert.AreEqual(new[] { "first", "second", "third" }, list);
-        }
-
-        [Test]
-        public void IList_Remove()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            list.Remove("third"); // No-op, no exception
-            list.Remove(new object()); // No-op, no exception
-            list.Remove("first");
-            CollectionAssert.AreEqual(new[] { "second" }, list);
-        }
-
-        [Test]
-        public void IList_IsFixedSize()
-        {
-            var field = new RepeatedField<string> { "first", "second" };
-            IList list = field;
-            Assert.IsFalse(list.IsFixedSize);
-        }
-
-        [Test]
-        public void IList_IndexOf()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            Assert.AreEqual(1, list.IndexOf("second"));
-            Assert.AreEqual(-1, list.IndexOf("third"));
-            Assert.AreEqual(-1, list.IndexOf(new object()));
-        }
-
-        [Test]
-        public void IList_SyncRoot()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            Assert.AreSame(list, list.SyncRoot);
-        }
-
-        [Test]
-        public void IList_CopyTo()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            string[] stringArray = new string[4];
-            list.CopyTo(stringArray, 1);
-            CollectionAssert.AreEqual(new[] { null, "first",  "second", null }, stringArray);
-
-            object[] objectArray = new object[4];
-            list.CopyTo(objectArray, 1);
-            CollectionAssert.AreEqual(new[] { null, "first", "second", null }, objectArray);
-
-            Assert.Throws<ArrayTypeMismatchException>(() => list.CopyTo(new StringBuilder[4], 1));
-            Assert.Throws<ArrayTypeMismatchException>(() => list.CopyTo(new int[4], 1));
-        }
-
-        [Test]
-        public void IList_IsSynchronized()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            Assert.IsFalse(list.IsSynchronized);
-        }
-
-        [Test]
-        public void IList_Insert()
-        {
-            IList list = new RepeatedField<string> { "first", "second" };
-            list.Insert(1, "middle");
-            CollectionAssert.AreEqual(new[] { "first", "middle", "second" }, list);
-        }
-
-        [Test]
-        public void ToString_Integers()
-        {
-            var list = new RepeatedField<int> { 5, 10, 20 };
-            var text = list.ToString();
-            Assert.AreEqual("[ 5, 10, 20 ]", text);
-        }
-
-        [Test]
-        public void ToString_Strings()
-        {
-            var list = new RepeatedField<string> { "x", "y", "z" };
-            var text = list.ToString();
-            Assert.AreEqual("[ \"x\", \"y\", \"z\" ]", text);
-        }
-
-        [Test]
-        public void ToString_Messages()
-        {
-            var list = new RepeatedField<TestAllTypes> { new TestAllTypes { SingleDouble = 1.5 }, new TestAllTypes { SingleInt32 = 10 } };
-            var text = list.ToString();
-            Assert.AreEqual("[ { \"singleDouble\": 1.5 }, { \"singleInt32\": 10 } ]", text);
-        }
-
-        [Test]
-        public void ToString_Empty()
-        {
-            var list = new RepeatedField<TestAllTypes> { };
-            var text = list.ToString();
-            Assert.AreEqual("[ ]", text);
-        }
-
-        [Test]
-        public void ToString_InvalidElementType()
-        {
-            var list = new RepeatedField<decimal> { 15m };
-            Assert.Throws<ArgumentException>(() => list.ToString());
-        }
-
-        [Test]
-        public void ToString_Timestamp()
-        {
-            var list = new RepeatedField<Timestamp> { Timestamp.FromDateTime(new DateTime(2015, 10, 1, 12, 34, 56, DateTimeKind.Utc)) };
-            var text = list.ToString();
-            Assert.AreEqual("[ \"2015-10-01T12:34:56Z\" ]", text);
-        }
-
-        [Test]
-        public void ToString_Struct()
-        {
-            var message = new Struct { Fields = { { "foo", new Value { NumberValue = 20 } } } };
-            var list = new RepeatedField<Struct> { message };
-            var text = list.ToString();
-            Assert.AreEqual(text, "[ { \"foo\": 20 } ]", message.ToString());
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs
deleted file mode 100644
index df23a09..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using NUnit.Framework;
-using System.Reflection;
-
-namespace Google.Protobuf.Compatibility
-{
-    public class PropertyInfoExtensionsTest
-    {
-        public string PublicReadWrite { get; set; }
-        private string PrivateReadWrite { get; set; }
-        public string PublicReadPrivateWrite { get; private set; }
-        public string PrivateReadPublicWrite { private get; set; }
-        public string PublicReadOnly { get { return null; } }
-        private string PrivateReadOnly { get { return null; } }
-        public string PublicWriteOnly { set { } }
-        private string PrivateWriteOnly { set {  } }
-
-        [Test]
-        [TestCase("PublicReadWrite")]
-        [TestCase("PublicReadPrivateWrite")]
-        [TestCase("PublicReadOnly")]
-        public void GetGetMethod_Success(string name)
-        {
-            var propertyInfo = typeof(PropertyInfoExtensionsTest)
-                .GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
-            Assert.IsNotNull(PropertyInfoExtensions.GetGetMethod(propertyInfo));
-        }
-
-        [Test]
-        [TestCase("PrivateReadWrite")]
-        [TestCase("PrivateReadPublicWrite")]
-        [TestCase("PrivateReadOnly")]
-        [TestCase("PublicWriteOnly")]
-        [TestCase("PrivateWriteOnly")]
-        public void GetGetMethod_NoAccessibleGetter(string name)
-        {
-            var propertyInfo = typeof(PropertyInfoExtensionsTest)
-                .GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
-            Assert.IsNull(PropertyInfoExtensions.GetGetMethod(propertyInfo));
-        }
-
-        [Test]
-        [TestCase("PublicReadWrite")]
-        [TestCase("PrivateReadPublicWrite")]
-        [TestCase("PublicWriteOnly")]
-        public void GetSetMethod_Success(string name)
-        {
-            var propertyInfo = typeof(PropertyInfoExtensionsTest)
-                .GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
-            Assert.IsNotNull(PropertyInfoExtensions.GetSetMethod(propertyInfo));
-        }
-
-        [Test]
-        [TestCase("PublicReadPrivateWrite")]
-        [TestCase("PrivateReadWrite")]
-        [TestCase("PrivateReadOnly")]
-        [TestCase("PublicReadOnly")]
-        [TestCase("PrivateWriteOnly")]
-        public void GetSetMethod_NoAccessibleGetter(string name)
-        {
-            var propertyInfo = typeof(PropertyInfoExtensionsTest)
-                .GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
-            Assert.IsNull(PropertyInfoExtensions.GetSetMethod(propertyInfo));
-        }
-    }
-
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
deleted file mode 100644
index f430b06..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-using NUnit.Framework;
-using System;
-using System.Collections.Generic;
-using System.Reflection;
-
-#if !DOTNET35
-namespace Google.Protobuf.Compatibility
-{
-    public class TypeExtensionsTest
-    {
-        public class DerivedList : List<string> { }
-        public string PublicProperty { get; set; }
-        private string PrivateProperty { get; set; }
-
-        public void PublicMethod()
-        {
-        }
-
-        private void PrivateMethod()
-        {
-        }
-
-        [Test]
-        [TestCase(typeof(object), typeof(string), true)]
-        [TestCase(typeof(object), typeof(int), true)]
-        [TestCase(typeof(string), typeof(string), true)]
-        [TestCase(typeof(string), typeof(object), false)]
-        [TestCase(typeof(string), typeof(int), false)]
-        [TestCase(typeof(int), typeof(int), true)]
-        [TestCase(typeof(ValueType), typeof(int), true)]
-        [TestCase(typeof(long), typeof(int), false)] // 
-        public void IsAssignableFrom(Type target, Type argument, bool expected)
-        {
-            Assert.AreEqual(expected, TypeExtensions.IsAssignableFrom(target, argument));
-        }
-
-        [Test]
-        [TestCase(typeof(DerivedList), "Count")] // Go up the type hierarchy
-        [TestCase(typeof(List<string>), "Count")]
-        [TestCase(typeof(List<>), "Count")]
-        [TestCase(typeof(TypeExtensionsTest), "PublicProperty")]
-        public void GetProperty_Success(Type type, string name)
-        {
-            var property = TypeExtensions.GetProperty(type, name);
-            Assert.IsNotNull(property);
-            Assert.AreEqual(name, property.Name);
-        }
-
-        [Test]
-        [TestCase(typeof(TypeExtensionsTest), "PrivateProperty")]
-        [TestCase(typeof(TypeExtensionsTest), "Garbage")]
-        public void GetProperty_NoSuchProperty(Type type, string name)
-        {
-            var property = TypeExtensions.GetProperty(type, name);
-            Assert.IsNull(property);
-        }
-
-        [Test]
-        [TestCase(typeof(DerivedList), "RemoveAt")] // Go up the type hierarchy
-        [TestCase(typeof(List<>), "RemoveAt")]
-        [TestCase(typeof(TypeExtensionsTest), "PublicMethod")]
-        public void GetMethod_Success(Type type, string name)
-        {
-            var method = TypeExtensions.GetMethod(type, name);
-            Assert.IsNotNull(method);
-            Assert.AreEqual(name, method.Name);
-        }
-
-        [Test]
-        [TestCase(typeof(TypeExtensionsTest), "PrivateMethod")]
-        [TestCase(typeof(TypeExtensionsTest), "GarbageMethod")]
-        public void GetMethod_NoSuchMethod(Type type, string name)
-        {
-            var method = TypeExtensions.GetMethod(type, name);
-            Assert.IsNull(method);
-        }
-
-        [Test]
-        [TestCase(typeof(List<string>), "IndexOf")]
-        public void GetMethod_Ambiguous(Type type, string name)
-        {
-            Assert.Throws<AmbiguousMatchException>(() => TypeExtensions.GetMethod(type, name));
-        }
-    }
-}
-#endif
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/DeprecatedMemberTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/DeprecatedMemberTest.cs
deleted file mode 100644
index 34d5b9f..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/DeprecatedMemberTest.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-#region Copyright notice and license

-// Protocol Buffers - Google's data interchange format

-// Copyright 2015 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.

-#endregion

-    

-using System;

-using System.Reflection;

-using Google.Protobuf.TestProtos;

-using NUnit.Framework;

-

-namespace Google.Protobuf

-{

-    public class DeprecatedMemberTest

-    {

-        private static void AssertIsDeprecated(MemberInfo member)

-        {

-            Assert.NotNull(member);

-            Assert.IsTrue(member.IsDefined(typeof(ObsoleteAttribute), false), "Member not obsolete: " + member);

-        }

-

-        [Test]

-        public void TestDepreatedPrimitiveValue()

-        {

-            AssertIsDeprecated(typeof(TestDeprecatedFields).GetProperty("DeprecatedInt32"));

-        }

-

-    }

-}

diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/EqualityTester.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/EqualityTester.cs
deleted file mode 100644
index a669bab..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/EqualityTester.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System;
-using NUnit.Framework;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Helper methods when testing equality. NUnit's Assert.AreEqual and
-    /// Assert.AreNotEqual methods try to be clever with collections, which can
-    /// be annoying...
-    /// </summary>
-    internal static class EqualityTester
-    {
-        public static void AssertEquality<T>(T first, T second) where T : IEquatable<T>
-        {
-            Assert.IsTrue(first.Equals(second));
-            Assert.IsTrue(first.Equals((object) second));
-            Assert.AreEqual(first.GetHashCode(), second.GetHashCode());
-        }
-
-        public static void AssertInequality<T>(T first, T second) where T : IEquatable<T>
-        {
-            Assert.IsFalse(first.Equals(second));
-            Assert.IsFalse(first.Equals((object) second));
-            // While this isn't a requirement, the chances of this test failing due to
-            // coincidence rather than a bug are very small.
-            if (first != null && second != null)
-            {
-                Assert.AreNotEqual(first.GetHashCode(), second.GetHashCode());
-            }
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/FieldCodecTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/FieldCodecTest.cs
deleted file mode 100644
index 0e2bad5..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/FieldCodecTest.cs
+++ /dev/null
@@ -1,196 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System.Collections.Generic;
-using System.IO;
-using System.Reflection;
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-
-namespace Google.Protobuf
-{
-    public class FieldCodecTest
-    {
-#pragma warning disable 0414 // Used by tests via reflection - do not remove!
-        private static readonly List<ICodecTestData> Codecs = new List<ICodecTestData>
-        {
-            new FieldCodecTestData<bool>(FieldCodec.ForBool(100), true, "Bool"),
-            new FieldCodecTestData<string>(FieldCodec.ForString(100), "sample", "String"),
-            new FieldCodecTestData<ByteString>(FieldCodec.ForBytes(100), ByteString.CopyFrom(1, 2, 3), "Bytes"),
-            new FieldCodecTestData<int>(FieldCodec.ForInt32(100), -1000, "Int32"),
-            new FieldCodecTestData<int>(FieldCodec.ForSInt32(100), -1000, "SInt32"),
-            new FieldCodecTestData<int>(FieldCodec.ForSFixed32(100), -1000, "SFixed32"),
-            new FieldCodecTestData<uint>(FieldCodec.ForUInt32(100), 1234, "UInt32"),
-            new FieldCodecTestData<uint>(FieldCodec.ForFixed32(100), 1234, "Fixed32"),
-            new FieldCodecTestData<long>(FieldCodec.ForInt64(100), -1000, "Int64"),
-            new FieldCodecTestData<long>(FieldCodec.ForSInt64(100), -1000, "SInt64"),
-            new FieldCodecTestData<long>(FieldCodec.ForSFixed64(100), -1000, "SFixed64"),
-            new FieldCodecTestData<ulong>(FieldCodec.ForUInt64(100), 1234, "UInt64"),
-            new FieldCodecTestData<ulong>(FieldCodec.ForFixed64(100), 1234, "Fixed64"),
-            new FieldCodecTestData<float>(FieldCodec.ForFloat(100), 1234.5f, "Float"),
-            new FieldCodecTestData<double>(FieldCodec.ForDouble(100), 1234567890.5d, "Double"),
-            new FieldCodecTestData<ForeignEnum>(
-                FieldCodec.ForEnum(100, t => (int) t, t => (ForeignEnum) t), ForeignEnum.ForeignBaz, "Enum"),
-            new FieldCodecTestData<ForeignMessage>(
-                FieldCodec.ForMessage(100, ForeignMessage.Parser), new ForeignMessage { C = 10 }, "Message"),
-        };
-#pragma warning restore 0414
-
-        [Test, TestCaseSource("Codecs")]
-        public void RoundTripWithTag(ICodecTestData codec)
-        {
-            codec.TestRoundTripWithTag();
-        }
-
-        [Test, TestCaseSource("Codecs")]
-        public void RoundTripRaw(ICodecTestData codec)
-        {
-            codec.TestRoundTripRaw();
-        }
-
-        [Test, TestCaseSource("Codecs")]
-        public void CalculateSize(ICodecTestData codec)
-        {
-            codec.TestCalculateSizeWithTag();
-        }
-
-        [Test, TestCaseSource("Codecs")]
-        public void DefaultValue(ICodecTestData codec)
-        {
-            codec.TestDefaultValue();
-        }
-
-        [Test, TestCaseSource("Codecs")]
-        public void FixedSize(ICodecTestData codec)
-        {
-            codec.TestFixedSize();
-        }
-
-        // This is ugly, but it means we can have a non-generic interface.
-        // It feels like NUnit should support this better, but I don't know
-        // of any better ways right now.
-        public interface ICodecTestData
-        {
-            void TestRoundTripRaw();
-            void TestRoundTripWithTag();
-            void TestCalculateSizeWithTag();
-            void TestDefaultValue();
-            void TestFixedSize();
-        }
-
-        public class FieldCodecTestData<T> : ICodecTestData
-        {
-            private readonly FieldCodec<T> codec;
-            private readonly T sampleValue;
-            private readonly string name;
-
-            public FieldCodecTestData(FieldCodec<T> codec, T sampleValue, string name)
-            {
-                this.codec = codec;
-                this.sampleValue = sampleValue;
-                this.name = name;
-            }
-
-            public void TestRoundTripRaw()
-            {
-                var stream = new MemoryStream();
-                var codedOutput = new CodedOutputStream(stream);
-                codec.ValueWriter(codedOutput, sampleValue);
-                codedOutput.Flush();
-                stream.Position = 0;
-                var codedInput = new CodedInputStream(stream);
-                Assert.AreEqual(sampleValue, codec.ValueReader(codedInput));
-                Assert.IsTrue(codedInput.IsAtEnd);
-            }
-
-            public void TestRoundTripWithTag()
-            {
-                var stream = new MemoryStream();
-                var codedOutput = new CodedOutputStream(stream);
-                codec.WriteTagAndValue(codedOutput, sampleValue);
-                codedOutput.Flush();
-                stream.Position = 0;
-                var codedInput = new CodedInputStream(stream);
-                codedInput.AssertNextTag(codec.Tag);
-                Assert.AreEqual(sampleValue, codec.Read(codedInput));
-                Assert.IsTrue(codedInput.IsAtEnd);
-            }
-
-            public void TestCalculateSizeWithTag()
-            {
-                var stream = new MemoryStream();
-                var codedOutput = new CodedOutputStream(stream);
-                codec.WriteTagAndValue(codedOutput, sampleValue);
-                codedOutput.Flush();
-                Assert.AreEqual(stream.Position, codec.CalculateSizeWithTag(sampleValue));
-            }
-
-            public void TestDefaultValue()
-            {
-                // WriteTagAndValue ignores default values
-                var stream = new MemoryStream();
-                var codedOutput = new CodedOutputStream(stream);
-                codec.WriteTagAndValue(codedOutput, codec.DefaultValue);
-                codedOutput.Flush();
-                Assert.AreEqual(0, stream.Position);
-                Assert.AreEqual(0, codec.CalculateSizeWithTag(codec.DefaultValue));
-                if (typeof(T).GetTypeInfo().IsValueType)
-                {
-                    Assert.AreEqual(default(T), codec.DefaultValue);
-                }
-
-                // The plain ValueWriter/ValueReader delegates don't.
-                if (codec.DefaultValue != null) // This part isn't appropriate for message types.
-                {
-                    codedOutput = new CodedOutputStream(stream);
-                    codec.ValueWriter(codedOutput, codec.DefaultValue);
-                    codedOutput.Flush();
-                    Assert.AreNotEqual(0, stream.Position);
-                    Assert.AreEqual(stream.Position, codec.ValueSizeCalculator(codec.DefaultValue));
-                    stream.Position = 0;
-                    var codedInput = new CodedInputStream(stream);
-                    Assert.AreEqual(codec.DefaultValue, codec.ValueReader(codedInput));
-                }
-            }
-
-            public void TestFixedSize()
-            {
-                Assert.AreEqual(name.Contains("Fixed"), codec.FixedSize != 0);
-            }
-
-            public override string ToString()
-            {
-                return name;
-            }
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/GeneratedMessageTest.cs
deleted file mode 100644
index 429c51f..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+++ /dev/null
@@ -1,725 +0,0 @@
-#region Copyright notice and license

-// Protocol Buffers - Google's data interchange format

-// Copyright 2015 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.

-#endregion

-

-using System;

-using System.IO;

-using Google.Protobuf.TestProtos;

-using NUnit.Framework;

-using System.Collections;

-using System.Collections.Generic;

-using System.Linq;

-using Google.Protobuf.WellKnownTypes;

-

-namespace Google.Protobuf

-{

-    /// <summary>

-    /// Tests around the generated TestAllTypes message.

-    /// </summary>

-    public class GeneratedMessageTest

-    {

-        [Test]

-        public void EmptyMessageFieldDistinctFromMissingMessageField()

-        {

-            // This demonstrates what we're really interested in...

-            var message1 = new TestAllTypes { SingleForeignMessage = new ForeignMessage() };

-            var message2 = new TestAllTypes(); // SingleForeignMessage is null

-            EqualityTester.AssertInequality(message1, message2);

-        }

-

-        [Test]

-        public void DefaultValues()

-        {

-            // Single fields

-            var message = new TestAllTypes();

-            Assert.AreEqual(false, message.SingleBool);

-            Assert.AreEqual(ByteString.Empty, message.SingleBytes);

-            Assert.AreEqual(0.0, message.SingleDouble);

-            Assert.AreEqual(0, message.SingleFixed32);

-            Assert.AreEqual(0L, message.SingleFixed64);

-            Assert.AreEqual(0.0f, message.SingleFloat);

-            Assert.AreEqual(ForeignEnum.ForeignUnspecified, message.SingleForeignEnum);

-            Assert.IsNull(message.SingleForeignMessage);

-            Assert.AreEqual(ImportEnum.Unspecified, message.SingleImportEnum);

-            Assert.IsNull(message.SingleImportMessage);

-            Assert.AreEqual(0, message.SingleInt32);

-            Assert.AreEqual(0L, message.SingleInt64);

-            Assert.AreEqual(TestAllTypes.Types.NestedEnum.Unspecified, message.SingleNestedEnum);

-            Assert.IsNull(message.SingleNestedMessage);

-            Assert.IsNull(message.SinglePublicImportMessage);

-            Assert.AreEqual(0, message.SingleSfixed32);

-            Assert.AreEqual(0L, message.SingleSfixed64);

-            Assert.AreEqual(0, message.SingleSint32);

-            Assert.AreEqual(0L, message.SingleSint64);

-            Assert.AreEqual("", message.SingleString);

-            Assert.AreEqual(0U, message.SingleUint32);

-            Assert.AreEqual(0UL, message.SingleUint64);

-

-            // Repeated fields

-            Assert.AreEqual(0, message.RepeatedBool.Count);

-            Assert.AreEqual(0, message.RepeatedBytes.Count);

-            Assert.AreEqual(0, message.RepeatedDouble.Count);

-            Assert.AreEqual(0, message.RepeatedFixed32.Count);

-            Assert.AreEqual(0, message.RepeatedFixed64.Count);

-            Assert.AreEqual(0, message.RepeatedFloat.Count);

-            Assert.AreEqual(0, message.RepeatedForeignEnum.Count);

-            Assert.AreEqual(0, message.RepeatedForeignMessage.Count);

-            Assert.AreEqual(0, message.RepeatedImportEnum.Count);

-            Assert.AreEqual(0, message.RepeatedImportMessage.Count);

-            Assert.AreEqual(0, message.RepeatedNestedEnum.Count);

-            Assert.AreEqual(0, message.RepeatedNestedMessage.Count);

-            Assert.AreEqual(0, message.RepeatedPublicImportMessage.Count);

-            Assert.AreEqual(0, message.RepeatedSfixed32.Count);

-            Assert.AreEqual(0, message.RepeatedSfixed64.Count);

-            Assert.AreEqual(0, message.RepeatedSint32.Count);

-            Assert.AreEqual(0, message.RepeatedSint64.Count);

-            Assert.AreEqual(0, message.RepeatedString.Count);

-            Assert.AreEqual(0, message.RepeatedUint32.Count);

-            Assert.AreEqual(0, message.RepeatedUint64.Count);

-

-            // Oneof fields

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);

-            Assert.AreEqual(0, message.OneofUint32);

-            Assert.AreEqual("", message.OneofString);

-            Assert.AreEqual(ByteString.Empty, message.OneofBytes);

-            Assert.IsNull(message.OneofNestedMessage);

-        }

-

-        [Test]

-        public void NullStringAndBytesRejected()

-        {

-            var message = new TestAllTypes();

-            Assert.Throws<ArgumentNullException>(() => message.SingleString = null);

-            Assert.Throws<ArgumentNullException>(() => message.OneofString = null);

-            Assert.Throws<ArgumentNullException>(() => message.SingleBytes = null);

-            Assert.Throws<ArgumentNullException>(() => message.OneofBytes = null);

-        }

-

-        [Test]

-        public void RoundTrip_Empty()

-        {

-            var message = new TestAllTypes();

-            // Without setting any values, there's nothing to write.

-            byte[] bytes = message.ToByteArray();

-            Assert.AreEqual(0, bytes.Length);

-            TestAllTypes parsed = TestAllTypes.Parser.ParseFrom(bytes);

-            Assert.AreEqual(message, parsed);

-        }

-

-        [Test]

-        public void RoundTrip_SingleValues()

-        {

-            var message = new TestAllTypes

-            {

-                SingleBool = true,

-                SingleBytes = ByteString.CopyFrom(1, 2, 3, 4),

-                SingleDouble = 23.5,

-                SingleFixed32 = 23,

-                SingleFixed64 = 1234567890123,

-                SingleFloat = 12.25f,

-                SingleForeignEnum = ForeignEnum.ForeignBar,

-                SingleForeignMessage = new ForeignMessage { C = 10 },

-                SingleImportEnum = ImportEnum.ImportBaz,

-                SingleImportMessage = new ImportMessage { D = 20 },

-                SingleInt32 = 100,

-                SingleInt64 = 3210987654321,

-                SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo,

-                SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 35 },

-                SinglePublicImportMessage = new PublicImportMessage { E = 54 },

-                SingleSfixed32 = -123,

-                SingleSfixed64 = -12345678901234,

-                SingleSint32 = -456,

-                SingleSint64 = -12345678901235,

-                SingleString = "test",

-                SingleUint32 = uint.MaxValue,

-                SingleUint64 = ulong.MaxValue

-            };

-

-            byte[] bytes = message.ToByteArray();

-            TestAllTypes parsed = TestAllTypes.Parser.ParseFrom(bytes);

-            Assert.AreEqual(message, parsed);

-        }

-

-        [Test]

-        public void RoundTrip_RepeatedValues()

-        {

-            var message = new TestAllTypes

-            {

-                RepeatedBool = { true, false },

-                RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6) },

-                RepeatedDouble = { -12.25, 23.5 },

-                RepeatedFixed32 = { uint.MaxValue, 23 },

-                RepeatedFixed64 = { ulong.MaxValue, 1234567890123 },

-                RepeatedFloat = { 100f, 12.25f },

-                RepeatedForeignEnum = { ForeignEnum.ForeignFoo, ForeignEnum.ForeignBar },

-                RepeatedForeignMessage = { new ForeignMessage(), new ForeignMessage { C = 10 } },

-                RepeatedImportEnum = { ImportEnum.ImportBaz, ImportEnum.Unspecified },

-                RepeatedImportMessage = { new ImportMessage { D = 20 }, new ImportMessage { D = 25 } },

-                RepeatedInt32 = { 100, 200 },

-                RepeatedInt64 = { 3210987654321, long.MaxValue },

-                RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg },

-                RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 35 }, new TestAllTypes.Types.NestedMessage { Bb = 10 } },

-                RepeatedPublicImportMessage = { new PublicImportMessage { E = 54 }, new PublicImportMessage { E = -1 } },

-                RepeatedSfixed32 = { -123, 123 },

-                RepeatedSfixed64 = { -12345678901234, 12345678901234 },

-                RepeatedSint32 = { -456, 100 },

-                RepeatedSint64 = { -12345678901235, 123 },

-                RepeatedString = { "foo", "bar" },

-                RepeatedUint32 = { uint.MaxValue, uint.MinValue },

-                RepeatedUint64 = { ulong.MaxValue, uint.MinValue }

-            };

-

-            byte[] bytes = message.ToByteArray();

-            TestAllTypes parsed = TestAllTypes.Parser.ParseFrom(bytes);

-            Assert.AreEqual(message, parsed);

-        }

-

-        // Note that not every map within map_unittest_proto3 is used. They all go through very

-        // similar code paths. The fact that all maps are present is validation that we have codecs

-        // for every type.

-        [Test]

-        public void RoundTrip_Maps()

-        {

-            var message = new TestMap

-            {

-                MapBoolBool = {

-                    { false, true },

-                    { true, false }

-                },

-                MapInt32Bytes = {

-                    { 5, ByteString.CopyFrom(6, 7, 8) },

-                    { 25, ByteString.CopyFrom(1, 2, 3, 4, 5) },

-                    { 10, ByteString.Empty }

-                },

-                MapInt32ForeignMessage = {

-                    { 0, new ForeignMessage { C = 10 } },

-                    { 5, new ForeignMessage() },

-                },

-                MapInt32Enum = {

-                    { 1, MapEnum.Bar },

-                    { 2000, MapEnum.Foo }

-                }

-            };

-

-            byte[] bytes = message.ToByteArray();

-            TestMap parsed = TestMap.Parser.ParseFrom(bytes);

-            Assert.AreEqual(message, parsed);

-        }

-

-        [Test]

-        public void MapWithEmptyEntry()

-        {

-            var message = new TestMap

-            {

-                MapInt32Bytes = { { 0, ByteString.Empty } }

-            };

-

-            byte[] bytes = message.ToByteArray();

-            Assert.AreEqual(2, bytes.Length); // Tag for field entry (1 byte), length of entry (0; 1 byte)

-

-            var parsed = TestMap.Parser.ParseFrom(bytes);

-            Assert.AreEqual(1, parsed.MapInt32Bytes.Count);

-            Assert.AreEqual(ByteString.Empty, parsed.MapInt32Bytes[0]);

-        }

-

-        [Test]

-        public void MapWithOnlyValue()

-        {

-            // Hand-craft the stream to contain a single entry with just a value.

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-            output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);

-            var nestedMessage = new ForeignMessage { C = 20 };

-            // Size of the entry (tag, size written by WriteMessage, data written by WriteMessage)

-            output.WriteLength(2 + nestedMessage.CalculateSize());

-            output.WriteTag(2, WireFormat.WireType.LengthDelimited);

-            output.WriteMessage(nestedMessage);

-            output.Flush();

-

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            Assert.AreEqual(nestedMessage, parsed.MapInt32ForeignMessage[0]);

-        }

-

-        [Test]

-        public void MapWithOnlyKey_PrimitiveValue()

-        {

-            // Hand-craft the stream to contain a single entry with just a key.

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-            output.WriteTag(TestMap.MapInt32DoubleFieldNumber, WireFormat.WireType.LengthDelimited);

-            int key = 10;

-            output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key));

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key);

-            output.Flush();

-

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            Assert.AreEqual(0.0, parsed.MapInt32Double[key]);

-        }

-

-        [Test]

-        public void MapWithOnlyKey_MessageValue()

-        {

-            // Hand-craft the stream to contain a single entry with just a key.

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-            output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);

-            int key = 10;

-            output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key));

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key);

-            output.Flush();

-

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            Assert.AreEqual(new ForeignMessage(), parsed.MapInt32ForeignMessage[key]);

-        }

-

-        [Test]

-        public void MapIgnoresExtraFieldsWithinEntryMessages()

-        {

-            // Hand-craft the stream to contain a single entry with three fields

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-

-            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

-

-            var key = 10; // Field 1 

-            var value = 20; // Field 2

-            var extra = 30; // Field 3

-

-            // Each field can be represented in a single byte, with a single byte tag.

-            // Total message size: 6 bytes.

-            output.WriteLength(6);

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key);

-            output.WriteTag(2, WireFormat.WireType.Varint);

-            output.WriteInt32(value);

-            output.WriteTag(3, WireFormat.WireType.Varint);

-            output.WriteInt32(extra);

-            output.Flush();

-

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            Assert.AreEqual(value, parsed.MapInt32Int32[key]);

-        }

-

-        [Test]

-        public void MapFieldOrderIsIrrelevant()

-        {

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-

-            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

-

-            var key = 10;

-            var value = 20;

-

-            // Each field can be represented in a single byte, with a single byte tag.

-            // Total message size: 4 bytes.

-            output.WriteLength(4);

-            output.WriteTag(2, WireFormat.WireType.Varint);

-            output.WriteInt32(value);

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key);

-            output.Flush();

-

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            Assert.AreEqual(value, parsed.MapInt32Int32[key]);

-        }

-

-        [Test]

-        public void MapNonContiguousEntries()

-        {

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-

-            // Message structure:

-            // Entry for MapInt32Int32

-            // Entry for MapStringString

-            // Entry for MapInt32Int32

-

-            // First entry

-            var key1 = 10;

-            var value1 = 20;

-            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

-            output.WriteLength(4);

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key1);

-            output.WriteTag(2, WireFormat.WireType.Varint);

-            output.WriteInt32(value1);

-

-            // Second entry

-            var key2 = "a";

-            var value2 = "b";

-            output.WriteTag(TestMap.MapStringStringFieldNumber, WireFormat.WireType.LengthDelimited);

-            output.WriteLength(6); // 3 bytes per entry: tag, size, character

-            output.WriteTag(1, WireFormat.WireType.LengthDelimited);

-            output.WriteString(key2);

-            output.WriteTag(2, WireFormat.WireType.LengthDelimited);

-            output.WriteString(value2);

-

-            // Third entry

-            var key3 = 15;

-            var value3 = 25;

-            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

-            output.WriteLength(4);

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key3);

-            output.WriteTag(2, WireFormat.WireType.Varint);

-            output.WriteInt32(value3);

-

-            output.Flush();

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            var expected = new TestMap

-            {

-                MapInt32Int32 = { { key1, value1 }, { key3, value3 } },

-                MapStringString = { { key2, value2 } }

-            };

-            Assert.AreEqual(expected, parsed);

-        }

-

-        [Test]

-        public void DuplicateKeys_LastEntryWins()

-        {

-            var memoryStream = new MemoryStream();

-            var output = new CodedOutputStream(memoryStream);

-

-            var key = 10;

-            var value1 = 20;

-            var value2 = 30;

-

-            // First entry

-            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

-            output.WriteLength(4);

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key);

-            output.WriteTag(2, WireFormat.WireType.Varint);

-            output.WriteInt32(value1);

-

-            // Second entry - same key, different value

-            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

-            output.WriteLength(4);

-            output.WriteTag(1, WireFormat.WireType.Varint);

-            output.WriteInt32(key);

-            output.WriteTag(2, WireFormat.WireType.Varint);

-            output.WriteInt32(value2);

-            output.Flush();

-

-            var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());

-            Assert.AreEqual(value2, parsed.MapInt32Int32[key]);

-        }

-

-        [Test]

-        public void CloneSingleNonMessageValues()

-        {

-            var original = new TestAllTypes

-            {

-                SingleBool = true,

-                SingleBytes = ByteString.CopyFrom(1, 2, 3, 4),

-                SingleDouble = 23.5,

-                SingleFixed32 = 23,

-                SingleFixed64 = 1234567890123,

-                SingleFloat = 12.25f,

-                SingleInt32 = 100,

-                SingleInt64 = 3210987654321,

-                SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo,

-                SingleSfixed32 = -123,

-                SingleSfixed64 = -12345678901234,

-                SingleSint32 = -456,

-                SingleSint64 = -12345678901235,

-                SingleString = "test",

-                SingleUint32 = uint.MaxValue,

-                SingleUint64 = ulong.MaxValue

-            };

-            var clone = original.Clone();

-            Assert.AreNotSame(original, clone);

-            Assert.AreEqual(original, clone);

-            // Just as a single example

-            clone.SingleInt32 = 150;

-            Assert.AreNotEqual(original, clone);

-        }

-

-        [Test]

-        public void CloneRepeatedNonMessageValues()

-        {

-            var original = new TestAllTypes

-            {

-                RepeatedBool = { true, false },

-                RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6) },

-                RepeatedDouble = { -12.25, 23.5 },

-                RepeatedFixed32 = { uint.MaxValue, 23 },

-                RepeatedFixed64 = { ulong.MaxValue, 1234567890123 },

-                RepeatedFloat = { 100f, 12.25f },

-                RepeatedInt32 = { 100, 200 },

-                RepeatedInt64 = { 3210987654321, long.MaxValue },

-                RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg },

-                RepeatedSfixed32 = { -123, 123 },

-                RepeatedSfixed64 = { -12345678901234, 12345678901234 },

-                RepeatedSint32 = { -456, 100 },

-                RepeatedSint64 = { -12345678901235, 123 },

-                RepeatedString = { "foo", "bar" },

-                RepeatedUint32 = { uint.MaxValue, uint.MinValue },

-                RepeatedUint64 = { ulong.MaxValue, uint.MinValue }

-            };

-

-            var clone = original.Clone();

-            Assert.AreNotSame(original, clone);

-            Assert.AreEqual(original, clone);

-            // Just as a single example

-            clone.RepeatedDouble.Add(25.5);

-            Assert.AreNotEqual(original, clone);

-        }

-

-        [Test]

-        public void CloneSingleMessageField()

-        {

-            var original = new TestAllTypes

-            {

-                SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 }

-            };

-

-            var clone = original.Clone();

-            Assert.AreNotSame(original, clone);

-            Assert.AreNotSame(original.SingleNestedMessage, clone.SingleNestedMessage);

-            Assert.AreEqual(original, clone);

-

-            clone.SingleNestedMessage.Bb = 30;

-            Assert.AreNotEqual(original, clone);

-        }

-

-        [Test]

-        public void CloneRepeatedMessageField()

-        {

-            var original = new TestAllTypes

-            {

-                RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 20 } }

-            };

-

-            var clone = original.Clone();

-            Assert.AreNotSame(original, clone);

-            Assert.AreNotSame(original.RepeatedNestedMessage, clone.RepeatedNestedMessage);

-            Assert.AreNotSame(original.RepeatedNestedMessage[0], clone.RepeatedNestedMessage[0]);

-            Assert.AreEqual(original, clone);

-

-            clone.RepeatedNestedMessage[0].Bb = 30;

-            Assert.AreNotEqual(original, clone);

-        }

-

-        [Test]

-        public void CloneOneofField()

-        {

-            var original = new TestAllTypes

-            {

-                OneofNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 }

-            };

-

-            var clone = original.Clone();

-            Assert.AreNotSame(original, clone);

-            Assert.AreEqual(original, clone);

-

-            // We should have cloned the message

-            original.OneofNestedMessage.Bb = 30;

-            Assert.AreNotEqual(original, clone);

-        }

-

-        [Test]

-        public void OneofProperties()

-        {

-            // Switch the oneof case between each of the different options, and check everything behaves

-            // as expected in each case.

-            var message = new TestAllTypes();

-            Assert.AreEqual("", message.OneofString);

-            Assert.AreEqual(0, message.OneofUint32);

-            Assert.AreEqual(ByteString.Empty, message.OneofBytes);

-            Assert.IsNull(message.OneofNestedMessage);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);

-

-            message.OneofString = "sample";

-            Assert.AreEqual("sample", message.OneofString);

-            Assert.AreEqual(0, message.OneofUint32);

-            Assert.AreEqual(ByteString.Empty, message.OneofBytes);

-            Assert.IsNull(message.OneofNestedMessage);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);

-

-            var bytes = ByteString.CopyFrom(1, 2, 3);

-            message.OneofBytes = bytes;

-            Assert.AreEqual("", message.OneofString);

-            Assert.AreEqual(0, message.OneofUint32);

-            Assert.AreEqual(bytes, message.OneofBytes);

-            Assert.IsNull(message.OneofNestedMessage);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofBytes, message.OneofFieldCase);

-

-            message.OneofUint32 = 20;

-            Assert.AreEqual("", message.OneofString);

-            Assert.AreEqual(20, message.OneofUint32);

-            Assert.AreEqual(ByteString.Empty, message.OneofBytes);

-            Assert.IsNull(message.OneofNestedMessage);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase);

-

-            var nestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 25 };

-            message.OneofNestedMessage = nestedMessage;

-            Assert.AreEqual("", message.OneofString);

-            Assert.AreEqual(0, message.OneofUint32);

-            Assert.AreEqual(ByteString.Empty, message.OneofBytes);

-            Assert.AreEqual(nestedMessage, message.OneofNestedMessage);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofNestedMessage, message.OneofFieldCase);

-

-            message.ClearOneofField();

-            Assert.AreEqual("", message.OneofString);

-            Assert.AreEqual(0, message.OneofUint32);

-            Assert.AreEqual(ByteString.Empty, message.OneofBytes);

-            Assert.IsNull(message.OneofNestedMessage);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);

-        }

-

-        [Test]

-        public void Oneof_DefaultValuesNotEqual()

-        {

-            var message1 = new TestAllTypes { OneofString = "" };

-            var message2 = new TestAllTypes { OneofUint32 = 0 };

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofString, message1.OneofFieldCase);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase);

-            Assert.AreNotEqual(message1, message2);

-        }

-

-        [Test]

-        public void OneofSerialization_NonDefaultValue()

-        {

-            var message = new TestAllTypes();

-            message.OneofString = "this would take a bit of space";

-            message.OneofUint32 = 10;

-            var bytes = message.ToByteArray();

-            Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - no string!

-

-            var message2 = TestAllTypes.Parser.ParseFrom(bytes);

-            Assert.AreEqual(message, message2);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase);

-        }

-

-        [Test]

-        public void OneofSerialization_DefaultValue()

-        {

-            var message = new TestAllTypes();

-            message.OneofString = "this would take a bit of space";

-            message.OneofUint32 = 0; // This is the default value for UInt32; normally wouldn't be serialized

-            var bytes = message.ToByteArray();

-            Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - it's still serialized

-

-            var message2 = TestAllTypes.Parser.ParseFrom(bytes);

-            Assert.AreEqual(message, message2);

-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase);

-        }

-

-        [Test]

-        public void DiscardUnknownFields_RealDataStillRead()

-        {

-            var message = SampleMessages.CreateFullTestAllTypes();

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-            var unusedFieldNumber = 23456;

-            Assert.IsFalse(TestAllTypes.Descriptor.Fields.InDeclarationOrder().Select(x => x.FieldNumber).Contains(unusedFieldNumber));

-            output.WriteTag(unusedFieldNumber, WireFormat.WireType.LengthDelimited);

-            output.WriteString("ignore me");

-            message.WriteTo(output);

-            output.Flush();

-

-            stream.Position = 0;

-            var parsed = TestAllTypes.Parser.ParseFrom(stream);

-	    // TODO(jieluo): Add test back after DiscardUnknownFields is supported

-            // Assert.AreEqual(message, parsed);

-        }

-

-        [Test]

-        public void DiscardUnknownFields_AllTypes()

-        {

-            // Simple way of ensuring we can skip all kinds of fields.

-            var data = SampleMessages.CreateFullTestAllTypes().ToByteArray();

-            var empty = Empty.Parser.ParseFrom(data);

-	    // TODO(jieluo): Add test back after DiscardUnknownField is supported.

-            // Assert.AreEqual(new Empty(), empty);

-        }

-

-        // This was originally seen as a conformance test failure.

-        [Test]

-        public void TruncatedMessageFieldThrows()

-        {

-            // 130, 3 is the message tag

-            // 1 is the data length - but there's no data.

-            var data = new byte[] { 130, 3, 1 };

-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(data));

-        }

-

-        /// <summary>

-        /// Demonstrates current behaviour with an extraneous end group tag - see issue 688

-        /// for details; we may want to change this.

-        /// </summary>

-        [Test]

-        public void ExtraEndGroupThrows()

-        {

-            var message = SampleMessages.CreateFullTestAllTypes();

-            var stream = new MemoryStream();

-            var output = new CodedOutputStream(stream);

-

-            output.WriteTag(TestAllTypes.SingleFixed32FieldNumber, WireFormat.WireType.Fixed32);

-            output.WriteFixed32(123);

-            output.WriteTag(100, WireFormat.WireType.EndGroup);

-

-            output.Flush();

-

-            stream.Position = 0;

-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(stream));

-        }

-

-        [Test]

-        public void CustomDiagnosticMessage_DirectToStringCall()

-        {

-            var message = new ForeignMessage { C = 31 };

-            Assert.AreEqual("{ \"c\": 31, \"@cInHex\": \"1f\" }", message.ToString());

-            Assert.AreEqual("{ \"c\": 31 }", JsonFormatter.Default.Format(message));

-        }

-

-        [Test]

-        public void CustomDiagnosticMessage_Nested()

-        {

-            var message = new TestAllTypes { SingleForeignMessage = new ForeignMessage { C = 16 } };

-            Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16, \"@cInHex\": \"10\" } }", message.ToString());

-            Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16 } }", JsonFormatter.Default.Format(message));

-        }

-

-        [Test]

-        public void CustomDiagnosticMessage_DirectToTextWriterCall()

-        {

-            var message = new ForeignMessage { C = 31 };

-            var writer = new StringWriter();

-            JsonFormatter.Default.Format(message, writer);

-            Assert.AreEqual("{ \"c\": 31 }", writer.ToString());

-        }

-    }

-}

diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
deleted file mode 100644
index 06d07b9..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+++ /dev/null
@@ -1,30 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>Exe</OutputType>
-    <TargetFrameworks>net451;netcoreapp1.0</TargetFrameworks>
-    <AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
-    <SignAssembly>true</SignAssembly>
-    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
-    <IsPackable>False</IsPackable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="NUnit" Version="3.6.1" />
-    <PackageReference Include="NUnitLite" Version="3.6.1" />
-  </ItemGroup>
-
-  <!-- 
-    - Override target frameworks on non-Windows to just .NET Core
-    - Doing this conditionally in the initial PropertyGroup confuses
-    - Visual Studio.
-    -->
-  <PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
-    <TargetFrameworks>netcoreapp1.0</TargetFrameworks>
-  </PropertyGroup>
-  
-</Project>
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/IssuesTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/IssuesTest.cs
deleted file mode 100644
index a38d6b0..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/IssuesTest.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-#region Copyright notice and license

-// 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.

-#endregion

-

-using Google.Protobuf.Reflection;

-using UnitTest.Issues.TestProtos;

-using NUnit.Framework;

-

-

-namespace Google.Protobuf

-{

-    /// <summary>

-    /// Tests for issues which aren't easily compartmentalized into other unit tests.

-    /// </summary>

-    public class IssuesTest

-    {

-        // Issue 45

-        [Test]

-        public void FieldCalledItem()

-        {

-            ItemField message = new ItemField { Item = 3 };

-            FieldDescriptor field = ItemField.Descriptor.FindFieldByName("item");

-            Assert.NotNull(field);

-            Assert.AreEqual(3, (int)field.Accessor.GetValue(message));

-        }

-

-        [Test]

-        public void ReservedNames()

-        {

-            var message = new ReservedNames { Types_ = 10, Descriptor_ = 20 };

-            // Underscores aren't reflected in the JSON.

-            Assert.AreEqual("{ \"types\": 10, \"descriptor\": 20 }", message.ToString());

-        }

-

-        [Test]

-        public void JsonNameParseTest()

-        {

-            var settings = new JsonParser.Settings(10, TypeRegistry.FromFiles(UnittestIssuesReflection.Descriptor));

-            var parser = new JsonParser(settings);

-

-            // It is safe to use either original field name or explicitly specified json_name

-            Assert.AreEqual(new TestJsonName { Name = "test", Description = "test2", Guid = "test3" },

-                parser.Parse<TestJsonName>("{ \"name\": \"test\", \"desc\": \"test2\", \"guid\": \"test3\" }"));

-        }

-

-        [Test]

-        public void JsonNameFormatTest()

-        {

-            var message = new TestJsonName { Name = "test", Description = "test2", Guid = "test3" };

-            Assert.AreEqual("{ \"name\": \"test\", \"desc\": \"test2\", \"exid\": \"test3\" }",

-                JsonFormatter.Default.Format(message));

-        }

-    }

-}

diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/JsonParserTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/JsonParserTest.cs
deleted file mode 100644
index f595455..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/JsonParserTest.cs
+++ /dev/null
@@ -1,939 +0,0 @@
-#region Copyright notice and license
-// 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.
-#endregion
-
-using Google.Protobuf.Reflection;
-using Google.Protobuf.TestProtos;
-using Google.Protobuf.WellKnownTypes;
-using NUnit.Framework;
-using System;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Unit tests for JSON parsing.
-    /// </summary>
-    public class JsonParserTest
-    {
-        // Sanity smoke test
-        [Test]
-        public void AllTypesRoundtrip()
-        {
-            AssertRoundtrip(SampleMessages.CreateFullTestAllTypes());
-        }
-
-        [Test]
-        public void Maps()
-        {
-            AssertRoundtrip(new TestMap { MapStringString = { { "with spaces", "bar" }, { "a", "b" } } });
-            AssertRoundtrip(new TestMap { MapInt32Int32 = { { 0, 1 }, { 2, 3 } } });
-            AssertRoundtrip(new TestMap { MapBoolBool = { { false, true }, { true, false } } });
-        }
-
-        [Test]
-        [TestCase(" 1 ")]
-        [TestCase("+1")]
-        [TestCase("1,000")]
-        [TestCase("1.5")]
-        public void IntegerMapKeysAreStrict(string keyText)
-        {
-            // Test that integer parsing is strict. We assume that if this is correct for int32,
-            // it's correct for other numeric key types.
-            var json = "{ \"mapInt32Int32\": { \"" + keyText + "\" : \"1\" } }";
-            Assert.Throws<InvalidProtocolBufferException>(() => JsonParser.Default.Parse<TestMap>(json));
-        }
-
-        [Test]
-        public void OriginalFieldNameAccepted()
-        {
-            var json = "{ \"single_int32\": 10 }";
-            var expected = new TestAllTypes { SingleInt32 = 10 };
-            Assert.AreEqual(expected, TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void SourceContextRoundtrip()
-        {
-            AssertRoundtrip(new SourceContext { FileName = "foo.proto" });
-        }
-
-        [Test]
-        public void SingularWrappers_DefaultNonNullValues()
-        {
-            var message = new TestWellKnownTypes
-            {
-                StringField = "",
-                BytesField = ByteString.Empty,
-                BoolField = false,
-                FloatField = 0f,
-                DoubleField = 0d,
-                Int32Field = 0,
-                Int64Field = 0,
-                Uint32Field = 0,
-                Uint64Field = 0
-            };
-            AssertRoundtrip(message);
-        }
-
-        [Test]
-        public void SingularWrappers_NonDefaultValues()
-        {
-            var message = new TestWellKnownTypes
-            {
-                StringField = "x",
-                BytesField = ByteString.CopyFrom(1, 2, 3),
-                BoolField = true,
-                FloatField = 12.5f,
-                DoubleField = 12.25d,
-                Int32Field = 1,
-                Int64Field = 2,
-                Uint32Field = 3,
-                Uint64Field = 4
-            };
-            AssertRoundtrip(message);
-        }
-
-        [Test]
-        public void SingularWrappers_ExplicitNulls()
-        {
-            // When we parse the "valueField": null part, we remember it... basically, it's one case
-            // where explicit default values don't fully roundtrip.
-            var message = new TestWellKnownTypes { ValueField = Value.ForNull() };
-            var json = new JsonFormatter(new JsonFormatter.Settings(true)).Format(message);
-            var parsed = JsonParser.Default.Parse<TestWellKnownTypes>(json);
-            Assert.AreEqual(message, parsed);
-        }
-
-        [Test]
-        [TestCase(typeof(BoolValue), "true", true)]
-        [TestCase(typeof(Int32Value), "32", 32)]
-        [TestCase(typeof(Int64Value), "32", 32L)]
-        [TestCase(typeof(Int64Value), "\"32\"", 32L)]
-        [TestCase(typeof(UInt32Value), "32", 32U)]
-        [TestCase(typeof(UInt64Value), "\"32\"", 32UL)]
-        [TestCase(typeof(UInt64Value), "32", 32UL)]
-        [TestCase(typeof(StringValue), "\"foo\"", "foo")]
-        [TestCase(typeof(FloatValue), "1.5", 1.5f)]
-        [TestCase(typeof(DoubleValue), "1.5", 1.5d)]
-        public void Wrappers_Standalone(System.Type wrapperType, string json, object expectedValue)
-        {
-            IMessage parsed = (IMessage)Activator.CreateInstance(wrapperType);
-            IMessage expected = (IMessage)Activator.CreateInstance(wrapperType);
-            JsonParser.Default.Merge(parsed, "null");
-            Assert.AreEqual(expected, parsed);
-
-            JsonParser.Default.Merge(parsed, json);
-            expected.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.SetValue(expected, expectedValue);
-            Assert.AreEqual(expected, parsed);
-        }
-
-        [Test]
-        public void ExplicitNullValue()
-        {
-            string json = "{\"valueField\": null}";
-            var message = JsonParser.Default.Parse<TestWellKnownTypes>(json);
-            Assert.AreEqual(new TestWellKnownTypes { ValueField = Value.ForNull() }, message);
-        }
-
-        [Test]
-        public void BytesWrapper_Standalone()
-        {
-            ByteString data = ByteString.CopyFrom(1, 2, 3);
-            // Can't do this with attributes...
-            var parsed = JsonParser.Default.Parse<BytesValue>(WrapInQuotes(data.ToBase64()));
-            var expected = new BytesValue { Value = data };
-            Assert.AreEqual(expected, parsed);
-        }
-
-        [Test]
-        public void RepeatedWrappers()
-        {
-            var message = new RepeatedWellKnownTypes
-            {
-                BoolField = { true, false },
-                BytesField = { ByteString.CopyFrom(1, 2, 3), ByteString.CopyFrom(4, 5, 6), ByteString.Empty },
-                DoubleField = { 12.5, -1.5, 0d },
-                FloatField = { 123.25f, -20f, 0f },
-                Int32Field = { int.MaxValue, int.MinValue, 0 },
-                Int64Field = { long.MaxValue, long.MinValue, 0L },
-                StringField = { "First", "Second", "" },
-                Uint32Field = { uint.MaxValue, uint.MinValue, 0U },
-                Uint64Field = { ulong.MaxValue, ulong.MinValue, 0UL },
-            };
-            AssertRoundtrip(message);
-        }
-
-        [Test]
-        public void RepeatedField_NullElementProhibited()
-        {
-            string json = "{ \"repeated_foreign_message\": [null] }";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void RepeatedField_NullOverallValueAllowed()
-        {
-            string json = "{ \"repeated_foreign_message\": null }";
-            Assert.AreEqual(new TestAllTypes(), TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("{ \"mapInt32Int32\": { \"10\": null }")]
-        [TestCase("{ \"mapStringString\": { \"abc\": null }")]
-        [TestCase("{ \"mapInt32ForeignMessage\": { \"10\": null }")]
-        public void MapField_NullValueProhibited(string json)
-        {
-            Assert.Throws<InvalidProtocolBufferException>(() => TestMap.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void MapField_NullOverallValueAllowed()
-        {
-            string json = "{ \"mapInt32Int32\": null }";
-            Assert.AreEqual(new TestMap(), TestMap.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void IndividualWrapperTypes()
-        {
-            Assert.AreEqual(new StringValue { Value = "foo" }, StringValue.Parser.ParseJson("\"foo\""));
-            Assert.AreEqual(new Int32Value { Value = 1 }, Int32Value.Parser.ParseJson("1"));
-            // Can parse strings directly too
-            Assert.AreEqual(new Int32Value { Value = 1 }, Int32Value.Parser.ParseJson("\"1\""));
-        }
-
-        private static void AssertRoundtrip<T>(T message) where T : IMessage<T>, new()
-        {
-            var clone = message.Clone();
-            var json = JsonFormatter.Default.Format(message);
-            var parsed = JsonParser.Default.Parse<T>(json);
-            Assert.AreEqual(clone, parsed);
-        }
-
-        [Test]
-        [TestCase("0", 0)]
-        [TestCase("-0", 0)] // Not entirely clear whether we intend to allow this...
-        [TestCase("1", 1)]
-        [TestCase("-1", -1)]
-        [TestCase("2147483647", 2147483647)]
-        [TestCase("-2147483648", -2147483648)]
-        public void StringToInt32_Valid(string jsonValue, int expectedParsedValue)
-        {
-            string json = "{ \"singleInt32\": \"" + jsonValue + "\"}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleInt32);
-        }
-
-        [Test]
-        [TestCase("+0")]
-        [TestCase(" 1")]
-        [TestCase("1 ")]
-        [TestCase("00")]
-        [TestCase("-00")]
-        [TestCase("--1")]
-        [TestCase("+1")]
-        [TestCase("1.5")]
-        [TestCase("1e10")]
-        [TestCase("2147483648")]
-        [TestCase("-2147483649")]
-        public void StringToInt32_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleInt32\": \"" + jsonValue + "\"}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0U)]
-        [TestCase("1", 1U)]
-        [TestCase("4294967295", 4294967295U)]
-        public void StringToUInt32_Valid(string jsonValue, uint expectedParsedValue)
-        {
-            string json = "{ \"singleUint32\": \"" + jsonValue + "\"}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleUint32);
-        }
-
-        // Assume that anything non-bounds-related is covered in the Int32 case
-        [Test]
-        [TestCase("-1")]
-        [TestCase("4294967296")]
-        public void StringToUInt32_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleUint32\": \"" + jsonValue + "\"}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0L)]
-        [TestCase("1", 1L)]
-        [TestCase("-1", -1L)]
-        [TestCase("9223372036854775807", 9223372036854775807)]
-        [TestCase("-9223372036854775808", -9223372036854775808)]
-        public void StringToInt64_Valid(string jsonValue, long expectedParsedValue)
-        {
-            string json = "{ \"singleInt64\": \"" + jsonValue + "\"}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleInt64);
-        }
-
-        // Assume that anything non-bounds-related is covered in the Int32 case
-        [Test]
-        [TestCase("-9223372036854775809")]
-        [TestCase("9223372036854775808")]
-        public void StringToInt64_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleInt64\": \"" + jsonValue + "\"}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0UL)]
-        [TestCase("1", 1UL)]
-        [TestCase("18446744073709551615", 18446744073709551615)]
-        public void StringToUInt64_Valid(string jsonValue, ulong expectedParsedValue)
-        {
-            string json = "{ \"singleUint64\": \"" + jsonValue + "\"}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleUint64);
-        }
-
-        // Assume that anything non-bounds-related is covered in the Int32 case
-        [Test]
-        [TestCase("-1")]
-        [TestCase("18446744073709551616")]
-        public void StringToUInt64_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleUint64\": \"" + jsonValue + "\"}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0d)]
-        [TestCase("1", 1d)]
-        [TestCase("1.000000", 1d)]
-        [TestCase("1.0000000000000000000000001", 1d)] // We don't notice that we haven't preserved the exact value
-        [TestCase("-1", -1d)]
-        [TestCase("1e1", 10d)]
-        [TestCase("1e01", 10d)] // Leading decimals are allowed in exponents
-        [TestCase("1E1", 10d)] // Either case is fine
-        [TestCase("-1e1", -10d)]
-        [TestCase("1.5e1", 15d)]
-        [TestCase("-1.5e1", -15d)]
-        [TestCase("15e-1", 1.5d)]
-        [TestCase("-15e-1", -1.5d)]
-        [TestCase("1.79769e308", 1.79769e308)]
-        [TestCase("-1.79769e308", -1.79769e308)]
-        [TestCase("Infinity", double.PositiveInfinity)]
-        [TestCase("-Infinity", double.NegativeInfinity)]
-        [TestCase("NaN", double.NaN)]
-        public void StringToDouble_Valid(string jsonValue, double expectedParsedValue)
-        {
-            string json = "{ \"singleDouble\": \"" + jsonValue + "\"}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleDouble);
-        }
-
-        [Test]
-        [TestCase("1.7977e308")]
-        [TestCase("-1.7977e308")]
-        [TestCase("1e309")]
-        [TestCase("1,0")]
-        [TestCase("1.0.0")]
-        [TestCase("+1")]
-        [TestCase("00")]
-        [TestCase("01")]
-        [TestCase("-00")]
-        [TestCase("-01")]
-        [TestCase("--1")]
-        [TestCase(" Infinity")]
-        [TestCase(" -Infinity")]
-        [TestCase("NaN ")]
-        [TestCase("Infinity ")]
-        [TestCase("-Infinity ")]
-        [TestCase(" NaN")]
-        [TestCase("INFINITY")]
-        [TestCase("nan")]
-        [TestCase("\u00BD")] // 1/2 as a single Unicode character. Just sanity checking...
-        public void StringToDouble_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleDouble\": \"" + jsonValue + "\"}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0f)]
-        [TestCase("1", 1f)]
-        [TestCase("1.000000", 1f)]
-        [TestCase("-1", -1f)]
-        [TestCase("3.402823e38", 3.402823e38f)]
-        [TestCase("-3.402823e38", -3.402823e38f)]
-        [TestCase("1.5e1", 15f)]
-        [TestCase("15e-1", 1.5f)]
-        public void StringToFloat_Valid(string jsonValue, float expectedParsedValue)
-        {
-            string json = "{ \"singleFloat\": \"" + jsonValue + "\"}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleFloat);
-        }
-
-        [Test]
-        [TestCase("3.402824e38")]
-        [TestCase("-3.402824e38")]
-        [TestCase("1,0")]
-        [TestCase("1.0.0")]
-        [TestCase("+1")]
-        [TestCase("00")]
-        [TestCase("--1")]
-        public void StringToFloat_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleFloat\": \"" + jsonValue + "\"}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0)]
-        [TestCase("-0", 0)] // Not entirely clear whether we intend to allow this...
-        [TestCase("1", 1)]
-        [TestCase("-1", -1)]
-        [TestCase("2147483647", 2147483647)]
-        [TestCase("-2147483648", -2147483648)]
-        [TestCase("1e1", 10)]
-        [TestCase("-1e1", -10)]
-        [TestCase("10.00", 10)]
-        [TestCase("-10.00", -10)]
-        public void NumberToInt32_Valid(string jsonValue, int expectedParsedValue)
-        {
-            string json = "{ \"singleInt32\": " + jsonValue + "}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleInt32);
-        }
-
-        [Test]
-        [TestCase("+0", typeof(InvalidJsonException))]
-        [TestCase("00", typeof(InvalidJsonException))]
-        [TestCase("-00", typeof(InvalidJsonException))]
-        [TestCase("--1", typeof(InvalidJsonException))]
-        [TestCase("+1", typeof(InvalidJsonException))]
-        [TestCase("1.5", typeof(InvalidProtocolBufferException))]
-        // Value is out of range
-        [TestCase("1e10", typeof(InvalidProtocolBufferException))]
-        [TestCase("2147483648", typeof(InvalidProtocolBufferException))]
-        [TestCase("-2147483649", typeof(InvalidProtocolBufferException))]
-        public void NumberToInt32_Invalid(string jsonValue, System.Type expectedExceptionType)
-        {
-            string json = "{ \"singleInt32\": " + jsonValue + "}";
-            Assert.Throws(expectedExceptionType, () => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0U)]
-        [TestCase("1", 1U)]
-        [TestCase("4294967295", 4294967295U)]
-        public void NumberToUInt32_Valid(string jsonValue, uint expectedParsedValue)
-        {
-            string json = "{ \"singleUint32\": " + jsonValue + "}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleUint32);
-        }
-
-        // Assume that anything non-bounds-related is covered in the Int32 case
-        [Test]
-        [TestCase("-1")]
-        [TestCase("4294967296")]
-        public void NumberToUInt32_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleUint32\": " + jsonValue + "}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0L)]
-        [TestCase("1", 1L)]
-        [TestCase("-1", -1L)]
-        // long.MaxValue isn't actually representable as a double. This string value is the highest
-        // representable value which isn't greater than long.MaxValue.
-        [TestCase("9223372036854774784", 9223372036854774784)]
-        [TestCase("-9223372036854775808", -9223372036854775808)]
-        public void NumberToInt64_Valid(string jsonValue, long expectedParsedValue)
-        {
-            string json = "{ \"singleInt64\": " + jsonValue + "}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleInt64);
-        }
-
-        // Assume that anything non-bounds-related is covered in the Int32 case
-        [Test]
-        [TestCase("9223372036854775808")]
-        // Theoretical bound would be -9223372036854775809, but when that is parsed to a double
-        // we end up with the exact value of long.MinValue due to lack of precision. The value here
-        // is the "next double down".
-        [TestCase("-9223372036854780000")]
-        public void NumberToInt64_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleInt64\": " + jsonValue + "}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0UL)]
-        [TestCase("1", 1UL)]
-        // ulong.MaxValue isn't representable as a double. This value is the largest double within
-        // the range of ulong.
-        [TestCase("18446744073709549568", 18446744073709549568UL)]
-        public void NumberToUInt64_Valid(string jsonValue, ulong expectedParsedValue)
-        {
-            string json = "{ \"singleUint64\": " + jsonValue + "}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleUint64);
-        }
-
-        // Assume that anything non-bounds-related is covered in the Int32 case
-        [Test]
-        [TestCase("-1")]
-        [TestCase("18446744073709551616")]
-        public void NumberToUInt64_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleUint64\": " + jsonValue + "}";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0d)]
-        [TestCase("1", 1d)]
-        [TestCase("1.000000", 1d)]
-        [TestCase("1.0000000000000000000000001", 1d)] // We don't notice that we haven't preserved the exact value
-        [TestCase("-1", -1d)]
-        [TestCase("1e1", 10d)]
-        [TestCase("1e01", 10d)] // Leading decimals are allowed in exponents
-        [TestCase("1E1", 10d)] // Either case is fine
-        [TestCase("-1e1", -10d)]
-        [TestCase("1.5e1", 15d)]
-        [TestCase("-1.5e1", -15d)]
-        [TestCase("15e-1", 1.5d)]
-        [TestCase("-15e-1", -1.5d)]
-        [TestCase("1.79769e308", 1.79769e308)]
-        [TestCase("-1.79769e308", -1.79769e308)]
-        public void NumberToDouble_Valid(string jsonValue, double expectedParsedValue)
-        {
-            string json = "{ \"singleDouble\": " + jsonValue + "}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleDouble);
-        }
-
-        [Test]
-        [TestCase("1.7977e308")]
-        [TestCase("-1.7977e308")]
-        [TestCase("1e309")]
-        [TestCase("1,0")]
-        [TestCase("1.0.0")]
-        [TestCase("+1")]
-        [TestCase("00")]
-        [TestCase("--1")]
-        [TestCase("\u00BD")] // 1/2 as a single Unicode character. Just sanity checking...
-        public void NumberToDouble_Invalid(string jsonValue)
-        {
-            string json = "{ \"singleDouble\": " + jsonValue + "}";
-            Assert.Throws<InvalidJsonException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("0", 0f)]
-        [TestCase("1", 1f)]
-        [TestCase("1.000000", 1f)]
-        [TestCase("-1", -1f)]
-        [TestCase("3.402823e38", 3.402823e38f)]
-        [TestCase("-3.402823e38", -3.402823e38f)]
-        [TestCase("1.5e1", 15f)]
-        [TestCase("15e-1", 1.5f)]
-        public void NumberToFloat_Valid(string jsonValue, float expectedParsedValue)
-        {
-            string json = "{ \"singleFloat\": " + jsonValue + "}";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(expectedParsedValue, parsed.SingleFloat);
-        }
-
-        [Test]
-        [TestCase("3.402824e38", typeof(InvalidProtocolBufferException))]
-        [TestCase("-3.402824e38", typeof(InvalidProtocolBufferException))]
-        [TestCase("1,0", typeof(InvalidJsonException))]
-        [TestCase("1.0.0", typeof(InvalidJsonException))]
-        [TestCase("+1", typeof(InvalidJsonException))]
-        [TestCase("00", typeof(InvalidJsonException))]
-        [TestCase("--1", typeof(InvalidJsonException))]
-        public void NumberToFloat_Invalid(string jsonValue, System.Type expectedExceptionType)
-        {
-            string json = "{ \"singleFloat\": " + jsonValue + "}";
-            Assert.Throws(expectedExceptionType, () => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        // The simplest way of testing that the value has parsed correctly is to reformat it,
-        // as we trust the formatting. In many cases that will give the same result as the input,
-        // so in those cases we accept an expectedFormatted value of null. Sometimes the results
-        // will be different though, due to a different number of digits being provided.
-        [Test]
-        // Z offset
-        [TestCase("2015-10-09T14:46:23.123456789Z", null)]
-        [TestCase("2015-10-09T14:46:23.123456Z", null)]
-        [TestCase("2015-10-09T14:46:23.123Z", null)]
-        [TestCase("2015-10-09T14:46:23Z", null)]
-        [TestCase("2015-10-09T14:46:23.123456000Z", "2015-10-09T14:46:23.123456Z")]
-        [TestCase("2015-10-09T14:46:23.1234560Z", "2015-10-09T14:46:23.123456Z")]
-        [TestCase("2015-10-09T14:46:23.123000000Z", "2015-10-09T14:46:23.123Z")]
-        [TestCase("2015-10-09T14:46:23.1230Z", "2015-10-09T14:46:23.123Z")]
-        [TestCase("2015-10-09T14:46:23.00Z", "2015-10-09T14:46:23Z")]
-
-        // +00:00 offset
-        [TestCase("2015-10-09T14:46:23.123456789+00:00", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-09T14:46:23.123456+00:00", "2015-10-09T14:46:23.123456Z")]
-        [TestCase("2015-10-09T14:46:23.123+00:00", "2015-10-09T14:46:23.123Z")]
-        [TestCase("2015-10-09T14:46:23+00:00", "2015-10-09T14:46:23Z")]
-        [TestCase("2015-10-09T14:46:23.123456000+00:00", "2015-10-09T14:46:23.123456Z")]
-        [TestCase("2015-10-09T14:46:23.1234560+00:00", "2015-10-09T14:46:23.123456Z")]
-        [TestCase("2015-10-09T14:46:23.123000000+00:00", "2015-10-09T14:46:23.123Z")]
-        [TestCase("2015-10-09T14:46:23.1230+00:00", "2015-10-09T14:46:23.123Z")]
-        [TestCase("2015-10-09T14:46:23.00+00:00", "2015-10-09T14:46:23Z")]
-
-        // Other offsets (assume by now that the subsecond handling is okay)
-        [TestCase("2015-10-09T15:46:23.123456789+01:00", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-09T13:46:23.123456789-01:00", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-09T15:16:23.123456789+00:30", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-09T14:16:23.123456789-00:30", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-09T16:31:23.123456789+01:45", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-09T13:01:23.123456789-01:45", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-10T08:46:23.123456789+18:00", "2015-10-09T14:46:23.123456789Z")]
-        [TestCase("2015-10-08T20:46:23.123456789-18:00", "2015-10-09T14:46:23.123456789Z")]
-
-        // Leap years and min/max
-        [TestCase("2016-02-29T14:46:23.123456789Z", null)]
-        [TestCase("2000-02-29T14:46:23.123456789Z", null)]
-        [TestCase("0001-01-01T00:00:00Z", null)]
-        [TestCase("9999-12-31T23:59:59.999999999Z", null)]
-        public void Timestamp_Valid(string jsonValue, string expectedFormatted)
-        {
-            expectedFormatted = expectedFormatted ?? jsonValue;
-            string json = WrapInQuotes(jsonValue);
-            var parsed = Timestamp.Parser.ParseJson(json);
-            Assert.AreEqual(WrapInQuotes(expectedFormatted), parsed.ToString());
-        }
-
-        [Test]
-        [TestCase("2015-10-09 14:46:23.123456789Z", Description = "No T between date and time")]
-        [TestCase("2015/10/09T14:46:23.123456789Z", Description = "Wrong date separators")]
-        [TestCase("2015-10-09T14.46.23.123456789Z", Description = "Wrong time separators")]
-        [TestCase("2015-10-09T14:46:23,123456789Z", Description = "Wrong fractional second separators (valid ISO-8601 though)")]
-        [TestCase(" 2015-10-09T14:46:23.123456789Z", Description = "Whitespace at start")]
-        [TestCase("2015-10-09T14:46:23.123456789Z ", Description = "Whitespace at end")]
-        [TestCase("2015-10-09T14:46:23.1234567890", Description = "Too many digits")]
-        [TestCase("2015-10-09T14:46:23.123456789", Description = "No offset")]
-        [TestCase("2015-13-09T14:46:23.123456789Z", Description = "Invalid month")]
-        [TestCase("2015-10-32T14:46:23.123456789Z", Description = "Invalid day")]
-        [TestCase("2015-10-09T24:00:00.000000000Z", Description = "Invalid hour (valid ISO-8601 though)")]
-        [TestCase("2015-10-09T14:60:23.123456789Z", Description = "Invalid minutes")]
-        [TestCase("2015-10-09T14:46:60.123456789Z", Description = "Invalid seconds")]
-        [TestCase("2015-10-09T14:46:23.123456789+18:01", Description = "Offset too large (positive)")]
-        [TestCase("2015-10-09T14:46:23.123456789-18:01", Description = "Offset too large (negative)")]
-        [TestCase("2015-10-09T14:46:23.123456789-00:00", Description = "Local offset (-00:00) makes no sense here")]
-        [TestCase("0001-01-01T00:00:00+00:01", Description = "Value before earliest when offset applied")]
-        [TestCase("9999-12-31T23:59:59.999999999-00:01", Description = "Value after latest when offset applied")]
-        [TestCase("2100-02-29T14:46:23.123456789Z", Description = "Feb 29th on a non-leap-year")]
-        public void Timestamp_Invalid(string jsonValue)
-        {
-            string json = WrapInQuotes(jsonValue);
-            Assert.Throws<InvalidProtocolBufferException>(() => Timestamp.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void StructValue_Null()
-        {
-            Assert.AreEqual(new Value { NullValue = 0 }, Value.Parser.ParseJson("null"));
-        }
-
-        [Test]
-        public void StructValue_String()
-        {
-            Assert.AreEqual(new Value { StringValue = "hi" }, Value.Parser.ParseJson("\"hi\""));
-        }
-
-        [Test]
-        public void StructValue_Bool()
-        {
-            Assert.AreEqual(new Value { BoolValue = true }, Value.Parser.ParseJson("true"));
-            Assert.AreEqual(new Value { BoolValue = false }, Value.Parser.ParseJson("false"));
-        }
-
-        [Test]
-        public void StructValue_List()
-        {
-            Assert.AreEqual(Value.ForList(Value.ForNumber(1), Value.ForString("x")), Value.Parser.ParseJson("[1, \"x\"]"));
-        }
-
-        [Test]
-        public void ParseListValue()
-        {
-            Assert.AreEqual(new ListValue { Values = { Value.ForNumber(1), Value.ForString("x") } }, ListValue.Parser.ParseJson("[1, \"x\"]"));
-        }
-
-        [Test]
-        public void StructValue_Struct()
-        {
-            Assert.AreEqual(
-                Value.ForStruct(new Struct { Fields = { { "x", Value.ForNumber(1) }, { "y", Value.ForString("z") } } }),
-                Value.Parser.ParseJson("{ \"x\": 1, \"y\": \"z\" }"));
-        }
-
-        [Test]
-        public void ParseStruct()
-        {
-            Assert.AreEqual(new Struct { Fields = { { "x", Value.ForNumber(1) }, { "y", Value.ForString("z") } } },
-                Struct.Parser.ParseJson("{ \"x\": 1, \"y\": \"z\" }"));
-        }
-
-        // TODO for duration parsing: upper and lower bounds.
-        // +/- 315576000000 seconds
-
-        [Test]
-        [TestCase("1.123456789s", null)]
-        [TestCase("1.123456s", null)]
-        [TestCase("1.123s", null)]
-        [TestCase("1.12300s", "1.123s")]
-        [TestCase("1.12345s", "1.123450s")]
-        [TestCase("1s", null)]
-        [TestCase("-1.123456789s", null)]
-        [TestCase("-1.123456s", null)]
-        [TestCase("-1.123s", null)]
-        [TestCase("-1s", null)]
-        [TestCase("0.123s", null)]
-        [TestCase("-0.123s", null)]
-        [TestCase("123456.123s", null)]
-        [TestCase("-123456.123s", null)]
-        // Upper and lower bounds
-        [TestCase("315576000000s", null)]
-        [TestCase("-315576000000s", null)]
-        public void Duration_Valid(string jsonValue, string expectedFormatted)
-        {
-            expectedFormatted = expectedFormatted ?? jsonValue;
-            string json = WrapInQuotes(jsonValue);
-            var parsed = Duration.Parser.ParseJson(json);
-            Assert.AreEqual(WrapInQuotes(expectedFormatted), parsed.ToString());
-        }
-
-        // The simplest way of testing that the value has parsed correctly is to reformat it,
-        // as we trust the formatting. In many cases that will give the same result as the input,
-        // so in those cases we accept an expectedFormatted value of null. Sometimes the results
-        // will be different though, due to a different number of digits being provided.
-        [Test]
-        [TestCase("1.1234567890s", Description = "Too many digits")]
-        [TestCase("1.123456789", Description = "No suffix")]
-        [TestCase("1.123456789ss", Description = "Too much suffix")]
-        [TestCase("1.123456789S", Description = "Upper case suffix")]
-        [TestCase("+1.123456789s", Description = "Leading +")]
-        [TestCase(".123456789s", Description = "No integer before the fraction")]
-        [TestCase("1,123456789s", Description = "Comma as decimal separator")]
-        [TestCase("1x1.123456789s", Description = "Non-digit in integer part")]
-        [TestCase("1.1x3456789s", Description = "Non-digit in fractional part")]
-        [TestCase(" 1.123456789s", Description = "Whitespace before fraction")]
-        [TestCase("1.123456789s ", Description = "Whitespace after value")]
-        [TestCase("01.123456789s", Description = "Leading zero (positive)")]
-        [TestCase("-01.123456789s", Description = "Leading zero (negative)")]
-        [TestCase("--0.123456789s", Description = "Double minus sign")]
-        // Violate upper/lower bounds in various ways
-        [TestCase("315576000001s", Description = "Integer part too large")]
-        [TestCase("3155760000000s", Description = "Integer part too long (positive)")]
-        [TestCase("-3155760000000s", Description = "Integer part too long (negative)")]
-        public void Duration_Invalid(string jsonValue)
-        {
-            string json = WrapInQuotes(jsonValue);
-            Assert.Throws<InvalidProtocolBufferException>(() => Duration.Parser.ParseJson(json));
-        }
-
-        // Not as many tests for field masks as I'd like; more to be added when we have more
-        // detailed specifications.
-
-        [Test]
-        [TestCase("")]
-        [TestCase("foo", "foo")]
-        [TestCase("foo,bar", "foo", "bar")]
-        [TestCase("foo.bar", "foo.bar")]
-        [TestCase("fooBar", "foo_bar")]
-        [TestCase("fooBar.bazQux", "foo_bar.baz_qux")]
-        public void FieldMask_Valid(string jsonValue, params string[] expectedPaths)
-        {
-            string json = WrapInQuotes(jsonValue);
-            var parsed = FieldMask.Parser.ParseJson(json);
-            CollectionAssert.AreEqual(expectedPaths, parsed.Paths);
-        }
-
-        [Test]
-        [TestCase("foo_bar")]
-        public void FieldMask_Invalid(string jsonValue)
-        {
-            string json = WrapInQuotes(jsonValue);
-            Assert.Throws<InvalidProtocolBufferException>(() => FieldMask.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void Any_RegularMessage()
-        {
-            var registry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
-            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, TypeRegistry.FromMessages(TestAllTypes.Descriptor)));
-            var message = new TestAllTypes { SingleInt32 = 10, SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 } };
-            var original = Any.Pack(message);
-            var json = formatter.Format(original); // This is tested in JsonFormatterTest
-            var parser = new JsonParser(new JsonParser.Settings(10, registry));
-            Assert.AreEqual(original, parser.Parse<Any>(json));
-            string valueFirstJson = "{ \"singleInt32\": 10, \"singleNestedMessage\": { \"bb\": 20 }, \"@type\": \"type.googleapis.com/protobuf_unittest.TestAllTypes\" }";
-            Assert.AreEqual(original, parser.Parse<Any>(valueFirstJson));
-        }
-
-        [Test]
-        public void Any_CustomPrefix()
-        {
-            var registry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
-            var message = new TestAllTypes { SingleInt32 = 10 };
-            var original = Any.Pack(message, "custom.prefix/middle-part");
-            var parser = new JsonParser(new JsonParser.Settings(10, registry));
-            string json = "{ \"@type\": \"custom.prefix/middle-part/protobuf_unittest.TestAllTypes\", \"singleInt32\": 10 }";
-            Assert.AreEqual(original, parser.Parse<Any>(json));
-        }
-
-        [Test]
-        public void Any_UnknownType()
-        {
-            string json = "{ \"@type\": \"type.googleapis.com/bogus\" }";
-            Assert.Throws<InvalidOperationException>(() => Any.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void Any_NoTypeUrl()
-        {
-            string json = "{ \"foo\": \"bar\" }";
-            Assert.Throws<InvalidProtocolBufferException>(() => Any.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void Any_WellKnownType()
-        {
-            var registry = TypeRegistry.FromMessages(Timestamp.Descriptor);
-            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, registry));
-            var timestamp = new DateTime(1673, 6, 19, 12, 34, 56, DateTimeKind.Utc).ToTimestamp();
-            var original = Any.Pack(timestamp);
-            var json = formatter.Format(original); // This is tested in JsonFormatterTest
-            var parser = new JsonParser(new JsonParser.Settings(10, registry));
-            Assert.AreEqual(original, parser.Parse<Any>(json));
-            string valueFirstJson = "{ \"value\": \"1673-06-19T12:34:56Z\", \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\" }";
-            Assert.AreEqual(original, parser.Parse<Any>(valueFirstJson));
-        }
-
-        [Test]
-        public void Any_Nested()
-        {
-            var registry = TypeRegistry.FromMessages(TestWellKnownTypes.Descriptor, TestAllTypes.Descriptor);
-            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, registry));
-            var parser = new JsonParser(new JsonParser.Settings(10, registry));
-            var doubleNestedMessage = new TestAllTypes { SingleInt32 = 20 };
-            var nestedMessage = Any.Pack(doubleNestedMessage);
-            var message = new TestWellKnownTypes { AnyField = Any.Pack(nestedMessage) };
-            var json = formatter.Format(message);
-            // Use the descriptor-based parser just for a change.
-            Assert.AreEqual(message, parser.Parse(json, TestWellKnownTypes.Descriptor));
-        }
-
-        [Test]
-        public void DataAfterObject()
-        {
-            string json = "{} 10";
-            Assert.Throws<InvalidJsonException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        /// <summary>
-        /// JSON equivalent to <see cref="CodedInputStreamTest.MaliciousRecursion"/>
-        /// </summary>
-        [Test]
-        public void MaliciousRecursion()
-        {
-            string data64 = CodedInputStreamTest.MakeRecursiveMessage(64).ToString();
-            string data65 = CodedInputStreamTest.MakeRecursiveMessage(65).ToString();
-
-            var parser64 = new JsonParser(new JsonParser.Settings(64));
-            CodedInputStreamTest.AssertMessageDepth(parser64.Parse<TestRecursiveMessage>(data64), 64);
-            Assert.Throws<InvalidProtocolBufferException>(() => parser64.Parse<TestRecursiveMessage>(data65));
-
-            var parser63 = new JsonParser(new JsonParser.Settings(63));
-            Assert.Throws<InvalidProtocolBufferException>(() => parser63.Parse<TestRecursiveMessage>(data64));
-        }
-
-        [Test]
-        [TestCase("AQI")]
-        [TestCase("_-==")]
-        public void Bytes_InvalidBase64(string badBase64)
-        {
-            string json = "{ \"singleBytes\": \"" + badBase64 + "\" }";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("\"FOREIGN_BAR\"", ForeignEnum.ForeignBar)]
-        [TestCase("5", ForeignEnum.ForeignBar)]
-        [TestCase("100", (ForeignEnum)100)]
-        public void EnumValid(string value, ForeignEnum expectedValue)
-        {
-            string json = "{ \"singleForeignEnum\": " + value + " }";
-            var parsed = TestAllTypes.Parser.ParseJson(json);
-            Assert.AreEqual(new TestAllTypes { SingleForeignEnum = expectedValue }, parsed);
-        }
-
-        [Test]
-        [TestCase("\"NOT_A_VALID_VALUE\"")]
-        [TestCase("5.5")]
-        public void Enum_Invalid(string value)
-        {
-            string json = "{ \"singleForeignEnum\": " + value + " }";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        public void OneofDuplicate_Invalid()
-        {
-            string json = "{ \"oneofString\": \"x\", \"oneofUint32\": 10 }";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        /// <summary>
-        /// Various tests use strings which have quotes round them for parsing or as the result
-        /// of formatting, but without those quotes being specified in the tests (for the sake of readability).
-        /// This method simply returns the input, wrapped in double quotes.
-        /// </summary>
-        internal static string WrapInQuotes(string text)
-        {
-            return '"' + text + '"';
-        }
-    }
-}
\ No newline at end of file
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/JsonTokenizerTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/JsonTokenizerTest.cs
deleted file mode 100644
index 527ab33..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/JsonTokenizerTest.cs
+++ /dev/null
@@ -1,408 +0,0 @@
-#region Copyright notice and license
-// 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.
-#endregion
-using NUnit.Framework;
-using System;
-using System.IO;
-
-namespace Google.Protobuf
-{
-    public class JsonTokenizerTest
-    {
-        [Test]
-        public void EmptyObjectValue()
-        {
-            AssertTokens("{}", JsonToken.StartObject, JsonToken.EndObject);
-        }
-
-        [Test]
-        public void EmptyArrayValue()
-        {
-            AssertTokens("[]", JsonToken.StartArray, JsonToken.EndArray);
-        }
-
-        [Test]
-        [TestCase("foo", "foo")]
-        [TestCase("tab\\t", "tab\t")]
-        [TestCase("line\\nfeed", "line\nfeed")]
-        [TestCase("carriage\\rreturn", "carriage\rreturn")]
-        [TestCase("back\\bspace", "back\bspace")]
-        [TestCase("form\\ffeed", "form\ffeed")]
-        [TestCase("escaped\\/slash", "escaped/slash")]
-        [TestCase("escaped\\\\backslash", "escaped\\backslash")]
-        [TestCase("escaped\\\"quote", "escaped\"quote")]
-        [TestCase("foo {}[] bar", "foo {}[] bar")]
-        [TestCase("foo\\u09aFbar", "foo\u09afbar")] // Digits, upper hex, lower hex
-        [TestCase("ab\ud800\udc00cd", "ab\ud800\udc00cd")]
-        [TestCase("ab\\ud800\\udc00cd", "ab\ud800\udc00cd")]
-        public void StringValue(string json, string expectedValue)
-        {
-            AssertTokensNoReplacement("\"" + json + "\"", JsonToken.Value(expectedValue));
-        }
-
-        // Valid surrogate pairs, with mixed escaping. These test cases can't be expressed
-        // using TestCase as they have no valid UTF-8 representation.
-        // It's unclear exactly how we should handle a mixture of escaped or not: that can't
-        // come from UTF-8 text, but could come from a .NET string. For the moment,
-        // treat it as valid in the obvious way.
-        [Test]
-        public void MixedSurrogatePairs()
-        {
-            string expected = "\ud800\udc00";
-            AssertTokens("'\\ud800\udc00'", JsonToken.Value(expected));
-            AssertTokens("'\ud800\\udc00'", JsonToken.Value(expected));
-        }
-
-        [Test]
-        public void ObjectDepth()
-        {
-            string json = "{ \"foo\": { \"x\": 1, \"y\": [ 0 ] } }";
-            var tokenizer = JsonTokenizer.FromTextReader(new StringReader(json));
-            // If we had more tests like this, I'd introduce a helper method... but for one test, it's not worth it.
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.StartObject, tokenizer.Next());
-            Assert.AreEqual(1, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.Name("foo"), tokenizer.Next());
-            Assert.AreEqual(1, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.StartObject, tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.Name("x"), tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.Value(1), tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.Name("y"), tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.StartArray, tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth); // Depth hasn't changed in array
-            Assert.AreEqual(JsonToken.Value(0), tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.EndArray, tokenizer.Next());
-            Assert.AreEqual(2, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.EndObject, tokenizer.Next());
-            Assert.AreEqual(1, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.EndObject, tokenizer.Next());
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-            Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-        }
-
-        [Test]
-        public void ObjectDepth_WithPushBack()
-        {
-            string json = "{}";
-            var tokenizer = JsonTokenizer.FromTextReader(new StringReader(json));
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-            var token = tokenizer.Next();
-            Assert.AreEqual(1, tokenizer.ObjectDepth);
-            // When we push back a "start object", we should effectively be back to the previous depth.
-            tokenizer.PushBack(token);
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-            // Read the same token again, and get back to depth 1
-            token = tokenizer.Next();
-            Assert.AreEqual(1, tokenizer.ObjectDepth);
-
-            // Now the same in reverse, with EndObject
-            token = tokenizer.Next();
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-            tokenizer.PushBack(token);
-            Assert.AreEqual(1, tokenizer.ObjectDepth);
-            tokenizer.Next();
-            Assert.AreEqual(0, tokenizer.ObjectDepth);
-        }
-
-        [Test]
-        [TestCase("embedded tab\t")]
-        [TestCase("embedded CR\r")]
-        [TestCase("embedded LF\n")]
-        [TestCase("embedded bell\u0007")]
-        [TestCase("bad escape\\a")]
-        [TestCase("incomplete escape\\")]
-        [TestCase("incomplete Unicode escape\\u000")]
-        [TestCase("invalid Unicode escape\\u000H")]
-        // Surrogate pair handling, both in raw .NET strings and escaped. We only need
-        // to detect this in strings, as non-ASCII characters anywhere other than in strings
-        // will already lead to parsing errors.
-        [TestCase("\\ud800")]
-        [TestCase("\\udc00")]
-        [TestCase("\\ud800x")]
-        [TestCase("\\udc00x")]
-        [TestCase("\\udc00\\ud800y")]
-        public void InvalidStringValue(string json)
-        {
-            AssertThrowsAfter("\"" + json + "\"");
-        }
-
-        // Tests for invalid strings that can't be expressed in attributes,
-        // as the constants can't be expressed as UTF-8 strings.
-        [Test]
-        public void InvalidSurrogatePairs()
-        {
-            AssertThrowsAfter("\"\ud800x\"");
-            AssertThrowsAfter("\"\udc00y\"");
-            AssertThrowsAfter("\"\udc00\ud800y\"");
-        }
-
-        [Test]
-        [TestCase("0", 0)]
-        [TestCase("-0", 0)] // We don't distinguish between positive and negative 0
-        [TestCase("1", 1)]
-        [TestCase("-1", -1)]
-        // From here on, assume leading sign is okay...
-        [TestCase("1.125", 1.125)]
-        [TestCase("1.0", 1)]
-        [TestCase("1e5", 100000)]
-        [TestCase("1e000000", 1)] // Weird, but not prohibited by the spec
-        [TestCase("1E5", 100000)]
-        [TestCase("1e+5", 100000)]
-        [TestCase("1E-5", 0.00001)]
-        [TestCase("123E-2", 1.23)]
-        [TestCase("123.45E3", 123450)]
-        [TestCase("   1   ", 1)]
-        public void NumberValue(string json, double expectedValue)
-        {
-            AssertTokens(json, JsonToken.Value(expectedValue));
-        }
-
-        [Test]
-        [TestCase("00")]
-        [TestCase(".5")]
-        [TestCase("1.")]
-        [TestCase("1e")]
-        [TestCase("1e-")]
-        [TestCase("--")]
-        [TestCase("--1")]
-        [TestCase("-1.7977e308")]
-        [TestCase("1.7977e308")]
-        public void InvalidNumberValue(string json)
-        {
-            AssertThrowsAfter(json);
-        }
-
-        [Test]
-        [TestCase("nul")]
-        [TestCase("nothing")]
-        [TestCase("truth")]
-        [TestCase("fALSEhood")]
-        public void InvalidLiterals(string json)
-        {
-            AssertThrowsAfter(json);
-        }
-
-        [Test]
-        public void NullValue()
-        {
-            AssertTokens("null", JsonToken.Null);
-        }
-
-        [Test]
-        public void TrueValue()
-        {
-            AssertTokens("true", JsonToken.True);
-        }
-
-        [Test]
-        public void FalseValue()
-        {
-            AssertTokens("false", JsonToken.False);
-        }
-
-        [Test]
-        public void SimpleObject()
-        {
-            AssertTokens("{'x': 'y'}",
-                JsonToken.StartObject, JsonToken.Name("x"), JsonToken.Value("y"), JsonToken.EndObject);
-        }
-        
-        [Test]
-        [TestCase("[10, 20", 3)]
-        [TestCase("[10,", 2)]
-        [TestCase("[10:20]", 2)]
-        [TestCase("[", 1)]
-        [TestCase("[,", 1)]
-        [TestCase("{", 1)]
-        [TestCase("{,", 1)]
-        [TestCase("{[", 1)]
-        [TestCase("{{", 1)]
-        [TestCase("{0", 1)]
-        [TestCase("{null", 1)]
-        [TestCase("{false", 1)]
-        [TestCase("{true", 1)]
-        [TestCase("}", 0)]
-        [TestCase("]", 0)]
-        [TestCase(",", 0)]
-        [TestCase("'foo' 'bar'", 1)]
-        [TestCase(":", 0)]
-        [TestCase("'foo", 0)] // Incomplete string
-        [TestCase("{ 'foo' }", 2)]
-        [TestCase("{ x:1", 1)] // Property names must be quoted
-        [TestCase("{]", 1)]
-        [TestCase("[}", 1)]
-        [TestCase("[1,", 2)]
-        [TestCase("{'x':0]", 3)]
-        [TestCase("{ 'foo': }", 2)]
-        [TestCase("{ 'foo':'bar', }", 3)]
-        public void InvalidStructure(string json, int expectedValidTokens)
-        {
-            // Note: we don't test that the earlier tokens are exactly as expected,
-            // partly because that's hard to parameterize.
-            var reader = new StringReader(json.Replace('\'', '"'));
-            var tokenizer = JsonTokenizer.FromTextReader(reader);
-            for (int i = 0; i < expectedValidTokens; i++)
-            {
-                Assert.IsNotNull(tokenizer.Next());
-            }
-            Assert.Throws<InvalidJsonException>(() => tokenizer.Next());
-        }
-
-        [Test]
-        public void ArrayMixedType()
-        {
-            AssertTokens("[1, 'foo', null, false, true, [2], {'x':'y' }]",
-                JsonToken.StartArray,
-                JsonToken.Value(1),
-                JsonToken.Value("foo"),
-                JsonToken.Null,
-                JsonToken.False,
-                JsonToken.True,
-                JsonToken.StartArray,
-                JsonToken.Value(2),
-                JsonToken.EndArray,
-                JsonToken.StartObject,
-                JsonToken.Name("x"),
-                JsonToken.Value("y"),
-                JsonToken.EndObject,
-                JsonToken.EndArray);
-        }
-
-        [Test]
-        public void ObjectMixedType()
-        {
-            AssertTokens(@"{'a': 1, 'b': 'bar', 'c': null, 'd': false, 'e': true, 
-                           'f': [2], 'g': {'x':'y' }}",
-                JsonToken.StartObject,
-                JsonToken.Name("a"),
-                JsonToken.Value(1),
-                JsonToken.Name("b"),
-                JsonToken.Value("bar"),
-                JsonToken.Name("c"),
-                JsonToken.Null,
-                JsonToken.Name("d"),
-                JsonToken.False,
-                JsonToken.Name("e"),
-                JsonToken.True,
-                JsonToken.Name("f"),
-                JsonToken.StartArray,
-                JsonToken.Value(2),
-                JsonToken.EndArray,
-                JsonToken.Name("g"),
-                JsonToken.StartObject,
-                JsonToken.Name("x"),
-                JsonToken.Value("y"),
-                JsonToken.EndObject,
-                JsonToken.EndObject);
-        }
-
-        [Test]
-        public void NextAfterEndDocumentThrows()
-        {
-            var tokenizer = JsonTokenizer.FromTextReader(new StringReader("null"));
-            Assert.AreEqual(JsonToken.Null, tokenizer.Next());
-            Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
-            Assert.Throws<InvalidOperationException>(() => tokenizer.Next());
-        }
-
-        [Test]
-        public void CanPushBackEndDocument()
-        {
-            var tokenizer = JsonTokenizer.FromTextReader(new StringReader("null"));
-            Assert.AreEqual(JsonToken.Null, tokenizer.Next());
-            Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
-            tokenizer.PushBack(JsonToken.EndDocument);
-            Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
-            Assert.Throws<InvalidOperationException>(() => tokenizer.Next());
-        }
-       
-        /// <summary>
-        /// Asserts that the specified JSON is tokenized into the given sequence of tokens.
-        /// All apostrophes are first converted to double quotes, allowing any tests
-        /// that don't need to check actual apostrophe handling to use apostrophes in the JSON, avoiding
-        /// messy string literal escaping. The "end document" token is not specified in the list of 
-        /// expected tokens, but is implicit.
-        /// </summary>
-        private static void AssertTokens(string json, params JsonToken[] expectedTokens)
-        {
-            AssertTokensNoReplacement(json.Replace('\'', '"'), expectedTokens);
-        }
-
-        /// <summary>
-        /// Asserts that the specified JSON is tokenized into the given sequence of tokens.
-        /// Unlike <see cref="AssertTokens(string, JsonToken[])"/>, this does not perform any character
-        /// replacement on the specified JSON, and should be used when the text contains apostrophes which
-        /// are expected to be used *as* apostrophes. The "end document" token is not specified in the list of 
-        /// expected tokens, but is implicit.
-        /// </summary>
-        private static void AssertTokensNoReplacement(string json, params JsonToken[] expectedTokens)
-        {
-            var reader = new StringReader(json);
-            var tokenizer = JsonTokenizer.FromTextReader(reader);
-            for (int i = 0; i < expectedTokens.Length; i++)
-            {
-                var actualToken = tokenizer.Next();
-                if (actualToken == JsonToken.EndDocument)
-                {
-                    Assert.Fail("Expected {0} but reached end of token stream", expectedTokens[i]);
-                }
-                Assert.AreEqual(expectedTokens[i], actualToken);
-            }
-            var finalToken = tokenizer.Next();
-            if (finalToken != JsonToken.EndDocument)
-            {
-                Assert.Fail("Expected token stream to be exhausted; received {0}", finalToken);
-            }
-        }
-
-        private static void AssertThrowsAfter(string json, params JsonToken[] expectedTokens)
-        {
-            var reader = new StringReader(json);
-            var tokenizer = JsonTokenizer.FromTextReader(reader);
-            for (int i = 0; i < expectedTokens.Length; i++)
-            {
-                var actualToken = tokenizer.Next();
-                if (actualToken == JsonToken.EndDocument)
-                {
-                    Assert.Fail("Expected {0} but reached end of document", expectedTokens[i]);
-                }
-                Assert.AreEqual(expectedTokens[i], actualToken);
-            }
-            Assert.Throws<InvalidJsonException>(() => tokenizer.Next());
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Program.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Program.cs
deleted file mode 100644
index 9078e59..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Program.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-using NUnitLite;
-using System.Reflection;
-
-// Note: this file wasn't in the actual 3.0, but is required due to build
-// system changes
-
-namespace Google.Protobuf.Test
-{
-    class Program
-    {
-        public static int Main(string[] args)
-        {
-            return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args);
-        }
-    }
-}
\ No newline at end of file
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
deleted file mode 100644
index 52d5a67..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
+++ /dev/null
@@ -1,259 +0,0 @@
-#region Copyright notice and license
-// 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.
-#endregion
-
-using System.Linq;
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-using UnitTest.Issues.TestProtos;
-
-namespace Google.Protobuf.Reflection
-{
-    /// <summary>
-    /// Tests for descriptors. (Not in its own namespace or broken up into individual classes as the
-    /// size doesn't warrant it. On the other hand, this makes me feel a bit dirty...)
-    /// </summary>
-    public class DescriptorsTest
-    {
-        [Test]
-        public void FileDescriptor()
-        {
-            FileDescriptor file = UnittestProto3Reflection.Descriptor;
-
-            Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Name);
-            Assert.AreEqual("protobuf_unittest", file.Package);
-
-            Assert.AreEqual("UnittestProto", file.Proto.Options.JavaOuterClassname);
-            Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Proto.Name);
-
-            // unittest.proto doesn't have any public imports, but unittest_import.proto does.
-            Assert.AreEqual(0, file.PublicDependencies.Count);
-            Assert.AreEqual(1, UnittestImportProto3Reflection.Descriptor.PublicDependencies.Count);
-            Assert.AreEqual(UnittestImportPublicProto3Reflection.Descriptor, UnittestImportProto3Reflection.Descriptor.PublicDependencies[0]);
-
-            Assert.AreEqual(1, file.Dependencies.Count);
-            Assert.AreEqual(UnittestImportProto3Reflection.Descriptor, file.Dependencies[0]);
-
-            MessageDescriptor messageType = TestAllTypes.Descriptor;
-            Assert.AreSame(typeof(TestAllTypes), messageType.ClrType);
-            Assert.AreSame(TestAllTypes.Parser, messageType.Parser);
-            Assert.AreEqual(messageType, file.MessageTypes[0]);
-            Assert.AreEqual(messageType, file.FindTypeByName<MessageDescriptor>("TestAllTypes"));
-            Assert.Null(file.FindTypeByName<MessageDescriptor>("NoSuchType"));
-            Assert.Null(file.FindTypeByName<MessageDescriptor>("protobuf_unittest.TestAllTypes"));
-            for (int i = 0; i < file.MessageTypes.Count; i++)
-            {
-                Assert.AreEqual(i, file.MessageTypes[i].Index);
-            }
-
-            Assert.AreEqual(file.EnumTypes[0], file.FindTypeByName<EnumDescriptor>("ForeignEnum"));
-            Assert.Null(file.FindTypeByName<EnumDescriptor>("NoSuchType"));
-            Assert.Null(file.FindTypeByName<EnumDescriptor>("protobuf_unittest.ForeignEnum"));
-            Assert.AreEqual(1, UnittestImportProto3Reflection.Descriptor.EnumTypes.Count);
-            Assert.AreEqual("ImportEnum", UnittestImportProto3Reflection.Descriptor.EnumTypes[0].Name);
-            for (int i = 0; i < file.EnumTypes.Count; i++)
-            {
-                Assert.AreEqual(i, file.EnumTypes[i].Index);
-            }
-
-            Assert.AreEqual(10, file.SerializedData[0]);
-        }
-
-        [Test]
-        public void MessageDescriptor()
-        {
-            MessageDescriptor messageType = TestAllTypes.Descriptor;
-            MessageDescriptor nestedType = TestAllTypes.Types.NestedMessage.Descriptor;
-
-            Assert.AreEqual("TestAllTypes", messageType.Name);
-            Assert.AreEqual("protobuf_unittest.TestAllTypes", messageType.FullName);
-            Assert.AreEqual(UnittestProto3Reflection.Descriptor, messageType.File);
-            Assert.IsNull(messageType.ContainingType);
-            Assert.IsNull(messageType.Proto.Options);
-
-            Assert.AreEqual("TestAllTypes", messageType.Name);
-
-            Assert.AreEqual("NestedMessage", nestedType.Name);
-            Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedMessage", nestedType.FullName);
-            Assert.AreEqual(UnittestProto3Reflection.Descriptor, nestedType.File);
-            Assert.AreEqual(messageType, nestedType.ContainingType);
-
-            FieldDescriptor field = messageType.Fields.InDeclarationOrder()[0];
-            Assert.AreEqual("single_int32", field.Name);
-            Assert.AreEqual(field, messageType.FindDescriptor<FieldDescriptor>("single_int32"));
-            Assert.Null(messageType.FindDescriptor<FieldDescriptor>("no_such_field"));
-            Assert.AreEqual(field, messageType.FindFieldByNumber(1));
-            Assert.Null(messageType.FindFieldByNumber(571283));
-            var fieldsInDeclarationOrder = messageType.Fields.InDeclarationOrder();
-            for (int i = 0; i < fieldsInDeclarationOrder.Count; i++)
-            {
-                Assert.AreEqual(i, fieldsInDeclarationOrder[i].Index);
-            }
-
-            Assert.AreEqual(nestedType, messageType.NestedTypes[0]);
-            Assert.AreEqual(nestedType, messageType.FindDescriptor<MessageDescriptor>("NestedMessage"));
-            Assert.Null(messageType.FindDescriptor<MessageDescriptor>("NoSuchType"));
-            for (int i = 0; i < messageType.NestedTypes.Count; i++)
-            {
-                Assert.AreEqual(i, messageType.NestedTypes[i].Index);
-            }
-
-            Assert.AreEqual(messageType.EnumTypes[0], messageType.FindDescriptor<EnumDescriptor>("NestedEnum"));
-            Assert.Null(messageType.FindDescriptor<EnumDescriptor>("NoSuchType"));
-            for (int i = 0; i < messageType.EnumTypes.Count; i++)
-            {
-                Assert.AreEqual(i, messageType.EnumTypes[i].Index);
-            }
-        }
-
-        [Test]
-        public void FieldDescriptor()
-        {
-            MessageDescriptor messageType = TestAllTypes.Descriptor;
-            FieldDescriptor primitiveField = messageType.FindDescriptor<FieldDescriptor>("single_int32");
-            FieldDescriptor enumField = messageType.FindDescriptor<FieldDescriptor>("single_nested_enum");
-            FieldDescriptor messageField = messageType.FindDescriptor<FieldDescriptor>("single_foreign_message");
-
-            Assert.AreEqual("single_int32", primitiveField.Name);
-            Assert.AreEqual("protobuf_unittest.TestAllTypes.single_int32",
-                            primitiveField.FullName);
-            Assert.AreEqual(1, primitiveField.FieldNumber);
-            Assert.AreEqual(messageType, primitiveField.ContainingType);
-            Assert.AreEqual(UnittestProto3Reflection.Descriptor, primitiveField.File);
-            Assert.AreEqual(FieldType.Int32, primitiveField.FieldType);
-            Assert.IsNull(primitiveField.Proto.Options);
-            
-            Assert.AreEqual("single_nested_enum", enumField.Name);
-            Assert.AreEqual(FieldType.Enum, enumField.FieldType);
-            // Assert.AreEqual(TestAllTypes.Types.NestedEnum.DescriptorProtoFile, enumField.EnumType);
-
-            Assert.AreEqual("single_foreign_message", messageField.Name);
-            Assert.AreEqual(FieldType.Message, messageField.FieldType);
-            Assert.AreEqual(ForeignMessage.Descriptor, messageField.MessageType);
-        }
-
-        [Test]
-        public void FieldDescriptorLabel()
-        {
-            FieldDescriptor singleField =
-                TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("single_int32");
-            FieldDescriptor repeatedField =
-                TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("repeated_int32");
-
-            Assert.IsFalse(singleField.IsRepeated);
-            Assert.IsTrue(repeatedField.IsRepeated);
-        }
-
-        [Test]
-        public void EnumDescriptor()
-        {
-            // Note: this test is a bit different to the Java version because there's no static way of getting to the descriptor
-            EnumDescriptor enumType = UnittestProto3Reflection.Descriptor.FindTypeByName<EnumDescriptor>("ForeignEnum");
-            EnumDescriptor nestedType = TestAllTypes.Descriptor.FindDescriptor<EnumDescriptor>("NestedEnum");
-
-            Assert.AreEqual("ForeignEnum", enumType.Name);
-            Assert.AreEqual("protobuf_unittest.ForeignEnum", enumType.FullName);
-            Assert.AreEqual(UnittestProto3Reflection.Descriptor, enumType.File);
-            Assert.Null(enumType.ContainingType);
-            Assert.Null(enumType.Proto.Options);
-
-            Assert.AreEqual("NestedEnum", nestedType.Name);
-            Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedEnum",
-                            nestedType.FullName);
-            Assert.AreEqual(UnittestProto3Reflection.Descriptor, nestedType.File);
-            Assert.AreEqual(TestAllTypes.Descriptor, nestedType.ContainingType);
-
-            EnumValueDescriptor value = enumType.FindValueByName("FOREIGN_FOO");
-            Assert.AreEqual(value, enumType.Values[1]);
-            Assert.AreEqual("FOREIGN_FOO", value.Name);
-            Assert.AreEqual(4, value.Number);
-            Assert.AreEqual((int) ForeignEnum.ForeignFoo, value.Number);
-            Assert.AreEqual(value, enumType.FindValueByNumber(4));
-            Assert.Null(enumType.FindValueByName("NO_SUCH_VALUE"));
-            for (int i = 0; i < enumType.Values.Count; i++)
-            {
-                Assert.AreEqual(i, enumType.Values[i].Index);
-            }
-        }
-
-        [Test]
-        public void OneofDescriptor()
-        {
-            OneofDescriptor descriptor = TestAllTypes.Descriptor.FindDescriptor<OneofDescriptor>("oneof_field");
-            Assert.AreEqual("oneof_field", descriptor.Name);
-            Assert.AreEqual("protobuf_unittest.TestAllTypes.oneof_field", descriptor.FullName);
-
-            var expectedFields = new[] {
-                TestAllTypes.OneofBytesFieldNumber,
-                TestAllTypes.OneofNestedMessageFieldNumber,
-                TestAllTypes.OneofStringFieldNumber,
-                TestAllTypes.OneofUint32FieldNumber }
-                .Select(fieldNumber => TestAllTypes.Descriptor.FindFieldByNumber(fieldNumber))
-                .ToList();
-            foreach (var field in expectedFields)
-            {
-                Assert.AreSame(descriptor, field.ContainingOneof);
-            }
-
-            CollectionAssert.AreEquivalent(expectedFields, descriptor.Fields);
-        }
-
-        [Test]
-        public void MapEntryMessageDescriptor()
-        {
-            var descriptor = MapWellKnownTypes.Descriptor.NestedTypes[0];
-            Assert.IsNull(descriptor.Parser);
-            Assert.IsNull(descriptor.ClrType);
-            Assert.IsNull(descriptor.Fields[1].Accessor);
-        }
-
-        // From TestFieldOrdering:
-        // string my_string = 11;
-        // int64 my_int = 1;
-        // float my_float = 101;
-        // NestedMessage single_nested_message = 200;
-        [Test]
-        public void FieldListOrderings()
-        { 
-            var fields = TestFieldOrderings.Descriptor.Fields;
-            Assert.AreEqual(new[] { 11, 1, 101, 200 }, fields.InDeclarationOrder().Select(x => x.FieldNumber));
-            Assert.AreEqual(new[] { 1, 11, 101, 200 }, fields.InFieldNumberOrder().Select(x => x.FieldNumber));
-        }
-
-
-        [Test]
-        public void DescriptorProtoFileDescriptor()
-        {
-            var descriptor = Google.Protobuf.Reflection.FileDescriptor.DescriptorProtoFileDescriptor;
-            Assert.AreEqual("google/protobuf/descriptor.proto", descriptor.Name);
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs
deleted file mode 100644
index a488af3..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs
+++ /dev/null
@@ -1,218 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-
-namespace Google.Protobuf.Reflection
-{
-    public class FieldAccessTest
-    {
-        [Test]
-        public void GetValue()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var fields = TestAllTypes.Descriptor.Fields;
-            Assert.AreEqual(message.SingleBool, fields[TestAllTypes.SingleBoolFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleBytes, fields[TestAllTypes.SingleBytesFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleDouble, fields[TestAllTypes.SingleDoubleFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleFixed32, fields[TestAllTypes.SingleFixed32FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleFixed64, fields[TestAllTypes.SingleFixed64FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleFloat, fields[TestAllTypes.SingleFloatFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleForeignEnum, fields[TestAllTypes.SingleForeignEnumFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleForeignMessage, fields[TestAllTypes.SingleForeignMessageFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleImportEnum, fields[TestAllTypes.SingleImportEnumFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleImportMessage, fields[TestAllTypes.SingleImportMessageFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleInt32, fields[TestAllTypes.SingleInt32FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleInt64, fields[TestAllTypes.SingleInt64FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleNestedEnum, fields[TestAllTypes.SingleNestedEnumFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleNestedMessage, fields[TestAllTypes.SingleNestedMessageFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SinglePublicImportMessage, fields[TestAllTypes.SinglePublicImportMessageFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleSint32, fields[TestAllTypes.SingleSint32FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleSint64, fields[TestAllTypes.SingleSint64FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleString, fields[TestAllTypes.SingleStringFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleSfixed32, fields[TestAllTypes.SingleSfixed32FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleSfixed64, fields[TestAllTypes.SingleSfixed64FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleUint32, fields[TestAllTypes.SingleUint32FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.SingleUint64, fields[TestAllTypes.SingleUint64FieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.OneofBytes, fields[TestAllTypes.OneofBytesFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.OneofString, fields[TestAllTypes.OneofStringFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.OneofNestedMessage, fields[TestAllTypes.OneofNestedMessageFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(message.OneofUint32, fields[TestAllTypes.OneofUint32FieldNumber].Accessor.GetValue(message));
-
-            // Just one example for repeated fields - they're all just returning the list
-            var list = (IList) fields[TestAllTypes.RepeatedInt32FieldNumber].Accessor.GetValue(message);
-            Assert.AreEqual(message.RepeatedInt32, list);
-            Assert.AreEqual(message.RepeatedInt32[0], list[0]); // Just in case there was any doubt...
-
-            // Just a single map field, for the same reason
-            var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
-            fields = TestMap.Descriptor.Fields;
-            var dictionary = (IDictionary) fields[TestMap.MapStringStringFieldNumber].Accessor.GetValue(mapMessage);
-            Assert.AreEqual(mapMessage.MapStringString, dictionary);
-            Assert.AreEqual("value1", dictionary["key1"]);
-        }
-
-        [Test]
-        public void Clear()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var fields = TestAllTypes.Descriptor.Fields;
-            fields[TestAllTypes.SingleBoolFieldNumber].Accessor.Clear(message);
-            fields[TestAllTypes.SingleInt32FieldNumber].Accessor.Clear(message);
-            fields[TestAllTypes.SingleStringFieldNumber].Accessor.Clear(message);
-            fields[TestAllTypes.SingleBytesFieldNumber].Accessor.Clear(message);
-            fields[TestAllTypes.SingleForeignEnumFieldNumber].Accessor.Clear(message);
-            fields[TestAllTypes.SingleForeignMessageFieldNumber].Accessor.Clear(message);
-            fields[TestAllTypes.RepeatedDoubleFieldNumber].Accessor.Clear(message);
-
-            var expected = new TestAllTypes(SampleMessages.CreateFullTestAllTypes())
-            {
-                SingleBool = false,
-                SingleInt32 = 0,
-                SingleString = "",
-                SingleBytes = ByteString.Empty,
-                SingleForeignEnum = 0,
-                SingleForeignMessage = null,
-            };
-            expected.RepeatedDouble.Clear();
-
-            Assert.AreEqual(expected, message);
-
-            // Separately, maps.
-            var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
-            fields = TestMap.Descriptor.Fields;
-            fields[TestMap.MapStringStringFieldNumber].Accessor.Clear(mapMessage);
-            Assert.AreEqual(0, mapMessage.MapStringString.Count);
-        }
-
-        [Test]
-        public void SetValue_SingleFields()
-        {
-            // Just a sample (primitives, messages, enums, strings, byte strings)
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var fields = TestAllTypes.Descriptor.Fields;
-            fields[TestAllTypes.SingleBoolFieldNumber].Accessor.SetValue(message, false);
-            fields[TestAllTypes.SingleInt32FieldNumber].Accessor.SetValue(message, 500);
-            fields[TestAllTypes.SingleStringFieldNumber].Accessor.SetValue(message, "It's a string");
-            fields[TestAllTypes.SingleBytesFieldNumber].Accessor.SetValue(message, ByteString.CopyFrom(99, 98, 97));
-            fields[TestAllTypes.SingleForeignEnumFieldNumber].Accessor.SetValue(message, ForeignEnum.ForeignFoo);
-            fields[TestAllTypes.SingleForeignMessageFieldNumber].Accessor.SetValue(message, new ForeignMessage { C = 12345 });
-            fields[TestAllTypes.SingleDoubleFieldNumber].Accessor.SetValue(message, 20150701.5);
-
-            var expected = new TestAllTypes(SampleMessages.CreateFullTestAllTypes())
-            {
-                SingleBool = false,
-                SingleInt32 = 500,
-                SingleString = "It's a string",
-                SingleBytes = ByteString.CopyFrom(99, 98, 97),
-                SingleForeignEnum = ForeignEnum.ForeignFoo,
-                SingleForeignMessage = new ForeignMessage { C = 12345 },
-                SingleDouble = 20150701.5
-            };
-
-            Assert.AreEqual(expected, message);
-        }
-
-        [Test]
-        public void SetValue_SingleFields_WrongType()
-        {
-            IMessage message = SampleMessages.CreateFullTestAllTypes();
-            var fields = message.Descriptor.Fields;
-            Assert.Throws<InvalidCastException>(() => fields[TestAllTypes.SingleBoolFieldNumber].Accessor.SetValue(message, "This isn't a bool"));
-        }
-
-        [Test]
-        public void SetValue_MapFields()
-        {
-            IMessage message = new TestMap();
-            var fields = message.Descriptor.Fields;
-            Assert.Throws<InvalidOperationException>(() => fields[TestMap.MapStringStringFieldNumber].Accessor.SetValue(message, new Dictionary<string, string>()));
-        }
-
-        [Test]
-        public void SetValue_RepeatedFields()
-        {
-            IMessage message = SampleMessages.CreateFullTestAllTypes();
-            var fields = message.Descriptor.Fields;
-            Assert.Throws<InvalidOperationException>(() => fields[TestAllTypes.RepeatedDoubleFieldNumber].Accessor.SetValue(message, new double[10]));
-        }
-
-        [Test]
-        public void GetValue_IncorrectType()
-        {
-            IMessage message = SampleMessages.CreateFullTestAllTypes();
-            var fields = message.Descriptor.Fields;
-            Assert.Throws<InvalidCastException>(() => fields[TestAllTypes.SingleBoolFieldNumber].Accessor.GetValue(new TestMap()));
-        }
-
-        [Test]
-        public void Oneof()
-        {
-            var message = new TestAllTypes();
-            var descriptor = TestAllTypes.Descriptor;
-            Assert.AreEqual(1, descriptor.Oneofs.Count);
-            var oneof = descriptor.Oneofs[0];
-            Assert.AreEqual("oneof_field", oneof.Name);
-            Assert.IsNull(oneof.Accessor.GetCaseFieldDescriptor(message));
-
-            message.OneofString = "foo";
-            Assert.AreSame(descriptor.Fields[TestAllTypes.OneofStringFieldNumber], oneof.Accessor.GetCaseFieldDescriptor(message));
-
-            message.OneofUint32 = 10;
-            Assert.AreSame(descriptor.Fields[TestAllTypes.OneofUint32FieldNumber], oneof.Accessor.GetCaseFieldDescriptor(message));
-
-            oneof.Accessor.Clear(message);
-            Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
-        }
-
-        [Test]
-        public void FieldDescriptor_ByName()
-        {
-            var descriptor = TestAllTypes.Descriptor;
-            Assert.AreSame(
-                descriptor.Fields[TestAllTypes.SingleBoolFieldNumber],
-                descriptor.Fields["single_bool"]);
-        }
-
-        [Test]
-        public void FieldDescriptor_NotFound()
-        {
-            var descriptor = TestAllTypes.Descriptor;
-            Assert.Throws<KeyNotFoundException>(() => descriptor.Fields[999999].ToString());
-            Assert.Throws<KeyNotFoundException>(() => descriptor.Fields["not found"].ToString());
-        }        
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs
deleted file mode 100644
index 5be7ca2..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using Google.Protobuf.TestProtos;
-using Google.Protobuf.WellKnownTypes;
-using NUnit.Framework;
-
-namespace Google.Protobuf.Reflection
-{
-    public class TypeRegistryTest
-    {
-        // Most of our tests use messages. Simple test that we really can use files...
-        [Test]
-        public void CreateWithFileDescriptor()
-        {
-            var registry = TypeRegistry.FromFiles(DurationReflection.Descriptor, StructReflection.Descriptor);
-            AssertDescriptorPresent(registry, Duration.Descriptor);
-            AssertDescriptorPresent(registry, ListValue.Descriptor);
-            AssertDescriptorAbsent(registry, Timestamp.Descriptor);
-        }
-
-        [Test]
-        public void TypesFromSameFile()
-        {
-            // Just for kicks, let's start with a nested type
-            var registry = TypeRegistry.FromMessages(TestAllTypes.Types.NestedMessage.Descriptor);
-            // Top-level...
-            AssertDescriptorPresent(registry, TestFieldOrderings.Descriptor);
-            // ... and nested (not the same as the original NestedMessage!)
-            AssertDescriptorPresent(registry, TestFieldOrderings.Types.NestedMessage.Descriptor);
-        }
-
-        [Test]
-        public void DependenciesAreIncluded()
-        {
-            var registry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
-            // Direct dependencies
-            AssertDescriptorPresent(registry, ImportMessage.Descriptor);
-            // Public dependencies
-            AssertDescriptorPresent(registry, PublicImportMessage.Descriptor);
-        }
-
-        [Test]
-        public void DuplicateFiles()
-        {
-            // Duplicates via dependencies and simply via repetition
-            var registry = TypeRegistry.FromFiles(
-                UnittestProto3Reflection.Descriptor, UnittestImportProto3Reflection.Descriptor,
-                TimestampReflection.Descriptor, TimestampReflection.Descriptor);
-            AssertDescriptorPresent(registry, TestAllTypes.Descriptor);
-            AssertDescriptorPresent(registry, ImportMessage.Descriptor);
-            AssertDescriptorPresent(registry, Timestamp.Descriptor);
-        }
-
-        private static void AssertDescriptorPresent(TypeRegistry registry, MessageDescriptor descriptor)
-        {
-            Assert.AreSame(descriptor, registry.Find(descriptor.FullName));
-        }
-
-        private static void AssertDescriptorAbsent(TypeRegistry registry, MessageDescriptor descriptor)
-        {
-            Assert.IsNull(registry.Find(descriptor.FullName));
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/SampleEnum.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/SampleEnum.cs
deleted file mode 100644
index 77447af..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/SampleEnum.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-    
-namespace Google.Protobuf
-{
-    // Just a sample enum with positive and negative values to be used in tests.
-    internal enum SampleEnum
-    {
-        NegativeValue = -2,
-        None = 0,
-        PositiveValue = 3
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/SampleMessages.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/SampleMessages.cs
deleted file mode 100644
index ffa4e2a..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/SampleMessages.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System;
-using Google.Protobuf.TestProtos;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Helper methods to create sample instances of types generated from unit test messages.
-    /// </summary>
-    public class SampleMessages
-    {
-        /// <summary>
-        /// Creates a new sample TestAllTypes message with all fields populated.
-        /// The "oneof" field is populated with the string property (OneofString).
-        /// </summary>
-        public static TestAllTypes CreateFullTestAllTypes()
-        {
-            return new TestAllTypes
-            {
-                SingleBool = true,
-                SingleBytes = ByteString.CopyFrom(1, 2, 3, 4),
-                SingleDouble = 23.5,
-                SingleFixed32 = 23,
-                SingleFixed64 = 1234567890123,
-                SingleFloat = 12.25f,
-                SingleForeignEnum = ForeignEnum.ForeignBar,
-                SingleForeignMessage = new ForeignMessage { C = 10 },
-                SingleImportEnum = ImportEnum.ImportBaz,
-                SingleImportMessage = new ImportMessage { D = 20 },
-                SingleInt32 = 100,
-                SingleInt64 = 3210987654321,
-                SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo,
-                SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 35 },
-                SinglePublicImportMessage = new PublicImportMessage { E = 54 },
-                SingleSfixed32 = -123,
-                SingleSfixed64 = -12345678901234,
-                SingleSint32 = -456,
-                SingleSint64 = -12345678901235,
-                SingleString = "test",
-                SingleUint32 = UInt32.MaxValue,
-                SingleUint64 = UInt64.MaxValue,
-                RepeatedBool = { true, false },
-                RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6), ByteString.CopyFrom(new byte[1000]) },
-                RepeatedDouble = { -12.25, 23.5 },
-                RepeatedFixed32 = { UInt32.MaxValue, 23 },
-                RepeatedFixed64 = { UInt64.MaxValue, 1234567890123 },
-                RepeatedFloat = { 100f, 12.25f },
-                RepeatedForeignEnum = { ForeignEnum.ForeignFoo, ForeignEnum.ForeignBar },
-                RepeatedForeignMessage = { new ForeignMessage(), new ForeignMessage { C = 10 } },
-                RepeatedImportEnum = { ImportEnum.ImportBaz, ImportEnum.Unspecified },
-                RepeatedImportMessage = { new ImportMessage { D = 20 }, new ImportMessage { D = 25 } },
-                RepeatedInt32 = { 100, 200 },
-                RepeatedInt64 = { 3210987654321, Int64.MaxValue },
-                RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg },
-                RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 35 }, new TestAllTypes.Types.NestedMessage { Bb = 10 } },
-                RepeatedPublicImportMessage = { new PublicImportMessage { E = 54 }, new PublicImportMessage { E = -1 } },
-                RepeatedSfixed32 = { -123, 123 },
-                RepeatedSfixed64 = { -12345678901234, 12345678901234 },
-                RepeatedSint32 = { -456, 100 },
-                RepeatedSint64 = { -12345678901235, 123 },
-                RepeatedString = { "foo", "bar" },
-                RepeatedUint32 = { UInt32.MaxValue, UInt32.MinValue },
-                RepeatedUint64 = { UInt64.MaxValue, UInt32.MinValue },
-                OneofString = "Oneof string"
-            };
-        }
-    }
-}
\ No newline at end of file
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/TestCornerCases.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/TestCornerCases.cs
deleted file mode 100644
index 248f5fa..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/TestCornerCases.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-#region Copyright notice and license

-// 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.

-#endregion

-    

-using UnitTest.Issues.TestProtos;

-using NUnit.Framework;

-

-namespace Google.Protobuf

-{

-    public class TestCornerCases

-    {

-        [Test]

-        public void TestRoundTripNegativeEnums()

-        {

-            NegativeEnumMessage msg = new NegativeEnumMessage

-            {

-                Value = NegativeEnum.MinusOne,

-                Values = { NegativeEnum.Zero, NegativeEnum.MinusOne, NegativeEnum.FiveBelow },

-                PackedValues = { NegativeEnum.Zero, NegativeEnum.MinusOne, NegativeEnum.FiveBelow }

-            };

-

-            Assert.AreEqual(58, msg.CalculateSize());

-

-            byte[] bytes = new byte[58];

-            CodedOutputStream output = new CodedOutputStream(bytes);

-

-            msg.WriteTo(output);

-            Assert.AreEqual(0, output.SpaceLeft);

-

-            NegativeEnumMessage copy = NegativeEnumMessage.Parser.ParseFrom(bytes);

-            Assert.AreEqual(msg, copy);

-        }

-    }

-}

diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs
deleted file mode 100644
index 5663a69..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-#endregion
-
-namespace Google.Protobuf.TestProtos
-{
-    /// <summary>
-    /// A message with custom diagnostics (to test that they work).
-    /// </summary>
-    public partial class ForeignMessage : ICustomDiagnosticMessage
-    {
-        public string ToDiagnosticString()
-        {
-            return $"{{ \"c\": {C}, \"@cInHex\": \"{C:x}\" }}";
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
deleted file mode 100644
index 4aecc99..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-
-namespace Google.Protobuf.WellKnownTypes
-{
-    public class AnyTest
-    {
-        [Test]
-        public void Pack()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message);
-            Assert.AreEqual("type.googleapis.com/protobuf_unittest.TestAllTypes", any.TypeUrl);
-            Assert.AreEqual(message.CalculateSize(), any.Value.Length);
-        }
-
-        [Test]
-        public void Pack_WithCustomPrefix()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message, "foo.bar/baz");
-            Assert.AreEqual("foo.bar/baz/protobuf_unittest.TestAllTypes", any.TypeUrl);
-            Assert.AreEqual(message.CalculateSize(), any.Value.Length);
-        }
-
-        [Test]
-        public void Pack_WithCustomPrefixTrailingSlash()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message, "foo.bar/baz/");
-            Assert.AreEqual("foo.bar/baz/protobuf_unittest.TestAllTypes", any.TypeUrl);
-            Assert.AreEqual(message.CalculateSize(), any.Value.Length);
-        }
-
-        [Test]
-        public void Unpack_WrongType()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message);
-            Assert.Throws<InvalidProtocolBufferException>(() => any.Unpack<TestOneof>());
-        }
-
-        [Test]
-        public void Unpack_Success()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message);
-            var unpacked = any.Unpack<TestAllTypes>();
-            Assert.AreEqual(message, unpacked);
-        }
-
-        [Test]
-        public void Unpack_CustomPrefix_Success()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message, "foo.bar/baz");
-            var unpacked = any.Unpack<TestAllTypes>();
-            Assert.AreEqual(message, unpacked);
-        }
-
-        [Test]
-        public void ToString_WithValues()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message);
-            var text = any.ToString();
-            Assert.That(text, Does.Contain("\"@value\": \"" + message.ToByteString().ToBase64() + "\""));
-        }
-
-        [Test]
-        public void ToString_Empty()
-        {
-            var any = new Any();
-            Assert.AreEqual("{ \"@type\": \"\", \"@value\": \"\" }", any.ToString());
-        }
-
-        [Test]
-        public void ToString_MessageContainingAny()
-        {
-            var message = new TestWellKnownTypes { AnyField = new Any() };
-            Assert.AreEqual("{ \"anyField\": { \"@type\": \"\", \"@value\": \"\" } }", message.ToString());
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs
deleted file mode 100644
index 141faf8..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using NUnit.Framework;
-using System;
-
-namespace Google.Protobuf.WellKnownTypes
-{
-    public class DurationTest
-    {
-        [Test]
-        public void ToTimeSpan()
-        {
-            Assert.AreEqual(TimeSpan.FromSeconds(1), new Duration { Seconds = 1 }.ToTimeSpan());
-            Assert.AreEqual(TimeSpan.FromSeconds(-1), new Duration { Seconds = -1 }.ToTimeSpan());
-            Assert.AreEqual(TimeSpan.FromMilliseconds(1), new Duration { Nanos = 1000000 }.ToTimeSpan());
-            Assert.AreEqual(TimeSpan.FromMilliseconds(-1), new Duration { Nanos = -1000000 }.ToTimeSpan());
-            Assert.AreEqual(TimeSpan.FromTicks(1), new Duration { Nanos = 100 }.ToTimeSpan());
-            Assert.AreEqual(TimeSpan.FromTicks(-1), new Duration { Nanos = -100 }.ToTimeSpan());
-
-            // Rounding is towards 0
-            Assert.AreEqual(TimeSpan.FromTicks(2), new Duration { Nanos = 250 }.ToTimeSpan());
-            Assert.AreEqual(TimeSpan.FromTicks(-2), new Duration { Nanos = -250 }.ToTimeSpan());
-        }
-
-        [Test]
-        public void Addition()
-        {
-            Assert.AreEqual(new Duration { Seconds = 2, Nanos = 100000000 },
-                new Duration { Seconds = 1, Nanos = 600000000 } + new Duration { Nanos = 500000000 });
-            Assert.AreEqual(new Duration { Seconds = -2, Nanos = -100000000 },
-                new Duration { Seconds = -1, Nanos = -600000000 } + new Duration { Nanos = -500000000 });
-            Assert.AreEqual(new Duration { Seconds = 1, Nanos = 100000000 },
-                new Duration { Seconds = 1, Nanos = 600000000 } + new Duration { Nanos = -500000000 });
-
-            // Non-normalized durations, or non-normalized intermediate results
-            Assert.AreEqual(new Duration { Seconds = 1 },
-                new Duration { Seconds = 1, Nanos = -500000000 } + new Duration { Nanos = 500000000 });
-
-            Assert.AreEqual(new Duration { Nanos = -900000000 },
-                new Duration { Seconds = -1, Nanos = -100000000 } + new Duration { Nanos = 200000000 });
-            Assert.AreEqual(new Duration { Nanos = 900000000 },
-                new Duration { Seconds = 1, Nanos = 100000000 } + new Duration { Nanos = -200000000 });
-        }
-
-        [Test]
-        public void Subtraction()
-        {
-            Assert.AreEqual(new Duration { Seconds = 1, Nanos = 100000000 },
-                new Duration { Seconds = 1, Nanos = 600000000 } - new Duration { Nanos = 500000000 });
-            Assert.AreEqual(new Duration { Seconds = -1, Nanos = -100000000 },
-                new Duration { Seconds = -1, Nanos = -600000000 } - new Duration { Nanos = -500000000 });
-            Assert.AreEqual(new Duration { Seconds = 2, Nanos = 100000000 },
-                new Duration { Seconds = 1, Nanos = 600000000 } - new Duration { Nanos = -500000000 });
-
-            // Non-normalized durations
-            Assert.AreEqual(new Duration(),
-                new Duration { Seconds = 1, Nanos = -500000000 } - new Duration { Nanos = 500000000 });
-            Assert.AreEqual(new Duration { Seconds = 1 },
-                new Duration { Nanos = 2000000000 } - new Duration { Nanos = 1000000000 });
-        }
-
-        [Test]
-        public void FromTimeSpan()
-        {
-            Assert.AreEqual(new Duration { Seconds = 1 }, Duration.FromTimeSpan(TimeSpan.FromSeconds(1)));
-            Assert.AreEqual(new Duration { Nanos = Duration.NanosecondsPerTick }, Duration.FromTimeSpan(TimeSpan.FromTicks(1)));
-        }
-
-        [Test]
-        [TestCase(0, Duration.MaxNanoseconds + 1)]
-        [TestCase(0, Duration.MinNanoseconds - 1)]
-        [TestCase(Duration.MinSeconds - 1, 0)]
-        [TestCase(Duration.MaxSeconds + 1, 0)]
-        [TestCase(1, -1)]
-        [TestCase(-1, 1)]
-        public void ToTimeSpan_Invalid(long seconds, int nanoseconds)
-        {
-            var duration = new Duration { Seconds = seconds, Nanos = nanoseconds };
-            Assert.Throws<InvalidOperationException>(() => duration.ToTimeSpan());
-        }
-
-        [Test]
-        [TestCase(0, Duration.MaxNanoseconds)]
-        [TestCase(0, Duration.MinNanoseconds)]
-        [TestCase(Duration.MinSeconds, Duration.MinNanoseconds)]
-        [TestCase(Duration.MaxSeconds, Duration.MaxNanoseconds)]
-        public void ToTimeSpan_Valid(long seconds, int nanoseconds)
-        {
-            // Only testing that these values don't throw, unlike their similar tests in ToTimeSpan_Invalid
-            var duration = new Duration { Seconds = seconds, Nanos = nanoseconds };
-            duration.ToTimeSpan();
-        }
-
-        [Test]
-        public void ToString_NonNormalized()
-        {
-            // Just a single example should be sufficient...
-            var duration = new Duration { Seconds = 1, Nanos = -1 };
-            Assert.AreEqual("{ \"@warning\": \"Invalid Duration\", \"seconds\": \"1\", \"nanos\": -1 }", duration.ToString());
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs
deleted file mode 100644
index 1d9908b..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-#endregion
-
-
-using NUnit.Framework;
-
-namespace Google.Protobuf.WellKnownTypes
-{
-    public class FieldMaskTest
-    {
-        [Test]
-        [TestCase("foo__bar")]
-        [TestCase("foo_3_ar")]
-        [TestCase("fooBar")]
-        public void ToString_Invalid(string input)
-        {
-            var mask = new FieldMask { Paths = { input } };
-            var text = mask.ToString();
-            // More specific test below
-            Assert.That(text, Does.Contain("@warning"));
-            Assert.That(text, Does.Contain(input));
-        }
-
-        [Test]
-        public void ToString_Invalid_Precise()
-        {
-            var mask = new FieldMask { Paths = { "x", "foo__bar", @"x\y" } };
-            Assert.AreEqual(
-                "{ \"@warning\": \"Invalid FieldMask\", \"paths\": [ \"x\", \"foo__bar\", \"x\\\\y\" ] }",
-                mask.ToString());
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs
deleted file mode 100644
index 9ecd24c..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using NUnit.Framework;
-using System;
-
-namespace Google.Protobuf.WellKnownTypes
-{
-    public class TimestampTest
-    {
-        [Test]
-        public void FromAndToDateTime()
-        {
-            DateTime utcMin = DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
-            DateTime utcMax = DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc);
-            AssertRoundtrip(new Timestamp { Seconds = -62135596800 }, utcMin);
-            AssertRoundtrip(new Timestamp { Seconds = 253402300799, Nanos = 999999900 }, utcMax);
-            AssertRoundtrip(new Timestamp(), new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
-            AssertRoundtrip(new Timestamp { Nanos = 1000000}, new DateTime(1970, 1, 1, 0, 0, 0, 1, DateTimeKind.Utc));
-            AssertRoundtrip(new Timestamp { Seconds = -1, Nanos = 999000000 }, new DateTime(1969, 12, 31, 23, 59, 59, 999, DateTimeKind.Utc));
-            AssertRoundtrip(new Timestamp { Seconds = 3600 }, new DateTime(1970, 1, 1, 1, 0, 0, DateTimeKind.Utc));
-            AssertRoundtrip(new Timestamp { Seconds = -3600 }, new DateTime(1969, 12, 31, 23, 0, 0, DateTimeKind.Utc));
-        }
-
-        [Test]
-        public void ToDateTimeTruncation()
-        {
-            var t1 = new Timestamp { Seconds = 1, Nanos = 1000000 + Duration.NanosecondsPerTick - 1 };
-            Assert.AreEqual(new DateTime(1970, 1, 1, 0, 0, 1, DateTimeKind.Utc).AddMilliseconds(1), t1.ToDateTime());
-
-            var t2 = new Timestamp { Seconds = -1, Nanos = 1000000 + Duration.NanosecondsPerTick - 1 };
-            Assert.AreEqual(new DateTime(1969, 12, 31, 23, 59, 59).AddMilliseconds(1), t2.ToDateTime());
-        }
-
-        [Test]
-        [TestCase(Timestamp.UnixSecondsAtBclMinValue - 1, Timestamp.MaxNanos)]
-        [TestCase(Timestamp.UnixSecondsAtBclMaxValue + 1, 0)]
-        [TestCase(0, -1)]
-        [TestCase(0, Timestamp.MaxNanos + 1)]
-        public void ToDateTime_OutOfRange(long seconds, int nanoseconds)
-        {
-            var value = new Timestamp { Seconds = seconds, Nanos = nanoseconds };
-            Assert.Throws<InvalidOperationException>(() => value.ToDateTime());
-        }
-
-        // 1ns larger or smaller than the above values
-        [Test]
-        [TestCase(Timestamp.UnixSecondsAtBclMinValue, 0)]
-        [TestCase(Timestamp.UnixSecondsAtBclMaxValue, Timestamp.MaxNanos)]
-        [TestCase(0, 0)]
-        [TestCase(0, Timestamp.MaxNanos)]
-        public void ToDateTime_ValidBoundaries(long seconds, int nanoseconds)
-        {
-            var value = new Timestamp { Seconds = seconds, Nanos = nanoseconds };
-            value.ToDateTime();
-        }
-
-        private static void AssertRoundtrip(Timestamp timestamp, DateTime dateTime)
-        {
-            Assert.AreEqual(timestamp, Timestamp.FromDateTime(dateTime));
-            Assert.AreEqual(dateTime, timestamp.ToDateTime());
-            Assert.AreEqual(DateTimeKind.Utc, timestamp.ToDateTime().Kind);
-        }
-
-        [Test]
-        public void Arithmetic()
-        {
-            Timestamp t1 = new Timestamp { Seconds = 10000, Nanos = 5000 };
-            Timestamp t2 = new Timestamp { Seconds = 8000, Nanos = 10000 };
-            Duration difference = new Duration { Seconds = 1999, Nanos = Duration.NanosecondsPerSecond - 5000 };
-            Assert.AreEqual(difference, t1 - t2);
-            Assert.AreEqual(-difference, t2 - t1);
-            
-            Assert.AreEqual(t1, t2 + difference);
-            Assert.AreEqual(t2, t1 - difference);
-        }
-
-        [Test]
-        public void ToString_NonNormalized()
-        {
-            // Just a single example should be sufficient...
-            var duration = new Timestamp { Seconds = 1, Nanos = -1 };
-            Assert.AreEqual("{ \"@warning\": \"Invalid Timestamp\", \"seconds\": \"1\", \"nanos\": -1 }", duration.ToString());
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
deleted file mode 100644
index 5b7185d..0000000
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
+++ /dev/null
@@ -1,421 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System;
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-using System.Collections;
-using System.IO;
-
-namespace Google.Protobuf.WellKnownTypes
-{
-    public class WrappersTest
-    {
-        [Test]
-        public void NullIsDefault()
-        {
-            var message = new TestWellKnownTypes();
-            Assert.IsNull(message.StringField);
-            Assert.IsNull(message.BytesField);
-            Assert.IsNull(message.BoolField);
-            Assert.IsNull(message.FloatField);
-            Assert.IsNull(message.DoubleField);
-            Assert.IsNull(message.Int32Field);
-            Assert.IsNull(message.Int64Field);
-            Assert.IsNull(message.Uint32Field);
-            Assert.IsNull(message.Uint64Field);
-        }
-
-        [Test]
-        public void NonDefaultSingleValues()
-        {
-            var message = new TestWellKnownTypes
-            {
-                StringField = "x",
-                BytesField = ByteString.CopyFrom(1, 2, 3),
-                BoolField = true,
-                FloatField = 12.5f,
-                DoubleField = 12.25d,
-                Int32Field = 1,
-                Int64Field = 2,
-                Uint32Field = 3,
-                Uint64Field = 4
-            };
-
-            var bytes = message.ToByteArray();
-            var parsed = TestWellKnownTypes.Parser.ParseFrom(bytes);
-
-            Assert.AreEqual("x", parsed.StringField);
-            Assert.AreEqual(ByteString.CopyFrom(1, 2, 3), parsed.BytesField);
-            Assert.AreEqual(true, parsed.BoolField);
-            Assert.AreEqual(12.5f, parsed.FloatField);
-            Assert.AreEqual(12.25d, parsed.DoubleField);
-            Assert.AreEqual(1, parsed.Int32Field);
-            Assert.AreEqual(2L, parsed.Int64Field);
-            Assert.AreEqual(3U, parsed.Uint32Field);
-            Assert.AreEqual(4UL, parsed.Uint64Field);
-        }
-
-        [Test]
-        public void NonNullDefaultIsPreservedThroughSerialization()
-        {
-            var message = new TestWellKnownTypes
-            {
-                StringField = "",
-                BytesField = ByteString.Empty,
-                BoolField = false,
-                FloatField = 0f,
-                DoubleField = 0d,
-                Int32Field = 0,
-                Int64Field = 0,
-                Uint32Field = 0,
-                Uint64Field = 0
-            };
-
-            var bytes = message.ToByteArray();
-            var parsed = TestWellKnownTypes.Parser.ParseFrom(bytes);
-
-            Assert.AreEqual("", parsed.StringField);
-            Assert.AreEqual(ByteString.Empty, parsed.BytesField);
-            Assert.AreEqual(false, parsed.BoolField);
-            Assert.AreEqual(0f, parsed.FloatField);
-            Assert.AreEqual(0d, parsed.DoubleField);
-            Assert.AreEqual(0, parsed.Int32Field);
-            Assert.AreEqual(0L, parsed.Int64Field);
-            Assert.AreEqual(0U, parsed.Uint32Field);
-            Assert.AreEqual(0UL, parsed.Uint64Field);
-        }
-
-        [Test]
-        public void RepeatedWrappersProhibitNullItems()
-        {
-            var message = new RepeatedWellKnownTypes();
-            Assert.Throws<ArgumentNullException>(() => message.BoolField.Add((bool?) null));
-            Assert.Throws<ArgumentNullException>(() => message.Int32Field.Add((int?) null));
-            Assert.Throws<ArgumentNullException>(() => message.StringField.Add((string) null));
-            Assert.Throws<ArgumentNullException>(() => message.BytesField.Add((ByteString) null));
-        }
-
-        [Test]
-        public void RepeatedWrappersSerializeDeserialize()
-        {
-            var message = new RepeatedWellKnownTypes
-            {
-                BoolField = { true, false },
-                BytesField = { ByteString.CopyFrom(1, 2, 3), ByteString.CopyFrom(4, 5, 6), ByteString.Empty },
-                DoubleField = { 12.5, -1.5, 0d },
-                FloatField = { 123.25f, -20f, 0f },
-                Int32Field = { int.MaxValue, int.MinValue, 0 },
-                Int64Field = { long.MaxValue, long.MinValue, 0L },                
-                StringField = { "First", "Second", "" },
-                Uint32Field = { uint.MaxValue, uint.MinValue, 0U },
-                Uint64Field = { ulong.MaxValue, ulong.MinValue, 0UL },
-            };
-            var bytes = message.ToByteArray();
-            var parsed = RepeatedWellKnownTypes.Parser.ParseFrom(bytes);
-
-            Assert.AreEqual(message, parsed);
-            // Just to test a single value for sanity...
-            Assert.AreEqual("Second", message.StringField[1]);
-        }
-
-        [Test]
-        public void RepeatedWrappersBinaryFormat()
-        {
-            // At one point we accidentally used a packed format for repeated wrappers, which is wrong (and weird).
-            // This test is just to prove that we use the right format.
-
-            var rawOutput = new MemoryStream();
-            var output = new CodedOutputStream(rawOutput);
-            // Write a value of 5
-            output.WriteTag(RepeatedWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
-            output.WriteLength(2);
-            output.WriteTag(WrappersReflection.WrapperValueFieldNumber, WireFormat.WireType.Varint);
-            output.WriteInt32(5);
-            // Write a value of 0 (empty message)
-            output.WriteTag(RepeatedWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
-            output.WriteLength(0);
-            output.Flush();
-            var expectedBytes = rawOutput.ToArray();
-
-            var message = new RepeatedWellKnownTypes { Int32Field = { 5, 0 } };
-            var actualBytes = message.ToByteArray();
-            Assert.AreEqual(expectedBytes, actualBytes);
-        }
-
-        [Test]
-        public void MapWrappersSerializeDeserialize()
-        {
-            // Note: no null values here, as they are prohibited in map fields
-            // (despite being representable).
-            var message = new MapWellKnownTypes
-            {
-                BoolField = { { 10, false }, { 20, true } },
-                BytesField = {
-                    { -1, ByteString.CopyFrom(1, 2, 3) },
-                    { 10, ByteString.CopyFrom(4, 5, 6) },
-                    { 1000, ByteString.Empty },
-                },
-                DoubleField = { { 1, 12.5 }, { 10, -1.5 }, { 20, 0d } },
-                FloatField = { { 2, 123.25f }, { 3, -20f }, { 4, 0f } },
-                Int32Field = { { 5, int.MaxValue }, { 6, int.MinValue }, { 7, 0 } },
-                Int64Field = { { 8, long.MaxValue }, { 9, long.MinValue }, { 10, 0L } },
-                StringField = { { 11, "First" }, { 12, "Second" }, { 13, "" } },
-                Uint32Field = { { 15, uint.MaxValue }, { 16, uint.MinValue }, { 17, 0U } },
-                Uint64Field = { { 18, ulong.MaxValue }, { 19, ulong.MinValue }, { 20, 0UL } },
-            };
-
-            var bytes = message.ToByteArray();
-            var parsed = MapWellKnownTypes.Parser.ParseFrom(bytes);
-
-            Assert.AreEqual(message, parsed);
-            // Just to test a single value for sanity...
-            Assert.AreEqual("Second", message.StringField[12]);
-        }
-
-        [Test]
-        public void Reflection_SingleValues()
-        {
-            var message = new TestWellKnownTypes
-            {
-                StringField = "x",
-                BytesField = ByteString.CopyFrom(1, 2, 3),
-                BoolField = true,
-                FloatField = 12.5f,
-                DoubleField = 12.25d,
-                Int32Field = 1,
-                Int64Field = 2,
-                Uint32Field = 3,
-                Uint64Field = 4
-            };
-            var fields = TestWellKnownTypes.Descriptor.Fields;
-
-            Assert.AreEqual("x", fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(ByteString.CopyFrom(1, 2, 3), fields[TestWellKnownTypes.BytesFieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(true, fields[TestWellKnownTypes.BoolFieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(12.5f, fields[TestWellKnownTypes.FloatFieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(12.25d, fields[TestWellKnownTypes.DoubleFieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(1, fields[TestWellKnownTypes.Int32FieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(2L, fields[TestWellKnownTypes.Int64FieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(3U, fields[TestWellKnownTypes.Uint32FieldFieldNumber].Accessor.GetValue(message));
-            Assert.AreEqual(4UL, fields[TestWellKnownTypes.Uint64FieldFieldNumber].Accessor.GetValue(message));
-
-            // And a couple of null fields...
-            message.StringField = null;
-            message.FloatField = null;
-            Assert.IsNull(fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.GetValue(message));
-            Assert.IsNull(fields[TestWellKnownTypes.FloatFieldFieldNumber].Accessor.GetValue(message));
-        }
-
-        [Test]
-        public void Reflection_RepeatedFields()
-        {
-            // Just a single example... note that we can't have a null value here
-            var message = new RepeatedWellKnownTypes { Int32Field = { 1, 2 } };
-            var fields = RepeatedWellKnownTypes.Descriptor.Fields;
-            var list = (IList) fields[RepeatedWellKnownTypes.Int32FieldFieldNumber].Accessor.GetValue(message);
-            CollectionAssert.AreEqual(new[] { 1, 2 }, list);
-        }
-
-        [Test]
-        public void Reflection_MapFields()
-        {
-            // Just a single example... note that we can't have a null value here despite the value type being int?
-            var message = new MapWellKnownTypes { Int32Field = { { 1, 2 } } };
-            var fields = MapWellKnownTypes.Descriptor.Fields;
-            var dictionary = (IDictionary) fields[MapWellKnownTypes.Int32FieldFieldNumber].Accessor.GetValue(message);
-            Assert.AreEqual(2, dictionary[1]);
-        }
-
-        [Test]
-        public void Oneof()
-        {
-            var message = new OneofWellKnownTypes { EmptyField = new Empty() };
-            // Start off with a non-wrapper
-            Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.EmptyField, message.OneofFieldCase);
-            AssertOneofRoundTrip(message);
-
-            message.StringField = "foo";
-            Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.StringField, message.OneofFieldCase);
-            AssertOneofRoundTrip(message);
-
-            message.StringField = "foo";
-            Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.StringField, message.OneofFieldCase);
-            AssertOneofRoundTrip(message);
-
-            message.DoubleField = 0.0f;
-            Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.DoubleField, message.OneofFieldCase);
-            AssertOneofRoundTrip(message);
-
-            message.DoubleField = 1.0f;
-            Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.DoubleField, message.OneofFieldCase);
-            AssertOneofRoundTrip(message);
-
-            message.ClearOneofField();
-            Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
-            AssertOneofRoundTrip(message);
-        }
-
-        private void AssertOneofRoundTrip(OneofWellKnownTypes message)
-        {
-            // Normal roundtrip, but explicitly checking the case...
-            var bytes = message.ToByteArray();
-            var parsed = OneofWellKnownTypes.Parser.ParseFrom(bytes);
-            Assert.AreEqual(message, parsed);
-            Assert.AreEqual(message.OneofFieldCase, parsed.OneofFieldCase);
-        }
-
-        [Test]
-        [TestCase("x", "y", "y")]
-        [TestCase("x", "", "x")]
-        [TestCase("x", null, "x")]
-        [TestCase("", "y", "y")]
-        [TestCase("", "", "")]
-        [TestCase("", null, "")]
-        [TestCase(null, "y", "y")]
-        [TestCase(null, "", "")]
-        [TestCase(null, null, null)]
-        public void Merging(string original, string merged, string expected)
-        {
-            var originalMessage = new TestWellKnownTypes { StringField = original };
-            var mergingMessage = new TestWellKnownTypes { StringField = merged };
-            originalMessage.MergeFrom(mergingMessage);
-            Assert.AreEqual(expected, originalMessage.StringField);
-
-            // Try it using MergeFrom(CodedInputStream) too...
-            originalMessage = new TestWellKnownTypes { StringField = original };
-            originalMessage.MergeFrom(mergingMessage.ToByteArray());
-            Assert.AreEqual(expected, originalMessage.StringField);
-        }
-
-        // Merging is odd with wrapper types, due to the way that default values aren't emitted in
-        // the binary stream. In fact we cheat a little bit - a message with an explicitly present default
-        // value will have that default value ignored. See issue 615. Fixing this would require significant upheaval to
-        // the FieldCodec side of things.
-        [Test]
-        public void MergingStreamExplicitValue()
-        {
-            var message = new TestWellKnownTypes { Int32Field = 5 };
-
-            // Create a byte array which has the data of an Int32Value explicitly containing a value of 0.
-            // This wouldn't normally happen.
-            byte[] bytes;
-            var wrapperTag = WireFormat.MakeTag(TestWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
-            var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint);
-            using (var stream = new MemoryStream())
-            {
-                var coded = new CodedOutputStream(stream);
-                coded.WriteTag(wrapperTag);
-                coded.WriteLength(2); // valueTag + a value 0, each one byte
-                coded.WriteTag(valueTag);
-                coded.WriteInt32(0);
-                coded.Flush();
-                bytes = stream.ToArray();
-            }
-
-            message.MergeFrom(bytes);
-            // A normal implementation would have 0 now, as the explicit default would have been overwritten the 5.
-            // With the FieldCodec for Nullable<int>, we can't tell the difference between an implicit 0 and an explicit 0.
-            Assert.AreEqual(5, message.Int32Field);
-        }
-
-        [Test]
-        public void MergingStreamNoValue()
-        {
-            var message = new TestWellKnownTypes { Int32Field = 5 };
-
-            // Create a byte array which an Int32 field, but with no value.
-            var bytes = new TestWellKnownTypes { Int32Field = 0 }.ToByteArray();
-            Assert.AreEqual(2, bytes.Length); // The tag for Int32Field is a single byte, then a byte indicating a 0-length message.
-            message.MergeFrom(bytes);
-
-            // The "implicit" 0 did *not* overwrite the value.
-            // (This is the correct behaviour.)
-            Assert.AreEqual(5, message.Int32Field);
-        }
-
-        // All permutations of origin/merging value being null, zero (default) or non-default.
-        // As this is the in-memory version, we don't need to worry about the difference between implicit and explicit 0.
-        [Test]
-        [TestCase(null, null, null)]
-        [TestCase(null, 0, 0)]
-        [TestCase(null, 5, 5)]
-        [TestCase(0, null, 0)]
-        [TestCase(0, 0, 0)]
-        [TestCase(0, 5, 5)]
-        [TestCase(5, null, 5)]
-        [TestCase(5, 0, 5)]
-        [TestCase(5, 10, 10)]
-        public void MergingMessageWithZero(int? originValue, int? mergingValue, int? expectedResult)
-        {
-            // This differs from the MergingStreamCornerCase because when we merge message *objects*,
-            // we ignore default values from the "source".
-            var message1 = new TestWellKnownTypes { Int32Field = originValue };
-            var message2 = new TestWellKnownTypes { Int32Field = mergingValue };
-            message1.MergeFrom(message2);
-            Assert.AreEqual(expectedResult, message1.Int32Field);
-        }
-
-        [Test]
-        public void UnknownFieldInWrapper()
-        {
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            var wrapperTag = WireFormat.MakeTag(TestWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
-            var unknownTag = WireFormat.MakeTag(15, WireFormat.WireType.Varint);
-            var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint);
-
-            output.WriteTag(wrapperTag);
-            output.WriteLength(4); // unknownTag + value 5 + valueType + value 6, each 1 byte
-            output.WriteTag(unknownTag);
-            output.WriteInt32((int) valueTag); // Sneakily "pretend" it's a tag when it's really a value
-            output.WriteTag(valueTag);
-            output.WriteInt32(6);
-
-            output.Flush();
-            stream.Position = 0;
-            
-            var message = TestWellKnownTypes.Parser.ParseFrom(stream);
-            Assert.AreEqual(6, message.Int32Field);
-        }
-
-        [Test]
-        public void ClearWithReflection()
-        {
-            // String and Bytes are the tricky ones here, as the CLR type of the property
-            // is the same between the wrapper and non-wrapper types.
-            var message = new TestWellKnownTypes { StringField = "foo" };
-            TestWellKnownTypes.Descriptor.Fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.Clear(message);
-            Assert.IsNull(message.StringField);
-        }
-    }
-}
diff --git a/csharp/compatibility_tests/v3.0.0/test.sh b/csharp/compatibility_tests/v3.0.0/test.sh
deleted file mode 100755
index 54d28df..0000000
--- a/csharp/compatibility_tests/v3.0.0/test.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/bash
-
-function run_test() {
-  # Generate test proto files.
-  ./protoc_1 -Iprotos/src -I../../../src/ --csharp_out=src/Google.Protobuf.Test \
-    --csharp_opt=base_namespace=Google.Protobuf \
-    protos/src/google/protobuf/unittest_import_proto3.proto \
-    protos/src/google/protobuf/unittest_import_public_proto3.proto \
-    protos/src/google/protobuf/unittest_well_known_types.proto
-
-  ./protoc_1 -Iprotos/csharp --csharp_out=src/Google.Protobuf.Test \
-    --csharp_opt=base_namespace=UnitTest.Issues \
-    protos/csharp/protos/unittest_issues.proto
-
-  ./protoc_2 -Iprotos/src --csharp_out=src/Google.Protobuf.Test \
-    --csharp_opt=base_namespace=Google.Protobuf \
-    protos/src/google/protobuf/unittest_proto3.proto \
-    protos/src/google/protobuf/map_unittest_proto3.proto
-
-  # Build and test.
-  dotnet restore src/Google.Protobuf/Google.Protobuf.csproj
-  dotnet restore src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
-  dotnet build -c Release src/Google.Protobuf/Google.Protobuf.csproj
-  dotnet build -c Release src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
-  dotnet run -c Release -f netcoreapp1.0 -p src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
-}
-
-set -ex
-
-# Change to the script's directory.
-cd $(dirname $0)
-
-# Version of the tests (i.e., the version of protobuf from where we extracted
-# these tests).
-TEST_VERSION=3.0.0
-
-# The old version of protobuf that we are testing compatibility against. This
-# is usually the same as TEST_VERSION (i.e., we use the tests extracted from
-# that version to test compatibility of the newest runtime against it), but it
-# is also possible to use this same test set to test the compatibiilty of the
-# latest version against other versions.
-case "$1" in
-  ""|3.0.0)
-    OLD_VERSION=3.0.0
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0/protoc-3.0.0-linux-x86_64.exe
-    ;;
-  3.0.2)
-    OLD_VERSION=3.0.2
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.2/protoc-3.0.2-linux-x86_64.exe
-    ;;
-  3.1.0)
-    OLD_VERSION=3.1.0
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.1.0/protoc-3.1.0-linux-x86_64.exe
-    ;;
-  *)
-    echo "[ERROR]: Unknown version number: $1"
-    exit 1
-    ;;
-esac
-
-echo "Running compatibility tests with $OLD_VERSION"
-
-# Check protoc
-[ -f ../../../src/protoc ] || {
-  echo "[ERROR]: Please build protoc first."
-  exit 1
-}
-
-# Download old version protoc compiler (for linux).
-wget $OLD_VERSION_PROTOC -O old_protoc
-chmod +x old_protoc
-
-# Test source compatibility. In these tests we recompile everything against
-# the new runtime (including old version generated code).
-# Copy the new runtime and keys.
-cp ../../src/Google.Protobuf src/Google.Protobuf -r
-cp ../../keys . -r
-
-# Test A.1:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use old version
-cp old_protoc protoc_1
-cp old_protoc protoc_2
-run_test
-
-# Test A.2:
-#   proto set 1: use new version
-#   proto set 2 which may import protos in set 1: use old version
-cp ../../../src/protoc protoc_1
-cp old_protoc protoc_2
-run_test
-
-# Test A.3:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use new version
-cp old_protoc protoc_1
-cp ../../../src/protoc protoc_2
-run_test
-
-rm protoc_1
-rm protoc_2
-rm old_protoc
-rm keys -r
-rm src/Google.Protobuf -r
diff --git a/csharp/generate_protos.sh b/csharp/generate_protos.sh
index 5c748e3..d979aa5 100755
--- a/csharp/generate_protos.sh
+++ b/csharp/generate_protos.sh
@@ -3,7 +3,7 @@
 # You first need to make sure protoc has been built (see instructions on
 # building protoc in root of this repository)
 
-set -e
+set -ex
 
 # cd to repository root
 pushd $(dirname $0)/..
@@ -40,20 +40,22 @@
     src/google/protobuf/type.proto \
     src/google/protobuf/wrappers.proto
 
-# Test protos
-$PROTOC -Isrc -Icsharp/protos \
-    --csharp_out=csharp/src/Google.Protobuf.Test/TestProtos \
-    csharp/protos/map_unittest_proto3.proto \
-    csharp/protos/unittest_issues.proto \
-    csharp/protos/unittest_custom_options_proto3.proto \
-    csharp/protos/unittest_proto3.proto \
-    csharp/protos/unittest_import_proto3.proto \
-    csharp/protos/unittest_import_public_proto3.proto \
-    src/google/protobuf/unittest_well_known_types.proto \
-    src/google/protobuf/test_messages_proto3.proto
+# Test protos where the namespace matches the target location
+$PROTOC -Isrc --csharp_out=csharp/src/Google.Protobuf.Test \
+    --csharp_opt=base_namespace=Google.Protobuf \
+    src/google/protobuf/map_unittest_proto3.proto \
+    src/google/protobuf/unittest_proto3.proto \
+    src/google/protobuf/unittest_import_proto3.proto \
+    src/google/protobuf/unittest_import_public_proto3.proto \
+    src/google/protobuf/unittest_well_known_types.proto
+
+# Different base namespace to the protos above
+$PROTOC -Icsharp/protos --csharp_out=csharp/src/Google.Protobuf.Test \
+    --csharp_opt=base_namespace=UnitTest.Issues \
+    csharp/protos/unittest_issues.proto
 
 # AddressBook sample protos
-$PROTOC -Iexamples -Isrc --csharp_out=csharp/src/AddressBook \
+$PROTOC -Iexamples --csharp_out=csharp/src/AddressBook \
     examples/addressbook.proto
 
 $PROTOC -Iconformance -Isrc --csharp_out=csharp/src/Google.Protobuf.Conformance \
diff --git a/csharp/global.json b/csharp/global.json
deleted file mode 100644
index 3622b56..0000000
--- a/csharp/global.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "sdk": {
-    "version": "1.0.0"
-  }
-}
diff --git a/csharp/protos/README.md b/csharp/protos/README.md
deleted file mode 100644
index bdd66fc..0000000
--- a/csharp/protos/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains unit test protos adapted from those in
-src/google/protobuf, and C#-specific test protos for regression
-tests against bugs found in the C# codegen or library.
diff --git a/csharp/protos/map_unittest_proto3.proto b/csharp/protos/map_unittest_proto3.proto
deleted file mode 100644
index e43e858..0000000
--- a/csharp/protos/map_unittest_proto3.proto
+++ /dev/null
@@ -1,116 +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.
-
-// This file is mostly equivalent to map_unittest.proto, but imports
-// unittest_proto3.proto instead of unittest.proto, so that it only
-// uses proto3 messages. This makes it suitable for testing
-// implementations which only support proto3.
-// The TestRequiredMessageMap message has been removed as there are no
-// required fields in proto3.
-syntax = "proto3";
-
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-import "unittest_proto3.proto";
-
-package protobuf_unittest3;
-
-// Tests maps.
-message TestMap {
-  map<int32   , int32   > map_int32_int32       = 1;
-  map<int64   , int64   > map_int64_int64       = 2;
-  map<uint32  , uint32  > map_uint32_uint32     = 3;
-  map<uint64  , uint64  > map_uint64_uint64     = 4;
-  map<sint32  , sint32  > map_sint32_sint32     = 5;
-  map<sint64  , sint64  > map_sint64_sint64     = 6;
-  map<fixed32 , fixed32 > map_fixed32_fixed32   = 7;
-  map<fixed64 , fixed64 > map_fixed64_fixed64   = 8;
-  map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
-  map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
-  map<int32   , float   > map_int32_float       = 11;
-  map<int32   , double  > map_int32_double      = 12;
-  map<bool    , bool    > map_bool_bool         = 13;
-  map<string  , string  > map_string_string     = 14;
-  map<int32   , bytes   > map_int32_bytes       = 15;
-  map<int32   , MapEnum > map_int32_enum        = 16;
-  map<int32   , ForeignMessage> map_int32_foreign_message = 17;
-}
-
-message TestMapSubmessage {
-  TestMap test_map = 1;
-}
-
-message TestMessageMap {
-  map<int32, TestAllTypes> map_int32_message = 1;
-}
-
-// Two map fields share the same entry default instance.
-message TestSameTypeMap {
-  map<int32, int32> map1 = 1;
-  map<int32, int32> map2 = 2;
-}
-
-enum MapEnum {
-  MAP_ENUM_FOO = 0;
-  MAP_ENUM_BAR = 1;
-  MAP_ENUM_BAZ = 2;
-}
-
-message TestArenaMap {
-  map<int32   , int32   > map_int32_int32       = 1;
-  map<int64   , int64   > map_int64_int64       = 2;
-  map<uint32  , uint32  > map_uint32_uint32     = 3;
-  map<uint64  , uint64  > map_uint64_uint64     = 4;
-  map<sint32  , sint32  > map_sint32_sint32     = 5;
-  map<sint64  , sint64  > map_sint64_sint64     = 6;
-  map<fixed32 , fixed32 > map_fixed32_fixed32   = 7;
-  map<fixed64 , fixed64 > map_fixed64_fixed64   = 8;
-  map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
-  map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
-  map<int32   , float   > map_int32_float       = 11;
-  map<int32   , double  > map_int32_double      = 12;
-  map<bool    , bool    > map_bool_bool         = 13;
-  map<int32   , MapEnum > map_int32_enum        = 14;
-  map<int32   , ForeignMessage> map_int32_foreign_message = 15;
-}
-
-// Previously, message containing enum called Type cannot be used as value of
-// map field.
-message MessageContainingEnumCalledType {
-  enum Type {
-    TYPE_FOO = 0;
-  }
-  map<int32, MessageContainingEnumCalledType> type = 1;
-}
-
-// Previously, message cannot contain map field called "entry".
-message MessageContainingMapCalledEntry {
-  map<int32, int32> entry = 1;
-}
diff --git a/csharp/protos/unittest_custom_options_proto3.proto b/csharp/protos/unittest_custom_options_proto3.proto
deleted file mode 100644
index 87bd0f7..0000000
--- a/csharp/protos/unittest_custom_options_proto3.proto
+++ /dev/null
@@ -1,336 +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.
-
-// Author: benjy@google.com (Benjy Weinberger)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file used to test the "custom options" feature of google.protobuf.
-
-// This file is based on unittest_custom_options.proto in
-// src/google/protobuf, but is modified for proto3. It could
-// potentially be moved into src/google/protobuf, but currently C#
-// is the only language that really needs it, as we don't support
-// proto2 syntax. It's cut down significantly as proto3 only supports
-// extensions for options.
-
-
-syntax = "proto3";
-
-// A custom file option (defined below).
-option (file_opt1) = 9876543210;
-
-import "google/protobuf/descriptor.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-package protobuf_unittest;
-option csharp_namespace = "UnitTest.Issues.TestProtos";
-
-// Some simple test custom options of various types.
-
-extend google.protobuf.FileOptions {
-  uint64 file_opt1 = 7736974;
-}
-
-extend google.protobuf.MessageOptions {
-  int32 message_opt1 = 7739036;
-}
-
-extend google.protobuf.FieldOptions {
-  fixed64 field_opt1 = 7740936;
-}
-
-extend google.protobuf.OneofOptions {
-  int32 oneof_opt1 = 7740111;
-}
-
-extend google.protobuf.EnumOptions {
-  sfixed32 enum_opt1 = 7753576;
-}
-
-extend google.protobuf.EnumValueOptions {
-  int32 enum_value_opt1 = 1560678;
-}
-
-extend google.protobuf.ServiceOptions {
-  sint64 service_opt1 = 7887650;
-}
-
-enum MethodOpt1 {
-  METHODOPT1_UNSPECIFIED = 0;
-  METHODOPT1_VAL1 = 1;
-  METHODOPT1_VAL2 = 2;
-}
-
-extend google.protobuf.MethodOptions {
-  MethodOpt1 method_opt1 = 7890860;
-}
-
-// A test message with custom options at all possible locations (and also some
-// regular options, to make sure they interact nicely).
-message TestMessageWithCustomOptions {
-  option message_set_wire_format = false;
-
-  option (message_opt1) = -56;
-
-  string field1 = 1 [ctype=CORD,
-                              (field_opt1)=8765432109];
-
-  oneof AnOneof {
-    option (oneof_opt1) = -99;
-    int32 oneof_field = 2;
-  }
-
-  enum AnEnum {
-    option (enum_opt1) = -789;
-    ANENUM_UNSPECIFIED = 0;
-    ANENUM_VAL1 = 1;
-    ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
-  }
-}
-
-
-// A test RPC service with custom options at all possible locations (and also
-// some regular options, to make sure they interact nicely).
-message CustomOptionFooRequest {
-}
-
-message CustomOptionFooResponse {
-}
-
-message CustomOptionFooClientMessage {
-}
-
-message CustomOptionFooServerMessage {
-}
-
-service TestServiceWithCustomOptions {
-  option (service_opt1) = -9876543210;
-
-  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
-    option (method_opt1) = METHODOPT1_VAL2;
-  }
-}
-
-
-
-// Options of every possible field type, so we can test them all exhaustively.
-
-message DummyMessageContainingEnum {
-  enum TestEnumType {
-    TEST_OPTION_ENUM_UNSPECIFIED = 0;
-    TEST_OPTION_ENUM_TYPE1 = 22;
-    TEST_OPTION_ENUM_TYPE2 = -23;
-  }
-}
-
-message DummyMessageInvalidAsOptionType {
-}
-
-extend google.protobuf.MessageOptions {
-          bool     bool_opt = 7706090;
-         int32    int32_opt = 7705709;
-         int64    int64_opt = 7705542;
-        uint32   uint32_opt = 7704880;
-        uint64   uint64_opt = 7702367;
-        sint32   sint32_opt = 7701568;
-        sint64   sint64_opt = 7700863;
-       fixed32  fixed32_opt = 7700307;
-       fixed64  fixed64_opt = 7700194;
-      sfixed32 sfixed32_opt = 7698645;
-      sfixed64 sfixed64_opt = 7685475;
-         float    float_opt = 7675390;
-        double   double_opt = 7673293;
-        string   string_opt = 7673285;
-         bytes    bytes_opt = 7673238;
-  DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;
-  DummyMessageInvalidAsOptionType message_type_opt = 7665967;
-}
-
-message CustomOptionMinIntegerValues {
-  option     (bool_opt) = false;
-  option    (int32_opt) = -0x80000000;
-  option    (int64_opt) = -0x8000000000000000;
-  option   (uint32_opt) = 0;
-  option   (uint64_opt) = 0;
-  option   (sint32_opt) = -0x80000000;
-  option   (sint64_opt) = -0x8000000000000000;
-  option  (fixed32_opt) = 0;
-  option  (fixed64_opt) = 0;
-  option (sfixed32_opt) = -0x80000000;
-  option (sfixed64_opt) = -0x8000000000000000;
-}
-
-message CustomOptionMaxIntegerValues {
-  option     (bool_opt) = true;
-  option    (int32_opt) = 0x7FFFFFFF;
-  option    (int64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option   (uint32_opt) = 0xFFFFFFFF;
-  option   (uint64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option   (sint32_opt) = 0x7FFFFFFF;
-  option   (sint64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option  (fixed32_opt) = 0xFFFFFFFF;
-  option  (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option (sfixed32_opt) = 0x7FFFFFFF;
-  option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;
-}
-
-message CustomOptionOtherValues {
-  option  (int32_opt) = -100;  // To test sign-extension.
-  option  (float_opt) = 12.3456789;
-  option (double_opt) = 1.234567890123456789;
-  option (string_opt) = "Hello, \"World\"";
-  option  (bytes_opt) = "Hello\0World";
-  option   (enum_opt) = TEST_OPTION_ENUM_TYPE2;
-}
-
-message SettingRealsFromPositiveInts {
-  option  (float_opt) = 12;
-  option (double_opt) = 154;
-}
-
-message SettingRealsFromNegativeInts {
-  option  (float_opt) = -12;
-  option  (double_opt) = -154;
-}
-
-// Options of complex message types, themselves combined and extended in
-// various ways.
-
-message ComplexOptionType1 {
-  int32 foo = 1;
-  int32 foo2 = 2;
-  int32 foo3 = 3;
-  repeated int32 foo4 = 4;
-}
-
-message ComplexOptionType2 {
-  ComplexOptionType1 bar = 1;
-  int32 baz = 2;
-
-  message ComplexOptionType4 {
-    int32 waldo = 1;
-
-    extend google.protobuf.MessageOptions {
-      ComplexOptionType4 complex_opt4 = 7633546;
-    }
-  }
-
-  ComplexOptionType4 fred = 3;
-  repeated ComplexOptionType4 barney = 4;
-}
-
-message ComplexOptionType3 {
-  int32 qux = 1;
-}
-
-extend google.protobuf.MessageOptions {
-  protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;
-  ComplexOptionType2 complex_opt2 = 7636949;
-  ComplexOptionType3 complex_opt3 = 7636463;
-}
-
-// Note that we try various different ways of naming the same extension.
-message VariousComplexOptions {
-  option (.protobuf_unittest.complex_opt1).foo = 42;
-  option (protobuf_unittest.complex_opt1).foo4 = 99;
-  option (protobuf_unittest.complex_opt1).foo4 = 88;
-  option (complex_opt2).baz = 987;
-  option (complex_opt2).bar.foo = 743;
-  option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
-  option (complex_opt2).fred.waldo = 321;
-  option (complex_opt2).barney = { waldo: 101 };
-  option (complex_opt2).barney = { waldo: 212 };
-  option (protobuf_unittest.complex_opt3).qux = 9;
-}
-
-// ------------------------------------------------------
-// Definitions for testing aggregate option parsing.
-// See descriptor_unittest.cc.
-
-// A helper type used to test aggregate option parsing
-message Aggregate {
-  int32 i = 1;
-  string s = 2;
-
-  // A nested object
-  Aggregate sub = 3;
-}
-
-// Allow Aggregate to be used as an option at all possible locations
-// in the .proto grammer.
-extend google.protobuf.FileOptions      { Aggregate fileopt    = 15478479; }
-extend google.protobuf.MessageOptions   { Aggregate msgopt     = 15480088; }
-extend google.protobuf.FieldOptions     { Aggregate fieldopt   = 15481374; }
-extend google.protobuf.EnumOptions      { Aggregate enumopt    = 15483218; }
-extend google.protobuf.EnumValueOptions { Aggregate enumvalopt = 15486921; }
-extend google.protobuf.ServiceOptions   { Aggregate serviceopt = 15497145; }
-extend google.protobuf.MethodOptions    { Aggregate methodopt  = 15512713; }
-
-// Try using AggregateOption at different points in the proto grammar
-option (fileopt) = {
-  s: 'FileAnnotation'
-  // Also test the handling of comments
-  /* of both types */ i: 100
-
-  sub { s: 'NestedFileAnnotation' }
-};
-
-message AggregateMessage {
-  option (msgopt) = { i:101 s:'MessageAnnotation' };
-  int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
-}
-
-service AggregateService {
-  option (serviceopt) = { s:'ServiceAnnotation' };
-  rpc Method (AggregateMessage) returns (AggregateMessage) {
-    option (methodopt) = { s:'MethodAnnotation' };
-  }
-}
-
-enum AggregateEnum {
-  option (enumopt) = { s:'EnumAnnotation' };
-  UNSPECIFIED = 0;
-  VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
-}
-
-// Test custom options for nested type.
-message NestedOptionType {
-  message NestedMessage {
-    option (message_opt1) = 1001;
-    int32 nested_field = 1 [(field_opt1) = 1002];
-  }
-  enum NestedEnum {
-    UNSPECIFIED = 0;
-    option (enum_opt1) = 1003;
-    NESTED_ENUM_VALUE = 1 [(enum_value_opt1) = 1004];
-  }
-}
diff --git a/csharp/protos/unittest_import_proto3.proto b/csharp/protos/unittest_import_proto3.proto
deleted file mode 100644
index 2e66682..0000000
--- a/csharp/protos/unittest_import_proto3.proto
+++ /dev/null
@@ -1,56 +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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which is imported by unittest_proto3.proto to test importing.
-
-syntax = "proto3";
-
-package protobuf_unittest_import;
-
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-// Test public import
-import public "unittest_import_public_proto3.proto";
-
-message ImportMessage {
-  int32 d = 1;
-}
-
-enum ImportEnum {
-  IMPORT_ENUM_UNSPECIFIED = 0;
-  IMPORT_FOO = 7;
-  IMPORT_BAR = 8;
-  IMPORT_BAZ = 9;
-}
-
diff --git a/csharp/protos/unittest_import_public_proto3.proto b/csharp/protos/unittest_import_public_proto3.proto
deleted file mode 100644
index 88c2079..0000000
--- a/csharp/protos/unittest_import_public_proto3.proto
+++ /dev/null
@@ -1,41 +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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-syntax = "proto3";
-
-package protobuf_unittest_import;
-
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-message PublicImportMessage {
- int32 e = 1;
-}
diff --git a/csharp/protos/unittest_issues.proto b/csharp/protos/unittest_issues.proto
index 0d8793e..6c9f763 100644
--- a/csharp/protos/unittest_issues.proto
+++ b/csharp/protos/unittest_issues.proto
@@ -7,6 +7,7 @@
 option csharp_namespace = "UnitTest.Issues.TestProtos";
 
 package unittest_issues;
+option optimize_for = SPEED;
 
 // Issue 307: when generating doubly-nested types, any references
 // should be of the form A.Types.B.Types.C.
@@ -123,18 +124,3 @@
   string description = 2 [json_name = "desc"];
   string guid = 3 [json_name = "exid"];
 }
-
-// Issue 3200: When merging two messages which use the same
-// oneof case, which is itself a message type, the submessages should
-// be merged.
-message OneofMerging {
-  message Nested {
-    int32 x = 1;
-    int32 y = 2;
-  }
-
-  oneof value {
-    string text = 1;
-    Nested nested = 2;
-  }
-}
\ No newline at end of file
diff --git a/csharp/protos/unittest_proto3.proto b/csharp/protos/unittest_proto3.proto
deleted file mode 100644
index ef4933a..0000000
--- a/csharp/protos/unittest_proto3.proto
+++ /dev/null
@@ -1,380 +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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-syntax = "proto3";
-
-option csharp_namespace = "Google.Protobuf.TestProtos";
-
-// Only present so we can test that we can read it (as an example
-// of a non-C# option)
-option java_outer_classname = "UnittestProto";
-
-import "unittest_import_proto3.proto";
-
-package protobuf_unittest3;
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-message TestAllTypes {
-  message NestedMessage {
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    NESTED_ENUM_UNSPECIFIED = 0;
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-    NEG = -1;  // Intentionally negative.
-  }
-
-  // Singular
-  int32 single_int32 = 1;
-  int64 single_int64 = 2;
-  uint32 single_uint32 = 3;
-  uint64 single_uint64 = 4;
-  sint32 single_sint32 = 5;
-  sint64 single_sint64 = 6;
-  fixed32 single_fixed32 = 7;
-  fixed64 single_fixed64 = 8;
-  sfixed32 single_sfixed32 = 9;
-  sfixed64 single_sfixed64 = 10;
-  float single_float = 11;
-  double single_double = 12;
-  bool single_bool = 13;
-  string single_string = 14;
-  bytes single_bytes = 15;
-
-  NestedMessage single_nested_message = 18;
-  ForeignMessage single_foreign_message = 19;
-  protobuf_unittest_import.ImportMessage single_import_message = 20;
-
-  NestedEnum single_nested_enum = 21;
-  ForeignEnum single_foreign_enum = 22;
-  protobuf_unittest_import.ImportEnum single_import_enum = 23;
-
-  // Defined in unittest_import_public.proto
-  protobuf_unittest_import.PublicImportMessage
-      single_public_import_message = 26;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated NestedMessage                        repeated_nested_message  = 48;
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
-
-  repeated NestedEnum                           repeated_nested_enum     = 51;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
-  // Defined in unittest_import_public.proto
-  repeated protobuf_unittest_import.PublicImportMessage
-      repeated_public_import_message = 54;
-
-  // For oneof test
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    NestedMessage oneof_nested_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-  }
-}
-
-// This proto includes a recusively nested message.
-message NestedTestAllTypes {
-  NestedTestAllTypes child = 1;
-  TestAllTypes payload = 2;
-  repeated NestedTestAllTypes repeated_child = 3;
-}
-
-message TestDeprecatedFields {
-  int32 deprecated_int32 = 1 [deprecated=true];
-}
-
-// Define these after TestAllTypes to make sure the compiler can handle
-// that.
-message ForeignMessage {
-  int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_UNSPECIFIED = 0;
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestReservedFields {
-  reserved 2, 15, 9 to 11;
-  reserved "bar", "baz";
-}
-
-
-// Test that we can use NestedMessage from outside TestAllTypes.
-message TestForeignNested {
-  TestAllTypes.NestedMessage foreign_nested = 1;
-}
-
-// Test that really large tag numbers don't break anything.
-message TestReallyLargeTagNumber {
-  // The largest possible tag number is 2^28 - 1, since the wire format uses
-  // three bits to communicate wire type.
-  int32 a = 1;
-  int32 bb = 268435455;
-}
-
-message TestRecursiveMessage {
-  TestRecursiveMessage a = 1;
-  int32 i = 2;
-}
-
-// Test that mutual recursion works.
-message TestMutualRecursionA {
-  TestMutualRecursionB bb = 1;
-}
-
-message TestMutualRecursionB {
-  TestMutualRecursionA a = 1;
-  int32 optional_int32 = 2;
-}
-
-message TestEnumAllowAlias {
-  TestEnumWithDupValue value = 1;
-}
-
-// Test an enum that has multiple values with the same number.
-enum TestEnumWithDupValue {
-  TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
-  option allow_alias = true;
-
-  FOO1 = 1;
-  BAR1 = 2;
-  BAZ = 3;
-  FOO2 = 1;
-  BAR2 = 2;
-}
-
-// Test an enum with large, unordered values.
-enum TestSparseEnum {
-  TEST_SPARSE_ENUM_UNSPECIFIED = 0;
-  SPARSE_A = 123;
-  SPARSE_B = 62374;
-  SPARSE_C = 12589234;
-  SPARSE_D = -15;
-  SPARSE_E = -53452;
-  // In proto3, value 0 must be the first one specified
-  // SPARSE_F = 0;
-  SPARSE_G = 2;
-}
-
-// Test message with CamelCase field names.  This violates Protocol Buffer
-// standard style.
-message TestCamelCaseFieldNames {
-  int32 PrimitiveField = 1;
-  string StringField = 2;
-  ForeignEnum EnumField = 3;
-  ForeignMessage MessageField = 4;
-
-  repeated int32 RepeatedPrimitiveField = 7;
-  repeated string RepeatedStringField = 8;
-  repeated ForeignEnum RepeatedEnumField = 9;
-  repeated ForeignMessage RepeatedMessageField = 10;
-}
-
-
-// We list fields out of order, to ensure that we're using field number and not
-// field index to determine serialization order.
-message TestFieldOrderings {
-  string my_string = 11;
-  int64 my_int = 1;
-  float my_float = 101;
-  message NestedMessage {
-    int64 oo = 2;
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    int32 bb = 1;
-  }
-
-  NestedMessage single_nested_message  = 200;
-}
-
-message SparseEnumMessage {
-  TestSparseEnum sparse_enum = 1;
-}
-
-// Test String and Bytes: string is for valid UTF-8 strings
-message OneString {
-  string data = 1;
-}
-
-message MoreString {
-  repeated string data = 1;
-}
-
-message OneBytes {
-  bytes data = 1;
-}
-
-message MoreBytes {
-  bytes data = 1;
-}
-
-// Test int32, uint32, int64, uint64, and bool are all compatible
-message Int32Message {
-  int32 data = 1;
-}
-
-message Uint32Message {
-  uint32 data = 1;
-}
-
-message Int64Message {
-  int64 data = 1;
-}
-
-message Uint64Message {
-  uint64 data = 1;
-}
-
-message BoolMessage {
-  bool data = 1;
-}
-
-// Test oneofs.
-message TestOneof {
-  oneof foo {
-    int32 foo_int = 1;
-    string foo_string = 2;
-    TestAllTypes foo_message = 3;
-  }
-}
-
-// Test messages for packed fields
-
-message TestPackedTypes {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnum packed_enum  = 103 [packed = true];
-}
-
-// A message with the same fields as TestPackedTypes, but without packing. Used
-// to test packed <-> unpacked wire compatibility.
-message TestUnpackedTypes {
-  repeated    int32 unpacked_int32    =  90 [packed = false];
-  repeated    int64 unpacked_int64    =  91 [packed = false];
-  repeated   uint32 unpacked_uint32   =  92 [packed = false];
-  repeated   uint64 unpacked_uint64   =  93 [packed = false];
-  repeated   sint32 unpacked_sint32   =  94 [packed = false];
-  repeated   sint64 unpacked_sint64   =  95 [packed = false];
-  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
-  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
-  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
-  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
-  repeated    float unpacked_float    = 100 [packed = false];
-  repeated   double unpacked_double   = 101 [packed = false];
-  repeated     bool unpacked_bool     = 102 [packed = false];
-  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
-}
-
-message TestRepeatedScalarDifferentTagSizes {
-  // Parsing repeated fixed size values used to fail. This message needs to be
-  // used in order to get a tag of the right size; all of the repeated fields
-  // in TestAllTypes didn't trigger the check.
-  repeated fixed32 repeated_fixed32 = 12;
-  // Check for a varint type, just for good measure.
-  repeated int32   repeated_int32   = 13;
-
-  // These have two-byte tags.
-  repeated fixed64 repeated_fixed64 = 2046;
-  repeated int64   repeated_int64   = 2047;
-
-  // Three byte tags.
-  repeated float   repeated_float   = 262142;
-  repeated uint64  repeated_uint64  = 262143;
-}
-
-message TestCommentInjectionMessage {
-  // */ <- This should not close the generated doc comment
-  string a = 1;
-}
-
-
-// Test that RPC services work.
-message FooRequest  {}
-message FooResponse {}
-
-message FooClientMessage {}
-message FooServerMessage{}
-
-service TestService {
-  rpc Foo(FooRequest) returns (FooResponse);
-  rpc Bar(BarRequest) returns (BarResponse);
-}
-
-
-message BarRequest  {}
-message BarResponse {}
-
-message TestEmptyMessage {}
diff --git a/csharp/src/AddressBook/AddressBook.csproj b/csharp/src/AddressBook/AddressBook.csproj
index 6edfdca..8f8ca7e 100644
--- a/csharp/src/AddressBook/AddressBook.csproj
+++ b/csharp/src/AddressBook/AddressBook.csproj
@@ -1,14 +1,75 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp1.0</TargetFramework>
-    <OutputType>Exe</OutputType>
-    <StartupObject>Google.Protobuf.Examples.AddressBook.Program</StartupObject>
-    <IsPackable>False</IsPackable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj" />
-  </ItemGroup>
-
-</Project>
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

+    <ProductVersion>9.0.30729</ProductVersion>

+    <SchemaVersion>2.0</SchemaVersion>

+    <ProjectGuid>{A31F5FB2-4FF3-432A-B35B-5CD203606311}</ProjectGuid>

+    <OutputType>Exe</OutputType>

+    <AppDesignerFolder>Properties</AppDesignerFolder>

+    <RootNamespace>Google.Protobuf.Examples.AddressBook</RootNamespace>

+    <AssemblyName>AddressBook</AssemblyName>

+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

+    <FileAlignment>512</FileAlignment>

+    <StartupObject>Google.Protobuf.Examples.AddressBook.Program</StartupObject>

+    <TargetFrameworkProfile>

+    </TargetFrameworkProfile>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

+    <DebugSymbols>true</DebugSymbols>

+    <DebugType>full</DebugType>

+    <Optimize>false</Optimize>

+    <OutputPath>bin\Debug</OutputPath>

+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>

+    <DefineConstants>DEBUG;TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\Release</OutputPath>

+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>

+    <DefineConstants>TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+  </PropertyGroup>

+  <ItemGroup>

+    <Reference Include="mscorlib" />

+    <Reference Include="System" />

+    <Reference Include="System.Data" />

+    <Reference Include="System.Xml" />

+  </ItemGroup>

+  <ItemGroup>

+    <Compile Include="AddPerson.cs" />

+    <Compile Include="Addressbook.cs" />

+    <Compile Include="SampleUsage.cs" />

+    <Compile Include="ListPeople.cs" />

+    <Compile Include="Program.cs" />

+    <Compile Include="Properties\AssemblyInfo.cs" />

+  </ItemGroup>

+  <ItemGroup>

+    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj">

+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>

+      <Name>Google.Protobuf</Name>

+    </ProjectReference>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="app.config" />

+  </ItemGroup>

+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+       Other similar extension points exist, see Microsoft.Common.targets.

+  <Target Name="BeforeBuild">

+  </Target>

+  <Target Name="AfterBuild">

+  </Target>

+  -->

+</Project>
\ No newline at end of file
diff --git a/csharp/src/AddressBook/Addressbook.cs b/csharp/src/AddressBook/Addressbook.cs
index ceb9369..362e1cb 100644
--- a/csharp/src/AddressBook/Addressbook.cs
+++ b/csharp/src/AddressBook/Addressbook.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: addressbook.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: addressbook.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.Examples.AddressBook {
 
   /// <summary>Holder for reflection information generated from addressbook.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class AddressbookReflection {
 
     #region Descriptor
@@ -24,21 +23,19 @@
     static AddressbookReflection() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "ChFhZGRyZXNzYm9vay5wcm90bxIIdHV0b3JpYWwaH2dvb2dsZS9wcm90b2J1",
-            "Zi90aW1lc3RhbXAucHJvdG8ihwIKBlBlcnNvbhIMCgRuYW1lGAEgASgJEgoK",
-            "AmlkGAIgASgFEg0KBWVtYWlsGAMgASgJEiwKBnBob25lcxgEIAMoCzIcLnR1",
-            "dG9yaWFsLlBlcnNvbi5QaG9uZU51bWJlchIwCgxsYXN0X3VwZGF0ZWQYBSAB",
-            "KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGkcKC1Bob25lTnVtYmVy",
-            "Eg4KBm51bWJlchgBIAEoCRIoCgR0eXBlGAIgASgOMhoudHV0b3JpYWwuUGVy",
-            "c29uLlBob25lVHlwZSIrCglQaG9uZVR5cGUSCgoGTU9CSUxFEAASCAoESE9N",
-            "RRABEggKBFdPUksQAiIvCgtBZGRyZXNzQm9vaxIgCgZwZW9wbGUYASADKAsy",
-            "EC50dXRvcmlhbC5QZXJzb25CUAoUY29tLmV4YW1wbGUudHV0b3JpYWxCEUFk",
-            "ZHJlc3NCb29rUHJvdG9zqgIkR29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFk",
-            "ZHJlc3NCb29rYgZwcm90bzM="));
+            "ChFhZGRyZXNzYm9vay5wcm90bxIIdHV0b3JpYWwi1QEKBlBlcnNvbhIMCgRu",
+            "YW1lGAEgASgJEgoKAmlkGAIgASgFEg0KBWVtYWlsGAMgASgJEiwKBnBob25l",
+            "cxgEIAMoCzIcLnR1dG9yaWFsLlBlcnNvbi5QaG9uZU51bWJlchpHCgtQaG9u",
+            "ZU51bWJlchIOCgZudW1iZXIYASABKAkSKAoEdHlwZRgCIAEoDjIaLnR1dG9y",
+            "aWFsLlBlcnNvbi5QaG9uZVR5cGUiKwoJUGhvbmVUeXBlEgoKBk1PQklMRRAA",
+            "EggKBEhPTUUQARIICgRXT1JLEAIiLwoLQWRkcmVzc0Jvb2sSIAoGcGVvcGxl",
+            "GAEgAygLMhAudHV0b3JpYWwuUGVyc29uQlAKFGNvbS5leGFtcGxlLnR1dG9y",
+            "aWFsQhFBZGRyZXNzQm9va1Byb3Rvc6oCJEdvb2dsZS5Qcm90b2J1Zi5FeGFt",
+            "cGxlcy5BZGRyZXNzQm9va2IGcHJvdG8z"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-          new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, },
+          new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Examples.AddressBook.Person), global::Google.Protobuf.Examples.AddressBook.Person.Parser, new[]{ "Name", "Id", "Email", "Phones", "LastUpdated" }, null, new[]{ typeof(global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber), global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber.Parser, new[]{ "Number", "Type" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Examples.AddressBook.Person), global::Google.Protobuf.Examples.AddressBook.Person.Parser, new[]{ "Name", "Id", "Email", "Phones" }, null, new[]{ typeof(global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber), global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber.Parser, new[]{ "Number", "Type" }, null, null, null)}),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Examples.AddressBook.AddressBook), global::Google.Protobuf.Examples.AddressBook.AddressBook.Parser, new[]{ "People" }, null, null, null)
           }));
     }
@@ -47,42 +44,34 @@
   }
   #region Messages
   /// <summary>
-  /// [START messages]
+  ///  [START messages]
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Person : pb::IMessage<Person> {
     private static readonly pb::MessageParser<Person> _parser = new pb::MessageParser<Person>(() => new Person());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Person> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.Examples.AddressBook.AddressbookReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Person() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Person(Person other) : this() {
       name_ = other.name_;
       id_ = other.id_;
       email_ = other.email_;
       phones_ = other.phones_.Clone();
-      LastUpdated = other.lastUpdated_ != null ? other.LastUpdated.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Person Clone() {
       return new Person(this);
     }
@@ -90,7 +79,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -102,9 +90,8 @@
     public const int IdFieldNumber = 2;
     private int id_;
     /// <summary>
-    /// Unique ID number for this person.
+    ///  Unique ID number for this person.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Id {
       get { return id_; }
       set {
@@ -115,7 +102,6 @@
     /// <summary>Field number for the "email" field.</summary>
     public const int EmailFieldNumber = 3;
     private string email_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Email {
       get { return email_; }
       set {
@@ -128,28 +114,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber> _repeated_phones_codec
         = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber> phones_ = new pbc::RepeatedField<global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneNumber> Phones {
       get { return phones_; }
     }
 
-    /// <summary>Field number for the "last_updated" field.</summary>
-    public const int LastUpdatedFieldNumber = 5;
-    private global::Google.Protobuf.WellKnownTypes.Timestamp lastUpdated_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.Timestamp LastUpdated {
-      get { return lastUpdated_; }
-      set {
-        lastUpdated_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Person);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Person other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -161,30 +133,22 @@
       if (Id != other.Id) return false;
       if (Email != other.Email) return false;
       if(!phones_.Equals(other.phones_)) return false;
-      if (!object.Equals(LastUpdated, other.LastUpdated)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Id != 0) hash ^= Id.GetHashCode();
       if (Email.Length != 0) hash ^= Email.GetHashCode();
       hash ^= phones_.GetHashCode();
-      if (lastUpdated_ != null) hash ^= LastUpdated.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -199,16 +163,8 @@
         output.WriteString(Email);
       }
       phones_.WriteTo(output, _repeated_phones_codec);
-      if (lastUpdated_ != null) {
-        output.WriteRawTag(42);
-        output.WriteMessage(LastUpdated);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -221,16 +177,9 @@
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Email);
       }
       size += phones_.CalculateSize(_repeated_phones_codec);
-      if (lastUpdated_ != null) {
-        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LastUpdated);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Person other) {
       if (other == null) {
         return;
@@ -245,22 +194,14 @@
         Email = other.Email;
       }
       phones_.Add(other.phones_);
-      if (other.lastUpdated_ != null) {
-        if (lastUpdated_ == null) {
-          lastUpdated_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
-        }
-        LastUpdated.MergeFrom(other.LastUpdated);
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -278,20 +219,13 @@
             phones_.AddEntriesFrom(input, _repeated_phones_codec);
             break;
           }
-          case 42: {
-            if (lastUpdated_ == null) {
-              lastUpdated_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
-            }
-            input.ReadMessage(lastUpdated_);
-            break;
-          }
         }
       }
     }
 
     #region Nested types
     /// <summary>Container for nested types declared in the Person message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       public enum PhoneType {
         [pbr::OriginalName("MOBILE")] Mobile = 0,
@@ -299,37 +233,30 @@
         [pbr::OriginalName("WORK")] Work = 2,
       }
 
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       public sealed partial class PhoneNumber : pb::IMessage<PhoneNumber> {
         private static readonly pb::MessageParser<PhoneNumber> _parser = new pb::MessageParser<PhoneNumber>(() => new PhoneNumber());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<PhoneNumber> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.Examples.AddressBook.Person.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public PhoneNumber() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public PhoneNumber(PhoneNumber other) : this() {
           number_ = other.number_;
           type_ = other.type_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public PhoneNumber Clone() {
           return new PhoneNumber(this);
         }
@@ -337,7 +264,6 @@
         /// <summary>Field number for the "number" field.</summary>
         public const int NumberFieldNumber = 1;
         private string number_ = "";
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public string Number {
           get { return number_; }
           set {
@@ -348,7 +274,6 @@
         /// <summary>Field number for the "type" field.</summary>
         public const int TypeFieldNumber = 2;
         private global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType type_ = 0;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public global::Google.Protobuf.Examples.AddressBook.Person.Types.PhoneType Type {
           get { return type_; }
           set {
@@ -356,12 +281,10 @@
           }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as PhoneNumber);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(PhoneNumber other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -371,26 +294,20 @@
           }
           if (Number != other.Number) return false;
           if (Type != other.Type) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           if (Number.Length != 0) hash ^= Number.GetHashCode();
           if (Type != 0) hash ^= Type.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           if (Number.Length != 0) {
             output.WriteRawTag(10);
@@ -400,12 +317,8 @@
             output.WriteRawTag(16);
             output.WriteEnum((int) Type);
           }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           if (Number.Length != 0) {
@@ -414,13 +327,9 @@
           if (Type != 0) {
             size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type);
           }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(PhoneNumber other) {
           if (other == null) {
             return;
@@ -431,16 +340,14 @@
           if (other.Type != 0) {
             Type = other.Type;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 10: {
                 Number = input.ReadString();
@@ -462,38 +369,31 @@
   }
 
   /// <summary>
-  /// Our address book file is just one of these.
+  ///  Our address book file is just one of these.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class AddressBook : pb::IMessage<AddressBook> {
     private static readonly pb::MessageParser<AddressBook> _parser = new pb::MessageParser<AddressBook>(() => new AddressBook());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<AddressBook> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.Examples.AddressBook.AddressbookReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public AddressBook() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public AddressBook(AddressBook other) : this() {
       people_ = other.people_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public AddressBook Clone() {
       return new AddressBook(this);
     }
@@ -503,17 +403,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Examples.AddressBook.Person> _repeated_people_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Examples.AddressBook.Person.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Examples.AddressBook.Person> people_ = new pbc::RepeatedField<global::Google.Protobuf.Examples.AddressBook.Person>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Examples.AddressBook.Person> People {
       get { return people_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as AddressBook);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(AddressBook other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -522,58 +419,42 @@
         return true;
       }
       if(!people_.Equals(other.people_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= people_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       people_.WriteTo(output, _repeated_people_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += people_.CalculateSize(_repeated_people_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(AddressBook other) {
       if (other == null) {
         return;
       }
       people_.Add(other.people_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             people_.AddEntriesFrom(input, _repeated_people_codec);
diff --git a/csharp/src/AddressBook/Properties/AssemblyInfo.cs b/csharp/src/AddressBook/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9cb014c
--- /dev/null
+++ b/csharp/src/AddressBook/Properties/AssemblyInfo.cs
@@ -0,0 +1,18 @@
+using System.Reflection;

+using System.Runtime.InteropServices;

+

+// General Information about an assembly is controlled through the following 

+// set of attributes. Change these attribute values to modify the information

+// associated with an assembly.

+

+[assembly: AssemblyTitle("AddressBook")]

+[assembly: AssemblyDescription("")]

+[assembly: AssemblyConfiguration("")]

+[assembly: AssemblyCompany("")]

+[assembly: AssemblyProduct("AddressBook")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

+[assembly: AssemblyTrademark("")]

+[assembly: AssemblyCulture("")]

+

+[assembly: AssemblyVersion("3.0.0.0")]

+[assembly: AssemblyFileVersion("3.0.0.0")]

diff --git a/csharp/src/AddressBook/SampleUsage.cs b/csharp/src/AddressBook/SampleUsage.cs
index 941d865..aaaedda 100644
--- a/csharp/src/AddressBook/SampleUsage.cs
+++ b/csharp/src/AddressBook/SampleUsage.cs
@@ -66,7 +66,7 @@
             // The message performs a deep-comparison on equality:

             if (restored.People.Count != 1 || !person.Equals(restored.People[0]))

             {

-                throw new Exception("There is a bad person in here!");

+                throw new ApplicationException("There is a bad person in here!");

             }

         }

     }

diff --git a/csharp/src/AddressBook/app.config b/csharp/src/AddressBook/app.config
new file mode 100644
index 0000000..a80813a
--- /dev/null
+++ b/csharp/src/AddressBook/app.config
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+	<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
diff --git a/csharp/src/Google.Protobuf.Conformance/App.config b/csharp/src/Google.Protobuf.Conformance/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Conformance/App.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Conformance/Conformance.cs b/csharp/src/Google.Protobuf.Conformance/Conformance.cs
index f6118ea..1674a67 100644
--- a/csharp/src/Google.Protobuf.Conformance/Conformance.cs
+++ b/csharp/src/Google.Protobuf.Conformance/Conformance.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: conformance.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: conformance.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Conformance {
 
   /// <summary>Holder for reflection information generated from conformance.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class ConformanceReflection {
 
     #region Descriptor
@@ -24,22 +23,175 @@
     static ConformanceReflection() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "ChFjb25mb3JtYW5jZS5wcm90bxILY29uZm9ybWFuY2UiowEKEkNvbmZvcm1h",
-            "bmNlUmVxdWVzdBIaChBwcm90b2J1Zl9wYXlsb2FkGAEgASgMSAASFgoManNv",
-            "bl9wYXlsb2FkGAIgASgJSAASOAoXcmVxdWVzdGVkX291dHB1dF9mb3JtYXQY",
-            "AyABKA4yFy5jb25mb3JtYW5jZS5XaXJlRm9ybWF0EhQKDG1lc3NhZ2VfdHlw",
-            "ZRgEIAEoCUIJCgdwYXlsb2FkIrEBChNDb25mb3JtYW5jZVJlc3BvbnNlEhUK",
-            "C3BhcnNlX2Vycm9yGAEgASgJSAASGQoPc2VyaWFsaXplX2Vycm9yGAYgASgJ",
-            "SAASFwoNcnVudGltZV9lcnJvchgCIAEoCUgAEhoKEHByb3RvYnVmX3BheWxv",
-            "YWQYAyABKAxIABIWCgxqc29uX3BheWxvYWQYBCABKAlIABIRCgdza2lwcGVk",
-            "GAUgASgJSABCCAoGcmVzdWx0KjUKCldpcmVGb3JtYXQSDwoLVU5TUEVDSUZJ",
-            "RUQQABIMCghQUk9UT0JVRhABEggKBEpTT04QAkIhCh9jb20uZ29vZ2xlLnBy",
-            "b3RvYnVmLmNvbmZvcm1hbmNlYgZwcm90bzM="));
+            "ChFjb25mb3JtYW5jZS5wcm90bxILY29uZm9ybWFuY2UaGWdvb2dsZS9wcm90",
+            "b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90",
+            "bxogZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8aHGdvb2dsZS9w",
+            "cm90b2J1Zi9zdHJ1Y3QucHJvdG8aH2dvb2dsZS9wcm90b2J1Zi90aW1lc3Rh",
+            "bXAucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byKNAQoS",
+            "Q29uZm9ybWFuY2VSZXF1ZXN0EhoKEHByb3RvYnVmX3BheWxvYWQYASABKAxI",
+            "ABIWCgxqc29uX3BheWxvYWQYAiABKAlIABI4ChdyZXF1ZXN0ZWRfb3V0cHV0",
+            "X2Zvcm1hdBgDIAEoDjIXLmNvbmZvcm1hbmNlLldpcmVGb3JtYXRCCQoHcGF5",
+            "bG9hZCKxAQoTQ29uZm9ybWFuY2VSZXNwb25zZRIVCgtwYXJzZV9lcnJvchgB",
+            "IAEoCUgAEhkKD3NlcmlhbGl6ZV9lcnJvchgGIAEoCUgAEhcKDXJ1bnRpbWVf",
+            "ZXJyb3IYAiABKAlIABIaChBwcm90b2J1Zl9wYXlsb2FkGAMgASgMSAASFgoM",
+            "anNvbl9wYXlsb2FkGAQgASgJSAASEQoHc2tpcHBlZBgFIAEoCUgAQggKBnJl",
+            "c3VsdCLVMgoMVGVzdEFsbFR5cGVzEhYKDm9wdGlvbmFsX2ludDMyGAEgASgF",
+            "EhYKDm9wdGlvbmFsX2ludDY0GAIgASgDEhcKD29wdGlvbmFsX3VpbnQzMhgD",
+            "IAEoDRIXCg9vcHRpb25hbF91aW50NjQYBCABKAQSFwoPb3B0aW9uYWxfc2lu",
+            "dDMyGAUgASgREhcKD29wdGlvbmFsX3NpbnQ2NBgGIAEoEhIYChBvcHRpb25h",
+            "bF9maXhlZDMyGAcgASgHEhgKEG9wdGlvbmFsX2ZpeGVkNjQYCCABKAYSGQoR",
+            "b3B0aW9uYWxfc2ZpeGVkMzIYCSABKA8SGQoRb3B0aW9uYWxfc2ZpeGVkNjQY",
+            "CiABKBASFgoOb3B0aW9uYWxfZmxvYXQYCyABKAISFwoPb3B0aW9uYWxfZG91",
+            "YmxlGAwgASgBEhUKDW9wdGlvbmFsX2Jvb2wYDSABKAgSFwoPb3B0aW9uYWxf",
+            "c3RyaW5nGA4gASgJEhYKDm9wdGlvbmFsX2J5dGVzGA8gASgMEkgKF29wdGlv",
+            "bmFsX25lc3RlZF9tZXNzYWdlGBIgASgLMicuY29uZm9ybWFuY2UuVGVzdEFs",
+            "bFR5cGVzLk5lc3RlZE1lc3NhZ2USPQoYb3B0aW9uYWxfZm9yZWlnbl9tZXNz",
+            "YWdlGBMgASgLMhsuY29uZm9ybWFuY2UuRm9yZWlnbk1lc3NhZ2USQgoUb3B0",
+            "aW9uYWxfbmVzdGVkX2VudW0YFSABKA4yJC5jb25mb3JtYW5jZS5UZXN0QWxs",
+            "VHlwZXMuTmVzdGVkRW51bRI3ChVvcHRpb25hbF9mb3JlaWduX2VudW0YFiAB",
+            "KA4yGC5jb25mb3JtYW5jZS5Gb3JlaWduRW51bRIhChVvcHRpb25hbF9zdHJp",
+            "bmdfcGllY2UYGCABKAlCAggCEhkKDW9wdGlvbmFsX2NvcmQYGSABKAlCAggB",
+            "EjQKEXJlY3Vyc2l2ZV9tZXNzYWdlGBsgASgLMhkuY29uZm9ybWFuY2UuVGVz",
+            "dEFsbFR5cGVzEhYKDnJlcGVhdGVkX2ludDMyGB8gAygFEhYKDnJlcGVhdGVk",
+            "X2ludDY0GCAgAygDEhcKD3JlcGVhdGVkX3VpbnQzMhghIAMoDRIXCg9yZXBl",
+            "YXRlZF91aW50NjQYIiADKAQSFwoPcmVwZWF0ZWRfc2ludDMyGCMgAygREhcK",
+            "D3JlcGVhdGVkX3NpbnQ2NBgkIAMoEhIYChByZXBlYXRlZF9maXhlZDMyGCUg",
+            "AygHEhgKEHJlcGVhdGVkX2ZpeGVkNjQYJiADKAYSGQoRcmVwZWF0ZWRfc2Zp",
+            "eGVkMzIYJyADKA8SGQoRcmVwZWF0ZWRfc2ZpeGVkNjQYKCADKBASFgoOcmVw",
+            "ZWF0ZWRfZmxvYXQYKSADKAISFwoPcmVwZWF0ZWRfZG91YmxlGCogAygBEhUK",
+            "DXJlcGVhdGVkX2Jvb2wYKyADKAgSFwoPcmVwZWF0ZWRfc3RyaW5nGCwgAygJ",
+            "EhYKDnJlcGVhdGVkX2J5dGVzGC0gAygMEkgKF3JlcGVhdGVkX25lc3RlZF9t",
+            "ZXNzYWdlGDAgAygLMicuY29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLk5lc3Rl",
+            "ZE1lc3NhZ2USPQoYcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlGDEgAygLMhsu",
+            "Y29uZm9ybWFuY2UuRm9yZWlnbk1lc3NhZ2USQgoUcmVwZWF0ZWRfbmVzdGVk",
+            "X2VudW0YMyADKA4yJC5jb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuTmVzdGVk",
+            "RW51bRI3ChVyZXBlYXRlZF9mb3JlaWduX2VudW0YNCADKA4yGC5jb25mb3Jt",
+            "YW5jZS5Gb3JlaWduRW51bRIhChVyZXBlYXRlZF9zdHJpbmdfcGllY2UYNiAD",
+            "KAlCAggCEhkKDXJlcGVhdGVkX2NvcmQYNyADKAlCAggBEkUKD21hcF9pbnQz",
+            "Ml9pbnQzMhg4IAMoCzIsLmNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5NYXBJ",
+            "bnQzMkludDMyRW50cnkSRQoPbWFwX2ludDY0X2ludDY0GDkgAygLMiwuY29u",
+            "Zm9ybWFuY2UuVGVzdEFsbFR5cGVzLk1hcEludDY0SW50NjRFbnRyeRJJChFt",
+            "YXBfdWludDMyX3VpbnQzMhg6IAMoCzIuLmNvbmZvcm1hbmNlLlRlc3RBbGxU",
+            "eXBlcy5NYXBVaW50MzJVaW50MzJFbnRyeRJJChFtYXBfdWludDY0X3VpbnQ2",
+            "NBg7IAMoCzIuLmNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5NYXBVaW50NjRV",
+            "aW50NjRFbnRyeRJJChFtYXBfc2ludDMyX3NpbnQzMhg8IAMoCzIuLmNvbmZv",
+            "cm1hbmNlLlRlc3RBbGxUeXBlcy5NYXBTaW50MzJTaW50MzJFbnRyeRJJChFt",
+            "YXBfc2ludDY0X3NpbnQ2NBg9IAMoCzIuLmNvbmZvcm1hbmNlLlRlc3RBbGxU",
+            "eXBlcy5NYXBTaW50NjRTaW50NjRFbnRyeRJNChNtYXBfZml4ZWQzMl9maXhl",
+            "ZDMyGD4gAygLMjAuY29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLk1hcEZpeGVk",
+            "MzJGaXhlZDMyRW50cnkSTQoTbWFwX2ZpeGVkNjRfZml4ZWQ2NBg/IAMoCzIw",
+            "LmNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5NYXBGaXhlZDY0Rml4ZWQ2NEVu",
+            "dHJ5ElEKFW1hcF9zZml4ZWQzMl9zZml4ZWQzMhhAIAMoCzIyLmNvbmZvcm1h",
+            "bmNlLlRlc3RBbGxUeXBlcy5NYXBTZml4ZWQzMlNmaXhlZDMyRW50cnkSUQoV",
+            "bWFwX3NmaXhlZDY0X3NmaXhlZDY0GEEgAygLMjIuY29uZm9ybWFuY2UuVGVz",
+            "dEFsbFR5cGVzLk1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRJFCg9tYXBfaW50",
+            "MzJfZmxvYXQYQiADKAsyLC5jb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuTWFw",
+            "SW50MzJGbG9hdEVudHJ5EkcKEG1hcF9pbnQzMl9kb3VibGUYQyADKAsyLS5j",
+            "b25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuTWFwSW50MzJEb3VibGVFbnRyeRJB",
+            "Cg1tYXBfYm9vbF9ib29sGEQgAygLMiouY29uZm9ybWFuY2UuVGVzdEFsbFR5",
+            "cGVzLk1hcEJvb2xCb29sRW50cnkSSQoRbWFwX3N0cmluZ19zdHJpbmcYRSAD",
+            "KAsyLi5jb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuTWFwU3RyaW5nU3RyaW5n",
+            "RW50cnkSRwoQbWFwX3N0cmluZ19ieXRlcxhGIAMoCzItLmNvbmZvcm1hbmNl",
+            "LlRlc3RBbGxUeXBlcy5NYXBTdHJpbmdCeXRlc0VudHJ5ElgKGW1hcF9zdHJp",
+            "bmdfbmVzdGVkX21lc3NhZ2UYRyADKAsyNS5jb25mb3JtYW5jZS5UZXN0QWxs",
+            "VHlwZXMuTWFwU3RyaW5nTmVzdGVkTWVzc2FnZUVudHJ5EloKGm1hcF9zdHJp",
+            "bmdfZm9yZWlnbl9tZXNzYWdlGEggAygLMjYuY29uZm9ybWFuY2UuVGVzdEFs",
+            "bFR5cGVzLk1hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlRW50cnkSUgoWbWFwX3N0",
+            "cmluZ19uZXN0ZWRfZW51bRhJIAMoCzIyLmNvbmZvcm1hbmNlLlRlc3RBbGxU",
+            "eXBlcy5NYXBTdHJpbmdOZXN0ZWRFbnVtRW50cnkSVAoXbWFwX3N0cmluZ19m",
+            "b3JlaWduX2VudW0YSiADKAsyMy5jb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMu",
+            "TWFwU3RyaW5nRm9yZWlnbkVudW1FbnRyeRIWCgxvbmVvZl91aW50MzIYbyAB",
+            "KA1IABJHChRvbmVvZl9uZXN0ZWRfbWVzc2FnZRhwIAEoCzInLmNvbmZvcm1h",
+            "bmNlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlSAASFgoMb25lb2Zfc3Ry",
+            "aW5nGHEgASgJSAASFQoLb25lb2ZfYnl0ZXMYciABKAxIABI6ChVvcHRpb25h",
+            "bF9ib29sX3dyYXBwZXIYyQEgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xW",
+            "YWx1ZRI8ChZvcHRpb25hbF9pbnQzMl93cmFwcGVyGMoBIAEoCzIbLmdvb2ds",
+            "ZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjwKFm9wdGlvbmFsX2ludDY0X3dyYXBw",
+            "ZXIYywEgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSPgoXb3B0",
+            "aW9uYWxfdWludDMyX3dyYXBwZXIYzAEgASgLMhwuZ29vZ2xlLnByb3RvYnVm",
+            "LlVJbnQzMlZhbHVlEj4KF29wdGlvbmFsX3VpbnQ2NF93cmFwcGVyGM0BIAEo",
+            "CzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZRI8ChZvcHRpb25hbF9m",
+            "bG9hdF93cmFwcGVyGM4BIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GbG9hdFZh",
+            "bHVlEj4KF29wdGlvbmFsX2RvdWJsZV93cmFwcGVyGM8BIAEoCzIcLmdvb2ds",
+            "ZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI+ChdvcHRpb25hbF9zdHJpbmdfd3Jh",
+            "cHBlchjQASABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSPAoW",
+            "b3B0aW9uYWxfYnl0ZXNfd3JhcHBlchjRASABKAsyGy5nb29nbGUucHJvdG9i",
+            "dWYuQnl0ZXNWYWx1ZRI6ChVyZXBlYXRlZF9ib29sX3dyYXBwZXIY0wEgAygL",
+            "MhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZRI8ChZyZXBlYXRlZF9pbnQz",
+            "Ml93cmFwcGVyGNQBIAMoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVl",
+            "EjwKFnJlcGVhdGVkX2ludDY0X3dyYXBwZXIY1QEgAygLMhsuZ29vZ2xlLnBy",
+            "b3RvYnVmLkludDY0VmFsdWUSPgoXcmVwZWF0ZWRfdWludDMyX3dyYXBwZXIY",
+            "1gEgAygLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlEj4KF3JlcGVh",
+            "dGVkX3VpbnQ2NF93cmFwcGVyGNcBIAMoCzIcLmdvb2dsZS5wcm90b2J1Zi5V",
+            "SW50NjRWYWx1ZRI8ChZyZXBlYXRlZF9mbG9hdF93cmFwcGVyGNgBIAMoCzIb",
+            "Lmdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlEj4KF3JlcGVhdGVkX2RvdWJs",
+            "ZV93cmFwcGVyGNkBIAMoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1",
+            "ZRI+ChdyZXBlYXRlZF9zdHJpbmdfd3JhcHBlchjaASADKAsyHC5nb29nbGUu",
+            "cHJvdG9idWYuU3RyaW5nVmFsdWUSPAoWcmVwZWF0ZWRfYnl0ZXNfd3JhcHBl",
+            "chjbASADKAsyGy5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZRI1ChFvcHRp",
+            "b25hbF9kdXJhdGlvbhitAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRp",
+            "b24SNwoSb3B0aW9uYWxfdGltZXN0YW1wGK4CIAEoCzIaLmdvb2dsZS5wcm90",
+            "b2J1Zi5UaW1lc3RhbXASOAoTb3B0aW9uYWxfZmllbGRfbWFzaxivAiABKAsy",
+            "Gi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrEjEKD29wdGlvbmFsX3N0cnVj",
+            "dBiwAiABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0EisKDG9wdGlvbmFs",
+            "X2FueRixAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55Ei8KDm9wdGlvbmFs",
+            "X3ZhbHVlGLICIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZRI1ChFyZXBl",
+            "YXRlZF9kdXJhdGlvbhi3AiADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRp",
+            "b24SNwoScmVwZWF0ZWRfdGltZXN0YW1wGLgCIAMoCzIaLmdvb2dsZS5wcm90",
+            "b2J1Zi5UaW1lc3RhbXASNwoScmVwZWF0ZWRfZmllbGRtYXNrGLkCIAMoCzIa",
+            "Lmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sSMQoPcmVwZWF0ZWRfc3RydWN0",
+            "GMQCIAMoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSKwoMcmVwZWF0ZWRf",
+            "YW55GLsCIAMoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnkSLwoOcmVwZWF0ZWRf",
+            "dmFsdWUYvAIgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlEhMKCmZpZWxk",
+            "bmFtZTEYkQMgASgFEhQKC2ZpZWxkX25hbWUyGJIDIAEoBRIVCgxfZmllbGRf",
+            "bmFtZTMYkwMgASgFEhYKDWZpZWxkX19uYW1lNF8YlAMgASgFEhQKC2ZpZWxk",
+            "MG5hbWU1GJUDIAEoBRIWCg1maWVsZF8wX25hbWU2GJYDIAEoBRITCgpmaWVs",
+            "ZE5hbWU3GJcDIAEoBRITCgpGaWVsZE5hbWU4GJgDIAEoBRIUCgtmaWVsZF9O",
+            "YW1lORiZAyABKAUSFQoMRmllbGRfTmFtZTEwGJoDIAEoBRIVCgxGSUVMRF9O",
+            "QU1FMTEYmwMgASgFEhUKDEZJRUxEX25hbWUxMhicAyABKAUaSgoNTmVzdGVk",
+            "TWVzc2FnZRIJCgFhGAEgASgFEi4KC2NvcmVjdXJzaXZlGAIgASgLMhkuY29u",
+            "Zm9ybWFuY2UuVGVzdEFsbFR5cGVzGjQKEk1hcEludDMySW50MzJFbnRyeRIL",
+            "CgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50",
+            "NjRFbnRyeRILCgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1h",
+            "cFVpbnQzMlVpbnQzMkVudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEo",
+            "DToCOAEaNgoUTWFwVWludDY0VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0K",
+            "BXZhbHVlGAIgASgEOgI4ARo2ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNr",
+            "ZXkYASABKBESDQoFdmFsdWUYAiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2",
+            "NEVudHJ5EgsKA2tleRgBIAEoEhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFw",
+            "Rml4ZWQzMkZpeGVkMzJFbnRyeRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiAB",
+            "KAc6AjgBGjgKFk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgG",
+            "Eg0KBXZhbHVlGAIgASgGOgI4ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50",
+            "cnkSCwoDa2V5GAEgASgPEg0KBXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4",
+            "ZWQ2NFNmaXhlZDY0RW50cnkSCwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQ",
+            "OgI4ARo0ChJNYXBJbnQzMkZsb2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZh",
+            "bHVlGAIgASgCOgI4ARo1ChNNYXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgB",
+            "IAEoBRINCgV2YWx1ZRgCIAEoAToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRIL",
+            "CgNrZXkYASABKAgSDQoFdmFsdWUYAiABKAg6AjgBGjYKFE1hcFN0cmluZ1N0",
+            "cmluZ0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaNQoT",
+            "TWFwU3RyaW5nQnl0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiAB",
+            "KAw6AjgBGmYKG01hcFN0cmluZ05lc3RlZE1lc3NhZ2VFbnRyeRILCgNrZXkY",
+            "ASABKAkSNgoFdmFsdWUYAiABKAsyJy5jb25mb3JtYW5jZS5UZXN0QWxsVHlw",
+            "ZXMuTmVzdGVkTWVzc2FnZToCOAEaWwocTWFwU3RyaW5nRm9yZWlnbk1lc3Nh",
+            "Z2VFbnRyeRILCgNrZXkYASABKAkSKgoFdmFsdWUYAiABKAsyGy5jb25mb3Jt",
+            "YW5jZS5Gb3JlaWduTWVzc2FnZToCOAEaYAoYTWFwU3RyaW5nTmVzdGVkRW51",
+            "bUVudHJ5EgsKA2tleRgBIAEoCRIzCgV2YWx1ZRgCIAEoDjIkLmNvbmZvcm1h",
+            "bmNlLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtOgI4ARpVChlNYXBTdHJpbmdG",
+            "b3JlaWduRW51bUVudHJ5EgsKA2tleRgBIAEoCRInCgV2YWx1ZRgCIAEoDjIY",
+            "LmNvbmZvcm1hbmNlLkZvcmVpZ25FbnVtOgI4ASI5CgpOZXN0ZWRFbnVtEgcK",
+            "A0ZPTxAAEgcKA0JBUhABEgcKA0JBWhACEhAKA05FRxD///////////8BQg0K",
+            "C29uZW9mX2ZpZWxkIhsKDkZvcmVpZ25NZXNzYWdlEgkKAWMYASABKAUqNQoK",
+            "V2lyZUZvcm1hdBIPCgtVTlNQRUNJRklFRBAAEgwKCFBST1RPQlVGEAESCAoE",
+            "SlNPThACKkAKC0ZvcmVpZ25FbnVtEg8KC0ZPUkVJR05fRk9PEAASDwoLRk9S",
+            "RUlHTl9CQVIQARIPCgtGT1JFSUdOX0JBWhACQiEKH2NvbS5nb29nbGUucHJv",
+            "dG9idWYuY29uZm9ybWFuY2ViBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-          new pbr::FileDescriptor[] { },
-          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Conformance.WireFormat), }, new pbr::GeneratedClrTypeInfo[] {
-            new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.ConformanceRequest), global::Conformance.ConformanceRequest.Parser, new[]{ "ProtobufPayload", "JsonPayload", "RequestedOutputFormat", "MessageType" }, new[]{ "Payload" }, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.ConformanceResponse), global::Conformance.ConformanceResponse.Parser, new[]{ "ParseError", "SerializeError", "RuntimeError", "ProtobufPayload", "JsonPayload", "Skipped" }, new[]{ "Result" }, null, null)
+          new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, },
+          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Conformance.WireFormat), typeof(global::Conformance.ForeignEnum), }, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.ConformanceRequest), global::Conformance.ConformanceRequest.Parser, new[]{ "ProtobufPayload", "JsonPayload", "RequestedOutputFormat" }, new[]{ "Payload" }, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.ConformanceResponse), global::Conformance.ConformanceResponse.Parser, new[]{ "ParseError", "SerializeError", "RuntimeError", "ProtobufPayload", "JsonPayload", "Skipped" }, new[]{ "Result" }, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.TestAllTypes), global::Conformance.TestAllTypes.Parser, new[]{ "OptionalInt32", "OptionalInt64", "OptionalUint32", "OptionalUint64", "OptionalSint32", "OptionalSint64", "OptionalFixed32", "OptionalFixed64", "OptionalSfixed32", "OptionalSfixed64", "OptionalFloat", "OptionalDouble", "OptionalBool", "OptionalString", "OptionalBytes", "OptionalNestedMessage", "OptionalForeignMessage", "OptionalNestedEnum", "OptionalForeignEnum", "OptionalStringPiece", "OptionalCord", "RecursiveMessage", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedStringPiece", "RepeatedCord", "MapInt32Int32", "MapInt64Int64", "MapUint32Uint32", "MapUint64Uint64", "MapSint32Sint32", "MapSint64Sint64", "MapFixed32Fixed32", "MapFixed64Fixed64", "MapSfixed32Sfixed32", "MapSfixed64Sfixed64", "MapInt32Float", "MapInt32Double", "MapBoolBool", "MapStringString", "MapStringBytes", "MapStringNestedMessage", "MapStringForeignMessage", "MapStringNestedEnum", "MapStringForeignEnum", "OneofUint32", "OneofNestedMessage", "OneofString", "OneofBytes", "OptionalBoolWrapper", "OptionalInt32Wrapper", "OptionalInt64Wrapper", "OptionalUint32Wrapper", "OptionalUint64Wrapper", "OptionalFloatWrapper", "OptionalDoubleWrapper", "OptionalStringWrapper", "OptionalBytesWrapper", "RepeatedBoolWrapper", "RepeatedInt32Wrapper", "RepeatedInt64Wrapper", "RepeatedUint32Wrapper", "RepeatedUint64Wrapper", "RepeatedFloatWrapper", "RepeatedDoubleWrapper", "RepeatedStringWrapper", "RepeatedBytesWrapper", "OptionalDuration", "OptionalTimestamp", "OptionalFieldMask", "OptionalStruct", "OptionalAny", "OptionalValue", "RepeatedDuration", "RepeatedTimestamp", "RepeatedFieldmask", "RepeatedStruct", "RepeatedAny", "RepeatedValue", "Fieldname1", "FieldName2", "FieldName3", "FieldName4", "Field0Name5", "Field0Name6", "FieldName7", "FieldName8", "FieldName9", "FieldName10", "FIELDNAME11", "FIELDName12" }, new[]{ "OneofField" }, new[]{ typeof(global::Conformance.TestAllTypes.Types.NestedEnum) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.TestAllTypes.Types.NestedMessage), global::Conformance.TestAllTypes.Types.NestedMessage.Parser, new[]{ "A", "Corecursive" }, null, null, null),
+            null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, }),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Conformance.ForeignMessage), global::Conformance.ForeignMessage.Parser, new[]{ "C" }, null, null, null)
           }));
     }
     #endregion
@@ -52,43 +204,43 @@
     [pbr::OriginalName("JSON")] Json = 2,
   }
 
+  public enum ForeignEnum {
+    [pbr::OriginalName("FOREIGN_FOO")] ForeignFoo = 0,
+    [pbr::OriginalName("FOREIGN_BAR")] ForeignBar = 1,
+    [pbr::OriginalName("FOREIGN_BAZ")] ForeignBaz = 2,
+  }
+
   #endregion
 
   #region Messages
   /// <summary>
-  /// Represents a single test case's input.  The testee should:
+  ///  Represents a single test case's input.  The testee should:
   ///
-  ///   1. parse this proto (which should always succeed)
-  ///   2. parse the protobuf or JSON payload in "payload" (which may fail)
-  ///   3. if the parse succeeded, serialize the message in the requested format.
+  ///    1. parse this proto (which should always succeed)
+  ///    2. parse the protobuf or JSON payload in "payload" (which may fail)
+  ///    3. if the parse succeeded, serialize the message in the requested format.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ConformanceRequest : pb::IMessage<ConformanceRequest> {
     private static readonly pb::MessageParser<ConformanceRequest> _parser = new pb::MessageParser<ConformanceRequest>(() => new ConformanceRequest());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ConformanceRequest> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Conformance.ConformanceReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ConformanceRequest() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ConformanceRequest(ConformanceRequest other) : this() {
       requestedOutputFormat_ = other.requestedOutputFormat_;
-      messageType_ = other.messageType_;
       switch (other.PayloadCase) {
         case PayloadOneofCase.ProtobufPayload:
           ProtobufPayload = other.ProtobufPayload;
@@ -98,17 +250,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ConformanceRequest Clone() {
       return new ConformanceRequest(this);
     }
 
     /// <summary>Field number for the "protobuf_payload" field.</summary>
     public const int ProtobufPayloadFieldNumber = 1;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString ProtobufPayload {
       get { return payloadCase_ == PayloadOneofCase.ProtobufPayload ? (pb::ByteString) payload_ : pb::ByteString.Empty; }
       set {
@@ -119,7 +268,6 @@
 
     /// <summary>Field number for the "json_payload" field.</summary>
     public const int JsonPayloadFieldNumber = 2;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string JsonPayload {
       get { return payloadCase_ == PayloadOneofCase.JsonPayload ? (string) payload_ : ""; }
       set {
@@ -132,9 +280,8 @@
     public const int RequestedOutputFormatFieldNumber = 3;
     private global::Conformance.WireFormat requestedOutputFormat_ = 0;
     /// <summary>
-    /// Which format should the testee serialize its message to?
+    ///  Which format should the testee serialize its message to?
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Conformance.WireFormat RequestedOutputFormat {
       get { return requestedOutputFormat_; }
       set {
@@ -142,22 +289,6 @@
       }
     }
 
-    /// <summary>Field number for the "message_type" field.</summary>
-    public const int MessageTypeFieldNumber = 4;
-    private string messageType_ = "";
-    /// <summary>
-    /// The full name for the test message to use; for the moment, either:
-    /// protobuf_test_messages.proto3.TestAllTypesProto3 or
-    /// protobuf_test_messages.proto2.TestAllTypesProto2.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string MessageType {
-      get { return messageType_; }
-      set {
-        messageType_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
     private object payload_;
     /// <summary>Enum of possible cases for the "payload" oneof.</summary>
     public enum PayloadOneofCase {
@@ -166,23 +297,19 @@
       JsonPayload = 2,
     }
     private PayloadOneofCase payloadCase_ = PayloadOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public PayloadOneofCase PayloadCase {
       get { return payloadCase_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearPayload() {
       payloadCase_ = PayloadOneofCase.None;
       payload_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ConformanceRequest);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ConformanceRequest other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -193,31 +320,23 @@
       if (ProtobufPayload != other.ProtobufPayload) return false;
       if (JsonPayload != other.JsonPayload) return false;
       if (RequestedOutputFormat != other.RequestedOutputFormat) return false;
-      if (MessageType != other.MessageType) return false;
       if (PayloadCase != other.PayloadCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (payloadCase_ == PayloadOneofCase.ProtobufPayload) hash ^= ProtobufPayload.GetHashCode();
       if (payloadCase_ == PayloadOneofCase.JsonPayload) hash ^= JsonPayload.GetHashCode();
       if (RequestedOutputFormat != 0) hash ^= RequestedOutputFormat.GetHashCode();
-      if (MessageType.Length != 0) hash ^= MessageType.GetHashCode();
       hash ^= (int) payloadCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (payloadCase_ == PayloadOneofCase.ProtobufPayload) {
         output.WriteRawTag(10);
@@ -231,16 +350,8 @@
         output.WriteRawTag(24);
         output.WriteEnum((int) RequestedOutputFormat);
       }
-      if (MessageType.Length != 0) {
-        output.WriteRawTag(34);
-        output.WriteString(MessageType);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (payloadCase_ == PayloadOneofCase.ProtobufPayload) {
@@ -252,16 +363,9 @@
       if (RequestedOutputFormat != 0) {
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) RequestedOutputFormat);
       }
-      if (MessageType.Length != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeStringSize(MessageType);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ConformanceRequest other) {
       if (other == null) {
         return;
@@ -269,9 +373,6 @@
       if (other.RequestedOutputFormat != 0) {
         RequestedOutputFormat = other.RequestedOutputFormat;
       }
-      if (other.MessageType.Length != 0) {
-        MessageType = other.MessageType;
-      }
       switch (other.PayloadCase) {
         case PayloadOneofCase.ProtobufPayload:
           ProtobufPayload = other.ProtobufPayload;
@@ -281,16 +382,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             ProtobufPayload = input.ReadBytes();
@@ -304,10 +403,6 @@
             requestedOutputFormat_ = (global::Conformance.WireFormat) input.ReadEnum();
             break;
           }
-          case 34: {
-            MessageType = input.ReadString();
-            break;
-          }
         }
       }
     }
@@ -315,32 +410,27 @@
   }
 
   /// <summary>
-  /// Represents a single test case's output.
+  ///  Represents a single test case's output.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ConformanceResponse : pb::IMessage<ConformanceResponse> {
     private static readonly pb::MessageParser<ConformanceResponse> _parser = new pb::MessageParser<ConformanceResponse>(() => new ConformanceResponse());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ConformanceResponse> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Conformance.ConformanceReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ConformanceResponse() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ConformanceResponse(ConformanceResponse other) : this() {
       switch (other.ResultCase) {
         case ResultOneofCase.ParseError:
@@ -363,10 +453,8 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ConformanceResponse Clone() {
       return new ConformanceResponse(this);
     }
@@ -374,13 +462,12 @@
     /// <summary>Field number for the "parse_error" field.</summary>
     public const int ParseErrorFieldNumber = 1;
     /// <summary>
-    /// This string should be set to indicate parsing failed.  The string can
-    /// provide more information about the parse error if it is available.
+    ///  This string should be set to indicate parsing failed.  The string can
+    ///  provide more information about the parse error if it is available.
     ///
-    /// Setting this string does not necessarily mean the testee failed the
-    /// test.  Some of the test cases are intentionally invalid input.
+    ///  Setting this string does not necessarily mean the testee failed the
+    ///  test.  Some of the test cases are intentionally invalid input.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string ParseError {
       get { return resultCase_ == ResultOneofCase.ParseError ? (string) result_ : ""; }
       set {
@@ -392,11 +479,10 @@
     /// <summary>Field number for the "serialize_error" field.</summary>
     public const int SerializeErrorFieldNumber = 6;
     /// <summary>
-    /// If the input was successfully parsed but errors occurred when
-    /// serializing it to the requested output format, set the error message in
-    /// this field.
+    ///  If the input was successfully parsed but errors occurred when
+    ///  serializing it to the requested output format, set the error message in
+    ///  this field.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string SerializeError {
       get { return resultCase_ == ResultOneofCase.SerializeError ? (string) result_ : ""; }
       set {
@@ -408,11 +494,10 @@
     /// <summary>Field number for the "runtime_error" field.</summary>
     public const int RuntimeErrorFieldNumber = 2;
     /// <summary>
-    /// This should be set if some other error occurred.  This will always
-    /// indicate that the test failed.  The string can provide more information
-    /// about the failure.
+    ///  This should be set if some other error occurred.  This will always
+    ///  indicate that the test failed.  The string can provide more information
+    ///  about the failure.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string RuntimeError {
       get { return resultCase_ == ResultOneofCase.RuntimeError ? (string) result_ : ""; }
       set {
@@ -424,10 +509,9 @@
     /// <summary>Field number for the "protobuf_payload" field.</summary>
     public const int ProtobufPayloadFieldNumber = 3;
     /// <summary>
-    /// If the input was successfully parsed and the requested output was
-    /// protobuf, serialize it to protobuf and set it in this field.
+    ///  If the input was successfully parsed and the requested output was
+    ///  protobuf, serialize it to protobuf and set it in this field.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString ProtobufPayload {
       get { return resultCase_ == ResultOneofCase.ProtobufPayload ? (pb::ByteString) result_ : pb::ByteString.Empty; }
       set {
@@ -439,10 +523,9 @@
     /// <summary>Field number for the "json_payload" field.</summary>
     public const int JsonPayloadFieldNumber = 4;
     /// <summary>
-    /// If the input was successfully parsed and the requested output was JSON,
-    /// serialize to JSON and set it in this field.
+    ///  If the input was successfully parsed and the requested output was JSON,
+    ///  serialize to JSON and set it in this field.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string JsonPayload {
       get { return resultCase_ == ResultOneofCase.JsonPayload ? (string) result_ : ""; }
       set {
@@ -454,10 +537,9 @@
     /// <summary>Field number for the "skipped" field.</summary>
     public const int SkippedFieldNumber = 5;
     /// <summary>
-    /// For when the testee skipped the test, likely because a certain feature
-    /// wasn't supported, like JSON input/output.
+    ///  For when the testee skipped the test, likely because a certain feature
+    ///  wasn't supported, like JSON input/output.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Skipped {
       get { return resultCase_ == ResultOneofCase.Skipped ? (string) result_ : ""; }
       set {
@@ -478,23 +560,19 @@
       Skipped = 5,
     }
     private ResultOneofCase resultCase_ = ResultOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ResultOneofCase ResultCase {
       get { return resultCase_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearResult() {
       resultCase_ = ResultOneofCase.None;
       result_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ConformanceResponse);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ConformanceResponse other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -509,10 +587,9 @@
       if (JsonPayload != other.JsonPayload) return false;
       if (Skipped != other.Skipped) return false;
       if (ResultCase != other.ResultCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (resultCase_ == ResultOneofCase.ParseError) hash ^= ParseError.GetHashCode();
@@ -522,18 +599,13 @@
       if (resultCase_ == ResultOneofCase.JsonPayload) hash ^= JsonPayload.GetHashCode();
       if (resultCase_ == ResultOneofCase.Skipped) hash ^= Skipped.GetHashCode();
       hash ^= (int) resultCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (resultCase_ == ResultOneofCase.ParseError) {
         output.WriteRawTag(10);
@@ -559,12 +631,8 @@
         output.WriteRawTag(50);
         output.WriteString(SerializeError);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (resultCase_ == ResultOneofCase.ParseError) {
@@ -585,13 +653,9 @@
       if (resultCase_ == ResultOneofCase.Skipped) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Skipped);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ConformanceResponse other) {
       if (other == null) {
         return;
@@ -617,16 +681,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             ParseError = input.ReadString();
@@ -658,6 +720,2987 @@
 
   }
 
+  /// <summary>
+  ///  This proto includes every type of field in both singular and repeated
+  ///  forms.
+  /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestAllTypes : pb::IMessage<TestAllTypes> {
+    private static readonly pb::MessageParser<TestAllTypes> _parser = new pb::MessageParser<TestAllTypes>(() => new TestAllTypes());
+    public static pb::MessageParser<TestAllTypes> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Conformance.ConformanceReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public TestAllTypes() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public TestAllTypes(TestAllTypes other) : this() {
+      optionalInt32_ = other.optionalInt32_;
+      optionalInt64_ = other.optionalInt64_;
+      optionalUint32_ = other.optionalUint32_;
+      optionalUint64_ = other.optionalUint64_;
+      optionalSint32_ = other.optionalSint32_;
+      optionalSint64_ = other.optionalSint64_;
+      optionalFixed32_ = other.optionalFixed32_;
+      optionalFixed64_ = other.optionalFixed64_;
+      optionalSfixed32_ = other.optionalSfixed32_;
+      optionalSfixed64_ = other.optionalSfixed64_;
+      optionalFloat_ = other.optionalFloat_;
+      optionalDouble_ = other.optionalDouble_;
+      optionalBool_ = other.optionalBool_;
+      optionalString_ = other.optionalString_;
+      optionalBytes_ = other.optionalBytes_;
+      OptionalNestedMessage = other.optionalNestedMessage_ != null ? other.OptionalNestedMessage.Clone() : null;
+      OptionalForeignMessage = other.optionalForeignMessage_ != null ? other.OptionalForeignMessage.Clone() : null;
+      optionalNestedEnum_ = other.optionalNestedEnum_;
+      optionalForeignEnum_ = other.optionalForeignEnum_;
+      optionalStringPiece_ = other.optionalStringPiece_;
+      optionalCord_ = other.optionalCord_;
+      RecursiveMessage = other.recursiveMessage_ != null ? other.RecursiveMessage.Clone() : null;
+      repeatedInt32_ = other.repeatedInt32_.Clone();
+      repeatedInt64_ = other.repeatedInt64_.Clone();
+      repeatedUint32_ = other.repeatedUint32_.Clone();
+      repeatedUint64_ = other.repeatedUint64_.Clone();
+      repeatedSint32_ = other.repeatedSint32_.Clone();
+      repeatedSint64_ = other.repeatedSint64_.Clone();
+      repeatedFixed32_ = other.repeatedFixed32_.Clone();
+      repeatedFixed64_ = other.repeatedFixed64_.Clone();
+      repeatedSfixed32_ = other.repeatedSfixed32_.Clone();
+      repeatedSfixed64_ = other.repeatedSfixed64_.Clone();
+      repeatedFloat_ = other.repeatedFloat_.Clone();
+      repeatedDouble_ = other.repeatedDouble_.Clone();
+      repeatedBool_ = other.repeatedBool_.Clone();
+      repeatedString_ = other.repeatedString_.Clone();
+      repeatedBytes_ = other.repeatedBytes_.Clone();
+      repeatedNestedMessage_ = other.repeatedNestedMessage_.Clone();
+      repeatedForeignMessage_ = other.repeatedForeignMessage_.Clone();
+      repeatedNestedEnum_ = other.repeatedNestedEnum_.Clone();
+      repeatedForeignEnum_ = other.repeatedForeignEnum_.Clone();
+      repeatedStringPiece_ = other.repeatedStringPiece_.Clone();
+      repeatedCord_ = other.repeatedCord_.Clone();
+      mapInt32Int32_ = other.mapInt32Int32_.Clone();
+      mapInt64Int64_ = other.mapInt64Int64_.Clone();
+      mapUint32Uint32_ = other.mapUint32Uint32_.Clone();
+      mapUint64Uint64_ = other.mapUint64Uint64_.Clone();
+      mapSint32Sint32_ = other.mapSint32Sint32_.Clone();
+      mapSint64Sint64_ = other.mapSint64Sint64_.Clone();
+      mapFixed32Fixed32_ = other.mapFixed32Fixed32_.Clone();
+      mapFixed64Fixed64_ = other.mapFixed64Fixed64_.Clone();
+      mapSfixed32Sfixed32_ = other.mapSfixed32Sfixed32_.Clone();
+      mapSfixed64Sfixed64_ = other.mapSfixed64Sfixed64_.Clone();
+      mapInt32Float_ = other.mapInt32Float_.Clone();
+      mapInt32Double_ = other.mapInt32Double_.Clone();
+      mapBoolBool_ = other.mapBoolBool_.Clone();
+      mapStringString_ = other.mapStringString_.Clone();
+      mapStringBytes_ = other.mapStringBytes_.Clone();
+      mapStringNestedMessage_ = other.mapStringNestedMessage_.Clone();
+      mapStringForeignMessage_ = other.mapStringForeignMessage_.Clone();
+      mapStringNestedEnum_ = other.mapStringNestedEnum_.Clone();
+      mapStringForeignEnum_ = other.mapStringForeignEnum_.Clone();
+      OptionalBoolWrapper = other.OptionalBoolWrapper;
+      OptionalInt32Wrapper = other.OptionalInt32Wrapper;
+      OptionalInt64Wrapper = other.OptionalInt64Wrapper;
+      OptionalUint32Wrapper = other.OptionalUint32Wrapper;
+      OptionalUint64Wrapper = other.OptionalUint64Wrapper;
+      OptionalFloatWrapper = other.OptionalFloatWrapper;
+      OptionalDoubleWrapper = other.OptionalDoubleWrapper;
+      OptionalStringWrapper = other.OptionalStringWrapper;
+      OptionalBytesWrapper = other.OptionalBytesWrapper;
+      repeatedBoolWrapper_ = other.repeatedBoolWrapper_.Clone();
+      repeatedInt32Wrapper_ = other.repeatedInt32Wrapper_.Clone();
+      repeatedInt64Wrapper_ = other.repeatedInt64Wrapper_.Clone();
+      repeatedUint32Wrapper_ = other.repeatedUint32Wrapper_.Clone();
+      repeatedUint64Wrapper_ = other.repeatedUint64Wrapper_.Clone();
+      repeatedFloatWrapper_ = other.repeatedFloatWrapper_.Clone();
+      repeatedDoubleWrapper_ = other.repeatedDoubleWrapper_.Clone();
+      repeatedStringWrapper_ = other.repeatedStringWrapper_.Clone();
+      repeatedBytesWrapper_ = other.repeatedBytesWrapper_.Clone();
+      OptionalDuration = other.optionalDuration_ != null ? other.OptionalDuration.Clone() : null;
+      OptionalTimestamp = other.optionalTimestamp_ != null ? other.OptionalTimestamp.Clone() : null;
+      OptionalFieldMask = other.optionalFieldMask_ != null ? other.OptionalFieldMask.Clone() : null;
+      OptionalStruct = other.optionalStruct_ != null ? other.OptionalStruct.Clone() : null;
+      OptionalAny = other.optionalAny_ != null ? other.OptionalAny.Clone() : null;
+      OptionalValue = other.optionalValue_ != null ? other.OptionalValue.Clone() : null;
+      repeatedDuration_ = other.repeatedDuration_.Clone();
+      repeatedTimestamp_ = other.repeatedTimestamp_.Clone();
+      repeatedFieldmask_ = other.repeatedFieldmask_.Clone();
+      repeatedStruct_ = other.repeatedStruct_.Clone();
+      repeatedAny_ = other.repeatedAny_.Clone();
+      repeatedValue_ = other.repeatedValue_.Clone();
+      fieldname1_ = other.fieldname1_;
+      fieldName2_ = other.fieldName2_;
+      FieldName3_ = other.FieldName3_;
+      fieldName4_ = other.fieldName4_;
+      field0Name5_ = other.field0Name5_;
+      field0Name6_ = other.field0Name6_;
+      fieldName7_ = other.fieldName7_;
+      fieldName8_ = other.fieldName8_;
+      fieldName9_ = other.fieldName9_;
+      fieldName10_ = other.fieldName10_;
+      fIELDNAME11_ = other.fIELDNAME11_;
+      fIELDName12_ = other.fIELDName12_;
+      switch (other.OneofFieldCase) {
+        case OneofFieldOneofCase.OneofUint32:
+          OneofUint32 = other.OneofUint32;
+          break;
+        case OneofFieldOneofCase.OneofNestedMessage:
+          OneofNestedMessage = other.OneofNestedMessage.Clone();
+          break;
+        case OneofFieldOneofCase.OneofString:
+          OneofString = other.OneofString;
+          break;
+        case OneofFieldOneofCase.OneofBytes:
+          OneofBytes = other.OneofBytes;
+          break;
+      }
+
+    }
+
+    public TestAllTypes Clone() {
+      return new TestAllTypes(this);
+    }
+
+    /// <summary>Field number for the "optional_int32" field.</summary>
+    public const int OptionalInt32FieldNumber = 1;
+    private int optionalInt32_;
+    /// <summary>
+    ///  Singular
+    /// </summary>
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+      set {
+        optionalInt32_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_int64" field.</summary>
+    public const int OptionalInt64FieldNumber = 2;
+    private long optionalInt64_;
+    public long OptionalInt64 {
+      get { return optionalInt64_; }
+      set {
+        optionalInt64_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_uint32" field.</summary>
+    public const int OptionalUint32FieldNumber = 3;
+    private uint optionalUint32_;
+    public uint OptionalUint32 {
+      get { return optionalUint32_; }
+      set {
+        optionalUint32_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_uint64" field.</summary>
+    public const int OptionalUint64FieldNumber = 4;
+    private ulong optionalUint64_;
+    public ulong OptionalUint64 {
+      get { return optionalUint64_; }
+      set {
+        optionalUint64_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_sint32" field.</summary>
+    public const int OptionalSint32FieldNumber = 5;
+    private int optionalSint32_;
+    public int OptionalSint32 {
+      get { return optionalSint32_; }
+      set {
+        optionalSint32_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_sint64" field.</summary>
+    public const int OptionalSint64FieldNumber = 6;
+    private long optionalSint64_;
+    public long OptionalSint64 {
+      get { return optionalSint64_; }
+      set {
+        optionalSint64_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_fixed32" field.</summary>
+    public const int OptionalFixed32FieldNumber = 7;
+    private uint optionalFixed32_;
+    public uint OptionalFixed32 {
+      get { return optionalFixed32_; }
+      set {
+        optionalFixed32_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_fixed64" field.</summary>
+    public const int OptionalFixed64FieldNumber = 8;
+    private ulong optionalFixed64_;
+    public ulong OptionalFixed64 {
+      get { return optionalFixed64_; }
+      set {
+        optionalFixed64_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_sfixed32" field.</summary>
+    public const int OptionalSfixed32FieldNumber = 9;
+    private int optionalSfixed32_;
+    public int OptionalSfixed32 {
+      get { return optionalSfixed32_; }
+      set {
+        optionalSfixed32_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_sfixed64" field.</summary>
+    public const int OptionalSfixed64FieldNumber = 10;
+    private long optionalSfixed64_;
+    public long OptionalSfixed64 {
+      get { return optionalSfixed64_; }
+      set {
+        optionalSfixed64_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_float" field.</summary>
+    public const int OptionalFloatFieldNumber = 11;
+    private float optionalFloat_;
+    public float OptionalFloat {
+      get { return optionalFloat_; }
+      set {
+        optionalFloat_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_double" field.</summary>
+    public const int OptionalDoubleFieldNumber = 12;
+    private double optionalDouble_;
+    public double OptionalDouble {
+      get { return optionalDouble_; }
+      set {
+        optionalDouble_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_bool" field.</summary>
+    public const int OptionalBoolFieldNumber = 13;
+    private bool optionalBool_;
+    public bool OptionalBool {
+      get { return optionalBool_; }
+      set {
+        optionalBool_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_string" field.</summary>
+    public const int OptionalStringFieldNumber = 14;
+    private string optionalString_ = "";
+    public string OptionalString {
+      get { return optionalString_; }
+      set {
+        optionalString_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "optional_bytes" field.</summary>
+    public const int OptionalBytesFieldNumber = 15;
+    private pb::ByteString optionalBytes_ = pb::ByteString.Empty;
+    public pb::ByteString OptionalBytes {
+      get { return optionalBytes_; }
+      set {
+        optionalBytes_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "optional_nested_message" field.</summary>
+    public const int OptionalNestedMessageFieldNumber = 18;
+    private global::Conformance.TestAllTypes.Types.NestedMessage optionalNestedMessage_;
+    public global::Conformance.TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_; }
+      set {
+        optionalNestedMessage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_foreign_message" field.</summary>
+    public const int OptionalForeignMessageFieldNumber = 19;
+    private global::Conformance.ForeignMessage optionalForeignMessage_;
+    public global::Conformance.ForeignMessage OptionalForeignMessage {
+      get { return optionalForeignMessage_; }
+      set {
+        optionalForeignMessage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_nested_enum" field.</summary>
+    public const int OptionalNestedEnumFieldNumber = 21;
+    private global::Conformance.TestAllTypes.Types.NestedEnum optionalNestedEnum_ = 0;
+    public global::Conformance.TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+      get { return optionalNestedEnum_; }
+      set {
+        optionalNestedEnum_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_foreign_enum" field.</summary>
+    public const int OptionalForeignEnumFieldNumber = 22;
+    private global::Conformance.ForeignEnum optionalForeignEnum_ = 0;
+    public global::Conformance.ForeignEnum OptionalForeignEnum {
+      get { return optionalForeignEnum_; }
+      set {
+        optionalForeignEnum_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_string_piece" field.</summary>
+    public const int OptionalStringPieceFieldNumber = 24;
+    private string optionalStringPiece_ = "";
+    public string OptionalStringPiece {
+      get { return optionalStringPiece_; }
+      set {
+        optionalStringPiece_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "optional_cord" field.</summary>
+    public const int OptionalCordFieldNumber = 25;
+    private string optionalCord_ = "";
+    public string OptionalCord {
+      get { return optionalCord_; }
+      set {
+        optionalCord_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "recursive_message" field.</summary>
+    public const int RecursiveMessageFieldNumber = 27;
+    private global::Conformance.TestAllTypes recursiveMessage_;
+    public global::Conformance.TestAllTypes RecursiveMessage {
+      get { return recursiveMessage_; }
+      set {
+        recursiveMessage_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "repeated_int32" field.</summary>
+    public const int RepeatedInt32FieldNumber = 31;
+    private static readonly pb::FieldCodec<int> _repeated_repeatedInt32_codec
+        = pb::FieldCodec.ForInt32(250);
+    private readonly pbc::RepeatedField<int> repeatedInt32_ = new pbc::RepeatedField<int>();
+    /// <summary>
+    ///  Repeated
+    /// </summary>
+    public pbc::RepeatedField<int> RepeatedInt32 {
+      get { return repeatedInt32_; }
+    }
+
+    /// <summary>Field number for the "repeated_int64" field.</summary>
+    public const int RepeatedInt64FieldNumber = 32;
+    private static readonly pb::FieldCodec<long> _repeated_repeatedInt64_codec
+        = pb::FieldCodec.ForInt64(258);
+    private readonly pbc::RepeatedField<long> repeatedInt64_ = new pbc::RepeatedField<long>();
+    public pbc::RepeatedField<long> RepeatedInt64 {
+      get { return repeatedInt64_; }
+    }
+
+    /// <summary>Field number for the "repeated_uint32" field.</summary>
+    public const int RepeatedUint32FieldNumber = 33;
+    private static readonly pb::FieldCodec<uint> _repeated_repeatedUint32_codec
+        = pb::FieldCodec.ForUInt32(266);
+    private readonly pbc::RepeatedField<uint> repeatedUint32_ = new pbc::RepeatedField<uint>();
+    public pbc::RepeatedField<uint> RepeatedUint32 {
+      get { return repeatedUint32_; }
+    }
+
+    /// <summary>Field number for the "repeated_uint64" field.</summary>
+    public const int RepeatedUint64FieldNumber = 34;
+    private static readonly pb::FieldCodec<ulong> _repeated_repeatedUint64_codec
+        = pb::FieldCodec.ForUInt64(274);
+    private readonly pbc::RepeatedField<ulong> repeatedUint64_ = new pbc::RepeatedField<ulong>();
+    public pbc::RepeatedField<ulong> RepeatedUint64 {
+      get { return repeatedUint64_; }
+    }
+
+    /// <summary>Field number for the "repeated_sint32" field.</summary>
+    public const int RepeatedSint32FieldNumber = 35;
+    private static readonly pb::FieldCodec<int> _repeated_repeatedSint32_codec
+        = pb::FieldCodec.ForSInt32(282);
+    private readonly pbc::RepeatedField<int> repeatedSint32_ = new pbc::RepeatedField<int>();
+    public pbc::RepeatedField<int> RepeatedSint32 {
+      get { return repeatedSint32_; }
+    }
+
+    /// <summary>Field number for the "repeated_sint64" field.</summary>
+    public const int RepeatedSint64FieldNumber = 36;
+    private static readonly pb::FieldCodec<long> _repeated_repeatedSint64_codec
+        = pb::FieldCodec.ForSInt64(290);
+    private readonly pbc::RepeatedField<long> repeatedSint64_ = new pbc::RepeatedField<long>();
+    public pbc::RepeatedField<long> RepeatedSint64 {
+      get { return repeatedSint64_; }
+    }
+
+    /// <summary>Field number for the "repeated_fixed32" field.</summary>
+    public const int RepeatedFixed32FieldNumber = 37;
+    private static readonly pb::FieldCodec<uint> _repeated_repeatedFixed32_codec
+        = pb::FieldCodec.ForFixed32(298);
+    private readonly pbc::RepeatedField<uint> repeatedFixed32_ = new pbc::RepeatedField<uint>();
+    public pbc::RepeatedField<uint> RepeatedFixed32 {
+      get { return repeatedFixed32_; }
+    }
+
+    /// <summary>Field number for the "repeated_fixed64" field.</summary>
+    public const int RepeatedFixed64FieldNumber = 38;
+    private static readonly pb::FieldCodec<ulong> _repeated_repeatedFixed64_codec
+        = pb::FieldCodec.ForFixed64(306);
+    private readonly pbc::RepeatedField<ulong> repeatedFixed64_ = new pbc::RepeatedField<ulong>();
+    public pbc::RepeatedField<ulong> RepeatedFixed64 {
+      get { return repeatedFixed64_; }
+    }
+
+    /// <summary>Field number for the "repeated_sfixed32" field.</summary>
+    public const int RepeatedSfixed32FieldNumber = 39;
+    private static readonly pb::FieldCodec<int> _repeated_repeatedSfixed32_codec
+        = pb::FieldCodec.ForSFixed32(314);
+    private readonly pbc::RepeatedField<int> repeatedSfixed32_ = new pbc::RepeatedField<int>();
+    public pbc::RepeatedField<int> RepeatedSfixed32 {
+      get { return repeatedSfixed32_; }
+    }
+
+    /// <summary>Field number for the "repeated_sfixed64" field.</summary>
+    public const int RepeatedSfixed64FieldNumber = 40;
+    private static readonly pb::FieldCodec<long> _repeated_repeatedSfixed64_codec
+        = pb::FieldCodec.ForSFixed64(322);
+    private readonly pbc::RepeatedField<long> repeatedSfixed64_ = new pbc::RepeatedField<long>();
+    public pbc::RepeatedField<long> RepeatedSfixed64 {
+      get { return repeatedSfixed64_; }
+    }
+
+    /// <summary>Field number for the "repeated_float" field.</summary>
+    public const int RepeatedFloatFieldNumber = 41;
+    private static readonly pb::FieldCodec<float> _repeated_repeatedFloat_codec
+        = pb::FieldCodec.ForFloat(330);
+    private readonly pbc::RepeatedField<float> repeatedFloat_ = new pbc::RepeatedField<float>();
+    public pbc::RepeatedField<float> RepeatedFloat {
+      get { return repeatedFloat_; }
+    }
+
+    /// <summary>Field number for the "repeated_double" field.</summary>
+    public const int RepeatedDoubleFieldNumber = 42;
+    private static readonly pb::FieldCodec<double> _repeated_repeatedDouble_codec
+        = pb::FieldCodec.ForDouble(338);
+    private readonly pbc::RepeatedField<double> repeatedDouble_ = new pbc::RepeatedField<double>();
+    public pbc::RepeatedField<double> RepeatedDouble {
+      get { return repeatedDouble_; }
+    }
+
+    /// <summary>Field number for the "repeated_bool" field.</summary>
+    public const int RepeatedBoolFieldNumber = 43;
+    private static readonly pb::FieldCodec<bool> _repeated_repeatedBool_codec
+        = pb::FieldCodec.ForBool(346);
+    private readonly pbc::RepeatedField<bool> repeatedBool_ = new pbc::RepeatedField<bool>();
+    public pbc::RepeatedField<bool> RepeatedBool {
+      get { return repeatedBool_; }
+    }
+
+    /// <summary>Field number for the "repeated_string" field.</summary>
+    public const int RepeatedStringFieldNumber = 44;
+    private static readonly pb::FieldCodec<string> _repeated_repeatedString_codec
+        = pb::FieldCodec.ForString(354);
+    private readonly pbc::RepeatedField<string> repeatedString_ = new pbc::RepeatedField<string>();
+    public pbc::RepeatedField<string> RepeatedString {
+      get { return repeatedString_; }
+    }
+
+    /// <summary>Field number for the "repeated_bytes" field.</summary>
+    public const int RepeatedBytesFieldNumber = 45;
+    private static readonly pb::FieldCodec<pb::ByteString> _repeated_repeatedBytes_codec
+        = pb::FieldCodec.ForBytes(362);
+    private readonly pbc::RepeatedField<pb::ByteString> repeatedBytes_ = new pbc::RepeatedField<pb::ByteString>();
+    public pbc::RepeatedField<pb::ByteString> RepeatedBytes {
+      get { return repeatedBytes_; }
+    }
+
+    /// <summary>Field number for the "repeated_nested_message" field.</summary>
+    public const int RepeatedNestedMessageFieldNumber = 48;
+    private static readonly pb::FieldCodec<global::Conformance.TestAllTypes.Types.NestedMessage> _repeated_repeatedNestedMessage_codec
+        = pb::FieldCodec.ForMessage(386, global::Conformance.TestAllTypes.Types.NestedMessage.Parser);
+    private readonly pbc::RepeatedField<global::Conformance.TestAllTypes.Types.NestedMessage> repeatedNestedMessage_ = new pbc::RepeatedField<global::Conformance.TestAllTypes.Types.NestedMessage>();
+    public pbc::RepeatedField<global::Conformance.TestAllTypes.Types.NestedMessage> RepeatedNestedMessage {
+      get { return repeatedNestedMessage_; }
+    }
+
+    /// <summary>Field number for the "repeated_foreign_message" field.</summary>
+    public const int RepeatedForeignMessageFieldNumber = 49;
+    private static readonly pb::FieldCodec<global::Conformance.ForeignMessage> _repeated_repeatedForeignMessage_codec
+        = pb::FieldCodec.ForMessage(394, global::Conformance.ForeignMessage.Parser);
+    private readonly pbc::RepeatedField<global::Conformance.ForeignMessage> repeatedForeignMessage_ = new pbc::RepeatedField<global::Conformance.ForeignMessage>();
+    public pbc::RepeatedField<global::Conformance.ForeignMessage> RepeatedForeignMessage {
+      get { return repeatedForeignMessage_; }
+    }
+
+    /// <summary>Field number for the "repeated_nested_enum" field.</summary>
+    public const int RepeatedNestedEnumFieldNumber = 51;
+    private static readonly pb::FieldCodec<global::Conformance.TestAllTypes.Types.NestedEnum> _repeated_repeatedNestedEnum_codec
+        = pb::FieldCodec.ForEnum(410, x => (int) x, x => (global::Conformance.TestAllTypes.Types.NestedEnum) x);
+    private readonly pbc::RepeatedField<global::Conformance.TestAllTypes.Types.NestedEnum> repeatedNestedEnum_ = new pbc::RepeatedField<global::Conformance.TestAllTypes.Types.NestedEnum>();
+    public pbc::RepeatedField<global::Conformance.TestAllTypes.Types.NestedEnum> RepeatedNestedEnum {
+      get { return repeatedNestedEnum_; }
+    }
+
+    /// <summary>Field number for the "repeated_foreign_enum" field.</summary>
+    public const int RepeatedForeignEnumFieldNumber = 52;
+    private static readonly pb::FieldCodec<global::Conformance.ForeignEnum> _repeated_repeatedForeignEnum_codec
+        = pb::FieldCodec.ForEnum(418, x => (int) x, x => (global::Conformance.ForeignEnum) x);
+    private readonly pbc::RepeatedField<global::Conformance.ForeignEnum> repeatedForeignEnum_ = new pbc::RepeatedField<global::Conformance.ForeignEnum>();
+    public pbc::RepeatedField<global::Conformance.ForeignEnum> RepeatedForeignEnum {
+      get { return repeatedForeignEnum_; }
+    }
+
+    /// <summary>Field number for the "repeated_string_piece" field.</summary>
+    public const int RepeatedStringPieceFieldNumber = 54;
+    private static readonly pb::FieldCodec<string> _repeated_repeatedStringPiece_codec
+        = pb::FieldCodec.ForString(434);
+    private readonly pbc::RepeatedField<string> repeatedStringPiece_ = new pbc::RepeatedField<string>();
+    public pbc::RepeatedField<string> RepeatedStringPiece {
+      get { return repeatedStringPiece_; }
+    }
+
+    /// <summary>Field number for the "repeated_cord" field.</summary>
+    public const int RepeatedCordFieldNumber = 55;
+    private static readonly pb::FieldCodec<string> _repeated_repeatedCord_codec
+        = pb::FieldCodec.ForString(442);
+    private readonly pbc::RepeatedField<string> repeatedCord_ = new pbc::RepeatedField<string>();
+    public pbc::RepeatedField<string> RepeatedCord {
+      get { return repeatedCord_; }
+    }
+
+    /// <summary>Field number for the "map_int32_int32" field.</summary>
+    public const int MapInt32Int32FieldNumber = 56;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 450);
+    private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
+    /// <summary>
+    ///  Map
+    /// </summary>
+    public pbc::MapField<int, int> MapInt32Int32 {
+      get { return mapInt32Int32_; }
+    }
+
+    /// <summary>Field number for the "map_int64_int64" field.</summary>
+    public const int MapInt64Int64FieldNumber = 57;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 458);
+    private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapInt64Int64 {
+      get { return mapInt64Int64_; }
+    }
+
+    /// <summary>Field number for the "map_uint32_uint32" field.</summary>
+    public const int MapUint32Uint32FieldNumber = 58;
+    private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
+        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 466);
+    private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
+    public pbc::MapField<uint, uint> MapUint32Uint32 {
+      get { return mapUint32Uint32_; }
+    }
+
+    /// <summary>Field number for the "map_uint64_uint64" field.</summary>
+    public const int MapUint64Uint64FieldNumber = 59;
+    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
+        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 474);
+    private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
+    public pbc::MapField<ulong, ulong> MapUint64Uint64 {
+      get { return mapUint64Uint64_; }
+    }
+
+    /// <summary>Field number for the "map_sint32_sint32" field.</summary>
+    public const int MapSint32Sint32FieldNumber = 60;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 482);
+    private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapSint32Sint32 {
+      get { return mapSint32Sint32_; }
+    }
+
+    /// <summary>Field number for the "map_sint64_sint64" field.</summary>
+    public const int MapSint64Sint64FieldNumber = 61;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 490);
+    private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapSint64Sint64 {
+      get { return mapSint64Sint64_; }
+    }
+
+    /// <summary>Field number for the "map_fixed32_fixed32" field.</summary>
+    public const int MapFixed32Fixed32FieldNumber = 62;
+    private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
+        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 498);
+    private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
+    public pbc::MapField<uint, uint> MapFixed32Fixed32 {
+      get { return mapFixed32Fixed32_; }
+    }
+
+    /// <summary>Field number for the "map_fixed64_fixed64" field.</summary>
+    public const int MapFixed64Fixed64FieldNumber = 63;
+    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
+        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 506);
+    private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
+    public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
+      get { return mapFixed64Fixed64_; }
+    }
+
+    /// <summary>Field number for the "map_sfixed32_sfixed32" field.</summary>
+    public const int MapSfixed32Sfixed32FieldNumber = 64;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 514);
+    private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapSfixed32Sfixed32 {
+      get { return mapSfixed32Sfixed32_; }
+    }
+
+    /// <summary>Field number for the "map_sfixed64_sfixed64" field.</summary>
+    public const int MapSfixed64Sfixed64FieldNumber = 65;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 522);
+    private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapSfixed64Sfixed64 {
+      get { return mapSfixed64Sfixed64_; }
+    }
+
+    /// <summary>Field number for the "map_int32_float" field.</summary>
+    public const int MapInt32FloatFieldNumber = 66;
+    private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
+        = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 530);
+    private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
+    public pbc::MapField<int, float> MapInt32Float {
+      get { return mapInt32Float_; }
+    }
+
+    /// <summary>Field number for the "map_int32_double" field.</summary>
+    public const int MapInt32DoubleFieldNumber = 67;
+    private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
+        = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 538);
+    private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
+    public pbc::MapField<int, double> MapInt32Double {
+      get { return mapInt32Double_; }
+    }
+
+    /// <summary>Field number for the "map_bool_bool" field.</summary>
+    public const int MapBoolBoolFieldNumber = 68;
+    private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
+        = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 546);
+    private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
+    public pbc::MapField<bool, bool> MapBoolBool {
+      get { return mapBoolBool_; }
+    }
+
+    /// <summary>Field number for the "map_string_string" field.</summary>
+    public const int MapStringStringFieldNumber = 69;
+    private static readonly pbc::MapField<string, string>.Codec _map_mapStringString_codec
+        = new pbc::MapField<string, string>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForString(18), 554);
+    private readonly pbc::MapField<string, string> mapStringString_ = new pbc::MapField<string, string>();
+    public pbc::MapField<string, string> MapStringString {
+      get { return mapStringString_; }
+    }
+
+    /// <summary>Field number for the "map_string_bytes" field.</summary>
+    public const int MapStringBytesFieldNumber = 70;
+    private static readonly pbc::MapField<string, pb::ByteString>.Codec _map_mapStringBytes_codec
+        = new pbc::MapField<string, pb::ByteString>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForBytes(18), 562);
+    private readonly pbc::MapField<string, pb::ByteString> mapStringBytes_ = new pbc::MapField<string, pb::ByteString>();
+    public pbc::MapField<string, pb::ByteString> MapStringBytes {
+      get { return mapStringBytes_; }
+    }
+
+    /// <summary>Field number for the "map_string_nested_message" field.</summary>
+    public const int MapStringNestedMessageFieldNumber = 71;
+    private static readonly pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedMessage>.Codec _map_mapStringNestedMessage_codec
+        = new pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedMessage>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForMessage(18, global::Conformance.TestAllTypes.Types.NestedMessage.Parser), 570);
+    private readonly pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedMessage> mapStringNestedMessage_ = new pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedMessage>();
+    public pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedMessage> MapStringNestedMessage {
+      get { return mapStringNestedMessage_; }
+    }
+
+    /// <summary>Field number for the "map_string_foreign_message" field.</summary>
+    public const int MapStringForeignMessageFieldNumber = 72;
+    private static readonly pbc::MapField<string, global::Conformance.ForeignMessage>.Codec _map_mapStringForeignMessage_codec
+        = new pbc::MapField<string, global::Conformance.ForeignMessage>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForMessage(18, global::Conformance.ForeignMessage.Parser), 578);
+    private readonly pbc::MapField<string, global::Conformance.ForeignMessage> mapStringForeignMessage_ = new pbc::MapField<string, global::Conformance.ForeignMessage>();
+    public pbc::MapField<string, global::Conformance.ForeignMessage> MapStringForeignMessage {
+      get { return mapStringForeignMessage_; }
+    }
+
+    /// <summary>Field number for the "map_string_nested_enum" field.</summary>
+    public const int MapStringNestedEnumFieldNumber = 73;
+    private static readonly pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedEnum>.Codec _map_mapStringNestedEnum_codec
+        = new pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedEnum>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Conformance.TestAllTypes.Types.NestedEnum) x), 586);
+    private readonly pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedEnum> mapStringNestedEnum_ = new pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedEnum>();
+    public pbc::MapField<string, global::Conformance.TestAllTypes.Types.NestedEnum> MapStringNestedEnum {
+      get { return mapStringNestedEnum_; }
+    }
+
+    /// <summary>Field number for the "map_string_foreign_enum" field.</summary>
+    public const int MapStringForeignEnumFieldNumber = 74;
+    private static readonly pbc::MapField<string, global::Conformance.ForeignEnum>.Codec _map_mapStringForeignEnum_codec
+        = new pbc::MapField<string, global::Conformance.ForeignEnum>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Conformance.ForeignEnum) x), 594);
+    private readonly pbc::MapField<string, global::Conformance.ForeignEnum> mapStringForeignEnum_ = new pbc::MapField<string, global::Conformance.ForeignEnum>();
+    public pbc::MapField<string, global::Conformance.ForeignEnum> MapStringForeignEnum {
+      get { return mapStringForeignEnum_; }
+    }
+
+    /// <summary>Field number for the "oneof_uint32" field.</summary>
+    public const int OneofUint32FieldNumber = 111;
+    public uint OneofUint32 {
+      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofUint32 ? (uint) oneofField_ : 0; }
+      set {
+        oneofField_ = value;
+        oneofFieldCase_ = OneofFieldOneofCase.OneofUint32;
+      }
+    }
+
+    /// <summary>Field number for the "oneof_nested_message" field.</summary>
+    public const int OneofNestedMessageFieldNumber = 112;
+    public global::Conformance.TestAllTypes.Types.NestedMessage OneofNestedMessage {
+      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage ? (global::Conformance.TestAllTypes.Types.NestedMessage) oneofField_ : null; }
+      set {
+        oneofField_ = value;
+        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.OneofNestedMessage;
+      }
+    }
+
+    /// <summary>Field number for the "oneof_string" field.</summary>
+    public const int OneofStringFieldNumber = 113;
+    public string OneofString {
+      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofString ? (string) oneofField_ : ""; }
+      set {
+        oneofField_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+        oneofFieldCase_ = OneofFieldOneofCase.OneofString;
+      }
+    }
+
+    /// <summary>Field number for the "oneof_bytes" field.</summary>
+    public const int OneofBytesFieldNumber = 114;
+    public pb::ByteString OneofBytes {
+      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofBytes ? (pb::ByteString) oneofField_ : pb::ByteString.Empty; }
+      set {
+        oneofField_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+        oneofFieldCase_ = OneofFieldOneofCase.OneofBytes;
+      }
+    }
+
+    /// <summary>Field number for the "optional_bool_wrapper" field.</summary>
+    public const int OptionalBoolWrapperFieldNumber = 201;
+    private static readonly pb::FieldCodec<bool?> _single_optionalBoolWrapper_codec = pb::FieldCodec.ForStructWrapper<bool>(1610);
+    private bool? optionalBoolWrapper_;
+    /// <summary>
+    ///  Well-known types
+    /// </summary>
+    public bool? OptionalBoolWrapper {
+      get { return optionalBoolWrapper_; }
+      set {
+        optionalBoolWrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_int32_wrapper" field.</summary>
+    public const int OptionalInt32WrapperFieldNumber = 202;
+    private static readonly pb::FieldCodec<int?> _single_optionalInt32Wrapper_codec = pb::FieldCodec.ForStructWrapper<int>(1618);
+    private int? optionalInt32Wrapper_;
+    public int? OptionalInt32Wrapper {
+      get { return optionalInt32Wrapper_; }
+      set {
+        optionalInt32Wrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_int64_wrapper" field.</summary>
+    public const int OptionalInt64WrapperFieldNumber = 203;
+    private static readonly pb::FieldCodec<long?> _single_optionalInt64Wrapper_codec = pb::FieldCodec.ForStructWrapper<long>(1626);
+    private long? optionalInt64Wrapper_;
+    public long? OptionalInt64Wrapper {
+      get { return optionalInt64Wrapper_; }
+      set {
+        optionalInt64Wrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_uint32_wrapper" field.</summary>
+    public const int OptionalUint32WrapperFieldNumber = 204;
+    private static readonly pb::FieldCodec<uint?> _single_optionalUint32Wrapper_codec = pb::FieldCodec.ForStructWrapper<uint>(1634);
+    private uint? optionalUint32Wrapper_;
+    public uint? OptionalUint32Wrapper {
+      get { return optionalUint32Wrapper_; }
+      set {
+        optionalUint32Wrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_uint64_wrapper" field.</summary>
+    public const int OptionalUint64WrapperFieldNumber = 205;
+    private static readonly pb::FieldCodec<ulong?> _single_optionalUint64Wrapper_codec = pb::FieldCodec.ForStructWrapper<ulong>(1642);
+    private ulong? optionalUint64Wrapper_;
+    public ulong? OptionalUint64Wrapper {
+      get { return optionalUint64Wrapper_; }
+      set {
+        optionalUint64Wrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_float_wrapper" field.</summary>
+    public const int OptionalFloatWrapperFieldNumber = 206;
+    private static readonly pb::FieldCodec<float?> _single_optionalFloatWrapper_codec = pb::FieldCodec.ForStructWrapper<float>(1650);
+    private float? optionalFloatWrapper_;
+    public float? OptionalFloatWrapper {
+      get { return optionalFloatWrapper_; }
+      set {
+        optionalFloatWrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_double_wrapper" field.</summary>
+    public const int OptionalDoubleWrapperFieldNumber = 207;
+    private static readonly pb::FieldCodec<double?> _single_optionalDoubleWrapper_codec = pb::FieldCodec.ForStructWrapper<double>(1658);
+    private double? optionalDoubleWrapper_;
+    public double? OptionalDoubleWrapper {
+      get { return optionalDoubleWrapper_; }
+      set {
+        optionalDoubleWrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_string_wrapper" field.</summary>
+    public const int OptionalStringWrapperFieldNumber = 208;
+    private static readonly pb::FieldCodec<string> _single_optionalStringWrapper_codec = pb::FieldCodec.ForClassWrapper<string>(1666);
+    private string optionalStringWrapper_;
+    public string OptionalStringWrapper {
+      get { return optionalStringWrapper_; }
+      set {
+        optionalStringWrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_bytes_wrapper" field.</summary>
+    public const int OptionalBytesWrapperFieldNumber = 209;
+    private static readonly pb::FieldCodec<pb::ByteString> _single_optionalBytesWrapper_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(1674);
+    private pb::ByteString optionalBytesWrapper_;
+    public pb::ByteString OptionalBytesWrapper {
+      get { return optionalBytesWrapper_; }
+      set {
+        optionalBytesWrapper_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "repeated_bool_wrapper" field.</summary>
+    public const int RepeatedBoolWrapperFieldNumber = 211;
+    private static readonly pb::FieldCodec<bool?> _repeated_repeatedBoolWrapper_codec
+        = pb::FieldCodec.ForStructWrapper<bool>(1690);
+    private readonly pbc::RepeatedField<bool?> repeatedBoolWrapper_ = new pbc::RepeatedField<bool?>();
+    public pbc::RepeatedField<bool?> RepeatedBoolWrapper {
+      get { return repeatedBoolWrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_int32_wrapper" field.</summary>
+    public const int RepeatedInt32WrapperFieldNumber = 212;
+    private static readonly pb::FieldCodec<int?> _repeated_repeatedInt32Wrapper_codec
+        = pb::FieldCodec.ForStructWrapper<int>(1698);
+    private readonly pbc::RepeatedField<int?> repeatedInt32Wrapper_ = new pbc::RepeatedField<int?>();
+    public pbc::RepeatedField<int?> RepeatedInt32Wrapper {
+      get { return repeatedInt32Wrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_int64_wrapper" field.</summary>
+    public const int RepeatedInt64WrapperFieldNumber = 213;
+    private static readonly pb::FieldCodec<long?> _repeated_repeatedInt64Wrapper_codec
+        = pb::FieldCodec.ForStructWrapper<long>(1706);
+    private readonly pbc::RepeatedField<long?> repeatedInt64Wrapper_ = new pbc::RepeatedField<long?>();
+    public pbc::RepeatedField<long?> RepeatedInt64Wrapper {
+      get { return repeatedInt64Wrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_uint32_wrapper" field.</summary>
+    public const int RepeatedUint32WrapperFieldNumber = 214;
+    private static readonly pb::FieldCodec<uint?> _repeated_repeatedUint32Wrapper_codec
+        = pb::FieldCodec.ForStructWrapper<uint>(1714);
+    private readonly pbc::RepeatedField<uint?> repeatedUint32Wrapper_ = new pbc::RepeatedField<uint?>();
+    public pbc::RepeatedField<uint?> RepeatedUint32Wrapper {
+      get { return repeatedUint32Wrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_uint64_wrapper" field.</summary>
+    public const int RepeatedUint64WrapperFieldNumber = 215;
+    private static readonly pb::FieldCodec<ulong?> _repeated_repeatedUint64Wrapper_codec
+        = pb::FieldCodec.ForStructWrapper<ulong>(1722);
+    private readonly pbc::RepeatedField<ulong?> repeatedUint64Wrapper_ = new pbc::RepeatedField<ulong?>();
+    public pbc::RepeatedField<ulong?> RepeatedUint64Wrapper {
+      get { return repeatedUint64Wrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_float_wrapper" field.</summary>
+    public const int RepeatedFloatWrapperFieldNumber = 216;
+    private static readonly pb::FieldCodec<float?> _repeated_repeatedFloatWrapper_codec
+        = pb::FieldCodec.ForStructWrapper<float>(1730);
+    private readonly pbc::RepeatedField<float?> repeatedFloatWrapper_ = new pbc::RepeatedField<float?>();
+    public pbc::RepeatedField<float?> RepeatedFloatWrapper {
+      get { return repeatedFloatWrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_double_wrapper" field.</summary>
+    public const int RepeatedDoubleWrapperFieldNumber = 217;
+    private static readonly pb::FieldCodec<double?> _repeated_repeatedDoubleWrapper_codec
+        = pb::FieldCodec.ForStructWrapper<double>(1738);
+    private readonly pbc::RepeatedField<double?> repeatedDoubleWrapper_ = new pbc::RepeatedField<double?>();
+    public pbc::RepeatedField<double?> RepeatedDoubleWrapper {
+      get { return repeatedDoubleWrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_string_wrapper" field.</summary>
+    public const int RepeatedStringWrapperFieldNumber = 218;
+    private static readonly pb::FieldCodec<string> _repeated_repeatedStringWrapper_codec
+        = pb::FieldCodec.ForClassWrapper<string>(1746);
+    private readonly pbc::RepeatedField<string> repeatedStringWrapper_ = new pbc::RepeatedField<string>();
+    public pbc::RepeatedField<string> RepeatedStringWrapper {
+      get { return repeatedStringWrapper_; }
+    }
+
+    /// <summary>Field number for the "repeated_bytes_wrapper" field.</summary>
+    public const int RepeatedBytesWrapperFieldNumber = 219;
+    private static readonly pb::FieldCodec<pb::ByteString> _repeated_repeatedBytesWrapper_codec
+        = pb::FieldCodec.ForClassWrapper<pb::ByteString>(1754);
+    private readonly pbc::RepeatedField<pb::ByteString> repeatedBytesWrapper_ = new pbc::RepeatedField<pb::ByteString>();
+    public pbc::RepeatedField<pb::ByteString> RepeatedBytesWrapper {
+      get { return repeatedBytesWrapper_; }
+    }
+
+    /// <summary>Field number for the "optional_duration" field.</summary>
+    public const int OptionalDurationFieldNumber = 301;
+    private global::Google.Protobuf.WellKnownTypes.Duration optionalDuration_;
+    public global::Google.Protobuf.WellKnownTypes.Duration OptionalDuration {
+      get { return optionalDuration_; }
+      set {
+        optionalDuration_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_timestamp" field.</summary>
+    public const int OptionalTimestampFieldNumber = 302;
+    private global::Google.Protobuf.WellKnownTypes.Timestamp optionalTimestamp_;
+    public global::Google.Protobuf.WellKnownTypes.Timestamp OptionalTimestamp {
+      get { return optionalTimestamp_; }
+      set {
+        optionalTimestamp_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_field_mask" field.</summary>
+    public const int OptionalFieldMaskFieldNumber = 303;
+    private global::Google.Protobuf.WellKnownTypes.FieldMask optionalFieldMask_;
+    public global::Google.Protobuf.WellKnownTypes.FieldMask OptionalFieldMask {
+      get { return optionalFieldMask_; }
+      set {
+        optionalFieldMask_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_struct" field.</summary>
+    public const int OptionalStructFieldNumber = 304;
+    private global::Google.Protobuf.WellKnownTypes.Struct optionalStruct_;
+    public global::Google.Protobuf.WellKnownTypes.Struct OptionalStruct {
+      get { return optionalStruct_; }
+      set {
+        optionalStruct_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_any" field.</summary>
+    public const int OptionalAnyFieldNumber = 305;
+    private global::Google.Protobuf.WellKnownTypes.Any optionalAny_;
+    public global::Google.Protobuf.WellKnownTypes.Any OptionalAny {
+      get { return optionalAny_; }
+      set {
+        optionalAny_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "optional_value" field.</summary>
+    public const int OptionalValueFieldNumber = 306;
+    private global::Google.Protobuf.WellKnownTypes.Value optionalValue_;
+    public global::Google.Protobuf.WellKnownTypes.Value OptionalValue {
+      get { return optionalValue_; }
+      set {
+        optionalValue_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "repeated_duration" field.</summary>
+    public const int RepeatedDurationFieldNumber = 311;
+    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Duration> _repeated_repeatedDuration_codec
+        = pb::FieldCodec.ForMessage(2490, global::Google.Protobuf.WellKnownTypes.Duration.Parser);
+    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> repeatedDuration_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration>();
+    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> RepeatedDuration {
+      get { return repeatedDuration_; }
+    }
+
+    /// <summary>Field number for the "repeated_timestamp" field.</summary>
+    public const int RepeatedTimestampFieldNumber = 312;
+    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Timestamp> _repeated_repeatedTimestamp_codec
+        = pb::FieldCodec.ForMessage(2498, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser);
+    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> repeatedTimestamp_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp>();
+    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> RepeatedTimestamp {
+      get { return repeatedTimestamp_; }
+    }
+
+    /// <summary>Field number for the "repeated_fieldmask" field.</summary>
+    public const int RepeatedFieldmaskFieldNumber = 313;
+    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.FieldMask> _repeated_repeatedFieldmask_codec
+        = pb::FieldCodec.ForMessage(2506, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser);
+    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> repeatedFieldmask_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask>();
+    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> RepeatedFieldmask {
+      get { return repeatedFieldmask_; }
+    }
+
+    /// <summary>Field number for the "repeated_struct" field.</summary>
+    public const int RepeatedStructFieldNumber = 324;
+    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Struct> _repeated_repeatedStruct_codec
+        = pb::FieldCodec.ForMessage(2594, global::Google.Protobuf.WellKnownTypes.Struct.Parser);
+    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> repeatedStruct_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct>();
+    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> RepeatedStruct {
+      get { return repeatedStruct_; }
+    }
+
+    /// <summary>Field number for the "repeated_any" field.</summary>
+    public const int RepeatedAnyFieldNumber = 315;
+    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Any> _repeated_repeatedAny_codec
+        = pb::FieldCodec.ForMessage(2522, global::Google.Protobuf.WellKnownTypes.Any.Parser);
+    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> repeatedAny_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any>();
+    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> RepeatedAny {
+      get { return repeatedAny_; }
+    }
+
+    /// <summary>Field number for the "repeated_value" field.</summary>
+    public const int RepeatedValueFieldNumber = 316;
+    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Value> _repeated_repeatedValue_codec
+        = pb::FieldCodec.ForMessage(2530, global::Google.Protobuf.WellKnownTypes.Value.Parser);
+    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value> repeatedValue_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value>();
+    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value> RepeatedValue {
+      get { return repeatedValue_; }
+    }
+
+    /// <summary>Field number for the "fieldname1" field.</summary>
+    public const int Fieldname1FieldNumber = 401;
+    private int fieldname1_;
+    /// <summary>
+    ///  Test field-name-to-JSON-name convention.
+    /// </summary>
+    public int Fieldname1 {
+      get { return fieldname1_; }
+      set {
+        fieldname1_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "field_name2" field.</summary>
+    public const int FieldName2FieldNumber = 402;
+    private int fieldName2_;
+    public int FieldName2 {
+      get { return fieldName2_; }
+      set {
+        fieldName2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "_field_name3" field.</summary>
+    public const int FieldName3FieldNumber = 403;
+    private int FieldName3_;
+    public int FieldName3 {
+      get { return FieldName3_; }
+      set {
+        FieldName3_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "field__name4_" field.</summary>
+    public const int FieldName4FieldNumber = 404;
+    private int fieldName4_;
+    public int FieldName4 {
+      get { return fieldName4_; }
+      set {
+        fieldName4_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "field0name5" field.</summary>
+    public const int Field0Name5FieldNumber = 405;
+    private int field0Name5_;
+    public int Field0Name5 {
+      get { return field0Name5_; }
+      set {
+        field0Name5_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "field_0_name6" field.</summary>
+    public const int Field0Name6FieldNumber = 406;
+    private int field0Name6_;
+    public int Field0Name6 {
+      get { return field0Name6_; }
+      set {
+        field0Name6_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "fieldName7" field.</summary>
+    public const int FieldName7FieldNumber = 407;
+    private int fieldName7_;
+    public int FieldName7 {
+      get { return fieldName7_; }
+      set {
+        fieldName7_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "FieldName8" field.</summary>
+    public const int FieldName8FieldNumber = 408;
+    private int fieldName8_;
+    public int FieldName8 {
+      get { return fieldName8_; }
+      set {
+        fieldName8_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "field_Name9" field.</summary>
+    public const int FieldName9FieldNumber = 409;
+    private int fieldName9_;
+    public int FieldName9 {
+      get { return fieldName9_; }
+      set {
+        fieldName9_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "Field_Name10" field.</summary>
+    public const int FieldName10FieldNumber = 410;
+    private int fieldName10_;
+    public int FieldName10 {
+      get { return fieldName10_; }
+      set {
+        fieldName10_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "FIELD_NAME11" field.</summary>
+    public const int FIELDNAME11FieldNumber = 411;
+    private int fIELDNAME11_;
+    public int FIELDNAME11 {
+      get { return fIELDNAME11_; }
+      set {
+        fIELDNAME11_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "FIELD_name12" field.</summary>
+    public const int FIELDName12FieldNumber = 412;
+    private int fIELDName12_;
+    public int FIELDName12 {
+      get { return fIELDName12_; }
+      set {
+        fIELDName12_ = value;
+      }
+    }
+
+    private object oneofField_;
+    /// <summary>Enum of possible cases for the "oneof_field" oneof.</summary>
+    public enum OneofFieldOneofCase {
+      None = 0,
+      OneofUint32 = 111,
+      OneofNestedMessage = 112,
+      OneofString = 113,
+      OneofBytes = 114,
+    }
+    private OneofFieldOneofCase oneofFieldCase_ = OneofFieldOneofCase.None;
+    public OneofFieldOneofCase OneofFieldCase {
+      get { return oneofFieldCase_; }
+    }
+
+    public void ClearOneofField() {
+      oneofFieldCase_ = OneofFieldOneofCase.None;
+      oneofField_ = null;
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestAllTypes);
+    }
+
+    public bool Equals(TestAllTypes other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (OptionalInt32 != other.OptionalInt32) return false;
+      if (OptionalInt64 != other.OptionalInt64) return false;
+      if (OptionalUint32 != other.OptionalUint32) return false;
+      if (OptionalUint64 != other.OptionalUint64) return false;
+      if (OptionalSint32 != other.OptionalSint32) return false;
+      if (OptionalSint64 != other.OptionalSint64) return false;
+      if (OptionalFixed32 != other.OptionalFixed32) return false;
+      if (OptionalFixed64 != other.OptionalFixed64) return false;
+      if (OptionalSfixed32 != other.OptionalSfixed32) return false;
+      if (OptionalSfixed64 != other.OptionalSfixed64) return false;
+      if (OptionalFloat != other.OptionalFloat) return false;
+      if (OptionalDouble != other.OptionalDouble) return false;
+      if (OptionalBool != other.OptionalBool) return false;
+      if (OptionalString != other.OptionalString) return false;
+      if (OptionalBytes != other.OptionalBytes) return false;
+      if (!object.Equals(OptionalNestedMessage, other.OptionalNestedMessage)) return false;
+      if (!object.Equals(OptionalForeignMessage, other.OptionalForeignMessage)) return false;
+      if (OptionalNestedEnum != other.OptionalNestedEnum) return false;
+      if (OptionalForeignEnum != other.OptionalForeignEnum) return false;
+      if (OptionalStringPiece != other.OptionalStringPiece) return false;
+      if (OptionalCord != other.OptionalCord) return false;
+      if (!object.Equals(RecursiveMessage, other.RecursiveMessage)) return false;
+      if(!repeatedInt32_.Equals(other.repeatedInt32_)) return false;
+      if(!repeatedInt64_.Equals(other.repeatedInt64_)) return false;
+      if(!repeatedUint32_.Equals(other.repeatedUint32_)) return false;
+      if(!repeatedUint64_.Equals(other.repeatedUint64_)) return false;
+      if(!repeatedSint32_.Equals(other.repeatedSint32_)) return false;
+      if(!repeatedSint64_.Equals(other.repeatedSint64_)) return false;
+      if(!repeatedFixed32_.Equals(other.repeatedFixed32_)) return false;
+      if(!repeatedFixed64_.Equals(other.repeatedFixed64_)) return false;
+      if(!repeatedSfixed32_.Equals(other.repeatedSfixed32_)) return false;
+      if(!repeatedSfixed64_.Equals(other.repeatedSfixed64_)) return false;
+      if(!repeatedFloat_.Equals(other.repeatedFloat_)) return false;
+      if(!repeatedDouble_.Equals(other.repeatedDouble_)) return false;
+      if(!repeatedBool_.Equals(other.repeatedBool_)) return false;
+      if(!repeatedString_.Equals(other.repeatedString_)) return false;
+      if(!repeatedBytes_.Equals(other.repeatedBytes_)) return false;
+      if(!repeatedNestedMessage_.Equals(other.repeatedNestedMessage_)) return false;
+      if(!repeatedForeignMessage_.Equals(other.repeatedForeignMessage_)) return false;
+      if(!repeatedNestedEnum_.Equals(other.repeatedNestedEnum_)) return false;
+      if(!repeatedForeignEnum_.Equals(other.repeatedForeignEnum_)) return false;
+      if(!repeatedStringPiece_.Equals(other.repeatedStringPiece_)) return false;
+      if(!repeatedCord_.Equals(other.repeatedCord_)) return false;
+      if (!MapInt32Int32.Equals(other.MapInt32Int32)) return false;
+      if (!MapInt64Int64.Equals(other.MapInt64Int64)) return false;
+      if (!MapUint32Uint32.Equals(other.MapUint32Uint32)) return false;
+      if (!MapUint64Uint64.Equals(other.MapUint64Uint64)) return false;
+      if (!MapSint32Sint32.Equals(other.MapSint32Sint32)) return false;
+      if (!MapSint64Sint64.Equals(other.MapSint64Sint64)) return false;
+      if (!MapFixed32Fixed32.Equals(other.MapFixed32Fixed32)) return false;
+      if (!MapFixed64Fixed64.Equals(other.MapFixed64Fixed64)) return false;
+      if (!MapSfixed32Sfixed32.Equals(other.MapSfixed32Sfixed32)) return false;
+      if (!MapSfixed64Sfixed64.Equals(other.MapSfixed64Sfixed64)) return false;
+      if (!MapInt32Float.Equals(other.MapInt32Float)) return false;
+      if (!MapInt32Double.Equals(other.MapInt32Double)) return false;
+      if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
+      if (!MapStringString.Equals(other.MapStringString)) return false;
+      if (!MapStringBytes.Equals(other.MapStringBytes)) return false;
+      if (!MapStringNestedMessage.Equals(other.MapStringNestedMessage)) return false;
+      if (!MapStringForeignMessage.Equals(other.MapStringForeignMessage)) return false;
+      if (!MapStringNestedEnum.Equals(other.MapStringNestedEnum)) return false;
+      if (!MapStringForeignEnum.Equals(other.MapStringForeignEnum)) return false;
+      if (OneofUint32 != other.OneofUint32) return false;
+      if (!object.Equals(OneofNestedMessage, other.OneofNestedMessage)) return false;
+      if (OneofString != other.OneofString) return false;
+      if (OneofBytes != other.OneofBytes) return false;
+      if (OptionalBoolWrapper != other.OptionalBoolWrapper) return false;
+      if (OptionalInt32Wrapper != other.OptionalInt32Wrapper) return false;
+      if (OptionalInt64Wrapper != other.OptionalInt64Wrapper) return false;
+      if (OptionalUint32Wrapper != other.OptionalUint32Wrapper) return false;
+      if (OptionalUint64Wrapper != other.OptionalUint64Wrapper) return false;
+      if (OptionalFloatWrapper != other.OptionalFloatWrapper) return false;
+      if (OptionalDoubleWrapper != other.OptionalDoubleWrapper) return false;
+      if (OptionalStringWrapper != other.OptionalStringWrapper) return false;
+      if (OptionalBytesWrapper != other.OptionalBytesWrapper) return false;
+      if(!repeatedBoolWrapper_.Equals(other.repeatedBoolWrapper_)) return false;
+      if(!repeatedInt32Wrapper_.Equals(other.repeatedInt32Wrapper_)) return false;
+      if(!repeatedInt64Wrapper_.Equals(other.repeatedInt64Wrapper_)) return false;
+      if(!repeatedUint32Wrapper_.Equals(other.repeatedUint32Wrapper_)) return false;
+      if(!repeatedUint64Wrapper_.Equals(other.repeatedUint64Wrapper_)) return false;
+      if(!repeatedFloatWrapper_.Equals(other.repeatedFloatWrapper_)) return false;
+      if(!repeatedDoubleWrapper_.Equals(other.repeatedDoubleWrapper_)) return false;
+      if(!repeatedStringWrapper_.Equals(other.repeatedStringWrapper_)) return false;
+      if(!repeatedBytesWrapper_.Equals(other.repeatedBytesWrapper_)) return false;
+      if (!object.Equals(OptionalDuration, other.OptionalDuration)) return false;
+      if (!object.Equals(OptionalTimestamp, other.OptionalTimestamp)) return false;
+      if (!object.Equals(OptionalFieldMask, other.OptionalFieldMask)) return false;
+      if (!object.Equals(OptionalStruct, other.OptionalStruct)) return false;
+      if (!object.Equals(OptionalAny, other.OptionalAny)) return false;
+      if (!object.Equals(OptionalValue, other.OptionalValue)) return false;
+      if(!repeatedDuration_.Equals(other.repeatedDuration_)) return false;
+      if(!repeatedTimestamp_.Equals(other.repeatedTimestamp_)) return false;
+      if(!repeatedFieldmask_.Equals(other.repeatedFieldmask_)) return false;
+      if(!repeatedStruct_.Equals(other.repeatedStruct_)) return false;
+      if(!repeatedAny_.Equals(other.repeatedAny_)) return false;
+      if(!repeatedValue_.Equals(other.repeatedValue_)) return false;
+      if (Fieldname1 != other.Fieldname1) return false;
+      if (FieldName2 != other.FieldName2) return false;
+      if (FieldName3 != other.FieldName3) return false;
+      if (FieldName4 != other.FieldName4) return false;
+      if (Field0Name5 != other.Field0Name5) return false;
+      if (Field0Name6 != other.Field0Name6) return false;
+      if (FieldName7 != other.FieldName7) return false;
+      if (FieldName8 != other.FieldName8) return false;
+      if (FieldName9 != other.FieldName9) return false;
+      if (FieldName10 != other.FieldName10) return false;
+      if (FIELDNAME11 != other.FIELDNAME11) return false;
+      if (FIELDName12 != other.FIELDName12) return false;
+      if (OneofFieldCase != other.OneofFieldCase) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (OptionalInt32 != 0) hash ^= OptionalInt32.GetHashCode();
+      if (OptionalInt64 != 0L) hash ^= OptionalInt64.GetHashCode();
+      if (OptionalUint32 != 0) hash ^= OptionalUint32.GetHashCode();
+      if (OptionalUint64 != 0UL) hash ^= OptionalUint64.GetHashCode();
+      if (OptionalSint32 != 0) hash ^= OptionalSint32.GetHashCode();
+      if (OptionalSint64 != 0L) hash ^= OptionalSint64.GetHashCode();
+      if (OptionalFixed32 != 0) hash ^= OptionalFixed32.GetHashCode();
+      if (OptionalFixed64 != 0UL) hash ^= OptionalFixed64.GetHashCode();
+      if (OptionalSfixed32 != 0) hash ^= OptionalSfixed32.GetHashCode();
+      if (OptionalSfixed64 != 0L) hash ^= OptionalSfixed64.GetHashCode();
+      if (OptionalFloat != 0F) hash ^= OptionalFloat.GetHashCode();
+      if (OptionalDouble != 0D) hash ^= OptionalDouble.GetHashCode();
+      if (OptionalBool != false) hash ^= OptionalBool.GetHashCode();
+      if (OptionalString.Length != 0) hash ^= OptionalString.GetHashCode();
+      if (OptionalBytes.Length != 0) hash ^= OptionalBytes.GetHashCode();
+      if (optionalNestedMessage_ != null) hash ^= OptionalNestedMessage.GetHashCode();
+      if (optionalForeignMessage_ != null) hash ^= OptionalForeignMessage.GetHashCode();
+      if (OptionalNestedEnum != 0) hash ^= OptionalNestedEnum.GetHashCode();
+      if (OptionalForeignEnum != 0) hash ^= OptionalForeignEnum.GetHashCode();
+      if (OptionalStringPiece.Length != 0) hash ^= OptionalStringPiece.GetHashCode();
+      if (OptionalCord.Length != 0) hash ^= OptionalCord.GetHashCode();
+      if (recursiveMessage_ != null) hash ^= RecursiveMessage.GetHashCode();
+      hash ^= repeatedInt32_.GetHashCode();
+      hash ^= repeatedInt64_.GetHashCode();
+      hash ^= repeatedUint32_.GetHashCode();
+      hash ^= repeatedUint64_.GetHashCode();
+      hash ^= repeatedSint32_.GetHashCode();
+      hash ^= repeatedSint64_.GetHashCode();
+      hash ^= repeatedFixed32_.GetHashCode();
+      hash ^= repeatedFixed64_.GetHashCode();
+      hash ^= repeatedSfixed32_.GetHashCode();
+      hash ^= repeatedSfixed64_.GetHashCode();
+      hash ^= repeatedFloat_.GetHashCode();
+      hash ^= repeatedDouble_.GetHashCode();
+      hash ^= repeatedBool_.GetHashCode();
+      hash ^= repeatedString_.GetHashCode();
+      hash ^= repeatedBytes_.GetHashCode();
+      hash ^= repeatedNestedMessage_.GetHashCode();
+      hash ^= repeatedForeignMessage_.GetHashCode();
+      hash ^= repeatedNestedEnum_.GetHashCode();
+      hash ^= repeatedForeignEnum_.GetHashCode();
+      hash ^= repeatedStringPiece_.GetHashCode();
+      hash ^= repeatedCord_.GetHashCode();
+      hash ^= MapInt32Int32.GetHashCode();
+      hash ^= MapInt64Int64.GetHashCode();
+      hash ^= MapUint32Uint32.GetHashCode();
+      hash ^= MapUint64Uint64.GetHashCode();
+      hash ^= MapSint32Sint32.GetHashCode();
+      hash ^= MapSint64Sint64.GetHashCode();
+      hash ^= MapFixed32Fixed32.GetHashCode();
+      hash ^= MapFixed64Fixed64.GetHashCode();
+      hash ^= MapSfixed32Sfixed32.GetHashCode();
+      hash ^= MapSfixed64Sfixed64.GetHashCode();
+      hash ^= MapInt32Float.GetHashCode();
+      hash ^= MapInt32Double.GetHashCode();
+      hash ^= MapBoolBool.GetHashCode();
+      hash ^= MapStringString.GetHashCode();
+      hash ^= MapStringBytes.GetHashCode();
+      hash ^= MapStringNestedMessage.GetHashCode();
+      hash ^= MapStringForeignMessage.GetHashCode();
+      hash ^= MapStringNestedEnum.GetHashCode();
+      hash ^= MapStringForeignEnum.GetHashCode();
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint32) hash ^= OneofUint32.GetHashCode();
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) hash ^= OneofNestedMessage.GetHashCode();
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) hash ^= OneofString.GetHashCode();
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) hash ^= OneofBytes.GetHashCode();
+      if (optionalBoolWrapper_ != null) hash ^= OptionalBoolWrapper.GetHashCode();
+      if (optionalInt32Wrapper_ != null) hash ^= OptionalInt32Wrapper.GetHashCode();
+      if (optionalInt64Wrapper_ != null) hash ^= OptionalInt64Wrapper.GetHashCode();
+      if (optionalUint32Wrapper_ != null) hash ^= OptionalUint32Wrapper.GetHashCode();
+      if (optionalUint64Wrapper_ != null) hash ^= OptionalUint64Wrapper.GetHashCode();
+      if (optionalFloatWrapper_ != null) hash ^= OptionalFloatWrapper.GetHashCode();
+      if (optionalDoubleWrapper_ != null) hash ^= OptionalDoubleWrapper.GetHashCode();
+      if (optionalStringWrapper_ != null) hash ^= OptionalStringWrapper.GetHashCode();
+      if (optionalBytesWrapper_ != null) hash ^= OptionalBytesWrapper.GetHashCode();
+      hash ^= repeatedBoolWrapper_.GetHashCode();
+      hash ^= repeatedInt32Wrapper_.GetHashCode();
+      hash ^= repeatedInt64Wrapper_.GetHashCode();
+      hash ^= repeatedUint32Wrapper_.GetHashCode();
+      hash ^= repeatedUint64Wrapper_.GetHashCode();
+      hash ^= repeatedFloatWrapper_.GetHashCode();
+      hash ^= repeatedDoubleWrapper_.GetHashCode();
+      hash ^= repeatedStringWrapper_.GetHashCode();
+      hash ^= repeatedBytesWrapper_.GetHashCode();
+      if (optionalDuration_ != null) hash ^= OptionalDuration.GetHashCode();
+      if (optionalTimestamp_ != null) hash ^= OptionalTimestamp.GetHashCode();
+      if (optionalFieldMask_ != null) hash ^= OptionalFieldMask.GetHashCode();
+      if (optionalStruct_ != null) hash ^= OptionalStruct.GetHashCode();
+      if (optionalAny_ != null) hash ^= OptionalAny.GetHashCode();
+      if (optionalValue_ != null) hash ^= OptionalValue.GetHashCode();
+      hash ^= repeatedDuration_.GetHashCode();
+      hash ^= repeatedTimestamp_.GetHashCode();
+      hash ^= repeatedFieldmask_.GetHashCode();
+      hash ^= repeatedStruct_.GetHashCode();
+      hash ^= repeatedAny_.GetHashCode();
+      hash ^= repeatedValue_.GetHashCode();
+      if (Fieldname1 != 0) hash ^= Fieldname1.GetHashCode();
+      if (FieldName2 != 0) hash ^= FieldName2.GetHashCode();
+      if (FieldName3 != 0) hash ^= FieldName3.GetHashCode();
+      if (FieldName4 != 0) hash ^= FieldName4.GetHashCode();
+      if (Field0Name5 != 0) hash ^= Field0Name5.GetHashCode();
+      if (Field0Name6 != 0) hash ^= Field0Name6.GetHashCode();
+      if (FieldName7 != 0) hash ^= FieldName7.GetHashCode();
+      if (FieldName8 != 0) hash ^= FieldName8.GetHashCode();
+      if (FieldName9 != 0) hash ^= FieldName9.GetHashCode();
+      if (FieldName10 != 0) hash ^= FieldName10.GetHashCode();
+      if (FIELDNAME11 != 0) hash ^= FIELDNAME11.GetHashCode();
+      if (FIELDName12 != 0) hash ^= FIELDName12.GetHashCode();
+      hash ^= (int) oneofFieldCase_;
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (OptionalInt32 != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(OptionalInt32);
+      }
+      if (OptionalInt64 != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(OptionalInt64);
+      }
+      if (OptionalUint32 != 0) {
+        output.WriteRawTag(24);
+        output.WriteUInt32(OptionalUint32);
+      }
+      if (OptionalUint64 != 0UL) {
+        output.WriteRawTag(32);
+        output.WriteUInt64(OptionalUint64);
+      }
+      if (OptionalSint32 != 0) {
+        output.WriteRawTag(40);
+        output.WriteSInt32(OptionalSint32);
+      }
+      if (OptionalSint64 != 0L) {
+        output.WriteRawTag(48);
+        output.WriteSInt64(OptionalSint64);
+      }
+      if (OptionalFixed32 != 0) {
+        output.WriteRawTag(61);
+        output.WriteFixed32(OptionalFixed32);
+      }
+      if (OptionalFixed64 != 0UL) {
+        output.WriteRawTag(65);
+        output.WriteFixed64(OptionalFixed64);
+      }
+      if (OptionalSfixed32 != 0) {
+        output.WriteRawTag(77);
+        output.WriteSFixed32(OptionalSfixed32);
+      }
+      if (OptionalSfixed64 != 0L) {
+        output.WriteRawTag(81);
+        output.WriteSFixed64(OptionalSfixed64);
+      }
+      if (OptionalFloat != 0F) {
+        output.WriteRawTag(93);
+        output.WriteFloat(OptionalFloat);
+      }
+      if (OptionalDouble != 0D) {
+        output.WriteRawTag(97);
+        output.WriteDouble(OptionalDouble);
+      }
+      if (OptionalBool != false) {
+        output.WriteRawTag(104);
+        output.WriteBool(OptionalBool);
+      }
+      if (OptionalString.Length != 0) {
+        output.WriteRawTag(114);
+        output.WriteString(OptionalString);
+      }
+      if (OptionalBytes.Length != 0) {
+        output.WriteRawTag(122);
+        output.WriteBytes(OptionalBytes);
+      }
+      if (optionalNestedMessage_ != null) {
+        output.WriteRawTag(146, 1);
+        output.WriteMessage(OptionalNestedMessage);
+      }
+      if (optionalForeignMessage_ != null) {
+        output.WriteRawTag(154, 1);
+        output.WriteMessage(OptionalForeignMessage);
+      }
+      if (OptionalNestedEnum != 0) {
+        output.WriteRawTag(168, 1);
+        output.WriteEnum((int) OptionalNestedEnum);
+      }
+      if (OptionalForeignEnum != 0) {
+        output.WriteRawTag(176, 1);
+        output.WriteEnum((int) OptionalForeignEnum);
+      }
+      if (OptionalStringPiece.Length != 0) {
+        output.WriteRawTag(194, 1);
+        output.WriteString(OptionalStringPiece);
+      }
+      if (OptionalCord.Length != 0) {
+        output.WriteRawTag(202, 1);
+        output.WriteString(OptionalCord);
+      }
+      if (recursiveMessage_ != null) {
+        output.WriteRawTag(218, 1);
+        output.WriteMessage(RecursiveMessage);
+      }
+      repeatedInt32_.WriteTo(output, _repeated_repeatedInt32_codec);
+      repeatedInt64_.WriteTo(output, _repeated_repeatedInt64_codec);
+      repeatedUint32_.WriteTo(output, _repeated_repeatedUint32_codec);
+      repeatedUint64_.WriteTo(output, _repeated_repeatedUint64_codec);
+      repeatedSint32_.WriteTo(output, _repeated_repeatedSint32_codec);
+      repeatedSint64_.WriteTo(output, _repeated_repeatedSint64_codec);
+      repeatedFixed32_.WriteTo(output, _repeated_repeatedFixed32_codec);
+      repeatedFixed64_.WriteTo(output, _repeated_repeatedFixed64_codec);
+      repeatedSfixed32_.WriteTo(output, _repeated_repeatedSfixed32_codec);
+      repeatedSfixed64_.WriteTo(output, _repeated_repeatedSfixed64_codec);
+      repeatedFloat_.WriteTo(output, _repeated_repeatedFloat_codec);
+      repeatedDouble_.WriteTo(output, _repeated_repeatedDouble_codec);
+      repeatedBool_.WriteTo(output, _repeated_repeatedBool_codec);
+      repeatedString_.WriteTo(output, _repeated_repeatedString_codec);
+      repeatedBytes_.WriteTo(output, _repeated_repeatedBytes_codec);
+      repeatedNestedMessage_.WriteTo(output, _repeated_repeatedNestedMessage_codec);
+      repeatedForeignMessage_.WriteTo(output, _repeated_repeatedForeignMessage_codec);
+      repeatedNestedEnum_.WriteTo(output, _repeated_repeatedNestedEnum_codec);
+      repeatedForeignEnum_.WriteTo(output, _repeated_repeatedForeignEnum_codec);
+      repeatedStringPiece_.WriteTo(output, _repeated_repeatedStringPiece_codec);
+      repeatedCord_.WriteTo(output, _repeated_repeatedCord_codec);
+      mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
+      mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
+      mapUint32Uint32_.WriteTo(output, _map_mapUint32Uint32_codec);
+      mapUint64Uint64_.WriteTo(output, _map_mapUint64Uint64_codec);
+      mapSint32Sint32_.WriteTo(output, _map_mapSint32Sint32_codec);
+      mapSint64Sint64_.WriteTo(output, _map_mapSint64Sint64_codec);
+      mapFixed32Fixed32_.WriteTo(output, _map_mapFixed32Fixed32_codec);
+      mapFixed64Fixed64_.WriteTo(output, _map_mapFixed64Fixed64_codec);
+      mapSfixed32Sfixed32_.WriteTo(output, _map_mapSfixed32Sfixed32_codec);
+      mapSfixed64Sfixed64_.WriteTo(output, _map_mapSfixed64Sfixed64_codec);
+      mapInt32Float_.WriteTo(output, _map_mapInt32Float_codec);
+      mapInt32Double_.WriteTo(output, _map_mapInt32Double_codec);
+      mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
+      mapStringString_.WriteTo(output, _map_mapStringString_codec);
+      mapStringBytes_.WriteTo(output, _map_mapStringBytes_codec);
+      mapStringNestedMessage_.WriteTo(output, _map_mapStringNestedMessage_codec);
+      mapStringForeignMessage_.WriteTo(output, _map_mapStringForeignMessage_codec);
+      mapStringNestedEnum_.WriteTo(output, _map_mapStringNestedEnum_codec);
+      mapStringForeignEnum_.WriteTo(output, _map_mapStringForeignEnum_codec);
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint32) {
+        output.WriteRawTag(248, 6);
+        output.WriteUInt32(OneofUint32);
+      }
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) {
+        output.WriteRawTag(130, 7);
+        output.WriteMessage(OneofNestedMessage);
+      }
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) {
+        output.WriteRawTag(138, 7);
+        output.WriteString(OneofString);
+      }
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) {
+        output.WriteRawTag(146, 7);
+        output.WriteBytes(OneofBytes);
+      }
+      if (optionalBoolWrapper_ != null) {
+        _single_optionalBoolWrapper_codec.WriteTagAndValue(output, OptionalBoolWrapper);
+      }
+      if (optionalInt32Wrapper_ != null) {
+        _single_optionalInt32Wrapper_codec.WriteTagAndValue(output, OptionalInt32Wrapper);
+      }
+      if (optionalInt64Wrapper_ != null) {
+        _single_optionalInt64Wrapper_codec.WriteTagAndValue(output, OptionalInt64Wrapper);
+      }
+      if (optionalUint32Wrapper_ != null) {
+        _single_optionalUint32Wrapper_codec.WriteTagAndValue(output, OptionalUint32Wrapper);
+      }
+      if (optionalUint64Wrapper_ != null) {
+        _single_optionalUint64Wrapper_codec.WriteTagAndValue(output, OptionalUint64Wrapper);
+      }
+      if (optionalFloatWrapper_ != null) {
+        _single_optionalFloatWrapper_codec.WriteTagAndValue(output, OptionalFloatWrapper);
+      }
+      if (optionalDoubleWrapper_ != null) {
+        _single_optionalDoubleWrapper_codec.WriteTagAndValue(output, OptionalDoubleWrapper);
+      }
+      if (optionalStringWrapper_ != null) {
+        _single_optionalStringWrapper_codec.WriteTagAndValue(output, OptionalStringWrapper);
+      }
+      if (optionalBytesWrapper_ != null) {
+        _single_optionalBytesWrapper_codec.WriteTagAndValue(output, OptionalBytesWrapper);
+      }
+      repeatedBoolWrapper_.WriteTo(output, _repeated_repeatedBoolWrapper_codec);
+      repeatedInt32Wrapper_.WriteTo(output, _repeated_repeatedInt32Wrapper_codec);
+      repeatedInt64Wrapper_.WriteTo(output, _repeated_repeatedInt64Wrapper_codec);
+      repeatedUint32Wrapper_.WriteTo(output, _repeated_repeatedUint32Wrapper_codec);
+      repeatedUint64Wrapper_.WriteTo(output, _repeated_repeatedUint64Wrapper_codec);
+      repeatedFloatWrapper_.WriteTo(output, _repeated_repeatedFloatWrapper_codec);
+      repeatedDoubleWrapper_.WriteTo(output, _repeated_repeatedDoubleWrapper_codec);
+      repeatedStringWrapper_.WriteTo(output, _repeated_repeatedStringWrapper_codec);
+      repeatedBytesWrapper_.WriteTo(output, _repeated_repeatedBytesWrapper_codec);
+      if (optionalDuration_ != null) {
+        output.WriteRawTag(234, 18);
+        output.WriteMessage(OptionalDuration);
+      }
+      if (optionalTimestamp_ != null) {
+        output.WriteRawTag(242, 18);
+        output.WriteMessage(OptionalTimestamp);
+      }
+      if (optionalFieldMask_ != null) {
+        output.WriteRawTag(250, 18);
+        output.WriteMessage(OptionalFieldMask);
+      }
+      if (optionalStruct_ != null) {
+        output.WriteRawTag(130, 19);
+        output.WriteMessage(OptionalStruct);
+      }
+      if (optionalAny_ != null) {
+        output.WriteRawTag(138, 19);
+        output.WriteMessage(OptionalAny);
+      }
+      if (optionalValue_ != null) {
+        output.WriteRawTag(146, 19);
+        output.WriteMessage(OptionalValue);
+      }
+      repeatedDuration_.WriteTo(output, _repeated_repeatedDuration_codec);
+      repeatedTimestamp_.WriteTo(output, _repeated_repeatedTimestamp_codec);
+      repeatedFieldmask_.WriteTo(output, _repeated_repeatedFieldmask_codec);
+      repeatedAny_.WriteTo(output, _repeated_repeatedAny_codec);
+      repeatedValue_.WriteTo(output, _repeated_repeatedValue_codec);
+      repeatedStruct_.WriteTo(output, _repeated_repeatedStruct_codec);
+      if (Fieldname1 != 0) {
+        output.WriteRawTag(136, 25);
+        output.WriteInt32(Fieldname1);
+      }
+      if (FieldName2 != 0) {
+        output.WriteRawTag(144, 25);
+        output.WriteInt32(FieldName2);
+      }
+      if (FieldName3 != 0) {
+        output.WriteRawTag(152, 25);
+        output.WriteInt32(FieldName3);
+      }
+      if (FieldName4 != 0) {
+        output.WriteRawTag(160, 25);
+        output.WriteInt32(FieldName4);
+      }
+      if (Field0Name5 != 0) {
+        output.WriteRawTag(168, 25);
+        output.WriteInt32(Field0Name5);
+      }
+      if (Field0Name6 != 0) {
+        output.WriteRawTag(176, 25);
+        output.WriteInt32(Field0Name6);
+      }
+      if (FieldName7 != 0) {
+        output.WriteRawTag(184, 25);
+        output.WriteInt32(FieldName7);
+      }
+      if (FieldName8 != 0) {
+        output.WriteRawTag(192, 25);
+        output.WriteInt32(FieldName8);
+      }
+      if (FieldName9 != 0) {
+        output.WriteRawTag(200, 25);
+        output.WriteInt32(FieldName9);
+      }
+      if (FieldName10 != 0) {
+        output.WriteRawTag(208, 25);
+        output.WriteInt32(FieldName10);
+      }
+      if (FIELDNAME11 != 0) {
+        output.WriteRawTag(216, 25);
+        output.WriteInt32(FIELDNAME11);
+      }
+      if (FIELDName12 != 0) {
+        output.WriteRawTag(224, 25);
+        output.WriteInt32(FIELDName12);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (OptionalInt32 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(OptionalInt32);
+      }
+      if (OptionalInt64 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(OptionalInt64);
+      }
+      if (OptionalUint32 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt32Size(OptionalUint32);
+      }
+      if (OptionalUint64 != 0UL) {
+        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(OptionalUint64);
+      }
+      if (OptionalSint32 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeSInt32Size(OptionalSint32);
+      }
+      if (OptionalSint64 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeSInt64Size(OptionalSint64);
+      }
+      if (OptionalFixed32 != 0) {
+        size += 1 + 4;
+      }
+      if (OptionalFixed64 != 0UL) {
+        size += 1 + 8;
+      }
+      if (OptionalSfixed32 != 0) {
+        size += 1 + 4;
+      }
+      if (OptionalSfixed64 != 0L) {
+        size += 1 + 8;
+      }
+      if (OptionalFloat != 0F) {
+        size += 1 + 4;
+      }
+      if (OptionalDouble != 0D) {
+        size += 1 + 8;
+      }
+      if (OptionalBool != false) {
+        size += 1 + 1;
+      }
+      if (OptionalString.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(OptionalString);
+      }
+      if (OptionalBytes.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeBytesSize(OptionalBytes);
+      }
+      if (optionalNestedMessage_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalNestedMessage);
+      }
+      if (optionalForeignMessage_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalForeignMessage);
+      }
+      if (OptionalNestedEnum != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) OptionalNestedEnum);
+      }
+      if (OptionalForeignEnum != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) OptionalForeignEnum);
+      }
+      if (OptionalStringPiece.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(OptionalStringPiece);
+      }
+      if (OptionalCord.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(OptionalCord);
+      }
+      if (recursiveMessage_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(RecursiveMessage);
+      }
+      size += repeatedInt32_.CalculateSize(_repeated_repeatedInt32_codec);
+      size += repeatedInt64_.CalculateSize(_repeated_repeatedInt64_codec);
+      size += repeatedUint32_.CalculateSize(_repeated_repeatedUint32_codec);
+      size += repeatedUint64_.CalculateSize(_repeated_repeatedUint64_codec);
+      size += repeatedSint32_.CalculateSize(_repeated_repeatedSint32_codec);
+      size += repeatedSint64_.CalculateSize(_repeated_repeatedSint64_codec);
+      size += repeatedFixed32_.CalculateSize(_repeated_repeatedFixed32_codec);
+      size += repeatedFixed64_.CalculateSize(_repeated_repeatedFixed64_codec);
+      size += repeatedSfixed32_.CalculateSize(_repeated_repeatedSfixed32_codec);
+      size += repeatedSfixed64_.CalculateSize(_repeated_repeatedSfixed64_codec);
+      size += repeatedFloat_.CalculateSize(_repeated_repeatedFloat_codec);
+      size += repeatedDouble_.CalculateSize(_repeated_repeatedDouble_codec);
+      size += repeatedBool_.CalculateSize(_repeated_repeatedBool_codec);
+      size += repeatedString_.CalculateSize(_repeated_repeatedString_codec);
+      size += repeatedBytes_.CalculateSize(_repeated_repeatedBytes_codec);
+      size += repeatedNestedMessage_.CalculateSize(_repeated_repeatedNestedMessage_codec);
+      size += repeatedForeignMessage_.CalculateSize(_repeated_repeatedForeignMessage_codec);
+      size += repeatedNestedEnum_.CalculateSize(_repeated_repeatedNestedEnum_codec);
+      size += repeatedForeignEnum_.CalculateSize(_repeated_repeatedForeignEnum_codec);
+      size += repeatedStringPiece_.CalculateSize(_repeated_repeatedStringPiece_codec);
+      size += repeatedCord_.CalculateSize(_repeated_repeatedCord_codec);
+      size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
+      size += mapInt64Int64_.CalculateSize(_map_mapInt64Int64_codec);
+      size += mapUint32Uint32_.CalculateSize(_map_mapUint32Uint32_codec);
+      size += mapUint64Uint64_.CalculateSize(_map_mapUint64Uint64_codec);
+      size += mapSint32Sint32_.CalculateSize(_map_mapSint32Sint32_codec);
+      size += mapSint64Sint64_.CalculateSize(_map_mapSint64Sint64_codec);
+      size += mapFixed32Fixed32_.CalculateSize(_map_mapFixed32Fixed32_codec);
+      size += mapFixed64Fixed64_.CalculateSize(_map_mapFixed64Fixed64_codec);
+      size += mapSfixed32Sfixed32_.CalculateSize(_map_mapSfixed32Sfixed32_codec);
+      size += mapSfixed64Sfixed64_.CalculateSize(_map_mapSfixed64Sfixed64_codec);
+      size += mapInt32Float_.CalculateSize(_map_mapInt32Float_codec);
+      size += mapInt32Double_.CalculateSize(_map_mapInt32Double_codec);
+      size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
+      size += mapStringString_.CalculateSize(_map_mapStringString_codec);
+      size += mapStringBytes_.CalculateSize(_map_mapStringBytes_codec);
+      size += mapStringNestedMessage_.CalculateSize(_map_mapStringNestedMessage_codec);
+      size += mapStringForeignMessage_.CalculateSize(_map_mapStringForeignMessage_codec);
+      size += mapStringNestedEnum_.CalculateSize(_map_mapStringNestedEnum_codec);
+      size += mapStringForeignEnum_.CalculateSize(_map_mapStringForeignEnum_codec);
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint32) {
+        size += 2 + pb::CodedOutputStream.ComputeUInt32Size(OneofUint32);
+      }
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OneofNestedMessage);
+      }
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(OneofString);
+      }
+      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) {
+        size += 2 + pb::CodedOutputStream.ComputeBytesSize(OneofBytes);
+      }
+      if (optionalBoolWrapper_ != null) {
+        size += _single_optionalBoolWrapper_codec.CalculateSizeWithTag(OptionalBoolWrapper);
+      }
+      if (optionalInt32Wrapper_ != null) {
+        size += _single_optionalInt32Wrapper_codec.CalculateSizeWithTag(OptionalInt32Wrapper);
+      }
+      if (optionalInt64Wrapper_ != null) {
+        size += _single_optionalInt64Wrapper_codec.CalculateSizeWithTag(OptionalInt64Wrapper);
+      }
+      if (optionalUint32Wrapper_ != null) {
+        size += _single_optionalUint32Wrapper_codec.CalculateSizeWithTag(OptionalUint32Wrapper);
+      }
+      if (optionalUint64Wrapper_ != null) {
+        size += _single_optionalUint64Wrapper_codec.CalculateSizeWithTag(OptionalUint64Wrapper);
+      }
+      if (optionalFloatWrapper_ != null) {
+        size += _single_optionalFloatWrapper_codec.CalculateSizeWithTag(OptionalFloatWrapper);
+      }
+      if (optionalDoubleWrapper_ != null) {
+        size += _single_optionalDoubleWrapper_codec.CalculateSizeWithTag(OptionalDoubleWrapper);
+      }
+      if (optionalStringWrapper_ != null) {
+        size += _single_optionalStringWrapper_codec.CalculateSizeWithTag(OptionalStringWrapper);
+      }
+      if (optionalBytesWrapper_ != null) {
+        size += _single_optionalBytesWrapper_codec.CalculateSizeWithTag(OptionalBytesWrapper);
+      }
+      size += repeatedBoolWrapper_.CalculateSize(_repeated_repeatedBoolWrapper_codec);
+      size += repeatedInt32Wrapper_.CalculateSize(_repeated_repeatedInt32Wrapper_codec);
+      size += repeatedInt64Wrapper_.CalculateSize(_repeated_repeatedInt64Wrapper_codec);
+      size += repeatedUint32Wrapper_.CalculateSize(_repeated_repeatedUint32Wrapper_codec);
+      size += repeatedUint64Wrapper_.CalculateSize(_repeated_repeatedUint64Wrapper_codec);
+      size += repeatedFloatWrapper_.CalculateSize(_repeated_repeatedFloatWrapper_codec);
+      size += repeatedDoubleWrapper_.CalculateSize(_repeated_repeatedDoubleWrapper_codec);
+      size += repeatedStringWrapper_.CalculateSize(_repeated_repeatedStringWrapper_codec);
+      size += repeatedBytesWrapper_.CalculateSize(_repeated_repeatedBytesWrapper_codec);
+      if (optionalDuration_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalDuration);
+      }
+      if (optionalTimestamp_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalTimestamp);
+      }
+      if (optionalFieldMask_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalFieldMask);
+      }
+      if (optionalStruct_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalStruct);
+      }
+      if (optionalAny_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalAny);
+      }
+      if (optionalValue_ != null) {
+        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalValue);
+      }
+      size += repeatedDuration_.CalculateSize(_repeated_repeatedDuration_codec);
+      size += repeatedTimestamp_.CalculateSize(_repeated_repeatedTimestamp_codec);
+      size += repeatedFieldmask_.CalculateSize(_repeated_repeatedFieldmask_codec);
+      size += repeatedStruct_.CalculateSize(_repeated_repeatedStruct_codec);
+      size += repeatedAny_.CalculateSize(_repeated_repeatedAny_codec);
+      size += repeatedValue_.CalculateSize(_repeated_repeatedValue_codec);
+      if (Fieldname1 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Fieldname1);
+      }
+      if (FieldName2 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName2);
+      }
+      if (FieldName3 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName3);
+      }
+      if (FieldName4 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName4);
+      }
+      if (Field0Name5 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field0Name5);
+      }
+      if (Field0Name6 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field0Name6);
+      }
+      if (FieldName7 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName7);
+      }
+      if (FieldName8 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName8);
+      }
+      if (FieldName9 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName9);
+      }
+      if (FieldName10 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName10);
+      }
+      if (FIELDNAME11 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FIELDNAME11);
+      }
+      if (FIELDName12 != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FIELDName12);
+      }
+      return size;
+    }
+
+    public void MergeFrom(TestAllTypes other) {
+      if (other == null) {
+        return;
+      }
+      if (other.OptionalInt32 != 0) {
+        OptionalInt32 = other.OptionalInt32;
+      }
+      if (other.OptionalInt64 != 0L) {
+        OptionalInt64 = other.OptionalInt64;
+      }
+      if (other.OptionalUint32 != 0) {
+        OptionalUint32 = other.OptionalUint32;
+      }
+      if (other.OptionalUint64 != 0UL) {
+        OptionalUint64 = other.OptionalUint64;
+      }
+      if (other.OptionalSint32 != 0) {
+        OptionalSint32 = other.OptionalSint32;
+      }
+      if (other.OptionalSint64 != 0L) {
+        OptionalSint64 = other.OptionalSint64;
+      }
+      if (other.OptionalFixed32 != 0) {
+        OptionalFixed32 = other.OptionalFixed32;
+      }
+      if (other.OptionalFixed64 != 0UL) {
+        OptionalFixed64 = other.OptionalFixed64;
+      }
+      if (other.OptionalSfixed32 != 0) {
+        OptionalSfixed32 = other.OptionalSfixed32;
+      }
+      if (other.OptionalSfixed64 != 0L) {
+        OptionalSfixed64 = other.OptionalSfixed64;
+      }
+      if (other.OptionalFloat != 0F) {
+        OptionalFloat = other.OptionalFloat;
+      }
+      if (other.OptionalDouble != 0D) {
+        OptionalDouble = other.OptionalDouble;
+      }
+      if (other.OptionalBool != false) {
+        OptionalBool = other.OptionalBool;
+      }
+      if (other.OptionalString.Length != 0) {
+        OptionalString = other.OptionalString;
+      }
+      if (other.OptionalBytes.Length != 0) {
+        OptionalBytes = other.OptionalBytes;
+      }
+      if (other.optionalNestedMessage_ != null) {
+        if (optionalNestedMessage_ == null) {
+          optionalNestedMessage_ = new global::Conformance.TestAllTypes.Types.NestedMessage();
+        }
+        OptionalNestedMessage.MergeFrom(other.OptionalNestedMessage);
+      }
+      if (other.optionalForeignMessage_ != null) {
+        if (optionalForeignMessage_ == null) {
+          optionalForeignMessage_ = new global::Conformance.ForeignMessage();
+        }
+        OptionalForeignMessage.MergeFrom(other.OptionalForeignMessage);
+      }
+      if (other.OptionalNestedEnum != 0) {
+        OptionalNestedEnum = other.OptionalNestedEnum;
+      }
+      if (other.OptionalForeignEnum != 0) {
+        OptionalForeignEnum = other.OptionalForeignEnum;
+      }
+      if (other.OptionalStringPiece.Length != 0) {
+        OptionalStringPiece = other.OptionalStringPiece;
+      }
+      if (other.OptionalCord.Length != 0) {
+        OptionalCord = other.OptionalCord;
+      }
+      if (other.recursiveMessage_ != null) {
+        if (recursiveMessage_ == null) {
+          recursiveMessage_ = new global::Conformance.TestAllTypes();
+        }
+        RecursiveMessage.MergeFrom(other.RecursiveMessage);
+      }
+      repeatedInt32_.Add(other.repeatedInt32_);
+      repeatedInt64_.Add(other.repeatedInt64_);
+      repeatedUint32_.Add(other.repeatedUint32_);
+      repeatedUint64_.Add(other.repeatedUint64_);
+      repeatedSint32_.Add(other.repeatedSint32_);
+      repeatedSint64_.Add(other.repeatedSint64_);
+      repeatedFixed32_.Add(other.repeatedFixed32_);
+      repeatedFixed64_.Add(other.repeatedFixed64_);
+      repeatedSfixed32_.Add(other.repeatedSfixed32_);
+      repeatedSfixed64_.Add(other.repeatedSfixed64_);
+      repeatedFloat_.Add(other.repeatedFloat_);
+      repeatedDouble_.Add(other.repeatedDouble_);
+      repeatedBool_.Add(other.repeatedBool_);
+      repeatedString_.Add(other.repeatedString_);
+      repeatedBytes_.Add(other.repeatedBytes_);
+      repeatedNestedMessage_.Add(other.repeatedNestedMessage_);
+      repeatedForeignMessage_.Add(other.repeatedForeignMessage_);
+      repeatedNestedEnum_.Add(other.repeatedNestedEnum_);
+      repeatedForeignEnum_.Add(other.repeatedForeignEnum_);
+      repeatedStringPiece_.Add(other.repeatedStringPiece_);
+      repeatedCord_.Add(other.repeatedCord_);
+      mapInt32Int32_.Add(other.mapInt32Int32_);
+      mapInt64Int64_.Add(other.mapInt64Int64_);
+      mapUint32Uint32_.Add(other.mapUint32Uint32_);
+      mapUint64Uint64_.Add(other.mapUint64Uint64_);
+      mapSint32Sint32_.Add(other.mapSint32Sint32_);
+      mapSint64Sint64_.Add(other.mapSint64Sint64_);
+      mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
+      mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
+      mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
+      mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
+      mapInt32Float_.Add(other.mapInt32Float_);
+      mapInt32Double_.Add(other.mapInt32Double_);
+      mapBoolBool_.Add(other.mapBoolBool_);
+      mapStringString_.Add(other.mapStringString_);
+      mapStringBytes_.Add(other.mapStringBytes_);
+      mapStringNestedMessage_.Add(other.mapStringNestedMessage_);
+      mapStringForeignMessage_.Add(other.mapStringForeignMessage_);
+      mapStringNestedEnum_.Add(other.mapStringNestedEnum_);
+      mapStringForeignEnum_.Add(other.mapStringForeignEnum_);
+      if (other.optionalBoolWrapper_ != null) {
+        if (optionalBoolWrapper_ == null || other.OptionalBoolWrapper != false) {
+          OptionalBoolWrapper = other.OptionalBoolWrapper;
+        }
+      }
+      if (other.optionalInt32Wrapper_ != null) {
+        if (optionalInt32Wrapper_ == null || other.OptionalInt32Wrapper != 0) {
+          OptionalInt32Wrapper = other.OptionalInt32Wrapper;
+        }
+      }
+      if (other.optionalInt64Wrapper_ != null) {
+        if (optionalInt64Wrapper_ == null || other.OptionalInt64Wrapper != 0L) {
+          OptionalInt64Wrapper = other.OptionalInt64Wrapper;
+        }
+      }
+      if (other.optionalUint32Wrapper_ != null) {
+        if (optionalUint32Wrapper_ == null || other.OptionalUint32Wrapper != 0) {
+          OptionalUint32Wrapper = other.OptionalUint32Wrapper;
+        }
+      }
+      if (other.optionalUint64Wrapper_ != null) {
+        if (optionalUint64Wrapper_ == null || other.OptionalUint64Wrapper != 0UL) {
+          OptionalUint64Wrapper = other.OptionalUint64Wrapper;
+        }
+      }
+      if (other.optionalFloatWrapper_ != null) {
+        if (optionalFloatWrapper_ == null || other.OptionalFloatWrapper != 0F) {
+          OptionalFloatWrapper = other.OptionalFloatWrapper;
+        }
+      }
+      if (other.optionalDoubleWrapper_ != null) {
+        if (optionalDoubleWrapper_ == null || other.OptionalDoubleWrapper != 0D) {
+          OptionalDoubleWrapper = other.OptionalDoubleWrapper;
+        }
+      }
+      if (other.optionalStringWrapper_ != null) {
+        if (optionalStringWrapper_ == null || other.OptionalStringWrapper != "") {
+          OptionalStringWrapper = other.OptionalStringWrapper;
+        }
+      }
+      if (other.optionalBytesWrapper_ != null) {
+        if (optionalBytesWrapper_ == null || other.OptionalBytesWrapper != pb::ByteString.Empty) {
+          OptionalBytesWrapper = other.OptionalBytesWrapper;
+        }
+      }
+      repeatedBoolWrapper_.Add(other.repeatedBoolWrapper_);
+      repeatedInt32Wrapper_.Add(other.repeatedInt32Wrapper_);
+      repeatedInt64Wrapper_.Add(other.repeatedInt64Wrapper_);
+      repeatedUint32Wrapper_.Add(other.repeatedUint32Wrapper_);
+      repeatedUint64Wrapper_.Add(other.repeatedUint64Wrapper_);
+      repeatedFloatWrapper_.Add(other.repeatedFloatWrapper_);
+      repeatedDoubleWrapper_.Add(other.repeatedDoubleWrapper_);
+      repeatedStringWrapper_.Add(other.repeatedStringWrapper_);
+      repeatedBytesWrapper_.Add(other.repeatedBytesWrapper_);
+      if (other.optionalDuration_ != null) {
+        if (optionalDuration_ == null) {
+          optionalDuration_ = new global::Google.Protobuf.WellKnownTypes.Duration();
+        }
+        OptionalDuration.MergeFrom(other.OptionalDuration);
+      }
+      if (other.optionalTimestamp_ != null) {
+        if (optionalTimestamp_ == null) {
+          optionalTimestamp_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
+        }
+        OptionalTimestamp.MergeFrom(other.OptionalTimestamp);
+      }
+      if (other.optionalFieldMask_ != null) {
+        if (optionalFieldMask_ == null) {
+          optionalFieldMask_ = new global::Google.Protobuf.WellKnownTypes.FieldMask();
+        }
+        OptionalFieldMask.MergeFrom(other.OptionalFieldMask);
+      }
+      if (other.optionalStruct_ != null) {
+        if (optionalStruct_ == null) {
+          optionalStruct_ = new global::Google.Protobuf.WellKnownTypes.Struct();
+        }
+        OptionalStruct.MergeFrom(other.OptionalStruct);
+      }
+      if (other.optionalAny_ != null) {
+        if (optionalAny_ == null) {
+          optionalAny_ = new global::Google.Protobuf.WellKnownTypes.Any();
+        }
+        OptionalAny.MergeFrom(other.OptionalAny);
+      }
+      if (other.optionalValue_ != null) {
+        if (optionalValue_ == null) {
+          optionalValue_ = new global::Google.Protobuf.WellKnownTypes.Value();
+        }
+        OptionalValue.MergeFrom(other.OptionalValue);
+      }
+      repeatedDuration_.Add(other.repeatedDuration_);
+      repeatedTimestamp_.Add(other.repeatedTimestamp_);
+      repeatedFieldmask_.Add(other.repeatedFieldmask_);
+      repeatedStruct_.Add(other.repeatedStruct_);
+      repeatedAny_.Add(other.repeatedAny_);
+      repeatedValue_.Add(other.repeatedValue_);
+      if (other.Fieldname1 != 0) {
+        Fieldname1 = other.Fieldname1;
+      }
+      if (other.FieldName2 != 0) {
+        FieldName2 = other.FieldName2;
+      }
+      if (other.FieldName3 != 0) {
+        FieldName3 = other.FieldName3;
+      }
+      if (other.FieldName4 != 0) {
+        FieldName4 = other.FieldName4;
+      }
+      if (other.Field0Name5 != 0) {
+        Field0Name5 = other.Field0Name5;
+      }
+      if (other.Field0Name6 != 0) {
+        Field0Name6 = other.Field0Name6;
+      }
+      if (other.FieldName7 != 0) {
+        FieldName7 = other.FieldName7;
+      }
+      if (other.FieldName8 != 0) {
+        FieldName8 = other.FieldName8;
+      }
+      if (other.FieldName9 != 0) {
+        FieldName9 = other.FieldName9;
+      }
+      if (other.FieldName10 != 0) {
+        FieldName10 = other.FieldName10;
+      }
+      if (other.FIELDNAME11 != 0) {
+        FIELDNAME11 = other.FIELDNAME11;
+      }
+      if (other.FIELDName12 != 0) {
+        FIELDName12 = other.FIELDName12;
+      }
+      switch (other.OneofFieldCase) {
+        case OneofFieldOneofCase.OneofUint32:
+          OneofUint32 = other.OneofUint32;
+          break;
+        case OneofFieldOneofCase.OneofNestedMessage:
+          OneofNestedMessage = other.OneofNestedMessage;
+          break;
+        case OneofFieldOneofCase.OneofString:
+          OneofString = other.OneofString;
+          break;
+        case OneofFieldOneofCase.OneofBytes:
+          OneofBytes = other.OneofBytes;
+          break;
+      }
+
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            OptionalInt32 = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            OptionalInt64 = input.ReadInt64();
+            break;
+          }
+          case 24: {
+            OptionalUint32 = input.ReadUInt32();
+            break;
+          }
+          case 32: {
+            OptionalUint64 = input.ReadUInt64();
+            break;
+          }
+          case 40: {
+            OptionalSint32 = input.ReadSInt32();
+            break;
+          }
+          case 48: {
+            OptionalSint64 = input.ReadSInt64();
+            break;
+          }
+          case 61: {
+            OptionalFixed32 = input.ReadFixed32();
+            break;
+          }
+          case 65: {
+            OptionalFixed64 = input.ReadFixed64();
+            break;
+          }
+          case 77: {
+            OptionalSfixed32 = input.ReadSFixed32();
+            break;
+          }
+          case 81: {
+            OptionalSfixed64 = input.ReadSFixed64();
+            break;
+          }
+          case 93: {
+            OptionalFloat = input.ReadFloat();
+            break;
+          }
+          case 97: {
+            OptionalDouble = input.ReadDouble();
+            break;
+          }
+          case 104: {
+            OptionalBool = input.ReadBool();
+            break;
+          }
+          case 114: {
+            OptionalString = input.ReadString();
+            break;
+          }
+          case 122: {
+            OptionalBytes = input.ReadBytes();
+            break;
+          }
+          case 146: {
+            if (optionalNestedMessage_ == null) {
+              optionalNestedMessage_ = new global::Conformance.TestAllTypes.Types.NestedMessage();
+            }
+            input.ReadMessage(optionalNestedMessage_);
+            break;
+          }
+          case 154: {
+            if (optionalForeignMessage_ == null) {
+              optionalForeignMessage_ = new global::Conformance.ForeignMessage();
+            }
+            input.ReadMessage(optionalForeignMessage_);
+            break;
+          }
+          case 168: {
+            optionalNestedEnum_ = (global::Conformance.TestAllTypes.Types.NestedEnum) input.ReadEnum();
+            break;
+          }
+          case 176: {
+            optionalForeignEnum_ = (global::Conformance.ForeignEnum) input.ReadEnum();
+            break;
+          }
+          case 194: {
+            OptionalStringPiece = input.ReadString();
+            break;
+          }
+          case 202: {
+            OptionalCord = input.ReadString();
+            break;
+          }
+          case 218: {
+            if (recursiveMessage_ == null) {
+              recursiveMessage_ = new global::Conformance.TestAllTypes();
+            }
+            input.ReadMessage(recursiveMessage_);
+            break;
+          }
+          case 250:
+          case 248: {
+            repeatedInt32_.AddEntriesFrom(input, _repeated_repeatedInt32_codec);
+            break;
+          }
+          case 258:
+          case 256: {
+            repeatedInt64_.AddEntriesFrom(input, _repeated_repeatedInt64_codec);
+            break;
+          }
+          case 266:
+          case 264: {
+            repeatedUint32_.AddEntriesFrom(input, _repeated_repeatedUint32_codec);
+            break;
+          }
+          case 274:
+          case 272: {
+            repeatedUint64_.AddEntriesFrom(input, _repeated_repeatedUint64_codec);
+            break;
+          }
+          case 282:
+          case 280: {
+            repeatedSint32_.AddEntriesFrom(input, _repeated_repeatedSint32_codec);
+            break;
+          }
+          case 290:
+          case 288: {
+            repeatedSint64_.AddEntriesFrom(input, _repeated_repeatedSint64_codec);
+            break;
+          }
+          case 298:
+          case 301: {
+            repeatedFixed32_.AddEntriesFrom(input, _repeated_repeatedFixed32_codec);
+            break;
+          }
+          case 306:
+          case 305: {
+            repeatedFixed64_.AddEntriesFrom(input, _repeated_repeatedFixed64_codec);
+            break;
+          }
+          case 314:
+          case 317: {
+            repeatedSfixed32_.AddEntriesFrom(input, _repeated_repeatedSfixed32_codec);
+            break;
+          }
+          case 322:
+          case 321: {
+            repeatedSfixed64_.AddEntriesFrom(input, _repeated_repeatedSfixed64_codec);
+            break;
+          }
+          case 330:
+          case 333: {
+            repeatedFloat_.AddEntriesFrom(input, _repeated_repeatedFloat_codec);
+            break;
+          }
+          case 338:
+          case 337: {
+            repeatedDouble_.AddEntriesFrom(input, _repeated_repeatedDouble_codec);
+            break;
+          }
+          case 346:
+          case 344: {
+            repeatedBool_.AddEntriesFrom(input, _repeated_repeatedBool_codec);
+            break;
+          }
+          case 354: {
+            repeatedString_.AddEntriesFrom(input, _repeated_repeatedString_codec);
+            break;
+          }
+          case 362: {
+            repeatedBytes_.AddEntriesFrom(input, _repeated_repeatedBytes_codec);
+            break;
+          }
+          case 386: {
+            repeatedNestedMessage_.AddEntriesFrom(input, _repeated_repeatedNestedMessage_codec);
+            break;
+          }
+          case 394: {
+            repeatedForeignMessage_.AddEntriesFrom(input, _repeated_repeatedForeignMessage_codec);
+            break;
+          }
+          case 410:
+          case 408: {
+            repeatedNestedEnum_.AddEntriesFrom(input, _repeated_repeatedNestedEnum_codec);
+            break;
+          }
+          case 418:
+          case 416: {
+            repeatedForeignEnum_.AddEntriesFrom(input, _repeated_repeatedForeignEnum_codec);
+            break;
+          }
+          case 434: {
+            repeatedStringPiece_.AddEntriesFrom(input, _repeated_repeatedStringPiece_codec);
+            break;
+          }
+          case 442: {
+            repeatedCord_.AddEntriesFrom(input, _repeated_repeatedCord_codec);
+            break;
+          }
+          case 450: {
+            mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
+            break;
+          }
+          case 458: {
+            mapInt64Int64_.AddEntriesFrom(input, _map_mapInt64Int64_codec);
+            break;
+          }
+          case 466: {
+            mapUint32Uint32_.AddEntriesFrom(input, _map_mapUint32Uint32_codec);
+            break;
+          }
+          case 474: {
+            mapUint64Uint64_.AddEntriesFrom(input, _map_mapUint64Uint64_codec);
+            break;
+          }
+          case 482: {
+            mapSint32Sint32_.AddEntriesFrom(input, _map_mapSint32Sint32_codec);
+            break;
+          }
+          case 490: {
+            mapSint64Sint64_.AddEntriesFrom(input, _map_mapSint64Sint64_codec);
+            break;
+          }
+          case 498: {
+            mapFixed32Fixed32_.AddEntriesFrom(input, _map_mapFixed32Fixed32_codec);
+            break;
+          }
+          case 506: {
+            mapFixed64Fixed64_.AddEntriesFrom(input, _map_mapFixed64Fixed64_codec);
+            break;
+          }
+          case 514: {
+            mapSfixed32Sfixed32_.AddEntriesFrom(input, _map_mapSfixed32Sfixed32_codec);
+            break;
+          }
+          case 522: {
+            mapSfixed64Sfixed64_.AddEntriesFrom(input, _map_mapSfixed64Sfixed64_codec);
+            break;
+          }
+          case 530: {
+            mapInt32Float_.AddEntriesFrom(input, _map_mapInt32Float_codec);
+            break;
+          }
+          case 538: {
+            mapInt32Double_.AddEntriesFrom(input, _map_mapInt32Double_codec);
+            break;
+          }
+          case 546: {
+            mapBoolBool_.AddEntriesFrom(input, _map_mapBoolBool_codec);
+            break;
+          }
+          case 554: {
+            mapStringString_.AddEntriesFrom(input, _map_mapStringString_codec);
+            break;
+          }
+          case 562: {
+            mapStringBytes_.AddEntriesFrom(input, _map_mapStringBytes_codec);
+            break;
+          }
+          case 570: {
+            mapStringNestedMessage_.AddEntriesFrom(input, _map_mapStringNestedMessage_codec);
+            break;
+          }
+          case 578: {
+            mapStringForeignMessage_.AddEntriesFrom(input, _map_mapStringForeignMessage_codec);
+            break;
+          }
+          case 586: {
+            mapStringNestedEnum_.AddEntriesFrom(input, _map_mapStringNestedEnum_codec);
+            break;
+          }
+          case 594: {
+            mapStringForeignEnum_.AddEntriesFrom(input, _map_mapStringForeignEnum_codec);
+            break;
+          }
+          case 888: {
+            OneofUint32 = input.ReadUInt32();
+            break;
+          }
+          case 898: {
+            global::Conformance.TestAllTypes.Types.NestedMessage subBuilder = new global::Conformance.TestAllTypes.Types.NestedMessage();
+            if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) {
+              subBuilder.MergeFrom(OneofNestedMessage);
+            }
+            input.ReadMessage(subBuilder);
+            OneofNestedMessage = subBuilder;
+            break;
+          }
+          case 906: {
+            OneofString = input.ReadString();
+            break;
+          }
+          case 914: {
+            OneofBytes = input.ReadBytes();
+            break;
+          }
+          case 1610: {
+            bool? value = _single_optionalBoolWrapper_codec.Read(input);
+            if (optionalBoolWrapper_ == null || value != false) {
+              OptionalBoolWrapper = value;
+            }
+            break;
+          }
+          case 1618: {
+            int? value = _single_optionalInt32Wrapper_codec.Read(input);
+            if (optionalInt32Wrapper_ == null || value != 0) {
+              OptionalInt32Wrapper = value;
+            }
+            break;
+          }
+          case 1626: {
+            long? value = _single_optionalInt64Wrapper_codec.Read(input);
+            if (optionalInt64Wrapper_ == null || value != 0L) {
+              OptionalInt64Wrapper = value;
+            }
+            break;
+          }
+          case 1634: {
+            uint? value = _single_optionalUint32Wrapper_codec.Read(input);
+            if (optionalUint32Wrapper_ == null || value != 0) {
+              OptionalUint32Wrapper = value;
+            }
+            break;
+          }
+          case 1642: {
+            ulong? value = _single_optionalUint64Wrapper_codec.Read(input);
+            if (optionalUint64Wrapper_ == null || value != 0UL) {
+              OptionalUint64Wrapper = value;
+            }
+            break;
+          }
+          case 1650: {
+            float? value = _single_optionalFloatWrapper_codec.Read(input);
+            if (optionalFloatWrapper_ == null || value != 0F) {
+              OptionalFloatWrapper = value;
+            }
+            break;
+          }
+          case 1658: {
+            double? value = _single_optionalDoubleWrapper_codec.Read(input);
+            if (optionalDoubleWrapper_ == null || value != 0D) {
+              OptionalDoubleWrapper = value;
+            }
+            break;
+          }
+          case 1666: {
+            string value = _single_optionalStringWrapper_codec.Read(input);
+            if (optionalStringWrapper_ == null || value != "") {
+              OptionalStringWrapper = value;
+            }
+            break;
+          }
+          case 1674: {
+            pb::ByteString value = _single_optionalBytesWrapper_codec.Read(input);
+            if (optionalBytesWrapper_ == null || value != pb::ByteString.Empty) {
+              OptionalBytesWrapper = value;
+            }
+            break;
+          }
+          case 1690: {
+            repeatedBoolWrapper_.AddEntriesFrom(input, _repeated_repeatedBoolWrapper_codec);
+            break;
+          }
+          case 1698: {
+            repeatedInt32Wrapper_.AddEntriesFrom(input, _repeated_repeatedInt32Wrapper_codec);
+            break;
+          }
+          case 1706: {
+            repeatedInt64Wrapper_.AddEntriesFrom(input, _repeated_repeatedInt64Wrapper_codec);
+            break;
+          }
+          case 1714: {
+            repeatedUint32Wrapper_.AddEntriesFrom(input, _repeated_repeatedUint32Wrapper_codec);
+            break;
+          }
+          case 1722: {
+            repeatedUint64Wrapper_.AddEntriesFrom(input, _repeated_repeatedUint64Wrapper_codec);
+            break;
+          }
+          case 1730: {
+            repeatedFloatWrapper_.AddEntriesFrom(input, _repeated_repeatedFloatWrapper_codec);
+            break;
+          }
+          case 1738: {
+            repeatedDoubleWrapper_.AddEntriesFrom(input, _repeated_repeatedDoubleWrapper_codec);
+            break;
+          }
+          case 1746: {
+            repeatedStringWrapper_.AddEntriesFrom(input, _repeated_repeatedStringWrapper_codec);
+            break;
+          }
+          case 1754: {
+            repeatedBytesWrapper_.AddEntriesFrom(input, _repeated_repeatedBytesWrapper_codec);
+            break;
+          }
+          case 2410: {
+            if (optionalDuration_ == null) {
+              optionalDuration_ = new global::Google.Protobuf.WellKnownTypes.Duration();
+            }
+            input.ReadMessage(optionalDuration_);
+            break;
+          }
+          case 2418: {
+            if (optionalTimestamp_ == null) {
+              optionalTimestamp_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
+            }
+            input.ReadMessage(optionalTimestamp_);
+            break;
+          }
+          case 2426: {
+            if (optionalFieldMask_ == null) {
+              optionalFieldMask_ = new global::Google.Protobuf.WellKnownTypes.FieldMask();
+            }
+            input.ReadMessage(optionalFieldMask_);
+            break;
+          }
+          case 2434: {
+            if (optionalStruct_ == null) {
+              optionalStruct_ = new global::Google.Protobuf.WellKnownTypes.Struct();
+            }
+            input.ReadMessage(optionalStruct_);
+            break;
+          }
+          case 2442: {
+            if (optionalAny_ == null) {
+              optionalAny_ = new global::Google.Protobuf.WellKnownTypes.Any();
+            }
+            input.ReadMessage(optionalAny_);
+            break;
+          }
+          case 2450: {
+            if (optionalValue_ == null) {
+              optionalValue_ = new global::Google.Protobuf.WellKnownTypes.Value();
+            }
+            input.ReadMessage(optionalValue_);
+            break;
+          }
+          case 2490: {
+            repeatedDuration_.AddEntriesFrom(input, _repeated_repeatedDuration_codec);
+            break;
+          }
+          case 2498: {
+            repeatedTimestamp_.AddEntriesFrom(input, _repeated_repeatedTimestamp_codec);
+            break;
+          }
+          case 2506: {
+            repeatedFieldmask_.AddEntriesFrom(input, _repeated_repeatedFieldmask_codec);
+            break;
+          }
+          case 2522: {
+            repeatedAny_.AddEntriesFrom(input, _repeated_repeatedAny_codec);
+            break;
+          }
+          case 2530: {
+            repeatedValue_.AddEntriesFrom(input, _repeated_repeatedValue_codec);
+            break;
+          }
+          case 2594: {
+            repeatedStruct_.AddEntriesFrom(input, _repeated_repeatedStruct_codec);
+            break;
+          }
+          case 3208: {
+            Fieldname1 = input.ReadInt32();
+            break;
+          }
+          case 3216: {
+            FieldName2 = input.ReadInt32();
+            break;
+          }
+          case 3224: {
+            FieldName3 = input.ReadInt32();
+            break;
+          }
+          case 3232: {
+            FieldName4 = input.ReadInt32();
+            break;
+          }
+          case 3240: {
+            Field0Name5 = input.ReadInt32();
+            break;
+          }
+          case 3248: {
+            Field0Name6 = input.ReadInt32();
+            break;
+          }
+          case 3256: {
+            FieldName7 = input.ReadInt32();
+            break;
+          }
+          case 3264: {
+            FieldName8 = input.ReadInt32();
+            break;
+          }
+          case 3272: {
+            FieldName9 = input.ReadInt32();
+            break;
+          }
+          case 3280: {
+            FieldName10 = input.ReadInt32();
+            break;
+          }
+          case 3288: {
+            FIELDNAME11 = input.ReadInt32();
+            break;
+          }
+          case 3296: {
+            FIELDName12 = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the TestAllTypes message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum NestedEnum {
+        [pbr::OriginalName("FOO")] Foo = 0,
+        [pbr::OriginalName("BAR")] Bar = 1,
+        [pbr::OriginalName("BAZ")] Baz = 2,
+        /// <summary>
+        ///  Intentionally negative.
+        /// </summary>
+        [pbr::OriginalName("NEG")] Neg = -1,
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::IMessage<NestedMessage> {
+        private static readonly pb::MessageParser<NestedMessage> _parser = new pb::MessageParser<NestedMessage>(() => new NestedMessage());
+        public static pb::MessageParser<NestedMessage> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::Conformance.TestAllTypes.Descriptor.NestedTypes[0]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public NestedMessage() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public NestedMessage(NestedMessage other) : this() {
+          a_ = other.a_;
+          Corecursive = other.corecursive_ != null ? other.Corecursive.Clone() : null;
+        }
+
+        public NestedMessage Clone() {
+          return new NestedMessage(this);
+        }
+
+        /// <summary>Field number for the "a" field.</summary>
+        public const int AFieldNumber = 1;
+        private int a_;
+        public int A {
+          get { return a_; }
+          set {
+            a_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "corecursive" field.</summary>
+        public const int CorecursiveFieldNumber = 2;
+        private global::Conformance.TestAllTypes corecursive_;
+        public global::Conformance.TestAllTypes Corecursive {
+          get { return corecursive_; }
+          set {
+            corecursive_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as NestedMessage);
+        }
+
+        public bool Equals(NestedMessage other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (A != other.A) return false;
+          if (!object.Equals(Corecursive, other.Corecursive)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (A != 0) hash ^= A.GetHashCode();
+          if (corecursive_ != null) hash ^= Corecursive.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (A != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(A);
+          }
+          if (corecursive_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Corecursive);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (A != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(A);
+          }
+          if (corecursive_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Corecursive);
+          }
+          return size;
+        }
+
+        public void MergeFrom(NestedMessage other) {
+          if (other == null) {
+            return;
+          }
+          if (other.A != 0) {
+            A = other.A;
+          }
+          if (other.corecursive_ != null) {
+            if (corecursive_ == null) {
+              corecursive_ = new global::Conformance.TestAllTypes();
+            }
+            Corecursive.MergeFrom(other.Corecursive);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                A = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (corecursive_ == null) {
+                  corecursive_ = new global::Conformance.TestAllTypes();
+                }
+                input.ReadMessage(corecursive_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class ForeignMessage : pb::IMessage<ForeignMessage> {
+    private static readonly pb::MessageParser<ForeignMessage> _parser = new pb::MessageParser<ForeignMessage>(() => new ForeignMessage());
+    public static pb::MessageParser<ForeignMessage> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Conformance.ConformanceReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public ForeignMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public ForeignMessage(ForeignMessage other) : this() {
+      c_ = other.c_;
+    }
+
+    public ForeignMessage Clone() {
+      return new ForeignMessage(this);
+    }
+
+    /// <summary>Field number for the "c" field.</summary>
+    public const int CFieldNumber = 1;
+    private int c_;
+    public int C {
+      get { return c_; }
+      set {
+        c_ = value;
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as ForeignMessage);
+    }
+
+    public bool Equals(ForeignMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (C != other.C) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (C != 0) hash ^= C.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (C != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(C);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (C != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(C);
+      }
+      return size;
+    }
+
+    public void MergeFrom(ForeignMessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.C != 0) {
+        C = other.C;
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            C = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
   #endregion
 
 }
diff --git a/csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj b/csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj
index b654c0b..82f728d 100644
--- a/csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj
+++ b/csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj
@@ -1,14 +1,61 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <TargetFramework>netcoreapp1.0</TargetFramework>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{0607D1B8-80D6-4B35-9857-1263C1B32B94}</ProjectGuid>
     <OutputType>Exe</OutputType>
-    <IsPackable>False</IsPackable>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.Protobuf.Conformance</RootNamespace>
+    <AssemblyName>Google.Protobuf.Conformance</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
   </PropertyGroup>
-
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
   <ItemGroup>
-    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj" />
-    <ProjectReference Include="..\Google.Protobuf.Test\Google.Protobuf.Test.csproj" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="Microsoft.CSharp" />
   </ItemGroup>
-
-</Project>
+  <ItemGroup>
+    <Compile Include="Conformance.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj">
+      <Project>{6908bdce-d925-43f3-94ac-a531e6df2591}</Project>
+      <Name>Google.Protobuf</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Conformance/Program.cs b/csharp/src/Google.Protobuf.Conformance/Program.cs
index 96dc354..19827c4 100644
--- a/csharp/src/Google.Protobuf.Conformance/Program.cs
+++ b/csharp/src/Google.Protobuf.Conformance/Program.cs
@@ -48,7 +48,7 @@
             // This way we get the binary streams instead of readers/writers.
             var input = new BinaryReader(Console.OpenStandardInput());
             var output = new BinaryWriter(Console.OpenStandardOutput());
-            var typeRegistry = TypeRegistry.FromMessages(ProtobufTestMessages.Proto3.TestAllTypesProto3.Descriptor);
+            var typeRegistry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
 
             int count = 0;
             while (RunTest(input, output, typeRegistry))
@@ -81,31 +81,18 @@
 
         private static ConformanceResponse PerformRequest(ConformanceRequest request, TypeRegistry typeRegistry)
         {
-            ProtobufTestMessages.Proto3.TestAllTypesProto3 message;
+            TestAllTypes message;
             try
             {
                 switch (request.PayloadCase)
                 {
                     case ConformanceRequest.PayloadOneofCase.JsonPayload:
                         var parser = new JsonParser(new JsonParser.Settings(20, typeRegistry));
-                        message = parser.Parse<ProtobufTestMessages.Proto3.TestAllTypesProto3>(request.JsonPayload);
+                        message = parser.Parse<TestAllTypes>(request.JsonPayload);
                         break;
-                    case ConformanceRequest.PayloadOneofCase.ProtobufPayload: 
-                    {
-                        if (request.MessageType.Equals("protobuf_test_messages.proto3.TestAllTypesProto3"))
-                        {
-                            message = ProtobufTestMessages.Proto3.TestAllTypesProto3.Parser.ParseFrom(request.ProtobufPayload);
-                        }							
-                        else if (request.MessageType.Equals("protobuf_test_messages.proto2.TestAllTypesProto2")) 
-                        {
-                            return new ConformanceResponse { Skipped = "CSharp doesn't support proto2" };
-                        }
-                        else 
-                        {
-                            throw new Exception(" Protobuf request doesn't have specific payload type");
-                        }
+                    case ConformanceRequest.PayloadOneofCase.ProtobufPayload:
+                        message = TestAllTypes.Parser.ParseFrom(request.ProtobufPayload);
                         break;
-                    }
                     default:
                         throw new Exception("Unsupported request payload: " + request.PayloadCase);
                 }
diff --git a/csharp/src/Google.Protobuf.Conformance/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf.Conformance/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d22e90f
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Conformance/Properties/AssemblyInfo.cs
@@ -0,0 +1,48 @@
+#region Copyright notice and license
+// Protocol Buffers - Google's data interchange format
+// Copyright 2015 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.
+#endregion
+
+using System.Reflection;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Google.Protobuf.Conformance")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Google.Protobuf.Conformance")]
+[assembly: AssemblyCopyright("Copyright ©  2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+[assembly: AssemblyVersion("3.0.0.0")]
+[assembly: AssemblyFileVersion("3.0.0.0")]
diff --git a/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj b/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj
index 4eda641..ede1f77 100644
--- a/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj
+++ b/csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj
@@ -1,13 +1,68 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp1.0</TargetFramework>
-    <OutputType>Exe</OutputType>
-    <IsPackable>False</IsPackable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj" />
-  </ItemGroup>
-
-</Project>
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

+    <ProductVersion>9.0.30729</ProductVersion>

+    <SchemaVersion>2.0</SchemaVersion>

+    <ProjectGuid>{D7282E99-2DC3-405B-946F-177DB2FD2AE2}</ProjectGuid>

+    <OutputType>Exe</OutputType>

+    <AppDesignerFolder>Properties</AppDesignerFolder>

+    <RootNamespace>Google.Protobuf.JsonDump</RootNamespace>

+    <AssemblyName>Google.Protobuf.JsonDump</AssemblyName>

+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

+    <FileAlignment>512</FileAlignment>

+    <TargetFrameworkProfile>

+    </TargetFrameworkProfile>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

+    <DebugSymbols>true</DebugSymbols>

+    <DebugType>full</DebugType>

+    <Optimize>false</Optimize>

+    <OutputPath>bin\Debug</OutputPath>

+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>

+    <DefineConstants>DEBUG;TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\Release</OutputPath>

+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>

+    <DefineConstants>TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+  </PropertyGroup>

+  <ItemGroup>

+    <Reference Include="mscorlib" />

+    <Reference Include="System" />

+  </ItemGroup>

+  <ItemGroup>

+    <Compile Include="Program.cs" />

+    <Compile Include="Properties\AssemblyInfo.cs" />

+  </ItemGroup>

+  <ItemGroup>

+    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj">

+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>

+      <Name>Google.Protobuf</Name>

+    </ProjectReference>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="app.config" />

+  </ItemGroup>

+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+       Other similar extension points exist, see Microsoft.Common.targets.

+  <Target Name="BeforeBuild">

+  </Target>

+  <Target Name="AfterBuild">

+  </Target>

+  -->

+</Project>
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.JsonDump/Program.cs b/csharp/src/Google.Protobuf.JsonDump/Program.cs
index 296b2f3..99e60e9 100644
--- a/csharp/src/Google.Protobuf.JsonDump/Program.cs
+++ b/csharp/src/Google.Protobuf.JsonDump/Program.cs
@@ -32,7 +32,6 @@
 

 using System;

 using System.IO;

-using System.Reflection;

 

 namespace Google.Protobuf.ProtoDump

 {

@@ -56,7 +55,7 @@
                 Console.Error.WriteLine("Unable to load type {0}.", args[0]);

                 return 1;

             }

-            if (!typeof(IMessage).GetTypeInfo().IsAssignableFrom(type))

+            if (!typeof(IMessage).IsAssignableFrom(type))

             {

                 Console.Error.WriteLine("Type {0} doesn't implement IMessage.", args[0]);

                 return 1;

diff --git a/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d980b01
--- /dev/null
+++ b/csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs
@@ -0,0 +1,19 @@
+using System.Reflection;

+using System.Runtime.CompilerServices;

+using System.Runtime.InteropServices;

+

+// General Information about an assembly is controlled through the following 

+// set of attributes. Change these attribute values to modify the information

+// associated with an assembly.

+

+[assembly: AssemblyTitle("ProtoDump")]

+[assembly: AssemblyDescription("")]

+[assembly: AssemblyConfiguration("")]

+[assembly: AssemblyCompany("")]

+[assembly: AssemblyProduct("ProtoDump")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

+[assembly: AssemblyTrademark("")]

+[assembly: AssemblyCulture("")]

+

+[assembly: AssemblyVersion("3.0.0.0")]

+[assembly: AssemblyFileVersion("3.0.0.0")]

diff --git a/csharp/src/Google.Protobuf.JsonDump/app.config b/csharp/src/Google.Protobuf.JsonDump/app.config
new file mode 100644
index 0000000..51278a4
--- /dev/null
+++ b/csharp/src/Google.Protobuf.JsonDump/app.config
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
diff --git a/csharp/src/Google.Protobuf.Test/ByteStringTest.cs b/csharp/src/Google.Protobuf.Test/ByteStringTest.cs
old mode 100755
new mode 100644
index afdd491..685e130
--- a/csharp/src/Google.Protobuf.Test/ByteStringTest.cs
+++ b/csharp/src/Google.Protobuf.Test/ByteStringTest.cs
@@ -33,10 +33,6 @@
 using System;

 using System.Text;

 using NUnit.Framework;

-using System.IO;

-#if !NET35

-using System.Threading.Tasks;

-#endif

 

 namespace Google.Protobuf

 {

@@ -171,67 +167,5 @@
             // Optimization which also fixes issue 61.

             Assert.AreSame(ByteString.Empty, ByteString.FromBase64(""));

         }

-

-        [Test]

-        public void FromStream_Seekable()

-        {

-            var stream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5 });

-            // Consume the first byte, just to test that it's "from current position"

-            stream.ReadByte();

-            var actual = ByteString.FromStream(stream);

-            ByteString expected = ByteString.CopyFrom(2, 3, 4, 5);

-            Assert.AreEqual(expected, actual, $"{expected.ToBase64()} != {actual.ToBase64()}");

-        }

-

-        [Test]

-        public void FromStream_NotSeekable()

-        {

-            var stream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5 });

-            // Consume the first byte, just to test that it's "from current position"

-            stream.ReadByte();

-            // Wrap the original stream in LimitedInputStream, which has CanSeek=false

-            var limitedStream = new LimitedInputStream(stream, 3);

-            var actual = ByteString.FromStream(limitedStream);

-            ByteString expected = ByteString.CopyFrom(2, 3, 4);

-            Assert.AreEqual(expected, actual, $"{expected.ToBase64()} != {actual.ToBase64()}");

-        }

-

-#if !NET35

-        [Test]

-        public async Task FromStreamAsync_Seekable()

-        {

-            var stream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5 });

-            // Consume the first byte, just to test that it's "from current position"

-            stream.ReadByte();

-            var actual = await ByteString.FromStreamAsync(stream);

-            ByteString expected = ByteString.CopyFrom(2, 3, 4, 5);

-            Assert.AreEqual(expected, actual, $"{expected.ToBase64()} != {actual.ToBase64()}");

-        }

-

-        [Test]

-        public async Task FromStreamAsync_NotSeekable()

-        {

-            var stream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5 });

-            // Consume the first byte, just to test that it's "from current position"

-            stream.ReadByte();

-            // Wrap the original stream in LimitedInputStream, which has CanSeek=false

-            var limitedStream = new LimitedInputStream(stream, 3);

-            var actual = await ByteString.FromStreamAsync(limitedStream);

-            ByteString expected = ByteString.CopyFrom(2, 3, 4);

-            Assert.AreEqual(expected, actual, $"{expected.ToBase64()} != {actual.ToBase64()}");

-        }

-#endif

-

-        [Test]

-        public void GetHashCode_Regression()

-        {

-            // We used to have an awful hash algorithm where only the last four

-            // bytes were relevant. This is a regression test for

-            // https://github.com/google/protobuf/issues/2511

-

-            ByteString b1 = ByteString.CopyFrom(100, 1, 2, 3, 4);

-            ByteString b2 = ByteString.CopyFrom(200, 1, 2, 3, 4);

-            Assert.AreNotEqual(b1.GetHashCode(), b2.GetHashCode());

-        }

     }

 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
index e7c6b80..c0a9ffd 100644
--- a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
@@ -284,20 +284,6 @@
             Assert.Throws<InvalidProtocolBufferException>(() => input.ReadBytes());

         }

 

-        // Representations of a tag for field 0 with various wire types

-        [Test]

-        [TestCase(0)]

-        [TestCase(1)]

-        [TestCase(2)]

-        [TestCase(3)]

-        [TestCase(4)]

-        [TestCase(5)]

-        public void ReadTag_ZeroFieldRejected(byte tag)

-        {

-            CodedInputStream cis = new CodedInputStream(new byte[] { tag });

-            Assert.Throws<InvalidProtocolBufferException>(() => cis.ReadTag());

-        }

-

         internal static TestRecursiveMessage MakeRecursiveMessage(int depth)

         {

             if (depth == 0)

@@ -417,7 +403,7 @@
                 output.Flush();

 

                 ms.Position = 0;

-                CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2], 0, 0, false);

+                CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2], 0, 0);

 

                 uint tag = input.ReadTag();

                 Assert.AreEqual(1, WireFormat.GetTagFieldNumber(tag));

@@ -608,12 +594,5 @@
             }

             Assert.IsTrue(memoryStream.CanRead); // We left the stream open

         }

-

-        [Test]

-        public void Dispose_FromByteArray()

-        {

-            var stream = new CodedInputStream(new byte[10]);

-            stream.Dispose();

-        }

     }

 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
index 98cabd5..48bf6d6 100644
--- a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
@@ -334,7 +334,7 @@
             }

             // Now test Input stream:

             {

-                CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50], 0, 0, false);

+                CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50], 0, 0);

                 Assert.AreEqual(0, cin.Position);

                 // Field 1:

                 uint tag = cin.ReadTag();

@@ -415,12 +415,5 @@
             Assert.AreEqual(1, memoryStream.Position); // Flushed data from CodedOutputStream to MemoryStream

             Assert.IsTrue(memoryStream.CanWrite); // We left the stream open

         }

-

-        [Test]

-        public void Dispose_FromByteArray()

-        {

-            var stream = new CodedOutputStream(new byte[10]);

-            stream.Dispose();

-        }

     }

 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs b/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
index 8791dff..9c84590 100644
--- a/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
@@ -499,14 +499,6 @@
         }
 
         [Test]
-        public void KeysCopyTo()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            var keys = map.Keys.ToArray(); // Uses CopyTo internally
-            CollectionAssert.AreEquivalent(new[] { "foo", "x" }, keys);
-        }
-
-        [Test]
         public void ValuesContains()
         {
             var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
@@ -519,14 +511,6 @@
         }
 
         [Test]
-        public void ValuesCopyTo()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            var values = map.Values.ToArray(); // Uses CopyTo internally
-            CollectionAssert.AreEquivalent(new[] { "bar", "y" }, values);
-        }
-
-        [Test]
         public void ToString_StringToString()
         {
             var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
@@ -540,65 +524,6 @@
             Assert.Throws<ArgumentException>(() => map.ToString());
         }
 
-        [Test]
-        public void NaNValuesComparedBitwise()
-        {
-            var map1 = new MapField<string, double>
-            {
-                { "x", SampleNaNs.Regular },
-                { "y", SampleNaNs.SignallingFlipped }
-            };
-
-            var map2 = new MapField<string, double>
-            {
-                { "x", SampleNaNs.Regular },
-                { "y", SampleNaNs.PayloadFlipped }
-            };
-
-            var map3 = new MapField<string, double>
-            {
-                { "x", SampleNaNs.Regular },
-                { "y", SampleNaNs.SignallingFlipped }
-            };
-
-            EqualityTester.AssertInequality(map1, map2);
-            EqualityTester.AssertEquality(map1, map3);
-            Assert.True(map1.Values.Contains(SampleNaNs.SignallingFlipped));
-            Assert.False(map2.Values.Contains(SampleNaNs.SignallingFlipped));
-        }
-
-        // This wouldn't usually happen, as protos can't use doubles as map keys,
-        // but let's be consistent.
-        [Test]
-        public void NaNKeysComparedBitwise()
-        {
-            var map = new MapField<double, string>
-            {
-                { SampleNaNs.Regular, "x" },
-                { SampleNaNs.SignallingFlipped, "y" }
-            };
-            Assert.AreEqual("x", map[SampleNaNs.Regular]);
-            Assert.AreEqual("y", map[SampleNaNs.SignallingFlipped]);
-            string ignored;
-            Assert.False(map.TryGetValue(SampleNaNs.PayloadFlipped, out ignored));
-        }
-
-#if !NET35
-        [Test]
-        public void IDictionaryKeys_Equals_IReadOnlyDictionaryKeys()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            CollectionAssert.AreEquivalent(((IDictionary<string, string>)map).Keys, ((IReadOnlyDictionary<string, string>)map).Keys);
-        }
-
-        [Test]
-        public void IDictionaryValues_Equals_IReadOnlyDictionaryValues()
-        {
-            var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
-            CollectionAssert.AreEquivalent(((IDictionary<string, string>)map).Values, ((IReadOnlyDictionary<string, string>)map).Values);
-        }
-#endif
-
         private static KeyValuePair<TKey, TValue> NewKeyValuePair<TKey, TValue>(TKey key, TValue value)
         {
             return new KeyValuePair<TKey, TValue>(key, value);
diff --git a/csharp/src/Google.Protobuf.Test/Collections/ProtobufEqualityComparersTest.cs b/csharp/src/Google.Protobuf.Test/Collections/ProtobufEqualityComparersTest.cs
deleted file mode 100644
index c76d7ca..0000000
--- a/csharp/src/Google.Protobuf.Test/Collections/ProtobufEqualityComparersTest.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using NUnit.Framework;
-using System.Collections.Generic;
-using System.Linq;
-using static Google.Protobuf.Collections.ProtobufEqualityComparers;
-
-namespace Google.Protobuf.Collections
-{
-    public class ProtobufEqualityComparersTest
-    {
-        private static readonly double[] doubles =
-        {
-            0,
-            1,
-            1.5,
-            -1.5,
-            double.PositiveInfinity,
-            double.NegativeInfinity,
-            // Three different types of NaN...
-            SampleNaNs.Regular,
-            SampleNaNs.SignallingFlipped,
-            SampleNaNs.PayloadFlipped
-        };
-
-        [Test]
-        public void GetEqualityComparer_Default()
-        {
-            // It's more pain than it's worth to try to parameterize these tests.
-            Assert.AreSame(EqualityComparer<object>.Default, GetEqualityComparer<object>());
-            Assert.AreSame(EqualityComparer<string>.Default, GetEqualityComparer<string>());
-            Assert.AreSame(EqualityComparer<int>.Default, GetEqualityComparer<int>());
-            Assert.AreSame(EqualityComparer<int?>.Default, GetEqualityComparer<int?>());
-        }
-
-        [Test]
-        public void GetEqualityComparer_NotDefault()
-        {
-            // It's more pain than it's worth to try to parameterize these tests.
-            Assert.AreSame(BitwiseDoubleEqualityComparer, GetEqualityComparer<double>());
-            Assert.AreSame(BitwiseSingleEqualityComparer, GetEqualityComparer<float>());
-            Assert.AreSame(BitwiseNullableDoubleEqualityComparer, GetEqualityComparer<double?>());
-            Assert.AreSame(BitwiseNullableSingleEqualityComparer, GetEqualityComparer<float?>());
-        }
-
-        [Test]
-        public void DoubleComparisons()
-        {
-            ValidateEqualityComparer(BitwiseDoubleEqualityComparer, doubles);
-        }
-
-        [Test]
-        public void NullableDoubleComparisons()
-        {
-            ValidateEqualityComparer(BitwiseNullableDoubleEqualityComparer, doubles.Select(d => (double?) d).Concat(new double?[] { null }));
-        }
-
-        [Test]
-        public void SingleComparisons()
-        {
-            ValidateEqualityComparer(BitwiseSingleEqualityComparer, doubles.Select(d => (float) d));
-        }
-
-        [Test]
-        public void NullableSingleComparisons()
-        {
-            ValidateEqualityComparer(BitwiseNullableSingleEqualityComparer, doubles.Select(d => (float?) d).Concat(new float?[] { null }));
-        }
-
-        private static void ValidateEqualityComparer<T>(EqualityComparer<T> comparer, IEnumerable<T> values)
-        {
-            var array = values.ToArray();
-            // Each value should be equal to itself, but not to any other value.
-            for (int i = 0; i < array.Length; i++)
-            {
-                for (int j = 0; j < array.Length; j++)
-                {
-                    if (i == j)
-                    {
-                        Assert.IsTrue(comparer.Equals(array[i], array[j]),
-                            "{0} should be equal to itself", array[i], array[j]);
-                    }
-                    else
-                    {
-                        Assert.IsFalse(comparer.Equals(array[i], array[j]),
-                            "{0} and {1} should not be equal", array[i], array[j]);
-                        Assert.AreNotEqual(comparer.GetHashCode(array[i]), comparer.GetHashCode(array[j]),
-                            "Hash codes for {0} and {1} should not be equal", array[i], array[j]);
-                    }
-                }
-            }
-        }
-    }    
-}
diff --git a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
index 129923b..8ed54cf 100644
--- a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
@@ -75,96 +75,10 @@
         }
 
         [Test]
-        public void AddRange_SlowPath()
-        {
-            var list = new RepeatedField<string>();
-            list.AddRange(new[] { "foo", "bar" }.Select(x => x));
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual("foo", list[0]);
-            Assert.AreEqual("bar", list[1]);
-        }
-
-        [Test]
-        public void AddRange_SlowPath_NullsProhibited_ReferenceType()
-        {
-            var list = new RepeatedField<string>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new[] { "foo", null }.Select(x => x)));
-        }
-
-        [Test]
-        public void AddRange_SlowPath_NullsProhibited_NullableValueType()
-        {
-            var list = new RepeatedField<int?>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new[] { 20, (int?)null }.Select(x => x)));
-        }
-
-        [Test]
-        public void AddRange_Optimized_NonNullableValueType()
-        {
-            var list = new RepeatedField<int>();
-            list.AddRange(new List<int> { 20, 30 });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual(20, list[0]);
-            Assert.AreEqual(30, list[1]);
-        }
-
-        [Test]
-        public void AddRange_Optimized_ReferenceType()
-        {
-            var list = new RepeatedField<string>();
-            list.AddRange(new List<string> { "foo", "bar" });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual("foo", list[0]);
-            Assert.AreEqual("bar", list[1]);
-        }
-
-        [Test]
-        public void AddRange_Optimized_NullableValueType()
-        {
-            var list = new RepeatedField<int?>();
-            list.AddRange(new List<int?> { 20, 30 });
-            Assert.AreEqual(2, list.Count);
-            Assert.AreEqual((int?) 20, list[0]);
-            Assert.AreEqual((int?) 30, list[1]);
-        }
-
-        [Test]
-        public void AddRange_Optimized_NullsProhibited_ReferenceType()
-        {
-            // We don't just trust that a collection with a nullable element type doesn't contain nulls
-            var list = new RepeatedField<string>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new List<string> { "foo", null }));
-        }
-
-        [Test]
-        public void AddRange_Optimized_NullsProhibited_NullableValueType()
-        {
-            // We don't just trust that a collection with a nullable element type doesn't contain nulls
-            var list = new RepeatedField<int?>();
-            // It's okay for this to throw ArgumentNullException if necessary.
-            // It's not ideal, but not awful.
-            Assert.Catch<ArgumentException>(() => list.AddRange(new List<int?> { 20, null }));
-        }
-
-        [Test]
-        public void AddRange_AlreadyNotEmpty()
-        {
-            var list = new RepeatedField<int> { 1, 2, 3 };
-            list.AddRange(new List<int> { 4, 5, 6 });
-            CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, list);
-        }
-
-        [Test]
-        public void AddRange_RepeatedField()
+        public void Add_RepeatedField()
         {
             var list = new RepeatedField<string> { "original" };
-            list.AddRange(new RepeatedField<string> { "foo", "bar" });
+            list.Add(new RepeatedField<string> { "foo", "bar" });
             Assert.AreEqual(3, list.Count);
             Assert.AreEqual("original", list[0]);
             Assert.AreEqual("foo", list[1]);
@@ -742,18 +656,5 @@
             var text = list.ToString();
             Assert.AreEqual(text, "[ { \"foo\": 20 } ]", message.ToString());
         }
-
-        [Test]
-        public void NaNValuesComparedBitwise()
-        {
-            var list1 = new RepeatedField<double> { SampleNaNs.Regular, SampleNaNs.SignallingFlipped };
-            var list2 = new RepeatedField<double> { SampleNaNs.Regular, SampleNaNs.PayloadFlipped };
-            var list3 = new RepeatedField<double> { SampleNaNs.Regular, SampleNaNs.SignallingFlipped };
-
-            EqualityTester.AssertInequality(list1, list2);
-            EqualityTester.AssertEquality(list1, list3);
-            Assert.True(list1.Contains(SampleNaNs.SignallingFlipped));
-            Assert.False(list2.Contains(SampleNaNs.SignallingFlipped));
-        }
     }
 }
diff --git a/csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs b/csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs
deleted file mode 100755
index 48c0725..0000000
--- a/csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-#if NET35
-using System;
-using System.IO;
-using NUnit.Framework;
-using Google.Protobuf.Compatibility;
-
-namespace Google.Protobuf.Test.Compatibility
-{
-    public class StreamExtensionsTest
-    {
-        [Test]
-        public void CopyToNullArgument()
-        {
-            var memoryStream = new MemoryStream();
-            Assert.Throws<ArgumentNullException>(() => memoryStream.CopyTo(null));
-        }
-
-        [Test]
-        public void CopyToTest()
-        {
-            byte[] bytesToStream = new byte[] { 0x31, 0x08, 0xFF, 0x00 };
-            Stream source = new MemoryStream(bytesToStream);
-            Stream destination = new MemoryStream((int)source.Length);
-            source.CopyTo(destination);
-            destination.Seek(0, SeekOrigin.Begin);
-
-            Assert.AreEqual(0x31, destination.ReadByte());
-            Assert.AreEqual(0x08, destination.ReadByte());
-            Assert.AreEqual(0xFF, destination.ReadByte());
-            Assert.AreEqual(0x00, destination.ReadByte());
-            Assert.AreEqual(-1, destination.ReadByte());
-        }
-    }
-}
-#endif
diff --git a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
old mode 100755
new mode 100644
index abbe3c9..f0c8d3b
--- a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
@@ -34,7 +34,6 @@
 using System.Collections.Generic;
 using System.Reflection;
 
-#if !NET35
 namespace Google.Protobuf.Compatibility
 {
     public class TypeExtensionsTest
@@ -52,6 +51,24 @@
         }
 
         [Test]
+        [TestCase(typeof(int), true)]
+        [TestCase(typeof(int?), true)]
+        [TestCase(typeof(Nullable<>), true)]
+        [TestCase(typeof(WireFormat.WireType), true)]
+        [TestCase(typeof(string), false)]
+        [TestCase(typeof(object), false)]
+        [TestCase(typeof(Enum), false)]
+        [TestCase(typeof(ValueType), false)]
+        [TestCase(typeof(TypeExtensionsTest), false)]
+        [TestCase(typeof(Action), false)]
+        [TestCase(typeof(Action<>), false)]
+        [TestCase(typeof(IDisposable), false)]
+        public void IsValueType(Type type, bool expected)
+        {
+            Assert.AreEqual(expected, TypeExtensions.IsValueType(type));
+        }
+
+        [Test]
         [TestCase(typeof(object), typeof(string), true)]
         [TestCase(typeof(object), typeof(int), true)]
         [TestCase(typeof(string), typeof(string), true)]
@@ -114,4 +131,3 @@
         }
     }
 }
-#endif
diff --git a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
old mode 100755
new mode 100644
index 7764116..c616470
--- a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
+++ b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
@@ -32,7 +32,6 @@
 
 using System.Collections.Generic;
 using System.IO;
-using System.Reflection;
 using Google.Protobuf.TestProtos;
 using NUnit.Framework;
 
@@ -158,18 +157,15 @@
             {
                 // WriteTagAndValue ignores default values
                 var stream = new MemoryStream();
-                CodedOutputStream codedOutput;

-#if !NET35
-                codedOutput = new CodedOutputStream(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, codec.DefaultValue);
                 codedOutput.Flush();
                 Assert.AreEqual(0, stream.Position);
                 Assert.AreEqual(0, codec.CalculateSizeWithTag(codec.DefaultValue));
-                if (typeof(T).GetTypeInfo().IsValueType)
+                if (typeof(T).IsValueType)
                 {
                     Assert.AreEqual(default(T), codec.DefaultValue);
                 }
-#endif
 
                 // The plain ValueWriter/ValueReader delegates don't.
                 if (codec.DefaultValue != null) // This part isn't appropriate for message types.
diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
index 5694754..8b153d6 100644
--- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
@@ -638,7 +638,7 @@
         }

 

         [Test]

-        public void DiscardUnknownFields_RealDataStillRead()

+        public void IgnoreUnknownFields_RealDataStillRead()

         {

             var message = SampleMessages.CreateFullTestAllTypes();

             var stream = new MemoryStream();

@@ -652,18 +652,16 @@
 

             stream.Position = 0;

             var parsed = TestAllTypes.Parser.ParseFrom(stream);

-            // TODO(jieluo): Add test back when DiscardUnknownFields API is supported.

-            // Assert.AreEqual(message, parsed);

+            Assert.AreEqual(message, parsed);

         }

 

         [Test]

-        public void DiscardUnknownFields_AllTypes()

+        public void IgnoreUnknownFields_AllTypes()

         {

             // Simple way of ensuring we can skip all kinds of fields.

             var data = SampleMessages.CreateFullTestAllTypes().ToByteArray();

             var empty = Empty.Parser.ParseFrom(data);

-            // TODO(jieluo): Add test back when DiscardUnknownFields API is supported.

-            // Assert.AreNotEqual(new Empty(), empty);

+            Assert.AreEqual(new Empty(), empty);

         }

 

         // This was originally seen as a conformance test failure.

@@ -721,16 +719,5 @@
             JsonFormatter.Default.Format(message, writer);

             Assert.AreEqual("{ \"c\": 31 }", writer.ToString());

         }

-

-        [Test]

-        public void NaNComparisons()

-        {

-            var message1 = new TestAllTypes { SingleDouble = SampleNaNs.Regular };

-            var message2 = new TestAllTypes { SingleDouble = SampleNaNs.PayloadFlipped };

-            var message3 = new TestAllTypes { SingleDouble = SampleNaNs.Regular };

-

-            EqualityTester.AssertInequality(message1, message2);

-            EqualityTester.AssertEquality(message1, message3);

-        }

     }

 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj b/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
index 06d07b9..4f37c5e 100644
--- a/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+++ b/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
@@ -1,30 +1,143 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>Exe</OutputType>
-    <TargetFrameworks>net451;netcoreapp1.0</TargetFrameworks>
-    <AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
-    <SignAssembly>true</SignAssembly>
-    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
-    <IsPackable>False</IsPackable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="NUnit" Version="3.6.1" />
-    <PackageReference Include="NUnitLite" Version="3.6.1" />
-  </ItemGroup>
-
-  <!-- 
-    - Override target frameworks on non-Windows to just .NET Core
-    - Doing this conditionally in the initial PropertyGroup confuses
-    - Visual Studio.
-    -->
-  <PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
-    <TargetFrameworks>netcoreapp1.0</TargetFrameworks>
-  </PropertyGroup>
-  
-</Project>
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

+    <ProductVersion>9.0.30729</ProductVersion>

+    <SchemaVersion>2.0</SchemaVersion>

+    <ProjectGuid>{DD01ED24-3750-4567-9A23-1DB676A15610}</ProjectGuid>

+    <OutputType>Library</OutputType>

+    <AppDesignerFolder>Properties</AppDesignerFolder>

+    <RootNamespace>Google.Protobuf</RootNamespace>

+    <AssemblyName>Google.Protobuf.Test</AssemblyName>

+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

+    <FileAlignment>512</FileAlignment>

+    <OldToolsVersion>3.5</OldToolsVersion>

+    <TargetFrameworkProfile>

+    </TargetFrameworkProfile>

+    <NuGetPackageImportStamp>

+    </NuGetPackageImportStamp>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

+    <DebugSymbols>true</DebugSymbols>

+    <DebugType>full</DebugType>

+    <Optimize>false</Optimize>

+    <OutputPath>bin\Debug</OutputPath>

+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>

+    <DefineConstants>DEBUG;TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\Release</OutputPath>

+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>

+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\ReleaseSigned</OutputPath>

+    <IntermediateOutputPath>obj\ReleaseSigned\</IntermediateOutputPath>

+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <Prefer32Bit>false</Prefer32Bit>

+    <SignAssembly>True</SignAssembly>

+    <AssemblyOriginatorKeyFile>..\..\keys\Google.Protobuf.snk</AssemblyOriginatorKeyFile>

+  </PropertyGroup>

+  <ItemGroup>

+    <Reference Include="mscorlib" />

+    <Reference Include="nunit.core, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">

+      <HintPath>..\packages\NUnitTestAdapter.2.0.0\lib\nunit.core.dll</HintPath>

+      <Private>True</Private>

+    </Reference>

+    <Reference Include="nunit.core.interfaces, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">

+      <HintPath>..\packages\NUnitTestAdapter.2.0.0\lib\nunit.core.interfaces.dll</HintPath>

+      <Private>True</Private>

+    </Reference>

+    <Reference Include="nunit.framework, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">

+      <HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>

+      <Private>True</Private>

+    </Reference>

+    <Reference Include="nunit.util, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">

+      <HintPath>..\packages\NUnitTestAdapter.2.0.0\lib\nunit.util.dll</HintPath>

+      <Private>True</Private>

+    </Reference>

+    <Reference Include="NUnit.VisualStudio.TestAdapter, Version=2.0.0.0, Culture=neutral, PublicKeyToken=4cb40d35494691ac, processorArchitecture=MSIL">

+      <HintPath>..\packages\NUnitTestAdapter.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll</HintPath>

+      <Private>True</Private>

+    </Reference>

+    <Reference Include="System" />

+    <Reference Include="System.Xml" />

+  </ItemGroup>

+  <ItemGroup>

+    <Compile Include="ByteStringTest.cs" />

+    <Compile Include="CodedInputStreamExtensions.cs" />

+    <Compile Include="CodedInputStreamTest.cs" />

+    <Compile Include="CodedOutputStreamTest.cs" />

+    <Compile Include="Compatibility\PropertyInfoExtensionsTest.cs" />

+    <Compile Include="Compatibility\TypeExtensionsTest.cs" />

+    <Compile Include="EqualityTester.cs" />

+    <Compile Include="FieldCodecTest.cs" />

+    <Compile Include="GeneratedMessageTest.cs" />

+    <Compile Include="Collections\MapFieldTest.cs" />

+    <Compile Include="Collections\RepeatedFieldTest.cs" />

+    <Compile Include="JsonFormatterTest.cs" />

+    <Compile Include="JsonParserTest.cs" />

+    <Compile Include="JsonTokenizerTest.cs" />

+    <Compile Include="Reflection\DescriptorsTest.cs" />

+    <Compile Include="Reflection\FieldAccessTest.cs" />

+    <Compile Include="Reflection\TypeRegistryTest.cs" />

+    <Compile Include="SampleEnum.cs" />

+    <Compile Include="SampleMessages.cs" />

+    <Compile Include="TestProtos\ForeignMessagePartial.cs" />

+    <Compile Include="TestProtos\MapUnittestProto3.cs" />

+    <Compile Include="TestProtos\UnittestImportProto3.cs" />

+    <Compile Include="TestProtos\UnittestImportPublicProto3.cs" />

+    <Compile Include="TestProtos\UnittestIssues.cs" />

+    <Compile Include="TestProtos\UnittestProto3.cs" />

+    <Compile Include="DeprecatedMemberTest.cs" />

+    <Compile Include="IssuesTest.cs" />

+    <Compile Include="Properties\AssemblyInfo.cs" />

+    <Compile Include="TestCornerCases.cs" />

+    <Compile Include="TestProtos\UnittestWellKnownTypes.cs" />

+    <Compile Include="WellKnownTypes\AnyTest.cs" />

+    <Compile Include="WellKnownTypes\DurationTest.cs" />

+    <Compile Include="WellKnownTypes\FieldMaskTest.cs" />

+    <Compile Include="WellKnownTypes\TimestampTest.cs" />

+    <Compile Include="WellKnownTypes\WrappersTest.cs" />

+  </ItemGroup>

+  <ItemGroup>

+    <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj">

+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>

+      <Name>Google.Protobuf</Name>

+    </ProjectReference>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="packages.config" />

+  </ItemGroup>

+  <ItemGroup>

+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />

+  </ItemGroup>

+  <ItemGroup />

+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+       Other similar extension points exist, see Microsoft.Common.targets.

+  <Target Name="BeforeBuild">

+  </Target>

+  <Target Name="AfterBuild">

+  </Target>

+  -->

+</Project>
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/IssuesTest.cs b/csharp/src/Google.Protobuf.Test/IssuesTest.cs
index 2caf80a..a38d6b0 100644
--- a/csharp/src/Google.Protobuf.Test/IssuesTest.cs
+++ b/csharp/src/Google.Protobuf.Test/IssuesTest.cs
@@ -33,7 +33,7 @@
 using Google.Protobuf.Reflection;

 using UnitTest.Issues.TestProtos;

 using NUnit.Framework;

-using static UnitTest.Issues.TestProtos.OneofMerging.Types;

+

 

 namespace Google.Protobuf

 {

@@ -78,17 +78,5 @@
             Assert.AreEqual("{ \"name\": \"test\", \"desc\": \"test2\", \"exid\": \"test3\" }",

                 JsonFormatter.Default.Format(message));

         }

-

-        [Test]

-        public void OneofMerging()

-        {

-            var message1 = new OneofMerging { Nested = new Nested { X = 10 } };

-            var message2 = new OneofMerging { Nested = new Nested { Y = 20 } };

-            var expected = new OneofMerging { Nested = new Nested { X = 10, Y = 20 } };

-

-            var merged = message1.Clone();

-            merged.MergeFrom(message2);

-            Assert.AreEqual(expected, merged);

-        }

     }

 }

diff --git a/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs b/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs
index 1c7a8cd..827a759 100644
--- a/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs
+++ b/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs
@@ -38,8 +38,6 @@
 using Google.Protobuf.Reflection;
 
 using static Google.Protobuf.JsonParserTest; // For WrapInQuotes
-using System.IO;
-using Google.Protobuf.Collections;
 
 namespace Google.Protobuf
 {
@@ -52,7 +50,7 @@
         [Test]
         public void DefaultValues_WhenOmitted()
         {
-            var formatter = JsonFormatter.Default;
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(formatDefaultValues: false));
 
             AssertJson("{ }", formatter.Format(new ForeignMessage()));
             AssertJson("{ }", formatter.Format(new TestAllTypes()));
@@ -62,40 +60,11 @@
         [Test]
         public void DefaultValues_WhenIncluded()
         {
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatDefaultValues(true));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(formatDefaultValues: true));
             AssertJson("{ 'c': 0 }", formatter.Format(new ForeignMessage()));
         }
 
         [Test]
-        public void EnumAllowAlias()
-        {
-            var message = new TestEnumAllowAlias
-            {
-                Value = TestEnumWithDupValue.Foo2,
-            };
-            var actualText = JsonFormatter.Default.Format(message);
-            var expectedText = "{ 'value': 'FOO1' }";
-            AssertJson(expectedText, actualText);
-        }
-
-        [Test]
-        public void EnumAsInt()
-        {
-            var message = new TestAllTypes
-            {
-                SingleForeignEnum = ForeignEnum.ForeignBar,
-                RepeatedForeignEnum = { ForeignEnum.ForeignBaz, (ForeignEnum) 100, ForeignEnum.ForeignFoo }
-            };
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatEnumsAsIntegers(true));
-            var actualText = formatter.Format(message);
-            var expectedText = "{ " +
-                               "'singleForeignEnum': 5, " +
-                               "'repeatedForeignEnum': [ 6, 100, 4 ]" +
-                               " }";
-            AssertJson(expectedText, actualText);
-        }
-
-        [Test]
         public void AllSingleFields()
         {
             var message = new TestAllTypes
@@ -258,16 +227,10 @@
         [Test]
         [TestCase("foo_bar", "fooBar")]
         [TestCase("bananaBanana", "bananaBanana")]
-        [TestCase("BANANABanana", "BANANABanana")]
-        [TestCase("simple", "simple")]
-        [TestCase("ACTION_AND_ADVENTURE", "ACTIONANDADVENTURE")]
-        [TestCase("action_and_adventure", "actionAndAdventure")]
-        [TestCase("kFoo", "kFoo")]
-        [TestCase("HTTPServer", "HTTPServer")]
-        [TestCase("CLIENT", "CLIENT")]
-        public void ToJsonName(string original, string expected)
+        [TestCase("BANANABanana", "bananaBanana")]
+        public void ToCamelCase(string original, string expected)
         {
-            Assert.AreEqual(expected, JsonFormatter.ToJsonName(original));
+            Assert.AreEqual(expected, JsonFormatter.ToCamelCase(original));
         }
 
         [Test]
@@ -283,9 +246,9 @@
             }
 
             // We should get the same result both with and without "format default values".
-            var formatter = JsonFormatter.Default;
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(false));
             AssertJson(expectedJson, formatter.Format(message));
-            formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatDefaultValues(true));
+            formatter = new JsonFormatter(new JsonFormatter.Settings(true));
             AssertJson(expectedJson, formatter.Format(message));
         }
 
@@ -317,7 +280,7 @@
         {
             // The actual JSON here is very large because there are lots of fields. Just test a couple of them.
             var message = new TestWellKnownTypes { Int32Field = 10 };
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatDefaultValues(true));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(true));
             var actualJson = formatter.Format(message);
             Assert.IsTrue(actualJson.Contains("\"int64Field\": null"));
             Assert.IsFalse(actualJson.Contains("\"int32Field\": null"));
@@ -326,7 +289,7 @@
         [Test]
         public void OutputIsInNumericFieldOrder_NoDefaults()
         {
-            var formatter = JsonFormatter.Default;
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(false));
             var message = new TestJsonFieldOrdering { PlainString = "p1", PlainInt32 = 2 };
             AssertJson("{ 'plainString': 'p1', 'plainInt32': 2 }", formatter.Format(message));
             message = new TestJsonFieldOrdering { O1Int32 = 5, O2String = "o2", PlainInt32 = 10, PlainString = "plain" };
@@ -338,7 +301,7 @@
         [Test]
         public void OutputIsInNumericFieldOrder_WithDefaults()
         {
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatDefaultValues(true));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(true));
             var message = new TestJsonFieldOrdering();
             AssertJson("{ 'plainString': '', 'plainInt32': 0 }", formatter.Format(message));
             message = new TestJsonFieldOrdering { O1Int32 = 5, O2String = "o2", PlainInt32 = 10, PlainString = "plain" };
@@ -502,7 +465,7 @@
         [Test]
         public void AnyWellKnownType()
         {
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithTypeRegistry(TypeRegistry.FromMessages(Timestamp.Descriptor)));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, TypeRegistry.FromMessages(Timestamp.Descriptor)));
             var timestamp = new DateTime(1673, 6, 19, 12, 34, 56, DateTimeKind.Utc).ToTimestamp();
             var any = Any.Pack(timestamp);
             AssertJson("{ '@type': 'type.googleapis.com/google.protobuf.Timestamp', 'value': '1673-06-19T12:34:56Z' }", formatter.Format(any));
@@ -511,32 +474,32 @@
         [Test]
         public void AnyMessageType()
         {
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithTypeRegistry(TypeRegistry.FromMessages(TestAllTypes.Descriptor)));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, TypeRegistry.FromMessages(TestAllTypes.Descriptor)));
             var message = new TestAllTypes { SingleInt32 = 10, SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 } };
             var any = Any.Pack(message);
-            AssertJson("{ '@type': 'type.googleapis.com/protobuf_unittest3.TestAllTypes', 'singleInt32': 10, 'singleNestedMessage': { 'bb': 20 } }", formatter.Format(any));
+            AssertJson("{ '@type': 'type.googleapis.com/protobuf_unittest.TestAllTypes', 'singleInt32': 10, 'singleNestedMessage': { 'bb': 20 } }", formatter.Format(any));
         }
 
         [Test]
         public void AnyMessageType_CustomPrefix()
         {
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithTypeRegistry(TypeRegistry.FromMessages(TestAllTypes.Descriptor)));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, TypeRegistry.FromMessages(TestAllTypes.Descriptor)));
             var message = new TestAllTypes { SingleInt32 = 10 };
             var any = Any.Pack(message, "foo.bar/baz");
-            AssertJson("{ '@type': 'foo.bar/baz/protobuf_unittest3.TestAllTypes', 'singleInt32': 10 }", formatter.Format(any));
+            AssertJson("{ '@type': 'foo.bar/baz/protobuf_unittest.TestAllTypes', 'singleInt32': 10 }", formatter.Format(any));
         }
 
         [Test]
         public void AnyNested()
         {
             var registry = TypeRegistry.FromMessages(TestWellKnownTypes.Descriptor, TestAllTypes.Descriptor);
-            var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithTypeRegistry(registry));
+            var formatter = new JsonFormatter(new JsonFormatter.Settings(false, registry));
 
             // Nest an Any as the value of an Any.
             var doubleNestedMessage = new TestAllTypes { SingleInt32 = 20 };
             var nestedMessage = Any.Pack(doubleNestedMessage);
             var message = new TestWellKnownTypes { AnyField = Any.Pack(nestedMessage) };
-            AssertJson("{ 'anyField': { '@type': 'type.googleapis.com/google.protobuf.Any', 'value': { '@type': 'type.googleapis.com/protobuf_unittest3.TestAllTypes', 'singleInt32': 20 } } }",
+            AssertJson("{ 'anyField': { '@type': 'type.googleapis.com/google.protobuf.Any', 'value': { '@type': 'type.googleapis.com/protobuf_unittest.TestAllTypes', 'singleInt32': 20 } } }",
                 formatter.Format(message));
         }
 
@@ -549,67 +512,6 @@
             Assert.Throws<InvalidOperationException>(() => JsonFormatter.Default.Format(any));
         }
 
-        [Test]
-        [TestCase(typeof(BoolValue), true, "true")]
-        [TestCase(typeof(Int32Value), 32, "32")]
-        [TestCase(typeof(Int64Value), 32L, "\"32\"")]
-        [TestCase(typeof(UInt32Value), 32U, "32")]
-        [TestCase(typeof(UInt64Value), 32UL, "\"32\"")]
-        [TestCase(typeof(StringValue), "foo", "\"foo\"")]
-        [TestCase(typeof(FloatValue), 1.5f, "1.5")]
-        [TestCase(typeof(DoubleValue), 1.5d, "1.5")]
-        public void Wrappers_Standalone(System.Type wrapperType, object value, string expectedJson)
-        {
-            IMessage populated = (IMessage)Activator.CreateInstance(wrapperType);
-            populated.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.SetValue(populated, value);
-            Assert.AreEqual(expectedJson, JsonFormatter.Default.Format(populated));
-        }
-
-        // Sanity tests for WriteValue. Not particularly comprehensive, as it's all covered above already,
-        // as FormatMessage uses WriteValue.
-
-        [TestCase(null, "null")]
-        [TestCase(1, "1")]
-        [TestCase(1L, "'1'")]
-        [TestCase(0.5f, "0.5")]
-        [TestCase(0.5d, "0.5")]
-        [TestCase("text", "'text'")]
-        [TestCase("x\ny", @"'x\ny'")]
-        [TestCase(ForeignEnum.ForeignBar, "'FOREIGN_BAR'")]
-        public void WriteValue_Constant(object value, string expectedJson)
-        {
-            AssertWriteValue(value, expectedJson);
-        }
-
-        [Test]
-        public void WriteValue_Timestamp()
-        {
-            var value = new DateTime(1673, 6, 19, 12, 34, 56, DateTimeKind.Utc).ToTimestamp();
-            AssertWriteValue(value, "'1673-06-19T12:34:56Z'");
-        }
-
-        [Test]
-        public void WriteValue_Message()
-        {
-            var value = new TestAllTypes { SingleInt32 = 100, SingleInt64 = 3210987654321L };
-            AssertWriteValue(value, "{ 'singleInt32': 100, 'singleInt64': '3210987654321' }");
-        }
-
-        [Test]
-        public void WriteValue_List()
-        {
-            var value = new RepeatedField<int> { 1, 2, 3 };
-            AssertWriteValue(value, "[ 1, 2, 3 ]");
-        }
-
-        private static void AssertWriteValue(object value, string expectedJson)
-        {
-            var writer = new StringWriter();
-            JsonFormatter.Default.WriteValue(writer, value);
-            string actual = writer.ToString();
-            AssertJson(expectedJson, actual);
-        }
-
         /// <summary>
         /// Checks that the actual JSON is the same as the expected JSON - but after replacing
         /// all apostrophes in the expected JSON with double quotes. This basically makes the tests easier
diff --git a/csharp/src/Google.Protobuf.Test/JsonParserTest.cs b/csharp/src/Google.Protobuf.Test/JsonParserTest.cs
index 329ae9b..c3ad851 100644
--- a/csharp/src/Google.Protobuf.Test/JsonParserTest.cs
+++ b/csharp/src/Google.Protobuf.Test/JsonParserTest.cs
@@ -133,12 +133,9 @@
         }
 
         [Test]
-        [TestCase(typeof(BoolValue), "true", true)]
         [TestCase(typeof(Int32Value), "32", 32)]
         [TestCase(typeof(Int64Value), "32", 32L)]
-        [TestCase(typeof(Int64Value), "\"32\"", 32L)]
         [TestCase(typeof(UInt32Value), "32", 32U)]
-        [TestCase(typeof(UInt64Value), "\"32\"", 32UL)]
         [TestCase(typeof(UInt64Value), "32", 32UL)]
         [TestCase(typeof(StringValue), "\"foo\"", "foo")]
         [TestCase(typeof(FloatValue), "1.5", 1.5f)]
@@ -809,7 +806,7 @@
             var json = formatter.Format(original); // This is tested in JsonFormatterTest
             var parser = new JsonParser(new JsonParser.Settings(10, registry));
             Assert.AreEqual(original, parser.Parse<Any>(json));
-            string valueFirstJson = "{ \"singleInt32\": 10, \"singleNestedMessage\": { \"bb\": 20 }, \"@type\": \"type.googleapis.com/protobuf_unittest3.TestAllTypes\" }";
+            string valueFirstJson = "{ \"singleInt32\": 10, \"singleNestedMessage\": { \"bb\": 20 }, \"@type\": \"type.googleapis.com/protobuf_unittest.TestAllTypes\" }";
             Assert.AreEqual(original, parser.Parse<Any>(valueFirstJson));
         }
 
@@ -820,7 +817,7 @@
             var message = new TestAllTypes { SingleInt32 = 10 };
             var original = Any.Pack(message, "custom.prefix/middle-part");
             var parser = new JsonParser(new JsonParser.Settings(10, registry));
-            string json = "{ \"@type\": \"custom.prefix/middle-part/protobuf_unittest3.TestAllTypes\", \"singleInt32\": 10 }";
+            string json = "{ \"@type\": \"custom.prefix/middle-part/protobuf_unittest.TestAllTypes\", \"singleInt32\": 10 }";
             Assert.AreEqual(original, parser.Parse<Any>(json));
         }
 
@@ -926,27 +923,6 @@
             Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
         }
 
-        [Test]
-        public void UnknownField_NotIgnored()
-        {
-            string json = "{ \"unknownField\": 10, \"singleString\": \"x\" }";
-            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
-        }
-
-        [Test]
-        [TestCase("5")]
-        [TestCase("\"text\"")]
-        [TestCase("[0, 1, 2]")]
-        [TestCase("{ \"a\": { \"b\": 10 } }")]
-        public void UnknownField_Ignored(string value)
-        {
-            var parser = new JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true));
-            string json = "{ \"unknownField\": " + value + ", \"singleString\": \"x\" }";
-            var actual = parser.Parse<TestAllTypes>(json);
-            var expected = new TestAllTypes { SingleString = "x" };
-            Assert.AreEqual(expected, actual);
-        }
-
         /// <summary>
         /// Various tests use strings which have quotes round them for parsing or as the result
         /// of formatting, but without those quotes being specified in the tests (for the sake of readability).
diff --git a/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs b/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs
index 33d3503..527ab33 100644
--- a/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs
+++ b/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs
@@ -349,22 +349,6 @@
             Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
             Assert.Throws<InvalidOperationException>(() => tokenizer.Next());
         }
-
-        [Test]
-        [TestCase("{ 'skip': 0, 'next': 1")]
-        [TestCase("{ 'skip': [0, 1, 2], 'next': 1")]
-        [TestCase("{ 'skip': 'x', 'next': 1")]
-        [TestCase("{ 'skip': ['x', 'y'], 'next': 1")]
-        [TestCase("{ 'skip': {'a': 0}, 'next': 1")]
-        [TestCase("{ 'skip': {'a': [0, {'b':[]}]}, 'next': 1")]
-        public void SkipValue(string json)
-        {
-            var tokenizer = JsonTokenizer.FromTextReader(new StringReader(json.Replace('\'', '"')));
-            Assert.AreEqual(JsonToken.StartObject, tokenizer.Next());
-            Assert.AreEqual("skip", tokenizer.Next().StringValue);
-            tokenizer.SkipValue();
-            Assert.AreEqual("next", tokenizer.Next().StringValue);
-        }
        
         /// <summary>
         /// Asserts that the specified JSON is tokenized into the given sequence of tokens.
diff --git a/csharp/src/Google.Protobuf.Test/Program.cs b/csharp/src/Google.Protobuf.Test/Program.cs
deleted file mode 100755
index 954c02b..0000000
--- a/csharp/src/Google.Protobuf.Test/Program.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-using NUnitLite;
-using System.Reflection;
-
-namespace Google.Protobuf.Test
-{
-    class Program
-    {
-        public static int Main(string[] args)
-        {
-            #if NET35
-                return new AutoRun(typeof(Program).Assembly).Execute(args);

-            #else
-                return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args);
-            #endif
-        }
-    }
-}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/Properties/AppManifest.xml b/csharp/src/Google.Protobuf.Test/Properties/AppManifest.xml
new file mode 100644
index 0000000..a955232
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Test/Properties/AppManifest.xml
@@ -0,0 +1,6 @@
+<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"

+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

+>

+    <Deployment.Parts>

+    </Deployment.Parts>

+</Deployment>

diff --git a/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d00acf8
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs
@@ -0,0 +1,20 @@
+using System;

+using System.Reflection;

+using System.Runtime.CompilerServices;

+using System.Runtime.InteropServices;

+

+// General Information about an assembly is controlled through the following 

+// set of attributes. Change these attribute values to modify the information

+// associated with an assembly.

+

+[assembly: AssemblyTitle("Google.Protobuf.Test")]

+[assembly: AssemblyDescription("")]

+[assembly: AssemblyConfiguration("")]

+[assembly: AssemblyCompany("")]

+[assembly: AssemblyProduct("Google.Protobuf.Test")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

+[assembly: AssemblyTrademark("")]

+[assembly: AssemblyCulture("")]

+

+[assembly: AssemblyVersion("3.0.0.0")]

+[assembly: AssemblyFileVersion("3.0.0.0")]

diff --git a/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs b/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs
deleted file mode 100644
index 68b4d6a..0000000
--- a/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using Google.Protobuf.Reflection;
-using Google.Protobuf.WellKnownTypes;
-using NUnit.Framework;
-using System.IO;
-using System.Linq;
-using UnitTest.Issues.TestProtos;
-using static Google.Protobuf.WireFormat;
-using static UnitTest.Issues.TestProtos.ComplexOptionType2.Types;
-using static UnitTest.Issues.TestProtos.DummyMessageContainingEnum.Types;
-using static Google.Protobuf.Test.Reflection.CustomOptionNumber;
-
-namespace Google.Protobuf.Test.Reflection
-{
-    // Internal enum to allow us to use "using static" for convenience.
-    // These are the options defined in unittest_custom_options_proto3.proto
-    internal enum CustomOptionNumber
-    {
-        FileOpt1 = 7736974,
-        MessageOpt1 = 7739036,
-        FieldOpt1 = 7740936,
-        OneofOpt1 = 7740111,
-        EnumOpt1 = 7753576,
-        EnumValueOpt1 = 1560678,
-        ServiceOpt1 = 7887650,
-        MethodOpt1 = 7890860,
-
-        // All message options...
-        BoolOpt = 7706090,
-        Int32Opt = 7705709,
-        Int64Opt = 7705542,
-        UInt32Opt = 7704880,
-        UInt64Opt = 7702367,
-        SInt32Opt = 7701568,
-        SInt64Opt = 7700863,
-        Fixed32Opt = 7700307,
-        Fixed64Opt = 7700194,
-        SFixed32Opt = 7698645,
-        SFixed64Opt = 7685475,
-        FloatOpt = 7675390,
-        DoubleOpt = 7673293,
-        StringOpt = 7673285,
-        BytesOpt = 7673238,
-        EnumOpt = 7673233,
-        MessageTypeOpt = 7665967,
-
-        // Miscellaneous
-        ComplexOpt4 = 7633546,
-        ComplexOpt1 = 7646756,
-        ComplexOpt2 = 7636949,
-        ComplexOpt3 = 7636463,
-
-        // Aggregates
-        AggregateFileOpt = 15478479,
-        AggregateMsgOpt = 15480088,
-        AggregateFieldOpt = 15481374,
-        AggregateEnumOpt = 15483218,
-        AggregateEnumValueOpt = 15486921,
-        AggregateServiceOpt = 15497145,
-        AggregateMethodOpt = 15512713,
-    }
-
-    /// <summary>
-    /// The majority of the testing here is done via parsed descriptors. That's simpler to
-    /// achieve (and more important) than constructing a CodedInputStream manually.
-    /// </summary>
-    public class CustomOptionsTest
-    {
-        delegate bool OptionFetcher<T>(int field, out T value);
-
-        [Test]
-        public void EmptyOptionsIsShared()
-        {
-            var structOptions = Struct.Descriptor.CustomOptions;
-            var timestampOptions = Struct.Descriptor.CustomOptions;
-            Assert.AreSame(structOptions, timestampOptions);
-        }
-
-        [Test]
-        public void SimpleIntegerTest()
-        {
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            output.WriteTag(MakeTag(1, WireType.Varint));
-            output.WriteInt32(1234567);
-            output.Flush();
-            stream.Position = 0;
-            var input = new CodedInputStream(stream);
-            input.ReadTag();
-
-            var options = CustomOptions.Empty;
-            options = options.ReadOrSkipUnknownField(input);
-
-            int intValue;
-            Assert.True(options.TryGetInt32(1, out intValue));
-            Assert.AreEqual(1234567, intValue);
-
-            string stringValue;
-            // No ByteString stored values
-            Assert.False(options.TryGetString(1, out stringValue));
-            // Nothing stored for field 2
-            Assert.False(options.TryGetInt32(2, out intValue));
-        }
-
-        [Test]
-        public void SimpleStringTest()
-        {
-            var stream = new MemoryStream();
-            var output = new CodedOutputStream(stream);
-            output.WriteTag(MakeTag(1, WireType.LengthDelimited));
-            output.WriteString("value");
-            output.Flush();
-            stream.Position = 0;
-            var input = new CodedInputStream(stream);
-            input.ReadTag();
-
-            var options = CustomOptions.Empty;
-            options = options.ReadOrSkipUnknownField(input);
-
-            string stringValue;
-            Assert.True(options.TryGetString(1, out stringValue));
-            Assert.AreEqual("value", stringValue);
-
-            int intValue;
-            // No numeric stored values
-            Assert.False(options.TryGetInt32(1, out intValue));
-            // Nothing stored for field 2
-            Assert.False(options.TryGetString(2, out stringValue));
-        }
-
-        [Test]
-        public void ScalarOptions()
-        {
-            var options = CustomOptionOtherValues.Descriptor.CustomOptions;
-            AssertOption(-100, options.TryGetInt32, Int32Opt);
-            AssertOption(12.3456789f, options.TryGetFloat, FloatOpt);
-            AssertOption(1.234567890123456789d, options.TryGetDouble, DoubleOpt);
-            AssertOption("Hello, \"World\"", options.TryGetString, StringOpt);
-            AssertOption(ByteString.CopyFromUtf8("Hello\0World"), options.TryGetBytes, BytesOpt);
-            AssertOption((int) TestEnumType.TestOptionEnumType2, options.TryGetInt32, EnumOpt);
-        }
-
-        [Test]
-        public void MessageOptions()
-        {
-            var options = VariousComplexOptions.Descriptor.CustomOptions;
-            AssertOption(new ComplexOptionType1 { Foo = 42, Foo4 = { 99, 88 } }, options.TryGetMessage, ComplexOpt1);
-            AssertOption(new ComplexOptionType2
-                {
-                    Baz = 987, Bar = new ComplexOptionType1 { Foo = 743 },
-                    Fred = new ComplexOptionType4 { Waldo = 321 },
-                    Barney = { new ComplexOptionType4 { Waldo = 101 }, new ComplexOptionType4 { Waldo = 212 } }
-                },
-                options.TryGetMessage, ComplexOpt2);
-            AssertOption(new ComplexOptionType3 { Qux = 9 }, options.TryGetMessage, ComplexOpt3);
-        }
-
-        [Test]
-        public void OptionLocations()
-        {
-            var fileOptions = UnittestCustomOptionsProto3Reflection.Descriptor.CustomOptions;
-            AssertOption(9876543210UL, fileOptions.TryGetUInt64, FileOpt1);
-
-            var messageOptions = TestMessageWithCustomOptions.Descriptor.CustomOptions;
-            AssertOption(-56, messageOptions.TryGetInt32, MessageOpt1);
-
-            var fieldOptions = TestMessageWithCustomOptions.Descriptor.Fields["field1"] .CustomOptions;
-            AssertOption(8765432109UL, fieldOptions.TryGetFixed64, FieldOpt1);
-
-            var oneofOptions = TestMessageWithCustomOptions.Descriptor.Oneofs[0].CustomOptions;
-            AssertOption(-99, oneofOptions.TryGetInt32, OneofOpt1);
-
-            var enumOptions = TestMessageWithCustomOptions.Descriptor.EnumTypes[0].CustomOptions;
-            AssertOption(-789, enumOptions.TryGetSFixed32, EnumOpt1);
-
-            var enumValueOptions = TestMessageWithCustomOptions.Descriptor.EnumTypes[0].FindValueByNumber(2).CustomOptions;
-            AssertOption(123, enumValueOptions.TryGetInt32, EnumValueOpt1);
-
-            var service = UnittestCustomOptionsProto3Reflection.Descriptor.Services
-                .Single(s => s.Name == "TestServiceWithCustomOptions");
-            var serviceOptions = service.CustomOptions;
-            AssertOption(-9876543210, serviceOptions.TryGetSInt64, ServiceOpt1);
-
-            var methodOptions = service.Methods[0].CustomOptions;
-            AssertOption((int) UnitTest.Issues.TestProtos.MethodOpt1.Val2, methodOptions.TryGetInt32, CustomOptionNumber.MethodOpt1);
-        }
-
-        [Test]
-        public void MinValues()
-        {
-            var options = CustomOptionMinIntegerValues.Descriptor.CustomOptions;
-            AssertOption(false, options.TryGetBool, BoolOpt);
-            AssertOption(int.MinValue, options.TryGetInt32, Int32Opt);
-            AssertOption(long.MinValue, options.TryGetInt64, Int64Opt);
-            AssertOption(uint.MinValue, options.TryGetUInt32, UInt32Opt);
-            AssertOption(ulong.MinValue, options.TryGetUInt64, UInt64Opt);
-            AssertOption(int.MinValue, options.TryGetSInt32, SInt32Opt);
-            AssertOption(long.MinValue, options.TryGetSInt64, SInt64Opt);
-            AssertOption(uint.MinValue, options.TryGetUInt32, Fixed32Opt);
-            AssertOption(ulong.MinValue, options.TryGetUInt64, Fixed64Opt);
-            AssertOption(int.MinValue, options.TryGetInt32, SFixed32Opt);
-            AssertOption(long.MinValue, options.TryGetInt64, SFixed64Opt);
-        }
-
-        [Test]
-        public void MaxValues()
-        {
-            var options = CustomOptionMaxIntegerValues.Descriptor.CustomOptions;
-            AssertOption(true, options.TryGetBool, BoolOpt);
-            AssertOption(int.MaxValue, options.TryGetInt32, Int32Opt);
-            AssertOption(long.MaxValue, options.TryGetInt64, Int64Opt);
-            AssertOption(uint.MaxValue, options.TryGetUInt32, UInt32Opt);
-            AssertOption(ulong.MaxValue, options.TryGetUInt64, UInt64Opt);
-            AssertOption(int.MaxValue, options.TryGetSInt32, SInt32Opt);
-            AssertOption(long.MaxValue, options.TryGetSInt64, SInt64Opt);
-            AssertOption(uint.MaxValue, options.TryGetFixed32, Fixed32Opt);
-            AssertOption(ulong.MaxValue, options.TryGetFixed64, Fixed64Opt);
-            AssertOption(int.MaxValue, options.TryGetSFixed32, SFixed32Opt);
-            AssertOption(long.MaxValue, options.TryGetSFixed64, SFixed64Opt);
-        }
-
-        [Test]
-        public void AggregateOptions()
-        {
-            // Just two examples
-            var messageOptions = AggregateMessage.Descriptor.CustomOptions;
-            AssertOption(new Aggregate { I = 101, S = "MessageAnnotation" }, messageOptions.TryGetMessage, AggregateMsgOpt);
-
-            var fieldOptions = AggregateMessage.Descriptor.Fields["fieldname"].CustomOptions;
-            AssertOption(new Aggregate { S = "FieldAnnotation" }, fieldOptions.TryGetMessage, AggregateFieldOpt);
-        }
-
-        private void AssertOption<T>(T expected, OptionFetcher<T> fetcher, CustomOptionNumber field)
-        {
-            T actual;
-            Assert.IsTrue(fetcher((int) field, out actual));
-            Assert.AreEqual(expected, actual);
-        }
-    }
-}
diff --git a/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs b/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
index 29a376e..52d5a67 100644
--- a/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
@@ -48,13 +48,13 @@
         {
             FileDescriptor file = UnittestProto3Reflection.Descriptor;
 
-            Assert.AreEqual("unittest_proto3.proto", file.Name);
-            Assert.AreEqual("protobuf_unittest3", file.Package);
+            Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Name);
+            Assert.AreEqual("protobuf_unittest", file.Package);
 
             Assert.AreEqual("UnittestProto", file.Proto.Options.JavaOuterClassname);
-            Assert.AreEqual("unittest_proto3.proto", file.Proto.Name);
+            Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Proto.Name);
 
-            // unittest_proto3.proto doesn't have any public imports, but unittest_import_proto3.proto does.
+            // unittest.proto doesn't have any public imports, but unittest_import.proto does.
             Assert.AreEqual(0, file.PublicDependencies.Count);
             Assert.AreEqual(1, UnittestImportProto3Reflection.Descriptor.PublicDependencies.Count);
             Assert.AreEqual(UnittestImportPublicProto3Reflection.Descriptor, UnittestImportProto3Reflection.Descriptor.PublicDependencies[0]);
@@ -68,7 +68,7 @@
             Assert.AreEqual(messageType, file.MessageTypes[0]);
             Assert.AreEqual(messageType, file.FindTypeByName<MessageDescriptor>("TestAllTypes"));
             Assert.Null(file.FindTypeByName<MessageDescriptor>("NoSuchType"));
-            Assert.Null(file.FindTypeByName<MessageDescriptor>("protobuf_unittest3.TestAllTypes"));
+            Assert.Null(file.FindTypeByName<MessageDescriptor>("protobuf_unittest.TestAllTypes"));
             for (int i = 0; i < file.MessageTypes.Count; i++)
             {
                 Assert.AreEqual(i, file.MessageTypes[i].Index);
@@ -76,7 +76,7 @@
 
             Assert.AreEqual(file.EnumTypes[0], file.FindTypeByName<EnumDescriptor>("ForeignEnum"));
             Assert.Null(file.FindTypeByName<EnumDescriptor>("NoSuchType"));
-            Assert.Null(file.FindTypeByName<EnumDescriptor>("protobuf_unittest3.ForeignEnum"));
+            Assert.Null(file.FindTypeByName<EnumDescriptor>("protobuf_unittest.ForeignEnum"));
             Assert.AreEqual(1, UnittestImportProto3Reflection.Descriptor.EnumTypes.Count);
             Assert.AreEqual("ImportEnum", UnittestImportProto3Reflection.Descriptor.EnumTypes[0].Name);
             for (int i = 0; i < file.EnumTypes.Count; i++)
@@ -88,23 +88,13 @@
         }
 
         [Test]
-        public void FileDescriptor_NonRootPath()
-        {
-            // unittest_proto3.proto used to be in google/protobuf. Now it's in the C#-specific location,
-            // let's test something that's still in a directory.
-            FileDescriptor file = UnittestWellKnownTypesReflection.Descriptor;
-            Assert.AreEqual("google/protobuf/unittest_well_known_types.proto", file.Name);
-            Assert.AreEqual("protobuf_unittest", file.Package);
-        }
-
-        [Test]
         public void MessageDescriptor()
         {
             MessageDescriptor messageType = TestAllTypes.Descriptor;
             MessageDescriptor nestedType = TestAllTypes.Types.NestedMessage.Descriptor;
 
             Assert.AreEqual("TestAllTypes", messageType.Name);
-            Assert.AreEqual("protobuf_unittest3.TestAllTypes", messageType.FullName);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes", messageType.FullName);
             Assert.AreEqual(UnittestProto3Reflection.Descriptor, messageType.File);
             Assert.IsNull(messageType.ContainingType);
             Assert.IsNull(messageType.Proto.Options);
@@ -112,7 +102,7 @@
             Assert.AreEqual("TestAllTypes", messageType.Name);
 
             Assert.AreEqual("NestedMessage", nestedType.Name);
-            Assert.AreEqual("protobuf_unittest3.TestAllTypes.NestedMessage", nestedType.FullName);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedMessage", nestedType.FullName);
             Assert.AreEqual(UnittestProto3Reflection.Descriptor, nestedType.File);
             Assert.AreEqual(messageType, nestedType.ContainingType);
 
@@ -153,7 +143,7 @@
             FieldDescriptor messageField = messageType.FindDescriptor<FieldDescriptor>("single_foreign_message");
 
             Assert.AreEqual("single_int32", primitiveField.Name);
-            Assert.AreEqual("protobuf_unittest3.TestAllTypes.single_int32",
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.single_int32",
                             primitiveField.FullName);
             Assert.AreEqual(1, primitiveField.FieldNumber);
             Assert.AreEqual(messageType, primitiveField.ContainingType);
@@ -190,13 +180,13 @@
             EnumDescriptor nestedType = TestAllTypes.Descriptor.FindDescriptor<EnumDescriptor>("NestedEnum");
 
             Assert.AreEqual("ForeignEnum", enumType.Name);
-            Assert.AreEqual("protobuf_unittest3.ForeignEnum", enumType.FullName);
+            Assert.AreEqual("protobuf_unittest.ForeignEnum", enumType.FullName);
             Assert.AreEqual(UnittestProto3Reflection.Descriptor, enumType.File);
             Assert.Null(enumType.ContainingType);
             Assert.Null(enumType.Proto.Options);
 
             Assert.AreEqual("NestedEnum", nestedType.Name);
-            Assert.AreEqual("protobuf_unittest3.TestAllTypes.NestedEnum",
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedEnum",
                             nestedType.FullName);
             Assert.AreEqual(UnittestProto3Reflection.Descriptor, nestedType.File);
             Assert.AreEqual(TestAllTypes.Descriptor, nestedType.ContainingType);
@@ -219,7 +209,7 @@
         {
             OneofDescriptor descriptor = TestAllTypes.Descriptor.FindDescriptor<OneofDescriptor>("oneof_field");
             Assert.AreEqual("oneof_field", descriptor.Name);
-            Assert.AreEqual("protobuf_unittest3.TestAllTypes.oneof_field", descriptor.FullName);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.oneof_field", descriptor.FullName);
 
             var expectedFields = new[] {
                 TestAllTypes.OneofBytesFieldNumber,
diff --git a/csharp/src/Google.Protobuf.Test/SampleNaNs.cs b/csharp/src/Google.Protobuf.Test/SampleNaNs.cs
deleted file mode 100644
index 08b5019..0000000
--- a/csharp/src/Google.Protobuf.Test/SampleNaNs.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using System;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Samples of different not-a-number values, for testing equality comparisons.
-    /// </summary>
-    public static class SampleNaNs
-    {
-        public static double Regular { get; } = double.NaN;
-
-        // Signalling bit is inverted compared with double.NaN. Doesn't really matter
-        // whether that makes it quiet or signalling - it's different.
-        public static double SignallingFlipped { get; } = 
-            BitConverter.Int64BitsToDouble(BitConverter.DoubleToInt64Bits(double.NaN) ^ -0x8000_0000_0000_0000L);
-
-        // A bit in the middle of the mantissa is flipped; this difference is preserved when casting to float.
-        public static double PayloadFlipped { get; } =
-            BitConverter.Int64BitsToDouble(BitConverter.DoubleToInt64Bits(double.NaN) ^ 0x1_0000_0000L);
-    }
-}
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs
index cb1bc92..3ba4a2b 100644
--- a/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs
+++ b/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: map_unittest_proto3.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/map_unittest_proto3.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -11,11 +9,12 @@
 using scg = global::System.Collections.Generic;
 namespace Google.Protobuf.TestProtos {
 
-  /// <summary>Holder for reflection information generated from map_unittest_proto3.proto</summary>
+  /// <summary>Holder for reflection information generated from google/protobuf/map_unittest_proto3.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class MapUnittestProto3Reflection {
 
     #region Descriptor
-    /// <summary>File descriptor for map_unittest_proto3.proto</summary>
+    /// <summary>File descriptor for google/protobuf/map_unittest_proto3.proto</summary>
     public static pbr::FileDescriptor Descriptor {
       get { return descriptor; }
     }
@@ -24,130 +23,130 @@
     static MapUnittestProto3Reflection() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "ChltYXBfdW5pdHRlc3RfcHJvdG8zLnByb3RvEhJwcm90b2J1Zl91bml0dGVz",
-            "dDMaFXVuaXR0ZXN0X3Byb3RvMy5wcm90byKpEgoHVGVzdE1hcBJHCg9tYXBf",
-            "aW50MzJfaW50MzIYASADKAsyLi5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1h",
-            "cC5NYXBJbnQzMkludDMyRW50cnkSRwoPbWFwX2ludDY0X2ludDY0GAIgAygL",
-            "Mi4ucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwSW50NjRJbnQ2NEVu",
-            "dHJ5EksKEW1hcF91aW50MzJfdWludDMyGAMgAygLMjAucHJvdG9idWZfdW5p",
-            "dHRlc3QzLlRlc3RNYXAuTWFwVWludDMyVWludDMyRW50cnkSSwoRbWFwX3Vp",
-            "bnQ2NF91aW50NjQYBCADKAsyMC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1h",
-            "cC5NYXBVaW50NjRVaW50NjRFbnRyeRJLChFtYXBfc2ludDMyX3NpbnQzMhgF",
-            "IAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcFNpbnQzMlNp",
-            "bnQzMkVudHJ5EksKEW1hcF9zaW50NjRfc2ludDY0GAYgAygLMjAucHJvdG9i",
-            "dWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwU2ludDY0U2ludDY0RW50cnkSTwoT",
-            "bWFwX2ZpeGVkMzJfZml4ZWQzMhgHIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0",
-            "My5UZXN0TWFwLk1hcEZpeGVkMzJGaXhlZDMyRW50cnkSTwoTbWFwX2ZpeGVk",
-            "NjRfZml4ZWQ2NBgIIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFw",
-            "Lk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSUwoVbWFwX3NmaXhlZDMyX3NmaXhl",
-            "ZDMyGAkgAygLMjQucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwU2Zp",
-            "eGVkMzJTZml4ZWQzMkVudHJ5ElMKFW1hcF9zZml4ZWQ2NF9zZml4ZWQ2NBgK",
-            "IAMoCzI0LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcFNmaXhlZDY0",
-            "U2ZpeGVkNjRFbnRyeRJHCg9tYXBfaW50MzJfZmxvYXQYCyADKAsyLi5wcm90",
-            "b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBJbnQzMkZsb2F0RW50cnkSSQoQ",
-            "bWFwX2ludDMyX2RvdWJsZRgMIAMoCzIvLnByb3RvYnVmX3VuaXR0ZXN0My5U",
-            "ZXN0TWFwLk1hcEludDMyRG91YmxlRW50cnkSQwoNbWFwX2Jvb2xfYm9vbBgN",
-            "IAMoCzIsLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcEJvb2xCb29s",
-            "RW50cnkSSwoRbWFwX3N0cmluZ19zdHJpbmcYDiADKAsyMC5wcm90b2J1Zl91",
-            "bml0dGVzdDMuVGVzdE1hcC5NYXBTdHJpbmdTdHJpbmdFbnRyeRJHCg9tYXBf",
-            "aW50MzJfYnl0ZXMYDyADKAsyLi5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1h",
-            "cC5NYXBJbnQzMkJ5dGVzRW50cnkSRQoObWFwX2ludDMyX2VudW0YECADKAsy",
-            "LS5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBJbnQzMkVudW1FbnRy",
-            "eRJaChltYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlGBEgAygLMjcucHJvdG9i",
-            "dWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwSW50MzJGb3JlaWduTWVzc2FnZUVu",
-            "dHJ5GjQKEk1hcEludDMySW50MzJFbnRyeRILCgNrZXkYASABKAUSDQoFdmFs",
-            "dWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50NjRFbnRyeRILCgNrZXkYASAB",
-            "KAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1hcFVpbnQzMlVpbnQzMkVudHJ5",
-            "EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEoDToCOAEaNgoUTWFwVWludDY0",
-            "VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0KBXZhbHVlGAIgASgEOgI4ARo2",
-            "ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNrZXkYASABKBESDQoFdmFsdWUY",
-            "AiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2NEVudHJ5EgsKA2tleRgBIAEo",
-            "EhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFwRml4ZWQzMkZpeGVkMzJFbnRy",
-            "eRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiABKAc6AjgBGjgKFk1hcEZpeGVk",
-            "NjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgGEg0KBXZhbHVlGAIgASgGOgI4",
-            "ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50cnkSCwoDa2V5GAEgASgPEg0K",
-            "BXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkS",
-            "CwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQOgI4ARo0ChJNYXBJbnQzMkZs",
-            "b2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgCOgI4ARo1ChNN",
-            "YXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEo",
-            "AToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRILCgNrZXkYASABKAgSDQoFdmFs",
-            "dWUYAiABKAg6AjgBGjYKFE1hcFN0cmluZ1N0cmluZ0VudHJ5EgsKA2tleRgB",
-            "IAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaNAoSTWFwSW50MzJCeXRlc0VudHJ5",
-            "EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoDDoCOAEaUAoRTWFwSW50MzJF",
-            "bnVtRW50cnkSCwoDa2V5GAEgASgFEioKBXZhbHVlGAIgASgOMhsucHJvdG9i",
-            "dWZfdW5pdHRlc3QzLk1hcEVudW06AjgBGmEKG01hcEludDMyRm9yZWlnbk1l",
-            "c3NhZ2VFbnRyeRILCgNrZXkYASABKAUSMQoFdmFsdWUYAiABKAsyIi5wcm90",
-            "b2J1Zl91bml0dGVzdDMuRm9yZWlnbk1lc3NhZ2U6AjgBIkIKEVRlc3RNYXBT",
-            "dWJtZXNzYWdlEi0KCHRlc3RfbWFwGAEgASgLMhsucHJvdG9idWZfdW5pdHRl",
-            "c3QzLlRlc3RNYXAivgEKDlRlc3RNZXNzYWdlTWFwElIKEW1hcF9pbnQzMl9t",
-            "ZXNzYWdlGAEgAygLMjcucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNZXNzYWdl",
-            "TWFwLk1hcEludDMyTWVzc2FnZUVudHJ5GlgKFE1hcEludDMyTWVzc2FnZUVu",
-            "dHJ5EgsKA2tleRgBIAEoBRIvCgV2YWx1ZRgCIAEoCzIgLnByb3RvYnVmX3Vu",
-            "aXR0ZXN0My5UZXN0QWxsVHlwZXM6AjgBIuUBCg9UZXN0U2FtZVR5cGVNYXAS",
-            "OwoEbWFwMRgBIAMoCzItLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0U2FtZVR5",
-            "cGVNYXAuTWFwMUVudHJ5EjsKBG1hcDIYAiADKAsyLS5wcm90b2J1Zl91bml0",
-            "dGVzdDMuVGVzdFNhbWVUeXBlTWFwLk1hcDJFbnRyeRorCglNYXAxRW50cnkS",
-            "CwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ARorCglNYXAyRW50cnkS",
-            "CwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ASL1EAoMVGVzdEFyZW5h",
-            "TWFwEkwKD21hcF9pbnQzMl9pbnQzMhgBIAMoCzIzLnByb3RvYnVmX3VuaXR0",
-            "ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJJbnQzMkVudHJ5EkwKD21hcF9p",
-            "bnQ2NF9pbnQ2NBgCIAMoCzIzLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJl",
-            "bmFNYXAuTWFwSW50NjRJbnQ2NEVudHJ5ElAKEW1hcF91aW50MzJfdWludDMy",
-            "GAMgAygLMjUucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1hcC5NYXBV",
-            "aW50MzJVaW50MzJFbnRyeRJQChFtYXBfdWludDY0X3VpbnQ2NBgEIAMoCzI1",
-            "LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwVWludDY0VWlu",
-            "dDY0RW50cnkSUAoRbWFwX3NpbnQzMl9zaW50MzIYBSADKAsyNS5wcm90b2J1",
-            "Zl91bml0dGVzdDMuVGVzdEFyZW5hTWFwLk1hcFNpbnQzMlNpbnQzMkVudHJ5",
-            "ElAKEW1hcF9zaW50NjRfc2ludDY0GAYgAygLMjUucHJvdG9idWZfdW5pdHRl",
-            "c3QzLlRlc3RBcmVuYU1hcC5NYXBTaW50NjRTaW50NjRFbnRyeRJUChNtYXBf",
-            "Zml4ZWQzMl9maXhlZDMyGAcgAygLMjcucHJvdG9idWZfdW5pdHRlc3QzLlRl",
-            "c3RBcmVuYU1hcC5NYXBGaXhlZDMyRml4ZWQzMkVudHJ5ElQKE21hcF9maXhl",
-            "ZDY0X2ZpeGVkNjQYCCADKAsyNy5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEFy",
-            "ZW5hTWFwLk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSWAoVbWFwX3NmaXhlZDMy",
-            "X3NmaXhlZDMyGAkgAygLMjkucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVu",
-            "YU1hcC5NYXBTZml4ZWQzMlNmaXhlZDMyRW50cnkSWAoVbWFwX3NmaXhlZDY0",
-            "X3NmaXhlZDY0GAogAygLMjkucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVu",
-            "YU1hcC5NYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkSTAoPbWFwX2ludDMyX2Zs",
-            "b2F0GAsgAygLMjMucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1hcC5N",
-            "YXBJbnQzMkZsb2F0RW50cnkSTgoQbWFwX2ludDMyX2RvdWJsZRgMIAMoCzI0",
-            "LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJEb3Vi",
-            "bGVFbnRyeRJICg1tYXBfYm9vbF9ib29sGA0gAygLMjEucHJvdG9idWZfdW5p",
-            "dHRlc3QzLlRlc3RBcmVuYU1hcC5NYXBCb29sQm9vbEVudHJ5EkoKDm1hcF9p",
-            "bnQzMl9lbnVtGA4gAygLMjIucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVu",
-            "YU1hcC5NYXBJbnQzMkVudW1FbnRyeRJfChltYXBfaW50MzJfZm9yZWlnbl9t",
-            "ZXNzYWdlGA8gAygLMjwucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1h",
-            "cC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlRW50cnkaNAoSTWFwSW50MzJJbnQz",
-            "MkVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaNAoSTWFw",
-            "SW50NjRJbnQ2NEVudHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoC",
-            "OAEaNgoUTWFwVWludDMyVWludDMyRW50cnkSCwoDa2V5GAEgASgNEg0KBXZh",
-            "bHVlGAIgASgNOgI4ARo2ChRNYXBVaW50NjRVaW50NjRFbnRyeRILCgNrZXkY",
-            "ASABKAQSDQoFdmFsdWUYAiABKAQ6AjgBGjYKFE1hcFNpbnQzMlNpbnQzMkVu",
-            "dHJ5EgsKA2tleRgBIAEoERINCgV2YWx1ZRgCIAEoEToCOAEaNgoUTWFwU2lu",
-            "dDY0U2ludDY0RW50cnkSCwoDa2V5GAEgASgSEg0KBXZhbHVlGAIgASgSOgI4",
-            "ARo4ChZNYXBGaXhlZDMyRml4ZWQzMkVudHJ5EgsKA2tleRgBIAEoBxINCgV2",
-            "YWx1ZRgCIAEoBzoCOAEaOAoWTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRILCgNr",
-            "ZXkYASABKAYSDQoFdmFsdWUYAiABKAY6AjgBGjoKGE1hcFNmaXhlZDMyU2Zp",
-            "eGVkMzJFbnRyeRILCgNrZXkYASABKA8SDQoFdmFsdWUYAiABKA86AjgBGjoK",
-            "GE1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRILCgNrZXkYASABKBASDQoFdmFs",
-            "dWUYAiABKBA6AjgBGjQKEk1hcEludDMyRmxvYXRFbnRyeRILCgNrZXkYASAB",
-            "KAUSDQoFdmFsdWUYAiABKAI6AjgBGjUKE01hcEludDMyRG91YmxlRW50cnkS",
-            "CwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgBOgI4ARoyChBNYXBCb29sQm9v",
-            "bEVudHJ5EgsKA2tleRgBIAEoCBINCgV2YWx1ZRgCIAEoCDoCOAEaUAoRTWFw",
-            "SW50MzJFbnVtRW50cnkSCwoDa2V5GAEgASgFEioKBXZhbHVlGAIgASgOMhsu",
-            "cHJvdG9idWZfdW5pdHRlc3QzLk1hcEVudW06AjgBGmEKG01hcEludDMyRm9y",
-            "ZWlnbk1lc3NhZ2VFbnRyeRILCgNrZXkYASABKAUSMQoFdmFsdWUYAiABKAsy",
-            "Ii5wcm90b2J1Zl91bml0dGVzdDMuRm9yZWlnbk1lc3NhZ2U6AjgBIuYBCh9N",
-            "ZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlEksKBHR5cGUYASADKAsy",
-            "PS5wcm90b2J1Zl91bml0dGVzdDMuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2Fs",
-            "bGVkVHlwZS5UeXBlRW50cnkaYAoJVHlwZUVudHJ5EgsKA2tleRgBIAEoBRJC",
-            "CgV2YWx1ZRgCIAEoCzIzLnByb3RvYnVmX3VuaXR0ZXN0My5NZXNzYWdlQ29u",
-            "dGFpbmluZ0VudW1DYWxsZWRUeXBlOgI4ASIUCgRUeXBlEgwKCFRZUEVfRk9P",
-            "EAAingEKH01lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkSTQoFZW50",
-            "cnkYASADKAsyPi5wcm90b2J1Zl91bml0dGVzdDMuTWVzc2FnZUNvbnRhaW5p",
-            "bmdNYXBDYWxsZWRFbnRyeS5FbnRyeUVudHJ5GiwKCkVudHJ5RW50cnkSCwoD",
-            "a2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ASo/CgdNYXBFbnVtEhAKDE1B",
-            "UF9FTlVNX0ZPTxAAEhAKDE1BUF9FTlVNX0JBUhABEhAKDE1BUF9FTlVNX0JB",
-            "WhACQh2qAhpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvc2IGcHJvdG8z"));
+            "Cilnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0X3Byb3RvMy5wcm90bxIR",
+            "cHJvdG9idWZfdW5pdHRlc3QaJWdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9w",
+            "cm90bzMucHJvdG8ilhIKB1Rlc3RNYXASRgoPbWFwX2ludDMyX2ludDMyGAEg",
+            "AygLMi0ucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkludDMy",
+            "RW50cnkSRgoPbWFwX2ludDY0X2ludDY0GAIgAygLMi0ucHJvdG9idWZfdW5p",
+            "dHRlc3QuVGVzdE1hcC5NYXBJbnQ2NEludDY0RW50cnkSSgoRbWFwX3VpbnQz",
+            "Ml91aW50MzIYAyADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1h",
+            "cFVpbnQzMlVpbnQzMkVudHJ5EkoKEW1hcF91aW50NjRfdWludDY0GAQgAygL",
+            "Mi8ucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBVaW50NjRVaW50NjRF",
+            "bnRyeRJKChFtYXBfc2ludDMyX3NpbnQzMhgFIAMoCzIvLnByb3RvYnVmX3Vu",
+            "aXR0ZXN0LlRlc3RNYXAuTWFwU2ludDMyU2ludDMyRW50cnkSSgoRbWFwX3Np",
+            "bnQ2NF9zaW50NjQYBiADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFw",
+            "Lk1hcFNpbnQ2NFNpbnQ2NEVudHJ5Ek4KE21hcF9maXhlZDMyX2ZpeGVkMzIY",
+            "ByADKAsyMS5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcEZpeGVkMzJG",
+            "aXhlZDMyRW50cnkSTgoTbWFwX2ZpeGVkNjRfZml4ZWQ2NBgIIAMoCzIxLnBy",
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRy",
+            "eRJSChVtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIYCSADKAsyMy5wcm90b2J1Zl91",
+            "bml0dGVzdC5UZXN0TWFwLk1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRJSChVt",
+            "YXBfc2ZpeGVkNjRfc2ZpeGVkNjQYCiADKAsyMy5wcm90b2J1Zl91bml0dGVz",
+            "dC5UZXN0TWFwLk1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRJGCg9tYXBfaW50",
+            "MzJfZmxvYXQYCyADKAsyLS5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1h",
+            "cEludDMyRmxvYXRFbnRyeRJIChBtYXBfaW50MzJfZG91YmxlGAwgAygLMi4u",
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkRvdWJsZUVudHJ5",
+            "EkIKDW1hcF9ib29sX2Jvb2wYDSADKAsyKy5wcm90b2J1Zl91bml0dGVzdC5U",
+            "ZXN0TWFwLk1hcEJvb2xCb29sRW50cnkSSgoRbWFwX3N0cmluZ19zdHJpbmcY",
+            "DiADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcFN0cmluZ1N0",
+            "cmluZ0VudHJ5EkYKD21hcF9pbnQzMl9ieXRlcxgPIAMoCzItLnByb3RvYnVm",
+            "X3VuaXR0ZXN0LlRlc3RNYXAuTWFwSW50MzJCeXRlc0VudHJ5EkQKDm1hcF9p",
+            "bnQzMl9lbnVtGBAgAygLMiwucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5N",
+            "YXBJbnQzMkVudW1FbnRyeRJZChltYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdl",
+            "GBEgAygLMjYucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkZv",
+            "cmVpZ25NZXNzYWdlRW50cnkaNAoSTWFwSW50MzJJbnQzMkVudHJ5EgsKA2tl",
+            "eRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaNAoSTWFwSW50NjRJbnQ2NEVu",
+            "dHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoCOAEaNgoUTWFwVWlu",
+            "dDMyVWludDMyRW50cnkSCwoDa2V5GAEgASgNEg0KBXZhbHVlGAIgASgNOgI4",
+            "ARo2ChRNYXBVaW50NjRVaW50NjRFbnRyeRILCgNrZXkYASABKAQSDQoFdmFs",
+            "dWUYAiABKAQ6AjgBGjYKFE1hcFNpbnQzMlNpbnQzMkVudHJ5EgsKA2tleRgB",
+            "IAEoERINCgV2YWx1ZRgCIAEoEToCOAEaNgoUTWFwU2ludDY0U2ludDY0RW50",
+            "cnkSCwoDa2V5GAEgASgSEg0KBXZhbHVlGAIgASgSOgI4ARo4ChZNYXBGaXhl",
+            "ZDMyRml4ZWQzMkVudHJ5EgsKA2tleRgBIAEoBxINCgV2YWx1ZRgCIAEoBzoC",
+            "OAEaOAoWTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRILCgNrZXkYASABKAYSDQoF",
+            "dmFsdWUYAiABKAY6AjgBGjoKGE1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRIL",
+            "CgNrZXkYASABKA8SDQoFdmFsdWUYAiABKA86AjgBGjoKGE1hcFNmaXhlZDY0",
+            "U2ZpeGVkNjRFbnRyeRILCgNrZXkYASABKBASDQoFdmFsdWUYAiABKBA6AjgB",
+            "GjQKEk1hcEludDMyRmxvYXRFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUY",
+            "AiABKAI6AjgBGjUKE01hcEludDMyRG91YmxlRW50cnkSCwoDa2V5GAEgASgF",
+            "Eg0KBXZhbHVlGAIgASgBOgI4ARoyChBNYXBCb29sQm9vbEVudHJ5EgsKA2tl",
+            "eRgBIAEoCBINCgV2YWx1ZRgCIAEoCDoCOAEaNgoUTWFwU3RyaW5nU3RyaW5n",
+            "RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo0ChJNYXBJ",
+            "bnQzMkJ5dGVzRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgMOgI4",
+            "ARpPChFNYXBJbnQzMkVudW1FbnRyeRILCgNrZXkYASABKAUSKQoFdmFsdWUY",
+            "AiABKA4yGi5wcm90b2J1Zl91bml0dGVzdC5NYXBFbnVtOgI4ARpgChtNYXBJ",
+            "bnQzMkZvcmVpZ25NZXNzYWdlRW50cnkSCwoDa2V5GAEgASgFEjAKBXZhbHVl",
+            "GAIgASgLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2U6AjgB",
+            "IkEKEVRlc3RNYXBTdWJtZXNzYWdlEiwKCHRlc3RfbWFwGAEgASgLMhoucHJv",
+            "dG9idWZfdW5pdHRlc3QuVGVzdE1hcCK8AQoOVGVzdE1lc3NhZ2VNYXASUQoR",
+            "bWFwX2ludDMyX21lc3NhZ2UYASADKAsyNi5wcm90b2J1Zl91bml0dGVzdC5U",
+            "ZXN0TWVzc2FnZU1hcC5NYXBJbnQzMk1lc3NhZ2VFbnRyeRpXChRNYXBJbnQz",
+            "Mk1lc3NhZ2VFbnRyeRILCgNrZXkYASABKAUSLgoFdmFsdWUYAiABKAsyHy5w",
+            "cm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXM6AjgBIuMBCg9UZXN0U2Ft",
+            "ZVR5cGVNYXASOgoEbWFwMRgBIAMoCzIsLnByb3RvYnVmX3VuaXR0ZXN0LlRl",
+            "c3RTYW1lVHlwZU1hcC5NYXAxRW50cnkSOgoEbWFwMhgCIAMoCzIsLnByb3Rv",
+            "YnVmX3VuaXR0ZXN0LlRlc3RTYW1lVHlwZU1hcC5NYXAyRW50cnkaKwoJTWFw",
+            "MUVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaKwoJTWFw",
+            "MkVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi5BAKDFRl",
+            "c3RBcmVuYU1hcBJLCg9tYXBfaW50MzJfaW50MzIYASADKAsyMi5wcm90b2J1",
+            "Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwSW50MzJJbnQzMkVudHJ5EksK",
+            "D21hcF9pbnQ2NF9pbnQ2NBgCIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0LlRl",
+            "c3RBcmVuYU1hcC5NYXBJbnQ2NEludDY0RW50cnkSTwoRbWFwX3VpbnQzMl91",
+            "aW50MzIYAyADKAsyNC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAu",
+            "TWFwVWludDMyVWludDMyRW50cnkSTwoRbWFwX3VpbnQ2NF91aW50NjQYBCAD",
+            "KAsyNC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwVWludDY0",
+            "VWludDY0RW50cnkSTwoRbWFwX3NpbnQzMl9zaW50MzIYBSADKAsyNC5wcm90",
+            "b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwU2ludDMyU2ludDMyRW50",
+            "cnkSTwoRbWFwX3NpbnQ2NF9zaW50NjQYBiADKAsyNC5wcm90b2J1Zl91bml0",
+            "dGVzdC5UZXN0QXJlbmFNYXAuTWFwU2ludDY0U2ludDY0RW50cnkSUwoTbWFw",
+            "X2ZpeGVkMzJfZml4ZWQzMhgHIAMoCzI2LnByb3RvYnVmX3VuaXR0ZXN0LlRl",
+            "c3RBcmVuYU1hcC5NYXBGaXhlZDMyRml4ZWQzMkVudHJ5ElMKE21hcF9maXhl",
+            "ZDY0X2ZpeGVkNjQYCCADKAsyNi5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJl",
+            "bmFNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRJXChVtYXBfc2ZpeGVkMzJf",
+            "c2ZpeGVkMzIYCSADKAsyOC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFN",
+            "YXAuTWFwU2ZpeGVkMzJTZml4ZWQzMkVudHJ5ElcKFW1hcF9zZml4ZWQ2NF9z",
+            "Zml4ZWQ2NBgKIAMoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBcmVuYU1h",
+            "cC5NYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkSSwoPbWFwX2ludDMyX2Zsb2F0",
+            "GAsgAygLMjIucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1hcElu",
+            "dDMyRmxvYXRFbnRyeRJNChBtYXBfaW50MzJfZG91YmxlGAwgAygLMjMucHJv",
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1hcEludDMyRG91YmxlRW50",
+            "cnkSRwoNbWFwX2Jvb2xfYm9vbBgNIAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0",
+            "LlRlc3RBcmVuYU1hcC5NYXBCb29sQm9vbEVudHJ5EkkKDm1hcF9pbnQzMl9l",
+            "bnVtGA4gAygLMjEucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1h",
+            "cEludDMyRW51bUVudHJ5El4KGW1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UY",
+            "DyADKAsyOy5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwSW50",
+            "MzJGb3JlaWduTWVzc2FnZUVudHJ5GjQKEk1hcEludDMySW50MzJFbnRyeRIL",
+            "CgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50",
+            "NjRFbnRyeRILCgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1h",
+            "cFVpbnQzMlVpbnQzMkVudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEo",
+            "DToCOAEaNgoUTWFwVWludDY0VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0K",
+            "BXZhbHVlGAIgASgEOgI4ARo2ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNr",
+            "ZXkYASABKBESDQoFdmFsdWUYAiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2",
+            "NEVudHJ5EgsKA2tleRgBIAEoEhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFw",
+            "Rml4ZWQzMkZpeGVkMzJFbnRyeRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiAB",
+            "KAc6AjgBGjgKFk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgG",
+            "Eg0KBXZhbHVlGAIgASgGOgI4ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50",
+            "cnkSCwoDa2V5GAEgASgPEg0KBXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4",
+            "ZWQ2NFNmaXhlZDY0RW50cnkSCwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQ",
+            "OgI4ARo0ChJNYXBJbnQzMkZsb2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZh",
+            "bHVlGAIgASgCOgI4ARo1ChNNYXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgB",
+            "IAEoBRINCgV2YWx1ZRgCIAEoAToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRIL",
+            "CgNrZXkYASABKAgSDQoFdmFsdWUYAiABKAg6AjgBGk8KEU1hcEludDMyRW51",
+            "bUVudHJ5EgsKA2tleRgBIAEoBRIpCgV2YWx1ZRgCIAEoDjIaLnByb3RvYnVm",
+            "X3VuaXR0ZXN0Lk1hcEVudW06AjgBGmAKG01hcEludDMyRm9yZWlnbk1lc3Nh",
+            "Z2VFbnRyeRILCgNrZXkYASABKAUSMAoFdmFsdWUYAiABKAsyIS5wcm90b2J1",
+            "Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZToCOAEi5AEKH01lc3NhZ2VDb250",
+            "YWluaW5nRW51bUNhbGxlZFR5cGUSSgoEdHlwZRgBIAMoCzI8LnByb3RvYnVm",
+            "X3VuaXR0ZXN0Lk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUuVHlw",
+            "ZUVudHJ5Gl8KCVR5cGVFbnRyeRILCgNrZXkYASABKAUSQQoFdmFsdWUYAiAB",
+            "KAsyMi5wcm90b2J1Zl91bml0dGVzdC5NZXNzYWdlQ29udGFpbmluZ0VudW1D",
+            "YWxsZWRUeXBlOgI4ASIUCgRUeXBlEgwKCFRZUEVfRk9PEAAinQEKH01lc3Nh",
+            "Z2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkSTAoFZW50cnkYASADKAsyPS5w",
+            "cm90b2J1Zl91bml0dGVzdC5NZXNzYWdlQ29udGFpbmluZ01hcENhbGxlZEVu",
+            "dHJ5LkVudHJ5RW50cnkaLAoKRW50cnlFbnRyeRILCgNrZXkYASABKAUSDQoF",
+            "dmFsdWUYAiABKAU6AjgBKj8KB01hcEVudW0SEAoMTUFQX0VOVU1fRk9PEAAS",
+            "EAoMTUFQX0VOVU1fQkFSEAESEAoMTUFQX0VOVU1fQkFaEAJCIPgBAaoCGkdv",
+            "b2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zYgZwcm90bzM="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor, },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.MapEnum), }, new pbr::GeneratedClrTypeInfo[] {
@@ -174,32 +173,27 @@
 
   #region Messages
   /// <summary>
-  /// Tests maps.
+  ///  Tests maps.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestMap : pb::IMessage<TestMap> {
     private static readonly pb::MessageParser<TestMap> _parser = new pb::MessageParser<TestMap>(() => new TestMap());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestMap> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMap() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMap(TestMap other) : this() {
       mapInt32Int32_ = other.mapInt32Int32_.Clone();
       mapInt64Int64_ = other.mapInt64Int64_.Clone();
@@ -218,10 +212,8 @@
       mapInt32Bytes_ = other.mapInt32Bytes_.Clone();
       mapInt32Enum_ = other.mapInt32Enum_.Clone();
       mapInt32ForeignMessage_ = other.mapInt32ForeignMessage_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMap Clone() {
       return new TestMap(this);
     }
@@ -231,7 +223,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
     private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> MapInt32Int32 {
       get { return mapInt32Int32_; }
     }
@@ -241,7 +232,6 @@
     private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
         = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 18);
     private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<long, long> MapInt64Int64 {
       get { return mapInt64Int64_; }
     }
@@ -251,7 +241,6 @@
     private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
         = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 26);
     private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<uint, uint> MapUint32Uint32 {
       get { return mapUint32Uint32_; }
     }
@@ -261,7 +250,6 @@
     private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
         = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 34);
     private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<ulong, ulong> MapUint64Uint64 {
       get { return mapUint64Uint64_; }
     }
@@ -271,7 +259,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 42);
     private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> MapSint32Sint32 {
       get { return mapSint32Sint32_; }
     }
@@ -281,7 +268,6 @@
     private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
         = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 50);
     private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<long, long> MapSint64Sint64 {
       get { return mapSint64Sint64_; }
     }
@@ -291,7 +277,6 @@
     private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
         = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 58);
     private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<uint, uint> MapFixed32Fixed32 {
       get { return mapFixed32Fixed32_; }
     }
@@ -301,7 +286,6 @@
     private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
         = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 66);
     private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
       get { return mapFixed64Fixed64_; }
     }
@@ -311,7 +295,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 74);
     private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> MapSfixed32Sfixed32 {
       get { return mapSfixed32Sfixed32_; }
     }
@@ -321,7 +304,6 @@
     private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
         = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 82);
     private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<long, long> MapSfixed64Sfixed64 {
       get { return mapSfixed64Sfixed64_; }
     }
@@ -331,7 +313,6 @@
     private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
         = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 90);
     private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, float> MapInt32Float {
       get { return mapInt32Float_; }
     }
@@ -341,7 +322,6 @@
     private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
         = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 98);
     private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, double> MapInt32Double {
       get { return mapInt32Double_; }
     }
@@ -351,7 +331,6 @@
     private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
         = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 106);
     private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<bool, bool> MapBoolBool {
       get { return mapBoolBool_; }
     }
@@ -361,7 +340,6 @@
     private static readonly pbc::MapField<string, string>.Codec _map_mapStringString_codec
         = new pbc::MapField<string, string>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForString(18), 114);
     private readonly pbc::MapField<string, string> mapStringString_ = new pbc::MapField<string, string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<string, string> MapStringString {
       get { return mapStringString_; }
     }
@@ -371,7 +349,6 @@
     private static readonly pbc::MapField<int, pb::ByteString>.Codec _map_mapInt32Bytes_codec
         = new pbc::MapField<int, pb::ByteString>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForBytes(18), 122);
     private readonly pbc::MapField<int, pb::ByteString> mapInt32Bytes_ = new pbc::MapField<int, pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, pb::ByteString> MapInt32Bytes {
       get { return mapInt32Bytes_; }
     }
@@ -381,7 +358,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec _map_mapInt32Enum_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Google.Protobuf.TestProtos.MapEnum) x), 130);
     private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> mapInt32Enum_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> MapInt32Enum {
       get { return mapInt32Enum_; }
     }
@@ -391,17 +367,14 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec _map_mapInt32ForeignMessage_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.ForeignMessage.Parser), 138);
     private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> mapInt32ForeignMessage_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> MapInt32ForeignMessage {
       get { return mapInt32ForeignMessage_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestMap);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestMap other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -426,10 +399,9 @@
       if (!MapInt32Bytes.Equals(other.MapInt32Bytes)) return false;
       if (!MapInt32Enum.Equals(other.MapInt32Enum)) return false;
       if (!MapInt32ForeignMessage.Equals(other.MapInt32ForeignMessage)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= MapInt32Int32.GetHashCode();
@@ -449,18 +421,13 @@
       hash ^= MapInt32Bytes.GetHashCode();
       hash ^= MapInt32Enum.GetHashCode();
       hash ^= MapInt32ForeignMessage.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
       mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
@@ -479,12 +446,8 @@
       mapInt32Bytes_.WriteTo(output, _map_mapInt32Bytes_codec);
       mapInt32Enum_.WriteTo(output, _map_mapInt32Enum_codec);
       mapInt32ForeignMessage_.WriteTo(output, _map_mapInt32ForeignMessage_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
@@ -504,13 +467,9 @@
       size += mapInt32Bytes_.CalculateSize(_map_mapInt32Bytes_codec);
       size += mapInt32Enum_.CalculateSize(_map_mapInt32Enum_codec);
       size += mapInt32ForeignMessage_.CalculateSize(_map_mapInt32ForeignMessage_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestMap other) {
       if (other == null) {
         return;
@@ -532,16 +491,14 @@
       mapInt32Bytes_.Add(other.mapInt32Bytes_);
       mapInt32Enum_.Add(other.mapInt32Enum_);
       mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
@@ -617,36 +574,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestMapSubmessage : pb::IMessage<TestMapSubmessage> {
     private static readonly pb::MessageParser<TestMapSubmessage> _parser = new pb::MessageParser<TestMapSubmessage>(() => new TestMapSubmessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestMapSubmessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMapSubmessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMapSubmessage(TestMapSubmessage other) : this() {
       TestMap = other.testMap_ != null ? other.TestMap.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMapSubmessage Clone() {
       return new TestMapSubmessage(this);
     }
@@ -654,7 +604,6 @@
     /// <summary>Field number for the "test_map" field.</summary>
     public const int TestMapFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestMap testMap_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestMap TestMap {
       get { return testMap_; }
       set {
@@ -662,12 +611,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestMapSubmessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestMapSubmessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -676,48 +623,34 @@
         return true;
       }
       if (!object.Equals(TestMap, other.TestMap)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (testMap_ != null) hash ^= TestMap.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (testMap_ != null) {
         output.WriteRawTag(10);
         output.WriteMessage(TestMap);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (testMap_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(TestMap);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestMapSubmessage other) {
       if (other == null) {
         return;
@@ -728,16 +661,14 @@
         }
         TestMap.MergeFrom(other.TestMap);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (testMap_ == null) {
@@ -752,36 +683,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestMessageMap : pb::IMessage<TestMessageMap> {
     private static readonly pb::MessageParser<TestMessageMap> _parser = new pb::MessageParser<TestMessageMap>(() => new TestMessageMap());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestMessageMap> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMessageMap() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMessageMap(TestMessageMap other) : this() {
       mapInt32Message_ = other.mapInt32Message_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMessageMap Clone() {
       return new TestMessageMap(this);
     }
@@ -791,17 +715,14 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec _map_mapInt32Message_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.TestAllTypes.Parser), 10);
     private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes> mapInt32Message_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes> MapInt32Message {
       get { return mapInt32Message_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestMessageMap);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestMessageMap other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -810,58 +731,42 @@
         return true;
       }
       if (!MapInt32Message.Equals(other.MapInt32Message)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= MapInt32Message.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       mapInt32Message_.WriteTo(output, _map_mapInt32Message_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += mapInt32Message_.CalculateSize(_map_mapInt32Message_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestMessageMap other) {
       if (other == null) {
         return;
       }
       mapInt32Message_.Add(other.mapInt32Message_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             mapInt32Message_.AddEntriesFrom(input, _map_mapInt32Message_codec);
@@ -874,39 +779,32 @@
   }
 
   /// <summary>
-  /// Two map fields share the same entry default instance.
+  ///  Two map fields share the same entry default instance.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestSameTypeMap : pb::IMessage<TestSameTypeMap> {
     private static readonly pb::MessageParser<TestSameTypeMap> _parser = new pb::MessageParser<TestSameTypeMap>(() => new TestSameTypeMap());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestSameTypeMap> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestSameTypeMap() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestSameTypeMap(TestSameTypeMap other) : this() {
       map1_ = other.map1_.Clone();
       map2_ = other.map2_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestSameTypeMap Clone() {
       return new TestSameTypeMap(this);
     }
@@ -916,7 +814,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_map1_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
     private readonly pbc::MapField<int, int> map1_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> Map1 {
       get { return map1_; }
     }
@@ -926,17 +823,14 @@
     private static readonly pbc::MapField<int, int>.Codec _map_map2_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 18);
     private readonly pbc::MapField<int, int> map2_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> Map2 {
       get { return map2_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestSameTypeMap);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestSameTypeMap other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -946,62 +840,46 @@
       }
       if (!Map1.Equals(other.Map1)) return false;
       if (!Map2.Equals(other.Map2)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= Map1.GetHashCode();
       hash ^= Map2.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       map1_.WriteTo(output, _map_map1_codec);
       map2_.WriteTo(output, _map_map2_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += map1_.CalculateSize(_map_map1_codec);
       size += map2_.CalculateSize(_map_map2_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestSameTypeMap other) {
       if (other == null) {
         return;
       }
       map1_.Add(other.map1_);
       map2_.Add(other.map2_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             map1_.AddEntriesFrom(input, _map_map1_codec);
@@ -1017,30 +895,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestArenaMap : pb::IMessage<TestArenaMap> {
     private static readonly pb::MessageParser<TestArenaMap> _parser = new pb::MessageParser<TestArenaMap>(() => new TestArenaMap());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestArenaMap> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[4]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestArenaMap() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestArenaMap(TestArenaMap other) : this() {
       mapInt32Int32_ = other.mapInt32Int32_.Clone();
       mapInt64Int64_ = other.mapInt64Int64_.Clone();
@@ -1057,10 +930,8 @@
       mapBoolBool_ = other.mapBoolBool_.Clone();
       mapInt32Enum_ = other.mapInt32Enum_.Clone();
       mapInt32ForeignMessage_ = other.mapInt32ForeignMessage_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestArenaMap Clone() {
       return new TestArenaMap(this);
     }
@@ -1070,7 +941,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
     private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> MapInt32Int32 {
       get { return mapInt32Int32_; }
     }
@@ -1080,7 +950,6 @@
     private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
         = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 18);
     private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<long, long> MapInt64Int64 {
       get { return mapInt64Int64_; }
     }
@@ -1090,7 +959,6 @@
     private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
         = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 26);
     private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<uint, uint> MapUint32Uint32 {
       get { return mapUint32Uint32_; }
     }
@@ -1100,7 +968,6 @@
     private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
         = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 34);
     private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<ulong, ulong> MapUint64Uint64 {
       get { return mapUint64Uint64_; }
     }
@@ -1110,7 +977,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 42);
     private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> MapSint32Sint32 {
       get { return mapSint32Sint32_; }
     }
@@ -1120,7 +986,6 @@
     private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
         = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 50);
     private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<long, long> MapSint64Sint64 {
       get { return mapSint64Sint64_; }
     }
@@ -1130,7 +995,6 @@
     private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
         = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 58);
     private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<uint, uint> MapFixed32Fixed32 {
       get { return mapFixed32Fixed32_; }
     }
@@ -1140,7 +1004,6 @@
     private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
         = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 66);
     private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
       get { return mapFixed64Fixed64_; }
     }
@@ -1150,7 +1013,6 @@
     private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 74);
     private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> MapSfixed32Sfixed32 {
       get { return mapSfixed32Sfixed32_; }
     }
@@ -1160,7 +1022,6 @@
     private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
         = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 82);
     private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<long, long> MapSfixed64Sfixed64 {
       get { return mapSfixed64Sfixed64_; }
     }
@@ -1170,7 +1031,6 @@
     private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
         = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 90);
     private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, float> MapInt32Float {
       get { return mapInt32Float_; }
     }
@@ -1180,7 +1040,6 @@
     private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
         = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 98);
     private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, double> MapInt32Double {
       get { return mapInt32Double_; }
     }
@@ -1190,7 +1049,6 @@
     private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
         = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 106);
     private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<bool, bool> MapBoolBool {
       get { return mapBoolBool_; }
     }
@@ -1200,7 +1058,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec _map_mapInt32Enum_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Google.Protobuf.TestProtos.MapEnum) x), 114);
     private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> mapInt32Enum_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> MapInt32Enum {
       get { return mapInt32Enum_; }
     }
@@ -1210,17 +1067,14 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec _map_mapInt32ForeignMessage_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.ForeignMessage.Parser), 122);
     private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> mapInt32ForeignMessage_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> MapInt32ForeignMessage {
       get { return mapInt32ForeignMessage_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestArenaMap);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestArenaMap other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1243,10 +1097,9 @@
       if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
       if (!MapInt32Enum.Equals(other.MapInt32Enum)) return false;
       if (!MapInt32ForeignMessage.Equals(other.MapInt32ForeignMessage)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= MapInt32Int32.GetHashCode();
@@ -1264,18 +1117,13 @@
       hash ^= MapBoolBool.GetHashCode();
       hash ^= MapInt32Enum.GetHashCode();
       hash ^= MapInt32ForeignMessage.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
       mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
@@ -1292,12 +1140,8 @@
       mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
       mapInt32Enum_.WriteTo(output, _map_mapInt32Enum_codec);
       mapInt32ForeignMessage_.WriteTo(output, _map_mapInt32ForeignMessage_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
@@ -1315,13 +1159,9 @@
       size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
       size += mapInt32Enum_.CalculateSize(_map_mapInt32Enum_codec);
       size += mapInt32ForeignMessage_.CalculateSize(_map_mapInt32ForeignMessage_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestArenaMap other) {
       if (other == null) {
         return;
@@ -1341,16 +1181,14 @@
       mapBoolBool_.Add(other.mapBoolBool_);
       mapInt32Enum_.Add(other.mapInt32Enum_);
       mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
@@ -1419,39 +1257,32 @@
   }
 
   /// <summary>
-  /// Previously, message containing enum called Type cannot be used as value of
-  /// map field.
+  ///  Previously, message containing enum called Type cannot be used as value of
+  ///  map field.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class MessageContainingEnumCalledType : pb::IMessage<MessageContainingEnumCalledType> {
     private static readonly pb::MessageParser<MessageContainingEnumCalledType> _parser = new pb::MessageParser<MessageContainingEnumCalledType>(() => new MessageContainingEnumCalledType());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MessageContainingEnumCalledType> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[5]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageContainingEnumCalledType() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageContainingEnumCalledType(MessageContainingEnumCalledType other) : this() {
       type_ = other.type_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageContainingEnumCalledType Clone() {
       return new MessageContainingEnumCalledType(this);
     }
@@ -1461,17 +1292,14 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec _map_type_codec
         = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Parser), 10);
     private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> type_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> Type {
       get { return type_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MessageContainingEnumCalledType);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MessageContainingEnumCalledType other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1480,58 +1308,42 @@
         return true;
       }
       if (!Type.Equals(other.Type)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= Type.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       type_.WriteTo(output, _map_type_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += type_.CalculateSize(_map_type_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MessageContainingEnumCalledType other) {
       if (other == null) {
         return;
       }
       type_.Add(other.type_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             type_.AddEntriesFrom(input, _map_type_codec);
@@ -1543,7 +1355,7 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the MessageContainingEnumCalledType message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       public enum Type {
         [pbr::OriginalName("TYPE_FOO")] Foo = 0,
@@ -1555,38 +1367,31 @@
   }
 
   /// <summary>
-  /// Previously, message cannot contain map field called "entry".
+  ///  Previously, message cannot contain map field called "entry".
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class MessageContainingMapCalledEntry : pb::IMessage<MessageContainingMapCalledEntry> {
     private static readonly pb::MessageParser<MessageContainingMapCalledEntry> _parser = new pb::MessageParser<MessageContainingMapCalledEntry>(() => new MessageContainingMapCalledEntry());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MessageContainingMapCalledEntry> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.MapUnittestProto3Reflection.Descriptor.MessageTypes[6]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageContainingMapCalledEntry() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageContainingMapCalledEntry(MessageContainingMapCalledEntry other) : this() {
       entry_ = other.entry_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageContainingMapCalledEntry Clone() {
       return new MessageContainingMapCalledEntry(this);
     }
@@ -1596,17 +1401,14 @@
     private static readonly pbc::MapField<int, int>.Codec _map_entry_codec
         = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
     private readonly pbc::MapField<int, int> entry_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int> Entry {
       get { return entry_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MessageContainingMapCalledEntry);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MessageContainingMapCalledEntry other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1615,58 +1417,42 @@
         return true;
       }
       if (!Entry.Equals(other.Entry)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= Entry.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       entry_.WriteTo(output, _map_entry_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += entry_.CalculateSize(_map_entry_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MessageContainingMapCalledEntry other) {
       if (other == null) {
         return;
       }
       entry_.Add(other.entry_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             entry_.AddEntriesFrom(input, _map_entry_codec);
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/TestMessagesProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/TestMessagesProto3.cs
deleted file mode 100644
index a2a236d..0000000
--- a/csharp/src/Google.Protobuf.Test/TestProtos/TestMessagesProto3.cs
+++ /dev/null
@@ -1,3733 +0,0 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/test_messages_proto3.proto
-// </auto-generated>
-#pragma warning disable 1591, 0612, 3021
-#region Designer generated code
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-namespace ProtobufTestMessages.Proto3 {
-
-  /// <summary>Holder for reflection information generated from google/protobuf/test_messages_proto3.proto</summary>
-  public static partial class TestMessagesProto3Reflection {
-
-    #region Descriptor
-    /// <summary>File descriptor for google/protobuf/test_messages_proto3.proto</summary>
-    public static pbr::FileDescriptor Descriptor {
-      get { return descriptor; }
-    }
-    private static pbr::FileDescriptor descriptor;
-
-    static TestMessagesProto3Reflection() {
-      byte[] descriptorData = global::System.Convert.FromBase64String(
-          string.Concat(
-            "Cipnb29nbGUvcHJvdG9idWYvdGVzdF9tZXNzYWdlc19wcm90bzMucHJvdG8S",
-            "HXByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zGhlnb29nbGUvcHJvdG9i",
-            "dWYvYW55LnByb3RvGh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8a",
-            "IGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvGhxnb29nbGUvcHJv",
-            "dG9idWYvc3RydWN0LnByb3RvGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1w",
-            "LnByb3RvGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8itDsKElRl",
-            "c3RBbGxUeXBlc1Byb3RvMxIWCg5vcHRpb25hbF9pbnQzMhgBIAEoBRIWCg5v",
-            "cHRpb25hbF9pbnQ2NBgCIAEoAxIXCg9vcHRpb25hbF91aW50MzIYAyABKA0S",
-            "FwoPb3B0aW9uYWxfdWludDY0GAQgASgEEhcKD29wdGlvbmFsX3NpbnQzMhgF",
-            "IAEoERIXCg9vcHRpb25hbF9zaW50NjQYBiABKBISGAoQb3B0aW9uYWxfZml4",
-            "ZWQzMhgHIAEoBxIYChBvcHRpb25hbF9maXhlZDY0GAggASgGEhkKEW9wdGlv",
-            "bmFsX3NmaXhlZDMyGAkgASgPEhkKEW9wdGlvbmFsX3NmaXhlZDY0GAogASgQ",
-            "EhYKDm9wdGlvbmFsX2Zsb2F0GAsgASgCEhcKD29wdGlvbmFsX2RvdWJsZRgM",
-            "IAEoARIVCg1vcHRpb25hbF9ib29sGA0gASgIEhcKD29wdGlvbmFsX3N0cmlu",
-            "ZxgOIAEoCRIWCg5vcHRpb25hbF9ieXRlcxgPIAEoDBJgChdvcHRpb25hbF9u",
-            "ZXN0ZWRfbWVzc2FnZRgSIAEoCzI/LnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMu",
-            "cHJvdG8zLlRlc3RBbGxUeXBlc1Byb3RvMy5OZXN0ZWRNZXNzYWdlEk8KGG9w",
-            "dGlvbmFsX2ZvcmVpZ25fbWVzc2FnZRgTIAEoCzItLnByb3RvYnVmX3Rlc3Rf",
-            "bWVzc2FnZXMucHJvdG8zLkZvcmVpZ25NZXNzYWdlEloKFG9wdGlvbmFsX25l",
-            "c3RlZF9lbnVtGBUgASgOMjwucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90",
-            "bzMuVGVzdEFsbFR5cGVzUHJvdG8zLk5lc3RlZEVudW0SSQoVb3B0aW9uYWxf",
-            "Zm9yZWlnbl9lbnVtGBYgASgOMioucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5w",
-            "cm90bzMuRm9yZWlnbkVudW0SIQoVb3B0aW9uYWxfc3RyaW5nX3BpZWNlGBgg",
-            "ASgJQgIIAhIZCg1vcHRpb25hbF9jb3JkGBkgASgJQgIIARJMChFyZWN1cnNp",
-            "dmVfbWVzc2FnZRgbIAEoCzIxLnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJv",
-            "dG8zLlRlc3RBbGxUeXBlc1Byb3RvMxIWCg5yZXBlYXRlZF9pbnQzMhgfIAMo",
-            "BRIWCg5yZXBlYXRlZF9pbnQ2NBggIAMoAxIXCg9yZXBlYXRlZF91aW50MzIY",
-            "ISADKA0SFwoPcmVwZWF0ZWRfdWludDY0GCIgAygEEhcKD3JlcGVhdGVkX3Np",
-            "bnQzMhgjIAMoERIXCg9yZXBlYXRlZF9zaW50NjQYJCADKBISGAoQcmVwZWF0",
-            "ZWRfZml4ZWQzMhglIAMoBxIYChByZXBlYXRlZF9maXhlZDY0GCYgAygGEhkK",
-            "EXJlcGVhdGVkX3NmaXhlZDMyGCcgAygPEhkKEXJlcGVhdGVkX3NmaXhlZDY0",
-            "GCggAygQEhYKDnJlcGVhdGVkX2Zsb2F0GCkgAygCEhcKD3JlcGVhdGVkX2Rv",
-            "dWJsZRgqIAMoARIVCg1yZXBlYXRlZF9ib29sGCsgAygIEhcKD3JlcGVhdGVk",
-            "X3N0cmluZxgsIAMoCRIWCg5yZXBlYXRlZF9ieXRlcxgtIAMoDBJgChdyZXBl",
-            "YXRlZF9uZXN0ZWRfbWVzc2FnZRgwIAMoCzI/LnByb3RvYnVmX3Rlc3RfbWVz",
-            "c2FnZXMucHJvdG8zLlRlc3RBbGxUeXBlc1Byb3RvMy5OZXN0ZWRNZXNzYWdl",
-            "Ek8KGHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZRgxIAMoCzItLnByb3RvYnVm",
-            "X3Rlc3RfbWVzc2FnZXMucHJvdG8zLkZvcmVpZ25NZXNzYWdlEloKFHJlcGVh",
-            "dGVkX25lc3RlZF9lbnVtGDMgAygOMjwucHJvdG9idWZfdGVzdF9tZXNzYWdl",
-            "cy5wcm90bzMuVGVzdEFsbFR5cGVzUHJvdG8zLk5lc3RlZEVudW0SSQoVcmVw",
-            "ZWF0ZWRfZm9yZWlnbl9lbnVtGDQgAygOMioucHJvdG9idWZfdGVzdF9tZXNz",
-            "YWdlcy5wcm90bzMuRm9yZWlnbkVudW0SIQoVcmVwZWF0ZWRfc3RyaW5nX3Bp",
-            "ZWNlGDYgAygJQgIIAhIZCg1yZXBlYXRlZF9jb3JkGDcgAygJQgIIARJdCg9t",
-            "YXBfaW50MzJfaW50MzIYOCADKAsyRC5wcm90b2J1Zl90ZXN0X21lc3NhZ2Vz",
-            "LnByb3RvMy5UZXN0QWxsVHlwZXNQcm90bzMuTWFwSW50MzJJbnQzMkVudHJ5",
-            "El0KD21hcF9pbnQ2NF9pbnQ2NBg5IAMoCzJELnByb3RvYnVmX3Rlc3RfbWVz",
-            "c2FnZXMucHJvdG8zLlRlc3RBbGxUeXBlc1Byb3RvMy5NYXBJbnQ2NEludDY0",
-            "RW50cnkSYQoRbWFwX3VpbnQzMl91aW50MzIYOiADKAsyRi5wcm90b2J1Zl90",
-            "ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxsVHlwZXNQcm90bzMuTWFwVWlu",
-            "dDMyVWludDMyRW50cnkSYQoRbWFwX3VpbnQ2NF91aW50NjQYOyADKAsyRi5w",
-            "cm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxsVHlwZXNQcm90",
-            "bzMuTWFwVWludDY0VWludDY0RW50cnkSYQoRbWFwX3NpbnQzMl9zaW50MzIY",
-            "PCADKAsyRi5wcm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxs",
-            "VHlwZXNQcm90bzMuTWFwU2ludDMyU2ludDMyRW50cnkSYQoRbWFwX3NpbnQ2",
-            "NF9zaW50NjQYPSADKAsyRi5wcm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3Rv",
-            "My5UZXN0QWxsVHlwZXNQcm90bzMuTWFwU2ludDY0U2ludDY0RW50cnkSZQoT",
-            "bWFwX2ZpeGVkMzJfZml4ZWQzMhg+IAMoCzJILnByb3RvYnVmX3Rlc3RfbWVz",
-            "c2FnZXMucHJvdG8zLlRlc3RBbGxUeXBlc1Byb3RvMy5NYXBGaXhlZDMyRml4",
-            "ZWQzMkVudHJ5EmUKE21hcF9maXhlZDY0X2ZpeGVkNjQYPyADKAsySC5wcm90",
-            "b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxsVHlwZXNQcm90bzMu",
-            "TWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRJpChVtYXBfc2ZpeGVkMzJfc2ZpeGVk",
-            "MzIYQCADKAsySi5wcm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0",
-            "QWxsVHlwZXNQcm90bzMuTWFwU2ZpeGVkMzJTZml4ZWQzMkVudHJ5EmkKFW1h",
-            "cF9zZml4ZWQ2NF9zZml4ZWQ2NBhBIAMoCzJKLnByb3RvYnVmX3Rlc3RfbWVz",
-            "c2FnZXMucHJvdG8zLlRlc3RBbGxUeXBlc1Byb3RvMy5NYXBTZml4ZWQ2NFNm",
-            "aXhlZDY0RW50cnkSXQoPbWFwX2ludDMyX2Zsb2F0GEIgAygLMkQucHJvdG9i",
-            "dWZfdGVzdF9tZXNzYWdlcy5wcm90bzMuVGVzdEFsbFR5cGVzUHJvdG8zLk1h",
-            "cEludDMyRmxvYXRFbnRyeRJfChBtYXBfaW50MzJfZG91YmxlGEMgAygLMkUu",
-            "cHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzMuVGVzdEFsbFR5cGVzUHJv",
-            "dG8zLk1hcEludDMyRG91YmxlRW50cnkSWQoNbWFwX2Jvb2xfYm9vbBhEIAMo",
-            "CzJCLnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zLlRlc3RBbGxUeXBl",
-            "c1Byb3RvMy5NYXBCb29sQm9vbEVudHJ5EmEKEW1hcF9zdHJpbmdfc3RyaW5n",
-            "GEUgAygLMkYucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzMuVGVzdEFs",
-            "bFR5cGVzUHJvdG8zLk1hcFN0cmluZ1N0cmluZ0VudHJ5El8KEG1hcF9zdHJp",
-            "bmdfYnl0ZXMYRiADKAsyRS5wcm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3Rv",
-            "My5UZXN0QWxsVHlwZXNQcm90bzMuTWFwU3RyaW5nQnl0ZXNFbnRyeRJwChlt",
-            "YXBfc3RyaW5nX25lc3RlZF9tZXNzYWdlGEcgAygLMk0ucHJvdG9idWZfdGVz",
-            "dF9tZXNzYWdlcy5wcm90bzMuVGVzdEFsbFR5cGVzUHJvdG8zLk1hcFN0cmlu",
-            "Z05lc3RlZE1lc3NhZ2VFbnRyeRJyChptYXBfc3RyaW5nX2ZvcmVpZ25fbWVz",
-            "c2FnZRhIIAMoCzJOLnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zLlRl",
-            "c3RBbGxUeXBlc1Byb3RvMy5NYXBTdHJpbmdGb3JlaWduTWVzc2FnZUVudHJ5",
-            "EmoKFm1hcF9zdHJpbmdfbmVzdGVkX2VudW0YSSADKAsySi5wcm90b2J1Zl90",
-            "ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxsVHlwZXNQcm90bzMuTWFwU3Ry",
-            "aW5nTmVzdGVkRW51bUVudHJ5EmwKF21hcF9zdHJpbmdfZm9yZWlnbl9lbnVt",
-            "GEogAygLMksucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzMuVGVzdEFs",
-            "bFR5cGVzUHJvdG8zLk1hcFN0cmluZ0ZvcmVpZ25FbnVtRW50cnkSFgoMb25l",
-            "b2ZfdWludDMyGG8gASgNSAASXwoUb25lb2ZfbmVzdGVkX21lc3NhZ2UYcCAB",
-            "KAsyPy5wcm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxsVHlw",
-            "ZXNQcm90bzMuTmVzdGVkTWVzc2FnZUgAEhYKDG9uZW9mX3N0cmluZxhxIAEo",
-            "CUgAEhUKC29uZW9mX2J5dGVzGHIgASgMSAASFAoKb25lb2ZfYm9vbBhzIAEo",
-            "CEgAEhYKDG9uZW9mX3VpbnQ2NBh0IAEoBEgAEhUKC29uZW9mX2Zsb2F0GHUg",
-            "ASgCSAASFgoMb25lb2ZfZG91YmxlGHYgASgBSAASUgoKb25lb2ZfZW51bRh3",
-            "IAEoDjI8LnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zLlRlc3RBbGxU",
-            "eXBlc1Byb3RvMy5OZXN0ZWRFbnVtSAASOgoVb3B0aW9uYWxfYm9vbF93cmFw",
-            "cGVyGMkBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSPAoWb3B0",
-            "aW9uYWxfaW50MzJfd3JhcHBlchjKASABKAsyGy5nb29nbGUucHJvdG9idWYu",
-            "SW50MzJWYWx1ZRI8ChZvcHRpb25hbF9pbnQ2NF93cmFwcGVyGMsBIAEoCzIb",
-            "Lmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEj4KF29wdGlvbmFsX3VpbnQz",
-            "Ml93cmFwcGVyGMwBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1",
-            "ZRI+ChdvcHRpb25hbF91aW50NjRfd3JhcHBlchjNASABKAsyHC5nb29nbGUu",
-            "cHJvdG9idWYuVUludDY0VmFsdWUSPAoWb3B0aW9uYWxfZmxvYXRfd3JhcHBl",
-            "chjOASABKAsyGy5nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZRI+ChdvcHRp",
-            "b25hbF9kb3VibGVfd3JhcHBlchjPASABKAsyHC5nb29nbGUucHJvdG9idWYu",
-            "RG91YmxlVmFsdWUSPgoXb3B0aW9uYWxfc3RyaW5nX3dyYXBwZXIY0AEgASgL",
-            "MhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjwKFm9wdGlvbmFsX2J5",
-            "dGVzX3dyYXBwZXIY0QEgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFs",
-            "dWUSOgoVcmVwZWF0ZWRfYm9vbF93cmFwcGVyGNMBIAMoCzIaLmdvb2dsZS5w",
-            "cm90b2J1Zi5Cb29sVmFsdWUSPAoWcmVwZWF0ZWRfaW50MzJfd3JhcHBlchjU",
-            "ASADKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZRI8ChZyZXBlYXRl",
-            "ZF9pbnQ2NF93cmFwcGVyGNUBIAMoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2",
-            "NFZhbHVlEj4KF3JlcGVhdGVkX3VpbnQzMl93cmFwcGVyGNYBIAMoCzIcLmdv",
-            "b2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZRI+ChdyZXBlYXRlZF91aW50NjRf",
-            "d3JhcHBlchjXASADKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUS",
-            "PAoWcmVwZWF0ZWRfZmxvYXRfd3JhcHBlchjYASADKAsyGy5nb29nbGUucHJv",
-            "dG9idWYuRmxvYXRWYWx1ZRI+ChdyZXBlYXRlZF9kb3VibGVfd3JhcHBlchjZ",
-            "ASADKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSPgoXcmVwZWF0",
-            "ZWRfc3RyaW5nX3dyYXBwZXIY2gEgAygLMhwuZ29vZ2xlLnByb3RvYnVmLlN0",
-            "cmluZ1ZhbHVlEjwKFnJlcGVhdGVkX2J5dGVzX3dyYXBwZXIY2wEgAygLMhsu",
-            "Z29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWUSNQoRb3B0aW9uYWxfZHVyYXRp",
-            "b24YrQIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEjcKEm9wdGlv",
-            "bmFsX3RpbWVzdGFtcBiuAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0",
-            "YW1wEjgKE29wdGlvbmFsX2ZpZWxkX21hc2sYrwIgASgLMhouZ29vZ2xlLnBy",
-            "b3RvYnVmLkZpZWxkTWFzaxIxCg9vcHRpb25hbF9zdHJ1Y3QYsAIgASgLMhcu",
-            "Z29vZ2xlLnByb3RvYnVmLlN0cnVjdBIrCgxvcHRpb25hbF9hbnkYsQIgASgL",
-            "MhQuZ29vZ2xlLnByb3RvYnVmLkFueRIvCg5vcHRpb25hbF92YWx1ZRiyAiAB",
-            "KAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWUSNQoRcmVwZWF0ZWRfZHVyYXRp",
-            "b24YtwIgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEjcKEnJlcGVh",
-            "dGVkX3RpbWVzdGFtcBi4AiADKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0",
-            "YW1wEjcKEnJlcGVhdGVkX2ZpZWxkbWFzaxi5AiADKAsyGi5nb29nbGUucHJv",
-            "dG9idWYuRmllbGRNYXNrEjEKD3JlcGVhdGVkX3N0cnVjdBjEAiADKAsyFy5n",
-            "b29nbGUucHJvdG9idWYuU3RydWN0EisKDHJlcGVhdGVkX2FueRi7AiADKAsy",
-            "FC5nb29nbGUucHJvdG9idWYuQW55Ei8KDnJlcGVhdGVkX3ZhbHVlGLwCIAMo",
-            "CzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZRITCgpmaWVsZG5hbWUxGJEDIAEo",
-            "BRIUCgtmaWVsZF9uYW1lMhiSAyABKAUSFQoMX2ZpZWxkX25hbWUzGJMDIAEo",
-            "BRIWCg1maWVsZF9fbmFtZTRfGJQDIAEoBRIUCgtmaWVsZDBuYW1lNRiVAyAB",
-            "KAUSFgoNZmllbGRfMF9uYW1lNhiWAyABKAUSEwoKZmllbGROYW1lNxiXAyAB",
-            "KAUSEwoKRmllbGROYW1lOBiYAyABKAUSFAoLZmllbGRfTmFtZTkYmQMgASgF",
-            "EhUKDEZpZWxkX05hbWUxMBiaAyABKAUSFQoMRklFTERfTkFNRTExGJsDIAEo",
-            "BRIVCgxGSUVMRF9uYW1lMTIYnAMgASgFEhcKDl9fZmllbGRfbmFtZTEzGJ0D",
-            "IAEoBRIXCg5fX0ZpZWxkX25hbWUxNBieAyABKAUSFgoNZmllbGRfX25hbWUx",
-            "NRifAyABKAUSFgoNZmllbGRfX05hbWUxNhigAyABKAUSFwoOZmllbGRfbmFt",
-            "ZTE3X18YoQMgASgFEhcKDkZpZWxkX25hbWUxOF9fGKIDIAEoBRpiCg1OZXN0",
-            "ZWRNZXNzYWdlEgkKAWEYASABKAUSRgoLY29yZWN1cnNpdmUYAiABKAsyMS5w",
-            "cm90b2J1Zl90ZXN0X21lc3NhZ2VzLnByb3RvMy5UZXN0QWxsVHlwZXNQcm90",
-            "bzMaNAoSTWFwSW50MzJJbnQzMkVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1",
-            "ZRgCIAEoBToCOAEaNAoSTWFwSW50NjRJbnQ2NEVudHJ5EgsKA2tleRgBIAEo",
-            "AxINCgV2YWx1ZRgCIAEoAzoCOAEaNgoUTWFwVWludDMyVWludDMyRW50cnkS",
-            "CwoDa2V5GAEgASgNEg0KBXZhbHVlGAIgASgNOgI4ARo2ChRNYXBVaW50NjRV",
-            "aW50NjRFbnRyeRILCgNrZXkYASABKAQSDQoFdmFsdWUYAiABKAQ6AjgBGjYK",
-            "FE1hcFNpbnQzMlNpbnQzMkVudHJ5EgsKA2tleRgBIAEoERINCgV2YWx1ZRgC",
-            "IAEoEToCOAEaNgoUTWFwU2ludDY0U2ludDY0RW50cnkSCwoDa2V5GAEgASgS",
-            "Eg0KBXZhbHVlGAIgASgSOgI4ARo4ChZNYXBGaXhlZDMyRml4ZWQzMkVudHJ5",
-            "EgsKA2tleRgBIAEoBxINCgV2YWx1ZRgCIAEoBzoCOAEaOAoWTWFwRml4ZWQ2",
-            "NEZpeGVkNjRFbnRyeRILCgNrZXkYASABKAYSDQoFdmFsdWUYAiABKAY6AjgB",
-            "GjoKGE1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRILCgNrZXkYASABKA8SDQoF",
-            "dmFsdWUYAiABKA86AjgBGjoKGE1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRIL",
-            "CgNrZXkYASABKBASDQoFdmFsdWUYAiABKBA6AjgBGjQKEk1hcEludDMyRmxv",
-            "YXRFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAI6AjgBGjUKE01h",
-            "cEludDMyRG91YmxlRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgB",
-            "OgI4ARoyChBNYXBCb29sQm9vbEVudHJ5EgsKA2tleRgBIAEoCBINCgV2YWx1",
-            "ZRgCIAEoCDoCOAEaNgoUTWFwU3RyaW5nU3RyaW5nRW50cnkSCwoDa2V5GAEg",
-            "ASgJEg0KBXZhbHVlGAIgASgJOgI4ARo1ChNNYXBTdHJpbmdCeXRlc0VudHJ5",
-            "EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoDDoCOAEafgobTWFwU3RyaW5n",
-            "TmVzdGVkTWVzc2FnZUVudHJ5EgsKA2tleRgBIAEoCRJOCgV2YWx1ZRgCIAEo",
-            "CzI/LnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zLlRlc3RBbGxUeXBl",
-            "c1Byb3RvMy5OZXN0ZWRNZXNzYWdlOgI4ARptChxNYXBTdHJpbmdGb3JlaWdu",
-            "TWVzc2FnZUVudHJ5EgsKA2tleRgBIAEoCRI8CgV2YWx1ZRgCIAEoCzItLnBy",
-            "b3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zLkZvcmVpZ25NZXNzYWdlOgI4",
-            "ARp4ChhNYXBTdHJpbmdOZXN0ZWRFbnVtRW50cnkSCwoDa2V5GAEgASgJEksK",
-            "BXZhbHVlGAIgASgOMjwucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzMu",
-            "VGVzdEFsbFR5cGVzUHJvdG8zLk5lc3RlZEVudW06AjgBGmcKGU1hcFN0cmlu",
-            "Z0ZvcmVpZ25FbnVtRW50cnkSCwoDa2V5GAEgASgJEjkKBXZhbHVlGAIgASgO",
-            "MioucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzMuRm9yZWlnbkVudW06",
-            "AjgBIjkKCk5lc3RlZEVudW0SBwoDRk9PEAASBwoDQkFSEAESBwoDQkFaEAIS",
-            "EAoDTkVHEP///////////wFCDQoLb25lb2ZfZmllbGRKBgj1AxD/AyIbCg5G",
-            "b3JlaWduTWVzc2FnZRIJCgFjGAEgASgFKkAKC0ZvcmVpZ25FbnVtEg8KC0ZP",
-            "UkVJR05fRk9PEAASDwoLRk9SRUlHTl9CQVIQARIPCgtGT1JFSUdOX0JBWhAC",
-            "QjgKKGNvbS5nb29nbGUucHJvdG9idWZfdGVzdF9tZXNzYWdlcy5wcm90bzNI",
-            "AfgBAaICBlByb3RvM2IGcHJvdG8z"));
-      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-          new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, },
-          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ProtobufTestMessages.Proto3.ForeignEnum), }, new pbr::GeneratedClrTypeInfo[] {
-            new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto3.TestAllTypesProto3), global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Parser, new[]{ "OptionalInt32", "OptionalInt64", "OptionalUint32", "OptionalUint64", "OptionalSint32", "OptionalSint64", "OptionalFixed32", "OptionalFixed64", "OptionalSfixed32", "OptionalSfixed64", "OptionalFloat", "OptionalDouble", "OptionalBool", "OptionalString", "OptionalBytes", "OptionalNestedMessage", "OptionalForeignMessage", "OptionalNestedEnum", "OptionalForeignEnum", "OptionalStringPiece", "OptionalCord", "RecursiveMessage", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedStringPiece", "RepeatedCord", "MapInt32Int32", "MapInt64Int64", "MapUint32Uint32", "MapUint64Uint64", "MapSint32Sint32", "MapSint64Sint64", "MapFixed32Fixed32", "MapFixed64Fixed64", "MapSfixed32Sfixed32", "MapSfixed64Sfixed64", "MapInt32Float", "MapInt32Double", "MapBoolBool", "MapStringString", "MapStringBytes", "MapStringNestedMessage", "MapStringForeignMessage", "MapStringNestedEnum", "MapStringForeignEnum", "OneofUint32", "OneofNestedMessage", "OneofString", "OneofBytes", "OneofBool", "OneofUint64", "OneofFloat", "OneofDouble", "OneofEnum", "OptionalBoolWrapper", "OptionalInt32Wrapper", "OptionalInt64Wrapper", "OptionalUint32Wrapper", "OptionalUint64Wrapper", "OptionalFloatWrapper", "OptionalDoubleWrapper", "OptionalStringWrapper", "OptionalBytesWrapper", "RepeatedBoolWrapper", "RepeatedInt32Wrapper", "RepeatedInt64Wrapper", "RepeatedUint32Wrapper", "RepeatedUint64Wrapper", "RepeatedFloatWrapper", "RepeatedDoubleWrapper", "RepeatedStringWrapper", "RepeatedBytesWrapper", "OptionalDuration", "OptionalTimestamp", "OptionalFieldMask", "OptionalStruct", "OptionalAny", "OptionalValue", "RepeatedDuration", "RepeatedTimestamp", "RepeatedFieldmask", "RepeatedStruct", "RepeatedAny", "RepeatedValue", "Fieldname1", "FieldName2", "FieldName3", "FieldName4", "Field0Name5", "Field0Name6", "FieldName7", "FieldName8", "FieldName9", "FieldName10", "FIELDNAME11", "FIELDName12", "FieldName13", "FieldName14", "FieldName15", "FieldName16", "FieldName17", "FieldName18" }, new[]{ "OneofField" }, new[]{ typeof(global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage), global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage.Parser, new[]{ "A", "Corecursive" }, null, null, null),
-            null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, }),
-            new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto3.ForeignMessage), global::ProtobufTestMessages.Proto3.ForeignMessage.Parser, new[]{ "C" }, null, null, null)
-          }));
-    }
-    #endregion
-
-  }
-  #region Enums
-  public enum ForeignEnum {
-    [pbr::OriginalName("FOREIGN_FOO")] ForeignFoo = 0,
-    [pbr::OriginalName("FOREIGN_BAR")] ForeignBar = 1,
-    [pbr::OriginalName("FOREIGN_BAZ")] ForeignBaz = 2,
-  }
-
-  #endregion
-
-  #region Messages
-  /// <summary>
-  /// This proto includes every type of field in both singular and repeated
-  /// forms.
-  ///
-  /// Also, crucially, all messages and enums in this file are eventually
-  /// submessages of this message.  So for example, a fuzz test of TestAllTypes
-  /// could trigger bugs that occur in any message type in this file.  We verify
-  /// this stays true in a unit test.
-  /// </summary>
-  public sealed partial class TestAllTypesProto3 : pb::IMessage<TestAllTypesProto3> {
-    private static readonly pb::MessageParser<TestAllTypesProto3> _parser = new pb::MessageParser<TestAllTypesProto3>(() => new TestAllTypesProto3());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<TestAllTypesProto3> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::ProtobufTestMessages.Proto3.TestMessagesProto3Reflection.Descriptor.MessageTypes[0]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestAllTypesProto3() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestAllTypesProto3(TestAllTypesProto3 other) : this() {
-      optionalInt32_ = other.optionalInt32_;
-      optionalInt64_ = other.optionalInt64_;
-      optionalUint32_ = other.optionalUint32_;
-      optionalUint64_ = other.optionalUint64_;
-      optionalSint32_ = other.optionalSint32_;
-      optionalSint64_ = other.optionalSint64_;
-      optionalFixed32_ = other.optionalFixed32_;
-      optionalFixed64_ = other.optionalFixed64_;
-      optionalSfixed32_ = other.optionalSfixed32_;
-      optionalSfixed64_ = other.optionalSfixed64_;
-      optionalFloat_ = other.optionalFloat_;
-      optionalDouble_ = other.optionalDouble_;
-      optionalBool_ = other.optionalBool_;
-      optionalString_ = other.optionalString_;
-      optionalBytes_ = other.optionalBytes_;
-      OptionalNestedMessage = other.optionalNestedMessage_ != null ? other.OptionalNestedMessage.Clone() : null;
-      OptionalForeignMessage = other.optionalForeignMessage_ != null ? other.OptionalForeignMessage.Clone() : null;
-      optionalNestedEnum_ = other.optionalNestedEnum_;
-      optionalForeignEnum_ = other.optionalForeignEnum_;
-      optionalStringPiece_ = other.optionalStringPiece_;
-      optionalCord_ = other.optionalCord_;
-      RecursiveMessage = other.recursiveMessage_ != null ? other.RecursiveMessage.Clone() : null;
-      repeatedInt32_ = other.repeatedInt32_.Clone();
-      repeatedInt64_ = other.repeatedInt64_.Clone();
-      repeatedUint32_ = other.repeatedUint32_.Clone();
-      repeatedUint64_ = other.repeatedUint64_.Clone();
-      repeatedSint32_ = other.repeatedSint32_.Clone();
-      repeatedSint64_ = other.repeatedSint64_.Clone();
-      repeatedFixed32_ = other.repeatedFixed32_.Clone();
-      repeatedFixed64_ = other.repeatedFixed64_.Clone();
-      repeatedSfixed32_ = other.repeatedSfixed32_.Clone();
-      repeatedSfixed64_ = other.repeatedSfixed64_.Clone();
-      repeatedFloat_ = other.repeatedFloat_.Clone();
-      repeatedDouble_ = other.repeatedDouble_.Clone();
-      repeatedBool_ = other.repeatedBool_.Clone();
-      repeatedString_ = other.repeatedString_.Clone();
-      repeatedBytes_ = other.repeatedBytes_.Clone();
-      repeatedNestedMessage_ = other.repeatedNestedMessage_.Clone();
-      repeatedForeignMessage_ = other.repeatedForeignMessage_.Clone();
-      repeatedNestedEnum_ = other.repeatedNestedEnum_.Clone();
-      repeatedForeignEnum_ = other.repeatedForeignEnum_.Clone();
-      repeatedStringPiece_ = other.repeatedStringPiece_.Clone();
-      repeatedCord_ = other.repeatedCord_.Clone();
-      mapInt32Int32_ = other.mapInt32Int32_.Clone();
-      mapInt64Int64_ = other.mapInt64Int64_.Clone();
-      mapUint32Uint32_ = other.mapUint32Uint32_.Clone();
-      mapUint64Uint64_ = other.mapUint64Uint64_.Clone();
-      mapSint32Sint32_ = other.mapSint32Sint32_.Clone();
-      mapSint64Sint64_ = other.mapSint64Sint64_.Clone();
-      mapFixed32Fixed32_ = other.mapFixed32Fixed32_.Clone();
-      mapFixed64Fixed64_ = other.mapFixed64Fixed64_.Clone();
-      mapSfixed32Sfixed32_ = other.mapSfixed32Sfixed32_.Clone();
-      mapSfixed64Sfixed64_ = other.mapSfixed64Sfixed64_.Clone();
-      mapInt32Float_ = other.mapInt32Float_.Clone();
-      mapInt32Double_ = other.mapInt32Double_.Clone();
-      mapBoolBool_ = other.mapBoolBool_.Clone();
-      mapStringString_ = other.mapStringString_.Clone();
-      mapStringBytes_ = other.mapStringBytes_.Clone();
-      mapStringNestedMessage_ = other.mapStringNestedMessage_.Clone();
-      mapStringForeignMessage_ = other.mapStringForeignMessage_.Clone();
-      mapStringNestedEnum_ = other.mapStringNestedEnum_.Clone();
-      mapStringForeignEnum_ = other.mapStringForeignEnum_.Clone();
-      OptionalBoolWrapper = other.OptionalBoolWrapper;
-      OptionalInt32Wrapper = other.OptionalInt32Wrapper;
-      OptionalInt64Wrapper = other.OptionalInt64Wrapper;
-      OptionalUint32Wrapper = other.OptionalUint32Wrapper;
-      OptionalUint64Wrapper = other.OptionalUint64Wrapper;
-      OptionalFloatWrapper = other.OptionalFloatWrapper;
-      OptionalDoubleWrapper = other.OptionalDoubleWrapper;
-      OptionalStringWrapper = other.OptionalStringWrapper;
-      OptionalBytesWrapper = other.OptionalBytesWrapper;
-      repeatedBoolWrapper_ = other.repeatedBoolWrapper_.Clone();
-      repeatedInt32Wrapper_ = other.repeatedInt32Wrapper_.Clone();
-      repeatedInt64Wrapper_ = other.repeatedInt64Wrapper_.Clone();
-      repeatedUint32Wrapper_ = other.repeatedUint32Wrapper_.Clone();
-      repeatedUint64Wrapper_ = other.repeatedUint64Wrapper_.Clone();
-      repeatedFloatWrapper_ = other.repeatedFloatWrapper_.Clone();
-      repeatedDoubleWrapper_ = other.repeatedDoubleWrapper_.Clone();
-      repeatedStringWrapper_ = other.repeatedStringWrapper_.Clone();
-      repeatedBytesWrapper_ = other.repeatedBytesWrapper_.Clone();
-      OptionalDuration = other.optionalDuration_ != null ? other.OptionalDuration.Clone() : null;
-      OptionalTimestamp = other.optionalTimestamp_ != null ? other.OptionalTimestamp.Clone() : null;
-      OptionalFieldMask = other.optionalFieldMask_ != null ? other.OptionalFieldMask.Clone() : null;
-      OptionalStruct = other.optionalStruct_ != null ? other.OptionalStruct.Clone() : null;
-      OptionalAny = other.optionalAny_ != null ? other.OptionalAny.Clone() : null;
-      OptionalValue = other.optionalValue_ != null ? other.OptionalValue.Clone() : null;
-      repeatedDuration_ = other.repeatedDuration_.Clone();
-      repeatedTimestamp_ = other.repeatedTimestamp_.Clone();
-      repeatedFieldmask_ = other.repeatedFieldmask_.Clone();
-      repeatedStruct_ = other.repeatedStruct_.Clone();
-      repeatedAny_ = other.repeatedAny_.Clone();
-      repeatedValue_ = other.repeatedValue_.Clone();
-      fieldname1_ = other.fieldname1_;
-      fieldName2_ = other.fieldName2_;
-      FieldName3_ = other.FieldName3_;
-      fieldName4_ = other.fieldName4_;
-      field0Name5_ = other.field0Name5_;
-      field0Name6_ = other.field0Name6_;
-      fieldName7_ = other.fieldName7_;
-      fieldName8_ = other.fieldName8_;
-      fieldName9_ = other.fieldName9_;
-      fieldName10_ = other.fieldName10_;
-      fIELDNAME11_ = other.fIELDNAME11_;
-      fIELDName12_ = other.fIELDName12_;
-      FieldName13_ = other.FieldName13_;
-      FieldName14_ = other.FieldName14_;
-      fieldName15_ = other.fieldName15_;
-      fieldName16_ = other.fieldName16_;
-      fieldName17_ = other.fieldName17_;
-      fieldName18_ = other.fieldName18_;
-      switch (other.OneofFieldCase) {
-        case OneofFieldOneofCase.OneofUint32:
-          OneofUint32 = other.OneofUint32;
-          break;
-        case OneofFieldOneofCase.OneofNestedMessage:
-          OneofNestedMessage = other.OneofNestedMessage.Clone();
-          break;
-        case OneofFieldOneofCase.OneofString:
-          OneofString = other.OneofString;
-          break;
-        case OneofFieldOneofCase.OneofBytes:
-          OneofBytes = other.OneofBytes;
-          break;
-        case OneofFieldOneofCase.OneofBool:
-          OneofBool = other.OneofBool;
-          break;
-        case OneofFieldOneofCase.OneofUint64:
-          OneofUint64 = other.OneofUint64;
-          break;
-        case OneofFieldOneofCase.OneofFloat:
-          OneofFloat = other.OneofFloat;
-          break;
-        case OneofFieldOneofCase.OneofDouble:
-          OneofDouble = other.OneofDouble;
-          break;
-        case OneofFieldOneofCase.OneofEnum:
-          OneofEnum = other.OneofEnum;
-          break;
-      }
-
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestAllTypesProto3 Clone() {
-      return new TestAllTypesProto3(this);
-    }
-
-    /// <summary>Field number for the "optional_int32" field.</summary>
-    public const int OptionalInt32FieldNumber = 1;
-    private int optionalInt32_;
-    /// <summary>
-    /// Singular
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int OptionalInt32 {
-      get { return optionalInt32_; }
-      set {
-        optionalInt32_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_int64" field.</summary>
-    public const int OptionalInt64FieldNumber = 2;
-    private long optionalInt64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long OptionalInt64 {
-      get { return optionalInt64_; }
-      set {
-        optionalInt64_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_uint32" field.</summary>
-    public const int OptionalUint32FieldNumber = 3;
-    private uint optionalUint32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public uint OptionalUint32 {
-      get { return optionalUint32_; }
-      set {
-        optionalUint32_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_uint64" field.</summary>
-    public const int OptionalUint64FieldNumber = 4;
-    private ulong optionalUint64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ulong OptionalUint64 {
-      get { return optionalUint64_; }
-      set {
-        optionalUint64_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_sint32" field.</summary>
-    public const int OptionalSint32FieldNumber = 5;
-    private int optionalSint32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int OptionalSint32 {
-      get { return optionalSint32_; }
-      set {
-        optionalSint32_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_sint64" field.</summary>
-    public const int OptionalSint64FieldNumber = 6;
-    private long optionalSint64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long OptionalSint64 {
-      get { return optionalSint64_; }
-      set {
-        optionalSint64_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_fixed32" field.</summary>
-    public const int OptionalFixed32FieldNumber = 7;
-    private uint optionalFixed32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public uint OptionalFixed32 {
-      get { return optionalFixed32_; }
-      set {
-        optionalFixed32_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_fixed64" field.</summary>
-    public const int OptionalFixed64FieldNumber = 8;
-    private ulong optionalFixed64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ulong OptionalFixed64 {
-      get { return optionalFixed64_; }
-      set {
-        optionalFixed64_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_sfixed32" field.</summary>
-    public const int OptionalSfixed32FieldNumber = 9;
-    private int optionalSfixed32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int OptionalSfixed32 {
-      get { return optionalSfixed32_; }
-      set {
-        optionalSfixed32_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_sfixed64" field.</summary>
-    public const int OptionalSfixed64FieldNumber = 10;
-    private long optionalSfixed64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long OptionalSfixed64 {
-      get { return optionalSfixed64_; }
-      set {
-        optionalSfixed64_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_float" field.</summary>
-    public const int OptionalFloatFieldNumber = 11;
-    private float optionalFloat_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public float OptionalFloat {
-      get { return optionalFloat_; }
-      set {
-        optionalFloat_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_double" field.</summary>
-    public const int OptionalDoubleFieldNumber = 12;
-    private double optionalDouble_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public double OptionalDouble {
-      get { return optionalDouble_; }
-      set {
-        optionalDouble_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_bool" field.</summary>
-    public const int OptionalBoolFieldNumber = 13;
-    private bool optionalBool_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool OptionalBool {
-      get { return optionalBool_; }
-      set {
-        optionalBool_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_string" field.</summary>
-    public const int OptionalStringFieldNumber = 14;
-    private string optionalString_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string OptionalString {
-      get { return optionalString_; }
-      set {
-        optionalString_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "optional_bytes" field.</summary>
-    public const int OptionalBytesFieldNumber = 15;
-    private pb::ByteString optionalBytes_ = pb::ByteString.Empty;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pb::ByteString OptionalBytes {
-      get { return optionalBytes_; }
-      set {
-        optionalBytes_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "optional_nested_message" field.</summary>
-    public const int OptionalNestedMessageFieldNumber = 18;
-    private global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage optionalNestedMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage OptionalNestedMessage {
-      get { return optionalNestedMessage_; }
-      set {
-        optionalNestedMessage_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_foreign_message" field.</summary>
-    public const int OptionalForeignMessageFieldNumber = 19;
-    private global::ProtobufTestMessages.Proto3.ForeignMessage optionalForeignMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.ForeignMessage OptionalForeignMessage {
-      get { return optionalForeignMessage_; }
-      set {
-        optionalForeignMessage_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_nested_enum" field.</summary>
-    public const int OptionalNestedEnumFieldNumber = 21;
-    private global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum optionalNestedEnum_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum OptionalNestedEnum {
-      get { return optionalNestedEnum_; }
-      set {
-        optionalNestedEnum_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_foreign_enum" field.</summary>
-    public const int OptionalForeignEnumFieldNumber = 22;
-    private global::ProtobufTestMessages.Proto3.ForeignEnum optionalForeignEnum_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.ForeignEnum OptionalForeignEnum {
-      get { return optionalForeignEnum_; }
-      set {
-        optionalForeignEnum_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_string_piece" field.</summary>
-    public const int OptionalStringPieceFieldNumber = 24;
-    private string optionalStringPiece_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string OptionalStringPiece {
-      get { return optionalStringPiece_; }
-      set {
-        optionalStringPiece_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "optional_cord" field.</summary>
-    public const int OptionalCordFieldNumber = 25;
-    private string optionalCord_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string OptionalCord {
-      get { return optionalCord_; }
-      set {
-        optionalCord_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "recursive_message" field.</summary>
-    public const int RecursiveMessageFieldNumber = 27;
-    private global::ProtobufTestMessages.Proto3.TestAllTypesProto3 recursiveMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.TestAllTypesProto3 RecursiveMessage {
-      get { return recursiveMessage_; }
-      set {
-        recursiveMessage_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "repeated_int32" field.</summary>
-    public const int RepeatedInt32FieldNumber = 31;
-    private static readonly pb::FieldCodec<int> _repeated_repeatedInt32_codec
-        = pb::FieldCodec.ForInt32(250);
-    private readonly pbc::RepeatedField<int> repeatedInt32_ = new pbc::RepeatedField<int>();
-    /// <summary>
-    /// Repeated
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<int> RepeatedInt32 {
-      get { return repeatedInt32_; }
-    }
-
-    /// <summary>Field number for the "repeated_int64" field.</summary>
-    public const int RepeatedInt64FieldNumber = 32;
-    private static readonly pb::FieldCodec<long> _repeated_repeatedInt64_codec
-        = pb::FieldCodec.ForInt64(258);
-    private readonly pbc::RepeatedField<long> repeatedInt64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<long> RepeatedInt64 {
-      get { return repeatedInt64_; }
-    }
-
-    /// <summary>Field number for the "repeated_uint32" field.</summary>
-    public const int RepeatedUint32FieldNumber = 33;
-    private static readonly pb::FieldCodec<uint> _repeated_repeatedUint32_codec
-        = pb::FieldCodec.ForUInt32(266);
-    private readonly pbc::RepeatedField<uint> repeatedUint32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<uint> RepeatedUint32 {
-      get { return repeatedUint32_; }
-    }
-
-    /// <summary>Field number for the "repeated_uint64" field.</summary>
-    public const int RepeatedUint64FieldNumber = 34;
-    private static readonly pb::FieldCodec<ulong> _repeated_repeatedUint64_codec
-        = pb::FieldCodec.ForUInt64(274);
-    private readonly pbc::RepeatedField<ulong> repeatedUint64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<ulong> RepeatedUint64 {
-      get { return repeatedUint64_; }
-    }
-
-    /// <summary>Field number for the "repeated_sint32" field.</summary>
-    public const int RepeatedSint32FieldNumber = 35;
-    private static readonly pb::FieldCodec<int> _repeated_repeatedSint32_codec
-        = pb::FieldCodec.ForSInt32(282);
-    private readonly pbc::RepeatedField<int> repeatedSint32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<int> RepeatedSint32 {
-      get { return repeatedSint32_; }
-    }
-
-    /// <summary>Field number for the "repeated_sint64" field.</summary>
-    public const int RepeatedSint64FieldNumber = 36;
-    private static readonly pb::FieldCodec<long> _repeated_repeatedSint64_codec
-        = pb::FieldCodec.ForSInt64(290);
-    private readonly pbc::RepeatedField<long> repeatedSint64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<long> RepeatedSint64 {
-      get { return repeatedSint64_; }
-    }
-
-    /// <summary>Field number for the "repeated_fixed32" field.</summary>
-    public const int RepeatedFixed32FieldNumber = 37;
-    private static readonly pb::FieldCodec<uint> _repeated_repeatedFixed32_codec
-        = pb::FieldCodec.ForFixed32(298);
-    private readonly pbc::RepeatedField<uint> repeatedFixed32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<uint> RepeatedFixed32 {
-      get { return repeatedFixed32_; }
-    }
-
-    /// <summary>Field number for the "repeated_fixed64" field.</summary>
-    public const int RepeatedFixed64FieldNumber = 38;
-    private static readonly pb::FieldCodec<ulong> _repeated_repeatedFixed64_codec
-        = pb::FieldCodec.ForFixed64(306);
-    private readonly pbc::RepeatedField<ulong> repeatedFixed64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<ulong> RepeatedFixed64 {
-      get { return repeatedFixed64_; }
-    }
-
-    /// <summary>Field number for the "repeated_sfixed32" field.</summary>
-    public const int RepeatedSfixed32FieldNumber = 39;
-    private static readonly pb::FieldCodec<int> _repeated_repeatedSfixed32_codec
-        = pb::FieldCodec.ForSFixed32(314);
-    private readonly pbc::RepeatedField<int> repeatedSfixed32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<int> RepeatedSfixed32 {
-      get { return repeatedSfixed32_; }
-    }
-
-    /// <summary>Field number for the "repeated_sfixed64" field.</summary>
-    public const int RepeatedSfixed64FieldNumber = 40;
-    private static readonly pb::FieldCodec<long> _repeated_repeatedSfixed64_codec
-        = pb::FieldCodec.ForSFixed64(322);
-    private readonly pbc::RepeatedField<long> repeatedSfixed64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<long> RepeatedSfixed64 {
-      get { return repeatedSfixed64_; }
-    }
-
-    /// <summary>Field number for the "repeated_float" field.</summary>
-    public const int RepeatedFloatFieldNumber = 41;
-    private static readonly pb::FieldCodec<float> _repeated_repeatedFloat_codec
-        = pb::FieldCodec.ForFloat(330);
-    private readonly pbc::RepeatedField<float> repeatedFloat_ = new pbc::RepeatedField<float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<float> RepeatedFloat {
-      get { return repeatedFloat_; }
-    }
-
-    /// <summary>Field number for the "repeated_double" field.</summary>
-    public const int RepeatedDoubleFieldNumber = 42;
-    private static readonly pb::FieldCodec<double> _repeated_repeatedDouble_codec
-        = pb::FieldCodec.ForDouble(338);
-    private readonly pbc::RepeatedField<double> repeatedDouble_ = new pbc::RepeatedField<double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<double> RepeatedDouble {
-      get { return repeatedDouble_; }
-    }
-
-    /// <summary>Field number for the "repeated_bool" field.</summary>
-    public const int RepeatedBoolFieldNumber = 43;
-    private static readonly pb::FieldCodec<bool> _repeated_repeatedBool_codec
-        = pb::FieldCodec.ForBool(346);
-    private readonly pbc::RepeatedField<bool> repeatedBool_ = new pbc::RepeatedField<bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<bool> RepeatedBool {
-      get { return repeatedBool_; }
-    }
-
-    /// <summary>Field number for the "repeated_string" field.</summary>
-    public const int RepeatedStringFieldNumber = 44;
-    private static readonly pb::FieldCodec<string> _repeated_repeatedString_codec
-        = pb::FieldCodec.ForString(354);
-    private readonly pbc::RepeatedField<string> repeatedString_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<string> RepeatedString {
-      get { return repeatedString_; }
-    }
-
-    /// <summary>Field number for the "repeated_bytes" field.</summary>
-    public const int RepeatedBytesFieldNumber = 45;
-    private static readonly pb::FieldCodec<pb::ByteString> _repeated_repeatedBytes_codec
-        = pb::FieldCodec.ForBytes(362);
-    private readonly pbc::RepeatedField<pb::ByteString> repeatedBytes_ = new pbc::RepeatedField<pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<pb::ByteString> RepeatedBytes {
-      get { return repeatedBytes_; }
-    }
-
-    /// <summary>Field number for the "repeated_nested_message" field.</summary>
-    public const int RepeatedNestedMessageFieldNumber = 48;
-    private static readonly pb::FieldCodec<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage> _repeated_repeatedNestedMessage_codec
-        = pb::FieldCodec.ForMessage(386, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage.Parser);
-    private readonly pbc::RepeatedField<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage> repeatedNestedMessage_ = new pbc::RepeatedField<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage> RepeatedNestedMessage {
-      get { return repeatedNestedMessage_; }
-    }
-
-    /// <summary>Field number for the "repeated_foreign_message" field.</summary>
-    public const int RepeatedForeignMessageFieldNumber = 49;
-    private static readonly pb::FieldCodec<global::ProtobufTestMessages.Proto3.ForeignMessage> _repeated_repeatedForeignMessage_codec
-        = pb::FieldCodec.ForMessage(394, global::ProtobufTestMessages.Proto3.ForeignMessage.Parser);
-    private readonly pbc::RepeatedField<global::ProtobufTestMessages.Proto3.ForeignMessage> repeatedForeignMessage_ = new pbc::RepeatedField<global::ProtobufTestMessages.Proto3.ForeignMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::ProtobufTestMessages.Proto3.ForeignMessage> RepeatedForeignMessage {
-      get { return repeatedForeignMessage_; }
-    }
-
-    /// <summary>Field number for the "repeated_nested_enum" field.</summary>
-    public const int RepeatedNestedEnumFieldNumber = 51;
-    private static readonly pb::FieldCodec<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum> _repeated_repeatedNestedEnum_codec
-        = pb::FieldCodec.ForEnum(410, x => (int) x, x => (global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum) x);
-    private readonly pbc::RepeatedField<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum> repeatedNestedEnum_ = new pbc::RepeatedField<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum> RepeatedNestedEnum {
-      get { return repeatedNestedEnum_; }
-    }
-
-    /// <summary>Field number for the "repeated_foreign_enum" field.</summary>
-    public const int RepeatedForeignEnumFieldNumber = 52;
-    private static readonly pb::FieldCodec<global::ProtobufTestMessages.Proto3.ForeignEnum> _repeated_repeatedForeignEnum_codec
-        = pb::FieldCodec.ForEnum(418, x => (int) x, x => (global::ProtobufTestMessages.Proto3.ForeignEnum) x);
-    private readonly pbc::RepeatedField<global::ProtobufTestMessages.Proto3.ForeignEnum> repeatedForeignEnum_ = new pbc::RepeatedField<global::ProtobufTestMessages.Proto3.ForeignEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::ProtobufTestMessages.Proto3.ForeignEnum> RepeatedForeignEnum {
-      get { return repeatedForeignEnum_; }
-    }
-
-    /// <summary>Field number for the "repeated_string_piece" field.</summary>
-    public const int RepeatedStringPieceFieldNumber = 54;
-    private static readonly pb::FieldCodec<string> _repeated_repeatedStringPiece_codec
-        = pb::FieldCodec.ForString(434);
-    private readonly pbc::RepeatedField<string> repeatedStringPiece_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<string> RepeatedStringPiece {
-      get { return repeatedStringPiece_; }
-    }
-
-    /// <summary>Field number for the "repeated_cord" field.</summary>
-    public const int RepeatedCordFieldNumber = 55;
-    private static readonly pb::FieldCodec<string> _repeated_repeatedCord_codec
-        = pb::FieldCodec.ForString(442);
-    private readonly pbc::RepeatedField<string> repeatedCord_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<string> RepeatedCord {
-      get { return repeatedCord_; }
-    }
-
-    /// <summary>Field number for the "map_int32_int32" field.</summary>
-    public const int MapInt32Int32FieldNumber = 56;
-    private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
-        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 450);
-    private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
-    /// <summary>
-    /// Map
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<int, int> MapInt32Int32 {
-      get { return mapInt32Int32_; }
-    }
-
-    /// <summary>Field number for the "map_int64_int64" field.</summary>
-    public const int MapInt64Int64FieldNumber = 57;
-    private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
-        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 458);
-    private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<long, long> MapInt64Int64 {
-      get { return mapInt64Int64_; }
-    }
-
-    /// <summary>Field number for the "map_uint32_uint32" field.</summary>
-    public const int MapUint32Uint32FieldNumber = 58;
-    private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
-        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 466);
-    private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<uint, uint> MapUint32Uint32 {
-      get { return mapUint32Uint32_; }
-    }
-
-    /// <summary>Field number for the "map_uint64_uint64" field.</summary>
-    public const int MapUint64Uint64FieldNumber = 59;
-    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
-        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 474);
-    private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<ulong, ulong> MapUint64Uint64 {
-      get { return mapUint64Uint64_; }
-    }
-
-    /// <summary>Field number for the "map_sint32_sint32" field.</summary>
-    public const int MapSint32Sint32FieldNumber = 60;
-    private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
-        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 482);
-    private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<int, int> MapSint32Sint32 {
-      get { return mapSint32Sint32_; }
-    }
-
-    /// <summary>Field number for the "map_sint64_sint64" field.</summary>
-    public const int MapSint64Sint64FieldNumber = 61;
-    private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
-        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 490);
-    private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<long, long> MapSint64Sint64 {
-      get { return mapSint64Sint64_; }
-    }
-
-    /// <summary>Field number for the "map_fixed32_fixed32" field.</summary>
-    public const int MapFixed32Fixed32FieldNumber = 62;
-    private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
-        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 498);
-    private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<uint, uint> MapFixed32Fixed32 {
-      get { return mapFixed32Fixed32_; }
-    }
-
-    /// <summary>Field number for the "map_fixed64_fixed64" field.</summary>
-    public const int MapFixed64Fixed64FieldNumber = 63;
-    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
-        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 506);
-    private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
-      get { return mapFixed64Fixed64_; }
-    }
-
-    /// <summary>Field number for the "map_sfixed32_sfixed32" field.</summary>
-    public const int MapSfixed32Sfixed32FieldNumber = 64;
-    private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
-        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 514);
-    private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<int, int> MapSfixed32Sfixed32 {
-      get { return mapSfixed32Sfixed32_; }
-    }
-
-    /// <summary>Field number for the "map_sfixed64_sfixed64" field.</summary>
-    public const int MapSfixed64Sfixed64FieldNumber = 65;
-    private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
-        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 522);
-    private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<long, long> MapSfixed64Sfixed64 {
-      get { return mapSfixed64Sfixed64_; }
-    }
-
-    /// <summary>Field number for the "map_int32_float" field.</summary>
-    public const int MapInt32FloatFieldNumber = 66;
-    private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
-        = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 530);
-    private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<int, float> MapInt32Float {
-      get { return mapInt32Float_; }
-    }
-
-    /// <summary>Field number for the "map_int32_double" field.</summary>
-    public const int MapInt32DoubleFieldNumber = 67;
-    private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
-        = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 538);
-    private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<int, double> MapInt32Double {
-      get { return mapInt32Double_; }
-    }
-
-    /// <summary>Field number for the "map_bool_bool" field.</summary>
-    public const int MapBoolBoolFieldNumber = 68;
-    private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
-        = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 546);
-    private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<bool, bool> MapBoolBool {
-      get { return mapBoolBool_; }
-    }
-
-    /// <summary>Field number for the "map_string_string" field.</summary>
-    public const int MapStringStringFieldNumber = 69;
-    private static readonly pbc::MapField<string, string>.Codec _map_mapStringString_codec
-        = new pbc::MapField<string, string>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForString(18), 554);
-    private readonly pbc::MapField<string, string> mapStringString_ = new pbc::MapField<string, string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<string, string> MapStringString {
-      get { return mapStringString_; }
-    }
-
-    /// <summary>Field number for the "map_string_bytes" field.</summary>
-    public const int MapStringBytesFieldNumber = 70;
-    private static readonly pbc::MapField<string, pb::ByteString>.Codec _map_mapStringBytes_codec
-        = new pbc::MapField<string, pb::ByteString>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForBytes(18), 562);
-    private readonly pbc::MapField<string, pb::ByteString> mapStringBytes_ = new pbc::MapField<string, pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<string, pb::ByteString> MapStringBytes {
-      get { return mapStringBytes_; }
-    }
-
-    /// <summary>Field number for the "map_string_nested_message" field.</summary>
-    public const int MapStringNestedMessageFieldNumber = 71;
-    private static readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage>.Codec _map_mapStringNestedMessage_codec
-        = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForMessage(18, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage.Parser), 570);
-    private readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage> mapStringNestedMessage_ = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage> MapStringNestedMessage {
-      get { return mapStringNestedMessage_; }
-    }
-
-    /// <summary>Field number for the "map_string_foreign_message" field.</summary>
-    public const int MapStringForeignMessageFieldNumber = 72;
-    private static readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignMessage>.Codec _map_mapStringForeignMessage_codec
-        = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignMessage>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForMessage(18, global::ProtobufTestMessages.Proto3.ForeignMessage.Parser), 578);
-    private readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignMessage> mapStringForeignMessage_ = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignMessage> MapStringForeignMessage {
-      get { return mapStringForeignMessage_; }
-    }
-
-    /// <summary>Field number for the "map_string_nested_enum" field.</summary>
-    public const int MapStringNestedEnumFieldNumber = 73;
-    private static readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum>.Codec _map_mapStringNestedEnum_codec
-        = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum) x), 586);
-    private readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum> mapStringNestedEnum_ = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<string, global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum> MapStringNestedEnum {
-      get { return mapStringNestedEnum_; }
-    }
-
-    /// <summary>Field number for the "map_string_foreign_enum" field.</summary>
-    public const int MapStringForeignEnumFieldNumber = 74;
-    private static readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignEnum>.Codec _map_mapStringForeignEnum_codec
-        = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignEnum>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::ProtobufTestMessages.Proto3.ForeignEnum) x), 594);
-    private readonly pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignEnum> mapStringForeignEnum_ = new pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::MapField<string, global::ProtobufTestMessages.Proto3.ForeignEnum> MapStringForeignEnum {
-      get { return mapStringForeignEnum_; }
-    }
-
-    /// <summary>Field number for the "oneof_uint32" field.</summary>
-    public const int OneofUint32FieldNumber = 111;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public uint OneofUint32 {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofUint32 ? (uint) oneofField_ : 0; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = OneofFieldOneofCase.OneofUint32;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_nested_message" field.</summary>
-    public const int OneofNestedMessageFieldNumber = 112;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage OneofNestedMessage {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage ? (global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage) oneofField_ : null; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.OneofNestedMessage;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_string" field.</summary>
-    public const int OneofStringFieldNumber = 113;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string OneofString {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofString ? (string) oneofField_ : ""; }
-      set {
-        oneofField_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-        oneofFieldCase_ = OneofFieldOneofCase.OneofString;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_bytes" field.</summary>
-    public const int OneofBytesFieldNumber = 114;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pb::ByteString OneofBytes {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofBytes ? (pb::ByteString) oneofField_ : pb::ByteString.Empty; }
-      set {
-        oneofField_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-        oneofFieldCase_ = OneofFieldOneofCase.OneofBytes;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_bool" field.</summary>
-    public const int OneofBoolFieldNumber = 115;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool OneofBool {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofBool ? (bool) oneofField_ : false; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = OneofFieldOneofCase.OneofBool;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_uint64" field.</summary>
-    public const int OneofUint64FieldNumber = 116;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ulong OneofUint64 {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofUint64 ? (ulong) oneofField_ : 0UL; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = OneofFieldOneofCase.OneofUint64;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_float" field.</summary>
-    public const int OneofFloatFieldNumber = 117;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public float OneofFloat {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofFloat ? (float) oneofField_ : 0F; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = OneofFieldOneofCase.OneofFloat;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_double" field.</summary>
-    public const int OneofDoubleFieldNumber = 118;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public double OneofDouble {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofDouble ? (double) oneofField_ : 0D; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = OneofFieldOneofCase.OneofDouble;
-      }
-    }
-
-    /// <summary>Field number for the "oneof_enum" field.</summary>
-    public const int OneofEnumFieldNumber = 119;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum OneofEnum {
-      get { return oneofFieldCase_ == OneofFieldOneofCase.OneofEnum ? (global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum) oneofField_ : 0; }
-      set {
-        oneofField_ = value;
-        oneofFieldCase_ = OneofFieldOneofCase.OneofEnum;
-      }
-    }
-
-    /// <summary>Field number for the "optional_bool_wrapper" field.</summary>
-    public const int OptionalBoolWrapperFieldNumber = 201;
-    private static readonly pb::FieldCodec<bool?> _single_optionalBoolWrapper_codec = pb::FieldCodec.ForStructWrapper<bool>(1610);
-    private bool? optionalBoolWrapper_;
-    /// <summary>
-    /// Well-known types
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool? OptionalBoolWrapper {
-      get { return optionalBoolWrapper_; }
-      set {
-        optionalBoolWrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_int32_wrapper" field.</summary>
-    public const int OptionalInt32WrapperFieldNumber = 202;
-    private static readonly pb::FieldCodec<int?> _single_optionalInt32Wrapper_codec = pb::FieldCodec.ForStructWrapper<int>(1618);
-    private int? optionalInt32Wrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int? OptionalInt32Wrapper {
-      get { return optionalInt32Wrapper_; }
-      set {
-        optionalInt32Wrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_int64_wrapper" field.</summary>
-    public const int OptionalInt64WrapperFieldNumber = 203;
-    private static readonly pb::FieldCodec<long?> _single_optionalInt64Wrapper_codec = pb::FieldCodec.ForStructWrapper<long>(1626);
-    private long? optionalInt64Wrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public long? OptionalInt64Wrapper {
-      get { return optionalInt64Wrapper_; }
-      set {
-        optionalInt64Wrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_uint32_wrapper" field.</summary>
-    public const int OptionalUint32WrapperFieldNumber = 204;
-    private static readonly pb::FieldCodec<uint?> _single_optionalUint32Wrapper_codec = pb::FieldCodec.ForStructWrapper<uint>(1634);
-    private uint? optionalUint32Wrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public uint? OptionalUint32Wrapper {
-      get { return optionalUint32Wrapper_; }
-      set {
-        optionalUint32Wrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_uint64_wrapper" field.</summary>
-    public const int OptionalUint64WrapperFieldNumber = 205;
-    private static readonly pb::FieldCodec<ulong?> _single_optionalUint64Wrapper_codec = pb::FieldCodec.ForStructWrapper<ulong>(1642);
-    private ulong? optionalUint64Wrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ulong? OptionalUint64Wrapper {
-      get { return optionalUint64Wrapper_; }
-      set {
-        optionalUint64Wrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_float_wrapper" field.</summary>
-    public const int OptionalFloatWrapperFieldNumber = 206;
-    private static readonly pb::FieldCodec<float?> _single_optionalFloatWrapper_codec = pb::FieldCodec.ForStructWrapper<float>(1650);
-    private float? optionalFloatWrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public float? OptionalFloatWrapper {
-      get { return optionalFloatWrapper_; }
-      set {
-        optionalFloatWrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_double_wrapper" field.</summary>
-    public const int OptionalDoubleWrapperFieldNumber = 207;
-    private static readonly pb::FieldCodec<double?> _single_optionalDoubleWrapper_codec = pb::FieldCodec.ForStructWrapper<double>(1658);
-    private double? optionalDoubleWrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public double? OptionalDoubleWrapper {
-      get { return optionalDoubleWrapper_; }
-      set {
-        optionalDoubleWrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_string_wrapper" field.</summary>
-    public const int OptionalStringWrapperFieldNumber = 208;
-    private static readonly pb::FieldCodec<string> _single_optionalStringWrapper_codec = pb::FieldCodec.ForClassWrapper<string>(1666);
-    private string optionalStringWrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string OptionalStringWrapper {
-      get { return optionalStringWrapper_; }
-      set {
-        optionalStringWrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_bytes_wrapper" field.</summary>
-    public const int OptionalBytesWrapperFieldNumber = 209;
-    private static readonly pb::FieldCodec<pb::ByteString> _single_optionalBytesWrapper_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(1674);
-    private pb::ByteString optionalBytesWrapper_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pb::ByteString OptionalBytesWrapper {
-      get { return optionalBytesWrapper_; }
-      set {
-        optionalBytesWrapper_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "repeated_bool_wrapper" field.</summary>
-    public const int RepeatedBoolWrapperFieldNumber = 211;
-    private static readonly pb::FieldCodec<bool?> _repeated_repeatedBoolWrapper_codec
-        = pb::FieldCodec.ForStructWrapper<bool>(1690);
-    private readonly pbc::RepeatedField<bool?> repeatedBoolWrapper_ = new pbc::RepeatedField<bool?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<bool?> RepeatedBoolWrapper {
-      get { return repeatedBoolWrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_int32_wrapper" field.</summary>
-    public const int RepeatedInt32WrapperFieldNumber = 212;
-    private static readonly pb::FieldCodec<int?> _repeated_repeatedInt32Wrapper_codec
-        = pb::FieldCodec.ForStructWrapper<int>(1698);
-    private readonly pbc::RepeatedField<int?> repeatedInt32Wrapper_ = new pbc::RepeatedField<int?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<int?> RepeatedInt32Wrapper {
-      get { return repeatedInt32Wrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_int64_wrapper" field.</summary>
-    public const int RepeatedInt64WrapperFieldNumber = 213;
-    private static readonly pb::FieldCodec<long?> _repeated_repeatedInt64Wrapper_codec
-        = pb::FieldCodec.ForStructWrapper<long>(1706);
-    private readonly pbc::RepeatedField<long?> repeatedInt64Wrapper_ = new pbc::RepeatedField<long?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<long?> RepeatedInt64Wrapper {
-      get { return repeatedInt64Wrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_uint32_wrapper" field.</summary>
-    public const int RepeatedUint32WrapperFieldNumber = 214;
-    private static readonly pb::FieldCodec<uint?> _repeated_repeatedUint32Wrapper_codec
-        = pb::FieldCodec.ForStructWrapper<uint>(1714);
-    private readonly pbc::RepeatedField<uint?> repeatedUint32Wrapper_ = new pbc::RepeatedField<uint?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<uint?> RepeatedUint32Wrapper {
-      get { return repeatedUint32Wrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_uint64_wrapper" field.</summary>
-    public const int RepeatedUint64WrapperFieldNumber = 215;
-    private static readonly pb::FieldCodec<ulong?> _repeated_repeatedUint64Wrapper_codec
-        = pb::FieldCodec.ForStructWrapper<ulong>(1722);
-    private readonly pbc::RepeatedField<ulong?> repeatedUint64Wrapper_ = new pbc::RepeatedField<ulong?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<ulong?> RepeatedUint64Wrapper {
-      get { return repeatedUint64Wrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_float_wrapper" field.</summary>
-    public const int RepeatedFloatWrapperFieldNumber = 216;
-    private static readonly pb::FieldCodec<float?> _repeated_repeatedFloatWrapper_codec
-        = pb::FieldCodec.ForStructWrapper<float>(1730);
-    private readonly pbc::RepeatedField<float?> repeatedFloatWrapper_ = new pbc::RepeatedField<float?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<float?> RepeatedFloatWrapper {
-      get { return repeatedFloatWrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_double_wrapper" field.</summary>
-    public const int RepeatedDoubleWrapperFieldNumber = 217;
-    private static readonly pb::FieldCodec<double?> _repeated_repeatedDoubleWrapper_codec
-        = pb::FieldCodec.ForStructWrapper<double>(1738);
-    private readonly pbc::RepeatedField<double?> repeatedDoubleWrapper_ = new pbc::RepeatedField<double?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<double?> RepeatedDoubleWrapper {
-      get { return repeatedDoubleWrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_string_wrapper" field.</summary>
-    public const int RepeatedStringWrapperFieldNumber = 218;
-    private static readonly pb::FieldCodec<string> _repeated_repeatedStringWrapper_codec
-        = pb::FieldCodec.ForClassWrapper<string>(1746);
-    private readonly pbc::RepeatedField<string> repeatedStringWrapper_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<string> RepeatedStringWrapper {
-      get { return repeatedStringWrapper_; }
-    }
-
-    /// <summary>Field number for the "repeated_bytes_wrapper" field.</summary>
-    public const int RepeatedBytesWrapperFieldNumber = 219;
-    private static readonly pb::FieldCodec<pb::ByteString> _repeated_repeatedBytesWrapper_codec
-        = pb::FieldCodec.ForClassWrapper<pb::ByteString>(1754);
-    private readonly pbc::RepeatedField<pb::ByteString> repeatedBytesWrapper_ = new pbc::RepeatedField<pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<pb::ByteString> RepeatedBytesWrapper {
-      get { return repeatedBytesWrapper_; }
-    }
-
-    /// <summary>Field number for the "optional_duration" field.</summary>
-    public const int OptionalDurationFieldNumber = 301;
-    private global::Google.Protobuf.WellKnownTypes.Duration optionalDuration_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.Duration OptionalDuration {
-      get { return optionalDuration_; }
-      set {
-        optionalDuration_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_timestamp" field.</summary>
-    public const int OptionalTimestampFieldNumber = 302;
-    private global::Google.Protobuf.WellKnownTypes.Timestamp optionalTimestamp_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.Timestamp OptionalTimestamp {
-      get { return optionalTimestamp_; }
-      set {
-        optionalTimestamp_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_field_mask" field.</summary>
-    public const int OptionalFieldMaskFieldNumber = 303;
-    private global::Google.Protobuf.WellKnownTypes.FieldMask optionalFieldMask_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.FieldMask OptionalFieldMask {
-      get { return optionalFieldMask_; }
-      set {
-        optionalFieldMask_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_struct" field.</summary>
-    public const int OptionalStructFieldNumber = 304;
-    private global::Google.Protobuf.WellKnownTypes.Struct optionalStruct_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.Struct OptionalStruct {
-      get { return optionalStruct_; }
-      set {
-        optionalStruct_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_any" field.</summary>
-    public const int OptionalAnyFieldNumber = 305;
-    private global::Google.Protobuf.WellKnownTypes.Any optionalAny_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.Any OptionalAny {
-      get { return optionalAny_; }
-      set {
-        optionalAny_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "optional_value" field.</summary>
-    public const int OptionalValueFieldNumber = 306;
-    private global::Google.Protobuf.WellKnownTypes.Value optionalValue_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.WellKnownTypes.Value OptionalValue {
-      get { return optionalValue_; }
-      set {
-        optionalValue_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "repeated_duration" field.</summary>
-    public const int RepeatedDurationFieldNumber = 311;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Duration> _repeated_repeatedDuration_codec
-        = pb::FieldCodec.ForMessage(2490, global::Google.Protobuf.WellKnownTypes.Duration.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> repeatedDuration_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> RepeatedDuration {
-      get { return repeatedDuration_; }
-    }
-
-    /// <summary>Field number for the "repeated_timestamp" field.</summary>
-    public const int RepeatedTimestampFieldNumber = 312;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Timestamp> _repeated_repeatedTimestamp_codec
-        = pb::FieldCodec.ForMessage(2498, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> repeatedTimestamp_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> RepeatedTimestamp {
-      get { return repeatedTimestamp_; }
-    }
-
-    /// <summary>Field number for the "repeated_fieldmask" field.</summary>
-    public const int RepeatedFieldmaskFieldNumber = 313;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.FieldMask> _repeated_repeatedFieldmask_codec
-        = pb::FieldCodec.ForMessage(2506, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> repeatedFieldmask_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> RepeatedFieldmask {
-      get { return repeatedFieldmask_; }
-    }
-
-    /// <summary>Field number for the "repeated_struct" field.</summary>
-    public const int RepeatedStructFieldNumber = 324;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Struct> _repeated_repeatedStruct_codec
-        = pb::FieldCodec.ForMessage(2594, global::Google.Protobuf.WellKnownTypes.Struct.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> repeatedStruct_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> RepeatedStruct {
-      get { return repeatedStruct_; }
-    }
-
-    /// <summary>Field number for the "repeated_any" field.</summary>
-    public const int RepeatedAnyFieldNumber = 315;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Any> _repeated_repeatedAny_codec
-        = pb::FieldCodec.ForMessage(2522, global::Google.Protobuf.WellKnownTypes.Any.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> repeatedAny_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> RepeatedAny {
-      get { return repeatedAny_; }
-    }
-
-    /// <summary>Field number for the "repeated_value" field.</summary>
-    public const int RepeatedValueFieldNumber = 316;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Value> _repeated_repeatedValue_codec
-        = pb::FieldCodec.ForMessage(2530, global::Google.Protobuf.WellKnownTypes.Value.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value> repeatedValue_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value> RepeatedValue {
-      get { return repeatedValue_; }
-    }
-
-    /// <summary>Field number for the "fieldname1" field.</summary>
-    public const int Fieldname1FieldNumber = 401;
-    private int fieldname1_;
-    /// <summary>
-    /// Test field-name-to-JSON-name convention.
-    /// (protobuf says names can be any valid C/C++ identifier.)
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Fieldname1 {
-      get { return fieldname1_; }
-      set {
-        fieldname1_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field_name2" field.</summary>
-    public const int FieldName2FieldNumber = 402;
-    private int fieldName2_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName2 {
-      get { return fieldName2_; }
-      set {
-        fieldName2_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "_field_name3" field.</summary>
-    public const int FieldName3FieldNumber = 403;
-    private int FieldName3_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName3 {
-      get { return FieldName3_; }
-      set {
-        FieldName3_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field__name4_" field.</summary>
-    public const int FieldName4FieldNumber = 404;
-    private int fieldName4_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName4 {
-      get { return fieldName4_; }
-      set {
-        fieldName4_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field0name5" field.</summary>
-    public const int Field0Name5FieldNumber = 405;
-    private int field0Name5_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Field0Name5 {
-      get { return field0Name5_; }
-      set {
-        field0Name5_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field_0_name6" field.</summary>
-    public const int Field0Name6FieldNumber = 406;
-    private int field0Name6_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Field0Name6 {
-      get { return field0Name6_; }
-      set {
-        field0Name6_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "fieldName7" field.</summary>
-    public const int FieldName7FieldNumber = 407;
-    private int fieldName7_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName7 {
-      get { return fieldName7_; }
-      set {
-        fieldName7_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "FieldName8" field.</summary>
-    public const int FieldName8FieldNumber = 408;
-    private int fieldName8_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName8 {
-      get { return fieldName8_; }
-      set {
-        fieldName8_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field_Name9" field.</summary>
-    public const int FieldName9FieldNumber = 409;
-    private int fieldName9_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName9 {
-      get { return fieldName9_; }
-      set {
-        fieldName9_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "Field_Name10" field.</summary>
-    public const int FieldName10FieldNumber = 410;
-    private int fieldName10_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName10 {
-      get { return fieldName10_; }
-      set {
-        fieldName10_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "FIELD_NAME11" field.</summary>
-    public const int FIELDNAME11FieldNumber = 411;
-    private int fIELDNAME11_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FIELDNAME11 {
-      get { return fIELDNAME11_; }
-      set {
-        fIELDNAME11_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "FIELD_name12" field.</summary>
-    public const int FIELDName12FieldNumber = 412;
-    private int fIELDName12_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FIELDName12 {
-      get { return fIELDName12_; }
-      set {
-        fIELDName12_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "__field_name13" field.</summary>
-    public const int FieldName13FieldNumber = 413;
-    private int FieldName13_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName13 {
-      get { return FieldName13_; }
-      set {
-        FieldName13_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "__Field_name14" field.</summary>
-    public const int FieldName14FieldNumber = 414;
-    private int FieldName14_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName14 {
-      get { return FieldName14_; }
-      set {
-        FieldName14_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field__name15" field.</summary>
-    public const int FieldName15FieldNumber = 415;
-    private int fieldName15_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName15 {
-      get { return fieldName15_; }
-      set {
-        fieldName15_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field__Name16" field.</summary>
-    public const int FieldName16FieldNumber = 416;
-    private int fieldName16_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName16 {
-      get { return fieldName16_; }
-      set {
-        fieldName16_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "field_name17__" field.</summary>
-    public const int FieldName17FieldNumber = 417;
-    private int fieldName17_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName17 {
-      get { return fieldName17_; }
-      set {
-        fieldName17_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "Field_name18__" field.</summary>
-    public const int FieldName18FieldNumber = 418;
-    private int fieldName18_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int FieldName18 {
-      get { return fieldName18_; }
-      set {
-        fieldName18_ = value;
-      }
-    }
-
-    private object oneofField_;
-    /// <summary>Enum of possible cases for the "oneof_field" oneof.</summary>
-    public enum OneofFieldOneofCase {
-      None = 0,
-      OneofUint32 = 111,
-      OneofNestedMessage = 112,
-      OneofString = 113,
-      OneofBytes = 114,
-      OneofBool = 115,
-      OneofUint64 = 116,
-      OneofFloat = 117,
-      OneofDouble = 118,
-      OneofEnum = 119,
-    }
-    private OneofFieldOneofCase oneofFieldCase_ = OneofFieldOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofFieldOneofCase OneofFieldCase {
-      get { return oneofFieldCase_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void ClearOneofField() {
-      oneofFieldCase_ = OneofFieldOneofCase.None;
-      oneofField_ = null;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as TestAllTypesProto3);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(TestAllTypesProto3 other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (OptionalInt32 != other.OptionalInt32) return false;
-      if (OptionalInt64 != other.OptionalInt64) return false;
-      if (OptionalUint32 != other.OptionalUint32) return false;
-      if (OptionalUint64 != other.OptionalUint64) return false;
-      if (OptionalSint32 != other.OptionalSint32) return false;
-      if (OptionalSint64 != other.OptionalSint64) return false;
-      if (OptionalFixed32 != other.OptionalFixed32) return false;
-      if (OptionalFixed64 != other.OptionalFixed64) return false;
-      if (OptionalSfixed32 != other.OptionalSfixed32) return false;
-      if (OptionalSfixed64 != other.OptionalSfixed64) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(OptionalFloat, other.OptionalFloat)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(OptionalDouble, other.OptionalDouble)) return false;
-      if (OptionalBool != other.OptionalBool) return false;
-      if (OptionalString != other.OptionalString) return false;
-      if (OptionalBytes != other.OptionalBytes) return false;
-      if (!object.Equals(OptionalNestedMessage, other.OptionalNestedMessage)) return false;
-      if (!object.Equals(OptionalForeignMessage, other.OptionalForeignMessage)) return false;
-      if (OptionalNestedEnum != other.OptionalNestedEnum) return false;
-      if (OptionalForeignEnum != other.OptionalForeignEnum) return false;
-      if (OptionalStringPiece != other.OptionalStringPiece) return false;
-      if (OptionalCord != other.OptionalCord) return false;
-      if (!object.Equals(RecursiveMessage, other.RecursiveMessage)) return false;
-      if(!repeatedInt32_.Equals(other.repeatedInt32_)) return false;
-      if(!repeatedInt64_.Equals(other.repeatedInt64_)) return false;
-      if(!repeatedUint32_.Equals(other.repeatedUint32_)) return false;
-      if(!repeatedUint64_.Equals(other.repeatedUint64_)) return false;
-      if(!repeatedSint32_.Equals(other.repeatedSint32_)) return false;
-      if(!repeatedSint64_.Equals(other.repeatedSint64_)) return false;
-      if(!repeatedFixed32_.Equals(other.repeatedFixed32_)) return false;
-      if(!repeatedFixed64_.Equals(other.repeatedFixed64_)) return false;
-      if(!repeatedSfixed32_.Equals(other.repeatedSfixed32_)) return false;
-      if(!repeatedSfixed64_.Equals(other.repeatedSfixed64_)) return false;
-      if(!repeatedFloat_.Equals(other.repeatedFloat_)) return false;
-      if(!repeatedDouble_.Equals(other.repeatedDouble_)) return false;
-      if(!repeatedBool_.Equals(other.repeatedBool_)) return false;
-      if(!repeatedString_.Equals(other.repeatedString_)) return false;
-      if(!repeatedBytes_.Equals(other.repeatedBytes_)) return false;
-      if(!repeatedNestedMessage_.Equals(other.repeatedNestedMessage_)) return false;
-      if(!repeatedForeignMessage_.Equals(other.repeatedForeignMessage_)) return false;
-      if(!repeatedNestedEnum_.Equals(other.repeatedNestedEnum_)) return false;
-      if(!repeatedForeignEnum_.Equals(other.repeatedForeignEnum_)) return false;
-      if(!repeatedStringPiece_.Equals(other.repeatedStringPiece_)) return false;
-      if(!repeatedCord_.Equals(other.repeatedCord_)) return false;
-      if (!MapInt32Int32.Equals(other.MapInt32Int32)) return false;
-      if (!MapInt64Int64.Equals(other.MapInt64Int64)) return false;
-      if (!MapUint32Uint32.Equals(other.MapUint32Uint32)) return false;
-      if (!MapUint64Uint64.Equals(other.MapUint64Uint64)) return false;
-      if (!MapSint32Sint32.Equals(other.MapSint32Sint32)) return false;
-      if (!MapSint64Sint64.Equals(other.MapSint64Sint64)) return false;
-      if (!MapFixed32Fixed32.Equals(other.MapFixed32Fixed32)) return false;
-      if (!MapFixed64Fixed64.Equals(other.MapFixed64Fixed64)) return false;
-      if (!MapSfixed32Sfixed32.Equals(other.MapSfixed32Sfixed32)) return false;
-      if (!MapSfixed64Sfixed64.Equals(other.MapSfixed64Sfixed64)) return false;
-      if (!MapInt32Float.Equals(other.MapInt32Float)) return false;
-      if (!MapInt32Double.Equals(other.MapInt32Double)) return false;
-      if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
-      if (!MapStringString.Equals(other.MapStringString)) return false;
-      if (!MapStringBytes.Equals(other.MapStringBytes)) return false;
-      if (!MapStringNestedMessage.Equals(other.MapStringNestedMessage)) return false;
-      if (!MapStringForeignMessage.Equals(other.MapStringForeignMessage)) return false;
-      if (!MapStringNestedEnum.Equals(other.MapStringNestedEnum)) return false;
-      if (!MapStringForeignEnum.Equals(other.MapStringForeignEnum)) return false;
-      if (OneofUint32 != other.OneofUint32) return false;
-      if (!object.Equals(OneofNestedMessage, other.OneofNestedMessage)) return false;
-      if (OneofString != other.OneofString) return false;
-      if (OneofBytes != other.OneofBytes) return false;
-      if (OneofBool != other.OneofBool) return false;
-      if (OneofUint64 != other.OneofUint64) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(OneofFloat, other.OneofFloat)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(OneofDouble, other.OneofDouble)) return false;
-      if (OneofEnum != other.OneofEnum) return false;
-      if (OptionalBoolWrapper != other.OptionalBoolWrapper) return false;
-      if (OptionalInt32Wrapper != other.OptionalInt32Wrapper) return false;
-      if (OptionalInt64Wrapper != other.OptionalInt64Wrapper) return false;
-      if (OptionalUint32Wrapper != other.OptionalUint32Wrapper) return false;
-      if (OptionalUint64Wrapper != other.OptionalUint64Wrapper) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(OptionalFloatWrapper, other.OptionalFloatWrapper)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(OptionalDoubleWrapper, other.OptionalDoubleWrapper)) return false;
-      if (OptionalStringWrapper != other.OptionalStringWrapper) return false;
-      if (OptionalBytesWrapper != other.OptionalBytesWrapper) return false;
-      if(!repeatedBoolWrapper_.Equals(other.repeatedBoolWrapper_)) return false;
-      if(!repeatedInt32Wrapper_.Equals(other.repeatedInt32Wrapper_)) return false;
-      if(!repeatedInt64Wrapper_.Equals(other.repeatedInt64Wrapper_)) return false;
-      if(!repeatedUint32Wrapper_.Equals(other.repeatedUint32Wrapper_)) return false;
-      if(!repeatedUint64Wrapper_.Equals(other.repeatedUint64Wrapper_)) return false;
-      if(!repeatedFloatWrapper_.Equals(other.repeatedFloatWrapper_)) return false;
-      if(!repeatedDoubleWrapper_.Equals(other.repeatedDoubleWrapper_)) return false;
-      if(!repeatedStringWrapper_.Equals(other.repeatedStringWrapper_)) return false;
-      if(!repeatedBytesWrapper_.Equals(other.repeatedBytesWrapper_)) return false;
-      if (!object.Equals(OptionalDuration, other.OptionalDuration)) return false;
-      if (!object.Equals(OptionalTimestamp, other.OptionalTimestamp)) return false;
-      if (!object.Equals(OptionalFieldMask, other.OptionalFieldMask)) return false;
-      if (!object.Equals(OptionalStruct, other.OptionalStruct)) return false;
-      if (!object.Equals(OptionalAny, other.OptionalAny)) return false;
-      if (!object.Equals(OptionalValue, other.OptionalValue)) return false;
-      if(!repeatedDuration_.Equals(other.repeatedDuration_)) return false;
-      if(!repeatedTimestamp_.Equals(other.repeatedTimestamp_)) return false;
-      if(!repeatedFieldmask_.Equals(other.repeatedFieldmask_)) return false;
-      if(!repeatedStruct_.Equals(other.repeatedStruct_)) return false;
-      if(!repeatedAny_.Equals(other.repeatedAny_)) return false;
-      if(!repeatedValue_.Equals(other.repeatedValue_)) return false;
-      if (Fieldname1 != other.Fieldname1) return false;
-      if (FieldName2 != other.FieldName2) return false;
-      if (FieldName3 != other.FieldName3) return false;
-      if (FieldName4 != other.FieldName4) return false;
-      if (Field0Name5 != other.Field0Name5) return false;
-      if (Field0Name6 != other.Field0Name6) return false;
-      if (FieldName7 != other.FieldName7) return false;
-      if (FieldName8 != other.FieldName8) return false;
-      if (FieldName9 != other.FieldName9) return false;
-      if (FieldName10 != other.FieldName10) return false;
-      if (FIELDNAME11 != other.FIELDNAME11) return false;
-      if (FIELDName12 != other.FIELDName12) return false;
-      if (FieldName13 != other.FieldName13) return false;
-      if (FieldName14 != other.FieldName14) return false;
-      if (FieldName15 != other.FieldName15) return false;
-      if (FieldName16 != other.FieldName16) return false;
-      if (FieldName17 != other.FieldName17) return false;
-      if (FieldName18 != other.FieldName18) return false;
-      if (OneofFieldCase != other.OneofFieldCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (OptionalInt32 != 0) hash ^= OptionalInt32.GetHashCode();
-      if (OptionalInt64 != 0L) hash ^= OptionalInt64.GetHashCode();
-      if (OptionalUint32 != 0) hash ^= OptionalUint32.GetHashCode();
-      if (OptionalUint64 != 0UL) hash ^= OptionalUint64.GetHashCode();
-      if (OptionalSint32 != 0) hash ^= OptionalSint32.GetHashCode();
-      if (OptionalSint64 != 0L) hash ^= OptionalSint64.GetHashCode();
-      if (OptionalFixed32 != 0) hash ^= OptionalFixed32.GetHashCode();
-      if (OptionalFixed64 != 0UL) hash ^= OptionalFixed64.GetHashCode();
-      if (OptionalSfixed32 != 0) hash ^= OptionalSfixed32.GetHashCode();
-      if (OptionalSfixed64 != 0L) hash ^= OptionalSfixed64.GetHashCode();
-      if (OptionalFloat != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(OptionalFloat);
-      if (OptionalDouble != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(OptionalDouble);
-      if (OptionalBool != false) hash ^= OptionalBool.GetHashCode();
-      if (OptionalString.Length != 0) hash ^= OptionalString.GetHashCode();
-      if (OptionalBytes.Length != 0) hash ^= OptionalBytes.GetHashCode();
-      if (optionalNestedMessage_ != null) hash ^= OptionalNestedMessage.GetHashCode();
-      if (optionalForeignMessage_ != null) hash ^= OptionalForeignMessage.GetHashCode();
-      if (OptionalNestedEnum != 0) hash ^= OptionalNestedEnum.GetHashCode();
-      if (OptionalForeignEnum != 0) hash ^= OptionalForeignEnum.GetHashCode();
-      if (OptionalStringPiece.Length != 0) hash ^= OptionalStringPiece.GetHashCode();
-      if (OptionalCord.Length != 0) hash ^= OptionalCord.GetHashCode();
-      if (recursiveMessage_ != null) hash ^= RecursiveMessage.GetHashCode();
-      hash ^= repeatedInt32_.GetHashCode();
-      hash ^= repeatedInt64_.GetHashCode();
-      hash ^= repeatedUint32_.GetHashCode();
-      hash ^= repeatedUint64_.GetHashCode();
-      hash ^= repeatedSint32_.GetHashCode();
-      hash ^= repeatedSint64_.GetHashCode();
-      hash ^= repeatedFixed32_.GetHashCode();
-      hash ^= repeatedFixed64_.GetHashCode();
-      hash ^= repeatedSfixed32_.GetHashCode();
-      hash ^= repeatedSfixed64_.GetHashCode();
-      hash ^= repeatedFloat_.GetHashCode();
-      hash ^= repeatedDouble_.GetHashCode();
-      hash ^= repeatedBool_.GetHashCode();
-      hash ^= repeatedString_.GetHashCode();
-      hash ^= repeatedBytes_.GetHashCode();
-      hash ^= repeatedNestedMessage_.GetHashCode();
-      hash ^= repeatedForeignMessage_.GetHashCode();
-      hash ^= repeatedNestedEnum_.GetHashCode();
-      hash ^= repeatedForeignEnum_.GetHashCode();
-      hash ^= repeatedStringPiece_.GetHashCode();
-      hash ^= repeatedCord_.GetHashCode();
-      hash ^= MapInt32Int32.GetHashCode();
-      hash ^= MapInt64Int64.GetHashCode();
-      hash ^= MapUint32Uint32.GetHashCode();
-      hash ^= MapUint64Uint64.GetHashCode();
-      hash ^= MapSint32Sint32.GetHashCode();
-      hash ^= MapSint64Sint64.GetHashCode();
-      hash ^= MapFixed32Fixed32.GetHashCode();
-      hash ^= MapFixed64Fixed64.GetHashCode();
-      hash ^= MapSfixed32Sfixed32.GetHashCode();
-      hash ^= MapSfixed64Sfixed64.GetHashCode();
-      hash ^= MapInt32Float.GetHashCode();
-      hash ^= MapInt32Double.GetHashCode();
-      hash ^= MapBoolBool.GetHashCode();
-      hash ^= MapStringString.GetHashCode();
-      hash ^= MapStringBytes.GetHashCode();
-      hash ^= MapStringNestedMessage.GetHashCode();
-      hash ^= MapStringForeignMessage.GetHashCode();
-      hash ^= MapStringNestedEnum.GetHashCode();
-      hash ^= MapStringForeignEnum.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint32) hash ^= OneofUint32.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) hash ^= OneofNestedMessage.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) hash ^= OneofString.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) hash ^= OneofBytes.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBool) hash ^= OneofBool.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint64) hash ^= OneofUint64.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofFloat) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(OneofFloat);
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofDouble) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(OneofDouble);
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofEnum) hash ^= OneofEnum.GetHashCode();
-      if (optionalBoolWrapper_ != null) hash ^= OptionalBoolWrapper.GetHashCode();
-      if (optionalInt32Wrapper_ != null) hash ^= OptionalInt32Wrapper.GetHashCode();
-      if (optionalInt64Wrapper_ != null) hash ^= OptionalInt64Wrapper.GetHashCode();
-      if (optionalUint32Wrapper_ != null) hash ^= OptionalUint32Wrapper.GetHashCode();
-      if (optionalUint64Wrapper_ != null) hash ^= OptionalUint64Wrapper.GetHashCode();
-      if (optionalFloatWrapper_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(OptionalFloatWrapper);
-      if (optionalDoubleWrapper_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(OptionalDoubleWrapper);
-      if (optionalStringWrapper_ != null) hash ^= OptionalStringWrapper.GetHashCode();
-      if (optionalBytesWrapper_ != null) hash ^= OptionalBytesWrapper.GetHashCode();
-      hash ^= repeatedBoolWrapper_.GetHashCode();
-      hash ^= repeatedInt32Wrapper_.GetHashCode();
-      hash ^= repeatedInt64Wrapper_.GetHashCode();
-      hash ^= repeatedUint32Wrapper_.GetHashCode();
-      hash ^= repeatedUint64Wrapper_.GetHashCode();
-      hash ^= repeatedFloatWrapper_.GetHashCode();
-      hash ^= repeatedDoubleWrapper_.GetHashCode();
-      hash ^= repeatedStringWrapper_.GetHashCode();
-      hash ^= repeatedBytesWrapper_.GetHashCode();
-      if (optionalDuration_ != null) hash ^= OptionalDuration.GetHashCode();
-      if (optionalTimestamp_ != null) hash ^= OptionalTimestamp.GetHashCode();
-      if (optionalFieldMask_ != null) hash ^= OptionalFieldMask.GetHashCode();
-      if (optionalStruct_ != null) hash ^= OptionalStruct.GetHashCode();
-      if (optionalAny_ != null) hash ^= OptionalAny.GetHashCode();
-      if (optionalValue_ != null) hash ^= OptionalValue.GetHashCode();
-      hash ^= repeatedDuration_.GetHashCode();
-      hash ^= repeatedTimestamp_.GetHashCode();
-      hash ^= repeatedFieldmask_.GetHashCode();
-      hash ^= repeatedStruct_.GetHashCode();
-      hash ^= repeatedAny_.GetHashCode();
-      hash ^= repeatedValue_.GetHashCode();
-      if (Fieldname1 != 0) hash ^= Fieldname1.GetHashCode();
-      if (FieldName2 != 0) hash ^= FieldName2.GetHashCode();
-      if (FieldName3 != 0) hash ^= FieldName3.GetHashCode();
-      if (FieldName4 != 0) hash ^= FieldName4.GetHashCode();
-      if (Field0Name5 != 0) hash ^= Field0Name5.GetHashCode();
-      if (Field0Name6 != 0) hash ^= Field0Name6.GetHashCode();
-      if (FieldName7 != 0) hash ^= FieldName7.GetHashCode();
-      if (FieldName8 != 0) hash ^= FieldName8.GetHashCode();
-      if (FieldName9 != 0) hash ^= FieldName9.GetHashCode();
-      if (FieldName10 != 0) hash ^= FieldName10.GetHashCode();
-      if (FIELDNAME11 != 0) hash ^= FIELDNAME11.GetHashCode();
-      if (FIELDName12 != 0) hash ^= FIELDName12.GetHashCode();
-      if (FieldName13 != 0) hash ^= FieldName13.GetHashCode();
-      if (FieldName14 != 0) hash ^= FieldName14.GetHashCode();
-      if (FieldName15 != 0) hash ^= FieldName15.GetHashCode();
-      if (FieldName16 != 0) hash ^= FieldName16.GetHashCode();
-      if (FieldName17 != 0) hash ^= FieldName17.GetHashCode();
-      if (FieldName18 != 0) hash ^= FieldName18.GetHashCode();
-      hash ^= (int) oneofFieldCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (OptionalInt32 != 0) {
-        output.WriteRawTag(8);
-        output.WriteInt32(OptionalInt32);
-      }
-      if (OptionalInt64 != 0L) {
-        output.WriteRawTag(16);
-        output.WriteInt64(OptionalInt64);
-      }
-      if (OptionalUint32 != 0) {
-        output.WriteRawTag(24);
-        output.WriteUInt32(OptionalUint32);
-      }
-      if (OptionalUint64 != 0UL) {
-        output.WriteRawTag(32);
-        output.WriteUInt64(OptionalUint64);
-      }
-      if (OptionalSint32 != 0) {
-        output.WriteRawTag(40);
-        output.WriteSInt32(OptionalSint32);
-      }
-      if (OptionalSint64 != 0L) {
-        output.WriteRawTag(48);
-        output.WriteSInt64(OptionalSint64);
-      }
-      if (OptionalFixed32 != 0) {
-        output.WriteRawTag(61);
-        output.WriteFixed32(OptionalFixed32);
-      }
-      if (OptionalFixed64 != 0UL) {
-        output.WriteRawTag(65);
-        output.WriteFixed64(OptionalFixed64);
-      }
-      if (OptionalSfixed32 != 0) {
-        output.WriteRawTag(77);
-        output.WriteSFixed32(OptionalSfixed32);
-      }
-      if (OptionalSfixed64 != 0L) {
-        output.WriteRawTag(81);
-        output.WriteSFixed64(OptionalSfixed64);
-      }
-      if (OptionalFloat != 0F) {
-        output.WriteRawTag(93);
-        output.WriteFloat(OptionalFloat);
-      }
-      if (OptionalDouble != 0D) {
-        output.WriteRawTag(97);
-        output.WriteDouble(OptionalDouble);
-      }
-      if (OptionalBool != false) {
-        output.WriteRawTag(104);
-        output.WriteBool(OptionalBool);
-      }
-      if (OptionalString.Length != 0) {
-        output.WriteRawTag(114);
-        output.WriteString(OptionalString);
-      }
-      if (OptionalBytes.Length != 0) {
-        output.WriteRawTag(122);
-        output.WriteBytes(OptionalBytes);
-      }
-      if (optionalNestedMessage_ != null) {
-        output.WriteRawTag(146, 1);
-        output.WriteMessage(OptionalNestedMessage);
-      }
-      if (optionalForeignMessage_ != null) {
-        output.WriteRawTag(154, 1);
-        output.WriteMessage(OptionalForeignMessage);
-      }
-      if (OptionalNestedEnum != 0) {
-        output.WriteRawTag(168, 1);
-        output.WriteEnum((int) OptionalNestedEnum);
-      }
-      if (OptionalForeignEnum != 0) {
-        output.WriteRawTag(176, 1);
-        output.WriteEnum((int) OptionalForeignEnum);
-      }
-      if (OptionalStringPiece.Length != 0) {
-        output.WriteRawTag(194, 1);
-        output.WriteString(OptionalStringPiece);
-      }
-      if (OptionalCord.Length != 0) {
-        output.WriteRawTag(202, 1);
-        output.WriteString(OptionalCord);
-      }
-      if (recursiveMessage_ != null) {
-        output.WriteRawTag(218, 1);
-        output.WriteMessage(RecursiveMessage);
-      }
-      repeatedInt32_.WriteTo(output, _repeated_repeatedInt32_codec);
-      repeatedInt64_.WriteTo(output, _repeated_repeatedInt64_codec);
-      repeatedUint32_.WriteTo(output, _repeated_repeatedUint32_codec);
-      repeatedUint64_.WriteTo(output, _repeated_repeatedUint64_codec);
-      repeatedSint32_.WriteTo(output, _repeated_repeatedSint32_codec);
-      repeatedSint64_.WriteTo(output, _repeated_repeatedSint64_codec);
-      repeatedFixed32_.WriteTo(output, _repeated_repeatedFixed32_codec);
-      repeatedFixed64_.WriteTo(output, _repeated_repeatedFixed64_codec);
-      repeatedSfixed32_.WriteTo(output, _repeated_repeatedSfixed32_codec);
-      repeatedSfixed64_.WriteTo(output, _repeated_repeatedSfixed64_codec);
-      repeatedFloat_.WriteTo(output, _repeated_repeatedFloat_codec);
-      repeatedDouble_.WriteTo(output, _repeated_repeatedDouble_codec);
-      repeatedBool_.WriteTo(output, _repeated_repeatedBool_codec);
-      repeatedString_.WriteTo(output, _repeated_repeatedString_codec);
-      repeatedBytes_.WriteTo(output, _repeated_repeatedBytes_codec);
-      repeatedNestedMessage_.WriteTo(output, _repeated_repeatedNestedMessage_codec);
-      repeatedForeignMessage_.WriteTo(output, _repeated_repeatedForeignMessage_codec);
-      repeatedNestedEnum_.WriteTo(output, _repeated_repeatedNestedEnum_codec);
-      repeatedForeignEnum_.WriteTo(output, _repeated_repeatedForeignEnum_codec);
-      repeatedStringPiece_.WriteTo(output, _repeated_repeatedStringPiece_codec);
-      repeatedCord_.WriteTo(output, _repeated_repeatedCord_codec);
-      mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
-      mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
-      mapUint32Uint32_.WriteTo(output, _map_mapUint32Uint32_codec);
-      mapUint64Uint64_.WriteTo(output, _map_mapUint64Uint64_codec);
-      mapSint32Sint32_.WriteTo(output, _map_mapSint32Sint32_codec);
-      mapSint64Sint64_.WriteTo(output, _map_mapSint64Sint64_codec);
-      mapFixed32Fixed32_.WriteTo(output, _map_mapFixed32Fixed32_codec);
-      mapFixed64Fixed64_.WriteTo(output, _map_mapFixed64Fixed64_codec);
-      mapSfixed32Sfixed32_.WriteTo(output, _map_mapSfixed32Sfixed32_codec);
-      mapSfixed64Sfixed64_.WriteTo(output, _map_mapSfixed64Sfixed64_codec);
-      mapInt32Float_.WriteTo(output, _map_mapInt32Float_codec);
-      mapInt32Double_.WriteTo(output, _map_mapInt32Double_codec);
-      mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
-      mapStringString_.WriteTo(output, _map_mapStringString_codec);
-      mapStringBytes_.WriteTo(output, _map_mapStringBytes_codec);
-      mapStringNestedMessage_.WriteTo(output, _map_mapStringNestedMessage_codec);
-      mapStringForeignMessage_.WriteTo(output, _map_mapStringForeignMessage_codec);
-      mapStringNestedEnum_.WriteTo(output, _map_mapStringNestedEnum_codec);
-      mapStringForeignEnum_.WriteTo(output, _map_mapStringForeignEnum_codec);
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint32) {
-        output.WriteRawTag(248, 6);
-        output.WriteUInt32(OneofUint32);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) {
-        output.WriteRawTag(130, 7);
-        output.WriteMessage(OneofNestedMessage);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) {
-        output.WriteRawTag(138, 7);
-        output.WriteString(OneofString);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) {
-        output.WriteRawTag(146, 7);
-        output.WriteBytes(OneofBytes);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBool) {
-        output.WriteRawTag(152, 7);
-        output.WriteBool(OneofBool);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint64) {
-        output.WriteRawTag(160, 7);
-        output.WriteUInt64(OneofUint64);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofFloat) {
-        output.WriteRawTag(173, 7);
-        output.WriteFloat(OneofFloat);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofDouble) {
-        output.WriteRawTag(177, 7);
-        output.WriteDouble(OneofDouble);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofEnum) {
-        output.WriteRawTag(184, 7);
-        output.WriteEnum((int) OneofEnum);
-      }
-      if (optionalBoolWrapper_ != null) {
-        _single_optionalBoolWrapper_codec.WriteTagAndValue(output, OptionalBoolWrapper);
-      }
-      if (optionalInt32Wrapper_ != null) {
-        _single_optionalInt32Wrapper_codec.WriteTagAndValue(output, OptionalInt32Wrapper);
-      }
-      if (optionalInt64Wrapper_ != null) {
-        _single_optionalInt64Wrapper_codec.WriteTagAndValue(output, OptionalInt64Wrapper);
-      }
-      if (optionalUint32Wrapper_ != null) {
-        _single_optionalUint32Wrapper_codec.WriteTagAndValue(output, OptionalUint32Wrapper);
-      }
-      if (optionalUint64Wrapper_ != null) {
-        _single_optionalUint64Wrapper_codec.WriteTagAndValue(output, OptionalUint64Wrapper);
-      }
-      if (optionalFloatWrapper_ != null) {
-        _single_optionalFloatWrapper_codec.WriteTagAndValue(output, OptionalFloatWrapper);
-      }
-      if (optionalDoubleWrapper_ != null) {
-        _single_optionalDoubleWrapper_codec.WriteTagAndValue(output, OptionalDoubleWrapper);
-      }
-      if (optionalStringWrapper_ != null) {
-        _single_optionalStringWrapper_codec.WriteTagAndValue(output, OptionalStringWrapper);
-      }
-      if (optionalBytesWrapper_ != null) {
-        _single_optionalBytesWrapper_codec.WriteTagAndValue(output, OptionalBytesWrapper);
-      }
-      repeatedBoolWrapper_.WriteTo(output, _repeated_repeatedBoolWrapper_codec);
-      repeatedInt32Wrapper_.WriteTo(output, _repeated_repeatedInt32Wrapper_codec);
-      repeatedInt64Wrapper_.WriteTo(output, _repeated_repeatedInt64Wrapper_codec);
-      repeatedUint32Wrapper_.WriteTo(output, _repeated_repeatedUint32Wrapper_codec);
-      repeatedUint64Wrapper_.WriteTo(output, _repeated_repeatedUint64Wrapper_codec);
-      repeatedFloatWrapper_.WriteTo(output, _repeated_repeatedFloatWrapper_codec);
-      repeatedDoubleWrapper_.WriteTo(output, _repeated_repeatedDoubleWrapper_codec);
-      repeatedStringWrapper_.WriteTo(output, _repeated_repeatedStringWrapper_codec);
-      repeatedBytesWrapper_.WriteTo(output, _repeated_repeatedBytesWrapper_codec);
-      if (optionalDuration_ != null) {
-        output.WriteRawTag(234, 18);
-        output.WriteMessage(OptionalDuration);
-      }
-      if (optionalTimestamp_ != null) {
-        output.WriteRawTag(242, 18);
-        output.WriteMessage(OptionalTimestamp);
-      }
-      if (optionalFieldMask_ != null) {
-        output.WriteRawTag(250, 18);
-        output.WriteMessage(OptionalFieldMask);
-      }
-      if (optionalStruct_ != null) {
-        output.WriteRawTag(130, 19);
-        output.WriteMessage(OptionalStruct);
-      }
-      if (optionalAny_ != null) {
-        output.WriteRawTag(138, 19);
-        output.WriteMessage(OptionalAny);
-      }
-      if (optionalValue_ != null) {
-        output.WriteRawTag(146, 19);
-        output.WriteMessage(OptionalValue);
-      }
-      repeatedDuration_.WriteTo(output, _repeated_repeatedDuration_codec);
-      repeatedTimestamp_.WriteTo(output, _repeated_repeatedTimestamp_codec);
-      repeatedFieldmask_.WriteTo(output, _repeated_repeatedFieldmask_codec);
-      repeatedAny_.WriteTo(output, _repeated_repeatedAny_codec);
-      repeatedValue_.WriteTo(output, _repeated_repeatedValue_codec);
-      repeatedStruct_.WriteTo(output, _repeated_repeatedStruct_codec);
-      if (Fieldname1 != 0) {
-        output.WriteRawTag(136, 25);
-        output.WriteInt32(Fieldname1);
-      }
-      if (FieldName2 != 0) {
-        output.WriteRawTag(144, 25);
-        output.WriteInt32(FieldName2);
-      }
-      if (FieldName3 != 0) {
-        output.WriteRawTag(152, 25);
-        output.WriteInt32(FieldName3);
-      }
-      if (FieldName4 != 0) {
-        output.WriteRawTag(160, 25);
-        output.WriteInt32(FieldName4);
-      }
-      if (Field0Name5 != 0) {
-        output.WriteRawTag(168, 25);
-        output.WriteInt32(Field0Name5);
-      }
-      if (Field0Name6 != 0) {
-        output.WriteRawTag(176, 25);
-        output.WriteInt32(Field0Name6);
-      }
-      if (FieldName7 != 0) {
-        output.WriteRawTag(184, 25);
-        output.WriteInt32(FieldName7);
-      }
-      if (FieldName8 != 0) {
-        output.WriteRawTag(192, 25);
-        output.WriteInt32(FieldName8);
-      }
-      if (FieldName9 != 0) {
-        output.WriteRawTag(200, 25);
-        output.WriteInt32(FieldName9);
-      }
-      if (FieldName10 != 0) {
-        output.WriteRawTag(208, 25);
-        output.WriteInt32(FieldName10);
-      }
-      if (FIELDNAME11 != 0) {
-        output.WriteRawTag(216, 25);
-        output.WriteInt32(FIELDNAME11);
-      }
-      if (FIELDName12 != 0) {
-        output.WriteRawTag(224, 25);
-        output.WriteInt32(FIELDName12);
-      }
-      if (FieldName13 != 0) {
-        output.WriteRawTag(232, 25);
-        output.WriteInt32(FieldName13);
-      }
-      if (FieldName14 != 0) {
-        output.WriteRawTag(240, 25);
-        output.WriteInt32(FieldName14);
-      }
-      if (FieldName15 != 0) {
-        output.WriteRawTag(248, 25);
-        output.WriteInt32(FieldName15);
-      }
-      if (FieldName16 != 0) {
-        output.WriteRawTag(128, 26);
-        output.WriteInt32(FieldName16);
-      }
-      if (FieldName17 != 0) {
-        output.WriteRawTag(136, 26);
-        output.WriteInt32(FieldName17);
-      }
-      if (FieldName18 != 0) {
-        output.WriteRawTag(144, 26);
-        output.WriteInt32(FieldName18);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (OptionalInt32 != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(OptionalInt32);
-      }
-      if (OptionalInt64 != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeInt64Size(OptionalInt64);
-      }
-      if (OptionalUint32 != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeUInt32Size(OptionalUint32);
-      }
-      if (OptionalUint64 != 0UL) {
-        size += 1 + pb::CodedOutputStream.ComputeUInt64Size(OptionalUint64);
-      }
-      if (OptionalSint32 != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeSInt32Size(OptionalSint32);
-      }
-      if (OptionalSint64 != 0L) {
-        size += 1 + pb::CodedOutputStream.ComputeSInt64Size(OptionalSint64);
-      }
-      if (OptionalFixed32 != 0) {
-        size += 1 + 4;
-      }
-      if (OptionalFixed64 != 0UL) {
-        size += 1 + 8;
-      }
-      if (OptionalSfixed32 != 0) {
-        size += 1 + 4;
-      }
-      if (OptionalSfixed64 != 0L) {
-        size += 1 + 8;
-      }
-      if (OptionalFloat != 0F) {
-        size += 1 + 4;
-      }
-      if (OptionalDouble != 0D) {
-        size += 1 + 8;
-      }
-      if (OptionalBool != false) {
-        size += 1 + 1;
-      }
-      if (OptionalString.Length != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeStringSize(OptionalString);
-      }
-      if (OptionalBytes.Length != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeBytesSize(OptionalBytes);
-      }
-      if (optionalNestedMessage_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalNestedMessage);
-      }
-      if (optionalForeignMessage_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalForeignMessage);
-      }
-      if (OptionalNestedEnum != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) OptionalNestedEnum);
-      }
-      if (OptionalForeignEnum != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) OptionalForeignEnum);
-      }
-      if (OptionalStringPiece.Length != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeStringSize(OptionalStringPiece);
-      }
-      if (OptionalCord.Length != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeStringSize(OptionalCord);
-      }
-      if (recursiveMessage_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(RecursiveMessage);
-      }
-      size += repeatedInt32_.CalculateSize(_repeated_repeatedInt32_codec);
-      size += repeatedInt64_.CalculateSize(_repeated_repeatedInt64_codec);
-      size += repeatedUint32_.CalculateSize(_repeated_repeatedUint32_codec);
-      size += repeatedUint64_.CalculateSize(_repeated_repeatedUint64_codec);
-      size += repeatedSint32_.CalculateSize(_repeated_repeatedSint32_codec);
-      size += repeatedSint64_.CalculateSize(_repeated_repeatedSint64_codec);
-      size += repeatedFixed32_.CalculateSize(_repeated_repeatedFixed32_codec);
-      size += repeatedFixed64_.CalculateSize(_repeated_repeatedFixed64_codec);
-      size += repeatedSfixed32_.CalculateSize(_repeated_repeatedSfixed32_codec);
-      size += repeatedSfixed64_.CalculateSize(_repeated_repeatedSfixed64_codec);
-      size += repeatedFloat_.CalculateSize(_repeated_repeatedFloat_codec);
-      size += repeatedDouble_.CalculateSize(_repeated_repeatedDouble_codec);
-      size += repeatedBool_.CalculateSize(_repeated_repeatedBool_codec);
-      size += repeatedString_.CalculateSize(_repeated_repeatedString_codec);
-      size += repeatedBytes_.CalculateSize(_repeated_repeatedBytes_codec);
-      size += repeatedNestedMessage_.CalculateSize(_repeated_repeatedNestedMessage_codec);
-      size += repeatedForeignMessage_.CalculateSize(_repeated_repeatedForeignMessage_codec);
-      size += repeatedNestedEnum_.CalculateSize(_repeated_repeatedNestedEnum_codec);
-      size += repeatedForeignEnum_.CalculateSize(_repeated_repeatedForeignEnum_codec);
-      size += repeatedStringPiece_.CalculateSize(_repeated_repeatedStringPiece_codec);
-      size += repeatedCord_.CalculateSize(_repeated_repeatedCord_codec);
-      size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
-      size += mapInt64Int64_.CalculateSize(_map_mapInt64Int64_codec);
-      size += mapUint32Uint32_.CalculateSize(_map_mapUint32Uint32_codec);
-      size += mapUint64Uint64_.CalculateSize(_map_mapUint64Uint64_codec);
-      size += mapSint32Sint32_.CalculateSize(_map_mapSint32Sint32_codec);
-      size += mapSint64Sint64_.CalculateSize(_map_mapSint64Sint64_codec);
-      size += mapFixed32Fixed32_.CalculateSize(_map_mapFixed32Fixed32_codec);
-      size += mapFixed64Fixed64_.CalculateSize(_map_mapFixed64Fixed64_codec);
-      size += mapSfixed32Sfixed32_.CalculateSize(_map_mapSfixed32Sfixed32_codec);
-      size += mapSfixed64Sfixed64_.CalculateSize(_map_mapSfixed64Sfixed64_codec);
-      size += mapInt32Float_.CalculateSize(_map_mapInt32Float_codec);
-      size += mapInt32Double_.CalculateSize(_map_mapInt32Double_codec);
-      size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
-      size += mapStringString_.CalculateSize(_map_mapStringString_codec);
-      size += mapStringBytes_.CalculateSize(_map_mapStringBytes_codec);
-      size += mapStringNestedMessage_.CalculateSize(_map_mapStringNestedMessage_codec);
-      size += mapStringForeignMessage_.CalculateSize(_map_mapStringForeignMessage_codec);
-      size += mapStringNestedEnum_.CalculateSize(_map_mapStringNestedEnum_codec);
-      size += mapStringForeignEnum_.CalculateSize(_map_mapStringForeignEnum_codec);
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint32) {
-        size += 2 + pb::CodedOutputStream.ComputeUInt32Size(OneofUint32);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OneofNestedMessage);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) {
-        size += 2 + pb::CodedOutputStream.ComputeStringSize(OneofString);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) {
-        size += 2 + pb::CodedOutputStream.ComputeBytesSize(OneofBytes);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofBool) {
-        size += 2 + 1;
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofUint64) {
-        size += 2 + pb::CodedOutputStream.ComputeUInt64Size(OneofUint64);
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofFloat) {
-        size += 2 + 4;
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofDouble) {
-        size += 2 + 8;
-      }
-      if (oneofFieldCase_ == OneofFieldOneofCase.OneofEnum) {
-        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) OneofEnum);
-      }
-      if (optionalBoolWrapper_ != null) {
-        size += _single_optionalBoolWrapper_codec.CalculateSizeWithTag(OptionalBoolWrapper);
-      }
-      if (optionalInt32Wrapper_ != null) {
-        size += _single_optionalInt32Wrapper_codec.CalculateSizeWithTag(OptionalInt32Wrapper);
-      }
-      if (optionalInt64Wrapper_ != null) {
-        size += _single_optionalInt64Wrapper_codec.CalculateSizeWithTag(OptionalInt64Wrapper);
-      }
-      if (optionalUint32Wrapper_ != null) {
-        size += _single_optionalUint32Wrapper_codec.CalculateSizeWithTag(OptionalUint32Wrapper);
-      }
-      if (optionalUint64Wrapper_ != null) {
-        size += _single_optionalUint64Wrapper_codec.CalculateSizeWithTag(OptionalUint64Wrapper);
-      }
-      if (optionalFloatWrapper_ != null) {
-        size += _single_optionalFloatWrapper_codec.CalculateSizeWithTag(OptionalFloatWrapper);
-      }
-      if (optionalDoubleWrapper_ != null) {
-        size += _single_optionalDoubleWrapper_codec.CalculateSizeWithTag(OptionalDoubleWrapper);
-      }
-      if (optionalStringWrapper_ != null) {
-        size += _single_optionalStringWrapper_codec.CalculateSizeWithTag(OptionalStringWrapper);
-      }
-      if (optionalBytesWrapper_ != null) {
-        size += _single_optionalBytesWrapper_codec.CalculateSizeWithTag(OptionalBytesWrapper);
-      }
-      size += repeatedBoolWrapper_.CalculateSize(_repeated_repeatedBoolWrapper_codec);
-      size += repeatedInt32Wrapper_.CalculateSize(_repeated_repeatedInt32Wrapper_codec);
-      size += repeatedInt64Wrapper_.CalculateSize(_repeated_repeatedInt64Wrapper_codec);
-      size += repeatedUint32Wrapper_.CalculateSize(_repeated_repeatedUint32Wrapper_codec);
-      size += repeatedUint64Wrapper_.CalculateSize(_repeated_repeatedUint64Wrapper_codec);
-      size += repeatedFloatWrapper_.CalculateSize(_repeated_repeatedFloatWrapper_codec);
-      size += repeatedDoubleWrapper_.CalculateSize(_repeated_repeatedDoubleWrapper_codec);
-      size += repeatedStringWrapper_.CalculateSize(_repeated_repeatedStringWrapper_codec);
-      size += repeatedBytesWrapper_.CalculateSize(_repeated_repeatedBytesWrapper_codec);
-      if (optionalDuration_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalDuration);
-      }
-      if (optionalTimestamp_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalTimestamp);
-      }
-      if (optionalFieldMask_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalFieldMask);
-      }
-      if (optionalStruct_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalStruct);
-      }
-      if (optionalAny_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalAny);
-      }
-      if (optionalValue_ != null) {
-        size += 2 + pb::CodedOutputStream.ComputeMessageSize(OptionalValue);
-      }
-      size += repeatedDuration_.CalculateSize(_repeated_repeatedDuration_codec);
-      size += repeatedTimestamp_.CalculateSize(_repeated_repeatedTimestamp_codec);
-      size += repeatedFieldmask_.CalculateSize(_repeated_repeatedFieldmask_codec);
-      size += repeatedStruct_.CalculateSize(_repeated_repeatedStruct_codec);
-      size += repeatedAny_.CalculateSize(_repeated_repeatedAny_codec);
-      size += repeatedValue_.CalculateSize(_repeated_repeatedValue_codec);
-      if (Fieldname1 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Fieldname1);
-      }
-      if (FieldName2 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName2);
-      }
-      if (FieldName3 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName3);
-      }
-      if (FieldName4 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName4);
-      }
-      if (Field0Name5 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field0Name5);
-      }
-      if (Field0Name6 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field0Name6);
-      }
-      if (FieldName7 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName7);
-      }
-      if (FieldName8 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName8);
-      }
-      if (FieldName9 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName9);
-      }
-      if (FieldName10 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName10);
-      }
-      if (FIELDNAME11 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FIELDNAME11);
-      }
-      if (FIELDName12 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FIELDName12);
-      }
-      if (FieldName13 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName13);
-      }
-      if (FieldName14 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName14);
-      }
-      if (FieldName15 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName15);
-      }
-      if (FieldName16 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName16);
-      }
-      if (FieldName17 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName17);
-      }
-      if (FieldName18 != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeInt32Size(FieldName18);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(TestAllTypesProto3 other) {
-      if (other == null) {
-        return;
-      }
-      if (other.OptionalInt32 != 0) {
-        OptionalInt32 = other.OptionalInt32;
-      }
-      if (other.OptionalInt64 != 0L) {
-        OptionalInt64 = other.OptionalInt64;
-      }
-      if (other.OptionalUint32 != 0) {
-        OptionalUint32 = other.OptionalUint32;
-      }
-      if (other.OptionalUint64 != 0UL) {
-        OptionalUint64 = other.OptionalUint64;
-      }
-      if (other.OptionalSint32 != 0) {
-        OptionalSint32 = other.OptionalSint32;
-      }
-      if (other.OptionalSint64 != 0L) {
-        OptionalSint64 = other.OptionalSint64;
-      }
-      if (other.OptionalFixed32 != 0) {
-        OptionalFixed32 = other.OptionalFixed32;
-      }
-      if (other.OptionalFixed64 != 0UL) {
-        OptionalFixed64 = other.OptionalFixed64;
-      }
-      if (other.OptionalSfixed32 != 0) {
-        OptionalSfixed32 = other.OptionalSfixed32;
-      }
-      if (other.OptionalSfixed64 != 0L) {
-        OptionalSfixed64 = other.OptionalSfixed64;
-      }
-      if (other.OptionalFloat != 0F) {
-        OptionalFloat = other.OptionalFloat;
-      }
-      if (other.OptionalDouble != 0D) {
-        OptionalDouble = other.OptionalDouble;
-      }
-      if (other.OptionalBool != false) {
-        OptionalBool = other.OptionalBool;
-      }
-      if (other.OptionalString.Length != 0) {
-        OptionalString = other.OptionalString;
-      }
-      if (other.OptionalBytes.Length != 0) {
-        OptionalBytes = other.OptionalBytes;
-      }
-      if (other.optionalNestedMessage_ != null) {
-        if (optionalNestedMessage_ == null) {
-          optionalNestedMessage_ = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage();
-        }
-        OptionalNestedMessage.MergeFrom(other.OptionalNestedMessage);
-      }
-      if (other.optionalForeignMessage_ != null) {
-        if (optionalForeignMessage_ == null) {
-          optionalForeignMessage_ = new global::ProtobufTestMessages.Proto3.ForeignMessage();
-        }
-        OptionalForeignMessage.MergeFrom(other.OptionalForeignMessage);
-      }
-      if (other.OptionalNestedEnum != 0) {
-        OptionalNestedEnum = other.OptionalNestedEnum;
-      }
-      if (other.OptionalForeignEnum != 0) {
-        OptionalForeignEnum = other.OptionalForeignEnum;
-      }
-      if (other.OptionalStringPiece.Length != 0) {
-        OptionalStringPiece = other.OptionalStringPiece;
-      }
-      if (other.OptionalCord.Length != 0) {
-        OptionalCord = other.OptionalCord;
-      }
-      if (other.recursiveMessage_ != null) {
-        if (recursiveMessage_ == null) {
-          recursiveMessage_ = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3();
-        }
-        RecursiveMessage.MergeFrom(other.RecursiveMessage);
-      }
-      repeatedInt32_.Add(other.repeatedInt32_);
-      repeatedInt64_.Add(other.repeatedInt64_);
-      repeatedUint32_.Add(other.repeatedUint32_);
-      repeatedUint64_.Add(other.repeatedUint64_);
-      repeatedSint32_.Add(other.repeatedSint32_);
-      repeatedSint64_.Add(other.repeatedSint64_);
-      repeatedFixed32_.Add(other.repeatedFixed32_);
-      repeatedFixed64_.Add(other.repeatedFixed64_);
-      repeatedSfixed32_.Add(other.repeatedSfixed32_);
-      repeatedSfixed64_.Add(other.repeatedSfixed64_);
-      repeatedFloat_.Add(other.repeatedFloat_);
-      repeatedDouble_.Add(other.repeatedDouble_);
-      repeatedBool_.Add(other.repeatedBool_);
-      repeatedString_.Add(other.repeatedString_);
-      repeatedBytes_.Add(other.repeatedBytes_);
-      repeatedNestedMessage_.Add(other.repeatedNestedMessage_);
-      repeatedForeignMessage_.Add(other.repeatedForeignMessage_);
-      repeatedNestedEnum_.Add(other.repeatedNestedEnum_);
-      repeatedForeignEnum_.Add(other.repeatedForeignEnum_);
-      repeatedStringPiece_.Add(other.repeatedStringPiece_);
-      repeatedCord_.Add(other.repeatedCord_);
-      mapInt32Int32_.Add(other.mapInt32Int32_);
-      mapInt64Int64_.Add(other.mapInt64Int64_);
-      mapUint32Uint32_.Add(other.mapUint32Uint32_);
-      mapUint64Uint64_.Add(other.mapUint64Uint64_);
-      mapSint32Sint32_.Add(other.mapSint32Sint32_);
-      mapSint64Sint64_.Add(other.mapSint64Sint64_);
-      mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
-      mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
-      mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
-      mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
-      mapInt32Float_.Add(other.mapInt32Float_);
-      mapInt32Double_.Add(other.mapInt32Double_);
-      mapBoolBool_.Add(other.mapBoolBool_);
-      mapStringString_.Add(other.mapStringString_);
-      mapStringBytes_.Add(other.mapStringBytes_);
-      mapStringNestedMessage_.Add(other.mapStringNestedMessage_);
-      mapStringForeignMessage_.Add(other.mapStringForeignMessage_);
-      mapStringNestedEnum_.Add(other.mapStringNestedEnum_);
-      mapStringForeignEnum_.Add(other.mapStringForeignEnum_);
-      if (other.optionalBoolWrapper_ != null) {
-        if (optionalBoolWrapper_ == null || other.OptionalBoolWrapper != false) {
-          OptionalBoolWrapper = other.OptionalBoolWrapper;
-        }
-      }
-      if (other.optionalInt32Wrapper_ != null) {
-        if (optionalInt32Wrapper_ == null || other.OptionalInt32Wrapper != 0) {
-          OptionalInt32Wrapper = other.OptionalInt32Wrapper;
-        }
-      }
-      if (other.optionalInt64Wrapper_ != null) {
-        if (optionalInt64Wrapper_ == null || other.OptionalInt64Wrapper != 0L) {
-          OptionalInt64Wrapper = other.OptionalInt64Wrapper;
-        }
-      }
-      if (other.optionalUint32Wrapper_ != null) {
-        if (optionalUint32Wrapper_ == null || other.OptionalUint32Wrapper != 0) {
-          OptionalUint32Wrapper = other.OptionalUint32Wrapper;
-        }
-      }
-      if (other.optionalUint64Wrapper_ != null) {
-        if (optionalUint64Wrapper_ == null || other.OptionalUint64Wrapper != 0UL) {
-          OptionalUint64Wrapper = other.OptionalUint64Wrapper;
-        }
-      }
-      if (other.optionalFloatWrapper_ != null) {
-        if (optionalFloatWrapper_ == null || other.OptionalFloatWrapper != 0F) {
-          OptionalFloatWrapper = other.OptionalFloatWrapper;
-        }
-      }
-      if (other.optionalDoubleWrapper_ != null) {
-        if (optionalDoubleWrapper_ == null || other.OptionalDoubleWrapper != 0D) {
-          OptionalDoubleWrapper = other.OptionalDoubleWrapper;
-        }
-      }
-      if (other.optionalStringWrapper_ != null) {
-        if (optionalStringWrapper_ == null || other.OptionalStringWrapper != "") {
-          OptionalStringWrapper = other.OptionalStringWrapper;
-        }
-      }
-      if (other.optionalBytesWrapper_ != null) {
-        if (optionalBytesWrapper_ == null || other.OptionalBytesWrapper != pb::ByteString.Empty) {
-          OptionalBytesWrapper = other.OptionalBytesWrapper;
-        }
-      }
-      repeatedBoolWrapper_.Add(other.repeatedBoolWrapper_);
-      repeatedInt32Wrapper_.Add(other.repeatedInt32Wrapper_);
-      repeatedInt64Wrapper_.Add(other.repeatedInt64Wrapper_);
-      repeatedUint32Wrapper_.Add(other.repeatedUint32Wrapper_);
-      repeatedUint64Wrapper_.Add(other.repeatedUint64Wrapper_);
-      repeatedFloatWrapper_.Add(other.repeatedFloatWrapper_);
-      repeatedDoubleWrapper_.Add(other.repeatedDoubleWrapper_);
-      repeatedStringWrapper_.Add(other.repeatedStringWrapper_);
-      repeatedBytesWrapper_.Add(other.repeatedBytesWrapper_);
-      if (other.optionalDuration_ != null) {
-        if (optionalDuration_ == null) {
-          optionalDuration_ = new global::Google.Protobuf.WellKnownTypes.Duration();
-        }
-        OptionalDuration.MergeFrom(other.OptionalDuration);
-      }
-      if (other.optionalTimestamp_ != null) {
-        if (optionalTimestamp_ == null) {
-          optionalTimestamp_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
-        }
-        OptionalTimestamp.MergeFrom(other.OptionalTimestamp);
-      }
-      if (other.optionalFieldMask_ != null) {
-        if (optionalFieldMask_ == null) {
-          optionalFieldMask_ = new global::Google.Protobuf.WellKnownTypes.FieldMask();
-        }
-        OptionalFieldMask.MergeFrom(other.OptionalFieldMask);
-      }
-      if (other.optionalStruct_ != null) {
-        if (optionalStruct_ == null) {
-          optionalStruct_ = new global::Google.Protobuf.WellKnownTypes.Struct();
-        }
-        OptionalStruct.MergeFrom(other.OptionalStruct);
-      }
-      if (other.optionalAny_ != null) {
-        if (optionalAny_ == null) {
-          optionalAny_ = new global::Google.Protobuf.WellKnownTypes.Any();
-        }
-        OptionalAny.MergeFrom(other.OptionalAny);
-      }
-      if (other.optionalValue_ != null) {
-        if (optionalValue_ == null) {
-          optionalValue_ = new global::Google.Protobuf.WellKnownTypes.Value();
-        }
-        OptionalValue.MergeFrom(other.OptionalValue);
-      }
-      repeatedDuration_.Add(other.repeatedDuration_);
-      repeatedTimestamp_.Add(other.repeatedTimestamp_);
-      repeatedFieldmask_.Add(other.repeatedFieldmask_);
-      repeatedStruct_.Add(other.repeatedStruct_);
-      repeatedAny_.Add(other.repeatedAny_);
-      repeatedValue_.Add(other.repeatedValue_);
-      if (other.Fieldname1 != 0) {
-        Fieldname1 = other.Fieldname1;
-      }
-      if (other.FieldName2 != 0) {
-        FieldName2 = other.FieldName2;
-      }
-      if (other.FieldName3 != 0) {
-        FieldName3 = other.FieldName3;
-      }
-      if (other.FieldName4 != 0) {
-        FieldName4 = other.FieldName4;
-      }
-      if (other.Field0Name5 != 0) {
-        Field0Name5 = other.Field0Name5;
-      }
-      if (other.Field0Name6 != 0) {
-        Field0Name6 = other.Field0Name6;
-      }
-      if (other.FieldName7 != 0) {
-        FieldName7 = other.FieldName7;
-      }
-      if (other.FieldName8 != 0) {
-        FieldName8 = other.FieldName8;
-      }
-      if (other.FieldName9 != 0) {
-        FieldName9 = other.FieldName9;
-      }
-      if (other.FieldName10 != 0) {
-        FieldName10 = other.FieldName10;
-      }
-      if (other.FIELDNAME11 != 0) {
-        FIELDNAME11 = other.FIELDNAME11;
-      }
-      if (other.FIELDName12 != 0) {
-        FIELDName12 = other.FIELDName12;
-      }
-      if (other.FieldName13 != 0) {
-        FieldName13 = other.FieldName13;
-      }
-      if (other.FieldName14 != 0) {
-        FieldName14 = other.FieldName14;
-      }
-      if (other.FieldName15 != 0) {
-        FieldName15 = other.FieldName15;
-      }
-      if (other.FieldName16 != 0) {
-        FieldName16 = other.FieldName16;
-      }
-      if (other.FieldName17 != 0) {
-        FieldName17 = other.FieldName17;
-      }
-      if (other.FieldName18 != 0) {
-        FieldName18 = other.FieldName18;
-      }
-      switch (other.OneofFieldCase) {
-        case OneofFieldOneofCase.OneofUint32:
-          OneofUint32 = other.OneofUint32;
-          break;
-        case OneofFieldOneofCase.OneofNestedMessage:
-          if (OneofNestedMessage == null) {
-            OneofNestedMessage = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage();
-          }
-          OneofNestedMessage.MergeFrom(other.OneofNestedMessage);
-          break;
-        case OneofFieldOneofCase.OneofString:
-          OneofString = other.OneofString;
-          break;
-        case OneofFieldOneofCase.OneofBytes:
-          OneofBytes = other.OneofBytes;
-          break;
-        case OneofFieldOneofCase.OneofBool:
-          OneofBool = other.OneofBool;
-          break;
-        case OneofFieldOneofCase.OneofUint64:
-          OneofUint64 = other.OneofUint64;
-          break;
-        case OneofFieldOneofCase.OneofFloat:
-          OneofFloat = other.OneofFloat;
-          break;
-        case OneofFieldOneofCase.OneofDouble:
-          OneofDouble = other.OneofDouble;
-          break;
-        case OneofFieldOneofCase.OneofEnum:
-          OneofEnum = other.OneofEnum;
-          break;
-      }
-
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            OptionalInt32 = input.ReadInt32();
-            break;
-          }
-          case 16: {
-            OptionalInt64 = input.ReadInt64();
-            break;
-          }
-          case 24: {
-            OptionalUint32 = input.ReadUInt32();
-            break;
-          }
-          case 32: {
-            OptionalUint64 = input.ReadUInt64();
-            break;
-          }
-          case 40: {
-            OptionalSint32 = input.ReadSInt32();
-            break;
-          }
-          case 48: {
-            OptionalSint64 = input.ReadSInt64();
-            break;
-          }
-          case 61: {
-            OptionalFixed32 = input.ReadFixed32();
-            break;
-          }
-          case 65: {
-            OptionalFixed64 = input.ReadFixed64();
-            break;
-          }
-          case 77: {
-            OptionalSfixed32 = input.ReadSFixed32();
-            break;
-          }
-          case 81: {
-            OptionalSfixed64 = input.ReadSFixed64();
-            break;
-          }
-          case 93: {
-            OptionalFloat = input.ReadFloat();
-            break;
-          }
-          case 97: {
-            OptionalDouble = input.ReadDouble();
-            break;
-          }
-          case 104: {
-            OptionalBool = input.ReadBool();
-            break;
-          }
-          case 114: {
-            OptionalString = input.ReadString();
-            break;
-          }
-          case 122: {
-            OptionalBytes = input.ReadBytes();
-            break;
-          }
-          case 146: {
-            if (optionalNestedMessage_ == null) {
-              optionalNestedMessage_ = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage();
-            }
-            input.ReadMessage(optionalNestedMessage_);
-            break;
-          }
-          case 154: {
-            if (optionalForeignMessage_ == null) {
-              optionalForeignMessage_ = new global::ProtobufTestMessages.Proto3.ForeignMessage();
-            }
-            input.ReadMessage(optionalForeignMessage_);
-            break;
-          }
-          case 168: {
-            optionalNestedEnum_ = (global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedEnum) input.ReadEnum();
-            break;
-          }
-          case 176: {
-            optionalForeignEnum_ = (global::ProtobufTestMessages.Proto3.ForeignEnum) input.ReadEnum();
-            break;
-          }
-          case 194: {
-            OptionalStringPiece = input.ReadString();
-            break;
-          }
-          case 202: {
-            OptionalCord = input.ReadString();
-            break;
-          }
-          case 218: {
-            if (recursiveMessage_ == null) {
-              recursiveMessage_ = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3();
-            }
-            input.ReadMessage(recursiveMessage_);
-            break;
-          }
-          case 250:
-          case 248: {
-            repeatedInt32_.AddEntriesFrom(input, _repeated_repeatedInt32_codec);
-            break;
-          }
-          case 258:
-          case 256: {
-            repeatedInt64_.AddEntriesFrom(input, _repeated_repeatedInt64_codec);
-            break;
-          }
-          case 266:
-          case 264: {
-            repeatedUint32_.AddEntriesFrom(input, _repeated_repeatedUint32_codec);
-            break;
-          }
-          case 274:
-          case 272: {
-            repeatedUint64_.AddEntriesFrom(input, _repeated_repeatedUint64_codec);
-            break;
-          }
-          case 282:
-          case 280: {
-            repeatedSint32_.AddEntriesFrom(input, _repeated_repeatedSint32_codec);
-            break;
-          }
-          case 290:
-          case 288: {
-            repeatedSint64_.AddEntriesFrom(input, _repeated_repeatedSint64_codec);
-            break;
-          }
-          case 298:
-          case 301: {
-            repeatedFixed32_.AddEntriesFrom(input, _repeated_repeatedFixed32_codec);
-            break;
-          }
-          case 306:
-          case 305: {
-            repeatedFixed64_.AddEntriesFrom(input, _repeated_repeatedFixed64_codec);
-            break;
-          }
-          case 314:
-          case 317: {
-            repeatedSfixed32_.AddEntriesFrom(input, _repeated_repeatedSfixed32_codec);
-            break;
-          }
-          case 322:
-          case 321: {
-            repeatedSfixed64_.AddEntriesFrom(input, _repeated_repeatedSfixed64_codec);
-            break;
-          }
-          case 330:
-          case 333: {
-            repeatedFloat_.AddEntriesFrom(input, _repeated_repeatedFloat_codec);
-            break;
-          }
-          case 338:
-          case 337: {
-            repeatedDouble_.AddEntriesFrom(input, _repeated_repeatedDouble_codec);
-            break;
-          }
-          case 346:
-          case 344: {
-            repeatedBool_.AddEntriesFrom(input, _repeated_repeatedBool_codec);
-            break;
-          }
-          case 354: {
-            repeatedString_.AddEntriesFrom(input, _repeated_repeatedString_codec);
-            break;
-          }
-          case 362: {
-            repeatedBytes_.AddEntriesFrom(input, _repeated_repeatedBytes_codec);
-            break;
-          }
-          case 386: {
-            repeatedNestedMessage_.AddEntriesFrom(input, _repeated_repeatedNestedMessage_codec);
-            break;
-          }
-          case 394: {
-            repeatedForeignMessage_.AddEntriesFrom(input, _repeated_repeatedForeignMessage_codec);
-            break;
-          }
-          case 410:
-          case 408: {
-            repeatedNestedEnum_.AddEntriesFrom(input, _repeated_repeatedNestedEnum_codec);
-            break;
-          }
-          case 418:
-          case 416: {
-            repeatedForeignEnum_.AddEntriesFrom(input, _repeated_repeatedForeignEnum_codec);
-            break;
-          }
-          case 434: {
-            repeatedStringPiece_.AddEntriesFrom(input, _repeated_repeatedStringPiece_codec);
-            break;
-          }
-          case 442: {
-            repeatedCord_.AddEntriesFrom(input, _repeated_repeatedCord_codec);
-            break;
-          }
-          case 450: {
-            mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
-            break;
-          }
-          case 458: {
-            mapInt64Int64_.AddEntriesFrom(input, _map_mapInt64Int64_codec);
-            break;
-          }
-          case 466: {
-            mapUint32Uint32_.AddEntriesFrom(input, _map_mapUint32Uint32_codec);
-            break;
-          }
-          case 474: {
-            mapUint64Uint64_.AddEntriesFrom(input, _map_mapUint64Uint64_codec);
-            break;
-          }
-          case 482: {
-            mapSint32Sint32_.AddEntriesFrom(input, _map_mapSint32Sint32_codec);
-            break;
-          }
-          case 490: {
-            mapSint64Sint64_.AddEntriesFrom(input, _map_mapSint64Sint64_codec);
-            break;
-          }
-          case 498: {
-            mapFixed32Fixed32_.AddEntriesFrom(input, _map_mapFixed32Fixed32_codec);
-            break;
-          }
-          case 506: {
-            mapFixed64Fixed64_.AddEntriesFrom(input, _map_mapFixed64Fixed64_codec);
-            break;
-          }
-          case 514: {
-            mapSfixed32Sfixed32_.AddEntriesFrom(input, _map_mapSfixed32Sfixed32_codec);
-            break;
-          }
-          case 522: {
-            mapSfixed64Sfixed64_.AddEntriesFrom(input, _map_mapSfixed64Sfixed64_codec);
-            break;
-          }
-          case 530: {
-            mapInt32Float_.AddEntriesFrom(input, _map_mapInt32Float_codec);
-            break;
-          }
-          case 538: {
-            mapInt32Double_.AddEntriesFrom(input, _map_mapInt32Double_codec);
-            break;
-          }
-          case 546: {
-            mapBoolBool_.AddEntriesFrom(input, _map_mapBoolBool_codec);
-            break;
-          }
-          case 554: {
-            mapStringString_.AddEntriesFrom(input, _map_mapStringString_codec);
-            break;
-          }
-          case 562: {
-            mapStringBytes_.AddEntriesFrom(input, _map_mapStringBytes_codec);
-            break;
-          }
-          case 570: {
-            mapStringNestedMessage_.AddEntriesFrom(input, _map_mapStringNestedMessage_codec);
-            break;
-          }
-          case 578: {
-            mapStringForeignMessage_.AddEntriesFrom(input, _map_mapStringForeignMessage_codec);
-            break;
-          }
-          case 586: {
-            mapStringNestedEnum_.AddEntriesFrom(input, _map_mapStringNestedEnum_codec);
-            break;
-          }
-          case 594: {
-            mapStringForeignEnum_.AddEntriesFrom(input, _map_mapStringForeignEnum_codec);
-            break;
-          }
-          case 888: {
-            OneofUint32 = input.ReadUInt32();
-            break;
-          }
-          case 898: {
-            global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage subBuilder = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Types.NestedMessage();
-            if (oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage) {
-              subBuilder.MergeFrom(OneofNestedMessage);
-            }
-            input.ReadMessage(subBuilder);
-            OneofNestedMessage = subBuilder;
-            break;
-          }
-          case 906: {
-            OneofString = input.ReadString();
-            break;
-          }
-          case 914: {
-            OneofBytes = input.ReadBytes();
-            break;
-          }
-          case 920: {
-            OneofBool = input.ReadBool();
-            break;
-          }
-          case 928: {
-            OneofUint64 = input.ReadUInt64();
-            break;
-          }
-          case 941: {
-            OneofFloat = input.ReadFloat();
-            break;
-          }
-          case 945: {
-            OneofDouble = input.ReadDouble();
-            break;
-          }
-          case 952: {
-            oneofField_ = input.ReadEnum();
-            oneofFieldCase_ = OneofFieldOneofCase.OneofEnum;
-            break;
-          }
-          case 1610: {
-            bool? value = _single_optionalBoolWrapper_codec.Read(input);
-            if (optionalBoolWrapper_ == null || value != false) {
-              OptionalBoolWrapper = value;
-            }
-            break;
-          }
-          case 1618: {
-            int? value = _single_optionalInt32Wrapper_codec.Read(input);
-            if (optionalInt32Wrapper_ == null || value != 0) {
-              OptionalInt32Wrapper = value;
-            }
-            break;
-          }
-          case 1626: {
-            long? value = _single_optionalInt64Wrapper_codec.Read(input);
-            if (optionalInt64Wrapper_ == null || value != 0L) {
-              OptionalInt64Wrapper = value;
-            }
-            break;
-          }
-          case 1634: {
-            uint? value = _single_optionalUint32Wrapper_codec.Read(input);
-            if (optionalUint32Wrapper_ == null || value != 0) {
-              OptionalUint32Wrapper = value;
-            }
-            break;
-          }
-          case 1642: {
-            ulong? value = _single_optionalUint64Wrapper_codec.Read(input);
-            if (optionalUint64Wrapper_ == null || value != 0UL) {
-              OptionalUint64Wrapper = value;
-            }
-            break;
-          }
-          case 1650: {
-            float? value = _single_optionalFloatWrapper_codec.Read(input);
-            if (optionalFloatWrapper_ == null || value != 0F) {
-              OptionalFloatWrapper = value;
-            }
-            break;
-          }
-          case 1658: {
-            double? value = _single_optionalDoubleWrapper_codec.Read(input);
-            if (optionalDoubleWrapper_ == null || value != 0D) {
-              OptionalDoubleWrapper = value;
-            }
-            break;
-          }
-          case 1666: {
-            string value = _single_optionalStringWrapper_codec.Read(input);
-            if (optionalStringWrapper_ == null || value != "") {
-              OptionalStringWrapper = value;
-            }
-            break;
-          }
-          case 1674: {
-            pb::ByteString value = _single_optionalBytesWrapper_codec.Read(input);
-            if (optionalBytesWrapper_ == null || value != pb::ByteString.Empty) {
-              OptionalBytesWrapper = value;
-            }
-            break;
-          }
-          case 1690: {
-            repeatedBoolWrapper_.AddEntriesFrom(input, _repeated_repeatedBoolWrapper_codec);
-            break;
-          }
-          case 1698: {
-            repeatedInt32Wrapper_.AddEntriesFrom(input, _repeated_repeatedInt32Wrapper_codec);
-            break;
-          }
-          case 1706: {
-            repeatedInt64Wrapper_.AddEntriesFrom(input, _repeated_repeatedInt64Wrapper_codec);
-            break;
-          }
-          case 1714: {
-            repeatedUint32Wrapper_.AddEntriesFrom(input, _repeated_repeatedUint32Wrapper_codec);
-            break;
-          }
-          case 1722: {
-            repeatedUint64Wrapper_.AddEntriesFrom(input, _repeated_repeatedUint64Wrapper_codec);
-            break;
-          }
-          case 1730: {
-            repeatedFloatWrapper_.AddEntriesFrom(input, _repeated_repeatedFloatWrapper_codec);
-            break;
-          }
-          case 1738: {
-            repeatedDoubleWrapper_.AddEntriesFrom(input, _repeated_repeatedDoubleWrapper_codec);
-            break;
-          }
-          case 1746: {
-            repeatedStringWrapper_.AddEntriesFrom(input, _repeated_repeatedStringWrapper_codec);
-            break;
-          }
-          case 1754: {
-            repeatedBytesWrapper_.AddEntriesFrom(input, _repeated_repeatedBytesWrapper_codec);
-            break;
-          }
-          case 2410: {
-            if (optionalDuration_ == null) {
-              optionalDuration_ = new global::Google.Protobuf.WellKnownTypes.Duration();
-            }
-            input.ReadMessage(optionalDuration_);
-            break;
-          }
-          case 2418: {
-            if (optionalTimestamp_ == null) {
-              optionalTimestamp_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
-            }
-            input.ReadMessage(optionalTimestamp_);
-            break;
-          }
-          case 2426: {
-            if (optionalFieldMask_ == null) {
-              optionalFieldMask_ = new global::Google.Protobuf.WellKnownTypes.FieldMask();
-            }
-            input.ReadMessage(optionalFieldMask_);
-            break;
-          }
-          case 2434: {
-            if (optionalStruct_ == null) {
-              optionalStruct_ = new global::Google.Protobuf.WellKnownTypes.Struct();
-            }
-            input.ReadMessage(optionalStruct_);
-            break;
-          }
-          case 2442: {
-            if (optionalAny_ == null) {
-              optionalAny_ = new global::Google.Protobuf.WellKnownTypes.Any();
-            }
-            input.ReadMessage(optionalAny_);
-            break;
-          }
-          case 2450: {
-            if (optionalValue_ == null) {
-              optionalValue_ = new global::Google.Protobuf.WellKnownTypes.Value();
-            }
-            input.ReadMessage(optionalValue_);
-            break;
-          }
-          case 2490: {
-            repeatedDuration_.AddEntriesFrom(input, _repeated_repeatedDuration_codec);
-            break;
-          }
-          case 2498: {
-            repeatedTimestamp_.AddEntriesFrom(input, _repeated_repeatedTimestamp_codec);
-            break;
-          }
-          case 2506: {
-            repeatedFieldmask_.AddEntriesFrom(input, _repeated_repeatedFieldmask_codec);
-            break;
-          }
-          case 2522: {
-            repeatedAny_.AddEntriesFrom(input, _repeated_repeatedAny_codec);
-            break;
-          }
-          case 2530: {
-            repeatedValue_.AddEntriesFrom(input, _repeated_repeatedValue_codec);
-            break;
-          }
-          case 2594: {
-            repeatedStruct_.AddEntriesFrom(input, _repeated_repeatedStruct_codec);
-            break;
-          }
-          case 3208: {
-            Fieldname1 = input.ReadInt32();
-            break;
-          }
-          case 3216: {
-            FieldName2 = input.ReadInt32();
-            break;
-          }
-          case 3224: {
-            FieldName3 = input.ReadInt32();
-            break;
-          }
-          case 3232: {
-            FieldName4 = input.ReadInt32();
-            break;
-          }
-          case 3240: {
-            Field0Name5 = input.ReadInt32();
-            break;
-          }
-          case 3248: {
-            Field0Name6 = input.ReadInt32();
-            break;
-          }
-          case 3256: {
-            FieldName7 = input.ReadInt32();
-            break;
-          }
-          case 3264: {
-            FieldName8 = input.ReadInt32();
-            break;
-          }
-          case 3272: {
-            FieldName9 = input.ReadInt32();
-            break;
-          }
-          case 3280: {
-            FieldName10 = input.ReadInt32();
-            break;
-          }
-          case 3288: {
-            FIELDNAME11 = input.ReadInt32();
-            break;
-          }
-          case 3296: {
-            FIELDName12 = input.ReadInt32();
-            break;
-          }
-          case 3304: {
-            FieldName13 = input.ReadInt32();
-            break;
-          }
-          case 3312: {
-            FieldName14 = input.ReadInt32();
-            break;
-          }
-          case 3320: {
-            FieldName15 = input.ReadInt32();
-            break;
-          }
-          case 3328: {
-            FieldName16 = input.ReadInt32();
-            break;
-          }
-          case 3336: {
-            FieldName17 = input.ReadInt32();
-            break;
-          }
-          case 3344: {
-            FieldName18 = input.ReadInt32();
-            break;
-          }
-        }
-      }
-    }
-
-    #region Nested types
-    /// <summary>Container for nested types declared in the TestAllTypesProto3 message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      public enum NestedEnum {
-        [pbr::OriginalName("FOO")] Foo = 0,
-        [pbr::OriginalName("BAR")] Bar = 1,
-        [pbr::OriginalName("BAZ")] Baz = 2,
-        /// <summary>
-        /// Intentionally negative.
-        /// </summary>
-        [pbr::OriginalName("NEG")] Neg = -1,
-      }
-
-      public sealed partial class NestedMessage : pb::IMessage<NestedMessage> {
-        private static readonly pb::MessageParser<NestedMessage> _parser = new pb::MessageParser<NestedMessage>(() => new NestedMessage());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pb::MessageParser<NestedMessage> Parser { get { return _parser; } }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pbr::MessageDescriptor Descriptor {
-          get { return global::ProtobufTestMessages.Proto3.TestAllTypesProto3.Descriptor.NestedTypes[0]; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        pbr::MessageDescriptor pb::IMessage.Descriptor {
-          get { return Descriptor; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public NestedMessage() {
-          OnConstruction();
-        }
-
-        partial void OnConstruction();
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public NestedMessage(NestedMessage other) : this() {
-          a_ = other.a_;
-          Corecursive = other.corecursive_ != null ? other.Corecursive.Clone() : null;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public NestedMessage Clone() {
-          return new NestedMessage(this);
-        }
-
-        /// <summary>Field number for the "a" field.</summary>
-        public const int AFieldNumber = 1;
-        private int a_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int A {
-          get { return a_; }
-          set {
-            a_ = value;
-          }
-        }
-
-        /// <summary>Field number for the "corecursive" field.</summary>
-        public const int CorecursiveFieldNumber = 2;
-        private global::ProtobufTestMessages.Proto3.TestAllTypesProto3 corecursive_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public global::ProtobufTestMessages.Proto3.TestAllTypesProto3 Corecursive {
-          get { return corecursive_; }
-          set {
-            corecursive_ = value;
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override bool Equals(object other) {
-          return Equals(other as NestedMessage);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public bool Equals(NestedMessage other) {
-          if (ReferenceEquals(other, null)) {
-            return false;
-          }
-          if (ReferenceEquals(other, this)) {
-            return true;
-          }
-          if (A != other.A) return false;
-          if (!object.Equals(Corecursive, other.Corecursive)) return false;
-          return Equals(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override int GetHashCode() {
-          int hash = 1;
-          if (A != 0) hash ^= A.GetHashCode();
-          if (corecursive_ != null) hash ^= Corecursive.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
-          return hash;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override string ToString() {
-          return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void WriteTo(pb::CodedOutputStream output) {
-          if (A != 0) {
-            output.WriteRawTag(8);
-            output.WriteInt32(A);
-          }
-          if (corecursive_ != null) {
-            output.WriteRawTag(18);
-            output.WriteMessage(Corecursive);
-          }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int CalculateSize() {
-          int size = 0;
-          if (A != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(A);
-          }
-          if (corecursive_ != null) {
-            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Corecursive);
-          }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
-          return size;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(NestedMessage other) {
-          if (other == null) {
-            return;
-          }
-          if (other.A != 0) {
-            A = other.A;
-          }
-          if (other.corecursive_ != null) {
-            if (corecursive_ == null) {
-              corecursive_ = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3();
-            }
-            Corecursive.MergeFrom(other.Corecursive);
-          }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(pb::CodedInputStream input) {
-          uint tag;
-          while ((tag = input.ReadTag()) != 0) {
-            switch(tag) {
-              default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-                break;
-              case 8: {
-                A = input.ReadInt32();
-                break;
-              }
-              case 18: {
-                if (corecursive_ == null) {
-                  corecursive_ = new global::ProtobufTestMessages.Proto3.TestAllTypesProto3();
-                }
-                input.ReadMessage(corecursive_);
-                break;
-              }
-            }
-          }
-        }
-
-      }
-
-    }
-    #endregion
-
-  }
-
-  public sealed partial class ForeignMessage : pb::IMessage<ForeignMessage> {
-    private static readonly pb::MessageParser<ForeignMessage> _parser = new pb::MessageParser<ForeignMessage>(() => new ForeignMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<ForeignMessage> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::ProtobufTestMessages.Proto3.TestMessagesProto3Reflection.Descriptor.MessageTypes[1]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ForeignMessage() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ForeignMessage(ForeignMessage other) : this() {
-      c_ = other.c_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ForeignMessage Clone() {
-      return new ForeignMessage(this);
-    }
-
-    /// <summary>Field number for the "c" field.</summary>
-    public const int CFieldNumber = 1;
-    private int c_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int C {
-      get { return c_; }
-      set {
-        c_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as ForeignMessage);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(ForeignMessage other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (C != other.C) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (C != 0) hash ^= C.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (C != 0) {
-        output.WriteRawTag(8);
-        output.WriteInt32(C);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (C != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(C);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(ForeignMessage other) {
-      if (other == null) {
-        return;
-      }
-      if (other.C != 0) {
-        C = other.C;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            C = input.ReadInt32();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  #endregion
-
-}
-
-#endregion Designer generated code
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestCustomOptionsProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestCustomOptionsProto3.cs
deleted file mode 100644
index 6d02bda..0000000
--- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestCustomOptionsProto3.cs
+++ /dev/null
@@ -1,2879 +0,0 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: unittest_custom_options_proto3.proto
-// </auto-generated>
-#pragma warning disable 1591, 0612, 3021
-#region Designer generated code
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-namespace UnitTest.Issues.TestProtos {
-
-  /// <summary>Holder for reflection information generated from unittest_custom_options_proto3.proto</summary>
-  public static partial class UnittestCustomOptionsProto3Reflection {
-
-    #region Descriptor
-    /// <summary>File descriptor for unittest_custom_options_proto3.proto</summary>
-    public static pbr::FileDescriptor Descriptor {
-      get { return descriptor; }
-    }
-    private static pbr::FileDescriptor descriptor;
-
-    static UnittestCustomOptionsProto3Reflection() {
-      byte[] descriptorData = global::System.Convert.FromBase64String(
-          string.Concat(
-            "CiR1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wcm90bzMucHJvdG8SEXByb3Rv",
-            "YnVmX3VuaXR0ZXN0GiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90",
-            "byLXAQocVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucxIeCgZmaWVsZDEY",
-            "ASABKAlCDggBweDDHS3hdQoCAAAAEhUKC29uZW9mX2ZpZWxkGAIgASgFSAAi",
-            "UwoGQW5FbnVtEhYKEkFORU5VTV9VTlNQRUNJRklFRBAAEg8KC0FORU5VTV9W",
-            "QUwxEAESFgoLQU5FTlVNX1ZBTDIQAhoFsIb6BXsaCMX2yR3r/P//OhAIAODp",
-            "wh3I//////////8BQhkKB0FuT25lb2YSDviswx2d//////////8BIhgKFkN1",
-            "c3RvbU9wdGlvbkZvb1JlcXVlc3QiGQoXQ3VzdG9tT3B0aW9uRm9vUmVzcG9u",
-            "c2UiHgocQ3VzdG9tT3B0aW9uRm9vQ2xpZW50TWVzc2FnZSIeChxDdXN0b21P",
-            "cHRpb25Gb29TZXJ2ZXJNZXNzYWdlIo8BChpEdW1teU1lc3NhZ2VDb250YWlu",
-            "aW5nRW51bSJxCgxUZXN0RW51bVR5cGUSIAocVEVTVF9PUFRJT05fRU5VTV9V",
-            "TlNQRUNJRklFRBAAEhoKFlRFU1RfT1BUSU9OX0VOVU1fVFlQRTEQFhIjChZU",
-            "RVNUX09QVElPTl9FTlVNX1RZUEUyEOn//////////wEiIQofRHVtbXlNZXNz",
-            "YWdlSW52YWxpZEFzT3B0aW9uVHlwZSKKAQocQ3VzdG9tT3B0aW9uTWluSW50",
-            "ZWdlclZhbHVlczpq0N6yHQDoxrIdgICAgPj/////AbC8sh2AgICAgICAgIAB",
-            "gJOyHQD49bAdAIDEsB3/////D/iXsB3///////////8BnfWvHQAAAACR7q8d",
-            "AAAAAAAAAACtja8dAAAAgJnWqB0AAAAAAAAAgCKRAQocQ3VzdG9tT3B0aW9u",
-            "TWF4SW50ZWdlclZhbHVlczpx0N6yHQHoxrId/////wewvLId//////////9/",
-            "gJOyHf////8P+PWwHf///////////wGAxLAd/v///w/4l7Ad/v//////////",
-            "AZ31rx3/////ke6vHf//////////rY2vHf///3+Z1qgd/////////38ibgoX",
-            "Q3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXM6U+jGsh2c//////////8B9d+jHeeH",
-            "RUHp3KId+1mMQsrA8z+q3KIdDkhlbGxvLCAiV29ybGQistmiHQtIZWxsbwBX",
-            "b3JsZIjZoh3p//////////8BIjQKHFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2",
-            "ZUludHM6FPXfox0AAEBB6dyiHQAAAAAAQGNAIjQKHFNldHRpbmdSZWFsc0Zy",
-            "b21OZWdhdGl2ZUludHM6FPXfox0AAEDB6dyiHQAAAAAAQGPAIksKEkNvbXBs",
-            "ZXhPcHRpb25UeXBlMRILCgNmb28YASABKAUSDAoEZm9vMhgCIAEoBRIMCgRm",
-            "b28zGAMgASgFEgwKBGZvbzQYBCADKAUigQMKEkNvbXBsZXhPcHRpb25UeXBl",
-            "MhIyCgNiYXIYASABKAsyJS5wcm90b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0",
-            "aW9uVHlwZTESCwoDYmF6GAIgASgFEkYKBGZyZWQYAyABKAsyOC5wcm90b2J1",
-            "Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlvblR5",
-            "cGU0EkgKBmJhcm5leRgEIAMoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBs",
-            "ZXhPcHRpb25UeXBlMi5Db21wbGV4T3B0aW9uVHlwZTQalwEKEkNvbXBsZXhP",
-            "cHRpb25UeXBlNBINCgV3YWxkbxgBIAEoBTJyCgxjb21wbGV4X29wdDQSHy5n",
-            "b29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYivXRAyABKAsyOC5wcm90",
-            "b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlv",
-            "blR5cGU0IiEKEkNvbXBsZXhPcHRpb25UeXBlMxILCgNxdXgYASABKAUibAoV",
-            "VmFyaW91c0NvbXBsZXhPcHRpb25zOlOi4pUdAggqouKVHQIgY6LilR0CIFiq",
-            "/ZAdAxDbB6r9kB0FCgMI5wXSqI8dAwizD6r9kB0FGgMIwQKq/ZAdBCICCGWq",
-            "/ZAdBSIDCNQB+t6QHQIICSJMCglBZ2dyZWdhdGUSCQoBaRgBIAEoBRIJCgFz",
-            "GAIgASgJEikKA3N1YhgDIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3Jl",
-            "Z2F0ZSJZChBBZ2dyZWdhdGVNZXNzYWdlEikKCWZpZWxkbmFtZRgBIAEoBUIW",
-            "8qGHOxESD0ZpZWxkQW5ub3RhdGlvbjoawtGGOxUIZRIRTWVzc2FnZUFubm90",
-            "YXRpb24ilwEKEE5lc3RlZE9wdGlvblR5cGUaOwoNTmVzdGVkTWVzc2FnZRIi",
-            "CgxuZXN0ZWRfZmllbGQYASABKAVCDMHgwx3qAwAAAAAAADoG4OnCHekHIkYK",
-            "Ck5lc3RlZEVudW0SDwoLVU5TUEVDSUZJRUQQABIdChFORVNURURfRU5VTV9W",
-            "QUxVRRABGgawhvoF7AcaCMX2yR3rAwAAKlIKCk1ldGhvZE9wdDESGgoWTUVU",
-            "SE9ET1BUMV9VTlNQRUNJRklFRBAAEhMKD01FVEhPRE9QVDFfVkFMMRABEhMK",
-            "D01FVEhPRE9QVDFfVkFMMhACKl4KDUFnZ3JlZ2F0ZUVudW0SDwoLVU5TUEVD",
-            "SUZJRUQQABIlCgVWQUxVRRABGhrK/Ik7FRITRW51bVZhbHVlQW5ub3RhdGlv",
-            "bhoVkpWIOxASDkVudW1Bbm5vdGF0aW9uMo4BChxUZXN0U2VydmljZVdpdGhD",
-            "dXN0b21PcHRpb25zEmMKA0ZvbxIpLnByb3RvYnVmX3VuaXR0ZXN0LkN1c3Rv",
-            "bU9wdGlvbkZvb1JlcXVlc3QaKi5wcm90b2J1Zl91bml0dGVzdC5DdXN0b21P",
-            "cHRpb25Gb29SZXNwb25zZSIF4PqMHgIaCZCyix7T24DLSTKZAQoQQWdncmVn",
-            "YXRlU2VydmljZRJrCgZNZXRob2QSIy5wcm90b2J1Zl91bml0dGVzdC5BZ2dy",
-            "ZWdhdGVNZXNzYWdlGiMucHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlTWVz",
-            "c2FnZSIXysiWOxISEE1ldGhvZEFubm90YXRpb24aGMr7jjsTEhFTZXJ2aWNl",
-            "QW5ub3RhdGlvbjoyCglmaWxlX29wdDESHC5nb29nbGUucHJvdG9idWYuRmls",
-            "ZU9wdGlvbnMYjp3YAyABKAQ6OAoMbWVzc2FnZV9vcHQxEh8uZ29vZ2xlLnBy",
-            "b3RvYnVmLk1lc3NhZ2VPcHRpb25zGJyt2AMgASgFOjQKCmZpZWxkX29wdDES",
-            "HS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIi82AMgASgGOjQKCm9u",
-            "ZW9mX29wdDESHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGM+12AMg",
-            "ASgFOjIKCWVudW1fb3B0MRIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9u",
-            "cxjontkDIAEoDzo8Cg9lbnVtX3ZhbHVlX29wdDESIS5nb29nbGUucHJvdG9i",
-            "dWYuRW51bVZhbHVlT3B0aW9ucxjmoF8gASgFOjgKDHNlcnZpY2Vfb3B0MRIf",
-            "Lmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiituEDIAEoEjpVCgtt",
-            "ZXRob2Rfb3B0MRIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGKzP",
-            "4QMgASgOMh0ucHJvdG9idWZfdW5pdHRlc3QuTWV0aG9kT3B0MTo0Cghib29s",
-            "X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjqq9YDIAEo",
-            "CDo1CglpbnQzMl9vcHQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlv",
-            "bnMY7ajWAyABKAU6NQoJaW50NjRfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1l",
-            "c3NhZ2VPcHRpb25zGMan1gMgASgDOjYKCnVpbnQzMl9vcHQSHy5nb29nbGUu",
-            "cHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYsKLWAyABKA06NgoKdWludDY0X29w",
-            "dBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjfjtYDIAEoBDo2",
-            "CgpzaW50MzJfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25z",
-            "GMCI1gMgASgROjYKCnNpbnQ2NF9vcHQSHy5nb29nbGUucHJvdG9idWYuTWVz",
-            "c2FnZU9wdGlvbnMY/4LWAyABKBI6NwoLZml4ZWQzMl9vcHQSHy5nb29nbGUu",
-            "cHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY0/7VAyABKAc6NwoLZml4ZWQ2NF9v",
-            "cHQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY4v3VAyABKAY6",
-            "OAoMc2ZpeGVkMzJfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRp",
-            "b25zGNXx1QMgASgPOjgKDHNmaXhlZDY0X29wdBIfLmdvb2dsZS5wcm90b2J1",
-            "Zi5NZXNzYWdlT3B0aW9ucxjjitUDIAEoEDo1CglmbG9hdF9vcHQSHy5nb29n",
-            "bGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY/rvUAyABKAI6NgoKZG91Ymxl",
-            "X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjNq9QDIAEo",
-            "ATo2CgpzdHJpbmdfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRp",
-            "b25zGMWr1AMgASgJOjUKCWJ5dGVzX29wdBIfLmdvb2dsZS5wcm90b2J1Zi5N",
-            "ZXNzYWdlT3B0aW9ucxiWq9QDIAEoDDpwCghlbnVtX29wdBIfLmdvb2dsZS5w",
-            "cm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiRq9QDIAEoDjI6LnByb3RvYnVmX3Vu",
-            "aXR0ZXN0LkR1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLlRlc3RFbnVtVHlw",
-            "ZTpwChBtZXNzYWdlX3R5cGVfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3Nh",
-            "Z2VPcHRpb25zGK/y0wMgASgLMjIucHJvdG9idWZfdW5pdHRlc3QuRHVtbXlN",
-            "ZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZTpfCgxjb21wbGV4X29wdDESHy5n",
-            "b29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYpNzSAyABKAsyJS5wcm90",
-            "b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTE6XwoMY29tcGxleF9v",
-            "cHQyEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGNWP0gMgASgL",
-            "MiUucHJvdG9idWZfdW5pdHRlc3QuQ29tcGxleE9wdGlvblR5cGUyOl8KDGNv",
-            "bXBsZXhfb3B0MxIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjv",
-            "i9IDIAEoCzIlLnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBsZXhPcHRpb25UeXBl",
-            "MzpOCgdmaWxlb3B0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGM/d",
-            "sAcgASgLMhwucHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlOlAKBm1zZ29w",
-            "dBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiY6rAHIAEoCzIc",
-            "LnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZTpQCghmaWVsZG9wdBIdLmdv",
-            "b2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYnvSwByABKAsyHC5wcm90b2J1",
-            "Zl91bml0dGVzdC5BZ2dyZWdhdGU6TgoHZW51bW9wdBIcLmdvb2dsZS5wcm90",
-            "b2J1Zi5FbnVtT3B0aW9ucxjSgrEHIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0",
-            "LkFnZ3JlZ2F0ZTpWCgplbnVtdmFsb3B0EiEuZ29vZ2xlLnByb3RvYnVmLkVu",
-            "dW1WYWx1ZU9wdGlvbnMYyZ+xByABKAsyHC5wcm90b2J1Zl91bml0dGVzdC5B",
-            "Z2dyZWdhdGU6VAoKc2VydmljZW9wdBIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2",
-            "aWNlT3B0aW9ucxi577EHIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3Jl",
-            "Z2F0ZTpSCgltZXRob2RvcHQSHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0",
-            "aW9ucxiJ6bIHIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZUJV",
-            "qgIaVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3Pw6MEd6q3A5ST67IU7Kghk",
-            "Eg5GaWxlQW5ub3RhdGlvbhoWEhROZXN0ZWRGaWxlQW5ub3RhdGlvbmIGcHJv",
-            "dG8z"));
-      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
-          new pbr::FileDescriptor[] { pbr::FileDescriptor.DescriptorProtoFileDescriptor, },
-          new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.MethodOpt1), typeof(global::UnitTest.Issues.TestProtos.AggregateEnum), }, new pbr::GeneratedClrTypeInfo[] {
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestMessageWithCustomOptions), global::UnitTest.Issues.TestProtos.TestMessageWithCustomOptions.Parser, new[]{ "Field1", "OneofField" }, new[]{ "AnOneof" }, new[]{ typeof(global::UnitTest.Issues.TestProtos.TestMessageWithCustomOptions.Types.AnEnum) }, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionFooRequest), global::UnitTest.Issues.TestProtos.CustomOptionFooRequest.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionFooResponse), global::UnitTest.Issues.TestProtos.CustomOptionFooResponse.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionFooClientMessage), global::UnitTest.Issues.TestProtos.CustomOptionFooClientMessage.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionFooServerMessage), global::UnitTest.Issues.TestProtos.CustomOptionFooServerMessage.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.DummyMessageContainingEnum), global::UnitTest.Issues.TestProtos.DummyMessageContainingEnum.Parser, null, null, new[]{ typeof(global::UnitTest.Issues.TestProtos.DummyMessageContainingEnum.Types.TestEnumType) }, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.DummyMessageInvalidAsOptionType), global::UnitTest.Issues.TestProtos.DummyMessageInvalidAsOptionType.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionMinIntegerValues), global::UnitTest.Issues.TestProtos.CustomOptionMinIntegerValues.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionMaxIntegerValues), global::UnitTest.Issues.TestProtos.CustomOptionMaxIntegerValues.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.CustomOptionOtherValues), global::UnitTest.Issues.TestProtos.CustomOptionOtherValues.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.SettingRealsFromPositiveInts), global::UnitTest.Issues.TestProtos.SettingRealsFromPositiveInts.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.SettingRealsFromNegativeInts), global::UnitTest.Issues.TestProtos.SettingRealsFromNegativeInts.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ComplexOptionType1), global::UnitTest.Issues.TestProtos.ComplexOptionType1.Parser, new[]{ "Foo", "Foo2", "Foo3", "Foo4" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ComplexOptionType2), global::UnitTest.Issues.TestProtos.ComplexOptionType2.Parser, new[]{ "Bar", "Baz", "Fred", "Barney" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4), global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.Parser, new[]{ "Waldo" }, null, null, null)}),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ComplexOptionType3), global::UnitTest.Issues.TestProtos.ComplexOptionType3.Parser, new[]{ "Qux" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.VariousComplexOptions), global::UnitTest.Issues.TestProtos.VariousComplexOptions.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.Aggregate), global::UnitTest.Issues.TestProtos.Aggregate.Parser, new[]{ "I", "S", "Sub" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.AggregateMessage), global::UnitTest.Issues.TestProtos.AggregateMessage.Parser, new[]{ "Fieldname" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.NestedOptionType), global::UnitTest.Issues.TestProtos.NestedOptionType.Parser, null, null, new[]{ typeof(global::UnitTest.Issues.TestProtos.NestedOptionType.Types.NestedEnum) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.NestedOptionType.Types.NestedMessage), global::UnitTest.Issues.TestProtos.NestedOptionType.Types.NestedMessage.Parser, new[]{ "NestedField" }, null, null, null)})
-          }));
-    }
-    #endregion
-
-  }
-  #region Enums
-  public enum MethodOpt1 {
-    [pbr::OriginalName("METHODOPT1_UNSPECIFIED")] Unspecified = 0,
-    [pbr::OriginalName("METHODOPT1_VAL1")] Val1 = 1,
-    [pbr::OriginalName("METHODOPT1_VAL2")] Val2 = 2,
-  }
-
-  public enum AggregateEnum {
-    [pbr::OriginalName("UNSPECIFIED")] Unspecified = 0,
-    [pbr::OriginalName("VALUE")] Value = 1,
-  }
-
-  #endregion
-
-  #region Messages
-  /// <summary>
-  /// A test message with custom options at all possible locations (and also some
-  /// regular options, to make sure they interact nicely).
-  /// </summary>
-  public sealed partial class TestMessageWithCustomOptions : pb::IMessage<TestMessageWithCustomOptions> {
-    private static readonly pb::MessageParser<TestMessageWithCustomOptions> _parser = new pb::MessageParser<TestMessageWithCustomOptions>(() => new TestMessageWithCustomOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<TestMessageWithCustomOptions> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[0]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestMessageWithCustomOptions() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestMessageWithCustomOptions(TestMessageWithCustomOptions other) : this() {
-      field1_ = other.field1_;
-      switch (other.AnOneofCase) {
-        case AnOneofOneofCase.OneofField:
-          OneofField = other.OneofField;
-          break;
-      }
-
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestMessageWithCustomOptions Clone() {
-      return new TestMessageWithCustomOptions(this);
-    }
-
-    /// <summary>Field number for the "field1" field.</summary>
-    public const int Field1FieldNumber = 1;
-    private string field1_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string Field1 {
-      get { return field1_; }
-      set {
-        field1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "oneof_field" field.</summary>
-    public const int OneofFieldFieldNumber = 2;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int OneofField {
-      get { return anOneofCase_ == AnOneofOneofCase.OneofField ? (int) anOneof_ : 0; }
-      set {
-        anOneof_ = value;
-        anOneofCase_ = AnOneofOneofCase.OneofField;
-      }
-    }
-
-    private object anOneof_;
-    /// <summary>Enum of possible cases for the "AnOneof" oneof.</summary>
-    public enum AnOneofOneofCase {
-      None = 0,
-      OneofField = 2,
-    }
-    private AnOneofOneofCase anOneofCase_ = AnOneofOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public AnOneofOneofCase AnOneofCase {
-      get { return anOneofCase_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void ClearAnOneof() {
-      anOneofCase_ = AnOneofOneofCase.None;
-      anOneof_ = null;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as TestMessageWithCustomOptions);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(TestMessageWithCustomOptions other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Field1 != other.Field1) return false;
-      if (OneofField != other.OneofField) return false;
-      if (AnOneofCase != other.AnOneofCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Field1.Length != 0) hash ^= Field1.GetHashCode();
-      if (anOneofCase_ == AnOneofOneofCase.OneofField) hash ^= OneofField.GetHashCode();
-      hash ^= (int) anOneofCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Field1.Length != 0) {
-        output.WriteRawTag(10);
-        output.WriteString(Field1);
-      }
-      if (anOneofCase_ == AnOneofOneofCase.OneofField) {
-        output.WriteRawTag(16);
-        output.WriteInt32(OneofField);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Field1.Length != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeStringSize(Field1);
-      }
-      if (anOneofCase_ == AnOneofOneofCase.OneofField) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(OneofField);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(TestMessageWithCustomOptions other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Field1.Length != 0) {
-        Field1 = other.Field1;
-      }
-      switch (other.AnOneofCase) {
-        case AnOneofOneofCase.OneofField:
-          OneofField = other.OneofField;
-          break;
-      }
-
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 10: {
-            Field1 = input.ReadString();
-            break;
-          }
-          case 16: {
-            OneofField = input.ReadInt32();
-            break;
-          }
-        }
-      }
-    }
-
-    #region Nested types
-    /// <summary>Container for nested types declared in the TestMessageWithCustomOptions message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      public enum AnEnum {
-        [pbr::OriginalName("ANENUM_UNSPECIFIED")] Unspecified = 0,
-        [pbr::OriginalName("ANENUM_VAL1")] Val1 = 1,
-        [pbr::OriginalName("ANENUM_VAL2")] Val2 = 2,
-      }
-
-    }
-    #endregion
-
-  }
-
-  /// <summary>
-  /// A test RPC service with custom options at all possible locations (and also
-  /// some regular options, to make sure they interact nicely).
-  /// </summary>
-  public sealed partial class CustomOptionFooRequest : pb::IMessage<CustomOptionFooRequest> {
-    private static readonly pb::MessageParser<CustomOptionFooRequest> _parser = new pb::MessageParser<CustomOptionFooRequest>(() => new CustomOptionFooRequest());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionFooRequest> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[1]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooRequest() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooRequest(CustomOptionFooRequest other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooRequest Clone() {
-      return new CustomOptionFooRequest(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionFooRequest);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionFooRequest other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionFooRequest other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class CustomOptionFooResponse : pb::IMessage<CustomOptionFooResponse> {
-    private static readonly pb::MessageParser<CustomOptionFooResponse> _parser = new pb::MessageParser<CustomOptionFooResponse>(() => new CustomOptionFooResponse());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionFooResponse> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[2]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooResponse() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooResponse(CustomOptionFooResponse other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooResponse Clone() {
-      return new CustomOptionFooResponse(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionFooResponse);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionFooResponse other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionFooResponse other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class CustomOptionFooClientMessage : pb::IMessage<CustomOptionFooClientMessage> {
-    private static readonly pb::MessageParser<CustomOptionFooClientMessage> _parser = new pb::MessageParser<CustomOptionFooClientMessage>(() => new CustomOptionFooClientMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionFooClientMessage> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[3]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooClientMessage() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooClientMessage(CustomOptionFooClientMessage other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooClientMessage Clone() {
-      return new CustomOptionFooClientMessage(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionFooClientMessage);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionFooClientMessage other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionFooClientMessage other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class CustomOptionFooServerMessage : pb::IMessage<CustomOptionFooServerMessage> {
-    private static readonly pb::MessageParser<CustomOptionFooServerMessage> _parser = new pb::MessageParser<CustomOptionFooServerMessage>(() => new CustomOptionFooServerMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionFooServerMessage> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[4]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooServerMessage() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooServerMessage(CustomOptionFooServerMessage other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionFooServerMessage Clone() {
-      return new CustomOptionFooServerMessage(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionFooServerMessage);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionFooServerMessage other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionFooServerMessage other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class DummyMessageContainingEnum : pb::IMessage<DummyMessageContainingEnum> {
-    private static readonly pb::MessageParser<DummyMessageContainingEnum> _parser = new pb::MessageParser<DummyMessageContainingEnum>(() => new DummyMessageContainingEnum());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<DummyMessageContainingEnum> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[5]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DummyMessageContainingEnum() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DummyMessageContainingEnum(DummyMessageContainingEnum other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DummyMessageContainingEnum Clone() {
-      return new DummyMessageContainingEnum(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as DummyMessageContainingEnum);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(DummyMessageContainingEnum other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(DummyMessageContainingEnum other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-    #region Nested types
-    /// <summary>Container for nested types declared in the DummyMessageContainingEnum message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      public enum TestEnumType {
-        [pbr::OriginalName("TEST_OPTION_ENUM_UNSPECIFIED")] TestOptionEnumUnspecified = 0,
-        [pbr::OriginalName("TEST_OPTION_ENUM_TYPE1")] TestOptionEnumType1 = 22,
-        [pbr::OriginalName("TEST_OPTION_ENUM_TYPE2")] TestOptionEnumType2 = -23,
-      }
-
-    }
-    #endregion
-
-  }
-
-  public sealed partial class DummyMessageInvalidAsOptionType : pb::IMessage<DummyMessageInvalidAsOptionType> {
-    private static readonly pb::MessageParser<DummyMessageInvalidAsOptionType> _parser = new pb::MessageParser<DummyMessageInvalidAsOptionType>(() => new DummyMessageInvalidAsOptionType());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<DummyMessageInvalidAsOptionType> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[6]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DummyMessageInvalidAsOptionType() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DummyMessageInvalidAsOptionType(DummyMessageInvalidAsOptionType other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public DummyMessageInvalidAsOptionType Clone() {
-      return new DummyMessageInvalidAsOptionType(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as DummyMessageInvalidAsOptionType);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(DummyMessageInvalidAsOptionType other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(DummyMessageInvalidAsOptionType other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class CustomOptionMinIntegerValues : pb::IMessage<CustomOptionMinIntegerValues> {
-    private static readonly pb::MessageParser<CustomOptionMinIntegerValues> _parser = new pb::MessageParser<CustomOptionMinIntegerValues>(() => new CustomOptionMinIntegerValues());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionMinIntegerValues> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[7]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionMinIntegerValues() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionMinIntegerValues(CustomOptionMinIntegerValues other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionMinIntegerValues Clone() {
-      return new CustomOptionMinIntegerValues(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionMinIntegerValues);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionMinIntegerValues other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionMinIntegerValues other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class CustomOptionMaxIntegerValues : pb::IMessage<CustomOptionMaxIntegerValues> {
-    private static readonly pb::MessageParser<CustomOptionMaxIntegerValues> _parser = new pb::MessageParser<CustomOptionMaxIntegerValues>(() => new CustomOptionMaxIntegerValues());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionMaxIntegerValues> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[8]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionMaxIntegerValues() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionMaxIntegerValues(CustomOptionMaxIntegerValues other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionMaxIntegerValues Clone() {
-      return new CustomOptionMaxIntegerValues(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionMaxIntegerValues);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionMaxIntegerValues other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionMaxIntegerValues other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class CustomOptionOtherValues : pb::IMessage<CustomOptionOtherValues> {
-    private static readonly pb::MessageParser<CustomOptionOtherValues> _parser = new pb::MessageParser<CustomOptionOtherValues>(() => new CustomOptionOtherValues());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<CustomOptionOtherValues> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[9]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionOtherValues() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionOtherValues(CustomOptionOtherValues other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public CustomOptionOtherValues Clone() {
-      return new CustomOptionOtherValues(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as CustomOptionOtherValues);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(CustomOptionOtherValues other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(CustomOptionOtherValues other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class SettingRealsFromPositiveInts : pb::IMessage<SettingRealsFromPositiveInts> {
-    private static readonly pb::MessageParser<SettingRealsFromPositiveInts> _parser = new pb::MessageParser<SettingRealsFromPositiveInts>(() => new SettingRealsFromPositiveInts());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<SettingRealsFromPositiveInts> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[10]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public SettingRealsFromPositiveInts() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public SettingRealsFromPositiveInts(SettingRealsFromPositiveInts other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public SettingRealsFromPositiveInts Clone() {
-      return new SettingRealsFromPositiveInts(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as SettingRealsFromPositiveInts);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(SettingRealsFromPositiveInts other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(SettingRealsFromPositiveInts other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class SettingRealsFromNegativeInts : pb::IMessage<SettingRealsFromNegativeInts> {
-    private static readonly pb::MessageParser<SettingRealsFromNegativeInts> _parser = new pb::MessageParser<SettingRealsFromNegativeInts>(() => new SettingRealsFromNegativeInts());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<SettingRealsFromNegativeInts> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[11]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public SettingRealsFromNegativeInts() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public SettingRealsFromNegativeInts(SettingRealsFromNegativeInts other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public SettingRealsFromNegativeInts Clone() {
-      return new SettingRealsFromNegativeInts(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as SettingRealsFromNegativeInts);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(SettingRealsFromNegativeInts other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(SettingRealsFromNegativeInts other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class ComplexOptionType1 : pb::IMessage<ComplexOptionType1> {
-    private static readonly pb::MessageParser<ComplexOptionType1> _parser = new pb::MessageParser<ComplexOptionType1>(() => new ComplexOptionType1());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<ComplexOptionType1> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[12]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType1() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType1(ComplexOptionType1 other) : this() {
-      foo_ = other.foo_;
-      foo2_ = other.foo2_;
-      foo3_ = other.foo3_;
-      foo4_ = other.foo4_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType1 Clone() {
-      return new ComplexOptionType1(this);
-    }
-
-    /// <summary>Field number for the "foo" field.</summary>
-    public const int FooFieldNumber = 1;
-    private int foo_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Foo {
-      get { return foo_; }
-      set {
-        foo_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "foo2" field.</summary>
-    public const int Foo2FieldNumber = 2;
-    private int foo2_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Foo2 {
-      get { return foo2_; }
-      set {
-        foo2_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "foo3" field.</summary>
-    public const int Foo3FieldNumber = 3;
-    private int foo3_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Foo3 {
-      get { return foo3_; }
-      set {
-        foo3_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "foo4" field.</summary>
-    public const int Foo4FieldNumber = 4;
-    private static readonly pb::FieldCodec<int> _repeated_foo4_codec
-        = pb::FieldCodec.ForInt32(34);
-    private readonly pbc::RepeatedField<int> foo4_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<int> Foo4 {
-      get { return foo4_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as ComplexOptionType1);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(ComplexOptionType1 other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Foo != other.Foo) return false;
-      if (Foo2 != other.Foo2) return false;
-      if (Foo3 != other.Foo3) return false;
-      if(!foo4_.Equals(other.foo4_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Foo != 0) hash ^= Foo.GetHashCode();
-      if (Foo2 != 0) hash ^= Foo2.GetHashCode();
-      if (Foo3 != 0) hash ^= Foo3.GetHashCode();
-      hash ^= foo4_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Foo != 0) {
-        output.WriteRawTag(8);
-        output.WriteInt32(Foo);
-      }
-      if (Foo2 != 0) {
-        output.WriteRawTag(16);
-        output.WriteInt32(Foo2);
-      }
-      if (Foo3 != 0) {
-        output.WriteRawTag(24);
-        output.WriteInt32(Foo3);
-      }
-      foo4_.WriteTo(output, _repeated_foo4_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Foo != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Foo);
-      }
-      if (Foo2 != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Foo2);
-      }
-      if (Foo3 != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Foo3);
-      }
-      size += foo4_.CalculateSize(_repeated_foo4_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(ComplexOptionType1 other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Foo != 0) {
-        Foo = other.Foo;
-      }
-      if (other.Foo2 != 0) {
-        Foo2 = other.Foo2;
-      }
-      if (other.Foo3 != 0) {
-        Foo3 = other.Foo3;
-      }
-      foo4_.Add(other.foo4_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Foo = input.ReadInt32();
-            break;
-          }
-          case 16: {
-            Foo2 = input.ReadInt32();
-            break;
-          }
-          case 24: {
-            Foo3 = input.ReadInt32();
-            break;
-          }
-          case 34:
-          case 32: {
-            foo4_.AddEntriesFrom(input, _repeated_foo4_codec);
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class ComplexOptionType2 : pb::IMessage<ComplexOptionType2> {
-    private static readonly pb::MessageParser<ComplexOptionType2> _parser = new pb::MessageParser<ComplexOptionType2>(() => new ComplexOptionType2());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<ComplexOptionType2> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[13]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType2() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType2(ComplexOptionType2 other) : this() {
-      Bar = other.bar_ != null ? other.Bar.Clone() : null;
-      baz_ = other.baz_;
-      Fred = other.fred_ != null ? other.Fred.Clone() : null;
-      barney_ = other.barney_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType2 Clone() {
-      return new ComplexOptionType2(this);
-    }
-
-    /// <summary>Field number for the "bar" field.</summary>
-    public const int BarFieldNumber = 1;
-    private global::UnitTest.Issues.TestProtos.ComplexOptionType1 bar_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::UnitTest.Issues.TestProtos.ComplexOptionType1 Bar {
-      get { return bar_; }
-      set {
-        bar_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "baz" field.</summary>
-    public const int BazFieldNumber = 2;
-    private int baz_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Baz {
-      get { return baz_; }
-      set {
-        baz_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "fred" field.</summary>
-    public const int FredFieldNumber = 3;
-    private global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 fred_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 Fred {
-      get { return fred_; }
-      set {
-        fred_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "barney" field.</summary>
-    public const int BarneyFieldNumber = 4;
-    private static readonly pb::FieldCodec<global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4> _repeated_barney_codec
-        = pb::FieldCodec.ForMessage(34, global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.Parser);
-    private readonly pbc::RepeatedField<global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4> barney_ = new pbc::RepeatedField<global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4> Barney {
-      get { return barney_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as ComplexOptionType2);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(ComplexOptionType2 other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (!object.Equals(Bar, other.Bar)) return false;
-      if (Baz != other.Baz) return false;
-      if (!object.Equals(Fred, other.Fred)) return false;
-      if(!barney_.Equals(other.barney_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (bar_ != null) hash ^= Bar.GetHashCode();
-      if (Baz != 0) hash ^= Baz.GetHashCode();
-      if (fred_ != null) hash ^= Fred.GetHashCode();
-      hash ^= barney_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (bar_ != null) {
-        output.WriteRawTag(10);
-        output.WriteMessage(Bar);
-      }
-      if (Baz != 0) {
-        output.WriteRawTag(16);
-        output.WriteInt32(Baz);
-      }
-      if (fred_ != null) {
-        output.WriteRawTag(26);
-        output.WriteMessage(Fred);
-      }
-      barney_.WriteTo(output, _repeated_barney_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (bar_ != null) {
-        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Bar);
-      }
-      if (Baz != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Baz);
-      }
-      if (fred_ != null) {
-        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Fred);
-      }
-      size += barney_.CalculateSize(_repeated_barney_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(ComplexOptionType2 other) {
-      if (other == null) {
-        return;
-      }
-      if (other.bar_ != null) {
-        if (bar_ == null) {
-          bar_ = new global::UnitTest.Issues.TestProtos.ComplexOptionType1();
-        }
-        Bar.MergeFrom(other.Bar);
-      }
-      if (other.Baz != 0) {
-        Baz = other.Baz;
-      }
-      if (other.fred_ != null) {
-        if (fred_ == null) {
-          fred_ = new global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4();
-        }
-        Fred.MergeFrom(other.Fred);
-      }
-      barney_.Add(other.barney_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 10: {
-            if (bar_ == null) {
-              bar_ = new global::UnitTest.Issues.TestProtos.ComplexOptionType1();
-            }
-            input.ReadMessage(bar_);
-            break;
-          }
-          case 16: {
-            Baz = input.ReadInt32();
-            break;
-          }
-          case 26: {
-            if (fred_ == null) {
-              fred_ = new global::UnitTest.Issues.TestProtos.ComplexOptionType2.Types.ComplexOptionType4();
-            }
-            input.ReadMessage(fred_);
-            break;
-          }
-          case 34: {
-            barney_.AddEntriesFrom(input, _repeated_barney_codec);
-            break;
-          }
-        }
-      }
-    }
-
-    #region Nested types
-    /// <summary>Container for nested types declared in the ComplexOptionType2 message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      public sealed partial class ComplexOptionType4 : pb::IMessage<ComplexOptionType4> {
-        private static readonly pb::MessageParser<ComplexOptionType4> _parser = new pb::MessageParser<ComplexOptionType4>(() => new ComplexOptionType4());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pb::MessageParser<ComplexOptionType4> Parser { get { return _parser; } }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pbr::MessageDescriptor Descriptor {
-          get { return global::UnitTest.Issues.TestProtos.ComplexOptionType2.Descriptor.NestedTypes[0]; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        pbr::MessageDescriptor pb::IMessage.Descriptor {
-          get { return Descriptor; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public ComplexOptionType4() {
-          OnConstruction();
-        }
-
-        partial void OnConstruction();
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public ComplexOptionType4(ComplexOptionType4 other) : this() {
-          waldo_ = other.waldo_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public ComplexOptionType4 Clone() {
-          return new ComplexOptionType4(this);
-        }
-
-        /// <summary>Field number for the "waldo" field.</summary>
-        public const int WaldoFieldNumber = 1;
-        private int waldo_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int Waldo {
-          get { return waldo_; }
-          set {
-            waldo_ = value;
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override bool Equals(object other) {
-          return Equals(other as ComplexOptionType4);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public bool Equals(ComplexOptionType4 other) {
-          if (ReferenceEquals(other, null)) {
-            return false;
-          }
-          if (ReferenceEquals(other, this)) {
-            return true;
-          }
-          if (Waldo != other.Waldo) return false;
-          return Equals(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override int GetHashCode() {
-          int hash = 1;
-          if (Waldo != 0) hash ^= Waldo.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
-          return hash;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override string ToString() {
-          return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void WriteTo(pb::CodedOutputStream output) {
-          if (Waldo != 0) {
-            output.WriteRawTag(8);
-            output.WriteInt32(Waldo);
-          }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int CalculateSize() {
-          int size = 0;
-          if (Waldo != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Waldo);
-          }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
-          return size;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(ComplexOptionType4 other) {
-          if (other == null) {
-            return;
-          }
-          if (other.Waldo != 0) {
-            Waldo = other.Waldo;
-          }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(pb::CodedInputStream input) {
-          uint tag;
-          while ((tag = input.ReadTag()) != 0) {
-            switch(tag) {
-              default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-                break;
-              case 8: {
-                Waldo = input.ReadInt32();
-                break;
-              }
-            }
-          }
-        }
-
-      }
-
-    }
-    #endregion
-
-  }
-
-  public sealed partial class ComplexOptionType3 : pb::IMessage<ComplexOptionType3> {
-    private static readonly pb::MessageParser<ComplexOptionType3> _parser = new pb::MessageParser<ComplexOptionType3>(() => new ComplexOptionType3());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<ComplexOptionType3> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[14]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType3() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType3(ComplexOptionType3 other) : this() {
-      qux_ = other.qux_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ComplexOptionType3 Clone() {
-      return new ComplexOptionType3(this);
-    }
-
-    /// <summary>Field number for the "qux" field.</summary>
-    public const int QuxFieldNumber = 1;
-    private int qux_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Qux {
-      get { return qux_; }
-      set {
-        qux_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as ComplexOptionType3);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(ComplexOptionType3 other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Qux != other.Qux) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Qux != 0) hash ^= Qux.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Qux != 0) {
-        output.WriteRawTag(8);
-        output.WriteInt32(Qux);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Qux != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Qux);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(ComplexOptionType3 other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Qux != 0) {
-        Qux = other.Qux;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Qux = input.ReadInt32();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  /// <summary>
-  /// Note that we try various different ways of naming the same extension.
-  /// </summary>
-  public sealed partial class VariousComplexOptions : pb::IMessage<VariousComplexOptions> {
-    private static readonly pb::MessageParser<VariousComplexOptions> _parser = new pb::MessageParser<VariousComplexOptions>(() => new VariousComplexOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<VariousComplexOptions> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[15]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public VariousComplexOptions() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public VariousComplexOptions(VariousComplexOptions other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public VariousComplexOptions Clone() {
-      return new VariousComplexOptions(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as VariousComplexOptions);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(VariousComplexOptions other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(VariousComplexOptions other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  /// <summary>
-  /// A helper type used to test aggregate option parsing
-  /// </summary>
-  public sealed partial class Aggregate : pb::IMessage<Aggregate> {
-    private static readonly pb::MessageParser<Aggregate> _parser = new pb::MessageParser<Aggregate>(() => new Aggregate());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<Aggregate> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[16]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public Aggregate() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public Aggregate(Aggregate other) : this() {
-      i_ = other.i_;
-      s_ = other.s_;
-      Sub = other.sub_ != null ? other.Sub.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public Aggregate Clone() {
-      return new Aggregate(this);
-    }
-
-    /// <summary>Field number for the "i" field.</summary>
-    public const int IFieldNumber = 1;
-    private int i_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int I {
-      get { return i_; }
-      set {
-        i_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "s" field.</summary>
-    public const int SFieldNumber = 2;
-    private string s_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string S {
-      get { return s_; }
-      set {
-        s_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "sub" field.</summary>
-    public const int SubFieldNumber = 3;
-    private global::UnitTest.Issues.TestProtos.Aggregate sub_;
-    /// <summary>
-    /// A nested object
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::UnitTest.Issues.TestProtos.Aggregate Sub {
-      get { return sub_; }
-      set {
-        sub_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as Aggregate);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(Aggregate other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (I != other.I) return false;
-      if (S != other.S) return false;
-      if (!object.Equals(Sub, other.Sub)) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (I != 0) hash ^= I.GetHashCode();
-      if (S.Length != 0) hash ^= S.GetHashCode();
-      if (sub_ != null) hash ^= Sub.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (I != 0) {
-        output.WriteRawTag(8);
-        output.WriteInt32(I);
-      }
-      if (S.Length != 0) {
-        output.WriteRawTag(18);
-        output.WriteString(S);
-      }
-      if (sub_ != null) {
-        output.WriteRawTag(26);
-        output.WriteMessage(Sub);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (I != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(I);
-      }
-      if (S.Length != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeStringSize(S);
-      }
-      if (sub_ != null) {
-        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Sub);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(Aggregate other) {
-      if (other == null) {
-        return;
-      }
-      if (other.I != 0) {
-        I = other.I;
-      }
-      if (other.S.Length != 0) {
-        S = other.S;
-      }
-      if (other.sub_ != null) {
-        if (sub_ == null) {
-          sub_ = new global::UnitTest.Issues.TestProtos.Aggregate();
-        }
-        Sub.MergeFrom(other.Sub);
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            I = input.ReadInt32();
-            break;
-          }
-          case 18: {
-            S = input.ReadString();
-            break;
-          }
-          case 26: {
-            if (sub_ == null) {
-              sub_ = new global::UnitTest.Issues.TestProtos.Aggregate();
-            }
-            input.ReadMessage(sub_);
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class AggregateMessage : pb::IMessage<AggregateMessage> {
-    private static readonly pb::MessageParser<AggregateMessage> _parser = new pb::MessageParser<AggregateMessage>(() => new AggregateMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<AggregateMessage> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[17]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public AggregateMessage() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public AggregateMessage(AggregateMessage other) : this() {
-      fieldname_ = other.fieldname_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public AggregateMessage Clone() {
-      return new AggregateMessage(this);
-    }
-
-    /// <summary>Field number for the "fieldname" field.</summary>
-    public const int FieldnameFieldNumber = 1;
-    private int fieldname_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Fieldname {
-      get { return fieldname_; }
-      set {
-        fieldname_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as AggregateMessage);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(AggregateMessage other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Fieldname != other.Fieldname) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Fieldname != 0) hash ^= Fieldname.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Fieldname != 0) {
-        output.WriteRawTag(8);
-        output.WriteInt32(Fieldname);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Fieldname != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Fieldname);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(AggregateMessage other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Fieldname != 0) {
-        Fieldname = other.Fieldname;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            Fieldname = input.ReadInt32();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  /// <summary>
-  /// Test custom options for nested type.
-  /// </summary>
-  public sealed partial class NestedOptionType : pb::IMessage<NestedOptionType> {
-    private static readonly pb::MessageParser<NestedOptionType> _parser = new pb::MessageParser<NestedOptionType>(() => new NestedOptionType());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<NestedOptionType> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Reflection.Descriptor.MessageTypes[18]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public NestedOptionType() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public NestedOptionType(NestedOptionType other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public NestedOptionType Clone() {
-      return new NestedOptionType(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as NestedOptionType);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(NestedOptionType other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(NestedOptionType other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-    #region Nested types
-    /// <summary>Container for nested types declared in the NestedOptionType message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      public enum NestedEnum {
-        [pbr::OriginalName("UNSPECIFIED")] Unspecified = 0,
-        [pbr::OriginalName("NESTED_ENUM_VALUE")] Value = 1,
-      }
-
-      public sealed partial class NestedMessage : pb::IMessage<NestedMessage> {
-        private static readonly pb::MessageParser<NestedMessage> _parser = new pb::MessageParser<NestedMessage>(() => new NestedMessage());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pb::MessageParser<NestedMessage> Parser { get { return _parser; } }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pbr::MessageDescriptor Descriptor {
-          get { return global::UnitTest.Issues.TestProtos.NestedOptionType.Descriptor.NestedTypes[0]; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        pbr::MessageDescriptor pb::IMessage.Descriptor {
-          get { return Descriptor; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public NestedMessage() {
-          OnConstruction();
-        }
-
-        partial void OnConstruction();
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public NestedMessage(NestedMessage other) : this() {
-          nestedField_ = other.nestedField_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public NestedMessage Clone() {
-          return new NestedMessage(this);
-        }
-
-        /// <summary>Field number for the "nested_field" field.</summary>
-        public const int NestedFieldFieldNumber = 1;
-        private int nestedField_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int NestedField {
-          get { return nestedField_; }
-          set {
-            nestedField_ = value;
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override bool Equals(object other) {
-          return Equals(other as NestedMessage);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public bool Equals(NestedMessage other) {
-          if (ReferenceEquals(other, null)) {
-            return false;
-          }
-          if (ReferenceEquals(other, this)) {
-            return true;
-          }
-          if (NestedField != other.NestedField) return false;
-          return Equals(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override int GetHashCode() {
-          int hash = 1;
-          if (NestedField != 0) hash ^= NestedField.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
-          return hash;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override string ToString() {
-          return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void WriteTo(pb::CodedOutputStream output) {
-          if (NestedField != 0) {
-            output.WriteRawTag(8);
-            output.WriteInt32(NestedField);
-          }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int CalculateSize() {
-          int size = 0;
-          if (NestedField != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(NestedField);
-          }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
-          return size;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(NestedMessage other) {
-          if (other == null) {
-            return;
-          }
-          if (other.NestedField != 0) {
-            NestedField = other.NestedField;
-          }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(pb::CodedInputStream input) {
-          uint tag;
-          while ((tag = input.ReadTag()) != 0) {
-            switch(tag) {
-              default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-                break;
-              case 8: {
-                NestedField = input.ReadInt32();
-                break;
-              }
-            }
-          }
-        }
-
-      }
-
-    }
-    #endregion
-
-  }
-
-  #endregion
-
-}
-
-#endregion Designer generated code
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs
index 6bf9715..263e17c 100644
--- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs
+++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: unittest_import_proto3.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest_import_proto3.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -11,11 +9,12 @@
 using scg = global::System.Collections.Generic;
 namespace Google.Protobuf.TestProtos {
 
-  /// <summary>Holder for reflection information generated from unittest_import_proto3.proto</summary>
+  /// <summary>Holder for reflection information generated from google/protobuf/unittest_import_proto3.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class UnittestImportProto3Reflection {
 
     #region Descriptor
-    /// <summary>File descriptor for unittest_import_proto3.proto</summary>
+    /// <summary>File descriptor for google/protobuf/unittest_import_proto3.proto</summary>
     public static pbr::FileDescriptor Descriptor {
       get { return descriptor; }
     }
@@ -24,12 +23,14 @@
     static UnittestImportProto3Reflection() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "Chx1bml0dGVzdF9pbXBvcnRfcHJvdG8zLnByb3RvEhhwcm90b2J1Zl91bml0",
-            "dGVzdF9pbXBvcnQaI3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcHJvdG8zLnBy",
-            "b3RvIhoKDUltcG9ydE1lc3NhZ2USCQoBZBgBIAEoBSpZCgpJbXBvcnRFbnVt",
-            "EhsKF0lNUE9SVF9FTlVNX1VOU1BFQ0lGSUVEEAASDgoKSU1QT1JUX0ZPTxAH",
-            "Eg4KCklNUE9SVF9CQVIQCBIOCgpJTVBPUlRfQkFaEAlCHaoCGkdvb2dsZS5Q",
-            "cm90b2J1Zi5UZXN0UHJvdG9zUABiBnByb3RvMw=="));
+            "Cixnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90",
+            "bxIYcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0GjNnb29nbGUvcHJvdG9idWYv",
+            "dW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wcm90bzMucHJvdG8iGgoNSW1wb3J0",
+            "TWVzc2FnZRIJCgFkGAEgASgFKlkKCkltcG9ydEVudW0SGwoXSU1QT1JUX0VO",
+            "VU1fVU5TUEVDSUZJRUQQABIOCgpJTVBPUlRfRk9PEAcSDgoKSU1QT1JUX0JB",
+            "UhAIEg4KCklNUE9SVF9CQVoQCUI8Chhjb20uZ29vZ2xlLnByb3RvYnVmLnRl",
+            "c3RIAfgBAaoCGkdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zUABiBnByb3Rv",
+            "Mw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.UnittestImportPublicProto3Reflection.Descriptor, },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.ImportEnum), }, new pbr::GeneratedClrTypeInfo[] {
@@ -50,36 +51,29 @@
   #endregion
 
   #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ImportMessage : pb::IMessage<ImportMessage> {
     private static readonly pb::MessageParser<ImportMessage> _parser = new pb::MessageParser<ImportMessage>(() => new ImportMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ImportMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestImportProto3Reflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ImportMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ImportMessage(ImportMessage other) : this() {
       d_ = other.d_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ImportMessage Clone() {
       return new ImportMessage(this);
     }
@@ -87,7 +81,6 @@
     /// <summary>Field number for the "d" field.</summary>
     public const int DFieldNumber = 1;
     private int d_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int D {
       get { return d_; }
       set {
@@ -95,12 +88,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ImportMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ImportMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -109,48 +100,34 @@
         return true;
       }
       if (D != other.D) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (D != 0) hash ^= D.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (D != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(D);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (D != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(D);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ImportMessage other) {
       if (other == null) {
         return;
@@ -158,16 +135,14 @@
       if (other.D != 0) {
         D = other.D;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             D = input.ReadInt32();
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs
index 97d181a..b471a8c 100644
--- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs
+++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: unittest_import_public_proto3.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest_import_public_proto3.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -11,11 +9,12 @@
 using scg = global::System.Collections.Generic;
 namespace Google.Protobuf.TestProtos {
 
-  /// <summary>Holder for reflection information generated from unittest_import_public_proto3.proto</summary>
+  /// <summary>Holder for reflection information generated from google/protobuf/unittest_import_public_proto3.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class UnittestImportPublicProto3Reflection {
 
     #region Descriptor
-    /// <summary>File descriptor for unittest_import_public_proto3.proto</summary>
+    /// <summary>File descriptor for google/protobuf/unittest_import_public_proto3.proto</summary>
     public static pbr::FileDescriptor Descriptor {
       get { return descriptor; }
     }
@@ -24,10 +23,10 @@
     static UnittestImportPublicProto3Reflection() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "CiN1bml0dGVzdF9pbXBvcnRfcHVibGljX3Byb3RvMy5wcm90bxIYcHJvdG9i",
-            "dWZfdW5pdHRlc3RfaW1wb3J0IiAKE1B1YmxpY0ltcG9ydE1lc3NhZ2USCQoB",
-            "ZRgBIAEoBUIdqgIaR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3NiBnByb3Rv",
-            "Mw=="));
+            "CjNnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wcm90",
+            "bzMucHJvdG8SGHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCIgChNQdWJsaWNJ",
+            "bXBvcnRNZXNzYWdlEgkKAWUYASABKAVCNwoYY29tLmdvb2dsZS5wcm90b2J1",
+            "Zi50ZXN0qgIaR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3NiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -38,36 +37,29 @@
 
   }
   #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class PublicImportMessage : pb::IMessage<PublicImportMessage> {
     private static readonly pb::MessageParser<PublicImportMessage> _parser = new pb::MessageParser<PublicImportMessage>(() => new PublicImportMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<PublicImportMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestImportPublicProto3Reflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public PublicImportMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public PublicImportMessage(PublicImportMessage other) : this() {
       e_ = other.e_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public PublicImportMessage Clone() {
       return new PublicImportMessage(this);
     }
@@ -75,7 +67,6 @@
     /// <summary>Field number for the "e" field.</summary>
     public const int EFieldNumber = 1;
     private int e_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int E {
       get { return e_; }
       set {
@@ -83,12 +74,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as PublicImportMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(PublicImportMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -97,48 +86,34 @@
         return true;
       }
       if (E != other.E) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (E != 0) hash ^= E.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (E != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(E);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (E != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(E);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(PublicImportMessage other) {
       if (other == null) {
         return;
@@ -146,16 +121,14 @@
       if (other.E != 0) {
         E = other.E;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             E = input.ReadInt32();
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs
index 01a86f8..7d4451b 100644
--- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs
+++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: unittest_issues.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: unittest_issues.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace UnitTest.Issues.TestProtos {
 
   /// <summary>Holder for reflection information generated from unittest_issues.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class UnittestIssuesReflection {
 
     #region Descriptor
@@ -44,14 +43,11 @@
             "MV9pbnQzMhgFIAEoBUgAEhQKDHBsYWluX3N0cmluZxgBIAEoCRISCghvMl9p",
             "bnQzMhgGIAEoBUgBEhMKCW8yX3N0cmluZxgDIAEoCUgBQgQKAm8xQgQKAm8y",
             "IksKDFRlc3RKc29uTmFtZRIMCgRuYW1lGAEgASgJEhkKC2Rlc2NyaXB0aW9u",
-            "GAIgASgJUgRkZXNjEhIKBGd1aWQYAyABKAlSBGV4aWQifwoMT25lb2ZNZXJn",
-            "aW5nEg4KBHRleHQYASABKAlIABI2CgZuZXN0ZWQYAiABKAsyJC51bml0dGVz",
-            "dF9pc3N1ZXMuT25lb2ZNZXJnaW5nLk5lc3RlZEgAGh4KBk5lc3RlZBIJCgF4",
-            "GAEgASgFEgkKAXkYAiABKAVCBwoFdmFsdWUqVQoMTmVnYXRpdmVFbnVtEhYK",
-            "Ek5FR0FUSVZFX0VOVU1fWkVSTxAAEhYKCUZpdmVCZWxvdxD7//////////8B",
-            "EhUKCE1pbnVzT25lEP///////////wEqLgoORGVwcmVjYXRlZEVudW0SEwoP",
-            "REVQUkVDQVRFRF9aRVJPEAASBwoDb25lEAFCHaoCGlVuaXRUZXN0Lklzc3Vl",
-            "cy5UZXN0UHJvdG9zYgZwcm90bzM="));
+            "GAIgASgJUgRkZXNjEhIKBGd1aWQYAyABKAlSBGV4aWQqVQoMTmVnYXRpdmVF",
+            "bnVtEhYKEk5FR0FUSVZFX0VOVU1fWkVSTxAAEhYKCUZpdmVCZWxvdxD7////",
+            "//////8BEhUKCE1pbnVzT25lEP///////////wEqLgoORGVwcmVjYXRlZEVu",
+            "dW0SEwoPREVQUkVDQVRFRF9aRVJPEAASBwoDb25lEAFCH0gBqgIaVW5pdFRl",
+            "c3QuSXNzdWVzLlRlc3RQcm90b3NiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.NegativeEnum), typeof(global::UnitTest.Issues.TestProtos.DeprecatedEnum), }, new pbr::GeneratedClrTypeInfo[] {
@@ -62,8 +58,7 @@
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ItemField), global::UnitTest.Issues.TestProtos.ItemField.Parser, new[]{ "Item" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ReservedNames), global::UnitTest.Issues.TestProtos.ReservedNames.Parser, new[]{ "Types_", "Descriptor_" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.ReservedNames.Types.SomeNestedType), global::UnitTest.Issues.TestProtos.ReservedNames.Types.SomeNestedType.Parser, null, null, null, null)}),
             new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestJsonFieldOrdering), global::UnitTest.Issues.TestProtos.TestJsonFieldOrdering.Parser, new[]{ "PlainInt32", "O1String", "O1Int32", "PlainString", "O2Int32", "O2String" }, new[]{ "O1", "O2" }, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestJsonName), global::UnitTest.Issues.TestProtos.TestJsonName.Parser, new[]{ "Name", "Description", "Guid" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.OneofMerging), global::UnitTest.Issues.TestProtos.OneofMerging.Parser, new[]{ "Text", "Nested" }, new[]{ "Value" }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested), global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested.Parser, new[]{ "X", "Y" }, null, null, null)})
+            new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.TestJsonName), global::UnitTest.Issues.TestProtos.TestJsonName.Parser, new[]{ "Name", "Description", "Guid" }, null, null, null)
           }));
     }
     #endregion
@@ -85,48 +80,39 @@
 
   #region Messages
   /// <summary>
-  /// Issue 307: when generating doubly-nested types, any references
-  /// should be of the form A.Types.B.Types.C.
+  ///  Issue 307: when generating doubly-nested types, any references
+  ///  should be of the form A.Types.B.Types.C.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Issue307 : pb::IMessage<Issue307> {
     private static readonly pb::MessageParser<Issue307> _parser = new pb::MessageParser<Issue307>(() => new Issue307());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Issue307> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Issue307() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Issue307(Issue307 other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Issue307 Clone() {
       return new Issue307(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Issue307);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Issue307 other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -134,54 +120,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Issue307 other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -189,47 +159,38 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the Issue307 message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       public sealed partial class NestedOnce : pb::IMessage<NestedOnce> {
         private static readonly pb::MessageParser<NestedOnce> _parser = new pb::MessageParser<NestedOnce>(() => new NestedOnce());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<NestedOnce> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::UnitTest.Issues.TestProtos.Issue307.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedOnce() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedOnce(NestedOnce other) : this() {
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedOnce Clone() {
           return new NestedOnce(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as NestedOnce);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(NestedOnce other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -237,54 +198,38 @@
           if (ReferenceEquals(other, this)) {
             return true;
           }
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(NestedOnce other) {
           if (other == null) {
             return;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
             }
           }
@@ -292,47 +237,38 @@
 
         #region Nested types
         /// <summary>Container for nested types declared in the NestedOnce message type.</summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
         public static partial class Types {
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
           public sealed partial class NestedTwice : pb::IMessage<NestedTwice> {
             private static readonly pb::MessageParser<NestedTwice> _parser = new pb::MessageParser<NestedTwice>(() => new NestedTwice());
-            private pb::UnknownFieldSet _unknownFields;
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public static pb::MessageParser<NestedTwice> Parser { get { return _parser; } }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public static pbr::MessageDescriptor Descriptor {
               get { return global::UnitTest.Issues.TestProtos.Issue307.Types.NestedOnce.Descriptor.NestedTypes[0]; }
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             pbr::MessageDescriptor pb::IMessage.Descriptor {
               get { return Descriptor; }
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public NestedTwice() {
               OnConstruction();
             }
 
             partial void OnConstruction();
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public NestedTwice(NestedTwice other) : this() {
-              _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public NestedTwice Clone() {
               return new NestedTwice(this);
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public override bool Equals(object other) {
               return Equals(other as NestedTwice);
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public bool Equals(NestedTwice other) {
               if (ReferenceEquals(other, null)) {
                 return false;
@@ -340,54 +276,38 @@
               if (ReferenceEquals(other, this)) {
                 return true;
               }
-              return Equals(_unknownFields, other._unknownFields);
+              return true;
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public override int GetHashCode() {
               int hash = 1;
-              if (_unknownFields != null) {
-                hash ^= _unknownFields.GetHashCode();
-              }
               return hash;
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public override string ToString() {
               return pb::JsonFormatter.ToDiagnosticString(this);
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public void WriteTo(pb::CodedOutputStream output) {
-              if (_unknownFields != null) {
-                _unknownFields.WriteTo(output);
-              }
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public int CalculateSize() {
               int size = 0;
-              if (_unknownFields != null) {
-                size += _unknownFields.CalculateSize();
-              }
               return size;
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public void MergeFrom(NestedTwice other) {
               if (other == null) {
                 return;
               }
-              _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
             }
 
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
             public void MergeFrom(pb::CodedInputStream input) {
               uint tag;
               while ((tag = input.ReadTag()) != 0) {
                 switch(tag) {
                   default:
-                    _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                    input.SkipLastField();
                     break;
                 }
               }
@@ -405,38 +325,31 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class NegativeEnumMessage : pb::IMessage<NegativeEnumMessage> {
     private static readonly pb::MessageParser<NegativeEnumMessage> _parser = new pb::MessageParser<NegativeEnumMessage>(() => new NegativeEnumMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<NegativeEnumMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public NegativeEnumMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public NegativeEnumMessage(NegativeEnumMessage other) : this() {
       value_ = other.value_;
       values_ = other.values_.Clone();
       packedValues_ = other.packedValues_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public NegativeEnumMessage Clone() {
       return new NegativeEnumMessage(this);
     }
@@ -444,7 +357,6 @@
     /// <summary>Field number for the "value" field.</summary>
     public const int ValueFieldNumber = 1;
     private global::UnitTest.Issues.TestProtos.NegativeEnum value_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::UnitTest.Issues.TestProtos.NegativeEnum Value {
       get { return value_; }
       set {
@@ -457,7 +369,6 @@
     private static readonly pb::FieldCodec<global::UnitTest.Issues.TestProtos.NegativeEnum> _repeated_values_codec
         = pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::UnitTest.Issues.TestProtos.NegativeEnum) x);
     private readonly pbc::RepeatedField<global::UnitTest.Issues.TestProtos.NegativeEnum> values_ = new pbc::RepeatedField<global::UnitTest.Issues.TestProtos.NegativeEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::UnitTest.Issues.TestProtos.NegativeEnum> Values {
       get { return values_; }
     }
@@ -467,17 +378,14 @@
     private static readonly pb::FieldCodec<global::UnitTest.Issues.TestProtos.NegativeEnum> _repeated_packedValues_codec
         = pb::FieldCodec.ForEnum(26, x => (int) x, x => (global::UnitTest.Issues.TestProtos.NegativeEnum) x);
     private readonly pbc::RepeatedField<global::UnitTest.Issues.TestProtos.NegativeEnum> packedValues_ = new pbc::RepeatedField<global::UnitTest.Issues.TestProtos.NegativeEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::UnitTest.Issues.TestProtos.NegativeEnum> PackedValues {
       get { return packedValues_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as NegativeEnumMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(NegativeEnumMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -488,27 +396,21 @@
       if (Value != other.Value) return false;
       if(!values_.Equals(other.values_)) return false;
       if(!packedValues_.Equals(other.packedValues_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value != 0) hash ^= Value.GetHashCode();
       hash ^= values_.GetHashCode();
       hash ^= packedValues_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0) {
         output.WriteRawTag(8);
@@ -516,12 +418,8 @@
       }
       values_.WriteTo(output, _repeated_values_codec);
       packedValues_.WriteTo(output, _repeated_packedValues_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0) {
@@ -529,13 +427,9 @@
       }
       size += values_.CalculateSize(_repeated_values_codec);
       size += packedValues_.CalculateSize(_repeated_packedValues_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(NegativeEnumMessage other) {
       if (other == null) {
         return;
@@ -545,16 +439,14 @@
       }
       values_.Add(other.values_);
       packedValues_.Add(other.packedValues_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             value_ = (global::UnitTest.Issues.TestProtos.NegativeEnum) input.ReadEnum();
@@ -576,45 +468,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class DeprecatedChild : pb::IMessage<DeprecatedChild> {
     private static readonly pb::MessageParser<DeprecatedChild> _parser = new pb::MessageParser<DeprecatedChild>(() => new DeprecatedChild());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<DeprecatedChild> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DeprecatedChild() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DeprecatedChild(DeprecatedChild other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DeprecatedChild Clone() {
       return new DeprecatedChild(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as DeprecatedChild);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(DeprecatedChild other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -622,54 +505,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(DeprecatedChild other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -677,30 +544,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class DeprecatedFieldsMessage : pb::IMessage<DeprecatedFieldsMessage> {
     private static readonly pb::MessageParser<DeprecatedFieldsMessage> _parser = new pb::MessageParser<DeprecatedFieldsMessage>(() => new DeprecatedFieldsMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<DeprecatedFieldsMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DeprecatedFieldsMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DeprecatedFieldsMessage(DeprecatedFieldsMessage other) : this() {
       primitiveValue_ = other.primitiveValue_;
       primitiveArray_ = other.primitiveArray_.Clone();
@@ -708,10 +570,8 @@
       messageArray_ = other.messageArray_.Clone();
       enumValue_ = other.enumValue_;
       enumArray_ = other.enumArray_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DeprecatedFieldsMessage Clone() {
       return new DeprecatedFieldsMessage(this);
     }
@@ -719,8 +579,7 @@
     /// <summary>Field number for the "PrimitiveValue" field.</summary>
     public const int PrimitiveValueFieldNumber = 1;
     private int primitiveValue_;
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public int PrimitiveValue {
       get { return primitiveValue_; }
       set {
@@ -733,8 +592,7 @@
     private static readonly pb::FieldCodec<int> _repeated_primitiveArray_codec
         = pb::FieldCodec.ForInt32(18);
     private readonly pbc::RepeatedField<int> primitiveArray_ = new pbc::RepeatedField<int>();
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public pbc::RepeatedField<int> PrimitiveArray {
       get { return primitiveArray_; }
     }
@@ -742,8 +600,7 @@
     /// <summary>Field number for the "MessageValue" field.</summary>
     public const int MessageValueFieldNumber = 3;
     private global::UnitTest.Issues.TestProtos.DeprecatedChild messageValue_;
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public global::UnitTest.Issues.TestProtos.DeprecatedChild MessageValue {
       get { return messageValue_; }
       set {
@@ -756,8 +613,7 @@
     private static readonly pb::FieldCodec<global::UnitTest.Issues.TestProtos.DeprecatedChild> _repeated_messageArray_codec
         = pb::FieldCodec.ForMessage(34, global::UnitTest.Issues.TestProtos.DeprecatedChild.Parser);
     private readonly pbc::RepeatedField<global::UnitTest.Issues.TestProtos.DeprecatedChild> messageArray_ = new pbc::RepeatedField<global::UnitTest.Issues.TestProtos.DeprecatedChild>();
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public pbc::RepeatedField<global::UnitTest.Issues.TestProtos.DeprecatedChild> MessageArray {
       get { return messageArray_; }
     }
@@ -765,8 +621,7 @@
     /// <summary>Field number for the "EnumValue" field.</summary>
     public const int EnumValueFieldNumber = 5;
     private global::UnitTest.Issues.TestProtos.DeprecatedEnum enumValue_ = 0;
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public global::UnitTest.Issues.TestProtos.DeprecatedEnum EnumValue {
       get { return enumValue_; }
       set {
@@ -779,18 +634,15 @@
     private static readonly pb::FieldCodec<global::UnitTest.Issues.TestProtos.DeprecatedEnum> _repeated_enumArray_codec
         = pb::FieldCodec.ForEnum(50, x => (int) x, x => (global::UnitTest.Issues.TestProtos.DeprecatedEnum) x);
     private readonly pbc::RepeatedField<global::UnitTest.Issues.TestProtos.DeprecatedEnum> enumArray_ = new pbc::RepeatedField<global::UnitTest.Issues.TestProtos.DeprecatedEnum>();
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public pbc::RepeatedField<global::UnitTest.Issues.TestProtos.DeprecatedEnum> EnumArray {
       get { return enumArray_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as DeprecatedFieldsMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(DeprecatedFieldsMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -804,10 +656,9 @@
       if(!messageArray_.Equals(other.messageArray_)) return false;
       if (EnumValue != other.EnumValue) return false;
       if(!enumArray_.Equals(other.enumArray_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (PrimitiveValue != 0) hash ^= PrimitiveValue.GetHashCode();
@@ -816,18 +667,13 @@
       hash ^= messageArray_.GetHashCode();
       if (EnumValue != 0) hash ^= EnumValue.GetHashCode();
       hash ^= enumArray_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (PrimitiveValue != 0) {
         output.WriteRawTag(8);
@@ -844,12 +690,8 @@
         output.WriteEnum((int) EnumValue);
       }
       enumArray_.WriteTo(output, _repeated_enumArray_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (PrimitiveValue != 0) {
@@ -864,13 +706,9 @@
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) EnumValue);
       }
       size += enumArray_.CalculateSize(_repeated_enumArray_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(DeprecatedFieldsMessage other) {
       if (other == null) {
         return;
@@ -890,16 +728,14 @@
         EnumValue = other.EnumValue;
       }
       enumArray_.Add(other.enumArray_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             PrimitiveValue = input.ReadInt32();
@@ -937,38 +773,31 @@
   }
 
   /// <summary>
-  /// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
+  ///  Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ItemField : pb::IMessage<ItemField> {
     private static readonly pb::MessageParser<ItemField> _parser = new pb::MessageParser<ItemField>(() => new ItemField());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ItemField> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[4]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ItemField() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ItemField(ItemField other) : this() {
       item_ = other.item_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ItemField Clone() {
       return new ItemField(this);
     }
@@ -976,7 +805,6 @@
     /// <summary>Field number for the "item" field.</summary>
     public const int ItemFieldNumber = 1;
     private int item_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Item {
       get { return item_; }
       set {
@@ -984,12 +812,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ItemField);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ItemField other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -998,48 +824,34 @@
         return true;
       }
       if (Item != other.Item) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Item != 0) hash ^= Item.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Item != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(Item);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Item != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Item);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ItemField other) {
       if (other == null) {
         return;
@@ -1047,16 +859,14 @@
       if (other.Item != 0) {
         Item = other.Item;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Item = input.ReadInt32();
@@ -1068,37 +878,30 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ReservedNames : pb::IMessage<ReservedNames> {
     private static readonly pb::MessageParser<ReservedNames> _parser = new pb::MessageParser<ReservedNames>(() => new ReservedNames());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ReservedNames> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[5]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ReservedNames() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ReservedNames(ReservedNames other) : this() {
       types_ = other.types_;
       descriptor_ = other.descriptor_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ReservedNames Clone() {
       return new ReservedNames(this);
     }
@@ -1106,7 +909,6 @@
     /// <summary>Field number for the "types" field.</summary>
     public const int Types_FieldNumber = 1;
     private int types_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Types_ {
       get { return types_; }
       set {
@@ -1117,7 +919,6 @@
     /// <summary>Field number for the "descriptor" field.</summary>
     public const int Descriptor_FieldNumber = 2;
     private int descriptor_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Descriptor_ {
       get { return descriptor_; }
       set {
@@ -1125,12 +926,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ReservedNames);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ReservedNames other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1140,26 +939,20 @@
       }
       if (Types_ != other.Types_) return false;
       if (Descriptor_ != other.Descriptor_) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Types_ != 0) hash ^= Types_.GetHashCode();
       if (Descriptor_ != 0) hash ^= Descriptor_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Types_ != 0) {
         output.WriteRawTag(8);
@@ -1169,12 +962,8 @@
         output.WriteRawTag(16);
         output.WriteInt32(Descriptor_);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Types_ != 0) {
@@ -1183,13 +972,9 @@
       if (Descriptor_ != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Descriptor_);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ReservedNames other) {
       if (other == null) {
         return;
@@ -1200,16 +985,14 @@
       if (other.Descriptor_ != 0) {
         Descriptor_ = other.Descriptor_;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Types_ = input.ReadInt32();
@@ -1225,50 +1008,41 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the ReservedNames message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       /// <summary>
-      /// Force a nested type called Types
+      ///  Force a nested type called Types
       /// </summary>
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       public sealed partial class SomeNestedType : pb::IMessage<SomeNestedType> {
         private static readonly pb::MessageParser<SomeNestedType> _parser = new pb::MessageParser<SomeNestedType>(() => new SomeNestedType());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<SomeNestedType> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::UnitTest.Issues.TestProtos.ReservedNames.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public SomeNestedType() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public SomeNestedType(SomeNestedType other) : this() {
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public SomeNestedType Clone() {
           return new SomeNestedType(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as SomeNestedType);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(SomeNestedType other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -1276,54 +1050,38 @@
           if (ReferenceEquals(other, this)) {
             return true;
           }
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(SomeNestedType other) {
           if (other == null) {
             return;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
             }
           }
@@ -1337,41 +1095,36 @@
   }
 
   /// <summary>
-  /// These fields are deliberately not declared in numeric
-  /// order, and the oneof fields aren't contiguous either.
-  /// This allows for reasonably robust tests of JSON output
-  /// ordering.
-  /// TestFieldOrderings in unittest_proto3.proto is similar,
-  /// but doesn't include oneofs.
-  /// TODO: Consider adding oneofs to TestFieldOrderings, although
-  /// that will require fixing other tests in multiple platforms.
-  /// Alternatively, consider just adding this to
-  /// unittest_proto3.proto if multiple platforms want it.
+  ///  These fields are deliberately not declared in numeric
+  ///  order, and the oneof fields aren't contiguous either.
+  ///  This allows for reasonably robust tests of JSON output
+  ///  ordering.
+  ///  TestFieldOrderings in unittest_proto3.proto is similar,
+  ///  but doesn't include oneofs.
+  ///  TODO: Consider adding oneofs to TestFieldOrderings, although
+  ///  that will require fixing other tests in multiple platforms.
+  ///  Alternatively, consider just adding this to
+  ///  unittest_proto3.proto if multiple platforms want it.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestJsonFieldOrdering : pb::IMessage<TestJsonFieldOrdering> {
     private static readonly pb::MessageParser<TestJsonFieldOrdering> _parser = new pb::MessageParser<TestJsonFieldOrdering>(() => new TestJsonFieldOrdering());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestJsonFieldOrdering> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[6]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestJsonFieldOrdering() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestJsonFieldOrdering(TestJsonFieldOrdering other) : this() {
       plainInt32_ = other.plainInt32_;
       plainString_ = other.plainString_;
@@ -1393,10 +1146,8 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestJsonFieldOrdering Clone() {
       return new TestJsonFieldOrdering(this);
     }
@@ -1404,7 +1155,6 @@
     /// <summary>Field number for the "plain_int32" field.</summary>
     public const int PlainInt32FieldNumber = 4;
     private int plainInt32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int PlainInt32 {
       get { return plainInt32_; }
       set {
@@ -1414,7 +1164,6 @@
 
     /// <summary>Field number for the "o1_string" field.</summary>
     public const int O1StringFieldNumber = 2;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string O1String {
       get { return o1Case_ == O1OneofCase.O1String ? (string) o1_ : ""; }
       set {
@@ -1425,7 +1174,6 @@
 
     /// <summary>Field number for the "o1_int32" field.</summary>
     public const int O1Int32FieldNumber = 5;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int O1Int32 {
       get { return o1Case_ == O1OneofCase.O1Int32 ? (int) o1_ : 0; }
       set {
@@ -1437,7 +1185,6 @@
     /// <summary>Field number for the "plain_string" field.</summary>
     public const int PlainStringFieldNumber = 1;
     private string plainString_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string PlainString {
       get { return plainString_; }
       set {
@@ -1447,7 +1194,6 @@
 
     /// <summary>Field number for the "o2_int32" field.</summary>
     public const int O2Int32FieldNumber = 6;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int O2Int32 {
       get { return o2Case_ == O2OneofCase.O2Int32 ? (int) o2_ : 0; }
       set {
@@ -1458,7 +1204,6 @@
 
     /// <summary>Field number for the "o2_string" field.</summary>
     public const int O2StringFieldNumber = 3;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string O2String {
       get { return o2Case_ == O2OneofCase.O2String ? (string) o2_ : ""; }
       set {
@@ -1475,12 +1220,10 @@
       O1Int32 = 5,
     }
     private O1OneofCase o1Case_ = O1OneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public O1OneofCase O1Case {
       get { return o1Case_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearO1() {
       o1Case_ = O1OneofCase.None;
       o1_ = null;
@@ -1494,23 +1237,19 @@
       O2String = 3,
     }
     private O2OneofCase o2Case_ = O2OneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public O2OneofCase O2Case {
       get { return o2Case_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearO2() {
       o2Case_ = O2OneofCase.None;
       o2_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestJsonFieldOrdering);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestJsonFieldOrdering other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1526,10 +1265,9 @@
       if (O2String != other.O2String) return false;
       if (O1Case != other.O1Case) return false;
       if (O2Case != other.O2Case) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (PlainInt32 != 0) hash ^= PlainInt32.GetHashCode();
@@ -1540,18 +1278,13 @@
       if (o2Case_ == O2OneofCase.O2String) hash ^= O2String.GetHashCode();
       hash ^= (int) o1Case_;
       hash ^= (int) o2Case_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (PlainString.Length != 0) {
         output.WriteRawTag(10);
@@ -1577,12 +1310,8 @@
         output.WriteRawTag(48);
         output.WriteInt32(O2Int32);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (PlainInt32 != 0) {
@@ -1603,13 +1332,9 @@
       if (o2Case_ == O2OneofCase.O2String) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(O2String);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestJsonFieldOrdering other) {
       if (other == null) {
         return;
@@ -1638,16 +1363,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             PlainString = input.ReadString();
@@ -1679,38 +1402,31 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestJsonName : pb::IMessage<TestJsonName> {
     private static readonly pb::MessageParser<TestJsonName> _parser = new pb::MessageParser<TestJsonName>(() => new TestJsonName());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestJsonName> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[7]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestJsonName() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestJsonName(TestJsonName other) : this() {
       name_ = other.name_;
       description_ = other.description_;
       guid_ = other.guid_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestJsonName Clone() {
       return new TestJsonName(this);
     }
@@ -1719,9 +1435,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// Message for testing the effects for of the json_name option
+    ///  Message for testing the effects for of the json_name option
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -1732,7 +1447,6 @@
     /// <summary>Field number for the "description" field.</summary>
     public const int DescriptionFieldNumber = 2;
     private string description_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Description {
       get { return description_; }
       set {
@@ -1743,7 +1457,6 @@
     /// <summary>Field number for the "guid" field.</summary>
     public const int GuidFieldNumber = 3;
     private string guid_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Guid {
       get { return guid_; }
       set {
@@ -1751,12 +1464,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestJsonName);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestJsonName other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1767,27 +1478,21 @@
       if (Name != other.Name) return false;
       if (Description != other.Description) return false;
       if (Guid != other.Guid) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Description.Length != 0) hash ^= Description.GetHashCode();
       if (Guid.Length != 0) hash ^= Guid.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -1801,12 +1506,8 @@
         output.WriteRawTag(26);
         output.WriteString(Guid);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -1818,13 +1519,9 @@
       if (Guid.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Guid);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestJsonName other) {
       if (other == null) {
         return;
@@ -1838,16 +1535,14 @@
       if (other.Guid.Length != 0) {
         Guid = other.Guid;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -1867,371 +1562,6 @@
 
   }
 
-  /// <summary>
-  /// Issue 3200: When merging two messages which use the same
-  /// oneof case, which is itself a message type, the submessages should
-  /// be merged.
-  /// </summary>
-  public sealed partial class OneofMerging : pb::IMessage<OneofMerging> {
-    private static readonly pb::MessageParser<OneofMerging> _parser = new pb::MessageParser<OneofMerging>(() => new OneofMerging());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<OneofMerging> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[8]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofMerging() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofMerging(OneofMerging other) : this() {
-      switch (other.ValueCase) {
-        case ValueOneofCase.Text:
-          Text = other.Text;
-          break;
-        case ValueOneofCase.Nested:
-          Nested = other.Nested.Clone();
-          break;
-      }
-
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofMerging Clone() {
-      return new OneofMerging(this);
-    }
-
-    /// <summary>Field number for the "text" field.</summary>
-    public const int TextFieldNumber = 1;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string Text {
-      get { return valueCase_ == ValueOneofCase.Text ? (string) value_ : ""; }
-      set {
-        value_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-        valueCase_ = ValueOneofCase.Text;
-      }
-    }
-
-    /// <summary>Field number for the "nested" field.</summary>
-    public const int NestedFieldNumber = 2;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested Nested {
-      get { return valueCase_ == ValueOneofCase.Nested ? (global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested) value_ : null; }
-      set {
-        value_ = value;
-        valueCase_ = value == null ? ValueOneofCase.None : ValueOneofCase.Nested;
-      }
-    }
-
-    private object value_;
-    /// <summary>Enum of possible cases for the "value" oneof.</summary>
-    public enum ValueOneofCase {
-      None = 0,
-      Text = 1,
-      Nested = 2,
-    }
-    private ValueOneofCase valueCase_ = ValueOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ValueOneofCase ValueCase {
-      get { return valueCase_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void ClearValue() {
-      valueCase_ = ValueOneofCase.None;
-      value_ = null;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as OneofMerging);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(OneofMerging other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Text != other.Text) return false;
-      if (!object.Equals(Nested, other.Nested)) return false;
-      if (ValueCase != other.ValueCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (valueCase_ == ValueOneofCase.Text) hash ^= Text.GetHashCode();
-      if (valueCase_ == ValueOneofCase.Nested) hash ^= Nested.GetHashCode();
-      hash ^= (int) valueCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (valueCase_ == ValueOneofCase.Text) {
-        output.WriteRawTag(10);
-        output.WriteString(Text);
-      }
-      if (valueCase_ == ValueOneofCase.Nested) {
-        output.WriteRawTag(18);
-        output.WriteMessage(Nested);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (valueCase_ == ValueOneofCase.Text) {
-        size += 1 + pb::CodedOutputStream.ComputeStringSize(Text);
-      }
-      if (valueCase_ == ValueOneofCase.Nested) {
-        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Nested);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(OneofMerging other) {
-      if (other == null) {
-        return;
-      }
-      switch (other.ValueCase) {
-        case ValueOneofCase.Text:
-          Text = other.Text;
-          break;
-        case ValueOneofCase.Nested:
-          if (Nested == null) {
-            Nested = new global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested();
-          }
-          Nested.MergeFrom(other.Nested);
-          break;
-      }
-
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 10: {
-            Text = input.ReadString();
-            break;
-          }
-          case 18: {
-            global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested subBuilder = new global::UnitTest.Issues.TestProtos.OneofMerging.Types.Nested();
-            if (valueCase_ == ValueOneofCase.Nested) {
-              subBuilder.MergeFrom(Nested);
-            }
-            input.ReadMessage(subBuilder);
-            Nested = subBuilder;
-            break;
-          }
-        }
-      }
-    }
-
-    #region Nested types
-    /// <summary>Container for nested types declared in the OneofMerging message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      public sealed partial class Nested : pb::IMessage<Nested> {
-        private static readonly pb::MessageParser<Nested> _parser = new pb::MessageParser<Nested>(() => new Nested());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pb::MessageParser<Nested> Parser { get { return _parser; } }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pbr::MessageDescriptor Descriptor {
-          get { return global::UnitTest.Issues.TestProtos.OneofMerging.Descriptor.NestedTypes[0]; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        pbr::MessageDescriptor pb::IMessage.Descriptor {
-          get { return Descriptor; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public Nested() {
-          OnConstruction();
-        }
-
-        partial void OnConstruction();
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public Nested(Nested other) : this() {
-          x_ = other.x_;
-          y_ = other.y_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public Nested Clone() {
-          return new Nested(this);
-        }
-
-        /// <summary>Field number for the "x" field.</summary>
-        public const int XFieldNumber = 1;
-        private int x_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int X {
-          get { return x_; }
-          set {
-            x_ = value;
-          }
-        }
-
-        /// <summary>Field number for the "y" field.</summary>
-        public const int YFieldNumber = 2;
-        private int y_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int Y {
-          get { return y_; }
-          set {
-            y_ = value;
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override bool Equals(object other) {
-          return Equals(other as Nested);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public bool Equals(Nested other) {
-          if (ReferenceEquals(other, null)) {
-            return false;
-          }
-          if (ReferenceEquals(other, this)) {
-            return true;
-          }
-          if (X != other.X) return false;
-          if (Y != other.Y) return false;
-          return Equals(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override int GetHashCode() {
-          int hash = 1;
-          if (X != 0) hash ^= X.GetHashCode();
-          if (Y != 0) hash ^= Y.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
-          return hash;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override string ToString() {
-          return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void WriteTo(pb::CodedOutputStream output) {
-          if (X != 0) {
-            output.WriteRawTag(8);
-            output.WriteInt32(X);
-          }
-          if (Y != 0) {
-            output.WriteRawTag(16);
-            output.WriteInt32(Y);
-          }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int CalculateSize() {
-          int size = 0;
-          if (X != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(X);
-          }
-          if (Y != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Y);
-          }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
-          return size;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(Nested other) {
-          if (other == null) {
-            return;
-          }
-          if (other.X != 0) {
-            X = other.X;
-          }
-          if (other.Y != 0) {
-            Y = other.Y;
-          }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(pb::CodedInputStream input) {
-          uint tag;
-          while ((tag = input.ReadTag()) != 0) {
-            switch(tag) {
-              default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-                break;
-              case 8: {
-                X = input.ReadInt32();
-                break;
-              }
-              case 16: {
-                Y = input.ReadInt32();
-                break;
-              }
-            }
-          }
-        }
-
-      }
-
-    }
-    #endregion
-
-  }
-
   #endregion
 
 }
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs
index 4242c19..b8d159b 100644
--- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs
+++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: unittest_proto3.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest_proto3.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -11,11 +9,12 @@
 using scg = global::System.Collections.Generic;
 namespace Google.Protobuf.TestProtos {
 
-  /// <summary>Holder for reflection information generated from unittest_proto3.proto</summary>
+  /// <summary>Holder for reflection information generated from google/protobuf/unittest_proto3.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class UnittestProto3Reflection {
 
     #region Descriptor
-    /// <summary>File descriptor for unittest_proto3.proto</summary>
+    /// <summary>File descriptor for google/protobuf/unittest_proto3.proto</summary>
     public static pbr::FileDescriptor Descriptor {
       get { return descriptor; }
     }
@@ -24,135 +23,133 @@
     static UnittestProto3Reflection() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "ChV1bml0dGVzdF9wcm90bzMucHJvdG8SEnByb3RvYnVmX3VuaXR0ZXN0Mxoc",
-            "dW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90byL5DwoMVGVzdEFsbFR5cGVz",
-            "EhQKDHNpbmdsZV9pbnQzMhgBIAEoBRIUCgxzaW5nbGVfaW50NjQYAiABKAMS",
-            "FQoNc2luZ2xlX3VpbnQzMhgDIAEoDRIVCg1zaW5nbGVfdWludDY0GAQgASgE",
-            "EhUKDXNpbmdsZV9zaW50MzIYBSABKBESFQoNc2luZ2xlX3NpbnQ2NBgGIAEo",
-            "EhIWCg5zaW5nbGVfZml4ZWQzMhgHIAEoBxIWCg5zaW5nbGVfZml4ZWQ2NBgI",
-            "IAEoBhIXCg9zaW5nbGVfc2ZpeGVkMzIYCSABKA8SFwoPc2luZ2xlX3NmaXhl",
-            "ZDY0GAogASgQEhQKDHNpbmdsZV9mbG9hdBgLIAEoAhIVCg1zaW5nbGVfZG91",
-            "YmxlGAwgASgBEhMKC3NpbmdsZV9ib29sGA0gASgIEhUKDXNpbmdsZV9zdHJp",
-            "bmcYDiABKAkSFAoMc2luZ2xlX2J5dGVzGA8gASgMEk0KFXNpbmdsZV9uZXN0",
-            "ZWRfbWVzc2FnZRgSIAEoCzIuLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxs",
-            "VHlwZXMuTmVzdGVkTWVzc2FnZRJCChZzaW5nbGVfZm9yZWlnbl9tZXNzYWdl",
-            "GBMgASgLMiIucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVpZ25NZXNzYWdlEkYK",
-            "FXNpbmdsZV9pbXBvcnRfbWVzc2FnZRgUIAEoCzInLnByb3RvYnVmX3VuaXR0",
-            "ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlEkcKEnNpbmdsZV9uZXN0ZWRfZW51",
-            "bRgVIAEoDjIrLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVz",
-            "dGVkRW51bRI8ChNzaW5nbGVfZm9yZWlnbl9lbnVtGBYgASgOMh8ucHJvdG9i",
-            "dWZfdW5pdHRlc3QzLkZvcmVpZ25FbnVtEkAKEnNpbmdsZV9pbXBvcnRfZW51",
-            "bRgXIAEoDjIkLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVt",
-            "ElMKHHNpbmdsZV9wdWJsaWNfaW1wb3J0X21lc3NhZ2UYGiABKAsyLS5wcm90",
-            "b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZRIWCg5y",
-            "ZXBlYXRlZF9pbnQzMhgfIAMoBRIWCg5yZXBlYXRlZF9pbnQ2NBggIAMoAxIX",
-            "Cg9yZXBlYXRlZF91aW50MzIYISADKA0SFwoPcmVwZWF0ZWRfdWludDY0GCIg",
-            "AygEEhcKD3JlcGVhdGVkX3NpbnQzMhgjIAMoERIXCg9yZXBlYXRlZF9zaW50",
-            "NjQYJCADKBISGAoQcmVwZWF0ZWRfZml4ZWQzMhglIAMoBxIYChByZXBlYXRl",
-            "ZF9maXhlZDY0GCYgAygGEhkKEXJlcGVhdGVkX3NmaXhlZDMyGCcgAygPEhkK",
-            "EXJlcGVhdGVkX3NmaXhlZDY0GCggAygQEhYKDnJlcGVhdGVkX2Zsb2F0GCkg",
-            "AygCEhcKD3JlcGVhdGVkX2RvdWJsZRgqIAMoARIVCg1yZXBlYXRlZF9ib29s",
-            "GCsgAygIEhcKD3JlcGVhdGVkX3N0cmluZxgsIAMoCRIWCg5yZXBlYXRlZF9i",
-            "eXRlcxgtIAMoDBJPChdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZRgwIAMoCzIu",
-            "LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2Fn",
-            "ZRJEChhyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UYMSADKAsyIi5wcm90b2J1",
-            "Zl91bml0dGVzdDMuRm9yZWlnbk1lc3NhZ2USSAoXcmVwZWF0ZWRfaW1wb3J0",
-            "X21lc3NhZ2UYMiADKAsyJy5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1w",
-            "b3J0TWVzc2FnZRJJChRyZXBlYXRlZF9uZXN0ZWRfZW51bRgzIAMoDjIrLnBy",
-            "b3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bRI+ChVy",
-            "ZXBlYXRlZF9mb3JlaWduX2VudW0YNCADKA4yHy5wcm90b2J1Zl91bml0dGVz",
-            "dDMuRm9yZWlnbkVudW0SQgoUcmVwZWF0ZWRfaW1wb3J0X2VudW0YNSADKA4y",
-            "JC5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bRJVCh5yZXBl",
-            "YXRlZF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UYNiADKAsyLS5wcm90b2J1Zl91",
-            "bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZRIWCgxvbmVvZl91",
-            "aW50MzIYbyABKA1IABJOChRvbmVvZl9uZXN0ZWRfbWVzc2FnZRhwIAEoCzIu",
-            "LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2Fn",
-            "ZUgAEhYKDG9uZW9mX3N0cmluZxhxIAEoCUgAEhUKC29uZW9mX2J5dGVzGHIg",
-            "ASgMSAAaGwoNTmVzdGVkTWVzc2FnZRIKCgJiYhgBIAEoBSJWCgpOZXN0ZWRF",
-            "bnVtEhsKF05FU1RFRF9FTlVNX1VOU1BFQ0lGSUVEEAASBwoDRk9PEAESBwoD",
-            "QkFSEAISBwoDQkFaEAMSEAoDTkVHEP///////////wFCDQoLb25lb2ZfZmll",
-            "bGQivgEKEk5lc3RlZFRlc3RBbGxUeXBlcxI1CgVjaGlsZBgBIAEoCzImLnBy",
-            "b3RvYnVmX3VuaXR0ZXN0My5OZXN0ZWRUZXN0QWxsVHlwZXMSMQoHcGF5bG9h",
-            "ZBgCIAEoCzIgLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMSPgoO",
-            "cmVwZWF0ZWRfY2hpbGQYAyADKAsyJi5wcm90b2J1Zl91bml0dGVzdDMuTmVz",
-            "dGVkVGVzdEFsbFR5cGVzIjQKFFRlc3REZXByZWNhdGVkRmllbGRzEhwKEGRl",
-            "cHJlY2F0ZWRfaW50MzIYASABKAVCAhgBIhsKDkZvcmVpZ25NZXNzYWdlEgkK",
-            "AWMYASABKAUiMAoSVGVzdFJlc2VydmVkRmllbGRzSgQIAhADSgQIDxAQSgQI",
-            "CRAMUgNiYXJSA2JheiJbChFUZXN0Rm9yZWlnbk5lc3RlZBJGCg5mb3JlaWdu",
-            "X25lc3RlZBgBIAEoCzIuLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlw",
-            "ZXMuTmVzdGVkTWVzc2FnZSI0ChhUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIS",
-            "CQoBYRgBIAEoBRINCgJiYhj///9/IAEoBSJWChRUZXN0UmVjdXJzaXZlTWVz",
-            "c2FnZRIzCgFhGAEgASgLMigucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RSZWN1",
-            "cnNpdmVNZXNzYWdlEgkKAWkYAiABKAUiTAoUVGVzdE11dHVhbFJlY3Vyc2lv",
-            "bkESNAoCYmIYASABKAsyKC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE11dHVh",
-            "bFJlY3Vyc2lvbkIiYwoUVGVzdE11dHVhbFJlY3Vyc2lvbkISMwoBYRgBIAEo",
-            "CzIoLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TXV0dWFsUmVjdXJzaW9uQRIW",
-            "Cg5vcHRpb25hbF9pbnQzMhgCIAEoBSJNChJUZXN0RW51bUFsbG93QWxpYXMS",
-            "NwoFdmFsdWUYASABKA4yKC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEVudW1X",
-            "aXRoRHVwVmFsdWUi7wIKF1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzEhYKDlBy",
-            "aW1pdGl2ZUZpZWxkGAEgASgFEhMKC1N0cmluZ0ZpZWxkGAIgASgJEjIKCUVu",
-            "dW1GaWVsZBgDIAEoDjIfLnByb3RvYnVmX3VuaXR0ZXN0My5Gb3JlaWduRW51",
-            "bRI4CgxNZXNzYWdlRmllbGQYBCABKAsyIi5wcm90b2J1Zl91bml0dGVzdDMu",
-            "Rm9yZWlnbk1lc3NhZ2USHgoWUmVwZWF0ZWRQcmltaXRpdmVGaWVsZBgHIAMo",
-            "BRIbChNSZXBlYXRlZFN0cmluZ0ZpZWxkGAggAygJEjoKEVJlcGVhdGVkRW51",
-            "bUZpZWxkGAkgAygOMh8ucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVpZ25FbnVt",
-            "EkAKFFJlcGVhdGVkTWVzc2FnZUZpZWxkGAogAygLMiIucHJvdG9idWZfdW5p",
-            "dHRlc3QzLkZvcmVpZ25NZXNzYWdlIsgBChJUZXN0RmllbGRPcmRlcmluZ3MS",
-            "EQoJbXlfc3RyaW5nGAsgASgJEg4KBm15X2ludBgBIAEoAxIQCghteV9mbG9h",
-            "dBhlIAEoAhJUChVzaW5nbGVfbmVzdGVkX21lc3NhZ2UYyAEgASgLMjQucHJv",
-            "dG9idWZfdW5pdHRlc3QzLlRlc3RGaWVsZE9yZGVyaW5ncy5OZXN0ZWRNZXNz",
-            "YWdlGicKDU5lc3RlZE1lc3NhZ2USCgoCb28YAiABKAMSCgoCYmIYASABKAUi",
-            "TAoRU3BhcnNlRW51bU1lc3NhZ2USNwoLc3BhcnNlX2VudW0YASABKA4yIi5w",
-            "cm90b2J1Zl91bml0dGVzdDMuVGVzdFNwYXJzZUVudW0iGQoJT25lU3RyaW5n",
-            "EgwKBGRhdGEYASABKAkiGgoKTW9yZVN0cmluZxIMCgRkYXRhGAEgAygJIhgK",
-            "CE9uZUJ5dGVzEgwKBGRhdGEYASABKAwiGQoJTW9yZUJ5dGVzEgwKBGRhdGEY",
-            "ASABKAwiHAoMSW50MzJNZXNzYWdlEgwKBGRhdGEYASABKAUiHQoNVWludDMy",
-            "TWVzc2FnZRIMCgRkYXRhGAEgASgNIhwKDEludDY0TWVzc2FnZRIMCgRkYXRh",
-            "GAEgASgDIh0KDVVpbnQ2NE1lc3NhZ2USDAoEZGF0YRgBIAEoBCIbCgtCb29s",
-            "TWVzc2FnZRIMCgRkYXRhGAEgASgIInQKCVRlc3RPbmVvZhIRCgdmb29faW50",
-            "GAEgASgFSAASFAoKZm9vX3N0cmluZxgCIAEoCUgAEjcKC2Zvb19tZXNzYWdl",
-            "GAMgASgLMiAucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBbGxUeXBlc0gAQgUK",
-            "A2ZvbyKrAwoPVGVzdFBhY2tlZFR5cGVzEhgKDHBhY2tlZF9pbnQzMhhaIAMo",
-            "BUICEAESGAoMcGFja2VkX2ludDY0GFsgAygDQgIQARIZCg1wYWNrZWRfdWlu",
-            "dDMyGFwgAygNQgIQARIZCg1wYWNrZWRfdWludDY0GF0gAygEQgIQARIZCg1w",
-            "YWNrZWRfc2ludDMyGF4gAygRQgIQARIZCg1wYWNrZWRfc2ludDY0GF8gAygS",
-            "QgIQARIaCg5wYWNrZWRfZml4ZWQzMhhgIAMoB0ICEAESGgoOcGFja2VkX2Zp",
-            "eGVkNjQYYSADKAZCAhABEhsKD3BhY2tlZF9zZml4ZWQzMhhiIAMoD0ICEAES",
-            "GwoPcGFja2VkX3NmaXhlZDY0GGMgAygQQgIQARIYCgxwYWNrZWRfZmxvYXQY",
-            "ZCADKAJCAhABEhkKDXBhY2tlZF9kb3VibGUYZSADKAFCAhABEhcKC3BhY2tl",
-            "ZF9ib29sGGYgAygIQgIQARI4CgtwYWNrZWRfZW51bRhnIAMoDjIfLnByb3Rv",
-            "YnVmX3VuaXR0ZXN0My5Gb3JlaWduRW51bUICEAEiyQMKEVRlc3RVbnBhY2tl",
-            "ZFR5cGVzEhoKDnVucGFja2VkX2ludDMyGFogAygFQgIQABIaCg51bnBhY2tl",
-            "ZF9pbnQ2NBhbIAMoA0ICEAASGwoPdW5wYWNrZWRfdWludDMyGFwgAygNQgIQ",
-            "ABIbCg91bnBhY2tlZF91aW50NjQYXSADKARCAhAAEhsKD3VucGFja2VkX3Np",
-            "bnQzMhheIAMoEUICEAASGwoPdW5wYWNrZWRfc2ludDY0GF8gAygSQgIQABIc",
-            "ChB1bnBhY2tlZF9maXhlZDMyGGAgAygHQgIQABIcChB1bnBhY2tlZF9maXhl",
-            "ZDY0GGEgAygGQgIQABIdChF1bnBhY2tlZF9zZml4ZWQzMhhiIAMoD0ICEAAS",
-            "HQoRdW5wYWNrZWRfc2ZpeGVkNjQYYyADKBBCAhAAEhoKDnVucGFja2VkX2Zs",
-            "b2F0GGQgAygCQgIQABIbCg91bnBhY2tlZF9kb3VibGUYZSADKAFCAhAAEhkK",
-            "DXVucGFja2VkX2Jvb2wYZiADKAhCAhAAEjoKDXVucGFja2VkX2VudW0YZyAD",
-            "KA4yHy5wcm90b2J1Zl91bml0dGVzdDMuRm9yZWlnbkVudW1CAhAAIsABCiNU",
-            "ZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcxIYChByZXBlYXRl",
-            "ZF9maXhlZDMyGAwgAygHEhYKDnJlcGVhdGVkX2ludDMyGA0gAygFEhkKEHJl",
-            "cGVhdGVkX2ZpeGVkNjQY/g8gAygGEhcKDnJlcGVhdGVkX2ludDY0GP8PIAMo",
-            "AxIYCg5yZXBlYXRlZF9mbG9hdBj+/w8gAygCEhkKD3JlcGVhdGVkX3VpbnQ2",
-            "NBj//w8gAygEIigKG1Rlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZRIJCgFh",
-            "GAEgASgJIgwKCkZvb1JlcXVlc3QiDQoLRm9vUmVzcG9uc2UiEgoQRm9vQ2xp",
-            "ZW50TWVzc2FnZSISChBGb29TZXJ2ZXJNZXNzYWdlIgwKCkJhclJlcXVlc3Qi",
-            "DQoLQmFyUmVzcG9uc2UiEgoQVGVzdEVtcHR5TWVzc2FnZSpZCgtGb3JlaWdu",
-            "RW51bRIXChNGT1JFSUdOX1VOU1BFQ0lGSUVEEAASDwoLRk9SRUlHTl9GT08Q",
-            "BBIPCgtGT1JFSUdOX0JBUhAFEg8KC0ZPUkVJR05fQkFaEAYqdQoUVGVzdEVu",
-            "dW1XaXRoRHVwVmFsdWUSKAokVEVTVF9FTlVNX1dJVEhfRFVQX1ZBTFVFX1VO",
-            "U1BFQ0lGSUVEEAASCAoERk9PMRABEggKBEJBUjEQAhIHCgNCQVoQAxIICgRG",
-            "T08yEAESCAoEQkFSMhACGgIQASqdAQoOVGVzdFNwYXJzZUVudW0SIAocVEVT",
-            "VF9TUEFSU0VfRU5VTV9VTlNQRUNJRklFRBAAEgwKCFNQQVJTRV9BEHsSDgoI",
-            "U1BBUlNFX0IQpucDEg8KCFNQQVJTRV9DELKxgAYSFQoIU1BBUlNFX0QQ8f//",
-            "////////ARIVCghTUEFSU0VfRRC03vz///////8BEgwKCFNQQVJTRV9HEAIy",
-            "nQEKC1Rlc3RTZXJ2aWNlEkYKA0ZvbxIeLnByb3RvYnVmX3VuaXR0ZXN0My5G",
-            "b29SZXF1ZXN0Gh8ucHJvdG9idWZfdW5pdHRlc3QzLkZvb1Jlc3BvbnNlEkYK",
-            "A0JhchIeLnByb3RvYnVmX3VuaXR0ZXN0My5CYXJSZXF1ZXN0Gh8ucHJvdG9i",
-            "dWZfdW5pdHRlc3QzLkJhclJlc3BvbnNlQixCDVVuaXR0ZXN0UHJvdG+qAhpH",
-            "b29nbGUuUHJvdG9idWYuVGVzdFByb3Rvc2IGcHJvdG8z"));
+            "CiVnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnByb3RvEhFwcm90",
+            "b2J1Zl91bml0dGVzdBosZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9y",
+            "dF9wcm90bzMucHJvdG8i8A8KDFRlc3RBbGxUeXBlcxIUCgxzaW5nbGVfaW50",
+            "MzIYASABKAUSFAoMc2luZ2xlX2ludDY0GAIgASgDEhUKDXNpbmdsZV91aW50",
+            "MzIYAyABKA0SFQoNc2luZ2xlX3VpbnQ2NBgEIAEoBBIVCg1zaW5nbGVfc2lu",
+            "dDMyGAUgASgREhUKDXNpbmdsZV9zaW50NjQYBiABKBISFgoOc2luZ2xlX2Zp",
+            "eGVkMzIYByABKAcSFgoOc2luZ2xlX2ZpeGVkNjQYCCABKAYSFwoPc2luZ2xl",
+            "X3NmaXhlZDMyGAkgASgPEhcKD3NpbmdsZV9zZml4ZWQ2NBgKIAEoEBIUCgxz",
+            "aW5nbGVfZmxvYXQYCyABKAISFQoNc2luZ2xlX2RvdWJsZRgMIAEoARITCgtz",
+            "aW5nbGVfYm9vbBgNIAEoCBIVCg1zaW5nbGVfc3RyaW5nGA4gASgJEhQKDHNp",
+            "bmdsZV9ieXRlcxgPIAEoDBJMChVzaW5nbGVfbmVzdGVkX21lc3NhZ2UYEiAB",
+            "KAsyLS5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVz",
+            "c2FnZRJBChZzaW5nbGVfZm9yZWlnbl9tZXNzYWdlGBMgASgLMiEucHJvdG9i",
+            "dWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2USRgoVc2luZ2xlX2ltcG9ydF9t",
+            "ZXNzYWdlGBQgASgLMicucHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9y",
+            "dE1lc3NhZ2USRgoSc2luZ2xlX25lc3RlZF9lbnVtGBUgASgOMioucHJvdG9i",
+            "dWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0SOwoTc2luZ2xl",
+            "X2ZvcmVpZ25fZW51bRgWIAEoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVp",
+            "Z25FbnVtEkAKEnNpbmdsZV9pbXBvcnRfZW51bRgXIAEoDjIkLnByb3RvYnVm",
+            "X3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtElMKHHNpbmdsZV9wdWJsaWNf",
+            "aW1wb3J0X21lc3NhZ2UYGiABKAsyLS5wcm90b2J1Zl91bml0dGVzdF9pbXBv",
+            "cnQuUHVibGljSW1wb3J0TWVzc2FnZRIWCg5yZXBlYXRlZF9pbnQzMhgfIAMo",
+            "BRIWCg5yZXBlYXRlZF9pbnQ2NBggIAMoAxIXCg9yZXBlYXRlZF91aW50MzIY",
+            "ISADKA0SFwoPcmVwZWF0ZWRfdWludDY0GCIgAygEEhcKD3JlcGVhdGVkX3Np",
+            "bnQzMhgjIAMoERIXCg9yZXBlYXRlZF9zaW50NjQYJCADKBISGAoQcmVwZWF0",
+            "ZWRfZml4ZWQzMhglIAMoBxIYChByZXBlYXRlZF9maXhlZDY0GCYgAygGEhkK",
+            "EXJlcGVhdGVkX3NmaXhlZDMyGCcgAygPEhkKEXJlcGVhdGVkX3NmaXhlZDY0",
+            "GCggAygQEhYKDnJlcGVhdGVkX2Zsb2F0GCkgAygCEhcKD3JlcGVhdGVkX2Rv",
+            "dWJsZRgqIAMoARIVCg1yZXBlYXRlZF9ib29sGCsgAygIEhcKD3JlcGVhdGVk",
+            "X3N0cmluZxgsIAMoCRIWCg5yZXBlYXRlZF9ieXRlcxgtIAMoDBJOChdyZXBl",
+            "YXRlZF9uZXN0ZWRfbWVzc2FnZRgwIAMoCzItLnByb3RvYnVmX3VuaXR0ZXN0",
+            "LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlEkMKGHJlcGVhdGVkX2ZvcmVp",
+            "Z25fbWVzc2FnZRgxIAMoCzIhLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25N",
+            "ZXNzYWdlEkgKF3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlGDIgAygLMicucHJv",
+            "dG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2USSAoUcmVwZWF0",
+            "ZWRfbmVzdGVkX2VudW0YMyADKA4yKi5wcm90b2J1Zl91bml0dGVzdC5UZXN0",
+            "QWxsVHlwZXMuTmVzdGVkRW51bRI9ChVyZXBlYXRlZF9mb3JlaWduX2VudW0Y",
+            "NCADKA4yHi5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bRJCChRyZXBl",
+            "YXRlZF9pbXBvcnRfZW51bRg1IAMoDjIkLnByb3RvYnVmX3VuaXR0ZXN0X2lt",
+            "cG9ydC5JbXBvcnRFbnVtElUKHnJlcGVhdGVkX3B1YmxpY19pbXBvcnRfbWVz",
+            "c2FnZRg2IAMoCzItLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJ",
+            "bXBvcnRNZXNzYWdlEhYKDG9uZW9mX3VpbnQzMhhvIAEoDUgAEk0KFG9uZW9m",
+            "X25lc3RlZF9tZXNzYWdlGHAgASgLMi0ucHJvdG9idWZfdW5pdHRlc3QuVGVz",
+            "dEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2VIABIWCgxvbmVvZl9zdHJpbmcYcSAB",
+            "KAlIABIVCgtvbmVvZl9ieXRlcxhyIAEoDEgAGhsKDU5lc3RlZE1lc3NhZ2US",
+            "CgoCYmIYASABKAUiVgoKTmVzdGVkRW51bRIbChdORVNURURfRU5VTV9VTlNQ",
+            "RUNJRklFRBAAEgcKA0ZPTxABEgcKA0JBUhACEgcKA0JBWhADEhAKA05FRxD/",
+            "//////////8BQg0KC29uZW9mX2ZpZWxkIrsBChJOZXN0ZWRUZXN0QWxsVHlw",
+            "ZXMSNAoFY2hpbGQYASABKAsyJS5wcm90b2J1Zl91bml0dGVzdC5OZXN0ZWRU",
+            "ZXN0QWxsVHlwZXMSMAoHcGF5bG9hZBgCIAEoCzIfLnByb3RvYnVmX3VuaXR0",
+            "ZXN0LlRlc3RBbGxUeXBlcxI9Cg5yZXBlYXRlZF9jaGlsZBgDIAMoCzIlLnBy",
+            "b3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZFRlc3RBbGxUeXBlcyI0ChRUZXN0RGVw",
+            "cmVjYXRlZEZpZWxkcxIcChBkZXByZWNhdGVkX2ludDMyGAEgASgFQgIYASIb",
+            "Cg5Gb3JlaWduTWVzc2FnZRIJCgFjGAEgASgFIjAKElRlc3RSZXNlcnZlZEZp",
+            "ZWxkc0oECAIQA0oECA8QEEoECAkQDFIDYmFyUgNiYXoiWgoRVGVzdEZvcmVp",
+            "Z25OZXN0ZWQSRQoOZm9yZWlnbl9uZXN0ZWQYASABKAsyLS5wcm90b2J1Zl91",
+            "bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSI0ChhUZXN0UmVh",
+            "bGx5TGFyZ2VUYWdOdW1iZXISCQoBYRgBIAEoBRINCgJiYhj///9/IAEoBSJV",
+            "ChRUZXN0UmVjdXJzaXZlTWVzc2FnZRIyCgFhGAEgASgLMicucHJvdG9idWZf",
+            "dW5pdHRlc3QuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2USCQoBaRgCIAEoBSJLChRU",
+            "ZXN0TXV0dWFsUmVjdXJzaW9uQRIzCgJiYhgBIAEoCzInLnByb3RvYnVmX3Vu",
+            "aXR0ZXN0LlRlc3RNdXR1YWxSZWN1cnNpb25CImIKFFRlc3RNdXR1YWxSZWN1",
+            "cnNpb25CEjIKAWEYASABKAsyJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TXV0",
+            "dWFsUmVjdXJzaW9uQRIWCg5vcHRpb25hbF9pbnQzMhgCIAEoBSLrAgoXVGVz",
+            "dENhbWVsQ2FzZUZpZWxkTmFtZXMSFgoOUHJpbWl0aXZlRmllbGQYASABKAUS",
+            "EwoLU3RyaW5nRmllbGQYAiABKAkSMQoJRW51bUZpZWxkGAMgASgOMh4ucHJv",
+            "dG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0SNwoMTWVzc2FnZUZpZWxkGAQg",
+            "ASgLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2USHgoWUmVw",
+            "ZWF0ZWRQcmltaXRpdmVGaWVsZBgHIAMoBRIbChNSZXBlYXRlZFN0cmluZ0Zp",
+            "ZWxkGAggAygJEjkKEVJlcGVhdGVkRW51bUZpZWxkGAkgAygOMh4ucHJvdG9i",
+            "dWZfdW5pdHRlc3QuRm9yZWlnbkVudW0SPwoUUmVwZWF0ZWRNZXNzYWdlRmll",
+            "bGQYCiADKAsyIS5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZSLH",
+            "AQoSVGVzdEZpZWxkT3JkZXJpbmdzEhEKCW15X3N0cmluZxgLIAEoCRIOCgZt",
+            "eV9pbnQYASABKAMSEAoIbXlfZmxvYXQYZSABKAISUwoVc2luZ2xlX25lc3Rl",
+            "ZF9tZXNzYWdlGMgBIAEoCzIzLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RGaWVs",
+            "ZE9yZGVyaW5ncy5OZXN0ZWRNZXNzYWdlGicKDU5lc3RlZE1lc3NhZ2USCgoC",
+            "b28YAiABKAMSCgoCYmIYASABKAUiSwoRU3BhcnNlRW51bU1lc3NhZ2USNgoL",
+            "c3BhcnNlX2VudW0YASABKA4yIS5wcm90b2J1Zl91bml0dGVzdC5UZXN0U3Bh",
+            "cnNlRW51bSIZCglPbmVTdHJpbmcSDAoEZGF0YRgBIAEoCSIaCgpNb3JlU3Ry",
+            "aW5nEgwKBGRhdGEYASADKAkiGAoIT25lQnl0ZXMSDAoEZGF0YRgBIAEoDCIZ",
+            "CglNb3JlQnl0ZXMSDAoEZGF0YRgBIAEoDCIcCgxJbnQzMk1lc3NhZ2USDAoE",
+            "ZGF0YRgBIAEoBSIdCg1VaW50MzJNZXNzYWdlEgwKBGRhdGEYASABKA0iHAoM",
+            "SW50NjRNZXNzYWdlEgwKBGRhdGEYASABKAMiHQoNVWludDY0TWVzc2FnZRIM",
+            "CgRkYXRhGAEgASgEIhsKC0Jvb2xNZXNzYWdlEgwKBGRhdGEYASABKAgicwoJ",
+            "VGVzdE9uZW9mEhEKB2Zvb19pbnQYASABKAVIABIUCgpmb29fc3RyaW5nGAIg",
+            "ASgJSAASNgoLZm9vX21lc3NhZ2UYAyABKAsyHy5wcm90b2J1Zl91bml0dGVz",
+            "dC5UZXN0QWxsVHlwZXNIAEIFCgNmb28iqgMKD1Rlc3RQYWNrZWRUeXBlcxIY",
+            "CgxwYWNrZWRfaW50MzIYWiADKAVCAhABEhgKDHBhY2tlZF9pbnQ2NBhbIAMo",
+            "A0ICEAESGQoNcGFja2VkX3VpbnQzMhhcIAMoDUICEAESGQoNcGFja2VkX3Vp",
+            "bnQ2NBhdIAMoBEICEAESGQoNcGFja2VkX3NpbnQzMhheIAMoEUICEAESGQoN",
+            "cGFja2VkX3NpbnQ2NBhfIAMoEkICEAESGgoOcGFja2VkX2ZpeGVkMzIYYCAD",
+            "KAdCAhABEhoKDnBhY2tlZF9maXhlZDY0GGEgAygGQgIQARIbCg9wYWNrZWRf",
+            "c2ZpeGVkMzIYYiADKA9CAhABEhsKD3BhY2tlZF9zZml4ZWQ2NBhjIAMoEEIC",
+            "EAESGAoMcGFja2VkX2Zsb2F0GGQgAygCQgIQARIZCg1wYWNrZWRfZG91Ymxl",
+            "GGUgAygBQgIQARIXCgtwYWNrZWRfYm9vbBhmIAMoCEICEAESNwoLcGFja2Vk",
+            "X2VudW0YZyADKA4yHi5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bUIC",
+            "EAEiyAMKEVRlc3RVbnBhY2tlZFR5cGVzEhoKDnVucGFja2VkX2ludDMyGFog",
+            "AygFQgIQABIaCg51bnBhY2tlZF9pbnQ2NBhbIAMoA0ICEAASGwoPdW5wYWNr",
+            "ZWRfdWludDMyGFwgAygNQgIQABIbCg91bnBhY2tlZF91aW50NjQYXSADKARC",
+            "AhAAEhsKD3VucGFja2VkX3NpbnQzMhheIAMoEUICEAASGwoPdW5wYWNrZWRf",
+            "c2ludDY0GF8gAygSQgIQABIcChB1bnBhY2tlZF9maXhlZDMyGGAgAygHQgIQ",
+            "ABIcChB1bnBhY2tlZF9maXhlZDY0GGEgAygGQgIQABIdChF1bnBhY2tlZF9z",
+            "Zml4ZWQzMhhiIAMoD0ICEAASHQoRdW5wYWNrZWRfc2ZpeGVkNjQYYyADKBBC",
+            "AhAAEhoKDnVucGFja2VkX2Zsb2F0GGQgAygCQgIQABIbCg91bnBhY2tlZF9k",
+            "b3VibGUYZSADKAFCAhAAEhkKDXVucGFja2VkX2Jvb2wYZiADKAhCAhAAEjkK",
+            "DXVucGFja2VkX2VudW0YZyADKA4yHi5wcm90b2J1Zl91bml0dGVzdC5Gb3Jl",
+            "aWduRW51bUICEAAiwAEKI1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRh",
+            "Z1NpemVzEhgKEHJlcGVhdGVkX2ZpeGVkMzIYDCADKAcSFgoOcmVwZWF0ZWRf",
+            "aW50MzIYDSADKAUSGQoQcmVwZWF0ZWRfZml4ZWQ2NBj+DyADKAYSFwoOcmVw",
+            "ZWF0ZWRfaW50NjQY/w8gAygDEhgKDnJlcGVhdGVkX2Zsb2F0GP7/DyADKAIS",
+            "GQoPcmVwZWF0ZWRfdWludDY0GP//DyADKAQiKAobVGVzdENvbW1lbnRJbmpl",
+            "Y3Rpb25NZXNzYWdlEgkKAWEYASABKAkiDAoKRm9vUmVxdWVzdCINCgtGb29S",
+            "ZXNwb25zZSISChBGb29DbGllbnRNZXNzYWdlIhIKEEZvb1NlcnZlck1lc3Nh",
+            "Z2UiDAoKQmFyUmVxdWVzdCINCgtCYXJSZXNwb25zZSpZCgtGb3JlaWduRW51",
+            "bRIXChNGT1JFSUdOX1VOU1BFQ0lGSUVEEAASDwoLRk9SRUlHTl9GT08QBBIP",
+            "CgtGT1JFSUdOX0JBUhAFEg8KC0ZPUkVJR05fQkFaEAYqdQoUVGVzdEVudW1X",
+            "aXRoRHVwVmFsdWUSKAokVEVTVF9FTlVNX1dJVEhfRFVQX1ZBTFVFX1VOU1BF",
+            "Q0lGSUVEEAASCAoERk9PMRABEggKBEJBUjEQAhIHCgNCQVoQAxIICgRGT08y",
+            "EAESCAoEQkFSMhACGgIQASqdAQoOVGVzdFNwYXJzZUVudW0SIAocVEVTVF9T",
+            "UEFSU0VfRU5VTV9VTlNQRUNJRklFRBAAEgwKCFNQQVJTRV9BEHsSDgoIU1BB",
+            "UlNFX0IQpucDEg8KCFNQQVJTRV9DELKxgAYSFQoIU1BBUlNFX0QQ8f//////",
+            "////ARIVCghTUEFSU0VfRRC03vz///////8BEgwKCFNQQVJTRV9HEAIymQEK",
+            "C1Rlc3RTZXJ2aWNlEkQKA0ZvbxIdLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1Jl",
+            "cXVlc3QaHi5wcm90b2J1Zl91bml0dGVzdC5Gb29SZXNwb25zZRJECgNCYXIS",
+            "HS5wcm90b2J1Zl91bml0dGVzdC5CYXJSZXF1ZXN0Gh4ucHJvdG9idWZfdW5p",
+            "dHRlc3QuQmFyUmVzcG9uc2VCOkINVW5pdHRlc3RQcm90b0gBgAEBiAEBkAEB",
+            "+AEBqgIaR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3NiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.UnittestImportProto3Reflection.Descriptor, },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.ForeignEnum), typeof(global::Google.Protobuf.TestProtos.TestEnumWithDupValue), typeof(global::Google.Protobuf.TestProtos.TestSparseEnum), }, new pbr::GeneratedClrTypeInfo[] {
@@ -166,7 +163,6 @@
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestRecursiveMessage), global::Google.Protobuf.TestProtos.TestRecursiveMessage.Parser, new[]{ "A", "I" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestMutualRecursionA), global::Google.Protobuf.TestProtos.TestMutualRecursionA.Parser, new[]{ "Bb" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestMutualRecursionB), global::Google.Protobuf.TestProtos.TestMutualRecursionB.Parser, new[]{ "A", "OptionalInt32" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestEnumAllowAlias), global::Google.Protobuf.TestProtos.TestEnumAllowAlias.Parser, new[]{ "Value" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestCamelCaseFieldNames), global::Google.Protobuf.TestProtos.TestCamelCaseFieldNames.Parser, new[]{ "PrimitiveField", "StringField", "EnumField", "MessageField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestFieldOrderings), global::Google.Protobuf.TestProtos.TestFieldOrderings.Parser, new[]{ "MyString", "MyInt", "MyFloat", "SingleNestedMessage" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestFieldOrderings.Types.NestedMessage), global::Google.Protobuf.TestProtos.TestFieldOrderings.Types.NestedMessage.Parser, new[]{ "Oo", "Bb" }, null, null, null)}),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.SparseEnumMessage), global::Google.Protobuf.TestProtos.SparseEnumMessage.Parser, new[]{ "SparseEnum" }, null, null, null),
@@ -189,8 +185,7 @@
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.FooClientMessage), global::Google.Protobuf.TestProtos.FooClientMessage.Parser, null, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.FooServerMessage), global::Google.Protobuf.TestProtos.FooServerMessage.Parser, null, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.BarRequest), global::Google.Protobuf.TestProtos.BarRequest.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.BarResponse), global::Google.Protobuf.TestProtos.BarResponse.Parser, null, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestEmptyMessage), global::Google.Protobuf.TestProtos.TestEmptyMessage.Parser, null, null, null, null)
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.BarResponse), global::Google.Protobuf.TestProtos.BarResponse.Parser, null, null, null, null)
           }));
     }
     #endregion
@@ -205,19 +200,19 @@
   }
 
   /// <summary>
-  /// Test an enum that has multiple values with the same number.
+  ///  Test an enum that has multiple values with the same number.
   /// </summary>
   public enum TestEnumWithDupValue {
     [pbr::OriginalName("TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED")] Unspecified = 0,
     [pbr::OriginalName("FOO1")] Foo1 = 1,
     [pbr::OriginalName("BAR1")] Bar1 = 2,
     [pbr::OriginalName("BAZ")] Baz = 3,
-    [pbr::OriginalName("FOO2", PreferredAlias = false)] Foo2 = 1,
-    [pbr::OriginalName("BAR2", PreferredAlias = false)] Bar2 = 2,
+    [pbr::OriginalName("FOO2")] Foo2 = 1,
+    [pbr::OriginalName("BAR2")] Bar2 = 2,
   }
 
   /// <summary>
-  /// Test an enum with large, unordered values.
+  ///  Test an enum with large, unordered values.
   /// </summary>
   public enum TestSparseEnum {
     [pbr::OriginalName("TEST_SPARSE_ENUM_UNSPECIFIED")] Unspecified = 0,
@@ -227,8 +222,8 @@
     [pbr::OriginalName("SPARSE_D")] SparseD = -15,
     [pbr::OriginalName("SPARSE_E")] SparseE = -53452,
     /// <summary>
-    /// In proto3, value 0 must be the first one specified
-    /// SPARSE_F = 0;
+    ///  In proto3, value 0 must be the first one specified
+    ///  SPARSE_F = 0;
     /// </summary>
     [pbr::OriginalName("SPARSE_G")] SparseG = 2,
   }
@@ -237,33 +232,28 @@
 
   #region Messages
   /// <summary>
-  /// This proto includes every type of field in both singular and repeated
-  /// forms.
+  ///  This proto includes every type of field in both singular and repeated
+  ///  forms.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestAllTypes : pb::IMessage<TestAllTypes> {
     private static readonly pb::MessageParser<TestAllTypes> _parser = new pb::MessageParser<TestAllTypes>(() => new TestAllTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestAllTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestAllTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestAllTypes(TestAllTypes other) : this() {
       singleInt32_ = other.singleInt32_;
       singleInt64_ = other.singleInt64_;
@@ -324,10 +314,8 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestAllTypes Clone() {
       return new TestAllTypes(this);
     }
@@ -336,9 +324,8 @@
     public const int SingleInt32FieldNumber = 1;
     private int singleInt32_;
     /// <summary>
-    /// Singular
+    ///  Singular
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int SingleInt32 {
       get { return singleInt32_; }
       set {
@@ -349,7 +336,6 @@
     /// <summary>Field number for the "single_int64" field.</summary>
     public const int SingleInt64FieldNumber = 2;
     private long singleInt64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long SingleInt64 {
       get { return singleInt64_; }
       set {
@@ -360,7 +346,6 @@
     /// <summary>Field number for the "single_uint32" field.</summary>
     public const int SingleUint32FieldNumber = 3;
     private uint singleUint32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint SingleUint32 {
       get { return singleUint32_; }
       set {
@@ -371,7 +356,6 @@
     /// <summary>Field number for the "single_uint64" field.</summary>
     public const int SingleUint64FieldNumber = 4;
     private ulong singleUint64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong SingleUint64 {
       get { return singleUint64_; }
       set {
@@ -382,7 +366,6 @@
     /// <summary>Field number for the "single_sint32" field.</summary>
     public const int SingleSint32FieldNumber = 5;
     private int singleSint32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int SingleSint32 {
       get { return singleSint32_; }
       set {
@@ -393,7 +376,6 @@
     /// <summary>Field number for the "single_sint64" field.</summary>
     public const int SingleSint64FieldNumber = 6;
     private long singleSint64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long SingleSint64 {
       get { return singleSint64_; }
       set {
@@ -404,7 +386,6 @@
     /// <summary>Field number for the "single_fixed32" field.</summary>
     public const int SingleFixed32FieldNumber = 7;
     private uint singleFixed32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint SingleFixed32 {
       get { return singleFixed32_; }
       set {
@@ -415,7 +396,6 @@
     /// <summary>Field number for the "single_fixed64" field.</summary>
     public const int SingleFixed64FieldNumber = 8;
     private ulong singleFixed64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong SingleFixed64 {
       get { return singleFixed64_; }
       set {
@@ -426,7 +406,6 @@
     /// <summary>Field number for the "single_sfixed32" field.</summary>
     public const int SingleSfixed32FieldNumber = 9;
     private int singleSfixed32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int SingleSfixed32 {
       get { return singleSfixed32_; }
       set {
@@ -437,7 +416,6 @@
     /// <summary>Field number for the "single_sfixed64" field.</summary>
     public const int SingleSfixed64FieldNumber = 10;
     private long singleSfixed64_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long SingleSfixed64 {
       get { return singleSfixed64_; }
       set {
@@ -448,7 +426,6 @@
     /// <summary>Field number for the "single_float" field.</summary>
     public const int SingleFloatFieldNumber = 11;
     private float singleFloat_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public float SingleFloat {
       get { return singleFloat_; }
       set {
@@ -459,7 +436,6 @@
     /// <summary>Field number for the "single_double" field.</summary>
     public const int SingleDoubleFieldNumber = 12;
     private double singleDouble_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public double SingleDouble {
       get { return singleDouble_; }
       set {
@@ -470,7 +446,6 @@
     /// <summary>Field number for the "single_bool" field.</summary>
     public const int SingleBoolFieldNumber = 13;
     private bool singleBool_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool SingleBool {
       get { return singleBool_; }
       set {
@@ -481,7 +456,6 @@
     /// <summary>Field number for the "single_string" field.</summary>
     public const int SingleStringFieldNumber = 14;
     private string singleString_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string SingleString {
       get { return singleString_; }
       set {
@@ -492,7 +466,6 @@
     /// <summary>Field number for the "single_bytes" field.</summary>
     public const int SingleBytesFieldNumber = 15;
     private pb::ByteString singleBytes_ = pb::ByteString.Empty;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString SingleBytes {
       get { return singleBytes_; }
       set {
@@ -503,7 +476,6 @@
     /// <summary>Field number for the "single_nested_message" field.</summary>
     public const int SingleNestedMessageFieldNumber = 18;
     private global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage singleNestedMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage SingleNestedMessage {
       get { return singleNestedMessage_; }
       set {
@@ -514,7 +486,6 @@
     /// <summary>Field number for the "single_foreign_message" field.</summary>
     public const int SingleForeignMessageFieldNumber = 19;
     private global::Google.Protobuf.TestProtos.ForeignMessage singleForeignMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.ForeignMessage SingleForeignMessage {
       get { return singleForeignMessage_; }
       set {
@@ -525,7 +496,6 @@
     /// <summary>Field number for the "single_import_message" field.</summary>
     public const int SingleImportMessageFieldNumber = 20;
     private global::Google.Protobuf.TestProtos.ImportMessage singleImportMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.ImportMessage SingleImportMessage {
       get { return singleImportMessage_; }
       set {
@@ -536,7 +506,6 @@
     /// <summary>Field number for the "single_nested_enum" field.</summary>
     public const int SingleNestedEnumFieldNumber = 21;
     private global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum singleNestedEnum_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum SingleNestedEnum {
       get { return singleNestedEnum_; }
       set {
@@ -547,7 +516,6 @@
     /// <summary>Field number for the "single_foreign_enum" field.</summary>
     public const int SingleForeignEnumFieldNumber = 22;
     private global::Google.Protobuf.TestProtos.ForeignEnum singleForeignEnum_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.ForeignEnum SingleForeignEnum {
       get { return singleForeignEnum_; }
       set {
@@ -558,7 +526,6 @@
     /// <summary>Field number for the "single_import_enum" field.</summary>
     public const int SingleImportEnumFieldNumber = 23;
     private global::Google.Protobuf.TestProtos.ImportEnum singleImportEnum_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.ImportEnum SingleImportEnum {
       get { return singleImportEnum_; }
       set {
@@ -570,9 +537,8 @@
     public const int SinglePublicImportMessageFieldNumber = 26;
     private global::Google.Protobuf.TestProtos.PublicImportMessage singlePublicImportMessage_;
     /// <summary>
-    /// Defined in unittest_import_public.proto
+    ///  Defined in unittest_import_public.proto
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.PublicImportMessage SinglePublicImportMessage {
       get { return singlePublicImportMessage_; }
       set {
@@ -586,9 +552,8 @@
         = pb::FieldCodec.ForInt32(250);
     private readonly pbc::RepeatedField<int> repeatedInt32_ = new pbc::RepeatedField<int>();
     /// <summary>
-    /// Repeated
+    ///  Repeated
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> RepeatedInt32 {
       get { return repeatedInt32_; }
     }
@@ -598,7 +563,6 @@
     private static readonly pb::FieldCodec<long> _repeated_repeatedInt64_codec
         = pb::FieldCodec.ForInt64(258);
     private readonly pbc::RepeatedField<long> repeatedInt64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> RepeatedInt64 {
       get { return repeatedInt64_; }
     }
@@ -608,7 +572,6 @@
     private static readonly pb::FieldCodec<uint> _repeated_repeatedUint32_codec
         = pb::FieldCodec.ForUInt32(266);
     private readonly pbc::RepeatedField<uint> repeatedUint32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> RepeatedUint32 {
       get { return repeatedUint32_; }
     }
@@ -618,7 +581,6 @@
     private static readonly pb::FieldCodec<ulong> _repeated_repeatedUint64_codec
         = pb::FieldCodec.ForUInt64(274);
     private readonly pbc::RepeatedField<ulong> repeatedUint64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> RepeatedUint64 {
       get { return repeatedUint64_; }
     }
@@ -628,7 +590,6 @@
     private static readonly pb::FieldCodec<int> _repeated_repeatedSint32_codec
         = pb::FieldCodec.ForSInt32(282);
     private readonly pbc::RepeatedField<int> repeatedSint32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> RepeatedSint32 {
       get { return repeatedSint32_; }
     }
@@ -638,7 +599,6 @@
     private static readonly pb::FieldCodec<long> _repeated_repeatedSint64_codec
         = pb::FieldCodec.ForSInt64(290);
     private readonly pbc::RepeatedField<long> repeatedSint64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> RepeatedSint64 {
       get { return repeatedSint64_; }
     }
@@ -648,7 +608,6 @@
     private static readonly pb::FieldCodec<uint> _repeated_repeatedFixed32_codec
         = pb::FieldCodec.ForFixed32(298);
     private readonly pbc::RepeatedField<uint> repeatedFixed32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> RepeatedFixed32 {
       get { return repeatedFixed32_; }
     }
@@ -658,7 +617,6 @@
     private static readonly pb::FieldCodec<ulong> _repeated_repeatedFixed64_codec
         = pb::FieldCodec.ForFixed64(306);
     private readonly pbc::RepeatedField<ulong> repeatedFixed64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> RepeatedFixed64 {
       get { return repeatedFixed64_; }
     }
@@ -668,7 +626,6 @@
     private static readonly pb::FieldCodec<int> _repeated_repeatedSfixed32_codec
         = pb::FieldCodec.ForSFixed32(314);
     private readonly pbc::RepeatedField<int> repeatedSfixed32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> RepeatedSfixed32 {
       get { return repeatedSfixed32_; }
     }
@@ -678,7 +635,6 @@
     private static readonly pb::FieldCodec<long> _repeated_repeatedSfixed64_codec
         = pb::FieldCodec.ForSFixed64(322);
     private readonly pbc::RepeatedField<long> repeatedSfixed64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> RepeatedSfixed64 {
       get { return repeatedSfixed64_; }
     }
@@ -688,7 +644,6 @@
     private static readonly pb::FieldCodec<float> _repeated_repeatedFloat_codec
         = pb::FieldCodec.ForFloat(330);
     private readonly pbc::RepeatedField<float> repeatedFloat_ = new pbc::RepeatedField<float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<float> RepeatedFloat {
       get { return repeatedFloat_; }
     }
@@ -698,7 +653,6 @@
     private static readonly pb::FieldCodec<double> _repeated_repeatedDouble_codec
         = pb::FieldCodec.ForDouble(338);
     private readonly pbc::RepeatedField<double> repeatedDouble_ = new pbc::RepeatedField<double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<double> RepeatedDouble {
       get { return repeatedDouble_; }
     }
@@ -708,7 +662,6 @@
     private static readonly pb::FieldCodec<bool> _repeated_repeatedBool_codec
         = pb::FieldCodec.ForBool(346);
     private readonly pbc::RepeatedField<bool> repeatedBool_ = new pbc::RepeatedField<bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<bool> RepeatedBool {
       get { return repeatedBool_; }
     }
@@ -718,7 +671,6 @@
     private static readonly pb::FieldCodec<string> _repeated_repeatedString_codec
         = pb::FieldCodec.ForString(354);
     private readonly pbc::RepeatedField<string> repeatedString_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> RepeatedString {
       get { return repeatedString_; }
     }
@@ -728,7 +680,6 @@
     private static readonly pb::FieldCodec<pb::ByteString> _repeated_repeatedBytes_codec
         = pb::FieldCodec.ForBytes(362);
     private readonly pbc::RepeatedField<pb::ByteString> repeatedBytes_ = new pbc::RepeatedField<pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<pb::ByteString> RepeatedBytes {
       get { return repeatedBytes_; }
     }
@@ -738,7 +689,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage> _repeated_repeatedNestedMessage_codec
         = pb::FieldCodec.ForMessage(386, global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage> repeatedNestedMessage_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedNestedMessage {
       get { return repeatedNestedMessage_; }
     }
@@ -748,7 +698,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ForeignMessage> _repeated_repeatedForeignMessage_codec
         = pb::FieldCodec.ForMessage(394, global::Google.Protobuf.TestProtos.ForeignMessage.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignMessage> repeatedForeignMessage_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignMessage> RepeatedForeignMessage {
       get { return repeatedForeignMessage_; }
     }
@@ -758,7 +707,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ImportMessage> _repeated_repeatedImportMessage_codec
         = pb::FieldCodec.ForMessage(402, global::Google.Protobuf.TestProtos.ImportMessage.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ImportMessage> repeatedImportMessage_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ImportMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ImportMessage> RepeatedImportMessage {
       get { return repeatedImportMessage_; }
     }
@@ -768,7 +716,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum> _repeated_repeatedNestedEnum_codec
         = pb::FieldCodec.ForEnum(410, x => (int) x, x => (global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum) x);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum> repeatedNestedEnum_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedEnum> RepeatedNestedEnum {
       get { return repeatedNestedEnum_; }
     }
@@ -778,7 +725,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ForeignEnum> _repeated_repeatedForeignEnum_codec
         = pb::FieldCodec.ForEnum(418, x => (int) x, x => (global::Google.Protobuf.TestProtos.ForeignEnum) x);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> repeatedForeignEnum_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> RepeatedForeignEnum {
       get { return repeatedForeignEnum_; }
     }
@@ -788,7 +734,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ImportEnum> _repeated_repeatedImportEnum_codec
         = pb::FieldCodec.ForEnum(426, x => (int) x, x => (global::Google.Protobuf.TestProtos.ImportEnum) x);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ImportEnum> repeatedImportEnum_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ImportEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ImportEnum> RepeatedImportEnum {
       get { return repeatedImportEnum_; }
     }
@@ -799,16 +744,14 @@
         = pb::FieldCodec.ForMessage(434, global::Google.Protobuf.TestProtos.PublicImportMessage.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.PublicImportMessage> repeatedPublicImportMessage_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.PublicImportMessage>();
     /// <summary>
-    /// Defined in unittest_import_public.proto
+    ///  Defined in unittest_import_public.proto
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.PublicImportMessage> RepeatedPublicImportMessage {
       get { return repeatedPublicImportMessage_; }
     }
 
     /// <summary>Field number for the "oneof_uint32" field.</summary>
     public const int OneofUint32FieldNumber = 111;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint OneofUint32 {
       get { return oneofFieldCase_ == OneofFieldOneofCase.OneofUint32 ? (uint) oneofField_ : 0; }
       set {
@@ -819,7 +762,6 @@
 
     /// <summary>Field number for the "oneof_nested_message" field.</summary>
     public const int OneofNestedMessageFieldNumber = 112;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage OneofNestedMessage {
       get { return oneofFieldCase_ == OneofFieldOneofCase.OneofNestedMessage ? (global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage) oneofField_ : null; }
       set {
@@ -830,7 +772,6 @@
 
     /// <summary>Field number for the "oneof_string" field.</summary>
     public const int OneofStringFieldNumber = 113;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string OneofString {
       get { return oneofFieldCase_ == OneofFieldOneofCase.OneofString ? (string) oneofField_ : ""; }
       set {
@@ -841,7 +782,6 @@
 
     /// <summary>Field number for the "oneof_bytes" field.</summary>
     public const int OneofBytesFieldNumber = 114;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString OneofBytes {
       get { return oneofFieldCase_ == OneofFieldOneofCase.OneofBytes ? (pb::ByteString) oneofField_ : pb::ByteString.Empty; }
       set {
@@ -860,23 +800,19 @@
       OneofBytes = 114,
     }
     private OneofFieldOneofCase oneofFieldCase_ = OneofFieldOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofFieldOneofCase OneofFieldCase {
       get { return oneofFieldCase_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearOneofField() {
       oneofFieldCase_ = OneofFieldOneofCase.None;
       oneofField_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestAllTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestAllTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -894,8 +830,8 @@
       if (SingleFixed64 != other.SingleFixed64) return false;
       if (SingleSfixed32 != other.SingleSfixed32) return false;
       if (SingleSfixed64 != other.SingleSfixed64) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(SingleFloat, other.SingleFloat)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(SingleDouble, other.SingleDouble)) return false;
+      if (SingleFloat != other.SingleFloat) return false;
+      if (SingleDouble != other.SingleDouble) return false;
       if (SingleBool != other.SingleBool) return false;
       if (SingleString != other.SingleString) return false;
       if (SingleBytes != other.SingleBytes) return false;
@@ -933,10 +869,9 @@
       if (OneofString != other.OneofString) return false;
       if (OneofBytes != other.OneofBytes) return false;
       if (OneofFieldCase != other.OneofFieldCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (SingleInt32 != 0) hash ^= SingleInt32.GetHashCode();
@@ -949,8 +884,8 @@
       if (SingleFixed64 != 0UL) hash ^= SingleFixed64.GetHashCode();
       if (SingleSfixed32 != 0) hash ^= SingleSfixed32.GetHashCode();
       if (SingleSfixed64 != 0L) hash ^= SingleSfixed64.GetHashCode();
-      if (SingleFloat != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(SingleFloat);
-      if (SingleDouble != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(SingleDouble);
+      if (SingleFloat != 0F) hash ^= SingleFloat.GetHashCode();
+      if (SingleDouble != 0D) hash ^= SingleDouble.GetHashCode();
       if (SingleBool != false) hash ^= SingleBool.GetHashCode();
       if (SingleString.Length != 0) hash ^= SingleString.GetHashCode();
       if (SingleBytes.Length != 0) hash ^= SingleBytes.GetHashCode();
@@ -988,18 +923,13 @@
       if (oneofFieldCase_ == OneofFieldOneofCase.OneofString) hash ^= OneofString.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) hash ^= OneofBytes.GetHashCode();
       hash ^= (int) oneofFieldCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (SingleInt32 != 0) {
         output.WriteRawTag(8);
@@ -1127,12 +1057,8 @@
         output.WriteRawTag(146, 7);
         output.WriteBytes(OneofBytes);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (SingleInt32 != 0) {
@@ -1235,13 +1161,9 @@
       if (oneofFieldCase_ == OneofFieldOneofCase.OneofBytes) {
         size += 2 + pb::CodedOutputStream.ComputeBytesSize(OneofBytes);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestAllTypes other) {
       if (other == null) {
         return;
@@ -1351,10 +1273,7 @@
           OneofUint32 = other.OneofUint32;
           break;
         case OneofFieldOneofCase.OneofNestedMessage:
-          if (OneofNestedMessage == null) {
-            OneofNestedMessage = new global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage();
-          }
-          OneofNestedMessage.MergeFrom(other.OneofNestedMessage);
+          OneofNestedMessage = other.OneofNestedMessage;
           break;
         case OneofFieldOneofCase.OneofString:
           OneofString = other.OneofString;
@@ -1364,16 +1283,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             SingleInt32 = input.ReadInt32();
@@ -1606,7 +1523,7 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the TestAllTypes message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       public enum NestedEnum {
         [pbr::OriginalName("NESTED_ENUM_UNSPECIFIED")] Unspecified = 0,
@@ -1614,41 +1531,34 @@
         [pbr::OriginalName("BAR")] Bar = 2,
         [pbr::OriginalName("BAZ")] Baz = 3,
         /// <summary>
-        /// Intentionally negative.
+        ///  Intentionally negative.
         /// </summary>
         [pbr::OriginalName("NEG")] Neg = -1,
       }
 
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       public sealed partial class NestedMessage : pb::IMessage<NestedMessage> {
         private static readonly pb::MessageParser<NestedMessage> _parser = new pb::MessageParser<NestedMessage>(() => new NestedMessage());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<NestedMessage> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.TestProtos.TestAllTypes.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedMessage() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedMessage(NestedMessage other) : this() {
           bb_ = other.bb_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedMessage Clone() {
           return new NestedMessage(this);
         }
@@ -1657,11 +1567,10 @@
         public const int BbFieldNumber = 1;
         private int bb_;
         /// <summary>
-        /// The field name "b" fails to compile in proto1 because it conflicts with
-        /// a local variable named "b" in one of the generated methods.  Doh.
-        /// This file needs to compile in proto1 to test backwards-compatibility.
+        ///  The field name "b" fails to compile in proto1 because it conflicts with
+        ///  a local variable named "b" in one of the generated methods.  Doh.
+        ///  This file needs to compile in proto1 to test backwards-compatibility.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int Bb {
           get { return bb_; }
           set {
@@ -1669,12 +1578,10 @@
           }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as NestedMessage);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(NestedMessage other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -1683,48 +1590,34 @@
             return true;
           }
           if (Bb != other.Bb) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           if (Bb != 0) hash ^= Bb.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           if (Bb != 0) {
             output.WriteRawTag(8);
             output.WriteInt32(Bb);
           }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           if (Bb != 0) {
             size += 1 + pb::CodedOutputStream.ComputeInt32Size(Bb);
           }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(NestedMessage other) {
           if (other == null) {
             return;
@@ -1732,16 +1625,14 @@
           if (other.Bb != 0) {
             Bb = other.Bb;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 8: {
                 Bb = input.ReadInt32();
@@ -1759,40 +1650,33 @@
   }
 
   /// <summary>
-  /// This proto includes a recusively nested message.
+  ///  This proto includes a recusively nested message.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class NestedTestAllTypes : pb::IMessage<NestedTestAllTypes> {
     private static readonly pb::MessageParser<NestedTestAllTypes> _parser = new pb::MessageParser<NestedTestAllTypes>(() => new NestedTestAllTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<NestedTestAllTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public NestedTestAllTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public NestedTestAllTypes(NestedTestAllTypes other) : this() {
       Child = other.child_ != null ? other.Child.Clone() : null;
       Payload = other.payload_ != null ? other.Payload.Clone() : null;
       repeatedChild_ = other.repeatedChild_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public NestedTestAllTypes Clone() {
       return new NestedTestAllTypes(this);
     }
@@ -1800,7 +1684,6 @@
     /// <summary>Field number for the "child" field.</summary>
     public const int ChildFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.NestedTestAllTypes child_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.NestedTestAllTypes Child {
       get { return child_; }
       set {
@@ -1811,7 +1694,6 @@
     /// <summary>Field number for the "payload" field.</summary>
     public const int PayloadFieldNumber = 2;
     private global::Google.Protobuf.TestProtos.TestAllTypes payload_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestAllTypes Payload {
       get { return payload_; }
       set {
@@ -1824,17 +1706,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.NestedTestAllTypes> _repeated_repeatedChild_codec
         = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.TestProtos.NestedTestAllTypes.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.NestedTestAllTypes> repeatedChild_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.NestedTestAllTypes>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.NestedTestAllTypes> RepeatedChild {
       get { return repeatedChild_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as NestedTestAllTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(NestedTestAllTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1845,27 +1724,21 @@
       if (!object.Equals(Child, other.Child)) return false;
       if (!object.Equals(Payload, other.Payload)) return false;
       if(!repeatedChild_.Equals(other.repeatedChild_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (child_ != null) hash ^= Child.GetHashCode();
       if (payload_ != null) hash ^= Payload.GetHashCode();
       hash ^= repeatedChild_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (child_ != null) {
         output.WriteRawTag(10);
@@ -1876,12 +1749,8 @@
         output.WriteMessage(Payload);
       }
       repeatedChild_.WriteTo(output, _repeated_repeatedChild_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (child_ != null) {
@@ -1891,13 +1760,9 @@
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Payload);
       }
       size += repeatedChild_.CalculateSize(_repeated_repeatedChild_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(NestedTestAllTypes other) {
       if (other == null) {
         return;
@@ -1915,16 +1780,14 @@
         Payload.MergeFrom(other.Payload);
       }
       repeatedChild_.Add(other.repeatedChild_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (child_ == null) {
@@ -1950,36 +1813,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestDeprecatedFields : pb::IMessage<TestDeprecatedFields> {
     private static readonly pb::MessageParser<TestDeprecatedFields> _parser = new pb::MessageParser<TestDeprecatedFields>(() => new TestDeprecatedFields());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestDeprecatedFields> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestDeprecatedFields() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestDeprecatedFields(TestDeprecatedFields other) : this() {
       deprecatedInt32_ = other.deprecatedInt32_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestDeprecatedFields Clone() {
       return new TestDeprecatedFields(this);
     }
@@ -1987,8 +1843,7 @@
     /// <summary>Field number for the "deprecated_int32" field.</summary>
     public const int DeprecatedInt32FieldNumber = 1;
     private int deprecatedInt32_;
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.ObsoleteAttribute()]
     public int DeprecatedInt32 {
       get { return deprecatedInt32_; }
       set {
@@ -1996,12 +1851,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestDeprecatedFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestDeprecatedFields other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2010,48 +1863,34 @@
         return true;
       }
       if (DeprecatedInt32 != other.DeprecatedInt32) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (DeprecatedInt32 != 0) hash ^= DeprecatedInt32.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (DeprecatedInt32 != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(DeprecatedInt32);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (DeprecatedInt32 != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(DeprecatedInt32);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestDeprecatedFields other) {
       if (other == null) {
         return;
@@ -2059,16 +1898,14 @@
       if (other.DeprecatedInt32 != 0) {
         DeprecatedInt32 = other.DeprecatedInt32;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             DeprecatedInt32 = input.ReadInt32();
@@ -2081,39 +1918,32 @@
   }
 
   /// <summary>
-  /// Define these after TestAllTypes to make sure the compiler can handle
-  /// that.
+  ///  Define these after TestAllTypes to make sure the compiler can handle
+  ///  that.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ForeignMessage : pb::IMessage<ForeignMessage> {
     private static readonly pb::MessageParser<ForeignMessage> _parser = new pb::MessageParser<ForeignMessage>(() => new ForeignMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ForeignMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ForeignMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ForeignMessage(ForeignMessage other) : this() {
       c_ = other.c_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ForeignMessage Clone() {
       return new ForeignMessage(this);
     }
@@ -2121,7 +1951,6 @@
     /// <summary>Field number for the "c" field.</summary>
     public const int CFieldNumber = 1;
     private int c_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int C {
       get { return c_; }
       set {
@@ -2129,12 +1958,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ForeignMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ForeignMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2143,48 +1970,34 @@
         return true;
       }
       if (C != other.C) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (C != 0) hash ^= C.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (C != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(C);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (C != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(C);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ForeignMessage other) {
       if (other == null) {
         return;
@@ -2192,16 +2005,14 @@
       if (other.C != 0) {
         C = other.C;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             C = input.ReadInt32();
@@ -2213,45 +2024,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestReservedFields : pb::IMessage<TestReservedFields> {
     private static readonly pb::MessageParser<TestReservedFields> _parser = new pb::MessageParser<TestReservedFields>(() => new TestReservedFields());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestReservedFields> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[4]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestReservedFields() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestReservedFields(TestReservedFields other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestReservedFields Clone() {
       return new TestReservedFields(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestReservedFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestReservedFields other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2259,54 +2061,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestReservedFields other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -2315,38 +2101,31 @@
   }
 
   /// <summary>
-  /// Test that we can use NestedMessage from outside TestAllTypes.
+  ///  Test that we can use NestedMessage from outside TestAllTypes.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestForeignNested : pb::IMessage<TestForeignNested> {
     private static readonly pb::MessageParser<TestForeignNested> _parser = new pb::MessageParser<TestForeignNested>(() => new TestForeignNested());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestForeignNested> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[5]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestForeignNested() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestForeignNested(TestForeignNested other) : this() {
       ForeignNested = other.foreignNested_ != null ? other.ForeignNested.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestForeignNested Clone() {
       return new TestForeignNested(this);
     }
@@ -2354,7 +2133,6 @@
     /// <summary>Field number for the "foreign_nested" field.</summary>
     public const int ForeignNestedFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage foreignNested_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestAllTypes.Types.NestedMessage ForeignNested {
       get { return foreignNested_; }
       set {
@@ -2362,12 +2140,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestForeignNested);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestForeignNested other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2376,48 +2152,34 @@
         return true;
       }
       if (!object.Equals(ForeignNested, other.ForeignNested)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (foreignNested_ != null) hash ^= ForeignNested.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (foreignNested_ != null) {
         output.WriteRawTag(10);
         output.WriteMessage(ForeignNested);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (foreignNested_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(ForeignNested);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestForeignNested other) {
       if (other == null) {
         return;
@@ -2428,16 +2190,14 @@
         }
         ForeignNested.MergeFrom(other.ForeignNested);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (foreignNested_ == null) {
@@ -2453,39 +2213,32 @@
   }
 
   /// <summary>
-  /// Test that really large tag numbers don't break anything.
+  ///  Test that really large tag numbers don't break anything.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestReallyLargeTagNumber : pb::IMessage<TestReallyLargeTagNumber> {
     private static readonly pb::MessageParser<TestReallyLargeTagNumber> _parser = new pb::MessageParser<TestReallyLargeTagNumber>(() => new TestReallyLargeTagNumber());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestReallyLargeTagNumber> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[6]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestReallyLargeTagNumber() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestReallyLargeTagNumber(TestReallyLargeTagNumber other) : this() {
       a_ = other.a_;
       bb_ = other.bb_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestReallyLargeTagNumber Clone() {
       return new TestReallyLargeTagNumber(this);
     }
@@ -2494,10 +2247,9 @@
     public const int AFieldNumber = 1;
     private int a_;
     /// <summary>
-    /// The largest possible tag number is 2^28 - 1, since the wire format uses
-    /// three bits to communicate wire type.
+    ///  The largest possible tag number is 2^28 - 1, since the wire format uses
+    ///  three bits to communicate wire type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int A {
       get { return a_; }
       set {
@@ -2508,7 +2260,6 @@
     /// <summary>Field number for the "bb" field.</summary>
     public const int BbFieldNumber = 268435455;
     private int bb_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Bb {
       get { return bb_; }
       set {
@@ -2516,12 +2267,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestReallyLargeTagNumber);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestReallyLargeTagNumber other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2531,26 +2280,20 @@
       }
       if (A != other.A) return false;
       if (Bb != other.Bb) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (A != 0) hash ^= A.GetHashCode();
       if (Bb != 0) hash ^= Bb.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (A != 0) {
         output.WriteRawTag(8);
@@ -2560,12 +2303,8 @@
         output.WriteRawTag(248, 255, 255, 255, 7);
         output.WriteInt32(Bb);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (A != 0) {
@@ -2574,13 +2313,9 @@
       if (Bb != 0) {
         size += 5 + pb::CodedOutputStream.ComputeInt32Size(Bb);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestReallyLargeTagNumber other) {
       if (other == null) {
         return;
@@ -2591,16 +2326,14 @@
       if (other.Bb != 0) {
         Bb = other.Bb;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             A = input.ReadInt32();
@@ -2616,37 +2349,30 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestRecursiveMessage : pb::IMessage<TestRecursiveMessage> {
     private static readonly pb::MessageParser<TestRecursiveMessage> _parser = new pb::MessageParser<TestRecursiveMessage>(() => new TestRecursiveMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestRecursiveMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[7]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestRecursiveMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestRecursiveMessage(TestRecursiveMessage other) : this() {
       A = other.a_ != null ? other.A.Clone() : null;
       i_ = other.i_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestRecursiveMessage Clone() {
       return new TestRecursiveMessage(this);
     }
@@ -2654,7 +2380,6 @@
     /// <summary>Field number for the "a" field.</summary>
     public const int AFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestRecursiveMessage a_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestRecursiveMessage A {
       get { return a_; }
       set {
@@ -2665,7 +2390,6 @@
     /// <summary>Field number for the "i" field.</summary>
     public const int IFieldNumber = 2;
     private int i_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int I {
       get { return i_; }
       set {
@@ -2673,12 +2397,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestRecursiveMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestRecursiveMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2688,26 +2410,20 @@
       }
       if (!object.Equals(A, other.A)) return false;
       if (I != other.I) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (a_ != null) hash ^= A.GetHashCode();
       if (I != 0) hash ^= I.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (a_ != null) {
         output.WriteRawTag(10);
@@ -2717,12 +2433,8 @@
         output.WriteRawTag(16);
         output.WriteInt32(I);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (a_ != null) {
@@ -2731,13 +2443,9 @@
       if (I != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(I);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestRecursiveMessage other) {
       if (other == null) {
         return;
@@ -2751,16 +2459,14 @@
       if (other.I != 0) {
         I = other.I;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (a_ == null) {
@@ -2780,38 +2486,31 @@
   }
 
   /// <summary>
-  /// Test that mutual recursion works.
+  ///  Test that mutual recursion works.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestMutualRecursionA : pb::IMessage<TestMutualRecursionA> {
     private static readonly pb::MessageParser<TestMutualRecursionA> _parser = new pb::MessageParser<TestMutualRecursionA>(() => new TestMutualRecursionA());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestMutualRecursionA> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[8]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMutualRecursionA() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMutualRecursionA(TestMutualRecursionA other) : this() {
       Bb = other.bb_ != null ? other.Bb.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMutualRecursionA Clone() {
       return new TestMutualRecursionA(this);
     }
@@ -2819,7 +2518,6 @@
     /// <summary>Field number for the "bb" field.</summary>
     public const int BbFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestMutualRecursionB bb_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestMutualRecursionB Bb {
       get { return bb_; }
       set {
@@ -2827,12 +2525,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestMutualRecursionA);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestMutualRecursionA other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2841,48 +2537,34 @@
         return true;
       }
       if (!object.Equals(Bb, other.Bb)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (bb_ != null) hash ^= Bb.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (bb_ != null) {
         output.WriteRawTag(10);
         output.WriteMessage(Bb);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (bb_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Bb);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestMutualRecursionA other) {
       if (other == null) {
         return;
@@ -2893,16 +2575,14 @@
         }
         Bb.MergeFrom(other.Bb);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (bb_ == null) {
@@ -2917,37 +2597,30 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestMutualRecursionB : pb::IMessage<TestMutualRecursionB> {
     private static readonly pb::MessageParser<TestMutualRecursionB> _parser = new pb::MessageParser<TestMutualRecursionB>(() => new TestMutualRecursionB());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestMutualRecursionB> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[9]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMutualRecursionB() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMutualRecursionB(TestMutualRecursionB other) : this() {
       A = other.a_ != null ? other.A.Clone() : null;
       optionalInt32_ = other.optionalInt32_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestMutualRecursionB Clone() {
       return new TestMutualRecursionB(this);
     }
@@ -2955,7 +2628,6 @@
     /// <summary>Field number for the "a" field.</summary>
     public const int AFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestMutualRecursionA a_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestMutualRecursionA A {
       get { return a_; }
       set {
@@ -2966,7 +2638,6 @@
     /// <summary>Field number for the "optional_int32" field.</summary>
     public const int OptionalInt32FieldNumber = 2;
     private int optionalInt32_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int OptionalInt32 {
       get { return optionalInt32_; }
       set {
@@ -2974,12 +2645,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestMutualRecursionB);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestMutualRecursionB other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2989,26 +2658,20 @@
       }
       if (!object.Equals(A, other.A)) return false;
       if (OptionalInt32 != other.OptionalInt32) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (a_ != null) hash ^= A.GetHashCode();
       if (OptionalInt32 != 0) hash ^= OptionalInt32.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (a_ != null) {
         output.WriteRawTag(10);
@@ -3018,12 +2681,8 @@
         output.WriteRawTag(16);
         output.WriteInt32(OptionalInt32);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (a_ != null) {
@@ -3032,13 +2691,9 @@
       if (OptionalInt32 != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(OptionalInt32);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestMutualRecursionB other) {
       if (other == null) {
         return;
@@ -3052,16 +2707,14 @@
       if (other.OptionalInt32 != 0) {
         OptionalInt32 = other.OptionalInt32;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (a_ == null) {
@@ -3080,163 +2733,29 @@
 
   }
 
-  public sealed partial class TestEnumAllowAlias : pb::IMessage<TestEnumAllowAlias> {
-    private static readonly pb::MessageParser<TestEnumAllowAlias> _parser = new pb::MessageParser<TestEnumAllowAlias>(() => new TestEnumAllowAlias());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<TestEnumAllowAlias> Parser { get { return _parser; } }
+  /// <summary>
+  ///  Test message with CamelCase field names.  This violates Protocol Buffer
+  ///  standard style.
+  /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestCamelCaseFieldNames : pb::IMessage<TestCamelCaseFieldNames> {
+    private static readonly pb::MessageParser<TestCamelCaseFieldNames> _parser = new pb::MessageParser<TestCamelCaseFieldNames>(() => new TestCamelCaseFieldNames());
+    public static pb::MessageParser<TestCamelCaseFieldNames> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[10]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestEnumAllowAlias() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestEnumAllowAlias(TestEnumAllowAlias other) : this() {
-      value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestEnumAllowAlias Clone() {
-      return new TestEnumAllowAlias(this);
-    }
-
-    /// <summary>Field number for the "value" field.</summary>
-    public const int ValueFieldNumber = 1;
-    private global::Google.Protobuf.TestProtos.TestEnumWithDupValue value_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.TestProtos.TestEnumWithDupValue Value {
-      get { return value_; }
-      set {
-        value_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as TestEnumAllowAlias);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(TestEnumAllowAlias other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (Value != 0) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (Value != 0) {
-        output.WriteRawTag(8);
-        output.WriteEnum((int) Value);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (Value != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Value);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(TestEnumAllowAlias other) {
-      if (other == null) {
-        return;
-      }
-      if (other.Value != 0) {
-        Value = other.Value;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 8: {
-            value_ = (global::Google.Protobuf.TestProtos.TestEnumWithDupValue) input.ReadEnum();
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  /// <summary>
-  /// Test message with CamelCase field names.  This violates Protocol Buffer
-  /// standard style.
-  /// </summary>
-  public sealed partial class TestCamelCaseFieldNames : pb::IMessage<TestCamelCaseFieldNames> {
-    private static readonly pb::MessageParser<TestCamelCaseFieldNames> _parser = new pb::MessageParser<TestCamelCaseFieldNames>(() => new TestCamelCaseFieldNames());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<TestCamelCaseFieldNames> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[11]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestCamelCaseFieldNames() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestCamelCaseFieldNames(TestCamelCaseFieldNames other) : this() {
       primitiveField_ = other.primitiveField_;
       stringField_ = other.stringField_;
@@ -3246,10 +2765,8 @@
       repeatedStringField_ = other.repeatedStringField_.Clone();
       repeatedEnumField_ = other.repeatedEnumField_.Clone();
       repeatedMessageField_ = other.repeatedMessageField_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestCamelCaseFieldNames Clone() {
       return new TestCamelCaseFieldNames(this);
     }
@@ -3257,7 +2774,6 @@
     /// <summary>Field number for the "PrimitiveField" field.</summary>
     public const int PrimitiveFieldFieldNumber = 1;
     private int primitiveField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int PrimitiveField {
       get { return primitiveField_; }
       set {
@@ -3268,7 +2784,6 @@
     /// <summary>Field number for the "StringField" field.</summary>
     public const int StringFieldFieldNumber = 2;
     private string stringField_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string StringField {
       get { return stringField_; }
       set {
@@ -3279,7 +2794,6 @@
     /// <summary>Field number for the "EnumField" field.</summary>
     public const int EnumFieldFieldNumber = 3;
     private global::Google.Protobuf.TestProtos.ForeignEnum enumField_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.ForeignEnum EnumField {
       get { return enumField_; }
       set {
@@ -3290,7 +2804,6 @@
     /// <summary>Field number for the "MessageField" field.</summary>
     public const int MessageFieldFieldNumber = 4;
     private global::Google.Protobuf.TestProtos.ForeignMessage messageField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.ForeignMessage MessageField {
       get { return messageField_; }
       set {
@@ -3303,7 +2816,6 @@
     private static readonly pb::FieldCodec<int> _repeated_repeatedPrimitiveField_codec
         = pb::FieldCodec.ForInt32(58);
     private readonly pbc::RepeatedField<int> repeatedPrimitiveField_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> RepeatedPrimitiveField {
       get { return repeatedPrimitiveField_; }
     }
@@ -3313,7 +2825,6 @@
     private static readonly pb::FieldCodec<string> _repeated_repeatedStringField_codec
         = pb::FieldCodec.ForString(66);
     private readonly pbc::RepeatedField<string> repeatedStringField_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> RepeatedStringField {
       get { return repeatedStringField_; }
     }
@@ -3323,7 +2834,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ForeignEnum> _repeated_repeatedEnumField_codec
         = pb::FieldCodec.ForEnum(74, x => (int) x, x => (global::Google.Protobuf.TestProtos.ForeignEnum) x);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> repeatedEnumField_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> RepeatedEnumField {
       get { return repeatedEnumField_; }
     }
@@ -3333,17 +2843,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ForeignMessage> _repeated_repeatedMessageField_codec
         = pb::FieldCodec.ForMessage(82, global::Google.Protobuf.TestProtos.ForeignMessage.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignMessage> repeatedMessageField_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignMessage>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignMessage> RepeatedMessageField {
       get { return repeatedMessageField_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestCamelCaseFieldNames);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestCamelCaseFieldNames other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -3359,10 +2866,9 @@
       if(!repeatedStringField_.Equals(other.repeatedStringField_)) return false;
       if(!repeatedEnumField_.Equals(other.repeatedEnumField_)) return false;
       if(!repeatedMessageField_.Equals(other.repeatedMessageField_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (PrimitiveField != 0) hash ^= PrimitiveField.GetHashCode();
@@ -3373,18 +2879,13 @@
       hash ^= repeatedStringField_.GetHashCode();
       hash ^= repeatedEnumField_.GetHashCode();
       hash ^= repeatedMessageField_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (PrimitiveField != 0) {
         output.WriteRawTag(8);
@@ -3406,12 +2907,8 @@
       repeatedStringField_.WriteTo(output, _repeated_repeatedStringField_codec);
       repeatedEnumField_.WriteTo(output, _repeated_repeatedEnumField_codec);
       repeatedMessageField_.WriteTo(output, _repeated_repeatedMessageField_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (PrimitiveField != 0) {
@@ -3430,13 +2927,9 @@
       size += repeatedStringField_.CalculateSize(_repeated_repeatedStringField_codec);
       size += repeatedEnumField_.CalculateSize(_repeated_repeatedEnumField_codec);
       size += repeatedMessageField_.CalculateSize(_repeated_repeatedMessageField_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestCamelCaseFieldNames other) {
       if (other == null) {
         return;
@@ -3460,16 +2953,14 @@
       repeatedStringField_.Add(other.repeatedStringField_);
       repeatedEnumField_.Add(other.repeatedEnumField_);
       repeatedMessageField_.Add(other.repeatedMessageField_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             PrimitiveField = input.ReadInt32();
@@ -3515,42 +3006,35 @@
   }
 
   /// <summary>
-  /// We list fields out of order, to ensure that we're using field number and not
-  /// field index to determine serialization order.
+  ///  We list fields out of order, to ensure that we're using field number and not
+  ///  field index to determine serialization order.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestFieldOrderings : pb::IMessage<TestFieldOrderings> {
     private static readonly pb::MessageParser<TestFieldOrderings> _parser = new pb::MessageParser<TestFieldOrderings>(() => new TestFieldOrderings());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestFieldOrderings> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[12]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[11]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestFieldOrderings() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestFieldOrderings(TestFieldOrderings other) : this() {
       myString_ = other.myString_;
       myInt_ = other.myInt_;
       myFloat_ = other.myFloat_;
       SingleNestedMessage = other.singleNestedMessage_ != null ? other.SingleNestedMessage.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestFieldOrderings Clone() {
       return new TestFieldOrderings(this);
     }
@@ -3558,7 +3042,6 @@
     /// <summary>Field number for the "my_string" field.</summary>
     public const int MyStringFieldNumber = 11;
     private string myString_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string MyString {
       get { return myString_; }
       set {
@@ -3569,7 +3052,6 @@
     /// <summary>Field number for the "my_int" field.</summary>
     public const int MyIntFieldNumber = 1;
     private long myInt_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long MyInt {
       get { return myInt_; }
       set {
@@ -3580,7 +3062,6 @@
     /// <summary>Field number for the "my_float" field.</summary>
     public const int MyFloatFieldNumber = 101;
     private float myFloat_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public float MyFloat {
       get { return myFloat_; }
       set {
@@ -3591,7 +3072,6 @@
     /// <summary>Field number for the "single_nested_message" field.</summary>
     public const int SingleNestedMessageFieldNumber = 200;
     private global::Google.Protobuf.TestProtos.TestFieldOrderings.Types.NestedMessage singleNestedMessage_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestFieldOrderings.Types.NestedMessage SingleNestedMessage {
       get { return singleNestedMessage_; }
       set {
@@ -3599,12 +3079,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestFieldOrderings);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestFieldOrderings other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -3614,30 +3092,24 @@
       }
       if (MyString != other.MyString) return false;
       if (MyInt != other.MyInt) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(MyFloat, other.MyFloat)) return false;
+      if (MyFloat != other.MyFloat) return false;
       if (!object.Equals(SingleNestedMessage, other.SingleNestedMessage)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (MyString.Length != 0) hash ^= MyString.GetHashCode();
       if (MyInt != 0L) hash ^= MyInt.GetHashCode();
-      if (MyFloat != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(MyFloat);
+      if (MyFloat != 0F) hash ^= MyFloat.GetHashCode();
       if (singleNestedMessage_ != null) hash ^= SingleNestedMessage.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (MyInt != 0L) {
         output.WriteRawTag(8);
@@ -3655,12 +3127,8 @@
         output.WriteRawTag(194, 12);
         output.WriteMessage(SingleNestedMessage);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (MyString.Length != 0) {
@@ -3675,13 +3143,9 @@
       if (singleNestedMessage_ != null) {
         size += 2 + pb::CodedOutputStream.ComputeMessageSize(SingleNestedMessage);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestFieldOrderings other) {
       if (other == null) {
         return;
@@ -3701,16 +3165,14 @@
         }
         SingleNestedMessage.MergeFrom(other.SingleNestedMessage);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             MyInt = input.ReadInt64();
@@ -3737,39 +3199,32 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the TestFieldOrderings message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       public sealed partial class NestedMessage : pb::IMessage<NestedMessage> {
         private static readonly pb::MessageParser<NestedMessage> _parser = new pb::MessageParser<NestedMessage>(() => new NestedMessage());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<NestedMessage> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.TestProtos.TestFieldOrderings.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedMessage() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedMessage(NestedMessage other) : this() {
           oo_ = other.oo_;
           bb_ = other.bb_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NestedMessage Clone() {
           return new NestedMessage(this);
         }
@@ -3777,7 +3232,6 @@
         /// <summary>Field number for the "oo" field.</summary>
         public const int OoFieldNumber = 2;
         private long oo_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public long Oo {
           get { return oo_; }
           set {
@@ -3789,11 +3243,10 @@
         public const int BbFieldNumber = 1;
         private int bb_;
         /// <summary>
-        /// The field name "b" fails to compile in proto1 because it conflicts with
-        /// a local variable named "b" in one of the generated methods.  Doh.
-        /// This file needs to compile in proto1 to test backwards-compatibility.
+        ///  The field name "b" fails to compile in proto1 because it conflicts with
+        ///  a local variable named "b" in one of the generated methods.  Doh.
+        ///  This file needs to compile in proto1 to test backwards-compatibility.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int Bb {
           get { return bb_; }
           set {
@@ -3801,12 +3254,10 @@
           }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as NestedMessage);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(NestedMessage other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -3816,26 +3267,20 @@
           }
           if (Oo != other.Oo) return false;
           if (Bb != other.Bb) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           if (Oo != 0L) hash ^= Oo.GetHashCode();
           if (Bb != 0) hash ^= Bb.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           if (Bb != 0) {
             output.WriteRawTag(8);
@@ -3845,12 +3290,8 @@
             output.WriteRawTag(16);
             output.WriteInt64(Oo);
           }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           if (Oo != 0L) {
@@ -3859,13 +3300,9 @@
           if (Bb != 0) {
             size += 1 + pb::CodedOutputStream.ComputeInt32Size(Bb);
           }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(NestedMessage other) {
           if (other == null) {
             return;
@@ -3876,16 +3313,14 @@
           if (other.Bb != 0) {
             Bb = other.Bb;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 8: {
                 Bb = input.ReadInt32();
@@ -3906,36 +3341,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class SparseEnumMessage : pb::IMessage<SparseEnumMessage> {
     private static readonly pb::MessageParser<SparseEnumMessage> _parser = new pb::MessageParser<SparseEnumMessage>(() => new SparseEnumMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<SparseEnumMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[13]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[12]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SparseEnumMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SparseEnumMessage(SparseEnumMessage other) : this() {
       sparseEnum_ = other.sparseEnum_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SparseEnumMessage Clone() {
       return new SparseEnumMessage(this);
     }
@@ -3943,7 +3371,6 @@
     /// <summary>Field number for the "sparse_enum" field.</summary>
     public const int SparseEnumFieldNumber = 1;
     private global::Google.Protobuf.TestProtos.TestSparseEnum sparseEnum_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestSparseEnum SparseEnum {
       get { return sparseEnum_; }
       set {
@@ -3951,12 +3378,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as SparseEnumMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(SparseEnumMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -3965,48 +3390,34 @@
         return true;
       }
       if (SparseEnum != other.SparseEnum) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (SparseEnum != 0) hash ^= SparseEnum.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (SparseEnum != 0) {
         output.WriteRawTag(8);
         output.WriteEnum((int) SparseEnum);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (SparseEnum != 0) {
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) SparseEnum);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(SparseEnumMessage other) {
       if (other == null) {
         return;
@@ -4014,16 +3425,14 @@
       if (other.SparseEnum != 0) {
         SparseEnum = other.SparseEnum;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             sparseEnum_ = (global::Google.Protobuf.TestProtos.TestSparseEnum) input.ReadEnum();
@@ -4036,38 +3445,31 @@
   }
 
   /// <summary>
-  /// Test String and Bytes: string is for valid UTF-8 strings
+  ///  Test String and Bytes: string is for valid UTF-8 strings
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class OneString : pb::IMessage<OneString> {
     private static readonly pb::MessageParser<OneString> _parser = new pb::MessageParser<OneString>(() => new OneString());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<OneString> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[14]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[13]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneString() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneString(OneString other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneString Clone() {
       return new OneString(this);
     }
@@ -4075,7 +3477,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private string data_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Data {
       get { return data_; }
       set {
@@ -4083,12 +3484,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as OneString);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(OneString other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4097,48 +3496,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data.Length != 0) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data.Length != 0) {
         output.WriteRawTag(10);
         output.WriteString(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(OneString other) {
       if (other == null) {
         return;
@@ -4146,16 +3531,14 @@
       if (other.Data.Length != 0) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Data = input.ReadString();
@@ -4167,36 +3550,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class MoreString : pb::IMessage<MoreString> {
     private static readonly pb::MessageParser<MoreString> _parser = new pb::MessageParser<MoreString>(() => new MoreString());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MoreString> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[15]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[14]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MoreString() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MoreString(MoreString other) : this() {
       data_ = other.data_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MoreString Clone() {
       return new MoreString(this);
     }
@@ -4206,17 +3582,14 @@
     private static readonly pb::FieldCodec<string> _repeated_data_codec
         = pb::FieldCodec.ForString(10);
     private readonly pbc::RepeatedField<string> data_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> Data {
       get { return data_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MoreString);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MoreString other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4225,58 +3598,42 @@
         return true;
       }
       if(!data_.Equals(other.data_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= data_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       data_.WriteTo(output, _repeated_data_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += data_.CalculateSize(_repeated_data_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MoreString other) {
       if (other == null) {
         return;
       }
       data_.Add(other.data_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             data_.AddEntriesFrom(input, _repeated_data_codec);
@@ -4288,36 +3645,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class OneBytes : pb::IMessage<OneBytes> {
     private static readonly pb::MessageParser<OneBytes> _parser = new pb::MessageParser<OneBytes>(() => new OneBytes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<OneBytes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[16]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[15]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneBytes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneBytes(OneBytes other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneBytes Clone() {
       return new OneBytes(this);
     }
@@ -4325,7 +3675,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private pb::ByteString data_ = pb::ByteString.Empty;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString Data {
       get { return data_; }
       set {
@@ -4333,12 +3682,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as OneBytes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(OneBytes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4347,48 +3694,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data.Length != 0) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data.Length != 0) {
         output.WriteRawTag(10);
         output.WriteBytes(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeBytesSize(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(OneBytes other) {
       if (other == null) {
         return;
@@ -4396,16 +3729,14 @@
       if (other.Data.Length != 0) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Data = input.ReadBytes();
@@ -4417,36 +3748,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class MoreBytes : pb::IMessage<MoreBytes> {
     private static readonly pb::MessageParser<MoreBytes> _parser = new pb::MessageParser<MoreBytes>(() => new MoreBytes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MoreBytes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[17]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[16]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MoreBytes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MoreBytes(MoreBytes other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MoreBytes Clone() {
       return new MoreBytes(this);
     }
@@ -4454,7 +3778,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private pb::ByteString data_ = pb::ByteString.Empty;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString Data {
       get { return data_; }
       set {
@@ -4462,12 +3785,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MoreBytes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MoreBytes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4476,48 +3797,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data.Length != 0) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data.Length != 0) {
         output.WriteRawTag(10);
         output.WriteBytes(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeBytesSize(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MoreBytes other) {
       if (other == null) {
         return;
@@ -4525,16 +3832,14 @@
       if (other.Data.Length != 0) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Data = input.ReadBytes();
@@ -4547,38 +3852,31 @@
   }
 
   /// <summary>
-  /// Test int32, uint32, int64, uint64, and bool are all compatible
+  ///  Test int32, uint32, int64, uint64, and bool are all compatible
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Int32Message : pb::IMessage<Int32Message> {
     private static readonly pb::MessageParser<Int32Message> _parser = new pb::MessageParser<Int32Message>(() => new Int32Message());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Int32Message> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[18]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[17]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int32Message() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int32Message(Int32Message other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int32Message Clone() {
       return new Int32Message(this);
     }
@@ -4586,7 +3884,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private int data_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Data {
       get { return data_; }
       set {
@@ -4594,12 +3891,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Int32Message);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Int32Message other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4608,48 +3903,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data != 0) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Int32Message other) {
       if (other == null) {
         return;
@@ -4657,16 +3938,14 @@
       if (other.Data != 0) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Data = input.ReadInt32();
@@ -4678,36 +3957,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Uint32Message : pb::IMessage<Uint32Message> {
     private static readonly pb::MessageParser<Uint32Message> _parser = new pb::MessageParser<Uint32Message>(() => new Uint32Message());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Uint32Message> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[19]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[18]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Uint32Message() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Uint32Message(Uint32Message other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Uint32Message Clone() {
       return new Uint32Message(this);
     }
@@ -4715,7 +3987,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private uint data_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint Data {
       get { return data_; }
       set {
@@ -4723,12 +3994,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Uint32Message);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Uint32Message other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4737,48 +4006,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data != 0) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data != 0) {
         output.WriteRawTag(8);
         output.WriteUInt32(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data != 0) {
         size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Uint32Message other) {
       if (other == null) {
         return;
@@ -4786,16 +4041,14 @@
       if (other.Data != 0) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Data = input.ReadUInt32();
@@ -4807,36 +4060,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Int64Message : pb::IMessage<Int64Message> {
     private static readonly pb::MessageParser<Int64Message> _parser = new pb::MessageParser<Int64Message>(() => new Int64Message());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Int64Message> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[20]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[19]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int64Message() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int64Message(Int64Message other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int64Message Clone() {
       return new Int64Message(this);
     }
@@ -4844,7 +4090,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private long data_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long Data {
       get { return data_; }
       set {
@@ -4852,12 +4097,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Int64Message);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Int64Message other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4866,48 +4109,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data != 0L) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data != 0L) {
         output.WriteRawTag(8);
         output.WriteInt64(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data != 0L) {
         size += 1 + pb::CodedOutputStream.ComputeInt64Size(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Int64Message other) {
       if (other == null) {
         return;
@@ -4915,16 +4144,14 @@
       if (other.Data != 0L) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Data = input.ReadInt64();
@@ -4936,36 +4163,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Uint64Message : pb::IMessage<Uint64Message> {
     private static readonly pb::MessageParser<Uint64Message> _parser = new pb::MessageParser<Uint64Message>(() => new Uint64Message());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Uint64Message> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[21]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[20]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Uint64Message() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Uint64Message(Uint64Message other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Uint64Message Clone() {
       return new Uint64Message(this);
     }
@@ -4973,7 +4193,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private ulong data_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong Data {
       get { return data_; }
       set {
@@ -4981,12 +4200,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Uint64Message);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Uint64Message other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4995,48 +4212,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data != 0UL) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data != 0UL) {
         output.WriteRawTag(8);
         output.WriteUInt64(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data != 0UL) {
         size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Data);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Uint64Message other) {
       if (other == null) {
         return;
@@ -5044,16 +4247,14 @@
       if (other.Data != 0UL) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Data = input.ReadUInt64();
@@ -5065,36 +4266,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class BoolMessage : pb::IMessage<BoolMessage> {
     private static readonly pb::MessageParser<BoolMessage> _parser = new pb::MessageParser<BoolMessage>(() => new BoolMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<BoolMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[22]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[21]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BoolMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BoolMessage(BoolMessage other) : this() {
       data_ = other.data_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BoolMessage Clone() {
       return new BoolMessage(this);
     }
@@ -5102,7 +4296,6 @@
     /// <summary>Field number for the "data" field.</summary>
     public const int DataFieldNumber = 1;
     private bool data_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Data {
       get { return data_; }
       set {
@@ -5110,12 +4303,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as BoolMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(BoolMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5124,48 +4315,34 @@
         return true;
       }
       if (Data != other.Data) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Data != false) hash ^= Data.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Data != false) {
         output.WriteRawTag(8);
         output.WriteBool(Data);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Data != false) {
         size += 1 + 1;
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(BoolMessage other) {
       if (other == null) {
         return;
@@ -5173,16 +4350,14 @@
       if (other.Data != false) {
         Data = other.Data;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Data = input.ReadBool();
@@ -5195,32 +4370,27 @@
   }
 
   /// <summary>
-  /// Test oneofs.
+  ///  Test oneofs.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestOneof : pb::IMessage<TestOneof> {
     private static readonly pb::MessageParser<TestOneof> _parser = new pb::MessageParser<TestOneof>(() => new TestOneof());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestOneof> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[23]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[22]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestOneof() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestOneof(TestOneof other) : this() {
       switch (other.FooCase) {
         case FooOneofCase.FooInt:
@@ -5234,17 +4404,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestOneof Clone() {
       return new TestOneof(this);
     }
 
     /// <summary>Field number for the "foo_int" field.</summary>
     public const int FooIntFieldNumber = 1;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int FooInt {
       get { return fooCase_ == FooOneofCase.FooInt ? (int) foo_ : 0; }
       set {
@@ -5255,7 +4422,6 @@
 
     /// <summary>Field number for the "foo_string" field.</summary>
     public const int FooStringFieldNumber = 2;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string FooString {
       get { return fooCase_ == FooOneofCase.FooString ? (string) foo_ : ""; }
       set {
@@ -5266,7 +4432,6 @@
 
     /// <summary>Field number for the "foo_message" field.</summary>
     public const int FooMessageFieldNumber = 3;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.TestProtos.TestAllTypes FooMessage {
       get { return fooCase_ == FooOneofCase.FooMessage ? (global::Google.Protobuf.TestProtos.TestAllTypes) foo_ : null; }
       set {
@@ -5284,23 +4449,19 @@
       FooMessage = 3,
     }
     private FooOneofCase fooCase_ = FooOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooOneofCase FooCase {
       get { return fooCase_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearFoo() {
       fooCase_ = FooOneofCase.None;
       foo_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestOneof);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestOneof other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5312,28 +4473,22 @@
       if (FooString != other.FooString) return false;
       if (!object.Equals(FooMessage, other.FooMessage)) return false;
       if (FooCase != other.FooCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (fooCase_ == FooOneofCase.FooInt) hash ^= FooInt.GetHashCode();
       if (fooCase_ == FooOneofCase.FooString) hash ^= FooString.GetHashCode();
       if (fooCase_ == FooOneofCase.FooMessage) hash ^= FooMessage.GetHashCode();
       hash ^= (int) fooCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (fooCase_ == FooOneofCase.FooInt) {
         output.WriteRawTag(8);
@@ -5347,12 +4502,8 @@
         output.WriteRawTag(26);
         output.WriteMessage(FooMessage);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (fooCase_ == FooOneofCase.FooInt) {
@@ -5364,13 +4515,9 @@
       if (fooCase_ == FooOneofCase.FooMessage) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(FooMessage);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestOneof other) {
       if (other == null) {
         return;
@@ -5383,23 +4530,18 @@
           FooString = other.FooString;
           break;
         case FooOneofCase.FooMessage:
-          if (FooMessage == null) {
-            FooMessage = new global::Google.Protobuf.TestProtos.TestAllTypes();
-          }
-          FooMessage.MergeFrom(other.FooMessage);
+          FooMessage = other.FooMessage;
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             FooInt = input.ReadInt32();
@@ -5424,30 +4566,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestPackedTypes : pb::IMessage<TestPackedTypes> {
     private static readonly pb::MessageParser<TestPackedTypes> _parser = new pb::MessageParser<TestPackedTypes>(() => new TestPackedTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestPackedTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[24]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[23]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestPackedTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestPackedTypes(TestPackedTypes other) : this() {
       packedInt32_ = other.packedInt32_.Clone();
       packedInt64_ = other.packedInt64_.Clone();
@@ -5463,10 +4600,8 @@
       packedDouble_ = other.packedDouble_.Clone();
       packedBool_ = other.packedBool_.Clone();
       packedEnum_ = other.packedEnum_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestPackedTypes Clone() {
       return new TestPackedTypes(this);
     }
@@ -5476,7 +4611,6 @@
     private static readonly pb::FieldCodec<int> _repeated_packedInt32_codec
         = pb::FieldCodec.ForInt32(722);
     private readonly pbc::RepeatedField<int> packedInt32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> PackedInt32 {
       get { return packedInt32_; }
     }
@@ -5486,7 +4620,6 @@
     private static readonly pb::FieldCodec<long> _repeated_packedInt64_codec
         = pb::FieldCodec.ForInt64(730);
     private readonly pbc::RepeatedField<long> packedInt64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> PackedInt64 {
       get { return packedInt64_; }
     }
@@ -5496,7 +4629,6 @@
     private static readonly pb::FieldCodec<uint> _repeated_packedUint32_codec
         = pb::FieldCodec.ForUInt32(738);
     private readonly pbc::RepeatedField<uint> packedUint32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> PackedUint32 {
       get { return packedUint32_; }
     }
@@ -5506,7 +4638,6 @@
     private static readonly pb::FieldCodec<ulong> _repeated_packedUint64_codec
         = pb::FieldCodec.ForUInt64(746);
     private readonly pbc::RepeatedField<ulong> packedUint64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> PackedUint64 {
       get { return packedUint64_; }
     }
@@ -5516,7 +4647,6 @@
     private static readonly pb::FieldCodec<int> _repeated_packedSint32_codec
         = pb::FieldCodec.ForSInt32(754);
     private readonly pbc::RepeatedField<int> packedSint32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> PackedSint32 {
       get { return packedSint32_; }
     }
@@ -5526,7 +4656,6 @@
     private static readonly pb::FieldCodec<long> _repeated_packedSint64_codec
         = pb::FieldCodec.ForSInt64(762);
     private readonly pbc::RepeatedField<long> packedSint64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> PackedSint64 {
       get { return packedSint64_; }
     }
@@ -5536,7 +4665,6 @@
     private static readonly pb::FieldCodec<uint> _repeated_packedFixed32_codec
         = pb::FieldCodec.ForFixed32(770);
     private readonly pbc::RepeatedField<uint> packedFixed32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> PackedFixed32 {
       get { return packedFixed32_; }
     }
@@ -5546,7 +4674,6 @@
     private static readonly pb::FieldCodec<ulong> _repeated_packedFixed64_codec
         = pb::FieldCodec.ForFixed64(778);
     private readonly pbc::RepeatedField<ulong> packedFixed64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> PackedFixed64 {
       get { return packedFixed64_; }
     }
@@ -5556,7 +4683,6 @@
     private static readonly pb::FieldCodec<int> _repeated_packedSfixed32_codec
         = pb::FieldCodec.ForSFixed32(786);
     private readonly pbc::RepeatedField<int> packedSfixed32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> PackedSfixed32 {
       get { return packedSfixed32_; }
     }
@@ -5566,7 +4692,6 @@
     private static readonly pb::FieldCodec<long> _repeated_packedSfixed64_codec
         = pb::FieldCodec.ForSFixed64(794);
     private readonly pbc::RepeatedField<long> packedSfixed64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> PackedSfixed64 {
       get { return packedSfixed64_; }
     }
@@ -5576,7 +4701,6 @@
     private static readonly pb::FieldCodec<float> _repeated_packedFloat_codec
         = pb::FieldCodec.ForFloat(802);
     private readonly pbc::RepeatedField<float> packedFloat_ = new pbc::RepeatedField<float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<float> PackedFloat {
       get { return packedFloat_; }
     }
@@ -5586,7 +4710,6 @@
     private static readonly pb::FieldCodec<double> _repeated_packedDouble_codec
         = pb::FieldCodec.ForDouble(810);
     private readonly pbc::RepeatedField<double> packedDouble_ = new pbc::RepeatedField<double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<double> PackedDouble {
       get { return packedDouble_; }
     }
@@ -5596,7 +4719,6 @@
     private static readonly pb::FieldCodec<bool> _repeated_packedBool_codec
         = pb::FieldCodec.ForBool(818);
     private readonly pbc::RepeatedField<bool> packedBool_ = new pbc::RepeatedField<bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<bool> PackedBool {
       get { return packedBool_; }
     }
@@ -5606,17 +4728,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ForeignEnum> _repeated_packedEnum_codec
         = pb::FieldCodec.ForEnum(826, x => (int) x, x => (global::Google.Protobuf.TestProtos.ForeignEnum) x);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> packedEnum_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> PackedEnum {
       get { return packedEnum_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestPackedTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestPackedTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5638,10 +4757,9 @@
       if(!packedDouble_.Equals(other.packedDouble_)) return false;
       if(!packedBool_.Equals(other.packedBool_)) return false;
       if(!packedEnum_.Equals(other.packedEnum_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= packedInt32_.GetHashCode();
@@ -5658,18 +4776,13 @@
       hash ^= packedDouble_.GetHashCode();
       hash ^= packedBool_.GetHashCode();
       hash ^= packedEnum_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       packedInt32_.WriteTo(output, _repeated_packedInt32_codec);
       packedInt64_.WriteTo(output, _repeated_packedInt64_codec);
@@ -5685,12 +4798,8 @@
       packedDouble_.WriteTo(output, _repeated_packedDouble_codec);
       packedBool_.WriteTo(output, _repeated_packedBool_codec);
       packedEnum_.WriteTo(output, _repeated_packedEnum_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += packedInt32_.CalculateSize(_repeated_packedInt32_codec);
@@ -5707,13 +4816,9 @@
       size += packedDouble_.CalculateSize(_repeated_packedDouble_codec);
       size += packedBool_.CalculateSize(_repeated_packedBool_codec);
       size += packedEnum_.CalculateSize(_repeated_packedEnum_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestPackedTypes other) {
       if (other == null) {
         return;
@@ -5732,16 +4837,14 @@
       packedDouble_.Add(other.packedDouble_);
       packedBool_.Add(other.packedBool_);
       packedEnum_.Add(other.packedEnum_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 722:
           case 720: {
@@ -5820,33 +4923,28 @@
   }
 
   /// <summary>
-  /// A message with the same fields as TestPackedTypes, but without packing. Used
-  /// to test packed &lt;-> unpacked wire compatibility.
+  ///  A message with the same fields as TestPackedTypes, but without packing. Used
+  ///  to test packed &lt;-> unpacked wire compatibility.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestUnpackedTypes : pb::IMessage<TestUnpackedTypes> {
     private static readonly pb::MessageParser<TestUnpackedTypes> _parser = new pb::MessageParser<TestUnpackedTypes>(() => new TestUnpackedTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestUnpackedTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[25]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[24]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestUnpackedTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestUnpackedTypes(TestUnpackedTypes other) : this() {
       unpackedInt32_ = other.unpackedInt32_.Clone();
       unpackedInt64_ = other.unpackedInt64_.Clone();
@@ -5862,10 +4960,8 @@
       unpackedDouble_ = other.unpackedDouble_.Clone();
       unpackedBool_ = other.unpackedBool_.Clone();
       unpackedEnum_ = other.unpackedEnum_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestUnpackedTypes Clone() {
       return new TestUnpackedTypes(this);
     }
@@ -5875,7 +4971,6 @@
     private static readonly pb::FieldCodec<int> _repeated_unpackedInt32_codec
         = pb::FieldCodec.ForInt32(720);
     private readonly pbc::RepeatedField<int> unpackedInt32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> UnpackedInt32 {
       get { return unpackedInt32_; }
     }
@@ -5885,7 +4980,6 @@
     private static readonly pb::FieldCodec<long> _repeated_unpackedInt64_codec
         = pb::FieldCodec.ForInt64(728);
     private readonly pbc::RepeatedField<long> unpackedInt64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> UnpackedInt64 {
       get { return unpackedInt64_; }
     }
@@ -5895,7 +4989,6 @@
     private static readonly pb::FieldCodec<uint> _repeated_unpackedUint32_codec
         = pb::FieldCodec.ForUInt32(736);
     private readonly pbc::RepeatedField<uint> unpackedUint32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> UnpackedUint32 {
       get { return unpackedUint32_; }
     }
@@ -5905,7 +4998,6 @@
     private static readonly pb::FieldCodec<ulong> _repeated_unpackedUint64_codec
         = pb::FieldCodec.ForUInt64(744);
     private readonly pbc::RepeatedField<ulong> unpackedUint64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> UnpackedUint64 {
       get { return unpackedUint64_; }
     }
@@ -5915,7 +5007,6 @@
     private static readonly pb::FieldCodec<int> _repeated_unpackedSint32_codec
         = pb::FieldCodec.ForSInt32(752);
     private readonly pbc::RepeatedField<int> unpackedSint32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> UnpackedSint32 {
       get { return unpackedSint32_; }
     }
@@ -5925,7 +5016,6 @@
     private static readonly pb::FieldCodec<long> _repeated_unpackedSint64_codec
         = pb::FieldCodec.ForSInt64(760);
     private readonly pbc::RepeatedField<long> unpackedSint64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> UnpackedSint64 {
       get { return unpackedSint64_; }
     }
@@ -5935,7 +5025,6 @@
     private static readonly pb::FieldCodec<uint> _repeated_unpackedFixed32_codec
         = pb::FieldCodec.ForFixed32(773);
     private readonly pbc::RepeatedField<uint> unpackedFixed32_ = new pbc::RepeatedField<uint>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> UnpackedFixed32 {
       get { return unpackedFixed32_; }
     }
@@ -5945,7 +5034,6 @@
     private static readonly pb::FieldCodec<ulong> _repeated_unpackedFixed64_codec
         = pb::FieldCodec.ForFixed64(777);
     private readonly pbc::RepeatedField<ulong> unpackedFixed64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> UnpackedFixed64 {
       get { return unpackedFixed64_; }
     }
@@ -5955,7 +5043,6 @@
     private static readonly pb::FieldCodec<int> _repeated_unpackedSfixed32_codec
         = pb::FieldCodec.ForSFixed32(789);
     private readonly pbc::RepeatedField<int> unpackedSfixed32_ = new pbc::RepeatedField<int>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> UnpackedSfixed32 {
       get { return unpackedSfixed32_; }
     }
@@ -5965,7 +5052,6 @@
     private static readonly pb::FieldCodec<long> _repeated_unpackedSfixed64_codec
         = pb::FieldCodec.ForSFixed64(793);
     private readonly pbc::RepeatedField<long> unpackedSfixed64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> UnpackedSfixed64 {
       get { return unpackedSfixed64_; }
     }
@@ -5975,7 +5061,6 @@
     private static readonly pb::FieldCodec<float> _repeated_unpackedFloat_codec
         = pb::FieldCodec.ForFloat(805);
     private readonly pbc::RepeatedField<float> unpackedFloat_ = new pbc::RepeatedField<float>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<float> UnpackedFloat {
       get { return unpackedFloat_; }
     }
@@ -5985,7 +5070,6 @@
     private static readonly pb::FieldCodec<double> _repeated_unpackedDouble_codec
         = pb::FieldCodec.ForDouble(809);
     private readonly pbc::RepeatedField<double> unpackedDouble_ = new pbc::RepeatedField<double>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<double> UnpackedDouble {
       get { return unpackedDouble_; }
     }
@@ -5995,7 +5079,6 @@
     private static readonly pb::FieldCodec<bool> _repeated_unpackedBool_codec
         = pb::FieldCodec.ForBool(816);
     private readonly pbc::RepeatedField<bool> unpackedBool_ = new pbc::RepeatedField<bool>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<bool> UnpackedBool {
       get { return unpackedBool_; }
     }
@@ -6005,17 +5088,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.TestProtos.ForeignEnum> _repeated_unpackedEnum_codec
         = pb::FieldCodec.ForEnum(824, x => (int) x, x => (global::Google.Protobuf.TestProtos.ForeignEnum) x);
     private readonly pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> unpackedEnum_ = new pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.TestProtos.ForeignEnum> UnpackedEnum {
       get { return unpackedEnum_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestUnpackedTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestUnpackedTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6037,10 +5117,9 @@
       if(!unpackedDouble_.Equals(other.unpackedDouble_)) return false;
       if(!unpackedBool_.Equals(other.unpackedBool_)) return false;
       if(!unpackedEnum_.Equals(other.unpackedEnum_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= unpackedInt32_.GetHashCode();
@@ -6057,18 +5136,13 @@
       hash ^= unpackedDouble_.GetHashCode();
       hash ^= unpackedBool_.GetHashCode();
       hash ^= unpackedEnum_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       unpackedInt32_.WriteTo(output, _repeated_unpackedInt32_codec);
       unpackedInt64_.WriteTo(output, _repeated_unpackedInt64_codec);
@@ -6084,12 +5158,8 @@
       unpackedDouble_.WriteTo(output, _repeated_unpackedDouble_codec);
       unpackedBool_.WriteTo(output, _repeated_unpackedBool_codec);
       unpackedEnum_.WriteTo(output, _repeated_unpackedEnum_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += unpackedInt32_.CalculateSize(_repeated_unpackedInt32_codec);
@@ -6106,13 +5176,9 @@
       size += unpackedDouble_.CalculateSize(_repeated_unpackedDouble_codec);
       size += unpackedBool_.CalculateSize(_repeated_unpackedBool_codec);
       size += unpackedEnum_.CalculateSize(_repeated_unpackedEnum_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestUnpackedTypes other) {
       if (other == null) {
         return;
@@ -6131,16 +5197,14 @@
       unpackedDouble_.Add(other.unpackedDouble_);
       unpackedBool_.Add(other.unpackedBool_);
       unpackedEnum_.Add(other.unpackedEnum_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 722:
           case 720: {
@@ -6218,30 +5282,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestRepeatedScalarDifferentTagSizes : pb::IMessage<TestRepeatedScalarDifferentTagSizes> {
     private static readonly pb::MessageParser<TestRepeatedScalarDifferentTagSizes> _parser = new pb::MessageParser<TestRepeatedScalarDifferentTagSizes>(() => new TestRepeatedScalarDifferentTagSizes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestRepeatedScalarDifferentTagSizes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[26]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[25]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestRepeatedScalarDifferentTagSizes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestRepeatedScalarDifferentTagSizes(TestRepeatedScalarDifferentTagSizes other) : this() {
       repeatedFixed32_ = other.repeatedFixed32_.Clone();
       repeatedInt32_ = other.repeatedInt32_.Clone();
@@ -6249,10 +5308,8 @@
       repeatedInt64_ = other.repeatedInt64_.Clone();
       repeatedFloat_ = other.repeatedFloat_.Clone();
       repeatedUint64_ = other.repeatedUint64_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestRepeatedScalarDifferentTagSizes Clone() {
       return new TestRepeatedScalarDifferentTagSizes(this);
     }
@@ -6263,11 +5320,10 @@
         = pb::FieldCodec.ForFixed32(98);
     private readonly pbc::RepeatedField<uint> repeatedFixed32_ = new pbc::RepeatedField<uint>();
     /// <summary>
-    /// Parsing repeated fixed size values used to fail. This message needs to be
-    /// used in order to get a tag of the right size; all of the repeated fields
-    /// in TestAllTypes didn't trigger the check.
+    ///  Parsing repeated fixed size values used to fail. This message needs to be
+    ///  used in order to get a tag of the right size; all of the repeated fields
+    ///  in TestAllTypes didn't trigger the check.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint> RepeatedFixed32 {
       get { return repeatedFixed32_; }
     }
@@ -6278,9 +5334,8 @@
         = pb::FieldCodec.ForInt32(106);
     private readonly pbc::RepeatedField<int> repeatedInt32_ = new pbc::RepeatedField<int>();
     /// <summary>
-    /// Check for a varint type, just for good measure.
+    ///  Check for a varint type, just for good measure.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> RepeatedInt32 {
       get { return repeatedInt32_; }
     }
@@ -6291,9 +5346,8 @@
         = pb::FieldCodec.ForFixed64(16370);
     private readonly pbc::RepeatedField<ulong> repeatedFixed64_ = new pbc::RepeatedField<ulong>();
     /// <summary>
-    /// These have two-byte tags.
+    ///  These have two-byte tags.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> RepeatedFixed64 {
       get { return repeatedFixed64_; }
     }
@@ -6303,7 +5357,6 @@
     private static readonly pb::FieldCodec<long> _repeated_repeatedInt64_codec
         = pb::FieldCodec.ForInt64(16378);
     private readonly pbc::RepeatedField<long> repeatedInt64_ = new pbc::RepeatedField<long>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long> RepeatedInt64 {
       get { return repeatedInt64_; }
     }
@@ -6314,9 +5367,8 @@
         = pb::FieldCodec.ForFloat(2097138);
     private readonly pbc::RepeatedField<float> repeatedFloat_ = new pbc::RepeatedField<float>();
     /// <summary>
-    /// Three byte tags.
+    ///  Three byte tags.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<float> RepeatedFloat {
       get { return repeatedFloat_; }
     }
@@ -6326,17 +5378,14 @@
     private static readonly pb::FieldCodec<ulong> _repeated_repeatedUint64_codec
         = pb::FieldCodec.ForUInt64(2097146);
     private readonly pbc::RepeatedField<ulong> repeatedUint64_ = new pbc::RepeatedField<ulong>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong> RepeatedUint64 {
       get { return repeatedUint64_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestRepeatedScalarDifferentTagSizes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestRepeatedScalarDifferentTagSizes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6350,10 +5399,9 @@
       if(!repeatedInt64_.Equals(other.repeatedInt64_)) return false;
       if(!repeatedFloat_.Equals(other.repeatedFloat_)) return false;
       if(!repeatedUint64_.Equals(other.repeatedUint64_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= repeatedFixed32_.GetHashCode();
@@ -6362,18 +5410,13 @@
       hash ^= repeatedInt64_.GetHashCode();
       hash ^= repeatedFloat_.GetHashCode();
       hash ^= repeatedUint64_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       repeatedFixed32_.WriteTo(output, _repeated_repeatedFixed32_codec);
       repeatedInt32_.WriteTo(output, _repeated_repeatedInt32_codec);
@@ -6381,12 +5424,8 @@
       repeatedInt64_.WriteTo(output, _repeated_repeatedInt64_codec);
       repeatedFloat_.WriteTo(output, _repeated_repeatedFloat_codec);
       repeatedUint64_.WriteTo(output, _repeated_repeatedUint64_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += repeatedFixed32_.CalculateSize(_repeated_repeatedFixed32_codec);
@@ -6395,13 +5434,9 @@
       size += repeatedInt64_.CalculateSize(_repeated_repeatedInt64_codec);
       size += repeatedFloat_.CalculateSize(_repeated_repeatedFloat_codec);
       size += repeatedUint64_.CalculateSize(_repeated_repeatedUint64_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestRepeatedScalarDifferentTagSizes other) {
       if (other == null) {
         return;
@@ -6412,16 +5447,14 @@
       repeatedInt64_.Add(other.repeatedInt64_);
       repeatedFloat_.Add(other.repeatedFloat_);
       repeatedUint64_.Add(other.repeatedUint64_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 98:
           case 101: {
@@ -6459,36 +5492,29 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestCommentInjectionMessage : pb::IMessage<TestCommentInjectionMessage> {
     private static readonly pb::MessageParser<TestCommentInjectionMessage> _parser = new pb::MessageParser<TestCommentInjectionMessage>(() => new TestCommentInjectionMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestCommentInjectionMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[27]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[26]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestCommentInjectionMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestCommentInjectionMessage(TestCommentInjectionMessage other) : this() {
       a_ = other.a_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestCommentInjectionMessage Clone() {
       return new TestCommentInjectionMessage(this);
     }
@@ -6497,9 +5523,8 @@
     public const int AFieldNumber = 1;
     private string a_ = "";
     /// <summary>
-    /// */ &lt;- This should not close the generated doc comment
+    ///  */ &lt;- This should not close the generated doc comment
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string A {
       get { return a_; }
       set {
@@ -6507,12 +5532,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestCommentInjectionMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestCommentInjectionMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6521,48 +5544,34 @@
         return true;
       }
       if (A != other.A) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (A.Length != 0) hash ^= A.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (A.Length != 0) {
         output.WriteRawTag(10);
         output.WriteString(A);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (A.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(A);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestCommentInjectionMessage other) {
       if (other == null) {
         return;
@@ -6570,16 +5579,14 @@
       if (other.A.Length != 0) {
         A = other.A;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             A = input.ReadString();
@@ -6592,47 +5599,38 @@
   }
 
   /// <summary>
-  /// Test that RPC services work.
+  ///  Test that RPC services work.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class FooRequest : pb::IMessage<FooRequest> {
     private static readonly pb::MessageParser<FooRequest> _parser = new pb::MessageParser<FooRequest>(() => new FooRequest());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FooRequest> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[28]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[27]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooRequest() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooRequest(FooRequest other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooRequest Clone() {
       return new FooRequest(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FooRequest);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FooRequest other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6640,54 +5638,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FooRequest other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -6695,45 +5677,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class FooResponse : pb::IMessage<FooResponse> {
     private static readonly pb::MessageParser<FooResponse> _parser = new pb::MessageParser<FooResponse>(() => new FooResponse());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FooResponse> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[29]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[28]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooResponse() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooResponse(FooResponse other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooResponse Clone() {
       return new FooResponse(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FooResponse);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FooResponse other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6741,54 +5714,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FooResponse other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -6796,45 +5753,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class FooClientMessage : pb::IMessage<FooClientMessage> {
     private static readonly pb::MessageParser<FooClientMessage> _parser = new pb::MessageParser<FooClientMessage>(() => new FooClientMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FooClientMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[30]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[29]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooClientMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooClientMessage(FooClientMessage other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooClientMessage Clone() {
       return new FooClientMessage(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FooClientMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FooClientMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6842,54 +5790,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FooClientMessage other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -6897,45 +5829,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class FooServerMessage : pb::IMessage<FooServerMessage> {
     private static readonly pb::MessageParser<FooServerMessage> _parser = new pb::MessageParser<FooServerMessage>(() => new FooServerMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FooServerMessage> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[31]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[30]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooServerMessage() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooServerMessage(FooServerMessage other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FooServerMessage Clone() {
       return new FooServerMessage(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FooServerMessage);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FooServerMessage other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6943,54 +5866,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FooServerMessage other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -6998,45 +5905,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class BarRequest : pb::IMessage<BarRequest> {
     private static readonly pb::MessageParser<BarRequest> _parser = new pb::MessageParser<BarRequest>(() => new BarRequest());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<BarRequest> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[32]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[31]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BarRequest() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BarRequest(BarRequest other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BarRequest Clone() {
       return new BarRequest(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as BarRequest);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(BarRequest other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -7044,54 +5942,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(BarRequest other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
@@ -7099,45 +5981,36 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class BarResponse : pb::IMessage<BarResponse> {
     private static readonly pb::MessageParser<BarResponse> _parser = new pb::MessageParser<BarResponse>(() => new BarResponse());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<BarResponse> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[33]; }
+      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[32]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BarResponse() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BarResponse(BarResponse other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BarResponse Clone() {
       return new BarResponse(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as BarResponse);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(BarResponse other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -7145,155 +6018,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(BarResponse other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-        }
-      }
-    }
-
-  }
-
-  public sealed partial class TestEmptyMessage : pb::IMessage<TestEmptyMessage> {
-    private static readonly pb::MessageParser<TestEmptyMessage> _parser = new pb::MessageParser<TestEmptyMessage>(() => new TestEmptyMessage());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<TestEmptyMessage> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor.MessageTypes[34]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestEmptyMessage() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestEmptyMessage(TestEmptyMessage other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public TestEmptyMessage Clone() {
-      return new TestEmptyMessage(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as TestEmptyMessage);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(TestEmptyMessage other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(TestEmptyMessage other) {
-      if (other == null) {
-        return;
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs
index 2e1d2bd..ae12f4a 100644
--- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs
+++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/unittest_well_known_types.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest_well_known_types.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.TestProtos {
 
   /// <summary>Holder for reflection information generated from google/protobuf/unittest_well_known_types.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class UnittestWellKnownTypesReflection {
 
     #region Descriptor
@@ -175,34 +174,29 @@
   }
   #region Messages
   /// <summary>
-  /// Test that we can include all well-known types.
-  /// Each wrapper type is included separately, as languages
-  /// map handle different wrappers in different ways.
+  ///  Test that we can include all well-known types.
+  ///  Each wrapper type is included separately, as languages
+  ///  map handle different wrappers in different ways.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class TestWellKnownTypes : pb::IMessage<TestWellKnownTypes> {
     private static readonly pb::MessageParser<TestWellKnownTypes> _parser = new pb::MessageParser<TestWellKnownTypes>(() => new TestWellKnownTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<TestWellKnownTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestWellKnownTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestWellKnownTypes(TestWellKnownTypes other) : this() {
       AnyField = other.anyField_ != null ? other.AnyField.Clone() : null;
       ApiField = other.apiField_ != null ? other.ApiField.Clone() : null;
@@ -223,10 +217,8 @@
       StringField = other.StringField;
       BytesField = other.BytesField;
       ValueField = other.valueField_ != null ? other.ValueField.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public TestWellKnownTypes Clone() {
       return new TestWellKnownTypes(this);
     }
@@ -234,7 +226,6 @@
     /// <summary>Field number for the "any_field" field.</summary>
     public const int AnyFieldFieldNumber = 1;
     private global::Google.Protobuf.WellKnownTypes.Any anyField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Any AnyField {
       get { return anyField_; }
       set {
@@ -245,7 +236,6 @@
     /// <summary>Field number for the "api_field" field.</summary>
     public const int ApiFieldFieldNumber = 2;
     private global::Google.Protobuf.WellKnownTypes.Api apiField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Api ApiField {
       get { return apiField_; }
       set {
@@ -256,7 +246,6 @@
     /// <summary>Field number for the "duration_field" field.</summary>
     public const int DurationFieldFieldNumber = 3;
     private global::Google.Protobuf.WellKnownTypes.Duration durationField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
       get { return durationField_; }
       set {
@@ -267,7 +256,6 @@
     /// <summary>Field number for the "empty_field" field.</summary>
     public const int EmptyFieldFieldNumber = 4;
     private global::Google.Protobuf.WellKnownTypes.Empty emptyField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
       get { return emptyField_; }
       set {
@@ -278,7 +266,6 @@
     /// <summary>Field number for the "field_mask_field" field.</summary>
     public const int FieldMaskFieldFieldNumber = 5;
     private global::Google.Protobuf.WellKnownTypes.FieldMask fieldMaskField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
       get { return fieldMaskField_; }
       set {
@@ -289,7 +276,6 @@
     /// <summary>Field number for the "source_context_field" field.</summary>
     public const int SourceContextFieldFieldNumber = 6;
     private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContextField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
       get { return sourceContextField_; }
       set {
@@ -300,7 +286,6 @@
     /// <summary>Field number for the "struct_field" field.</summary>
     public const int StructFieldFieldNumber = 7;
     private global::Google.Protobuf.WellKnownTypes.Struct structField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Struct StructField {
       get { return structField_; }
       set {
@@ -311,7 +296,6 @@
     /// <summary>Field number for the "timestamp_field" field.</summary>
     public const int TimestampFieldFieldNumber = 8;
     private global::Google.Protobuf.WellKnownTypes.Timestamp timestampField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
       get { return timestampField_; }
       set {
@@ -322,7 +306,6 @@
     /// <summary>Field number for the "type_field" field.</summary>
     public const int TypeFieldFieldNumber = 9;
     private global::Google.Protobuf.WellKnownTypes.Type typeField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Type TypeField {
       get { return typeField_; }
       set {
@@ -334,7 +317,6 @@
     public const int DoubleFieldFieldNumber = 10;
     private static readonly pb::FieldCodec<double?> _single_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
     private double? doubleField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public double? DoubleField {
       get { return doubleField_; }
       set {
@@ -346,7 +328,6 @@
     public const int FloatFieldFieldNumber = 11;
     private static readonly pb::FieldCodec<float?> _single_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
     private float? floatField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public float? FloatField {
       get { return floatField_; }
       set {
@@ -358,7 +339,6 @@
     public const int Int64FieldFieldNumber = 12;
     private static readonly pb::FieldCodec<long?> _single_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
     private long? int64Field_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long? Int64Field {
       get { return int64Field_; }
       set {
@@ -370,7 +350,6 @@
     public const int Uint64FieldFieldNumber = 13;
     private static readonly pb::FieldCodec<ulong?> _single_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
     private ulong? uint64Field_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong? Uint64Field {
       get { return uint64Field_; }
       set {
@@ -382,7 +361,6 @@
     public const int Int32FieldFieldNumber = 14;
     private static readonly pb::FieldCodec<int?> _single_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
     private int? int32Field_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int? Int32Field {
       get { return int32Field_; }
       set {
@@ -394,7 +372,6 @@
     public const int Uint32FieldFieldNumber = 15;
     private static readonly pb::FieldCodec<uint?> _single_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
     private uint? uint32Field_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint? Uint32Field {
       get { return uint32Field_; }
       set {
@@ -406,7 +383,6 @@
     public const int BoolFieldFieldNumber = 16;
     private static readonly pb::FieldCodec<bool?> _single_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
     private bool? boolField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool? BoolField {
       get { return boolField_; }
       set {
@@ -418,7 +394,6 @@
     public const int StringFieldFieldNumber = 17;
     private static readonly pb::FieldCodec<string> _single_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
     private string stringField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string StringField {
       get { return stringField_; }
       set {
@@ -430,7 +405,6 @@
     public const int BytesFieldFieldNumber = 18;
     private static readonly pb::FieldCodec<pb::ByteString> _single_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
     private pb::ByteString bytesField_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString BytesField {
       get { return bytesField_; }
       set {
@@ -442,9 +416,8 @@
     public const int ValueFieldFieldNumber = 19;
     private global::Google.Protobuf.WellKnownTypes.Value valueField_;
     /// <summary>
-    /// Part of struct, but useful to be able to test separately
+    ///  Part of struct, but useful to be able to test separately
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Value ValueField {
       get { return valueField_; }
       set {
@@ -452,12 +425,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as TestWellKnownTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(TestWellKnownTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -474,8 +445,8 @@
       if (!object.Equals(StructField, other.StructField)) return false;
       if (!object.Equals(TimestampField, other.TimestampField)) return false;
       if (!object.Equals(TypeField, other.TypeField)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField, other.DoubleField)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(FloatField, other.FloatField)) return false;
+      if (DoubleField != other.DoubleField) return false;
+      if (FloatField != other.FloatField) return false;
       if (Int64Field != other.Int64Field) return false;
       if (Uint64Field != other.Uint64Field) return false;
       if (Int32Field != other.Int32Field) return false;
@@ -484,10 +455,9 @@
       if (StringField != other.StringField) return false;
       if (BytesField != other.BytesField) return false;
       if (!object.Equals(ValueField, other.ValueField)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (anyField_ != null) hash ^= AnyField.GetHashCode();
@@ -499,8 +469,8 @@
       if (structField_ != null) hash ^= StructField.GetHashCode();
       if (timestampField_ != null) hash ^= TimestampField.GetHashCode();
       if (typeField_ != null) hash ^= TypeField.GetHashCode();
-      if (doubleField_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField);
-      if (floatField_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(FloatField);
+      if (doubleField_ != null) hash ^= DoubleField.GetHashCode();
+      if (floatField_ != null) hash ^= FloatField.GetHashCode();
       if (int64Field_ != null) hash ^= Int64Field.GetHashCode();
       if (uint64Field_ != null) hash ^= Uint64Field.GetHashCode();
       if (int32Field_ != null) hash ^= Int32Field.GetHashCode();
@@ -509,18 +479,13 @@
       if (stringField_ != null) hash ^= StringField.GetHashCode();
       if (bytesField_ != null) hash ^= BytesField.GetHashCode();
       if (valueField_ != null) hash ^= ValueField.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (anyField_ != null) {
         output.WriteRawTag(10);
@@ -589,12 +554,8 @@
         output.WriteRawTag(154, 1);
         output.WriteMessage(ValueField);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (anyField_ != null) {
@@ -654,13 +615,9 @@
       if (valueField_ != null) {
         size += 2 + pb::CodedOutputStream.ComputeMessageSize(ValueField);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(TestWellKnownTypes other) {
       if (other == null) {
         return;
@@ -770,16 +727,14 @@
         }
         ValueField.MergeFrom(other.ValueField);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             if (anyField_ == null) {
@@ -921,32 +876,27 @@
   }
 
   /// <summary>
-  /// A repeated field for each well-known type.
+  ///  A repeated field for each well-known type.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class RepeatedWellKnownTypes : pb::IMessage<RepeatedWellKnownTypes> {
     private static readonly pb::MessageParser<RepeatedWellKnownTypes> _parser = new pb::MessageParser<RepeatedWellKnownTypes>(() => new RepeatedWellKnownTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<RepeatedWellKnownTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public RepeatedWellKnownTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public RepeatedWellKnownTypes(RepeatedWellKnownTypes other) : this() {
       anyField_ = other.anyField_.Clone();
       apiField_ = other.apiField_.Clone();
@@ -966,10 +916,8 @@
       boolField_ = other.boolField_.Clone();
       stringField_ = other.stringField_.Clone();
       bytesField_ = other.bytesField_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public RepeatedWellKnownTypes Clone() {
       return new RepeatedWellKnownTypes(this);
     }
@@ -979,7 +927,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Any> _repeated_anyField_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Any.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> anyField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> AnyField {
       get { return anyField_; }
     }
@@ -989,7 +936,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Api> _repeated_apiField_codec
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Api.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> apiField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> ApiField {
       get { return apiField_; }
     }
@@ -999,7 +945,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Duration> _repeated_durationField_codec
         = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.WellKnownTypes.Duration.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> durationField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
       get { return durationField_; }
     }
@@ -1009,7 +954,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Empty> _repeated_emptyField_codec
         = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.WellKnownTypes.Empty.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> emptyField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
       get { return emptyField_; }
     }
@@ -1019,7 +963,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.FieldMask> _repeated_fieldMaskField_codec
         = pb::FieldCodec.ForMessage(42, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> fieldMaskField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
       get { return fieldMaskField_; }
     }
@@ -1029,7 +972,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.SourceContext> _repeated_sourceContextField_codec
         = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.WellKnownTypes.SourceContext.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> sourceContextField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
       get { return sourceContextField_; }
     }
@@ -1039,7 +981,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Struct> _repeated_structField_codec
         = pb::FieldCodec.ForMessage(58, global::Google.Protobuf.WellKnownTypes.Struct.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> structField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> StructField {
       get { return structField_; }
     }
@@ -1049,7 +990,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Timestamp> _repeated_timestampField_codec
         = pb::FieldCodec.ForMessage(66, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> timestampField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
       get { return timestampField_; }
     }
@@ -1059,7 +999,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Type> _repeated_typeField_codec
         = pb::FieldCodec.ForMessage(74, global::Google.Protobuf.WellKnownTypes.Type.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> typeField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> TypeField {
       get { return typeField_; }
     }
@@ -1070,9 +1009,8 @@
         = pb::FieldCodec.ForStructWrapper<double>(82);
     private readonly pbc::RepeatedField<double?> doubleField_ = new pbc::RepeatedField<double?>();
     /// <summary>
-    /// These don't actually make a lot of sense, but they're not prohibited...
+    ///  These don't actually make a lot of sense, but they're not prohibited...
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<double?> DoubleField {
       get { return doubleField_; }
     }
@@ -1082,7 +1020,6 @@
     private static readonly pb::FieldCodec<float?> _repeated_floatField_codec
         = pb::FieldCodec.ForStructWrapper<float>(90);
     private readonly pbc::RepeatedField<float?> floatField_ = new pbc::RepeatedField<float?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<float?> FloatField {
       get { return floatField_; }
     }
@@ -1092,7 +1029,6 @@
     private static readonly pb::FieldCodec<long?> _repeated_int64Field_codec
         = pb::FieldCodec.ForStructWrapper<long>(98);
     private readonly pbc::RepeatedField<long?> int64Field_ = new pbc::RepeatedField<long?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<long?> Int64Field {
       get { return int64Field_; }
     }
@@ -1102,7 +1038,6 @@
     private static readonly pb::FieldCodec<ulong?> _repeated_uint64Field_codec
         = pb::FieldCodec.ForStructWrapper<ulong>(106);
     private readonly pbc::RepeatedField<ulong?> uint64Field_ = new pbc::RepeatedField<ulong?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<ulong?> Uint64Field {
       get { return uint64Field_; }
     }
@@ -1112,7 +1047,6 @@
     private static readonly pb::FieldCodec<int?> _repeated_int32Field_codec
         = pb::FieldCodec.ForStructWrapper<int>(114);
     private readonly pbc::RepeatedField<int?> int32Field_ = new pbc::RepeatedField<int?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int?> Int32Field {
       get { return int32Field_; }
     }
@@ -1122,7 +1056,6 @@
     private static readonly pb::FieldCodec<uint?> _repeated_uint32Field_codec
         = pb::FieldCodec.ForStructWrapper<uint>(122);
     private readonly pbc::RepeatedField<uint?> uint32Field_ = new pbc::RepeatedField<uint?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<uint?> Uint32Field {
       get { return uint32Field_; }
     }
@@ -1132,7 +1065,6 @@
     private static readonly pb::FieldCodec<bool?> _repeated_boolField_codec
         = pb::FieldCodec.ForStructWrapper<bool>(130);
     private readonly pbc::RepeatedField<bool?> boolField_ = new pbc::RepeatedField<bool?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<bool?> BoolField {
       get { return boolField_; }
     }
@@ -1142,7 +1074,6 @@
     private static readonly pb::FieldCodec<string> _repeated_stringField_codec
         = pb::FieldCodec.ForClassWrapper<string>(138);
     private readonly pbc::RepeatedField<string> stringField_ = new pbc::RepeatedField<string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> StringField {
       get { return stringField_; }
     }
@@ -1152,17 +1083,14 @@
     private static readonly pb::FieldCodec<pb::ByteString> _repeated_bytesField_codec
         = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
     private readonly pbc::RepeatedField<pb::ByteString> bytesField_ = new pbc::RepeatedField<pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<pb::ByteString> BytesField {
       get { return bytesField_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as RepeatedWellKnownTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(RepeatedWellKnownTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1188,10 +1116,9 @@
       if(!boolField_.Equals(other.boolField_)) return false;
       if(!stringField_.Equals(other.stringField_)) return false;
       if(!bytesField_.Equals(other.bytesField_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= anyField_.GetHashCode();
@@ -1212,18 +1139,13 @@
       hash ^= boolField_.GetHashCode();
       hash ^= stringField_.GetHashCode();
       hash ^= bytesField_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       anyField_.WriteTo(output, _repeated_anyField_codec);
       apiField_.WriteTo(output, _repeated_apiField_codec);
@@ -1243,12 +1165,8 @@
       boolField_.WriteTo(output, _repeated_boolField_codec);
       stringField_.WriteTo(output, _repeated_stringField_codec);
       bytesField_.WriteTo(output, _repeated_bytesField_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += anyField_.CalculateSize(_repeated_anyField_codec);
@@ -1269,13 +1187,9 @@
       size += boolField_.CalculateSize(_repeated_boolField_codec);
       size += stringField_.CalculateSize(_repeated_stringField_codec);
       size += bytesField_.CalculateSize(_repeated_bytesField_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(RepeatedWellKnownTypes other) {
       if (other == null) {
         return;
@@ -1298,16 +1212,14 @@
       boolField_.Add(other.boolField_);
       stringField_.Add(other.stringField_);
       bytesField_.Add(other.bytesField_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             anyField_.AddEntriesFrom(input, _repeated_anyField_codec);
@@ -1387,30 +1299,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class OneofWellKnownTypes : pb::IMessage<OneofWellKnownTypes> {
     private static readonly pb::MessageParser<OneofWellKnownTypes> _parser = new pb::MessageParser<OneofWellKnownTypes>(() => new OneofWellKnownTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<OneofWellKnownTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofWellKnownTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofWellKnownTypes(OneofWellKnownTypes other) : this() {
       switch (other.OneofFieldCase) {
         case OneofFieldOneofCase.AnyField:
@@ -1469,17 +1376,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofWellKnownTypes Clone() {
       return new OneofWellKnownTypes(this);
     }
 
     /// <summary>Field number for the "any_field" field.</summary>
     public const int AnyFieldFieldNumber = 1;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Any AnyField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.AnyField ? (global::Google.Protobuf.WellKnownTypes.Any) oneofField_ : null; }
       set {
@@ -1490,7 +1394,6 @@
 
     /// <summary>Field number for the "api_field" field.</summary>
     public const int ApiFieldFieldNumber = 2;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Api ApiField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.ApiField ? (global::Google.Protobuf.WellKnownTypes.Api) oneofField_ : null; }
       set {
@@ -1501,7 +1404,6 @@
 
     /// <summary>Field number for the "duration_field" field.</summary>
     public const int DurationFieldFieldNumber = 3;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.DurationField ? (global::Google.Protobuf.WellKnownTypes.Duration) oneofField_ : null; }
       set {
@@ -1512,7 +1414,6 @@
 
     /// <summary>Field number for the "empty_field" field.</summary>
     public const int EmptyFieldFieldNumber = 4;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.EmptyField ? (global::Google.Protobuf.WellKnownTypes.Empty) oneofField_ : null; }
       set {
@@ -1523,7 +1424,6 @@
 
     /// <summary>Field number for the "field_mask_field" field.</summary>
     public const int FieldMaskFieldFieldNumber = 5;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField ? (global::Google.Protobuf.WellKnownTypes.FieldMask) oneofField_ : null; }
       set {
@@ -1534,7 +1434,6 @@
 
     /// <summary>Field number for the "source_context_field" field.</summary>
     public const int SourceContextFieldFieldNumber = 6;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.SourceContextField ? (global::Google.Protobuf.WellKnownTypes.SourceContext) oneofField_ : null; }
       set {
@@ -1545,7 +1444,6 @@
 
     /// <summary>Field number for the "struct_field" field.</summary>
     public const int StructFieldFieldNumber = 7;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Struct StructField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.StructField ? (global::Google.Protobuf.WellKnownTypes.Struct) oneofField_ : null; }
       set {
@@ -1556,7 +1454,6 @@
 
     /// <summary>Field number for the "timestamp_field" field.</summary>
     public const int TimestampFieldFieldNumber = 8;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.TimestampField ? (global::Google.Protobuf.WellKnownTypes.Timestamp) oneofField_ : null; }
       set {
@@ -1567,7 +1464,6 @@
 
     /// <summary>Field number for the "type_field" field.</summary>
     public const int TypeFieldFieldNumber = 9;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Type TypeField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.TypeField ? (global::Google.Protobuf.WellKnownTypes.Type) oneofField_ : null; }
       set {
@@ -1579,7 +1475,6 @@
     /// <summary>Field number for the "double_field" field.</summary>
     public const int DoubleFieldFieldNumber = 10;
     private static readonly pb::FieldCodec<double?> _oneof_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public double? DoubleField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.DoubleField ? (double?) oneofField_ : (double?) null; }
       set {
@@ -1591,7 +1486,6 @@
     /// <summary>Field number for the "float_field" field.</summary>
     public const int FloatFieldFieldNumber = 11;
     private static readonly pb::FieldCodec<float?> _oneof_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public float? FloatField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.FloatField ? (float?) oneofField_ : (float?) null; }
       set {
@@ -1603,7 +1497,6 @@
     /// <summary>Field number for the "int64_field" field.</summary>
     public const int Int64FieldFieldNumber = 12;
     private static readonly pb::FieldCodec<long?> _oneof_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long? Int64Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Int64Field ? (long?) oneofField_ : (long?) null; }
       set {
@@ -1615,7 +1508,6 @@
     /// <summary>Field number for the "uint64_field" field.</summary>
     public const int Uint64FieldFieldNumber = 13;
     private static readonly pb::FieldCodec<ulong?> _oneof_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong? Uint64Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Uint64Field ? (ulong?) oneofField_ : (ulong?) null; }
       set {
@@ -1627,7 +1519,6 @@
     /// <summary>Field number for the "int32_field" field.</summary>
     public const int Int32FieldFieldNumber = 14;
     private static readonly pb::FieldCodec<int?> _oneof_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int? Int32Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Int32Field ? (int?) oneofField_ : (int?) null; }
       set {
@@ -1639,7 +1530,6 @@
     /// <summary>Field number for the "uint32_field" field.</summary>
     public const int Uint32FieldFieldNumber = 15;
     private static readonly pb::FieldCodec<uint?> _oneof_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint? Uint32Field {
       get { return oneofFieldCase_ == OneofFieldOneofCase.Uint32Field ? (uint?) oneofField_ : (uint?) null; }
       set {
@@ -1651,7 +1541,6 @@
     /// <summary>Field number for the "bool_field" field.</summary>
     public const int BoolFieldFieldNumber = 16;
     private static readonly pb::FieldCodec<bool?> _oneof_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool? BoolField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.BoolField ? (bool?) oneofField_ : (bool?) null; }
       set {
@@ -1663,7 +1552,6 @@
     /// <summary>Field number for the "string_field" field.</summary>
     public const int StringFieldFieldNumber = 17;
     private static readonly pb::FieldCodec<string> _oneof_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string StringField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.StringField ? (string) oneofField_ : (string) null; }
       set {
@@ -1675,7 +1563,6 @@
     /// <summary>Field number for the "bytes_field" field.</summary>
     public const int BytesFieldFieldNumber = 18;
     private static readonly pb::FieldCodec<pb::ByteString> _oneof_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString BytesField {
       get { return oneofFieldCase_ == OneofFieldOneofCase.BytesField ? (pb::ByteString) oneofField_ : (pb::ByteString) null; }
       set {
@@ -1708,23 +1595,19 @@
       BytesField = 18,
     }
     private OneofFieldOneofCase oneofFieldCase_ = OneofFieldOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofFieldOneofCase OneofFieldCase {
       get { return oneofFieldCase_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearOneofField() {
       oneofFieldCase_ = OneofFieldOneofCase.None;
       oneofField_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as OneofWellKnownTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(OneofWellKnownTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1741,8 +1624,8 @@
       if (!object.Equals(StructField, other.StructField)) return false;
       if (!object.Equals(TimestampField, other.TimestampField)) return false;
       if (!object.Equals(TypeField, other.TypeField)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField, other.DoubleField)) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(FloatField, other.FloatField)) return false;
+      if (DoubleField != other.DoubleField) return false;
+      if (FloatField != other.FloatField) return false;
       if (Int64Field != other.Int64Field) return false;
       if (Uint64Field != other.Uint64Field) return false;
       if (Int32Field != other.Int32Field) return false;
@@ -1751,10 +1634,9 @@
       if (StringField != other.StringField) return false;
       if (BytesField != other.BytesField) return false;
       if (OneofFieldCase != other.OneofFieldCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) hash ^= AnyField.GetHashCode();
@@ -1766,8 +1648,8 @@
       if (oneofFieldCase_ == OneofFieldOneofCase.StructField) hash ^= StructField.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) hash ^= TimestampField.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) hash ^= TypeField.GetHashCode();
-      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField);
-      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(FloatField);
+      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) hash ^= DoubleField.GetHashCode();
+      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) hash ^= FloatField.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) hash ^= Int64Field.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) hash ^= Uint64Field.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) hash ^= Int32Field.GetHashCode();
@@ -1776,18 +1658,13 @@
       if (oneofFieldCase_ == OneofFieldOneofCase.StringField) hash ^= StringField.GetHashCode();
       if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) hash ^= BytesField.GetHashCode();
       hash ^= (int) oneofFieldCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
         output.WriteRawTag(10);
@@ -1852,12 +1729,8 @@
       if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
         _oneof_bytesField_codec.WriteTagAndValue(output, (pb::ByteString) oneofField_);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
@@ -1914,71 +1787,40 @@
       if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
         size += _oneof_bytesField_codec.CalculateSizeWithTag(BytesField);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(OneofWellKnownTypes other) {
       if (other == null) {
         return;
       }
       switch (other.OneofFieldCase) {
         case OneofFieldOneofCase.AnyField:
-          if (AnyField == null) {
-            AnyField = new global::Google.Protobuf.WellKnownTypes.Any();
-          }
-          AnyField.MergeFrom(other.AnyField);
+          AnyField = other.AnyField;
           break;
         case OneofFieldOneofCase.ApiField:
-          if (ApiField == null) {
-            ApiField = new global::Google.Protobuf.WellKnownTypes.Api();
-          }
-          ApiField.MergeFrom(other.ApiField);
+          ApiField = other.ApiField;
           break;
         case OneofFieldOneofCase.DurationField:
-          if (DurationField == null) {
-            DurationField = new global::Google.Protobuf.WellKnownTypes.Duration();
-          }
-          DurationField.MergeFrom(other.DurationField);
+          DurationField = other.DurationField;
           break;
         case OneofFieldOneofCase.EmptyField:
-          if (EmptyField == null) {
-            EmptyField = new global::Google.Protobuf.WellKnownTypes.Empty();
-          }
-          EmptyField.MergeFrom(other.EmptyField);
+          EmptyField = other.EmptyField;
           break;
         case OneofFieldOneofCase.FieldMaskField:
-          if (FieldMaskField == null) {
-            FieldMaskField = new global::Google.Protobuf.WellKnownTypes.FieldMask();
-          }
-          FieldMaskField.MergeFrom(other.FieldMaskField);
+          FieldMaskField = other.FieldMaskField;
           break;
         case OneofFieldOneofCase.SourceContextField:
-          if (SourceContextField == null) {
-            SourceContextField = new global::Google.Protobuf.WellKnownTypes.SourceContext();
-          }
-          SourceContextField.MergeFrom(other.SourceContextField);
+          SourceContextField = other.SourceContextField;
           break;
         case OneofFieldOneofCase.StructField:
-          if (StructField == null) {
-            StructField = new global::Google.Protobuf.WellKnownTypes.Struct();
-          }
-          StructField.MergeFrom(other.StructField);
+          StructField = other.StructField;
           break;
         case OneofFieldOneofCase.TimestampField:
-          if (TimestampField == null) {
-            TimestampField = new global::Google.Protobuf.WellKnownTypes.Timestamp();
-          }
-          TimestampField.MergeFrom(other.TimestampField);
+          TimestampField = other.TimestampField;
           break;
         case OneofFieldOneofCase.TypeField:
-          if (TypeField == null) {
-            TypeField = new global::Google.Protobuf.WellKnownTypes.Type();
-          }
-          TypeField.MergeFrom(other.TypeField);
+          TypeField = other.TypeField;
           break;
         case OneofFieldOneofCase.DoubleField:
           DoubleField = other.DoubleField;
@@ -2009,16 +1851,14 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             global::Google.Protobuf.WellKnownTypes.Any subBuilder = new global::Google.Protobuf.WellKnownTypes.Any();
@@ -2144,34 +1984,29 @@
   }
 
   /// <summary>
-  /// A map field for each well-known type. We only
-  /// need to worry about the value part of the map being the
-  /// well-known types, as messages can't be map keys.
+  ///  A map field for each well-known type. We only
+  ///  need to worry about the value part of the map being the
+  ///  well-known types, as messages can't be map keys.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class MapWellKnownTypes : pb::IMessage<MapWellKnownTypes> {
     private static readonly pb::MessageParser<MapWellKnownTypes> _parser = new pb::MessageParser<MapWellKnownTypes>(() => new MapWellKnownTypes());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MapWellKnownTypes> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MapWellKnownTypes() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MapWellKnownTypes(MapWellKnownTypes other) : this() {
       anyField_ = other.anyField_.Clone();
       apiField_ = other.apiField_.Clone();
@@ -2191,10 +2026,8 @@
       boolField_ = other.boolField_.Clone();
       stringField_ = other.stringField_.Clone();
       bytesField_ = other.bytesField_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MapWellKnownTypes Clone() {
       return new MapWellKnownTypes(this);
     }
@@ -2204,7 +2037,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec _map_anyField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Any.Parser), 10);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> anyField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> AnyField {
       get { return anyField_; }
     }
@@ -2214,7 +2046,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>.Codec _map_apiField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Api.Parser), 18);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> apiField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> ApiField {
       get { return apiField_; }
     }
@@ -2224,7 +2055,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>.Codec _map_durationField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Duration.Parser), 26);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> durationField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
       get { return durationField_; }
     }
@@ -2234,7 +2064,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>.Codec _map_emptyField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Empty.Parser), 34);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> emptyField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
       get { return emptyField_; }
     }
@@ -2244,7 +2073,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>.Codec _map_fieldMaskField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser), 42);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> fieldMaskField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
       get { return fieldMaskField_; }
     }
@@ -2254,7 +2082,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>.Codec _map_sourceContextField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.SourceContext.Parser), 50);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> sourceContextField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
       get { return sourceContextField_; }
     }
@@ -2264,7 +2091,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>.Codec _map_structField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Struct.Parser), 58);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> structField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> StructField {
       get { return structField_; }
     }
@@ -2274,7 +2100,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>.Codec _map_timestampField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser), 66);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> timestampField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
       get { return timestampField_; }
     }
@@ -2284,7 +2109,6 @@
     private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>.Codec _map_typeField_codec
         = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Type.Parser), 74);
     private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> typeField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> TypeField {
       get { return typeField_; }
     }
@@ -2294,7 +2118,6 @@
     private static readonly pbc::MapField<int, double?>.Codec _map_doubleField_codec
         = new pbc::MapField<int, double?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<double>(18), 82);
     private readonly pbc::MapField<int, double?> doubleField_ = new pbc::MapField<int, double?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, double?> DoubleField {
       get { return doubleField_; }
     }
@@ -2304,7 +2127,6 @@
     private static readonly pbc::MapField<int, float?>.Codec _map_floatField_codec
         = new pbc::MapField<int, float?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<float>(18), 90);
     private readonly pbc::MapField<int, float?> floatField_ = new pbc::MapField<int, float?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, float?> FloatField {
       get { return floatField_; }
     }
@@ -2314,7 +2136,6 @@
     private static readonly pbc::MapField<int, long?>.Codec _map_int64Field_codec
         = new pbc::MapField<int, long?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<long>(18), 98);
     private readonly pbc::MapField<int, long?> int64Field_ = new pbc::MapField<int, long?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, long?> Int64Field {
       get { return int64Field_; }
     }
@@ -2324,7 +2145,6 @@
     private static readonly pbc::MapField<int, ulong?>.Codec _map_uint64Field_codec
         = new pbc::MapField<int, ulong?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<ulong>(18), 106);
     private readonly pbc::MapField<int, ulong?> uint64Field_ = new pbc::MapField<int, ulong?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, ulong?> Uint64Field {
       get { return uint64Field_; }
     }
@@ -2334,7 +2154,6 @@
     private static readonly pbc::MapField<int, int?>.Codec _map_int32Field_codec
         = new pbc::MapField<int, int?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<int>(18), 114);
     private readonly pbc::MapField<int, int?> int32Field_ = new pbc::MapField<int, int?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, int?> Int32Field {
       get { return int32Field_; }
     }
@@ -2344,7 +2163,6 @@
     private static readonly pbc::MapField<int, uint?>.Codec _map_uint32Field_codec
         = new pbc::MapField<int, uint?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<uint>(18), 122);
     private readonly pbc::MapField<int, uint?> uint32Field_ = new pbc::MapField<int, uint?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, uint?> Uint32Field {
       get { return uint32Field_; }
     }
@@ -2354,7 +2172,6 @@
     private static readonly pbc::MapField<int, bool?>.Codec _map_boolField_codec
         = new pbc::MapField<int, bool?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<bool>(18), 130);
     private readonly pbc::MapField<int, bool?> boolField_ = new pbc::MapField<int, bool?>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, bool?> BoolField {
       get { return boolField_; }
     }
@@ -2364,7 +2181,6 @@
     private static readonly pbc::MapField<int, string>.Codec _map_stringField_codec
         = new pbc::MapField<int, string>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForClassWrapper<string>(18), 138);
     private readonly pbc::MapField<int, string> stringField_ = new pbc::MapField<int, string>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, string> StringField {
       get { return stringField_; }
     }
@@ -2374,17 +2190,14 @@
     private static readonly pbc::MapField<int, pb::ByteString>.Codec _map_bytesField_codec
         = new pbc::MapField<int, pb::ByteString>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForClassWrapper<pb::ByteString>(18), 146);
     private readonly pbc::MapField<int, pb::ByteString> bytesField_ = new pbc::MapField<int, pb::ByteString>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<int, pb::ByteString> BytesField {
       get { return bytesField_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MapWellKnownTypes);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MapWellKnownTypes other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2410,10 +2223,9 @@
       if (!BoolField.Equals(other.BoolField)) return false;
       if (!StringField.Equals(other.StringField)) return false;
       if (!BytesField.Equals(other.BytesField)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= AnyField.GetHashCode();
@@ -2434,18 +2246,13 @@
       hash ^= BoolField.GetHashCode();
       hash ^= StringField.GetHashCode();
       hash ^= BytesField.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       anyField_.WriteTo(output, _map_anyField_codec);
       apiField_.WriteTo(output, _map_apiField_codec);
@@ -2465,12 +2272,8 @@
       boolField_.WriteTo(output, _map_boolField_codec);
       stringField_.WriteTo(output, _map_stringField_codec);
       bytesField_.WriteTo(output, _map_bytesField_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += anyField_.CalculateSize(_map_anyField_codec);
@@ -2491,13 +2294,9 @@
       size += boolField_.CalculateSize(_map_boolField_codec);
       size += stringField_.CalculateSize(_map_stringField_codec);
       size += bytesField_.CalculateSize(_map_bytesField_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MapWellKnownTypes other) {
       if (other == null) {
         return;
@@ -2520,16 +2319,14 @@
       boolField_.Add(other.boolField_);
       stringField_.Add(other.stringField_);
       bytesField_.Add(other.bytesField_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             anyField_.AddEntriesFrom(input, _map_anyField_codec);
diff --git a/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs b/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs
deleted file mode 100644
index 1edd6fb..0000000
--- a/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-#region Copyright notice and license
-// 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.
-#endregion
-
-using System;
-using Google.Protobuf.TestProtos;
-using NUnit.Framework;
-
-namespace Google.Protobuf
-{
-    public class UnknownFieldSetTest
-    {
-        [Test]
-        public void EmptyUnknownFieldSet()
-        {
-            UnknownFieldSet unknownFields = new UnknownFieldSet();
-            Assert.AreEqual(0, unknownFields.CalculateSize());
-        }
-
-        [Test]
-        public void MergeUnknownFieldSet()
-        {
-            UnknownFieldSet unknownFields = new UnknownFieldSet();
-            UnknownField field = new UnknownField();
-            field.AddFixed32(123);
-            unknownFields.AddOrReplaceField(1, field);
-            UnknownFieldSet otherUnknownFields = new UnknownFieldSet();
-            Assert.IsFalse(otherUnknownFields.HasField(1));
-            UnknownFieldSet.MergeFrom(otherUnknownFields, unknownFields);
-            Assert.IsTrue(otherUnknownFields.HasField(1));
-        }
-
-        [Test]
-        public void TestMergeCodedInput()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var emptyMessage = new TestEmptyMessage();
-            emptyMessage.MergeFrom(message.ToByteArray());
-            Assert.AreEqual(message.CalculateSize(), emptyMessage.CalculateSize());
-            Assert.AreEqual(message.ToByteArray(), emptyMessage.ToByteArray());
-
-            var newMessage = new TestAllTypes();
-            newMessage.MergeFrom(emptyMessage.ToByteArray());
-            Assert.AreEqual(message, newMessage);
-            Assert.AreEqual(message.CalculateSize(), newMessage.CalculateSize());
-        }
-
-        [Test]
-        public void TestMergeMessage()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var emptyMessage = new TestEmptyMessage();
-            var otherEmptyMessage = new TestEmptyMessage();
-            emptyMessage.MergeFrom(message.ToByteArray());
-            otherEmptyMessage.MergeFrom(emptyMessage);
-
-            Assert.AreEqual(message.CalculateSize(), otherEmptyMessage.CalculateSize());
-            Assert.AreEqual(message.ToByteArray(), otherEmptyMessage.ToByteArray());
-        }
-
-        [Test]
-        public void TestEquals()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var emptyMessage = new TestEmptyMessage();
-            var otherEmptyMessage = new TestEmptyMessage();
-            Assert.AreEqual(emptyMessage, otherEmptyMessage);
-            emptyMessage.MergeFrom(message.ToByteArray());
-            Assert.AreNotEqual(emptyMessage.CalculateSize(),
-                               otherEmptyMessage.CalculateSize());
-            Assert.AreNotEqual(emptyMessage, otherEmptyMessage);
-        }
-
-        [Test]
-        public void TestHashCode()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var emptyMessage = new TestEmptyMessage();
-            int hashCode = emptyMessage.GetHashCode();
-            emptyMessage.MergeFrom(message.ToByteArray());
-            Assert.AreNotEqual(hashCode, emptyMessage.GetHashCode());
-        }
-
-        [Test]
-        public void TestClone()
-        {
-            var emptyMessage = new TestEmptyMessage();
-            var otherEmptyMessage = new TestEmptyMessage();
-            otherEmptyMessage = emptyMessage.Clone();
-            Assert.AreEqual(emptyMessage.CalculateSize(), otherEmptyMessage.CalculateSize());
-            Assert.AreEqual(emptyMessage.ToByteArray(), otherEmptyMessage.ToByteArray());
-
-            var message = SampleMessages.CreateFullTestAllTypes();
-            emptyMessage.MergeFrom(message.ToByteArray());
-            otherEmptyMessage = emptyMessage.Clone();
-            Assert.AreEqual(message.CalculateSize(), otherEmptyMessage.CalculateSize());
-            Assert.AreEqual(message.ToByteArray(), otherEmptyMessage.ToByteArray());
-        }
-    }
-}
diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
index 6ca1e1f..f21be7d 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
@@ -42,7 +42,7 @@
         {
             var message = SampleMessages.CreateFullTestAllTypes();
             var any = Any.Pack(message);
-            Assert.AreEqual("type.googleapis.com/protobuf_unittest3.TestAllTypes", any.TypeUrl);
+            Assert.AreEqual("type.googleapis.com/protobuf_unittest.TestAllTypes", any.TypeUrl);
             Assert.AreEqual(message.CalculateSize(), any.Value.Length);
         }
 
@@ -51,7 +51,7 @@
         {
             var message = SampleMessages.CreateFullTestAllTypes();
             var any = Any.Pack(message, "foo.bar/baz");
-            Assert.AreEqual("foo.bar/baz/protobuf_unittest3.TestAllTypes", any.TypeUrl);
+            Assert.AreEqual("foo.bar/baz/protobuf_unittest.TestAllTypes", any.TypeUrl);
             Assert.AreEqual(message.CalculateSize(), any.Value.Length);
         }
 
@@ -60,7 +60,7 @@
         {
             var message = SampleMessages.CreateFullTestAllTypes();
             var any = Any.Pack(message, "foo.bar/baz/");
-            Assert.AreEqual("foo.bar/baz/protobuf_unittest3.TestAllTypes", any.TypeUrl);
+            Assert.AreEqual("foo.bar/baz/protobuf_unittest.TestAllTypes", any.TypeUrl);
             Assert.AreEqual(message.CalculateSize(), any.Value.Length);
         }
 
@@ -91,40 +91,12 @@
         }
 
         [Test]
-        public void TryUnpack_WrongType()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message);
-            Assert.False(any.TryUnpack(out TestOneof unpacked));
-            Assert.Null(unpacked);
-        }
-
-        [Test]
-        public void TryUnpack_RightType()
-        {
-            var message = SampleMessages.CreateFullTestAllTypes();
-            var any = Any.Pack(message);
-            Assert.IsTrue(any.TryUnpack(out TestAllTypes unpacked));
-            Assert.AreEqual(message, unpacked);
-        }
-
-        [Test]
         public void ToString_WithValues()
         {
             var message = SampleMessages.CreateFullTestAllTypes();
             var any = Any.Pack(message);
             var text = any.ToString();
-            Assert.That(text, Does.Contain("\"@value\": \"" + message.ToByteString().ToBase64() + "\""));
-        }
-
-        [Test]
-        [TestCase("proto://foo.bar", "foo.bar")]
-        [TestCase("/foo/bar/baz", "baz")]
-        [TestCase("foobar", "")]
-        public void GetTypeName(string typeUrl, string expectedTypeName)
-        {
-            var any = new Any { TypeUrl = typeUrl };
-            Assert.AreEqual(expectedTypeName, Any.GetTypeName(typeUrl));
+            Assert.That(text, Is.StringContaining("\"@value\": \"" + message.ToByteString().ToBase64() + "\""));
         }
 
         [Test]
diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs
index 1d9908b..89bc827 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs
@@ -46,8 +46,8 @@
             var mask = new FieldMask { Paths = { input } };
             var text = mask.ToString();
             // More specific test below
-            Assert.That(text, Does.Contain("@warning"));
-            Assert.That(text, Does.Contain(input));
+            Assert.That(text, Is.StringContaining("@warning"));
+            Assert.That(text, Is.StringContaining(input));
         }
 
         [Test]
diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
index 8ed5574..5b7185d 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
@@ -417,16 +417,5 @@
             TestWellKnownTypes.Descriptor.Fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.Clear(message);
             Assert.IsNull(message.StringField);
         }
-
-        [Test]
-        public void NaNComparisons()
-        {
-            var message1 = new TestWellKnownTypes { DoubleField = SampleNaNs.Regular };
-            var message2 = new TestWellKnownTypes { DoubleField = SampleNaNs.PayloadFlipped };
-            var message3 = new TestWellKnownTypes { DoubleField = SampleNaNs.Regular };
-
-            EqualityTester.AssertInequality(message1, message2);
-            EqualityTester.AssertEquality(message1, message3);
-        }
     }
 }
diff --git a/csharp/src/Google.Protobuf.Test/packages.config b/csharp/src/Google.Protobuf.Test/packages.config
new file mode 100644
index 0000000..c765399
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Test/packages.config
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="2.6.4" targetFramework="net45" userInstalled="true" />
+  <package id="NUnitTestAdapter" version="2.0.0" targetFramework="net45" userInstalled="true" />
+</packages>
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.sln b/csharp/src/Google.Protobuf.sln
index 443ee3e..72d87f7 100644
--- a/csharp/src/Google.Protobuf.sln
+++ b/csharp/src/Google.Protobuf.sln
@@ -1,43 +1,54 @@
 Microsoft Visual Studio Solution File, Format Version 12.00

-# Visual Studio 15

-VisualStudioVersion = 15.0.26114.2

-MinimumVisualStudioVersion = 10.0.40219.1

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddressBook", "AddressBook\AddressBook.csproj", "{AFB63919-1E05-43B4-802A-8FB8C9B2F463}"

+# Visual Studio 2015

+VisualStudioVersion = 14.0.24720.0

+MinimumVisualStudioVersion = 14.0.24720.0

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf", "Google.Protobuf\Google.Protobuf.csproj", "{6908BDCE-D925-43F3-94AC-A531E6DF2591}"

 EndProject

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf", "Google.Protobuf\Google.Protobuf.csproj", "{9B576380-726D-4142-8238-60A43AB0E35A}"

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.Test", "Google.Protobuf.Test\Google.Protobuf.Test.csproj", "{DD01ED24-3750-4567-9A23-1DB676A15610}"

 EndProject

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.Test", "Google.Protobuf.Test\Google.Protobuf.Test.csproj", "{580EB013-D3C7-4578-B845-015F4A3B0591}"

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddressBook", "AddressBook\AddressBook.csproj", "{A31F5FB2-4FF3-432A-B35B-5CD203606311}"

 EndProject

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.Conformance", "Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj", "{DDDC055B-E185-4181-BAB0-072F0F984569}"

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.JsonDump", "Google.Protobuf.JsonDump\Google.Protobuf.JsonDump.csproj", "{D7282E99-2DC3-405B-946F-177DB2FD2AE2}"

 EndProject

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.JsonDump", "Google.Protobuf.JsonDump\Google.Protobuf.JsonDump.csproj", "{9695E08F-9829-497D-B95C-B38F28D48690}"

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.Conformance", "Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj", "{0607D1B8-80D6-4B35-9857-1263C1B32B94}"

 EndProject

 Global

 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

 		Debug|Any CPU = Debug|Any CPU

 		Release|Any CPU = Release|Any CPU

+		ReleaseSigned|Any CPU = ReleaseSigned|Any CPU

 	EndGlobalSection

 	GlobalSection(ProjectConfigurationPlatforms) = postSolution

-		{AFB63919-1E05-43B4-802A-8FB8C9B2F463}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{AFB63919-1E05-43B4-802A-8FB8C9B2F463}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{AFB63919-1E05-43B4-802A-8FB8C9B2F463}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{AFB63919-1E05-43B4-802A-8FB8C9B2F463}.Release|Any CPU.Build.0 = Release|Any CPU

-		{9B576380-726D-4142-8238-60A43AB0E35A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{9B576380-726D-4142-8238-60A43AB0E35A}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{9B576380-726D-4142-8238-60A43AB0E35A}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{9B576380-726D-4142-8238-60A43AB0E35A}.Release|Any CPU.Build.0 = Release|Any CPU

-		{580EB013-D3C7-4578-B845-015F4A3B0591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{580EB013-D3C7-4578-B845-015F4A3B0591}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{580EB013-D3C7-4578-B845-015F4A3B0591}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{580EB013-D3C7-4578-B845-015F4A3B0591}.Release|Any CPU.Build.0 = Release|Any CPU

-		{DDDC055B-E185-4181-BAB0-072F0F984569}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{DDDC055B-E185-4181-BAB0-072F0F984569}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{DDDC055B-E185-4181-BAB0-072F0F984569}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{DDDC055B-E185-4181-BAB0-072F0F984569}.Release|Any CPU.Build.0 = Release|Any CPU

-		{9695E08F-9829-497D-B95C-B38F28D48690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{9695E08F-9829-497D-B95C-B38F28D48690}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{9695E08F-9829-497D-B95C-B38F28D48690}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{9695E08F-9829-497D-B95C-B38F28D48690}.Release|Any CPU.Build.0 = Release|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU

+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU

+		{DD01ED24-3750-4567-9A23-1DB676A15610}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.Build.0 = Debug|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.ActiveCfg = Release|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.Build.0 = Release|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.ReleaseSigned|Any CPU.ActiveCfg = Release|Any CPU

+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.ReleaseSigned|Any CPU.Build.0 = Release|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.Build.0 = Release|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.ReleaseSigned|Any CPU.ActiveCfg = Release|Any CPU

+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.ReleaseSigned|Any CPU.Build.0 = Release|Any CPU

+		{0607D1B8-80D6-4B35-9857-1263C1B32B94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{0607D1B8-80D6-4B35-9857-1263C1B32B94}.Debug|Any CPU.Build.0 = Debug|Any CPU

+		{0607D1B8-80D6-4B35-9857-1263C1B32B94}.Release|Any CPU.ActiveCfg = Release|Any CPU

+		{0607D1B8-80D6-4B35-9857-1263C1B32B94}.Release|Any CPU.Build.0 = Release|Any CPU

+		{0607D1B8-80D6-4B35-9857-1263C1B32B94}.ReleaseSigned|Any CPU.ActiveCfg = Release|Any CPU

+		{0607D1B8-80D6-4B35-9857-1263C1B32B94}.ReleaseSigned|Any CPU.Build.0 = Release|Any CPU

 	EndGlobalSection

 	GlobalSection(SolutionProperties) = preSolution

 		HideSolutionNode = FALSE

diff --git a/csharp/src/Google.Protobuf/ByteString.cs b/csharp/src/Google.Protobuf/ByteString.cs
old mode 100755
new mode 100644
index 4abdb71..dd7f22d
--- a/csharp/src/Google.Protobuf/ByteString.cs
+++ b/csharp/src/Google.Protobuf/ByteString.cs
@@ -35,13 +35,6 @@
 using System.Collections.Generic;

 using System.IO;

 using System.Text;

-#if !NET35

-using System.Threading;

-using System.Threading.Tasks;

-#endif

-#if NET35

-using Google.Protobuf.Compatibility;

-#endif

 

 namespace Google.Protobuf

 {

@@ -149,55 +142,6 @@
         }

 

         /// <summary>

-        /// Constructs a <see cref="ByteString"/> from data in the given stream, synchronously.

-        /// </summary>

-        /// <remarks>If successful, <paramref name="stream"/> will be read completely, from the position

-        /// at the start of the call.</remarks>

-        /// <param name="stream">The stream to copy into a ByteString.</param>

-        /// <returns>A ByteString with content read from the given stream.</returns>

-        public static ByteString FromStream(Stream stream)

-        {

-            ProtoPreconditions.CheckNotNull(stream, nameof(stream));

-            int capacity = stream.CanSeek ? checked((int) (stream.Length - stream.Position)) : 0;

-            var memoryStream = new MemoryStream(capacity);

-            stream.CopyTo(memoryStream);

-#if NETSTANDARD1_0

-            byte[] bytes = memoryStream.ToArray();

-#else

-            // Avoid an extra copy if we can.

-            byte[] bytes = memoryStream.Length == memoryStream.Capacity ? memoryStream.GetBuffer() : memoryStream.ToArray();

-#endif

-            return AttachBytes(bytes);

-        }

-

-#if !NET35

-        /// <summary>

-        /// Constructs a <see cref="ByteString"/> from data in the given stream, asynchronously.

-        /// </summary>

-        /// <remarks>If successful, <paramref name="stream"/> will be read completely, from the position

-        /// at the start of the call.</remarks>

-        /// <param name="stream">The stream to copy into a ByteString.</param>

-        /// <param name="cancellationToken">The cancellation token to use when reading from the stream, if any.</param>

-        /// <returns>A ByteString with content read from the given stream.</returns>

-        public async static Task<ByteString> FromStreamAsync(Stream stream, CancellationToken cancellationToken = default(CancellationToken))

-        {

-            ProtoPreconditions.CheckNotNull(stream, nameof(stream));

-            int capacity = stream.CanSeek ? checked((int) (stream.Length - stream.Position)) : 0;

-            var memoryStream = new MemoryStream(capacity);

-            // We have to specify the buffer size here, as there's no overload accepting the cancellation token

-            // alone. But it's documented to use 81920 by default if not specified.

-            await stream.CopyToAsync(memoryStream, 81920, cancellationToken);

-#if NETSTANDARD1_0

-            byte[] bytes = memoryStream.ToArray();

-#else

-            // Avoid an extra copy if we can.

-            byte[] bytes = memoryStream.Length == memoryStream.Capacity ? memoryStream.GetBuffer() : memoryStream.ToArray();

-#endif

-            return AttachBytes(bytes);

-        }

-#endif

-

-        /// <summary>

         /// Constructs a <see cref="ByteString" /> from the given array. The contents

         /// are copied, so further modifications to the array will not

         /// be reflected in the returned ByteString.

@@ -359,7 +303,7 @@
             int ret = 23;

             foreach (byte b in bytes)

             {

-                ret = (ret * 31) + b;

+                ret = (ret << 8) | b;

             }

             return ret;

         }

diff --git a/csharp/src/Google.Protobuf/CodedInputStream.cs b/csharp/src/Google.Protobuf/CodedInputStream.cs
index 24d436c..ce6856d 100644
--- a/csharp/src/Google.Protobuf/CodedInputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedInputStream.cs
@@ -121,7 +121,7 @@
         /// <summary>

         /// Creates a new CodedInputStream reading data from the given byte array.

         /// </summary>

-        public CodedInputStream(byte[] buffer) : this(null, ProtoPreconditions.CheckNotNull(buffer, "buffer"), 0, buffer.Length, true)

+        public CodedInputStream(byte[] buffer) : this(null, ProtoPreconditions.CheckNotNull(buffer, "buffer"), 0, buffer.Length)

         {            

         }

 

@@ -129,7 +129,7 @@
         /// Creates a new <see cref="CodedInputStream"/> that reads from the given byte array slice.

         /// </summary>

         public CodedInputStream(byte[] buffer, int offset, int length)

-            : this(null, ProtoPreconditions.CheckNotNull(buffer, "buffer"), offset, offset + length, true)

+            : this(null, ProtoPreconditions.CheckNotNull(buffer, "buffer"), offset, offset + length)

         {            

             if (offset < 0 || offset > buffer.Length)

             {

@@ -158,15 +158,16 @@
         /// <c cref="CodedInputStream"/> is disposed; <c>false</c> to dispose of the given stream when the

         /// returned object is disposed.</param>

         public CodedInputStream(Stream input, bool leaveOpen)

-            : this(ProtoPreconditions.CheckNotNull(input, "input"), new byte[BufferSize], 0, 0, leaveOpen)

+            : this(ProtoPreconditions.CheckNotNull(input, "input"), new byte[BufferSize], 0, 0)

         {

+            this.leaveOpen = leaveOpen;

         }

         

         /// <summary>

         /// Creates a new CodedInputStream reading data from the given

         /// stream and buffer, using the default limits.

         /// </summary>

-        internal CodedInputStream(Stream input, byte[] buffer, int bufferPos, int bufferSize, bool leaveOpen)

+        internal CodedInputStream(Stream input, byte[] buffer, int bufferPos, int bufferSize)

         {

             this.input = input;

             this.buffer = buffer;

@@ -174,7 +175,6 @@
             this.bufferSize = bufferSize;

             this.sizeLimit = DefaultSizeLimit;

             this.recursionLimit = DefaultRecursionLimit;

-            this.leaveOpen = leaveOpen;

         }

 

         /// <summary>

@@ -185,8 +185,8 @@
         /// This chains to the version with the default limits instead of vice versa to avoid

         /// having to check that the default values are valid every time.

         /// </remarks>

-        internal CodedInputStream(Stream input, byte[] buffer, int bufferPos, int bufferSize, int sizeLimit, int recursionLimit, bool leaveOpen)

-            : this(input, buffer, bufferPos, bufferSize, leaveOpen)

+        internal CodedInputStream(Stream input, byte[] buffer, int bufferPos, int bufferSize, int sizeLimit, int recursionLimit)

+            : this(input, buffer, bufferPos, bufferSize)

         {

             if (sizeLimit <= 0)

             {

@@ -217,8 +217,7 @@
         /// and recursion limits.</returns>

         public static CodedInputStream CreateWithLimits(Stream input, int sizeLimit, int recursionLimit)

         {

-            // Note: we may want an overload accepting leaveOpen

-            return new CodedInputStream(input, new byte[BufferSize], 0, 0, sizeLimit, recursionLimit, false);

+            return new CodedInputStream(input, new byte[BufferSize], 0, 0, sizeLimit, recursionLimit);

         }

 

         /// <summary>

@@ -373,9 +372,9 @@
 

                 lastTag = ReadRawVarint32();

             }

-            if (WireFormat.GetTagFieldNumber(lastTag) == 0)

+            if (lastTag == 0)

             {

-                // If we actually read a tag with a field of 0, that's not a valid tag.

+                // If we actually read zero, that's not a valid tag.

                 throw InvalidProtocolBufferException.InvalidTag();

             }

             return lastTag;

@@ -424,10 +423,7 @@
             }

         }

 

-        /// <summary>

-        /// Skip a group.

-        /// </summary>

-        internal void SkipGroup(uint startGroupTag)

+        private void SkipGroup(uint startGroupTag)

         {

             // Note: Currently we expect this to be the way that groups are read. We could put the recursion

             // depth changes into the ReadTag method instead, potentially...

@@ -616,7 +612,9 @@
         }

 

         /// <summary>

-        /// Reads an enum field value from the stream.

+        /// Reads an enum field value from the stream. If the enum is valid for type T,

+        /// then the ref value is set and it returns true.  Otherwise the unknown output

+        /// value is set and this method returns false.

         /// </summary>   

         public int ReadEnum()

         {

@@ -1273,6 +1271,7 @@
                 }

             }

         }

+

         #endregion

     }

 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Collections/Lists.cs b/csharp/src/Google.Protobuf/Collections/Lists.cs
deleted file mode 100644
index 860795c..0000000
--- a/csharp/src/Google.Protobuf/Collections/Lists.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-
-namespace Google.Protobuf.Collections
-{
-    /// <summary>
-    /// Utility to compare if two Lists are the same, and the hash code
-    /// of a List.
-    /// </summary>
-    public static class Lists
-    {
-        /// <summary>
-        /// Checks if two lists are equal.
-        /// </summary>
-        public static bool Equals<T>(List<T> left, List<T> right)
-        {
-            if (left == right)
-            {
-                return true;
-            }
-            if (left == null || right == null)
-            {
-                return false;
-            }
-            if (left.Count != right.Count)
-            {
-                return false;
-            }
-            IEqualityComparer<T> comparer = EqualityComparer<T>.Default;
-            for (int i = 0; i < left.Count; i++)
-            {
-                if (!comparer.Equals(left[i], right[i]))
-                {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        /// <summary>
-        /// Gets the list's hash code.
-        /// </summary>
-        public static int GetHashCode<T>(List<T> list)
-        {
-            if (list == null)
-            {
-                return 0;
-            }
-            int hash = 31;
-            foreach (T element in list)
-            {
-                hash = hash * 29 + element.GetHashCode();
-            }
-            return hash;
-        }
-    }
-}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Collections/MapField.cs b/csharp/src/Google.Protobuf/Collections/MapField.cs
index dbbcc14..993a89d 100644
--- a/csharp/src/Google.Protobuf/Collections/MapField.cs
+++ b/csharp/src/Google.Protobuf/Collections/MapField.cs
@@ -30,13 +30,14 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #endregion
 
-using Google.Protobuf.Compatibility;
 using Google.Protobuf.Reflection;
 using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
+using System.Text;
+using Google.Protobuf.Compatibility;
 
 namespace Google.Protobuf.Collections
 {
@@ -47,6 +48,9 @@
     /// <typeparam name="TValue">Value type in the map. Must be a type supported by Protocol Buffers.</typeparam>
     /// <remarks>
     /// <para>
+    /// This implementation preserves insertion order for simplicity of testing
+    /// code using maps fields. Overwriting an existing entry does not change the
+    /// position of that entry within the map. Equality is not order-sensitive.
     /// For string keys, the equality comparison is provided by <see cref="StringComparer.Ordinal" />.
     /// </para>
     /// <para>
@@ -61,22 +65,12 @@
     /// supported by Protocol Buffers (e.g. using a key type of <code>byte</code>) but nor does it guarantee
     /// that all operations will work in such cases.
     /// </para>
-    /// <para>
-    /// The order in which entries are returned when iterating over this object is undefined, and may change
-    /// in future versions.
-    /// </para>
     /// </remarks>
     public sealed class MapField<TKey, TValue> : IDeepCloneable<MapField<TKey, TValue>>, IDictionary<TKey, TValue>, IEquatable<MapField<TKey, TValue>>, IDictionary
-#if !NET35
-        , IReadOnlyDictionary<TKey, TValue>
-#endif
     {
-        private static readonly EqualityComparer<TValue> ValueEqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<TValue>();
-        private static readonly EqualityComparer<TKey> KeyEqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<TKey>();
-
         // TODO: Don't create the map/list until we have an entry. (Assume many maps will be empty.)
         private readonly Dictionary<TKey, LinkedListNode<KeyValuePair<TKey, TValue>>> map =
-            new Dictionary<TKey, LinkedListNode<KeyValuePair<TKey, TValue>>>(KeyEqualityComparer);
+            new Dictionary<TKey, LinkedListNode<KeyValuePair<TKey, TValue>>>();
         private readonly LinkedList<KeyValuePair<TKey, TValue>> list = new LinkedList<KeyValuePair<TKey, TValue>>();
 
         /// <summary>
@@ -118,7 +112,7 @@
             // Validation of arguments happens in ContainsKey and the indexer
             if (ContainsKey(key))
             {
-                throw new ArgumentException("Key already exists in map", nameof(key));
+                throw new ArgumentException("Key already exists in map", "key");
             }
             this[key] = value;
         }
@@ -130,12 +124,15 @@
         /// <returns><c>true</c> if the map contains the given key; <c>false</c> otherwise.</returns>
         public bool ContainsKey(TKey key)
         {
-            ProtoPreconditions.CheckNotNullUnconstrained(key, nameof(key));
+            ProtoPreconditions.CheckNotNullUnconstrained(key, "key");
             return map.ContainsKey(key);
         }
 
-        private bool ContainsValue(TValue value) =>
-            list.Any(pair => ValueEqualityComparer.Equals(pair.Value, value));
+        private bool ContainsValue(TValue value)
+        {
+            var comparer = EqualityComparer<TValue>.Default;
+            return list.Any(pair => comparer.Equals(pair.Value, value));
+        }
 
         /// <summary>
         /// Removes the entry identified by the given key from the map.
@@ -144,7 +141,7 @@
         /// <returns><c>true</c> if the map contained the given key before the entry was removed; <c>false</c> otherwise.</returns>
         public bool Remove(TKey key)
         {
-            ProtoPreconditions.CheckNotNullUnconstrained(key, nameof(key));
+            ProtoPreconditions.CheckNotNullUnconstrained(key, "key");
             LinkedListNode<KeyValuePair<TKey, TValue>> node;
             if (map.TryGetValue(key, out node))
             {
@@ -192,7 +189,7 @@
         {
             get
             {
-                ProtoPreconditions.CheckNotNullUnconstrained(key, nameof(key));
+                ProtoPreconditions.CheckNotNullUnconstrained(key, "key");
                 TValue value;
                 if (TryGetValue(key, out value))
                 {
@@ -202,11 +199,11 @@
             }
             set
             {
-                ProtoPreconditions.CheckNotNullUnconstrained(key, nameof(key));
+                ProtoPreconditions.CheckNotNullUnconstrained(key, "key");
                 // value == null check here is redundant, but avoids boxing.
                 if (value == null)
                 {
-                    ProtoPreconditions.CheckNotNullUnconstrained(value, nameof(value));
+                    ProtoPreconditions.CheckNotNullUnconstrained(value, "value");
                 }
                 LinkedListNode<KeyValuePair<TKey, TValue>> node;
                 var pair = new KeyValuePair<TKey, TValue>(key, value);
@@ -238,7 +235,7 @@
         /// <param name="entries">The entries to add to the map.</param>
         public void Add(IDictionary<TKey, TValue> entries)
         {
-            ProtoPreconditions.CheckNotNull(entries, nameof(entries));
+            ProtoPreconditions.CheckNotNull(entries, "entries");
             foreach (var pair in entries)
             {
                 Add(pair.Key, pair.Value);
@@ -293,7 +290,8 @@
         bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)
         {
             TValue value;
-            return TryGetValue(item.Key, out value) && ValueEqualityComparer.Equals(item.Value, value);
+            return TryGetValue(item.Key, out value)
+                && EqualityComparer<TValue>.Default.Equals(item.Value, value);
         }
 
         /// <summary>
@@ -316,7 +314,7 @@
         {
             if (item.Key == null)
             {
-                throw new ArgumentException("Key is null", nameof(item));
+                throw new ArgumentException("Key is null", "item");
             }
             LinkedListNode<KeyValuePair<TKey, TValue>> node;
             if (map.TryGetValue(item.Key, out node) &&
@@ -362,12 +360,11 @@
         /// </returns>
         public override int GetHashCode()
         {
-            var keyComparer = KeyEqualityComparer;
-            var valueComparer = ValueEqualityComparer;
+            var valueComparer = EqualityComparer<TValue>.Default;
             int hash = 0;
             foreach (var pair in list)
             {
-                hash ^= keyComparer.GetHashCode(pair.Key) * 31 + valueComparer.GetHashCode(pair.Value);
+                hash ^= pair.Key.GetHashCode() * 31 + valueComparer.GetHashCode(pair.Value);
             }
             return hash;
         }
@@ -394,7 +391,7 @@
             {
                 return false;
             }
-            var valueComparer = ValueEqualityComparer;
+            var valueComparer = EqualityComparer<TValue>.Default;
             foreach (var pair in this)
             {
                 TValue value;
@@ -505,7 +502,7 @@
 
         void IDictionary.Remove(object key)
         {
-            ProtoPreconditions.CheckNotNull(key, nameof(key));
+            ProtoPreconditions.CheckNotNull(key, "key");
             if (!(key is TKey))
             {
                 return;
@@ -534,7 +531,7 @@
         {
             get
             {
-                ProtoPreconditions.CheckNotNull(key, nameof(key));
+                ProtoPreconditions.CheckNotNull(key, "key");
                 if (!(key is TKey))
                 {
                     return null;
@@ -551,14 +548,6 @@
         }
         #endregion
 
-        #region IReadOnlyDictionary explicit interface implementation
-#if !NET35
-        IEnumerable<TKey> IReadOnlyDictionary<TKey, TValue>.Keys => Keys;
-
-        IEnumerable<TValue> IReadOnlyDictionary<TKey, TValue>.Values => Values;
-#endif
-        #endregion
-
         private class DictionaryEnumerator : IDictionaryEnumerator
         {
             private readonly IEnumerator<KeyValuePair<TKey, TValue>> enumerator;
@@ -724,11 +713,11 @@
             {
                 if (arrayIndex < 0)
                 {
-                    throw new ArgumentOutOfRangeException(nameof(arrayIndex));
+                    throw new ArgumentOutOfRangeException("arrayIndex");
                 }
-                if (arrayIndex + Count > array.Length)
+                if (arrayIndex + Count  >= array.Length)
                 {
-                    throw new ArgumentException("Not enough space in the array", nameof(array));
+                    throw new ArgumentException("Not enough space in the array", "array");
                 }
                 foreach (var item in this)
                 {
@@ -755,11 +744,11 @@
             {
                 if (index < 0)
                 {
-                    throw new ArgumentOutOfRangeException(nameof(index));
+                    throw new ArgumentOutOfRangeException("index");
                 }
-                if (index + Count > array.Length)
+                if (index + Count >= array.Length)
                 {
-                    throw new ArgumentException("Not enough space in the array", nameof(array));
+                    throw new ArgumentException("Not enough space in the array", "array");
                 }
                 foreach (var item in this)
                 {
diff --git a/csharp/src/Google.Protobuf/Collections/ProtobufEqualityComparers.cs b/csharp/src/Google.Protobuf/Collections/ProtobufEqualityComparers.cs
deleted file mode 100644
index 13ef60f..0000000
--- a/csharp/src/Google.Protobuf/Collections/ProtobufEqualityComparers.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using System;
-using System.Collections.Generic;
-
-namespace Google.Protobuf.Collections
-{
-    /// <summary>
-    /// Provides a central place to implement equality comparisons, primarily for bitwise float/double equality.
-    /// </summary>
-    public static class ProtobufEqualityComparers
-    {
-        /// <summary>
-        /// Returns an equality comparer for <typeparamref name="T"/> suitable for Protobuf equality comparisons.
-        /// This is usually just the default equality comparer for the type, but floating point numbers are compared
-        /// bitwise.
-        /// </summary>
-        /// <typeparam name="T">The type of equality comparer to return.</typeparam>
-        /// <returns>The equality comparer.</returns>
-        public static EqualityComparer<T> GetEqualityComparer<T>()
-        {
-            return typeof(T) == typeof(double) ? (EqualityComparer<T>) (object) BitwiseDoubleEqualityComparer
-                : typeof(T) == typeof(float) ? (EqualityComparer<T>) (object) BitwiseSingleEqualityComparer
-                : typeof(T) == typeof(double?) ? (EqualityComparer<T>) (object) BitwiseNullableDoubleEqualityComparer
-                : typeof(T) == typeof(float?) ? (EqualityComparer<T>) (object) BitwiseNullableSingleEqualityComparer
-                : EqualityComparer<T>.Default;
-        }
-
-        /// <summary>
-        /// Returns an equality comparer suitable for comparing 64-bit floating point values, by bitwise comparison.
-        /// (NaN values are considered equal, but only when they have the same representation.)
-        /// </summary>
-        public static EqualityComparer<double> BitwiseDoubleEqualityComparer { get; } = new BitwiseDoubleEqualityComparerImpl();
-
-        /// <summary>
-        /// Returns an equality comparer suitable for comparing 32-bit floating point values, by bitwise comparison.
-        /// (NaN values are considered equal, but only when they have the same representation.)
-        /// </summary>
-        public static EqualityComparer<float> BitwiseSingleEqualityComparer { get; } = new BitwiseSingleEqualityComparerImpl();
-
-        /// <summary>
-        /// Returns an equality comparer suitable for comparing nullable 64-bit floating point values, by bitwise comparison.
-        /// (NaN values are considered equal, but only when they have the same representation.)
-        /// </summary>
-        public static EqualityComparer<double?> BitwiseNullableDoubleEqualityComparer { get; } = new BitwiseNullableDoubleEqualityComparerImpl();
-
-        /// <summary>
-        /// Returns an equality comparer suitable for comparing nullable 32-bit floating point values, by bitwise comparison.
-        /// (NaN values are considered equal, but only when they have the same representation.)
-        /// </summary>
-        public static EqualityComparer<float?> BitwiseNullableSingleEqualityComparer { get; } = new BitwiseNullableSingleEqualityComparerImpl();
-
-        private class BitwiseDoubleEqualityComparerImpl : EqualityComparer<double>
-        {
-            public override bool Equals(double x, double y) =>
-                BitConverter.DoubleToInt64Bits(x) == BitConverter.DoubleToInt64Bits(y);
-
-            public override int GetHashCode(double obj) =>
-                BitConverter.DoubleToInt64Bits(obj).GetHashCode();
-        }
-
-        private class BitwiseSingleEqualityComparerImpl : EqualityComparer<float>
-        {
-            // Just promote values to double and use BitConverter.DoubleToInt64Bits,
-            // as there's no BitConverter.SingleToInt32Bits, unfortunately.
-
-            public override bool Equals(float x, float y) =>
-                BitConverter.DoubleToInt64Bits(x) == BitConverter.DoubleToInt64Bits(y);
-
-            public override int GetHashCode(float obj) =>
-                BitConverter.DoubleToInt64Bits(obj).GetHashCode();
-        }
-
-        private class BitwiseNullableDoubleEqualityComparerImpl : EqualityComparer<double?>
-        {
-            public override bool Equals(double? x, double? y) =>
-                x == null && y == null ? true
-                : x == null || y == null ? false
-                : BitwiseDoubleEqualityComparer.Equals(x.Value, y.Value);
-
-            // The hash code for null is just a constant which is at least *unlikely* to be used
-            // elsewhere. (Compared with 0, say.)
-            public override int GetHashCode(double? obj) =>
-                obj == null ? 293864 : BitwiseDoubleEqualityComparer.GetHashCode(obj.Value);
-        }
-
-        private class BitwiseNullableSingleEqualityComparerImpl : EqualityComparer<float?>
-        {
-            public override bool Equals(float? x, float? y) =>
-                x == null && y == null ? true
-                : x == null || y == null ? false
-                : BitwiseSingleEqualityComparer.Equals(x.Value, y.Value);
-
-            // The hash code for null is just a constant which is at least *unlikely* to be used
-            // elsewhere. (Compared with 0, say.)
-            public override int GetHashCode(float? obj) =>
-                obj == null ? 293864 : BitwiseSingleEqualityComparer.GetHashCode(obj.Value);
-        }
-    }
-}
diff --git a/csharp/src/Google.Protobuf/Collections/RepeatedField.cs b/csharp/src/Google.Protobuf/Collections/RepeatedField.cs
old mode 100755
new mode 100644
index c18b63e..d1db856
--- a/csharp/src/Google.Protobuf/Collections/RepeatedField.cs
+++ b/csharp/src/Google.Protobuf/Collections/RepeatedField.cs
@@ -34,6 +34,7 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
+using System.Text;
 
 namespace Google.Protobuf.Collections
 {
@@ -47,11 +48,7 @@
     /// </remarks>
     /// <typeparam name="T">The element type of the repeated field.</typeparam>
     public sealed class RepeatedField<T> : IList<T>, IList, IDeepCloneable<RepeatedField<T>>, IEquatable<RepeatedField<T>>
-#if !NET35
-        , IReadOnlyList<T>
-#endif
     {
-        private static readonly EqualityComparer<T> EqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<T>();
         private static readonly T[] EmptyArray = new T[0];
         private const int MinArraySize = 8;
 
@@ -230,7 +227,10 @@
         /// <param name="item">The item to add.</param>
         public void Add(T item)
         {
-            ProtoPreconditions.CheckNotNullUnconstrained(item, nameof(item));
+            if (item == null)
+            {
+                throw new ArgumentNullException("item");
+            }
             EnsureSize(count + 1);
             array[count++] = item;
         }
@@ -285,82 +285,46 @@
         /// <summary>
         /// Gets the number of elements contained in the collection.
         /// </summary>
-        public int Count => count;
+        public int Count { get { return count; } }
 
         /// <summary>
         /// Gets a value indicating whether the collection is read-only.
         /// </summary>
-        public bool IsReadOnly => false;
+        public bool IsReadOnly { get { return false; } }
+
+        // TODO: Remove this overload and just handle it in the one below, at execution time?
 
         /// <summary>
         /// Adds all of the specified values into this collection.
         /// </summary>
         /// <param name="values">The values to add to this collection.</param>
-        public void AddRange(IEnumerable<T> values)
+        public void Add(RepeatedField<T> values)
         {
-            ProtoPreconditions.CheckNotNull(values, nameof(values));
-
-            // Optimization 1: If the collection we're adding is already a RepeatedField<T>,
-            // we know the values are valid.
-            var otherRepeatedField = values as RepeatedField<T>;
-            if (otherRepeatedField != null)
+            if (values == null)
             {
-                EnsureSize(count + otherRepeatedField.count);
-                Array.Copy(otherRepeatedField.array, 0, array, count, otherRepeatedField.count);
-                count += otherRepeatedField.count;
-                return;
+                throw new ArgumentNullException("values");
             }
-
-            // Optimization 2: The collection is an ICollection, so we can expand
-            // just once and ask the collection to copy itself into the array.
-            var collection = values as ICollection;
-            if (collection != null)
-            {
-                var extraCount = collection.Count;
-                // For reference types and nullable value types, we need to check that there are no nulls
-                // present. (This isn't a thread-safe approach, but we don't advertise this is thread-safe.)
-                // We expect the JITter to optimize this test to true/false, so it's effectively conditional
-                // specialization.
-                if (default(T) == null)
-                {
-                    // TODO: Measure whether iterating once to check and then letting the collection copy
-                    // itself is faster or slower than iterating and adding as we go. For large
-                    // collections this will not be great in terms of cache usage... but the optimized
-                    // copy may be significantly faster than doing it one at a time.
-                    foreach (var item in collection)
-                    {
-                        if (item == null)
-                        {
-                            throw new ArgumentException("Sequence contained null element", nameof(values));
-                        }
-                    }
-                }
-                EnsureSize(count + extraCount);
-                collection.CopyTo(array, count);
-                count += extraCount;
-                return;
-            }
-
-            // We *could* check for ICollection<T> as well, but very very few collections implement
-            // ICollection<T> but not ICollection. (HashSet<T> does, for one...)
-
-            // Fall back to a slower path of adding items one at a time.
-            foreach (T item in values)
-            {
-                Add(item);
-            }
+            EnsureSize(count + values.count);
+            // We know that all the values will be valid, because it's a RepeatedField.
+            Array.Copy(values.array, 0, array, count, values.count);
+            count += values.count;
         }
 
         /// <summary>
-        /// Adds all of the specified values into this collection. This method is present to
-        /// allow repeated fields to be constructed from queries within collection initializers.
-        /// Within non-collection-initializer code, consider using the equivalent <see cref="AddRange"/>
-        /// method instead for clarity.
+        /// Adds all of the specified values into this collection.
         /// </summary>
         /// <param name="values">The values to add to this collection.</param>
         public void Add(IEnumerable<T> values)
         {
-            AddRange(values);
+            if (values == null)
+            {
+                throw new ArgumentNullException("values");
+            }
+            // TODO: Check for ICollection and get the Count, to optimize?
+            foreach (T item in values)
+            {
+                Add(item);
+            }
         }
 
         /// <summary>
@@ -435,7 +399,7 @@
             {
                 return false;
             }
-            EqualityComparer<T> comparer = EqualityComparer;
+            EqualityComparer<T> comparer = EqualityComparer<T>.Default;
             for (int i = 0; i < count; i++)
             {
                 if (!comparer.Equals(array[i], other.array[i]))
@@ -454,8 +418,11 @@
         /// <returns>The zero-based index of the item, or -1 if it is not found.</returns>
         public int IndexOf(T item)
         {
-            ProtoPreconditions.CheckNotNullUnconstrained(item, nameof(item));
-            EqualityComparer<T> comparer = EqualityComparer;
+            if (item == null)
+            {
+                throw new ArgumentNullException("item");
+            }
+            EqualityComparer<T> comparer = EqualityComparer<T>.Default;
             for (int i = 0; i < count; i++)
             {
                 if (comparer.Equals(array[i], item))
@@ -473,10 +440,13 @@
         /// <param name="item">The item to insert.</param>
         public void Insert(int index, T item)
         {
-            ProtoPreconditions.CheckNotNullUnconstrained(item, nameof(item));
+            if (item == null)
+            {
+                throw new ArgumentNullException("item");
+            }
             if (index < 0 || index > count)
             {
-                throw new ArgumentOutOfRangeException(nameof(index));
+                throw new ArgumentOutOfRangeException("index");
             }
             EnsureSize(count + 1);
             Array.Copy(array, index, array, index + 1, count - index);
@@ -492,7 +462,7 @@
         {
             if (index < 0 || index >= count)
             {
-                throw new ArgumentOutOfRangeException(nameof(index));
+                throw new ArgumentOutOfRangeException("index");
             }
             Array.Copy(array, index + 1, array, index, count - index - 1);
             count--;
@@ -524,7 +494,7 @@
             {
                 if (index < 0 || index >= count)
                 {
-                    throw new ArgumentOutOfRangeException(nameof(index));
+                    throw new ArgumentOutOfRangeException("index");
                 }
                 return array[index];
             }
@@ -532,24 +502,27 @@
             {
                 if (index < 0 || index >= count)
                 {
-                    throw new ArgumentOutOfRangeException(nameof(index));
+                    throw new ArgumentOutOfRangeException("index");
                 }
-                ProtoPreconditions.CheckNotNullUnconstrained(value, nameof(value));
+                if (value == null)
+                {
+                    throw new ArgumentNullException("value");
+                }
                 array[index] = value;
             }
         }
 
         #region Explicit interface implementation for IList and ICollection.
-        bool IList.IsFixedSize => false;
+        bool IList.IsFixedSize { get { return false; } }
 
         void ICollection.CopyTo(Array array, int index)
         {
             Array.Copy(this.array, 0, array, index, count);
         }
 
-        bool ICollection.IsSynchronized => false;
+        bool ICollection.IsSynchronized { get { return false; } }
 
-        object ICollection.SyncRoot => this;
+        object ICollection.SyncRoot { get { return this; } }
 
         object IList.this[int index]
         {
diff --git a/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs
old mode 100755
new mode 100644
index 95a02c7..8a6fefa
--- a/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs
+++ b/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs
@@ -47,11 +47,7 @@
         /// </summary>
         internal static MethodInfo GetGetMethod(this PropertyInfo target)
         {
-#if NET35
-            var method = target.GetGetMethod();
-#else
             var method = target.GetMethod;
-#endif
             return method != null && method.IsPublic ? method : null;
         }
 
@@ -61,11 +57,7 @@
         /// </summary>
         internal static MethodInfo GetSetMethod(this PropertyInfo target)
         {
-#if NET35
-            var method = target.GetSetMethod();
-#else
             var method = target.SetMethod;
-#endif
             return method != null && method.IsPublic ? method : null;
         }
     }
diff --git a/csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs
deleted file mode 100755
index bf4bf22..0000000
--- a/csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-#if NET35
-using System;
-using System.IO;
-
-namespace Google.Protobuf.Compatibility
-{
-    /// <summary>
-    /// Extension methods for <see cref="Stream"/> in order to provide
-    /// backwards compatibility with .NET 3.5
-    /// </summary>
-    public static class StreamExtensions
-    {
-        // 81920 seems to be the default buffer size used in .NET 4.5.1
-        private const int BUFFER_SIZE = 81920;
-
-        /// <summary>
-        /// Write the contents of the current stream to the destination stream
-        /// </summary>
-        public static void CopyTo(this Stream source, Stream destination)
-        {
-            if (destination == null)
-            {
-                throw new ArgumentNullException(nameof(destination));
-            }
-
-            byte[] buffer = new byte[BUFFER_SIZE];
-            int numBytesRead;
-            while ((numBytesRead = source.Read(buffer, 0, buffer.Length)) > 0) {
-                destination.Write(buffer, 0, numBytesRead);
-            }
-        }
-    }
-}
-#endif
diff --git a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs
old mode 100755
new mode 100644
index 2f23713..762a29e
--- a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs
+++ b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs
@@ -33,7 +33,6 @@
 using System;
 using System.Reflection;
 
-#if !NET35
 namespace Google.Protobuf.Compatibility
 {
     /// <summary>
@@ -47,6 +46,15 @@
     internal static class TypeExtensions
     {
         /// <summary>
+        /// Returns true if the target type is a value type, including a nullable value type or an enum, or false
+        /// if it's a reference type (class, delegate, interface - including System.ValueType and System.Enum).
+        /// </summary>
+        internal static bool IsValueType(this Type target)
+        {
+            return target.GetTypeInfo().IsValueType;
+        }
+
+        /// <summary>
         /// See https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom
         /// </summary>
         internal static bool IsAssignableFrom(this Type target, Type c)
@@ -103,4 +111,3 @@
         }
     }
 }
-#endif
diff --git a/csharp/src/Google.Protobuf/FieldCodec.cs b/csharp/src/Google.Protobuf/FieldCodec.cs
index a11f242..9831308 100644
--- a/csharp/src/Google.Protobuf/FieldCodec.cs
+++ b/csharp/src/Google.Protobuf/FieldCodec.cs
@@ -30,7 +30,6 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #endregion
 
-using Google.Protobuf.Collections;
 using Google.Protobuf.Compatibility;
 using Google.Protobuf.WellKnownTypes;
 using System;
@@ -347,10 +346,8 @@
     /// </remarks>
     public sealed class FieldCodec<T>
     {
-        private static readonly EqualityComparer<T> EqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<T>();
         private static readonly T DefaultDefault;
-        // Only non-nullable value types support packing. This is the simplest way of detecting that.
-        private static readonly bool TypeSupportsPacking = default(T) != null;
+        private static readonly bool TypeSupportsPacking = typeof(T).IsValueType() && Nullable.GetUnderlyingType(typeof(T)) == null;
 
         static FieldCodec()
         {
@@ -471,6 +468,6 @@
         /// </summary>
         public int CalculateSizeWithTag(T value) => IsDefault(value) ? 0 : ValueSizeCalculator(value) + tagSize;
 
-        private bool IsDefault(T value) => EqualityComparer.Equals(value, DefaultValue);
+        private bool IsDefault(T value) => EqualityComparer<T>.Default.Equals(value, DefaultValue);
     }
 }
diff --git a/csharp/src/Google.Protobuf/Google.Protobuf.csproj b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
index 6e4e1e2..5557612 100644
--- a/csharp/src/Google.Protobuf/Google.Protobuf.csproj
+++ b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
@@ -1,33 +1,168 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <Description>C# runtime library for Protocol Buffers - Google's data interchange format.</Description>
-    <Copyright>Copyright 2015, Google Inc.</Copyright>
-    <AssemblyTitle>Google Protocol Buffers</AssemblyTitle>
-    <VersionPrefix>3.5.2</VersionPrefix>
-    <Authors>Google Inc.</Authors>
-    <TargetFrameworks>netstandard1.0;net45</TargetFrameworks>
-    <GenerateDocumentationFile>true</GenerateDocumentationFile>
-    <AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
-    <SignAssembly>true</SignAssembly>
-    <PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
-    <PackageTags>Protocol;Buffers;Binary;Serialization;Format;Google;proto;proto3</PackageTags>
-    <PackageReleaseNotes>C# proto3 support</PackageReleaseNotes>
-    <PackageProjectUrl>https://github.com/google/protobuf</PackageProjectUrl>
-    <PackageLicenseUrl>https://github.com/google/protobuf/blob/master/LICENSE</PackageLicenseUrl>
-    <RepositoryType>git</RepositoryType>
-    <RepositoryUrl>https://github.com/google/protobuf.git</RepositoryUrl>
-    <IncludeSymbols>true</IncludeSymbols>
-    <IncludeSource>true</IncludeSource>
-  </PropertyGroup>
-
-  <!-- 
-    - Override target frameworks on non-Windows to just .NET Core
-    - Doing this conditionally in the initial PropertyGroup confuses
-    - Visual Studio.
-    -->
-  <PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
-    <TargetFrameworks>netstandard1.0</TargetFrameworks>
-  </PropertyGroup>
-
-</Project>
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

+    <ProductVersion>9.0.30729</ProductVersion>

+    <SchemaVersion>2.0</SchemaVersion>

+    <ProjectGuid>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</ProjectGuid>

+    <OutputType>Library</OutputType>

+    <AppDesignerFolder>Properties</AppDesignerFolder>

+    <RootNamespace>Google.Protobuf</RootNamespace>

+    <AssemblyName>Google.Protobuf</AssemblyName>

+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

+    <TargetFrameworkProfile>Profile259</TargetFrameworkProfile>

+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

+    <FileAlignment>512</FileAlignment>

+    <OldToolsVersion>3.5</OldToolsVersion>

+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>

+    <NuGetPackageImportStamp>

+    </NuGetPackageImportStamp>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

+    <DebugSymbols>true</DebugSymbols>

+    <DebugType>full</DebugType>

+    <Optimize>false</Optimize>

+    <OutputPath>bin\Debug</OutputPath>

+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>

+    <DocumentationFile>bin\Debug\Google.Protobuf.xml</DocumentationFile>

+    <NoWarn>

+    </NoWarn>

+    <DefineConstants>DEBUG;TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\Release</OutputPath>

+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>

+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>

+    <NoWarn>

+    </NoWarn>

+    <DefineConstants>TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\ReleaseSigned</OutputPath>

+    <IntermediateOutputPath>obj\ReleaseSigned\</IntermediateOutputPath>

+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>

+    <NoWarn>

+    </NoWarn>

+    <DefineConstants>TRACE;SIGNED</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <NoStdLib>true</NoStdLib>

+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

+    <SignAssembly>True</SignAssembly>

+    <AssemblyOriginatorKeyFile>..\..\keys\Google.Protobuf.snk</AssemblyOriginatorKeyFile>

+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>

+  </PropertyGroup>

+  <ItemGroup>

+    <Reference Include="mscorlib" />

+    <Reference Include="System" />

+    <Reference Include="System.Xml" />

+  </ItemGroup>

+  <ItemGroup>

+    <Compile Include="ByteArray.cs" />

+    <Compile Include="ByteString.cs" />

+    <Compile Include="CodedOutputStream.ComputeSize.cs" />

+    <Compile Include="CodedInputStream.cs" />

+    <Compile Include="CodedOutputStream.cs" />

+    <Compile Include="Collections\MapField.cs" />

+    <Compile Include="Collections\ReadOnlyDictionary.cs" />

+    <Compile Include="Collections\RepeatedField.cs" />

+    <Compile Include="Compatibility\PropertyInfoExtensions.cs" />

+    <Compile Include="Compatibility\TypeExtensions.cs" />

+    <Compile Include="FieldCodec.cs" />

+    <Compile Include="FrameworkPortability.cs" />

+    <Compile Include="ICustomDiagnosticMessage.cs" />

+    <Compile Include="IDeepCloneable.cs" />

+    <Compile Include="InvalidJsonException.cs" />

+    <Compile Include="JsonFormatter.cs" />

+    <Compile Include="JsonParser.cs" />

+    <Compile Include="JsonToken.cs" />

+    <Compile Include="JsonTokenizer.cs" />

+    <Compile Include="MessageExtensions.cs" />

+    <Compile Include="IMessage.cs" />

+    <Compile Include="InvalidProtocolBufferException.cs" />

+    <Compile Include="LimitedInputStream.cs" />

+    <Compile Include="MessageParser.cs" />

+    <Compile Include="Properties\AssemblyInfo.cs" />

+    <Compile Include="Reflection\Descriptor.cs" />

+    <Compile Include="Reflection\DescriptorBase.cs" />

+    <Compile Include="Reflection\DescriptorPool.cs" />

+    <Compile Include="Reflection\DescriptorUtil.cs" />

+    <Compile Include="Reflection\DescriptorValidationException.cs" />

+    <Compile Include="Reflection\EnumDescriptor.cs" />

+    <Compile Include="Reflection\EnumValueDescriptor.cs" />

+    <Compile Include="Reflection\FieldAccessorBase.cs" />

+    <Compile Include="Reflection\FieldDescriptor.cs" />

+    <Compile Include="Reflection\FieldType.cs" />

+    <Compile Include="Reflection\FileDescriptor.cs" />

+    <Compile Include="Reflection\GeneratedClrTypeInfo.cs" />

+    <Compile Include="Reflection\IDescriptor.cs" />

+    <Compile Include="Reflection\IFieldAccessor.cs" />

+    <Compile Include="Reflection\MapFieldAccessor.cs" />

+    <Compile Include="Reflection\MessageDescriptor.cs" />

+    <Compile Include="Reflection\MethodDescriptor.cs" />

+    <Compile Include="Reflection\OneofAccessor.cs" />

+    <Compile Include="Reflection\OneofDescriptor.cs" />

+    <Compile Include="Reflection\OriginalNameAttribute.cs" />

+    <Compile Include="Reflection\PackageDescriptor.cs" />

+    <Compile Include="Reflection\PartialClasses.cs" />

+    <Compile Include="Reflection\ReflectionUtil.cs" />

+    <Compile Include="Reflection\RepeatedFieldAccessor.cs" />

+    <Compile Include="Reflection\ServiceDescriptor.cs" />

+    <Compile Include="Reflection\SingleFieldAccessor.cs" />

+    <Compile Include="ProtoPreconditions.cs" />

+    <Compile Include="Reflection\TypeRegistry.cs" />

+    <Compile Include="WellKnownTypes\Any.cs" />

+    <Compile Include="WellKnownTypes\AnyPartial.cs" />

+    <Compile Include="WellKnownTypes\Api.cs" />

+    <Compile Include="WellKnownTypes\Duration.cs" />

+    <Compile Include="WellKnownTypes\DurationPartial.cs" />

+    <Compile Include="WellKnownTypes\Empty.cs" />

+    <Compile Include="WellKnownTypes\FieldMask.cs" />

+    <Compile Include="WellKnownTypes\FieldMaskPartial.cs" />

+    <Compile Include="WellKnownTypes\SourceContext.cs" />

+    <Compile Include="WellKnownTypes\Struct.cs" />

+    <Compile Include="WellKnownTypes\TimeExtensions.cs" />

+    <Compile Include="WellKnownTypes\Timestamp.cs" />

+    <Compile Include="WellKnownTypes\TimestampPartial.cs" />

+    <Compile Include="WellKnownTypes\Type.cs" />

+    <Compile Include="WellKnownTypes\ValuePartial.cs" />

+    <Compile Include="WellKnownTypes\Wrappers.cs" />

+    <Compile Include="WellKnownTypes\WrappersPartial.cs" />

+    <Compile Include="WireFormat.cs" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="Google.Protobuf.nuspec" />

+    <None Include="packages.config" />

+  </ItemGroup>

+  <ItemGroup />

+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />

+  <Import Project="..\packages\NuSpec.ReferenceGenerator.1.4.1\build\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\NuSpec.ReferenceGenerator.targets" Condition="Exists('..\packages\NuSpec.ReferenceGenerator.1.4.1\build\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\NuSpec.ReferenceGenerator.targets')" />

+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

+    <PropertyGroup>

+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>

+    </PropertyGroup>

+    <Error Condition="!Exists('..\packages\NuSpec.ReferenceGenerator.1.4.1\build\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\NuSpec.ReferenceGenerator.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NuSpec.ReferenceGenerator.1.4.1\build\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\NuSpec.ReferenceGenerator.targets'))" />

+  </Target>

+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+       Other similar extension points exist, see Microsoft.Common.targets.

+  <Target Name="BeforeBuild">

+  </Target>

+  <Target Name="AfterBuild">

+  </Target>

+  -->

+</Project>
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Google.Protobuf.nuspec b/csharp/src/Google.Protobuf/Google.Protobuf.nuspec
new file mode 100644
index 0000000..90e3da3
--- /dev/null
+++ b/csharp/src/Google.Protobuf/Google.Protobuf.nuspec
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package>
+  <metadata>
+    <id>Google.Protobuf</id>
+    <title>Google Protocol Buffers C#</title>
+    <summary>C# runtime library for Protocol Buffers - Google's data interchange format.</summary>
+    <description>See project site for more info.</description>
+    <version>3.0.0-beta3</version>
+    <authors>Google Inc.</authors>
+    <owners>protobuf-packages</owners>
+    <licenseUrl>https://github.com/google/protobuf/blob/master/LICENSE</licenseUrl>
+    <projectUrl>https://github.com/google/protobuf</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <releaseNotes>C# proto3 support</releaseNotes>
+    <copyright>Copyright 2015, Google Inc.</copyright>
+    <tags>Protocol Buffers Binary Serialization Format Google proto proto3</tags>
+    <dependencies>
+      <!-- Dependencies for older, monolithic-assembly platforms -->
+      <group targetFramework="net45" />
+      <group targetFramework="wp8" />
+      <group targetFramework="win8" />
+      <group targetFramework="wpa81" />
+      <group targetFramework="xamarin.ios" />
+      <group targetFramework="monotouch" />
+      <group targetFramework="monoandroid" />
+      <!-- Dependencies for newer, more granular platforms (.NET Core etc) -->
+      <group targetFramework="dotnet">
+        <dependency id="System.Collections" version="4.0.0" />
+        <dependency id="System.Diagnostics.Debug" version="4.0.0" />
+        <dependency id="System.Globalization" version="4.0.0" />
+        <dependency id="System.IO" version="4.0.0" />
+        <dependency id="System.Linq" version="4.0.0" />
+        <dependency id="System.Linq.Expressions" version="4.0.0" />
+        <dependency id="System.ObjectModel" version="4.0.0" />
+        <dependency id="System.Reflection" version="4.0.0" />
+        <dependency id="System.Reflection.Extensions" version="4.0.0" />
+        <dependency id="System.Runtime" version="4.0.0" />
+        <dependency id="System.Runtime.Extensions" version="4.0.0" />
+        <dependency id="System.Text.Encoding" version="4.0.0" />
+        <dependency id="System.Text.RegularExpressions" version="4.0.0" />
+        <dependency id="System.Threading" version="4.0.0" />
+      </group>
+    </dependencies>
+  </metadata>
+  <files>
+    <file src="bin/ReleaseSigned/Google.Protobuf.dll" target="lib/portable-net45+netcore45+wpa81+wp8" />
+    <file src="bin/ReleaseSigned/Google.Protobuf.pdb" target="lib/portable-net45+netcore45+wpa81+wp8" />
+    <file src="bin/ReleaseSigned/Google.Protobuf.xml" target="lib/portable-net45+netcore45+wpa81+wp8" />
+    <file src="bin/ReleaseSigned/Google.Protobuf.dll" target="lib/dotnet" />
+    <file src="bin/ReleaseSigned/Google.Protobuf.pdb" target="lib/dotnet" />
+    <file src="bin/ReleaseSigned/Google.Protobuf.xml" target="lib/dotnet" />
+    <file src="**\*.cs" target="src" />
+  </files>
+</package>
diff --git a/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs b/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs
index 0fbc530..eeb0f13 100644
--- a/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs
+++ b/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs
@@ -61,7 +61,7 @@
         {

             return new InvalidProtocolBufferException(

                 "While parsing a protocol message, the input ended unexpectedly " +

-                "in the middle of a field.  This could mean either that the " +

+                "in the middle of a field.  This could mean either than the " +

                 "input has been truncated or that an embedded message " +

                 "misreported its own length.");

         }

diff --git a/csharp/src/Google.Protobuf/JsonFormatter.cs b/csharp/src/Google.Protobuf/JsonFormatter.cs
old mode 100755
new mode 100644
index 4ae10d8..8377247
--- a/csharp/src/Google.Protobuf/JsonFormatter.cs
+++ b/csharp/src/Google.Protobuf/JsonFormatter.cs
@@ -248,26 +248,80 @@
             return !first;
         }
 
-        // Converted from java/core/src/main/java/com/google/protobuf/Descriptors.java
-        internal static string ToJsonName(string name)
+        /// <summary>
+        /// Camel-case converter with added strictness for field mask formatting.
+        /// </summary>
+        /// <exception cref="InvalidOperationException">The field mask is invalid for JSON representation</exception>
+        private static string ToCamelCaseForFieldMask(string input)
         {
-            StringBuilder result = new StringBuilder(name.Length);
-            bool isNextUpperCase = false;
-            foreach (char ch in name)
+            for (int i = 0; i < input.Length; i++)
             {
-                if (ch == '_')
+                char c = input[i];
+                if (c >= 'A' && c <= 'Z')
                 {
-                    isNextUpperCase = true;
+                    throw new InvalidOperationException($"Invalid field mask to be converted to JSON: {input}");
                 }
-                else if (isNextUpperCase)
+                if (c == '_' && i < input.Length - 1)
                 {
-                    result.Append(char.ToUpperInvariant(ch));
-                    isNextUpperCase = false;
+                    char next = input[i + 1];
+                    if (next < 'a' || next > 'z')
+                    {
+                        throw new InvalidOperationException($"Invalid field mask to be converted to JSON: {input}");
+                    }
                 }
-                else
+            }
+            return ToCamelCase(input);
+        }
+
+        // Converted from src/google/protobuf/util/internal/utility.cc ToCamelCase
+        // TODO: Use the new field in FieldDescriptor.
+        internal static string ToCamelCase(string input)
+        {
+            bool capitalizeNext = false;
+            bool wasCap = true;
+            bool isCap = false;
+            bool firstWord = true;
+            StringBuilder result = new StringBuilder(input.Length);
+
+            for (int i = 0; i < input.Length; i++, wasCap = isCap)
+            {
+                isCap = char.IsUpper(input[i]);
+                if (input[i] == '_')
                 {
-                    result.Append(ch);
+                    capitalizeNext = true;
+                    if (result.Length != 0)
+                    {
+                        firstWord = false;
+                    }
+                    continue;
                 }
+                else if (firstWord)
+                {
+                    // Consider when the current character B is capitalized,
+                    // first word ends when:
+                    // 1) following a lowercase:   "...aB..."
+                    // 2) followed by a lowercase: "...ABc..."
+                    if (result.Length != 0 && isCap &&
+                        (!wasCap || (i + 1 < input.Length && char.IsLower(input[i + 1]))))
+                    {
+                        firstWord = false;
+                    }
+                    else
+                    {
+                        result.Append(char.ToLowerInvariant(input[i]));
+                        continue;
+                    }
+                }
+                else if (capitalizeNext)
+                {
+                    capitalizeNext = false;
+                    if (char.IsLower(input[i]))
+                    {
+                        result.Append(char.ToUpperInvariant(input[i]));
+                        continue;
+                    }
+                }
+                result.Append(input[i]);
             }
             return result.ToString();
         }
@@ -323,16 +377,8 @@
                     throw new ArgumentException("Invalid field type");
             }
         }
-
-        /// <summary>
-        /// Writes a single value to the given writer as JSON. Only types understood by
-        /// Protocol Buffers can be written in this way. This method is only exposed for
-        /// advanced use cases; most users should be using <see cref="Format(IMessage)"/>
-        /// or <see cref="Format(IMessage, TextWriter)"/>.
-        /// </summary>
-        /// <param name="writer">The writer to write the value to. Must not be null.</param>
-        /// <param name="value">The value to write. May be null.</param>
-        public void WriteValue(TextWriter writer, object value)
+        
+        private void WriteValue(TextWriter writer, object value)
         {
             if (value == null)
             {
@@ -375,21 +421,14 @@
             }
             else if (value is System.Enum)
             {
-                if (settings.FormatEnumsAsIntegers)
+                string name = OriginalEnumValueHelper.GetOriginalName(value);
+                if (name != null)
                 {
-                    WriteValue(writer, (int)value);
+                    WriteString(writer, name);
                 }
                 else
                 {
-                    string name = OriginalEnumValueHelper.GetOriginalName(value);
-                    if (name != null)
-                    {
-                        WriteString(writer, name);
-                    }
-                    else
-                    {
-                        WriteValue(writer, (int)value);
-                    }
+                    WriteValue(writer, (int)value);
                 }
             }
             else if (value is float || value is double)
@@ -408,7 +447,15 @@
             }
             else if (value is IMessage)
             {
-                Format((IMessage)value, writer);
+                IMessage message = (IMessage) value;
+                if (message.Descriptor.IsWellKnownType)
+                {
+                    WriteWellKnownTypeValue(writer, message.Descriptor, value);
+                }
+                else
+                {
+                    WriteMessage(writer, (IMessage)value);
+                }
             }
             else
             {
@@ -677,6 +724,20 @@
         }
 
         /// <summary>
+        /// Returns whether or not a singular value can be represented in JSON.
+        /// Currently only relevant for enums, where unknown values can't be represented.
+        /// For repeated/map fields, this always returns true.
+        /// </summary>
+        private bool CanWriteSingleValue(object value)
+        {
+            if (value is System.Enum)
+            {
+                return System.Enum.IsDefined(value.GetType(), value);
+            }
+            return true;
+        }
+
+        /// <summary>
         /// Writes a string (including leading and trailing double quotes) to a builder, escaping as required.
         /// </summary>
         /// <remarks>
@@ -785,11 +846,7 @@
             /// </summary>
             public TypeRegistry TypeRegistry { get; }
 
-            /// <summary>
-            /// Whether to format enums as ints. Defaults to false.
-            /// </summary>
-            public bool FormatEnumsAsIntegers { get; }
-
+            // TODO: Work out how we're going to scale this to multiple settings. "WithXyz" methods?
 
             /// <summary>
             /// Creates a new <see cref="Settings"/> object with the specified formatting of default values
@@ -806,42 +863,11 @@
             /// </summary>
             /// <param name="formatDefaultValues"><c>true</c> if default values (0, empty strings etc) should be formatted; <c>false</c> otherwise.</param>
             /// <param name="typeRegistry">The <see cref="TypeRegistry"/> to use when formatting <see cref="Any"/> messages.</param>
-            public Settings(bool formatDefaultValues, TypeRegistry typeRegistry) : this(formatDefaultValues, typeRegistry, false)
-            {
-            }
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object with the specified parameters.
-            /// </summary>
-            /// <param name="formatDefaultValues"><c>true</c> if default values (0, empty strings etc) should be formatted; <c>false</c> otherwise.</param>
-            /// <param name="typeRegistry">The <see cref="TypeRegistry"/> to use when formatting <see cref="Any"/> messages. TypeRegistry.Empty will be used if it is null.</param>
-            /// <param name="formatEnumsAsIntegers"><c>true</c> to format the enums as integers; <c>false</c> to format enums as enum names.</param>
-            private Settings(bool formatDefaultValues,
-                            TypeRegistry typeRegistry,
-                            bool formatEnumsAsIntegers)
+            public Settings(bool formatDefaultValues, TypeRegistry typeRegistry)
             {
                 FormatDefaultValues = formatDefaultValues;
-                TypeRegistry = typeRegistry ?? TypeRegistry.Empty;
-                FormatEnumsAsIntegers = formatEnumsAsIntegers;
+                TypeRegistry = ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry));
             }
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object with the specified formatting of default values and the current settings.
-            /// </summary>
-            /// <param name="formatDefaultValues"><c>true</c> if default values (0, empty strings etc) should be formatted; <c>false</c> otherwise.</param>
-            public Settings WithFormatDefaultValues(bool formatDefaultValues) => new Settings(formatDefaultValues, TypeRegistry, FormatEnumsAsIntegers);
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object with the specified type registry and the current settings.
-            /// </summary>
-            /// <param name="typeRegistry">The <see cref="TypeRegistry"/> to use when formatting <see cref="Any"/> messages.</param>
-            public Settings WithTypeRegistry(TypeRegistry typeRegistry) => new Settings(FormatDefaultValues, typeRegistry, FormatEnumsAsIntegers);
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object with the specified enums formatting option and the current settings.
-            /// </summary>
-            /// <param name="formatEnumsAsIntegers"><c>true</c> to format the enums as integers; <c>false</c> to format enums as enum names.</param>
-            public Settings WithFormatEnumsAsIntegers(bool formatEnumsAsIntegers) => new Settings(FormatDefaultValues, TypeRegistry, formatEnumsAsIntegers);
         }
 
         // Effectively a cache of mapping from enum values to the original name as specified in the proto file,
@@ -873,30 +899,14 @@
                 return originalName;
             }
 
-#if NET35
-            // TODO: Consider adding functionality to TypeExtensions to avoid this difference.
-            private static Dictionary<object, string> GetNameMapping(System.Type enumType) =>
-                enumType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)
-                    .Where(f => (f.GetCustomAttributes(typeof(OriginalNameAttribute), false)
-                                 .FirstOrDefault() as OriginalNameAttribute)
-                                 ?.PreferredAlias ?? true)
-                    .ToDictionary(f => f.GetValue(null),
-                                  f => (f.GetCustomAttributes(typeof(OriginalNameAttribute), false)
-                                        .FirstOrDefault() as OriginalNameAttribute)
-                                        // If the attribute hasn't been applied, fall back to the name of the field.
-                                        ?.Name ?? f.Name);
-#else
             private static Dictionary<object, string> GetNameMapping(System.Type enumType) =>
                 enumType.GetTypeInfo().DeclaredFields
                     .Where(f => f.IsStatic)
-                    .Where(f => f.GetCustomAttributes<OriginalNameAttribute>()
-                                 .FirstOrDefault()?.PreferredAlias ?? true)
                     .ToDictionary(f => f.GetValue(null),
                                   f => f.GetCustomAttributes<OriginalNameAttribute>()
                                         .FirstOrDefault()
                                         // If the attribute hasn't been applied, fall back to the name of the field.
                                         ?.Name ?? f.Name);
-#endif
         }
     }
 }
diff --git a/csharp/src/Google.Protobuf/JsonParser.cs b/csharp/src/Google.Protobuf/JsonParser.cs
index 3621b0c..d738ebb 100644
--- a/csharp/src/Google.Protobuf/JsonParser.cs
+++ b/csharp/src/Google.Protobuf/JsonParser.cs
@@ -86,8 +86,7 @@
             { FloatValue.Descriptor.FullName, MergeWrapperField },
             { DoubleValue.Descriptor.FullName, MergeWrapperField },
             { BytesValue.Descriptor.FullName, MergeWrapperField },
-            { StringValue.Descriptor.FullName, MergeWrapperField },
-            { BoolValue.Descriptor.FullName, MergeWrapperField }
+            { StringValue.Descriptor.FullName, MergeWrapperField }
         };
 
         // Convenience method to avoid having to repeat the same code multiple times in the above
@@ -203,14 +202,10 @@
                 }
                 else
                 {
-                    if (settings.IgnoreUnknownFields)
-                    {
-                        tokenizer.SkipValue();
-                    }
-                    else
-                    {
-                        throw new InvalidProtocolBufferException("Unknown field: " + name);
-                    }
+                    // TODO: Is this what we want to do? If not, we'll need to skip the value,
+                    // which may be an object or array. (We might want to put code in the tokenizer
+                    // to do that.)
+                    throw new InvalidProtocolBufferException("Unknown field: " + name);
                 }
             }
         }
@@ -1001,19 +996,6 @@
             public TypeRegistry TypeRegistry { get; }
 
             /// <summary>
-            /// Whether the parser should ignore unknown fields (<c>true</c>) or throw an exception when
-            /// they are encountered (<c>false</c>).
-            /// </summary>
-            public bool IgnoreUnknownFields { get; }
-
-            private Settings(int recursionLimit, TypeRegistry typeRegistry, bool ignoreUnknownFields)
-            {
-                RecursionLimit = recursionLimit;
-                TypeRegistry = ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry));
-                IgnoreUnknownFields = ignoreUnknownFields;
-            }
-
-            /// <summary>
             /// Creates a new <see cref="Settings"/> object with the specified recursion limit.
             /// </summary>
             /// <param name="recursionLimit">The maximum depth of messages to parse</param>
@@ -1026,34 +1008,11 @@
             /// </summary>
             /// <param name="recursionLimit">The maximum depth of messages to parse</param>
             /// <param name="typeRegistry">The type registry used to parse <see cref="Any"/> messages</param>
-            public Settings(int recursionLimit, TypeRegistry typeRegistry) : this(recursionLimit, typeRegistry, false)
+            public Settings(int recursionLimit, TypeRegistry typeRegistry)
             {
+                RecursionLimit = recursionLimit;
+                TypeRegistry = ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry));
             }
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object set to either ignore unknown fields, or throw an exception
-            /// when unknown fields are encountered.
-            /// </summary>
-            /// <param name="ignoreUnknownFields"><c>true</c> if unknown fields should be ignored when parsing; <c>false</c> to throw an exception.</param>
-            public Settings WithIgnoreUnknownFields(bool ignoreUnknownFields) =>
-                new Settings(RecursionLimit, TypeRegistry, ignoreUnknownFields);
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object based on this one, but with the specified recursion limit.
-            /// </summary>
-            /// <param name="recursionLimit">The new recursion limit.</param>
-            public Settings WithRecursionLimit(int recursionLimit) =>
-                new Settings(recursionLimit, TypeRegistry, IgnoreUnknownFields);
-
-            /// <summary>
-            /// Creates a new <see cref="Settings"/> object based on this one, but with the specified type registry.
-            /// </summary>
-            /// <param name="typeRegistry">The new type registry. Must not be null.</param>
-            public Settings WithTypeRegistry(TypeRegistry typeRegistry) =>
-                new Settings(
-                    RecursionLimit,
-                    ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry)),
-                    IgnoreUnknownFields);
         }
     }
 }
diff --git a/csharp/src/Google.Protobuf/JsonTokenizer.cs b/csharp/src/Google.Protobuf/JsonTokenizer.cs
index 0e403f7..09a6d43 100644
--- a/csharp/src/Google.Protobuf/JsonTokenizer.cs
+++ b/csharp/src/Google.Protobuf/JsonTokenizer.cs
@@ -138,34 +138,6 @@
         protected abstract JsonToken NextImpl();
 
         /// <summary>
-        /// Skips the value we're about to read. This must only be called immediately after reading a property name.
-        /// If the value is an object or an array, the complete object/array is skipped.
-        /// </summary>
-        internal void SkipValue()
-        {
-            // We'll assume that Next() makes sure that the end objects and end arrays are all valid.
-            // All we care about is the total nesting depth we need to close.
-            int depth = 0;
-
-            // do/while rather than while loop so that we read at least one token.
-            do
-            {
-                var token = Next();
-                switch (token.Type)
-                {
-                    case JsonToken.TokenType.EndArray:
-                    case JsonToken.TokenType.EndObject:
-                        depth--;
-                        break;
-                    case JsonToken.TokenType.StartArray:
-                    case JsonToken.TokenType.StartObject:
-                        depth++;
-                        break;
-                }
-            } while (depth != 0);
-        }
-
-        /// <summary>
         /// Tokenizer which first exhausts a list of tokens, then consults another tokenizer.
         /// </summary>
         private class JsonReplayTokenizer : JsonTokenizer
@@ -245,7 +217,7 @@
                             state = State.ObjectAfterColon;
                             break;
                         case ',':
-                            ValidateState(State.ObjectAfterProperty | State.ArrayAfterValue, "Invalid state to read a comma: ");
+                            ValidateState(State.ObjectAfterProperty | State.ArrayAfterValue, "Invalid state to read a colon: ");
                             state = state == State.ObjectAfterProperty ? State.ObjectAfterComma : State.ArrayAfterComma;
                             break;
                         case '"':
diff --git a/csharp/src/Google.Protobuf/MessageExtensions.cs b/csharp/src/Google.Protobuf/MessageExtensions.cs
index 9dbc49d..047156c 100644
--- a/csharp/src/Google.Protobuf/MessageExtensions.cs
+++ b/csharp/src/Google.Protobuf/MessageExtensions.cs
@@ -54,22 +54,6 @@
         }
 
         /// <summary>
-        /// Merges data from the given byte array slice into an existing message.
-        /// </summary>
-        /// <param name="message">The message to merge the data into.</param>
-        /// <param name="data">The data containing the slice to merge, which must be protobuf-encoded binary data.</param>
-        /// <param name="offset">The offset of the slice to merge.</param>
-        /// <param name="length">The length of the slice to merge.</param>
-        public static void MergeFrom(this IMessage message, byte[] data, int offset, int length)
-        {
-            ProtoPreconditions.CheckNotNull(message, "message");
-            ProtoPreconditions.CheckNotNull(data, "data");
-            CodedInputStream input = new CodedInputStream(data, offset, length);
-            message.MergeFrom(input);
-            input.CheckReadEndOfStreamTag();
-        }
-
-        /// <summary>
         /// Merges data from the given byte string into an existing message.
         /// </summary>
         /// <param name="message">The message to merge the data into.</param>
diff --git a/csharp/src/Google.Protobuf/MessageParser.cs b/csharp/src/Google.Protobuf/MessageParser.cs
index 66d4413..8889638 100644
--- a/csharp/src/Google.Protobuf/MessageParser.cs
+++ b/csharp/src/Google.Protobuf/MessageParser.cs
@@ -64,32 +64,20 @@
         /// <returns>The newly parsed message.</returns>
         public IMessage ParseFrom(byte[] data)
         {
+            ProtoPreconditions.CheckNotNull(data, "data");
             IMessage message = factory();
             message.MergeFrom(data);
             return message;
         }
 
         /// <summary>
-        /// Parses a message from a byte array slice.
-        /// </summary>
-        /// <param name="data">The byte array containing the message. Must not be null.</param>
-        /// <param name="offset">The offset of the slice to parse.</param>
-        /// <param name="length">The length of the slice to parse.</param>
-        /// <returns>The newly parsed message.</returns>
-        public IMessage ParseFrom(byte[] data, int offset, int length)
-        {
-            IMessage message = factory();
-            message.MergeFrom(data, offset, length);
-            return message;
-        }
-
-        /// <summary>
         /// Parses a message from the given byte string.
         /// </summary>
         /// <param name="data">The data to parse.</param>
         /// <returns>The parsed message.</returns>
         public IMessage ParseFrom(ByteString data)
         {
+            ProtoPreconditions.CheckNotNull(data, "data");
             IMessage message = factory();
             message.MergeFrom(data);
             return message;
@@ -203,32 +191,20 @@
         /// <returns>The newly parsed message.</returns>
         public new T ParseFrom(byte[] data)
         {
+            ProtoPreconditions.CheckNotNull(data, "data");
             T message = factory();
             message.MergeFrom(data);
             return message;
         }
 
         /// <summary>
-        /// Parses a message from a byte array slice.
-        /// </summary>
-        /// <param name="data">The byte array containing the message. Must not be null.</param>
-        /// <param name="offset">The offset of the slice to parse.</param>
-        /// <param name="length">The length of the slice to parse.</param>
-        /// <returns>The newly parsed message.</returns>
-        public new T ParseFrom(byte[] data, int offset, int length)
-        {
-            T message = factory();
-            message.MergeFrom(data, offset, length);
-            return message;
-        }
-
-        /// <summary>
         /// Parses a message from the given byte string.
         /// </summary>
         /// <param name="data">The data to parse.</param>
         /// <returns>The parsed message.</returns>
         public new T ParseFrom(ByteString data)
         {
+            ProtoPreconditions.CheckNotNull(data, "data");
             T message = factory();
             message.MergeFrom(data);
             return message;
diff --git a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
index 9b179bd..0516f18 100644
--- a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
+++ b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
@@ -30,6 +30,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 #endregion

 

+using System.Reflection;

 using System.Runtime.CompilerServices;

 using System.Security;

 

@@ -37,13 +38,30 @@
 // set of attributes. Change these attribute values to modify the information

 // associated with an assembly.

 

+[assembly: AssemblyTitle("Google.Protobuf")]

+[assembly: AssemblyDescription("")]

+[assembly: AssemblyConfiguration("")]

+[assembly: AssemblyCompany("")]

+[assembly: AssemblyProduct("Google.Protobuf")]

+[assembly: AssemblyCopyright("Copyright ©  2015")]

+[assembly: AssemblyTrademark("")]

+[assembly: AssemblyCulture("")]

+

 #if !NCRUNCH

 [assembly: AllowPartiallyTrustedCallers]

 #endif

 

+#if SIGNED

 [assembly: InternalsVisibleTo("Google.Protobuf.Test, PublicKey=" +

     "002400000480000094000000060200000024000052534131000400000100010025800fbcfc63a1" +

     "7c66b303aae80b03a6beaa176bb6bef883be436f2a1579edd80ce23edf151a1f4ced97af83abcd" +

     "981207041fd5b2da3b498346fcfcd94910d52f25537c4a43ce3fbe17dc7d43e6cbdb4d8f1242dc" +

     "b6bd9b5906be74da8daa7d7280f97130f318a16c07baf118839b156299a48522f9fae2371c9665" +

     "c5ae9cb6")]

+#else

+[assembly: InternalsVisibleTo("Google.Protobuf.Test")]

+#endif

+

+[assembly: AssemblyVersion("3.0.0.0")]

+[assembly: AssemblyFileVersion("3.0.0.0")]

+[assembly: AssemblyInformationalVersion("3.0.0-beta3")]

diff --git a/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs b/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs
deleted file mode 100644
index 88b3ec0..0000000
--- a/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs
+++ /dev/null
@@ -1,390 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using System;
-using System.Collections.Generic;
-
-namespace Google.Protobuf.Reflection
-{
-    /// <summary>
-    /// Container for a set of custom options specified within a message, field etc.
-    /// </summary>
-    /// <remarks>
-    /// <para>
-    /// This type is publicly immutable, but internally mutable. It is only populated
-    /// by the descriptor parsing code - by the time any user code is able to see an instance,
-    /// it will be fully initialized.
-    /// </para>
-    /// <para>
-    /// If an option is requested using the incorrect method, an answer may still be returned: all
-    /// of the numeric types are represented internally using 64-bit integers, for example. It is up to
-    /// the caller to ensure that they make the appropriate method call for the option they're interested in.
-    /// Note that enum options are simply stored as integers, so the value should be fetched using
-    /// <see cref="TryGetInt32(int, out int)"/> and then cast appropriately.
-    /// </para>
-    /// <para>
-    /// Repeated options are currently not supported. Asking for a single value of an option
-    /// which was actually repeated will return the last value, except for message types where
-    /// all the set values are merged together.
-    /// </para>
-    /// </remarks>
-    public sealed class CustomOptions
-    {
-        /// <summary>
-        /// Singleton for all descriptors with an empty set of options.
-        /// </summary>
-        internal static readonly CustomOptions Empty = new CustomOptions();
-        
-        /// <summary>
-        /// A sequence of values per field. This needs to be per field rather than per tag to allow correct deserialization
-        /// of repeated fields which could be "int, ByteString, int" - unlikely as that is. The fact that values are boxed
-        /// is unfortunate; we might be able to use a struct instead, and we could combine uint and ulong values.
-        /// </summary>
-        private readonly Dictionary<int, List<FieldValue>> valuesByField = new Dictionary<int, List<FieldValue>>();
-
-        private CustomOptions() { }
-
-        /// <summary>
-        /// Retrieves a Boolean value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetBool(int field, out bool value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = tmp == 1UL;
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves a signed 32-bit integer value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetInt32(int field, out int value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = (int) tmp.GetValueOrDefault();
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves a signed 64-bit integer value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetInt64(int field, out long value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = (long) tmp.GetValueOrDefault();
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves an unsigned 32-bit integer value for the specified option field,
-        /// assuming a fixed-length representation.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetFixed32(int field, out uint value) => TryGetUInt32(field, out value);
-
-        /// <summary>
-        /// Retrieves an unsigned 64-bit integer value for the specified option field,
-        /// assuming a fixed-length representation.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetFixed64(int field, out ulong value) => TryGetUInt64(field, out value);
-
-        /// <summary>
-        /// Retrieves a signed 32-bit integer value for the specified option field,
-        /// assuming a fixed-length representation.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetSFixed32(int field, out int value) => TryGetInt32(field, out value);
-
-        /// <summary>
-        /// Retrieves a signed 64-bit integer value for the specified option field,
-        /// assuming a fixed-length representation.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetSFixed64(int field, out long value) => TryGetInt64(field, out value);
-        
-        /// <summary>
-        /// Retrieves a signed 32-bit integer value for the specified option field,
-        /// assuming a zigzag encoding.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetSInt32(int field, out int value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = CodedInputStream.DecodeZigZag32((uint) tmp.GetValueOrDefault());
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves a signed 64-bit integer value for the specified option field,
-        /// assuming a zigzag encoding.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetSInt64(int field, out long value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = CodedInputStream.DecodeZigZag64(tmp.GetValueOrDefault());
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves an unsigned 32-bit integer value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetUInt32(int field, out uint value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = (uint) tmp.GetValueOrDefault();
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves an unsigned 64-bit integer value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetUInt64(int field, out ulong value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = tmp.GetValueOrDefault();
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves a 32-bit floating point value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetFloat(int field, out float value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            int int32 = (int) tmp.GetValueOrDefault();
-            byte[] bytes = BitConverter.GetBytes(int32);
-            value = BitConverter.ToSingle(bytes, 0);
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves a 64-bit floating point value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetDouble(int field, out double value)
-        {
-            ulong? tmp = GetLastNumericValue(field);
-            value = BitConverter.Int64BitsToDouble((long) tmp.GetValueOrDefault());
-            return tmp != null;
-        }
-
-        /// <summary>
-        /// Retrieves a string value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetString(int field, out string value)
-        {
-            ByteString bytes = GetLastByteStringValue(field);
-            value = bytes?.ToStringUtf8();
-            return bytes != null;
-        }
-
-        /// <summary>
-        /// Retrieves a bytes value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetBytes(int field, out ByteString value)
-        {
-            ByteString bytes = GetLastByteStringValue(field);
-            value = bytes;
-            return bytes != null;
-        }
-
-        /// <summary>
-        /// Retrieves a message value for the specified option field.
-        /// </summary>
-        /// <param name="field">The field to fetch the value for.</param>
-        /// <param name="value">The output variable to populate.</param>
-        /// <returns><c>true</c> if a suitable value for the field was found; <c>false</c> otherwise.</returns>
-        public bool TryGetMessage<T>(int field, out T value) where T : class, IMessage, new()
-        {
-            value = null;
-            List<FieldValue> values;
-            if (!valuesByField.TryGetValue(field, out values))
-            {
-                return false;
-            }
-            foreach (FieldValue fieldValue in values)
-            {
-                if (fieldValue.ByteString != null)
-                {
-                    if (value == null)
-                    {
-                        value = new T();
-                    }
-                    value.MergeFrom(fieldValue.ByteString);
-                }
-            }
-            return value != null;
-        }
-
-        private ulong? GetLastNumericValue(int field)
-        {
-            List<FieldValue> values;
-            if (!valuesByField.TryGetValue(field, out values))
-            {
-                return null;
-            }
-            for (int i = values.Count - 1; i >= 0; i--)
-            {
-                // A non-bytestring value is a numeric value
-                if (values[i].ByteString == null)
-                {
-                    return values[i].Number;
-                }
-            }
-            return null;
-        }
-
-        private ByteString GetLastByteStringValue(int field)
-        {
-            List<FieldValue> values;
-            if (!valuesByField.TryGetValue(field, out values))
-            {
-                return null;
-            }
-            for (int i = values.Count - 1; i >= 0; i--)
-            {
-                if (values[i].ByteString != null)
-                {
-                    return values[i].ByteString;
-                }
-            }
-            return null;
-        }
-
-        /// <summary>
-        /// Reads an unknown field, either parsing it and storing it or skipping it.
-        /// </summary>
-        /// <remarks>
-        /// If the current set of options is empty and we manage to read a field, a new set of options
-        /// will be created and returned. Otherwise, the return value is <c>this</c>. This allows
-        /// us to start with a singleton empty set of options and just create new ones where necessary.
-        /// </remarks>
-        /// <param name="input">Input stream to read from. </param>
-        /// <returns>The resulting set of custom options, either <c>this</c> or a new set.</returns>
-        internal CustomOptions ReadOrSkipUnknownField(CodedInputStream input)
-        {
-            var tag = input.LastTag;
-            var field = WireFormat.GetTagFieldNumber(tag);
-            switch (WireFormat.GetTagWireType(tag))
-            {
-                case WireFormat.WireType.LengthDelimited:
-                    return AddValue(field, new FieldValue(input.ReadBytes()));
-                case WireFormat.WireType.Fixed32:
-                    return AddValue(field, new FieldValue(input.ReadFixed32()));
-                case WireFormat.WireType.Fixed64:
-                    return AddValue(field, new FieldValue(input.ReadFixed64()));
-                case WireFormat.WireType.Varint:
-                    return AddValue(field, new FieldValue(input.ReadRawVarint64()));
-                // For StartGroup, EndGroup or any wire format we don't understand,
-                // just use the normal behavior (call SkipLastField).
-                default:
-                    input.SkipLastField();
-                    return this;
-            }
-        }
-
-        private CustomOptions AddValue(int field, FieldValue value)
-        {
-            var ret = valuesByField.Count == 0 ? new CustomOptions() : this;
-            List<FieldValue> valuesForField;
-            if (!ret.valuesByField.TryGetValue(field, out valuesForField))
-            {
-                // Expect almost all 
-                valuesForField = new List<FieldValue>(1);
-                ret.valuesByField[field] = valuesForField;
-            }
-            valuesForField.Add(value);
-            return ret;
-        }
-
-        /// <summary>
-        /// All field values can be stored as a byte string or a 64-bit integer.
-        /// This struct avoids unnecessary boxing.
-        /// </summary>
-        private struct FieldValue
-        {
-            internal ulong Number { get; }
-            internal ByteString ByteString { get; }
-
-            internal FieldValue(ulong number)
-            {
-                Number = number;
-                ByteString = null;
-            }
-
-            internal FieldValue(ByteString byteString)
-            {
-                Number = 0;
-                ByteString = byteString;
-            }
-        }
-    }
-}
diff --git a/csharp/src/Google.Protobuf/Reflection/Descriptor.cs b/csharp/src/Google.Protobuf/Reflection/Descriptor.cs
index af68fa8..fa138df 100644
--- a/csharp/src/Google.Protobuf/Reflection/Descriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/Descriptor.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/descriptor.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/descriptor.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.Reflection {
 
   /// <summary>Holder for reflection information generated from google/protobuf/descriptor.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal static partial class DescriptorReflection {
 
     #region Descriptor
@@ -37,7 +36,7 @@
             "LnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvEi0KB29wdGlvbnMYCCAB",
             "KAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMSOQoQc291cmNlX2Nv",
             "ZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5m",
-            "bxIOCgZzeW50YXgYDCABKAkiqQUKD0Rlc2NyaXB0b3JQcm90bxIMCgRuYW1l",
+            "bxIOCgZzeW50YXgYDCABKAki8AQKD0Rlc2NyaXB0b3JQcm90bxIMCgRuYW1l",
             "GAEgASgJEjQKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxk",
             "RGVzY3JpcHRvclByb3RvEjgKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5w",
             "cm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bxI1CgtuZXN0ZWRfdHlwZRgD",
@@ -49,136 +48,116 @@
             "b3RvEjAKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2Fn",
             "ZU9wdGlvbnMSRgoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJv",
             "dG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2USFQoNcmVzZXJ2",
-            "ZWRfbmFtZRgKIAMoCRplCg5FeHRlbnNpb25SYW5nZRINCgVzdGFydBgBIAEo",
-            "BRILCgNlbmQYAiABKAUSNwoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90",
-            "b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMaKwoNUmVzZXJ2ZWRSYW5nZRIN",
-            "CgVzdGFydBgBIAEoBRILCgNlbmQYAiABKAUiZwoVRXh0ZW5zaW9uUmFuZ2VP",
-            "cHRpb25zEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2ds",
-            "ZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIivAUK",
-            "FEZpZWxkRGVzY3JpcHRvclByb3RvEgwKBG5hbWUYASABKAkSDgoGbnVtYmVy",
-            "GAMgASgFEjoKBWxhYmVsGAQgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxk",
-            "RGVzY3JpcHRvclByb3RvLkxhYmVsEjgKBHR5cGUYBSABKA4yKi5nb29nbGUu",
-            "cHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIRCgl0eXBlX25h",
-            "bWUYBiABKAkSEAoIZXh0ZW5kZWUYAiABKAkSFQoNZGVmYXVsdF92YWx1ZRgH",
-            "IAEoCRITCgtvbmVvZl9pbmRleBgJIAEoBRIRCglqc29uX25hbWUYCiABKAkS",
-            "LgoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlv",
-            "bnMitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAIS",
-            "DgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQz",
-            "MhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZ",
-            "UEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAK",
-            "DFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQz",
-            "MhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBF",
-            "X1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBAS",
-            "IkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlS",
-            "RUQQAhISCg5MQUJFTF9SRVBFQVRFRBADIlQKFE9uZW9mRGVzY3JpcHRvclBy",
-            "b3RvEgwKBG5hbWUYASABKAkSLgoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5w",
-            "cm90b2J1Zi5PbmVvZk9wdGlvbnMipAIKE0VudW1EZXNjcmlwdG9yUHJvdG8S",
-            "DAoEbmFtZRgBIAEoCRI4CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1",
-            "Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SLQoHb3B0aW9ucxgDIAEoCzIc",
-            "Lmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucxJOCg5yZXNlcnZlZF9yYW5n",
-            "ZRgEIAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3Rv",
-            "LkVudW1SZXNlcnZlZFJhbmdlEhUKDXJlc2VydmVkX25hbWUYBSADKAkaLwoR",
-            "RW51bVJlc2VydmVkUmFuZ2USDQoFc3RhcnQYASABKAUSCwoDZW5kGAIgASgF",
-            "ImwKGEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxIMCgRuYW1lGAEgASgJEg4K",
-            "Bm51bWJlchgCIAEoBRIyCgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3Rv",
-            "YnVmLkVudW1WYWx1ZU9wdGlvbnMikAEKFlNlcnZpY2VEZXNjcmlwdG9yUHJv",
-            "dG8SDAoEbmFtZRgBIAEoCRI2CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJv",
-            "dG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvEjAKB29wdGlvbnMYAyABKAsy",
-            "Hy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMiwQEKFU1ldGhvZERl",
-            "c2NyaXB0b3JQcm90bxIMCgRuYW1lGAEgASgJEhIKCmlucHV0X3R5cGUYAiAB",
-            "KAkSEwoLb3V0cHV0X3R5cGUYAyABKAkSLwoHb3B0aW9ucxgEIAEoCzIeLmdv",
-            "b2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zEh8KEGNsaWVudF9zdHJlYW1p",
-            "bmcYBSABKAg6BWZhbHNlEh8KEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZh",
-            "bHNlIvAFCgtGaWxlT3B0aW9ucxIUCgxqYXZhX3BhY2thZ2UYASABKAkSHAoU",
-            "amF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAkSIgoTamF2YV9tdWx0aXBsZV9m",
-            "aWxlcxgKIAEoCDoFZmFsc2USKQodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5k",
-            "X2hhc2gYFCABKAhCAhgBEiUKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyAB",
-            "KAg6BWZhbHNlEkYKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90",
-            "b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEEhIKCmdvX3Bh",
-            "Y2thZ2UYCyABKAkSIgoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFs",
-            "c2USJAoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZRIiChNw",
-            "eV9nZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZRIjChRwaHBfZ2VuZXJp",
-            "Y19zZXJ2aWNlcxgqIAEoCDoFZmFsc2USGQoKZGVwcmVjYXRlZBgXIAEoCDoF",
-            "ZmFsc2USHwoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoFZmFsc2USGQoRb2Jq",
-            "Y19jbGFzc19wcmVmaXgYJCABKAkSGAoQY3NoYXJwX25hbWVzcGFjZRglIAEo",
-            "CRIUCgxzd2lmdF9wcmVmaXgYJyABKAkSGAoQcGhwX2NsYXNzX3ByZWZpeBgo",
-            "IAEoCRIVCg1waHBfbmFtZXNwYWNlGCkgASgJEkMKFHVuaW50ZXJwcmV0ZWRf",
-            "b3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVk",
-            "T3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0la",
-            "RRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgmECci8gEKDk1l",
-            "c3NhZ2VPcHRpb25zEiYKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgI",
-            "OgVmYWxzZRIuCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIg",
-            "ASgIOgVmYWxzZRIZCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZRIRCgltYXBf",
-            "ZW50cnkYByABKAgSQwoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQu",
-            "Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICA",
-            "AkoECAgQCUoECAkQCiKeAwoMRmllbGRPcHRpb25zEjoKBWN0eXBlGAEgASgO",
-            "MiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5H",
-            "Eg4KBnBhY2tlZBgCIAEoCBI/CgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJv",
-            "dG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMEhMKBGxhenkY",
-            "BSABKAg6BWZhbHNlEhkKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlEhMKBHdl",
-            "YWsYCiABKAg6BWZhbHNlEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMo",
-            "CzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIi8KBUNU",
-            "eXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1",
-            "CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNf",
-            "TlVNQkVSEAIqCQjoBxCAgICAAkoECAQQBSJeCgxPbmVvZk9wdGlvbnMSQwoU",
-            "dW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVm",
-            "LlVuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKTAQoLRW51bU9wdGlv",
-            "bnMSEwoLYWxsb3dfYWxpYXMYAiABKAgSGQoKZGVwcmVjYXRlZBgDIAEoCDoF",
-            "ZmFsc2USQwoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xl",
-            "LnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQ",
-            "BiJ9ChBFbnVtVmFsdWVPcHRpb25zEhkKCmRlcHJlY2F0ZWQYASABKAg6BWZh",
-            "bHNlEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5w",
-            "cm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIiewoOU2Vy",
-            "dmljZU9wdGlvbnMSGQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2USQwoUdW5p",
-            "bnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVu",
-            "aW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKtAgoNTWV0aG9kT3B0aW9u",
-            "cxIZCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZRJfChFpZGVtcG90ZW5jeV9s",
-            "ZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklk",
-            "ZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV04SQwoUdW5pbnRl",
-            "cnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50",
-            "ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9U",
-            "RU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBP",
-            "VEVOVBACKgkI6AcQgICAgAIingIKE1VuaW50ZXJwcmV0ZWRPcHRpb24SOwoE",
-            "bmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0",
-            "aW9uLk5hbWVQYXJ0EhgKEGlkZW50aWZpZXJfdmFsdWUYAyABKAkSGgoScG9z",
-            "aXRpdmVfaW50X3ZhbHVlGAQgASgEEhoKEm5lZ2F0aXZlX2ludF92YWx1ZRgF",
-            "IAEoAxIUCgxkb3VibGVfdmFsdWUYBiABKAESFAoMc3RyaW5nX3ZhbHVlGAcg",
-            "ASgMEhcKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCRozCghOYW1lUGFydBIRCglu",
-            "YW1lX3BhcnQYASACKAkSFAoMaXNfZXh0ZW5zaW9uGAIgAigIItUBCg5Tb3Vy",
-            "Y2VDb2RlSW5mbxI6Cghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1",
-            "Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbhqGAQoITG9jYXRpb24SEAoEcGF0",
-            "aBgBIAMoBUICEAESEAoEc3BhbhgCIAMoBUICEAESGAoQbGVhZGluZ19jb21t",
-            "ZW50cxgDIAEoCRIZChF0cmFpbGluZ19jb21tZW50cxgEIAEoCRIhChlsZWFk",
-            "aW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJIqcBChFHZW5lcmF0ZWRDb2Rl",
-            "SW5mbxJBCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdl",
-            "bmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24aTwoKQW5ub3RhdGlvbhIQCgRw",
-            "YXRoGAEgAygFQgIQARITCgtzb3VyY2VfZmlsZRgCIAEoCRINCgViZWdpbhgD",
-            "IAEoBRILCgNlbmQYBCABKAVCjwEKE2NvbS5nb29nbGUucHJvdG9idWZCEERl",
-            "c2NyaXB0b3JQcm90b3NIAVo+Z2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYv",
-            "cHJvdG9jLWdlbi1nby9kZXNjcmlwdG9yO2Rlc2NyaXB0b3L4AQGiAgNHUEKq",
-            "AhpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbg=="));
+            "ZWRfbmFtZRgKIAMoCRosCg5FeHRlbnNpb25SYW5nZRINCgVzdGFydBgBIAEo",
+            "BRILCgNlbmQYAiABKAUaKwoNUmVzZXJ2ZWRSYW5nZRINCgVzdGFydBgBIAEo",
+            "BRILCgNlbmQYAiABKAUivAUKFEZpZWxkRGVzY3JpcHRvclByb3RvEgwKBG5h",
+            "bWUYASABKAkSDgoGbnVtYmVyGAMgASgFEjoKBWxhYmVsGAQgASgOMisuZ29v",
+            "Z2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsEjgKBHR5",
+            "cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJv",
+            "dG8uVHlwZRIRCgl0eXBlX25hbWUYBiABKAkSEAoIZXh0ZW5kZWUYAiABKAkS",
+            "FQoNZGVmYXVsdF92YWx1ZRgHIAEoCRITCgtvbmVvZl9pbmRleBgJIAEoBRIR",
+            "Cglqc29uX25hbWUYCiABKAkSLgoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5w",
+            "cm90b2J1Zi5GaWVsZE9wdGlvbnMitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQ",
+            "ARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlO",
+            "VDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZ",
+            "UEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkS",
+            "DgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllU",
+            "RVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVf",
+            "U0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQ",
+            "ERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFM",
+            "EAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADIiQK",
+            "FE9uZW9mRGVzY3JpcHRvclByb3RvEgwKBG5hbWUYASABKAkijAEKE0VudW1E",
+            "ZXNjcmlwdG9yUHJvdG8SDAoEbmFtZRgBIAEoCRI4CgV2YWx1ZRgCIAMoCzIp",
+            "Lmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SLQoH",
+            "b3B0aW9ucxgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyJs",
+            "ChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SDAoEbmFtZRgBIAEoCRIOCgZu",
+            "dW1iZXIYAiABKAUSMgoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1",
+            "Zi5FbnVtVmFsdWVPcHRpb25zIpABChZTZXJ2aWNlRGVzY3JpcHRvclByb3Rv",
+            "EgwKBG5hbWUYASABKAkSNgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3Rv",
+            "YnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bxIwCgdvcHRpb25zGAMgASgLMh8u",
+            "Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIsEBChVNZXRob2REZXNj",
+            "cmlwdG9yUHJvdG8SDAoEbmFtZRgBIAEoCRISCgppbnB1dF90eXBlGAIgASgJ",
+            "EhMKC291dHB1dF90eXBlGAMgASgJEi8KB29wdGlvbnMYBCABKAsyHi5nb29n",
+            "bGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxIfChBjbGllbnRfc3RyZWFtaW5n",
+            "GAUgASgIOgVmYWxzZRIfChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxz",
+            "ZSKHBQoLRmlsZU9wdGlvbnMSFAoMamF2YV9wYWNrYWdlGAEgASgJEhwKFGph",
+            "dmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJEiIKE2phdmFfbXVsdGlwbGVfZmls",
+            "ZXMYCiABKAg6BWZhbHNlEiwKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9o",
+            "YXNoGBQgASgIOgVmYWxzZRIlChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsg",
+            "ASgIOgVmYWxzZRJGCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJv",
+            "dG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRBISCgpnb19w",
+            "YWNrYWdlGAsgASgJEiIKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZh",
+            "bHNlEiQKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2USIgoT",
+            "cHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2USGQoKZGVwcmVjYXRl",
+            "ZBgXIAEoCDoFZmFsc2USHwoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoFZmFs",
+            "c2USGQoRb2JqY19jbGFzc19wcmVmaXgYJCABKAkSGAoQY3NoYXJwX25hbWVz",
+            "cGFjZRglIAEoCRJDChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5n",
+            "b29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiI6CgxPcHRpbWl6",
+            "ZU1vZGUSCQoFU1BFRUQQARINCglDT0RFX1NJWkUQAhIQCgxMSVRFX1JVTlRJ",
+            "TUUQAyoJCOgHEICAgIACSgQIJhAnIuYBCg5NZXNzYWdlT3B0aW9ucxImChdt",
+            "ZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2USLgofbm9fc3Rh",
+            "bmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2USGQoKZGVw",
+            "cmVjYXRlZBgDIAEoCDoFZmFsc2USEQoJbWFwX2VudHJ5GAcgASgIEkMKFHVu",
+            "aW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5V",
+            "bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAMKDEZpZWxkT3B0aW9u",
+            "cxI6CgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlv",
+            "bnMuQ1R5cGU6BlNUUklORxIOCgZwYWNrZWQYAiABKAgSPwoGanN0eXBlGAYg",
+            "ASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpT",
+            "X05PUk1BTBITCgRsYXp5GAUgASgIOgVmYWxzZRIZCgpkZXByZWNhdGVkGAMg",
+            "ASgIOgVmYWxzZRITCgR3ZWFrGAogASgIOgVmYWxzZRJDChR1bmludGVycHJl",
+            "dGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnBy",
+            "ZXRlZE9wdGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoM",
+            "U1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpT",
+            "X1NUUklORxABEg0KCUpTX05VTUJFUhACKgkI6AcQgICAgAIijQEKC0VudW1P",
+            "cHRpb25zEhMKC2FsbG93X2FsaWFzGAIgASgIEhkKCmRlcHJlY2F0ZWQYAyAB",
+            "KAg6BWZhbHNlEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdv",
+            "b2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi",
+            "fQoQRW51bVZhbHVlT3B0aW9ucxIZCgpkZXByZWNhdGVkGAEgASgIOgVmYWxz",
+            "ZRJDChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJv",
+            "dG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACInsKDlNlcnZp",
+            "Y2VPcHRpb25zEhkKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlEkMKFHVuaW50",
+            "ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5Vbmlu",
+            "dGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIiegoNTWV0aG9kT3B0aW9ucxIZ",
+            "CgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZRJDChR1bmludGVycHJldGVkX29w",
+            "dGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9w",
+            "dGlvbioJCOgHEICAgIACIp4CChNVbmludGVycHJldGVkT3B0aW9uEjsKBG5h",
+            "bWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlv",
+            "bi5OYW1lUGFydBIYChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJEhoKEnBvc2l0",
+            "aXZlX2ludF92YWx1ZRgEIAEoBBIaChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSAB",
+            "KAMSFAoMZG91YmxlX3ZhbHVlGAYgASgBEhQKDHN0cmluZ192YWx1ZRgHIAEo",
+            "DBIXCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAkaMwoITmFtZVBhcnQSEQoJbmFt",
+            "ZV9wYXJ0GAEgAigJEhQKDGlzX2V4dGVuc2lvbhgCIAIoCCLVAQoOU291cmNl",
+            "Q29kZUluZm8SOgoIbG9jYXRpb24YASADKAsyKC5nb29nbGUucHJvdG9idWYu",
+            "U291cmNlQ29kZUluZm8uTG9jYXRpb24ahgEKCExvY2F0aW9uEhAKBHBhdGgY",
+            "ASADKAVCAhABEhAKBHNwYW4YAiADKAVCAhABEhgKEGxlYWRpbmdfY29tbWVu",
+            "dHMYAyABKAkSGQoRdHJhaWxpbmdfY29tbWVudHMYBCABKAkSIQoZbGVhZGlu",
+            "Z19kZXRhY2hlZF9jb21tZW50cxgGIAMoCSKnAQoRR2VuZXJhdGVkQ29kZUlu",
+            "Zm8SQQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5l",
+            "cmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uGk8KCkFubm90YXRpb24SEAoEcGF0",
+            "aBgBIAMoBUICEAESEwoLc291cmNlX2ZpbGUYAiABKAkSDQoFYmVnaW4YAyAB",
+            "KAUSCwoDZW5kGAQgASgFQlgKE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2Ny",
+            "aXB0b3JQcm90b3NIAVoKZGVzY3JpcHRvcqICA0dQQqoCGkdvb2dsZS5Qcm90",
+            "b2J1Zi5SZWZsZWN0aW9u"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileDescriptorSet), global::Google.Protobuf.Reflection.FileDescriptorSet.Parser, new[]{ "File" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileDescriptorProto), global::Google.Protobuf.Reflection.FileDescriptorProto.Parser, new[]{ "Name", "Package", "Dependency", "PublicDependency", "WeakDependency", "MessageType", "EnumType", "Service", "Extension", "Options", "SourceCodeInfo", "Syntax" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto), global::Google.Protobuf.Reflection.DescriptorProto.Parser, new[]{ "Name", "Field", "Extension", "NestedType", "EnumType", "ExtensionRange", "OneofDecl", "Options", "ReservedRange", "ReservedName" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange), global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange.Parser, new[]{ "Start", "End", "Options" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto), global::Google.Protobuf.Reflection.DescriptorProto.Parser, new[]{ "Name", "Field", "Extension", "NestedType", "EnumType", "ExtensionRange", "OneofDecl", "Options", "ReservedRange", "ReservedName" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange), global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange.Parser, new[]{ "Start", "End" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange), global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange.Parser, new[]{ "Start", "End" }, null, null, null)}),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.ExtensionRangeOptions), global::Google.Protobuf.Reflection.ExtensionRangeOptions.Parser, new[]{ "UninterpretedOption" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FieldDescriptorProto), global::Google.Protobuf.Reflection.FieldDescriptorProto.Parser, new[]{ "Name", "Number", "Label", "Type", "TypeName", "Extendee", "DefaultValue", "OneofIndex", "JsonName", "Options" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Type), typeof(global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Label) }, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.OneofDescriptorProto), global::Google.Protobuf.Reflection.OneofDescriptorProto.Parser, new[]{ "Name", "Options" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.EnumDescriptorProto), global::Google.Protobuf.Reflection.EnumDescriptorProto.Parser, new[]{ "Name", "Value", "Options", "ReservedRange", "ReservedName" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange), global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange.Parser, new[]{ "Start", "End" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.OneofDescriptorProto), global::Google.Protobuf.Reflection.OneofDescriptorProto.Parser, new[]{ "Name" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.EnumDescriptorProto), global::Google.Protobuf.Reflection.EnumDescriptorProto.Parser, new[]{ "Name", "Value", "Options" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.EnumValueDescriptorProto), global::Google.Protobuf.Reflection.EnumValueDescriptorProto.Parser, new[]{ "Name", "Number", "Options" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.ServiceDescriptorProto), global::Google.Protobuf.Reflection.ServiceDescriptorProto.Parser, new[]{ "Name", "Method", "Options" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.MethodDescriptorProto), global::Google.Protobuf.Reflection.MethodDescriptorProto.Parser, new[]{ "Name", "InputType", "OutputType", "Options", "ClientStreaming", "ServerStreaming" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileOptions), global::Google.Protobuf.Reflection.FileOptions.Parser, new[]{ "JavaPackage", "JavaOuterClassname", "JavaMultipleFiles", "JavaGenerateEqualsAndHash", "JavaStringCheckUtf8", "OptimizeFor", "GoPackage", "CcGenericServices", "JavaGenericServices", "PyGenericServices", "PhpGenericServices", "Deprecated", "CcEnableArenas", "ObjcClassPrefix", "CsharpNamespace", "SwiftPrefix", "PhpClassPrefix", "PhpNamespace", "UninterpretedOption" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.FileOptions.Types.OptimizeMode) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileOptions), global::Google.Protobuf.Reflection.FileOptions.Parser, new[]{ "JavaPackage", "JavaOuterClassname", "JavaMultipleFiles", "JavaGenerateEqualsAndHash", "JavaStringCheckUtf8", "OptimizeFor", "GoPackage", "CcGenericServices", "JavaGenericServices", "PyGenericServices", "Deprecated", "CcEnableArenas", "ObjcClassPrefix", "CsharpNamespace", "UninterpretedOption" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.FileOptions.Types.OptimizeMode) }, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.MessageOptions), global::Google.Protobuf.Reflection.MessageOptions.Parser, new[]{ "MessageSetWireFormat", "NoStandardDescriptorAccessor", "Deprecated", "MapEntry", "UninterpretedOption" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FieldOptions), global::Google.Protobuf.Reflection.FieldOptions.Parser, new[]{ "Ctype", "Packed", "Jstype", "Lazy", "Deprecated", "Weak", "UninterpretedOption" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.FieldOptions.Types.CType), typeof(global::Google.Protobuf.Reflection.FieldOptions.Types.JSType) }, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.OneofOptions), global::Google.Protobuf.Reflection.OneofOptions.Parser, new[]{ "UninterpretedOption" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.EnumOptions), global::Google.Protobuf.Reflection.EnumOptions.Parser, new[]{ "AllowAlias", "Deprecated", "UninterpretedOption" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.EnumValueOptions), global::Google.Protobuf.Reflection.EnumValueOptions.Parser, new[]{ "Deprecated", "UninterpretedOption" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.ServiceOptions), global::Google.Protobuf.Reflection.ServiceOptions.Parser, new[]{ "Deprecated", "UninterpretedOption" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.MethodOptions), global::Google.Protobuf.Reflection.MethodOptions.Parser, new[]{ "Deprecated", "IdempotencyLevel", "UninterpretedOption" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.MethodOptions.Types.IdempotencyLevel) }, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.MethodOptions), global::Google.Protobuf.Reflection.MethodOptions.Parser, new[]{ "Deprecated", "UninterpretedOption" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.UninterpretedOption), global::Google.Protobuf.Reflection.UninterpretedOption.Parser, new[]{ "Name", "IdentifierValue", "PositiveIntValue", "NegativeIntValue", "DoubleValue", "StringValue", "AggregateValue" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart), global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart.Parser, new[]{ "NamePart_", "IsExtension" }, null, null, null)}),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.SourceCodeInfo), global::Google.Protobuf.Reflection.SourceCodeInfo.Parser, new[]{ "Location" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location), global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location.Parser, new[]{ "Path", "Span", "LeadingComments", "TrailingComments", "LeadingDetachedComments" }, null, null, null)}),
             new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo), global::Google.Protobuf.Reflection.GeneratedCodeInfo.Parser, new[]{ "Annotation" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation), global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Parser, new[]{ "Path", "SourceFile", "Begin", "End" }, null, null, null)})
@@ -189,39 +168,32 @@
   }
   #region Messages
   /// <summary>
-  /// The protocol compiler can output a FileDescriptorSet containing the .proto
-  /// files it parses.
+  ///  The protocol compiler can output a FileDescriptorSet containing the .proto
+  ///  files it parses.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class FileDescriptorSet : pb::IMessage<FileDescriptorSet> {
     private static readonly pb::MessageParser<FileDescriptorSet> _parser = new pb::MessageParser<FileDescriptorSet>(() => new FileDescriptorSet());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FileDescriptorSet> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileDescriptorSet() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileDescriptorSet(FileDescriptorSet other) : this() {
       file_ = other.file_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileDescriptorSet Clone() {
       return new FileDescriptorSet(this);
     }
@@ -231,17 +203,14 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.FileDescriptorProto> _repeated_file_codec
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Reflection.FileDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.FileDescriptorProto> file_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.FileDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.FileDescriptorProto> File {
       get { return file_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FileDescriptorSet);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FileDescriptorSet other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -250,58 +219,42 @@
         return true;
       }
       if(!file_.Equals(other.file_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= file_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       file_.WriteTo(output, _repeated_file_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += file_.CalculateSize(_repeated_file_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FileDescriptorSet other) {
       if (other == null) {
         return;
       }
       file_.Add(other.file_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             file_.AddEntriesFrom(input, _repeated_file_codec);
@@ -314,32 +267,27 @@
   }
 
   /// <summary>
-  /// Describes a complete .proto file.
+  ///  Describes a complete .proto file.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class FileDescriptorProto : pb::IMessage<FileDescriptorProto> {
     private static readonly pb::MessageParser<FileDescriptorProto> _parser = new pb::MessageParser<FileDescriptorProto>(() => new FileDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FileDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileDescriptorProto(FileDescriptorProto other) : this() {
       name_ = other.name_;
       package_ = other.package_;
@@ -353,10 +301,8 @@
       Options = other.options_ != null ? other.Options.Clone() : null;
       SourceCodeInfo = other.sourceCodeInfo_ != null ? other.SourceCodeInfo.Clone() : null;
       syntax_ = other.syntax_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileDescriptorProto Clone() {
       return new FileDescriptorProto(this);
     }
@@ -365,9 +311,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// file name, relative to root of source tree
+    ///  file name, relative to root of source tree
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -379,9 +324,8 @@
     public const int PackageFieldNumber = 2;
     private string package_ = "";
     /// <summary>
-    /// e.g. "foo", "foo.bar", etc.
+    ///  e.g. "foo", "foo.bar", etc.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Package {
       get { return package_; }
       set {
@@ -395,9 +339,8 @@
         = pb::FieldCodec.ForString(26);
     private readonly pbc::RepeatedField<string> dependency_ = new pbc::RepeatedField<string>();
     /// <summary>
-    /// Names of files imported by this file.
+    ///  Names of files imported by this file.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> Dependency {
       get { return dependency_; }
     }
@@ -408,9 +351,8 @@
         = pb::FieldCodec.ForInt32(80);
     private readonly pbc::RepeatedField<int> publicDependency_ = new pbc::RepeatedField<int>();
     /// <summary>
-    /// Indexes of the public imported files in the dependency list above.
+    ///  Indexes of the public imported files in the dependency list above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> PublicDependency {
       get { return publicDependency_; }
     }
@@ -421,10 +363,9 @@
         = pb::FieldCodec.ForInt32(88);
     private readonly pbc::RepeatedField<int> weakDependency_ = new pbc::RepeatedField<int>();
     /// <summary>
-    /// Indexes of the weak imported files in the dependency list.
-    /// For Google-internal migration only. Do not use.
+    ///  Indexes of the weak imported files in the dependency list.
+    ///  For Google-internal migration only. Do not use.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> WeakDependency {
       get { return weakDependency_; }
     }
@@ -435,9 +376,8 @@
         = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.Reflection.DescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto> messageType_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto>();
     /// <summary>
-    /// All top-level definitions in this file.
+    ///  All top-level definitions in this file.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto> MessageType {
       get { return messageType_; }
     }
@@ -447,7 +387,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.EnumDescriptorProto> _repeated_enumType_codec
         = pb::FieldCodec.ForMessage(42, global::Google.Protobuf.Reflection.EnumDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto> enumType_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto> EnumType {
       get { return enumType_; }
     }
@@ -457,7 +396,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.ServiceDescriptorProto> _repeated_service_codec
         = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.Reflection.ServiceDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.ServiceDescriptorProto> service_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.ServiceDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.ServiceDescriptorProto> Service {
       get { return service_; }
     }
@@ -467,7 +405,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.FieldDescriptorProto> _repeated_extension_codec
         = pb::FieldCodec.ForMessage(58, global::Google.Protobuf.Reflection.FieldDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto> extension_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto> Extension {
       get { return extension_; }
     }
@@ -475,7 +412,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 8;
     private global::Google.Protobuf.Reflection.FileOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FileOptions Options {
       get { return options_; }
       set {
@@ -487,12 +423,11 @@
     public const int SourceCodeInfoFieldNumber = 9;
     private global::Google.Protobuf.Reflection.SourceCodeInfo sourceCodeInfo_;
     /// <summary>
-    /// This field contains optional information about the original source code.
-    /// You may safely remove this entire field without harming runtime
-    /// functionality of the descriptors -- the information is needed only by
-    /// development tools.
+    ///  This field contains optional information about the original source code.
+    ///  You may safely remove this entire field without harming runtime
+    ///  functionality of the descriptors -- the information is needed only by
+    ///  development tools.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.SourceCodeInfo SourceCodeInfo {
       get { return sourceCodeInfo_; }
       set {
@@ -504,10 +439,9 @@
     public const int SyntaxFieldNumber = 12;
     private string syntax_ = "";
     /// <summary>
-    /// The syntax of the proto file.
-    /// The supported values are "proto2" and "proto3".
+    ///  The syntax of the proto file.
+    ///  The supported values are "proto2" and "proto3".
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Syntax {
       get { return syntax_; }
       set {
@@ -515,12 +449,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FileDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FileDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -540,10 +472,9 @@
       if (!object.Equals(Options, other.Options)) return false;
       if (!object.Equals(SourceCodeInfo, other.SourceCodeInfo)) return false;
       if (Syntax != other.Syntax) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -558,18 +489,13 @@
       if (options_ != null) hash ^= Options.GetHashCode();
       if (sourceCodeInfo_ != null) hash ^= SourceCodeInfo.GetHashCode();
       if (Syntax.Length != 0) hash ^= Syntax.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -598,12 +524,8 @@
         output.WriteRawTag(98);
         output.WriteString(Syntax);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -628,13 +550,9 @@
       if (Syntax.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Syntax);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FileDescriptorProto other) {
       if (other == null) {
         return;
@@ -667,16 +585,14 @@
       if (other.Syntax.Length != 0) {
         Syntax = other.Syntax;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -741,32 +657,27 @@
   }
 
   /// <summary>
-  /// Describes a message type.
+  ///  Describes a message type.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class DescriptorProto : pb::IMessage<DescriptorProto> {
     private static readonly pb::MessageParser<DescriptorProto> _parser = new pb::MessageParser<DescriptorProto>(() => new DescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<DescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DescriptorProto(DescriptorProto other) : this() {
       name_ = other.name_;
       field_ = other.field_.Clone();
@@ -778,10 +689,8 @@
       Options = other.options_ != null ? other.Options.Clone() : null;
       reservedRange_ = other.reservedRange_.Clone();
       reservedName_ = other.reservedName_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DescriptorProto Clone() {
       return new DescriptorProto(this);
     }
@@ -789,7 +698,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -802,7 +710,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.FieldDescriptorProto> _repeated_field_codec
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.Reflection.FieldDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto> field_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto> Field {
       get { return field_; }
     }
@@ -812,7 +719,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.FieldDescriptorProto> _repeated_extension_codec
         = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.Reflection.FieldDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto> extension_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.FieldDescriptorProto> Extension {
       get { return extension_; }
     }
@@ -822,7 +728,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.DescriptorProto> _repeated_nestedType_codec
         = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.Reflection.DescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto> nestedType_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto> NestedType {
       get { return nestedType_; }
     }
@@ -832,7 +737,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.EnumDescriptorProto> _repeated_enumType_codec
         = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.Reflection.EnumDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto> enumType_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto> EnumType {
       get { return enumType_; }
     }
@@ -842,7 +746,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange> _repeated_extensionRange_codec
         = pb::FieldCodec.ForMessage(42, global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange> extensionRange_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange> ExtensionRange {
       get { return extensionRange_; }
     }
@@ -852,7 +755,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.OneofDescriptorProto> _repeated_oneofDecl_codec
         = pb::FieldCodec.ForMessage(66, global::Google.Protobuf.Reflection.OneofDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.OneofDescriptorProto> oneofDecl_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.OneofDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.OneofDescriptorProto> OneofDecl {
       get { return oneofDecl_; }
     }
@@ -860,7 +762,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 7;
     private global::Google.Protobuf.Reflection.MessageOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.MessageOptions Options {
       get { return options_; }
       set {
@@ -873,7 +774,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange> _repeated_reservedRange_codec
         = pb::FieldCodec.ForMessage(74, global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange> reservedRange_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange> ReservedRange {
       get { return reservedRange_; }
     }
@@ -884,20 +784,17 @@
         = pb::FieldCodec.ForString(82);
     private readonly pbc::RepeatedField<string> reservedName_ = new pbc::RepeatedField<string>();
     /// <summary>
-    /// Reserved field names, which may not be used by fields in the same message.
-    /// A given name may only be reserved once.
+    ///  Reserved field names, which may not be used by fields in the same message.
+    ///  A given name may only be reserved once.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> ReservedName {
       get { return reservedName_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as DescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(DescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -915,10 +812,9 @@
       if (!object.Equals(Options, other.Options)) return false;
       if(!reservedRange_.Equals(other.reservedRange_)) return false;
       if(!reservedName_.Equals(other.reservedName_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -931,18 +827,13 @@
       if (options_ != null) hash ^= Options.GetHashCode();
       hash ^= reservedRange_.GetHashCode();
       hash ^= reservedName_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -960,12 +851,8 @@
       oneofDecl_.WriteTo(output, _repeated_oneofDecl_codec);
       reservedRange_.WriteTo(output, _repeated_reservedRange_codec);
       reservedName_.WriteTo(output, _repeated_reservedName_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -982,13 +869,9 @@
       }
       size += reservedRange_.CalculateSize(_repeated_reservedRange_codec);
       size += reservedName_.CalculateSize(_repeated_reservedName_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(DescriptorProto other) {
       if (other == null) {
         return;
@@ -1010,16 +893,14 @@
       }
       reservedRange_.Add(other.reservedRange_);
       reservedName_.Add(other.reservedName_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -1070,40 +951,32 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the DescriptorProto message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       internal sealed partial class ExtensionRange : pb::IMessage<ExtensionRange> {
         private static readonly pb::MessageParser<ExtensionRange> _parser = new pb::MessageParser<ExtensionRange>(() => new ExtensionRange());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<ExtensionRange> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.Reflection.DescriptorProto.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public ExtensionRange() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public ExtensionRange(ExtensionRange other) : this() {
           start_ = other.start_;
           end_ = other.end_;
-          Options = other.options_ != null ? other.Options.Clone() : null;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public ExtensionRange Clone() {
           return new ExtensionRange(this);
         }
@@ -1111,7 +984,6 @@
         /// <summary>Field number for the "start" field.</summary>
         public const int StartFieldNumber = 1;
         private int start_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int Start {
           get { return start_; }
           set {
@@ -1122,7 +994,6 @@
         /// <summary>Field number for the "end" field.</summary>
         public const int EndFieldNumber = 2;
         private int end_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int End {
           get { return end_; }
           set {
@@ -1130,23 +1001,10 @@
           }
         }
 
-        /// <summary>Field number for the "options" field.</summary>
-        public const int OptionsFieldNumber = 3;
-        private global::Google.Protobuf.Reflection.ExtensionRangeOptions options_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public global::Google.Protobuf.Reflection.ExtensionRangeOptions Options {
-          get { return options_; }
-          set {
-            options_ = value;
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as ExtensionRange);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(ExtensionRange other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -1156,28 +1014,20 @@
           }
           if (Start != other.Start) return false;
           if (End != other.End) return false;
-          if (!object.Equals(Options, other.Options)) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           if (Start != 0) hash ^= Start.GetHashCode();
           if (End != 0) hash ^= End.GetHashCode();
-          if (options_ != null) hash ^= Options.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           if (Start != 0) {
             output.WriteRawTag(8);
@@ -1187,16 +1037,8 @@
             output.WriteRawTag(16);
             output.WriteInt32(End);
           }
-          if (options_ != null) {
-            output.WriteRawTag(26);
-            output.WriteMessage(Options);
-          }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           if (Start != 0) {
@@ -1205,16 +1047,9 @@
           if (End != 0) {
             size += 1 + pb::CodedOutputStream.ComputeInt32Size(End);
           }
-          if (options_ != null) {
-            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Options);
-          }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(ExtensionRange other) {
           if (other == null) {
             return;
@@ -1225,22 +1060,14 @@
           if (other.End != 0) {
             End = other.End;
           }
-          if (other.options_ != null) {
-            if (options_ == null) {
-              options_ = new global::Google.Protobuf.Reflection.ExtensionRangeOptions();
-            }
-            Options.MergeFrom(other.Options);
-          }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 8: {
                 Start = input.ReadInt32();
@@ -1250,13 +1077,6 @@
                 End = input.ReadInt32();
                 break;
               }
-              case 26: {
-                if (options_ == null) {
-                  options_ = new global::Google.Protobuf.Reflection.ExtensionRangeOptions();
-                }
-                input.ReadMessage(options_);
-                break;
-              }
             }
           }
         }
@@ -1264,41 +1084,34 @@
       }
 
       /// <summary>
-      /// Range of reserved tag numbers. Reserved tag numbers may not be used by
-      /// fields or extension ranges in the same message. Reserved ranges may
-      /// not overlap.
+      ///  Range of reserved tag numbers. Reserved tag numbers may not be used by
+      ///  fields or extension ranges in the same message. Reserved ranges may
+      ///  not overlap.
       /// </summary>
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       internal sealed partial class ReservedRange : pb::IMessage<ReservedRange> {
         private static readonly pb::MessageParser<ReservedRange> _parser = new pb::MessageParser<ReservedRange>(() => new ReservedRange());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<ReservedRange> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.Reflection.DescriptorProto.Descriptor.NestedTypes[1]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public ReservedRange() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public ReservedRange(ReservedRange other) : this() {
           start_ = other.start_;
           end_ = other.end_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public ReservedRange Clone() {
           return new ReservedRange(this);
         }
@@ -1307,9 +1120,8 @@
         public const int StartFieldNumber = 1;
         private int start_;
         /// <summary>
-        /// Inclusive.
+        ///  Inclusive.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int Start {
           get { return start_; }
           set {
@@ -1321,9 +1133,8 @@
         public const int EndFieldNumber = 2;
         private int end_;
         /// <summary>
-        /// Exclusive.
+        ///  Exclusive.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int End {
           get { return end_; }
           set {
@@ -1331,12 +1142,10 @@
           }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as ReservedRange);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(ReservedRange other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -1346,26 +1155,20 @@
           }
           if (Start != other.Start) return false;
           if (End != other.End) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           if (Start != 0) hash ^= Start.GetHashCode();
           if (End != 0) hash ^= End.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           if (Start != 0) {
             output.WriteRawTag(8);
@@ -1375,12 +1178,8 @@
             output.WriteRawTag(16);
             output.WriteInt32(End);
           }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           if (Start != 0) {
@@ -1389,13 +1188,9 @@
           if (End != 0) {
             size += 1 + pb::CodedOutputStream.ComputeInt32Size(End);
           }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(ReservedRange other) {
           if (other == null) {
             return;
@@ -1406,16 +1201,14 @@
           if (other.End != 0) {
             End = other.End;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 8: {
                 Start = input.ReadInt32();
@@ -1436,157 +1229,28 @@
 
   }
 
-  internal sealed partial class ExtensionRangeOptions : pb::IMessage<ExtensionRangeOptions> {
-    private static readonly pb::MessageParser<ExtensionRangeOptions> _parser = new pb::MessageParser<ExtensionRangeOptions>(() => new ExtensionRangeOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<ExtensionRangeOptions> Parser { get { return _parser; } }
+  /// <summary>
+  ///  Describes a field within a message.
+  /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  internal sealed partial class FieldDescriptorProto : pb::IMessage<FieldDescriptorProto> {
+    private static readonly pb::MessageParser<FieldDescriptorProto> _parser = new pb::MessageParser<FieldDescriptorProto>(() => new FieldDescriptorProto());
+    public static pb::MessageParser<FieldDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ExtensionRangeOptions() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ExtensionRangeOptions(ExtensionRangeOptions other) : this() {
-      uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public ExtensionRangeOptions Clone() {
-      return new ExtensionRangeOptions(this);
-    }
-
-    /// <summary>Field number for the "uninterpreted_option" field.</summary>
-    public const int UninterpretedOptionFieldNumber = 999;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.UninterpretedOption> _repeated_uninterpretedOption_codec
-        = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
-    /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
-      get { return uninterpretedOption_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as ExtensionRangeOptions);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(ExtensionRangeOptions other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(ExtensionRangeOptions other) {
-      if (other == null) {
-        return;
-      }
-      uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-            break;
-          case 7994: {
-            uninterpretedOption_.AddEntriesFrom(input, _repeated_uninterpretedOption_codec);
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
-  /// <summary>
-  /// Describes a field within a message.
-  /// </summary>
-  internal sealed partial class FieldDescriptorProto : pb::IMessage<FieldDescriptorProto> {
-    private static readonly pb::MessageParser<FieldDescriptorProto> _parser = new pb::MessageParser<FieldDescriptorProto>(() => new FieldDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<FieldDescriptorProto> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[4]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldDescriptorProto(FieldDescriptorProto other) : this() {
       name_ = other.name_;
       number_ = other.number_;
@@ -1598,10 +1262,8 @@
       oneofIndex_ = other.oneofIndex_;
       jsonName_ = other.jsonName_;
       Options = other.options_ != null ? other.Options.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldDescriptorProto Clone() {
       return new FieldDescriptorProto(this);
     }
@@ -1609,7 +1271,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -1620,7 +1281,6 @@
     /// <summary>Field number for the "number" field.</summary>
     public const int NumberFieldNumber = 3;
     private int number_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Number {
       get { return number_; }
       set {
@@ -1631,7 +1291,6 @@
     /// <summary>Field number for the "label" field.</summary>
     public const int LabelFieldNumber = 4;
     private global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Label label_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Label Label {
       get { return label_; }
       set {
@@ -1643,10 +1302,9 @@
     public const int TypeFieldNumber = 5;
     private global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Type type_ = 0;
     /// <summary>
-    /// If type_name is set, this need not be set.  If both this and type_name
-    /// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+    ///  If type_name is set, this need not be set.  If both this and type_name
+    ///  are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FieldDescriptorProto.Types.Type Type {
       get { return type_; }
       set {
@@ -1658,13 +1316,12 @@
     public const int TypeNameFieldNumber = 6;
     private string typeName_ = "";
     /// <summary>
-    /// For message and enum types, this is the name of the type.  If the name
-    /// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-    /// rules are used to find the type (i.e. first the nested types within this
-    /// message are searched, then within the parent, on up to the root
-    /// namespace).
+    ///  For message and enum types, this is the name of the type.  If the name
+    ///  starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
+    ///  rules are used to find the type (i.e. first the nested types within this
+    ///  message are searched, then within the parent, on up to the root
+    ///  namespace).
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string TypeName {
       get { return typeName_; }
       set {
@@ -1676,10 +1333,9 @@
     public const int ExtendeeFieldNumber = 2;
     private string extendee_ = "";
     /// <summary>
-    /// For extensions, this is the name of the type being extended.  It is
-    /// resolved in the same manner as type_name.
+    ///  For extensions, this is the name of the type being extended.  It is
+    ///  resolved in the same manner as type_name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Extendee {
       get { return extendee_; }
       set {
@@ -1691,13 +1347,12 @@
     public const int DefaultValueFieldNumber = 7;
     private string defaultValue_ = "";
     /// <summary>
-    /// For numeric types, contains the original text representation of the value.
-    /// For booleans, "true" or "false".
-    /// For strings, contains the default text contents (not escaped in any way).
-    /// For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-    /// TODO(kenton):  Base-64 encode?
+    ///  For numeric types, contains the original text representation of the value.
+    ///  For booleans, "true" or "false".
+    ///  For strings, contains the default text contents (not escaped in any way).
+    ///  For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
+    ///  TODO(kenton):  Base-64 encode?
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string DefaultValue {
       get { return defaultValue_; }
       set {
@@ -1709,10 +1364,9 @@
     public const int OneofIndexFieldNumber = 9;
     private int oneofIndex_;
     /// <summary>
-    /// If set, gives the index of a oneof in the containing type's oneof_decl
-    /// list.  This field is a member of that oneof.
+    ///  If set, gives the index of a oneof in the containing type's oneof_decl
+    ///  list.  This field is a member of that oneof.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int OneofIndex {
       get { return oneofIndex_; }
       set {
@@ -1724,12 +1378,11 @@
     public const int JsonNameFieldNumber = 10;
     private string jsonName_ = "";
     /// <summary>
-    /// JSON name of this field. The value is set by protocol compiler. If the
-    /// user has set a "json_name" option on this field, that option's value
-    /// will be used. Otherwise, it's deduced from the field's name by converting
-    /// it to camelCase.
+    ///  JSON name of this field. The value is set by protocol compiler. If the
+    ///  user has set a "json_name" option on this field, that option's value
+    ///  will be used. Otherwise, it's deduced from the field's name by converting
+    ///  it to camelCase.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string JsonName {
       get { return jsonName_; }
       set {
@@ -1740,7 +1393,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 8;
     private global::Google.Protobuf.Reflection.FieldOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FieldOptions Options {
       get { return options_; }
       set {
@@ -1748,12 +1400,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FieldDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FieldDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1771,10 +1421,9 @@
       if (OneofIndex != other.OneofIndex) return false;
       if (JsonName != other.JsonName) return false;
       if (!object.Equals(Options, other.Options)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -1787,18 +1436,13 @@
       if (OneofIndex != 0) hash ^= OneofIndex.GetHashCode();
       if (JsonName.Length != 0) hash ^= JsonName.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -1840,12 +1484,8 @@
         output.WriteRawTag(82);
         output.WriteString(JsonName);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -1878,13 +1518,9 @@
       if (options_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Options);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FieldDescriptorProto other) {
       if (other == null) {
         return;
@@ -1922,16 +1558,14 @@
         }
         Options.MergeFrom(other.Options);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -1982,24 +1616,24 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the FieldDescriptorProto message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       internal enum Type {
         /// <summary>
-        /// 0 is reserved for errors.
-        /// Order is weird for historical reasons.
+        ///  0 is reserved for errors.
+        ///  Order is weird for historical reasons.
         /// </summary>
         [pbr::OriginalName("TYPE_DOUBLE")] Double = 1,
         [pbr::OriginalName("TYPE_FLOAT")] Float = 2,
         /// <summary>
-        /// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-        /// negative values are likely.
+        ///  Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
+        ///  negative values are likely.
         /// </summary>
         [pbr::OriginalName("TYPE_INT64")] Int64 = 3,
         [pbr::OriginalName("TYPE_UINT64")] Uint64 = 4,
         /// <summary>
-        /// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-        /// negative values are likely.
+        ///  Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
+        ///  negative values are likely.
         /// </summary>
         [pbr::OriginalName("TYPE_INT32")] Int32 = 5,
         [pbr::OriginalName("TYPE_FIXED64")] Fixed64 = 6,
@@ -2007,18 +1641,15 @@
         [pbr::OriginalName("TYPE_BOOL")] Bool = 8,
         [pbr::OriginalName("TYPE_STRING")] String = 9,
         /// <summary>
-        /// Tag-delimited aggregate.
-        /// Group type is deprecated and not supported in proto3. However, Proto3
-        /// implementations should still be able to parse the group wire format and
-        /// treat group fields as unknown fields.
+        ///  Tag-delimited aggregate.
         /// </summary>
         [pbr::OriginalName("TYPE_GROUP")] Group = 10,
         /// <summary>
-        /// Length-delimited aggregate.
+        ///  Length-delimited aggregate.
         /// </summary>
         [pbr::OriginalName("TYPE_MESSAGE")] Message = 11,
         /// <summary>
-        /// New in version 2.
+        ///  New in version 2.
         /// </summary>
         [pbr::OriginalName("TYPE_BYTES")] Bytes = 12,
         [pbr::OriginalName("TYPE_UINT32")] Uint32 = 13,
@@ -2026,21 +1657,24 @@
         [pbr::OriginalName("TYPE_SFIXED32")] Sfixed32 = 15,
         [pbr::OriginalName("TYPE_SFIXED64")] Sfixed64 = 16,
         /// <summary>
-        /// Uses ZigZag encoding.
+        ///  Uses ZigZag encoding.
         /// </summary>
         [pbr::OriginalName("TYPE_SINT32")] Sint32 = 17,
         /// <summary>
-        /// Uses ZigZag encoding.
+        ///  Uses ZigZag encoding.
         /// </summary>
         [pbr::OriginalName("TYPE_SINT64")] Sint64 = 18,
       }
 
       internal enum Label {
         /// <summary>
-        /// 0 is reserved for errors
+        ///  0 is reserved for errors
         /// </summary>
         [pbr::OriginalName("LABEL_OPTIONAL")] Optional = 1,
         [pbr::OriginalName("LABEL_REQUIRED")] Required = 2,
+        /// <summary>
+        ///  TODO(sanjay): Should we add LABEL_MAP?
+        /// </summary>
         [pbr::OriginalName("LABEL_REPEATED")] Repeated = 3,
       }
 
@@ -2050,39 +1684,31 @@
   }
 
   /// <summary>
-  /// Describes a oneof.
+  ///  Describes a oneof.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class OneofDescriptorProto : pb::IMessage<OneofDescriptorProto> {
     private static readonly pb::MessageParser<OneofDescriptorProto> _parser = new pb::MessageParser<OneofDescriptorProto>(() => new OneofDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<OneofDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[5]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[4]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofDescriptorProto(OneofDescriptorProto other) : this() {
       name_ = other.name_;
-      Options = other.options_ != null ? other.Options.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public OneofDescriptorProto Clone() {
       return new OneofDescriptorProto(this);
     }
@@ -2090,7 +1716,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -2098,23 +1723,10 @@
       }
     }
 
-    /// <summary>Field number for the "options" field.</summary>
-    public const int OptionsFieldNumber = 2;
-    private global::Google.Protobuf.Reflection.OneofOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.Reflection.OneofOptions Options {
-      get { return options_; }
-      set {
-        options_ = value;
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as OneofDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(OneofDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2123,57 +1735,34 @@
         return true;
       }
       if (Name != other.Name) return false;
-      if (!object.Equals(Options, other.Options)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
-      if (options_ != null) hash ^= Options.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
         output.WriteString(Name);
       }
-      if (options_ != null) {
-        output.WriteRawTag(18);
-        output.WriteMessage(Options);
-      }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
       }
-      if (options_ != null) {
-        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Options);
-      }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(OneofDescriptorProto other) {
       if (other == null) {
         return;
@@ -2181,34 +1770,19 @@
       if (other.Name.Length != 0) {
         Name = other.Name;
       }
-      if (other.options_ != null) {
-        if (options_ == null) {
-          options_ = new global::Google.Protobuf.Reflection.OneofOptions();
-        }
-        Options.MergeFrom(other.Options);
-      }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
             break;
           }
-          case 18: {
-            if (options_ == null) {
-              options_ = new global::Google.Protobuf.Reflection.OneofOptions();
-            }
-            input.ReadMessage(options_);
-            break;
-          }
         }
       }
     }
@@ -2216,42 +1790,33 @@
   }
 
   /// <summary>
-  /// Describes an enum type.
+  ///  Describes an enum type.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class EnumDescriptorProto : pb::IMessage<EnumDescriptorProto> {
     private static readonly pb::MessageParser<EnumDescriptorProto> _parser = new pb::MessageParser<EnumDescriptorProto>(() => new EnumDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<EnumDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[6]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[5]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumDescriptorProto(EnumDescriptorProto other) : this() {
       name_ = other.name_;
       value_ = other.value_.Clone();
       Options = other.options_ != null ? other.Options.Clone() : null;
-      reservedRange_ = other.reservedRange_.Clone();
-      reservedName_ = other.reservedName_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumDescriptorProto Clone() {
       return new EnumDescriptorProto(this);
     }
@@ -2259,7 +1824,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -2272,7 +1836,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.EnumValueDescriptorProto> _repeated_value_codec
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.Reflection.EnumValueDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumValueDescriptorProto> value_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumValueDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumValueDescriptorProto> Value {
       get { return value_; }
     }
@@ -2280,7 +1843,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 3;
     private global::Google.Protobuf.Reflection.EnumOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.EnumOptions Options {
       get { return options_; }
       set {
@@ -2288,41 +1850,10 @@
       }
     }
 
-    /// <summary>Field number for the "reserved_range" field.</summary>
-    public const int ReservedRangeFieldNumber = 4;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange> _repeated_reservedRange_codec
-        = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange> reservedRange_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange>();
-    /// <summary>
-    /// Range of reserved numeric values. Reserved numeric values may not be used
-    /// by enum values in the same enum declaration. Reserved ranges may not
-    /// overlap.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.Reflection.EnumDescriptorProto.Types.EnumReservedRange> ReservedRange {
-      get { return reservedRange_; }
-    }
-
-    /// <summary>Field number for the "reserved_name" field.</summary>
-    public const int ReservedNameFieldNumber = 5;
-    private static readonly pb::FieldCodec<string> _repeated_reservedName_codec
-        = pb::FieldCodec.ForString(42);
-    private readonly pbc::RepeatedField<string> reservedName_ = new pbc::RepeatedField<string>();
-    /// <summary>
-    /// Reserved enum value names, which may not be reused. A given name may only
-    /// be reserved once.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<string> ReservedName {
-      get { return reservedName_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as EnumDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(EnumDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2333,31 +1864,21 @@
       if (Name != other.Name) return false;
       if(!value_.Equals(other.value_)) return false;
       if (!object.Equals(Options, other.Options)) return false;
-      if(!reservedRange_.Equals(other.reservedRange_)) return false;
-      if(!reservedName_.Equals(other.reservedName_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       hash ^= value_.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
-      hash ^= reservedRange_.GetHashCode();
-      hash ^= reservedName_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -2368,14 +1889,8 @@
         output.WriteRawTag(26);
         output.WriteMessage(Options);
       }
-      reservedRange_.WriteTo(output, _repeated_reservedRange_codec);
-      reservedName_.WriteTo(output, _repeated_reservedName_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -2385,15 +1900,9 @@
       if (options_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Options);
       }
-      size += reservedRange_.CalculateSize(_repeated_reservedRange_codec);
-      size += reservedName_.CalculateSize(_repeated_reservedName_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(EnumDescriptorProto other) {
       if (other == null) {
         return;
@@ -2408,18 +1917,14 @@
         }
         Options.MergeFrom(other.Options);
       }
-      reservedRange_.Add(other.reservedRange_);
-      reservedName_.Add(other.reservedName_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -2436,233 +1941,40 @@
             input.ReadMessage(options_);
             break;
           }
-          case 34: {
-            reservedRange_.AddEntriesFrom(input, _repeated_reservedRange_codec);
-            break;
-          }
-          case 42: {
-            reservedName_.AddEntriesFrom(input, _repeated_reservedName_codec);
-            break;
-          }
         }
       }
     }
 
-    #region Nested types
-    /// <summary>Container for nested types declared in the EnumDescriptorProto message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      /// <summary>
-      /// Range of reserved numeric values. Reserved values may not be used by
-      /// entries in the same enum. Reserved ranges may not overlap.
-      ///
-      /// Note that this is distinct from DescriptorProto.ReservedRange in that it
-      /// is inclusive such that it can appropriately represent the entire int32
-      /// domain.
-      /// </summary>
-      internal sealed partial class EnumReservedRange : pb::IMessage<EnumReservedRange> {
-        private static readonly pb::MessageParser<EnumReservedRange> _parser = new pb::MessageParser<EnumReservedRange>(() => new EnumReservedRange());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pb::MessageParser<EnumReservedRange> Parser { get { return _parser; } }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public static pbr::MessageDescriptor Descriptor {
-          get { return global::Google.Protobuf.Reflection.EnumDescriptorProto.Descriptor.NestedTypes[0]; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        pbr::MessageDescriptor pb::IMessage.Descriptor {
-          get { return Descriptor; }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public EnumReservedRange() {
-          OnConstruction();
-        }
-
-        partial void OnConstruction();
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public EnumReservedRange(EnumReservedRange other) : this() {
-          start_ = other.start_;
-          end_ = other.end_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public EnumReservedRange Clone() {
-          return new EnumReservedRange(this);
-        }
-
-        /// <summary>Field number for the "start" field.</summary>
-        public const int StartFieldNumber = 1;
-        private int start_;
-        /// <summary>
-        /// Inclusive.
-        /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int Start {
-          get { return start_; }
-          set {
-            start_ = value;
-          }
-        }
-
-        /// <summary>Field number for the "end" field.</summary>
-        public const int EndFieldNumber = 2;
-        private int end_;
-        /// <summary>
-        /// Inclusive.
-        /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int End {
-          get { return end_; }
-          set {
-            end_ = value;
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override bool Equals(object other) {
-          return Equals(other as EnumReservedRange);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public bool Equals(EnumReservedRange other) {
-          if (ReferenceEquals(other, null)) {
-            return false;
-          }
-          if (ReferenceEquals(other, this)) {
-            return true;
-          }
-          if (Start != other.Start) return false;
-          if (End != other.End) return false;
-          return Equals(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override int GetHashCode() {
-          int hash = 1;
-          if (Start != 0) hash ^= Start.GetHashCode();
-          if (End != 0) hash ^= End.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
-          return hash;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public override string ToString() {
-          return pb::JsonFormatter.ToDiagnosticString(this);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void WriteTo(pb::CodedOutputStream output) {
-          if (Start != 0) {
-            output.WriteRawTag(8);
-            output.WriteInt32(Start);
-          }
-          if (End != 0) {
-            output.WriteRawTag(16);
-            output.WriteInt32(End);
-          }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public int CalculateSize() {
-          int size = 0;
-          if (Start != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Start);
-          }
-          if (End != 0) {
-            size += 1 + pb::CodedOutputStream.ComputeInt32Size(End);
-          }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
-          return size;
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(EnumReservedRange other) {
-          if (other == null) {
-            return;
-          }
-          if (other.Start != 0) {
-            Start = other.Start;
-          }
-          if (other.End != 0) {
-            End = other.End;
-          }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-        }
-
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-        public void MergeFrom(pb::CodedInputStream input) {
-          uint tag;
-          while ((tag = input.ReadTag()) != 0) {
-            switch(tag) {
-              default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
-                break;
-              case 8: {
-                Start = input.ReadInt32();
-                break;
-              }
-              case 16: {
-                End = input.ReadInt32();
-                break;
-              }
-            }
-          }
-        }
-
-      }
-
-    }
-    #endregion
-
   }
 
   /// <summary>
-  /// Describes a value within an enum.
+  ///  Describes a value within an enum.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class EnumValueDescriptorProto : pb::IMessage<EnumValueDescriptorProto> {
     private static readonly pb::MessageParser<EnumValueDescriptorProto> _parser = new pb::MessageParser<EnumValueDescriptorProto>(() => new EnumValueDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<EnumValueDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[7]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[6]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValueDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValueDescriptorProto(EnumValueDescriptorProto other) : this() {
       name_ = other.name_;
       number_ = other.number_;
       Options = other.options_ != null ? other.Options.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValueDescriptorProto Clone() {
       return new EnumValueDescriptorProto(this);
     }
@@ -2670,7 +1982,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -2681,7 +1992,6 @@
     /// <summary>Field number for the "number" field.</summary>
     public const int NumberFieldNumber = 2;
     private int number_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Number {
       get { return number_; }
       set {
@@ -2692,7 +2002,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 3;
     private global::Google.Protobuf.Reflection.EnumValueOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.EnumValueOptions Options {
       get { return options_; }
       set {
@@ -2700,12 +2009,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as EnumValueDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(EnumValueDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2716,27 +2023,21 @@
       if (Name != other.Name) return false;
       if (Number != other.Number) return false;
       if (!object.Equals(Options, other.Options)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Number != 0) hash ^= Number.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -2750,12 +2051,8 @@
         output.WriteRawTag(26);
         output.WriteMessage(Options);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -2767,13 +2064,9 @@
       if (options_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Options);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(EnumValueDescriptorProto other) {
       if (other == null) {
         return;
@@ -2790,16 +2083,14 @@
         }
         Options.MergeFrom(other.Options);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -2823,40 +2114,33 @@
   }
 
   /// <summary>
-  /// Describes a service.
+  ///  Describes a service.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class ServiceDescriptorProto : pb::IMessage<ServiceDescriptorProto> {
     private static readonly pb::MessageParser<ServiceDescriptorProto> _parser = new pb::MessageParser<ServiceDescriptorProto>(() => new ServiceDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ServiceDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[8]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[7]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ServiceDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ServiceDescriptorProto(ServiceDescriptorProto other) : this() {
       name_ = other.name_;
       method_ = other.method_.Clone();
       Options = other.options_ != null ? other.Options.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ServiceDescriptorProto Clone() {
       return new ServiceDescriptorProto(this);
     }
@@ -2864,7 +2148,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -2877,7 +2160,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.MethodDescriptorProto> _repeated_method_codec
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.Reflection.MethodDescriptorProto.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.MethodDescriptorProto> method_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.MethodDescriptorProto>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.MethodDescriptorProto> Method {
       get { return method_; }
     }
@@ -2885,7 +2167,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 3;
     private global::Google.Protobuf.Reflection.ServiceOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.ServiceOptions Options {
       get { return options_; }
       set {
@@ -2893,12 +2174,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ServiceDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ServiceDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -2909,27 +2188,21 @@
       if (Name != other.Name) return false;
       if(!method_.Equals(other.method_)) return false;
       if (!object.Equals(Options, other.Options)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       hash ^= method_.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -2940,12 +2213,8 @@
         output.WriteRawTag(26);
         output.WriteMessage(Options);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -2955,13 +2224,9 @@
       if (options_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Options);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ServiceDescriptorProto other) {
       if (other == null) {
         return;
@@ -2976,16 +2241,14 @@
         }
         Options.MergeFrom(other.Options);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -3009,32 +2272,27 @@
   }
 
   /// <summary>
-  /// Describes a method of a service.
+  ///  Describes a method of a service.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class MethodDescriptorProto : pb::IMessage<MethodDescriptorProto> {
     private static readonly pb::MessageParser<MethodDescriptorProto> _parser = new pb::MessageParser<MethodDescriptorProto>(() => new MethodDescriptorProto());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MethodDescriptorProto> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[9]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[8]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MethodDescriptorProto() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MethodDescriptorProto(MethodDescriptorProto other) : this() {
       name_ = other.name_;
       inputType_ = other.inputType_;
@@ -3042,10 +2300,8 @@
       Options = other.options_ != null ? other.Options.Clone() : null;
       clientStreaming_ = other.clientStreaming_;
       serverStreaming_ = other.serverStreaming_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MethodDescriptorProto Clone() {
       return new MethodDescriptorProto(this);
     }
@@ -3053,7 +2309,6 @@
     /// <summary>Field number for the "name" field.</summary>
     public const int NameFieldNumber = 1;
     private string name_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -3065,10 +2320,9 @@
     public const int InputTypeFieldNumber = 2;
     private string inputType_ = "";
     /// <summary>
-    /// Input and output type names.  These are resolved in the same way as
-    /// FieldDescriptorProto.type_name, but must refer to a message type.
+    ///  Input and output type names.  These are resolved in the same way as
+    ///  FieldDescriptorProto.type_name, but must refer to a message type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string InputType {
       get { return inputType_; }
       set {
@@ -3079,7 +2333,6 @@
     /// <summary>Field number for the "output_type" field.</summary>
     public const int OutputTypeFieldNumber = 3;
     private string outputType_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string OutputType {
       get { return outputType_; }
       set {
@@ -3090,7 +2343,6 @@
     /// <summary>Field number for the "options" field.</summary>
     public const int OptionsFieldNumber = 4;
     private global::Google.Protobuf.Reflection.MethodOptions options_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.MethodOptions Options {
       get { return options_; }
       set {
@@ -3102,9 +2354,8 @@
     public const int ClientStreamingFieldNumber = 5;
     private bool clientStreaming_;
     /// <summary>
-    /// Identifies if client streams multiple client messages
+    ///  Identifies if client streams multiple client messages
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool ClientStreaming {
       get { return clientStreaming_; }
       set {
@@ -3116,9 +2367,8 @@
     public const int ServerStreamingFieldNumber = 6;
     private bool serverStreaming_;
     /// <summary>
-    /// Identifies if server streams multiple server messages
+    ///  Identifies if server streams multiple server messages
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool ServerStreaming {
       get { return serverStreaming_; }
       set {
@@ -3126,12 +2376,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MethodDescriptorProto);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MethodDescriptorProto other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -3145,10 +2393,9 @@
       if (!object.Equals(Options, other.Options)) return false;
       if (ClientStreaming != other.ClientStreaming) return false;
       if (ServerStreaming != other.ServerStreaming) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -3157,18 +2404,13 @@
       if (options_ != null) hash ^= Options.GetHashCode();
       if (ClientStreaming != false) hash ^= ClientStreaming.GetHashCode();
       if (ServerStreaming != false) hash ^= ServerStreaming.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -3194,12 +2436,8 @@
         output.WriteRawTag(48);
         output.WriteBool(ServerStreaming);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -3220,13 +2458,9 @@
       if (ServerStreaming != false) {
         size += 1 + 1;
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MethodDescriptorProto other) {
       if (other == null) {
         return;
@@ -3252,16 +2486,14 @@
       if (other.ServerStreaming != false) {
         ServerStreaming = other.ServerStreaming;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -3296,32 +2528,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class FileOptions : pb::IMessage<FileOptions> {
     private static readonly pb::MessageParser<FileOptions> _parser = new pb::MessageParser<FileOptions>(() => new FileOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FileOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[10]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[9]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileOptions(FileOptions other) : this() {
       javaPackage_ = other.javaPackage_;
       javaOuterClassname_ = other.javaOuterClassname_;
@@ -3333,19 +2558,13 @@
       ccGenericServices_ = other.ccGenericServices_;
       javaGenericServices_ = other.javaGenericServices_;
       pyGenericServices_ = other.pyGenericServices_;
-      phpGenericServices_ = other.phpGenericServices_;
       deprecated_ = other.deprecated_;
       ccEnableArenas_ = other.ccEnableArenas_;
       objcClassPrefix_ = other.objcClassPrefix_;
       csharpNamespace_ = other.csharpNamespace_;
-      swiftPrefix_ = other.swiftPrefix_;
-      phpClassPrefix_ = other.phpClassPrefix_;
-      phpNamespace_ = other.phpNamespace_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FileOptions Clone() {
       return new FileOptions(this);
     }
@@ -3354,12 +2573,11 @@
     public const int JavaPackageFieldNumber = 1;
     private string javaPackage_ = "";
     /// <summary>
-    /// Sets the Java package where classes generated from this .proto will be
-    /// placed.  By default, the proto package is used, but this is often
-    /// inappropriate because proto packages do not normally start with backwards
-    /// domain names.
+    ///  Sets the Java package where classes generated from this .proto will be
+    ///  placed.  By default, the proto package is used, but this is often
+    ///  inappropriate because proto packages do not normally start with backwards
+    ///  domain names.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string JavaPackage {
       get { return javaPackage_; }
       set {
@@ -3371,13 +2589,12 @@
     public const int JavaOuterClassnameFieldNumber = 8;
     private string javaOuterClassname_ = "";
     /// <summary>
-    /// If set, all the classes from the .proto file are wrapped in a single
-    /// outer class with the given name.  This applies to both Proto1
-    /// (equivalent to the old "--one_java_file" option) and Proto2 (where
-    /// a .proto always translates to a single class, but you may want to
-    /// explicitly choose the class name).
+    ///  If set, all the classes from the .proto file are wrapped in a single
+    ///  outer class with the given name.  This applies to both Proto1
+    ///  (equivalent to the old "--one_java_file" option) and Proto2 (where
+    ///  a .proto always translates to a single class, but you may want to
+    ///  explicitly choose the class name).
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string JavaOuterClassname {
       get { return javaOuterClassname_; }
       set {
@@ -3389,14 +2606,13 @@
     public const int JavaMultipleFilesFieldNumber = 10;
     private bool javaMultipleFiles_;
     /// <summary>
-    /// If set true, then the Java code generator will generate a separate .java
-    /// file for each top-level message, enum, and service defined in the .proto
-    /// file.  Thus, these types will *not* be nested inside the outer class
-    /// named by java_outer_classname.  However, the outer class will still be
-    /// generated to contain the file's getDescriptor() method as well as any
-    /// top-level extensions defined in the file.
+    ///  If set true, then the Java code generator will generate a separate .java
+    ///  file for each top-level message, enum, and service defined in the .proto
+    ///  file.  Thus, these types will *not* be nested inside the outer class
+    ///  named by java_outer_classname.  However, the outer class will still be
+    ///  generated to contain the file's getDescriptor() method as well as any
+    ///  top-level extensions defined in the file.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool JavaMultipleFiles {
       get { return javaMultipleFiles_; }
       set {
@@ -3408,10 +2624,19 @@
     public const int JavaGenerateEqualsAndHashFieldNumber = 20;
     private bool javaGenerateEqualsAndHash_;
     /// <summary>
-    /// This option does nothing.
+    ///  If set true, then the Java code generator will generate equals() and
+    ///  hashCode() methods for all messages defined in the .proto file.
+    ///  This increases generated code size, potentially substantially for large
+    ///  protos, which may harm a memory-constrained application.
+    ///  - In the full runtime this is a speed optimization, as the
+    ///  AbstractMessage base class includes reflection-based implementations of
+    ///  these methods.
+    ///  - In the lite runtime, setting this option changes the semantics of
+    ///  equals() and hashCode() to more closely match those of the full runtime;
+    ///  the generated methods compute their results based on field values rather
+    ///  than object identity. (Implementations should not assume that hashcodes
+    ///  will be consistent across runtimes or versions of the protocol compiler.)
     /// </summary>
-    [global::System.ObsoleteAttribute]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool JavaGenerateEqualsAndHash {
       get { return javaGenerateEqualsAndHash_; }
       set {
@@ -3423,14 +2648,13 @@
     public const int JavaStringCheckUtf8FieldNumber = 27;
     private bool javaStringCheckUtf8_;
     /// <summary>
-    /// If set true, then the Java2 code generator will generate code that
-    /// throws an exception whenever an attempt is made to assign a non-UTF-8
-    /// byte sequence to a string field.
-    /// Message reflection will do the same.
-    /// However, an extension field still accepts non-UTF-8 byte sequences.
-    /// This option has no effect on when used with the lite runtime.
+    ///  If set true, then the Java2 code generator will generate code that
+    ///  throws an exception whenever an attempt is made to assign a non-UTF-8
+    ///  byte sequence to a string field.
+    ///  Message reflection will do the same.
+    ///  However, an extension field still accepts non-UTF-8 byte sequences.
+    ///  This option has no effect on when used with the lite runtime.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool JavaStringCheckUtf8 {
       get { return javaStringCheckUtf8_; }
       set {
@@ -3441,7 +2665,6 @@
     /// <summary>Field number for the "optimize_for" field.</summary>
     public const int OptimizeForFieldNumber = 9;
     private global::Google.Protobuf.Reflection.FileOptions.Types.OptimizeMode optimizeFor_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FileOptions.Types.OptimizeMode OptimizeFor {
       get { return optimizeFor_; }
       set {
@@ -3453,13 +2676,12 @@
     public const int GoPackageFieldNumber = 11;
     private string goPackage_ = "";
     /// <summary>
-    /// Sets the Go package where structs generated from this .proto will be
-    /// placed. If omitted, the Go package will be derived from the following:
-    ///   - The basename of the package import path, if provided.
-    ///   - Otherwise, the package statement in the .proto file, if present.
-    ///   - Otherwise, the basename of the .proto file, without extension.
+    ///  Sets the Go package where structs generated from this .proto will be
+    ///  placed. If omitted, the Go package will be derived from the following:
+    ///    - The basename of the package import path, if provided.
+    ///    - Otherwise, the package statement in the .proto file, if present.
+    ///    - Otherwise, the basename of the .proto file, without extension.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string GoPackage {
       get { return goPackage_; }
       set {
@@ -3471,18 +2693,17 @@
     public const int CcGenericServicesFieldNumber = 16;
     private bool ccGenericServices_;
     /// <summary>
-    /// Should generic services be generated in each language?  "Generic" services
-    /// are not specific to any particular RPC system.  They are generated by the
-    /// main code generators in each language (without additional plugins).
-    /// Generic services were the only kind of service generation supported by
-    /// early versions of google.protobuf.
+    ///  Should generic services be generated in each language?  "Generic" services
+    ///  are not specific to any particular RPC system.  They are generated by the
+    ///  main code generators in each language (without additional plugins).
+    ///  Generic services were the only kind of service generation supported by
+    ///  early versions of google.protobuf.
     ///
-    /// Generic services are now considered deprecated in favor of using plugins
-    /// that generate code specific to your particular RPC system.  Therefore,
-    /// these default to false.  Old code which depends on generic services should
-    /// explicitly set them to true.
+    ///  Generic services are now considered deprecated in favor of using plugins
+    ///  that generate code specific to your particular RPC system.  Therefore,
+    ///  these default to false.  Old code which depends on generic services should
+    ///  explicitly set them to true.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool CcGenericServices {
       get { return ccGenericServices_; }
       set {
@@ -3493,7 +2714,6 @@
     /// <summary>Field number for the "java_generic_services" field.</summary>
     public const int JavaGenericServicesFieldNumber = 17;
     private bool javaGenericServices_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool JavaGenericServices {
       get { return javaGenericServices_; }
       set {
@@ -3504,7 +2724,6 @@
     /// <summary>Field number for the "py_generic_services" field.</summary>
     public const int PyGenericServicesFieldNumber = 18;
     private bool pyGenericServices_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool PyGenericServices {
       get { return pyGenericServices_; }
       set {
@@ -3512,27 +2731,15 @@
       }
     }
 
-    /// <summary>Field number for the "php_generic_services" field.</summary>
-    public const int PhpGenericServicesFieldNumber = 42;
-    private bool phpGenericServices_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool PhpGenericServices {
-      get { return phpGenericServices_; }
-      set {
-        phpGenericServices_ = value;
-      }
-    }
-
     /// <summary>Field number for the "deprecated" field.</summary>
     public const int DeprecatedFieldNumber = 23;
     private bool deprecated_;
     /// <summary>
-    /// Is this file deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for everything in the file, or it will be completely ignored; in the very
-    /// least, this is a formalization for deprecating files.
+    ///  Is this file deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for everything in the file, or it will be completely ignored; in the very
+    ///  least, this is a formalization for deprecating files.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -3544,10 +2751,9 @@
     public const int CcEnableArenasFieldNumber = 31;
     private bool ccEnableArenas_;
     /// <summary>
-    /// Enables the use of arenas for the proto messages in this file. This applies
-    /// only to generated classes for C++.
+    ///  Enables the use of arenas for the proto messages in this file. This applies
+    ///  only to generated classes for C++.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool CcEnableArenas {
       get { return ccEnableArenas_; }
       set {
@@ -3559,10 +2765,9 @@
     public const int ObjcClassPrefixFieldNumber = 36;
     private string objcClassPrefix_ = "";
     /// <summary>
-    /// Sets the objective c class prefix which is prepended to all objective c
-    /// generated classes from this .proto. There is no default.
+    ///  Sets the objective c class prefix which is prepended to all objective c
+    ///  generated classes from this .proto. There is no default.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string ObjcClassPrefix {
       get { return objcClassPrefix_; }
       set {
@@ -3574,9 +2779,8 @@
     public const int CsharpNamespaceFieldNumber = 37;
     private string csharpNamespace_ = "";
     /// <summary>
-    /// Namespace for generated classes; defaults to the package.
+    ///  Namespace for generated classes; defaults to the package.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string CsharpNamespace {
       get { return csharpNamespace_; }
       set {
@@ -3584,74 +2788,22 @@
       }
     }
 
-    /// <summary>Field number for the "swift_prefix" field.</summary>
-    public const int SwiftPrefixFieldNumber = 39;
-    private string swiftPrefix_ = "";
-    /// <summary>
-    /// By default Swift generators will take the proto package and CamelCase it
-    /// replacing '.' with underscore and use that to prefix the types/symbols
-    /// defined. When this options is provided, they will use this value instead
-    /// to prefix the types/symbols defined.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string SwiftPrefix {
-      get { return swiftPrefix_; }
-      set {
-        swiftPrefix_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "php_class_prefix" field.</summary>
-    public const int PhpClassPrefixFieldNumber = 40;
-    private string phpClassPrefix_ = "";
-    /// <summary>
-    /// Sets the php class prefix which is prepended to all php generated classes
-    /// from this .proto. Default is empty.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string PhpClassPrefix {
-      get { return phpClassPrefix_; }
-      set {
-        phpClassPrefix_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
-    /// <summary>Field number for the "php_namespace" field.</summary>
-    public const int PhpNamespaceFieldNumber = 41;
-    private string phpNamespace_ = "";
-    /// <summary>
-    /// Use this option to change the namespace of php generated classes. Default
-    /// is empty. When this option is empty, the package name will be used for
-    /// determining the namespace.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public string PhpNamespace {
-      get { return phpNamespace_; }
-      set {
-        phpNamespace_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
-      }
-    }
-
     /// <summary>Field number for the "uninterpreted_option" field.</summary>
     public const int UninterpretedOptionFieldNumber = 999;
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.UninterpretedOption> _repeated_uninterpretedOption_codec
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here.
-    /// See the documentation for the "Options" section above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FileOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FileOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -3669,19 +2821,14 @@
       if (CcGenericServices != other.CcGenericServices) return false;
       if (JavaGenericServices != other.JavaGenericServices) return false;
       if (PyGenericServices != other.PyGenericServices) return false;
-      if (PhpGenericServices != other.PhpGenericServices) return false;
       if (Deprecated != other.Deprecated) return false;
       if (CcEnableArenas != other.CcEnableArenas) return false;
       if (ObjcClassPrefix != other.ObjcClassPrefix) return false;
       if (CsharpNamespace != other.CsharpNamespace) return false;
-      if (SwiftPrefix != other.SwiftPrefix) return false;
-      if (PhpClassPrefix != other.PhpClassPrefix) return false;
-      if (PhpNamespace != other.PhpNamespace) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (JavaPackage.Length != 0) hash ^= JavaPackage.GetHashCode();
@@ -3694,27 +2841,18 @@
       if (CcGenericServices != false) hash ^= CcGenericServices.GetHashCode();
       if (JavaGenericServices != false) hash ^= JavaGenericServices.GetHashCode();
       if (PyGenericServices != false) hash ^= PyGenericServices.GetHashCode();
-      if (PhpGenericServices != false) hash ^= PhpGenericServices.GetHashCode();
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       if (CcEnableArenas != false) hash ^= CcEnableArenas.GetHashCode();
       if (ObjcClassPrefix.Length != 0) hash ^= ObjcClassPrefix.GetHashCode();
       if (CsharpNamespace.Length != 0) hash ^= CsharpNamespace.GetHashCode();
-      if (SwiftPrefix.Length != 0) hash ^= SwiftPrefix.GetHashCode();
-      if (PhpClassPrefix.Length != 0) hash ^= PhpClassPrefix.GetHashCode();
-      if (PhpNamespace.Length != 0) hash ^= PhpNamespace.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (JavaPackage.Length != 0) {
         output.WriteRawTag(10);
@@ -3772,29 +2910,9 @@
         output.WriteRawTag(170, 2);
         output.WriteString(CsharpNamespace);
       }
-      if (SwiftPrefix.Length != 0) {
-        output.WriteRawTag(186, 2);
-        output.WriteString(SwiftPrefix);
-      }
-      if (PhpClassPrefix.Length != 0) {
-        output.WriteRawTag(194, 2);
-        output.WriteString(PhpClassPrefix);
-      }
-      if (PhpNamespace.Length != 0) {
-        output.WriteRawTag(202, 2);
-        output.WriteString(PhpNamespace);
-      }
-      if (PhpGenericServices != false) {
-        output.WriteRawTag(208, 2);
-        output.WriteBool(PhpGenericServices);
-      }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (JavaPackage.Length != 0) {
@@ -3827,9 +2945,6 @@
       if (PyGenericServices != false) {
         size += 2 + 1;
       }
-      if (PhpGenericServices != false) {
-        size += 2 + 1;
-      }
       if (Deprecated != false) {
         size += 2 + 1;
       }
@@ -3842,23 +2957,10 @@
       if (CsharpNamespace.Length != 0) {
         size += 2 + pb::CodedOutputStream.ComputeStringSize(CsharpNamespace);
       }
-      if (SwiftPrefix.Length != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeStringSize(SwiftPrefix);
-      }
-      if (PhpClassPrefix.Length != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeStringSize(PhpClassPrefix);
-      }
-      if (PhpNamespace.Length != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeStringSize(PhpNamespace);
-      }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FileOptions other) {
       if (other == null) {
         return;
@@ -3893,9 +2995,6 @@
       if (other.PyGenericServices != false) {
         PyGenericServices = other.PyGenericServices;
       }
-      if (other.PhpGenericServices != false) {
-        PhpGenericServices = other.PhpGenericServices;
-      }
       if (other.Deprecated != false) {
         Deprecated = other.Deprecated;
       }
@@ -3908,26 +3007,15 @@
       if (other.CsharpNamespace.Length != 0) {
         CsharpNamespace = other.CsharpNamespace;
       }
-      if (other.SwiftPrefix.Length != 0) {
-        SwiftPrefix = other.SwiftPrefix;
-      }
-      if (other.PhpClassPrefix.Length != 0) {
-        PhpClassPrefix = other.PhpClassPrefix;
-      }
-      if (other.PhpNamespace.Length != 0) {
-        PhpNamespace = other.PhpNamespace;
-      }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 10: {
             JavaPackage = input.ReadString();
@@ -3985,22 +3073,6 @@
             CsharpNamespace = input.ReadString();
             break;
           }
-          case 314: {
-            SwiftPrefix = input.ReadString();
-            break;
-          }
-          case 322: {
-            PhpClassPrefix = input.ReadString();
-            break;
-          }
-          case 330: {
-            PhpNamespace = input.ReadString();
-            break;
-          }
-          case 336: {
-            PhpGenericServices = input.ReadBool();
-            break;
-          }
           case 7994: {
             uninterpretedOption_.AddEntriesFrom(input, _repeated_uninterpretedOption_codec);
             break;
@@ -4011,22 +3083,22 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the FileOptions message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       /// <summary>
-      /// Generated classes can be optimized for speed or code size.
+      ///  Generated classes can be optimized for speed or code size.
       /// </summary>
       internal enum OptimizeMode {
         /// <summary>
-        /// Generate complete code for parsing, serialization,
+        ///  Generate complete code for parsing, serialization,
         /// </summary>
         [pbr::OriginalName("SPEED")] Speed = 1,
         /// <summary>
-        /// etc.
+        ///  etc.
         /// </summary>
         [pbr::OriginalName("CODE_SIZE")] CodeSize = 2,
         /// <summary>
-        /// Generate code using MessageLite and the lite runtime.
+        ///  Generate code using MessageLite and the lite runtime.
         /// </summary>
         [pbr::OriginalName("LITE_RUNTIME")] LiteRuntime = 3,
       }
@@ -4036,42 +3108,33 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class MessageOptions : pb::IMessage<MessageOptions> {
     private static readonly pb::MessageParser<MessageOptions> _parser = new pb::MessageParser<MessageOptions>(() => new MessageOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MessageOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[11]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[10]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageOptions(MessageOptions other) : this() {
       messageSetWireFormat_ = other.messageSetWireFormat_;
       noStandardDescriptorAccessor_ = other.noStandardDescriptorAccessor_;
       deprecated_ = other.deprecated_;
       mapEntry_ = other.mapEntry_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MessageOptions Clone() {
       return new MessageOptions(this);
     }
@@ -4080,26 +3143,25 @@
     public const int MessageSetWireFormatFieldNumber = 1;
     private bool messageSetWireFormat_;
     /// <summary>
-    /// Set true to use the old proto1 MessageSet wire format for extensions.
-    /// This is provided for backwards-compatibility with the MessageSet wire
-    /// format.  You should not use this for any other reason:  It's less
-    /// efficient, has fewer features, and is more complicated.
+    ///  Set true to use the old proto1 MessageSet wire format for extensions.
+    ///  This is provided for backwards-compatibility with the MessageSet wire
+    ///  format.  You should not use this for any other reason:  It's less
+    ///  efficient, has fewer features, and is more complicated.
     ///
-    /// The message must be defined exactly as follows:
-    ///   message Foo {
-    ///     option message_set_wire_format = true;
-    ///     extensions 4 to max;
-    ///   }
-    /// Note that the message cannot have any defined fields; MessageSets only
-    /// have extensions.
+    ///  The message must be defined exactly as follows:
+    ///    message Foo {
+    ///      option message_set_wire_format = true;
+    ///      extensions 4 to max;
+    ///    }
+    ///  Note that the message cannot have any defined fields; MessageSets only
+    ///  have extensions.
     ///
-    /// All extensions of your type must be singular messages; e.g. they cannot
-    /// be int32s, enums, or repeated messages.
+    ///  All extensions of your type must be singular messages; e.g. they cannot
+    ///  be int32s, enums, or repeated messages.
     ///
-    /// Because this is an option, the above two restrictions are not enforced by
-    /// the protocol compiler.
+    ///  Because this is an option, the above two restrictions are not enforced by
+    ///  the protocol compiler.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool MessageSetWireFormat {
       get { return messageSetWireFormat_; }
       set {
@@ -4111,11 +3173,10 @@
     public const int NoStandardDescriptorAccessorFieldNumber = 2;
     private bool noStandardDescriptorAccessor_;
     /// <summary>
-    /// Disables the generation of the standard "descriptor()" accessor, which can
-    /// conflict with a field of the same name.  This is meant to make migration
-    /// from proto1 easier; new code should avoid fields named "descriptor".
+    ///  Disables the generation of the standard "descriptor()" accessor, which can
+    ///  conflict with a field of the same name.  This is meant to make migration
+    ///  from proto1 easier; new code should avoid fields named "descriptor".
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool NoStandardDescriptorAccessor {
       get { return noStandardDescriptorAccessor_; }
       set {
@@ -4127,12 +3188,11 @@
     public const int DeprecatedFieldNumber = 3;
     private bool deprecated_;
     /// <summary>
-    /// Is this message deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for the message, or it will be completely ignored; in the very least,
-    /// this is a formalization for deprecating messages.
+    ///  Is this message deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for the message, or it will be completely ignored; in the very least,
+    ///  this is a formalization for deprecating messages.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -4144,29 +3204,28 @@
     public const int MapEntryFieldNumber = 7;
     private bool mapEntry_;
     /// <summary>
-    /// Whether the message is an automatically generated map entry type for the
-    /// maps field.
+    ///  Whether the message is an automatically generated map entry type for the
+    ///  maps field.
     ///
-    /// For maps fields:
-    ///     map&lt;KeyType, ValueType> map_field = 1;
-    /// The parsed descriptor looks like:
-    ///     message MapFieldEntry {
-    ///         option map_entry = true;
-    ///         optional KeyType key = 1;
-    ///         optional ValueType value = 2;
-    ///     }
-    ///     repeated MapFieldEntry map_field = 1;
+    ///  For maps fields:
+    ///      map&lt;KeyType, ValueType> map_field = 1;
+    ///  The parsed descriptor looks like:
+    ///      message MapFieldEntry {
+    ///          option map_entry = true;
+    ///          optional KeyType key = 1;
+    ///          optional ValueType value = 2;
+    ///      }
+    ///      repeated MapFieldEntry map_field = 1;
     ///
-    /// Implementations may choose not to generate the map_entry=true message, but
-    /// use a native map in the target language to hold the keys and values.
-    /// The reflection APIs in such implementions still need to work as
-    /// if the field is a repeated message field.
+    ///  Implementations may choose not to generate the map_entry=true message, but
+    ///  use a native map in the target language to hold the keys and values.
+    ///  The reflection APIs in such implementions still need to work as
+    ///  if the field is a repeated message field.
     ///
-    /// NOTE: Do not set the option in .proto files. Always use the maps syntax
-    /// instead. The option should only be implicitly set by the proto compiler
-    /// parser.
+    ///  NOTE: Do not set the option in .proto files. Always use the maps syntax
+    ///  instead. The option should only be implicitly set by the proto compiler
+    ///  parser.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool MapEntry {
       get { return mapEntry_; }
       set {
@@ -4180,19 +3239,16 @@
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MessageOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MessageOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4205,10 +3261,9 @@
       if (Deprecated != other.Deprecated) return false;
       if (MapEntry != other.MapEntry) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (MessageSetWireFormat != false) hash ^= MessageSetWireFormat.GetHashCode();
@@ -4216,18 +3271,13 @@
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       if (MapEntry != false) hash ^= MapEntry.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (MessageSetWireFormat != false) {
         output.WriteRawTag(8);
@@ -4246,12 +3296,8 @@
         output.WriteBool(MapEntry);
       }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (MessageSetWireFormat != false) {
@@ -4267,13 +3313,9 @@
         size += 1 + 1;
       }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MessageOptions other) {
       if (other == null) {
         return;
@@ -4291,16 +3333,14 @@
         MapEntry = other.MapEntry;
       }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 8: {
             MessageSetWireFormat = input.ReadBool();
@@ -4328,32 +3368,25 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class FieldOptions : pb::IMessage<FieldOptions> {
     private static readonly pb::MessageParser<FieldOptions> _parser = new pb::MessageParser<FieldOptions>(() => new FieldOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FieldOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[12]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[11]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldOptions(FieldOptions other) : this() {
       ctype_ = other.ctype_;
       packed_ = other.packed_;
@@ -4362,10 +3395,8 @@
       deprecated_ = other.deprecated_;
       weak_ = other.weak_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldOptions Clone() {
       return new FieldOptions(this);
     }
@@ -4374,12 +3405,11 @@
     public const int CtypeFieldNumber = 1;
     private global::Google.Protobuf.Reflection.FieldOptions.Types.CType ctype_ = 0;
     /// <summary>
-    /// The ctype option instructs the C++ code generator to use a different
-    /// representation of the field than it normally would.  See the specific
-    /// options below.  This option is not yet implemented in the open source
-    /// release -- sorry, we'll try to include it in a future version!
+    ///  The ctype option instructs the C++ code generator to use a different
+    ///  representation of the field than it normally would.  See the specific
+    ///  options below.  This option is not yet implemented in the open source
+    ///  release -- sorry, we'll try to include it in a future version!
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FieldOptions.Types.CType Ctype {
       get { return ctype_; }
       set {
@@ -4391,13 +3421,12 @@
     public const int PackedFieldNumber = 2;
     private bool packed_;
     /// <summary>
-    /// The packed option can be enabled for repeated primitive fields to enable
-    /// a more efficient representation on the wire. Rather than repeatedly
-    /// writing the tag and type for each element, the entire array is encoded as
-    /// a single length-delimited blob. In proto3, only explicit setting it to
-    /// false will avoid using packed encoding.
+    ///  The packed option can be enabled for repeated primitive fields to enable
+    ///  a more efficient representation on the wire. Rather than repeatedly
+    ///  writing the tag and type for each element, the entire array is encoded as
+    ///  a single length-delimited blob. In proto3, only explicit setting it to
+    ///  false will avoid using packed encoding.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Packed {
       get { return packed_; }
       set {
@@ -4409,19 +3438,16 @@
     public const int JstypeFieldNumber = 6;
     private global::Google.Protobuf.Reflection.FieldOptions.Types.JSType jstype_ = 0;
     /// <summary>
-    /// The jstype option determines the JavaScript type used for values of the
-    /// field.  The option is permitted only for 64 bit integral and fixed types
-    /// (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
-    /// is represented as JavaScript string, which avoids loss of precision that
-    /// can happen when a large value is converted to a floating point JavaScript.
-    /// Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
-    /// use the JavaScript "number" type.  The behavior of the default option
-    /// JS_NORMAL is implementation dependent.
-    ///
-    /// This option is an enum to permit additional types to be added, e.g.
-    /// goog.math.Integer.
+    ///  The jstype option determines the JavaScript type used for values of the
+    ///  field.  The option is permitted only for 64 bit integral and fixed types
+    ///  (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
+    ///  represented as JavaScript strings.  This avoids loss of precision that can
+    ///  happen when a large value is converted to a floating point JavaScript
+    ///  numbers.  Specifying JS_NUMBER for the jstype causes the generated
+    ///  JavaScript code to use the JavaScript "number" type instead of strings.
+    ///  This option is an enum to permit additional types to be added,
+    ///  e.g. goog.math.Integer.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.Reflection.FieldOptions.Types.JSType Jstype {
       get { return jstype_; }
       set {
@@ -4433,35 +3459,34 @@
     public const int LazyFieldNumber = 5;
     private bool lazy_;
     /// <summary>
-    /// Should this field be parsed lazily?  Lazy applies only to message-type
-    /// fields.  It means that when the outer message is initially parsed, the
-    /// inner message's contents will not be parsed but instead stored in encoded
-    /// form.  The inner message will actually be parsed when it is first accessed.
+    ///  Should this field be parsed lazily?  Lazy applies only to message-type
+    ///  fields.  It means that when the outer message is initially parsed, the
+    ///  inner message's contents will not be parsed but instead stored in encoded
+    ///  form.  The inner message will actually be parsed when it is first accessed.
     ///
-    /// This is only a hint.  Implementations are free to choose whether to use
-    /// eager or lazy parsing regardless of the value of this option.  However,
-    /// setting this option true suggests that the protocol author believes that
-    /// using lazy parsing on this field is worth the additional bookkeeping
-    /// overhead typically needed to implement it.
+    ///  This is only a hint.  Implementations are free to choose whether to use
+    ///  eager or lazy parsing regardless of the value of this option.  However,
+    ///  setting this option true suggests that the protocol author believes that
+    ///  using lazy parsing on this field is worth the additional bookkeeping
+    ///  overhead typically needed to implement it.
     ///
-    /// This option does not affect the public interface of any generated code;
-    /// all method signatures remain the same.  Furthermore, thread-safety of the
-    /// interface is not affected by this option; const methods remain safe to
-    /// call from multiple threads concurrently, while non-const methods continue
-    /// to require exclusive access.
+    ///  This option does not affect the public interface of any generated code;
+    ///  all method signatures remain the same.  Furthermore, thread-safety of the
+    ///  interface is not affected by this option; const methods remain safe to
+    ///  call from multiple threads concurrently, while non-const methods continue
+    ///  to require exclusive access.
     ///
-    /// Note that implementations may choose not to check required fields within
-    /// a lazy sub-message.  That is, calling IsInitialized() on the outer message
-    /// may return true even if the inner message has missing required fields.
-    /// This is necessary because otherwise the inner message would have to be
-    /// parsed in order to perform the check, defeating the purpose of lazy
-    /// parsing.  An implementation which chooses not to check required fields
-    /// must be consistent about it.  That is, for any particular sub-message, the
-    /// implementation must either *always* check its required fields, or *never*
-    /// check its required fields, regardless of whether or not the message has
-    /// been parsed.
+    ///  Note that implementations may choose not to check required fields within
+    ///  a lazy sub-message.  That is, calling IsInitialized() on the outher message
+    ///  may return true even if the inner message has missing required fields.
+    ///  This is necessary because otherwise the inner message would have to be
+    ///  parsed in order to perform the check, defeating the purpose of lazy
+    ///  parsing.  An implementation which chooses not to check required fields
+    ///  must be consistent about it.  That is, for any particular sub-message, the
+    ///  implementation must either *always* check its required fields, or *never*
+    ///  check its required fields, regardless of whether or not the message has
+    ///  been parsed.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Lazy {
       get { return lazy_; }
       set {
@@ -4473,12 +3498,11 @@
     public const int DeprecatedFieldNumber = 3;
     private bool deprecated_;
     /// <summary>
-    /// Is this field deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for accessors, or it will be completely ignored; in the very least, this
-    /// is a formalization for deprecating fields.
+    ///  Is this field deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for accessors, or it will be completely ignored; in the very least, this
+    ///  is a formalization for deprecating fields.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -4490,9 +3514,8 @@
     public const int WeakFieldNumber = 10;
     private bool weak_;
     /// <summary>
-    /// For Google-internal migration only. Do not use.
+    ///  For Google-internal migration only. Do not use.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Weak {
       get { return weak_; }
       set {
@@ -4506,19 +3529,16 @@
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FieldOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FieldOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4533,10 +3553,9 @@
       if (Deprecated != other.Deprecated) return false;
       if (Weak != other.Weak) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Ctype != 0) hash ^= Ctype.GetHashCode();
@@ -4546,18 +3565,13 @@
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       if (Weak != false) hash ^= Weak.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Ctype != 0) {
         output.WriteRawTag(8);
@@ -4584,12 +3598,8 @@
         output.WriteBool(Weak);
       }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Ctype != 0) {
@@ -4611,13 +3621,9 @@
         size += 1 + 1;
       }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FieldOptions other) {
       if (other == null) {
         return;
@@ -4641,16 +3647,14 @@
         Weak = other.Weak;
       }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 8: {
             ctype_ = (global::Google.Protobuf.Reflection.FieldOptions.Types.CType) input.ReadEnum();
@@ -4686,11 +3690,11 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the FieldOptions message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       internal enum CType {
         /// <summary>
-        /// Default mode.
+        ///  Default mode.
         /// </summary>
         [pbr::OriginalName("STRING")] String = 0,
         [pbr::OriginalName("CORD")] Cord = 1,
@@ -4699,15 +3703,15 @@
 
       internal enum JSType {
         /// <summary>
-        /// Use the default type.
+        ///  Use the default type.
         /// </summary>
         [pbr::OriginalName("JS_NORMAL")] JsNormal = 0,
         /// <summary>
-        /// Use JavaScript strings.
+        ///  Use JavaScript strings.
         /// </summary>
         [pbr::OriginalName("JS_STRING")] JsString = 1,
         /// <summary>
-        /// Use JavaScript numbers.
+        ///  Use JavaScript numbers.
         /// </summary>
         [pbr::OriginalName("JS_NUMBER")] JsNumber = 2,
       }
@@ -4717,166 +3721,31 @@
 
   }
 
-  internal sealed partial class OneofOptions : pb::IMessage<OneofOptions> {
-    private static readonly pb::MessageParser<OneofOptions> _parser = new pb::MessageParser<OneofOptions>(() => new OneofOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pb::MessageParser<OneofOptions> Parser { get { return _parser; } }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[13]; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    pbr::MessageDescriptor pb::IMessage.Descriptor {
-      get { return Descriptor; }
-    }
-
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofOptions() {
-      OnConstruction();
-    }
-
-    partial void OnConstruction();
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofOptions(OneofOptions other) : this() {
-      uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public OneofOptions Clone() {
-      return new OneofOptions(this);
-    }
-
-    /// <summary>Field number for the "uninterpreted_option" field.</summary>
-    public const int UninterpretedOptionFieldNumber = 999;
-    private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.UninterpretedOption> _repeated_uninterpretedOption_codec
-        = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
-    private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
-    /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
-      get { return uninterpretedOption_; }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override bool Equals(object other) {
-      return Equals(other as OneofOptions);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public bool Equals(OneofOptions other) {
-      if (ReferenceEquals(other, null)) {
-        return false;
-      }
-      if (ReferenceEquals(other, this)) {
-        return true;
-      }
-      if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override int GetHashCode() {
-      int hash = 1;
-      hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
-      return hash;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public override string ToString() {
-      return pb::JsonFormatter.ToDiagnosticString(this);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void WriteTo(pb::CodedOutputStream output) {
-      uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int CalculateSize() {
-      int size = 0;
-      size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
-      return size;
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(OneofOptions other) {
-      if (other == null) {
-        return;
-      }
-      uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
-    }
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public void MergeFrom(pb::CodedInputStream input) {
-      uint tag;
-      while ((tag = input.ReadTag()) != 0) {
-        switch(tag) {
-          default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
-            break;
-          case 7994: {
-            uninterpretedOption_.AddEntriesFrom(input, _repeated_uninterpretedOption_codec);
-            break;
-          }
-        }
-      }
-    }
-
-  }
-
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class EnumOptions : pb::IMessage<EnumOptions> {
     private static readonly pb::MessageParser<EnumOptions> _parser = new pb::MessageParser<EnumOptions>(() => new EnumOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<EnumOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[14]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[12]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumOptions(EnumOptions other) : this() {
       allowAlias_ = other.allowAlias_;
       deprecated_ = other.deprecated_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumOptions Clone() {
       return new EnumOptions(this);
     }
@@ -4885,10 +3754,9 @@
     public const int AllowAliasFieldNumber = 2;
     private bool allowAlias_;
     /// <summary>
-    /// Set this option to true to allow mapping different tag names to the same
-    /// value.
+    ///  Set this option to true to allow mapping different tag names to the same
+    ///  value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool AllowAlias {
       get { return allowAlias_; }
       set {
@@ -4900,12 +3768,11 @@
     public const int DeprecatedFieldNumber = 3;
     private bool deprecated_;
     /// <summary>
-    /// Is this enum deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for the enum, or it will be completely ignored; in the very least, this
-    /// is a formalization for deprecating enums.
+    ///  Is this enum deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for the enum, or it will be completely ignored; in the very least, this
+    ///  is a formalization for deprecating enums.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -4919,19 +3786,16 @@
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as EnumOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(EnumOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -4942,27 +3806,21 @@
       if (AllowAlias != other.AllowAlias) return false;
       if (Deprecated != other.Deprecated) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (AllowAlias != false) hash ^= AllowAlias.GetHashCode();
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (AllowAlias != false) {
         output.WriteRawTag(16);
@@ -4973,12 +3831,8 @@
         output.WriteBool(Deprecated);
       }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (AllowAlias != false) {
@@ -4988,13 +3842,9 @@
         size += 1 + 1;
       }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(EnumOptions other) {
       if (other == null) {
         return;
@@ -5006,16 +3856,14 @@
         Deprecated = other.Deprecated;
       }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 16: {
             AllowAlias = input.ReadBool();
@@ -5035,39 +3883,30 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class EnumValueOptions : pb::IMessage<EnumValueOptions> {
     private static readonly pb::MessageParser<EnumValueOptions> _parser = new pb::MessageParser<EnumValueOptions>(() => new EnumValueOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<EnumValueOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[15]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[13]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValueOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValueOptions(EnumValueOptions other) : this() {
       deprecated_ = other.deprecated_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValueOptions Clone() {
       return new EnumValueOptions(this);
     }
@@ -5076,12 +3915,11 @@
     public const int DeprecatedFieldNumber = 1;
     private bool deprecated_;
     /// <summary>
-    /// Is this enum value deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for the enum value, or it will be completely ignored; in the very least,
-    /// this is a formalization for deprecating enum values.
+    ///  Is this enum value deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for the enum value, or it will be completely ignored; in the very least,
+    ///  this is a formalization for deprecating enum values.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -5095,19 +3933,16 @@
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as EnumValueOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(EnumValueOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5117,51 +3952,37 @@
       }
       if (Deprecated != other.Deprecated) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Deprecated != false) {
         output.WriteRawTag(8);
         output.WriteBool(Deprecated);
       }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Deprecated != false) {
         size += 1 + 1;
       }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(EnumValueOptions other) {
       if (other == null) {
         return;
@@ -5170,16 +3991,14 @@
         Deprecated = other.Deprecated;
       }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 8: {
             Deprecated = input.ReadBool();
@@ -5195,39 +4014,30 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class ServiceOptions : pb::IMessage<ServiceOptions> {
     private static readonly pb::MessageParser<ServiceOptions> _parser = new pb::MessageParser<ServiceOptions>(() => new ServiceOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ServiceOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[16]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[14]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ServiceOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ServiceOptions(ServiceOptions other) : this() {
       deprecated_ = other.deprecated_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ServiceOptions Clone() {
       return new ServiceOptions(this);
     }
@@ -5236,12 +4046,11 @@
     public const int DeprecatedFieldNumber = 33;
     private bool deprecated_;
     /// <summary>
-    /// Is this service deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for the service, or it will be completely ignored; in the very least,
-    /// this is a formalization for deprecating services.
+    ///  Is this service deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for the service, or it will be completely ignored; in the very least,
+    ///  this is a formalization for deprecating services.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -5255,19 +4064,16 @@
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ServiceOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ServiceOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5277,51 +4083,37 @@
       }
       if (Deprecated != other.Deprecated) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Deprecated != false) {
         output.WriteRawTag(136, 2);
         output.WriteBool(Deprecated);
       }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Deprecated != false) {
         size += 2 + 1;
       }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ServiceOptions other) {
       if (other == null) {
         return;
@@ -5330,16 +4122,14 @@
         Deprecated = other.Deprecated;
       }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 264: {
             Deprecated = input.ReadBool();
@@ -5355,40 +4145,30 @@
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class MethodOptions : pb::IMessage<MethodOptions> {
     private static readonly pb::MessageParser<MethodOptions> _parser = new pb::MessageParser<MethodOptions>(() => new MethodOptions());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<MethodOptions> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[17]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[15]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;
-
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MethodOptions() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MethodOptions(MethodOptions other) : this() {
       deprecated_ = other.deprecated_;
-      idempotencyLevel_ = other.idempotencyLevel_;
       uninterpretedOption_ = other.uninterpretedOption_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public MethodOptions Clone() {
       return new MethodOptions(this);
     }
@@ -5397,12 +4177,11 @@
     public const int DeprecatedFieldNumber = 33;
     private bool deprecated_;
     /// <summary>
-    /// Is this method deprecated?
-    /// Depending on the target platform, this can emit Deprecated annotations
-    /// for the method, or it will be completely ignored; in the very least,
-    /// this is a formalization for deprecating methods.
+    ///  Is this method deprecated?
+    ///  Depending on the target platform, this can emit Deprecated annotations
+    ///  for the method, or it will be completely ignored; in the very least,
+    ///  this is a formalization for deprecating methods.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Deprecated {
       get { return deprecated_; }
       set {
@@ -5410,36 +4189,22 @@
       }
     }
 
-    /// <summary>Field number for the "idempotency_level" field.</summary>
-    public const int IdempotencyLevelFieldNumber = 34;
-    private global::Google.Protobuf.Reflection.MethodOptions.Types.IdempotencyLevel idempotencyLevel_ = 0;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public global::Google.Protobuf.Reflection.MethodOptions.Types.IdempotencyLevel IdempotencyLevel {
-      get { return idempotencyLevel_; }
-      set {
-        idempotencyLevel_ = value;
-      }
-    }
-
     /// <summary>Field number for the "uninterpreted_option" field.</summary>
     public const int UninterpretedOptionFieldNumber = 999;
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.UninterpretedOption> _repeated_uninterpretedOption_codec
         = pb::FieldCodec.ForMessage(7994, global::Google.Protobuf.Reflection.UninterpretedOption.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> uninterpretedOption_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption>();
     /// <summary>
-    /// The parser stores options it doesn't recognize here. See above.
+    ///  The parser stores options it doesn't recognize here. See above.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption> UninterpretedOption {
       get { return uninterpretedOption_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as MethodOptions);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(MethodOptions other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5448,61 +4213,38 @@
         return true;
       }
       if (Deprecated != other.Deprecated) return false;
-      if (IdempotencyLevel != other.IdempotencyLevel) return false;
       if(!uninterpretedOption_.Equals(other.uninterpretedOption_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
-      if (IdempotencyLevel != 0) hash ^= IdempotencyLevel.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Deprecated != false) {
         output.WriteRawTag(136, 2);
         output.WriteBool(Deprecated);
       }
-      if (IdempotencyLevel != 0) {
-        output.WriteRawTag(144, 2);
-        output.WriteEnum((int) IdempotencyLevel);
-      }
       uninterpretedOption_.WriteTo(output, _repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Deprecated != false) {
         size += 2 + 1;
       }
-      if (IdempotencyLevel != 0) {
-        size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) IdempotencyLevel);
-      }
       size += uninterpretedOption_.CalculateSize(_repeated_uninterpretedOption_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(MethodOptions other) {
       if (other == null) {
         return;
@@ -5510,29 +4252,20 @@
       if (other.Deprecated != false) {
         Deprecated = other.Deprecated;
       }
-      if (other.IdempotencyLevel != 0) {
-        IdempotencyLevel = other.IdempotencyLevel;
-      }
       uninterpretedOption_.Add(other.uninterpretedOption_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);
+            input.SkipLastField();
             break;
           case 264: {
             Deprecated = input.ReadBool();
             break;
           }
-          case 272: {
-            idempotencyLevel_ = (global::Google.Protobuf.Reflection.MethodOptions.Types.IdempotencyLevel) input.ReadEnum();
-            break;
-          }
           case 7994: {
             uninterpretedOption_.AddEntriesFrom(input, _repeated_uninterpretedOption_codec);
             break;
@@ -5541,64 +4274,35 @@
       }
     }
 
-    #region Nested types
-    /// <summary>Container for nested types declared in the MethodOptions message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public static partial class Types {
-      /// <summary>
-      /// Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
-      /// or neither? HTTP based RPC implementation may choose GET verb for safe
-      /// methods, and PUT verb for idempotent methods instead of the default POST.
-      /// </summary>
-      internal enum IdempotencyLevel {
-        [pbr::OriginalName("IDEMPOTENCY_UNKNOWN")] IdempotencyUnknown = 0,
-        /// <summary>
-        /// implies idempotent
-        /// </summary>
-        [pbr::OriginalName("NO_SIDE_EFFECTS")] NoSideEffects = 1,
-        /// <summary>
-        /// idempotent, but may have side effects
-        /// </summary>
-        [pbr::OriginalName("IDEMPOTENT")] Idempotent = 2,
-      }
-
-    }
-    #endregion
-
   }
 
   /// <summary>
-  /// A message representing a option the parser does not recognize. This only
-  /// appears in options protos created by the compiler::Parser class.
-  /// DescriptorPool resolves these when building Descriptor objects. Therefore,
-  /// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-  /// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-  /// in them.
+  ///  A message representing a option the parser does not recognize. This only
+  ///  appears in options protos created by the compiler::Parser class.
+  ///  DescriptorPool resolves these when building Descriptor objects. Therefore,
+  ///  options protos in descriptor objects (e.g. returned by Descriptor::options(),
+  ///  or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
+  ///  in them.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class UninterpretedOption : pb::IMessage<UninterpretedOption> {
     private static readonly pb::MessageParser<UninterpretedOption> _parser = new pb::MessageParser<UninterpretedOption>(() => new UninterpretedOption());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<UninterpretedOption> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[18]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[16]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UninterpretedOption() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UninterpretedOption(UninterpretedOption other) : this() {
       name_ = other.name_.Clone();
       identifierValue_ = other.identifierValue_;
@@ -5607,10 +4311,8 @@
       doubleValue_ = other.doubleValue_;
       stringValue_ = other.stringValue_;
       aggregateValue_ = other.aggregateValue_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UninterpretedOption Clone() {
       return new UninterpretedOption(this);
     }
@@ -5620,7 +4322,6 @@
     private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart> _repeated_name_codec
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart> name_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart>();
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart> Name {
       get { return name_; }
     }
@@ -5629,10 +4330,9 @@
     public const int IdentifierValueFieldNumber = 3;
     private string identifierValue_ = "";
     /// <summary>
-    /// The value of the uninterpreted option, in whatever type the tokenizer
-    /// identified it as during parsing. Exactly one of these should be set.
+    ///  The value of the uninterpreted option, in whatever type the tokenizer
+    ///  identified it as during parsing. Exactly one of these should be set.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string IdentifierValue {
       get { return identifierValue_; }
       set {
@@ -5643,7 +4343,6 @@
     /// <summary>Field number for the "positive_int_value" field.</summary>
     public const int PositiveIntValueFieldNumber = 4;
     private ulong positiveIntValue_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong PositiveIntValue {
       get { return positiveIntValue_; }
       set {
@@ -5654,7 +4353,6 @@
     /// <summary>Field number for the "negative_int_value" field.</summary>
     public const int NegativeIntValueFieldNumber = 5;
     private long negativeIntValue_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long NegativeIntValue {
       get { return negativeIntValue_; }
       set {
@@ -5665,7 +4363,6 @@
     /// <summary>Field number for the "double_value" field.</summary>
     public const int DoubleValueFieldNumber = 6;
     private double doubleValue_;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public double DoubleValue {
       get { return doubleValue_; }
       set {
@@ -5676,7 +4373,6 @@
     /// <summary>Field number for the "string_value" field.</summary>
     public const int StringValueFieldNumber = 7;
     private pb::ByteString stringValue_ = pb::ByteString.Empty;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString StringValue {
       get { return stringValue_; }
       set {
@@ -5687,7 +4383,6 @@
     /// <summary>Field number for the "aggregate_value" field.</summary>
     public const int AggregateValueFieldNumber = 8;
     private string aggregateValue_ = "";
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string AggregateValue {
       get { return aggregateValue_; }
       set {
@@ -5695,12 +4390,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as UninterpretedOption);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(UninterpretedOption other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -5712,34 +4405,28 @@
       if (IdentifierValue != other.IdentifierValue) return false;
       if (PositiveIntValue != other.PositiveIntValue) return false;
       if (NegativeIntValue != other.NegativeIntValue) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleValue, other.DoubleValue)) return false;
+      if (DoubleValue != other.DoubleValue) return false;
       if (StringValue != other.StringValue) return false;
       if (AggregateValue != other.AggregateValue) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= name_.GetHashCode();
       if (IdentifierValue.Length != 0) hash ^= IdentifierValue.GetHashCode();
       if (PositiveIntValue != 0UL) hash ^= PositiveIntValue.GetHashCode();
       if (NegativeIntValue != 0L) hash ^= NegativeIntValue.GetHashCode();
-      if (DoubleValue != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleValue);
+      if (DoubleValue != 0D) hash ^= DoubleValue.GetHashCode();
       if (StringValue.Length != 0) hash ^= StringValue.GetHashCode();
       if (AggregateValue.Length != 0) hash ^= AggregateValue.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       name_.WriteTo(output, _repeated_name_codec);
       if (IdentifierValue.Length != 0) {
@@ -5766,12 +4453,8 @@
         output.WriteRawTag(66);
         output.WriteString(AggregateValue);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += name_.CalculateSize(_repeated_name_codec);
@@ -5793,13 +4476,9 @@
       if (AggregateValue.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(AggregateValue);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(UninterpretedOption other) {
       if (other == null) {
         return;
@@ -5823,16 +4502,14 @@
       if (other.AggregateValue.Length != 0) {
         AggregateValue = other.AggregateValue;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 18: {
             name_.AddEntriesFrom(input, _repeated_name_codec);
@@ -5868,46 +4545,39 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the UninterpretedOption message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       /// <summary>
-      /// The name of the uninterpreted option.  Each string represents a segment in
-      /// a dot-separated name.  is_extension is true iff a segment represents an
-      /// extension (denoted with parentheses in options specs in .proto files).
-      /// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
-      /// "foo.(bar.baz).qux".
+      ///  The name of the uninterpreted option.  Each string represents a segment in
+      ///  a dot-separated name.  is_extension is true iff a segment represents an
+      ///  extension (denoted with parentheses in options specs in .proto files).
+      ///  E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
+      ///  "foo.(bar.baz).qux".
       /// </summary>
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       internal sealed partial class NamePart : pb::IMessage<NamePart> {
         private static readonly pb::MessageParser<NamePart> _parser = new pb::MessageParser<NamePart>(() => new NamePart());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<NamePart> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.Reflection.UninterpretedOption.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NamePart() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NamePart(NamePart other) : this() {
           namePart_ = other.namePart_;
           isExtension_ = other.isExtension_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public NamePart Clone() {
           return new NamePart(this);
         }
@@ -5915,7 +4585,6 @@
         /// <summary>Field number for the "name_part" field.</summary>
         public const int NamePart_FieldNumber = 1;
         private string namePart_ = "";
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public string NamePart_ {
           get { return namePart_; }
           set {
@@ -5926,7 +4595,6 @@
         /// <summary>Field number for the "is_extension" field.</summary>
         public const int IsExtensionFieldNumber = 2;
         private bool isExtension_;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool IsExtension {
           get { return isExtension_; }
           set {
@@ -5934,12 +4602,10 @@
           }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as NamePart);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(NamePart other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -5949,26 +4615,20 @@
           }
           if (NamePart_ != other.NamePart_) return false;
           if (IsExtension != other.IsExtension) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           if (NamePart_.Length != 0) hash ^= NamePart_.GetHashCode();
           if (IsExtension != false) hash ^= IsExtension.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           if (NamePart_.Length != 0) {
             output.WriteRawTag(10);
@@ -5978,12 +4638,8 @@
             output.WriteRawTag(16);
             output.WriteBool(IsExtension);
           }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           if (NamePart_.Length != 0) {
@@ -5992,13 +4648,9 @@
           if (IsExtension != false) {
             size += 1 + 1;
           }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(NamePart other) {
           if (other == null) {
             return;
@@ -6009,16 +4661,14 @@
           if (other.IsExtension != false) {
             IsExtension = other.IsExtension;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 10: {
                 NamePart_ = input.ReadString();
@@ -6040,39 +4690,32 @@
   }
 
   /// <summary>
-  /// Encapsulates information about the original source file from which a
-  /// FileDescriptorProto was generated.
+  ///  Encapsulates information about the original source file from which a
+  ///  FileDescriptorProto was generated.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class SourceCodeInfo : pb::IMessage<SourceCodeInfo> {
     private static readonly pb::MessageParser<SourceCodeInfo> _parser = new pb::MessageParser<SourceCodeInfo>(() => new SourceCodeInfo());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<SourceCodeInfo> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[19]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[17]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SourceCodeInfo() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SourceCodeInfo(SourceCodeInfo other) : this() {
       location_ = other.location_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SourceCodeInfo Clone() {
       return new SourceCodeInfo(this);
     }
@@ -6083,61 +4726,58 @@
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location> location_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location>();
     /// <summary>
-    /// A Location identifies a piece of source code in a .proto file which
-    /// corresponds to a particular definition.  This information is intended
-    /// to be useful to IDEs, code indexers, documentation generators, and similar
-    /// tools.
+    ///  A Location identifies a piece of source code in a .proto file which
+    ///  corresponds to a particular definition.  This information is intended
+    ///  to be useful to IDEs, code indexers, documentation generators, and similar
+    ///  tools.
     ///
-    /// For example, say we have a file like:
-    ///   message Foo {
-    ///     optional string foo = 1;
-    ///   }
-    /// Let's look at just the field definition:
-    ///   optional string foo = 1;
-    ///   ^       ^^     ^^  ^  ^^^
-    ///   a       bc     de  f  ghi
-    /// We have the following locations:
-    ///   span   path               represents
-    ///   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-    ///   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-    ///   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-    ///   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-    ///   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
+    ///  For example, say we have a file like:
+    ///    message Foo {
+    ///      optional string foo = 1;
+    ///    }
+    ///  Let's look at just the field definition:
+    ///    optional string foo = 1;
+    ///    ^       ^^     ^^  ^  ^^^
+    ///    a       bc     de  f  ghi
+    ///  We have the following locations:
+    ///    span   path               represents
+    ///    [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
+    ///    [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
+    ///    [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
+    ///    [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
+    ///    [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
     ///
-    /// Notes:
-    /// - A location may refer to a repeated field itself (i.e. not to any
-    ///   particular index within it).  This is used whenever a set of elements are
-    ///   logically enclosed in a single code segment.  For example, an entire
-    ///   extend block (possibly containing multiple extension definitions) will
-    ///   have an outer location whose path refers to the "extensions" repeated
-    ///   field without an index.
-    /// - Multiple locations may have the same path.  This happens when a single
-    ///   logical declaration is spread out across multiple places.  The most
-    ///   obvious example is the "extend" block again -- there may be multiple
-    ///   extend blocks in the same scope, each of which will have the same path.
-    /// - A location's span is not always a subset of its parent's span.  For
-    ///   example, the "extendee" of an extension declaration appears at the
-    ///   beginning of the "extend" block and is shared by all extensions within
-    ///   the block.
-    /// - Just because a location's span is a subset of some other location's span
-    ///   does not mean that it is a descendent.  For example, a "group" defines
-    ///   both a type and a field in a single declaration.  Thus, the locations
-    ///   corresponding to the type and field and their components will overlap.
-    /// - Code which tries to interpret locations should probably be designed to
-    ///   ignore those that it doesn't understand, as more types of locations could
-    ///   be recorded in the future.
+    ///  Notes:
+    ///  - A location may refer to a repeated field itself (i.e. not to any
+    ///    particular index within it).  This is used whenever a set of elements are
+    ///    logically enclosed in a single code segment.  For example, an entire
+    ///    extend block (possibly containing multiple extension definitions) will
+    ///    have an outer location whose path refers to the "extensions" repeated
+    ///    field without an index.
+    ///  - Multiple locations may have the same path.  This happens when a single
+    ///    logical declaration is spread out across multiple places.  The most
+    ///    obvious example is the "extend" block again -- there may be multiple
+    ///    extend blocks in the same scope, each of which will have the same path.
+    ///  - A location's span is not always a subset of its parent's span.  For
+    ///    example, the "extendee" of an extension declaration appears at the
+    ///    beginning of the "extend" block and is shared by all extensions within
+    ///    the block.
+    ///  - Just because a location's span is a subset of some other location's span
+    ///    does not mean that it is a descendent.  For example, a "group" defines
+    ///    both a type and a field in a single declaration.  Thus, the locations
+    ///    corresponding to the type and field and their components will overlap.
+    ///  - Code which tries to interpret locations should probably be designed to
+    ///    ignore those that it doesn't understand, as more types of locations could
+    ///    be recorded in the future.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location> Location {
       get { return location_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as SourceCodeInfo);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(SourceCodeInfo other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6146,58 +4786,42 @@
         return true;
       }
       if(!location_.Equals(other.location_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= location_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       location_.WriteTo(output, _repeated_location_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += location_.CalculateSize(_repeated_location_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(SourceCodeInfo other) {
       if (other == null) {
         return;
       }
       location_.Add(other.location_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             location_.AddEntriesFrom(input, _repeated_location_codec);
@@ -6209,42 +4833,35 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the SourceCodeInfo message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       internal sealed partial class Location : pb::IMessage<Location> {
         private static readonly pb::MessageParser<Location> _parser = new pb::MessageParser<Location>(() => new Location());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<Location> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.Reflection.SourceCodeInfo.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public Location() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public Location(Location other) : this() {
           path_ = other.path_.Clone();
           span_ = other.span_.Clone();
           leadingComments_ = other.leadingComments_;
           trailingComments_ = other.trailingComments_;
           leadingDetachedComments_ = other.leadingDetachedComments_.Clone();
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public Location Clone() {
           return new Location(this);
         }
@@ -6255,31 +4872,30 @@
             = pb::FieldCodec.ForInt32(10);
         private readonly pbc::RepeatedField<int> path_ = new pbc::RepeatedField<int>();
         /// <summary>
-        /// Identifies which part of the FileDescriptorProto was defined at this
-        /// location.
+        ///  Identifies which part of the FileDescriptorProto was defined at this
+        ///  location.
         ///
-        /// Each element is a field number or an index.  They form a path from
-        /// the root FileDescriptorProto to the place where the definition.  For
-        /// example, this path:
-        ///   [ 4, 3, 2, 7, 1 ]
-        /// refers to:
-        ///   file.message_type(3)  // 4, 3
-        ///       .field(7)         // 2, 7
-        ///       .name()           // 1
-        /// This is because FileDescriptorProto.message_type has field number 4:
-        ///   repeated DescriptorProto message_type = 4;
-        /// and DescriptorProto.field has field number 2:
-        ///   repeated FieldDescriptorProto field = 2;
-        /// and FieldDescriptorProto.name has field number 1:
-        ///   optional string name = 1;
+        ///  Each element is a field number or an index.  They form a path from
+        ///  the root FileDescriptorProto to the place where the definition.  For
+        ///  example, this path:
+        ///    [ 4, 3, 2, 7, 1 ]
+        ///  refers to:
+        ///    file.message_type(3)  // 4, 3
+        ///        .field(7)         // 2, 7
+        ///        .name()           // 1
+        ///  This is because FileDescriptorProto.message_type has field number 4:
+        ///    repeated DescriptorProto message_type = 4;
+        ///  and DescriptorProto.field has field number 2:
+        ///    repeated FieldDescriptorProto field = 2;
+        ///  and FieldDescriptorProto.name has field number 1:
+        ///    optional string name = 1;
         ///
-        /// Thus, the above path gives the location of a field name.  If we removed
-        /// the last element:
-        ///   [ 4, 3, 2, 7 ]
-        /// this path refers to the whole field declaration (from the beginning
-        /// of the label to the terminating semicolon).
+        ///  Thus, the above path gives the location of a field name.  If we removed
+        ///  the last element:
+        ///    [ 4, 3, 2, 7 ]
+        ///  this path refers to the whole field declaration (from the beginning
+        ///  of the label to the terminating semicolon).
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public pbc::RepeatedField<int> Path {
           get { return path_; }
         }
@@ -6290,13 +4906,12 @@
             = pb::FieldCodec.ForInt32(18);
         private readonly pbc::RepeatedField<int> span_ = new pbc::RepeatedField<int>();
         /// <summary>
-        /// Always has exactly three or four elements: start line, start column,
-        /// end line (optional, otherwise assumed same as start line), end column.
-        /// These are packed into a single field for efficiency.  Note that line
-        /// and column numbers are zero-based -- typically you will want to add
-        /// 1 to each before displaying to a user.
+        ///  Always has exactly three or four elements: start line, start column,
+        ///  end line (optional, otherwise assumed same as start line), end column.
+        ///  These are packed into a single field for efficiency.  Note that line
+        ///  and column numbers are zero-based -- typically you will want to add
+        ///  1 to each before displaying to a user.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public pbc::RepeatedField<int> Span {
           get { return span_; }
         }
@@ -6305,55 +4920,54 @@
         public const int LeadingCommentsFieldNumber = 3;
         private string leadingComments_ = "";
         /// <summary>
-        /// If this SourceCodeInfo represents a complete declaration, these are any
-        /// comments appearing before and after the declaration which appear to be
-        /// attached to the declaration.
+        ///  If this SourceCodeInfo represents a complete declaration, these are any
+        ///  comments appearing before and after the declaration which appear to be
+        ///  attached to the declaration.
         ///
-        /// A series of line comments appearing on consecutive lines, with no other
-        /// tokens appearing on those lines, will be treated as a single comment.
+        ///  A series of line comments appearing on consecutive lines, with no other
+        ///  tokens appearing on those lines, will be treated as a single comment.
         ///
-        /// leading_detached_comments will keep paragraphs of comments that appear
-        /// before (but not connected to) the current element. Each paragraph,
-        /// separated by empty lines, will be one comment element in the repeated
-        /// field.
+        ///  leading_detached_comments will keep paragraphs of comments that appear
+        ///  before (but not connected to) the current element. Each paragraph,
+        ///  separated by empty lines, will be one comment element in the repeated
+        ///  field.
         ///
-        /// Only the comment content is provided; comment markers (e.g. //) are
-        /// stripped out.  For block comments, leading whitespace and an asterisk
-        /// will be stripped from the beginning of each line other than the first.
-        /// Newlines are included in the output.
+        ///  Only the comment content is provided; comment markers (e.g. //) are
+        ///  stripped out.  For block comments, leading whitespace and an asterisk
+        ///  will be stripped from the beginning of each line other than the first.
+        ///  Newlines are included in the output.
         ///
-        /// Examples:
+        ///  Examples:
         ///
-        ///   optional int32 foo = 1;  // Comment attached to foo.
-        ///   // Comment attached to bar.
-        ///   optional int32 bar = 2;
+        ///    optional int32 foo = 1;  // Comment attached to foo.
+        ///    // Comment attached to bar.
+        ///    optional int32 bar = 2;
         ///
-        ///   optional string baz = 3;
-        ///   // Comment attached to baz.
-        ///   // Another line attached to baz.
+        ///    optional string baz = 3;
+        ///    // Comment attached to baz.
+        ///    // Another line attached to baz.
         ///
-        ///   // Comment attached to qux.
-        ///   //
-        ///   // Another line attached to qux.
-        ///   optional double qux = 4;
+        ///    // Comment attached to qux.
+        ///    //
+        ///    // Another line attached to qux.
+        ///    optional double qux = 4;
         ///
-        ///   // Detached comment for corge. This is not leading or trailing comments
-        ///   // to qux or corge because there are blank lines separating it from
-        ///   // both.
+        ///    // Detached comment for corge. This is not leading or trailing comments
+        ///    // to qux or corge because there are blank lines separating it from
+        ///    // both.
         ///
-        ///   // Detached comment for corge paragraph 2.
+        ///    // Detached comment for corge paragraph 2.
         ///
-        ///   optional string corge = 5;
-        ///   /* Block comment attached
-        ///    * to corge.  Leading asterisks
-        ///    * will be removed. */
-        ///   /* Block comment attached to
-        ///    * grault. */
-        ///   optional int32 grault = 6;
+        ///    optional string corge = 5;
+        ///    /* Block comment attached
+        ///     * to corge.  Leading asterisks
+        ///     * will be removed. */
+        ///    /* Block comment attached to
+        ///     * grault. */
+        ///    optional int32 grault = 6;
         ///
-        ///   // ignored detached comments.
+        ///    // ignored detached comments.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public string LeadingComments {
           get { return leadingComments_; }
           set {
@@ -6364,7 +4978,6 @@
         /// <summary>Field number for the "trailing_comments" field.</summary>
         public const int TrailingCommentsFieldNumber = 4;
         private string trailingComments_ = "";
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public string TrailingComments {
           get { return trailingComments_; }
           set {
@@ -6377,17 +4990,14 @@
         private static readonly pb::FieldCodec<string> _repeated_leadingDetachedComments_codec
             = pb::FieldCodec.ForString(50);
         private readonly pbc::RepeatedField<string> leadingDetachedComments_ = new pbc::RepeatedField<string>();
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public pbc::RepeatedField<string> LeadingDetachedComments {
           get { return leadingDetachedComments_; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as Location);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(Location other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -6400,10 +5010,9 @@
           if (LeadingComments != other.LeadingComments) return false;
           if (TrailingComments != other.TrailingComments) return false;
           if(!leadingDetachedComments_.Equals(other.leadingDetachedComments_)) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           hash ^= path_.GetHashCode();
@@ -6411,18 +5020,13 @@
           if (LeadingComments.Length != 0) hash ^= LeadingComments.GetHashCode();
           if (TrailingComments.Length != 0) hash ^= TrailingComments.GetHashCode();
           hash ^= leadingDetachedComments_.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           path_.WriteTo(output, _repeated_path_codec);
           span_.WriteTo(output, _repeated_span_codec);
@@ -6435,12 +5039,8 @@
             output.WriteString(TrailingComments);
           }
           leadingDetachedComments_.WriteTo(output, _repeated_leadingDetachedComments_codec);
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           size += path_.CalculateSize(_repeated_path_codec);
@@ -6452,13 +5052,9 @@
             size += 1 + pb::CodedOutputStream.ComputeStringSize(TrailingComments);
           }
           size += leadingDetachedComments_.CalculateSize(_repeated_leadingDetachedComments_codec);
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(Location other) {
           if (other == null) {
             return;
@@ -6472,16 +5068,14 @@
             TrailingComments = other.TrailingComments;
           }
           leadingDetachedComments_.Add(other.leadingDetachedComments_);
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 10:
               case 8: {
@@ -6517,40 +5111,33 @@
   }
 
   /// <summary>
-  /// Describes the relationship between generated code and its original source
-  /// file. A GeneratedCodeInfo message is associated with only one generated
-  /// source file, but may contain references to different source .proto files.
+  ///  Describes the relationship between generated code and its original source
+  ///  file. A GeneratedCodeInfo message is associated with only one generated
+  ///  source file, but may contain references to different source .proto files.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   internal sealed partial class GeneratedCodeInfo : pb::IMessage<GeneratedCodeInfo> {
     private static readonly pb::MessageParser<GeneratedCodeInfo> _parser = new pb::MessageParser<GeneratedCodeInfo>(() => new GeneratedCodeInfo());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<GeneratedCodeInfo> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[20]; }
+      get { return global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor.MessageTypes[18]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public GeneratedCodeInfo() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public GeneratedCodeInfo(GeneratedCodeInfo other) : this() {
       annotation_ = other.annotation_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public GeneratedCodeInfo Clone() {
       return new GeneratedCodeInfo(this);
     }
@@ -6561,20 +5148,17 @@
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation> annotation_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation>();
     /// <summary>
-    /// An Annotation connects some span of text in generated code to an element
-    /// of its generating .proto file.
+    ///  An Annotation connects some span of text in generated code to an element
+    ///  of its generating .proto file.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation> Annotation {
       get { return annotation_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as GeneratedCodeInfo);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(GeneratedCodeInfo other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -6583,58 +5167,42 @@
         return true;
       }
       if(!annotation_.Equals(other.annotation_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= annotation_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       annotation_.WriteTo(output, _repeated_annotation_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += annotation_.CalculateSize(_repeated_annotation_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(GeneratedCodeInfo other) {
       if (other == null) {
         return;
       }
       annotation_.Add(other.annotation_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             annotation_.AddEntriesFrom(input, _repeated_annotation_codec);
@@ -6646,41 +5214,34 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the GeneratedCodeInfo message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
       internal sealed partial class Annotation : pb::IMessage<Annotation> {
         private static readonly pb::MessageParser<Annotation> _parser = new pb::MessageParser<Annotation>(() => new Annotation());
-        private pb::UnknownFieldSet _unknownFields;
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pb::MessageParser<Annotation> Parser { get { return _parser; } }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public static pbr::MessageDescriptor Descriptor {
           get { return global::Google.Protobuf.Reflection.GeneratedCodeInfo.Descriptor.NestedTypes[0]; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         pbr::MessageDescriptor pb::IMessage.Descriptor {
           get { return Descriptor; }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public Annotation() {
           OnConstruction();
         }
 
         partial void OnConstruction();
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public Annotation(Annotation other) : this() {
           path_ = other.path_.Clone();
           sourceFile_ = other.sourceFile_;
           begin_ = other.begin_;
           end_ = other.end_;
-          _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public Annotation Clone() {
           return new Annotation(this);
         }
@@ -6691,10 +5252,9 @@
             = pb::FieldCodec.ForInt32(10);
         private readonly pbc::RepeatedField<int> path_ = new pbc::RepeatedField<int>();
         /// <summary>
-        /// Identifies the element in the original source .proto file. This field
-        /// is formatted the same as SourceCodeInfo.Location.path.
+        ///  Identifies the element in the original source .proto file. This field
+        ///  is formatted the same as SourceCodeInfo.Location.path.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public pbc::RepeatedField<int> Path {
           get { return path_; }
         }
@@ -6703,9 +5263,8 @@
         public const int SourceFileFieldNumber = 2;
         private string sourceFile_ = "";
         /// <summary>
-        /// Identifies the filesystem path to the original source .proto.
+        ///  Identifies the filesystem path to the original source .proto.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public string SourceFile {
           get { return sourceFile_; }
           set {
@@ -6717,10 +5276,9 @@
         public const int BeginFieldNumber = 3;
         private int begin_;
         /// <summary>
-        /// Identifies the starting offset in bytes in the generated code
-        /// that relates to the identified object.
+        ///  Identifies the starting offset in bytes in the generated code
+        ///  that relates to the identified object.
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int Begin {
           get { return begin_; }
           set {
@@ -6732,11 +5290,10 @@
         public const int EndFieldNumber = 4;
         private int end_;
         /// <summary>
-        /// Identifies the ending offset in bytes in the generated code that
-        /// relates to the identified offset. The end offset should be one past
-        /// the last relevant byte (so the length of the text = end - begin).
+        ///  Identifies the ending offset in bytes in the generated code that
+        ///  relates to the identified offset. The end offset should be one past
+        ///  the last relevant byte (so the length of the text = end - begin).
         /// </summary>
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int End {
           get { return end_; }
           set {
@@ -6744,12 +5301,10 @@
           }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override bool Equals(object other) {
           return Equals(other as Annotation);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public bool Equals(Annotation other) {
           if (ReferenceEquals(other, null)) {
             return false;
@@ -6761,28 +5316,22 @@
           if (SourceFile != other.SourceFile) return false;
           if (Begin != other.Begin) return false;
           if (End != other.End) return false;
-          return Equals(_unknownFields, other._unknownFields);
+          return true;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override int GetHashCode() {
           int hash = 1;
           hash ^= path_.GetHashCode();
           if (SourceFile.Length != 0) hash ^= SourceFile.GetHashCode();
           if (Begin != 0) hash ^= Begin.GetHashCode();
           if (End != 0) hash ^= End.GetHashCode();
-          if (_unknownFields != null) {
-            hash ^= _unknownFields.GetHashCode();
-          }
           return hash;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public override string ToString() {
           return pb::JsonFormatter.ToDiagnosticString(this);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void WriteTo(pb::CodedOutputStream output) {
           path_.WriteTo(output, _repeated_path_codec);
           if (SourceFile.Length != 0) {
@@ -6797,12 +5346,8 @@
             output.WriteRawTag(32);
             output.WriteInt32(End);
           }
-          if (_unknownFields != null) {
-            _unknownFields.WriteTo(output);
-          }
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public int CalculateSize() {
           int size = 0;
           size += path_.CalculateSize(_repeated_path_codec);
@@ -6815,13 +5360,9 @@
           if (End != 0) {
             size += 1 + pb::CodedOutputStream.ComputeInt32Size(End);
           }
-          if (_unknownFields != null) {
-            size += _unknownFields.CalculateSize();
-          }
           return size;
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(Annotation other) {
           if (other == null) {
             return;
@@ -6836,16 +5377,14 @@
           if (other.End != 0) {
             End = other.End;
           }
-          _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
         }
 
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
         public void MergeFrom(pb::CodedInputStream input) {
           uint tag;
           while ((tag = input.ReadTag()) != 0) {
             switch(tag) {
               default:
-                _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+                input.SkipLastField();
                 break;
               case 10:
               case 8: {
diff --git a/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
index 89c73a6..c732c93 100644
--- a/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
@@ -112,10 +112,5 @@
         {
             return File.DescriptorPool.FindSymbol<EnumValueDescriptor>(FullName + "." + name);
         }
-
-        /// <summary>
-        /// The (possibly empty) set of custom options for this enum.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
     }
 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
index 8b838c6..b212ce9 100644
--- a/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
@@ -66,10 +66,5 @@
         /// Returns the enum descriptor that this value is part of.
         /// </summary>
         public EnumDescriptor EnumDescriptor { get { return enumDescriptor; } }
-
-        /// <summary>
-        /// The (possibly empty) set of custom options for this enum value.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
     }
 }
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
index 2a3d5c7..6c6f6ee 100644
--- a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
@@ -97,7 +97,7 @@
             // We could trust the generated code and check whether the type of the property is
             // a MapField, but that feels a tad nasty.
             this.propertyName = propertyName;
-            JsonName =  Proto.JsonName == "" ? JsonFormatter.ToJsonName(Proto.Name) : Proto.JsonName;
+            JsonName =  Proto.JsonName == "" ? JsonFormatter.ToCamelCase(Proto.Name) : Proto.JsonName;
         }
     
 
@@ -251,11 +251,6 @@
         }
 
         /// <summary>
-        /// The (possibly empty) set of custom options for this field.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
-
-        /// <summary>
         /// Look up and cross-link all field types etc.
         /// </summary>
         internal void CrossLink()
diff --git a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
index 9124bee..ab7cd92 100644
--- a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
@@ -251,6 +251,17 @@
                     "Dependencies passed to FileDescriptor.BuildFrom() don't match " +
                     "those listed in the FileDescriptorProto.");
             }
+            for (int i = 0; i < proto.Dependency.Count; i++)
+            {
+                if (dependencies[i].Name != proto.Dependency[i])
+                {
+                    throw new DescriptorValidationException(
+                        result,
+                        "Dependencies passed to FileDescriptor.BuildFrom() don't match " +
+                        "those listed in the FileDescriptorProto. Expected: " +
+                        proto.Dependency[i] + " but was: " + dependencies[i].Name);
+                }
+            }
 
             result.CrossLink();
             return result;
@@ -329,10 +340,5 @@
         /// The file descriptor for <c>descriptor.proto</c>.
         /// </value>
         public static FileDescriptor DescriptorProtoFileDescriptor { get { return DescriptorReflection.Descriptor; } }
-
-        /// <summary>
-        /// The (possibly empty) set of custom options for this file.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
     }
-}
+}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
old mode 100755
new mode 100644
index 86942ac..f5a835e
--- a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
@@ -34,10 +34,6 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Linq;
-#if NET35
-// Needed for ReadOnlyDictionary, which does not exist in .NET 3.5
-using Google.Protobuf.Collections;
-#endif
 
 namespace Google.Protobuf.Reflection
 {
@@ -221,11 +217,6 @@
             File.DescriptorPool.FindSymbol<T>(FullName + "." + name);
 
         /// <summary>
-        /// The (possibly empty) set of custom options for this message.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
-
-        /// <summary>
         /// Looks up and cross-links all fields and nested types.
         /// </summary>
         internal void CrossLink()
diff --git a/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
index 19d7f8a..f9539f6 100644
--- a/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
@@ -67,11 +67,6 @@
         /// </value>
         public bool IsServerStreaming { get { return proto.ServerStreaming; } }
 
-        /// <summary>
-        /// The (possibly empty) set of custom options for this method.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
-
         internal MethodDescriptor(MethodDescriptorProto proto, FileDescriptor file,
                                   ServiceDescriptor parent, int index)
             : base(file, parent.FullName + "." + proto.Name, index)
diff --git a/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs
index 5906c2e..22020ac 100644
--- a/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs
@@ -90,11 +90,6 @@
         /// </value>
         public OneofAccessor Accessor { get { return accessor; } }
 
-        /// <summary>
-        /// The (possibly empty) set of custom options for this oneof.
-        /// </summary>
-        public CustomOptions CustomOptions => proto.Options?.CustomOptions ?? CustomOptions.Empty;
-
         internal void CrossLink()
         {
             List<FieldDescriptor> fieldCollection = new List<FieldDescriptor>();
diff --git a/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs b/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs
index 07d0fd9..27f9ab9 100644
--- a/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs
+++ b/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs
@@ -47,19 +47,12 @@
         public string Name { get; set; }
 
         /// <summary>
-        /// If the name is preferred in the .proto file.
-        /// </summary>
-        public bool PreferredAlias { get; set; }
-
-        /// <summary>
         /// Constructs a new attribute instance for the given name.
         /// </summary>
         /// <param name="name">The name of the element in the .proto file.</param>
         public OriginalNameAttribute(string name)
         {
             Name = ProtoPreconditions.CheckNotNull(name, nameof(name));
-            PreferredAlias = true;
         }
-	
     }
-}
+}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
index fe5c072..cc0a501 100644
--- a/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
@@ -78,11 +78,6 @@
             return File.DescriptorPool.FindSymbol<MethodDescriptor>(FullName + "." + name);
         }
 
-        /// <summary>
-        /// The (possibly empty) set of custom options for this service.
-        /// </summary>
-        public CustomOptions CustomOptions => Proto.Options?.CustomOptions ?? CustomOptions.Empty;
-
         internal void CrossLink()
         {
             foreach (MethodDescriptor method in methods)
diff --git a/csharp/src/Google.Protobuf/UnknownField.cs b/csharp/src/Google.Protobuf/UnknownField.cs
deleted file mode 100644
index 0d6eed6..0000000
--- a/csharp/src/Google.Protobuf/UnknownField.cs
+++ /dev/null
@@ -1,263 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using Google.Protobuf.Collections;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Represents a single field in an UnknownFieldSet.
-    ///
-    /// An UnknownField consists of four lists of values. The lists correspond
-    /// to the four "wire types" used in the protocol buffer binary format.
-    /// Normally, only one of the four lists will contain any values, since it
-    /// is impossible to define a valid message type that declares two different
-    /// types for the same field number. However, the code is designed to allow
-    /// for the case where the same unknown field number is encountered using
-    /// multiple different wire types.
-    ///
-    /// </summary>
-    internal sealed class UnknownField
-    {
-        private List<ulong> varintList;
-        private List<uint> fixed32List;
-        private List<ulong> fixed64List;
-        private List<ByteString> lengthDelimitedList;
-
-        /// <summary>
-        /// Creates a new UnknownField.
-        /// </summary>
-        public UnknownField()
-        {
-        }
-
-        /// <summary>
-        /// Checks if two unknown field are equal.
-        /// </summary>
-        public override bool Equals(object other)
-        {
-            if (ReferenceEquals(this, other))
-            {
-                return true;
-            }
-            UnknownField otherField = other as UnknownField;
-            return otherField != null
-                   && Lists.Equals(varintList, otherField.varintList)
-                   && Lists.Equals(fixed32List, otherField.fixed32List)
-                   && Lists.Equals(fixed64List, otherField.fixed64List)
-                   && Lists.Equals(lengthDelimitedList, otherField.lengthDelimitedList);
-        }
-
-        /// <summary>
-        /// Get the hash code of the unknown field.
-        /// </summary>
-        public override int GetHashCode()
-        {
-            int hash = 43;
-            hash = hash * 47 + Lists.GetHashCode(varintList);
-            hash = hash * 47 + Lists.GetHashCode(fixed32List);
-            hash = hash * 47 + Lists.GetHashCode(fixed64List);
-            hash = hash * 47 + Lists.GetHashCode(lengthDelimitedList);
-            return hash;
-        }
-
-        /// <summary>
-        /// Serializes the field, including the field number, and writes it to
-        /// <paramref name="output"/>
-        /// </summary>
-        /// <param name="fieldNumber">The unknown field number.</param>
-        /// <param name="output">The CodedOutputStream to write to.</param>
-        internal void WriteTo(int fieldNumber, CodedOutputStream output)
-        {
-            if (varintList != null)
-            {
-                foreach (ulong value in varintList)
-                {
-                    output.WriteTag(fieldNumber, WireFormat.WireType.Varint);
-                    output.WriteUInt64(value);
-                }
-            }
-            if (fixed32List != null)
-            {
-                foreach (uint value in fixed32List)
-                {
-                    output.WriteTag(fieldNumber, WireFormat.WireType.Fixed32);
-                    output.WriteFixed32(value);
-                }
-            }
-            if (fixed64List != null)
-            {
-                foreach (ulong value in fixed64List)
-                {
-                    output.WriteTag(fieldNumber, WireFormat.WireType.Fixed64);
-                    output.WriteFixed64(value);
-                }
-            }
-            if (lengthDelimitedList != null)
-            {
-                foreach (ByteString value in lengthDelimitedList)
-                {
-                    output.WriteTag(fieldNumber, WireFormat.WireType.LengthDelimited);
-                    output.WriteBytes(value);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Computes the number of bytes required to encode this field, including field
-        /// number.
-        /// </summary>
-        internal int GetSerializedSize(int fieldNumber)
-        {
-            int result = 0;
-            if (varintList != null)
-            {
-                result += CodedOutputStream.ComputeTagSize(fieldNumber) * varintList.Count;
-                foreach (ulong value in varintList)
-                {
-                    result += CodedOutputStream.ComputeUInt64Size(value);
-                }
-            }
-            if (fixed32List != null)
-            {
-                result += CodedOutputStream.ComputeTagSize(fieldNumber) * fixed32List.Count;
-                result += CodedOutputStream.ComputeFixed32Size(1) * fixed32List.Count;
-            }
-            if (fixed64List != null)
-            {
-                result += CodedOutputStream.ComputeTagSize(fieldNumber) * fixed64List.Count;
-                result += CodedOutputStream.ComputeFixed64Size(1) * fixed64List.Count;
-            }                
-            if (lengthDelimitedList != null)
-            {
-                result += CodedOutputStream.ComputeTagSize(fieldNumber) * lengthDelimitedList.Count;
-                foreach (ByteString value in lengthDelimitedList)
-                {
-                    result += CodedOutputStream.ComputeBytesSize(value);
-                }
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Merge the values in <paramref name="other" /> into this field.  For each list
-        /// of values, <paramref name="other"/>'s values are append to the ones in this
-        /// field.
-        /// </summary>
-        internal UnknownField MergeFrom(UnknownField other)
-        {
-            varintList = AddAll(varintList, other.varintList);
-            fixed32List = AddAll(fixed32List, other.fixed32List);
-            fixed64List = AddAll(fixed64List, other.fixed64List);
-            lengthDelimitedList = AddAll(lengthDelimitedList, other.lengthDelimitedList);
-            return this;
-        }
-
-        /// <summary>
-        /// Returns a new list containing all of the given specified values from
-        /// both the <paramref name="current"/> and <paramref name="extras"/> lists.
-        /// If <paramref name="current" /> is null and <paramref name="extras"/> is empty,
-        /// null is returned. Otherwise, either a new list is created (if <paramref name="current" />
-        /// is null) or the elements of <paramref name="extras"/> are added to <paramref name="current" />.
-        /// </summary>
-        private static List<T> AddAll<T>(List<T> current, IList<T> extras)
-        {
-            if (extras.Count == 0)
-            {
-                return current;
-            }
-            if (current == null)
-            {
-                current = new List<T>(extras);
-            }
-            else
-            {
-                current.AddRange(extras);
-            }
-            return current;
-        }
-
-        /// <summary>
-        /// Adds a varint value.
-        /// </summary>
-        internal UnknownField AddVarint(ulong value)
-        {
-            varintList = Add(varintList, value);
-            return this;
-        }
-
-        /// <summary>
-        /// Adds a fixed32 value.
-        /// </summary>
-        internal UnknownField AddFixed32(uint value)
-        {
-            fixed32List = Add(fixed32List, value);
-            return this;
-        }
-
-        /// <summary>
-        /// Adds a fixed64 value.
-        /// </summary>
-        internal UnknownField AddFixed64(ulong value)
-        {
-            fixed64List = Add(fixed64List, value);
-            return this;
-        }
-
-        /// <summary>
-        /// Adds a length-delimited value.
-        /// </summary>
-        internal UnknownField AddLengthDelimited(ByteString value)
-        {
-            lengthDelimitedList = Add(lengthDelimitedList, value);
-            return this;
-        }
-
-        /// <summary>
-        /// Adds <paramref name="value"/> to the <paramref name="list"/>, creating
-        /// a new list if <paramref name="list"/> is null. The list is returned - either
-        /// the original reference or the new list.
-        /// </summary>
-        private static List<T> Add<T>(List<T> list, T value)
-        {
-            if (list == null)
-            {
-                list = new List<T>();
-            }
-            list.Add(value);
-            return list;
-        }
-    }
-}
diff --git a/csharp/src/Google.Protobuf/UnknownFieldSet.cs b/csharp/src/Google.Protobuf/UnknownFieldSet.cs
deleted file mode 100644
index b43f477..0000000
--- a/csharp/src/Google.Protobuf/UnknownFieldSet.cs
+++ /dev/null
@@ -1,324 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 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.
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using Google.Protobuf.Reflection;
-
-namespace Google.Protobuf
-{
-    /// <summary>
-    /// Used to keep track of fields which were seen when parsing a protocol message
-    /// but whose field numbers or types are unrecognized. This most frequently
-    /// occurs when new fields are added to a message type and then messages containing
-    /// those fields are read by old software that was built before the new types were
-    /// added.
-    ///
-    /// Most users will never need to use this class directly.
-    /// </summary>
-    public sealed partial class UnknownFieldSet
-    {
-        private readonly IDictionary<int, UnknownField> fields;
-
-        /// <summary>
-        /// Creates a new UnknownFieldSet.
-        /// </summary>
-        internal UnknownFieldSet()
-        {
-            this.fields = new Dictionary<int, UnknownField>();
-        }
-
-        /// <summary>
-        /// Checks whether or not the given field number is present in the set.
-        /// </summary>
-        internal bool HasField(int field)
-        {
-            return fields.ContainsKey(field);
-        }
-
-        /// <summary>
-        /// Serializes the set and writes it to <paramref name="output"/>.
-        /// </summary>
-        public void WriteTo(CodedOutputStream output)
-        {
-            foreach (KeyValuePair<int, UnknownField> entry in fields)
-            {
-                entry.Value.WriteTo(entry.Key, output);
-            }
-        }
-
-        /// <summary>
-        /// Gets the number of bytes required to encode this set.
-        /// </summary>
-        public int CalculateSize()
-        {
-            int result = 0;
-            foreach (KeyValuePair<int, UnknownField> entry in fields)
-            {
-                result += entry.Value.GetSerializedSize(entry.Key);
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Checks if two unknown field sets are equal.
-        /// </summary>
-        public override bool Equals(object other)
-        {
-            if (ReferenceEquals(this, other))
-            {
-                return true;
-            }
-            UnknownFieldSet otherSet = other as UnknownFieldSet;
-            IDictionary<int, UnknownField> otherFields = otherSet.fields;
-            if (fields.Count  != otherFields.Count)
-            {
-                return false;
-            }
-            foreach (KeyValuePair<int, UnknownField> leftEntry in fields)
-            {
-                UnknownField rightValue;
-                if (!otherFields.TryGetValue(leftEntry.Key, out rightValue))
-                {
-                    return false;
-                }
-                if (!leftEntry.Value.Equals(rightValue))
-                {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        /// <summary>
-        /// Gets the unknown field set's hash code.
-        /// </summary>
-        public override int GetHashCode()
-        {
-            int ret = 1;
-            foreach (KeyValuePair<int, UnknownField> field in fields)
-            {
-                // Use ^ here to make the field order irrelevant.
-                int hash = field.Key.GetHashCode() ^ field.Value.GetHashCode();
-                ret ^= hash;
-            }
-            return ret;
-        }
-
-        // Optimization:  We keep around the last field that was
-        // modified so that we can efficiently add to it multiple times in a
-        // row (important when parsing an unknown repeated field).
-        private int lastFieldNumber;
-        private UnknownField lastField;
-
-        private UnknownField GetOrAddField(int number)
-        {
-            if (lastField != null && number == lastFieldNumber)
-            {
-                return lastField;
-            }
-            if (number == 0)
-            {
-                return null;
-            }
-
-            UnknownField existing;
-            if (fields.TryGetValue(number, out existing))
-            {
-                return existing;
-            }
-            lastField = new UnknownField();
-            AddOrReplaceField(number, lastField);
-            lastFieldNumber = number;
-            return lastField;
-        }
-
-        /// <summary>
-        /// Adds a field to the set. If a field with the same number already exists, it
-        /// is replaced.
-        /// </summary>
-        internal UnknownFieldSet AddOrReplaceField(int number, UnknownField field)
-        {
-            if (number == 0)
-            {
-                throw new ArgumentOutOfRangeException("number", "Zero is not a valid field number.");
-            }
-            fields[number] = field;
-            return this;
-        }
-
-        /// <summary>
-        /// Parse a single field from <paramref name="input"/> and merge it
-        /// into this set.
-        /// </summary>
-        /// <param name="input">The coded input stream containing the field</param>
-        /// <returns>false if the tag is an "end group" tag, true otherwise</returns>
-        private void MergeFieldFrom(CodedInputStream input)
-        {
-            uint tag = input.LastTag;
-            int number = WireFormat.GetTagFieldNumber(tag);
-            switch (WireFormat.GetTagWireType(tag))
-            {
-                case WireFormat.WireType.Varint:
-                    {
-                        ulong uint64 = input.ReadUInt64();
-                        GetOrAddField(number).AddVarint(uint64);
-                        return;
-                    }
-                case WireFormat.WireType.Fixed32:
-                    {
-                        uint uint32 = input.ReadFixed32();
-                        GetOrAddField(number).AddFixed32(uint32);
-                        return;
-                    }
-                case WireFormat.WireType.Fixed64:
-                    {
-                        ulong uint64 = input.ReadFixed64();
-                        GetOrAddField(number).AddFixed64(uint64);
-                        return;
-                    }
-                case WireFormat.WireType.LengthDelimited:
-                    {
-                        ByteString bytes = input.ReadBytes();
-                        GetOrAddField(number).AddLengthDelimited(bytes);
-                        return;
-                    }
-                case WireFormat.WireType.StartGroup:
-                    {
-                        input.SkipGroup(tag);
-                        return;
-                    }
-                case WireFormat.WireType.EndGroup:
-                    {
-                        throw new InvalidProtocolBufferException("Merge an unknown field of end-group tag, indicating that the corresponding start-group was missing.");
-                    }
-                default:
-                    throw new InvalidOperationException("Wire Type is invalid.");
-            }
-        }
-
-        /// <summary>
-        /// Create a new UnknownFieldSet if unknownFields is null.
-        /// Parse a single field from <paramref name="input"/> and merge it
-        /// into unknownFields.
-        /// </summary>
-        /// <param name="unknownFields">The UnknownFieldSet which need to be merged</param>
-        /// <param name="input">The coded input stream containing the field</param>
-        /// <returns>The merged UnknownFieldSet</returns>
-        public static UnknownFieldSet MergeFieldFrom(UnknownFieldSet unknownFields,
-                                                     CodedInputStream input)
-        {
-            if (unknownFields == null)
-            {
-                unknownFields = new UnknownFieldSet();
-            }
-            unknownFields.MergeFieldFrom(input);
-            return unknownFields;
-        }
-
-        /// <summary>
-        /// Merges the fields from <paramref name="other"/> into this set.
-        /// If a field number exists in both sets, the values in <paramref name="other"/>
-        /// will be appended to the values in this set.
-        /// </summary>
-        private UnknownFieldSet MergeFrom(UnknownFieldSet other)
-        {
-            if (other != null)
-            {
-                foreach (KeyValuePair<int, UnknownField> entry in other.fields)
-                {
-                    MergeField(entry.Key, entry.Value);
-                }
-            }
-            return this;
-        }
-
-        /// <summary>
-        /// Created a new UnknownFieldSet to <paramref name="unknownFields"/> if
-        /// needed and merges the fields from <paramref name="other"/> into the first set.
-        /// If a field number exists in both sets, the values in <paramref name="other"/>
-        /// will be appended to the values in this set.
-        /// </summary>
-        public static UnknownFieldSet MergeFrom(UnknownFieldSet unknownFields,
-                                                UnknownFieldSet other)
-        {
-            if (other == null)
-            {
-                return unknownFields;
-            }
-            if (unknownFields == null)
-            {
-                unknownFields = new UnknownFieldSet();
-            }
-            unknownFields.MergeFrom(other);
-            return unknownFields;
-        }
-
-
-        /// <summary>
-        /// Adds a field to the unknown field set. If a field with the same
-        /// number already exists, the two are merged.
-        /// </summary>
-        private UnknownFieldSet MergeField(int number, UnknownField field)
-        {
-            if (number == 0)
-            {
-                throw new ArgumentOutOfRangeException("number", "Zero is not a valid field number.");
-            }
-            if (HasField(number))
-            {
-                GetOrAddField(number).MergeFrom(field);
-            }
-            else
-            {
-                AddOrReplaceField(number, field);
-            }
-            return this;
-        }
-
-        /// <summary>
-        /// Clone an unknown field set from <paramref name="other"/>.
-        /// </summary>
-        public static UnknownFieldSet Clone(UnknownFieldSet other)
-        {
-            if (other == null)
-            {
-                return null;
-            }
-            UnknownFieldSet unknownFields = new UnknownFieldSet();
-            unknownFields.MergeFrom(other);
-            return unknownFields;
-        }
-    }
-}
-
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Any.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Any.cs
index 5836dff..871a383 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Any.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Any.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/any.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/any.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/any.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class AnyReflection {
 
     #region Descriptor
@@ -25,10 +24,10 @@
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
             "Chlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYi",
-            "JgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQm8KE2Nv",
+            "JgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQnIKE2Nv",
             "bS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaJWdpdGh1Yi5jb20vZ29s",
-            "YW5nL3Byb3RvYnVmL3B0eXBlcy9hbnmiAgNHUEKqAh5Hb29nbGUuUHJvdG9i",
-            "dWYuV2VsbEtub3duVHlwZXNiBnByb3RvMw=="));
+            "YW5nL3Byb3RvYnVmL3B0eXBlcy9hbnmgAQGiAgNHUEKqAh5Hb29nbGUuUHJv",
+            "dG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -40,116 +39,89 @@
   }
   #region Messages
   /// <summary>
-  /// `Any` contains an arbitrary serialized protocol buffer message along with a
-  /// URL that describes the type of the serialized message.
+  ///  `Any` contains an arbitrary serialized protocol buffer message along with a
+  ///  URL that describes the type of the serialized message.
   ///
-  /// Protobuf library provides support to pack/unpack Any values in the form
-  /// of utility functions or additional generated methods of the Any type.
+  ///  Protobuf library provides support to pack/unpack Any values in the form
+  ///  of utility functions or additional generated methods of the Any type.
   ///
-  /// Example 1: Pack and unpack a message in C++.
+  ///  Example 1: Pack and unpack a message in C++.
   ///
-  ///     Foo foo = ...;
-  ///     Any any;
-  ///     any.PackFrom(foo);
-  ///     ...
-  ///     if (any.UnpackTo(&amp;foo)) {
-  ///       ...
-  ///     }
-  ///
-  /// Example 2: Pack and unpack a message in Java.
-  ///
-  ///     Foo foo = ...;
-  ///     Any any = Any.pack(foo);
-  ///     ...
-  ///     if (any.is(Foo.class)) {
-  ///       foo = any.unpack(Foo.class);
-  ///     }
-  ///
-  ///  Example 3: Pack and unpack a message in Python.
-  ///
-  ///     foo = Foo(...)
-  ///     any = Any()
-  ///     any.Pack(foo)
-  ///     ...
-  ///     if any.Is(Foo.DESCRIPTOR):
-  ///       any.Unpack(foo)
-  ///       ...
-  ///
-  ///  Example 4: Pack and unpack a message in Go
-  ///
-  ///      foo := &amp;pb.Foo{...}
-  ///      any, err := ptypes.MarshalAny(foo)
+  ///      Foo foo = ...;
+  ///      Any any;
+  ///      any.PackFrom(foo);
   ///      ...
-  ///      foo := &amp;pb.Foo{}
-  ///      if err := ptypes.UnmarshalAny(any, foo); err != nil {
+  ///      if (any.UnpackTo(&amp;foo)) {
   ///        ...
   ///      }
   ///
-  /// The pack methods provided by protobuf library will by default use
-  /// 'type.googleapis.com/full.type.name' as the type URL and the unpack
-  /// methods only use the fully qualified type name after the last '/'
-  /// in the type URL, for example "foo.bar.com/x/y.z" will yield type
-  /// name "y.z".
+  ///  Example 2: Pack and unpack a message in Java.
   ///
-  /// JSON
-  /// ====
-  /// The JSON representation of an `Any` value uses the regular
-  /// representation of the deserialized, embedded message, with an
-  /// additional field `@type` which contains the type URL. Example:
+  ///      Foo foo = ...;
+  ///      Any any = Any.pack(foo);
+  ///      ...
+  ///      if (any.is(Foo.class)) {
+  ///        foo = any.unpack(Foo.class);
+  ///      }
   ///
-  ///     package google.profile;
-  ///     message Person {
-  ///       string first_name = 1;
-  ///       string last_name = 2;
-  ///     }
+  ///  The pack methods provided by protobuf library will by default use
+  ///  'type.googleapis.com/full.type.name' as the type URL and the unpack
+  ///  methods only use the fully qualified type name after the last '/'
+  ///  in the type URL, for example "foo.bar.com/x/y.z" will yield type
+  ///  name "y.z".
   ///
-  ///     {
-  ///       "@type": "type.googleapis.com/google.profile.Person",
-  ///       "firstName": &lt;string>,
-  ///       "lastName": &lt;string>
-  ///     }
+  ///  JSON
+  ///  ====
+  ///  The JSON representation of an `Any` value uses the regular
+  ///  representation of the deserialized, embedded message, with an
+  ///  additional field `@type` which contains the type URL. Example:
   ///
-  /// If the embedded message type is well-known and has a custom JSON
-  /// representation, that representation will be embedded adding a field
-  /// `value` which holds the custom JSON in addition to the `@type`
-  /// field. Example (for message [google.protobuf.Duration][]):
+  ///      package google.profile;
+  ///      message Person {
+  ///        string first_name = 1;
+  ///        string last_name = 2;
+  ///      }
   ///
-  ///     {
-  ///       "@type": "type.googleapis.com/google.protobuf.Duration",
-  ///       "value": "1.212s"
-  ///     }
+  ///      {
+  ///        "@type": "type.googleapis.com/google.profile.Person",
+  ///        "firstName": &lt;string>,
+  ///        "lastName": &lt;string>
+  ///      }
+  ///
+  ///  If the embedded message type is well-known and has a custom JSON
+  ///  representation, that representation will be embedded adding a field
+  ///  `value` which holds the custom JSON in addition to the `@type`
+  ///  field. Example (for message [google.protobuf.Duration][]):
+  ///
+  ///      {
+  ///        "@type": "type.googleapis.com/google.protobuf.Duration",
+  ///        "value": "1.212s"
+  ///      }
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Any : pb::IMessage<Any> {
     private static readonly pb::MessageParser<Any> _parser = new pb::MessageParser<Any>(() => new Any());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Any> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Any() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Any(Any other) : this() {
       typeUrl_ = other.typeUrl_;
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Any Clone() {
       return new Any(this);
     }
@@ -158,29 +130,28 @@
     public const int TypeUrlFieldNumber = 1;
     private string typeUrl_ = "";
     /// <summary>
-    /// A URL/resource name whose content describes the type of the
-    /// serialized protocol buffer message.
+    ///  A URL/resource name whose content describes the type of the
+    ///  serialized protocol buffer message.
     ///
-    /// For URLs which use the scheme `http`, `https`, or no scheme, the
-    /// following restrictions and interpretations apply:
+    ///  For URLs which use the schema `http`, `https`, or no schema, the
+    ///  following restrictions and interpretations apply:
     ///
-    /// * If no scheme is provided, `https` is assumed.
-    /// * The last segment of the URL's path must represent the fully
-    ///   qualified name of the type (as in `path/google.protobuf.Duration`).
-    ///   The name should be in a canonical form (e.g., leading "." is
-    ///   not accepted).
-    /// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
-    ///   value in binary format, or produce an error.
-    /// * Applications are allowed to cache lookup results based on the
-    ///   URL, or have them precompiled into a binary to avoid any
-    ///   lookup. Therefore, binary compatibility needs to be preserved
-    ///   on changes to types. (Use versioned type names to manage
-    ///   breaking changes.)
+    ///  * If no schema is provided, `https` is assumed.
+    ///  * The last segment of the URL's path must represent the fully
+    ///    qualified name of the type (as in `path/google.protobuf.Duration`).
+    ///    The name should be in a canonical form (e.g., leading "." is
+    ///    not accepted).
+    ///  * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+    ///    value in binary format, or produce an error.
+    ///  * Applications are allowed to cache lookup results based on the
+    ///    URL, or have them precompiled into a binary to avoid any
+    ///    lookup. Therefore, binary compatibility needs to be preserved
+    ///    on changes to types. (Use versioned type names to manage
+    ///    breaking changes.)
     ///
-    /// Schemes other than `http`, `https` (or the empty scheme) might be
-    /// used with implementation specific semantics.
+    ///  Schemas other than `http`, `https` (or the empty schema) might be
+    ///  used with implementation specific semantics.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string TypeUrl {
       get { return typeUrl_; }
       set {
@@ -192,9 +163,8 @@
     public const int ValueFieldNumber = 2;
     private pb::ByteString value_ = pb::ByteString.Empty;
     /// <summary>
-    /// Must be a valid serialized protocol buffer of the above specified type.
+    ///  Must be a valid serialized protocol buffer of the above specified type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString Value {
       get { return value_; }
       set {
@@ -202,12 +172,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Any);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Any other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -217,26 +185,20 @@
       }
       if (TypeUrl != other.TypeUrl) return false;
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (TypeUrl.Length != 0) hash ^= TypeUrl.GetHashCode();
       if (Value.Length != 0) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (TypeUrl.Length != 0) {
         output.WriteRawTag(10);
@@ -246,12 +208,8 @@
         output.WriteRawTag(18);
         output.WriteBytes(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (TypeUrl.Length != 0) {
@@ -260,13 +218,9 @@
       if (Value.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Any other) {
       if (other == null) {
         return;
@@ -277,16 +231,14 @@
       if (other.Value.Length != 0) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             TypeUrl = input.ReadString();
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs
index fca689d..f4fac73 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs
@@ -44,25 +44,17 @@
             prefix.EndsWith("/") ? prefix + descriptor.FullName : prefix + "/" + descriptor.FullName;
 
         /// <summary>
-        /// Retrieves the type name for a type URL, matching the <see cref="DescriptorBase.FullName"/>
-        /// of the packed message type.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// This is always just the last part of the URL, after the final slash. No validation of 
-        /// anything before the trailing slash is performed. If the type URL does not include a slash,
-        /// an empty string is returned rather than an exception being thrown; this won't match any types,
-        /// and the calling code is probably in a better position to give a meaningful error.
-        /// </para>
-        /// <para>
+        /// Retrieves the type name for a type URL. This is always just the last part of the URL,
+        /// after the trailing slash. No validation of anything before the trailing slash is performed.
+        /// If the type URL does not include a slash, an empty string is returned rather than an exception
+        /// being thrown; this won't match any types, and the calling code is probably in a better position
+        /// to give a meaningful error.
         /// There is no handling of fragments or queries  at the moment.
-        /// </para>
-        /// </remarks>
+        /// </summary>
         /// <param name="typeUrl">The URL to extract the type name from</param>
         /// <returns>The type name</returns>
-        public static string GetTypeName(string typeUrl)
+        internal static string GetTypeName(string typeUrl)
         {
-            ProtoPreconditions.CheckNotNull(typeUrl, nameof(typeUrl));
             int lastSlash = typeUrl.LastIndexOf('/');
             return lastSlash == -1 ? "" : typeUrl.Substring(lastSlash + 1);
         }
@@ -89,27 +81,6 @@
         }
 
         /// <summary>
-        /// Attempts to unpack the content of this Any message into the target message type,
-        /// if it matches the type URL within this Any message.
-        /// </summary>
-        /// <typeparam name="T">The type of message to attempt to unpack the content into.</typeparam>
-        /// <returns><c>true</c> if the message was successfully unpacked; <c>false</c> if the type name didn't match</returns>
-        public bool TryUnpack<T>(out T result) where T : IMessage, new()
-        {
-            // Note: deliberately avoid writing anything to result until the end, in case it's being
-            // monitored by other threads. (That would be a bug in the calling code, but let's not make it worse.)
-            T target = new T();
-            if (GetTypeName(TypeUrl) != target.Descriptor.FullName)
-            {
-                result = default(T); // Can't use null as there's no class constraint, but this always *will* be null in real usage.
-                return false;
-            }
-            target.MergeFrom(Value);
-            result = target;
-            return true;
-        }
-
-        /// <summary>
         /// Packs the specified message into an Any message using a type URL prefix of "type.googleapis.com".
         /// </summary>
         /// <param name="message">The message to pack.</param>
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Api.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Api.cs
index 4db1f63..e568a2c 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Api.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Api.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/api.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/api.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/api.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class ApiReflection {
 
     #region Descriptor
@@ -37,10 +36,9 @@
             "ChFyZXNwb25zZV90eXBlX3VybBgEIAEoCRIaChJyZXNwb25zZV9zdHJlYW1p",
             "bmcYBSABKAgSKAoHb3B0aW9ucxgGIAMoCzIXLmdvb2dsZS5wcm90b2J1Zi5P",
             "cHRpb24SJwoGc3ludGF4GAcgASgOMhcuZ29vZ2xlLnByb3RvYnVmLlN5bnRh",
-            "eCIjCgVNaXhpbhIMCgRuYW1lGAEgASgJEgwKBHJvb3QYAiABKAlCdQoTY29t",
-            "Lmdvb2dsZS5wcm90b2J1ZkIIQXBpUHJvdG9QAVorZ29vZ2xlLmdvbGFuZy5v",
-            "cmcvZ2VucHJvdG8vcHJvdG9idWYvYXBpO2FwaaICA0dQQqoCHkdvb2dsZS5Q",
-            "cm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8z"));
+            "eCIjCgVNaXhpbhIMCgRuYW1lGAEgASgJEgwKBHJvb3QYAiABKAlCSwoTY29t",
+            "Lmdvb2dsZS5wcm90b2J1ZkIIQXBpUHJvdG9QAaABAaICA0dQQqoCHkdvb2ds",
+            "ZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8z"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor, },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -54,40 +52,27 @@
   }
   #region Messages
   /// <summary>
-  /// Api is a light-weight descriptor for an API Interface.
-  ///
-  /// Interfaces are also described as "protocol buffer services" in some contexts,
-  /// such as by the "service" keyword in a .proto file, but they are different
-  /// from API Services, which represent a concrete implementation of an interface
-  /// as opposed to simply a description of methods and bindings. They are also
-  /// sometimes simply referred to as "APIs" in other contexts, such as the name of
-  /// this message itself. See https://cloud.google.com/apis/design/glossary for
-  /// detailed terminology.
+  ///  Api is a light-weight descriptor for a protocol buffer service.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Api : pb::IMessage<Api> {
     private static readonly pb::MessageParser<Api> _parser = new pb::MessageParser<Api>(() => new Api());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Api> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.ApiReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Api() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Api(Api other) : this() {
       name_ = other.name_;
       methods_ = other.methods_.Clone();
@@ -96,10 +81,8 @@
       SourceContext = other.sourceContext_ != null ? other.SourceContext.Clone() : null;
       mixins_ = other.mixins_.Clone();
       syntax_ = other.syntax_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Api Clone() {
       return new Api(this);
     }
@@ -108,10 +91,9 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// The fully qualified name of this interface, including package name
-    /// followed by the interface's simple name.
+    ///  The fully qualified name of this api, including package name
+    ///  followed by the api's simple name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -125,9 +107,8 @@
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Method.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Method> methods_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Method>();
     /// <summary>
-    /// The methods of this interface, in unspecified order.
+    ///  The methods of this api, in unspecified order.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Method> Methods {
       get { return methods_; }
     }
@@ -138,9 +119,8 @@
         = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.WellKnownTypes.Option.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> options_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option>();
     /// <summary>
-    /// Any metadata attached to the interface.
+    ///  Any metadata attached to the API.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> Options {
       get { return options_; }
     }
@@ -149,27 +129,27 @@
     public const int VersionFieldNumber = 4;
     private string version_ = "";
     /// <summary>
-    /// A version string for this interface. If specified, must have the form
-    /// `major-version.minor-version`, as in `1.10`. If the minor version is
-    /// omitted, it defaults to zero. If the entire version field is empty, the
-    /// major version is derived from the package name, as outlined below. If the
-    /// field is not empty, the version in the package name will be verified to be
-    /// consistent with what is provided here.
+    ///  A version string for this api. If specified, must have the form
+    ///  `major-version.minor-version`, as in `1.10`. If the minor version
+    ///  is omitted, it defaults to zero. If the entire version field is
+    ///  empty, the major version is derived from the package name, as
+    ///  outlined below. If the field is not empty, the version in the
+    ///  package name will be verified to be consistent with what is
+    ///  provided here.
     ///
-    /// The versioning schema uses [semantic
-    /// versioning](http://semver.org) where the major version number
-    /// indicates a breaking change and the minor version an additive,
-    /// non-breaking change. Both version numbers are signals to users
-    /// what to expect from different versions, and should be carefully
-    /// chosen based on the product plan.
+    ///  The versioning schema uses [semantic
+    ///  versioning](http://semver.org) where the major version number
+    ///  indicates a breaking change and the minor version an additive,
+    ///  non-breaking change. Both version numbers are signals to users
+    ///  what to expect from different versions, and should be carefully
+    ///  chosen based on the product plan.
     ///
-    /// The major version is also reflected in the package name of the
-    /// interface, which must end in `v&lt;major-version>`, as in
-    /// `google.feature.v1`. For major versions 0 and 1, the suffix can
-    /// be omitted. Zero major versions must only be used for
-    /// experimental, non-GA interfaces.
+    ///  The major version is also reflected in the package name of the
+    ///  API, which must end in `v&lt;major-version>`, as in
+    ///  `google.feature.v1`. For major versions 0 and 1, the suffix can
+    ///  be omitted. Zero major versions must only be used for
+    ///  experimental, none-GA apis.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Version {
       get { return version_; }
       set {
@@ -181,10 +161,9 @@
     public const int SourceContextFieldNumber = 5;
     private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContext_;
     /// <summary>
-    /// Source context for the protocol buffer service represented by this
-    /// message.
+    ///  Source context for the protocol buffer service represented by this
+    ///  message.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
       get { return sourceContext_; }
       set {
@@ -198,9 +177,8 @@
         = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.WellKnownTypes.Mixin.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Mixin> mixins_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Mixin>();
     /// <summary>
-    /// Included interfaces. See [Mixin][].
+    ///  Included APIs. See [Mixin][].
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Mixin> Mixins {
       get { return mixins_; }
     }
@@ -209,9 +187,8 @@
     public const int SyntaxFieldNumber = 7;
     private global::Google.Protobuf.WellKnownTypes.Syntax syntax_ = 0;
     /// <summary>
-    /// The source syntax of the service.
+    ///  The source syntax of the service.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Syntax Syntax {
       get { return syntax_; }
       set {
@@ -219,12 +196,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Api);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Api other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -239,10 +214,9 @@
       if (!object.Equals(SourceContext, other.SourceContext)) return false;
       if(!mixins_.Equals(other.mixins_)) return false;
       if (Syntax != other.Syntax) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -252,18 +226,13 @@
       if (sourceContext_ != null) hash ^= SourceContext.GetHashCode();
       hash ^= mixins_.GetHashCode();
       if (Syntax != 0) hash ^= Syntax.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -284,12 +253,8 @@
         output.WriteRawTag(56);
         output.WriteEnum((int) Syntax);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -307,13 +272,9 @@
       if (Syntax != 0) {
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Syntax);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Api other) {
       if (other == null) {
         return;
@@ -336,16 +297,14 @@
       if (other.Syntax != 0) {
         Syntax = other.Syntax;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -385,32 +344,27 @@
   }
 
   /// <summary>
-  /// Method represents a method of an API interface.
+  ///  Method represents a method of an api.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Method : pb::IMessage<Method> {
     private static readonly pb::MessageParser<Method> _parser = new pb::MessageParser<Method>(() => new Method());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Method> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.ApiReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Method() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Method(Method other) : this() {
       name_ = other.name_;
       requestTypeUrl_ = other.requestTypeUrl_;
@@ -419,10 +373,8 @@
       responseStreaming_ = other.responseStreaming_;
       options_ = other.options_.Clone();
       syntax_ = other.syntax_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Method Clone() {
       return new Method(this);
     }
@@ -431,9 +383,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// The simple name of this method.
+    ///  The simple name of this method.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -445,9 +396,8 @@
     public const int RequestTypeUrlFieldNumber = 2;
     private string requestTypeUrl_ = "";
     /// <summary>
-    /// A URL of the input message type.
+    ///  A URL of the input message type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string RequestTypeUrl {
       get { return requestTypeUrl_; }
       set {
@@ -459,9 +409,8 @@
     public const int RequestStreamingFieldNumber = 3;
     private bool requestStreaming_;
     /// <summary>
-    /// If true, the request is streamed.
+    ///  If true, the request is streamed.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool RequestStreaming {
       get { return requestStreaming_; }
       set {
@@ -473,9 +422,8 @@
     public const int ResponseTypeUrlFieldNumber = 4;
     private string responseTypeUrl_ = "";
     /// <summary>
-    /// The URL of the output message type.
+    ///  The URL of the output message type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string ResponseTypeUrl {
       get { return responseTypeUrl_; }
       set {
@@ -487,9 +435,8 @@
     public const int ResponseStreamingFieldNumber = 5;
     private bool responseStreaming_;
     /// <summary>
-    /// If true, the response is streamed.
+    ///  If true, the response is streamed.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool ResponseStreaming {
       get { return responseStreaming_; }
       set {
@@ -503,9 +450,8 @@
         = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.WellKnownTypes.Option.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> options_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option>();
     /// <summary>
-    /// Any metadata attached to the method.
+    ///  Any metadata attached to the method.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> Options {
       get { return options_; }
     }
@@ -514,9 +460,8 @@
     public const int SyntaxFieldNumber = 7;
     private global::Google.Protobuf.WellKnownTypes.Syntax syntax_ = 0;
     /// <summary>
-    /// The source syntax of this method.
+    ///  The source syntax of this method.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Syntax Syntax {
       get { return syntax_; }
       set {
@@ -524,12 +469,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Method);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Method other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -544,10 +487,9 @@
       if (ResponseStreaming != other.ResponseStreaming) return false;
       if(!options_.Equals(other.options_)) return false;
       if (Syntax != other.Syntax) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -557,18 +499,13 @@
       if (ResponseStreaming != false) hash ^= ResponseStreaming.GetHashCode();
       hash ^= options_.GetHashCode();
       if (Syntax != 0) hash ^= Syntax.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -595,12 +532,8 @@
         output.WriteRawTag(56);
         output.WriteEnum((int) Syntax);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -622,13 +555,9 @@
       if (Syntax != 0) {
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Syntax);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Method other) {
       if (other == null) {
         return;
@@ -652,16 +581,14 @@
       if (other.Syntax != 0) {
         Syntax = other.Syntax;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -698,116 +625,108 @@
   }
 
   /// <summary>
-  /// Declares an API Interface to be included in this interface. The including
-  /// interface must redeclare all the methods from the included interface, but
-  /// documentation and options are inherited as follows:
+  ///  Declares an API to be included in this API. The including API must
+  ///  redeclare all the methods from the included API, but documentation
+  ///  and options are inherited as follows:
   ///
-  /// - If after comment and whitespace stripping, the documentation
-  ///   string of the redeclared method is empty, it will be inherited
-  ///   from the original method.
+  ///  - If after comment and whitespace stripping, the documentation
+  ///    string of the redeclared method is empty, it will be inherited
+  ///    from the original method.
   ///
-  /// - Each annotation belonging to the service config (http,
-  ///   visibility) which is not set in the redeclared method will be
-  ///   inherited.
+  ///  - Each annotation belonging to the service config (http,
+  ///    visibility) which is not set in the redeclared method will be
+  ///    inherited.
   ///
-  /// - If an http annotation is inherited, the path pattern will be
-  ///   modified as follows. Any version prefix will be replaced by the
-  ///   version of the including interface plus the [root][] path if
-  ///   specified.
+  ///  - If an http annotation is inherited, the path pattern will be
+  ///    modified as follows. Any version prefix will be replaced by the
+  ///    version of the including API plus the [root][] path if specified.
   ///
-  /// Example of a simple mixin:
+  ///  Example of a simple mixin:
   ///
-  ///     package google.acl.v1;
-  ///     service AccessControl {
-  ///       // Get the underlying ACL object.
-  ///       rpc GetAcl(GetAclRequest) returns (Acl) {
-  ///         option (google.api.http).get = "/v1/{resource=**}:getAcl";
-  ///       }
-  ///     }
+  ///      package google.acl.v1;
+  ///      service AccessControl {
+  ///        // Get the underlying ACL object.
+  ///        rpc GetAcl(GetAclRequest) returns (Acl) {
+  ///          option (google.api.http).get = "/v1/{resource=**}:getAcl";
+  ///        }
+  ///      }
   ///
-  ///     package google.storage.v2;
-  ///     service Storage {
-  ///       rpc GetAcl(GetAclRequest) returns (Acl);
+  ///      package google.storage.v2;
+  ///      service Storage {
+  ///        rpc GetAcl(GetAclRequest) returns (Acl);
   ///
-  ///       // Get a data record.
-  ///       rpc GetData(GetDataRequest) returns (Data) {
-  ///         option (google.api.http).get = "/v2/{resource=**}";
-  ///       }
-  ///     }
+  ///        // Get a data record.
+  ///        rpc GetData(GetDataRequest) returns (Data) {
+  ///          option (google.api.http).get = "/v2/{resource=**}";
+  ///        }
+  ///      }
   ///
-  /// Example of a mixin configuration:
+  ///  Example of a mixin configuration:
   ///
-  ///     apis:
-  ///     - name: google.storage.v2.Storage
-  ///       mixins:
-  ///       - name: google.acl.v1.AccessControl
+  ///      apis:
+  ///      - name: google.storage.v2.Storage
+  ///        mixins:
+  ///        - name: google.acl.v1.AccessControl
   ///
-  /// The mixin construct implies that all methods in `AccessControl` are
-  /// also declared with same name and request/response types in
-  /// `Storage`. A documentation generator or annotation processor will
-  /// see the effective `Storage.GetAcl` method after inherting
-  /// documentation and annotations as follows:
+  ///  The mixin construct implies that all methods in `AccessControl` are
+  ///  also declared with same name and request/response types in
+  ///  `Storage`. A documentation generator or annotation processor will
+  ///  see the effective `Storage.GetAcl` method after inherting
+  ///  documentation and annotations as follows:
   ///
-  ///     service Storage {
-  ///       // Get the underlying ACL object.
-  ///       rpc GetAcl(GetAclRequest) returns (Acl) {
-  ///         option (google.api.http).get = "/v2/{resource=**}:getAcl";
-  ///       }
-  ///       ...
-  ///     }
+  ///      service Storage {
+  ///        // Get the underlying ACL object.
+  ///        rpc GetAcl(GetAclRequest) returns (Acl) {
+  ///          option (google.api.http).get = "/v2/{resource=**}:getAcl";
+  ///        }
+  ///        ...
+  ///      }
   ///
-  /// Note how the version in the path pattern changed from `v1` to `v2`.
+  ///  Note how the version in the path pattern changed from `v1` to `v2`.
   ///
-  /// If the `root` field in the mixin is specified, it should be a
-  /// relative path under which inherited HTTP paths are placed. Example:
+  ///  If the `root` field in the mixin is specified, it should be a
+  ///  relative path under which inherited HTTP paths are placed. Example:
   ///
-  ///     apis:
-  ///     - name: google.storage.v2.Storage
-  ///       mixins:
-  ///       - name: google.acl.v1.AccessControl
-  ///         root: acls
+  ///      apis:
+  ///      - name: google.storage.v2.Storage
+  ///        mixins:
+  ///        - name: google.acl.v1.AccessControl
+  ///          root: acls
   ///
-  /// This implies the following inherited HTTP annotation:
+  ///  This implies the following inherited HTTP annotation:
   ///
-  ///     service Storage {
-  ///       // Get the underlying ACL object.
-  ///       rpc GetAcl(GetAclRequest) returns (Acl) {
-  ///         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
-  ///       }
-  ///       ...
-  ///     }
+  ///      service Storage {
+  ///        // Get the underlying ACL object.
+  ///        rpc GetAcl(GetAclRequest) returns (Acl) {
+  ///          option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+  ///        }
+  ///        ...
+  ///      }
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Mixin : pb::IMessage<Mixin> {
     private static readonly pb::MessageParser<Mixin> _parser = new pb::MessageParser<Mixin>(() => new Mixin());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Mixin> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.ApiReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Mixin() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Mixin(Mixin other) : this() {
       name_ = other.name_;
       root_ = other.root_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Mixin Clone() {
       return new Mixin(this);
     }
@@ -816,9 +735,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// The fully qualified name of the interface which is included.
+    ///  The fully qualified name of the API which is included.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -830,10 +748,9 @@
     public const int RootFieldNumber = 2;
     private string root_ = "";
     /// <summary>
-    /// If non-empty specifies a path under which inherited HTTP paths
-    /// are rooted.
+    ///  If non-empty specifies a path under which inherited HTTP paths
+    ///  are rooted.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Root {
       get { return root_; }
       set {
@@ -841,12 +758,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Mixin);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Mixin other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -856,26 +771,20 @@
       }
       if (Name != other.Name) return false;
       if (Root != other.Root) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Root.Length != 0) hash ^= Root.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -885,12 +794,8 @@
         output.WriteRawTag(18);
         output.WriteString(Root);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -899,13 +804,9 @@
       if (Root.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Root);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Mixin other) {
       if (other == null) {
         return;
@@ -916,16 +817,14 @@
       if (other.Root.Length != 0) {
         Root = other.Root;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs
index 2858b53..f17358f 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/duration.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/duration.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/duration.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class DurationReflection {
 
     #region Descriptor
@@ -27,7 +26,7 @@
             "Ch5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90",
             "b2J1ZiIqCghEdXJhdGlvbhIPCgdzZWNvbmRzGAEgASgDEg0KBW5hbm9zGAIg",
             "ASgFQnwKE2NvbS5nb29nbGUucHJvdG9idWZCDUR1cmF0aW9uUHJvdG9QAVoq",
-            "Z2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvcHR5cGVzL2R1cmF0aW9u+AEB",
+            "Z2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvcHR5cGVzL2R1cmF0aW9uoAEB",
             "ogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90",
             "bzM="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
@@ -41,96 +40,71 @@
   }
   #region Messages
   /// <summary>
-  /// A Duration represents a signed, fixed-length span of time represented
-  /// as a count of seconds and fractions of seconds at nanosecond
-  /// resolution. It is independent of any calendar and concepts like "day"
-  /// or "month". It is related to Timestamp in that the difference between
-  /// two Timestamp values is a Duration and it can be added or subtracted
-  /// from a Timestamp. Range is approximately +-10,000 years.
+  ///  A Duration represents a signed, fixed-length span of time represented
+  ///  as a count of seconds and fractions of seconds at nanosecond
+  ///  resolution. It is independent of any calendar and concepts like "day"
+  ///  or "month". It is related to Timestamp in that the difference between
+  ///  two Timestamp values is a Duration and it can be added or subtracted
+  ///  from a Timestamp. Range is approximately +-10,000 years.
   ///
-  /// # Examples
+  ///  Example 1: Compute Duration from two Timestamps in pseudo code.
   ///
-  /// Example 1: Compute Duration from two Timestamps in pseudo code.
+  ///      Timestamp start = ...;
+  ///      Timestamp end = ...;
+  ///      Duration duration = ...;
   ///
-  ///     Timestamp start = ...;
-  ///     Timestamp end = ...;
-  ///     Duration duration = ...;
+  ///      duration.seconds = end.seconds - start.seconds;
+  ///      duration.nanos = end.nanos - start.nanos;
   ///
-  ///     duration.seconds = end.seconds - start.seconds;
-  ///     duration.nanos = end.nanos - start.nanos;
+  ///      if (duration.seconds &lt; 0 &amp;&amp; duration.nanos > 0) {
+  ///        duration.seconds += 1;
+  ///        duration.nanos -= 1000000000;
+  ///      } else if (durations.seconds > 0 &amp;&amp; duration.nanos &lt; 0) {
+  ///        duration.seconds -= 1;
+  ///        duration.nanos += 1000000000;
+  ///      }
   ///
-  ///     if (duration.seconds &lt; 0 &amp;&amp; duration.nanos > 0) {
-  ///       duration.seconds += 1;
-  ///       duration.nanos -= 1000000000;
-  ///     } else if (durations.seconds > 0 &amp;&amp; duration.nanos &lt; 0) {
-  ///       duration.seconds -= 1;
-  ///       duration.nanos += 1000000000;
-  ///     }
+  ///  Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
   ///
-  /// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+  ///      Timestamp start = ...;
+  ///      Duration duration = ...;
+  ///      Timestamp end = ...;
   ///
-  ///     Timestamp start = ...;
-  ///     Duration duration = ...;
-  ///     Timestamp end = ...;
+  ///      end.seconds = start.seconds + duration.seconds;
+  ///      end.nanos = start.nanos + duration.nanos;
   ///
-  ///     end.seconds = start.seconds + duration.seconds;
-  ///     end.nanos = start.nanos + duration.nanos;
-  ///
-  ///     if (end.nanos &lt; 0) {
-  ///       end.seconds -= 1;
-  ///       end.nanos += 1000000000;
-  ///     } else if (end.nanos >= 1000000000) {
-  ///       end.seconds += 1;
-  ///       end.nanos -= 1000000000;
-  ///     }
-  ///
-  /// Example 3: Compute Duration from datetime.timedelta in Python.
-  ///
-  ///     td = datetime.timedelta(days=3, minutes=10)
-  ///     duration = Duration()
-  ///     duration.FromTimedelta(td)
-  ///
-  /// # JSON Mapping
-  ///
-  /// In JSON format, the Duration type is encoded as a string rather than an
-  /// object, where the string ends in the suffix "s" (indicating seconds) and
-  /// is preceded by the number of seconds, with nanoseconds expressed as
-  /// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
-  /// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
-  /// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
-  /// microsecond should be expressed in JSON format as "3.000001s".
+  ///      if (end.nanos &lt; 0) {
+  ///        end.seconds -= 1;
+  ///        end.nanos += 1000000000;
+  ///      } else if (end.nanos >= 1000000000) {
+  ///        end.seconds += 1;
+  ///        end.nanos -= 1000000000;
+  ///      }
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Duration : pb::IMessage<Duration> {
     private static readonly pb::MessageParser<Duration> _parser = new pb::MessageParser<Duration>(() => new Duration());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Duration> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Duration() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Duration(Duration other) : this() {
       seconds_ = other.seconds_;
       nanos_ = other.nanos_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Duration Clone() {
       return new Duration(this);
     }
@@ -139,11 +113,9 @@
     public const int SecondsFieldNumber = 1;
     private long seconds_;
     /// <summary>
-    /// 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
+    ///  Signed seconds of the span of time. Must be from -315,576,000,000
+    ///  to +315,576,000,000 inclusive.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long Seconds {
       get { return seconds_; }
       set {
@@ -155,14 +127,13 @@
     public const int NanosFieldNumber = 2;
     private int nanos_;
     /// <summary>
-    /// Signed fractions of a second at nanosecond resolution of the span
-    /// of time. Durations less than one second are represented with a 0
-    /// `seconds` field and a positive or negative `nanos` field. For durations
-    /// of one second or more, a non-zero value for the `nanos` field must be
-    /// of the same sign as the `seconds` field. Must be from -999,999,999
-    /// to +999,999,999 inclusive.
+    ///  Signed fractions of a second at nanosecond resolution of the span
+    ///  of time. Durations less than one second are represented with a 0
+    ///  `seconds` field and a positive or negative `nanos` field. For durations
+    ///  of one second or more, a non-zero value for the `nanos` field must be
+    ///  of the same sign as the `seconds` field. Must be from -999,999,999
+    ///  to +999,999,999 inclusive.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Nanos {
       get { return nanos_; }
       set {
@@ -170,12 +141,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Duration);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Duration other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -185,26 +154,20 @@
       }
       if (Seconds != other.Seconds) return false;
       if (Nanos != other.Nanos) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Seconds != 0L) hash ^= Seconds.GetHashCode();
       if (Nanos != 0) hash ^= Nanos.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Seconds != 0L) {
         output.WriteRawTag(8);
@@ -214,12 +177,8 @@
         output.WriteRawTag(16);
         output.WriteInt32(Nanos);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Seconds != 0L) {
@@ -228,13 +187,9 @@
       if (Nanos != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Nanos);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Duration other) {
       if (other == null) {
         return;
@@ -245,16 +200,14 @@
       if (other.Nanos != 0) {
         Nanos = other.Nanos;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Seconds = input.ReadInt64();
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs
index 2113add..e08ea24 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/empty.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/empty.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/empty.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class EmptyReflection {
 
     #region Descriptor
@@ -25,10 +24,10 @@
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
             "Chtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1",
-            "ZiIHCgVFbXB0eUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3Rv",
-            "UAFaJ2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy9lbXB0efgB",
-            "AaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJv",
-            "dG8z"));
+            "ZiIHCgVFbXB0eUJ5ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3Rv",
+            "UAFaJ2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy9lbXB0eaAB",
+            "AfgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IG",
+            "cHJvdG8z"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -40,55 +39,46 @@
   }
   #region Messages
   /// <summary>
-  /// A generic empty message that you can re-use to avoid defining duplicated
-  /// empty messages in your APIs. A typical example is to use it as the request
-  /// or the response type of an API method. For instance:
+  ///  A generic empty message that you can re-use to avoid defining duplicated
+  ///  empty messages in your APIs. A typical example is to use it as the request
+  ///  or the response type of an API method. For instance:
   ///
-  ///     service Foo {
-  ///       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
-  ///     }
+  ///      service Foo {
+  ///        rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+  ///      }
   ///
-  /// The JSON representation for `Empty` is empty JSON object `{}`.
+  ///  The JSON representation for `Empty` is empty JSON object `{}`.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Empty : pb::IMessage<Empty> {
     private static readonly pb::MessageParser<Empty> _parser = new pb::MessageParser<Empty>(() => new Empty());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Empty> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Empty() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Empty(Empty other) : this() {
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Empty Clone() {
       return new Empty(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Empty);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Empty other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -96,54 +86,38 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Empty other) {
       if (other == null) {
         return;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
         }
       }
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs
index 3565f43..6f0a64d 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/field_mask.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/field_mask.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/field_mask.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class FieldMaskReflection {
 
     #region Descriptor
@@ -25,11 +24,9 @@
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
             "CiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxIPZ29vZ2xlLnBy",
-            "b3RvYnVmIhoKCUZpZWxkTWFzaxINCgVwYXRocxgBIAMoCUKJAQoTY29tLmdv",
-            "b2dsZS5wcm90b2J1ZkIORmllbGRNYXNrUHJvdG9QAVo5Z29vZ2xlLmdvbGFu",
-            "Zy5vcmcvZ2VucHJvdG8vcHJvdG9idWYvZmllbGRfbWFzaztmaWVsZF9tYXNr",
-            "ogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90",
-            "bzM="));
+            "b3RvYnVmIhoKCUZpZWxkTWFzaxINCgVwYXRocxgBIAMoCUJRChNjb20uZ29v",
+            "Z2xlLnByb3RvYnVmQg5GaWVsZE1hc2tQcm90b1ABoAEBogIDR1BCqgIeR29v",
+            "Z2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -41,243 +38,178 @@
   }
   #region Messages
   /// <summary>
-  /// `FieldMask` represents a set of symbolic field paths, for example:
+  ///  `FieldMask` represents a set of symbolic field paths, for example:
   ///
-  ///     paths: "f.a"
-  ///     paths: "f.b.d"
+  ///      paths: "f.a"
+  ///      paths: "f.b.d"
   ///
-  /// Here `f` represents a field in some root message, `a` and `b`
-  /// fields in the message found in `f`, and `d` a field found in the
-  /// message in `f.b`.
+  ///  Here `f` represents a field in some root message, `a` and `b`
+  ///  fields in the message found in `f`, and `d` a field found in the
+  ///  message in `f.b`.
   ///
-  /// Field masks are used to specify a subset of fields that should be
-  /// returned by a get operation or modified by an update operation.
-  /// Field masks also have a custom JSON encoding (see below).
+  ///  Field masks are used to specify a subset of fields that should be
+  ///  returned by a get operation or modified by an update operation.
+  ///  Field masks also have a custom JSON encoding (see below).
   ///
-  /// # Field Masks in Projections
+  ///  # Field Masks in Projections
   ///
-  /// When used in the context of a projection, a response message or
-  /// sub-message is filtered by the API to only contain those fields as
-  /// specified in the mask. For example, if the mask in the previous
-  /// example is applied to a response message as follows:
+  ///  When used in the context of a projection, a response message or
+  ///  sub-message is filtered by the API to only contain those fields as
+  ///  specified in the mask. For example, if the mask in the previous
+  ///  example is applied to a response message as follows:
   ///
-  ///     f {
-  ///       a : 22
-  ///       b {
-  ///         d : 1
-  ///         x : 2
-  ///       }
-  ///       y : 13
-  ///     }
-  ///     z: 8
+  ///      f {
+  ///        a : 22
+  ///        b {
+  ///          d : 1
+  ///          x : 2
+  ///        }
+  ///        y : 13
+  ///      }
+  ///      z: 8
   ///
-  /// The result will not contain specific values for fields x,y and z
-  /// (their value will be set to the default, and omitted in proto text
-  /// output):
+  ///  The result will not contain specific values for fields x,y and z
+  ///  (their value will be set to the default, and omitted in proto text
+  ///  output):
   ///
-  ///     f {
-  ///       a : 22
-  ///       b {
-  ///         d : 1
-  ///       }
-  ///     }
+  ///      f {
+  ///        a : 22
+  ///        b {
+  ///          d : 1
+  ///        }
+  ///      }
   ///
-  /// A repeated field is not allowed except at the last position of a
-  /// paths string.
+  ///  A repeated field is not allowed except at the last position of a
+  ///  field mask.
   ///
-  /// If a FieldMask object is not present in a get operation, the
-  /// operation applies to all fields (as if a FieldMask of all fields
-  /// had been specified).
+  ///  If a FieldMask object is not present in a get operation, the
+  ///  operation applies to all fields (as if a FieldMask of all fields
+  ///  had been specified).
   ///
-  /// Note that a field mask does not necessarily apply to the
-  /// top-level response message. In case of a REST get operation, the
-  /// field mask applies directly to the response, but in case of a REST
-  /// list operation, the mask instead applies to each individual message
-  /// in the returned resource list. In case of a REST custom method,
-  /// other definitions may be used. Where the mask applies will be
-  /// clearly documented together with its declaration in the API.  In
-  /// any case, the effect on the returned resource/resources is required
-  /// behavior for APIs.
+  ///  Note that a field mask does not necessarily apply to the
+  ///  top-level response message. In case of a REST get operation, the
+  ///  field mask applies directly to the response, but in case of a REST
+  ///  list operation, the mask instead applies to each individual message
+  ///  in the returned resource list. In case of a REST custom method,
+  ///  other definitions may be used. Where the mask applies will be
+  ///  clearly documented together with its declaration in the API.  In
+  ///  any case, the effect on the returned resource/resources is required
+  ///  behavior for APIs.
   ///
-  /// # Field Masks in Update Operations
+  ///  # Field Masks in Update Operations
   ///
-  /// A field mask in update operations specifies which fields of the
-  /// targeted resource are going to be updated. The API is required
-  /// to only change the values of the fields as specified in the mask
-  /// and leave the others untouched. If a resource is passed in to
-  /// describe the updated values, the API ignores the values of all
-  /// fields not covered by the mask.
+  ///  A field mask in update operations specifies which fields of the
+  ///  targeted resource are going to be updated. The API is required
+  ///  to only change the values of the fields as specified in the mask
+  ///  and leave the others untouched. If a resource is passed in to
+  ///  describe the updated values, the API ignores the values of all
+  ///  fields not covered by the mask.
   ///
-  /// If a repeated field is specified for an update operation, the existing
-  /// repeated values in the target resource will be overwritten by the new values.
-  /// Note that a repeated field is only allowed in the last position of a `paths`
-  /// string.
+  ///  In order to reset a field's value to the default, the field must
+  ///  be in the mask and set to the default value in the provided resource.
+  ///  Hence, in order to reset all fields of a resource, provide a default
+  ///  instance of the resource and set all fields in the mask, or do
+  ///  not provide a mask as described below.
   ///
-  /// If a sub-message is specified in the last position of the field mask for an
-  /// update operation, then the existing sub-message in the target resource is
-  /// overwritten. Given the target message:
+  ///  If a field mask is not present on update, the operation applies to
+  ///  all fields (as if a field mask of all fields has been specified).
+  ///  Note that in the presence of schema evolution, this may mean that
+  ///  fields the client does not know and has therefore not filled into
+  ///  the request will be reset to their default. If this is unwanted
+  ///  behavior, a specific service may require a client to always specify
+  ///  a field mask, producing an error if not.
   ///
-  ///     f {
-  ///       b {
-  ///         d : 1
-  ///         x : 2
-  ///       }
-  ///       c : 1
-  ///     }
+  ///  As with get operations, the location of the resource which
+  ///  describes the updated values in the request message depends on the
+  ///  operation kind. In any case, the effect of the field mask is
+  ///  required to be honored by the API.
   ///
-  /// And an update message:
+  ///  ## Considerations for HTTP REST
   ///
-  ///     f {
-  ///       b {
-  ///         d : 10
-  ///       }
-  ///     }
+  ///  The HTTP kind of an update operation which uses a field mask must
+  ///  be set to PATCH instead of PUT in order to satisfy HTTP semantics
+  ///  (PUT must only be used for full updates).
   ///
-  /// then if the field mask is:
+  ///  # JSON Encoding of Field Masks
   ///
-  ///  paths: "f.b"
+  ///  In JSON, a field mask is encoded as a single string where paths are
+  ///  separated by a comma. Fields name in each path are converted
+  ///  to/from lower-camel naming conventions.
   ///
-  /// then the result will be:
+  ///  As an example, consider the following message declarations:
   ///
-  ///     f {
-  ///       b {
-  ///         d : 10
-  ///       }
-  ///       c : 1
-  ///     }
+  ///      message Profile {
+  ///        User user = 1;
+  ///        Photo photo = 2;
+  ///      }
+  ///      message User {
+  ///        string display_name = 1;
+  ///        string address = 2;
+  ///      }
   ///
-  /// However, if the update mask was:
+  ///  In proto a field mask for `Profile` may look as such:
   ///
-  ///  paths: "f.b.d"
+  ///      mask {
+  ///        paths: "user.display_name"
+  ///        paths: "photo"
+  ///      }
   ///
-  /// then the result would be:
+  ///  In JSON, the same mask is represented as below:
   ///
-  ///     f {
-  ///       b {
-  ///         d : 10
-  ///         x : 2
-  ///       }
-  ///       c : 1
-  ///     }
+  ///      {
+  ///        mask: "user.displayName,photo"
+  ///      }
   ///
-  /// In order to reset a field's value to the default, the field must
-  /// be in the mask and set to the default value in the provided resource.
-  /// Hence, in order to reset all fields of a resource, provide a default
-  /// instance of the resource and set all fields in the mask, or do
-  /// not provide a mask as described below.
+  ///  # Field Masks and Oneof Fields
   ///
-  /// If a field mask is not present on update, the operation applies to
-  /// all fields (as if a field mask of all fields has been specified).
-  /// Note that in the presence of schema evolution, this may mean that
-  /// fields the client does not know and has therefore not filled into
-  /// the request will be reset to their default. If this is unwanted
-  /// behavior, a specific service may require a client to always specify
-  /// a field mask, producing an error if not.
+  ///  Field masks treat fields in oneofs just as regular fields. Consider the
+  ///  following message:
   ///
-  /// As with get operations, the location of the resource which
-  /// describes the updated values in the request message depends on the
-  /// operation kind. In any case, the effect of the field mask is
-  /// required to be honored by the API.
+  ///      message SampleMessage {
+  ///        oneof test_oneof {
+  ///          string name = 4;
+  ///          SubMessage sub_message = 9;
+  ///        }
+  ///      }
   ///
-  /// ## Considerations for HTTP REST
+  ///  The field mask can be:
   ///
-  /// The HTTP kind of an update operation which uses a field mask must
-  /// be set to PATCH instead of PUT in order to satisfy HTTP semantics
-  /// (PUT must only be used for full updates).
+  ///      mask {
+  ///        paths: "name"
+  ///      }
   ///
-  /// # JSON Encoding of Field Masks
+  ///  Or:
   ///
-  /// In JSON, a field mask is encoded as a single string where paths are
-  /// separated by a comma. Fields name in each path are converted
-  /// to/from lower-camel naming conventions.
+  ///      mask {
+  ///        paths: "sub_message"
+  ///      }
   ///
-  /// As an example, consider the following message declarations:
-  ///
-  ///     message Profile {
-  ///       User user = 1;
-  ///       Photo photo = 2;
-  ///     }
-  ///     message User {
-  ///       string display_name = 1;
-  ///       string address = 2;
-  ///     }
-  ///
-  /// In proto a field mask for `Profile` may look as such:
-  ///
-  ///     mask {
-  ///       paths: "user.display_name"
-  ///       paths: "photo"
-  ///     }
-  ///
-  /// In JSON, the same mask is represented as below:
-  ///
-  ///     {
-  ///       mask: "user.displayName,photo"
-  ///     }
-  ///
-  /// # Field Masks and Oneof Fields
-  ///
-  /// Field masks treat fields in oneofs just as regular fields. Consider the
-  /// following message:
-  ///
-  ///     message SampleMessage {
-  ///       oneof test_oneof {
-  ///         string name = 4;
-  ///         SubMessage sub_message = 9;
-  ///       }
-  ///     }
-  ///
-  /// The field mask can be:
-  ///
-  ///     mask {
-  ///       paths: "name"
-  ///     }
-  ///
-  /// Or:
-  ///
-  ///     mask {
-  ///       paths: "sub_message"
-  ///     }
-  ///
-  /// Note that oneof type names ("test_oneof" in this case) cannot be used in
-  /// paths.
-  ///
-  /// ## Field Mask Verification
-  ///
-  /// The implementation of the all the API methods, which have any FieldMask type
-  /// field in the request, should verify the included field paths, and return
-  /// `INVALID_ARGUMENT` error if any path is duplicated or unmappable.
+  ///  Note that oneof type names ("test_oneof" in this case) cannot be used in
+  ///  paths.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class FieldMask : pb::IMessage<FieldMask> {
     private static readonly pb::MessageParser<FieldMask> _parser = new pb::MessageParser<FieldMask>(() => new FieldMask());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FieldMask> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldMask() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldMask(FieldMask other) : this() {
       paths_ = other.paths_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FieldMask Clone() {
       return new FieldMask(this);
     }
@@ -288,19 +220,16 @@
         = pb::FieldCodec.ForString(10);
     private readonly pbc::RepeatedField<string> paths_ = new pbc::RepeatedField<string>();
     /// <summary>
-    /// The set of field mask paths.
+    ///  The set of field mask paths.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> Paths {
       get { return paths_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FieldMask);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FieldMask other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -309,58 +238,42 @@
         return true;
       }
       if(!paths_.Equals(other.paths_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= paths_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       paths_.WriteTo(output, _repeated_paths_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += paths_.CalculateSize(_repeated_paths_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FieldMask other) {
       if (other == null) {
         return;
       }
       paths_.Add(other.paths_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             paths_.AddEntriesFrom(input, _repeated_paths_codec);
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
old mode 100755
new mode 100644
index 4b0670f..4bd62cf
--- a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
@@ -52,19 +52,14 @@
         /// </remarks>
         /// <param name="paths">Paths in the field mask</param>
         /// <param name="diagnosticOnly">Determines the handling of non-normalized values</param>
-        /// <exception cref="InvalidOperationException">The represented field mask is invalid, and <paramref name="diagnosticOnly"/> is <c>false</c>.</exception>
+        /// <exception cref="InvalidOperationException">The represented duration is invalid, and <paramref name="diagnosticOnly"/> is <c>false</c>.</exception>
         internal static string ToJson(IList<string> paths, bool diagnosticOnly)
         {
             var firstInvalid = paths.FirstOrDefault(p => !ValidatePath(p));
             if (firstInvalid == null)
             {
                 var writer = new StringWriter();
-#if NET35
-                var query = paths.Select(JsonFormatter.ToJsonName);
-                JsonFormatter.WriteString(writer, string.Join(",", query.ToArray()));
-#else
-                JsonFormatter.WriteString(writer, string.Join(",", paths.Select(JsonFormatter.ToJsonName)));
-#endif
+                JsonFormatter.WriteString(writer, string.Join(",", paths.Select(JsonFormatter.ToCamelCase)));
                 return writer.ToString();
             }
             else
@@ -85,9 +80,9 @@
         }
 
         /// <summary>
-        /// Checks whether the given path is valid for a field mask.
+        /// Camel-case converter with added strictness for field mask formatting.
         /// </summary>
-        /// <returns>true if the path is valid; false otherwise</returns>
+        /// <exception cref="InvalidOperationException">The field mask is invalid for JSON representation</exception>
         private static bool ValidatePath(string input)
         {
             for (int i = 0; i < input.Length; i++)
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs b/csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs
index 124ddaa..a235ece 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/source_context.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/source_context.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/source_context.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class SourceContextReflection {
 
     #region Descriptor
@@ -26,10 +25,9 @@
           string.Concat(
             "CiRnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8SD2dvb2ds",
             "ZS5wcm90b2J1ZiIiCg1Tb3VyY2VDb250ZXh0EhEKCWZpbGVfbmFtZRgBIAEo",
-            "CUKVAQoTY29tLmdvb2dsZS5wcm90b2J1ZkISU291cmNlQ29udGV4dFByb3Rv",
-            "UAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL3Byb3RvYnVmL3NvdXJj",
-            "ZV9jb250ZXh0O3NvdXJjZV9jb250ZXh0ogIDR1BCqgIeR29vZ2xlLlByb3Rv",
-            "YnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM="));
+            "CUJVChNjb20uZ29vZ2xlLnByb3RvYnVmQhJTb3VyY2VDb250ZXh0UHJvdG9Q",
+            "AaABAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IG",
+            "cHJvdG8z"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -41,39 +39,32 @@
   }
   #region Messages
   /// <summary>
-  /// `SourceContext` represents information about the source of a
-  /// protobuf element, like the file in which it is defined.
+  ///  `SourceContext` represents information about the source of a
+  ///  protobuf element, like the file in which it is defined.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class SourceContext : pb::IMessage<SourceContext> {
     private static readonly pb::MessageParser<SourceContext> _parser = new pb::MessageParser<SourceContext>(() => new SourceContext());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<SourceContext> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SourceContext() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SourceContext(SourceContext other) : this() {
       fileName_ = other.fileName_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public SourceContext Clone() {
       return new SourceContext(this);
     }
@@ -82,10 +73,9 @@
     public const int FileNameFieldNumber = 1;
     private string fileName_ = "";
     /// <summary>
-    /// The path-qualified name of the .proto file that contained the associated
-    /// protobuf element.  For example: `"google/protobuf/source_context.proto"`.
+    ///  The path-qualified name of the .proto file that contained the associated
+    ///  protobuf element.  For example: `"google/protobuf/source.proto"`.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string FileName {
       get { return fileName_; }
       set {
@@ -93,12 +83,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as SourceContext);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(SourceContext other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -107,48 +95,34 @@
         return true;
       }
       if (FileName != other.FileName) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (FileName.Length != 0) hash ^= FileName.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (FileName.Length != 0) {
         output.WriteRawTag(10);
         output.WriteString(FileName);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (FileName.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(FileName);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(SourceContext other) {
       if (other == null) {
         return;
@@ -156,16 +130,14 @@
       if (other.FileName.Length != 0) {
         FileName = other.FileName;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             FileName = input.ReadString();
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
index 194b81e..edc8940 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/struct.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/struct.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/struct.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class StructReflection {
 
     #region Descriptor
@@ -37,7 +36,7 @@
             "Lmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSobCglOdWxsVmFsdWUSDgoKTlVMTF9W",
             "QUxVRRAAQoEBChNjb20uZ29vZ2xlLnByb3RvYnVmQgtTdHJ1Y3RQcm90b1AB",
             "WjFnaXRodWIuY29tL2dvbGFuZy9wcm90b2J1Zi9wdHlwZXMvc3RydWN0O3N0",
-            "cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5",
+            "cnVjdHBioAEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5",
             "cGVzYgZwcm90bzM="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
@@ -52,14 +51,14 @@
   }
   #region Enums
   /// <summary>
-  /// `NullValue` is a singleton enumeration to represent the null value for the
-  /// `Value` type union.
+  ///  `NullValue` is a singleton enumeration to represent the null value for the
+  ///  `Value` type union.
   ///
-  ///  The JSON representation for `NullValue` is JSON `null`.
+  ///   The JSON representation for `NullValue` is JSON `null`.
   /// </summary>
   public enum NullValue {
     /// <summary>
-    /// Null value.
+    ///  Null value.
     /// </summary>
     [pbr::OriginalName("NULL_VALUE")] NullValue = 0,
   }
@@ -68,45 +67,38 @@
 
   #region Messages
   /// <summary>
-  /// `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
-  /// scripting languages like JS a struct is represented as an
-  /// object. The details of that representation are described together
-  /// with the proto support for the language.
+  ///  `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
+  ///  scripting languages like JS a struct is represented as an
+  ///  object. The details of that representation are described together
+  ///  with the proto support for the language.
   ///
-  /// The JSON representation for `Struct` is JSON object.
+  ///  The JSON representation for `Struct` is JSON object.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Struct : pb::IMessage<Struct> {
     private static readonly pb::MessageParser<Struct> _parser = new pb::MessageParser<Struct>(() => new Struct());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Struct> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Struct() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Struct(Struct other) : this() {
       fields_ = other.fields_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Struct Clone() {
       return new Struct(this);
     }
@@ -117,19 +109,16 @@
         = new pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Value.Parser), 10);
     private readonly pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value> fields_ = new pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value>();
     /// <summary>
-    /// Unordered map of dynamically typed values.
+    ///  Unordered map of dynamically typed values.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::MapField<string, global::Google.Protobuf.WellKnownTypes.Value> Fields {
       get { return fields_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Struct);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Struct other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -138,58 +127,42 @@
         return true;
       }
       if (!Fields.Equals(other.Fields)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= Fields.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       fields_.WriteTo(output, _map_fields_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += fields_.CalculateSize(_map_fields_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Struct other) {
       if (other == null) {
         return;
       }
       fields_.Add(other.fields_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             fields_.AddEntriesFrom(input, _map_fields_codec);
@@ -202,37 +175,32 @@
   }
 
   /// <summary>
-  /// `Value` represents a dynamically typed value which can be either
-  /// null, a number, a string, a boolean, a recursive struct value, or a
-  /// list of values. A producer of value is expected to set one of that
-  /// variants, absence of any variant indicates an error.
+  ///  `Value` represents a dynamically typed value which can be either
+  ///  null, a number, a string, a boolean, a recursive struct value, or a
+  ///  list of values. A producer of value is expected to set one of that
+  ///  variants, absence of any variant indicates an error.
   ///
-  /// The JSON representation for `Value` is JSON value.
+  ///  The JSON representation for `Value` is JSON value.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Value : pb::IMessage<Value> {
     private static readonly pb::MessageParser<Value> _parser = new pb::MessageParser<Value>(() => new Value());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Value> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Value() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Value(Value other) : this() {
       switch (other.KindCase) {
         case KindOneofCase.NullValue:
@@ -255,10 +223,8 @@
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Value Clone() {
       return new Value(this);
     }
@@ -266,9 +232,8 @@
     /// <summary>Field number for the "null_value" field.</summary>
     public const int NullValueFieldNumber = 1;
     /// <summary>
-    /// Represents a null value.
+    ///  Represents a null value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.NullValue NullValue {
       get { return kindCase_ == KindOneofCase.NullValue ? (global::Google.Protobuf.WellKnownTypes.NullValue) kind_ : 0; }
       set {
@@ -280,9 +245,8 @@
     /// <summary>Field number for the "number_value" field.</summary>
     public const int NumberValueFieldNumber = 2;
     /// <summary>
-    /// Represents a double value.
+    ///  Represents a double value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public double NumberValue {
       get { return kindCase_ == KindOneofCase.NumberValue ? (double) kind_ : 0D; }
       set {
@@ -294,9 +258,8 @@
     /// <summary>Field number for the "string_value" field.</summary>
     public const int StringValueFieldNumber = 3;
     /// <summary>
-    /// Represents a string value.
+    ///  Represents a string value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string StringValue {
       get { return kindCase_ == KindOneofCase.StringValue ? (string) kind_ : ""; }
       set {
@@ -308,9 +271,8 @@
     /// <summary>Field number for the "bool_value" field.</summary>
     public const int BoolValueFieldNumber = 4;
     /// <summary>
-    /// Represents a boolean value.
+    ///  Represents a boolean value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool BoolValue {
       get { return kindCase_ == KindOneofCase.BoolValue ? (bool) kind_ : false; }
       set {
@@ -322,9 +284,8 @@
     /// <summary>Field number for the "struct_value" field.</summary>
     public const int StructValueFieldNumber = 5;
     /// <summary>
-    /// Represents a structured value.
+    ///  Represents a structured value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Struct StructValue {
       get { return kindCase_ == KindOneofCase.StructValue ? (global::Google.Protobuf.WellKnownTypes.Struct) kind_ : null; }
       set {
@@ -336,9 +297,8 @@
     /// <summary>Field number for the "list_value" field.</summary>
     public const int ListValueFieldNumber = 6;
     /// <summary>
-    /// Represents a repeated `Value`.
+    ///  Represents a repeated `Value`.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.ListValue ListValue {
       get { return kindCase_ == KindOneofCase.ListValue ? (global::Google.Protobuf.WellKnownTypes.ListValue) kind_ : null; }
       set {
@@ -359,23 +319,19 @@
       ListValue = 6,
     }
     private KindOneofCase kindCase_ = KindOneofCase.None;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public KindOneofCase KindCase {
       get { return kindCase_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void ClearKind() {
       kindCase_ = KindOneofCase.None;
       kind_ = null;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Value);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Value other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -384,37 +340,31 @@
         return true;
       }
       if (NullValue != other.NullValue) return false;
-      if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(NumberValue, other.NumberValue)) return false;
+      if (NumberValue != other.NumberValue) return false;
       if (StringValue != other.StringValue) return false;
       if (BoolValue != other.BoolValue) return false;
       if (!object.Equals(StructValue, other.StructValue)) return false;
       if (!object.Equals(ListValue, other.ListValue)) return false;
       if (KindCase != other.KindCase) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (kindCase_ == KindOneofCase.NullValue) hash ^= NullValue.GetHashCode();
-      if (kindCase_ == KindOneofCase.NumberValue) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(NumberValue);
+      if (kindCase_ == KindOneofCase.NumberValue) hash ^= NumberValue.GetHashCode();
       if (kindCase_ == KindOneofCase.StringValue) hash ^= StringValue.GetHashCode();
       if (kindCase_ == KindOneofCase.BoolValue) hash ^= BoolValue.GetHashCode();
       if (kindCase_ == KindOneofCase.StructValue) hash ^= StructValue.GetHashCode();
       if (kindCase_ == KindOneofCase.ListValue) hash ^= ListValue.GetHashCode();
       hash ^= (int) kindCase_;
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (kindCase_ == KindOneofCase.NullValue) {
         output.WriteRawTag(8);
@@ -440,12 +390,8 @@
         output.WriteRawTag(50);
         output.WriteMessage(ListValue);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (kindCase_ == KindOneofCase.NullValue) {
@@ -466,13 +412,9 @@
       if (kindCase_ == KindOneofCase.ListValue) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(ListValue);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Value other) {
       if (other == null) {
         return;
@@ -491,29 +433,21 @@
           BoolValue = other.BoolValue;
           break;
         case KindOneofCase.StructValue:
-          if (StructValue == null) {
-            StructValue = new global::Google.Protobuf.WellKnownTypes.Struct();
-          }
-          StructValue.MergeFrom(other.StructValue);
+          StructValue = other.StructValue;
           break;
         case KindOneofCase.ListValue:
-          if (ListValue == null) {
-            ListValue = new global::Google.Protobuf.WellKnownTypes.ListValue();
-          }
-          ListValue.MergeFrom(other.ListValue);
+          ListValue = other.ListValue;
           break;
       }
 
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             kind_ = input.ReadEnum();
@@ -557,40 +491,33 @@
   }
 
   /// <summary>
-  /// `ListValue` is a wrapper around a repeated field of values.
+  ///  `ListValue` is a wrapper around a repeated field of values.
   ///
-  /// The JSON representation for `ListValue` is JSON array.
+  ///  The JSON representation for `ListValue` is JSON array.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class ListValue : pb::IMessage<ListValue> {
     private static readonly pb::MessageParser<ListValue> _parser = new pb::MessageParser<ListValue>(() => new ListValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<ListValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ListValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ListValue(ListValue other) : this() {
       values_ = other.values_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ListValue Clone() {
       return new ListValue(this);
     }
@@ -601,19 +528,16 @@
         = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Value.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value> values_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value>();
     /// <summary>
-    /// Repeated field of dynamically typed values.
+    ///  Repeated field of dynamically typed values.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Value> Values {
       get { return values_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ListValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(ListValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -622,58 +546,42 @@
         return true;
       }
       if(!values_.Equals(other.values_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       hash ^= values_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       values_.WriteTo(output, _repeated_values_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       size += values_.CalculateSize(_repeated_values_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(ListValue other) {
       if (other == null) {
         return;
       }
       values_.Add(other.values_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             values_.AddEntriesFrom(input, _repeated_values_codec);
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs b/csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs
index 8b63d63..dd485d3 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs
@@ -31,6 +31,10 @@
 #endregion
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
 
 namespace Google.Protobuf.WellKnownTypes
 {
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs
index bf2943d..053b88b 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/timestamp.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/timestamp.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/timestamp.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class TimestampReflection {
 
     #region Descriptor
@@ -26,10 +25,10 @@
           string.Concat(
             "Ch9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJv",
             "dG9idWYiKwoJVGltZXN0YW1wEg8KB3NlY29uZHMYASABKAMSDQoFbmFub3MY",
-            "AiABKAVCfgoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9Q",
-            "AVorZ2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvcHR5cGVzL3RpbWVzdGFt",
-            "cPgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IG",
-            "cHJvdG8z"));
+            "AiABKAVCgQEKE2NvbS5nb29nbGUucHJvdG9idWZCDlRpbWVzdGFtcFByb3Rv",
+            "UAFaK2dpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy90aW1lc3Rh",
+            "bXCgAQH4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlw",
+            "ZXNiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -41,113 +40,83 @@
   }
   #region Messages
   /// <summary>
-  /// A Timestamp represents a point in time independent of any time zone
-  /// or calendar, represented as seconds and fractions of seconds at
-  /// nanosecond resolution in UTC Epoch time. It is encoded using the
-  /// Proleptic Gregorian Calendar which extends the Gregorian calendar
-  /// backwards to year one. It is encoded assuming all minutes are 60
-  /// seconds long, i.e. leap seconds are "smeared" so that no leap second
-  /// table is needed for interpretation. Range is from
-  /// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
-  /// By restricting to that range, we ensure that we can convert to
-  /// and from  RFC 3339 date strings.
-  /// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
+  ///  A Timestamp represents a point in time independent of any time zone
+  ///  or calendar, represented as seconds and fractions of seconds at
+  ///  nanosecond resolution in UTC Epoch time. It is encoded using the
+  ///  Proleptic Gregorian Calendar which extends the Gregorian calendar
+  ///  backwards to year one. It is encoded assuming all minutes are 60
+  ///  seconds long, i.e. leap seconds are "smeared" so that no leap second
+  ///  table is needed for interpretation. Range is from
+  ///  0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
+  ///  By restricting to that range, we ensure that we can convert to
+  ///  and from  RFC 3339 date strings.
+  ///  See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
   ///
-  /// # Examples
+  ///  Example 1: Compute Timestamp from POSIX `time()`.
   ///
-  /// Example 1: Compute Timestamp from POSIX `time()`.
+  ///      Timestamp timestamp;
+  ///      timestamp.set_seconds(time(NULL));
+  ///      timestamp.set_nanos(0);
   ///
-  ///     Timestamp timestamp;
-  ///     timestamp.set_seconds(time(NULL));
-  ///     timestamp.set_nanos(0);
+  ///  Example 2: Compute Timestamp from POSIX `gettimeofday()`.
   ///
-  /// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+  ///      struct timeval tv;
+  ///      gettimeofday(&amp;tv, NULL);
   ///
-  ///     struct timeval tv;
-  ///     gettimeofday(&amp;tv, NULL);
+  ///      Timestamp timestamp;
+  ///      timestamp.set_seconds(tv.tv_sec);
+  ///      timestamp.set_nanos(tv.tv_usec * 1000);
   ///
-  ///     Timestamp timestamp;
-  ///     timestamp.set_seconds(tv.tv_sec);
-  ///     timestamp.set_nanos(tv.tv_usec * 1000);
+  ///  Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
   ///
-  /// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+  ///      FILETIME ft;
+  ///      GetSystemTimeAsFileTime(&amp;ft);
+  ///      UINT64 ticks = (((UINT64)ft.dwHighDateTime) &lt;&lt; 32) | ft.dwLowDateTime;
   ///
-  ///     FILETIME ft;
-  ///     GetSystemTimeAsFileTime(&amp;ft);
-  ///     UINT64 ticks = (((UINT64)ft.dwHighDateTime) &lt;&lt; 32) | ft.dwLowDateTime;
+  ///      // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+  ///      // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+  ///      Timestamp timestamp;
+  ///      timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+  ///      timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
   ///
-  ///     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
-  ///     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
-  ///     Timestamp timestamp;
-  ///     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
-  ///     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+  ///  Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
   ///
-  /// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+  ///      long millis = System.currentTimeMillis();
   ///
-  ///     long millis = System.currentTimeMillis();
+  ///      Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+  ///          .setNanos((int) ((millis % 1000) * 1000000)).build();
   ///
-  ///     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
-  ///         .setNanos((int) ((millis % 1000) * 1000000)).build();
+  ///  Example 5: Compute Timestamp from current time in Python.
   ///
-  /// Example 5: Compute Timestamp from current time in Python.
-  ///
-  ///     timestamp = Timestamp()
-  ///     timestamp.GetCurrentTime()
-  ///
-  /// # JSON Mapping
-  ///
-  /// In JSON format, the Timestamp type is encoded as a string in the
-  /// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
-  /// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
-  /// where {year} is always expressed using four digits while {month}, {day},
-  /// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
-  /// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
-  /// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
-  /// is required, though only UTC (as indicated by "Z") is presently supported.
-  ///
-  /// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
-  /// 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]
-  /// 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()`](
-  /// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--)
-  /// to obtain a formatter capable of generating timestamps in this format.
+  ///      now = time.time()
+  ///      seconds = int(now)
+  ///      nanos = int((now - seconds) * 10**9)
+  ///      timestamp = Timestamp(seconds=seconds, nanos=nanos)
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Timestamp : pb::IMessage<Timestamp> {
     private static readonly pb::MessageParser<Timestamp> _parser = new pb::MessageParser<Timestamp>(() => new Timestamp());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Timestamp> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Timestamp() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Timestamp(Timestamp other) : this() {
       seconds_ = other.seconds_;
       nanos_ = other.nanos_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Timestamp Clone() {
       return new Timestamp(this);
     }
@@ -156,11 +125,10 @@
     public const int SecondsFieldNumber = 1;
     private long seconds_;
     /// <summary>
-    /// 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.
+    ///  Represents seconds of UTC time since Unix epoch
+    ///  1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
+    ///  9999-12-31T23:59:59Z inclusive.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long Seconds {
       get { return seconds_; }
       set {
@@ -172,12 +140,11 @@
     public const int NanosFieldNumber = 2;
     private int nanos_;
     /// <summary>
-    /// Non-negative fractions of a second at nanosecond resolution. Negative
-    /// second values with fractions must still have non-negative nanos values
-    /// that count forward in time. Must be from 0 to 999,999,999
-    /// inclusive.
+    ///  Non-negative fractions of a second at nanosecond resolution. Negative
+    ///  second values with fractions must still have non-negative nanos values
+    ///  that count forward in time. Must be from 0 to 999,999,999
+    ///  inclusive.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Nanos {
       get { return nanos_; }
       set {
@@ -185,12 +152,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Timestamp);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Timestamp other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -200,26 +165,20 @@
       }
       if (Seconds != other.Seconds) return false;
       if (Nanos != other.Nanos) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Seconds != 0L) hash ^= Seconds.GetHashCode();
       if (Nanos != 0) hash ^= Nanos.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Seconds != 0L) {
         output.WriteRawTag(8);
@@ -229,12 +188,8 @@
         output.WriteRawTag(16);
         output.WriteInt32(Nanos);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Seconds != 0L) {
@@ -243,13 +198,9 @@
       if (Nanos != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Nanos);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Timestamp other) {
       if (other == null) {
         return;
@@ -260,16 +211,14 @@
       if (other.Nanos != 0) {
         Nanos = other.Nanos;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Seconds = input.ReadInt64();
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Type.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Type.cs
index 8431055..657c246 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Type.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Type.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/type.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/type.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/type.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class TypeReflection {
 
     #region Descriptor
@@ -56,10 +55,9 @@
             "ASgFEigKB29wdGlvbnMYAyADKAsyFy5nb29nbGUucHJvdG9idWYuT3B0aW9u",
             "IjsKBk9wdGlvbhIMCgRuYW1lGAEgASgJEiMKBXZhbHVlGAIgASgLMhQuZ29v",
             "Z2xlLnByb3RvYnVmLkFueSouCgZTeW50YXgSEQoNU1lOVEFYX1BST1RPMhAA",
-            "EhEKDVNZTlRBWF9QUk9UTzMQAUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQglU",
-            "eXBlUHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vcHJvdG9i",
-            "dWYvcHR5cGU7cHR5cGX4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2Vs",
-            "bEtub3duVHlwZXNiBnByb3RvMw=="));
+            "EhEKDVNZTlRBWF9QUk9UTzMQAUJMChNjb20uZ29vZ2xlLnByb3RvYnVmQglU",
+            "eXBlUHJvdG9QAaABAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25v",
+            "d25UeXBlc2IGcHJvdG8z"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor, },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.WellKnownTypes.Syntax), }, new pbr::GeneratedClrTypeInfo[] {
@@ -75,15 +73,15 @@
   }
   #region Enums
   /// <summary>
-  /// The syntax in which a protocol buffer element is defined.
+  ///  The syntax in which a protocol buffer element is defined.
   /// </summary>
   public enum Syntax {
     /// <summary>
-    /// Syntax `proto2`.
+    ///  Syntax `proto2`.
     /// </summary>
     [pbr::OriginalName("SYNTAX_PROTO2")] Proto2 = 0,
     /// <summary>
-    /// Syntax `proto3`.
+    ///  Syntax `proto3`.
     /// </summary>
     [pbr::OriginalName("SYNTAX_PROTO3")] Proto3 = 1,
   }
@@ -92,32 +90,27 @@
 
   #region Messages
   /// <summary>
-  /// A protocol buffer message type.
+  ///  A protocol buffer message type.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Type : pb::IMessage<Type> {
     private static readonly pb::MessageParser<Type> _parser = new pb::MessageParser<Type>(() => new Type());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Type> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Type() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Type(Type other) : this() {
       name_ = other.name_;
       fields_ = other.fields_.Clone();
@@ -125,10 +118,8 @@
       options_ = other.options_.Clone();
       SourceContext = other.sourceContext_ != null ? other.SourceContext.Clone() : null;
       syntax_ = other.syntax_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Type Clone() {
       return new Type(this);
     }
@@ -137,9 +128,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// The fully qualified message name.
+    ///  The fully qualified message name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -153,9 +143,8 @@
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Field.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Field> fields_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Field>();
     /// <summary>
-    /// The list of fields.
+    ///  The list of fields.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Field> Fields {
       get { return fields_; }
     }
@@ -166,9 +155,8 @@
         = pb::FieldCodec.ForString(26);
     private readonly pbc::RepeatedField<string> oneofs_ = new pbc::RepeatedField<string>();
     /// <summary>
-    /// The list of types appearing in `oneof` definitions in this type.
+    ///  The list of types appearing in `oneof` definitions in this type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<string> Oneofs {
       get { return oneofs_; }
     }
@@ -179,9 +167,8 @@
         = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.WellKnownTypes.Option.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> options_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option>();
     /// <summary>
-    /// The protocol buffer options.
+    ///  The protocol buffer options.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> Options {
       get { return options_; }
     }
@@ -190,9 +177,8 @@
     public const int SourceContextFieldNumber = 5;
     private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContext_;
     /// <summary>
-    /// The source context.
+    ///  The source context.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
       get { return sourceContext_; }
       set {
@@ -204,9 +190,8 @@
     public const int SyntaxFieldNumber = 6;
     private global::Google.Protobuf.WellKnownTypes.Syntax syntax_ = 0;
     /// <summary>
-    /// The source syntax.
+    ///  The source syntax.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Syntax Syntax {
       get { return syntax_; }
       set {
@@ -214,12 +199,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Type);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Type other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -233,10 +216,9 @@
       if(!options_.Equals(other.options_)) return false;
       if (!object.Equals(SourceContext, other.SourceContext)) return false;
       if (Syntax != other.Syntax) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -245,18 +227,13 @@
       hash ^= options_.GetHashCode();
       if (sourceContext_ != null) hash ^= SourceContext.GetHashCode();
       if (Syntax != 0) hash ^= Syntax.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -273,12 +250,8 @@
         output.WriteRawTag(48);
         output.WriteEnum((int) Syntax);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -293,13 +266,9 @@
       if (Syntax != 0) {
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Syntax);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Type other) {
       if (other == null) {
         return;
@@ -319,16 +288,14 @@
       if (other.Syntax != 0) {
         Syntax = other.Syntax;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -364,32 +331,27 @@
   }
 
   /// <summary>
-  /// A single field of a message type.
+  ///  A single field of a message type.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Field : pb::IMessage<Field> {
     private static readonly pb::MessageParser<Field> _parser = new pb::MessageParser<Field>(() => new Field());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Field> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Field() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Field(Field other) : this() {
       kind_ = other.kind_;
       cardinality_ = other.cardinality_;
@@ -401,10 +363,8 @@
       options_ = other.options_.Clone();
       jsonName_ = other.jsonName_;
       defaultValue_ = other.defaultValue_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Field Clone() {
       return new Field(this);
     }
@@ -413,9 +373,8 @@
     public const int KindFieldNumber = 1;
     private global::Google.Protobuf.WellKnownTypes.Field.Types.Kind kind_ = 0;
     /// <summary>
-    /// The field type.
+    ///  The field type.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Field.Types.Kind Kind {
       get { return kind_; }
       set {
@@ -427,9 +386,8 @@
     public const int CardinalityFieldNumber = 2;
     private global::Google.Protobuf.WellKnownTypes.Field.Types.Cardinality cardinality_ = 0;
     /// <summary>
-    /// The field cardinality.
+    ///  The field cardinality.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Field.Types.Cardinality Cardinality {
       get { return cardinality_; }
       set {
@@ -441,9 +399,8 @@
     public const int NumberFieldNumber = 3;
     private int number_;
     /// <summary>
-    /// The field number.
+    ///  The field number.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Number {
       get { return number_; }
       set {
@@ -455,9 +412,8 @@
     public const int NameFieldNumber = 4;
     private string name_ = "";
     /// <summary>
-    /// The field name.
+    ///  The field name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -469,10 +425,9 @@
     public const int TypeUrlFieldNumber = 6;
     private string typeUrl_ = "";
     /// <summary>
-    /// The field type URL, without the scheme, for message or enumeration
-    /// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+    ///  The field type URL, without the scheme, for message or enumeration
+    ///  types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string TypeUrl {
       get { return typeUrl_; }
       set {
@@ -484,10 +439,9 @@
     public const int OneofIndexFieldNumber = 7;
     private int oneofIndex_;
     /// <summary>
-    /// The index of the field type in `Type.oneofs`, for message or enumeration
-    /// types. The first type has index 1; zero means the type is not in the list.
+    ///  The index of the field type in `Type.oneofs`, for message or enumeration
+    ///  types. The first type has index 1; zero means the type is not in the list.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int OneofIndex {
       get { return oneofIndex_; }
       set {
@@ -499,9 +453,8 @@
     public const int PackedFieldNumber = 8;
     private bool packed_;
     /// <summary>
-    /// Whether to use alternative packed wire representation.
+    ///  Whether to use alternative packed wire representation.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Packed {
       get { return packed_; }
       set {
@@ -515,9 +468,8 @@
         = pb::FieldCodec.ForMessage(74, global::Google.Protobuf.WellKnownTypes.Option.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> options_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option>();
     /// <summary>
-    /// The protocol buffer options.
+    ///  The protocol buffer options.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> Options {
       get { return options_; }
     }
@@ -526,9 +478,8 @@
     public const int JsonNameFieldNumber = 10;
     private string jsonName_ = "";
     /// <summary>
-    /// The field JSON name.
+    ///  The field JSON name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string JsonName {
       get { return jsonName_; }
       set {
@@ -540,9 +491,8 @@
     public const int DefaultValueFieldNumber = 11;
     private string defaultValue_ = "";
     /// <summary>
-    /// The string value of the default value of this field. Proto2 syntax only.
+    ///  The string value of the default value of this field. Proto2 syntax only.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string DefaultValue {
       get { return defaultValue_; }
       set {
@@ -550,12 +500,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Field);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Field other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -573,10 +521,9 @@
       if(!options_.Equals(other.options_)) return false;
       if (JsonName != other.JsonName) return false;
       if (DefaultValue != other.DefaultValue) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Kind != 0) hash ^= Kind.GetHashCode();
@@ -589,18 +536,13 @@
       hash ^= options_.GetHashCode();
       if (JsonName.Length != 0) hash ^= JsonName.GetHashCode();
       if (DefaultValue.Length != 0) hash ^= DefaultValue.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Kind != 0) {
         output.WriteRawTag(8);
@@ -639,12 +581,8 @@
         output.WriteRawTag(90);
         output.WriteString(DefaultValue);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Kind != 0) {
@@ -675,13 +613,9 @@
       if (DefaultValue.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(DefaultValue);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Field other) {
       if (other == null) {
         return;
@@ -714,16 +648,14 @@
       if (other.DefaultValue.Length != 0) {
         DefaultValue = other.DefaultValue;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             kind_ = (global::Google.Protobuf.WellKnownTypes.Field.Types.Kind) input.ReadEnum();
@@ -771,108 +703,108 @@
 
     #region Nested types
     /// <summary>Container for nested types declared in the Field message type.</summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     public static partial class Types {
       /// <summary>
-      /// Basic field types.
+      ///  Basic field types.
       /// </summary>
       public enum Kind {
         /// <summary>
-        /// Field type unknown.
+        ///  Field type unknown.
         /// </summary>
         [pbr::OriginalName("TYPE_UNKNOWN")] TypeUnknown = 0,
         /// <summary>
-        /// Field type double.
+        ///  Field type double.
         /// </summary>
         [pbr::OriginalName("TYPE_DOUBLE")] TypeDouble = 1,
         /// <summary>
-        /// Field type float.
+        ///  Field type float.
         /// </summary>
         [pbr::OriginalName("TYPE_FLOAT")] TypeFloat = 2,
         /// <summary>
-        /// Field type int64.
+        ///  Field type int64.
         /// </summary>
         [pbr::OriginalName("TYPE_INT64")] TypeInt64 = 3,
         /// <summary>
-        /// Field type uint64.
+        ///  Field type uint64.
         /// </summary>
         [pbr::OriginalName("TYPE_UINT64")] TypeUint64 = 4,
         /// <summary>
-        /// Field type int32.
+        ///  Field type int32.
         /// </summary>
         [pbr::OriginalName("TYPE_INT32")] TypeInt32 = 5,
         /// <summary>
-        /// Field type fixed64.
+        ///  Field type fixed64.
         /// </summary>
         [pbr::OriginalName("TYPE_FIXED64")] TypeFixed64 = 6,
         /// <summary>
-        /// Field type fixed32.
+        ///  Field type fixed32.
         /// </summary>
         [pbr::OriginalName("TYPE_FIXED32")] TypeFixed32 = 7,
         /// <summary>
-        /// Field type bool.
+        ///  Field type bool.
         /// </summary>
         [pbr::OriginalName("TYPE_BOOL")] TypeBool = 8,
         /// <summary>
-        /// Field type string.
+        ///  Field type string.
         /// </summary>
         [pbr::OriginalName("TYPE_STRING")] TypeString = 9,
         /// <summary>
-        /// Field type group. Proto2 syntax only, and deprecated.
+        ///  Field type group. Proto2 syntax only, and deprecated.
         /// </summary>
         [pbr::OriginalName("TYPE_GROUP")] TypeGroup = 10,
         /// <summary>
-        /// Field type message.
+        ///  Field type message.
         /// </summary>
         [pbr::OriginalName("TYPE_MESSAGE")] TypeMessage = 11,
         /// <summary>
-        /// Field type bytes.
+        ///  Field type bytes.
         /// </summary>
         [pbr::OriginalName("TYPE_BYTES")] TypeBytes = 12,
         /// <summary>
-        /// Field type uint32.
+        ///  Field type uint32.
         /// </summary>
         [pbr::OriginalName("TYPE_UINT32")] TypeUint32 = 13,
         /// <summary>
-        /// Field type enum.
+        ///  Field type enum.
         /// </summary>
         [pbr::OriginalName("TYPE_ENUM")] TypeEnum = 14,
         /// <summary>
-        /// Field type sfixed32.
+        ///  Field type sfixed32.
         /// </summary>
         [pbr::OriginalName("TYPE_SFIXED32")] TypeSfixed32 = 15,
         /// <summary>
-        /// Field type sfixed64.
+        ///  Field type sfixed64.
         /// </summary>
         [pbr::OriginalName("TYPE_SFIXED64")] TypeSfixed64 = 16,
         /// <summary>
-        /// Field type sint32.
+        ///  Field type sint32.
         /// </summary>
         [pbr::OriginalName("TYPE_SINT32")] TypeSint32 = 17,
         /// <summary>
-        /// Field type sint64.
+        ///  Field type sint64.
         /// </summary>
         [pbr::OriginalName("TYPE_SINT64")] TypeSint64 = 18,
       }
 
       /// <summary>
-      /// Whether a field is optional, required, or repeated.
+      ///  Whether a field is optional, required, or repeated.
       /// </summary>
       public enum Cardinality {
         /// <summary>
-        /// For fields with unknown cardinality.
+        ///  For fields with unknown cardinality.
         /// </summary>
         [pbr::OriginalName("CARDINALITY_UNKNOWN")] Unknown = 0,
         /// <summary>
-        /// For optional fields.
+        ///  For optional fields.
         /// </summary>
         [pbr::OriginalName("CARDINALITY_OPTIONAL")] Optional = 1,
         /// <summary>
-        /// For required fields. Proto2 syntax only.
+        ///  For required fields. Proto2 syntax only.
         /// </summary>
         [pbr::OriginalName("CARDINALITY_REQUIRED")] Required = 2,
         /// <summary>
-        /// For repeated fields.
+        ///  For repeated fields.
         /// </summary>
         [pbr::OriginalName("CARDINALITY_REPEATED")] Repeated = 3,
       }
@@ -883,42 +815,35 @@
   }
 
   /// <summary>
-  /// Enum type definition.
+  ///  Enum type definition.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Enum : pb::IMessage<Enum> {
     private static readonly pb::MessageParser<Enum> _parser = new pb::MessageParser<Enum>(() => new Enum());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Enum> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Enum() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Enum(Enum other) : this() {
       name_ = other.name_;
       enumvalue_ = other.enumvalue_.Clone();
       options_ = other.options_.Clone();
       SourceContext = other.sourceContext_ != null ? other.SourceContext.Clone() : null;
       syntax_ = other.syntax_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Enum Clone() {
       return new Enum(this);
     }
@@ -927,9 +852,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// Enum type name.
+    ///  Enum type name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -943,9 +867,8 @@
         = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.EnumValue.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.EnumValue> enumvalue_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.EnumValue>();
     /// <summary>
-    /// Enum value definitions.
+    ///  Enum value definitions.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.EnumValue> Enumvalue {
       get { return enumvalue_; }
     }
@@ -956,9 +879,8 @@
         = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.WellKnownTypes.Option.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> options_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option>();
     /// <summary>
-    /// Protocol buffer options.
+    ///  Protocol buffer options.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> Options {
       get { return options_; }
     }
@@ -967,9 +889,8 @@
     public const int SourceContextFieldNumber = 4;
     private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContext_;
     /// <summary>
-    /// The source context.
+    ///  The source context.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContext {
       get { return sourceContext_; }
       set {
@@ -981,9 +902,8 @@
     public const int SyntaxFieldNumber = 5;
     private global::Google.Protobuf.WellKnownTypes.Syntax syntax_ = 0;
     /// <summary>
-    /// The source syntax.
+    ///  The source syntax.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Syntax Syntax {
       get { return syntax_; }
       set {
@@ -991,12 +911,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Enum);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Enum other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1009,10 +927,9 @@
       if(!options_.Equals(other.options_)) return false;
       if (!object.Equals(SourceContext, other.SourceContext)) return false;
       if (Syntax != other.Syntax) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
@@ -1020,18 +937,13 @@
       hash ^= options_.GetHashCode();
       if (sourceContext_ != null) hash ^= SourceContext.GetHashCode();
       if (Syntax != 0) hash ^= Syntax.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -1047,12 +959,8 @@
         output.WriteRawTag(40);
         output.WriteEnum((int) Syntax);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -1066,13 +974,9 @@
       if (Syntax != 0) {
         size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Syntax);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Enum other) {
       if (other == null) {
         return;
@@ -1091,16 +995,14 @@
       if (other.Syntax != 0) {
         Syntax = other.Syntax;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -1132,40 +1034,33 @@
   }
 
   /// <summary>
-  /// Enum value definition.
+  ///  Enum value definition.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class EnumValue : pb::IMessage<EnumValue> {
     private static readonly pb::MessageParser<EnumValue> _parser = new pb::MessageParser<EnumValue>(() => new EnumValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<EnumValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValue(EnumValue other) : this() {
       name_ = other.name_;
       number_ = other.number_;
       options_ = other.options_.Clone();
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public EnumValue Clone() {
       return new EnumValue(this);
     }
@@ -1174,9 +1069,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// Enum value name.
+    ///  Enum value name.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -1188,9 +1082,8 @@
     public const int NumberFieldNumber = 2;
     private int number_;
     /// <summary>
-    /// Enum value number.
+    ///  Enum value number.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Number {
       get { return number_; }
       set {
@@ -1204,19 +1097,16 @@
         = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.WellKnownTypes.Option.Parser);
     private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> options_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option>();
     /// <summary>
-    /// Protocol buffer options.
+    ///  Protocol buffer options.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Option> Options {
       get { return options_; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as EnumValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(EnumValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1227,27 +1117,21 @@
       if (Name != other.Name) return false;
       if (Number != other.Number) return false;
       if(!options_.Equals(other.options_)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Number != 0) hash ^= Number.GetHashCode();
       hash ^= options_.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -1258,12 +1142,8 @@
         output.WriteInt32(Number);
       }
       options_.WriteTo(output, _repeated_options_codec);
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -1273,13 +1153,9 @@
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Number);
       }
       size += options_.CalculateSize(_repeated_options_codec);
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(EnumValue other) {
       if (other == null) {
         return;
@@ -1291,16 +1167,14 @@
         Number = other.Number;
       }
       options_.Add(other.options_);
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
@@ -1321,40 +1195,33 @@
   }
 
   /// <summary>
-  /// A protocol buffer option, which can be attached to a message, field,
-  /// enumeration, etc.
+  ///  A protocol buffer option, which can be attached to a message, field,
+  ///  enumeration, etc.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Option : pb::IMessage<Option> {
     private static readonly pb::MessageParser<Option> _parser = new pb::MessageParser<Option>(() => new Option());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Option> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor.MessageTypes[4]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Option() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Option(Option other) : this() {
       name_ = other.name_;
       Value = other.value_ != null ? other.Value.Clone() : null;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Option Clone() {
       return new Option(this);
     }
@@ -1363,12 +1230,8 @@
     public const int NameFieldNumber = 1;
     private string name_ = "";
     /// <summary>
-    /// The option's name. For protobuf built-in options (options defined in
-    /// descriptor.proto), this is the short name. For example, `"map_entry"`.
-    /// For custom options, it should be the fully-qualified name. For example,
-    /// `"google.api.http"`.
+    ///  The option's name. For example, `"java_package"`.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Name {
       get { return name_; }
       set {
@@ -1380,12 +1243,8 @@
     public const int ValueFieldNumber = 2;
     private global::Google.Protobuf.WellKnownTypes.Any value_;
     /// <summary>
-    /// The option's value packed in an Any message. If the value is a primitive,
-    /// the corresponding wrapper type defined in google/protobuf/wrappers.proto
-    /// should be used. If the value is an enum, it should be stored as an int32
-    /// value using the google.protobuf.Int32Value type.
+    ///  The option's value. For example, `"com.google.protobuf"`.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public global::Google.Protobuf.WellKnownTypes.Any Value {
       get { return value_; }
       set {
@@ -1393,12 +1252,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Option);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Option other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1408,26 +1265,20 @@
       }
       if (Name != other.Name) return false;
       if (!object.Equals(Value, other.Value)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (value_ != null) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Name.Length != 0) {
         output.WriteRawTag(10);
@@ -1437,12 +1288,8 @@
         output.WriteRawTag(18);
         output.WriteMessage(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Name.Length != 0) {
@@ -1451,13 +1298,9 @@
       if (value_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Option other) {
       if (other == null) {
         return;
@@ -1471,16 +1314,14 @@
         }
         Value.MergeFrom(other.Value);
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Name = input.ReadString();
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs
index 25a65aa..c8867d0 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs
@@ -1,7 +1,5 @@
-// <auto-generated>
-//     Generated by the protocol buffer compiler.  DO NOT EDIT!
-//     source: google/protobuf/wrappers.proto
-// </auto-generated>
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/wrappers.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -12,6 +10,7 @@
 namespace Google.Protobuf.WellKnownTypes {
 
   /// <summary>Holder for reflection information generated from google/protobuf/wrappers.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public static partial class WrappersReflection {
 
     #region Descriptor
@@ -30,10 +29,10 @@
             "KAMiHAoLVUludDY0VmFsdWUSDQoFdmFsdWUYASABKAQiGwoKSW50MzJWYWx1",
             "ZRINCgV2YWx1ZRgBIAEoBSIcCgtVSW50MzJWYWx1ZRINCgV2YWx1ZRgBIAEo",
             "DSIaCglCb29sVmFsdWUSDQoFdmFsdWUYASABKAgiHAoLU3RyaW5nVmFsdWUS",
-            "DQoFdmFsdWUYASABKAkiGwoKQnl0ZXNWYWx1ZRINCgV2YWx1ZRgBIAEoDEJ8",
+            "DQoFdmFsdWUYASABKAkiGwoKQnl0ZXNWYWx1ZRINCgV2YWx1ZRgBIAEoDEJ/",
             "ChNjb20uZ29vZ2xlLnByb3RvYnVmQg1XcmFwcGVyc1Byb3RvUAFaKmdpdGh1",
-            "Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy93cmFwcGVyc/gBAaICA0dQ",
-            "QqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8z"));
+            "Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3B0eXBlcy93cmFwcGVyc6ABAfgBAaIC",
+            "A0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8z"));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
@@ -53,40 +52,33 @@
   }
   #region Messages
   /// <summary>
-  /// Wrapper message for `double`.
+  ///  Wrapper message for `double`.
   ///
-  /// The JSON representation for `DoubleValue` is JSON number.
+  ///  The JSON representation for `DoubleValue` is JSON number.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class DoubleValue : pb::IMessage<DoubleValue> {
     private static readonly pb::MessageParser<DoubleValue> _parser = new pb::MessageParser<DoubleValue>(() => new DoubleValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<DoubleValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[0]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DoubleValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DoubleValue(DoubleValue other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public DoubleValue Clone() {
       return new DoubleValue(this);
     }
@@ -95,9 +87,8 @@
     public const int ValueFieldNumber = 1;
     private double value_;
     /// <summary>
-    /// The double value.
+    ///  The double value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public double Value {
       get { return value_; }
       set {
@@ -105,12 +96,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as DoubleValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(DoubleValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -118,49 +107,35 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(Value, other.Value)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      if (Value != other.Value) return false;
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (Value != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(Value);
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
+      if (Value != 0D) hash ^= Value.GetHashCode();
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0D) {
         output.WriteRawTag(9);
         output.WriteDouble(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0D) {
         size += 1 + 8;
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(DoubleValue other) {
       if (other == null) {
         return;
@@ -168,16 +143,14 @@
       if (other.Value != 0D) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 9: {
             Value = input.ReadDouble();
@@ -190,40 +163,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `float`.
+  ///  Wrapper message for `float`.
   ///
-  /// The JSON representation for `FloatValue` is JSON number.
+  ///  The JSON representation for `FloatValue` is JSON number.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class FloatValue : pb::IMessage<FloatValue> {
     private static readonly pb::MessageParser<FloatValue> _parser = new pb::MessageParser<FloatValue>(() => new FloatValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<FloatValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[1]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FloatValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FloatValue(FloatValue other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FloatValue Clone() {
       return new FloatValue(this);
     }
@@ -232,9 +198,8 @@
     public const int ValueFieldNumber = 1;
     private float value_;
     /// <summary>
-    /// The float value.
+    ///  The float value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public float Value {
       get { return value_; }
       set {
@@ -242,12 +207,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FloatValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(FloatValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -255,49 +218,35 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
-      if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(Value, other.Value)) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      if (Value != other.Value) return false;
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
-      if (Value != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(Value);
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
+      if (Value != 0F) hash ^= Value.GetHashCode();
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0F) {
         output.WriteRawTag(13);
         output.WriteFloat(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0F) {
         size += 1 + 4;
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(FloatValue other) {
       if (other == null) {
         return;
@@ -305,16 +254,14 @@
       if (other.Value != 0F) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 13: {
             Value = input.ReadFloat();
@@ -327,40 +274,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `int64`.
+  ///  Wrapper message for `int64`.
   ///
-  /// The JSON representation for `Int64Value` is JSON string.
+  ///  The JSON representation for `Int64Value` is JSON string.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Int64Value : pb::IMessage<Int64Value> {
     private static readonly pb::MessageParser<Int64Value> _parser = new pb::MessageParser<Int64Value>(() => new Int64Value());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Int64Value> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[2]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int64Value() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int64Value(Int64Value other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int64Value Clone() {
       return new Int64Value(this);
     }
@@ -369,9 +309,8 @@
     public const int ValueFieldNumber = 1;
     private long value_;
     /// <summary>
-    /// The int64 value.
+    ///  The int64 value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public long Value {
       get { return value_; }
       set {
@@ -379,12 +318,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Int64Value);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Int64Value other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -393,48 +330,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value != 0L) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0L) {
         output.WriteRawTag(8);
         output.WriteInt64(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0L) {
         size += 1 + pb::CodedOutputStream.ComputeInt64Size(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Int64Value other) {
       if (other == null) {
         return;
@@ -442,16 +365,14 @@
       if (other.Value != 0L) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Value = input.ReadInt64();
@@ -464,40 +385,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `uint64`.
+  ///  Wrapper message for `uint64`.
   ///
-  /// The JSON representation for `UInt64Value` is JSON string.
+  ///  The JSON representation for `UInt64Value` is JSON string.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class UInt64Value : pb::IMessage<UInt64Value> {
     private static readonly pb::MessageParser<UInt64Value> _parser = new pb::MessageParser<UInt64Value>(() => new UInt64Value());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<UInt64Value> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[3]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UInt64Value() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UInt64Value(UInt64Value other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UInt64Value Clone() {
       return new UInt64Value(this);
     }
@@ -506,9 +420,8 @@
     public const int ValueFieldNumber = 1;
     private ulong value_;
     /// <summary>
-    /// The uint64 value.
+    ///  The uint64 value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public ulong Value {
       get { return value_; }
       set {
@@ -516,12 +429,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as UInt64Value);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(UInt64Value other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -530,48 +441,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value != 0UL) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0UL) {
         output.WriteRawTag(8);
         output.WriteUInt64(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0UL) {
         size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(UInt64Value other) {
       if (other == null) {
         return;
@@ -579,16 +476,14 @@
       if (other.Value != 0UL) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Value = input.ReadUInt64();
@@ -601,40 +496,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `int32`.
+  ///  Wrapper message for `int32`.
   ///
-  /// The JSON representation for `Int32Value` is JSON number.
+  ///  The JSON representation for `Int32Value` is JSON number.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class Int32Value : pb::IMessage<Int32Value> {
     private static readonly pb::MessageParser<Int32Value> _parser = new pb::MessageParser<Int32Value>(() => new Int32Value());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<Int32Value> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[4]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int32Value() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int32Value(Int32Value other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public Int32Value Clone() {
       return new Int32Value(this);
     }
@@ -643,9 +531,8 @@
     public const int ValueFieldNumber = 1;
     private int value_;
     /// <summary>
-    /// The int32 value.
+    ///  The int32 value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Value {
       get { return value_; }
       set {
@@ -653,12 +540,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as Int32Value);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(Int32Value other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -667,48 +552,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value != 0) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0) {
         output.WriteRawTag(8);
         output.WriteInt32(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(Int32Value other) {
       if (other == null) {
         return;
@@ -716,16 +587,14 @@
       if (other.Value != 0) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Value = input.ReadInt32();
@@ -738,40 +607,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `uint32`.
+  ///  Wrapper message for `uint32`.
   ///
-  /// The JSON representation for `UInt32Value` is JSON number.
+  ///  The JSON representation for `UInt32Value` is JSON number.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class UInt32Value : pb::IMessage<UInt32Value> {
     private static readonly pb::MessageParser<UInt32Value> _parser = new pb::MessageParser<UInt32Value>(() => new UInt32Value());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<UInt32Value> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[5]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UInt32Value() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UInt32Value(UInt32Value other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public UInt32Value Clone() {
       return new UInt32Value(this);
     }
@@ -780,9 +642,8 @@
     public const int ValueFieldNumber = 1;
     private uint value_;
     /// <summary>
-    /// The uint32 value.
+    ///  The uint32 value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public uint Value {
       get { return value_; }
       set {
@@ -790,12 +651,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as UInt32Value);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(UInt32Value other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -804,48 +663,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value != 0) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != 0) {
         output.WriteRawTag(8);
         output.WriteUInt32(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != 0) {
         size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(UInt32Value other) {
       if (other == null) {
         return;
@@ -853,16 +698,14 @@
       if (other.Value != 0) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Value = input.ReadUInt32();
@@ -875,40 +718,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `bool`.
+  ///  Wrapper message for `bool`.
   ///
-  /// The JSON representation for `BoolValue` is JSON `true` and `false`.
+  ///  The JSON representation for `BoolValue` is JSON `true` and `false`.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class BoolValue : pb::IMessage<BoolValue> {
     private static readonly pb::MessageParser<BoolValue> _parser = new pb::MessageParser<BoolValue>(() => new BoolValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<BoolValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[6]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BoolValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BoolValue(BoolValue other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BoolValue Clone() {
       return new BoolValue(this);
     }
@@ -917,9 +753,8 @@
     public const int ValueFieldNumber = 1;
     private bool value_;
     /// <summary>
-    /// The bool value.
+    ///  The bool value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Value {
       get { return value_; }
       set {
@@ -927,12 +762,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as BoolValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(BoolValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -941,48 +774,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value != false) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value != false) {
         output.WriteRawTag(8);
         output.WriteBool(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value != false) {
         size += 1 + 1;
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(BoolValue other) {
       if (other == null) {
         return;
@@ -990,16 +809,14 @@
       if (other.Value != false) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 8: {
             Value = input.ReadBool();
@@ -1012,40 +829,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `string`.
+  ///  Wrapper message for `string`.
   ///
-  /// The JSON representation for `StringValue` is JSON string.
+  ///  The JSON representation for `StringValue` is JSON string.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class StringValue : pb::IMessage<StringValue> {
     private static readonly pb::MessageParser<StringValue> _parser = new pb::MessageParser<StringValue>(() => new StringValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<StringValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[7]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public StringValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public StringValue(StringValue other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public StringValue Clone() {
       return new StringValue(this);
     }
@@ -1054,9 +864,8 @@
     public const int ValueFieldNumber = 1;
     private string value_ = "";
     /// <summary>
-    /// The string value.
+    ///  The string value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public string Value {
       get { return value_; }
       set {
@@ -1064,12 +873,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as StringValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(StringValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1078,48 +885,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value.Length != 0) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value.Length != 0) {
         output.WriteRawTag(10);
         output.WriteString(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(StringValue other) {
       if (other == null) {
         return;
@@ -1127,16 +920,14 @@
       if (other.Value.Length != 0) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Value = input.ReadString();
@@ -1149,40 +940,33 @@
   }
 
   /// <summary>
-  /// Wrapper message for `bytes`.
+  ///  Wrapper message for `bytes`.
   ///
-  /// The JSON representation for `BytesValue` is JSON string.
+  ///  The JSON representation for `BytesValue` is JSON string.
   /// </summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class BytesValue : pb::IMessage<BytesValue> {
     private static readonly pb::MessageParser<BytesValue> _parser = new pb::MessageParser<BytesValue>(() => new BytesValue());
-    private pb::UnknownFieldSet _unknownFields;
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pb::MessageParser<BytesValue> Parser { get { return _parser; } }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public static pbr::MessageDescriptor Descriptor {
       get { return global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor.MessageTypes[8]; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     pbr::MessageDescriptor pb::IMessage.Descriptor {
       get { return Descriptor; }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BytesValue() {
       OnConstruction();
     }
 
     partial void OnConstruction();
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BytesValue(BytesValue other) : this() {
       value_ = other.value_;
-      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public BytesValue Clone() {
       return new BytesValue(this);
     }
@@ -1191,9 +975,8 @@
     public const int ValueFieldNumber = 1;
     private pb::ByteString value_ = pb::ByteString.Empty;
     /// <summary>
-    /// The bytes value.
+    ///  The bytes value.
     /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pb::ByteString Value {
       get { return value_; }
       set {
@@ -1201,12 +984,10 @@
       }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as BytesValue);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public bool Equals(BytesValue other) {
       if (ReferenceEquals(other, null)) {
         return false;
@@ -1215,48 +996,34 @@
         return true;
       }
       if (Value != other.Value) return false;
-      return Equals(_unknownFields, other._unknownFields);
+      return true;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
       if (Value.Length != 0) hash ^= Value.GetHashCode();
-      if (_unknownFields != null) {
-        hash ^= _unknownFields.GetHashCode();
-      }
       return hash;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override string ToString() {
       return pb::JsonFormatter.ToDiagnosticString(this);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
       if (Value.Length != 0) {
         output.WriteRawTag(10);
         output.WriteBytes(Value);
       }
-      if (_unknownFields != null) {
-        _unknownFields.WriteTo(output);
-      }
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
       if (Value.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value);
       }
-      if (_unknownFields != null) {
-        size += _unknownFields.CalculateSize();
-      }
       return size;
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(BytesValue other) {
       if (other == null) {
         return;
@@ -1264,16 +1031,14 @@
       if (other.Value.Length != 0) {
         Value = other.Value;
       }
-      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
     }
 
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void MergeFrom(pb::CodedInputStream input) {
       uint tag;
       while ((tag = input.ReadTag()) != 0) {
         switch(tag) {
           default:
-            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            input.SkipLastField();
             break;
           case 10: {
             Value = input.ReadBytes();
diff --git a/csharp/src/Google.Protobuf/packages.config b/csharp/src/Google.Protobuf/packages.config
new file mode 100644
index 0000000..40b8fd9
--- /dev/null
+++ b/csharp/src/Google.Protobuf/packages.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NuSpec.ReferenceGenerator" version="1.4.1" targetFramework="portable45-net45+win8+wp8+wpa81" developmentDependency="true" />
+</packages>
\ No newline at end of file
diff --git a/csharp/src/packages/repositories.config b/csharp/src/packages/repositories.config
new file mode 100644
index 0000000..7037941
--- /dev/null
+++ b/csharp/src/packages/repositories.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<repositories>
+  <repository path="..\Google.Protobuf.Test\packages.config" />
+</repositories>
\ No newline at end of file
diff --git a/docs/swift/DesignDoc.md b/docs/swift/DesignDoc.md
new file mode 100644
index 0000000..364a4d3
--- /dev/null
+++ b/docs/swift/DesignDoc.md
@@ -0,0 +1,674 @@
+# Protocol Buffers in Swift
+
+## Objective
+
+This document describes the user-facing API and internal implementation of
+proto2 and proto3 messages in Apple’s Swift programming language.
+
+One of the key goals of protobufs is to provide idiomatic APIs for each
+language. In that vein, **interoperability with Objective-C is a non-goal of
+this proposal.** Protobuf users who need to pass messages between Objective-C
+and Swift code in the same application should use the existing Objective-C proto
+library. The goal of the effort described here is to provide an API for protobuf
+messages that uses features specific to Swift—optional types, algebraic
+enumerated types, value types, and so forth—in a natural way that will delight,
+rather than surprise, users of the language.
+
+## Naming
+
+*   By convention, both typical protobuf message names and Swift structs/classes
+    are `UpperCamelCase`, so for most messages, the name of a message can be the
+    same as the name of its generated type. (However, see the discussion below
+    about prefixes under [Packages](#packages).)
+
+*   Enum cases in protobufs typically are `UPPERCASE_WITH_UNDERSCORES`, whereas
+    in Swift they are `lowerCamelCase` (as of the Swift 3 API design
+    guidelines). We will transform the names to match Swift convention, using
+    a whitelist similar to the Objective-C compiler plugin to handle commonly
+    used acronyms.
+
+*   Typical fields in proto messages are `lowercase_with_underscores`, while in
+    Swift they are `lowerCamelCase`. We will transform the names to match
+    Swift convention by removing the underscores and uppercasing the subsequent
+    letter.
+
+## Swift reserved words
+
+Swift has a large set of reserved words—some always reserved and some
+contextually reserved (that is, they can be used as identifiers in contexts
+where they would not be confused). As of Swift 2.2, the set of always-reserved
+words is:
+
+```
+_, #available, #column, #else, #elseif, #endif, #file, #function, #if, #line,
+#selector, as, associatedtype, break, case, catch, class, continue, default,
+defer, deinit, do, dynamicType, else, enum, extension, fallthrough, false, for,
+func, guard, if, import, in, init, inout, internal, is, let, nil, operator,
+private, protocol, public, repeat, rethrows, return, self, Self, static,
+struct, subscript, super, switch, throw, throws, true, try, typealias, var,
+where, while
+```
+
+The set of contextually reserved words is:
+
+```
+associativity, convenience, dynamic, didSet, final, get, infix, indirect,
+lazy, left, mutating, none, nonmutating, optional, override, postfix,
+precedence, prefix, Protocol, required, right, set, Type, unowned, weak,
+willSet
+```
+
+It is possible to use any reserved word as an identifier by escaping it with
+backticks (for example, ``let `class` = 5``). Other name-mangling schemes would
+require us to transform the names themselves (for example, by appending an
+underscore), which requires us to then ensure that the new name does not collide
+with something else in the same namespace.
+
+While the backtick feature may not be widely known by all Swift developers, a
+small amount of user education can address this and it seems like the best
+approach. We can unconditionally surround all property names with backticks to
+simplify generation.
+
+Some remapping will still be required, though, to avoid collisions between
+generated properties and the names of methods and properties defined in the base
+protocol/implementation of messages.
+
+# Features of Protocol Buffers
+
+This section describes how the features of the protocol buffer syntaxes (proto2
+and proto3) map to features in Swift—what the code generated from a proto will
+look like, and how it will be implemented in the underlying library.
+
+## Packages
+
+Modules are the main form of namespacing in Swift, but they are not declared
+using syntactic constructs like namespaces in C++ or packages in Java. Instead,
+they are tied to build targets in Xcode (or, in the future with open-source
+Swift, declarations in a Swift Package Manager manifest). They also do not
+easily support nesting submodules (Clang module maps support this, but pure
+Swift does not yet provide a way to define submodules).
+
+We will generate types with fully-qualified underscore-delimited names. For
+example, a message `Baz` in package `foo.bar` would generate a struct named
+`Foo_Bar_Baz`. For each fully-qualified proto message, there will be exactly one
+unique type symbol emitted in the generated binary.
+
+Users are likely to balk at the ugliness of underscore-delimited names for every
+generated type. To improve upon this situation, we will add a new string file
+level option, `swift_package_typealias`, that can be added to `.proto` files.
+When present, this will cause `typealias`es to be added to the generated Swift
+messages that replace the package name prefix with the provided string. For
+example, the following `.proto` file:
+
+```protobuf
+option swift_package_typealias = "FBP";
+package foo.bar;
+
+message Baz {
+  // Message fields
+}
+```
+
+would generate the following Swift source:
+
+```swift
+public struct Foo_Bar_Baz {
+  // Message fields and other methods
+}
+
+typealias FBPBaz = Foo_Bar_Baz
+```
+
+It should be noted that this type alias is recorded in the generated
+`.swiftmodule` so that code importing the module can refer to it, but it does
+not cause a new symbol to be generated in the compiled binary (i.e., we do not
+risk compiled size bloat by adding `typealias`es for every type).
+
+Other strategies to handle packages that were considered and rejected can be
+found in [Appendix A](#appendix-a-rejected-strategies-to-handle-packages).
+
+## Messages
+
+Proto messages are natural value types and we will generate messages as structs
+instead of classes. Users will benefit from Swift’s built-in behavior with
+regard to mutability. We will define a `ProtoMessage` protocol that defines the
+common methods and properties for all messages (such as serialization) and also
+lets users treat messages polymorphically. Any shared method implementations
+that do not differ between individual messages can be implemented in a protocol
+extension.
+
+The backing storage itself for fields of a message will be managed by a
+`ProtoFieldStorage` type that uses an internal dictionary keyed by field number,
+and whose values are the value of the field with that number (up-cast to Swift’s
+`Any` type). This class will provide type-safe getters and setters so that
+generated messages can manipulate this storage, and core serialization logic
+will live here as well. Furthermore, factoring the storage out into a separate
+type, rather than inlining the fields as stored properties in the message
+itself, lets us implement copy-on-write efficiently to support passing around
+large messages. (Furthermore, because the messages themselves are value types,
+inlining fields is not possible if the fields are submessages of the same type,
+or a type that eventually includes a submessage of the same type.)
+
+### Required fields (proto2 only)
+
+Required fields in proto2 messages seem like they could be naturally represented
+by non-optional properties in Swift, but this presents some problems/concerns.
+
+Serialization APIs permit partial serialization, which allows required fields to
+remain unset. Furthermore, other language APIs still provide `has*` and `clear*`
+methods for required fields, and knowing whether a property has a value when the
+message is in memory is still useful.
+
+For example, an e-mail draft message may have the “to” address required on the
+wire, but when the user constructs it in memory, it doesn’t make sense to force
+a value until they provide one. We only want to force a value to be present when
+the message is serialized to the wire. Using non-optional properties prevents
+this use case, and makes client usage awkward because the user would be forced
+to select a sentinel or placeholder value for any required fields at the time
+the message was created.
+
+### Default values
+
+In proto2, fields can have a default value specified that may be a value other
+than the default value for its corresponding language type (for example, a
+default value of 5 instead of 0 for an integer). When reading a field that is
+not explicitly set, the user expects to get that value. This makes Swift
+optionals (i.e., `Foo?`) unsuitable for fields in general. Unfortunately, we
+cannot implement our own “enhanced optional” type without severely complicating
+usage (Swift’s use of type inference and its lack of implicit conversions would
+require manual unwrapping of every property value).
+
+Instead, we can use **implicitly unwrapped optionals.** For example, a property
+generated for a field of type `int32` would have Swift type `Int32!`. These
+properties would behave with the following characteristics, which mirror the
+nil-resettable properties used elsewhere in Apple’s SDKs (for example,
+`UIView.tintColor`):
+
+*   Assigning a non-nil value to a property sets the field to that value.
+*   Assigning nil to a property clears the field (its internal representation is
+    nilled out).
+*   Reading the value of a property returns its value if it is set, or returns
+    its default value if it is not set. Reading a property never returns nil.
+
+The final point in the list above implies that the optional cannot be checked to
+determine if the field is set to a value other than its default: it will never
+be nil. Instead, we must provide `has*` methods for each field to allow the user
+to check this. These methods will be public in proto2. In proto3, these methods
+will be private (if generated at all), since the user can test the returned
+value against the zero value for that type.
+
+### Autocreation of nested messages
+
+For convenience, dotting into an unset field representing a nested message will
+return an instance of that message with default values. As in the Objective-C
+implementation, this does not actually cause the field to be set until the
+returned message is mutated. Fortunately, thanks to the way mutability of value
+types is implemented in Swift, the language automatically handles the
+reassignment-on-mutation for us. A static singleton instance containing default
+values can be associated with each message that can be returned when reading, so
+copies are only made by the Swift runtime when mutation occurs. For example,
+given the following proto:
+
+```protobuf
+message Node {
+  Node child = 1;
+  string value = 2 [default = "foo"];
+}
+```
+
+The following Swift code would act as commented, where setting deeply nested
+properties causes the copies and mutations to occur as the assignment statement
+is unwound:
+
+```swift
+var node = Node()
+
+let s = node.child.child.value
+// 1. node.child returns the "default Node".
+// 2. Reading .child on the result of (1) returns the same default Node.
+// 3. Reading .value on the result of (2) returns the default value "foo".
+
+node.child.child.value = "bar"
+// 4. Setting .value on the default Node causes a copy to be made and sets
+//    the property on that copy. Subsequently, the language updates the
+//    value of "node.child.child" to point to that copy.
+// 5. Updating "node.child.child" in (4) requires another copy, because
+//    "node.child" was also the instance of the default node. The copy is
+//    assigned back to "node.child".
+// 6. Setting "node.child" in (5) is a simple value reassignment, since
+//    "node" is a mutable var.
+```
+
+In other words, the generated messages do not internally have to manage parental
+relationships to backfill the appropriate properties on mutation. Swift provides
+this for free.
+
+## Scalar value fields
+
+Proto scalar value fields will map to Swift types in the following way:
+
+.proto Type | Swift Type
+----------- | -------------------
+`double`    | `Double`
+`float`     | `Float`
+`int32`     | `Int32`
+`int64`     | `Int64`
+`uint32`    | `UInt32`
+`uint64`    | `UInt64`
+`sint32`    | `Int32`
+`sint64`    | `Int64`
+`fixed32`   | `UInt32`
+`fixed64`   | `UInt64`
+`sfixed32`  | `Int32`
+`sfixed64`  | `Int64`
+`bool`      | `Bool`
+`string`    | `String`
+`bytes`     | `Foundation.NSData`
+
+The proto spec defines a number of integral types that map to the same Swift
+type; for example, `intXX`, `sintXX`, and `sfixedXX` are all signed integers,
+and `uintXX` and `fixedXX` are both unsigned integers. No other language
+implementation distinguishes these further, so we do not do so either. The
+rationale is that the various types only serve to distinguish how the value is
+**encoded on the wire**; once loaded in memory, the user is not concerned about
+these variations.
+
+Swift’s lack of implicit conversions among types will make it slightly annoying
+to use these types in a context expecting an `Int`, or vice-versa, but since
+this is a data-interchange format with explicitly-sized fields, we should not
+hide that information from the user. Users will have to explicitly write
+`Int(message.myField)`, for example.
+
+## Embedded message fields
+
+Embedded message fields can be represented using an optional variable of the
+generated message type. Thus, the message
+
+```protobuf
+message Foo {
+  Bar bar = 1;
+}
+```
+
+would be represented in Swift as
+
+```swift
+public struct Foo: ProtoMessage {
+  public var bar: Bar! {
+    get { ... }
+    set { ... }
+  }
+}
+```
+
+If the user explicitly sets `bar` to nil, or if it was never set when read from
+the wire, retrieving the value of `bar` would return a default, statically
+allocated instance of `Bar` containing default values for its fields. This
+achieves the desired behavior for default values in the same way that scalar
+fields are designed, and also allows users to deep-drill into complex object
+graphs to get or set fields without checking for nil at each step.
+
+## Enum fields
+
+The design and implementation of enum fields will differ somewhat drastically
+depending on whether the message being generated is a proto2 or proto3 message.
+
+### proto2 enums
+
+For proto2, we do not need to be concerned about unknown enum values, so we can
+use the simple raw-value enum syntax provided by Swift. So the following enum in
+proto2:
+
+```protobuf
+enum ContentType {
+  TEXT = 0;
+  IMAGE = 1;
+}
+```
+
+would become this Swift enum:
+
+```swift
+public enum ContentType: Int32, NilLiteralConvertible {
+  case text = 0
+  case image = 1
+
+  public init(nilLiteral: ()) {
+    self = .text
+  }
+}
+```
+
+See below for the discussion about `NilLiteralConvertible`.
+
+### proto3 enums
+
+For proto3, we need to be able to preserve unknown enum values that may come
+across the wire so that they can be written back if unmodified. We can
+accomplish this in Swift by using a case with an associated value for unknowns.
+So the following enum in proto3:
+
+```protobuf
+enum ContentType {
+  TEXT = 0;
+  IMAGE = 1;
+}
+```
+
+would become this Swift enum:
+
+```swift
+public enum ContentType: RawRepresentable, NilLiteralConvertible {
+  case text
+  case image
+  case UNKNOWN_VALUE(Int32)
+
+  public typealias RawValue = Int32
+
+  public init(nilLiteral: ()) {
+    self = .text
+  }
+
+  public init(rawValue: RawValue) {
+    switch rawValue {
+      case 0: self = .text
+      case 1: self = .image
+      default: self = .UNKNOWN_VALUE(rawValue)
+  }
+
+  public var rawValue: RawValue {
+    switch self {
+      case .text: return 0
+      case .image: return 1
+      case .UNKNOWN_VALUE(let value): return value
+    }
+  }
+}
+```
+
+Note that the use of a parameterized case prevents us from inheriting from the
+raw `Int32` type; Swift does not allow an enum with a raw type to have cases
+with arguments. Instead, we must implement the raw value initializer and
+computed property manually. The `UNKNOWN_VALUE` case is explicitly chosen to be
+"ugly" so that it stands out and does not conflict with other possible case
+names.
+
+Using this approach, proto3 consumers must always have a default case or handle
+the `.UNKNOWN_VALUE` case to satisfy case exhaustion in a switch statement; the
+Swift compiler considers it an error if switch statements are not exhaustive.
+
+### NilLiteralConvertible conformance
+
+This is required to clean up the usage of enum-typed properties in switch
+statements. Unlike other field types, enum properties cannot be
+implicitly-unwrapped optionals without requiring that uses in switch statements
+be explicitly unwrapped. For example, if we consider a message with the enum
+above, this usage will fail to compile:
+
+```swift
+// Without NilLiteralConvertible conformance on ContentType
+public struct SomeMessage: ProtoMessage {
+  public var contentType: ContentType! { ... }
+}
+
+// ERROR: no case named text or image
+switch someMessage.contentType {
+  case .text: { ... }
+  case .image: { ... }
+}
+```
+
+Even though our implementation guarantees that `contentType` will never be nil,
+if it is an optional type, its cases would be `some` and `none`, not the cases
+of the underlying enum type. In order to use it in this context, the user must
+write `someMessage.contentType!` in their switch statement.
+
+Making the enum itself `NilLiteralConvertible` permits us to make the property
+non-optional, so the user can still set it to nil to clear it (i.e., reset it to
+its default value), while eliminating the need to explicitly unwrap it in a
+switch statement.
+
+```swift
+// With NilLiteralConvertible conformance on ContentType
+public struct SomeMessage: ProtoMessage {
+  // Note that the property type is no longer optional
+  public var contentType: ContentType { ... }
+}
+
+// OK: Compiles and runs as expected
+switch someMessage.contentType {
+  case .text: { ... }
+  case .image: { ... }
+}
+
+// The enum can be reset to its default value this way
+someMessage.contentType = nil
+```
+
+One minor oddity with this approach is that nil will be auto-converted to the
+default value of the enum in any context, not just field assignment. In other
+words, this is valid:
+
+```swift
+func foo(contentType: ContentType) { ... }
+foo(nil) // Inside foo, contentType == .text
+```
+
+That being said, the advantage of being able to simultaneously support
+nil-resettability and switch-without-unwrapping outweighs this side effect,
+especially if appropriately documented. It is our hope that a new form of
+resettable properties will be added to Swift that eliminates this inconsistency.
+Some community members have already drafted or sent proposals for review that
+would benefit our designs:
+
+*   [SE-0030: Property Behaviors]
+    (https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md)
+*   [Drafted: Resettable Properties]
+    (https://github.com/patters/swift-evolution/blob/master/proposals/0000-resettable-properties.md)
+
+### Enum aliases
+
+The `allow_alias` option in protobuf slightly complicates the use of Swift enums
+to represent that type, because raw values of cases in an enum must be unique.
+Swift lets us define static variables in an enum that alias actual cases. For
+example, the following protobuf enum:
+
+```protobuf
+enum Foo {
+  option allow_alias = true;
+  BAR = 0;
+  BAZ = 0;
+}
+```
+
+will be represented in Swift as:
+
+```swift
+public enum Foo: Int32, NilLiteralConvertible {
+  case bar = 0
+  static public let baz = bar
+
+  // ... etc.
+}
+
+// Can still use .baz shorthand to reference the alias in contexts
+// where the type is inferred
+```
+
+That is, we use the first name as the actual case and use static variables for
+the other aliases. One drawback to this approach is that the static aliases
+cannot be used as cases in a switch statement (the compiler emits the error
+*“Enum case ‘baz’ not found in type ‘Foo’”*). However, in our own code bases,
+there are only a few places where enum aliases are not mere renamings of an
+older value, but they also don’t appear to be the type of value that one would
+expect to switch on (for example, a group of named constants representing
+metrics rather than a set of options), so this restriction is not significant.
+
+This strategy also implies that changing the name of an enum and adding the old
+name as an alias below the new name will be a breaking change in the generated
+Swift code.
+
+## Oneof types
+
+The `oneof` feature represents a “variant/union” data type that maps nicely to
+Swift enums with associated values (algebraic types). These fields can also be
+accessed independently though, and, specifically in the case of proto2, it’s
+reasonable to expect access to default values when accessing a field that is not
+explicitly set.
+
+Taking all this into account, we can represent a `oneof` in Swift with two sets
+of constructs:
+
+*   Properties in the message that correspond to the `oneof` fields.
+*   A nested enum named after the `oneof` and which provides the corresponding
+    field values as case arguments.
+
+This approach fulfills the needs of proto consumers by providing a
+Swift-idiomatic way of simultaneously checking which field is set and accessing
+its value, providing individual properties to access the default values
+(important for proto2), and safely allows a field to be moved into a `oneof`
+without breaking clients.
+
+Consider the following proto:
+
+```protobuf
+message MyMessage {
+  oneof record {
+    string name = 1 [default = "unnamed"];
+    int32 id_number = 2 [default = 0];
+  }
+}
+```
+
+In Swift, we would generate an enum, a property for that enum, and properties
+for the fields themselves:
+
+```swift
+public struct MyMessage: ProtoMessage {
+  public enum Record: NilLiteralConvertible {
+    case name(String)
+    case idNumber(Int32)
+    case NOT_SET
+
+    public init(nilLiteral: ()) { self = .NOT_SET }
+  }
+
+  // This is the "Swifty" way of accessing the value
+  public var record: Record { ... }
+
+  // Direct access to the underlying fields
+  public var name: String! { ... }
+  public var idNumber: Int32! { ... }
+}
+```
+
+This makes both usage patterns possible:
+
+```swift
+// Usage 1: Case-based dispatch
+switch message.record {
+  case .name(let name):
+    // Do something with name if it was explicitly set
+  case .idNumber(let id):
+    // Do something with id_number if it was explicitly set
+  case .NOT_SET:
+    // Do something if it’s not set
+}
+
+// Usage 2: Direct access for default value fallback
+// Sets the label text to the name if it was explicitly set, or to
+// "unnamed" (the default value for the field) if id_number was set
+// instead
+let myLabel = UILabel()
+myLabel.text = message.name
+```
+
+As with proto enums, the generated `oneof` enum conforms to
+`NilLiteralConvertible` to avoid switch statement issues. Setting the property
+to nil will clear it (i.e., reset it to `NOT_SET`).
+
+## Unknown Fields (proto2 only)
+
+To be written.
+
+## Extensions (proto2 only)
+
+To be written.
+
+## Reflection and Descriptors
+
+We will not include reflection or descriptors in the first version of the Swift
+library. The use cases for reflection on mobile are not as strong and the static
+data to represent the descriptors would add bloat when we wish to keep the code
+size small.
+
+In the future, we will investigate whether they can be included as extensions
+which might be able to be excluded from a build and/or automatically dead
+stripped by the compiler if they are not used.
+
+## Appendix A: Rejected strategies to handle packages
+
+### Each package is its own Swift module
+
+Each proto package could be declared as its own Swift module, replacing dots
+with underscores (e.g., package `foo.bar` becomes module `Foo_Bar`). Then, users
+would simply import modules containing whatever proto modules they want to use
+and refer to the generated types by their short names.
+
+**This solution is simply not possible, however.** Swift modules cannot
+circularly reference each other, but there is no restriction against proto
+packages doing so. Circular imports are forbidden (e.g., `foo.proto` importing
+`bar.proto` importing `foo.proto`), but nothing prevents package `foo` from
+using a type in package `bar` which uses a different type in package `foo`, as
+long as there is no import cycle. If these packages were generated as Swift
+modules, then `Foo` would contain an `import Bar` statement and `Bar` would
+contain an `import Foo` statement, and there is no way to compile this.
+
+### Ad hoc namespacing with structs
+
+We can “fake” namespaces in Swift by declaring empty structs with private
+initializers. Since modules are constructed based on compiler arguments, not by
+syntactic constructs, and because there is no pure Swift way to define
+submodules (even though Clang module maps support this), there is no
+source-drive way to group generated code into namespaces aside from this
+approach.
+
+Types can be added to those intermediate package structs using Swift extensions.
+For example, a message `Baz` in package `foo.bar` could be represented in Swift
+as follows:
+
+```swift
+public struct Foo {
+  private init() {}
+}
+
+public extension Foo {
+  public struct Bar {
+    private init() {}
+  }
+}
+
+public extension Foo.Bar {
+  public struct Baz {
+    // Message fields and other methods
+  }
+}
+
+let baz = Foo.Bar.Baz()
+```
+
+Each of these constructs would actually be defined in a separate file; Swift
+lets us keep them separate and add multiple structs to a single “namespace”
+through extensions.
+
+Unfortunately, these intermediate structs generate symbols of their own
+(metatype information in the data segment). This becomes problematic if multiple
+build targets contain Swift sources generated from different messages in the
+same package. At link time, these symbols would collide, resulting in multiple
+definition errors.
+
+This approach also has the disadvantage that there is no automatic “short” way
+to refer to the generated messages at the deepest nesting levels; since this use
+of structs is a hack around the lack of namespaces, there is no equivalent to
+import (Java) or using (C++) to simplify this. Users would have to declare type
+aliases to make this cleaner, or we would have to generate them for users.
diff --git a/docs/third_party.md b/docs/third_party.md
index b20d4cb..69ed6a3 100644
--- a/docs/third_party.md
+++ b/docs/third_party.md
@@ -10,7 +10,6 @@
 * Action Script: http://code.google.com/p/protobuf-actionscript3/
 * Action Script: https://code.google.com/p/protoc-gen-as3/
 * Action Script: https://github.com/matrix3d/JProtoc
-* Action Script: https://github.com/zhongfq/protobuf-as3/
 * C: https://github.com/protobuf-c/protobuf-c
 * C: http://koti.kapsi.fi/jpa/nanopb/
 * C: https://github.com/cloudwu/pbc/
@@ -23,7 +22,7 @@
 * C#: https://silentorbit.com/protobuf/
 * C#/.NET/WCF/VB: http://code.google.com/p/protobuf-net/
 * Clojure: http://github.com/ninjudd/clojure-protobuf
-* Common Lisp: http://github.com/ndantam/s-protobuf
+* Common Lisp: http://www.prism.gatech.edu/~ndantam3/docs/s-protobuf/
 * Common Lisp: http://github.com/brown/protobuf
 * D: https://github.com/msoucy/dproto
 * D: http://256.makerslocal.org/wiki/index.php/ProtocolBuffer
@@ -32,24 +31,20 @@
 * Delphi: http://sourceforge.net/projects/protobuf-delphi/
 * Delphi: http://fundementals.sourceforge.net/dl.html
 * Elixir: https://github.com/jeremyong/exprotoc
-* Elixir: https://github.com/tony612/protobuf-elixir
-* Elm: https://github.com/tiziano88/elm-protobuf
 * Erlang: http://github.com/ngerakines/erlang_protobuffs/tree/master
 * Erlang: http://piqi.org/
 * Erlang: https://code.google.com/p/protoc-gen-erl/
 * Erlang: https://github.com/basho/erlang_protobuffs
-* Erlang: https://github.com/tomas-abrahamsson/gpb
 * Go: https://github.com/golang/protobuf (Google-official implementation)
+* Go: http://code.google.com/p/goprotobuf/
 * Go: https://github.com/akunspy/gopbuf
-* Go: https://github.com/gogo/protobuf
-* GopherJS: https://github.com/johanbrandhorst/protobuf
 * Haskell: http://hackage.haskell.org/package/hprotoc
-* Haskell: https://github.com/google/proto-lens (Google-unofficial implementation)
 * Haxe: https://github.com/Atry/protoc-gen-haxe
 * Java: https://github.com/google/protobuf (Google-official implementation)
 * Java/Android: https://github.com/square/wire
 * Java ME: http://code.google.com/p/protobuf-javame/
 * Java ME: http://swingme.sourceforge.net/encode.shtml
+* Java ME: http://github.com/ponderingpanda/protobuf-j2me
 * Java ME: http://code.google.com/p/protobuf-j2me/
 * Javascript: http://code.google.com/p/protobuf-js/
 * Javascript: http://github.com/sirikata/protojs
@@ -67,7 +62,6 @@
 * OCaml: http://piqi.org/
 * Perl: http://groups.google.com/group/protobuf-perl
 * Perl: http://search.cpan.org/perldoc?Google::ProtocolBuffers
-* Perl: https://metacpan.org/pod/Google::ProtocolBuffers::Dynamic
 * Perl/XS: http://code.google.com/p/protobuf-perlxs/
 * PHP: http://code.google.com/p/pb4php/
 * PHP: https://github.com/allegro/php-protobuf/
@@ -87,7 +81,6 @@
 * Scala: https://github.com/SandroGrzicic/ScalaBuff
 * Scala: http://trueaccord.github.io/ScalaPB/
 * Swift: https://github.com/alexeyxo/protobuf-swift
-* Swift: https://github.com/apple/swift-protobuf/
 * Vala: https://launchpad.net/protobuf-vala
 * Visual Basic: http://code.google.com/p/protobuf-net/
 
@@ -119,18 +112,11 @@
 * https://github.com/thesamet/rpcz (C++/Python, based on ZeroMQ)
 * https://github.com/w359405949/libmaid (C++, Python)
 * https://github.com/madwyn/libpbrpc (C++)
-* https://github.com/SeriousMa/grpc-protobuf-validation (Java)
-* https://github.com/tony612/grpc-elixir (Elixir)
-* https://github.com/johanbrandhorst/protobuf (GopherJS)
 
 ## Other Utilities
 
 There are miscellaneous other things you may find useful as a Protocol Buffers developer.
 
-* [Bazel Build](https://bazel.build)
-    * [rules_closure](https://github.com/bazelbuild/rules_closure) `js-closure`
-    * [rules_go](https://github.com/bazelbuild/rules_go) `go`
-    * [rules_protobuf](https://github.com/pubref/rules_protobuf) `java` `c++` `c#` `go` `js-closure` `js-node` `python` `ruby`
 * [NetBeans IDE plugin](http://code.google.com/p/protobuf-netbeans-plugin/)
 * [Wireshark/Ethereal packet sniffer plugin](http://code.google.com/p/protobuf-wireshark/)
 * [Alternate encodings (JSON, XML, HTML) for Java protobufs](http://code.google.com/p/protobuf-java-format/)
@@ -141,12 +127,12 @@
 * [Oracle PL SQL plugin](http://code.google.com/p/protocol-buffer-plsql/)
 * [Eclipse editor for protobuf (from Google)](http://code.google.com/p/protobuf-dt/)
 * [C++ Builder compatible protobuf](https://github.com/saadware/protobuf-cppbuilder)
-* Maven Protobuf Compiler Plugin
-    * By xolstice.org ([Documentation](https://www.xolstice.org/protobuf-maven-plugin/)) ([Source](https://github.com/xolstice/protobuf-maven-plugin/)) [![Maven Central](https://img.shields.io/maven-central/v/org.xolstice.maven.plugins/protobuf-maven-plugin.svg)](https://repo1.maven.org/maven2/org/xolstice/maven/plugins/protobuf-maven-plugin/)
+* Maven Protocol Compiler Plugin
+    * https://github.com/sergei-ivanov/maven-protoc-plugin/
     * http://igor-petruk.github.com/protobuf-maven-plugin/
     * http://code.google.com/p/maven-protoc-plugin/
     * https://github.com/os72/protoc-jar-maven-plugin
-* [Documentation generator plugin (Markdown/HTML/DocBook/...)](https://github.com/pseudomuto/protoc-gen-doc)
+* [Documentation generator plugin (Markdown/HTML/DocBook/...)](https://github.com/estan/protoc-gen-doc)
 * [DocBook generator for .proto files](http://code.google.com/p/protoc-gen-docbook/)
 * [Protobuf for nginx module](https://github.com/dbcode/protobuf-nginx/)
 * [RSpec matchers and Cucumber step defs for testing Protocol Buffers](https://github.com/connamara/protobuf_spec)
@@ -159,6 +145,3 @@
 * [ProtoBuf with Java EE7 Expression Language 3.0; pure Java ProtoBuf Parser and Builder.](https://github.com/protobufel/protobuf-el)
 * [Notepad++ Syntax Highlighting for .proto files](https://github.com/chai2010/notepadplus-protobuf)
 * [Linter for .proto files](https://github.com/ckaznocha/protoc-gen-lint)
-* [Protocol Buffers Dynamic Schema - create protobuf schemas programmatically (Java)] (https://github.com/os72/protobuf-dynamic)
-* [Make protoc plugins in NodeJS](https://github.com/konsumer/node-protoc-plugin)
-* [ProfaneDB - A Protocol Buffers database](https://profanedb.gitlab.io)
diff --git a/editors/protobuf-mode.el b/editors/protobuf-mode.el
index d3bdcde..f615a0a 100644
--- a/editors/protobuf-mode.el
+++ b/editors/protobuf-mode.el
@@ -66,13 +66,10 @@
 (require 'cc-mode)
 
 (eval-when-compile
-  (and (= emacs-major-version 24)
-       (>= emacs-minor-version 4)
-       (require 'cl))
   (require 'cc-langs)
   (require 'cc-fonts))
 
-;; This mode does not inherit properties from other modes. So, we do not use
+;; This mode does not inherit properties from other modes. So, we do not use 
 ;; the usual `c-add-language' function.
 (eval-and-compile
   (put 'protobuf-mode 'c-mode-prefix "protobuf-"))
diff --git a/examples/BUILD b/examples/BUILD
deleted file mode 100644
index d5d5d9a..0000000
--- a/examples/BUILD
+++ /dev/null
@@ -1,101 +0,0 @@
-# This BUILD file shows how to use protobuf with bazel. Before you can use
-# proto_library/<lang>_proto_library rules in a BUILD file, you need to
-# include protobuf repo as remote repositories in your WORKSPACE file. See
-# the WORKSPACE file in the same directory with this BUILD file for an
-# example.
-
-# For each .proto file, a proto_library target should be defined. This target
-# is not bound to any particular language. Instead, it defines the dependency
-# graph of the .proto files (i.e., proto imports) and serves as the provider
-# of .proto source files to the protocol compiler.
-#
-# Remote repository "com_google_protobuf" must be defined to use this rule.
-proto_library(
-    name = "addressbook_proto",
-    srcs = ["addressbook.proto"],
-    deps = ["@com_google_protobuf//:timestamp_proto"],
-)
-
-# The cc_proto_library rule generates C++ code for a proto_library rule. It
-# must have exactly one proto_library dependency. If you want to use multiple
-# proto_library targets, create a separate cc_proto_library target for each
-# of them.
-#
-# Remote repository "com_google_protobuf_cc" must be defined to use this rule.
-cc_proto_library(
-    name = "addressbook_cc_proto",
-    deps = [":addressbook_proto"],
-)
-
-# cc_library/cc_binary targets can depend on cc_proto_library targets.
-cc_binary(
-    name = "add_person_cpp",
-    srcs = ["add_person.cc"],
-    deps = [":addressbook_cc_proto"],
-)
-
-cc_binary(
-    name = "list_people_cpp",
-    srcs = ["list_people.cc"],
-    deps = [":addressbook_cc_proto"],
-)
-
-# Similar to cc_proto_library but for Java.
-#
-# Remote repository "com_google_protobuf_java" must be defined to use this rule.
-java_proto_library(
-    name = "addressbook_java_proto",
-    deps = [":addressbook_proto"],
-)
-
-java_binary(
-    name = "add_person_java",
-    srcs = ["AddPerson.java"],
-    main_class = "AddPerson",
-    deps = [":addressbook_java_proto"],
-)
-
-java_binary(
-    name = "list_people_java",
-    srcs = ["ListPeople.java"],
-    main_class = "ListPeople",
-    deps = [":addressbook_java_proto"],
-)
-
-# Java lite.
-#
-# Remote repository "com_google_protobuf_javalite" must be defined to use this
-# rule.
-java_lite_proto_library(
-    name = "addressbook_java_lite_proto",
-    deps = [":addressbook_proto"],
-)
-
-# Java lite API is a subset of the regular Java API so if you only uses this
-# subset in your code, you can actually compile your code against both (i.e.,
-# share code between server build and Android build).
-#
-# The lite version has a smaller code size, and you can see that by comparing
-# the resulted .jar file:
-#
-#   $ bazel build :add_person_java_deploy.jar :add_person_java_lite_deploy.jar
-#   $ ls -l bazel-bin/*_deploy.jar
-#   -r-xr-xr-x 1 xiaofeng eng 1230797 Sep  8 12:24 bazel-bin/add_person_java_deploy.jar
-#   -r-xr-xr-x 1 xiaofeng eng  236166 Sep  8 12:24 bazel-bin/add_person_java_lite_deploy.jar
-#
-# In the above example, the lite .jar file is 6 times smaller. With proper
-# proguard inlining/stripping, the difference can be much more larger than
-# that.
-java_binary(
-    name = "add_person_java_lite",
-    srcs = ["AddPerson.java"],
-    main_class = "AddPerson",
-    deps = [":addressbook_java_lite_proto"],
-)
-
-java_binary(
-    name = "list_people_java_lite",
-    srcs = ["ListPeople.java"],
-    main_class = "ListPeople",
-    deps = [":addressbook_java_lite_proto"],
-)
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
deleted file mode 100644
index 3e8e654..0000000
--- a/examples/CMakeLists.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-# Minimum CMake required
-cmake_minimum_required(VERSION 2.8.12)
-
-# Project
-project(protobuf-examples)
-
-# Find required protobuf package
-find_package(protobuf CONFIG REQUIRED)
-
-if(protobuf_VERBOSE)
-  message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}")
-endif()
-
-set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
-
-# http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
-if(MSVC AND protobuf_MSVC_STATIC_RUNTIME)
-  foreach(flag_var
-      CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
-      CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
-    if(${flag_var} MATCHES "/MD")
-      string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
-    endif(${flag_var} MATCHES "/MD")
-  endforeach()
-endif()
-
-foreach(example add_person list_people)
-  set(${example}_SRCS ${example}.cc)
-  set(${example}_PROTOS addressbook.proto)
-
-  #Code Generation
-  if(protobuf_MODULE_COMPATIBLE) #Legacy Support
-    protobuf_generate_cpp(${example}_PROTO_SRCS ${example}_PROTO_HDRS ${${example}_PROTOS})
-    list(APPEND ${example}_SRCS ${${example}_PROTO_SRCS} ${${example}_PROTO_HDRS})
-  endif()
-
-  #Executable setup
-  set(executable_name ${example}_cpp)
-  add_executable(${executable_name} ${${example}_SRCS} ${${example}_PROTOS})
-  if(protobuf_MODULE_COMPATIBLE) #Legacy mode
-    target_include_directories(${executable_name} PUBLIC ${PROTOBUF_INCLUDE_DIRS})
-    target_link_libraries(${executable_name} ${PROTOBUF_LIBRARIES})
-  else()
-    target_link_libraries(${executable_name} protobuf::libprotobuf)
-    protobuf_generate(TARGET ${executable_name})
-  endif()
-
-endforeach()
diff --git a/examples/ListPeople.java b/examples/ListPeople.java
index 580f7ac..7892430 100644
--- a/examples/ListPeople.java
+++ b/examples/ListPeople.java
@@ -27,9 +27,6 @@
           case WORK:
             System.out.print("  Work phone #: ");
             break;
-          default:
-            System.out.println(" Unknown phone #: ");
-            break;
         }
         System.out.println(phoneNumber.getNumber());
       }
diff --git a/examples/Makefile b/examples/Makefile
index 1ff7fa7..51f1342 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -22,12 +22,12 @@
 	rmdir com 2>/dev/null || true
 
 protoc_middleman: addressbook.proto
-	protoc $$PROTO_PATH --cpp_out=. --java_out=. --python_out=. addressbook.proto
+	protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
 	@touch protoc_middleman
 
 protoc_middleman_go: addressbook.proto
-	mkdir -p tutorial # make directory for go package
-	protoc $$PROTO_PATH --go_out=tutorial addressbook.proto
+	mkdir tutorial # make directory for go package
+	protoc --go_out=tutorial addressbook.proto
 	@touch protoc_middleman_go
 
 add_person_cpp: add_person.cc protoc_middleman
@@ -51,7 +51,7 @@
 	go test list_people.go list_people_test.go
 
 javac_middleman: AddPerson.java ListPeople.java protoc_middleman
-	javac -cp $$CLASSPATH AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java
+	javac AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java
 	@touch javac_middleman
 
 add_person_java: javac_middleman
diff --git a/examples/README.md b/examples/README.md
deleted file mode 100644
index 20f285c..0000000
--- a/examples/README.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# Protocol Buffers - Code Example
-
-This directory contains example code that uses Protocol Buffers to manage an
-address book. Two programs are provided for each supported language. The
-add_person example adds a new person to an address book, prompting the user to
-input the person's information. The list_people example lists people already in
-the address book. The examples use the exact same format in all three languages,
-so you can, for example, use add_person_java to create an address book and then
-use list_people_python to read it.
-
-These examples are part of the Protocol Buffers tutorial, located at:
-  https://developers.google.com/protocol-buffers/docs/tutorials
-
-## Build the example using bazel
-
-The example requires bazel 0.5.4 or newer to build. You can download/install
-the latest version of bazel from bazel's release page:
-
-    https://github.com/bazelbuild/bazel/releases
-
-Once you have bazel installed, simply run the following command in this examples
-directory to build the code:
-
-    $ bazel build :all
-
-Then you can run the built binary:
-
-    $ bazel-bin/add_person_cpp addressbook.data
-
-To use protobuf in your own bazel project, please follow instructions in the
-[BUILD](BUILD) file and [WORKSPACE](WORKSPACE) file.
-
-## Build the example using make
-
-You must install the protobuf package before you can build it using make. The
-minimum requirement is to install protocol compiler (i.e., the protoc binary)
-and the protobuf runtime for the language you want to build.
-
-You can simply run "make" to build the example for all languages (except for
-Go). However, since different language has different installation requirement,
-it will likely fail. It's better to follow individual instrutions below to
-build only the language you are interested in.
-
-### C++
-
-You can follow instructions in [../src/README.md](../src/README.md) to install
-protoc and protobuf C++ runtime from source.
-
-Then run "make cpp" in this examples directory to build the C++ example. It
-will create two executables: add_person_cpp and list_people_cpp. These programs
-simply take an address book file as their parameter. The add_person_cpp
-programs will create the file if it doesn't already exist.
-
-To run the examples:
-
-    $ ./add_person_cpp addressbook.data
-    $ ./list_people_cpp addressbook.data
-
-Note that on some platforms you may have to edit the Makefile and remove
-"-lpthread" from the linker commands (perhaps replacing it with something else).
-We didn't do this automatically because we wanted to keep the example simple.
-
-### Python
-
-Follow instructions in [../README.md](../README.md) to install protoc and then
-follow [../python/README.md](../python/README.md) to install protobuf python
-runtime from source. You can also install python runtime using pip:
-
-    $ pip install protobuf
-
-Make sure the runtime version is the same as protoc binary, or it may not work.
-
-After you have install both protoc and python runtime, run "make python" to
-build two executables (shell scripts actually): add_person_python and
-list_people_python. They work the same way as the C++ executables.
-
-### Java
-
-Follow instructions in [../README.md](../README.md) to install protoc and then
-download protobuf Java runtime .jar file from maven:
-
-    https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
-
-Then run the following:
-
-    $ export CLASSPATH=/path/to/protobuf-java-[version].jar
-    $ make java
-
-This will create the add_person_java/list_people_java executables (shell
-scripts) and can be used to create/display an address book data file.
-
-### Go
-
-The Go example requires a plugin to the protocol buffer compiler, so it is not
-build with all the other examples.  See:
-
-    https://github.com/golang/protobuf
-
-for more information about Go protocol buffer support.
-
-First, install the Protocol Buffers compiler (protoc).
-
-Then, install the Go Protocol Buffers plugin ($GOPATH/bin must be in your $PATH
-for protoc to find it):
-
-    go get github.com/golang/protobuf/protoc-gen-go
-
-Build the Go samples in this directory with "make go".  This creates the
-following executable files in the current directory:
-
-    add_person_go      list_people_go
-
-To run the example:
-
-    ./add_person_go addressbook.data
-
-to add a person to the protocol buffer encoded file addressbook.data.  The file
-is created if it does not exist.  To view the data, run:
-
-    ./list_people_go addressbook.data
-
-Observe that the C++, Python, and Java examples in this directory run in a
-similar way and can view/modify files created by the Go example and vice
-versa.
diff --git a/examples/README.txt b/examples/README.txt
new file mode 100644
index 0000000..b33f841
--- /dev/null
+++ b/examples/README.txt
@@ -0,0 +1,54 @@
+This directory contains example code that uses Protocol Buffers to manage an
+address book.  Two programs are provided, each with three different
+implementations, one written in each of C++, Java, and Python.  The add_person
+example adds a new person to an address book, prompting the user to input
+the person's information.  The list_people example lists people already in the
+address book.  The examples use the exact same format in all three languages,
+so you can, for example, use add_person_java to create an address book and then
+use list_people_python to read it.
+
+You must install the protobuf package before you can build these.
+
+To build all the examples (on a unix-like system), simply run "make".  This
+creates the following executable files in the current directory:
+  add_person_cpp     list_people_cpp
+  add_person_java    list_people_java
+  add_person_python  list_people_python
+
+If you only want to compile examples in one language, use "make cpp"*,
+"make java", or "make python".
+
+All of these programs simply take an address book file as their parameter.
+The add_person programs will create the file if it doesn't already exist.
+
+These examples are part of the Protocol Buffers tutorial, located at:
+  https://developers.google.com/protocol-buffers/docs/tutorials
+
+* Note that on some platforms you may have to edit the Makefile and remove
+"-lpthread" from the linker commands (perhaps replacing it with something else).
+We didn't do this automatically because we wanted to keep the example simple.
+
+## Go ##
+
+The Go example requires a plugin to the protocol buffer compiler, so it is not
+build with all the other examples.  See:
+  https://github.com/golang/protobuf
+for more information about Go protocol buffer support.
+
+First, install the Protocol Buffers compiler (protoc).
+Then, install the Go Protocol Buffers plugin
+($GOPATH/bin must be in your $PATH for protoc to find it):
+  go get github.com/golang/protobuf/protoc-gen-go
+
+Build the Go samples in this directory with "make go".  This creates the
+following executable files in the current directory:
+  add_person_go      list_people_go
+To run the example:
+  ./add_person_go addressbook.data
+to add a person to the protocol buffer encoded file addressbook.data.  The file
+is created if it does not exist.  To view the data, run:
+  ./list_people_go addressbook.data
+
+Observe that the C++, Python, and Java examples in this directory run in a
+similar way and can view/modify files created by the Go example and vice
+versa.
diff --git a/examples/WORKSPACE b/examples/WORKSPACE
deleted file mode 100644
index bb00310..0000000
--- a/examples/WORKSPACE
+++ /dev/null
@@ -1,33 +0,0 @@
-# This com_google_protobuf repository is required for proto_library rule.
-# It provides the protocol compiler binary (i.e., protoc).
-http_archive(
-    name = "com_google_protobuf",
-    strip_prefix = "protobuf-master",
-    urls = ["https://github.com/google/protobuf/archive/master.zip"],
-)
-
-# This com_google_protobuf_cc repository is required for cc_proto_library
-# rule. It provides protobuf C++ runtime. Note that it actually is the same
-# repo as com_google_protobuf but has to be given a different name as
-# required by bazel.
-http_archive(
-    name = "com_google_protobuf_cc",
-    strip_prefix = "protobuf-master",
-    urls = ["https://github.com/google/protobuf/archive/master.zip"],
-)
-
-# Similar to com_google_protobuf_cc but for Java (i.e., java_proto_library).
-http_archive(
-    name = "com_google_protobuf_java",
-    strip_prefix = "protobuf-master",
-    urls = ["https://github.com/google/protobuf/archive/master.zip"],
-)
-
-# Similar to com_google_protobuf_cc but for Java lite. If you are building
-# for Android, the lite version should be prefered because it has a much
-# smaller code size.
-http_archive(
-    name = "com_google_protobuf_javalite",
-    strip_prefix = "protobuf-javalite",
-    urls = ["https://github.com/google/protobuf/archive/javalite.zip"],
-)
diff --git a/examples/add_person.cc b/examples/add_person.cc
index 856e90b..9bec4b3 100644
--- a/examples/add_person.cc
+++ b/examples/add_person.cc
@@ -1,17 +1,11 @@
 // See README.txt for information and build instructions.
 
-#include <ctime>
-#include <fstream>
-#include <google/protobuf/util/time_util.h>
 #include <iostream>
+#include <fstream>
 #include <string>
-
 #include "addressbook.pb.h"
-
 using namespace std;
 
-using google::protobuf::util::TimeUtil;
-
 // This function fills in a Person message based on user input.
 void PromptForAddress(tutorial::Person* person) {
   cout << "Enter person ID number: ";
@@ -54,7 +48,6 @@
       cout << "Unknown phone type.  Using default." << endl;
     }
   }
-  *person->mutable_last_updated() = TimeUtil::SecondsToTimestamp(time(NULL));
 }
 
 // Main function:  Reads the entire address book from a file,
diff --git a/examples/add_person.py b/examples/add_person.py
index aa0fbca..0b69857 100755
--- a/examples/add_person.py
+++ b/examples/add_person.py
@@ -5,12 +5,6 @@
 import addressbook_pb2
 import sys
 
-try:
-  raw_input          # Python 2
-except NameError:
-  raw_input = input  # Python 3
-
-
 # This function fills in a Person message based on user input.
 def PromptForAddress(person):
   person.id = int(raw_input("Enter person ID number: "))
@@ -36,14 +30,13 @@
     elif type == "work":
       phone_number.type = addressbook_pb2.Person.WORK
     else:
-      print("Unknown phone type; leaving as default value.")
-
+      print "Unknown phone type; leaving as default value."
 
 # Main procedure:  Reads the entire address book from a file,
 #   adds one person based on user input, then writes it back out to the same
 #   file.
 if len(sys.argv) != 2:
-  print("Usage:", sys.argv[0], "ADDRESS_BOOK_FILE")
+  print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE"
   sys.exit(-1)
 
 address_book = addressbook_pb2.AddressBook()
@@ -53,7 +46,7 @@
   with open(sys.argv[1], "rb") as f:
     address_book.ParseFromString(f.read())
 except IOError:
-  print(sys.argv[1] + ": File not found.  Creating a new file.")
+  print sys.argv[1] + ": File not found.  Creating a new file."
 
 # Add an address.
 PromptForAddress(address_book.people.add())
diff --git a/examples/addressbook.proto b/examples/addressbook.proto
index b4b33b4..23cc2f9 100644
--- a/examples/addressbook.proto
+++ b/examples/addressbook.proto
@@ -9,8 +9,6 @@
 // [START declaration]
 syntax = "proto3";
 package tutorial;
-
-import "google/protobuf/timestamp.proto";
 // [END declaration]
 
 // [START java_declaration]
@@ -40,8 +38,6 @@
   }
 
   repeated PhoneNumber phones = 4;
-
-  google.protobuf.Timestamp last_updated = 5;
 }
 
 // Our address book file is just one of these.
diff --git a/examples/list_people.cc b/examples/list_people.cc
index b309c59..68e5666 100644
--- a/examples/list_people.cc
+++ b/examples/list_people.cc
@@ -1,16 +1,11 @@
 // See README.txt for information and build instructions.
 
-#include <fstream>
-#include <google/protobuf/util/time_util.h>
 #include <iostream>
+#include <fstream>
 #include <string>
-
 #include "addressbook.pb.h"
-
 using namespace std;
 
-using google::protobuf::util::TimeUtil;
-
 // Iterates though all people in the AddressBook and prints info about them.
 void ListPeople(const tutorial::AddressBook& address_book) {
   for (int i = 0; i < address_book.people_size(); i++) {
@@ -35,15 +30,9 @@
         case tutorial::Person::WORK:
           cout << "  Work phone #: ";
           break;
-        default:
-          cout << "  Unknown phone #: ";
-          break;
       }
       cout << phone_number.number() << endl;
     }
-    if (person.has_last_updated()) {
-      cout << "  Updated: " << TimeUtil::ToString(person.last_updated()) << endl;
-    }
   }
 }
 
diff --git a/examples/list_people.py b/examples/list_people.py
index d2c294c..f131872 100755
--- a/examples/list_people.py
+++ b/examples/list_people.py
@@ -2,33 +2,30 @@
 
 # See README.txt for information and build instructions.
 
-from __future__ import print_function
 import addressbook_pb2
 import sys
 
-
 # Iterates though all people in the AddressBook and prints info about them.
 def ListPeople(address_book):
   for person in address_book.people:
-    print("Person ID:", person.id)
-    print("  Name:", person.name)
+    print "Person ID:", person.id
+    print "  Name:", person.name
     if person.email != "":
-      print("  E-mail address:", person.email)
+      print "  E-mail address:", person.email
 
     for phone_number in person.phones:
       if phone_number.type == addressbook_pb2.Person.MOBILE:
-        print("  Mobile phone #:", end=" ")
+        print "  Mobile phone #:",
       elif phone_number.type == addressbook_pb2.Person.HOME:
-        print("  Home phone #:", end=" ")
+        print "  Home phone #:",
       elif phone_number.type == addressbook_pb2.Person.WORK:
-        print("  Work phone #:", end=" ")
-      print(phone_number.number)
-
+        print "  Work phone #:",
+      print phone_number.number
 
 # Main procedure:  Reads the entire address book from a file and prints all
 #   the information inside.
 if len(sys.argv) != 2:
-  print("Usage:", sys.argv[0], "ADDRESS_BOOK_FILE")
+  print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE"
   sys.exit(-1)
 
 address_book = addressbook_pb2.AddressBook()
diff --git a/generate_changelog.py b/generate_changelog.py
deleted file mode 100755
index d90a9b7..0000000
--- a/generate_changelog.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/env python
-
-"""Generates a friendly list of changes per language since the last release."""
-
-import sys
-import os
-
-class Language(object):
-  def __init__(self, name, pathspec):
-    self.name = name
-    self.pathspec = pathspec
-
-languages = [
-  Language("C++", [
-      "':(glob)src/google/protobuf/*'",
-      "src/google/protobuf/compiler/cpp",
-      "src/google/protobuf/io",
-      "src/google/protobuf/util",
-      "src/google/protobuf/stubs",
-  ]),
-  Language("Java", [
-      "java",
-      "javanano",
-      "src/google/protobuf/compiler/cpp",
-  ]),
-  Language("Python", [
-      "javanano",
-      "src/google/protobuf/compiler/python",
-  ]),
-  Language("JavaScript", [
-      "js",
-      "src/google/protobuf/compiler/js",
-  ]),
-  Language("PHP", [
-      "php",
-      "src/google/protobuf/compiler/php",
-  ]),
-  Language("Ruby", [
-      "ruby",
-      "src/google/protobuf/compiler/ruby",
-  ]),
-  Language("Csharp", [
-      "csharp",
-      "src/google/protobuf/compiler/csharp",
-  ]),
-  Language("Objective C", [
-      "objectivec",
-      "src/google/protobuf/compiler/objectivec",
-  ]),
-]
-
-if len(sys.argv) < 2:
-  print("Usage: generate_changelog.py <previous release>")
-  sys.exit(1)
-
-previous = sys.argv[1]
-
-for language in languages:
-  print(language.name)
-  sys.stdout.flush()
-  os.system(("git log --pretty=oneline --abbrev-commit %s...HEAD %s | " +
-             "sed -e 's/^/ - /'") % (previous, " ".join(language.pathspec)))
-  print("")
-
-print("To view a commit on GitHub: " +
-      "https://github.com/google/protobuf/commit/<commit id>")
diff --git a/generate_descriptor_proto.sh b/generate_descriptor_proto.sh
index 8a5ed48..c170c83 100755
--- a/generate_descriptor_proto.sh
+++ b/generate_descriptor_proto.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/sh
 
 # Run this script to regenerate descriptor.pb.{h,cc} after the protocol
 # compiler changes.  Since these files are compiled into the protocol compiler
@@ -41,24 +41,8 @@
   google/protobuf/type.proto \
   google/protobuf/wrappers.proto)
 
-declare -a COMPILER_PROTO_FILES=(\
-  google/protobuf/compiler/plugin.proto)
-
 CORE_PROTO_IS_CORRECT=0
 PROCESS_ROUND=1
-BOOTSTRAP_PROTOC=""
-while [ $# -gt 0 ]; do
-  case $1 in
-    --bootstrap_protoc)
-      BOOTSTRAP_PROTOC=$2
-      shift
-      ;;
-    *)
-      break
-      ;;
-  esac
-  shift
-done
 TMP=$(mktemp -d)
 echo "Updating descriptor protos..."
 while [ $CORE_PROTO_IS_CORRECT -ne 1 ]
@@ -66,22 +50,16 @@
   echo "Round $PROCESS_ROUND"
   CORE_PROTO_IS_CORRECT=1
 
-  if [ "$BOOTSTRAP_PROTOC" != "" ]; then
-    PROTOC=$BOOTSTRAP_PROTOC
-    BOOTSTRAP_PROTOC=""
-  else
-    make $@ protoc
-    if test $? -ne 0; then
-      echo "Failed to build protoc."
-      exit 1
-    fi
-    PROTOC="./protoc"
+  make $@ protoc
+  if test $? -ne 0; then
+    echo "Failed to build protoc."
+    exit 1
   fi
 
-  $PROTOC --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \
-  $PROTOC --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:$TMP ${COMPILER_PROTO_FILES[@]}
+  ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \
+  ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:$TMP google/protobuf/compiler/plugin.proto
 
-  for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]} ${COMPILER_PROTO_FILES[@]}; do
+  for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do
     BASE_NAME=${PROTO_FILE%.*}
     diff ${BASE_NAME}.pb.h $TMP/${BASE_NAME}.pb.h > /dev/null
     if test $? -ne 0; then
@@ -93,14 +71,24 @@
     fi
   done
 
+  diff google/protobuf/compiler/plugin.pb.h $TMP/google/protobuf/compiler/plugin.pb.h > /dev/null
+  if test $? -ne 0; then
+    CORE_PROTO_IS_CORRECT=0
+  fi
+  diff google/protobuf/compiler/plugin.pb.cc $TMP/google/protobuf/compiler/plugin.pb.cc > /dev/null
+  if test $? -ne 0; then
+    CORE_PROTO_IS_CORRECT=0
+  fi
+
   # Only override the output if the files are different to avoid re-compilation
   # of the protoc.
   if [ $CORE_PROTO_IS_CORRECT -ne 1 ]; then
-    for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]} ${COMPILER_PROTO_FILES[@]}; do
+    for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do
       BASE_NAME=${PROTO_FILE%.*}
       mv $TMP/${BASE_NAME}.pb.h ${BASE_NAME}.pb.h
       mv $TMP/${BASE_NAME}.pb.cc ${BASE_NAME}.pb.cc
     done
+    mv $TMP/google/protobuf/compiler/plugin.pb.* google/protobuf/compiler/
   fi
 
   PROCESS_ROUND=$((PROCESS_ROUND + 1))
@@ -116,8 +104,3 @@
   echo "Generating messages for C#."
   csharp/generate_protos.sh $@
 fi
-
-if test -x php/generate_descriptor_protos.sh; then
-  echo "Generating messages for PHP."
-  php/generate_descriptor_protos.sh $@
-fi
diff --git a/gmock.BUILD b/gmock.BUILD
index b1ae15a..82abf27 100644
--- a/gmock.BUILD
+++ b/gmock.BUILD
@@ -1,19 +1,19 @@
 cc_library(
     name = "gtest",
     srcs = [
-        "googletest/src/gtest-all.cc",
-        "googlemock/src/gmock-all.cc",
+        "gmock-1.7.0/gtest/src/gtest-all.cc",
+        "gmock-1.7.0/src/gmock-all.cc",
     ],
     hdrs = glob([
-        "**/*.h",
-        "googletest/src/*.cc",
-        "googlemock/src/*.cc",
+        "gmock-1.7.0/**/*.h",
+        "gmock-1.7.0/gtest/src/*.cc",
+        "gmock-1.7.0/src/*.cc",
     ]),
     includes = [
-        "googlemock",
-        "googletest",
-        "googletest/include",
-        "googlemock/include",
+        "gmock-1.7.0",
+        "gmock-1.7.0/gtest",
+        "gmock-1.7.0/gtest/include",
+        "gmock-1.7.0/include",
     ],
     linkopts = ["-pthread"],
     visibility = ["//visibility:public"],
@@ -21,7 +21,7 @@
 
 cc_library(
     name = "gtest_main",
-    srcs = ["googlemock/src/gmock_main.cc"],
+    srcs = ["gmock-1.7.0/src/gmock_main.cc"],
     linkopts = ["-pthread"],
     visibility = ["//visibility:public"],
     deps = [":gtest"],
diff --git a/java/README.md b/java/README.md
index 0e0fba6..060d9ac 100644
--- a/java/README.md
+++ b/java/README.md
@@ -17,10 +17,9 @@
 
      http://maven.apache.org/
 
-2) Build the C++ code, or obtain a binary distribution of protoc (see
-   the toplevel [README.md](../README.md)). If you install a binary
-   distribution, make sure that it is the same version as this package.
-   If in doubt, run:
+2) Build the C++ code, or obtain a binary distribution of protoc.  If
+   you install a binary distribution, make sure that it is the same
+   version as this package.  If in doubt, run:
 
      $ protoc --version
 
@@ -45,25 +44,36 @@
 
    The .jar will be placed in the "target" directory.
 
-The above instructions will install 3 maven artifacts:
+Installation - 'Lite' Version - With Maven
+==========================================
 
-  * protobuf-java: The core Java Protocol Buffers library. Most users only
-                   need this artifact.
-  * protobuf-lite: The lite version of core Java Protobuf Buffers library. It
-                   is a subset of the core library and is used together with
-                   the 'lite' code generator flag to reduce generated code size
-                   for mobile.
-  * protobuf-java-util: Utilities to work with protos. It contains JSON support
-                        as well as utilities to work with proto3 well-known
-                        types.
+Building the 'lite' version of the Java Protocol Buffers library is
+the same as building the full version, except that all commands are
+run using the 'lite' profile.  (see
+http://maven.apache.org/guides/introduction/introduction-to-profiles.html)
+
+E.g. to install the lite version of the jar, you would run:
+
+    $ mvn install -P lite
+
+The resulting artifact has the 'lite' classifier.  To reference it
+for dependency resolution, you would specify it as:
+
+```
+  <dependency>
+    <groupId>com.google.protobuf</groupId>
+    <artifactId>protobuf-java</artifactId>
+    <version>${version}</version>
+    <classifier>lite</classifier>
+  </dependency>
+```
 
 Installation - Without Maven
 ============================
 
 If you would rather not install Maven to build the library, you may
 follow these instructions instead.  Note that these instructions skip
-running unit tests and only describes how to install the core protobuf
-library (without the util package).
+running unit tests.
 
 1) Build the C++ code, or obtain a binary distribution of protoc.  If
    you install a binary distribution, make sure that it is the same
@@ -76,50 +86,15 @@
 
 2) Invoke protoc to build DescriptorProtos.java:
 
-     $ protoc --java_out=core/src/main/java -I../src \
+     $ protoc --java_out=src/main/java -I../src \
          ../src/google/protobuf/descriptor.proto
 
-3) Compile the code in core/src/main/java using whatever means you prefer.
+3) Compile the code in src/main/java using whatever means you prefer.
 
 4) Install the classes wherever you prefer.
 
-Compatibility Notice
-====================
-
-* Protobuf minor version releases are backwards-compatible. If your code
-  can build/run against the old version, it's expected to build/run against
-  the new version as well. Both binary compatibility and source compatibility
-  are guaranteed for minor version releases if the user follows the guideline
-  described in this section.
-
-* Protobuf major version releases may also be backwards-compatbile with the
-  last release of the previous major version. See the release notice for more
-  details.
-
-* APIs marked with the @ExperimentalApi annotation are subject to change. They
-  can be modified in any way, or even removed, at any time. Don't use them if
-  compatibility is needed. If your code is a library itself (i.e. it is used on
-  the CLASSPATH of users outside your own control), you should not use
-  experimental APIs, unless you repackage them (e.g. using ProGuard).
-
-* Deprecated non-experimental APIs will be removed two years after the release
-  in which they are first deprecated. You must fix your references before this
-  time. If you don't, any manner of breakage could result (you are not
-  guaranteed a compilation error).
-
-* Protobuf message interfaces/classes are designed to be subclassed by protobuf
-  generated code only. Do not subclass these message interfaces/classes
-  yourself. We may add new methods to the message interfaces/classes which will
-  break your own subclasses.
-
-* Don't use any method/class that is marked as "used by generated code only".
-  Such methods/classes are subject to change.
-
-* Protobuf LITE runtime APIs are not stable yet. They are subject to change even
-  in minor version releases.
-
-Documentation
-=============
+Usage
+=====
 
 The complete documentation for Protocol Buffers is available via the
 web at:
diff --git a/java/compatibility_tests/README.md b/java/compatibility_tests/README.md
deleted file mode 100644
index 72c6034..0000000
--- a/java/compatibility_tests/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Protobuf Java Compatibility Tests
-
-This directory contains tests to ensure protobuf library is compatible with
-previously released versions.
-
-## Directory Layout
-
-For each released protobuf version we are testing compatibility with, there
-is a sub-directory with the following layout (take v2.5.0 as an example):
-
-  * v2.5.0
-    * test.sh
-    * pom.xml
-    * protos/ - unittest protos.
-    * more_protos/ - unittest protos that import the ones in "protos".
-    * tests/ - actual Java test classes.
-
-The testing code is extracted from regular protobuf unittests by removing:
-
-  * tests that access package private methods/classes.
-  * tests that are known to be broken by an intended behavior change (e.g., we
-    changed the parsing recursion limit from 64 to 100).
-  * all lite runtime tests.
-
-It's also divided into 3 submodule with tests depending on more_protos and
-more_protos depending on protos. This way we can test scenarios where only part
-of the dependency is upgraded to the new version.
-
-## How to Run The Tests
-
-We use a shell script to drive the test of different scenarios so the test
-will only run on unix-like environments. The script expects a few command
-line tools to be available on PATH: git, mvn, wget, grep, sed, java.
-
-Before running the tests, make sure you have already built the protoc binary
-following [the C++ installation instructions](../../src/README.md). The test
-scripts will use the built binary located at ${protobuf}/src/protoc.
-
-To start a test, simply run the test.sh script in each version directory. For
-example:
-
-    $ v2.5.0/test.sh
-
-For each version, the test script will test:
-
-  * only upgrading protos to the new version
-  * only upgrading more_protos to the new version
-
-and see whether everything builds/runs fine. Both source compatibility and
-binary compatibility will be tested.
diff --git a/java/compatibility_tests/v2.5.0/deps/pom.xml b/java/compatibility_tests/v2.5.0/deps/pom.xml
deleted file mode 100644
index 7ceb960..0000000
--- a/java/compatibility_tests/v2.5.0/deps/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.protobuf.compatibility</groupId>
-  <artifactId>compatibility-test-deps</artifactId>
-  <version>2.5.0</version>
-
-  <name>Compatibility Test Dependencies</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <version>2.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <version>2.2.1</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <version>2.6</version>
-        <configuration>
-          <descriptorRefs>
-            <descriptorRef>jar-with-dependencies</descriptorRef>
-          </descriptorRefs>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/java/compatibility_tests/v2.5.0/more_protos/pom.xml b/java/compatibility_tests/v2.5.0/more_protos/pom.xml
deleted file mode 100644
index ff0c413..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/pom.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>com.google.protobuf.compatibility</groupId>
-    <artifactId>compatibility-test-suite</artifactId>
-    <version>2.5.0</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <groupId>com.google.protobuf.compatibility</groupId>
-  <artifactId>compatibility-more-protos</artifactId>
-  <version>2.5.0</version>
-
-  <name>More protos for Compatibility test</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>com.google.protobuf</groupId>
-      <artifactId>protobuf-java</artifactId>
-      <version>${more_protos.protobuf.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.google.protobuf.compatibility</groupId>
-      <artifactId>compatibility-protos</artifactId>
-      <version>2.5.0</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.3</version>
-        <configuration>
-          <source>1.6</source>
-          <target>1.6</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>generate-sources</id>
-            <phase>generate-sources</phase>
-            <configuration>
-              <tasks>
-                <mkdir dir="target/generated-sources" />
-                <exec executable="${more_protos.protoc.path}">
-                  <arg value="--java_out=target/generated-sources" />
-                  <arg value="--proto_path=src/proto" />
-                  <arg value="src/proto/google/protobuf/unittest.proto" />
-                  <arg value="src/proto/google/protobuf/unittest_optimize_for.proto" />
-                  <arg value="src/proto/com/google/protobuf/multiple_files_test.proto" />
-                </exec>
-              </tasks>
-              <sourceRoot>target/generated-sources</sourceRoot>
-            </configuration>
-            <goals>
-              <goal>run</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/multiple_files_test.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/multiple_files_test.proto
deleted file mode 100644
index 9a04014..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/multiple_files_test.proto
+++ /dev/null
@@ -1,71 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// A proto file which tests the java_multiple_files option.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option java_generic_services = true;   // auto-added
-
-import "google/protobuf/unittest.proto";
-
-package protobuf_unittest;
-
-option java_multiple_files = true;
-option java_outer_classname = "MultipleFilesTestProto";
-
-message MessageWithNoOuter {
-  message NestedMessage {
-    optional int32 i = 1;
-  }
-  enum NestedEnum {
-    BAZ = 3;
-  }
-  optional NestedMessage nested = 1;
-  repeated TestAllTypes foreign = 2;
-  optional NestedEnum nested_enum = 3;
-  optional EnumWithNoOuter foreign_enum = 4;
-}
-
-enum EnumWithNoOuter {
-  FOO = 1;
-  BAR = 2;
-}
-
-service ServiceWithNoOuter {
-  rpc Foo(MessageWithNoOuter) returns(TestAllTypes);
-}
-
-extend TestAllExtensions {
-  optional int32 extension_with_outer = 1234567;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_builders_test.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_builders_test.proto
deleted file mode 100644
index abffb9d..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_builders_test.proto
+++ /dev/null
@@ -1,53 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: jonp@google.com (Jon Perlow)
-//
-
-package protobuf_unittest;
-
-option java_multiple_files = true;
-option java_outer_classname = "NestedBuilders";
-
-
-message Vehicle {
-  optional Engine engine = 1;
-  repeated Wheel wheel = 2;
-}
-
-message Engine {
-  optional int32 cylinder = 1;
-  optional int32 liters = 2;
-}
-
-message Wheel {
-  optional int32 radius = 1;
-  optional int32 width = 2;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_extension.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_extension.proto
deleted file mode 100644
index 9fe5d56..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_extension.proto
+++ /dev/null
@@ -1,45 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with nested extensions. Note that this must be defined in
-// a separate file to properly test the initialization of the outer class.
-
-
-import "com/google/protobuf/non_nested_extension.proto";
-
-package protobuf_unittest;
-
-message MyNestedExtension {
-  extend MessageToBeExtended {
-    optional MessageToBeExtended recursiveExtension = 2;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_extension_lite.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_extension_lite.proto
deleted file mode 100644
index 16ee46e..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/nested_extension_lite.proto
+++ /dev/null
@@ -1,48 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with nested extensions for a MessageLite messages. Note that
-// this must be defined in a separate file to properly test the initialization
-// of the outer class.
-
-
-package protobuf_unittest;
-
-option optimize_for = LITE_RUNTIME;
-
-import "com/google/protobuf/non_nested_extension_lite.proto";
-
-message MyNestedExtensionLite {
-  extend MessageLiteToBeExtended {
-    optional MessageLiteToBeExtended recursiveExtensionLite = 3;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/non_nested_extension.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/non_nested_extension.proto
deleted file mode 100644
index f61b419..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/non_nested_extension.proto
+++ /dev/null
@@ -1,48 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with extensions.
-
-
-package protobuf_unittest;
-
-message MessageToBeExtended {
-  extensions 1 to max;
-}
-
-message MyNonNestedExtension {
-}
-
-extend MessageToBeExtended {
-  optional MyNonNestedExtension nonNestedExtension = 1;
-}
-
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/non_nested_extension_lite.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/non_nested_extension_lite.proto
deleted file mode 100644
index 3c82659..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/non_nested_extension_lite.proto
+++ /dev/null
@@ -1,50 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with extensions for a MessageLite messages.
-
-
-package protobuf_unittest;
-
-option optimize_for = LITE_RUNTIME;
-
-message MessageLiteToBeExtended {
-  extensions 1 to max;
-}
-
-message MyNonNestedExtensionLite {
-}
-
-extend MessageLiteToBeExtended {
-  optional MyNonNestedExtensionLite nonNestedExtensionLite = 1;
-}
-
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/test_bad_identifiers.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/test_bad_identifiers.proto
deleted file mode 100644
index 6e67d97..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/com/google/protobuf/test_bad_identifiers.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: jonp@google.com (Jon Perlow)
-
-// This file tests that various identifiers work as field and type names even
-// though the same identifiers are used internally by the java code generator.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option java_generic_services = true;   // auto-added
-
-package io_protocol_tests;
-
-option java_package = "com.google.protobuf";
-option java_outer_classname = "TestBadIdentifiersProto";
-
-message TestMessage {
-}
-
-message Descriptor {
-  option no_standard_descriptor_accessor = true;
-  optional string descriptor = 1;
-  message NestedDescriptor {
-    option no_standard_descriptor_accessor = true;
-    optional string descriptor = 1;
-  }
-  optional NestedDescriptor nested_descriptor = 2;
-}
-
-message Parser {
-  enum ParserEnum {
-    PARSER = 1;
-  }
-  optional ParserEnum parser = 1;
-}
-
-message Deprecated {
-  enum TestEnum {
-    FOO = 1;
-  }
-
-  optional int32 field1 = 1 [deprecated=true];
-  optional TestEnum field2 = 2 [deprecated=true];
-  optional TestMessage field3 = 3 [deprecated=true];
-}
-
-message Override {
-  optional int32 override = 1;
-}
-
-message Object {
-  optional int32 object = 1;
-  optional string string_object = 2;
-}
-
-message String {
-  optional string string = 1;
-}
-
-message Integer {
-  optional int32 integer = 1;
-}
-
-message Long {
-  optional int32 long = 1;
-}
-
-message Float {
-  optional float float = 1;
-}
-
-message Double {
-  optional double double = 1;
-}
-
-service TestConflictingMethodNames {
-  rpc Override(TestMessage) returns (TestMessage);
-}
-
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/descriptor.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/descriptor.proto
deleted file mode 100644
index a785f79..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/descriptor.proto
+++ /dev/null
@@ -1,620 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// The messages in this file describe the definitions found in .proto files.
-// A valid .proto file can be translated directly to a FileDescriptorProto
-// without any other information (e.g. without reading its imports).
-
-
-
-package google.protobuf;
-option java_package = "com.google.protobuf";
-option java_outer_classname = "DescriptorProtos";
-
-// descriptor.proto must be optimized for speed because reflection-based
-// algorithms don't work during bootstrapping.
-option optimize_for = SPEED;
-
-// The protocol compiler can output a FileDescriptorSet containing the .proto
-// files it parses.
-message FileDescriptorSet {
-  repeated FileDescriptorProto file = 1;
-}
-
-// Describes a complete .proto file.
-message FileDescriptorProto {
-  optional string name = 1;       // file name, relative to root of source tree
-  optional string package = 2;    // e.g. "foo", "foo.bar", etc.
-
-  // Names of files imported by this file.
-  repeated string dependency = 3;
-  // Indexes of the public imported files in the dependency list above.
-  repeated int32 public_dependency = 10;
-  // Indexes of the weak imported files in the dependency list.
-  // For Google-internal migration only. Do not use.
-  repeated int32 weak_dependency = 11;
-
-  // All top-level definitions in this file.
-  repeated DescriptorProto message_type = 4;
-  repeated EnumDescriptorProto enum_type = 5;
-  repeated ServiceDescriptorProto service = 6;
-  repeated FieldDescriptorProto extension = 7;
-
-  optional FileOptions options = 8;
-
-  // This field contains optional information about the original source code.
-  // You may safely remove this entire field whithout harming runtime
-  // functionality of the descriptors -- the information is needed only by
-  // development tools.
-  optional SourceCodeInfo source_code_info = 9;
-}
-
-// Describes a message type.
-message DescriptorProto {
-  optional string name = 1;
-
-  repeated FieldDescriptorProto field = 2;
-  repeated FieldDescriptorProto extension = 6;
-
-  repeated DescriptorProto nested_type = 3;
-  repeated EnumDescriptorProto enum_type = 4;
-
-  message ExtensionRange {
-    optional int32 start = 1;
-    optional int32 end = 2;
-  }
-  repeated ExtensionRange extension_range = 5;
-
-  optional MessageOptions options = 7;
-}
-
-// Describes a field within a message.
-message FieldDescriptorProto {
-  enum Type {
-    // 0 is reserved for errors.
-    // Order is weird for historical reasons.
-    TYPE_DOUBLE         = 1;
-    TYPE_FLOAT          = 2;
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-    // negative values are likely.
-    TYPE_INT64          = 3;
-    TYPE_UINT64         = 4;
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-    // negative values are likely.
-    TYPE_INT32          = 5;
-    TYPE_FIXED64        = 6;
-    TYPE_FIXED32        = 7;
-    TYPE_BOOL           = 8;
-    TYPE_STRING         = 9;
-    TYPE_GROUP          = 10;  // Tag-delimited aggregate.
-    TYPE_MESSAGE        = 11;  // Length-delimited aggregate.
-
-    // New in version 2.
-    TYPE_BYTES          = 12;
-    TYPE_UINT32         = 13;
-    TYPE_ENUM           = 14;
-    TYPE_SFIXED32       = 15;
-    TYPE_SFIXED64       = 16;
-    TYPE_SINT32         = 17;  // Uses ZigZag encoding.
-    TYPE_SINT64         = 18;  // Uses ZigZag encoding.
-  };
-
-  enum Label {
-    // 0 is reserved for errors
-    LABEL_OPTIONAL      = 1;
-    LABEL_REQUIRED      = 2;
-    LABEL_REPEATED      = 3;
-    // TODO(sanjay): Should we add LABEL_MAP?
-  };
-
-  optional string name = 1;
-  optional int32 number = 3;
-  optional Label label = 4;
-
-  // If type_name is set, this need not be set.  If both this and type_name
-  // are set, this must be either TYPE_ENUM or TYPE_MESSAGE.
-  optional Type type = 5;
-
-  // For message and enum types, this is the name of the type.  If the name
-  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-  // rules are used to find the type (i.e. first the nested types within this
-  // message are searched, then within the parent, on up to the root
-  // namespace).
-  optional string type_name = 6;
-
-  // For extensions, this is the name of the type being extended.  It is
-  // resolved in the same manner as type_name.
-  optional string extendee = 2;
-
-  // For numeric types, contains the original text representation of the value.
-  // For booleans, "true" or "false".
-  // For strings, contains the default text contents (not escaped in any way).
-  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-  // TODO(kenton):  Base-64 encode?
-  optional string default_value = 7;
-
-  optional FieldOptions options = 8;
-}
-
-// Describes an enum type.
-message EnumDescriptorProto {
-  optional string name = 1;
-
-  repeated EnumValueDescriptorProto value = 2;
-
-  optional EnumOptions options = 3;
-}
-
-// Describes a value within an enum.
-message EnumValueDescriptorProto {
-  optional string name = 1;
-  optional int32 number = 2;
-
-  optional EnumValueOptions options = 3;
-}
-
-// Describes a service.
-message ServiceDescriptorProto {
-  optional string name = 1;
-  repeated MethodDescriptorProto method = 2;
-
-  optional ServiceOptions options = 3;
-}
-
-// Describes a method of a service.
-message MethodDescriptorProto {
-  optional string name = 1;
-
-  // Input and output type names.  These are resolved in the same way as
-  // FieldDescriptorProto.type_name, but must refer to a message type.
-  optional string input_type = 2;
-  optional string output_type = 3;
-
-  optional MethodOptions options = 4;
-}
-
-
-// ===================================================================
-// Options
-
-// Each of the definitions above may have "options" attached.  These are
-// just annotations which may cause code to be generated slightly differently
-// or may contain hints for code that manipulates protocol messages.
-//
-// Clients may define custom options as extensions of the *Options messages.
-// These extensions may not yet be known at parsing time, so the parser cannot
-// store the values in them.  Instead it stores them in a field in the *Options
-// message called uninterpreted_option. This field must have the same name
-// across all *Options messages. We then use this field to populate the
-// extensions when we build a descriptor, at which point all protos have been
-// parsed and so all extensions are known.
-//
-// Extension numbers for custom options may be chosen as follows:
-// * For options which will only be used within a single application or
-//   organization, or for experimental options, use field numbers 50000
-//   through 99999.  It is up to you to ensure that you do not use the
-//   same number for multiple options.
-// * For options which will be published and used publicly by multiple
-//   independent entities, e-mail protobuf-global-extension-registry@google.com
-//   to reserve extension numbers. Simply provide your project name (e.g.
-//   Object-C plugin) and your porject website (if available) -- there's no need
-//   to explain how you intend to use them. Usually you only need one extension
-//   number. You can declare multiple options with only one extension number by
-//   putting them in a sub-message. See the Custom Options section of the docs
-//   for examples:
-//   http://code.google.com/apis/protocolbuffers/docs/proto.html#options
-//   If this turns out to be popular, a web service will be set up
-//   to automatically assign option numbers.
-
-
-message FileOptions {
-
-  // Sets the Java package where classes generated from this .proto will be
-  // placed.  By default, the proto package is used, but this is often
-  // inappropriate because proto packages do not normally start with backwards
-  // domain names.
-  optional string java_package = 1;
-
-
-  // If set, all the classes from the .proto file are wrapped in a single
-  // outer class with the given name.  This applies to both Proto1
-  // (equivalent to the old "--one_java_file" option) and Proto2 (where
-  // a .proto always translates to a single class, but you may want to
-  // explicitly choose the class name).
-  optional string java_outer_classname = 8;
-
-  // If set true, then the Java code generator will generate a separate .java
-  // file for each top-level message, enum, and service defined in the .proto
-  // file.  Thus, these types will *not* be nested inside the outer class
-  // named by java_outer_classname.  However, the outer class will still be
-  // generated to contain the file's getDescriptor() method as well as any
-  // top-level extensions defined in the file.
-  optional bool java_multiple_files = 10 [default=false];
-
-  // If set true, then the Java code generator will generate equals() and
-  // hashCode() methods for all messages defined in the .proto file. This is
-  // purely a speed optimization, as the AbstractMessage base class includes
-  // reflection-based implementations of these methods.
-  optional bool java_generate_equals_and_hash = 20 [default=false];
-
-  // Generated classes can be optimized for speed or code size.
-  enum OptimizeMode {
-    SPEED = 1;        // Generate complete code for parsing, serialization,
-                      // etc.
-    CODE_SIZE = 2;    // Use ReflectionOps to implement these methods.
-    LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
-  }
-  optional OptimizeMode optimize_for = 9 [default=SPEED];
-
-  // Sets the Go package where structs generated from this .proto will be
-  // placed.  There is no default.
-  optional string go_package = 11;
-
-
-
-  // Should generic services be generated in each language?  "Generic" services
-  // are not specific to any particular RPC system.  They are generated by the
-  // main code generators in each language (without additional plugins).
-  // Generic services were the only kind of service generation supported by
-  // early versions of proto2.
-  //
-  // Generic services are now considered deprecated in favor of using plugins
-  // that generate code specific to your particular RPC system.  Therefore,
-  // these default to false.  Old code which depends on generic services should
-  // explicitly set them to true.
-  optional bool cc_generic_services = 16 [default=false];
-  optional bool java_generic_services = 17 [default=false];
-  optional bool py_generic_services = 18 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message MessageOptions {
-  // Set true to use the old proto1 MessageSet wire format for extensions.
-  // This is provided for backwards-compatibility with the MessageSet wire
-  // format.  You should not use this for any other reason:  It's less
-  // efficient, has fewer features, and is more complicated.
-  //
-  // The message must be defined exactly as follows:
-  //   message Foo {
-  //     option message_set_wire_format = true;
-  //     extensions 4 to max;
-  //   }
-  // Note that the message cannot have any defined fields; MessageSets only
-  // have extensions.
-  //
-  // All extensions of your type must be singular messages; e.g. they cannot
-  // be int32s, enums, or repeated messages.
-  //
-  // Because this is an option, the above two restrictions are not enforced by
-  // the protocol compiler.
-  optional bool message_set_wire_format = 1 [default=false];
-
-  // Disables the generation of the standard "descriptor()" accessor, which can
-  // conflict with a field of the same name.  This is meant to make migration
-  // from proto1 easier; new code should avoid fields named "descriptor".
-  optional bool no_standard_descriptor_accessor = 2 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message FieldOptions {
-  // The ctype option instructs the C++ code generator to use a different
-  // representation of the field than it normally would.  See the specific
-  // options below.  This option is not yet implemented in the open source
-  // release -- sorry, we'll try to include it in a future version!
-  optional CType ctype = 1 [default = STRING];
-  enum CType {
-    // Default mode.
-    STRING = 0;
-
-    CORD = 1;
-
-    STRING_PIECE = 2;
-  }
-  // The packed option can be enabled for repeated primitive fields to enable
-  // a more efficient representation on the wire. Rather than repeatedly
-  // writing the tag and type for each element, the entire array is encoded as
-  // a single length-delimited blob.
-  optional bool packed = 2;
-
-
-
-  // Should this field be parsed lazily?  Lazy applies only to message-type
-  // fields.  It means that when the outer message is initially parsed, the
-  // inner message's contents will not be parsed but instead stored in encoded
-  // form.  The inner message will actually be parsed when it is first accessed.
-  //
-  // This is only a hint.  Implementations are free to choose whether to use
-  // eager or lazy parsing regardless of the value of this option.  However,
-  // setting this option true suggests that the protocol author believes that
-  // using lazy parsing on this field is worth the additional bookkeeping
-  // overhead typically needed to implement it.
-  //
-  // This option does not affect the public interface of any generated code;
-  // all method signatures remain the same.  Furthermore, thread-safety of the
-  // interface is not affected by this option; const methods remain safe to
-  // call from multiple threads concurrently, while non-const methods continue
-  // to require exclusive access.
-  //
-  //
-  // Note that implementations may choose not to check required fields within
-  // a lazy sub-message.  That is, calling IsInitialized() on the outher message
-  // may return true even if the inner message has missing required fields.
-  // This is necessary because otherwise the inner message would have to be
-  // parsed in order to perform the check, defeating the purpose of lazy
-  // parsing.  An implementation which chooses not to check required fields
-  // must be consistent about it.  That is, for any particular sub-message, the
-  // implementation must either *always* check its required fields, or *never*
-  // check its required fields, regardless of whether or not the message has
-  // been parsed.
-  optional bool lazy = 5 [default=false];
-
-  // Is this field deprecated?
-  // Depending on the target platform, this can emit Deprecated annotations
-  // for accessors, or it will be completely ignored; in the very least, this
-  // is a formalization for deprecating fields.
-  optional bool deprecated = 3 [default=false];
-
-  // EXPERIMENTAL.  DO NOT USE.
-  // For "map" fields, the name of the field in the enclosed type that
-  // is the key for this map.  For example, suppose we have:
-  //   message Item {
-  //     required string name = 1;
-  //     required string value = 2;
-  //   }
-  //   message Config {
-  //     repeated Item items = 1 [experimental_map_key="name"];
-  //   }
-  // In this situation, the map key for Item will be set to "name".
-  // TODO: Fully-implement this, then remove the "experimental_" prefix.
-  optional string experimental_map_key = 9;
-
-  // For Google-internal migration only. Do not use.
-  optional bool weak = 10 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message EnumOptions {
-
-  // Set this option to false to disallow mapping different tag names to a same
-  // value.
-  optional bool allow_alias = 2 [default=true];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message EnumValueOptions {
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message ServiceOptions {
-
-  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-  //   framework.  We apologize for hoarding these numbers to ourselves, but
-  //   we were already using them long before we decided to release Protocol
-  //   Buffers.
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message MethodOptions {
-
-  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-  //   framework.  We apologize for hoarding these numbers to ourselves, but
-  //   we were already using them long before we decided to release Protocol
-  //   Buffers.
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-
-// A message representing a option the parser does not recognize. This only
-// appears in options protos created by the compiler::Parser class.
-// DescriptorPool resolves these when building Descriptor objects. Therefore,
-// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-// in them.
-message UninterpretedOption {
-  // The name of the uninterpreted option.  Each string represents a segment in
-  // a dot-separated name.  is_extension is true iff a segment represents an
-  // extension (denoted with parentheses in options specs in .proto files).
-  // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
-  // "foo.(bar.baz).qux".
-  message NamePart {
-    required string name_part = 1;
-    required bool is_extension = 2;
-  }
-  repeated NamePart name = 2;
-
-  // The value of the uninterpreted option, in whatever type the tokenizer
-  // identified it as during parsing. Exactly one of these should be set.
-  optional string identifier_value = 3;
-  optional uint64 positive_int_value = 4;
-  optional int64 negative_int_value = 5;
-  optional double double_value = 6;
-  optional bytes string_value = 7;
-  optional string aggregate_value = 8;
-}
-
-// ===================================================================
-// Optional source code info
-
-// Encapsulates information about the original source file from which a
-// FileDescriptorProto was generated.
-message SourceCodeInfo {
-  // A Location identifies a piece of source code in a .proto file which
-  // corresponds to a particular definition.  This information is intended
-  // to be useful to IDEs, code indexers, documentation generators, and similar
-  // tools.
-  //
-  // For example, say we have a file like:
-  //   message Foo {
-  //     optional string foo = 1;
-  //   }
-  // Let's look at just the field definition:
-  //   optional string foo = 1;
-  //   ^       ^^     ^^  ^  ^^^
-  //   a       bc     de  f  ghi
-  // We have the following locations:
-  //   span   path               represents
-  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-  //
-  // Notes:
-  // - A location may refer to a repeated field itself (i.e. not to any
-  //   particular index within it).  This is used whenever a set of elements are
-  //   logically enclosed in a single code segment.  For example, an entire
-  //   extend block (possibly containing multiple extension definitions) will
-  //   have an outer location whose path refers to the "extensions" repeated
-  //   field without an index.
-  // - Multiple locations may have the same path.  This happens when a single
-  //   logical declaration is spread out across multiple places.  The most
-  //   obvious example is the "extend" block again -- there may be multiple
-  //   extend blocks in the same scope, each of which will have the same path.
-  // - A location's span is not always a subset of its parent's span.  For
-  //   example, the "extendee" of an extension declaration appears at the
-  //   beginning of the "extend" block and is shared by all extensions within
-  //   the block.
-  // - Just because a location's span is a subset of some other location's span
-  //   does not mean that it is a descendent.  For example, a "group" defines
-  //   both a type and a field in a single declaration.  Thus, the locations
-  //   corresponding to the type and field and their components will overlap.
-  // - Code which tries to interpret locations should probably be designed to
-  //   ignore those that it doesn't understand, as more types of locations could
-  //   be recorded in the future.
-  repeated Location location = 1;
-  message Location {
-    // Identifies which part of the FileDescriptorProto was defined at this
-    // location.
-    //
-    // Each element is a field number or an index.  They form a path from
-    // the root FileDescriptorProto to the place where the definition.  For
-    // example, this path:
-    //   [ 4, 3, 2, 7, 1 ]
-    // refers to:
-    //   file.message_type(3)  // 4, 3
-    //       .field(7)         // 2, 7
-    //       .name()           // 1
-    // This is because FileDescriptorProto.message_type has field number 4:
-    //   repeated DescriptorProto message_type = 4;
-    // and DescriptorProto.field has field number 2:
-    //   repeated FieldDescriptorProto field = 2;
-    // and FieldDescriptorProto.name has field number 1:
-    //   optional string name = 1;
-    //
-    // Thus, the above path gives the location of a field name.  If we removed
-    // the last element:
-    //   [ 4, 3, 2, 7 ]
-    // this path refers to the whole field declaration (from the beginning
-    // of the label to the terminating semicolon).
-    repeated int32 path = 1 [packed=true];
-
-    // Always has exactly three or four elements: start line, start column,
-    // end line (optional, otherwise assumed same as start line), end column.
-    // These are packed into a single field for efficiency.  Note that line
-    // and column numbers are zero-based -- typically you will want to add
-    // 1 to each before displaying to a user.
-    repeated int32 span = 2 [packed=true];
-
-    // If this SourceCodeInfo represents a complete declaration, these are any
-    // comments appearing before and after the declaration which appear to be
-    // attached to the declaration.
-    //
-    // A series of line comments appearing on consecutive lines, with no other
-    // tokens appearing on those lines, will be treated as a single comment.
-    //
-    // Only the comment content is provided; comment markers (e.g. //) are
-    // stripped out.  For block comments, leading whitespace and an asterisk
-    // will be stripped from the beginning of each line other than the first.
-    // Newlines are included in the output.
-    //
-    // Examples:
-    //
-    //   optional int32 foo = 1;  // Comment attached to foo.
-    //   // Comment attached to bar.
-    //   optional int32 bar = 2;
-    //
-    //   optional string baz = 3;
-    //   // Comment attached to baz.
-    //   // Another line attached to baz.
-    //
-    //   // Comment attached to qux.
-    //   //
-    //   // Another line attached to qux.
-    //   optional double qux = 4;
-    //
-    //   optional string corge = 5;
-    //   /* Block comment attached
-    //    * to corge.  Leading asterisks
-    //    * will be removed. */
-    //   /* Block comment attached to
-    //    * grault. */
-    //   optional int32 grault = 6;
-    optional string leading_comments = 3;
-    optional string trailing_comments = 4;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest.proto
deleted file mode 100644
index 6eb2d86..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest.proto
+++ /dev/null
@@ -1,719 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;     // auto-added
-
-import "google/protobuf/unittest_import.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestProto";
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-message TestAllTypes {
-  message NestedMessage {
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    optional int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-  }
-
-  // Singular
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional NestedMessage                        optional_nested_message  = 18;
-  optional ForeignMessage                       optional_foreign_message = 19;
-  optional protobuf_unittest_import.ImportMessage optional_import_message  = 20;
-
-  optional NestedEnum                           optional_nested_enum     = 21;
-  optional ForeignEnum                          optional_foreign_enum    = 22;
-  optional protobuf_unittest_import.ImportEnum    optional_import_enum     = 23;
-
-  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
-  optional string optional_cord = 25 [ctype=CORD];
-
-  // Defined in unittest_import_public.proto
-  optional protobuf_unittest_import.PublicImportMessage
-      optional_public_import_message = 26;
-
-  optional NestedMessage optional_lazy_message = 27 [lazy=true];
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated NestedMessage                        repeated_nested_message  = 48;
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
-
-  repeated NestedEnum                           repeated_nested_enum     = 51;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32    = 61 [default =  41    ];
-  optional    int64 default_int64    = 62 [default =  42    ];
-  optional   uint32 default_uint32   = 63 [default =  43    ];
-  optional   uint64 default_uint64   = 64 [default =  44    ];
-  optional   sint32 default_sint32   = 65 [default = -45    ];
-  optional   sint64 default_sint64   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
-  optional    float default_float    = 71 [default =  51.5  ];
-  optional   double default_double   = 72 [default =  52e3  ];
-  optional     bool default_bool     = 73 [default = true   ];
-  optional   string default_string   = 74 [default = "hello"];
-  optional    bytes default_bytes    = 75 [default = "world"];
-
-  optional NestedEnum  default_nested_enum  = 81 [default = BAR        ];
-  optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
-  optional protobuf_unittest_import.ImportEnum
-      default_import_enum = 83 [default = IMPORT_BAR];
-
-  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
-  optional string default_cord = 85 [ctype=CORD,default="123"];
-}
-
-message TestDeprecatedFields {
-  optional int32 deprecated_int32 = 1 [deprecated=true];
-}
-
-// Define these after TestAllTypes to make sure the compiler can handle
-// that.
-message ForeignMessage {
-  optional int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestAllExtensions {
-  extensions 1 to max;
-}
-
-extend TestAllExtensions {
-  // Singular
-  optional    int32 optional_int32_extension    =  1;
-  optional    int64 optional_int64_extension    =  2;
-  optional   uint32 optional_uint32_extension   =  3;
-  optional   uint64 optional_uint64_extension   =  4;
-  optional   sint32 optional_sint32_extension   =  5;
-  optional   sint64 optional_sint64_extension   =  6;
-  optional  fixed32 optional_fixed32_extension  =  7;
-  optional  fixed64 optional_fixed64_extension  =  8;
-  optional sfixed32 optional_sfixed32_extension =  9;
-  optional sfixed64 optional_sfixed64_extension = 10;
-  optional    float optional_float_extension    = 11;
-  optional   double optional_double_extension   = 12;
-  optional     bool optional_bool_extension     = 13;
-  optional   string optional_string_extension   = 14;
-  optional    bytes optional_bytes_extension    = 15;
-
-  optional group OptionalGroup_extension = 16 {
-    optional int32 a = 17;
-  }
-
-  optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;
-  optional ForeignMessage optional_foreign_message_extension = 19;
-  optional protobuf_unittest_import.ImportMessage
-    optional_import_message_extension = 20;
-
-  optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;
-  optional ForeignEnum optional_foreign_enum_extension = 22;
-  optional protobuf_unittest_import.ImportEnum
-    optional_import_enum_extension = 23;
-
-  optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];
-  optional string optional_cord_extension = 25 [ctype=CORD];
-
-  optional protobuf_unittest_import.PublicImportMessage
-    optional_public_import_message_extension = 26;
-
-  optional TestAllTypes.NestedMessage
-    optional_lazy_message_extension = 27 [lazy=true];
-
-  // Repeated
-  repeated    int32 repeated_int32_extension    = 31;
-  repeated    int64 repeated_int64_extension    = 32;
-  repeated   uint32 repeated_uint32_extension   = 33;
-  repeated   uint64 repeated_uint64_extension   = 34;
-  repeated   sint32 repeated_sint32_extension   = 35;
-  repeated   sint64 repeated_sint64_extension   = 36;
-  repeated  fixed32 repeated_fixed32_extension  = 37;
-  repeated  fixed64 repeated_fixed64_extension  = 38;
-  repeated sfixed32 repeated_sfixed32_extension = 39;
-  repeated sfixed64 repeated_sfixed64_extension = 40;
-  repeated    float repeated_float_extension    = 41;
-  repeated   double repeated_double_extension   = 42;
-  repeated     bool repeated_bool_extension     = 43;
-  repeated   string repeated_string_extension   = 44;
-  repeated    bytes repeated_bytes_extension    = 45;
-
-  repeated group RepeatedGroup_extension = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;
-  repeated ForeignMessage repeated_foreign_message_extension = 49;
-  repeated protobuf_unittest_import.ImportMessage
-    repeated_import_message_extension = 50;
-
-  repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;
-  repeated ForeignEnum repeated_foreign_enum_extension = 52;
-  repeated protobuf_unittest_import.ImportEnum
-    repeated_import_enum_extension = 53;
-
-  repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord_extension = 55 [ctype=CORD];
-
-  repeated TestAllTypes.NestedMessage
-    repeated_lazy_message_extension = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32_extension    = 61 [default =  41    ];
-  optional    int64 default_int64_extension    = 62 [default =  42    ];
-  optional   uint32 default_uint32_extension   = 63 [default =  43    ];
-  optional   uint64 default_uint64_extension   = 64 [default =  44    ];
-  optional   sint32 default_sint32_extension   = 65 [default = -45    ];
-  optional   sint64 default_sint64_extension   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32_extension  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64_extension  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32_extension = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64_extension = 70 [default = -50    ];
-  optional    float default_float_extension    = 71 [default =  51.5  ];
-  optional   double default_double_extension   = 72 [default =  52e3  ];
-  optional     bool default_bool_extension     = 73 [default = true   ];
-  optional   string default_string_extension   = 74 [default = "hello"];
-  optional    bytes default_bytes_extension    = 75 [default = "world"];
-
-  optional TestAllTypes.NestedEnum
-    default_nested_enum_extension = 81 [default = BAR];
-  optional ForeignEnum
-    default_foreign_enum_extension = 82 [default = FOREIGN_BAR];
-  optional protobuf_unittest_import.ImportEnum
-    default_import_enum_extension = 83 [default = IMPORT_BAR];
-
-  optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,
-                                                       default="abc"];
-  optional string default_cord_extension = 85 [ctype=CORD, default="123"];
-}
-
-message TestNestedExtension {
-  extend TestAllExtensions {
-    // Check for bug where string extensions declared in tested scope did not
-    // compile.
-    optional string test = 1002 [default="test"];
-  }
-}
-
-// We have separate messages for testing required fields because it's
-// annoying to have to fill in required fields in TestProto in order to
-// do anything with it.  Note that we don't need to test every type of
-// required filed because the code output is basically identical to
-// optional fields for all types.
-message TestRequired {
-  required int32 a = 1;
-  optional int32 dummy2 = 2;
-  required int32 b = 3;
-
-  extend TestAllExtensions {
-    optional TestRequired single = 1000;
-    repeated TestRequired multi  = 1001;
-  }
-
-  // Pad the field count to 32 so that we can test that IsInitialized()
-  // properly checks multiple elements of has_bits_.
-  optional int32 dummy4  =  4;
-  optional int32 dummy5  =  5;
-  optional int32 dummy6  =  6;
-  optional int32 dummy7  =  7;
-  optional int32 dummy8  =  8;
-  optional int32 dummy9  =  9;
-  optional int32 dummy10 = 10;
-  optional int32 dummy11 = 11;
-  optional int32 dummy12 = 12;
-  optional int32 dummy13 = 13;
-  optional int32 dummy14 = 14;
-  optional int32 dummy15 = 15;
-  optional int32 dummy16 = 16;
-  optional int32 dummy17 = 17;
-  optional int32 dummy18 = 18;
-  optional int32 dummy19 = 19;
-  optional int32 dummy20 = 20;
-  optional int32 dummy21 = 21;
-  optional int32 dummy22 = 22;
-  optional int32 dummy23 = 23;
-  optional int32 dummy24 = 24;
-  optional int32 dummy25 = 25;
-  optional int32 dummy26 = 26;
-  optional int32 dummy27 = 27;
-  optional int32 dummy28 = 28;
-  optional int32 dummy29 = 29;
-  optional int32 dummy30 = 30;
-  optional int32 dummy31 = 31;
-  optional int32 dummy32 = 32;
-
-  required int32 c = 33;
-}
-
-message TestRequiredForeign {
-  optional TestRequired optional_message = 1;
-  repeated TestRequired repeated_message = 2;
-  optional int32 dummy = 3;
-}
-
-// Test that we can use NestedMessage from outside TestAllTypes.
-message TestForeignNested {
-  optional TestAllTypes.NestedMessage foreign_nested = 1;
-}
-
-// TestEmptyMessage is used to test unknown field support.
-message TestEmptyMessage {
-}
-
-// Like above, but declare all field numbers as potential extensions.  No
-// actual extensions should ever be defined for this type.
-message TestEmptyMessageWithExtensions {
-  extensions 1 to max;
-}
-
-message TestMultipleExtensionRanges {
-  extensions 42;
-  extensions 4143 to 4243;
-  extensions 65536 to max;
-}
-
-// Test that really large tag numbers don't break anything.
-message TestReallyLargeTagNumber {
-  // The largest possible tag number is 2^28 - 1, since the wire format uses
-  // three bits to communicate wire type.
-  optional int32 a = 1;
-  optional int32 bb = 268435455;
-}
-
-message TestRecursiveMessage {
-  optional TestRecursiveMessage a = 1;
-  optional int32 i = 2;
-}
-
-// Test that mutual recursion works.
-message TestMutualRecursionA {
-  optional TestMutualRecursionB bb = 1;
-}
-
-message TestMutualRecursionB {
-  optional TestMutualRecursionA a = 1;
-  optional int32 optional_int32 = 2;
-}
-
-// Test that groups have disjoint field numbers from their siblings and
-// parents.  This is NOT possible in proto1; only proto2.  When attempting
-// to compile with proto1, this will emit an error; so we only include it
-// in protobuf_unittest_proto.
-message TestDupFieldNumber {                        // NO_PROTO1
-  optional int32 a = 1;                             // NO_PROTO1
-  optional group Foo = 2 { optional int32 a = 1; }  // NO_PROTO1
-  optional group Bar = 3 { optional int32 a = 1; }  // NO_PROTO1
-}                                                   // NO_PROTO1
-
-// Additional messages for testing lazy fields.
-message TestEagerMessage {
-  optional TestAllTypes sub_message = 1 [lazy=false];
-}
-message TestLazyMessage {
-  optional TestAllTypes sub_message = 1 [lazy=true];
-}
-
-// Needed for a Python test.
-message TestNestedMessageHasBits {
-  message NestedMessage {
-    repeated int32 nestedmessage_repeated_int32 = 1;
-    repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2;
-  }
-  optional NestedMessage optional_nested_message = 1;
-}
-
-
-// Test an enum that has multiple values with the same number.
-enum TestEnumWithDupValue {
-  option allow_alias = true;
-  FOO1 = 1;
-  BAR1 = 2;
-  BAZ = 3;
-  FOO2 = 1;
-  BAR2 = 2;
-}
-
-// Test an enum with large, unordered values.
-enum TestSparseEnum {
-  SPARSE_A = 123;
-  SPARSE_B = 62374;
-  SPARSE_C = 12589234;
-  SPARSE_D = -15;
-  SPARSE_E = -53452;
-  SPARSE_F = 0;
-  SPARSE_G = 2;
-}
-
-// Test message with CamelCase field names.  This violates Protocol Buffer
-// standard style.
-message TestCamelCaseFieldNames {
-  optional int32 PrimitiveField = 1;
-  optional string StringField = 2;
-  optional ForeignEnum EnumField = 3;
-  optional ForeignMessage MessageField = 4;
-  optional string StringPieceField = 5 [ctype=STRING_PIECE];
-  optional string CordField = 6 [ctype=CORD];
-
-  repeated int32 RepeatedPrimitiveField = 7;
-  repeated string RepeatedStringField = 8;
-  repeated ForeignEnum RepeatedEnumField = 9;
-  repeated ForeignMessage RepeatedMessageField = 10;
-  repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];
-  repeated string RepeatedCordField = 12 [ctype=CORD];
-}
-
-
-// We list fields out of order, to ensure that we're using field number and not
-// field index to determine serialization order.
-message TestFieldOrderings {
-  optional string my_string = 11;
-  extensions 2 to 10;
-  optional int64 my_int = 1;
-  extensions 12 to 100;
-  optional float my_float = 101;
-}
-
-
-extend TestFieldOrderings {
-  optional string my_extension_string = 50;
-  optional int32 my_extension_int = 5;
-}
-
-
-message TestExtremeDefaultValues {
-  optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"];
-  optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF];
-  optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF];
-  optional  int32 small_int32  = 4 [default = -0x7FFFFFFF];
-  optional  int64 small_int64  = 5 [default = -0x7FFFFFFFFFFFFFFF];
-  optional  int32 really_small_int32 = 21 [default = -0x80000000];
-  optional  int64 really_small_int64 = 22 [default = -0x8000000000000000];
-
-  // The default value here is UTF-8 for "\u1234".  (We could also just type
-  // the UTF-8 text directly into this text file rather than escape it, but
-  // lots of people use editors that would be confused by this.)
-  optional string utf8_string = 6 [default = "\341\210\264"];
-
-  // Tests for single-precision floating-point values.
-  optional float zero_float = 7 [default = 0];
-  optional float one_float = 8 [default = 1];
-  optional float small_float = 9 [default = 1.5];
-  optional float negative_one_float = 10 [default = -1];
-  optional float negative_float = 11 [default = -1.5];
-  // Using exponents
-  optional float large_float = 12 [default = 2E8];
-  optional float small_negative_float = 13 [default = -8e-28];
-
-  // Text for nonfinite floating-point values.
-  optional double inf_double = 14 [default = inf];
-  optional double neg_inf_double = 15 [default = -inf];
-  optional double nan_double = 16 [default = nan];
-  optional float inf_float = 17 [default = inf];
-  optional float neg_inf_float = 18 [default = -inf];
-  optional float nan_float = 19 [default = nan];
-
-  // Tests for C++ trigraphs.
-  // Trigraphs should be escaped in C++ generated files, but they should not be
-  // escaped for other languages.
-  // Note that in .proto file, "\?" is a valid way to escape ? in string
-  // literals.
-  optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"];
-
-  // String defaults containing the character '\000'
-  optional string string_with_zero       = 23 [default = "hel\000lo"];
-  optional  bytes bytes_with_zero        = 24 [default = "wor\000ld"];
-  optional string string_piece_with_zero = 25 [ctype=STRING_PIECE,
-                                               default="ab\000c"];
-  optional string cord_with_zero         = 26 [ctype=CORD,
-                                               default="12\0003"];
-}
-
-message SparseEnumMessage {
-  optional TestSparseEnum sparse_enum = 1;
-}
-
-// Test String and Bytes: string is for valid UTF-8 strings
-message OneString {
-  optional string data = 1;
-}
-
-message MoreString {
-  repeated string data = 1;
-}
-
-message OneBytes {
-  optional bytes data = 1;
-}
-
-message MoreBytes {
-  repeated bytes data = 1;
-}
-
-
-// Test messages for packed fields
-
-message TestPackedTypes {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnum packed_enum  = 103 [packed = true];
-}
-
-// A message with the same fields as TestPackedTypes, but without packing. Used
-// to test packed <-> unpacked wire compatibility.
-message TestUnpackedTypes {
-  repeated    int32 unpacked_int32    =  90 [packed = false];
-  repeated    int64 unpacked_int64    =  91 [packed = false];
-  repeated   uint32 unpacked_uint32   =  92 [packed = false];
-  repeated   uint64 unpacked_uint64   =  93 [packed = false];
-  repeated   sint32 unpacked_sint32   =  94 [packed = false];
-  repeated   sint64 unpacked_sint64   =  95 [packed = false];
-  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
-  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
-  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
-  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
-  repeated    float unpacked_float    = 100 [packed = false];
-  repeated   double unpacked_double   = 101 [packed = false];
-  repeated     bool unpacked_bool     = 102 [packed = false];
-  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
-}
-
-message TestPackedExtensions {
-  extensions 1 to max;
-}
-
-extend TestPackedExtensions {
-  repeated    int32 packed_int32_extension    =  90 [packed = true];
-  repeated    int64 packed_int64_extension    =  91 [packed = true];
-  repeated   uint32 packed_uint32_extension   =  92 [packed = true];
-  repeated   uint64 packed_uint64_extension   =  93 [packed = true];
-  repeated   sint32 packed_sint32_extension   =  94 [packed = true];
-  repeated   sint64 packed_sint64_extension   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32_extension  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64_extension  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32_extension =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64_extension =  99 [packed = true];
-  repeated    float packed_float_extension    = 100 [packed = true];
-  repeated   double packed_double_extension   = 101 [packed = true];
-  repeated     bool packed_bool_extension     = 102 [packed = true];
-  repeated ForeignEnum packed_enum_extension  = 103 [packed = true];
-}
-
-// Used by ExtensionSetTest/DynamicExtensions.  The test actually builds
-// a set of extensions to TestAllExtensions dynamically, based on the fields
-// of this message type.
-message TestDynamicExtensions {
-  enum DynamicEnumType {
-    DYNAMIC_FOO = 2200;
-    DYNAMIC_BAR = 2201;
-    DYNAMIC_BAZ = 2202;
-  }
-  message DynamicMessageType {
-    optional int32 dynamic_field = 2100;
-  }
-
-  optional fixed32 scalar_extension = 2000;
-  optional ForeignEnum enum_extension = 2001;
-  optional DynamicEnumType dynamic_enum_extension = 2002;
-
-  optional ForeignMessage message_extension = 2003;
-  optional DynamicMessageType dynamic_message_extension = 2004;
-
-  repeated string repeated_extension = 2005;
-  repeated sint32 packed_extension = 2006 [packed = true];
-}
-
-message TestRepeatedScalarDifferentTagSizes {
-  // Parsing repeated fixed size values used to fail. This message needs to be
-  // used in order to get a tag of the right size; all of the repeated fields
-  // in TestAllTypes didn't trigger the check.
-  repeated fixed32 repeated_fixed32 = 12;
-  // Check for a varint type, just for good measure.
-  repeated int32   repeated_int32   = 13;
-
-  // These have two-byte tags.
-  repeated fixed64 repeated_fixed64 = 2046;
-  repeated int64   repeated_int64   = 2047;
-
-  // Three byte tags.
-  repeated float   repeated_float   = 262142;
-  repeated uint64  repeated_uint64  = 262143;
-}
-
-// Test that if an optional or required message/group field appears multiple
-// times in the input, they need to be merged.
-message TestParsingMerge {
-  // RepeatedFieldsGenerator defines matching field types as TestParsingMerge,
-  // except that all fields are repeated. In the tests, we will serialize the
-  // RepeatedFieldsGenerator to bytes, and parse the bytes to TestParsingMerge.
-  // Repeated fields in RepeatedFieldsGenerator are expected to be merged into
-  // the corresponding required/optional fields in TestParsingMerge.
-  message RepeatedFieldsGenerator {
-    repeated TestAllTypes field1 = 1;
-    repeated TestAllTypes field2 = 2;
-    repeated TestAllTypes field3 = 3;
-    repeated group Group1 = 10 {
-      optional TestAllTypes field1 = 11;
-    }
-    repeated group Group2 = 20 {
-      optional TestAllTypes field1 = 21;
-    }
-    repeated TestAllTypes ext1 = 1000;
-    repeated TestAllTypes ext2 = 1001;
-  }
-  required TestAllTypes required_all_types = 1;
-  optional TestAllTypes optional_all_types = 2;
-  repeated TestAllTypes repeated_all_types = 3;
-  optional group OptionalGroup = 10 {
-    optional TestAllTypes optional_group_all_types = 11;
-  }
-  repeated group RepeatedGroup = 20 {
-    optional TestAllTypes repeated_group_all_types = 21;
-  }
-  extensions 1000 to max;
-  extend TestParsingMerge {
-    optional TestAllTypes optional_ext = 1000;
-    repeated TestAllTypes repeated_ext = 1001;
-  }
-}
-
-message TestCommentInjectionMessage {
-  // */ <- This should not close the generated doc comment
-  optional string a = 1 [default="*/ <- Neither should this."];
-}
-
-
-// Test that RPC services work.
-message FooRequest  {}
-message FooResponse {}
-
-message FooClientMessage {}
-message FooServerMessage{}
-
-service TestService {
-  rpc Foo(FooRequest) returns (FooResponse);
-  rpc Bar(BarRequest) returns (BarResponse);
-}
-
-
-message BarRequest  {}
-message BarResponse {}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_custom_options.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_custom_options.proto
deleted file mode 100644
index e591d29..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_custom_options.proto
+++ /dev/null
@@ -1,387 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: benjy@google.com (Benjy Weinberger)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file used to test the "custom options" feature of proto2.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;
-
-// A custom file option (defined below).
-option (file_opt1) = 9876543210;
-
-import "google/protobuf/descriptor.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-package protobuf_unittest;
-
-
-// Some simple test custom options of various types.
-
-extend google.protobuf.FileOptions {
-  optional uint64 file_opt1 = 7736974;
-}
-
-extend google.protobuf.MessageOptions {
-  optional int32 message_opt1 = 7739036;
-}
-
-extend google.protobuf.FieldOptions {
-  optional fixed64 field_opt1 = 7740936;
-  // This is useful for testing that we correctly register default values for
-  // extension options.
-  optional int32 field_opt2 = 7753913 [default=42];
-}
-
-extend google.protobuf.EnumOptions {
-  optional sfixed32 enum_opt1 = 7753576;
-}
-
-extend google.protobuf.EnumValueOptions {
-  optional int32 enum_value_opt1 = 1560678;
-}
-
-extend google.protobuf.ServiceOptions {
-  optional sint64 service_opt1 = 7887650;
-}
-
-enum MethodOpt1 {
-  METHODOPT1_VAL1 = 1;
-  METHODOPT1_VAL2 = 2;
-}
-
-extend google.protobuf.MethodOptions {
-  optional MethodOpt1 method_opt1 = 7890860;
-}
-
-// A test message with custom options at all possible locations (and also some
-// regular options, to make sure they interact nicely).
-message TestMessageWithCustomOptions {
-  option message_set_wire_format = false;
-
-  option (message_opt1) = -56;
-
-  optional string field1 = 1 [ctype=CORD,
-                              (field_opt1)=8765432109];
-
-  enum AnEnum {
-    option (enum_opt1) = -789;
-
-    ANENUM_VAL1 = 1;
-    ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
-  }
-}
-
-
-// A test RPC service with custom options at all possible locations (and also
-// some regular options, to make sure they interact nicely).
-message CustomOptionFooRequest {
-}
-
-message CustomOptionFooResponse {
-}
-
-message CustomOptionFooClientMessage {
-}
-
-message CustomOptionFooServerMessage {
-}
-
-service TestServiceWithCustomOptions {
-  option (service_opt1) = -9876543210;
-
-  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
-    option (method_opt1) = METHODOPT1_VAL2;
-  }
-}
-
-
-
-// Options of every possible field type, so we can test them all exhaustively.
-
-message DummyMessageContainingEnum {
-  enum TestEnumType {
-    TEST_OPTION_ENUM_TYPE1 = 22;
-    TEST_OPTION_ENUM_TYPE2 = -23;
-  }
-}
-
-message DummyMessageInvalidAsOptionType {
-}
-
-extend google.protobuf.MessageOptions {
-  optional         bool     bool_opt = 7706090;
-  optional        int32    int32_opt = 7705709;
-  optional        int64    int64_opt = 7705542;
-  optional       uint32   uint32_opt = 7704880;
-  optional       uint64   uint64_opt = 7702367;
-  optional       sint32   sint32_opt = 7701568;
-  optional       sint64   sint64_opt = 7700863;
-  optional      fixed32  fixed32_opt = 7700307;
-  optional      fixed64  fixed64_opt = 7700194;
-  optional     sfixed32 sfixed32_opt = 7698645;
-  optional     sfixed64 sfixed64_opt = 7685475;
-  optional        float    float_opt = 7675390;
-  optional       double   double_opt = 7673293;
-  optional       string   string_opt = 7673285;
-  optional        bytes    bytes_opt = 7673238;
-  optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;
-  optional DummyMessageInvalidAsOptionType message_type_opt = 7665967;
-}
-
-message CustomOptionMinIntegerValues {
-  option     (bool_opt) = false;
-  option    (int32_opt) = -0x80000000;
-  option    (int64_opt) = -0x8000000000000000;
-  option   (uint32_opt) = 0;
-  option   (uint64_opt) = 0;
-  option   (sint32_opt) = -0x80000000;
-  option   (sint64_opt) = -0x8000000000000000;
-  option  (fixed32_opt) = 0;
-  option  (fixed64_opt) = 0;
-  option (sfixed32_opt) = -0x80000000;
-  option (sfixed64_opt) = -0x8000000000000000;
-}
-
-message CustomOptionMaxIntegerValues {
-  option     (bool_opt) = true;
-  option    (int32_opt) = 0x7FFFFFFF;
-  option    (int64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option   (uint32_opt) = 0xFFFFFFFF;
-  option   (uint64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option   (sint32_opt) = 0x7FFFFFFF;
-  option   (sint64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option  (fixed32_opt) = 0xFFFFFFFF;
-  option  (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option (sfixed32_opt) = 0x7FFFFFFF;
-  option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;
-}
-
-message CustomOptionOtherValues {
-  option  (int32_opt) = -100;  // To test sign-extension.
-  option  (float_opt) = 12.3456789;
-  option (double_opt) = 1.234567890123456789;
-  option (string_opt) = "Hello, \"World\"";
-  option  (bytes_opt) = "Hello\0World";
-  option   (enum_opt) = TEST_OPTION_ENUM_TYPE2;
-}
-
-message SettingRealsFromPositiveInts {
-  option  (float_opt) = 12;
-  option (double_opt) = 154;
-}
-
-message SettingRealsFromNegativeInts {
-  option  (float_opt) = -12;
-  option  (double_opt) = -154;
-}
-
-// Options of complex message types, themselves combined and extended in
-// various ways.
-
-message ComplexOptionType1 {
-  optional int32 foo = 1;
-  optional int32 foo2 = 2;
-  optional int32 foo3 = 3;
-
-  extensions 100 to max;
-}
-
-message ComplexOptionType2 {
-  optional ComplexOptionType1 bar = 1;
-  optional int32 baz = 2;
-
-  message ComplexOptionType4 {
-    optional int32 waldo = 1;
-
-    extend google.protobuf.MessageOptions {
-      optional ComplexOptionType4 complex_opt4 = 7633546;
-    }
-  }
-
-  optional ComplexOptionType4 fred = 3;
-
-  extensions 100 to max;
-}
-
-message ComplexOptionType3 {
-  optional int32 qux = 1;
-
-  optional group ComplexOptionType5 = 2 {
-    optional int32 plugh = 3;
-  }
-}
-
-extend ComplexOptionType1 {
-  optional int32 quux = 7663707;
-  optional ComplexOptionType3 corge = 7663442;
-}
-
-extend ComplexOptionType2 {
-  optional int32 grault = 7650927;
-  optional ComplexOptionType1 garply = 7649992;
-}
-
-extend google.protobuf.MessageOptions {
-  optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;
-  optional ComplexOptionType2 complex_opt2 = 7636949;
-  optional ComplexOptionType3 complex_opt3 = 7636463;
-  optional group ComplexOpt6 = 7595468 {
-    optional int32 xyzzy = 7593951;
-  }
-}
-
-// Note that we try various different ways of naming the same extension.
-message VariousComplexOptions {
-  option (.protobuf_unittest.complex_opt1).foo = 42;
-  option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324;
-  option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876;
-  option (complex_opt2).baz = 987;
-  option (complex_opt2).(grault) = 654;
-  option (complex_opt2).bar.foo = 743;
-  option (complex_opt2).bar.(quux) = 1999;
-  option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008;
-  option (complex_opt2).(garply).foo = 741;
-  option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998;
-  option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121;
-  option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
-  option (complex_opt2).fred.waldo = 321;
-  option (protobuf_unittest.complex_opt3).qux = 9;
-  option (complex_opt3).complexoptiontype5.plugh = 22;
-  option (complexopt6).xyzzy = 24;
-}
-
-// ------------------------------------------------------
-// Definitions for testing aggregate option parsing.
-// See descriptor_unittest.cc.
-
-message AggregateMessageSet {
-  option message_set_wire_format = true;
-  extensions 4 to max;
-}
-
-message AggregateMessageSetElement {
-  extend AggregateMessageSet {
-    optional AggregateMessageSetElement message_set_extension = 15447542;
-  }
-  optional string s = 1;
-}
-
-// A helper type used to test aggregate option parsing
-message Aggregate {
-  optional int32 i = 1;
-  optional string s = 2;
-
-  // A nested object
-  optional Aggregate sub = 3;
-
-  // To test the parsing of extensions inside aggregate values
-  optional google.protobuf.FileOptions file = 4;
-  extend google.protobuf.FileOptions {
-    optional Aggregate nested = 15476903;
-  }
-
-  // An embedded message set
-  optional AggregateMessageSet mset = 5;
-}
-
-// Allow Aggregate to be used as an option at all possible locations
-// in the .proto grammer.
-extend google.protobuf.FileOptions      { optional Aggregate fileopt    = 15478479; }
-extend google.protobuf.MessageOptions   { optional Aggregate msgopt     = 15480088; }
-extend google.protobuf.FieldOptions     { optional Aggregate fieldopt   = 15481374; }
-extend google.protobuf.EnumOptions      { optional Aggregate enumopt    = 15483218; }
-extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; }
-extend google.protobuf.ServiceOptions   { optional Aggregate serviceopt = 15497145; }
-extend google.protobuf.MethodOptions    { optional Aggregate methodopt  = 15512713; }
-
-// Try using AggregateOption at different points in the proto grammar
-option (fileopt) = {
-  s: 'FileAnnotation'
-  // Also test the handling of comments
-  /* of both types */ i: 100
-
-  sub { s: 'NestedFileAnnotation' }
-
-  // Include a google.protobuf.FileOptions and recursively extend it with
-  // another fileopt.
-  file {
-    [protobuf_unittest.fileopt] {
-      s:'FileExtensionAnnotation'
-    }
-  }
-
-  // A message set inside an option value
-  mset {
-    [protobuf_unittest.AggregateMessageSetElement.message_set_extension] {
-      s: 'EmbeddedMessageSetElement'
-    }
-  }
-};
-
-message AggregateMessage {
-  option (msgopt) = { i:101 s:'MessageAnnotation' };
-  optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
-}
-
-service AggregateService {
-  option (serviceopt) = { s:'ServiceAnnotation' };
-  rpc Method (AggregateMessage) returns (AggregateMessage) {
-    option (methodopt) = { s:'MethodAnnotation' };
-  }
-}
-
-enum AggregateEnum {
-  option (enumopt) = { s:'EnumAnnotation' };
-  VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
-}
-
-// Test custom options for nested type.
-message NestedOptionType {
-  message NestedMessage {
-    option (message_opt1) = 1001;
-    optional int32 nested_field = 1 [(field_opt1) = 1002];
-  }
-  enum NestedEnum {
-    option (enum_opt1) = 1003;
-    NESTED_ENUM_VALUE = 1 [(enum_value_opt1) = 1004];
-  }
-  extend google.protobuf.FileOptions {
-    optional int32 nested_extension = 7912573 [(field_opt2) = 1005];
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_embed_optimize_for.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_embed_optimize_for.proto
deleted file mode 100644
index fa17625..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_embed_optimize_for.proto
+++ /dev/null
@@ -1,50 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which imports a proto file that uses optimize_for = CODE_SIZE.
-
-import "google/protobuf/unittest_optimize_for.proto";
-
-package protobuf_unittest;
-
-// We optimize for speed here, but we are importing a proto that is optimized
-// for code size.
-option optimize_for = SPEED;
-
-message TestEmbedOptimizedForSize {
-  // Test that embedding a message which has optimize_for = CODE_SIZE into
-  // one optimized for speed works.
-  optional TestOptimizedForSize optional_message = 1;
-  repeated TestOptimizedForSize repeated_message = 2;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_empty.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_empty.proto
deleted file mode 100644
index ab12d1f..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_empty.proto
+++ /dev/null
@@ -1,37 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// This file intentionally left blank.  (At one point this wouldn't compile
-// correctly.)
-
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_enormous_descriptor.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_enormous_descriptor.proto
deleted file mode 100644
index bc0b7c1..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_enormous_descriptor.proto
+++ /dev/null
@@ -1,1046 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file that has an extremely large descriptor.  Used to test that
-// descriptors over 64k don't break the string literal length limit in Java.
-
-
-package google.protobuf;
-option java_package = "com.google.protobuf";
-
-// Avoid generating insanely long methods.
-option optimize_for = CODE_SIZE;
-
-message TestEnormousDescriptor {
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1 = 1 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_2 = 2 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_3 = 3 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_4 = 4 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_5 = 5 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_6 = 6 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_7 = 7 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_8 = 8 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_9 = 9 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_10 = 10 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_11 = 11 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_12 = 12 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_13 = 13 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_14 = 14 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_15 = 15 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_16 = 16 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_17 = 17 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_18 = 18 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_19 = 19 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_20 = 20 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_21 = 21 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_22 = 22 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_23 = 23 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_24 = 24 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_25 = 25 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_26 = 26 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_27 = 27 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_28 = 28 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_29 = 29 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_30 = 30 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_31 = 31 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_32 = 32 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_33 = 33 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_34 = 34 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_35 = 35 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_36 = 36 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_37 = 37 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_38 = 38 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_39 = 39 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_40 = 40 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_41 = 41 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_42 = 42 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_43 = 43 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_44 = 44 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_45 = 45 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_46 = 46 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_47 = 47 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_48 = 48 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_49 = 49 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_50 = 50 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_51 = 51 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_52 = 52 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_53 = 53 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_54 = 54 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_55 = 55 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_56 = 56 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_57 = 57 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_58 = 58 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_59 = 59 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_60 = 60 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_61 = 61 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_62 = 62 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_63 = 63 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_64 = 64 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_65 = 65 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_66 = 66 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_67 = 67 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_68 = 68 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_69 = 69 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_70 = 70 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_71 = 71 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_72 = 72 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_73 = 73 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_74 = 74 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_75 = 75 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_76 = 76 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_77 = 77 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_78 = 78 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_79 = 79 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_80 = 80 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_81 = 81 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_82 = 82 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_83 = 83 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_84 = 84 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_85 = 85 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_86 = 86 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_87 = 87 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_88 = 88 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_89 = 89 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_90 = 90 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_91 = 91 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_92 = 92 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_93 = 93 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_94 = 94 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_95 = 95 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_96 = 96 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_97 = 97 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_98 = 98 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_99 = 99 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_100 = 100 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_101 = 101 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_102 = 102 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_103 = 103 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_104 = 104 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_105 = 105 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_106 = 106 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_107 = 107 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_108 = 108 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_109 = 109 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_110 = 110 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_111 = 111 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_112 = 112 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_113 = 113 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_114 = 114 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_115 = 115 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_116 = 116 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_117 = 117 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_118 = 118 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_119 = 119 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_120 = 120 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_121 = 121 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_122 = 122 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_123 = 123 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_124 = 124 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_125 = 125 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_126 = 126 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_127 = 127 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_128 = 128 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_129 = 129 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_130 = 130 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_131 = 131 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_132 = 132 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_133 = 133 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_134 = 134 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_135 = 135 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_136 = 136 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_137 = 137 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_138 = 138 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_139 = 139 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_140 = 140 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_141 = 141 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_142 = 142 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_143 = 143 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_144 = 144 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_145 = 145 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_146 = 146 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_147 = 147 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_148 = 148 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_149 = 149 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_150 = 150 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_151 = 151 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_152 = 152 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_153 = 153 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_154 = 154 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_155 = 155 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_156 = 156 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_157 = 157 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_158 = 158 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_159 = 159 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_160 = 160 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_161 = 161 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_162 = 162 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_163 = 163 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_164 = 164 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_165 = 165 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_166 = 166 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_167 = 167 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_168 = 168 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_169 = 169 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_170 = 170 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_171 = 171 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_172 = 172 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_173 = 173 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_174 = 174 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_175 = 175 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_176 = 176 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_177 = 177 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_178 = 178 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_179 = 179 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_180 = 180 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_181 = 181 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_182 = 182 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_183 = 183 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_184 = 184 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_185 = 185 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_186 = 186 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_187 = 187 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_188 = 188 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_189 = 189 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_190 = 190 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_191 = 191 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_192 = 192 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_193 = 193 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_194 = 194 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_195 = 195 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_196 = 196 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_197 = 197 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_198 = 198 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_199 = 199 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_200 = 200 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_201 = 201 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_202 = 202 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_203 = 203 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_204 = 204 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_205 = 205 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_206 = 206 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_207 = 207 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_208 = 208 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_209 = 209 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_210 = 210 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_211 = 211 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_212 = 212 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_213 = 213 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_214 = 214 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_215 = 215 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_216 = 216 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_217 = 217 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_218 = 218 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_219 = 219 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_220 = 220 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_221 = 221 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_222 = 222 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_223 = 223 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_224 = 224 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_225 = 225 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_226 = 226 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_227 = 227 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_228 = 228 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_229 = 229 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_230 = 230 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_231 = 231 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_232 = 232 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_233 = 233 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_234 = 234 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_235 = 235 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_236 = 236 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_237 = 237 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_238 = 238 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_239 = 239 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_240 = 240 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_241 = 241 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_242 = 242 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_243 = 243 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_244 = 244 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_245 = 245 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_246 = 246 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_247 = 247 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_248 = 248 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_249 = 249 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_250 = 250 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_251 = 251 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_252 = 252 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_253 = 253 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_254 = 254 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_255 = 255 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_256 = 256 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_257 = 257 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_258 = 258 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_259 = 259 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_260 = 260 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_261 = 261 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_262 = 262 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_263 = 263 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_264 = 264 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_265 = 265 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_266 = 266 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_267 = 267 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_268 = 268 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_269 = 269 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_270 = 270 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_271 = 271 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_272 = 272 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_273 = 273 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_274 = 274 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_275 = 275 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_276 = 276 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_277 = 277 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_278 = 278 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_279 = 279 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_280 = 280 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_281 = 281 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_282 = 282 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_283 = 283 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_284 = 284 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_285 = 285 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_286 = 286 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_287 = 287 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_288 = 288 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_289 = 289 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_290 = 290 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_291 = 291 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_292 = 292 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_293 = 293 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_294 = 294 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_295 = 295 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_296 = 296 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_297 = 297 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_298 = 298 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_299 = 299 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_300 = 300 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_301 = 301 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_302 = 302 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_303 = 303 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_304 = 304 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_305 = 305 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_306 = 306 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_307 = 307 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_308 = 308 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_309 = 309 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_310 = 310 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_311 = 311 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_312 = 312 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_313 = 313 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_314 = 314 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_315 = 315 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_316 = 316 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_317 = 317 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_318 = 318 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_319 = 319 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_320 = 320 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_321 = 321 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_322 = 322 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_323 = 323 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_324 = 324 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_325 = 325 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_326 = 326 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_327 = 327 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_328 = 328 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_329 = 329 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_330 = 330 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_331 = 331 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_332 = 332 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_333 = 333 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_334 = 334 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_335 = 335 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_336 = 336 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_337 = 337 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_338 = 338 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_339 = 339 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_340 = 340 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_341 = 341 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_342 = 342 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_343 = 343 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_344 = 344 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_345 = 345 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_346 = 346 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_347 = 347 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_348 = 348 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_349 = 349 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_350 = 350 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_351 = 351 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_352 = 352 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_353 = 353 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_354 = 354 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_355 = 355 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_356 = 356 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_357 = 357 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_358 = 358 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_359 = 359 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_360 = 360 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_361 = 361 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_362 = 362 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_363 = 363 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_364 = 364 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_365 = 365 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_366 = 366 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_367 = 367 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_368 = 368 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_369 = 369 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_370 = 370 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_371 = 371 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_372 = 372 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_373 = 373 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_374 = 374 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_375 = 375 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_376 = 376 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_377 = 377 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_378 = 378 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_379 = 379 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_380 = 380 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_381 = 381 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_382 = 382 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_383 = 383 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_384 = 384 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_385 = 385 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_386 = 386 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_387 = 387 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_388 = 388 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_389 = 389 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_390 = 390 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_391 = 391 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_392 = 392 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_393 = 393 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_394 = 394 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_395 = 395 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_396 = 396 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_397 = 397 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_398 = 398 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_399 = 399 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_400 = 400 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_401 = 401 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_402 = 402 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_403 = 403 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_404 = 404 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_405 = 405 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_406 = 406 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_407 = 407 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_408 = 408 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_409 = 409 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_410 = 410 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_411 = 411 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_412 = 412 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_413 = 413 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_414 = 414 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_415 = 415 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_416 = 416 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_417 = 417 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_418 = 418 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_419 = 419 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_420 = 420 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_421 = 421 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_422 = 422 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_423 = 423 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_424 = 424 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_425 = 425 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_426 = 426 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_427 = 427 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_428 = 428 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_429 = 429 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_430 = 430 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_431 = 431 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_432 = 432 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_433 = 433 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_434 = 434 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_435 = 435 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_436 = 436 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_437 = 437 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_438 = 438 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_439 = 439 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_440 = 440 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_441 = 441 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_442 = 442 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_443 = 443 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_444 = 444 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_445 = 445 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_446 = 446 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_447 = 447 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_448 = 448 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_449 = 449 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_450 = 450 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_451 = 451 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_452 = 452 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_453 = 453 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_454 = 454 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_455 = 455 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_456 = 456 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_457 = 457 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_458 = 458 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_459 = 459 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_460 = 460 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_461 = 461 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_462 = 462 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_463 = 463 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_464 = 464 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_465 = 465 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_466 = 466 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_467 = 467 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_468 = 468 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_469 = 469 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_470 = 470 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_471 = 471 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_472 = 472 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_473 = 473 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_474 = 474 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_475 = 475 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_476 = 476 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_477 = 477 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_478 = 478 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_479 = 479 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_480 = 480 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_481 = 481 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_482 = 482 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_483 = 483 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_484 = 484 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_485 = 485 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_486 = 486 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_487 = 487 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_488 = 488 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_489 = 489 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_490 = 490 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_491 = 491 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_492 = 492 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_493 = 493 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_494 = 494 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_495 = 495 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_496 = 496 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_497 = 497 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_498 = 498 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_499 = 499 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_500 = 500 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_501 = 501 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_502 = 502 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_503 = 503 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_504 = 504 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_505 = 505 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_506 = 506 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_507 = 507 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_508 = 508 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_509 = 509 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_510 = 510 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_511 = 511 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_512 = 512 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_513 = 513 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_514 = 514 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_515 = 515 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_516 = 516 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_517 = 517 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_518 = 518 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_519 = 519 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_520 = 520 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_521 = 521 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_522 = 522 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_523 = 523 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_524 = 524 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_525 = 525 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_526 = 526 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_527 = 527 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_528 = 528 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_529 = 529 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_530 = 530 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_531 = 531 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_532 = 532 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_533 = 533 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_534 = 534 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_535 = 535 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_536 = 536 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_537 = 537 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_538 = 538 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_539 = 539 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_540 = 540 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_541 = 541 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_542 = 542 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_543 = 543 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_544 = 544 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_545 = 545 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_546 = 546 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_547 = 547 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_548 = 548 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_549 = 549 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_550 = 550 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_551 = 551 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_552 = 552 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_553 = 553 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_554 = 554 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_555 = 555 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_556 = 556 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_557 = 557 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_558 = 558 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_559 = 559 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_560 = 560 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_561 = 561 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_562 = 562 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_563 = 563 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_564 = 564 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_565 = 565 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_566 = 566 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_567 = 567 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_568 = 568 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_569 = 569 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_570 = 570 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_571 = 571 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_572 = 572 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_573 = 573 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_574 = 574 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_575 = 575 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_576 = 576 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_577 = 577 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_578 = 578 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_579 = 579 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_580 = 580 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_581 = 581 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_582 = 582 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_583 = 583 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_584 = 584 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_585 = 585 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_586 = 586 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_587 = 587 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_588 = 588 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_589 = 589 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_590 = 590 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_591 = 591 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_592 = 592 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_593 = 593 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_594 = 594 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_595 = 595 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_596 = 596 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_597 = 597 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_598 = 598 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_599 = 599 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_600 = 600 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_601 = 601 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_602 = 602 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_603 = 603 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_604 = 604 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_605 = 605 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_606 = 606 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_607 = 607 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_608 = 608 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_609 = 609 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_610 = 610 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_611 = 611 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_612 = 612 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_613 = 613 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_614 = 614 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_615 = 615 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_616 = 616 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_617 = 617 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_618 = 618 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_619 = 619 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_620 = 620 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_621 = 621 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_622 = 622 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_623 = 623 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_624 = 624 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_625 = 625 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_626 = 626 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_627 = 627 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_628 = 628 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_629 = 629 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_630 = 630 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_631 = 631 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_632 = 632 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_633 = 633 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_634 = 634 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_635 = 635 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_636 = 636 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_637 = 637 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_638 = 638 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_639 = 639 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_640 = 640 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_641 = 641 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_642 = 642 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_643 = 643 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_644 = 644 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_645 = 645 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_646 = 646 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_647 = 647 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_648 = 648 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_649 = 649 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_650 = 650 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_651 = 651 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_652 = 652 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_653 = 653 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_654 = 654 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_655 = 655 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_656 = 656 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_657 = 657 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_658 = 658 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_659 = 659 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_660 = 660 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_661 = 661 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_662 = 662 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_663 = 663 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_664 = 664 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_665 = 665 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_666 = 666 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_667 = 667 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_668 = 668 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_669 = 669 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_670 = 670 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_671 = 671 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_672 = 672 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_673 = 673 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_674 = 674 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_675 = 675 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_676 = 676 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_677 = 677 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_678 = 678 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_679 = 679 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_680 = 680 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_681 = 681 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_682 = 682 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_683 = 683 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_684 = 684 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_685 = 685 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_686 = 686 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_687 = 687 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_688 = 688 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_689 = 689 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_690 = 690 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_691 = 691 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_692 = 692 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_693 = 693 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_694 = 694 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_695 = 695 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_696 = 696 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_697 = 697 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_698 = 698 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_699 = 699 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_700 = 700 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_701 = 701 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_702 = 702 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_703 = 703 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_704 = 704 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_705 = 705 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_706 = 706 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_707 = 707 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_708 = 708 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_709 = 709 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_710 = 710 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_711 = 711 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_712 = 712 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_713 = 713 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_714 = 714 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_715 = 715 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_716 = 716 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_717 = 717 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_718 = 718 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_719 = 719 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_720 = 720 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_721 = 721 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_722 = 722 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_723 = 723 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_724 = 724 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_725 = 725 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_726 = 726 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_727 = 727 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_728 = 728 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_729 = 729 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_730 = 730 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_731 = 731 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_732 = 732 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_733 = 733 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_734 = 734 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_735 = 735 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_736 = 736 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_737 = 737 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_738 = 738 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_739 = 739 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_740 = 740 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_741 = 741 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_742 = 742 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_743 = 743 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_744 = 744 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_745 = 745 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_746 = 746 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_747 = 747 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_748 = 748 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_749 = 749 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_750 = 750 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_751 = 751 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_752 = 752 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_753 = 753 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_754 = 754 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_755 = 755 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_756 = 756 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_757 = 757 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_758 = 758 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_759 = 759 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_760 = 760 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_761 = 761 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_762 = 762 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_763 = 763 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_764 = 764 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_765 = 765 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_766 = 766 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_767 = 767 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_768 = 768 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_769 = 769 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_770 = 770 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_771 = 771 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_772 = 772 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_773 = 773 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_774 = 774 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_775 = 775 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_776 = 776 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_777 = 777 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_778 = 778 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_779 = 779 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_780 = 780 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_781 = 781 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_782 = 782 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_783 = 783 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_784 = 784 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_785 = 785 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_786 = 786 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_787 = 787 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_788 = 788 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_789 = 789 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_790 = 790 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_791 = 791 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_792 = 792 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_793 = 793 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_794 = 794 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_795 = 795 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_796 = 796 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_797 = 797 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_798 = 798 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_799 = 799 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_800 = 800 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_801 = 801 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_802 = 802 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_803 = 803 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_804 = 804 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_805 = 805 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_806 = 806 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_807 = 807 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_808 = 808 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_809 = 809 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_810 = 810 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_811 = 811 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_812 = 812 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_813 = 813 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_814 = 814 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_815 = 815 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_816 = 816 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_817 = 817 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_818 = 818 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_819 = 819 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_820 = 820 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_821 = 821 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_822 = 822 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_823 = 823 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_824 = 824 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_825 = 825 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_826 = 826 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_827 = 827 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_828 = 828 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_829 = 829 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_830 = 830 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_831 = 831 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_832 = 832 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_833 = 833 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_834 = 834 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_835 = 835 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_836 = 836 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_837 = 837 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_838 = 838 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_839 = 839 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_840 = 840 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_841 = 841 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_842 = 842 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_843 = 843 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_844 = 844 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_845 = 845 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_846 = 846 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_847 = 847 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_848 = 848 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_849 = 849 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_850 = 850 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_851 = 851 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_852 = 852 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_853 = 853 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_854 = 854 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_855 = 855 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_856 = 856 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_857 = 857 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_858 = 858 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_859 = 859 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_860 = 860 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_861 = 861 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_862 = 862 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_863 = 863 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_864 = 864 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_865 = 865 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_866 = 866 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_867 = 867 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_868 = 868 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_869 = 869 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_870 = 870 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_871 = 871 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_872 = 872 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_873 = 873 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_874 = 874 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_875 = 875 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_876 = 876 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_877 = 877 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_878 = 878 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_879 = 879 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_880 = 880 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_881 = 881 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_882 = 882 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_883 = 883 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_884 = 884 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_885 = 885 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_886 = 886 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_887 = 887 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_888 = 888 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_889 = 889 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_890 = 890 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_891 = 891 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_892 = 892 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_893 = 893 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_894 = 894 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_895 = 895 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_896 = 896 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_897 = 897 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_898 = 898 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_899 = 899 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_900 = 900 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_901 = 901 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_902 = 902 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_903 = 903 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_904 = 904 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_905 = 905 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_906 = 906 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_907 = 907 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_908 = 908 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_909 = 909 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_910 = 910 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_911 = 911 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_912 = 912 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_913 = 913 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_914 = 914 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_915 = 915 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_916 = 916 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_917 = 917 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_918 = 918 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_919 = 919 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_920 = 920 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_921 = 921 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_922 = 922 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_923 = 923 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_924 = 924 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_925 = 925 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_926 = 926 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_927 = 927 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_928 = 928 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_929 = 929 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_930 = 930 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_931 = 931 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_932 = 932 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_933 = 933 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_934 = 934 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_935 = 935 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_936 = 936 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_937 = 937 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_938 = 938 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_939 = 939 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_940 = 940 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_941 = 941 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_942 = 942 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_943 = 943 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_944 = 944 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_945 = 945 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_946 = 946 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_947 = 947 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_948 = 948 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_949 = 949 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_950 = 950 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_951 = 951 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_952 = 952 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_953 = 953 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_954 = 954 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_955 = 955 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_956 = 956 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_957 = 957 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_958 = 958 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_959 = 959 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_960 = 960 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_961 = 961 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_962 = 962 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_963 = 963 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_964 = 964 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_965 = 965 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_966 = 966 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_967 = 967 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_968 = 968 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_969 = 969 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_970 = 970 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_971 = 971 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_972 = 972 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_973 = 973 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_974 = 974 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_975 = 975 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_976 = 976 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_977 = 977 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_978 = 978 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_979 = 979 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_980 = 980 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_981 = 981 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_982 = 982 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_983 = 983 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_984 = 984 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_985 = 985 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_986 = 986 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_987 = 987 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_988 = 988 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_989 = 989 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_990 = 990 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_991 = 991 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_992 = 992 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_993 = 993 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_994 = 994 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_995 = 995 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_996 = 996 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_997 = 997 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_998 = 998 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_999 = 999 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000 = 1000 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import.proto
deleted file mode 100644
index c115b11..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import.proto
+++ /dev/null
@@ -1,64 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which is imported by unittest.proto to test importing.
-
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do
-// "using namespace unittest_import = protobuf_unittest_import".
-package protobuf_unittest_import;
-
-option optimize_for = SPEED;
-
-// Excercise the java_package option.
-option java_package = "com.google.protobuf.test";
-
-// Do not set a java_outer_classname here to verify that Proto2 works without
-// one.
-
-// Test public import
-import public "google/protobuf/unittest_import_public.proto";
-
-message ImportMessage {
-  optional int32 d = 1;
-}
-
-enum ImportEnum {
-  IMPORT_FOO = 7;
-  IMPORT_BAR = 8;
-  IMPORT_BAZ = 9;
-}
-
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_lite.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_lite.proto
deleted file mode 100644
index 81b117f..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_lite.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME.
-
-package protobuf_unittest_import;
-
-option optimize_for = LITE_RUNTIME;
-
-option java_package = "com.google.protobuf";
-
-import public "google/protobuf/unittest_import_public_lite.proto";
-
-message ImportMessageLite {
-  optional int32 d = 1;
-}
-
-enum ImportEnumLite {
-  IMPORT_LITE_FOO = 7;
-  IMPORT_LITE_BAR = 8;
-  IMPORT_LITE_BAZ = 9;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_public.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_public.proto
deleted file mode 100644
index ea5d1b1..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_public.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-
-package protobuf_unittest_import;
-
-option java_package = "com.google.protobuf.test";
-
-message PublicImportMessage {
-  optional int32 e = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_public_lite.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_public_lite.proto
deleted file mode 100644
index d077563..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_import_public_lite.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-
-package protobuf_unittest_import;
-
-option optimize_for = LITE_RUNTIME;
-
-option java_package = "com.google.protobuf";
-
-message PublicImportMessageLite {
-  optional int32 e = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_lite.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_lite.proto
deleted file mode 100644
index a1764aa..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_lite.proto
+++ /dev/null
@@ -1,360 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// This is like unittest.proto but with optimize_for = LITE_RUNTIME.
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest_import_lite.proto";
-
-option optimize_for = LITE_RUNTIME;
-
-option java_package = "com.google.protobuf";
-
-// Same as TestAllTypes but with the lite runtime.
-message TestAllTypesLite {
-  message NestedMessage {
-    optional int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-  }
-
-  // Singular
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional NestedMessage      optional_nested_message  = 18;
-  optional ForeignMessageLite optional_foreign_message = 19;
-  optional protobuf_unittest_import.ImportMessageLite
-    optional_import_message = 20;
-
-  optional NestedEnum      optional_nested_enum     = 21;
-  optional ForeignEnumLite optional_foreign_enum    = 22;
-  optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23;
-
-  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
-  optional string optional_cord = 25 [ctype=CORD];
-
-  // Defined in unittest_import_public.proto
-  optional protobuf_unittest_import.PublicImportMessageLite
-      optional_public_import_message = 26;
-
-  optional NestedMessage optional_lazy_message = 27 [lazy=true];
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated NestedMessage      repeated_nested_message  = 48;
-  repeated ForeignMessageLite repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessageLite
-    repeated_import_message = 50;
-
-  repeated NestedEnum      repeated_nested_enum  = 51;
-  repeated ForeignEnumLite repeated_foreign_enum = 52;
-  repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32    = 61 [default =  41    ];
-  optional    int64 default_int64    = 62 [default =  42    ];
-  optional   uint32 default_uint32   = 63 [default =  43    ];
-  optional   uint64 default_uint64   = 64 [default =  44    ];
-  optional   sint32 default_sint32   = 65 [default = -45    ];
-  optional   sint64 default_sint64   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
-  optional    float default_float    = 71 [default =  51.5  ];
-  optional   double default_double   = 72 [default =  52e3  ];
-  optional     bool default_bool     = 73 [default = true   ];
-  optional   string default_string   = 74 [default = "hello"];
-  optional    bytes default_bytes    = 75 [default = "world"];
-
-  optional NestedEnum default_nested_enum = 81 [default = BAR];
-  optional ForeignEnumLite default_foreign_enum = 82
-      [default = FOREIGN_LITE_BAR];
-  optional protobuf_unittest_import.ImportEnumLite
-      default_import_enum = 83 [default = IMPORT_LITE_BAR];
-
-  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
-  optional string default_cord = 85 [ctype=CORD,default="123"];
-}
-
-message ForeignMessageLite {
-  optional int32 c = 1;
-}
-
-enum ForeignEnumLite {
-  FOREIGN_LITE_FOO = 4;
-  FOREIGN_LITE_BAR = 5;
-  FOREIGN_LITE_BAZ = 6;
-}
-
-message TestPackedTypesLite {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnumLite packed_enum  = 103 [packed = true];
-}
-
-message TestAllExtensionsLite {
-  extensions 1 to max;
-}
-
-extend TestAllExtensionsLite {
-  // Singular
-  optional    int32 optional_int32_extension_lite    =  1;
-  optional    int64 optional_int64_extension_lite    =  2;
-  optional   uint32 optional_uint32_extension_lite   =  3;
-  optional   uint64 optional_uint64_extension_lite   =  4;
-  optional   sint32 optional_sint32_extension_lite   =  5;
-  optional   sint64 optional_sint64_extension_lite   =  6;
-  optional  fixed32 optional_fixed32_extension_lite  =  7;
-  optional  fixed64 optional_fixed64_extension_lite  =  8;
-  optional sfixed32 optional_sfixed32_extension_lite =  9;
-  optional sfixed64 optional_sfixed64_extension_lite = 10;
-  optional    float optional_float_extension_lite    = 11;
-  optional   double optional_double_extension_lite   = 12;
-  optional     bool optional_bool_extension_lite     = 13;
-  optional   string optional_string_extension_lite   = 14;
-  optional    bytes optional_bytes_extension_lite    = 15;
-
-  optional group OptionalGroup_extension_lite = 16 {
-    optional int32 a = 17;
-  }
-
-  optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite
-      = 18;
-  optional ForeignMessageLite optional_foreign_message_extension_lite = 19;
-  optional protobuf_unittest_import.ImportMessageLite
-    optional_import_message_extension_lite = 20;
-
-  optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21;
-  optional ForeignEnumLite optional_foreign_enum_extension_lite = 22;
-  optional protobuf_unittest_import.ImportEnumLite
-    optional_import_enum_extension_lite = 23;
-
-  optional string optional_string_piece_extension_lite = 24
-      [ctype=STRING_PIECE];
-  optional string optional_cord_extension_lite = 25 [ctype=CORD];
-
-  optional protobuf_unittest_import.PublicImportMessageLite
-    optional_public_import_message_extension_lite = 26;
-
-  optional TestAllTypesLite.NestedMessage
-    optional_lazy_message_extension_lite = 27 [lazy=true];
-
-  // Repeated
-  repeated    int32 repeated_int32_extension_lite    = 31;
-  repeated    int64 repeated_int64_extension_lite    = 32;
-  repeated   uint32 repeated_uint32_extension_lite   = 33;
-  repeated   uint64 repeated_uint64_extension_lite   = 34;
-  repeated   sint32 repeated_sint32_extension_lite   = 35;
-  repeated   sint64 repeated_sint64_extension_lite   = 36;
-  repeated  fixed32 repeated_fixed32_extension_lite  = 37;
-  repeated  fixed64 repeated_fixed64_extension_lite  = 38;
-  repeated sfixed32 repeated_sfixed32_extension_lite = 39;
-  repeated sfixed64 repeated_sfixed64_extension_lite = 40;
-  repeated    float repeated_float_extension_lite    = 41;
-  repeated   double repeated_double_extension_lite   = 42;
-  repeated     bool repeated_bool_extension_lite     = 43;
-  repeated   string repeated_string_extension_lite   = 44;
-  repeated    bytes repeated_bytes_extension_lite    = 45;
-
-  repeated group RepeatedGroup_extension_lite = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite
-      = 48;
-  repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49;
-  repeated protobuf_unittest_import.ImportMessageLite
-    repeated_import_message_extension_lite = 50;
-
-  repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51;
-  repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52;
-  repeated protobuf_unittest_import.ImportEnumLite
-    repeated_import_enum_extension_lite = 53;
-
-  repeated string repeated_string_piece_extension_lite = 54
-      [ctype=STRING_PIECE];
-  repeated string repeated_cord_extension_lite = 55 [ctype=CORD];
-
-  repeated TestAllTypesLite.NestedMessage
-    repeated_lazy_message_extension_lite = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32_extension_lite    = 61 [default =  41    ];
-  optional    int64 default_int64_extension_lite    = 62 [default =  42    ];
-  optional   uint32 default_uint32_extension_lite   = 63 [default =  43    ];
-  optional   uint64 default_uint64_extension_lite   = 64 [default =  44    ];
-  optional   sint32 default_sint32_extension_lite   = 65 [default = -45    ];
-  optional   sint64 default_sint64_extension_lite   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32_extension_lite  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64_extension_lite  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32_extension_lite = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50    ];
-  optional    float default_float_extension_lite    = 71 [default =  51.5  ];
-  optional   double default_double_extension_lite   = 72 [default =  52e3  ];
-  optional     bool default_bool_extension_lite     = 73 [default = true   ];
-  optional   string default_string_extension_lite   = 74 [default = "hello"];
-  optional    bytes default_bytes_extension_lite    = 75 [default = "world"];
-
-  optional TestAllTypesLite.NestedEnum
-    default_nested_enum_extension_lite = 81 [default = BAR];
-  optional ForeignEnumLite
-    default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR];
-  optional protobuf_unittest_import.ImportEnumLite
-    default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR];
-
-  optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE,
-                                                            default="abc"];
-  optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"];
-}
-
-message TestPackedExtensionsLite {
-  extensions 1 to max;
-}
-
-extend TestPackedExtensionsLite {
-  repeated    int32 packed_int32_extension_lite    =  90 [packed = true];
-  repeated    int64 packed_int64_extension_lite    =  91 [packed = true];
-  repeated   uint32 packed_uint32_extension_lite   =  92 [packed = true];
-  repeated   uint64 packed_uint64_extension_lite   =  93 [packed = true];
-  repeated   sint32 packed_sint32_extension_lite   =  94 [packed = true];
-  repeated   sint64 packed_sint64_extension_lite   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32_extension_lite  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64_extension_lite  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32_extension_lite =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64_extension_lite =  99 [packed = true];
-  repeated    float packed_float_extension_lite    = 100 [packed = true];
-  repeated   double packed_double_extension_lite   = 101 [packed = true];
-  repeated     bool packed_bool_extension_lite     = 102 [packed = true];
-  repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true];
-}
-
-message TestNestedExtensionLite {
-  extend TestAllExtensionsLite {
-    optional int32 nested_extension = 12345;
-  }
-}
-
-// Test that deprecated fields work.  We only verify that they compile (at one
-// point this failed).
-message TestDeprecatedLite {
-  optional int32 deprecated_field = 1 [deprecated = true];
-}
-
-// See the comments of the same type in unittest.proto.
-message TestParsingMergeLite {
-  message RepeatedFieldsGenerator {
-    repeated TestAllTypesLite field1 = 1;
-    repeated TestAllTypesLite field2 = 2;
-    repeated TestAllTypesLite field3 = 3;
-    repeated group Group1 = 10 {
-      optional TestAllTypesLite field1 = 11;
-    }
-    repeated group Group2 = 20 {
-      optional TestAllTypesLite field1 = 21;
-    }
-    repeated TestAllTypesLite ext1 = 1000;
-    repeated TestAllTypesLite ext2 = 1001;
-  }
-  required TestAllTypesLite required_all_types = 1;
-  optional TestAllTypesLite optional_all_types = 2;
-  repeated TestAllTypesLite repeated_all_types = 3;
-  optional group OptionalGroup = 10 {
-    optional TestAllTypesLite optional_group_all_types = 11;
-  }
-  repeated group RepeatedGroup = 20 {
-    optional TestAllTypesLite repeated_group_all_types = 21;
-  }
-  extensions 1000 to max;
-  extend TestParsingMergeLite {
-    optional TestAllTypesLite optional_ext = 1000;
-    repeated TestAllTypesLite repeated_ext = 1001;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_lite_imports_nonlite.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_lite_imports_nonlite.proto
deleted file mode 100644
index d52cb8c..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_lite_imports_nonlite.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// Tests that a "lite" message can import a regular message.
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-option optimize_for = LITE_RUNTIME;
-
-message TestLiteImportsNonlite {
-  optional TestAllTypes message = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_mset.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_mset.proto
deleted file mode 100644
index 3497f09..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_mset.proto
+++ /dev/null
@@ -1,72 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// This file contains messages for testing message_set_wire_format.
-
-package protobuf_unittest;
-
-option optimize_for = SPEED;
-
-// A message with message_set_wire_format.
-message TestMessageSet {
-  option message_set_wire_format = true;
-  extensions 4 to max;
-}
-
-message TestMessageSetContainer {
-  optional TestMessageSet message_set = 1;
-}
-
-message TestMessageSetExtension1 {
-  extend TestMessageSet {
-    optional TestMessageSetExtension1 message_set_extension = 1545008;
-  }
-  optional int32 i = 15;
-}
-
-message TestMessageSetExtension2 {
-  extend TestMessageSet {
-    optional TestMessageSetExtension2 message_set_extension = 1547769;
-  }
-  optional string str = 25;
-}
-
-// MessageSet wire format is equivalent to this.
-message RawMessageSet {
-  repeated group Item = 1 {
-    required int32 type_id = 2;
-    required bytes message = 3;
-  }
-}
-
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_no_generic_services.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_no_generic_services.proto
deleted file mode 100644
index cffb412..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_no_generic_services.proto
+++ /dev/null
@@ -1,52 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-
-package google.protobuf.no_generic_services_test;
-
-// *_generic_services are false by default.
-
-message TestMessage {
-  optional int32 a = 1;
-  extensions 1000 to max;
-}
-
-enum TestEnum {
-  FOO = 1;
-}
-
-extend TestMessage {
-  optional int32 test_extension = 1000;
-}
-
-service TestService {
-  rpc Foo(TestMessage) returns(TestMessage);
-}
diff --git a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_optimize_for.proto b/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_optimize_for.proto
deleted file mode 100644
index feecbef..0000000
--- a/java/compatibility_tests/v2.5.0/more_protos/src/proto/google/protobuf/unittest_optimize_for.proto
+++ /dev/null
@@ -1,61 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which uses optimize_for = CODE_SIZE.
-
-import "google/protobuf/unittest.proto";
-
-package protobuf_unittest;
-
-option optimize_for = CODE_SIZE;
-
-message TestOptimizedForSize {
-  optional int32 i = 1;
-  optional ForeignMessage msg = 19;
-
-  extensions 1000 to max;
-
-  extend TestOptimizedForSize {
-    optional int32 test_extension = 1234;
-    optional TestRequiredOptimizedForSize test_extension2 = 1235;
-  }
-}
-
-message TestRequiredOptimizedForSize {
-  required int32 x = 1;
-}
- 
-message TestOptionalOptimizedForSize {
-  optional TestRequiredOptimizedForSize o = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/pom.xml b/java/compatibility_tests/v2.5.0/pom.xml
deleted file mode 100644
index 83a7563..0000000
--- a/java/compatibility_tests/v2.5.0/pom.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.protobuf.compatibility</groupId>
-  <artifactId>compatibility-test-suite</artifactId>
-  <version>2.5.0</version>
-  <name>Protocol Buffer Java API compatibility tests</name>
-  <packaging>pom</packaging>
-  <modules>
-    <module>protos</module>
-    <module>more_protos</module>
-    <module>tests</module>
-  </modules>
-  <properties>
-    <protoc.path>protoc</protoc.path>
-    <protobuf.version>2.5.0</protobuf.version>
-
-    <protos.protoc.path>${protoc.path}</protos.protoc.path>
-    <protos.protobuf.version>${protobuf.version}</protos.protobuf.version>
-
-    <more_protos.protoc.path>${protoc.path}</more_protos.protoc.path>
-    <more_protos.protobuf.version>${protobuf.version}</more_protos.protobuf.version>
-
-    <tests.protobuf.version>${protobuf.version}</tests.protobuf.version>
-
-    <protobuf.test.source.path>.</protobuf.test.source.path>
-  </properties>
-</project>
diff --git a/java/compatibility_tests/v2.5.0/protos/pom.xml b/java/compatibility_tests/v2.5.0/protos/pom.xml
deleted file mode 100644
index a22e91e..0000000
--- a/java/compatibility_tests/v2.5.0/protos/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>com.google.protobuf.compatibility</groupId>
-    <artifactId>compatibility-test-suite</artifactId>
-    <version>2.5.0</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <groupId>com.google.protobuf.compatibility</groupId>
-  <artifactId>compatibility-protos</artifactId>
-  <version>2.5.0</version>
-
-  <name>Protos for Compatibility test</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>com.google.protobuf</groupId>
-      <artifactId>protobuf-java</artifactId>
-      <version>${protos.protobuf.version}</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.6.0</version>
-        <configuration>
-          <source>1.6</source>
-          <target>1.6</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>generate-sources</id>
-            <phase>generate-sources</phase>
-            <configuration>
-              <tasks>
-                <mkdir dir="target/generated-sources" />
-                <exec executable="${protos.protoc.path}">
-                  <arg value="--java_out=target/generated-sources" />
-                  <arg value="--proto_path=src/proto" />
-                  <arg value="src/proto/google/protobuf/unittest_custom_options.proto" />
-                  <arg value="src/proto/google/protobuf/unittest_enormous_descriptor.proto" />
-                  <arg value="src/proto/google/protobuf/unittest_import.proto" />
-                  <arg value="src/proto/google/protobuf/unittest_import_public.proto" />
-                  <arg value="src/proto/google/protobuf/unittest_mset.proto" />
-                  <arg value="src/proto/google/protobuf/unittest_no_generic_services.proto" />
-                  <arg value="src/proto/com/google/protobuf/nested_builders_test.proto" />
-                  <arg value="src/proto/com/google/protobuf/nested_extension.proto" />
-                  <arg value="src/proto/com/google/protobuf/non_nested_extension.proto" />
-                  <arg value="src/proto/com/google/protobuf/test_bad_identifiers.proto" />
-                </exec>
-              </tasks>
-              <sourceRoot>target/generated-sources</sourceRoot>
-            </configuration>
-            <goals>
-              <goal>run</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/multiple_files_test.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/multiple_files_test.proto
deleted file mode 100644
index 9a04014..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/multiple_files_test.proto
+++ /dev/null
@@ -1,71 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// A proto file which tests the java_multiple_files option.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option java_generic_services = true;   // auto-added
-
-import "google/protobuf/unittest.proto";
-
-package protobuf_unittest;
-
-option java_multiple_files = true;
-option java_outer_classname = "MultipleFilesTestProto";
-
-message MessageWithNoOuter {
-  message NestedMessage {
-    optional int32 i = 1;
-  }
-  enum NestedEnum {
-    BAZ = 3;
-  }
-  optional NestedMessage nested = 1;
-  repeated TestAllTypes foreign = 2;
-  optional NestedEnum nested_enum = 3;
-  optional EnumWithNoOuter foreign_enum = 4;
-}
-
-enum EnumWithNoOuter {
-  FOO = 1;
-  BAR = 2;
-}
-
-service ServiceWithNoOuter {
-  rpc Foo(MessageWithNoOuter) returns(TestAllTypes);
-}
-
-extend TestAllExtensions {
-  optional int32 extension_with_outer = 1234567;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_builders_test.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_builders_test.proto
deleted file mode 100644
index abffb9d..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_builders_test.proto
+++ /dev/null
@@ -1,53 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: jonp@google.com (Jon Perlow)
-//
-
-package protobuf_unittest;
-
-option java_multiple_files = true;
-option java_outer_classname = "NestedBuilders";
-
-
-message Vehicle {
-  optional Engine engine = 1;
-  repeated Wheel wheel = 2;
-}
-
-message Engine {
-  optional int32 cylinder = 1;
-  optional int32 liters = 2;
-}
-
-message Wheel {
-  optional int32 radius = 1;
-  optional int32 width = 2;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_extension.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_extension.proto
deleted file mode 100644
index 9fe5d56..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_extension.proto
+++ /dev/null
@@ -1,45 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with nested extensions. Note that this must be defined in
-// a separate file to properly test the initialization of the outer class.
-
-
-import "com/google/protobuf/non_nested_extension.proto";
-
-package protobuf_unittest;
-
-message MyNestedExtension {
-  extend MessageToBeExtended {
-    optional MessageToBeExtended recursiveExtension = 2;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_extension_lite.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_extension_lite.proto
deleted file mode 100644
index 16ee46e..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/nested_extension_lite.proto
+++ /dev/null
@@ -1,48 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with nested extensions for a MessageLite messages. Note that
-// this must be defined in a separate file to properly test the initialization
-// of the outer class.
-
-
-package protobuf_unittest;
-
-option optimize_for = LITE_RUNTIME;
-
-import "com/google/protobuf/non_nested_extension_lite.proto";
-
-message MyNestedExtensionLite {
-  extend MessageLiteToBeExtended {
-    optional MessageLiteToBeExtended recursiveExtensionLite = 3;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/non_nested_extension.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/non_nested_extension.proto
deleted file mode 100644
index f61b419..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/non_nested_extension.proto
+++ /dev/null
@@ -1,48 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with extensions.
-
-
-package protobuf_unittest;
-
-message MessageToBeExtended {
-  extensions 1 to max;
-}
-
-message MyNonNestedExtension {
-}
-
-extend MessageToBeExtended {
-  optional MyNonNestedExtension nonNestedExtension = 1;
-}
-
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/non_nested_extension_lite.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/non_nested_extension_lite.proto
deleted file mode 100644
index 3c82659..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/non_nested_extension_lite.proto
+++ /dev/null
@@ -1,50 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: Darick Tong (darick@google.com)
-//
-// A proto file with extensions for a MessageLite messages.
-
-
-package protobuf_unittest;
-
-option optimize_for = LITE_RUNTIME;
-
-message MessageLiteToBeExtended {
-  extensions 1 to max;
-}
-
-message MyNonNestedExtensionLite {
-}
-
-extend MessageLiteToBeExtended {
-  optional MyNonNestedExtensionLite nonNestedExtensionLite = 1;
-}
-
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/test_bad_identifiers.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/test_bad_identifiers.proto
deleted file mode 100644
index 6e67d97..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/com/google/protobuf/test_bad_identifiers.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: jonp@google.com (Jon Perlow)
-
-// This file tests that various identifiers work as field and type names even
-// though the same identifiers are used internally by the java code generator.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option java_generic_services = true;   // auto-added
-
-package io_protocol_tests;
-
-option java_package = "com.google.protobuf";
-option java_outer_classname = "TestBadIdentifiersProto";
-
-message TestMessage {
-}
-
-message Descriptor {
-  option no_standard_descriptor_accessor = true;
-  optional string descriptor = 1;
-  message NestedDescriptor {
-    option no_standard_descriptor_accessor = true;
-    optional string descriptor = 1;
-  }
-  optional NestedDescriptor nested_descriptor = 2;
-}
-
-message Parser {
-  enum ParserEnum {
-    PARSER = 1;
-  }
-  optional ParserEnum parser = 1;
-}
-
-message Deprecated {
-  enum TestEnum {
-    FOO = 1;
-  }
-
-  optional int32 field1 = 1 [deprecated=true];
-  optional TestEnum field2 = 2 [deprecated=true];
-  optional TestMessage field3 = 3 [deprecated=true];
-}
-
-message Override {
-  optional int32 override = 1;
-}
-
-message Object {
-  optional int32 object = 1;
-  optional string string_object = 2;
-}
-
-message String {
-  optional string string = 1;
-}
-
-message Integer {
-  optional int32 integer = 1;
-}
-
-message Long {
-  optional int32 long = 1;
-}
-
-message Float {
-  optional float float = 1;
-}
-
-message Double {
-  optional double double = 1;
-}
-
-service TestConflictingMethodNames {
-  rpc Override(TestMessage) returns (TestMessage);
-}
-
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/descriptor.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/descriptor.proto
deleted file mode 100644
index a785f79..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/descriptor.proto
+++ /dev/null
@@ -1,620 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// The messages in this file describe the definitions found in .proto files.
-// A valid .proto file can be translated directly to a FileDescriptorProto
-// without any other information (e.g. without reading its imports).
-
-
-
-package google.protobuf;
-option java_package = "com.google.protobuf";
-option java_outer_classname = "DescriptorProtos";
-
-// descriptor.proto must be optimized for speed because reflection-based
-// algorithms don't work during bootstrapping.
-option optimize_for = SPEED;
-
-// The protocol compiler can output a FileDescriptorSet containing the .proto
-// files it parses.
-message FileDescriptorSet {
-  repeated FileDescriptorProto file = 1;
-}
-
-// Describes a complete .proto file.
-message FileDescriptorProto {
-  optional string name = 1;       // file name, relative to root of source tree
-  optional string package = 2;    // e.g. "foo", "foo.bar", etc.
-
-  // Names of files imported by this file.
-  repeated string dependency = 3;
-  // Indexes of the public imported files in the dependency list above.
-  repeated int32 public_dependency = 10;
-  // Indexes of the weak imported files in the dependency list.
-  // For Google-internal migration only. Do not use.
-  repeated int32 weak_dependency = 11;
-
-  // All top-level definitions in this file.
-  repeated DescriptorProto message_type = 4;
-  repeated EnumDescriptorProto enum_type = 5;
-  repeated ServiceDescriptorProto service = 6;
-  repeated FieldDescriptorProto extension = 7;
-
-  optional FileOptions options = 8;
-
-  // This field contains optional information about the original source code.
-  // You may safely remove this entire field whithout harming runtime
-  // functionality of the descriptors -- the information is needed only by
-  // development tools.
-  optional SourceCodeInfo source_code_info = 9;
-}
-
-// Describes a message type.
-message DescriptorProto {
-  optional string name = 1;
-
-  repeated FieldDescriptorProto field = 2;
-  repeated FieldDescriptorProto extension = 6;
-
-  repeated DescriptorProto nested_type = 3;
-  repeated EnumDescriptorProto enum_type = 4;
-
-  message ExtensionRange {
-    optional int32 start = 1;
-    optional int32 end = 2;
-  }
-  repeated ExtensionRange extension_range = 5;
-
-  optional MessageOptions options = 7;
-}
-
-// Describes a field within a message.
-message FieldDescriptorProto {
-  enum Type {
-    // 0 is reserved for errors.
-    // Order is weird for historical reasons.
-    TYPE_DOUBLE         = 1;
-    TYPE_FLOAT          = 2;
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-    // negative values are likely.
-    TYPE_INT64          = 3;
-    TYPE_UINT64         = 4;
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-    // negative values are likely.
-    TYPE_INT32          = 5;
-    TYPE_FIXED64        = 6;
-    TYPE_FIXED32        = 7;
-    TYPE_BOOL           = 8;
-    TYPE_STRING         = 9;
-    TYPE_GROUP          = 10;  // Tag-delimited aggregate.
-    TYPE_MESSAGE        = 11;  // Length-delimited aggregate.
-
-    // New in version 2.
-    TYPE_BYTES          = 12;
-    TYPE_UINT32         = 13;
-    TYPE_ENUM           = 14;
-    TYPE_SFIXED32       = 15;
-    TYPE_SFIXED64       = 16;
-    TYPE_SINT32         = 17;  // Uses ZigZag encoding.
-    TYPE_SINT64         = 18;  // Uses ZigZag encoding.
-  };
-
-  enum Label {
-    // 0 is reserved for errors
-    LABEL_OPTIONAL      = 1;
-    LABEL_REQUIRED      = 2;
-    LABEL_REPEATED      = 3;
-    // TODO(sanjay): Should we add LABEL_MAP?
-  };
-
-  optional string name = 1;
-  optional int32 number = 3;
-  optional Label label = 4;
-
-  // If type_name is set, this need not be set.  If both this and type_name
-  // are set, this must be either TYPE_ENUM or TYPE_MESSAGE.
-  optional Type type = 5;
-
-  // For message and enum types, this is the name of the type.  If the name
-  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-  // rules are used to find the type (i.e. first the nested types within this
-  // message are searched, then within the parent, on up to the root
-  // namespace).
-  optional string type_name = 6;
-
-  // For extensions, this is the name of the type being extended.  It is
-  // resolved in the same manner as type_name.
-  optional string extendee = 2;
-
-  // For numeric types, contains the original text representation of the value.
-  // For booleans, "true" or "false".
-  // For strings, contains the default text contents (not escaped in any way).
-  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-  // TODO(kenton):  Base-64 encode?
-  optional string default_value = 7;
-
-  optional FieldOptions options = 8;
-}
-
-// Describes an enum type.
-message EnumDescriptorProto {
-  optional string name = 1;
-
-  repeated EnumValueDescriptorProto value = 2;
-
-  optional EnumOptions options = 3;
-}
-
-// Describes a value within an enum.
-message EnumValueDescriptorProto {
-  optional string name = 1;
-  optional int32 number = 2;
-
-  optional EnumValueOptions options = 3;
-}
-
-// Describes a service.
-message ServiceDescriptorProto {
-  optional string name = 1;
-  repeated MethodDescriptorProto method = 2;
-
-  optional ServiceOptions options = 3;
-}
-
-// Describes a method of a service.
-message MethodDescriptorProto {
-  optional string name = 1;
-
-  // Input and output type names.  These are resolved in the same way as
-  // FieldDescriptorProto.type_name, but must refer to a message type.
-  optional string input_type = 2;
-  optional string output_type = 3;
-
-  optional MethodOptions options = 4;
-}
-
-
-// ===================================================================
-// Options
-
-// Each of the definitions above may have "options" attached.  These are
-// just annotations which may cause code to be generated slightly differently
-// or may contain hints for code that manipulates protocol messages.
-//
-// Clients may define custom options as extensions of the *Options messages.
-// These extensions may not yet be known at parsing time, so the parser cannot
-// store the values in them.  Instead it stores them in a field in the *Options
-// message called uninterpreted_option. This field must have the same name
-// across all *Options messages. We then use this field to populate the
-// extensions when we build a descriptor, at which point all protos have been
-// parsed and so all extensions are known.
-//
-// Extension numbers for custom options may be chosen as follows:
-// * For options which will only be used within a single application or
-//   organization, or for experimental options, use field numbers 50000
-//   through 99999.  It is up to you to ensure that you do not use the
-//   same number for multiple options.
-// * For options which will be published and used publicly by multiple
-//   independent entities, e-mail protobuf-global-extension-registry@google.com
-//   to reserve extension numbers. Simply provide your project name (e.g.
-//   Object-C plugin) and your porject website (if available) -- there's no need
-//   to explain how you intend to use them. Usually you only need one extension
-//   number. You can declare multiple options with only one extension number by
-//   putting them in a sub-message. See the Custom Options section of the docs
-//   for examples:
-//   http://code.google.com/apis/protocolbuffers/docs/proto.html#options
-//   If this turns out to be popular, a web service will be set up
-//   to automatically assign option numbers.
-
-
-message FileOptions {
-
-  // Sets the Java package where classes generated from this .proto will be
-  // placed.  By default, the proto package is used, but this is often
-  // inappropriate because proto packages do not normally start with backwards
-  // domain names.
-  optional string java_package = 1;
-
-
-  // If set, all the classes from the .proto file are wrapped in a single
-  // outer class with the given name.  This applies to both Proto1
-  // (equivalent to the old "--one_java_file" option) and Proto2 (where
-  // a .proto always translates to a single class, but you may want to
-  // explicitly choose the class name).
-  optional string java_outer_classname = 8;
-
-  // If set true, then the Java code generator will generate a separate .java
-  // file for each top-level message, enum, and service defined in the .proto
-  // file.  Thus, these types will *not* be nested inside the outer class
-  // named by java_outer_classname.  However, the outer class will still be
-  // generated to contain the file's getDescriptor() method as well as any
-  // top-level extensions defined in the file.
-  optional bool java_multiple_files = 10 [default=false];
-
-  // If set true, then the Java code generator will generate equals() and
-  // hashCode() methods for all messages defined in the .proto file. This is
-  // purely a speed optimization, as the AbstractMessage base class includes
-  // reflection-based implementations of these methods.
-  optional bool java_generate_equals_and_hash = 20 [default=false];
-
-  // Generated classes can be optimized for speed or code size.
-  enum OptimizeMode {
-    SPEED = 1;        // Generate complete code for parsing, serialization,
-                      // etc.
-    CODE_SIZE = 2;    // Use ReflectionOps to implement these methods.
-    LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
-  }
-  optional OptimizeMode optimize_for = 9 [default=SPEED];
-
-  // Sets the Go package where structs generated from this .proto will be
-  // placed.  There is no default.
-  optional string go_package = 11;
-
-
-
-  // Should generic services be generated in each language?  "Generic" services
-  // are not specific to any particular RPC system.  They are generated by the
-  // main code generators in each language (without additional plugins).
-  // Generic services were the only kind of service generation supported by
-  // early versions of proto2.
-  //
-  // Generic services are now considered deprecated in favor of using plugins
-  // that generate code specific to your particular RPC system.  Therefore,
-  // these default to false.  Old code which depends on generic services should
-  // explicitly set them to true.
-  optional bool cc_generic_services = 16 [default=false];
-  optional bool java_generic_services = 17 [default=false];
-  optional bool py_generic_services = 18 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message MessageOptions {
-  // Set true to use the old proto1 MessageSet wire format for extensions.
-  // This is provided for backwards-compatibility with the MessageSet wire
-  // format.  You should not use this for any other reason:  It's less
-  // efficient, has fewer features, and is more complicated.
-  //
-  // The message must be defined exactly as follows:
-  //   message Foo {
-  //     option message_set_wire_format = true;
-  //     extensions 4 to max;
-  //   }
-  // Note that the message cannot have any defined fields; MessageSets only
-  // have extensions.
-  //
-  // All extensions of your type must be singular messages; e.g. they cannot
-  // be int32s, enums, or repeated messages.
-  //
-  // Because this is an option, the above two restrictions are not enforced by
-  // the protocol compiler.
-  optional bool message_set_wire_format = 1 [default=false];
-
-  // Disables the generation of the standard "descriptor()" accessor, which can
-  // conflict with a field of the same name.  This is meant to make migration
-  // from proto1 easier; new code should avoid fields named "descriptor".
-  optional bool no_standard_descriptor_accessor = 2 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message FieldOptions {
-  // The ctype option instructs the C++ code generator to use a different
-  // representation of the field than it normally would.  See the specific
-  // options below.  This option is not yet implemented in the open source
-  // release -- sorry, we'll try to include it in a future version!
-  optional CType ctype = 1 [default = STRING];
-  enum CType {
-    // Default mode.
-    STRING = 0;
-
-    CORD = 1;
-
-    STRING_PIECE = 2;
-  }
-  // The packed option can be enabled for repeated primitive fields to enable
-  // a more efficient representation on the wire. Rather than repeatedly
-  // writing the tag and type for each element, the entire array is encoded as
-  // a single length-delimited blob.
-  optional bool packed = 2;
-
-
-
-  // Should this field be parsed lazily?  Lazy applies only to message-type
-  // fields.  It means that when the outer message is initially parsed, the
-  // inner message's contents will not be parsed but instead stored in encoded
-  // form.  The inner message will actually be parsed when it is first accessed.
-  //
-  // This is only a hint.  Implementations are free to choose whether to use
-  // eager or lazy parsing regardless of the value of this option.  However,
-  // setting this option true suggests that the protocol author believes that
-  // using lazy parsing on this field is worth the additional bookkeeping
-  // overhead typically needed to implement it.
-  //
-  // This option does not affect the public interface of any generated code;
-  // all method signatures remain the same.  Furthermore, thread-safety of the
-  // interface is not affected by this option; const methods remain safe to
-  // call from multiple threads concurrently, while non-const methods continue
-  // to require exclusive access.
-  //
-  //
-  // Note that implementations may choose not to check required fields within
-  // a lazy sub-message.  That is, calling IsInitialized() on the outher message
-  // may return true even if the inner message has missing required fields.
-  // This is necessary because otherwise the inner message would have to be
-  // parsed in order to perform the check, defeating the purpose of lazy
-  // parsing.  An implementation which chooses not to check required fields
-  // must be consistent about it.  That is, for any particular sub-message, the
-  // implementation must either *always* check its required fields, or *never*
-  // check its required fields, regardless of whether or not the message has
-  // been parsed.
-  optional bool lazy = 5 [default=false];
-
-  // Is this field deprecated?
-  // Depending on the target platform, this can emit Deprecated annotations
-  // for accessors, or it will be completely ignored; in the very least, this
-  // is a formalization for deprecating fields.
-  optional bool deprecated = 3 [default=false];
-
-  // EXPERIMENTAL.  DO NOT USE.
-  // For "map" fields, the name of the field in the enclosed type that
-  // is the key for this map.  For example, suppose we have:
-  //   message Item {
-  //     required string name = 1;
-  //     required string value = 2;
-  //   }
-  //   message Config {
-  //     repeated Item items = 1 [experimental_map_key="name"];
-  //   }
-  // In this situation, the map key for Item will be set to "name".
-  // TODO: Fully-implement this, then remove the "experimental_" prefix.
-  optional string experimental_map_key = 9;
-
-  // For Google-internal migration only. Do not use.
-  optional bool weak = 10 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message EnumOptions {
-
-  // Set this option to false to disallow mapping different tag names to a same
-  // value.
-  optional bool allow_alias = 2 [default=true];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message EnumValueOptions {
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message ServiceOptions {
-
-  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-  //   framework.  We apologize for hoarding these numbers to ourselves, but
-  //   we were already using them long before we decided to release Protocol
-  //   Buffers.
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message MethodOptions {
-
-  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-  //   framework.  We apologize for hoarding these numbers to ourselves, but
-  //   we were already using them long before we decided to release Protocol
-  //   Buffers.
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-
-// A message representing a option the parser does not recognize. This only
-// appears in options protos created by the compiler::Parser class.
-// DescriptorPool resolves these when building Descriptor objects. Therefore,
-// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-// in them.
-message UninterpretedOption {
-  // The name of the uninterpreted option.  Each string represents a segment in
-  // a dot-separated name.  is_extension is true iff a segment represents an
-  // extension (denoted with parentheses in options specs in .proto files).
-  // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
-  // "foo.(bar.baz).qux".
-  message NamePart {
-    required string name_part = 1;
-    required bool is_extension = 2;
-  }
-  repeated NamePart name = 2;
-
-  // The value of the uninterpreted option, in whatever type the tokenizer
-  // identified it as during parsing. Exactly one of these should be set.
-  optional string identifier_value = 3;
-  optional uint64 positive_int_value = 4;
-  optional int64 negative_int_value = 5;
-  optional double double_value = 6;
-  optional bytes string_value = 7;
-  optional string aggregate_value = 8;
-}
-
-// ===================================================================
-// Optional source code info
-
-// Encapsulates information about the original source file from which a
-// FileDescriptorProto was generated.
-message SourceCodeInfo {
-  // A Location identifies a piece of source code in a .proto file which
-  // corresponds to a particular definition.  This information is intended
-  // to be useful to IDEs, code indexers, documentation generators, and similar
-  // tools.
-  //
-  // For example, say we have a file like:
-  //   message Foo {
-  //     optional string foo = 1;
-  //   }
-  // Let's look at just the field definition:
-  //   optional string foo = 1;
-  //   ^       ^^     ^^  ^  ^^^
-  //   a       bc     de  f  ghi
-  // We have the following locations:
-  //   span   path               represents
-  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-  //
-  // Notes:
-  // - A location may refer to a repeated field itself (i.e. not to any
-  //   particular index within it).  This is used whenever a set of elements are
-  //   logically enclosed in a single code segment.  For example, an entire
-  //   extend block (possibly containing multiple extension definitions) will
-  //   have an outer location whose path refers to the "extensions" repeated
-  //   field without an index.
-  // - Multiple locations may have the same path.  This happens when a single
-  //   logical declaration is spread out across multiple places.  The most
-  //   obvious example is the "extend" block again -- there may be multiple
-  //   extend blocks in the same scope, each of which will have the same path.
-  // - A location's span is not always a subset of its parent's span.  For
-  //   example, the "extendee" of an extension declaration appears at the
-  //   beginning of the "extend" block and is shared by all extensions within
-  //   the block.
-  // - Just because a location's span is a subset of some other location's span
-  //   does not mean that it is a descendent.  For example, a "group" defines
-  //   both a type and a field in a single declaration.  Thus, the locations
-  //   corresponding to the type and field and their components will overlap.
-  // - Code which tries to interpret locations should probably be designed to
-  //   ignore those that it doesn't understand, as more types of locations could
-  //   be recorded in the future.
-  repeated Location location = 1;
-  message Location {
-    // Identifies which part of the FileDescriptorProto was defined at this
-    // location.
-    //
-    // Each element is a field number or an index.  They form a path from
-    // the root FileDescriptorProto to the place where the definition.  For
-    // example, this path:
-    //   [ 4, 3, 2, 7, 1 ]
-    // refers to:
-    //   file.message_type(3)  // 4, 3
-    //       .field(7)         // 2, 7
-    //       .name()           // 1
-    // This is because FileDescriptorProto.message_type has field number 4:
-    //   repeated DescriptorProto message_type = 4;
-    // and DescriptorProto.field has field number 2:
-    //   repeated FieldDescriptorProto field = 2;
-    // and FieldDescriptorProto.name has field number 1:
-    //   optional string name = 1;
-    //
-    // Thus, the above path gives the location of a field name.  If we removed
-    // the last element:
-    //   [ 4, 3, 2, 7 ]
-    // this path refers to the whole field declaration (from the beginning
-    // of the label to the terminating semicolon).
-    repeated int32 path = 1 [packed=true];
-
-    // Always has exactly three or four elements: start line, start column,
-    // end line (optional, otherwise assumed same as start line), end column.
-    // These are packed into a single field for efficiency.  Note that line
-    // and column numbers are zero-based -- typically you will want to add
-    // 1 to each before displaying to a user.
-    repeated int32 span = 2 [packed=true];
-
-    // If this SourceCodeInfo represents a complete declaration, these are any
-    // comments appearing before and after the declaration which appear to be
-    // attached to the declaration.
-    //
-    // A series of line comments appearing on consecutive lines, with no other
-    // tokens appearing on those lines, will be treated as a single comment.
-    //
-    // Only the comment content is provided; comment markers (e.g. //) are
-    // stripped out.  For block comments, leading whitespace and an asterisk
-    // will be stripped from the beginning of each line other than the first.
-    // Newlines are included in the output.
-    //
-    // Examples:
-    //
-    //   optional int32 foo = 1;  // Comment attached to foo.
-    //   // Comment attached to bar.
-    //   optional int32 bar = 2;
-    //
-    //   optional string baz = 3;
-    //   // Comment attached to baz.
-    //   // Another line attached to baz.
-    //
-    //   // Comment attached to qux.
-    //   //
-    //   // Another line attached to qux.
-    //   optional double qux = 4;
-    //
-    //   optional string corge = 5;
-    //   /* Block comment attached
-    //    * to corge.  Leading asterisks
-    //    * will be removed. */
-    //   /* Block comment attached to
-    //    * grault. */
-    //   optional int32 grault = 6;
-    optional string leading_comments = 3;
-    optional string trailing_comments = 4;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest.proto
deleted file mode 100644
index 6eb2d86..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest.proto
+++ /dev/null
@@ -1,719 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;     // auto-added
-
-import "google/protobuf/unittest_import.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestProto";
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-message TestAllTypes {
-  message NestedMessage {
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    optional int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-  }
-
-  // Singular
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional NestedMessage                        optional_nested_message  = 18;
-  optional ForeignMessage                       optional_foreign_message = 19;
-  optional protobuf_unittest_import.ImportMessage optional_import_message  = 20;
-
-  optional NestedEnum                           optional_nested_enum     = 21;
-  optional ForeignEnum                          optional_foreign_enum    = 22;
-  optional protobuf_unittest_import.ImportEnum    optional_import_enum     = 23;
-
-  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
-  optional string optional_cord = 25 [ctype=CORD];
-
-  // Defined in unittest_import_public.proto
-  optional protobuf_unittest_import.PublicImportMessage
-      optional_public_import_message = 26;
-
-  optional NestedMessage optional_lazy_message = 27 [lazy=true];
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated NestedMessage                        repeated_nested_message  = 48;
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
-
-  repeated NestedEnum                           repeated_nested_enum     = 51;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32    = 61 [default =  41    ];
-  optional    int64 default_int64    = 62 [default =  42    ];
-  optional   uint32 default_uint32   = 63 [default =  43    ];
-  optional   uint64 default_uint64   = 64 [default =  44    ];
-  optional   sint32 default_sint32   = 65 [default = -45    ];
-  optional   sint64 default_sint64   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
-  optional    float default_float    = 71 [default =  51.5  ];
-  optional   double default_double   = 72 [default =  52e3  ];
-  optional     bool default_bool     = 73 [default = true   ];
-  optional   string default_string   = 74 [default = "hello"];
-  optional    bytes default_bytes    = 75 [default = "world"];
-
-  optional NestedEnum  default_nested_enum  = 81 [default = BAR        ];
-  optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
-  optional protobuf_unittest_import.ImportEnum
-      default_import_enum = 83 [default = IMPORT_BAR];
-
-  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
-  optional string default_cord = 85 [ctype=CORD,default="123"];
-}
-
-message TestDeprecatedFields {
-  optional int32 deprecated_int32 = 1 [deprecated=true];
-}
-
-// Define these after TestAllTypes to make sure the compiler can handle
-// that.
-message ForeignMessage {
-  optional int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestAllExtensions {
-  extensions 1 to max;
-}
-
-extend TestAllExtensions {
-  // Singular
-  optional    int32 optional_int32_extension    =  1;
-  optional    int64 optional_int64_extension    =  2;
-  optional   uint32 optional_uint32_extension   =  3;
-  optional   uint64 optional_uint64_extension   =  4;
-  optional   sint32 optional_sint32_extension   =  5;
-  optional   sint64 optional_sint64_extension   =  6;
-  optional  fixed32 optional_fixed32_extension  =  7;
-  optional  fixed64 optional_fixed64_extension  =  8;
-  optional sfixed32 optional_sfixed32_extension =  9;
-  optional sfixed64 optional_sfixed64_extension = 10;
-  optional    float optional_float_extension    = 11;
-  optional   double optional_double_extension   = 12;
-  optional     bool optional_bool_extension     = 13;
-  optional   string optional_string_extension   = 14;
-  optional    bytes optional_bytes_extension    = 15;
-
-  optional group OptionalGroup_extension = 16 {
-    optional int32 a = 17;
-  }
-
-  optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;
-  optional ForeignMessage optional_foreign_message_extension = 19;
-  optional protobuf_unittest_import.ImportMessage
-    optional_import_message_extension = 20;
-
-  optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;
-  optional ForeignEnum optional_foreign_enum_extension = 22;
-  optional protobuf_unittest_import.ImportEnum
-    optional_import_enum_extension = 23;
-
-  optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];
-  optional string optional_cord_extension = 25 [ctype=CORD];
-
-  optional protobuf_unittest_import.PublicImportMessage
-    optional_public_import_message_extension = 26;
-
-  optional TestAllTypes.NestedMessage
-    optional_lazy_message_extension = 27 [lazy=true];
-
-  // Repeated
-  repeated    int32 repeated_int32_extension    = 31;
-  repeated    int64 repeated_int64_extension    = 32;
-  repeated   uint32 repeated_uint32_extension   = 33;
-  repeated   uint64 repeated_uint64_extension   = 34;
-  repeated   sint32 repeated_sint32_extension   = 35;
-  repeated   sint64 repeated_sint64_extension   = 36;
-  repeated  fixed32 repeated_fixed32_extension  = 37;
-  repeated  fixed64 repeated_fixed64_extension  = 38;
-  repeated sfixed32 repeated_sfixed32_extension = 39;
-  repeated sfixed64 repeated_sfixed64_extension = 40;
-  repeated    float repeated_float_extension    = 41;
-  repeated   double repeated_double_extension   = 42;
-  repeated     bool repeated_bool_extension     = 43;
-  repeated   string repeated_string_extension   = 44;
-  repeated    bytes repeated_bytes_extension    = 45;
-
-  repeated group RepeatedGroup_extension = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;
-  repeated ForeignMessage repeated_foreign_message_extension = 49;
-  repeated protobuf_unittest_import.ImportMessage
-    repeated_import_message_extension = 50;
-
-  repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;
-  repeated ForeignEnum repeated_foreign_enum_extension = 52;
-  repeated protobuf_unittest_import.ImportEnum
-    repeated_import_enum_extension = 53;
-
-  repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord_extension = 55 [ctype=CORD];
-
-  repeated TestAllTypes.NestedMessage
-    repeated_lazy_message_extension = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32_extension    = 61 [default =  41    ];
-  optional    int64 default_int64_extension    = 62 [default =  42    ];
-  optional   uint32 default_uint32_extension   = 63 [default =  43    ];
-  optional   uint64 default_uint64_extension   = 64 [default =  44    ];
-  optional   sint32 default_sint32_extension   = 65 [default = -45    ];
-  optional   sint64 default_sint64_extension   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32_extension  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64_extension  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32_extension = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64_extension = 70 [default = -50    ];
-  optional    float default_float_extension    = 71 [default =  51.5  ];
-  optional   double default_double_extension   = 72 [default =  52e3  ];
-  optional     bool default_bool_extension     = 73 [default = true   ];
-  optional   string default_string_extension   = 74 [default = "hello"];
-  optional    bytes default_bytes_extension    = 75 [default = "world"];
-
-  optional TestAllTypes.NestedEnum
-    default_nested_enum_extension = 81 [default = BAR];
-  optional ForeignEnum
-    default_foreign_enum_extension = 82 [default = FOREIGN_BAR];
-  optional protobuf_unittest_import.ImportEnum
-    default_import_enum_extension = 83 [default = IMPORT_BAR];
-
-  optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,
-                                                       default="abc"];
-  optional string default_cord_extension = 85 [ctype=CORD, default="123"];
-}
-
-message TestNestedExtension {
-  extend TestAllExtensions {
-    // Check for bug where string extensions declared in tested scope did not
-    // compile.
-    optional string test = 1002 [default="test"];
-  }
-}
-
-// We have separate messages for testing required fields because it's
-// annoying to have to fill in required fields in TestProto in order to
-// do anything with it.  Note that we don't need to test every type of
-// required filed because the code output is basically identical to
-// optional fields for all types.
-message TestRequired {
-  required int32 a = 1;
-  optional int32 dummy2 = 2;
-  required int32 b = 3;
-
-  extend TestAllExtensions {
-    optional TestRequired single = 1000;
-    repeated TestRequired multi  = 1001;
-  }
-
-  // Pad the field count to 32 so that we can test that IsInitialized()
-  // properly checks multiple elements of has_bits_.
-  optional int32 dummy4  =  4;
-  optional int32 dummy5  =  5;
-  optional int32 dummy6  =  6;
-  optional int32 dummy7  =  7;
-  optional int32 dummy8  =  8;
-  optional int32 dummy9  =  9;
-  optional int32 dummy10 = 10;
-  optional int32 dummy11 = 11;
-  optional int32 dummy12 = 12;
-  optional int32 dummy13 = 13;
-  optional int32 dummy14 = 14;
-  optional int32 dummy15 = 15;
-  optional int32 dummy16 = 16;
-  optional int32 dummy17 = 17;
-  optional int32 dummy18 = 18;
-  optional int32 dummy19 = 19;
-  optional int32 dummy20 = 20;
-  optional int32 dummy21 = 21;
-  optional int32 dummy22 = 22;
-  optional int32 dummy23 = 23;
-  optional int32 dummy24 = 24;
-  optional int32 dummy25 = 25;
-  optional int32 dummy26 = 26;
-  optional int32 dummy27 = 27;
-  optional int32 dummy28 = 28;
-  optional int32 dummy29 = 29;
-  optional int32 dummy30 = 30;
-  optional int32 dummy31 = 31;
-  optional int32 dummy32 = 32;
-
-  required int32 c = 33;
-}
-
-message TestRequiredForeign {
-  optional TestRequired optional_message = 1;
-  repeated TestRequired repeated_message = 2;
-  optional int32 dummy = 3;
-}
-
-// Test that we can use NestedMessage from outside TestAllTypes.
-message TestForeignNested {
-  optional TestAllTypes.NestedMessage foreign_nested = 1;
-}
-
-// TestEmptyMessage is used to test unknown field support.
-message TestEmptyMessage {
-}
-
-// Like above, but declare all field numbers as potential extensions.  No
-// actual extensions should ever be defined for this type.
-message TestEmptyMessageWithExtensions {
-  extensions 1 to max;
-}
-
-message TestMultipleExtensionRanges {
-  extensions 42;
-  extensions 4143 to 4243;
-  extensions 65536 to max;
-}
-
-// Test that really large tag numbers don't break anything.
-message TestReallyLargeTagNumber {
-  // The largest possible tag number is 2^28 - 1, since the wire format uses
-  // three bits to communicate wire type.
-  optional int32 a = 1;
-  optional int32 bb = 268435455;
-}
-
-message TestRecursiveMessage {
-  optional TestRecursiveMessage a = 1;
-  optional int32 i = 2;
-}
-
-// Test that mutual recursion works.
-message TestMutualRecursionA {
-  optional TestMutualRecursionB bb = 1;
-}
-
-message TestMutualRecursionB {
-  optional TestMutualRecursionA a = 1;
-  optional int32 optional_int32 = 2;
-}
-
-// Test that groups have disjoint field numbers from their siblings and
-// parents.  This is NOT possible in proto1; only proto2.  When attempting
-// to compile with proto1, this will emit an error; so we only include it
-// in protobuf_unittest_proto.
-message TestDupFieldNumber {                        // NO_PROTO1
-  optional int32 a = 1;                             // NO_PROTO1
-  optional group Foo = 2 { optional int32 a = 1; }  // NO_PROTO1
-  optional group Bar = 3 { optional int32 a = 1; }  // NO_PROTO1
-}                                                   // NO_PROTO1
-
-// Additional messages for testing lazy fields.
-message TestEagerMessage {
-  optional TestAllTypes sub_message = 1 [lazy=false];
-}
-message TestLazyMessage {
-  optional TestAllTypes sub_message = 1 [lazy=true];
-}
-
-// Needed for a Python test.
-message TestNestedMessageHasBits {
-  message NestedMessage {
-    repeated int32 nestedmessage_repeated_int32 = 1;
-    repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2;
-  }
-  optional NestedMessage optional_nested_message = 1;
-}
-
-
-// Test an enum that has multiple values with the same number.
-enum TestEnumWithDupValue {
-  option allow_alias = true;
-  FOO1 = 1;
-  BAR1 = 2;
-  BAZ = 3;
-  FOO2 = 1;
-  BAR2 = 2;
-}
-
-// Test an enum with large, unordered values.
-enum TestSparseEnum {
-  SPARSE_A = 123;
-  SPARSE_B = 62374;
-  SPARSE_C = 12589234;
-  SPARSE_D = -15;
-  SPARSE_E = -53452;
-  SPARSE_F = 0;
-  SPARSE_G = 2;
-}
-
-// Test message with CamelCase field names.  This violates Protocol Buffer
-// standard style.
-message TestCamelCaseFieldNames {
-  optional int32 PrimitiveField = 1;
-  optional string StringField = 2;
-  optional ForeignEnum EnumField = 3;
-  optional ForeignMessage MessageField = 4;
-  optional string StringPieceField = 5 [ctype=STRING_PIECE];
-  optional string CordField = 6 [ctype=CORD];
-
-  repeated int32 RepeatedPrimitiveField = 7;
-  repeated string RepeatedStringField = 8;
-  repeated ForeignEnum RepeatedEnumField = 9;
-  repeated ForeignMessage RepeatedMessageField = 10;
-  repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];
-  repeated string RepeatedCordField = 12 [ctype=CORD];
-}
-
-
-// We list fields out of order, to ensure that we're using field number and not
-// field index to determine serialization order.
-message TestFieldOrderings {
-  optional string my_string = 11;
-  extensions 2 to 10;
-  optional int64 my_int = 1;
-  extensions 12 to 100;
-  optional float my_float = 101;
-}
-
-
-extend TestFieldOrderings {
-  optional string my_extension_string = 50;
-  optional int32 my_extension_int = 5;
-}
-
-
-message TestExtremeDefaultValues {
-  optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"];
-  optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF];
-  optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF];
-  optional  int32 small_int32  = 4 [default = -0x7FFFFFFF];
-  optional  int64 small_int64  = 5 [default = -0x7FFFFFFFFFFFFFFF];
-  optional  int32 really_small_int32 = 21 [default = -0x80000000];
-  optional  int64 really_small_int64 = 22 [default = -0x8000000000000000];
-
-  // The default value here is UTF-8 for "\u1234".  (We could also just type
-  // the UTF-8 text directly into this text file rather than escape it, but
-  // lots of people use editors that would be confused by this.)
-  optional string utf8_string = 6 [default = "\341\210\264"];
-
-  // Tests for single-precision floating-point values.
-  optional float zero_float = 7 [default = 0];
-  optional float one_float = 8 [default = 1];
-  optional float small_float = 9 [default = 1.5];
-  optional float negative_one_float = 10 [default = -1];
-  optional float negative_float = 11 [default = -1.5];
-  // Using exponents
-  optional float large_float = 12 [default = 2E8];
-  optional float small_negative_float = 13 [default = -8e-28];
-
-  // Text for nonfinite floating-point values.
-  optional double inf_double = 14 [default = inf];
-  optional double neg_inf_double = 15 [default = -inf];
-  optional double nan_double = 16 [default = nan];
-  optional float inf_float = 17 [default = inf];
-  optional float neg_inf_float = 18 [default = -inf];
-  optional float nan_float = 19 [default = nan];
-
-  // Tests for C++ trigraphs.
-  // Trigraphs should be escaped in C++ generated files, but they should not be
-  // escaped for other languages.
-  // Note that in .proto file, "\?" is a valid way to escape ? in string
-  // literals.
-  optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"];
-
-  // String defaults containing the character '\000'
-  optional string string_with_zero       = 23 [default = "hel\000lo"];
-  optional  bytes bytes_with_zero        = 24 [default = "wor\000ld"];
-  optional string string_piece_with_zero = 25 [ctype=STRING_PIECE,
-                                               default="ab\000c"];
-  optional string cord_with_zero         = 26 [ctype=CORD,
-                                               default="12\0003"];
-}
-
-message SparseEnumMessage {
-  optional TestSparseEnum sparse_enum = 1;
-}
-
-// Test String and Bytes: string is for valid UTF-8 strings
-message OneString {
-  optional string data = 1;
-}
-
-message MoreString {
-  repeated string data = 1;
-}
-
-message OneBytes {
-  optional bytes data = 1;
-}
-
-message MoreBytes {
-  repeated bytes data = 1;
-}
-
-
-// Test messages for packed fields
-
-message TestPackedTypes {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnum packed_enum  = 103 [packed = true];
-}
-
-// A message with the same fields as TestPackedTypes, but without packing. Used
-// to test packed <-> unpacked wire compatibility.
-message TestUnpackedTypes {
-  repeated    int32 unpacked_int32    =  90 [packed = false];
-  repeated    int64 unpacked_int64    =  91 [packed = false];
-  repeated   uint32 unpacked_uint32   =  92 [packed = false];
-  repeated   uint64 unpacked_uint64   =  93 [packed = false];
-  repeated   sint32 unpacked_sint32   =  94 [packed = false];
-  repeated   sint64 unpacked_sint64   =  95 [packed = false];
-  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
-  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
-  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
-  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
-  repeated    float unpacked_float    = 100 [packed = false];
-  repeated   double unpacked_double   = 101 [packed = false];
-  repeated     bool unpacked_bool     = 102 [packed = false];
-  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
-}
-
-message TestPackedExtensions {
-  extensions 1 to max;
-}
-
-extend TestPackedExtensions {
-  repeated    int32 packed_int32_extension    =  90 [packed = true];
-  repeated    int64 packed_int64_extension    =  91 [packed = true];
-  repeated   uint32 packed_uint32_extension   =  92 [packed = true];
-  repeated   uint64 packed_uint64_extension   =  93 [packed = true];
-  repeated   sint32 packed_sint32_extension   =  94 [packed = true];
-  repeated   sint64 packed_sint64_extension   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32_extension  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64_extension  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32_extension =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64_extension =  99 [packed = true];
-  repeated    float packed_float_extension    = 100 [packed = true];
-  repeated   double packed_double_extension   = 101 [packed = true];
-  repeated     bool packed_bool_extension     = 102 [packed = true];
-  repeated ForeignEnum packed_enum_extension  = 103 [packed = true];
-}
-
-// Used by ExtensionSetTest/DynamicExtensions.  The test actually builds
-// a set of extensions to TestAllExtensions dynamically, based on the fields
-// of this message type.
-message TestDynamicExtensions {
-  enum DynamicEnumType {
-    DYNAMIC_FOO = 2200;
-    DYNAMIC_BAR = 2201;
-    DYNAMIC_BAZ = 2202;
-  }
-  message DynamicMessageType {
-    optional int32 dynamic_field = 2100;
-  }
-
-  optional fixed32 scalar_extension = 2000;
-  optional ForeignEnum enum_extension = 2001;
-  optional DynamicEnumType dynamic_enum_extension = 2002;
-
-  optional ForeignMessage message_extension = 2003;
-  optional DynamicMessageType dynamic_message_extension = 2004;
-
-  repeated string repeated_extension = 2005;
-  repeated sint32 packed_extension = 2006 [packed = true];
-}
-
-message TestRepeatedScalarDifferentTagSizes {
-  // Parsing repeated fixed size values used to fail. This message needs to be
-  // used in order to get a tag of the right size; all of the repeated fields
-  // in TestAllTypes didn't trigger the check.
-  repeated fixed32 repeated_fixed32 = 12;
-  // Check for a varint type, just for good measure.
-  repeated int32   repeated_int32   = 13;
-
-  // These have two-byte tags.
-  repeated fixed64 repeated_fixed64 = 2046;
-  repeated int64   repeated_int64   = 2047;
-
-  // Three byte tags.
-  repeated float   repeated_float   = 262142;
-  repeated uint64  repeated_uint64  = 262143;
-}
-
-// Test that if an optional or required message/group field appears multiple
-// times in the input, they need to be merged.
-message TestParsingMerge {
-  // RepeatedFieldsGenerator defines matching field types as TestParsingMerge,
-  // except that all fields are repeated. In the tests, we will serialize the
-  // RepeatedFieldsGenerator to bytes, and parse the bytes to TestParsingMerge.
-  // Repeated fields in RepeatedFieldsGenerator are expected to be merged into
-  // the corresponding required/optional fields in TestParsingMerge.
-  message RepeatedFieldsGenerator {
-    repeated TestAllTypes field1 = 1;
-    repeated TestAllTypes field2 = 2;
-    repeated TestAllTypes field3 = 3;
-    repeated group Group1 = 10 {
-      optional TestAllTypes field1 = 11;
-    }
-    repeated group Group2 = 20 {
-      optional TestAllTypes field1 = 21;
-    }
-    repeated TestAllTypes ext1 = 1000;
-    repeated TestAllTypes ext2 = 1001;
-  }
-  required TestAllTypes required_all_types = 1;
-  optional TestAllTypes optional_all_types = 2;
-  repeated TestAllTypes repeated_all_types = 3;
-  optional group OptionalGroup = 10 {
-    optional TestAllTypes optional_group_all_types = 11;
-  }
-  repeated group RepeatedGroup = 20 {
-    optional TestAllTypes repeated_group_all_types = 21;
-  }
-  extensions 1000 to max;
-  extend TestParsingMerge {
-    optional TestAllTypes optional_ext = 1000;
-    repeated TestAllTypes repeated_ext = 1001;
-  }
-}
-
-message TestCommentInjectionMessage {
-  // */ <- This should not close the generated doc comment
-  optional string a = 1 [default="*/ <- Neither should this."];
-}
-
-
-// Test that RPC services work.
-message FooRequest  {}
-message FooResponse {}
-
-message FooClientMessage {}
-message FooServerMessage{}
-
-service TestService {
-  rpc Foo(FooRequest) returns (FooResponse);
-  rpc Bar(BarRequest) returns (BarResponse);
-}
-
-
-message BarRequest  {}
-message BarResponse {}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_custom_options.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_custom_options.proto
deleted file mode 100644
index e591d29..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_custom_options.proto
+++ /dev/null
@@ -1,387 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: benjy@google.com (Benjy Weinberger)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file used to test the "custom options" feature of proto2.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;
-
-// A custom file option (defined below).
-option (file_opt1) = 9876543210;
-
-import "google/protobuf/descriptor.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-package protobuf_unittest;
-
-
-// Some simple test custom options of various types.
-
-extend google.protobuf.FileOptions {
-  optional uint64 file_opt1 = 7736974;
-}
-
-extend google.protobuf.MessageOptions {
-  optional int32 message_opt1 = 7739036;
-}
-
-extend google.protobuf.FieldOptions {
-  optional fixed64 field_opt1 = 7740936;
-  // This is useful for testing that we correctly register default values for
-  // extension options.
-  optional int32 field_opt2 = 7753913 [default=42];
-}
-
-extend google.protobuf.EnumOptions {
-  optional sfixed32 enum_opt1 = 7753576;
-}
-
-extend google.protobuf.EnumValueOptions {
-  optional int32 enum_value_opt1 = 1560678;
-}
-
-extend google.protobuf.ServiceOptions {
-  optional sint64 service_opt1 = 7887650;
-}
-
-enum MethodOpt1 {
-  METHODOPT1_VAL1 = 1;
-  METHODOPT1_VAL2 = 2;
-}
-
-extend google.protobuf.MethodOptions {
-  optional MethodOpt1 method_opt1 = 7890860;
-}
-
-// A test message with custom options at all possible locations (and also some
-// regular options, to make sure they interact nicely).
-message TestMessageWithCustomOptions {
-  option message_set_wire_format = false;
-
-  option (message_opt1) = -56;
-
-  optional string field1 = 1 [ctype=CORD,
-                              (field_opt1)=8765432109];
-
-  enum AnEnum {
-    option (enum_opt1) = -789;
-
-    ANENUM_VAL1 = 1;
-    ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
-  }
-}
-
-
-// A test RPC service with custom options at all possible locations (and also
-// some regular options, to make sure they interact nicely).
-message CustomOptionFooRequest {
-}
-
-message CustomOptionFooResponse {
-}
-
-message CustomOptionFooClientMessage {
-}
-
-message CustomOptionFooServerMessage {
-}
-
-service TestServiceWithCustomOptions {
-  option (service_opt1) = -9876543210;
-
-  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
-    option (method_opt1) = METHODOPT1_VAL2;
-  }
-}
-
-
-
-// Options of every possible field type, so we can test them all exhaustively.
-
-message DummyMessageContainingEnum {
-  enum TestEnumType {
-    TEST_OPTION_ENUM_TYPE1 = 22;
-    TEST_OPTION_ENUM_TYPE2 = -23;
-  }
-}
-
-message DummyMessageInvalidAsOptionType {
-}
-
-extend google.protobuf.MessageOptions {
-  optional         bool     bool_opt = 7706090;
-  optional        int32    int32_opt = 7705709;
-  optional        int64    int64_opt = 7705542;
-  optional       uint32   uint32_opt = 7704880;
-  optional       uint64   uint64_opt = 7702367;
-  optional       sint32   sint32_opt = 7701568;
-  optional       sint64   sint64_opt = 7700863;
-  optional      fixed32  fixed32_opt = 7700307;
-  optional      fixed64  fixed64_opt = 7700194;
-  optional     sfixed32 sfixed32_opt = 7698645;
-  optional     sfixed64 sfixed64_opt = 7685475;
-  optional        float    float_opt = 7675390;
-  optional       double   double_opt = 7673293;
-  optional       string   string_opt = 7673285;
-  optional        bytes    bytes_opt = 7673238;
-  optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;
-  optional DummyMessageInvalidAsOptionType message_type_opt = 7665967;
-}
-
-message CustomOptionMinIntegerValues {
-  option     (bool_opt) = false;
-  option    (int32_opt) = -0x80000000;
-  option    (int64_opt) = -0x8000000000000000;
-  option   (uint32_opt) = 0;
-  option   (uint64_opt) = 0;
-  option   (sint32_opt) = -0x80000000;
-  option   (sint64_opt) = -0x8000000000000000;
-  option  (fixed32_opt) = 0;
-  option  (fixed64_opt) = 0;
-  option (sfixed32_opt) = -0x80000000;
-  option (sfixed64_opt) = -0x8000000000000000;
-}
-
-message CustomOptionMaxIntegerValues {
-  option     (bool_opt) = true;
-  option    (int32_opt) = 0x7FFFFFFF;
-  option    (int64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option   (uint32_opt) = 0xFFFFFFFF;
-  option   (uint64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option   (sint32_opt) = 0x7FFFFFFF;
-  option   (sint64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option  (fixed32_opt) = 0xFFFFFFFF;
-  option  (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option (sfixed32_opt) = 0x7FFFFFFF;
-  option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;
-}
-
-message CustomOptionOtherValues {
-  option  (int32_opt) = -100;  // To test sign-extension.
-  option  (float_opt) = 12.3456789;
-  option (double_opt) = 1.234567890123456789;
-  option (string_opt) = "Hello, \"World\"";
-  option  (bytes_opt) = "Hello\0World";
-  option   (enum_opt) = TEST_OPTION_ENUM_TYPE2;
-}
-
-message SettingRealsFromPositiveInts {
-  option  (float_opt) = 12;
-  option (double_opt) = 154;
-}
-
-message SettingRealsFromNegativeInts {
-  option  (float_opt) = -12;
-  option  (double_opt) = -154;
-}
-
-// Options of complex message types, themselves combined and extended in
-// various ways.
-
-message ComplexOptionType1 {
-  optional int32 foo = 1;
-  optional int32 foo2 = 2;
-  optional int32 foo3 = 3;
-
-  extensions 100 to max;
-}
-
-message ComplexOptionType2 {
-  optional ComplexOptionType1 bar = 1;
-  optional int32 baz = 2;
-
-  message ComplexOptionType4 {
-    optional int32 waldo = 1;
-
-    extend google.protobuf.MessageOptions {
-      optional ComplexOptionType4 complex_opt4 = 7633546;
-    }
-  }
-
-  optional ComplexOptionType4 fred = 3;
-
-  extensions 100 to max;
-}
-
-message ComplexOptionType3 {
-  optional int32 qux = 1;
-
-  optional group ComplexOptionType5 = 2 {
-    optional int32 plugh = 3;
-  }
-}
-
-extend ComplexOptionType1 {
-  optional int32 quux = 7663707;
-  optional ComplexOptionType3 corge = 7663442;
-}
-
-extend ComplexOptionType2 {
-  optional int32 grault = 7650927;
-  optional ComplexOptionType1 garply = 7649992;
-}
-
-extend google.protobuf.MessageOptions {
-  optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;
-  optional ComplexOptionType2 complex_opt2 = 7636949;
-  optional ComplexOptionType3 complex_opt3 = 7636463;
-  optional group ComplexOpt6 = 7595468 {
-    optional int32 xyzzy = 7593951;
-  }
-}
-
-// Note that we try various different ways of naming the same extension.
-message VariousComplexOptions {
-  option (.protobuf_unittest.complex_opt1).foo = 42;
-  option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324;
-  option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876;
-  option (complex_opt2).baz = 987;
-  option (complex_opt2).(grault) = 654;
-  option (complex_opt2).bar.foo = 743;
-  option (complex_opt2).bar.(quux) = 1999;
-  option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008;
-  option (complex_opt2).(garply).foo = 741;
-  option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998;
-  option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121;
-  option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
-  option (complex_opt2).fred.waldo = 321;
-  option (protobuf_unittest.complex_opt3).qux = 9;
-  option (complex_opt3).complexoptiontype5.plugh = 22;
-  option (complexopt6).xyzzy = 24;
-}
-
-// ------------------------------------------------------
-// Definitions for testing aggregate option parsing.
-// See descriptor_unittest.cc.
-
-message AggregateMessageSet {
-  option message_set_wire_format = true;
-  extensions 4 to max;
-}
-
-message AggregateMessageSetElement {
-  extend AggregateMessageSet {
-    optional AggregateMessageSetElement message_set_extension = 15447542;
-  }
-  optional string s = 1;
-}
-
-// A helper type used to test aggregate option parsing
-message Aggregate {
-  optional int32 i = 1;
-  optional string s = 2;
-
-  // A nested object
-  optional Aggregate sub = 3;
-
-  // To test the parsing of extensions inside aggregate values
-  optional google.protobuf.FileOptions file = 4;
-  extend google.protobuf.FileOptions {
-    optional Aggregate nested = 15476903;
-  }
-
-  // An embedded message set
-  optional AggregateMessageSet mset = 5;
-}
-
-// Allow Aggregate to be used as an option at all possible locations
-// in the .proto grammer.
-extend google.protobuf.FileOptions      { optional Aggregate fileopt    = 15478479; }
-extend google.protobuf.MessageOptions   { optional Aggregate msgopt     = 15480088; }
-extend google.protobuf.FieldOptions     { optional Aggregate fieldopt   = 15481374; }
-extend google.protobuf.EnumOptions      { optional Aggregate enumopt    = 15483218; }
-extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; }
-extend google.protobuf.ServiceOptions   { optional Aggregate serviceopt = 15497145; }
-extend google.protobuf.MethodOptions    { optional Aggregate methodopt  = 15512713; }
-
-// Try using AggregateOption at different points in the proto grammar
-option (fileopt) = {
-  s: 'FileAnnotation'
-  // Also test the handling of comments
-  /* of both types */ i: 100
-
-  sub { s: 'NestedFileAnnotation' }
-
-  // Include a google.protobuf.FileOptions and recursively extend it with
-  // another fileopt.
-  file {
-    [protobuf_unittest.fileopt] {
-      s:'FileExtensionAnnotation'
-    }
-  }
-
-  // A message set inside an option value
-  mset {
-    [protobuf_unittest.AggregateMessageSetElement.message_set_extension] {
-      s: 'EmbeddedMessageSetElement'
-    }
-  }
-};
-
-message AggregateMessage {
-  option (msgopt) = { i:101 s:'MessageAnnotation' };
-  optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
-}
-
-service AggregateService {
-  option (serviceopt) = { s:'ServiceAnnotation' };
-  rpc Method (AggregateMessage) returns (AggregateMessage) {
-    option (methodopt) = { s:'MethodAnnotation' };
-  }
-}
-
-enum AggregateEnum {
-  option (enumopt) = { s:'EnumAnnotation' };
-  VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
-}
-
-// Test custom options for nested type.
-message NestedOptionType {
-  message NestedMessage {
-    option (message_opt1) = 1001;
-    optional int32 nested_field = 1 [(field_opt1) = 1002];
-  }
-  enum NestedEnum {
-    option (enum_opt1) = 1003;
-    NESTED_ENUM_VALUE = 1 [(enum_value_opt1) = 1004];
-  }
-  extend google.protobuf.FileOptions {
-    optional int32 nested_extension = 7912573 [(field_opt2) = 1005];
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_embed_optimize_for.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_embed_optimize_for.proto
deleted file mode 100644
index fa17625..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_embed_optimize_for.proto
+++ /dev/null
@@ -1,50 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which imports a proto file that uses optimize_for = CODE_SIZE.
-
-import "google/protobuf/unittest_optimize_for.proto";
-
-package protobuf_unittest;
-
-// We optimize for speed here, but we are importing a proto that is optimized
-// for code size.
-option optimize_for = SPEED;
-
-message TestEmbedOptimizedForSize {
-  // Test that embedding a message which has optimize_for = CODE_SIZE into
-  // one optimized for speed works.
-  optional TestOptimizedForSize optional_message = 1;
-  repeated TestOptimizedForSize repeated_message = 2;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_empty.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_empty.proto
deleted file mode 100644
index ab12d1f..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_empty.proto
+++ /dev/null
@@ -1,37 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// This file intentionally left blank.  (At one point this wouldn't compile
-// correctly.)
-
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_enormous_descriptor.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_enormous_descriptor.proto
deleted file mode 100644
index bc0b7c1..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_enormous_descriptor.proto
+++ /dev/null
@@ -1,1046 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file that has an extremely large descriptor.  Used to test that
-// descriptors over 64k don't break the string literal length limit in Java.
-
-
-package google.protobuf;
-option java_package = "com.google.protobuf";
-
-// Avoid generating insanely long methods.
-option optimize_for = CODE_SIZE;
-
-message TestEnormousDescriptor {
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1 = 1 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_2 = 2 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_3 = 3 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_4 = 4 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_5 = 5 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_6 = 6 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_7 = 7 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_8 = 8 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_9 = 9 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_10 = 10 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_11 = 11 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_12 = 12 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_13 = 13 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_14 = 14 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_15 = 15 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_16 = 16 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_17 = 17 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_18 = 18 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_19 = 19 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_20 = 20 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_21 = 21 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_22 = 22 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_23 = 23 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_24 = 24 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_25 = 25 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_26 = 26 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_27 = 27 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_28 = 28 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_29 = 29 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_30 = 30 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_31 = 31 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_32 = 32 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_33 = 33 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_34 = 34 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_35 = 35 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_36 = 36 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_37 = 37 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_38 = 38 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_39 = 39 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_40 = 40 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_41 = 41 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_42 = 42 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_43 = 43 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_44 = 44 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_45 = 45 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_46 = 46 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_47 = 47 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_48 = 48 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_49 = 49 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_50 = 50 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_51 = 51 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_52 = 52 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_53 = 53 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_54 = 54 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_55 = 55 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_56 = 56 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_57 = 57 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_58 = 58 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_59 = 59 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_60 = 60 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_61 = 61 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_62 = 62 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_63 = 63 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_64 = 64 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_65 = 65 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_66 = 66 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_67 = 67 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_68 = 68 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_69 = 69 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_70 = 70 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_71 = 71 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_72 = 72 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_73 = 73 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_74 = 74 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_75 = 75 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_76 = 76 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_77 = 77 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_78 = 78 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_79 = 79 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_80 = 80 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_81 = 81 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_82 = 82 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_83 = 83 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_84 = 84 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_85 = 85 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_86 = 86 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_87 = 87 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_88 = 88 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_89 = 89 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_90 = 90 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_91 = 91 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_92 = 92 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_93 = 93 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_94 = 94 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_95 = 95 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_96 = 96 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_97 = 97 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_98 = 98 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_99 = 99 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_100 = 100 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_101 = 101 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_102 = 102 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_103 = 103 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_104 = 104 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_105 = 105 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_106 = 106 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_107 = 107 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_108 = 108 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_109 = 109 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_110 = 110 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_111 = 111 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_112 = 112 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_113 = 113 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_114 = 114 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_115 = 115 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_116 = 116 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_117 = 117 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_118 = 118 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_119 = 119 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_120 = 120 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_121 = 121 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_122 = 122 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_123 = 123 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_124 = 124 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_125 = 125 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_126 = 126 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_127 = 127 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_128 = 128 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_129 = 129 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_130 = 130 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_131 = 131 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_132 = 132 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_133 = 133 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_134 = 134 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_135 = 135 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_136 = 136 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_137 = 137 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_138 = 138 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_139 = 139 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_140 = 140 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_141 = 141 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_142 = 142 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_143 = 143 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_144 = 144 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_145 = 145 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_146 = 146 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_147 = 147 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_148 = 148 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_149 = 149 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_150 = 150 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_151 = 151 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_152 = 152 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_153 = 153 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_154 = 154 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_155 = 155 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_156 = 156 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_157 = 157 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_158 = 158 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_159 = 159 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_160 = 160 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_161 = 161 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_162 = 162 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_163 = 163 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_164 = 164 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_165 = 165 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_166 = 166 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_167 = 167 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_168 = 168 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_169 = 169 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_170 = 170 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_171 = 171 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_172 = 172 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_173 = 173 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_174 = 174 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_175 = 175 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_176 = 176 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_177 = 177 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_178 = 178 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_179 = 179 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_180 = 180 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_181 = 181 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_182 = 182 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_183 = 183 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_184 = 184 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_185 = 185 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_186 = 186 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_187 = 187 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_188 = 188 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_189 = 189 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_190 = 190 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_191 = 191 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_192 = 192 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_193 = 193 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_194 = 194 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_195 = 195 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_196 = 196 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_197 = 197 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_198 = 198 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_199 = 199 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_200 = 200 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_201 = 201 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_202 = 202 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_203 = 203 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_204 = 204 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_205 = 205 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_206 = 206 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_207 = 207 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_208 = 208 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_209 = 209 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_210 = 210 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_211 = 211 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_212 = 212 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_213 = 213 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_214 = 214 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_215 = 215 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_216 = 216 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_217 = 217 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_218 = 218 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_219 = 219 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_220 = 220 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_221 = 221 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_222 = 222 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_223 = 223 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_224 = 224 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_225 = 225 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_226 = 226 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_227 = 227 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_228 = 228 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_229 = 229 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_230 = 230 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_231 = 231 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_232 = 232 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_233 = 233 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_234 = 234 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_235 = 235 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_236 = 236 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_237 = 237 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_238 = 238 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_239 = 239 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_240 = 240 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_241 = 241 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_242 = 242 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_243 = 243 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_244 = 244 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_245 = 245 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_246 = 246 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_247 = 247 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_248 = 248 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_249 = 249 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_250 = 250 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_251 = 251 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_252 = 252 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_253 = 253 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_254 = 254 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_255 = 255 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_256 = 256 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_257 = 257 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_258 = 258 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_259 = 259 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_260 = 260 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_261 = 261 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_262 = 262 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_263 = 263 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_264 = 264 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_265 = 265 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_266 = 266 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_267 = 267 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_268 = 268 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_269 = 269 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_270 = 270 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_271 = 271 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_272 = 272 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_273 = 273 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_274 = 274 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_275 = 275 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_276 = 276 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_277 = 277 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_278 = 278 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_279 = 279 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_280 = 280 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_281 = 281 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_282 = 282 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_283 = 283 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_284 = 284 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_285 = 285 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_286 = 286 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_287 = 287 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_288 = 288 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_289 = 289 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_290 = 290 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_291 = 291 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_292 = 292 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_293 = 293 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_294 = 294 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_295 = 295 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_296 = 296 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_297 = 297 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_298 = 298 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_299 = 299 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_300 = 300 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_301 = 301 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_302 = 302 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_303 = 303 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_304 = 304 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_305 = 305 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_306 = 306 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_307 = 307 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_308 = 308 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_309 = 309 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_310 = 310 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_311 = 311 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_312 = 312 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_313 = 313 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_314 = 314 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_315 = 315 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_316 = 316 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_317 = 317 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_318 = 318 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_319 = 319 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_320 = 320 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_321 = 321 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_322 = 322 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_323 = 323 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_324 = 324 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_325 = 325 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_326 = 326 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_327 = 327 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_328 = 328 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_329 = 329 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_330 = 330 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_331 = 331 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_332 = 332 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_333 = 333 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_334 = 334 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_335 = 335 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_336 = 336 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_337 = 337 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_338 = 338 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_339 = 339 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_340 = 340 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_341 = 341 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_342 = 342 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_343 = 343 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_344 = 344 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_345 = 345 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_346 = 346 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_347 = 347 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_348 = 348 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_349 = 349 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_350 = 350 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_351 = 351 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_352 = 352 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_353 = 353 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_354 = 354 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_355 = 355 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_356 = 356 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_357 = 357 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_358 = 358 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_359 = 359 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_360 = 360 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_361 = 361 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_362 = 362 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_363 = 363 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_364 = 364 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_365 = 365 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_366 = 366 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_367 = 367 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_368 = 368 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_369 = 369 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_370 = 370 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_371 = 371 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_372 = 372 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_373 = 373 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_374 = 374 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_375 = 375 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_376 = 376 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_377 = 377 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_378 = 378 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_379 = 379 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_380 = 380 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_381 = 381 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_382 = 382 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_383 = 383 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_384 = 384 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_385 = 385 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_386 = 386 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_387 = 387 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_388 = 388 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_389 = 389 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_390 = 390 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_391 = 391 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_392 = 392 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_393 = 393 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_394 = 394 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_395 = 395 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_396 = 396 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_397 = 397 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_398 = 398 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_399 = 399 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_400 = 400 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_401 = 401 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_402 = 402 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_403 = 403 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_404 = 404 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_405 = 405 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_406 = 406 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_407 = 407 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_408 = 408 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_409 = 409 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_410 = 410 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_411 = 411 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_412 = 412 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_413 = 413 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_414 = 414 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_415 = 415 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_416 = 416 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_417 = 417 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_418 = 418 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_419 = 419 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_420 = 420 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_421 = 421 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_422 = 422 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_423 = 423 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_424 = 424 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_425 = 425 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_426 = 426 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_427 = 427 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_428 = 428 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_429 = 429 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_430 = 430 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_431 = 431 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_432 = 432 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_433 = 433 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_434 = 434 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_435 = 435 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_436 = 436 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_437 = 437 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_438 = 438 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_439 = 439 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_440 = 440 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_441 = 441 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_442 = 442 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_443 = 443 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_444 = 444 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_445 = 445 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_446 = 446 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_447 = 447 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_448 = 448 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_449 = 449 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_450 = 450 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_451 = 451 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_452 = 452 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_453 = 453 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_454 = 454 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_455 = 455 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_456 = 456 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_457 = 457 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_458 = 458 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_459 = 459 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_460 = 460 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_461 = 461 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_462 = 462 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_463 = 463 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_464 = 464 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_465 = 465 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_466 = 466 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_467 = 467 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_468 = 468 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_469 = 469 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_470 = 470 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_471 = 471 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_472 = 472 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_473 = 473 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_474 = 474 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_475 = 475 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_476 = 476 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_477 = 477 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_478 = 478 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_479 = 479 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_480 = 480 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_481 = 481 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_482 = 482 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_483 = 483 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_484 = 484 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_485 = 485 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_486 = 486 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_487 = 487 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_488 = 488 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_489 = 489 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_490 = 490 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_491 = 491 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_492 = 492 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_493 = 493 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_494 = 494 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_495 = 495 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_496 = 496 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_497 = 497 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_498 = 498 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_499 = 499 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_500 = 500 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_501 = 501 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_502 = 502 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_503 = 503 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_504 = 504 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_505 = 505 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_506 = 506 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_507 = 507 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_508 = 508 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_509 = 509 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_510 = 510 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_511 = 511 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_512 = 512 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_513 = 513 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_514 = 514 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_515 = 515 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_516 = 516 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_517 = 517 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_518 = 518 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_519 = 519 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_520 = 520 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_521 = 521 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_522 = 522 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_523 = 523 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_524 = 524 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_525 = 525 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_526 = 526 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_527 = 527 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_528 = 528 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_529 = 529 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_530 = 530 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_531 = 531 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_532 = 532 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_533 = 533 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_534 = 534 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_535 = 535 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_536 = 536 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_537 = 537 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_538 = 538 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_539 = 539 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_540 = 540 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_541 = 541 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_542 = 542 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_543 = 543 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_544 = 544 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_545 = 545 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_546 = 546 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_547 = 547 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_548 = 548 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_549 = 549 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_550 = 550 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_551 = 551 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_552 = 552 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_553 = 553 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_554 = 554 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_555 = 555 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_556 = 556 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_557 = 557 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_558 = 558 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_559 = 559 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_560 = 560 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_561 = 561 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_562 = 562 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_563 = 563 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_564 = 564 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_565 = 565 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_566 = 566 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_567 = 567 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_568 = 568 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_569 = 569 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_570 = 570 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_571 = 571 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_572 = 572 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_573 = 573 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_574 = 574 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_575 = 575 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_576 = 576 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_577 = 577 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_578 = 578 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_579 = 579 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_580 = 580 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_581 = 581 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_582 = 582 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_583 = 583 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_584 = 584 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_585 = 585 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_586 = 586 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_587 = 587 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_588 = 588 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_589 = 589 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_590 = 590 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_591 = 591 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_592 = 592 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_593 = 593 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_594 = 594 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_595 = 595 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_596 = 596 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_597 = 597 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_598 = 598 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_599 = 599 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_600 = 600 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_601 = 601 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_602 = 602 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_603 = 603 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_604 = 604 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_605 = 605 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_606 = 606 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_607 = 607 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_608 = 608 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_609 = 609 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_610 = 610 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_611 = 611 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_612 = 612 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_613 = 613 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_614 = 614 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_615 = 615 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_616 = 616 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_617 = 617 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_618 = 618 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_619 = 619 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_620 = 620 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_621 = 621 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_622 = 622 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_623 = 623 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_624 = 624 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_625 = 625 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_626 = 626 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_627 = 627 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_628 = 628 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_629 = 629 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_630 = 630 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_631 = 631 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_632 = 632 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_633 = 633 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_634 = 634 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_635 = 635 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_636 = 636 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_637 = 637 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_638 = 638 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_639 = 639 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_640 = 640 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_641 = 641 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_642 = 642 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_643 = 643 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_644 = 644 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_645 = 645 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_646 = 646 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_647 = 647 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_648 = 648 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_649 = 649 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_650 = 650 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_651 = 651 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_652 = 652 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_653 = 653 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_654 = 654 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_655 = 655 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_656 = 656 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_657 = 657 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_658 = 658 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_659 = 659 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_660 = 660 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_661 = 661 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_662 = 662 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_663 = 663 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_664 = 664 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_665 = 665 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_666 = 666 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_667 = 667 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_668 = 668 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_669 = 669 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_670 = 670 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_671 = 671 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_672 = 672 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_673 = 673 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_674 = 674 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_675 = 675 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_676 = 676 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_677 = 677 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_678 = 678 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_679 = 679 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_680 = 680 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_681 = 681 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_682 = 682 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_683 = 683 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_684 = 684 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_685 = 685 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_686 = 686 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_687 = 687 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_688 = 688 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_689 = 689 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_690 = 690 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_691 = 691 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_692 = 692 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_693 = 693 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_694 = 694 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_695 = 695 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_696 = 696 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_697 = 697 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_698 = 698 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_699 = 699 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_700 = 700 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_701 = 701 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_702 = 702 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_703 = 703 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_704 = 704 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_705 = 705 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_706 = 706 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_707 = 707 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_708 = 708 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_709 = 709 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_710 = 710 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_711 = 711 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_712 = 712 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_713 = 713 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_714 = 714 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_715 = 715 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_716 = 716 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_717 = 717 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_718 = 718 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_719 = 719 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_720 = 720 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_721 = 721 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_722 = 722 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_723 = 723 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_724 = 724 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_725 = 725 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_726 = 726 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_727 = 727 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_728 = 728 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_729 = 729 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_730 = 730 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_731 = 731 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_732 = 732 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_733 = 733 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_734 = 734 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_735 = 735 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_736 = 736 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_737 = 737 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_738 = 738 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_739 = 739 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_740 = 740 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_741 = 741 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_742 = 742 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_743 = 743 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_744 = 744 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_745 = 745 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_746 = 746 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_747 = 747 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_748 = 748 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_749 = 749 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_750 = 750 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_751 = 751 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_752 = 752 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_753 = 753 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_754 = 754 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_755 = 755 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_756 = 756 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_757 = 757 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_758 = 758 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_759 = 759 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_760 = 760 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_761 = 761 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_762 = 762 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_763 = 763 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_764 = 764 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_765 = 765 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_766 = 766 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_767 = 767 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_768 = 768 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_769 = 769 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_770 = 770 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_771 = 771 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_772 = 772 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_773 = 773 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_774 = 774 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_775 = 775 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_776 = 776 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_777 = 777 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_778 = 778 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_779 = 779 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_780 = 780 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_781 = 781 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_782 = 782 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_783 = 783 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_784 = 784 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_785 = 785 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_786 = 786 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_787 = 787 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_788 = 788 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_789 = 789 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_790 = 790 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_791 = 791 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_792 = 792 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_793 = 793 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_794 = 794 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_795 = 795 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_796 = 796 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_797 = 797 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_798 = 798 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_799 = 799 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_800 = 800 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_801 = 801 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_802 = 802 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_803 = 803 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_804 = 804 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_805 = 805 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_806 = 806 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_807 = 807 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_808 = 808 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_809 = 809 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_810 = 810 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_811 = 811 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_812 = 812 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_813 = 813 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_814 = 814 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_815 = 815 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_816 = 816 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_817 = 817 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_818 = 818 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_819 = 819 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_820 = 820 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_821 = 821 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_822 = 822 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_823 = 823 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_824 = 824 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_825 = 825 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_826 = 826 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_827 = 827 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_828 = 828 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_829 = 829 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_830 = 830 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_831 = 831 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_832 = 832 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_833 = 833 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_834 = 834 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_835 = 835 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_836 = 836 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_837 = 837 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_838 = 838 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_839 = 839 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_840 = 840 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_841 = 841 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_842 = 842 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_843 = 843 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_844 = 844 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_845 = 845 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_846 = 846 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_847 = 847 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_848 = 848 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_849 = 849 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_850 = 850 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_851 = 851 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_852 = 852 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_853 = 853 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_854 = 854 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_855 = 855 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_856 = 856 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_857 = 857 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_858 = 858 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_859 = 859 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_860 = 860 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_861 = 861 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_862 = 862 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_863 = 863 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_864 = 864 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_865 = 865 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_866 = 866 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_867 = 867 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_868 = 868 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_869 = 869 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_870 = 870 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_871 = 871 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_872 = 872 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_873 = 873 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_874 = 874 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_875 = 875 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_876 = 876 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_877 = 877 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_878 = 878 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_879 = 879 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_880 = 880 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_881 = 881 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_882 = 882 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_883 = 883 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_884 = 884 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_885 = 885 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_886 = 886 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_887 = 887 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_888 = 888 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_889 = 889 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_890 = 890 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_891 = 891 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_892 = 892 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_893 = 893 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_894 = 894 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_895 = 895 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_896 = 896 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_897 = 897 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_898 = 898 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_899 = 899 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_900 = 900 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_901 = 901 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_902 = 902 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_903 = 903 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_904 = 904 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_905 = 905 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_906 = 906 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_907 = 907 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_908 = 908 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_909 = 909 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_910 = 910 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_911 = 911 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_912 = 912 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_913 = 913 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_914 = 914 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_915 = 915 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_916 = 916 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_917 = 917 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_918 = 918 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_919 = 919 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_920 = 920 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_921 = 921 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_922 = 922 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_923 = 923 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_924 = 924 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_925 = 925 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_926 = 926 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_927 = 927 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_928 = 928 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_929 = 929 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_930 = 930 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_931 = 931 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_932 = 932 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_933 = 933 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_934 = 934 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_935 = 935 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_936 = 936 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_937 = 937 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_938 = 938 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_939 = 939 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_940 = 940 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_941 = 941 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_942 = 942 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_943 = 943 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_944 = 944 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_945 = 945 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_946 = 946 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_947 = 947 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_948 = 948 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_949 = 949 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_950 = 950 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_951 = 951 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_952 = 952 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_953 = 953 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_954 = 954 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_955 = 955 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_956 = 956 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_957 = 957 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_958 = 958 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_959 = 959 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_960 = 960 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_961 = 961 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_962 = 962 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_963 = 963 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_964 = 964 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_965 = 965 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_966 = 966 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_967 = 967 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_968 = 968 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_969 = 969 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_970 = 970 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_971 = 971 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_972 = 972 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_973 = 973 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_974 = 974 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_975 = 975 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_976 = 976 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_977 = 977 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_978 = 978 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_979 = 979 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_980 = 980 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_981 = 981 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_982 = 982 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_983 = 983 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_984 = 984 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_985 = 985 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_986 = 986 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_987 = 987 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_988 = 988 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_989 = 989 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_990 = 990 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_991 = 991 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_992 = 992 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_993 = 993 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_994 = 994 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_995 = 995 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_996 = 996 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_997 = 997 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_998 = 998 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_999 = 999 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000 = 1000 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import.proto
deleted file mode 100644
index c115b11..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import.proto
+++ /dev/null
@@ -1,64 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which is imported by unittest.proto to test importing.
-
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do
-// "using namespace unittest_import = protobuf_unittest_import".
-package protobuf_unittest_import;
-
-option optimize_for = SPEED;
-
-// Excercise the java_package option.
-option java_package = "com.google.protobuf.test";
-
-// Do not set a java_outer_classname here to verify that Proto2 works without
-// one.
-
-// Test public import
-import public "google/protobuf/unittest_import_public.proto";
-
-message ImportMessage {
-  optional int32 d = 1;
-}
-
-enum ImportEnum {
-  IMPORT_FOO = 7;
-  IMPORT_BAR = 8;
-  IMPORT_BAZ = 9;
-}
-
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_lite.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_lite.proto
deleted file mode 100644
index 81b117f..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_lite.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME.
-
-package protobuf_unittest_import;
-
-option optimize_for = LITE_RUNTIME;
-
-option java_package = "com.google.protobuf";
-
-import public "google/protobuf/unittest_import_public_lite.proto";
-
-message ImportMessageLite {
-  optional int32 d = 1;
-}
-
-enum ImportEnumLite {
-  IMPORT_LITE_FOO = 7;
-  IMPORT_LITE_BAR = 8;
-  IMPORT_LITE_BAZ = 9;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public.proto
deleted file mode 100644
index ea5d1b1..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-
-package protobuf_unittest_import;
-
-option java_package = "com.google.protobuf.test";
-
-message PublicImportMessage {
-  optional int32 e = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public_lite.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public_lite.proto
deleted file mode 100644
index d077563..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public_lite.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-
-package protobuf_unittest_import;
-
-option optimize_for = LITE_RUNTIME;
-
-option java_package = "com.google.protobuf";
-
-message PublicImportMessageLite {
-  optional int32 e = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_lite.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_lite.proto
deleted file mode 100644
index a1764aa..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_lite.proto
+++ /dev/null
@@ -1,360 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// This is like unittest.proto but with optimize_for = LITE_RUNTIME.
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest_import_lite.proto";
-
-option optimize_for = LITE_RUNTIME;
-
-option java_package = "com.google.protobuf";
-
-// Same as TestAllTypes but with the lite runtime.
-message TestAllTypesLite {
-  message NestedMessage {
-    optional int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-  }
-
-  // Singular
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional NestedMessage      optional_nested_message  = 18;
-  optional ForeignMessageLite optional_foreign_message = 19;
-  optional protobuf_unittest_import.ImportMessageLite
-    optional_import_message = 20;
-
-  optional NestedEnum      optional_nested_enum     = 21;
-  optional ForeignEnumLite optional_foreign_enum    = 22;
-  optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23;
-
-  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
-  optional string optional_cord = 25 [ctype=CORD];
-
-  // Defined in unittest_import_public.proto
-  optional protobuf_unittest_import.PublicImportMessageLite
-      optional_public_import_message = 26;
-
-  optional NestedMessage optional_lazy_message = 27 [lazy=true];
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated NestedMessage      repeated_nested_message  = 48;
-  repeated ForeignMessageLite repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessageLite
-    repeated_import_message = 50;
-
-  repeated NestedEnum      repeated_nested_enum  = 51;
-  repeated ForeignEnumLite repeated_foreign_enum = 52;
-  repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32    = 61 [default =  41    ];
-  optional    int64 default_int64    = 62 [default =  42    ];
-  optional   uint32 default_uint32   = 63 [default =  43    ];
-  optional   uint64 default_uint64   = 64 [default =  44    ];
-  optional   sint32 default_sint32   = 65 [default = -45    ];
-  optional   sint64 default_sint64   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
-  optional    float default_float    = 71 [default =  51.5  ];
-  optional   double default_double   = 72 [default =  52e3  ];
-  optional     bool default_bool     = 73 [default = true   ];
-  optional   string default_string   = 74 [default = "hello"];
-  optional    bytes default_bytes    = 75 [default = "world"];
-
-  optional NestedEnum default_nested_enum = 81 [default = BAR];
-  optional ForeignEnumLite default_foreign_enum = 82
-      [default = FOREIGN_LITE_BAR];
-  optional protobuf_unittest_import.ImportEnumLite
-      default_import_enum = 83 [default = IMPORT_LITE_BAR];
-
-  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
-  optional string default_cord = 85 [ctype=CORD,default="123"];
-}
-
-message ForeignMessageLite {
-  optional int32 c = 1;
-}
-
-enum ForeignEnumLite {
-  FOREIGN_LITE_FOO = 4;
-  FOREIGN_LITE_BAR = 5;
-  FOREIGN_LITE_BAZ = 6;
-}
-
-message TestPackedTypesLite {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnumLite packed_enum  = 103 [packed = true];
-}
-
-message TestAllExtensionsLite {
-  extensions 1 to max;
-}
-
-extend TestAllExtensionsLite {
-  // Singular
-  optional    int32 optional_int32_extension_lite    =  1;
-  optional    int64 optional_int64_extension_lite    =  2;
-  optional   uint32 optional_uint32_extension_lite   =  3;
-  optional   uint64 optional_uint64_extension_lite   =  4;
-  optional   sint32 optional_sint32_extension_lite   =  5;
-  optional   sint64 optional_sint64_extension_lite   =  6;
-  optional  fixed32 optional_fixed32_extension_lite  =  7;
-  optional  fixed64 optional_fixed64_extension_lite  =  8;
-  optional sfixed32 optional_sfixed32_extension_lite =  9;
-  optional sfixed64 optional_sfixed64_extension_lite = 10;
-  optional    float optional_float_extension_lite    = 11;
-  optional   double optional_double_extension_lite   = 12;
-  optional     bool optional_bool_extension_lite     = 13;
-  optional   string optional_string_extension_lite   = 14;
-  optional    bytes optional_bytes_extension_lite    = 15;
-
-  optional group OptionalGroup_extension_lite = 16 {
-    optional int32 a = 17;
-  }
-
-  optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite
-      = 18;
-  optional ForeignMessageLite optional_foreign_message_extension_lite = 19;
-  optional protobuf_unittest_import.ImportMessageLite
-    optional_import_message_extension_lite = 20;
-
-  optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21;
-  optional ForeignEnumLite optional_foreign_enum_extension_lite = 22;
-  optional protobuf_unittest_import.ImportEnumLite
-    optional_import_enum_extension_lite = 23;
-
-  optional string optional_string_piece_extension_lite = 24
-      [ctype=STRING_PIECE];
-  optional string optional_cord_extension_lite = 25 [ctype=CORD];
-
-  optional protobuf_unittest_import.PublicImportMessageLite
-    optional_public_import_message_extension_lite = 26;
-
-  optional TestAllTypesLite.NestedMessage
-    optional_lazy_message_extension_lite = 27 [lazy=true];
-
-  // Repeated
-  repeated    int32 repeated_int32_extension_lite    = 31;
-  repeated    int64 repeated_int64_extension_lite    = 32;
-  repeated   uint32 repeated_uint32_extension_lite   = 33;
-  repeated   uint64 repeated_uint64_extension_lite   = 34;
-  repeated   sint32 repeated_sint32_extension_lite   = 35;
-  repeated   sint64 repeated_sint64_extension_lite   = 36;
-  repeated  fixed32 repeated_fixed32_extension_lite  = 37;
-  repeated  fixed64 repeated_fixed64_extension_lite  = 38;
-  repeated sfixed32 repeated_sfixed32_extension_lite = 39;
-  repeated sfixed64 repeated_sfixed64_extension_lite = 40;
-  repeated    float repeated_float_extension_lite    = 41;
-  repeated   double repeated_double_extension_lite   = 42;
-  repeated     bool repeated_bool_extension_lite     = 43;
-  repeated   string repeated_string_extension_lite   = 44;
-  repeated    bytes repeated_bytes_extension_lite    = 45;
-
-  repeated group RepeatedGroup_extension_lite = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite
-      = 48;
-  repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49;
-  repeated protobuf_unittest_import.ImportMessageLite
-    repeated_import_message_extension_lite = 50;
-
-  repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51;
-  repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52;
-  repeated protobuf_unittest_import.ImportEnumLite
-    repeated_import_enum_extension_lite = 53;
-
-  repeated string repeated_string_piece_extension_lite = 54
-      [ctype=STRING_PIECE];
-  repeated string repeated_cord_extension_lite = 55 [ctype=CORD];
-
-  repeated TestAllTypesLite.NestedMessage
-    repeated_lazy_message_extension_lite = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32_extension_lite    = 61 [default =  41    ];
-  optional    int64 default_int64_extension_lite    = 62 [default =  42    ];
-  optional   uint32 default_uint32_extension_lite   = 63 [default =  43    ];
-  optional   uint64 default_uint64_extension_lite   = 64 [default =  44    ];
-  optional   sint32 default_sint32_extension_lite   = 65 [default = -45    ];
-  optional   sint64 default_sint64_extension_lite   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32_extension_lite  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64_extension_lite  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32_extension_lite = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50    ];
-  optional    float default_float_extension_lite    = 71 [default =  51.5  ];
-  optional   double default_double_extension_lite   = 72 [default =  52e3  ];
-  optional     bool default_bool_extension_lite     = 73 [default = true   ];
-  optional   string default_string_extension_lite   = 74 [default = "hello"];
-  optional    bytes default_bytes_extension_lite    = 75 [default = "world"];
-
-  optional TestAllTypesLite.NestedEnum
-    default_nested_enum_extension_lite = 81 [default = BAR];
-  optional ForeignEnumLite
-    default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR];
-  optional protobuf_unittest_import.ImportEnumLite
-    default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR];
-
-  optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE,
-                                                            default="abc"];
-  optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"];
-}
-
-message TestPackedExtensionsLite {
-  extensions 1 to max;
-}
-
-extend TestPackedExtensionsLite {
-  repeated    int32 packed_int32_extension_lite    =  90 [packed = true];
-  repeated    int64 packed_int64_extension_lite    =  91 [packed = true];
-  repeated   uint32 packed_uint32_extension_lite   =  92 [packed = true];
-  repeated   uint64 packed_uint64_extension_lite   =  93 [packed = true];
-  repeated   sint32 packed_sint32_extension_lite   =  94 [packed = true];
-  repeated   sint64 packed_sint64_extension_lite   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32_extension_lite  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64_extension_lite  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32_extension_lite =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64_extension_lite =  99 [packed = true];
-  repeated    float packed_float_extension_lite    = 100 [packed = true];
-  repeated   double packed_double_extension_lite   = 101 [packed = true];
-  repeated     bool packed_bool_extension_lite     = 102 [packed = true];
-  repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true];
-}
-
-message TestNestedExtensionLite {
-  extend TestAllExtensionsLite {
-    optional int32 nested_extension = 12345;
-  }
-}
-
-// Test that deprecated fields work.  We only verify that they compile (at one
-// point this failed).
-message TestDeprecatedLite {
-  optional int32 deprecated_field = 1 [deprecated = true];
-}
-
-// See the comments of the same type in unittest.proto.
-message TestParsingMergeLite {
-  message RepeatedFieldsGenerator {
-    repeated TestAllTypesLite field1 = 1;
-    repeated TestAllTypesLite field2 = 2;
-    repeated TestAllTypesLite field3 = 3;
-    repeated group Group1 = 10 {
-      optional TestAllTypesLite field1 = 11;
-    }
-    repeated group Group2 = 20 {
-      optional TestAllTypesLite field1 = 21;
-    }
-    repeated TestAllTypesLite ext1 = 1000;
-    repeated TestAllTypesLite ext2 = 1001;
-  }
-  required TestAllTypesLite required_all_types = 1;
-  optional TestAllTypesLite optional_all_types = 2;
-  repeated TestAllTypesLite repeated_all_types = 3;
-  optional group OptionalGroup = 10 {
-    optional TestAllTypesLite optional_group_all_types = 11;
-  }
-  repeated group RepeatedGroup = 20 {
-    optional TestAllTypesLite repeated_group_all_types = 21;
-  }
-  extensions 1000 to max;
-  extend TestParsingMergeLite {
-    optional TestAllTypesLite optional_ext = 1000;
-    repeated TestAllTypesLite repeated_ext = 1001;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_lite_imports_nonlite.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_lite_imports_nonlite.proto
deleted file mode 100644
index d52cb8c..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_lite_imports_nonlite.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//
-// Tests that a "lite" message can import a regular message.
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-option optimize_for = LITE_RUNTIME;
-
-message TestLiteImportsNonlite {
-  optional TestAllTypes message = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_mset.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_mset.proto
deleted file mode 100644
index 3497f09..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_mset.proto
+++ /dev/null
@@ -1,72 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// This file contains messages for testing message_set_wire_format.
-
-package protobuf_unittest;
-
-option optimize_for = SPEED;
-
-// A message with message_set_wire_format.
-message TestMessageSet {
-  option message_set_wire_format = true;
-  extensions 4 to max;
-}
-
-message TestMessageSetContainer {
-  optional TestMessageSet message_set = 1;
-}
-
-message TestMessageSetExtension1 {
-  extend TestMessageSet {
-    optional TestMessageSetExtension1 message_set_extension = 1545008;
-  }
-  optional int32 i = 15;
-}
-
-message TestMessageSetExtension2 {
-  extend TestMessageSet {
-    optional TestMessageSetExtension2 message_set_extension = 1547769;
-  }
-  optional string str = 25;
-}
-
-// MessageSet wire format is equivalent to this.
-message RawMessageSet {
-  repeated group Item = 1 {
-    required int32 type_id = 2;
-    required bytes message = 3;
-  }
-}
-
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_no_generic_services.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_no_generic_services.proto
deleted file mode 100644
index cffb412..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_no_generic_services.proto
+++ /dev/null
@@ -1,52 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-
-package google.protobuf.no_generic_services_test;
-
-// *_generic_services are false by default.
-
-message TestMessage {
-  optional int32 a = 1;
-  extensions 1000 to max;
-}
-
-enum TestEnum {
-  FOO = 1;
-}
-
-extend TestMessage {
-  optional int32 test_extension = 1000;
-}
-
-service TestService {
-  rpc Foo(TestMessage) returns(TestMessage);
-}
diff --git a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_optimize_for.proto b/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_optimize_for.proto
deleted file mode 100644
index feecbef..0000000
--- a/java/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_optimize_for.proto
+++ /dev/null
@@ -1,61 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which uses optimize_for = CODE_SIZE.
-
-import "google/protobuf/unittest.proto";
-
-package protobuf_unittest;
-
-option optimize_for = CODE_SIZE;
-
-message TestOptimizedForSize {
-  optional int32 i = 1;
-  optional ForeignMessage msg = 19;
-
-  extensions 1000 to max;
-
-  extend TestOptimizedForSize {
-    optional int32 test_extension = 1234;
-    optional TestRequiredOptimizedForSize test_extension2 = 1235;
-  }
-}
-
-message TestRequiredOptimizedForSize {
-  required int32 x = 1;
-}
- 
-message TestOptionalOptimizedForSize {
-  optional TestRequiredOptimizedForSize o = 1;
-}
diff --git a/java/compatibility_tests/v2.5.0/test.sh b/java/compatibility_tests/v2.5.0/test.sh
deleted file mode 100755
index 5d5e9ed..0000000
--- a/java/compatibility_tests/v2.5.0/test.sh
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-# Change to the script's directory.
-cd $(dirname $0)
-
-# Version of the tests (i.e., the version of protobuf from where we extracted
-# these tests).
-TEST_VERSION=`grep "^  <version>.*</version>" pom.xml | sed "s|  <version>\(.*\)</version>|\1|"`
-
-# The old version of protobuf that we are testing compatibility against. This
-# is usually the same as TEST_VERSION (i.e., we use the tests extracted from
-# that version to test compatibility of the newest runtime against it), but it
-# is also possible to use this same test set to test the compatibiilty of the
-# latest version against other versions.
-case "$1" in
-  ""|2.5.0)
-    OLD_VERSION=2.5.0
-    OLD_VERSION_PROTOC=https://github.com/xfxyjwf/protobuf-compiler-release/raw/master/v2.5.0/linux/protoc
-    ;;
-  2.6.1)
-    OLD_VERSION=2.6.1
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/2.6.1-build2/protoc-2.6.1-build2-linux-x86_64.exe
-    ;;
-  3.0.0-beta-1)
-    OLD_VERSION=3.0.0-beta-1
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-1/protoc-3.0.0-beta-1-linux-x86_64.exe
-    ;;
-  3.0.0-beta-2)
-    OLD_VERSION=3.0.0-beta-2
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-2/protoc-3.0.0-beta-2-linux-x86_64.exe
-    ;;
-  3.0.0-beta-3)
-    OLD_VERSION=3.0.0-beta-3
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-3/protoc-3.0.0-beta-3-linux-x86_64.exe
-    ;;
-  3.0.0-beta-4)
-    OLD_VERSION=3.0.0-beta-4
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-4/protoc-3.0.0-beta-4-linux-x86_64.exe
-    ;;
-  *)
-    echo "[ERROR]: Unknown version number: $1"
-    exit 1
-    ;;
-esac
-
-# Extract the latest protobuf version number.
-VERSION_NUMBER=`grep "^  <version>.*</version>" ../../pom.xml | sed "s|  <version>\(.*\)</version>|\1|"`
-
-echo "Running compatibility tests between $VERSION_NUMBER and $OLD_VERSION"
-
-# Check protoc
-[ -f ../../../src/protoc ] || {
-  echo "[ERROR]: Please build protoc first."
-  exit 1
-}
-
-# Build and install protobuf-java-$VERSION_NUMBER.jar
-[ -f ../../core/target/protobuf-java-$VERSION_NUMBER.jar ] || {
-  pushd ../..
-  mvn install -Dmaven.test.skip=true
-  popd
-}
-
-# Download old version source for the compatibility test
-[ -d protobuf ] || {
-  git clone https://github.com/google/protobuf.git
-  cd protobuf
-  git reset --hard v$TEST_VERSION
-  cd ..
-}
-
-# Download old version protoc compiler (for linux)
-wget $OLD_VERSION_PROTOC -O protoc
-chmod +x protoc
-
-# Test source compatibility. In these tests we recompile everything against
-# the new runtime (including old version generated code).
-
-# Test A.1:
-#   protos: use new version
-#   more_protos: use old version
-mvn clean test \
-  -Dprotobuf.test.source.path=$(pwd)/protobuf \
-  -Dprotoc.path=$(pwd)/protoc \
-  -Dprotos.protoc.path=$(pwd)/../../../src/protoc \
-  -Dprotobuf.version=$VERSION_NUMBER
-
-# Test A.2:
-#   protos: use old version
-#   more_protos: use new version
-mvn clean test \
-  -Dprotobuf.test.source.path=$(pwd)/protobuf \
-  -Dprotoc.path=$(pwd)/protoc \
-  -Dmore_protos.protoc.path=$(pwd)/../../../src/protoc \
-  -Dprotobuf.version=$VERSION_NUMBER
-
-# Test binary compatibility. In these tests we run the old version compiled
-# jar against the new runtime directly without recompile.
-
-# Collect all test dependencies in a single jar file (except for protobuf) to
-# make it easier to run binary compatibility test (where we will need to run
-# the jar files directly).
-cd deps
-mvn assembly:single
-cd ..
-cp -f deps/target/compatibility-test-deps-${TEST_VERSION}-jar-with-dependencies.jar deps.jar
-
-# Build the old version of all 3 artifacts.
-mvn clean install -Dmaven.test.skip=true -Dprotoc.path=$(pwd)/protoc -Dprotobuf.version=$OLD_VERSION
-cp -f protos/target/compatibility-protos-${TEST_VERSION}.jar protos.jar
-cp -f more_protos/target/compatibility-more-protos-${TEST_VERSION}.jar more_protos.jar
-cp -f tests/target/compatibility-tests-${TEST_VERSION}.jar tests.jar
-
-# Collect the list of tests we need to run.
-TESTS=`find tests -name "*Test.java" | sed "s|/|.|g;s/.java$//g;s/tests.src.main.java.//g"`
-
-# Test B.1: run all the old artifacts against the new runtime. Note that we
-# must run the test in the protobuf source tree because some of the tests need
-# to read golden test data files.
-cd protobuf
-java -cp ../../../core/target/protobuf-java-$VERSION_NUMBER.jar:../protos.jar:../more_protos.jar:../tests.jar:../deps.jar org.junit.runner.JUnitCore $TESTS
-cd ..
-
-# Test B.2: update protos.jar only.
-cd protos
-mvn clean package -Dmaven.test.skip=true -Dprotoc.path=$(pwd)/../../../../src/protoc -Dprotobuf.version=$VERSION_NUMBER
-cd ..
-cd protobuf
-java -cp ../../../core/target/protobuf-java-$VERSION_NUMBER.jar:../protos/target/compatibility-protos-${TEST_VERSION}.jar:../more_protos.jar:../tests.jar:../deps.jar org.junit.runner.JUnitCore $TESTS
-cd ..
-
-# Test B.3: update more_protos.jar only.
-cd more_protos
-mvn clean package -Dmaven.test.skip=true -Dprotoc.path=$(pwd)/../../../../src/protoc -Dprotobuf.version=$VERSION_NUMBER
-cd ..
-cd protobuf
-java -cp ../../../core/target/protobuf-java-$VERSION_NUMBER.jar:../protos.jar:../more_protos/target/compatibility-more-protos-${TEST_VERSION}.jar:../tests.jar:../deps.jar org.junit.runner.JUnitCore $TESTS
-cd ..
diff --git a/java/compatibility_tests/v2.5.0/tests/pom.xml b/java/compatibility_tests/v2.5.0/tests/pom.xml
deleted file mode 100644
index f1ce46e..0000000
--- a/java/compatibility_tests/v2.5.0/tests/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>com.google.protobuf.compatibility</groupId>
-    <artifactId>compatibility-test-suite</artifactId>
-    <version>2.5.0</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <groupId>com.google.protobuf.compatibility</groupId>
-  <artifactId>compatibility-tests</artifactId>
-  <version>2.5.0</version>
-
-  <name>Compatibility Tests</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <version>2.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <version>2.2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>com.google.protobuf</groupId>
-      <artifactId>protobuf-java</artifactId>
-      <version>${tests.protobuf.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.google.protobuf.compatibility</groupId>
-      <artifactId>compatibility-protos</artifactId>
-      <version>2.5.0</version>
-    </dependency>
-    <dependency>
-      <groupId>com.google.protobuf.compatibility</groupId>
-      <artifactId>compatibility-more-protos</artifactId>
-      <version>2.5.0</version>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.6</source>
-          <target>1.6</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <testSourceDirectory>${basedir}/src/main/java/</testSourceDirectory>
-          <testClassesDirectory>${project.build.directory}/classes/</testClassesDirectory>
-          <includes>
-            <include>**/*Test.java</include>
-          </includes>
-          <workingDirectory>${protobuf.test.source.path}</workingDirectory>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/AbstractMessageTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/AbstractMessageTest.java
deleted file mode 100644
index 6789550..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/AbstractMessageTest.java
+++ /dev/null
@@ -1,510 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
-import protobuf_unittest.UnittestProto;
-import protobuf_unittest.UnittestProto.ForeignMessage;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-import protobuf_unittest.UnittestProto.TestRequired;
-import protobuf_unittest.UnittestProto.TestRequiredForeign;
-import protobuf_unittest.UnittestProto.TestUnpackedTypes;
-
-import junit.framework.TestCase;
-
-import java.util.Map;
-
-/**
- * Unit test for {@link AbstractMessage}.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class AbstractMessageTest extends TestCase {
-  /**
-   * Extends AbstractMessage and wraps some other message object.  The methods
-   * of the Message interface which aren't explicitly implemented by
-   * AbstractMessage are forwarded to the wrapped object.  This allows us to
-   * test that AbstractMessage's implementations work even if the wrapped
-   * object does not use them.
-   */
-  private static class AbstractMessageWrapper extends AbstractMessage {
-    private final Message wrappedMessage;
-
-    public AbstractMessageWrapper(Message wrappedMessage) {
-      this.wrappedMessage = wrappedMessage;
-    }
-
-    public Descriptors.Descriptor getDescriptorForType() {
-      return wrappedMessage.getDescriptorForType();
-    }
-    public AbstractMessageWrapper getDefaultInstanceForType() {
-      return new AbstractMessageWrapper(
-        wrappedMessage.getDefaultInstanceForType());
-    }
-    public Map<Descriptors.FieldDescriptor, Object> getAllFields() {
-      return wrappedMessage.getAllFields();
-    }
-    public boolean hasField(Descriptors.FieldDescriptor field) {
-      return wrappedMessage.hasField(field);
-    }
-    public Object getField(Descriptors.FieldDescriptor field) {
-      return wrappedMessage.getField(field);
-    }
-    public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) {
-      return wrappedMessage.getRepeatedFieldCount(field);
-    }
-    public Object getRepeatedField(
-        Descriptors.FieldDescriptor field, int index) {
-      return wrappedMessage.getRepeatedField(field, index);
-    }
-    public UnknownFieldSet getUnknownFields() {
-      return wrappedMessage.getUnknownFields();
-    }
-    public Builder newBuilderForType() {
-      return new Builder(wrappedMessage.newBuilderForType());
-    }
-    public Builder toBuilder() {
-      return new Builder(wrappedMessage.toBuilder());
-    }
-
-    static class Builder extends AbstractMessage.Builder<Builder> {
-      private final Message.Builder wrappedBuilder;
-
-      public Builder(Message.Builder wrappedBuilder) {
-        this.wrappedBuilder = wrappedBuilder;
-      }
-
-      public AbstractMessageWrapper build() {
-        return new AbstractMessageWrapper(wrappedBuilder.build());
-      }
-      public AbstractMessageWrapper buildPartial() {
-        return new AbstractMessageWrapper(wrappedBuilder.buildPartial());
-      }
-      public Builder clone() {
-        return new Builder(wrappedBuilder.clone());
-      }
-      public boolean isInitialized() {
-        return clone().buildPartial().isInitialized();
-      }
-      public Descriptors.Descriptor getDescriptorForType() {
-        return wrappedBuilder.getDescriptorForType();
-      }
-      public AbstractMessageWrapper getDefaultInstanceForType() {
-        return new AbstractMessageWrapper(
-          wrappedBuilder.getDefaultInstanceForType());
-      }
-      public Map<Descriptors.FieldDescriptor, Object> getAllFields() {
-        return wrappedBuilder.getAllFields();
-      }
-      public Builder newBuilderForField(Descriptors.FieldDescriptor field) {
-        return new Builder(wrappedBuilder.newBuilderForField(field));
-      }
-      public boolean hasField(Descriptors.FieldDescriptor field) {
-        return wrappedBuilder.hasField(field);
-      }
-      public Object getField(Descriptors.FieldDescriptor field) {
-        return wrappedBuilder.getField(field);
-      }
-      public Builder setField(Descriptors.FieldDescriptor field, Object value) {
-        wrappedBuilder.setField(field, value);
-        return this;
-      }
-      public Builder clearField(Descriptors.FieldDescriptor field) {
-        wrappedBuilder.clearField(field);
-        return this;
-      }
-      public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) {
-        return wrappedBuilder.getRepeatedFieldCount(field);
-      }
-      public Object getRepeatedField(
-          Descriptors.FieldDescriptor field, int index) {
-        return wrappedBuilder.getRepeatedField(field, index);
-      }
-      public Builder setRepeatedField(Descriptors.FieldDescriptor field,
-                                      int index, Object value) {
-        wrappedBuilder.setRepeatedField(field, index, value);
-        return this;
-      }
-      public Builder addRepeatedField(
-          Descriptors.FieldDescriptor field, Object value) {
-        wrappedBuilder.addRepeatedField(field, value);
-        return this;
-      }
-      public UnknownFieldSet getUnknownFields() {
-        return wrappedBuilder.getUnknownFields();
-      }
-      public Builder setUnknownFields(UnknownFieldSet unknownFields) {
-        wrappedBuilder.setUnknownFields(unknownFields);
-        return this;
-      }
-      @Override
-      public Message.Builder getFieldBuilder(FieldDescriptor field) {
-        return wrappedBuilder.getFieldBuilder(field);
-      }
-    }
-    public Parser<? extends Message> getParserForType() {
-      return wrappedMessage.getParserForType();
-    }
-  }
-
-  // =================================================================
-
-  TestUtil.ReflectionTester reflectionTester =
-    new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
-
-  TestUtil.ReflectionTester extensionsReflectionTester =
-    new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
-                                  TestUtil.getExtensionRegistry());
-
-  public void testClear() throws Exception {
-    AbstractMessageWrapper message =
-      new AbstractMessageWrapper.Builder(
-          TestAllTypes.newBuilder(TestUtil.getAllSet()))
-        .clear().build();
-    TestUtil.assertClear((TestAllTypes) message.wrappedMessage);
-  }
-
-  public void testCopy() throws Exception {
-    AbstractMessageWrapper message =
-      new AbstractMessageWrapper.Builder(TestAllTypes.newBuilder())
-        .mergeFrom(TestUtil.getAllSet()).build();
-    TestUtil.assertAllFieldsSet((TestAllTypes) message.wrappedMessage);
-  }
-
-  public void testSerializedSize() throws Exception {
-    TestAllTypes message = TestUtil.getAllSet();
-    Message abstractMessage = new AbstractMessageWrapper(TestUtil.getAllSet());
-
-    assertEquals(message.getSerializedSize(),
-                 abstractMessage.getSerializedSize());
-  }
-
-  public void testSerialization() throws Exception {
-    Message abstractMessage = new AbstractMessageWrapper(TestUtil.getAllSet());
-
-    TestUtil.assertAllFieldsSet(
-      TestAllTypes.parseFrom(abstractMessage.toByteString()));
-
-    assertEquals(TestUtil.getAllSet().toByteString(),
-                 abstractMessage.toByteString());
-  }
-
-  public void testParsing() throws Exception {
-    AbstractMessageWrapper.Builder builder =
-      new AbstractMessageWrapper.Builder(TestAllTypes.newBuilder());
-    AbstractMessageWrapper message =
-      builder.mergeFrom(TestUtil.getAllSet().toByteString()).build();
-    TestUtil.assertAllFieldsSet((TestAllTypes) message.wrappedMessage);
-  }
-
-  public void testParsingUninitialized() throws Exception {
-    TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder();
-    builder.getOptionalMessageBuilder().setDummy2(10);
-    ByteString bytes = builder.buildPartial().toByteString();
-    Message.Builder abstractMessageBuilder =
-        new AbstractMessageWrapper.Builder(TestRequiredForeign.newBuilder());
-    // mergeFrom() should not throw initialization error.
-    abstractMessageBuilder.mergeFrom(bytes).buildPartial();
-    try {
-      abstractMessageBuilder.mergeFrom(bytes).build();
-      fail();
-    } catch (UninitializedMessageException ex) {
-      // pass
-    }
-
-    // test DynamicMessage directly.
-    Message.Builder dynamicMessageBuilder = DynamicMessage.newBuilder(
-        TestRequiredForeign.getDescriptor());
-    // mergeFrom() should not throw initialization error.
-    dynamicMessageBuilder.mergeFrom(bytes).buildPartial();
-    try {
-      dynamicMessageBuilder.mergeFrom(bytes).build();
-      fail();
-    } catch (UninitializedMessageException ex) {
-      // pass
-    }
-  }
-
-  public void testPackedSerialization() throws Exception {
-    Message abstractMessage =
-        new AbstractMessageWrapper(TestUtil.getPackedSet());
-
-    TestUtil.assertPackedFieldsSet(
-      TestPackedTypes.parseFrom(abstractMessage.toByteString()));
-
-    assertEquals(TestUtil.getPackedSet().toByteString(),
-                 abstractMessage.toByteString());
-  }
-
-  public void testPackedParsing() throws Exception {
-    AbstractMessageWrapper.Builder builder =
-      new AbstractMessageWrapper.Builder(TestPackedTypes.newBuilder());
-    AbstractMessageWrapper message =
-      builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();
-    TestUtil.assertPackedFieldsSet((TestPackedTypes) message.wrappedMessage);
-  }
-
-  public void testUnpackedSerialization() throws Exception {
-    Message abstractMessage =
-      new AbstractMessageWrapper(TestUtil.getUnpackedSet());
-
-    TestUtil.assertUnpackedFieldsSet(
-      TestUnpackedTypes.parseFrom(abstractMessage.toByteString()));
-
-    assertEquals(TestUtil.getUnpackedSet().toByteString(),
-                 abstractMessage.toByteString());
-  }
-
-  public void testParsePackedToUnpacked() throws Exception {
-    AbstractMessageWrapper.Builder builder =
-      new AbstractMessageWrapper.Builder(TestUnpackedTypes.newBuilder());
-    AbstractMessageWrapper message =
-      builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();
-    TestUtil.assertUnpackedFieldsSet(
-      (TestUnpackedTypes) message.wrappedMessage);
-  }
-
-  public void testParseUnpackedToPacked() throws Exception {
-    AbstractMessageWrapper.Builder builder =
-      new AbstractMessageWrapper.Builder(TestPackedTypes.newBuilder());
-    AbstractMessageWrapper message =
-      builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();
-    TestUtil.assertPackedFieldsSet((TestPackedTypes) message.wrappedMessage);
-  }
-
-  public void testUnpackedParsing() throws Exception {
-    AbstractMessageWrapper.Builder builder =
-      new AbstractMessageWrapper.Builder(TestUnpackedTypes.newBuilder());
-    AbstractMessageWrapper message =
-      builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();
-    TestUtil.assertUnpackedFieldsSet(
-      (TestUnpackedTypes) message.wrappedMessage);
-  }
-
-  public void testOptimizedForSize() throws Exception {
-    // We're mostly only checking that this class was compiled successfully.
-    TestOptimizedForSize message =
-      TestOptimizedForSize.newBuilder().setI(1).build();
-    message = TestOptimizedForSize.parseFrom(message.toByteString());
-    assertEquals(2, message.getSerializedSize());
-  }
-
-  // -----------------------------------------------------------------
-  // Tests for isInitialized().
-
-  private static final TestRequired TEST_REQUIRED_UNINITIALIZED =
-    TestRequired.getDefaultInstance();
-  private static final TestRequired TEST_REQUIRED_INITIALIZED =
-    TestRequired.newBuilder().setA(1).setB(2).setC(3).build();
-
-  public void testIsInitialized() throws Exception {
-    TestRequired.Builder builder = TestRequired.newBuilder();
-    AbstractMessageWrapper.Builder abstractBuilder =
-      new AbstractMessageWrapper.Builder(builder);
-
-    assertFalse(abstractBuilder.isInitialized());
-    assertEquals("a, b, c", abstractBuilder.getInitializationErrorString());
-    builder.setA(1);
-    assertFalse(abstractBuilder.isInitialized());
-    assertEquals("b, c", abstractBuilder.getInitializationErrorString());
-    builder.setB(1);
-    assertFalse(abstractBuilder.isInitialized());
-    assertEquals("c", abstractBuilder.getInitializationErrorString());
-    builder.setC(1);
-    assertTrue(abstractBuilder.isInitialized());
-    assertEquals("", abstractBuilder.getInitializationErrorString());
-  }
-
-  public void testForeignIsInitialized() throws Exception {
-    TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder();
-    AbstractMessageWrapper.Builder abstractBuilder =
-      new AbstractMessageWrapper.Builder(builder);
-
-    assertTrue(abstractBuilder.isInitialized());
-    assertEquals("", abstractBuilder.getInitializationErrorString());
-
-    builder.setOptionalMessage(TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(abstractBuilder.isInitialized());
-    assertEquals(
-        "optional_message.a, optional_message.b, optional_message.c",
-        abstractBuilder.getInitializationErrorString());
-
-    builder.setOptionalMessage(TEST_REQUIRED_INITIALIZED);
-    assertTrue(abstractBuilder.isInitialized());
-    assertEquals("", abstractBuilder.getInitializationErrorString());
-
-    builder.addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(abstractBuilder.isInitialized());
-    assertEquals(
-        "repeated_message[0].a, repeated_message[0].b, repeated_message[0].c",
-        abstractBuilder.getInitializationErrorString());
-
-    builder.setRepeatedMessage(0, TEST_REQUIRED_INITIALIZED);
-    assertTrue(abstractBuilder.isInitialized());
-    assertEquals("", abstractBuilder.getInitializationErrorString());
-  }
-
-  // -----------------------------------------------------------------
-  // Tests for mergeFrom
-
-  static final TestAllTypes MERGE_SOURCE =
-    TestAllTypes.newBuilder()
-      .setOptionalInt32(1)
-      .setOptionalString("foo")
-      .setOptionalForeignMessage(ForeignMessage.getDefaultInstance())
-      .addRepeatedString("bar")
-      .build();
-
-  static final TestAllTypes MERGE_DEST =
-    TestAllTypes.newBuilder()
-      .setOptionalInt64(2)
-      .setOptionalString("baz")
-      .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(3).build())
-      .addRepeatedString("qux")
-      .build();
-
-  static final String MERGE_RESULT_TEXT =
-      "optional_int32: 1\n" +
-      "optional_int64: 2\n" +
-      "optional_string: \"foo\"\n" +
-      "optional_foreign_message {\n" +
-      "  c: 3\n" +
-      "}\n" +
-      "repeated_string: \"qux\"\n" +
-      "repeated_string: \"bar\"\n";
-
-  public void testMergeFrom() throws Exception {
-    AbstractMessageWrapper result =
-      new AbstractMessageWrapper.Builder(
-        TestAllTypes.newBuilder(MERGE_DEST))
-      .mergeFrom(MERGE_SOURCE).build();
-
-    assertEquals(MERGE_RESULT_TEXT, result.toString());
-  }
-
-  // -----------------------------------------------------------------
-  // Tests for equals and hashCode
-
-  public void testEqualsAndHashCode() throws Exception {
-    TestAllTypes a = TestUtil.getAllSet();
-    TestAllTypes b = TestAllTypes.newBuilder().build();
-    TestAllTypes c = TestAllTypes.newBuilder(b).addRepeatedString("x").build();
-    TestAllTypes d = TestAllTypes.newBuilder(c).addRepeatedString("y").build();
-    TestAllExtensions e = TestUtil.getAllExtensionsSet();
-    TestAllExtensions f = TestAllExtensions.newBuilder(e)
-        .addExtension(UnittestProto.repeatedInt32Extension, 999).build();
-
-    checkEqualsIsConsistent(a);
-    checkEqualsIsConsistent(b);
-    checkEqualsIsConsistent(c);
-    checkEqualsIsConsistent(d);
-    checkEqualsIsConsistent(e);
-    checkEqualsIsConsistent(f);
-
-    checkNotEqual(a, b);
-    checkNotEqual(a, c);
-    checkNotEqual(a, d);
-    checkNotEqual(a, e);
-    checkNotEqual(a, f);
-
-    checkNotEqual(b, c);
-    checkNotEqual(b, d);
-    checkNotEqual(b, e);
-    checkNotEqual(b, f);
-
-    checkNotEqual(c, d);
-    checkNotEqual(c, e);
-    checkNotEqual(c, f);
-
-    checkNotEqual(d, e);
-    checkNotEqual(d, f);
-
-    checkNotEqual(e, f);
-
-    // Deserializing into the TestEmptyMessage such that every field
-    // is an {@link UnknownFieldSet.Field}.
-    UnittestProto.TestEmptyMessage eUnknownFields =
-        UnittestProto.TestEmptyMessage.parseFrom(e.toByteArray());
-    UnittestProto.TestEmptyMessage fUnknownFields =
-        UnittestProto.TestEmptyMessage.parseFrom(f.toByteArray());
-    checkNotEqual(eUnknownFields, fUnknownFields);
-    checkEqualsIsConsistent(eUnknownFields);
-    checkEqualsIsConsistent(fUnknownFields);
-
-    // Subsequent reconstitutions should be identical
-    UnittestProto.TestEmptyMessage eUnknownFields2 =
-        UnittestProto.TestEmptyMessage.parseFrom(e.toByteArray());
-    checkEqualsIsConsistent(eUnknownFields, eUnknownFields2);
-  }
-
-
-  /**
-   * Asserts that the given proto has symmetric equals and hashCode methods.
-   */
-  private void checkEqualsIsConsistent(Message message) {
-    // Object should be equal to itself.
-    assertEquals(message, message);
-
-    // Object should be equal to a dynamic copy of itself.
-    DynamicMessage dynamic = DynamicMessage.newBuilder(message).build();
-    checkEqualsIsConsistent(message, dynamic);
-  }
-
-  /**
-   * Asserts that the given protos are equal and have the same hash code.
-   */
-  private void checkEqualsIsConsistent(Message message1, Message message2) {
-    assertEquals(message1, message2);
-    assertEquals(message2, message1);
-    assertEquals(message2.hashCode(), message1.hashCode());
-  }
-
-  /**
-   * Asserts that the given protos are not equal and have different hash codes.
-   *
-   * @warning It's valid for non-equal objects to have the same hash code, so
-   *   this test is stricter than it needs to be. However, this should happen
-   *   relatively rarely.
-   */
-  private void checkNotEqual(Message m1, Message m2) {
-    String equalsError = String.format("%s should not be equal to %s", m1, m2);
-    assertFalse(equalsError, m1.equals(m2));
-    assertFalse(equalsError, m2.equals(m1));
-
-    assertFalse(
-        String.format("%s should have a different hash code from %s", m1, m2),
-        m1.hashCode() == m2.hashCode());
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/BoundedByteStringTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/BoundedByteStringTest.java
deleted file mode 100644
index c838274..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/BoundedByteStringTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import java.io.UnsupportedEncodingException;
-
-/**
- * This class tests {@link BoundedByteString}, which extends {@link LiteralByteString},
- * by inheriting the tests from {@link LiteralByteStringTest}.  The only method which
- * is strange enough that it needs to be overridden here is {@link #testToString()}.
- *
- * @author carlanton@google.com (Carl Haverl)
- */
-public class BoundedByteStringTest extends LiteralByteStringTest {
-
-  @Override
-  protected void setUp() throws Exception {
-    classUnderTest = "BoundedByteString";
-    byte[] sourceBytes = ByteStringTest.getTestBytes(2341, 11337766L);
-    int from = 100;
-    int to = sourceBytes.length - 100;
-    stringUnderTest = ByteString.copyFrom(sourceBytes).substring(from, to);
-    referenceBytes = new byte[to - from];
-    System.arraycopy(sourceBytes, from, referenceBytes, 0, to - from);
-    expectedHashCode = 727575887;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ByteStringTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ByteStringTest.java
deleted file mode 100644
index 8bb9f73..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ByteStringTest.java
+++ /dev/null
@@ -1,590 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import com.google.protobuf.ByteString.Output;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Random;
-
-/**
- * Test methods with implementations in {@link ByteString}, plus do some top-level "integration"
- * tests.
- *
- * @author carlanton@google.com (Carl Haverl)
- */
-public class ByteStringTest extends TestCase {
-
-  private static final String UTF_16 = "UTF-16";
-
-  static byte[] getTestBytes(int size, long seed) {
-    Random random = new Random(seed);
-    byte[] result = new byte[size];
-    random.nextBytes(result);
-    return result;
-  }
-
-  private byte[] getTestBytes(int size) {
-    return getTestBytes(size, 445566L);
-  }
-
-  private byte[] getTestBytes() {
-    return getTestBytes(1000);
-  }
-
-  // Compare the entire left array with a subset of the right array.
-  private boolean isArrayRange(byte[] left, byte[] right, int rightOffset, int length) {
-    boolean stillEqual = (left.length == length);
-    for (int i = 0; (stillEqual && i < length); ++i) {
-      stillEqual = (left[i] == right[rightOffset + i]);
-    }
-    return stillEqual;
-  }
-
-  // Returns true only if the given two arrays have identical contents.
-  private boolean isArray(byte[] left, byte[] right) {
-    return left.length == right.length && isArrayRange(left, right, 0, left.length);
-  }
-
-  public void testSubstring_BeginIndex() {
-    byte[] bytes = getTestBytes();
-    ByteString substring = ByteString.copyFrom(bytes).substring(500);
-    assertTrue("substring must contain the tail of the string",
-        isArrayRange(substring.toByteArray(), bytes, 500, bytes.length - 500));
-  }
-
-  public void testCopyFrom_BytesOffsetSize() {
-    byte[] bytes = getTestBytes();
-    ByteString byteString = ByteString.copyFrom(bytes, 500, 200);
-    assertTrue("copyFrom sub-range must contain the expected bytes",
-        isArrayRange(byteString.toByteArray(), bytes, 500, 200));
-  }
-
-  public void testCopyFrom_Bytes() {
-    byte[] bytes = getTestBytes();
-    ByteString byteString = ByteString.copyFrom(bytes);
-    assertTrue("copyFrom must contain the expected bytes",
-        isArray(byteString.toByteArray(), bytes));
-  }
-
-  public void testCopyFrom_ByteBufferSize() {
-    byte[] bytes = getTestBytes();
-    ByteBuffer byteBuffer = ByteBuffer.allocate(bytes.length);
-    byteBuffer.put(bytes);
-    byteBuffer.position(500);
-    ByteString byteString = ByteString.copyFrom(byteBuffer, 200);
-    assertTrue("copyFrom byteBuffer sub-range must contain the expected bytes",
-        isArrayRange(byteString.toByteArray(), bytes, 500, 200));
-  }
-
-  public void testCopyFrom_ByteBuffer() {
-    byte[] bytes = getTestBytes();
-    ByteBuffer byteBuffer = ByteBuffer.allocate(bytes.length);
-    byteBuffer.put(bytes);
-    byteBuffer.position(500);
-    ByteString byteString = ByteString.copyFrom(byteBuffer);
-    assertTrue("copyFrom byteBuffer sub-range must contain the expected bytes",
-        isArrayRange(byteString.toByteArray(), bytes, 500, bytes.length - 500));
-  }
-
-  public void testCopyFrom_StringEncoding() throws UnsupportedEncodingException {
-    String testString = "I love unicode \u1234\u5678 characters";
-    ByteString byteString = ByteString.copyFrom(testString, UTF_16);
-    byte[] testBytes = testString.getBytes(UTF_16);
-    assertTrue("copyFrom string must respect the charset",
-        isArrayRange(byteString.toByteArray(), testBytes, 0, testBytes.length));
-  }
-
-  public void testCopyFrom_Utf8() throws UnsupportedEncodingException {
-    String testString = "I love unicode \u1234\u5678 characters";
-    ByteString byteString = ByteString.copyFromUtf8(testString);
-    byte[] testBytes = testString.getBytes("UTF-8");
-    assertTrue("copyFromUtf8 string must respect the charset",
-        isArrayRange(byteString.toByteArray(), testBytes, 0, testBytes.length));
-  }
-
-  public void testCopyFrom_Iterable() {
-    byte[] testBytes = getTestBytes(77777, 113344L);
-    final List<ByteString> pieces = makeConcretePieces(testBytes);
-    // Call copyFrom() on a Collection
-    ByteString byteString = ByteString.copyFrom(pieces);
-    assertTrue("copyFrom a List must contain the expected bytes",
-        isArrayRange(byteString.toByteArray(), testBytes, 0, testBytes.length));
-    // Call copyFrom on an iteration that's not a collection
-    ByteString byteStringAlt = ByteString.copyFrom(new Iterable<ByteString>() {
-      public Iterator<ByteString> iterator() {
-        return pieces.iterator();
-      }
-    });
-    assertEquals("copyFrom from an Iteration must contain the expected bytes",
-        byteString, byteStringAlt);
-  }
-
-  public void testCopyTo_TargetOffset() {
-    byte[] bytes = getTestBytes();
-    ByteString byteString = ByteString.copyFrom(bytes);
-    byte[] target = new byte[bytes.length + 1000];
-    byteString.copyTo(target, 400);
-    assertTrue("copyFrom byteBuffer sub-range must contain the expected bytes",
-        isArrayRange(bytes, target, 400, bytes.length));
-  }
-
-  public void testReadFrom_emptyStream() throws IOException {
-    ByteString byteString =
-        ByteString.readFrom(new ByteArrayInputStream(new byte[0]));
-    assertSame("reading an empty stream must result in the EMPTY constant "
-        + "byte string", ByteString.EMPTY, byteString);
-  }
-
-  public void testReadFrom_smallStream() throws IOException {
-    assertReadFrom(getTestBytes(10));
-  }
-
-  public void testReadFrom_mutating() throws IOException {
-    byte[] capturedArray = null;
-    EvilInputStream eis = new EvilInputStream();
-    ByteString byteString = ByteString.readFrom(eis);
-
-    capturedArray = eis.capturedArray;
-    byte[] originalValue = byteString.toByteArray();
-    for (int x = 0; x < capturedArray.length; ++x) {
-      capturedArray[x] = (byte) 0;
-    }
-
-    byte[] newValue = byteString.toByteArray();
-    assertTrue("copyFrom byteBuffer must not grant access to underlying array",
-        Arrays.equals(originalValue, newValue));
-  }
-
-  // Tests sizes that are over multi-segment rope threshold.
-  public void testReadFrom_largeStream() throws IOException {
-    assertReadFrom(getTestBytes(0x100));
-    assertReadFrom(getTestBytes(0x101));
-    assertReadFrom(getTestBytes(0x110));
-    assertReadFrom(getTestBytes(0x1000));
-    assertReadFrom(getTestBytes(0x1001));
-    assertReadFrom(getTestBytes(0x1010));
-    assertReadFrom(getTestBytes(0x10000));
-    assertReadFrom(getTestBytes(0x10001));
-    assertReadFrom(getTestBytes(0x10010));
-  }
-
-  // Tests that IOExceptions propagate through ByteString.readFrom().
-  public void testReadFrom_IOExceptions() {
-    try {
-      ByteString.readFrom(new FailStream());
-      fail("readFrom must throw the underlying IOException");
-
-    } catch (IOException e) {
-      assertEquals("readFrom must throw the expected exception",
-                   "synthetic failure", e.getMessage());
-    }
-  }
-
-  // Tests that ByteString.readFrom works with streams that don't
-  // always fill their buffers.
-  public void testReadFrom_reluctantStream() throws IOException {
-    final byte[] data = getTestBytes(0x1000);
-
-    ByteString byteString = ByteString.readFrom(new ReluctantStream(data));
-    assertTrue("readFrom byte stream must contain the expected bytes",
-        isArray(byteString.toByteArray(), data));
-
-    // Same test as above, but with some specific chunk sizes.
-    assertReadFromReluctantStream(data, 100);
-    assertReadFromReluctantStream(data, 248);
-    assertReadFromReluctantStream(data, 249);
-    assertReadFromReluctantStream(data, 250);
-    assertReadFromReluctantStream(data, 251);
-    assertReadFromReluctantStream(data, 0x1000);
-    assertReadFromReluctantStream(data, 0x1001);
-  }
-
-  // Fails unless ByteString.readFrom reads the bytes correctly from a
-  // reluctant stream with the given chunkSize parameter.
-  private void assertReadFromReluctantStream(byte[] bytes, int chunkSize)
-      throws IOException {
-    ByteString b = ByteString.readFrom(new ReluctantStream(bytes), chunkSize);
-    assertTrue("readFrom byte stream must contain the expected bytes",
-        isArray(b.toByteArray(), bytes));
-  }
-
-  // Tests that ByteString.readFrom works with streams that implement
-  // available().
-  public void testReadFrom_available() throws IOException {
-    final byte[] data = getTestBytes(0x1001);
-
-    ByteString byteString = ByteString.readFrom(new AvailableStream(data));
-    assertTrue("readFrom byte stream must contain the expected bytes",
-        isArray(byteString.toByteArray(), data));
-  }
-
-  // Fails unless ByteString.readFrom reads the bytes correctly.
-  private void assertReadFrom(byte[] bytes) throws IOException {
-    ByteString byteString =
-        ByteString.readFrom(new ByteArrayInputStream(bytes));
-    assertTrue("readFrom byte stream must contain the expected bytes",
-        isArray(byteString.toByteArray(), bytes));
-  }
-
-  // A stream that fails when read.
-  private static final class FailStream extends InputStream {
-    @Override public int read() throws IOException {
-      throw new IOException("synthetic failure");
-    }
-  }
-
-  // A stream that simulates blocking by only producing 250 characters
-  // per call to read(byte[]).
-  private static class ReluctantStream extends InputStream {
-    protected final byte[] data;
-    protected int pos = 0;
-
-    public ReluctantStream(byte[] data) {
-      this.data = data;
-    }
-
-    @Override public int read() {
-      if (pos == data.length) {
-        return -1;
-      } else {
-        return data[pos++];
-      }
-    }
-
-    @Override public int read(byte[] buf) {
-      return read(buf, 0, buf.length);
-    }
-
-    @Override public int read(byte[] buf, int offset, int size) {
-      if (pos == data.length) {
-        return -1;
-      }
-      int count = Math.min(Math.min(size, data.length - pos), 250);
-      System.arraycopy(data, pos, buf, offset, count);
-      pos += count;
-      return count;
-    }
-  }
-
-  // Same as above, but also implements available().
-  private static final class AvailableStream extends ReluctantStream {
-    public AvailableStream(byte[] data) {
-      super(data);
-    }
-
-    @Override public int available() {
-      return Math.min(250, data.length - pos);
-    }
-  }
-
-  // A stream which exposes the byte array passed into read(byte[], int, int).
-  private static class EvilInputStream extends InputStream {
-    public byte[] capturedArray = null;
-
-    @Override
-    public int read(byte[] buf, int off, int len) {
-      if (capturedArray != null) {
-        return -1;
-      } else {
-        capturedArray = buf;
-        for (int x = 0; x < len; ++x) {
-          buf[x] = (byte) x;
-        }
-        return len;
-      }
-    }
-
-    @Override
-    public int read() {
-      // Purposefully do nothing.
-      return -1;
-    }
-  }
-  
-  // A stream which exposes the byte array passed into write(byte[], int, int).
-  private static class EvilOutputStream extends OutputStream {
-    public byte[] capturedArray = null;
-
-    @Override
-    public void write(byte[] buf, int off, int len) {
-      if (capturedArray == null) {
-        capturedArray = buf;
-      }
-    }
-
-    @Override
-    public void write(int ignored) {
-      // Purposefully do nothing.
-    }
-  }
-
-  public void testToStringUtf8() throws UnsupportedEncodingException {
-    String testString = "I love unicode \u1234\u5678 characters";
-    byte[] testBytes = testString.getBytes("UTF-8");
-    ByteString byteString = ByteString.copyFrom(testBytes);
-    assertEquals("copyToStringUtf8 must respect the charset",
-        testString, byteString.toStringUtf8());
-  }
-
-  public void testNewOutput_InitialCapacity() throws IOException {
-    byte[] bytes = getTestBytes();
-    ByteString.Output output = ByteString.newOutput(bytes.length + 100);
-    output.write(bytes);
-    ByteString byteString = output.toByteString();
-    assertTrue(
-        "String built from newOutput(int) must contain the expected bytes",
-        isArrayRange(bytes, byteString.toByteArray(), 0, bytes.length));
-  }
-
-  // Test newOutput() using a variety of buffer sizes and a variety of (fixed)
-  // write sizes
-  public void testNewOutput_ArrayWrite() throws IOException {
-    byte[] bytes = getTestBytes();
-    int length = bytes.length;
-    int[] bufferSizes = {128, 256, length / 2, length - 1, length, length + 1,
-                         2 * length, 3 * length};
-    int[] writeSizes = {1, 4, 5, 7, 23, bytes.length};
-
-    for (int bufferSize : bufferSizes) {
-      for (int writeSize : writeSizes) {
-        // Test writing the entire output writeSize bytes at a time.
-        ByteString.Output output = ByteString.newOutput(bufferSize);
-        for (int i = 0; i < length; i += writeSize) {
-          output.write(bytes, i, Math.min(writeSize, length - i));
-        }
-        ByteString byteString = output.toByteString();
-        assertTrue("String built from newOutput() must contain the expected bytes",
-            isArrayRange(bytes, byteString.toByteArray(), 0, bytes.length));
-      }
-    }
-  }
-
-  // Test newOutput() using a variety of buffer sizes, but writing all the
-  // characters using write(byte);
-  public void testNewOutput_WriteChar() throws IOException {
-    byte[] bytes = getTestBytes();
-    int length = bytes.length;
-    int[] bufferSizes = {0, 1, 128, 256, length / 2,
-                         length - 1, length, length + 1,
-                         2 * length, 3 * length};
-    for (int bufferSize : bufferSizes) {
-      ByteString.Output output = ByteString.newOutput(bufferSize);
-      for (byte byteValue : bytes) {
-        output.write(byteValue);
-      }
-      ByteString byteString = output.toByteString();
-      assertTrue("String built from newOutput() must contain the expected bytes",
-          isArrayRange(bytes, byteString.toByteArray(), 0, bytes.length));
-    }
-  }
-
-  // Test newOutput() in which we write the bytes using a variety of methods
-  // and sizes, and in which we repeatedly call toByteString() in the middle.
-  public void testNewOutput_Mixed() throws IOException {
-    Random rng = new Random(1);
-    byte[] bytes = getTestBytes();
-    int length = bytes.length;
-    int[] bufferSizes = {0, 1, 128, 256, length / 2,
-                         length - 1, length, length + 1,
-                         2 * length, 3 * length};
-
-    for (int bufferSize : bufferSizes) {
-      // Test writing the entire output using a mixture of write sizes and
-      // methods;
-      ByteString.Output output = ByteString.newOutput(bufferSize);
-      int position = 0;
-      while (position < bytes.length) {
-        if (rng.nextBoolean()) {
-          int count = 1 + rng.nextInt(bytes.length - position);
-          output.write(bytes, position, count);
-          position += count;
-        } else {
-          output.write(bytes[position]);
-          position++;
-        }
-        assertEquals("size() returns the right value", position, output.size());
-        assertTrue("newOutput() substring must have correct bytes",
-            isArrayRange(output.toByteString().toByteArray(),
-                bytes, 0, position));
-      }
-      ByteString byteString = output.toByteString();
-      assertTrue("String built from newOutput() must contain the expected bytes",
-          isArrayRange(bytes, byteString.toByteArray(), 0, bytes.length));
-    }
-  }
-  
-  public void testNewOutputEmpty() throws IOException {
-    // Make sure newOutput() correctly builds empty byte strings
-    ByteString byteString = ByteString.newOutput().toByteString();
-    assertEquals(ByteString.EMPTY, byteString);
-  }
-  
-  public void testNewOutput_Mutating() throws IOException {
-    Output os = ByteString.newOutput(5);
-    os.write(new byte[] {1, 2, 3, 4, 5});
-    EvilOutputStream eos = new EvilOutputStream();
-    os.writeTo(eos);
-    byte[] capturedArray = eos.capturedArray;
-    ByteString byteString = os.toByteString();
-    byte[] oldValue = byteString.toByteArray();
-    Arrays.fill(capturedArray, (byte) 0);
-    byte[] newValue = byteString.toByteArray();
-    assertTrue("Output must not provide access to the underlying byte array",
-        Arrays.equals(oldValue, newValue));
-  }
-
-  public void testSubstringParity() {
-    byte[] bigBytes = getTestBytes(2048 * 1024, 113344L);
-    int start = 512 * 1024 - 3333;
-    int end   = 512 * 1024 + 7777;
-    ByteString concreteSubstring = ByteString.copyFrom(bigBytes).substring(start, end);
-    boolean ok = true;
-    for (int i = start; ok && i < end; ++i) {
-      ok = (bigBytes[i] == concreteSubstring.byteAt(i - start));
-    }
-    assertTrue("Concrete substring didn't capture the right bytes", ok);
-
-    ByteString literalString = ByteString.copyFrom(bigBytes, start, end - start);
-    assertTrue("Substring must be equal to literal string",
-        concreteSubstring.equals(literalString));
-    assertEquals("Substring must have same hashcode as literal string",
-        literalString.hashCode(), concreteSubstring.hashCode());
-  }
-
-  public void testCompositeSubstring() {
-    byte[] referenceBytes = getTestBytes(77748, 113344L);
-
-    List<ByteString> pieces = makeConcretePieces(referenceBytes);
-    ByteString listString = ByteString.copyFrom(pieces);
-
-    int from = 1000;
-    int to = 40000;
-    ByteString compositeSubstring = listString.substring(from, to);
-    byte[] substringBytes = compositeSubstring.toByteArray();
-    boolean stillEqual = true;
-    for (int i = 0; stillEqual && i < to - from; ++i) {
-      stillEqual = referenceBytes[from + i] == substringBytes[i];
-    }
-    assertTrue("Substring must return correct bytes", stillEqual);
-
-    stillEqual = true;
-    for (int i = 0; stillEqual && i < to - from; ++i) {
-      stillEqual = referenceBytes[from + i] == compositeSubstring.byteAt(i);
-    }
-    assertTrue("Substring must support byteAt() correctly", stillEqual);
-
-    ByteString literalSubstring = ByteString.copyFrom(referenceBytes, from, to - from);
-    assertTrue("Composite substring must equal a literal substring over the same bytes",
-        compositeSubstring.equals(literalSubstring));
-    assertTrue("Literal substring must equal a composite substring over the same bytes",
-        literalSubstring.equals(compositeSubstring));
-
-    assertEquals("We must get the same hashcodes for composite and literal substrings",
-        literalSubstring.hashCode(), compositeSubstring.hashCode());
-
-    assertFalse("We can't be equal to a proper substring",
-        compositeSubstring.equals(literalSubstring.substring(0, literalSubstring.size() - 1)));
-  }
-
-  public void testCopyFromList() {
-    byte[] referenceBytes = getTestBytes(77748, 113344L);
-    ByteString literalString = ByteString.copyFrom(referenceBytes);
-
-    List<ByteString> pieces = makeConcretePieces(referenceBytes);
-    ByteString listString = ByteString.copyFrom(pieces);
-
-    assertTrue("Composite string must be equal to literal string",
-        listString.equals(literalString));
-    assertEquals("Composite string must have same hashcode as literal string",
-        literalString.hashCode(), listString.hashCode());
-  }
-
-  public void testConcat() {
-    byte[] referenceBytes = getTestBytes(77748, 113344L);
-    ByteString literalString = ByteString.copyFrom(referenceBytes);
-
-    List<ByteString> pieces = makeConcretePieces(referenceBytes);
-
-    Iterator<ByteString> iter = pieces.iterator();
-    ByteString concatenatedString = iter.next();
-    while (iter.hasNext()) {
-      concatenatedString = concatenatedString.concat(iter.next());
-    }
-
-    assertTrue("Concatenated string must be equal to literal string",
-        concatenatedString.equals(literalString));
-    assertEquals("Concatenated string must have same hashcode as literal string",
-        literalString.hashCode(), concatenatedString.hashCode());
-  }
-
-  public void testStartsWith() {
-    byte[] bytes = getTestBytes(1000, 1234L);
-    ByteString string = ByteString.copyFrom(bytes);
-    ByteString prefix = ByteString.copyFrom(bytes, 0, 500);
-    ByteString suffix = ByteString.copyFrom(bytes, 400, 600);
-    assertTrue(string.startsWith(ByteString.EMPTY));
-    assertTrue(string.startsWith(string));
-    assertTrue(string.startsWith(prefix));
-    assertFalse(string.startsWith(suffix));
-    assertFalse(prefix.startsWith(suffix));
-    assertFalse(suffix.startsWith(prefix));
-    assertFalse(ByteString.EMPTY.startsWith(prefix));
-    assertTrue(ByteString.EMPTY.startsWith(ByteString.EMPTY));
-  }
-
-  static List<ByteString> makeConcretePieces(byte[] referenceBytes) {
-    List<ByteString> pieces = new ArrayList<ByteString>();
-    // Starting length should be small enough that we'll do some concatenating by
-    // copying if we just concatenate all these pieces together.
-    for (int start = 0, length = 16; start < referenceBytes.length; start += length) {
-      length = (length << 1) - 1;
-      if (start + length > referenceBytes.length) {
-        length = referenceBytes.length - start;
-      }
-      pieces.add(ByteString.copyFrom(referenceBytes, start, length));
-    }
-    return pieces;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/CodedInputStreamTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/CodedInputStreamTest.java
deleted file mode 100644
index 7e67898..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/CodedInputStreamTest.java
+++ /dev/null
@@ -1,469 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestRecursiveMessage;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.FilterInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-
-/**
- * Unit test for {@link CodedInputStream}.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class CodedInputStreamTest extends TestCase {
-  /**
-   * Helper to construct a byte array from a bunch of bytes.  The inputs are
-   * actually ints so that I can use hex notation and not get stupid errors
-   * about precision.
-   */
-  private byte[] bytes(int... bytesAsInts) {
-    byte[] bytes = new byte[bytesAsInts.length];
-    for (int i = 0; i < bytesAsInts.length; i++) {
-      bytes[i] = (byte) bytesAsInts[i];
-    }
-    return bytes;
-  }
-
-  /**
-   * An InputStream which limits the number of bytes it reads at a time.
-   * We use this to make sure that CodedInputStream doesn't screw up when
-   * reading in small blocks.
-   */
-  private static final class SmallBlockInputStream extends FilterInputStream {
-    private final int blockSize;
-
-    public SmallBlockInputStream(byte[] data, int blockSize) {
-      this(new ByteArrayInputStream(data), blockSize);
-    }
-
-    public SmallBlockInputStream(InputStream in, int blockSize) {
-      super(in);
-      this.blockSize = blockSize;
-    }
-
-    public int read(byte[] b) throws IOException {
-      return super.read(b, 0, Math.min(b.length, blockSize));
-    }
-
-    public int read(byte[] b, int off, int len) throws IOException {
-      return super.read(b, off, Math.min(len, blockSize));
-    }
-  }
-
-  /**
-   * Parses the given bytes using readRawVarint32() and readRawVarint64() and
-   * checks that the result matches the given value.
-   */
-  private void assertReadVarint(byte[] data, long value) throws Exception {
-    CodedInputStream input = CodedInputStream.newInstance(data);
-    assertEquals((int)value, input.readRawVarint32());
-
-    input = CodedInputStream.newInstance(data);
-    assertEquals(value, input.readRawVarint64());
-    assertTrue(input.isAtEnd());
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-      input = CodedInputStream.newInstance(
-        new SmallBlockInputStream(data, blockSize));
-      assertEquals((int)value, input.readRawVarint32());
-
-      input = CodedInputStream.newInstance(
-        new SmallBlockInputStream(data, blockSize));
-      assertEquals(value, input.readRawVarint64());
-      assertTrue(input.isAtEnd());
-    }
-
-    // Try reading direct from an InputStream.  We want to verify that it
-    // doesn't read past the end of the input, so we copy to a new, bigger
-    // array first.
-    byte[] longerData = new byte[data.length + 1];
-    System.arraycopy(data, 0, longerData, 0, data.length);
-    InputStream rawInput = new ByteArrayInputStream(longerData);
-  }
-
-  /**
-   * Parses the given bytes using readRawVarint32() and readRawVarint64() and
-   * expects them to fail with an InvalidProtocolBufferException whose
-   * description matches the given one.
-   */
-  private void assertReadVarintFailure(
-      InvalidProtocolBufferException expected, byte[] data)
-      throws Exception {
-    CodedInputStream input = CodedInputStream.newInstance(data);
-    try {
-      input.readRawVarint32();
-      fail("Should have thrown an exception.");
-    } catch (InvalidProtocolBufferException e) {
-      assertEquals(expected.getMessage(), e.getMessage());
-    }
-
-    input = CodedInputStream.newInstance(data);
-    try {
-      input.readRawVarint64();
-      fail("Should have thrown an exception.");
-    } catch (InvalidProtocolBufferException e) {
-      assertEquals(expected.getMessage(), e.getMessage());
-    }
-  }
-
-  /** Tests readRawVarint32() and readRawVarint64(). */
-  public void testReadVarint() throws Exception {
-    assertReadVarint(bytes(0x00), 0);
-    assertReadVarint(bytes(0x01), 1);
-    assertReadVarint(bytes(0x7f), 127);
-    // 14882
-    assertReadVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));
-    // 2961488830
-    assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),
-      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
-      (0x0bL << 28));
-
-    // 64-bit
-    // 7256456126
-    assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),
-      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
-      (0x1bL << 28));
-    // 41256202580718336
-    assertReadVarint(
-      bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),
-      (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
-      (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));
-    // 11964378330978735131
-    assertReadVarint(
-      bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),
-      (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
-      (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |
-      (0x05L << 49) | (0x26L << 56) | (0x01L << 63));
-  }
-
-  /**
-   * Parses the given bytes using readRawLittleEndian32() and checks
-   * that the result matches the given value.
-   */
-  private void assertReadLittleEndian32(byte[] data, int value)
-                                        throws Exception {
-    CodedInputStream input = CodedInputStream.newInstance(data);
-    assertEquals(value, input.readRawLittleEndian32());
-    assertTrue(input.isAtEnd());
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-      input = CodedInputStream.newInstance(
-        new SmallBlockInputStream(data, blockSize));
-      assertEquals(value, input.readRawLittleEndian32());
-      assertTrue(input.isAtEnd());
-    }
-  }
-
-  /**
-   * Parses the given bytes using readRawLittleEndian64() and checks
-   * that the result matches the given value.
-   */
-  private void assertReadLittleEndian64(byte[] data, long value)
-                                        throws Exception {
-    CodedInputStream input = CodedInputStream.newInstance(data);
-    assertEquals(value, input.readRawLittleEndian64());
-    assertTrue(input.isAtEnd());
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-      input = CodedInputStream.newInstance(
-        new SmallBlockInputStream(data, blockSize));
-      assertEquals(value, input.readRawLittleEndian64());
-      assertTrue(input.isAtEnd());
-    }
-  }
-
-  /** Tests readRawLittleEndian32() and readRawLittleEndian64(). */
-  public void testReadLittleEndian() throws Exception {
-    assertReadLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);
-    assertReadLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);
-
-    assertReadLittleEndian64(
-      bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),
-      0x123456789abcdef0L);
-    assertReadLittleEndian64(
-      bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a),
-      0x9abcdef012345678L);
-  }
-
-  /** Test decodeZigZag32() and decodeZigZag64(). */
-  public void testDecodeZigZag() throws Exception {
-    assertEquals( 0, CodedInputStream.decodeZigZag32(0));
-    assertEquals(-1, CodedInputStream.decodeZigZag32(1));
-    assertEquals( 1, CodedInputStream.decodeZigZag32(2));
-    assertEquals(-2, CodedInputStream.decodeZigZag32(3));
-    assertEquals(0x3FFFFFFF, CodedInputStream.decodeZigZag32(0x7FFFFFFE));
-    assertEquals(0xC0000000, CodedInputStream.decodeZigZag32(0x7FFFFFFF));
-    assertEquals(0x7FFFFFFF, CodedInputStream.decodeZigZag32(0xFFFFFFFE));
-    assertEquals(0x80000000, CodedInputStream.decodeZigZag32(0xFFFFFFFF));
-
-    assertEquals( 0, CodedInputStream.decodeZigZag64(0));
-    assertEquals(-1, CodedInputStream.decodeZigZag64(1));
-    assertEquals( 1, CodedInputStream.decodeZigZag64(2));
-    assertEquals(-2, CodedInputStream.decodeZigZag64(3));
-    assertEquals(0x000000003FFFFFFFL,
-                 CodedInputStream.decodeZigZag64(0x000000007FFFFFFEL));
-    assertEquals(0xFFFFFFFFC0000000L,
-                 CodedInputStream.decodeZigZag64(0x000000007FFFFFFFL));
-    assertEquals(0x000000007FFFFFFFL,
-                 CodedInputStream.decodeZigZag64(0x00000000FFFFFFFEL));
-    assertEquals(0xFFFFFFFF80000000L,
-                 CodedInputStream.decodeZigZag64(0x00000000FFFFFFFFL));
-    assertEquals(0x7FFFFFFFFFFFFFFFL,
-                 CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFEL));
-    assertEquals(0x8000000000000000L,
-                 CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFFL));
-  }
-
-  /** Tests reading and parsing a whole message with every field type. */
-  public void testReadWholeMessage() throws Exception {
-    TestAllTypes message = TestUtil.getAllSet();
-
-    byte[] rawBytes = message.toByteArray();
-    assertEquals(rawBytes.length, message.getSerializedSize());
-
-    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
-    TestUtil.assertAllFieldsSet(message2);
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize < 256; blockSize *= 2) {
-      message2 = TestAllTypes.parseFrom(
-        new SmallBlockInputStream(rawBytes, blockSize));
-      TestUtil.assertAllFieldsSet(message2);
-    }
-  }
-
-  /** Tests skipField(). */
-  public void testSkipWholeMessage() throws Exception {
-    TestAllTypes message = TestUtil.getAllSet();
-    byte[] rawBytes = message.toByteArray();
-
-    // Create two parallel inputs.  Parse one as unknown fields while using
-    // skipField() to skip each field on the other.  Expect the same tags.
-    CodedInputStream input1 = CodedInputStream.newInstance(rawBytes);
-    CodedInputStream input2 = CodedInputStream.newInstance(rawBytes);
-    UnknownFieldSet.Builder unknownFields = UnknownFieldSet.newBuilder();
-
-    while (true) {
-      int tag = input1.readTag();
-      assertEquals(tag, input2.readTag());
-      if (tag == 0) {
-        break;
-      }
-      unknownFields.mergeFieldFrom(tag, input1);
-      input2.skipField(tag);
-    }
-  }
-
-  /**
-   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
-   * exactly up to a limit, this should not break things.
-   */
-  public void testSkipRawBytesBug() throws Exception {
-    byte[] rawBytes = new byte[] { 1, 2 };
-    CodedInputStream input = CodedInputStream.newInstance(rawBytes);
-
-    int limit = input.pushLimit(1);
-    input.skipRawBytes(1);
-    input.popLimit(limit);
-    assertEquals(2, input.readRawByte());
-  }
-
-  /**
-   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
-   * past the end of a buffer with a limit that has been set past the end of
-   * that buffer, this should not break things.
-   */
-  public void testSkipRawBytesPastEndOfBufferWithLimit() throws Exception {
-    byte[] rawBytes = new byte[] { 1, 2, 3, 4, 5 };
-    CodedInputStream input = CodedInputStream.newInstance(
-        new SmallBlockInputStream(rawBytes, 3));
-
-    int limit = input.pushLimit(4);
-    // In order to expose the bug we need to read at least one byte to prime the
-    // buffer inside the CodedInputStream.
-    assertEquals(1, input.readRawByte());
-    // Skip to the end of the limit.
-    input.skipRawBytes(3);
-    assertTrue(input.isAtEnd());
-    input.popLimit(limit);
-    assertEquals(5, input.readRawByte());
-  }
-
-  public void testReadHugeBlob() throws Exception {
-    // Allocate and initialize a 1MB blob.
-    byte[] blob = new byte[1 << 20];
-    for (int i = 0; i < blob.length; i++) {
-      blob[i] = (byte)i;
-    }
-
-    // Make a message containing it.
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    builder.setOptionalBytes(ByteString.copyFrom(blob));
-    TestAllTypes message = builder.build();
-
-    // Serialize and parse it.  Make sure to parse from an InputStream, not
-    // directly from a ByteString, so that CodedInputStream uses buffered
-    // reading.
-    TestAllTypes message2 =
-      TestAllTypes.parseFrom(message.toByteString().newInput());
-
-    assertEquals(message.getOptionalBytes(), message2.getOptionalBytes());
-
-    // Make sure all the other fields were parsed correctly.
-    TestAllTypes message3 = TestAllTypes.newBuilder(message2)
-      .setOptionalBytes(TestUtil.getAllSet().getOptionalBytes())
-      .build();
-    TestUtil.assertAllFieldsSet(message3);
-  }
-
-  public int makeTag(int number, int tag) {
-    return (number << 3) + tag;
-  }
-
-  public void testReadMaliciouslyLargeBlob() throws Exception {
-    ByteString.Output rawOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-
-    int tag = makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-    output.writeRawVarint32(tag);
-    output.writeRawVarint32(0x7FFFFFFF);
-    output.writeRawBytes(new byte[32]);  // Pad with a few random bytes.
-    output.flush();
-
-    CodedInputStream input = rawOutput.toByteString().newCodedInput();
-    assertEquals(tag, input.readTag());
-
-    try {
-      input.readBytes();
-      fail("Should have thrown an exception!");
-    } catch (InvalidProtocolBufferException e) {
-      // success.
-    }
-  }
-
-  private TestRecursiveMessage makeRecursiveMessage(int depth) {
-    if (depth == 0) {
-      return TestRecursiveMessage.newBuilder().setI(5).build();
-    } else {
-      return TestRecursiveMessage.newBuilder()
-        .setA(makeRecursiveMessage(depth - 1)).build();
-    }
-  }
-
-  private void assertMessageDepth(TestRecursiveMessage message, int depth) {
-    if (depth == 0) {
-      assertFalse(message.hasA());
-      assertEquals(5, message.getI());
-    } else {
-      assertTrue(message.hasA());
-      assertMessageDepth(message.getA(), depth - 1);
-    }
-  }
-
-  public void testResetSizeCounter() throws Exception {
-    CodedInputStream input = CodedInputStream.newInstance(
-        new SmallBlockInputStream(new byte[256], 8));
-    input.setSizeLimit(16);
-    input.readRawBytes(16);
-    assertEquals(16, input.getTotalBytesRead());
-
-    try {
-      input.readRawByte();
-      fail("Should have thrown an exception!");
-    } catch (InvalidProtocolBufferException e) {
-      // success.
-    }
-
-    input.resetSizeCounter();
-    assertEquals(0, input.getTotalBytesRead());
-    input.readRawByte();  // No exception thrown.
-    input.resetSizeCounter();
-    assertEquals(0, input.getTotalBytesRead());
-  }
-
-  /**
-   * Tests that if we read an string that contains invalid UTF-8, no exception
-   * is thrown.  Instead, the invalid bytes are replaced with the Unicode
-   * "replacement character" U+FFFD.
-   */
-  public void testReadInvalidUtf8() throws Exception {
-    ByteString.Output rawOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-
-    int tag = makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-    output.writeRawVarint32(tag);
-    output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] { (byte)0x80 });
-    output.flush();
-
-    CodedInputStream input = rawOutput.toByteString().newCodedInput();
-    assertEquals(tag, input.readTag());
-    String text = input.readString();
-    assertEquals(0xfffd, text.charAt(0));
-  }
-
-  public void testReadFromSlice() throws Exception {
-    byte[] bytes = bytes(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
-    CodedInputStream in = CodedInputStream.newInstance(bytes, 3, 5);
-    assertEquals(0, in.getTotalBytesRead());
-    for (int i = 3; i < 8; i++) {
-      assertEquals(i, in.readRawByte());
-      assertEquals(i-2, in.getTotalBytesRead());
-    }
-    // eof
-    assertEquals(0, in.readTag());
-    assertEquals(5, in.getTotalBytesRead());
-  }
-
-  public void testInvalidTag() throws Exception {
-    // Any tag number which corresponds to field number zero is invalid and
-    // should throw InvalidProtocolBufferException.
-    for (int i = 0; i < 8; i++) {
-      try {
-        CodedInputStream.newInstance(bytes(i)).readTag();
-        fail("Should have thrown an exception.");
-      } catch (InvalidProtocolBufferException e) {
-      }
-    }
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/CodedOutputStreamTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/CodedOutputStreamTest.java
deleted file mode 100644
index 354d89d..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/CodedOutputStreamTest.java
+++ /dev/null
@@ -1,318 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto.SparseEnumMessage;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-import protobuf_unittest.UnittestProto.TestSparseEnum;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Unit test for {@link CodedOutputStream}.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class CodedOutputStreamTest extends TestCase {
-  /**
-   * Helper to construct a byte array from a bunch of bytes.  The inputs are
-   * actually ints so that I can use hex notation and not get stupid errors
-   * about precision.
-   */
-  private byte[] bytes(int... bytesAsInts) {
-    byte[] bytes = new byte[bytesAsInts.length];
-    for (int i = 0; i < bytesAsInts.length; i++) {
-      bytes[i] = (byte) bytesAsInts[i];
-    }
-    return bytes;
-  }
-
-  /** Arrays.asList() does not work with arrays of primitives.  :( */
-  private List<Byte> toList(byte[] bytes) {
-    List<Byte> result = new ArrayList<Byte>();
-    for (byte b : bytes) {
-      result.add(b);
-    }
-    return result;
-  }
-
-  private void assertEqualBytes(byte[] a, byte[] b) {
-    assertEquals(toList(a), toList(b));
-  }
-
-  /**
-   * Writes the given value using writeRawVarint32() and writeRawVarint64() and
-   * checks that the result matches the given bytes.
-   */
-  private void assertWriteVarint(byte[] data, long value) throws Exception {
-    // Only do 32-bit write if the value fits in 32 bits.
-    if ((value >>> 32) == 0) {
-      ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-      CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-      output.writeRawVarint32((int) value);
-      output.flush();
-      assertEqualBytes(data, rawOutput.toByteArray());
-
-      // Also try computing size.
-      assertEquals(data.length,
-                   CodedOutputStream.computeRawVarint32Size((int) value));
-    }
-
-    {
-      ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-      CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-      output.writeRawVarint64(value);
-      output.flush();
-      assertEqualBytes(data, rawOutput.toByteArray());
-
-      // Also try computing size.
-      assertEquals(data.length,
-                   CodedOutputStream.computeRawVarint64Size(value));
-    }
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-      // Only do 32-bit write if the value fits in 32 bits.
-      if ((value >>> 32) == 0) {
-        ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-        CodedOutputStream output =
-          CodedOutputStream.newInstance(rawOutput, blockSize);
-        output.writeRawVarint32((int) value);
-        output.flush();
-        assertEqualBytes(data, rawOutput.toByteArray());
-      }
-
-      {
-        ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-        CodedOutputStream output =
-          CodedOutputStream.newInstance(rawOutput, blockSize);
-        output.writeRawVarint64(value);
-        output.flush();
-        assertEqualBytes(data, rawOutput.toByteArray());
-      }
-    }
-  }
-
-  /** Tests writeRawVarint32() and writeRawVarint64(). */
-  public void testWriteVarint() throws Exception {
-    assertWriteVarint(bytes(0x00), 0);
-    assertWriteVarint(bytes(0x01), 1);
-    assertWriteVarint(bytes(0x7f), 127);
-    // 14882
-    assertWriteVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));
-    // 2961488830
-    assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),
-      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
-      (0x0bL << 28));
-
-    // 64-bit
-    // 7256456126
-    assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),
-      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
-      (0x1bL << 28));
-    // 41256202580718336
-    assertWriteVarint(
-      bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),
-      (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
-      (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));
-    // 11964378330978735131
-    assertWriteVarint(
-      bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),
-      (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
-      (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |
-      (0x05L << 49) | (0x26L << 56) | (0x01L << 63));
-  }
-
-  /**
-   * Parses the given bytes using writeRawLittleEndian32() and checks
-   * that the result matches the given value.
-   */
-  private void assertWriteLittleEndian32(byte[] data, int value)
-                                         throws Exception {
-    ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-    output.writeRawLittleEndian32(value);
-    output.flush();
-    assertEqualBytes(data, rawOutput.toByteArray());
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-      rawOutput = new ByteArrayOutputStream();
-      output = CodedOutputStream.newInstance(rawOutput, blockSize);
-      output.writeRawLittleEndian32(value);
-      output.flush();
-      assertEqualBytes(data, rawOutput.toByteArray());
-    }
-  }
-
-  /**
-   * Parses the given bytes using writeRawLittleEndian64() and checks
-   * that the result matches the given value.
-   */
-  private void assertWriteLittleEndian64(byte[] data, long value)
-                                         throws Exception {
-    ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-    output.writeRawLittleEndian64(value);
-    output.flush();
-    assertEqualBytes(data, rawOutput.toByteArray());
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-      rawOutput = new ByteArrayOutputStream();
-      output = CodedOutputStream.newInstance(rawOutput, blockSize);
-      output.writeRawLittleEndian64(value);
-      output.flush();
-      assertEqualBytes(data, rawOutput.toByteArray());
-    }
-  }
-
-  /** Tests writeRawLittleEndian32() and writeRawLittleEndian64(). */
-  public void testWriteLittleEndian() throws Exception {
-    assertWriteLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);
-    assertWriteLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);
-
-    assertWriteLittleEndian64(
-      bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),
-      0x123456789abcdef0L);
-    assertWriteLittleEndian64(
-      bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a),
-      0x9abcdef012345678L);
-  }
-
-  /** Test encodeZigZag32() and encodeZigZag64(). */
-  public void testEncodeZigZag() throws Exception {
-    assertEquals(0, CodedOutputStream.encodeZigZag32( 0));
-    assertEquals(1, CodedOutputStream.encodeZigZag32(-1));
-    assertEquals(2, CodedOutputStream.encodeZigZag32( 1));
-    assertEquals(3, CodedOutputStream.encodeZigZag32(-2));
-    assertEquals(0x7FFFFFFE, CodedOutputStream.encodeZigZag32(0x3FFFFFFF));
-    assertEquals(0x7FFFFFFF, CodedOutputStream.encodeZigZag32(0xC0000000));
-    assertEquals(0xFFFFFFFE, CodedOutputStream.encodeZigZag32(0x7FFFFFFF));
-    assertEquals(0xFFFFFFFF, CodedOutputStream.encodeZigZag32(0x80000000));
-
-    assertEquals(0, CodedOutputStream.encodeZigZag64( 0));
-    assertEquals(1, CodedOutputStream.encodeZigZag64(-1));
-    assertEquals(2, CodedOutputStream.encodeZigZag64( 1));
-    assertEquals(3, CodedOutputStream.encodeZigZag64(-2));
-    assertEquals(0x000000007FFFFFFEL,
-                 CodedOutputStream.encodeZigZag64(0x000000003FFFFFFFL));
-    assertEquals(0x000000007FFFFFFFL,
-                 CodedOutputStream.encodeZigZag64(0xFFFFFFFFC0000000L));
-    assertEquals(0x00000000FFFFFFFEL,
-                 CodedOutputStream.encodeZigZag64(0x000000007FFFFFFFL));
-    assertEquals(0x00000000FFFFFFFFL,
-                 CodedOutputStream.encodeZigZag64(0xFFFFFFFF80000000L));
-    assertEquals(0xFFFFFFFFFFFFFFFEL,
-                 CodedOutputStream.encodeZigZag64(0x7FFFFFFFFFFFFFFFL));
-    assertEquals(0xFFFFFFFFFFFFFFFFL,
-                 CodedOutputStream.encodeZigZag64(0x8000000000000000L));
-
-    // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)
-    // were chosen semi-randomly via keyboard bashing.
-    assertEquals(0,
-      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(0)));
-    assertEquals(1,
-      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(1)));
-    assertEquals(-1,
-      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-1)));
-    assertEquals(14927,
-      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(14927)));
-    assertEquals(-3612,
-      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-3612)));
-
-    assertEquals(0,
-      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(0)));
-    assertEquals(1,
-      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(1)));
-    assertEquals(-1,
-      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-1)));
-    assertEquals(14927,
-      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(14927)));
-    assertEquals(-3612,
-      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-3612)));
-
-    assertEquals(856912304801416L,
-      CodedOutputStream.encodeZigZag64(
-        CodedInputStream.decodeZigZag64(
-          856912304801416L)));
-    assertEquals(-75123905439571256L,
-      CodedOutputStream.encodeZigZag64(
-        CodedInputStream.decodeZigZag64(
-          -75123905439571256L)));
-  }
-
-  /** Tests writing a whole message with every field type. */
-  public void testWriteWholeMessage() throws Exception {
-    TestAllTypes message = TestUtil.getAllSet();
-
-    byte[] rawBytes = message.toByteArray();
-    assertEqualBytes(TestUtil.getGoldenMessage().toByteArray(), rawBytes);
-
-    // Try different block sizes.
-    for (int blockSize = 1; blockSize < 256; blockSize *= 2) {
-      ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-      CodedOutputStream output =
-        CodedOutputStream.newInstance(rawOutput, blockSize);
-      message.writeTo(output);
-      output.flush();
-      assertEqualBytes(rawBytes, rawOutput.toByteArray());
-    }
-  }
-
-  /** Tests writing a whole message with every packed field type. Ensures the
-   * wire format of packed fields is compatible with C++. */
-  public void testWriteWholePackedFieldsMessage() throws Exception {
-    TestPackedTypes message = TestUtil.getPackedSet();
-
-    byte[] rawBytes = message.toByteArray();
-    assertEqualBytes(TestUtil.getGoldenPackedFieldsMessage().toByteArray(),
-                     rawBytes);
-  }
-
-  /** Test writing a message containing a negative enum value. This used to
-   * fail because the size was not properly computed as a sign-extended varint.
-   */
-  public void testWriteMessageWithNegativeEnumValue() throws Exception {
-    SparseEnumMessage message = SparseEnumMessage.newBuilder()
-        .setSparseEnum(TestSparseEnum.SPARSE_E) .build();
-    assertTrue(message.getSparseEnum().getNumber() < 0);
-    byte[] rawBytes = message.toByteArray();
-    SparseEnumMessage message2 = SparseEnumMessage.parseFrom(rawBytes);
-    assertEquals(TestSparseEnum.SPARSE_E, message2.getSparseEnum());
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DeprecatedFieldTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DeprecatedFieldTest.java
deleted file mode 100644
index ee4e767..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DeprecatedFieldTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto.TestDeprecatedFields;
-
-import junit.framework.TestCase;
-
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-/**
- * Test field deprecation
- * 
- * @author birdo@google.com (Roberto Scaramuzzi)
- */
-public class DeprecatedFieldTest extends TestCase {
-  private String[] deprecatedGetterNames = {
-      "hasDeprecatedInt32",
-      "getDeprecatedInt32"};
-  
-  private String[] deprecatedBuilderGetterNames = {
-      "hasDeprecatedInt32",
-      "getDeprecatedInt32",
-      "clearDeprecatedInt32"};
-  
-  private String[] deprecatedBuilderSetterNames = {
-      "setDeprecatedInt32"}; 
-  
-  public void testDeprecatedField() throws Exception {
-    Class<?> deprecatedFields = TestDeprecatedFields.class;
-    Class<?> deprecatedFieldsBuilder = TestDeprecatedFields.Builder.class;
-    for (String name : deprecatedGetterNames) {
-      Method method = deprecatedFields.getMethod(name);
-      assertTrue("Method " + name + " should be deprecated",
-          isDeprecated(method));
-    }
-    for (String name : deprecatedBuilderGetterNames) {
-      Method method = deprecatedFieldsBuilder.getMethod(name);
-      assertTrue("Method " + name + " should be deprecated",
-          isDeprecated(method));
-    }
-    for (String name : deprecatedBuilderSetterNames) {
-      Method method = deprecatedFieldsBuilder.getMethod(name, int.class);
-      assertTrue("Method " + name + " should be deprecated",
-          isDeprecated(method));
-    }
-  }
-  
-  private boolean isDeprecated(AnnotatedElement annotated) {
-    return annotated.isAnnotationPresent(Deprecated.class);
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DescriptorsTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DescriptorsTest.java
deleted file mode 100644
index aabd7b4..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DescriptorsTest.java
+++ /dev/null
@@ -1,649 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import com.google.protobuf.DescriptorProtos.DescriptorProto;
-import com.google.protobuf.DescriptorProtos.EnumDescriptorProto;
-import com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto;
-import com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
-import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
-import com.google.protobuf.Descriptors.DescriptorValidationException;
-import com.google.protobuf.Descriptors.FileDescriptor;
-import com.google.protobuf.Descriptors.Descriptor;
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import com.google.protobuf.Descriptors.EnumDescriptor;
-import com.google.protobuf.Descriptors.EnumValueDescriptor;
-import com.google.protobuf.Descriptors.ServiceDescriptor;
-import com.google.protobuf.Descriptors.MethodDescriptor;
-
-import com.google.protobuf.test.UnittestImport;
-import com.google.protobuf.test.UnittestImport.ImportEnum;
-import com.google.protobuf.test.UnittestImport.ImportMessage;
-import protobuf_unittest.UnittestProto;
-import protobuf_unittest.UnittestProto.ForeignEnum;
-import protobuf_unittest.UnittestProto.ForeignMessage;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
-import protobuf_unittest.UnittestProto.TestRequired;
-import protobuf_unittest.UnittestProto.TestService;
-import protobuf_unittest.UnittestCustomOptions;
-
-
-import junit.framework.TestCase;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Unit test for {@link Descriptors}.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class DescriptorsTest extends TestCase {
-
-  // Regression test for bug where referencing a FieldDescriptor.Type value
-  // before a FieldDescriptorProto.Type value would yield a
-  // ExceptionInInitializerError.
-  @SuppressWarnings("unused")
-  private static final Object STATIC_INIT_TEST = FieldDescriptor.Type.BOOL;
-
-  public void testFieldTypeEnumMapping() throws Exception {
-    assertEquals(FieldDescriptor.Type.values().length,
-        FieldDescriptorProto.Type.values().length);
-    for (FieldDescriptor.Type type : FieldDescriptor.Type.values()) {
-      FieldDescriptorProto.Type protoType = type.toProto();
-      assertEquals("TYPE_" + type.name(), protoType.name());
-      assertEquals(type, FieldDescriptor.Type.valueOf(protoType));
-    }
-  }
-
-  public void testFileDescriptor() throws Exception {
-    FileDescriptor file = UnittestProto.getDescriptor();
-
-    assertEquals("google/protobuf/unittest.proto", file.getName());
-    assertEquals("protobuf_unittest", file.getPackage());
-
-    assertEquals("UnittestProto", file.getOptions().getJavaOuterClassname());
-    assertEquals("google/protobuf/unittest.proto",
-                 file.toProto().getName());
-
-    assertEquals(Arrays.asList(UnittestImport.getDescriptor()),
-                 file.getDependencies());
-
-    Descriptor messageType = TestAllTypes.getDescriptor();
-    assertEquals(messageType, file.getMessageTypes().get(0));
-    assertEquals(messageType, file.findMessageTypeByName("TestAllTypes"));
-    assertNull(file.findMessageTypeByName("NoSuchType"));
-    assertNull(file.findMessageTypeByName("protobuf_unittest.TestAllTypes"));
-    for (int i = 0; i < file.getMessageTypes().size(); i++) {
-      assertEquals(i, file.getMessageTypes().get(i).getIndex());
-    }
-
-    EnumDescriptor enumType = ForeignEnum.getDescriptor();
-    assertEquals(enumType, file.getEnumTypes().get(0));
-    assertEquals(enumType, file.findEnumTypeByName("ForeignEnum"));
-    assertNull(file.findEnumTypeByName("NoSuchType"));
-    assertNull(file.findEnumTypeByName("protobuf_unittest.ForeignEnum"));
-    assertEquals(Arrays.asList(ImportEnum.getDescriptor()),
-                 UnittestImport.getDescriptor().getEnumTypes());
-    for (int i = 0; i < file.getEnumTypes().size(); i++) {
-      assertEquals(i, file.getEnumTypes().get(i).getIndex());
-    }
-
-    ServiceDescriptor service = TestService.getDescriptor();
-    assertEquals(service, file.getServices().get(0));
-    assertEquals(service, file.findServiceByName("TestService"));
-    assertNull(file.findServiceByName("NoSuchType"));
-    assertNull(file.findServiceByName("protobuf_unittest.TestService"));
-    assertEquals(Collections.emptyList(),
-                 UnittestImport.getDescriptor().getServices());
-    for (int i = 0; i < file.getServices().size(); i++) {
-      assertEquals(i, file.getServices().get(i).getIndex());
-    }
-
-    FieldDescriptor extension =
-      UnittestProto.optionalInt32Extension.getDescriptor();
-    assertEquals(extension, file.getExtensions().get(0));
-    assertEquals(extension,
-                 file.findExtensionByName("optional_int32_extension"));
-    assertNull(file.findExtensionByName("no_such_ext"));
-    assertNull(file.findExtensionByName(
-      "protobuf_unittest.optional_int32_extension"));
-    assertEquals(Collections.emptyList(),
-                 UnittestImport.getDescriptor().getExtensions());
-    for (int i = 0; i < file.getExtensions().size(); i++) {
-      assertEquals(i, file.getExtensions().get(i).getIndex());
-    }
-  }
-
-  public void testDescriptor() throws Exception {
-    Descriptor messageType = TestAllTypes.getDescriptor();
-    Descriptor nestedType = TestAllTypes.NestedMessage.getDescriptor();
-
-    assertEquals("TestAllTypes", messageType.getName());
-    assertEquals("protobuf_unittest.TestAllTypes", messageType.getFullName());
-    assertEquals(UnittestProto.getDescriptor(), messageType.getFile());
-    assertNull(messageType.getContainingType());
-    assertEquals(DescriptorProtos.MessageOptions.getDefaultInstance(),
-                 messageType.getOptions());
-    assertEquals("TestAllTypes", messageType.toProto().getName());
-
-    assertEquals("NestedMessage", nestedType.getName());
-    assertEquals("protobuf_unittest.TestAllTypes.NestedMessage",
-                 nestedType.getFullName());
-    assertEquals(UnittestProto.getDescriptor(), nestedType.getFile());
-    assertEquals(messageType, nestedType.getContainingType());
-
-    FieldDescriptor field = messageType.getFields().get(0);
-    assertEquals("optional_int32", field.getName());
-    assertEquals(field, messageType.findFieldByName("optional_int32"));
-    assertNull(messageType.findFieldByName("no_such_field"));
-    assertEquals(field, messageType.findFieldByNumber(1));
-    assertNull(messageType.findFieldByNumber(571283));
-    for (int i = 0; i < messageType.getFields().size(); i++) {
-      assertEquals(i, messageType.getFields().get(i).getIndex());
-    }
-
-    assertEquals(nestedType, messageType.getNestedTypes().get(0));
-    assertEquals(nestedType, messageType.findNestedTypeByName("NestedMessage"));
-    assertNull(messageType.findNestedTypeByName("NoSuchType"));
-    for (int i = 0; i < messageType.getNestedTypes().size(); i++) {
-      assertEquals(i, messageType.getNestedTypes().get(i).getIndex());
-    }
-
-    EnumDescriptor enumType = TestAllTypes.NestedEnum.getDescriptor();
-    assertEquals(enumType, messageType.getEnumTypes().get(0));
-    assertEquals(enumType, messageType.findEnumTypeByName("NestedEnum"));
-    assertNull(messageType.findEnumTypeByName("NoSuchType"));
-    for (int i = 0; i < messageType.getEnumTypes().size(); i++) {
-      assertEquals(i, messageType.getEnumTypes().get(i).getIndex());
-    }
-  }
-
-  public void testFieldDescriptor() throws Exception {
-    Descriptor messageType = TestAllTypes.getDescriptor();
-    FieldDescriptor primitiveField =
-      messageType.findFieldByName("optional_int32");
-    FieldDescriptor enumField =
-      messageType.findFieldByName("optional_nested_enum");
-    FieldDescriptor messageField =
-      messageType.findFieldByName("optional_foreign_message");
-    FieldDescriptor cordField =
-      messageType.findFieldByName("optional_cord");
-    FieldDescriptor extension =
-      UnittestProto.optionalInt32Extension.getDescriptor();
-    FieldDescriptor nestedExtension = TestRequired.single.getDescriptor();
-
-    assertEquals("optional_int32", primitiveField.getName());
-    assertEquals("protobuf_unittest.TestAllTypes.optional_int32",
-                 primitiveField.getFullName());
-    assertEquals(1, primitiveField.getNumber());
-    assertEquals(messageType, primitiveField.getContainingType());
-    assertEquals(UnittestProto.getDescriptor(), primitiveField.getFile());
-    assertEquals(FieldDescriptor.Type.INT32, primitiveField.getType());
-    assertEquals(FieldDescriptor.JavaType.INT, primitiveField.getJavaType());
-    assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(),
-                 primitiveField.getOptions());
-    assertFalse(primitiveField.isExtension());
-    assertEquals("optional_int32", primitiveField.toProto().getName());
-
-    assertEquals("optional_nested_enum", enumField.getName());
-    assertEquals(FieldDescriptor.Type.ENUM, enumField.getType());
-    assertEquals(FieldDescriptor.JavaType.ENUM, enumField.getJavaType());
-    assertEquals(TestAllTypes.NestedEnum.getDescriptor(),
-                 enumField.getEnumType());
-
-    assertEquals("optional_foreign_message", messageField.getName());
-    assertEquals(FieldDescriptor.Type.MESSAGE, messageField.getType());
-    assertEquals(FieldDescriptor.JavaType.MESSAGE, messageField.getJavaType());
-    assertEquals(ForeignMessage.getDescriptor(), messageField.getMessageType());
-
-    assertEquals("optional_cord", cordField.getName());
-    assertEquals(FieldDescriptor.Type.STRING, cordField.getType());
-    assertEquals(FieldDescriptor.JavaType.STRING, cordField.getJavaType());
-    assertEquals(DescriptorProtos.FieldOptions.CType.CORD,
-                 cordField.getOptions().getCtype());
-
-    assertEquals("optional_int32_extension", extension.getName());
-    assertEquals("protobuf_unittest.optional_int32_extension",
-                 extension.getFullName());
-    assertEquals(1, extension.getNumber());
-    assertEquals(TestAllExtensions.getDescriptor(),
-                 extension.getContainingType());
-    assertEquals(UnittestProto.getDescriptor(), extension.getFile());
-    assertEquals(FieldDescriptor.Type.INT32, extension.getType());
-    assertEquals(FieldDescriptor.JavaType.INT, extension.getJavaType());
-    assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(),
-                 extension.getOptions());
-    assertTrue(extension.isExtension());
-    assertEquals(null, extension.getExtensionScope());
-    assertEquals("optional_int32_extension", extension.toProto().getName());
-
-    assertEquals("single", nestedExtension.getName());
-    assertEquals("protobuf_unittest.TestRequired.single",
-                 nestedExtension.getFullName());
-    assertEquals(TestRequired.getDescriptor(),
-                 nestedExtension.getExtensionScope());
-  }
-
-  public void testFieldDescriptorLabel() throws Exception {
-    FieldDescriptor requiredField =
-      TestRequired.getDescriptor().findFieldByName("a");
-    FieldDescriptor optionalField =
-      TestAllTypes.getDescriptor().findFieldByName("optional_int32");
-    FieldDescriptor repeatedField =
-      TestAllTypes.getDescriptor().findFieldByName("repeated_int32");
-
-    assertTrue(requiredField.isRequired());
-    assertFalse(requiredField.isRepeated());
-    assertFalse(optionalField.isRequired());
-    assertFalse(optionalField.isRepeated());
-    assertFalse(repeatedField.isRequired());
-    assertTrue(repeatedField.isRepeated());
-  }
-
-  public void testFieldDescriptorDefault() throws Exception {
-    Descriptor d = TestAllTypes.getDescriptor();
-    assertFalse(d.findFieldByName("optional_int32").hasDefaultValue());
-    assertEquals(0, d.findFieldByName("optional_int32").getDefaultValue());
-    assertTrue(d.findFieldByName("default_int32").hasDefaultValue());
-    assertEquals(41, d.findFieldByName("default_int32").getDefaultValue());
-
-    d = TestExtremeDefaultValues.getDescriptor();
-    assertEquals(
-      ByteString.copyFrom(
-        "\0\001\007\b\f\n\r\t\013\\\'\"\u00fe".getBytes("ISO-8859-1")),
-      d.findFieldByName("escaped_bytes").getDefaultValue());
-    assertEquals(-1, d.findFieldByName("large_uint32").getDefaultValue());
-    assertEquals(-1L, d.findFieldByName("large_uint64").getDefaultValue());
-  }
-
-  public void testEnumDescriptor() throws Exception {
-    EnumDescriptor enumType = ForeignEnum.getDescriptor();
-    EnumDescriptor nestedType = TestAllTypes.NestedEnum.getDescriptor();
-
-    assertEquals("ForeignEnum", enumType.getName());
-    assertEquals("protobuf_unittest.ForeignEnum", enumType.getFullName());
-    assertEquals(UnittestProto.getDescriptor(), enumType.getFile());
-    assertNull(enumType.getContainingType());
-    assertEquals(DescriptorProtos.EnumOptions.getDefaultInstance(),
-                 enumType.getOptions());
-
-    assertEquals("NestedEnum", nestedType.getName());
-    assertEquals("protobuf_unittest.TestAllTypes.NestedEnum",
-                 nestedType.getFullName());
-    assertEquals(UnittestProto.getDescriptor(), nestedType.getFile());
-    assertEquals(TestAllTypes.getDescriptor(), nestedType.getContainingType());
-
-    EnumValueDescriptor value = ForeignEnum.FOREIGN_FOO.getValueDescriptor();
-    assertEquals(value, enumType.getValues().get(0));
-    assertEquals("FOREIGN_FOO", value.getName());
-    assertEquals(4, value.getNumber());
-    assertEquals(value, enumType.findValueByName("FOREIGN_FOO"));
-    assertEquals(value, enumType.findValueByNumber(4));
-    assertNull(enumType.findValueByName("NO_SUCH_VALUE"));
-    for (int i = 0; i < enumType.getValues().size(); i++) {
-      assertEquals(i, enumType.getValues().get(i).getIndex());
-    }
-  }
-
-  public void testServiceDescriptor() throws Exception {
-    ServiceDescriptor service = TestService.getDescriptor();
-
-    assertEquals("TestService", service.getName());
-    assertEquals("protobuf_unittest.TestService", service.getFullName());
-    assertEquals(UnittestProto.getDescriptor(), service.getFile());
-
-    assertEquals(2, service.getMethods().size());
-
-    MethodDescriptor fooMethod = service.getMethods().get(0);
-    assertEquals("Foo", fooMethod.getName());
-    assertEquals(UnittestProto.FooRequest.getDescriptor(),
-                 fooMethod.getInputType());
-    assertEquals(UnittestProto.FooResponse.getDescriptor(),
-                 fooMethod.getOutputType());
-    assertEquals(fooMethod, service.findMethodByName("Foo"));
-
-    MethodDescriptor barMethod = service.getMethods().get(1);
-    assertEquals("Bar", barMethod.getName());
-    assertEquals(UnittestProto.BarRequest.getDescriptor(),
-                 barMethod.getInputType());
-    assertEquals(UnittestProto.BarResponse.getDescriptor(),
-                 barMethod.getOutputType());
-    assertEquals(barMethod, service.findMethodByName("Bar"));
-
-    assertNull(service.findMethodByName("NoSuchMethod"));
-
-    for (int i = 0; i < service.getMethods().size(); i++) {
-      assertEquals(i, service.getMethods().get(i).getIndex());
-    }
-  }
-
-
-  public void testCustomOptions() throws Exception {
-    Descriptor descriptor =
-      UnittestCustomOptions.TestMessageWithCustomOptions.getDescriptor();
-
-    assertTrue(
-      descriptor.getOptions().hasExtension(UnittestCustomOptions.messageOpt1));
-    assertEquals(Integer.valueOf(-56),
-      descriptor.getOptions().getExtension(UnittestCustomOptions.messageOpt1));
-
-    FieldDescriptor field = descriptor.findFieldByName("field1");
-    assertNotNull(field);
-
-    assertTrue(
-      field.getOptions().hasExtension(UnittestCustomOptions.fieldOpt1));
-    assertEquals(Long.valueOf(8765432109L),
-      field.getOptions().getExtension(UnittestCustomOptions.fieldOpt1));
-
-    EnumDescriptor enumType =
-      UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor();
-
-    assertTrue(
-      enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1));
-    assertEquals(Integer.valueOf(-789),
-      enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1));
-
-    ServiceDescriptor service =
-      UnittestCustomOptions.TestServiceWithCustomOptions.getDescriptor();
-
-    assertTrue(
-      service.getOptions().hasExtension(UnittestCustomOptions.serviceOpt1));
-    assertEquals(Long.valueOf(-9876543210L),
-      service.getOptions().getExtension(UnittestCustomOptions.serviceOpt1));
-
-    MethodDescriptor method = service.findMethodByName("Foo");
-    assertNotNull(method);
-
-    assertTrue(
-      method.getOptions().hasExtension(UnittestCustomOptions.methodOpt1));
-    assertEquals(UnittestCustomOptions.MethodOpt1.METHODOPT1_VAL2,
-      method.getOptions().getExtension(UnittestCustomOptions.methodOpt1));
-  }
-
-  /**
-   * Test that the FieldDescriptor.Type enum is the same as the
-   * WireFormat.FieldType enum.
-   */
-  public void testFieldTypeTablesMatch() throws Exception {
-    FieldDescriptor.Type[] values1 = FieldDescriptor.Type.values();
-    WireFormat.FieldType[] values2 = WireFormat.FieldType.values();
-
-    assertEquals(values1.length, values2.length);
-
-    for (int i = 0; i < values1.length; i++) {
-      assertEquals(values1[i].toString(), values2[i].toString());
-    }
-  }
-
-  /**
-   * Test that the FieldDescriptor.JavaType enum is the same as the
-   * WireFormat.JavaType enum.
-   */
-  public void testJavaTypeTablesMatch() throws Exception {
-    FieldDescriptor.JavaType[] values1 = FieldDescriptor.JavaType.values();
-    WireFormat.JavaType[] values2 = WireFormat.JavaType.values();
-
-    assertEquals(values1.length, values2.length);
-
-    for (int i = 0; i < values1.length; i++) {
-      assertEquals(values1[i].toString(), values2[i].toString());
-    }
-  }
-
-  public void testEnormousDescriptor() throws Exception {
-    // The descriptor for this file is larger than 64k, yet it did not cause
-    // a compiler error due to an over-long string literal.
-    assertTrue(
-        UnittestEnormousDescriptor.getDescriptor()
-          .toProto().getSerializedSize() > 65536);
-  }
-
-  /**
-   * Tests that the DescriptorValidationException works as intended.
-   */
-  public void testDescriptorValidatorException() throws Exception {
-    FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder()
-      .setName("foo.proto")
-      .addMessageType(DescriptorProto.newBuilder()
-      .setName("Foo")
-        .addField(FieldDescriptorProto.newBuilder()
-          .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
-          .setType(FieldDescriptorProto.Type.TYPE_INT32)
-          .setName("foo")
-          .setNumber(1)
-          .setDefaultValue("invalid")
-          .build())
-        .build())
-      .build();
-    try {
-      Descriptors.FileDescriptor.buildFrom(fileDescriptorProto,
-          new FileDescriptor[0]);
-      fail("DescriptorValidationException expected");
-    } catch (DescriptorValidationException e) {
-      // Expected; check that the error message contains some useful hints
-      assertTrue(e.getMessage().indexOf("foo") != -1);
-      assertTrue(e.getMessage().indexOf("Foo") != -1);
-      assertTrue(e.getMessage().indexOf("invalid") != -1);
-      assertTrue(e.getCause() instanceof NumberFormatException);
-      assertTrue(e.getCause().getMessage().indexOf("invalid") != -1);
-    }
-  }
-
-  /**
-   * Tests the translate/crosslink for an example where a message field's name
-   * and type name are the same.
-   */
-  public void testDescriptorComplexCrosslink() throws Exception {
-    FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder()
-      .setName("foo.proto")
-      .addMessageType(DescriptorProto.newBuilder()
-        .setName("Foo")
-        .addField(FieldDescriptorProto.newBuilder()
-          .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
-          .setType(FieldDescriptorProto.Type.TYPE_INT32)
-          .setName("foo")
-          .setNumber(1)
-          .build())
-        .build())
-      .addMessageType(DescriptorProto.newBuilder()
-        .setName("Bar")
-        .addField(FieldDescriptorProto.newBuilder()
-          .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
-          .setTypeName("Foo")
-          .setName("Foo")
-          .setNumber(1)
-          .build())
-        .build())
-      .build();
-    // translate and crosslink
-    FileDescriptor file =
-      Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, 
-          new FileDescriptor[0]);
-    // verify resulting descriptors
-    assertNotNull(file);
-    List<Descriptor> msglist = file.getMessageTypes();
-    assertNotNull(msglist);
-    assertTrue(msglist.size() == 2);
-    boolean barFound = false;
-    for (Descriptor desc : msglist) {
-      if (desc.getName().equals("Bar")) {
-        barFound = true;
-        assertNotNull(desc.getFields());
-        List<FieldDescriptor> fieldlist = desc.getFields();
-        assertNotNull(fieldlist);
-        assertTrue(fieldlist.size() == 1);
-        assertTrue(fieldlist.get(0).getType() == FieldDescriptor.Type.MESSAGE);
-        assertTrue(fieldlist.get(0).getMessageType().getName().equals("Foo"));
-      }
-    }
-    assertTrue(barFound);
-  }
-  
-  public void testInvalidPublicDependency() throws Exception {
-    FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
-        .setName("foo.proto") .build();
-    FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
-        .setName("boo.proto")
-        .addDependency("foo.proto")
-        .addPublicDependency(1)  // Error, should be 0.
-        .build();
-    FileDescriptor fooFile = Descriptors.FileDescriptor.buildFrom(fooProto,
-        new FileDescriptor[0]);
-    try {
-      Descriptors.FileDescriptor.buildFrom(barProto,
-          new FileDescriptor[] {fooFile});
-      fail("DescriptorValidationException expected");
-    } catch (DescriptorValidationException e) {
-      assertTrue(
-          e.getMessage().indexOf("Invalid public dependency index.") != -1);
-    }
-  }
-
-  public void testHiddenDependency() throws Exception {
-    FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
-        .setName("bar.proto")
-        .addMessageType(DescriptorProto.newBuilder().setName("Bar"))
-        .build();
-    FileDescriptorProto forwardProto = FileDescriptorProto.newBuilder()
-        .setName("forward.proto")
-        .addDependency("bar.proto")
-        .build();
-    FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
-        .setName("foo.proto")
-        .addDependency("forward.proto")
-        .addMessageType(DescriptorProto.newBuilder()
-            .setName("Foo")
-            .addField(FieldDescriptorProto.newBuilder()
-                .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
-                .setTypeName("Bar")
-                .setName("bar")
-                .setNumber(1)))
-        .build();
-    FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(
-        barProto, new FileDescriptor[0]);
-    FileDescriptor forwardFile = Descriptors.FileDescriptor.buildFrom(
-        forwardProto, new FileDescriptor[] {barFile});
-
-    try {
-      Descriptors.FileDescriptor.buildFrom(
-          fooProto, new FileDescriptor[] {forwardFile});
-      fail("DescriptorValidationException expected");
-    } catch (DescriptorValidationException e) {
-      assertTrue(e.getMessage().indexOf("Bar") != -1);
-      assertTrue(e.getMessage().indexOf("is not defined") != -1);
-    }
-  }
-
-  public void testPublicDependency() throws Exception {
-    FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
-        .setName("bar.proto")
-        .addMessageType(DescriptorProto.newBuilder().setName("Bar"))
-        .build();
-    FileDescriptorProto forwardProto = FileDescriptorProto.newBuilder()
-        .setName("forward.proto")
-        .addDependency("bar.proto")
-        .addPublicDependency(0)
-        .build();
-    FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
-        .setName("foo.proto")
-        .addDependency("forward.proto")
-        .addMessageType(DescriptorProto.newBuilder()
-            .setName("Foo")
-            .addField(FieldDescriptorProto.newBuilder()
-                .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
-                .setTypeName("Bar")
-                .setName("bar")
-                .setNumber(1)))
-        .build();
-    FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(
-        barProto, new FileDescriptor[0]);
-    FileDescriptor forwardFile = Descriptors.FileDescriptor.buildFrom(
-        forwardProto, new FileDescriptor[]{barFile});
-    Descriptors.FileDescriptor.buildFrom(
-        fooProto, new FileDescriptor[] {forwardFile});
-  }
-  
-  /**
-   * Tests the translate/crosslink for an example with a more complex namespace
-   * referencing.
-   */
-  public void testComplexNamespacePublicDependency() throws Exception {
-    FileDescriptorProto fooProto = FileDescriptorProto.newBuilder()
-        .setName("bar.proto")
-        .setPackage("a.b.c.d.bar.shared")
-        .addEnumType(EnumDescriptorProto.newBuilder()
-            .setName("MyEnum")
-            .addValue(EnumValueDescriptorProto.newBuilder()
-                .setName("BLAH")
-                .setNumber(1)))
-        .build();
-    FileDescriptorProto barProto = FileDescriptorProto.newBuilder()
-        .setName("foo.proto")
-        .addDependency("bar.proto")
-        .setPackage("a.b.c.d.foo.shared")
-        .addMessageType(DescriptorProto.newBuilder()
-            .setName("MyMessage")
-            .addField(FieldDescriptorProto.newBuilder()
-                .setLabel(FieldDescriptorProto.Label.LABEL_REPEATED)
-                .setTypeName("bar.shared.MyEnum")
-                .setName("MyField")
-                .setNumber(1)))
-        .build();
-    // translate and crosslink
-    FileDescriptor fooFile = Descriptors.FileDescriptor.buildFrom(
-        fooProto, new FileDescriptor[0]);
-    FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(
-        barProto, new FileDescriptor[]{fooFile});
-    // verify resulting descriptors
-    assertNotNull(barFile);
-    List<Descriptor> msglist = barFile.getMessageTypes();
-    assertNotNull(msglist);
-    assertTrue(msglist.size() == 1);
-    Descriptor desc = msglist.get(0);
-    if (desc.getName().equals("MyMessage")) {
-      assertNotNull(desc.getFields());
-      List<FieldDescriptor> fieldlist = desc.getFields();
-      assertNotNull(fieldlist);
-      assertTrue(fieldlist.size() == 1);
-      FieldDescriptor field = fieldlist.get(0);
-      assertTrue(field.getType() == FieldDescriptor.Type.ENUM);
-      assertTrue(field.getEnumType().getName().equals("MyEnum"));
-      assertTrue(field.getEnumType().getFile().getName().equals("bar.proto"));
-      assertTrue(field.getEnumType().getFile().getPackage().equals(
-          "a.b.c.d.bar.shared"));
-    }   
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DynamicMessageTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DynamicMessageTest.java
deleted file mode 100644
index 0023067..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/DynamicMessageTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestEmptyMessage;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-
-import junit.framework.TestCase;
-import java.util.Arrays;
-
-/**
- * Unit test for {@link DynamicMessage}.  See also {@link MessageTest}, which
- * tests some {@link DynamicMessage} functionality.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class DynamicMessageTest extends TestCase {
-  TestUtil.ReflectionTester reflectionTester =
-    new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
-
-  TestUtil.ReflectionTester extensionsReflectionTester =
-    new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
-                                  TestUtil.getExtensionRegistry());
-  TestUtil.ReflectionTester packedReflectionTester =
-    new TestUtil.ReflectionTester(TestPackedTypes.getDescriptor(), null);
-
-  public void testDynamicMessageAccessors() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.setAllFieldsViaReflection(builder);
-    Message message = builder.build();
-    reflectionTester.assertAllFieldsSetViaReflection(message);
-  }
-
-  public void testSettersAfterBuild() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    Message firstMessage = builder.build();
-    // double build()
-    builder.build();
-    // clear() after build()
-    builder.clear();
-    // setters after build()
-    reflectionTester.setAllFieldsViaReflection(builder);
-    Message message = builder.build();
-    reflectionTester.assertAllFieldsSetViaReflection(message);
-    // repeated setters after build()
-    reflectionTester.modifyRepeatedFieldsViaReflection(builder);
-    message = builder.build();
-    reflectionTester.assertRepeatedFieldsModifiedViaReflection(message);
-    // firstMessage shouldn't have been modified.
-    reflectionTester.assertClearViaReflection(firstMessage);
-  }
-
-  public void testUnknownFields() throws Exception {
-    Message.Builder builder =
-        DynamicMessage.newBuilder(TestEmptyMessage.getDescriptor());
-    builder.setUnknownFields(UnknownFieldSet.newBuilder()
-        .addField(1, UnknownFieldSet.Field.newBuilder().addVarint(1).build())
-        .addField(2, UnknownFieldSet.Field.newBuilder().addFixed32(1).build())
-        .build());
-    Message message = builder.build();
-    assertEquals(2, message.getUnknownFields().asMap().size());
-    // clone() with unknown fields
-    Message.Builder newBuilder = builder.clone();
-    assertEquals(2, newBuilder.getUnknownFields().asMap().size());
-    // clear() with unknown fields
-    newBuilder.clear();
-    assertTrue(newBuilder.getUnknownFields().asMap().isEmpty());
-    // serialize/parse with unknown fields
-    newBuilder.mergeFrom(message.toByteString());
-    assertEquals(2, newBuilder.getUnknownFields().asMap().size());
-  }
-
-  public void testDynamicMessageSettersRejectNull() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.assertReflectionSettersRejectNull(builder);
-  }
-
-  public void testDynamicMessageExtensionAccessors() throws Exception {
-    // We don't need to extensively test DynamicMessage's handling of
-    // extensions because, frankly, it doesn't do anything special with them.
-    // It treats them just like any other fields.
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllExtensions.getDescriptor());
-    extensionsReflectionTester.setAllFieldsViaReflection(builder);
-    Message message = builder.build();
-    extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
-  }
-
-  public void testDynamicMessageExtensionSettersRejectNull() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllExtensions.getDescriptor());
-    extensionsReflectionTester.assertReflectionSettersRejectNull(builder);
-  }
-
-  public void testDynamicMessageRepeatedSetters() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.setAllFieldsViaReflection(builder);
-    reflectionTester.modifyRepeatedFieldsViaReflection(builder);
-    Message message = builder.build();
-    reflectionTester.assertRepeatedFieldsModifiedViaReflection(message);
-  }
-
-  public void testDynamicMessageRepeatedSettersRejectNull() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);
-  }
-
-  public void testDynamicMessageDefaults() throws Exception {
-    reflectionTester.assertClearViaReflection(
-      DynamicMessage.getDefaultInstance(TestAllTypes.getDescriptor()));
-    reflectionTester.assertClearViaReflection(
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor()).build());
-  }
-
-  public void testDynamicMessageSerializedSize() throws Exception {
-    TestAllTypes message = TestUtil.getAllSet();
-
-    Message.Builder dynamicBuilder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.setAllFieldsViaReflection(dynamicBuilder);
-    Message dynamicMessage = dynamicBuilder.build();
-
-    assertEquals(message.getSerializedSize(),
-                 dynamicMessage.getSerializedSize());
-  }
-
-  public void testDynamicMessageSerialization() throws Exception {
-    Message.Builder builder =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.setAllFieldsViaReflection(builder);
-    Message message = builder.build();
-
-    ByteString rawBytes = message.toByteString();
-    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
-
-    TestUtil.assertAllFieldsSet(message2);
-
-    // In fact, the serialized forms should be exactly the same, byte-for-byte.
-    assertEquals(TestUtil.getAllSet().toByteString(), rawBytes);
-  }
-
-  public void testDynamicMessageParsing() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    TestAllTypes message = builder.build();
-
-    ByteString rawBytes = message.toByteString();
-
-    Message message2 =
-      DynamicMessage.parseFrom(TestAllTypes.getDescriptor(), rawBytes);
-    reflectionTester.assertAllFieldsSetViaReflection(message2);
-
-    // Test Parser interface.
-    Message message3 = message2.getParserForType().parseFrom(rawBytes);
-    reflectionTester.assertAllFieldsSetViaReflection(message3);
-  }
-
-  public void testDynamicMessageExtensionParsing() throws Exception {
-    ByteString rawBytes = TestUtil.getAllExtensionsSet().toByteString();
-    Message message = DynamicMessage.parseFrom(
-        TestAllExtensions.getDescriptor(), rawBytes,
-        TestUtil.getExtensionRegistry());
-    extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
-
-    // Test Parser interface.
-    Message message2 = message.getParserForType().parseFrom(
-        rawBytes, TestUtil.getExtensionRegistry());
-    extensionsReflectionTester.assertAllFieldsSetViaReflection(message2);
-  }
-
-  public void testDynamicMessagePackedSerialization() throws Exception {
-    Message.Builder builder =
-        DynamicMessage.newBuilder(TestPackedTypes.getDescriptor());
-    packedReflectionTester.setPackedFieldsViaReflection(builder);
-    Message message = builder.build();
-
-    ByteString rawBytes = message.toByteString();
-    TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes);
-
-    TestUtil.assertPackedFieldsSet(message2);
-
-    // In fact, the serialized forms should be exactly the same, byte-for-byte.
-    assertEquals(TestUtil.getPackedSet().toByteString(), rawBytes);
-  }
-
-  public void testDynamicMessagePackedParsing() throws Exception {
-    TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
-    TestUtil.setPackedFields(builder);
-    TestPackedTypes message = builder.build();
-
-    ByteString rawBytes = message.toByteString();
-
-    Message message2 =
-      DynamicMessage.parseFrom(TestPackedTypes.getDescriptor(), rawBytes);
-    packedReflectionTester.assertPackedFieldsSetViaReflection(message2);
-
-    // Test Parser interface.
-    Message message3 = message2.getParserForType().parseFrom(rawBytes);
-    packedReflectionTester.assertPackedFieldsSetViaReflection(message3);
-  }
-
-  public void testDynamicMessageCopy() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    TestAllTypes message = builder.build();
-
-    DynamicMessage copy = DynamicMessage.newBuilder(message).build();
-    reflectionTester.assertAllFieldsSetViaReflection(copy);
-  }
-
-  public void testToBuilder() throws Exception {
-    DynamicMessage.Builder builder =
-        DynamicMessage.newBuilder(TestAllTypes.getDescriptor());
-    reflectionTester.setAllFieldsViaReflection(builder);
-    int unknownFieldNum = 9;
-    long unknownFieldVal = 90;
-    builder.setUnknownFields(UnknownFieldSet.newBuilder()
-        .addField(unknownFieldNum,
-            UnknownFieldSet.Field.newBuilder()
-                .addVarint(unknownFieldVal).build())
-        .build());
-    DynamicMessage message = builder.build();
-
-    DynamicMessage derived = message.toBuilder().build();
-    reflectionTester.assertAllFieldsSetViaReflection(derived);
-    assertEquals(Arrays.asList(unknownFieldVal),
-        derived.getUnknownFields().getField(unknownFieldNum).getVarintList());
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ForceFieldBuildersPreRun.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ForceFieldBuildersPreRun.java
deleted file mode 100644
index 6a39500..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ForceFieldBuildersPreRun.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-/**
- * A prerun for a test suite that allows running the full protocol buffer
- * tests in a mode that disables the optimization for not using
- * {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder} until they are
- * requested. This allows us to run all the tests through both code paths
- * and ensures that both code paths produce identical results.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class ForceFieldBuildersPreRun implements Runnable {
-
-  //@Override (Java 1.6 override semantics, but we must support 1.5)
-  public void run() {
-    // GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/GeneratedMessageTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/GeneratedMessageTest.java
deleted file mode 100644
index 49f1146..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/GeneratedMessageTest.java
+++ /dev/null
@@ -1,961 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import com.google.protobuf.Descriptors.Descriptor;
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import com.google.protobuf.test.UnittestImport;
-import protobuf_unittest.EnumWithNoOuter;
-import protobuf_unittest.MessageWithNoOuter;
-import protobuf_unittest.MultipleFilesTestProto;
-import protobuf_unittest.NestedExtension.MyNestedExtension;
-import protobuf_unittest.NonNestedExtension;
-import protobuf_unittest.NonNestedExtension.MessageToBeExtended;
-import protobuf_unittest.NonNestedExtension.MyNonNestedExtension;
-import protobuf_unittest.ServiceWithNoOuter;
-import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
-import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize;
-import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;
-import protobuf_unittest.UnittestProto;
-import protobuf_unittest.UnittestProto.ForeignEnum;
-import protobuf_unittest.UnittestProto.ForeignMessage;
-import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;
-import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
-import protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-import protobuf_unittest.UnittestProto.TestUnpackedTypes;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Unit test for generated messages and generated code.  See also
- * {@link MessageTest}, which tests some generated message functionality.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class GeneratedMessageTest extends TestCase {
-  TestUtil.ReflectionTester reflectionTester =
-    new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
-
-  public void testDefaultInstance() throws Exception {
-    assertSame(TestAllTypes.getDefaultInstance(),
-               TestAllTypes.getDefaultInstance().getDefaultInstanceForType());
-    assertSame(TestAllTypes.getDefaultInstance(),
-               TestAllTypes.newBuilder().getDefaultInstanceForType());
-  }
-
-  public void testMessageOrBuilder() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    TestAllTypes message = builder.build();
-    TestUtil.assertAllFieldsSet(message);
-  }
-
-  public void testUsingBuilderMultipleTimes() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    // primitive field scalar and repeated
-    builder.setOptionalSfixed64(100);
-    builder.addRepeatedInt32(100);
-    // enum field scalar and repeated
-    builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
-    builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
-    // proto field scalar and repeated
-    builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(1));
-    builder.addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(1));
-
-    TestAllTypes value1 = builder.build();
-
-    assertEquals(100, value1.getOptionalSfixed64());
-    assertEquals(100, value1.getRepeatedInt32(0));
-    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
-        value1.getOptionalImportEnum());
-    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
-        value1.getRepeatedImportEnum(0));
-    assertEquals(1, value1.getOptionalForeignMessage().getC());
-    assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
-
-    // Make sure that builder didn't update previously created values
-    builder.setOptionalSfixed64(200);
-    builder.setRepeatedInt32(0, 200);
-    builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO);
-    builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO);
-    builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2));
-    builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2));
-
-    TestAllTypes value2 = builder.build();
-
-    // Make sure value1 didn't change.
-    assertEquals(100, value1.getOptionalSfixed64());
-    assertEquals(100, value1.getRepeatedInt32(0));
-    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
-        value1.getOptionalImportEnum());
-    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
-        value1.getRepeatedImportEnum(0));
-    assertEquals(1, value1.getOptionalForeignMessage().getC());
-    assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
-
-    // Make sure value2 is correct
-    assertEquals(200, value2.getOptionalSfixed64());
-    assertEquals(200, value2.getRepeatedInt32(0));
-    assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
-        value2.getOptionalImportEnum());
-    assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
-        value2.getRepeatedImportEnum(0));
-    assertEquals(2, value2.getOptionalForeignMessage().getC());
-    assertEquals(2, value2.getRepeatedForeignMessage(0).getC());
-  }
-
-  public void testRepeatedArraysAreImmutable() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    builder.addRepeatedInt32(100);
-    builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
-    builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
-    assertIsUnmodifiable(builder.getRepeatedInt32List());
-    assertIsUnmodifiable(builder.getRepeatedImportEnumList());
-    assertIsUnmodifiable(builder.getRepeatedForeignMessageList());
-    assertIsUnmodifiable(builder.getRepeatedFloatList());
-
-
-    TestAllTypes value = builder.build();
-    assertIsUnmodifiable(value.getRepeatedInt32List());
-    assertIsUnmodifiable(value.getRepeatedImportEnumList());
-    assertIsUnmodifiable(value.getRepeatedForeignMessageList());
-    assertIsUnmodifiable(value.getRepeatedFloatList());
-  }
-
-  public void testParsedMessagesAreImmutable() throws Exception {
-    TestAllTypes value = TestAllTypes.PARSER.parseFrom(
-        TestUtil.getAllSet().toByteString());
-    assertIsUnmodifiable(value.getRepeatedInt32List());
-    assertIsUnmodifiable(value.getRepeatedInt64List());
-    assertIsUnmodifiable(value.getRepeatedUint32List());
-    assertIsUnmodifiable(value.getRepeatedUint64List());
-    assertIsUnmodifiable(value.getRepeatedSint32List());
-    assertIsUnmodifiable(value.getRepeatedSint64List());
-    assertIsUnmodifiable(value.getRepeatedFixed32List());
-    assertIsUnmodifiable(value.getRepeatedFixed64List());
-    assertIsUnmodifiable(value.getRepeatedSfixed32List());
-    assertIsUnmodifiable(value.getRepeatedSfixed64List());
-    assertIsUnmodifiable(value.getRepeatedFloatList());
-    assertIsUnmodifiable(value.getRepeatedDoubleList());
-    assertIsUnmodifiable(value.getRepeatedBoolList());
-    assertIsUnmodifiable(value.getRepeatedStringList());
-    assertIsUnmodifiable(value.getRepeatedBytesList());
-    assertIsUnmodifiable(value.getRepeatedGroupList());
-    assertIsUnmodifiable(value.getRepeatedNestedMessageList());
-    assertIsUnmodifiable(value.getRepeatedForeignMessageList());
-    assertIsUnmodifiable(value.getRepeatedImportMessageList());
-    assertIsUnmodifiable(value.getRepeatedNestedEnumList());
-    assertIsUnmodifiable(value.getRepeatedForeignEnumList());
-    assertIsUnmodifiable(value.getRepeatedImportEnumList());
-  }
-
-  private void assertIsUnmodifiable(List<?> list) {
-    if (list == Collections.emptyList()) {
-      // OKAY -- Need to check this b/c EmptyList allows you to call clear.
-    } else {
-      try {
-        list.clear();
-        fail("List wasn't immutable");
-      } catch (UnsupportedOperationException e) {
-        // good
-      }
-    }
-  }
-
-  public void testSettersRejectNull() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    try {
-      builder.setOptionalString(null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.setOptionalBytes(null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.setOptionalNestedMessage(
-          (TestAllTypes.NestedMessage.Builder) null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.setOptionalNestedEnum(null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.addRepeatedString(null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.addRepeatedBytes(null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.addRepeatedNestedMessage(
-          (TestAllTypes.NestedMessage.Builder) null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.addRepeatedNestedEnum(null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-  }
-
-  public void testRepeatedSetters() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    TestUtil.modifyRepeatedFields(builder);
-    TestAllTypes message = builder.build();
-    TestUtil.assertRepeatedFieldsModified(message);
-  }
-
-  public void testRepeatedSettersRejectNull() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-
-    builder.addRepeatedString("one");
-    builder.addRepeatedString("two");
-    try {
-      builder.setRepeatedString(1, null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-
-    builder.addRepeatedBytes(TestUtil.toBytes("one"));
-    builder.addRepeatedBytes(TestUtil.toBytes("two"));
-    try {
-      builder.setRepeatedBytes(1, null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-
-    builder.addRepeatedNestedMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
-    builder.addRepeatedNestedMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(456).build());
-    try {
-      builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.setRepeatedNestedMessage(
-          1, (TestAllTypes.NestedMessage.Builder) null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-
-    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO);
-    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
-    try {
-      builder.setRepeatedNestedEnum(1, null);
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-  }
-
-  public void testRepeatedAppend() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-
-    builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4));
-    builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ));
-
-    ForeignMessage foreignMessage =
-        ForeignMessage.newBuilder().setC(12).build();
-    builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage));
-
-    TestAllTypes message = builder.build();
-    assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4));
-    assertEquals(message.getRepeatedForeignEnumList(),
-        Arrays.asList(ForeignEnum.FOREIGN_BAZ));
-    assertEquals(1, message.getRepeatedForeignMessageCount());
-    assertEquals(12, message.getRepeatedForeignMessage(0).getC());
-  }
-
-  public void testRepeatedAppendRejectsNull() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-
-    ForeignMessage foreignMessage =
-        ForeignMessage.newBuilder().setC(12).build();
-    try {
-      builder.addAllRepeatedForeignMessage(
-          Arrays.asList(foreignMessage, (ForeignMessage) null));
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-
-    try {
-      builder.addAllRepeatedForeignEnum(
-          Arrays.asList(ForeignEnum.FOREIGN_BAZ, null));
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-
-    try {
-      builder.addAllRepeatedString(Arrays.asList("one", null));
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-
-    try {
-      builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null));
-      fail("Exception was not thrown");
-    } catch (NullPointerException e) {
-      // We expect this exception.
-    }
-  }
-
-  public void testSettingForeignMessageUsingBuilder() throws Exception {
-    TestAllTypes message = TestAllTypes.newBuilder()
-        // Pass builder for foreign message instance.
-        .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123))
-        .build();
-    TestAllTypes expectedMessage = TestAllTypes.newBuilder()
-        // Create expected version passing foreign message instance explicitly.
-        .setOptionalForeignMessage(
-            ForeignMessage.newBuilder().setC(123).build())
-        .build();
-    // TODO(ngd): Upgrade to using real #equals method once implemented
-    assertEquals(expectedMessage.toString(), message.toString());
-  }
-
-  public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception {
-    TestAllTypes message = TestAllTypes.newBuilder()
-        // Pass builder for foreign message instance.
-        .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456))
-        .build();
-    TestAllTypes expectedMessage = TestAllTypes.newBuilder()
-        // Create expected version passing foreign message instance explicitly.
-        .addRepeatedForeignMessage(
-            ForeignMessage.newBuilder().setC(456).build())
-        .build();
-    assertEquals(expectedMessage.toString(), message.toString());
-  }
-
-  public void testDefaults() throws Exception {
-    TestUtil.assertClear(TestAllTypes.getDefaultInstance());
-    TestUtil.assertClear(TestAllTypes.newBuilder().build());
-
-    TestExtremeDefaultValues message =
-        TestExtremeDefaultValues.getDefaultInstance();
-    assertEquals("\u1234", message.getUtf8String());
-    assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble());
-    assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble());
-    assertTrue(Double.isNaN(message.getNanDouble()));
-    assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat());
-    assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat());
-    assertTrue(Float.isNaN(message.getNanFloat()));
-    assertEquals("? ? ?? ?? ??? ??/ ??-", message.getCppTrigraph());
-  }
-
-  public void testClear() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.assertClear(builder);
-    TestUtil.setAllFields(builder);
-    builder.clear();
-    TestUtil.assertClear(builder);
-  }
-
-  public void testReflectionGetters() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    reflectionTester.assertAllFieldsSetViaReflection(builder);
-
-    TestAllTypes message = builder.build();
-    reflectionTester.assertAllFieldsSetViaReflection(message);
-  }
-
-  public void testReflectionSetters() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    reflectionTester.setAllFieldsViaReflection(builder);
-    TestUtil.assertAllFieldsSet(builder);
-
-    TestAllTypes message = builder.build();
-    TestUtil.assertAllFieldsSet(message);
-  }
-
-  public void testReflectionSettersRejectNull() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    reflectionTester.assertReflectionSettersRejectNull(builder);
-  }
-
-  public void testReflectionRepeatedSetters() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    reflectionTester.setAllFieldsViaReflection(builder);
-    reflectionTester.modifyRepeatedFieldsViaReflection(builder);
-    TestUtil.assertRepeatedFieldsModified(builder);
-
-    TestAllTypes message = builder.build();
-    TestUtil.assertRepeatedFieldsModified(message);
-  }
-
-  public void testReflectionRepeatedSettersRejectNull() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);
-  }
-
-  public void testReflectionDefaults() throws Exception {
-    reflectionTester.assertClearViaReflection(
-      TestAllTypes.getDefaultInstance());
-    reflectionTester.assertClearViaReflection(
-      TestAllTypes.newBuilder().build());
-  }
-
-  public void testEnumInterface() throws Exception {
-    assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum()
-        instanceof ProtocolMessageEnum);
-  }
-
-  public void testEnumMap() throws Exception {
-    Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap();
-
-    for (ForeignEnum value : ForeignEnum.values()) {
-      assertEquals(value, map.findValueByNumber(value.getNumber()));
-    }
-
-    assertTrue(map.findValueByNumber(12345) == null);
-  }
-
-  public void testParsePackedToUnpacked() throws Exception {
-    TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();
-    TestUnpackedTypes message =
-      builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();
-    TestUtil.assertUnpackedFieldsSet(message);
-  }
-
-  public void testParseUnpackedToPacked() throws Exception {
-    TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
-    TestPackedTypes message =
-      builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();
-    TestUtil.assertPackedFieldsSet(message);
-  }
-
-  // =================================================================
-  // Extensions.
-
-  TestUtil.ReflectionTester extensionsReflectionTester =
-    new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
-                                  TestUtil.getExtensionRegistry());
-
-  public void testExtensionMessageOrBuilder() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    TestUtil.setAllExtensions(builder);
-    TestAllExtensions message = builder.build();
-    TestUtil.assertAllExtensionsSet(message);
-  }
-
-  public void testExtensionRepeatedSetters() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    TestUtil.setAllExtensions(builder);
-    TestUtil.modifyRepeatedExtensions(builder);
-    TestAllExtensions message = builder.build();
-    TestUtil.assertRepeatedExtensionsModified(message);
-  }
-
-  public void testExtensionDefaults() throws Exception {
-    TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance());
-    TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build());
-  }
-
-  public void testExtensionReflectionGetters() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    TestUtil.setAllExtensions(builder);
-    extensionsReflectionTester.assertAllFieldsSetViaReflection(builder);
-
-    TestAllExtensions message = builder.build();
-    extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
-  }
-
-  public void testExtensionReflectionSetters() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    extensionsReflectionTester.setAllFieldsViaReflection(builder);
-    TestUtil.assertAllExtensionsSet(builder);
-
-    TestAllExtensions message = builder.build();
-    TestUtil.assertAllExtensionsSet(message);
-  }
-
-  public void testExtensionReflectionSettersRejectNull() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    extensionsReflectionTester.assertReflectionSettersRejectNull(builder);
-  }
-
-  public void testExtensionReflectionRepeatedSetters() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    extensionsReflectionTester.setAllFieldsViaReflection(builder);
-    extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder);
-    TestUtil.assertRepeatedExtensionsModified(builder);
-
-    TestAllExtensions message = builder.build();
-    TestUtil.assertRepeatedExtensionsModified(message);
-  }
-
-  public void testExtensionReflectionRepeatedSettersRejectNull()
-      throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull(
-        builder);
-  }
-
-  public void testExtensionReflectionDefaults() throws Exception {
-    extensionsReflectionTester.assertClearViaReflection(
-      TestAllExtensions.getDefaultInstance());
-    extensionsReflectionTester.assertClearViaReflection(
-      TestAllExtensions.newBuilder().build());
-  }
-
-  public void testClearExtension() throws Exception {
-    // clearExtension() is not actually used in TestUtil, so try it manually.
-    assertFalse(
-      TestAllExtensions.newBuilder()
-        .setExtension(UnittestProto.optionalInt32Extension, 1)
-        .clearExtension(UnittestProto.optionalInt32Extension)
-        .hasExtension(UnittestProto.optionalInt32Extension));
-    assertEquals(0,
-      TestAllExtensions.newBuilder()
-        .addExtension(UnittestProto.repeatedInt32Extension, 1)
-        .clearExtension(UnittestProto.repeatedInt32Extension)
-        .getExtensionCount(UnittestProto.repeatedInt32Extension));
-  }
-
-  public void testExtensionCopy() throws Exception {
-    TestAllExtensions original = TestUtil.getAllExtensionsSet();
-    TestAllExtensions copy = TestAllExtensions.newBuilder(original).build();
-    TestUtil.assertAllExtensionsSet(copy);
-  }
-
-  public void testExtensionMergeFrom() throws Exception {
-    TestAllExtensions original =
-      TestAllExtensions.newBuilder()
-        .setExtension(UnittestProto.optionalInt32Extension, 1).build();
-    TestAllExtensions merged =
-        TestAllExtensions.newBuilder().mergeFrom(original).build();
-    assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension));
-    assertEquals(
-        1, (int) merged.getExtension(UnittestProto.optionalInt32Extension));
-  }
-
-  // =================================================================
-  // multiple_files_test
-
-  public void testMultipleFilesOption() throws Exception {
-    // We mostly just want to check that things compile.
-    MessageWithNoOuter message =
-      MessageWithNoOuter.newBuilder()
-        .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1))
-        .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1))
-        .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ)
-        .setForeignEnum(EnumWithNoOuter.BAR)
-        .build();
-    assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString()));
-
-    assertEquals(MultipleFilesTestProto.getDescriptor(),
-                 MessageWithNoOuter.getDescriptor().getFile());
-
-    Descriptors.FieldDescriptor field =
-      MessageWithNoOuter.getDescriptor().findFieldByName("foreign_enum");
-    assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(),
-                 message.getField(field));
-
-    assertEquals(MultipleFilesTestProto.getDescriptor(),
-                 ServiceWithNoOuter.getDescriptor().getFile());
-
-    assertFalse(
-      TestAllExtensions.getDefaultInstance().hasExtension(
-        MultipleFilesTestProto.extensionWithOuter));
-  }
-
-  public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize()
-    throws Exception {
-    TestOptionalOptimizedForSize message =
-        TestOptionalOptimizedForSize.getDefaultInstance();
-    assertTrue(message.isInitialized());
-
-    message = TestOptionalOptimizedForSize.newBuilder().setO(
-        TestRequiredOptimizedForSize.newBuilder().buildPartial()
-        ).buildPartial();
-    assertFalse(message.isInitialized());
-
-    message = TestOptionalOptimizedForSize.newBuilder().setO(
-        TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial()
-        ).buildPartial();
-    assertTrue(message.isInitialized());
-  }
-
-  public void testUninitializedExtensionInOptimizedForSize()
-      throws Exception {
-    TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder();
-    builder.setExtension(TestOptimizedForSize.testExtension2,
-        TestRequiredOptimizedForSize.newBuilder().buildPartial());
-    assertFalse(builder.isInitialized());
-    assertFalse(builder.buildPartial().isInitialized());
-
-    builder = TestOptimizedForSize.newBuilder();
-    builder.setExtension(TestOptimizedForSize.testExtension2,
-        TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial());
-    assertTrue(builder.isInitialized());
-    assertTrue(builder.buildPartial().isInitialized());
-  }
-
-  public void testToBuilder() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    TestAllTypes message = builder.build();
-    TestUtil.assertAllFieldsSet(message);
-    TestUtil.assertAllFieldsSet(message.toBuilder().build());
-  }
-
-  public void testFieldConstantValues() throws Exception {
-    assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1);
-    assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1);
-    assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16);
-    assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18);
-    assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21);
-    assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31);
-    assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46);
-    assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48);
-    assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51);
-  }
-
-  public void testExtensionConstantValues() throws Exception {
-    assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000);
-    assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001);
-    assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1);
-    assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16);
-    assertEquals(
-      UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18);
-    assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21);
-    assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31);
-    assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46);
-    assertEquals(
-      UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48);
-    assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51);
-  }
-
-  public void testRecursiveMessageDefaultInstance() throws Exception {
-    UnittestProto.TestRecursiveMessage message =
-        UnittestProto.TestRecursiveMessage.getDefaultInstance();
-    assertTrue(message != null);
-    assertTrue(message.getA() != null);
-    assertTrue(message.getA() == message);
-  }
-
-  public void testSerialize() throws Exception {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestUtil.setAllFields(builder);
-    TestAllTypes expected = builder.build();
-    ObjectOutputStream out = new ObjectOutputStream(baos);
-    try {
-      out.writeObject(expected);
-    } finally {
-      out.close();
-    }
-    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-    ObjectInputStream in = new ObjectInputStream(bais);
-    TestAllTypes actual = (TestAllTypes) in.readObject();
-    assertEquals(expected, actual);
-  }
-
-  public void testSerializePartial() throws Exception {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestAllTypes expected = builder.buildPartial();
-    ObjectOutputStream out = new ObjectOutputStream(baos);
-    try {
-      out.writeObject(expected);
-    } finally {
-      out.close();
-    }
-    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-    ObjectInputStream in = new ObjectInputStream(bais);
-    TestAllTypes actual = (TestAllTypes) in.readObject();
-    assertEquals(expected, actual);
-  }
-
-  public void testEnumValues() {
-     assertEquals(
-         TestAllTypes.NestedEnum.BAR.getNumber(),
-         TestAllTypes.NestedEnum.BAR_VALUE);
-    assertEquals(
-        TestAllTypes.NestedEnum.BAZ.getNumber(),
-        TestAllTypes.NestedEnum.BAZ_VALUE);
-    assertEquals(
-        TestAllTypes.NestedEnum.FOO.getNumber(),
-        TestAllTypes.NestedEnum.FOO_VALUE);
-  }
-
-  public void testNonNestedExtensionInitialization() {
-    assertTrue(NonNestedExtension.nonNestedExtension
-               .getMessageDefaultInstance() instanceof MyNonNestedExtension);
-    assertEquals("nonNestedExtension",
-                 NonNestedExtension.nonNestedExtension.getDescriptor().getName());
-  }
-
-  public void testNestedExtensionInitialization() {
-    assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance()
-               instanceof MessageToBeExtended);
-    assertEquals("recursiveExtension",
-                 MyNestedExtension.recursiveExtension.getDescriptor().getName());
-  }
-
-
-  public void testBaseMessageOrBuilder() {
-    // Mostly just makes sure the base interface exists and has some methods.
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestAllTypes message = builder.buildPartial();
-    TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder;
-    TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message;
-
-    assertEquals(
-        messageAsInterface.getDefaultBool(),
-        messageAsInterface.getDefaultBool());
-    assertEquals(
-        messageAsInterface.getOptionalDouble(),
-        messageAsInterface.getOptionalDouble());
-  }
-
-  public void testMessageOrBuilderGetters() {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-
-    // single fields
-    assertSame(ForeignMessage.getDefaultInstance(),
-        builder.getOptionalForeignMessageOrBuilder());
-    ForeignMessage.Builder subBuilder =
-        builder.getOptionalForeignMessageBuilder();
-    assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder());
-
-    // repeated fields
-    ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial();
-    ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial();
-    ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial();
-    builder.addRepeatedForeignMessage(m0);
-    builder.addRepeatedForeignMessage(m1);
-    builder.addRepeatedForeignMessage(m2);
-    assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0));
-    assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1));
-    assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
-    ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0);
-    ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1);
-    assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0));
-    assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1));
-    assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
-
-    List<? extends ForeignMessageOrBuilder> messageOrBuilderList =
-        builder.getRepeatedForeignMessageOrBuilderList();
-    assertSame(b0, messageOrBuilderList.get(0));
-    assertSame(b1, messageOrBuilderList.get(1));
-    assertSame(m2, messageOrBuilderList.get(2));
-  }
-
-  public void testGetFieldBuilder() {
-    Descriptor descriptor = TestAllTypes.getDescriptor();
-
-    FieldDescriptor fieldDescriptor =
-        descriptor.findFieldByName("optional_nested_message");
-    FieldDescriptor foreignFieldDescriptor =
-        descriptor.findFieldByName("optional_foreign_message");
-    FieldDescriptor importFieldDescriptor =
-        descriptor.findFieldByName("optional_import_message");
-
-    // Mutate the message with new field builder
-    // Mutate nested message
-    TestAllTypes.Builder builder1 = TestAllTypes.newBuilder();
-    Message.Builder fieldBuilder1 = builder1.newBuilderForField(fieldDescriptor)
-        .mergeFrom((Message) builder1.getField(fieldDescriptor));
-    FieldDescriptor subFieldDescriptor1 =
-        fieldBuilder1.getDescriptorForType().findFieldByName("bb");
-    fieldBuilder1.setField(subFieldDescriptor1, 1);
-    builder1.setField(fieldDescriptor, fieldBuilder1.build());
-
-    // Mutate foreign message
-    Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(
-        foreignFieldDescriptor)
-        .mergeFrom((Message) builder1.getField(foreignFieldDescriptor));
-    FieldDescriptor subForeignFieldDescriptor1 =
-        foreignFieldBuilder1.getDescriptorForType().findFieldByName("c");
-    foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2);
-    builder1.setField(foreignFieldDescriptor, foreignFieldBuilder1.build());
-
-    // Mutate import message
-    Message.Builder importFieldBuilder1 = builder1.newBuilderForField(
-        importFieldDescriptor)
-        .mergeFrom((Message) builder1.getField(importFieldDescriptor));
-    FieldDescriptor subImportFieldDescriptor1 =
-        importFieldBuilder1.getDescriptorForType().findFieldByName("d");
-    importFieldBuilder1.setField(subImportFieldDescriptor1, 3);
-    builder1.setField(importFieldDescriptor, importFieldBuilder1.build());
-
-    Message newMessage1 = builder1.build();
-
-    // Mutate the message with existing field builder
-    // Mutate nested message
-    TestAllTypes.Builder builder2 = TestAllTypes.newBuilder();
-    Message.Builder fieldBuilder2 = builder2.getFieldBuilder(fieldDescriptor);
-    FieldDescriptor subFieldDescriptor2 =
-        fieldBuilder2.getDescriptorForType().findFieldByName("bb");
-    fieldBuilder2.setField(subFieldDescriptor2, 1);
-    builder2.setField(fieldDescriptor, fieldBuilder2.build());
-
-    // Mutate foreign message
-    Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(
-        foreignFieldDescriptor)
-        .mergeFrom((Message) builder2.getField(foreignFieldDescriptor));
-    FieldDescriptor subForeignFieldDescriptor2 =
-        foreignFieldBuilder2.getDescriptorForType().findFieldByName("c");
-    foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2);
-    builder2.setField(foreignFieldDescriptor, foreignFieldBuilder2.build());
-
-    // Mutate import message
-    Message.Builder importFieldBuilder2 = builder2.newBuilderForField(
-        importFieldDescriptor)
-        .mergeFrom((Message) builder2.getField(importFieldDescriptor));
-    FieldDescriptor subImportFieldDescriptor2 =
-        importFieldBuilder2.getDescriptorForType().findFieldByName("d");
-    importFieldBuilder2.setField(subImportFieldDescriptor2, 3);
-    builder2.setField(importFieldDescriptor, importFieldBuilder2.build());
-
-    Message newMessage2 = builder2.build();
-
-    // These two messages should be equal.
-    assertEquals(newMessage1, newMessage2);
-  }
-
-  public void testGetFieldBuilderWithInitializedValue() {
-    Descriptor descriptor = TestAllTypes.getDescriptor();
-    FieldDescriptor fieldDescriptor =
-        descriptor.findFieldByName("optional_nested_message");
-
-    // Before setting field, builder is initialized by default value. 
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    NestedMessage.Builder fieldBuilder =
-        (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
-    assertEquals(0, fieldBuilder.getBb());
-
-    // Setting field value with new field builder instance.
-    builder = TestAllTypes.newBuilder();
-    NestedMessage.Builder newFieldBuilder =
-        builder.getOptionalNestedMessageBuilder();
-    newFieldBuilder.setBb(2);
-    // Then get the field builder instance by getFieldBuilder().
-    fieldBuilder =
-        (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
-    // It should contain new value.
-    assertEquals(2, fieldBuilder.getBb());
-    // These two builder should be equal.
-    assertSame(fieldBuilder, newFieldBuilder);
-  }
-
-  public void testGetFieldBuilderNotSupportedException() {
-    Descriptor descriptor = TestAllTypes.getDescriptor();
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    try {
-      builder.getFieldBuilder(descriptor.findFieldByName("optional_int32"));
-      fail("Exception was not thrown");
-    } catch (UnsupportedOperationException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.getFieldBuilder(
-          descriptor.findFieldByName("optional_nested_enum"));
-      fail("Exception was not thrown");
-    } catch (UnsupportedOperationException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.getFieldBuilder(descriptor.findFieldByName("repeated_int32"));
-      fail("Exception was not thrown");
-    } catch (UnsupportedOperationException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.getFieldBuilder(
-          descriptor.findFieldByName("repeated_nested_enum"));
-      fail("Exception was not thrown");
-    } catch (UnsupportedOperationException e) {
-      // We expect this exception.
-    }
-    try {
-      builder.getFieldBuilder(
-          descriptor.findFieldByName("repeated_nested_message"));
-      fail("Exception was not thrown");
-    } catch (UnsupportedOperationException e) {
-      // We expect this exception.
-    }
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LazyStringArrayListTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LazyStringArrayListTest.java
deleted file mode 100644
index 9bc94ee..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LazyStringArrayListTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import junit.framework.TestCase;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for {@link LazyStringArrayList}.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class LazyStringArrayListTest extends TestCase {
-
-  private static String STRING_A = "A";
-  private static String STRING_B = "B";
-  private static String STRING_C = "C";
-
-  private static ByteString BYTE_STRING_A = ByteString.copyFromUtf8("A");
-  private static ByteString BYTE_STRING_B = ByteString.copyFromUtf8("B");
-  private static ByteString BYTE_STRING_C = ByteString.copyFromUtf8("C");
-
-  public void testJustStrings() {
-    LazyStringArrayList list = new LazyStringArrayList();
-    list.add(STRING_A);
-    list.add(STRING_B);
-    list.add(STRING_C);
-
-    assertEquals(3, list.size());
-    assertSame(STRING_A, list.get(0));
-    assertSame(STRING_B, list.get(1));
-    assertSame(STRING_C, list.get(2));
-
-    list.set(1, STRING_C);
-    assertSame(STRING_C, list.get(1));
-
-    list.remove(1);
-    assertSame(STRING_A, list.get(0));
-    assertSame(STRING_C, list.get(1));
-  }
-
-  public void testJustByteString() {
-    LazyStringArrayList list = new LazyStringArrayList();
-    list.add(BYTE_STRING_A);
-    list.add(BYTE_STRING_B);
-    list.add(BYTE_STRING_C);
-
-    assertEquals(3, list.size());
-    assertSame(BYTE_STRING_A, list.getByteString(0));
-    assertSame(BYTE_STRING_B, list.getByteString(1));
-    assertSame(BYTE_STRING_C, list.getByteString(2));
-
-    list.remove(1);
-    assertSame(BYTE_STRING_A, list.getByteString(0));
-    assertSame(BYTE_STRING_C, list.getByteString(1));
-  }
-
-  public void testConversionBackAndForth() {
-    LazyStringArrayList list = new LazyStringArrayList();
-    list.add(STRING_A);
-    list.add(BYTE_STRING_B);
-    list.add(BYTE_STRING_C);
-
-    // String a should be the same because it was originally a string
-    assertSame(STRING_A, list.get(0));
-
-    // String b and c should be different because the string has to be computed
-    // from the ByteString
-    String bPrime = list.get(1);
-    assertNotSame(STRING_B, bPrime);
-    assertEquals(STRING_B, bPrime);
-    String cPrime = list.get(2);
-    assertNotSame(STRING_C, cPrime);
-    assertEquals(STRING_C, cPrime);
-
-    // String c and c should stay the same once cached.
-    assertSame(bPrime, list.get(1));
-    assertSame(cPrime, list.get(2));
-
-    // ByteString needs to be computed from string for both a and b
-    ByteString aPrimeByteString = list.getByteString(0);
-    assertEquals(BYTE_STRING_A, aPrimeByteString);
-    ByteString bPrimeByteString = list.getByteString(1);
-    assertNotSame(BYTE_STRING_B, bPrimeByteString);
-    assertEquals(BYTE_STRING_B, list.getByteString(1));
-
-    // Once cached, ByteString should stay cached.
-    assertSame(aPrimeByteString, list.getByteString(0));
-    assertSame(bPrimeByteString, list.getByteString(1));
-  }
-
-  public void testCopyConstructorCopiesByReference() {
-    LazyStringArrayList list1 = new LazyStringArrayList();
-    list1.add(STRING_A);
-    list1.add(BYTE_STRING_B);
-    list1.add(BYTE_STRING_C);
-
-    LazyStringArrayList list2 = new LazyStringArrayList(list1);
-    assertEquals(3, list2.size());
-    assertSame(STRING_A, list2.get(0));
-    assertSame(BYTE_STRING_B, list2.getByteString(1));
-    assertSame(BYTE_STRING_C, list2.getByteString(2));
-  }
-
-  public void testListCopyConstructor() {
-    List<String> list1 = new ArrayList<String>();
-    list1.add(STRING_A);
-    list1.add(STRING_B);
-    list1.add(STRING_C);
-
-    LazyStringArrayList list2 = new LazyStringArrayList(list1);
-    assertEquals(3, list2.size());
-    assertSame(STRING_A, list2.get(0));
-    assertSame(STRING_B, list2.get(1));
-    assertSame(STRING_C, list2.get(2));
-  }
-
-  public void testAddAllCopiesByReferenceIfPossible() {
-    LazyStringArrayList list1 = new LazyStringArrayList();
-    list1.add(STRING_A);
-    list1.add(BYTE_STRING_B);
-    list1.add(BYTE_STRING_C);
-
-    LazyStringArrayList list2 = new LazyStringArrayList();
-    list2.addAll(list1);
-
-    assertEquals(3, list2.size());
-    assertSame(STRING_A, list2.get(0));
-    assertSame(BYTE_STRING_B, list2.getByteString(1));
-    assertSame(BYTE_STRING_C, list2.getByteString(2));
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LazyStringEndToEndTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LazyStringEndToEndTest.java
deleted file mode 100644
index e21e038..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LazyStringEndToEndTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-
-import protobuf_unittest.UnittestProto;
-
-import junit.framework.TestCase;
-
-import java.io.IOException;
-
-/**
- * Tests to make sure the lazy conversion of UTF8-encoded byte arrays to
- * strings works correctly.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class LazyStringEndToEndTest extends TestCase {
-
-  private static ByteString TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8 =
-      ByteString.copyFrom(new byte[] {
-          114, 4, -1, 0, -1, 0, -30, 2, 4, -1,
-          0, -1, 0, -30, 2, 4, -1, 0, -1, 0, });
-
-  private ByteString encodedTestAllTypes;
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-    this.encodedTestAllTypes = UnittestProto.TestAllTypes.newBuilder()
-        .setOptionalString("foo")
-        .addRepeatedString("bar")
-        .addRepeatedString("baz")
-        .build()
-        .toByteString();
-  }
-
-  /**
-   * Tests that an invalid UTF8 string will roundtrip through a parse
-   * and serialization.
-   */
-  public void testParseAndSerialize() throws InvalidProtocolBufferException {
-    UnittestProto.TestAllTypes tV2 = UnittestProto.TestAllTypes.parseFrom(
-        TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8);
-    ByteString bytes = tV2.toByteString();
-    assertEquals(TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, bytes);
-
-    tV2.getOptionalString();
-    bytes = tV2.toByteString();
-    assertEquals(TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, bytes);
-  }
-
-  public void testParseAndWrite() throws IOException {
-    UnittestProto.TestAllTypes tV2 = UnittestProto.TestAllTypes.parseFrom(
-        TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8);
-    byte[] sink = new byte[TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8.size()];
-    CodedOutputStream outputStream = CodedOutputStream.newInstance(sink);
-    tV2.writeTo(outputStream);
-    outputStream.flush();
-    assertEquals(
-        TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8,
-        ByteString.copyFrom(sink));
-  }
-
-  public void testNoStringCachingIfOnlyBytesAccessed() throws Exception {
-    UnittestProto.TestAllTypes proto =
-        UnittestProto.TestAllTypes.parseFrom(encodedTestAllTypes);
-    ByteString optional = proto.getOptionalStringBytes();
-    assertSame(optional, proto.getOptionalStringBytes());
-    assertSame(optional, proto.toBuilder().getOptionalStringBytes());
-
-    ByteString repeated0 = proto.getRepeatedStringBytes(0);
-    ByteString repeated1 = proto.getRepeatedStringBytes(1);
-    assertSame(repeated0, proto.getRepeatedStringBytes(0));
-    assertSame(repeated1, proto.getRepeatedStringBytes(1));
-    assertSame(repeated0, proto.toBuilder().getRepeatedStringBytes(0));
-    assertSame(repeated1, proto.toBuilder().getRepeatedStringBytes(1));
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LiteralByteStringTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LiteralByteStringTest.java
deleted file mode 100644
index b2dcc7e..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/LiteralByteStringTest.java
+++ /dev/null
@@ -1,344 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * Test {@link LiteralByteString} by setting up a reference string in {@link #setUp()}.
- * This class is designed to be extended for testing extensions of {@link LiteralByteString}
- * such as {@link BoundedByteString}, see {@link BoundedByteStringTest}.
- *
- * @author carlanton@google.com (Carl Haverl)
- */
-public class LiteralByteStringTest extends TestCase {
-  protected static final String UTF_8 = "UTF-8";
-
-  protected String classUnderTest;
-  protected byte[] referenceBytes;
-  protected ByteString stringUnderTest;
-  protected int expectedHashCode;
-
-  @Override
-  protected void setUp() throws Exception {
-    classUnderTest = "LiteralByteString";
-    referenceBytes = ByteStringTest.getTestBytes(1234, 11337766L);
-    stringUnderTest = ByteString.copyFrom(referenceBytes);
-    expectedHashCode = 331161852;
-  }
-
-  protected String getActualClassName(Object object) {
-    String actualClassName = object.getClass().getName();
-    actualClassName = actualClassName.substring(actualClassName.lastIndexOf('.') + 1);
-    return actualClassName;
-  }
-
-  public void testByteAt() {
-    boolean stillEqual = true;
-    for (int i = 0; stillEqual && i < referenceBytes.length; ++i) {
-      stillEqual = (referenceBytes[i] == stringUnderTest.byteAt(i));
-    }
-    assertTrue(classUnderTest + " must capture the right bytes", stillEqual);
-  }
-
-  public void testByteIterator() {
-    boolean stillEqual = true;
-    ByteString.ByteIterator iter = stringUnderTest.iterator();
-    for (int i = 0; stillEqual && i < referenceBytes.length; ++i) {
-      stillEqual = (iter.hasNext() && referenceBytes[i] == iter.nextByte());
-    }
-    assertTrue(classUnderTest + " must capture the right bytes", stillEqual);
-    assertFalse(classUnderTest + " must have exhausted the itertor", iter.hasNext());
-
-    try {
-      iter.nextByte();
-      fail("Should have thrown an exception.");
-    } catch (NoSuchElementException e) {
-      // This is success
-    }
-  }
-
-  public void testByteIterable() {
-    boolean stillEqual = true;
-    int j = 0;
-    for (byte quantum : stringUnderTest) {
-      stillEqual = (referenceBytes[j] == quantum);
-      ++j;
-    }
-    assertTrue(classUnderTest + " must capture the right bytes as Bytes", stillEqual);
-    assertEquals(classUnderTest + " iterable character count", referenceBytes.length, j);
-  }
-
-  public void testSize() {
-    assertEquals(classUnderTest + " must have the expected size", referenceBytes.length,
-        stringUnderTest.size());
-  }
-
-  public void testCopyTo_ByteArrayOffsetLength() {
-    int destinationOffset = 50;
-    int length = 100;
-    byte[] destination = new byte[destinationOffset + length];
-    int sourceOffset = 213;
-    stringUnderTest.copyTo(destination, sourceOffset, destinationOffset, length);
-    boolean stillEqual = true;
-    for (int i = 0; stillEqual && i < length; ++i) {
-      stillEqual = referenceBytes[i + sourceOffset] == destination[i + destinationOffset];
-    }
-    assertTrue(classUnderTest + ".copyTo(4 arg) must give the expected bytes", stillEqual);
-  }
-
-  public void testCopyTo_ByteArrayOffsetLengthErrors() {
-    int destinationOffset = 50;
-    int length = 100;
-    byte[] destination = new byte[destinationOffset + length];
-
-    try {
-      // Copy one too many bytes
-      stringUnderTest.copyTo(destination, stringUnderTest.size() + 1 - length,
-          destinationOffset, length);
-      fail("Should have thrown an exception when copying too many bytes of a "
-          + classUnderTest);
-    } catch (IndexOutOfBoundsException expected) {
-      // This is success
-    }
-
-    try {
-      // Copy with illegal negative sourceOffset
-      stringUnderTest.copyTo(destination, -1, destinationOffset, length);
-      fail("Should have thrown an exception when given a negative sourceOffset in "
-          + classUnderTest);
-    } catch (IndexOutOfBoundsException expected) {
-      // This is success
-    }
-
-    try {
-      // Copy with illegal negative destinationOffset
-      stringUnderTest.copyTo(destination, 0, -1, length);
-      fail("Should have thrown an exception when given a negative destinationOffset in "
-          + classUnderTest);
-    } catch (IndexOutOfBoundsException expected) {
-      // This is success
-    }
-
-    try {
-      // Copy with illegal negative size
-      stringUnderTest.copyTo(destination, 0, 0, -1);
-      fail("Should have thrown an exception when given a negative size in "
-          + classUnderTest);
-    } catch (IndexOutOfBoundsException expected) {
-      // This is success
-    }
-
-    try {
-      // Copy with illegal too-large sourceOffset
-      stringUnderTest.copyTo(destination, 2 * stringUnderTest.size(), 0, length);
-      fail("Should have thrown an exception when the destinationOffset is too large in "
-          + classUnderTest);
-    } catch (IndexOutOfBoundsException expected) {
-      // This is success
-    }
-
-    try {
-      // Copy with illegal too-large destinationOffset
-      stringUnderTest.copyTo(destination, 0, 2 * destination.length, length);
-      fail("Should have thrown an exception when the destinationOffset is too large in "
-          + classUnderTest);
-    } catch (IndexOutOfBoundsException expected) {
-      // This is success
-    }
-  }
-
-  public void testCopyTo_ByteBuffer() {
-    ByteBuffer myBuffer = ByteBuffer.allocate(referenceBytes.length);
-    stringUnderTest.copyTo(myBuffer);
-    assertTrue(classUnderTest + ".copyTo(ByteBuffer) must give back the same bytes",
-        Arrays.equals(referenceBytes, myBuffer.array()));
-  }
-
-  public void testAsReadOnlyByteBuffer() {
-    ByteBuffer byteBuffer = stringUnderTest.asReadOnlyByteBuffer();
-    byte[] roundTripBytes = new byte[referenceBytes.length];
-    assertTrue(byteBuffer.remaining() == referenceBytes.length);
-    assertTrue(byteBuffer.isReadOnly());
-    byteBuffer.get(roundTripBytes);
-    assertTrue(classUnderTest + ".asReadOnlyByteBuffer() must give back the same bytes",
-        Arrays.equals(referenceBytes, roundTripBytes));
-  }
-
-  public void testAsReadOnlyByteBufferList() {
-    List<ByteBuffer> byteBuffers = stringUnderTest.asReadOnlyByteBufferList();
-    int bytesSeen = 0;
-    byte[] roundTripBytes = new byte[referenceBytes.length];
-    for (ByteBuffer byteBuffer : byteBuffers) {
-      int thisLength = byteBuffer.remaining();
-      assertTrue(byteBuffer.isReadOnly());
-      assertTrue(bytesSeen + thisLength <= referenceBytes.length);
-      byteBuffer.get(roundTripBytes, bytesSeen, thisLength);
-      bytesSeen += thisLength;
-    }
-    assertTrue(bytesSeen == referenceBytes.length);
-    assertTrue(classUnderTest + ".asReadOnlyByteBufferTest() must give back the same bytes",
-        Arrays.equals(referenceBytes, roundTripBytes));
-  }
-
-  public void testToByteArray() {
-    byte[] roundTripBytes = stringUnderTest.toByteArray();
-    assertTrue(classUnderTest + ".toByteArray() must give back the same bytes",
-        Arrays.equals(referenceBytes, roundTripBytes));
-  }
-
-  public void testWriteTo() throws IOException {
-    ByteArrayOutputStream bos = new ByteArrayOutputStream();
-    stringUnderTest.writeTo(bos);
-    byte[] roundTripBytes = bos.toByteArray();
-    assertTrue(classUnderTest + ".writeTo() must give back the same bytes",
-        Arrays.equals(referenceBytes, roundTripBytes));
-  }
-  
-  public void testWriteTo_mutating() throws IOException {
-    OutputStream os = new OutputStream() {
-      @Override
-      public void write(byte[] b, int off, int len) {
-        for (int x = 0; x < len; ++x) {
-          b[off + x] = (byte) 0;
-        }
-      }
-
-      @Override
-      public void write(int b) {
-        // Purposefully left blank.
-      }
-    };
-
-    stringUnderTest.writeTo(os);
-    byte[] newBytes = stringUnderTest.toByteArray();
-    assertTrue(classUnderTest + ".writeTo() must not grant access to underlying array",
-        Arrays.equals(referenceBytes, newBytes));
-  }
-
-  public void testNewOutput() throws IOException {
-    ByteArrayOutputStream bos = new ByteArrayOutputStream();
-    ByteString.Output output = ByteString.newOutput();
-    stringUnderTest.writeTo(output);
-    assertEquals("Output Size returns correct result",
-        output.size(), stringUnderTest.size());
-    output.writeTo(bos);
-    assertTrue("Output.writeTo() must give back the same bytes",
-        Arrays.equals(referenceBytes, bos.toByteArray()));
-
-    // write the output stream to itself! This should cause it to double
-    output.writeTo(output);
-    assertEquals("Writing an output stream to itself is successful",
-        stringUnderTest.concat(stringUnderTest), output.toByteString());
-
-    output.reset();
-    assertEquals("Output.reset() resets the output", 0, output.size());
-    assertEquals("Output.reset() resets the output",
-        ByteString.EMPTY, output.toByteString());
-    
-  }
-
-  public void testHashCode() {
-    int hash = stringUnderTest.hashCode();
-    assertEquals(classUnderTest + " must have expected hashCode", expectedHashCode, hash);
-  }
-
-  public void testNewInput() throws IOException {
-    InputStream input = stringUnderTest.newInput();
-    assertEquals("InputStream.available() returns correct value",
-        stringUnderTest.size(), input.available());
-    boolean stillEqual = true;
-    for (byte referenceByte : referenceBytes) {
-      int expectedInt = (referenceByte & 0xFF);
-      stillEqual = (expectedInt == input.read());
-    }
-    assertEquals("InputStream.available() returns correct value",
-        0, input.available());
-    assertTrue(classUnderTest + " must give the same bytes from the InputStream", stillEqual);
-    assertEquals(classUnderTest + " InputStream must now be exhausted", -1, input.read());
-  }
-
-  public void testNewInput_skip() throws IOException {
-    InputStream input = stringUnderTest.newInput();
-    int stringSize = stringUnderTest.size();
-    int nearEndIndex = stringSize * 2 / 3;
-    long skipped1 = input.skip(nearEndIndex);
-    assertEquals("InputStream.skip()", skipped1, nearEndIndex);
-    assertEquals("InputStream.available()",
-        stringSize - skipped1, input.available());
-    assertTrue("InputStream.mark() is available", input.markSupported());
-    input.mark(0);
-    assertEquals("InputStream.skip(), read()",
-        stringUnderTest.byteAt(nearEndIndex) & 0xFF, input.read());
-    assertEquals("InputStream.available()",
-                 stringSize - skipped1 - 1, input.available());
-    long skipped2 = input.skip(stringSize);
-    assertEquals("InputStream.skip() incomplete",
-        skipped2, stringSize - skipped1 - 1);
-    assertEquals("InputStream.skip(), no more input", 0, input.available());
-    assertEquals("InputStream.skip(), no more input", -1, input.read());
-    input.reset();
-    assertEquals("InputStream.reset() succeded",
-                 stringSize - skipped1, input.available());
-    assertEquals("InputStream.reset(), read()",
-        stringUnderTest.byteAt(nearEndIndex) & 0xFF, input.read());
-  }
-
-  public void testNewCodedInput() throws IOException {
-    CodedInputStream cis = stringUnderTest.newCodedInput();
-    byte[] roundTripBytes = cis.readRawBytes(referenceBytes.length);
-    assertTrue(classUnderTest + " must give the same bytes back from the CodedInputStream",
-        Arrays.equals(referenceBytes, roundTripBytes));
-    assertTrue(classUnderTest + " CodedInputStream must now be exhausted", cis.isAtEnd());
-  }
-
-  /**
-   * Make sure we keep things simple when concatenating with empty. See also
-   * {@link ByteStringTest#testConcat_empty()}.
-   */
-  public void testConcat_empty() {
-    assertSame(classUnderTest + " concatenated with empty must give " + classUnderTest,
-        stringUnderTest.concat(ByteString.EMPTY), stringUnderTest);
-    assertSame("empty concatenated with " + classUnderTest + " must give " + classUnderTest,
-        ByteString.EMPTY.concat(stringUnderTest), stringUnderTest);
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/MessageTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/MessageTest.java
deleted file mode 100644
index c8c95a8..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/MessageTest.java
+++ /dev/null
@@ -1,354 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestRequired;
-import protobuf_unittest.UnittestProto.TestRequiredForeign;
-import protobuf_unittest.UnittestProto.ForeignMessage;
-
-import junit.framework.TestCase;
-
-import java.util.List;
-
-/**
- * Misc. unit tests for message operations that apply to both generated
- * and dynamic messages.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class MessageTest extends TestCase {
-  // =================================================================
-  // Message-merging tests.
-
-  static final TestAllTypes MERGE_SOURCE =
-    TestAllTypes.newBuilder()
-      .setOptionalInt32(1)
-      .setOptionalString("foo")
-      .setOptionalForeignMessage(ForeignMessage.getDefaultInstance())
-      .addRepeatedString("bar")
-      .build();
-
-  static final TestAllTypes MERGE_DEST =
-    TestAllTypes.newBuilder()
-      .setOptionalInt64(2)
-      .setOptionalString("baz")
-      .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(3).build())
-      .addRepeatedString("qux")
-      .build();
-
-  static final String MERGE_RESULT_TEXT =
-      "optional_int32: 1\n" +
-      "optional_int64: 2\n" +
-      "optional_string: \"foo\"\n" +
-      "optional_foreign_message {\n" +
-      "  c: 3\n" +
-      "}\n" +
-      "repeated_string: \"qux\"\n" +
-      "repeated_string: \"bar\"\n";
-
-  public void testMergeFrom() throws Exception {
-    TestAllTypes result =
-      TestAllTypes.newBuilder(MERGE_DEST)
-        .mergeFrom(MERGE_SOURCE).build();
-
-    assertEquals(MERGE_RESULT_TEXT, result.toString());
-  }
-
-  /**
-   * Test merging a DynamicMessage into a GeneratedMessage.  As long as they
-   * have the same descriptor, this should work, but it is an entirely different
-   * code path.
-   */
-  public void testMergeFromDynamic() throws Exception {
-    TestAllTypes result =
-      TestAllTypes.newBuilder(MERGE_DEST)
-        .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build())
-        .build();
-
-    assertEquals(MERGE_RESULT_TEXT, result.toString());
-  }
-
-  /** Test merging two DynamicMessages. */
-  public void testDynamicMergeFrom() throws Exception {
-    DynamicMessage result =
-      DynamicMessage.newBuilder(MERGE_DEST)
-        .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build())
-        .build();
-
-    assertEquals(MERGE_RESULT_TEXT, result.toString());
-  }
-
-  // =================================================================
-  // Required-field-related tests.
-
-  private static final TestRequired TEST_REQUIRED_UNINITIALIZED =
-    TestRequired.getDefaultInstance();
-  private static final TestRequired TEST_REQUIRED_INITIALIZED =
-    TestRequired.newBuilder().setA(1).setB(2).setC(3).build();
-
-  public void testRequired() throws Exception {
-    TestRequired.Builder builder = TestRequired.newBuilder();
-
-    assertFalse(builder.isInitialized());
-    builder.setA(1);
-    assertFalse(builder.isInitialized());
-    builder.setB(1);
-    assertFalse(builder.isInitialized());
-    builder.setC(1);
-    assertTrue(builder.isInitialized());
-  }
-
-  public void testRequiredForeign() throws Exception {
-    TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder();
-
-    assertTrue(builder.isInitialized());
-
-    builder.setOptionalMessage(TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(builder.isInitialized());
-
-    builder.setOptionalMessage(TEST_REQUIRED_INITIALIZED);
-    assertTrue(builder.isInitialized());
-
-    builder.addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(builder.isInitialized());
-
-    builder.setRepeatedMessage(0, TEST_REQUIRED_INITIALIZED);
-    assertTrue(builder.isInitialized());
-  }
-
-  public void testRequiredExtension() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-
-    assertTrue(builder.isInitialized());
-
-    builder.setExtension(TestRequired.single, TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(builder.isInitialized());
-
-    builder.setExtension(TestRequired.single, TEST_REQUIRED_INITIALIZED);
-    assertTrue(builder.isInitialized());
-
-    builder.addExtension(TestRequired.multi, TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(builder.isInitialized());
-
-    builder.setExtension(TestRequired.multi, 0, TEST_REQUIRED_INITIALIZED);
-    assertTrue(builder.isInitialized());
-  }
-
-  public void testRequiredDynamic() throws Exception {
-    Descriptors.Descriptor descriptor = TestRequired.getDescriptor();
-    DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor);
-
-    assertFalse(builder.isInitialized());
-    builder.setField(descriptor.findFieldByName("a"), 1);
-    assertFalse(builder.isInitialized());
-    builder.setField(descriptor.findFieldByName("b"), 1);
-    assertFalse(builder.isInitialized());
-    builder.setField(descriptor.findFieldByName("c"), 1);
-    assertTrue(builder.isInitialized());
-  }
-
-  public void testRequiredDynamicForeign() throws Exception {
-    Descriptors.Descriptor descriptor = TestRequiredForeign.getDescriptor();
-    DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor);
-
-    assertTrue(builder.isInitialized());
-
-    builder.setField(descriptor.findFieldByName("optional_message"),
-                     TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(builder.isInitialized());
-
-    builder.setField(descriptor.findFieldByName("optional_message"),
-                     TEST_REQUIRED_INITIALIZED);
-    assertTrue(builder.isInitialized());
-
-    builder.addRepeatedField(descriptor.findFieldByName("repeated_message"),
-                             TEST_REQUIRED_UNINITIALIZED);
-    assertFalse(builder.isInitialized());
-
-    builder.setRepeatedField(descriptor.findFieldByName("repeated_message"), 0,
-                             TEST_REQUIRED_INITIALIZED);
-    assertTrue(builder.isInitialized());
-  }
-
-  public void testUninitializedException() throws Exception {
-    try {
-      TestRequired.newBuilder().build();
-      fail("Should have thrown an exception.");
-    } catch (UninitializedMessageException e) {
-      assertEquals("Message missing required fields: a, b, c", e.getMessage());
-    }
-  }
-
-  public void testBuildPartial() throws Exception {
-    // We're mostly testing that no exception is thrown.
-    TestRequired message = TestRequired.newBuilder().buildPartial();
-    assertFalse(message.isInitialized());
-  }
-
-  public void testNestedUninitializedException() throws Exception {
-    try {
-      TestRequiredForeign.newBuilder()
-        .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED)
-        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)
-        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)
-        .build();
-      fail("Should have thrown an exception.");
-    } catch (UninitializedMessageException e) {
-      assertEquals(
-        "Message missing required fields: " +
-        "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",
-        e.getMessage());
-    }
-  }
-
-  public void testBuildNestedPartial() throws Exception {
-    // We're mostly testing that no exception is thrown.
-    TestRequiredForeign message =
-      TestRequiredForeign.newBuilder()
-        .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED)
-        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)
-        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)
-        .buildPartial();
-    assertFalse(message.isInitialized());
-  }
-
-  public void testParseUnititialized() throws Exception {
-    try {
-      TestRequired.parseFrom(ByteString.EMPTY);
-      fail("Should have thrown an exception.");
-    } catch (InvalidProtocolBufferException e) {
-      assertEquals("Message missing required fields: a, b, c", e.getMessage());
-    }
-  }
-
-  public void testParseNestedUnititialized() throws Exception {
-    ByteString data =
-      TestRequiredForeign.newBuilder()
-        .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED)
-        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)
-        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)
-        .buildPartial().toByteString();
-
-    try {
-      TestRequiredForeign.parseFrom(data);
-      fail("Should have thrown an exception.");
-    } catch (InvalidProtocolBufferException e) {
-      assertEquals(
-        "Message missing required fields: " +
-        "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",
-        e.getMessage());
-    }
-  }
-
-  public void testDynamicUninitializedException() throws Exception {
-    try {
-      DynamicMessage.newBuilder(TestRequired.getDescriptor()).build();
-      fail("Should have thrown an exception.");
-    } catch (UninitializedMessageException e) {
-      assertEquals("Message missing required fields: a, b, c", e.getMessage());
-    }
-  }
-
-  public void testDynamicBuildPartial() throws Exception {
-    // We're mostly testing that no exception is thrown.
-    DynamicMessage message =
-      DynamicMessage.newBuilder(TestRequired.getDescriptor())
-        .buildPartial();
-    assertFalse(message.isInitialized());
-  }
-
-  public void testDynamicParseUnititialized() throws Exception {
-    try {
-      Descriptors.Descriptor descriptor = TestRequired.getDescriptor();
-      DynamicMessage.parseFrom(descriptor, ByteString.EMPTY);
-      fail("Should have thrown an exception.");
-    } catch (InvalidProtocolBufferException e) {
-      assertEquals("Message missing required fields: a, b, c", e.getMessage());
-    }
-  }
-  
-  /** Test reading unset repeated message from DynamicMessage. */
-  public void testDynamicRepeatedMessageNull() throws Exception {
-    Descriptors.Descriptor descriptor = TestRequired.getDescriptor();
-    DynamicMessage result =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor())
-        .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build())
-        .build();
-
-    assertTrue(result.getField(result.getDescriptorForType()
-        .findFieldByName("repeated_foreign_message")) instanceof List<?>);
-    assertEquals(result.getRepeatedFieldCount(result.getDescriptorForType()
-        .findFieldByName("repeated_foreign_message")), 0);
-  }
-  
-  /** Test reading repeated message from DynamicMessage. */
-  public void testDynamicRepeatedMessageNotNull() throws Exception {
-
-    TestAllTypes REPEATED_NESTED =
-      TestAllTypes.newBuilder()
-        .setOptionalInt32(1)
-        .setOptionalString("foo")
-        .setOptionalForeignMessage(ForeignMessage.getDefaultInstance())
-        .addRepeatedString("bar")
-        .addRepeatedForeignMessage(ForeignMessage.getDefaultInstance())
-        .addRepeatedForeignMessage(ForeignMessage.getDefaultInstance())
-        .build();
-    Descriptors.Descriptor descriptor = TestRequired.getDescriptor();
-    DynamicMessage result =
-      DynamicMessage.newBuilder(TestAllTypes.getDescriptor())
-        .mergeFrom(DynamicMessage.newBuilder(REPEATED_NESTED).build())
-        .build();
-
-    assertTrue(result.getField(result.getDescriptorForType()
-        .findFieldByName("repeated_foreign_message")) instanceof List<?>);
-    assertEquals(result.getRepeatedFieldCount(result.getDescriptorForType()
-        .findFieldByName("repeated_foreign_message")), 2);
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/NestedBuildersTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/NestedBuildersTest.java
deleted file mode 100644
index 68d70be..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/NestedBuildersTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.Vehicle;
-import protobuf_unittest.Wheel;
-
-import junit.framework.TestCase;
-
-import java.util.List;
-import java.util.ArrayList;
-
-/**
- * Test cases that exercise end-to-end use cases involving
- * {@link SingleFieldBuilder} and {@link RepeatedFieldBuilder}.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class NestedBuildersTest extends TestCase {
-
-  public void testMessagesAndBuilders() {
-    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(4)
-        .setWidth(1);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(4)
-        .setWidth(2);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(4)
-        .setWidth(3);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(4)
-        .setWidth(4);
-    vehicleBuilder.getEngineBuilder()
-        .setLiters(10);
-
-    Vehicle vehicle = vehicleBuilder.build();
-    assertEquals(4, vehicle.getWheelCount());
-    for (int i = 0; i < 4; i++) {
-      Wheel wheel = vehicle.getWheel(i);
-      assertEquals(4, wheel.getRadius());
-      assertEquals(i + 1, wheel.getWidth());
-    }
-    assertEquals(10, vehicle.getEngine().getLiters());
-
-    for (int i = 0; i < 4; i++) {
-      vehicleBuilder.getWheelBuilder(i)
-          .setRadius(5)
-          .setWidth(i + 10);
-    }
-    vehicleBuilder.getEngineBuilder().setLiters(20);
-
-    vehicle = vehicleBuilder.build();
-    for (int i = 0; i < 4; i++) {
-      Wheel wheel = vehicle.getWheel(i);
-      assertEquals(5, wheel.getRadius());
-      assertEquals(i + 10, wheel.getWidth());
-    }
-    assertEquals(20, vehicle.getEngine().getLiters());
-    assertTrue(vehicle.hasEngine());
-  }
-
-  public void testMessagesAreCached() {
-    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(1)
-        .setWidth(2);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(3)
-        .setWidth(4);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(5)
-        .setWidth(6);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(7)
-        .setWidth(8);
-
-    // Make sure messages are cached.
-    List<Wheel> wheels = new ArrayList<Wheel>(vehicleBuilder.getWheelList());
-    for (int i = 0; i < wheels.size(); i++) {
-      assertSame(wheels.get(i), vehicleBuilder.getWheel(i));
-    }
-
-    // Now get builders and check they didn't change.
-    for (int i = 0; i < wheels.size(); i++) {
-      vehicleBuilder.getWheel(i);
-    }
-    for (int i = 0; i < wheels.size(); i++) {
-      assertSame(wheels.get(i), vehicleBuilder.getWheel(i));
-    }
-
-    // Change just one
-    vehicleBuilder.getWheelBuilder(3)
-        .setRadius(20).setWidth(20);
-
-    // Now get wheels and check that only that one changed
-    for (int i = 0; i < wheels.size(); i++) {
-      if (i < 3) {
-        assertSame(wheels.get(i), vehicleBuilder.getWheel(i));
-      } else {
-        assertNotSame(wheels.get(i), vehicleBuilder.getWheel(i));
-      }
-    }
-  }
-
-  public void testRemove_WithNestedBuilders() {
-    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(1)
-        .setWidth(1);
-    vehicleBuilder.addWheelBuilder()
-        .setRadius(2)
-        .setWidth(2);
-    vehicleBuilder.removeWheel(0);
-
-    assertEquals(1, vehicleBuilder.getWheelCount());
-    assertEquals(2, vehicleBuilder.getWheel(0).getRadius());
-  }
-
-  public void testRemove_WithNestedMessages() {
-    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();
-    vehicleBuilder.addWheel(Wheel.newBuilder()
-        .setRadius(1)
-        .setWidth(1));
-    vehicleBuilder.addWheel(Wheel.newBuilder()
-        .setRadius(2)
-        .setWidth(2));
-    vehicleBuilder.removeWheel(0);
-
-    assertEquals(1, vehicleBuilder.getWheelCount());
-    assertEquals(2, vehicleBuilder.getWheel(0).getRadius());
-  }
-
-  public void testMerge() {
-    Vehicle vehicle1 = Vehicle.newBuilder()
-        .addWheel(Wheel.newBuilder().setRadius(1).build())
-        .addWheel(Wheel.newBuilder().setRadius(2).build())
-        .build();
-
-    Vehicle vehicle2 = Vehicle.newBuilder()
-        .mergeFrom(vehicle1)
-        .build();
-    // List should be the same -- no allocation
-    assertSame(vehicle1.getWheelList(), vehicle2.getWheelList());
-
-    Vehicle vehicle3 = vehicle1.toBuilder().build();
-    assertSame(vehicle1.getWheelList(), vehicle3.getWheelList());
-  }
-
-  public void testGettingBuilderMarksFieldAsHaving() {
-    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();
-    vehicleBuilder.getEngineBuilder();
-    Vehicle vehicle = vehicleBuilder.buildPartial();
-    assertTrue(vehicle.hasEngine());
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ParserTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ParserTest.java
deleted file mode 100644
index b35af68..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ParserTest.java
+++ /dev/null
@@ -1,278 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
-import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;
-import protobuf_unittest.UnittestOptimizeFor;
-import protobuf_unittest.UnittestProto.ForeignMessage;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestEmptyMessage;
-import protobuf_unittest.UnittestProto.TestRequired;
-import protobuf_unittest.UnittestProto.TestParsingMerge;
-import protobuf_unittest.UnittestProto;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Unit test for {@link Parser}.
- *
- * @author liujisi@google.com (Pherl Liu)
- */
-public class ParserTest extends TestCase {
-  public void testGeneratedMessageParserSingleton() throws Exception {
-    for (int i = 0; i < 10; i++) {
-      assertEquals(TestAllTypes.PARSER,
-                   TestUtil.getAllSet().getParserForType());
-    }
-  }
-
-  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();
-    assertMessageEquals(message, parser.parseFrom(data, registry));
-    assertMessageEquals(message, parser.parseFrom(
-        generatePaddingArray(data, offset, padding),
-        offset, length, registry));
-    assertMessageEquals(message, parser.parseFrom(
-        message.toByteString(), registry));
-    assertMessageEquals(message, parser.parseFrom(
-        new ByteArrayInputStream(data), registry));
-    assertMessageEquals(message, parser.parseFrom(
-        CodedInputStream.newInstance(data), registry));
-  }
-
-  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<? extends MessageLite> parser = message.getParserForType();
-    assertMessageEquals(message, parser.parseFrom(data));
-    assertMessageEquals(message, parser.parseFrom(
-        generatePaddingArray(data, offset, padding),
-        offset, length));
-    assertMessageEquals(message, parser.parseFrom(message.toByteString()));
-    assertMessageEquals(message, parser.parseFrom(
-        new ByteArrayInputStream(data)));
-    assertMessageEquals(message, parser.parseFrom(
-        CodedInputStream.newInstance(data)));
-  }
-
-  private void assertMessageEquals(MessageLite expected, MessageLite actual)
-      throws Exception {
-    if (expected instanceof Message) {
-      assertEquals(expected, actual);
-    } else {
-      assertEquals(expected.toByteString(), actual.toByteString());
-    }
-  }
-
-  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 testNormalMessage() throws Exception {
-    assertRoundTripEquals(TestUtil.getAllSet());
-  }
-
-  public void testParsePartial() throws Exception {
-    Parser<TestRequired> parser = TestRequired.PARSER;
-    final String errorString =
-        "Should throw exceptions when the parsed message isn't initialized.";
-
-    // TestRequired.b and TestRequired.c are not set.
-    TestRequired partialMessage = TestRequired.newBuilder()
-        .setA(1).buildPartial();
-
-    // parsePartialFrom should pass.
-    byte[] data = partialMessage.toByteArray();
-    assertEquals(partialMessage, parser.parsePartialFrom(data));
-    assertEquals(partialMessage, parser.parsePartialFrom(
-        partialMessage.toByteString()));
-    assertEquals(partialMessage, parser.parsePartialFrom(
-        new ByteArrayInputStream(data)));
-    assertEquals(partialMessage, parser.parsePartialFrom(
-        CodedInputStream.newInstance(data)));
-
-    // parseFrom(ByteArray)
-    try {
-      parser.parseFrom(partialMessage.toByteArray());
-      fail(errorString);
-    } catch (InvalidProtocolBufferException e) {
-      // pass.
-    }
-
-    // parseFrom(ByteString)
-    try {
-      parser.parseFrom(partialMessage.toByteString());
-      fail(errorString);
-    } catch (InvalidProtocolBufferException e) {
-      // pass.
-    }
-
-    // parseFrom(InputStream)
-    try {
-      parser.parseFrom(new ByteArrayInputStream(partialMessage.toByteArray()));
-      fail(errorString);
-    } catch (IOException e) {
-      // pass.
-    }
-
-    // parseFrom(CodedInputStream)
-    try {
-      parser.parseFrom(CodedInputStream.newInstance(
-          partialMessage.toByteArray()));
-      fail(errorString);
-    } catch (IOException e) {
-      // pass.
-    }
-  }
-
-  public void testParseDelimitedTo() throws Exception {
-    // Write normal Message.
-    TestAllTypes normalMessage = TestUtil.getAllSet();
-    ByteArrayOutputStream output = new ByteArrayOutputStream();
-    normalMessage.writeDelimitedTo(output);
-
-    InputStream input = new ByteArrayInputStream(output.toByteArray());
-    assertMessageEquals(
-        normalMessage,
-        normalMessage.getParserForType().parseDelimitedFrom(input));
-  }
-
-  public void testParseUnknownFields() throws Exception {
-    // All fields will be treated as unknown fields in emptyMessage.
-    TestEmptyMessage emptyMessage = TestEmptyMessage.PARSER.parseFrom(
-        TestUtil.getAllSet().toByteString());
-    assertEquals(
-        TestUtil.getAllSet().toByteString(),
-        emptyMessage.toByteString());
-  }
-
-  public void testOptimizeForSize() throws Exception {
-    TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder();
-    builder.setI(12).setMsg(ForeignMessage.newBuilder().setC(34).build());
-    builder.setExtension(TestOptimizedForSize.testExtension, 56);
-    builder.setExtension(TestOptimizedForSize.testExtension2,
-        TestRequiredOptimizedForSize.newBuilder().setX(78).build());
-
-    TestOptimizedForSize message = builder.build();
-    ExtensionRegistry registry = ExtensionRegistry.newInstance();
-    UnittestOptimizeFor.registerAllExtensions(registry);
-
-    assertRoundTripEquals(message, registry);
-  }
-
-  /** Helper method for {@link #testParsingMerge()}.*/
-  private void assertMessageMerged(TestAllTypes allTypes)
-      throws Exception {
-    assertEquals(3, allTypes.getOptionalInt32());
-    assertEquals(2, allTypes.getOptionalInt64());
-    assertEquals("hello", allTypes.getOptionalString());
-  }
-
-  public void testParsingMerge() throws Exception {
-    // Build messages.
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestAllTypes msg1 = builder.setOptionalInt32(1).build();
-    builder.clear();
-    TestAllTypes msg2 = builder.setOptionalInt64(2).build();
-    builder.clear();
-    TestAllTypes msg3 = builder.setOptionalInt32(3)
-        .setOptionalString("hello").build();
-
-    // Build groups.
-    TestParsingMerge.RepeatedFieldsGenerator.Group1 optionalG1 =
-        TestParsingMerge.RepeatedFieldsGenerator.Group1.newBuilder()
-        .setField1(msg1).build();
-    TestParsingMerge.RepeatedFieldsGenerator.Group1 optionalG2 =
-        TestParsingMerge.RepeatedFieldsGenerator.Group1.newBuilder()
-        .setField1(msg2).build();
-    TestParsingMerge.RepeatedFieldsGenerator.Group1 optionalG3 =
-        TestParsingMerge.RepeatedFieldsGenerator.Group1.newBuilder()
-        .setField1(msg3).build();
-    TestParsingMerge.RepeatedFieldsGenerator.Group2 repeatedG1 =
-        TestParsingMerge.RepeatedFieldsGenerator.Group2.newBuilder()
-        .setField1(msg1).build();
-    TestParsingMerge.RepeatedFieldsGenerator.Group2 repeatedG2 =
-        TestParsingMerge.RepeatedFieldsGenerator.Group2.newBuilder()
-        .setField1(msg2).build();
-    TestParsingMerge.RepeatedFieldsGenerator.Group2 repeatedG3 =
-        TestParsingMerge.RepeatedFieldsGenerator.Group2.newBuilder()
-        .setField1(msg3).build();
-
-    // Assign and serialize RepeatedFieldsGenerator.
-    ByteString data = TestParsingMerge.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 TestParsingMerge.
-    ExtensionRegistry registry = ExtensionRegistry.newInstance();
-    UnittestProto.registerAllExtensions(registry);
-    TestParsingMerge parsingMerge =
-        TestParsingMerge.PARSER.parseFrom(data, registry);
-
-    // Required and optional fields should be merged.
-    assertMessageMerged(parsingMerge.getRequiredAllTypes());
-    assertMessageMerged(parsingMerge.getOptionalAllTypes());
-    assertMessageMerged(
-        parsingMerge.getOptionalGroup().getOptionalGroupAllTypes());
-    assertMessageMerged(parsingMerge.getExtension(
-        TestParsingMerge.optionalExt));
-
-    // Repeated fields should not be merged.
-    assertEquals(3, parsingMerge.getRepeatedAllTypesCount());
-    assertEquals(3, parsingMerge.getRepeatedGroupCount());
-    assertEquals(3, parsingMerge.getExtensionCount(
-        TestParsingMerge.repeatedExt));
-  }
-
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/RopeByteStringSubstringTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/RopeByteStringSubstringTest.java
deleted file mode 100644
index 3c1f503..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/RopeByteStringSubstringTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import java.io.UnsupportedEncodingException;
-import java.util.Iterator;
-
-/**
- * This class tests {@link RopeByteString#substring(int, int)} by inheriting the tests from
- * {@link LiteralByteStringTest}.  Only a couple of methods are overridden.  
- *
- * @author carlanton@google.com (Carl Haverl)
- */
-public class RopeByteStringSubstringTest extends LiteralByteStringTest {
-
-  @Override
-  protected void setUp() throws Exception {
-    classUnderTest = "RopeByteString";
-    byte[] sourceBytes = ByteStringTest.getTestBytes(22341, 22337766L);
-    Iterator<ByteString> iter = ByteStringTest.makeConcretePieces(sourceBytes).iterator();
-    ByteString sourceString = iter.next();
-    while (iter.hasNext()) {
-      sourceString = sourceString.concat(iter.next());
-    }
-
-    int from = 1130;
-    int to = sourceBytes.length - 5555;
-    stringUnderTest = sourceString.substring(from, to);
-    referenceBytes = new byte[to - from];
-    System.arraycopy(sourceBytes, from, referenceBytes, 0, to - from);
-    expectedHashCode = -1259260680;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/RopeByteStringTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/RopeByteStringTest.java
deleted file mode 100644
index 8caeadd..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/RopeByteStringTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import java.io.UnsupportedEncodingException;
-import java.util.Arrays;
-import java.util.Iterator;
-
-/**
- * This class tests {@link RopeByteString} by inheriting the tests from
- * {@link LiteralByteStringTest}.  Only a couple of methods are overridden.
- * 
- * <p>A full test of the result of {@link RopeByteString#substring(int, int)} is found in the
- * separate class {@link RopeByteStringSubstringTest}.
- *
- * @author carlanton@google.com (Carl Haverl)
- */
-public class RopeByteStringTest extends LiteralByteStringTest {
-
-  @Override
-  protected void setUp() throws Exception {
-    classUnderTest = "RopeByteString";
-    referenceBytes = ByteStringTest.getTestBytes(22341, 22337766L);
-    Iterator<ByteString> iter = ByteStringTest.makeConcretePieces(referenceBytes).iterator();
-    stringUnderTest = iter.next();
-    while (iter.hasNext()) {
-      stringUnderTest = stringUnderTest.concat(iter.next());
-    }
-    expectedHashCode = -1214197238;
-  }
-
-  public void testBalance() {
-    int numberOfPieces = 10000;
-    int pieceSize = 64;
-    byte[] testBytes = ByteStringTest.getTestBytes(numberOfPieces * pieceSize, 113377L);
-
-    // Build up a big ByteString from smaller pieces to force a rebalance
-    ByteString concatenated = ByteString.EMPTY;
-    for (int i = 0; i < numberOfPieces; ++i) {
-      concatenated = concatenated.concat(ByteString.copyFrom(testBytes, i * pieceSize, pieceSize));
-    }
-
-    assertEquals(classUnderTest + " from string must have the expected type",
-        classUnderTest, getActualClassName(concatenated));
-    assertTrue(classUnderTest + " underlying bytes must match after balancing",
-        Arrays.equals(testBytes, concatenated.toByteArray()));
-    ByteString testString = ByteString.copyFrom(testBytes);
-    assertTrue(classUnderTest + " balanced string must equal flat string",
-        concatenated.equals(testString));
-    assertTrue(classUnderTest + " flat string must equal balanced string",
-        testString.equals(concatenated));
-    assertEquals(classUnderTest + " balanced string must have same hash code as flat string",
-        testString.hashCode(), concatenated.hashCode());
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ServiceTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ServiceTest.java
deleted file mode 100644
index 4c7f751..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/ServiceTest.java
+++ /dev/null
@@ -1,321 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import com.google.protobuf.Descriptors.FileDescriptor;
-import com.google.protobuf.Descriptors.MethodDescriptor;
-import google.protobuf.no_generic_services_test.UnittestNoGenericServices;
-import protobuf_unittest.MessageWithNoOuter;
-import protobuf_unittest.ServiceWithNoOuter;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestService;
-import protobuf_unittest.UnittestProto.FooRequest;
-import protobuf_unittest.UnittestProto.FooResponse;
-import protobuf_unittest.UnittestProto.BarRequest;
-import protobuf_unittest.UnittestProto.BarResponse;
-
-import org.easymock.classextension.EasyMock;
-import org.easymock.classextension.IMocksControl;
-import org.easymock.IArgumentMatcher;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-/**
- * Tests services and stubs.
- *
- * @author kenton@google.com Kenton Varda
- */
-public class ServiceTest extends TestCase {
-  private IMocksControl control;
-  private RpcController mockController;
-
-  private final Descriptors.MethodDescriptor fooDescriptor =
-    TestService.getDescriptor().getMethods().get(0);
-  private final Descriptors.MethodDescriptor barDescriptor =
-    TestService.getDescriptor().getMethods().get(1);
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-    control = EasyMock.createStrictControl();
-    mockController = control.createMock(RpcController.class);
-  }
-
-  // =================================================================
-
-  /** Tests Service.callMethod(). */
-  public void testCallMethod() throws Exception {
-    FooRequest fooRequest = FooRequest.newBuilder().build();
-    BarRequest barRequest = BarRequest.newBuilder().build();
-    MockCallback<Message> fooCallback = new MockCallback<Message>();
-    MockCallback<Message> barCallback = new MockCallback<Message>();
-    TestService mockService = control.createMock(TestService.class);
-
-    mockService.foo(EasyMock.same(mockController), EasyMock.same(fooRequest),
-                    this.<FooResponse>wrapsCallback(fooCallback));
-    mockService.bar(EasyMock.same(mockController), EasyMock.same(barRequest),
-                    this.<BarResponse>wrapsCallback(barCallback));
-    control.replay();
-
-    mockService.callMethod(fooDescriptor, mockController,
-                           fooRequest, fooCallback);
-    mockService.callMethod(barDescriptor, mockController,
-                           barRequest, barCallback);
-    control.verify();
-  }
-
-  /** Tests Service.get{Request,Response}Prototype(). */
-  public void testGetPrototype() throws Exception {
-    TestService mockService = control.createMock(TestService.class);
-
-    assertSame(mockService.getRequestPrototype(fooDescriptor),
-               FooRequest.getDefaultInstance());
-    assertSame(mockService.getResponsePrototype(fooDescriptor),
-               FooResponse.getDefaultInstance());
-    assertSame(mockService.getRequestPrototype(barDescriptor),
-               BarRequest.getDefaultInstance());
-    assertSame(mockService.getResponsePrototype(barDescriptor),
-               BarResponse.getDefaultInstance());
-  }
-
-  /** Tests generated stubs. */
-  public void testStub() throws Exception {
-    FooRequest fooRequest = FooRequest.newBuilder().build();
-    BarRequest barRequest = BarRequest.newBuilder().build();
-    MockCallback<FooResponse> fooCallback = new MockCallback<FooResponse>();
-    MockCallback<BarResponse> barCallback = new MockCallback<BarResponse>();
-    RpcChannel mockChannel = control.createMock(RpcChannel.class);
-    TestService stub = TestService.newStub(mockChannel);
-
-    mockChannel.callMethod(
-      EasyMock.same(fooDescriptor),
-      EasyMock.same(mockController),
-      EasyMock.same(fooRequest),
-      EasyMock.same(FooResponse.getDefaultInstance()),
-      this.<Message>wrapsCallback(fooCallback));
-    mockChannel.callMethod(
-      EasyMock.same(barDescriptor),
-      EasyMock.same(mockController),
-      EasyMock.same(barRequest),
-      EasyMock.same(BarResponse.getDefaultInstance()),
-      this.<Message>wrapsCallback(barCallback));
-    control.replay();
-
-    stub.foo(mockController, fooRequest, fooCallback);
-    stub.bar(mockController, barRequest, barCallback);
-    control.verify();
-  }
-
-  /** Tests generated blocking stubs. */
-  public void testBlockingStub() throws Exception {
-    FooRequest fooRequest = FooRequest.newBuilder().build();
-    BarRequest barRequest = BarRequest.newBuilder().build();
-    BlockingRpcChannel mockChannel =
-        control.createMock(BlockingRpcChannel.class);
-    TestService.BlockingInterface stub =
-        TestService.newBlockingStub(mockChannel);
-
-    FooResponse fooResponse = FooResponse.newBuilder().build();
-    BarResponse barResponse = BarResponse.newBuilder().build();
-
-    EasyMock.expect(mockChannel.callBlockingMethod(
-      EasyMock.same(fooDescriptor),
-      EasyMock.same(mockController),
-      EasyMock.same(fooRequest),
-      EasyMock.same(FooResponse.getDefaultInstance()))).andReturn(fooResponse);
-    EasyMock.expect(mockChannel.callBlockingMethod(
-      EasyMock.same(barDescriptor),
-      EasyMock.same(mockController),
-      EasyMock.same(barRequest),
-      EasyMock.same(BarResponse.getDefaultInstance()))).andReturn(barResponse);
-    control.replay();
-
-    assertSame(fooResponse, stub.foo(mockController, fooRequest));
-    assertSame(barResponse, stub.bar(mockController, barRequest));
-    control.verify();
-  }
-
-  public void testNewReflectiveService() {
-    ServiceWithNoOuter.Interface impl =
-        control.createMock(ServiceWithNoOuter.Interface.class);
-    RpcController controller = control.createMock(RpcController.class);
-    Service service = ServiceWithNoOuter.newReflectiveService(impl);
-
-    MethodDescriptor fooMethod =
-        ServiceWithNoOuter.getDescriptor().findMethodByName("Foo");
-    MessageWithNoOuter request = MessageWithNoOuter.getDefaultInstance();
-    RpcCallback<Message> callback = new RpcCallback<Message>() {
-      public void run(Message parameter) {
-        // No reason this should be run.
-        fail();
-      }
-    };
-    RpcCallback<TestAllTypes> specializedCallback =
-        RpcUtil.specializeCallback(callback);
-
-    impl.foo(EasyMock.same(controller), EasyMock.same(request),
-        EasyMock.same(specializedCallback));
-    EasyMock.expectLastCall();
-
-    control.replay();
-
-    service.callMethod(fooMethod, controller, request, callback);
-
-    control.verify();
-  }
-
-  public void testNewReflectiveBlockingService() throws ServiceException {
-    ServiceWithNoOuter.BlockingInterface impl =
-        control.createMock(ServiceWithNoOuter.BlockingInterface.class);
-    RpcController controller = control.createMock(RpcController.class);
-    BlockingService service =
-        ServiceWithNoOuter.newReflectiveBlockingService(impl);
-
-    MethodDescriptor fooMethod =
-        ServiceWithNoOuter.getDescriptor().findMethodByName("Foo");
-    MessageWithNoOuter request = MessageWithNoOuter.getDefaultInstance();
-
-    TestAllTypes expectedResponse = TestAllTypes.getDefaultInstance();
-    EasyMock.expect(impl.foo(EasyMock.same(controller), EasyMock.same(request)))
-        .andReturn(expectedResponse);
-
-    control.replay();
-
-    Message response =
-        service.callBlockingMethod(fooMethod, controller, request);
-    assertEquals(expectedResponse, response);
-
-    control.verify();
-  }
-
-  public void testNoGenericServices() throws Exception {
-    // Non-services should be usable.
-    UnittestNoGenericServices.TestMessage message =
-      UnittestNoGenericServices.TestMessage.newBuilder()
-        .setA(123)
-        .setExtension(UnittestNoGenericServices.testExtension, 456)
-        .build();
-    assertEquals(123, message.getA());
-    assertEquals(1, UnittestNoGenericServices.TestEnum.FOO.getNumber());
-
-    // Build a list of the class names nested in UnittestNoGenericServices.
-    String outerName = "google.protobuf.no_generic_services_test." +
-                       "UnittestNoGenericServices";
-    Class<?> outerClass = Class.forName(outerName);
-
-    Set<String> innerClassNames = new HashSet<String>();
-    for (Class<?> innerClass : outerClass.getClasses()) {
-      String fullName = innerClass.getName();
-      // Figure out the unqualified name of the inner class.
-      // Note:  Surprisingly, the full name of an inner class will be separated
-      //   from the outer class name by a '$' rather than a '.'.  This is not
-      //   mentioned in the documentation for java.lang.Class.  I don't want to
-      //   make assumptions, so I'm just going to accept any character as the
-      //   separator.
-      assertTrue(fullName.startsWith(outerName));
-
-      if (!Service.class.isAssignableFrom(innerClass) &&
-          !Message.class.isAssignableFrom(innerClass) &&
-          !ProtocolMessageEnum.class.isAssignableFrom(innerClass)) {
-        // Ignore any classes not generated by the base code generator.
-        continue;
-      }
-
-      innerClassNames.add(fullName.substring(outerName.length() + 1));
-    }
-
-    // No service class should have been generated.
-    assertTrue(innerClassNames.contains("TestMessage"));
-    assertTrue(innerClassNames.contains("TestEnum"));
-    assertFalse(innerClassNames.contains("TestService"));
-
-    // But descriptors are there.
-    FileDescriptor file = UnittestNoGenericServices.getDescriptor();
-    assertEquals(1, file.getServices().size());
-    assertEquals("TestService", file.getServices().get(0).getName());
-    assertEquals(1, file.getServices().get(0).getMethods().size());
-    assertEquals("Foo",
-        file.getServices().get(0).getMethods().get(0).getName());
-  }
-
-  // =================================================================
-
-  /**
-   * wrapsCallback() is an EasyMock argument predicate.  wrapsCallback(c)
-   * matches a callback if calling that callback causes c to be called.
-   * In other words, c wraps the given callback.
-   */
-  private <Type extends Message> RpcCallback<Type> wrapsCallback(
-      MockCallback<?> callback) {
-    EasyMock.reportMatcher(new WrapsCallback(callback));
-    return null;
-  }
-
-  /** The parameter to wrapsCallback() must be a MockCallback. */
-  private static class MockCallback<Type extends Message>
-      implements RpcCallback<Type> {
-    private boolean called = false;
-
-    public boolean isCalled() { return called; }
-
-    public void reset() { called = false; }
-    public void run(Type message) { called = true; }
-  }
-
-  /** Implementation of the wrapsCallback() argument matcher. */
-  private static class WrapsCallback implements IArgumentMatcher {
-    private MockCallback<?> callback;
-
-    public WrapsCallback(MockCallback<?> callback) {
-      this.callback = callback;
-    }
-
-    @SuppressWarnings("unchecked")
-    public boolean matches(Object actual) {
-      if (!(actual instanceof RpcCallback)) {
-        return false;
-      }
-      RpcCallback actualCallback = (RpcCallback)actual;
-
-      callback.reset();
-      actualCallback.run(null);
-      return callback.isCalled();
-    }
-
-    public void appendTo(StringBuffer buffer) {
-      buffer.append("wrapsCallback(mockCallback)");
-    }
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TestBadIdentifiers.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TestBadIdentifiers.java
deleted file mode 100644
index 5086732..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TestBadIdentifiers.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import junit.framework.TestCase;
-
-/**
- * Tests that proto2 api generation doesn't cause compile errors when
- * compiling protocol buffers that have names that would otherwise conflict
- * if not fully qualified (like @Deprecated and @Override).
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class TestBadIdentifiers extends TestCase {
-
-  public void testCompilation() {
-    // If this compiles, it means the generation was correct.
-    TestBadIdentifiersProto.Deprecated.newBuilder();
-    TestBadIdentifiersProto.Override.newBuilder();
-  }
-
-  public void testGetDescriptor() {
-    Descriptors.FileDescriptor fileDescriptor =
-        TestBadIdentifiersProto.getDescriptor();
-    String descriptorField = TestBadIdentifiersProto.Descriptor
-        .getDefaultInstance().getDescriptor();
-    Descriptors.Descriptor protoDescriptor = TestBadIdentifiersProto.Descriptor
-        .getDefaultInstance().getDescriptorForType();
-    String nestedDescriptorField = TestBadIdentifiersProto.Descriptor
-        .NestedDescriptor.getDefaultInstance().getDescriptor();
-    Descriptors.Descriptor nestedProtoDescriptor = TestBadIdentifiersProto
-        .Descriptor.NestedDescriptor.getDefaultInstance()
-        .getDescriptorForType();
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TestUtil.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TestUtil.java
deleted file mode 100644
index a923483..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TestUtil.java
+++ /dev/null
@@ -1,3068 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto;
-
-// The static imports are to avoid 100+ char lines.  The following is roughly equivalent to
-// import static protobuf_unittest.UnittestProto.*;
-import static protobuf_unittest.UnittestProto.defaultInt32Extension;
-import static protobuf_unittest.UnittestProto.defaultInt64Extension;
-import static protobuf_unittest.UnittestProto.defaultUint32Extension;
-import static protobuf_unittest.UnittestProto.defaultUint64Extension;
-import static protobuf_unittest.UnittestProto.defaultSint32Extension;
-import static protobuf_unittest.UnittestProto.defaultSint64Extension;
-import static protobuf_unittest.UnittestProto.defaultFixed32Extension;
-import static protobuf_unittest.UnittestProto.defaultFixed64Extension;
-import static protobuf_unittest.UnittestProto.defaultSfixed32Extension;
-import static protobuf_unittest.UnittestProto.defaultSfixed64Extension;
-import static protobuf_unittest.UnittestProto.defaultFloatExtension;
-import static protobuf_unittest.UnittestProto.defaultDoubleExtension;
-import static protobuf_unittest.UnittestProto.defaultBoolExtension;
-import static protobuf_unittest.UnittestProto.defaultStringExtension;
-import static protobuf_unittest.UnittestProto.defaultBytesExtension;
-import static protobuf_unittest.UnittestProto.defaultNestedEnumExtension;
-import static protobuf_unittest.UnittestProto.defaultForeignEnumExtension;
-import static protobuf_unittest.UnittestProto.defaultImportEnumExtension;
-import static protobuf_unittest.UnittestProto.defaultStringPieceExtension;
-import static protobuf_unittest.UnittestProto.defaultCordExtension;
-
-import static protobuf_unittest.UnittestProto.optionalInt32Extension;
-import static protobuf_unittest.UnittestProto.optionalInt64Extension;
-import static protobuf_unittest.UnittestProto.optionalUint32Extension;
-import static protobuf_unittest.UnittestProto.optionalUint64Extension;
-import static protobuf_unittest.UnittestProto.optionalSint32Extension;
-import static protobuf_unittest.UnittestProto.optionalSint64Extension;
-import static protobuf_unittest.UnittestProto.optionalFixed32Extension;
-import static protobuf_unittest.UnittestProto.optionalFixed64Extension;
-import static protobuf_unittest.UnittestProto.optionalSfixed32Extension;
-import static protobuf_unittest.UnittestProto.optionalSfixed64Extension;
-import static protobuf_unittest.UnittestProto.optionalFloatExtension;
-import static protobuf_unittest.UnittestProto.optionalDoubleExtension;
-import static protobuf_unittest.UnittestProto.optionalBoolExtension;
-import static protobuf_unittest.UnittestProto.optionalStringExtension;
-import static protobuf_unittest.UnittestProto.optionalBytesExtension;
-import static protobuf_unittest.UnittestProto.optionalGroupExtension;
-import static protobuf_unittest.UnittestProto.optionalCordExtension;
-import static protobuf_unittest.UnittestProto.optionalForeignEnumExtension;
-import static protobuf_unittest.UnittestProto.optionalForeignMessageExtension;
-import static protobuf_unittest.UnittestProto.optionalImportEnumExtension;
-import static protobuf_unittest.UnittestProto.optionalImportMessageExtension;
-import static protobuf_unittest.UnittestProto.optionalNestedEnumExtension;
-import static protobuf_unittest.UnittestProto.optionalNestedMessageExtension;
-import static protobuf_unittest.UnittestProto.optionalPublicImportMessageExtension;
-import static protobuf_unittest.UnittestProto.optionalLazyMessageExtension;
-import static protobuf_unittest.UnittestProto.optionalStringPieceExtension;
-
-import static protobuf_unittest.UnittestProto.repeatedInt32Extension;
-import static protobuf_unittest.UnittestProto.repeatedInt64Extension;
-import static protobuf_unittest.UnittestProto.repeatedUint32Extension;
-import static protobuf_unittest.UnittestProto.repeatedUint64Extension;
-import static protobuf_unittest.UnittestProto.repeatedSint32Extension;
-import static protobuf_unittest.UnittestProto.repeatedSint64Extension;
-import static protobuf_unittest.UnittestProto.repeatedFixed32Extension;
-import static protobuf_unittest.UnittestProto.repeatedFixed64Extension;
-import static protobuf_unittest.UnittestProto.repeatedSfixed32Extension;
-import static protobuf_unittest.UnittestProto.repeatedSfixed64Extension;
-import static protobuf_unittest.UnittestProto.repeatedFloatExtension;
-import static protobuf_unittest.UnittestProto.repeatedDoubleExtension;
-import static protobuf_unittest.UnittestProto.repeatedBoolExtension;
-import static protobuf_unittest.UnittestProto.repeatedStringExtension;
-import static protobuf_unittest.UnittestProto.repeatedBytesExtension;
-import static protobuf_unittest.UnittestProto.repeatedGroupExtension;
-import static protobuf_unittest.UnittestProto.repeatedNestedMessageExtension;
-import static protobuf_unittest.UnittestProto.repeatedForeignMessageExtension;
-import static protobuf_unittest.UnittestProto.repeatedImportMessageExtension;
-import static protobuf_unittest.UnittestProto.repeatedLazyMessageExtension;
-import static protobuf_unittest.UnittestProto.repeatedNestedEnumExtension;
-import static protobuf_unittest.UnittestProto.repeatedForeignEnumExtension;
-import static protobuf_unittest.UnittestProto.repeatedImportEnumExtension;
-import static protobuf_unittest.UnittestProto.repeatedStringPieceExtension;
-import static protobuf_unittest.UnittestProto.repeatedCordExtension;
-
-import static protobuf_unittest.UnittestProto.OptionalGroup_extension;
-import static protobuf_unittest.UnittestProto.RepeatedGroup_extension;
-
-import static protobuf_unittest.UnittestProto.packedInt32Extension;
-import static protobuf_unittest.UnittestProto.packedInt64Extension;
-import static protobuf_unittest.UnittestProto.packedUint32Extension;
-import static protobuf_unittest.UnittestProto.packedUint64Extension;
-import static protobuf_unittest.UnittestProto.packedSint32Extension;
-import static protobuf_unittest.UnittestProto.packedSint64Extension;
-import static protobuf_unittest.UnittestProto.packedFixed32Extension;
-import static protobuf_unittest.UnittestProto.packedFixed64Extension;
-import static protobuf_unittest.UnittestProto.packedSfixed32Extension;
-import static protobuf_unittest.UnittestProto.packedSfixed64Extension;
-import static protobuf_unittest.UnittestProto.packedFloatExtension;
-import static protobuf_unittest.UnittestProto.packedDoubleExtension;
-import static protobuf_unittest.UnittestProto.packedBoolExtension;
-import static protobuf_unittest.UnittestProto.packedEnumExtension;
-
-
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllExtensionsOrBuilder;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
-import protobuf_unittest.UnittestProto.TestPackedExtensions;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-import protobuf_unittest.UnittestProto.TestUnpackedTypes;
-import protobuf_unittest.UnittestProto.ForeignMessage;
-import protobuf_unittest.UnittestProto.ForeignEnum;
-import com.google.protobuf.test.UnittestImport.ImportEnum;
-import com.google.protobuf.test.UnittestImport.ImportMessage;
-import com.google.protobuf.test.UnittestImportPublic.PublicImportMessage;
-
-import junit.framework.Assert;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * Contains methods for setting all fields of {@code TestAllTypes} to
- * some values as well as checking that all the fields are set to those values.
- * These are useful for testing various protocol message features, e.g.
- * set all fields of a message, serialize it, parse it, and check that all
- * fields are set.
- *
- * <p>This code is not to be used outside of {@code com.google.protobuf} and
- * subpackages.
- *
- * @author kenton@google.com Kenton Varda
- */
-public final class TestUtil {
-  private TestUtil() {}
-
-  /** Helper to convert a String to ByteString. */
-  static ByteString toBytes(String str) {
-    try {
-      return ByteString.copyFrom(str.getBytes("UTF-8"));
-    } catch(java.io.UnsupportedEncodingException e) {
-      throw new RuntimeException("UTF-8 not supported.", e);
-    }
-  }
-
-  /**
-   * Get a {@code TestAllTypes} with all fields set as they would be by
-   * {@link #setAllFields(TestAllTypes.Builder)}.
-   */
-  public static TestAllTypes getAllSet() {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    setAllFields(builder);
-    return builder.build();
-  }
-
-  /**
-   * Get a {@code TestAllTypes.Builder} with all fields set as they would be by
-   * {@link #setAllFields(TestAllTypes.Builder)}.
-   */
-  public static TestAllTypes.Builder getAllSetBuilder() {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    setAllFields(builder);
-    return builder;
-  }
-
-  /**
-   * Get a {@code TestAllExtensions} with all fields set as they would be by
-   * {@link #setAllExtensions(TestAllExtensions.Builder)}.
-   */
-  public static TestAllExtensions getAllExtensionsSet() {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    setAllExtensions(builder);
-    return builder.build();
-  }
-
-  public static TestPackedTypes getPackedSet() {
-    TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
-    setPackedFields(builder);
-    return builder.build();
-  }
-
-  public static TestUnpackedTypes getUnpackedSet() {
-    TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();
-    setUnpackedFields(builder);
-    return builder.build();
-  }
-
-  public static TestPackedExtensions getPackedExtensionsSet() {
-    TestPackedExtensions.Builder builder = TestPackedExtensions.newBuilder();
-    setPackedExtensions(builder);
-    return builder.build();
-  }
-
-  /**
-   * Set every field of {@code message} to the values expected by
-   * {@code assertAllFieldsSet()}.
-   */
-  public static void setAllFields(TestAllTypes.Builder message) {
-    message.setOptionalInt32   (101);
-    message.setOptionalInt64   (102);
-    message.setOptionalUint32  (103);
-    message.setOptionalUint64  (104);
-    message.setOptionalSint32  (105);
-    message.setOptionalSint64  (106);
-    message.setOptionalFixed32 (107);
-    message.setOptionalFixed64 (108);
-    message.setOptionalSfixed32(109);
-    message.setOptionalSfixed64(110);
-    message.setOptionalFloat   (111);
-    message.setOptionalDouble  (112);
-    message.setOptionalBool    (true);
-    message.setOptionalString  ("115");
-    message.setOptionalBytes   (toBytes("116"));
-
-    message.setOptionalGroup(
-      TestAllTypes.OptionalGroup.newBuilder().setA(117).build());
-    message.setOptionalNestedMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(118).build());
-    message.setOptionalForeignMessage(
-      ForeignMessage.newBuilder().setC(119).build());
-    message.setOptionalImportMessage(
-      ImportMessage.newBuilder().setD(120).build());
-    message.setOptionalPublicImportMessage(
-      PublicImportMessage.newBuilder().setE(126).build());
-    message.setOptionalLazyMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(127).build());
-
-    message.setOptionalNestedEnum (TestAllTypes.NestedEnum.BAZ);
-    message.setOptionalForeignEnum(ForeignEnum.FOREIGN_BAZ);
-    message.setOptionalImportEnum (ImportEnum.IMPORT_BAZ);
-
-    message.setOptionalStringPiece("124");
-    message.setOptionalCord("125");
-
-    // -----------------------------------------------------------------
-
-    message.addRepeatedInt32   (201);
-    message.addRepeatedInt64   (202);
-    message.addRepeatedUint32  (203);
-    message.addRepeatedUint64  (204);
-    message.addRepeatedSint32  (205);
-    message.addRepeatedSint64  (206);
-    message.addRepeatedFixed32 (207);
-    message.addRepeatedFixed64 (208);
-    message.addRepeatedSfixed32(209);
-    message.addRepeatedSfixed64(210);
-    message.addRepeatedFloat   (211);
-    message.addRepeatedDouble  (212);
-    message.addRepeatedBool    (true);
-    message.addRepeatedString  ("215");
-    message.addRepeatedBytes   (toBytes("216"));
-
-    message.addRepeatedGroup(
-      TestAllTypes.RepeatedGroup.newBuilder().setA(217).build());
-    message.addRepeatedNestedMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
-    message.addRepeatedForeignMessage(
-      ForeignMessage.newBuilder().setC(219).build());
-    message.addRepeatedImportMessage(
-      ImportMessage.newBuilder().setD(220).build());
-    message.addRepeatedLazyMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(227).build());
-
-    message.addRepeatedNestedEnum (TestAllTypes.NestedEnum.BAR);
-    message.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAR);
-    message.addRepeatedImportEnum (ImportEnum.IMPORT_BAR);
-
-    message.addRepeatedStringPiece("224");
-    message.addRepeatedCord("225");
-
-    // Add a second one of each field.
-    message.addRepeatedInt32   (301);
-    message.addRepeatedInt64   (302);
-    message.addRepeatedUint32  (303);
-    message.addRepeatedUint64  (304);
-    message.addRepeatedSint32  (305);
-    message.addRepeatedSint64  (306);
-    message.addRepeatedFixed32 (307);
-    message.addRepeatedFixed64 (308);
-    message.addRepeatedSfixed32(309);
-    message.addRepeatedSfixed64(310);
-    message.addRepeatedFloat   (311);
-    message.addRepeatedDouble  (312);
-    message.addRepeatedBool    (false);
-    message.addRepeatedString  ("315");
-    message.addRepeatedBytes   (toBytes("316"));
-
-    message.addRepeatedGroup(
-      TestAllTypes.RepeatedGroup.newBuilder().setA(317).build());
-    message.addRepeatedNestedMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(318).build());
-    message.addRepeatedForeignMessage(
-      ForeignMessage.newBuilder().setC(319).build());
-    message.addRepeatedImportMessage(
-      ImportMessage.newBuilder().setD(320).build());
-    message.addRepeatedLazyMessage(
-      TestAllTypes.NestedMessage.newBuilder().setBb(327).build());
-
-    message.addRepeatedNestedEnum (TestAllTypes.NestedEnum.BAZ);
-    message.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAZ);
-    message.addRepeatedImportEnum (ImportEnum.IMPORT_BAZ);
-
-    message.addRepeatedStringPiece("324");
-    message.addRepeatedCord("325");
-
-    // -----------------------------------------------------------------
-
-    message.setDefaultInt32   (401);
-    message.setDefaultInt64   (402);
-    message.setDefaultUint32  (403);
-    message.setDefaultUint64  (404);
-    message.setDefaultSint32  (405);
-    message.setDefaultSint64  (406);
-    message.setDefaultFixed32 (407);
-    message.setDefaultFixed64 (408);
-    message.setDefaultSfixed32(409);
-    message.setDefaultSfixed64(410);
-    message.setDefaultFloat   (411);
-    message.setDefaultDouble  (412);
-    message.setDefaultBool    (false);
-    message.setDefaultString  ("415");
-    message.setDefaultBytes   (toBytes("416"));
-
-    message.setDefaultNestedEnum (TestAllTypes.NestedEnum.FOO);
-    message.setDefaultForeignEnum(ForeignEnum.FOREIGN_FOO);
-    message.setDefaultImportEnum (ImportEnum.IMPORT_FOO);
-
-    message.setDefaultStringPiece("424");
-    message.setDefaultCord("425");
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Modify the repeated fields of {@code message} to contain the values
-   * expected by {@code assertRepeatedFieldsModified()}.
-   */
-  public static void modifyRepeatedFields(TestAllTypes.Builder message) {
-    message.setRepeatedInt32   (1, 501);
-    message.setRepeatedInt64   (1, 502);
-    message.setRepeatedUint32  (1, 503);
-    message.setRepeatedUint64  (1, 504);
-    message.setRepeatedSint32  (1, 505);
-    message.setRepeatedSint64  (1, 506);
-    message.setRepeatedFixed32 (1, 507);
-    message.setRepeatedFixed64 (1, 508);
-    message.setRepeatedSfixed32(1, 509);
-    message.setRepeatedSfixed64(1, 510);
-    message.setRepeatedFloat   (1, 511);
-    message.setRepeatedDouble  (1, 512);
-    message.setRepeatedBool    (1, true);
-    message.setRepeatedString  (1, "515");
-    message.setRepeatedBytes   (1, toBytes("516"));
-
-    message.setRepeatedGroup(1,
-      TestAllTypes.RepeatedGroup.newBuilder().setA(517).build());
-    message.setRepeatedNestedMessage(1,
-      TestAllTypes.NestedMessage.newBuilder().setBb(518).build());
-    message.setRepeatedForeignMessage(1,
-      ForeignMessage.newBuilder().setC(519).build());
-    message.setRepeatedImportMessage(1,
-      ImportMessage.newBuilder().setD(520).build());
-    message.setRepeatedLazyMessage(1,
-      TestAllTypes.NestedMessage.newBuilder().setBb(527).build());
-
-    message.setRepeatedNestedEnum (1, TestAllTypes.NestedEnum.FOO);
-    message.setRepeatedForeignEnum(1, ForeignEnum.FOREIGN_FOO);
-    message.setRepeatedImportEnum (1, ImportEnum.IMPORT_FOO);
-
-    message.setRepeatedStringPiece(1, "524");
-    message.setRepeatedCord(1, "525");
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all fields of
-   * {@code message} are set to the values assigned by {@code setAllFields}.
-   */
-  public static void assertAllFieldsSet(TestAllTypesOrBuilder message) {
-    Assert.assertTrue(message.hasOptionalInt32   ());
-    Assert.assertTrue(message.hasOptionalInt64   ());
-    Assert.assertTrue(message.hasOptionalUint32  ());
-    Assert.assertTrue(message.hasOptionalUint64  ());
-    Assert.assertTrue(message.hasOptionalSint32  ());
-    Assert.assertTrue(message.hasOptionalSint64  ());
-    Assert.assertTrue(message.hasOptionalFixed32 ());
-    Assert.assertTrue(message.hasOptionalFixed64 ());
-    Assert.assertTrue(message.hasOptionalSfixed32());
-    Assert.assertTrue(message.hasOptionalSfixed64());
-    Assert.assertTrue(message.hasOptionalFloat   ());
-    Assert.assertTrue(message.hasOptionalDouble  ());
-    Assert.assertTrue(message.hasOptionalBool    ());
-    Assert.assertTrue(message.hasOptionalString  ());
-    Assert.assertTrue(message.hasOptionalBytes   ());
-
-    Assert.assertTrue(message.hasOptionalGroup         ());
-    Assert.assertTrue(message.hasOptionalNestedMessage ());
-    Assert.assertTrue(message.hasOptionalForeignMessage());
-    Assert.assertTrue(message.hasOptionalImportMessage ());
-
-    Assert.assertTrue(message.getOptionalGroup         ().hasA());
-    Assert.assertTrue(message.getOptionalNestedMessage ().hasBb());
-    Assert.assertTrue(message.getOptionalForeignMessage().hasC());
-    Assert.assertTrue(message.getOptionalImportMessage ().hasD());
-
-    Assert.assertTrue(message.hasOptionalNestedEnum ());
-    Assert.assertTrue(message.hasOptionalForeignEnum());
-    Assert.assertTrue(message.hasOptionalImportEnum ());
-
-    Assert.assertTrue(message.hasOptionalStringPiece());
-    Assert.assertTrue(message.hasOptionalCord());
-
-    Assert.assertEquals(101  , message.getOptionalInt32   ());
-    Assert.assertEquals(102  , message.getOptionalInt64   ());
-    Assert.assertEquals(103  , message.getOptionalUint32  ());
-    Assert.assertEquals(104  , message.getOptionalUint64  ());
-    Assert.assertEquals(105  , message.getOptionalSint32  ());
-    Assert.assertEquals(106  , message.getOptionalSint64  ());
-    Assert.assertEquals(107  , message.getOptionalFixed32 ());
-    Assert.assertEquals(108  , message.getOptionalFixed64 ());
-    Assert.assertEquals(109  , message.getOptionalSfixed32());
-    Assert.assertEquals(110  , message.getOptionalSfixed64());
-    Assert.assertEquals(111  , message.getOptionalFloat   (), 0.0);
-    Assert.assertEquals(112  , message.getOptionalDouble  (), 0.0);
-    Assert.assertEquals(true , message.getOptionalBool    ());
-    Assert.assertEquals("115", message.getOptionalString  ());
-    Assert.assertEquals(toBytes("116"), message.getOptionalBytes());
-
-    Assert.assertEquals(117, message.getOptionalGroup              ().getA());
-    Assert.assertEquals(118, message.getOptionalNestedMessage      ().getBb());
-    Assert.assertEquals(119, message.getOptionalForeignMessage     ().getC());
-    Assert.assertEquals(120, message.getOptionalImportMessage      ().getD());
-    Assert.assertEquals(126, message.getOptionalPublicImportMessage().getE());
-    Assert.assertEquals(127, message.getOptionalLazyMessage        ().getBb());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.BAZ, message.getOptionalNestedEnum());
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getOptionalForeignEnum());
-    Assert.assertEquals(ImportEnum.IMPORT_BAZ, message.getOptionalImportEnum());
-
-    Assert.assertEquals("124", message.getOptionalStringPiece());
-    Assert.assertEquals("125", message.getOptionalCord());
-
-    // -----------------------------------------------------------------
-
-    Assert.assertEquals(2, message.getRepeatedInt32Count   ());
-    Assert.assertEquals(2, message.getRepeatedInt64Count   ());
-    Assert.assertEquals(2, message.getRepeatedUint32Count  ());
-    Assert.assertEquals(2, message.getRepeatedUint64Count  ());
-    Assert.assertEquals(2, message.getRepeatedSint32Count  ());
-    Assert.assertEquals(2, message.getRepeatedSint64Count  ());
-    Assert.assertEquals(2, message.getRepeatedFixed32Count ());
-    Assert.assertEquals(2, message.getRepeatedFixed64Count ());
-    Assert.assertEquals(2, message.getRepeatedSfixed32Count());
-    Assert.assertEquals(2, message.getRepeatedSfixed64Count());
-    Assert.assertEquals(2, message.getRepeatedFloatCount   ());
-    Assert.assertEquals(2, message.getRepeatedDoubleCount  ());
-    Assert.assertEquals(2, message.getRepeatedBoolCount    ());
-    Assert.assertEquals(2, message.getRepeatedStringCount  ());
-    Assert.assertEquals(2, message.getRepeatedBytesCount   ());
-
-    Assert.assertEquals(2, message.getRepeatedGroupCount         ());
-    Assert.assertEquals(2, message.getRepeatedNestedMessageCount ());
-    Assert.assertEquals(2, message.getRepeatedForeignMessageCount());
-    Assert.assertEquals(2, message.getRepeatedImportMessageCount ());
-    Assert.assertEquals(2, message.getRepeatedLazyMessageCount   ());
-    Assert.assertEquals(2, message.getRepeatedNestedEnumCount    ());
-    Assert.assertEquals(2, message.getRepeatedForeignEnumCount   ());
-    Assert.assertEquals(2, message.getRepeatedImportEnumCount    ());
-
-    Assert.assertEquals(2, message.getRepeatedStringPieceCount());
-    Assert.assertEquals(2, message.getRepeatedCordCount());
-
-    Assert.assertEquals(201  , message.getRepeatedInt32   (0));
-    Assert.assertEquals(202  , message.getRepeatedInt64   (0));
-    Assert.assertEquals(203  , message.getRepeatedUint32  (0));
-    Assert.assertEquals(204  , message.getRepeatedUint64  (0));
-    Assert.assertEquals(205  , message.getRepeatedSint32  (0));
-    Assert.assertEquals(206  , message.getRepeatedSint64  (0));
-    Assert.assertEquals(207  , message.getRepeatedFixed32 (0));
-    Assert.assertEquals(208  , message.getRepeatedFixed64 (0));
-    Assert.assertEquals(209  , message.getRepeatedSfixed32(0));
-    Assert.assertEquals(210  , message.getRepeatedSfixed64(0));
-    Assert.assertEquals(211  , message.getRepeatedFloat   (0), 0.0);
-    Assert.assertEquals(212  , message.getRepeatedDouble  (0), 0.0);
-    Assert.assertEquals(true , message.getRepeatedBool    (0));
-    Assert.assertEquals("215", message.getRepeatedString  (0));
-    Assert.assertEquals(toBytes("216"), message.getRepeatedBytes(0));
-
-    Assert.assertEquals(217, message.getRepeatedGroup         (0).getA());
-    Assert.assertEquals(218, message.getRepeatedNestedMessage (0).getBb());
-    Assert.assertEquals(219, message.getRepeatedForeignMessage(0).getC());
-    Assert.assertEquals(220, message.getRepeatedImportMessage (0).getD());
-    Assert.assertEquals(227, message.getRepeatedLazyMessage   (0).getBb());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getRepeatedNestedEnum (0));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getRepeatedForeignEnum(0));
-    Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getRepeatedImportEnum(0));
-
-    Assert.assertEquals("224", message.getRepeatedStringPiece(0));
-    Assert.assertEquals("225", message.getRepeatedCord(0));
-
-    Assert.assertEquals(301  , message.getRepeatedInt32   (1));
-    Assert.assertEquals(302  , message.getRepeatedInt64   (1));
-    Assert.assertEquals(303  , message.getRepeatedUint32  (1));
-    Assert.assertEquals(304  , message.getRepeatedUint64  (1));
-    Assert.assertEquals(305  , message.getRepeatedSint32  (1));
-    Assert.assertEquals(306  , message.getRepeatedSint64  (1));
-    Assert.assertEquals(307  , message.getRepeatedFixed32 (1));
-    Assert.assertEquals(308  , message.getRepeatedFixed64 (1));
-    Assert.assertEquals(309  , message.getRepeatedSfixed32(1));
-    Assert.assertEquals(310  , message.getRepeatedSfixed64(1));
-    Assert.assertEquals(311  , message.getRepeatedFloat   (1), 0.0);
-    Assert.assertEquals(312  , message.getRepeatedDouble  (1), 0.0);
-    Assert.assertEquals(false, message.getRepeatedBool    (1));
-    Assert.assertEquals("315", message.getRepeatedString  (1));
-    Assert.assertEquals(toBytes("316"), message.getRepeatedBytes(1));
-
-    Assert.assertEquals(317, message.getRepeatedGroup         (1).getA());
-    Assert.assertEquals(318, message.getRepeatedNestedMessage (1).getBb());
-    Assert.assertEquals(319, message.getRepeatedForeignMessage(1).getC());
-    Assert.assertEquals(320, message.getRepeatedImportMessage (1).getD());
-    Assert.assertEquals(327, message.getRepeatedLazyMessage   (1).getBb());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.BAZ, message.getRepeatedNestedEnum (1));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getRepeatedForeignEnum(1));
-    Assert.assertEquals(ImportEnum.IMPORT_BAZ, message.getRepeatedImportEnum(1));
-
-    Assert.assertEquals("324", message.getRepeatedStringPiece(1));
-    Assert.assertEquals("325", message.getRepeatedCord(1));
-
-    // -----------------------------------------------------------------
-
-    Assert.assertTrue(message.hasDefaultInt32   ());
-    Assert.assertTrue(message.hasDefaultInt64   ());
-    Assert.assertTrue(message.hasDefaultUint32  ());
-    Assert.assertTrue(message.hasDefaultUint64  ());
-    Assert.assertTrue(message.hasDefaultSint32  ());
-    Assert.assertTrue(message.hasDefaultSint64  ());
-    Assert.assertTrue(message.hasDefaultFixed32 ());
-    Assert.assertTrue(message.hasDefaultFixed64 ());
-    Assert.assertTrue(message.hasDefaultSfixed32());
-    Assert.assertTrue(message.hasDefaultSfixed64());
-    Assert.assertTrue(message.hasDefaultFloat   ());
-    Assert.assertTrue(message.hasDefaultDouble  ());
-    Assert.assertTrue(message.hasDefaultBool    ());
-    Assert.assertTrue(message.hasDefaultString  ());
-    Assert.assertTrue(message.hasDefaultBytes   ());
-
-    Assert.assertTrue(message.hasDefaultNestedEnum ());
-    Assert.assertTrue(message.hasDefaultForeignEnum());
-    Assert.assertTrue(message.hasDefaultImportEnum ());
-
-    Assert.assertTrue(message.hasDefaultStringPiece());
-    Assert.assertTrue(message.hasDefaultCord());
-
-    Assert.assertEquals(401  , message.getDefaultInt32   ());
-    Assert.assertEquals(402  , message.getDefaultInt64   ());
-    Assert.assertEquals(403  , message.getDefaultUint32  ());
-    Assert.assertEquals(404  , message.getDefaultUint64  ());
-    Assert.assertEquals(405  , message.getDefaultSint32  ());
-    Assert.assertEquals(406  , message.getDefaultSint64  ());
-    Assert.assertEquals(407  , message.getDefaultFixed32 ());
-    Assert.assertEquals(408  , message.getDefaultFixed64 ());
-    Assert.assertEquals(409  , message.getDefaultSfixed32());
-    Assert.assertEquals(410  , message.getDefaultSfixed64());
-    Assert.assertEquals(411  , message.getDefaultFloat   (), 0.0);
-    Assert.assertEquals(412  , message.getDefaultDouble  (), 0.0);
-    Assert.assertEquals(false, message.getDefaultBool    ());
-    Assert.assertEquals("415", message.getDefaultString  ());
-    Assert.assertEquals(toBytes("416"), message.getDefaultBytes());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getDefaultNestedEnum ());
-    Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getDefaultForeignEnum());
-    Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getDefaultImportEnum());
-
-    Assert.assertEquals("424", message.getDefaultStringPiece());
-    Assert.assertEquals("425", message.getDefaultCord());
-  }
-
-  // -------------------------------------------------------------------
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all fields of
-   * {@code message} are cleared, and that getting the fields returns their
-   * default values.
-   */
-  public static void assertClear(TestAllTypesOrBuilder message) {
-    // hasBlah() should initially be false for all optional fields.
-    Assert.assertFalse(message.hasOptionalInt32   ());
-    Assert.assertFalse(message.hasOptionalInt64   ());
-    Assert.assertFalse(message.hasOptionalUint32  ());
-    Assert.assertFalse(message.hasOptionalUint64  ());
-    Assert.assertFalse(message.hasOptionalSint32  ());
-    Assert.assertFalse(message.hasOptionalSint64  ());
-    Assert.assertFalse(message.hasOptionalFixed32 ());
-    Assert.assertFalse(message.hasOptionalFixed64 ());
-    Assert.assertFalse(message.hasOptionalSfixed32());
-    Assert.assertFalse(message.hasOptionalSfixed64());
-    Assert.assertFalse(message.hasOptionalFloat   ());
-    Assert.assertFalse(message.hasOptionalDouble  ());
-    Assert.assertFalse(message.hasOptionalBool    ());
-    Assert.assertFalse(message.hasOptionalString  ());
-    Assert.assertFalse(message.hasOptionalBytes   ());
-
-    Assert.assertFalse(message.hasOptionalGroup         ());
-    Assert.assertFalse(message.hasOptionalNestedMessage ());
-    Assert.assertFalse(message.hasOptionalForeignMessage());
-    Assert.assertFalse(message.hasOptionalImportMessage ());
-
-    Assert.assertFalse(message.hasOptionalNestedEnum ());
-    Assert.assertFalse(message.hasOptionalForeignEnum());
-    Assert.assertFalse(message.hasOptionalImportEnum ());
-
-    Assert.assertFalse(message.hasOptionalStringPiece());
-    Assert.assertFalse(message.hasOptionalCord());
-
-    // Optional fields without defaults are set to zero or something like it.
-    Assert.assertEquals(0    , message.getOptionalInt32   ());
-    Assert.assertEquals(0    , message.getOptionalInt64   ());
-    Assert.assertEquals(0    , message.getOptionalUint32  ());
-    Assert.assertEquals(0    , message.getOptionalUint64  ());
-    Assert.assertEquals(0    , message.getOptionalSint32  ());
-    Assert.assertEquals(0    , message.getOptionalSint64  ());
-    Assert.assertEquals(0    , message.getOptionalFixed32 ());
-    Assert.assertEquals(0    , message.getOptionalFixed64 ());
-    Assert.assertEquals(0    , message.getOptionalSfixed32());
-    Assert.assertEquals(0    , message.getOptionalSfixed64());
-    Assert.assertEquals(0    , message.getOptionalFloat   (), 0.0);
-    Assert.assertEquals(0    , message.getOptionalDouble  (), 0.0);
-    Assert.assertEquals(false, message.getOptionalBool    ());
-    Assert.assertEquals(""   , message.getOptionalString  ());
-    Assert.assertEquals(ByteString.EMPTY, message.getOptionalBytes());
-
-    // Embedded messages should also be clear.
-    Assert.assertFalse(message.getOptionalGroup              ().hasA());
-    Assert.assertFalse(message.getOptionalNestedMessage      ().hasBb());
-    Assert.assertFalse(message.getOptionalForeignMessage     ().hasC());
-    Assert.assertFalse(message.getOptionalImportMessage      ().hasD());
-    Assert.assertFalse(message.getOptionalPublicImportMessage().hasE());
-    Assert.assertFalse(message.getOptionalLazyMessage        ().hasBb());
-
-    Assert.assertEquals(0, message.getOptionalGroup              ().getA());
-    Assert.assertEquals(0, message.getOptionalNestedMessage      ().getBb());
-    Assert.assertEquals(0, message.getOptionalForeignMessage     ().getC());
-    Assert.assertEquals(0, message.getOptionalImportMessage      ().getD());
-    Assert.assertEquals(0, message.getOptionalPublicImportMessage().getE());
-    Assert.assertEquals(0, message.getOptionalLazyMessage        ().getBb());
-
-    // Enums without defaults are set to the first value in the enum.
-    Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getOptionalNestedEnum ());
-    Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getOptionalForeignEnum());
-    Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getOptionalImportEnum());
-
-    Assert.assertEquals("", message.getOptionalStringPiece());
-    Assert.assertEquals("", message.getOptionalCord());
-
-    // Repeated fields are empty.
-    Assert.assertEquals(0, message.getRepeatedInt32Count   ());
-    Assert.assertEquals(0, message.getRepeatedInt64Count   ());
-    Assert.assertEquals(0, message.getRepeatedUint32Count  ());
-    Assert.assertEquals(0, message.getRepeatedUint64Count  ());
-    Assert.assertEquals(0, message.getRepeatedSint32Count  ());
-    Assert.assertEquals(0, message.getRepeatedSint64Count  ());
-    Assert.assertEquals(0, message.getRepeatedFixed32Count ());
-    Assert.assertEquals(0, message.getRepeatedFixed64Count ());
-    Assert.assertEquals(0, message.getRepeatedSfixed32Count());
-    Assert.assertEquals(0, message.getRepeatedSfixed64Count());
-    Assert.assertEquals(0, message.getRepeatedFloatCount   ());
-    Assert.assertEquals(0, message.getRepeatedDoubleCount  ());
-    Assert.assertEquals(0, message.getRepeatedBoolCount    ());
-    Assert.assertEquals(0, message.getRepeatedStringCount  ());
-    Assert.assertEquals(0, message.getRepeatedBytesCount   ());
-
-    Assert.assertEquals(0, message.getRepeatedGroupCount         ());
-    Assert.assertEquals(0, message.getRepeatedNestedMessageCount ());
-    Assert.assertEquals(0, message.getRepeatedForeignMessageCount());
-    Assert.assertEquals(0, message.getRepeatedImportMessageCount ());
-    Assert.assertEquals(0, message.getRepeatedLazyMessageCount   ());
-    Assert.assertEquals(0, message.getRepeatedNestedEnumCount    ());
-    Assert.assertEquals(0, message.getRepeatedForeignEnumCount   ());
-    Assert.assertEquals(0, message.getRepeatedImportEnumCount    ());
-
-    Assert.assertEquals(0, message.getRepeatedStringPieceCount());
-    Assert.assertEquals(0, message.getRepeatedCordCount());
-
-    // hasBlah() should also be false for all default fields.
-    Assert.assertFalse(message.hasDefaultInt32   ());
-    Assert.assertFalse(message.hasDefaultInt64   ());
-    Assert.assertFalse(message.hasDefaultUint32  ());
-    Assert.assertFalse(message.hasDefaultUint64  ());
-    Assert.assertFalse(message.hasDefaultSint32  ());
-    Assert.assertFalse(message.hasDefaultSint64  ());
-    Assert.assertFalse(message.hasDefaultFixed32 ());
-    Assert.assertFalse(message.hasDefaultFixed64 ());
-    Assert.assertFalse(message.hasDefaultSfixed32());
-    Assert.assertFalse(message.hasDefaultSfixed64());
-    Assert.assertFalse(message.hasDefaultFloat   ());
-    Assert.assertFalse(message.hasDefaultDouble  ());
-    Assert.assertFalse(message.hasDefaultBool    ());
-    Assert.assertFalse(message.hasDefaultString  ());
-    Assert.assertFalse(message.hasDefaultBytes   ());
-
-    Assert.assertFalse(message.hasDefaultNestedEnum ());
-    Assert.assertFalse(message.hasDefaultForeignEnum());
-    Assert.assertFalse(message.hasDefaultImportEnum ());
-
-    Assert.assertFalse(message.hasDefaultStringPiece());
-    Assert.assertFalse(message.hasDefaultCord());
-
-    // Fields with defaults have their default values (duh).
-    Assert.assertEquals( 41    , message.getDefaultInt32   ());
-    Assert.assertEquals( 42    , message.getDefaultInt64   ());
-    Assert.assertEquals( 43    , message.getDefaultUint32  ());
-    Assert.assertEquals( 44    , message.getDefaultUint64  ());
-    Assert.assertEquals(-45    , message.getDefaultSint32  ());
-    Assert.assertEquals( 46    , message.getDefaultSint64  ());
-    Assert.assertEquals( 47    , message.getDefaultFixed32 ());
-    Assert.assertEquals( 48    , message.getDefaultFixed64 ());
-    Assert.assertEquals( 49    , message.getDefaultSfixed32());
-    Assert.assertEquals(-50    , message.getDefaultSfixed64());
-    Assert.assertEquals( 51.5  , message.getDefaultFloat   (), 0.0);
-    Assert.assertEquals( 52e3  , message.getDefaultDouble  (), 0.0);
-    Assert.assertEquals(true   , message.getDefaultBool    ());
-    Assert.assertEquals("hello", message.getDefaultString  ());
-    Assert.assertEquals(toBytes("world"), message.getDefaultBytes());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getDefaultNestedEnum ());
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getDefaultForeignEnum());
-    Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getDefaultImportEnum());
-
-    Assert.assertEquals("abc", message.getDefaultStringPiece());
-    Assert.assertEquals("123", message.getDefaultCord());
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all fields of
-   * {@code message} are set to the values assigned by {@code setAllFields}
-   * followed by {@code modifyRepeatedFields}.
-   */
-  public static void assertRepeatedFieldsModified(
-      TestAllTypesOrBuilder message) {
-    // 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.assertEquals(2, message.getRepeatedInt32Count   ());
-    Assert.assertEquals(2, message.getRepeatedInt64Count   ());
-    Assert.assertEquals(2, message.getRepeatedUint32Count  ());
-    Assert.assertEquals(2, message.getRepeatedUint64Count  ());
-    Assert.assertEquals(2, message.getRepeatedSint32Count  ());
-    Assert.assertEquals(2, message.getRepeatedSint64Count  ());
-    Assert.assertEquals(2, message.getRepeatedFixed32Count ());
-    Assert.assertEquals(2, message.getRepeatedFixed64Count ());
-    Assert.assertEquals(2, message.getRepeatedSfixed32Count());
-    Assert.assertEquals(2, message.getRepeatedSfixed64Count());
-    Assert.assertEquals(2, message.getRepeatedFloatCount   ());
-    Assert.assertEquals(2, message.getRepeatedDoubleCount  ());
-    Assert.assertEquals(2, message.getRepeatedBoolCount    ());
-    Assert.assertEquals(2, message.getRepeatedStringCount  ());
-    Assert.assertEquals(2, message.getRepeatedBytesCount   ());
-
-    Assert.assertEquals(2, message.getRepeatedGroupCount         ());
-    Assert.assertEquals(2, message.getRepeatedNestedMessageCount ());
-    Assert.assertEquals(2, message.getRepeatedForeignMessageCount());
-    Assert.assertEquals(2, message.getRepeatedImportMessageCount ());
-    Assert.assertEquals(2, message.getRepeatedLazyMessageCount   ());
-    Assert.assertEquals(2, message.getRepeatedNestedEnumCount    ());
-    Assert.assertEquals(2, message.getRepeatedForeignEnumCount   ());
-    Assert.assertEquals(2, message.getRepeatedImportEnumCount    ());
-
-    Assert.assertEquals(2, message.getRepeatedStringPieceCount());
-    Assert.assertEquals(2, message.getRepeatedCordCount());
-
-    Assert.assertEquals(201  , message.getRepeatedInt32   (0));
-    Assert.assertEquals(202L , message.getRepeatedInt64   (0));
-    Assert.assertEquals(203  , message.getRepeatedUint32  (0));
-    Assert.assertEquals(204L , message.getRepeatedUint64  (0));
-    Assert.assertEquals(205  , message.getRepeatedSint32  (0));
-    Assert.assertEquals(206L , message.getRepeatedSint64  (0));
-    Assert.assertEquals(207  , message.getRepeatedFixed32 (0));
-    Assert.assertEquals(208L , message.getRepeatedFixed64 (0));
-    Assert.assertEquals(209  , message.getRepeatedSfixed32(0));
-    Assert.assertEquals(210L , message.getRepeatedSfixed64(0));
-    Assert.assertEquals(211F , message.getRepeatedFloat   (0));
-    Assert.assertEquals(212D , message.getRepeatedDouble  (0));
-    Assert.assertEquals(true , message.getRepeatedBool    (0));
-    Assert.assertEquals("215", message.getRepeatedString  (0));
-    Assert.assertEquals(toBytes("216"), message.getRepeatedBytes(0));
-
-    Assert.assertEquals(217, message.getRepeatedGroup         (0).getA());
-    Assert.assertEquals(218, message.getRepeatedNestedMessage (0).getBb());
-    Assert.assertEquals(219, message.getRepeatedForeignMessage(0).getC());
-    Assert.assertEquals(220, message.getRepeatedImportMessage (0).getD());
-    Assert.assertEquals(227, message.getRepeatedLazyMessage   (0).getBb());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getRepeatedNestedEnum (0));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getRepeatedForeignEnum(0));
-    Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getRepeatedImportEnum(0));
-
-    Assert.assertEquals("224", message.getRepeatedStringPiece(0));
-    Assert.assertEquals("225", message.getRepeatedCord(0));
-
-    // Actually verify the second (modified) elements now.
-    Assert.assertEquals(501  , message.getRepeatedInt32   (1));
-    Assert.assertEquals(502L , message.getRepeatedInt64   (1));
-    Assert.assertEquals(503  , message.getRepeatedUint32  (1));
-    Assert.assertEquals(504L , message.getRepeatedUint64  (1));
-    Assert.assertEquals(505  , message.getRepeatedSint32  (1));
-    Assert.assertEquals(506L , message.getRepeatedSint64  (1));
-    Assert.assertEquals(507  , message.getRepeatedFixed32 (1));
-    Assert.assertEquals(508L , message.getRepeatedFixed64 (1));
-    Assert.assertEquals(509  , message.getRepeatedSfixed32(1));
-    Assert.assertEquals(510L , message.getRepeatedSfixed64(1));
-    Assert.assertEquals(511F , message.getRepeatedFloat   (1));
-    Assert.assertEquals(512D , message.getRepeatedDouble  (1));
-    Assert.assertEquals(true , message.getRepeatedBool    (1));
-    Assert.assertEquals("515", message.getRepeatedString  (1));
-    Assert.assertEquals(toBytes("516"), message.getRepeatedBytes(1));
-
-    Assert.assertEquals(517, message.getRepeatedGroup         (1).getA());
-    Assert.assertEquals(518, message.getRepeatedNestedMessage (1).getBb());
-    Assert.assertEquals(519, message.getRepeatedForeignMessage(1).getC());
-    Assert.assertEquals(520, message.getRepeatedImportMessage (1).getD());
-    Assert.assertEquals(527, message.getRepeatedLazyMessage   (1).getBb());
-
-    Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getRepeatedNestedEnum (1));
-    Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getRepeatedForeignEnum(1));
-    Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getRepeatedImportEnum(1));
-
-    Assert.assertEquals("524", message.getRepeatedStringPiece(1));
-    Assert.assertEquals("525", message.getRepeatedCord(1));
-  }
-
-  /**
-   * Set every field of {@code message} to a unique value.
-   */
-  public static void setPackedFields(TestPackedTypes.Builder message) {
-    message.addPackedInt32   (601);
-    message.addPackedInt64   (602);
-    message.addPackedUint32  (603);
-    message.addPackedUint64  (604);
-    message.addPackedSint32  (605);
-    message.addPackedSint64  (606);
-    message.addPackedFixed32 (607);
-    message.addPackedFixed64 (608);
-    message.addPackedSfixed32(609);
-    message.addPackedSfixed64(610);
-    message.addPackedFloat   (611);
-    message.addPackedDouble  (612);
-    message.addPackedBool    (true);
-    message.addPackedEnum    (ForeignEnum.FOREIGN_BAR);
-    // Add a second one of each field.
-    message.addPackedInt32   (701);
-    message.addPackedInt64   (702);
-    message.addPackedUint32  (703);
-    message.addPackedUint64  (704);
-    message.addPackedSint32  (705);
-    message.addPackedSint64  (706);
-    message.addPackedFixed32 (707);
-    message.addPackedFixed64 (708);
-    message.addPackedSfixed32(709);
-    message.addPackedSfixed64(710);
-    message.addPackedFloat   (711);
-    message.addPackedDouble  (712);
-    message.addPackedBool    (false);
-    message.addPackedEnum    (ForeignEnum.FOREIGN_BAZ);
-  }
-
-  /**
-   * Set every field of {@code message} to a unique value. Must correspond with
-   * the values applied by {@code setPackedFields}.
-   */
-  public static void setUnpackedFields(TestUnpackedTypes.Builder message) {
-    message.addUnpackedInt32   (601);
-    message.addUnpackedInt64   (602);
-    message.addUnpackedUint32  (603);
-    message.addUnpackedUint64  (604);
-    message.addUnpackedSint32  (605);
-    message.addUnpackedSint64  (606);
-    message.addUnpackedFixed32 (607);
-    message.addUnpackedFixed64 (608);
-    message.addUnpackedSfixed32(609);
-    message.addUnpackedSfixed64(610);
-    message.addUnpackedFloat   (611);
-    message.addUnpackedDouble  (612);
-    message.addUnpackedBool    (true);
-    message.addUnpackedEnum    (ForeignEnum.FOREIGN_BAR);
-    // Add a second one of each field.
-    message.addUnpackedInt32   (701);
-    message.addUnpackedInt64   (702);
-    message.addUnpackedUint32  (703);
-    message.addUnpackedUint64  (704);
-    message.addUnpackedSint32  (705);
-    message.addUnpackedSint64  (706);
-    message.addUnpackedFixed32 (707);
-    message.addUnpackedFixed64 (708);
-    message.addUnpackedSfixed32(709);
-    message.addUnpackedSfixed64(710);
-    message.addUnpackedFloat   (711);
-    message.addUnpackedDouble  (712);
-    message.addUnpackedBool    (false);
-    message.addUnpackedEnum    (ForeignEnum.FOREIGN_BAZ);
-  }
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all fields of
-   * {@code message} are set to the values assigned by {@code setPackedFields}.
-   */
-  public static void assertPackedFieldsSet(TestPackedTypes message) {
-    Assert.assertEquals(2, message.getPackedInt32Count   ());
-    Assert.assertEquals(2, message.getPackedInt64Count   ());
-    Assert.assertEquals(2, message.getPackedUint32Count  ());
-    Assert.assertEquals(2, message.getPackedUint64Count  ());
-    Assert.assertEquals(2, message.getPackedSint32Count  ());
-    Assert.assertEquals(2, message.getPackedSint64Count  ());
-    Assert.assertEquals(2, message.getPackedFixed32Count ());
-    Assert.assertEquals(2, message.getPackedFixed64Count ());
-    Assert.assertEquals(2, message.getPackedSfixed32Count());
-    Assert.assertEquals(2, message.getPackedSfixed64Count());
-    Assert.assertEquals(2, message.getPackedFloatCount   ());
-    Assert.assertEquals(2, message.getPackedDoubleCount  ());
-    Assert.assertEquals(2, message.getPackedBoolCount    ());
-    Assert.assertEquals(2, message.getPackedEnumCount   ());
-    Assert.assertEquals(601  , message.getPackedInt32   (0));
-    Assert.assertEquals(602  , message.getPackedInt64   (0));
-    Assert.assertEquals(603  , message.getPackedUint32  (0));
-    Assert.assertEquals(604  , message.getPackedUint64  (0));
-    Assert.assertEquals(605  , message.getPackedSint32  (0));
-    Assert.assertEquals(606  , message.getPackedSint64  (0));
-    Assert.assertEquals(607  , message.getPackedFixed32 (0));
-    Assert.assertEquals(608  , message.getPackedFixed64 (0));
-    Assert.assertEquals(609  , message.getPackedSfixed32(0));
-    Assert.assertEquals(610  , message.getPackedSfixed64(0));
-    Assert.assertEquals(611  , message.getPackedFloat   (0), 0.0);
-    Assert.assertEquals(612  , message.getPackedDouble  (0), 0.0);
-    Assert.assertEquals(true , message.getPackedBool    (0));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getPackedEnum(0));
-    Assert.assertEquals(701  , message.getPackedInt32   (1));
-    Assert.assertEquals(702  , message.getPackedInt64   (1));
-    Assert.assertEquals(703  , message.getPackedUint32  (1));
-    Assert.assertEquals(704  , message.getPackedUint64  (1));
-    Assert.assertEquals(705  , message.getPackedSint32  (1));
-    Assert.assertEquals(706  , message.getPackedSint64  (1));
-    Assert.assertEquals(707  , message.getPackedFixed32 (1));
-    Assert.assertEquals(708  , message.getPackedFixed64 (1));
-    Assert.assertEquals(709  , message.getPackedSfixed32(1));
-    Assert.assertEquals(710  , message.getPackedSfixed64(1));
-    Assert.assertEquals(711  , message.getPackedFloat   (1), 0.0);
-    Assert.assertEquals(712  , message.getPackedDouble  (1), 0.0);
-    Assert.assertEquals(false, message.getPackedBool    (1));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getPackedEnum(1));
-  }
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all fields of
-   * {@code message} are set to the values assigned by {@code setUnpackedFields}.
-   */
-  public static void assertUnpackedFieldsSet(TestUnpackedTypes message) {
-    Assert.assertEquals(2, message.getUnpackedInt32Count   ());
-    Assert.assertEquals(2, message.getUnpackedInt64Count   ());
-    Assert.assertEquals(2, message.getUnpackedUint32Count  ());
-    Assert.assertEquals(2, message.getUnpackedUint64Count  ());
-    Assert.assertEquals(2, message.getUnpackedSint32Count  ());
-    Assert.assertEquals(2, message.getUnpackedSint64Count  ());
-    Assert.assertEquals(2, message.getUnpackedFixed32Count ());
-    Assert.assertEquals(2, message.getUnpackedFixed64Count ());
-    Assert.assertEquals(2, message.getUnpackedSfixed32Count());
-    Assert.assertEquals(2, message.getUnpackedSfixed64Count());
-    Assert.assertEquals(2, message.getUnpackedFloatCount   ());
-    Assert.assertEquals(2, message.getUnpackedDoubleCount  ());
-    Assert.assertEquals(2, message.getUnpackedBoolCount    ());
-    Assert.assertEquals(2, message.getUnpackedEnumCount   ());
-    Assert.assertEquals(601  , message.getUnpackedInt32   (0));
-    Assert.assertEquals(602  , message.getUnpackedInt64   (0));
-    Assert.assertEquals(603  , message.getUnpackedUint32  (0));
-    Assert.assertEquals(604  , message.getUnpackedUint64  (0));
-    Assert.assertEquals(605  , message.getUnpackedSint32  (0));
-    Assert.assertEquals(606  , message.getUnpackedSint64  (0));
-    Assert.assertEquals(607  , message.getUnpackedFixed32 (0));
-    Assert.assertEquals(608  , message.getUnpackedFixed64 (0));
-    Assert.assertEquals(609  , message.getUnpackedSfixed32(0));
-    Assert.assertEquals(610  , message.getUnpackedSfixed64(0));
-    Assert.assertEquals(611  , message.getUnpackedFloat   (0), 0.0);
-    Assert.assertEquals(612  , message.getUnpackedDouble  (0), 0.0);
-    Assert.assertEquals(true , message.getUnpackedBool    (0));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getUnpackedEnum(0));
-    Assert.assertEquals(701  , message.getUnpackedInt32   (1));
-    Assert.assertEquals(702  , message.getUnpackedInt64   (1));
-    Assert.assertEquals(703  , message.getUnpackedUint32  (1));
-    Assert.assertEquals(704  , message.getUnpackedUint64  (1));
-    Assert.assertEquals(705  , message.getUnpackedSint32  (1));
-    Assert.assertEquals(706  , message.getUnpackedSint64  (1));
-    Assert.assertEquals(707  , message.getUnpackedFixed32 (1));
-    Assert.assertEquals(708  , message.getUnpackedFixed64 (1));
-    Assert.assertEquals(709  , message.getUnpackedSfixed32(1));
-    Assert.assertEquals(710  , message.getUnpackedSfixed64(1));
-    Assert.assertEquals(711  , message.getUnpackedFloat   (1), 0.0);
-    Assert.assertEquals(712  , message.getUnpackedDouble  (1), 0.0);
-    Assert.assertEquals(false, message.getUnpackedBool    (1));
-    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getUnpackedEnum(1));
-  }
-
-  // ===================================================================
-  // Like above, but for extensions
-
-  // Java gets confused with things like assertEquals(int, Integer):  it can't
-  // decide whether to call assertEquals(int, int) or assertEquals(Object,
-  // Object).  So we define these methods to help it.
-  private static void assertEqualsExactType(int a, int b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(long a, long b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(float a, float b) {
-    Assert.assertEquals(a, b, 0.0);
-  }
-  private static void assertEqualsExactType(double a, double b) {
-    Assert.assertEquals(a, b, 0.0);
-  }
-  private static void assertEqualsExactType(boolean a, boolean b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(String a, String b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(ByteString a, ByteString b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(TestAllTypes.NestedEnum a,
-                                            TestAllTypes.NestedEnum b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(ForeignEnum a, ForeignEnum b) {
-    Assert.assertEquals(a, b);
-  }
-  private static void assertEqualsExactType(ImportEnum a, ImportEnum b) {
-    Assert.assertEquals(a, b);
-  }
-  /**
-   * Get an unmodifiable {@link ExtensionRegistry} containing all the
-   * extensions of {@code TestAllExtensions}.
-   */
-  public static ExtensionRegistry getExtensionRegistry() {
-    ExtensionRegistry registry = ExtensionRegistry.newInstance();
-    registerAllExtensions(registry);
-    return registry.getUnmodifiable();
-  }
-
-
-  /**
-   * Register all of {@code TestAllExtensions}'s extensions with the
-   * given {@link ExtensionRegistry}.
-   */
-  public static void registerAllExtensions(ExtensionRegistry registry) {
-    UnittestProto.registerAllExtensions(registry);
-  }
-
-
-  /**
-   * Set every field of {@code message} to the values expected by
-   * {@code assertAllExtensionsSet()}.
-   */
-  public static void setAllExtensions(TestAllExtensions.Builder message) {
-    message.setExtension(optionalInt32Extension   , 101);
-    message.setExtension(optionalInt64Extension   , 102L);
-    message.setExtension(optionalUint32Extension  , 103);
-    message.setExtension(optionalUint64Extension  , 104L);
-    message.setExtension(optionalSint32Extension  , 105);
-    message.setExtension(optionalSint64Extension  , 106L);
-    message.setExtension(optionalFixed32Extension , 107);
-    message.setExtension(optionalFixed64Extension , 108L);
-    message.setExtension(optionalSfixed32Extension, 109);
-    message.setExtension(optionalSfixed64Extension, 110L);
-    message.setExtension(optionalFloatExtension   , 111F);
-    message.setExtension(optionalDoubleExtension  , 112D);
-    message.setExtension(optionalBoolExtension    , true);
-    message.setExtension(optionalStringExtension  , "115");
-    message.setExtension(optionalBytesExtension   , toBytes("116"));
-
-    message.setExtension(optionalGroupExtension,
-      OptionalGroup_extension.newBuilder().setA(117).build());
-    message.setExtension(optionalNestedMessageExtension,
-      TestAllTypes.NestedMessage.newBuilder().setBb(118).build());
-    message.setExtension(optionalForeignMessageExtension,
-      ForeignMessage.newBuilder().setC(119).build());
-    message.setExtension(optionalImportMessageExtension,
-      ImportMessage.newBuilder().setD(120).build());
-    message.setExtension(optionalPublicImportMessageExtension,
-      PublicImportMessage.newBuilder().setE(126).build());
-    message.setExtension(optionalLazyMessageExtension,
-      TestAllTypes.NestedMessage.newBuilder().setBb(127).build());
-
-    message.setExtension(optionalNestedEnumExtension, TestAllTypes.NestedEnum.BAZ);
-    message.setExtension(optionalForeignEnumExtension, ForeignEnum.FOREIGN_BAZ);
-    message.setExtension(optionalImportEnumExtension, ImportEnum.IMPORT_BAZ);
-
-    message.setExtension(optionalStringPieceExtension, "124");
-    message.setExtension(optionalCordExtension, "125");
-
-    // -----------------------------------------------------------------
-
-    message.addExtension(repeatedInt32Extension   , 201);
-    message.addExtension(repeatedInt64Extension   , 202L);
-    message.addExtension(repeatedUint32Extension  , 203);
-    message.addExtension(repeatedUint64Extension  , 204L);
-    message.addExtension(repeatedSint32Extension  , 205);
-    message.addExtension(repeatedSint64Extension  , 206L);
-    message.addExtension(repeatedFixed32Extension , 207);
-    message.addExtension(repeatedFixed64Extension , 208L);
-    message.addExtension(repeatedSfixed32Extension, 209);
-    message.addExtension(repeatedSfixed64Extension, 210L);
-    message.addExtension(repeatedFloatExtension   , 211F);
-    message.addExtension(repeatedDoubleExtension  , 212D);
-    message.addExtension(repeatedBoolExtension    , true);
-    message.addExtension(repeatedStringExtension  , "215");
-    message.addExtension(repeatedBytesExtension   , toBytes("216"));
-
-    message.addExtension(repeatedGroupExtension,
-      RepeatedGroup_extension.newBuilder().setA(217).build());
-    message.addExtension(repeatedNestedMessageExtension,
-      TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
-    message.addExtension(repeatedForeignMessageExtension,
-      ForeignMessage.newBuilder().setC(219).build());
-    message.addExtension(repeatedImportMessageExtension,
-      ImportMessage.newBuilder().setD(220).build());
-    message.addExtension(repeatedLazyMessageExtension,
-      TestAllTypes.NestedMessage.newBuilder().setBb(227).build());
-
-    message.addExtension(repeatedNestedEnumExtension, TestAllTypes.NestedEnum.BAR);
-    message.addExtension(repeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAR);
-    message.addExtension(repeatedImportEnumExtension, ImportEnum.IMPORT_BAR);
-
-    message.addExtension(repeatedStringPieceExtension, "224");
-    message.addExtension(repeatedCordExtension, "225");
-
-    // Add a second one of each field.
-    message.addExtension(repeatedInt32Extension   , 301);
-    message.addExtension(repeatedInt64Extension   , 302L);
-    message.addExtension(repeatedUint32Extension  , 303);
-    message.addExtension(repeatedUint64Extension  , 304L);
-    message.addExtension(repeatedSint32Extension  , 305);
-    message.addExtension(repeatedSint64Extension  , 306L);
-    message.addExtension(repeatedFixed32Extension , 307);
-    message.addExtension(repeatedFixed64Extension , 308L);
-    message.addExtension(repeatedSfixed32Extension, 309);
-    message.addExtension(repeatedSfixed64Extension, 310L);
-    message.addExtension(repeatedFloatExtension   , 311F);
-    message.addExtension(repeatedDoubleExtension  , 312D);
-    message.addExtension(repeatedBoolExtension    , false);
-    message.addExtension(repeatedStringExtension  , "315");
-    message.addExtension(repeatedBytesExtension   , toBytes("316"));
-
-    message.addExtension(repeatedGroupExtension,
-      RepeatedGroup_extension.newBuilder().setA(317).build());
-    message.addExtension(repeatedNestedMessageExtension,
-      TestAllTypes.NestedMessage.newBuilder().setBb(318).build());
-    message.addExtension(repeatedForeignMessageExtension,
-      ForeignMessage.newBuilder().setC(319).build());
-    message.addExtension(repeatedImportMessageExtension,
-      ImportMessage.newBuilder().setD(320).build());
-    message.addExtension(repeatedLazyMessageExtension,
-      TestAllTypes.NestedMessage.newBuilder().setBb(327).build());
-
-    message.addExtension(repeatedNestedEnumExtension, TestAllTypes.NestedEnum.BAZ);
-    message.addExtension(repeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAZ);
-    message.addExtension(repeatedImportEnumExtension, ImportEnum.IMPORT_BAZ);
-
-    message.addExtension(repeatedStringPieceExtension, "324");
-    message.addExtension(repeatedCordExtension, "325");
-
-    // -----------------------------------------------------------------
-
-    message.setExtension(defaultInt32Extension   , 401);
-    message.setExtension(defaultInt64Extension   , 402L);
-    message.setExtension(defaultUint32Extension  , 403);
-    message.setExtension(defaultUint64Extension  , 404L);
-    message.setExtension(defaultSint32Extension  , 405);
-    message.setExtension(defaultSint64Extension  , 406L);
-    message.setExtension(defaultFixed32Extension , 407);
-    message.setExtension(defaultFixed64Extension , 408L);
-    message.setExtension(defaultSfixed32Extension, 409);
-    message.setExtension(defaultSfixed64Extension, 410L);
-    message.setExtension(defaultFloatExtension   , 411F);
-    message.setExtension(defaultDoubleExtension  , 412D);
-    message.setExtension(defaultBoolExtension    , false);
-    message.setExtension(defaultStringExtension  , "415");
-    message.setExtension(defaultBytesExtension   , toBytes("416"));
-
-    message.setExtension(defaultNestedEnumExtension, TestAllTypes.NestedEnum.FOO);
-    message.setExtension(defaultForeignEnumExtension, ForeignEnum.FOREIGN_FOO);
-    message.setExtension(defaultImportEnumExtension, ImportEnum.IMPORT_FOO);
-
-    message.setExtension(defaultStringPieceExtension, "424");
-    message.setExtension(defaultCordExtension, "425");
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Modify the repeated extensions of {@code message} to contain the values
-   * expected by {@code assertRepeatedExtensionsModified()}.
-   */
-  public static void modifyRepeatedExtensions(
-      TestAllExtensions.Builder message) {
-    message.setExtension(repeatedInt32Extension   , 1, 501);
-    message.setExtension(repeatedInt64Extension   , 1, 502L);
-    message.setExtension(repeatedUint32Extension  , 1, 503);
-    message.setExtension(repeatedUint64Extension  , 1, 504L);
-    message.setExtension(repeatedSint32Extension  , 1, 505);
-    message.setExtension(repeatedSint64Extension  , 1, 506L);
-    message.setExtension(repeatedFixed32Extension , 1, 507);
-    message.setExtension(repeatedFixed64Extension , 1, 508L);
-    message.setExtension(repeatedSfixed32Extension, 1, 509);
-    message.setExtension(repeatedSfixed64Extension, 1, 510L);
-    message.setExtension(repeatedFloatExtension   , 1, 511F);
-    message.setExtension(repeatedDoubleExtension  , 1, 512D);
-    message.setExtension(repeatedBoolExtension    , 1, true);
-    message.setExtension(repeatedStringExtension  , 1, "515");
-    message.setExtension(repeatedBytesExtension   , 1, toBytes("516"));
-
-    message.setExtension(repeatedGroupExtension, 1,
-      RepeatedGroup_extension.newBuilder().setA(517).build());
-    message.setExtension(repeatedNestedMessageExtension, 1,
-      TestAllTypes.NestedMessage.newBuilder().setBb(518).build());
-    message.setExtension(repeatedForeignMessageExtension, 1,
-      ForeignMessage.newBuilder().setC(519).build());
-    message.setExtension(repeatedImportMessageExtension, 1,
-      ImportMessage.newBuilder().setD(520).build());
-    message.setExtension(repeatedLazyMessageExtension, 1,
-      TestAllTypes.NestedMessage.newBuilder().setBb(527).build());
-
-    message.setExtension(repeatedNestedEnumExtension , 1, TestAllTypes.NestedEnum.FOO);
-    message.setExtension(repeatedForeignEnumExtension, 1, ForeignEnum.FOREIGN_FOO);
-    message.setExtension(repeatedImportEnumExtension , 1, ImportEnum.IMPORT_FOO);
-
-    message.setExtension(repeatedStringPieceExtension, 1, "524");
-    message.setExtension(repeatedCordExtension, 1, "525");
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all extensions of
-   * {@code message} are set to the values assigned by {@code setAllExtensions}.
-   */
-  public static void assertAllExtensionsSet(
-      TestAllExtensionsOrBuilder message) {
-    Assert.assertTrue(message.hasExtension(optionalInt32Extension   ));
-    Assert.assertTrue(message.hasExtension(optionalInt64Extension   ));
-    Assert.assertTrue(message.hasExtension(optionalUint32Extension  ));
-    Assert.assertTrue(message.hasExtension(optionalUint64Extension  ));
-    Assert.assertTrue(message.hasExtension(optionalSint32Extension  ));
-    Assert.assertTrue(message.hasExtension(optionalSint64Extension  ));
-    Assert.assertTrue(message.hasExtension(optionalFixed32Extension ));
-    Assert.assertTrue(message.hasExtension(optionalFixed64Extension ));
-    Assert.assertTrue(message.hasExtension(optionalSfixed32Extension));
-    Assert.assertTrue(message.hasExtension(optionalSfixed64Extension));
-    Assert.assertTrue(message.hasExtension(optionalFloatExtension   ));
-    Assert.assertTrue(message.hasExtension(optionalDoubleExtension  ));
-    Assert.assertTrue(message.hasExtension(optionalBoolExtension    ));
-    Assert.assertTrue(message.hasExtension(optionalStringExtension  ));
-    Assert.assertTrue(message.hasExtension(optionalBytesExtension   ));
-
-    Assert.assertTrue(message.hasExtension(optionalGroupExtension         ));
-    Assert.assertTrue(message.hasExtension(optionalNestedMessageExtension ));
-    Assert.assertTrue(message.hasExtension(optionalForeignMessageExtension));
-    Assert.assertTrue(message.hasExtension(optionalImportMessageExtension ));
-
-    Assert.assertTrue(message.getExtension(optionalGroupExtension         ).hasA());
-    Assert.assertTrue(message.getExtension(optionalNestedMessageExtension ).hasBb());
-    Assert.assertTrue(message.getExtension(optionalForeignMessageExtension).hasC());
-    Assert.assertTrue(message.getExtension(optionalImportMessageExtension ).hasD());
-
-    Assert.assertTrue(message.hasExtension(optionalNestedEnumExtension ));
-    Assert.assertTrue(message.hasExtension(optionalForeignEnumExtension));
-    Assert.assertTrue(message.hasExtension(optionalImportEnumExtension ));
-
-    Assert.assertTrue(message.hasExtension(optionalStringPieceExtension));
-    Assert.assertTrue(message.hasExtension(optionalCordExtension));
-
-    assertEqualsExactType(101  , message.getExtension(optionalInt32Extension   ));
-    assertEqualsExactType(102L , message.getExtension(optionalInt64Extension   ));
-    assertEqualsExactType(103  , message.getExtension(optionalUint32Extension  ));
-    assertEqualsExactType(104L , message.getExtension(optionalUint64Extension  ));
-    assertEqualsExactType(105  , message.getExtension(optionalSint32Extension  ));
-    assertEqualsExactType(106L , message.getExtension(optionalSint64Extension  ));
-    assertEqualsExactType(107  , message.getExtension(optionalFixed32Extension ));
-    assertEqualsExactType(108L , message.getExtension(optionalFixed64Extension ));
-    assertEqualsExactType(109  , message.getExtension(optionalSfixed32Extension));
-    assertEqualsExactType(110L , message.getExtension(optionalSfixed64Extension));
-    assertEqualsExactType(111F , message.getExtension(optionalFloatExtension   ));
-    assertEqualsExactType(112D , message.getExtension(optionalDoubleExtension  ));
-    assertEqualsExactType(true , message.getExtension(optionalBoolExtension    ));
-    assertEqualsExactType("115", message.getExtension(optionalStringExtension  ));
-    assertEqualsExactType(toBytes("116"), message.getExtension(optionalBytesExtension));
-
-    assertEqualsExactType(117, message.getExtension(optionalGroupExtension              ).getA());
-    assertEqualsExactType(118, message.getExtension(optionalNestedMessageExtension      ).getBb());
-    assertEqualsExactType(119, message.getExtension(optionalForeignMessageExtension     ).getC());
-    assertEqualsExactType(120, message.getExtension(optionalImportMessageExtension      ).getD());
-    assertEqualsExactType(126, message.getExtension(optionalPublicImportMessageExtension).getE());
-    assertEqualsExactType(127, message.getExtension(optionalLazyMessageExtension        ).getBb());
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.BAZ,
-      message.getExtension(optionalNestedEnumExtension));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAZ,
-      message.getExtension(optionalForeignEnumExtension));
-    assertEqualsExactType(ImportEnum.IMPORT_BAZ,
-      message.getExtension(optionalImportEnumExtension));
-
-    assertEqualsExactType("124", message.getExtension(optionalStringPieceExtension));
-    assertEqualsExactType("125", message.getExtension(optionalCordExtension));
-
-    // -----------------------------------------------------------------
-
-    Assert.assertEquals(2, message.getExtensionCount(repeatedInt32Extension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedInt64Extension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedUint32Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedUint64Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSint32Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSint64Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32Extension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64Extension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32Extension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64Extension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtension    ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtension   ));
-
-    Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtension         ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedLazyMessageExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtension    ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtension    ));
-
-    Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtension));
-
-    assertEqualsExactType(201  , message.getExtension(repeatedInt32Extension   , 0));
-    assertEqualsExactType(202L , message.getExtension(repeatedInt64Extension   , 0));
-    assertEqualsExactType(203  , message.getExtension(repeatedUint32Extension  , 0));
-    assertEqualsExactType(204L , message.getExtension(repeatedUint64Extension  , 0));
-    assertEqualsExactType(205  , message.getExtension(repeatedSint32Extension  , 0));
-    assertEqualsExactType(206L , message.getExtension(repeatedSint64Extension  , 0));
-    assertEqualsExactType(207  , message.getExtension(repeatedFixed32Extension , 0));
-    assertEqualsExactType(208L , message.getExtension(repeatedFixed64Extension , 0));
-    assertEqualsExactType(209  , message.getExtension(repeatedSfixed32Extension, 0));
-    assertEqualsExactType(210L , message.getExtension(repeatedSfixed64Extension, 0));
-    assertEqualsExactType(211F , message.getExtension(repeatedFloatExtension   , 0));
-    assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtension  , 0));
-    assertEqualsExactType(true , message.getExtension(repeatedBoolExtension    , 0));
-    assertEqualsExactType("215", message.getExtension(repeatedStringExtension  , 0));
-    assertEqualsExactType(toBytes("216"), message.getExtension(repeatedBytesExtension, 0));
-
-    assertEqualsExactType(217, message.getExtension(repeatedGroupExtension         , 0).getA());
-    assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtension , 0).getBb());
-    assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtension, 0).getC());
-    assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtension , 0).getD());
-    assertEqualsExactType(227, message.getExtension(repeatedLazyMessageExtension   , 0).getBb());
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.BAR,
-      message.getExtension(repeatedNestedEnumExtension, 0));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,
-      message.getExtension(repeatedForeignEnumExtension, 0));
-    assertEqualsExactType(ImportEnum.IMPORT_BAR,
-      message.getExtension(repeatedImportEnumExtension, 0));
-
-    assertEqualsExactType("224", message.getExtension(repeatedStringPieceExtension, 0));
-    assertEqualsExactType("225", message.getExtension(repeatedCordExtension, 0));
-
-    assertEqualsExactType(301  , message.getExtension(repeatedInt32Extension   , 1));
-    assertEqualsExactType(302L , message.getExtension(repeatedInt64Extension   , 1));
-    assertEqualsExactType(303  , message.getExtension(repeatedUint32Extension  , 1));
-    assertEqualsExactType(304L , message.getExtension(repeatedUint64Extension  , 1));
-    assertEqualsExactType(305  , message.getExtension(repeatedSint32Extension  , 1));
-    assertEqualsExactType(306L , message.getExtension(repeatedSint64Extension  , 1));
-    assertEqualsExactType(307  , message.getExtension(repeatedFixed32Extension , 1));
-    assertEqualsExactType(308L , message.getExtension(repeatedFixed64Extension , 1));
-    assertEqualsExactType(309  , message.getExtension(repeatedSfixed32Extension, 1));
-    assertEqualsExactType(310L , message.getExtension(repeatedSfixed64Extension, 1));
-    assertEqualsExactType(311F , message.getExtension(repeatedFloatExtension   , 1));
-    assertEqualsExactType(312D , message.getExtension(repeatedDoubleExtension  , 1));
-    assertEqualsExactType(false, message.getExtension(repeatedBoolExtension    , 1));
-    assertEqualsExactType("315", message.getExtension(repeatedStringExtension  , 1));
-    assertEqualsExactType(toBytes("316"), message.getExtension(repeatedBytesExtension, 1));
-
-    assertEqualsExactType(317, message.getExtension(repeatedGroupExtension         , 1).getA());
-    assertEqualsExactType(318, message.getExtension(repeatedNestedMessageExtension , 1).getBb());
-    assertEqualsExactType(319, message.getExtension(repeatedForeignMessageExtension, 1).getC());
-    assertEqualsExactType(320, message.getExtension(repeatedImportMessageExtension , 1).getD());
-    assertEqualsExactType(327, message.getExtension(repeatedLazyMessageExtension   , 1).getBb());
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.BAZ,
-      message.getExtension(repeatedNestedEnumExtension, 1));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAZ,
-      message.getExtension(repeatedForeignEnumExtension, 1));
-    assertEqualsExactType(ImportEnum.IMPORT_BAZ,
-      message.getExtension(repeatedImportEnumExtension, 1));
-
-    assertEqualsExactType("324", message.getExtension(repeatedStringPieceExtension, 1));
-    assertEqualsExactType("325", message.getExtension(repeatedCordExtension, 1));
-
-    // -----------------------------------------------------------------
-
-    Assert.assertTrue(message.hasExtension(defaultInt32Extension   ));
-    Assert.assertTrue(message.hasExtension(defaultInt64Extension   ));
-    Assert.assertTrue(message.hasExtension(defaultUint32Extension  ));
-    Assert.assertTrue(message.hasExtension(defaultUint64Extension  ));
-    Assert.assertTrue(message.hasExtension(defaultSint32Extension  ));
-    Assert.assertTrue(message.hasExtension(defaultSint64Extension  ));
-    Assert.assertTrue(message.hasExtension(defaultFixed32Extension ));
-    Assert.assertTrue(message.hasExtension(defaultFixed64Extension ));
-    Assert.assertTrue(message.hasExtension(defaultSfixed32Extension));
-    Assert.assertTrue(message.hasExtension(defaultSfixed64Extension));
-    Assert.assertTrue(message.hasExtension(defaultFloatExtension   ));
-    Assert.assertTrue(message.hasExtension(defaultDoubleExtension  ));
-    Assert.assertTrue(message.hasExtension(defaultBoolExtension    ));
-    Assert.assertTrue(message.hasExtension(defaultStringExtension  ));
-    Assert.assertTrue(message.hasExtension(defaultBytesExtension   ));
-
-    Assert.assertTrue(message.hasExtension(defaultNestedEnumExtension ));
-    Assert.assertTrue(message.hasExtension(defaultForeignEnumExtension));
-    Assert.assertTrue(message.hasExtension(defaultImportEnumExtension ));
-
-    Assert.assertTrue(message.hasExtension(defaultStringPieceExtension));
-    Assert.assertTrue(message.hasExtension(defaultCordExtension));
-
-    assertEqualsExactType(401  , message.getExtension(defaultInt32Extension   ));
-    assertEqualsExactType(402L , message.getExtension(defaultInt64Extension   ));
-    assertEqualsExactType(403  , message.getExtension(defaultUint32Extension  ));
-    assertEqualsExactType(404L , message.getExtension(defaultUint64Extension  ));
-    assertEqualsExactType(405  , message.getExtension(defaultSint32Extension  ));
-    assertEqualsExactType(406L , message.getExtension(defaultSint64Extension  ));
-    assertEqualsExactType(407  , message.getExtension(defaultFixed32Extension ));
-    assertEqualsExactType(408L , message.getExtension(defaultFixed64Extension ));
-    assertEqualsExactType(409  , message.getExtension(defaultSfixed32Extension));
-    assertEqualsExactType(410L , message.getExtension(defaultSfixed64Extension));
-    assertEqualsExactType(411F , message.getExtension(defaultFloatExtension   ));
-    assertEqualsExactType(412D , message.getExtension(defaultDoubleExtension  ));
-    assertEqualsExactType(false, message.getExtension(defaultBoolExtension    ));
-    assertEqualsExactType("415", message.getExtension(defaultStringExtension  ));
-    assertEqualsExactType(toBytes("416"), message.getExtension(defaultBytesExtension));
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.FOO,
-      message.getExtension(defaultNestedEnumExtension ));
-    assertEqualsExactType(ForeignEnum.FOREIGN_FOO,
-      message.getExtension(defaultForeignEnumExtension));
-    assertEqualsExactType(ImportEnum.IMPORT_FOO,
-      message.getExtension(defaultImportEnumExtension));
-
-    assertEqualsExactType("424", message.getExtension(defaultStringPieceExtension));
-    assertEqualsExactType("425", message.getExtension(defaultCordExtension));
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all extensions of
-   * {@code message} are cleared, and that getting the extensions returns their
-   * default values.
-   */
-  public static void assertExtensionsClear(TestAllExtensionsOrBuilder message) {
-    // hasBlah() should initially be false for all optional fields.
-    Assert.assertFalse(message.hasExtension(optionalInt32Extension   ));
-    Assert.assertFalse(message.hasExtension(optionalInt64Extension   ));
-    Assert.assertFalse(message.hasExtension(optionalUint32Extension  ));
-    Assert.assertFalse(message.hasExtension(optionalUint64Extension  ));
-    Assert.assertFalse(message.hasExtension(optionalSint32Extension  ));
-    Assert.assertFalse(message.hasExtension(optionalSint64Extension  ));
-    Assert.assertFalse(message.hasExtension(optionalFixed32Extension ));
-    Assert.assertFalse(message.hasExtension(optionalFixed64Extension ));
-    Assert.assertFalse(message.hasExtension(optionalSfixed32Extension));
-    Assert.assertFalse(message.hasExtension(optionalSfixed64Extension));
-    Assert.assertFalse(message.hasExtension(optionalFloatExtension   ));
-    Assert.assertFalse(message.hasExtension(optionalDoubleExtension  ));
-    Assert.assertFalse(message.hasExtension(optionalBoolExtension    ));
-    Assert.assertFalse(message.hasExtension(optionalStringExtension  ));
-    Assert.assertFalse(message.hasExtension(optionalBytesExtension   ));
-
-    Assert.assertFalse(message.hasExtension(optionalGroupExtension         ));
-    Assert.assertFalse(message.hasExtension(optionalNestedMessageExtension ));
-    Assert.assertFalse(message.hasExtension(optionalForeignMessageExtension));
-    Assert.assertFalse(message.hasExtension(optionalImportMessageExtension ));
-
-    Assert.assertFalse(message.hasExtension(optionalNestedEnumExtension ));
-    Assert.assertFalse(message.hasExtension(optionalForeignEnumExtension));
-    Assert.assertFalse(message.hasExtension(optionalImportEnumExtension ));
-
-    Assert.assertFalse(message.hasExtension(optionalStringPieceExtension));
-    Assert.assertFalse(message.hasExtension(optionalCordExtension));
-
-    // Optional fields without defaults are set to zero or something like it.
-    assertEqualsExactType(0    , message.getExtension(optionalInt32Extension   ));
-    assertEqualsExactType(0L   , message.getExtension(optionalInt64Extension   ));
-    assertEqualsExactType(0    , message.getExtension(optionalUint32Extension  ));
-    assertEqualsExactType(0L   , message.getExtension(optionalUint64Extension  ));
-    assertEqualsExactType(0    , message.getExtension(optionalSint32Extension  ));
-    assertEqualsExactType(0L   , message.getExtension(optionalSint64Extension  ));
-    assertEqualsExactType(0    , message.getExtension(optionalFixed32Extension ));
-    assertEqualsExactType(0L   , message.getExtension(optionalFixed64Extension ));
-    assertEqualsExactType(0    , message.getExtension(optionalSfixed32Extension));
-    assertEqualsExactType(0L   , message.getExtension(optionalSfixed64Extension));
-    assertEqualsExactType(0F   , message.getExtension(optionalFloatExtension   ));
-    assertEqualsExactType(0D   , message.getExtension(optionalDoubleExtension  ));
-    assertEqualsExactType(false, message.getExtension(optionalBoolExtension    ));
-    assertEqualsExactType(""   , message.getExtension(optionalStringExtension  ));
-    assertEqualsExactType(ByteString.EMPTY, message.getExtension(optionalBytesExtension));
-
-    // Embedded messages should also be clear.
-    Assert.assertFalse(message.getExtension(optionalGroupExtension         ).hasA());
-    Assert.assertFalse(message.getExtension(optionalNestedMessageExtension ).hasBb());
-    Assert.assertFalse(message.getExtension(optionalForeignMessageExtension).hasC());
-    Assert.assertFalse(message.getExtension(optionalImportMessageExtension ).hasD());
-
-    assertEqualsExactType(0, message.getExtension(optionalGroupExtension         ).getA());
-    assertEqualsExactType(0, message.getExtension(optionalNestedMessageExtension ).getBb());
-    assertEqualsExactType(0, message.getExtension(optionalForeignMessageExtension).getC());
-    assertEqualsExactType(0, message.getExtension(optionalImportMessageExtension ).getD());
-
-    // Enums without defaults are set to the first value in the enum.
-    assertEqualsExactType(TestAllTypes.NestedEnum.FOO,
-      message.getExtension(optionalNestedEnumExtension ));
-    assertEqualsExactType(ForeignEnum.FOREIGN_FOO,
-      message.getExtension(optionalForeignEnumExtension));
-    assertEqualsExactType(ImportEnum.IMPORT_FOO,
-      message.getExtension(optionalImportEnumExtension));
-
-    assertEqualsExactType("", message.getExtension(optionalStringPieceExtension));
-    assertEqualsExactType("", message.getExtension(optionalCordExtension));
-
-    // Repeated fields are empty.
-    Assert.assertEquals(0, message.getExtensionCount(repeatedInt32Extension   ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedInt64Extension   ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedUint32Extension  ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedUint64Extension  ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedSint32Extension  ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedSint64Extension  ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedFixed32Extension ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedFixed64Extension ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed32Extension));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed64Extension));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedFloatExtension   ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedDoubleExtension  ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedBoolExtension    ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedStringExtension  ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedBytesExtension   ));
-
-    Assert.assertEquals(0, message.getExtensionCount(repeatedGroupExtension         ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedNestedMessageExtension ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedForeignMessageExtension));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedImportMessageExtension ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedLazyMessageExtension   ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedNestedEnumExtension    ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedForeignEnumExtension   ));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedImportEnumExtension    ));
-
-    Assert.assertEquals(0, message.getExtensionCount(repeatedStringPieceExtension));
-    Assert.assertEquals(0, message.getExtensionCount(repeatedCordExtension));
-
-    // Repeated fields are empty via getExtension().size().
-    Assert.assertEquals(0, message.getExtension(repeatedInt32Extension   ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedInt64Extension   ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedUint32Extension  ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedUint64Extension  ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedSint32Extension  ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedSint64Extension  ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedFixed32Extension ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedFixed64Extension ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedSfixed32Extension).size());
-    Assert.assertEquals(0, message.getExtension(repeatedSfixed64Extension).size());
-    Assert.assertEquals(0, message.getExtension(repeatedFloatExtension   ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedDoubleExtension  ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedBoolExtension    ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedStringExtension  ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedBytesExtension   ).size());
-
-    Assert.assertEquals(0, message.getExtension(repeatedGroupExtension         ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedNestedMessageExtension ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedForeignMessageExtension).size());
-    Assert.assertEquals(0, message.getExtension(repeatedImportMessageExtension ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedLazyMessageExtension   ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedNestedEnumExtension    ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedForeignEnumExtension   ).size());
-    Assert.assertEquals(0, message.getExtension(repeatedImportEnumExtension    ).size());
-
-    Assert.assertEquals(0, message.getExtension(repeatedStringPieceExtension).size());
-    Assert.assertEquals(0, message.getExtension(repeatedCordExtension).size());
-
-    // hasBlah() should also be false for all default fields.
-    Assert.assertFalse(message.hasExtension(defaultInt32Extension   ));
-    Assert.assertFalse(message.hasExtension(defaultInt64Extension   ));
-    Assert.assertFalse(message.hasExtension(defaultUint32Extension  ));
-    Assert.assertFalse(message.hasExtension(defaultUint64Extension  ));
-    Assert.assertFalse(message.hasExtension(defaultSint32Extension  ));
-    Assert.assertFalse(message.hasExtension(defaultSint64Extension  ));
-    Assert.assertFalse(message.hasExtension(defaultFixed32Extension ));
-    Assert.assertFalse(message.hasExtension(defaultFixed64Extension ));
-    Assert.assertFalse(message.hasExtension(defaultSfixed32Extension));
-    Assert.assertFalse(message.hasExtension(defaultSfixed64Extension));
-    Assert.assertFalse(message.hasExtension(defaultFloatExtension   ));
-    Assert.assertFalse(message.hasExtension(defaultDoubleExtension  ));
-    Assert.assertFalse(message.hasExtension(defaultBoolExtension    ));
-    Assert.assertFalse(message.hasExtension(defaultStringExtension  ));
-    Assert.assertFalse(message.hasExtension(defaultBytesExtension   ));
-
-    Assert.assertFalse(message.hasExtension(defaultNestedEnumExtension ));
-    Assert.assertFalse(message.hasExtension(defaultForeignEnumExtension));
-    Assert.assertFalse(message.hasExtension(defaultImportEnumExtension ));
-
-    Assert.assertFalse(message.hasExtension(defaultStringPieceExtension));
-    Assert.assertFalse(message.hasExtension(defaultCordExtension));
-
-    // Fields with defaults have their default values (duh).
-    assertEqualsExactType( 41    , message.getExtension(defaultInt32Extension   ));
-    assertEqualsExactType( 42L   , message.getExtension(defaultInt64Extension   ));
-    assertEqualsExactType( 43    , message.getExtension(defaultUint32Extension  ));
-    assertEqualsExactType( 44L   , message.getExtension(defaultUint64Extension  ));
-    assertEqualsExactType(-45    , message.getExtension(defaultSint32Extension  ));
-    assertEqualsExactType( 46L   , message.getExtension(defaultSint64Extension  ));
-    assertEqualsExactType( 47    , message.getExtension(defaultFixed32Extension ));
-    assertEqualsExactType( 48L   , message.getExtension(defaultFixed64Extension ));
-    assertEqualsExactType( 49    , message.getExtension(defaultSfixed32Extension));
-    assertEqualsExactType(-50L   , message.getExtension(defaultSfixed64Extension));
-    assertEqualsExactType( 51.5F , message.getExtension(defaultFloatExtension   ));
-    assertEqualsExactType( 52e3D , message.getExtension(defaultDoubleExtension  ));
-    assertEqualsExactType(true   , message.getExtension(defaultBoolExtension    ));
-    assertEqualsExactType("hello", message.getExtension(defaultStringExtension  ));
-    assertEqualsExactType(toBytes("world"), message.getExtension(defaultBytesExtension));
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.BAR,
-      message.getExtension(defaultNestedEnumExtension ));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,
-      message.getExtension(defaultForeignEnumExtension));
-    assertEqualsExactType(ImportEnum.IMPORT_BAR,
-      message.getExtension(defaultImportEnumExtension));
-
-    assertEqualsExactType("abc", message.getExtension(defaultStringPieceExtension));
-    assertEqualsExactType("123", message.getExtension(defaultCordExtension));
-  }
-
-  // -------------------------------------------------------------------
-
-  /**
-   * Assert (using {@code junit.framework.Assert}} that all extensions of
-   * {@code message} are set to the values assigned by {@code setAllExtensions}
-   * followed by {@code modifyRepeatedExtensions}.
-   */
-  public static void assertRepeatedExtensionsModified(
-      TestAllExtensionsOrBuilder message) {
-    // 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.assertEquals(2, message.getExtensionCount(repeatedInt32Extension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedInt64Extension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedUint32Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedUint64Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSint32Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSint64Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32Extension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64Extension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32Extension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64Extension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtension    ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtension  ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtension   ));
-
-    Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtension         ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtension ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedLazyMessageExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtension    ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtension    ));
-
-    Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtension));
-    Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtension));
-
-    assertEqualsExactType(201  , message.getExtension(repeatedInt32Extension   , 0));
-    assertEqualsExactType(202L , message.getExtension(repeatedInt64Extension   , 0));
-    assertEqualsExactType(203  , message.getExtension(repeatedUint32Extension  , 0));
-    assertEqualsExactType(204L , message.getExtension(repeatedUint64Extension  , 0));
-    assertEqualsExactType(205  , message.getExtension(repeatedSint32Extension  , 0));
-    assertEqualsExactType(206L , message.getExtension(repeatedSint64Extension  , 0));
-    assertEqualsExactType(207  , message.getExtension(repeatedFixed32Extension , 0));
-    assertEqualsExactType(208L , message.getExtension(repeatedFixed64Extension , 0));
-    assertEqualsExactType(209  , message.getExtension(repeatedSfixed32Extension, 0));
-    assertEqualsExactType(210L , message.getExtension(repeatedSfixed64Extension, 0));
-    assertEqualsExactType(211F , message.getExtension(repeatedFloatExtension   , 0));
-    assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtension  , 0));
-    assertEqualsExactType(true , message.getExtension(repeatedBoolExtension    , 0));
-    assertEqualsExactType("215", message.getExtension(repeatedStringExtension  , 0));
-    assertEqualsExactType(toBytes("216"), message.getExtension(repeatedBytesExtension, 0));
-
-    assertEqualsExactType(217, message.getExtension(repeatedGroupExtension         , 0).getA());
-    assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtension , 0).getBb());
-    assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtension, 0).getC());
-    assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtension , 0).getD());
-    assertEqualsExactType(227, message.getExtension(repeatedLazyMessageExtension   , 0).getBb());
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.BAR,
-      message.getExtension(repeatedNestedEnumExtension, 0));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,
-      message.getExtension(repeatedForeignEnumExtension, 0));
-    assertEqualsExactType(ImportEnum.IMPORT_BAR,
-      message.getExtension(repeatedImportEnumExtension, 0));
-
-    assertEqualsExactType("224", message.getExtension(repeatedStringPieceExtension, 0));
-    assertEqualsExactType("225", message.getExtension(repeatedCordExtension, 0));
-
-    // Actually verify the second (modified) elements now.
-    assertEqualsExactType(501  , message.getExtension(repeatedInt32Extension   , 1));
-    assertEqualsExactType(502L , message.getExtension(repeatedInt64Extension   , 1));
-    assertEqualsExactType(503  , message.getExtension(repeatedUint32Extension  , 1));
-    assertEqualsExactType(504L , message.getExtension(repeatedUint64Extension  , 1));
-    assertEqualsExactType(505  , message.getExtension(repeatedSint32Extension  , 1));
-    assertEqualsExactType(506L , message.getExtension(repeatedSint64Extension  , 1));
-    assertEqualsExactType(507  , message.getExtension(repeatedFixed32Extension , 1));
-    assertEqualsExactType(508L , message.getExtension(repeatedFixed64Extension , 1));
-    assertEqualsExactType(509  , message.getExtension(repeatedSfixed32Extension, 1));
-    assertEqualsExactType(510L , message.getExtension(repeatedSfixed64Extension, 1));
-    assertEqualsExactType(511F , message.getExtension(repeatedFloatExtension   , 1));
-    assertEqualsExactType(512D , message.getExtension(repeatedDoubleExtension  , 1));
-    assertEqualsExactType(true , message.getExtension(repeatedBoolExtension    , 1));
-    assertEqualsExactType("515", message.getExtension(repeatedStringExtension  , 1));
-    assertEqualsExactType(toBytes("516"), message.getExtension(repeatedBytesExtension, 1));
-
-    assertEqualsExactType(517, message.getExtension(repeatedGroupExtension         , 1).getA());
-    assertEqualsExactType(518, message.getExtension(repeatedNestedMessageExtension , 1).getBb());
-    assertEqualsExactType(519, message.getExtension(repeatedForeignMessageExtension, 1).getC());
-    assertEqualsExactType(520, message.getExtension(repeatedImportMessageExtension , 1).getD());
-    assertEqualsExactType(527, message.getExtension(repeatedLazyMessageExtension   , 1).getBb());
-
-    assertEqualsExactType(TestAllTypes.NestedEnum.FOO,
-      message.getExtension(repeatedNestedEnumExtension, 1));
-    assertEqualsExactType(ForeignEnum.FOREIGN_FOO,
-      message.getExtension(repeatedForeignEnumExtension, 1));
-    assertEqualsExactType(ImportEnum.IMPORT_FOO,
-      message.getExtension(repeatedImportEnumExtension, 1));
-
-    assertEqualsExactType("524", message.getExtension(repeatedStringPieceExtension, 1));
-    assertEqualsExactType("525", message.getExtension(repeatedCordExtension, 1));
-  }
-
-  public static void setPackedExtensions(TestPackedExtensions.Builder message) {
-    message.addExtension(packedInt32Extension   , 601);
-    message.addExtension(packedInt64Extension   , 602L);
-    message.addExtension(packedUint32Extension  , 603);
-    message.addExtension(packedUint64Extension  , 604L);
-    message.addExtension(packedSint32Extension  , 605);
-    message.addExtension(packedSint64Extension  , 606L);
-    message.addExtension(packedFixed32Extension , 607);
-    message.addExtension(packedFixed64Extension , 608L);
-    message.addExtension(packedSfixed32Extension, 609);
-    message.addExtension(packedSfixed64Extension, 610L);
-    message.addExtension(packedFloatExtension   , 611F);
-    message.addExtension(packedDoubleExtension  , 612D);
-    message.addExtension(packedBoolExtension    , true);
-    message.addExtension(packedEnumExtension, ForeignEnum.FOREIGN_BAR);
-    // Add a second one of each field.
-    message.addExtension(packedInt32Extension   , 701);
-    message.addExtension(packedInt64Extension   , 702L);
-    message.addExtension(packedUint32Extension  , 703);
-    message.addExtension(packedUint64Extension  , 704L);
-    message.addExtension(packedSint32Extension  , 705);
-    message.addExtension(packedSint64Extension  , 706L);
-    message.addExtension(packedFixed32Extension , 707);
-    message.addExtension(packedFixed64Extension , 708L);
-    message.addExtension(packedSfixed32Extension, 709);
-    message.addExtension(packedSfixed64Extension, 710L);
-    message.addExtension(packedFloatExtension   , 711F);
-    message.addExtension(packedDoubleExtension  , 712D);
-    message.addExtension(packedBoolExtension    , false);
-    message.addExtension(packedEnumExtension, ForeignEnum.FOREIGN_BAZ);
-  }
-
-  public static void assertPackedExtensionsSet(TestPackedExtensions message) {
-    Assert.assertEquals(2, message.getExtensionCount(packedInt32Extension   ));
-    Assert.assertEquals(2, message.getExtensionCount(packedInt64Extension   ));
-    Assert.assertEquals(2, message.getExtensionCount(packedUint32Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(packedUint64Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(packedSint32Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(packedSint64Extension  ));
-    Assert.assertEquals(2, message.getExtensionCount(packedFixed32Extension ));
-    Assert.assertEquals(2, message.getExtensionCount(packedFixed64Extension ));
-    Assert.assertEquals(2, message.getExtensionCount(packedSfixed32Extension));
-    Assert.assertEquals(2, message.getExtensionCount(packedSfixed64Extension));
-    Assert.assertEquals(2, message.getExtensionCount(packedFloatExtension   ));
-    Assert.assertEquals(2, message.getExtensionCount(packedDoubleExtension  ));
-    Assert.assertEquals(2, message.getExtensionCount(packedBoolExtension    ));
-    Assert.assertEquals(2, message.getExtensionCount(packedEnumExtension));
-    assertEqualsExactType(601  , message.getExtension(packedInt32Extension   , 0));
-    assertEqualsExactType(602L , message.getExtension(packedInt64Extension   , 0));
-    assertEqualsExactType(603  , message.getExtension(packedUint32Extension  , 0));
-    assertEqualsExactType(604L , message.getExtension(packedUint64Extension  , 0));
-    assertEqualsExactType(605  , message.getExtension(packedSint32Extension  , 0));
-    assertEqualsExactType(606L , message.getExtension(packedSint64Extension  , 0));
-    assertEqualsExactType(607  , message.getExtension(packedFixed32Extension , 0));
-    assertEqualsExactType(608L , message.getExtension(packedFixed64Extension , 0));
-    assertEqualsExactType(609  , message.getExtension(packedSfixed32Extension, 0));
-    assertEqualsExactType(610L , message.getExtension(packedSfixed64Extension, 0));
-    assertEqualsExactType(611F , message.getExtension(packedFloatExtension   , 0));
-    assertEqualsExactType(612D , message.getExtension(packedDoubleExtension  , 0));
-    assertEqualsExactType(true , message.getExtension(packedBoolExtension    , 0));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,
-                          message.getExtension(packedEnumExtension, 0));
-    assertEqualsExactType(701  , message.getExtension(packedInt32Extension   , 1));
-    assertEqualsExactType(702L , message.getExtension(packedInt64Extension   , 1));
-    assertEqualsExactType(703  , message.getExtension(packedUint32Extension  , 1));
-    assertEqualsExactType(704L , message.getExtension(packedUint64Extension  , 1));
-    assertEqualsExactType(705  , message.getExtension(packedSint32Extension  , 1));
-    assertEqualsExactType(706L , message.getExtension(packedSint64Extension  , 1));
-    assertEqualsExactType(707  , message.getExtension(packedFixed32Extension , 1));
-    assertEqualsExactType(708L , message.getExtension(packedFixed64Extension , 1));
-    assertEqualsExactType(709  , message.getExtension(packedSfixed32Extension, 1));
-    assertEqualsExactType(710L , message.getExtension(packedSfixed64Extension, 1));
-    assertEqualsExactType(711F , message.getExtension(packedFloatExtension   , 1));
-    assertEqualsExactType(712D , message.getExtension(packedDoubleExtension  , 1));
-    assertEqualsExactType(false, message.getExtension(packedBoolExtension    , 1));
-    assertEqualsExactType(ForeignEnum.FOREIGN_BAZ,
-                          message.getExtension(packedEnumExtension, 1));
-  }
-
-  // =================================================================
-
-  /**
-   * Performs the same things that the methods of {@code TestUtil} do, but
-   * via the reflection interface.  This is its own class because it needs
-   * to know what descriptor to use.
-   */
-  public static class ReflectionTester {
-    private final Descriptors.Descriptor baseDescriptor;
-    private final ExtensionRegistry extensionRegistry;
-
-    private final Descriptors.FileDescriptor file;
-    private final Descriptors.FileDescriptor importFile;
-    private final Descriptors.FileDescriptor publicImportFile;
-
-    private final Descriptors.Descriptor optionalGroup;
-    private final Descriptors.Descriptor repeatedGroup;
-    private final Descriptors.Descriptor nestedMessage;
-    private final Descriptors.Descriptor foreignMessage;
-    private final Descriptors.Descriptor importMessage;
-    private final Descriptors.Descriptor publicImportMessage;
-
-    private final Descriptors.FieldDescriptor groupA;
-    private final Descriptors.FieldDescriptor repeatedGroupA;
-    private final Descriptors.FieldDescriptor nestedB;
-    private final Descriptors.FieldDescriptor foreignC;
-    private final Descriptors.FieldDescriptor importD;
-    private final Descriptors.FieldDescriptor importE;
-
-    private final Descriptors.EnumDescriptor nestedEnum;
-    private final Descriptors.EnumDescriptor foreignEnum;
-    private final Descriptors.EnumDescriptor importEnum;
-
-    private final Descriptors.EnumValueDescriptor nestedFoo;
-    private final Descriptors.EnumValueDescriptor nestedBar;
-    private final Descriptors.EnumValueDescriptor nestedBaz;
-    private final Descriptors.EnumValueDescriptor foreignFoo;
-    private final Descriptors.EnumValueDescriptor foreignBar;
-    private final Descriptors.EnumValueDescriptor foreignBaz;
-    private final Descriptors.EnumValueDescriptor importFoo;
-    private final Descriptors.EnumValueDescriptor importBar;
-    private final Descriptors.EnumValueDescriptor importBaz;
-
-    /**
-     * Construct a {@code ReflectionTester} that will expect messages using
-     * the given descriptor.
-     *
-     * Normally {@code baseDescriptor} should be a descriptor for the type
-     * {@code TestAllTypes}, defined in
-     * {@code google/protobuf/unittest.proto}.  However, if
-     * {@code extensionRegistry} is non-null, then {@code baseDescriptor} should
-     * be for {@code TestAllExtensions} instead, and instead of reading and
-     * writing normal fields, the tester will read and write extensions.
-     * All of {@code TestAllExtensions}' extensions must be registered in the
-     * registry.
-     */
-    public ReflectionTester(Descriptors.Descriptor baseDescriptor,
-                            ExtensionRegistry extensionRegistry) {
-      this.baseDescriptor = baseDescriptor;
-      this.extensionRegistry = extensionRegistry;
-
-      this.file = baseDescriptor.getFile();
-      Assert.assertEquals(1, file.getDependencies().size());
-      this.importFile = file.getDependencies().get(0);
-      this.publicImportFile = importFile.getDependencies().get(0);
-
-      Descriptors.Descriptor testAllTypes;
-      if (baseDescriptor.getName() == "TestAllTypes") {
-        testAllTypes = baseDescriptor;
-      } else {
-        testAllTypes = file.findMessageTypeByName("TestAllTypes");
-        Assert.assertNotNull(testAllTypes);
-      }
-
-      if (extensionRegistry == null) {
-        // Use testAllTypes, rather than baseDescriptor, to allow
-        // initialization using TestPackedTypes descriptors. These objects
-        // won't be used by the methods for packed fields.
-        this.optionalGroup =
-          testAllTypes.findNestedTypeByName("OptionalGroup");
-        this.repeatedGroup =
-          testAllTypes.findNestedTypeByName("RepeatedGroup");
-      } else {
-        this.optionalGroup =
-          file.findMessageTypeByName("OptionalGroup_extension");
-        this.repeatedGroup =
-          file.findMessageTypeByName("RepeatedGroup_extension");
-      }
-      this.nestedMessage = testAllTypes.findNestedTypeByName("NestedMessage");
-      this.foreignMessage = file.findMessageTypeByName("ForeignMessage");
-      this.importMessage = importFile.findMessageTypeByName("ImportMessage");
-      this.publicImportMessage = publicImportFile.findMessageTypeByName(
-          "PublicImportMessage");
-
-      this.nestedEnum = testAllTypes.findEnumTypeByName("NestedEnum");
-      this.foreignEnum = file.findEnumTypeByName("ForeignEnum");
-      this.importEnum = importFile.findEnumTypeByName("ImportEnum");
-
-      Assert.assertNotNull(optionalGroup );
-      Assert.assertNotNull(repeatedGroup );
-      Assert.assertNotNull(nestedMessage );
-      Assert.assertNotNull(foreignMessage);
-      Assert.assertNotNull(importMessage );
-      Assert.assertNotNull(nestedEnum    );
-      Assert.assertNotNull(foreignEnum   );
-      Assert.assertNotNull(importEnum    );
-
-      this.nestedB  = nestedMessage .findFieldByName("bb");
-      this.foreignC = foreignMessage.findFieldByName("c");
-      this.importD  = importMessage .findFieldByName("d");
-      this.importE  = publicImportMessage.findFieldByName("e");
-      this.nestedFoo = nestedEnum.findValueByName("FOO");
-      this.nestedBar = nestedEnum.findValueByName("BAR");
-      this.nestedBaz = nestedEnum.findValueByName("BAZ");
-      this.foreignFoo = foreignEnum.findValueByName("FOREIGN_FOO");
-      this.foreignBar = foreignEnum.findValueByName("FOREIGN_BAR");
-      this.foreignBaz = foreignEnum.findValueByName("FOREIGN_BAZ");
-      this.importFoo = importEnum.findValueByName("IMPORT_FOO");
-      this.importBar = importEnum.findValueByName("IMPORT_BAR");
-      this.importBaz = importEnum.findValueByName("IMPORT_BAZ");
-
-      this.groupA = optionalGroup.findFieldByName("a");
-      this.repeatedGroupA = repeatedGroup.findFieldByName("a");
-
-      Assert.assertNotNull(groupA        );
-      Assert.assertNotNull(repeatedGroupA);
-      Assert.assertNotNull(nestedB       );
-      Assert.assertNotNull(foreignC      );
-      Assert.assertNotNull(importD       );
-      Assert.assertNotNull(importE       );
-      Assert.assertNotNull(nestedFoo     );
-      Assert.assertNotNull(nestedBar     );
-      Assert.assertNotNull(nestedBaz     );
-      Assert.assertNotNull(foreignFoo    );
-      Assert.assertNotNull(foreignBar    );
-      Assert.assertNotNull(foreignBaz    );
-      Assert.assertNotNull(importFoo     );
-      Assert.assertNotNull(importBar     );
-      Assert.assertNotNull(importBaz     );
-    }
-
-    /**
-     * Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
-     */
-    private Descriptors.FieldDescriptor f(String name) {
-      Descriptors.FieldDescriptor result;
-      if (extensionRegistry == null) {
-        result = baseDescriptor.findFieldByName(name);
-      } else {
-        result = file.findExtensionByName(name + "_extension");
-      }
-      Assert.assertNotNull(result);
-      return result;
-    }
-
-    /**
-     * Calls {@code parent.newBuilderForField()} or uses the
-     * {@code ExtensionRegistry} to find an appropriate builder, depending
-     * on what type is being tested.
-     */
-    private Message.Builder newBuilderForField(
-        Message.Builder parent, Descriptors.FieldDescriptor field) {
-      if (extensionRegistry == null) {
-        return parent.newBuilderForField(field);
-      } else {
-        ExtensionRegistry.ExtensionInfo extension =
-          extensionRegistry.findExtensionByNumber(field.getContainingType(),
-                                                  field.getNumber());
-        Assert.assertNotNull(extension);
-        Assert.assertNotNull(extension.defaultInstance);
-        return extension.defaultInstance.newBuilderForType();
-      }
-    }
-
-    // -------------------------------------------------------------------
-
-    /**
-     * Set every field of {@code message} to the values expected by
-     * {@code assertAllFieldsSet()}, using the {@link Message.Builder}
-     * reflection interface.
-     */
-    void setAllFieldsViaReflection(Message.Builder message) {
-      message.setField(f("optional_int32"   ), 101 );
-      message.setField(f("optional_int64"   ), 102L);
-      message.setField(f("optional_uint32"  ), 103 );
-      message.setField(f("optional_uint64"  ), 104L);
-      message.setField(f("optional_sint32"  ), 105 );
-      message.setField(f("optional_sint64"  ), 106L);
-      message.setField(f("optional_fixed32" ), 107 );
-      message.setField(f("optional_fixed64" ), 108L);
-      message.setField(f("optional_sfixed32"), 109 );
-      message.setField(f("optional_sfixed64"), 110L);
-      message.setField(f("optional_float"   ), 111F);
-      message.setField(f("optional_double"  ), 112D);
-      message.setField(f("optional_bool"    ), true);
-      message.setField(f("optional_string"  ), "115");
-      message.setField(f("optional_bytes"   ), toBytes("116"));
-
-      message.setField(f("optionalgroup"),
-        newBuilderForField(message, f("optionalgroup"))
-               .setField(groupA, 117).build());
-      message.setField(f("optional_nested_message"),
-        newBuilderForField(message, f("optional_nested_message"))
-               .setField(nestedB, 118).build());
-      message.setField(f("optional_foreign_message"),
-        newBuilderForField(message, f("optional_foreign_message"))
-               .setField(foreignC, 119).build());
-      message.setField(f("optional_import_message"),
-        newBuilderForField(message, f("optional_import_message"))
-               .setField(importD, 120).build());
-      message.setField(f("optional_public_import_message"),
-        newBuilderForField(message, f("optional_public_import_message"))
-               .setField(importE, 126).build());
-      message.setField(f("optional_lazy_message"),
-        newBuilderForField(message, f("optional_lazy_message"))
-               .setField(nestedB, 127).build());
-
-      message.setField(f("optional_nested_enum" ),  nestedBaz);
-      message.setField(f("optional_foreign_enum"), foreignBaz);
-      message.setField(f("optional_import_enum" ),  importBaz);
-
-      message.setField(f("optional_string_piece" ), "124");
-      message.setField(f("optional_cord" ), "125");
-
-      // -----------------------------------------------------------------
-
-      message.addRepeatedField(f("repeated_int32"   ), 201 );
-      message.addRepeatedField(f("repeated_int64"   ), 202L);
-      message.addRepeatedField(f("repeated_uint32"  ), 203 );
-      message.addRepeatedField(f("repeated_uint64"  ), 204L);
-      message.addRepeatedField(f("repeated_sint32"  ), 205 );
-      message.addRepeatedField(f("repeated_sint64"  ), 206L);
-      message.addRepeatedField(f("repeated_fixed32" ), 207 );
-      message.addRepeatedField(f("repeated_fixed64" ), 208L);
-      message.addRepeatedField(f("repeated_sfixed32"), 209 );
-      message.addRepeatedField(f("repeated_sfixed64"), 210L);
-      message.addRepeatedField(f("repeated_float"   ), 211F);
-      message.addRepeatedField(f("repeated_double"  ), 212D);
-      message.addRepeatedField(f("repeated_bool"    ), true);
-      message.addRepeatedField(f("repeated_string"  ), "215");
-      message.addRepeatedField(f("repeated_bytes"   ), toBytes("216"));
-
-      message.addRepeatedField(f("repeatedgroup"),
-        newBuilderForField(message, f("repeatedgroup"))
-               .setField(repeatedGroupA, 217).build());
-      message.addRepeatedField(f("repeated_nested_message"),
-        newBuilderForField(message, f("repeated_nested_message"))
-               .setField(nestedB, 218).build());
-      message.addRepeatedField(f("repeated_foreign_message"),
-        newBuilderForField(message, f("repeated_foreign_message"))
-               .setField(foreignC, 219).build());
-      message.addRepeatedField(f("repeated_import_message"),
-        newBuilderForField(message, f("repeated_import_message"))
-               .setField(importD, 220).build());
-      message.addRepeatedField(f("repeated_lazy_message"),
-        newBuilderForField(message, f("repeated_lazy_message"))
-               .setField(nestedB, 227).build());
-
-      message.addRepeatedField(f("repeated_nested_enum" ),  nestedBar);
-      message.addRepeatedField(f("repeated_foreign_enum"), foreignBar);
-      message.addRepeatedField(f("repeated_import_enum" ),  importBar);
-
-      message.addRepeatedField(f("repeated_string_piece" ), "224");
-      message.addRepeatedField(f("repeated_cord" ), "225");
-
-      // Add a second one of each field.
-      message.addRepeatedField(f("repeated_int32"   ), 301 );
-      message.addRepeatedField(f("repeated_int64"   ), 302L);
-      message.addRepeatedField(f("repeated_uint32"  ), 303 );
-      message.addRepeatedField(f("repeated_uint64"  ), 304L);
-      message.addRepeatedField(f("repeated_sint32"  ), 305 );
-      message.addRepeatedField(f("repeated_sint64"  ), 306L);
-      message.addRepeatedField(f("repeated_fixed32" ), 307 );
-      message.addRepeatedField(f("repeated_fixed64" ), 308L);
-      message.addRepeatedField(f("repeated_sfixed32"), 309 );
-      message.addRepeatedField(f("repeated_sfixed64"), 310L);
-      message.addRepeatedField(f("repeated_float"   ), 311F);
-      message.addRepeatedField(f("repeated_double"  ), 312D);
-      message.addRepeatedField(f("repeated_bool"    ), false);
-      message.addRepeatedField(f("repeated_string"  ), "315");
-      message.addRepeatedField(f("repeated_bytes"   ), toBytes("316"));
-
-      message.addRepeatedField(f("repeatedgroup"),
-        newBuilderForField(message, f("repeatedgroup"))
-               .setField(repeatedGroupA, 317).build());
-      message.addRepeatedField(f("repeated_nested_message"),
-        newBuilderForField(message, f("repeated_nested_message"))
-               .setField(nestedB, 318).build());
-      message.addRepeatedField(f("repeated_foreign_message"),
-        newBuilderForField(message, f("repeated_foreign_message"))
-               .setField(foreignC, 319).build());
-      message.addRepeatedField(f("repeated_import_message"),
-        newBuilderForField(message, f("repeated_import_message"))
-               .setField(importD, 320).build());
-      message.addRepeatedField(f("repeated_lazy_message"),
-        newBuilderForField(message, f("repeated_lazy_message"))
-               .setField(nestedB, 327).build());
-
-      message.addRepeatedField(f("repeated_nested_enum" ),  nestedBaz);
-      message.addRepeatedField(f("repeated_foreign_enum"), foreignBaz);
-      message.addRepeatedField(f("repeated_import_enum" ),  importBaz);
-
-      message.addRepeatedField(f("repeated_string_piece" ), "324");
-      message.addRepeatedField(f("repeated_cord" ), "325");
-
-      // -----------------------------------------------------------------
-
-      message.setField(f("default_int32"   ), 401 );
-      message.setField(f("default_int64"   ), 402L);
-      message.setField(f("default_uint32"  ), 403 );
-      message.setField(f("default_uint64"  ), 404L);
-      message.setField(f("default_sint32"  ), 405 );
-      message.setField(f("default_sint64"  ), 406L);
-      message.setField(f("default_fixed32" ), 407 );
-      message.setField(f("default_fixed64" ), 408L);
-      message.setField(f("default_sfixed32"), 409 );
-      message.setField(f("default_sfixed64"), 410L);
-      message.setField(f("default_float"   ), 411F);
-      message.setField(f("default_double"  ), 412D);
-      message.setField(f("default_bool"    ), false);
-      message.setField(f("default_string"  ), "415");
-      message.setField(f("default_bytes"   ), toBytes("416"));
-
-      message.setField(f("default_nested_enum" ),  nestedFoo);
-      message.setField(f("default_foreign_enum"), foreignFoo);
-      message.setField(f("default_import_enum" ),  importFoo);
-
-      message.setField(f("default_string_piece" ), "424");
-      message.setField(f("default_cord" ), "425");
-    }
-
-    // -------------------------------------------------------------------
-
-    /**
-     * Modify the repeated fields of {@code message} to contain the values
-     * expected by {@code assertRepeatedFieldsModified()}, using the
-     * {@link Message.Builder} reflection interface.
-     */
-    void modifyRepeatedFieldsViaReflection(Message.Builder message) {
-      message.setRepeatedField(f("repeated_int32"   ), 1, 501 );
-      message.setRepeatedField(f("repeated_int64"   ), 1, 502L);
-      message.setRepeatedField(f("repeated_uint32"  ), 1, 503 );
-      message.setRepeatedField(f("repeated_uint64"  ), 1, 504L);
-      message.setRepeatedField(f("repeated_sint32"  ), 1, 505 );
-      message.setRepeatedField(f("repeated_sint64"  ), 1, 506L);
-      message.setRepeatedField(f("repeated_fixed32" ), 1, 507 );
-      message.setRepeatedField(f("repeated_fixed64" ), 1, 508L);
-      message.setRepeatedField(f("repeated_sfixed32"), 1, 509 );
-      message.setRepeatedField(f("repeated_sfixed64"), 1, 510L);
-      message.setRepeatedField(f("repeated_float"   ), 1, 511F);
-      message.setRepeatedField(f("repeated_double"  ), 1, 512D);
-      message.setRepeatedField(f("repeated_bool"    ), 1, true);
-      message.setRepeatedField(f("repeated_string"  ), 1, "515");
-      message.setRepeatedField(f("repeated_bytes"   ), 1, toBytes("516"));
-
-      message.setRepeatedField(f("repeatedgroup"), 1,
-        newBuilderForField(message, f("repeatedgroup"))
-               .setField(repeatedGroupA, 517).build());
-      message.setRepeatedField(f("repeated_nested_message"), 1,
-        newBuilderForField(message, f("repeated_nested_message"))
-               .setField(nestedB, 518).build());
-      message.setRepeatedField(f("repeated_foreign_message"), 1,
-        newBuilderForField(message, f("repeated_foreign_message"))
-               .setField(foreignC, 519).build());
-      message.setRepeatedField(f("repeated_import_message"), 1,
-        newBuilderForField(message, f("repeated_import_message"))
-               .setField(importD, 520).build());
-      message.setRepeatedField(f("repeated_lazy_message"), 1,
-        newBuilderForField(message, f("repeated_lazy_message"))
-               .setField(nestedB, 527).build());
-
-      message.setRepeatedField(f("repeated_nested_enum" ), 1,  nestedFoo);
-      message.setRepeatedField(f("repeated_foreign_enum"), 1, foreignFoo);
-      message.setRepeatedField(f("repeated_import_enum" ), 1,  importFoo);
-
-      message.setRepeatedField(f("repeated_string_piece"), 1, "524");
-      message.setRepeatedField(f("repeated_cord"), 1, "525");
-    }
-
-    // -------------------------------------------------------------------
-
-    /**
-     * Assert (using {@code junit.framework.Assert}} that all fields of
-     * {@code message} are set to the values assigned by {@code setAllFields},
-     * using the {@link Message} reflection interface.
-     */
-    public void assertAllFieldsSetViaReflection(MessageOrBuilder message) {
-      Assert.assertTrue(message.hasField(f("optional_int32"   )));
-      Assert.assertTrue(message.hasField(f("optional_int64"   )));
-      Assert.assertTrue(message.hasField(f("optional_uint32"  )));
-      Assert.assertTrue(message.hasField(f("optional_uint64"  )));
-      Assert.assertTrue(message.hasField(f("optional_sint32"  )));
-      Assert.assertTrue(message.hasField(f("optional_sint64"  )));
-      Assert.assertTrue(message.hasField(f("optional_fixed32" )));
-      Assert.assertTrue(message.hasField(f("optional_fixed64" )));
-      Assert.assertTrue(message.hasField(f("optional_sfixed32")));
-      Assert.assertTrue(message.hasField(f("optional_sfixed64")));
-      Assert.assertTrue(message.hasField(f("optional_float"   )));
-      Assert.assertTrue(message.hasField(f("optional_double"  )));
-      Assert.assertTrue(message.hasField(f("optional_bool"    )));
-      Assert.assertTrue(message.hasField(f("optional_string"  )));
-      Assert.assertTrue(message.hasField(f("optional_bytes"   )));
-
-      Assert.assertTrue(message.hasField(f("optionalgroup"           )));
-      Assert.assertTrue(message.hasField(f("optional_nested_message" )));
-      Assert.assertTrue(message.hasField(f("optional_foreign_message")));
-      Assert.assertTrue(message.hasField(f("optional_import_message" )));
-
-      Assert.assertTrue(
-        ((Message)message.getField(f("optionalgroup"))).hasField(groupA));
-      Assert.assertTrue(
-        ((Message)message.getField(f("optional_nested_message")))
-                         .hasField(nestedB));
-      Assert.assertTrue(
-        ((Message)message.getField(f("optional_foreign_message")))
-                         .hasField(foreignC));
-      Assert.assertTrue(
-        ((Message)message.getField(f("optional_import_message")))
-                         .hasField(importD));
-
-      Assert.assertTrue(message.hasField(f("optional_nested_enum" )));
-      Assert.assertTrue(message.hasField(f("optional_foreign_enum")));
-      Assert.assertTrue(message.hasField(f("optional_import_enum" )));
-
-      Assert.assertTrue(message.hasField(f("optional_string_piece")));
-      Assert.assertTrue(message.hasField(f("optional_cord")));
-
-      Assert.assertEquals(101  , message.getField(f("optional_int32"   )));
-      Assert.assertEquals(102L , message.getField(f("optional_int64"   )));
-      Assert.assertEquals(103  , message.getField(f("optional_uint32"  )));
-      Assert.assertEquals(104L , message.getField(f("optional_uint64"  )));
-      Assert.assertEquals(105  , message.getField(f("optional_sint32"  )));
-      Assert.assertEquals(106L , message.getField(f("optional_sint64"  )));
-      Assert.assertEquals(107  , message.getField(f("optional_fixed32" )));
-      Assert.assertEquals(108L , message.getField(f("optional_fixed64" )));
-      Assert.assertEquals(109  , message.getField(f("optional_sfixed32")));
-      Assert.assertEquals(110L , message.getField(f("optional_sfixed64")));
-      Assert.assertEquals(111F , message.getField(f("optional_float"   )));
-      Assert.assertEquals(112D , message.getField(f("optional_double"  )));
-      Assert.assertEquals(true , message.getField(f("optional_bool"    )));
-      Assert.assertEquals("115", message.getField(f("optional_string"  )));
-      Assert.assertEquals(toBytes("116"), message.getField(f("optional_bytes")));
-
-      Assert.assertEquals(117,
-        ((Message)message.getField(f("optionalgroup"))).getField(groupA));
-      Assert.assertEquals(118,
-        ((Message)message.getField(f("optional_nested_message")))
-                         .getField(nestedB));
-      Assert.assertEquals(119,
-        ((Message)message.getField(f("optional_foreign_message")))
-                         .getField(foreignC));
-      Assert.assertEquals(120,
-        ((Message)message.getField(f("optional_import_message")))
-                         .getField(importD));
-      Assert.assertEquals(126,
-        ((Message)message.getField(f("optional_public_import_message")))
-                         .getField(importE));
-      Assert.assertEquals(127,
-        ((Message)message.getField(f("optional_lazy_message")))
-                         .getField(nestedB));
-
-      Assert.assertEquals( nestedBaz, message.getField(f("optional_nested_enum" )));
-      Assert.assertEquals(foreignBaz, message.getField(f("optional_foreign_enum")));
-      Assert.assertEquals( importBaz, message.getField(f("optional_import_enum" )));
-
-      Assert.assertEquals("124", message.getField(f("optional_string_piece")));
-      Assert.assertEquals("125", message.getField(f("optional_cord")));
-
-      // -----------------------------------------------------------------
-
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int32"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int64"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint32"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint64"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint32"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint64"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed32" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed64" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed32")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed64")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_float"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_double"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bool"    )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bytes"   )));
-
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeatedgroup"           )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_message" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_message")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_message" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_lazy_message" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_enum"    )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_enum"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_enum"    )));
-
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string_piece")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_cord")));
-
-      Assert.assertEquals(201  , message.getRepeatedField(f("repeated_int32"   ), 0));
-      Assert.assertEquals(202L , message.getRepeatedField(f("repeated_int64"   ), 0));
-      Assert.assertEquals(203  , message.getRepeatedField(f("repeated_uint32"  ), 0));
-      Assert.assertEquals(204L , message.getRepeatedField(f("repeated_uint64"  ), 0));
-      Assert.assertEquals(205  , message.getRepeatedField(f("repeated_sint32"  ), 0));
-      Assert.assertEquals(206L , message.getRepeatedField(f("repeated_sint64"  ), 0));
-      Assert.assertEquals(207  , message.getRepeatedField(f("repeated_fixed32" ), 0));
-      Assert.assertEquals(208L , message.getRepeatedField(f("repeated_fixed64" ), 0));
-      Assert.assertEquals(209  , message.getRepeatedField(f("repeated_sfixed32"), 0));
-      Assert.assertEquals(210L , message.getRepeatedField(f("repeated_sfixed64"), 0));
-      Assert.assertEquals(211F , message.getRepeatedField(f("repeated_float"   ), 0));
-      Assert.assertEquals(212D , message.getRepeatedField(f("repeated_double"  ), 0));
-      Assert.assertEquals(true , message.getRepeatedField(f("repeated_bool"    ), 0));
-      Assert.assertEquals("215", message.getRepeatedField(f("repeated_string"  ), 0));
-      Assert.assertEquals(toBytes("216"), message.getRepeatedField(f("repeated_bytes"), 0));
-
-      Assert.assertEquals(217,
-        ((Message)message.getRepeatedField(f("repeatedgroup"), 0))
-                         .getField(repeatedGroupA));
-      Assert.assertEquals(218,
-        ((Message)message.getRepeatedField(f("repeated_nested_message"), 0))
-                         .getField(nestedB));
-      Assert.assertEquals(219,
-        ((Message)message.getRepeatedField(f("repeated_foreign_message"), 0))
-                         .getField(foreignC));
-      Assert.assertEquals(220,
-        ((Message)message.getRepeatedField(f("repeated_import_message"), 0))
-                         .getField(importD));
-      Assert.assertEquals(227,
-        ((Message)message.getRepeatedField(f("repeated_lazy_message"), 0))
-                         .getField(nestedB));
-
-      Assert.assertEquals( nestedBar, message.getRepeatedField(f("repeated_nested_enum" ),0));
-      Assert.assertEquals(foreignBar, message.getRepeatedField(f("repeated_foreign_enum"),0));
-      Assert.assertEquals( importBar, message.getRepeatedField(f("repeated_import_enum" ),0));
-
-      Assert.assertEquals("224", message.getRepeatedField(f("repeated_string_piece"), 0));
-      Assert.assertEquals("225", message.getRepeatedField(f("repeated_cord"), 0));
-
-      Assert.assertEquals(301  , message.getRepeatedField(f("repeated_int32"   ), 1));
-      Assert.assertEquals(302L , message.getRepeatedField(f("repeated_int64"   ), 1));
-      Assert.assertEquals(303  , message.getRepeatedField(f("repeated_uint32"  ), 1));
-      Assert.assertEquals(304L , message.getRepeatedField(f("repeated_uint64"  ), 1));
-      Assert.assertEquals(305  , message.getRepeatedField(f("repeated_sint32"  ), 1));
-      Assert.assertEquals(306L , message.getRepeatedField(f("repeated_sint64"  ), 1));
-      Assert.assertEquals(307  , message.getRepeatedField(f("repeated_fixed32" ), 1));
-      Assert.assertEquals(308L , message.getRepeatedField(f("repeated_fixed64" ), 1));
-      Assert.assertEquals(309  , message.getRepeatedField(f("repeated_sfixed32"), 1));
-      Assert.assertEquals(310L , message.getRepeatedField(f("repeated_sfixed64"), 1));
-      Assert.assertEquals(311F , message.getRepeatedField(f("repeated_float"   ), 1));
-      Assert.assertEquals(312D , message.getRepeatedField(f("repeated_double"  ), 1));
-      Assert.assertEquals(false, message.getRepeatedField(f("repeated_bool"    ), 1));
-      Assert.assertEquals("315", message.getRepeatedField(f("repeated_string"  ), 1));
-      Assert.assertEquals(toBytes("316"), message.getRepeatedField(f("repeated_bytes"), 1));
-
-      Assert.assertEquals(317,
-        ((Message)message.getRepeatedField(f("repeatedgroup"), 1))
-                         .getField(repeatedGroupA));
-      Assert.assertEquals(318,
-        ((Message)message.getRepeatedField(f("repeated_nested_message"), 1))
-                         .getField(nestedB));
-      Assert.assertEquals(319,
-        ((Message)message.getRepeatedField(f("repeated_foreign_message"), 1))
-                         .getField(foreignC));
-      Assert.assertEquals(320,
-        ((Message)message.getRepeatedField(f("repeated_import_message"), 1))
-                         .getField(importD));
-      Assert.assertEquals(327,
-        ((Message)message.getRepeatedField(f("repeated_lazy_message"), 1))
-                         .getField(nestedB));
-
-      Assert.assertEquals( nestedBaz, message.getRepeatedField(f("repeated_nested_enum" ),1));
-      Assert.assertEquals(foreignBaz, message.getRepeatedField(f("repeated_foreign_enum"),1));
-      Assert.assertEquals( importBaz, message.getRepeatedField(f("repeated_import_enum" ),1));
-
-      Assert.assertEquals("324", message.getRepeatedField(f("repeated_string_piece"), 1));
-      Assert.assertEquals("325", message.getRepeatedField(f("repeated_cord"), 1));
-
-      // -----------------------------------------------------------------
-
-      Assert.assertTrue(message.hasField(f("default_int32"   )));
-      Assert.assertTrue(message.hasField(f("default_int64"   )));
-      Assert.assertTrue(message.hasField(f("default_uint32"  )));
-      Assert.assertTrue(message.hasField(f("default_uint64"  )));
-      Assert.assertTrue(message.hasField(f("default_sint32"  )));
-      Assert.assertTrue(message.hasField(f("default_sint64"  )));
-      Assert.assertTrue(message.hasField(f("default_fixed32" )));
-      Assert.assertTrue(message.hasField(f("default_fixed64" )));
-      Assert.assertTrue(message.hasField(f("default_sfixed32")));
-      Assert.assertTrue(message.hasField(f("default_sfixed64")));
-      Assert.assertTrue(message.hasField(f("default_float"   )));
-      Assert.assertTrue(message.hasField(f("default_double"  )));
-      Assert.assertTrue(message.hasField(f("default_bool"    )));
-      Assert.assertTrue(message.hasField(f("default_string"  )));
-      Assert.assertTrue(message.hasField(f("default_bytes"   )));
-
-      Assert.assertTrue(message.hasField(f("default_nested_enum" )));
-      Assert.assertTrue(message.hasField(f("default_foreign_enum")));
-      Assert.assertTrue(message.hasField(f("default_import_enum" )));
-
-      Assert.assertTrue(message.hasField(f("default_string_piece")));
-      Assert.assertTrue(message.hasField(f("default_cord")));
-
-      Assert.assertEquals(401  , message.getField(f("default_int32"   )));
-      Assert.assertEquals(402L , message.getField(f("default_int64"   )));
-      Assert.assertEquals(403  , message.getField(f("default_uint32"  )));
-      Assert.assertEquals(404L , message.getField(f("default_uint64"  )));
-      Assert.assertEquals(405  , message.getField(f("default_sint32"  )));
-      Assert.assertEquals(406L , message.getField(f("default_sint64"  )));
-      Assert.assertEquals(407  , message.getField(f("default_fixed32" )));
-      Assert.assertEquals(408L , message.getField(f("default_fixed64" )));
-      Assert.assertEquals(409  , message.getField(f("default_sfixed32")));
-      Assert.assertEquals(410L , message.getField(f("default_sfixed64")));
-      Assert.assertEquals(411F , message.getField(f("default_float"   )));
-      Assert.assertEquals(412D , message.getField(f("default_double"  )));
-      Assert.assertEquals(false, message.getField(f("default_bool"    )));
-      Assert.assertEquals("415", message.getField(f("default_string"  )));
-      Assert.assertEquals(toBytes("416"), message.getField(f("default_bytes")));
-
-      Assert.assertEquals( nestedFoo, message.getField(f("default_nested_enum" )));
-      Assert.assertEquals(foreignFoo, message.getField(f("default_foreign_enum")));
-      Assert.assertEquals( importFoo, message.getField(f("default_import_enum" )));
-
-      Assert.assertEquals("424", message.getField(f("default_string_piece")));
-      Assert.assertEquals("425", message.getField(f("default_cord")));
-    }
-
-    // -------------------------------------------------------------------
-
-    /**
-     * Assert (using {@code junit.framework.Assert}} that all fields of
-     * {@code message} are cleared, and that getting the fields returns their
-     * default values, using the {@link Message} reflection interface.
-     */
-    public void assertClearViaReflection(MessageOrBuilder message) {
-      // has_blah() should initially be false for all optional fields.
-      Assert.assertFalse(message.hasField(f("optional_int32"   )));
-      Assert.assertFalse(message.hasField(f("optional_int64"   )));
-      Assert.assertFalse(message.hasField(f("optional_uint32"  )));
-      Assert.assertFalse(message.hasField(f("optional_uint64"  )));
-      Assert.assertFalse(message.hasField(f("optional_sint32"  )));
-      Assert.assertFalse(message.hasField(f("optional_sint64"  )));
-      Assert.assertFalse(message.hasField(f("optional_fixed32" )));
-      Assert.assertFalse(message.hasField(f("optional_fixed64" )));
-      Assert.assertFalse(message.hasField(f("optional_sfixed32")));
-      Assert.assertFalse(message.hasField(f("optional_sfixed64")));
-      Assert.assertFalse(message.hasField(f("optional_float"   )));
-      Assert.assertFalse(message.hasField(f("optional_double"  )));
-      Assert.assertFalse(message.hasField(f("optional_bool"    )));
-      Assert.assertFalse(message.hasField(f("optional_string"  )));
-      Assert.assertFalse(message.hasField(f("optional_bytes"   )));
-
-      Assert.assertFalse(message.hasField(f("optionalgroup"           )));
-      Assert.assertFalse(message.hasField(f("optional_nested_message" )));
-      Assert.assertFalse(message.hasField(f("optional_foreign_message")));
-      Assert.assertFalse(message.hasField(f("optional_import_message" )));
-
-      Assert.assertFalse(message.hasField(f("optional_nested_enum" )));
-      Assert.assertFalse(message.hasField(f("optional_foreign_enum")));
-      Assert.assertFalse(message.hasField(f("optional_import_enum" )));
-
-      Assert.assertFalse(message.hasField(f("optional_string_piece")));
-      Assert.assertFalse(message.hasField(f("optional_cord")));
-
-      // Optional fields without defaults are set to zero or something like it.
-      Assert.assertEquals(0    , message.getField(f("optional_int32"   )));
-      Assert.assertEquals(0L   , message.getField(f("optional_int64"   )));
-      Assert.assertEquals(0    , message.getField(f("optional_uint32"  )));
-      Assert.assertEquals(0L   , message.getField(f("optional_uint64"  )));
-      Assert.assertEquals(0    , message.getField(f("optional_sint32"  )));
-      Assert.assertEquals(0L   , message.getField(f("optional_sint64"  )));
-      Assert.assertEquals(0    , message.getField(f("optional_fixed32" )));
-      Assert.assertEquals(0L   , message.getField(f("optional_fixed64" )));
-      Assert.assertEquals(0    , message.getField(f("optional_sfixed32")));
-      Assert.assertEquals(0L   , message.getField(f("optional_sfixed64")));
-      Assert.assertEquals(0F   , message.getField(f("optional_float"   )));
-      Assert.assertEquals(0D   , message.getField(f("optional_double"  )));
-      Assert.assertEquals(false, message.getField(f("optional_bool"    )));
-      Assert.assertEquals(""   , message.getField(f("optional_string"  )));
-      Assert.assertEquals(ByteString.EMPTY, message.getField(f("optional_bytes")));
-
-      // Embedded messages should also be clear.
-      Assert.assertFalse(
-        ((Message)message.getField(f("optionalgroup"))).hasField(groupA));
-      Assert.assertFalse(
-        ((Message)message.getField(f("optional_nested_message")))
-                         .hasField(nestedB));
-      Assert.assertFalse(
-        ((Message)message.getField(f("optional_foreign_message")))
-                         .hasField(foreignC));
-      Assert.assertFalse(
-        ((Message)message.getField(f("optional_import_message")))
-                         .hasField(importD));
-      Assert.assertFalse(
-        ((Message)message.getField(f("optional_public_import_message")))
-                         .hasField(importE));
-      Assert.assertFalse(
-        ((Message)message.getField(f("optional_lazy_message")))
-                         .hasField(nestedB));
-
-      Assert.assertEquals(0,
-        ((Message)message.getField(f("optionalgroup"))).getField(groupA));
-      Assert.assertEquals(0,
-        ((Message)message.getField(f("optional_nested_message")))
-                         .getField(nestedB));
-      Assert.assertEquals(0,
-        ((Message)message.getField(f("optional_foreign_message")))
-                         .getField(foreignC));
-      Assert.assertEquals(0,
-        ((Message)message.getField(f("optional_import_message")))
-                         .getField(importD));
-      Assert.assertEquals(0,
-        ((Message)message.getField(f("optional_public_import_message")))
-                         .getField(importE));
-      Assert.assertEquals(0,
-        ((Message)message.getField(f("optional_lazy_message")))
-                         .getField(nestedB));
-
-      // Enums without defaults are set to the first value in the enum.
-      Assert.assertEquals( nestedFoo, message.getField(f("optional_nested_enum" )));
-      Assert.assertEquals(foreignFoo, message.getField(f("optional_foreign_enum")));
-      Assert.assertEquals( importFoo, message.getField(f("optional_import_enum" )));
-
-      Assert.assertEquals("", message.getField(f("optional_string_piece")));
-      Assert.assertEquals("", message.getField(f("optional_cord")));
-
-      // Repeated fields are empty.
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_int32"   )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_int64"   )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_uint32"  )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_uint64"  )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sint32"  )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sint64"  )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_fixed32" )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_fixed64" )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sfixed32")));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sfixed64")));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_float"   )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_double"  )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_bool"    )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_string"  )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_bytes"   )));
-
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeatedgroup"           )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_nested_message" )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_foreign_message")));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_import_message" )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_lazy_message"   )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_nested_enum"    )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_foreign_enum"   )));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_import_enum"    )));
-
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_string_piece")));
-      Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_cord")));
-
-      // has_blah() should also be false for all default fields.
-      Assert.assertFalse(message.hasField(f("default_int32"   )));
-      Assert.assertFalse(message.hasField(f("default_int64"   )));
-      Assert.assertFalse(message.hasField(f("default_uint32"  )));
-      Assert.assertFalse(message.hasField(f("default_uint64"  )));
-      Assert.assertFalse(message.hasField(f("default_sint32"  )));
-      Assert.assertFalse(message.hasField(f("default_sint64"  )));
-      Assert.assertFalse(message.hasField(f("default_fixed32" )));
-      Assert.assertFalse(message.hasField(f("default_fixed64" )));
-      Assert.assertFalse(message.hasField(f("default_sfixed32")));
-      Assert.assertFalse(message.hasField(f("default_sfixed64")));
-      Assert.assertFalse(message.hasField(f("default_float"   )));
-      Assert.assertFalse(message.hasField(f("default_double"  )));
-      Assert.assertFalse(message.hasField(f("default_bool"    )));
-      Assert.assertFalse(message.hasField(f("default_string"  )));
-      Assert.assertFalse(message.hasField(f("default_bytes"   )));
-
-      Assert.assertFalse(message.hasField(f("default_nested_enum" )));
-      Assert.assertFalse(message.hasField(f("default_foreign_enum")));
-      Assert.assertFalse(message.hasField(f("default_import_enum" )));
-
-      Assert.assertFalse(message.hasField(f("default_string_piece" )));
-      Assert.assertFalse(message.hasField(f("default_cord" )));
-
-      // Fields with defaults have their default values (duh).
-      Assert.assertEquals( 41    , message.getField(f("default_int32"   )));
-      Assert.assertEquals( 42L   , message.getField(f("default_int64"   )));
-      Assert.assertEquals( 43    , message.getField(f("default_uint32"  )));
-      Assert.assertEquals( 44L   , message.getField(f("default_uint64"  )));
-      Assert.assertEquals(-45    , message.getField(f("default_sint32"  )));
-      Assert.assertEquals( 46L   , message.getField(f("default_sint64"  )));
-      Assert.assertEquals( 47    , message.getField(f("default_fixed32" )));
-      Assert.assertEquals( 48L   , message.getField(f("default_fixed64" )));
-      Assert.assertEquals( 49    , message.getField(f("default_sfixed32")));
-      Assert.assertEquals(-50L   , message.getField(f("default_sfixed64")));
-      Assert.assertEquals( 51.5F , message.getField(f("default_float"   )));
-      Assert.assertEquals( 52e3D , message.getField(f("default_double"  )));
-      Assert.assertEquals(true   , message.getField(f("default_bool"    )));
-      Assert.assertEquals("hello", message.getField(f("default_string"  )));
-      Assert.assertEquals(toBytes("world"), message.getField(f("default_bytes")));
-
-      Assert.assertEquals( nestedBar, message.getField(f("default_nested_enum" )));
-      Assert.assertEquals(foreignBar, message.getField(f("default_foreign_enum")));
-      Assert.assertEquals( importBar, message.getField(f("default_import_enum" )));
-
-      Assert.assertEquals("abc", message.getField(f("default_string_piece")));
-      Assert.assertEquals("123", message.getField(f("default_cord")));
-    }
-
-
-    // ---------------------------------------------------------------
-
-    public void assertRepeatedFieldsModifiedViaReflection(
-        MessageOrBuilder message) {
-      // 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.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int32"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int64"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint32"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint64"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint32"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint64"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed32" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed64" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed32")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed64")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_float"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_double"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bool"    )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bytes"   )));
-
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeatedgroup"           )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_message" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_message")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_message" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_lazy_message"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_enum"    )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_enum"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_enum"    )));
-
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string_piece")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_cord")));
-
-      Assert.assertEquals(201  , message.getRepeatedField(f("repeated_int32"   ), 0));
-      Assert.assertEquals(202L , message.getRepeatedField(f("repeated_int64"   ), 0));
-      Assert.assertEquals(203  , message.getRepeatedField(f("repeated_uint32"  ), 0));
-      Assert.assertEquals(204L , message.getRepeatedField(f("repeated_uint64"  ), 0));
-      Assert.assertEquals(205  , message.getRepeatedField(f("repeated_sint32"  ), 0));
-      Assert.assertEquals(206L , message.getRepeatedField(f("repeated_sint64"  ), 0));
-      Assert.assertEquals(207  , message.getRepeatedField(f("repeated_fixed32" ), 0));
-      Assert.assertEquals(208L , message.getRepeatedField(f("repeated_fixed64" ), 0));
-      Assert.assertEquals(209  , message.getRepeatedField(f("repeated_sfixed32"), 0));
-      Assert.assertEquals(210L , message.getRepeatedField(f("repeated_sfixed64"), 0));
-      Assert.assertEquals(211F , message.getRepeatedField(f("repeated_float"   ), 0));
-      Assert.assertEquals(212D , message.getRepeatedField(f("repeated_double"  ), 0));
-      Assert.assertEquals(true , message.getRepeatedField(f("repeated_bool"    ), 0));
-      Assert.assertEquals("215", message.getRepeatedField(f("repeated_string"  ), 0));
-      Assert.assertEquals(toBytes("216"), message.getRepeatedField(f("repeated_bytes"), 0));
-
-      Assert.assertEquals(217,
-        ((Message)message.getRepeatedField(f("repeatedgroup"), 0))
-                         .getField(repeatedGroupA));
-      Assert.assertEquals(218,
-        ((Message)message.getRepeatedField(f("repeated_nested_message"), 0))
-                         .getField(nestedB));
-      Assert.assertEquals(219,
-        ((Message)message.getRepeatedField(f("repeated_foreign_message"), 0))
-                         .getField(foreignC));
-      Assert.assertEquals(220,
-        ((Message)message.getRepeatedField(f("repeated_import_message"), 0))
-                         .getField(importD));
-      Assert.assertEquals(227,
-        ((Message)message.getRepeatedField(f("repeated_lazy_message"), 0))
-                         .getField(nestedB));
-
-      Assert.assertEquals( nestedBar, message.getRepeatedField(f("repeated_nested_enum" ),0));
-      Assert.assertEquals(foreignBar, message.getRepeatedField(f("repeated_foreign_enum"),0));
-      Assert.assertEquals( importBar, message.getRepeatedField(f("repeated_import_enum" ),0));
-
-      Assert.assertEquals("224", message.getRepeatedField(f("repeated_string_piece"), 0));
-      Assert.assertEquals("225", message.getRepeatedField(f("repeated_cord"), 0));
-
-      Assert.assertEquals(501  , message.getRepeatedField(f("repeated_int32"   ), 1));
-      Assert.assertEquals(502L , message.getRepeatedField(f("repeated_int64"   ), 1));
-      Assert.assertEquals(503  , message.getRepeatedField(f("repeated_uint32"  ), 1));
-      Assert.assertEquals(504L , message.getRepeatedField(f("repeated_uint64"  ), 1));
-      Assert.assertEquals(505  , message.getRepeatedField(f("repeated_sint32"  ), 1));
-      Assert.assertEquals(506L , message.getRepeatedField(f("repeated_sint64"  ), 1));
-      Assert.assertEquals(507  , message.getRepeatedField(f("repeated_fixed32" ), 1));
-      Assert.assertEquals(508L , message.getRepeatedField(f("repeated_fixed64" ), 1));
-      Assert.assertEquals(509  , message.getRepeatedField(f("repeated_sfixed32"), 1));
-      Assert.assertEquals(510L , message.getRepeatedField(f("repeated_sfixed64"), 1));
-      Assert.assertEquals(511F , message.getRepeatedField(f("repeated_float"   ), 1));
-      Assert.assertEquals(512D , message.getRepeatedField(f("repeated_double"  ), 1));
-      Assert.assertEquals(true , message.getRepeatedField(f("repeated_bool"    ), 1));
-      Assert.assertEquals("515", message.getRepeatedField(f("repeated_string"  ), 1));
-      Assert.assertEquals(toBytes("516"), message.getRepeatedField(f("repeated_bytes"), 1));
-
-      Assert.assertEquals(517,
-        ((Message)message.getRepeatedField(f("repeatedgroup"), 1))
-                         .getField(repeatedGroupA));
-      Assert.assertEquals(518,
-        ((Message)message.getRepeatedField(f("repeated_nested_message"), 1))
-                         .getField(nestedB));
-      Assert.assertEquals(519,
-        ((Message)message.getRepeatedField(f("repeated_foreign_message"), 1))
-                         .getField(foreignC));
-      Assert.assertEquals(520,
-        ((Message)message.getRepeatedField(f("repeated_import_message"), 1))
-                         .getField(importD));
-      Assert.assertEquals(527,
-        ((Message)message.getRepeatedField(f("repeated_lazy_message"), 1))
-                         .getField(nestedB));
-
-      Assert.assertEquals( nestedFoo, message.getRepeatedField(f("repeated_nested_enum" ),1));
-      Assert.assertEquals(foreignFoo, message.getRepeatedField(f("repeated_foreign_enum"),1));
-      Assert.assertEquals( importFoo, message.getRepeatedField(f("repeated_import_enum" ),1));
-
-      Assert.assertEquals("524", message.getRepeatedField(f("repeated_string_piece"), 1));
-      Assert.assertEquals("525", message.getRepeatedField(f("repeated_cord"), 1));
-    }
-
-    public void setPackedFieldsViaReflection(Message.Builder message) {
-      message.addRepeatedField(f("packed_int32"   ), 601 );
-      message.addRepeatedField(f("packed_int64"   ), 602L);
-      message.addRepeatedField(f("packed_uint32"  ), 603 );
-      message.addRepeatedField(f("packed_uint64"  ), 604L);
-      message.addRepeatedField(f("packed_sint32"  ), 605 );
-      message.addRepeatedField(f("packed_sint64"  ), 606L);
-      message.addRepeatedField(f("packed_fixed32" ), 607 );
-      message.addRepeatedField(f("packed_fixed64" ), 608L);
-      message.addRepeatedField(f("packed_sfixed32"), 609 );
-      message.addRepeatedField(f("packed_sfixed64"), 610L);
-      message.addRepeatedField(f("packed_float"   ), 611F);
-      message.addRepeatedField(f("packed_double"  ), 612D);
-      message.addRepeatedField(f("packed_bool"    ), true);
-      message.addRepeatedField(f("packed_enum" ),  foreignBar);
-      // Add a second one of each field.
-      message.addRepeatedField(f("packed_int32"   ), 701 );
-      message.addRepeatedField(f("packed_int64"   ), 702L);
-      message.addRepeatedField(f("packed_uint32"  ), 703 );
-      message.addRepeatedField(f("packed_uint64"  ), 704L);
-      message.addRepeatedField(f("packed_sint32"  ), 705 );
-      message.addRepeatedField(f("packed_sint64"  ), 706L);
-      message.addRepeatedField(f("packed_fixed32" ), 707 );
-      message.addRepeatedField(f("packed_fixed64" ), 708L);
-      message.addRepeatedField(f("packed_sfixed32"), 709 );
-      message.addRepeatedField(f("packed_sfixed64"), 710L);
-      message.addRepeatedField(f("packed_float"   ), 711F);
-      message.addRepeatedField(f("packed_double"  ), 712D);
-      message.addRepeatedField(f("packed_bool"    ), false);
-      message.addRepeatedField(f("packed_enum" ),  foreignBaz);
-    }
-
-    public void assertPackedFieldsSetViaReflection(MessageOrBuilder message) {
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_int32"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_int64"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_uint32"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_uint64"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sint32"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sint64"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_fixed32" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_fixed64" )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sfixed32")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sfixed64")));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_float"   )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_double"  )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_bool"    )));
-      Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_enum"   )));
-      Assert.assertEquals(601  , message.getRepeatedField(f("packed_int32"   ), 0));
-      Assert.assertEquals(602L , message.getRepeatedField(f("packed_int64"   ), 0));
-      Assert.assertEquals(603  , message.getRepeatedField(f("packed_uint32"  ), 0));
-      Assert.assertEquals(604L , message.getRepeatedField(f("packed_uint64"  ), 0));
-      Assert.assertEquals(605  , message.getRepeatedField(f("packed_sint32"  ), 0));
-      Assert.assertEquals(606L , message.getRepeatedField(f("packed_sint64"  ), 0));
-      Assert.assertEquals(607  , message.getRepeatedField(f("packed_fixed32" ), 0));
-      Assert.assertEquals(608L , message.getRepeatedField(f("packed_fixed64" ), 0));
-      Assert.assertEquals(609  , message.getRepeatedField(f("packed_sfixed32"), 0));
-      Assert.assertEquals(610L , message.getRepeatedField(f("packed_sfixed64"), 0));
-      Assert.assertEquals(611F , message.getRepeatedField(f("packed_float"   ), 0));
-      Assert.assertEquals(612D , message.getRepeatedField(f("packed_double"  ), 0));
-      Assert.assertEquals(true , message.getRepeatedField(f("packed_bool"    ), 0));
-      Assert.assertEquals(foreignBar, message.getRepeatedField(f("packed_enum" ),0));
-      Assert.assertEquals(701  , message.getRepeatedField(f("packed_int32"   ), 1));
-      Assert.assertEquals(702L , message.getRepeatedField(f("packed_int64"   ), 1));
-      Assert.assertEquals(703  , message.getRepeatedField(f("packed_uint32"  ), 1));
-      Assert.assertEquals(704L , message.getRepeatedField(f("packed_uint64"  ), 1));
-      Assert.assertEquals(705  , message.getRepeatedField(f("packed_sint32"  ), 1));
-      Assert.assertEquals(706L , message.getRepeatedField(f("packed_sint64"  ), 1));
-      Assert.assertEquals(707  , message.getRepeatedField(f("packed_fixed32" ), 1));
-      Assert.assertEquals(708L , message.getRepeatedField(f("packed_fixed64" ), 1));
-      Assert.assertEquals(709  , message.getRepeatedField(f("packed_sfixed32"), 1));
-      Assert.assertEquals(710L , message.getRepeatedField(f("packed_sfixed64"), 1));
-      Assert.assertEquals(711F , message.getRepeatedField(f("packed_float"   ), 1));
-      Assert.assertEquals(712D , message.getRepeatedField(f("packed_double"  ), 1));
-      Assert.assertEquals(false, message.getRepeatedField(f("packed_bool"    ), 1));
-      Assert.assertEquals(foreignBaz, message.getRepeatedField(f("packed_enum" ),1));
-    }
-
-    /**
-     * Verifies that the reflection setters for the given.Builder object throw a
-     * NullPointerException if they are passed a null value.  Uses Assert to throw an
-     * appropriate assertion failure, if the condition is not verified.
-     */
-    public void assertReflectionSettersRejectNull(Message.Builder builder)
-        throws Exception {
-      try {
-        builder.setField(f("optional_string"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.setField(f("optional_bytes"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.setField(f("optional_nested_enum"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.setField(f("optional_nested_message"),
-                         (TestAllTypes.NestedMessage) null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.setField(f("optional_nested_message"),
-                         (TestAllTypes.NestedMessage.Builder) null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-
-      try {
-        builder.addRepeatedField(f("repeated_string"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.addRepeatedField(f("repeated_bytes"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.addRepeatedField(f("repeated_nested_enum"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-      try {
-        builder.addRepeatedField(f("repeated_nested_message"), null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-    }
-
-    /**
-     * Verifies that the reflection repeated setters for the given Builder object throw a
-     * NullPointerException if they are passed a null value.  Uses Assert to throw an appropriate
-     * assertion failure, if the condition is not verified.
-     */
-    public void assertReflectionRepeatedSettersRejectNull(Message.Builder builder)
-        throws Exception {
-      builder.addRepeatedField(f("repeated_string"), "one");
-      try {
-        builder.setRepeatedField(f("repeated_string"), 0, null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-
-      builder.addRepeatedField(f("repeated_bytes"), toBytes("one"));
-      try {
-        builder.setRepeatedField(f("repeated_bytes"), 0, null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-
-      builder.addRepeatedField(f("repeated_nested_enum"), nestedBaz);
-      try {
-        builder.setRepeatedField(f("repeated_nested_enum"), 0, null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-
-      builder.addRepeatedField(
-          f("repeated_nested_message"),
-          TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
-      try {
-        builder.setRepeatedField(f("repeated_nested_message"), 0, null);
-        Assert.fail("Exception was not thrown");
-      } catch (NullPointerException e) {
-        // We expect this exception.
-      }
-    }
-  }
-
-  /**
-   * @param filePath The path relative to
-   * {@link #getTestDataDir}.
-   */
-  public static String readTextFromFile(String filePath) {
-    return readBytesFromFile(filePath).toStringUtf8();
-  }
-
-  private static File getTestDataDir() {
-    // Search each parent directory looking for "src/google/protobuf".
-    File ancestor = new File(".");
-    try {
-      ancestor = ancestor.getCanonicalFile();
-    } catch (IOException e) {
-      throw new RuntimeException(
-        "Couldn't get canonical name of working directory.", e);
-    }
-    while (ancestor != null && ancestor.exists()) {
-      if (new File(ancestor, "src/google/protobuf").exists()) {
-        return new File(ancestor, "src/google/protobuf/testdata");
-      }
-      ancestor = ancestor.getParentFile();
-    }
-
-    throw new RuntimeException(
-      "Could not find golden files.  This test must be run from within the " +
-      "protobuf source package so that it can read test data files from the " +
-      "C++ source tree: " + new File(".").getAbsolutePath());
-  }
-
-  /**
-   * @param filename The path relative to
-   * {@link #getTestDataDir}.
-   */
-  public static ByteString readBytesFromFile(String filename) {
-    File fullPath = new File(getTestDataDir(), filename);
-    try {
-      RandomAccessFile file = new RandomAccessFile(fullPath, "r");
-      byte[] content = new byte[(int) file.length()];
-      file.readFully(content);
-      return ByteString.copyFrom(content);
-    } catch (IOException e) {
-      // Throw a RuntimeException here so that we can call this function from
-      // static initializers.
-      throw new IllegalArgumentException(
-        "Couldn't read file: " + fullPath.getPath(), e);
-    }
-  }
-
-  /**
-   * Get the bytes of the "golden message".  This is a serialized TestAllTypes
-   * with all fields set as they would be by
-   * {@link #setAllFields(TestAllTypes.Builder)}, but it is loaded from a file
-   * on disk rather than generated dynamically.  The file is actually generated
-   * by C++ code, so testing against it verifies compatibility with C++.
-   */
-  public static ByteString getGoldenMessage() {
-    if (goldenMessage == null) {
-      goldenMessage = readBytesFromFile("golden_message");
-    }
-    return goldenMessage;
-  }
-  private static ByteString goldenMessage = null;
-
-  /**
-   * Get the bytes of the "golden packed fields message".  This is a serialized
-   * TestPackedTypes with all fields set as they would be by
-   * {@link #setPackedFields(TestPackedTypes.Builder)}, but it is loaded from a
-   * file on disk rather than generated dynamically.  The file is actually
-   * generated by C++ code, so testing against it verifies compatibility with
-   * C++.
-   */
-  public static ByteString getGoldenPackedFieldsMessage() {
-    if (goldenPackedFieldsMessage == null) {
-      goldenPackedFieldsMessage =
-          readBytesFromFile("golden_packed_fields_message");
-    }
-    return goldenPackedFieldsMessage;
-  }
-  private static ByteString goldenPackedFieldsMessage = null;
-
-  public static abstract class HackMessage extends GeneratedMessage {
-    public interface MyInterface extends BuilderParent {
-    }
-  }
-  /**
-   * Mock implementation of {@link GeneratedMessage.BuilderParent} for testing.
-   *
-   * @author jonp@google.com (Jon Perlow)
-   */
-  public static class MockBuilderParent
-      implements HackMessage.MyInterface {
-
-    private int invalidations;
-
-    //@Override (Java 1.6 override semantics, but we must support 1.5)
-    public void markDirty() {
-      invalidations++;
-    }
-
-    public int getInvalidationCount() {
-      return invalidations;
-    }
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TextFormatTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TextFormatTest.java
deleted file mode 100644
index edcc890..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/TextFormatTest.java
+++ /dev/null
@@ -1,536 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import protobuf_unittest.UnittestMset.TestMessageSet;
-import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
-import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
-import protobuf_unittest.UnittestProto.OneString;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;
-import protobuf_unittest.UnittestProto.TestEmptyMessage;
-
-import junit.framework.TestCase;
-
-import java.io.StringReader;
-
-/**
- * Test case for {@link TextFormat}.
- *
- * TODO(wenboz): ExtensionTest and rest of text_format_unittest.cc.
- *
- * @author wenboz@google.com (Wenbo Zhu)
- */
-public class TextFormatTest extends TestCase {
-
-  // A basic string with different escapable characters for testing.
-  private final static String kEscapeTestString =
-      "\"A string with ' characters \n and \r newlines and \t tabs and \001 "
-          + "slashes \\";
-
-  // A representation of the above string with all the characters escaped.
-  private final static String kEscapeTestStringEscaped =
-      "\\\"A string with \\' characters \\n and \\r newlines "
-          + "and \\t tabs and \\001 slashes \\\\";
-
-  private static String allFieldsSetText = TestUtil.readTextFromFile(
-    "text_format_unittest_data.txt");
-  private static String allExtensionsSetText = TestUtil.readTextFromFile(
-    "text_format_unittest_extensions_data.txt");
-
-  private static String exoticText =
-    "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: .125\n" +
-    "repeated_double: -.125\n" +
-    "repeated_double: 1.23E17\n" +
-    "repeated_double: 1.23E+17\n" +
-    "repeated_double: -1.23e-17\n" +
-    "repeated_double: .23e+17\n" +
-    "repeated_double: -.23E17\n" +
-    "repeated_double: 1.235E22\n" +
-    "repeated_double: 1.235E-18\n" +
-    "repeated_double: 123.456789\n" +
-    "repeated_double: Infinity\n" +
-    "repeated_double: -Infinity\n" +
-    "repeated_double: NaN\n" +
-    "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"" +
-      "\\341\\210\\264\"\n" +
-    "repeated_bytes: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\\376\"\n";
-
-  private static String canonicalExoticText =
-      exoticText.replace(": .", ": 0.").replace(": -.", ": -0.")   // short-form double
-      .replace("23e", "23E").replace("E+", "E").replace("0.23E17", "2.3E16");
-
-  private String messageSetText =
-    "[protobuf_unittest.TestMessageSetExtension1] {\n" +
-    "  i: 123\n" +
-    "}\n" +
-    "[protobuf_unittest.TestMessageSetExtension2] {\n" +
-    "  str: \"foo\"\n" +
-    "}\n";
-
-  /** Print TestAllTypes and compare with golden file. */
-  public void testPrintMessage() throws Exception {
-    String javaText = TextFormat.printToString(TestUtil.getAllSet());
-
-    // Java likes to add a trailing ".0" to floats and doubles.  C printf
-    // (with %g format) does not.  Our golden files are used for both
-    // C++ and Java TextFormat classes, so we need to conform.
-    javaText = javaText.replace(".0\n", "\n");
-
-    assertEquals(allFieldsSetText, javaText);
-  }
-
-  /** Print TestAllTypes as Builder and compare with golden file. */
-  public void testPrintMessageBuilder() throws Exception {
-    String javaText = TextFormat.printToString(TestUtil.getAllSetBuilder());
-
-    // Java likes to add a trailing ".0" to floats and doubles.  C printf
-    // (with %g format) does not.  Our golden files are used for both
-    // C++ and Java TextFormat classes, so we need to conform.
-    javaText = javaText.replace(".0\n", "\n");
-
-    assertEquals(allFieldsSetText, javaText);
-  }
-
-  /** Print TestAllExtensions and compare with golden file. */
-  public void testPrintExtensions() throws Exception {
-    String javaText = TextFormat.printToString(TestUtil.getAllExtensionsSet());
-
-    // Java likes to add a trailing ".0" to floats and doubles.  C printf
-    // (with %g format) does not.  Our golden files are used for both
-    // C++ and Java TextFormat classes, so we need to conform.
-    javaText = javaText.replace(".0\n", "\n");
-
-    assertEquals(allExtensionsSetText, javaText);
-  }
-
-  // Creates an example unknown field set.
-  private UnknownFieldSet makeUnknownFieldSet() {
-    return UnknownFieldSet.newBuilder()
-        .addField(5,
-            UnknownFieldSet.Field.newBuilder()
-            .addVarint(1)
-            .addFixed32(2)
-            .addFixed64(3)
-            .addLengthDelimited(ByteString.copyFromUtf8("4"))
-            .addGroup(
-                UnknownFieldSet.newBuilder()
-                .addField(10,
-                    UnknownFieldSet.Field.newBuilder()
-                    .addVarint(5)
-                    .build())
-                .build())
-            .build())
-        .addField(8,
-            UnknownFieldSet.Field.newBuilder()
-            .addVarint(1)
-            .addVarint(2)
-            .addVarint(3)
-            .build())
-        .addField(15,
-            UnknownFieldSet.Field.newBuilder()
-            .addVarint(0xABCDEF1234567890L)
-            .addFixed32(0xABCD1234)
-            .addFixed64(0xABCDEF1234567890L)
-            .build())
-        .build();
-  }
-
-  public void testPrintUnknownFields() throws Exception {
-    // Test printing of unknown fields in a message.
-
-    TestEmptyMessage message =
-      TestEmptyMessage.newBuilder()
-        .setUnknownFields(makeUnknownFieldSet())
-        .build();
-
-    assertEquals(
-      "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" +
-      "15: 12379813812177893520\n" +
-      "15: 0xabcd1234\n" +
-      "15: 0xabcdef1234567890\n",
-      TextFormat.printToString(message));
-  }
-
-  public void testPrintField() throws Exception {
-    final FieldDescriptor dataField =
-      OneString.getDescriptor().findFieldByName("data");
-    assertEquals(
-      "data: \"test data\"\n",
-      TextFormat.printFieldToString(dataField, "test data"));
-
-    final FieldDescriptor optionalField =
-      TestAllTypes.getDescriptor().findFieldByName("optional_nested_message");
-    final Object value = NestedMessage.newBuilder().setBb(42).build();
-
-    assertEquals(
-      "optional_nested_message {\n  bb: 42\n}\n",
-      TextFormat.printFieldToString(optionalField, value));
-  }
-
-  /**
-   * Helper to construct a ByteString from a String containing only 8-bit
-   * characters.  The characters are converted directly to bytes, *not*
-   * encoded using UTF-8.
-   */
-  private ByteString bytes(String str) throws Exception {
-    return ByteString.copyFrom(str.getBytes("ISO-8859-1"));
-  }
-
-  /**
-   * Helper to construct a ByteString from a bunch of bytes.  The inputs are
-   * actually ints so that I can use hex notation and not get stupid errors
-   * about precision.
-   */
-  private ByteString bytes(int... bytesAsInts) {
-    byte[] bytes = new byte[bytesAsInts.length];
-    for (int i = 0; i < bytesAsInts.length; i++) {
-      bytes[i] = (byte) bytesAsInts[i];
-    }
-    return ByteString.copyFrom(bytes);
-  }
-
-  public void testPrintExotic() throws Exception {
-    Message message = TestAllTypes.newBuilder()
-      // Signed vs. unsigned numbers.
-      .addRepeatedInt32 (-1)
-      .addRepeatedUint32(-1)
-      .addRepeatedInt64 (-1)
-      .addRepeatedUint64(-1)
-
-      .addRepeatedInt32 (1  << 31)
-      .addRepeatedUint32(1  << 31)
-      .addRepeatedInt64 (1l << 63)
-      .addRepeatedUint64(1l << 63)
-
-      // Floats of various precisions and exponents.
-      .addRepeatedDouble(123)
-      .addRepeatedDouble(123.5)
-      .addRepeatedDouble(0.125)
-      .addRepeatedDouble(.125)
-      .addRepeatedDouble(-.125)
-      .addRepeatedDouble(123e15)
-      .addRepeatedDouble(123e15)
-      .addRepeatedDouble(-1.23e-17)
-      .addRepeatedDouble(.23e17)
-      .addRepeatedDouble(-23e15)
-      .addRepeatedDouble(123.5e20)
-      .addRepeatedDouble(123.5e-20)
-      .addRepeatedDouble(123.456789)
-      .addRepeatedDouble(Double.POSITIVE_INFINITY)
-      .addRepeatedDouble(Double.NEGATIVE_INFINITY)
-      .addRepeatedDouble(Double.NaN)
-
-      // Strings and bytes that needing escaping.
-      .addRepeatedString("\0\001\007\b\f\n\r\t\013\\\'\"\u1234")
-      .addRepeatedBytes(bytes("\0\001\007\b\f\n\r\t\013\\\'\"\u00fe"))
-      .build();
-
-    assertEquals(canonicalExoticText, message.toString());
-  }
-
-  public void testPrintMessageSet() throws Exception {
-    TestMessageSet messageSet =
-      TestMessageSet.newBuilder()
-        .setExtension(
-          TestMessageSetExtension1.messageSetExtension,
-          TestMessageSetExtension1.newBuilder().setI(123).build())
-        .setExtension(
-          TestMessageSetExtension2.messageSetExtension,
-          TestMessageSetExtension2.newBuilder().setStr("foo").build())
-        .build();
-
-    assertEquals(messageSetText, messageSet.toString());
-  }
-
-  // =================================================================
-
-  public void testParse() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge(allFieldsSetText, builder);
-    TestUtil.assertAllFieldsSet(builder.build());
-  }
-
-  public void testParseReader() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge(new StringReader(allFieldsSetText), builder);
-    TestUtil.assertAllFieldsSet(builder.build());
-  }
-
-  public void testParseExtensions() throws Exception {
-    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
-    TextFormat.merge(allExtensionsSetText,
-                     TestUtil.getExtensionRegistry(),
-                     builder);
-    TestUtil.assertAllExtensionsSet(builder.build());
-  }
-
-  public void testParseCompatibility() throws Exception {
-    String original = "repeated_float: inf\n" +
-                      "repeated_float: -inf\n" +
-                      "repeated_float: nan\n" +
-                      "repeated_float: inff\n" +
-                      "repeated_float: -inff\n" +
-                      "repeated_float: nanf\n" +
-                      "repeated_float: 1.0f\n" +
-                      "repeated_float: infinityf\n" +
-                      "repeated_float: -Infinityf\n" +
-                      "repeated_double: infinity\n" +
-                      "repeated_double: -infinity\n" +
-                      "repeated_double: nan\n";
-    String canonical =  "repeated_float: Infinity\n" +
-                        "repeated_float: -Infinity\n" +
-                        "repeated_float: NaN\n" +
-                        "repeated_float: Infinity\n" +
-                        "repeated_float: -Infinity\n" +
-                        "repeated_float: NaN\n" +
-                        "repeated_float: 1.0\n" +
-                        "repeated_float: Infinity\n" +
-                        "repeated_float: -Infinity\n" +
-                        "repeated_double: Infinity\n" +
-                        "repeated_double: -Infinity\n" +
-                        "repeated_double: NaN\n";
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge(original, builder);
-    assertEquals(canonical, builder.build().toString());
-  }
-
-  public void testParseExotic() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge(exoticText, builder);
-
-    // Too lazy to check things individually.  Don't try to debug this
-    // if testPrintExotic() is failing.
-    assertEquals(canonicalExoticText, builder.build().toString());
-  }
-
-  public void testParseMessageSet() throws Exception {
-    ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
-    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
-    extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);
-
-    TestMessageSet.Builder builder = TestMessageSet.newBuilder();
-    TextFormat.merge(messageSetText, extensionRegistry, builder);
-    TestMessageSet messageSet = builder.build();
-
-    assertTrue(messageSet.hasExtension(
-      TestMessageSetExtension1.messageSetExtension));
-    assertEquals(123, messageSet.getExtension(
-      TestMessageSetExtension1.messageSetExtension).getI());
-    assertTrue(messageSet.hasExtension(
-      TestMessageSetExtension2.messageSetExtension));
-    assertEquals("foo", messageSet.getExtension(
-      TestMessageSetExtension2.messageSetExtension).getStr());
-  }
-
-  public void testParseNumericEnum() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge("optional_nested_enum: 2", builder);
-    assertEquals(TestAllTypes.NestedEnum.BAR, builder.getOptionalNestedEnum());
-  }
-
-  public void testParseAngleBrackets() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge("OptionalGroup: < a: 1 >", builder);
-    assertTrue(builder.hasOptionalGroup());
-    assertEquals(1, builder.getOptionalGroup().getA());
-  }
-
-  public void testParseComment() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge(
-      "# this is a comment\n" +
-      "optional_int32: 1  # another comment\n" +
-      "optional_int64: 2\n" +
-      "# EOF comment", builder);
-    assertEquals(1, builder.getOptionalInt32());
-    assertEquals(2, builder.getOptionalInt64());
-  }
-
-  // =================================================================
-
-  public void testParseString() throws Exception {
-    final String zh = "\u9999\u6e2f\u4e0a\u6d77\ud84f\udf80\u8c50\u9280\u884c";
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge("optional_string: \"" + zh + "\"", builder);
-    assertEquals(zh, builder.getOptionalString());
-  }
-
-  public void testParseLongString() throws Exception {
-    String longText =
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890" +
-      "123456789012345678901234567890123456789012345678901234567890";
-
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge("optional_string: \"" + longText + "\"", builder);
-    assertEquals(longText, builder.getOptionalString());
-  }
-
-  public void testParseBoolean() throws Exception {
-    String goodText =
-        "repeated_bool: t  repeated_bool : 0\n" +
-        "repeated_bool :f repeated_bool:1";
-    String goodTextCanonical =
-        "repeated_bool: true\n" +
-        "repeated_bool: false\n" +
-        "repeated_bool: false\n" +
-        "repeated_bool: true\n";
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge(goodText, builder);
-    assertEquals(goodTextCanonical, builder.build().toString());
-
-    try {
-      TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder();
-      TextFormat.merge("optional_bool:2", badBuilder);
-      fail("Should have thrown an exception.");
-    } catch (TextFormat.ParseException e) {
-      // success
-    }
-    try {
-      TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder();
-      TextFormat.merge("optional_bool: foo", badBuilder);
-      fail("Should have thrown an exception.");
-    } catch (TextFormat.ParseException e) {
-      // success
-    }
-  }
-
-  public void testParseAdjacentStringLiterals() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TextFormat.merge("optional_string: \"foo\" 'corge' \"grault\"", builder);
-    assertEquals("foocorgegrault", builder.getOptionalString());
-  }
-
-  public void testPrintFieldValue() throws Exception {
-    assertPrintFieldValue("\"Hello\"", "Hello", "repeated_string");
-    assertPrintFieldValue("123.0",  123f, "repeated_float");
-    assertPrintFieldValue("123.0",  123d, "repeated_double");
-    assertPrintFieldValue("123",  123, "repeated_int32");
-    assertPrintFieldValue("123",  123L, "repeated_int64");
-    assertPrintFieldValue("true",  true, "repeated_bool");
-    assertPrintFieldValue("4294967295", 0xFFFFFFFF, "repeated_uint32");
-    assertPrintFieldValue("18446744073709551615",  0xFFFFFFFFFFFFFFFFL,
-        "repeated_uint64");
-    assertPrintFieldValue("\"\\001\\002\\003\"",
-        ByteString.copyFrom(new byte[] {1, 2, 3}), "repeated_bytes");
-  }
-
-  private void assertPrintFieldValue(String expect, Object value,
-      String fieldName) throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    StringBuilder sb = new StringBuilder();
-    TextFormat.printFieldValue(
-        TestAllTypes.getDescriptor().findFieldByName(fieldName),
-        value, sb);
-    assertEquals(expect, sb.toString());
-  }
-
-  public void testShortDebugString() {
-    assertEquals("optional_nested_message { bb: 42 } repeated_int32: 1"
-        + " repeated_uint32: 2",
-        TextFormat.shortDebugString(TestAllTypes.newBuilder()
-            .addRepeatedInt32(1)
-            .addRepeatedUint32(2)
-            .setOptionalNestedMessage(
-                NestedMessage.newBuilder().setBb(42).build())
-            .build()));
-  }
-
-  public void testShortDebugString_unknown() {
-    assertEquals("5: 1 5: 0x00000002 5: 0x0000000000000003 5: \"4\" 5 { 10: 5 }"
-        + " 8: 1 8: 2 8: 3 15: 12379813812177893520 15: 0xabcd1234 15:"
-        + " 0xabcdef1234567890",
-        TextFormat.shortDebugString(makeUnknownFieldSet()));
-  }
-
-  public void testPrintToUnicodeString() {
-    assertEquals(
-        "optional_string: \"abc\u3042efg\"\n" +
-        "optional_bytes: \"\\343\\201\\202\"\n" +
-        "repeated_string: \"\u3093XYZ\"\n",
-        TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
-            .setOptionalString("abc\u3042efg")
-            .setOptionalBytes(bytes(0xe3, 0x81, 0x82))
-            .addRepeatedString("\u3093XYZ")
-            .build()));
-  }
-
-  public void testPrintToUnicodeString_unknown() {
-    assertEquals(
-        "1: \"\\343\\201\\202\"\n",
-        TextFormat.printToUnicodeString(UnknownFieldSet.newBuilder()
-            .addField(1,
-                UnknownFieldSet.Field.newBuilder()
-                .addLengthDelimited(bytes(0xe3, 0x81, 0x82)).build())
-            .build()));
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/UnknownFieldSetTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/UnknownFieldSetTest.java
deleted file mode 100644
index b9bfb69..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/UnknownFieldSetTest.java
+++ /dev/null
@@ -1,438 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import protobuf_unittest.UnittestProto;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestEmptyMessage;
-import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions;
-
-import junit.framework.TestCase;
-
-import java.util.Arrays;
-import java.util.Map;
-
-/**
- * Tests related to unknown field handling.
- *
- * @author kenton@google.com (Kenton Varda)
- */
-public class UnknownFieldSetTest extends TestCase {
-  public void setUp() throws Exception {
-    descriptor = TestAllTypes.getDescriptor();
-    allFields = TestUtil.getAllSet();
-    allFieldsData = allFields.toByteString();
-    emptyMessage = TestEmptyMessage.parseFrom(allFieldsData);
-    unknownFields = emptyMessage.getUnknownFields();
-  }
-
-  UnknownFieldSet.Field getField(String name) {
-    Descriptors.FieldDescriptor field = descriptor.findFieldByName(name);
-    assertNotNull(field);
-    return unknownFields.getField(field.getNumber());
-  }
-
-  // Constructs a protocol buffer which contains fields with all the same
-  // numbers as allFieldsData except that each field is some other wire
-  // type.
-  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();
-  }
-
-  Descriptors.Descriptor descriptor;
-  TestAllTypes allFields;
-  ByteString allFieldsData;
-
-  // An empty message that has been parsed from allFieldsData.  So, it has
-  // unknown fields of every type.
-  TestEmptyMessage emptyMessage;
-  UnknownFieldSet unknownFields;
-
-  // =================================================================
-
-  public void testVarint() throws Exception {
-    UnknownFieldSet.Field field = getField("optional_int32");
-    assertEquals(1, field.getVarintList().size());
-    assertEquals(allFields.getOptionalInt32(),
-                 (long) field.getVarintList().get(0));
-  }
-
-  public void testFixed32() throws Exception {
-    UnknownFieldSet.Field field = getField("optional_fixed32");
-    assertEquals(1, field.getFixed32List().size());
-    assertEquals(allFields.getOptionalFixed32(),
-                 (int) field.getFixed32List().get(0));
-  }
-
-  public void testFixed64() throws Exception {
-    UnknownFieldSet.Field field = getField("optional_fixed64");
-    assertEquals(1, field.getFixed64List().size());
-    assertEquals(allFields.getOptionalFixed64(),
-                 (long) field.getFixed64List().get(0));
-  }
-
-  public void testLengthDelimited() throws Exception {
-    UnknownFieldSet.Field field = getField("optional_bytes");
-    assertEquals(1, field.getLengthDelimitedList().size());
-    assertEquals(allFields.getOptionalBytes(),
-                 field.getLengthDelimitedList().get(0));
-  }
-
-  public void testGroup() throws Exception {
-    Descriptors.FieldDescriptor nestedFieldDescriptor =
-      TestAllTypes.OptionalGroup.getDescriptor().findFieldByName("a");
-    assertNotNull(nestedFieldDescriptor);
-
-    UnknownFieldSet.Field field = getField("optionalgroup");
-    assertEquals(1, field.getGroupList().size());
-
-    UnknownFieldSet group = field.getGroupList().get(0);
-    assertEquals(1, group.asMap().size());
-    assertTrue(group.hasField(nestedFieldDescriptor.getNumber()));
-
-    UnknownFieldSet.Field nestedField =
-      group.getField(nestedFieldDescriptor.getNumber());
-    assertEquals(1, nestedField.getVarintList().size());
-    assertEquals(allFields.getOptionalGroup().getA(),
-                 (long) nestedField.getVarintList().get(0));
-  }
-
-  public void testSerialize() throws Exception {
-    // Check that serializing the UnknownFieldSet produces the original data
-    // again.
-    ByteString data = emptyMessage.toByteString();
-    assertEquals(allFieldsData, data);
-  }
-
-  public void testCopyFrom() throws Exception {
-    TestEmptyMessage message =
-      TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).build();
-
-    assertEquals(emptyMessage.toString(), message.toString());
-  }
-
-  public void testMergeFrom() throws Exception {
-    TestEmptyMessage source =
-      TestEmptyMessage.newBuilder()
-        .setUnknownFields(
-          UnknownFieldSet.newBuilder()
-            .addField(2,
-              UnknownFieldSet.Field.newBuilder()
-                .addVarint(2).build())
-            .addField(3,
-              UnknownFieldSet.Field.newBuilder()
-                .addVarint(4).build())
-            .build())
-        .build();
-    TestEmptyMessage destination =
-      TestEmptyMessage.newBuilder()
-        .setUnknownFields(
-          UnknownFieldSet.newBuilder()
-            .addField(1,
-              UnknownFieldSet.Field.newBuilder()
-                .addVarint(1).build())
-            .addField(3,
-              UnknownFieldSet.Field.newBuilder()
-                .addVarint(3).build())
-            .build())
-        .mergeFrom(source)
-        .build();
-
-    assertEquals(
-      "1: 1\n" +
-      "2: 2\n" +
-      "3: 3\n" +
-      "3: 4\n",
-      destination.toString());
-  }
-
-  public void testClear() throws Exception {
-    UnknownFieldSet fields =
-      UnknownFieldSet.newBuilder().mergeFrom(unknownFields).clear().build();
-    assertTrue(fields.asMap().isEmpty());
-  }
-
-  public void testClearMessage() throws Exception {
-    TestEmptyMessage message =
-      TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).clear().build();
-    assertEquals(0, message.getSerializedSize());
-  }
-
-  public void testParseKnownAndUnknown() throws Exception {
-    // Test mixing known and unknown fields when parsing.
-
-    UnknownFieldSet fields =
-      UnknownFieldSet.newBuilder(unknownFields)
-        .addField(123456,
-          UnknownFieldSet.Field.newBuilder().addVarint(654321).build())
-        .build();
-
-    ByteString data = fields.toByteString();
-    TestAllTypes destination = TestAllTypes.parseFrom(data);
-
-    TestUtil.assertAllFieldsSet(destination);
-    assertEquals(1, destination.getUnknownFields().asMap().size());
-
-    UnknownFieldSet.Field field =
-      destination.getUnknownFields().getField(123456);
-    assertEquals(1, field.getVarintList().size());
-    assertEquals(654321, (long) field.getVarintList().get(0));
-  }
-
-  public void testWrongTypeTreatedAsUnknown() 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);
-    TestEmptyMessage emptyMessage = TestEmptyMessage.parseFrom(bizarroData);
-
-    // All fields should have been interpreted as unknown, so the debug strings
-    // should be the same.
-    assertEquals(emptyMessage.toString(), allTypesMessage.toString());
-  }
-
-  public void testUnknownExtensions() throws Exception {
-    // Make sure fields are properly parsed to the UnknownFieldSet even when
-    // they are declared as extension numbers.
-
-    TestEmptyMessageWithExtensions message =
-      TestEmptyMessageWithExtensions.parseFrom(allFieldsData);
-
-    assertEquals(unknownFields.asMap().size(),
-                 message.getUnknownFields().asMap().size());
-    assertEquals(allFieldsData, message.toByteString());
-  }
-
-  public void testWrongExtensionTypeTreatedAsUnknown() 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);
-    TestEmptyMessage emptyMessage = TestEmptyMessage.parseFrom(bizarroData);
-
-    // All fields should have been interpreted as unknown, so the debug strings
-    // should be the same.
-    assertEquals(emptyMessage.toString(),
-                 allExtensionsMessage.toString());
-  }
-
-  public void testParseUnknownEnumValue() 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();
-
-    {
-      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 testLargeVarint() throws Exception {
-    ByteString data =
-      UnknownFieldSet.newBuilder()
-        .addField(1,
-          UnknownFieldSet.Field.newBuilder()
-            .addVarint(0x7FFFFFFFFFFFFFFFL)
-            .build())
-        .build()
-        .toByteString();
-    UnknownFieldSet parsed = UnknownFieldSet.parseFrom(data);
-    UnknownFieldSet.Field field = parsed.getField(1);
-    assertEquals(1, field.getVarintList().size());
-    assertEquals(0x7FFFFFFFFFFFFFFFL, (long)field.getVarintList().get(0));
-  }
-
-  public void testEqualsAndHashCode() {
-    UnknownFieldSet.Field fixed32Field =
-        UnknownFieldSet.Field.newBuilder()
-            .addFixed32(1)
-            .build();
-    UnknownFieldSet.Field fixed64Field =
-        UnknownFieldSet.Field.newBuilder()
-            .addFixed64(1)
-            .build();
-    UnknownFieldSet.Field varIntField =
-        UnknownFieldSet.Field.newBuilder()
-            .addVarint(1)
-            .build();
-    UnknownFieldSet.Field lengthDelimitedField =
-        UnknownFieldSet.Field.newBuilder()
-            .addLengthDelimited(ByteString.EMPTY)
-            .build();
-    UnknownFieldSet.Field groupField =
-        UnknownFieldSet.Field.newBuilder()
-            .addGroup(unknownFields)
-            .build();
-
-    UnknownFieldSet a =
-        UnknownFieldSet.newBuilder()
-            .addField(1, fixed32Field)
-            .build();
-    UnknownFieldSet b =
-        UnknownFieldSet.newBuilder()
-            .addField(1, fixed64Field)
-            .build();
-    UnknownFieldSet c =
-        UnknownFieldSet.newBuilder()
-            .addField(1, varIntField)
-            .build();
-    UnknownFieldSet d =
-        UnknownFieldSet.newBuilder()
-            .addField(1, lengthDelimitedField)
-            .build();
-    UnknownFieldSet e =
-        UnknownFieldSet.newBuilder()
-            .addField(1, groupField)
-            .build();
-
-    checkEqualsIsConsistent(a);
-    checkEqualsIsConsistent(b);
-    checkEqualsIsConsistent(c);
-    checkEqualsIsConsistent(d);
-    checkEqualsIsConsistent(e);
-
-    checkNotEqual(a, b);
-    checkNotEqual(a, c);
-    checkNotEqual(a, d);
-    checkNotEqual(a, e);
-    checkNotEqual(b, c);
-    checkNotEqual(b, d);
-    checkNotEqual(b, e);
-    checkNotEqual(c, d);
-    checkNotEqual(c, e);
-    checkNotEqual(d, e);
-  }
-
-  /**
-   * Asserts that the given field sets are not equal and have different
-   * hash codes.
-   *
-   * @warning It's valid for non-equal objects to have the same hash code, so
-   *   this test is stricter than it needs to be. However, this should happen
-   *   relatively rarely.
-   */
-  private void checkNotEqual(UnknownFieldSet s1, UnknownFieldSet s2) {
-    String equalsError = String.format("%s should not be equal to %s", s1, s2);
-    assertFalse(equalsError, s1.equals(s2));
-    assertFalse(equalsError, s2.equals(s1));
-
-    assertFalse(
-        String.format("%s should have a different hash code from %s", s1, s2),
-        s1.hashCode() == s2.hashCode());
-  }
-
-  /**
-   * Asserts that the given field sets are equal and have identical hash codes.
-   */
-  private void checkEqualsIsConsistent(UnknownFieldSet set) {
-    // Object should be equal to itself.
-    assertEquals(set, set);
-
-    // Object should be equal to a copy of itself.
-    UnknownFieldSet copy = UnknownFieldSet.newBuilder(set).build();
-    assertEquals(set, copy);
-    assertEquals(copy, set);
-    assertEquals(set.hashCode(), copy.hashCode());
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/UnmodifiableLazyStringListTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/UnmodifiableLazyStringListTest.java
deleted file mode 100644
index cb75d74..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/UnmodifiableLazyStringListTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import junit.framework.TestCase;
-
-import java.util.Iterator;
-import java.util.ListIterator;
-
-/**
- * Tests for {@link UnmodifiableLazyStringList}.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class UnmodifiableLazyStringListTest extends TestCase {
-
-  private static String STRING_A = "A";
-  private static String STRING_B = "B";
-  private static String STRING_C = "C";
-
-  private static ByteString BYTE_STRING_A = ByteString.copyFromUtf8("A");
-  private static ByteString BYTE_STRING_B = ByteString.copyFromUtf8("B");
-  private static ByteString BYTE_STRING_C = ByteString.copyFromUtf8("C");
-
-  public void testReadOnlyMethods() {
-    LazyStringArrayList rawList = createSampleList();
-    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);
-    assertEquals(3, list.size());
-    assertSame(STRING_A, list.get(0));
-    assertSame(STRING_B, list.get(1));
-    assertSame(STRING_C, list.get(2));
-    assertEquals(BYTE_STRING_A, list.getByteString(0));
-    assertEquals(BYTE_STRING_B, list.getByteString(1));
-    assertEquals(BYTE_STRING_C, list.getByteString(2));
-  }
-
-  public void testModifyMethods() {
-    LazyStringArrayList rawList = createSampleList();
-    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);
-
-    try {
-      list.remove(0);
-      fail();
-    } catch (UnsupportedOperationException e) {
-      // expected
-    }
-    assertEquals(3, list.size());
-
-    try {
-      list.add(STRING_B);
-      fail();
-    } catch (UnsupportedOperationException e) {
-      // expected
-    }
-    assertEquals(3, list.size());
-
-    try {
-      list.set(1, STRING_B);
-      fail();
-    } catch (UnsupportedOperationException e) {
-      // expected
-    }
-  }
-
-  public void testIterator() {
-    LazyStringArrayList rawList = createSampleList();
-    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);
-
-    Iterator<String> iter = list.iterator();
-    int count = 0;
-    while (iter.hasNext()) {
-      iter.next();
-      count++;
-      try {
-        iter.remove();
-        fail();
-      } catch (UnsupportedOperationException e) {
-        // expected
-      }
-    }
-    assertEquals(3, count);
-
-  }
-
-  public void testListIterator() {
-    LazyStringArrayList rawList = createSampleList();
-    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);
-
-    ListIterator<String> iter = list.listIterator();
-    int count = 0;
-    while (iter.hasNext()) {
-      iter.next();
-      count++;
-      try {
-        iter.remove();
-        fail();
-      } catch (UnsupportedOperationException e) {
-        // expected
-      }
-      try {
-        iter.set("bar");
-        fail();
-      } catch (UnsupportedOperationException e) {
-        // expected
-      }
-      try {
-        iter.add("bar");
-        fail();
-      } catch (UnsupportedOperationException e) {
-        // expected
-      }
-    }
-    assertEquals(3, count);
-
-  }
-
-  private LazyStringArrayList createSampleList() {
-    LazyStringArrayList rawList = new LazyStringArrayList();
-    rawList.add(STRING_A);
-    rawList.add(STRING_B);
-    rawList.add(STRING_C);
-    return rawList;
-  }
-}
diff --git a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/WireFormatTest.java b/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/WireFormatTest.java
deleted file mode 100644
index 7452872..0000000
--- a/java/compatibility_tests/v2.5.0/tests/src/main/java/com/google/protobuf/test/WireFormatTest.java
+++ /dev/null
@@ -1,465 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.test;
-import com.google.protobuf.*;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.List;
-
-import protobuf_unittest.UnittestProto;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestFieldOrderings;
-import protobuf_unittest.UnittestProto.TestPackedExtensions;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-import protobuf_unittest.UnittestMset.TestMessageSet;
-import protobuf_unittest.UnittestMset.RawMessageSet;
-import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
-import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
-
-/**
- * Tests related to parsing and serialization.
- *
- * @author kenton@google.com (Kenton Varda)
- */
-public class WireFormatTest extends TestCase {
-  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();
-
-    ExtensionRegistry 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();
-
-    ExtensionRegistry registry = TestUtil.getExtensionRegistry();
-
-    TestPackedExtensions message2 =
-        TestPackedExtensions.parseFrom(rawBytes, registry);
-
-    TestUtil.assertPackedExtensionsSet(message2);
-  }
-
-  public void testExtensionsSerializedSize() throws Exception {
-    assertEquals(TestUtil.getAllSet().getSerializedSize(),
-                 TestUtil.getAllExtensionsSet().getSerializedSize());
-  }
-
-  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.
-    assertTrue(TestAllTypes.parseDelimitedFrom(input) == null);
-  }
-
-  private void assertFieldsInOrder(ByteString data) throws Exception {
-    CodedInputStream input = data.newCodedInput();
-    int previousTag = 0;
-
-    while (true) {
-      int tag = input.readTag();
-      if (tag == 0) {
-        break;
-      }
-
-      assertTrue(tag > previousTag);
-      previousTag = tag;
-      input.skipField(tag);
-    }
-  }
-
-  public void testInterleavedFieldsAndExtensions() throws Exception {
-    // Tests that fields are written in order even when extension ranges
-    // are interleaved with field numbers.
-    ByteString data =
-      TestFieldOrderings.newBuilder()
-        .setMyInt(1)
-        .setMyString("foo")
-        .setMyFloat(1.0F)
-        .setExtension(UnittestProto.myExtensionInt, 23)
-        .setExtension(UnittestProto.myExtensionString, "bar")
-        .build().toByteString();
-    assertFieldsInOrder(data);
-
-    Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();
-    ByteString dynamic_data =
-      DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())
-        .setField(descriptor.findFieldByName("my_int"), 1L)
-        .setField(descriptor.findFieldByName("my_string"), "foo")
-        .setField(descriptor.findFieldByName("my_float"), 1.0F)
-        .setField(UnittestProto.myExtensionInt.getDescriptor(), 23)
-        .setField(UnittestProto.myExtensionString.getDescriptor(), "bar")
-        .build().toByteString();
-    assertFieldsInOrder(dynamic_data);
-  }
-
-  private ExtensionRegistry getTestFieldOrderingsRegistry() {
-    ExtensionRegistry result = ExtensionRegistry.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);
-  }
-
-  public void testParseMultipleExtensionRangesDynamic() throws Exception {
-    // Same as above except with DynamicMessage.
-    Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();
-    DynamicMessage source =
-      DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())
-        .setField(descriptor.findFieldByName("my_int"), 1L)
-        .setField(descriptor.findFieldByName("my_string"), "foo")
-        .setField(descriptor.findFieldByName("my_float"), 1.0F)
-        .setField(UnittestProto.myExtensionInt.getDescriptor(), 23)
-        .setField(UnittestProto.myExtensionString.getDescriptor(), "bar")
-        .build();
-    DynamicMessage dest =
-      DynamicMessage.parseFrom(descriptor, source.toByteString(),
-                               getTestFieldOrderingsRegistry());
-    assertEquals(source, dest);
-  }
-
-  private static final int UNKNOWN_TYPE_ID = 1550055;
-  private static final int TYPE_ID_1 =
-    TestMessageSetExtension1.getDescriptor().getExtensions().get(0).getNumber();
-  private static final int TYPE_ID_2 =
-    TestMessageSetExtension2.getDescriptor().getExtensions().get(0).getNumber();
-
-  public void testSerializeMessageSetEagerly() throws Exception {
-    testSerializeMessageSetWithFlag(true);
-  }
-
-  public void testSerializeMessageSetNotEagerly() throws Exception {
-    testSerializeMessageSetWithFlag(false);
-  }
-
-  private void testSerializeMessageSetWithFlag(boolean eagerParsing)
-      throws Exception {
-    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())
-        .setUnknownFields(
-          UnknownFieldSet.newBuilder()
-            .addField(UNKNOWN_TYPE_ID,
-              UnknownFieldSet.Field.newBuilder()
-                .addLengthDelimited(ByteString.copyFromUtf8("bar"))
-                .build())
-            .build())
-        .build();
-
-    ByteString data = messageSet.toByteString();
-
-    // Parse back using RawMessageSet and check the contents.
-    RawMessageSet raw = RawMessageSet.parseFrom(data);
-
-    assertTrue(raw.getUnknownFields().asMap().isEmpty());
-
-    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().toByteArray());
-    assertEquals(123, message1.getI());
-
-    TestMessageSetExtension2 message2 =
-      TestMessageSetExtension2.parseFrom(
-        raw.getItem(1).getMessage().toByteArray());
-    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);
-    ExtensionRegistry extensionRegistry = ExtensionRegistry.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());
-
-    // Check for unknown field with type LENGTH_DELIMITED,
-    //   number UNKNOWN_TYPE_ID, and contents "bar".
-    UnknownFieldSet unknownFields = messageSet.getUnknownFields();
-    assertEquals(1, unknownFields.asMap().size());
-    assertTrue(unknownFields.hasField(UNKNOWN_TYPE_ID));
-
-    UnknownFieldSet.Field field = unknownFields.getField(UNKNOWN_TYPE_ID);
-    assertEquals(1, field.getLengthDelimitedList().size());
-    assertEquals("bar", field.getLengthDelimitedList().get(0).toStringUtf8());
-  }
-
-  public void testParseMessageSetExtensionEagerly() throws Exception {
-    testParseMessageSetExtensionWithFlag(true);
-  }
-
-  public void testParseMessageSetExtensionNotEagerly() throws Exception {
-    testParseMessageSetExtensionWithFlag(false);
-  }
-
-  private void testParseMessageSetExtensionWithFlag(boolean eagerParsing)
-      throws Exception {
-    ExtensionRegistryLite.setEagerlyParseMessageSets(eagerParsing);
-    ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
-    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
-
-    // Set up a RawMessageSet with a known messages.
-    int TYPE_ID_1 =
-        TestMessageSetExtension1
-            .getDescriptor().getExtensions().get(0).getNumber();
-    RawMessageSet raw =
-      RawMessageSet.newBuilder()
-        .addItem(
-          RawMessageSet.Item.newBuilder()
-            .setTypeId(TYPE_ID_1)
-            .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);
-    ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
-    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
-
-    // Set up a RawMessageSet with a known messages.
-    int TYPE_ID_1 =
-        TestMessageSetExtension1
-            .getDescriptor().getExtensions().get(0).getNumber();
-    RawMessageSet raw =
-      RawMessageSet.newBuilder()
-        .addItem(
-          RawMessageSet.Item.newBuilder()
-            .setTypeId(TYPE_ID_1)
-            .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());
-  }
-}
diff --git a/java/core/generate-test-sources-build.xml b/java/core/generate-test-sources-build.xml
index abcdf5d..ab415db 100644
--- a/java/core/generate-test-sources-build.xml
+++ b/java/core/generate-test-sources-build.xml
@@ -5,7 +5,6 @@
         <arg value="--proto_path=${protobuf.source.dir}"/>
         <arg value="--proto_path=${test.proto.dir}"/>
         <arg value="${protobuf.source.dir}/google/protobuf/unittest.proto"/>
-        <arg value="${protobuf.source.dir}/google/protobuf/unittest_proto3.proto"/>
         <arg value="${protobuf.source.dir}/google/protobuf/unittest_import.proto"/>
         <arg value="${protobuf.source.dir}/google/protobuf/unittest_import_public.proto"/>
         <arg value="${protobuf.source.dir}/google/protobuf/unittest_mset.proto"/>
@@ -19,7 +18,6 @@
         <arg value="${protobuf.source.dir}/google/protobuf/unittest_enormous_descriptor.proto"/>
         <arg value="${protobuf.source.dir}/google/protobuf/unittest_no_generic_services.proto"/>
         <arg value="${protobuf.source.dir}/google/protobuf/unittest_well_known_types.proto"/>
-        <arg value="${test.proto.dir}/com/google/protobuf/deprecated_file.proto"/>
         <arg value="${test.proto.dir}/com/google/protobuf/lazy_fields_lite.proto"/>
         <arg value="${test.proto.dir}/com/google/protobuf/lite_equals_and_hash.proto"/>
         <arg value="${test.proto.dir}/com/google/protobuf/multiple_files_test.proto"/>
@@ -42,4 +40,4 @@
         <arg value="${test.proto.dir}/com/google/protobuf/map_test.proto"/>
         <arg value="${test.proto.dir}/com/google/protobuf/map_initialization_order_test.proto"/>
     </exec>
-</project>
+</project>
\ No newline at end of file
diff --git a/java/core/pom.xml b/java/core/pom.xml
index 8139241..0d4c5c7 100644
--- a/java/core/pom.xml
+++ b/java/core/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.google.protobuf</groupId>
     <artifactId>protobuf-parent</artifactId>
-    <version>3.5.2</version>
+    <version>3.0.0-beta-3</version>
   </parent>
 
   <artifactId>protobuf-java</artifactId>
@@ -22,17 +22,14 @@
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.easymock</groupId>
       <artifactId>easymock</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.easymock</groupId>
       <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
     </dependency>
   </dependencies>
 
@@ -95,34 +92,11 @@
 
       <!-- Add the generated sources to the build -->
       <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>add-generated-sources</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>add-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${generated.sources.dir}</source>
-              </sources>
-            </configuration>
-          </execution>
-          <execution>
-            <id>add-generated-test-sources</id>
-            <phase>generate-test-sources</phase>
-            <goals>
-              <goal>add-test-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${generated.testsources.dir}</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <generatedSourcesDirectory>${generated.sources.dir}</generatedSourcesDirectory>
+          <generatedTestSourcesDirectory>${generated.testsources.dir}</generatedTestSourcesDirectory>
+        </configuration>
       </plugin>
 
       <!-- OSGI bundle configuration -->
diff --git a/java/core/src/main/java/com/google/protobuf/AbstractMessage.java b/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
index 908764d..03c0d57 100644
--- a/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
+++ b/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
@@ -32,9 +32,9 @@
 
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
-import com.google.protobuf.Descriptors.FileDescriptor.Syntax;
 import com.google.protobuf.Descriptors.OneofDescriptor;
 import com.google.protobuf.Internal.EnumLite;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
@@ -54,40 +54,12 @@
     // TODO(dweis): Update GeneratedMessage to parameterize with MessageType and BuilderType.
     extends AbstractMessageLite
     implements Message {
-
+  
   @Override
   public boolean isInitialized() {
     return MessageReflection.isInitialized(this);
   }
 
-  /**
-   * Interface for the parent of a Builder that allows the builder to
-   * communicate invalidations back to the parent for use when using nested
-   * builders.
-   */
-  protected interface BuilderParent {
-
-    /**
-     * A builder becomes dirty whenever a field is modified -- including fields
-     * in nested builders -- and becomes clean when build() is called.  Thus,
-     * when a builder becomes dirty, all its parents become dirty as well, and
-     * when it becomes clean, all its children become clean.  The dirtiness
-     * state is used to invalidate certain cached values.
-     * <br>
-     * To this end, a builder calls markDirty() on its parent whenever it
-     * transitions from clean to dirty.  The parent must propagate this call to
-     * its own parent, unless it was already dirty, in which case the
-     * grandparent must necessarily already be dirty as well.  The parent can
-     * only transition back to "clean" after calling build() on all children.
-     */
-    void markDirty();
-  }
-
-  /** Create a nested builder. */
-  protected Message.Builder newBuilderForType(BuilderParent parent) {
-    throw new UnsupportedOperationException("Nested builder is not supported for this type.");
-  }
-
 
   @Override
   public List<String> findInitializationErrors() {
@@ -163,7 +135,7 @@
     }
     return hash;
   }
-
+  
   private static ByteString toByteString(Object value) {
     if (value instanceof byte[]) {
       return ByteString.copyFrom((byte[]) value);
@@ -171,7 +143,7 @@
       return (ByteString) value;
     }
   }
-
+ 
   /**
    * Compares two bytes fields. The parameters must be either a byte array or a
    * ByteString object. They can be of different type though.
@@ -182,7 +154,7 @@
     }
     return toByteString(a).equals(toByteString(b));
   }
-
+  
   /**
    * Converts a list of MapEntry messages into a Map used for equals() and
    * hashCode().
@@ -213,7 +185,7 @@
     }
     return result;
   }
-
+  
   /**
    * Compares two map fields. The parameters must be a list of MapEntry
    * messages.
@@ -224,13 +196,13 @@
     Map mb = convertMapEntryListToMap((List) b);
     return MapFieldLite.equals(ma, mb);
   }
-
+  
   /**
    * Compares two set of fields.
    * This method is used to implement {@link AbstractMessage#equals(Object)}
    * and {@link AbstractMutableMessage#equals(Object)}. It takes special care
    * of bytes fields because immutable messages and mutable messages use
-   * different Java type to represent a bytes field and this method should be
+   * different Java type to reprensent a bytes field and this method should be
    * able to compare immutable messages, mutable messages and also an immutable
    * message to a mutable message.
    */
@@ -276,7 +248,7 @@
     }
     return true;
   }
-
+  
   /**
    * Calculates the hash code of a map field. {@code value} must be a list of
    * MapEntry messages.
@@ -328,12 +300,8 @@
       extends AbstractMessageLite.Builder
       implements Message.Builder {
     // The compiler produces an error if this is not declared explicitly.
-    // Method isn't abstract to bypass Java 1.6 compiler issue:
-    //     http://bugs.java.com/view_bug.do?bug_id=6908259
     @Override
-    public BuilderType clone() {
-      throw new UnsupportedOperationException("clone() should be implemented in subclasses.");
-    }
+    public abstract BuilderType clone();
 
     /** TODO(jieluo): Clear it when all subclasses have implemented this method. */
     @Override
@@ -372,7 +340,7 @@
     public String getInitializationErrorString() {
       return MessageReflection.delimitWithCommas(findInitializationErrors());
     }
-
+    
     @Override
     protected BuilderType internalMergeFrom(AbstractMessageLite other) {
       return mergeFrom((Message) other);
@@ -380,10 +348,6 @@
 
     @Override
     public BuilderType mergeFrom(final Message other) {
-      return mergeFrom(other, other.getAllFields());
-    }
-    
-    BuilderType mergeFrom(final Message other, Map<FieldDescriptor, Object> allFields) {
       if (other.getDescriptorForType() != getDescriptorForType()) {
         throw new IllegalArgumentException(
           "mergeFrom(Message) can only merge messages of the same type.");
@@ -398,7 +362,8 @@
       // TODO(kenton):  Provide a function somewhere called makeDeepCopy()
       //   which allows people to make secure deep copies of messages.
 
-      for (final Map.Entry<FieldDescriptor, Object> entry : allFields.entrySet()) {
+      for (final Map.Entry<FieldDescriptor, Object> entry :
+           other.getAllFields().entrySet()) {
         final FieldDescriptor field = entry.getKey();
         if (field.isRepeated()) {
           for (final Object element : (List)entry.getValue()) {
@@ -436,12 +401,8 @@
         final CodedInputStream input,
         final ExtensionRegistryLite extensionRegistry)
         throws IOException {
-      boolean discardUnknown =
-          getDescriptorForType().getFile().getSyntax() == Syntax.PROTO3
-              ? input.shouldDiscardUnknownFieldsProto3()
-              : input.shouldDiscardUnknownFields();
       final UnknownFieldSet.Builder unknownFields =
-          discardUnknown ? null : UnknownFieldSet.newBuilder(getUnknownFields());
+        UnknownFieldSet.newBuilder(getUnknownFields());
       while (true) {
         final int tag = input.readTag();
         if (tag == 0) {
@@ -459,9 +420,7 @@
           break;
         }
       }
-      if (unknownFields != null) {
-        setUnknownFields(unknownFields.build());
-      }
+      setUnknownFields(unknownFields.build());
       return (BuilderType) this;
     }
 
@@ -501,31 +460,6 @@
           MessageReflection.findMissingFields(message));
     }
 
-    /**
-     * Used to support nested builders and called to mark this builder as clean.
-     * Clean builders will propagate the {@link BuilderParent#markDirty()} event
-     * to their parent builders, while dirty builders will not, as their parents
-     * should be dirty already.
-     *
-     * NOTE: Implementations that don't support nested builders don't need to
-     * override this method.
-     */
-    void markClean() {
-      throw new IllegalStateException("Should be overridden by subclasses.");
-    }
-
-    /**
-     * Used to support nested builders and called when this nested builder is
-     * no longer used by its parent builder and should release the reference
-     * to its parent builder.
-     *
-     * NOTE: Implementations that don't support nested builders don't need to
-     * override this method.
-     */
-    void dispose() {
-      throw new IllegalStateException("Should be overridden by subclasses.");
-    }
-
     // ===============================================================
     // The following definitions seem to be required in order to make javac
     // not produce weird errors like:
@@ -616,44 +550,4 @@
       return super.mergeDelimitedFrom(input, extensionRegistry);
     }
   }
-
-  /**
-   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
-   * generated code.
-   */
-  @Deprecated
-  protected static int hashLong(long n) {
-    return (int) (n ^ (n >>> 32));
-  }
-  //
-  /**
-   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
-   * generated code.
-   */
-  @Deprecated
-  protected static int hashBoolean(boolean b) {
-    return b ? 1231 : 1237;
-  }
-  //
-  /**
-   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
-   * generated code.
-   */
-  @Deprecated
-  protected static int hashEnum(EnumLite e) {
-    return e.getNumber();
-  }
-  //
-  /**
-   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
-   * generated code.
-   */
-  @Deprecated
-  protected static int hashEnumList(List<? extends EnumLite> list) {
-    int hash = 1;
-    for (EnumLite e : list) {
-      hash = 31 * hash + hashEnum(e);
-    }
-    return hash;
-  }
 }
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 24830c0..43736dd 100644
--- a/java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java
@@ -30,15 +30,11 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 /**
  * A partial implementation of the {@link MessageLite} interface which
@@ -49,9 +45,10 @@
  */
 public abstract class AbstractMessageLite<
     MessageType extends AbstractMessageLite<MessageType, BuilderType>,
-    BuilderType extends AbstractMessageLite.Builder<MessageType, BuilderType>>
+    BuilderType extends AbstractMessageLite.Builder<MessageType, BuilderType>> 
         implements MessageLite {
   protected int memoizedHashCode = 0;
+  
   @Override
   public ByteString toByteString() {
     try {
@@ -60,7 +57,9 @@
       writeTo(out.getCodedOutput());
       return out.build();
     } catch (IOException e) {
-      throw new RuntimeException(getSerializingExceptionMessage("ByteString"), e);
+      throw new RuntimeException(
+        "Serializing to a ByteString threw an IOException (should " +
+        "never happen).", e);
     }
   }
 
@@ -73,7 +72,9 @@
       output.checkNoSpaceLeft();
       return result;
     } catch (IOException e) {
-      throw new RuntimeException(getSerializingExceptionMessage("byte array"), e);
+      throw new RuntimeException(
+        "Serializing to a byte array threw an IOException " +
+        "(should never happen).", e);
     }
   }
 
@@ -108,11 +109,6 @@
     return new UninitializedMessageException(this);
   }
 
-  private String getSerializingExceptionMessage(String target) {
-    return "Serializing " + getClass().getName() + " to a " + target
-        + " threw an IOException (should never happen).";
-  }
-
   protected static void checkByteStringIsUtf8(ByteString byteString)
       throws IllegalArgumentException {
     if (!byteString.isValidUtf8()) {
@@ -120,16 +116,11 @@
     }
   }
 
-  // For binary compatibility
-  @Deprecated
-  protected static <T> void addAll(final Iterable<T> values, final Collection<? super T> list) {
-    Builder.addAll(values, (List) list);
-  }
-
-  protected static <T> void addAll(final Iterable<T> values, final List<? super T> list) {
+  protected static <T> void addAll(final Iterable<T> values,
+      final Collection<? super T> list) {
     Builder.addAll(values, list);
   }
-
+  
   /**
    * A partial implementation of the {@link Message.Builder} interface which
    * implements as many methods of that interface as possible in terms of
@@ -165,7 +156,9 @@
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (IOException e) {
-        throw new RuntimeException(getReadingExceptionMessage("ByteString"), e);
+        throw new RuntimeException(
+          "Reading from a ByteString threw an IOException (should " +
+          "never happen).", e);
       }
     }
 
@@ -181,7 +174,9 @@
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (IOException e) {
-        throw new RuntimeException(getReadingExceptionMessage("ByteString"), e);
+        throw new RuntimeException(
+          "Reading from a ByteString threw an IOException (should " +
+          "never happen).", e);
       }
     }
 
@@ -202,7 +197,9 @@
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (IOException e) {
-        throw new RuntimeException(getReadingExceptionMessage("byte array"), e);
+        throw new RuntimeException(
+          "Reading from a byte array threw an IOException (should " +
+          "never happen).", e);
       }
     }
 
@@ -228,7 +225,9 @@
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (IOException e) {
-        throw new RuntimeException(getReadingExceptionMessage("byte array"), e);
+        throw new RuntimeException(
+          "Reading from a byte array threw an IOException (should " +
+          "never happen).", e);
       }
     }
 
@@ -322,7 +321,7 @@
       return mergeDelimitedFrom(input,
           ExtensionRegistryLite.getEmptyRegistry());
     }
-
+    
     @Override
     @SuppressWarnings("unchecked") // isInstance takes care of this
     public BuilderType mergeFrom(final MessageLite other) {
@@ -330,36 +329,12 @@
         throw new IllegalArgumentException(
             "mergeFrom(MessageLite) can only merge messages of the same type.");
       }
-
+        
       return internalMergeFrom((MessageType) other);
     }
-
+    
     protected abstract BuilderType internalMergeFrom(MessageType message);
 
-    private String getReadingExceptionMessage(String target) {
-      return "Reading " + getClass().getName() + " from a " + target
-          + " threw an IOException (should never happen).";
-    }
-
-    // We check nulls as we iterate to avoid iterating over values twice.
-    private static <T> void addAllCheckingNulls(Iterable<T> values, List<? super T> list) {
-      if (list instanceof ArrayList && values instanceof Collection) {
-        ((ArrayList<T>) list).ensureCapacity(list.size() + ((Collection<T>) values).size());
-      }
-      int begin = list.size();
-      for (T value : values) {
-        if (value == null) {
-          // encountered a null value so we must undo our modifications prior to throwing
-          String message = "Element at index " + (list.size() - begin) + " is null.";
-          for (int i = list.size() - 1; i >= begin; i--) {
-            list.remove(i);
-          }
-          throw new NullPointerException(message);
-        }
-        list.add(value);
-      }
-    }
-
     /**
      * Construct an UninitializedMessageException reporting missing fields in
      * the given message.
@@ -369,50 +344,41 @@
       return new UninitializedMessageException(message);
     }
 
-    // For binary compatibility.
-    @Deprecated
-    protected static <T> void addAll(final Iterable<T> values, final Collection<? super T> list) {
-      addAll(values, (List<T>) list);
-    }
-
     /**
-     * Adds the {@code values} to the {@code list}. This is a helper method used by generated code.
-     * Users should ignore it.
+     * Adds the {@code values} to the {@code list}.  This is a helper method
+     * used by generated code.  Users should ignore it.
      *
-     * @throws NullPointerException if {@code values} or any of the elements of {@code values} is
-     *     null.
+     * @throws NullPointerException if {@code values} or any of the elements of
+     * {@code values} is null. When that happens, some elements of
+     * {@code values} may have already been added to the result {@code list}.
      */
-    protected static <T> void addAll(final Iterable<T> values, final List<? super T> list) {
-      checkNotNull(values);
+    protected static <T> void addAll(final Iterable<T> values,
+                                     final Collection<? super T> list) {
+      if (values == null) {
+        throw new NullPointerException();
+      }
       if (values instanceof LazyStringList) {
         // For StringOrByteStringLists, check the underlying elements to avoid
         // forcing conversions of ByteStrings to Strings.
-        // TODO(dweis): Could we just prohibit nulls in all protobuf lists and get rid of this? Is
-        // if even possible to hit this condition as all protobuf methods check for null first,
-        // right?
-        List<?> lazyValues = ((LazyStringList) values).getUnderlyingElements();
-        LazyStringList lazyList = (LazyStringList) list;
-        int begin = list.size();
-        for (Object value : lazyValues) {
-          if (value == null) {
-            // encountered a null value so we must undo our modifications prior to throwing
-            String message = "Element at index " + (lazyList.size() - begin) + " is null.";
-            for (int i = lazyList.size() - 1; i >= begin; i--) {
-              lazyList.remove(i);
-            }
-            throw new NullPointerException(message);
-          }
-          if (value instanceof ByteString) {
-            lazyList.add((ByteString) value);
-          } else {
-            lazyList.add((String) value);
-          }
-        }
+        checkForNullValues(((LazyStringList) values).getUnderlyingElements());
+        list.addAll((Collection<T>) values);
+      } else if (values instanceof Collection) {
+        checkForNullValues(values);
+        list.addAll((Collection<T>) values);
       } else {
-        if (values instanceof PrimitiveNonBoxingCollection) {
-          list.addAll((Collection<T>) values);
-        } else {
-          addAllCheckingNulls(values, list);
+        for (final T value : values) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          list.add(value);
+        }
+      }
+    }
+
+    private static void checkForNullValues(final Iterable<?> values) {
+      for (final Object value : values) {
+        if (value == null) {
+          throw new NullPointerException();
         }
       }
     }
diff --git a/java/core/src/main/java/com/google/protobuf/AbstractParser.java b/java/core/src/main/java/com/google/protobuf/AbstractParser.java
index ba570e3..66b0ee3 100644
--- a/java/core/src/main/java/com/google/protobuf/AbstractParser.java
+++ b/java/core/src/main/java/com/google/protobuf/AbstractParser.java
@@ -31,9 +31,9 @@
 package com.google.protobuf;
 
 import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream;
+
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.ByteBuffer;
 
 /**
  * A partial implementation of the {@link Parser} interface which implements
@@ -131,30 +131,6 @@
   }
 
   @Override
-  public MessageType parseFrom(ByteBuffer data, ExtensionRegistryLite extensionRegistry)
-      throws InvalidProtocolBufferException {
-    MessageType message;
-    try {
-      CodedInputStream input = CodedInputStream.newInstance(data);
-      message = parsePartialFrom(input, extensionRegistry);
-      try {
-        input.checkLastTagWas(0);
-      } catch (InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(message);
-      }
-    } catch (InvalidProtocolBufferException e) {
-      throw e;
-    }
-
-    return checkMessageInitialized(message);
-  }
-
-  @Override
-  public MessageType parseFrom(ByteBuffer data) throws InvalidProtocolBufferException {
-    return parseFrom(data, EMPTY_REGISTRY);
-  }
-
-  @Override
   public MessageType parsePartialFrom(
       byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)
       throws InvalidProtocolBufferException {
@@ -256,7 +232,7 @@
       }
       size = CodedInputStream.readRawVarint32(firstByte, input);
     } catch (IOException e) {
-      throw new InvalidProtocolBufferException(e);
+      throw new InvalidProtocolBufferException(e.getMessage());
     }
     InputStream limitedInput = new LimitedInputStream(input, size);
     return parsePartialFrom(limitedInput, extensionRegistry);
diff --git a/java/core/src/main/java/com/google/protobuf/BooleanArrayList.java b/java/core/src/main/java/com/google/protobuf/BooleanArrayList.java
index fd4c142..8b2820b 100644
--- a/java/core/src/main/java/com/google/protobuf/BooleanArrayList.java
+++ b/java/core/src/main/java/com/google/protobuf/BooleanArrayList.java
@@ -30,30 +30,29 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Internal.BooleanList;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.RandomAccess;
 
 /**
  * An implementation of {@link BooleanList} on top of a primitive array.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
-final class BooleanArrayList extends AbstractProtobufList<Boolean>
-    implements BooleanList, RandomAccess, PrimitiveNonBoxingCollection {
-
+final class BooleanArrayList
+    extends AbstractProtobufList<Boolean> implements BooleanList, RandomAccess {
+  
   private static final BooleanArrayList EMPTY_LIST = new BooleanArrayList();
   static {
     EMPTY_LIST.makeImmutable();
   }
-
+  
   public static BooleanArrayList emptyList() {
     return EMPTY_LIST;
   }
-
+  
   /**
    * The backing store for the list.
    */
@@ -73,14 +72,13 @@
   }
 
   /**
-   * Constructs a new mutable {@code BooleanArrayList}
-   * containing the same elements as {@code other}.
+   * Constructs a new mutable {@code BooleanArrayList}.
    */
-  private BooleanArrayList(boolean[] other, int size) {
-    array = other;
+  private BooleanArrayList(boolean[] array, int size) {
+    this.array = array;
     this.size = size;
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -93,14 +91,14 @@
     if (size != other.size) {
       return false;
     }
-
+    
     final boolean[] arr = other.array;
     for (int i = 0; i < size; i++) {
       if (array[i] != arr[i]) {
         return false;
       }
     }
-
+    
     return true;
   }
 
@@ -172,7 +170,7 @@
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(makeOutOfBoundsExceptionMessage(index));
     }
-
+    
     if (size < array.length) {
       // Shift everything over to make room
       System.arraycopy(array, index, array, index + 1, size - index);
@@ -180,10 +178,10 @@
       // Resize to 1.5x the size
       int length = ((size * 3) / 2) + 1;
       boolean[] newArray = new boolean[length];
-
+      
       // Copy the first part directly
       System.arraycopy(array, 0, newArray, 0, index);
-
+      
       // Copy the rest shifted over by one to make room
       System.arraycopy(array, index, newArray, index + 1, size - index);
       array = newArray;
@@ -197,36 +195,38 @@
   @Override
   public boolean addAll(Collection<? extends Boolean> collection) {
     ensureIsMutable();
-
-    checkNotNull(collection);
-
+    
+    if (collection == null) {
+      throw new NullPointerException();
+    }
+    
     // We specialize when adding another BooleanArrayList to avoid boxing elements.
     if (!(collection instanceof BooleanArrayList)) {
       return super.addAll(collection);
     }
-
+    
     BooleanArrayList list = (BooleanArrayList) collection;
     if (list.size == 0) {
       return false;
     }
-
+    
     int overflow = Integer.MAX_VALUE - size;
     if (overflow < list.size) {
       // We can't actually represent a list this large.
       throw new OutOfMemoryError();
     }
-
+    
     int newSize = size + list.size;
     if (newSize > array.length) {
       array = Arrays.copyOf(array, newSize);
     }
-
+    
     System.arraycopy(list.array, 0, array, size, list.size);
     size = newSize;
     modCount++;
     return true;
   }
-
+  
   @Override
   public boolean remove(Object o) {
     ensureIsMutable();
@@ -255,7 +255,7 @@
   /**
    * Ensures that the provided {@code index} is within the range of {@code [0, size]}. Throws an
    * {@link IndexOutOfBoundsException} if it is not.
-   *
+   * 
    * @param index the index to verify is in range
    */
   private void ensureIndexInRange(int index) {
diff --git a/java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java b/java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java
index 6157a52..0cc3817 100644
--- a/java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java
+++ b/java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java
@@ -33,12 +33,11 @@
 import static java.lang.Math.max;
 import static java.lang.Math.min;
 
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.ref.SoftReference;
-import java.lang.reflect.Field;
 import java.nio.ByteBuffer;
-import java.nio.channels.WritableByteChannel;
 
 /**
  * Utility class to provide efficient writing of {@link ByteBuffer}s to {@link OutputStream}s.
@@ -76,12 +75,6 @@
       new ThreadLocal<SoftReference<byte[]>>();
 
   /**
-   * This is a hack for GAE, where {@code FileOutputStream} is unavailable.
-   */
-  private static final Class<?> FILE_OUTPUT_STREAM_CLASS = safeGetClass("java.io.FileOutputStream");
-  private static final long CHANNEL_FIELD_OFFSET = getChannelFieldOffset(FILE_OUTPUT_STREAM_CLASS);
-
-  /**
    * For testing purposes only. Clears the cached buffer to force a new allocation on the next
    * invocation.
    */
@@ -100,7 +93,10 @@
         // Optimized write for array-backed buffers.
         // Note that we're taking the risk that a malicious OutputStream could modify the array.
         output.write(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining());
-      } else if (!writeToChannel(buffer, output)){
+      } else if (output instanceof FileOutputStream) {
+        // Use a channel to write out the ByteBuffer. This will automatically empty the buffer.
+        ((FileOutputStream) output).getChannel().write(buffer);
+      } else {
         // Read all of the data from the buffer to an array.
         // TODO(nathanmittler): Consider performance improvements for other "known" stream types.
         final byte[] array = getOrCreateBuffer(buffer.remaining());
@@ -146,40 +142,4 @@
   private static void setBuffer(byte[] value) {
     BUFFER.set(new SoftReference<byte[]>(value));
   }
-
-  private static boolean writeToChannel(ByteBuffer buffer, OutputStream output) throws IOException {
-    if (CHANNEL_FIELD_OFFSET >= 0 && FILE_OUTPUT_STREAM_CLASS.isInstance(output)) {
-      // Use a channel to write out the ByteBuffer. This will automatically empty the buffer.
-      WritableByteChannel channel = null;
-      try {
-        channel = (WritableByteChannel) UnsafeUtil.getObject(output, CHANNEL_FIELD_OFFSET);
-      } catch (ClassCastException e) {
-        // Absorb.
-      }
-      if (channel != null) {
-        channel.write(buffer);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private static Class<?> safeGetClass(String className) {
-    try {
-      return Class.forName(className);
-    } catch (ClassNotFoundException e) {
-      return null;
-    }
-  }
-  private static long getChannelFieldOffset(Class<?> clazz) {
-    try {
-      if (clazz != null && UnsafeUtil.hasUnsafeArrayOperations()) {
-        Field field = clazz.getDeclaredField("channel");
-        return UnsafeUtil.objectFieldOffset(field);
-      }
-    } catch (Throwable e) {
-      // Absorb
-    }
-    return -1;
-  }
 }
diff --git a/java/core/src/main/java/com/google/protobuf/ByteOutput.java b/java/core/src/main/java/com/google/protobuf/ByteOutput.java
index ee58875..8b7b04c 100644
--- a/java/core/src/main/java/com/google/protobuf/ByteOutput.java
+++ b/java/core/src/main/java/com/google/protobuf/ByteOutput.java
@@ -37,11 +37,11 @@
  * An output target for raw bytes. This interface provides semantics that support two types of
  * writing:
  *
- * <p><b>Traditional write operations:</b>
+ * <p/><b>Traditional write operations:</b>
  * (as defined by {@link java.io.OutputStream}) where the target method is responsible for either
  * copying the data or completing the write before returning from the method call.
  *
- * <p><b>Lazy write operations:</b> where the caller guarantees that it will never modify the
+ * <p/><b>Lazy write operations:</b> where the caller guarantees that it will never modify the
  * provided buffer and it can therefore be considered immutable. The target method is free to
  * maintain a reference to the buffer beyond the scope of the method call (e.g. until the write
  * operation completes).
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 99a3120..62c9450 100644
--- a/java/core/src/main/java/com/google/protobuf/ByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/ByteString.java
@@ -51,12 +51,14 @@
 import java.util.NoSuchElementException;
 
 /**
- * Immutable sequence of bytes. Substring is supported by sharing the reference to the immutable
- * underlying bytes. Concatenation is likewise supported without copying (long strings) by building
- * a tree of pieces in {@link RopeByteString}.
- *
- * <p>Like {@link String}, the contents of a {@link ByteString} can never be observed to change, not
- * even in the presence of a data race or incorrect API usage in the client code.
+ * Immutable sequence of bytes.  Substring is supported by sharing the reference
+ * to the immutable underlying bytes, as with {@link String}.  Concatenation is
+ * likewise supported without copying (long strings) by building a tree of
+ * pieces in {@link RopeByteString}.
+ * <p>
+ * Like {@link String}, the contents of a {@link ByteString} can never be
+ * observed to change, not even in the presence of a data race or incorrect
+ * API usage in the client code.
  *
  * @author crazybob@google.com Bob Lee
  * @author kenton@google.com Kenton Varda
@@ -85,17 +87,17 @@
    * Empty {@code ByteString}.
    */
   public static final ByteString EMPTY = new LiteralByteString(Internal.EMPTY_BYTE_ARRAY);
-
-  /**
+  
+  /** 
    * An interface to efficiently copy {@code byte[]}.
-   *
-   * <p>One of the noticeable costs of copying a byte[] into a new array using
-   * {@code System.arraycopy} is nullification of a new buffer before the copy. It has been shown
+   * 
+   * <p>One of the noticable costs of copying a byte[] into a new array using 
+   * {@code System.arraycopy} is nullification of a new buffer before the copy. It has been shown 
    * the Hotspot VM is capable to intrisicfy {@code Arrays.copyOfRange} operation to avoid this
    * expensive nullification and provide substantial performance gain. Unfortunately this does not
    * hold on Android runtimes and could make the copy slightly slower due to additional code in
    * the {@code Arrays.copyOfRange}. Thus we provide two different implementation for array copier
-   * for Hotspot and Android runtimes.
+   * for Hotspot and Android runtimes. 
    */
   private interface ByteArrayCopier {
     /**
@@ -103,7 +105,7 @@
      */
     byte[] copyFrom(byte[] bytes, int offset, int size);
   }
-
+  
   /** Implementation of {@code ByteArrayCopier} which uses {@link System#arraycopy}. */
   private static final class SystemByteArrayCopier implements ByteArrayCopier {
     @Override
@@ -113,7 +115,7 @@
       return copy;
     }
   }
-
+  
   /** Implementation of {@code ByteArrayCopier} which uses {@link Arrays#copyOfRange}. */
   private static final class ArraysByteArrayCopier implements ByteArrayCopier {
     @Override
@@ -121,7 +123,7 @@
       return Arrays.copyOfRange(bytes, offset, offset + size);
     }
   }
-
+  
   private static final ByteArrayCopier byteArrayCopier;
   static {
     boolean isAndroid = true;
@@ -130,7 +132,7 @@
     } catch (ClassNotFoundException e) {
       isAndroid = false;
     }
-
+    
     byteArrayCopier = isAndroid ? new SystemByteArrayCopier() : new ArraysByteArrayCopier();
   }
 
@@ -307,19 +309,7 @@
   public static ByteString copyFrom(byte[] bytes) {
     return copyFrom(bytes, 0, bytes.length);
   }
-
-  /**
-   * Wraps the given bytes into a {@code ByteString}. Intended for internal only usage.
-   */
-  static ByteString wrap(ByteBuffer buffer) {
-    if (buffer.hasArray()) {
-      final int offset = buffer.arrayOffset();
-      return ByteString.wrap(buffer.array(), offset + buffer.position(), buffer.remaining());
-    } else {
-      return new NioByteString(buffer);
-    }
-  }
-
+  
   /**
    * Wraps the given bytes into a {@code ByteString}. Intended for internal only
    * usage to force a classload of ByteString before LiteralByteString.
@@ -412,7 +402,7 @@
    * immutable tree of byte arrays ("chunks") of the stream data.  The
    * first chunk is small, with subsequent chunks each being double
    * the size, up to 8K.
-   *
+   * 
    * <p>Each byte read from the input stream will be copied twice to ensure
    * that the resulting ByteString is truly immutable.
    *
@@ -563,9 +553,7 @@
   // Create a balanced concatenation of the next "length" elements from the
   // iterable.
   private static ByteString balancedConcat(Iterator<ByteString> iterator, int length) {
-    if (length < 1) {
-      throw new IllegalArgumentException(String.format("length (%s) must be >= 1", length));
-    }
+    assert length >= 1;
     ByteString result;
     if (length == 1) {
       result = iterator.next();
@@ -691,7 +679,6 @@
    */
   abstract void writeTo(ByteOutput byteOutput) throws IOException;
 
-
   /**
    * Constructs a read-only {@code java.nio.ByteBuffer} whose content
    * is equal to the contents of this byte string.
@@ -833,7 +820,6 @@
       return true;
     }
 
-
     /**
      * Check equality of the substring of given length of this object starting at
      * zero with another {@code ByteString} substring starting at offset.
@@ -1240,7 +1226,7 @@
     return String.format("<ByteString@%s size=%d>",
         Integer.toHexString(System.identityHashCode(this)), size());
   }
-
+  
   /**
    * This class implements a {@link com.google.protobuf.ByteString} backed by a
    * single array of bytes, contiguous in memory. It supports substring by
@@ -1464,7 +1450,7 @@
       return 0;
     }
   }
-
+  
   /**
    * This class is used to represent the substring of a {@link ByteString} over a
    * single byte array. In terms of the public API of {@link ByteString}, you end
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 e08a993..e886065 100644
--- a/java/core/src/main/java/com/google/protobuf/CodedInputStream.java
+++ b/java/core/src/main/java/com/google/protobuf/CodedInputStream.java
@@ -30,113 +30,62 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.EMPTY_BYTE_ARRAY;
-import static com.google.protobuf.Internal.EMPTY_BYTE_BUFFER;
-import static com.google.protobuf.Internal.UTF_8;
-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_VARINT_SIZE;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Iterator;
 import java.util.List;
 
 /**
  * Reads and decodes protocol message fields.
  *
- * <p>This class contains two kinds of methods: methods that read specific protocol message
- * constructs and field types (e.g. {@link #readTag()} and {@link #readInt32()}) and methods that
- * read low-level values (e.g. {@link #readRawVarint32()} and {@link #readRawBytes}). If you are
- * reading encoded protocol messages, you should use the former methods, but if you are reading some
- * other format of your own design, use the latter.
+ * This class contains two kinds of methods:  methods that read specific
+ * protocol message constructs and field types (e.g. {@link #readTag()} and
+ * {@link #readInt32()}) and methods that read low-level values (e.g.
+ * {@link #readRawVarint32()} and {@link #readRawBytes}).  If you are reading
+ * encoded protocol messages, you should use the former methods, but if you are
+ * reading some other format of your own design, use the latter.
  *
  * @author kenton@google.com Kenton Varda
  */
-public abstract class CodedInputStream {
-  private static final int DEFAULT_BUFFER_SIZE = 4096;
-  private static final int DEFAULT_RECURSION_LIMIT = 100;
-  // Integer.MAX_VALUE == 0x7FFFFFF == INT_MAX from limits.h
-  private static final int DEFAULT_SIZE_LIMIT = Integer.MAX_VALUE;
-
-  /** Visible for subclasses. See setRecursionLimit() */
-  int recursionDepth;
-
-  int recursionLimit = DEFAULT_RECURSION_LIMIT;
-
-  /** Visible for subclasses. See setSizeLimit() */
-  int sizeLimit = DEFAULT_SIZE_LIMIT;
-
-  /** Create a new CodedInputStream wrapping the given InputStream. */
+public final class CodedInputStream {
+  /**
+   * Create a new CodedInputStream wrapping the given InputStream.
+   */
   public static CodedInputStream newInstance(final InputStream input) {
-    return newInstance(input, DEFAULT_BUFFER_SIZE);
+    return new CodedInputStream(input, BUFFER_SIZE);
   }
-
-  /** Create a new CodedInputStream wrapping the given InputStream. */
+  
+  /**
+   * Create a new CodedInputStream wrapping the given InputStream.
+   */
   static CodedInputStream newInstance(final InputStream input, int bufferSize) {
-    if (input == null) {
-      // TODO(nathanmittler): Ideally we should throw here. This is done for backward compatibility.
-      return newInstance(EMPTY_BYTE_ARRAY);
-    }
-    return new StreamDecoder(input, bufferSize);
+    return new CodedInputStream(input, bufferSize);
   }
 
-  /** Create a new CodedInputStream wrapping the given {@code Iterable <ByteBuffer>}. */
-  public static CodedInputStream newInstance(final Iterable<ByteBuffer> input) {
-    if (!UnsafeDirectNioDecoder.isSupported()) {
-      return newInstance(new IterableByteBufferInputStream(input));
-    }
-    return newInstance(input, false);
-  }
-
-  /** Create a new CodedInputStream wrapping the given {@code Iterable <ByteBuffer>}. */
-  static CodedInputStream newInstance(
-      final Iterable<ByteBuffer> bufs, final boolean bufferIsImmutable) {
-    // flag is to check the type of input's ByteBuffers.
-    // flag equals 1: all ByteBuffers have array.
-    // flag equals 2: all ByteBuffers are direct ByteBuffers.
-    // flag equals 3: some ByteBuffers are direct and some have array.
-    // flag greater than 3: other cases.
-    int flag = 0;
-    // Total size of the input
-    int totalSize = 0;
-    for (ByteBuffer buf : bufs) {
-      totalSize += buf.remaining();
-      if (buf.hasArray()) {
-        flag |= 1;
-      } else if (buf.isDirect()) {
-        flag |= 2;
-      } else {
-        flag |= 4;
-      }
-    }
-    if (flag == 2) {
-      return new IterableDirectByteBufferDecoder(bufs, totalSize, bufferIsImmutable);
-    } else {
-      // TODO(yilunchong): add another decoders to deal case 1 and 3.
-      return newInstance(new IterableByteBufferInputStream(bufs));
-    }
-  }
-
-  /** Create a new CodedInputStream wrapping the given byte array. */
+  /**
+   * Create a new CodedInputStream wrapping the given byte array.
+   */
   public static CodedInputStream newInstance(final byte[] buf) {
     return newInstance(buf, 0, buf.length);
   }
 
-  /** Create a new CodedInputStream wrapping the given byte array slice. */
-  public static CodedInputStream newInstance(final byte[] buf, final int off, final int len) {
+  /**
+   * Create a new CodedInputStream wrapping the given byte array slice.
+   */
+  public static CodedInputStream newInstance(final byte[] buf, final int off,
+                                             final int len) {
     return newInstance(buf, off, len, false /* bufferIsImmutable */);
   }
-
-  /** Create a new CodedInputStream wrapping the given byte array slice. */
+  
+  /**
+   * Create a new CodedInputStream wrapping the given byte array slice.
+   */
   static CodedInputStream newInstance(
       final byte[] buf, final int off, final int len, final boolean bufferIsImmutable) {
-    ArrayDecoder result = new ArrayDecoder(buf, off, len, bufferIsImmutable);
+    CodedInputStream result = new CodedInputStream(buf, off, len, bufferIsImmutable);
     try {
       // Some uses of CodedInputStream can be more efficient if they know
       // exactly how many bytes are available.  By pushing the end point of the
@@ -158,415 +107,583 @@
   }
 
   /**
-   * Create a new CodedInputStream wrapping the given ByteBuffer. The data starting from the
-   * ByteBuffer's current position to its limit will be read. The returned CodedInputStream may or
-   * may not share the underlying data in the ByteBuffer, therefore the ByteBuffer cannot be changed
-   * while the CodedInputStream is in use. Note that the ByteBuffer's position won't be changed by
-   * this function. Concurrent calls with the same ByteBuffer object are safe if no other thread is
-   * trying to alter the ByteBuffer's status.
+   * Create a new CodedInputStream wrapping the given ByteBuffer. The data
+   * starting from the ByteBuffer's current position to its limit will be read.
+   * The returned CodedInputStream may or may not share the underlying data
+   * in the ByteBuffer, therefore the ByteBuffer cannot be changed while the
+   * CodedInputStream is in use.
+   * Note that the ByteBuffer's position won't be changed by this function.
+   * Concurrent calls with the same ByteBuffer object are safe if no other
+   * thread is trying to alter the ByteBuffer's status.
    */
   public static CodedInputStream newInstance(ByteBuffer buf) {
-    return newInstance(buf, false /* bufferIsImmutable */);
-  }
-
-  /** Create a new CodedInputStream wrapping the given buffer. */
-  static CodedInputStream newInstance(ByteBuffer buf, boolean bufferIsImmutable) {
     if (buf.hasArray()) {
-      return newInstance(
-          buf.array(), buf.arrayOffset() + buf.position(), buf.remaining(), bufferIsImmutable);
+      return newInstance(buf.array(), buf.arrayOffset() + buf.position(),
+          buf.remaining());
+    } else {
+      ByteBuffer temp = buf.duplicate();
+      byte[] buffer = new byte[temp.remaining()];
+      temp.get(buffer);
+      return newInstance(buffer);
     }
-
-    if (buf.isDirect() && UnsafeDirectNioDecoder.isSupported()) {
-      return new UnsafeDirectNioDecoder(buf, bufferIsImmutable);
-    }
-
-    // The buffer is non-direct and does not expose the underlying array. Using the ByteBuffer API
-    // to access individual bytes is very slow, so just copy the buffer to an array.
-    // TODO(nathanmittler): Re-evaluate with Java 9
-    byte[] buffer = new byte[buf.remaining()];
-    buf.duplicate().get(buffer);
-    return newInstance(buffer, 0, buffer.length, true);
   }
 
-  /** Disable construction/inheritance outside of this class. */
-  private CodedInputStream() {}
-
   // -----------------------------------------------------------------
 
   /**
-   * Attempt to read a field tag, returning zero if we have reached EOF. Protocol message parsers
-   * use this to read tags, since a protocol message may legally end wherever a tag occurs, and zero
-   * is not a valid tag number.
+   * Attempt to read a field tag, returning zero if we have reached EOF.
+   * Protocol message parsers use this to read tags, since a protocol message
+   * may legally end wherever a tag occurs, and zero is not a valid tag number.
    */
-  public abstract int readTag() throws IOException;
+  public int readTag() throws IOException {
+    if (isAtEnd()) {
+      lastTag = 0;
+      return 0;
+    }
+
+    lastTag = readRawVarint32();
+    if (WireFormat.getTagFieldNumber(lastTag) == 0) {
+      // If we actually read zero (or any tag number corresponding to field
+      // number zero), that's not a valid tag.
+      throw InvalidProtocolBufferException.invalidTag();
+    }
+    return lastTag;
+  }
 
   /**
-   * Verifies that the last call to readTag() returned the given tag value. This is used to verify
-   * that a nested group ended with the correct end tag.
+   * Verifies that the last call to readTag() returned the given tag value.
+   * This is used to verify that a nested group ended with the correct
+   * end tag.
    *
-   * @throws InvalidProtocolBufferException {@code value} does not match the last tag.
+   * @throws InvalidProtocolBufferException {@code value} does not match the
+   *                                        last tag.
    */
-  public abstract void checkLastTagWas(final int value) throws InvalidProtocolBufferException;
+  public void checkLastTagWas(final int value)
+                              throws InvalidProtocolBufferException {
+    if (lastTag != value) {
+      throw InvalidProtocolBufferException.invalidEndTag();
+    }
+  }
 
-  public abstract int getLastTag();
+  public int getLastTag() {
+    return lastTag;
+  }
 
   /**
    * Reads and discards a single field, given its tag value.
    *
-   * @return {@code false} if the tag is an endgroup tag, in which case nothing is skipped.
-   *     Otherwise, returns {@code true}.
+   * @return {@code false} if the tag is an endgroup tag, in which case
+   *         nothing is skipped.  Otherwise, returns {@code true}.
    */
-  public abstract boolean skipField(final int tag) throws IOException;
+  public boolean skipField(final int tag) throws IOException {
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        skipRawVarint();
+        return true;
+      case WireFormat.WIRETYPE_FIXED64:
+        skipRawBytes(8);
+        return true;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        skipRawBytes(readRawVarint32());
+        return true;
+      case WireFormat.WIRETYPE_START_GROUP:
+        skipMessage();
+        checkLastTagWas(
+          WireFormat.makeTag(WireFormat.getTagFieldNumber(tag),
+                             WireFormat.WIRETYPE_END_GROUP));
+        return true;
+      case WireFormat.WIRETYPE_END_GROUP:
+        return false;
+      case WireFormat.WIRETYPE_FIXED32:
+        skipRawBytes(4);
+        return true;
+      default:
+        throw InvalidProtocolBufferException.invalidWireType();
+    }
+  }
 
   /**
-   * Reads a single field and writes it to output in wire format, given its tag value.
+   * Reads a single field and writes it to output in wire format,
+   * given its tag value.
    *
-   * @return {@code false} if the tag is an endgroup tag, in which case nothing is skipped.
-   *     Otherwise, returns {@code true}.
-   * @deprecated use {@code UnknownFieldSet} or {@code UnknownFieldSetLite} to skip to an output
-   *     stream.
+   * @return {@code false} if the tag is an endgroup tag, in which case
+   *         nothing is skipped.  Otherwise, returns {@code true}.
    */
-  @Deprecated
-  public abstract boolean skipField(final int tag, final CodedOutputStream output)
-      throws IOException;
+  public boolean skipField(final int tag, final CodedOutputStream output)
+      throws IOException {
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT: {
+        long value = readInt64();
+        output.writeRawVarint32(tag);
+        output.writeUInt64NoTag(value);
+        return true;
+      }
+      case WireFormat.WIRETYPE_FIXED64: {
+        long value = readRawLittleEndian64();
+        output.writeRawVarint32(tag);
+        output.writeFixed64NoTag(value);
+        return true;
+      }
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED: {
+        ByteString value = readBytes();
+        output.writeRawVarint32(tag);
+        output.writeBytesNoTag(value);
+        return true;
+      }
+      case WireFormat.WIRETYPE_START_GROUP: {
+        output.writeRawVarint32(tag);
+        skipMessage(output);
+        int endtag = WireFormat.makeTag(WireFormat.getTagFieldNumber(tag),
+                                        WireFormat.WIRETYPE_END_GROUP);
+        checkLastTagWas(endtag);
+        output.writeRawVarint32(endtag);
+        return true;
+      }
+      case WireFormat.WIRETYPE_END_GROUP: {
+        return false;
+      }
+      case WireFormat.WIRETYPE_FIXED32: {
+        int value = readRawLittleEndian32();
+        output.writeRawVarint32(tag);
+        output.writeFixed32NoTag(value);
+        return true;
+      }
+      default:
+        throw InvalidProtocolBufferException.invalidWireType();
+    }
+  }
 
   /**
-   * Reads and discards an entire message. This will read either until EOF or until an endgroup tag,
-   * whichever comes first.
-   */
-  public abstract void skipMessage() throws IOException;
-
-  /**
-   * Reads an entire message and writes it to output in wire format. This will read either until EOF
+   * Reads and discards an entire message.  This will read either until EOF
    * or until an endgroup tag, whichever comes first.
    */
-  public abstract void skipMessage(CodedOutputStream output) throws IOException;
+  public void skipMessage() throws IOException {
+    while (true) {
+      final int tag = readTag();
+      if (tag == 0 || !skipField(tag)) {
+        return;
+      }
+    }
+  }
+
+  /**
+   * Reads an entire message and writes it to output in wire format.
+   * This will read either until EOF or until an endgroup tag,
+   * whichever comes first.
+   */
+  public void skipMessage(CodedOutputStream output) throws IOException {
+    while (true) {
+      final int tag = readTag();
+      if (tag == 0 || !skipField(tag, output)) {
+        return;
+      }
+    }
+  }
+
+  /**
+   * Collects the bytes skipped and returns the data in a ByteBuffer.
+   */
+  private class SkippedDataSink implements RefillCallback {
+    private int lastPos = bufferPos;
+    private ByteArrayOutputStream byteArrayStream;
+
+    @Override
+    public void onRefill() {
+      if (byteArrayStream == null) {
+        byteArrayStream = new ByteArrayOutputStream();
+      }
+      byteArrayStream.write(buffer, lastPos, bufferPos - lastPos);
+      lastPos = 0;
+    }
+
+    /**
+     * Gets skipped data in a ByteBuffer. This method should only be
+     * called once.
+     */
+    ByteBuffer getSkippedData() {
+      if (byteArrayStream == null) {
+        return ByteBuffer.wrap(buffer, lastPos, bufferPos - lastPos);
+      } else {
+        byteArrayStream.write(buffer, lastPos, bufferPos);
+        return ByteBuffer.wrap(byteArrayStream.toByteArray());
+      }
+    }
+  }
 
 
   // -----------------------------------------------------------------
 
   /** Read a {@code double} field value from the stream. */
-  public abstract double readDouble() throws IOException;
+  public double readDouble() throws IOException {
+    return Double.longBitsToDouble(readRawLittleEndian64());
+  }
 
   /** Read a {@code float} field value from the stream. */
-  public abstract float readFloat() throws IOException;
+  public float readFloat() throws IOException {
+    return Float.intBitsToFloat(readRawLittleEndian32());
+  }
 
   /** Read a {@code uint64} field value from the stream. */
-  public abstract long readUInt64() throws IOException;
+  public long readUInt64() throws IOException {
+    return readRawVarint64();
+  }
 
   /** Read an {@code int64} field value from the stream. */
-  public abstract long readInt64() throws IOException;
+  public long readInt64() throws IOException {
+    return readRawVarint64();
+  }
 
   /** Read an {@code int32} field value from the stream. */
-  public abstract int readInt32() throws IOException;
+  public int readInt32() throws IOException {
+    return readRawVarint32();
+  }
 
   /** Read a {@code fixed64} field value from the stream. */
-  public abstract long readFixed64() throws IOException;
+  public long readFixed64() throws IOException {
+    return readRawLittleEndian64();
+  }
 
   /** Read a {@code fixed32} field value from the stream. */
-  public abstract int readFixed32() throws IOException;
+  public int readFixed32() throws IOException {
+    return readRawLittleEndian32();
+  }
 
   /** Read a {@code bool} field value from the stream. */
-  public abstract boolean readBool() throws IOException;
+  public boolean readBool() throws IOException {
+    return readRawVarint64() != 0;
+  }
 
   /**
-   * Read a {@code string} field value from the stream. If the stream contains malformed UTF-8,
+   * Read a {@code string} field value from the stream.
+   * If the stream contains malformed UTF-8,
    * replace the offending bytes with the standard UTF-8 replacement character.
    */
-  public abstract String readString() throws IOException;
+  public String readString() throws IOException {
+    final int size = readRawVarint32();
+    if (size <= (bufferSize - bufferPos) && size > 0) {
+      // Fast path:  We already have the bytes in a contiguous buffer, so
+      //   just copy directly from it.
+      final String result = new String(buffer, bufferPos, size, Internal.UTF_8);
+      bufferPos += size;
+      return result;
+    } else if (size == 0) {
+      return "";
+    } else if (size <= bufferSize) {
+      refillBuffer(size);
+      String result = new String(buffer, bufferPos, size, Internal.UTF_8);
+      bufferPos += size;
+      return result;
+    } else {
+      // Slow path:  Build a byte array first then copy it.
+      return new String(readRawBytesSlowPath(size), Internal.UTF_8);
+    }
+  }
 
   /**
-   * Read a {@code string} field value from the stream. If the stream contains malformed UTF-8,
+   * Read a {@code string} field value from the stream.
+   * If the stream contains malformed UTF-8,
    * throw exception {@link InvalidProtocolBufferException}.
    */
-  public abstract String readStringRequireUtf8() throws IOException;
+  public String readStringRequireUtf8() throws IOException {
+    final int size = readRawVarint32();
+    final byte[] bytes;
+    final int oldPos = bufferPos;
+    final int pos;
+    if (size <= (bufferSize - oldPos) && size > 0) {
+      // Fast path:  We already have the bytes in a contiguous buffer, so
+      //   just copy directly from it.
+      bytes = buffer;
+      bufferPos = oldPos + size;
+      pos = oldPos;
+    } else if (size == 0) {
+      return "";
+    } else if (size <= bufferSize) {
+      refillBuffer(size);
+      bytes = buffer;
+      pos = 0;
+      bufferPos = pos + size;
+    } else {
+      // Slow path:  Build a byte array first then copy it.
+      bytes = readRawBytesSlowPath(size);
+      pos = 0;
+    }
+    // TODO(martinrb): We could save a pass by validating while decoding.
+    if (!Utf8.isValidUtf8(bytes, pos, pos + size)) {
+      throw InvalidProtocolBufferException.invalidUtf8();
+    }
+    return new String(bytes, pos, size, Internal.UTF_8);
+  }
 
   /** Read a {@code group} field value from the stream. */
-  public abstract void readGroup(
+  public void readGroup(final int fieldNumber,
+                        final MessageLite.Builder builder,
+                        final ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    if (recursionDepth >= recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+    ++recursionDepth;
+    builder.mergeFrom(this, extensionRegistry);
+    checkLastTagWas(
+      WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
+    --recursionDepth;
+  }
+
+
+  /** Read a {@code group} field value from the stream. */
+  public <T extends MessageLite> T readGroup(
       final int fieldNumber,
-      final MessageLite.Builder builder,
+      final Parser<T> parser,
       final ExtensionRegistryLite extensionRegistry)
-      throws IOException;
-
-
-  /** Read a {@code group} field value from the stream. */
-  public abstract <T extends MessageLite> T readGroup(
-      final int fieldNumber, final Parser<T> parser, final ExtensionRegistryLite extensionRegistry)
-      throws IOException;
+      throws IOException {
+    if (recursionDepth >= recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+    ++recursionDepth;
+    T result = parser.parsePartialFrom(this, extensionRegistry);
+    checkLastTagWas(
+      WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
+    --recursionDepth;
+    return result;
+  }
 
   /**
-   * Reads a {@code group} field value from the stream and merges it into the given {@link
-   * UnknownFieldSet}.
+   * Reads a {@code group} field value from the stream and merges it into the
+   * given {@link UnknownFieldSet}.
    *
-   * @deprecated UnknownFieldSet.Builder now implements MessageLite.Builder, so you can just call
-   *     {@link #readGroup}.
+   * @deprecated UnknownFieldSet.Builder now implements MessageLite.Builder, so
+   *             you can just call {@link #readGroup}.
    */
   @Deprecated
-  public abstract void readUnknownGroup(final int fieldNumber, final MessageLite.Builder builder)
-      throws IOException;
+  public void readUnknownGroup(final int fieldNumber,
+                               final MessageLite.Builder builder)
+      throws IOException {
+    // We know that UnknownFieldSet will ignore any ExtensionRegistry so it
+    // is safe to pass null here.  (We can't call
+    // ExtensionRegistry.getEmptyRegistry() because that would make this
+    // class depend on ExtensionRegistry, which is not part of the lite
+    // library.)
+    readGroup(fieldNumber, builder, null);
+  }
 
   /** Read an embedded message field value from the stream. */
-  public abstract void readMessage(
-      final MessageLite.Builder builder, final ExtensionRegistryLite extensionRegistry)
-      throws IOException;
+  public void readMessage(final MessageLite.Builder builder,
+                          final ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    final int length = readRawVarint32();
+    if (recursionDepth >= recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+    final int oldLimit = pushLimit(length);
+    ++recursionDepth;
+    builder.mergeFrom(this, extensionRegistry);
+    checkLastTagWas(0);
+    --recursionDepth;
+    popLimit(oldLimit);
+  }
 
 
   /** Read an embedded message field value from the stream. */
-  public abstract <T extends MessageLite> T readMessage(
-      final Parser<T> parser, final ExtensionRegistryLite extensionRegistry) throws IOException;
+  public <T extends MessageLite> T readMessage(
+      final Parser<T> parser,
+      final ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    int length = readRawVarint32();
+    if (recursionDepth >= recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+    final int oldLimit = pushLimit(length);
+    ++recursionDepth;
+    T result = parser.parsePartialFrom(this, extensionRegistry);
+    checkLastTagWas(0);
+    --recursionDepth;
+    popLimit(oldLimit);
+    return result;
+  }
 
   /** Read a {@code bytes} field value from the stream. */
-  public abstract ByteString readBytes() throws IOException;
+  public ByteString readBytes() throws IOException {
+    final int size = readRawVarint32();
+    if (size <= (bufferSize - bufferPos) && size > 0) {
+      // Fast path:  We already have the bytes in a contiguous buffer, so
+      //   just copy directly from it.
+      final ByteString result = bufferIsImmutable && enableAliasing
+          ? ByteString.wrap(buffer, bufferPos, size)
+          : ByteString.copyFrom(buffer, bufferPos, size);
+      bufferPos += size;
+      return result;
+    } else if (size == 0) {
+      return ByteString.EMPTY;
+    } else {
+      // Slow path:  Build a byte array first then copy it.
+      return ByteString.wrap(readRawBytesSlowPath(size));
+    }
+  }
 
   /** Read a {@code bytes} field value from the stream. */
-  public abstract byte[] readByteArray() throws IOException;
+  public byte[] readByteArray() throws IOException {
+    final int size = readRawVarint32();
+    if (size <= (bufferSize - bufferPos) && size > 0) {
+      // Fast path: We already have the bytes in a contiguous buffer, so
+      // just copy directly from it.
+      final byte[] result =
+          Arrays.copyOfRange(buffer, bufferPos, bufferPos + size);
+      bufferPos += size;
+      return result;
+    } else {
+      // Slow path: Build a byte array first then copy it.
+      return readRawBytesSlowPath(size);
+    }
+  }
 
   /** Read a {@code bytes} field value from the stream. */
-  public abstract ByteBuffer readByteBuffer() throws IOException;
+  public ByteBuffer readByteBuffer() throws IOException {
+    final int size = readRawVarint32();
+    if (size <= (bufferSize - bufferPos) && size > 0) {
+      // Fast path: We already have the bytes in a contiguous buffer.
+      // When aliasing is enabled, we can return a ByteBuffer pointing directly
+      // into the underlying byte array without copy if the CodedInputStream is
+      // constructed from a byte array. If aliasing is disabled or the input is
+      // from an InputStream or ByteString, we have to make a copy of the bytes.
+      ByteBuffer result = input == null && !bufferIsImmutable && enableAliasing
+          ? ByteBuffer.wrap(buffer, bufferPos, size).slice()
+          : ByteBuffer.wrap(Arrays.copyOfRange(
+              buffer, bufferPos, bufferPos + size));
+      bufferPos += size;
+      return result;
+    } else if (size == 0) {
+      return Internal.EMPTY_BYTE_BUFFER;
+    } else {
+      // Slow path: Build a byte array first then copy it.
+      return ByteBuffer.wrap(readRawBytesSlowPath(size));
+    }
+  }
 
   /** Read a {@code uint32} field value from the stream. */
-  public abstract int readUInt32() throws IOException;
+  public int readUInt32() throws IOException {
+    return readRawVarint32();
+  }
 
   /**
-   * Read an enum field value from the stream. Caller is responsible for converting the numeric
-   * value to an actual enum.
+   * Read an enum field value from the stream.  Caller is responsible
+   * for converting the numeric value to an actual enum.
    */
-  public abstract int readEnum() throws IOException;
+  public int readEnum() throws IOException {
+    return readRawVarint32();
+  }
 
   /** Read an {@code sfixed32} field value from the stream. */
-  public abstract int readSFixed32() throws IOException;
+  public int readSFixed32() throws IOException {
+    return readRawLittleEndian32();
+  }
 
   /** Read an {@code sfixed64} field value from the stream. */
-  public abstract long readSFixed64() throws IOException;
+  public long readSFixed64() throws IOException {
+    return readRawLittleEndian64();
+  }
 
   /** Read an {@code sint32} field value from the stream. */
-  public abstract int readSInt32() throws IOException;
+  public int readSInt32() throws IOException {
+    return decodeZigZag32(readRawVarint32());
+  }
 
   /** Read an {@code sint64} field value from the stream. */
-  public abstract long readSInt64() throws IOException;
+  public long readSInt64() throws IOException {
+    return decodeZigZag64(readRawVarint64());
+  }
 
   // =================================================================
 
-  /** Read a raw Varint from the stream. If larger than 32 bits, discard the upper bits. */
-  public abstract int readRawVarint32() throws IOException;
-
-  /** Read a raw Varint from the stream. */
-  public abstract long readRawVarint64() throws IOException;
-
-  /** Variant of readRawVarint64 for when uncomfortably close to the limit. */
-  /* Visible for testing */
-  abstract long readRawVarint64SlowPath() throws IOException;
-
-  /** Read a 32-bit little-endian integer from the stream. */
-  public abstract int readRawLittleEndian32() throws IOException;
-
-  /** Read a 64-bit little-endian integer from the stream. */
-  public abstract long readRawLittleEndian64() throws IOException;
-
-  // -----------------------------------------------------------------
-
   /**
-   * Enables {@link ByteString} aliasing of the underlying buffer, trading off on buffer pinning for
-   * data copies. Only valid for buffer-backed streams.
+   * Read a raw Varint from the stream.  If larger than 32 bits, discard the
+   * upper bits.
    */
-  public abstract void enableAliasing(boolean enabled);
+  public int readRawVarint32() throws IOException {
+    // See implementation notes for readRawVarint64
+ fastpath: {
+      int pos = bufferPos;
 
-  /**
-   * Set the maximum message recursion depth. In order to prevent malicious messages from causing
-   * stack overflows, {@code CodedInputStream} limits how deeply messages may be nested. The default
-   * limit is 64.
-   *
-   * @return the old limit.
-   */
-  public final int setRecursionLimit(final int limit) {
-    if (limit < 0) {
-      throw new IllegalArgumentException("Recursion limit cannot be negative: " + limit);
+      if (bufferSize == pos) {
+        break fastpath;
+      }
+
+      final byte[] buffer = this.buffer;
+      int x;
+      if ((x = buffer[pos++]) >= 0) {
+        bufferPos = pos;
+        return x;
+      } else if (bufferSize - pos < 9) {
+        break fastpath;
+      } else if ((x ^= (buffer[pos++] << 7)) < 0) {
+        x ^= (~0 << 7);
+      } else if ((x ^= (buffer[pos++] << 14)) >= 0) {
+        x ^= (~0 << 7) ^ (~0 << 14);
+      } else if ((x ^= (buffer[pos++] << 21)) < 0) {
+        x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21);
+      } else {
+        int y = buffer[pos++];
+        x ^= y << 28;
+        x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21) ^ (~0 << 28);
+        if (y < 0 &&
+            buffer[pos++] < 0 &&
+            buffer[pos++] < 0 &&
+            buffer[pos++] < 0 &&
+            buffer[pos++] < 0 &&
+            buffer[pos++] < 0) {
+          break fastpath;  // Will throw malformedVarint()
+        }
+      }
+      bufferPos = pos;
+      return x;
     }
-    final int oldLimit = recursionLimit;
-    recursionLimit = limit;
-    return oldLimit;
+    return (int) readRawVarint64SlowPath();
   }
 
-  /**
-   * Only valid for {@link InputStream}-backed streams.
-   *
-   * <p>Set the maximum message size. In order to prevent malicious messages from exhausting memory
-   * or causing integer overflows, {@code CodedInputStream} limits how large a message may be. The
-   * default limit is {@code Integer.MAX_INT}. You should set this limit as small as you can without
-   * harming your app's functionality. Note that size limits only apply when reading from an {@code
-   * InputStream}, not when constructed around a raw byte array.
-   *
-   * <p>If you want to read several messages from a single CodedInputStream, you could call {@link
-   * #resetSizeCounter()} after each one to avoid hitting the size limit.
-   *
-   * @return the old limit.
-   */
-  public final int setSizeLimit(final int limit) {
-    if (limit < 0) {
-      throw new IllegalArgumentException("Size limit cannot be negative: " + limit);
+  private void skipRawVarint() throws IOException {
+    if (bufferSize - bufferPos >= 10) {
+      final byte[] buffer = this.buffer;
+      int pos = bufferPos;
+      for (int i = 0; i < 10; i++) {
+        if (buffer[pos++] >= 0) {
+          bufferPos = pos;
+          return;
+        }
+      }
     }
-    final int oldLimit = sizeLimit;
-    sizeLimit = limit;
-    return oldLimit;
+    skipRawVarintSlowPath();
   }
 
-
-  private boolean explicitDiscardUnknownFields = false;
-
-  private static volatile boolean proto3DiscardUnknownFieldsDefault = false;
-
-  static void setProto3DiscardUnknownsByDefaultForTest() {
-    proto3DiscardUnknownFieldsDefault = true;
-  }
-
-  static void setProto3KeepUnknownsByDefaultForTest() {
-    proto3DiscardUnknownFieldsDefault = false;
-  }
-
-  static boolean getProto3DiscardUnknownFieldsDefault() {
-    return proto3DiscardUnknownFieldsDefault;
+  private void skipRawVarintSlowPath() throws IOException {
+    for (int i = 0; i < 10; i++) {
+      if (readRawByte() >= 0) {
+        return;
+      }
+    }
+    throw InvalidProtocolBufferException.malformedVarint();
   }
 
   /**
-   * Sets this {@code CodedInputStream} to discard unknown fields. Only applies to full runtime
-   * messages; lite messages will always preserve unknowns.
-   *
-   * <p>Note calling this function alone will have NO immediate effect on the underlying input data.
-   * The unknown fields will be discarded during parsing. This affects both Proto2 and Proto3 full
-   * runtime.
+   * Reads a varint from the input one byte at a time, so that it does not
+   * read any bytes after the end of the varint.  If you simply wrapped the
+   * stream in a CodedInputStream and used {@link #readRawVarint32(InputStream)}
+   * then you would probably end up reading past the end of the varint since
+   * CodedInputStream buffers its input.
    */
-  final void discardUnknownFields() {
-    explicitDiscardUnknownFields = true;
+  static int readRawVarint32(final InputStream input) throws IOException {
+    final int firstByte = input.read();
+    if (firstByte == -1) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return readRawVarint32(firstByte, input);
   }
 
   /**
-   * Reverts the unknown fields preservation behavior for Proto2 and Proto3 full runtime to their
-   * default.
+   * Like {@link #readRawVarint32(InputStream)}, but expects that the caller
+   * has already read one byte.  This allows the caller to determine if EOF
+   * has been reached before attempting to read.
    */
-  final void unsetDiscardUnknownFields() {
-    explicitDiscardUnknownFields = false;
-  }
-
-  /**
-   * Whether unknown fields in this input stream should be discarded during parsing into full
-   * runtime messages.
-   */
-  final boolean shouldDiscardUnknownFields() {
-    return explicitDiscardUnknownFields;
-  }
-
-  /**
-   * Whether unknown fields in this input stream should be discarded during parsing for proto3 full
-   * runtime messages.
-   *
-   * <p>This function was temporarily introduced before proto3 unknown fields behavior is changed.
-   * TODO(liujisi): remove this and related code in GeneratedMessage after proto3 unknown
-   * fields migration is done.
-   */
-  final boolean shouldDiscardUnknownFieldsProto3() {
-    return explicitDiscardUnknownFields ? true : proto3DiscardUnknownFieldsDefault;
-  }
-
-  /**
-   * Resets the current size counter to zero (see {@link #setSizeLimit(int)}). Only valid for {@link
-   * InputStream}-backed streams.
-   */
-  public abstract void resetSizeCounter();
-
-  /**
-   * Sets {@code currentLimit} to (current position) + {@code byteLimit}. This is called when
-   * descending into a length-delimited embedded message.
-   *
-   * <p>Note that {@code pushLimit()} does NOT affect how many bytes the {@code CodedInputStream}
-   * reads from an underlying {@code InputStream} when refreshing its buffer. If you need to prevent
-   * reading past a certain point in the underlying {@code InputStream} (e.g. because you expect it
-   * to contain more data after the end of the message which you need to handle differently) then
-   * you must place a wrapper around your {@code InputStream} which limits the amount of data that
-   * can be read from it.
-   *
-   * @return the old limit.
-   */
-  public abstract int pushLimit(int byteLimit) throws InvalidProtocolBufferException;
-
-  /**
-   * Discards the current limit, returning to the previous limit.
-   *
-   * @param oldLimit The old limit, as returned by {@code pushLimit}.
-   */
-  public abstract void popLimit(final int oldLimit);
-
-  /**
-   * Returns the number of bytes to be read before the current limit. If no limit is set, returns
-   * -1.
-   */
-  public abstract int getBytesUntilLimit();
-
-  /**
-   * Returns true if the stream has reached the end of the input. This is the case if either the end
-   * of the underlying input source has been reached or if the stream has reached a limit created
-   * using {@link #pushLimit(int)}.
-   */
-  public abstract boolean isAtEnd() throws IOException;
-
-  /**
-   * The total bytes read up to the current position. Calling {@link #resetSizeCounter()} resets
-   * this value to zero.
-   */
-  public abstract int getTotalBytesRead();
-
-  /**
-   * Read one byte from the input.
-   *
-   * @throws InvalidProtocolBufferException The end of the stream or the current limit was reached.
-   */
-  public abstract byte readRawByte() throws IOException;
-
-  /**
-   * Read a fixed size of bytes from the input.
-   *
-   * @throws InvalidProtocolBufferException The end of the stream or the current limit was reached.
-   */
-  public abstract byte[] readRawBytes(final int size) throws IOException;
-
-  /**
-   * Reads and discards {@code size} bytes.
-   *
-   * @throws InvalidProtocolBufferException The end of the stream or the current limit was reached.
-   */
-  public abstract void skipRawBytes(final int size) throws IOException;
-
-  /**
-   * Decode a ZigZag-encoded 32-bit value. ZigZag encodes signed integers into values that can be
-   * efficiently encoded with varint. (Otherwise, negative values must be sign-extended to 64 bits
-   * to be varint encoded, thus always taking 10 bytes on the wire.)
-   *
-   * @param n An unsigned 32-bit integer, stored in a signed int because Java has no explicit
-   *     unsigned support.
-   * @return A signed 32-bit integer.
-   */
-  public static int decodeZigZag32(final int n) {
-    return (n >>> 1) ^ -(n & 1);
-  }
-
-  /**
-   * Decode a ZigZag-encoded 64-bit value. ZigZag encodes signed integers into values that can be
-   * efficiently encoded with varint. (Otherwise, negative values must be sign-extended to 64 bits
-   * to be varint encoded, thus always taking 10 bytes on the wire.)
-   *
-   * @param n An unsigned 64-bit integer, stored in a signed int because Java has no explicit
-   *     unsigned support.
-   * @return A signed 64-bit integer.
-   */
-  public static long decodeZigZag64(final long n) {
-    return (n >>> 1) ^ -(n & 1);
-  }
-
-  /**
-   * Like {@link #readRawVarint32(InputStream)}, but expects that the caller has already read one
-   * byte. This allows the caller to determine if EOF has been reached before attempting to read.
-   */
-  public static int readRawVarint32(final int firstByte, final InputStream input)
-      throws IOException {
+  public static int readRawVarint32(
+      final int firstByte, final InputStream input) throws IOException {
     if ((firstByte & 0x80) == 0) {
       return firstByte;
     }
@@ -596,3311 +713,590 @@
     throw InvalidProtocolBufferException.malformedVarint();
   }
 
-  /**
-   * Reads a varint from the input one byte at a time, so that it does not read any bytes after the
-   * end of the varint. If you simply wrapped the stream in a CodedInputStream and used {@link
-   * #readRawVarint32(InputStream)} then you would probably end up reading past the end of the
-   * varint since CodedInputStream buffers its input.
-   */
-  static int readRawVarint32(final InputStream input) throws IOException {
-    final int firstByte = input.read();
-    if (firstByte == -1) {
-      throw InvalidProtocolBufferException.truncatedMessage();
+  /** Read a raw Varint from the stream. */
+  public long readRawVarint64() 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.
+ fastpath: {
+      int pos = bufferPos;
+
+      if (bufferSize == pos) {
+        break fastpath;
+      }
+
+      final byte[] buffer = this.buffer;
+      long x;
+      int y;
+      if ((y = buffer[pos++]) >= 0) {
+        bufferPos = pos;
+        return y;
+      } else if (bufferSize - pos < 9) {
+        break fastpath;
+      } else if ((y ^= (buffer[pos++] << 7)) < 0) {
+        x = y ^ (~0 << 7);
+      } else if ((y ^= (buffer[pos++] << 14)) >= 0) {
+        x = y ^ ((~0 << 7) ^ (~0 << 14));
+      } else if ((y ^= (buffer[pos++] << 21)) < 0) {
+        x = y ^ ((~0 << 7) ^ (~0 << 14) ^ (~0 << 21));
+      } else if ((x = ((long) y) ^ ((long) buffer[pos++] << 28)) >= 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28);
+      } else if ((x ^= ((long) buffer[pos++] << 35)) < 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35);
+      } else if ((x ^= ((long) buffer[pos++] << 42)) >= 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42);
+      } else if ((x ^= ((long) buffer[pos++] << 49)) < 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42)
+            ^ (~0L << 49);
+      } else {
+        x ^= ((long) buffer[pos++] << 56);
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42)
+            ^ (~0L << 49) ^ (~0L << 56);
+        if (x < 0L) {
+          if (buffer[pos++] < 0L) {
+            break fastpath;  // Will throw malformedVarint()
+          }
+        }
+      }
+      bufferPos = pos;
+      return x;
     }
-    return readRawVarint32(firstByte, input);
+    return readRawVarint64SlowPath();
   }
 
-  /** A {@link CodedInputStream} implementation that uses a backing array as the input. */
-  private static final class ArrayDecoder extends CodedInputStream {
-    private final byte[] buffer;
-    private final boolean immutable;
-    private int limit;
-    private int bufferSizeAfterLimit;
-    private int pos;
-    private int startPos;
-    private int lastTag;
-    private boolean enableAliasing;
-
-    /** The absolute position of the end of the current message. */
-    private int currentLimit = Integer.MAX_VALUE;
-
-    private ArrayDecoder(final byte[] buffer, final int offset, final int len, boolean immutable) {
-      this.buffer = buffer;
-      limit = offset + len;
-      pos = offset;
-      startPos = pos;
-      this.immutable = immutable;
-    }
-
-    @Override
-    public int readTag() throws IOException {
-      if (isAtEnd()) {
-        lastTag = 0;
-        return 0;
-      }
-
-      lastTag = readRawVarint32();
-      if (WireFormat.getTagFieldNumber(lastTag) == 0) {
-        // If we actually read zero (or any tag number corresponding to field
-        // number zero), that's not a valid tag.
-        throw InvalidProtocolBufferException.invalidTag();
-      }
-      return lastTag;
-    }
-
-    @Override
-    public void checkLastTagWas(final int value) throws InvalidProtocolBufferException {
-      if (lastTag != value) {
-        throw InvalidProtocolBufferException.invalidEndTag();
-      }
-    }
-
-    @Override
-    public int getLastTag() {
-      return lastTag;
-    }
-
-    @Override
-    public boolean skipField(final int tag) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          skipRawVarint();
-          return true;
-        case WireFormat.WIRETYPE_FIXED64:
-          skipRawBytes(FIXED64_SIZE);
-          return true;
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          skipRawBytes(readRawVarint32());
-          return true;
-        case WireFormat.WIRETYPE_START_GROUP:
-          skipMessage();
-          checkLastTagWas(
-              WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP));
-          return true;
-        case WireFormat.WIRETYPE_END_GROUP:
-          return false;
-        case WireFormat.WIRETYPE_FIXED32:
-          skipRawBytes(FIXED32_SIZE);
-          return true;
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public boolean skipField(final int tag, final CodedOutputStream output) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          {
-            long value = readInt64();
-            output.writeRawVarint32(tag);
-            output.writeUInt64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_FIXED64:
-          {
-            long value = readRawLittleEndian64();
-            output.writeRawVarint32(tag);
-            output.writeFixed64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          {
-            ByteString value = readBytes();
-            output.writeRawVarint32(tag);
-            output.writeBytesNoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_START_GROUP:
-          {
-            output.writeRawVarint32(tag);
-            skipMessage(output);
-            int endtag =
-                WireFormat.makeTag(
-                    WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP);
-            checkLastTagWas(endtag);
-            output.writeRawVarint32(endtag);
-            return true;
-          }
-        case WireFormat.WIRETYPE_END_GROUP:
-          {
-            return false;
-          }
-        case WireFormat.WIRETYPE_FIXED32:
-          {
-            int value = readRawLittleEndian32();
-            output.writeRawVarint32(tag);
-            output.writeFixed32NoTag(value);
-            return true;
-          }
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public void skipMessage() throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag)) {
-          return;
-        }
-      }
-    }
-
-    @Override
-    public void skipMessage(CodedOutputStream output) throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag, output)) {
-          return;
-        }
-      }
-    }
-
-
-    // -----------------------------------------------------------------
-
-    @Override
-    public double readDouble() throws IOException {
-      return Double.longBitsToDouble(readRawLittleEndian64());
-    }
-
-    @Override
-    public float readFloat() throws IOException {
-      return Float.intBitsToFloat(readRawLittleEndian32());
-    }
-
-    @Override
-    public long readUInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public long readInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public int readInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public long readFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public boolean readBool() throws IOException {
-      return readRawVarint64() != 0;
-    }
-
-    @Override
-    public String readString() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= (limit - pos)) {
-        // Fast path:  We already have the bytes in a contiguous buffer, so
-        //   just copy directly from it.
-        final String result = new String(buffer, pos, size, UTF_8);
-        pos += size;
+  /** Variant of readRawVarint64 for when uncomfortably close to the limit. */
+  /* Visible for testing */
+  long readRawVarint64SlowPath() throws IOException {
+    long result = 0;
+    for (int shift = 0; shift < 64; shift += 7) {
+      final byte b = readRawByte();
+      result |= (long) (b & 0x7F) << shift;
+      if ((b & 0x80) == 0) {
         return result;
       }
+    }
+    throw InvalidProtocolBufferException.malformedVarint();
+  }
 
-      if (size == 0) {
-        return "";
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
+  /** Read a 32-bit little-endian integer from the stream. */
+  public int readRawLittleEndian32() throws IOException {
+    int pos = bufferPos;
+
+    // hand-inlined ensureAvailable(4);
+    if (bufferSize - pos < 4) {
+      refillBuffer(4);
+      pos = bufferPos;
+    }
+
+    final byte[] buffer = this.buffer;
+    bufferPos = pos + 4;
+    return (((buffer[pos]     & 0xff))       |
+            ((buffer[pos + 1] & 0xff) <<  8) |
+            ((buffer[pos + 2] & 0xff) << 16) |
+            ((buffer[pos + 3] & 0xff) << 24));
+  }
+
+  /** Read a 64-bit little-endian integer from the stream. */
+  public long readRawLittleEndian64() throws IOException {
+    int pos = bufferPos;
+
+    // hand-inlined ensureAvailable(8);
+    if (bufferSize - pos < 8) {
+      refillBuffer(8);
+      pos = bufferPos;
+    }
+
+    final byte[] buffer = this.buffer;
+    bufferPos = pos + 8;
+    return ((((long) buffer[pos]     & 0xffL))       |
+            (((long) buffer[pos + 1] & 0xffL) <<  8) |
+            (((long) buffer[pos + 2] & 0xffL) << 16) |
+            (((long) buffer[pos + 3] & 0xffL) << 24) |
+            (((long) buffer[pos + 4] & 0xffL) << 32) |
+            (((long) buffer[pos + 5] & 0xffL) << 40) |
+            (((long) buffer[pos + 6] & 0xffL) << 48) |
+            (((long) buffer[pos + 7] & 0xffL) << 56));
+  }
+
+  /**
+   * Decode a ZigZag-encoded 32-bit value.  ZigZag encodes signed integers
+   * into values that can be efficiently encoded with varint.  (Otherwise,
+   * negative values must be sign-extended to 64 bits to be varint encoded,
+   * thus always taking 10 bytes on the wire.)
+   *
+   * @param n An unsigned 32-bit integer, stored in a signed int because
+   *          Java has no explicit unsigned support.
+   * @return A signed 32-bit integer.
+   */
+  public static int decodeZigZag32(final int n) {
+    return (n >>> 1) ^ -(n & 1);
+  }
+
+  /**
+   * Decode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers
+   * into values that can be efficiently encoded with varint.  (Otherwise,
+   * negative values must be sign-extended to 64 bits to be varint encoded,
+   * thus always taking 10 bytes on the wire.)
+   *
+   * @param n An unsigned 64-bit integer, stored in a signed int because
+   *          Java has no explicit unsigned support.
+   * @return A signed 64-bit integer.
+   */
+  public static long decodeZigZag64(final long n) {
+    return (n >>> 1) ^ -(n & 1);
+  }
+
+  // -----------------------------------------------------------------
+
+  private final byte[] buffer;
+  private final boolean bufferIsImmutable;
+  private int bufferSize;
+  private int bufferSizeAfterLimit;
+  private int bufferPos;
+  private final InputStream input;
+  private int lastTag;
+  private boolean enableAliasing = false;
+
+  /**
+   * The total number of bytes read before the current buffer.  The total
+   * bytes read up to the current position can be computed as
+   * {@code totalBytesRetired + bufferPos}.  This value may be negative if
+   * reading started in the middle of the current buffer (e.g. if the
+   * constructor that takes a byte array and an offset was used).
+   */
+  private int totalBytesRetired;
+
+  /** The absolute position of the end of the current message. */
+  private int currentLimit = Integer.MAX_VALUE;
+
+  /** See setRecursionLimit() */
+  private int recursionDepth;
+  private int recursionLimit = DEFAULT_RECURSION_LIMIT;
+
+  /** See setSizeLimit() */
+  private int sizeLimit = DEFAULT_SIZE_LIMIT;
+
+  private static final int DEFAULT_RECURSION_LIMIT = 100;
+  private static final int DEFAULT_SIZE_LIMIT = 64 << 20;  // 64MB
+  private static final int BUFFER_SIZE = 4096;
+
+  private CodedInputStream(
+      final byte[] buffer, final int off, final int len, boolean bufferIsImmutable) {
+    this.buffer = buffer;
+    bufferSize = off + len;
+    bufferPos = off;
+    totalBytesRetired = -off;
+    input = null;
+    this.bufferIsImmutable = bufferIsImmutable;
+  }
+
+  private CodedInputStream(final InputStream input, int bufferSize) {
+    buffer = new byte[bufferSize];
+    bufferSize = 0;
+    bufferPos = 0;
+    totalBytesRetired = 0;
+    this.input = input;
+    bufferIsImmutable = false;
+  }
+
+  public void enableAliasing(boolean enabled) {
+    this.enableAliasing = enabled;
+  }
+
+  /**
+   * Set the maximum message recursion depth.  In order to prevent malicious
+   * messages from causing stack overflows, {@code CodedInputStream} limits
+   * how deeply messages may be nested.  The default limit is 64.
+   *
+   * @return the old limit.
+   */
+  public int setRecursionLimit(final int limit) {
+    if (limit < 0) {
+      throw new IllegalArgumentException(
+        "Recursion limit cannot be negative: " + limit);
+    }
+    final int oldLimit = recursionLimit;
+    recursionLimit = limit;
+    return oldLimit;
+  }
+
+  /**
+   * Set the maximum message size.  In order to prevent malicious
+   * messages from exhausting memory or causing integer overflows,
+   * {@code CodedInputStream} limits how large a message may be.
+   * The default limit is 64MB.  You should set this limit as small
+   * as you can without harming your app's functionality.  Note that
+   * size limits only apply when reading from an {@code InputStream}, not
+   * when constructed around a raw byte array (nor with
+   * {@link ByteString#newCodedInput}).
+   * <p>
+   * If you want to read several messages from a single CodedInputStream, you
+   * could call {@link #resetSizeCounter()} after each one to avoid hitting the
+   * size limit.
+   *
+   * @return the old limit.
+   */
+  public int setSizeLimit(final int limit) {
+    if (limit < 0) {
+      throw new IllegalArgumentException(
+        "Size limit cannot be negative: " + limit);
+    }
+    final int oldLimit = sizeLimit;
+    sizeLimit = limit;
+    return oldLimit;
+  }
+
+  /**
+   * Resets the current size counter to zero (see {@link #setSizeLimit(int)}).
+   */
+  public void resetSizeCounter() {
+    totalBytesRetired = -bufferPos;
+  }
+
+  /**
+   * Sets {@code currentLimit} to (current position) + {@code byteLimit}.  This
+   * is called when descending into a length-delimited embedded message.
+   *
+   * <p>Note that {@code pushLimit()} does NOT affect how many bytes the
+   * {@code CodedInputStream} reads from an underlying {@code InputStream} when
+   * refreshing its buffer.  If you need to prevent reading past a certain
+   * point in the underlying {@code InputStream} (e.g. because you expect it to
+   * contain more data after the end of the message which you need to handle
+   * differently) then you must place a wrapper around your {@code InputStream}
+   * which limits the amount of data that can be read from it.
+   *
+   * @return the old limit.
+   */
+  public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {
+    if (byteLimit < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    }
+    byteLimit += totalBytesRetired + bufferPos;
+    final int oldLimit = currentLimit;
+    if (byteLimit > oldLimit) {
       throw InvalidProtocolBufferException.truncatedMessage();
     }
+    currentLimit = byteLimit;
 
-    @Override
-    public String readStringRequireUtf8() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= (limit - pos)) {
-        // TODO(martinrb): We could save a pass by validating while decoding.
-        if (!Utf8.isValidUtf8(buffer, pos, pos + size)) {
-          throw InvalidProtocolBufferException.invalidUtf8();
-        }
-        final int tempPos = pos;
-        pos += size;
-        return new String(buffer, tempPos, size, UTF_8);
-      }
+    recomputeBufferSizeAfterLimit();
 
-      if (size == 0) {
-        return "";
-      }
-      if (size <= 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
+    return oldLimit;
+  }
+
+  private void recomputeBufferSizeAfterLimit() {
+    bufferSize += bufferSizeAfterLimit;
+    final int bufferEnd = totalBytesRetired + bufferSize;
+    if (bufferEnd > currentLimit) {
+      // Limit is in current buffer.
+      bufferSizeAfterLimit = bufferEnd - currentLimit;
+      bufferSize -= bufferSizeAfterLimit;
+    } else {
+      bufferSizeAfterLimit = 0;
+    }
+  }
+
+  /**
+   * Discards the current limit, returning to the previous limit.
+   *
+   * @param oldLimit The old limit, as returned by {@code pushLimit}.
+   */
+  public void popLimit(final int oldLimit) {
+    currentLimit = oldLimit;
+    recomputeBufferSizeAfterLimit();
+  }
+
+  /**
+   * Returns the number of bytes to be read before the current limit.
+   * If no limit is set, returns -1.
+   */
+  public int getBytesUntilLimit() {
+    if (currentLimit == Integer.MAX_VALUE) {
+      return -1;
     }
 
-    @Override
-    public void readGroup(
-        final int fieldNumber,
-        final MessageLite.Builder builder,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-    }
+    final int currentAbsolutePosition = totalBytesRetired + bufferPos;
+    return currentLimit - currentAbsolutePosition;
+  }
 
+  /**
+   * Returns true if the stream has reached the end of the input.  This is the
+   * case if either the end of the underlying input source has been reached or
+   * if the stream has reached a limit created using {@link #pushLimit(int)}.
+   */
+  public boolean isAtEnd() throws IOException {
+    return bufferPos == bufferSize && !tryRefillBuffer(1);
+  }
 
-    @Override
-    public <T extends MessageLite> T readGroup(
-        final int fieldNumber,
-        final Parser<T> parser,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-      return result;
-    }
+  /**
+   * The total bytes read up to the current position. Calling
+   * {@link #resetSizeCounter()} resets this value to zero.
+   */
+  public int getTotalBytesRead() {
+      return totalBytesRetired + bufferPos;
+  }
 
-    @Deprecated
-    @Override
-    public void readUnknownGroup(final int fieldNumber, final MessageLite.Builder builder)
-        throws IOException {
-      readGroup(fieldNumber, builder, ExtensionRegistryLite.getEmptyRegistry());
-    }
+  private interface RefillCallback {
+    void onRefill();
+  }
 
-    @Override
-    public void readMessage(
-        final MessageLite.Builder builder, final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      final int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-    }
+  private RefillCallback refillCallback = null;
 
-
-    @Override
-    public <T extends MessageLite> T readMessage(
-        final Parser<T> parser, final ExtensionRegistryLite extensionRegistry) throws IOException {
-      int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-      return result;
-    }
-
-    @Override
-    public ByteString readBytes() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= (limit - pos)) {
-        // Fast path:  We already have the bytes in a contiguous buffer, so
-        //   just copy directly from it.
-        final ByteString result =
-            immutable && enableAliasing
-                ? ByteString.wrap(buffer, pos, size)
-                : ByteString.copyFrom(buffer, pos, size);
-        pos += size;
-        return result;
-      }
-      if (size == 0) {
-        return ByteString.EMPTY;
-      }
-      // Slow path:  Build a byte array first then copy it.
-      return ByteString.wrap(readRawBytes(size));
-    }
-
-    @Override
-    public byte[] readByteArray() throws IOException {
-      final int size = readRawVarint32();
-      return readRawBytes(size);
-    }
-
-    @Override
-    public ByteBuffer readByteBuffer() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= (limit - pos)) {
-        // Fast path: We already have the bytes in a contiguous buffer.
-        // When aliasing is enabled, we can return a ByteBuffer pointing directly
-        // into the underlying byte array without copy if the CodedInputStream is
-        // constructed from a byte array. If aliasing is disabled or the input is
-        // from an InputStream or ByteString, we have to make a copy of the bytes.
-        ByteBuffer result =
-            !immutable && enableAliasing
-                ? ByteBuffer.wrap(buffer, pos, size).slice()
-                : ByteBuffer.wrap(Arrays.copyOfRange(buffer, pos, pos + size));
-        pos += size;
-        // TODO(nathanmittler): Investigate making the ByteBuffer be made read-only
-        return result;
-      }
-
-      if (size == 0) {
-        return EMPTY_BYTE_BUFFER;
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public int readUInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readEnum() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readSFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public long readSFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readSInt32() throws IOException {
-      return decodeZigZag32(readRawVarint32());
-    }
-
-    @Override
-    public long readSInt64() throws IOException {
-      return decodeZigZag64(readRawVarint64());
-    }
-
-    // =================================================================
-
-    @Override
-    public int readRawVarint32() throws IOException {
-      // See implementation notes for readRawVarint64
-      fastpath:
-      {
-        int tempPos = pos;
-
-        if (limit == tempPos) {
-          break fastpath;
-        }
-
-        final byte[] buffer = this.buffer;
-        int x;
-        if ((x = buffer[tempPos++]) >= 0) {
-          pos = tempPos;
-          return x;
-        } else if (limit - tempPos < 9) {
-          break fastpath;
-        } else if ((x ^= (buffer[tempPos++] << 7)) < 0) {
-          x ^= (~0 << 7);
-        } else if ((x ^= (buffer[tempPos++] << 14)) >= 0) {
-          x ^= (~0 << 7) ^ (~0 << 14);
-        } else if ((x ^= (buffer[tempPos++] << 21)) < 0) {
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21);
-        } else {
-          int y = buffer[tempPos++];
-          x ^= y << 28;
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21) ^ (~0 << 28);
-          if (y < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0) {
-            break fastpath; // Will throw malformedVarint()
-          }
-        }
-        pos = tempPos;
-        return x;
-      }
-      return (int) readRawVarint64SlowPath();
-    }
-
-    private void skipRawVarint() throws IOException {
-      if (limit - pos >= MAX_VARINT_SIZE) {
-        skipRawVarintFastPath();
-      } else {
-        skipRawVarintSlowPath();
-      }
-    }
-
-    private void skipRawVarintFastPath() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (buffer[pos++] >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    private void skipRawVarintSlowPath() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (readRawByte() >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public long readRawVarint64() 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.
-      fastpath:
-      {
-        int tempPos = pos;
-
-        if (limit == tempPos) {
-          break fastpath;
-        }
-
-        final byte[] buffer = this.buffer;
-        long x;
-        int y;
-        if ((y = buffer[tempPos++]) >= 0) {
-          pos = tempPos;
-          return y;
-        } else if (limit - tempPos < 9) {
-          break fastpath;
-        } else if ((y ^= (buffer[tempPos++] << 7)) < 0) {
-          x = y ^ (~0 << 7);
-        } else if ((y ^= (buffer[tempPos++] << 14)) >= 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14));
-        } else if ((y ^= (buffer[tempPos++] << 21)) < 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14) ^ (~0 << 21));
-        } else if ((x = y ^ ((long) buffer[tempPos++] << 28)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28);
-        } else if ((x ^= ((long) buffer[tempPos++] << 35)) < 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35);
-        } else if ((x ^= ((long) buffer[tempPos++] << 42)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42);
-        } else if ((x ^= ((long) buffer[tempPos++] << 49)) < 0L) {
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49);
-        } else {
-          x ^= ((long) buffer[tempPos++] << 56);
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49)
-                  ^ (~0L << 56);
-          if (x < 0L) {
-            if (buffer[tempPos++] < 0L) {
-              break fastpath; // Will throw malformedVarint()
-            }
-          }
-        }
-        pos = tempPos;
-        return x;
-      }
-      return readRawVarint64SlowPath();
-    }
-
-    @Override
-    long readRawVarint64SlowPath() throws IOException {
-      long result = 0;
-      for (int shift = 0; shift < 64; shift += 7) {
-        final byte b = readRawByte();
-        result |= (long) (b & 0x7F) << shift;
-        if ((b & 0x80) == 0) {
-          return result;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public int readRawLittleEndian32() throws IOException {
-      int tempPos = pos;
-
-      if (limit - tempPos < FIXED32_SIZE) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-
-      final byte[] buffer = this.buffer;
-      pos = tempPos + FIXED32_SIZE;
-      return (((buffer[tempPos] & 0xff))
-          | ((buffer[tempPos + 1] & 0xff) << 8)
-          | ((buffer[tempPos + 2] & 0xff) << 16)
-          | ((buffer[tempPos + 3] & 0xff) << 24));
-    }
-
-    @Override
-    public long readRawLittleEndian64() throws IOException {
-      int tempPos = pos;
-
-      if (limit - tempPos < FIXED64_SIZE) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-
-      final byte[] buffer = this.buffer;
-      pos = tempPos + FIXED64_SIZE;
-      return (((buffer[tempPos] & 0xffL))
-          | ((buffer[tempPos + 1] & 0xffL) << 8)
-          | ((buffer[tempPos + 2] & 0xffL) << 16)
-          | ((buffer[tempPos + 3] & 0xffL) << 24)
-          | ((buffer[tempPos + 4] & 0xffL) << 32)
-          | ((buffer[tempPos + 5] & 0xffL) << 40)
-          | ((buffer[tempPos + 6] & 0xffL) << 48)
-          | ((buffer[tempPos + 7] & 0xffL) << 56));
-    }
-
-    @Override
-    public void enableAliasing(boolean enabled) {
-      this.enableAliasing = enabled;
-    }
-
-    @Override
-    public void resetSizeCounter() {
-      startPos = pos;
-    }
-
-    @Override
-    public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {
-      if (byteLimit < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      byteLimit += getTotalBytesRead();
-      final int oldLimit = currentLimit;
-      if (byteLimit > oldLimit) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      currentLimit = byteLimit;
-
-      recomputeBufferSizeAfterLimit();
-
-      return oldLimit;
-    }
-
-    private void recomputeBufferSizeAfterLimit() {
-      limit += bufferSizeAfterLimit;
-      final int bufferEnd = limit - startPos;
-      if (bufferEnd > currentLimit) {
-        // Limit is in current buffer.
-        bufferSizeAfterLimit = bufferEnd - currentLimit;
-        limit -= bufferSizeAfterLimit;
-      } else {
-        bufferSizeAfterLimit = 0;
-      }
-    }
-
-    @Override
-    public void popLimit(final int oldLimit) {
-      currentLimit = oldLimit;
-      recomputeBufferSizeAfterLimit();
-    }
-
-    @Override
-    public int getBytesUntilLimit() {
-      if (currentLimit == Integer.MAX_VALUE) {
-        return -1;
-      }
-
-      return currentLimit - getTotalBytesRead();
-    }
-
-    @Override
-    public boolean isAtEnd() throws IOException {
-      return pos == limit;
-    }
-
-    @Override
-    public int getTotalBytesRead() {
-      return pos - startPos;
-    }
-
-    @Override
-    public byte readRawByte() throws IOException {
-      if (pos == limit) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      return buffer[pos++];
-    }
-
-    @Override
-    public byte[] readRawBytes(final int length) throws IOException {
-      if (length > 0 && length <= (limit - pos)) {
-        final int tempPos = pos;
-        pos += length;
-        return Arrays.copyOfRange(buffer, tempPos, pos);
-      }
-
-      if (length <= 0) {
-        if (length == 0) {
-          return Internal.EMPTY_BYTE_ARRAY;
-        } else {
-          throw InvalidProtocolBufferException.negativeSize();
-        }
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public void skipRawBytes(final int length) throws IOException {
-      if (length >= 0 && length <= (limit - pos)) {
-        // We have all the bytes we need already.
-        pos += length;
-        return;
-      }
-
-      if (length < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
+  /**
+   * Reads more bytes from the input, making at least {@code n} bytes available
+   * in the buffer.  Caller must ensure that the requested space is not yet
+   * available, and that the requested space is less than BUFFER_SIZE.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  private void refillBuffer(int n) throws IOException {
+    if (!tryRefillBuffer(n)) {
       throw InvalidProtocolBufferException.truncatedMessage();
     }
   }
 
   /**
-   * A {@link CodedInputStream} implementation that uses a backing direct ByteBuffer as the input.
-   * Requires the use of {@code sun.misc.Unsafe} to perform fast reads on the buffer.
+   * Tries to read more bytes from the input, making at least {@code n} bytes
+   * available in the buffer.  Caller must ensure that the requested space is
+   * not yet available, and that the requested space is less than BUFFER_SIZE.
+   *
+   * @return {@code true} if the bytes could be made available; {@code false}
+   *         if the end of the stream or the current limit was reached.
    */
-  private static final class UnsafeDirectNioDecoder extends CodedInputStream {
-    /** The direct buffer that is backing this stream. */
-    private final ByteBuffer buffer;
-
-    /**
-     * If {@code true}, indicates that the buffer is backing a {@link ByteString} and is therefore
-     * considered to be an immutable input source.
-     */
-    private final boolean immutable;
-
-    /** The unsafe address of the content of {@link #buffer}. */
-    private final long address;
-
-    /** The unsafe address of the current read limit of the buffer. */
-    private long limit;
-
-    /** The unsafe address of the current read position of the buffer. */
-    private long pos;
-
-    /** The unsafe address of the starting read position. */
-    private long startPos;
-
-    /** The amount of available data in the buffer beyond {@link #limit}. */
-    private int bufferSizeAfterLimit;
-
-    /** The last tag that was read from this stream. */
-    private int lastTag;
-
-    /**
-     * If {@code true}, indicates that calls to read {@link ByteString} or {@code byte[]}
-     * <strong>may</strong> return slices of the underlying buffer, rather than copies.
-     */
-    private boolean enableAliasing;
-
-    /** The absolute position of the end of the current message. */
-    private int currentLimit = Integer.MAX_VALUE;
-
-    static boolean isSupported() {
-      return UnsafeUtil.hasUnsafeByteBufferOperations();
+  private boolean tryRefillBuffer(int n) throws IOException {
+    if (bufferPos + n <= bufferSize) {
+      throw new IllegalStateException(
+          "refillBuffer() called when " + n +
+          " bytes were already available in buffer");
     }
 
-    private UnsafeDirectNioDecoder(ByteBuffer buffer, boolean immutable) {
-      this.buffer = buffer;
-      address = UnsafeUtil.addressOffset(buffer);
-      limit = address + buffer.limit();
-      pos = address + buffer.position();
-      startPos = pos;
-      this.immutable = immutable;
-    }
-
-    @Override
-    public int readTag() throws IOException {
-      if (isAtEnd()) {
-        lastTag = 0;
-        return 0;
-      }
-
-      lastTag = readRawVarint32();
-      if (WireFormat.getTagFieldNumber(lastTag) == 0) {
-        // If we actually read zero (or any tag number corresponding to field
-        // number zero), that's not a valid tag.
-        throw InvalidProtocolBufferException.invalidTag();
-      }
-      return lastTag;
-    }
-
-    @Override
-    public void checkLastTagWas(final int value) throws InvalidProtocolBufferException {
-      if (lastTag != value) {
-        throw InvalidProtocolBufferException.invalidEndTag();
-      }
-    }
-
-    @Override
-    public int getLastTag() {
-      return lastTag;
-    }
-
-    @Override
-    public boolean skipField(final int tag) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          skipRawVarint();
-          return true;
-        case WireFormat.WIRETYPE_FIXED64:
-          skipRawBytes(FIXED64_SIZE);
-          return true;
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          skipRawBytes(readRawVarint32());
-          return true;
-        case WireFormat.WIRETYPE_START_GROUP:
-          skipMessage();
-          checkLastTagWas(
-              WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP));
-          return true;
-        case WireFormat.WIRETYPE_END_GROUP:
-          return false;
-        case WireFormat.WIRETYPE_FIXED32:
-          skipRawBytes(FIXED32_SIZE);
-          return true;
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public boolean skipField(final int tag, final CodedOutputStream output) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          {
-            long value = readInt64();
-            output.writeRawVarint32(tag);
-            output.writeUInt64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_FIXED64:
-          {
-            long value = readRawLittleEndian64();
-            output.writeRawVarint32(tag);
-            output.writeFixed64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          {
-            ByteString value = readBytes();
-            output.writeRawVarint32(tag);
-            output.writeBytesNoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_START_GROUP:
-          {
-            output.writeRawVarint32(tag);
-            skipMessage(output);
-            int endtag =
-                WireFormat.makeTag(
-                    WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP);
-            checkLastTagWas(endtag);
-            output.writeRawVarint32(endtag);
-            return true;
-          }
-        case WireFormat.WIRETYPE_END_GROUP:
-          {
-            return false;
-          }
-        case WireFormat.WIRETYPE_FIXED32:
-          {
-            int value = readRawLittleEndian32();
-            output.writeRawVarint32(tag);
-            output.writeFixed32NoTag(value);
-            return true;
-          }
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public void skipMessage() throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag)) {
-          return;
-        }
-      }
-    }
-
-    @Override
-    public void skipMessage(CodedOutputStream output) throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag, output)) {
-          return;
-        }
-      }
-    }
-
-
-    // -----------------------------------------------------------------
-
-    @Override
-    public double readDouble() throws IOException {
-      return Double.longBitsToDouble(readRawLittleEndian64());
-    }
-
-    @Override
-    public float readFloat() throws IOException {
-      return Float.intBitsToFloat(readRawLittleEndian32());
-    }
-
-    @Override
-    public long readUInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public long readInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public int readInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public long readFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public boolean readBool() throws IOException {
-      return readRawVarint64() != 0;
-    }
-
-    @Override
-    public String readString() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= remaining()) {
-        // TODO(nathanmittler): Is there a way to avoid this copy?
-        // The same as readBytes' logic
-        byte[] bytes = new byte[size];
-        UnsafeUtil.copyMemory(pos, bytes, 0, size);
-        String result = new String(bytes, UTF_8);
-        pos += size;
-        return result;
-      }
-
-      if (size == 0) {
-        return "";
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public String readStringRequireUtf8() throws IOException {
-      final int size = readRawVarint32();
-      if (size >= 0 && size <= remaining()) {
-        // TODO(nathanmittler): Is there a way to avoid this copy?
-        // The same as readBytes' logic
-        byte[] bytes = new byte[size];
-        UnsafeUtil.copyMemory(pos, bytes, 0, size);
-        // TODO(martinrb): We could save a pass by validating while decoding.
-        if (!Utf8.isValidUtf8(bytes)) {
-          throw InvalidProtocolBufferException.invalidUtf8();
-        }
-
-        String result = new String(bytes, UTF_8);
-        pos += size;
-        return result;
-      }
-
-      if (size == 0) {
-        return "";
-      }
-      if (size <= 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public void readGroup(
-        final int fieldNumber,
-        final MessageLite.Builder builder,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-    }
-
-
-    @Override
-    public <T extends MessageLite> T readGroup(
-        final int fieldNumber,
-        final Parser<T> parser,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-      return result;
-    }
-
-    @Deprecated
-    @Override
-    public void readUnknownGroup(final int fieldNumber, final MessageLite.Builder builder)
-        throws IOException {
-      readGroup(fieldNumber, builder, ExtensionRegistryLite.getEmptyRegistry());
-    }
-
-    @Override
-    public void readMessage(
-        final MessageLite.Builder builder, final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      final int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-    }
-
-
-    @Override
-    public <T extends MessageLite> T readMessage(
-        final Parser<T> parser, final ExtensionRegistryLite extensionRegistry) throws IOException {
-      int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-      return result;
-    }
-
-    @Override
-    public ByteString readBytes() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= remaining()) {
-        if (immutable && enableAliasing) {
-          final ByteBuffer result = slice(pos, pos + size);
-          pos += size;
-          return ByteString.wrap(result);
-        } else {
-          // Use UnsafeUtil to copy the memory to bytes instead of using ByteBuffer ways.
-          byte[] bytes = new byte[size];
-          UnsafeUtil.copyMemory(pos, bytes, 0, size);
-          pos += size;
-          return ByteString.wrap(bytes);
-        }
-      }
-
-      if (size == 0) {
-        return ByteString.EMPTY;
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public byte[] readByteArray() throws IOException {
-      return readRawBytes(readRawVarint32());
-    }
-
-    @Override
-    public ByteBuffer readByteBuffer() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= remaining()) {
-        // "Immutable" implies that buffer is backing a ByteString.
-        // Disallow slicing in this case to prevent the caller from modifying the contents
-        // of the ByteString.
-        if (!immutable && enableAliasing) {
-          final ByteBuffer result = slice(pos, pos + size);
-          pos += size;
-          return result;
-        } else {
-          // The same as readBytes' logic
-          byte[] bytes = new byte[size];
-          UnsafeUtil.copyMemory(pos, bytes, 0, size);
-          pos += size;
-          return ByteBuffer.wrap(bytes);
-        }
-        // TODO(nathanmittler): Investigate making the ByteBuffer be made read-only
-      }
-
-      if (size == 0) {
-        return EMPTY_BYTE_BUFFER;
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public int readUInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readEnum() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readSFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public long readSFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readSInt32() throws IOException {
-      return decodeZigZag32(readRawVarint32());
-    }
-
-    @Override
-    public long readSInt64() throws IOException {
-      return decodeZigZag64(readRawVarint64());
-    }
-
-    // =================================================================
-
-    @Override
-    public int readRawVarint32() throws IOException {
-      // See implementation notes for readRawVarint64
-      fastpath:
-      {
-        long tempPos = pos;
-
-        if (limit == tempPos) {
-          break fastpath;
-        }
-
-        int x;
-        if ((x = UnsafeUtil.getByte(tempPos++)) >= 0) {
-          pos = tempPos;
-          return x;
-        } else if (limit - tempPos < 9) {
-          break fastpath;
-        } else if ((x ^= (UnsafeUtil.getByte(tempPos++) << 7)) < 0) {
-          x ^= (~0 << 7);
-        } else if ((x ^= (UnsafeUtil.getByte(tempPos++) << 14)) >= 0) {
-          x ^= (~0 << 7) ^ (~0 << 14);
-        } else if ((x ^= (UnsafeUtil.getByte(tempPos++) << 21)) < 0) {
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21);
-        } else {
-          int y = UnsafeUtil.getByte(tempPos++);
-          x ^= y << 28;
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21) ^ (~0 << 28);
-          if (y < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0) {
-            break fastpath; // Will throw malformedVarint()
-          }
-        }
-        pos = tempPos;
-        return x;
-      }
-      return (int) readRawVarint64SlowPath();
-    }
-
-    private void skipRawVarint() throws IOException {
-      if (remaining() >= MAX_VARINT_SIZE) {
-        skipRawVarintFastPath();
-      } else {
-        skipRawVarintSlowPath();
-      }
-    }
-
-    private void skipRawVarintFastPath() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (UnsafeUtil.getByte(pos++) >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    private void skipRawVarintSlowPath() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (readRawByte() >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public long readRawVarint64() 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.
-      fastpath:
-      {
-        long tempPos = pos;
-
-        if (limit == tempPos) {
-          break fastpath;
-        }
-
-        long x;
-        int y;
-        if ((y = UnsafeUtil.getByte(tempPos++)) >= 0) {
-          pos = tempPos;
-          return y;
-        } else if (limit - tempPos < 9) {
-          break fastpath;
-        } else if ((y ^= (UnsafeUtil.getByte(tempPos++) << 7)) < 0) {
-          x = y ^ (~0 << 7);
-        } else if ((y ^= (UnsafeUtil.getByte(tempPos++) << 14)) >= 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14));
-        } else if ((y ^= (UnsafeUtil.getByte(tempPos++) << 21)) < 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14) ^ (~0 << 21));
-        } else if ((x = y ^ ((long) UnsafeUtil.getByte(tempPos++) << 28)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28);
-        } else if ((x ^= ((long) UnsafeUtil.getByte(tempPos++) << 35)) < 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35);
-        } else if ((x ^= ((long) UnsafeUtil.getByte(tempPos++) << 42)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42);
-        } else if ((x ^= ((long) UnsafeUtil.getByte(tempPos++) << 49)) < 0L) {
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49);
-        } else {
-          x ^= ((long) UnsafeUtil.getByte(tempPos++) << 56);
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49)
-                  ^ (~0L << 56);
-          if (x < 0L) {
-            if (UnsafeUtil.getByte(tempPos++) < 0L) {
-              break fastpath; // Will throw malformedVarint()
-            }
-          }
-        }
-        pos = tempPos;
-        return x;
-      }
-      return readRawVarint64SlowPath();
-    }
-
-    @Override
-    long readRawVarint64SlowPath() throws IOException {
-      long result = 0;
-      for (int shift = 0; shift < 64; shift += 7) {
-        final byte b = readRawByte();
-        result |= (long) (b & 0x7F) << shift;
-        if ((b & 0x80) == 0) {
-          return result;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public int readRawLittleEndian32() throws IOException {
-      long tempPos = pos;
-
-      if (limit - tempPos < FIXED32_SIZE) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-
-      pos = tempPos + FIXED32_SIZE;
-      return (((UnsafeUtil.getByte(tempPos) & 0xff))
-          | ((UnsafeUtil.getByte(tempPos + 1) & 0xff) << 8)
-          | ((UnsafeUtil.getByte(tempPos + 2) & 0xff) << 16)
-          | ((UnsafeUtil.getByte(tempPos + 3) & 0xff) << 24));
-    }
-
-    @Override
-    public long readRawLittleEndian64() throws IOException {
-      long tempPos = pos;
-
-      if (limit - tempPos < FIXED64_SIZE) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-
-      pos = tempPos + FIXED64_SIZE;
-      return (((UnsafeUtil.getByte(tempPos) & 0xffL))
-          | ((UnsafeUtil.getByte(tempPos + 1) & 0xffL) << 8)
-          | ((UnsafeUtil.getByte(tempPos + 2) & 0xffL) << 16)
-          | ((UnsafeUtil.getByte(tempPos + 3) & 0xffL) << 24)
-          | ((UnsafeUtil.getByte(tempPos + 4) & 0xffL) << 32)
-          | ((UnsafeUtil.getByte(tempPos + 5) & 0xffL) << 40)
-          | ((UnsafeUtil.getByte(tempPos + 6) & 0xffL) << 48)
-          | ((UnsafeUtil.getByte(tempPos + 7) & 0xffL) << 56));
-    }
-
-    @Override
-    public void enableAliasing(boolean enabled) {
-      this.enableAliasing = enabled;
-    }
-
-    @Override
-    public void resetSizeCounter() {
-      startPos = pos;
-    }
-
-    @Override
-    public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {
-      if (byteLimit < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      byteLimit += getTotalBytesRead();
-      final int oldLimit = currentLimit;
-      if (byteLimit > oldLimit) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      currentLimit = byteLimit;
-
-      recomputeBufferSizeAfterLimit();
-
-      return oldLimit;
-    }
-
-    @Override
-    public void popLimit(final int oldLimit) {
-      currentLimit = oldLimit;
-      recomputeBufferSizeAfterLimit();
-    }
-
-    @Override
-    public int getBytesUntilLimit() {
-      if (currentLimit == Integer.MAX_VALUE) {
-        return -1;
-      }
-
-      return currentLimit - getTotalBytesRead();
-    }
-
-    @Override
-    public boolean isAtEnd() throws IOException {
-      return pos == limit;
-    }
-
-    @Override
-    public int getTotalBytesRead() {
-      return (int) (pos - startPos);
-    }
-
-    @Override
-    public byte readRawByte() throws IOException {
-      if (pos == limit) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      return UnsafeUtil.getByte(pos++);
-    }
-
-    @Override
-    public byte[] readRawBytes(final int length) throws IOException {
-      if (length >= 0 && length <= remaining()) {
-        byte[] bytes = new byte[length];
-        slice(pos, pos + length).get(bytes);
-        pos += length;
-        return bytes;
-      }
-
-      if (length <= 0) {
-        if (length == 0) {
-          return EMPTY_BYTE_ARRAY;
-        } else {
-          throw InvalidProtocolBufferException.negativeSize();
-        }
-      }
-
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public void skipRawBytes(final int length) throws IOException {
-      if (length >= 0 && length <= remaining()) {
-        // We have all the bytes we need already.
-        pos += length;
-        return;
-      }
-
-      if (length < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    private void recomputeBufferSizeAfterLimit() {
-      limit += bufferSizeAfterLimit;
-      final int bufferEnd = (int) (limit - startPos);
-      if (bufferEnd > currentLimit) {
-        // Limit is in current buffer.
-        bufferSizeAfterLimit = bufferEnd - currentLimit;
-        limit -= bufferSizeAfterLimit;
-      } else {
-        bufferSizeAfterLimit = 0;
-      }
-    }
-
-    private int remaining() {
-      return (int) (limit - pos);
-    }
-
-    private int bufferPos(long pos) {
-      return (int) (pos - address);
-    }
-
-    private ByteBuffer slice(long begin, long end) throws IOException {
-      int prevPos = buffer.position();
-      int prevLimit = buffer.limit();
-      try {
-        buffer.position(bufferPos(begin));
-        buffer.limit(bufferPos(end));
-        return buffer.slice();
-      } catch (IllegalArgumentException e) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      } finally {
-        buffer.position(prevPos);
-        buffer.limit(prevLimit);
-      }
-    }
-  }
-
-  /**
-   * Implementation of {@link CodedInputStream} that uses an {@link InputStream} as the data source.
-   */
-  private static final class StreamDecoder extends CodedInputStream {
-    private final InputStream input;
-    private final byte[] buffer;
-    /** bufferSize represents how many bytes are currently filled in the buffer */
-    private int bufferSize;
-
-    private int bufferSizeAfterLimit;
-    private int pos;
-    private int lastTag;
-
-    /**
-     * The total number of bytes read before the current buffer. The total bytes read up to the
-     * current position can be computed as {@code totalBytesRetired + pos}. This value may be
-     * negative if reading started in the middle of the current buffer (e.g. if the constructor that
-     * takes a byte array and an offset was used).
-     */
-    private int totalBytesRetired;
-
-    /** The absolute position of the end of the current message. */
-    private int currentLimit = Integer.MAX_VALUE;
-
-    private StreamDecoder(final InputStream input, int bufferSize) {
-      checkNotNull(input, "input");
-      this.input = input;
-      this.buffer = new byte[bufferSize];
-      this.bufferSize = 0;
-      pos = 0;
-      totalBytesRetired = 0;
-    }
-
-    @Override
-    public int readTag() throws IOException {
-      if (isAtEnd()) {
-        lastTag = 0;
-        return 0;
-      }
-
-      lastTag = readRawVarint32();
-      if (WireFormat.getTagFieldNumber(lastTag) == 0) {
-        // If we actually read zero (or any tag number corresponding to field
-        // number zero), that's not a valid tag.
-        throw InvalidProtocolBufferException.invalidTag();
-      }
-      return lastTag;
-    }
-
-    @Override
-    public void checkLastTagWas(final int value) throws InvalidProtocolBufferException {
-      if (lastTag != value) {
-        throw InvalidProtocolBufferException.invalidEndTag();
-      }
-    }
-
-    @Override
-    public int getLastTag() {
-      return lastTag;
-    }
-
-    @Override
-    public boolean skipField(final int tag) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          skipRawVarint();
-          return true;
-        case WireFormat.WIRETYPE_FIXED64:
-          skipRawBytes(FIXED64_SIZE);
-          return true;
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          skipRawBytes(readRawVarint32());
-          return true;
-        case WireFormat.WIRETYPE_START_GROUP:
-          skipMessage();
-          checkLastTagWas(
-              WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP));
-          return true;
-        case WireFormat.WIRETYPE_END_GROUP:
-          return false;
-        case WireFormat.WIRETYPE_FIXED32:
-          skipRawBytes(FIXED32_SIZE);
-          return true;
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public boolean skipField(final int tag, final CodedOutputStream output) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          {
-            long value = readInt64();
-            output.writeRawVarint32(tag);
-            output.writeUInt64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_FIXED64:
-          {
-            long value = readRawLittleEndian64();
-            output.writeRawVarint32(tag);
-            output.writeFixed64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          {
-            ByteString value = readBytes();
-            output.writeRawVarint32(tag);
-            output.writeBytesNoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_START_GROUP:
-          {
-            output.writeRawVarint32(tag);
-            skipMessage(output);
-            int endtag =
-                WireFormat.makeTag(
-                    WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP);
-            checkLastTagWas(endtag);
-            output.writeRawVarint32(endtag);
-            return true;
-          }
-        case WireFormat.WIRETYPE_END_GROUP:
-          {
-            return false;
-          }
-        case WireFormat.WIRETYPE_FIXED32:
-          {
-            int value = readRawLittleEndian32();
-            output.writeRawVarint32(tag);
-            output.writeFixed32NoTag(value);
-            return true;
-          }
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public void skipMessage() throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag)) {
-          return;
-        }
-      }
-    }
-
-    @Override
-    public void skipMessage(CodedOutputStream output) throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag, output)) {
-          return;
-        }
-      }
-    }
-
-    /** Collects the bytes skipped and returns the data in a ByteBuffer. */
-    private class SkippedDataSink implements RefillCallback {
-      private int lastPos = pos;
-      private ByteArrayOutputStream byteArrayStream;
-
-      @Override
-      public void onRefill() {
-        if (byteArrayStream == null) {
-          byteArrayStream = new ByteArrayOutputStream();
-        }
-        byteArrayStream.write(buffer, lastPos, pos - lastPos);
-        lastPos = 0;
-      }
-
-      /** Gets skipped data in a ByteBuffer. This method should only be called once. */
-      ByteBuffer getSkippedData() {
-        if (byteArrayStream == null) {
-          return ByteBuffer.wrap(buffer, lastPos, pos - lastPos);
-        } else {
-          byteArrayStream.write(buffer, lastPos, pos);
-          return ByteBuffer.wrap(byteArrayStream.toByteArray());
-        }
-      }
-    }
-
-
-    // -----------------------------------------------------------------
-
-    @Override
-    public double readDouble() throws IOException {
-      return Double.longBitsToDouble(readRawLittleEndian64());
-    }
-
-    @Override
-    public float readFloat() throws IOException {
-      return Float.intBitsToFloat(readRawLittleEndian32());
-    }
-
-    @Override
-    public long readUInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public long readInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public int readInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public long readFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public boolean readBool() throws IOException {
-      return readRawVarint64() != 0;
-    }
-
-    @Override
-    public String readString() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= (bufferSize - pos)) {
-        // Fast path:  We already have the bytes in a contiguous buffer, so
-        //   just copy directly from it.
-        final String result = new String(buffer, pos, size, UTF_8);
-        pos += size;
-        return result;
-      }
-      if (size == 0) {
-        return "";
-      }
-      if (size <= bufferSize) {
-        refillBuffer(size);
-        String result = new String(buffer, pos, size, UTF_8);
-        pos += size;
-        return result;
-      }
-      // Slow path:  Build a byte array first then copy it.
-      return new String(readRawBytesSlowPath(size), UTF_8);
-    }
-
-    @Override
-    public String readStringRequireUtf8() throws IOException {
-      final int size = readRawVarint32();
-      final byte[] bytes;
-      final int oldPos = pos;
-      final int tempPos;
-      if (size <= (bufferSize - oldPos) && size > 0) {
-        // Fast path:  We already have the bytes in a contiguous buffer, so
-        //   just copy directly from it.
-        bytes = buffer;
-        pos = oldPos + size;
-        tempPos = oldPos;
-      } else if (size == 0) {
-        return "";
-      } else if (size <= bufferSize) {
-        refillBuffer(size);
-        bytes = buffer;
-        tempPos = 0;
-        pos = tempPos + size;
-      } else {
-        // Slow path:  Build a byte array first then copy it.
-        bytes = readRawBytesSlowPath(size);
-        tempPos = 0;
-      }
-      // TODO(martinrb): We could save a pass by validating while decoding.
-      if (!Utf8.isValidUtf8(bytes, tempPos, tempPos + size)) {
-        throw InvalidProtocolBufferException.invalidUtf8();
-      }
-      return new String(bytes, tempPos, size, UTF_8);
-    }
-
-    @Override
-    public void readGroup(
-        final int fieldNumber,
-        final MessageLite.Builder builder,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-    }
-
-
-    @Override
-    public <T extends MessageLite> T readGroup(
-        final int fieldNumber,
-        final Parser<T> parser,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-      return result;
-    }
-
-    @Deprecated
-    @Override
-    public void readUnknownGroup(final int fieldNumber, final MessageLite.Builder builder)
-        throws IOException {
-      readGroup(fieldNumber, builder, ExtensionRegistryLite.getEmptyRegistry());
-    }
-
-    @Override
-    public void readMessage(
-        final MessageLite.Builder builder, final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      final int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-    }
-
-
-    @Override
-    public <T extends MessageLite> T readMessage(
-        final Parser<T> parser, final ExtensionRegistryLite extensionRegistry) throws IOException {
-      int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-      return result;
-    }
-
-    @Override
-    public ByteString readBytes() throws IOException {
-      final int size = readRawVarint32();
-      if (size <= (bufferSize - pos) && size > 0) {
-        // Fast path:  We already have the bytes in a contiguous buffer, so
-        //   just copy directly from it.
-        final ByteString result = ByteString.copyFrom(buffer, pos, size);
-        pos += size;
-        return result;
-      }
-      if (size == 0) {
-        return ByteString.EMPTY;
-      }
-      return readBytesSlowPath(size);
-    }
-
-    @Override
-    public byte[] readByteArray() throws IOException {
-      final int size = readRawVarint32();
-      if (size <= (bufferSize - pos) && size > 0) {
-        // Fast path: We already have the bytes in a contiguous buffer, so
-        // just copy directly from it.
-        final byte[] result = Arrays.copyOfRange(buffer, pos, pos + size);
-        pos += size;
-        return result;
-      } else {
-        // Slow path: Build a byte array first then copy it.
-        return readRawBytesSlowPath(size);
-      }
-    }
-
-    @Override
-    public ByteBuffer readByteBuffer() throws IOException {
-      final int size = readRawVarint32();
-      if (size <= (bufferSize - pos) && size > 0) {
-        // Fast path: We already have the bytes in a contiguous buffer.
-        ByteBuffer result = ByteBuffer.wrap(Arrays.copyOfRange(buffer, pos, pos + size));
-        pos += size;
-        return result;
-      }
-      if (size == 0) {
-        return Internal.EMPTY_BYTE_BUFFER;
-      }
-      // Slow path: Build a byte array first then copy it.
-      return ByteBuffer.wrap(readRawBytesSlowPath(size));
-    }
-
-    @Override
-    public int readUInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readEnum() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readSFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public long readSFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readSInt32() throws IOException {
-      return decodeZigZag32(readRawVarint32());
-    }
-
-    @Override
-    public long readSInt64() throws IOException {
-      return decodeZigZag64(readRawVarint64());
-    }
-
-    // =================================================================
-
-    @Override
-    public int readRawVarint32() throws IOException {
-      // See implementation notes for readRawVarint64
-      fastpath:
-      {
-        int tempPos = pos;
-
-        if (bufferSize == tempPos) {
-          break fastpath;
-        }
-
-        final byte[] buffer = this.buffer;
-        int x;
-        if ((x = buffer[tempPos++]) >= 0) {
-          pos = tempPos;
-          return x;
-        } else if (bufferSize - tempPos < 9) {
-          break fastpath;
-        } else if ((x ^= (buffer[tempPos++] << 7)) < 0) {
-          x ^= (~0 << 7);
-        } else if ((x ^= (buffer[tempPos++] << 14)) >= 0) {
-          x ^= (~0 << 7) ^ (~0 << 14);
-        } else if ((x ^= (buffer[tempPos++] << 21)) < 0) {
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21);
-        } else {
-          int y = buffer[tempPos++];
-          x ^= y << 28;
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21) ^ (~0 << 28);
-          if (y < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0
-              && buffer[tempPos++] < 0) {
-            break fastpath; // Will throw malformedVarint()
-          }
-        }
-        pos = tempPos;
-        return x;
-      }
-      return (int) readRawVarint64SlowPath();
-    }
-
-    private void skipRawVarint() throws IOException {
-      if (bufferSize - pos >= MAX_VARINT_SIZE) {
-        skipRawVarintFastPath();
-      } else {
-        skipRawVarintSlowPath();
-      }
-    }
-
-    private void skipRawVarintFastPath() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (buffer[pos++] >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    private void skipRawVarintSlowPath() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (readRawByte() >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public long readRawVarint64() 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.
-      fastpath:
-      {
-        int tempPos = pos;
-
-        if (bufferSize == tempPos) {
-          break fastpath;
-        }
-
-        final byte[] buffer = this.buffer;
-        long x;
-        int y;
-        if ((y = buffer[tempPos++]) >= 0) {
-          pos = tempPos;
-          return y;
-        } else if (bufferSize - tempPos < 9) {
-          break fastpath;
-        } else if ((y ^= (buffer[tempPos++] << 7)) < 0) {
-          x = y ^ (~0 << 7);
-        } else if ((y ^= (buffer[tempPos++] << 14)) >= 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14));
-        } else if ((y ^= (buffer[tempPos++] << 21)) < 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14) ^ (~0 << 21));
-        } else if ((x = y ^ ((long) buffer[tempPos++] << 28)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28);
-        } else if ((x ^= ((long) buffer[tempPos++] << 35)) < 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35);
-        } else if ((x ^= ((long) buffer[tempPos++] << 42)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42);
-        } else if ((x ^= ((long) buffer[tempPos++] << 49)) < 0L) {
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49);
-        } else {
-          x ^= ((long) buffer[tempPos++] << 56);
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49)
-                  ^ (~0L << 56);
-          if (x < 0L) {
-            if (buffer[tempPos++] < 0L) {
-              break fastpath; // Will throw malformedVarint()
-            }
-          }
-        }
-        pos = tempPos;
-        return x;
-      }
-      return readRawVarint64SlowPath();
-    }
-
-    @Override
-    long readRawVarint64SlowPath() throws IOException {
-      long result = 0;
-      for (int shift = 0; shift < 64; shift += 7) {
-        final byte b = readRawByte();
-        result |= (long) (b & 0x7F) << shift;
-        if ((b & 0x80) == 0) {
-          return result;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public int readRawLittleEndian32() throws IOException {
-      int tempPos = pos;
-
-      if (bufferSize - tempPos < FIXED32_SIZE) {
-        refillBuffer(FIXED32_SIZE);
-        tempPos = pos;
-      }
-
-      final byte[] buffer = this.buffer;
-      pos = tempPos + FIXED32_SIZE;
-      return (((buffer[tempPos] & 0xff))
-          | ((buffer[tempPos + 1] & 0xff) << 8)
-          | ((buffer[tempPos + 2] & 0xff) << 16)
-          | ((buffer[tempPos + 3] & 0xff) << 24));
-    }
-
-    @Override
-    public long readRawLittleEndian64() throws IOException {
-      int tempPos = pos;
-
-      if (bufferSize - tempPos < FIXED64_SIZE) {
-        refillBuffer(FIXED64_SIZE);
-        tempPos = pos;
-      }
-
-      final byte[] buffer = this.buffer;
-      pos = tempPos + FIXED64_SIZE;
-      return (((buffer[tempPos] & 0xffL))
-          | ((buffer[tempPos + 1] & 0xffL) << 8)
-          | ((buffer[tempPos + 2] & 0xffL) << 16)
-          | ((buffer[tempPos + 3] & 0xffL) << 24)
-          | ((buffer[tempPos + 4] & 0xffL) << 32)
-          | ((buffer[tempPos + 5] & 0xffL) << 40)
-          | ((buffer[tempPos + 6] & 0xffL) << 48)
-          | ((buffer[tempPos + 7] & 0xffL) << 56));
-    }
-
-    // -----------------------------------------------------------------
-
-    @Override
-    public void enableAliasing(boolean enabled) {
-      // TODO(nathanmittler): Ideally we should throw here. Do nothing for backward compatibility.
-    }
-
-    @Override
-    public void resetSizeCounter() {
-      totalBytesRetired = -pos;
-    }
-
-    @Override
-    public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {
-      if (byteLimit < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      byteLimit += totalBytesRetired + pos;
-      final int oldLimit = currentLimit;
-      if (byteLimit > oldLimit) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      currentLimit = byteLimit;
-
-      recomputeBufferSizeAfterLimit();
-
-      return oldLimit;
-    }
-
-    private void recomputeBufferSizeAfterLimit() {
-      bufferSize += bufferSizeAfterLimit;
-      final int bufferEnd = totalBytesRetired + bufferSize;
-      if (bufferEnd > currentLimit) {
-        // Limit is in current buffer.
-        bufferSizeAfterLimit = bufferEnd - currentLimit;
-        bufferSize -= bufferSizeAfterLimit;
-      } else {
-        bufferSizeAfterLimit = 0;
-      }
-    }
-
-    @Override
-    public void popLimit(final int oldLimit) {
-      currentLimit = oldLimit;
-      recomputeBufferSizeAfterLimit();
-    }
-
-    @Override
-    public int getBytesUntilLimit() {
-      if (currentLimit == Integer.MAX_VALUE) {
-        return -1;
-      }
-
-      final int currentAbsolutePosition = totalBytesRetired + pos;
-      return currentLimit - currentAbsolutePosition;
-    }
-
-    @Override
-    public boolean isAtEnd() throws IOException {
-      return pos == bufferSize && !tryRefillBuffer(1);
-    }
-
-    @Override
-    public int getTotalBytesRead() {
-      return totalBytesRetired + pos;
-    }
-
-    private interface RefillCallback {
-      void onRefill();
-    }
-
-    private RefillCallback refillCallback = null;
-
-    /**
-     * Reads more bytes from the input, making at least {@code n} bytes available in the buffer.
-     * Caller must ensure that the requested space is not yet available, and that the requested
-     * space is less than BUFFER_SIZE.
-     *
-     * @throws InvalidProtocolBufferException The end of the stream or the current limit was
-     *     reached.
-     */
-    private void refillBuffer(int n) throws IOException {
-      if (!tryRefillBuffer(n)) {
-        // We have to distinguish the exception between sizeLimitExceeded and truncatedMessage. So
-        // we just throw an sizeLimitExceeded exception here if it exceeds the sizeLimit
-        if (n > sizeLimit - totalBytesRetired - pos) {
-          throw InvalidProtocolBufferException.sizeLimitExceeded();
-        } else {
-          throw InvalidProtocolBufferException.truncatedMessage();
-        }
-      }
-    }
-
-    /**
-     * Tries to read more bytes from the input, making at least {@code n} bytes available in the
-     * buffer. Caller must ensure that the requested space is not yet available, and that the
-     * requested space is less than BUFFER_SIZE.
-     *
-     * @return {@code true} If the bytes could be made available; {@code false} 1. Current at the
-     *     end of the stream 2. The current limit was reached 3. The total size limit was reached
-     */
-    private boolean tryRefillBuffer(int n) throws IOException {
-      if (pos + n <= bufferSize) {
-        throw new IllegalStateException(
-            "refillBuffer() called when " + n + " bytes were already available in buffer");
-      }
-
-      // Check whether the size of total message needs to read is bigger than the size limit.
-      // We shouldn't throw an exception here as isAtEnd() function needs to get this function's
-      // return as the result.
-      if (n > sizeLimit - totalBytesRetired - pos) {
-        return false;
-      }
-
-      // Shouldn't throw the exception here either.
-      if (totalBytesRetired + pos + n > currentLimit) {
-        // Oops, we hit a limit.
-        return false;
-      }
-
-      if (refillCallback != null) {
-        refillCallback.onRefill();
-      }
-
-      int tempPos = pos;
-      if (tempPos > 0) {
-        if (bufferSize > tempPos) {
-          System.arraycopy(buffer, tempPos, buffer, 0, bufferSize - tempPos);
-        }
-        totalBytesRetired += tempPos;
-        bufferSize -= tempPos;
-        pos = 0;
-      }
-
-      // Here we should refill the buffer as many bytes as possible.
-      int bytesRead =
-          input.read(
-              buffer,
-              bufferSize,
-              Math.min(
-                  //  the size of allocated but unused bytes in the buffer
-                  buffer.length - bufferSize,
-                  //  do not exceed the total bytes limit
-                  sizeLimit - totalBytesRetired - bufferSize));
-      if (bytesRead == 0 || bytesRead < -1 || bytesRead > buffer.length) {
-        throw new IllegalStateException(
-            "InputStream#read(byte[]) returned invalid result: "
-                + bytesRead
-                + "\nThe InputStream implementation is buggy.");
-      }
-      if (bytesRead > 0) {
-        bufferSize += bytesRead;
-        recomputeBufferSizeAfterLimit();
-        return (bufferSize >= n) ? true : tryRefillBuffer(n);
-      }
-
+    if (totalBytesRetired + bufferPos + n > currentLimit) {
+      // Oops, we hit a limit.
       return false;
     }
 
-    @Override
-    public byte readRawByte() throws IOException {
-      if (pos == bufferSize) {
-        refillBuffer(1);
-      }
-      return buffer[pos++];
+    if (refillCallback != null) {
+      refillCallback.onRefill();
     }
 
-    @Override
-    public byte[] readRawBytes(final int size) throws IOException {
-      final int tempPos = pos;
-      if (size <= (bufferSize - tempPos) && size > 0) {
-        pos = tempPos + size;
-        return Arrays.copyOfRange(buffer, tempPos, tempPos + size);
-      } else {
-        return readRawBytesSlowPath(size);
-      }
-    }
-
-    /**
-     * Exactly like readRawBytes, but caller must have already checked the fast path: (size <=
-     * (bufferSize - pos) && size > 0)
-     */
-    private byte[] readRawBytesSlowPath(final int size) 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;
-      }
-
-      final int originalBufferPos = pos;
-      final int bufferedBytes = bufferSize - pos;
-
-      // Mark the current buffer consumed.
-      totalBytesRetired += bufferSize;
-      pos = 0;
-      bufferSize = 0;
-
-      // Determine the number of bytes we need to read from the input stream.
-      int sizeLeft = size - bufferedBytes;
-
-      // The size is very large. For security reasons we read them in small
-      // chunks.
-      List<byte[]> chunks = readRawBytesSlowPathRemainingChunks(sizeLeft);
-
-      // 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;
-      }
-
-      // Done.
-      return bytes;
-    }
-
-    /**
-     * 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.
-     */
-    private byte[] readRawBytesSlowPathOneChunk(final int size) throws IOException {
-      if (size == 0) {
-        return Internal.EMPTY_BYTE_ARRAY;
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-
-      // Integer-overflow-conscious check that the message size so far has not exceeded sizeLimit.
-      int currentMessageSize = totalBytesRetired + pos + size;
-      if (currentMessageSize - sizeLimit > 0) {
-        throw InvalidProtocolBufferException.sizeLimitExceeded();
-      }
-
-      // Verify that the message size so far has not exceeded currentLimit.
-      if (currentMessageSize > currentLimit) {
-        // Read to the end of the stream anyway.
-        skipRawBytes(currentLimit - totalBytesRetired - pos);
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-
-      final int bufferedBytes = bufferSize - pos;
-      // Determine the number of bytes we need to read from the input stream.
-      int sizeLeft = size - bufferedBytes;
-      // TODO(nathanmittler): Consider using a value larger than DEFAULT_BUFFER_SIZE.
-      if (sizeLeft < DEFAULT_BUFFER_SIZE || sizeLeft <= input.available()) {
-        // Either the bytes we need are known to be available, or the required buffer is
-        // within an allowed threshold - go ahead and allocate the buffer now.
-        final byte[] bytes = new byte[size];
-
-        // Copy all of the buffered bytes to the result buffer.
-        System.arraycopy(buffer, pos, bytes, 0, bufferedBytes);
-        totalBytesRetired += bufferSize;
-        pos = 0;
-        bufferSize = 0;
-
-        // Fill the remaining bytes from the input stream.
-        int tempPos = bufferedBytes;
-        while (tempPos < bytes.length) {
-          int n = input.read(bytes, tempPos, size - tempPos);
-          if (n == -1) {
-            throw InvalidProtocolBufferException.truncatedMessage();
-          }
-          totalBytesRetired += n;
-          tempPos += n;
+    if (input != null) {
+      int pos = bufferPos;
+      if (pos > 0) {
+        if (bufferSize > pos) {
+          System.arraycopy(buffer, pos, buffer, 0, bufferSize - pos);
         }
-
-        return bytes;
+        totalBytesRetired += pos;
+        bufferSize -= pos;
+        bufferPos = 0;
       }
 
-      return null;
-    }
-
-    /** Reads the remaining data in small chunks from the input stream. */
-    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
-      // maliciously-crafted message could provide a bogus very large size in
-      // order to trick the app into allocating a lot of memory.  We avoid this
-      // by allocating and reading only a small chunk at a time, so that the
-      // malicious message must actually *be* extremely large to cause
-      // problems.  Meanwhile, we limit the allowed size of a message elsewhere.
-      final List<byte[]> chunks = new ArrayList<byte[]>();
-
-      while (sizeLeft > 0) {
-        // TODO(nathanmittler): Consider using a value larger than DEFAULT_BUFFER_SIZE.
-        final byte[] chunk = new byte[Math.min(sizeLeft, DEFAULT_BUFFER_SIZE)];
-        int tempPos = 0;
-        while (tempPos < chunk.length) {
-          final int n = input.read(chunk, tempPos, chunk.length - tempPos);
-          if (n == -1) {
-            throw InvalidProtocolBufferException.truncatedMessage();
-          }
-          totalBytesRetired += n;
-          tempPos += n;
+      int bytesRead = input.read(buffer, bufferSize, buffer.length - bufferSize);
+      if (bytesRead == 0 || bytesRead < -1 || bytesRead > buffer.length) {
+        throw new IllegalStateException(
+            "InputStream#read(byte[]) returned invalid result: " + bytesRead +
+            "\nThe InputStream implementation is buggy.");
+      }
+      if (bytesRead > 0) {
+        bufferSize += bytesRead;
+        // Integer-overflow-conscious check against sizeLimit
+        if (totalBytesRetired + n - sizeLimit > 0) {
+          throw InvalidProtocolBufferException.sizeLimitExceeded();
         }
-        sizeLeft -= chunk.length;
-        chunks.add(chunk);
-      }
-
-      return chunks;
-    }
-
-    /**
-     * Like readBytes, but caller must have already checked the fast path: (size <= (bufferSize -
-     * pos) && size > 0 || size == 0)
-     */
-    private ByteString readBytesSlowPath(final int size) throws IOException {
-      final byte[] result = readRawBytesSlowPathOneChunk(size);
-      if (result != null) {
-        return ByteString.wrap(result);
-      }
-
-      final int originalBufferPos = pos;
-      final int bufferedBytes = bufferSize - pos;
-
-      // Mark the current buffer consumed.
-      totalBytesRetired += bufferSize;
-      pos = 0;
-      bufferSize = 0;
-
-      // Determine the number of bytes we need to read from the input stream.
-      int sizeLeft = size - bufferedBytes;
-
-      // The size is very large. For security reasons we read them in small
-      // 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));
-      }
-      return ByteString.copyFrom(byteStrings);
-    }
-
-    @Override
-    public void skipRawBytes(final int size) throws IOException {
-      if (size <= (bufferSize - pos) && size >= 0) {
-        // We have all the bytes we need already.
-        pos += size;
-      } else {
-        skipRawBytesSlowPath(size);
+        recomputeBufferSizeAfterLimit();
+        return (bufferSize >= n) ? true : tryRefillBuffer(n);
       }
     }
 
-    /**
-     * Exactly like skipRawBytes, but caller must have already checked the fast path: (size <=
-     * (bufferSize - pos) && size >= 0)
-     */
-    private void skipRawBytesSlowPath(final int size) throws IOException {
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
+    return false;
+  }
 
-      if (totalBytesRetired + pos + size > currentLimit) {
-        // Read to the end of the stream anyway.
-        skipRawBytes(currentLimit - totalBytesRetired - pos);
-        // Then fail.
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-
-      // Skipping more bytes than are in the buffer.  First skip what we have.
-      int tempPos = bufferSize - pos;
-      pos = bufferSize;
-
-      // Keep refilling the buffer until we get to the point we wanted to skip to.
-      // This has the side effect of ensuring the limits are updated correctly.
+  /**
+   * Read one byte from the input.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  public byte readRawByte() throws IOException {
+    if (bufferPos == bufferSize) {
       refillBuffer(1);
-      while (size - tempPos > bufferSize) {
-        tempPos += bufferSize;
-        pos = bufferSize;
-        refillBuffer(1);
-      }
+    }
+    return buffer[bufferPos++];
+  }
 
-      pos = size - tempPos;
+  /**
+   * Read a fixed size of bytes from the input.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  public byte[] readRawBytes(final int size) throws IOException {
+    final int pos = bufferPos;
+    if (size <= (bufferSize - pos) && size > 0) {
+      bufferPos = pos + size;
+      return Arrays.copyOfRange(buffer, pos, pos + size);
+    } else {
+      return readRawBytesSlowPath(size);
     }
   }
 
   /**
-   * Implementation of {@link CodedInputStream} that uses an {@link Iterable <ByteBuffer>} as the
-   * data source. Requires the use of {@code sun.misc.Unsafe} to perform fast reads on the buffer.
+   * Exactly like readRawBytes, but caller must have already checked the fast
+   * path: (size <= (bufferSize - pos) && size > 0)
    */
-  private static final class IterableDirectByteBufferDecoder extends CodedInputStream {
-    /** The object that need to decode. */
-    private Iterable<ByteBuffer> input;
-    /** The {@link Iterator} with type {@link ByteBuffer} of {@code input} */
-    private Iterator<ByteBuffer> iterator;
-    /** The current ByteBuffer; */
-    private ByteBuffer currentByteBuffer;
-    /**
-     * If {@code true}, indicates that all the buffer are backing a {@link ByteString} and are
-     * therefore considered to be an immutable input source.
-     */
-    private boolean immutable;
-    /**
-     * If {@code true}, indicates that calls to read {@link ByteString} or {@code byte[]}
-     * <strong>may</strong> return slices of the underlying buffer, rather than copies.
-     */
-    private boolean enableAliasing;
-    /** The global total message length limit */
-    private int totalBufferSize;
-    /** The amount of available data in the input beyond {@link #currentLimit}. */
-    private int bufferSizeAfterCurrentLimit;
-    /** The absolute position of the end of the current message. */
-    private int currentLimit = Integer.MAX_VALUE;
-    /** The last tag that was read from this stream. */
-    private int lastTag;
-    /** Total Bytes have been Read from the {@link Iterable} {@link ByteBuffer} */
-    private int totalBytesRead;
-    /** The start position offset of the whole message, used as to reset the totalBytesRead */
-    private int startOffset;
-    /** The current position for current ByteBuffer */
-    private long currentByteBufferPos;
-
-    private long currentByteBufferStartPos;
-    /**
-     * If the current ByteBuffer is unsafe-direct based, currentAddress is the start address of this
-     * ByteBuffer; otherwise should be zero.
-     */
-    private long currentAddress;
-    /** The limit position for current ByteBuffer */
-    private long currentByteBufferLimit;
-
-    /**
-     * The constructor of {@code Iterable<ByteBuffer>} decoder.
-     *
-     * @param inputBufs The input data.
-     * @param size The total size of the input data.
-     * @param immutableFlag whether the input data is immutable.
-     */
-    private IterableDirectByteBufferDecoder(
-        Iterable<ByteBuffer> inputBufs, int size, boolean immutableFlag) {
-      totalBufferSize = size;
-      input = inputBufs;
-      iterator = input.iterator();
-      immutable = immutableFlag;
-      startOffset = totalBytesRead = 0;
+  private byte[] readRawBytesSlowPath(final int size) throws IOException {
+    if (size <= 0) {
       if (size == 0) {
-        currentByteBuffer = EMPTY_BYTE_BUFFER;
-        currentByteBufferPos = 0;
-        currentByteBufferStartPos = 0;
-        currentByteBufferLimit = 0;
-        currentAddress = 0;
+        return Internal.EMPTY_BYTE_ARRAY;
       } else {
-        tryGetNextByteBuffer();
-      }
-    }
-
-    /** To get the next ByteBuffer from {@code input}, and then update the parameters */
-    private void getNextByteBuffer() throws InvalidProtocolBufferException {
-      if (!iterator.hasNext()) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      tryGetNextByteBuffer();
-    }
-
-    private void tryGetNextByteBuffer() {
-      currentByteBuffer = iterator.next();
-      totalBytesRead += (int) (currentByteBufferPos - currentByteBufferStartPos);
-      currentByteBufferPos = currentByteBuffer.position();
-      currentByteBufferStartPos = currentByteBufferPos;
-      currentByteBufferLimit = currentByteBuffer.limit();
-      currentAddress = UnsafeUtil.addressOffset(currentByteBuffer);
-      currentByteBufferPos += currentAddress;
-      currentByteBufferStartPos += currentAddress;
-      currentByteBufferLimit += currentAddress;
-    }
-
-    @Override
-    public int readTag() throws IOException {
-      if (isAtEnd()) {
-        lastTag = 0;
-        return 0;
-      }
-
-      lastTag = readRawVarint32();
-      if (WireFormat.getTagFieldNumber(lastTag) == 0) {
-        // If we actually read zero (or any tag number corresponding to field
-        // number zero), that's not a valid tag.
-        throw InvalidProtocolBufferException.invalidTag();
-      }
-      return lastTag;
-    }
-
-    @Override
-    public void checkLastTagWas(final int value) throws InvalidProtocolBufferException {
-      if (lastTag != value) {
-        throw InvalidProtocolBufferException.invalidEndTag();
-      }
-    }
-
-    @Override
-    public int getLastTag() {
-      return lastTag;
-    }
-
-    @Override
-    public boolean skipField(final int tag) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          skipRawVarint();
-          return true;
-        case WireFormat.WIRETYPE_FIXED64:
-          skipRawBytes(FIXED64_SIZE);
-          return true;
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          skipRawBytes(readRawVarint32());
-          return true;
-        case WireFormat.WIRETYPE_START_GROUP:
-          skipMessage();
-          checkLastTagWas(
-              WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP));
-          return true;
-        case WireFormat.WIRETYPE_END_GROUP:
-          return false;
-        case WireFormat.WIRETYPE_FIXED32:
-          skipRawBytes(FIXED32_SIZE);
-          return true;
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public boolean skipField(final int tag, final CodedOutputStream output) throws IOException {
-      switch (WireFormat.getTagWireType(tag)) {
-        case WireFormat.WIRETYPE_VARINT:
-          {
-            long value = readInt64();
-            output.writeRawVarint32(tag);
-            output.writeUInt64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_FIXED64:
-          {
-            long value = readRawLittleEndian64();
-            output.writeRawVarint32(tag);
-            output.writeFixed64NoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-          {
-            ByteString value = readBytes();
-            output.writeRawVarint32(tag);
-            output.writeBytesNoTag(value);
-            return true;
-          }
-        case WireFormat.WIRETYPE_START_GROUP:
-          {
-            output.writeRawVarint32(tag);
-            skipMessage(output);
-            int endtag =
-                WireFormat.makeTag(
-                    WireFormat.getTagFieldNumber(tag), WireFormat.WIRETYPE_END_GROUP);
-            checkLastTagWas(endtag);
-            output.writeRawVarint32(endtag);
-            return true;
-          }
-        case WireFormat.WIRETYPE_END_GROUP:
-          {
-            return false;
-          }
-        case WireFormat.WIRETYPE_FIXED32:
-          {
-            int value = readRawLittleEndian32();
-            output.writeRawVarint32(tag);
-            output.writeFixed32NoTag(value);
-            return true;
-          }
-        default:
-          throw InvalidProtocolBufferException.invalidWireType();
-      }
-    }
-
-    @Override
-    public void skipMessage() throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag)) {
-          return;
-        }
-      }
-    }
-
-    @Override
-    public void skipMessage(CodedOutputStream output) throws IOException {
-      while (true) {
-        final int tag = readTag();
-        if (tag == 0 || !skipField(tag, output)) {
-          return;
-        }
-      }
-    }
-
-    // -----------------------------------------------------------------
-
-    @Override
-    public double readDouble() throws IOException {
-      return Double.longBitsToDouble(readRawLittleEndian64());
-    }
-
-    @Override
-    public float readFloat() throws IOException {
-      return Float.intBitsToFloat(readRawLittleEndian32());
-    }
-
-    @Override
-    public long readUInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public long readInt64() throws IOException {
-      return readRawVarint64();
-    }
-
-    @Override
-    public int readInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public long readFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public boolean readBool() throws IOException {
-      return readRawVarint64() != 0;
-    }
-
-    @Override
-    public String readString() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= currentByteBufferLimit - currentByteBufferPos) {
-        byte[] bytes = new byte[size];
-        UnsafeUtil.copyMemory(currentByteBufferPos, bytes, 0, size);
-        String result = new String(bytes, UTF_8);
-        currentByteBufferPos += size;
-        return result;
-      } else if (size > 0 && size <= remaining()) {
-        // TODO(yilunchong): To use an underlying bytes[] instead of allocating a new bytes[]
-        byte[] bytes = new byte[size];
-        readRawBytesTo(bytes, 0, size);
-        String result = new String(bytes, UTF_8);
-        return result;
-      }
-
-      if (size == 0) {
-        return "";
-      }
-      if (size < 0) {
         throw InvalidProtocolBufferException.negativeSize();
       }
+    }
+
+    // Verify that the message size so far has not exceeded sizeLimit.
+    int currentMessageSize = totalBytesRetired + bufferPos + size;
+    if (currentMessageSize > sizeLimit) {
+      throw InvalidProtocolBufferException.sizeLimitExceeded();
+    }
+
+    // Verify that the message size so far has not exceeded currentLimit.
+    if (currentMessageSize > currentLimit) {
+      // Read to the end of the stream anyway.
+      skipRawBytes(currentLimit - totalBytesRetired - bufferPos);
       throw InvalidProtocolBufferException.truncatedMessage();
     }
 
-    @Override
-    public String readStringRequireUtf8() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= currentByteBufferLimit - currentByteBufferPos) {
-        byte[] bytes = new byte[size];
-        UnsafeUtil.copyMemory(currentByteBufferPos, bytes, 0, size);
-        if (!Utf8.isValidUtf8(bytes)) {
-          throw InvalidProtocolBufferException.invalidUtf8();
-        }
-        String result = new String(bytes, UTF_8);
-        currentByteBufferPos += size;
-        return result;
-      }
-      if (size >= 0 && size <= remaining()) {
-        byte[] bytes = new byte[size];
-        readRawBytesTo(bytes, 0, size);
-        if (!Utf8.isValidUtf8(bytes)) {
-          throw InvalidProtocolBufferException.invalidUtf8();
-        }
-        String result = new String(bytes, UTF_8);
-        return result;
-      }
-
-      if (size == 0) {
-        return "";
-      }
-      if (size <= 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
+    // We need the input stream to proceed.
+    if (input == null) {
       throw InvalidProtocolBufferException.truncatedMessage();
     }
 
-    @Override
-    public void readGroup(
-        final int fieldNumber,
-        final MessageLite.Builder builder,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-    }
+    final int originalBufferPos = bufferPos;
+    final int bufferedBytes = bufferSize - bufferPos;
 
+    // Mark the current buffer consumed.
+    totalBytesRetired += bufferSize;
+    bufferPos = 0;
+    bufferSize = 0;
 
-    @Override
-    public <T extends MessageLite> T readGroup(
-        final int fieldNumber,
-        final Parser<T> parser,
-        final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
-      --recursionDepth;
-      return result;
-    }
+    // Determine the number of bytes we need to read from the input stream.
+    int sizeLeft = size - bufferedBytes;
+    // TODO(nathanmittler): Consider using a value larger than BUFFER_SIZE.
+    if (sizeLeft < BUFFER_SIZE || sizeLeft <= input.available()) {
+      // Either the bytes we need are known to be available, or the required buffer is
+      // within an allowed threshold - go ahead and allocate the buffer now.
+      final byte[] bytes = new byte[size];
 
-    @Deprecated
-    @Override
-    public void readUnknownGroup(final int fieldNumber, final MessageLite.Builder builder)
-        throws IOException {
-      readGroup(fieldNumber, builder, ExtensionRegistryLite.getEmptyRegistry());
-    }
+      // Copy all of the buffered bytes to the result buffer.
+      System.arraycopy(buffer, originalBufferPos, bytes, 0, bufferedBytes);
 
-    @Override
-    public void readMessage(
-        final MessageLite.Builder builder, final ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      final int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      builder.mergeFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-    }
-
-
-    @Override
-    public <T extends MessageLite> T readMessage(
-        final Parser<T> parser, final ExtensionRegistryLite extensionRegistry) throws IOException {
-      int length = readRawVarint32();
-      if (recursionDepth >= recursionLimit) {
-        throw InvalidProtocolBufferException.recursionLimitExceeded();
-      }
-      final int oldLimit = pushLimit(length);
-      ++recursionDepth;
-      T result = parser.parsePartialFrom(this, extensionRegistry);
-      checkLastTagWas(0);
-      --recursionDepth;
-      popLimit(oldLimit);
-      return result;
-    }
-
-    @Override
-    public ByteString readBytes() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= currentByteBufferLimit - currentByteBufferPos) {
-        if (immutable && enableAliasing) {
-          final int idx = (int) (currentByteBufferPos - currentAddress);
-          final ByteString result = ByteString.wrap(slice(idx, idx + size));
-          currentByteBufferPos += size;
-          return result;
-        } else {
-          byte[] bytes;
-          bytes = new byte[size];
-          UnsafeUtil.copyMemory(currentByteBufferPos, bytes, 0, size);
-          currentByteBufferPos += size;
-          return ByteString.wrap(bytes);
+      // Fill the remaining bytes from the input stream.
+      int pos = bufferedBytes;
+      while (pos < bytes.length) {
+        int n = input.read(bytes, pos, size - pos);
+        if (n == -1) {
+          throw InvalidProtocolBufferException.truncatedMessage();
         }
-      } else if (size > 0 && size <= remaining()) {
-        byte[] temp = new byte[size];
-        readRawBytesTo(temp, 0, size);
-        return ByteString.wrap(temp);
+        totalBytesRetired += n;
+        pos += n;
       }
 
-      if (size == 0) {
-        return ByteString.EMPTY;
+      return bytes;
+    }
+
+    // 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
+    // maliciously-crafted message could provide a bogus very large size in
+    // order to trick the app into allocating a lot of memory.  We avoid this
+    // by allocating and reading only a small chunk at a time, so that the
+    // malicious message must actually *be* extremely large to cause
+    // problems.  Meanwhile, we limit the allowed size of a message elsewhere.
+    final List<byte[]> chunks = new ArrayList<byte[]>();
+
+    while (sizeLeft > 0) {
+      // TODO(nathanmittler): Consider using a value larger than BUFFER_SIZE.
+      final byte[] chunk = new byte[Math.min(sizeLeft, BUFFER_SIZE)];
+      int pos = 0;
+      while (pos < chunk.length) {
+        final int n = input.read(chunk, pos, chunk.length - pos);
+        if (n == -1) {
+          throw InvalidProtocolBufferException.truncatedMessage();
+        }
+        totalBytesRetired += n;
+        pos += n;
       }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
+      sizeLeft -= chunk.length;
+      chunks.add(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 pos = bufferedBytes;
+    for (final byte[] chunk : chunks) {
+      System.arraycopy(chunk, 0, bytes, pos, chunk.length);
+      pos += chunk.length;
+    }
+
+    // Done.
+    return bytes;
+  }
+
+  /**
+   * Reads and discards {@code size} bytes.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  public void skipRawBytes(final int size) throws IOException {
+    if (size <= (bufferSize - bufferPos) && size >= 0) {
+      // We have all the bytes we need already.
+      bufferPos += size;
+    } else {
+      skipRawBytesSlowPath(size);
+    }
+  }
+
+  /**
+   * Exactly like skipRawBytes, but caller must have already checked the fast
+   * path: (size <= (bufferSize - pos) && size >= 0)
+   */
+  private void skipRawBytesSlowPath(final int size) throws IOException {
+    if (size < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    }
+
+    if (totalBytesRetired + bufferPos + size > currentLimit) {
+      // Read to the end of the stream anyway.
+      skipRawBytes(currentLimit - totalBytesRetired - bufferPos);
+      // Then fail.
       throw InvalidProtocolBufferException.truncatedMessage();
     }
 
-    @Override
-    public byte[] readByteArray() throws IOException {
-      return readRawBytes(readRawVarint32());
+    // Skipping more bytes than are in the buffer.  First skip what we have.
+    int pos = bufferSize - bufferPos;
+    bufferPos = bufferSize;
+
+    // Keep refilling the buffer until we get to the point we wanted to skip to.
+    // This has the side effect of ensuring the limits are updated correctly.
+    refillBuffer(1);
+    while (size - pos > bufferSize) {
+      pos += bufferSize;
+      bufferPos = bufferSize;
+      refillBuffer(1);
     }
 
-    @Override
-    public ByteBuffer readByteBuffer() throws IOException {
-      final int size = readRawVarint32();
-      if (size > 0 && size <= currentRemaining()) {
-        if (!immutable && enableAliasing) {
-          currentByteBufferPos += size;
-          return slice(
-              (int) (currentByteBufferPos - currentAddress - size),
-              (int) (currentByteBufferPos - currentAddress));
-        } else {
-          byte[] bytes = new byte[size];
-          UnsafeUtil.copyMemory(currentByteBufferPos, bytes, 0, size);
-          currentByteBufferPos += size;
-          return ByteBuffer.wrap(bytes);
-        }
-      } else if (size > 0 && size <= remaining()) {
-        byte[] temp = new byte[size];
-        readRawBytesTo(temp, 0, size);
-        return ByteBuffer.wrap(temp);
-      }
-
-      if (size == 0) {
-        return EMPTY_BYTE_BUFFER;
-      }
-      if (size < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public int readUInt32() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readEnum() throws IOException {
-      return readRawVarint32();
-    }
-
-    @Override
-    public int readSFixed32() throws IOException {
-      return readRawLittleEndian32();
-    }
-
-    @Override
-    public long readSFixed64() throws IOException {
-      return readRawLittleEndian64();
-    }
-
-    @Override
-    public int readSInt32() throws IOException {
-      return decodeZigZag32(readRawVarint32());
-    }
-
-    @Override
-    public long readSInt64() throws IOException {
-      return decodeZigZag64(readRawVarint64());
-    }
-
-    @Override
-    public int readRawVarint32() throws IOException {
-      fastpath:
-      {
-        long tempPos = currentByteBufferPos;
-
-        if (currentByteBufferLimit == currentByteBufferPos) {
-          break fastpath;
-        }
-
-        int x;
-        if ((x = UnsafeUtil.getByte(tempPos++)) >= 0) {
-          currentByteBufferPos++;
-          return x;
-        } else if (currentByteBufferLimit - currentByteBufferPos < 10) {
-          break fastpath;
-        } else if ((x ^= (UnsafeUtil.getByte(tempPos++) << 7)) < 0) {
-          x ^= (~0 << 7);
-        } else if ((x ^= (UnsafeUtil.getByte(tempPos++) << 14)) >= 0) {
-          x ^= (~0 << 7) ^ (~0 << 14);
-        } else if ((x ^= (UnsafeUtil.getByte(tempPos++) << 21)) < 0) {
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21);
-        } else {
-          int y = UnsafeUtil.getByte(tempPos++);
-          x ^= y << 28;
-          x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21) ^ (~0 << 28);
-          if (y < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0
-              && UnsafeUtil.getByte(tempPos++) < 0) {
-            break fastpath; // Will throw malformedVarint()
-          }
-        }
-        currentByteBufferPos = tempPos;
-        return x;
-      }
-      return (int) readRawVarint64SlowPath();
-    }
-
-    @Override
-    public long readRawVarint64() throws IOException {
-      fastpath:
-      {
-        long tempPos = currentByteBufferPos;
-
-        if (currentByteBufferLimit == currentByteBufferPos) {
-          break fastpath;
-        }
-
-        long x;
-        int y;
-        if ((y = UnsafeUtil.getByte(tempPos++)) >= 0) {
-          currentByteBufferPos++;
-          return y;
-        } else if (currentByteBufferLimit - currentByteBufferPos < 10) {
-          break fastpath;
-        } else if ((y ^= (UnsafeUtil.getByte(tempPos++) << 7)) < 0) {
-          x = y ^ (~0 << 7);
-        } else if ((y ^= (UnsafeUtil.getByte(tempPos++) << 14)) >= 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14));
-        } else if ((y ^= (UnsafeUtil.getByte(tempPos++) << 21)) < 0) {
-          x = y ^ ((~0 << 7) ^ (~0 << 14) ^ (~0 << 21));
-        } else if ((x = y ^ ((long) UnsafeUtil.getByte(tempPos++) << 28)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28);
-        } else if ((x ^= ((long) UnsafeUtil.getByte(tempPos++) << 35)) < 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35);
-        } else if ((x ^= ((long) UnsafeUtil.getByte(tempPos++) << 42)) >= 0L) {
-          x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42);
-        } else if ((x ^= ((long) UnsafeUtil.getByte(tempPos++) << 49)) < 0L) {
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49);
-        } else {
-          x ^= ((long) UnsafeUtil.getByte(tempPos++) << 56);
-          x ^=
-              (~0L << 7)
-                  ^ (~0L << 14)
-                  ^ (~0L << 21)
-                  ^ (~0L << 28)
-                  ^ (~0L << 35)
-                  ^ (~0L << 42)
-                  ^ (~0L << 49)
-                  ^ (~0L << 56);
-          if (x < 0L) {
-            if (UnsafeUtil.getByte(tempPos++) < 0L) {
-              break fastpath; // Will throw malformedVarint()
-            }
-          }
-        }
-        currentByteBufferPos = tempPos;
-        return x;
-      }
-      return readRawVarint64SlowPath();
-    }
-
-    @Override
-    long readRawVarint64SlowPath() throws IOException {
-      long result = 0;
-      for (int shift = 0; shift < 64; shift += 7) {
-        final byte b = readRawByte();
-        result |= (long) (b & 0x7F) << shift;
-        if ((b & 0x80) == 0) {
-          return result;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    @Override
-    public int readRawLittleEndian32() throws IOException {
-      if (currentRemaining() >= FIXED32_SIZE) {
-        long tempPos = currentByteBufferPos;
-        currentByteBufferPos += FIXED32_SIZE;
-        return (((UnsafeUtil.getByte(tempPos) & 0xff))
-            | ((UnsafeUtil.getByte(tempPos + 1) & 0xff) << 8)
-            | ((UnsafeUtil.getByte(tempPos + 2) & 0xff) << 16)
-            | ((UnsafeUtil.getByte(tempPos + 3) & 0xff) << 24));
-      }
-      return ((readRawByte() & 0xff)
-          | ((readRawByte() & 0xff) << 8)
-          | ((readRawByte() & 0xff) << 16)
-          | ((readRawByte() & 0xff) << 24));
-    }
-
-    @Override
-    public long readRawLittleEndian64() throws IOException {
-      if (currentRemaining() >= FIXED64_SIZE) {
-        long tempPos = currentByteBufferPos;
-        currentByteBufferPos += FIXED64_SIZE;
-        return (((UnsafeUtil.getByte(tempPos) & 0xffL))
-            | ((UnsafeUtil.getByte(tempPos + 1) & 0xffL) << 8)
-            | ((UnsafeUtil.getByte(tempPos + 2) & 0xffL) << 16)
-            | ((UnsafeUtil.getByte(tempPos + 3) & 0xffL) << 24)
-            | ((UnsafeUtil.getByte(tempPos + 4) & 0xffL) << 32)
-            | ((UnsafeUtil.getByte(tempPos + 5) & 0xffL) << 40)
-            | ((UnsafeUtil.getByte(tempPos + 6) & 0xffL) << 48)
-            | ((UnsafeUtil.getByte(tempPos + 7) & 0xffL) << 56));
-      }
-      return ((readRawByte() & 0xffL)
-          | ((readRawByte() & 0xffL) << 8)
-          | ((readRawByte() & 0xffL) << 16)
-          | ((readRawByte() & 0xffL) << 24)
-          | ((readRawByte() & 0xffL) << 32)
-          | ((readRawByte() & 0xffL) << 40)
-          | ((readRawByte() & 0xffL) << 48)
-          | ((readRawByte() & 0xffL) << 56));
-    }
-
-    @Override
-    public void enableAliasing(boolean enabled) {
-      this.enableAliasing = enabled;
-    }
-
-    @Override
-    public void resetSizeCounter() {
-      startOffset = (int) (totalBytesRead + currentByteBufferPos - currentByteBufferStartPos);
-    }
-
-    @Override
-    public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {
-      if (byteLimit < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      byteLimit += getTotalBytesRead();
-      final int oldLimit = currentLimit;
-      if (byteLimit > oldLimit) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      }
-      currentLimit = byteLimit;
-
-      recomputeBufferSizeAfterLimit();
-
-      return oldLimit;
-    }
-
-    private void recomputeBufferSizeAfterLimit() {
-      totalBufferSize += bufferSizeAfterCurrentLimit;
-      final int bufferEnd = totalBufferSize - startOffset;
-      if (bufferEnd > currentLimit) {
-        // Limit is in current buffer.
-        bufferSizeAfterCurrentLimit = bufferEnd - currentLimit;
-        totalBufferSize -= bufferSizeAfterCurrentLimit;
-      } else {
-        bufferSizeAfterCurrentLimit = 0;
-      }
-    }
-
-    @Override
-    public void popLimit(final int oldLimit) {
-      currentLimit = oldLimit;
-      recomputeBufferSizeAfterLimit();
-    }
-
-    @Override
-    public int getBytesUntilLimit() {
-      if (currentLimit == Integer.MAX_VALUE) {
-        return -1;
-      }
-
-      return currentLimit - getTotalBytesRead();
-    }
-
-    @Override
-    public boolean isAtEnd() throws IOException {
-      return totalBytesRead + currentByteBufferPos - currentByteBufferStartPos == totalBufferSize;
-    }
-
-    @Override
-    public int getTotalBytesRead() {
-      return (int)
-          (totalBytesRead - startOffset + currentByteBufferPos - currentByteBufferStartPos);
-    }
-
-    @Override
-    public byte readRawByte() throws IOException {
-      if (currentRemaining() == 0) {
-        getNextByteBuffer();
-      }
-      return UnsafeUtil.getByte(currentByteBufferPos++);
-    }
-
-    @Override
-    public byte[] readRawBytes(final int length) throws IOException {
-      if (length >= 0 && length <= currentRemaining()) {
-        byte[] bytes = new byte[length];
-        UnsafeUtil.copyMemory(currentByteBufferPos, bytes, 0, length);
-        currentByteBufferPos += length;
-        return bytes;
-      }
-      if (length >= 0 && length <= remaining()) {
-        byte[] bytes = new byte[length];
-        readRawBytesTo(bytes, 0, length);
-        return bytes;
-      }
-
-      if (length <= 0) {
-        if (length == 0) {
-          return EMPTY_BYTE_ARRAY;
-        } else {
-          throw InvalidProtocolBufferException.negativeSize();
-        }
-      }
-
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    /**
-     * Try to get raw bytes from {@code input} with the size of {@code length} and copy to {@code
-     * bytes} array. If the size is bigger than the number of remaining bytes in the input, then
-     * throw {@code truncatedMessage} exception.
-     *
-     * @param bytes
-     * @param offset
-     * @param length
-     * @throws IOException
-     */
-    private void readRawBytesTo(byte[] bytes, int offset, final int length) throws IOException {
-      if (length >= 0 && length <= remaining()) {
-        int l = length;
-        while (l > 0) {
-          if (currentRemaining() == 0) {
-            getNextByteBuffer();
-          }
-          int bytesToCopy = Math.min(l, (int) currentRemaining());
-          UnsafeUtil.copyMemory(currentByteBufferPos, bytes, length - l + offset, bytesToCopy);
-          l -= bytesToCopy;
-          currentByteBufferPos += bytesToCopy;
-        }
-        return;
-      }
-
-      if (length <= 0) {
-        if (length == 0) {
-          return;
-        } else {
-          throw InvalidProtocolBufferException.negativeSize();
-        }
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    @Override
-    public void skipRawBytes(final int length) throws IOException {
-      if (length >= 0
-          && length
-              <= (totalBufferSize
-                  - totalBytesRead
-                  - currentByteBufferPos
-                  + currentByteBufferStartPos)) {
-        // We have all the bytes we need already.
-        int l = length;
-        while (l > 0) {
-          if (currentRemaining() == 0) {
-            getNextByteBuffer();
-          }
-          int rl = Math.min(l, (int) currentRemaining());
-          l -= rl;
-          currentByteBufferPos += rl;
-        }
-        return;
-      }
-
-      if (length < 0) {
-        throw InvalidProtocolBufferException.negativeSize();
-      }
-      throw InvalidProtocolBufferException.truncatedMessage();
-    }
-
-    // TODO: optimize to fastpath
-    private void skipRawVarint() throws IOException {
-      for (int i = 0; i < MAX_VARINT_SIZE; i++) {
-        if (readRawByte() >= 0) {
-          return;
-        }
-      }
-      throw InvalidProtocolBufferException.malformedVarint();
-    }
-
-    /**
-     * Try to get the number of remaining bytes in {@code input}.
-     *
-     * @return the number of remaining bytes in {@code input}.
-     */
-    private int remaining() {
-      return (int)
-          (totalBufferSize - totalBytesRead - currentByteBufferPos + currentByteBufferStartPos);
-    }
-
-    /**
-     * Try to get the number of remaining bytes in {@code currentByteBuffer}.
-     *
-     * @return the number of remaining bytes in {@code currentByteBuffer}
-     */
-    private long currentRemaining() {
-      return (currentByteBufferLimit - currentByteBufferPos);
-    }
-
-    private ByteBuffer slice(int begin, int end) throws IOException {
-      int prevPos = currentByteBuffer.position();
-      int prevLimit = currentByteBuffer.limit();
-      try {
-        currentByteBuffer.position(begin);
-        currentByteBuffer.limit(end);
-        return currentByteBuffer.slice();
-      } catch (IllegalArgumentException e) {
-        throw InvalidProtocolBufferException.truncatedMessage();
-      } finally {
-        currentByteBuffer.position(prevPos);
-        currentByteBuffer.limit(prevLimit);
-      }
-    }
+    bufferPos = size - pos;
   }
 }
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 093a5f6..ad174d0 100644
--- a/java/core/src/main/java/com/google/protobuf/CodedOutputStream.java
+++ b/java/core/src/main/java/com/google/protobuf/CodedOutputStream.java
@@ -30,17 +30,18 @@
 
 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.MAX_VARINT_SIZE;
 import static java.lang.Math.max;
 
 import com.google.protobuf.Utf8.UnpairedSurrogateException;
+
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.reflect.Field;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -58,13 +59,19 @@
  */
 public abstract class CodedOutputStream extends ByteOutput {
   private static final Logger logger = Logger.getLogger(CodedOutputStream.class.getName());
-  private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS = UnsafeUtil.hasUnsafeArrayOperations();
+  private static final sun.misc.Unsafe UNSAFE = getUnsafe();
+  private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS = supportsUnsafeArrayOperations();
+  private static final long ARRAY_BASE_OFFSET = byteArrayBaseOffset();
+
+  private static final int FIXED_32_SIZE = 4;
+  private static final int FIXED_64_SIZE = 8;
+  private static final int MAX_VARINT_SIZE = 10;
 
   /**
    * @deprecated Use {@link #computeFixed32SizeNoTag(int)} instead.
    */
   @Deprecated
-  public static final int LITTLE_ENDIAN_32_SIZE = FIXED32_SIZE;
+  public static final int LITTLE_ENDIAN_32_SIZE = FIXED_32_SIZE;
 
   /**
    * The buffer size used in {@link #newInstance(OutputStream)}.
@@ -131,67 +138,16 @@
     return new ArrayEncoder(flatArray, offset, length);
   }
 
-  /** Create a new {@code CodedOutputStream} that writes to the given {@link ByteBuffer}. */
-  public static CodedOutputStream newInstance(ByteBuffer buffer) {
-    if (buffer.hasArray()) {
-      return new HeapNioEncoder(buffer);
-    }
-    if (buffer.isDirect() && !buffer.isReadOnly()) {
-      return UnsafeDirectNioEncoder.isSupported()
-          ? newUnsafeInstance(buffer)
-          : newSafeInstance(buffer);
-    }
-    throw new IllegalArgumentException("ByteBuffer is read-only");
-  }
-
-  /** For testing purposes only. */
-  static CodedOutputStream newUnsafeInstance(ByteBuffer buffer) {
-    return new UnsafeDirectNioEncoder(buffer);
-  }
-
-  /** For testing purposes only. */
-  static CodedOutputStream newSafeInstance(ByteBuffer buffer) {
-    return new SafeDirectNioEncoder(buffer);
-  }
-
   /**
-   * Configures serialization to be deterministic.
-   *
-   * <p>The deterministic serialization guarantees that for a given binary, equal (defined by the
-   * {@code equals()} methods in protos) messages will always be serialized to the same bytes. This
-   * implies:
-   *
-   * <ul>
-   * <li>repeated serialization of a message will return the same bytes
-   * <li>different processes of the same binary (which may be executing on different machines) will
-   *     serialize equal messages to the same bytes.
-   * </ul>
-   *
-   * <p>Note the deterministic serialization is NOT canonical across languages; it is also unstable
-   * across different builds with schema changes due to unknown fields. Users who need canonical
-   * serialization, e.g. persistent storage in a canonical form, fingerprinting, etc, should define
-   * their own canonicalization specification and implement the serializer using reflection APIs
-   * rather than relying on this API.
-   *
-   * <p> Once set, the serializer will:  (Note this is an implementation detail and may subject to
-   * change in the future)
-   *
-   * <ul>
-   * <li> sort map entries by keys in lexicographical order or numerical order. Note: For string
-   *     keys, the order is based on comparing the Unicode value of each character in the strings.
-   *     The order may be different from the deterministic serialization in other languages where
-   *     maps are sorted on the lexicographical order of the UTF8 encoded keys.
-   * </ul>
+   * Create a new {@code CodedOutputStream} that writes to the given {@link ByteBuffer}.
    */
-  public void useDeterministicSerialization() {
-    serializationDeterministic = true;
+  public static CodedOutputStream newInstance(ByteBuffer byteBuffer) {
+    if (byteBuffer.hasArray()) {
+      return new NioHeapEncoder(byteBuffer);
+    }
+    return new NioEncoder(byteBuffer);
   }
 
-  boolean isSerializationDeterministic() {
-    return serializationDeterministic;
-  }
-  private boolean serializationDeterministic;
-
   /**
    * Create a new {@code CodedOutputStream} that writes to the given {@link ByteBuffer}.
    *
@@ -754,7 +710,7 @@
    * {@code fixed32} field.
    */
   public static int computeFixed32SizeNoTag(@SuppressWarnings("unused") final int unused) {
-    return FIXED32_SIZE;
+    return FIXED_32_SIZE;
   }
 
   /**
@@ -762,7 +718,7 @@
    * {@code sfixed32} field.
    */
   public static int computeSFixed32SizeNoTag(@SuppressWarnings("unused") final int unused) {
-    return FIXED32_SIZE;
+    return FIXED_32_SIZE;
   }
 
   /**
@@ -812,7 +768,7 @@
    * {@code fixed64} field.
    */
   public static int computeFixed64SizeNoTag(@SuppressWarnings("unused") final long unused) {
-    return FIXED64_SIZE;
+    return FIXED_64_SIZE;
   }
 
   /**
@@ -820,7 +776,7 @@
    * {@code sfixed64} field.
    */
   public static int computeSFixed64SizeNoTag(@SuppressWarnings("unused") final long unused) {
-    return FIXED64_SIZE;
+    return FIXED_64_SIZE;
   }
 
   /**
@@ -828,7 +784,7 @@
    * {@code float} field, including tag.
    */
   public static int computeFloatSizeNoTag(@SuppressWarnings("unused") final float unused) {
-    return FIXED32_SIZE;
+    return FIXED_32_SIZE;
   }
 
   /**
@@ -836,7 +792,7 @@
    * {@code double} field, including tag.
    */
   public static int computeDoubleSizeNoTag(@SuppressWarnings("unused") final double unused) {
-    return FIXED64_SIZE;
+    return FIXED_64_SIZE;
   }
 
   /**
@@ -913,7 +869,7 @@
     return computeLengthDelimitedFieldSize(value.getSerializedSize());
   }
 
-  static int computeLengthDelimitedFieldSize(int fieldLength) {
+  private static int computeLengthDelimitedFieldSize(int fieldLength) {
     return computeUInt32SizeNoTag(fieldLength) + fieldLength;
   }
 
@@ -989,17 +945,9 @@
       super(MESSAGE);
     }
 
-    OutOfSpaceException(String explanationMessage) {
-      super(MESSAGE + ": " + explanationMessage);
-    }
-
     OutOfSpaceException(Throwable cause) {
       super(MESSAGE, cause);
     }
-
-    OutOfSpaceException(String explanationMessage, Throwable cause) {
-      super(MESSAGE + ": " + explanationMessage, cause);
-    }
   }
 
   /**
@@ -1302,8 +1250,8 @@
       try {
         buffer[position++] = value;
       } catch (IndexOutOfBoundsException e) {
-        throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1), e);
+        throw new OutOfSpaceException(new IndexOutOfBoundsException(
+            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1)));
       }
     }
 
@@ -1320,12 +1268,15 @@
     @Override
     public final void writeUInt32NoTag(int value) throws IOException {
       if (HAS_UNSAFE_ARRAY_OPERATIONS && spaceLeft() >= MAX_VARINT_SIZE) {
+        long pos = ARRAY_BASE_OFFSET + position;
         while (true) {
           if ((value & ~0x7F) == 0) {
-            UnsafeUtil.putByte(buffer, position++, (byte) value);
+            UNSAFE.putByte(buffer, pos++, (byte) value);
+            position++;
             return;
           } else {
-            UnsafeUtil.putByte(buffer, position++, (byte) ((value & 0x7F) | 0x80));
+            UNSAFE.putByte(buffer, pos++, (byte) ((value & 0x7F) | 0x80));
+            position++;
             value >>>= 7;
           }
         }
@@ -1342,7 +1293,8 @@
           }
         } catch (IndexOutOfBoundsException e) {
           throw new OutOfSpaceException(
-              String.format("Pos: %d, limit: %d, len: %d", position, limit, 1), e);
+              new IndexOutOfBoundsException(
+                  String.format("Pos: %d, limit: %d, len: %d", position, limit, 1)));
         }
       }
     }
@@ -1356,19 +1308,23 @@
         buffer[position++] = (byte) ((value >> 24) & 0xFF);
       } catch (IndexOutOfBoundsException e) {
         throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1), e);
+            new IndexOutOfBoundsException(
+                String.format("Pos: %d, limit: %d, len: %d", position, limit, 1)));
       }
     }
 
     @Override
     public final void writeUInt64NoTag(long value) throws IOException {
       if (HAS_UNSAFE_ARRAY_OPERATIONS && spaceLeft() >= MAX_VARINT_SIZE) {
+        long pos = ARRAY_BASE_OFFSET + position;
         while (true) {
           if ((value & ~0x7FL) == 0) {
-            UnsafeUtil.putByte(buffer, position++, (byte) value);
+            UNSAFE.putByte(buffer, pos++, (byte) value);
+            position++;
             return;
           } else {
-            UnsafeUtil.putByte(buffer, position++, (byte) (((int) value & 0x7F) | 0x80));
+            UNSAFE.putByte(buffer, pos++, (byte) (((int) value & 0x7F) | 0x80));
+            position++;
             value >>>= 7;
           }
         }
@@ -1385,7 +1341,8 @@
           }
         } catch (IndexOutOfBoundsException e) {
           throw new OutOfSpaceException(
-              String.format("Pos: %d, limit: %d, len: %d", position, limit, 1), e);
+              new IndexOutOfBoundsException(
+                  String.format("Pos: %d, limit: %d, len: %d", position, limit, 1)));
         }
       }
     }
@@ -1403,7 +1360,8 @@
         buffer[position++] = (byte) ((int) (value >> 56) & 0xFF);
       } catch (IndexOutOfBoundsException e) {
         throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1), e);
+            new IndexOutOfBoundsException(
+                String.format("Pos: %d, limit: %d, len: %d", position, limit, 1)));
       }
     }
 
@@ -1414,7 +1372,8 @@
         position += length;
       } catch (IndexOutOfBoundsException e) {
         throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, length), e);
+            new IndexOutOfBoundsException(
+                String.format("Pos: %d, limit: %d, len: %d", position, limit, length)));
       }
     }
 
@@ -1431,7 +1390,8 @@
         position += length;
       } catch (IndexOutOfBoundsException e) {
         throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, length), e);
+            new IndexOutOfBoundsException(
+                String.format("Pos: %d, limit: %d, len: %d", position, limit, length)));
       }
     }
 
@@ -1494,11 +1454,11 @@
    * A {@link CodedOutputStream} that writes directly to a heap {@link ByteBuffer}. Writes are
    * done directly to the underlying array. The buffer position is only updated after a flush.
    */
-  private static final class HeapNioEncoder extends ArrayEncoder {
+  private static final class NioHeapEncoder extends ArrayEncoder {
     private final ByteBuffer byteBuffer;
     private int initialPosition;
 
-    HeapNioEncoder(ByteBuffer byteBuffer) {
+    NioHeapEncoder(ByteBuffer byteBuffer) {
       super(byteBuffer.array(), byteBuffer.arrayOffset() + byteBuffer.position(),
           byteBuffer.remaining());
       this.byteBuffer = byteBuffer;
@@ -1513,15 +1473,14 @@
   }
 
   /**
-   * A {@link CodedOutputStream} that writes directly to a direct {@link ByteBuffer}, using only
-   * safe operations..
+   * A {@link CodedOutputStream} that writes directly to a {@link ByteBuffer}.
    */
-  private static final class SafeDirectNioEncoder extends CodedOutputStream {
+  private static final class NioEncoder extends CodedOutputStream {
     private final ByteBuffer originalBuffer;
     private final ByteBuffer buffer;
     private final int initialPosition;
 
-    SafeDirectNioEncoder(ByteBuffer buffer) {
+    NioEncoder(ByteBuffer buffer) {
       this.originalBuffer = buffer;
       this.buffer = buffer.duplicate().order(ByteOrder.LITTLE_ENDIAN);
       initialPosition = buffer.position();
@@ -1824,355 +1783,6 @@
   }
 
   /**
-   * A {@link CodedOutputStream} that writes directly to a direct {@link ByteBuffer} using {@code
-   * sun.misc.Unsafe}.
-   */
-  private static final class UnsafeDirectNioEncoder extends CodedOutputStream {
-    private final ByteBuffer originalBuffer;
-    private final ByteBuffer buffer;
-    private final long address;
-    private final long initialPosition;
-    private final long limit;
-    private final long oneVarintLimit;
-    private long position;
-
-    UnsafeDirectNioEncoder(ByteBuffer buffer) {
-      this.originalBuffer = buffer;
-      this.buffer = buffer.duplicate().order(ByteOrder.LITTLE_ENDIAN);
-      address = UnsafeUtil.addressOffset(buffer);
-      initialPosition = address + buffer.position();
-      limit = address + buffer.limit();
-      oneVarintLimit = limit - MAX_VARINT_SIZE;
-      position = initialPosition;
-    }
-
-    static boolean isSupported() {
-      return UnsafeUtil.hasUnsafeByteBufferOperations();
-    }
-
-    @Override
-    public void writeTag(int fieldNumber, int wireType) throws IOException {
-      writeUInt32NoTag(WireFormat.makeTag(fieldNumber, wireType));
-    }
-
-    @Override
-    public void writeInt32(int fieldNumber, int value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
-      writeInt32NoTag(value);
-    }
-
-    @Override
-    public void writeUInt32(int fieldNumber, int value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
-      writeUInt32NoTag(value);
-    }
-
-    @Override
-    public void writeFixed32(int fieldNumber, int value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
-      writeFixed32NoTag(value);
-    }
-
-    @Override
-    public void writeUInt64(int fieldNumber, long value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
-      writeUInt64NoTag(value);
-    }
-
-    @Override
-    public void writeFixed64(int fieldNumber, long value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);
-      writeFixed64NoTag(value);
-    }
-
-    @Override
-    public void writeBool(int fieldNumber, boolean value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
-      write((byte) (value ? 1 : 0));
-    }
-
-    @Override
-    public void writeString(int fieldNumber, String value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-      writeStringNoTag(value);
-    }
-
-    @Override
-    public void writeBytes(int fieldNumber, ByteString value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-      writeBytesNoTag(value);
-    }
-
-    @Override
-    public void writeByteArray(int fieldNumber, byte[] value) throws IOException {
-      writeByteArray(fieldNumber, value, 0, value.length);
-    }
-
-    @Override
-    public void writeByteArray(int fieldNumber, byte[] value, int offset, int length)
-        throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-      writeByteArrayNoTag(value, offset, length);
-    }
-
-    @Override
-    public void writeByteBuffer(int fieldNumber, ByteBuffer value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-      writeUInt32NoTag(value.capacity());
-      writeRawBytes(value);
-    }
-
-    @Override
-    public void writeMessage(int fieldNumber, MessageLite value) throws IOException {
-      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-      writeMessageNoTag(value);
-    }
-
-    @Override
-    public void writeMessageSetExtension(int fieldNumber, MessageLite value) throws IOException {
-      writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP);
-      writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber);
-      writeMessage(WireFormat.MESSAGE_SET_MESSAGE, value);
-      writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP);
-    }
-
-    @Override
-    public void writeRawMessageSetExtension(int fieldNumber, ByteString value) throws IOException {
-      writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP);
-      writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber);
-      writeBytes(WireFormat.MESSAGE_SET_MESSAGE, value);
-      writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP);
-    }
-
-    @Override
-    public void writeMessageNoTag(MessageLite value) throws IOException {
-      writeUInt32NoTag(value.getSerializedSize());
-      value.writeTo(this);
-    }
-
-    @Override
-    public void write(byte value) throws IOException {
-      if (position >= limit) {
-        throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1));
-      }
-      UnsafeUtil.putByte(position++, value);
-    }
-
-    @Override
-    public void writeBytesNoTag(ByteString value) throws IOException {
-      writeUInt32NoTag(value.size());
-      value.writeTo(this);
-    }
-
-    @Override
-    public void writeByteArrayNoTag(byte[] value, int offset, int length) throws IOException {
-      writeUInt32NoTag(length);
-      write(value, offset, length);
-    }
-
-    @Override
-    public void writeRawBytes(ByteBuffer value) throws IOException {
-      if (value.hasArray()) {
-        write(value.array(), value.arrayOffset(), value.capacity());
-      } else {
-        ByteBuffer duplicated = value.duplicate();
-        duplicated.clear();
-        write(duplicated);
-      }
-    }
-
-    @Override
-    public void writeInt32NoTag(int value) throws IOException {
-      if (value >= 0) {
-        writeUInt32NoTag(value);
-      } else {
-        // Must sign-extend.
-        writeUInt64NoTag(value);
-      }
-    }
-
-    @Override
-    public void writeUInt32NoTag(int value) throws IOException {
-      if (position <= oneVarintLimit) {
-        // Optimization to avoid bounds checks on each iteration.
-        while (true) {
-          if ((value & ~0x7F) == 0) {
-            UnsafeUtil.putByte(position++, (byte) value);
-            return;
-          } else {
-            UnsafeUtil.putByte(position++, (byte) ((value & 0x7F) | 0x80));
-            value >>>= 7;
-          }
-        }
-      } else {
-        while (position < limit) {
-          if ((value & ~0x7F) == 0) {
-            UnsafeUtil.putByte(position++, (byte) value);
-            return;
-          } else {
-            UnsafeUtil.putByte(position++, (byte) ((value & 0x7F) | 0x80));
-            value >>>= 7;
-          }
-        }
-        throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1));
-      }
-    }
-
-    @Override
-    public void writeFixed32NoTag(int value) throws IOException {
-      buffer.putInt(bufferPos(position), value);
-      position += FIXED32_SIZE;
-    }
-
-    @Override
-    public void writeUInt64NoTag(long value) throws IOException {
-      if (position <= oneVarintLimit) {
-        // Optimization to avoid bounds checks on each iteration.
-        while (true) {
-          if ((value & ~0x7FL) == 0) {
-            UnsafeUtil.putByte(position++, (byte) value);
-            return;
-          } else {
-            UnsafeUtil.putByte(position++, (byte) (((int) value & 0x7F) | 0x80));
-            value >>>= 7;
-          }
-        }
-      } else {
-        while (position < limit) {
-          if ((value & ~0x7FL) == 0) {
-            UnsafeUtil.putByte(position++, (byte) value);
-            return;
-          } else {
-            UnsafeUtil.putByte(position++, (byte) (((int) value & 0x7F) | 0x80));
-            value >>>= 7;
-          }
-        }
-        throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, 1));
-      }
-    }
-
-    @Override
-    public void writeFixed64NoTag(long value) throws IOException {
-      buffer.putLong(bufferPos(position), value);
-      position += FIXED64_SIZE;
-    }
-
-    @Override
-    public void write(byte[] value, int offset, int length) throws IOException {
-      if (value == null
-          || offset < 0
-          || length < 0
-          || (value.length - length) < offset
-          || (limit - length) < position) {
-        if (value == null) {
-          throw new NullPointerException("value");
-        }
-        throw new OutOfSpaceException(
-            String.format("Pos: %d, limit: %d, len: %d", position, limit, length));
-      }
-
-      UnsafeUtil.copyMemory(value, offset, position, length);
-      position += length;
-    }
-
-    @Override
-    public void writeLazy(byte[] value, int offset, int length) throws IOException {
-      write(value, offset, length);
-    }
-
-    @Override
-    public void write(ByteBuffer value) throws IOException {
-      try {
-        int length = value.remaining();
-        repositionBuffer(position);
-        buffer.put(value);
-        position += length;
-      } catch (BufferOverflowException e) {
-        throw new OutOfSpaceException(e);
-      }
-    }
-
-    @Override
-    public void writeLazy(ByteBuffer value) throws IOException {
-      write(value);
-    }
-
-    @Override
-    public void writeStringNoTag(String value) throws IOException {
-      long prevPos = position;
-      try {
-        // UTF-8 byte length of the string is at least its UTF-16 code unit length (value.length()),
-        // and at most 3 times of it. We take advantage of this in both branches below.
-        int maxEncodedSize = value.length() * Utf8.MAX_BYTES_PER_CHAR;
-        int maxLengthVarIntSize = computeUInt32SizeNoTag(maxEncodedSize);
-        int minLengthVarIntSize = computeUInt32SizeNoTag(value.length());
-        if (minLengthVarIntSize == maxLengthVarIntSize) {
-          // Save the current position and increment past the length field. We'll come back
-          // and write the length field after the encoding is complete.
-          int stringStart = bufferPos(position) + minLengthVarIntSize;
-          buffer.position(stringStart);
-
-          // Encode the string.
-          Utf8.encodeUtf8(value, buffer);
-
-          // Write the length and advance the position.
-          int length = buffer.position() - stringStart;
-          writeUInt32NoTag(length);
-          position += length;
-        } else {
-          // Calculate and write the encoded length.
-          int length = Utf8.encodedLength(value);
-          writeUInt32NoTag(length);
-
-          // Write the string and advance the position.
-          repositionBuffer(position);
-          Utf8.encodeUtf8(value, buffer);
-          position += length;
-        }
-      } catch (UnpairedSurrogateException e) {
-        // Roll back the change and convert to an IOException.
-        position = prevPos;
-        repositionBuffer(position);
-
-        // TODO(nathanmittler): We should throw an IOException here instead.
-        inefficientWriteStringNoTag(value, e);
-      } catch (IllegalArgumentException e) {
-        // Thrown by buffer.position() if out of range.
-        throw new OutOfSpaceException(e);
-      } catch (IndexOutOfBoundsException e) {
-        throw new OutOfSpaceException(e);
-      }
-    }
-
-    @Override
-    public void flush() {
-      // Update the position of the original buffer.
-      originalBuffer.position(bufferPos(position));
-    }
-
-    @Override
-    public int spaceLeft() {
-      return (int) (limit - position);
-    }
-
-    @Override
-    public int getTotalBytesWritten() {
-      return (int) (position - initialPosition);
-    }
-
-    private void repositionBuffer(long pos) {
-      buffer.position(bufferPos(pos));
-    }
-
-    private int bufferPos(long pos) {
-      return (int) (pos - address);
-    }
-  }
-
-  /**
    * Abstract base class for buffered encoders.
    */
   private abstract static class AbstractBufferedEncoder extends CodedOutputStream {
@@ -2241,17 +1851,19 @@
      */
     final void bufferUInt32NoTag(int value) {
       if (HAS_UNSAFE_ARRAY_OPERATIONS) {
-        final long originalPos = position;
+        final long originalPos = ARRAY_BASE_OFFSET + position;
+        long pos = originalPos;
         while (true) {
           if ((value & ~0x7F) == 0) {
-            UnsafeUtil.putByte(buffer, position++, (byte) value);
+            UNSAFE.putByte(buffer, pos++, (byte) value);
             break;
           } else {
-            UnsafeUtil.putByte(buffer, position++, (byte) ((value & 0x7F) | 0x80));
+            UNSAFE.putByte(buffer, pos++, (byte) ((value & 0x7F) | 0x80));
             value >>>= 7;
           }
         }
-        int delta = (int) (position - originalPos);
+        int delta = (int) (pos - originalPos);
+        position += delta;
         totalBytesWritten += delta;
       } else {
         while (true) {
@@ -2274,17 +1886,19 @@
      */
     final void bufferUInt64NoTag(long value) {
       if (HAS_UNSAFE_ARRAY_OPERATIONS) {
-        final long originalPos = position;
+        final long originalPos = ARRAY_BASE_OFFSET + position;
+        long pos = originalPos;
         while (true) {
           if ((value & ~0x7FL) == 0) {
-            UnsafeUtil.putByte(buffer, position++, (byte) value);
+            UNSAFE.putByte(buffer, pos++, (byte) value);
             break;
           } else {
-            UnsafeUtil.putByte(buffer, position++, (byte) (((int) value & 0x7F) | 0x80));
+            UNSAFE.putByte(buffer, pos++, (byte) (((int) value & 0x7F) | 0x80));
             value >>>= 7;
           }
         }
-        int delta = (int) (position - originalPos);
+        int delta = (int) (pos - originalPos);
+        position += delta;
         totalBytesWritten += delta;
       } else {
         while (true) {
@@ -2310,7 +1924,7 @@
       buffer[position++] = (byte) ((value >> 8) & 0xFF);
       buffer[position++] = (byte) ((value >> 16) & 0xFF);
       buffer[position++] = (byte) ((value >> 24) & 0xFF);
-      totalBytesWritten += FIXED32_SIZE;
+      totalBytesWritten += FIXED_32_SIZE;
     }
 
     /**
@@ -2326,7 +1940,7 @@
       buffer[position++] = (byte) ((int) (value >> 40) & 0xFF);
       buffer[position++] = (byte) ((int) (value >> 48) & 0xFF);
       buffer[position++] = (byte) ((int) (value >> 56) & 0xFF);
-      totalBytesWritten += FIXED64_SIZE;
+      totalBytesWritten += FIXED_64_SIZE;
     }
   }
 
@@ -2367,7 +1981,7 @@
 
     @Override
     public void writeFixed32(final int fieldNumber, final int value) throws IOException {
-      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED32_SIZE);
+      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED_32_SIZE);
       bufferTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
       bufferFixed32NoTag(value);
     }
@@ -2381,7 +1995,7 @@
 
     @Override
     public void writeFixed64(final int fieldNumber, final long value) throws IOException {
-      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED64_SIZE);
+      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED_64_SIZE);
       bufferTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);
       bufferFixed64NoTag(value);
     }
@@ -2507,7 +2121,7 @@
 
     @Override
     public void writeFixed32NoTag(final int value) throws IOException {
-      flushIfNotAvailable(FIXED32_SIZE);
+      flushIfNotAvailable(FIXED_32_SIZE);
       bufferFixed32NoTag(value);
     }
 
@@ -2519,7 +2133,7 @@
 
     @Override
     public void writeFixed64NoTag(final long value) throws IOException {
-      flushIfNotAvailable(FIXED64_SIZE);
+      flushIfNotAvailable(FIXED_64_SIZE);
       bufferFixed64NoTag(value);
     }
 
@@ -2670,7 +2284,7 @@
 
     @Override
     public void writeFixed32(final int fieldNumber, final int value) throws IOException {
-      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED32_SIZE);
+      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED_32_SIZE);
       bufferTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
       bufferFixed32NoTag(value);
     }
@@ -2684,7 +2298,7 @@
 
     @Override
     public void writeFixed64(final int fieldNumber, final long value) throws IOException {
-      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED64_SIZE);
+      flushIfNotAvailable(MAX_VARINT_SIZE + FIXED_64_SIZE);
       bufferTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);
       bufferFixed64NoTag(value);
     }
@@ -2810,7 +2424,7 @@
 
     @Override
     public void writeFixed32NoTag(final int value) throws IOException {
-      flushIfNotAvailable(FIXED32_SIZE);
+      flushIfNotAvailable(FIXED_32_SIZE);
       bufferFixed32NoTag(value);
     }
 
@@ -2822,7 +2436,7 @@
 
     @Override
     public void writeFixed64NoTag(final long value) throws IOException {
-      flushIfNotAvailable(FIXED64_SIZE);
+      flushIfNotAvailable(FIXED_64_SIZE);
       bufferFixed64NoTag(value);
     }
 
@@ -2986,4 +2600,65 @@
       position = 0;
     }
   }
+
+  /**
+   * Gets the {@code sun.misc.Unsafe} instance, or {@code null} if not available on this
+   * platform.
+   */
+  private static sun.misc.Unsafe getUnsafe() {
+    sun.misc.Unsafe unsafe = null;
+    try {
+      unsafe = AccessController.doPrivileged(new PrivilegedExceptionAction<sun.misc.Unsafe>() {
+        @Override
+        public sun.misc.Unsafe run() throws Exception {
+          Class<sun.misc.Unsafe> k = sun.misc.Unsafe.class;
+
+          for (Field f : k.getDeclaredFields()) {
+            f.setAccessible(true);
+            Object x = f.get(null);
+            if (k.isInstance(x)) {
+              return k.cast(x);
+            }
+          }
+          // The sun.misc.Unsafe field does not exist.
+          return null;
+        }
+      });
+    } catch (Throwable e) {
+      // Catching Throwable here due to the fact that Google AppEngine raises NoClassDefFoundError
+      // for Unsafe.
+    }
+
+    logger.log(Level.FINEST, "sun.misc.Unsafe: {}",
+        unsafe != null ? "available" : "unavailable");
+    return unsafe;
+  }
+
+  /**
+   * Indicates whether or not unsafe array operations are supported on this platform.
+   */
+  // TODO(nathanmittler): Add support for Android's MemoryBlock.
+  private static boolean supportsUnsafeArrayOperations() {
+    boolean supported = false;
+    if (UNSAFE != null) {
+      try {
+        UNSAFE.getClass().getMethod("arrayBaseOffset", Class.class);
+        UNSAFE.getClass().getMethod("putByte", Object.class, long.class, byte.class);
+        supported = true;
+      } catch (Throwable e) {
+        // Do nothing.
+      }
+    }
+    logger.log(Level.FINEST, "Unsafe array operations: {}",
+        supported ? "available" : "unavailable");
+    return supported;
+  }
+
+  /**
+   * Get the base offset for byte arrays, or {@code -1} if {@code sun.misc.Unsafe} is not
+   * available.
+   */
+  private static <T> int byteArrayBaseOffset() {
+    return HAS_UNSAFE_ARRAY_OPERATIONS ? UNSAFE.arrayBaseOffset(byte[].class) : -1;
+  }
 }
diff --git a/java/core/src/main/java/com/google/protobuf/Descriptors.java b/java/core/src/main/java/com/google/protobuf/Descriptors.java
index 75b16fe..e00ea34 100644
--- a/java/core/src/main/java/com/google/protobuf/Descriptors.java
+++ b/java/core/src/main/java/com/google/protobuf/Descriptors.java
@@ -30,10 +30,9 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.DescriptorProtos.*;
 import com.google.protobuf.Descriptors.FileDescriptor.Syntax;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -683,7 +682,9 @@
 
     /** Determines if the given field name is reserved. */
     public boolean isReservedName(final String name) {
-      checkNotNull(name);
+      if (name == null) {
+        throw new NullPointerException();
+      }
       for (final String reservedName : proto.getReservedNameList()) {
         if (reservedName.equals(name)) {
           return true;
@@ -870,10 +871,6 @@
         nestedTypes[i].setProto(proto.getNestedType(i));
       }
 
-      for (int i = 0; i < oneofs.length; i++) {
-        oneofs[i].setProto(proto.getOneofDecl(i));
-      }
-
       for (int i = 0; i < enumTypes.length; i++) {
         enumTypes[i].setProto(proto.getEnumType(i));
       }
@@ -1211,20 +1208,33 @@
       private final Object defaultDefault;
     }
 
-    // This method should match exactly with the ToJsonName() function in C++
-    // descriptor.cc.
-    private static String fieldNameToJsonName(String name) {
+    // TODO(xiaofeng): Implement it consistently across different languages. See b/24751348.
+    private static String fieldNameToLowerCamelCase(String name) {
       StringBuilder result = new StringBuilder(name.length());
       boolean isNextUpperCase = false;
       for (int i = 0; i < name.length(); i++) {
         Character ch = name.charAt(i);
-        if (ch == '_') {
-          isNextUpperCase = true;
-        } else if (isNextUpperCase) {
-          result.append(Character.toUpperCase(ch));
+        if (Character.isLowerCase(ch)) {
+          if (isNextUpperCase) {
+            result.append(Character.toUpperCase(ch));
+          } else {
+            result.append(ch);
+          }
+          isNextUpperCase = false;
+        } else if (Character.isUpperCase(ch)) {
+          if (i == 0) {
+            // Force first letter to lower-case.
+            result.append(Character.toLowerCase(ch));
+          } else {
+            // Capital letters after the first are left as-is.
+            result.append(ch);
+          }
+          isNextUpperCase = false;
+        } else if (Character.isDigit(ch)) {
+          result.append(ch);
           isNextUpperCase = false;
         } else {
-          result.append(ch);
+          isNextUpperCase = true;
         }
       }
       return result.toString();
@@ -1243,7 +1253,7 @@
       if (proto.hasJsonName()) {
         jsonName = proto.getJsonName();
       } else {
-        jsonName = fieldNameToJsonName(proto.getName());
+        jsonName = fieldNameToLowerCamelCase(proto.getName());
       }
 
       if (proto.hasType()) {
@@ -2122,7 +2132,7 @@
           // Can't happen, because addPackage() only fails when the name
           // conflicts with a non-package, but we have not yet added any
           // non-packages at this point.
-          throw new AssertionError(e);
+          assert false;
         }
       }
     }
@@ -2503,10 +2513,6 @@
 
     public int getFieldCount() { return fieldCount; }
 
-    public OneofOptions getOptions() {
-      return proto.getOptions();
-    }
-
     /** Get a list of this message type's fields. */
     public List<FieldDescriptor> getFields() {
       return Collections.unmodifiableList(Arrays.asList(fields));
@@ -2516,10 +2522,6 @@
       return fields[index];
     }
 
-    private void setProto(final OneofDescriptorProto proto) {
-      this.proto = proto;
-    }
-
     private OneofDescriptor(final OneofDescriptorProto proto,
                             final FileDescriptor file,
                             final Descriptor parent,
diff --git a/java/core/src/main/java/com/google/protobuf/DiscardUnknownFieldsParser.java b/java/core/src/main/java/com/google/protobuf/DiscardUnknownFieldsParser.java
deleted file mode 100644
index 7ae9434..0000000
--- a/java/core/src/main/java/com/google/protobuf/DiscardUnknownFieldsParser.java
+++ /dev/null
@@ -1,71 +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;
-
-/**
- * Parsers to discard unknown fields during parsing.
- */
-public final class DiscardUnknownFieldsParser {
-
-  /**
-   * Warps a given {@link Parser} into a new {@link Parser} that discards unknown fields during
-   * parsing.
-   *
-   * <p>Usage example:
-   * <pre>{@code
-     * private final static Parser<Foo> FOO_PARSER = DiscardUnknownFieldsParser.wrap(Foo.parser());
-     * Foo parseFooDiscardUnknown(ByteBuffer input) throws IOException {
-     *   return FOO_PARSER.parseFrom(input);
-     * }
-   * }</pre>
-   *
-   * <p>Like all other implementations of {@code Parser}, this parser is stateless and thread-safe.
-   *
-   * @param parser The delegated parser that parses messages.
-   * @return a {@link Parser} that will discard unknown fields during parsing.
-   */
-  public static final <T extends Message> Parser<T> wrap(final Parser<T> parser) {
-    return new AbstractParser<T>() {
-      @Override
-      public T parsePartialFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
-          throws InvalidProtocolBufferException {
-        try {
-          input.discardUnknownFields();
-          return parser.parsePartialFrom(input, extensionRegistry);
-        } finally {
-          input.unsetDiscardUnknownFields();
-        }
-      }
-    };
-  }
-
-  private DiscardUnknownFieldsParser() {}
-}
diff --git a/java/core/src/main/java/com/google/protobuf/DoubleArrayList.java b/java/core/src/main/java/com/google/protobuf/DoubleArrayList.java
index 867b85c..a9543b8 100644
--- a/java/core/src/main/java/com/google/protobuf/DoubleArrayList.java
+++ b/java/core/src/main/java/com/google/protobuf/DoubleArrayList.java
@@ -30,35 +30,34 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Internal.DoubleList;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.RandomAccess;
 
 /**
  * An implementation of {@link DoubleList} on top of a primitive array.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
-final class DoubleArrayList extends AbstractProtobufList<Double>
-    implements DoubleList, RandomAccess, PrimitiveNonBoxingCollection {
-
+final class DoubleArrayList
+    extends AbstractProtobufList<Double> implements DoubleList, RandomAccess {
+  
   private static final DoubleArrayList EMPTY_LIST = new DoubleArrayList();
   static {
     EMPTY_LIST.makeImmutable();
   }
-
+  
   public static DoubleArrayList emptyList() {
     return EMPTY_LIST;
   }
-
+  
   /**
    * The backing store for the list.
    */
   private double[] array;
-
+  
   /**
    * The size of the list distinct from the length of the array. That is, it is the number of
    * elements set in the list.
@@ -73,14 +72,13 @@
   }
 
   /**
-   * Constructs a new mutable {@code DoubleArrayList}
-   * containing the same elements as {@code other}.
+   * Constructs a new mutable {@code DoubleArrayList} containing the same elements as {@code other}.
    */
-  private DoubleArrayList(double[] other, int size) {
-    array = other;
+  private DoubleArrayList(double[] array, int size) {
+    this.array = array;
     this.size = size;
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -93,14 +91,14 @@
     if (size != other.size) {
       return false;
     }
-
+    
     final double[] arr = other.array;
     for (int i = 0; i < size; i++) {
       if (array[i] != arr[i]) {
         return false;
       }
     }
-
+    
     return true;
   }
 
@@ -121,7 +119,7 @@
     }
     return new DoubleArrayList(Arrays.copyOf(array, capacity), size);
   }
-
+  
   @Override
   public Double get(int index) {
     return getDouble(index);
@@ -173,7 +171,7 @@
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(makeOutOfBoundsExceptionMessage(index));
     }
-
+    
     if (size < array.length) {
       // Shift everything over to make room
       System.arraycopy(array, index, array, index + 1, size - index);
@@ -181,10 +179,10 @@
       // Resize to 1.5x the size
       int length = ((size * 3) / 2) + 1;
       double[] newArray = new double[length];
-
+      
       // Copy the first part directly
       System.arraycopy(array, 0, newArray, 0, index);
-
+      
       // Copy the rest shifted over by one to make room
       System.arraycopy(array, index, newArray, index + 1, size - index);
       array = newArray;
@@ -198,36 +196,38 @@
   @Override
   public boolean addAll(Collection<? extends Double> collection) {
     ensureIsMutable();
-
-    checkNotNull(collection);
-
+    
+    if (collection == null) {
+      throw new NullPointerException();
+    }
+    
     // We specialize when adding another DoubleArrayList to avoid boxing elements.
     if (!(collection instanceof DoubleArrayList)) {
       return super.addAll(collection);
     }
-
+    
     DoubleArrayList list = (DoubleArrayList) collection;
     if (list.size == 0) {
       return false;
     }
-
+    
     int overflow = Integer.MAX_VALUE - size;
     if (overflow < list.size) {
       // We can't actually represent a list this large.
       throw new OutOfMemoryError();
     }
-
+    
     int newSize = size + list.size;
     if (newSize > array.length) {
       array = Arrays.copyOf(array, newSize);
     }
-
+    
     System.arraycopy(list.array, 0, array, size, list.size);
     size = newSize;
     modCount++;
     return true;
   }
-
+  
   @Override
   public boolean remove(Object o) {
     ensureIsMutable();
@@ -256,7 +256,7 @@
   /**
    * Ensures that the provided {@code index} is within the range of {@code [0, size]}. Throws an
    * {@link IndexOutOfBoundsException} if it is not.
-   *
+   * 
    * @param index the index to verify is in range
    */
   private void ensureIndexInRange(int index) {
diff --git a/java/core/src/main/java/com/google/protobuf/DynamicMessage.java b/java/core/src/main/java/com/google/protobuf/DynamicMessage.java
index ba53202..859a9e8 100644
--- a/java/core/src/main/java/com/google/protobuf/DynamicMessage.java
+++ b/java/core/src/main/java/com/google/protobuf/DynamicMessage.java
@@ -30,12 +30,11 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.Descriptors.OneofDescriptor;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collections;
@@ -298,7 +297,7 @@
         } catch (InvalidProtocolBufferException e) {
           throw e.setUnfinishedMessage(builder.buildPartial());
         } catch (IOException e) {
-          throw new InvalidProtocolBufferException(e)
+          throw new InvalidProtocolBufferException(e.getMessage())
               .setUnfinishedMessage(builder.buildPartial());
         }
         return builder.buildPartial();
@@ -527,14 +526,6 @@
           fields.clearField(oldField);
         }
         oneofCases[index] = field;
-      } else if (field.getFile().getSyntax() == Descriptors.FileDescriptor.Syntax.PROTO3) {
-        if (!field.isRepeated()
-            && field.getJavaType() != FieldDescriptor.JavaType.MESSAGE
-            && value.equals(field.getDefaultValue())) {
-          // In proto3, setting a field to its default value is equivalent to clearing the field.
-          fields.clearField(field);
-          return this;
-        }
       }
       fields.setField(field, value);
       return this;
@@ -590,8 +581,9 @@
 
     @Override
     public Builder setUnknownFields(UnknownFieldSet unknownFields) {
-      if (getDescriptorForType().getFile().getSyntax() == Descriptors.FileDescriptor.Syntax.PROTO3
-          && CodedInputStream.getProto3DiscardUnknownFieldsDefault()) {
+      if (getDescriptorForType().getFile().getSyntax()
+          == Descriptors.FileDescriptor.Syntax.PROTO3) {
+        // Proto3 discards unknown fields.
         return this;
       }
       this.unknownFields = unknownFields;
@@ -600,8 +592,9 @@
 
     @Override
     public Builder mergeUnknownFields(UnknownFieldSet unknownFields) {
-      if (getDescriptorForType().getFile().getSyntax() == Descriptors.FileDescriptor.Syntax.PROTO3
-          && CodedInputStream.getProto3DiscardUnknownFieldsDefault()) {
+      if (getDescriptorForType().getFile().getSyntax()
+          == Descriptors.FileDescriptor.Syntax.PROTO3) {
+        // Proto3 discards unknown fields.
         return this;
       }
       this.unknownFields =
@@ -630,7 +623,9 @@
     /** Verifies that the value is EnumValueDescriptor and matches Enum Type. */
     private void ensureSingularEnumValueDescriptor(
         FieldDescriptor field, Object value) {
-      checkNotNull(value);
+      if (value == null) {
+        throw new NullPointerException();
+      }
       if (!(value instanceof EnumValueDescriptor)) {
         throw new IllegalArgumentException(
           "DynamicMessage should use EnumValueDescriptor to set Enum Value.");
diff --git a/java/core/src/main/java/com/google/protobuf/Extension.java b/java/core/src/main/java/com/google/protobuf/Extension.java
index 5df12e6..08ec5b4 100644
--- a/java/core/src/main/java/com/google/protobuf/Extension.java
+++ b/java/core/src/main/java/com/google/protobuf/Extension.java
@@ -58,7 +58,10 @@
     PROTO1,
   }
 
-  protected abstract ExtensionType getExtensionType();
+  protected ExtensionType getExtensionType() {
+    // TODO(liujisi): make this abstract after we fix proto1.
+    return ExtensionType.IMMUTABLE;
+  }
 
   /**
    * Type of a message extension.
@@ -67,7 +70,7 @@
     PROTO1,
     PROTO2,
   }
-
+  
   /**
    * If the extension is a message extension (i.e., getLiteType() == MESSAGE),
    * returns the type of the message, otherwise undefined.
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java b/java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java
index a22a74a..0067392 100644
--- a/java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java
@@ -32,6 +32,7 @@
 
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -100,7 +101,7 @@
 
   /** Get the unmodifiable singleton empty instance. */
   public static ExtensionRegistry getEmptyRegistry() {
-    return EMPTY_REGISTRY;
+    return EMPTY;
   }
 
 
@@ -242,11 +243,6 @@
     add(newExtensionInfo(extension), extension.getExtensionType());
   }
 
-  /** Add an extension from a generated file to the registry. */
-  public void add(final GeneratedMessage.GeneratedExtension<?, ?> extension) {
-    add((Extension<?, ?>) extension);
-  }
-
   static ExtensionInfo newExtensionInfo(final Extension<?, ?> extension) {
     if (extension.getDescriptor().getJavaType() ==
         FieldDescriptor.JavaType.MESSAGE) {
@@ -315,7 +311,7 @@
   private final Map<DescriptorIntPair, ExtensionInfo> mutableExtensionsByNumber;
 
   ExtensionRegistry(boolean empty) {
-    super(EMPTY_REGISTRY_LITE);
+    super(ExtensionRegistryLite.getEmptyRegistry());
     this.immutableExtensionsByName =
         Collections.<String, ExtensionInfo>emptyMap();
     this.mutableExtensionsByName =
@@ -325,7 +321,7 @@
     this.mutableExtensionsByNumber =
             Collections.<DescriptorIntPair, ExtensionInfo>emptyMap();
   }
-  static final ExtensionRegistry EMPTY_REGISTRY = new ExtensionRegistry(true);
+  private static final ExtensionRegistry EMPTY = new ExtensionRegistry(true);
 
   private void add(
       final ExtensionInfo extension,
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java b/java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java
deleted file mode 100644
index 89f7ab9..0000000
--- a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java
+++ /dev/null
@@ -1,96 +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 com.google.protobuf.ExtensionRegistryLite.EMPTY_REGISTRY_LITE;
-
-/**
- * A factory object to create instances of {@link ExtensionRegistryLite}.
- *
- * <p>
- * This factory detects (via reflection) if the full (non-Lite) protocol buffer libraries
- * are available, and if so, the instances returned are actually {@link ExtensionRegistry}.
- */
-final class ExtensionRegistryFactory {
-
-  static final String FULL_REGISTRY_CLASS_NAME = "com.google.protobuf.ExtensionRegistry";
-
-  /* Visible for Testing
-     @Nullable */
-  static final Class<?> EXTENSION_REGISTRY_CLASS = reflectExtensionRegistry();
-
-  /* @Nullable */
-  static Class<?> reflectExtensionRegistry() {
-    try {
-      return Class.forName(FULL_REGISTRY_CLASS_NAME);
-    } catch (ClassNotFoundException e) {
-      // The exception allocation is potentially expensive on Android (where it can be triggered
-      // many times at start up). Is there a way to ameliorate this?
-      return null;
-    }
-  }
-
-  /** Construct a new, empty instance. */
-  public static ExtensionRegistryLite create() {
-    if (EXTENSION_REGISTRY_CLASS != null) {
-      try {
-        return invokeSubclassFactory("newInstance");
-      } catch (Exception e) {
-        // return a Lite registry.
-      }
-    }
-    return new ExtensionRegistryLite();
-  }
-
-  /** Get the unmodifiable singleton empty instance. */
-  public static ExtensionRegistryLite createEmpty() {
-    if (EXTENSION_REGISTRY_CLASS != null) {
-      try {
-        return invokeSubclassFactory("getEmptyRegistry");
-      } catch (Exception e) {
-        // return a Lite registry.
-      }
-    }
-    return EMPTY_REGISTRY_LITE;
-  }
-
-
-  static boolean isFullRegistry(ExtensionRegistryLite registry) {
-    return EXTENSION_REGISTRY_CLASS != null
-        && EXTENSION_REGISTRY_CLASS.isAssignableFrom(registry.getClass());
-  }
-
-  private static final ExtensionRegistryLite invokeSubclassFactory(String methodName)
-      throws Exception {
-    return (ExtensionRegistryLite) EXTENSION_REGISTRY_CLASS
-        .getDeclaredMethod(methodName).invoke(null);
-  }
-}
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 f3d48d3..65cf738 100644
--- a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
@@ -79,22 +79,6 @@
   // applications. Need to support this feature on smaller granularity.
   private static volatile boolean eagerlyParseMessageSets = false;
 
-  // Visible for testing.
-  static final String EXTENSION_CLASS_NAME = "com.google.protobuf.Extension";
-
-  /* @Nullable */
-  static Class<?> resolveExtensionClass() {
-    try {
-      return Class.forName(EXTENSION_CLASS_NAME);
-    } catch (ClassNotFoundException e) {
-      // See comment in ExtensionRegistryFactory on the potential expense of this.
-      return null;
-    }
-  }
-
-  /* @Nullable */
-  private static final Class<?> extensionClass = resolveExtensionClass();
-
   public static boolean isEagerlyParseMessageSets() {
     return eagerlyParseMessageSets;
   }
@@ -103,25 +87,16 @@
     eagerlyParseMessageSets = isEagerlyParse;
   }
 
-  /**
-   * Construct a new, empty instance.
-   *
-   * <p>This may be an {@code ExtensionRegistry} if the full (non-Lite) proto libraries are
-   * available.
-   */
+  /** Construct a new, empty instance. */
   public static ExtensionRegistryLite newInstance() {
-    return ExtensionRegistryFactory.create();
+    return new ExtensionRegistryLite();
   }
 
-  /**
-   * Get the unmodifiable singleton empty instance of either ExtensionRegistryLite or
-   * {@code ExtensionRegistry} (if the full (non-Lite) proto libraries are available).
-   */
+  /** Get the unmodifiable singleton empty instance. */
   public static ExtensionRegistryLite getEmptyRegistry() {
-    return ExtensionRegistryFactory.createEmpty();
+    return EMPTY;
   }
 
-
   /** Returns an unmodifiable view of the registry. */
   public ExtensionRegistryLite getUnmodifiable() {
     return new ExtensionRegistryLite(this);
@@ -153,23 +128,6 @@
       extension);
   }
 
-  /**
-   * Add an extension from a lite generated file to the registry only if it is
-   * a non-lite extension i.e. {@link GeneratedMessageLite.GeneratedExtension}. */
-  public final void add(ExtensionLite<?, ?> extension) {
-    if (GeneratedMessageLite.GeneratedExtension.class.isAssignableFrom(extension.getClass())) {
-      add((GeneratedMessageLite.GeneratedExtension<?, ?>) extension);
-    }
-    if (ExtensionRegistryFactory.isFullRegistry(this)) {
-      try {
-        this.getClass().getMethod("add", extensionClass).invoke(this, extension);
-      } catch (Exception e) {
-        throw new IllegalArgumentException(
-            String.format("Could not invoke ExtensionRegistry#add for %s", extension), e);
-      }
-    }
-  }
-
   // =================================================================
   // Private stuff.
 
@@ -181,11 +139,9 @@
         new HashMap<ObjectIntPair,
                     GeneratedMessageLite.GeneratedExtension<?, ?>>();
   }
-  static final ExtensionRegistryLite EMPTY_REGISTRY_LITE =
-      new ExtensionRegistryLite(true);
 
   ExtensionRegistryLite(ExtensionRegistryLite other) {
-    if (other == EMPTY_REGISTRY_LITE) {
+    if (other == EMPTY) {
       this.extensionsByNumber = Collections.emptyMap();
     } else {
       this.extensionsByNumber =
@@ -197,9 +153,11 @@
                     GeneratedMessageLite.GeneratedExtension<?, ?>>
       extensionsByNumber;
 
-  ExtensionRegistryLite(boolean empty) {
+  private ExtensionRegistryLite(boolean empty) {
     this.extensionsByNumber = Collections.emptyMap();
   }
+  private static final ExtensionRegistryLite EMPTY =
+    new ExtensionRegistryLite(true);
 
   /** A (Object, int) pair, used as a map key. */
   private static final class ObjectIntPair {
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 8a9239e..4e89709 100644
--- a/java/core/src/main/java/com/google/protobuf/FieldSet.java
+++ b/java/core/src/main/java/com/google/protobuf/FieldSet.java
@@ -30,9 +30,8 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.LazyField.LazyIterator;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -121,21 +120,21 @@
   public boolean isImmutable() {
     return isImmutable;
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
       return true;
     }
-
+    
     if (!(o instanceof FieldSet)) {
       return false;
     }
-
+    
     FieldSet<?> other = (FieldSet<?>) o;
-    return fields.equals(other.fields);
+    return other.fields.equals(other.fields);
   }
-
+  
   @Override
   public int hashCode() {
     return fields.hashCode();
@@ -221,7 +220,6 @@
     return fields.entrySet().iterator();
   }
 
-
   /**
    * Useful for implementing
    * {@link Message#hasField(Descriptors.FieldDescriptor)}.
@@ -386,7 +384,9 @@
    */
   private static void verifyType(final WireFormat.FieldType type,
                                  final Object value) {
-    checkNotNull(value);
+    if (value == null) {
+      throw new NullPointerException();
+    }
 
     boolean isValid = false;
     switch (type.getJavaType()) {
@@ -493,7 +493,7 @@
   }
 
   /**
-   * Like {@link Message.Builder#mergeFrom(Message)}, but merges from another
+   * Like {@link Message.Builder#mergeFrom(Message)}, but merges from another 
    * {@link FieldSet}.
    */
   public void mergeFrom(final FieldSet<FieldDescriptorType> other) {
@@ -638,11 +638,10 @@
    *               {@link Message#getField(Descriptors.FieldDescriptor)} for
    *               this field.
    */
-  static void writeElement(
-      final CodedOutputStream output,
-      final WireFormat.FieldType type,
-      final int number,
-      final Object value) throws IOException {
+  private static void writeElement(final CodedOutputStream output,
+                                   final WireFormat.FieldType type,
+                                   final int number,
+                                   final Object value) throws IOException {
     // Special case for groups, which need a start and end tag; other fields
     // can just use writeTag() and writeFieldNoTag().
     if (type == WireFormat.FieldType.GROUP) {
@@ -805,8 +804,9 @@
    *               {@link Message#getField(Descriptors.FieldDescriptor)} for
    *               this field.
    */
-  static int computeElementSize(
-      final WireFormat.FieldType type, final int number, final Object value) {
+  private static int computeElementSize(
+      final WireFormat.FieldType type,
+      final int number, final Object value) {
     int tagSize = CodedOutputStream.computeTagSize(number);
     if (type == WireFormat.FieldType.GROUP) {
       // Only count the end group tag for proto2 messages as for proto1 the end
diff --git a/java/core/src/main/java/com/google/protobuf/FloatArrayList.java b/java/core/src/main/java/com/google/protobuf/FloatArrayList.java
index 7664558..63cb6d7 100644
--- a/java/core/src/main/java/com/google/protobuf/FloatArrayList.java
+++ b/java/core/src/main/java/com/google/protobuf/FloatArrayList.java
@@ -30,35 +30,33 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Internal.FloatList;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.RandomAccess;
 
 /**
  * An implementation of {@link FloatList} on top of a primitive array.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
-final class FloatArrayList extends AbstractProtobufList<Float>
-    implements FloatList, RandomAccess, PrimitiveNonBoxingCollection {
-
+final class FloatArrayList extends AbstractProtobufList<Float> implements FloatList, RandomAccess {
+  
   private static final FloatArrayList EMPTY_LIST = new FloatArrayList();
   static {
     EMPTY_LIST.makeImmutable();
   }
-
+  
   public static FloatArrayList emptyList() {
     return EMPTY_LIST;
   }
-
+  
   /**
    * The backing store for the list.
    */
   private float[] array;
-
+  
   /**
    * The size of the list distinct from the length of the array. That is, it is the number of
    * elements set in the list.
@@ -73,14 +71,13 @@
   }
 
   /**
-   * Constructs a new mutable {@code FloatArrayList}
-   * containing the same elements as {@code other}.
+   * Constructs a new mutable {@code FloatArrayList} containing the same elements as {@code other}.
    */
-  private FloatArrayList(float[] other, int size) {
-    array = other;
+  private FloatArrayList(float[] array, int size) {
+    this.array = array;
     this.size = size;
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -93,14 +90,14 @@
     if (size != other.size) {
       return false;
     }
-
+    
     final float[] arr = other.array;
     for (int i = 0; i < size; i++) {
       if (array[i] != arr[i]) {
         return false;
       }
     }
-
+    
     return true;
   }
 
@@ -120,7 +117,7 @@
     }
     return new FloatArrayList(Arrays.copyOf(array, capacity), size);
   }
-
+  
   @Override
   public Float get(int index) {
     return getFloat(index);
@@ -172,7 +169,7 @@
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(makeOutOfBoundsExceptionMessage(index));
     }
-
+    
     if (size < array.length) {
       // Shift everything over to make room
       System.arraycopy(array, index, array, index + 1, size - index);
@@ -180,10 +177,10 @@
       // Resize to 1.5x the size
       int length = ((size * 3) / 2) + 1;
       float[] newArray = new float[length];
-
+      
       // Copy the first part directly
       System.arraycopy(array, 0, newArray, 0, index);
-
+      
       // Copy the rest shifted over by one to make room
       System.arraycopy(array, index, newArray, index + 1, size - index);
       array = newArray;
@@ -197,36 +194,38 @@
   @Override
   public boolean addAll(Collection<? extends Float> collection) {
     ensureIsMutable();
-
-    checkNotNull(collection);
-
+    
+    if (collection == null) {
+      throw new NullPointerException();
+    }
+    
     // We specialize when adding another FloatArrayList to avoid boxing elements.
     if (!(collection instanceof FloatArrayList)) {
       return super.addAll(collection);
     }
-
+    
     FloatArrayList list = (FloatArrayList) collection;
     if (list.size == 0) {
       return false;
     }
-
+    
     int overflow = Integer.MAX_VALUE - size;
     if (overflow < list.size) {
       // We can't actually represent a list this large.
       throw new OutOfMemoryError();
     }
-
+    
     int newSize = size + list.size;
     if (newSize > array.length) {
       array = Arrays.copyOf(array, newSize);
     }
-
+    
     System.arraycopy(list.array, 0, array, size, list.size);
     size = newSize;
     modCount++;
     return true;
   }
-
+  
   @Override
   public boolean remove(Object o) {
     ensureIsMutable();
@@ -255,7 +254,7 @@
   /**
    * Ensures that the provided {@code index} is within the range of {@code [0, size]}. Throws an
    * {@link IndexOutOfBoundsException} if it is not.
-   *
+   * 
    * @param index the index to verify is in range
    */
   private void ensureIndexInRange(int index) {
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
index 60179e3..790cb62 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
@@ -355,29 +355,30 @@
     // Noop for messages without extensions.
   }
 
-  /**
-   * TODO(xiaofeng): remove this after b/29368482 is fixed. We need to move this
-   * interface to AbstractMessage in order to versioning GeneratedMessage but
-   * this move breaks binary compatibility for AppEngine. After AppEngine is
-   * fixed we can exlude this from google3.
-   */
-  protected interface BuilderParent extends AbstractMessage.BuilderParent {}
-
-  /**
-   * TODO(xiaofeng): remove this together with GeneratedMessage.BuilderParent.
-   */
   protected abstract Message.Builder newBuilderForType(BuilderParent parent);
 
-  @Override
-  protected Message.Builder newBuilderForType(final AbstractMessage.BuilderParent parent) {
-    return newBuilderForType(new BuilderParent() {
-      @Override
-      public void markDirty() {
-        parent.markDirty();
-      }
-    });
-  }
+  /**
+   * Interface for the parent of a Builder that allows the builder to
+   * communicate invalidations back to the parent for use when using nested
+   * builders.
+   */
+  protected interface BuilderParent {
 
+    /**
+     * A builder becomes dirty whenever a field is modified -- including fields
+     * in nested builders -- and becomes clean when build() is called.  Thus,
+     * when a builder becomes dirty, all its parents become dirty as well, and
+     * when it becomes clean, all its children become clean.  The dirtiness
+     * state is used to invalidate certain cached values.
+     * <br>
+     * To this end, a builder calls markAsDirty() on its parent whenever it
+     * transitions from clean to dirty.  The parent must propagate this call to
+     * its own parent, unless it was already dirty, in which case the
+     * grandparent must necessarily already be dirty as well.  The parent can
+     * only transition back to "clean" after calling build() on all children.
+     */
+    void markDirty();
+  }
 
   @SuppressWarnings("unchecked")
   public abstract static class Builder <BuilderType extends Builder<BuilderType>>
@@ -402,7 +403,6 @@
       this.builderParent = builderParent;
     }
 
-    @Override
     void dispose() {
       builderParent = null;
     }
@@ -420,7 +420,6 @@
      * Called by the subclass or a builder to notify us that a message was
      * built and may be cached and therefore invalidations are needed.
      */
-    @Override
     protected void markClean() {
       this.isClean = true;
     }
@@ -756,33 +755,6 @@
     <Type> Type getExtension(
         ExtensionLite<MessageType, List<Type>> extension,
         int index);
-
-    /** Check if a singular extension is present. */
-    <Type> boolean hasExtension(
-        Extension<MessageType, Type> extension);
-    /** Check if a singular extension is present. */
-    <Type> boolean hasExtension(
-        GeneratedExtension<MessageType, Type> extension);
-    /** Get the number of elements in a repeated extension. */
-    <Type> int getExtensionCount(
-        Extension<MessageType, List<Type>> extension);
-    /** Get the number of elements in a repeated extension. */
-    <Type> int getExtensionCount(
-        GeneratedExtension<MessageType, List<Type>> extension);
-    /** Get the value of an extension. */
-    <Type> Type getExtension(
-        Extension<MessageType, Type> extension);
-    /** Get the value of an extension. */
-    <Type> Type getExtension(
-        GeneratedExtension<MessageType, Type> extension);
-    /** Get one element of a repeated extension. */
-    <Type> Type getExtension(
-        Extension<MessageType, List<Type>> extension,
-        int index);
-    /** Get one element of a repeated extension. */
-    <Type> Type getExtension(
-        GeneratedExtension<MessageType, List<Type>> extension,
-        int index);
   }
 
   /**
@@ -854,7 +826,6 @@
 
     /** Check if a singular extension is present. */
     @Override
-    @SuppressWarnings("unchecked")
     public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extensionLite) {
       Extension<MessageType, Type> extension = checkNotLite(extensionLite);
 
@@ -864,7 +835,6 @@
 
     /** Get the number of elements in a repeated extension. */
     @Override
-    @SuppressWarnings("unchecked")
     public final <Type> int getExtensionCount(
         final ExtensionLite<MessageType, List<Type>> extensionLite) {
       Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
@@ -911,53 +881,6 @@
           extensions.getRepeatedField(descriptor, index));
     }
 
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(final Extension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final Extension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final GeneratedExtension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(final Extension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get one element of a repeated extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final Extension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-    /** Get one element of a repeated extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-
     /** Called by subclasses to check if all extensions are initialized. */
     protected boolean extensionsAreInitialized() {
       return extensions.isInitialized();
@@ -1346,95 +1269,6 @@
       return (BuilderType) this;
     }
 
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(final Extension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final Extension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final GeneratedExtension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(final Extension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final Extension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-    /** Set the value of an extension. */
-    public final <Type> BuilderType setExtension(
-        final Extension<MessageType, Type> extension, final Type value) {
-      return setExtension((ExtensionLite<MessageType, Type>) extension, value);
-    }
-    /** Set the value of an extension. */
-    public <Type> BuilderType setExtension(
-        final GeneratedExtension<MessageType, Type> extension, final Type value) {
-      return setExtension((ExtensionLite<MessageType, Type>) extension, value);
-    }
-    /** Set the value of one element of a repeated extension. */
-    public final <Type> BuilderType setExtension(
-        final Extension<MessageType, List<Type>> extension,
-        final int index, final Type value) {
-      return setExtension((ExtensionLite<MessageType, List<Type>>) extension, index, value);
-    }
-    /** Set the value of one element of a repeated extension. */
-    public <Type> BuilderType setExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension,
-        final int index, final Type value) {
-      return setExtension((ExtensionLite<MessageType, List<Type>>) extension, index, value);
-    }
-    /** Append a value to a repeated extension. */
-    public final <Type> BuilderType addExtension(
-        final Extension<MessageType, List<Type>> extension, final Type value) {
-      return addExtension((ExtensionLite<MessageType, List<Type>>) extension, value);
-    }
-    /** Append a value to a repeated extension. */
-    public <Type> BuilderType addExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension, final Type value) {
-      return addExtension((ExtensionLite<MessageType, List<Type>>) extension, value);
-    }
-    /** Clear an extension. */
-    public final <Type> BuilderType clearExtension(
-        final Extension<MessageType, ?> extension) {
-      return clearExtension((ExtensionLite<MessageType, ?>) extension);
-    }
-    /** Clear an extension. */
-    public <Type> BuilderType clearExtension(
-        final GeneratedExtension<MessageType, ?> extension) {
-      return clearExtension((ExtensionLite<MessageType, ?>) extension);
-    }
-
     /** Called by subclasses to check if all extensions are initialized. */
     protected boolean extensionsAreInitialized() {
       return extensions.isInitialized();
@@ -2557,7 +2391,6 @@
       }
 
       @Override
-      @SuppressWarnings("unchecked")
       public Object get(GeneratedMessage message) {
         List result = new ArrayList();
         for (int i = 0; i < getRepeatedCount(message); i++) {
@@ -2567,7 +2400,6 @@
       }
 
       @Override
-      @SuppressWarnings("unchecked")
       public Object get(Builder builder) {
         List result = new ArrayList();
         for (int i = 0; i < getRepeatedCount(builder); i++) {
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 0908464..c5adc5a 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
@@ -31,27 +31,26 @@
 package com.google.protobuf;
 
 import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream;
+import com.google.protobuf.GeneratedMessageLite.EqualsVisitor.NotEqualsException;
 import com.google.protobuf.Internal.BooleanList;
 import com.google.protobuf.Internal.DoubleList;
-import com.google.protobuf.Internal.EnumLiteMap;
 import com.google.protobuf.Internal.FloatList;
 import com.google.protobuf.Internal.IntList;
 import com.google.protobuf.Internal.LongList;
 import com.google.protobuf.Internal.ProtobufList;
 import com.google.protobuf.WireFormat.FieldType;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Lite version of {@link GeneratedMessage}.
@@ -60,21 +59,15 @@
  */
 public abstract class GeneratedMessageLite<
     MessageType extends GeneratedMessageLite<MessageType, BuilderType>,
-    BuilderType extends GeneratedMessageLite.Builder<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();
-
+  
   /** For use by generated code only.  */
   protected int memoizedSerializedSize = -1;
-
+  
   @Override
   @SuppressWarnings("unchecked") // Guaranteed by runtime.
   public final Parser<MessageType> getParserForType() {
@@ -113,22 +106,14 @@
   @SuppressWarnings("unchecked") // Guaranteed by runtime
   @Override
   public int hashCode() {
-    if (memoizedHashCode != 0) {
-      return memoizedHashCode;
+    if (memoizedHashCode == 0) {
+      HashCodeVisitor visitor = new HashCodeVisitor();
+      visit(visitor, (MessageType) this);
+      memoizedHashCode = visitor.hashCode;
     }
-    // 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) {
@@ -140,41 +125,35 @@
     }
     return memoizedHashCode;
   }
-  // END REGULAR
-
+  
   @SuppressWarnings("unchecked") // Guaranteed by isInstance + runtime
   @Override
   public boolean equals(Object other) {
     if (this == other) {
       return true;
     }
-
+    
     if (!getDefaultInstanceForType().getClass().isInstance(other)) {
       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) {
+    } catch (NotEqualsException e) {
       return false;
     }
     return true;
-    // END REGULAR
   }
-
-  // BEGIN REGULAR
-  /** Same as {@link #equals(Object)} but throws {@code NotEqualsException}. */
+  
+  /**
+   * 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;
     }
@@ -182,22 +161,23 @@
     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.
 
-  /** Lazily initializes unknown fields. */
+  /**
+   * Lazily initializes unknown fields.
+   */
   private final void ensureUnknownFieldsInitialized() {
     if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
       unknownFields = UnknownFieldSetLite.newInstance();
     }
   }
-
+  
   /**
    * Called by subclasses to parse an unknown field. For use by generated code only.
-   *
+   * 
    * @return {@code true} unless the tag is an end-group tag.
    */
   protected boolean parseUnknownField(int tag, CodedInputStream input) throws IOException {
@@ -205,7 +185,7 @@
     if (WireFormat.getTagWireType(tag) == WireFormat.WIRETYPE_END_GROUP) {
       return false;
     }
-
+    
     ensureUnknownFieldsInitialized();
     return unknownFields.mergeFieldFrom(tag, input);
   }
@@ -217,7 +197,7 @@
     ensureUnknownFieldsInitialized();
     unknownFields.mergeVarintField(tag, value);
   }
-
+  
   /**
    * Called by subclasses to parse an unknown field. For use by generated code only.
    */
@@ -225,7 +205,7 @@
     ensureUnknownFieldsInitialized();
     unknownFields.mergeLengthDelimitedField(fieldNumber, value);
   }
-
+  
   /**
    * Called by subclasses to complete parsing. For use by generated code only.
    */
@@ -235,27 +215,12 @@
     unknownFields.makeImmutable();
   }
 
-  protected final <
-    MessageType extends GeneratedMessageLite<MessageType, BuilderType>,
-    BuilderType extends GeneratedMessageLite.Builder<MessageType, BuilderType>>
-        BuilderType createBuilder() {
-    return (BuilderType) dynamicMethod(MethodToInvoke.NEW_BUILDER);
-  }
-
-  protected final <
-    MessageType extends GeneratedMessageLite<MessageType, BuilderType>,
-    BuilderType extends GeneratedMessageLite.Builder<MessageType, BuilderType>>
-        BuilderType createBuilder(MessageType prototype) {
-    return ((BuilderType) createBuilder()).mergeFrom(prototype);
-  }
-
   @Override
   public final boolean isInitialized() {
-    return isInitialized((MessageType) this, Boolean.TRUE);
+    return dynamicMethod(MethodToInvoke.IS_INITIALIZED, Boolean.TRUE) != null;
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public final BuilderType toBuilder() {
     BuilderType builder = (BuilderType) dynamicMethod(MethodToInvoke.NEW_BUILDER);
     builder.mergeFrom((MessageType) this);
@@ -269,13 +234,9 @@
    * For use by generated code only.
    */
   public static enum MethodToInvoke {
-    IS_INITIALIZED,
-    // BEGIN REGULAR
-    VISIT,
-    // END REGULAR
     // Rely on/modify instance state
-    GET_MEMOIZED_IS_INITIALIZED,
-    SET_MEMOIZED_IS_INITIALIZED,
+    IS_INITIALIZED,
+    VISIT,
     MERGE_FROM_STREAM,
     MAKE_IMMUTABLE,
 
@@ -291,30 +252,25 @@
    * Theses different kinds of operations are required to implement message-level operations for
    * builders in the runtime. This method bundles those operations to reduce the generated methods
    * 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.
-   *       It doesn't use or modify any memoized value.
-   *   <li>{@code GET_MEMOIZED_IS_INITIALIZED} returns the memoized {@code isInitialized} byte
-   *       value.
-   *   <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.
+   * <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} is parameterized with a {@code Boolean} detailing whether to
+   * memoize. It returns {@code null} for false and the default instance for true. We optionally
+   * memoize to support the Builder case, where memoization is not desired.
+   * <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
    * away entirely on Android.
-   *
-   * <p>For use by generated code only.
+   * <p>
+   * For use by generated code only.
    */
   protected abstract Object dynamicMethod(MethodToInvoke method, Object arg0, Object arg1);
 
@@ -332,17 +288,14 @@
     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
-
-
-
+  
   /**
-   * Merge some unknown fields into the {@link UnknownFieldSetLite} for this message.
+   * Merge some unknown fields into the {@link UnknownFieldSetLite} for this
+   * message.
    *
    * <p>For use by generated code only.
    */
@@ -375,7 +328,7 @@
       if (isBuilt) {
         MessageType newInstance =
             (MessageType) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE);
-        mergeFromInstance(newInstance, instance);
+        newInstance.visit(MergeFromVisitor.INSTANCE, instance);
         instance = newInstance;
         isBuilt = false;
       }
@@ -406,9 +359,9 @@
       if (isBuilt) {
         return instance;
       }
-
+      
       instance.makeImmutable();
-
+      
       isBuilt = true;
       return instance;
     }
@@ -421,33 +374,24 @@
       }
       return result;
     }
-
+    
     @Override
     protected BuilderType internalMergeFrom(MessageType message) {
       return mergeFrom(message);
     }
-
+    
     /** All subclasses implement this. */
     public BuilderType mergeFrom(MessageType message) {
       copyOnWrite();
-      mergeFromInstance(instance, message);
+      instance.visit(MergeFromVisitor.INSTANCE, message);
       return (BuilderType) this;
     }
-
-    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
-    }
-
+    
     @Override
     public MessageType getDefaultInstanceForType() {
       return defaultInstance;
     }
-
+    
     @Override
     public BuilderType mergeFrom(
         com.google.protobuf.CodedInputStream input,
@@ -510,7 +454,6 @@
      */
     protected FieldSet<ExtensionDescriptor> extensions = FieldSet.newFieldSet();
 
-    @SuppressWarnings("unchecked")
     protected final void mergeExtensionFields(final MessageType other) {
       if (extensions.isImmutable()) {
         extensions = extensions.clone();
@@ -518,27 +461,25 @@
       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.
-     *
+     * 
      * <p>For use by generated code only.
-     *
+     * 
      * @return {@code true} unless the tag is an end-group tag.
      */
     protected <MessageType extends MessageLite> boolean parseUnknownField(
         MessageType defaultInstance,
         CodedInputStream input,
         ExtensionRegistryLite extensionRegistry,
-        int tag)
-        throws IOException {
+        int tag) throws IOException {
+      int wireType = WireFormat.getTagWireType(tag);
       int fieldNumber = WireFormat.getTagFieldNumber(tag);
 
       // TODO(dweis): How much bytecode would be saved by not requiring the generated code to
@@ -546,17 +487,6 @@
       GeneratedExtension<MessageType, ?> extension = extensionRegistry.findLiteExtensionByNumber(
           defaultInstance, fieldNumber);
 
-      return parseExtension(input, extensionRegistry, extension, tag, fieldNumber);
-    }
-
-    private boolean parseExtension(
-        CodedInputStream input,
-        ExtensionRegistryLite extensionRegistry,
-        GeneratedExtension<?, ?> extension,
-        int tag,
-        int fieldNumber)
-        throws IOException {
-      int wireType = WireFormat.getTagWireType(tag);
       boolean unknown = false;
       boolean packed = false;
       if (extension == null) {
@@ -578,7 +508,7 @@
       if (unknown) {  // Unknown field or wrong wire type.  Skip.
         return parseUnknownField(tag, input);
       }
-      
+
       if (packed) {
         int length = input.readRawVarint32();
         int limit = input.pushLimit(length);
@@ -657,148 +587,10 @@
                               extension.singularToFieldSetType(value));
         }
       }
+
       return true;
     }
     
-    /**
-     * Parse an unknown field or an extension. For use by generated code only.
-     *
-     * <p>For use by generated code only.
-     *
-     * @return {@code true} unless the tag is an end-group tag.
-     */
-    protected <MessageType extends MessageLite> boolean parseUnknownFieldAsMessageSet(
-        MessageType defaultInstance,
-        CodedInputStream input,
-        ExtensionRegistryLite extensionRegistry,
-        int tag)
-        throws IOException {
-
-      if (tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
-        mergeMessageSetExtensionFromCodedStream(defaultInstance, input, extensionRegistry);
-        return true;
-      }
-
-      // TODO(dweis): Do we really want to support non message set wire format in message sets?
-      // Full runtime does... So we do for now.
-      int wireType = WireFormat.getTagWireType(tag);
-      if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
-        return parseUnknownField(defaultInstance, input, extensionRegistry, tag);
-      } else {
-        // TODO(dweis): Should we throw on invalid input? Full runtime does not...
-        return input.skipField(tag);
-      }
-    }
-
-    /**
-     * Merges the message set from the input stream; requires message set wire format.
-     * 
-     * @param defaultInstance the default instance of the containing message we are parsing in
-     * @param input the stream to parse from
-     * @param extensionRegistry the registry to use when parsing
-     */
-    private <MessageType extends MessageLite> void mergeMessageSetExtensionFromCodedStream(
-        MessageType defaultInstance,
-        CodedInputStream input,
-        ExtensionRegistryLite extensionRegistry)
-        throws IOException {
-      // 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"
-      GeneratedExtension<?, ?> 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.
-      while (true) {
-        final int tag = input.readTag();
-        if (tag == 0) {
-          break;
-        }
-
-        if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
-          typeId = input.readUInt32();
-          if (typeId != 0) {
-            extension = extensionRegistry.findLiteExtensionByNumber(defaultInstance, typeId);
-          }
-
-        } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
-          if (typeId != 0) {
-            if (extension != null) {
-              // We already know the type, so we can parse directly from the
-              // input with no copying.  Hooray!
-              eagerlyMergeMessageSetExtension(input, extension, extensionRegistry, typeId);
-              rawBytes = null;
-              continue;
-            }
-          }
-          // We haven't seen a type ID yet or we want parse message lazily.
-          rawBytes = input.readBytes();
-
-        } else { // Unknown tag. Skip it.
-          if (!input.skipField(tag)) {
-            break; // End of group
-          }
-        }
-      }
-      input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
-
-      // Process the raw bytes.
-      if (rawBytes != null && typeId != 0) { // Zero is not a valid type ID.
-        if (extension != null) { // We known the type
-          mergeMessageSetExtensionFromBytes(rawBytes, extensionRegistry, extension);
-        } else { // We don't know how to parse this. Ignore it.
-          if (rawBytes != null) {
-            mergeLengthDelimitedField(typeId, rawBytes);
-          }
-        }
-      }
-    }
-
-    private void eagerlyMergeMessageSetExtension(
-        CodedInputStream input,
-        GeneratedExtension<?, ?> extension,
-        ExtensionRegistryLite extensionRegistry,
-        int typeId)
-        throws IOException {
-      int fieldNumber = typeId;
-      int tag = WireFormat.makeTag(typeId, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-      parseExtension(input, extensionRegistry, extension, tag, fieldNumber);
-    }
-
-    private void mergeMessageSetExtensionFromBytes(
-        ByteString rawBytes,
-        ExtensionRegistryLite extensionRegistry,
-        GeneratedExtension<?, ?> extension)
-        throws IOException {
-      MessageLite.Builder subBuilder = null;
-      MessageLite existingValue = (MessageLite) extensions.getField(extension.descriptor);
-      if (existingValue != null) {
-        subBuilder = existingValue.toBuilder();
-      }
-      if (subBuilder == null) {
-        subBuilder = extension.getMessageDefaultInstance().newBuilderForType();
-      }
-      rawBytes.newCodedInput().readMessage(subBuilder, extensionRegistry);
-      MessageLite value = subBuilder.build();
-
-      extensions.setField(extension.descriptor, extension.singularToFieldSetType(value));
-    }
-
     private void verifyExtensionContainingType(
         final GeneratedExtension<MessageType, ?> extension) {
       if (extension.getContainingTypeDefaultInstance() !=
@@ -815,7 +607,7 @@
     public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extension) {
       GeneratedExtension<MessageType, Type> extensionLite =
           checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       return extensions.hasField(extensionLite.descriptor);
     }
@@ -826,7 +618,7 @@
         final ExtensionLite<MessageType, List<Type>> extension) {
       GeneratedExtension<MessageType, List<Type>> extensionLite =
           checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       return extensions.getRepeatedFieldCount(extensionLite.descriptor);
     }
@@ -837,7 +629,7 @@
     public final <Type> Type getExtension(final ExtensionLite<MessageType, Type> extension) {
       GeneratedExtension<MessageType, Type> extensionLite =
           checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       final Object value = extensions.getField(extensionLite.descriptor);
       if (value == null) {
@@ -868,7 +660,7 @@
     @Override
     protected final void makeImmutable() {
       super.makeImmutable();
-
+      
       extensions.makeImmutable();
     }
 
@@ -942,7 +734,7 @@
       implements ExtendableMessageOrBuilder<MessageType, BuilderType> {
     protected ExtendableBuilder(MessageType defaultInstance) {
       super(defaultInstance);
-
+      
       // TODO(dweis): This is kind of an unnecessary clone since we construct a
       //     new instance in the parent constructor which makes the extensions
       //     immutable. This extra allocation shouldn't matter in practice
@@ -961,7 +753,7 @@
       if (!isBuilt) {
         return;
       }
-
+      
       super.copyOnWrite();
       instance.extensions = instance.extensions.clone();
     }
@@ -1015,13 +807,21 @@
       return instance.getExtension(extension, index);
     }
 
+    // This is implemented here only to work around an apparent bug in the
+    // Java compiler and/or build system.  See bug #1898463.  The mere presence
+    // of this dummy clone() implementation makes it go away.
+    @Override
+    public BuilderType clone() {
+      return super.clone();
+    }
+    
     /** Set the value of an extension. */
     public final <Type> BuilderType setExtension(
         final ExtensionLite<MessageType, Type> extension,
         final Type value) {
       GeneratedExtension<MessageType, Type> extensionLite =
           checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       copyOnWrite();
       instance.extensions.setField(extensionLite.descriptor, extensionLite.toFieldSetType(value));
@@ -1034,7 +834,7 @@
         final int index, final Type value) {
       GeneratedExtension<MessageType, List<Type>> extensionLite =
           checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       copyOnWrite();
       instance.extensions.setRepeatedField(
@@ -1048,7 +848,7 @@
         final Type value) {
       GeneratedExtension<MessageType, List<Type>> extensionLite =
           checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       copyOnWrite();
       instance.extensions.addRepeatedField(
@@ -1060,7 +860,7 @@
     public final <Type> BuilderType clearExtension(
         final ExtensionLite<MessageType, ?> extension) {
       GeneratedExtension<MessageType, ?> extensionLite = checkIsLite(extension);
-
+      
       verifyExtensionContainingType(extensionLite);
       copyOnWrite();
       instance.extensions.clearField(extensionLite.descriptor);
@@ -1213,7 +1013,6 @@
     }
   }
 
-
   /**
    * Lite equivalent to {@link GeneratedMessage.GeneratedExtension}.
    *
@@ -1358,7 +1157,7 @@
     public static SerializedForm of(MessageLite message) {
       return new SerializedForm(message);
     }
-
+    
     private static final long serialVersionUID = 0L;
 
     private final String messageClassName;
@@ -1392,7 +1191,7 @@
       } catch (ClassNotFoundException e) {
         throw new RuntimeException("Unable to find proto buffer class: " + messageClassName, e);
       } catch (NoSuchFieldException e) {
-        return readResolveFallback();
+        throw new RuntimeException("Unable to find DEFAULT_INSTANCE in " + messageClassName, e);
       } catch (SecurityException e) {
         throw new RuntimeException("Unable to call DEFAULT_INSTANCE in " + messageClassName, e);
       } catch (IllegalAccessException e) {
@@ -1401,35 +1200,8 @@
         throw new RuntimeException("Unable to understand proto buffer", e);
       }
     }
-
-    /**
-     * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1 generated code.
-     */
-    @Deprecated
-    private Object readResolveFallback() throws ObjectStreamException {
-      try {
-        Class<?> messageClass = Class.forName(messageClassName);
-        java.lang.reflect.Field defaultInstanceField =
-            messageClass.getDeclaredField("defaultInstance");
-        defaultInstanceField.setAccessible(true);
-        MessageLite defaultInstance = (MessageLite) defaultInstanceField.get(null);
-        return defaultInstance.newBuilderForType()
-            .mergeFrom(asBytes)
-            .buildPartial();
-      } catch (ClassNotFoundException e) {
-        throw new RuntimeException("Unable to find proto buffer class: " + messageClassName, e);
-      } catch (NoSuchFieldException e) {
-        throw new RuntimeException("Unable to find defaultInstance in " + messageClassName, e);
-      } catch (SecurityException e) {
-        throw new RuntimeException("Unable to call defaultInstance in " + messageClassName, e);
-      } catch (IllegalAccessException e) {
-        throw new RuntimeException("Unable to call parsePartialFrom", e);
-      } catch (InvalidProtocolBufferException e) {
-        throw new RuntimeException("Unable to understand proto buffer", e);
-      }
-    }
   }
-
+  
   /**
    * Checks that the {@link Extension} is Lite and returns it as a
    * {@link GeneratedExtension}.
@@ -1443,7 +1215,7 @@
     if (!extension.isLite()) {
       throw new IllegalArgumentException("Expected a lite extension.");
     }
-
+    
     return (GeneratedExtension<MessageType, T>) extension;
   }
 
@@ -1454,23 +1226,9 @@
    */
   protected static final <T extends GeneratedMessageLite<T, ?>> boolean isInitialized(
       T message, boolean shouldMemoize) {
-    byte memoizedIsInitialized =
-        (Byte) message.dynamicMethod(MethodToInvoke.GET_MEMOIZED_IS_INITIALIZED);
-    if (memoizedIsInitialized == 1) {
-      return true;
-    }
-    if (memoizedIsInitialized == 0) {
-      return false;
-    }
-    boolean isInitialized =
-        message.dynamicMethod(MethodToInvoke.IS_INITIALIZED, Boolean.FALSE) != null;
-    if (shouldMemoize) {
-      message.dynamicMethod(
-          MethodToInvoke.SET_MEMOIZED_IS_INITIALIZED, isInitialized ? message : null);
-    }
-    return isInitialized;
-  }
-
+    return message.dynamicMethod(MethodToInvoke.IS_INITIALIZED, shouldMemoize) != null;
+  } 
+  
   protected static final <T extends GeneratedMessageLite<T, ?>> void makeImmutable(T message) {
     message.dynamicMethod(MethodToInvoke.MAKE_IMMUTABLE);
   }
@@ -1488,7 +1246,7 @@
   protected static LongList emptyLongList() {
     return LongArrayList.emptyList();
   }
-
+  
   protected static LongList mutableCopy(LongList list) {
     int size = list.size();
     return list.mutableCopyWithCapacity(
@@ -1498,7 +1256,7 @@
   protected static FloatList emptyFloatList() {
     return FloatArrayList.emptyList();
   }
-
+  
   protected static FloatList mutableCopy(FloatList list) {
     int size = list.size();
     return list.mutableCopyWithCapacity(
@@ -1508,7 +1266,7 @@
   protected static DoubleList emptyDoubleList() {
     return DoubleArrayList.emptyList();
   }
-
+  
   protected static DoubleList mutableCopy(DoubleList list) {
     int size = list.size();
     return list.mutableCopyWithCapacity(
@@ -1518,7 +1276,7 @@
   protected static BooleanList emptyBooleanList() {
     return BooleanArrayList.emptyList();
   }
-
+  
   protected static BooleanList mutableCopy(BooleanList list) {
     int size = list.size();
     return list.mutableCopyWithCapacity(
@@ -1528,7 +1286,7 @@
   protected static <E> ProtobufList<E> emptyProtobufList() {
     return ProtobufArrayList.emptyList();
   }
-
+  
   protected static <E> ProtobufList<E> mutableCopy(ProtobufList<E> list) {
     int size = list.size();
     return list.mutableCopyWithCapacity(
@@ -1542,20 +1300,20 @@
    */
   protected static class DefaultInstanceBasedParser<T extends GeneratedMessageLite<T, ?>>
       extends AbstractParser<T> {
-
+    
     private T defaultInstance;
-
+    
     public DefaultInstanceBasedParser(T defaultInstance) {
       this.defaultInstance = defaultInstance;
     }
-
+    
     @Override
     public T parsePartialFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
         throws InvalidProtocolBufferException {
       return GeneratedMessageLite.parsePartialFrom(defaultInstance, input, extensionRegistry);
     }
   }
-
+  
   /**
    * A static helper method for parsing a partial from input using the extension registry and the
    * instance.
@@ -1577,14 +1335,14 @@
     }
     return result;
   }
-
+  
   protected static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom(
       T defaultInstance,
       CodedInputStream input)
       throws InvalidProtocolBufferException {
     return parsePartialFrom(defaultInstance, input, ExtensionRegistryLite.getEmptyRegistry());
   }
-
+  
   /**
    * Helper method to check if message is initialized.
    *
@@ -1603,20 +1361,6 @@
 
   // Validates last tag.
   protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom(
-      T defaultInstance, ByteBuffer data, ExtensionRegistryLite extensionRegistry)
-      throws InvalidProtocolBufferException {
-    return checkMessageInitialized(
-        parseFrom(defaultInstance, CodedInputStream.newInstance(data), extensionRegistry));
-  }
-
-  // Validates last tag.
-  protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom(
-      T defaultInstance, ByteBuffer data) throws InvalidProtocolBufferException {
-    return parseFrom(defaultInstance, data, ExtensionRegistryLite.getEmptyRegistry());
-  }
-
-  // Validates last tag.
-  protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom(
       T defaultInstance, ByteString data)
       throws InvalidProtocolBufferException {
     return checkMessageInitialized(
@@ -1629,7 +1373,7 @@
       throws InvalidProtocolBufferException {
     return checkMessageInitialized(parsePartialFrom(defaultInstance, data, extensionRegistry));
   }
-
+  
   // This is a special case since we want to verify that the last tag is 0. We assume we exhaust the
   // ByteString.
   private static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom(
@@ -1649,7 +1393,7 @@
       throw e;
     }
   }
-
+  
   // This is a special case since we want to verify that the last tag is 0. We assume we exhaust the
   // ByteString.
   private static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom(
@@ -1733,7 +1477,7 @@
     return checkMessageInitialized(
         parsePartialDelimitedFrom(defaultInstance, input, extensionRegistry));
   }
-
+  
   private static <T extends GeneratedMessageLite<T, ?>> T parsePartialDelimitedFrom(
       T defaultInstance,
       InputStream input,
@@ -1760,7 +1504,6 @@
     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
@@ -1784,13 +1527,16 @@
     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 visitOneofLazyMessage(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);
+    LazyFieldLite visitLazyMessage(
+        boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other);
 
     <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other);
     BooleanList visitBooleanList(BooleanList mine, BooleanList other);
@@ -1934,13 +1680,21 @@
     }
 
     @Override
+    public Object visitOneofLazyMessage(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) {
@@ -1962,6 +1716,17 @@
 
       return mine;
     }
+    
+    @Override
+    public LazyFieldLite visitLazyMessage(
+        boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) {
+      if (!minePresent && !otherPresent) {
+        return mine;
+      } else if (minePresent && otherPresent && mine.equals(other)) {
+        return mine;
+      }
+      throw NOT_EQUALS;
+    }
 
     @Override
     public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) {
@@ -2043,13 +1808,13 @@
   /**
    * Implements hashCode by accumulating state.
    */
-  static class HashCodeVisitor implements Visitor {
+  private 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;
+    
+    private int hashCode = 0;
 
     @Override
     public boolean visitBoolean(
@@ -2140,6 +1905,12 @@
     }
 
     @Override
+    public Object visitOneofLazyMessage(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);
     }
@@ -2147,7 +1918,7 @@
     @Override
     public void visitOneofNotSet(boolean minePresent) {
       if (minePresent) {
-        throw new IllegalStateException(); // Can't happen if other == this.
+        throw new IllegalStateException(); // Can't happen if other == this. 
       }
     }
 
@@ -2168,6 +1939,13 @@
     }
 
     @Override
+    public LazyFieldLite visitLazyMessage(
+        boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) {
+      hashCode = (53 * hashCode) + mine.hashCode();
+      return mine;
+    }
+
+    @Override
     public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) {
       hashCode = (53 * hashCode) + mine.hashCode();
       return mine;
@@ -2218,7 +1996,7 @@
       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();
@@ -2286,7 +2064,7 @@
 
     @Override
     public Object visitOneofDouble(boolean minePresent, Object mine, Object other) {
-      return other;
+      return other;      
     }
 
     @Override
@@ -2296,27 +2074,37 @@
 
     @Override
     public Object visitOneofLong(boolean minePresent, Object mine, Object other) {
-      return other;
+      return other;      
     }
 
     @Override
     public Object visitOneofString(boolean minePresent, Object mine, Object other) {
-      return other;
+      return other;      
     }
 
     @Override
     public Object visitOneofByteString(boolean minePresent, Object mine, Object other) {
-      return other;
+      return other;      
     }
 
     @Override
+    public Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other) {
+      if (minePresent) {
+        LazyFieldLite lazy = (LazyFieldLite) mine;
+        lazy.merge((LazyFieldLite) other);
+        return lazy;
+      }
+      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;
@@ -2333,6 +2121,16 @@
     }
 
     @Override
+    public LazyFieldLite visitLazyMessage(
+        boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) {
+      // LazyFieldLite's are never null so we can just copy across. Necessary to avoid leakage
+      // from builder into immutable message.
+      // TODO(dweis): Change to null sentinels?
+      mine.merge(other);
+      return mine;
+    }
+
+    @Override
     public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) {
       int size = mine.size();
       int otherSize = other.size();
@@ -2342,7 +2140,7 @@
         }
         mine.addAll(other);
       }
-
+      
       return size > 0 ? mine : other;
     }
 
@@ -2356,7 +2154,7 @@
         }
         mine.addAll(other);
       }
-
+      
       return size > 0 ? mine : other;
     }
 
@@ -2370,7 +2168,7 @@
         }
         mine.addAll(other);
       }
-
+      
       return size > 0 ? mine : other;
     }
 
@@ -2384,7 +2182,7 @@
         }
         mine.addAll(other);
       }
-
+      
       return size > 0 ? mine : other;
     }
 
@@ -2398,7 +2196,7 @@
         }
         mine.addAll(other);
       }
-
+      
       return size > 0 ? mine : other;
     }
 
@@ -2412,7 +2210,7 @@
         }
         mine.addAll(other);
       }
-
+      
       return size > 0 ? mine : other;
     }
 
@@ -2434,17 +2232,11 @@
       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);
-      }
+      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
deleted file mode 100644
index 4acd8f2..0000000
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
+++ /dev/null
@@ -1,2861 +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 com.google.protobuf.Internal.checkNotNull;
-
-import com.google.protobuf.Descriptors.Descriptor;
-import com.google.protobuf.Descriptors.EnumDescriptor;
-import com.google.protobuf.Descriptors.EnumValueDescriptor;
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import com.google.protobuf.Descriptors.FileDescriptor;
-import com.google.protobuf.Descriptors.OneofDescriptor;
-// In opensource protobuf, we have versioned this GeneratedMessageV3 class to GeneratedMessageV3V3 and
-// in the future may have GeneratedMessageV3V4 etc. This allows us to change some aspects of this
-// class without breaking binary compatibility with old generated code that still subclasses
-// the old GeneratedMessageV3 class. To allow these different GeneratedMessageV3V? classes to
-// interoperate (e.g., a GeneratedMessageV3V3 object has a message extension field whose class
-// type is GeneratedMessageV3V4), these classes still share a common parent class AbstractMessage
-// and are using the same GeneratedMessage.GeneratedExtension class for extension definitions.
-// Since this class becomes GeneratedMessageV3V? in opensource, we have to add an import here
-// to be able to use GeneratedMessage.GeneratedExtension. The GeneratedExtension definition in
-// this file is also excluded from opensource to avoid conflict.
-import com.google.protobuf.GeneratedMessage.GeneratedExtension;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectStreamException;
-import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * All generated protocol message classes extend this class.  This class
- * implements most of the Message and Builder interfaces using Java reflection.
- * Users can ignore this class and pretend that generated messages implement
- * the Message interface directly.
- *
- * @author kenton@google.com Kenton Varda
- */
-public abstract class GeneratedMessageV3 extends AbstractMessage
-    implements Serializable {
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * For testing. Allows a test to disable the optimization that avoids using
-   * field builders for nested messages until they are requested. By disabling
-   * this optimization, existing tests can be reused to test the field builders.
-   */
-  protected static boolean alwaysUseFieldBuilders = false;
-
-  /** For use by generated code only.  */
-  protected UnknownFieldSet unknownFields;
-
-  protected GeneratedMessageV3() {
-    unknownFields = UnknownFieldSet.getDefaultInstance();
-  }
-
-  protected GeneratedMessageV3(Builder<?> builder) {
-    unknownFields = builder.getUnknownFields();
-  }
-
-  @Override
-  public Parser<? extends GeneratedMessageV3> getParserForType() {
-    throw new UnsupportedOperationException(
-        "This is supposed to be overridden by subclasses.");
-  }
-
- /**
-  * For testing. Allows a test to disable the optimization that avoids using
-  * field builders for nested messages until they are requested. By disabling
-  * this optimization, existing tests can be reused to test the field builders.
-  * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}.
-  */
-  static void enableAlwaysUseFieldBuildersForTesting() {
-    alwaysUseFieldBuilders = true;
-  }
-
-  /**
-   * Get the FieldAccessorTable for this type.  We can't have the message
-   * class pass this in to the constructor because of bootstrapping trouble
-   * with DescriptorProtos.
-   */
-  protected abstract FieldAccessorTable internalGetFieldAccessorTable();
-
-  @Override
-  public Descriptor getDescriptorForType() {
-    return internalGetFieldAccessorTable().descriptor;
-  }
-
-  /**
-   * Internal helper to return a modifiable map containing all the fields.
-   * The returned Map is modifialbe so that the caller can add additional
-   * extension fields to implement {@link #getAllFields()}.
-   *
-   * @param getBytesForString whether to generate ByteString for string fields
-   */
-  private Map<FieldDescriptor, Object> getAllFieldsMutable(
-      boolean getBytesForString) {
-    final TreeMap<FieldDescriptor, Object> result =
-      new TreeMap<FieldDescriptor, Object>();
-    final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
-    final List<FieldDescriptor> fields = descriptor.getFields();
-
-    for (int i = 0; i < fields.size(); i++) {
-      FieldDescriptor field = fields.get(i);
-      final OneofDescriptor oneofDescriptor = field.getContainingOneof();
-
-      /*
-       * If the field is part of a Oneof, then at maximum one field in the Oneof is set
-       * and it is not repeated. There is no need to iterate through the others.
-       */
-      if (oneofDescriptor != null) {
-        // Skip other fields in the Oneof we know are not set
-        i += oneofDescriptor.getFieldCount() - 1;
-        if (!hasOneof(oneofDescriptor)) {
-          // If no field is set in the Oneof, skip all the fields in the Oneof
-          continue;
-        }
-        // Get the pointer to the only field which is set in the Oneof
-        field = getOneofFieldDescriptor(oneofDescriptor);
-      } else {
-        // If we are not in a Oneof, we need to check if the field is set and if it is repeated
-        if (field.isRepeated()) {
-          final List<?> value = (List<?>) getField(field);
-          if (!value.isEmpty()) {
-            result.put(field, value);
-          }
-          continue;
-        }
-        if (!hasField(field)) {
-          continue;
-        }
-      }
-      // Add the field to the map
-      if (getBytesForString && field.getJavaType() == FieldDescriptor.JavaType.STRING) {
-        result.put(field, getFieldRaw(field));
-      } else {
-        result.put(field, getField(field));
-      }
-    }
-    return result;
-  }
-
-  @Override
-  public boolean isInitialized() {
-    for (final FieldDescriptor field : getDescriptorForType().getFields()) {
-      // Check that all required fields are present.
-      if (field.isRequired()) {
-        if (!hasField(field)) {
-          return false;
-        }
-      }
-      // Check that embedded messages are initialized.
-      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-        if (field.isRepeated()) {
-          @SuppressWarnings("unchecked") final
-          List<Message> messageList = (List<Message>) getField(field);
-          for (final Message element : messageList) {
-            if (!element.isInitialized()) {
-              return false;
-            }
-          }
-        } else {
-          if (hasField(field) && !((Message) getField(field)).isInitialized()) {
-            return false;
-          }
-        }
-      }
-    }
-
-    return true;
-  }
-
-  @Override
-  public Map<FieldDescriptor, Object> getAllFields() {
-    return Collections.unmodifiableMap(
-        getAllFieldsMutable(/* getBytesForString = */ false));
-  }
-
-  /**
-   * Returns a collection of all the fields in this message which are set
-   * and their corresponding values.  A singular ("required" or "optional")
-   * field is set iff hasField() returns true for that field.  A "repeated"
-   * field is set iff getRepeatedFieldCount() is greater than zero.  The
-   * values are exactly what would be returned by calling
-   * {@link #getFieldRaw(Descriptors.FieldDescriptor)} for each field.  The map
-   * is guaranteed to be a sorted map, so iterating over it will return fields
-   * in order by field number.
-   */
-  Map<FieldDescriptor, Object> getAllFieldsRaw() {
-    return Collections.unmodifiableMap(
-        getAllFieldsMutable(/* getBytesForString = */ true));
-  }
-
-  @Override
-  public boolean hasOneof(final OneofDescriptor oneof) {
-    return internalGetFieldAccessorTable().getOneof(oneof).has(this);
-  }
-
-  @Override
-  public FieldDescriptor getOneofFieldDescriptor(final OneofDescriptor oneof) {
-    return internalGetFieldAccessorTable().getOneof(oneof).get(this);
-  }
-
-  @Override
-  public boolean hasField(final FieldDescriptor field) {
-    return internalGetFieldAccessorTable().getField(field).has(this);
-  }
-
-  @Override
-  public Object getField(final FieldDescriptor field) {
-    return internalGetFieldAccessorTable().getField(field).get(this);
-  }
-
-  /**
-   * Obtains the value of the given field, or the default value if it is
-   * not set.  For primitive fields, the boxed primitive value is returned.
-   * For enum fields, the EnumValueDescriptor for the value is returned. For
-   * embedded message fields, the sub-message is returned.  For repeated
-   * fields, a java.util.List is returned. For present string fields, a
-   * ByteString is returned representing the bytes that the field contains.
-   */
-  Object getFieldRaw(final FieldDescriptor field) {
-    return internalGetFieldAccessorTable().getField(field).getRaw(this);
-  }
-
-  @Override
-  public int getRepeatedFieldCount(final FieldDescriptor field) {
-    return internalGetFieldAccessorTable().getField(field)
-      .getRepeatedCount(this);
-  }
-
-  @Override
-  public Object getRepeatedField(final FieldDescriptor field, final int index) {
-    return internalGetFieldAccessorTable().getField(field)
-      .getRepeated(this, index);
-  }
-
-  @Override
-  public UnknownFieldSet getUnknownFields() {
-    throw new UnsupportedOperationException(
-        "This is supposed to be overridden by subclasses.");
-  }
-
-  /**
-   * Called by subclasses to parse an unknown field.
-   *
-   * @return {@code true} unless the tag is an end-group tag.
-   */
-  protected boolean parseUnknownField(
-      CodedInputStream input,
-      UnknownFieldSet.Builder unknownFields,
-      ExtensionRegistryLite extensionRegistry,
-      int tag)
-      throws IOException {
-    if (input.shouldDiscardUnknownFields()) {
-      return input.skipField(tag);
-    }
-    return unknownFields.mergeFieldFrom(tag, input);
-  }
-
-  protected boolean parseUnknownFieldProto3(
-      CodedInputStream input,
-      UnknownFieldSet.Builder unknownFields,
-      ExtensionRegistryLite extensionRegistry,
-      int tag)
-      throws IOException {
-    if (input.shouldDiscardUnknownFieldsProto3()) {
-      return input.skipField(tag);
-    }
-    return unknownFields.mergeFieldFrom(tag, input);
-  }
-
-  protected static <M extends Message> M parseWithIOException(Parser<M> parser, InputStream input)
-      throws IOException {
-    try {
-      return parser.parseFrom(input);
-    } catch (InvalidProtocolBufferException e) {
-      throw e.unwrapIOException();
-    }
-  }
-
-  protected static <M extends Message> M parseWithIOException(Parser<M> parser, InputStream input,
-      ExtensionRegistryLite extensions) throws IOException {
-    try {
-      return parser.parseFrom(input, extensions);
-    } catch (InvalidProtocolBufferException e) {
-      throw e.unwrapIOException();
-    }
-  }
-
-  protected static <M extends Message> M parseWithIOException(Parser<M> parser,
-      CodedInputStream input) throws IOException {
-    try {
-      return parser.parseFrom(input);
-    } catch (InvalidProtocolBufferException e) {
-      throw e.unwrapIOException();
-    }
-  }
-
-  protected static <M extends Message> M parseWithIOException(Parser<M> parser,
-      CodedInputStream input, ExtensionRegistryLite extensions) throws IOException {
-    try {
-      return parser.parseFrom(input, extensions);
-    } catch (InvalidProtocolBufferException e) {
-      throw e.unwrapIOException();
-    }
-  }
-
-  protected static <M extends Message> M parseDelimitedWithIOException(Parser<M> parser,
-      InputStream input) throws IOException {
-    try {
-      return parser.parseDelimitedFrom(input);
-    } catch (InvalidProtocolBufferException e) {
-      throw e.unwrapIOException();
-    }
-  }
-
-  protected static <M extends Message> M parseDelimitedWithIOException(Parser<M> parser,
-      InputStream input, ExtensionRegistryLite extensions) throws IOException {
-    try {
-      return parser.parseDelimitedFrom(input, extensions);
-    } catch (InvalidProtocolBufferException e) {
-      throw e.unwrapIOException();
-    }
-  }
-  
-  protected static boolean canUseUnsafe() {
-    return UnsafeUtil.hasUnsafeArrayOperations() && UnsafeUtil.hasUnsafeByteBufferOperations();
-  }
-
-  @Override
-  public void writeTo(final CodedOutputStream output) throws IOException {
-    MessageReflection.writeMessageTo(this, getAllFieldsRaw(), output, false);
-  }
-
-  @Override
-  public int getSerializedSize() {
-    int size = memoizedSize;
-    if (size != -1) {
-      return size;
-    }
-
-    memoizedSize = MessageReflection.getSerializedSize(
-        this, getAllFieldsRaw());
-    return memoizedSize;
-  }
-
-
-
-  /**
-   * Used by parsing constructors in generated classes.
-   */
-  protected void makeExtensionsImmutable() {
-    // Noop for messages without extensions.
-  }
-
-  /**
-   * TODO(xiaofeng): remove this after b/29368482 is fixed. We need to move this
-   * interface to AbstractMessage in order to versioning GeneratedMessageV3 but
-   * this move breaks binary compatibility for AppEngine. After AppEngine is
-   * fixed we can exlude this from google3.
-   */
-  protected interface BuilderParent extends AbstractMessage.BuilderParent {}
-
-  /**
-   * TODO(xiaofeng): remove this together with GeneratedMessageV3.BuilderParent.
-   */
-  protected abstract Message.Builder newBuilderForType(BuilderParent parent);
-
-  @Override
-  protected Message.Builder newBuilderForType(final AbstractMessage.BuilderParent parent) {
-    return newBuilderForType(new BuilderParent() {
-      @Override
-      public void markDirty() {
-        parent.markDirty();
-      }
-    });
-  }
-
-
-  @SuppressWarnings("unchecked")
-  public abstract static class Builder <BuilderType extends Builder<BuilderType>>
-      extends AbstractMessage.Builder<BuilderType> {
-
-    private BuilderParent builderParent;
-
-    private BuilderParentImpl meAsParent;
-
-    // Indicates that we've built a message and so we are now obligated
-    // to dispatch dirty invalidations. See GeneratedMessageV3.BuilderListener.
-    private boolean isClean;
-
-    private UnknownFieldSet unknownFields =
-        UnknownFieldSet.getDefaultInstance();
-
-    protected Builder() {
-      this(null);
-    }
-
-    protected Builder(BuilderParent builderParent) {
-      this.builderParent = builderParent;
-    }
-
-    @Override
-    void dispose() {
-      builderParent = null;
-    }
-
-    /**
-     * Called by the subclass when a message is built.
-     */
-    protected void onBuilt() {
-      if (builderParent != null) {
-        markClean();
-      }
-    }
-
-    /**
-     * Called by the subclass or a builder to notify us that a message was
-     * built and may be cached and therefore invalidations are needed.
-     */
-    @Override
-    protected void markClean() {
-      this.isClean = true;
-    }
-
-    /**
-     * Gets whether invalidations are needed
-     *
-     * @return whether invalidations are needed
-     */
-    protected boolean isClean() {
-      return isClean;
-    }
-
-    @Override
-    public BuilderType clone() {
-      BuilderType builder =
-          (BuilderType) getDefaultInstanceForType().newBuilderForType();
-      builder.mergeFrom(buildPartial());
-      return builder;
-    }
-
-    /**
-     * Called by the initialization and clear code paths to allow subclasses to
-     * reset any of their builtin fields back to the initial values.
-     */
-    @Override
-    public BuilderType clear() {
-      unknownFields = UnknownFieldSet.getDefaultInstance();
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    /**
-     * Get the FieldAccessorTable for this type.  We can't have the message
-     * class pass this in to the constructor because of bootstrapping trouble
-     * with DescriptorProtos.
-     */
-    protected abstract FieldAccessorTable internalGetFieldAccessorTable();
-
-    @Override
-    public Descriptor getDescriptorForType() {
-      return internalGetFieldAccessorTable().descriptor;
-    }
-
-    @Override
-    public Map<FieldDescriptor, Object> getAllFields() {
-      return Collections.unmodifiableMap(getAllFieldsMutable());
-    }
-
-    /** Internal helper which returns a mutable map. */
-    private Map<FieldDescriptor, Object> getAllFieldsMutable() {
-      final TreeMap<FieldDescriptor, Object> result =
-        new TreeMap<FieldDescriptor, Object>();
-      final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
-      final List<FieldDescriptor> fields = descriptor.getFields();
-
-      for (int i = 0; i < fields.size(); i++) {
-        FieldDescriptor field = fields.get(i);
-        final OneofDescriptor oneofDescriptor = field.getContainingOneof();
-
-        /*
-         * If the field is part of a Oneof, then at maximum one field in the Oneof is set
-         * and it is not repeated. There is no need to iterate through the others.
-         */
-        if (oneofDescriptor != null) {
-          // Skip other fields in the Oneof we know are not set
-          i += oneofDescriptor.getFieldCount() - 1;
-          if (!hasOneof(oneofDescriptor)) {
-            // If no field is set in the Oneof, skip all the fields in the Oneof
-            continue;
-          }
-          // Get the pointer to the only field which is set in the Oneof
-          field = getOneofFieldDescriptor(oneofDescriptor);
-        } else {
-          // If we are not in a Oneof, we need to check if the field is set and if it is repeated
-          if (field.isRepeated()) {
-            final List<?> value = (List<?>) getField(field);
-            if (!value.isEmpty()) {
-              result.put(field, value);
-            }
-            continue;
-          }
-          if (!hasField(field)) {
-            continue;
-          }
-        }
-        // Add the field to the map
-        result.put(field, getField(field));
-      }
-      return result;
-    }
-
-    @Override
-    public Message.Builder newBuilderForField(final FieldDescriptor field) {
-      return internalGetFieldAccessorTable().getField(field).newBuilder();
-    }
-
-    @Override
-    public Message.Builder getFieldBuilder(final FieldDescriptor field) {
-      return internalGetFieldAccessorTable().getField(field).getBuilder(this);
-    }
-
-    @Override
-    public Message.Builder getRepeatedFieldBuilder(final FieldDescriptor field, int index) {
-      return internalGetFieldAccessorTable().getField(field).getRepeatedBuilder(
-          this, index);
-    }
-
-    @Override
-    public boolean hasOneof(final OneofDescriptor oneof) {
-      return internalGetFieldAccessorTable().getOneof(oneof).has(this);
-    }
-
-    @Override
-    public FieldDescriptor getOneofFieldDescriptor(final OneofDescriptor oneof) {
-      return internalGetFieldAccessorTable().getOneof(oneof).get(this);
-    }
-
-    @Override
-    public boolean hasField(final FieldDescriptor field) {
-      return internalGetFieldAccessorTable().getField(field).has(this);
-    }
-
-    @Override
-    public Object getField(final FieldDescriptor field) {
-      Object object = internalGetFieldAccessorTable().getField(field).get(this);
-      if (field.isRepeated()) {
-        // The underlying list object is still modifiable at this point.
-        // Make sure not to expose the modifiable list to the caller.
-        return Collections.unmodifiableList((List) object);
-      } else {
-        return object;
-      }
-    }
-
-    @Override
-    public BuilderType setField(final FieldDescriptor field, final Object value) {
-      internalGetFieldAccessorTable().getField(field).set(this, value);
-      return (BuilderType) this;
-    }
-
-    @Override
-    public BuilderType clearField(final FieldDescriptor field) {
-      internalGetFieldAccessorTable().getField(field).clear(this);
-      return (BuilderType) this;
-    }
-
-    @Override
-    public BuilderType clearOneof(final OneofDescriptor oneof) {
-      internalGetFieldAccessorTable().getOneof(oneof).clear(this);
-      return (BuilderType) this;
-    }
-
-    @Override
-    public int getRepeatedFieldCount(final FieldDescriptor field) {
-      return internalGetFieldAccessorTable().getField(field)
-          .getRepeatedCount(this);
-    }
-
-    @Override
-    public Object getRepeatedField(final FieldDescriptor field, final int index) {
-      return internalGetFieldAccessorTable().getField(field)
-          .getRepeated(this, index);
-    }
-
-    @Override
-    public BuilderType setRepeatedField(
-        final FieldDescriptor field, final int index, final Object value) {
-      internalGetFieldAccessorTable().getField(field)
-        .setRepeated(this, index, value);
-      return (BuilderType) this;
-    }
-
-    @Override
-    public BuilderType addRepeatedField(final FieldDescriptor field, final Object value) {
-      internalGetFieldAccessorTable().getField(field).addRepeated(this, value);
-      return (BuilderType) this;
-    }
-
-    @Override
-    public BuilderType setUnknownFields(final UnknownFieldSet unknownFields) {
-      this.unknownFields = unknownFields;
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    protected BuilderType setUnknownFieldsProto3(final UnknownFieldSet unknownFields) {
-      if (CodedInputStream.getProto3DiscardUnknownFieldsDefault()) {
-        return (BuilderType) this;
-      }
-      this.unknownFields = unknownFields;
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    @Override
-    public BuilderType mergeUnknownFields(
-        final UnknownFieldSet unknownFields) {
-      return setUnknownFields(
-        UnknownFieldSet.newBuilder(this.unknownFields)
-                       .mergeFrom(unknownFields)
-                       .build());
-    }
-
-
-    @Override
-    public boolean isInitialized() {
-      for (final FieldDescriptor field : getDescriptorForType().getFields()) {
-        // Check that all required fields are present.
-        if (field.isRequired()) {
-          if (!hasField(field)) {
-            return false;
-          }
-        }
-        // Check that embedded messages are initialized.
-        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-          if (field.isRepeated()) {
-            @SuppressWarnings("unchecked") final
-            List<Message> messageList = (List<Message>) getField(field);
-            for (final Message element : messageList) {
-              if (!element.isInitialized()) {
-                return false;
-              }
-            }
-          } else {
-            if (hasField(field) &&
-                !((Message) getField(field)).isInitialized()) {
-              return false;
-            }
-          }
-        }
-      }
-      return true;
-    }
-
-    @Override
-    public final UnknownFieldSet getUnknownFields() {
-      return unknownFields;
-    }
-
-    /**
-     * Implementation of {@link BuilderParent} for giving to our children. This
-     * small inner class makes it so we don't publicly expose the BuilderParent
-     * methods.
-     */
-    private class BuilderParentImpl implements BuilderParent {
-
-      @Override
-      public void markDirty() {
-        onChanged();
-      }
-    }
-
-    /**
-     * Gets the {@link BuilderParent} for giving to our children.
-     * @return The builder parent for our children.
-     */
-    protected BuilderParent getParentForChildren() {
-      if (meAsParent == null) {
-        meAsParent = new BuilderParentImpl();
-      }
-      return meAsParent;
-    }
-
-    /**
-     * Called when a the builder or one of its nested children has changed
-     * and any parent should be notified of its invalidation.
-     */
-    protected final void onChanged() {
-      if (isClean && builderParent != null) {
-        builderParent.markDirty();
-
-        // Don't keep dispatching invalidations until build is called again.
-        isClean = false;
-      }
-    }
-
-    /**
-     * Gets the map field with the given field number. This method should be
-     * overridden in the generated message class if the message contains map
-     * fields.
-     *
-     * Unlike other field types, reflection support for map fields can't be
-     * implemented based on generated public API because we need to access a
-     * map field as a list in reflection API but the generated API only allows
-     * us to access it as a map. This method returns the underlying map field
-     * directly and thus enables us to access the map field as a list.
-     */
-    @SuppressWarnings({"unused", "rawtypes"})
-    protected MapField internalGetMapField(int fieldNumber) {
-      // Note that we can't use descriptor names here because this method will
-      // be called when descriptor is being initialized.
-      throw new RuntimeException(
-          "No map fields found in " + getClass().getName());
-    }
-
-    /** Like {@link #internalGetMapField} but return a mutable version. */
-    @SuppressWarnings({"unused", "rawtypes"})
-    protected MapField internalGetMutableMapField(int fieldNumber) {
-      // Note that we can't use descriptor names here because this method will
-      // be called when descriptor is being initialized.
-      throw new RuntimeException(
-          "No map fields found in " + getClass().getName());
-    }
-  }
-
-  // =================================================================
-  // Extensions-related stuff
-
-  public interface ExtendableMessageOrBuilder<
-      MessageType extends ExtendableMessage> extends MessageOrBuilder {
-    // Re-define for return type covariance.
-    @Override
-    Message getDefaultInstanceForType();
-
-    /** Check if a singular extension is present. */
-    <Type> boolean hasExtension(
-        ExtensionLite<MessageType, Type> extension);
-
-    /** Get the number of elements in a repeated extension. */
-    <Type> int getExtensionCount(
-        ExtensionLite<MessageType, List<Type>> extension);
-
-    /** Get the value of an extension. */
-    <Type> Type getExtension(
-        ExtensionLite<MessageType, Type> extension);
-
-    /** Get one element of a repeated extension. */
-    <Type> Type getExtension(
-        ExtensionLite<MessageType, List<Type>> extension,
-        int index);
-
-    /** Check if a singular extension is present. */
-    <Type> boolean hasExtension(
-        Extension<MessageType, Type> extension);
-    /** Check if a singular extension is present. */
-    <Type> boolean hasExtension(
-        GeneratedExtension<MessageType, Type> extension);
-    /** Get the number of elements in a repeated extension. */
-    <Type> int getExtensionCount(
-        Extension<MessageType, List<Type>> extension);
-    /** Get the number of elements in a repeated extension. */
-    <Type> int getExtensionCount(
-        GeneratedExtension<MessageType, List<Type>> extension);
-    /** Get the value of an extension. */
-    <Type> Type getExtension(
-        Extension<MessageType, Type> extension);
-    /** Get the value of an extension. */
-    <Type> Type getExtension(
-        GeneratedExtension<MessageType, Type> extension);
-    /** Get one element of a repeated extension. */
-    <Type> Type getExtension(
-        Extension<MessageType, List<Type>> extension,
-        int index);
-    /** Get one element of a repeated extension. */
-    <Type> Type getExtension(
-        GeneratedExtension<MessageType, List<Type>> extension,
-        int index);
-  }
-
-  /**
-   * Generated message classes for message types that contain extension ranges
-   * subclass this.
-   *
-   * <p>This class implements type-safe accessors for extensions.  They
-   * implement all the same operations that you can do with normal fields --
-   * e.g. "has", "get", and "getCount" -- but for extensions.  The extensions
-   * are identified using instances of the class {@link GeneratedExtension};
-   * the protocol compiler generates a static instance of this class for every
-   * extension in its input.  Through the magic of generics, all is made
-   * type-safe.
-   *
-   * <p>For example, imagine you have the {@code .proto} file:
-   *
-   * <pre>
-   * option java_class = "MyProto";
-   *
-   * message Foo {
-   *   extensions 1000 to max;
-   * }
-   *
-   * extend Foo {
-   *   optional int32 bar;
-   * }
-   * </pre>
-   *
-   * <p>Then you might write code like:
-   *
-   * <pre>
-   * MyProto.Foo foo = getFoo();
-   * int i = foo.getExtension(MyProto.bar);
-   * </pre>
-   *
-   * <p>See also {@link ExtendableBuilder}.
-   */
-  public abstract static class ExtendableMessage<
-        MessageType extends ExtendableMessage>
-      extends GeneratedMessageV3
-      implements ExtendableMessageOrBuilder<MessageType> {
-
-    private static final long serialVersionUID = 1L;
-
-    private final FieldSet<FieldDescriptor> extensions;
-
-    protected ExtendableMessage() {
-      this.extensions = FieldSet.newFieldSet();
-    }
-
-    protected ExtendableMessage(
-        ExtendableBuilder<MessageType, ?> builder) {
-      super(builder);
-      this.extensions = builder.buildExtensions();
-    }
-
-    private void verifyExtensionContainingType(
-        final Extension<MessageType, ?> extension) {
-      if (extension.getDescriptor().getContainingType() !=
-          getDescriptorForType()) {
-        // This can only happen if someone uses unchecked operations.
-        throw new IllegalArgumentException(
-          "Extension is for type \"" +
-          extension.getDescriptor().getContainingType().getFullName() +
-          "\" which does not match message type \"" +
-          getDescriptorForType().getFullName() + "\".");
-      }
-    }
-
-    /** Check if a singular extension is present. */
-    @Override
-    @SuppressWarnings("unchecked")
-    public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extensionLite) {
-      Extension<MessageType, Type> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      return extensions.hasField(extension.getDescriptor());
-    }
-
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    @SuppressWarnings("unchecked")
-    public final <Type> int getExtensionCount(
-        final ExtensionLite<MessageType, List<Type>> extensionLite) {
-      Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      final FieldDescriptor descriptor = extension.getDescriptor();
-      return extensions.getRepeatedFieldCount(descriptor);
-    }
-
-    /** Get the value of an extension. */
-    @Override
-    @SuppressWarnings("unchecked")
-    public final <Type> Type getExtension(final ExtensionLite<MessageType, Type> extensionLite) {
-      Extension<MessageType, Type> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      FieldDescriptor descriptor = extension.getDescriptor();
-      final Object value = extensions.getField(descriptor);
-      if (value == null) {
-        if (descriptor.isRepeated()) {
-          return (Type) Collections.emptyList();
-        } else if (descriptor.getJavaType() ==
-                   FieldDescriptor.JavaType.MESSAGE) {
-          return (Type) extension.getMessageDefaultInstance();
-        } else {
-          return (Type) extension.fromReflectionType(
-              descriptor.getDefaultValue());
-        }
-      } else {
-        return (Type) extension.fromReflectionType(value);
-      }
-    }
-
-    /** Get one element of a repeated extension. */
-    @Override
-    @SuppressWarnings("unchecked")
-    public final <Type> Type getExtension(
-        final ExtensionLite<MessageType, List<Type>> extensionLite, final int index) {
-      Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      FieldDescriptor descriptor = extension.getDescriptor();
-      return (Type) extension.singularFromReflectionType(
-          extensions.getRepeatedField(descriptor, index));
-    }
-
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(final Extension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final Extension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final GeneratedExtension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(final Extension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get one element of a repeated extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final Extension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-    /** Get one element of a repeated extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-
-    /** Called by subclasses to check if all extensions are initialized. */
-    protected boolean extensionsAreInitialized() {
-      return extensions.isInitialized();
-    }
-
-    @Override
-    public boolean isInitialized() {
-      return super.isInitialized() && extensionsAreInitialized();
-    }
-
-    @Override
-    protected boolean parseUnknownField(
-        CodedInputStream input,
-        UnknownFieldSet.Builder unknownFields,
-        ExtensionRegistryLite extensionRegistry,
-        int tag) throws IOException {
-      return MessageReflection.mergeFieldFrom(
-          input, input.shouldDiscardUnknownFields() ? null : unknownFields, extensionRegistry,
-          getDescriptorForType(), new MessageReflection.ExtensionAdapter(extensions), tag);
-    }
-
-    @Override
-    protected boolean parseUnknownFieldProto3(
-        CodedInputStream input,
-        UnknownFieldSet.Builder unknownFields,
-        ExtensionRegistryLite extensionRegistry,
-        int tag) throws IOException {
-      return MessageReflection.mergeFieldFrom(
-          input,
-          input.shouldDiscardUnknownFieldsProto3() ? null : unknownFields,
-          extensionRegistry,
-          getDescriptorForType(),
-          new MessageReflection.ExtensionAdapter(extensions),
-          tag);
-    }
-
-
-    /**
-     * Used by parsing constructors in generated classes.
-     */
-    @Override
-    protected void makeExtensionsImmutable() {
-      extensions.makeImmutable();
-    }
-
-    /**
-     * 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 helps us write
-     * individual ranges of extensions at once.
-     */
-    protected class ExtensionWriter {
-      // Imagine how much simpler this code would be if Java iterators had
-      // a way to get the next element without advancing the iterator.
-
-      private final Iterator<Map.Entry<FieldDescriptor, Object>> iter =
-        extensions.iterator();
-      private Map.Entry<FieldDescriptor, Object> next;
-      private final boolean messageSetWireFormat;
-
-      private ExtensionWriter(final boolean messageSetWireFormat) {
-        if (iter.hasNext()) {
-          next = iter.next();
-        }
-        this.messageSetWireFormat = messageSetWireFormat;
-      }
-
-      public void writeUntil(final int end, final CodedOutputStream output)
-                             throws IOException {
-        while (next != null && next.getKey().getNumber() < end) {
-          FieldDescriptor descriptor = next.getKey();
-          if (messageSetWireFormat && descriptor.getLiteJavaType() ==
-                  WireFormat.JavaType.MESSAGE &&
-              !descriptor.isRepeated()) {
-            if (next instanceof LazyField.LazyEntry<?>) {
-              output.writeRawMessageSetExtension(descriptor.getNumber(),
-                  ((LazyField.LazyEntry<?>) next).getField().toByteString());
-            } else {
-              output.writeMessageSetExtension(descriptor.getNumber(),
-                                              (Message) next.getValue());
-            }
-          } else {
-            // TODO(xiangl): Taken care of following code, it may cause
-            // problem when we use LazyField for normal fields/extensions.
-            // Due to the optional field can be duplicated at the end of
-            // serialized bytes, which will make the serialized size change
-            // after lazy field parsed. So when we use LazyField globally,
-            // we need to change the following write method to write cached
-            // bytes directly rather than write the parsed message.
-            FieldSet.writeField(descriptor, next.getValue(), output);
-          }
-          if (iter.hasNext()) {
-            next = iter.next();
-          } else {
-            next = null;
-          }
-        }
-      }
-    }
-
-    protected ExtensionWriter newExtensionWriter() {
-      return new ExtensionWriter(false);
-    }
-    protected ExtensionWriter newMessageSetExtensionWriter() {
-      return new ExtensionWriter(true);
-    }
-
-    /** Called by subclasses to compute the size of extensions. */
-    protected int extensionsSerializedSize() {
-      return extensions.getSerializedSize();
-    }
-    protected int extensionsSerializedSizeAsMessageSet() {
-      return extensions.getMessageSetSerializedSize();
-    }
-
-    // ---------------------------------------------------------------
-    // Reflection
-
-    protected Map<FieldDescriptor, Object> getExtensionFields() {
-      return extensions.getAllFields();
-    }
-
-    @Override
-    public Map<FieldDescriptor, Object> getAllFields() {
-      final Map<FieldDescriptor, Object> result =
-          super.getAllFieldsMutable(/* getBytesForString = */ false);
-      result.putAll(getExtensionFields());
-      return Collections.unmodifiableMap(result);
-    }
-
-    @Override
-    public Map<FieldDescriptor, Object> getAllFieldsRaw() {
-      final Map<FieldDescriptor, Object> result =
-          super.getAllFieldsMutable(/* getBytesForString = */ false);
-      result.putAll(getExtensionFields());
-      return Collections.unmodifiableMap(result);
-    }
-
-    @Override
-    public boolean hasField(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        return extensions.hasField(field);
-      } else {
-        return super.hasField(field);
-      }
-    }
-
-    @Override
-    public Object getField(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        final Object value = extensions.getField(field);
-        if (value == null) {
-          if (field.isRepeated()) {
-            return Collections.emptyList();
-          } else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-            // Lacking an ExtensionRegistry, we have no way to determine the
-            // extension's real type, so we return a DynamicMessage.
-            return DynamicMessage.getDefaultInstance(field.getMessageType());
-          } else {
-            return field.getDefaultValue();
-          }
-        } else {
-          return value;
-        }
-      } else {
-        return super.getField(field);
-      }
-    }
-
-    @Override
-    public int getRepeatedFieldCount(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        return extensions.getRepeatedFieldCount(field);
-      } else {
-        return super.getRepeatedFieldCount(field);
-      }
-    }
-
-    @Override
-    public Object getRepeatedField(final FieldDescriptor field,
-                                   final int index) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        return extensions.getRepeatedField(field, index);
-      } else {
-        return super.getRepeatedField(field, index);
-      }
-    }
-
-    private void verifyContainingType(final FieldDescriptor field) {
-      if (field.getContainingType() != getDescriptorForType()) {
-        throw new IllegalArgumentException(
-          "FieldDescriptor does not match message type.");
-      }
-    }
-  }
-
-  /**
-   * Generated message builders for message types that contain extension ranges
-   * subclass this.
-   *
-   * <p>This class implements type-safe accessors for extensions.  They
-   * implement all the same operations that you can do with normal fields --
-   * e.g. "get", "set", and "add" -- but for extensions.  The extensions are
-   * identified using instances of the class {@link GeneratedExtension}; the
-   * protocol compiler generates a static instance of this class for every
-   * extension in its input.  Through the magic of generics, all is made
-   * type-safe.
-   *
-   * <p>For example, imagine you have the {@code .proto} file:
-   *
-   * <pre>
-   * option java_class = "MyProto";
-   *
-   * message Foo {
-   *   extensions 1000 to max;
-   * }
-   *
-   * extend Foo {
-   *   optional int32 bar;
-   * }
-   * </pre>
-   *
-   * <p>Then you might write code like:
-   *
-   * <pre>
-   * MyProto.Foo foo =
-   *   MyProto.Foo.newBuilder()
-   *     .setExtension(MyProto.bar, 123)
-   *     .build();
-   * </pre>
-   *
-   * <p>See also {@link ExtendableMessage}.
-   */
-  @SuppressWarnings("unchecked")
-  public abstract static class ExtendableBuilder<
-        MessageType extends ExtendableMessage,
-        BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
-      extends Builder<BuilderType>
-      implements ExtendableMessageOrBuilder<MessageType> {
-
-    private FieldSet<FieldDescriptor> extensions = FieldSet.emptySet();
-
-    protected ExtendableBuilder() {}
-
-    protected ExtendableBuilder(
-        BuilderParent parent) {
-      super(parent);
-    }
-
-    // For immutable message conversion.
-    void internalSetExtensionSet(FieldSet<FieldDescriptor> extensions) {
-      this.extensions = extensions;
-    }
-
-    @Override
-    public BuilderType clear() {
-      extensions = FieldSet.emptySet();
-      return super.clear();
-    }
-
-    private void ensureExtensionsIsMutable() {
-      if (extensions.isImmutable()) {
-        extensions = extensions.clone();
-      }
-    }
-
-    private void verifyExtensionContainingType(
-        final Extension<MessageType, ?> extension) {
-      if (extension.getDescriptor().getContainingType() !=
-          getDescriptorForType()) {
-        // This can only happen if someone uses unchecked operations.
-        throw new IllegalArgumentException(
-          "Extension is for type \"" +
-          extension.getDescriptor().getContainingType().getFullName() +
-          "\" which does not match message type \"" +
-          getDescriptorForType().getFullName() + "\".");
-      }
-    }
-
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extensionLite) {
-      Extension<MessageType, Type> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      return extensions.hasField(extension.getDescriptor());
-    }
-
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final ExtensionLite<MessageType, List<Type>> extensionLite) {
-      Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      final FieldDescriptor descriptor = extension.getDescriptor();
-      return extensions.getRepeatedFieldCount(descriptor);
-    }
-
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(final ExtensionLite<MessageType, Type> extensionLite) {
-      Extension<MessageType, Type> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      FieldDescriptor descriptor = extension.getDescriptor();
-      final Object value = extensions.getField(descriptor);
-      if (value == null) {
-        if (descriptor.isRepeated()) {
-          return (Type) Collections.emptyList();
-        } else if (descriptor.getJavaType() ==
-                   FieldDescriptor.JavaType.MESSAGE) {
-          return (Type) extension.getMessageDefaultInstance();
-        } else {
-          return (Type) extension.fromReflectionType(
-              descriptor.getDefaultValue());
-        }
-      } else {
-        return (Type) extension.fromReflectionType(value);
-      }
-    }
-
-    /** Get one element of a repeated extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final ExtensionLite<MessageType, List<Type>> extensionLite, final int index) {
-      Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      FieldDescriptor descriptor = extension.getDescriptor();
-      return (Type) extension.singularFromReflectionType(
-          extensions.getRepeatedField(descriptor, index));
-    }
-
-    /** Set the value of an extension. */
-    public final <Type> BuilderType setExtension(
-        final ExtensionLite<MessageType, Type> extensionLite,
-        final Type value) {
-      Extension<MessageType, Type> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      ensureExtensionsIsMutable();
-      final FieldDescriptor descriptor = extension.getDescriptor();
-      extensions.setField(descriptor, extension.toReflectionType(value));
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    /** Set the value of one element of a repeated extension. */
-    public final <Type> BuilderType setExtension(
-        final ExtensionLite<MessageType, List<Type>> extensionLite,
-        final int index, final Type value) {
-      Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      ensureExtensionsIsMutable();
-      final FieldDescriptor descriptor = extension.getDescriptor();
-      extensions.setRepeatedField(
-        descriptor, index,
-        extension.singularToReflectionType(value));
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    /** Append a value to a repeated extension. */
-    public final <Type> BuilderType addExtension(
-        final ExtensionLite<MessageType, List<Type>> extensionLite,
-        final Type value) {
-      Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      ensureExtensionsIsMutable();
-      final FieldDescriptor descriptor = extension.getDescriptor();
-      extensions.addRepeatedField(
-          descriptor, extension.singularToReflectionType(value));
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    /** Clear an extension. */
-    public final <Type> BuilderType clearExtension(
-        final ExtensionLite<MessageType, ?> extensionLite) {
-      Extension<MessageType, ?> extension = checkNotLite(extensionLite);
-
-      verifyExtensionContainingType(extension);
-      ensureExtensionsIsMutable();
-      extensions.clearField(extension.getDescriptor());
-      onChanged();
-      return (BuilderType) this;
-    }
-
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(final Extension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Check if a singular extension is present. */
-    @Override
-    public final <Type> boolean hasExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return hasExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final Extension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the number of elements in a repeated extension. */
-    @Override
-    public final <Type> int getExtensionCount(
-        final GeneratedExtension<MessageType, List<Type>> extension) {
-      return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(final Extension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, Type> extension) {
-      return getExtension((ExtensionLite<MessageType, Type>) extension);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final Extension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-    /** Get the value of an extension. */
-    @Override
-    public final <Type> Type getExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension, final int index) {
-      return getExtension((ExtensionLite<MessageType, List<Type>>) extension, index);
-    }
-    /** Set the value of an extension. */
-    public final <Type> BuilderType setExtension(
-        final Extension<MessageType, Type> extension, final Type value) {
-      return setExtension((ExtensionLite<MessageType, Type>) extension, value);
-    }
-    /** Set the value of an extension. */
-    public <Type> BuilderType setExtension(
-        final GeneratedExtension<MessageType, Type> extension, final Type value) {
-      return setExtension((ExtensionLite<MessageType, Type>) extension, value);
-    }
-    /** Set the value of one element of a repeated extension. */
-    public final <Type> BuilderType setExtension(
-        final Extension<MessageType, List<Type>> extension,
-        final int index, final Type value) {
-      return setExtension((ExtensionLite<MessageType, List<Type>>) extension, index, value);
-    }
-    /** Set the value of one element of a repeated extension. */
-    public <Type> BuilderType setExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension,
-        final int index, final Type value) {
-      return setExtension((ExtensionLite<MessageType, List<Type>>) extension, index, value);
-    }
-    /** Append a value to a repeated extension. */
-    public final <Type> BuilderType addExtension(
-        final Extension<MessageType, List<Type>> extension, final Type value) {
-      return addExtension((ExtensionLite<MessageType, List<Type>>) extension, value);
-    }
-    /** Append a value to a repeated extension. */
-    public <Type> BuilderType addExtension(
-        final GeneratedExtension<MessageType, List<Type>> extension, final Type value) {
-      return addExtension((ExtensionLite<MessageType, List<Type>>) extension, value);
-    }
-    /** Clear an extension. */
-    public final <Type> BuilderType clearExtension(
-        final Extension<MessageType, ?> extension) {
-      return clearExtension((ExtensionLite<MessageType, ?>) extension);
-    }
-    /** Clear an extension. */
-    public <Type> BuilderType clearExtension(
-        final GeneratedExtension<MessageType, ?> extension) {
-      return clearExtension((ExtensionLite<MessageType, ?>) extension);
-    }
-
-    /** Called by subclasses to check if all extensions are initialized. */
-    protected boolean extensionsAreInitialized() {
-      return extensions.isInitialized();
-    }
-
-    /**
-     * Called by the build code path to create a copy of the extensions for
-     * building the message.
-     */
-    private FieldSet<FieldDescriptor> buildExtensions() {
-      extensions.makeImmutable();
-      return extensions;
-    }
-
-    @Override
-    public boolean isInitialized() {
-      return super.isInitialized() && extensionsAreInitialized();
-    }
-
-    // ---------------------------------------------------------------
-    // Reflection
-
-    @Override
-    public Map<FieldDescriptor, Object> getAllFields() {
-      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();
-      result.putAll(extensions.getAllFields());
-      return Collections.unmodifiableMap(result);
-    }
-
-    @Override
-    public Object getField(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        final Object value = extensions.getField(field);
-        if (value == null) {
-          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-            // Lacking an ExtensionRegistry, we have no way to determine the
-            // extension's real type, so we return a DynamicMessage.
-            return DynamicMessage.getDefaultInstance(field.getMessageType());
-          } else {
-            return field.getDefaultValue();
-          }
-        } else {
-          return value;
-        }
-      } else {
-        return super.getField(field);
-      }
-    }
-
-    @Override
-    public int getRepeatedFieldCount(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        return extensions.getRepeatedFieldCount(field);
-      } else {
-        return super.getRepeatedFieldCount(field);
-      }
-    }
-
-    @Override
-    public Object getRepeatedField(final FieldDescriptor field,
-                                   final int index) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        return extensions.getRepeatedField(field, index);
-      } else {
-        return super.getRepeatedField(field, index);
-      }
-    }
-
-    @Override
-    public boolean hasField(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        return extensions.hasField(field);
-      } else {
-        return super.hasField(field);
-      }
-    }
-
-    @Override
-    public BuilderType setField(final FieldDescriptor field,
-                                final Object value) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        ensureExtensionsIsMutable();
-        extensions.setField(field, value);
-        onChanged();
-        return (BuilderType) this;
-      } else {
-        return super.setField(field, value);
-      }
-    }
-
-    @Override
-    public BuilderType clearField(final FieldDescriptor field) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        ensureExtensionsIsMutable();
-        extensions.clearField(field);
-        onChanged();
-        return (BuilderType) this;
-      } else {
-        return super.clearField(field);
-      }
-    }
-
-    @Override
-    public BuilderType setRepeatedField(final FieldDescriptor field,
-                                        final int index, final Object value) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        ensureExtensionsIsMutable();
-        extensions.setRepeatedField(field, index, value);
-        onChanged();
-        return (BuilderType) this;
-      } else {
-        return super.setRepeatedField(field, index, value);
-      }
-    }
-
-    @Override
-    public BuilderType addRepeatedField(final FieldDescriptor field,
-                                        final Object value) {
-      if (field.isExtension()) {
-        verifyContainingType(field);
-        ensureExtensionsIsMutable();
-        extensions.addRepeatedField(field, value);
-        onChanged();
-        return (BuilderType) this;
-      } else {
-        return super.addRepeatedField(field, value);
-      }
-    }
-
-    protected final void mergeExtensionFields(final ExtendableMessage other) {
-      ensureExtensionsIsMutable();
-      extensions.mergeFrom(other.extensions);
-      onChanged();
-    }
-
-    private void verifyContainingType(final FieldDescriptor field) {
-      if (field.getContainingType() != getDescriptorForType()) {
-        throw new IllegalArgumentException(
-          "FieldDescriptor does not match message type.");
-      }
-    }
-  }
-
-  // -----------------------------------------------------------------
-
-  /**
-   * Gets the descriptor for an extension. The implementation depends on whether
-   * the extension is scoped in the top level of a file or scoped in a Message.
-   */
-  static interface ExtensionDescriptorRetriever {
-    FieldDescriptor getDescriptor();
-  }
-
-
-  // =================================================================
-
-  /** Calls Class.getMethod and throws a RuntimeException if it fails. */
-  @SuppressWarnings("unchecked")
-  private static Method getMethodOrDie(
-      final Class clazz, final String name, final Class... params) {
-    try {
-      return clazz.getMethod(name, params);
-    } catch (NoSuchMethodException e) {
-      throw new RuntimeException(
-        "Generated message class \"" + clazz.getName() +
-        "\" missing method \"" + name + "\".", e);
-    }
-  }
-
-  /** Calls invoke and throws a RuntimeException if it fails. */
-  private static Object invokeOrDie(
-      final Method method, final Object object, final Object... params) {
-    try {
-      return method.invoke(object, params);
-    } catch (IllegalAccessException e) {
-      throw new RuntimeException(
-        "Couldn't use Java reflection to implement protocol message " +
-        "reflection.", e);
-    } catch (InvocationTargetException e) {
-      final Throwable cause = e.getCause();
-      if (cause instanceof RuntimeException) {
-        throw (RuntimeException) cause;
-      } else if (cause instanceof Error) {
-        throw (Error) cause;
-      } else {
-        throw new RuntimeException(
-          "Unexpected exception thrown by generated accessor method.", cause);
-      }
-    }
-  }
-
-  /**
-   * Gets the map field with the given field number. This method should be
-   * overridden in the generated message class if the message contains map
-   * fields.
-   *
-   * Unlike other field types, reflection support for map fields can't be
-   * implemented based on generated public API because we need to access a
-   * map field as a list in reflection API but the generated API only allows
-   * us to access it as a map. This method returns the underlying map field
-   * directly and thus enables us to access the map field as a list.
-   */
-  @SuppressWarnings({"rawtypes", "unused"})
-  protected MapField internalGetMapField(int fieldNumber) {
-    // Note that we can't use descriptor names here because this method will
-    // be called when descriptor is being initialized.
-    throw new RuntimeException(
-        "No map fields found in " + getClass().getName());
-  }
-
-  /**
-   * Users should ignore this class.  This class provides the implementation
-   * with access to the fields of a message object using Java reflection.
-   */
-  public static final class FieldAccessorTable {
-
-    /**
-     * Construct a FieldAccessorTable for a particular message class.  Only
-     * one FieldAccessorTable should ever be constructed per class.
-     *
-     * @param descriptor     The type's descriptor.
-     * @param camelCaseNames The camelcase names of all fields in the message.
-     *                       These are used to derive the accessor method names.
-     * @param messageClass   The message type.
-     * @param builderClass   The builder type.
-     */
-    public FieldAccessorTable(
-        final Descriptor descriptor,
-        final String[] camelCaseNames,
-        final Class<? extends GeneratedMessageV3> messageClass,
-        final Class<? extends Builder> builderClass) {
-      this(descriptor, camelCaseNames);
-      ensureFieldAccessorsInitialized(messageClass, builderClass);
-    }
-
-    /**
-     * Construct a FieldAccessorTable for a particular message class without
-     * initializing FieldAccessors.
-     */
-    public FieldAccessorTable(
-        final Descriptor descriptor,
-        final String[] camelCaseNames) {
-      this.descriptor = descriptor;
-      this.camelCaseNames = camelCaseNames;
-      fields = new FieldAccessor[descriptor.getFields().size()];
-      oneofs = new OneofAccessor[descriptor.getOneofs().size()];
-      initialized = false;
-    }
-
-    /**
-     * Ensures the field accessors are initialized. This method is thread-safe.
-     *
-     * @param messageClass   The message type.
-     * @param builderClass   The builder type.
-     * @return this
-     */
-    public FieldAccessorTable ensureFieldAccessorsInitialized(
-        Class<? extends GeneratedMessageV3> messageClass,
-        Class<? extends Builder> builderClass) {
-      if (initialized) { return this; }
-      synchronized (this) {
-        if (initialized) { return this; }
-        int fieldsSize = fields.length;
-        for (int i = 0; i < fieldsSize; i++) {
-          FieldDescriptor field = descriptor.getFields().get(i);
-          String containingOneofCamelCaseName = null;
-          if (field.getContainingOneof() != null) {
-            containingOneofCamelCaseName =
-                camelCaseNames[fieldsSize + field.getContainingOneof().getIndex()];
-          }
-          if (field.isRepeated()) {
-            if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-              if (field.isMapField()) {
-                fields[i] = new MapFieldAccessor(
-                    field, camelCaseNames[i], messageClass, builderClass);
-              } else {
-                fields[i] = new RepeatedMessageFieldAccessor(
-                    field, camelCaseNames[i], messageClass, builderClass);
-              }
-            } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
-              fields[i] = new RepeatedEnumFieldAccessor(
-                  field, camelCaseNames[i], messageClass, builderClass);
-            } else {
-              fields[i] = new RepeatedFieldAccessor(
-                  field, camelCaseNames[i], messageClass, builderClass);
-            }
-          } else {
-            if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-              fields[i] = new SingularMessageFieldAccessor(
-                  field, camelCaseNames[i], messageClass, builderClass,
-                  containingOneofCamelCaseName);
-            } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
-              fields[i] = new SingularEnumFieldAccessor(
-                  field, camelCaseNames[i], messageClass, builderClass,
-                  containingOneofCamelCaseName);
-            } else if (field.getJavaType() == FieldDescriptor.JavaType.STRING) {
-              fields[i] = new SingularStringFieldAccessor(
-                  field, camelCaseNames[i], messageClass, builderClass,
-                  containingOneofCamelCaseName);
-            } else {
-              fields[i] = new SingularFieldAccessor(
-                  field, camelCaseNames[i], messageClass, builderClass,
-                  containingOneofCamelCaseName);
-            }
-          }
-        }
-
-        int oneofsSize = oneofs.length;
-        for (int i = 0; i < oneofsSize; i++) {
-          oneofs[i] = new OneofAccessor(
-              descriptor, camelCaseNames[i + fieldsSize],
-              messageClass, builderClass);
-        }
-        initialized = true;
-        camelCaseNames = null;
-        return this;
-      }
-    }
-
-    private final Descriptor descriptor;
-    private final FieldAccessor[] fields;
-    private String[] camelCaseNames;
-    private final OneofAccessor[] oneofs;
-    private volatile boolean initialized;
-
-    /** Get the FieldAccessor for a particular field. */
-    private FieldAccessor getField(final FieldDescriptor field) {
-      if (field.getContainingType() != descriptor) {
-        throw new IllegalArgumentException(
-          "FieldDescriptor does not match message type.");
-      } else if (field.isExtension()) {
-        // If this type had extensions, it would subclass ExtendableMessage,
-        // which overrides the reflection interface to handle extensions.
-        throw new IllegalArgumentException(
-          "This type does not have extensions.");
-      }
-      return fields[field.getIndex()];
-    }
-
-    /** Get the OneofAccessor for a particular oneof. */
-    private OneofAccessor getOneof(final OneofDescriptor oneof) {
-      if (oneof.getContainingType() != descriptor) {
-        throw new IllegalArgumentException(
-          "OneofDescriptor does not match message type.");
-      }
-      return oneofs[oneof.getIndex()];
-    }
-
-    /**
-     * Abstract interface that provides access to a single field.  This is
-     * implemented differently depending on the field type and cardinality.
-     */
-    private interface FieldAccessor {
-      Object get(GeneratedMessageV3 message);
-      Object get(GeneratedMessageV3.Builder builder);
-      Object getRaw(GeneratedMessageV3 message);
-      Object getRaw(GeneratedMessageV3.Builder builder);
-      void set(Builder builder, Object value);
-      Object getRepeated(GeneratedMessageV3 message, int index);
-      Object getRepeated(GeneratedMessageV3.Builder builder, int index);
-      Object getRepeatedRaw(GeneratedMessageV3 message, int index);
-      Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index);
-      void setRepeated(Builder builder,
-                       int index, Object value);
-      void addRepeated(Builder builder, Object value);
-      boolean has(GeneratedMessageV3 message);
-      boolean has(GeneratedMessageV3.Builder builder);
-      int getRepeatedCount(GeneratedMessageV3 message);
-      int getRepeatedCount(GeneratedMessageV3.Builder builder);
-      void clear(Builder builder);
-      Message.Builder newBuilder();
-      Message.Builder getBuilder(GeneratedMessageV3.Builder builder);
-      Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder,
-                                         int index);
-    }
-
-    /** OneofAccessor provides access to a single oneof. */
-    private static class OneofAccessor {
-      OneofAccessor(
-          final Descriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass) {
-        this.descriptor = descriptor;
-        caseMethod =
-            getMethodOrDie(messageClass, "get" + camelCaseName + "Case");
-        caseMethodBuilder =
-            getMethodOrDie(builderClass, "get" + camelCaseName + "Case");
-        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
-      }
-
-      private final Descriptor descriptor;
-      private final Method caseMethod;
-      private final Method caseMethodBuilder;
-      private final Method clearMethod;
-
-      public boolean has(final GeneratedMessageV3 message) {
-        if (((Internal.EnumLite) invokeOrDie(caseMethod, message)).getNumber() == 0) {
-          return false;
-        }
-        return true;
-      }
-
-      public boolean has(GeneratedMessageV3.Builder builder) {
-        if (((Internal.EnumLite) invokeOrDie(caseMethodBuilder, builder)).getNumber() == 0) {
-          return false;
-        }
-        return true;
-      }
-
-      public FieldDescriptor get(final GeneratedMessageV3 message) {
-        int fieldNumber = ((Internal.EnumLite) invokeOrDie(caseMethod, message)).getNumber();
-        if (fieldNumber > 0) {
-          return descriptor.findFieldByNumber(fieldNumber);
-        }
-        return null;
-      }
-
-      public FieldDescriptor get(GeneratedMessageV3.Builder builder) {
-        int fieldNumber = ((Internal.EnumLite) invokeOrDie(caseMethodBuilder, builder)).getNumber();
-        if (fieldNumber > 0) {
-          return descriptor.findFieldByNumber(fieldNumber);
-        }
-        return null;
-      }
-
-      public void clear(final Builder builder) {
-        invokeOrDie(clearMethod, builder);
-      }
-    }
-
-    private static boolean supportFieldPresence(FileDescriptor file) {
-      return file.getSyntax() == FileDescriptor.Syntax.PROTO2;
-    }
-
-    // ---------------------------------------------------------------
-
-    private static class SingularFieldAccessor implements FieldAccessor {
-      SingularFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass,
-          final String containingOneofCamelCaseName) {
-        field = descriptor;
-        isOneofField = descriptor.getContainingOneof() != null;
-        hasHasMethod = supportFieldPresence(descriptor.getFile())
-            || (!isOneofField && descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE);
-        getMethod = getMethodOrDie(messageClass, "get" + camelCaseName);
-        getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName);
-        type = getMethod.getReturnType();
-        setMethod = getMethodOrDie(builderClass, "set" + camelCaseName, type);
-        hasMethod =
-            hasHasMethod ? getMethodOrDie(messageClass, "has" + camelCaseName) : null;
-        hasMethodBuilder =
-            hasHasMethod ? getMethodOrDie(builderClass, "has" + camelCaseName) : null;
-        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
-        caseMethod = isOneofField ? getMethodOrDie(
-            messageClass, "get" + containingOneofCamelCaseName + "Case") : null;
-        caseMethodBuilder = isOneofField ? getMethodOrDie(
-            builderClass, "get" + containingOneofCamelCaseName + "Case") : null;
-      }
-
-      // Note:  We use Java reflection to call public methods rather than
-      //   access private fields directly as this avoids runtime security
-      //   checks.
-      protected final Class<?> type;
-      protected final Method getMethod;
-      protected final Method getMethodBuilder;
-      protected final Method setMethod;
-      protected final Method hasMethod;
-      protected final Method hasMethodBuilder;
-      protected final Method clearMethod;
-      protected final Method caseMethod;
-      protected final Method caseMethodBuilder;
-      protected final FieldDescriptor field;
-      protected final boolean isOneofField;
-      protected final boolean hasHasMethod;
-
-      private int getOneofFieldNumber(final GeneratedMessageV3 message) {
-        return ((Internal.EnumLite) invokeOrDie(caseMethod, message)).getNumber();
-      }
-
-      private int getOneofFieldNumber(final GeneratedMessageV3.Builder builder) {
-        return ((Internal.EnumLite) invokeOrDie(caseMethodBuilder, builder)).getNumber();
-      }
-
-      @Override
-      public Object get(final GeneratedMessageV3 message) {
-        return invokeOrDie(getMethod, message);
-      }
-      @Override
-      public Object get(GeneratedMessageV3.Builder builder) {
-        return invokeOrDie(getMethodBuilder, builder);
-      }
-      @Override
-      public Object getRaw(final GeneratedMessageV3 message) {
-        return get(message);
-      }
-      @Override
-      public Object getRaw(GeneratedMessageV3.Builder builder) {
-        return get(builder);
-      }
-      @Override
-      public void set(final Builder builder, final Object value) {
-        invokeOrDie(setMethod, builder, value);
-      }
-      @Override
-      public Object getRepeated(final GeneratedMessageV3 message, final int index) {
-        throw new UnsupportedOperationException(
-          "getRepeatedField() called on a singular field.");
-      }
-      @Override
-      public Object getRepeatedRaw(final GeneratedMessageV3 message, final int index) {
-        throw new UnsupportedOperationException(
-          "getRepeatedFieldRaw() called on a singular field.");
-      }
-      @Override
-      public Object getRepeated(GeneratedMessageV3.Builder builder, int index) {
-        throw new UnsupportedOperationException(
-          "getRepeatedField() called on a singular field.");
-      }
-      @Override
-      public Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index) {
-        throw new UnsupportedOperationException(
-          "getRepeatedFieldRaw() called on a singular field.");
-      }
-      @Override
-      public void setRepeated(final Builder builder, final int index, final Object value) {
-        throw new UnsupportedOperationException(
-          "setRepeatedField() called on a singular field.");
-      }
-      @Override
-      public void addRepeated(final Builder builder, final Object value) {
-        throw new UnsupportedOperationException(
-          "addRepeatedField() called on a singular field.");
-      }
-      @Override
-      public boolean has(final GeneratedMessageV3 message) {
-        if (!hasHasMethod) {
-          if (isOneofField) {
-            return getOneofFieldNumber(message) == field.getNumber();
-          }
-          return !get(message).equals(field.getDefaultValue());
-        }
-        return (Boolean) invokeOrDie(hasMethod, message);
-      }
-      @Override
-      public boolean has(GeneratedMessageV3.Builder builder) {
-        if (!hasHasMethod) {
-          if (isOneofField) {
-            return getOneofFieldNumber(builder) == field.getNumber();
-          }
-          return !get(builder).equals(field.getDefaultValue());
-        }
-        return (Boolean) invokeOrDie(hasMethodBuilder, builder);
-      }
-      @Override
-      public int getRepeatedCount(final GeneratedMessageV3 message) {
-        throw new UnsupportedOperationException(
-          "getRepeatedFieldSize() called on a singular field.");
-      }
-      @Override
-      public int getRepeatedCount(GeneratedMessageV3.Builder builder) {
-        throw new UnsupportedOperationException(
-          "getRepeatedFieldSize() called on a singular field.");
-      }
-      @Override
-      public void clear(final Builder builder) {
-        invokeOrDie(clearMethod, builder);
-      }
-      @Override
-      public Message.Builder newBuilder() {
-        throw new UnsupportedOperationException(
-          "newBuilderForField() called on a non-Message type.");
-      }
-      @Override
-      public Message.Builder getBuilder(GeneratedMessageV3.Builder builder) {
-        throw new UnsupportedOperationException(
-          "getFieldBuilder() called on a non-Message type.");
-      }
-      @Override
-      public Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder, int index) {
-        throw new UnsupportedOperationException(
-          "getRepeatedFieldBuilder() called on a non-Message type.");
-      }
-    }
-
-    private static class RepeatedFieldAccessor implements FieldAccessor {
-      protected final Class type;
-      protected final Method getMethod;
-      protected final Method getMethodBuilder;
-      protected final Method getRepeatedMethod;
-      protected final Method getRepeatedMethodBuilder;
-      protected final Method setRepeatedMethod;
-      protected final Method addRepeatedMethod;
-      protected final Method getCountMethod;
-      protected final Method getCountMethodBuilder;
-      protected final Method clearMethod;
-
-      RepeatedFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass) {
-        getMethod = getMethodOrDie(messageClass,
-                                   "get" + camelCaseName + "List");
-        getMethodBuilder = getMethodOrDie(builderClass,
-                                   "get" + camelCaseName + "List");
-        getRepeatedMethod =
-            getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE);
-        getRepeatedMethodBuilder =
-            getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE);
-        type = getRepeatedMethod.getReturnType();
-        setRepeatedMethod =
-            getMethodOrDie(builderClass, "set" + camelCaseName,
-                           Integer.TYPE, type);
-        addRepeatedMethod =
-            getMethodOrDie(builderClass, "add" + camelCaseName, type);
-        getCountMethod =
-            getMethodOrDie(messageClass, "get" + camelCaseName + "Count");
-        getCountMethodBuilder =
-            getMethodOrDie(builderClass, "get" + camelCaseName + "Count");
-
-        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
-      }
-
-      @Override
-      public Object get(final GeneratedMessageV3 message) {
-        return invokeOrDie(getMethod, message);
-      }
-      @Override
-      public Object get(GeneratedMessageV3.Builder builder) {
-        return invokeOrDie(getMethodBuilder, builder);
-      }
-      @Override
-      public Object getRaw(final GeneratedMessageV3 message) {
-        return get(message);
-      }
-      @Override
-      public Object getRaw(GeneratedMessageV3.Builder builder) {
-        return get(builder);
-      }
-      @Override
-      public void set(final Builder builder, final Object value) {
-        // Add all the elements individually.  This serves two purposes:
-        // 1) Verifies that each element has the correct type.
-        // 2) Insures that the caller cannot modify the list later on and
-        //    have the modifications be reflected in the message.
-        clear(builder);
-        for (final Object element : (List<?>) value) {
-          addRepeated(builder, element);
-        }
-      }
-      @Override
-      public Object getRepeated(final GeneratedMessageV3 message, final int index) {
-        return invokeOrDie(getRepeatedMethod, message, index);
-      }
-      @Override
-      public Object getRepeated(GeneratedMessageV3.Builder builder, int index) {
-        return invokeOrDie(getRepeatedMethodBuilder, builder, index);
-      }
-      @Override
-      public Object getRepeatedRaw(GeneratedMessageV3 message, int index) {
-        return getRepeated(message, index);
-      }
-      @Override
-      public Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index) {
-        return getRepeated(builder, index);
-      }
-      @Override
-      public void setRepeated(final Builder builder, final int index, final Object value) {
-        invokeOrDie(setRepeatedMethod, builder, index, value);
-      }
-      @Override
-      public void addRepeated(final Builder builder, final Object value) {
-        invokeOrDie(addRepeatedMethod, builder, value);
-      }
-      @Override
-      public boolean has(final GeneratedMessageV3 message) {
-        throw new UnsupportedOperationException(
-          "hasField() called on a repeated field.");
-      }
-      @Override
-      public boolean has(GeneratedMessageV3.Builder builder) {
-        throw new UnsupportedOperationException(
-          "hasField() called on a repeated field.");
-      }
-      @Override
-      public int getRepeatedCount(final GeneratedMessageV3 message) {
-        return (Integer) invokeOrDie(getCountMethod, message);
-      }
-      @Override
-      public int getRepeatedCount(GeneratedMessageV3.Builder builder) {
-        return (Integer) invokeOrDie(getCountMethodBuilder, builder);
-      }
-      @Override
-      public void clear(final Builder builder) {
-        invokeOrDie(clearMethod, builder);
-      }
-      @Override
-      public Message.Builder newBuilder() {
-        throw new UnsupportedOperationException(
-          "newBuilderForField() called on a non-Message type.");
-      }
-      @Override
-      public Message.Builder getBuilder(GeneratedMessageV3.Builder builder) {
-        throw new UnsupportedOperationException(
-          "getFieldBuilder() called on a non-Message type.");
-      }
-      @Override
-      public Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder, int index) {
-        throw new UnsupportedOperationException(
-          "getRepeatedFieldBuilder() called on a non-Message type.");
-      }
-    }
-
-    private static class MapFieldAccessor implements FieldAccessor {
-      MapFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass) {
-        field = descriptor;
-        Method getDefaultInstanceMethod =
-            getMethodOrDie(messageClass, "getDefaultInstance");
-        MapField defaultMapField = getMapField(
-            (GeneratedMessageV3) invokeOrDie(getDefaultInstanceMethod, null));
-        mapEntryMessageDefaultInstance =
-            defaultMapField.getMapEntryMessageDefaultInstance();
-      }
-
-      private final FieldDescriptor field;
-      private final Message mapEntryMessageDefaultInstance;
-
-      private MapField<?, ?> getMapField(GeneratedMessageV3 message) {
-        return (MapField<?, ?>) message.internalGetMapField(field.getNumber());
-      }
-
-      private MapField<?, ?> getMapField(GeneratedMessageV3.Builder builder) {
-        return (MapField<?, ?>) builder.internalGetMapField(field.getNumber());
-      }
-
-      private MapField<?, ?> getMutableMapField(
-          GeneratedMessageV3.Builder builder) {
-        return (MapField<?, ?>) builder.internalGetMutableMapField(
-            field.getNumber());
-      }
-
-      private Message coerceType(Message value) {
-        if (value == null) {
-          return null;
-        }
-        if (mapEntryMessageDefaultInstance.getClass().isInstance(value)) {
-          return value;
-        }
-        // The value is not the exact right message type.  However, if it
-        // is an alternative implementation of the same type -- e.g. a
-        // DynamicMessage -- we should accept it.  In this case we can make
-        // a copy of the message.
-        return mapEntryMessageDefaultInstance.toBuilder().mergeFrom(value).build();
-      }
-
-      @Override
-      @SuppressWarnings("unchecked")
-      public Object get(GeneratedMessageV3 message) {
-        List result = new ArrayList();
-        for (int i = 0; i < getRepeatedCount(message); i++) {
-          result.add(getRepeated(message, i));
-        }
-        return Collections.unmodifiableList(result);
-      }
-
-      @Override
-      @SuppressWarnings("unchecked")
-      public Object get(Builder builder) {
-        List result = new ArrayList();
-        for (int i = 0; i < getRepeatedCount(builder); i++) {
-          result.add(getRepeated(builder, i));
-        }
-        return Collections.unmodifiableList(result);
-      }
-
-      @Override
-      public Object getRaw(GeneratedMessageV3 message) {
-        return get(message);
-      }
-
-      @Override
-      public Object getRaw(GeneratedMessageV3.Builder builder) {
-        return get(builder);
-      }
-
-      @Override
-      public void set(Builder builder, Object value) {
-        clear(builder);
-        for (Object entry : (List) value) {
-          addRepeated(builder, entry);
-        }
-      }
-
-      @Override
-      public Object getRepeated(GeneratedMessageV3 message, int index) {
-        return getMapField(message).getList().get(index);
-      }
-
-      @Override
-      public Object getRepeated(Builder builder, int index) {
-        return getMapField(builder).getList().get(index);
-      }
-
-      @Override
-      public Object getRepeatedRaw(GeneratedMessageV3 message, int index) {
-        return getRepeated(message, index);
-      }
-
-      @Override
-      public Object getRepeatedRaw(Builder builder, int index) {
-        return getRepeated(builder, index);
-      }
-
-      @Override
-      public void setRepeated(Builder builder, int index, Object value) {
-        getMutableMapField(builder).getMutableList().set(index, coerceType((Message) value));
-      }
-
-      @Override
-      public void addRepeated(Builder builder, Object value) {
-        getMutableMapField(builder).getMutableList().add(coerceType((Message) value));
-      }
-
-      @Override
-      public boolean has(GeneratedMessageV3 message) {
-        throw new UnsupportedOperationException(
-            "hasField() is not supported for repeated fields.");
-      }
-
-      @Override
-      public boolean has(Builder builder) {
-        throw new UnsupportedOperationException(
-            "hasField() is not supported for repeated fields.");
-      }
-
-      @Override
-      public int getRepeatedCount(GeneratedMessageV3 message) {
-        return getMapField(message).getList().size();
-      }
-
-      @Override
-      public int getRepeatedCount(Builder builder) {
-        return getMapField(builder).getList().size();
-      }
-
-      @Override
-      public void clear(Builder builder) {
-        getMutableMapField(builder).getMutableList().clear();
-      }
-
-      @Override
-      public com.google.protobuf.Message.Builder newBuilder() {
-        return mapEntryMessageDefaultInstance.newBuilderForType();
-      }
-
-      @Override
-      public com.google.protobuf.Message.Builder getBuilder(Builder builder) {
-        throw new UnsupportedOperationException(
-            "Nested builder not supported for map fields.");
-      }
-
-      @Override
-      public com.google.protobuf.Message.Builder getRepeatedBuilder(Builder builder, int index) {
-        throw new UnsupportedOperationException(
-            "Nested builder not supported for map fields.");
-      }
-    }
-
-    // ---------------------------------------------------------------
-
-    private static final class SingularEnumFieldAccessor
-        extends SingularFieldAccessor {
-      SingularEnumFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass,
-          final String containingOneofCamelCaseName) {
-        super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
-
-        enumDescriptor = descriptor.getEnumType();
-
-        valueOfMethod = getMethodOrDie(type, "valueOf",
-                                       EnumValueDescriptor.class);
-        getValueDescriptorMethod =
-          getMethodOrDie(type, "getValueDescriptor");
-
-        supportUnknownEnumValue = descriptor.getFile().supportsUnknownEnumValue();
-        if (supportUnknownEnumValue) {
-          getValueMethod =
-              getMethodOrDie(messageClass, "get" + camelCaseName + "Value");
-          getValueMethodBuilder =
-              getMethodOrDie(builderClass, "get" + camelCaseName + "Value");
-          setValueMethod =
-              getMethodOrDie(builderClass, "set" + camelCaseName + "Value", int.class);
-        }
-      }
-
-      private EnumDescriptor enumDescriptor;
-
-      private Method valueOfMethod;
-      private Method getValueDescriptorMethod;
-
-      private boolean supportUnknownEnumValue;
-      private Method getValueMethod;
-      private Method getValueMethodBuilder;
-      private Method setValueMethod;
-
-      @Override
-      public Object get(final GeneratedMessageV3 message) {
-        if (supportUnknownEnumValue) {
-          int value = (Integer) invokeOrDie(getValueMethod, message);
-          return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
-        }
-        return invokeOrDie(getValueDescriptorMethod, super.get(message));
-      }
-
-      @Override
-      public Object get(final GeneratedMessageV3.Builder builder) {
-        if (supportUnknownEnumValue) {
-          int value = (Integer) invokeOrDie(getValueMethodBuilder, builder);
-          return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
-        }
-        return invokeOrDie(getValueDescriptorMethod, super.get(builder));
-      }
-
-      @Override
-      public void set(final Builder builder, final Object value) {
-        if (supportUnknownEnumValue) {
-          invokeOrDie(setValueMethod, builder,
-              ((EnumValueDescriptor) value).getNumber());
-          return;
-        }
-        super.set(builder, invokeOrDie(valueOfMethod, null, value));
-      }
-    }
-
-    private static final class RepeatedEnumFieldAccessor
-        extends RepeatedFieldAccessor {
-      RepeatedEnumFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass) {
-        super(descriptor, camelCaseName, messageClass, builderClass);
-
-        enumDescriptor = descriptor.getEnumType();
-
-        valueOfMethod = getMethodOrDie(type, "valueOf",
-                                       EnumValueDescriptor.class);
-        getValueDescriptorMethod =
-          getMethodOrDie(type, "getValueDescriptor");
-
-        supportUnknownEnumValue = descriptor.getFile().supportsUnknownEnumValue();
-        if (supportUnknownEnumValue) {
-          getRepeatedValueMethod =
-              getMethodOrDie(messageClass, "get" + camelCaseName + "Value", int.class);
-          getRepeatedValueMethodBuilder =
-              getMethodOrDie(builderClass, "get" + camelCaseName + "Value", int.class);
-          setRepeatedValueMethod =
-              getMethodOrDie(builderClass, "set" + camelCaseName + "Value", int.class, int.class);
-          addRepeatedValueMethod =
-              getMethodOrDie(builderClass, "add" + camelCaseName + "Value", int.class);
-        }
-      }
-      private EnumDescriptor enumDescriptor;
-
-      private final Method valueOfMethod;
-      private final Method getValueDescriptorMethod;
-
-      private boolean supportUnknownEnumValue;
-      private Method getRepeatedValueMethod;
-      private Method getRepeatedValueMethodBuilder;
-      private Method setRepeatedValueMethod;
-      private Method addRepeatedValueMethod;
-
-      @Override
-      @SuppressWarnings("unchecked")
-      public Object get(final GeneratedMessageV3 message) {
-        final List newList = new ArrayList();
-        final int size = getRepeatedCount(message);
-        for (int i = 0; i < size; i++) {
-          newList.add(getRepeated(message, i));
-        }
-        return Collections.unmodifiableList(newList);
-      }
-
-      @Override
-      @SuppressWarnings("unchecked")
-      public Object get(final GeneratedMessageV3.Builder builder) {
-        final List newList = new ArrayList();
-        final int size = getRepeatedCount(builder);
-        for (int i = 0; i < size; i++) {
-          newList.add(getRepeated(builder, i));
-        }
-        return Collections.unmodifiableList(newList);
-      }
-
-      @Override
-      public Object getRepeated(final GeneratedMessageV3 message,
-                                final int index) {
-        if (supportUnknownEnumValue) {
-          int value = (Integer) invokeOrDie(getRepeatedValueMethod, message, index);
-          return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
-        }
-        return invokeOrDie(getValueDescriptorMethod,
-          super.getRepeated(message, index));
-      }
-      @Override
-      public Object getRepeated(final GeneratedMessageV3.Builder builder,
-                                final int index) {
-        if (supportUnknownEnumValue) {
-          int value = (Integer) invokeOrDie(getRepeatedValueMethodBuilder, builder, index);
-          return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
-        }
-        return invokeOrDie(getValueDescriptorMethod,
-          super.getRepeated(builder, index));
-      }
-      @Override
-      public void setRepeated(final Builder builder,
-                              final int index, final Object value) {
-        if (supportUnknownEnumValue) {
-          invokeOrDie(setRepeatedValueMethod, builder, index,
-              ((EnumValueDescriptor) value).getNumber());
-          return;
-        }
-        super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null,
-                          value));
-      }
-      @Override
-      public void addRepeated(final Builder builder, final Object value) {
-        if (supportUnknownEnumValue) {
-          invokeOrDie(addRepeatedValueMethod, builder,
-              ((EnumValueDescriptor) value).getNumber());
-          return;
-        }
-        super.addRepeated(builder, invokeOrDie(valueOfMethod, null, value));
-      }
-    }
-
-    // ---------------------------------------------------------------
-
-    /**
-     * Field accessor for string fields.
-     *
-     * <p>This class makes getFooBytes() and setFooBytes() available for
-     * reflection API so that reflection based serialize/parse functions can
-     * access the raw bytes of the field to preserve non-UTF8 bytes in the
-     * string.
-     *
-     * <p>This ensures the serialize/parse round-trip safety, which is important
-     * for servers which forward messages.
-     */
-    private static final class SingularStringFieldAccessor
-        extends SingularFieldAccessor {
-      SingularStringFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass,
-          final String containingOneofCamelCaseName) {
-        super(descriptor, camelCaseName, messageClass, builderClass,
-            containingOneofCamelCaseName);
-        getBytesMethod = getMethodOrDie(messageClass,
-            "get" + camelCaseName + "Bytes");
-        getBytesMethodBuilder = getMethodOrDie(builderClass,
-            "get" + camelCaseName + "Bytes");
-        setBytesMethodBuilder = getMethodOrDie(builderClass,
-            "set" + camelCaseName + "Bytes", ByteString.class);
-      }
-
-      private final Method getBytesMethod;
-      private final Method getBytesMethodBuilder;
-      private final Method setBytesMethodBuilder;
-
-      @Override
-      public Object getRaw(final GeneratedMessageV3 message) {
-        return invokeOrDie(getBytesMethod, message);
-      }
-
-      @Override
-      public Object getRaw(GeneratedMessageV3.Builder builder) {
-        return invokeOrDie(getBytesMethodBuilder, builder);
-      }
-
-      @Override
-      public void set(GeneratedMessageV3.Builder builder, Object value) {
-        if (value instanceof ByteString) {
-          invokeOrDie(setBytesMethodBuilder, builder, value);
-        } else {
-          super.set(builder, value);
-        }
-      }
-    }
-
-    // ---------------------------------------------------------------
-
-    private static final class SingularMessageFieldAccessor
-        extends SingularFieldAccessor {
-      SingularMessageFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass,
-          final String containingOneofCamelCaseName) {
-        super(descriptor, camelCaseName, messageClass, builderClass,
-            containingOneofCamelCaseName);
-
-        newBuilderMethod = getMethodOrDie(type, "newBuilder");
-        getBuilderMethodBuilder =
-            getMethodOrDie(builderClass, "get" + camelCaseName + "Builder");
-      }
-
-      private final Method newBuilderMethod;
-      private final Method getBuilderMethodBuilder;
-
-      private Object coerceType(final Object value) {
-        if (type.isInstance(value)) {
-          return value;
-        } else {
-          // The value is not the exact right message type.  However, if it
-          // is an alternative implementation of the same type -- e.g. a
-          // DynamicMessage -- we should accept it.  In this case we can make
-          // a copy of the message.
-          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
-                  .mergeFrom((Message) value).buildPartial();
-        }
-      }
-
-      @Override
-      public void set(final Builder builder, final Object value) {
-        super.set(builder, coerceType(value));
-      }
-      @Override
-      public Message.Builder newBuilder() {
-        return (Message.Builder) invokeOrDie(newBuilderMethod, null);
-      }
-      @Override
-      public Message.Builder getBuilder(GeneratedMessageV3.Builder builder) {
-        return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder);
-      }
-    }
-
-    private static final class RepeatedMessageFieldAccessor
-        extends RepeatedFieldAccessor {
-      RepeatedMessageFieldAccessor(
-          final FieldDescriptor descriptor, final String camelCaseName,
-          final Class<? extends GeneratedMessageV3> messageClass,
-          final Class<? extends Builder> builderClass) {
-        super(descriptor, camelCaseName, messageClass, builderClass);
-
-        newBuilderMethod = getMethodOrDie(type, "newBuilder");
-        getBuilderMethodBuilder = getMethodOrDie(builderClass,
-            "get" + camelCaseName + "Builder", Integer.TYPE);
-      }
-
-      private final Method newBuilderMethod;
-      private final Method getBuilderMethodBuilder;
-
-      private Object coerceType(final Object value) {
-        if (type.isInstance(value)) {
-          return value;
-        } else {
-          // The value is not the exact right message type.  However, if it
-          // is an alternative implementation of the same type -- e.g. a
-          // DynamicMessage -- we should accept it.  In this case we can make
-          // a copy of the message.
-          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
-                  .mergeFrom((Message) value).build();
-        }
-      }
-
-      @Override
-      public void setRepeated(final Builder builder,
-                              final int index, final Object value) {
-        super.setRepeated(builder, index, coerceType(value));
-      }
-      @Override
-      public void addRepeated(final Builder builder, final Object value) {
-        super.addRepeated(builder, coerceType(value));
-      }
-      @Override
-      public Message.Builder newBuilder() {
-        return (Message.Builder) invokeOrDie(newBuilderMethod, null);
-      }
-      @Override
-      public Message.Builder getRepeatedBuilder(
-          final GeneratedMessageV3.Builder builder, final int index) {
-        return (Message.Builder) invokeOrDie(
-            getBuilderMethodBuilder, builder, index);
-      }
-    }
-  }
-
-  /**
-   * Replaces this object in the output stream with a serialized form.
-   * Part of Java's serialization magic.  Generated sub-classes must override
-   * this method by calling {@code return super.writeReplace();}
-   * @return a SerializedForm of this message
-   */
-  protected Object writeReplace() throws ObjectStreamException {
-    return new GeneratedMessageLite.SerializedForm(this);
-  }
-
-  /**
-   * Checks that the {@link Extension} is non-Lite and returns it as a
-   * {@link GeneratedExtension}.
-   */
-  private static <MessageType extends ExtendableMessage<MessageType>, T>
-    Extension<MessageType, T> checkNotLite(
-        ExtensionLite<MessageType, T> extension) {
-    if (extension.isLite()) {
-      throw new IllegalArgumentException("Expected non-lite extension.");
-    }
-
-    return (Extension<MessageType, T>) extension;
-  }
-
-  protected static int computeStringSize(final int fieldNumber, final Object value) {
-    if (value instanceof String) {
-      return CodedOutputStream.computeStringSize(fieldNumber, (String) value);
-    } else {
-      return CodedOutputStream.computeBytesSize(fieldNumber, (ByteString) value);
-    }
-  }
-
-  protected static int computeStringSizeNoTag(final Object value) {
-    if (value instanceof String) {
-      return CodedOutputStream.computeStringSizeNoTag((String) value);
-    } else {
-      return CodedOutputStream.computeBytesSizeNoTag((ByteString) value);
-    }
-  }
-
-  protected static void writeString(
-      CodedOutputStream output, final int fieldNumber, final Object value) throws IOException {
-    if (value instanceof String) {
-      output.writeString(fieldNumber, (String) value);
-    } else {
-      output.writeBytes(fieldNumber, (ByteString) value);
-    }
-  }
-
-  protected static void writeStringNoTag(
-      CodedOutputStream output, final Object value) throws IOException {
-    if (value instanceof String) {
-      output.writeStringNoTag((String) value);
-    } else {
-      output.writeBytesNoTag((ByteString) value);
-    }
-  }
-
-  protected static <V> void serializeIntegerMapTo(
-      CodedOutputStream out,
-      MapField<Integer, V> field,
-      MapEntry<Integer, V> defaultEntry,
-      int fieldNumber) throws IOException {
-    Map<Integer, V> m = field.getMap();
-    if (!out.isSerializationDeterministic()) {
-      serializeMapTo(out, m, defaultEntry, fieldNumber);
-      return;
-    }
-    // Sorting the unboxed keys and then look up the values during serialziation is 2x faster
-    // than sorting map entries with a custom comparator directly.
-    int[] keys = new int[m.size()];
-    int index = 0;
-    for (int k : m.keySet()) {
-      keys[index++] = k;
-    }
-    Arrays.sort(keys);
-    for (int key : keys) {
-      out.writeMessage(fieldNumber,
-          defaultEntry.newBuilderForType()
-              .setKey(key)
-              .setValue(m.get(key))
-              .build());
-    }
-  }
-
-  protected static <V> void serializeLongMapTo(
-      CodedOutputStream out,
-      MapField<Long, V> field,
-      MapEntry<Long, V> defaultEntry,
-      int fieldNumber)
-      throws IOException {
-    Map<Long, V> m = field.getMap();
-    if (!out.isSerializationDeterministic()) {
-      serializeMapTo(out, m, defaultEntry, fieldNumber);
-      return;
-    }
-
-    long[] keys = new long[m.size()];
-    int index = 0;
-    for (long k : m.keySet()) {
-      keys[index++] = k;
-    }
-    Arrays.sort(keys);
-    for (long key : keys) {
-      out.writeMessage(fieldNumber,
-          defaultEntry.newBuilderForType()
-              .setKey(key)
-              .setValue(m.get(key))
-              .build());
-    }
-  }
-
-  protected static <V> void serializeStringMapTo(
-      CodedOutputStream out,
-      MapField<String, V> field,
-      MapEntry<String, V> defaultEntry,
-      int fieldNumber)
-      throws IOException {
-    Map<String, V> m = field.getMap();
-    if (!out.isSerializationDeterministic()) {
-      serializeMapTo(out, m, defaultEntry, fieldNumber);
-      return;
-    }
-
-    // Sorting the String keys and then look up the values during serialziation is 25% faster than
-    // sorting map entries with a custom comparator directly.
-    String[] keys = new String[m.size()];
-    keys = m.keySet().toArray(keys);
-    Arrays.sort(keys);
-    for (String key : keys) {
-      out.writeMessage(fieldNumber,
-          defaultEntry.newBuilderForType()
-              .setKey(key)
-              .setValue(m.get(key))
-              .build());
-    }
-  }
-
-  protected static <V> void serializeBooleanMapTo(
-      CodedOutputStream out,
-      MapField<Boolean, V> field,
-      MapEntry<Boolean, V> defaultEntry,
-      int fieldNumber)
-      throws IOException {
-    Map<Boolean, V> m = field.getMap();
-    if (!out.isSerializationDeterministic()) {
-      serializeMapTo(out, m, defaultEntry, fieldNumber);
-      return;
-    }
-    maybeSerializeBooleanEntryTo(out, m, defaultEntry, fieldNumber, false);
-    maybeSerializeBooleanEntryTo(out, m, defaultEntry, fieldNumber, true);
-  }
-
-  private static <V> void maybeSerializeBooleanEntryTo(
-      CodedOutputStream out,
-      Map<Boolean, V> m,
-      MapEntry<Boolean, V> defaultEntry,
-      int fieldNumber,
-      boolean key)
-      throws IOException {
-    if (m.containsKey(key)) {
-      out.writeMessage(fieldNumber,
-          defaultEntry.newBuilderForType()
-              .setKey(key)
-              .setValue(m.get(key))
-              .build());
-    }
-  }
-
-  /** Serialize the map using the iteration order. */
-  private static <K, V> void serializeMapTo(
-      CodedOutputStream out,
-      Map<K, V> m,
-      MapEntry<K, V> defaultEntry,
-      int fieldNumber)
-      throws IOException {
-    for (Map.Entry<K, V> entry : m.entrySet()) {
-      out.writeMessage(fieldNumber,
-          defaultEntry.newBuilderForType()
-              .setKey(entry.getKey())
-              .setValue(entry.getValue())
-              .build());
-    }
-  }
-}
-
diff --git a/java/core/src/main/java/com/google/protobuf/IntArrayList.java b/java/core/src/main/java/com/google/protobuf/IntArrayList.java
index aff5c21..6d6ece5 100644
--- a/java/core/src/main/java/com/google/protobuf/IntArrayList.java
+++ b/java/core/src/main/java/com/google/protobuf/IntArrayList.java
@@ -30,35 +30,33 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Internal.IntList;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.RandomAccess;
 
 /**
  * An implementation of {@link IntList} on top of a primitive array.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
-final class IntArrayList extends AbstractProtobufList<Integer>
-    implements IntList, RandomAccess, PrimitiveNonBoxingCollection {
-
+final class IntArrayList extends AbstractProtobufList<Integer> implements IntList, RandomAccess {
+  
   private static final IntArrayList EMPTY_LIST = new IntArrayList();
   static {
     EMPTY_LIST.makeImmutable();
   }
-
+  
   public static IntArrayList emptyList() {
     return EMPTY_LIST;
   }
-
+  
   /**
    * The backing store for the list.
    */
   private int[] array;
-
+  
   /**
    * The size of the list distinct from the length of the array. That is, it is the number of
    * elements set in the list.
@@ -73,14 +71,13 @@
   }
 
   /**
-   * Constructs a new mutable {@code IntArrayList}
-   * containing the same elements as {@code other}.
+   * Constructs a new mutable {@code IntArrayList} containing the same elements as {@code other}.
    */
-  private IntArrayList(int[] other, int size) {
-    array = other;
+  private IntArrayList(int[] array, int size) {
+    this.array = array;
     this.size = size;
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -93,14 +90,14 @@
     if (size != other.size) {
       return false;
     }
-
+    
     final int[] arr = other.array;
     for (int i = 0; i < size; i++) {
       if (array[i] != arr[i]) {
         return false;
       }
     }
-
+    
     return true;
   }
 
@@ -120,7 +117,7 @@
     }
     return new IntArrayList(Arrays.copyOf(array, capacity), size);
   }
-
+  
   @Override
   public Integer get(int index) {
     return getInt(index);
@@ -172,7 +169,7 @@
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(makeOutOfBoundsExceptionMessage(index));
     }
-
+    
     if (size < array.length) {
       // Shift everything over to make room
       System.arraycopy(array, index, array, index + 1, size - index);
@@ -180,10 +177,10 @@
       // Resize to 1.5x the size
       int length = ((size * 3) / 2) + 1;
       int[] newArray = new int[length];
-
+      
       // Copy the first part directly
       System.arraycopy(array, 0, newArray, 0, index);
-
+      
       // Copy the rest shifted over by one to make room
       System.arraycopy(array, index, newArray, index + 1, size - index);
       array = newArray;
@@ -197,36 +194,38 @@
   @Override
   public boolean addAll(Collection<? extends Integer> collection) {
     ensureIsMutable();
-
-    checkNotNull(collection);
-
+    
+    if (collection == null) {
+      throw new NullPointerException();
+    }
+    
     // We specialize when adding another IntArrayList to avoid boxing elements.
     if (!(collection instanceof IntArrayList)) {
       return super.addAll(collection);
     }
-
+    
     IntArrayList list = (IntArrayList) collection;
     if (list.size == 0) {
       return false;
     }
-
+    
     int overflow = Integer.MAX_VALUE - size;
     if (overflow < list.size) {
       // We can't actually represent a list this large.
       throw new OutOfMemoryError();
     }
-
+    
     int newSize = size + list.size;
     if (newSize > array.length) {
       array = Arrays.copyOf(array, newSize);
     }
-
+    
     System.arraycopy(list.array, 0, array, size, list.size);
     size = newSize;
     modCount++;
     return true;
   }
-
+  
   @Override
   public boolean remove(Object o) {
     ensureIsMutable();
@@ -255,7 +254,7 @@
   /**
    * Ensures that the provided {@code index} is within the range of {@code [0, size]}. Throws an
    * {@link IndexOutOfBoundsException} if it is not.
-   *
+   * 
    * @param index the index to verify is in range
    */
   private void ensureIndexInRange(int index) {
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 848cad0..d1de375 100644
--- a/java/core/src/main/java/com/google/protobuf/Internal.java
+++ b/java/core/src/main/java/com/google/protobuf/Internal.java
@@ -60,26 +60,6 @@
   static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
 
   /**
-   * Throws an appropriate {@link NullPointerException} if the given objects is {@code null}.
-   */
-  static <T> T checkNotNull(T obj) {
-    if (obj == null) {
-      throw new NullPointerException();
-    }
-    return obj;
-  }
-
-  /**
-   * Throws an appropriate {@link NullPointerException} if the given objects is {@code null}.
-   */
-  static <T> T checkNotNull(T obj, String message) {
-    if (obj == null) {
-      throw new NullPointerException(message);
-    }
-    return obj;
-  }
-
-  /**
    * Helper called by generated code to construct default values for string
    * fields.
    * <p>
@@ -414,8 +394,9 @@
     }
   }
 
-
-  /** An empty byte array constant used in generated code. */
+  /**
+   * An empty byte array constant used in generated code.
+   */
   public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
 
   /**
@@ -429,11 +410,6 @@
       CodedInputStream.newInstance(EMPTY_BYTE_ARRAY);
 
 
-  /** Helper method to merge two MessageLite instances. */
-  static Object mergeMessage(Object destination, Object source) {
-    return ((MessageLite) destination).toBuilder().mergeFrom((MessageLite) source).buildPartial();
-  }
-
   /**
    * Provides an immutable view of {@code List<T>} around a {@code List<F>}.
    *
@@ -635,12 +611,12 @@
     int getInt(int index);
 
     /**
-     * Like {@link #add(Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #add(Integer)} but more efficient in that it doesn't box the element.
      */
     void addInt(int element);
 
     /**
-     * Like {@link #set(int, Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #set(int, Integer)} but more efficient in that it doesn't box the element.
      */
     int setInt(int index, int element);
 
@@ -663,12 +639,12 @@
     boolean getBoolean(int index);
 
     /**
-     * Like {@link #add(Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #add(Boolean)} but more efficient in that it doesn't box the element.
      */
     void addBoolean(boolean element);
 
     /**
-     * Like {@link #set(int, Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #set(int, Boolean)} but more efficient in that it doesn't box the element.
      */
     boolean setBoolean(int index, boolean element);
 
@@ -691,12 +667,12 @@
     long getLong(int index);
 
     /**
-     * Like {@link #add(Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #add(Long)} but more efficient in that it doesn't box the element.
      */
     void addLong(long element);
 
     /**
-     * Like {@link #set(int, Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #set(int, Long)} but more efficient in that it doesn't box the element.
      */
     long setLong(int index, long element);
 
@@ -719,12 +695,12 @@
     double getDouble(int index);
 
     /**
-     * Like {@link #add(Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #add(Double)} but more efficient in that it doesn't box the element.
      */
     void addDouble(double element);
 
     /**
-     * Like {@link #set(int, Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #set(int, Double)} but more efficient in that it doesn't box the element.
      */
     double setDouble(int index, double element);
 
@@ -747,12 +723,12 @@
     float getFloat(int index);
 
     /**
-     * Like {@link #add(Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #add(Float)} but more efficient in that it doesn't box the element.
      */
     void addFloat(float element);
 
     /**
-     * Like {@link #set(int, Object)} but more efficient in that it doesn't box the element.
+     * Like {@link #set(int, Float)} but more efficient in that it doesn't box the element.
      */
     float setFloat(int index, float element);
 
diff --git a/java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java b/java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java
index 510c6aa..85ce7b2 100644
--- a/java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java
+++ b/java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java
@@ -50,10 +50,6 @@
     super(e.getMessage(), e);
   }
 
-  public InvalidProtocolBufferException(final String description, IOException e) {
-    super(description, e);
-  }
-
   /**
    * Attaches an unfinished message to the exception to support best-effort
    * parsing in {@code Parser} interface.
@@ -111,23 +107,11 @@
       "Protocol message end-group tag did not match expected tag.");
   }
 
-  static InvalidWireTypeException invalidWireType() {
-    return new InvalidWireTypeException(
+  static InvalidProtocolBufferException invalidWireType() {
+    return new InvalidProtocolBufferException(
       "Protocol message tag had invalid wire type.");
   }
 
-  /**
-   * Exception indicating that and unexpected wire type was encountered for a field.
-   */
-  @ExperimentalApi
-  public static class InvalidWireTypeException extends InvalidProtocolBufferException {
-    private static final long serialVersionUID = 3283890091615336259L;
-
-    public InvalidWireTypeException(String description) {
-      super(description);
-    }
-  }
-
   static InvalidProtocolBufferException recursionLimitExceeded() {
     return new InvalidProtocolBufferException(
       "Protocol message had too many levels of nesting.  May be malicious.  " +
diff --git a/java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java b/java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java
deleted file mode 100644
index 713e806..0000000
--- a/java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java
+++ /dev/null
@@ -1,150 +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 com.google.protobuf.Internal.EMPTY_BYTE_BUFFER;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Iterator;
-
-class IterableByteBufferInputStream extends InputStream {
-  /** The {@link Iterator} with type {@link ByteBuffer} of {@code input} */
-  private Iterator<ByteBuffer> iterator;
-  /** The current ByteBuffer; */
-  private ByteBuffer currentByteBuffer;
-  /** The number of ByteBuffers in the input data. */
-  private int dataSize;
-  /**
-   * Current {@code ByteBuffer}'s index
-   *
-   * <p>If index equals dataSize, then all the data in the InputStream has been consumed
-   */
-  private int currentIndex;
-  /** The current position for current ByteBuffer */
-  private int currentByteBufferPos;
-  /** Whether current ByteBuffer has an array */
-  private boolean hasArray;
-  /**
-   * If the current ByteBuffer is unsafe-direct based, currentArray is null; otherwise should be the
-   * array inside ByteBuffer.
-   */
-  private byte[] currentArray;
-  /** Current ByteBuffer's array offset */
-  private int currentArrayOffset;
-  /**
-   * If the current ByteBuffer is unsafe-direct based, currentAddress is the start address of this
-   * ByteBuffer; otherwise should be zero.
-   */
-  private long currentAddress;
-
-  IterableByteBufferInputStream(Iterable<ByteBuffer> data) {
-    iterator = data.iterator();
-    dataSize = 0;
-    for (ByteBuffer unused : data) {
-      dataSize++;
-    }
-    currentIndex = -1;
-
-    if (!getNextByteBuffer()) {
-      currentByteBuffer = EMPTY_BYTE_BUFFER;
-      currentIndex = 0;
-      currentByteBufferPos = 0;
-      currentAddress = 0;
-    }
-  }
-
-  private boolean getNextByteBuffer() {
-    currentIndex++;
-    if (!iterator.hasNext()) {
-      return false;
-    }
-    currentByteBuffer = iterator.next();
-    currentByteBufferPos = currentByteBuffer.position();
-    if (currentByteBuffer.hasArray()) {
-      hasArray = true;
-      currentArray = currentByteBuffer.array();
-      currentArrayOffset = currentByteBuffer.arrayOffset();
-    } else {
-      hasArray = false;
-      currentAddress = UnsafeUtil.addressOffset(currentByteBuffer);
-      currentArray = null;
-    }
-    return true;
-  }
-
-  private void updateCurrentByteBufferPos(int numberOfBytesRead) {
-    currentByteBufferPos += numberOfBytesRead;
-    if (currentByteBufferPos == currentByteBuffer.limit()) {
-      getNextByteBuffer();
-    }
-  }
-
-  @Override
-  public int read() throws IOException {
-    if (currentIndex == dataSize) {
-      return -1;
-    }
-    if (hasArray) {
-      int result = currentArray[currentByteBufferPos + currentArrayOffset] & 0xFF;
-      updateCurrentByteBufferPos(1);
-      return result;
-    } else {
-      int result = UnsafeUtil.getByte(currentByteBufferPos + currentAddress) & 0xFF;
-      updateCurrentByteBufferPos(1);
-      return result;
-    }
-  }
-
-  @Override
-  public int read(byte[] output, int offset, int length) throws IOException {
-    if (currentIndex == dataSize) {
-      return -1;
-    }
-    int remaining = currentByteBuffer.limit() - currentByteBufferPos;
-    if (length > remaining) {
-      length = remaining;
-    }
-    if (hasArray) {
-      System.arraycopy(
-          currentArray, currentByteBufferPos + currentArrayOffset, output, offset, length);
-      updateCurrentByteBufferPos(length);
-    } else {
-      int prevPos = currentByteBuffer.position();
-      currentByteBuffer.position(currentByteBufferPos);
-      currentByteBuffer.get(output, offset, length);
-      currentByteBuffer.position(prevPos);
-      updateCurrentByteBufferPos(length);
-    }
-    return length;
-  }
-}
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 49ecfc0..2febaac 100644
--- a/java/core/src/main/java/com/google/protobuf/LazyFieldLite.java
+++ b/java/core/src/main/java/com/google/protobuf/LazyFieldLite.java
@@ -284,8 +284,29 @@
       return;
     }
 
-    // At this point we have two fully parsed messages.
-    setValue(this.value.toBuilder().mergeFrom(other.value).build());
+    // At this point we have two fully parsed messages. We can't merge directly from one to the
+    // other because only generated builder code contains methods to mergeFrom another parsed
+    // message. We have to serialize one instance and then merge the bytes into the other. This may
+    // drop extensions from one of the messages if one of the values had an extension set on it
+    // directly.
+    //
+    // To mitigate this we prefer serializing a message that has an extension registry, and
+    // therefore a chance that all extensions set on it are in that registry.
+    //
+    // NOTE: The check for other.extensionRegistry not being null must come first because at this
+    // point in time if other.extensionRegistry is not null then this.extensionRegistry will not be
+    // null either.
+    if (other.extensionRegistry != null) {
+      setValue(mergeValueAndBytes(this.value, other.toByteString(), other.extensionRegistry));
+      return;
+    } else if (this.extensionRegistry != null) {
+      setValue(mergeValueAndBytes(other.value, this.toByteString(), this.extensionRegistry));
+      return;
+    } else {
+      // All extensions from the other message will be dropped because we have no registry.
+      setValue(mergeValueAndBytes(this.value, other.toByteString(), EMPTY_REGISTRY));
+      return;
+    }
   }
   
   /**
@@ -394,7 +415,6 @@
     }
   }
 
-
   /**
    * Might lazily parse the bytes that were previously passed in. Is thread-safe.
    */
diff --git a/java/core/src/main/java/com/google/protobuf/LongArrayList.java b/java/core/src/main/java/com/google/protobuf/LongArrayList.java
index fc146e2..bc4475d 100644
--- a/java/core/src/main/java/com/google/protobuf/LongArrayList.java
+++ b/java/core/src/main/java/com/google/protobuf/LongArrayList.java
@@ -30,35 +30,33 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Internal.LongList;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.RandomAccess;
 
 /**
  * An implementation of {@link LongList} on top of a primitive array.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
-final class LongArrayList extends AbstractProtobufList<Long>
-    implements LongList, RandomAccess, PrimitiveNonBoxingCollection {
-
+final class LongArrayList extends AbstractProtobufList<Long> implements LongList, RandomAccess {
+  
   private static final LongArrayList EMPTY_LIST = new LongArrayList();
   static {
     EMPTY_LIST.makeImmutable();
   }
-
+  
   public static LongArrayList emptyList() {
     return EMPTY_LIST;
   }
-
+  
   /**
    * The backing store for the list.
    */
   private long[] array;
-
+  
   /**
    * The size of the list distinct from the length of the array. That is, it is the number of
    * elements set in the list.
@@ -73,34 +71,33 @@
   }
 
   /**
-   * Constructs a new mutable {@code LongArrayList}
-   * containing the same elements as {@code other}.
+   * Constructs a new mutable {@code LongArrayList} containing the same elements as {@code other}.
    */
-  private LongArrayList(long[] other, int size) {
-    array = other;
+  private LongArrayList(long[] array, int size) {
+    this.array = array;
     this.size = size;
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof LongArrayList)) {
+    if (!(o instanceof IntArrayList)) {
       return super.equals(o);
     }
     LongArrayList other = (LongArrayList) o;
     if (size != other.size) {
       return false;
     }
-
+    
     final long[] arr = other.array;
     for (int i = 0; i < size; i++) {
       if (array[i] != arr[i]) {
         return false;
       }
     }
-
+    
     return true;
   }
 
@@ -120,7 +117,7 @@
     }
     return new LongArrayList(Arrays.copyOf(array, capacity), size);
   }
-
+  
   @Override
   public Long get(int index) {
     return getLong(index);
@@ -172,7 +169,7 @@
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(makeOutOfBoundsExceptionMessage(index));
     }
-
+    
     if (size < array.length) {
       // Shift everything over to make room
       System.arraycopy(array, index, array, index + 1, size - index);
@@ -180,10 +177,10 @@
       // Resize to 1.5x the size
       int length = ((size * 3) / 2) + 1;
       long[] newArray = new long[length];
-
+      
       // Copy the first part directly
       System.arraycopy(array, 0, newArray, 0, index);
-
+      
       // Copy the rest shifted over by one to make room
       System.arraycopy(array, index, newArray, index + 1, size - index);
       array = newArray;
@@ -197,36 +194,38 @@
   @Override
   public boolean addAll(Collection<? extends Long> collection) {
     ensureIsMutable();
-
-    checkNotNull(collection);
-
+    
+    if (collection == null) {
+      throw new NullPointerException();
+    }
+    
     // We specialize when adding another LongArrayList to avoid boxing elements.
     if (!(collection instanceof LongArrayList)) {
       return super.addAll(collection);
     }
-
+    
     LongArrayList list = (LongArrayList) collection;
     if (list.size == 0) {
       return false;
     }
-
+    
     int overflow = Integer.MAX_VALUE - size;
     if (overflow < list.size) {
       // We can't actually represent a list this large.
       throw new OutOfMemoryError();
     }
-
+    
     int newSize = size + list.size;
     if (newSize > array.length) {
       array = Arrays.copyOf(array, newSize);
     }
-
+    
     System.arraycopy(list.array, 0, array, size, list.size);
     size = newSize;
     modCount++;
     return true;
   }
-
+  
   @Override
   public boolean remove(Object o) {
     ensureIsMutable();
@@ -255,7 +254,7 @@
   /**
    * Ensures that the provided {@code index} is within the range of {@code [0, size]}. Throws an
    * {@link IndexOutOfBoundsException} if it is not.
-   *
+   * 
    * @param index the index to verify is in range
    */
   private void ensureIndexInRange(int index) {
diff --git a/java/core/src/main/java/com/google/protobuf/MapEntry.java b/java/core/src/main/java/com/google/protobuf/MapEntry.java
index 0849b82..31414bb 100644
--- a/java/core/src/main/java/com/google/protobuf/MapEntry.java
+++ b/java/core/src/main/java/com/google/protobuf/MapEntry.java
@@ -33,6 +33,7 @@
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
+
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Map;
@@ -40,84 +41,63 @@
 
 /**
  * Implements MapEntry messages.
- *
+ * 
  * In reflection API, map fields will be treated as repeated message fields and
  * each map entry is accessed as a message. This MapEntry class is used to
  * represent these map entry messages in reflection API.
- *
+ * 
  * Protobuf internal. Users shouldn't use this class.
  */
 public final class MapEntry<K, V> extends AbstractMessage {
-
-  private static final class Metadata<K, V> extends MapEntryLite.Metadata<K, V> {
-
-    public final Descriptor descriptor;
-    public final Parser<MapEntry<K, V>> parser;
-
+  private static class Metadata<K, V> {
+    public final Descriptor descriptor;  
+    public final MapEntry<K, V> defaultInstance;
+    public final AbstractParser<MapEntry<K, V>> parser;
+    
     public Metadata(
-        Descriptor descriptor,
-        MapEntry<K, V> defaultInstance,
-        WireFormat.FieldType keyType,
-        WireFormat.FieldType valueType) {
-      super(keyType, defaultInstance.key, valueType, defaultInstance.value);
+        final Descriptor descriptor, final MapEntry<K, V> defaultInstance) {
       this.descriptor = descriptor;
+      this.defaultInstance = defaultInstance;
+      final Metadata<K, V> thisMetadata = this;
       this.parser = new AbstractParser<MapEntry<K, V>>() {
-
+        private final Parser<MapEntryLite<K, V>> dataParser =
+            defaultInstance.data.getParserForType();
         @Override
         public MapEntry<K, V> parsePartialFrom(
             CodedInputStream input, ExtensionRegistryLite extensionRegistry)
             throws InvalidProtocolBufferException {
-          return new MapEntry<K, V>(Metadata.this, input, extensionRegistry);
+          MapEntryLite<K, V> data =
+              dataParser.parsePartialFrom(input, extensionRegistry);
+          return new MapEntry<K, V>(thisMetadata, data);
         }
+        
       };
     }
   }
-
-  private final K key;
-  private final V value;
+  
   private final Metadata<K, V> metadata;
-
+  private final MapEntryLite<K, V> data;
+  
   /** Create a default MapEntry instance. */
-  private MapEntry(
-      Descriptor descriptor,
+  private MapEntry(Descriptor descriptor,
       WireFormat.FieldType keyType, K defaultKey,
       WireFormat.FieldType valueType, V defaultValue) {
-    this.key = defaultKey;
-    this.value = defaultValue;
-    this.metadata = new Metadata<K, V>(descriptor, this, keyType, valueType);
+    this.data = MapEntryLite.newDefaultInstance(
+        keyType, defaultKey, valueType, defaultValue);
+    this.metadata = new Metadata<K, V>(descriptor, this); 
   }
-
-  /** Create a MapEntry with the provided key and value. */
-  @SuppressWarnings("unchecked")
-  private MapEntry(Metadata metadata, K key, V value) {
-    this.key = key;
-    this.value = value;
+  
+  /** Create a new MapEntry message. */
+  private MapEntry(Metadata<K, V> metadata, MapEntryLite<K, V> data) {
     this.metadata = metadata;
+    this.data = data;
   }
-
-  /** Parsing constructor. */
-  private MapEntry(
-      Metadata<K, V> metadata,
-      CodedInputStream input,
-      ExtensionRegistryLite extensionRegistry)
-      throws InvalidProtocolBufferException {
-    try {
-      this.metadata = metadata;
-      Map.Entry<K, V> entry = MapEntryLite.parseEntry(input, metadata, extensionRegistry);
-      this.key = entry.getKey();
-      this.value = entry.getValue();
-    } catch (InvalidProtocolBufferException e) {
-      throw e.setUnfinishedMessage(this);
-    } catch (IOException e) {
-      throw new InvalidProtocolBufferException(e).setUnfinishedMessage(this);
-    }
-  }
-
+  
   /**
    * Create a default MapEntry instance. A default MapEntry instance should be
    * created only once for each map entry message type. Generated code should
    * store the created default instance and use it later to create new MapEntry
-   * messages of the same type.
+   * messages of the same type. 
    */
   public static <K, V> MapEntry<K, V> newDefaultInstance(
       Descriptor descriptor,
@@ -126,38 +106,30 @@
     return new MapEntry<K, V>(
         descriptor, keyType, defaultKey, valueType, defaultValue);
   }
-
+  
   public K getKey() {
-    return key;
+    return data.getKey();
   }
-
+  
   public V getValue() {
-    return value;
+    return data.getValue();
   }
-
-  private volatile int cachedSerializedSize = -1;
-
+  
   @Override
   public int getSerializedSize() {
-    if (cachedSerializedSize != -1) {
-      return cachedSerializedSize;
-    }
-
-    int size = MapEntryLite.computeSerializedSize(metadata, key, value);
-    cachedSerializedSize = size;
-    return size;
+    return data.getSerializedSize();
   }
-
+  
   @Override
   public void writeTo(CodedOutputStream output) throws IOException {
-    MapEntryLite.writeTo(output, metadata, key, value);
+    data.writeTo(output);
   }
-
+  
   @Override
   public boolean isInitialized() {
-    return isInitialized(metadata, value);
+    return data.isInitialized();
   }
-
+  
   @Override
   public Parser<MapEntry<K, V>> getParserForType() {
     return metadata.parser;
@@ -167,15 +139,15 @@
   public Builder<K, V> newBuilderForType() {
     return new Builder<K, V>(metadata);
   }
-
+  
   @Override
   public Builder<K, V> toBuilder() {
-    return new Builder<K, V>(metadata, key, value, true, true);
+    return new Builder<K, V>(metadata, data);
   }
 
   @Override
   public MapEntry<K, V> getDefaultInstanceForType() {
-    return new MapEntry<K, V>(metadata, metadata.defaultKey, metadata.defaultValue);
+    return metadata.defaultInstance;
   }
 
   @Override
@@ -185,7 +157,8 @@
 
   @Override
   public Map<FieldDescriptor, Object> getAllFields() {
-    TreeMap<FieldDescriptor, Object> result = new TreeMap<FieldDescriptor, Object>();
+    final TreeMap<FieldDescriptor, Object> result =
+        new TreeMap<FieldDescriptor, Object>();
     for (final FieldDescriptor field : metadata.descriptor.getFields()) {
       if (hasField(field)) {
         result.put(field, getField(field));
@@ -193,12 +166,12 @@
     }
     return Collections.unmodifiableMap(result);
   }
-
+  
   private void checkFieldDescriptor(FieldDescriptor field) {
     if (field.getContainingType() != metadata.descriptor) {
       throw new RuntimeException(
           "Wrong FieldDescriptor \"" + field.getFullName()
-          + "\" used in message \"" + metadata.descriptor.getFullName());
+          + "\" used in message \"" + metadata.descriptor.getFullName()); 
     }
   }
 
@@ -244,52 +217,56 @@
   public static class Builder<K, V>
       extends AbstractMessage.Builder<Builder<K, V>> {
     private final Metadata<K, V> metadata;
-    private K key;
-    private V value;
-    private boolean hasKey;
-    private boolean hasValue;
-
+    private MapEntryLite<K, V> data;
+    private MapEntryLite.Builder<K, V> dataBuilder;
+    
     private Builder(Metadata<K, V> metadata) {
-      this(metadata, metadata.defaultKey, metadata.defaultValue, false, false);
-    }
-
-    private Builder(Metadata<K, V> metadata, K key, V value, boolean hasKey, boolean hasValue) {
       this.metadata = metadata;
-      this.key = key;
-      this.value = value;
-      this.hasKey = hasKey;
-      this.hasValue = hasValue;
+      this.data = metadata.defaultInstance.data;
+      this.dataBuilder = null;
     }
-
+    
+    private Builder(Metadata<K, V> metadata, MapEntryLite<K, V> data) {
+      this.metadata = metadata;
+      this.data = data;
+      this.dataBuilder = null;
+    }
+    
     public K getKey() {
-      return key;
+      return dataBuilder == null ? data.getKey() : dataBuilder.getKey();
     }
-
+    
     public V getValue() {
-      return value;
+      return dataBuilder == null ? data.getValue() : dataBuilder.getValue();
     }
-
+    
+    private void ensureMutable() {
+      if (dataBuilder == null) {
+        dataBuilder = data.toBuilder();
+      }
+    }
+    
     public Builder<K, V> setKey(K key) {
-      this.key = key;
-      this.hasKey = true;
+      ensureMutable();
+      dataBuilder.setKey(key);
       return this;
     }
-
+    
     public Builder<K, V> clearKey() {
-      this.key = metadata.defaultKey;
-      this.hasKey = false;
+      ensureMutable();
+      dataBuilder.clearKey();
       return this;
     }
-
+    
     public Builder<K, V> setValue(V value) {
-      this.value = value;
-      this.hasValue = true;
+      ensureMutable();
+      dataBuilder.setValue(value);
       return this;
     }
-
+    
     public Builder<K, V> clearValue() {
-      this.value = metadata.defaultValue;
-      this.hasValue = false;
+      ensureMutable();
+      dataBuilder.clearValue();
       return this;
     }
 
@@ -304,24 +281,29 @@
 
     @Override
     public MapEntry<K, V> buildPartial() {
-      return new MapEntry<K, V>(metadata, key, value);
+      if (dataBuilder != null) {
+        data = dataBuilder.buildPartial();
+        dataBuilder = null;
+      }
+      return new MapEntry<K, V>(metadata, data);
     }
 
     @Override
     public Descriptor getDescriptorForType() {
       return metadata.descriptor;
     }
-
+    
     private void checkFieldDescriptor(FieldDescriptor field) {
       if (field.getContainingType() != metadata.descriptor) {
         throw new RuntimeException(
             "Wrong FieldDescriptor \"" + field.getFullName()
-            + "\" used in message \"" + metadata.descriptor.getFullName());
+            + "\" used in message \"" + metadata.descriptor.getFullName()); 
       }
     }
 
     @Override
-    public Message.Builder newBuilderForField(FieldDescriptor field) {
+    public com.google.protobuf.Message.Builder newBuilderForField(
+        FieldDescriptor field) {
       checkFieldDescriptor(field);;
       // This method should be called for message fields and in a MapEntry
       // message only the value field can possibly be a message field.
@@ -330,7 +312,7 @@
         throw new RuntimeException(
             "\"" + field.getFullName() + "\" is not a message value field.");
       }
-      return ((Message) value).newBuilderForType();
+      return ((Message) data.getValue()).newBuilderForType();
     }
 
     @SuppressWarnings("unchecked")
@@ -342,15 +324,6 @@
       } else {
         if (field.getType() == FieldDescriptor.Type.ENUM) {
           value = ((EnumValueDescriptor) value).getNumber();
-        } else if (field.getType() == FieldDescriptor.Type.MESSAGE) {
-          if (value != null && !metadata.defaultValue.getClass().isInstance(value)) {
-            // The value is not the exact right message type.  However, if it
-            // is an alternative implementation of the same type -- e.g. a
-            // DynamicMessage -- we should accept it.  In this case we can make
-            // a copy of the message.
-            value =
-                ((Message) metadata.defaultValue).toBuilder().mergeFrom((Message) value).build();
-          }
         }
         setValue((V) value);
       }
@@ -389,17 +362,22 @@
 
     @Override
     public MapEntry<K, V> getDefaultInstanceForType() {
-      return new MapEntry<K, V>(metadata, metadata.defaultKey, metadata.defaultValue);
+      return metadata.defaultInstance;
     }
 
     @Override
     public boolean isInitialized() {
-      return MapEntry.isInitialized(metadata, value);
+      if (dataBuilder != null) {
+        return dataBuilder.isInitialized();
+      } else {
+        return data.isInitialized();
+      }
     }
 
     @Override
     public Map<FieldDescriptor, Object> getAllFields() {
-      final TreeMap<FieldDescriptor, Object> result = new TreeMap<FieldDescriptor, Object>();
+      final TreeMap<FieldDescriptor, Object> result =
+          new TreeMap<FieldDescriptor, Object>();
       for (final FieldDescriptor field : metadata.descriptor.getFields()) {
         if (hasField(field)) {
           result.put(field, getField(field));
@@ -411,7 +389,7 @@
     @Override
     public boolean hasField(FieldDescriptor field) {
       checkFieldDescriptor(field);
-      return field.getNumber() == 1 ? hasKey : hasValue;
+      return true;
     }
 
     @Override
@@ -420,7 +398,8 @@
       Object result = field.getNumber() == 1 ? getKey() : getValue();
       // Convert enums to EnumValueDescriptor.
       if (field.getType() == FieldDescriptor.Type.ENUM) {
-        result = field.getEnumType().findValueByNumberCreatingIfUnknown((Integer) result);
+        result = field.getEnumType().findValueByNumberCreatingIfUnknown(
+            (java.lang.Integer) result);
       }
       return result;
     }
@@ -430,34 +409,25 @@
       throw new RuntimeException(
           "There is no repeated field in a map entry message.");
     }
-
+    
     @Override
     public Object getRepeatedField(FieldDescriptor field, int index) {
       throw new RuntimeException(
           "There is no repeated field in a map entry message.");
     }
-
+    
     @Override
     public UnknownFieldSet getUnknownFields() {
       return UnknownFieldSet.getDefaultInstance();
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     public Builder<K, V> clone() {
-      return new Builder(metadata, key, value, hasKey, hasValue);
+      if (dataBuilder == null) {
+        return new Builder<K, V>(metadata, data);
+      } else {
+        return new Builder<K, V>(metadata, dataBuilder.build());
+      }
     }
   }
-
-  private static <V> boolean isInitialized(Metadata metadata, V value) {
-    if (metadata.valueType.getJavaType() == WireFormat.JavaType.MESSAGE) {
-      return ((MessageLite) value).isInitialized();
-    }
-    return true;
-  }
-  
-  /** Returns the metadata only for experimental runtime. */
-  final Metadata<K, V> getMetadata() {
-    return metadata;
-  }
 }
diff --git a/java/core/src/main/java/com/google/protobuf/MapEntryLite.java b/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
index dcb5dfa..12c64ab 100644
--- a/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
+++ b/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
@@ -31,74 +31,80 @@
 package com.google.protobuf;
 
 import java.io.IOException;
-import java.util.AbstractMap;
-import java.util.Map;
 
 /**
  * Implements the lite version of map entry messages.
- *
+ * 
  * This class serves as an utility class to help do serialization/parsing of
  * map entries. It's used in generated code and also in the full version
  * MapEntry message.
- *
+ * 
  * Protobuf internal. Users shouldn't use.
  */
-public class MapEntryLite<K, V> {
-
-  static class Metadata<K, V> {
+public class MapEntryLite<K, V>
+    extends AbstractMessageLite<MapEntryLite<K, V>, MapEntryLite.Builder<K, V>> {
+  private static class Metadata<K, V> {
+    public final MapEntryLite<K, V> defaultInstance;
     public final WireFormat.FieldType keyType;
-    public final K defaultKey;
     public final WireFormat.FieldType valueType;
-    public final V defaultValue;
-
+    public final Parser<MapEntryLite<K, V>> parser;
     public Metadata(
-        WireFormat.FieldType keyType, K defaultKey,
-        WireFormat.FieldType valueType, V defaultValue) {
+        MapEntryLite<K, V> defaultInstance,
+        WireFormat.FieldType keyType,
+        WireFormat.FieldType valueType) {
+      this.defaultInstance = defaultInstance; 
       this.keyType = keyType;
-      this.defaultKey = defaultKey;
       this.valueType = valueType;
-      this.defaultValue = defaultValue;
+      final Metadata<K, V> finalThis = this;
+      this.parser = new AbstractParser<MapEntryLite<K, V>>() {
+        @Override
+        public MapEntryLite<K, V> parsePartialFrom(
+            CodedInputStream input, ExtensionRegistryLite extensionRegistry)
+            throws InvalidProtocolBufferException {
+          return new MapEntryLite<K, V>(finalThis, input, extensionRegistry);
+        }
+      };
     }
   }
-
+  
   private static final int KEY_FIELD_NUMBER = 1;
   private static final int VALUE_FIELD_NUMBER = 2;
-
+  
   private final Metadata<K, V> metadata;
   private final K key;
   private final V value;
-
+  
   /** Creates a default MapEntryLite message instance. */
   private MapEntryLite(
       WireFormat.FieldType keyType, K defaultKey,
       WireFormat.FieldType valueType, V defaultValue) {
-    this.metadata = new Metadata<K, V>(keyType, defaultKey, valueType, defaultValue);
+    this.metadata = new Metadata<K, V>(this, keyType, valueType);
     this.key = defaultKey;
     this.value = defaultValue;
   }
-
+  
   /** Creates a new MapEntryLite message. */
   private MapEntryLite(Metadata<K, V> metadata, K key, V value) {
     this.metadata = metadata;
     this.key = key;
     this.value = value;
   }
-
+  
   public K getKey() {
     return key;
   }
-
+  
   public V getValue() {
     return value;
   }
 
   /**
    * Creates a default MapEntryLite message instance.
-   *
+   * 
    * This method is used by generated code to create the default instance for
    * a map entry message. The created default instance should be used to create
    * new map entry messages of the same type. For each map entry message, only
-   * one default instance should be created.
+   * one default instance should be created. 
    */
   public static <K, V> MapEntryLite<K, V> newDefaultInstance(
       WireFormat.FieldType keyType, K defaultKey,
@@ -106,20 +112,80 @@
     return new MapEntryLite<K, V>(
         keyType, defaultKey, valueType, defaultValue);
   }
-
-  static <K, V> void writeTo(CodedOutputStream output, Metadata<K, V> metadata, K key, V value)
-      throws IOException {
-    FieldSet.writeElement(output, metadata.keyType, KEY_FIELD_NUMBER, key);
-    FieldSet.writeElement(output, metadata.valueType, VALUE_FIELD_NUMBER, value);
+  
+  @Override
+  public void writeTo(CodedOutputStream output) throws IOException {
+    writeField(KEY_FIELD_NUMBER, metadata.keyType, key, output);
+    writeField(VALUE_FIELD_NUMBER, metadata.valueType, value, output);
   }
 
-  static <K, V> int computeSerializedSize(Metadata<K, V> metadata, K key, V value) {
-    return FieldSet.computeElementSize(metadata.keyType, KEY_FIELD_NUMBER, key)
-        + FieldSet.computeElementSize(metadata.valueType, VALUE_FIELD_NUMBER, value);
+  private void writeField(
+      int number, WireFormat.FieldType type, Object value,
+      CodedOutputStream output) throws IOException {
+    output.writeTag(number, type.getWireType());
+    FieldSet.writeElementNoTag(output, type, value);
   }
 
+  private volatile int cachedSerializedSize = -1;
+  @Override
+  public int getSerializedSize() {
+    if (cachedSerializedSize != -1) {
+      return cachedSerializedSize;
+    }
+    int size = 0;
+    size += getFieldSize(KEY_FIELD_NUMBER, metadata.keyType, key);
+    size += getFieldSize(VALUE_FIELD_NUMBER, metadata.valueType, value);
+    cachedSerializedSize = size;
+    return size;
+  }
+
+  private int getFieldSize(
+      int number, WireFormat.FieldType type, Object value) {
+    return CodedOutputStream.computeTagSize(number)
+        + FieldSet.computeElementSizeNoTag(type, value);
+  }
+  
+  /** Parsing constructor. */
+  private MapEntryLite(
+      Metadata<K, V> metadata,
+      CodedInputStream input,
+      ExtensionRegistryLite extensionRegistry)
+      throws InvalidProtocolBufferException {
+    try {
+      K key = metadata.defaultInstance.key;
+      V value = metadata.defaultInstance.value;
+      while (true) {
+        int tag = input.readTag();
+        if (tag == 0) {
+          break;
+        }
+        if (tag == WireFormat.makeTag(
+                KEY_FIELD_NUMBER, metadata.keyType.getWireType())) {
+          key = mergeField(
+              input, extensionRegistry, metadata.keyType, key);
+        } else if (tag == WireFormat.makeTag(
+                       VALUE_FIELD_NUMBER, metadata.valueType.getWireType())) {
+          value = mergeField(
+              input, extensionRegistry, metadata.valueType, value);
+        } else {
+          if (!input.skipField(tag)) {
+            break;
+          }
+        }
+      }
+      this.metadata = metadata;
+      this.key = key;
+      this.value = value;
+    } catch (InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (IOException e) {
+      throw new InvalidProtocolBufferException(e.getMessage())
+          .setUnfinishedMessage(this);
+    }
+  }
+  
   @SuppressWarnings("unchecked")
-  static <T> T parseField(
+  private <T> T mergeField(
       CodedInputStream input, ExtensionRegistryLite extensionRegistry,
       WireFormat.FieldType type, T value) throws IOException {
     switch (type) {
@@ -136,96 +202,136 @@
     }
   }
 
-  /**
-   * Serializes the provided key and value as though they were wrapped by a {@link MapEntryLite}
-   * to the output stream. This helper method avoids allocation of a {@link MapEntryLite}
-   * built with a key and value and is called from generated code directly.
-   */
-  public void serializeTo(CodedOutputStream output, int fieldNumber, K key, V value)
-      throws IOException {
-    output.writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-    output.writeUInt32NoTag(computeSerializedSize(metadata, key, value));
-    writeTo(output, metadata, key, value);
+  @Override
+  public Parser<MapEntryLite<K, V>> getParserForType() {
+    return metadata.parser;
   }
 
-  /**
-   * Computes the message size for the provided key and value as though they were wrapped
-   * by a {@link MapEntryLite}. This helper method avoids allocation of a {@link MapEntryLite}
-   * built with a key and value and is called from generated code directly.
-   */
-  public int computeMessageSize(int fieldNumber, K key, V value) {
-    return CodedOutputStream.computeTagSize(fieldNumber)
-        + CodedOutputStream.computeLengthDelimitedFieldSize(
-            computeSerializedSize(metadata, key, value));
+  @Override
+  public Builder<K, V> newBuilderForType() {
+    return new Builder<K, V>(metadata);
   }
 
-  /**
-   * Parses an entry off of the input as a {@link Map.Entry}. This helper requires an allocation
-   * so using {@link #parseInto} is preferred if possible.
-   */
-  public Map.Entry<K, V> parseEntry(ByteString bytes, ExtensionRegistryLite extensionRegistry)
-      throws IOException {
-    return parseEntry(bytes.newCodedInput(), metadata, extensionRegistry);
+  @Override
+  public Builder<K, V> toBuilder() {
+    return new Builder<K, V>(metadata, key, value);
   }
 
-  static <K, V> Map.Entry<K, V> parseEntry(
-      CodedInputStream input, Metadata<K, V> metadata, ExtensionRegistryLite extensionRegistry)
-          throws IOException{
-    K key = metadata.defaultKey;
-    V value = metadata.defaultValue;
-    while (true) {
-      int tag = input.readTag();
-      if (tag == 0) {
-        break;
-      }
-      if (tag == WireFormat.makeTag(KEY_FIELD_NUMBER, metadata.keyType.getWireType())) {
-        key = parseField(input, extensionRegistry, metadata.keyType, key);
-      } else if (tag == WireFormat.makeTag(VALUE_FIELD_NUMBER, metadata.valueType.getWireType())) {
-        value = parseField(input, extensionRegistry, metadata.valueType, value);
-      } else {
-        if (!input.skipField(tag)) {
-          break;
-        }
-      }
+  @Override
+  public MapEntryLite<K, V> getDefaultInstanceForType() {
+    return metadata.defaultInstance;
+  }
+
+  @Override
+  public boolean isInitialized() {
+    if (metadata.valueType.getJavaType() == WireFormat.JavaType.MESSAGE) {
+      return ((MessageLite) value).isInitialized();
     }
-    return new AbstractMap.SimpleImmutableEntry<K, V>(key, value);
+    return true;
   }
 
   /**
-   * Parses an entry off of the input into the map. This helper avoids allocaton of a
-   * {@link MapEntryLite} by parsing directly into the provided {@link MapFieldLite}.
+   * Builder used to create {@link MapEntryLite} messages.
    */
-  public void parseInto(
-      MapFieldLite<K, V> map, CodedInputStream input, ExtensionRegistryLite extensionRegistry)
-          throws IOException {
-    int length = input.readRawVarint32();
-    final int oldLimit = input.pushLimit(length);
-    K key = metadata.defaultKey;
-    V value = metadata.defaultValue;
-
-    while (true) {
-      int tag = input.readTag();
-      if (tag == 0) {
-        break;
-      }
-      if (tag == WireFormat.makeTag(KEY_FIELD_NUMBER, metadata.keyType.getWireType())) {
-        key = parseField(input, extensionRegistry, metadata.keyType, key);
-      } else if (tag == WireFormat.makeTag(VALUE_FIELD_NUMBER, metadata.valueType.getWireType())) {
-        value = parseField(input, extensionRegistry, metadata.valueType, value);
-      } else {
-        if (!input.skipField(tag)) {
-          break;
-        }
-      }
+  public static class Builder<K, V>
+      extends AbstractMessageLite.Builder<MapEntryLite<K, V>, Builder<K, V>> {
+    private final Metadata<K, V> metadata;
+    private K key;
+    private V value;
+    
+    private Builder(Metadata<K, V> metadata) {
+      this.metadata = metadata;
+      this.key = metadata.defaultInstance.key;
+      this.value = metadata.defaultInstance.value;
+    }
+    
+    public K getKey() {
+      return key;
+    }
+    
+    public V getValue() {
+      return value;
+    }
+    
+    public Builder<K, V> setKey(K key) {
+      this.key = key;
+      return this;
+    }
+    
+    public Builder<K, V> setValue(V value) {
+      this.value = value;
+      return this;
+    }
+    
+    public Builder<K, V> clearKey() {
+      this.key = metadata.defaultInstance.key;
+      return this;
+    }
+    
+    public Builder<K, V> clearValue() {
+      this.value = metadata.defaultInstance.value;
+      return this;
     }
 
-    input.checkLastTagWas(0);
-    input.popLimit(oldLimit);
-    map.put(key, value);
-  }
+    @Override
+    public Builder<K, V> clear() {
+      this.key = metadata.defaultInstance.key;
+      this.value = metadata.defaultInstance.value;
+      return this;
+    }
 
-  /** For experimental runtime internal use only. */
-  Metadata<K, V> getMetadata() {
-    return metadata;
+    @Override
+    public MapEntryLite<K, V> build() {
+      MapEntryLite<K, V> result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @Override
+    public MapEntryLite<K, V> buildPartial() {
+      return new MapEntryLite<K, V>(metadata, key, value);
+    }
+
+    @Override
+    public MessageLite getDefaultInstanceForType() {
+      return metadata.defaultInstance;
+    }
+
+    @Override
+    public boolean isInitialized() {
+      if (metadata.valueType.getJavaType() == WireFormat.JavaType.MESSAGE) {
+        return ((MessageLite) value).isInitialized();
+      }
+      return true;
+    }
+
+    private Builder(Metadata<K, V> metadata, K key, V value) {
+      this.metadata = metadata;
+      this.key = key;
+      this.value = value;
+    }
+    
+    @Override
+    public Builder<K, V> clone() {
+      return new Builder<K, V>(metadata, key, value);
+    }
+
+    @Override
+    public Builder<K, V> mergeFrom(
+        CodedInputStream input, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      MapEntryLite<K, V> entry =
+          new MapEntryLite<K, V>(metadata, input, extensionRegistry);
+      this.key = entry.key;
+      this.value = entry.value;
+      return this;
+    }
+
+    @Override
+    protected Builder<K, V> internalMergeFrom(MapEntryLite<K, V> message) {
+      throw new UnsupportedOperationException();
+    }
   }
 }
diff --git a/java/core/src/main/java/com/google/protobuf/MapField.java b/java/core/src/main/java/com/google/protobuf/MapField.java
index ad8ceb0..907f0f7 100644
--- a/java/core/src/main/java/com/google/protobuf/MapField.java
+++ b/java/core/src/main/java/com/google/protobuf/MapField.java
@@ -30,28 +30,25 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
+import com.google.protobuf.MapFieldLite.MutatabilityAwareMap;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Internal representation of map fields in generated messages.
- *
+ * 
  * This class supports accessing the map field as a {@link Map} to be used in
  * generated API and also supports accessing the field as a {@link List} to be
  * used in reflection API. It keeps track of where the data is currently stored
- * and do necessary conversions between map and list.
- *
+ * and do necessary conversions between map and list.  
+ * 
  * This class is a protobuf implementation detail. Users shouldn't use this
  * class directly.
- *
+ * 
  * THREAD-SAFETY NOTE: Read-only access is thread-safe. Users can call getMap()
  * and getList() concurrently in multiple threads. If write-access is needed,
  * all access must be synchronized.
@@ -59,21 +56,21 @@
 public class MapField<K, V> implements MutabilityOracle {
   /**
    * Indicates where the data of this map field is currently stored.
-   *
+   * 
    * MAP: Data is stored in mapData.
    * LIST: Data is stored in listData.
    * BOTH: mapData and listData have the same data.
    *
    * When the map field is accessed (through generated API or reflection API),
    * it will shift between these 3 modes:
-   *
+   * 
    *          getMap()   getList()   getMutableMap()   getMutableList()
    *   MAP      MAP        BOTH          MAP               LIST
    *   LIST     BOTH       LIST          MAP               LIST
    *   BOTH     BOTH       BOTH          MAP               LIST
-   *
+   *   
    * As the map field changes its mode, the list/map reference returned in a
-   * previous method call may be invalidated.
+   * previous method call may be invalidated. 
    */
   private enum StorageMode {MAP, LIST, BOTH}
 
@@ -81,28 +78,27 @@
   private volatile StorageMode mode;
   private MutatabilityAwareMap<K, V> mapData;
   private List<Message> listData;
-
+  
   // Convert between a map entry Message and a key-value pair.
   private static interface Converter<K, V> {
     Message convertKeyAndValueToMessage(K key, V value);
     void convertMessageToKeyAndValue(Message message, Map<K, V> map);
-
+    
     Message getMessageDefaultInstance();
   }
-
+  
   private static class ImmutableMessageConverter<K, V> implements Converter<K, V> {
     private final MapEntry<K, V> defaultEntry;
     public ImmutableMessageConverter(MapEntry<K, V> defaultEntry) {
       this.defaultEntry = defaultEntry;
     }
-
+    
     @Override
     public Message convertKeyAndValueToMessage(K key, V value) {
       return defaultEntry.newBuilderForType().setKey(key).setValue(value).buildPartial();
     }
-
+    
     @Override
-    @SuppressWarnings("unchecked")
     public void convertMessageToKeyAndValue(Message message, Map<K, V> map) {
       MapEntry<K, V> entry = (MapEntry<K, V>) message;
       map.put(entry.getKey(), entry.getValue());
@@ -113,10 +109,10 @@
       return defaultEntry;
     }
   }
-
+  
 
   private final Converter<K, V> converter;
-
+  
   private MapField(
       Converter<K, V> converter,
       StorageMode mode,
@@ -127,34 +123,34 @@
     this.mapData = new MutatabilityAwareMap<K, V>(this, mapData);
     this.listData = null;
   }
-
+    
   private MapField(
       MapEntry<K, V> defaultEntry,
       StorageMode mode,
       Map<K, V> mapData) {
     this(new ImmutableMessageConverter<K, V>(defaultEntry), mode, mapData);
   }
-
-
+  
+  
   /** Returns an immutable empty MapField. */
   public static <K, V> MapField<K, V> emptyMapField(
       MapEntry<K, V> defaultEntry) {
     return new MapField<K, V>(
         defaultEntry, StorageMode.MAP, Collections.<K, V>emptyMap());
   }
-
-
+  
+  
   /** Creates a new mutable empty MapField. */
   public static <K, V> MapField<K, V> newMapField(MapEntry<K, V> defaultEntry) {
     return new MapField<K, V>(
         defaultEntry, StorageMode.MAP, new LinkedHashMap<K, V>());
   }
-
-
+  
+  
   private Message convertKeyAndValueToMessage(K key, V value) {
     return converter.convertKeyAndValueToMessage(key, value);
   }
-
+  
   @SuppressWarnings("unchecked")
   private void convertMessageToKeyAndValue(Message message, Map<K, V> map) {
     converter.convertMessageToKeyAndValue(message, map);
@@ -177,7 +173,7 @@
     }
     return new MutatabilityAwareMap<K, V>(this, mapData);
   }
-
+  
   /** Returns the content of this MapField as a read-only Map. */
   public Map<K, V> getMap() {
     if (mode == StorageMode.LIST) {
@@ -190,7 +186,7 @@
     }
     return Collections.unmodifiableMap(mapData);
   }
-
+  
   /** Gets a mutable Map view of this MapField. */
   public Map<K, V> getMutableMap() {
     if (mode != StorageMode.MAP) {
@@ -198,20 +194,20 @@
         mapData = convertListToMap(listData);
       }
       listData = null;
-      mode = StorageMode.MAP;
+      mode = StorageMode.MAP; 
     }
     return mapData;
   }
-
+  
   public void mergeFrom(MapField<K, V> other) {
     getMutableMap().putAll(MapFieldLite.copy(other.getMap()));
   }
-
+  
   public void clear() {
     mapData = new MutatabilityAwareMap<K, V>(this, new LinkedHashMap<K, V>());
     mode = StorageMode.MAP;
   }
-
+  
   @SuppressWarnings("unchecked")
   @Override
   public boolean equals(Object object) {
@@ -221,18 +217,18 @@
     MapField<K, V> other = (MapField<K, V>) object;
     return MapFieldLite.<K, V>equals(getMap(), other.getMap());
   }
-
+  
   @Override
   public int hashCode() {
     return MapFieldLite.<K, V>calculateHashCodeForMap(getMap());
   }
-
+  
   /** Returns a deep copy of this MapField. */
   public MapField<K, V> copy() {
     return new MapField<K, V>(
         converter, StorageMode.MAP, MapFieldLite.copy(getMap()));
   }
-
+  
   /** Gets the content of this MapField as a read-only List. */
   List<Message> getList() {
     if (mode == StorageMode.MAP) {
@@ -245,7 +241,7 @@
     }
     return Collections.unmodifiableList(listData);
   }
-
+  
   /** Gets a mutable List view of this MapField. */
   List<Message> getMutableList() {
     if (mode != StorageMode.LIST) {
@@ -257,7 +253,7 @@
     }
     return listData;
   }
-
+  
   /**
    * Gets the default instance of the message stored in the list view of this
    * map field.
@@ -265,7 +261,7 @@
   Message getMapEntryMessageDefaultInstance() {
     return converter.getMessageDefaultInstance();
   }
-
+  
   /**
    * Makes this list immutable. All subsequent modifications will throw an
    * {@link UnsupportedOperationException}.
@@ -273,14 +269,14 @@
   public void makeImmutable() {
     isMutable = false;
   }
-
+  
   /**
    * Returns whether this field can be modified.
    */
   public boolean isMutable() {
     return isMutable;
   }
-
+  
   /* (non-Javadoc)
    * @see com.google.protobuf.MutabilityOracle#ensureMutable()
    */
@@ -290,344 +286,4 @@
       throw new UnsupportedOperationException();
     }
   }
-
-  /**
-   * An internal map that checks for mutability before delegating.
-   */
-  private static class MutatabilityAwareMap<K, V> implements Map<K, V> {
-    private final MutabilityOracle mutabilityOracle;
-    private final Map<K, V> delegate;
-
-    MutatabilityAwareMap(MutabilityOracle mutabilityOracle, Map<K, V> delegate) {
-      this.mutabilityOracle = mutabilityOracle;
-      this.delegate = delegate;
-    }
-
-    @Override
-    public int size() {
-      return delegate.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-      return delegate.isEmpty();
-    }
-
-    @Override
-    public boolean containsKey(Object key) {
-      return delegate.containsKey(key);
-    }
-
-    @Override
-    public boolean containsValue(Object value) {
-      return delegate.containsValue(value);
-    }
-
-    @Override
-    public V get(Object key) {
-      return delegate.get(key);
-    }
-
-    @Override
-    public V put(K key, V value) {
-      mutabilityOracle.ensureMutable();
-      checkNotNull(key);
-      checkNotNull(value);
-      return delegate.put(key, value);
-    }
-
-    @Override
-    public V remove(Object key) {
-      mutabilityOracle.ensureMutable();
-      return delegate.remove(key);
-    }
-
-    @Override
-    public void putAll(Map<? extends K, ? extends V> m) {
-      mutabilityOracle.ensureMutable();
-      for (K key : m.keySet()) {
-        checkNotNull(key);
-        checkNotNull(m.get(key));
-      }
-      delegate.putAll(m);
-    }
-
-    @Override
-    public void clear() {
-      mutabilityOracle.ensureMutable();
-      delegate.clear();
-    }
-
-    @Override
-    public Set<K> keySet() {
-      return new MutatabilityAwareSet<K>(mutabilityOracle, delegate.keySet());
-    }
-
-    @Override
-    public Collection<V> values() {
-      return new MutatabilityAwareCollection<V>(mutabilityOracle, delegate.values());
-    }
-
-    @Override
-    public Set<java.util.Map.Entry<K, V>> entrySet() {
-      return new MutatabilityAwareSet<Entry<K, V>>(mutabilityOracle, delegate.entrySet());
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      return delegate.equals(o);
-    }
-
-    @Override
-    public int hashCode() {
-      return delegate.hashCode();
-    }
-
-    @Override
-    public String toString() {
-      return delegate.toString();
-    }
-
-    /**
-     * An internal collection that checks for mutability before delegating.
-     */
-    private static class MutatabilityAwareCollection<E> implements Collection<E> {
-      private final MutabilityOracle mutabilityOracle;
-      private final Collection<E> delegate;
-
-      MutatabilityAwareCollection(MutabilityOracle mutabilityOracle, Collection<E> delegate) {
-        this.mutabilityOracle = mutabilityOracle;
-        this.delegate = delegate;
-      }
-
-      @Override
-      public int size() {
-        return delegate.size();
-      }
-
-      @Override
-      public boolean isEmpty() {
-        return delegate.isEmpty();
-      }
-
-      @Override
-      public boolean contains(Object o) {
-        return delegate.contains(o);
-      }
-
-      @Override
-      public Iterator<E> iterator() {
-        return new MutatabilityAwareIterator<E>(mutabilityOracle, delegate.iterator());
-      }
-
-      @Override
-      public Object[] toArray() {
-        return delegate.toArray();
-      }
-
-      @Override
-      public <T> T[] toArray(T[] a) {
-        return delegate.toArray(a);
-      }
-
-      @Override
-      public boolean add(E e) {
-        // Unsupported operation in the delegate.
-        throw new UnsupportedOperationException();
-      }
-
-      @Override
-      public boolean remove(Object o) {
-        mutabilityOracle.ensureMutable();
-        return delegate.remove(o);
-      }
-
-      @Override
-      public boolean containsAll(Collection<?> c) {
-        return delegate.containsAll(c);
-      }
-
-      @Override
-      public boolean addAll(Collection<? extends E> c) {
-        // Unsupported operation in the delegate.
-        throw new UnsupportedOperationException();
-      }
-
-      @Override
-      public boolean removeAll(Collection<?> c) {
-        mutabilityOracle.ensureMutable();
-        return delegate.removeAll(c);
-      }
-
-      @Override
-      public boolean retainAll(Collection<?> c) {
-        mutabilityOracle.ensureMutable();
-        return delegate.retainAll(c);
-      }
-
-      @Override
-      public void clear() {
-        mutabilityOracle.ensureMutable();
-        delegate.clear();
-      }
-
-      @Override
-      public boolean equals(Object o) {
-        return delegate.equals(o);
-      }
-
-      @Override
-      public int hashCode() {
-        return delegate.hashCode();
-      }
-
-      @Override
-      public String toString() {
-        return delegate.toString();
-      }
-    }
-
-    /**
-     * An internal set that checks for mutability before delegating.
-     */
-    private static class MutatabilityAwareSet<E> implements Set<E> {
-      private final MutabilityOracle mutabilityOracle;
-      private final Set<E> delegate;
-
-      MutatabilityAwareSet(MutabilityOracle mutabilityOracle, Set<E> delegate) {
-        this.mutabilityOracle = mutabilityOracle;
-        this.delegate = delegate;
-      }
-
-      @Override
-      public int size() {
-        return delegate.size();
-      }
-
-      @Override
-      public boolean isEmpty() {
-        return delegate.isEmpty();
-      }
-
-      @Override
-      public boolean contains(Object o) {
-        return delegate.contains(o);
-      }
-
-      @Override
-      public Iterator<E> iterator() {
-        return new MutatabilityAwareIterator<E>(mutabilityOracle, delegate.iterator());
-      }
-
-      @Override
-      public Object[] toArray() {
-        return delegate.toArray();
-      }
-
-      @Override
-      public <T> T[] toArray(T[] a) {
-        return delegate.toArray(a);
-      }
-
-      @Override
-      public boolean add(E e) {
-        mutabilityOracle.ensureMutable();
-        return delegate.add(e);
-      }
-
-      @Override
-      public boolean remove(Object o) {
-        mutabilityOracle.ensureMutable();
-        return delegate.remove(o);
-      }
-
-      @Override
-      public boolean containsAll(Collection<?> c) {
-        return delegate.containsAll(c);
-      }
-
-      @Override
-      public boolean addAll(Collection<? extends E> c) {
-        mutabilityOracle.ensureMutable();
-        return delegate.addAll(c);
-      }
-
-      @Override
-      public boolean retainAll(Collection<?> c) {
-        mutabilityOracle.ensureMutable();
-        return delegate.retainAll(c);
-      }
-
-      @Override
-      public boolean removeAll(Collection<?> c) {
-        mutabilityOracle.ensureMutable();
-        return delegate.removeAll(c);
-      }
-
-      @Override
-      public void clear() {
-        mutabilityOracle.ensureMutable();
-        delegate.clear();
-      }
-
-      @Override
-      public boolean equals(Object o) {
-        return delegate.equals(o);
-      }
-
-      @Override
-      public int hashCode() {
-        return delegate.hashCode();
-      }
-
-      @Override
-      public String toString() {
-        return delegate.toString();
-      }
-    }
-
-    /**
-     * An internal iterator that checks for mutability before delegating.
-     */
-    private static class MutatabilityAwareIterator<E> implements Iterator<E> {
-      private final MutabilityOracle mutabilityOracle;
-      private final Iterator<E> delegate;
-
-      MutatabilityAwareIterator(MutabilityOracle mutabilityOracle, Iterator<E> delegate) {
-        this.mutabilityOracle = mutabilityOracle;
-        this.delegate = delegate;
-      }
-
-      @Override
-      public boolean hasNext() {
-        return delegate.hasNext();
-      }
-
-      @Override
-      public E next() {
-        return delegate.next();
-      }
-
-      @Override
-      public void remove() {
-        mutabilityOracle.ensureMutable();
-        delegate.remove();
-      }
-
-      @Override
-      public boolean equals(Object obj) {
-        return delegate.equals(obj);
-      }
-
-      @Override
-      public int hashCode() {
-        return delegate.hashCode();
-      }
-
-      @Override
-      public String toString() {
-        return delegate.toString();
-      }
-    }
-  }
 }
diff --git a/java/core/src/main/java/com/google/protobuf/MapFieldLite.java b/java/core/src/main/java/com/google/protobuf/MapFieldLite.java
index a8b3dd8..960b633 100644
--- a/java/core/src/main/java/com/google/protobuf/MapFieldLite.java
+++ b/java/core/src/main/java/com/google/protobuf/MapFieldLite.java
@@ -30,100 +30,74 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import com.google.protobuf.Internal.EnumLite;
+
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Internal representation of map fields in generated lite-runtime messages.
- *
+ * 
  * This class is a protobuf implementation detail. Users shouldn't use this
  * class directly.
  */
-public final class MapFieldLite<K, V> extends LinkedHashMap<K, V> {
-
+public final class MapFieldLite<K, V> implements MutabilityOracle {
+  private MutatabilityAwareMap<K, V> mapData;
   private boolean isMutable;
-
-  private MapFieldLite() {
-    this.isMutable = true;
-  }
-
+  
   private MapFieldLite(Map<K, V> mapData) {
-    super(mapData);
+    this.mapData = new MutatabilityAwareMap<K, V>(this, mapData);
     this.isMutable = true;
   }
-
+  
   @SuppressWarnings({"rawtypes", "unchecked"})
-  private static final MapFieldLite EMPTY_MAP_FIELD = new MapFieldLite();
+  private static final MapFieldLite EMPTY_MAP_FIELD =
+      new MapFieldLite(Collections.emptyMap());
   static {
     EMPTY_MAP_FIELD.makeImmutable();
   }
-
+  
   /** Returns an singleton immutable empty MapFieldLite instance. */
   @SuppressWarnings({"unchecked", "cast"})
   public static <K, V> MapFieldLite<K, V> emptyMapField() {
     return (MapFieldLite<K, V>) EMPTY_MAP_FIELD;
   }
-
+  
+  /** Creates a new MapFieldLite instance. */
+  public static <K, V> MapFieldLite<K, V> newMapField() {
+    return new MapFieldLite<K, V>(new LinkedHashMap<K, V>());
+  }
+  
+  /** Gets the content of this MapField as a read-only Map. */
+  public Map<K, V> getMap() {
+    return Collections.unmodifiableMap(mapData);
+  }
+  
+  /** Gets a mutable Map view of this MapField. */
+  public Map<K, V> getMutableMap() {
+    return mapData;
+  }
+  
   public void mergeFrom(MapFieldLite<K, V> other) {
-    ensureMutable();
-    if (!other.isEmpty()) {
-      putAll(other);
-    }
+    mapData.putAll(copy(other.mapData));
   }
-
-  @SuppressWarnings({"unchecked", "cast"})
-  @Override public Set<Map.Entry<K, V>> entrySet() {
-    return isEmpty() ? Collections.<Map.Entry<K, V>>emptySet() : super.entrySet();
+  
+  public void clear() {
+    mapData.clear();
   }
-
-  @Override public void clear() {
-    ensureMutable();
-    super.clear();
-  }
-
-  @Override public V put(K key, V value) {
-    ensureMutable();
-    checkNotNull(key);
-
-    checkNotNull(value);
-    return super.put(key, value);
-  }
-
-  public V put(Map.Entry<K, V> entry) {
-    return put(entry.getKey(), entry.getValue());
-  }
-
-  @Override public void putAll(Map<? extends K, ? extends V> m) {
-    ensureMutable();
-    checkForNullKeysAndValues(m);
-    super.putAll(m);
-  }
-
-  @Override public V remove(Object key) {
-    ensureMutable();
-    return super.remove(key);
-  }
-
-  private static void checkForNullKeysAndValues(Map<?, ?> m) {
-    for (Object key : m.keySet()) {
-      checkNotNull(key);
-      checkNotNull(m.get(key));
-    }
-  }
-
+  
   private static boolean equals(Object a, Object b) {
     if (a instanceof byte[] && b instanceof byte[]) {
       return Arrays.equals((byte[]) a, (byte[]) b);
     }
     return a.equals(b);
   }
-
+  
   /**
    * Checks whether two {@link Map}s are equal. We don't use the default equals
    * method of {@link Map} because it compares by identity not by content for
@@ -146,16 +120,20 @@
     }
     return true;
   }
-
+  
   /**
    * Checks whether two map fields are equal.
    */
   @SuppressWarnings("unchecked")
   @Override
   public boolean equals(Object object) {
-    return (object instanceof Map) && equals(this, (Map<K, V>) object);
+    if (!(object instanceof MapFieldLite)) {
+      return false;
+    }
+    MapFieldLite<K, V> other = (MapFieldLite<K, V>) object;
+    return equals(mapData, other.mapData);
   }
-
+  
   private static int calculateHashCodeForObject(Object a) {
     if (a instanceof byte[]) {
       return Internal.hashCode((byte[]) a);
@@ -178,14 +156,14 @@
       result += calculateHashCodeForObject(entry.getKey())
           ^ calculateHashCodeForObject(entry.getValue());
     }
-    return result;
+    return result;    
   }
-
+  
   @Override
   public int hashCode() {
-    return calculateHashCodeForMap(this);
+    return calculateHashCodeForMap(mapData);
   }
-
+  
   private static Object copy(Object object) {
     if (object instanceof byte[]) {
       byte[] data = (byte[]) object;
@@ -193,7 +171,7 @@
     }
     return object;
   }
-
+  
   /**
    * Makes a deep copy of a {@link Map}. Immutable objects in the map will be
    * shared (e.g., integers, strings, immutable messages) and mutable ones will
@@ -207,12 +185,12 @@
     }
     return result;
   }
-
+  
   /** Returns a deep copy of this map field. */
-  public MapFieldLite<K, V> mutableCopy() {
-    return isEmpty() ? new MapFieldLite<K, V>() : new MapFieldLite<K, V>(this);
+  public MapFieldLite<K, V> copy() {
+    return new MapFieldLite<K, V>(copy(mapData));
   }
-
+  
   /**
    * Makes this field immutable. All subsequent modifications will throw an
    * {@link UnsupportedOperationException}.
@@ -220,17 +198,352 @@
   public void makeImmutable() {
     isMutable = false;
   }
-
+  
   /**
    * Returns whether this field can be modified.
    */
   public boolean isMutable() {
     return isMutable;
   }
-
-  private void ensureMutable() {
+  
+  @Override
+  public void ensureMutable() {
     if (!isMutable()) {
       throw new UnsupportedOperationException();
     }
   }
+
+  /**
+   * An internal map that checks for mutability before delegating.
+   */
+  static class MutatabilityAwareMap<K, V> implements Map<K, V> {    
+    private final MutabilityOracle mutabilityOracle;
+    private final Map<K, V> delegate;
+    
+    MutatabilityAwareMap(MutabilityOracle mutabilityOracle, Map<K, V> delegate) {
+      this.mutabilityOracle = mutabilityOracle;
+      this.delegate = delegate;
+    }
+
+    @Override
+    public int size() {
+      return delegate.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return delegate.isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+      return delegate.containsKey(key);
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+      return delegate.containsValue(value);
+    }
+
+    @Override
+    public V get(Object key) {
+      return delegate.get(key);
+    }
+
+    @Override
+    public V put(K key, V value) {
+      mutabilityOracle.ensureMutable();
+      return delegate.put(key, value);
+    }
+
+    @Override
+    public V remove(Object key) {
+      mutabilityOracle.ensureMutable();
+      return delegate.remove(key);
+    }
+
+    @Override
+    public void putAll(Map<? extends K, ? extends V> m) {
+      mutabilityOracle.ensureMutable();
+      delegate.putAll(m);
+    }
+
+    @Override
+    public void clear() {
+      mutabilityOracle.ensureMutable();
+      delegate.clear();
+    }
+
+    @Override
+    public Set<K> keySet() {
+      return new MutatabilityAwareSet<K>(mutabilityOracle, delegate.keySet());
+    }
+
+    @Override
+    public Collection<V> values() {
+      return new MutatabilityAwareCollection<V>(mutabilityOracle, delegate.values());
+    }
+
+    @Override
+    public Set<java.util.Map.Entry<K, V>> entrySet() {
+      return new MutatabilityAwareSet<Entry<K, V>>(mutabilityOracle, delegate.entrySet());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return delegate.equals(o);
+    }
+
+    @Override
+    public int hashCode() {
+      return delegate.hashCode();
+    }
+
+    @Override
+    public String toString() {
+      return delegate.toString();
+    }
+  }
+
+  /**
+   * An internal collection that checks for mutability before delegating.
+   */
+  private static class MutatabilityAwareCollection<E> implements Collection<E> {
+    private final MutabilityOracle mutabilityOracle;
+    private final Collection<E> delegate;
+    
+    MutatabilityAwareCollection(MutabilityOracle mutabilityOracle, Collection<E> delegate) {
+      this.mutabilityOracle = mutabilityOracle;
+      this.delegate = delegate;
+    }
+
+    @Override
+    public int size() {
+      return delegate.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return delegate.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+      return delegate.contains(o);
+    }
+
+    @Override
+    public Iterator<E> iterator() {
+      return new MutatabilityAwareIterator<E>(mutabilityOracle, delegate.iterator());
+    }
+
+    @Override
+    public Object[] toArray() {
+      return delegate.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+      return delegate.toArray(a);
+    }
+
+    @Override
+    public boolean add(E e) {
+      // Unsupported operation in the delegate.
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean remove(Object o) {
+      mutabilityOracle.ensureMutable();
+      return delegate.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+      return delegate.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+      // Unsupported operation in the delegate.
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+      mutabilityOracle.ensureMutable();
+      return delegate.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+      mutabilityOracle.ensureMutable();
+      return delegate.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+      mutabilityOracle.ensureMutable();
+      delegate.clear();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return delegate.equals(o);
+    }
+
+    @Override
+    public int hashCode() {
+      return delegate.hashCode();
+    }
+    
+    @Override
+    public String toString() {
+      return delegate.toString();
+    }
+  }
+
+  /**
+   * An internal set that checks for mutability before delegating.
+   */
+  private static class MutatabilityAwareSet<E> implements Set<E> {
+    private final MutabilityOracle mutabilityOracle;
+    private final Set<E> delegate;
+    
+    MutatabilityAwareSet(MutabilityOracle mutabilityOracle, Set<E> delegate) {
+      this.mutabilityOracle = mutabilityOracle;
+      this.delegate = delegate;
+    }
+
+    @Override
+    public int size() {
+      return delegate.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return delegate.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+      return delegate.contains(o);
+    }
+
+    @Override
+    public Iterator<E> iterator() {
+      return new MutatabilityAwareIterator<E>(mutabilityOracle, delegate.iterator());
+    }
+
+    @Override
+    public Object[] toArray() {
+      return delegate.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+      return delegate.toArray(a);
+    }
+
+    @Override
+    public boolean add(E e) {
+      mutabilityOracle.ensureMutable();
+      return delegate.add(e);
+    }
+
+    @Override
+    public boolean remove(Object o) {
+      mutabilityOracle.ensureMutable();
+      return delegate.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+      return delegate.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+      mutabilityOracle.ensureMutable();
+      return delegate.addAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+      mutabilityOracle.ensureMutable();
+      return delegate.retainAll(c);
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+      mutabilityOracle.ensureMutable();
+      return delegate.removeAll(c);
+    }
+
+    @Override
+    public void clear() {
+      mutabilityOracle.ensureMutable();
+      delegate.clear();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return delegate.equals(o);
+    }
+
+    @Override
+    public int hashCode() {
+      return delegate.hashCode();
+    }
+
+    @Override
+    public String toString() {
+      return delegate.toString();
+    }
+  }
+  
+  /**
+   * An internal iterator that checks for mutability before delegating.
+   */
+  private static class MutatabilityAwareIterator<E> implements Iterator<E> {
+    private final MutabilityOracle mutabilityOracle;
+    private final Iterator<E> delegate;
+    
+    MutatabilityAwareIterator(MutabilityOracle mutabilityOracle, Iterator<E> delegate) {
+      this.mutabilityOracle = mutabilityOracle;
+      this.delegate = delegate;
+    }
+
+    @Override
+    public boolean hasNext() {
+      return delegate.hasNext();
+    }
+
+    @Override
+    public E next() {
+      return delegate.next();
+    }
+
+    @Override
+    public void remove() {
+      mutabilityOracle.ensureMutable();
+      delegate.remove();
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+      return delegate.equals(obj);
+    }
+    
+    @Override
+    public int hashCode() {
+      return delegate.hashCode();
+    }
+
+    @Override
+    public String toString() {
+      return delegate.toString();
+    }
+  }
 }
diff --git a/java/core/src/main/java/com/google/protobuf/Message.java b/java/core/src/main/java/com/google/protobuf/Message.java
index 0770d41..94590fb 100644
--- a/java/core/src/main/java/com/google/protobuf/Message.java
+++ b/java/core/src/main/java/com/google/protobuf/Message.java
@@ -125,7 +125,7 @@
      *   it is merged into the corresponding sub-message of this message
      *   using the same merging rules.<br>
      * * For repeated fields, the elements in {@code other} are concatenated
-     *   with the elements in this message.<br>
+     *   with the elements in this message.
      * * For oneof groups, if the other message has one of the fields set,
      *   the group of this message is cleared and replaced by the field
      *   of the other message, so that the oneof constraint is preserved.
diff --git a/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java b/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java
index 23373ef..4384765 100644
--- a/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageLiteToString.java
@@ -95,7 +95,7 @@
         // Try to reflectively get the value and toString() the field as if it were repeated. This
         // only works if the method names have not be proguarded out or renamed.
         Method listMethod = nameToNoArgMethod.get("get" + suffix);
-        if (listMethod != null && listMethod.getReturnType().equals(List.class)) {
+        if (listMethod != null) {
           printField(
               buffer,
               indent,
@@ -115,7 +115,7 @@
         // Heuristic to skip bytes based accessors for string fields.
         continue;
       }
-
+      
       String camelCase = suffix.substring(0, 1).toLowerCase() + suffix.substring(1);
 
       // Try to reflectively get the value and toString() the field as if it were optional. This
diff --git a/java/core/src/main/java/com/google/protobuf/MessageReflection.java b/java/core/src/main/java/com/google/protobuf/MessageReflection.java
index 69ad7dd..7b791d9 100644
--- a/java/core/src/main/java/com/google/protobuf/MessageReflection.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageReflection.java
@@ -31,6 +31,7 @@
 package com.google.protobuf;
 
 import com.google.protobuf.Descriptors.FieldDescriptor;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -363,6 +364,7 @@
      * Finishes the merge and returns the underlying object.
      */
     Object finish();
+    
   }
 
   static class BuilderAdapter implements MergeTarget {
@@ -547,6 +549,7 @@
     public Object finish() {
       return builder.buildPartial();
     }
+    
   }
 
 
@@ -710,17 +713,16 @@
       throw new UnsupportedOperationException(
           "finish() called on FieldSet object");
     }
+    
   }
 
   /**
-   * Parses a single field into MergeTarget. The target can be Message.Builder, FieldSet or
-   * MutableMessage.
+   * Parses a single field into MergeTarget. The target can be Message.Builder,
+   * FieldSet or MutableMessage.
    *
-   * <p>Package-private because it is used by GeneratedMessage.ExtendableMessage.
+   * Package-private because it is used by GeneratedMessage.ExtendableMessage.
    *
    * @param tag The tag, which should have already been read.
-   * @param unknownFields If not null, unknown fields will be merged to this {@link
-   *     UnknownFieldSet}, otherwise unknown fields will be discarded.
    * @return {@code true} unless the tag is an end-group tag.
    */
   static boolean mergeFieldFrom(
@@ -729,8 +731,7 @@
       ExtensionRegistryLite extensionRegistry,
       Descriptors.Descriptor type,
       MergeTarget target,
-      int tag)
-      throws IOException {
+      int tag) throws IOException {
     if (type.getOptions().getMessageSetWireFormat() &&
         tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
       mergeMessageSetExtensionFromCodedStream(
@@ -794,11 +795,7 @@
     }
 
     if (unknown) {  // Unknown field or wrong wire type.  Skip.
-      if (unknownFields != null) {
-        return unknownFields.mergeFieldFrom(tag, input);
-      } else {
-        return input.skipField(tag);
-      }
+      return unknownFields.mergeFieldFrom(tag, input);
     }
 
     if (packed) {
@@ -850,9 +847,7 @@
             // If the number isn't recognized as a valid value for this enum,
             // drop it.
             if (value == null) {
-              if (unknownFields != null) {
-                unknownFields.mergeVarintField(fieldNumber, rawValue);
-              }
+              unknownFields.mergeVarintField(fieldNumber, rawValue);
               return true;
             }
           }
@@ -955,7 +950,7 @@
         mergeMessageSetExtensionFromBytes(
             rawBytes, extension, extensionRegistry, target);
       } else { // We don't know how to parse this. Ignore it.
-        if (rawBytes != null && unknownFields != null) {
+        if (rawBytes != null) {
           unknownFields.mergeField(typeId, UnknownFieldSet.Field.newBuilder()
               .addLengthDelimited(rawBytes).build());
         }
diff --git a/java/core/src/main/java/com/google/protobuf/NioByteString.java b/java/core/src/main/java/com/google/protobuf/NioByteString.java
index 7659480..6163c7b 100644
--- a/java/core/src/main/java/com/google/protobuf/NioByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/NioByteString.java
@@ -30,8 +30,6 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.Internal.checkNotNull;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InvalidObjectException;
@@ -51,9 +49,10 @@
   private final ByteBuffer buffer;
 
   NioByteString(ByteBuffer buffer) {
-    checkNotNull(buffer, "buffer");
+    if (buffer == null) {
+      throw new NullPointerException("buffer");
+    }
 
-    // Use native byte order for fast fixed32/64 operations.
     this.buffer = buffer.slice().order(ByteOrder.nativeOrder());
   }
 
@@ -267,7 +266,7 @@
 
   @Override
   public CodedInputStream newCodedInput() {
-    return CodedInputStream.newInstance(buffer, true);
+    return CodedInputStream.newInstance(buffer);
   }
 
   /**
diff --git a/java/core/src/main/java/com/google/protobuf/Parser.java b/java/core/src/main/java/com/google/protobuf/Parser.java
index e07c689..6db6924 100644
--- a/java/core/src/main/java/com/google/protobuf/Parser.java
+++ b/java/core/src/main/java/com/google/protobuf/Parser.java
@@ -31,7 +31,6 @@
 package com.google.protobuf;
 
 import java.io.InputStream;
-import java.nio.ByteBuffer;
 
 /**
  * Abstract interface for parsing Protocol Messages.
@@ -40,7 +39,7 @@
  *
  * <p>All methods may throw {@link InvalidProtocolBufferException}. In the event of invalid data,
  * like an encoding error, the cause of the thrown exception will be {@code null}. However, if an
- * I/O problem occurs, an exception is thrown with an {@link java.io.IOException} cause.
+ * I/O problem occurs, an exception is thrown with an {@link IOException} cause.
  *
  * @author liujisi@google.com (Pherl Liu)
  */
@@ -94,18 +93,6 @@
   // Convenience methods.
 
   /**
-   * Parses {@code data} as a message of {@code MessageType}. This is just a small wrapper around
-   * {@link #parseFrom(CodedInputStream)}.
-   */
-  public MessageType parseFrom(ByteBuffer data) throws InvalidProtocolBufferException;
-
-  /**
-   * Parses {@code data} as a message of {@code MessageType}. This is just a small wrapper around
-   * {@link #parseFrom(CodedInputStream, ExtensionRegistryLite)}.
-   */
-  public MessageType parseFrom(ByteBuffer data, ExtensionRegistryLite extensionRegistry)
-      throws InvalidProtocolBufferException;
-  /**
    * Parses {@code data} as a message of {@code MessageType}.
    * This is just a small wrapper around {@link #parseFrom(CodedInputStream)}.
    */
diff --git a/java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java b/java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java
deleted file mode 100644
index 79b5769..0000000
--- a/java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java
+++ /dev/null
@@ -1,34 +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;
-
-/** A marker interface indicating that the collection supports primitives and is non-boxing. */
-interface PrimitiveNonBoxingCollection {}
diff --git a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java
deleted file mode 100644
index 30c991d..0000000
--- a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java
+++ /dev/null
@@ -1,702 +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 com.google.protobuf.Internal.checkNotNull;
-
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * {@code RepeatedFieldBuilderV3} implements a structure that a protocol
- * message uses to hold a repeated field of other protocol messages. It supports
- * the classical use case of adding immutable {@link Message}'s to the
- * repeated field and is highly optimized around this (no extra memory
- * allocations and sharing of immutable arrays).
- * <br>
- * It also supports the additional use case of adding a {@link Message.Builder}
- * to the repeated field and deferring conversion of that {@code Builder}
- * to an immutable {@code Message}. In this way, it's possible to maintain
- * a tree of {@code Builder}'s that acts as a fully read/write data
- * structure.
- * <br>
- * Logically, one can think of a tree of builders as converting the entire tree
- * to messages when build is called on the root or when any method is called
- * that desires a Message instead of a Builder. In terms of the implementation,
- * the {@code SingleFieldBuilderV3} and {@code RepeatedFieldBuilderV3}
- * classes cache messages that were created so that messages only need to be
- * created when some change occurred in its builder or a builder for one of its
- * descendants.
- *
- * @param <MType> the type of message for the field
- * @param <BType> the type of builder for the field
- * @param <IType> the common interface for the message and the builder
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class RepeatedFieldBuilderV3
-    <MType extends AbstractMessage,
-     BType extends AbstractMessage.Builder,
-     IType extends MessageOrBuilder>
-    implements AbstractMessage.BuilderParent {
-
-  // Parent to send changes to.
-  private AbstractMessage.BuilderParent parent;
-
-  // List of messages. Never null. It may be immutable, in which case
-  // isMessagesListMutable will be false. See note below.
-  private List<MType> messages;
-
-  // Whether messages is an mutable array that can be modified.
-  private boolean isMessagesListMutable;
-
-  // List of builders. May be null, in which case, no nested builders were
-  // created. If not null, entries represent the builder for that index.
-  private List<SingleFieldBuilderV3<MType, BType, IType>> builders;
-
-  // Here are the invariants for messages and builders:
-  // 1. messages is never null and its count corresponds to the number of items
-  //    in the repeated field.
-  // 2. If builders is non-null, messages and builders MUST always
-  //    contain the same number of items.
-  // 3. Entries in either array can be null, but for any index, there MUST be
-  //    either a Message in messages or a builder in builders.
-  // 4. If the builder at an index is non-null, the builder is
-  //    authoritative. This is the case where a Builder was set on the index.
-  //    Any message in the messages array MUST be ignored.
-  // t. If the builder at an index is null, the message in the messages
-  //    list is authoritative. This is the case where a Message (not a Builder)
-  //    was set directly for an index.
-
-  // Indicates that we've built a message and so we are now obligated
-  // to dispatch dirty invalidations. See AbstractMessage.BuilderListener.
-  private boolean isClean;
-
-  // A view of this builder that exposes a List interface of messages. This is
-  // initialized on demand. This is fully backed by this object and all changes
-  // are reflected in it. Access to any item converts it to a message if it
-  // was a builder.
-  private MessageExternalList<MType, BType, IType> externalMessageList;
-
-  // A view of this builder that exposes a List interface of builders. This is
-  // initialized on demand. This is fully backed by this object and all changes
-  // are reflected in it. Access to any item converts it to a builder if it
-  // was a message.
-  private BuilderExternalList<MType, BType, IType> externalBuilderList;
-
-  // A view of this builder that exposes a List interface of the interface
-  // implemented by messages and builders. This is initialized on demand. This
-  // is fully backed by this object and all changes are reflected in it.
-  // Access to any item returns either a builder or message depending on
-  // what is most efficient.
-  private MessageOrBuilderExternalList<MType, BType, IType>
-      externalMessageOrBuilderList;
-
-  /**
-   * Constructs a new builder with an empty list of messages.
-   *
-   * @param messages the current list of messages
-   * @param isMessagesListMutable Whether the messages list is mutable
-   * @param parent a listener to notify of changes
-   * @param isClean whether the builder is initially marked clean
-   */
-  public RepeatedFieldBuilderV3(
-      List<MType> messages,
-      boolean isMessagesListMutable,
-      AbstractMessage.BuilderParent parent,
-      boolean isClean) {
-    this.messages = messages;
-    this.isMessagesListMutable = isMessagesListMutable;
-    this.parent = parent;
-    this.isClean = isClean;
-  }
-
-  public void dispose() {
-    // Null out parent so we stop sending it invalidations.
-    parent = null;
-  }
-
-  /**
-   * Ensures that the list of messages is mutable so it can be updated. If it's
-   * immutable, a copy is made.
-   */
-  private void ensureMutableMessageList() {
-    if (!isMessagesListMutable) {
-      messages = new ArrayList<MType>(messages);
-      isMessagesListMutable = true;
-    }
-  }
-
-  /**
-   * Ensures that the list of builders is not null. If it's null, the list is
-   * created and initialized to be the same size as the messages list with
-   * null entries.
-   */
-  private void ensureBuilders() {
-    if (this.builders == null) {
-      this.builders =
-          new ArrayList<SingleFieldBuilderV3<MType, BType, IType>>(
-              messages.size());
-      for (int i = 0; i < messages.size(); i++) {
-        builders.add(null);
-      }
-    }
-  }
-
-  /**
-   * Gets the count of items in the list.
-   *
-   * @return the count of items in the list.
-   */
-  public int getCount() {
-    return messages.size();
-  }
-
-  /**
-   * Gets whether the list is empty.
-   *
-   * @return whether the list is empty
-   */
-  public boolean isEmpty() {
-    return messages.isEmpty();
-  }
-
-  /**
-   * Get the message at the specified index. If the message is currently stored
-   * as a {@code Builder}, it is converted to a {@code Message} by
-   * calling {@link Message.Builder#buildPartial} on it.
-   *
-   * @param index the index of the message to get
-   * @return the message for the specified index
-   */
-  public MType getMessage(int index) {
-    return getMessage(index, false);
-  }
-
-  /**
-   * Get the message at the specified index. If the message is currently stored
-   * as a {@code Builder}, it is converted to a {@code Message} by
-   * calling {@link Message.Builder#buildPartial} on it.
-   *
-   * @param index the index of the message to get
-   * @param forBuild this is being called for build so we want to make sure
-   *     we SingleFieldBuilderV3.build to send dirty invalidations
-   * @return the message for the specified index
-   */
-  private MType getMessage(int index, boolean forBuild) {
-    if (this.builders == null) {
-      // We don't have any builders -- return the current Message.
-      // This is the case where no builder was created, so we MUST have a
-      // Message.
-      return messages.get(index);
-    }
-
-    SingleFieldBuilderV3<MType, BType, IType> builder = builders.get(index);
-    if (builder == null) {
-      // We don't have a builder -- return the current message.
-      // This is the case where no builder was created for the entry at index,
-      // so we MUST have a message.
-      return messages.get(index);
-
-    } else {
-      return forBuild ? builder.build() : builder.getMessage();
-    }
-  }
-
-  /**
-   * Gets a builder for the specified index. If no builder has been created for
-   * that index, a builder is created on demand by calling
-   * {@link Message#toBuilder}.
-   *
-   * @param index the index of the message to get
-   * @return The builder for that index
-   */
-  public BType getBuilder(int index) {
-    ensureBuilders();
-    SingleFieldBuilderV3<MType, BType, IType> builder = builders.get(index);
-    if (builder == null) {
-      MType message = messages.get(index);
-      builder = new SingleFieldBuilderV3<MType, BType, IType>(
-          message, this, isClean);
-      builders.set(index, builder);
-    }
-    return builder.getBuilder();
-  }
-
-  /**
-   * Gets the base class interface for the specified index. This may either be
-   * a builder or a message. It will return whatever is more efficient.
-   *
-   * @param index the index of the message to get
-   * @return the message or builder for the index as the base class interface
-   */
-  @SuppressWarnings("unchecked")
-  public IType getMessageOrBuilder(int index) {
-    if (this.builders == null) {
-      // We don't have any builders -- return the current Message.
-      // This is the case where no builder was created, so we MUST have a
-      // Message.
-      return (IType) messages.get(index);
-    }
-
-    SingleFieldBuilderV3<MType, BType, IType> builder = builders.get(index);
-    if (builder == null) {
-      // We don't have a builder -- return the current message.
-      // This is the case where no builder was created for the entry at index,
-      // so we MUST have a message.
-      return (IType) messages.get(index);
-
-    } else {
-      return builder.getMessageOrBuilder();
-    }
-  }
-
-  /**
-   * Sets a  message at the specified index replacing the existing item at
-   * that index.
-   *
-   * @param index the index to set.
-   * @param message the message to set
-   * @return the builder
-   */
-  public RepeatedFieldBuilderV3<MType, BType, IType> setMessage(
-      int index, MType message) {
-    checkNotNull(message);
-    ensureMutableMessageList();
-    messages.set(index, message);
-    if (builders != null) {
-      SingleFieldBuilderV3<MType, BType, IType> entry =
-          builders.set(index, null);
-      if (entry != null) {
-        entry.dispose();
-      }
-    }
-    onChanged();
-    incrementModCounts();
-    return this;
-  }
-
-  /**
-   * Appends the specified element to the end of this list.
-   *
-   * @param message the message to add
-   * @return the builder
-   */
-  public RepeatedFieldBuilderV3<MType, BType, IType> addMessage(
-      MType message) {
-    checkNotNull(message);
-    ensureMutableMessageList();
-    messages.add(message);
-    if (builders != null) {
-      builders.add(null);
-    }
-    onChanged();
-    incrementModCounts();
-    return this;
-  }
-
-  /**
-   * Inserts the specified message at the specified position in this list.
-   * Shifts the element currently at that position (if any) and any subsequent
-   * elements to the right (adds one to their indices).
-   *
-   * @param index the index at which to insert the message
-   * @param message the message to add
-   * @return the builder
-   */
-  public RepeatedFieldBuilderV3<MType, BType, IType> addMessage(
-      int index, MType message) {
-    checkNotNull(message);
-    ensureMutableMessageList();
-    messages.add(index, message);
-    if (builders != null) {
-      builders.add(index, null);
-    }
-    onChanged();
-    incrementModCounts();
-    return this;
-  }
-
-  /**
-   * Appends all of the messages in the specified collection to the end of
-   * this list, in the order that they are returned by the specified
-   * collection's iterator.
-   *
-   * @param values the messages to add
-   * @return the builder
-   */
-  public RepeatedFieldBuilderV3<MType, BType, IType> addAllMessages(
-      Iterable<? extends MType> values) {
-    for (final MType value : values) {
-      checkNotNull(value);
-    }
-
-    // If we can inspect the size, we can more efficiently add messages.
-    int size = -1;
-    if (values instanceof Collection) {
-      @SuppressWarnings("unchecked") final
-      Collection<MType> collection = (Collection<MType>) values;
-      if (collection.size() == 0) {
-        return this;
-      }
-      size = collection.size();
-    }
-    ensureMutableMessageList();
-
-    if (size >= 0 && messages instanceof ArrayList) {
-      ((ArrayList<MType>) messages)
-          .ensureCapacity(messages.size() + size);
-    }
-
-    for (MType value : values) {
-      addMessage(value);
-    }
-
-    onChanged();
-    incrementModCounts();
-    return this;
-  }
-
-  /**
-   * Appends a new builder to the end of this list and returns the builder.
-   *
-   * @param message the message to add which is the basis of the builder
-   * @return the new builder
-   */
-  public BType addBuilder(MType message) {
-    ensureMutableMessageList();
-    ensureBuilders();
-    SingleFieldBuilderV3<MType, BType, IType> builder =
-        new SingleFieldBuilderV3<MType, BType, IType>(
-            message, this, isClean);
-    messages.add(null);
-    builders.add(builder);
-    onChanged();
-    incrementModCounts();
-    return builder.getBuilder();
-  }
-
-  /**
-   * Inserts a new builder at the specified position in this list.
-   * Shifts the element currently at that position (if any) and any subsequent
-   * elements to the right (adds one to their indices).
-   *
-   * @param index the index at which to insert the builder
-   * @param message the message to add which is the basis of the builder
-   * @return the builder
-   */
-  public BType addBuilder(int index, MType message) {
-    ensureMutableMessageList();
-    ensureBuilders();
-    SingleFieldBuilderV3<MType, BType, IType> builder =
-        new SingleFieldBuilderV3<MType, BType, IType>(
-            message, this, isClean);
-    messages.add(index, null);
-    builders.add(index, builder);
-    onChanged();
-    incrementModCounts();
-    return builder.getBuilder();
-  }
-
-  /**
-   * Removes the element at the specified position in this list. Shifts any
-   * subsequent elements to the left (subtracts one from their indices).
-   * Returns the element that was removed from the list.
-   *
-   * @param index the index at which to remove the message
-   */
-  public void remove(int index) {
-    ensureMutableMessageList();
-    messages.remove(index);
-    if (builders != null) {
-      SingleFieldBuilderV3<MType, BType, IType> entry =
-          builders.remove(index);
-      if (entry != null) {
-        entry.dispose();
-      }
-    }
-    onChanged();
-    incrementModCounts();
-  }
-
-  /**
-   * Removes all of the elements from this list.
-   * The list will be empty after this call returns.
-   */
-  public void clear() {
-    messages = Collections.emptyList();
-    isMessagesListMutable = false;
-    if (builders != null) {
-      for (SingleFieldBuilderV3<MType, BType, IType> entry :
-          builders) {
-        if (entry != null) {
-          entry.dispose();
-        }
-      }
-      builders = null;
-    }
-    onChanged();
-    incrementModCounts();
-  }
-
-  /**
-   * Builds the list of messages from the builder and returns them.
-   *
-   * @return an immutable list of messages
-   */
-  public List<MType> build() {
-    // Now that build has been called, we are required to dispatch
-    // invalidations.
-    isClean = true;
-
-    if (!isMessagesListMutable && builders == null) {
-      // We still have an immutable list and we never created a builder.
-      return messages;
-    }
-
-    boolean allMessagesInSync = true;
-    if (!isMessagesListMutable) {
-      // We still have an immutable list. Let's see if any of them are out
-      // of sync with their builders.
-      for (int i = 0; i < messages.size(); i++) {
-        Message message = messages.get(i);
-        SingleFieldBuilderV3<MType, BType, IType> builder = builders.get(i);
-        if (builder != null) {
-          if (builder.build() != message) {
-            allMessagesInSync = false;
-            break;
-          }
-        }
-      }
-      if (allMessagesInSync) {
-        // Immutable list is still in sync.
-        return messages;
-      }
-    }
-
-    // Need to make sure messages is up to date
-    ensureMutableMessageList();
-    for (int i = 0; i < messages.size(); i++) {
-      messages.set(i, getMessage(i, true));
-    }
-
-    // We're going to return our list as immutable so we mark that we can
-    // no longer update it.
-    messages = Collections.unmodifiableList(messages);
-    isMessagesListMutable = false;
-    return messages;
-  }
-
-  /**
-   * Gets a view of the builder as a list of messages. The returned list is live
-   * and will reflect any changes to the underlying builder.
-   *
-   * @return the messages in the list
-   */
-  public List<MType> getMessageList() {
-    if (externalMessageList == null) {
-      externalMessageList =
-          new MessageExternalList<MType, BType, IType>(this);
-    }
-    return externalMessageList;
-  }
-
-  /**
-   * Gets a view of the builder as a list of builders. This returned list is
-   * live and will reflect any changes to the underlying builder.
-   *
-   * @return the builders in the list
-   */
-  public List<BType> getBuilderList() {
-    if (externalBuilderList == null) {
-      externalBuilderList =
-          new BuilderExternalList<MType, BType, IType>(this);
-    }
-    return externalBuilderList;
-  }
-
-  /**
-   * Gets a view of the builder as a list of MessageOrBuilders. This returned
-   * list is live and will reflect any changes to the underlying builder.
-   *
-   * @return the builders in the list
-   */
-  public List<IType> getMessageOrBuilderList() {
-    if (externalMessageOrBuilderList == null) {
-      externalMessageOrBuilderList =
-          new MessageOrBuilderExternalList<MType, BType, IType>(this);
-    }
-    return externalMessageOrBuilderList;
-  }
-
-  /**
-   * Called when a the builder or one of its nested children has changed
-   * and any parent should be notified of its invalidation.
-   */
-  private void onChanged() {
-    if (isClean && parent != null) {
-      parent.markDirty();
-
-      // Don't keep dispatching invalidations until build is called again.
-      isClean = false;
-    }
-  }
-
-  @Override
-  public void markDirty() {
-    onChanged();
-  }
-
-  /**
-   * Increments the mod counts so that an ConcurrentModificationException can
-   * be thrown if calling code tries to modify the builder while its iterating
-   * the list.
-   */
-  private void incrementModCounts() {
-    if (externalMessageList != null) {
-      externalMessageList.incrementModCount();
-    }
-    if (externalBuilderList != null) {
-      externalBuilderList.incrementModCount();
-    }
-    if (externalMessageOrBuilderList != null) {
-      externalMessageOrBuilderList.incrementModCount();
-    }
-  }
-
-  /**
-   * Provides a live view of the builder as a list of messages.
-   *
-   * @param <MType> the type of message for the field
-   * @param <BType> the type of builder for the field
-   * @param <IType> the common interface for the message and the builder
-   */
-  private static class MessageExternalList<
-      MType extends AbstractMessage,
-      BType extends AbstractMessage.Builder,
-      IType extends MessageOrBuilder>
-      extends AbstractList<MType> implements List<MType> {
-
-    RepeatedFieldBuilderV3<MType, BType, IType> builder;
-
-    MessageExternalList(
-        RepeatedFieldBuilderV3<MType, BType, IType> builder) {
-      this.builder = builder;
-    }
-
-    @Override
-    public int size() {
-      return this.builder.getCount();
-    }
-
-    @Override
-    public MType get(int index) {
-      return builder.getMessage(index);
-    }
-
-    void incrementModCount() {
-      modCount++;
-    }
-  }
-
-  /**
-   * Provides a live view of the builder as a list of builders.
-   *
-   * @param <MType> the type of message for the field
-   * @param <BType> the type of builder for the field
-   * @param <IType> the common interface for the message and the builder
-   */
-  private static class BuilderExternalList<
-      MType extends AbstractMessage,
-      BType extends AbstractMessage.Builder,
-      IType extends MessageOrBuilder>
-      extends AbstractList<BType> implements List<BType> {
-
-    RepeatedFieldBuilderV3<MType, BType, IType> builder;
-
-    BuilderExternalList(
-        RepeatedFieldBuilderV3<MType, BType, IType> builder) {
-      this.builder = builder;
-    }
-
-    @Override
-    public int size() {
-      return this.builder.getCount();
-    }
-
-    @Override
-    public BType get(int index) {
-      return builder.getBuilder(index);
-    }
-
-    void incrementModCount() {
-      modCount++;
-    }
-  }
-
-  /**
-   * Provides a live view of the builder as a list of builders.
-   *
-   * @param <MType> the type of message for the field
-   * @param <BType> the type of builder for the field
-   * @param <IType> the common interface for the message and the builder
-   */
-  private static class MessageOrBuilderExternalList<
-      MType extends AbstractMessage,
-      BType extends AbstractMessage.Builder,
-      IType extends MessageOrBuilder>
-      extends AbstractList<IType> implements List<IType> {
-
-    RepeatedFieldBuilderV3<MType, BType, IType> builder;
-
-    MessageOrBuilderExternalList(
-        RepeatedFieldBuilderV3<MType, BType, IType> builder) {
-      this.builder = builder;
-    }
-
-    @Override
-    public int size() {
-      return this.builder.getCount();
-    }
-
-    @Override
-    public IType get(int index) {
-      return builder.getMessageOrBuilder(index);
-    }
-
-    void incrementModCount() {
-      modCount++;
-    }
-  }
-}
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 6fa555d..3f3e9bd 100644
--- a/java/core/src/main/java/com/google/protobuf/RopeByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/RopeByteString.java
@@ -406,7 +406,6 @@
     right.writeTo(output);
   }
 
-
   @Override
   protected String toStringInternal(Charset charset) {
     return new String(toByteArray(), charset);
diff --git a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java
deleted file mode 100644
index 8ab0f26..0000000
--- a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java
+++ /dev/null
@@ -1,237 +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 com.google.protobuf.Internal.checkNotNull;
-
-/**
- * {@code SingleFieldBuilderV3} implements a structure that a protocol
- * message uses to hold a single field of another protocol message. It supports
- * the classical use case of setting an immutable {@link Message} as the value
- * of the field and is highly optimized around this.
- * <br>
- * It also supports the additional use case of setting a {@link Message.Builder}
- * as the field and deferring conversion of that {@code Builder}
- * to an immutable {@code Message}. In this way, it's possible to maintain
- * a tree of {@code Builder}'s that acts as a fully read/write data
- * structure.
- * <br>
- * Logically, one can think of a tree of builders as converting the entire tree
- * to messages when build is called on the root or when any method is called
- * that desires a Message instead of a Builder. In terms of the implementation,
- * the {@code SingleFieldBuilderV3} and {@code RepeatedFieldBuilderV3}
- * classes cache messages that were created so that messages only need to be
- * created when some change occurred in its builder or a builder for one of its
- * descendants.
- *
- * @param <MType> the type of message for the field
- * @param <BType> the type of builder for the field
- * @param <IType> the common interface for the message and the builder
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class SingleFieldBuilderV3
-    <MType extends AbstractMessage,
-     BType extends AbstractMessage.Builder,
-     IType extends MessageOrBuilder>
-    implements AbstractMessage.BuilderParent {
-
-  // Parent to send changes to.
-  private AbstractMessage.BuilderParent parent;
-
-  // Invariant: one of builder or message fields must be non-null.
-
-  // If set, this is the case where we are backed by a builder. In this case,
-  // message field represents a cached message for the builder (or null if
-  // there is no cached message).
-  private BType builder;
-
-  // If builder is non-null, this represents a cached message from the builder.
-  // If builder is null, this is the authoritative message for the field.
-  private MType message;
-
-  // Indicates that we've built a message and so we are now obligated
-  // to dispatch dirty invalidations. See AbstractMessage.BuilderListener.
-  private boolean isClean;
-
-  public SingleFieldBuilderV3(
-      MType message,
-      AbstractMessage.BuilderParent parent,
-      boolean isClean) {
-    this.message = checkNotNull(message);
-    this.parent = parent;
-    this.isClean = isClean;
-  }
-
-  public void dispose() {
-    // Null out parent so we stop sending it invalidations.
-    parent = null;
-  }
-
-  /**
-   * Get the message for the field. If the message is currently stored
-   * as a {@code Builder}, it is converted to a {@code Message} by
-   * calling {@link Message.Builder#buildPartial} on it. If no message has
-   * been set, returns the default instance of the message.
-   *
-   * @return the message for the field
-   */
-  @SuppressWarnings("unchecked")
-  public MType getMessage() {
-    if (message == null) {
-      // If message is null, the invariant is that we must be have a builder.
-      message = (MType) builder.buildPartial();
-    }
-    return message;
-  }
-
-  /**
-   * Builds the message and returns it.
-   *
-   * @return the message
-   */
-  public MType build() {
-    // Now that build has been called, we are required to dispatch
-    // invalidations.
-    isClean = true;
-    return getMessage();
-  }
-
-  /**
-   * Gets a builder for the field. If no builder has been created yet, a
-   * builder is created on demand by calling {@link Message#toBuilder}.
-   *
-   * @return The builder for the field
-   */
-  @SuppressWarnings("unchecked")
-  public BType getBuilder() {
-    if (builder == null) {
-      // builder.mergeFrom() on a fresh builder
-      // does not create any sub-objects with independent clean/dirty states,
-      // therefore setting the builder itself to clean without actually calling
-      // build() cannot break any invariants.
-      builder = (BType) message.newBuilderForType(this);
-      builder.mergeFrom(message); // no-op if message is the default message
-      builder.markClean();
-    }
-    return builder;
-  }
-
-  /**
-   * Gets the base class interface for the field. This may either be a builder
-   * or a message. It will return whatever is more efficient.
-   *
-   * @return the message or builder for the field as the base class interface
-   */
-  @SuppressWarnings("unchecked")
-  public IType getMessageOrBuilder() {
-    if (builder != null) {
-      return  (IType) builder;
-    } else {
-      return (IType) message;
-    }
-  }
-
-  /**
-   * Sets a  message for the field replacing any existing value.
-   *
-   * @param message the message to set
-   * @return the builder
-   */
-  public SingleFieldBuilderV3<MType, BType, IType> setMessage(
-      MType message) {
-    this.message = checkNotNull(message);
-    if (builder != null) {
-      builder.dispose();
-      builder = null;
-    }
-    onChanged();
-    return this;
-  }
-
-  /**
-   * Merges the field from another field.
-   *
-   * @param value the value to merge from
-   * @return the builder
-   */
-  public SingleFieldBuilderV3<MType, BType, IType> mergeFrom(
-      MType value) {
-    if (builder == null && message == message.getDefaultInstanceForType()) {
-      message = value;
-    } else {
-      getBuilder().mergeFrom(value);
-    }
-    onChanged();
-    return this;
-  }
-
-  /**
-   * Clears the value of the field.
-   *
-   * @return the builder
-   */
-  @SuppressWarnings("unchecked")
-  public SingleFieldBuilderV3<MType, BType, IType> clear() {
-    message = (MType) (message != null ?
-        message.getDefaultInstanceForType() :
-        builder.getDefaultInstanceForType());
-    if (builder != null) {
-      builder.dispose();
-      builder = null;
-    }
-    onChanged();
-    return this;
-  }
-
-  /**
-   * Called when a the builder or one of its nested children has changed
-   * and any parent should be notified of its invalidation.
-   */
-  private void onChanged() {
-    // If builder is null, this is the case where onChanged is being called
-    // from setMessage or clear.
-    if (builder != null) {
-      message = null;
-    }
-    if (isClean && parent != null) {
-      parent.markDirty();
-
-      // Don't keep dispatching invalidations until build is called again.
-      isClean = false;
-    }
-  }
-
-  @Override
-  public void markDirty() {
-    onChanged();
-  }
-}
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 279edc4..409fec1 100644
--- a/java/core/src/main/java/com/google/protobuf/SmallSortedMap.java
+++ b/java/core/src/main/java/com/google/protobuf/SmallSortedMap.java
@@ -197,7 +197,6 @@
         overflowEntries.entrySet();
   }
 
-
   @Override
   public int size() {
     return entryList.size() + overflowEntries.size();
@@ -357,7 +356,6 @@
     return lazyEntrySet;
   }
 
-
   /**
    * @throws UnsupportedOperationException if {@link #makeImmutable()} has
    *         has been called.
@@ -527,7 +525,6 @@
     }
   }
 
-
   /**
    * Iterator implementation that switches from the entry array to the overflow
    * entries appropriately.
@@ -540,8 +537,8 @@
 
     @Override
     public boolean hasNext() {
-      return (pos + 1) < entryList.size()
-          || (!overflowEntries.isEmpty() && getOverflowIterator().hasNext());
+      return (pos + 1) < entryList.size() ||
+          getOverflowIterator().hasNext();
     }
 
     @Override
@@ -620,43 +617,43 @@
       return (Iterable<T>) ITERABLE;
     }
   }
-
+  
   @Override
   public boolean equals(Object o) {
     if (this == o) {
       return true;
     }
-
+    
     if (!(o instanceof SmallSortedMap)) {
       return super.equals(o);
     }
-
+    
     SmallSortedMap<?, ?> other = (SmallSortedMap<?, ?>) o;
     final int size = size();
     if (size != other.size()) {
       return false;
     }
-
+    
     // Best effort try to avoid allocating an entry set.
     final int numArrayEntries = getNumArrayEntries();
     if (numArrayEntries != other.getNumArrayEntries()) {
       return entrySet().equals(other.entrySet());
     }
-
+    
     for (int i = 0; i < numArrayEntries; i++) {
       if (!getArrayEntryAt(i).equals(other.getArrayEntryAt(i))) {
         return false;
       }
     }
-
+    
     if (numArrayEntries != size) {
       return overflowEntries.equals(other.overflowEntries);
     }
-
-
+    
+    
     return true;
   }
-
+  
   @Override
   public int hashCode() {
     int h = 0;
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 ab9acf2..c1c328f 100644
--- a/java/core/src/main/java/com/google/protobuf/TextFormat.java
+++ b/java/core/src/main/java/com/google/protobuf/TextFormat.java
@@ -34,6 +34,7 @@
 import com.google.protobuf.Descriptors.EnumDescriptor;
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
+
 import java.io.IOException;
 import java.math.BigInteger;
 import java.nio.CharBuffer;
@@ -55,7 +56,14 @@
 public final class TextFormat {
   private TextFormat() {}
 
-  private static final Logger logger = Logger.getLogger(TextFormat.class.getName());
+  private static final Logger logger =
+      Logger.getLogger(TextFormat.class.getName());
+
+  private static final Printer DEFAULT_PRINTER = new Printer();
+  private static final Printer SINGLE_LINE_PRINTER =
+      (new Printer()).setSingleLineMode(true);
+  private static final Printer UNICODE_PRINTER =
+      (new Printer()).setEscapeNonAscii(false);
 
   /**
    * Outputs a textual representation of the Protocol Message supplied into
@@ -65,14 +73,14 @@
   public static void print(
       final MessageOrBuilder message, final Appendable output)
       throws IOException {
-    Printer.DEFAULT.print(message, multiLineOutput(output));
+    DEFAULT_PRINTER.print(message, new TextGenerator(output));
   }
 
   /** Outputs a textual representation of {@code fields} to {@code output}. */
   public static void print(final UnknownFieldSet fields,
                            final Appendable output)
                            throws IOException {
-    Printer.DEFAULT.printUnknownFields(fields, multiLineOutput(output));
+    DEFAULT_PRINTER.printUnknownFields(fields, new TextGenerator(output));
   }
 
   /**
@@ -82,7 +90,7 @@
   public static void printUnicode(
       final MessageOrBuilder message, final Appendable output)
       throws IOException {
-    Printer.UNICODE.print(message, multiLineOutput(output));
+    UNICODE_PRINTER.print(message, new TextGenerator(output));
   }
 
   /**
@@ -92,7 +100,7 @@
   public static void printUnicode(final UnknownFieldSet fields,
                                   final Appendable output)
                                   throws IOException {
-    Printer.UNICODE.printUnknownFields(fields, multiLineOutput(output));
+    UNICODE_PRINTER.printUnknownFields(fields, new TextGenerator(output));
   }
 
   /**
@@ -101,9 +109,10 @@
    */
   public static String shortDebugString(final MessageOrBuilder message) {
     try {
-      final StringBuilder text = new StringBuilder();
-      Printer.DEFAULT.print(message, singleLineOutput(text));
-      return text.toString();
+      final StringBuilder sb = new StringBuilder();
+      SINGLE_LINE_PRINTER.print(message, new TextGenerator(sb));
+      // Single line mode currently might have an extra space at the end.
+      return sb.toString().trim();
     } catch (IOException e) {
       throw new IllegalStateException(e);
     }
@@ -116,11 +125,11 @@
   public static String shortDebugString(final FieldDescriptor field,
                                         final Object value) {
     try {
-      final StringBuilder text = new StringBuilder();
-      Printer.DEFAULT.printField(field, value, singleLineOutput(text));
-      return text.toString();
+      final StringBuilder sb = new StringBuilder();
+      SINGLE_LINE_PRINTER.printField(field, value, new TextGenerator(sb));
+      return sb.toString().trim();
     } catch (IOException e) {
-      throw new IllegalStateException(e);
+        throw new IllegalStateException(e);
     }
   }
 
@@ -130,9 +139,10 @@
    */
   public static String shortDebugString(final UnknownFieldSet fields) {
     try {
-      final StringBuilder text = new StringBuilder();
-      Printer.DEFAULT.printUnknownFields(fields, singleLineOutput(text));
-      return text.toString();
+      final StringBuilder sb = new StringBuilder();
+      SINGLE_LINE_PRINTER.printUnknownFields(fields, new TextGenerator(sb));
+      // Single line mode currently might have an extra space at the end.
+      return sb.toString().trim();
     } catch (IOException e) {
       throw new IllegalStateException(e);
     }
@@ -173,7 +183,7 @@
   public static String printToUnicodeString(final MessageOrBuilder message) {
     try {
       final StringBuilder text = new StringBuilder();
-      Printer.UNICODE.print(message, multiLineOutput(text));
+      UNICODE_PRINTER.print(message, new TextGenerator(text));
       return text.toString();
     } catch (IOException e) {
       throw new IllegalStateException(e);
@@ -187,7 +197,7 @@
   public static String printToUnicodeString(final UnknownFieldSet fields) {
     try {
       final StringBuilder text = new StringBuilder();
-      Printer.UNICODE.printUnknownFields(fields, multiLineOutput(text));
+      UNICODE_PRINTER.printUnknownFields(fields, new TextGenerator(text));
       return text.toString();
     } catch (IOException e) {
       throw new IllegalStateException(e);
@@ -198,7 +208,7 @@
                                 final Object value,
                                 final Appendable output)
                                 throws IOException {
-    Printer.DEFAULT.printField(field, value, multiLineOutput(output));
+    DEFAULT_PRINTER.printField(field, value, new TextGenerator(output));
   }
 
   public static String printFieldToString(final FieldDescriptor field,
@@ -213,23 +223,6 @@
   }
 
   /**
-   * Outputs a unicode textual representation of the value of given field value.
-   *
-   * <p>Same as {@code printFieldValue()}, except that non-ASCII characters in string type fields
-   * are not escaped in backslash+octals.
-   *
-   * @param field the descriptor of the field
-   * @param value the value of the field
-   * @param output the output to which to append the formatted value
-   * @throws ClassCastException if the value is not appropriate for the given field descriptor
-   * @throws IOException if there is an exception writing to the output
-   */
-  public static void printUnicodeFieldValue(
-      final FieldDescriptor field, final Object value, final Appendable output) throws IOException {
-    Printer.UNICODE.printFieldValue(field, value, multiLineOutput(output));
-  }
-
-  /**
    * Outputs a textual representation of the value of given field value.
    *
    * @param field the descriptor of the field
@@ -243,7 +236,7 @@
                                      final Object value,
                                      final Appendable output)
                                      throws IOException {
-    Printer.DEFAULT.printFieldValue(field, value, multiLineOutput(output));
+    DEFAULT_PRINTER.printFieldValue(field, value, new TextGenerator(output));
   }
 
   /**
@@ -260,7 +253,7 @@
                                             final Object value,
                                             final Appendable output)
                                             throws IOException {
-    printUnknownFieldValue(tag, value, multiLineOutput(output));
+    printUnknownFieldValue(tag, value, new TextGenerator(output));
   }
 
   private static void printUnknownFieldValue(final int tag,
@@ -279,24 +272,12 @@
         generator.print(String.format((Locale) null, "0x%016x", (Long) value));
         break;
       case WireFormat.WIRETYPE_LENGTH_DELIMITED:
-        try {
-          // Try to parse and print the field as an embedded message
-          UnknownFieldSet message = UnknownFieldSet.parseFrom((ByteString) value);
-          generator.print("{");
-          generator.eol();
-          generator.indent();
-          Printer.DEFAULT.printUnknownFields(message, generator);
-          generator.outdent();
-          generator.print("}");
-        } catch (InvalidProtocolBufferException e) {
-          // If not parseable as a message, print as a String
-          generator.print("\"");
-          generator.print(escapeBytes((ByteString) value));
-          generator.print("\"");
-        }
+        generator.print("\"");
+        generator.print(escapeBytes((ByteString) value));
+        generator.print("\"");
         break;
       case WireFormat.WIRETYPE_START_GROUP:
-        Printer.DEFAULT.printUnknownFields((UnknownFieldSet) value, generator);
+        DEFAULT_PRINTER.printUnknownFields((UnknownFieldSet) value, generator);
         break;
       default:
         throw new IllegalArgumentException("Bad tag: " + tag);
@@ -305,16 +286,24 @@
 
   /** Helper class for converting protobufs to text. */
   private static final class Printer {
-    // Printer instance which escapes non-ASCII characters.
-    static final Printer DEFAULT = new Printer(true);
-    // Printer instance which emits Unicode (it still escapes newlines and quotes in strings).
-    static final Printer UNICODE = new Printer(false);
+    /** Whether to omit newlines from the output. */
+    boolean singleLineMode = false;
 
     /** Whether to escape non ASCII characters with backslash and octal. */
-    private final boolean escapeNonAscii;
+    boolean escapeNonAscii = true;
 
-    private Printer(boolean escapeNonAscii) {
+    private Printer() {}
+
+    /** Setter of singleLineMode */
+    private Printer setSingleLineMode(boolean singleLineMode) {
+      this.singleLineMode = singleLineMode;
+      return this;
+    }
+
+    /** Setter of escapeNonAscii */
+    private Printer setEscapeNonAscii(boolean escapeNonAscii) {
       this.escapeNonAscii = escapeNonAscii;
+      return this;
     }
 
     private void print(
@@ -366,9 +355,12 @@
       }
 
       if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-        generator.print(" {");
-        generator.eol();
-        generator.indent();
+        if (singleLineMode) {
+          generator.print(" { ");
+        } else {
+          generator.print(" {\n");
+          generator.indent();
+        }
       } else {
         generator.print(": ");
       }
@@ -376,10 +368,19 @@
       printFieldValue(field, value, generator);
 
       if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
-        generator.outdent();
-        generator.print("}");
+        if (singleLineMode) {
+          generator.print("} ");
+        } else {
+          generator.outdent();
+          generator.print("}\n");
+        }
+      } else {
+        if (singleLineMode) {
+          generator.print(" ");
+        } else {
+          generator.print("\n");
+        }
       }
-      generator.eol();
     }
 
     private void printFieldValue(final FieldDescriptor field,
@@ -468,13 +469,19 @@
             field.getLengthDelimitedList(), generator);
         for (final UnknownFieldSet value : field.getGroupList()) {
           generator.print(entry.getKey().toString());
-          generator.print(" {");
-          generator.eol();
-          generator.indent();
+          if (singleLineMode) {
+            generator.print(" { ");
+          } else {
+            generator.print(" {\n");
+            generator.indent();
+          }
           printUnknownFields(value, generator);
-          generator.outdent();
-          generator.print("}");
-          generator.eol();
+          if (singleLineMode) {
+            generator.print("} ");
+          } else {
+            generator.outdent();
+            generator.print("}\n");
+          }
         }
       }
     }
@@ -488,7 +495,7 @@
         generator.print(String.valueOf(number));
         generator.print(": ");
         printUnknownFieldValue(wireType, value, generator);
-        generator.eol();
+        generator.print(singleLineMode ? " " : "\n");
       }
     }
   }
@@ -514,29 +521,16 @@
     }
   }
 
-  private static TextGenerator multiLineOutput(Appendable output) {
-    return new TextGenerator(output, false);
-  }
-
-  private static TextGenerator singleLineOutput(Appendable output) {
-    return new TextGenerator(output, true);
-  }
-
- /**
+  /**
    * An inner class for writing text to the output stream.
    */
   private static final class TextGenerator {
     private final Appendable output;
     private final StringBuilder indent = new StringBuilder();
-    private final boolean singleLineMode;
-    // While technically we are "at the start of a line" at the very beginning of the output, all
-    // we would do in response to this is emit the (zero length) indentation, so it has no effect.
-    // Setting it false here does however suppress an unwanted leading space in single-line mode.
-    private boolean atStartOfLine = false;
+    private boolean atStartOfLine = true;
 
-    private TextGenerator(final Appendable output, boolean singleLineMode) {
+    private TextGenerator(final Appendable output) {
       this.output = output;
-      this.singleLineMode = singleLineMode;
     }
 
     /**
@@ -558,31 +552,35 @@
         throw new IllegalArgumentException(
             " Outdent() without matching Indent().");
       }
-      indent.setLength(length - 2);
+      indent.delete(length - 2, length);
     }
 
     /**
-     * Print text to the output stream. Bare newlines are never expected to be passed to this
-     * method; to indicate the end of a line, call "eol()".
+     * Print text to the output stream.
      */
     public void print(final CharSequence text) throws IOException {
-      if (atStartOfLine) {
-        atStartOfLine = false;
-        output.append(singleLineMode ? " " : indent);
+      final int size = text.length();
+      int pos = 0;
+
+      for (int i = 0; i < size; i++) {
+        if (text.charAt(i) == '\n') {
+          write(text.subSequence(pos, i + 1));
+          pos = i + 1;
+          atStartOfLine = true;
+        }
       }
-      output.append(text);
+      write(text.subSequence(pos, size));
     }
 
-    /**
-     * Signifies reaching the "end of the current line" in the output. In single-line mode, this
-     * does not result in a newline being emitted, but ensures that a separating space is written
-     * before the next output.
-     */
-    public void eol() throws IOException {
-      if (!singleLineMode) {
-        output.append("\n");
+    private void write(final CharSequence data) throws IOException {
+      if (data.length() == 0) {
+        return;
       }
-      atStartOfLine = true;
+      if (atStartOfLine) {
+        atStartOfLine = false;
+        output.append(indent);
+      }
+      output.append(data);
     }
   }
 
@@ -663,14 +661,6 @@
       nextToken();
     }
 
-    int getPreviousLine() {
-      return previousLine;
-    }
-
-    int getPreviousColumn() {
-      return previousColumn;
-    }
-
     int getLine() {
       return line;
     }
@@ -1384,28 +1374,6 @@
       return text;
     }
 
-    // Check both unknown fields and unknown extensions and log warming messages
-    // or throw exceptions according to the flag.
-    private void checkUnknownFields(final List<String> unknownFields)
-        throws ParseException {
-      if (unknownFields.isEmpty()) {
-        return;
-      }
-
-      StringBuilder msg = new StringBuilder("Input contains unknown fields and/or extensions:");
-      for (String field : unknownFields) {
-        msg.append('\n').append(field);
-      }
-
-      if (allowUnknownFields) {
-          logger.warning(msg.toString());
-      } else {
-        String[] lineColumn = unknownFields.get(0).split(":");
-        throw new ParseException(Integer.valueOf(lineColumn[0]),
-            Integer.valueOf(lineColumn[1]), msg.toString());
-      }
-    }
-
     /**
      * Parse a text-format message from {@code input} and merge the contents
      * into {@code builder}.  Extensions will be recognized if they are
@@ -1419,13 +1387,9 @@
       MessageReflection.BuilderAdapter target =
           new MessageReflection.BuilderAdapter(builder);
 
-      List<String> unknownFields = new ArrayList<String>();
-
       while (!tokenizer.atEnd()) {
-        mergeField(tokenizer, extensionRegistry, target, unknownFields);
+        mergeField(tokenizer, extensionRegistry, target);
       }
-
-      checkUnknownFields(unknownFields);
     }
 
 
@@ -1435,22 +1399,19 @@
      */
     private void mergeField(final Tokenizer tokenizer,
                             final ExtensionRegistry extensionRegistry,
-                            final MessageReflection.MergeTarget target,
-                            List<String> unknownFields)
+                            final MessageReflection.MergeTarget target)
                             throws ParseException {
-      mergeField(tokenizer, extensionRegistry, target, parseInfoTreeBuilder,
-                 unknownFields);
+      mergeField(tokenizer, extensionRegistry, target, parseInfoTreeBuilder);
     }
 
     /**
      * Parse a single field from {@code tokenizer} and merge it into
-     * {@code target}.
+     * {@code builder}.
      */
     private void mergeField(final Tokenizer tokenizer,
                             final ExtensionRegistry extensionRegistry,
                             final MessageReflection.MergeTarget target,
-                            TextFormatParseInfoTree.Builder parseTreeBuilder,
-                            List<String> unknownFields)
+                            TextFormatParseInfoTree.Builder parseTreeBuilder)
                             throws ParseException {
       FieldDescriptor field = null;
       int startLine = tokenizer.getLine();
@@ -1471,15 +1432,13 @@
             extensionRegistry, name.toString());
 
         if (extension == null) {
-          unknownFields.add(
-              (tokenizer.getPreviousLine() + 1)
-                  + ":"
-                  + (tokenizer.getPreviousColumn() + 1)
-                  + ":\t"
-                  + type.getFullName()
-                  + ".["
-                  + name
-                  + "]");
+          if (!allowUnknownFields) {
+            throw tokenizer.parseExceptionPreviousToken(
+              "Extension \"" + name + "\" not found in the ExtensionRegistry.");
+          } else {
+            logger.warning(
+              "Extension \"" + name + "\" not found in the ExtensionRegistry.");
+          }
         } else {
           if (extension.descriptor.getContainingType() != type) {
             throw tokenizer.parseExceptionPreviousToken(
@@ -1514,14 +1473,16 @@
         }
 
         if (field == null) {
-          unknownFields.add(
-              (tokenizer.getPreviousLine() + 1)
-                  + ":"
-                  + (tokenizer.getPreviousColumn() + 1)
-                  + ":\t"
-                  + type.getFullName()
-                  + "."
-                  + name);
+          if (!allowUnknownFields) {
+            throw tokenizer.unknownFieldParseExceptionPreviousToken(
+              name,
+              "Message type \"" + type.getFullName()
+              + "\" has no field named \"" + name + "\".");
+          } else {
+            logger.warning(
+              "Message type \"" + type.getFullName()
+              + "\" has no field named \"" + name + "\".");
+          }
         }
       }
 
@@ -1550,15 +1511,15 @@
           TextFormatParseInfoTree.Builder childParseTreeBuilder =
               parseTreeBuilder.getBuilderForSubMessageField(field);
           consumeFieldValues(tokenizer, extensionRegistry, target, field, extension,
-              childParseTreeBuilder, unknownFields);
+              childParseTreeBuilder);
         } else {
           consumeFieldValues(tokenizer, extensionRegistry, target, field, extension,
-              parseTreeBuilder, unknownFields);
+              parseTreeBuilder);
         }
       } else {
         tokenizer.consume(":");  // required
-        consumeFieldValues(tokenizer, extensionRegistry, target, field,
-            extension, parseTreeBuilder, unknownFields);
+        consumeFieldValues(
+            tokenizer, extensionRegistry, target, field, extension, parseTreeBuilder);
       }
 
       if (parseTreeBuilder != null) {
@@ -1583,32 +1544,23 @@
         final MessageReflection.MergeTarget target,
         final FieldDescriptor field,
         final ExtensionRegistry.ExtensionInfo extension,
-        final TextFormatParseInfoTree.Builder parseTreeBuilder,
-        List<String> unknownFields)
+        final TextFormatParseInfoTree.Builder parseTreeBuilder)
         throws ParseException {
       // Support specifying repeated field values as a comma-separated list.
       // Ex."foo: [1, 2, 3]"
       if (field.isRepeated() && tokenizer.tryConsume("[")) {
-        if (!tokenizer.tryConsume("]")) {  // Allow "foo: []" to be treated as empty.
-          while (true) {
-            consumeFieldValue(
-                tokenizer,
-                extensionRegistry,
-                target,
-                field,
-                extension,
-                parseTreeBuilder,
-                unknownFields);
-            if (tokenizer.tryConsume("]")) {
-              // End of list.
-              break;
-            }
-            tokenizer.consume(",");
+        while (true) {
+          consumeFieldValue(tokenizer, extensionRegistry, target, field, extension,
+              parseTreeBuilder);
+          if (tokenizer.tryConsume("]")) {
+            // End of list.
+            break;
           }
+          tokenizer.consume(",");
         }
       } else {
-        consumeFieldValue(tokenizer, extensionRegistry, target, field,
-            extension, parseTreeBuilder, unknownFields);
+        consumeFieldValue(
+            tokenizer, extensionRegistry, target, field, extension, parseTreeBuilder);
       }
     }
 
@@ -1622,8 +1574,7 @@
         final MessageReflection.MergeTarget target,
         final FieldDescriptor field,
         final ExtensionRegistry.ExtensionInfo extension,
-        final TextFormatParseInfoTree.Builder parseTreeBuilder,
-        List<String> unknownFields)
+        final TextFormatParseInfoTree.Builder parseTreeBuilder)
         throws ParseException {
       Object value = null;
 
@@ -1645,8 +1596,7 @@
             throw tokenizer.parseException(
               "Expected \"" + endToken + "\".");
           }
-          mergeField(tokenizer, extensionRegistry, subField, parseTreeBuilder,
-              unknownFields);
+          mergeField(tokenizer, extensionRegistry, subField, parseTreeBuilder);
         }
 
         value = subField.finish();
@@ -1725,8 +1675,6 @@
       }
 
       if (field.isRepeated()) {
-        // TODO(b/29122459): If field.isMapField() and FORBID_SINGULAR_OVERWRITES mode,
-        //     check for duplicate map keys here.
         target.addRepeatedField(field, value);
       } else if ((singularOverwritePolicy
               == SingularOverwritePolicy.FORBID_SINGULAR_OVERWRITES)
diff --git a/java/core/src/main/java/com/google/protobuf/TextFormatParseInfoTree.java b/java/core/src/main/java/com/google/protobuf/TextFormatParseInfoTree.java
index 0127ce9..2ecf912 100644
--- a/java/core/src/main/java/com/google/protobuf/TextFormatParseInfoTree.java
+++ b/java/core/src/main/java/com/google/protobuf/TextFormatParseInfoTree.java
@@ -45,8 +45,7 @@
  *
  * <p>The locations of primary fields values are retrieved by {@code getLocation} or
  * {@code getLocations}.  The locations of sub message values are within nested
- * {@code TextFormatParseInfoTree}s and are retrieve by {@code getNestedTree} or
- * {@code getNestedTrees}.
+ * {@code TextFormatParseInfoTree}s and are retrieve by {@getNestedTree} or {code @getNestedTrees}.
  *
  * <p>The {@code TextFormatParseInfoTree} is created by a Builder.
  */
@@ -198,7 +197,7 @@
      * Set for a sub message.
      *
      * <p>A new builder is created for a sub message. The builder that is returned is a new builder.
-     * The return is <em>not</em> the invoked {@code builder.getBuilderForSubMessageField}.
+     * The return is <emph>not</emph> the invoked {@code builder.getBuilderForSubMessageField}.
      *
      * @param fieldDescriptor the field whose value is the submessage
      * @return a new Builder for the sub message
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 37d6463..c906420 100644
--- a/java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java
@@ -31,6 +31,7 @@
 package com.google.protobuf;
 
 import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -38,7 +39,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.ListIterator;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -57,10 +57,7 @@
  * @author kenton@google.com Kenton Varda
  */
 public final class UnknownFieldSet implements MessageLite {
-
-  private UnknownFieldSet() {
-    fields = null;
-  }
+  private UnknownFieldSet() {}
 
   /** Create a new {@link Builder}. */
   public static Builder newBuilder() {
@@ -84,18 +81,16 @@
     return defaultInstance;
   }
   private static final UnknownFieldSet defaultInstance =
-    new UnknownFieldSet(Collections.<Integer, Field>emptyMap(),
-        Collections.<Integer, Field>emptyMap());
+    new UnknownFieldSet(Collections.<Integer, Field>emptyMap());
 
   /**
    * Construct an {@code UnknownFieldSet} around the given map.  The map is
    * expected to be immutable.
    */
-  UnknownFieldSet(final Map<Integer, Field> fields,
-      final Map<Integer, Field> fieldsDescending) {
+  private UnknownFieldSet(final Map<Integer, Field> fields) {
     this.fields = fields;
   }
-  private final Map<Integer, Field> fields;
+  private Map<Integer, Field> fields;
 
 
   @Override
@@ -135,8 +130,7 @@
   @Override
   public void writeTo(final CodedOutputStream output) throws IOException {
     for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
-      Field field = entry.getValue();
-      field.writeTo(entry.getKey(), output);
+      entry.getValue().writeTo(entry.getKey(), output);
     }
   }
 
@@ -228,8 +222,10 @@
     }
   }
 
-
-  /** Get the number of bytes required to encode this set using {@code MessageSet} wire format. */
+  /**
+   * Get the number of bytes required to encode this set using
+   * {@code MessageSet} wire format.
+   */
   public int getSerializedSizeAsMessageSet() {
     int result = 0;
     for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
@@ -345,13 +341,12 @@
      */
     @Override
     public UnknownFieldSet build() {
-      getFieldBuilder(0); // Force lastField to be built.
+      getFieldBuilder(0);  // Force lastField to be built.
       final UnknownFieldSet result;
       if (fields.isEmpty()) {
         result = getDefaultInstance();
       } else {
-        Map<Integer, Field> descendingFields = null;
-        result = new UnknownFieldSet(Collections.unmodifiableMap(fields), descendingFields);
+        result = new UnknownFieldSet(Collections.unmodifiableMap(fields));
       }
       fields = null;
       return result;
@@ -366,9 +361,8 @@
     @Override
     public Builder clone() {
       getFieldBuilder(0);  // Force lastField to be built.
-      Map<Integer, Field> descendingFields = null;
       return UnknownFieldSet.newBuilder().mergeFrom(
-          new UnknownFieldSet(fields, descendingFields));
+          new UnknownFieldSet(fields));
     }
 
     @Override
@@ -845,10 +839,9 @@
       }
     }
 
-
     /**
-     * Get the number of bytes required to encode this field, including field number, using {@code
-     * MessageSet} wire format.
+     * Get the number of bytes required to encode this field, including field
+     * number, using {@code MessageSet} wire format.
      */
     public int getSerializedSizeAsMessageSetExtension(final int fieldNumber) {
       int result = 0;
@@ -1027,7 +1020,7 @@
       } catch (InvalidProtocolBufferException e) {
         throw e.setUnfinishedMessage(builder.buildPartial());
       } catch (IOException e) {
-        throw new InvalidProtocolBufferException(e)
+        throw new InvalidProtocolBufferException(e.getMessage())
             .setUnfinishedMessage(builder.buildPartial());
       }
       return builder.buildPartial();
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 2a614c8..9500f905 100644
--- a/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java
@@ -81,7 +81,7 @@
     System.arraycopy(second.objects, 0, objects, first.count, second.count);
     return new UnknownFieldSetLite(count, tags, objects, true /* isMutable */);
   }
-
+  
   /**
    * The number of elements in the set.
    */
@@ -176,42 +176,6 @@
   }
 
   /**
-   * Serializes the set and writes it to {@code output} using {@code MessageSet} wire format.
-   *
-   * <p>For use by generated code only.
-   */
-  public void writeAsMessageSetTo(CodedOutputStream output) throws IOException {
-    for (int i = 0; i < count; i++) {
-      int fieldNumber = WireFormat.getTagFieldNumber(tags[i]);
-      output.writeRawMessageSetExtension(fieldNumber, (ByteString) objects[i]);
-    }
-  }
-
-
-  /**
-   * Get the number of bytes required to encode this field, including field number, using {@code
-   * MessageSet} wire format.
-   */
-  public int getSerializedSizeAsMessageSet() {
-    int size = memoizedSerializedSize;
-    if (size != -1) {
-      return size;
-    }
-    
-    size = 0;
-    for (int i = 0; i < count; i++) {
-      int tag = tags[i];
-      int fieldNumber = WireFormat.getTagFieldNumber(tag);
-      size += CodedOutputStream.computeRawMessageSetExtensionSize(
-          fieldNumber, (ByteString) objects[i]);
-    }
-    
-    memoizedSerializedSize = size;
-    
-    return size;
-  }
-
-  /**
    * Get the number of bytes required to encode this set.
    *
    * <p>For use by generated code only.
@@ -252,24 +216,6 @@
     
     return size;
   }
-  
-  private static boolean equals(int[] tags1, int[] tags2, int count) {
-    for (int i = 0; i < count; ++i) {
-      if (tags1[i] != tags2[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  private static boolean equals(Object[] objects1, Object[] objects2, int count) {
-    for (int i = 0; i < count; ++i) {
-      if (!objects1[i].equals(objects2[i])) {
-        return false;
-      }
-    }
-    return true;
-  }
 
   @Override
   public boolean equals(Object obj) {
@@ -287,8 +233,9 @@
     
     UnknownFieldSetLite other = (UnknownFieldSetLite) obj;    
     if (count != other.count
-        || !equals(tags, other.tags, count)
-        || !equals(objects, other.objects, count)) {
+        // TODO(dweis): Only have to compare up to count but at worst 2x worse than we need to do.
+        || !Arrays.equals(tags, other.tags)
+        || !Arrays.deepEquals(objects, other.objects)) {
       return false;
     }
 
@@ -321,9 +268,7 @@
     }
   }
 
-  // Package private for unsafe experimental runtime.
-  void storeField(int tag, Object value) {
-    checkMutable();
+  private void storeField(int tag, Object value) {
     ensureCapacity();
     
     tags[count] = tag;
diff --git a/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java b/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
index 878c775..0fbf4d4 100644
--- a/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
+++ b/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
@@ -42,23 +42,6 @@
  * guaranteed that the buffer backing the {@link ByteString} will never change! Mutation of a
  * {@link ByteString} can lead to unexpected and undesirable consequences in your application,
  * and will likely be difficult to debug. Proceed with caution!
- *
- * <p>This can have a number of significant side affects that have
- * spooky-action-at-a-distance-like behavior. In particular, if the bytes value changes out from
- * under a Protocol Buffer:
- * <ul>
- * <li>serialization may throw
- * <li>serialization may succeed but the wrong bytes may be written out
- * <li>messages are no longer threadsafe
- * <li>hashCode may be incorrect
- *   <ul>
- *   <li>can result in a permanent memory leak when used as a key in a long-lived HashMap
- *   <li> the semantics of many programs may be violated if this is the case
- *   </ul>
- * </ul>
- * Each of these issues will occur in parts of the code base that are entirely distinct from the
- * parts of the code base modifying the buffer. In fact, both parts of the code base may be correct
- * - it is the bridging with the unsafe operations that was in error!
  */
 @ExperimentalApi
 public final class UnsafeByteOperations {
@@ -67,34 +50,16 @@
   /**
    * An unsafe operation that returns a {@link ByteString} that is backed by the provided buffer.
    *
-   * @param buffer the buffer to be wrapped
-   * @return a {@link ByteString} backed by the provided buffer
-   */
-  public static ByteString unsafeWrap(byte[] buffer) {
-    return ByteString.wrap(buffer);
-  }
-
-  /**
-   * An unsafe operation that returns a {@link ByteString} that is backed by a subregion of the
-   * provided buffer.
-   *
-   * @param buffer the buffer to be wrapped
-   * @param offset the offset of the wrapped region
-   * @param length the number of bytes of the wrapped region
-   * @return a {@link ByteString} backed by the provided buffer
-   */
-  public static ByteString unsafeWrap(byte[] buffer, int offset, int length) {
-    return ByteString.wrap(buffer, offset, length);
-  }
-
-  /**
-   * An unsafe operation that returns a {@link ByteString} that is backed by the provided buffer.
-   *
    * @param buffer the Java NIO buffer to be wrapped
    * @return a {@link ByteString} backed by the provided buffer
    */
   public static ByteString unsafeWrap(ByteBuffer buffer) {
-    return ByteString.wrap(buffer);
+    if (buffer.hasArray()) {
+      final int offset = buffer.arrayOffset();
+      return ByteString.wrap(buffer.array(), offset + buffer.position(), buffer.remaining());
+    } else {
+      return new NioByteString(buffer);
+    }
   }
 
   /**
@@ -116,5 +81,4 @@
   public static void unsafeWriteTo(ByteString bytes, ByteOutput output) throws IOException {
     bytes.writeTo(output);
   }
-
 }
diff --git a/java/core/src/main/java/com/google/protobuf/UnsafeUtil.java b/java/core/src/main/java/com/google/protobuf/UnsafeUtil.java
deleted file mode 100644
index 88315cb..0000000
--- a/java/core/src/main/java/com/google/protobuf/UnsafeUtil.java
+++ /dev/null
@@ -1,576 +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 java.lang.reflect.Field;
-import java.nio.Buffer;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.security.AccessController;
-import java.security.PrivilegedExceptionAction;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Utility class for working with unsafe operations. */
-final class UnsafeUtil {
-  private static final Logger logger = Logger.getLogger(UnsafeUtil.class.getName());
-  private static final sun.misc.Unsafe UNSAFE = getUnsafe();
-  private static final MemoryAccessor MEMORY_ACCESSOR = getMemoryAccessor();
-  private static final boolean HAS_UNSAFE_BYTEBUFFER_OPERATIONS =
-      supportsUnsafeByteBufferOperations();
-  private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS = supportsUnsafeArrayOperations();
-
-  private static final long BYTE_ARRAY_BASE_OFFSET = arrayBaseOffset(byte[].class);
-  // Micro-optimization: we can assume a scale of 1 and skip the multiply
-  // private static final long BYTE_ARRAY_INDEX_SCALE = 1;
-
-  private static final long BOOLEAN_ARRAY_BASE_OFFSET = arrayBaseOffset(boolean[].class);
-  private static final long BOOLEAN_ARRAY_INDEX_SCALE = arrayIndexScale(boolean[].class);
-
-  private static final long INT_ARRAY_BASE_OFFSET = arrayBaseOffset(int[].class);
-  private static final long INT_ARRAY_INDEX_SCALE = arrayIndexScale(int[].class);
-
-  private static final long LONG_ARRAY_BASE_OFFSET = arrayBaseOffset(long[].class);
-  private static final long LONG_ARRAY_INDEX_SCALE = arrayIndexScale(long[].class);
-
-  private static final long FLOAT_ARRAY_BASE_OFFSET = arrayBaseOffset(float[].class);
-  private static final long FLOAT_ARRAY_INDEX_SCALE = arrayIndexScale(float[].class);
-
-  private static final long DOUBLE_ARRAY_BASE_OFFSET = arrayBaseOffset(double[].class);
-  private static final long DOUBLE_ARRAY_INDEX_SCALE = arrayIndexScale(double[].class);
-
-  private static final long OBJECT_ARRAY_BASE_OFFSET = arrayBaseOffset(Object[].class);
-  private static final long OBJECT_ARRAY_INDEX_SCALE = arrayIndexScale(Object[].class);
-
-  private static final long BUFFER_ADDRESS_OFFSET = fieldOffset(bufferAddressField());
-
-  private UnsafeUtil() {}
-
-  static boolean hasUnsafeArrayOperations() {
-    return HAS_UNSAFE_ARRAY_OPERATIONS;
-  }
-
-  static boolean hasUnsafeByteBufferOperations() {
-    return HAS_UNSAFE_BYTEBUFFER_OPERATIONS;
-  }
-
-  static long objectFieldOffset(Field field) {
-    return MEMORY_ACCESSOR.objectFieldOffset(field);
-  }
-
-  private static int arrayBaseOffset(Class<?> clazz) {
-    return HAS_UNSAFE_ARRAY_OPERATIONS ? MEMORY_ACCESSOR.arrayBaseOffset(clazz) : -1;
-  }
-
-  private static int arrayIndexScale(Class<?> clazz) {
-    return HAS_UNSAFE_ARRAY_OPERATIONS ? MEMORY_ACCESSOR.arrayIndexScale(clazz) : -1;
-  }
-
-  static byte getByte(Object target, long offset) {
-    return MEMORY_ACCESSOR.getByte(target, offset);
-  }
-
-  static void putByte(Object target, long offset, byte value) {
-    MEMORY_ACCESSOR.putByte(target, offset, value);
-  }
-
-  static int getInt(Object target, long offset) {
-    return MEMORY_ACCESSOR.getInt(target, offset);
-  }
-
-  static void putInt(Object target, long offset, int value) {
-    MEMORY_ACCESSOR.putInt(target, offset, value);
-  }
-
-  static long getLong(Object target, long offset) {
-    return MEMORY_ACCESSOR.getLong(target, offset);
-  }
-
-  static void putLong(Object target, long offset, long value) {
-    MEMORY_ACCESSOR.putLong(target, offset, value);
-  }
-
-  static boolean getBoolean(Object target, long offset) {
-    return MEMORY_ACCESSOR.getBoolean(target, offset);
-  }
-
-  static void putBoolean(Object target, long offset, boolean value) {
-    MEMORY_ACCESSOR.putBoolean(target, offset, value);
-  }
-
-  static float getFloat(Object target, long offset) {
-    return MEMORY_ACCESSOR.getFloat(target, offset);
-  }
-
-  static void putFloat(Object target, long offset, float value) {
-    MEMORY_ACCESSOR.putFloat(target, offset, value);
-  }
-
-  static double getDouble(Object target, long offset) {
-    return MEMORY_ACCESSOR.getDouble(target, offset);
-  }
-
-  static void putDouble(Object target, long offset, double value) {
-    MEMORY_ACCESSOR.putDouble(target, offset, value);
-  }
-
-  static Object getObject(Object target, long offset) {
-    return MEMORY_ACCESSOR.getObject(target, offset);
-  }
-
-  static void putObject(Object target, long offset, Object value) {
-    MEMORY_ACCESSOR.putObject(target, offset, value);
-  }
-
-  static byte getByte(byte[] target, long index) {
-    return MEMORY_ACCESSOR.getByte(target, BYTE_ARRAY_BASE_OFFSET + index);
-  }
-
-  static void putByte(byte[] target, long index, byte value) {
-    MEMORY_ACCESSOR.putByte(target, BYTE_ARRAY_BASE_OFFSET + index, value);
-  }
-
-  static int getInt(int[] target, long index) {
-    return MEMORY_ACCESSOR.getInt(target, INT_ARRAY_BASE_OFFSET + (index * INT_ARRAY_INDEX_SCALE));
-  }
-
-  static void putInt(int[] target, long index, int value) {
-    MEMORY_ACCESSOR.putInt(target, INT_ARRAY_BASE_OFFSET + (index * INT_ARRAY_INDEX_SCALE), value);
-  }
-
-  static long getLong(long[] target, long index) {
-    return MEMORY_ACCESSOR.getLong(
-        target, LONG_ARRAY_BASE_OFFSET + (index * LONG_ARRAY_INDEX_SCALE));
-  }
-
-  static void putLong(long[] target, long index, long value) {
-    MEMORY_ACCESSOR.putLong(
-        target, LONG_ARRAY_BASE_OFFSET + (index * LONG_ARRAY_INDEX_SCALE), value);
-  }
-
-  static boolean getBoolean(boolean[] target, long index) {
-    return MEMORY_ACCESSOR.getBoolean(
-        target, BOOLEAN_ARRAY_BASE_OFFSET + (index * BOOLEAN_ARRAY_INDEX_SCALE));
-  }
-
-  static void putBoolean(boolean[] target, long index, boolean value) {
-    MEMORY_ACCESSOR.putBoolean(
-        target, BOOLEAN_ARRAY_BASE_OFFSET + (index * BOOLEAN_ARRAY_INDEX_SCALE), value);
-  }
-
-  static float getFloat(float[] target, long index) {
-    return MEMORY_ACCESSOR.getFloat(
-        target, FLOAT_ARRAY_BASE_OFFSET + (index * FLOAT_ARRAY_INDEX_SCALE));
-  }
-
-  static void putFloat(float[] target, long index, float value) {
-    MEMORY_ACCESSOR.putFloat(
-        target, FLOAT_ARRAY_BASE_OFFSET + (index * FLOAT_ARRAY_INDEX_SCALE), value);
-  }
-
-  static double getDouble(double[] target, long index) {
-    return MEMORY_ACCESSOR.getDouble(
-        target, DOUBLE_ARRAY_BASE_OFFSET + (index * DOUBLE_ARRAY_INDEX_SCALE));
-  }
-
-  static void putDouble(double[] target, long index, double value) {
-    MEMORY_ACCESSOR.putDouble(
-        target, DOUBLE_ARRAY_BASE_OFFSET + (index * DOUBLE_ARRAY_INDEX_SCALE), value);
-  }
-
-  static Object getObject(Object[] target, long index) {
-    return MEMORY_ACCESSOR.getObject(
-        target, OBJECT_ARRAY_BASE_OFFSET + (index * OBJECT_ARRAY_INDEX_SCALE));
-  }
-
-  static void putObject(Object[] target, long index, Object value) {
-    MEMORY_ACCESSOR.putObject(
-        target, OBJECT_ARRAY_BASE_OFFSET + (index * OBJECT_ARRAY_INDEX_SCALE), value);
-  }
-
-  static void copyMemory(byte[] src, long srcIndex, long targetOffset, long length) {
-    MEMORY_ACCESSOR.copyMemory(src, srcIndex, targetOffset, length);
-  }
-
-  static void copyMemory(long srcOffset, byte[] target, long targetIndex, long length) {
-    MEMORY_ACCESSOR.copyMemory(srcOffset, target, targetIndex, length);
-  }
-
-  static void copyMemory(byte[] src, long srcIndex, byte[] target, long targetIndex, long length) {
-    System.arraycopy(src, (int) srcIndex, target, (int) targetIndex, (int) length); 
-  }
-
-  static byte getByte(long address) {
-    return MEMORY_ACCESSOR.getByte(address);
-  }
-
-  static void putByte(long address, byte value) {
-    MEMORY_ACCESSOR.putByte(address, value);
-  }
-
-  static int getInt(long address) {
-    return MEMORY_ACCESSOR.getInt(address);
-  }
-
-  static void putInt(long address, int value) {
-    MEMORY_ACCESSOR.putInt(address, value);
-  }
-
-  static long getLong(long address) {
-    return MEMORY_ACCESSOR.getLong(address);
-  }
-
-  static void putLong(long address, long value) {
-    MEMORY_ACCESSOR.putLong(address, value);
-  }
-
-  /**
-   * Gets the offset of the {@code address} field of the given direct {@link ByteBuffer}.
-   */
-  static long addressOffset(ByteBuffer buffer) {
-    return MEMORY_ACCESSOR.getLong(buffer, BUFFER_ADDRESS_OFFSET);
-  }
-
-  static Object getStaticObject(Field field) {
-    return MEMORY_ACCESSOR.getStaticObject(field);
-  }
-
-  /**
-   * Gets the {@code sun.misc.Unsafe} instance, or {@code null} if not available on this platform.
-   */
-  private static sun.misc.Unsafe getUnsafe() {
-    sun.misc.Unsafe unsafe = null;
-    try {
-      unsafe =
-          AccessController.doPrivileged(
-              new PrivilegedExceptionAction<sun.misc.Unsafe>() {
-                @Override
-                public sun.misc.Unsafe run() throws Exception {
-                  Class<sun.misc.Unsafe> k = sun.misc.Unsafe.class;
-
-                  for (Field f : k.getDeclaredFields()) {
-                    f.setAccessible(true);
-                    Object x = f.get(null);
-                    if (k.isInstance(x)) {
-                      return k.cast(x);
-                    }
-                  }
-                  // The sun.misc.Unsafe field does not exist.
-                  return null;
-                }
-              });
-    } catch (Throwable e) {
-      // Catching Throwable here due to the fact that Google AppEngine raises NoClassDefFoundError
-      // for Unsafe.
-    }
-    return unsafe;
-  }
-
-  /** Get a {@link MemoryAccessor} appropriate for the platform, or null if not supported. */
-  private static MemoryAccessor getMemoryAccessor() {
-    if (UNSAFE == null) {
-      return null;
-    }
-    return new JvmMemoryAccessor(UNSAFE);
-  }
-
-  /** Indicates whether or not unsafe array operations are supported on this platform. */
-  private static boolean supportsUnsafeArrayOperations() {
-    if (UNSAFE == null) {
-      return false;
-    }
-    try {
-      Class<?> clazz = UNSAFE.getClass();
-      clazz.getMethod("objectFieldOffset", Field.class);
-      clazz.getMethod("arrayBaseOffset", Class.class);
-      clazz.getMethod("arrayIndexScale", Class.class);
-      clazz.getMethod("getInt", Object.class, long.class);
-      clazz.getMethod("putInt", Object.class, long.class, int.class);
-      clazz.getMethod("getLong", Object.class, long.class);
-      clazz.getMethod("putLong", Object.class, long.class, long.class);
-      clazz.getMethod("getObject", Object.class, long.class);
-      clazz.getMethod("putObject", Object.class, long.class, Object.class);
-      clazz.getMethod("getByte", Object.class, long.class);
-      clazz.getMethod("putByte", Object.class, long.class, byte.class);
-      clazz.getMethod("getBoolean", Object.class, long.class);
-      clazz.getMethod("putBoolean", Object.class, long.class, boolean.class);
-      clazz.getMethod("getFloat", Object.class, long.class);
-      clazz.getMethod("putFloat", Object.class, long.class, float.class);
-      clazz.getMethod("getDouble", Object.class, long.class);
-      clazz.getMethod("putDouble", Object.class, long.class, double.class);
-
-      return true;
-    } catch (Throwable e) {
-      logger.log(
-          Level.WARNING,
-          "platform method missing - proto runtime falling back to safer methods: " + e);
-    }
-    return false;
-  }
-
-  private static boolean supportsUnsafeByteBufferOperations() {
-    if (UNSAFE == null) {
-      return false;
-    }
-    try {
-      Class<?> clazz = UNSAFE.getClass();
-      // Methods for getting direct buffer address.
-      clazz.getMethod("objectFieldOffset", Field.class);
-      clazz.getMethod("getLong", Object.class, long.class);
-
-      clazz.getMethod("getByte", long.class);
-      clazz.getMethod("putByte", long.class, byte.class);
-      clazz.getMethod("getInt", long.class);
-      clazz.getMethod("putInt", long.class, int.class);
-      clazz.getMethod("getLong", long.class);
-      clazz.getMethod("putLong", long.class, long.class);
-      clazz.getMethod("copyMemory", long.class, long.class, long.class);
-      clazz.getMethod("copyMemory", Object.class, long.class, Object.class, long.class, long.class);
-      return true;
-    } catch (Throwable e) {
-      logger.log(
-          Level.WARNING,
-          "platform method missing - proto runtime falling back to safer methods: " + e);
-    }
-    return false;
-  }
-
-
-  @SuppressWarnings("unchecked")
-  private static <T> Class<T> getClassForName(String name) {
-    try {
-      return (Class<T>) Class.forName(name);
-    } catch (Throwable e) {
-      return null;
-    }
-  }
-
-  /** Finds the address field within a direct {@link Buffer}. */
-  private static Field bufferAddressField() {
-    return field(Buffer.class, "address");
-  }
-
-  /**
-   * Returns the offset of the provided field, or {@code -1} if {@code sun.misc.Unsafe} is not
-   * available.
-   */
-  private static long fieldOffset(Field field) {
-    return field == null || MEMORY_ACCESSOR == null ? -1 : MEMORY_ACCESSOR.objectFieldOffset(field);
-  }
-
-  /**
-   * Gets the field with the given name within the class, or {@code null} if not found. If found,
-   * the field is made accessible.
-   */
-  private static Field field(Class<?> clazz, String fieldName) {
-    Field field;
-    try {
-      field = clazz.getDeclaredField(fieldName);
-      field.setAccessible(true);
-    } catch (Throwable t) {
-      // Failed to access the fields.
-      field = null;
-    }
-    return field;
-  }
-
-  private abstract static class MemoryAccessor {
-
-    sun.misc.Unsafe unsafe;
-
-    MemoryAccessor(sun.misc.Unsafe unsafe) {
-      this.unsafe = unsafe;
-    }
-
-    public final long objectFieldOffset(Field field) {
-      return unsafe.objectFieldOffset(field);
-    }
-
-    public abstract byte getByte(Object target, long offset);
-
-    public abstract void putByte(Object target, long offset, byte value);
-
-    public final int getInt(Object target, long offset) {
-      return unsafe.getInt(target, offset);
-    }
-
-    public final void putInt(Object target, long offset, int value) {
-      unsafe.putInt(target, offset, value);
-    }
-
-    public final long getLong(Object target, long offset) {
-      return unsafe.getLong(target, offset);
-    }
-
-    public final void putLong(Object target, long offset, long value) {
-      unsafe.putLong(target, offset, value);
-    }
-
-    public abstract boolean getBoolean(Object target, long offset);
-
-    public abstract void putBoolean(Object target, long offset, boolean value);
-
-    public abstract float getFloat(Object target, long offset);
-
-    public abstract void putFloat(Object target, long offset, float value);
-
-    public abstract double getDouble(Object target, long offset);
-
-    public abstract void putDouble(Object target, long offset, double value);
-
-    public final Object getObject(Object target, long offset) {
-      return unsafe.getObject(target, offset);
-    }
-
-    public final void putObject(Object target, long offset, Object value) {
-      unsafe.putObject(target, offset, value);
-    }
-
-    public final int arrayBaseOffset(Class<?> clazz) {
-      return unsafe.arrayBaseOffset(clazz);
-    }
-
-    public final int arrayIndexScale(Class<?> clazz) {
-      return unsafe.arrayIndexScale(clazz);
-    }
-
-    public abstract byte getByte(long address);
-
-    public abstract void putByte(long address, byte value);
-
-    public abstract int getInt(long address);
-
-    public abstract void putInt(long address, int value);
-
-    public abstract long getLong(long address);
-
-    public abstract void putLong(long address, long value);
-
-    public abstract Object getStaticObject(Field field);
-    
-    public abstract void copyMemory(long srcOffset, byte[] target, long targetIndex, long length);
-    
-    public abstract void copyMemory(byte[] src, long srcIndex, long targetOffset, long length);
-  }
-
-  private static final class JvmMemoryAccessor extends MemoryAccessor {
-
-    JvmMemoryAccessor(sun.misc.Unsafe unsafe) {
-      super(unsafe);
-    }
-
-    @Override
-    public byte getByte(long address) {
-      return unsafe.getByte(address);
-    }
-
-    @Override
-    public void putByte(long address, byte value) {
-      unsafe.putByte(address, value);
-    }
-
-    @Override
-    public int getInt(long address) {
-      return unsafe.getInt(address);
-    }
-
-    @Override
-    public void putInt(long address, int value) {
-      unsafe.putInt(address, value);
-    }
-
-    @Override
-    public long getLong(long address) {
-      return unsafe.getLong(address);
-    }
-
-    @Override
-    public void putLong(long address, long value) {
-      unsafe.putLong(address, value);
-    }
-
-    @Override
-    public byte getByte(Object target, long offset) {
-      return unsafe.getByte(target, offset);
-    }
-
-    @Override
-    public void putByte(Object target, long offset, byte value) {
-      unsafe.putByte(target, offset, value);
-    }
-
-    @Override
-    public boolean getBoolean(Object target, long offset) {
-      return unsafe.getBoolean(target, offset);
-    }
-
-    @Override
-    public void putBoolean(Object target, long offset, boolean value) {
-      unsafe.putBoolean(target, offset, value);
-    }
-
-    @Override
-    public float getFloat(Object target, long offset) {
-      return unsafe.getFloat(target, offset);
-    }
-
-    @Override
-    public void putFloat(Object target, long offset, float value) {
-      unsafe.putFloat(target, offset, value);
-    }
-
-    @Override
-    public double getDouble(Object target, long offset) {
-      return unsafe.getDouble(target, offset);
-    }
-
-    @Override
-    public void putDouble(Object target, long offset, double value) {
-      unsafe.putDouble(target, offset, value);
-    }
-    
-    @Override 
-    public void copyMemory(long srcOffset, byte[] target, long targetIndex, long length) {
-      unsafe.copyMemory(null, srcOffset, target, BYTE_ARRAY_BASE_OFFSET + targetIndex, length);
-    }
-    
-    @Override
-    public void copyMemory(byte[] src, long srcIndex, long targetOffset, long length) {
-      unsafe.copyMemory(src, BYTE_ARRAY_BASE_OFFSET + srcIndex, null, targetOffset, length);
-    }
-
-    @Override
-    public Object getStaticObject(Field field) {
-      return getObject(unsafe.staticFieldBase(field), unsafe.staticFieldOffset(field));
-    }
-  }
-
-}
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 1b13614..308c69e 100644
--- a/java/core/src/main/java/com/google/protobuf/Utf8.java
+++ b/java/core/src/main/java/com/google/protobuf/Utf8.java
@@ -30,15 +30,18 @@
 
 package com.google.protobuf;
 
-import static com.google.protobuf.UnsafeUtil.addressOffset;
-import static com.google.protobuf.UnsafeUtil.hasUnsafeArrayOperations;
-import static com.google.protobuf.UnsafeUtil.hasUnsafeByteBufferOperations;
 import static java.lang.Character.MAX_SURROGATE;
 import static java.lang.Character.MIN_SURROGATE;
 import static java.lang.Character.isSurrogatePair;
 import static java.lang.Character.toCodePoint;
 
+import java.lang.reflect.Field;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * A set of low-level, high-performance static utility methods related
@@ -76,6 +79,7 @@
  */
 // TODO(nathanmittler): Copy changes in this class back to Guava
 final class Utf8 {
+  private static final Logger logger = Logger.getLogger(Utf8.class.getName());
 
   /**
    * UTF-8 is a runtime hot spot so we attempt to provide heavily optimized implementations
@@ -233,7 +237,7 @@
   // fallback to more lenient behavior.
   
   static class UnpairedSurrogateException extends IllegalArgumentException {
-    UnpairedSurrogateException(int index, int length) {
+    private UnpairedSurrogateException(int index, int length) {
       super("Unpaired surrogate at index " + index + " of " + length);
     }
   }
@@ -987,11 +991,23 @@
    * {@link Processor} that uses {@code sun.misc.Unsafe} where possible to improve performance.
    */
   static final class UnsafeProcessor extends Processor {
+    private static final sun.misc.Unsafe UNSAFE = getUnsafe();
+    private static final long BUFFER_ADDRESS_OFFSET =
+        fieldOffset(field(Buffer.class, "address"));
+    private static final int ARRAY_BASE_OFFSET = byteArrayBaseOffset();
+
+    /**
+     * We only use Unsafe operations if we have access to direct {@link ByteBuffer}'s address
+     * and the array base offset is a multiple of 8 (needed by Unsafe.getLong()).
+     */
+    private static final boolean AVAILABLE =
+        BUFFER_ADDRESS_OFFSET != -1 && ARRAY_BASE_OFFSET % 8 == 0;
+
     /**
      * Indicates whether or not all required unsafe operations are supported on this platform.
      */
     static boolean isAvailable() {
-      return hasUnsafeArrayOperations() && hasUnsafeByteBufferOperations();
+      return AVAILABLE;
     }
 
     @Override
@@ -1000,8 +1016,8 @@
         throw new ArrayIndexOutOfBoundsException(
             String.format("Array length=%d, index=%d, limit=%d", bytes.length, index, limit));
       }
-      long offset = index;
-      final long offsetLimit = limit;
+      long offset = ARRAY_BASE_OFFSET + index;
+      final long offsetLimit = ARRAY_BASE_OFFSET + limit;
       if (state != COMPLETE) {
         // The previous decoding operation was incomplete (or malformed).
         // We look for a well-formed sequence consisting of bytes from
@@ -1022,7 +1038,7 @@
           // leading position and overlong 2-byte form.
           if (byte1 < (byte) 0xC2
               // byte2 trailing-byte test
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF) {
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else if (byte1 < (byte) 0xF0) {
@@ -1031,7 +1047,7 @@
           // Get byte2 from saved state or array
           int byte2 = (byte) ~(state >> 8);
           if (byte2 == 0) {
-            byte2 = UnsafeUtil.getByte(bytes, offset++);
+            byte2 = UNSAFE.getByte(bytes, offset++);
             if (offset >= offsetLimit) {
               return incompleteStateFor(byte1, byte2);
             }
@@ -1042,7 +1058,7 @@
               // illegal surrogate codepoint?
               || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)
               // byte3 trailing-byte test
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF) {
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else {
@@ -1052,7 +1068,7 @@
           int byte2 = (byte) ~(state >> 8);
           int byte3 = 0;
           if (byte2 == 0) {
-            byte2 = UnsafeUtil.getByte(bytes, offset++);
+            byte2 = UNSAFE.getByte(bytes, offset++);
             if (offset >= offsetLimit) {
               return incompleteStateFor(byte1, byte2);
             }
@@ -1060,7 +1076,7 @@
             byte3 = (byte) (state >> 16);
           }
           if (byte3 == 0) {
-            byte3 = UnsafeUtil.getByte(bytes, offset++);
+            byte3 = UNSAFE.getByte(bytes, offset++);
             if (offset >= offsetLimit) {
               return incompleteStateFor(byte1, byte2, byte3);
             }
@@ -1079,7 +1095,7 @@
               // byte3 trailing-byte test
               || byte3 > (byte) 0xBF
               // byte4 trailing-byte test
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF) {
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF) {
             return MALFORMED;
           }
         }
@@ -1118,7 +1134,7 @@
           // leading position and overlong 2-byte form.
           if (byte1 < (byte) 0xC2
               // byte2 trailing-byte test
-              || UnsafeUtil.getByte(address++) > (byte) 0xBF) {
+              || UNSAFE.getByte(address++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else if (byte1 < (byte) 0xF0) {
@@ -1127,7 +1143,7 @@
           // Get byte2 from saved state or array
           int byte2 = (byte) ~(state >> 8);
           if (byte2 == 0) {
-            byte2 = UnsafeUtil.getByte(address++);
+            byte2 = UNSAFE.getByte(address++);
             if (address >= addressLimit) {
               return incompleteStateFor(byte1, byte2);
             }
@@ -1138,7 +1154,7 @@
               // illegal surrogate codepoint?
               || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)
               // byte3 trailing-byte test
-              || UnsafeUtil.getByte(address++) > (byte) 0xBF) {
+              || UNSAFE.getByte(address++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else {
@@ -1148,7 +1164,7 @@
           int byte2 = (byte) ~(state >> 8);
           int byte3 = 0;
           if (byte2 == 0) {
-            byte2 = UnsafeUtil.getByte(address++);
+            byte2 = UNSAFE.getByte(address++);
             if (address >= addressLimit) {
               return incompleteStateFor(byte1, byte2);
             }
@@ -1156,7 +1172,7 @@
             byte3 = (byte) (state >> 16);
           }
           if (byte3 == 0) {
-            byte3 = UnsafeUtil.getByte(address++);
+            byte3 = UNSAFE.getByte(address++);
             if (address >= addressLimit) {
               return incompleteStateFor(byte1, byte2, byte3);
             }
@@ -1175,7 +1191,7 @@
               // byte3 trailing-byte test
               || byte3 > (byte) 0xBF
               // byte4 trailing-byte test
-              || UnsafeUtil.getByte(address++) > (byte) 0xBF) {
+              || UNSAFE.getByte(address++) > (byte) 0xBF) {
             return MALFORMED;
           }
         }
@@ -1186,7 +1202,7 @@
 
     @Override
     int encodeUtf8(final CharSequence in, final byte[] out, final int offset, final int length) {
-      long outIx = offset;
+      long outIx = ARRAY_BASE_OFFSET + offset;
       final long outLimit = outIx + length;
       final int inLimit = in.length();
       if (inLimit > length || out.length - length < offset) {
@@ -1199,25 +1215,25 @@
       // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
       int inIx = 0;
       for (char c; inIx < inLimit && (c = in.charAt(inIx)) < 0x80; ++inIx) {
-        UnsafeUtil.putByte(out, outIx++, (byte) c);
+        UNSAFE.putByte(out, outIx++, (byte) c);
       }
       if (inIx == inLimit) {
         // We're done, it was ASCII encoded.
-        return (int) outIx;
+        return (int) (outIx - ARRAY_BASE_OFFSET);
       }
 
       for (char c; inIx < inLimit; ++inIx) {
         c = in.charAt(inIx);
         if (c < 0x80 && outIx < outLimit) {
-          UnsafeUtil.putByte(out, outIx++, (byte) c);
+          UNSAFE.putByte(out, outIx++, (byte) c);
         } else if (c < 0x800 && outIx <= outLimit - 2L) { // 11 bits, two UTF-8 bytes
-          UnsafeUtil.putByte(out, outIx++, (byte) ((0xF << 6) | (c >>> 6)));
-          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & c)));
+          UNSAFE.putByte(out, outIx++, (byte) ((0xF << 6) | (c >>> 6)));
+          UNSAFE.putByte(out, outIx++, (byte) (0x80 | (0x3F & c)));
         } else if ((c < MIN_SURROGATE || MAX_SURROGATE < c) && outIx <= outLimit - 3L) {
           // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
-          UnsafeUtil.putByte(out, outIx++, (byte) ((0xF << 5) | (c >>> 12)));
-          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & (c >>> 6))));
-          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & c)));
+          UNSAFE.putByte(out, outIx++, (byte) ((0xF << 5) | (c >>> 12)));
+          UNSAFE.putByte(out, outIx++, (byte) (0x80 | (0x3F & (c >>> 6))));
+          UNSAFE.putByte(out, outIx++, (byte) (0x80 | (0x3F & c)));
         } else if (outIx <= outLimit - 4L) {
           // Minimum code point represented by a surrogate pair is 0x10000, 17 bits, four UTF-8
           // bytes
@@ -1226,10 +1242,10 @@
             throw new UnpairedSurrogateException((inIx - 1), inLimit);
           }
           int codePoint = toCodePoint(c, low);
-          UnsafeUtil.putByte(out, outIx++, (byte) ((0xF << 4) | (codePoint >>> 18)));
-          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
-          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
-          UnsafeUtil.putByte(out, outIx++, (byte) (0x80 | (0x3F & codePoint)));
+          UNSAFE.putByte(out, outIx++, (byte) ((0xF << 4) | (codePoint >>> 18)));
+          UNSAFE.putByte(out, outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
+          UNSAFE.putByte(out, outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
+          UNSAFE.putByte(out, outIx++, (byte) (0x80 | (0x3F & codePoint)));
         } else {
           if ((MIN_SURROGATE <= c && c <= MAX_SURROGATE)
               && (inIx + 1 == inLimit || !isSurrogatePair(c, in.charAt(inIx + 1)))) {
@@ -1242,7 +1258,7 @@
       }
 
       // All bytes have been encoded.
-      return (int) outIx;
+      return (int) (outIx - ARRAY_BASE_OFFSET);
     }
 
     @Override
@@ -1261,7 +1277,7 @@
       // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
       int inIx = 0;
       for (char c; inIx < inLimit && (c = in.charAt(inIx)) < 0x80; ++inIx) {
-        UnsafeUtil.putByte(outIx++, (byte) c);
+        UNSAFE.putByte(outIx++, (byte) c);
       }
       if (inIx == inLimit) {
         // We're done, it was ASCII encoded.
@@ -1272,15 +1288,15 @@
       for (char c; inIx < inLimit; ++inIx) {
         c = in.charAt(inIx);
         if (c < 0x80 && outIx < outLimit) {
-          UnsafeUtil.putByte(outIx++, (byte) c);
+          UNSAFE.putByte(outIx++, (byte) c);
         } else if (c < 0x800 && outIx <= outLimit - 2L) { // 11 bits, two UTF-8 bytes
-          UnsafeUtil.putByte(outIx++, (byte) ((0xF << 6) | (c >>> 6)));
-          UnsafeUtil.putByte(outIx++, (byte) (0x80 | (0x3F & c)));
+          UNSAFE.putByte(outIx++, (byte) ((0xF << 6) | (c >>> 6)));
+          UNSAFE.putByte(outIx++, (byte) (0x80 | (0x3F & c)));
         } else if ((c < MIN_SURROGATE || MAX_SURROGATE < c) && outIx <= outLimit - 3L) {
           // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
-          UnsafeUtil.putByte(outIx++, (byte) ((0xF << 5) | (c >>> 12)));
-          UnsafeUtil.putByte(outIx++, (byte) (0x80 | (0x3F & (c >>> 6))));
-          UnsafeUtil.putByte(outIx++, (byte) (0x80 | (0x3F & c)));
+          UNSAFE.putByte(outIx++, (byte) ((0xF << 5) | (c >>> 12)));
+          UNSAFE.putByte(outIx++, (byte) (0x80 | (0x3F & (c >>> 6))));
+          UNSAFE.putByte(outIx++, (byte) (0x80 | (0x3F & c)));
         } else if (outIx <= outLimit - 4L) {
           // Minimum code point represented by a surrogate pair is 0x10000, 17 bits, four UTF-8
           // bytes
@@ -1289,10 +1305,10 @@
             throw new UnpairedSurrogateException((inIx - 1), inLimit);
           }
           int codePoint = toCodePoint(c, low);
-          UnsafeUtil.putByte(outIx++, (byte) ((0xF << 4) | (codePoint >>> 18)));
-          UnsafeUtil.putByte(outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
-          UnsafeUtil.putByte(outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
-          UnsafeUtil.putByte(outIx++, (byte) (0x80 | (0x3F & codePoint)));
+          UNSAFE.putByte(outIx++, (byte) ((0xF << 4) | (codePoint >>> 18)));
+          UNSAFE.putByte(outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
+          UNSAFE.putByte(outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
+          UNSAFE.putByte(outIx++, (byte) (0x80 | (0x3F & codePoint)));
         } else {
           if ((MIN_SURROGATE <= c && c <= MAX_SURROGATE)
               && (inIx + 1 == inLimit || !isSurrogatePair(c, in.charAt(inIx + 1)))) {
@@ -1320,17 +1336,31 @@
      */
     private static int unsafeEstimateConsecutiveAscii(
         byte[] bytes, long offset, final int maxChars) {
-      if (maxChars < UNSAFE_COUNT_ASCII_THRESHOLD) {
+      int remaining = maxChars;
+      if (remaining < UNSAFE_COUNT_ASCII_THRESHOLD) {
         // Don't bother with small strings.
         return 0;
       }
 
-      for (int i = 0; i < maxChars; i++) {
-        if (UnsafeUtil.getByte(bytes, offset++) < 0) {
-          return i;
+      // Read bytes until 8-byte aligned so that we can read longs in the loop below.
+      // Byte arrays are already either 8 or 16-byte aligned, so we just need to make sure that
+      // the index (relative to the start of the array) is also 8-byte aligned. We do this by
+      // ANDing the index with 7 to determine the number of bytes that need to be read before
+      // we're 8-byte aligned.
+      final int unaligned = (int) offset & 7;
+      for (int j = unaligned; j > 0; j--) {
+        if (UNSAFE.getByte(bytes, offset++) < 0) {
+          return unaligned - j;
         }
       }
-      return maxChars;
+
+      // This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).
+      // To speed things up further, we're reading longs instead of bytes so we use a mask to
+      // determine if any byte in the current long is non-ASCII.
+      remaining -= unaligned;
+      for (; remaining >= 8 && (UNSAFE.getLong(bytes, offset) & ASCII_MASK_LONG) == 0;
+          offset += 8, remaining -= 8) {}
+      return maxChars - remaining;
     }
 
     /**
@@ -1347,9 +1377,9 @@
       // Read bytes until 8-byte aligned so that we can read longs in the loop below.
       // We do this by ANDing the address with 7 to determine the number of bytes that need to
       // be read before we're 8-byte aligned.
-      final int unaligned = 8 - ((int) address & 7);
+      final int unaligned = (int) address & 7;
       for (int j = unaligned; j > 0; j--) {
-        if (UnsafeUtil.getByte(address++) < 0) {
+        if (UNSAFE.getByte(address++) < 0) {
           return unaligned - j;
         }
       }
@@ -1358,7 +1388,7 @@
       // To speed things up further, we're reading longs instead of bytes so we use a mask to
       // determine if any byte in the current long is non-ASCII.
       remaining -= unaligned;
-      for (; remaining >= 8 && (UnsafeUtil.getLong(address) & ASCII_MASK_LONG) == 0;
+      for (; remaining >= 8 && (UNSAFE.getLong(address) & ASCII_MASK_LONG) == 0;
           address += 8, remaining -= 8) {}
       return maxChars - remaining;
     }
@@ -1374,7 +1404,7 @@
         // TODO(nathanmittler): Consider checking 8 bytes at a time after some threshold?
         // Maybe after seeing a few in a row that are ASCII, go back to fast mode?
         int byte1 = 0;
-        for (; remaining > 0 && (byte1 = UnsafeUtil.getByte(bytes, offset++)) >= 0; --remaining) {
+        for (; remaining > 0 && (byte1 = UNSAFE.getByte(bytes, offset++)) >= 0; --remaining) {
         }
         if (remaining == 0) {
           return COMPLETE;
@@ -1393,7 +1423,7 @@
           // Simultaneously checks for illegal trailing-byte in
           // leading position and overlong 2-byte form.
           if (byte1 < (byte) 0xC2
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF) {
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else if (byte1 < (byte) 0xF0) {
@@ -1405,13 +1435,13 @@
           remaining -= 2;
 
           final int byte2;
-          if ((byte2 = UnsafeUtil.getByte(bytes, offset++)) > (byte) 0xBF
+          if ((byte2 = UNSAFE.getByte(bytes, offset++)) > (byte) 0xBF
               // overlong? 5 most significant bits must not all be zero
               || (byte1 == (byte) 0xE0 && byte2 < (byte) 0xA0)
               // check for illegal surrogate codepoints
               || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)
               // byte3 trailing-byte test
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF) {
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else {
@@ -1423,16 +1453,16 @@
           remaining -= 3;
 
           final int byte2;
-          if ((byte2 = UnsafeUtil.getByte(bytes, offset++)) > (byte) 0xBF
+          if ((byte2 = UNSAFE.getByte(bytes, offset++)) > (byte) 0xBF
               // Check that 1 <= plane <= 16.  Tricky optimized form of:
               // if (byte1 > (byte) 0xF4 ||
               //     byte1 == (byte) 0xF0 && byte2 < (byte) 0x90 ||
               //     byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F)
               || (((byte1 << 28) + (byte2 - (byte) 0x90)) >> 30) != 0
               // byte3 trailing-byte test
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF
               // byte4 trailing-byte test
-              || UnsafeUtil.getByte(bytes, offset++) > (byte) 0xBF) {
+              || UNSAFE.getByte(bytes, offset++) > (byte) 0xBF) {
             return MALFORMED;
           }
         }
@@ -1450,7 +1480,7 @@
         // TODO(nathanmittler): Consider checking 8 bytes at a time after some threshold?
         // Maybe after seeing a few in a row that are ASCII, go back to fast mode?
         int byte1 = 0;
-        for (; remaining > 0 && (byte1 = UnsafeUtil.getByte(address++)) >= 0; --remaining) {
+        for (; remaining > 0 && (byte1 = UNSAFE.getByte(address++)) >= 0; --remaining) {
         }
         if (remaining == 0) {
           return COMPLETE;
@@ -1468,7 +1498,7 @@
 
           // Simultaneously checks for illegal trailing-byte in
           // leading position and overlong 2-byte form.
-          if (byte1 < (byte) 0xC2 || UnsafeUtil.getByte(address++) > (byte) 0xBF) {
+          if (byte1 < (byte) 0xC2 || UNSAFE.getByte(address++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else if (byte1 < (byte) 0xF0) {
@@ -1480,14 +1510,14 @@
           }
           remaining -= 2;
 
-          final byte byte2 = UnsafeUtil.getByte(address++);
+          final byte byte2 = UNSAFE.getByte(address++);
           if (byte2 > (byte) 0xBF
               // overlong? 5 most significant bits must not all be zero
               || (byte1 == (byte) 0xE0 && byte2 < (byte) 0xA0)
               // check for illegal surrogate codepoints
               || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)
               // byte3 trailing-byte test
-              || UnsafeUtil.getByte(address++) > (byte) 0xBF) {
+              || UNSAFE.getByte(address++) > (byte) 0xBF) {
             return MALFORMED;
           }
         } else {
@@ -1499,7 +1529,7 @@
           }
           remaining -= 3;
 
-          final byte byte2 = UnsafeUtil.getByte(address++);
+          final byte byte2 = UNSAFE.getByte(address++);
           if (byte2 > (byte) 0xBF
               // Check that 1 <= plane <= 16.  Tricky optimized form of:
               // if (byte1 > (byte) 0xF4 ||
@@ -1507,9 +1537,9 @@
               //     byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F)
               || (((byte1 << 28) + (byte2 - (byte) 0x90)) >> 30) != 0
               // byte3 trailing-byte test
-              || UnsafeUtil.getByte(address++) > (byte) 0xBF
+              || UNSAFE.getByte(address++) > (byte) 0xBF
               // byte4 trailing-byte test
-              || UnsafeUtil.getByte(address++) > (byte) 0xBF) {
+              || UNSAFE.getByte(address++) > (byte) 0xBF) {
             return MALFORMED;
           }
         }
@@ -1523,11 +1553,11 @@
           return incompleteStateFor(byte1);
         }
         case 1: {
-          return incompleteStateFor(byte1, UnsafeUtil.getByte(bytes, offset));
+          return incompleteStateFor(byte1, UNSAFE.getByte(bytes, offset));
         }
         case 2: {
-          return incompleteStateFor(byte1, UnsafeUtil.getByte(bytes, offset),
-              UnsafeUtil.getByte(bytes, offset + 1));
+          return incompleteStateFor(byte1, UNSAFE.getByte(bytes, offset),
+              UNSAFE.getByte(bytes, offset + 1));
         }
         default: {
           throw new AssertionError();
@@ -1541,17 +1571,112 @@
           return incompleteStateFor(byte1);
         }
         case 1: {
-          return incompleteStateFor(byte1, UnsafeUtil.getByte(address));
+          return incompleteStateFor(byte1, UNSAFE.getByte(address));
         }
         case 2: {
-          return incompleteStateFor(byte1, UnsafeUtil.getByte(address),
-              UnsafeUtil.getByte(address + 1));
+          return incompleteStateFor(byte1, UNSAFE.getByte(address), UNSAFE.getByte(address + 1));
         }
         default: {
           throw new AssertionError();
         }
       }
     }
+
+    /**
+     * Gets the field with the given name within the class, or {@code null} if not found. If
+     * found, the field is made accessible.
+     */
+    private static Field field(Class<?> clazz, String fieldName) {
+      Field field;
+      try {
+        field = clazz.getDeclaredField(fieldName);
+        field.setAccessible(true);
+      } catch (Throwable t) {
+        // Failed to access the fields.
+        field = null;
+      }
+      logger.log(Level.FINEST, "{0}.{1}: {2}",
+          new Object[] {clazz.getName(), fieldName, (field != null ? "available" : "unavailable")});
+      return field;
+    }
+
+    /**
+     * Returns the offset of the provided field, or {@code -1} if {@code sun.misc.Unsafe} is not
+     * available.
+     */
+    private static long fieldOffset(Field field) {
+      return field == null || UNSAFE == null ? -1 : UNSAFE.objectFieldOffset(field);
+    }
+
+    /**
+     * Get the base offset for byte arrays, or {@code -1} if {@code sun.misc.Unsafe} is not
+     * available.
+     */
+    private static <T> int byteArrayBaseOffset() {
+      return UNSAFE == null ? -1 : UNSAFE.arrayBaseOffset(byte[].class);
+    }
+
+    /**
+     * Gets the offset of the {@code address} field of the given direct {@link ByteBuffer}.
+     */
+    private static long addressOffset(ByteBuffer buffer) {
+      return UNSAFE.getLong(buffer, BUFFER_ADDRESS_OFFSET);
+    }
+
+    /**
+     * Gets the {@code sun.misc.Unsafe} instance, or {@code null} if not available on this
+     * platform.
+     */
+    private static sun.misc.Unsafe getUnsafe() {
+      sun.misc.Unsafe unsafe = null;
+      try {
+        unsafe = AccessController.doPrivileged(new PrivilegedExceptionAction<sun.misc.Unsafe>() {
+          @Override
+          public sun.misc.Unsafe run() throws Exception {
+            Class<sun.misc.Unsafe> k = sun.misc.Unsafe.class;
+
+            // Check that this platform supports all of the required unsafe methods.
+            checkRequiredMethods(k);
+
+            for (Field f : k.getDeclaredFields()) {
+              f.setAccessible(true);
+              Object x = f.get(null);
+              if (k.isInstance(x)) {
+                return k.cast(x);
+              }
+            }
+            // The sun.misc.Unsafe field does not exist.
+            return null;
+          }
+        });
+      } catch (Throwable e) {
+        // Catching Throwable here due to the fact that Google AppEngine raises NoClassDefFoundError
+        // for Unsafe.
+      }
+
+      logger.log(Level.FINEST, "sun.misc.Unsafe: {}",
+          unsafe != null ? "available" : "unavailable");
+      return unsafe;
+    }
+
+    /**
+     * Verifies that all required methods of {@code sun.misc.Unsafe} are available on this platform.
+     */
+    private static void checkRequiredMethods(Class<sun.misc.Unsafe> clazz)
+        throws NoSuchMethodException, SecurityException {
+      // Needed for Unsafe byte[] access
+      clazz.getMethod("arrayBaseOffset", Class.class);
+      clazz.getMethod("getByte", Object.class, long.class);
+      clazz.getMethod("putByte", Object.class, long.class, byte.class);
+      clazz.getMethod("getLong", Object.class, long.class);
+
+      // Needed for Unsafe Direct ByteBuffer access
+      clazz.getMethod("objectFieldOffset", Field.class);
+      clazz.getMethod("getByte", long.class);
+      clazz.getMethod("getLong", Object.class, long.class);
+      clazz.getMethod("putByte", long.class, byte.class);
+      clazz.getMethod("getLong", long.class);
+    }
   }
 
   private Utf8() {}
diff --git a/java/core/src/main/java/com/google/protobuf/WireFormat.java b/java/core/src/main/java/com/google/protobuf/WireFormat.java
index 8b837ee..6a58b08 100644
--- a/java/core/src/main/java/com/google/protobuf/WireFormat.java
+++ b/java/core/src/main/java/com/google/protobuf/WireFormat.java
@@ -47,12 +47,6 @@
   // Do not allow instantiation.
   private WireFormat() {}
 
-  static final int FIXED32_SIZE = 4;
-  static final int FIXED64_SIZE = 8;
-  static final int MAX_VARINT32_SIZE = 5;
-  static final int MAX_VARINT64_SIZE = 10;
-  static final int MAX_VARINT_SIZE = 10;
-
   public static final int WIRETYPE_VARINT           = 0;
   public static final int WIRETYPE_FIXED64          = 1;
   public static final int WIRETYPE_LENGTH_DELIMITED = 2;
diff --git a/java/core/src/stubs/sun/misc/Unsafe.java b/java/core/src/stubs/sun/misc/Unsafe.java
index 8756139..fa66e48 100644
--- a/java/core/src/stubs/sun/misc/Unsafe.java
+++ b/java/core/src/stubs/sun/misc/Unsafe.java
@@ -34,34 +34,12 @@
  * in the bootclasspath and protobuf is linked to the class loaded there.
  */
 public class Unsafe {
-  public Object allocateInstance(Class<?> clazz) throws InstantiationException { /* null implementation */ return null; }
-  public int arrayIndexScale(Class arrayClass) { /* null implementation */ return 0; }
-  public int arrayBaseOffset(Class arrayClass) { /* null implementation */ return 0; }
-  public void copyMemory(long srcAddress, long targetAddress, long length) { /* null implmentation */ }
-  public void copyMemory(byte[] src, long srcIndex, byte[] target, long targetIndex, long length) { /* null implmentation */ }
-  public boolean getBoolean(Object o, long offset) { /* null implementation */ return false; }
-  public boolean getBoolean(long address) { /* null implementation */ return false; }
   public byte getByte(Object o, long offset) { /* null implementation */ return 0; }
   public byte getByte(long address) { /* null implementation */ return 0; }
-  public float getFloat(Object o, long offset) { /* null implementation */ return 0; }
-  public double getDouble(Object o, long offset) { /* null implementation */ return 0; }
-  public int getInt(Object o, long offset) { /* null implementation */ return 0; }
-  public int getInt(long address) { /* null implementation */ return 0; }
+  public int arrayBaseOffset(Class arrayClass) { /* null implementation */ return 0; }
   public long getLong(Object o, long offset) { /* null implementation */ return 0; }
   public long getLong(long address) { /* null implementation */ return 0; }
-  public Object getObject(Object o, long offset) { /* null implementation */ return null; }
   public long objectFieldOffset(java.lang.reflect.Field f) { /* null implementation */ return 0; }
-  public void putBoolean(Object o, long offset, boolean x) { /* null implementation */ }
-  public void putBoolean(long address, boolean x) { /* null implmentation */ }
   public void putByte(Object o, long offset, byte x) { /* null implementation */ }
   public void putByte(long address, byte x) { /* null implmentation */ }
-  public void putFloat(Object o, long offset, float x) { /* null implementation */ }
-  public void putDouble(Object o, long offset, double x) { /* null implementation */ }
-  public void putInt(Object o, long offset, int x) { /* null implementation */ }
-  public void putInt(long address, int x) { /* null implmentation */ }
-  public void putLong(Object o, long offset, long x) { /* null implementation */ }
-  public void putLong(long address, long x) { /* null implmentation */ }
-  public void putObject(Object o, long offset, Object x) { /* null implementation */ }
-  public Object staticFieldBase(java.lang.reflect.Field f) { /* null implementation */ return null; }
-  public long staticFieldOffset(java.lang.reflect.Field f) { /* null implementation */ return 0; }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java b/java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java
index 622e36a..7dc9fc1 100644
--- a/java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java
+++ b/java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java
@@ -40,9 +40,10 @@
 import protobuf_unittest.UnittestProto.TestRequired;
 import protobuf_unittest.UnittestProto.TestRequiredForeign;
 import protobuf_unittest.UnittestProto.TestUnpackedTypes;
-import java.util.Map;
 import junit.framework.TestCase;
 
+import java.util.Map;
+
 /**
  * Unit test for {@link AbstractMessage}.
  *
@@ -491,6 +492,7 @@
     checkEqualsIsConsistent(eUnknownFields, eUnknownFields2);
   }
 
+
   /**
    * Asserts that the given proto has symmetric equals and hashCode methods.
    */
diff --git a/java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java b/java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java
index 18132e9..24b96c6 100644
--- a/java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java
@@ -32,38 +32,38 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link BooleanArrayList}.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
 public class BooleanArrayListTest extends TestCase {
-
-  private static final BooleanArrayList UNARY_LIST =
-      newImmutableBooleanArrayList(true);
+  
+  private static final BooleanArrayList UNARY_LIST = newImmutableBooleanArrayList(true);
   private static final BooleanArrayList TERTIARY_LIST =
-      newImmutableBooleanArrayList(true, false, true);
-
+      newImmutableBooleanArrayList(true, true, false);
+  
   private BooleanArrayList list;
-
+  
   @Override
   protected void setUp() throws Exception {
     list = new BooleanArrayList();
   }
-
+  
   public void testEmptyListReturnsSameInstance() {
     assertSame(BooleanArrayList.emptyList(), BooleanArrayList.emptyList());
   }
-
+  
   public void testEmptyListIsImmutable() {
     assertImmutable(BooleanArrayList.emptyList());
   }
-
+  
   public void testMakeImmutable() {
     list.addBoolean(true);
     list.addBoolean(false);
@@ -72,16 +72,16 @@
     list.makeImmutable();
     assertImmutable(list);
   }
-
+  
   public void testModificationWithIteration() {
-    list.addAll(asList(true, false, true, false));
+    list.addAll(asList(true, false, false, true));
     Iterator<Boolean> iterator = list.iterator();
     assertEquals(4, list.size());
     assertEquals(true, (boolean) list.get(0));
     assertEquals(true, (boolean) iterator.next());
     list.set(0, true);
     assertEquals(false, (boolean) iterator.next());
-
+    
     list.remove(0);
     try {
       iterator.next();
@@ -89,7 +89,7 @@
     } catch (ConcurrentModificationException e) {
       // expected
     }
-
+    
     iterator = list.iterator();
     list.add(0, false);
     try {
@@ -99,19 +99,19 @@
       // expected
     }
   }
-
+  
   public void testGet() {
     assertEquals(true, (boolean) TERTIARY_LIST.get(0));
-    assertEquals(false, (boolean) TERTIARY_LIST.get(1));
-    assertEquals(true, (boolean) TERTIARY_LIST.get(2));
-
+    assertEquals(true, (boolean) TERTIARY_LIST.get(1));
+    assertEquals(false, (boolean) TERTIARY_LIST.get(2));
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -119,19 +119,19 @@
       // expected
     }
   }
-
-  public void testGetBoolean() {
+  
+  public void testGetInt() {
     assertEquals(true, TERTIARY_LIST.getBoolean(0));
-    assertEquals(false, TERTIARY_LIST.getBoolean(1));
-    assertEquals(true, TERTIARY_LIST.getBoolean(2));
-
+    assertEquals(true, TERTIARY_LIST.getBoolean(1));
+    assertEquals(false, TERTIARY_LIST.getBoolean(2));
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -139,7 +139,7 @@
       // expected
     }
   }
-
+  
   public void testSize() {
     assertEquals(0, BooleanArrayList.emptyList().size());
     assertEquals(1, UNARY_LIST.size());
@@ -150,26 +150,26 @@
     list.addBoolean(false);
     list.addBoolean(false);
     assertEquals(4, list.size());
-
+    
     list.remove(0);
     assertEquals(3, list.size());
-
+    
     list.add(true);
     assertEquals(4, list.size());
   }
-
+  
   public void testSet() {
     list.addBoolean(false);
     list.addBoolean(false);
-
+    
     assertEquals(false, (boolean) list.set(0, true));
     assertEquals(true, list.getBoolean(0));
 
     assertEquals(false, (boolean) list.set(1, false));
     assertEquals(false, list.getBoolean(1));
-
+    
     try {
-      list.set(-1, false);
+      list.set(-1, true);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
@@ -182,17 +182,17 @@
       // expected
     }
   }
-
-  public void testSetBoolean() {
+  
+  public void testSetInt() {
     list.addBoolean(true);
     list.addBoolean(true);
-
+    
     assertEquals(true, list.setBoolean(0, false));
     assertEquals(false, list.getBoolean(0));
 
     assertEquals(true, list.setBoolean(1, false));
     assertEquals(false, list.getBoolean(1));
-
+    
     try {
       list.setBoolean(-1, false);
       fail();
@@ -201,78 +201,76 @@
     }
 
     try {
-      list.setBoolean(2, false);
+      list.setBoolean(2, true);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   public void testAdd() {
     assertEquals(0, list.size());
 
-    assertTrue(list.add(false));
-    assertEquals(asList(false), list);
-
     assertTrue(list.add(true));
-    list.add(0, false);
-    assertEquals(asList(false, false, true), list);
+    assertEquals(asList(true), list);
 
-    list.add(0, true);
+    assertTrue(list.add(false));
     list.add(0, false);
+    assertEquals(asList(false, true, false), list);
+    
+    list.add(0, false);
+    list.add(0, true);
     // Force a resize by getting up to 11 elements.
     for (int i = 0; i < 6; i++) {
-      list.add(i % 2 == 0);
+      list.add(true);
     }
-    assertEquals(
-        asList(false, true, false, false, true, true, false, true, false, true, false),
-        list);
-
+    assertEquals(asList(true, false, false, true, false, true, true, true, true, true, true), list);
+    
     try {
-      list.add(-1, true);
+      list.add(-1, false);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.add(4, true);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
-  public void testAddBoolean() {
+  
+  public void testAddInt() {
     assertEquals(0, list.size());
 
-    list.addBoolean(false);
-    assertEquals(asList(false), list);
-
     list.addBoolean(true);
-    assertEquals(asList(false, true), list);
-  }
+    assertEquals(asList(true), list);
 
+    list.addBoolean(false);
+    assertEquals(asList(true, false), list);
+  }
+  
   public void testAddAll() {
     assertEquals(0, list.size());
 
-    assertTrue(list.addAll(Collections.singleton(true)));
+    assertTrue(list.addAll(Collections.singleton(false)));
     assertEquals(1, list.size());
-    assertEquals(true, (boolean) list.get(0));
-    assertEquals(true, list.getBoolean(0));
-
-    assertTrue(list.addAll(asList(false, true, false, true, false)));
-    assertEquals(asList(true, false, true, false, true, false), list);
-
+    assertEquals(false, (boolean) list.get(0));
+    assertEquals(false, list.getBoolean(0));
+    
+    assertTrue(list.addAll(asList(true, false, false, false, true)));
+    assertEquals(asList(false, true, false, false, false, true), list);
+    
     assertTrue(list.addAll(TERTIARY_LIST));
-    assertEquals(asList(true, false, true, false, true, false, true, false, true), list);
+    assertEquals(asList(false, true, false, false, false, true, true, true, false), list);
 
     assertFalse(list.addAll(Collections.<Boolean>emptyList()));
     assertFalse(list.addAll(BooleanArrayList.emptyList()));
   }
-
+  
   public void testRemove() {
     list.addAll(TERTIARY_LIST);
     assertEquals(true, (boolean) list.remove(0));
-    assertEquals(asList(false, true), list);
+    assertEquals(asList(true, false), list);
 
     assertTrue(list.remove(Boolean.TRUE));
     assertEquals(asList(false), list);
@@ -282,93 +280,92 @@
 
     assertEquals(false, (boolean) list.remove(0));
     assertEquals(asList(), list);
-
+    
     try {
       list.remove(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.remove(0);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   private void assertImmutable(BooleanArrayList list) {
-
     try {
-      list.add(true);
+      list.add(false);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.add(0, true);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.<Boolean>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
-      list.addAll(Collections.singletonList(true));
+      list.addAll(Collections.singletonList(false));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(new BooleanArrayList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.singleton(true));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.<Boolean>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
-      list.addBoolean(false);
+      list.addBoolean(true);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.clear();
       fail();
@@ -382,63 +379,63 @@
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.remove(new Object());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.<Boolean>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.singleton(Boolean.TRUE));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.<Boolean>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
-      list.removeAll(Collections.singleton(Boolean.TRUE));
+      list.retainAll(Collections.singleton(Boolean.TRUE));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
-      list.set(0, false);
+      list.set(0, true);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.setBoolean(0, false);
       fail();
@@ -446,7 +443,7 @@
       // expected
     }
   }
-
+  
   private static BooleanArrayList newImmutableBooleanArrayList(boolean... elements) {
     BooleanArrayList list = new BooleanArrayList();
     for (boolean element : elements) {
diff --git a/java/core/src/test/java/com/google/protobuf/ByteBufferWriterTest.java b/java/core/src/test/java/com/google/protobuf/ByteBufferWriterTest.java
index 6b1cfe7..cbe742e 100644
--- a/java/core/src/test/java/com/google/protobuf/ByteBufferWriterTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ByteBufferWriterTest.java
@@ -30,12 +30,13 @@
 
 package com.google.protobuf;
 
+import junit.framework.TestCase;
+
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Random;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link ByteBufferWriter}.
diff --git a/java/core/src/test/java/com/google/protobuf/ByteStringTest.java b/java/core/src/test/java/com/google/protobuf/ByteStringTest.java
index be71f1f..ad9f266 100644
--- a/java/core/src/test/java/com/google/protobuf/ByteStringTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ByteStringTest.java
@@ -31,6 +31,9 @@
 package com.google.protobuf;
 
 import com.google.protobuf.ByteString.Output;
+
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -45,7 +48,6 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Random;
-import junit.framework.TestCase;
 
 /**
  * Test methods with implementations in {@link ByteString}, plus do some top-level "integration"
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 5ea6b79..ca940ce 100644
--- a/java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java
+++ b/java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java
@@ -35,15 +35,15 @@
 import protobuf_unittest.UnittestProto.Int64Message;
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestRecursiveMessage;
+
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import junit.framework.TestCase;
 
 /**
  * Unit test for {@link CodedInputStream}.
@@ -51,84 +51,10 @@
  * @author kenton@google.com Kenton Varda
  */
 public class CodedInputStreamTest extends TestCase {
-  
-  private static final int DEFAULT_BLOCK_SIZE = 4096; 
-  
-  private enum InputType {
-    ARRAY {
-      @Override
-      CodedInputStream newDecoder(byte[] data, int blockSize) {
-        return CodedInputStream.newInstance(data);
-      }
-    },
-    NIO_HEAP {
-      @Override
-      CodedInputStream newDecoder(byte[] data, int blockSize) {
-        return CodedInputStream.newInstance(ByteBuffer.wrap(data));
-      }
-    },
-    NIO_DIRECT {
-      @Override
-      CodedInputStream newDecoder(byte[] data, int blockSize) {
-        ByteBuffer buffer = ByteBuffer.allocateDirect(data.length);
-        buffer.put(data);
-        buffer.flip();
-        return CodedInputStream.newInstance(buffer);
-      }
-    },
-    STREAM {
-      @Override
-      CodedInputStream newDecoder(byte[] data, int blockSize) {
-        return CodedInputStream.newInstance(new SmallBlockInputStream(data, blockSize));
-      }
-    },
-    ITER_DIRECT {
-      @Override
-      CodedInputStream newDecoder(byte[] data, int blockSize) {
-        if (blockSize > DEFAULT_BLOCK_SIZE) {
-          blockSize = DEFAULT_BLOCK_SIZE;
-        }
-        ArrayList <ByteBuffer> input = new ArrayList <ByteBuffer>();
-        for (int i = 0; i < data.length; i += blockSize) {
-          int rl = Math.min(blockSize, data.length - i); 
-          ByteBuffer rb = ByteBuffer.allocateDirect(rl); 
-          rb.put(data, i, rl);
-          rb.flip();
-          input.add(rb);
-        }
-        return CodedInputStream.newInstance(input);
-      }
-    },
-    STREAM_ITER_DIRECT {
-      @Override
-      CodedInputStream newDecoder(byte[] data, int blockSize) {
-        if (blockSize > DEFAULT_BLOCK_SIZE) {
-          blockSize = DEFAULT_BLOCK_SIZE;
-        }
-        ArrayList <ByteBuffer> input = new ArrayList <ByteBuffer>();
-        for (int i = 0; i < data.length; i += blockSize) {
-          int rl = Math.min(blockSize, data.length - i); 
-          ByteBuffer rb = ByteBuffer.allocateDirect(rl); 
-          rb.put(data, i, rl);
-          rb.flip();
-          input.add(rb);
-        }
-        return CodedInputStream.newInstance(new IterableByteBufferInputStream(input));
-      }
-    };
-    
-    
-
-    CodedInputStream newDecoder(byte[] data) {
-      return newDecoder(data, data.length);
-    }
-
-    abstract CodedInputStream newDecoder(byte[] data, int blockSize);
-  }
-
   /**
-   * Helper to construct a byte array from a bunch of bytes. The inputs are actually ints so that I
-   * can use hex notation and not get stupid errors about precision.
+   * Helper to construct a byte array from a bunch of bytes.  The inputs are
+   * actually ints so that I can use hex notation and not get stupid errors
+   * about precision.
    */
   private byte[] bytes(int... bytesAsInts) {
     byte[] bytes = new byte[bytesAsInts.length];
@@ -139,14 +65,19 @@
   }
 
   /**
-   * An InputStream which limits the number of bytes it reads at a time. We use this to make sure
-   * that CodedInputStream doesn't screw up when reading in small blocks.
+   * An InputStream which limits the number of bytes it reads at a time.
+   * We use this to make sure that CodedInputStream doesn't screw up when
+   * reading in small blocks.
    */
   private static final class SmallBlockInputStream extends FilterInputStream {
     private final int blockSize;
 
     public SmallBlockInputStream(byte[] data, int blockSize) {
-      super(new ByteArrayInputStream(data));
+      this(new ByteArrayInputStream(data), blockSize);
+    }
+
+    public SmallBlockInputStream(InputStream in, int blockSize) {
+      super(in);
       this.blockSize = blockSize;
     }
 
@@ -161,36 +92,54 @@
     }
   }
 
-  private void assertDataConsumed(String msg, byte[] data, CodedInputStream input)
+  private void assertDataConsumed(byte[] data, CodedInputStream input)
       throws IOException {
-    assertEquals(msg, data.length, input.getTotalBytesRead());
-    assertTrue(msg, input.isAtEnd());
+    assertEquals(data.length, input.getTotalBytesRead());
+    assertTrue(input.isAtEnd());
   }
 
   /**
-   * Parses the given bytes using readRawVarint32() and readRawVarint64() and checks that the result
-   * matches the given value.
+   * Parses the given bytes using readRawVarint32() and readRawVarint64() and
+   * checks that the result matches the given value.
    */
   private void assertReadVarint(byte[] data, long value) throws Exception {
-    for (InputType inputType : InputType.values()) {
-      // Try different block sizes.
-      for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-        CodedInputStream input = inputType.newDecoder(data, blockSize);
-        assertEquals(inputType.name(), (int) value, input.readRawVarint32());
-        assertDataConsumed(inputType.name(), data, input);
+    CodedInputStream input = CodedInputStream.newInstance(data);
+    assertEquals((int) value, input.readRawVarint32());
+    assertDataConsumed(data, input);
 
-        input = inputType.newDecoder(data, blockSize);
-        assertEquals(inputType.name(), value, input.readRawVarint64());
-        assertDataConsumed(inputType.name(), data, input);
+    input = CodedInputStream.newInstance(data);
+    assertEquals(value, input.readRawVarint64());
+    assertDataConsumed(data, input);
 
-        input = inputType.newDecoder(data, blockSize);
-        assertEquals(inputType.name(), value, input.readRawVarint64SlowPath());
-        assertDataConsumed(inputType.name(), data, input);
+    input = CodedInputStream.newInstance(data);
+    assertEquals(value, input.readRawVarint64SlowPath());
+    assertDataConsumed(data, input);
 
-        input = inputType.newDecoder(data, blockSize);
-        assertTrue(inputType.name(), input.skipField(WireFormat.WIRETYPE_VARINT));
-        assertDataConsumed(inputType.name(), data, input);
-      }
+    input = CodedInputStream.newInstance(data);
+    assertTrue(input.skipField(WireFormat.WIRETYPE_VARINT));
+    assertDataConsumed(data, input);
+
+    // Try different block sizes.
+    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
+      input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(data, blockSize));
+      assertEquals((int) value, input.readRawVarint32());
+      assertDataConsumed(data, input);
+
+      input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(data, blockSize));
+      assertEquals(value, input.readRawVarint64());
+      assertDataConsumed(data, input);
+
+      input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(data, blockSize));
+      assertEquals(value, input.readRawVarint64SlowPath());
+      assertDataConsumed(data, input);
+
+      input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(data, blockSize));
+      assertTrue(input.skipField(WireFormat.WIRETYPE_VARINT));
+      assertDataConsumed(data, input);
     }
 
     // Try reading direct from an InputStream.  We want to verify that it
@@ -204,26 +153,35 @@
   }
 
   /**
-   * Parses the given bytes using readRawVarint32() and readRawVarint64() and expects them to fail
-   * with an InvalidProtocolBufferException whose description matches the given one.
+   * Parses the given bytes using readRawVarint32() and readRawVarint64() and
+   * expects them to fail with an InvalidProtocolBufferException whose
+   * description matches the given one.
    */
-  private void assertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data)
+  private void assertReadVarintFailure(
+      InvalidProtocolBufferException expected, byte[] data)
       throws Exception {
-    for (InputType inputType : InputType.values()) {
-      try {
-        CodedInputStream input = inputType.newDecoder(data);
-        input.readRawVarint32();
-        fail(inputType.name() + ": Should have thrown an exception.");
-      } catch (InvalidProtocolBufferException e) {
-        assertEquals(inputType.name(), expected.getMessage(), e.getMessage());
-      }
-      try {
-        CodedInputStream input = inputType.newDecoder(data);
-        input.readRawVarint64();
-        fail(inputType.name() + ": Should have thrown an exception.");
-      } catch (InvalidProtocolBufferException e) {
-        assertEquals(inputType.name(), expected.getMessage(), e.getMessage());
-      }
+    CodedInputStream input = CodedInputStream.newInstance(data);
+    try {
+      input.readRawVarint32();
+      fail("Should have thrown an exception.");
+    } catch (InvalidProtocolBufferException e) {
+      assertEquals(expected.getMessage(), e.getMessage());
+    }
+
+    input = CodedInputStream.newInstance(data);
+    try {
+      input.readRawVarint64();
+      fail("Should have thrown an exception.");
+    } catch (InvalidProtocolBufferException e) {
+      assertEquals(expected.getMessage(), e.getMessage());
+    }
+
+    input = CodedInputStream.newInstance(data);
+    try {
+      input.readRawVarint64SlowPath();
+      fail("Should have thrown an exception.");
+    } catch (InvalidProtocolBufferException e) {
+      assertEquals(expected.getMessage(), e.getMessage());
     }
 
     // Make sure we get the same error when reading direct from an InputStream.
@@ -243,74 +201,72 @@
     // 14882
     assertReadVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));
     // 2961488830
-    assertReadVarint(
-        bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),
-        (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x0bL << 28));
+    assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),
+      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+      (0x0bL << 28));
 
     // 64-bit
     // 7256456126
-    assertReadVarint(
-        bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),
-        (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x1bL << 28));
+    assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),
+      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+      (0x1bL << 28));
     // 41256202580718336
     assertReadVarint(
-        bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),
-        (0x00 << 0)
-            | (0x66 << 7)
-            | (0x6b << 14)
-            | (0x1c << 21)
-            | (0x43L << 28)
-            | (0x49L << 35)
-            | (0x24L << 42)
-            | (0x49L << 49));
+      bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),
+      (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
+      (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));
     // 11964378330978735131
     assertReadVarint(
-        bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),
-        (0x1b << 0)
-            | (0x28 << 7)
-            | (0x79 << 14)
-            | (0x42 << 21)
-            | (0x3bL << 28)
-            | (0x56L << 35)
-            | (0x00L << 42)
-            | (0x05L << 49)
-            | (0x26L << 56)
-            | (0x01L << 63));
+      bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),
+      (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
+      (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |
+      (0x05L << 49) | (0x26L << 56) | (0x01L << 63));
 
     // Failures
     assertReadVarintFailure(
-        InvalidProtocolBufferException.malformedVarint(),
-        bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00));
-    assertReadVarintFailure(InvalidProtocolBufferException.truncatedMessage(), bytes(0x80));
+      InvalidProtocolBufferException.malformedVarint(),
+      bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+            0x00));
+    assertReadVarintFailure(
+      InvalidProtocolBufferException.truncatedMessage(),
+      bytes(0x80));
   }
 
   /**
-   * Parses the given bytes using readRawLittleEndian32() and checks that the result matches the
-   * given value.
+   * Parses the given bytes using readRawLittleEndian32() and checks
+   * that the result matches the given value.
    */
-  private void assertReadLittleEndian32(byte[] data, int value) throws Exception {
-    for (InputType inputType : InputType.values()) {
-      // Try different block sizes.
-      for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-        CodedInputStream input = inputType.newDecoder(data, blockSize);
-        assertEquals(inputType.name(), value, input.readRawLittleEndian32());
-        assertTrue(inputType.name(), input.isAtEnd());
-      }
+  private void assertReadLittleEndian32(byte[] data, int value)
+                                        throws Exception {
+    CodedInputStream input = CodedInputStream.newInstance(data);
+    assertEquals(value, input.readRawLittleEndian32());
+    assertTrue(input.isAtEnd());
+
+    // Try different block sizes.
+    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
+      input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(data, blockSize));
+      assertEquals(value, input.readRawLittleEndian32());
+      assertTrue(input.isAtEnd());
     }
   }
 
   /**
-   * Parses the given bytes using readRawLittleEndian64() and checks that the result matches the
-   * given value.
+   * Parses the given bytes using readRawLittleEndian64() and checks
+   * that the result matches the given value.
    */
-  private void assertReadLittleEndian64(byte[] data, long value) throws Exception {
-    for (InputType inputType : InputType.values()) {
-      // Try different block sizes.
-      for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-        CodedInputStream input = inputType.newDecoder(data, blockSize);
-        assertEquals(inputType.name(), value, input.readRawLittleEndian64());
-        assertTrue(inputType.name(), input.isAtEnd());
-      }
+  private void assertReadLittleEndian64(byte[] data, long value)
+                                        throws Exception {
+    CodedInputStream input = CodedInputStream.newInstance(data);
+    assertEquals(value, input.readRawLittleEndian64());
+    assertTrue(input.isAtEnd());
+
+    // Try different block sizes.
+    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
+      input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(data, blockSize));
+      assertEquals(value, input.readRawLittleEndian64());
+      assertTrue(input.isAtEnd());
     }
   }
 
@@ -320,32 +276,40 @@
     assertReadLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);
 
     assertReadLittleEndian64(
-        bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12), 0x123456789abcdef0L);
+      bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),
+      0x123456789abcdef0L);
     assertReadLittleEndian64(
-        bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef012345678L);
+      bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a),
+      0x9abcdef012345678L);
   }
 
   /** Test decodeZigZag32() and decodeZigZag64(). */
   public void testDecodeZigZag() throws Exception {
-    assertEquals(0, CodedInputStream.decodeZigZag32(0));
+    assertEquals( 0, CodedInputStream.decodeZigZag32(0));
     assertEquals(-1, CodedInputStream.decodeZigZag32(1));
-    assertEquals(1, CodedInputStream.decodeZigZag32(2));
+    assertEquals( 1, CodedInputStream.decodeZigZag32(2));
     assertEquals(-2, CodedInputStream.decodeZigZag32(3));
     assertEquals(0x3FFFFFFF, CodedInputStream.decodeZigZag32(0x7FFFFFFE));
     assertEquals(0xC0000000, CodedInputStream.decodeZigZag32(0x7FFFFFFF));
     assertEquals(0x7FFFFFFF, CodedInputStream.decodeZigZag32(0xFFFFFFFE));
     assertEquals(0x80000000, CodedInputStream.decodeZigZag32(0xFFFFFFFF));
 
-    assertEquals(0, CodedInputStream.decodeZigZag64(0));
+    assertEquals( 0, CodedInputStream.decodeZigZag64(0));
     assertEquals(-1, CodedInputStream.decodeZigZag64(1));
-    assertEquals(1, CodedInputStream.decodeZigZag64(2));
+    assertEquals( 1, CodedInputStream.decodeZigZag64(2));
     assertEquals(-2, CodedInputStream.decodeZigZag64(3));
-    assertEquals(0x000000003FFFFFFFL, CodedInputStream.decodeZigZag64(0x000000007FFFFFFEL));
-    assertEquals(0xFFFFFFFFC0000000L, CodedInputStream.decodeZigZag64(0x000000007FFFFFFFL));
-    assertEquals(0x000000007FFFFFFFL, CodedInputStream.decodeZigZag64(0x00000000FFFFFFFEL));
-    assertEquals(0xFFFFFFFF80000000L, CodedInputStream.decodeZigZag64(0x00000000FFFFFFFFL));
-    assertEquals(0x7FFFFFFFFFFFFFFFL, CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFEL));
-    assertEquals(0x8000000000000000L, CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFFL));
+    assertEquals(0x000000003FFFFFFFL,
+                 CodedInputStream.decodeZigZag64(0x000000007FFFFFFEL));
+    assertEquals(0xFFFFFFFFC0000000L,
+                 CodedInputStream.decodeZigZag64(0x000000007FFFFFFFL));
+    assertEquals(0x000000007FFFFFFFL,
+                 CodedInputStream.decodeZigZag64(0x00000000FFFFFFFEL));
+    assertEquals(0xFFFFFFFF80000000L,
+                 CodedInputStream.decodeZigZag64(0x00000000FFFFFFFFL));
+    assertEquals(0x7FFFFFFFFFFFFFFFL,
+                 CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFEL));
+    assertEquals(0x8000000000000000L,
+                 CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFFL));
   }
 
   /** Tests reading and parsing a whole message with every field type. */
@@ -355,12 +319,14 @@
     byte[] rawBytes = message.toByteArray();
     assertEquals(rawBytes.length, message.getSerializedSize());
 
-    for (InputType inputType : InputType.values()) {
-      // Try different block sizes.
-      for (int blockSize = 1; blockSize < 256; blockSize *= 2) {
-        TestAllTypes message2 = TestAllTypes.parseFrom(inputType.newDecoder(rawBytes, blockSize));
-        TestUtil.assertAllFieldsSet(message2);
-      }
+    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
+    TestUtil.assertAllFieldsSet(message2);
+
+    // Try different block sizes.
+    for (int blockSize = 1; blockSize < 256; blockSize *= 2) {
+      message2 = TestAllTypes.parseFrom(
+        new SmallBlockInputStream(rawBytes, blockSize));
+      TestUtil.assertAllFieldsSet(message2);
     }
   }
 
@@ -369,65 +335,57 @@
     TestAllTypes message = TestUtil.getAllSet();
     byte[] rawBytes = message.toByteArray();
 
-    InputType[] inputTypes = InputType.values();
-    CodedInputStream[] inputs = new CodedInputStream[inputTypes.length];
-    for (int i = 0; i < inputs.length; ++i) {
-      inputs[i] = inputTypes[i].newDecoder(rawBytes);
-    }
+    // Create two parallel inputs.  Parse one as unknown fields while using
+    // skipField() to skip each field on the other.  Expect the same tags.
+    CodedInputStream input1 = CodedInputStream.newInstance(rawBytes);
+    CodedInputStream input2 = CodedInputStream.newInstance(rawBytes);
     UnknownFieldSet.Builder unknownFields = UnknownFieldSet.newBuilder();
 
     while (true) {
-      CodedInputStream input1 = inputs[0];
       int tag = input1.readTag();
-      // Ensure that the rest match.
-      for (int i = 1; i < inputs.length; ++i) {
-        assertEquals(inputTypes[i].name(), tag, inputs[i].readTag());
-      }
+      assertEquals(tag, input2.readTag());
       if (tag == 0) {
         break;
       }
       unknownFields.mergeFieldFrom(tag, input1);
-      // Skip the field for the rest of the inputs.
-      for (int i = 1; i < inputs.length; ++i) {
-        inputs[i].skipField(tag);
-      }
+      input2.skipField(tag);
     }
   }
 
 
   /**
-   * Test that a bug in skipRawBytes() has been fixed: if the skip skips exactly up to a limit, this
-   * should not break things.
+   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
+   * exactly up to a limit, this should not break things.
    */
   public void testSkipRawBytesBug() throws Exception {
-    byte[] rawBytes = new byte[] {1, 2};
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(rawBytes);
-      int limit = input.pushLimit(1);
-      input.skipRawBytes(1);
-      input.popLimit(limit);
-      assertEquals(inputType.name(), 2, input.readRawByte());
-    }
+    byte[] rawBytes = new byte[] { 1, 2 };
+    CodedInputStream input = CodedInputStream.newInstance(rawBytes);
+
+    int limit = input.pushLimit(1);
+    input.skipRawBytes(1);
+    input.popLimit(limit);
+    assertEquals(2, input.readRawByte());
   }
 
   /**
-   * Test that a bug in skipRawBytes() has been fixed: if the skip skips past the end of a buffer
-   * with a limit that has been set past the end of that buffer, this should not break things.
+   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
+   * past the end of a buffer with a limit that has been set past the end of
+   * that buffer, this should not break things.
    */
   public void testSkipRawBytesPastEndOfBufferWithLimit() throws Exception {
-    byte[] rawBytes = new byte[] {1, 2, 3, 4, 5};
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(rawBytes);
-      int limit = input.pushLimit(4);
-      // In order to expose the bug we need to read at least one byte to prime the
-      // buffer inside the CodedInputStream.
-      assertEquals(inputType.name(), 1, input.readRawByte());
-      // Skip to the end of the limit.
-      input.skipRawBytes(3);
-      assertTrue(inputType.name(), input.isAtEnd());
-      input.popLimit(limit);
-      assertEquals(inputType.name(), 5, input.readRawByte());
-    }
+    byte[] rawBytes = new byte[] { 1, 2, 3, 4, 5 };
+    CodedInputStream input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(rawBytes, 3));
+
+    int limit = input.pushLimit(4);
+    // In order to expose the bug we need to read at least one byte to prime the
+    // buffer inside the CodedInputStream.
+    assertEquals(1, input.readRawByte());
+    // Skip to the end of the limit.
+    input.skipRawBytes(3);
+    assertTrue(input.isAtEnd());
+    input.popLimit(limit);
+    assertEquals(5, input.readRawByte());
   }
 
   public void testReadHugeBlob() throws Exception {
@@ -443,22 +401,19 @@
     builder.setOptionalBytes(ByteString.copyFrom(blob));
     TestAllTypes message = builder.build();
 
-    byte[] data = message.toByteArray();
-    for (InputType inputType : InputType.values()) {
-      // Serialize and parse it.  Make sure to parse from an InputStream, not
-      // directly from a ByteString, so that CodedInputStream uses buffered
-      // reading.
-      TestAllTypes message2 = TestAllTypes.parseFrom(inputType.newDecoder(data));
+    // Serialize and parse it.  Make sure to parse from an InputStream, not
+    // directly from a ByteString, so that CodedInputStream uses buffered
+    // reading.
+    TestAllTypes message2 =
+      TestAllTypes.parseFrom(message.toByteString().newInput());
 
-      assertEquals(inputType.name(), message.getOptionalBytes(), message2.getOptionalBytes());
+    assertEquals(message.getOptionalBytes(), message2.getOptionalBytes());
 
-      // Make sure all the other fields were parsed correctly.
-      TestAllTypes message3 =
-          TestAllTypes.newBuilder(message2)
-              .setOptionalBytes(TestUtil.getAllSet().getOptionalBytes())
-              .build();
-      TestUtil.assertAllFieldsSet(message3);
-    }
+    // Make sure all the other fields were parsed correctly.
+    TestAllTypes message3 = TestAllTypes.newBuilder(message2)
+      .setOptionalBytes(TestUtil.getAllSet().getOptionalBytes())
+      .build();
+    TestUtil.assertAllFieldsSet(message3);
   }
 
   public void testReadMaliciouslyLargeBlob() throws Exception {
@@ -468,95 +423,17 @@
     int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
     output.writeRawVarint32(tag);
     output.writeRawVarint32(0x7FFFFFFF);
-    output.writeRawBytes(new byte[32]); // Pad with a few random bytes.
+    output.writeRawBytes(new byte[32]);  // Pad with a few random bytes.
     output.flush();
 
-    byte[] data = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(data);
-      assertEquals(tag, input.readTag());
-      try {
-        input.readBytes();
-        fail(inputType.name() + ": Should have thrown an exception!");
-      } catch (InvalidProtocolBufferException e) {
-        // success.
-      }
-    }
-  }
+    CodedInputStream input = rawOutput.toByteString().newCodedInput();
+    assertEquals(tag, input.readTag());
 
-  /**
-   * Test we can do messages that are up to CodedInputStream#DEFAULT_SIZE_LIMIT
-   * in size (2G or Integer#MAX_SIZE).
-   * @throws IOException
-   */
-  public void testParseMessagesCloseTo2G() throws IOException {
-    byte[] serializedMessage = getBigSerializedMessage();
-    // How many of these big messages do we need to take us near our 2G limit?
-    int count = Integer.MAX_VALUE / serializedMessage.length;
-    // Now make an inputstream that will fake a near 2G message of messages
-    // returning our big serialized message 'count' times.
-    InputStream is = new RepeatingInputStream(serializedMessage, count);
-    // Parse should succeed!
-    TestAllTypes.parseFrom(is);
-  }
-
-  /**
-   * Test there is an exception if a message exceeds
-   * CodedInputStream#DEFAULT_SIZE_LIMIT in size (2G or Integer#MAX_SIZE).
-   * @throws IOException
-   */
-  public void testParseMessagesOver2G() throws IOException {
-    byte[] serializedMessage = getBigSerializedMessage();
-    // How many of these big messages do we need to take us near our 2G limit?
-    int count = Integer.MAX_VALUE / serializedMessage.length;
-    // Now add one to take us over the limit
-    count++;
-    // Now make an inputstream that will fake a near 2G message of messages
-    // returning our big serialized message 'count' times.
-    InputStream is = new RepeatingInputStream(serializedMessage, count);
     try {
-      TestAllTypes.parseFrom(is);
+      input.readBytes();
       fail("Should have thrown an exception!");
     } catch (InvalidProtocolBufferException e) {
-      assertTrue(e.getMessage().contains("too large"));
-    }
-  }
-
-  /*
-   * @return A serialized big message.
-   */
-  private static byte[] getBigSerializedMessage() {
-    byte[] value = new byte[16 * 1024 * 1024]; 
-    ByteString bsValue = ByteString.wrap(value);
-    return TestAllTypes.newBuilder().setOptionalBytes(bsValue).build().toByteArray();
-  }
-
-  /*
-   * An input stream that repeats a byte arrays' content a number of times.
-   * Simulates really large input without consuming loads of memory. Used above
-   * to test the parsing behavior when the input size exceeds 2G or close to it.
-   */
-  private static class RepeatingInputStream extends InputStream {
-    private final byte[] serializedMessage;
-    private final int count;
-    private int index = 0;
-    private int offset = 0;
-
-    RepeatingInputStream(byte[] serializedMessage, int count) {
-      this.serializedMessage = serializedMessage;
-      this.count = count;
-    }
-
-    @Override
-    public int read() throws IOException {
-      if (this.offset == this.serializedMessage.length) {
-        this.index++;
-        this.offset = 0;
-      }
-      if (this.index == this.count) {
-        return -1;
-      }
-      return this.serializedMessage[offset++];
+      // success.
     }
   }
 
@@ -564,55 +441,54 @@
     if (depth == 0) {
       return TestRecursiveMessage.newBuilder().setI(5).build();
     } else {
-      return TestRecursiveMessage.newBuilder().setA(makeRecursiveMessage(depth - 1)).build();
+      return TestRecursiveMessage.newBuilder()
+        .setA(makeRecursiveMessage(depth - 1)).build();
     }
   }
 
-  private void assertMessageDepth(String msg, TestRecursiveMessage message, int depth) {
+  private void assertMessageDepth(TestRecursiveMessage message, int depth) {
     if (depth == 0) {
-      assertFalse(msg, message.hasA());
-      assertEquals(msg, 5, message.getI());
+      assertFalse(message.hasA());
+      assertEquals(5, message.getI());
     } else {
-      assertTrue(msg, message.hasA());
-      assertMessageDepth(msg, message.getA(), depth - 1);
+      assertTrue(message.hasA());
+      assertMessageDepth(message.getA(), depth - 1);
     }
   }
 
   public void testMaliciousRecursion() throws Exception {
-    byte[] data100 = makeRecursiveMessage(100).toByteArray();
-    byte[] data101 = makeRecursiveMessage(101).toByteArray();
+    ByteString data100 = makeRecursiveMessage(100).toByteString();
+    ByteString data101 = makeRecursiveMessage(101).toByteString();
 
-    for (InputType inputType : InputType.values()) {
-      assertMessageDepth(
-          inputType.name(), TestRecursiveMessage.parseFrom(inputType.newDecoder(data100)), 100);
+    assertMessageDepth(TestRecursiveMessage.parseFrom(data100), 100);
 
-      try {
-        TestRecursiveMessage.parseFrom(inputType.newDecoder(data101));
-        fail("Should have thrown an exception!");
-      } catch (InvalidProtocolBufferException e) {
-        // success.
-      }
+    try {
+      TestRecursiveMessage.parseFrom(data101);
+      fail("Should have thrown an exception!");
+    } catch (InvalidProtocolBufferException e) {
+      // success.
+    }
 
-      CodedInputStream input = inputType.newDecoder(data100);
-      input.setRecursionLimit(8);
-      try {
-        TestRecursiveMessage.parseFrom(input);
-        fail(inputType.name() + ": Should have thrown an exception!");
-      } catch (InvalidProtocolBufferException e) {
-        // success.
-      }
+    CodedInputStream input = data100.newCodedInput();
+    input.setRecursionLimit(8);
+    try {
+      TestRecursiveMessage.parseFrom(input);
+      fail("Should have thrown an exception!");
+    } catch (InvalidProtocolBufferException e) {
+      // success.
     }
   }
 
   private void checkSizeLimitExceeded(InvalidProtocolBufferException e) {
-    assertEquals(InvalidProtocolBufferException.sizeLimitExceeded().getMessage(), e.getMessage());
+      assertEquals(
+          InvalidProtocolBufferException.sizeLimitExceeded().getMessage(),
+          e.getMessage());
   }
 
   public void testSizeLimit() throws Exception {
-    // NOTE: Size limit only applies to the stream-backed CIS.
-    CodedInputStream input =
-        CodedInputStream.newInstance(
-            new SmallBlockInputStream(TestUtil.getAllSet().toByteArray(), 16));
+    CodedInputStream input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(
+            TestUtil.getAllSet().toByteString().newInput(), 16));
     input.setSizeLimit(16);
 
     try {
@@ -624,9 +500,8 @@
   }
 
   public void testResetSizeCounter() throws Exception {
-    // NOTE: Size limit only applies to the stream-backed CIS.
-    CodedInputStream input =
-        CodedInputStream.newInstance(new SmallBlockInputStream(new byte[256], 8));
+    CodedInputStream input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(new byte[256], 8));
     input.setSizeLimit(16);
     input.readRawBytes(16);
     assertEquals(16, input.getTotalBytesRead());
@@ -640,7 +515,7 @@
 
     input.resetSizeCounter();
     assertEquals(0, input.getTotalBytesRead());
-    input.readRawByte(); // No exception thrown.
+    input.readRawByte();  // No exception thrown.
     input.resetSizeCounter();
     assertEquals(0, input.getTotalBytesRead());
     input.readRawBytes(16);
@@ -648,96 +523,20 @@
     input.resetSizeCounter();
 
     try {
-      input.readRawBytes(17); // Hits limit again.
+      input.readRawBytes(17);  // Hits limit again.
       fail("Should have thrown an exception!");
     } catch (InvalidProtocolBufferException expected) {
       checkSizeLimitExceeded(expected);
     }
   }
-  
-  public void testRefillBufferWithCorrectSize() throws Exception {
-    // NOTE: refillBuffer only applies to the stream-backed CIS.
-    byte[] bytes = "123456789".getBytes("UTF-8");
-    ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput, bytes.length);
-
-    int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-    output.writeRawVarint32(tag);
-    output.writeRawVarint32(bytes.length);
-    output.writeRawBytes(bytes);
-    output.writeRawVarint32(tag);
-    output.writeRawVarint32(bytes.length);
-    output.writeRawBytes(bytes);
-    output.writeRawByte(4);
-    output.flush();
-
-    // Input is two string with length 9 and one raw byte.
-    byte[] rawInput = rawOutput.toByteArray(); 
-    for (int inputStreamBufferLength = 8; 
-        inputStreamBufferLength <= rawInput.length + 1; inputStreamBufferLength++) {
-      CodedInputStream input = CodedInputStream.newInstance(
-              new ByteArrayInputStream(rawInput), inputStreamBufferLength);
-      input.setSizeLimit(rawInput.length - 1);
-      input.readString();
-      input.readString(); 
-      try {
-        input.readRawByte(); // Hits limit.
-        fail("Should have thrown an exception!");
-      } catch (InvalidProtocolBufferException expected) {
-        checkSizeLimitExceeded(expected);
-      }
-    }
-  }
-
-  public void testIsAtEnd() throws Exception {
-    CodedInputStream input = CodedInputStream.newInstance(
-        new ByteArrayInputStream(new byte[5]));
-    try {   
-      for (int i = 0; i < 5; i++) {
-        assertEquals(false, input.isAtEnd());
-        input.readRawByte();
-      }
-      assertEquals(true, input.isAtEnd());
-    } catch (Exception e) {
-      fail("Catch exception in the testIsAtEnd");
-    }
-  }
-
-  public void testCurrentLimitExceeded() throws Exception {
-    byte[] bytes = "123456789".getBytes("UTF-8");
-    ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput, bytes.length);
-
-    int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
-    output.writeRawVarint32(tag);
-    output.writeRawVarint32(bytes.length);
-    output.writeRawBytes(bytes);
-    output.flush();
-
-    byte[] rawInput = rawOutput.toByteArray();
-    CodedInputStream input = CodedInputStream.newInstance(
-              new ByteArrayInputStream(rawInput));
-    // The length of the whole rawInput
-    input.setSizeLimit(11);
-    // Some number that is smaller than the rawInput's length
-    // but larger than 2 
-    input.pushLimit(5);
-    try {
-      input.readString();
-      fail("Should have thrown an exception");
-    } catch (InvalidProtocolBufferException expected) {
-      assertEquals(expected.getMessage(), 
-          InvalidProtocolBufferException.truncatedMessage().getMessage());
-    }
-  }
 
   public void testSizeLimitMultipleMessages() throws Exception {
-    // NOTE: Size limit only applies to the stream-backed CIS.
     byte[] bytes = new byte[256];
     for (int i = 0; i < bytes.length; i++) {
       bytes[i] = (byte) i;
     }
-    CodedInputStream input = CodedInputStream.newInstance(new SmallBlockInputStream(bytes, 7));
+    CodedInputStream input = CodedInputStream.newInstance(
+        new SmallBlockInputStream(bytes, 7));
     input.setSizeLimit(16);
     for (int i = 0; i < 256 / 16; i++) {
       byte[] message = input.readRawBytes(16);
@@ -767,13 +566,12 @@
     output.writeRawBytes(bytes);
     output.flush();
 
-    byte[] rawInput = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(rawInput);
-      assertEquals(inputType.name(), tag, input.readTag());
-      String text = input.readString();
-      assertEquals(inputType.name(), lorem, text);
-    }
+    CodedInputStream input =
+        CodedInputStream.newInstance(
+            new ByteArrayInputStream(rawOutput.toByteString().toByteArray()));
+    assertEquals(tag, input.readTag());
+    String text = input.readString();
+    assertEquals(lorem, text);
   }
 
   public void testReadStringRequireUtf8() throws Exception {
@@ -793,18 +591,18 @@
     output.writeRawBytes(bytes);
     output.flush();
 
-    byte[] rawInput = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(rawInput);
-      assertEquals(inputType.name(), tag, input.readTag());
-      String text = input.readStringRequireUtf8();
-      assertEquals(inputType.name(), lorem, text);
-    }
+    CodedInputStream input =
+        CodedInputStream.newInstance(
+            new ByteArrayInputStream(rawOutput.toByteString().toByteArray()));
+    assertEquals(tag, input.readTag());
+    String text = input.readStringRequireUtf8();
+    assertEquals(lorem, text);
   }
 
   /**
-   * Tests that if we readString invalid UTF-8 bytes, no exception is thrown. Instead, the invalid
-   * bytes are replaced with the Unicode "replacement character" U+FFFD.
+   * Tests that if we readString invalid UTF-8 bytes, no exception
+   * is thrown.  Instead, the invalid bytes are replaced with the Unicode
+   * "replacement character" U+FFFD.
    */
   public void testReadStringInvalidUtf8() throws Exception {
     ByteString.Output rawOutput = ByteString.newOutput();
@@ -813,21 +611,18 @@
     int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
     output.writeRawVarint32(tag);
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 0x80});
+    output.writeRawBytes(new byte[] { (byte) 0x80 });
     output.flush();
 
-    byte[] rawInput = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(rawInput);
-      assertEquals(inputType.name(), tag, input.readTag());
-      String text = input.readString();
-      assertEquals(inputType.name(), 0xfffd, text.charAt(0));
-    }
+    CodedInputStream input = rawOutput.toByteString().newCodedInput();
+    assertEquals(tag, input.readTag());
+    String text = input.readString();
+    assertEquals(0xfffd, text.charAt(0));
   }
 
   /**
-   * Tests that if we readStringRequireUtf8 invalid UTF-8 bytes, an InvalidProtocolBufferException
-   * is thrown.
+   * Tests that if we readStringRequireUtf8 invalid UTF-8 bytes, an
+   * InvalidProtocolBufferException is thrown.
    */
   public void testReadStringRequireUtf8InvalidUtf8() throws Exception {
     ByteString.Output rawOutput = ByteString.newOutput();
@@ -836,20 +631,16 @@
     int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
     output.writeRawVarint32(tag);
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 0x80});
+    output.writeRawBytes(new byte[] { (byte) 0x80 });
     output.flush();
 
-    byte[] rawInput = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream input = inputType.newDecoder(rawInput);
-      assertEquals(tag, input.readTag());
-      try {
-        input.readStringRequireUtf8();
-        fail(inputType.name() + ": Expected invalid UTF-8 exception.");
-      } catch (InvalidProtocolBufferException exception) {
-        assertEquals(
-            inputType.name(), "Protocol message had invalid UTF-8.", exception.getMessage());
-      }
+    CodedInputStream input = rawOutput.toByteString().newCodedInput();
+    assertEquals(tag, input.readTag());
+    try {
+      input.readStringRequireUtf8();
+      fail("Expected invalid UTF-8 exception.");
+    } catch (InvalidProtocolBufferException exception) {
+      assertEquals("Protocol message had invalid UTF-8.", exception.getMessage());
     }
   }
 
@@ -869,17 +660,13 @@
   public void testInvalidTag() throws Exception {
     // Any tag number which corresponds to field number zero is invalid and
     // should throw InvalidProtocolBufferException.
-    for (InputType inputType : InputType.values()) {
-      for (int i = 0; i < 8; i++) {
-        try {
-          inputType.newDecoder(bytes(i)).readTag();
-          fail(inputType.name() + ": Should have thrown an exception.");
-        } catch (InvalidProtocolBufferException e) {
-          assertEquals(
-              inputType.name(),
-              InvalidProtocolBufferException.invalidTag().getMessage(),
-              e.getMessage());
-        }
+    for (int i = 0; i < 8; i++) {
+      try {
+        CodedInputStream.newInstance(bytes(i)).readTag();
+        fail("Should have thrown an exception.");
+      } catch (InvalidProtocolBufferException e) {
+        assertEquals(InvalidProtocolBufferException.invalidTag().getMessage(),
+                     e.getMessage());
       }
     }
   }
@@ -891,10 +678,10 @@
     output.writeRawVarint32(0);
     // One one-byte bytes field
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 23});
+    output.writeRawBytes(new byte[] { (byte) 23 });
     // Another one-byte bytes field
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 45});
+    output.writeRawBytes(new byte[] { (byte) 45 });
     // A bytes field large enough that won't fit into the 4K buffer.
     final int bytesLength = 16 * 1024;
     byte[] bytes = new byte[bytesLength];
@@ -904,70 +691,20 @@
     output.writeRawBytes(bytes);
 
     output.flush();
+    CodedInputStream inputStream = rawOutput.toByteString().newCodedInput();
 
-    byte[] rawInput = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream inputStream = inputType.newDecoder(rawInput);
-
-      byte[] result = inputStream.readByteArray();
-      assertEquals(inputType.name(), 0, result.length);
-      result = inputStream.readByteArray();
-      assertEquals(inputType.name(), 1, result.length);
-      assertEquals(inputType.name(), (byte) 23, result[0]);
-      result = inputStream.readByteArray();
-      assertEquals(inputType.name(), 1, result.length);
-      assertEquals(inputType.name(), (byte) 45, result[0]);
-      result = inputStream.readByteArray();
-      assertEquals(inputType.name(), bytesLength, result.length);
-      assertEquals(inputType.name(), (byte) 67, result[0]);
-      assertEquals(inputType.name(), (byte) 89, result[bytesLength - 1]);
-    }
-  }
-
-  public void testReadLargeByteStringFromInputStream() throws Exception {
-    byte[] bytes = new byte[1024 * 1024];
-    for (int i = 0; i < bytes.length; i++) {
-      bytes[i] = (byte) (i & 0xFF);
-    }
-    ByteString.Output rawOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-    output.writeRawVarint32(bytes.length);
-    output.writeRawBytes(bytes);
-    output.flush();
-    byte[] data = rawOutput.toByteString().toByteArray();
-
-    CodedInputStream input = CodedInputStream.newInstance(
-        new ByteArrayInputStream(data) {
-          @Override
-          public synchronized int available() {
-            return 0;
-          }
-        });
-    ByteString result = input.readBytes();
-    assertEquals(ByteString.copyFrom(bytes), result);
-  }
-
-  public void testReadLargeByteArrayFromInputStream() throws Exception {
-    byte[] bytes = new byte[1024 * 1024];
-    for (int i = 0; i < bytes.length; i++) {
-      bytes[i] = (byte) (i & 0xFF);
-    }
-    ByteString.Output rawOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);
-    output.writeRawVarint32(bytes.length);
-    output.writeRawBytes(bytes);
-    output.flush();
-    byte[] data = rawOutput.toByteString().toByteArray();
-
-    CodedInputStream input = CodedInputStream.newInstance(
-        new ByteArrayInputStream(data) {
-          @Override
-          public synchronized int available() {
-            return 0;
-          }
-        });
-    byte[] result = input.readByteArray();
-    assertTrue(Arrays.equals(bytes, result));
+    byte[] result = inputStream.readByteArray();
+    assertEquals(0, result.length);
+    result = inputStream.readByteArray();
+    assertEquals(1, result.length);
+    assertEquals((byte) 23, result[0]);
+    result = inputStream.readByteArray();
+    assertEquals(1, result.length);
+    assertEquals((byte) 45, result[0]);
+    result = inputStream.readByteArray();
+    assertEquals(bytesLength, result.length);
+    assertEquals((byte) 67, result[0]);
+    assertEquals((byte) 89, result[bytesLength - 1]);
   }
 
   public void testReadByteBuffer() throws Exception {
@@ -977,10 +714,10 @@
     output.writeRawVarint32(0);
     // One one-byte bytes field
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 23});
+    output.writeRawBytes(new byte[]{(byte) 23});
     // Another one-byte bytes field
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 45});
+    output.writeRawBytes(new byte[]{(byte) 45});
     // A bytes field large enough that won't fit into the 4K buffer.
     final int bytesLength = 16 * 1024;
     byte[] bytes = new byte[bytesLength];
@@ -990,25 +727,21 @@
     output.writeRawBytes(bytes);
 
     output.flush();
+    CodedInputStream inputStream = rawOutput.toByteString().newCodedInput();
 
-    byte[] rawInput = rawOutput.toByteString().toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream inputStream = inputType.newDecoder(rawInput);
-
-      ByteBuffer result = inputStream.readByteBuffer();
-      assertEquals(inputType.name(), 0, result.capacity());
-      result = inputStream.readByteBuffer();
-      assertEquals(inputType.name(), 1, result.capacity());
-      assertEquals(inputType.name(), (byte) 23, result.get());
-      result = inputStream.readByteBuffer();
-      assertEquals(inputType.name(), 1, result.capacity());
-      assertEquals(inputType.name(), (byte) 45, result.get());
-      result = inputStream.readByteBuffer();
-      assertEquals(inputType.name(), bytesLength, result.capacity());
-      assertEquals(inputType.name(), (byte) 67, result.get());
-      result.position(bytesLength - 1);
-      assertEquals(inputType.name(), (byte) 89, result.get());
-    }
+    ByteBuffer result = inputStream.readByteBuffer();
+    assertEquals(0, result.capacity());
+    result = inputStream.readByteBuffer();
+    assertEquals(1, result.capacity());
+    assertEquals((byte) 23, result.get());
+    result = inputStream.readByteBuffer();
+    assertEquals(1, result.capacity());
+    assertEquals((byte) 45, result.get());
+    result = inputStream.readByteBuffer();
+    assertEquals(bytesLength, result.capacity());
+    assertEquals((byte) 67, result.get());
+    result.position(bytesLength - 1);
+    assertEquals((byte) 89, result.get());
   }
 
   public void testReadByteBufferAliasing() throws Exception {
@@ -1018,10 +751,10 @@
     output.writeRawVarint32(0);
     // One one-byte bytes field
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 23});
+    output.writeRawBytes(new byte[]{(byte) 23});
     // Another one-byte bytes field
     output.writeRawVarint32(1);
-    output.writeRawBytes(new byte[] {(byte) 45});
+    output.writeRawBytes(new byte[]{(byte) 45});
     // A bytes field large enough that won't fit into the 4K buffer.
     final int bytesLength = 16 * 1024;
     byte[] bytes = new byte[bytesLength];
@@ -1030,107 +763,59 @@
     output.writeRawVarint32(bytesLength);
     output.writeRawBytes(bytes);
     output.flush();
-
     byte[] data = byteArrayStream.toByteArray();
 
-    for (InputType inputType : InputType.values()) {
-      if (inputType == InputType.STREAM 
-          || inputType == InputType.STREAM_ITER_DIRECT 
-          || inputType == InputType.ITER_DIRECT) {
-        // Aliasing doesn't apply to stream-backed CIS.
-        continue;
-      }
+    // Without aliasing
+    CodedInputStream inputStream = CodedInputStream.newInstance(data);
+    ByteBuffer result = inputStream.readByteBuffer();
+    assertEquals(0, result.capacity());
+    result = inputStream.readByteBuffer();
+    assertTrue(result.array() != data);
+    assertEquals(1, result.capacity());
+    assertEquals((byte) 23, result.get());
+    result = inputStream.readByteBuffer();
+    assertTrue(result.array() != data);
+    assertEquals(1, result.capacity());
+    assertEquals((byte) 45, result.get());
+    result = inputStream.readByteBuffer();
+    assertTrue(result.array() != data);
+    assertEquals(bytesLength, result.capacity());
+    assertEquals((byte) 67, result.get());
+    result.position(bytesLength - 1);
+    assertEquals((byte) 89, result.get());
 
-      // Without aliasing
-      CodedInputStream inputStream = inputType.newDecoder(data);
-      ByteBuffer result = inputStream.readByteBuffer();
-      assertEquals(inputType.name(), 0, result.capacity());
-      result = inputStream.readByteBuffer();
-      assertTrue(inputType.name(), result.array() != data);
-      assertEquals(inputType.name(), 1, result.capacity());
-      assertEquals(inputType.name(), (byte) 23, result.get());
-      result = inputStream.readByteBuffer();
-      assertTrue(inputType.name(), result.array() != data);
-      assertEquals(inputType.name(), 1, result.capacity());
-      assertEquals(inputType.name(), (byte) 45, result.get());
-      result = inputStream.readByteBuffer();
-      assertTrue(inputType.name(), result.array() != data);
-      assertEquals(inputType.name(), bytesLength, result.capacity());
-      assertEquals(inputType.name(), (byte) 67, result.get());
-      result.position(bytesLength - 1);
-      assertEquals(inputType.name(), (byte) 89, result.get());
-
-      // Enable aliasing
-      inputStream = inputType.newDecoder(data, data.length);
-      inputStream.enableAliasing(true);
-      result = inputStream.readByteBuffer();
-      assertEquals(inputType.name(), 0, result.capacity());
-      result = inputStream.readByteBuffer();
-      if (result.hasArray()) {
-        assertTrue(inputType.name(), result.array() == data);
-      }
-      assertEquals(inputType.name(), 1, result.capacity());
-      assertEquals(inputType.name(), (byte) 23, result.get());
-      result = inputStream.readByteBuffer();
-      if (result.hasArray()) {
-        assertTrue(inputType.name(), result.array() == data);
-      }
-      assertEquals(inputType.name(), 1, result.capacity());
-      assertEquals(inputType.name(), (byte) 45, result.get());
-      result = inputStream.readByteBuffer();
-      if (result.hasArray()) {
-        assertTrue(inputType.name(), result.array() == data);
-      }
-      assertEquals(inputType.name(), bytesLength, result.capacity());
-      assertEquals(inputType.name(), (byte) 67, result.get());
-      result.position(bytesLength - 1);
-      assertEquals(inputType.name(), (byte) 89, result.get());
-    }
+    // Enable aliasing
+    inputStream = CodedInputStream.newInstance(data);
+    inputStream.enableAliasing(true);
+    result = inputStream.readByteBuffer();
+    assertEquals(0, result.capacity());
+    result = inputStream.readByteBuffer();
+    assertTrue(result.array() == data);
+    assertEquals(1, result.capacity());
+    assertEquals((byte) 23, result.get());
+    result = inputStream.readByteBuffer();
+    assertTrue(result.array() == data);
+    assertEquals(1, result.capacity());
+    assertEquals((byte) 45, result.get());
+    result = inputStream.readByteBuffer();
+    assertTrue(result.array() == data);
+    assertEquals(bytesLength, result.capacity());
+    assertEquals((byte) 67, result.get());
+    result.position(bytesLength - 1);
+    assertEquals((byte) 89, result.get());
   }
 
   public void testCompatibleTypes() throws Exception {
     long data = 0x100000000L;
     Int64Message message = Int64Message.newBuilder().setData(data).build();
-    byte[] serialized = message.toByteArray();
-    for (InputType inputType : InputType.values()) {
-      CodedInputStream inputStream = inputType.newDecoder(serialized);
+    ByteString serialized = message.toByteString();
 
-      // Test int64(long) is compatible with bool(boolean)
-      BoolMessage msg2 = BoolMessage.parseFrom(inputStream);
-      assertTrue(msg2.getData());
+    // Test int64(long) is compatible with bool(boolean)
+    BoolMessage msg2 = BoolMessage.parseFrom(serialized);
+    assertTrue(msg2.getData());
 
-      // Test int64(long) is compatible with int32(int)
-      inputStream = inputType.newDecoder(serialized);
-      Int32Message msg3 = Int32Message.parseFrom(inputStream);
-      assertEquals((int) data, msg3.getData());
-    }
-  }
-
-  public void testSkipInvalidVarint_FastPath() throws Exception {
-    // Fast path: We have >= 10 bytes available. Ensure we properly recognize a non-ending varint.
-    byte[] data = new byte[] {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0};
-    for (InputType inputType : InputType.values()) {
-      try {
-        CodedInputStream input = inputType.newDecoder(data);
-        input.skipField(WireFormat.makeTag(1, WireFormat.WIRETYPE_VARINT));
-        fail(inputType.name() + ": Should have thrown an exception.");
-      } catch (InvalidProtocolBufferException e) {
-        // Expected
-      }
-    }
-  }
-
-  public void testSkipInvalidVarint_SlowPath() throws Exception {
-    // Slow path: < 10 bytes available. Ensure we properly recognize a non-ending varint.
-    byte[] data = new byte[] {-1, -1, -1, -1, -1, -1, -1, -1, -1};
-    for (InputType inputType : InputType.values()) {
-      try {
-        CodedInputStream input = inputType.newDecoder(data);
-        input.skipField(WireFormat.makeTag(1, WireFormat.WIRETYPE_VARINT));
-        fail(inputType.name() + ": Should have thrown an exception.");
-      } catch (InvalidProtocolBufferException e) {
-        // Expected
-      }
-    }
+    // Test int64(long) is compatible with int32(int)
+    Int32Message msg3 = Int32Message.parseFrom(serialized);
+    assertEquals((int) data, msg3.getData());
   }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java b/java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java
index 78f415c..33aa435 100644
--- a/java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java
+++ b/java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java
@@ -35,13 +35,15 @@
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
 import protobuf_unittest.UnittestProto.TestSparseEnum;
+
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Unit test for {@link CodedOutputStream}.
@@ -149,21 +151,16 @@
     private final int initialPosition;
     private final CodedOutputStream stream;
     private final ByteBuffer buffer;
-    private final boolean unsafe;
 
-    NioDirectCoder(int size, boolean unsafe) {
-      this(size, 0, unsafe);
+    NioDirectCoder(int size) {
+      this(size, 0);
     }
 
-    NioDirectCoder(int size, int initialPosition, boolean unsafe) {
-      this.unsafe = unsafe;
+    NioDirectCoder(int size, int initialPosition) {
       this.initialPosition = initialPosition;
       buffer = ByteBuffer.allocateDirect(size);
       buffer.position(initialPosition);
-      stream =
-          unsafe
-              ? CodedOutputStream.newUnsafeInstance(buffer)
-              : CodedOutputStream.newSafeInstance(buffer);
+      stream = CodedOutputStream.newInstance(buffer);
     }
 
     @Override
@@ -184,7 +181,7 @@
 
     @Override
     public OutputType getOutputType() {
-      return unsafe ? OutputType.NIO_DIRECT_SAFE : OutputType.NIO_DIRECT_UNSAFE;
+      return OutputType.NIO_DIRECT;
     }
   }
 
@@ -201,16 +198,10 @@
         return new NioHeapCoder(size);
       }
     },
-    NIO_DIRECT_SAFE() {
+    NIO_DIRECT() {
       @Override
       Coder newCoder(int size) {
-        return new NioDirectCoder(size, false);
-      }
-    },
-    NIO_DIRECT_UNSAFE() {
-      @Override
-      Coder newCoder(int size) {
-        return new NioDirectCoder(size, true);
+        return new NioDirectCoder(size);
       }
     },
     STREAM() {
@@ -398,7 +389,6 @@
         != CodedOutputStream.computeUInt32SizeNoTag(string.length() * Utf8.MAX_BYTES_PER_CHAR));
 
     coder.stream().writeStringNoTag(string);
-    coder.stream().flush();
     int stringSize = CodedOutputStream.computeStringSizeNoTag(string);
 
     // Verify that the total bytes written is correct
@@ -488,12 +478,11 @@
 
   public void testWriteByteArrayWithOffsets() throws Exception {
     byte[] fullArray = bytes(0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88);
-    for (OutputType type : new OutputType[] {OutputType.ARRAY}) {
-      Coder coder = type.newCoder(4);
-      coder.stream().writeByteArrayNoTag(fullArray, 2, 2);
-      assertEqualBytes(type, bytes(0x02, 0x33, 0x44), coder.toByteArray());
-      assertEquals(3, coder.stream().getTotalBytesWritten());
-    }
+    byte[] destination = new byte[4];
+    CodedOutputStream codedStream = CodedOutputStream.newInstance(destination);
+    codedStream.writeByteArrayNoTag(fullArray, 2, 2);
+    assertEqualBytes(OutputType.ARRAY, bytes(0x02, 0x33, 0x44, 0x00), destination);
+    assertEquals(3, codedStream.getTotalBytesWritten());
   }
 
   public void testSerializeUtf8_MultipleSmallWrites() throws Exception {
@@ -572,12 +561,7 @@
     // Tag is one byte, varint describing string length is 1 byte, string length is 9 bytes.
     // An array of size 1 will cause a failure when trying to write the varint.
     for (OutputType outputType :
-        new OutputType[] {
-          OutputType.ARRAY,
-          OutputType.NIO_HEAP,
-          OutputType.NIO_DIRECT_SAFE,
-          OutputType.NIO_DIRECT_UNSAFE
-        }) {
+        new OutputType[] {OutputType.ARRAY, OutputType.NIO_HEAP, OutputType.NIO_DIRECT}) {
       for (int i = 0; i < 11; i++) {
         Coder coder = outputType.newCoder(i);
         try {
@@ -615,13 +599,10 @@
 
   public void testNioEncodersWithInitialOffsets() throws Exception {
     String value = "abc";
-    for (Coder coder :
-        new Coder[] {
-          new NioHeapCoder(10, 2), new NioDirectCoder(10, 2, false), new NioDirectCoder(10, 2, true)
-        }) {
+    for (Coder coder : new Coder[] {new NioHeapCoder(10, 2), new NioDirectCoder(10, 2)}) {
       coder.stream().writeStringNoTag(value);
       coder.stream().flush();
-      assertEqualBytes(coder.getOutputType(), new byte[] {3, 'a', 'b', 'c'}, coder.toByteArray());
+      assertEqualBytes(coder.getOutputType(), new byte[]{3, 'a', 'b', 'c'}, coder.toByteArray());
     }
   }
 
diff --git a/java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java b/java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java
index 2c272a7..ce85ae2 100644
--- a/java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java
+++ b/java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java
@@ -31,9 +31,11 @@
 package com.google.protobuf;
 
 import protobuf_unittest.UnittestProto.TestDeprecatedFields;
+
+import junit.framework.TestCase;
+
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
-import junit.framework.TestCase;
 
 /**
  * Test field deprecation
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 b60cd62..ef89b38 100644
--- a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
+++ b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
@@ -55,15 +55,15 @@
 import protobuf_unittest.UnittestProto.TestAllExtensions;
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
-import protobuf_unittest.UnittestProto.TestJsonName;
 import protobuf_unittest.UnittestProto.TestMultipleExtensionRanges;
 import protobuf_unittest.UnittestProto.TestRequired;
 import protobuf_unittest.UnittestProto.TestReservedFields;
 import protobuf_unittest.UnittestProto.TestService;
+import junit.framework.TestCase;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Unit test for {@link Descriptors}.
@@ -382,14 +382,6 @@
     assertEquals(Long.valueOf(8765432109L),
       field.getOptions().getExtension(UnittestCustomOptions.fieldOpt1));
 
-    OneofDescriptor oneof = descriptor.getOneofs().get(0);
-    assertNotNull(oneof);
-
-    assertTrue(
-      oneof.getOptions().hasExtension(UnittestCustomOptions.oneofOpt1));
-    assertEquals(Integer.valueOf(-99),
-      oneof.getOptions().getExtension(UnittestCustomOptions.oneofOpt1));
-
     EnumDescriptor enumType =
       UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor();
 
@@ -805,15 +797,4 @@
     Descriptors.FileDescriptor.buildFrom(
         fileDescriptorProto, new FileDescriptor[0]);
   }
-
-  public void testFieldJsonName() throws Exception {
-    Descriptor d = TestJsonName.getDescriptor();
-    assertEquals(6, d.getFields().size());
-    assertEquals("fieldName1", d.getFields().get(0).getJsonName());
-    assertEquals("fieldName2", d.getFields().get(1).getJsonName());
-    assertEquals("FieldName3", d.getFields().get(2).getJsonName());
-    assertEquals("FieldName4", d.getFields().get(3).getJsonName());
-    assertEquals("FIELDNAME5", d.getFields().get(4).getJsonName());
-    assertEquals("@type", d.getFields().get(5).getJsonName());
-  }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/DiscardUnknownFieldsTest.java b/java/core/src/test/java/com/google/protobuf/DiscardUnknownFieldsTest.java
deleted file mode 100644
index 0f09a51..0000000
--- a/java/core/src/test/java/com/google/protobuf/DiscardUnknownFieldsTest.java
+++ /dev/null
@@ -1,157 +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 org.junit.Assert.assertEquals;
-
-import protobuf_unittest.UnittestProto;
-import proto3_unittest.UnittestProto3;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Unit tests for discard or preserve unknown fields. */
-@RunWith(JUnit4.class)
-public class DiscardUnknownFieldsTest {
-  @Test
-  public void testProto2() throws Exception {
-    testProto2Message(
-          UnittestProto.TestEmptyMessage.getDefaultInstance());
-    testProto2Message(
-          UnittestProto.TestEmptyMessageWithExtensions.getDefaultInstance());
-    testProto2Message(
-          DynamicMessage.getDefaultInstance(UnittestProto.TestEmptyMessage.getDescriptor()));
-    testProto2Message(
-          DynamicMessage.getDefaultInstance(
-              UnittestProto.TestEmptyMessageWithExtensions.getDescriptor()));
-  }
-
-  @Test
-  public void testProto3() throws Exception {
-    testProto3Message(UnittestProto3.TestEmptyMessage.getDefaultInstance());
-    testProto3Message(
-        DynamicMessage.getDefaultInstance(UnittestProto3.TestEmptyMessage.getDescriptor()));
-  }
-
-  private static void testProto2Message(Message message) throws Exception {
-    assertUnknownFieldsDefaultPreserved(message);
-    assertUnknownFieldsExplicitlyDiscarded(message);
-    assertReuseCodedInputStreamPreserve(message);
-    assertUnknownFieldsInUnknownFieldSetArePreserve(message);
-  }
-
-  private static void testProto3Message(Message message) throws Exception {
-    CodedInputStream.setProto3KeepUnknownsByDefaultForTest();
-    assertUnknownFieldsDefaultPreserved(message);
-    assertUnknownFieldsExplicitlyDiscarded(message);
-    assertReuseCodedInputStreamPreserve(message);
-    assertUnknownFieldsInUnknownFieldSetArePreserve(message);
-    CodedInputStream.setProto3DiscardUnknownsByDefaultForTest();
-    assertUnknownFieldsDefaultDiscarded(message);
-    assertUnknownFieldsExplicitlyDiscarded(message);
-    assertUnknownFieldsInUnknownFieldSetAreDiscarded(message);
-  }
-
-  private static void assertReuseCodedInputStreamPreserve(Message message) throws Exception {
-    final int messageSize = payload.size();
-    byte[] copied = new byte[messageSize * 2];
-    payload.copyTo(copied, 0);
-    payload.copyTo(copied, messageSize);
-    CodedInputStream input = CodedInputStream.newInstance(copied);
-    {
-      // Use DiscardUnknownFieldsParser to parse the first payload.
-      int oldLimit = input.pushLimit(messageSize);
-      Message parsed = DiscardUnknownFieldsParser.wrap(message.getParserForType()).parseFrom(input);
-      assertEquals(message.getClass().getName(), 0, parsed.getSerializedSize());
-      input.popLimit(oldLimit);
-    }
-    {
-      // Use the normal parser to parse the remaining payload should have unknown fields preserved.
-      Message parsed = message.getParserForType().parseFrom(input);
-      assertEquals(message.getClass().getName(), payload, parsed.toByteString());
-    }
-  }
-
-  /**
-   * {@link Message.Builder#setUnknownFields(UnknownFieldSet)} and {@link
-   * Message.Builder#mergeUnknownFields(UnknownFieldSet)} should preserve the unknown fields.
-   */
-  private static void assertUnknownFieldsInUnknownFieldSetArePreserve(Message message)
-      throws Exception {
-    UnknownFieldSet unknownFields = UnknownFieldSet.newBuilder().mergeFrom(payload).build();
-    Message built = message.newBuilderForType().setUnknownFields(unknownFields).build();
-    assertEquals(message.getClass().getName(), payload, built.toByteString());
-
-  }
-  /**
-   * {@link Message.Builder#setUnknownFields(UnknownFieldSet)} and {@link
-   * Message.Builder#mergeUnknownFields(UnknownFieldSet)} should discard the unknown fields.
-   */
-  private static void assertUnknownFieldsInUnknownFieldSetAreDiscarded(Message message)
-      throws Exception {
-    UnknownFieldSet unknownFields = UnknownFieldSet.newBuilder().mergeFrom(payload).build();
-    Message built = message.newBuilderForType().setUnknownFields(unknownFields).build();
-    assertEquals(message.getClass().getName(), 0, built.getSerializedSize());
-  }
-
-  private static void assertUnknownFieldsDefaultPreserved(MessageLite message) throws Exception {
-    {
-      MessageLite parsed = message.getParserForType().parseFrom(payload);
-      assertEquals(message.getClass().getName(), payload, parsed.toByteString());
-    }
-
-    {
-      MessageLite parsed = message.newBuilderForType().mergeFrom(payload).build();
-      assertEquals(message.getClass().getName(), payload, parsed.toByteString());
-    }
-  }
-
-  private static void assertUnknownFieldsDefaultDiscarded(MessageLite message) throws Exception {
-    {
-      MessageLite parsed = message.getParserForType().parseFrom(payload);
-      assertEquals(message.getClass().getName(), 0, parsed.getSerializedSize());
-    }
-
-    {
-      MessageLite parsed = message.newBuilderForType().mergeFrom(payload).build();
-      assertEquals(message.getClass().getName(), 0, parsed.getSerializedSize());
-    }
-  }
-
-  private static void assertUnknownFieldsExplicitlyDiscarded(Message message) throws Exception {
-    Message parsed =
-        DiscardUnknownFieldsParser.wrap(message.getParserForType()).parseFrom(payload);
-    assertEquals(message.getClass().getName(), 0, parsed.getSerializedSize());
-  }
-
-  private static final ByteString payload =
-      TestUtilLite.getAllLiteSetBuilder().build().toByteString();
-}
diff --git a/java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java b/java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java
index d894279..85b418c 100644
--- a/java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java
@@ -32,47 +32,47 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link DoubleArrayList}.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
 public class DoubleArrayListTest extends TestCase {
-
-  private static final DoubleArrayList UNARY_LIST =
-      newImmutableDoubleArrayList(1);
+  
+  private static final DoubleArrayList UNARY_LIST = newImmutableDoubleArrayList(1);
   private static final DoubleArrayList TERTIARY_LIST =
       newImmutableDoubleArrayList(1, 2, 3);
-
+  
   private DoubleArrayList list;
-
+  
   @Override
   protected void setUp() throws Exception {
     list = new DoubleArrayList();
   }
-
+  
   public void testEmptyListReturnsSameInstance() {
     assertSame(DoubleArrayList.emptyList(), DoubleArrayList.emptyList());
   }
-
+  
   public void testEmptyListIsImmutable() {
     assertImmutable(DoubleArrayList.emptyList());
   }
-
+  
   public void testMakeImmutable() {
-    list.addDouble(3);
+    list.addDouble(2);
     list.addDouble(4);
-    list.addDouble(5);
-    list.addDouble(7);
+    list.addDouble(6);
+    list.addDouble(8);
     list.makeImmutable();
     assertImmutable(list);
   }
-
+  
   public void testModificationWithIteration() {
     list.addAll(asList(1D, 2D, 3D, 4D));
     Iterator<Double> iterator = list.iterator();
@@ -81,7 +81,7 @@
     assertEquals(1D, (double) iterator.next());
     list.set(0, 1D);
     assertEquals(2D, (double) iterator.next());
-
+    
     list.remove(0);
     try {
       iterator.next();
@@ -89,7 +89,7 @@
     } catch (ConcurrentModificationException e) {
       // expected
     }
-
+    
     iterator = list.iterator();
     list.add(0, 0D);
     try {
@@ -99,19 +99,19 @@
       // expected
     }
   }
-
+  
   public void testGet() {
     assertEquals(1D, (double) TERTIARY_LIST.get(0));
     assertEquals(2D, (double) TERTIARY_LIST.get(1));
     assertEquals(3D, (double) TERTIARY_LIST.get(2));
-
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -119,19 +119,19 @@
       // expected
     }
   }
-
-  public void testGetDouble() {
+  
+  public void testGetInt() {
     assertEquals(1D, TERTIARY_LIST.getDouble(0));
     assertEquals(2D, TERTIARY_LIST.getDouble(1));
     assertEquals(3D, TERTIARY_LIST.getDouble(2));
-
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -139,35 +139,35 @@
       // expected
     }
   }
-
+  
   public void testSize() {
     assertEquals(0, DoubleArrayList.emptyList().size());
     assertEquals(1, UNARY_LIST.size());
     assertEquals(3, TERTIARY_LIST.size());
 
-    list.addDouble(3);
+    list.addDouble(2);
     list.addDouble(4);
     list.addDouble(6);
     list.addDouble(8);
     assertEquals(4, list.size());
-
+    
     list.remove(0);
     assertEquals(3, list.size());
-
-    list.add(17D);
+    
+    list.add(16D);
     assertEquals(4, list.size());
   }
-
+  
   public void testSet() {
     list.addDouble(2);
     list.addDouble(4);
-
-    assertEquals(2D, (double) list.set(0, 3D));
-    assertEquals(3D, list.getDouble(0));
+    
+    assertEquals(2D, (double) list.set(0, 0D));
+    assertEquals(0D, list.getDouble(0));
 
     assertEquals(4D, (double) list.set(1, 0D));
     assertEquals(0D, list.getDouble(1));
-
+    
     try {
       list.set(-1, 0D);
       fail();
@@ -182,17 +182,17 @@
       // expected
     }
   }
-
-  public void testSetDouble() {
-    list.addDouble(1);
-    list.addDouble(3);
-
-    assertEquals(1D, list.setDouble(0, 0));
+  
+  public void testSetInt() {
+    list.addDouble(2);
+    list.addDouble(4);
+    
+    assertEquals(2D, list.setDouble(0, 0));
     assertEquals(0D, list.getDouble(0));
 
-    assertEquals(3D, list.setDouble(1, 0));
+    assertEquals(4D, list.setDouble(1, 0));
     assertEquals(0D, list.getDouble(1));
-
+    
     try {
       list.setDouble(-1, 0);
       fail();
@@ -207,7 +207,7 @@
       // expected
     }
   }
-
+  
   public void testAdd() {
     assertEquals(0, list.size());
 
@@ -217,31 +217,29 @@
     assertTrue(list.add(3D));
     list.add(0, 4D);
     assertEquals(asList(4D, 2D, 3D), list);
-
+    
     list.add(0, 1D);
     list.add(0, 0D);
     // Force a resize by getting up to 11 elements.
     for (int i = 0; i < 6; i++) {
       list.add(Double.valueOf(5 + i));
     }
-    assertEquals(
-        asList(0D, 1D, 4D, 2D, 3D, 5D, 6D, 7D, 8D, 9D, 10D),
-        list);
-
+    assertEquals(asList(0D, 1D, 4D, 2D, 3D, 5D, 6D, 7D, 8D, 9D, 10D), list);
+    
     try {
       list.add(-1, 5D);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.add(4, 5D);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
-  public void testAddDouble() {
+  
+  public void testAddInt() {
     assertEquals(0, list.size());
 
     list.addDouble(2);
@@ -250,7 +248,7 @@
     list.addDouble(3);
     assertEquals(asList(2D, 3D), list);
   }
-
+  
   public void testAddAll() {
     assertEquals(0, list.size());
 
@@ -258,17 +256,17 @@
     assertEquals(1, list.size());
     assertEquals(1D, (double) list.get(0));
     assertEquals(1D, list.getDouble(0));
-
+    
     assertTrue(list.addAll(asList(2D, 3D, 4D, 5D, 6D)));
     assertEquals(asList(1D, 2D, 3D, 4D, 5D, 6D), list);
-
+    
     assertTrue(list.addAll(TERTIARY_LIST));
     assertEquals(asList(1D, 2D, 3D, 4D, 5D, 6D, 1D, 2D, 3D), list);
 
     assertFalse(list.addAll(Collections.<Double>emptyList()));
     assertFalse(list.addAll(DoubleArrayList.emptyList()));
   }
-
+  
   public void testRemove() {
     list.addAll(TERTIARY_LIST);
     assertEquals(1D, (double) list.remove(0));
@@ -282,96 +280,96 @@
 
     assertEquals(2D, (double) list.remove(0));
     assertEquals(asList(), list);
-
+    
     try {
       list.remove(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.remove(0);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   private void assertImmutable(DoubleArrayList list) {
     if (list.contains(1D)) {
       throw new RuntimeException("Cannot test the immutability of lists that contain 1.");
     }
-
+    
     try {
       list.add(1D);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.add(0, 1D);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.<Double>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.singletonList(1D));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(new DoubleArrayList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.singleton(1D));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.<Double>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addDouble(0);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.clear();
       fail();
@@ -385,28 +383,28 @@
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.remove(new Object());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.<Double>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.singleton(1D));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(UNARY_LIST);
       fail();
@@ -420,28 +418,28 @@
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.singleton(1D));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.set(0, 0D);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.setDouble(0, 0);
       fail();
@@ -449,7 +447,7 @@
       // expected
     }
   }
-
+  
   private static DoubleArrayList newImmutableDoubleArrayList(double... elements) {
     DoubleArrayList list = new DoubleArrayList();
     for (double element : elements) {
diff --git a/java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java b/java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java
index 77d14f6..8f3a74c 100644
--- a/java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java
+++ b/java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java
@@ -37,9 +37,11 @@
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestEmptyMessage;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
-import java.util.Arrays;
+
 import junit.framework.TestCase;
 
+import java.util.Arrays;
+
 /**
  * Unit test for {@link DynamicMessage}.  See also {@link MessageTest}, which
  * tests some {@link DynamicMessage} functionality.
diff --git a/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java b/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java
deleted file mode 100644
index 6157e58..0000000
--- a/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java
+++ /dev/null
@@ -1,276 +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 protobuf_unittest.NonNestedExtension;
-import protobuf_unittest.NonNestedExtensionLite;
-import java.lang.reflect.Method;
-import java.net.URLClassLoader;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Tests for {@link ExtensionRegistryFactory} and the {@link ExtensionRegistry} instances it
- * creates.
- *
- * <p>This test simulates the runtime behaviour of the ExtensionRegistryFactory by delegating test
- * definitions to two inner classes {@link InnerTest} and {@link InnerLiteTest}, the latter of
- * which is executed using a custom ClassLoader, simulating the ProtoLite environment.
- *
- * <p>The test mechanism employed here is based on the pattern in
- * {@code com.google.common.util.concurrent.AbstractFutureFallbackAtomicHelperTest}
- */
-public class ExtensionRegistryFactoryTest extends TestCase {
-
-  // A classloader which blacklists some non-Lite classes.
-  private static final ClassLoader LITE_CLASS_LOADER = getLiteOnlyClassLoader();
-
-  /**
-   * Defines the set of test methods which will be run.
-   */
-  static interface RegistryTests {
-    void testCreate();
-    void testEmpty();
-    void testIsFullRegistry();
-    void testAdd();
-    void testAdd_immutable();
-  }
-
-  /**
-   * Test implementations for the non-Lite usage of ExtensionRegistryFactory.
-   */
-  public static class InnerTest implements RegistryTests {
-
-    @Override
-    public void testCreate() {
-      ExtensionRegistryLite registry = ExtensionRegistryFactory.create();
-
-      assertEquals(registry.getClass(), ExtensionRegistry.class);
-    }
-
-    @Override
-    public void testEmpty() {
-      ExtensionRegistryLite emptyRegistry = ExtensionRegistryFactory.createEmpty();
-
-      assertEquals(emptyRegistry.getClass(), ExtensionRegistry.class);
-      assertEquals(emptyRegistry, ExtensionRegistry.EMPTY_REGISTRY);
-    }
-
-    @Override
-    public void testIsFullRegistry() {
-      ExtensionRegistryLite registry = ExtensionRegistryFactory.create();
-      assertTrue(ExtensionRegistryFactory.isFullRegistry(registry));
-    }
-
-    @Override
-    public void testAdd() {
-      ExtensionRegistryLite registry1 = ExtensionRegistryLite.newInstance();
-      NonNestedExtensionLite.registerAllExtensions(registry1);
-      registry1.add(NonNestedExtensionLite.nonNestedExtensionLite);
-
-      ExtensionRegistryLite registry2 = ExtensionRegistryLite.newInstance();
-      NonNestedExtension.registerAllExtensions((ExtensionRegistry) registry2);
-      registry2.add(NonNestedExtension.nonNestedExtension);
-
-      ExtensionRegistry fullRegistry1 = (ExtensionRegistry) registry1;
-      ExtensionRegistry fullRegistry2 = (ExtensionRegistry) registry2;
-
-      assertTrue("Test is using a non-lite extension",
-          GeneratedMessageLite.GeneratedExtension.class.isAssignableFrom(
-              NonNestedExtensionLite.nonNestedExtensionLite.getClass()));
-      assertNull("Extension is not registered in masqueraded full registry",
-          fullRegistry1.findImmutableExtensionByName("protobuf_unittest.nonNestedExtension"));
-      GeneratedMessageLite.GeneratedExtension<NonNestedExtensionLite.MessageLiteToBeExtended, ?>
-      extension = registry1.findLiteExtensionByNumber(
-          NonNestedExtensionLite.MessageLiteToBeExtended.getDefaultInstance(), 1);
-      assertNotNull("Extension registered in lite registry", extension);
-
-      assertTrue("Test is using a non-lite extension",
-          GeneratedMessage.GeneratedExtension.class.isAssignableFrom(
-          NonNestedExtension.nonNestedExtension.getClass()));
-      assertNotNull("Extension is registered in masqueraded full registry",
-          fullRegistry2.findImmutableExtensionByName("protobuf_unittest.nonNestedExtension"));
-    }
-
-    @Override
-    public void testAdd_immutable() {
-      ExtensionRegistryLite registry1 = ExtensionRegistryLite.newInstance().getUnmodifiable();
-      try {
-        NonNestedExtensionLite.registerAllExtensions(registry1);
-        fail();
-      } catch (UnsupportedOperationException expected) {}
-      try {
-        registry1.add(NonNestedExtensionLite.nonNestedExtensionLite);
-        fail();
-      } catch (UnsupportedOperationException expected) {}
-
-      ExtensionRegistryLite registry2 = ExtensionRegistryLite.newInstance().getUnmodifiable();
-      try {
-        NonNestedExtension.registerAllExtensions((ExtensionRegistry) registry2);
-        fail();
-      } catch (IllegalArgumentException expected) {}
-      try {
-        registry2.add(NonNestedExtension.nonNestedExtension);
-        fail();
-      } catch (IllegalArgumentException expected) {}
-    }
-  }
-
-  /**
-   * Test implementations for the Lite usage of ExtensionRegistryFactory.
-   */
-  public static final class InnerLiteTest implements RegistryTests {
-
-    @Override
-    public void testCreate() {
-      ExtensionRegistryLite registry = ExtensionRegistryFactory.create();
-
-      assertEquals(registry.getClass(), ExtensionRegistryLite.class);
-    }
-
-    @Override
-    public void testEmpty() {
-      ExtensionRegistryLite emptyRegistry = ExtensionRegistryFactory.createEmpty();
-
-      assertEquals(emptyRegistry.getClass(), ExtensionRegistryLite.class);
-      assertEquals(emptyRegistry, ExtensionRegistryLite.EMPTY_REGISTRY_LITE);
-    }
-
-    @Override
-    public void testIsFullRegistry() {
-      ExtensionRegistryLite registry = ExtensionRegistryFactory.create();
-      assertFalse(ExtensionRegistryFactory.isFullRegistry(registry));
-    }
-
-    @Override
-    public void testAdd() {
-      ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();
-      NonNestedExtensionLite.registerAllExtensions(registry);
-      GeneratedMessageLite.GeneratedExtension<NonNestedExtensionLite.MessageLiteToBeExtended, ?>
-          extension = registry.findLiteExtensionByNumber(
-              NonNestedExtensionLite.MessageLiteToBeExtended.getDefaultInstance(), 1);
-      assertNotNull("Extension is registered in Lite registry", extension);
-    }
-
-    @Override
-    public void testAdd_immutable() {
-      ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance().getUnmodifiable();
-      try {
-        NonNestedExtensionLite.registerAllExtensions(registry);
-        fail();
-      } catch (UnsupportedOperationException expected) {}
-    }
-  }
-
-  /**
-   * Defines a suite of tests which the JUnit3 runner retrieves by reflection.
-   */
-  public static Test suite() {
-    TestSuite suite = new TestSuite();
-    for (Method method : RegistryTests.class.getMethods()) {
-      suite.addTest(TestSuite.createTest(ExtensionRegistryFactoryTest.class, method.getName()));
-    }
-    return suite;
-  }
-
-  /**
-   * Sequentially runs first the Lite and then the non-Lite test variant via classloader
-   * manipulation.
-   */
-  @Override
-  public void runTest() throws Exception {
-    ClassLoader storedClassLoader = Thread.currentThread().getContextClassLoader();
-    Thread.currentThread().setContextClassLoader(LITE_CLASS_LOADER);
-    try {
-      runTestMethod(LITE_CLASS_LOADER, InnerLiteTest.class);
-    } finally {
-      Thread.currentThread().setContextClassLoader(storedClassLoader);
-    }
-    try {
-      runTestMethod(storedClassLoader, InnerTest.class);
-    } finally {
-      Thread.currentThread().setContextClassLoader(storedClassLoader);
-    }
-  }
-
-  private void runTestMethod(ClassLoader classLoader, Class<? extends RegistryTests> testClass)
-      throws Exception {
-    classLoader.loadClass(ExtensionRegistryFactory.class.getName());
-    Class<?> test = classLoader.loadClass(testClass.getName());
-    String testName = getName();
-    test.getMethod(testName).invoke(test.newInstance());
-  }
-
-  /**
-   * Constructs a custom ClassLoader blacklisting the classes which are inspected in the SUT
-   * to determine the Lite/non-Lite runtime.
-   */
-  private static ClassLoader getLiteOnlyClassLoader() {
-    ClassLoader testClassLoader = ExtensionRegistryFactoryTest.class.getClassLoader();
-    final Set<String> classNamesNotInLite =
-        Collections.unmodifiableSet(
-            new HashSet<String>(
-                Arrays.asList(
-                    ExtensionRegistryFactory.FULL_REGISTRY_CLASS_NAME,
-                    ExtensionRegistry.EXTENSION_CLASS_NAME)));
-
-    // Construct a URLClassLoader delegating to the system ClassLoader, and looking up classes
-    // in jar files based on the URLs already configured for this test's UrlClassLoader.
-    // Certain classes throw a ClassNotFoundException by design.
-    return new URLClassLoader(((URLClassLoader) testClassLoader).getURLs(),
-        ClassLoader.getSystemClassLoader()) {
-      @Override
-      public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
-        if (classNamesNotInLite.contains(name)) {
-          throw new ClassNotFoundException("Class deliberately blacklisted by test.");
-        }
-        Class<?> loadedClass = null;
-        try {
-          loadedClass = findLoadedClass(name);
-          if (loadedClass == null) {
-            loadedClass = findClass(name);
-            if (resolve) {
-              resolveClass(loadedClass);
-            }
-          }
-        } catch (ClassNotFoundException e) {
-          loadedClass = super.loadClass(name, resolve);
-        }
-        return loadedClass;
-      }
-    };
-  }
-}
diff --git a/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java b/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java
index 42da5bb..304cec4 100644
--- a/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java
+++ b/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java
@@ -31,8 +31,6 @@
 package com.google.protobuf;
 
 import com.google.protobuf.Descriptors.Descriptor;
-import com.google.protobuf.Descriptors.EnumDescriptor;
-import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.FieldPresenceTestProto.TestAllTypes;
 import com.google.protobuf.FieldPresenceTestProto.TestOptionalFieldsOnly;
@@ -108,7 +106,7 @@
     assertFalse(TestAllTypes.newBuilder().build().hasOptionalNestedMessage());
     assertFalse(TestAllTypes.newBuilder().hasOptionalNestedMessage());
 
-    // oneof fields don't have hasFoo() methods for non-message types.
+    // oneof fields don't have hasFoo() methods (even for message types).
     assertHasMethodRemoved(
         UnittestProto.TestAllTypes.class,
         TestAllTypes.class,
@@ -121,8 +119,10 @@
         UnittestProto.TestAllTypes.class,
         TestAllTypes.class,
         "OneofBytes");
-    assertFalse(TestAllTypes.newBuilder().build().hasOneofNestedMessage());
-    assertFalse(TestAllTypes.newBuilder().hasOneofNestedMessage());
+    assertHasMethodRemoved(
+        UnittestProto.TestAllTypes.class,
+        TestAllTypes.class,
+        "OneofNestedMessage");
 
     assertHasMethodRemoved(
         UnittestProto.TestAllTypes.Builder.class,
@@ -136,6 +136,10 @@
         UnittestProto.TestAllTypes.Builder.class,
         TestAllTypes.Builder.class,
         "OneofBytes");
+    assertHasMethodRemoved(
+        UnittestProto.TestAllTypes.Builder.class,
+        TestAllTypes.Builder.class,
+        "OneofNestedMessage");
   }
 
   public void testOneofEquals() throws Exception {
@@ -148,26 +152,6 @@
     assertFalse(message1.equals(message2));
   }
 
-  public void testLazyField() throws Exception {
-    // Test default constructed message.
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    TestAllTypes message = builder.build();
-    assertFalse(message.hasOptionalLazyMessage());
-    assertEquals(0, message.getSerializedSize());
-    assertEquals(ByteString.EMPTY, message.toByteString());
-
-    // Set default instance to the field.
-    builder.setOptionalLazyMessage(TestAllTypes.NestedMessage.getDefaultInstance());
-    message = builder.build();
-    assertTrue(message.hasOptionalLazyMessage());
-    assertEquals(2, message.getSerializedSize());
-
-    // Test parse zero-length from wire sets the presence.
-    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteString());
-    assertTrue(parsed.hasOptionalLazyMessage());
-    assertEquals(message.getOptionalLazyMessage(), parsed.getOptionalLazyMessage());
-  }
-
   public void testFieldPresence() {
     // Optional non-message fields set to their default value are treated the
     // same way as not set.
@@ -249,54 +233,6 @@
     assertEquals(4, message.getAllFields().size());
   }
 
-  public void testFieldPresenceDynamicMessage() {
-    Descriptor descriptor = TestAllTypes.getDescriptor();
-    FieldDescriptor optionalInt32Field = descriptor.findFieldByName("optional_int32");
-    FieldDescriptor optionalStringField = descriptor.findFieldByName("optional_string");
-    FieldDescriptor optionalBytesField = descriptor.findFieldByName("optional_bytes");
-    FieldDescriptor optionalNestedEnumField = descriptor.findFieldByName("optional_nested_enum");
-    EnumDescriptor enumDescriptor = optionalNestedEnumField.getEnumType();
-    EnumValueDescriptor defaultEnumValueDescriptor = enumDescriptor.getValues().get(0);
-    EnumValueDescriptor nonDefaultEnumValueDescriptor = enumDescriptor.getValues().get(1);
-
-    DynamicMessage defaultInstance = DynamicMessage.getDefaultInstance(descriptor);
-    // Field not present.
-    DynamicMessage message = defaultInstance.newBuilderForType().build();
-    assertFalse(message.hasField(optionalInt32Field));
-    assertFalse(message.hasField(optionalStringField));
-    assertFalse(message.hasField(optionalBytesField));
-    assertFalse(message.hasField(optionalNestedEnumField));
-    assertEquals(0, message.getAllFields().size());
-
-    // Field set to non-default value is seen as present.
-    message =
-        defaultInstance
-            .newBuilderForType()
-            .setField(optionalInt32Field, 1)
-            .setField(optionalStringField, "x")
-            .setField(optionalBytesField, ByteString.copyFromUtf8("y"))
-            .setField(optionalNestedEnumField, nonDefaultEnumValueDescriptor)
-            .build();
-    assertTrue(message.hasField(optionalInt32Field));
-    assertTrue(message.hasField(optionalStringField));
-    assertTrue(message.hasField(optionalBytesField));
-    assertTrue(message.hasField(optionalNestedEnumField));
-    assertEquals(4, message.getAllFields().size());
-
-    // Field set to default value is seen as not present.
-    message = message.toBuilder()
-            .setField(optionalInt32Field, 0)
-            .setField(optionalStringField, "")
-            .setField(optionalBytesField, ByteString.EMPTY)
-            .setField(optionalNestedEnumField, defaultEnumValueDescriptor)
-            .build();
-    assertFalse(message.hasField(optionalInt32Field));
-    assertFalse(message.hasField(optionalStringField));
-    assertFalse(message.hasField(optionalBytesField));
-    assertFalse(message.hasField(optionalNestedEnumField));
-    assertEquals(0, message.getAllFields().size());
-  }
-
   public void testMessageField() {
     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
     assertFalse(builder.hasOptionalNestedMessage());
@@ -404,4 +340,34 @@
     assertTrue(builder.buildPartial().isInitialized());
   }
 
+
+  // Test that unknown fields are dropped.
+  public void testUnknownFields() throws Exception {
+    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
+    builder.setOptionalInt32(1234);
+    builder.addRepeatedInt32(5678);
+    TestAllTypes message = builder.build();
+    ByteString data = message.toByteString();
+
+    TestOptionalFieldsOnly optionalOnlyMessage =
+        TestOptionalFieldsOnly.parseFrom(data);
+    // UnknownFieldSet should be empty.
+    assertEquals(
+        0, optionalOnlyMessage.getUnknownFields().toByteString().size());
+    assertEquals(1234, optionalOnlyMessage.getOptionalInt32());
+    message = TestAllTypes.parseFrom(optionalOnlyMessage.toByteString());
+    assertEquals(1234, message.getOptionalInt32());
+    // The repeated field is discarded because it's unknown to the optional-only
+    // message.
+    assertEquals(0, message.getRepeatedInt32Count());
+
+    DynamicMessage dynamicOptionalOnlyMessage =
+        DynamicMessage.getDefaultInstance(
+            TestOptionalFieldsOnly.getDescriptor())
+        .getParserForType().parseFrom(data);
+    assertEquals(
+        0, dynamicOptionalOnlyMessage.getUnknownFields().toByteString().size());
+    assertEquals(optionalOnlyMessage.toByteString(),
+        dynamicOptionalOnlyMessage.toByteString());
+  }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java b/java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java
index aa36be4..88a7574 100644
--- a/java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java
@@ -32,47 +32,47 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link FloatArrayList}.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
 public class FloatArrayListTest extends TestCase {
-
-  private static final FloatArrayList UNARY_LIST =
-      newImmutableFloatArrayList(1);
+  
+  private static final FloatArrayList UNARY_LIST = newImmutableFloatArrayList(1);
   private static final FloatArrayList TERTIARY_LIST =
       newImmutableFloatArrayList(1, 2, 3);
-
+  
   private FloatArrayList list;
-
+  
   @Override
   protected void setUp() throws Exception {
     list = new FloatArrayList();
   }
-
+  
   public void testEmptyListReturnsSameInstance() {
     assertSame(FloatArrayList.emptyList(), FloatArrayList.emptyList());
   }
-
+  
   public void testEmptyListIsImmutable() {
     assertImmutable(FloatArrayList.emptyList());
   }
-
+  
   public void testMakeImmutable() {
-    list.addFloat(3);
+    list.addFloat(2);
     list.addFloat(4);
-    list.addFloat(5);
-    list.addFloat(7);
+    list.addFloat(6);
+    list.addFloat(8);
     list.makeImmutable();
     assertImmutable(list);
   }
-
+  
   public void testModificationWithIteration() {
     list.addAll(asList(1F, 2F, 3F, 4F));
     Iterator<Float> iterator = list.iterator();
@@ -81,7 +81,7 @@
     assertEquals(1F, (float) iterator.next());
     list.set(0, 1F);
     assertEquals(2F, (float) iterator.next());
-
+    
     list.remove(0);
     try {
       iterator.next();
@@ -89,7 +89,7 @@
     } catch (ConcurrentModificationException e) {
       // expected
     }
-
+    
     iterator = list.iterator();
     list.add(0, 0F);
     try {
@@ -99,19 +99,19 @@
       // expected
     }
   }
-
+  
   public void testGet() {
     assertEquals(1F, (float) TERTIARY_LIST.get(0));
     assertEquals(2F, (float) TERTIARY_LIST.get(1));
     assertEquals(3F, (float) TERTIARY_LIST.get(2));
-
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -119,19 +119,19 @@
       // expected
     }
   }
-
+  
   public void testGetFloat() {
     assertEquals(1F, TERTIARY_LIST.getFloat(0));
     assertEquals(2F, TERTIARY_LIST.getFloat(1));
     assertEquals(3F, TERTIARY_LIST.getFloat(2));
-
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -139,35 +139,35 @@
       // expected
     }
   }
-
+  
   public void testSize() {
     assertEquals(0, FloatArrayList.emptyList().size());
     assertEquals(1, UNARY_LIST.size());
     assertEquals(3, TERTIARY_LIST.size());
 
-    list.addFloat(3);
+    list.addFloat(2);
     list.addFloat(4);
     list.addFloat(6);
     list.addFloat(8);
     assertEquals(4, list.size());
-
+    
     list.remove(0);
     assertEquals(3, list.size());
-
-    list.add(17F);
+    
+    list.add(16F);
     assertEquals(4, list.size());
   }
-
+  
   public void testSet() {
     list.addFloat(2);
     list.addFloat(4);
-
-    assertEquals(2F, (float) list.set(0, 3F));
-    assertEquals(3F, list.getFloat(0));
+    
+    assertEquals(2F, (float) list.set(0, 0F));
+    assertEquals(0F, list.getFloat(0));
 
     assertEquals(4F, (float) list.set(1, 0F));
     assertEquals(0F, list.getFloat(1));
-
+    
     try {
       list.set(-1, 0F);
       fail();
@@ -182,17 +182,17 @@
       // expected
     }
   }
-
+  
   public void testSetFloat() {
-    list.addFloat(1);
-    list.addFloat(3);
-
-    assertEquals(1F, list.setFloat(0, 0));
+    list.addFloat(2);
+    list.addFloat(4);
+    
+    assertEquals(2F, list.setFloat(0, 0));
     assertEquals(0F, list.getFloat(0));
 
-    assertEquals(3F, list.setFloat(1, 0));
+    assertEquals(4F, list.setFloat(1, 0));
     assertEquals(0F, list.getFloat(1));
-
+    
     try {
       list.setFloat(-1, 0);
       fail();
@@ -207,7 +207,7 @@
       // expected
     }
   }
-
+  
   public void testAdd() {
     assertEquals(0, list.size());
 
@@ -217,30 +217,28 @@
     assertTrue(list.add(3F));
     list.add(0, 4F);
     assertEquals(asList(4F, 2F, 3F), list);
-
+    
     list.add(0, 1F);
     list.add(0, 0F);
     // Force a resize by getting up to 11 elements.
     for (int i = 0; i < 6; i++) {
       list.add(Float.valueOf(5 + i));
     }
-    assertEquals(
-        asList(0F, 1F, 4F, 2F, 3F, 5F, 6F, 7F, 8F, 9F, 10F),
-        list);
-
+    assertEquals(asList(0F, 1F, 4F, 2F, 3F, 5F, 6F, 7F, 8F, 9F, 10F), list);
+    
     try {
       list.add(-1, 5F);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.add(4, 5F);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   public void testAddFloat() {
     assertEquals(0, list.size());
 
@@ -250,7 +248,7 @@
     list.addFloat(3);
     assertEquals(asList(2F, 3F), list);
   }
-
+  
   public void testAddAll() {
     assertEquals(0, list.size());
 
@@ -258,17 +256,17 @@
     assertEquals(1, list.size());
     assertEquals(1F, (float) list.get(0));
     assertEquals(1F, list.getFloat(0));
-
+    
     assertTrue(list.addAll(asList(2F, 3F, 4F, 5F, 6F)));
     assertEquals(asList(1F, 2F, 3F, 4F, 5F, 6F), list);
-
+    
     assertTrue(list.addAll(TERTIARY_LIST));
     assertEquals(asList(1F, 2F, 3F, 4F, 5F, 6F, 1F, 2F, 3F), list);
 
     assertFalse(list.addAll(Collections.<Float>emptyList()));
     assertFalse(list.addAll(FloatArrayList.emptyList()));
   }
-
+  
   public void testRemove() {
     list.addAll(TERTIARY_LIST);
     assertEquals(1F, (float) list.remove(0));
@@ -282,96 +280,96 @@
 
     assertEquals(2F, (float) list.remove(0));
     assertEquals(asList(), list);
-
+    
     try {
       list.remove(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.remove(0);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   private void assertImmutable(FloatArrayList list) {
     if (list.contains(1F)) {
       throw new RuntimeException("Cannot test the immutability of lists that contain 1.");
     }
-
+    
     try {
       list.add(1F);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.add(0, 1F);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.<Float>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.singletonList(1F));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(new FloatArrayList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.singleton(1F));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.<Float>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addFloat(0);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.clear();
       fail();
@@ -385,63 +383,63 @@
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.remove(new Object());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.<Float>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.singleton(1F));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.<Float>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.singleton(1F));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.set(0, 0F);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.setFloat(0, 0);
       fail();
@@ -449,10 +447,10 @@
       // expected
     }
   }
-
-  private static FloatArrayList newImmutableFloatArrayList(float... elements) {
+  
+  private static FloatArrayList newImmutableFloatArrayList(int... elements) {
     FloatArrayList list = new FloatArrayList();
-    for (float element : elements) {
+    for (int element : elements) {
       list.addFloat(element);
     }
     list.makeImmutable();
diff --git a/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java b/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
index c9ebe7f..a9b8b63 100644
--- a/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
+++ b/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
@@ -32,14 +32,19 @@
 
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
+import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
 import com.google.protobuf.test.UnittestImport;
 import protobuf_unittest.EnumWithNoOuter;
 import protobuf_unittest.MessageWithNoOuter;
 import protobuf_unittest.MultipleFilesTestProto;
 import protobuf_unittest.NestedExtension.MyNestedExtension;
+import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite;
 import protobuf_unittest.NonNestedExtension;
 import protobuf_unittest.NonNestedExtension.MessageToBeExtended;
 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension;
+import protobuf_unittest.NonNestedExtensionLite;
+import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended;
+import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite;
 import protobuf_unittest.OuterClassNameTest2OuterClass;
 import protobuf_unittest.OuterClassNameTest3OuterClass;
 import protobuf_unittest.OuterClassNameTestOuterClass;
@@ -60,6 +65,9 @@
 import protobuf_unittest.UnittestProto.TestOneof2;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
 import protobuf_unittest.UnittestProto.TestUnpackedTypes;
+
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
@@ -68,7 +76,6 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Unit test for generated messages and generated code.  See also
@@ -707,6 +714,70 @@
   }
 
   // =================================================================
+  // Lite Extensions.
+
+  // We test lite extensions directly because they have a separate
+  // implementation from full extensions.  In contrast, we do not test
+  // lite fields directly since they are implemented exactly the same as
+  // regular fields.
+
+  public void testLiteExtensionMessageOrBuilder() throws Exception {
+    TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
+    TestUtilLite.setAllExtensions(builder);
+    TestUtil.assertAllExtensionsSet(builder);
+
+    TestAllExtensionsLite message = builder.build();
+    TestUtil.assertAllExtensionsSet(message);
+  }
+
+  public void testLiteExtensionRepeatedSetters() throws Exception {
+    TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
+    TestUtilLite.setAllExtensions(builder);
+    TestUtilLite.modifyRepeatedExtensions(builder);
+    TestUtil.assertRepeatedExtensionsModified(builder);
+
+    TestAllExtensionsLite message = builder.build();
+    TestUtil.assertRepeatedExtensionsModified(message);
+  }
+
+  public void testLiteExtensionDefaults() throws Exception {
+    TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance());
+    TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build());
+  }
+
+  public void testClearLiteExtension() throws Exception {
+    // clearExtension() is not actually used in TestUtil, so try it manually.
+    assertFalse(
+      TestAllExtensionsLite.newBuilder()
+        .setExtension(UnittestLite.optionalInt32ExtensionLite, 1)
+        .clearExtension(UnittestLite.optionalInt32ExtensionLite)
+        .hasExtension(UnittestLite.optionalInt32ExtensionLite));
+    assertEquals(0,
+      TestAllExtensionsLite.newBuilder()
+        .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1)
+        .clearExtension(UnittestLite.repeatedInt32ExtensionLite)
+        .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite));
+  }
+
+  public void testLiteExtensionCopy() throws Exception {
+    TestAllExtensionsLite original = TestUtilLite.getAllLiteExtensionsSet();
+    TestAllExtensionsLite copy =
+        TestAllExtensionsLite.newBuilder(original).build();
+    TestUtil.assertAllExtensionsSet(copy);
+  }
+
+  public void testLiteExtensionMergeFrom() throws Exception {
+    TestAllExtensionsLite original =
+      TestAllExtensionsLite.newBuilder()
+        .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build();
+    TestAllExtensionsLite merged =
+        TestAllExtensionsLite.newBuilder().mergeFrom(original).build();
+    assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite));
+    assertEquals(
+        1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite));
+  }
+
+  // =================================================================
   // multiple_files_test
 
   // Test that custom options of an file level enum are properly initialized.
@@ -854,9 +925,15 @@
   }
 
   public void testEnumValues() {
-    assertEquals(TestAllTypes.NestedEnum.BAR_VALUE, TestAllTypes.NestedEnum.BAR.getNumber());
-    assertEquals(TestAllTypes.NestedEnum.BAZ_VALUE, TestAllTypes.NestedEnum.BAZ.getNumber());
-    assertEquals(TestAllTypes.NestedEnum.FOO_VALUE, TestAllTypes.NestedEnum.FOO.getNumber());
+     assertEquals(
+         TestAllTypes.NestedEnum.BAR.getNumber(),
+         TestAllTypes.NestedEnum.BAR_VALUE);
+    assertEquals(
+        TestAllTypes.NestedEnum.BAZ.getNumber(),
+        TestAllTypes.NestedEnum.BAZ_VALUE);
+    assertEquals(
+        TestAllTypes.NestedEnum.FOO.getNumber(),
+        TestAllTypes.NestedEnum.FOO_VALUE);
   }
 
   public void testNonNestedExtensionInitialization() {
@@ -873,6 +950,16 @@
                  MyNestedExtension.recursiveExtension.getDescriptor().getName());
   }
 
+  public void testNonNestedExtensionLiteInitialization() {
+    assertTrue(NonNestedExtensionLite.nonNestedExtensionLite
+               .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite);
+  }
+
+  public void testNestedExtensionLiteInitialization() {
+    assertTrue(MyNestedExtensionLite.recursiveExtensionLite
+               .getMessageDefaultInstance() instanceof MessageLiteToBeExtended);
+  }
+
   public void testInvalidations() throws Exception {
     GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();
     TestAllTypes.NestedMessage nestedMessage1 =
@@ -885,7 +972,7 @@
     TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
 
     TestAllTypes.Builder builder = (TestAllTypes.Builder)
-        ((AbstractMessage) TestAllTypes.getDefaultInstance()).
+        ((GeneratedMessage) TestAllTypes.getDefaultInstance()).
             newBuilderForType(mockParent);
     builder.setOptionalInt32(1);
     builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
@@ -940,7 +1027,7 @@
     TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
 
     TestAllExtensions.Builder builder = (TestAllExtensions.Builder)
-        ((AbstractMessage) TestAllExtensions.getDefaultInstance()).
+        ((GeneratedMessage) TestAllExtensions.getDefaultInstance()).
             newBuilderForType(mockParent);
 
     builder.addExtension(UnittestProto.repeatedInt32Extension, 1);
@@ -1234,51 +1321,51 @@
       assertFalse(builder.clearFooInt().hasFooInt());
       TestOneof2 message2 = builder.build();
       assertFalse(message2.hasFooInt());
-      assertEquals(0, message2.getFooInt());
+      assertEquals(message2.getFooInt(), 0);
     }
 
     // Enum
     {
       TestOneof2.Builder builder = TestOneof2.newBuilder();
-      assertEquals(TestOneof2.NestedEnum.FOO, builder.getFooEnum());
+      assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.FOO);
       assertTrue(builder.setFooEnum(TestOneof2.NestedEnum.BAR).hasFooEnum());
-      assertEquals(TestOneof2.NestedEnum.BAR, builder.getFooEnum());
+      assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.BAR);
       TestOneof2 message = builder.buildPartial();
       assertTrue(message.hasFooEnum());
-      assertEquals(TestOneof2.NestedEnum.BAR, message.getFooEnum());
+      assertEquals(message.getFooEnum(), TestOneof2.NestedEnum.BAR);
 
       assertFalse(builder.clearFooEnum().hasFooEnum());
       TestOneof2 message2 = builder.build();
       assertFalse(message2.hasFooEnum());
-      assertEquals(TestOneof2.NestedEnum.FOO, message2.getFooEnum());
+      assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.FOO);
     }
 
     // String
     {
       TestOneof2.Builder builder = TestOneof2.newBuilder();
-      assertEquals("", builder.getFooString());
+      assertEquals(builder.getFooString(), "");
       builder.setFooString("foo");
       assertTrue(builder.hasFooString());
-      assertEquals("foo", builder.getFooString());
+      assertEquals(builder.getFooString(), "foo");
       TestOneof2 message = builder.buildPartial();
       assertTrue(message.hasFooString());
-      assertEquals("foo", message.getFooString());
+      assertEquals(message.getFooString(), "foo");
       assertEquals(message.getFooStringBytes(), TestUtil.toBytes("foo"));
 
       assertFalse(builder.clearFooString().hasFooString());
       TestOneof2 message2 = builder.buildPartial();
       assertFalse(message2.hasFooString());
-      assertEquals("", message2.getFooString());
+      assertEquals(message2.getFooString(), "");
       assertEquals(message2.getFooStringBytes(), TestUtil.toBytes(""));
 
       // Get method should not change the oneof value.
       builder.setFooInt(123);
-      assertEquals("", builder.getFooString());
+      assertEquals(builder.getFooString(), "");
       assertEquals(builder.getFooStringBytes(), TestUtil.toBytes(""));
       assertEquals(123, builder.getFooInt());
 
       message = builder.build();
-      assertEquals("", message.getFooString());
+      assertEquals(message.getFooString(), "");
       assertEquals(message.getFooStringBytes(), TestUtil.toBytes(""));
       assertEquals(123, message.getFooInt());
     }
@@ -1286,38 +1373,38 @@
     // Cord
     {
       TestOneof2.Builder builder = TestOneof2.newBuilder();
-      assertEquals("", builder.getFooCord());
+      assertEquals(builder.getFooCord(), "");
       builder.setFooCord("foo");
       assertTrue(builder.hasFooCord());
-      assertEquals("foo", builder.getFooCord());
+      assertEquals(builder.getFooCord(), "foo");
       TestOneof2 message = builder.buildPartial();
       assertTrue(message.hasFooCord());
-      assertEquals("foo", message.getFooCord());
+      assertEquals(message.getFooCord(), "foo");
       assertEquals(message.getFooCordBytes(), TestUtil.toBytes("foo"));
 
       assertFalse(builder.clearFooCord().hasFooCord());
       TestOneof2 message2 = builder.build();
       assertFalse(message2.hasFooCord());
-      assertEquals("", message2.getFooCord());
+      assertEquals(message2.getFooCord(), "");
       assertEquals(message2.getFooCordBytes(), TestUtil.toBytes(""));
     }
 
     // StringPiece
     {
       TestOneof2.Builder builder = TestOneof2.newBuilder();
-      assertEquals("", builder.getFooStringPiece());
+      assertEquals(builder.getFooStringPiece(), "");
       builder.setFooStringPiece("foo");
       assertTrue(builder.hasFooStringPiece());
-      assertEquals("foo", builder.getFooStringPiece());
+      assertEquals(builder.getFooStringPiece(), "foo");
       TestOneof2 message = builder.buildPartial();
       assertTrue(message.hasFooStringPiece());
-      assertEquals("foo", message.getFooStringPiece());
+      assertEquals(message.getFooStringPiece(), "foo");
       assertEquals(message.getFooStringPieceBytes(), TestUtil.toBytes("foo"));
 
       assertFalse(builder.clearFooStringPiece().hasFooStringPiece());
       TestOneof2 message2 = builder.build();
       assertFalse(message2.hasFooStringPiece());
-      assertEquals("", message2.getFooStringPiece());
+      assertEquals(message2.getFooStringPiece(), "");
       assertEquals(message2.getFooStringPieceBytes(), TestUtil.toBytes(""));
     }
 
@@ -1325,20 +1412,20 @@
     {
       // set
       TestOneof2.Builder builder = TestOneof2.newBuilder();
-      assertEquals(0, builder.getFooMessage().getQuxInt());
+      assertEquals(builder.getFooMessage().getQuxInt(), 0);
       builder.setFooMessage(
           TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build());
       assertTrue(builder.hasFooMessage());
-      assertEquals(234, builder.getFooMessage().getQuxInt());
+      assertEquals(builder.getFooMessage().getQuxInt(), 234);
       TestOneof2 message = builder.buildPartial();
       assertTrue(message.hasFooMessage());
-      assertEquals(234, message.getFooMessage().getQuxInt());
+      assertEquals(message.getFooMessage().getQuxInt(), 234);
 
       // clear
       assertFalse(builder.clearFooMessage().hasFooString());
       message = builder.build();
       assertFalse(message.hasFooMessage());
-      assertEquals(0, message.getFooMessage().getQuxInt());
+      assertEquals(message.getFooMessage().getQuxInt(), 0);
 
       // nested builder
       builder = TestOneof2.newBuilder();
@@ -1347,10 +1434,10 @@
       assertFalse(builder.hasFooMessage());
       builder.getFooMessageBuilder().setQuxInt(123);
       assertTrue(builder.hasFooMessage());
-      assertEquals(123, builder.getFooMessage().getQuxInt());
+      assertEquals(builder.getFooMessage().getQuxInt(), 123);
       message = builder.build();
       assertTrue(message.hasFooMessage());
-      assertEquals(123, message.getFooMessage().getQuxInt());
+      assertEquals(message.getFooMessage().getQuxInt(), 123);
     }
 
     // LazyMessage is tested in LazyMessageLiteTest.java
@@ -1363,7 +1450,7 @@
       TestOneof2 message = builder.setFooInt(123).build();
       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
       assertTrue(message2.hasFooInt());
-      assertEquals(123, message2.getFooInt());
+      assertEquals(message2.getFooInt(), 123);
     }
 
     // String
@@ -1372,7 +1459,7 @@
       TestOneof2 message = builder.setFooString("foo").build();
       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
       assertTrue(message2.hasFooString());
-      assertEquals("foo", message2.getFooString());
+      assertEquals(message2.getFooString(), "foo");
     }
 
     // Enum
@@ -1381,7 +1468,7 @@
       TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build();
       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
       assertTrue(message2.hasFooEnum());
-      assertEquals(TestOneof2.NestedEnum.BAR, message2.getFooEnum());
+      assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR);
     }
 
     // Message
@@ -1391,7 +1478,7 @@
           TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build();
       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
       assertTrue(message2.hasFooMessage());
-      assertEquals(234, message2.getFooMessage().getQuxInt());
+      assertEquals(message2.getFooMessage().getQuxInt(), 234);
     }
   }
 
@@ -1403,7 +1490,7 @@
       ByteString serialized = message.toByteString();
       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
       assertTrue(message2.hasFooInt());
-      assertEquals(123, message2.getFooInt());
+      assertEquals(message2.getFooInt(), 123);
     }
 
     // String
@@ -1413,7 +1500,7 @@
       ByteString serialized = message.toByteString();
       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
       assertTrue(message2.hasFooString());
-      assertEquals("foo", message2.getFooString());
+      assertEquals(message2.getFooString(), "foo");
     }
 
     // Enum
@@ -1423,7 +1510,7 @@
       ByteString serialized = message.toByteString();
       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
       assertTrue(message2.hasFooEnum());
-      assertEquals(TestOneof2.NestedEnum.BAR, message2.getFooEnum());
+      assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR);
     }
 
     // Message
@@ -1434,7 +1521,7 @@
       ByteString serialized = message.toByteString();
       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
       assertTrue(message2.hasFooMessage());
-      assertEquals(234, message2.getFooMessage().getQuxInt());
+      assertEquals(message2.getFooMessage().getQuxInt(), 234);
     }
   }
 
diff --git a/java/core/src/test/java/com/google/protobuf/IntArrayListTest.java b/java/core/src/test/java/com/google/protobuf/IntArrayListTest.java
index 60c8545..efb8f3e 100644
--- a/java/core/src/test/java/com/google/protobuf/IntArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/IntArrayListTest.java
@@ -32,43 +32,43 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link IntArrayList}.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
 public class IntArrayListTest extends TestCase {
-
-  private static final IntArrayList UNARY_LIST =
-      newImmutableIntArrayList(1);
+  
+  private static final IntArrayList UNARY_LIST = newImmutableIntArrayList(1);
   private static final IntArrayList TERTIARY_LIST =
       newImmutableIntArrayList(1, 2, 3);
-
+  
   private IntArrayList list;
-
+  
   @Override
   protected void setUp() throws Exception {
     list = new IntArrayList();
   }
-
+  
   public void testEmptyListReturnsSameInstance() {
     assertSame(IntArrayList.emptyList(), IntArrayList.emptyList());
   }
-
+  
   public void testEmptyListIsImmutable() {
     assertImmutable(IntArrayList.emptyList());
   }
-
+  
   public void testMakeImmutable() {
-    list.addInt(3);
+    list.addInt(2);
     list.addInt(4);
-    list.addInt(5);
-    list.addInt(7);
+    list.addInt(6);
+    list.addInt(8);
     list.makeImmutable();
     assertImmutable(list);
   }
@@ -81,7 +81,7 @@
     assertEquals(1, (int) iterator.next());
     list.set(0, 1);
     assertEquals(2, (int) iterator.next());
-
+    
     list.remove(0);
     try {
       iterator.next();
@@ -99,19 +99,19 @@
       // expected
     }
   }
-
+  
   public void testGet() {
     assertEquals(1, (int) TERTIARY_LIST.get(0));
     assertEquals(2, (int) TERTIARY_LIST.get(1));
     assertEquals(3, (int) TERTIARY_LIST.get(2));
-
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -119,19 +119,19 @@
       // expected
     }
   }
-
+  
   public void testGetInt() {
     assertEquals(1, TERTIARY_LIST.getInt(0));
     assertEquals(2, TERTIARY_LIST.getInt(1));
     assertEquals(3, TERTIARY_LIST.getInt(2));
-
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -139,35 +139,35 @@
       // expected
     }
   }
-
+  
   public void testSize() {
     assertEquals(0, IntArrayList.emptyList().size());
     assertEquals(1, UNARY_LIST.size());
     assertEquals(3, TERTIARY_LIST.size());
 
-    list.addInt(3);
+    list.addInt(2);
     list.addInt(4);
     list.addInt(6);
     list.addInt(8);
     assertEquals(4, list.size());
-
+    
     list.remove(0);
     assertEquals(3, list.size());
-
-    list.add(17);
+    
+    list.add(16);
     assertEquals(4, list.size());
   }
-
+  
   public void testSet() {
     list.addInt(2);
     list.addInt(4);
-
-    assertEquals(2, (int) list.set(0, 3));
-    assertEquals(3, list.getInt(0));
+    
+    assertEquals(2, (int) list.set(0, 0));
+    assertEquals(0, list.getInt(0));
 
     assertEquals(4, (int) list.set(1, 0));
     assertEquals(0, list.getInt(1));
-
+    
     try {
       list.set(-1, 0);
       fail();
@@ -182,17 +182,17 @@
       // expected
     }
   }
-
+  
   public void testSetInt() {
-    list.addInt(1);
-    list.addInt(3);
-
-    assertEquals(1, list.setInt(0, 0));
+    list.addInt(2);
+    list.addInt(4);
+    
+    assertEquals(2, list.setInt(0, 0));
     assertEquals(0, list.getInt(0));
 
-    assertEquals(3, list.setInt(1, 0));
+    assertEquals(4, list.setInt(1, 0));
     assertEquals(0, list.getInt(1));
-
+    
     try {
       list.setInt(-1, 0);
       fail();
@@ -207,7 +207,7 @@
       // expected
     }
   }
-
+  
   public void testAdd() {
     assertEquals(0, list.size());
 
@@ -217,30 +217,28 @@
     assertTrue(list.add(3));
     list.add(0, 4);
     assertEquals(asList(4, 2, 3), list);
-
+    
     list.add(0, 1);
     list.add(0, 0);
     // Force a resize by getting up to 11 elements.
     for (int i = 0; i < 6; i++) {
-      list.add(Integer.valueOf(5 + i));
+      list.add(5 + i);
     }
-    assertEquals(
-        asList(0, 1, 4, 2, 3, 5, 6, 7, 8, 9, 10),
-        list);
-
+    assertEquals(asList(0, 1, 4, 2, 3, 5, 6, 7, 8, 9, 10), list);
+    
     try {
       list.add(-1, 5);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.add(4, 5);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   public void testAddInt() {
     assertEquals(0, list.size());
 
@@ -250,7 +248,7 @@
     list.addInt(3);
     assertEquals(asList(2, 3), list);
   }
-
+  
   public void testAddAll() {
     assertEquals(0, list.size());
 
@@ -258,17 +256,17 @@
     assertEquals(1, list.size());
     assertEquals(1, (int) list.get(0));
     assertEquals(1, list.getInt(0));
-
+    
     assertTrue(list.addAll(asList(2, 3, 4, 5, 6)));
     assertEquals(asList(1, 2, 3, 4, 5, 6), list);
-
+    
     assertTrue(list.addAll(TERTIARY_LIST));
     assertEquals(asList(1, 2, 3, 4, 5, 6, 1, 2, 3), list);
 
     assertFalse(list.addAll(Collections.<Integer>emptyList()));
     assertFalse(list.addAll(IntArrayList.emptyList()));
   }
-
+  
   public void testRemove() {
     list.addAll(TERTIARY_LIST);
     assertEquals(1, (int) list.remove(0));
@@ -282,96 +280,96 @@
 
     assertEquals(2, (int) list.remove(0));
     assertEquals(asList(), list);
-
+    
     try {
       list.remove(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.remove(0);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   private void assertImmutable(IntArrayList list) {
     if (list.contains(1)) {
       throw new RuntimeException("Cannot test the immutability of lists that contain 1.");
     }
-
+    
     try {
       list.add(1);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.add(0, 1);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.<Integer>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.singletonList(1));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(new IntArrayList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.singleton(1));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.<Integer>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addInt(0);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.clear();
       fail();
@@ -385,63 +383,63 @@
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.remove(new Object());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.<Integer>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.singleton(1));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.<Integer>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.singleton(1));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.set(0, 0);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.setInt(0, 0);
       fail();
@@ -449,7 +447,7 @@
       // expected
     }
   }
-
+  
   private static IntArrayList newImmutableIntArrayList(int... elements) {
     IntArrayList list = new IntArrayList();
     for (int element : elements) {
diff --git a/java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java b/java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java
index 813fe6b..8d1de6d 100644
--- a/java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java
@@ -31,12 +31,15 @@
 package com.google.protobuf;
 
 import static protobuf_unittest.UnittestProto.optionalInt32Extension;
+import static protobuf_unittest.UnittestProto.optionalInt64Extension;
 
 import protobuf_unittest.UnittestProto.TestAllExtensions;
 import protobuf_unittest.UnittestProto.TestAllTypes;
-import java.io.IOException;
+
 import junit.framework.TestCase;
 
+import java.io.IOException;
+
 /**
  * Unit test for {@link LazyFieldLite}.
  *
@@ -218,6 +221,29 @@
     assertEquals(messageWithExtensions, field.getValue(TestAllExtensions.getDefaultInstance()));
   }
 
+  public void testMergeMightLoseExtensions() throws Exception {
+    // Test that we don't know about the extensions when parsing.
+    TestAllExtensions message1 =
+        TestAllExtensions.newBuilder().setExtension(optionalInt32Extension, 1).build();
+    TestAllExtensions message2 =
+        TestAllExtensions.newBuilder().setExtension(optionalInt64Extension, 2L).build();
+
+    LazyFieldLite field = LazyFieldLite.fromValue(message1);
+    field.merge(LazyFieldLite.fromValue(message2));
+
+    // We lose the extensions from message 2 because we have to serialize it and then parse it
+    // again, using the empty registry this time.
+    TestAllExtensions value =
+        (TestAllExtensions) field.getValue(TestAllExtensions.getDefaultInstance());
+    assertTrue(value.hasExtension(optionalInt32Extension));
+    assertEquals(Integer.valueOf(1), value.getExtension(optionalInt32Extension));
+    assertFalse(value.hasExtension(optionalInt64Extension));
+
+    // The field is still there, it is just unknown.
+    assertTrue(value.getUnknownFields()
+        .hasField(optionalInt64Extension.getDescriptor().getNumber()));
+  }
+
 
   // Help methods.
 
diff --git a/java/core/src/test/java/com/google/protobuf/LazyFieldTest.java b/java/core/src/test/java/com/google/protobuf/LazyFieldTest.java
index f27e8e5..ce473ae 100644
--- a/java/core/src/test/java/com/google/protobuf/LazyFieldTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LazyFieldTest.java
@@ -32,8 +32,11 @@
 
 import protobuf_unittest.UnittestProto.TestAllExtensions;
 import protobuf_unittest.UnittestProto.TestAllTypes;
+
 import junit.framework.TestCase;
 
+import java.io.IOException;
+
 /**
  * Unit test for {@link LazyField}.
  *
@@ -88,7 +91,6 @@
     assertFalse(message.equals(lazyField.getValue()));
   }
 
-  @SuppressWarnings("EqualsIncompatibleType") // LazyField.equals() is not symmetric
   public void testEqualsObjectEx() throws Exception {
     TestAllExtensions message = TestUtil.getAllExtensionsSet();
     LazyField lazyField = createLazyFieldFromMessage(message);
diff --git a/java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java b/java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java
index 968ca20..afe0fff 100644
--- a/java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java
@@ -34,9 +34,11 @@
 import protobuf_unittest.LazyFieldsLite.LazyInnerMessageLite;
 import protobuf_unittest.LazyFieldsLite.LazyMessageLite;
 import protobuf_unittest.LazyFieldsLite.LazyNestedInnerMessageLite;
-import java.util.ArrayList;
+
 import junit.framework.TestCase;
 
+import java.util.ArrayList;
+
 /**
  * Unit test for messages with lazy fields.
  *
@@ -101,19 +103,6 @@
     assertEquals(119, outer.getRepeatedInner(0).getNum());
     assertEquals(122, outer.getRepeatedInner(1).getNum());
   }
-  
-  public void testRepeatedMutability() throws Exception {
-    LazyMessageLite outer = LazyMessageLite.newBuilder()
-        .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(119))
-        .addRepeatedInner(LazyInnerMessageLite.newBuilder().setNum(122))
-        .build();
-    
-    outer = LazyMessageLite.parseFrom(outer.toByteArray());
-    try {
-      outer.getRepeatedInnerList().set(1, null);
-      fail();
-    } catch (UnsupportedOperationException expected) {}
-  }
 
   public void testAddAll() {
     ArrayList<LazyInnerMessageLite> inners = new ArrayList<LazyInnerMessageLite>();
@@ -262,23 +251,6 @@
     assertEquals(42, merged.getOneofInner().getNumWithDefault());
   }
 
-  // Regression test for b/28198805.
-  public void testMergeOneofMessages() throws Exception {
-    LazyInnerMessageLite inner = LazyInnerMessageLite.newBuilder().build();
-    LazyMessageLite outer = LazyMessageLite.newBuilder().setOneofInner(inner).build();
-    ByteString data1 = outer.toByteString();
-
-    // The following should not alter the content of the 'outer' message.
-    LazyMessageLite.Builder merged = LazyMessageLite.newBuilder().mergeFrom(outer);
-    LazyInnerMessageLite anotherInner = LazyInnerMessageLite.newBuilder().setNum(12345).build();
-    merged.setOneofInner(anotherInner);
-
-    // Check that the 'outer' stays the same.
-    ByteString data2 = outer.toByteString();
-    assertEquals(data1, data2);
-    assertEquals(0, outer.getOneofInner().getNum());
-  }
-
   public void testSerialize() throws InvalidProtocolBufferException {
     LazyNestedInnerMessageLite nested = LazyNestedInnerMessageLite.newBuilder()
         .setNum(3)
diff --git a/java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java b/java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java
index 2fc3124..0f42ac5 100644
--- a/java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java
@@ -32,12 +32,12 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link LazyStringArrayList}.
@@ -233,7 +233,7 @@
     }
     
     try {
-      list.addAllByteArray(Collections.singletonList(BYTE_STRING_A.toByteArray()));
+      list.addAllByteArray(asList(BYTE_STRING_A.toByteArray()));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
@@ -281,7 +281,6 @@
     assertGenericListImmutable(byteArrayList, byteArrayList.get(0));
   }
   
-  @SuppressWarnings("unchecked")
   private static <T> void assertGenericListImmutable(List<T> list, T value) {
     try {
       list.add(value);
diff --git a/java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java b/java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java
index 006e493..0ef414a 100644
--- a/java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java
@@ -32,9 +32,11 @@
 
 
 import protobuf_unittest.UnittestProto;
-import java.io.IOException;
+
 import junit.framework.TestCase;
 
+import java.io.IOException;
+
 /**
  * Tests to make sure the lazy conversion of UTF8-encoded byte arrays to
  * strings works correctly.
diff --git a/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java b/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
index 4764ca1..29e8d87 100644
--- a/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
@@ -55,7 +55,7 @@
     // correctly when linked only against the lite library.
 
     // We do however do some basic testing to make sure that equals is actually
-    // overridden to test for value equality rather than simple object equality.
+    // overriden to test for value equality rather than simple object equality.
 
     // Check that two identical objs are equal.
     Foo foo1a = Foo.newBuilder()
diff --git a/java/core/src/test/java/com/google/protobuf/LiteTest.java b/java/core/src/test/java/com/google/protobuf/LiteTest.java
index 40b4453..88c3e0b 100644
--- a/java/core/src/test/java/com/google/protobuf/LiteTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LiteTest.java
@@ -33,9 +33,9 @@
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
 
-import com.google.protobuf.FieldPresenceTestProto.TestAllTypes;
 import com.google.protobuf.UnittestImportLite.ImportEnumLite;
 import com.google.protobuf.UnittestImportPublicLite.PublicImportMessageLite;
+import com.google.protobuf.UnittestLite;
 import com.google.protobuf.UnittestLite.ForeignEnumLite;
 import com.google.protobuf.UnittestLite.ForeignMessageLite;
 import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
@@ -46,21 +46,21 @@
 import com.google.protobuf.UnittestLite.TestAllTypesLite.OptionalGroup;
 import com.google.protobuf.UnittestLite.TestAllTypesLite.RepeatedGroup;
 import com.google.protobuf.UnittestLite.TestAllTypesLiteOrBuilder;
-import com.google.protobuf.UnittestLite.TestHugeFieldNumbersLite;
 import com.google.protobuf.UnittestLite.TestNestedExtensionLite;
 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;
 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.TestOneofEquals;
 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.TestRecursiveOneof;
-import java.lang.reflect.Field;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
+
 import junit.framework.TestCase;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 /**
  * Test lite runtime.
  *
@@ -139,6 +139,7 @@
         UnittestLite.optionalNestedMessageExtensionLite).getBb());
   }
   
+  
   public void testClone() {
     TestAllTypesLite.Builder expected = TestAllTypesLite.newBuilder()
         .setOptionalInt32(123);
@@ -161,31 +162,6 @@
       // expected.
     }
   }
-
-  public void testMemoization() throws Exception {
-    TestAllExtensionsLite message = TestUtilLite.getAllLiteExtensionsSet();
-
-    // Test serialized size is memoized
-    message.memoizedSerializedSize = -1;
-    int size = message.getSerializedSize();
-    assertTrue(size > 0);
-    assertEquals(size, message.memoizedSerializedSize);
-
-    // Test hashCode is memoized
-    assertEquals(0, message.memoizedHashCode);
-    int hashCode = message.hashCode();
-    assertTrue(hashCode != 0);
-    assertEquals(hashCode, message.memoizedHashCode);
-
-    // Test isInitialized is memoized
-    Field memo = message.getClass().getDeclaredField("memoizedIsInitialized");
-    memo.setAccessible(true);
-    memo.set(message, (byte) -1);
-    boolean initialized = message.isInitialized();
-    assertTrue(initialized);
-    // We have to cast to Byte first. Casting to byte causes a type error
-    assertEquals(1, ((Byte) memo.get(message)).intValue());
-  }
   
   public void testSanityCopyOnWrite() throws InvalidProtocolBufferException {
     // Since builders are implemented as a thin wrapper around a message
@@ -1453,55 +1429,10 @@
             UnittestLite.optionalFixed32ExtensionLite));
   }
 
-  public void testBuilderMergeFromNull() throws Exception {
-    try {
-      TestAllTypesLite.newBuilder().mergeFrom((TestAllTypesLite) null);
-      fail("Expected exception");
-    } catch (NullPointerException e) {
-      // Pass.
-    }
-  }
-
-  // Builder.mergeFrom() should keep existing extensions.
-  public void testBuilderMergeFromWithExtensions() throws Exception {
-    TestAllExtensionsLite message =
-        TestAllExtensionsLite.newBuilder()
-            .addExtension(UnittestLite.repeatedInt32ExtensionLite, 12)
-            .build();
-
-    ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();
-    UnittestLite.registerAllExtensions(registry);
-
-    TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
-    builder.mergeFrom(message.toByteArray(), registry);
-    builder.mergeFrom(message.toByteArray(), registry);
-    TestAllExtensionsLite result = builder.build();
-    assertEquals(2, result.getExtensionCount(UnittestLite.repeatedInt32ExtensionLite));
-    assertEquals(12, result.getExtension(UnittestLite.repeatedInt32ExtensionLite, 0).intValue());
-    assertEquals(12, result.getExtension(UnittestLite.repeatedInt32ExtensionLite, 1).intValue());
-  }
-
-  // Builder.mergeFrom() should keep existing unknown fields.
-  public void testBuilderMergeFromWithUnknownFields() throws Exception {
-    TestAllTypesLite message = TestAllTypesLite.newBuilder().addRepeatedInt32(1).build();
-
-    NestedMessage.Builder builder = NestedMessage.newBuilder();
-    builder.mergeFrom(message.toByteArray());
-    builder.mergeFrom(message.toByteArray());
-    NestedMessage result = builder.build();
-    assertEquals(message.getSerializedSize() * 2, result.getSerializedSize());
-  }
-
   public void testToStringDefaultInstance() throws Exception {
     assertToStringEquals("", TestAllTypesLite.getDefaultInstance());
   }
 
-  public void testToStringScalarFieldsSuffixedWithList() throws Exception {
-    assertToStringEquals("deceptively_named_list: 7", TestAllTypesLite.newBuilder()
-        .setDeceptivelyNamedList(7)
-        .build());
-  }
-
   public void testToStringPrimitives() throws Exception {
     TestAllTypesLite proto = TestAllTypesLite.newBuilder()
         .setOptionalInt32(1)
@@ -1699,7 +1630,7 @@
       fail();
     } catch (InvalidProtocolBufferException expected) {}
   }
-
+  
   public void testMergeFrom_sanity() throws Exception {
     TestAllTypesLite one = TestUtilLite.getAllLiteSetBuilder().build();
     byte[] bytes = one.toByteArray();
@@ -1711,19 +1642,7 @@
     assertEquals(two, one);
     assertEquals(one.hashCode(), two.hashCode());
   }
-
-  public void testMergeFromNoLazyFieldSharing() throws Exception {
-    TestAllTypesLite.Builder sourceBuilder = TestAllTypesLite.newBuilder().setOptionalLazyMessage(
-        TestAllTypesLite.NestedMessage.newBuilder().setBb(1));
-    TestAllTypesLite.Builder targetBuilder =
-        TestAllTypesLite.newBuilder().mergeFrom(sourceBuilder.build());
-    assertEquals(1, sourceBuilder.getOptionalLazyMessage().getBb());
-    // now change the sourceBuilder, and target value shouldn't be affected.
-    sourceBuilder.setOptionalLazyMessage(
-        TestAllTypesLite.NestedMessage.newBuilder().setBb(2));
-    assertEquals(1, targetBuilder.getOptionalLazyMessage().getBb());
-  }
-
+  
   public void testEquals_notEqual() throws Exception {
     TestAllTypesLite one = TestUtilLite.getAllLiteSetBuilder().build();
     byte[] bytes = one.toByteArray();
@@ -2245,24 +2164,6 @@
     assertFalse(bar.equals(barPrime));
   }
 
-  public void testEqualsAndHashCodeForTrickySchemaTypes() {
-    Foo foo1 = Foo.newBuilder()
-        .build();
-    Foo foo2 = Foo.newBuilder()
-        .setSint64(1)
-        .build();
-    Foo foo3 = Foo.newBuilder()
-        .putMyMap("key", "value2")
-        .build();
-    Foo foo4 = Foo.newBuilder()
-        .setMyGroup(Foo.MyGroup.newBuilder().setValue(4).build())
-        .build();
-
-    assertEqualsAndHashCodeAreFalse(foo1, foo2);
-    assertEqualsAndHashCodeAreFalse(foo1, foo3);
-    assertEqualsAndHashCodeAreFalse(foo1, foo4);
-  }
-
   public void testOneofEquals() throws Exception {
     TestOneofEquals.Builder builder = TestOneofEquals.newBuilder();
     TestOneofEquals message1 = builder.build();
@@ -2301,21 +2202,6 @@
     assertEqualsAndHashCodeAreFalse(fooWithOnlyValue, fooWithValueAndUnknownFields);
     assertEqualsAndHashCodeAreFalse(fooWithValueAndExtension, fooWithValueAndUnknownFields);
   }
-
-  public void testEqualsAndHashCodeWithExtensions() throws InvalidProtocolBufferException {
-    Foo fooWithOnlyValue = Foo.newBuilder()
-        .setValue(1)
-        .build();
-
-    Foo fooWithValueAndExtension = fooWithOnlyValue.toBuilder()
-        .setValue(1)
-        .setExtension(Bar.fooExt, Bar.newBuilder()
-            .setName("name")
-            .build())
-        .build();
-
-    assertEqualsAndHashCodeAreFalse(fooWithOnlyValue, fooWithValueAndExtension);
-  }
   
   // Test to ensure we avoid a class cast exception with oneofs.
   public void testEquals_oneOfMessages() {
@@ -2331,25 +2217,6 @@
     assertFalse(other.equals(mine));
   }
 
-  public void testHugeFieldNumbers() throws InvalidProtocolBufferException {
-    TestHugeFieldNumbersLite message =
-        TestHugeFieldNumbersLite.newBuilder()
-            .setOptionalInt32(1)
-            .addRepeatedInt32(2)
-            .setOptionalEnum(ForeignEnumLite.FOREIGN_LITE_FOO)
-            .setOptionalString("xyz")
-            .setOptionalMessage(ForeignMessageLite.newBuilder().setC(3).build())
-            .build();
-
-    TestHugeFieldNumbersLite parsedMessage =
-        TestHugeFieldNumbersLite.parseFrom(message.toByteArray());
-    assertEquals(1, parsedMessage.getOptionalInt32());
-    assertEquals(2, parsedMessage.getRepeatedInt32(0));
-    assertEquals(ForeignEnumLite.FOREIGN_LITE_FOO, parsedMessage.getOptionalEnum());
-    assertEquals("xyz", parsedMessage.getOptionalString());
-    assertEquals(3, parsedMessage.getOptionalMessage().getC());
-  }
-
   private void assertEqualsAndHashCodeAreFalse(Object o1, Object o2) {
     assertFalse(o1.equals(o2));
     assertFalse(o1.hashCode() == o2.hashCode());
@@ -2359,284 +2226,4 @@
     // This tests that we don't infinite loop.
     TestRecursiveOneof.getDefaultInstance().hashCode();
   }
-
-  public void testParseFromByteBuffer() throws Exception {
-    TestAllTypesLite message =
-        TestAllTypesLite.newBuilder()
-            .setOptionalInt32(123)
-            .addRepeatedString("hello")
-            .setOptionalNestedMessage(TestAllTypesLite.NestedMessage.newBuilder().setBb(7))
-            .build();
-
-    TestAllTypesLite copy =
-        TestAllTypesLite.parseFrom(message.toByteString().asReadOnlyByteBuffer());
-
-    assertEquals(message, copy);
-  }
-
-  public void testParseFromByteBufferThrows() {
-    try {
-      TestAllTypesLite.parseFrom(ByteBuffer.wrap(new byte[] { 0x5 }));
-      fail();
-    } catch (InvalidProtocolBufferException expected) {
-    }
-
-    TestAllTypesLite message =
-        TestAllTypesLite.newBuilder()
-            .setOptionalInt32(123)
-            .addRepeatedString("hello")
-            .build();
-
-    ByteBuffer buffer = ByteBuffer.wrap(message.toByteArray(), 0, message.getSerializedSize() - 1);
-    try {
-      TestAllTypesLite.parseFrom(buffer);
-      fail();
-    } catch (InvalidProtocolBufferException expected) {
-      assertEquals(
-          TestAllTypesLite.newBuilder()
-              .setOptionalInt32(123)
-              .build(),
-          expected.getUnfinishedMessage());
-    }
-  }
-
-  public void testParseFromByteBuffer_extensions() throws Exception {
-    TestAllExtensionsLite message =
-        TestAllExtensionsLite.newBuilder()
-            .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)
-            .addExtension(UnittestLite.repeatedStringExtensionLite, "hello")
-            .setExtension(
-                UnittestLite.optionalNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAZ)
-            .setExtension(
-                UnittestLite.optionalNestedMessageExtensionLite,
-                TestAllTypesLite.NestedMessage.newBuilder().setBb(7).build())
-            .build();
-
-    ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();
-    UnittestLite.registerAllExtensions(registry);
-
-    TestAllExtensionsLite copy =
-        TestAllExtensionsLite.parseFrom(message.toByteString().asReadOnlyByteBuffer(), registry);
-
-    assertEquals(message, copy);
-  }
-
-  public void testParseFromByteBufferThrows_extensions() {
-    ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();
-    UnittestLite.registerAllExtensions(registry);
-    try {
-      TestAllExtensionsLite.parseFrom(ByteBuffer.wrap(new byte[] { 0x5 }), registry);
-      fail();
-    } catch (InvalidProtocolBufferException expected) {
-    }
-
-    TestAllExtensionsLite message =
-        TestAllExtensionsLite.newBuilder()
-            .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)
-            .addExtension(UnittestLite.repeatedStringExtensionLite, "hello")
-            .build();
-
-    ByteBuffer buffer = ByteBuffer.wrap(message.toByteArray(), 0, message.getSerializedSize() - 1);
-    try {
-      TestAllExtensionsLite.parseFrom(buffer, registry);
-      fail();
-    } catch (InvalidProtocolBufferException expected) {
-      assertEquals(
-          TestAllExtensionsLite.newBuilder()
-              .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)
-              .build(),
-          expected.getUnfinishedMessage());
-    }
-  }
-
-  // Make sure we haven't screwed up the code generation for packing fields by default.
-  public void testPackedSerialization() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    builder.addRepeatedInt32(4321);
-    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
-    TestAllTypes message = builder.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);
-    }
-  }
-
-  public void testAddAllIteratesOnce() {
-    TestAllTypesLite message =
-        TestAllTypesLite.newBuilder()
-            .addAllRepeatedBool(new OneTimeIterableList(false))
-            .addAllRepeatedInt32(new OneTimeIterableList(0))
-            .addAllRepeatedInt64(new OneTimeIterableList(0L))
-            .addAllRepeatedFloat(new OneTimeIterableList(0f))
-            .addAllRepeatedDouble(new OneTimeIterableList(0d))
-            .addAllRepeatedBytes(new OneTimeIterableList(ByteString.EMPTY))
-            .addAllRepeatedString(new OneTimeIterableList(""))
-            .addAllRepeatedNestedMessage(
-                new OneTimeIterableList(NestedMessage.getDefaultInstance()))
-            .addAllRepeatedBool(new OneTimeIterable(false))
-            .addAllRepeatedInt32(new OneTimeIterable(0))
-            .addAllRepeatedInt64(new OneTimeIterable(0L))
-            .addAllRepeatedFloat(new OneTimeIterable(0f))
-            .addAllRepeatedDouble(new OneTimeIterable(0d))
-            .addAllRepeatedBytes(new OneTimeIterable(ByteString.EMPTY))
-            .addAllRepeatedString(new OneTimeIterable(""))
-            .addAllRepeatedNestedMessage(new OneTimeIterable(NestedMessage.getDefaultInstance()))
-            .build();
-  }
-
-  public void testAddAllIteratesOnce_throwsOnNull() {
-    TestAllTypesLite.Builder builder = TestAllTypesLite.newBuilder();
-    try {
-      builder.addAllRepeatedBool(new OneTimeIterableList(true, false, (Boolean) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 2 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedBoolCount());
-    }
-
-    try {
-      builder.addAllRepeatedBool(new OneTimeIterable(true, false, (Boolean) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 2 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedBoolCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedBool(new OneTimeIterableList((Boolean) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedBoolCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedInt32(new OneTimeIterableList((Integer) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedInt32Count());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedInt64(new OneTimeIterableList((Long) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedInt64Count());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedFloat(new OneTimeIterableList((Float) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedFloatCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedDouble(new OneTimeIterableList((Double) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedDoubleCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedBytes(new OneTimeIterableList((ByteString) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedBytesCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedString(new OneTimeIterableList("", "", (String) null, ""));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 2 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedStringCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedString(new OneTimeIterable("", "", (String) null, ""));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 2 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedStringCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedString(new OneTimeIterableList((String) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedStringCount());
-    }
-
-    try {
-      builder = TestAllTypesLite.newBuilder();
-      builder.addAllRepeatedNestedMessage(new OneTimeIterableList((NestedMessage) null));
-      fail();
-    } catch (NullPointerException expected) {
-      assertEquals("Element at index 0 is null.", expected.getMessage());
-      assertEquals(0, builder.getRepeatedNestedMessageCount());
-    }
-  }
-
-  private static final class OneTimeIterableList<T> extends ArrayList<T> {
-    private boolean wasIterated = false;
-
-    OneTimeIterableList(T... contents) {
-      addAll(Arrays.asList(contents));
-    }
-
-    @Override
-    public Iterator<T> iterator() {
-      if (wasIterated) {
-        fail();
-      }
-      wasIterated = true;
-      return super.iterator();
-    }
-  }
-
-  private static final class OneTimeIterable<T> implements Iterable<T> {
-    private final List<T> list;
-    private boolean wasIterated = false;
-
-    OneTimeIterable(T... contents) {
-      list = Arrays.asList(contents);
-    }
-
-    @Override
-    public Iterator<T> iterator() {
-      if (wasIterated) {
-        fail();
-      }
-      wasIterated = true;
-      return list.iterator();
-    }
-  }
-
-  public void testNullExtensionRegistry() throws Exception {
-    try {
-      TestAllTypesLite.parseFrom(new byte[] {}, null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-  }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java b/java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java
index eac4744..2e7792a 100644
--- a/java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java
@@ -30,6 +30,8 @@
 
 package com.google.protobuf;
 
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.EOFException;
@@ -43,7 +45,6 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.NoSuchElementException;
-import junit.framework.TestCase;
 
 /**
  * Test {@code LiteralByteString} by setting up a reference string in {@link #setUp()}.
diff --git a/java/core/src/test/java/com/google/protobuf/LongArrayListTest.java b/java/core/src/test/java/com/google/protobuf/LongArrayListTest.java
index 6bbdfca..0a8f9ed 100644
--- a/java/core/src/test/java/com/google/protobuf/LongArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LongArrayListTest.java
@@ -32,56 +32,56 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link LongArrayList}.
- *
+ * 
  * @author dweis@google.com (Daniel Weis)
  */
 public class LongArrayListTest extends TestCase {
-
-  private static final LongArrayList UNARY_LIST =
-      newImmutableLongArrayList(1);
+  
+  private static final LongArrayList UNARY_LIST = newImmutableLongArrayList(1);
   private static final LongArrayList TERTIARY_LIST =
       newImmutableLongArrayList(1, 2, 3);
-
+  
   private LongArrayList list;
-
+  
   @Override
   protected void setUp() throws Exception {
     list = new LongArrayList();
   }
-
+  
   public void testEmptyListReturnsSameInstance() {
     assertSame(LongArrayList.emptyList(), LongArrayList.emptyList());
   }
-
+  
   public void testEmptyListIsImmutable() {
     assertImmutable(LongArrayList.emptyList());
   }
-
+  
   public void testMakeImmutable() {
-    list.addLong(3);
+    list.addLong(2);
     list.addLong(4);
-    list.addLong(5);
-    list.addLong(7);
+    list.addLong(6);
+    list.addLong(8);
     list.makeImmutable();
     assertImmutable(list);
   }
-
+  
   public void testModificationWithIteration() {
     list.addAll(asList(1L, 2L, 3L, 4L));
     Iterator<Long> iterator = list.iterator();
     assertEquals(4, list.size());
-    assertEquals(1L, (long) list.get(0));
-    assertEquals(1L, (long) iterator.next());
+    assertEquals(1, (long) list.get(0));
+    assertEquals(1, (long) iterator.next());
     list.set(0, 1L);
-    assertEquals(2L, (long) iterator.next());
-
+    assertEquals(2, (long) iterator.next());
+    
     list.remove(0);
     try {
       iterator.next();
@@ -89,7 +89,7 @@
     } catch (ConcurrentModificationException e) {
       // expected
     }
-
+    
     iterator = list.iterator();
     list.add(0, 0L);
     try {
@@ -99,19 +99,19 @@
       // expected
     }
   }
-
+  
   public void testGet() {
-    assertEquals(1L, (long) TERTIARY_LIST.get(0));
-    assertEquals(2L, (long) TERTIARY_LIST.get(1));
-    assertEquals(3L, (long) TERTIARY_LIST.get(2));
-
+    assertEquals(1, (long) TERTIARY_LIST.get(0));
+    assertEquals(2, (long) TERTIARY_LIST.get(1));
+    assertEquals(3, (long) TERTIARY_LIST.get(2));
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -119,19 +119,19 @@
       // expected
     }
   }
-
+  
   public void testGetLong() {
-    assertEquals(1L, TERTIARY_LIST.getLong(0));
-    assertEquals(2L, TERTIARY_LIST.getLong(1));
-    assertEquals(3L, TERTIARY_LIST.getLong(2));
-
+    assertEquals(1, TERTIARY_LIST.getLong(0));
+    assertEquals(2, TERTIARY_LIST.getLong(1));
+    assertEquals(3, TERTIARY_LIST.getLong(2));
+    
     try {
       TERTIARY_LIST.get(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       TERTIARY_LIST.get(3);
       fail();
@@ -139,35 +139,35 @@
       // expected
     }
   }
-
+  
   public void testSize() {
     assertEquals(0, LongArrayList.emptyList().size());
     assertEquals(1, UNARY_LIST.size());
     assertEquals(3, TERTIARY_LIST.size());
 
-    list.addLong(3);
+    list.addLong(2);
     list.addLong(4);
     list.addLong(6);
     list.addLong(8);
     assertEquals(4, list.size());
-
+    
     list.remove(0);
     assertEquals(3, list.size());
-
-    list.add(17L);
+    
+    list.add(16L);
     assertEquals(4, list.size());
   }
-
+  
   public void testSet() {
     list.addLong(2);
     list.addLong(4);
+    
+    assertEquals(2, (long) list.set(0, 0L));
+    assertEquals(0, list.getLong(0));
 
-    assertEquals(2L, (long) list.set(0, 3L));
-    assertEquals(3L, list.getLong(0));
-
-    assertEquals(4L, (long) list.set(1, 0L));
-    assertEquals(0L, list.getLong(1));
-
+    assertEquals(4, (long) list.set(1, 0L));
+    assertEquals(0, list.getLong(1));
+    
     try {
       list.set(-1, 0L);
       fail();
@@ -182,17 +182,17 @@
       // expected
     }
   }
-
+  
   public void testSetLong() {
-    list.addLong(1);
-    list.addLong(3);
+    list.addLong(2);
+    list.addLong(4);
+    
+    assertEquals(2, list.setLong(0, 0));
+    assertEquals(0, list.getLong(0));
 
-    assertEquals(1L, list.setLong(0, 0));
-    assertEquals(0L, list.getLong(0));
-
-    assertEquals(3L, list.setLong(1, 0));
-    assertEquals(0L, list.getLong(1));
-
+    assertEquals(4, list.setLong(1, 0));
+    assertEquals(0, list.getLong(1));
+    
     try {
       list.setLong(-1, 0);
       fail();
@@ -207,7 +207,7 @@
       // expected
     }
   }
-
+  
   public void testAdd() {
     assertEquals(0, list.size());
 
@@ -217,30 +217,28 @@
     assertTrue(list.add(3L));
     list.add(0, 4L);
     assertEquals(asList(4L, 2L, 3L), list);
-
+    
     list.add(0, 1L);
     list.add(0, 0L);
     // Force a resize by getting up to 11 elements.
     for (int i = 0; i < 6; i++) {
       list.add(Long.valueOf(5 + i));
     }
-    assertEquals(
-        asList(0L, 1L, 4L, 2L, 3L, 5L, 6L, 7L, 8L, 9L, 10L),
-        list);
-
+    assertEquals(asList(0L, 1L, 4L, 2L, 3L, 5L, 6L, 7L, 8L, 9L, 10L), list);
+    
     try {
       list.add(-1, 5L);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.add(4, 5L);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   public void testAddLong() {
     assertEquals(0, list.size());
 
@@ -250,128 +248,128 @@
     list.addLong(3);
     assertEquals(asList(2L, 3L), list);
   }
-
+  
   public void testAddAll() {
     assertEquals(0, list.size());
 
     assertTrue(list.addAll(Collections.singleton(1L)));
     assertEquals(1, list.size());
-    assertEquals(1L, (long) list.get(0));
-    assertEquals(1L, list.getLong(0));
-
+    assertEquals(1, (long) list.get(0));
+    assertEquals(1, list.getLong(0));
+    
     assertTrue(list.addAll(asList(2L, 3L, 4L, 5L, 6L)));
     assertEquals(asList(1L, 2L, 3L, 4L, 5L, 6L), list);
-
+    
     assertTrue(list.addAll(TERTIARY_LIST));
     assertEquals(asList(1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L), list);
 
     assertFalse(list.addAll(Collections.<Long>emptyList()));
     assertFalse(list.addAll(LongArrayList.emptyList()));
   }
-
+  
   public void testRemove() {
     list.addAll(TERTIARY_LIST);
-    assertEquals(1L, (long) list.remove(0));
+    assertEquals(1, (long) list.remove(0));
     assertEquals(asList(2L, 3L), list);
 
-    assertTrue(list.remove(Long.valueOf(3)));
+    assertTrue(list.remove(3L));
     assertEquals(asList(2L), list);
 
-    assertFalse(list.remove(Long.valueOf(3)));
+    assertFalse(list.remove(3L));
     assertEquals(asList(2L), list);
 
-    assertEquals(2L, (long) list.remove(0));
+    assertEquals(2, (long) list.remove(0));
     assertEquals(asList(), list);
-
+    
     try {
       list.remove(-1);
       fail();
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
-
+    
     try {
       list.remove(0);
     } catch (IndexOutOfBoundsException e) {
       // expected
     }
   }
-
+  
   private void assertImmutable(LongArrayList list) {
     if (list.contains(1L)) {
       throw new RuntimeException("Cannot test the immutability of lists that contain 1.");
     }
-
+    
     try {
       list.add(1L);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.add(0, 1L);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.<Long>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(Collections.singletonList(1L));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(new LongArrayList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.singleton(1L));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addAll(0, Collections.<Long>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.addLong(0);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.clear();
       fail();
@@ -385,63 +383,63 @@
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.remove(new Object());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.<Long>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(Collections.singleton(1L));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.removeAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.<Long>emptyList());
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(Collections.singleton(1L));
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.retainAll(UNARY_LIST);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.set(0, 0L);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-
+    
     try {
       list.setLong(0, 0);
       fail();
@@ -449,7 +447,7 @@
       // expected
     }
   }
-
+  
   private static LongArrayList newImmutableLongArrayList(long... elements) {
     LongArrayList list = new LongArrayList();
     for (long element : elements) {
diff --git a/java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java b/java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java
index da9195f..d79d002 100644
--- a/java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java
+++ b/java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java
@@ -30,56 +30,48 @@
 
 package com.google.protobuf;
 
-import map_lite_test.MapForProto2TestProto.BizarroTestMap;
 import map_lite_test.MapForProto2TestProto.TestMap;
 import map_lite_test.MapForProto2TestProto.TestMap.MessageValue;
-import map_lite_test.MapForProto2TestProto.TestMapOrBuilder;
 import map_lite_test.MapForProto2TestProto.TestUnknownEnumValue;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
+
+import junit.framework.TestCase;
+
 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 MapForProto2LiteTest extends TestCase {
-
+public class MapForProto2LiteTest extends TestCase {
   private void setMapValues(TestMap.Builder builder) {
-    builder
-        .putInt32ToInt32Field(1, 11)
-        .putInt32ToInt32Field(2, 22)
-        .putInt32ToInt32Field(3, 33)
+    builder.getMutableInt32ToInt32Field().put(1, 11);
+    builder.getMutableInt32ToInt32Field().put(2, 22);
+    builder.getMutableInt32ToInt32Field().put(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 mapBuilder = TestMap.newBuilder();
-    setMapValues(mapBuilder);
-    TestMap map = mapBuilder.build();
-    assertMapValuesSet(map);
+    builder.getMutableInt32ToStringField().put(1, "11");
+    builder.getMutableInt32ToStringField().put(2, "22");
+    builder.getMutableInt32ToStringField().put(3, "33");
+    
+    builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11"));
+    builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22"));
+    builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33"));
+    
+    builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO);
+    builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR);
+    builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ);
+    
+    builder.getMutableInt32ToMessageField().put(
+        1, MessageValue.newBuilder().setValue(11).build());
+    builder.getMutableInt32ToMessageField().put(
+        2, MessageValue.newBuilder().setValue(22).build());
+    builder.getMutableInt32ToMessageField().put(
+        3, MessageValue.newBuilder().setValue(33).build());
+    
+    builder.getMutableStringToInt32Field().put("1", 11);
+    builder.getMutableStringToInt32Field().put("2", 22);
+    builder.getMutableStringToInt32Field().put("3", 33);
   }
 
   private void copyMapValues(TestMap source, TestMap.Builder destination) {
@@ -102,22 +94,22 @@
     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());
@@ -125,42 +117,31 @@
   }
 
   private void updateMapValues(TestMap.Builder builder) {
-    builder
-        .putInt32ToInt32Field(1, 111)
-        .removeInt32ToInt32Field(2)
-        .putInt32ToInt32Field(4, 44)
+    builder.getMutableInt32ToInt32Field().put(1, 111);
+    builder.getMutableInt32ToInt32Field().remove(2);
+    builder.getMutableInt32ToInt32Field().put(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);
+    builder.getMutableInt32ToStringField().put(1, "111");
+    builder.getMutableInt32ToStringField().remove(2);
+    builder.getMutableInt32ToStringField().put(4, "44");
+    
+    builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111"));
+    builder.getMutableInt32ToBytesField().remove(2);
+    builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44"));
+    
+    builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR);
+    builder.getMutableInt32ToEnumField().remove(2);
+    builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX);
+    
+    builder.getMutableInt32ToMessageField().put(
+        1, MessageValue.newBuilder().setValue(111).build());
+    builder.getMutableInt32ToMessageField().remove(2);
+    builder.getMutableInt32ToMessageField().put(
+        4, MessageValue.newBuilder().setValue(44).build());
+    
+    builder.getMutableStringToInt32Field().put("1", 111);
+    builder.getMutableStringToInt32Field().remove("2");
+    builder.getMutableStringToInt32Field().put("4", 44);
   }
 
   private void assertMapValuesUpdated(TestMap message) {
@@ -173,149 +154,188 @@
     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());
+  private void assertMapValuesCleared(TestMap message) {
+    assertEquals(0, message.getInt32ToInt32Field().size());
+    assertEquals(0, message.getInt32ToStringField().size());
+    assertEquals(0, message.getInt32ToBytesField().size());
+    assertEquals(0, message.getInt32ToEnumField().size());
+    assertEquals(0, message.getInt32ToMessageField().size());
+    assertEquals(0, message.getStringToInt32Field().size());
   }
 
   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);
+    Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
+    intMap.put(1, 2);
     assertTrue(message.getInt32ToInt32Field().isEmpty());
     message = builder.build();
-    assertEquals(newMap(1, 2), message.getInt32ToInt32Field());
-    assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
-    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);
+      intMap.put(2, 3);
       fail();
     } catch (UnsupportedOperationException e) {
       // expected
     }
-    if (!map.isEmpty()) {
-      try {
-        map.entrySet().remove(map.entrySet().iterator().next());
-        fail();
-      } catch (UnsupportedOperationException e) {
-        // expected
-      }
-    }
-  }
-
-  public void testMutableMapLifecycle() {
-    TestMap.Builder builder = TestMap.newBuilder()
-        .putInt32ToInt32Field(1, 2);
-    assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
+    assertEquals(newMap(1, 2), message.getInt32ToInt32Field());
     assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
-    builder.putInt32ToInt32Field(2, 3);
+    builder.getMutableInt32ToInt32Field().put(2, 3);
+    assertEquals(newMap(1, 2), message.getInt32ToInt32Field());
+    assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
+  }
+  
+  public void testMutableMapLifecycle() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
+    intMap.put(1, 2);
+    assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
+    try {
+      intMap.put(2, 3);
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
+    builder.getMutableInt32ToInt32Field().put(2, 3);
     assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
 
-    builder.putInt32ToEnumField(1, TestMap.EnumValue.BAR);
+    Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField();
+    enumMap.put(1, TestMap.EnumValue.BAR);
     assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnumField());
+    try {
+      enumMap.put(2, TestMap.EnumValue.FOO);
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
     assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField());
-    builder.putInt32ToEnumField(2, TestMap.EnumValue.FOO);
+    builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO);
     assertEquals(
         newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO),
         builder.getInt32ToEnumField());
-
-    builder.putInt32ToStringField(1, "1");
+    
+    Map<Integer, String> stringMap = builder.getMutableInt32ToStringField();
+    stringMap.put(1, "1");
     assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField());
+    try {
+      stringMap.put(2, "2");
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
     assertEquals(newMap(1, "1"), builder.getInt32ToStringField());
-    builder.putInt32ToStringField(2, "2");
-    assertEquals(newMap(1, "1", 2, "2"), builder.getInt32ToStringField());
-
-    builder.putInt32ToMessageField(1, TestMap.MessageValue.getDefaultInstance());
+    builder.getMutableInt32ToStringField().put(2, "2");
+    assertEquals(
+        newMap(1, "1", 2, "2"),
+        builder.getInt32ToStringField());
+    
+    Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMessageField();
+    messageMap.put(1, TestMap.MessageValue.getDefaultInstance());
     assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
         builder.build().getInt32ToMessageField());
+    try {
+      messageMap.put(2, TestMap.MessageValue.getDefaultInstance());
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
     assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
         builder.getInt32ToMessageField());
-    builder.putInt32ToMessageField(2, TestMap.MessageValue.getDefaultInstance());
+    builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefaultInstance());
     assertEquals(
         newMap(1, TestMap.MessageValue.getDefaultInstance(),
             2, TestMap.MessageValue.getDefaultInstance()),
         builder.getInt32ToMessageField());
   }
 
+  public void testMutableMapLifecycle_collections() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
+    intMap.put(1, 2);
+    assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
+    try {
+      intMap.remove(2);
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    try {
+      intMap.entrySet().remove(new Object());
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    try {
+      intMap.entrySet().iterator().remove();
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    try {
+      intMap.keySet().remove(new Object());
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    try {
+      intMap.values().remove(new Object());
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    try {
+      intMap.values().iterator().remove();
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    assertEquals(newMap(1, 2), intMap);
+    assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
+    assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
+  }
+
   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);
   }
@@ -324,52 +344,12 @@
     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 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);
@@ -377,14 +357,14 @@
     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();
@@ -392,61 +372,12 @@
     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());
@@ -455,26 +386,26 @@
   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.Builder b1 = TestMap.newBuilder();
+    b1.getMutableInt32ToInt32Field().put(1, 2);
+    b1.getMutableInt32ToInt32Field().put(3, 4);
+    b1.getMutableInt32ToInt32Field().put(5, 6);
     TestMap m1 = b1.build();
-
-    TestMap.Builder b2 = TestMap.newBuilder()
-        .putInt32ToInt32Field(5, 6)
-        .putInt32ToInt32Field(1, 2)
-        .putInt32ToInt32Field(3, 4);
+    
+    TestMap.Builder b2 = TestMap.newBuilder();
+    b2.getMutableInt32ToInt32Field().put(5, 6);
+    b2.getMutableInt32ToInt32Field().put(1, 2);
+    b2.getMutableInt32ToInt32Field().put(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);
+    b2.getMutableInt32ToInt32Field().put(1, 0);
     m2 = b2.build();
     assertFalse(m1.equals(m2));
     // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
@@ -482,9 +413,10 @@
   }
 
   public void testUnknownEnumValues() throws Exception {
-    TestUnknownEnumValue.Builder builder = TestUnknownEnumValue.newBuilder()
-        .putInt32ToInt32Field(1, 1)
-        .putInt32ToInt32Field(2, 54321);
+    TestUnknownEnumValue.Builder builder =
+        TestUnknownEnumValue.newBuilder();
+    builder.getMutableInt32ToInt32Field().put(1, 1);
+    builder.getMutableInt32ToInt32Field().put(2, 54321);
     ByteString data = builder.build().toByteString();
 
     TestMap message = TestMap.parseFrom(data);
@@ -501,6 +433,7 @@
     assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).intValue());
   }
 
+
   public void testIterationOrder() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
     setMapValues(builder);
@@ -509,288 +442,17 @@
     assertEquals(Arrays.asList("1", "2", "3"),
         new ArrayList<String>(message.getStringToInt32Field().keySet()));
   }
-
+  
   private static <K, V> Map<K, V> newMap(K key1, V value1) {
     Map<K, V> map = new HashMap<K, V>();
     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<K, V>();
     map.put(key1, value1);
     map.put(key2, value2);
     return map;
   }
-
-  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.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(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(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
-    }
-  }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/MapForProto2Test.java b/java/core/src/test/java/com/google/protobuf/MapForProto2Test.java
index 37827f7..73154c0 100644
--- a/java/core/src/test/java/com/google/protobuf/MapForProto2Test.java
+++ b/java/core/src/test/java/com/google/protobuf/MapForProto2Test.java
@@ -31,99 +31,52 @@
 package com.google.protobuf;
 
 import com.google.protobuf.Descriptors.FieldDescriptor;
-import map_test.MapForProto2TestProto.BizarroTestMap;
-import map_test.MapForProto2TestProto.ReservedAsMapField;
-import map_test.MapForProto2TestProto.ReservedAsMapFieldWithEnumValue;
 import map_test.MapForProto2TestProto.TestMap;
 import map_test.MapForProto2TestProto.TestMap.MessageValue;
 import map_test.MapForProto2TestProto.TestMap.MessageWithRequiredFields;
-import map_test.MapForProto2TestProto.TestMapOrBuilder;
 import map_test.MapForProto2TestProto.TestRecursiveMap;
 import map_test.MapForProto2TestProto.TestUnknownEnumValue;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
+import junit.framework.TestCase;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import junit.framework.TestCase;
 
 /**
  * Unit tests for map fields in proto2 protos.
  */
 public class MapForProto2Test extends TestCase {
-
-  private void setMapValuesUsingMutableMap(TestMap.Builder builder) {
+  private void setMapValues(TestMap.Builder builder) {
     builder.getMutableInt32ToInt32Field().put(1, 11);
     builder.getMutableInt32ToInt32Field().put(2, 22);
     builder.getMutableInt32ToInt32Field().put(3, 33);
-  //
+
     builder.getMutableInt32ToStringField().put(1, "11");
     builder.getMutableInt32ToStringField().put(2, "22");
     builder.getMutableInt32ToStringField().put(3, "33");
-  //
+    
     builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11"));
     builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22"));
     builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33"));
-  //
+    
     builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO);
     builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR);
     builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ);
-  //
+    
     builder.getMutableInt32ToMessageField().put(
         1, MessageValue.newBuilder().setValue(11).build());
     builder.getMutableInt32ToMessageField().put(
         2, MessageValue.newBuilder().setValue(22).build());
     builder.getMutableInt32ToMessageField().put(
         3, MessageValue.newBuilder().setValue(33).build());
-  //
+    
     builder.getMutableStringToInt32Field().put("1", 11);
     builder.getMutableStringToInt32Field().put("2", 22);
     builder.getMutableStringToInt32Field().put("3", 33);
   }
 
-  private void setMapValuesUsingAccessors(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();
-    setMapValuesUsingMutableMap(usingMutableMapBuilder);
-    TestMap usingMutableMap = usingMutableMapBuilder.build();
-    assertMapValuesSet(usingMutableMap);
-
-    TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(usingAccessorsBuilder);
-    TestMap usingAccessors = usingAccessorsBuilder.build();
-    assertMapValuesSet(usingAccessors);
-
-    assertEquals(usingAccessors, usingMutableMap);
-  }
-
   private void copyMapValues(TestMap source, TestMap.Builder destination) {
     destination
         .putAllInt32ToInt32Field(source.getInt32ToInt32Field())
@@ -134,7 +87,7 @@
         .putAllStringToInt32Field(source.getStringToInt32Field());
   }
 
-  private void assertMapValuesSet(TestMapOrBuilder message) {
+  private void assertMapValuesSet(TestMap message) {
     assertEquals(3, message.getInt32ToInt32Field().size());
     assertEquals(11, message.getInt32ToInt32Field().get(1).intValue());
     assertEquals(22, message.getInt32ToInt32Field().get(2).intValue());
@@ -144,109 +97,56 @@
     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 updateMapValuesUsingMutableMap(TestMap.Builder builder) {
+  private void updateMapValues(TestMap.Builder builder) {
     builder.getMutableInt32ToInt32Field().put(1, 111);
     builder.getMutableInt32ToInt32Field().remove(2);
     builder.getMutableInt32ToInt32Field().put(4, 44);
-  //
+
     builder.getMutableInt32ToStringField().put(1, "111");
     builder.getMutableInt32ToStringField().remove(2);
     builder.getMutableInt32ToStringField().put(4, "44");
-  //
+    
     builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111"));
     builder.getMutableInt32ToBytesField().remove(2);
     builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44"));
-  //
+    
     builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR);
     builder.getMutableInt32ToEnumField().remove(2);
     builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX);
-  //
+    
     builder.getMutableInt32ToMessageField().put(
         1, MessageValue.newBuilder().setValue(111).build());
     builder.getMutableInt32ToMessageField().remove(2);
     builder.getMutableInt32ToMessageField().put(
         4, MessageValue.newBuilder().setValue(44).build());
-  //
+    
     builder.getMutableStringToInt32Field().put("1", 111);
     builder.getMutableStringToInt32Field().remove("2");
     builder.getMutableStringToInt32Field().put("4", 44);
   }
 
-  private void updateMapValuesUsingAccessors(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 usingMutableMapBuilder = TestMap.newBuilder();
-    setMapValuesUsingMutableMap(usingMutableMapBuilder);
-    TestMap usingMutableMap = usingMutableMapBuilder.build();
-    assertMapValuesSet(usingMutableMap);
-
-    TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(usingAccessorsBuilder);
-    TestMap usingAccessors = usingAccessorsBuilder.build();
-    assertMapValuesSet(usingAccessors);
-
-    assertEquals(usingAccessors, usingMutableMap);
-    //
-    usingMutableMapBuilder = usingMutableMap.toBuilder();
-    updateMapValuesUsingMutableMap(usingMutableMapBuilder);
-    usingMutableMap = usingMutableMapBuilder.build();
-    assertMapValuesUpdated(usingMutableMap);
-
-    usingAccessorsBuilder = usingAccessors.toBuilder();
-    updateMapValuesUsingAccessors(usingAccessorsBuilder);
-    usingAccessors = usingAccessorsBuilder.build();
-    assertMapValuesUpdated(usingAccessors);
-
-    assertEquals(usingAccessors, usingMutableMap);
-  }
-
   private void assertMapValuesUpdated(TestMap message) {
     assertEquals(3, message.getInt32ToInt32Field().size());
     assertEquals(111, message.getInt32ToInt32Field().get(1).intValue());
@@ -257,72 +157,37 @@
     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());
+  private void assertMapValuesCleared(TestMap message) {
+    assertEquals(0, message.getInt32ToInt32Field().size());
+    assertEquals(0, message.getInt32ToStringField().size());
+    assertEquals(0, message.getInt32ToBytesField().size());
+    assertEquals(0, message.getInt32ToEnumField().size());
+    assertEquals(0, message.getInt32ToMessageField().size());
+    assertEquals(0, message.getStringToInt32Field().size());
   }
-
-  public void testGetMapIsImmutable() {
-    TestMap.Builder builder = TestMap.newBuilder();
-    assertMapsAreImmutable(builder);
-    assertMapsAreImmutable(builder.build());
-
-    setMapValuesUsingAccessors(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
-    }
-  }
-
+  
   public void testMutableMapLifecycle() {
     TestMap.Builder builder = TestMap.newBuilder();
     Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
@@ -337,7 +202,7 @@
     assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
     builder.getMutableInt32ToInt32Field().put(2, 3);
     assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
- //
+
     Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField();
     enumMap.put(1, TestMap.EnumValue.BAR);
     assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnumField());
@@ -352,7 +217,7 @@
     assertEquals(
         newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO),
         builder.getInt32ToEnumField());
-  //
+    
     Map<Integer, String> stringMap = builder.getMutableInt32ToStringField();
     stringMap.put(1, "1");
     assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField());
@@ -367,7 +232,7 @@
     assertEquals(
         newMap(1, "1", 2, "2"),
         builder.getInt32ToStringField());
-  //
+    
     Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMessageField();
     messageMap.put(1, TestMap.MessageValue.getDefaultInstance());
     assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
@@ -386,7 +251,7 @@
             2, TestMap.MessageValue.getDefaultInstance()),
         builder.getInt32ToMessageField());
   }
-  //
+
   public void testMutableMapLifecycle_collections() {
     TestMap.Builder builder = TestMap.newBuilder();
     Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
@@ -433,96 +298,52 @@
     assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
   }
 
-
   public void testGettersAndSetters() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
     TestMap message = builder.build();
     assertMapValuesCleared(message);
-
+    
     builder = message.toBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     message = builder.build();
     assertMapValuesSet(message);
-
+    
     builder = message.toBuilder();
-    updateMapValuesUsingAccessors(builder);
+    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();
-    setMapValuesUsingAccessors(sourceBuilder);
+    setMapValues(sourceBuilder);
     TestMap source = sourceBuilder.build();
-    assertMapValuesSet(source);
 
     TestMap.Builder destination = TestMap.newBuilder();
     copyMapValues(source, destination);
     assertMapValuesSet(destination.build());
-
-    assertEquals(3, destination.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();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
     assertEquals(message.getSerializedSize(), message.toByteString().size());
     message = TestMap.parser().parseFrom(message.toByteString());
     assertMapValuesSet(message);
-
+    
     builder = message.toBuilder();
-    updateMapValuesUsingAccessors(builder);
+    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();
@@ -530,61 +351,12 @@
     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();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
-
+    
     TestMap.Builder other = TestMap.newBuilder();
     other.mergeFrom(message);
     assertMapValuesSet(other.build());
@@ -593,51 +365,51 @@
   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();
-    b1.putInt32ToInt32Field(1, 2);
-    b1.putInt32ToInt32Field(3, 4);
-    b1.putInt32ToInt32Field(5, 6);
+    b1.getMutableInt32ToInt32Field().put(1, 2);
+    b1.getMutableInt32ToInt32Field().put(3, 4);
+    b1.getMutableInt32ToInt32Field().put(5, 6);
     TestMap m1 = b1.build();
-
+    
     TestMap.Builder b2 = TestMap.newBuilder();
-    b2.putInt32ToInt32Field(5, 6);
-    b2.putInt32ToInt32Field(1, 2);
-    b2.putInt32ToInt32Field(3, 4);
+    b2.getMutableInt32ToInt32Field().put(5, 6);
+    b2.getMutableInt32ToInt32Field().put(1, 2);
+    b2.getMutableInt32ToInt32Field().put(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);
+    b2.getMutableInt32ToInt32Field().put(1, 0);
     m2 = b2.build();
     assertFalse(m1.equals(m2));
     // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
     // to be different.
   }
-
-
+  
+  
   // The following methods are used to test reflection API.
-
+  
   private static FieldDescriptor f(String name) {
     return TestMap.getDescriptor().findFieldByName(name);
   }
-
+  
   private static Object getFieldValue(Message mapEntry, String name) {
     FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name);
     return mapEntry.getField(field);
   }
-
+  
   private static Message.Builder setFieldValue(
       Message.Builder mapEntry, String name, Object value) {
     FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name);
     mapEntry.setField(field, value);
     return mapEntry;
   }
-
+  
   private static void assertHasMapValues(Message message, String name, Map<?, ?> values) {
     FieldDescriptor field = f(name);
     for (Object entry : (List<?>) message.getField(field)) {
@@ -656,7 +428,7 @@
       assertEquals(value, values.get(key));
     }
   }
-
+  
   private static <KeyType, ValueType>
   Message newMapEntry(Message.Builder builder, String name, KeyType key, ValueType value) {
     FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name);
@@ -667,7 +439,7 @@
     entryBuilder.setField(valueField, value);
     return entryBuilder.build();
   }
-
+  
   private static void setMapValues(Message.Builder builder, String name, Map<?, ?> values) {
     List<Message> entryList = new ArrayList<Message>();
     for (Map.Entry<?, ?> entry : values.entrySet()) {
@@ -676,8 +448,9 @@
     FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name);
     builder.setField(field, entryList);
   }
-
-  private static <KeyType, ValueType> Map<KeyType, ValueType> mapForValues(
+  
+  private static <KeyType, ValueType>
+  Map<KeyType, ValueType> mapForValues(
       KeyType key1, ValueType value1, KeyType key2, ValueType value2) {
     Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>();
     map.put(key1, value1);
@@ -687,11 +460,13 @@
 
   public void testReflectionApi() throws Exception {
     // In reflection API, map fields are just repeated message fields.
-    TestMap.Builder builder = TestMap.newBuilder()
-        .putInt32ToInt32Field(1, 2)
-        .putInt32ToInt32Field(3, 4)
-        .putInt32ToMessageField(11, MessageValue.newBuilder().setValue(22).build())
-        .putInt32ToMessageField(33, MessageValue.newBuilder().setValue(44).build());
+    TestMap.Builder builder = TestMap.newBuilder();
+    builder.getMutableInt32ToInt32Field().put(1, 2);
+    builder.getMutableInt32ToInt32Field().put(3, 4);
+    builder.getMutableInt32ToMessageField().put(
+        11, MessageValue.newBuilder().setValue(22).build());
+    builder.getMutableInt32ToMessageField().put(
+        33, MessageValue.newBuilder().setValue(44).build());
     TestMap message = builder.build();
 
     // Test getField(), getRepeatedFieldCount(), getRepeatedField().
@@ -701,14 +476,14 @@
         mapForValues(
             11, MessageValue.newBuilder().setValue(22).build(),
             33, MessageValue.newBuilder().setValue(44).build()));
-
+    
     // Test clearField()
     builder.clearField(f("int32_to_int32_field"));
     builder.clearField(f("int32_to_message_field"));
     message = builder.build();
     assertEquals(0, message.getInt32ToInt32Field().size());
     assertEquals(0, message.getInt32ToMessageField().size());
-
+    
     // Test setField()
     setMapValues(builder, "int32_to_int32_field",
         mapForValues(11, 22, 33, 44));
@@ -721,7 +496,7 @@
     assertEquals(44, message.getInt32ToInt32Field().get(33).intValue());
     assertEquals(222, message.getInt32ToMessageField().get(111).getValue());
     assertEquals(444, message.getInt32ToMessageField().get(333).getValue());
-
+    
     // Test addRepeatedField
     builder.addRepeatedField(f("int32_to_int32_field"),
         newMapEntry(builder, "int32_to_int32_field", 55, 66));
@@ -741,7 +516,7 @@
     message = builder.build();
     assertEquals(55, message.getInt32ToInt32Field().get(55).intValue());
     assertEquals(555, message.getInt32ToMessageField().get(555).getValue());
-
+    
     // Test setRepeatedField
     for (int i = 0; i < builder.getRepeatedFieldCount(f("int32_to_int32_field")); i++) {
       Message mapEntry = (Message) builder.getRepeatedField(f("int32_to_int32_field"), i);
@@ -758,36 +533,35 @@
     assertEquals(33, message.getInt32ToInt32Field().get(44).intValue());
     assertEquals(55, message.getInt32ToInt32Field().get(55).intValue());
   }
-
-  // See additional coverage in TextFormatTest.java.
+  
   public void testTextFormat() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
-
+    
     String textData = TextFormat.printToString(message);
-
+    
     builder = TestMap.newBuilder();
     TextFormat.merge(textData, builder);
     message = builder.build();
-
+    
     assertMapValuesSet(message);
   }
-
+  
   public void testDynamicMessage() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
-
+    
     Message dynamicDefaultInstance =
         DynamicMessage.getDefaultInstance(TestMap.getDescriptor());
     Message dynamicMessage = dynamicDefaultInstance
         .newBuilderForType().mergeFrom(message.toByteString()).build();
-
+    
     assertEquals(message, dynamicMessage);
     assertEquals(message.hashCode(), dynamicMessage.hashCode());
   }
-
+  
   public void testReflectionEqualsAndHashCode() throws Exception {
     // Test that generated equals() and hashCode() will disregard the order
     // of map entries when comparing/hashing map fields.
@@ -796,22 +570,22 @@
     Message dynamicDefaultInstance =
         DynamicMessage.getDefaultInstance(TestMap.getDescriptor());
     FieldDescriptor field = f("int32_to_int32_field");
-
+    
     Message.Builder b1 = dynamicDefaultInstance.newBuilderForType();
     b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 1, 2));
     b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 3, 4));
     b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 5, 6));
     Message m1 = b1.build();
-
+    
     Message.Builder b2 = dynamicDefaultInstance.newBuilderForType();
     b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 5, 6));
     b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 1, 2));
     b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 3, 4));
     Message m2 = b2.build();
-
+    
     assertEquals(m1, m2);
     assertEquals(m1.hashCode(), m2.hashCode());
-
+    
     // Make sure we did compare map fields.
     b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0));
     m2 = b2.build();
@@ -819,11 +593,12 @@
     // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
     // to be different.
   }
-
+  
   public void testUnknownEnumValues() throws Exception {
-    TestUnknownEnumValue.Builder builder = TestUnknownEnumValue.newBuilder()
-        .putInt32ToInt32Field(1, 1)
-        .putInt32ToInt32Field(2, 54321);
+    TestUnknownEnumValue.Builder builder =
+        TestUnknownEnumValue.newBuilder();
+    builder.getMutableInt32ToInt32Field().put(1, 1);
+    builder.getMutableInt32ToInt32Field().put(2, 54321);
     ByteString data = builder.build().toByteString();
 
     TestMap message = TestMap.parseFrom(data);
@@ -842,21 +617,26 @@
     assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).intValue());
   }
 
+
   public void testRequiredMessage() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    builder.putRequiredMessageMap(0, MessageWithRequiredFields.newBuilder().buildPartial());
+    builder.getMutableRequiredMessageMap().put(0,
+        MessageWithRequiredFields.newBuilder().buildPartial());
     TestMap message = builder.buildPartial();
     assertFalse(message.isInitialized());
 
-    builder.putRequiredMessageMap(0, MessageWithRequiredFields.newBuilder().setValue(1).build());
+    builder.getMutableRequiredMessageMap().put(0,
+        MessageWithRequiredFields.newBuilder().setValue(1).build());
     message = builder.build();
     assertTrue(message.isInitialized());
   }
 
   public void testRecursiveMap() throws Exception {
     TestRecursiveMap.Builder builder = TestRecursiveMap.newBuilder();
-    builder.putRecursiveMapField(1, TestRecursiveMap.newBuilder().setValue(2).build());
-    builder.putRecursiveMapField(3, TestRecursiveMap.newBuilder().setValue(4).build());
+    builder.getMutableRecursiveMapField().put(
+        1, TestRecursiveMap.newBuilder().setValue(2).build());
+    builder.getMutableRecursiveMapField().put(
+        3, TestRecursiveMap.newBuilder().setValue(4).build());
     ByteString data = builder.build().toByteString();
 
     TestRecursiveMap message = TestRecursiveMap.parseFrom(data);
@@ -866,266 +646,13 @@
 
   public void testIterationOrder() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
 
     assertEquals(Arrays.asList("1", "2", "3"),
         new ArrayList<String>(message.getStringToInt32Field().keySet()));
   }
 
-  public void testContains() {
-    TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(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);
-
-    setMapValuesUsingAccessors(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);
-    setMapValuesUsingAccessors(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(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);
-    setMapValuesUsingAccessors(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(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();
-    setMapValuesUsingAccessors(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
-    }
-  }
-
   // Regression test for b/20494788
   public void testMapInitializationOrder() throws Exception {
     assertEquals("RedactAllTypes", map_test.RedactAllTypes
@@ -1133,47 +660,24 @@
 
     map_test.Message1.Builder builder =
         map_test.Message1.newBuilder();
-    builder.putMapField("key", true);
+    builder.getMutableMapField().put("key", true);
     map_test.Message1 message = builder.build();
     Message mapEntry = (Message) message.getRepeatedField(
         message.getDescriptorForType().findFieldByName("map_field"), 0);
     assertEquals(2, mapEntry.getAllFields().size());
   }
-
-  public void testReservedWordsFieldNames() {
-    ReservedAsMapField.newBuilder().build();
-    ReservedAsMapFieldWithEnumValue.newBuilder().build();
-  }
-
+  
   private static <K, V> Map<K, V> newMap(K key1, V value1) {
     Map<K, V> map = new HashMap<K, V>();
     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<K, V>();
     map.put(key1, value1);
     map.put(key2, value2);
     return map;
   }
-
-  public void testGetMap() {
-    TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
-    assertMapValuesSet(builder);
-    TestMap message = builder.build();
-    assertEquals(
-        message.getStringToInt32Field(),
-        message.getStringToInt32FieldMap());
-    assertEquals(
-        message.getInt32ToBytesField(),
-        message.getInt32ToBytesFieldMap());
-    assertEquals(
-        message.getInt32ToEnumField(),
-        message.getInt32ToEnumFieldMap());
-    assertEquals(
-        message.getInt32ToMessageField(),
-        message.getInt32ToMessageFieldMap());
-  }
 }
+
diff --git a/java/core/src/test/java/com/google/protobuf/MapTest.java b/java/core/src/test/java/com/google/protobuf/MapTest.java
index 64ae443..1dc5787 100644
--- a/java/core/src/test/java/com/google/protobuf/MapTest.java
+++ b/java/core/src/test/java/com/google/protobuf/MapTest.java
@@ -30,102 +30,54 @@
 
 package com.google.protobuf;
 
-import static org.junit.Assert.assertArrayEquals;
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.EnumDescriptor;
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
-import map_test.MapTestProto.BizarroTestMap;
-import map_test.MapTestProto.ReservedAsMapField;
-import map_test.MapTestProto.ReservedAsMapFieldWithEnumValue;
 import map_test.MapTestProto.TestMap;
 import map_test.MapTestProto.TestMap.MessageValue;
-import map_test.MapTestProto.TestMapOrBuilder;
 import map_test.MapTestProto.TestOnChangeEventPropagation;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
+import junit.framework.TestCase;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import junit.framework.TestCase;
 
 /**
  * Unit tests for map fields.
  */
 public class MapTest extends TestCase {
-
-  private void setMapValuesUsingMutableMap(TestMap.Builder builder) {
+  private void setMapValues(TestMap.Builder builder) {
     builder.getMutableInt32ToInt32Field().put(1, 11);
     builder.getMutableInt32ToInt32Field().put(2, 22);
     builder.getMutableInt32ToInt32Field().put(3, 33);
-  //
+
     builder.getMutableInt32ToStringField().put(1, "11");
     builder.getMutableInt32ToStringField().put(2, "22");
     builder.getMutableInt32ToStringField().put(3, "33");
-  //
+
     builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11"));
     builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22"));
     builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33"));
-  //
+
     builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO);
     builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR);
     builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ);
-  //
+
     builder.getMutableInt32ToMessageField().put(
         1, MessageValue.newBuilder().setValue(11).build());
     builder.getMutableInt32ToMessageField().put(
         2, MessageValue.newBuilder().setValue(22).build());
     builder.getMutableInt32ToMessageField().put(
         3, MessageValue.newBuilder().setValue(33).build());
-  //
+
     builder.getMutableStringToInt32Field().put("1", 11);
     builder.getMutableStringToInt32Field().put("2", 22);
     builder.getMutableStringToInt32Field().put("3", 33);
   }
 
-  private void setMapValuesUsingAccessors(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();
-    setMapValuesUsingMutableMap(usingMutableMapBuilder);
-    TestMap usingMutableMap = usingMutableMapBuilder.build();
-    assertMapValuesSet(usingMutableMap);
-
-    TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(usingAccessorsBuilder);
-    TestMap usingAccessors = usingAccessorsBuilder.build();
-    assertMapValuesSet(usingAccessors);
-
-    assertEquals(usingAccessors, usingMutableMap);
-  }
-
   private void copyMapValues(TestMap source, TestMap.Builder destination) {
     destination
         .putAllInt32ToInt32Field(source.getInt32ToInt32Field())
@@ -168,87 +120,34 @@
     assertEquals(33, message.getStringToInt32Field().get("3").intValue());
   }
 
-  private void updateMapValuesUsingMutableMap(TestMap.Builder builder) {
+  private void updateMapValues(TestMap.Builder builder) {
     builder.getMutableInt32ToInt32Field().put(1, 111);
     builder.getMutableInt32ToInt32Field().remove(2);
     builder.getMutableInt32ToInt32Field().put(4, 44);
-  //
+
     builder.getMutableInt32ToStringField().put(1, "111");
     builder.getMutableInt32ToStringField().remove(2);
     builder.getMutableInt32ToStringField().put(4, "44");
-  //
+
     builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111"));
     builder.getMutableInt32ToBytesField().remove(2);
     builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44"));
-  //
+
     builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR);
     builder.getMutableInt32ToEnumField().remove(2);
     builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX);
-  //
+
     builder.getMutableInt32ToMessageField().put(
         1, MessageValue.newBuilder().setValue(111).build());
     builder.getMutableInt32ToMessageField().remove(2);
     builder.getMutableInt32ToMessageField().put(
         4, MessageValue.newBuilder().setValue(44).build());
-  //
+
     builder.getMutableStringToInt32Field().put("1", 111);
     builder.getMutableStringToInt32Field().remove("2");
     builder.getMutableStringToInt32Field().put("4", 44);
   }
 
-  private void updateMapValuesUsingAccessors(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 usingMutableMapBuilder = TestMap.newBuilder();
-    setMapValuesUsingMutableMap(usingMutableMapBuilder);
-    TestMap usingMutableMap = usingMutableMapBuilder.build();
-    assertMapValuesSet(usingMutableMap);
-
-    TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(usingAccessorsBuilder);
-    TestMap usingAccessors = usingAccessorsBuilder.build();
-    assertMapValuesSet(usingAccessors);
-
-    assertEquals(usingAccessors, usingMutableMap);
-    //
-    usingMutableMapBuilder = usingMutableMap.toBuilder();
-    updateMapValuesUsingMutableMap(usingMutableMapBuilder);
-    usingMutableMap = usingMutableMapBuilder.build();
-    assertMapValuesUpdated(usingMutableMap);
-
-    usingAccessorsBuilder = usingAccessors.toBuilder();
-    updateMapValuesUsingAccessors(usingAccessorsBuilder);
-    usingAccessors = usingAccessorsBuilder.build();
-    assertMapValuesUpdated(usingAccessors);
-
-    assertEquals(usingAccessors, usingMutableMap);
-  }
-
   private void assertMapValuesUpdated(TestMap message) {
     assertEquals(3, message.getInt32ToInt32Field().size());
     assertEquals(111, message.getInt32ToInt32Field().get(1).intValue());
@@ -281,50 +180,15 @@
     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());
+  private void assertMapValuesCleared(TestMap message) {
+    assertEquals(0, message.getInt32ToInt32Field().size());
+    assertEquals(0, message.getInt32ToStringField().size());
+    assertEquals(0, message.getInt32ToBytesField().size());
+    assertEquals(0, message.getInt32ToEnumField().size());
+    assertEquals(0, message.getInt32ToMessageField().size());
+    assertEquals(0, message.getStringToInt32Field().size());
   }
-
-  public void testGetMapIsImmutable() {
-    TestMap.Builder builder = TestMap.newBuilder();
-    assertMapsAreImmutable(builder);
-    assertMapsAreImmutable(builder.build());
-
-    setMapValuesUsingAccessors(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
-    }
-  }
-
+  
   public void testMutableMapLifecycle() {
     TestMap.Builder builder = TestMap.newBuilder();
     Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
@@ -339,7 +203,7 @@
     assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
     builder.getMutableInt32ToInt32Field().put(2, 3);
     assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
-  //
+
     Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField();
     enumMap.put(1, TestMap.EnumValue.BAR);
     assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnumField());
@@ -354,7 +218,7 @@
     assertEquals(
         newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO),
         builder.getInt32ToEnumField());
-  //
+    
     Map<Integer, String> stringMap = builder.getMutableInt32ToStringField();
     stringMap.put(1, "1");
     assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField());
@@ -365,11 +229,11 @@
       // expected
     }
     assertEquals(newMap(1, "1"), builder.getInt32ToStringField());
-    builder.putInt32ToStringField(2, "2");
+    builder.getMutableInt32ToStringField().put(2, "2");
     assertEquals(
         newMap(1, "1", 2, "2"),
         builder.getInt32ToStringField());
-  //
+    
     Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMessageField();
     messageMap.put(1, TestMap.MessageValue.getDefaultInstance());
     assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
@@ -382,13 +246,13 @@
     }
     assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
         builder.getInt32ToMessageField());
-    builder.putInt32ToMessageField(2, TestMap.MessageValue.getDefaultInstance());
+    builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefaultInstance());
     assertEquals(
         newMap(1, TestMap.MessageValue.getDefaultInstance(),
             2, TestMap.MessageValue.getDefaultInstance()),
         builder.getInt32ToMessageField());
   }
-  //
+
   public void testMutableMapLifecycle_collections() {
     TestMap.Builder builder = TestMap.newBuilder();
     Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
@@ -434,35 +298,32 @@
     assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
     assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
   }
-
-
+  
   public void testGettersAndSetters() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
     TestMap message = builder.build();
     assertMapValuesCleared(message);
 
     builder = message.toBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     message = builder.build();
     assertMapValuesSet(message);
 
     builder = message.toBuilder();
-    updateMapValuesUsingAccessors(builder);
+    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();
-    setMapValuesUsingAccessors(sourceBuilder);
+    setMapValues(sourceBuilder);
     TestMap source = sourceBuilder.build();
-    assertMapValuesSet(source);
 
     TestMap.Builder destination = TestMap.newBuilder();
     copyMapValues(source, destination);
@@ -470,84 +331,31 @@
   }
 
   public void testPutAllForUnknownEnumValues() throws Exception {
-    TestMap source = TestMap.newBuilder()
-        .putAllInt32ToEnumFieldValue(newMap(
-            0, 0,
-            1, 1,
-            2, 1000)) // unknown value.
-        .build();
+    TestMap.Builder sourceBuilder = TestMap.newBuilder();
+    sourceBuilder.getMutableInt32ToEnumFieldValue().put(0, 0);
+    sourceBuilder.getMutableInt32ToEnumFieldValue().put(1, 1);
+    sourceBuilder.getMutableInt32ToEnumFieldValue().put(2, 1000);  // unknown value.
+    TestMap source = sourceBuilder.build();
 
-    TestMap destination = TestMap.newBuilder()
-        .putAllInt32ToEnumFieldValue(source.getInt32ToEnumFieldValue())
-        .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();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
     assertEquals(message.getSerializedSize(), message.toByteString().size());
     message = TestMap.parser().parseFrom(message.toByteString());
     assertMapValuesSet(message);
 
     builder = message.toBuilder();
-    updateMapValuesUsingAccessors(builder);
+    updateMapValues(builder);
     message = builder.build();
     assertEquals(message.getSerializedSize(), message.toByteString().size());
     message = TestMap.parser().parseFrom(message.toByteString());
@@ -561,58 +369,9 @@
     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();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
 
     TestMap.Builder other = TestMap.newBuilder();
@@ -626,23 +385,23 @@
 
     // 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.Builder b1 = TestMap.newBuilder();
+    b1.getMutableInt32ToInt32Field().put(1, 2);
+    b1.getMutableInt32ToInt32Field().put(3, 4);
+    b1.getMutableInt32ToInt32Field().put(5, 6);
     TestMap m1 = b1.build();
 
-    TestMap.Builder b2 = TestMap.newBuilder()
-        .putInt32ToInt32Field(5, 6)
-        .putInt32ToInt32Field(1, 2)
-        .putInt32ToInt32Field(3, 4);
+    TestMap.Builder b2 = TestMap.newBuilder();
+    b2.getMutableInt32ToInt32Field().put(5, 6);
+    b2.getMutableInt32ToInt32Field().put(1, 2);
+    b2.getMutableInt32ToInt32Field().put(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);
+    b2.getMutableInt32ToInt32Field().put(1, 0);
     m2 = b2.build();
     assertFalse(m1.equals(m2));
     // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
@@ -650,7 +409,7 @@
 
     // Regression test for b/18549190: if a map is a subset of the other map,
     // equals() should return false.
-    b2.removeInt32ToInt32Field(1);
+    b2.getMutableInt32ToInt32Field().remove(1);
     m2 = b2.build();
     assertFalse(m1.equals(m2));
     assertFalse(m2.equals(m1));
@@ -659,19 +418,20 @@
   public void testNestedBuilderOnChangeEventPropagation() {
     TestOnChangeEventPropagation.Builder parent =
         TestOnChangeEventPropagation.newBuilder();
-    parent.getOptionalMessageBuilder().putInt32ToInt32Field(1, 2);
+    parent.getOptionalMessageBuilder().getMutableInt32ToInt32Field().put(1, 2);
     TestOnChangeEventPropagation message = parent.build();
     assertEquals(2, message.getOptionalMessage().getInt32ToInt32Field().get(1).intValue());
 
     // Make a change using nested builder.
-    parent.getOptionalMessageBuilder().putInt32ToInt32Field(1, 3);
+    parent.getOptionalMessageBuilder().getMutableInt32ToInt32Field().put(1, 3);
 
     // Should be able to observe the change.
     message = parent.build();
     assertEquals(3, message.getOptionalMessage().getInt32ToInt32Field().get(1).intValue());
 
     // Make another change using mergeFrom()
-    TestMap.Builder other = TestMap.newBuilder().putInt32ToInt32Field(1, 4);
+    TestMap.Builder other = TestMap.newBuilder();
+    other.getMutableInt32ToInt32Field().put(1, 4);
     parent.getOptionalMessageBuilder().mergeFrom(other.build());
 
     // Should be able to observe the change.
@@ -694,7 +454,8 @@
     TestMap.Builder testMapBuilder = parentBuilder.getOptionalMessageBuilder();
 
     // Create a map entry message.
-    TestMap.Builder entryBuilder = TestMap.newBuilder().putInt32ToInt32Field(1, 1);
+    TestMap.Builder entryBuilder = TestMap.newBuilder();
+    entryBuilder.getMutableInt32ToInt32Field().put(1, 1);
 
     // Put the entry into the nested builder.
     testMapBuilder.addRepeatedField(
@@ -705,7 +466,7 @@
     assertEquals(1, message.getOptionalMessage().getInt32ToInt32Field().size());
 
     // Change the entry value.
-    entryBuilder.putInt32ToInt32Field(1, 4);
+    entryBuilder.getMutableInt32ToInt32Field().put(1, 4);
     testMapBuilder = parentBuilder.getOptionalMessageBuilder();
     testMapBuilder.setRepeatedField(
         intMapField, 0, entryBuilder.getRepeatedField(intMapField, 0));
@@ -792,11 +553,13 @@
 
   public void testReflectionApi() throws Exception {
     // In reflection API, map fields are just repeated message fields.
-    TestMap.Builder builder = TestMap.newBuilder()
-        .putInt32ToInt32Field(1, 2)
-        .putInt32ToInt32Field(3, 4)
-        .putInt32ToMessageField(11, MessageValue.newBuilder().setValue(22).build())
-        .putInt32ToMessageField(33, MessageValue.newBuilder().setValue(44).build());
+    TestMap.Builder builder = TestMap.newBuilder();
+    builder.getMutableInt32ToInt32Field().put(1, 2);
+    builder.getMutableInt32ToInt32Field().put(3, 4);
+    builder.getMutableInt32ToMessageField().put(
+        11, MessageValue.newBuilder().setValue(22).build());
+    builder.getMutableInt32ToMessageField().put(
+        33, MessageValue.newBuilder().setValue(44).build());
     TestMap message = builder.build();
 
     // Test getField(), getRepeatedFieldCount(), getRepeatedField().
@@ -864,10 +627,9 @@
     assertEquals(55, message.getInt32ToInt32Field().get(55).intValue());
   }
 
-  // See additional coverage in TextFormatTest.java.
   public void testTextFormat() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
 
     String textData = TextFormat.printToString(message);
@@ -881,7 +643,7 @@
 
   public void testDynamicMessage() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
 
     Message dynamicDefaultInstance =
@@ -926,11 +688,10 @@
   }
 
   public void testUnknownEnumValues() throws Exception {
-    TestMap.Builder builder = TestMap.newBuilder()
-        .putAllInt32ToEnumFieldValue(newMap(
-            0, 0,
-            1, 1,
-            2, 1000));  // unknown value.
+    TestMap.Builder builder = TestMap.newBuilder();
+    builder.getMutableInt32ToEnumFieldValue().put(0, 0);
+    builder.getMutableInt32ToEnumFieldValue().put(1, 1);
+    builder.getMutableInt32ToEnumFieldValue().put(2, 1000);  // unknown value.
     TestMap message = builder.build();
 
     assertEquals(TestMap.EnumValue.FOO,
@@ -953,7 +714,7 @@
     assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue());
 
     // hashCode()/equals() should take unknown enum values into account.
-    builder.putAllInt32ToEnumFieldValue(newMap(2, 1001));
+    builder.getMutableInt32ToEnumFieldValue().put(2, 1001);
     TestMap message2 = builder.build();
     assertFalse(message.hashCode() == message2.hashCode());
     assertFalse(message.equals(message2));
@@ -967,13 +728,15 @@
     EnumDescriptor enumDescriptor = TestMap.EnumValue.getDescriptor();
     FieldDescriptor field = descriptor.findFieldByName("int32_to_enum_field");
 
-    Map<Integer, Integer> data = newMap(
-        0, 0,
-        1, 1,
-        2, 1000); // unknown value
+    Map<Integer, Integer> data = new HashMap<Integer, Integer>();
+    data.put(0, 0);
+    data.put(1, 1);
+    data.put(2, 1000);  // unknown value.
 
-    TestMap.Builder builder = TestMap.newBuilder()
-        .putAllInt32ToEnumFieldValue(data);
+    TestMap.Builder builder = TestMap.newBuilder();
+    for (Map.Entry<Integer, Integer> entry : data.entrySet()) {
+      builder.getMutableInt32ToEnumFieldValue().put(entry.getKey(), entry.getValue());
+    }
 
     // Try to read unknown enum values using reflection API.
     for (int i = 0; i < builder.getRepeatedFieldCount(field); i++) {
@@ -997,528 +760,23 @@
 
   public void testIterationOrder() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(builder);
+    setMapValues(builder);
     TestMap message = builder.build();
 
     assertEquals(Arrays.asList("1", "2", "3"),
         new ArrayList<String>(message.getStringToInt32Field().keySet()));
   }
-
-  public void testGetMap() {
-    TestMap.Builder builder = TestMap.newBuilder();
-    setMapValuesUsingAccessors(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();
-    setMapValuesUsingAccessors(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);
-
-    setMapValuesUsingAccessors(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);
-    setMapValuesUsingAccessors(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(),
-        (int) 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);
-    setMapValuesUsingAccessors(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.putInt32ToEnumFieldValue(1, TestMap.EnumValue.BAR.getNumber());
-    assertEquals(
-        TestMap.EnumValue.BAR.getNumber(), builder.getInt32ToEnumFieldValueOrThrow(1));
-    builder.putInt32ToEnumFieldValue(1, -1);
-    assertEquals(-1, builder.getInt32ToEnumFieldValueOrThrow(1));
-    assertEquals(TestMap.EnumValue.UNRECOGNIZED, builder.getInt32ToEnumFieldOrThrow(1));
-
-    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();
-    setMapValuesUsingAccessors(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
-    }
-  }
-
-  public void testReservedWordsFieldNames() {
-    ReservedAsMapField.newBuilder().build();
-    ReservedAsMapFieldWithEnumValue.newBuilder().build();
-  }
-
-  public void testDeterministicSerialziation() throws Exception {
-    TestMap.Builder builder = TestMap.newBuilder();
-    // int32->int32
-    builder.putInt32ToInt32Field(5, 1);
-    builder.putInt32ToInt32Field(1, 1);
-    builder.putInt32ToInt32Field(4, 1);
-    builder.putInt32ToInt32Field(-2, 1);
-    builder.putInt32ToInt32Field(0, 1);
-
-    // uint32->int32
-    builder.putUint32ToInt32Field(5, 1);
-    builder.putUint32ToInt32Field(1, 1);
-    builder.putUint32ToInt32Field(4, 1);
-    builder.putUint32ToInt32Field(-2, 1);
-    builder.putUint32ToInt32Field(0, 1);
-
-    // int64->int32
-    builder.putInt64ToInt32Field(5L, 1);
-    builder.putInt64ToInt32Field(1L, 1);
-    builder.putInt64ToInt32Field(4L, 1);
-    builder.putInt64ToInt32Field(-2L, 1);
-    builder.putInt64ToInt32Field(0L, 1);
-
-    // string->int32
-    builder.putStringToInt32Field("baz", 1);
-    builder.putStringToInt32Field("foo", 1);
-    builder.putStringToInt32Field("bar", 1);
-    builder.putStringToInt32Field("", 1);
-    builder.putStringToInt32Field("hello", 1);
-    builder.putStringToInt32Field("world", 1);
-
-    TestMap message = builder.build();
-    byte[] serialized = new byte[message.getSerializedSize()];
-    CodedOutputStream output = CodedOutputStream.newInstance(serialized);
-    output.useDeterministicSerialization();
-    message.writeTo(output);
-    output.flush();
-
-    CodedInputStream input = CodedInputStream.newInstance(serialized);
-    List<Integer> int32Keys = new ArrayList<Integer>();
-    List<Integer> uint32Keys = new ArrayList<Integer>();
-    List<Long> int64Keys = new ArrayList<Long>();
-    List<String> stringKeys = new ArrayList<String>();
-    int tag;
-    while (true) {
-      tag = input.readTag();
-      if (tag == 0) {
-        break;
-      }
-      int length = input.readRawVarint32();
-      int oldLimit = input.pushLimit(length);
-      switch (WireFormat.getTagFieldNumber(tag)) {
-        case TestMap.STRING_TO_INT32_FIELD_FIELD_NUMBER:
-          stringKeys.add(readMapStringKey(input));
-          break;
-        case TestMap.INT32_TO_INT32_FIELD_FIELD_NUMBER:
-          int32Keys.add(readMapIntegerKey(input));
-          break;
-        case TestMap.UINT32_TO_INT32_FIELD_FIELD_NUMBER:
-          uint32Keys.add(readMapIntegerKey(input));
-          break;
-        case TestMap.INT64_TO_INT32_FIELD_FIELD_NUMBER:
-          int64Keys.add(readMapLongKey(input));
-          break;
-        default:
-          fail("Unexpected fields.");
-      }
-      input.popLimit(oldLimit);
-    }
-    assertEquals(
-        Arrays.asList(-2, 0, 1, 4, 5),
-        int32Keys);
-    assertEquals(
-        Arrays.asList(-2, 0, 1, 4, 5),
-        uint32Keys);
-    assertEquals(
-        Arrays.asList(-2L, 0L, 1L, 4L, 5L),
-        int64Keys);
-    assertEquals(
-        Arrays.asList("", "bar", "baz", "foo", "hello", "world"),
-        stringKeys);
-  }
-
-  public void testInitFromPartialDynamicMessage() {
-    FieldDescriptor fieldDescriptor =
-        TestMap.getDescriptor().findFieldByNumber(TestMap.INT32_TO_MESSAGE_FIELD_FIELD_NUMBER);
-    Descriptor mapEntryType = fieldDescriptor.getMessageType();
-    FieldDescriptor keyField = mapEntryType.findFieldByNumber(1);
-    FieldDescriptor valueField = mapEntryType.findFieldByNumber(2);
-    DynamicMessage dynamicMessage =
-        DynamicMessage.newBuilder(TestMap.getDescriptor())
-            .addRepeatedField(
-                fieldDescriptor,
-                DynamicMessage.newBuilder(mapEntryType)
-                    .setField(keyField, 10)
-                    .setField(valueField, TestMap.MessageValue.newBuilder().setValue(10).build())
-                    .build())
-            .build();
-    TestMap message = TestMap.newBuilder().mergeFrom(dynamicMessage).build();
-    assertEquals(
-        TestMap.MessageValue.newBuilder().setValue(10).build(),
-        message.getInt32ToMessageFieldMap().get(10));
-  }
-
-  public void testInitFromFullyDynamicMessage() {
-    FieldDescriptor fieldDescriptor =
-        TestMap.getDescriptor().findFieldByNumber(TestMap.INT32_TO_MESSAGE_FIELD_FIELD_NUMBER);
-    Descriptor mapEntryType = fieldDescriptor.getMessageType();
-    FieldDescriptor keyField = mapEntryType.findFieldByNumber(1);
-    FieldDescriptor valueField = mapEntryType.findFieldByNumber(2);
-    DynamicMessage dynamicMessage =
-        DynamicMessage.newBuilder(TestMap.getDescriptor())
-            .addRepeatedField(
-                fieldDescriptor,
-                DynamicMessage.newBuilder(mapEntryType)
-                    .setField(keyField, 10)
-                    .setField(
-                        valueField,
-                        DynamicMessage.newBuilder(TestMap.MessageValue.getDescriptor())
-                            .setField(
-                                TestMap.MessageValue.getDescriptor().findFieldByName("value"), 10)
-                            .build())
-                    .build())
-            .build();
-    TestMap message = TestMap.newBuilder().mergeFrom(dynamicMessage).build();
-    assertEquals(
-        TestMap.MessageValue.newBuilder().setValue(10).build(),
-        message.getInt32ToMessageFieldMap().get(10));
-  }
-
-  private int readMapIntegerKey(CodedInputStream input) throws IOException {
-    int tag = input.readTag();
-    assertEquals(WireFormat.makeTag(1, WireFormat.WIRETYPE_VARINT), tag);
-    int ret = input.readInt32();
-    // skip the value field.
-    input.skipField(input.readTag());
-    assertTrue(input.isAtEnd());
-    return ret;
-  }
-
-  private long readMapLongKey(CodedInputStream input) throws IOException {
-    int tag = input.readTag();
-    assertEquals(WireFormat.makeTag(1, WireFormat.WIRETYPE_VARINT), tag);
-    long ret = input.readInt64();
-    // skip the value field.
-    input.skipField(input.readTag());
-    assertTrue(input.isAtEnd());
-    return ret;
-  }
-
-  private String readMapStringKey(CodedInputStream input) throws IOException {
-    int tag = input.readTag();
-    assertEquals(WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED), tag);
-    String ret = input.readString();
-    // skip the value field.
-    input.skipField(input.readTag());
-    assertTrue(input.isAtEnd());
-    return ret;
-  }
-
+  
   private static <K, V> Map<K, V> newMap(K key1, V value1) {
     Map<K, V> map = new HashMap<K, V>();
     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<K, V>();
     map.put(key1, value1);
     map.put(key2, value2);
     return map;
   }
-
-  private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2, K key3, V value3) {
-    Map<K, V> map = new HashMap<K, V>();
-    map.put(key1, value1);
-    map.put(key2, value2);
-    map.put(key3, value3);
-    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(
-          MapTest.<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/MessageTest.java b/java/core/src/test/java/com/google/protobuf/MessageTest.java
index 4fc8f78..dcd1aba 100644
--- a/java/core/src/test/java/com/google/protobuf/MessageTest.java
+++ b/java/core/src/test/java/com/google/protobuf/MessageTest.java
@@ -35,9 +35,11 @@
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestRequired;
 import protobuf_unittest.UnittestProto.TestRequiredForeign;
-import java.util.List;
+
 import junit.framework.TestCase;
 
+import java.util.List;
+
 /**
  * Misc. unit tests for message operations that apply to both generated
  * and dynamic messages.
@@ -74,14 +76,6 @@
       "repeated_string: \"qux\"\n" +
       "repeated_string: \"bar\"\n";
 
-  public void testParsingWithNullExtensionRegistry() throws Exception {
-    try {
-      TestAllTypes.parseFrom(new byte[] {}, null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-  }
-
   public void testMergeFrom() throws Exception {
     TestAllTypes result =
       TestAllTypes.newBuilder(MERGE_DEST)
@@ -329,10 +323,8 @@
 
     assertTrue(result.getField(result.getDescriptorForType()
         .findFieldByName("repeated_foreign_message")) instanceof List<?>);
-    assertEquals(
-        0,
-        result.getRepeatedFieldCount(
-            result.getDescriptorForType().findFieldByName("repeated_foreign_message")));
+    assertEquals(result.getRepeatedFieldCount(result.getDescriptorForType()
+        .findFieldByName("repeated_foreign_message")), 0);
   }
   
   /** Test reading repeated message from DynamicMessage. */
@@ -355,9 +347,7 @@
 
     assertTrue(result.getField(result.getDescriptorForType()
         .findFieldByName("repeated_foreign_message")) instanceof List<?>);
-    assertEquals(
-        2,
-        result.getRepeatedFieldCount(
-            result.getDescriptorForType().findFieldByName("repeated_foreign_message")));
+    assertEquals(result.getRepeatedFieldCount(result.getDescriptorForType()
+        .findFieldByName("repeated_foreign_message")), 2);
   }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java b/java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java
index 03ed65a..542e28c 100644
--- a/java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java
+++ b/java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java
@@ -32,9 +32,11 @@
 
 import protobuf_unittest.Vehicle;
 import protobuf_unittest.Wheel;
+
+import junit.framework.TestCase;
+
 import java.util.ArrayList;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Test cases that exercise end-to-end use cases involving
diff --git a/java/core/src/test/java/com/google/protobuf/NioByteStringTest.java b/java/core/src/test/java/com/google/protobuf/NioByteStringTest.java
index c388bd0..6be5b93 100644
--- a/java/core/src/test/java/com/google/protobuf/NioByteStringTest.java
+++ b/java/core/src/test/java/com/google/protobuf/NioByteStringTest.java
@@ -32,6 +32,8 @@
 
 import static com.google.protobuf.Internal.UTF_8;
 
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.EOFException;
@@ -46,7 +48,6 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.NoSuchElementException;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link NioByteString}.
diff --git a/java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java b/java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java
index e376b1c..bf1f1d7 100644
--- a/java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java
@@ -36,14 +36,16 @@
 import static org.junit.Assert.fail;
 
 import com.google.protobuf.DescriptorProtos.DescriptorProto;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
 
 /**
  * Tests the exceptions thrown when parsing from a stream. The methods on the {@link Parser}
diff --git a/java/core/src/test/java/com/google/protobuf/ParserTest.java b/java/core/src/test/java/com/google/protobuf/ParserTest.java
index 1e89111..30842d2 100644
--- a/java/core/src/test/java/com/google/protobuf/ParserTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ParserTest.java
@@ -30,6 +30,9 @@
 
 package com.google.protobuf;
 
+import com.google.protobuf.UnittestLite.TestAllTypesLite;
+import com.google.protobuf.UnittestLite.TestPackedExtensionsLite;
+import com.google.protobuf.UnittestLite.TestParsingMergeLite;
 import protobuf_unittest.UnittestOptimizeFor;
 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;
@@ -39,12 +42,13 @@
 import protobuf_unittest.UnittestProto.TestEmptyMessage;
 import protobuf_unittest.UnittestProto.TestParsingMerge;
 import protobuf_unittest.UnittestProto.TestRequired;
+
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InterruptedIOException;
-import junit.framework.TestCase;
 
 /**
  * Unit test for {@link Parser}.
@@ -76,8 +80,6 @@
         new ByteArrayInputStream(data), registry));
     assertMessageEquals(message, parser.parseFrom(
         CodedInputStream.newInstance(data), registry));
-    assertMessageEquals(
-        message, parser.parseFrom(message.toByteString().asReadOnlyByteBuffer(), registry));
   }
 
   @SuppressWarnings("unchecked")
@@ -98,7 +100,6 @@
         new ByteArrayInputStream(data)));
     assertMessageEquals(message, parser.parseFrom(
         CodedInputStream.newInstance(data)));
-    assertMessageEquals(message, parser.parseFrom(message.toByteString().asReadOnlyByteBuffer()));
   }
 
   private void assertMessageEquals(
@@ -178,12 +179,16 @@
   public void testParseExtensions() throws Exception {
     assertRoundTripEquals(TestUtil.getAllExtensionsSet(),
                           TestUtil.getExtensionRegistry());
+    assertRoundTripEquals(
+        TestUtilLite.getAllLiteExtensionsSet(), TestUtilLite.getExtensionRegistryLite());
   }
 
   public void testParsePacked() throws Exception {
     assertRoundTripEquals(TestUtil.getPackedSet());
     assertRoundTripEquals(TestUtil.getPackedExtensionsSet(),
                           TestUtil.getExtensionRegistry());
+    assertRoundTripEquals(
+        TestUtilLite.getLitePackedExtensionsSet(), TestUtilLite.getExtensionRegistryLite());
   }
 
   public void testParseDelimitedTo() throws Exception {
@@ -191,11 +196,20 @@
     TestAllTypes normalMessage = TestUtil.getAllSet();
     ByteArrayOutputStream output = new ByteArrayOutputStream();
     normalMessage.writeDelimitedTo(output);
-    normalMessage.writeDelimitedTo(output);
+
+    // Write MessageLite with packed extension fields.
+    TestPackedExtensionsLite packedMessage = TestUtilLite.getLitePackedExtensionsSet();
+    packedMessage.writeDelimitedTo(output);
 
     InputStream input = new ByteArrayInputStream(output.toByteArray());
-    assertMessageEquals(normalMessage, normalMessage.getParserForType().parseDelimitedFrom(input));
-    assertMessageEquals(normalMessage, normalMessage.getParserForType().parseDelimitedFrom(input));
+    assertMessageEquals(
+        normalMessage,
+        normalMessage.getParserForType().parseDelimitedFrom(input));
+    assertMessageEquals(
+        packedMessage,
+        packedMessage
+            .getParserForType()
+            .parseDelimitedFrom(input, TestUtilLite.getExtensionRegistryLite()));
   }
 
   public void testParseUnknownFields() throws Exception {
@@ -230,6 +244,14 @@
     assertEquals("hello", allTypes.getOptionalString());
   }
 
+  /** 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 testParsingMerge() throws Exception {
     // Build messages.
     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
@@ -291,42 +313,65 @@
         TestParsingMerge.repeatedExt));
   }
 
-  public void testParseDelimitedFrom_firstByteInterrupted_preservesCause() {
-    try {
-      TestUtil.getAllSet().parseDelimitedFrom(
-          new InputStream() {
-            @Override
-            public int read() throws IOException {
-              throw new InterruptedIOException();
-            }
-          });
-      fail("Expected InterruptedIOException");
-    } catch (Exception e) {
-      assertEquals(InterruptedIOException.class, e.getClass());
-    }
-  }
+  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();
 
-  public void testParseDelimitedFrom_secondByteInterrupted_preservesCause() {
-    try {
-      TestUtil.getAllSet().parseDelimitedFrom(
-          new InputStream() {
-            private int i;
+    // 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();
 
-            @Override
-            public int read() throws IOException {
-              switch (i++) {
-                case 0:
-                  return 1;
-                case 1:
-                  throw new InterruptedIOException();
-                default:
-                  throw new AssertionError();
-              }
-            }
-          });
-      fail("Expected InterruptedIOException");
-    } catch (Exception e) {
-      assertEquals(InterruptedIOException.class, e.getClass());
-    }
+    // 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.
+    ExtensionRegistry registry = ExtensionRegistry.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/ProtobufArrayListTest.java b/java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java
index af717bf..3f45e22 100644
--- a/java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java
@@ -32,11 +32,12 @@
 
 import static java.util.Arrays.asList;
 
+import junit.framework.TestCase;
+
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link ProtobufArrayList}.
diff --git a/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java b/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java
new file mode 100644
index 0000000..49d5232
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.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 protobuf_unittest.UnittestProto.TestAllTypes;
+import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
+
+import junit.framework.TestCase;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Tests for {@link RepeatedFieldBuilder}. This tests basic functionality.
+ * More extensive testing is provided via other tests that exercise the
+ * builder.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public class RepeatedFieldBuilderTest extends TestCase {
+
+  public void testBasicUse() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
+    assertEquals(0, builder.getMessage(0).getOptionalInt32());
+    assertEquals(1, builder.getMessage(1).getOptionalInt32());
+
+    List<TestAllTypes> list = builder.build();
+    assertEquals(2, list.size());
+    assertEquals(0, list.get(0).getOptionalInt32());
+    assertEquals(1, list.get(1).getOptionalInt32());
+    assertIsUnmodifiable(list);
+
+    // Make sure it doesn't change.
+    List<TestAllTypes> list2 = builder.build();
+    assertSame(list, list2);
+    assertEquals(0, mockParent.getInvalidationCount());
+  }
+
+  public void testGoingBackAndForth() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
+    assertEquals(0, builder.getMessage(0).getOptionalInt32());
+    assertEquals(1, builder.getMessage(1).getOptionalInt32());
+
+    // Convert to list
+    List<TestAllTypes> list = builder.build();
+    assertEquals(2, list.size());
+    assertEquals(0, list.get(0).getOptionalInt32());
+    assertEquals(1, list.get(1).getOptionalInt32());
+    assertIsUnmodifiable(list);
+
+    // Update 0th item
+    assertEquals(0, mockParent.getInvalidationCount());
+    builder.getBuilder(0).setOptionalString("foo");
+    assertEquals(1, mockParent.getInvalidationCount());
+    list = builder.build();
+    assertEquals(2, list.size());
+    assertEquals(0, list.get(0).getOptionalInt32());
+      assertEquals("foo", list.get(0).getOptionalString());
+    assertEquals(1, list.get(1).getOptionalInt32());
+    assertIsUnmodifiable(list);
+    assertEquals(1, mockParent.getInvalidationCount());
+  }
+
+  public void testVariousMethods() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(2).build());
+    builder.addBuilder(0, TestAllTypes.getDefaultInstance())
+        .setOptionalInt32(0);
+    builder.addBuilder(TestAllTypes.getDefaultInstance()).setOptionalInt32(3);
+
+    assertEquals(0, builder.getMessage(0).getOptionalInt32());
+    assertEquals(1, builder.getMessage(1).getOptionalInt32());
+    assertEquals(2, builder.getMessage(2).getOptionalInt32());
+    assertEquals(3, builder.getMessage(3).getOptionalInt32());
+
+    assertEquals(0, mockParent.getInvalidationCount());
+    List<TestAllTypes> messages = builder.build();
+    assertEquals(4, messages.size());
+    assertSame(messages, builder.build()); // expect same list
+
+    // Remove a message.
+    builder.remove(2);
+    assertEquals(1, mockParent.getInvalidationCount());
+    assertEquals(3, builder.getCount());
+    assertEquals(0, builder.getMessage(0).getOptionalInt32());
+    assertEquals(1, builder.getMessage(1).getOptionalInt32());
+    assertEquals(3, builder.getMessage(2).getOptionalInt32());
+
+    // Remove a builder.
+    builder.remove(0);
+    assertEquals(1, mockParent.getInvalidationCount());
+    assertEquals(2, builder.getCount());
+    assertEquals(1, builder.getMessage(0).getOptionalInt32());
+    assertEquals(3, builder.getMessage(1).getOptionalInt32());
+
+    // Test clear.
+    builder.clear();
+    assertEquals(1, mockParent.getInvalidationCount());
+    assertEquals(0, builder.getCount());
+    assertTrue(builder.isEmpty());
+  }
+
+  public void testLists() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
+    builder.addMessage(0,
+        TestAllTypes.newBuilder().setOptionalInt32(0).build());
+    assertEquals(0, builder.getMessage(0).getOptionalInt32());
+    assertEquals(1, builder.getMessage(1).getOptionalInt32());
+
+    // Use list of builders.
+    List<TestAllTypes.Builder> builders = builder.getBuilderList();
+    assertEquals(0, builders.get(0).getOptionalInt32());
+    assertEquals(1, builders.get(1).getOptionalInt32());
+    builders.get(0).setOptionalInt32(10);
+    builders.get(1).setOptionalInt32(11);
+
+    // Use list of protos
+    List<TestAllTypes> protos = builder.getMessageList();
+    assertEquals(10, protos.get(0).getOptionalInt32());
+    assertEquals(11, protos.get(1).getOptionalInt32());
+
+    // Add an item to the builders and verify it's updated in both
+    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(12).build());
+    assertEquals(3, builders.size());
+    assertEquals(3, protos.size());
+  }
+
+  private void assertIsUnmodifiable(List<?> list) {
+    if (list == Collections.emptyList()) {
+      // OKAY -- Need to check this b/c EmptyList allows you to call clear.
+    } else {
+      try {
+        list.clear();
+        fail("List wasn't immutable");
+      } catch (UnsupportedOperationException e) {
+        // good
+      }
+    }
+  }
+
+  private RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+      TestAllTypesOrBuilder>
+      newRepeatedFieldBuilder(GeneratedMessage.BuilderParent parent) {
+    return new RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder>(Collections.<TestAllTypes>emptyList(), false,
+        parent, false);
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java b/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java
deleted file mode 100644
index edbd0af..0000000
--- a/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java
+++ /dev/null
@@ -1,188 +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 protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
-import java.util.Collections;
-import java.util.List;
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link RepeatedFieldBuilderV3}. This tests basic functionality.
- * More extensive testing is provided via other tests that exercise the
- * builder.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class RepeatedFieldBuilderV3Test extends TestCase {
-
-  public void testBasicUse() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilderV3(mockParent);
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
-    assertEquals(0, builder.getMessage(0).getOptionalInt32());
-    assertEquals(1, builder.getMessage(1).getOptionalInt32());
-
-    List<TestAllTypes> list = builder.build();
-    assertEquals(2, list.size());
-    assertEquals(0, list.get(0).getOptionalInt32());
-    assertEquals(1, list.get(1).getOptionalInt32());
-    assertIsUnmodifiable(list);
-
-    // Make sure it doesn't change.
-    List<TestAllTypes> list2 = builder.build();
-    assertSame(list, list2);
-    assertEquals(0, mockParent.getInvalidationCount());
-  }
-
-  public void testGoingBackAndForth() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilderV3(mockParent);
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
-    assertEquals(0, builder.getMessage(0).getOptionalInt32());
-    assertEquals(1, builder.getMessage(1).getOptionalInt32());
-
-    // Convert to list
-    List<TestAllTypes> list = builder.build();
-    assertEquals(2, list.size());
-    assertEquals(0, list.get(0).getOptionalInt32());
-    assertEquals(1, list.get(1).getOptionalInt32());
-    assertIsUnmodifiable(list);
-
-    // Update 0th item
-    assertEquals(0, mockParent.getInvalidationCount());
-    builder.getBuilder(0).setOptionalString("foo");
-    assertEquals(1, mockParent.getInvalidationCount());
-    list = builder.build();
-    assertEquals(2, list.size());
-    assertEquals(0, list.get(0).getOptionalInt32());
-      assertEquals("foo", list.get(0).getOptionalString());
-    assertEquals(1, list.get(1).getOptionalInt32());
-    assertIsUnmodifiable(list);
-    assertEquals(1, mockParent.getInvalidationCount());
-  }
-
-  public void testVariousMethods() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilderV3(mockParent);
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(2).build());
-    builder.addBuilder(0, TestAllTypes.getDefaultInstance())
-        .setOptionalInt32(0);
-    builder.addBuilder(TestAllTypes.getDefaultInstance()).setOptionalInt32(3);
-
-    assertEquals(0, builder.getMessage(0).getOptionalInt32());
-    assertEquals(1, builder.getMessage(1).getOptionalInt32());
-    assertEquals(2, builder.getMessage(2).getOptionalInt32());
-    assertEquals(3, builder.getMessage(3).getOptionalInt32());
-
-    assertEquals(0, mockParent.getInvalidationCount());
-    List<TestAllTypes> messages = builder.build();
-    assertEquals(4, messages.size());
-    assertSame(messages, builder.build()); // expect same list
-
-    // Remove a message.
-    builder.remove(2);
-    assertEquals(1, mockParent.getInvalidationCount());
-    assertEquals(3, builder.getCount());
-    assertEquals(0, builder.getMessage(0).getOptionalInt32());
-    assertEquals(1, builder.getMessage(1).getOptionalInt32());
-    assertEquals(3, builder.getMessage(2).getOptionalInt32());
-
-    // Remove a builder.
-    builder.remove(0);
-    assertEquals(1, mockParent.getInvalidationCount());
-    assertEquals(2, builder.getCount());
-    assertEquals(1, builder.getMessage(0).getOptionalInt32());
-    assertEquals(3, builder.getMessage(1).getOptionalInt32());
-
-    // Test clear.
-    builder.clear();
-    assertEquals(1, mockParent.getInvalidationCount());
-    assertEquals(0, builder.getCount());
-    assertTrue(builder.isEmpty());
-  }
-
-  public void testLists() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilderV3(mockParent);
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());
-    builder.addMessage(0,
-        TestAllTypes.newBuilder().setOptionalInt32(0).build());
-    assertEquals(0, builder.getMessage(0).getOptionalInt32());
-    assertEquals(1, builder.getMessage(1).getOptionalInt32());
-
-    // Use list of builders.
-    List<TestAllTypes.Builder> builders = builder.getBuilderList();
-    assertEquals(0, builders.get(0).getOptionalInt32());
-    assertEquals(1, builders.get(1).getOptionalInt32());
-    builders.get(0).setOptionalInt32(10);
-    builders.get(1).setOptionalInt32(11);
-
-    // Use list of protos
-    List<TestAllTypes> protos = builder.getMessageList();
-    assertEquals(10, protos.get(0).getOptionalInt32());
-    assertEquals(11, protos.get(1).getOptionalInt32());
-
-    // Add an item to the builders and verify it's updated in both
-    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(12).build());
-    assertEquals(3, builders.size());
-    assertEquals(3, protos.size());
-  }
-
-  private void assertIsUnmodifiable(List<?> list) {
-    if (list == Collections.emptyList()) {
-      // OKAY -- Need to check this b/c EmptyList allows you to call clear.
-    } else {
-      try {
-        list.clear();
-        fail("List wasn't immutable");
-      } catch (UnsupportedOperationException e) {
-        // good
-      }
-    }
-  }
-
-  private RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-      TestAllTypesOrBuilder>
-      newRepeatedFieldBuilderV3(GeneratedMessage.BuilderParent parent) {
-    return new RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder>(Collections.<TestAllTypes>emptyList(), false,
-        parent, false);
-  }
-}
diff --git a/java/core/src/test/java/com/google/protobuf/ServiceTest.java b/java/core/src/test/java/com/google/protobuf/ServiceTest.java
index b895ad8..b902737 100644
--- a/java/core/src/test/java/com/google/protobuf/ServiceTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ServiceTest.java
@@ -42,13 +42,15 @@
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestService;
 
-import java.util.HashSet;
-import java.util.Set;
 import junit.framework.TestCase;
+
 import org.easymock.classextension.EasyMock;
 import org.easymock.IArgumentMatcher;
 import org.easymock.classextension.IMocksControl;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * Tests services and stubs.
  *
@@ -269,8 +271,6 @@
         file.getServices().get(0).getMethods().get(0).getName());
   }
 
-
-
   // =================================================================
 
   /**
diff --git a/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java b/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java
new file mode 100644
index 0000000..58b8000
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java
@@ -0,0 +1,155 @@
+// 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 protobuf_unittest.UnittestProto.TestAllTypes;
+import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for {@link SingleFieldBuilder}. This tests basic functionality.
+ * More extensive testing is provided via other tests that exercise the
+ * builder.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public class SingleFieldBuilderTest extends TestCase {
+
+  public void testBasicUseAndInvalidations() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder =
+        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+            TestAllTypesOrBuilder>(
+            TestAllTypes.getDefaultInstance(),
+            mockParent,
+            false);
+    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
+    assertEquals(TestAllTypes.getDefaultInstance(),
+        builder.getBuilder().buildPartial());
+    assertEquals(0, mockParent.getInvalidationCount());
+
+    builder.getBuilder().setOptionalInt32(10);
+    assertEquals(0, mockParent.getInvalidationCount());
+    TestAllTypes message = builder.build();
+    assertEquals(10, message.getOptionalInt32());
+
+    // Test that we receive invalidations now that build has been called.
+    assertEquals(0, mockParent.getInvalidationCount());
+    builder.getBuilder().setOptionalInt32(20);
+    assertEquals(1, mockParent.getInvalidationCount());
+
+    // Test that we don't keep getting invalidations on every change
+    builder.getBuilder().setOptionalInt32(30);
+    assertEquals(1, mockParent.getInvalidationCount());
+
+  }
+
+  public void testSetMessage() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder =
+        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+            TestAllTypesOrBuilder>(
+            TestAllTypes.getDefaultInstance(),
+            mockParent,
+            false);
+    builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
+    assertEquals(0, builder.getMessage().getOptionalInt32());
+
+    // Update message using the builder
+    builder.getBuilder().setOptionalInt32(1);
+    assertEquals(0, mockParent.getInvalidationCount());
+    assertEquals(1, builder.getBuilder().getOptionalInt32());
+    assertEquals(1, builder.getMessage().getOptionalInt32());
+    builder.build();
+    builder.getBuilder().setOptionalInt32(2);
+    assertEquals(2, builder.getBuilder().getOptionalInt32());
+    assertEquals(2, builder.getMessage().getOptionalInt32());
+
+    // Make sure message stays cached
+    assertSame(builder.getMessage(), builder.getMessage());
+  }
+
+  public void testClear() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder =
+        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+            TestAllTypesOrBuilder>(
+            TestAllTypes.getDefaultInstance(),
+            mockParent,
+            false);
+    builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
+    assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
+    builder.clear();
+    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
+
+    builder.getBuilder().setOptionalInt32(1);
+    assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
+    builder.clear();
+    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
+  }
+
+  public void testMerge() {
+    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
+    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+        TestAllTypesOrBuilder> builder =
+        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,
+            TestAllTypesOrBuilder>(
+            TestAllTypes.getDefaultInstance(),
+            mockParent,
+            false);
+
+    // Merge into default field.
+    builder.mergeFrom(TestAllTypes.getDefaultInstance());
+    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
+
+    // Merge into non-default field on existing builder.
+    builder.getBuilder().setOptionalInt32(2);
+    builder.mergeFrom(TestAllTypes.newBuilder()
+        .setOptionalDouble(4.0)
+        .buildPartial());
+    assertEquals(2, builder.getMessage().getOptionalInt32());
+    assertEquals(4.0, builder.getMessage().getOptionalDouble());
+
+    // Merge into non-default field on existing message
+    builder.setMessage(TestAllTypes.newBuilder()
+        .setOptionalInt32(10)
+        .buildPartial());
+    builder.mergeFrom(TestAllTypes.newBuilder()
+        .setOptionalDouble(5.0)
+        .buildPartial());
+    assertEquals(10, builder.getMessage().getOptionalInt32());
+    assertEquals(5.0, builder.getMessage().getOptionalDouble());
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java b/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java
deleted file mode 100644
index e3a8d4f..0000000
--- a/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java
+++ /dev/null
@@ -1,155 +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 protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link SingleFieldBuilderV3}. This tests basic functionality.
- * More extensive testing is provided via other tests that exercise the
- * builder.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public class SingleFieldBuilderV3Test extends TestCase {
-
-  public void testBasicUseAndInvalidations() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder =
-        new SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-            TestAllTypesOrBuilder>(
-            TestAllTypes.getDefaultInstance(),
-            mockParent,
-            false);
-    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
-    assertEquals(TestAllTypes.getDefaultInstance(),
-        builder.getBuilder().buildPartial());
-    assertEquals(0, mockParent.getInvalidationCount());
-
-    builder.getBuilder().setOptionalInt32(10);
-    assertEquals(0, mockParent.getInvalidationCount());
-    TestAllTypes message = builder.build();
-    assertEquals(10, message.getOptionalInt32());
-
-    // Test that we receive invalidations now that build has been called.
-    assertEquals(0, mockParent.getInvalidationCount());
-    builder.getBuilder().setOptionalInt32(20);
-    assertEquals(1, mockParent.getInvalidationCount());
-
-    // Test that we don't keep getting invalidations on every change
-    builder.getBuilder().setOptionalInt32(30);
-    assertEquals(1, mockParent.getInvalidationCount());
-
-  }
-
-  public void testSetMessage() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder =
-        new SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-            TestAllTypesOrBuilder>(
-            TestAllTypes.getDefaultInstance(),
-            mockParent,
-            false);
-    builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
-    assertEquals(0, builder.getMessage().getOptionalInt32());
-
-    // Update message using the builder
-    builder.getBuilder().setOptionalInt32(1);
-    assertEquals(0, mockParent.getInvalidationCount());
-    assertEquals(1, builder.getBuilder().getOptionalInt32());
-    assertEquals(1, builder.getMessage().getOptionalInt32());
-    builder.build();
-    builder.getBuilder().setOptionalInt32(2);
-    assertEquals(2, builder.getBuilder().getOptionalInt32());
-    assertEquals(2, builder.getMessage().getOptionalInt32());
-
-    // Make sure message stays cached
-    assertSame(builder.getMessage(), builder.getMessage());
-  }
-
-  public void testClear() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder =
-        new SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-            TestAllTypesOrBuilder>(
-            TestAllTypes.getDefaultInstance(),
-            mockParent,
-            false);
-    builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());
-    assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
-    builder.clear();
-    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
-
-    builder.getBuilder().setOptionalInt32(1);
-    assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
-    builder.clear();
-    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
-  }
-
-  public void testMerge() {
-    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
-    SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-        TestAllTypesOrBuilder> builder =
-        new SingleFieldBuilderV3<TestAllTypes, TestAllTypes.Builder,
-            TestAllTypesOrBuilder>(
-            TestAllTypes.getDefaultInstance(),
-            mockParent,
-            false);
-
-    // Merge into default field.
-    builder.mergeFrom(TestAllTypes.getDefaultInstance());
-    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());
-
-    // Merge into non-default field on existing builder.
-    builder.getBuilder().setOptionalInt32(2);
-    builder.mergeFrom(TestAllTypes.newBuilder()
-        .setOptionalDouble(4.0)
-        .buildPartial());
-    assertEquals(2, builder.getMessage().getOptionalInt32());
-    assertEquals(4.0, builder.getMessage().getOptionalDouble());
-
-    // Merge into non-default field on existing message
-    builder.setMessage(TestAllTypes.newBuilder()
-        .setOptionalInt32(10)
-        .buildPartial());
-    builder.mergeFrom(TestAllTypes.newBuilder()
-        .setOptionalDouble(5.0)
-        .buildPartial());
-    assertEquals(10, builder.getMessage().getOptionalInt32());
-    assertEquals(5.0, builder.getMessage().getOptionalDouble());
-  }
-}
diff --git a/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java b/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java
index a7f8342..e96ecd6 100644
--- a/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java
+++ b/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java
@@ -30,6 +30,8 @@
 
 package com.google.protobuf;
 
+import junit.framework.TestCase;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -38,7 +40,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import junit.framework.TestCase;
 
 /**
  * @author darick@google.com Darick Tong
diff --git a/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java b/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java
index 4af5542..2c60fe0 100644
--- a/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java
+++ b/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java
@@ -92,31 +92,5 @@
     assertEquals(0L, message.getExtension(
         TestBadIdentifiersProto.TestConflictingFieldNames.int64FieldList).longValue());
 
-    assertEquals("", message.getFieldName32());
-    assertEquals("", message.getFieldName33());
-    assertEquals(0, message.get2Conflict34());
-    assertEquals(0, message.get2Conflict35());
-
-  }
-
-  public void testNumberFields() throws Exception {
-    TestBadIdentifiersProto.TestLeadingNumberFields message =
-        TestBadIdentifiersProto.TestLeadingNumberFields.getDefaultInstance();
-    // Make sure generated accessors are properly named.
-    assertFalse(message.has30DayImpressions());
-    assertEquals(0, message.get30DayImpressions());
-    assertEquals(0, message.get60DayImpressionsCount());
-    assertEquals(0, message.get60DayImpressionsList().size());
-
-    assertFalse(message.has2Underscores());
-    assertEquals("", message.get2Underscores());
-    assertEquals(0, message.get2RepeatedUnderscoresCount());
-    assertEquals(0, message.get2RepeatedUnderscoresList().size());
-
-    assertFalse(message.has32());
-    assertEquals(0, message.get32());
-    assertEquals(0, message.get64Count());
-    assertEquals(0, message.get64List().size());
-
   }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/TestBadIdentifiersLite.java b/java/core/src/test/java/com/google/protobuf/TestBadIdentifiersLite.java
deleted file mode 100644
index 37f94c0..0000000
--- a/java/core/src/test/java/com/google/protobuf/TestBadIdentifiersLite.java
+++ /dev/null
@@ -1,83 +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 junit.framework.TestCase;
-
-/**
- * Tests that proto2 api generation doesn't cause compile errors when compiling protocol buffers
- * that have names that would otherwise conflict if not fully qualified (like @Deprecated
- * and @Override).
- *
- * <p>Forked from {@link TestBadIdentifiers}.
- *
- * @author jonp@google.com (Jon Perlow)
- */
-public final class TestBadIdentifiersLite extends TestCase {
-
-  public void testCompilation() {
-    // If this compiles, it means the generation was correct.
-    TestBadIdentifiersProto.Deprecated.newBuilder();
-    TestBadIdentifiersProto.Override.newBuilder();
-  }
-
-  public void testConflictingFieldNames() throws Exception {
-    TestBadIdentifiersProto.TestConflictingFieldNames message =
-        TestBadIdentifiersProto.TestConflictingFieldNames.getDefaultInstance();
-    // Make sure generated accessors are properly named.
-    assertEquals(0, message.getInt32Field1Count());
-    assertEquals(0, message.getEnumField2Count());
-    assertEquals(0, message.getStringField3Count());
-    assertEquals(0, message.getBytesField4Count());
-    assertEquals(0, message.getMessageField5Count());
-
-    assertEquals(0, message.getInt32FieldCount11());
-    assertEquals(0, message.getEnumFieldCount12().getNumber());
-    assertEquals("", message.getStringFieldCount13());
-    assertEquals(ByteString.EMPTY, message.getBytesFieldCount14());
-    assertEquals(0, message.getMessageFieldCount15().getSerializedSize());
-
-    assertEquals(0, message.getInt32Field21Count());
-    assertEquals(0, message.getEnumField22Count());
-    assertEquals(0, message.getStringField23Count());
-    assertEquals(0, message.getBytesField24Count());
-    assertEquals(0, message.getMessageField25Count());
-
-    assertEquals(0, message.getInt32Field1List().size());
-    assertEquals(0, message.getInt32FieldList31());
-
-    assertEquals(0, message.getInt64FieldCount());
-    assertEquals(0L, message.getExtension(
-        TestBadIdentifiersProto.TestConflictingFieldNames.int64FieldCount).longValue());
-    assertEquals(0L, message.getExtension(
-        TestBadIdentifiersProto.TestConflictingFieldNames.int64FieldList).longValue());
-  }
-}
diff --git a/java/core/src/test/java/com/google/protobuf/TestUtil.java b/java/core/src/test/java/com/google/protobuf/TestUtil.java
index e96adf0..08b2a76 100644
--- a/java/core/src/test/java/com/google/protobuf/TestUtil.java
+++ b/java/core/src/test/java/com/google/protobuf/TestUtil.java
@@ -232,10 +232,12 @@
 import protobuf_unittest.UnittestProto.TestPackedExtensions;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
 import protobuf_unittest.UnittestProto.TestUnpackedTypes;
+
+import junit.framework.Assert;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
-import junit.framework.Assert;
 
 /**
  * Contains methods for setting all fields of {@code TestAllTypes} to
@@ -258,13 +260,6 @@
   }
 
   /**
-   * Dirties the message by resetting the momoized serialized size.
-   */
-  public static void resetMemoizedSize(AbstractMessage message) {
-    message.memoizedSize = -1;
-  }
-
-  /**
    * Get a {@code TestAllTypes} with all fields set as they would be by
    * {@link #setAllFields(TestAllTypes.Builder)}.
    */
@@ -2602,9 +2597,6 @@
       case FOO_CORD:
         Assert.assertTrue(message.hasFooCord());
         break;
-      case FOO_STRING_PIECE:
-        Assert.assertTrue(message.hasFooStringPiece());
-        break;
       case FOO_BYTES:
         Assert.assertTrue(message.hasFooBytes());
         break;
@@ -2622,8 +2614,6 @@
         break;
       case FOO_NOT_SET:
         break;
-      default:
-        // TODO(b/18683919): go/enum-switch-lsc
     }
   }
 
@@ -3774,8 +3764,7 @@
 
   private static File getTestDataDir() {
     // Search each parent directory looking for "src/google/protobuf".
-    File ancestor = new File(System.getProperty("protobuf.dir", "."));
-    String initialPath = ancestor.getAbsolutePath();
+    File ancestor = new File(".");
     try {
       ancestor = ancestor.getCanonicalFile();
     } catch (IOException e) {
@@ -3792,7 +3781,7 @@
     throw new RuntimeException(
       "Could not find golden files.  This test must be run from within the " +
       "protobuf source package so that it can read test data files from the " +
-      "C++ source tree: " + initialPath);
+      "C++ source tree.");
   }
 
   /**
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 28c4fde..63c17cd 100644
--- a/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
+++ b/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
@@ -33,7 +33,6 @@
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.TextFormat.Parser.SingularOverwritePolicy;
-import map_test.MapTestProto.TestMap;
 import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
 import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
 import protobuf_unittest.UnittestProto.OneString;
@@ -43,9 +42,11 @@
 import protobuf_unittest.UnittestProto.TestEmptyMessage;
 import protobuf_unittest.UnittestProto.TestOneof2;
 import proto2_wireformat_unittest.UnittestMsetWireFormat.TestMessageSet;
+
+import junit.framework.TestCase;
+
 import java.io.StringReader;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Test case for {@link TextFormat}.
@@ -168,7 +169,6 @@
 
   // Creates an example unknown field set.
   private UnknownFieldSet makeUnknownFieldSet() {
-
     return UnknownFieldSet.newBuilder()
         .addField(5,
             UnknownFieldSet.Field.newBuilder()
@@ -176,12 +176,6 @@
             .addFixed32(2)
             .addFixed64(3)
             .addLengthDelimited(ByteString.copyFromUtf8("4"))
-            .addLengthDelimited(UnknownFieldSet.newBuilder()
-                .addField(12,
-                    UnknownFieldSet.Field.newBuilder()
-                        .addVarint(6)
-                        .build())
-                .build().toByteString())
             .addGroup(
                 UnknownFieldSet.newBuilder()
                 .addField(10,
@@ -214,23 +208,20 @@
         .build();
 
     assertEquals(
-        "5: 1\n"
-            + "5: 0x00000002\n"
-            + "5: 0x0000000000000003\n"
-            + "5: \"4\"\n"
-            + "5: {\n"
-            + "  12: 6\n"
-            + "}\n"
-            + "5 {\n"
-            + "  10: 5\n"
-            + "}\n"
-            + "8: 1\n"
-            + "8: 2\n"
-            + "8: 3\n"
-            + "15: 12379813812177893520\n"
-            + "15: 0xabcd1234\n"
-            + "15: 0xabcdef1234567890\n",
-        TextFormat.printToString(message));
+      "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" +
+      "15: 12379813812177893520\n" +
+      "15: 0xabcd1234\n" +
+      "15: 0xabcdef1234567890\n",
+      TextFormat.printToString(message));
   }
 
   public void testPrintField() throws Exception {
@@ -531,16 +522,15 @@
       "optional_string: \"ueoauaoe\n" +
       "optional_int32: 123");
     assertParseError(
-      "1:2: Input contains unknown fields and/or extensions:\n" +
-      "1:2:\tprotobuf_unittest.TestAllTypes.[nosuchext]",
+      "1:2: Extension \"nosuchext\" not found in the ExtensionRegistry.",
       "[nosuchext]: 123");
     assertParseError(
       "1:20: Extension \"protobuf_unittest.optional_int32_extension\" does " +
         "not extend message type \"protobuf_unittest.TestAllTypes\".",
       "[protobuf_unittest.optional_int32_extension]: 123");
     assertParseError(
-      "1:1: Input contains unknown fields and/or extensions:\n" +
-      "1:1:\tprotobuf_unittest.TestAllTypes.nosuchfield",
+      "1:1: Message type \"protobuf_unittest.TestAllTypes\" has no field " +
+        "named \"nosuchfield\".",
       "nosuchfield: 123");
     assertParseError(
       "1:21: Expected \">\".",
@@ -871,7 +861,7 @@
   }
 
   public void testShortDebugString_unknown() {
-    assertEquals("5: 1 5: 0x00000002 5: 0x0000000000000003 5: \"4\" 5: { 12: 6 } 5 { 10: 5 }"
+    assertEquals("5: 1 5: 0x00000002 5: 0x0000000000000003 5: \"4\" 5 { 10: 5 }"
         + " 8: 1 8: 2 8: 3 15: 12379813812177893520 15: 0xabcd1234 15:"
         + " 0xabcdef1234567890",
         TextFormat.shortDebugString(makeUnknownFieldSet()));
@@ -951,7 +941,6 @@
   }
 
 
-  // See additional coverage in testOneofOverwriteForbidden and testMapOverwriteForbidden.
   public void testParseNonRepeatedFields() throws Exception {
     assertParseSuccessWithOverwriteForbidden(
         "repeated_int32: 1\n" +
@@ -962,7 +951,6 @@
     assertParseSuccessWithOverwriteForbidden(
         "repeated_nested_message { bb: 1 }\n" +
         "repeated_nested_message { bb: 2 }\n");
-
     assertParseErrorWithOverwriteForbidden(
         "3:17: Non-repeated field " +
         "\"protobuf_unittest.TestAllTypes.optional_int32\" " +
@@ -1001,40 +989,12 @@
     assertParseSuccessWithOverwriteForbidden("repeated_int32: [ 1, 2 ]\n");
     assertParseSuccessWithOverwriteForbidden("RepeatedGroup [{ a: 1 },{ a: 2 }]\n");
     assertParseSuccessWithOverwriteForbidden("repeated_nested_message [{ bb: 1 }, { bb: 2 }]\n");
-    // See also testMapShortForm.
-  }
-
-  public void testParseShortRepeatedFormOfEmptyRepeatedFields() throws Exception {
-    assertParseSuccessWithOverwriteForbidden("repeated_foreign_enum: []");
-    assertParseSuccessWithOverwriteForbidden("repeated_int32: []\n");
-    assertParseSuccessWithOverwriteForbidden("RepeatedGroup []\n");
-    assertParseSuccessWithOverwriteForbidden("repeated_nested_message []\n");
-    // See also testMapShortFormEmpty.
-  }
-
-  public void testParseShortRepeatedFormWithTrailingComma() throws Exception {
-    assertParseErrorWithOverwriteForbidden(
-        "1:38: Expected identifier. Found \']\'",
-        "repeated_foreign_enum: [FOREIGN_FOO, ]\n");
-    assertParseErrorWithOverwriteForbidden(
-        "1:22: Couldn't parse integer: For input string: \"]\"",
-        "repeated_int32: [ 1, ]\n");
-    assertParseErrorWithOverwriteForbidden(
-        "1:25: Expected \"{\".",
-        "RepeatedGroup [{ a: 1 },]\n");
-    assertParseErrorWithOverwriteForbidden(
-        "1:37: Expected \"{\".",
-        "repeated_nested_message [{ bb: 1 }, ]\n");
-    // See also testMapShortFormTrailingComma.
   }
 
   public void testParseShortRepeatedFormOfNonRepeatedFields() throws Exception {
     assertParseErrorWithOverwriteForbidden(
         "1:17: Couldn't parse integer: For input string: \"[\"",
         "optional_int32: [1]\n");
-    assertParseErrorWithOverwriteForbidden(
-        "1:17: Couldn't parse integer: For input string: \"[\"",
-        "optional_int32: []\n");
   }
 
   // =======================================================================
@@ -1074,90 +1034,6 @@
   }
 
   // =======================================================================
-  // test map
-
-  public void testMapTextFormat() throws Exception {
-    TestMap message =
-        TestMap.newBuilder()
-            .putInt32ToStringField(10, "apple")
-            .putInt32ToStringField(20, "banana")
-            .putInt32ToStringField(30, "cherry")
-            .build();
-    String text = TextFormat.printToUnicodeString(message);
-    {
-      TestMap.Builder dest = TestMap.newBuilder();
-      TextFormat.merge(text, dest);
-      assertEquals(message, dest.build());
-    }
-    {
-      TestMap.Builder dest = TestMap.newBuilder();
-      parserWithOverwriteForbidden.merge(text, dest);
-      assertEquals(message, dest.build());
-    }
-  }
-
-  public void testMapShortForm() throws Exception {
-    String text =
-        "string_to_int32_field [{ key: 'x' value: 10 }, { key: 'y' value: 20 }]\n"
-        + "int32_to_message_field "
-        + "[{ key: 1 value { value: 100 } }, { key: 2 value: { value: 200 } }]\n";
-    TestMap.Builder dest = TestMap.newBuilder();
-    parserWithOverwriteForbidden.merge(text, dest);
-    TestMap message = dest.build();
-    assertEquals(2, message.getStringToInt32Field().size());
-    assertEquals(2, message.getInt32ToMessageField().size());
-    assertEquals(10, message.getStringToInt32Field().get("x").intValue());
-    assertEquals(200, message.getInt32ToMessageField().get(2).getValue());
-  }
-
-  public void testMapShortFormEmpty() throws Exception {
-    String text = "string_to_int32_field []\n"
-        + "int32_to_message_field: []\n";
-    TestMap.Builder dest = TestMap.newBuilder();
-    parserWithOverwriteForbidden.merge(text, dest);
-    TestMap message = dest.build();
-    assertEquals(0, message.getStringToInt32Field().size());
-    assertEquals(0, message.getInt32ToMessageField().size());
-  }
-
-  public void testMapShortFormTrailingComma() throws Exception {
-    String text = "string_to_int32_field [{ key: 'x' value: 10 }, ]\n";
-    TestMap.Builder dest = TestMap.newBuilder();
-    try {
-      parserWithOverwriteForbidden.merge(text, dest);
-      fail("Expected parse exception.");
-    } catch (TextFormat.ParseException e) {
-      assertEquals("1:48: Expected \"{\".", e.getMessage());
-    }
-  }
-
-  public void testMapOverwrite() throws Exception {
-    String text =
-        "int32_to_int32_field { key: 1 value: 10 }\n"
-            + "int32_to_int32_field { key: 2 value: 20 }\n"
-            + "int32_to_int32_field { key: 1 value: 30 }\n";
-
-    {
-      // With default parser, last value set for the key holds.
-      TestMap.Builder builder = TestMap.newBuilder();
-      defaultParser.merge(text, builder);
-      TestMap map = builder.build();
-      assertEquals(2, map.getInt32ToInt32Field().size());
-      assertEquals(30, map.getInt32ToInt32Field().get(1).intValue());
-    }
-
-    {
-      // With overwrite forbidden, same behavior.
-      // TODO(b/29122459): Expect parse exception here.
-      TestMap.Builder builder = TestMap.newBuilder();
-      defaultParser.merge(text, builder);
-      TestMap map = builder.build();
-      assertEquals(2, map.getInt32ToInt32Field().size());
-      assertEquals(30, map.getInt32ToInt32Field().get(1).intValue());
-    }
-  }
-
-  // =======================================================================
   // test location information
 
   public void testParseInfoTreeBuilding() throws Exception {
diff --git a/java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java b/java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java
index 88cbbf8..8f45976 100644
--- a/java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java
+++ b/java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java
@@ -36,6 +36,7 @@
 import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.FieldPresenceTestProto.TestAllTypes;
 import com.google.protobuf.TextFormat.ParseException;
+
 import junit.framework.TestCase;
 
 /**
@@ -150,15 +151,18 @@
     assertEquals(4321, unknown4321.getNumber());
     assertEquals(5432, unknown5432.getNumber());
     assertEquals(6543, unknown6543.getNumber());
-
+    
     // Unknown EnumValueDescriptor will map to UNRECOGNIZED.
     assertEquals(
-        TestAllTypes.NestedEnum.UNRECOGNIZED, TestAllTypes.NestedEnum.valueOf(unknown4321));
+        TestAllTypes.NestedEnum.valueOf(unknown4321),
+        TestAllTypes.NestedEnum.UNRECOGNIZED);
     assertEquals(
-        TestAllTypes.NestedEnum.UNRECOGNIZED, TestAllTypes.NestedEnum.valueOf(unknown5432));
+        TestAllTypes.NestedEnum.valueOf(unknown5432),
+        TestAllTypes.NestedEnum.UNRECOGNIZED);
     assertEquals(
-        TestAllTypes.NestedEnum.UNRECOGNIZED, TestAllTypes.NestedEnum.valueOf(unknown6543));
-
+        TestAllTypes.NestedEnum.valueOf(unknown6543),
+        TestAllTypes.NestedEnum.UNRECOGNIZED);
+    
     // Setters also accept unknown EnumValueDescriptor.
     builder.setField(optionalNestedEnumField, unknown6543);
     builder.setRepeatedField(repeatedNestedEnumField, 0, unknown4321);
diff --git a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java
index 9928d44..573cd66 100644
--- a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java
+++ b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java
@@ -32,21 +32,14 @@
 
 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 junit.framework.TestCase;
+
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.Map;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link UnknownFieldSetLite}.
@@ -54,44 +47,7 @@
  * @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();
 
@@ -99,14 +55,6 @@
     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)
@@ -377,203 +325,4 @@
     }
     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/UnknownFieldSetTest.java b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java
index 1a84806..32380f7 100644
--- a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java
+++ b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java
@@ -38,9 +38,11 @@
 import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions;
 import protobuf_unittest.UnittestProto.TestPackedExtensions;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
+
+import junit.framework.TestCase;
+
 import java.util.Arrays;
 import java.util.Map;
-import junit.framework.TestCase;
 
 /**
  * Tests related to unknown field handling.
@@ -445,4 +447,208 @@
   }
 
   // =================================================================
+
+  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/UnmodifiableLazyStringListTest.java b/java/core/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java
index 00f201c..b1c75fc 100644
--- a/java/core/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java
+++ b/java/core/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java
@@ -30,10 +30,11 @@
 
 package com.google.protobuf;
 
+import junit.framework.TestCase;
+
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
-import junit.framework.TestCase;
 
 /**
  * Tests for {@link UnmodifiableLazyStringList}.
diff --git a/java/core/src/test/java/com/google/protobuf/WireFormatTest.java b/java/core/src/test/java/com/google/protobuf/WireFormatTest.java
index 625d4b4..e66b371 100644
--- a/java/core/src/test/java/com/google/protobuf/WireFormatTest.java
+++ b/java/core/src/test/java/com/google/protobuf/WireFormatTest.java
@@ -30,6 +30,8 @@
 
 package com.google.protobuf;
 
+import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
+import com.google.protobuf.UnittestLite.TestPackedExtensionsLite;
 import protobuf_unittest.UnittestMset.RawMessageSet;
 import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
 import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
@@ -42,10 +44,12 @@
 import protobuf_unittest.UnittestProto.TestPackedExtensions;
 import protobuf_unittest.UnittestProto.TestPackedTypes;
 import proto2_wireformat_unittest.UnittestMsetWireFormat.TestMessageSet;
+
+import junit.framework.TestCase;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.util.List;
-import junit.framework.TestCase;
 
 /**
  * Tests related to parsing and serialization.
@@ -123,6 +127,32 @@
     TestUtil.assertPackedFieldsSet(message2);
   }
 
+  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 testParseExtensions() throws Exception {
     // TestAllTypes and TestAllExtensions should have compatible wire formats,
     // so if we serialize a TestAllTypes then parse it as TestAllExtensions
@@ -152,6 +182,48 @@
     TestUtil.assertPackedExtensionsSet(message2);
   }
 
+  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 registry_lite = TestUtilLite.getExtensionRegistryLite();
+
+    TestAllExtensionsLite message2 =
+      TestAllExtensionsLite.parseFrom(rawBytes, registry_lite);
+
+    TestUtil.assertAllExtensionsSet(message2);
+
+    // Try again using a full extension registry.
+    ExtensionRegistry registry = TestUtil.getExtensionRegistry();
+
+    TestAllExtensionsLite message3 =
+      TestAllExtensionsLite.parseFrom(rawBytes, registry);
+
+    TestUtil.assertAllExtensionsSet(message3);
+  }
+
+  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);
+  }
+
+  public void testExtensionsSerializedSize() throws Exception {
+    assertNotSame(TestUtil.getAllSet().getSerializedSize(),
+                  TestUtil.getAllExtensionsSet().getSerializedSize());
+  }
+
   public void testSerializeDelimited() throws Exception {
     ByteArrayOutputStream output = new ByteArrayOutputStream();
     TestUtil.getAllSet().writeDelimitedTo(output);
diff --git a/java/core/src/test/proto/com/google/protobuf/deprecated_file.proto b/java/core/src/test/proto/com/google/protobuf/deprecated_file.proto
deleted file mode 100644
index ca90e92..0000000
--- a/java/core/src/test/proto/com/google/protobuf/deprecated_file.proto
+++ /dev/null
@@ -1,38 +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.
-
-syntax = "proto3";
-
-package deprecated_file;
-
-option deprecated = true;
-
-// TODO (liujisi): Add deprecation options on messages, enums fields as well and
-// add tests to verify those annotations are actually generated.
diff --git a/java/core/src/test/proto/com/google/protobuf/field_presence_test.proto b/java/core/src/test/proto/com/google/protobuf/field_presence_test.proto
index 2367bd8..8f3ca8c 100644
--- a/java/core/src/test/proto/com/google/protobuf/field_presence_test.proto
+++ b/java/core/src/test/proto/com/google/protobuf/field_presence_test.proto
@@ -36,6 +36,7 @@
 
 option java_package = "com.google.protobuf";
 option java_outer_classname = "FieldPresenceTestProto";
+option java_generate_equals_and_hash = true;
 
 message TestAllTypes {
   enum NestedEnum {
@@ -53,7 +54,6 @@
   NestedEnum optional_nested_enum = 4;
   NestedMessage optional_nested_message = 5;
   protobuf_unittest.TestRequired optional_proto2_message = 6;
-  NestedMessage optional_lazy_message = 7 [lazy=true];
 
   oneof oneof_field {
     int32 oneof_int32 = 11;
@@ -81,7 +81,6 @@
   TestAllTypes.NestedEnum optional_nested_enum = 4;
   TestAllTypes.NestedMessage optional_nested_message = 5;
   protobuf_unittest.TestRequired optional_proto2_message = 6;
-  TestAllTypes.NestedMessage optional_lazy_message = 7 [lazy=true];
 }
 
 message TestRepeatedFieldsOnly {
diff --git a/java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto b/java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto
index b18b0d7..6eef42c 100644
--- a/java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto
+++ b/java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto
@@ -46,14 +46,6 @@
 message Foo {
   optional int32 value = 1;
   repeated Bar bar = 2;
-  map<string, string> my_map = 3;
-  oneof Single {
-    sint64 sint64 = 4;
-    // LINT: ALLOW_GROUPS
-    group MyGroup = 5 {
-      optional int32 value = 1;
-    }
-  }
 
   extensions 100 to max;
 }
diff --git a/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto b/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto
index 2ca0251..d5418f2 100644
--- a/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto
+++ b/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto
@@ -32,6 +32,7 @@
 
 
 option java_outer_classname = "MapForProto2TestProto";
+option java_generate_equals_and_hash = true;
 
 message TestMap {
   message MessageValue {
@@ -69,53 +70,6 @@
   optional int32 value = 1;
   map<int32, TestRecursiveMap> recursive_map_field = 2;
 }
-
-
-// a decoy of TestMap for testing parsing errors
-message BizarroTestMap {
-  map<int32, bytes> int32_to_int32_field = 1; // same key type, different value
-  map<string, int32> int32_to_string_field = 2; // different key and value types
-  map<string, int32> int32_to_bytes_field = 3; // different key types, same value
-  map<string, bytes> int32_to_enum_field = 4; // different key and value types
-  map<string, bytes> int32_to_message_field = 5; // different key and value types
-  map<string, bytes> string_to_int32_field = 6;  // same key type, different value
-}
-
-// Used to test that java reserved words can be used as protobuf field names
-// Not all reserved words are tested (to avoid bloat) but instead an arbitrary
-// subset of them chosen to cover various keyword categories like
-// type, modifier, declaration, etc.
-message ReservedAsMapField {
-  map<string, uint32> if = 1;
-  map<string, uint32> const = 2;
-  map<string, uint32> private = 3;
-  map<string, uint32> class = 4;
-  map<string, uint32> int = 5;
-  map<string, uint32> void = 6;
-  map<string, uint32> string = 7; // These are also proto keywords
-  map<string, uint32> package = 8;
-  map<string, uint32> enum = 9; // Most recent Java reserved word
-  map<string, uint32> null = 10;
-  // null is not a 'reserved word' per se but as a literal needs similar care
-}
-
-message ReservedAsMapFieldWithEnumValue {
-  enum SampleEnum {
-    A = 0;
-    B = 1;
-  }
-  map<string, SampleEnum> if = 1;
-  map<string, SampleEnum> const = 2;
-  map<string, SampleEnum> private = 3;
-  map<string, SampleEnum> class = 4;
-  map<string, SampleEnum> int = 5;
-  map<string, SampleEnum> void = 6;
-  map<string, SampleEnum> string = 7; // These are also proto keywords
-  map<string, SampleEnum> package = 8;
-  map<string, SampleEnum> enum = 9; // Most recent Java reserved word
-  map<string, SampleEnum> null = 10;
-  // null is not a 'reserved word' per se but as a literal needs similar care
-}
 package map_for_proto2_lite_test;
 option java_package = "map_lite_test";
 option optimize_for = LITE_RUNTIME;
diff --git a/java/core/src/test/proto/com/google/protobuf/map_for_proto2_test.proto b/java/core/src/test/proto/com/google/protobuf/map_for_proto2_test.proto
index 974f8a2..a9be516 100644
--- a/java/core/src/test/proto/com/google/protobuf/map_for_proto2_test.proto
+++ b/java/core/src/test/proto/com/google/protobuf/map_for_proto2_test.proto
@@ -34,6 +34,7 @@
 
 option java_package = "map_test";
 option java_outer_classname = "MapForProto2TestProto";
+option java_generate_equals_and_hash = true;
 
 message TestMap {
   message MessageValue {
@@ -71,50 +72,3 @@
   optional int32 value = 1;
   map<int32, TestRecursiveMap> recursive_map_field = 2;
 }
-
-
-// a decoy of TestMap for testing parsing errors
-message BizarroTestMap {
-  map<int32, bytes> int32_to_int32_field = 1; // same key type, different value
-  map<string, int32> int32_to_string_field = 2; // different key and value types
-  map<string, int32> int32_to_bytes_field = 3; // different key types, same value
-  map<string, bytes> int32_to_enum_field = 4; // different key and value types
-  map<string, bytes> int32_to_message_field = 5; // different key and value types
-  map<string, bytes> string_to_int32_field = 6;  // same key type, different value
-}
-
-// Used to test that java reserved words can be used as protobuf field names
-// Not all reserved words are tested (to avoid bloat) but instead an arbitrary
-// subset of them chosen to cover various keyword categories like
-// type, modifier, declaration, etc.
-message ReservedAsMapField {
-  map<string, uint32> if = 1;
-  map<string, uint32> const = 2;
-  map<string, uint32> private = 3;
-  map<string, uint32> class = 4;
-  map<string, uint32> int = 5;
-  map<string, uint32> void = 6;
-  map<string, uint32> string = 7; // These are also proto keywords
-  map<string, uint32> package = 8;
-  map<string, uint32> enum = 9; // Most recent Java reserved word
-  map<string, uint32> null = 10;
-  // null is not a 'reserved word' per se but as a literal needs similar care
-}
-
-message ReservedAsMapFieldWithEnumValue {
-  enum SampleEnum {
-    A = 0;
-    B = 1;
-  }
-  map<string, SampleEnum> if = 1;
-  map<string, SampleEnum> const = 2;
-  map<string, SampleEnum> private = 3;
-  map<string, SampleEnum> class = 4;
-  map<string, SampleEnum> int = 5;
-  map<string, SampleEnum> void = 6;
-  map<string, SampleEnum> string = 7; // These are also proto keywords
-  map<string, SampleEnum> package = 8;
-  map<string, SampleEnum> enum = 9; // Most recent Java reserved word
-  map<string, SampleEnum> null = 10;
-  // null is not a 'reserved word' per se but as a literal needs similar care
-}
diff --git a/java/core/src/test/proto/com/google/protobuf/map_test.proto b/java/core/src/test/proto/com/google/protobuf/map_test.proto
index bc2105e..2280ac0 100644
--- a/java/core/src/test/proto/com/google/protobuf/map_test.proto
+++ b/java/core/src/test/proto/com/google/protobuf/map_test.proto
@@ -34,6 +34,7 @@
 
 option java_package = "map_test";
 option java_outer_classname = "MapTestProto";
+option java_generate_equals_and_hash = true;
 
 message TestMap {
   message MessageValue {
@@ -52,59 +53,11 @@
   map<int32, EnumValue>    int32_to_enum_field = 4;
   map<int32, MessageValue> int32_to_message_field = 5;
   map<string, int32>       string_to_int32_field = 6;
-  map<uint32, int32>       uint32_to_int32_field = 7;
-  map<int64, int32>        int64_to_int32_field = 8;
 }
 
-// Used to test that a nested builder containing map fields will properly
+// Used to test that a nested bulider containing map fields will properly
 // propagate the onChange event and mark its parent dirty when a change
 // is made to a map field.
 message TestOnChangeEventPropagation {
   TestMap optional_message = 1;
 }
-
-// a decoy of TestMap for testing parsing errors
-message BizarroTestMap {
-  map<int32, bytes> int32_to_int32_field = 1; // same key type, different value
-  map<string, int32> int32_to_string_field = 2; // different key and value types
-  map<string, int32> int32_to_bytes_field = 3; // different key types, same value
-  map<string, bytes> int32_to_enum_field = 4; // different key and value types
-  map<string, bytes> int32_to_message_field = 5; // different key and value types
-  map<string, bytes> string_to_int32_field = 6;  // same key type, different value
-}
-
-// Used to test that java reserved words can be used as protobuf field names
-// Not all reserved words are tested (to avoid bloat) but instead an arbitrary
-// subset of them chosen to cover various keyword categories like
-// type, modifier, declaration, etc.
-message ReservedAsMapField {
-  map<string, uint32> if = 1;
-  map<string, uint32> const = 2;
-  map<string, uint32> private = 3;
-  map<string, uint32> class = 4;
-  map<string, uint32> int = 5;
-  map<string, uint32> void = 6;
-  map<string, uint32> string = 7; // These are also proto keywords
-  map<string, uint32> package = 8;
-  map<string, uint32> enum = 9; // Most recent Java reserved word
-  map<string, uint32> null = 10;
-  // null is not a 'reserved word' per se but as a literal needs similar care
-}
-
-message ReservedAsMapFieldWithEnumValue {
-  enum SampleEnum {
-    A = 0;
-    B = 1;
-  }
-  map<string, SampleEnum> if = 1;
-  map<string, SampleEnum> const = 2;
-  map<string, SampleEnum> private = 3;
-  map<string, SampleEnum> class = 4;
-  map<string, SampleEnum> int = 5;
-  map<string, SampleEnum> void = 6;
-  map<string, SampleEnum> string = 7; // These are also proto keywords
-  map<string, SampleEnum> package = 8;
-  map<string, SampleEnum> enum = 9; // Most recent Java reserved word
-  map<string, SampleEnum> null = 10;
-  // null is not a 'reserved word' per se but as a literal needs similar care
-}
diff --git a/java/core/src/test/proto/com/google/protobuf/test_bad_identifiers.proto b/java/core/src/test/proto/com/google/protobuf/test_bad_identifiers.proto
index ff5bf3a..2b1f65e 100644
--- a/java/core/src/test/proto/com/google/protobuf/test_bad_identifiers.proto
+++ b/java/core/src/test/proto/com/google/protobuf/test_bad_identifiers.proto
@@ -43,6 +43,7 @@
 
 option java_package = "com.google.protobuf";
 option java_outer_classname = "TestBadIdentifiersProto";
+option java_generate_equals_and_hash = true;
 
 message TestMessage {
   optional string cached_size = 1;
@@ -148,12 +149,6 @@
   // the method getInt32FieldList().
   required int32 int32_field_list = 31;  // NO_PROTO3
 
-  // These field pairs have the same Java converted name
-  optional string field_name = 32; // NO_PROTO3
-  optional string field__name = 33; // NO_PROTO3
-  optional int32 _2conflict = 34; // NO_PROTO3
-  optional int32 __2conflict = 35;
-
   extensions 1000 to max;  // NO_PROTO3
 
   repeated int64 int64_field = 41;
@@ -172,14 +167,3 @@
 
   map<int32, int32> map_field = 1;
 }
-
-message TestLeadingNumberFields {
-  optional int32 _30day_impressions = 1;
-  repeated string _60day_impressions = 2;
-
-  optional string __2_underscores = 3;
-  repeated string __2repeated_underscores = 4;
-
-  optional int32 _32 = 32;
-  repeated int64 _64 = 64;
-}
diff --git a/java/lite/pom.xml b/java/lite/pom.xml
index c902f81..c403dc0 100644
--- a/java/lite/pom.xml
+++ b/java/lite/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.google.protobuf</groupId>
     <artifactId>protobuf-parent</artifactId>
-    <version>3.0.0</version>
+    <version>3.0.0-beta-3</version>
   </parent>
 
   <artifactId>protobuf-lite</artifactId>
@@ -76,38 +76,10 @@
 
       <!-- Only compile a subset of the files -->
       <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>add-generated-sources</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>add-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${generated.sources.lite.dir}</source>
-              </sources>
-            </configuration>
-          </execution>
-          <execution>
-            <id>add-generated-test-sources</id>
-            <phase>generate-test-sources</phase>
-            <goals>
-              <goal>add-test-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${generated.testsources.lite.dir}</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
+          <generatedSourcesDirectory>${generated.sources.lite.dir}</generatedSourcesDirectory>
+          <generatedTestSourcesDirectory>${generated.testsources.lite.dir}</generatedTestSourcesDirectory>
           <includes>
             <include>**/AbstractMessageLite.java</include>
             <include>**/AbstractParser.java</include>
@@ -137,7 +109,6 @@
             <include>**/MutabilityOracle.java</include>
             <include>**/NioByteString.java</include>
             <include>**/Parser.java</include>
-            <include>**/PrimitiveNonBoxingCollection.java</include>
             <include>**/ProtobufArrayList.java</include>
             <include>**/ProtocolStringList.java</include>
             <include>**/RopeByteString.java</include>
diff --git a/java/pom.xml b/java/pom.xml
index 58af893..7a1a91f 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -11,7 +11,7 @@
 
   <groupId>com.google.protobuf</groupId>
   <artifactId>protobuf-parent</artifactId>
-  <version>3.5.2</version>
+  <version>3.0.0-beta-3</version>
   <packaging>pom</packaging>
 
   <name>Protocol Buffers [Parent]</name>
@@ -39,8 +39,8 @@
 
   <licenses>
     <license>
-      <name>3-Clause BSD License</name>
-      <url>https://opensource.org/licenses/BSD-3-Clause</url>
+      <name>New BSD license</name>
+      <url>http://www.opensource.org/licenses/bsd-license.php</url>
       <distribution>repo</distribution>
     </license>
   </licenses>
@@ -84,7 +84,7 @@
       <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
-        <version>19.0</version>
+        <version>18.0</version>
       </dependency>
     </dependencies>
   </dependencyManagement>
@@ -94,7 +94,7 @@
       <plugins>
         <plugin>
           <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.6.0</version>
+          <version>3.3</version>
           <configuration>
             <source>1.6</source>
             <target>1.6</target>
@@ -152,32 +152,6 @@
       <build>
         <plugins>
           <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-source-plugin</artifactId>
-            <version>2.2.1</version>
-            <executions>
-              <execution>
-                <id>attach-sources</id>
-                <goals>
-                  <goal>jar-no-fork</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <version>2.9.1</version>
-            <executions>
-              <execution>
-                <id>attach-javadocs</id>
-                <goals>
-                  <goal>jar</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
             <artifactId>maven-gpg-plugin</artifactId>
             <version>1.6</version>
             <executions>
@@ -208,7 +182,7 @@
 
   <modules>
     <module>core</module>
-    <!-- <module>lite</module> -->
+    <module>lite</module>
     <module>util</module>
   </modules>
 
diff --git a/java/util/pom.xml b/java/util/pom.xml
index 4e55df0..9236f90 100644
--- a/java/util/pom.xml
+++ b/java/util/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.google.protobuf</groupId>
     <artifactId>protobuf-parent</artifactId>
-    <version>3.5.2</version>
+    <version>3.0.0-beta-3</version>
   </parent>
 
   <artifactId>protobuf-java-util</artifactId>
@@ -28,7 +28,7 @@
     <dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
-      <version>2.7</version>
+      <version>2.3</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
@@ -79,24 +79,12 @@
         </executions>
       </plugin>
 
-      <!-- Add the generated test sources to the build -->
       <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>add-generated-test-sources</id>
-            <phase>generate-test-sources</phase>
-            <goals>
-              <goal>add-test-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${generated.testsources.dir}</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <!-- Add the generated test sources to the build -->
+          <generatedTestSourcesDirectory>${generated.testsources.dir}</generatedTestSourcesDirectory>
+        </configuration>
       </plugin>
 
       <!-- Configure the OSGI bundle -->
diff --git a/java/util/src/main/java/com/google/protobuf/util/Durations.java b/java/util/src/main/java/com/google/protobuf/util/Durations.java
deleted file mode 100644
index fb7f434..0000000
--- a/java/util/src/main/java/com/google/protobuf/util/Durations.java
+++ /dev/null
@@ -1,311 +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.util;
-
-import static com.google.common.math.IntMath.checkedAdd;
-import static com.google.common.math.IntMath.checkedSubtract;
-import static com.google.common.math.LongMath.checkedAdd;
-import static com.google.common.math.LongMath.checkedMultiply;
-import static com.google.common.math.LongMath.checkedSubtract;
-import static com.google.protobuf.util.Timestamps.MICROS_PER_SECOND;
-import static com.google.protobuf.util.Timestamps.MILLIS_PER_SECOND;
-import static com.google.protobuf.util.Timestamps.NANOS_PER_MICROSECOND;
-import static com.google.protobuf.util.Timestamps.NANOS_PER_MILLISECOND;
-import static com.google.protobuf.util.Timestamps.NANOS_PER_SECOND;
-
-import com.google.protobuf.Duration;
-import java.text.ParseException;
-import java.util.Comparator;
-
-/**
- * Utilities to help create/manipulate {@code protobuf/duration.proto}. All operations throw an
- * {@link IllegalArgumentException} if the input(s) are not {@linkplain #isValid(Duration) valid}.
- */
-public final class Durations {
-  static final long DURATION_SECONDS_MIN = -315576000000L;
-  static final long DURATION_SECONDS_MAX = 315576000000L;
-
-  /** A constant holding the minimum valid {@link Duration}, approximately {@code -10,000} years. */
-  public static final Duration MIN_VALUE =
-      Duration.newBuilder().setSeconds(DURATION_SECONDS_MIN).setNanos(-999999999).build();
-
-  /** A constant holding the maximum valid {@link Duration}, approximately {@code +10,000} years. */
-  public static final Duration MAX_VALUE =
-      Duration.newBuilder().setSeconds(DURATION_SECONDS_MAX).setNanos(999999999).build();
-
-  private Durations() {}
-
-  private static final Comparator<Duration> COMPARATOR =
-      new Comparator<Duration>() {
-        @Override
-        public int compare(Duration d1, Duration d2) {
-          checkValid(d1);
-          checkValid(d2);
-          int secDiff = Long.compare(d1.getSeconds(), d2.getSeconds());
-          return (secDiff != 0) ? secDiff : Integer.compare(d1.getNanos(), d2.getNanos());
-        }
-      };
-
-  /**
-   * Returns a {@link Comparator} for {@link Duration}s which sorts in increasing chronological
-   * order. Nulls and invalid {@link Duration}s are not allowed (see {@link #isValid}).
-   */
-  public static Comparator<Duration> comparator() {
-    return COMPARATOR;
-  }
-
-  /**
-   * Compares two durations. The value returned is identical to what would be returned by:
-   * {@code Durations.comparator().compare(x, y)}.
-   *
-   * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y};
-   *     and a value greater than {@code 0} if {@code x > y}
-   */
-  public static int compare(Duration x, Duration y) {
-    return COMPARATOR.compare(x, y);
-  }
-
-  /**
-   * Returns true if the given {@link Duration} is valid. The {@code seconds} value must be in the
-   * range [-315,576,000,000, +315,576,000,000]. The {@code nanos} value must be in the range
-   * [-999,999,999, +999,999,999].
-   *
-   * <p><b>Note:</b> Durations less than one second are represented with a 0 {@code seconds} field
-   * and a positive or negative {@code nanos} field. For durations of one second or more, a non-zero
-   * value for the {@code nanos} field must be of the same sign as the {@code seconds} field.
-   */
-  public static boolean isValid(Duration duration) {
-    return isValid(duration.getSeconds(), duration.getNanos());
-  }
-
-  /**
-   * Returns true if the given number of seconds and nanos is a valid {@link Duration}. The {@code
-   * seconds} value must be in the range [-315,576,000,000, +315,576,000,000]. The {@code nanos}
-   * value must be in the range [-999,999,999, +999,999,999].
-   *
-   * <p><b>Note:</b> Durations less than one second are represented with a 0 {@code seconds} field
-   * and a positive or negative {@code nanos} field. For durations of one second or more, a non-zero
-   * value for the {@code nanos} field must be of the same sign as the {@code seconds} field.
-   */
-  public static boolean isValid(long seconds, int nanos) {
-    if (seconds < DURATION_SECONDS_MIN || seconds > DURATION_SECONDS_MAX) {
-      return false;
-    }
-    if (nanos < -999999999L || nanos >= NANOS_PER_SECOND) {
-      return false;
-    }
-    if (seconds < 0 || nanos < 0) {
-      if (seconds > 0 || nanos > 0) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /** Throws an {@link IllegalArgumentException} if the given {@link Duration} is not valid. */
-  public static Duration checkValid(Duration duration) {
-    long seconds = duration.getSeconds();
-    int nanos = duration.getNanos();
-    if (!isValid(seconds, nanos)) {
-        throw new IllegalArgumentException(String.format(
-            "Duration is not valid. See proto definition for valid values. "
-            + "Seconds (%s) must be in range [-315,576,000,000, +315,576,000,000]. "
-            + "Nanos (%s) must be in range [-999,999,999, +999,999,999]. "
-            + "Nanos must have the same sign as seconds", seconds, nanos));
-    }
-    return duration;
-  }
-
-  /**
-   * Convert Duration to string format. The string format will contains 3, 6, or 9 fractional digits
-   * depending on the precision required to represent the exact Duration value. For example: "1s",
-   * "1.010s", "1.000000100s", "-3.100s" The range that can be represented by Duration is from
-   * -315,576,000,000 to +315,576,000,000 inclusive (in seconds).
-   *
-   * @return The string representation of the given duration.
-   * @throws IllegalArgumentException if the given duration is not in the valid range.
-   */
-  public static String toString(Duration duration) {
-    checkValid(duration);
-
-    long seconds = duration.getSeconds();
-    int nanos = duration.getNanos();
-
-    StringBuilder result = new StringBuilder();
-    if (seconds < 0 || nanos < 0) {
-      result.append("-");
-      seconds = -seconds;
-      nanos = -nanos;
-    }
-    result.append(seconds);
-    if (nanos != 0) {
-      result.append(".");
-      result.append(Timestamps.formatNanos(nanos));
-    }
-    result.append("s");
-    return result.toString();
-  }
-
-  /**
-   * Parse from a string to produce a duration.
-   *
-   * @return A Duration parsed from the string.
-   * @throws ParseException if parsing fails.
-   */
-  public static Duration parse(String value) throws ParseException {
-    // Must ended with "s".
-    if (value.isEmpty() || value.charAt(value.length() - 1) != 's') {
-      throw new ParseException("Invalid duration string: " + value, 0);
-    }
-    boolean negative = false;
-    if (value.charAt(0) == '-') {
-      negative = true;
-      value = value.substring(1);
-    }
-    String secondValue = value.substring(0, value.length() - 1);
-    String nanoValue = "";
-    int pointPosition = secondValue.indexOf('.');
-    if (pointPosition != -1) {
-      nanoValue = secondValue.substring(pointPosition + 1);
-      secondValue = secondValue.substring(0, pointPosition);
-    }
-    long seconds = Long.parseLong(secondValue);
-    int nanos = nanoValue.isEmpty() ? 0 : Timestamps.parseNanos(nanoValue);
-    if (seconds < 0) {
-      throw new ParseException("Invalid duration string: " + value, 0);
-    }
-    if (negative) {
-      seconds = -seconds;
-      nanos = -nanos;
-    }
-    try {
-      return normalizedDuration(seconds, nanos);
-    } catch (IllegalArgumentException e) {
-      throw new ParseException("Duration value is out of range.", 0);
-    }
-  }
-
-  /** Create a Duration from the number of seconds. */
-  public static Duration fromSeconds(long seconds) {
-    return normalizedDuration(seconds, 0);
-  }
-
-  /**
-   * Convert a Duration to the number of seconds. The result will be rounded towards 0 to the
-   * nearest second. E.g., if the duration represents -1 nanosecond, it will be rounded to 0.
-   */
-  public static long toSeconds(Duration duration) {
-    return checkValid(duration).getSeconds();
-  }
-
-  /** Create a Duration from the number of milliseconds. */
-  public static Duration fromMillis(long milliseconds) {
-    return normalizedDuration(
-        milliseconds / MILLIS_PER_SECOND,
-        (int) (milliseconds % MILLIS_PER_SECOND * NANOS_PER_MILLISECOND));
-  }
-
-  /**
-   * Convert a Duration to the number of milliseconds. The result will be rounded towards 0 to the
-   * nearest millisecond. E.g., if the duration represents -1 nanosecond, it will be rounded to 0.
-   */
-  public static long toMillis(Duration duration) {
-    checkValid(duration);
-    return checkedAdd(
-        checkedMultiply(duration.getSeconds(), MILLIS_PER_SECOND),
-        duration.getNanos() / NANOS_PER_MILLISECOND);
-  }
-
-  /** Create a Duration from the number of microseconds. */
-  public static Duration fromMicros(long microseconds) {
-    return normalizedDuration(
-        microseconds / MICROS_PER_SECOND,
-        (int) (microseconds % MICROS_PER_SECOND * NANOS_PER_MICROSECOND));
-  }
-
-  /**
-   * Convert a Duration to the number of microseconds. The result will be rounded towards 0 to the
-   * nearest microseconds. E.g., if the duration represents -1 nanosecond, it will be rounded to 0.
-   */
-  public static long toMicros(Duration duration) {
-    checkValid(duration);
-    return checkedAdd(
-        checkedMultiply(duration.getSeconds(), MICROS_PER_SECOND),
-        duration.getNanos() / NANOS_PER_MICROSECOND);
-  }
-
-  /** Create a Duration from the number of nanoseconds. */
-  public static Duration fromNanos(long nanoseconds) {
-    return normalizedDuration(
-        nanoseconds / NANOS_PER_SECOND, (int) (nanoseconds % NANOS_PER_SECOND));
-  }
-
-  /** Convert a Duration to the number of nanoseconds. */
-  public static long toNanos(Duration duration) {
-    checkValid(duration);
-    return checkedAdd(
-        checkedMultiply(duration.getSeconds(), NANOS_PER_SECOND), duration.getNanos());
-  }
-
-  /** Add two durations. */
-  public static Duration add(Duration d1, Duration d2) {
-    checkValid(d1);
-    checkValid(d2);
-    return normalizedDuration(
-        checkedAdd(d1.getSeconds(), d2.getSeconds()), checkedAdd(d1.getNanos(), d2.getNanos()));
-  }
-
-  /** Subtract a duration from another. */
-  public static Duration subtract(Duration d1, Duration d2) {
-    checkValid(d1);
-    checkValid(d2);
-    return normalizedDuration(
-        checkedSubtract(d1.getSeconds(), d2.getSeconds()),
-        checkedSubtract(d1.getNanos(), d2.getNanos()));
-  }
-
-  static Duration normalizedDuration(long seconds, int nanos) {
-    if (nanos <= -NANOS_PER_SECOND || nanos >= NANOS_PER_SECOND) {
-      seconds = checkedAdd(seconds, nanos / NANOS_PER_SECOND);
-      nanos %= NANOS_PER_SECOND;
-    }
-    if (seconds > 0 && nanos < 0) {
-      nanos += NANOS_PER_SECOND; // no overflow since nanos is negative (and we're adding)
-      seconds--; // no overflow since seconds is positive (and we're decrementing)
-    }
-    if (seconds < 0 && nanos > 0) {
-      nanos -= NANOS_PER_SECOND; // no overflow since nanos is positive (and we're subtracting)
-      seconds++; // no overflow since seconds is negative (and we're incrementing)
-    }
-    Duration duration = Duration.newBuilder().setSeconds(seconds).setNanos(nanos).build();
-    return checkValid(duration);
-  }
-}
diff --git a/java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java b/java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java
index e017b98..668d65a 100644
--- a/java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java
+++ b/java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java
@@ -34,10 +34,10 @@
 import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.FieldMask;
 import com.google.protobuf.Message;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
-import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.logging.Logger;
 
@@ -59,26 +59,22 @@
  * intersection to two FieldMasks and traverse all fields specified by the
  * FieldMask in a message tree.
  */
-final class FieldMaskTree {
+class FieldMaskTree {
   private static final Logger logger = Logger.getLogger(FieldMaskTree.class.getName());
 
   private static final String FIELD_PATH_SEPARATOR_REGEX = "\\.";
 
-  private static final class Node {
-    final SortedMap<String, Node> children = new TreeMap<String, Node>();
+  private static class Node {
+    public TreeMap<String, Node> children = new TreeMap<String, Node>();
   }
 
   private final Node root = new Node();
 
-  /**
-   * Creates an empty FieldMaskTree.
-   */
-  FieldMaskTree() {}
+  /** Creates an empty FieldMaskTree. */
+  public FieldMaskTree() {}
 
-  /**
-   * Creates a FieldMaskTree for a given FieldMask.
-   */
-  FieldMaskTree(FieldMask mask) {
+  /** Creates a FieldMaskTree for a given FieldMask. */
+  public FieldMaskTree(FieldMask mask) {
     mergeFromFieldMask(mask);
   }
 
@@ -97,7 +93,7 @@
    * Likewise, if the field path to add is a sub-path of an existing leaf node,
    * nothing will be changed in the tree.
    */
-  FieldMaskTree addFieldPath(String path) {
+  public FieldMaskTree addFieldPath(String path) {
     String[] parts = path.split(FIELD_PATH_SEPARATOR_REGEX);
     if (parts.length == 0) {
       return this;
@@ -128,17 +124,15 @@
   /**
    * Merges all field paths in a FieldMask into this tree.
    */
-  FieldMaskTree mergeFromFieldMask(FieldMask mask) {
+  public FieldMaskTree mergeFromFieldMask(FieldMask mask) {
     for (String path : mask.getPathsList()) {
       addFieldPath(path);
     }
     return this;
   }
 
-  /**
-   * Converts this tree to a FieldMask.
-   */
-  FieldMask toFieldMask() {
+  /** Converts this tree to a FieldMask. */
+  public FieldMask toFieldMask() {
     if (root.children.isEmpty()) {
       return FieldMask.getDefaultInstance();
     }
@@ -147,9 +141,7 @@
     return FieldMask.newBuilder().addAllPaths(paths).build();
   }
 
-  /**
-   * Gathers all field paths in a sub-tree.
-   */
+  /** Gathers all field paths in a sub-tree. */
   private void getFieldPaths(Node node, String path, List<String> paths) {
     if (node.children.isEmpty()) {
       paths.add(path);
@@ -162,9 +154,10 @@
   }
 
   /**
-   * Adds the intersection of this tree with the given {@code path} to {@code output}.
+   * Adds the intersection of this tree with the given {@code path} to
+   * {@code output}.
    */
-  void intersectFieldPath(String path, FieldMaskTree output) {
+  public void intersectFieldPath(String path, FieldMaskTree output) {
     if (root.children.isEmpty()) {
       return;
     }
@@ -195,9 +188,11 @@
   }
 
   /**
-   * Merges all fields specified by this FieldMaskTree from {@code source} to {@code destination}.
+   * Merges all fields specified by this FieldMaskTree from {@code source} to
+   * {@code destination}.
    */
-  void merge(Message source, Message.Builder destination, FieldMaskUtil.MergeOptions options) {
+  public void merge(
+      Message source, Message.Builder destination, FieldMaskUtil.MergeOptions options) {
     if (source.getDescriptorForType() != destination.getDescriptorForType()) {
       throw new IllegalArgumentException("Cannot merge messages of different types.");
     }
@@ -207,8 +202,8 @@
     merge(root, "", source, destination, options);
   }
 
-  /**
-   * Merges all fields specified by a sub-tree from {@code source} to {@code destination}.
+  /** Merges all fields specified by a sub-tree from {@code source} to
+   * {@code destination}.
    */
   private void merge(
       Node node,
@@ -216,12 +211,7 @@
       Message source,
       Message.Builder destination,
       FieldMaskUtil.MergeOptions options) {
-    if (source.getDescriptorForType() != destination.getDescriptorForType()) {
-      throw new IllegalArgumentException(
-          String.format(
-              "source (%s) and destination (%s) descriptor must be equal",
-              source.getDescriptorForType(), destination.getDescriptorForType()));
-    }
+    assert source.getDescriptorForType() == destination.getDescriptorForType();
 
     Descriptor descriptor = source.getDescriptorForType();
     for (Entry<String, Node> entry : node.children.entrySet()) {
@@ -243,11 +233,6 @@
                   + "singluar message field and cannot have sub-fields.");
           continue;
         }
-        if (!source.hasField(field) && !destination.hasField(field)) {
-          // If the message field is not present in both source and destination, skip recursing
-          // so we don't create unneccessary empty messages.
-          continue;
-        }
         String childPath = path.isEmpty() ? entry.getKey() : path + "." + entry.getKey();
         merge(
             entry.getValue(),
diff --git a/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java b/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
index b2f849c..9696152 100644
--- a/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
+++ b/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
@@ -32,9 +32,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.base.CaseFormat;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
 import com.google.common.primitives.Ints;
 import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
@@ -42,9 +39,7 @@
 import com.google.protobuf.Internal;
 import com.google.protobuf.Message;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 /**
  * Utility helper functions to work with {@link com.google.protobuf.FieldMask}.
@@ -53,7 +48,7 @@
   private static final String FIELD_PATH_SEPARATOR = ",";
   private static final String FIELD_PATH_SEPARATOR_REGEX = ",";
   private static final String FIELD_SEPARATOR_REGEX = "\\.";
-
+  
   private FieldMaskUtil() {}
 
   /**
@@ -83,17 +78,19 @@
    */
   public static FieldMask fromString(String value) {
     // TODO(xiaofeng): Consider using com.google.common.base.Splitter here instead.
-    return fromStringList(null, Arrays.asList(value.split(FIELD_PATH_SEPARATOR_REGEX)));
+    return fromStringList(
+        null, Arrays.asList(value.split(FIELD_PATH_SEPARATOR_REGEX)));
   }
 
   /**
    * Parses from a string to a FieldMask and validates all field paths.
-   *
+   * 
    * @throws IllegalArgumentException if any of the field path is invalid.
    */
   public static FieldMask fromString(Class<? extends Message> type, String value) {
     // TODO(xiaofeng): Consider using com.google.common.base.Splitter here instead.
-    return fromStringList(type, Arrays.asList(value.split(FIELD_PATH_SEPARATOR_REGEX)));
+    return fromStringList(
+        type, Arrays.asList(value.split(FIELD_PATH_SEPARATOR_REGEX)));
   }
 
   /**
@@ -102,7 +99,8 @@
    * @throws IllegalArgumentException if any of the field path is not valid.
    */
   // TODO(xiaofeng): Consider renaming fromStrings()
-  public static FieldMask fromStringList(Class<? extends Message> type, Iterable<String> paths) {
+  public static FieldMask fromStringList(
+      Class<? extends Message> type, Iterable<String> paths) {
     FieldMask.Builder builder = FieldMask.newBuilder();
     for (String path : paths) {
       if (path.isEmpty()) {
@@ -110,7 +108,8 @@
         continue;
       }
       if (type != null && !isValid(type, path)) {
-        throw new IllegalArgumentException(path + " is not a valid path for " + type);
+        throw new IllegalArgumentException(
+            path + " is not a valid path for " + type);
       }
       builder.addPaths(path);
     }
@@ -147,45 +146,15 @@
   }
 
   /**
-   * Converts a field mask to a Proto3 JSON string, that is converting from snake case to camel
-   * case and joining all paths into one string with commas.
-   */
-  public static String toJsonString(FieldMask fieldMask) {
-    List<String> paths = new ArrayList<String>(fieldMask.getPathsCount());
-    for (String path : fieldMask.getPathsList()) {
-      if (path.isEmpty()) {
-        continue;
-      }
-      paths.add(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, path));
-    }
-    return Joiner.on(FIELD_PATH_SEPARATOR).join(paths);
-  }
-
-  /**
-   * Converts a field mask from a Proto3 JSON string, that is splitting the paths along commas and
-   * converting from camel case to snake case.
-   */
-  public static FieldMask fromJsonString(String value) {
-    Iterable<String> paths = Splitter.on(FIELD_PATH_SEPARATOR).split(value);
-    FieldMask.Builder builder = FieldMask.newBuilder();
-    for (String path : paths) {
-      if (path.isEmpty()) {
-        continue;
-      }
-      builder.addPaths(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, path));
-    }
-    return builder.build();
-  }
-
-  /**
    * Checks whether paths in a given fields mask are valid.
    */
   public static boolean isValid(Class<? extends Message> type, FieldMask fieldMask) {
-    Descriptor descriptor = Internal.getDefaultInstance(type).getDescriptorForType();
-
+    Descriptor descriptor =
+        Internal.getDefaultInstance(type).getDescriptorForType();
+    
     return isValid(descriptor, fieldMask);
   }
-
+  
   /**
    * Checks whether paths in a given fields mask are valid.
    */
@@ -202,8 +171,9 @@
    * Checks whether a given field path is valid.
    */
   public static boolean isValid(Class<? extends Message> type, String path) {
-    Descriptor descriptor = Internal.getDefaultInstance(type).getDescriptorForType();
-
+    Descriptor descriptor =
+        Internal.getDefaultInstance(type).getDescriptorForType();
+    
     return isValid(descriptor, path);
   }
 
@@ -223,7 +193,8 @@
       if (field == null) {
         return false;
       }
-      if (!field.isRepeated() && field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+      if (!field.isRepeated()
+          && field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
         descriptor = field.getMessageType();
       } else {
         descriptor = null;
@@ -231,7 +202,7 @@
     }
     return true;
   }
-
+  
   /**
    * Converts a FieldMask to its canonical form. In the canonical form of a
    * FieldMask, all field paths are sorted alphabetically and redundant field
@@ -280,7 +251,7 @@
      * destination message fields) when merging.
      * Default behavior is to merge the source message field into the
      * destination message field.
-     */
+     */ 
     public boolean replaceMessageFields() {
       return replaceMessageFields;
     }
@@ -311,19 +282,16 @@
       return replacePrimitiveFields;
     }
 
-    public MergeOptions setReplaceMessageFields(boolean value) {
+    public void setReplaceMessageFields(boolean value) {
       replaceMessageFields = value;
-      return this;
     }
 
-    public MergeOptions setReplaceRepeatedFields(boolean value) {
+    public void setReplaceRepeatedFields(boolean value) {
       replaceRepeatedFields = value;
-      return this;
     }
 
-    public MergeOptions setReplacePrimitiveFields(boolean value) {
+    public void setReplacePrimitiveFields(boolean value) {
       replacePrimitiveFields = value;
-      return this;
     }
   }
 
@@ -331,15 +299,16 @@
    * Merges fields specified by a FieldMask from one message to another with the
    * specified merge options.
    */
-  public static void merge(
-      FieldMask mask, Message source, Message.Builder destination, MergeOptions options) {
+  public static void merge(FieldMask mask, Message source,
+      Message.Builder destination, MergeOptions options) {
     new FieldMaskTree(mask).merge(source, destination, options);
   }
 
   /**
    * Merges fields specified by a FieldMask from one message to another.
    */
-  public static void merge(FieldMask mask, Message source, Message.Builder destination) {
+  public static void merge(FieldMask mask, Message source,
+      Message.Builder destination) {
     merge(mask, source, destination, new MergeOptions());
   }
 }
diff --git a/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java b/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
index a26dbc2..76f3437 100644
--- a/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
+++ b/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
@@ -30,13 +30,11 @@
 
 package com.google.protobuf.util;
 
-import com.google.common.base.Preconditions;
 import com.google.common.io.BaseEncoding;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
-import com.google.gson.JsonIOException;
 import com.google.gson.JsonNull;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
@@ -51,7 +49,6 @@
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.Descriptors.FileDescriptor;
-import com.google.protobuf.Descriptors.OneofDescriptor;
 import com.google.protobuf.DoubleValue;
 import com.google.protobuf.Duration;
 import com.google.protobuf.DynamicMessage;
@@ -63,13 +60,13 @@
 import com.google.protobuf.ListValue;
 import com.google.protobuf.Message;
 import com.google.protobuf.MessageOrBuilder;
-import com.google.protobuf.NullValue;
 import com.google.protobuf.StringValue;
 import com.google.protobuf.Struct;
 import com.google.protobuf.Timestamp;
 import com.google.protobuf.UInt32Value;
 import com.google.protobuf.UInt64Value;
 import com.google.protobuf.Value;
+
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
@@ -95,66 +92,46 @@
  * as well.
  */
 public class JsonFormat {
-  private static final Logger logger = Logger.getLogger(JsonFormat.class.getName());
+  private static final Logger logger =
+      Logger.getLogger(JsonFormat.class.getName());
 
   private JsonFormat() {}
-
+  
   /**
    * Creates a {@link Printer} with default configurations.
    */
   public static Printer printer() {
-    return new Printer(
-        TypeRegistry.getEmptyTypeRegistry(), false, Collections.<FieldDescriptor>emptySet(),
-        false, false);
+    return new Printer(TypeRegistry.getEmptyTypeRegistry(), false, false);
   }
-
+  
   /**
    * A Printer converts protobuf message to JSON format.
    */
   public static class Printer {
     private final TypeRegistry registry;
-    // NOTE: There are 3 states for these *defaultValueFields variables:
-    // 1) Default - alwaysOutput is false & including is empty set. Fields only output if they are
-    //    set to non-default values.
-    // 2) No-args includingDefaultValueFields() called - alwaysOutput is true & including is
-    //    irrelevant (but set to empty set). All fields are output regardless of their values.
-    // 3) includingDefaultValueFields(Set<FieldDescriptor>) called - alwaysOutput is false &
-    //    including is set to the specified set. Fields in that set are always output & fields not
-    //    in that set are only output if set to non-default values.
-    private boolean alwaysOutputDefaultValueFields;
-    private Set<FieldDescriptor> includingDefaultValueFields;
+    private final boolean includingDefaultValueFields;
     private final boolean preservingProtoFieldNames;
-    private final boolean omittingInsignificantWhitespace;
 
     private Printer(
         TypeRegistry registry,
-        boolean alwaysOutputDefaultValueFields,
-        Set<FieldDescriptor> includingDefaultValueFields,
-        boolean preservingProtoFieldNames,
-        boolean omittingInsignificantWhitespace) {
+        boolean includingDefaultValueFields,
+        boolean preservingProtoFieldNames) {
       this.registry = registry;
-      this.alwaysOutputDefaultValueFields = alwaysOutputDefaultValueFields;
       this.includingDefaultValueFields = includingDefaultValueFields;
       this.preservingProtoFieldNames = preservingProtoFieldNames;
-      this.omittingInsignificantWhitespace = omittingInsignificantWhitespace;
     }
-
+    
     /**
      * Creates a new {@link Printer} using the given registry. The new Printer
      * clones all other configurations from the current {@link Printer}.
-     *
+     * 
      * @throws IllegalArgumentException if a registry is already set.
      */
     public Printer usingTypeRegistry(TypeRegistry registry) {
       if (this.registry != TypeRegistry.getEmptyTypeRegistry()) {
         throw new IllegalArgumentException("Only one registry is allowed.");
       }
-      return new Printer(
-          registry,
-          alwaysOutputDefaultValueFields,
-          includingDefaultValueFields,
-          preservingProtoFieldNames,
-          omittingInsignificantWhitespace);
+      return new Printer(registry, includingDefaultValueFields, preservingProtoFieldNames);
     }
 
     /**
@@ -164,41 +141,7 @@
      * {@link Printer}.
      */
     public Printer includingDefaultValueFields() {
-      checkUnsetIncludingDefaultValueFields();
-      return new Printer(
-          registry,
-          true,
-          Collections.<FieldDescriptor>emptySet(),
-          preservingProtoFieldNames,
-          omittingInsignificantWhitespace);
-    }
-
-    /**
-     * Creates a new {@link Printer} that will also print default-valued fields if their
-     * FieldDescriptors are found in the supplied set. Empty repeated fields and map fields will be
-     * printed as well, if they match. The new Printer clones all other configurations from the
-     * current {@link Printer}. Call includingDefaultValueFields() with no args to unconditionally
-     * output all fields.
-     */
-    public Printer includingDefaultValueFields(Set<FieldDescriptor> fieldsToAlwaysOutput) {
-      Preconditions.checkArgument(
-          null != fieldsToAlwaysOutput && !fieldsToAlwaysOutput.isEmpty(),
-          "Non-empty Set must be supplied for includingDefaultValueFields.");
-
-      checkUnsetIncludingDefaultValueFields();
-      return new Printer(
-          registry,
-          false,
-          fieldsToAlwaysOutput,
-          preservingProtoFieldNames,
-          omittingInsignificantWhitespace);
-    }
-
-    private void checkUnsetIncludingDefaultValueFields() {
-      if (alwaysOutputDefaultValueFields || !includingDefaultValueFields.isEmpty()) {
-        throw new IllegalStateException(
-            "JsonFormat includingDefaultValueFields has already been set.");
-      }
+      return new Printer(registry, true, preservingProtoFieldNames);
     }
 
     /**
@@ -208,66 +151,30 @@
      * current {@link Printer}.
      */
     public Printer preservingProtoFieldNames() {
-      return new Printer(
-          registry,
-          alwaysOutputDefaultValueFields,
-          includingDefaultValueFields,
-          true,
-          omittingInsignificantWhitespace);
+      return new Printer(registry, includingDefaultValueFields, true);
     }
-
-
-    /**
-     * Create a new {@link Printer} that will omit all insignificant whitespace in the JSON output.
-     * This new Printer clones all other configurations from the current Printer. Insignificant
-     * whitespace is defined by the JSON spec as whitespace that appear between JSON structural
-     * elements:
-     *
-     * <pre>
-     * ws = *(
-     * %x20 /              ; Space
-     * %x09 /              ; Horizontal tab
-     * %x0A /              ; Line feed or New line
-     * %x0D )              ; Carriage return
-     * </pre>
-     *
-     * See <a href="https://tools.ietf.org/html/rfc7159">https://tools.ietf.org/html/rfc7159</a>
-     * current {@link Printer}.
-     */
-    public Printer omittingInsignificantWhitespace() {
-      return new Printer(
-          registry,
-          alwaysOutputDefaultValueFields,
-          includingDefaultValueFields,
-          preservingProtoFieldNames,
-          true);
-    }
-
+    
     /**
      * Converts a protobuf message to JSON format.
-     *
-     * @throws InvalidProtocolBufferException if the message contains Any types that can't be
-     *     resolved.
+     * 
+     * @throws InvalidProtocolBufferException if the message contains Any types
+     *         that can't be resolved.
      * @throws IOException if writing to the output fails.
      */
-    public void appendTo(MessageOrBuilder message, Appendable output) throws IOException {
+    public void appendTo(MessageOrBuilder message, Appendable output)
+        throws IOException {
       // TODO(xiaofeng): Investigate the allocation overhead and optimize for
       // mobile.
-      new PrinterImpl(
-              registry,
-              alwaysOutputDefaultValueFields,
-              includingDefaultValueFields,
-              preservingProtoFieldNames,
-              output,
-              omittingInsignificantWhitespace)
+      new PrinterImpl(registry, includingDefaultValueFields, preservingProtoFieldNames, output)
           .print(message);
     }
 
     /**
      * Converts a protobuf message to JSON format. Throws exceptions if there
-     * are unknown Any types in the message.
+     * are unknown Any types in the message. 
      */
-    public String print(MessageOrBuilder message) throws InvalidProtocolBufferException {
+    public String print(MessageOrBuilder message)
+        throws InvalidProtocolBufferException {
       try {
         StringBuilder builder = new StringBuilder();
         appendTo(message, builder);
@@ -285,75 +192,57 @@
    * Creates a {@link Parser} with default configuration.
    */
   public static Parser parser() {
-    return new Parser(TypeRegistry.getEmptyTypeRegistry(), false, Parser.DEFAULT_RECURSION_LIMIT);
+    return new Parser(TypeRegistry.getEmptyTypeRegistry());
   }
-
+  
   /**
    * A Parser parses JSON to protobuf message.
    */
   public static class Parser {
     private final TypeRegistry registry;
-    private final boolean ignoringUnknownFields;
-    private final int recursionLimit;
-
-    // The default parsing recursion limit is aligned with the proto binary parser.
-    private static final int DEFAULT_RECURSION_LIMIT = 100;
-
-    private Parser(TypeRegistry registry, boolean ignoreUnknownFields, int recursionLimit) {
-      this.registry = registry;
-      this.ignoringUnknownFields = ignoreUnknownFields;
-      this.recursionLimit = recursionLimit;
+    
+    private Parser(TypeRegistry registry) {
+      this.registry = registry; 
     }
-
+    
     /**
      * Creates a new {@link Parser} using the given registry. The new Parser
      * clones all other configurations from this Parser.
-     *
+     * 
      * @throws IllegalArgumentException if a registry is already set.
      */
     public Parser usingTypeRegistry(TypeRegistry registry) {
       if (this.registry != TypeRegistry.getEmptyTypeRegistry()) {
         throw new IllegalArgumentException("Only one registry is allowed.");
       }
-      return new Parser(registry, ignoringUnknownFields, recursionLimit);
+      return new Parser(registry);
     }
-
-    /**
-     * Creates a new {@link Parser} configured to not throw an exception when an unknown field is
-     * encountered. The new Parser clones all other configurations from this Parser.
-     */
-    public Parser ignoringUnknownFields() {
-      return new Parser(this.registry, true, recursionLimit);
-    }
-
+    
     /**
      * Parses from JSON into a protobuf message.
-     *
+     * 
      * @throws InvalidProtocolBufferException if the input is not valid JSON
      *         format or there are unknown fields in the input.
      */
-    public void merge(String json, Message.Builder builder) throws InvalidProtocolBufferException {
+    public void merge(String json, Message.Builder builder)
+        throws InvalidProtocolBufferException {
       // TODO(xiaofeng): Investigate the allocation overhead and optimize for
       // mobile.
-      new ParserImpl(registry, ignoringUnknownFields, recursionLimit).merge(json, builder);
+      new ParserImpl(registry).merge(json, builder);
     }
-
+    
     /**
      * Parses from JSON into a protobuf message.
-     *
+     * 
      * @throws InvalidProtocolBufferException if the input is not valid JSON
      *         format or there are unknown fields in the input.
      * @throws IOException if reading from the input throws.
      */
-    public void merge(Reader json, Message.Builder builder) throws IOException {
+    public void merge(Reader json, Message.Builder builder)
+        throws IOException {
       // TODO(xiaofeng): Investigate the allocation overhead and optimize for
       // mobile.
-      new ParserImpl(registry, ignoringUnknownFields, recursionLimit).merge(json, builder);
-    }
-
-    // For testing only.
-    Parser usingRecursionLimit(int recursionLimit) {
-      return new Parser(registry, ignoringUnknownFields, recursionLimit);
+      new ParserImpl(registry).merge(json, builder);
     }
   }
 
@@ -366,8 +255,8 @@
    */
   public static class TypeRegistry {
     private static class EmptyTypeRegistryHolder {
-      private static final TypeRegistry EMPTY =
-          new TypeRegistry(Collections.<String, Descriptor>emptyMap());
+      private static final TypeRegistry EMPTY = new TypeRegistry(
+          Collections.<String, Descriptor>emptyMap());
     }
 
     public static TypeRegistry getEmptyTypeRegistry() {
@@ -404,7 +293,8 @@
        */
       public Builder add(Descriptor messageType) {
         if (types == null) {
-          throw new IllegalStateException("A TypeRegistry.Builer can only be used once.");
+          throw new IllegalStateException(
+              "A TypeRegistry.Builer can only be used once.");
         }
         addFile(messageType.getFile());
         return this;
@@ -416,7 +306,8 @@
        */
       public Builder add(Iterable<Descriptor> messageTypes) {
         if (types == null) {
-          throw new IllegalStateException("A TypeRegistry.Builer can only be used once.");
+          throw new IllegalStateException(
+              "A TypeRegistry.Builer can only be used once.");
         }
         for (Descriptor type : messageTypes) {
           addFile(type.getFile());
@@ -454,7 +345,8 @@
         }
 
         if (types.containsKey(message.getFullName())) {
-          logger.warning("Type " + message.getFullName() + " is added multiple times.");
+          logger.warning("Type " + message.getFullName()
+              + " is added multiple times.");
           return;
         }
 
@@ -462,80 +354,48 @@
       }
 
       private final Set<String> files = new HashSet<String>();
-      private Map<String, Descriptor> types = new HashMap<String, Descriptor>();
+      private Map<String, Descriptor> types =
+          new HashMap<String, Descriptor>();
     }
   }
 
   /**
-   * An interface for json formatting that can be used in
-   * combination with the omittingInsignificantWhitespace() method
-   */
-  interface TextGenerator {
-    void indent();
-
-    void outdent();
-
-    void print(final CharSequence text) throws IOException;
-  }
-
-  /**
-   * Format the json without indentation
-   */
-  private static final class CompactTextGenerator implements TextGenerator {
-    private final Appendable output;
-
-    private CompactTextGenerator(final Appendable output) {
-      this.output = output;
-    }
-
-    /** ignored by compact printer */
-    @Override
-    public void indent() {}
-
-    /** ignored by compact printer */
-    @Override
-    public void outdent() {}
-
-    /** Print text to the output stream. */
-    @Override
-    public void print(final CharSequence text) throws IOException {
-      output.append(text);
-    }
-  }
-  /**
    * A TextGenerator adds indentation when writing formatted text.
    */
-  private static final class PrettyTextGenerator implements TextGenerator {
+  private static final class TextGenerator {
     private final Appendable output;
     private final StringBuilder indent = new StringBuilder();
     private boolean atStartOfLine = true;
 
-    private PrettyTextGenerator(final Appendable output) {
+    private TextGenerator(final Appendable output) {
       this.output = output;
     }
 
     /**
-     * Indent text by two spaces. After calling Indent(), two spaces will be inserted at the
-     * beginning of each line of text. Indent() may be called multiple times to produce deeper
-     * indents.
+     * Indent text by two spaces.  After calling Indent(), two spaces will be
+     * inserted at the beginning of each line of text.  Indent() may be called
+     * multiple times to produce deeper indents.
      */
-    @Override
     public void indent() {
       indent.append("  ");
     }
 
-    /** Reduces the current indent level by two spaces, or crashes if the indent level is zero. */
-    @Override
+    /**
+     * Reduces the current indent level by two spaces, or crashes if the indent
+     * level is zero.
+     */
     public void outdent() {
       final int length = indent.length();
       if (length < 2) {
-        throw new IllegalArgumentException(" Outdent() without matching Indent().");
+        throw new IllegalArgumentException(
+            " Outdent() without matching Indent().");
       }
       indent.delete(length - 2, length);
     }
 
-    /** Print text to the output stream. */
-    @Override
+    /**
+     * Print text to the output stream.
+     */
     public void print(final CharSequence text) throws IOException {
       final int size = text.length();
       int pos = 0;
@@ -567,14 +427,11 @@
    */
   private static final class PrinterImpl {
     private final TypeRegistry registry;
-    private final boolean alwaysOutputDefaultValueFields;
-    private final Set<FieldDescriptor> includingDefaultValueFields;
+    private final boolean includingDefaultValueFields;
     private final boolean preservingProtoFieldNames;
     private final TextGenerator generator;
     // We use Gson to help handle string escapes.
     private final Gson gson;
-    private final CharSequence blankOrSpace;
-    private final CharSequence blankOrNewLine;
 
     private static class GsonHolder {
       private static final Gson DEFAULT_GSON = new GsonBuilder().disableHtmlEscaping().create();
@@ -582,64 +439,56 @@
 
     PrinterImpl(
         TypeRegistry registry,
-        boolean alwaysOutputDefaultValueFields,
-        Set<FieldDescriptor> includingDefaultValueFields,
+        boolean includingDefaultValueFields,
         boolean preservingProtoFieldNames,
-        Appendable jsonOutput,
-        boolean omittingInsignificantWhitespace) {
+        Appendable jsonOutput) {
       this.registry = registry;
-      this.alwaysOutputDefaultValueFields = alwaysOutputDefaultValueFields;
       this.includingDefaultValueFields = includingDefaultValueFields;
       this.preservingProtoFieldNames = preservingProtoFieldNames;
+      this.generator = new TextGenerator(jsonOutput);
       this.gson = GsonHolder.DEFAULT_GSON;
-      // json format related properties, determined by printerType
-      if (omittingInsignificantWhitespace) {
-        this.generator = new CompactTextGenerator(jsonOutput);
-        this.blankOrSpace = "";
-        this.blankOrNewLine = "";
-      } else {
-        this.generator = new PrettyTextGenerator(jsonOutput);
-        this.blankOrSpace = " ";
-        this.blankOrNewLine = "\n";
-      }
     }
 
     void print(MessageOrBuilder message) throws IOException {
-      WellKnownTypePrinter specialPrinter =
-          wellKnownTypePrinters.get(message.getDescriptorForType().getFullName());
+      WellKnownTypePrinter specialPrinter = wellKnownTypePrinters.get(
+          message.getDescriptorForType().getFullName());
       if (specialPrinter != null) {
         specialPrinter.print(this, message);
         return;
       }
       print(message, null);
     }
-
+    
     private interface WellKnownTypePrinter {
-      void print(PrinterImpl printer, MessageOrBuilder message) throws IOException;
+      void print(PrinterImpl printer, MessageOrBuilder message)
+          throws IOException;
     }
-
-    private static final Map<String, WellKnownTypePrinter> wellKnownTypePrinters =
-        buildWellKnownTypePrinters();
-
-    private static Map<String, WellKnownTypePrinter> buildWellKnownTypePrinters() {
-      Map<String, WellKnownTypePrinter> printers = new HashMap<String, WellKnownTypePrinter>();
+    
+    private static final Map<String, WellKnownTypePrinter>
+    wellKnownTypePrinters = buildWellKnownTypePrinters();
+    
+    private static Map<String, WellKnownTypePrinter>
+    buildWellKnownTypePrinters() {
+      Map<String, WellKnownTypePrinter> printers =
+          new HashMap<String, WellKnownTypePrinter>();
       // Special-case Any.
-      printers.put(
-          Any.getDescriptor().getFullName(),
+      printers.put(Any.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printAny(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printAny(message);
+        }
+      });
       // Special-case wrapper types.
-      WellKnownTypePrinter wrappersPrinter =
-          new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printWrapper(message);
-            }
-          };
+      WellKnownTypePrinter wrappersPrinter = new WellKnownTypePrinter() {
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printWrapper(message);
+          
+        }
+      };
       printers.put(BoolValue.getDescriptor().getFullName(), wrappersPrinter);
       printers.put(Int32Value.getDescriptor().getFullName(), wrappersPrinter);
       printers.put(UInt32Value.getDescriptor().getFullName(), wrappersPrinter);
@@ -650,75 +499,70 @@
       printers.put(FloatValue.getDescriptor().getFullName(), wrappersPrinter);
       printers.put(DoubleValue.getDescriptor().getFullName(), wrappersPrinter);
       // Special-case Timestamp.
-      printers.put(
-          Timestamp.getDescriptor().getFullName(),
+      printers.put(Timestamp.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printTimestamp(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printTimestamp(message);
+        }
+      });
       // Special-case Duration.
-      printers.put(
-          Duration.getDescriptor().getFullName(),
+      printers.put(Duration.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printDuration(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printDuration(message);
+        }
+      });
       // Special-case FieldMask.
-      printers.put(
-          FieldMask.getDescriptor().getFullName(),
+      printers.put(FieldMask.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printFieldMask(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printFieldMask(message);
+        }
+      });
       // Special-case Struct.
-      printers.put(
-          Struct.getDescriptor().getFullName(),
+      printers.put(Struct.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printStruct(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printStruct(message);
+        }
+      });
       // Special-case Value.
-      printers.put(
-          Value.getDescriptor().getFullName(),
+      printers.put(Value.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printValue(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printValue(message);
+        }
+      });
       // Special-case ListValue.
-      printers.put(
-          ListValue.getDescriptor().getFullName(),
+      printers.put(ListValue.getDescriptor().getFullName(),
           new WellKnownTypePrinter() {
-            @Override
-            public void print(PrinterImpl printer, MessageOrBuilder message) throws IOException {
-              printer.printListValue(message);
-            }
-          });
+        @Override
+        public void print(PrinterImpl printer, MessageOrBuilder message)
+            throws IOException {
+          printer.printListValue(message);
+        }
+      });
       return printers;
     }
-
+    
     /** Prints google.protobuf.Any */
     private void printAny(MessageOrBuilder message) throws IOException {
-      if (Any.getDefaultInstance().equals(message)) {
-        generator.print("{}");
-        return;
-      }
       Descriptor descriptor = message.getDescriptorForType();
       FieldDescriptor typeUrlField = descriptor.findFieldByName("type_url");
       FieldDescriptor valueField = descriptor.findFieldByName("value");
       // Validates type of the message. Note that we can't just cast the message
-      // to com.google.protobuf.Any because it might be a DynamicMessage.
-      if (typeUrlField == null
-          || valueField == null
+      // to com.google.protobuf.Any because it might be a DynamicMessage. 
+      if (typeUrlField == null || valueField == null
           || typeUrlField.getType() != FieldDescriptor.Type.STRING
           || valueField.getType() != FieldDescriptor.Type.BYTES) {
         throw new InvalidProtocolBufferException("Invalid Any type.");
@@ -727,21 +571,22 @@
       String typeName = getTypeName(typeUrl);
       Descriptor type = registry.find(typeName);
       if (type == null) {
-        throw new InvalidProtocolBufferException("Cannot find type for url: " + typeUrl);
+        throw new InvalidProtocolBufferException(
+            "Cannot find type for url: " + typeUrl);
       }
       ByteString content = (ByteString) message.getField(valueField);
-      Message contentMessage =
-          DynamicMessage.getDefaultInstance(type).getParserForType().parseFrom(content);
+      Message contentMessage = DynamicMessage.getDefaultInstance(type)
+          .getParserForType().parseFrom(content);
       WellKnownTypePrinter printer = wellKnownTypePrinters.get(typeName);
       if (printer != null) {
         // If the type is one of the well-known types, we use a special
         // formatting.
-        generator.print("{" + blankOrNewLine);
+        generator.print("{\n");
         generator.indent();
-        generator.print("\"@type\":" + blankOrSpace + gson.toJson(typeUrl) + "," + blankOrNewLine);
-        generator.print("\"value\":" + blankOrSpace);
+        generator.print("\"@type\": " + gson.toJson(typeUrl) + ",\n");
+        generator.print("\"value\": ");
         printer.print(this, contentMessage);
-        generator.print(blankOrNewLine);
+        generator.print("\n");
         generator.outdent();
         generator.print("}");
       } else {
@@ -749,7 +594,7 @@
         print(contentMessage, typeUrl);
       }
     }
-
+    
     /** Prints wrapper types (e.g., google.protobuf.Int32Value) */
     private void printWrapper(MessageOrBuilder message) throws IOException {
       Descriptor descriptor = message.getDescriptorForType();
@@ -761,7 +606,7 @@
       // the whole message.
       printSingleFieldValue(valueField, message.getField(valueField));
     }
-
+    
     private ByteString toByteString(MessageOrBuilder message) {
       if (message instanceof Message) {
         return ((Message) message).toByteString();
@@ -769,25 +614,26 @@
         return ((Message.Builder) message).build().toByteString();
       }
     }
-
+    
     /** Prints google.protobuf.Timestamp */
     private void printTimestamp(MessageOrBuilder message) throws IOException {
       Timestamp value = Timestamp.parseFrom(toByteString(message));
-      generator.print("\"" + Timestamps.toString(value) + "\"");
+      generator.print("\"" + TimeUtil.toString(value) + "\"");
     }
-
+    
     /** Prints google.protobuf.Duration */
     private void printDuration(MessageOrBuilder message) throws IOException {
       Duration value = Duration.parseFrom(toByteString(message));
-      generator.print("\"" + Durations.toString(value) + "\"");
+      generator.print("\"" + TimeUtil.toString(value) + "\"");
+      
     }
-
+    
     /** Prints google.protobuf.FieldMask */
     private void printFieldMask(MessageOrBuilder message) throws IOException {
       FieldMask value = FieldMask.parseFrom(toByteString(message));
-      generator.print("\"" + FieldMaskUtil.toJsonString(value) + "\"");
+      generator.print("\"" + FieldMaskUtil.toString(value) + "\"");
     }
-
+    
     /** Prints google.protobuf.Struct */
     private void printStruct(MessageOrBuilder message) throws IOException {
       Descriptor descriptor = message.getDescriptorForType();
@@ -798,7 +644,7 @@
       // Struct is formatted as a map object.
       printMapFieldValue(field, message.getField(field));
     }
-
+    
     /** Prints google.protobuf.Value */
     private void printValue(MessageOrBuilder message) throws IOException {
       // For a Value message, only the value of the field is formatted.
@@ -817,7 +663,7 @@
         printSingleFieldValue(entry.getKey(), entry.getValue());
       }
     }
-
+    
     /** Prints google.protobuf.ListValue */
     private void printListValue(MessageOrBuilder message) throws IOException {
       Descriptor descriptor = message.getDescriptorForType();
@@ -829,36 +675,28 @@
     }
 
     /** Prints a regular message with an optional type URL. */
-    private void print(MessageOrBuilder message, String typeUrl) throws IOException {
-      generator.print("{" + blankOrNewLine);
+    private void print(MessageOrBuilder message, String typeUrl)
+        throws IOException {
+      generator.print("{\n");
       generator.indent();
 
       boolean printedField = false;
       if (typeUrl != null) {
-        generator.print("\"@type\":" + blankOrSpace + gson.toJson(typeUrl));
+        generator.print("\"@type\": " + gson.toJson(typeUrl));
         printedField = true;
       }
       Map<FieldDescriptor, Object> fieldsToPrint = null;
-      if (alwaysOutputDefaultValueFields || !includingDefaultValueFields.isEmpty()) {
-        fieldsToPrint = new TreeMap<FieldDescriptor, Object>(message.getAllFields());
+      if (includingDefaultValueFields) {
+        fieldsToPrint = new TreeMap<FieldDescriptor, Object>();
         for (FieldDescriptor field : message.getDescriptorForType().getFields()) {
-          if (field.isOptional()) {
-            if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE
-                && !message.hasField(field)) {
-              // Always skip empty optional message fields. If not we will recurse indefinitely if
-              // a message has itself as a sub-field.
-              continue;
-            }
-            OneofDescriptor oneof = field.getContainingOneof();
-            if (oneof != null && !message.hasField(field)) {
-              // Skip all oneof fields except the one that is actually set
-              continue;
-            }
+          if (field.isOptional()
+              && field.getJavaType() == FieldDescriptor.JavaType.MESSAGE
+              && !message.hasField(field)) {
+            // Always skip empty optional message fields. If not we will recurse indefinitely if
+            // a message has itself as a sub-field.
+            continue;
           }
-          if (!fieldsToPrint.containsKey(field)
-              && (alwaysOutputDefaultValueFields || includingDefaultValueFields.contains(field))) {
-            fieldsToPrint.put(field, message.getField(field));
-          }
+          fieldsToPrint.put(field, message.getField(field));
         }
       } else {
         fieldsToPrint = message.getAllFields();
@@ -866,26 +704,27 @@
       for (Map.Entry<FieldDescriptor, Object> field : fieldsToPrint.entrySet()) {
         if (printedField) {
           // Add line-endings for the previous field.
-          generator.print("," + blankOrNewLine);
+          generator.print(",\n");
         } else {
           printedField = true;
         }
         printField(field.getKey(), field.getValue());
       }
-
+      
       // Add line-endings for the last field.
       if (printedField) {
-        generator.print(blankOrNewLine);
+        generator.print("\n");
       }
       generator.outdent();
       generator.print("}");
     }
 
-    private void printField(FieldDescriptor field, Object value) throws IOException {
+    private void printField(FieldDescriptor field, Object value)
+        throws IOException {
       if (preservingProtoFieldNames) {
-        generator.print("\"" + field.getName() + "\":" + blankOrSpace);
+        generator.print("\"" + field.getName() + "\": ");
       } else {
-        generator.print("\"" + field.getJsonName() + "\":" + blankOrSpace);
+        generator.print("\"" + field.getJsonName() + "\": ");
       }
       if (field.isMapField()) {
         printMapFieldValue(field, value);
@@ -895,14 +734,15 @@
         printSingleFieldValue(field, value);
       }
     }
-
+    
     @SuppressWarnings("rawtypes")
-    private void printRepeatedFieldValue(FieldDescriptor field, Object value) throws IOException {
+    private void printRepeatedFieldValue(FieldDescriptor field, Object value)
+        throws IOException {
       generator.print("[");
       boolean printedElement = false;
       for (Object element : (List) value) {
         if (printedElement) {
-          generator.print("," + blankOrSpace);
+          generator.print(", ");
         } else {
           printedElement = true;
         }
@@ -910,16 +750,17 @@
       }
       generator.print("]");
     }
-
+    
     @SuppressWarnings("rawtypes")
-    private void printMapFieldValue(FieldDescriptor field, Object value) throws IOException {
+    private void printMapFieldValue(FieldDescriptor field, Object value)
+        throws IOException {
       Descriptor type = field.getMessageType();
       FieldDescriptor keyField = type.findFieldByName("key");
       FieldDescriptor valueField = type.findFieldByName("value");
       if (keyField == null || valueField == null) {
         throw new InvalidProtocolBufferException("Invalid map field.");
       }
-      generator.print("{" + blankOrNewLine);
+      generator.print("{\n");
       generator.indent();
       boolean printedElement = false;
       for (Object element : (List) value) {
@@ -927,35 +768,36 @@
         Object entryKey = entry.getField(keyField);
         Object entryValue = entry.getField(valueField);
         if (printedElement) {
-          generator.print("," + blankOrNewLine);
+          generator.print(",\n");
         } else {
           printedElement = true;
         }
         // Key fields are always double-quoted.
         printSingleFieldValue(keyField, entryKey, true);
-        generator.print(":" + blankOrSpace);
+        generator.print(": ");
         printSingleFieldValue(valueField, entryValue);
       }
       if (printedElement) {
-        generator.print(blankOrNewLine);
+        generator.print("\n");
       }
       generator.outdent();
       generator.print("}");
     }
-
-    private void printSingleFieldValue(FieldDescriptor field, Object value) throws IOException {
+    
+    private void printSingleFieldValue(FieldDescriptor field, Object value)
+        throws IOException {
       printSingleFieldValue(field, value, false);
     }
 
     /**
      * Prints a field's value in JSON format.
-     *
+     * 
      * @param alwaysWithQuotes whether to always add double-quotes to primitive
      *        types.
      */
     private void printSingleFieldValue(
-        final FieldDescriptor field, final Object value, boolean alwaysWithQuotes)
-        throws IOException {
+        final FieldDescriptor field, final Object value,
+        boolean alwaysWithQuotes) throws IOException {
       switch (field.getType()) {
         case INT32:
         case SINT32:
@@ -1009,7 +851,7 @@
             }
           }
           break;
-
+          
         case DOUBLE:
           Double doubleValue = (Double) value;
           if (doubleValue.isNaN()) {
@@ -1053,13 +895,15 @@
 
         case BYTES:
           generator.print("\"");
-          generator.print(BaseEncoding.base64().encode(((ByteString) value).toByteArray()));
+          generator.print(
+              BaseEncoding.base64().encode(((ByteString) value).toByteArray()));
           generator.print("\"");
           break;
 
         case ENUM:
           // Special-case google.protobuf.NullValue (it's an Enum).
-          if (field.getEnumType().getFullName().equals("google.protobuf.NullValue")) {
+          if (field.getEnumType().getFullName().equals(
+                  "google.protobuf.NullValue")) {
             // No matter what value it contains, we always print it as "null".
             if (alwaysWithQuotes) {
               generator.print("\"");
@@ -1070,9 +914,11 @@
             }
           } else {
             if (((EnumValueDescriptor) value).getIndex() == -1) {
-              generator.print(String.valueOf(((EnumValueDescriptor) value).getNumber()));
+              generator.print(
+                  String.valueOf(((EnumValueDescriptor) value).getNumber()));
             } else {
-              generator.print("\"" + ((EnumValueDescriptor) value).getName() + "\"");
+              generator.print(
+                  "\"" + ((EnumValueDescriptor) value).getName() + "\"");
             }
           }
           break;
@@ -1101,54 +947,40 @@
     } else {
       // Pull off the most-significant bit so that BigInteger doesn't think
       // the number is negative, then set it again using setBit().
-      return BigInteger.valueOf(value & Long.MAX_VALUE).setBit(Long.SIZE - 1).toString();
+      return BigInteger.valueOf(value & Long.MAX_VALUE)
+                       .setBit(Long.SIZE - 1).toString();
     }
   }
+  
 
-  private static String getTypeName(String typeUrl) throws InvalidProtocolBufferException {
+  private static String getTypeName(String typeUrl)
+      throws InvalidProtocolBufferException {
     String[] parts = typeUrl.split("/");
     if (parts.length == 1) {
-      throw new InvalidProtocolBufferException("Invalid type url found: " + typeUrl);
+      throw new InvalidProtocolBufferException(
+          "Invalid type url found: " + typeUrl);
     }
     return parts[parts.length - 1];
   }
-
+  
   private static class ParserImpl {
     private final TypeRegistry registry;
     private final JsonParser jsonParser;
-    private final boolean ignoringUnknownFields;
-    private final int recursionLimit;
-    private int currentDepth;
-
-    ParserImpl(TypeRegistry registry, boolean ignoreUnknownFields, int recursionLimit) {
+    
+    ParserImpl(TypeRegistry registry) {
       this.registry = registry;
-      this.ignoringUnknownFields = ignoreUnknownFields;
       this.jsonParser = new JsonParser();
-      this.recursionLimit = recursionLimit;
-      this.currentDepth = 0;
     }
-
-    void merge(Reader json, Message.Builder builder) throws IOException {
-      try {
-        JsonReader reader = new JsonReader(json);
-        reader.setLenient(false);
-        merge(jsonParser.parse(reader), builder);
-      } catch (InvalidProtocolBufferException e) {
-        throw e;
-      } catch (JsonIOException e) {
-        // Unwrap IOException.
-        if (e.getCause() instanceof IOException) {
-          throw (IOException) e.getCause();
-        } else {
-          throw new InvalidProtocolBufferException(e.getMessage());
-        }
-      } catch (Exception e) {
-        // We convert all exceptions from JSON parsing to our own exceptions.
-        throw new InvalidProtocolBufferException(e.getMessage());
-      }
+    
+    void merge(Reader json, Message.Builder builder)
+        throws IOException {
+      JsonReader reader = new JsonReader(json);
+      reader.setLenient(false);
+      merge(jsonParser.parse(reader), builder);
     }
-
-    void merge(String json, Message.Builder builder) throws InvalidProtocolBufferException {
+    
+    void merge(String json, Message.Builder builder)
+        throws InvalidProtocolBufferException {
       try {
         JsonReader reader = new JsonReader(new StringReader(json));
         reader.setLenient(false);
@@ -1160,36 +992,35 @@
         throw new InvalidProtocolBufferException(e.getMessage());
       }
     }
-
+    
     private interface WellKnownTypeParser {
       void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
           throws InvalidProtocolBufferException;
     }
-
+    
     private static final Map<String, WellKnownTypeParser> wellKnownTypeParsers =
         buildWellKnownTypeParsers();
-
-    private static Map<String, WellKnownTypeParser> buildWellKnownTypeParsers() {
-      Map<String, WellKnownTypeParser> parsers = new HashMap<String, WellKnownTypeParser>();
+    
+    private static Map<String, WellKnownTypeParser>
+    buildWellKnownTypeParsers() {
+      Map<String, WellKnownTypeParser> parsers =
+          new HashMap<String, WellKnownTypeParser>();
       // Special-case Any.
-      parsers.put(
-          Any.getDescriptor().getFullName(),
-          new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeAny(json, builder);
-            }
-          });
+      parsers.put(Any.getDescriptor().getFullName(), new WellKnownTypeParser() {
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeAny(json, builder);
+        }
+      });
       // Special-case wrapper types.
-      WellKnownTypeParser wrappersPrinter =
-          new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeWrapper(json, builder);
-            }
-          };
+      WellKnownTypeParser wrappersPrinter = new WellKnownTypeParser() {
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeWrapper(json, builder);
+        }
+      };
       parsers.put(BoolValue.getDescriptor().getFullName(), wrappersPrinter);
       parsers.put(Int32Value.getDescriptor().getFullName(), wrappersPrinter);
       parsers.put(UInt32Value.getDescriptor().getFullName(), wrappersPrinter);
@@ -1200,86 +1031,82 @@
       parsers.put(FloatValue.getDescriptor().getFullName(), wrappersPrinter);
       parsers.put(DoubleValue.getDescriptor().getFullName(), wrappersPrinter);
       // Special-case Timestamp.
-      parsers.put(
-          Timestamp.getDescriptor().getFullName(),
+      parsers.put(Timestamp.getDescriptor().getFullName(),
           new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeTimestamp(json, builder);
-            }
-          });
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeTimestamp(json, builder);
+        }
+      });
       // Special-case Duration.
-      parsers.put(
-          Duration.getDescriptor().getFullName(),
+      parsers.put(Duration.getDescriptor().getFullName(),
           new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeDuration(json, builder);
-            }
-          });
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeDuration(json, builder);
+        }
+      });
       // Special-case FieldMask.
-      parsers.put(
-          FieldMask.getDescriptor().getFullName(),
+      parsers.put(FieldMask.getDescriptor().getFullName(),
           new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeFieldMask(json, builder);
-            }
-          });
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeFieldMask(json, builder);
+        }
+      });
       // Special-case Struct.
-      parsers.put(
-          Struct.getDescriptor().getFullName(),
+      parsers.put(Struct.getDescriptor().getFullName(),
           new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeStruct(json, builder);
-            }
-          });
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeStruct(json, builder);
+        }
+      });
       // Special-case ListValue.
-      parsers.put(
-          ListValue.getDescriptor().getFullName(),
+      parsers.put(ListValue.getDescriptor().getFullName(),
           new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeListValue(json, builder);
-            }
-          });
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeListValue(json, builder);
+        }
+      });
       // Special-case Value.
-      parsers.put(
-          Value.getDescriptor().getFullName(),
+      parsers.put(Value.getDescriptor().getFullName(),
           new WellKnownTypeParser() {
-            @Override
-            public void merge(ParserImpl parser, JsonElement json, Message.Builder builder)
-                throws InvalidProtocolBufferException {
-              parser.mergeValue(json, builder);
-            }
-          });
+        @Override
+        public void merge(ParserImpl parser, JsonElement json,
+            Message.Builder builder) throws InvalidProtocolBufferException {
+          parser.mergeValue(json, builder);
+        }
+      });
       return parsers;
     }
-
+    
     private void merge(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
-      WellKnownTypeParser specialParser =
-          wellKnownTypeParsers.get(builder.getDescriptorForType().getFullName());
+      WellKnownTypeParser specialParser = wellKnownTypeParsers.get(
+          builder.getDescriptorForType().getFullName());
       if (specialParser != null) {
         specialParser.merge(this, json, builder);
         return;
       }
       mergeMessage(json, builder, false);
     }
-
+    
     // Maps from camel-case field names to FieldDescriptor.
     private final Map<Descriptor, Map<String, FieldDescriptor>> fieldNameMaps =
         new HashMap<Descriptor, Map<String, FieldDescriptor>>();
-
-    private Map<String, FieldDescriptor> getFieldNameMap(Descriptor descriptor) {
+    
+    private Map<String, FieldDescriptor> getFieldNameMap(
+        Descriptor descriptor) {
       if (!fieldNameMaps.containsKey(descriptor)) {
-        Map<String, FieldDescriptor> fieldNameMap = new HashMap<String, FieldDescriptor>();
+        Map<String, FieldDescriptor> fieldNameMap =
+            new HashMap<String, FieldDescriptor>();
         for (FieldDescriptor field : descriptor.getFields()) {
           fieldNameMap.put(field.getName(), field);
           fieldNameMap.put(field.getJsonName(), field);
@@ -1289,67 +1116,64 @@
       }
       return fieldNameMaps.get(descriptor);
     }
-
-    private void mergeMessage(JsonElement json, Message.Builder builder, boolean skipTypeUrl)
-        throws InvalidProtocolBufferException {
+    
+    private void mergeMessage(JsonElement json, Message.Builder builder,
+        boolean skipTypeUrl) throws InvalidProtocolBufferException {
       if (!(json instanceof JsonObject)) {
-        throw new InvalidProtocolBufferException("Expect message object but got: " + json);
+        throw new InvalidProtocolBufferException(
+            "Expect message object but got: " + json);
       }
       JsonObject object = (JsonObject) json;
-      Map<String, FieldDescriptor> fieldNameMap = getFieldNameMap(builder.getDescriptorForType());
+      Map<String, FieldDescriptor> fieldNameMap =
+          getFieldNameMap(builder.getDescriptorForType());
       for (Map.Entry<String, JsonElement> entry : object.entrySet()) {
         if (skipTypeUrl && entry.getKey().equals("@type")) {
           continue;
         }
         FieldDescriptor field = fieldNameMap.get(entry.getKey());
         if (field == null) {
-          if (ignoringUnknownFields) {
-            continue;
-          }
           throw new InvalidProtocolBufferException(
-              "Cannot find field: "
-                  + entry.getKey()
-                  + " in message "
-                  + builder.getDescriptorForType().getFullName());
+              "Cannot find field: " + entry.getKey() + " in message "
+              + builder.getDescriptorForType().getFullName());
         }
         mergeField(field, entry.getValue(), builder);
       }
     }
-
+    
     private void mergeAny(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
       Descriptor descriptor = builder.getDescriptorForType();
       FieldDescriptor typeUrlField = descriptor.findFieldByName("type_url");
       FieldDescriptor valueField = descriptor.findFieldByName("value");
       // Validates type of the message. Note that we can't just cast the message
-      // to com.google.protobuf.Any because it might be a DynamicMessage.
-      if (typeUrlField == null
-          || valueField == null
+      // to com.google.protobuf.Any because it might be a DynamicMessage. 
+      if (typeUrlField == null || valueField == null
           || typeUrlField.getType() != FieldDescriptor.Type.STRING
           || valueField.getType() != FieldDescriptor.Type.BYTES) {
         throw new InvalidProtocolBufferException("Invalid Any type.");
       }
-
+      
       if (!(json instanceof JsonObject)) {
-        throw new InvalidProtocolBufferException("Expect message object but got: " + json);
+        throw new InvalidProtocolBufferException(
+            "Expect message object but got: " + json);
       }
       JsonObject object = (JsonObject) json;
-      if (object.entrySet().isEmpty()) {
-        return; // builder never modified, so it will end up building the default instance of Any
-      }
       JsonElement typeUrlElement = object.get("@type");
       if (typeUrlElement == null) {
-        throw new InvalidProtocolBufferException("Missing type url when parsing: " + json);
+        throw new InvalidProtocolBufferException(
+            "Missing type url when parsing: " + json);
       }
       String typeUrl = typeUrlElement.getAsString();
       Descriptor contentType = registry.find(getTypeName(typeUrl));
       if (contentType == null) {
-        throw new InvalidProtocolBufferException("Cannot resolve type: " + typeUrl);
+        throw new InvalidProtocolBufferException(
+            "Cannot resolve type: " + typeUrl);
       }
       builder.setField(typeUrlField, typeUrl);
       Message.Builder contentBuilder =
           DynamicMessage.getDefaultInstance(contentType).newBuilderForType();
-      WellKnownTypeParser specialParser = wellKnownTypeParsers.get(contentType.getFullName());
+      WellKnownTypeParser specialParser =
+          wellKnownTypeParsers.get(contentType.getFullName());
       if (specialParser != null) {
         JsonElement value = object.get("value");
         if (value != null) {
@@ -1360,33 +1184,35 @@
       }
       builder.setField(valueField, contentBuilder.build().toByteString());
     }
-
+    
     private void mergeFieldMask(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
-      FieldMask value = FieldMaskUtil.fromJsonString(json.getAsString());
+      FieldMask value = FieldMaskUtil.fromString(json.getAsString());
       builder.mergeFrom(value.toByteString());
     }
-
+    
     private void mergeTimestamp(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
       try {
-        Timestamp value = Timestamps.parse(json.getAsString());
+        Timestamp value = TimeUtil.parseTimestamp(json.getAsString());
         builder.mergeFrom(value.toByteString());
       } catch (ParseException e) {
-        throw new InvalidProtocolBufferException("Failed to parse timestamp: " + json);
+        throw new InvalidProtocolBufferException(
+            "Failed to parse timestamp: " + json);
       }
     }
-
+    
     private void mergeDuration(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
       try {
-        Duration value = Durations.parse(json.getAsString());
+        Duration value = TimeUtil.parseDuration(json.getAsString());
         builder.mergeFrom(value.toByteString());
       } catch (ParseException e) {
-        throw new InvalidProtocolBufferException("Failed to parse duration: " + json);
+        throw new InvalidProtocolBufferException(
+            "Failed to parse duration: " + json);
       }
     }
-
+    
     private void mergeStruct(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
       Descriptor descriptor = builder.getDescriptorForType();
@@ -1406,18 +1232,21 @@
       }
       mergeRepeatedField(field, json, builder);
     }
-
+    
     private void mergeValue(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
       Descriptor type = builder.getDescriptorForType();
       if (json instanceof JsonPrimitive) {
         JsonPrimitive primitive = (JsonPrimitive) json;
         if (primitive.isBoolean()) {
-          builder.setField(type.findFieldByName("bool_value"), primitive.getAsBoolean());
+          builder.setField(type.findFieldByName("bool_value"),
+              primitive.getAsBoolean());
         } else if (primitive.isNumber()) {
-          builder.setField(type.findFieldByName("number_value"), primitive.getAsDouble());
+          builder.setField(type.findFieldByName("number_value"),
+              primitive.getAsDouble());
         } else {
-          builder.setField(type.findFieldByName("string_value"), primitive.getAsString());
+          builder.setField(type.findFieldByName("string_value"),
+              primitive.getAsString());
         }
       } else if (json instanceof JsonObject) {
         FieldDescriptor field = type.findFieldByName("struct_value");
@@ -1429,26 +1258,24 @@
         Message.Builder listBuilder = builder.newBuilderForField(field);
         merge(json, listBuilder);
         builder.setField(field, listBuilder.build());
-      } else if (json instanceof JsonNull) {
-        builder.setField(
-            type.findFieldByName("null_value"), NullValue.NULL_VALUE.getValueDescriptor());
       } else {
         throw new IllegalStateException("Unexpected json data: " + json);
       }
     }
-
+    
     private void mergeWrapper(JsonElement json, Message.Builder builder)
         throws InvalidProtocolBufferException {
       Descriptor type = builder.getDescriptorForType();
       FieldDescriptor field = type.findFieldByName("value");
       if (field == null) {
-        throw new InvalidProtocolBufferException("Invalid wrapper type: " + type.getFullName());
+        throw new InvalidProtocolBufferException(
+            "Invalid wrapper type: " + type.getFullName());
       }
       builder.setField(field, parseFieldValue(field, json, builder));
     }
-
-    private void mergeField(FieldDescriptor field, JsonElement json, Message.Builder builder)
-        throws InvalidProtocolBufferException {
+    
+    private void mergeField(FieldDescriptor field, JsonElement json,
+        Message.Builder builder) throws InvalidProtocolBufferException {
       if (field.isRepeated()) {
         if (builder.getRepeatedFieldCount(field) > 0) {
           throw new InvalidProtocolBufferException(
@@ -1463,11 +1290,8 @@
             && builder.getOneofFieldDescriptor(field.getContainingOneof()) != null) {
           FieldDescriptor other = builder.getOneofFieldDescriptor(field.getContainingOneof());
           throw new InvalidProtocolBufferException(
-              "Cannot set field "
-                  + field.getFullName()
-                  + " because another field "
-                  + other.getFullName()
-                  + " belonging to the same oneof has already been set ");
+              "Cannot set field " + field.getFullName() + " because another field "
+              + other.getFullName() + " belonging to the same oneof has already been set ");
         }
       }
       if (field.isRepeated() && json instanceof JsonNull) {
@@ -1486,50 +1310,97 @@
         }
       }
     }
-
-    private void mergeMapField(FieldDescriptor field, JsonElement json, Message.Builder builder)
-        throws InvalidProtocolBufferException {
+    
+    private void mergeMapField(FieldDescriptor field, JsonElement json,
+        Message.Builder builder) throws InvalidProtocolBufferException {
       if (!(json instanceof JsonObject)) {
-        throw new InvalidProtocolBufferException("Expect a map object but found: " + json);
+        throw new InvalidProtocolBufferException(
+            "Expect a map object but found: " + json);
       }
       Descriptor type = field.getMessageType();
       FieldDescriptor keyField = type.findFieldByName("key");
       FieldDescriptor valueField = type.findFieldByName("value");
       if (keyField == null || valueField == null) {
-        throw new InvalidProtocolBufferException("Invalid map field: " + field.getFullName());
+        throw new InvalidProtocolBufferException(
+            "Invalid map field: " + field.getFullName());
       }
       JsonObject object = (JsonObject) json;
       for (Map.Entry<String, JsonElement> entry : object.entrySet()) {
         Message.Builder entryBuilder = builder.newBuilderForField(field);
-        Object key = parseFieldValue(keyField, new JsonPrimitive(entry.getKey()), entryBuilder);
-        Object value = parseFieldValue(valueField, entry.getValue(), entryBuilder);
+        Object key = parseFieldValue(
+            keyField, new JsonPrimitive(entry.getKey()), entryBuilder);
+        Object value = parseFieldValue(
+            valueField, entry.getValue(), entryBuilder);
         if (value == null) {
-          throw new InvalidProtocolBufferException("Map value cannot be null.");
+          throw new InvalidProtocolBufferException(
+              "Map value cannot be null.");
         }
         entryBuilder.setField(keyField, key);
         entryBuilder.setField(valueField, value);
         builder.addRepeatedField(field, entryBuilder.build());
       }
     }
-
-    private void mergeRepeatedField(
-        FieldDescriptor field, JsonElement json, Message.Builder builder)
-        throws InvalidProtocolBufferException {
+    
+    /**
+     * Gets the default value for a field type. Note that we use proto3
+     * language defaults and ignore any default values set through the
+     * proto "default" option. 
+     */
+    private Object getDefaultValue(FieldDescriptor field,
+        Message.Builder builder) {
+      switch (field.getType()) {
+        case INT32:
+        case SINT32:
+        case SFIXED32:
+        case UINT32:
+        case FIXED32:
+          return 0;
+        case INT64:
+        case SINT64:
+        case SFIXED64:
+        case UINT64:
+        case FIXED64:
+          return 0L;
+        case FLOAT:
+          return 0.0f;
+        case DOUBLE:
+          return 0.0;
+        case BOOL:
+          return false;
+        case STRING:
+          return "";
+        case BYTES:
+          return ByteString.EMPTY;
+        case ENUM:
+          return field.getEnumType().getValues().get(0);
+        case MESSAGE:
+        case GROUP:
+          return builder.newBuilderForField(field).getDefaultInstanceForType();
+        default:
+          throw new IllegalStateException(
+              "Invalid field type: " + field.getType());
+      }
+    }
+    
+    private void mergeRepeatedField(FieldDescriptor field, JsonElement json,
+        Message.Builder builder) throws InvalidProtocolBufferException {
       if (!(json instanceof JsonArray)) {
-        throw new InvalidProtocolBufferException("Expect an array but found: " + json);
+        throw new InvalidProtocolBufferException(
+            "Expect an array but found: " + json);
       }
       JsonArray array = (JsonArray) json;
       for (int i = 0; i < array.size(); ++i) {
         Object value = parseFieldValue(field, array.get(i), builder);
         if (value == null) {
           throw new InvalidProtocolBufferException(
-              "Repeated field elements cannot be null in field: " + field.getFullName());
+              "Repeated field elements cannot be null");
         }
         builder.addRepeatedField(field, value);
       }
     }
-
-    private int parseInt32(JsonElement json) throws InvalidProtocolBufferException {
+    
+    private int parseInt32(JsonElement json)
+        throws InvalidProtocolBufferException {
       try {
         return Integer.parseInt(json.getAsString());
       } catch (Exception e) {
@@ -1545,8 +1416,9 @@
         throw new InvalidProtocolBufferException("Not an int32 value: " + json);
       }
     }
-
-    private long parseInt64(JsonElement json) throws InvalidProtocolBufferException {
+    
+    private long parseInt64(JsonElement json)
+        throws InvalidProtocolBufferException {
       try {
         return Long.parseLong(json.getAsString());
       } catch (Exception e) {
@@ -1559,15 +1431,17 @@
         BigDecimal value = new BigDecimal(json.getAsString());
         return value.longValueExact();
       } catch (Exception e) {
-        throw new InvalidProtocolBufferException("Not an int64 value: " + json);
+        throw new InvalidProtocolBufferException("Not an int32 value: " + json);
       }
     }
-
-    private int parseUint32(JsonElement json) throws InvalidProtocolBufferException {
+    
+    private int parseUint32(JsonElement json)
+        throws InvalidProtocolBufferException {
       try {
         long result = Long.parseLong(json.getAsString());
         if (result < 0 || result > 0xFFFFFFFFL) {
-          throw new InvalidProtocolBufferException("Out of range uint32 value: " + json);
+          throw new InvalidProtocolBufferException(
+              "Out of range uint32 value: " + json);
         }
         return (int) result;
       } catch (InvalidProtocolBufferException e) {
@@ -1588,28 +1462,35 @@
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (Exception e) {
-        throw new InvalidProtocolBufferException("Not an uint32 value: " + json);
+        throw new InvalidProtocolBufferException(
+            "Not an uint32 value: " + json);
       }
     }
-
-    private static final BigInteger MAX_UINT64 = new BigInteger("FFFFFFFFFFFFFFFF", 16);
-
-    private long parseUint64(JsonElement json) throws InvalidProtocolBufferException {
+    
+    private static final BigInteger MAX_UINT64 =
+        new BigInteger("FFFFFFFFFFFFFFFF", 16);
+    
+    private long parseUint64(JsonElement json)
+        throws InvalidProtocolBufferException {
       try {
         BigDecimal decimalValue = new BigDecimal(json.getAsString());
         BigInteger value = decimalValue.toBigIntegerExact();
-        if (value.compareTo(BigInteger.ZERO) < 0 || value.compareTo(MAX_UINT64) > 0) {
-          throw new InvalidProtocolBufferException("Out of range uint64 value: " + json);
+        if (value.compareTo(BigInteger.ZERO) < 0
+            || value.compareTo(MAX_UINT64) > 0) {
+          throw new InvalidProtocolBufferException(
+              "Out of range uint64 value: " + json);
         }
         return value.longValue();
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (Exception e) {
-        throw new InvalidProtocolBufferException("Not an uint64 value: " + json);
+        throw new InvalidProtocolBufferException(
+            "Not an uint64 value: " + json);
       }
     }
-
-    private boolean parseBool(JsonElement json) throws InvalidProtocolBufferException {
+    
+    private boolean parseBool(JsonElement json)
+        throws InvalidProtocolBufferException {
       if (json.getAsString().equals("true")) {
         return true;
       }
@@ -1618,10 +1499,11 @@
       }
       throw new InvalidProtocolBufferException("Invalid bool value: " + json);
     }
-
+    
     private static final double EPSILON = 1e-6;
-
-    private float parseFloat(JsonElement json) throws InvalidProtocolBufferException {
+    
+    private float parseFloat(JsonElement json)
+        throws InvalidProtocolBufferException {
       if (json.getAsString().equals("NaN")) {
         return Float.NaN;
       } else if (json.getAsString().equals("Infinity")) {
@@ -1639,7 +1521,8 @@
         // of tolerance when checking whether the float value is in range.
         if (value > Float.MAX_VALUE * (1.0 + EPSILON)
             || value < -Float.MAX_VALUE * (1.0 + EPSILON)) {
-          throw new InvalidProtocolBufferException("Out of range float value: " + json);
+          throw new InvalidProtocolBufferException(
+              "Out of range float value: " + json);
         }
         return (float) value;
       } catch (InvalidProtocolBufferException e) {
@@ -1648,17 +1531,19 @@
         throw new InvalidProtocolBufferException("Not a float value: " + json);
       }
     }
-
-    private static final BigDecimal MORE_THAN_ONE = new BigDecimal(String.valueOf(1.0 + EPSILON));
+    
+    private static final BigDecimal MORE_THAN_ONE = new BigDecimal(
+        String.valueOf(1.0 + EPSILON));
     // When a float value is printed, the printed value might be a little
     // larger or smaller due to precision loss. Here we need to add a bit
     // of tolerance when checking whether the float value is in range.
-    private static final BigDecimal MAX_DOUBLE =
-        new BigDecimal(String.valueOf(Double.MAX_VALUE)).multiply(MORE_THAN_ONE);
-    private static final BigDecimal MIN_DOUBLE =
-        new BigDecimal(String.valueOf(-Double.MAX_VALUE)).multiply(MORE_THAN_ONE);
-
-    private double parseDouble(JsonElement json) throws InvalidProtocolBufferException {
+    private static final BigDecimal MAX_DOUBLE = new BigDecimal(
+        String.valueOf(Double.MAX_VALUE)).multiply(MORE_THAN_ONE);
+    private static final BigDecimal MIN_DOUBLE = new BigDecimal(
+        String.valueOf(-Double.MAX_VALUE)).multiply(MORE_THAN_ONE);
+    
+    private double parseDouble(JsonElement json)
+        throws InvalidProtocolBufferException {
       if (json.getAsString().equals("NaN")) {
         return Double.NaN;
       } else if (json.getAsString().equals("Infinity")) {
@@ -1671,31 +1556,36 @@
         // accepts all values. Here we parse the value into a BigDecimal and do
         // explicit range check on it.
         BigDecimal value = new BigDecimal(json.getAsString());
-        if (value.compareTo(MAX_DOUBLE) > 0 || value.compareTo(MIN_DOUBLE) < 0) {
-          throw new InvalidProtocolBufferException("Out of range double value: " + json);
+        if (value.compareTo(MAX_DOUBLE) > 0
+            || value.compareTo(MIN_DOUBLE) < 0) {
+          throw new InvalidProtocolBufferException(
+              "Out of range double value: " + json);
         }
         return value.doubleValue();
       } catch (InvalidProtocolBufferException e) {
         throw e;
       } catch (Exception e) {
-        throw new InvalidProtocolBufferException("Not an double value: " + json);
+        throw new InvalidProtocolBufferException(
+            "Not an double value: " + json);
       }
     }
-
+    
     private String parseString(JsonElement json) {
       return json.getAsString();
     }
-
+    
     private ByteString parseBytes(JsonElement json) throws InvalidProtocolBufferException {
-      try {
-        return ByteString.copyFrom(BaseEncoding.base64().decode(json.getAsString()));
-      } catch (IllegalArgumentException e) {
-        return ByteString.copyFrom(BaseEncoding.base64Url().decode(json.getAsString()));
+      String encoded = json.getAsString();
+      if (encoded.length() % 4 != 0) {
+        throw new InvalidProtocolBufferException(
+            "Bytes field is not encoded in standard BASE64 with paddings: " + encoded);
       }
+      return ByteString.copyFrom(
+          BaseEncoding.base64().decode(json.getAsString()));
     }
-
-    private EnumValueDescriptor parseEnum(EnumDescriptor enumDescriptor, JsonElement json)
-        throws InvalidProtocolBufferException {
+    
+    private EnumValueDescriptor parseEnum(EnumDescriptor enumDescriptor,
+        JsonElement json) throws InvalidProtocolBufferException {
       String value = json.getAsString();
       EnumValueDescriptor result = enumDescriptor.findValueByName(value);
       if (result == null) {
@@ -1712,28 +1602,27 @@
           // that's not the exception we want the user to see. Since result == null, we will throw
           // an exception later.
         }
-
+        
         if (result == null) {
           throw new InvalidProtocolBufferException(
-              "Invalid enum value: " + value + " for enum type: " + enumDescriptor.getFullName());
+              "Invalid enum value: " + value + " for enum type: "
+              + enumDescriptor.getFullName());
         }
       }
       return result;
     }
-
-    private Object parseFieldValue(FieldDescriptor field, JsonElement json, Message.Builder builder)
-        throws InvalidProtocolBufferException {
+    
+    private Object parseFieldValue(FieldDescriptor field, JsonElement json,
+        Message.Builder builder) throws InvalidProtocolBufferException {
       if (json instanceof JsonNull) {
         if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE
-            && field.getMessageType().getFullName().equals(Value.getDescriptor().getFullName())) {
+            && field.getMessageType().getFullName().equals(
+                   Value.getDescriptor().getFullName())) {
           // For every other type, "null" means absence, but for the special
           // Value message, it means the "null_value" field has been set.
           Value value = Value.newBuilder().setNullValueValue(0).build();
-          return builder.newBuilderForField(field).mergeFrom(value.toByteString()).build();
-        } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM
-            && field.getEnumType().getFullName().equals(NullValue.getDescriptor().getFullName())) {
-          // If the type of the field is a NullValue, then the value should be explicitly set.
-          return field.getEnumType().findValueByNumber(0);
+          return builder.newBuilderForField(field).mergeFrom(
+              value.toByteString()).build();
         }
         return null;
       }
@@ -1753,7 +1642,7 @@
 
         case FLOAT:
           return parseFloat(json);
-
+          
         case DOUBLE:
           return parseDouble(json);
 
@@ -1776,18 +1665,14 @@
 
         case MESSAGE:
         case GROUP:
-          if (currentDepth >= recursionLimit) {
-            throw new InvalidProtocolBufferException("Hit recursion limit.");
-          }
-          ++currentDepth;
           Message.Builder subBuilder = builder.newBuilderForField(field);
           merge(json, subBuilder);
-          --currentDepth;
           return subBuilder.build();
-
+          
         default:
-          throw new InvalidProtocolBufferException("Invalid field type: " + field.getType());
-      }
+          throw new InvalidProtocolBufferException(
+              "Invalid field type: " + field.getType());
+      } 
     }
   }
 }
diff --git a/java/util/src/main/java/com/google/protobuf/util/TimeUtil.java b/java/util/src/main/java/com/google/protobuf/util/TimeUtil.java
index 0475847..3033182 100644
--- a/java/util/src/main/java/com/google/protobuf/util/TimeUtil.java
+++ b/java/util/src/main/java/com/google/protobuf/util/TimeUtil.java
@@ -35,14 +35,15 @@
 
 import java.math.BigInteger;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
 
 /**
  * Utilities to help create/manipulate Timestamp/Duration
- *
- * @deprecated Use {@link Durations} and {@link Timestamps} instead.
  */
-@Deprecated
-public final class TimeUtil {
+public class TimeUtil {
   // Timestamp for "0001-01-01T00:00:00Z"
   public static final long TIMESTAMP_SECONDS_MIN = -62135596800L;
 
@@ -52,6 +53,28 @@
   public static final long DURATION_SECONDS_MAX = 315576000000L;
 
   private static final long NANOS_PER_SECOND = 1000000000;
+  private static final long NANOS_PER_MILLISECOND = 1000000;
+  private static final long NANOS_PER_MICROSECOND = 1000;
+  private static final long MILLIS_PER_SECOND = 1000;
+  private static final long MICROS_PER_SECOND = 1000000;
+
+  private static final ThreadLocal<SimpleDateFormat> timestampFormat =
+      new ThreadLocal<SimpleDateFormat>() {
+        protected SimpleDateFormat initialValue() {
+          return createTimestampFormat();
+        }
+      };
+
+  private static SimpleDateFormat createTimestampFormat() {
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+    GregorianCalendar calendar =
+      new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+    // We use Proleptic Gregorian Calendar (i.e., Gregorian calendar extends
+    // backwards to year one) for timestamp formating.
+    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
+    sdf.setCalendar(calendar);
+    return sdf;
+  }
 
   private TimeUtil() {}
 
@@ -67,11 +90,27 @@
    * @return The string representation of the given timestamp.
    * @throws IllegalArgumentException if the given timestamp is not in the
    *         valid range.
-   * @deprecated Use {@link Timestamps#toString} instead.
    */
-  @Deprecated
-  public static String toString(Timestamp timestamp) {
-    return Timestamps.toString(timestamp);
+  public static String toString(Timestamp timestamp)
+    throws IllegalArgumentException {
+    StringBuilder result = new StringBuilder();
+    // Format the seconds part.
+    if (timestamp.getSeconds() < TIMESTAMP_SECONDS_MIN
+        || timestamp.getSeconds() > TIMESTAMP_SECONDS_MAX) {
+      throw new IllegalArgumentException("Timestamp is out of range.");
+    }
+    Date date = new Date(timestamp.getSeconds() * MILLIS_PER_SECOND);
+    result.append(timestampFormat.get().format(date));
+    // Format the nanos part.
+    if (timestamp.getNanos() < 0 || timestamp.getNanos() >= NANOS_PER_SECOND) {
+      throw new IllegalArgumentException("Timestamp has invalid nanos value.");
+    }
+    if (timestamp.getNanos() != 0) {
+      result.append(".");
+      result.append(formatNanos(timestamp.getNanos()));
+    }
+    result.append("Z");
+    return result.toString();
   }
 
   /**
@@ -84,11 +123,59 @@
    *
    * @return A Timestamp parsed from the string.
    * @throws ParseException if parsing fails.
-   * @deprecated Use {@link Timestamps#parse} instead.
    */
-  @Deprecated
+
   public static Timestamp parseTimestamp(String value) throws ParseException {
-    return Timestamps.parse(value);
+    int dayOffset = value.indexOf('T');
+    if (dayOffset == -1) {
+      throw new ParseException(
+        "Failed to parse timestamp: invalid timestamp \"" + value + "\"", 0);
+    }
+    int timezoneOffsetPosition = value.indexOf('Z', dayOffset);
+    if (timezoneOffsetPosition == -1) {
+      timezoneOffsetPosition = value.indexOf('+', dayOffset);
+    }
+    if (timezoneOffsetPosition == -1) {
+      timezoneOffsetPosition = value.indexOf('-', dayOffset);
+    }
+    if (timezoneOffsetPosition == -1) {
+      throw new ParseException(
+        "Failed to parse timestamp: missing valid timezone offset.", 0);
+    }
+    // Parse seconds and nanos.
+    String timeValue = value.substring(0, timezoneOffsetPosition);
+    String secondValue = timeValue;
+    String nanoValue = "";
+    int pointPosition = timeValue.indexOf('.');
+    if (pointPosition != -1) {
+      secondValue = timeValue.substring(0, pointPosition);
+      nanoValue = timeValue.substring(pointPosition + 1);
+    }
+    Date date = timestampFormat.get().parse(secondValue);
+    long seconds = date.getTime() / MILLIS_PER_SECOND;
+    int nanos = nanoValue.isEmpty() ? 0 : parseNanos(nanoValue);
+    // Parse timezone offsets.
+    if (value.charAt(timezoneOffsetPosition) == 'Z') {
+      if (value.length() != timezoneOffsetPosition + 1) {
+        throw new ParseException(
+          "Failed to parse timestamp: invalid trailing data \""
+          + value.substring(timezoneOffsetPosition) + "\"", 0);
+      }
+    } else {
+      String offsetValue = value.substring(timezoneOffsetPosition + 1);
+      long offset = parseTimezoneOffset(offsetValue);
+      if (value.charAt(timezoneOffsetPosition) == '+') {
+        seconds -= offset;
+      } else {
+        seconds += offset;
+      }
+    }
+    try {
+      return normalizedTimestamp(seconds, nanos);
+    } catch (IllegalArgumentException e) {
+      throw new ParseException(
+        "Failed to parse timestmap: timestamp is out of range.", 0);
+    }
   }
 
   /**
@@ -101,11 +188,33 @@
    * @return The string representation of the given duration.
    * @throws IllegalArgumentException if the given duration is not in the valid
    *         range.
-   * @deprecated Use {@link Durations#toString} instead.
    */
-  @Deprecated
-  public static String toString(Duration duration) {
-    return Durations.toString(duration);
+  public static String toString(Duration duration)
+    throws IllegalArgumentException {
+    if (duration.getSeconds() < DURATION_SECONDS_MIN
+      || duration.getSeconds() > DURATION_SECONDS_MAX) {
+      throw new IllegalArgumentException("Duration is out of valid range.");
+    }
+    StringBuilder result = new StringBuilder();
+    long seconds = duration.getSeconds();
+    int nanos = duration.getNanos();
+    if (seconds < 0 || nanos < 0) {
+      if (seconds > 0 || nanos > 0) {
+        throw new IllegalArgumentException(
+            "Invalid duration: seconds value and nanos value must have the same"
+            + "sign.");
+      }
+      result.append("-");
+      seconds = -seconds;
+      nanos = -nanos;
+    }
+    result.append(seconds);
+    if (nanos != 0) {
+      result.append(".");
+      result.append(formatNanos(nanos));
+    }
+    result.append("s");
+    return result.toString();
   }
 
   /**
@@ -113,31 +222,54 @@
    *
    * @return A Duration parsed from the string.
    * @throws ParseException if parsing fails.
-   * @deprecated Use {@link Durations#parse} instead.
    */
-  @Deprecated
   public static Duration parseDuration(String value) throws ParseException {
-    return Durations.parse(value);
+    // Must ended with "s".
+    if (value.isEmpty() || value.charAt(value.length() - 1) != 's') {
+      throw new ParseException("Invalid duration string: " + value, 0);
+    }
+    boolean negative = false;
+    if (value.charAt(0) == '-') {
+      negative = true;
+      value = value.substring(1);
+    }
+    String secondValue = value.substring(0, value.length() - 1);
+    String nanoValue = "";
+    int pointPosition = secondValue.indexOf('.');
+    if (pointPosition != -1) {
+      nanoValue = secondValue.substring(pointPosition + 1);
+      secondValue = secondValue.substring(0, pointPosition);
+    }
+    long seconds = Long.parseLong(secondValue);
+    int nanos = nanoValue.isEmpty() ? 0 : parseNanos(nanoValue);
+    if (seconds < 0) {
+      throw new ParseException("Invalid duration string: " + value, 0);
+    }
+    if (negative) {
+      seconds = -seconds;
+      nanos = -nanos;
+    }
+    try {
+      return normalizedDuration(seconds, nanos);
+    } catch (IllegalArgumentException e) {
+      throw new ParseException("Duration value is out of range.", 0);
+    }
   }
 
   /**
    * Create a Timestamp from the number of milliseconds elapsed from the epoch.
-   *
-   * @deprecated Use {@link Timestamps#fromMillis} instead.
    */
-  @Deprecated
   public static Timestamp createTimestampFromMillis(long milliseconds) {
-    return Timestamps.fromMillis(milliseconds);
+    return normalizedTimestamp(milliseconds / MILLIS_PER_SECOND,
+      (int) (milliseconds % MILLIS_PER_SECOND * NANOS_PER_MILLISECOND));
   }
 
   /**
    * Create a Duration from the number of milliseconds.
-   *
-   * @deprecated Use {@link Durations#fromMillis} instead.
    */
-  @Deprecated
   public static Duration createDurationFromMillis(long milliseconds) {
-    return Durations.fromMillis(milliseconds);
+    return normalizedDuration(milliseconds / MILLIS_PER_SECOND,
+      (int) (milliseconds % MILLIS_PER_SECOND * NANOS_PER_MILLISECOND));
   }
 
   /**
@@ -146,44 +278,36 @@
    * <p>The result will be rounded down to the nearest millisecond. E.g., if the
    * timestamp represents "1969-12-31T23:59:59.999999999Z", it will be rounded
    * to -1 millisecond.
-   *
-   * @deprecated Use {@link Timestamps#toMillis} instead.
    */
-  @Deprecated
   public static long toMillis(Timestamp timestamp) {
-    return Timestamps.toMillis(timestamp);
+    return timestamp.getSeconds() * MILLIS_PER_SECOND + timestamp.getNanos()
+      / NANOS_PER_MILLISECOND;
   }
 
   /**
    * Convert a Duration to the number of milliseconds.The result will be
    * rounded towards 0 to the nearest millisecond. E.g., if the duration
    * represents -1 nanosecond, it will be rounded to 0.
-   *
-   * @deprecated Use {@link Durations#toMillis} instead.
    */
-  @Deprecated
   public static long toMillis(Duration duration) {
-    return Durations.toMillis(duration);
+    return duration.getSeconds() * MILLIS_PER_SECOND + duration.getNanos()
+      / NANOS_PER_MILLISECOND;
   }
 
   /**
    * Create a Timestamp from the number of microseconds elapsed from the epoch.
-   *
-   * @deprecated Use {@link Timestamps#fromMicros} instead.
    */
-  @Deprecated
   public static Timestamp createTimestampFromMicros(long microseconds) {
-    return Timestamps.fromMicros(microseconds);
+    return normalizedTimestamp(microseconds / MICROS_PER_SECOND,
+      (int) (microseconds % MICROS_PER_SECOND * NANOS_PER_MICROSECOND));
   }
 
   /**
    * Create a Duration from the number of microseconds.
-   *
-   * @deprecated Use {@link Durations#fromMicros} instead.
    */
-  @Deprecated
   public static Duration createDurationFromMicros(long microseconds) {
-    return Durations.fromMicros(microseconds);
+    return normalizedDuration(microseconds / MICROS_PER_SECOND,
+      (int) (microseconds % MICROS_PER_SECOND * NANOS_PER_MICROSECOND));
   }
 
   /**
@@ -192,141 +316,111 @@
    * <p>The result will be rounded down to the nearest microsecond. E.g., if the
    * timestamp represents "1969-12-31T23:59:59.999999999Z", it will be rounded
    * to -1 millisecond.
-   *
-   * @deprecated Use {@link Timestamps#toMicros} instead.
    */
-  @Deprecated
   public static long toMicros(Timestamp timestamp) {
-    return Timestamps.toMicros(timestamp);
+    return timestamp.getSeconds() * MICROS_PER_SECOND + timestamp.getNanos()
+      / NANOS_PER_MICROSECOND;
   }
 
   /**
    * Convert a Duration to the number of microseconds.The result will be
    * rounded towards 0 to the nearest microseconds. E.g., if the duration
    * represents -1 nanosecond, it will be rounded to 0.
-   *
-   * @deprecated Use {@link Durations#toMicros} instead.
    */
-  @Deprecated
   public static long toMicros(Duration duration) {
-    return Durations.toMicros(duration);
+    return duration.getSeconds() * MICROS_PER_SECOND + duration.getNanos()
+      / NANOS_PER_MICROSECOND;
   }
 
   /**
    * Create a Timestamp from the number of nanoseconds elapsed from the epoch.
-   *
-   * @deprecated Use {@link Timestamps#fromNanos} instead.
    */
-  @Deprecated
   public static Timestamp createTimestampFromNanos(long nanoseconds) {
-    return Timestamps.fromNanos(nanoseconds);
+    return normalizedTimestamp(nanoseconds / NANOS_PER_SECOND,
+      (int) (nanoseconds % NANOS_PER_SECOND));
   }
 
   /**
    * Create a Duration from the number of nanoseconds.
-   *
-   * @deprecated Use {@link Durations#fromNanos} instead.
    */
-  @Deprecated
   public static Duration createDurationFromNanos(long nanoseconds) {
-    return Durations.fromNanos(nanoseconds);
+    return normalizedDuration(nanoseconds / NANOS_PER_SECOND,
+      (int) (nanoseconds % NANOS_PER_SECOND));
   }
 
   /**
    * Convert a Timestamp to the number of nanoseconds elapsed from the epoch.
-   *
-   * @deprecated Use {@link Timestamps#toNanos} instead.
    */
-  @Deprecated
   public static long toNanos(Timestamp timestamp) {
-    return Timestamps.toNanos(timestamp);
+    return timestamp.getSeconds() * NANOS_PER_SECOND + timestamp.getNanos();
   }
 
   /**
    * Convert a Duration to the number of nanoseconds.
-   *
-   * @deprecated Use {@link Durations#toNanos} instead.
    */
-  @Deprecated
   public static long toNanos(Duration duration) {
-    return Durations.toNanos(duration);
+    return duration.getSeconds() * NANOS_PER_SECOND + duration.getNanos();
   }
 
   /**
    * Get the current time.
-   *
-   * @deprecated Use {@code Timestamps.fromMillis(System.currentTimeMillis())} instead.
    */
-  @Deprecated
   public static Timestamp getCurrentTime() {
-    return Timestamps.fromMillis(System.currentTimeMillis());
+    return createTimestampFromMillis(System.currentTimeMillis());
   }
 
   /**
    * Get the epoch.
-   *
-   * @deprecated Use {@code Timestamps.fromMillis(0)} instead.
    */
-  @Deprecated
   public static Timestamp getEpoch() {
     return Timestamp.getDefaultInstance();
   }
 
   /**
    * Calculate the difference between two timestamps.
-   *
-   * @deprecated Use {@link Timestamps#between} instead.
    */
-  @Deprecated
   public static Duration distance(Timestamp from, Timestamp to) {
-    return Timestamps.between(from, to);
+    return normalizedDuration(to.getSeconds() - from.getSeconds(),
+      to.getNanos() - from.getNanos());
   }
 
   /**
    * Add a duration to a timestamp.
-   *
-   * @deprecated Use {@link Timestamps#add} instead.
    */
-  @Deprecated
   public static Timestamp add(Timestamp start, Duration length) {
-    return Timestamps.add(start, length);
+    return normalizedTimestamp(start.getSeconds() + length.getSeconds(),
+      start.getNanos() + length.getNanos());
   }
 
   /**
    * Subtract a duration from a timestamp.
-   *
-   * @deprecated Use {@link Timestamps#subtract} instead.
    */
-  @Deprecated
   public static Timestamp subtract(Timestamp start, Duration length) {
-    return Timestamps.subtract(start, length);
+    return normalizedTimestamp(start.getSeconds() - length.getSeconds(),
+      start.getNanos() - length.getNanos());
   }
 
   /**
    * Add two durations.
-   *
-   * @deprecated Use {@link Durations#add} instead.
    */
-  @Deprecated
   public static Duration add(Duration d1, Duration d2) {
-    return Durations.add(d1, d2);
+    return normalizedDuration(d1.getSeconds() + d2.getSeconds(),
+      d1.getNanos() + d2.getNanos());
   }
 
   /**
    * Subtract a duration from another.
-   *
-   * @deprecated Use {@link Durations#subtract} instead.
    */
-  @Deprecated
   public static Duration subtract(Duration d1, Duration d2) {
-    return Durations.subtract(d1, d2);
+    return normalizedDuration(d1.getSeconds() - d2.getSeconds(),
+      d1.getNanos() - d2.getNanos());
   }
 
   // Multiplications and divisions.
 
-  // TODO(kak): Delete this.
   public static Duration multiply(Duration duration, double times) {
-    double result = duration.getSeconds() * times + duration.getNanos() * times / 1000000000.0;
+    double result = duration.getSeconds() * times + duration.getNanos() * times
+      / 1000000000.0;
     if (result < Long.MIN_VALUE || result > Long.MAX_VALUE) {
       throw new IllegalArgumentException("Result is out of valid range.");
     }
@@ -334,49 +428,50 @@
     int nanos = (int) ((result - seconds) * 1000000000);
     return normalizedDuration(seconds, nanos);
   }
-
-  // TODO(kak): Delete this.
+  
   public static Duration divide(Duration duration, double value) {
     return multiply(duration, 1.0 / value);
   }
-
-  // TODO(kak): Delete this.
+  
   public static Duration multiply(Duration duration, long times) {
-    return createDurationFromBigInteger(toBigInteger(duration).multiply(toBigInteger(times)));
+    return createDurationFromBigInteger(
+      toBigInteger(duration).multiply(toBigInteger(times)));
   }
-
-  // TODO(kak): Delete this.
+  
   public static Duration divide(Duration duration, long times) {
-    return createDurationFromBigInteger(toBigInteger(duration).divide(toBigInteger(times)));
+    return createDurationFromBigInteger(
+      toBigInteger(duration).divide(toBigInteger(times)));
   }
-
-  // TODO(kak): Delete this.
+  
   public static long divide(Duration d1, Duration d2) {
     return toBigInteger(d1).divide(toBigInteger(d2)).longValue();
   }
-
-  // TODO(kak): Delete this.
+  
   public static Duration remainder(Duration d1, Duration d2) {
-    return createDurationFromBigInteger(toBigInteger(d1).remainder(toBigInteger(d2)));
+    return createDurationFromBigInteger(
+      toBigInteger(d1).remainder(toBigInteger(d2)));
   }
-
+  
   private static final BigInteger NANOS_PER_SECOND_BIG_INTEGER =
       new BigInteger(String.valueOf(NANOS_PER_SECOND));
-
+  
   private static BigInteger toBigInteger(Duration duration) {
     return toBigInteger(duration.getSeconds())
-        .multiply(NANOS_PER_SECOND_BIG_INTEGER)
-        .add(toBigInteger(duration.getNanos()));
+      .multiply(NANOS_PER_SECOND_BIG_INTEGER)
+      .add(toBigInteger(duration.getNanos()));
   }
-
+  
   private static BigInteger toBigInteger(long value) {
     return new BigInteger(String.valueOf(value));
   }
-
+  
   private static Duration createDurationFromBigInteger(BigInteger value) {
-    long seconds = value.divide(new BigInteger(String.valueOf(NANOS_PER_SECOND))).longValue();
-    int nanos = value.remainder(new BigInteger(String.valueOf(NANOS_PER_SECOND))).intValue();
+    long seconds = value.divide(
+      new BigInteger(String.valueOf(NANOS_PER_SECOND))).longValue();
+    int nanos = value.remainder(
+      new BigInteger(String.valueOf(NANOS_PER_SECOND))).intValue();
     return normalizedDuration(seconds, nanos);
+    
   }
 
   private static Duration normalizedDuration(long seconds, int nanos) {
@@ -397,4 +492,58 @@
     }
     return Duration.newBuilder().setSeconds(seconds).setNanos(nanos).build();
   }
+
+  private static Timestamp normalizedTimestamp(long seconds, int nanos) {
+    if (nanos <= -NANOS_PER_SECOND || nanos >= NANOS_PER_SECOND) {
+      seconds += nanos / NANOS_PER_SECOND;
+      nanos %= NANOS_PER_SECOND;
+    }
+    if (nanos < 0) {
+      nanos += NANOS_PER_SECOND;
+      seconds -= 1;
+    }
+    if (seconds < TIMESTAMP_SECONDS_MIN || seconds > TIMESTAMP_SECONDS_MAX) {
+      throw new IllegalArgumentException("Timestamp is out of valid range.");
+    }
+    return Timestamp.newBuilder().setSeconds(seconds).setNanos(nanos).build();
+  }
+
+  /**
+   * Format the nano part of a timestamp or a duration.
+   */
+  private static String formatNanos(int nanos) {
+    assert nanos >= 1 && nanos <= 999999999;
+    // Determine whether to use 3, 6, or 9 digits for the nano part.
+    if (nanos % NANOS_PER_MILLISECOND == 0) {
+      return String.format("%1$03d", nanos / NANOS_PER_MILLISECOND);
+    } else if (nanos % NANOS_PER_MICROSECOND == 0) {
+      return String.format("%1$06d", nanos / NANOS_PER_MICROSECOND);
+    } else {
+      return String.format("%1$09d", nanos);
+    }
+  }
+
+  private static int parseNanos(String value) throws ParseException {
+    int result = 0;
+    for (int i = 0; i < 9; ++i) {
+      result = result * 10;
+      if (i < value.length()) {
+        if (value.charAt(i) < '0' || value.charAt(i) > '9') {
+          throw new ParseException("Invalid nanosecnds.", 0);
+        }
+        result += value.charAt(i) - '0';
+      }
+    }
+    return result;
+  }
+
+  private static long parseTimezoneOffset(String value) throws ParseException {
+    int pos = value.indexOf(':');
+    if (pos == -1) {
+      throw new ParseException("Invalid offset value: " + value, 0);
+    }
+    String hours = value.substring(0, pos);
+    String minutes = value.substring(pos + 1);
+    return (Long.parseLong(hours) * 60 + Long.parseLong(minutes)) * 60;
+  }
 }
diff --git a/java/util/src/main/java/com/google/protobuf/util/Timestamps.java b/java/util/src/main/java/com/google/protobuf/util/Timestamps.java
deleted file mode 100644
index 7a1f201..0000000
--- a/java/util/src/main/java/com/google/protobuf/util/Timestamps.java
+++ /dev/null
@@ -1,406 +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.util;
-
-import static com.google.common.math.IntMath.checkedAdd;
-import static com.google.common.math.IntMath.checkedSubtract;
-import static com.google.common.math.LongMath.checkedAdd;
-import static com.google.common.math.LongMath.checkedMultiply;
-import static com.google.common.math.LongMath.checkedSubtract;
-
-import com.google.protobuf.Duration;
-import com.google.protobuf.Timestamp;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * Utilities to help create/manipulate {@code protobuf/timestamp.proto}. All operations throw an
- * {@link IllegalArgumentException} if the input(s) are not {@linkplain #isValid(Timestamp) valid}.
- */
-public final class Timestamps {
-
-  // Timestamp for "0001-01-01T00:00:00Z"
-  static final long TIMESTAMP_SECONDS_MIN = -62135596800L;
-
-  // Timestamp for "9999-12-31T23:59:59Z"
-  static final long TIMESTAMP_SECONDS_MAX = 253402300799L;
-
-  static final long NANOS_PER_SECOND = 1000000000;
-  static final long NANOS_PER_MILLISECOND = 1000000;
-  static final long NANOS_PER_MICROSECOND = 1000;
-  static final long MILLIS_PER_SECOND = 1000;
-  static final long MICROS_PER_SECOND = 1000000;
-
-  /** A constant holding the minimum valid {@link Timestamp}, {@code 0001-01-01T00:00:00Z}. */
-  public static final Timestamp MIN_VALUE =
-      Timestamp.newBuilder().setSeconds(TIMESTAMP_SECONDS_MIN).setNanos(0).build();
-
-  /**
-   * A constant holding the maximum valid {@link Timestamp}, {@code 9999-12-31T23:59:59.999999999Z}.
-   */
-  public static final Timestamp MAX_VALUE =
-      Timestamp.newBuilder().setSeconds(TIMESTAMP_SECONDS_MAX).setNanos(999999999).build();
-
-  private static final ThreadLocal<SimpleDateFormat> timestampFormat =
-      new ThreadLocal<SimpleDateFormat>() {
-        @Override
-        protected SimpleDateFormat initialValue() {
-          return createTimestampFormat();
-        }
-      };
-
-  private static SimpleDateFormat createTimestampFormat() {
-    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
-    GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
-    // We use Proleptic Gregorian Calendar (i.e., Gregorian calendar extends
-    // backwards to year one) for timestamp formating.
-    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
-    sdf.setCalendar(calendar);
-    return sdf;
-  }
-
-  private Timestamps() {}
-
-  private static final Comparator<Timestamp> COMPARATOR =
-      new Comparator<Timestamp>() {
-        @Override
-        public int compare(Timestamp t1, Timestamp t2) {
-          checkValid(t1);
-          checkValid(t2);
-          int secDiff = Long.compare(t1.getSeconds(), t2.getSeconds());
-          return (secDiff != 0) ? secDiff : Integer.compare(t1.getNanos(), t2.getNanos());
-        }
-      };
-
-  /**
-   * Returns a {@link Comparator} for {@link Timestamp}s which sorts in increasing chronological
-   * order. Nulls and invalid {@link Timestamp}s are not allowed (see {@link #isValid}).
-   */
-  public static Comparator<Timestamp> comparator() {
-    return COMPARATOR;
-  }
-
-  /**
-   * Compares two timestamps. The value returned is identical to what would be returned by:
-   * {@code Timestamps.comparator().compare(x, y)}.
-   *
-   * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y};
-   *     and a value greater than {@code 0} if {@code x > y}
-   */
-  public static int compare(Timestamp x, Timestamp y) {
-    return COMPARATOR.compare(x, y);
-  }
-
-  /**
-   * Returns true if the given {@link Timestamp} is valid. The {@code seconds} value must be in the
-   * range [-62,135,596,800, +253,402,300,799] (i.e., between 0001-01-01T00:00:00Z and
-   * 9999-12-31T23:59:59Z). The {@code nanos} value must be in the range [0, +999,999,999].
-   *
-   * <p><b>Note:</b> Negative second values with fractional seconds must still have non-negative
-   * nanos values that count forward in time.
-   */
-  public static boolean isValid(Timestamp timestamp) {
-    return isValid(timestamp.getSeconds(), timestamp.getNanos());
-  }
-
-  /**
-   * Returns true if the given number of seconds and nanos is a valid {@link Timestamp}. The {@code
-   * seconds} value must be in the range [-62,135,596,800, +253,402,300,799] (i.e., between
-   * 0001-01-01T00:00:00Z and 9999-12-31T23:59:59Z). The {@code nanos} value must be in the range
-   * [0, +999,999,999].
-   *
-   * <p><b>Note:</b> Negative second values with fractional seconds must still have non-negative
-   * nanos values that count forward in time.
-   */
-  public static boolean isValid(long seconds, int nanos) {
-    if (seconds < TIMESTAMP_SECONDS_MIN || seconds > TIMESTAMP_SECONDS_MAX) {
-      return false;
-    }
-    if (nanos < 0 || nanos >= NANOS_PER_SECOND) {
-      return false;
-    }
-    return true;
-  }
-
-  /** Throws an {@link IllegalArgumentException} if the given {@link Timestamp} is not valid. */
-  public static Timestamp checkValid(Timestamp timestamp) {
-    long seconds = timestamp.getSeconds();
-    int nanos = timestamp.getNanos();
-    if (!isValid(seconds, nanos)) {
-        throw new IllegalArgumentException(String.format(
-            "Timestamp is not valid. See proto definition for valid values. "
-            + "Seconds (%s) must be in range [-62,135,596,800, +253,402,300,799]. "
-            + "Nanos (%s) must be in range [0, +999,999,999].", seconds, nanos));
-    }
-    return timestamp;
-  }
-
-  /**
-   * Convert Timestamp to RFC 3339 date string format. The output will always be Z-normalized and
-   * uses 3, 6 or 9 fractional digits as required to represent the exact value. Note that Timestamp
-   * can only represent time from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. See
-   * https://www.ietf.org/rfc/rfc3339.txt
-   *
-   * <p>Example of generated format: "1972-01-01T10:00:20.021Z"
-   *
-   * @return The string representation of the given timestamp.
-   * @throws IllegalArgumentException if the given timestamp is not in the valid range.
-   */
-  public static String toString(Timestamp timestamp) {
-    checkValid(timestamp);
-
-    long seconds = timestamp.getSeconds();
-    int nanos = timestamp.getNanos();
-
-    StringBuilder result = new StringBuilder();
-    // Format the seconds part.
-    Date date = new Date(seconds * MILLIS_PER_SECOND);
-    result.append(timestampFormat.get().format(date));
-    // Format the nanos part.
-    if (nanos != 0) {
-      result.append(".");
-      result.append(formatNanos(nanos));
-    }
-    result.append("Z");
-    return result.toString();
-  }
-
-  /**
-   * Parse from RFC 3339 date string to Timestamp. This method accepts all outputs of {@link
-   * #toString(Timestamp)} and it also accepts any fractional digits (or none) and any offset as
-   * long as they fit into nano-seconds precision.
-   *
-   * <p>Example of accepted format: "1972-01-01T10:00:20.021-05:00"
-   *
-   * @return A Timestamp parsed from the string.
-   * @throws ParseException if parsing fails.
-   */
-  public static Timestamp parse(String value) throws ParseException {
-    int dayOffset = value.indexOf('T');
-    if (dayOffset == -1) {
-      throw new ParseException("Failed to parse timestamp: invalid timestamp \"" + value + "\"", 0);
-    }
-    int timezoneOffsetPosition = value.indexOf('Z', dayOffset);
-    if (timezoneOffsetPosition == -1) {
-      timezoneOffsetPosition = value.indexOf('+', dayOffset);
-    }
-    if (timezoneOffsetPosition == -1) {
-      timezoneOffsetPosition = value.indexOf('-', dayOffset);
-    }
-    if (timezoneOffsetPosition == -1) {
-      throw new ParseException("Failed to parse timestamp: missing valid timezone offset.", 0);
-    }
-    // Parse seconds and nanos.
-    String timeValue = value.substring(0, timezoneOffsetPosition);
-    String secondValue = timeValue;
-    String nanoValue = "";
-    int pointPosition = timeValue.indexOf('.');
-    if (pointPosition != -1) {
-      secondValue = timeValue.substring(0, pointPosition);
-      nanoValue = timeValue.substring(pointPosition + 1);
-    }
-    Date date = timestampFormat.get().parse(secondValue);
-    long seconds = date.getTime() / MILLIS_PER_SECOND;
-    int nanos = nanoValue.isEmpty() ? 0 : parseNanos(nanoValue);
-    // Parse timezone offsets.
-    if (value.charAt(timezoneOffsetPosition) == 'Z') {
-      if (value.length() != timezoneOffsetPosition + 1) {
-        throw new ParseException(
-            "Failed to parse timestamp: invalid trailing data \""
-                + value.substring(timezoneOffsetPosition)
-                + "\"",
-            0);
-      }
-    } else {
-      String offsetValue = value.substring(timezoneOffsetPosition + 1);
-      long offset = parseTimezoneOffset(offsetValue);
-      if (value.charAt(timezoneOffsetPosition) == '+') {
-        seconds -= offset;
-      } else {
-        seconds += offset;
-      }
-    }
-    try {
-      return normalizedTimestamp(seconds, nanos);
-    } catch (IllegalArgumentException e) {
-      throw new ParseException("Failed to parse timestamp: timestamp is out of range.", 0);
-    }
-  }
-
-  /** Create a Timestamp from the number of seconds elapsed from the epoch. */
-  public static Timestamp fromSeconds(long seconds) {
-    return normalizedTimestamp(seconds, 0);
-  }
-
-  /**
-   * Convert a Timestamp to the number of seconds elapsed from the epoch.
-   *
-   * <p>The result will be rounded down to the nearest second. E.g., if the timestamp represents
-   * "1969-12-31T23:59:59.999999999Z", it will be rounded to -1 second.
-   */
-  public static long toSeconds(Timestamp timestamp) {
-    return checkValid(timestamp).getSeconds();
-  }
-
-  /** Create a Timestamp from the number of milliseconds elapsed from the epoch. */
-  public static Timestamp fromMillis(long milliseconds) {
-    return normalizedTimestamp(
-        milliseconds / MILLIS_PER_SECOND,
-        (int) (milliseconds % MILLIS_PER_SECOND * NANOS_PER_MILLISECOND));
-  }
-
-  /**
-   * Convert a Timestamp to the number of milliseconds elapsed from the epoch.
-   *
-   * <p>The result will be rounded down to the nearest millisecond. E.g., if the timestamp
-   * represents "1969-12-31T23:59:59.999999999Z", it will be rounded to -1 millisecond.
-   */
-  public static long toMillis(Timestamp timestamp) {
-    checkValid(timestamp);
-    return checkedAdd(
-        checkedMultiply(timestamp.getSeconds(), MILLIS_PER_SECOND),
-        timestamp.getNanos() / NANOS_PER_MILLISECOND);
-  }
-
-  /** Create a Timestamp from the number of microseconds elapsed from the epoch. */
-  public static Timestamp fromMicros(long microseconds) {
-    return normalizedTimestamp(
-        microseconds / MICROS_PER_SECOND,
-        (int) (microseconds % MICROS_PER_SECOND * NANOS_PER_MICROSECOND));
-  }
-
-  /**
-   * Convert a Timestamp to the number of microseconds elapsed from the epoch.
-   *
-   * <p>The result will be rounded down to the nearest microsecond. E.g., if the timestamp
-   * represents "1969-12-31T23:59:59.999999999Z", it will be rounded to -1 microsecond.
-   */
-  public static long toMicros(Timestamp timestamp) {
-    checkValid(timestamp);
-    return checkedAdd(
-        checkedMultiply(timestamp.getSeconds(), MICROS_PER_SECOND),
-        timestamp.getNanos() / NANOS_PER_MICROSECOND);
-  }
-
-  /** Create a Timestamp from the number of nanoseconds elapsed from the epoch. */
-  public static Timestamp fromNanos(long nanoseconds) {
-    return normalizedTimestamp(
-        nanoseconds / NANOS_PER_SECOND, (int) (nanoseconds % NANOS_PER_SECOND));
-  }
-
-  /** Convert a Timestamp to the number of nanoseconds elapsed from the epoch. */
-  public static long toNanos(Timestamp timestamp) {
-    checkValid(timestamp);
-    return checkedAdd(
-        checkedMultiply(timestamp.getSeconds(), NANOS_PER_SECOND), timestamp.getNanos());
-  }
-
-  /** Calculate the difference between two timestamps. */
-  public static Duration between(Timestamp from, Timestamp to) {
-    checkValid(from);
-    checkValid(to);
-    return Durations.normalizedDuration(
-        checkedSubtract(to.getSeconds(), from.getSeconds()),
-        checkedSubtract(to.getNanos(), from.getNanos()));
-  }
-
-  /** Add a duration to a timestamp. */
-  public static Timestamp add(Timestamp start, Duration length) {
-    checkValid(start);
-    Durations.checkValid(length);
-    return normalizedTimestamp(
-        checkedAdd(start.getSeconds(), length.getSeconds()),
-        checkedAdd(start.getNanos(), length.getNanos()));
-  }
-
-  /** Subtract a duration from a timestamp. */
-  public static Timestamp subtract(Timestamp start, Duration length) {
-    checkValid(start);
-    Durations.checkValid(length);
-    return normalizedTimestamp(
-        checkedSubtract(start.getSeconds(), length.getSeconds()),
-        checkedSubtract(start.getNanos(), length.getNanos()));
-  }
-
-  static Timestamp normalizedTimestamp(long seconds, int nanos) {
-    if (nanos <= -NANOS_PER_SECOND || nanos >= NANOS_PER_SECOND) {
-      seconds = checkedAdd(seconds, nanos / NANOS_PER_SECOND);
-      nanos %= NANOS_PER_SECOND;
-    }
-    if (nanos < 0) {
-      nanos += NANOS_PER_SECOND; // no overflow since nanos is negative (and we're adding)
-      seconds = checkedSubtract(seconds, 1);
-    }
-    Timestamp timestamp = Timestamp.newBuilder().setSeconds(seconds).setNanos(nanos).build();
-    return checkValid(timestamp);
-  }
-
-  private static long parseTimezoneOffset(String value) throws ParseException {
-    int pos = value.indexOf(':');
-    if (pos == -1) {
-      throw new ParseException("Invalid offset value: " + value, 0);
-    }
-    String hours = value.substring(0, pos);
-    String minutes = value.substring(pos + 1);
-    return (Long.parseLong(hours) * 60 + Long.parseLong(minutes)) * 60;
-  }
-
-  static int parseNanos(String value) throws ParseException {
-    int result = 0;
-    for (int i = 0; i < 9; ++i) {
-      result = result * 10;
-      if (i < value.length()) {
-        if (value.charAt(i) < '0' || value.charAt(i) > '9') {
-          throw new ParseException("Invalid nanoseconds.", 0);
-        }
-        result += value.charAt(i) - '0';
-      }
-    }
-    return result;
-  }
-
-  /** Format the nano part of a timestamp or a duration. */
-  static String formatNanos(int nanos) {
-    // Determine whether to use 3, 6, or 9 digits for the nano part.
-    if (nanos % NANOS_PER_MILLISECOND == 0) {
-      return String.format(Locale.ENGLISH, "%1$03d", nanos / NANOS_PER_MILLISECOND);
-    } else if (nanos % NANOS_PER_MICROSECOND == 0) {
-      return String.format(Locale.ENGLISH, "%1$06d", nanos / NANOS_PER_MICROSECOND);
-    } else {
-      return String.format(Locale.ENGLISH, "%1$09d", nanos);
-    }
-  }
-}
diff --git a/java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java b/java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java
index 853b615..3ee0fc6 100644
--- a/java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java
+++ b/java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java
@@ -33,6 +33,7 @@
 import protobuf_unittest.UnittestProto.NestedTestAllTypes;
 import protobuf_unittest.UnittestProto.TestAllTypes;
 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;
+
 import junit.framework.TestCase;
 
 public class FieldMaskTreeTest extends TestCase {
@@ -221,13 +222,6 @@
     new FieldMaskTree().addFieldPath("payload").merge(clearedSource, builder, options);
     assertEquals(false, builder.hasPayload());
 
-    // Skip a message field if they are unset in both source and target.
-    builder = NestedTestAllTypes.newBuilder();
-    new FieldMaskTree()
-        .addFieldPath("payload.optional_int32")
-        .merge(clearedSource, builder, options);
-    assertEquals(false, builder.hasPayload());
-
     // Change to replace message fields.
     options.setReplaceMessageFields(true);
     builder = NestedTestAllTypes.newBuilder();
diff --git a/java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java b/java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java
index 1a99857..194f7b9 100644
--- a/java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java
+++ b/java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java
@@ -41,55 +41,52 @@
   public void testIsValid() throws Exception {
     assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload"));
     assertFalse(FieldMaskUtil.isValid(NestedTestAllTypes.class, "nonexist"));
-    assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.optional_int32"));
-    assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.repeated_int32"));
-    assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.optional_nested_message"));
-    assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.repeated_nested_message"));
-    assertFalse(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.nonexist"));
-
-    assertTrue(
-        FieldMaskUtil.isValid(NestedTestAllTypes.class, FieldMaskUtil.fromString("payload")));
-    assertFalse(
-        FieldMaskUtil.isValid(NestedTestAllTypes.class, FieldMaskUtil.fromString("nonexist")));
-    assertFalse(
-        FieldMaskUtil.isValid(
-            NestedTestAllTypes.class, FieldMaskUtil.fromString("payload,nonexist")));
-
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.optional_int32"));
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.repeated_int32"));
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.optional_nested_message"));
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.repeated_nested_message"));
+    assertFalse(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.nonexist"));
+    
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, FieldMaskUtil.fromString("payload")));
+    assertFalse(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, FieldMaskUtil.fromString("nonexist")));
+    assertFalse(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, FieldMaskUtil.fromString("payload,nonexist")));
+    
     assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.getDescriptor(), "payload"));
     assertFalse(FieldMaskUtil.isValid(NestedTestAllTypes.getDescriptor(), "nonexist"));
-
-    assertTrue(
-        FieldMaskUtil.isValid(
-            NestedTestAllTypes.getDescriptor(), FieldMaskUtil.fromString("payload")));
-    assertFalse(
-        FieldMaskUtil.isValid(
-            NestedTestAllTypes.getDescriptor(), FieldMaskUtil.fromString("nonexist")));
-
-    assertTrue(
-        FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.optional_nested_message.bb"));
+    
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.getDescriptor(), FieldMaskUtil.fromString("payload")));
+    assertFalse(FieldMaskUtil.isValid(
+        NestedTestAllTypes.getDescriptor(), FieldMaskUtil.fromString("nonexist")));
+    
+    assertTrue(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.optional_nested_message.bb"));
     // Repeated fields cannot have sub-paths.
-    assertFalse(
-        FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.repeated_nested_message.bb"));
+    assertFalse(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.repeated_nested_message.bb"));
     // Non-message fields cannot have sub-paths.
-    assertFalse(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload.optional_int32.bb"));
+    assertFalse(FieldMaskUtil.isValid(
+        NestedTestAllTypes.class, "payload.optional_int32.bb"));
   }
-
+  
   public void testToString() throws Exception {
     assertEquals("", FieldMaskUtil.toString(FieldMask.getDefaultInstance()));
     FieldMask mask = FieldMask.newBuilder().addPaths("foo").build();
     assertEquals("foo", FieldMaskUtil.toString(mask));
     mask = FieldMask.newBuilder().addPaths("foo").addPaths("bar").build();
     assertEquals("foo,bar", FieldMaskUtil.toString(mask));
-
+    
     // Empty field paths are ignored.
-    mask =
-        FieldMask.newBuilder()
-            .addPaths("")
-            .addPaths("foo")
-            .addPaths("")
-            .addPaths("bar")
-            .addPaths("")
-            .build();
+    mask = FieldMask.newBuilder().addPaths("").addPaths("foo").addPaths("").
+      addPaths("bar").addPaths("").build();
     assertEquals("foo,bar", FieldMaskUtil.toString(mask));
   }
 
@@ -114,7 +111,8 @@
     mask = FieldMaskUtil.fromString(NestedTestAllTypes.class, ",payload");
 
     try {
-      mask = FieldMaskUtil.fromString(NestedTestAllTypes.class, "payload,nonexist");
+      mask = FieldMaskUtil.fromString(
+          NestedTestAllTypes.class, "payload,nonexist");
       fail("Exception is expected.");
     } catch (IllegalArgumentException e) {
       // Expected.
@@ -145,33 +143,7 @@
     } catch (IllegalArgumentException expected) {
     }
   }
-
-  public void testToJsonString() throws Exception {
-    FieldMask mask = FieldMask.getDefaultInstance();
-    assertEquals("", FieldMaskUtil.toJsonString(mask));
-    mask = FieldMask.newBuilder().addPaths("foo").build();
-    assertEquals("foo", FieldMaskUtil.toJsonString(mask));
-    mask = FieldMask.newBuilder().addPaths("foo.bar_baz").addPaths("").build();
-    assertEquals("foo.barBaz", FieldMaskUtil.toJsonString(mask));
-    mask = FieldMask.newBuilder().addPaths("foo").addPaths("bar_baz").build();
-    assertEquals("foo,barBaz", FieldMaskUtil.toJsonString(mask));
-  }
-
-  public void testFromJsonString() throws Exception {
-    FieldMask mask = FieldMaskUtil.fromJsonString("");
-    assertEquals(0, mask.getPathsCount());
-    mask = FieldMaskUtil.fromJsonString("foo");
-    assertEquals(1, mask.getPathsCount());
-    assertEquals("foo", mask.getPaths(0));
-    mask = FieldMaskUtil.fromJsonString("foo.barBaz");
-    assertEquals(1, mask.getPathsCount());
-    assertEquals("foo.bar_baz", mask.getPaths(0));
-    mask = FieldMaskUtil.fromJsonString("foo,barBaz");
-    assertEquals(2, mask.getPathsCount());
-    assertEquals("foo", mask.getPaths(0));
-    assertEquals("bar_baz", mask.getPaths(1));
-  }
-
+  
   public void testUnion() throws Exception {
     // Only test a simple case here and expect
     // {@link FieldMaskTreeTest#testAddFieldPath} to cover all scenarios.
@@ -189,7 +161,7 @@
     FieldMask result = FieldMaskUtil.union(mask1, mask2, mask3, mask4);
     assertEquals("bar,foo", FieldMaskUtil.toString(result));
   }
-
+  
   public void testIntersection() throws Exception {
     // Only test a simple case here and expect
     // {@link FieldMaskTreeTest#testIntersectFieldPath} to cover all scenarios.
@@ -198,14 +170,13 @@
     FieldMask result = FieldMaskUtil.intersection(mask1, mask2);
     assertEquals("bar.baz,bar.quz,foo.bar", FieldMaskUtil.toString(result));
   }
-
+  
   public void testMerge() throws Exception {
     // Only test a simple case here and expect
     // {@link FieldMaskTreeTest#testMerge} to cover all scenarios.
-    NestedTestAllTypes source =
-        NestedTestAllTypes.newBuilder()
-            .setPayload(TestAllTypes.newBuilder().setOptionalInt32(1234))
-            .build();
+    NestedTestAllTypes source = NestedTestAllTypes.newBuilder()
+        .setPayload(TestAllTypes.newBuilder().setOptionalInt32(1234))
+        .build();
     NestedTestAllTypes.Builder builder = NestedTestAllTypes.newBuilder();
     FieldMaskUtil.merge(FieldMaskUtil.fromString("payload"), source, builder);
     assertEquals(1234, builder.getPayload().getOptionalInt32());
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 e4c5387..d95b626 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
@@ -34,7 +34,6 @@
 import com.google.protobuf.BoolValue;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.BytesValue;
-import com.google.protobuf.Descriptors.FieldDescriptor;
 import com.google.protobuf.DoubleValue;
 import com.google.protobuf.FloatValue;
 import com.google.protobuf.Int32Value;
@@ -42,7 +41,6 @@
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.ListValue;
 import com.google.protobuf.Message;
-import com.google.protobuf.NullValue;
 import com.google.protobuf.StringValue;
 import com.google.protobuf.Struct;
 import com.google.protobuf.UInt32Value;
@@ -58,30 +56,17 @@
 import com.google.protobuf.util.JsonTestProto.TestFieldMask;
 import com.google.protobuf.util.JsonTestProto.TestMap;
 import com.google.protobuf.util.JsonTestProto.TestOneof;
-import com.google.protobuf.util.JsonTestProto.TestRecursive;
 import com.google.protobuf.util.JsonTestProto.TestStruct;
 import com.google.protobuf.util.JsonTestProto.TestTimestamp;
 import com.google.protobuf.util.JsonTestProto.TestWrappers;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
+
 import junit.framework.TestCase;
 
-public class JsonFormatTest extends TestCase {
-  public JsonFormatTest() {
-    // Test that locale does not affect JsonFormat.
-    Locale.setDefault(Locale.forLanguageTag("hi-IN"));
-  }
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 
+public class JsonFormatTest extends TestCase {
   private void setAllFields(TestAllTypes.Builder builder) {
     builder.setOptionalInt32(1234);
     builder.setOptionalInt64(1234567890123456789L);
@@ -97,7 +82,7 @@
     builder.setOptionalDouble(1.25);
     builder.setOptionalBool(true);
     builder.setOptionalString("Hello world!");
-    builder.setOptionalBytes(ByteString.copyFrom(new byte[] {0, 1, 2}));
+    builder.setOptionalBytes(ByteString.copyFrom(new byte[]{0, 1, 2}));
     builder.setOptionalNestedEnum(NestedEnum.BAR);
     builder.getOptionalNestedMessageBuilder().setValue(100);
 
@@ -115,7 +100,7 @@
     builder.addRepeatedDouble(1.25);
     builder.addRepeatedBool(true);
     builder.addRepeatedString("Hello world!");
-    builder.addRepeatedBytes(ByteString.copyFrom(new byte[] {0, 1, 2}));
+    builder.addRepeatedBytes(ByteString.copyFrom(new byte[]{0, 1, 2}));
     builder.addRepeatedNestedEnum(NestedEnum.BAR);
     builder.addRepeatedNestedMessageBuilder().setValue(100);
 
@@ -133,7 +118,7 @@
     builder.addRepeatedDouble(11.25);
     builder.addRepeatedBool(true);
     builder.addRepeatedString("ello world!");
-    builder.addRepeatedBytes(ByteString.copyFrom(new byte[] {1, 2}));
+    builder.addRepeatedBytes(ByteString.copyFrom(new byte[]{1, 2}));
     builder.addRepeatedNestedEnum(NestedEnum.BAZ);
     builder.addRepeatedNestedMessageBuilder().setValue(200);
   }
@@ -154,9 +139,6 @@
   private String toJsonString(Message message) throws IOException {
     return JsonFormat.printer().print(message);
   }
-  private String toCompactJsonString(Message message) throws IOException {
-    return JsonFormat.printer().omittingInsignificantWhitespace().print(message);
-  }
 
   private void mergeFromJson(String json, Message.Builder builder) throws IOException {
     JsonFormat.parser().merge(json, builder);
@@ -216,23 +198,21 @@
   }
 
   public void testUnknownEnumValues() throws Exception {
-    TestAllTypes message =
-        TestAllTypes.newBuilder()
-            .setOptionalNestedEnumValue(12345)
-            .addRepeatedNestedEnumValue(12345)
-            .addRepeatedNestedEnumValue(0)
-            .build();
+    TestAllTypes message = TestAllTypes.newBuilder()
+        .setOptionalNestedEnumValue(12345)
+        .addRepeatedNestedEnumValue(12345)
+        .addRepeatedNestedEnumValue(0)
+        .build();
     assertEquals(
         "{\n"
-            + "  \"optionalNestedEnum\": 12345,\n"
-            + "  \"repeatedNestedEnum\": [12345, \"FOO\"]\n"
-            + "}",
-        toJsonString(message));
+        + "  \"optionalNestedEnum\": 12345,\n"
+        + "  \"repeatedNestedEnum\": [12345, \"FOO\"]\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
 
     TestMap.Builder mapBuilder = TestMap.newBuilder();
-    mapBuilder.putInt32ToEnumMapValue(1, 0);
-    mapBuilder.putInt32ToEnumMapValue(2, 12345);
+    mapBuilder.getMutableInt32ToEnumMapValue().put(1, 0);
+    mapBuilder.getMutableInt32ToEnumMapValue().put(2, 12345);
     TestMap mapMessage = mapBuilder.build();
     assertEquals(
         "{\n"
@@ -246,47 +226,44 @@
   }
 
   public void testSpecialFloatValues() throws Exception {
-    TestAllTypes message =
-        TestAllTypes.newBuilder()
-            .addRepeatedFloat(Float.NaN)
-            .addRepeatedFloat(Float.POSITIVE_INFINITY)
-            .addRepeatedFloat(Float.NEGATIVE_INFINITY)
-            .addRepeatedDouble(Double.NaN)
-            .addRepeatedDouble(Double.POSITIVE_INFINITY)
-            .addRepeatedDouble(Double.NEGATIVE_INFINITY)
-            .build();
+    TestAllTypes message = TestAllTypes.newBuilder()
+        .addRepeatedFloat(Float.NaN)
+        .addRepeatedFloat(Float.POSITIVE_INFINITY)
+        .addRepeatedFloat(Float.NEGATIVE_INFINITY)
+        .addRepeatedDouble(Double.NaN)
+        .addRepeatedDouble(Double.POSITIVE_INFINITY)
+        .addRepeatedDouble(Double.NEGATIVE_INFINITY)
+        .build();
     assertEquals(
         "{\n"
-            + "  \"repeatedFloat\": [\"NaN\", \"Infinity\", \"-Infinity\"],\n"
-            + "  \"repeatedDouble\": [\"NaN\", \"Infinity\", \"-Infinity\"]\n"
-            + "}",
-        toJsonString(message));
+        + "  \"repeatedFloat\": [\"NaN\", \"Infinity\", \"-Infinity\"],\n"
+        + "  \"repeatedDouble\": [\"NaN\", \"Infinity\", \"-Infinity\"]\n"
+        + "}", toJsonString(message));
 
     assertRoundTripEquals(message);
   }
 
-  public void testParserAcceptStringForNumericField() throws Exception {
+  public void testParserAcceptStringForNumbericField() throws Exception {
     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
     mergeFromJson(
         "{\n"
-            + "  \"optionalInt32\": \"1234\",\n"
-            + "  \"optionalUint32\": \"5678\",\n"
-            + "  \"optionalSint32\": \"9012\",\n"
-            + "  \"optionalFixed32\": \"3456\",\n"
-            + "  \"optionalSfixed32\": \"7890\",\n"
-            + "  \"optionalFloat\": \"1.5\",\n"
-            + "  \"optionalDouble\": \"1.25\",\n"
-            + "  \"optionalBool\": \"true\"\n"
-            + "}",
-        builder);
+        + "  \"optionalInt32\": \"1234\",\n"
+        + "  \"optionalUint32\": \"5678\",\n"
+        + "  \"optionalSint32\": \"9012\",\n"
+        + "  \"optionalFixed32\": \"3456\",\n"
+        + "  \"optionalSfixed32\": \"7890\",\n"
+        + "  \"optionalFloat\": \"1.5\",\n"
+        + "  \"optionalDouble\": \"1.25\",\n"
+        + "  \"optionalBool\": \"true\"\n"
+        + "}", builder);
     TestAllTypes message = builder.build();
     assertEquals(1234, message.getOptionalInt32());
     assertEquals(5678, message.getOptionalUint32());
     assertEquals(9012, message.getOptionalSint32());
     assertEquals(3456, message.getOptionalFixed32());
     assertEquals(7890, message.getOptionalSfixed32());
-    assertEquals(1.5f, message.getOptionalFloat(), 0.0f);
-    assertEquals(1.25, message.getOptionalDouble(), 0.0);
+    assertEquals(1.5f, message.getOptionalFloat());
+    assertEquals(1.25, message.getOptionalDouble());
     assertEquals(true, message.getOptionalBool());
   }
 
@@ -299,9 +276,8 @@
             + "  \"repeatedUint32\": [1.000, 1e5, \"1.000\", \"1e5\"],\n"
             + "  \"repeatedInt64\": [1.000, 1e5, \"1.000\", \"1e5\"],\n"
             + "  \"repeatedUint64\": [1.000, 1e5, \"1.000\", \"1e5\"]\n"
-            + "}",
-        builder);
-    int[] expectedValues = new int[] {1, 100000, 1, 100000};
+            + "}", builder);
+    int[] expectedValues = new int[]{1, 100000, 1, 100000};
     assertEquals(4, builder.getRepeatedInt32Count());
     assertEquals(4, builder.getRepeatedUint32Count());
     assertEquals(4, builder.getRepeatedInt64Count());
@@ -390,49 +366,51 @@
     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
     mergeFromJson(
         "{\n"
-            + "  \"optionalInt32\": null,\n"
-            + "  \"optionalInt64\": null,\n"
-            + "  \"optionalUint32\": null,\n"
-            + "  \"optionalUint64\": null,\n"
-            + "  \"optionalSint32\": null,\n"
-            + "  \"optionalSint64\": null,\n"
-            + "  \"optionalFixed32\": null,\n"
-            + "  \"optionalFixed64\": null,\n"
-            + "  \"optionalSfixed32\": null,\n"
-            + "  \"optionalSfixed64\": null,\n"
-            + "  \"optionalFloat\": null,\n"
-            + "  \"optionalDouble\": null,\n"
-            + "  \"optionalBool\": null,\n"
-            + "  \"optionalString\": null,\n"
-            + "  \"optionalBytes\": null,\n"
-            + "  \"optionalNestedMessage\": null,\n"
-            + "  \"optionalNestedEnum\": null,\n"
-            + "  \"repeatedInt32\": null,\n"
-            + "  \"repeatedInt64\": null,\n"
-            + "  \"repeatedUint32\": null,\n"
-            + "  \"repeatedUint64\": null,\n"
-            + "  \"repeatedSint32\": null,\n"
-            + "  \"repeatedSint64\": null,\n"
-            + "  \"repeatedFixed32\": null,\n"
-            + "  \"repeatedFixed64\": null,\n"
-            + "  \"repeatedSfixed32\": null,\n"
-            + "  \"repeatedSfixed64\": null,\n"
-            + "  \"repeatedFloat\": null,\n"
-            + "  \"repeatedDouble\": null,\n"
-            + "  \"repeatedBool\": null,\n"
-            + "  \"repeatedString\": null,\n"
-            + "  \"repeatedBytes\": null,\n"
-            + "  \"repeatedNestedMessage\": null,\n"
-            + "  \"repeatedNestedEnum\": null\n"
-            + "}",
-        builder);
+        + "  \"optionalInt32\": null,\n"
+        + "  \"optionalInt64\": null,\n"
+        + "  \"optionalUint32\": null,\n"
+        + "  \"optionalUint64\": null,\n"
+        + "  \"optionalSint32\": null,\n"
+        + "  \"optionalSint64\": null,\n"
+        + "  \"optionalFixed32\": null,\n"
+        + "  \"optionalFixed64\": null,\n"
+        + "  \"optionalSfixed32\": null,\n"
+        + "  \"optionalSfixed64\": null,\n"
+        + "  \"optionalFloat\": null,\n"
+        + "  \"optionalDouble\": null,\n"
+        + "  \"optionalBool\": null,\n"
+        + "  \"optionalString\": null,\n"
+        + "  \"optionalBytes\": null,\n"
+        + "  \"optionalNestedMessage\": null,\n"
+        + "  \"optionalNestedEnum\": null,\n"
+        + "  \"repeatedInt32\": null,\n"
+        + "  \"repeatedInt64\": null,\n"
+        + "  \"repeatedUint32\": null,\n"
+        + "  \"repeatedUint64\": null,\n"
+        + "  \"repeatedSint32\": null,\n"
+        + "  \"repeatedSint64\": null,\n"
+        + "  \"repeatedFixed32\": null,\n"
+        + "  \"repeatedFixed64\": null,\n"
+        + "  \"repeatedSfixed32\": null,\n"
+        + "  \"repeatedSfixed64\": null,\n"
+        + "  \"repeatedFloat\": null,\n"
+        + "  \"repeatedDouble\": null,\n"
+        + "  \"repeatedBool\": null,\n"
+        + "  \"repeatedString\": null,\n"
+        + "  \"repeatedBytes\": null,\n"
+        + "  \"repeatedNestedMessage\": null,\n"
+        + "  \"repeatedNestedEnum\": null\n"
+        + "}", builder);
     TestAllTypes message = builder.build();
     assertEquals(TestAllTypes.getDefaultInstance(), message);
 
     // Repeated field elements cannot be null.
     try {
       builder = TestAllTypes.newBuilder();
-      mergeFromJson("{\n" + "  \"repeatedInt32\": [null, null],\n" + "}", builder);
+      mergeFromJson(
+          "{\n"
+          + "  \"repeatedInt32\": [null, null],\n"
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
@@ -440,21 +418,16 @@
 
     try {
       builder = TestAllTypes.newBuilder();
-      mergeFromJson("{\n" + "  \"repeatedNestedMessage\": [null, null],\n" + "}", builder);
+      mergeFromJson(
+          "{\n"
+          + "  \"repeatedNestedMessage\": [null, null],\n"
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
     }
   }
 
-  public void testNullInOneof() throws Exception {
-    TestOneof.Builder builder = TestOneof.newBuilder();
-    mergeFromJson("{\n" + "  \"oneofNullValue\": null \n" + "}", builder);
-    TestOneof message = builder.build();
-    assertEquals(TestOneof.OneofFieldCase.ONEOF_NULL_VALUE, message.getOneofFieldCase());
-    assertEquals(NullValue.NULL_VALUE, message.getOneofNullValue());
-  }
-
   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
@@ -468,8 +441,7 @@
           "{\n"
               + "  \"optionalNestedMessage\": {},\n"
               + "  \"optional_nested_message\": {}\n"
-              + "}",
-          builder);
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
@@ -480,29 +452,22 @@
       TestAllTypes.Builder builder = TestAllTypes.newBuilder();
       mergeFromJson(
           "{\n"
-              + "  \"repeatedInt32\": [1, 2],\n"
-              + "  \"repeated_int32\": [5, 6]\n"
-              + "}",
-          builder);
+          + "  \"repeatedNestedMessage\": [null, null],\n"
+          + "  \"repeated_nested_message\": [null, null]\n"
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
     }
 
-    // Duplicated oneof fields, same name.
-    try {
-      TestOneof.Builder builder = TestOneof.newBuilder();
-      mergeFromJson("{\n" + "  \"oneofInt32\": 1,\n" + "  \"oneof_int32\": 2\n" + "}", builder);
-      fail();
-    } catch (InvalidProtocolBufferException e) {
-      // Exception expected.
-    }
-
-    // Duplicated oneof fields, different name.
+    // Duplicated oneof fields.
     try {
       TestOneof.Builder builder = TestOneof.newBuilder();
       mergeFromJson(
-          "{\n" + "  \"oneofInt32\": 1,\n" + "  \"oneofNullValue\": null\n" + "}", builder);
+          "{\n"
+          + "  \"oneofInt32\": 1,\n"
+          + "  \"oneof_int32\": 2\n"
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
@@ -511,138 +476,143 @@
 
   public void testMapFields() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
-    builder.putInt32ToInt32Map(1, 10);
-    builder.putInt64ToInt32Map(1234567890123456789L, 10);
-    builder.putUint32ToInt32Map(2, 20);
-    builder.putUint64ToInt32Map(2234567890123456789L, 20);
-    builder.putSint32ToInt32Map(3, 30);
-    builder.putSint64ToInt32Map(3234567890123456789L, 30);
-    builder.putFixed32ToInt32Map(4, 40);
-    builder.putFixed64ToInt32Map(4234567890123456789L, 40);
-    builder.putSfixed32ToInt32Map(5, 50);
-    builder.putSfixed64ToInt32Map(5234567890123456789L, 50);
-    builder.putBoolToInt32Map(false, 6);
-    builder.putStringToInt32Map("Hello", 10);
+    builder.getMutableInt32ToInt32Map().put(1, 10);
+    builder.getMutableInt64ToInt32Map().put(1234567890123456789L, 10);
+    builder.getMutableUint32ToInt32Map().put(2, 20);
+    builder.getMutableUint64ToInt32Map().put(2234567890123456789L, 20);
+    builder.getMutableSint32ToInt32Map().put(3, 30);
+    builder.getMutableSint64ToInt32Map().put(3234567890123456789L, 30);
+    builder.getMutableFixed32ToInt32Map().put(4, 40);
+    builder.getMutableFixed64ToInt32Map().put(4234567890123456789L, 40);
+    builder.getMutableSfixed32ToInt32Map().put(5, 50);
+    builder.getMutableSfixed64ToInt32Map().put(5234567890123456789L, 50);
+    builder.getMutableBoolToInt32Map().put(false, 6);
+    builder.getMutableStringToInt32Map().put("Hello", 10);
 
-    builder.putInt32ToInt64Map(1, 1234567890123456789L);
-    builder.putInt32ToUint32Map(2, 20);
-    builder.putInt32ToUint64Map(2, 2234567890123456789L);
-    builder.putInt32ToSint32Map(3, 30);
-    builder.putInt32ToSint64Map(3, 3234567890123456789L);
-    builder.putInt32ToFixed32Map(4, 40);
-    builder.putInt32ToFixed64Map(4, 4234567890123456789L);
-    builder.putInt32ToSfixed32Map(5, 50);
-    builder.putInt32ToSfixed64Map(5, 5234567890123456789L);
-    builder.putInt32ToFloatMap(6, 1.5f);
-    builder.putInt32ToDoubleMap(6, 1.25);
-    builder.putInt32ToBoolMap(7, false);
-    builder.putInt32ToStringMap(7, "World");
-    builder.putInt32ToBytesMap(8, ByteString.copyFrom(new byte[] {1, 2, 3}));
-    builder.putInt32ToMessageMap(8, NestedMessage.newBuilder().setValue(1234).build());
-    builder.putInt32ToEnumMap(9, NestedEnum.BAR);
+    builder.getMutableInt32ToInt64Map().put(1, 1234567890123456789L);
+    builder.getMutableInt32ToUint32Map().put(2, 20);
+    builder.getMutableInt32ToUint64Map().put(2, 2234567890123456789L);
+    builder.getMutableInt32ToSint32Map().put(3, 30);
+    builder.getMutableInt32ToSint64Map().put(3, 3234567890123456789L);
+    builder.getMutableInt32ToFixed32Map().put(4, 40);
+    builder.getMutableInt32ToFixed64Map().put(4, 4234567890123456789L);
+    builder.getMutableInt32ToSfixed32Map().put(5, 50);
+    builder.getMutableInt32ToSfixed64Map().put(5, 5234567890123456789L);
+    builder.getMutableInt32ToFloatMap().put(6, 1.5f);
+    builder.getMutableInt32ToDoubleMap().put(6, 1.25);
+    builder.getMutableInt32ToBoolMap().put(7, false);
+    builder.getMutableInt32ToStringMap().put(7, "World");
+    builder.getMutableInt32ToBytesMap().put(
+        8, ByteString.copyFrom(new byte[]{1, 2, 3}));
+    builder.getMutableInt32ToMessageMap().put(
+        8, NestedMessage.newBuilder().setValue(1234).build());
+    builder.getMutableInt32ToEnumMap().put(9, NestedEnum.BAR);
     TestMap message = builder.build();
 
     assertEquals(
         "{\n"
-            + "  \"int32ToInt32Map\": {\n"
-            + "    \"1\": 10\n"
-            + "  },\n"
-            + "  \"int64ToInt32Map\": {\n"
-            + "    \"1234567890123456789\": 10\n"
-            + "  },\n"
-            + "  \"uint32ToInt32Map\": {\n"
-            + "    \"2\": 20\n"
-            + "  },\n"
-            + "  \"uint64ToInt32Map\": {\n"
-            + "    \"2234567890123456789\": 20\n"
-            + "  },\n"
-            + "  \"sint32ToInt32Map\": {\n"
-            + "    \"3\": 30\n"
-            + "  },\n"
-            + "  \"sint64ToInt32Map\": {\n"
-            + "    \"3234567890123456789\": 30\n"
-            + "  },\n"
-            + "  \"fixed32ToInt32Map\": {\n"
-            + "    \"4\": 40\n"
-            + "  },\n"
-            + "  \"fixed64ToInt32Map\": {\n"
-            + "    \"4234567890123456789\": 40\n"
-            + "  },\n"
-            + "  \"sfixed32ToInt32Map\": {\n"
-            + "    \"5\": 50\n"
-            + "  },\n"
-            + "  \"sfixed64ToInt32Map\": {\n"
-            + "    \"5234567890123456789\": 50\n"
-            + "  },\n"
-            + "  \"boolToInt32Map\": {\n"
-            + "    \"false\": 6\n"
-            + "  },\n"
-            + "  \"stringToInt32Map\": {\n"
-            + "    \"Hello\": 10\n"
-            + "  },\n"
-            + "  \"int32ToInt64Map\": {\n"
-            + "    \"1\": \"1234567890123456789\"\n"
-            + "  },\n"
-            + "  \"int32ToUint32Map\": {\n"
-            + "    \"2\": 20\n"
-            + "  },\n"
-            + "  \"int32ToUint64Map\": {\n"
-            + "    \"2\": \"2234567890123456789\"\n"
-            + "  },\n"
-            + "  \"int32ToSint32Map\": {\n"
-            + "    \"3\": 30\n"
-            + "  },\n"
-            + "  \"int32ToSint64Map\": {\n"
-            + "    \"3\": \"3234567890123456789\"\n"
-            + "  },\n"
-            + "  \"int32ToFixed32Map\": {\n"
-            + "    \"4\": 40\n"
-            + "  },\n"
-            + "  \"int32ToFixed64Map\": {\n"
-            + "    \"4\": \"4234567890123456789\"\n"
-            + "  },\n"
-            + "  \"int32ToSfixed32Map\": {\n"
-            + "    \"5\": 50\n"
-            + "  },\n"
-            + "  \"int32ToSfixed64Map\": {\n"
-            + "    \"5\": \"5234567890123456789\"\n"
-            + "  },\n"
-            + "  \"int32ToFloatMap\": {\n"
-            + "    \"6\": 1.5\n"
-            + "  },\n"
-            + "  \"int32ToDoubleMap\": {\n"
-            + "    \"6\": 1.25\n"
-            + "  },\n"
-            + "  \"int32ToBoolMap\": {\n"
-            + "    \"7\": false\n"
-            + "  },\n"
-            + "  \"int32ToStringMap\": {\n"
-            + "    \"7\": \"World\"\n"
-            + "  },\n"
-            + "  \"int32ToBytesMap\": {\n"
-            + "    \"8\": \"AQID\"\n"
-            + "  },\n"
-            + "  \"int32ToMessageMap\": {\n"
-            + "    \"8\": {\n"
-            + "      \"value\": 1234\n"
-            + "    }\n"
-            + "  },\n"
-            + "  \"int32ToEnumMap\": {\n"
-            + "    \"9\": \"BAR\"\n"
-            + "  }\n"
-            + "}",
-        toJsonString(message));
+        + "  \"int32ToInt32Map\": {\n"
+        + "    \"1\": 10\n"
+        + "  },\n"
+        + "  \"int64ToInt32Map\": {\n"
+        + "    \"1234567890123456789\": 10\n"
+        + "  },\n"
+        + "  \"uint32ToInt32Map\": {\n"
+        + "    \"2\": 20\n"
+        + "  },\n"
+        + "  \"uint64ToInt32Map\": {\n"
+        + "    \"2234567890123456789\": 20\n"
+        + "  },\n"
+        + "  \"sint32ToInt32Map\": {\n"
+        + "    \"3\": 30\n"
+        + "  },\n"
+        + "  \"sint64ToInt32Map\": {\n"
+        + "    \"3234567890123456789\": 30\n"
+        + "  },\n"
+        + "  \"fixed32ToInt32Map\": {\n"
+        + "    \"4\": 40\n"
+        + "  },\n"
+        + "  \"fixed64ToInt32Map\": {\n"
+        + "    \"4234567890123456789\": 40\n"
+        + "  },\n"
+        + "  \"sfixed32ToInt32Map\": {\n"
+        + "    \"5\": 50\n"
+        + "  },\n"
+        + "  \"sfixed64ToInt32Map\": {\n"
+        + "    \"5234567890123456789\": 50\n"
+        + "  },\n"
+        + "  \"boolToInt32Map\": {\n"
+        + "    \"false\": 6\n"
+        + "  },\n"
+        + "  \"stringToInt32Map\": {\n"
+        + "    \"Hello\": 10\n"
+        + "  },\n"
+        + "  \"int32ToInt64Map\": {\n"
+        + "    \"1\": \"1234567890123456789\"\n"
+        + "  },\n"
+        + "  \"int32ToUint32Map\": {\n"
+        + "    \"2\": 20\n"
+        + "  },\n"
+        + "  \"int32ToUint64Map\": {\n"
+        + "    \"2\": \"2234567890123456789\"\n"
+        + "  },\n"
+        + "  \"int32ToSint32Map\": {\n"
+        + "    \"3\": 30\n"
+        + "  },\n"
+        + "  \"int32ToSint64Map\": {\n"
+        + "    \"3\": \"3234567890123456789\"\n"
+        + "  },\n"
+        + "  \"int32ToFixed32Map\": {\n"
+        + "    \"4\": 40\n"
+        + "  },\n"
+        + "  \"int32ToFixed64Map\": {\n"
+        + "    \"4\": \"4234567890123456789\"\n"
+        + "  },\n"
+        + "  \"int32ToSfixed32Map\": {\n"
+        + "    \"5\": 50\n"
+        + "  },\n"
+        + "  \"int32ToSfixed64Map\": {\n"
+        + "    \"5\": \"5234567890123456789\"\n"
+        + "  },\n"
+        + "  \"int32ToFloatMap\": {\n"
+        + "    \"6\": 1.5\n"
+        + "  },\n"
+        + "  \"int32ToDoubleMap\": {\n"
+        + "    \"6\": 1.25\n"
+        + "  },\n"
+        + "  \"int32ToBoolMap\": {\n"
+        + "    \"7\": false\n"
+        + "  },\n"
+        + "  \"int32ToStringMap\": {\n"
+        + "    \"7\": \"World\"\n"
+        + "  },\n"
+        + "  \"int32ToBytesMap\": {\n"
+        + "    \"8\": \"AQID\"\n"
+        + "  },\n"
+        + "  \"int32ToMessageMap\": {\n"
+        + "    \"8\": {\n"
+        + "      \"value\": 1234\n"
+        + "    }\n"
+        + "  },\n"
+        + "  \"int32ToEnumMap\": {\n"
+        + "    \"9\": \"BAR\"\n"
+        + "  }\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
 
     // Test multiple entries.
     builder = TestMap.newBuilder();
-    builder.putInt32ToInt32Map(1, 2);
-    builder.putInt32ToInt32Map(3, 4);
+    builder.getMutableInt32ToInt32Map().put(1, 2);
+    builder.getMutableInt32ToInt32Map().put(3, 4);
     message = builder.build();
 
     assertEquals(
-        "{\n" + "  \"int32ToInt32Map\": {\n" + "    \"1\": 2,\n" + "    \"3\": 4\n" + "  }\n" + "}",
-        toJsonString(message));
+        "{\n"
+        + "  \"int32ToInt32Map\": {\n"
+        + "    \"1\": 2,\n"
+        + "    \"3\": 4\n"
+        + "  }\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
   }
 
@@ -651,10 +621,9 @@
       TestMap.Builder builder = TestMap.newBuilder();
       mergeFromJson(
           "{\n"
-              + "  \"int32ToInt32Map\": {null: 1},\n"
-              + "  \"int32ToMessageMap\": {null: 2}\n"
-              + "}",
-          builder);
+          + "  \"int32ToInt32Map\": {null: 1},\n"
+          + "  \"int32ToMessageMap\": {null: 2}\n"
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
@@ -664,10 +633,9 @@
       TestMap.Builder builder = TestMap.newBuilder();
       mergeFromJson(
           "{\n"
-              + "  \"int32ToInt32Map\": {\"1\": null},\n"
-              + "  \"int32ToMessageMap\": {\"2\": null}\n"
-              + "}",
-          builder);
+          + "  \"int32ToInt32Map\": {\"1\": null},\n"
+          + "  \"int32ToMessageMap\": {\"2\": null}\n"
+          + "}", builder);
       fail();
     } catch (InvalidProtocolBufferException e) {
       // Exception expected.
@@ -677,7 +645,10 @@
   public void testParserAcceptNonQuotedObjectKey() throws Exception {
     TestMap.Builder builder = TestMap.newBuilder();
     mergeFromJson(
-        "{\n" + "  int32ToInt32Map: {1: 2},\n" + "  stringToInt32Map: {hello: 3}\n" + "}", builder);
+        "{\n"
+        + "  int32ToInt32Map: {1: 2},\n"
+        + "  stringToInt32Map: {hello: 3}\n"
+        + "}", builder);
     TestMap message = builder.build();
     assertEquals(2, message.getInt32ToInt32Map().get(1).intValue());
     assertEquals(3, message.getStringToInt32Map().get("hello").intValue());
@@ -698,17 +669,16 @@
 
     assertEquals(
         "{\n"
-            + "  \"int32Value\": 0,\n"
-            + "  \"uint32Value\": 0,\n"
-            + "  \"int64Value\": \"0\",\n"
-            + "  \"uint64Value\": \"0\",\n"
-            + "  \"floatValue\": 0.0,\n"
-            + "  \"doubleValue\": 0.0,\n"
-            + "  \"boolValue\": false,\n"
-            + "  \"stringValue\": \"\",\n"
-            + "  \"bytesValue\": \"\"\n"
-            + "}",
-        toJsonString(message));
+        + "  \"int32Value\": 0,\n"
+        + "  \"uint32Value\": 0,\n"
+        + "  \"int64Value\": \"0\",\n"
+        + "  \"uint64Value\": \"0\",\n"
+        + "  \"floatValue\": 0.0,\n"
+        + "  \"doubleValue\": 0.0,\n"
+        + "  \"boolValue\": false,\n"
+        + "  \"stringValue\": \"\",\n"
+        + "  \"bytesValue\": \"\"\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
 
     builder = TestWrappers.newBuilder();
@@ -720,52 +690,57 @@
     builder.getFloatValueBuilder().setValue(5.0f);
     builder.getDoubleValueBuilder().setValue(6.0);
     builder.getStringValueBuilder().setValue("7");
-    builder.getBytesValueBuilder().setValue(ByteString.copyFrom(new byte[] {8}));
+    builder.getBytesValueBuilder().setValue(ByteString.copyFrom(new byte[]{8}));
     message = builder.build();
 
     assertEquals(
         "{\n"
-            + "  \"int32Value\": 1,\n"
-            + "  \"uint32Value\": 3,\n"
-            + "  \"int64Value\": \"2\",\n"
-            + "  \"uint64Value\": \"4\",\n"
-            + "  \"floatValue\": 5.0,\n"
-            + "  \"doubleValue\": 6.0,\n"
-            + "  \"boolValue\": true,\n"
-            + "  \"stringValue\": \"7\",\n"
-            + "  \"bytesValue\": \"CA==\"\n"
-            + "}",
-        toJsonString(message));
+        + "  \"int32Value\": 1,\n"
+        + "  \"uint32Value\": 3,\n"
+        + "  \"int64Value\": \"2\",\n"
+        + "  \"uint64Value\": \"4\",\n"
+        + "  \"floatValue\": 5.0,\n"
+        + "  \"doubleValue\": 6.0,\n"
+        + "  \"boolValue\": true,\n"
+        + "  \"stringValue\": \"7\",\n"
+        + "  \"bytesValue\": \"CA==\"\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
   }
 
   public void testTimestamp() throws Exception {
-    TestTimestamp message =
-        TestTimestamp.newBuilder()
-            .setTimestampValue(Timestamps.parse("1970-01-01T00:00:00Z"))
-            .build();
+    TestTimestamp message = TestTimestamp.newBuilder()
+        .setTimestampValue(TimeUtil.parseTimestamp("1970-01-01T00:00:00Z"))
+        .build();
 
     assertEquals(
-        "{\n" + "  \"timestampValue\": \"1970-01-01T00:00:00Z\"\n" + "}", toJsonString(message));
+        "{\n"
+        + "  \"timestampValue\": \"1970-01-01T00:00:00Z\"\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
   }
 
   public void testDuration() throws Exception {
-    TestDuration message =
-        TestDuration.newBuilder().setDurationValue(Durations.parse("12345s")).build();
+    TestDuration message = TestDuration.newBuilder()
+        .setDurationValue(TimeUtil.parseDuration("12345s"))
+        .build();
 
-    assertEquals("{\n" + "  \"durationValue\": \"12345s\"\n" + "}", toJsonString(message));
+    assertEquals(
+        "{\n"
+        + "  \"durationValue\": \"12345s\"\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
   }
 
   public void testFieldMask() throws Exception {
-    TestFieldMask message =
-        TestFieldMask.newBuilder()
-            .setFieldMaskValue(FieldMaskUtil.fromString("foo.bar,baz,foo_bar.baz"))
-            .build();
+    TestFieldMask message = TestFieldMask.newBuilder()
+        .setFieldMaskValue(FieldMaskUtil.fromString("foo.bar,baz"))
+        .build();
 
     assertEquals(
-        "{\n" + "  \"fieldMaskValue\": \"foo.bar,baz,fooBar.baz\"\n" + "}", toJsonString(message));
+        "{\n"
+        + "  \"fieldMaskValue\": \"foo.bar,baz\"\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
   }
 
@@ -773,39 +748,45 @@
     // Build a struct with all possible values.
     TestStruct.Builder builder = TestStruct.newBuilder();
     Struct.Builder structBuilder = builder.getStructValueBuilder();
-    structBuilder.putFields("null_value", Value.newBuilder().setNullValueValue(0).build());
-    structBuilder.putFields("number_value", Value.newBuilder().setNumberValue(1.25).build());
-    structBuilder.putFields("string_value", Value.newBuilder().setStringValue("hello").build());
+    structBuilder.getMutableFields().put(
+        "null_value", Value.newBuilder().setNullValueValue(0).build());
+    structBuilder.getMutableFields().put(
+        "number_value", Value.newBuilder().setNumberValue(1.25).build());
+    structBuilder.getMutableFields().put(
+        "string_value", Value.newBuilder().setStringValue("hello").build());
     Struct.Builder subStructBuilder = Struct.newBuilder();
-    subStructBuilder.putFields("number_value", Value.newBuilder().setNumberValue(1234).build());
-    structBuilder.putFields(
+    subStructBuilder.getMutableFields().put(
+        "number_value", Value.newBuilder().setNumberValue(1234).build());
+    structBuilder.getMutableFields().put(
         "struct_value", Value.newBuilder().setStructValue(subStructBuilder.build()).build());
     ListValue.Builder listBuilder = ListValue.newBuilder();
     listBuilder.addValues(Value.newBuilder().setNumberValue(1.125).build());
     listBuilder.addValues(Value.newBuilder().setNullValueValue(0).build());
-    structBuilder.putFields(
+    structBuilder.getMutableFields().put(
         "list_value", Value.newBuilder().setListValue(listBuilder.build()).build());
     TestStruct message = builder.build();
 
     assertEquals(
         "{\n"
-            + "  \"structValue\": {\n"
-            + "    \"null_value\": null,\n"
-            + "    \"number_value\": 1.25,\n"
-            + "    \"string_value\": \"hello\",\n"
-            + "    \"struct_value\": {\n"
-            + "      \"number_value\": 1234.0\n"
-            + "    },\n"
-            + "    \"list_value\": [1.125, null]\n"
-            + "  }\n"
-            + "}",
-        toJsonString(message));
+        + "  \"structValue\": {\n"
+        + "    \"null_value\": null,\n"
+        + "    \"number_value\": 1.25,\n"
+        + "    \"string_value\": \"hello\",\n"
+        + "    \"struct_value\": {\n"
+        + "      \"number_value\": 1234.0\n"
+        + "    },\n"
+        + "    \"list_value\": [1.125, null]\n"
+        + "  }\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
 
     builder = TestStruct.newBuilder();
     builder.setValue(Value.newBuilder().setNullValueValue(0).build());
     message = builder.build();
-    assertEquals("{\n" + "  \"value\": null\n" + "}", toJsonString(message));
+    assertEquals(
+        "{\n"
+        + "  \"value\": null\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
 
     builder = TestStruct.newBuilder();
@@ -813,7 +794,10 @@
     listBuilder.addValues(Value.newBuilder().setNumberValue(31831.125).build());
     listBuilder.addValues(Value.newBuilder().setNullValueValue(0).build());
     message = builder.build();
-    assertEquals("{\n" + "  \"listValue\": [31831.125, null]\n" + "}", toJsonString(message));
+    assertEquals(
+        "{\n"
+        + "  \"listValue\": [31831.125, null]\n"
+        + "}", toJsonString(message));
     assertRoundTripEquals(message);
   }
 
@@ -829,28 +813,19 @@
       // Expected.
     }
 
-    JsonFormat.TypeRegistry registry =
-        JsonFormat.TypeRegistry.newBuilder().add(TestAllTypes.getDescriptor()).build();
+    JsonFormat.TypeRegistry registry = JsonFormat.TypeRegistry.newBuilder()
+        .add(TestAllTypes.getDescriptor()).build();
     JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry);
 
     assertEquals(
         "{\n"
-            + "  \"anyValue\": {\n"
-            + "    \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n"
-            + "    \"optionalInt32\": 1234\n"
-            + "  }\n"
-            + "}",
-        printer.print(message));
+        + "  \"anyValue\": {\n"
+        + "    \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n"
+        + "    \"optionalInt32\": 1234\n"
+        + "  }\n"
+        + "}" , printer.print(message));
     assertRoundTripEquals(message, registry);
 
-    TestAny messageWithDefaultAnyValue =
-        TestAny.newBuilder().setAnyValue(Any.getDefaultInstance()).build();
-    assertEquals(
-        "{\n"
-            + "  \"anyValue\": {}\n"
-            + "}",
-        printer.print(messageWithDefaultAnyValue));
-    assertRoundTripEquals(messageWithDefaultAnyValue, registry);
 
     // Well-known types have a special formatting when embedded in Any.
     //
@@ -858,240 +833,138 @@
     Any anyMessage = Any.pack(Any.pack(content));
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n"
-            + "  \"value\": {\n"
-            + "    \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n"
-            + "    \"optionalInt32\": 1234\n"
-            + "  }\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n"
+        + "  \"value\": {\n"
+        + "    \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n"
+        + "    \"optionalInt32\": 1234\n"
+        + "  }\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
 
     // 2. Wrappers in Any.
     anyMessage = Any.pack(Int32Value.newBuilder().setValue(12345).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Int32Value\",\n"
-            + "  \"value\": 12345\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Int32Value\",\n"
+        + "  \"value\": 12345\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(UInt32Value.newBuilder().setValue(12345).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.UInt32Value\",\n"
-            + "  \"value\": 12345\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.UInt32Value\",\n"
+        + "  \"value\": 12345\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(Int64Value.newBuilder().setValue(12345).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Int64Value\",\n"
-            + "  \"value\": \"12345\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Int64Value\",\n"
+        + "  \"value\": \"12345\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(UInt64Value.newBuilder().setValue(12345).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.UInt64Value\",\n"
-            + "  \"value\": \"12345\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.UInt64Value\",\n"
+        + "  \"value\": \"12345\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(FloatValue.newBuilder().setValue(12345).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.FloatValue\",\n"
-            + "  \"value\": 12345.0\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.FloatValue\",\n"
+        + "  \"value\": 12345.0\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(DoubleValue.newBuilder().setValue(12345).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.DoubleValue\",\n"
-            + "  \"value\": 12345.0\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.DoubleValue\",\n"
+        + "  \"value\": 12345.0\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(BoolValue.newBuilder().setValue(true).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.BoolValue\",\n"
-            + "  \"value\": true\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.BoolValue\",\n"
+        + "  \"value\": true\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
     anyMessage = Any.pack(StringValue.newBuilder().setValue("Hello").build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.StringValue\",\n"
-            + "  \"value\": \"Hello\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.StringValue\",\n"
+        + "  \"value\": \"Hello\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
-    anyMessage =
-        Any.pack(BytesValue.newBuilder().setValue(ByteString.copyFrom(new byte[] {1, 2})).build());
+    anyMessage = Any.pack(BytesValue.newBuilder().setValue(
+        ByteString.copyFrom(new byte[]{1, 2})).build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.BytesValue\",\n"
-            + "  \"value\": \"AQI=\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.BytesValue\",\n"
+        + "  \"value\": \"AQI=\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
 
     // 3. Timestamp in Any.
-    anyMessage = Any.pack(Timestamps.parse("1969-12-31T23:59:59Z"));
+    anyMessage = Any.pack(TimeUtil.parseTimestamp("1969-12-31T23:59:59Z"));
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\",\n"
-            + "  \"value\": \"1969-12-31T23:59:59Z\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\",\n"
+        + "  \"value\": \"1969-12-31T23:59:59Z\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
 
     // 4. Duration in Any
-    anyMessage = Any.pack(Durations.parse("12345.10s"));
+    anyMessage = Any.pack(TimeUtil.parseDuration("12345.10s"));
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n"
-            + "  \"value\": \"12345.100s\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n"
+        + "  \"value\": \"12345.100s\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
 
     // 5. FieldMask in Any
     anyMessage = Any.pack(FieldMaskUtil.fromString("foo.bar,baz"));
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.FieldMask\",\n"
-            + "  \"value\": \"foo.bar,baz\"\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.FieldMask\",\n"
+        + "  \"value\": \"foo.bar,baz\"\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
 
     // 6. Struct in Any
     Struct.Builder structBuilder = Struct.newBuilder();
-    structBuilder.putFields("number", Value.newBuilder().setNumberValue(1.125).build());
+    structBuilder.getMutableFields().put(
+        "number", Value.newBuilder().setNumberValue(1.125).build());
     anyMessage = Any.pack(structBuilder.build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Struct\",\n"
-            + "  \"value\": {\n"
-            + "    \"number\": 1.125\n"
-            + "  }\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Struct\",\n"
+        + "  \"value\": {\n"
+        + "    \"number\": 1.125\n"
+        + "  }\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
-
-    // 7. Value (number type) in Any
     Value.Builder valueBuilder = Value.newBuilder();
     valueBuilder.setNumberValue(1);
     anyMessage = Any.pack(valueBuilder.build());
     assertEquals(
         "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n"
-            + "  \"value\": 1.0\n"
-            + "}",
-        printer.print(anyMessage));
+        + "  \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n"
+        + "  \"value\": 1.0\n"
+        + "}", printer.print(anyMessage));
     assertRoundTripEquals(anyMessage, registry);
-
-    // 8. Value (null type) in Any
-    anyMessage = Any.pack(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
-    assertEquals(
-        "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n"
-            + "  \"value\": null\n"
-            + "}",
-        printer.print(anyMessage));
-    assertRoundTripEquals(anyMessage, registry);
-  }
-
-  public void testAnyInMaps() throws Exception {
-    JsonFormat.TypeRegistry registry =
-        JsonFormat.TypeRegistry.newBuilder().add(TestAllTypes.getDescriptor()).build();
-    JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry);
-
-    TestAny.Builder testAny = TestAny.newBuilder();
-    testAny.putAnyMap("int32_wrapper", Any.pack(Int32Value.newBuilder().setValue(123).build()));
-    testAny.putAnyMap("int64_wrapper", Any.pack(Int64Value.newBuilder().setValue(456).build()));
-    testAny.putAnyMap("timestamp", Any.pack(Timestamps.parse("1969-12-31T23:59:59Z")));
-    testAny.putAnyMap("duration", Any.pack(Durations.parse("12345.1s")));
-    testAny.putAnyMap("field_mask", Any.pack(FieldMaskUtil.fromString("foo.bar,baz")));
-    Value numberValue = Value.newBuilder().setNumberValue(1.125).build();
-    Struct.Builder struct = Struct.newBuilder();
-    struct.putFields("number", numberValue);
-    testAny.putAnyMap("struct", Any.pack(struct.build()));
-    Value nullValue = Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build();
-    testAny.putAnyMap(
-        "list_value",
-        Any.pack(ListValue.newBuilder().addValues(numberValue).addValues(nullValue).build()));
-    testAny.putAnyMap("number_value", Any.pack(numberValue));
-    testAny.putAnyMap("any_value_number", Any.pack(Any.pack(numberValue)));
-    testAny.putAnyMap("any_value_default", Any.pack(Any.getDefaultInstance()));
-    testAny.putAnyMap("default", Any.getDefaultInstance());
-
-    assertEquals(
-        "{\n"
-            + "  \"anyMap\": {\n"
-            + "    \"int32_wrapper\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Int32Value\",\n"
-            + "      \"value\": 123\n"
-            + "    },\n"
-            + "    \"int64_wrapper\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Int64Value\",\n"
-            + "      \"value\": \"456\"\n"
-            + "    },\n"
-            + "    \"timestamp\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\",\n"
-            + "      \"value\": \"1969-12-31T23:59:59Z\"\n"
-            + "    },\n"
-            + "    \"duration\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n"
-            + "      \"value\": \"12345.100s\"\n"
-            + "    },\n"
-            + "    \"field_mask\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.FieldMask\",\n"
-            + "      \"value\": \"foo.bar,baz\"\n"
-            + "    },\n"
-            + "    \"struct\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Struct\",\n"
-            + "      \"value\": {\n"
-            + "        \"number\": 1.125\n"
-            + "      }\n"
-            + "    },\n"
-            + "    \"list_value\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.ListValue\",\n"
-            + "      \"value\": [1.125, null]\n"
-            + "    },\n"
-            + "    \"number_value\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n"
-            + "      \"value\": 1.125\n"
-            + "    },\n"
-            + "    \"any_value_number\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n"
-            + "      \"value\": {\n"
-            + "        \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n"
-            + "        \"value\": 1.125\n"
-            + "      }\n"
-            + "    },\n"
-            + "    \"any_value_default\": {\n"
-            + "      \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n"
-            + "      \"value\": {}\n"
-            + "    },\n"
-            + "    \"default\": {}\n"
-            + "  }\n"
-            + "}",
-        printer.print(testAny.build()));
-    assertRoundTripEquals(testAny.build(), registry);
   }
 
   public void testParserMissingTypeUrl() throws Exception {
     try {
       Any.Builder builder = Any.newBuilder();
-      mergeFromJson("{\n" + "  \"optionalInt32\": 1234\n" + "}", builder);
+      mergeFromJson(
+          "{\n"
+          + "  \"optionalInt32\": 1234\n"
+          + "}", builder);
       fail("Exception is expected.");
     } catch (IOException e) {
       // Expected.
@@ -1100,13 +973,12 @@
 
   public void testParserUnexpectedTypeUrl() throws Exception {
     try {
-      Any.Builder builder = Any.newBuilder();
+      TestAllTypes.Builder builder = TestAllTypes.newBuilder();
       mergeFromJson(
           "{\n"
-              + "  \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n"
-              + "  \"optionalInt32\": 12345\n"
-              + "}",
-          builder);
+          + "  \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n"
+          + "  \"optionalInt32\": 12345\n"
+          + "}", builder);
       fail("Exception is expected.");
     } catch (IOException e) {
       // Expected.
@@ -1116,7 +988,10 @@
   public void testParserRejectTrailingComma() throws Exception {
     try {
       TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-      mergeFromJson("{\n" + "  \"optionalInt32\": 12345,\n" + "}", builder);
+      mergeFromJson(
+          "{\n"
+          + "  \"optionalInt32\": 12345,\n"
+          + "}", builder);
       fail("Exception is expected.");
     } catch (IOException e) {
       // Expected.
@@ -1140,40 +1015,23 @@
 
   public void testParserRejectInvalidBase64() throws Exception {
     assertRejects("optionalBytes", "!@#$");
-  }
-
-  public void testParserAcceptBase64Variants() throws Exception {
-    assertAccepts("optionalBytes", "AQI");  // No padding
-    assertAccepts("optionalBytes", "-_w");  // base64Url, no padding
+    // We use standard BASE64 with paddings.
+    assertRejects("optionalBytes", "AQI");
   }
 
   public void testParserRejectInvalidEnumValue() throws Exception {
     try {
       TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-      mergeFromJson("{\n" + "  \"optionalNestedEnum\": \"XXX\"\n" + "}", builder);
+      mergeFromJson(
+          "{\n"
+          + "  \"optionalNestedEnum\": \"XXX\"\n"
+          + "}", builder);
       fail("Exception is expected.");
     } catch (InvalidProtocolBufferException e) {
       // Expected.
     }
   }
 
-  public void testParserUnknownFields() throws Exception {
-    try {
-      TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-      String json = "{\n" + "  \"unknownField\": \"XXX\"\n" + "}";
-      JsonFormat.parser().merge(json, builder);
-      fail("Exception is expected.");
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  public void testParserIgnoringUnknownFields() throws Exception {
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    String json = "{\n" + "  \"unknownField\": \"XXX\"\n" + "}";
-    JsonFormat.parser().ignoringUnknownFields().merge(json, builder);
-  }
-
   public void testCustomJsonName() throws Exception {
     TestCustomJsonName message = TestCustomJsonName.newBuilder().setValue(12345).build();
     assertEquals("{\n" + "  \"@value\": 12345\n" + "}", JsonFormat.printer().print(message));
@@ -1227,115 +1085,6 @@
             + "}",
         JsonFormat.printer().includingDefaultValueFields().print(message));
 
-    Set<FieldDescriptor> fixedFields = new HashSet<FieldDescriptor>();
-    for (FieldDescriptor fieldDesc : TestAllTypes.getDescriptor().getFields()) {
-      if (fieldDesc.getName().contains("_fixed")) {
-        fixedFields.add(fieldDesc);
-      }
-    }
-
-    assertEquals(
-        "{\n"
-            + "  \"optionalFixed32\": 0,\n"
-            + "  \"optionalFixed64\": \"0\",\n"
-            + "  \"repeatedFixed32\": [],\n"
-            + "  \"repeatedFixed64\": []\n"
-            + "}",
-        JsonFormat.printer().includingDefaultValueFields(fixedFields).print(message));
-
-    TestAllTypes messageNonDefaults =
-        message.toBuilder().setOptionalInt64(1234).setOptionalFixed32(3232).build();
-    assertEquals(
-        "{\n"
-            + "  \"optionalInt64\": \"1234\",\n"
-            + "  \"optionalFixed32\": 3232,\n"
-            + "  \"optionalFixed64\": \"0\",\n"
-            + "  \"repeatedFixed32\": [],\n"
-            + "  \"repeatedFixed64\": []\n"
-            + "}",
-        JsonFormat.printer().includingDefaultValueFields(fixedFields).print(messageNonDefaults));
-
-    try {
-      JsonFormat.printer().includingDefaultValueFields().includingDefaultValueFields();
-      fail("IllegalStateException is expected.");
-    } catch (IllegalStateException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
-    try {
-      JsonFormat.printer().includingDefaultValueFields().includingDefaultValueFields(fixedFields);
-      fail("IllegalStateException is expected.");
-    } catch (IllegalStateException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
-    try {
-      JsonFormat.printer().includingDefaultValueFields(fixedFields).includingDefaultValueFields();
-      fail("IllegalStateException is expected.");
-    } catch (IllegalStateException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
-    try {
-      JsonFormat.printer()
-          .includingDefaultValueFields(fixedFields)
-          .includingDefaultValueFields(fixedFields);
-      fail("IllegalStateException is expected.");
-    } catch (IllegalStateException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
-    Set<FieldDescriptor> intFields = new HashSet<FieldDescriptor>();
-    for (FieldDescriptor fieldDesc : TestAllTypes.getDescriptor().getFields()) {
-      if (fieldDesc.getName().contains("_int")) {
-        intFields.add(fieldDesc);
-      }
-    }
-
-    try {
-      JsonFormat.printer()
-          .includingDefaultValueFields(intFields)
-          .includingDefaultValueFields(fixedFields);
-      fail("IllegalStateException is expected.");
-    } catch (IllegalStateException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
-    try {
-      JsonFormat.printer().includingDefaultValueFields(null);
-      fail("IllegalArgumentException is expected.");
-    } catch (IllegalArgumentException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
-    try {
-      JsonFormat.printer().includingDefaultValueFields(Collections.<FieldDescriptor>emptySet());
-      fail("IllegalArgumentException is expected.");
-    } catch (IllegalArgumentException e) {
-      // Expected.
-      assertTrue(
-          "Exception message should mention includingDefaultValueFields.",
-          e.getMessage().contains("includingDefaultValueFields"));
-    }
-
     TestMap mapMessage = TestMap.getDefaultInstance();
     assertEquals("{\n}", JsonFormat.printer().print(mapMessage));
     assertEquals(
@@ -1398,24 +1147,6 @@
             + "  }\n"
             + "}",
         JsonFormat.printer().includingDefaultValueFields().print(mapMessage));
-
-    TestOneof oneofMessage = TestOneof.getDefaultInstance();
-    assertEquals("{\n}", JsonFormat.printer().print(oneofMessage));
-    assertEquals("{\n}", JsonFormat.printer().includingDefaultValueFields().print(oneofMessage));
-
-    oneofMessage = TestOneof.newBuilder().setOneofInt32(42).build();
-    assertEquals("{\n  \"oneofInt32\": 42\n}", JsonFormat.printer().print(oneofMessage));
-    assertEquals(
-        "{\n  \"oneofInt32\": 42\n}",
-        JsonFormat.printer().includingDefaultValueFields().print(oneofMessage));
-
-    TestOneof.Builder oneofBuilder = TestOneof.newBuilder();
-    mergeFromJson("{\n" + "  \"oneofNullValue\": null \n" + "}", oneofBuilder);
-    oneofMessage = oneofBuilder.build();
-    assertEquals("{\n  \"oneofNullValue\": null\n}", JsonFormat.printer().print(oneofMessage));
-    assertEquals(
-        "{\n  \"oneofNullValue\": null\n}",
-        JsonFormat.printer().includingDefaultValueFields().print(oneofMessage));
   }
 
   public void testPreservingProtoFieldNames() throws Exception {
@@ -1440,138 +1171,4 @@
     JsonFormat.parser().merge("{\"optional_int32\": 54321}", builder);
     assertEquals(54321, builder.getOptionalInt32());
   }
-
-  public void testOmittingInsignificantWhiteSpace() throws Exception {
-    TestAllTypes message = TestAllTypes.newBuilder().setOptionalInt32(12345).build();
-    assertEquals(
-        "{" + "\"optionalInt32\":12345" + "}",
-        JsonFormat.printer().omittingInsignificantWhitespace().print(message));
-    TestAllTypes message1 = TestAllTypes.getDefaultInstance();
-    assertEquals("{}", JsonFormat.printer().omittingInsignificantWhitespace().print(message1));
-    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-    setAllFields(builder);
-    TestAllTypes message2 = builder.build();
-    assertEquals(
-        "{"
-            + "\"optionalInt32\":1234,"
-            + "\"optionalInt64\":\"1234567890123456789\","
-            + "\"optionalUint32\":5678,"
-            + "\"optionalUint64\":\"2345678901234567890\","
-            + "\"optionalSint32\":9012,"
-            + "\"optionalSint64\":\"3456789012345678901\","
-            + "\"optionalFixed32\":3456,"
-            + "\"optionalFixed64\":\"4567890123456789012\","
-            + "\"optionalSfixed32\":7890,"
-            + "\"optionalSfixed64\":\"5678901234567890123\","
-            + "\"optionalFloat\":1.5,"
-            + "\"optionalDouble\":1.25,"
-            + "\"optionalBool\":true,"
-            + "\"optionalString\":\"Hello world!\","
-            + "\"optionalBytes\":\"AAEC\","
-            + "\"optionalNestedMessage\":{"
-            + "\"value\":100"
-            + "},"
-            + "\"optionalNestedEnum\":\"BAR\","
-            + "\"repeatedInt32\":[1234,234],"
-            + "\"repeatedInt64\":[\"1234567890123456789\",\"234567890123456789\"],"
-            + "\"repeatedUint32\":[5678,678],"
-            + "\"repeatedUint64\":[\"2345678901234567890\",\"345678901234567890\"],"
-            + "\"repeatedSint32\":[9012,10],"
-            + "\"repeatedSint64\":[\"3456789012345678901\",\"456789012345678901\"],"
-            + "\"repeatedFixed32\":[3456,456],"
-            + "\"repeatedFixed64\":[\"4567890123456789012\",\"567890123456789012\"],"
-            + "\"repeatedSfixed32\":[7890,890],"
-            + "\"repeatedSfixed64\":[\"5678901234567890123\",\"678901234567890123\"],"
-            + "\"repeatedFloat\":[1.5,11.5],"
-            + "\"repeatedDouble\":[1.25,11.25],"
-            + "\"repeatedBool\":[true,true],"
-            + "\"repeatedString\":[\"Hello world!\",\"ello world!\"],"
-            + "\"repeatedBytes\":[\"AAEC\",\"AQI=\"],"
-            + "\"repeatedNestedMessage\":[{"
-            + "\"value\":100"
-            + "},{"
-            + "\"value\":200"
-            + "}],"
-            + "\"repeatedNestedEnum\":[\"BAR\",\"BAZ\"]"
-            + "}",
-        toCompactJsonString(message2));
-  }
-
-  // Regression test for b/29892357
-  public void testEmptyWrapperTypesInAny() throws Exception {
-    JsonFormat.TypeRegistry registry =
-        JsonFormat.TypeRegistry.newBuilder().add(TestAllTypes.getDescriptor()).build();
-    JsonFormat.Parser parser = JsonFormat.parser().usingTypeRegistry(registry);
-
-    Any.Builder builder = Any.newBuilder();
-    parser.merge(
-        "{\n"
-            + "  \"@type\": \"type.googleapis.com/google.protobuf.BoolValue\",\n"
-            + "  \"value\": false\n"
-            + "}\n",
-        builder);
-    Any any = builder.build();
-    assertEquals(0, any.getValue().size());
-  }
-
-  public void testRecursionLimit() throws Exception {
-    String input =
-        "{\n"
-            + "  \"nested\": {\n"
-            + "    \"nested\": {\n"
-            + "      \"nested\": {\n"
-            + "        \"nested\": {\n"
-            + "          \"value\": 1234\n"
-            + "        }\n"
-            + "      }\n"
-            + "    }\n"
-            + "  }\n"
-            + "}\n";
-
-    JsonFormat.Parser parser = JsonFormat.parser();
-    TestRecursive.Builder builder = TestRecursive.newBuilder();
-    parser.merge(input, builder);
-    TestRecursive message = builder.build();
-    assertEquals(1234, message.getNested().getNested().getNested().getNested().getValue());
-
-    parser = JsonFormat.parser().usingRecursionLimit(3);
-    builder = TestRecursive.newBuilder();
-    try {
-      parser.merge(input, builder);
-      fail("Exception is expected.");
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  // Test that we are not leaking out JSON exceptions.
-  public void testJsonException() throws Exception {
-    InputStream throwingInputStream =
-        new InputStream() {
-          public int read() throws IOException {
-            throw new IOException("12345");
-          }
-        };
-    InputStreamReader throwingReader = new InputStreamReader(throwingInputStream);
-    // When the underlying reader throws IOException, JsonFormat should forward
-    // through this IOException.
-    try {
-      TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-      JsonFormat.parser().merge(throwingReader, builder);
-      fail("Exception is expected.");
-    } catch (IOException e) {
-      assertEquals("12345", e.getMessage());
-    }
-
-    Reader invalidJsonReader = new StringReader("{ xxx - yyy }");
-    // When the JSON parser throws parser exceptions, JsonFormat should turn
-    // that into InvalidProtocolBufferException.
-    try {
-      TestAllTypes.Builder builder = TestAllTypes.newBuilder();
-      JsonFormat.parser().merge(invalidJsonReader, builder);
-      fail("Exception is expected.");
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
 }
diff --git a/java/util/src/test/java/com/google/protobuf/util/TimeUtilTest.java b/java/util/src/test/java/com/google/protobuf/util/TimeUtilTest.java
index 5af83d8..4c31b2b 100644
--- a/java/util/src/test/java/com/google/protobuf/util/TimeUtilTest.java
+++ b/java/util/src/test/java/com/google/protobuf/util/TimeUtilTest.java
@@ -32,11 +32,14 @@
 
 import com.google.protobuf.Duration;
 import com.google.protobuf.Timestamp;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
-import junit.framework.TestCase;
-import org.junit.Assert;
 
 /** Unit tests for {@link TimeUtil}. */
 public class TimeUtilTest extends TestCase {
@@ -81,7 +84,6 @@
   private class ParseTimestampThread extends Thread {
     private final String[] strings;
     private final Timestamp[] values;
-
     public ParseTimestampThread(String[] strings, Timestamp[] values) {
       this.strings = strings;
       this.values = values;
@@ -100,8 +102,8 @@
         }
         if (result.getSeconds() != values[index].getSeconds()
             || result.getNanos() != values[index].getNanos()) {
-          errorMessage =
-              "Actual result: " + result.toString() + ", expected: " + values[index].toString();
+          errorMessage = "Actual result: " + result.toString() + ", expected: "
+              + values[index].toString();
           break;
         }
         index = (index + 1) % strings.length;
@@ -110,26 +112,26 @@
   }
 
   public void testTimestampConcurrentParsing() throws Exception {
-    String[] timestampStrings =
-        new String[] {
-          "0001-01-01T00:00:00Z",
-          "9999-12-31T23:59:59.999999999Z",
-          "1970-01-01T00:00:00Z",
-          "1969-12-31T23:59:59.999Z",
-        };
+    String[] timestampStrings = new String[]{
+      "0001-01-01T00:00:00Z",
+      "9999-12-31T23:59:59.999999999Z",
+      "1970-01-01T00:00:00Z",
+      "1969-12-31T23:59:59.999Z",
+    };
     Timestamp[] timestampValues = new Timestamp[timestampStrings.length];
     for (int i = 0; i < timestampStrings.length; i++) {
       timestampValues[i] = TimeUtil.parseTimestamp(timestampStrings[i]);
     }
 
     final int THREAD_COUNT = 16;
-    final int RUNNING_TIME = 5000; // in milliseconds.
+    final int RUNNING_TIME = 5000;  // in milliseconds.
     final List<Thread> threads = new ArrayList<Thread>();
 
     stopParsingThreads = false;
     errorMessage = "";
     for (int i = 0; i < THREAD_COUNT; i++) {
-      Thread thread = new ParseTimestampThread(timestampStrings, timestampValues);
+      Thread thread = new ParseTimestampThread(
+          timestampStrings, timestampValues);
       thread.start();
       threads.add(thread);
     }
@@ -144,8 +146,8 @@
   public void testTimetampInvalidFormat() throws Exception {
     try {
       // Value too small.
-      Timestamp value =
-          Timestamp.newBuilder().setSeconds(TimeUtil.TIMESTAMP_SECONDS_MIN - 1).build();
+      Timestamp value = Timestamp.newBuilder()
+        .setSeconds(TimeUtil.TIMESTAMP_SECONDS_MIN - 1).build();
       TimeUtil.toString(value);
       Assert.fail("Exception is expected.");
     } catch (IllegalArgumentException e) {
@@ -154,14 +156,14 @@
 
     try {
       // Value too large.
-      Timestamp value =
-          Timestamp.newBuilder().setSeconds(TimeUtil.TIMESTAMP_SECONDS_MAX + 1).build();
+      Timestamp value = Timestamp.newBuilder()
+        .setSeconds(TimeUtil.TIMESTAMP_SECONDS_MAX + 1).build();
       TimeUtil.toString(value);
       Assert.fail("Exception is expected.");
     } catch (IllegalArgumentException e) {
       // Expected.
     }
-
+    
     try {
       // Invalid nanos value.
       Timestamp value = Timestamp.newBuilder().setNanos(-1).build();
@@ -277,7 +279,8 @@
   public void testDurationInvalidFormat() throws Exception {
     try {
       // Value too small.
-      Duration value = Duration.newBuilder().setSeconds(TimeUtil.DURATION_SECONDS_MIN - 1).build();
+      Duration value = Duration.newBuilder()
+        .setSeconds(TimeUtil.DURATION_SECONDS_MIN - 1).build();
       TimeUtil.toString(value);
       Assert.fail("Exception is expected.");
     } catch (IllegalArgumentException e) {
@@ -286,7 +289,18 @@
 
     try {
       // Value too large.
-      Duration value = Duration.newBuilder().setSeconds(TimeUtil.DURATION_SECONDS_MAX + 1).build();
+      Duration value = Duration.newBuilder()
+        .setSeconds(TimeUtil.DURATION_SECONDS_MAX + 1).build();
+      TimeUtil.toString(value);
+      Assert.fail("Exception is expected.");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+    
+    try {
+      // Invalid nanos value.
+      Duration value = Duration.newBuilder().setSeconds(1).setNanos(-1)
+          .build();
       TimeUtil.toString(value);
       Assert.fail("Exception is expected.");
     } catch (IllegalArgumentException e) {
@@ -295,16 +309,8 @@
 
     try {
       // Invalid nanos value.
-      Duration value = Duration.newBuilder().setSeconds(1).setNanos(-1).build();
-      TimeUtil.toString(value);
-      Assert.fail("Exception is expected.");
-    } catch (IllegalArgumentException e) {
-      // Expected.
-    }
-
-    try {
-      // Invalid nanos value.
-      Duration value = Duration.newBuilder().setSeconds(-1).setNanos(1).build();
+      Duration value = Duration.newBuilder().setSeconds(-1).setNanos(1)
+          .build();
       TimeUtil.toString(value);
       Assert.fail("Exception is expected.");
     } catch (IllegalArgumentException e) {
@@ -361,7 +367,8 @@
   }
 
   public void testTimestampConversion() throws Exception {
-    Timestamp timestamp = TimeUtil.parseTimestamp("1970-01-01T00:00:01.111111111Z");
+    Timestamp timestamp =
+      TimeUtil.parseTimestamp("1970-01-01T00:00:01.111111111Z");
     assertEquals(1111111111, TimeUtil.toNanos(timestamp));
     assertEquals(1111111, TimeUtil.toMicros(timestamp));
     assertEquals(1111, TimeUtil.toMillis(timestamp));
@@ -371,7 +378,7 @@
     assertEquals("1970-01-01T00:00:01.111111Z", TimeUtil.toString(timestamp));
     timestamp = TimeUtil.createTimestampFromMillis(1111);
     assertEquals("1970-01-01T00:00:01.111Z", TimeUtil.toString(timestamp));
-
+    
     timestamp = TimeUtil.parseTimestamp("1969-12-31T23:59:59.111111111Z");
     assertEquals(-888888889, TimeUtil.toNanos(timestamp));
     assertEquals(-888889, TimeUtil.toMicros(timestamp));
@@ -395,7 +402,7 @@
     assertEquals("1.111111s", TimeUtil.toString(duration));
     duration = TimeUtil.createDurationFromMillis(1111);
     assertEquals("1.111s", TimeUtil.toString(duration));
-
+    
     duration = TimeUtil.parseDuration("-1.111111111s");
     assertEquals(-1111111111, TimeUtil.toNanos(duration));
     assertEquals(-1111111, TimeUtil.toMicros(duration));
@@ -452,28 +459,29 @@
 
     duration = TimeUtil.add(duration, duration);
     assertEquals("-2.250s", TimeUtil.toString(duration));
-
+    
     duration = TimeUtil.subtract(duration, TimeUtil.parseDuration("-1s"));
     assertEquals("-1.250s", TimeUtil.toString(duration));
-
+    
     // Multiplications (with results larger than Long.MAX_VALUE in nanoseconds).
     duration = TimeUtil.parseDuration("0.999999999s");
-    assertEquals(
-        "315575999684.424s", TimeUtil.toString(TimeUtil.multiply(duration, 315576000000L)));
+    assertEquals("315575999684.424s",
+      TimeUtil.toString(TimeUtil.multiply(duration, 315576000000L)));
     duration = TimeUtil.parseDuration("-0.999999999s");
-    assertEquals(
-        "-315575999684.424s", TimeUtil.toString(TimeUtil.multiply(duration, 315576000000L)));
-    assertEquals(
-        "315575999684.424s", TimeUtil.toString(TimeUtil.multiply(duration, -315576000000L)));
-
+    assertEquals("-315575999684.424s",
+      TimeUtil.toString(TimeUtil.multiply(duration, 315576000000L)));
+    assertEquals("315575999684.424s",
+      TimeUtil.toString(TimeUtil.multiply(duration, -315576000000L)));
+    
     // Divisions (with values larger than Long.MAX_VALUE in nanoseconds).
     Duration d1 = TimeUtil.parseDuration("315576000000s");
     Duration d2 = TimeUtil.subtract(d1, TimeUtil.createDurationFromNanos(1));
     assertEquals(1, TimeUtil.divide(d1, d2));
     assertEquals(0, TimeUtil.divide(d2, d1));
     assertEquals("0.000000001s", TimeUtil.toString(TimeUtil.remainder(d1, d2)));
-    assertEquals("315575999999.999999999s", TimeUtil.toString(TimeUtil.remainder(d2, d1)));
-
+    assertEquals("315575999999.999999999s",
+      TimeUtil.toString(TimeUtil.remainder(d2, d1)));
+    
     // Divisions involving negative values.
     //
     // (-5) / 2 = -2, remainder = -1
diff --git a/java/util/src/test/proto/com/google/protobuf/util/json_test.proto b/java/util/src/test/proto/com/google/protobuf/util/json_test.proto
index d1248cf..686edc4 100644
--- a/java/util/src/test/proto/com/google/protobuf/util/json_test.proto
+++ b/java/util/src/test/proto/com/google/protobuf/util/json_test.proto
@@ -28,6 +28,36 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// 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 json_test;
@@ -94,7 +124,6 @@
   oneof oneof_field {
     int32 oneof_int32 = 1;
     TestAllTypes.NestedMessage oneof_nested_message = 2;
-    google.protobuf.NullValue oneof_null_value = 3;
   }
 }
 
@@ -165,14 +194,8 @@
 
 message TestAny {
   google.protobuf.Any any_value = 1;
-  map<string, google.protobuf.Any> any_map = 2;
 }
 
 message TestCustomJsonName {
   int32 value = 1 [json_name = "@value"];
 }
-
-message TestRecursive {
-  int32 value = 1;
-  TestRecursive nested = 2;
-}
diff --git a/javanano/README.md b/javanano/README.md
index 6b13ece..e19b90b 100644
--- a/javanano/README.md
+++ b/javanano/README.md
@@ -7,9 +7,6 @@
 
 This directory contains the Java Protocol Buffers Nano runtime library.
 
-**Nano is no longer supported by protobuf team. We recommend Android users to
-use protobuf lite runtime instead.**
-
 Installation - With Maven
 -------------------------
 
diff --git a/javanano/pom.xml b/javanano/pom.xml
index 9e7edbc..309b6c3 100644
--- a/javanano/pom.xml
+++ b/javanano/pom.xml
@@ -10,7 +10,7 @@
   </parent>
   <groupId>com.google.protobuf.nano</groupId>
   <artifactId>protobuf-javanano</artifactId>
-  <version>3.2.0</version>
+  <version>3.0.0-alpha-6</version>
   <packaging>bundle</packaging>
   <name>Protocol Buffer JavaNano API</name>
   <description>
@@ -21,8 +21,8 @@
   <url>https://developers.google.com/protocol-buffers/</url>
   <licenses>
     <license>
-      <name>3-Clause BSD License</name>
-      <url>https://opensource.org/licenses/BSD-3-Clause</url>
+      <name>New BSD license</name>
+      <url>http://www.opensource.org/licenses/bsd-license.php</url>
       <distribution>repo</distribution>
     </license>
   </licenses>
@@ -174,8 +174,8 @@
         <configuration>
           <instructions>
             <Bundle-DocURL>https://developers.google.com/protocol-buffers/</Bundle-DocURL>
-            <Bundle-SymbolicName>com.google.protobuf.nano</Bundle-SymbolicName>
-            <Export-Package>com.google.protobuf.nano;version=3.0.0-alpha-7</Export-Package>
+            <Bundle-SymbolicName>com.google.protobuf</Bundle-SymbolicName>
+            <Export-Package>com.google.protobuf;version=3.0.0-alpha-5</Export-Package>
           </instructions>
         </configuration>
       </plugin>
diff --git a/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java b/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java
index 278368a..f1263df 100644
--- a/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java
+++ b/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java
@@ -67,8 +67,8 @@
   public static final int TYPE_SINT32   = 17;
   public static final int TYPE_SINT64   = 18;
 
-  static final Charset UTF_8 = Charset.forName("UTF-8");
-  static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
+  protected static final Charset UTF_8 = Charset.forName("UTF-8");
+  protected static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
 
   private InternalNano() {}
 
diff --git a/javanano/src/main/java/com/google/protobuf/nano/InvalidProtocolBufferNanoException.java b/javanano/src/main/java/com/google/protobuf/nano/InvalidProtocolBufferNanoException.java
index 9a83d6d..3864d38 100644
--- a/javanano/src/main/java/com/google/protobuf/nano/InvalidProtocolBufferNanoException.java
+++ b/javanano/src/main/java/com/google/protobuf/nano/InvalidProtocolBufferNanoException.java
@@ -48,7 +48,7 @@
   static InvalidProtocolBufferNanoException truncatedMessage() {
     return new InvalidProtocolBufferNanoException(
       "While parsing a protocol message, the input ended unexpectedly " +
-      "in the middle of a field.  This could mean either that the " +
+      "in the middle of a field.  This could mean either than the " +
       "input has been truncated or that an embedded message " +
       "misreported its own length.");
   }
diff --git a/javanano/src/main/java/com/google/protobuf/nano/MessageNanoPrinter.java b/javanano/src/main/java/com/google/protobuf/nano/MessageNanoPrinter.java
index 5f329f0..d9500bb 100644
--- a/javanano/src/main/java/com/google/protobuf/nano/MessageNanoPrinter.java
+++ b/javanano/src/main/java/com/google/protobuf/nano/MessageNanoPrinter.java
@@ -156,7 +156,7 @@
                     } catch (NoSuchMethodException e) {
                         continue;
                     }
-                    // If hazzer doesn't exist or returns false, no need to continue
+                    // If hazzer does't exist or returns false, no need to continue
                     if (!(Boolean) hazzer.invoke(object)) {
                         continue;
                     }
diff --git a/javanano/src/test/java/com/google/protobuf/nano/NanoTest.java b/javanano/src/test/java/com/google/protobuf/nano/NanoTest.java
index 484db90..44544f4 100644
--- a/javanano/src/test/java/com/google/protobuf/nano/NanoTest.java
+++ b/javanano/src/test/java/com/google/protobuf/nano/NanoTest.java
@@ -30,13 +30,10 @@
 
 package com.google.protobuf.nano;
 
+import com.google.protobuf.nano.MapTestProto.TestMap;
 import com.google.protobuf.nano.BytesOffsetLengthTestNanoOuterClass.BytesOffsetLengthTestNano;
 import com.google.protobuf.nano.CodedInputByteBufferNano;
 import com.google.protobuf.nano.CodedOutputByteBufferNano;
-import com.google.protobuf.nano.EnumClassNanos.EnumClassNano;
-import com.google.protobuf.nano.EnumClassNanos.EnumClassNano.MessageScopeEnum;
-import com.google.protobuf.nano.EnumClassNanos.FileScopeEnum;
-import com.google.protobuf.nano.MapTestProto.TestMap;
 import com.google.protobuf.nano.MapTestProto.TestMap.MessageValue;
 import com.google.protobuf.nano.NanoAccessorsOuterClass.TestNanoAccessors;
 import com.google.protobuf.nano.NanoHasOuterClass.TestAllTypesNanoHas;
diff --git a/jenkins/build_and_run_docker.sh b/jenkins/build_and_run_docker.sh
index 50e1e8c..abc6f05 100755
--- a/jenkins/build_and_run_docker.sh
+++ b/jenkins/build_and_run_docker.sh
@@ -33,7 +33,6 @@
   "$@" \
   -e CCACHE_DIR=$CCACHE_DIR \
   -e EXTERNAL_GIT_ROOT="/var/local/jenkins/protobuf" \
-  -e TEST_SET="$TEST_SET" \
   -e THIS_IS_REALLY_NEEDED='see https://github.com/docker/docker/issues/14203 for why docker is awful' \
   -v "$git_root:/var/local/jenkins/protobuf:ro" \
   -v $CCACHE_DIR:$CCACHE_DIR \
diff --git a/jenkins/buildcmds/pull_request.sh b/jenkins/buildcmds/pull_request.sh
index 51e4bfa..01fda79 100755
--- a/jenkins/buildcmds/pull_request.sh
+++ b/jenkins/buildcmds/pull_request.sh
@@ -12,5 +12,4 @@
 export DOCKERFILE_DIR=jenkins/docker
 export DOCKER_RUN_SCRIPT=jenkins/pull_request_in_docker.sh
 export OUTPUT_DIR=testoutput
-export TEST_SET="csharp java_jdk7 javanano_jdk7 java_oracle7 javanano_oracle7 python python_cpp ruby_all javascript golang php_all"
 ./jenkins/build_and_run_docker.sh
diff --git a/jenkins/buildcmds/pull_request_32.sh b/jenkins/buildcmds/pull_request_32.sh
deleted file mode 100755
index bf0fb7f..0000000
--- a/jenkins/buildcmds/pull_request_32.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Jenkins as the entry point for
-# running the "pull request 32" project:
-#
-#   https://grpc-testing.appspot.com/view/Protocol%20Buffers/job/Protocol%20Buffers%20Pull%20Request%2032/
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-export DOCKERFILE_DIR=jenkins/docker32
-export DOCKER_RUN_SCRIPT=jenkins/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="php_all_32"
-./jenkins/build_and_run_docker.sh
diff --git a/jenkins/docker/Dockerfile b/jenkins/docker/Dockerfile
index 3a279e6..8467aef 100644
--- a/jenkins/docker/Dockerfile
+++ b/jenkins/docker/Dockerfile
@@ -14,29 +14,18 @@
   apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DB82666C
 
 # Apt source for Oracle Java.
-RUN echo 'deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main' > /etc/apt/sources.list.d/webupd8team-java-trusty.list && \
+run echo 'deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main' > /etc/apt/sources.list.d/webupd8team-java-trusty.list && \
   apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 && \
   echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
 
 # Apt source for Mono
-RUN echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list && \
+run echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list && \
   echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list && \
   apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
 
-# Apt source for php
-RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu trusty main" | tee /etc/apt/sources.list.d/various-php.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F4FCBB07
-
-# Install dotnet SDK based on https://www.microsoft.com/net/core#debian
-# (Ubuntu instructions need apt to support https)
-RUN apt-get update && apt-get install -y --force-yes curl libunwind8 gettext && \
-  curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=847105 &&  \
-  mkdir -p /opt/dotnet && tar zxf dotnet.tar.gz -C /opt/dotnet && \
-  ln -s /opt/dotnet/dotnet /usr/local/bin
-
 # Install dependencies.  We start with the basic ones require to build protoc
 # and the C++ build
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
+RUN apt-get update && apt-get install -y \
   autoconf \
   autotools-dev \
   build-essential \
@@ -75,18 +64,6 @@
   python3.4-dev \
   # -- For Ruby --
   ruby \
-  # -- For C++ benchmarks --
-  cmake \
-  # -- For PHP --
-  php5.6     \
-  php5.6-dev \
-  php5.6-xml \
-  php7.0     \
-  php7.0-dev \
-  php7.0-xml \
-  phpunit    \
-  valgrind   \
-  libxml2-dev \
   && apt-get clean
 
 ##################
@@ -103,6 +80,7 @@
 RUN pip install pip --upgrade
 RUN pip install virtualenv tox yattag
 
+
 ##################
 # Ruby dependencies
 
@@ -110,12 +88,12 @@
 RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
 RUN \curl -sSL https://get.rvm.io | bash -s stable
 
-# Install Ruby 2.1, Ruby 2.2 and JRuby 1.7
+# Install Ruby 2.1
 RUN /bin/bash -l -c "rvm install ruby-2.1"
-RUN /bin/bash -l -c "rvm install ruby-2.2"
-RUN /bin/bash -l -c "rvm install jruby-1.7"
+RUN /bin/bash -l -c "rvm use --default ruby-2.1"
 RUN /bin/bash -l -c "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
 RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
+RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.1' >> ~/.bashrc"
 RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
 
 ##################
@@ -129,108 +107,16 @@
 RUN cd /tmp && \
   git clone https://github.com/google/protobuf.git && \
   cd protobuf && \
-  git reset --hard 129a6e2aca95dcfb6c3e717d7b9cca1f104fde39 && \
   ./autogen.sh && \
   ./configure && \
-  make -j4 && \
+  make -j6 && \
   cd java && \
+  $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO -P lite && \
   $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO && \
   cd ../javanano && \
   $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO
 
 ##################
-# PHP dependencies.
-RUN wget http://am1.php.net/get/php-5.5.38.tar.bz2/from/this/mirror
-RUN mv mirror php-5.5.38.tar.bz2
-RUN tar -xvf php-5.5.38.tar.bz2
-RUN cd php-5.5.38 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.5-zts && \
-    make && make install && cd ..
-RUN cd php-5.5.38 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.5 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-5.6.30.tar.bz2/from/this/mirror
-RUN mv mirror php-5.6.30.tar.bz2
-RUN tar -xvf php-5.6.30.tar.bz2
-RUN cd php-5.6.30 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.6-zts && \
-    make && make install && cd ..
-RUN cd php-5.6.30 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.6 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.0.18.tar.bz2/from/this/mirror
-RUN mv mirror php-7.0.18.tar.bz2
-RUN tar -xvf php-7.0.18.tar.bz2
-RUN cd php-7.0.18 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.0-zts && \
-    make && make install && cd ..
-RUN cd php-7.0.18 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.0 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.1.4.tar.bz2/from/this/mirror
-RUN mv mirror php-7.1.4.tar.bz2
-RUN tar -xvf php-7.1.4.tar.bz2
-RUN cd php-7.1.4 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.1-zts && \
-    make && make install && cd ..
-RUN cd php-7.1.4 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.1 && \
-    make && make install && cd ..
-
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-RUN composer config -g -- disable-tls true
-RUN composer config -g -- secure-http false
-RUN cd /tmp && \
-  rm -rf protobuf && \
-  git clone https://github.com/google/protobuf.git && \
-  cd protobuf && \
-  git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
-  cd php && \
-  ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.5 && \
-  ln -sfn /usr/local/php-5.6/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.6/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.6/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.6 && \
-  ln -sfn /usr/local/php-7.0/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.0/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.0/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.0 && \
-  ln -sfn /usr/local/php-7.1/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.1/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.1/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.1
-
-##################
-# Go dependencies.
-RUN apt-get install -y  \
-  # -- For go -- \
-  golang
-
-##################
-# Javascript dependencies.
-RUN apt-get install -y \
-  # -- For javascript -- \
-  npm
-
-##################
-# Python 3.5 3.6 dependencies.
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  python3.5-dev \
-  python3.6-dev \
-  && apt-get clean
-
-# On Debian/Ubuntu, nodejs binary is named 'nodejs' because the name 'node'
-# is taken by another legacy binary. We don't have that legacy binary and
-# npm expects the binary to be named 'node', so we just create a symbol
-# link here.
-RUN ln -s `which nodejs` /usr/bin/node
-
-##################
 # Prepare ccache
 
 RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
diff --git a/jenkins/docker32/Dockerfile b/jenkins/docker32/Dockerfile
deleted file mode 100644
index 1278889..0000000
--- a/jenkins/docker32/Dockerfile
+++ /dev/null
@@ -1,143 +0,0 @@
-# This Dockerfile specifies the recipe for creating an image for the tests
-# to run in.
-#
-# We install as many test dependencies here as we can, because these setup
-# steps can be cached.  They do *not* run every time we run the build.
-# The Docker image is only rebuilt when the Dockerfile (ie. this file)
-# changes.
-
-# Base Dockerfile for gRPC dev images
-FROM 32bit/debian:latest
-
-# Apt source for php
-RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu trusty main" | tee /etc/apt/sources.list.d/various-php.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F4FCBB07
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  unzip \
-  # -- For python --
-  python-setuptools \
-  python-pip \
-  python-dev \
-  # -- For C++ benchmarks --
-  cmake  \
-  # -- For PHP --
-  php5.5     \
-  php5.5-dev \
-  php5.5-xml \
-  php5.6     \
-  php5.6-dev \
-  php5.6-xml \
-  php7.0     \
-  php7.0-dev \
-  php7.0-xml \
-  phpunit    \
-  valgrind   \
-  libxml2-dev \
-  && apt-get clean
-
-##################
-# PHP dependencies.
-RUN wget http://am1.php.net/get/php-5.5.38.tar.bz2/from/this/mirror
-RUN mv mirror php-5.5.38.tar.bz2
-RUN tar -xvf php-5.5.38.tar.bz2
-RUN cd php-5.5.38 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.5-zts && \
-    make && make install && make clean && cd ..
-RUN cd php-5.5.38 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.5 && \
-    make && make install && make clean && cd ..
-
-RUN wget http://am1.php.net/get/php-5.6.30.tar.bz2/from/this/mirror
-RUN mv mirror php-5.6.30.tar.bz2
-RUN tar -xvf php-5.6.30.tar.bz2
-RUN cd php-5.6.30 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.6-zts && \
-    make && make install && cd ..
-RUN cd php-5.6.30 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.6 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.0.18.tar.bz2/from/this/mirror
-RUN mv mirror php-7.0.18.tar.bz2
-RUN tar -xvf php-7.0.18.tar.bz2
-RUN cd php-7.0.18 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.0-zts && \
-    make && make install && cd ..
-RUN cd php-7.0.18 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.0 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.1.4.tar.bz2/from/this/mirror
-RUN mv mirror php-7.1.4.tar.bz2
-RUN tar -xvf php-7.1.4.tar.bz2
-RUN cd php-7.1.4 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.1-zts && \
-    make && make install && cd ..
-RUN cd php-7.1.4 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.1 && \
-    make && make install && cd ..
-
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-RUN composer config -g -- disable-tls true
-RUN composer config -g -- secure-http false
-RUN cd /tmp && \
-  git clone https://github.com/google/protobuf.git && \
-  cd protobuf/php && \
-  git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
-  ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.5 && \
-  ln -sfn /usr/local/php-5.6/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.6/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.6/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.6 && \
-  ln -sfn /usr/local/php-7.0/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.0/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.0/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.0 && \
-  ln -sfn /usr/local/php-7.1/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.1/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.1/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.1
-
-##################
-# Python dependencies
-
-# These packages exist in apt-get, but their versions are too old, so we have
-# to get updates from pip.
-
-RUN pip install pip --upgrade
-RUN pip install virtualenv tox yattag
-
-##################
-# Prepare ccache
-
-RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
-RUN ln -s /usr/bin/ccache /usr/local/bin/g++
-RUN ln -s /usr/bin/ccache /usr/local/bin/cc
-RUN ln -s /usr/bin/ccache /usr/local/bin/c++
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
-
-# Define the default command.
-CMD ["bash"]
diff --git a/jenkins/make_test_output.py b/jenkins/make_test_output.py
index 9853685..b1f2e2c 100644
--- a/jenkins/make_test_output.py
+++ b/jenkins/make_test_output.py
@@ -17,12 +17,11 @@
 finishes.
 """
 
-import os
-import sys
+import os;
+import sys;
 from yattag import Doc
 from collections import defaultdict
 
-
 def readtests(basedir):
   tests = defaultdict(dict)
 
@@ -69,7 +68,6 @@
 
   return ret
 
-
 def genxml(tests):
   doc, tag, text = Doc().tagtext()
 
@@ -88,7 +86,6 @@
 
   return doc.getvalue()
 
-
 sys.stderr.write("make_test_output.py: writing XML from directory: " +
-                 sys.argv[1] + "\n")
-print(genxml(readtests(sys.argv[1])))
+                 sys.argv[1] + "\n");
+print genxml(readtests(sys.argv[1]))
diff --git a/jenkins/pull_request_in_docker.sh b/jenkins/pull_request_in_docker.sh
index 10daf0a..887f97c 100755
--- a/jenkins/pull_request_in_docker.sh
+++ b/jenkins/pull_request_in_docker.sh
@@ -45,11 +45,17 @@
 
 $TIME_CMD $TEST_SCRIPT cpp > >(tee $CPP_STDOUT) 2> >(tee $CPP_STDERR >&2)
 
-# Other tests are run in parallel. TEST_SET is defined in
-# buildcmds/pull_request{_32}.sh
+# Other tests are run in parallel.
 
 parallel --results $LOG_OUTPUT_DIR --joblog $OUTPUT_DIR/joblog $TEST_SCRIPT ::: \
-  $TEST_SET \
+  csharp \
+  java_jdk7 \
+  javanano_jdk7 \
+  java_oracle7 \
+  javanano_oracle7 \
+  python \
+  python_cpp \
+  ruby21 \
   || true  # Process test results even if tests fail.
 
 cat $OUTPUT_DIR/joblog
diff --git a/js/README.md b/js/README.md
index ef0d4b1..15d48c8 100644
--- a/js/README.md
+++ b/js/README.md
@@ -19,9 +19,7 @@
 To use Protocol Buffers with JavaScript, you need two main components:
 
 1. The protobuf runtime library.  You can install this with
-   `npm install google-protobuf`, or use the files in this directory.  
-    If npm is not being used, as of 3.3.0, the files needed are located in binary subdirectory; 
-    arith.js, constants.js, decoder.js, encoder.js, map.js, message.js, reader.js, utils.js, writer.js
+   `npm install google-protobuf`, or use the files in this directory.
 2. The Protocol Compiler `protoc`.  This translates `.proto` files
    into `.js` files.  The compiler is not currently available via
    npm, but you can download a pre-built binary
@@ -95,12 +93,6 @@
 
     var message = proto.my.package.MyMessage();
 
-If unfamiliar with Closure or it's compiler, consider reviewing Closure documentation
-https://developers.google.com/closure/library/docs/tutorial
-https://developers.google.com/closure/library/docs/closurebuilder
-https://developers.google.com/closure/library/docs/depswriter
-At a high level, closurebuilder.py can walk dependencies, and compile your code, and all dependencies for Protobuf into a single .js file.  Using depsbuilder.py to generate a dependency file can also be considered for non-production dev environments.
-
 CommonJS imports
 ----------------
 
@@ -158,9 +150,10 @@
     message.setPhoneNumbers(["800-555-1212", "800-555-0000"]);
 
     // Serializes to a UInt8Array.
-    var bytes = message.serializeBinary();
+    bytes = message.serializeBinary();
 
-    var message2 = MyMessage.deserializeBinary(bytes);
+    var message2 = new MyMessage();
+    message2.deserializeBinary(bytes);
 
 For more examples, see the tests.  You can also look at the generated code
 to see what methods are defined for your generated messages.
diff --git a/js/binary/arith_test.js b/js/binary/arith_test.js
index dd5791a..89796bf 100644
--- a/js/binary/arith_test.js
+++ b/js/binary/arith_test.js
@@ -36,6 +36,7 @@
  * @author cfallin@google.com (Chris Fallin)
  */
 
+goog.require('goog.testing.asserts');
 goog.require('jspb.arith.Int64');
 goog.require('jspb.arith.UInt64');
 
@@ -47,30 +48,30 @@
   it('testCompare', function() {
     var a = new jspb.arith.UInt64(1234, 5678);
     var b = new jspb.arith.UInt64(1234, 5678);
-    expect(a.cmp(b)).toEqual(0);
-    expect(b.cmp(a)).toEqual(0);
+    assertEquals(a.cmp(b), 0);
+    assertEquals(b.cmp(a), 0);
     b.lo -= 1;
-    expect(a.cmp(b)).toEqual(1);
-    expect(b.cmp(a)).toEqual(-1);
+    assertEquals(a.cmp(b), 1);
+    assertEquals(b.cmp(a), -1);
     b.lo += 2;
-    expect(a.cmp(b)).toEqual(-1);
-    expect(b.cmp(a)).toEqual(1);
+    assertEquals(a.cmp(b), -1);
+    assertEquals(b.cmp(a), 1);
     b.lo = a.lo;
     b.hi = a.hi - 1;
-    expect(a.cmp(b)).toEqual(1);
-    expect(b.cmp(a)).toEqual(-1);
+    assertEquals(a.cmp(b), 1);
+    assertEquals(b.cmp(a), -1);
 
-    expect(a.zero()).toEqual(false);
-    expect(a.msb()).toEqual(false);
-    expect(a.lsb()).toEqual(false);
+    assertEquals(a.zero(), false);
+    assertEquals(a.msb(), false);
+    assertEquals(a.lsb(), false);
     a.hi = 0;
     a.lo = 0;
-    expect(a.zero()).toEqual(true);
+    assertEquals(a.zero(), true);
     a.hi = 0x80000000;
-    expect(a.zero()).toEqual(false);
-    expect(a.msb()).toEqual(true);
+    assertEquals(a.zero(), false);
+    assertEquals(a.msb(), true);
     a.lo = 0x00000001;
-    expect(a.lsb()).toEqual(true);
+    assertEquals(a.lsb(), true);
   });
 
 
@@ -79,35 +80,35 @@
    */
   it('testShifts', function() {
     var a = new jspb.arith.UInt64(1, 0);
-    expect(a.lo).toEqual(1);
-    expect(a.hi).toEqual(0);
+    assertEquals(a.lo, 1);
+    assertEquals(a.hi, 0);
     var orig = a;
     a = a.leftShift();
-    expect(orig.lo).toEqual(1);  // original unmodified.
-    expect(orig.hi).toEqual(0);
-    expect(a.lo).toEqual(2);
-    expect(a.hi).toEqual(0);
+    assertEquals(orig.lo, 1);  // original unmodified.
+    assertEquals(orig.hi, 0);
+    assertEquals(a.lo, 2);
+    assertEquals(a.hi, 0);
     a = a.leftShift();
-    expect(a.lo).toEqual(4);
-    expect(a.hi).toEqual(0);
+    assertEquals(a.lo, 4);
+    assertEquals(a.hi, 0);
     for (var i = 0; i < 29; i++) {
       a = a.leftShift();
     }
-    expect(a.lo).toEqual(0x80000000);
-    expect(a.hi).toEqual(0);
+    assertEquals(a.lo, 0x80000000);
+    assertEquals(a.hi, 0);
     a = a.leftShift();
-    expect(a.lo).toEqual(0);
-    expect(a.hi).toEqual(1);
+    assertEquals(a.lo, 0);
+    assertEquals(a.hi, 1);
     a = a.leftShift();
-    expect(a.lo).toEqual(0);
-    expect(a.hi).toEqual(2);
+    assertEquals(a.lo, 0);
+    assertEquals(a.hi, 2);
     a = a.rightShift();
     a = a.rightShift();
-    expect(a.lo).toEqual(0x80000000);
-    expect(a.hi).toEqual(0);
+    assertEquals(a.lo, 0x80000000);
+    assertEquals(a.hi, 0);
     a = a.rightShift();
-    expect(a.lo).toEqual(0x40000000);
-    expect(a.hi).toEqual(0);
+    assertEquals(a.lo, 0x40000000);
+    assertEquals(a.hi, 0);
   });
 
 
@@ -121,12 +122,12 @@
                                          /* hi = */ 0x92fa2123);
     // Addition with carry.
     var c = a.add(b);
-    expect(a.lo).toEqual(0x89abcdef);  // originals unmodified.
-    expect(a.hi).toEqual(0x01234567);
-    expect(b.lo).toEqual(0xff52ab91);
-    expect(b.hi).toEqual(0x92fa2123);
-    expect(c.lo).toEqual(0x88fe7980);
-    expect(c.hi).toEqual(0x941d668b);
+    assertEquals(a.lo, 0x89abcdef);  // originals unmodified.
+    assertEquals(a.hi, 0x01234567);
+    assertEquals(b.lo, 0xff52ab91);
+    assertEquals(b.hi, 0x92fa2123);
+    assertEquals(c.lo, 0x88fe7980);
+    assertEquals(c.hi, 0x941d668b);
 
     // Simple addition without carry.
     a.lo = 2;
@@ -134,8 +135,8 @@
     b.lo = 3;
     b.hi = 0;
     c = a.add(b);
-    expect(c.lo).toEqual(5);
-    expect(c.hi).toEqual(0);
+    assertEquals(c.lo, 5);
+    assertEquals(c.hi, 0);
   });
 
 
@@ -169,8 +170,8 @@
         var a = new jspb.arith.UInt64(loValues[i], hiValues[j]);
         var b = new jspb.arith.UInt64(loValues[j], hiValues[i]);
         var c = a.add(b).sub(b);
-        expect(c.hi).toEqual(a.hi);
-        expect(c.lo).toEqual(a.lo);
+        assertEquals(c.hi, a.hi);
+        assertEquals(c.lo, a.lo);
       }
     }
   });
@@ -200,8 +201,8 @@
       var cLow = testData[i][2] >>> 0;
       var cHigh = testData[i][3] >>> 0;
       var c = jspb.arith.UInt64.mul32x32(a, b);
-      expect(c.lo).toEqual(cLow);
-      expect(c.hi).toEqual(cHigh);
+      assertEquals(c.lo, cLow);
+      assertEquals(c.hi, cHigh);
     }
   });
 
@@ -230,8 +231,8 @@
     for (var i = 0; i < testData.length; i++) {
       var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
       var prod = a.mul(testData[i][2]);
-      expect(prod.lo).toEqual(testData[i][3]);
-      expect(prod.hi).toEqual(testData[i][4]);
+      assertEquals(prod.lo, testData[i][3]);
+      assertEquals(prod.hi, testData[i][4]);
     }
   });
 
@@ -273,9 +274,9 @@
       var result = a.div(testData[i][2]);
       var quotient = result[0];
       var remainder = result[1];
-      expect(quotient.lo).toEqual(testData[i][3]);
-      expect(quotient.hi).toEqual(testData[i][4]);
-      expect(remainder.lo).toEqual(testData[i][5]);
+      assertEquals(quotient.lo, testData[i][3]);
+      assertEquals(quotient.hi, testData[i][4]);
+      assertEquals(remainder.lo, testData[i][5]);
     }
   });
 
@@ -310,9 +311,9 @@
     for (var i = 0; i < testData.length; i++) {
       var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
       var roundtrip = jspb.arith.UInt64.fromString(a.toString());
-      expect(roundtrip.lo).toEqual(a.lo);
-      expect(roundtrip.hi).toEqual(a.hi);
-      expect(a.toString()).toEqual(testData[i][2]);
+      assertEquals(roundtrip.lo, a.lo);
+      assertEquals(roundtrip.hi, a.hi);
+      assertEquals(a.toString(), testData[i][2]);
     }
   });
 
@@ -348,7 +349,7 @@
     for (var i = 0; i < testStrings.length; i++) {
       var roundtrip =
           jspb.arith.Int64.fromString(testStrings[i]).toString();
-      expect(roundtrip).toEqual(testStrings[i]);
+      assertEquals(roundtrip, testStrings[i]);
     }
   });
 });
diff --git a/js/binary/constants.js b/js/binary/constants.js
index 75a8a52..836216b 100644
--- a/js/binary/constants.js
+++ b/js/binary/constants.js
@@ -51,9 +51,6 @@
 goog.provide('jspb.WriterFunction');
 
 
-goog.forwardDeclare('jspb.BinaryMessage');
-goog.forwardDeclare('jspb.BinaryReader');
-goog.forwardDeclare('jspb.BinaryWriter');
 goog.forwardDeclare('jspb.Message');
 goog.forwardDeclare('jsproto.BinaryExtension');
 
@@ -144,8 +141,8 @@
 
 /**
  * A writer function serializes a message to a BinaryWriter.
- * @typedef {function((!jspb.Message|!jspb.ConstBinaryMessage),
- *                    !jspb.BinaryWriter):void}
+ * @typedef {!function(!jspb.Message, !jspb.BinaryWriter):void |
+ *           !function(!jspb.ConstBinaryMessage, !jspb.BinaryWriter):void}
  */
 jspb.WriterFunction;
 
diff --git a/js/binary/decoder.js b/js/binary/decoder.js
index 4ec3cad..41094a3 100644
--- a/js/binary/decoder.js
+++ b/js/binary/decoder.js
@@ -47,7 +47,6 @@
 goog.provide('jspb.BinaryIterator');
 
 goog.require('goog.asserts');
-goog.require('goog.crypt');
 goog.require('jspb.utils');
 
 
@@ -72,7 +71,7 @@
    */
   this.nextMethod_ = null;
 
-  /** @private {?Array<number|boolean|string>} */
+  /** @private {Array.<number>} */
   this.elements_ = null;
 
   /** @private {number} */
@@ -101,7 +100,7 @@
     this.decoder_ = opt_decoder;
     this.nextMethod_ = opt_next;
   }
-  this.elements_ = opt_elements || null;
+  this.elements_ = opt_elements ? opt_elements : null;
   this.cursor_ = 0;
   this.nextValue_ = null;
   this.atEnd_ = !this.decoder_ && !this.elements_;
@@ -583,24 +582,27 @@
   x |= (temp & 0x0F) << 28;
   if (temp < 128) {
     // We're reading the high bits of an unsigned varint. The byte we just read
-    // also contains bits 33 through 35, which we're going to discard.
+    // also contains bits 33 through 35, which we're going to discard. Those
+    // bits _must_ be zero, or the encoding is invalid.
+    goog.asserts.assert((temp & 0xF0) == 0);
     this.cursor_ += 5;
     goog.asserts.assert(this.cursor_ <= this.end_);
     return x >>> 0;
   }
 
-  // If we get here, we need to truncate coming bytes. However we need to make
-  // sure cursor place is correct.
-  this.cursor_ += 5;
-  if (bytes[this.cursor_++] >= 128 &&
-      bytes[this.cursor_++] >= 128 &&
-      bytes[this.cursor_++] >= 128 &&
-      bytes[this.cursor_++] >= 128 &&
-      bytes[this.cursor_++] >= 128) {
-    // If we get here, the varint is too long.
-    goog.asserts.assert(false);
-  }
+  // If we get here, we're reading the sign extension of a negative 32-bit int.
+  // We can skip these bytes, as we know in advance that they have to be all
+  // 1's if the varint is correctly encoded. Since we also know the value is
+  // negative, we don't have to coerce it to unsigned before we return it.
 
+  goog.asserts.assert((temp & 0xF0) == 0xF0);
+  goog.asserts.assert(bytes[this.cursor_ + 5] == 0xFF);
+  goog.asserts.assert(bytes[this.cursor_ + 6] == 0xFF);
+  goog.asserts.assert(bytes[this.cursor_ + 7] == 0xFF);
+  goog.asserts.assert(bytes[this.cursor_ + 8] == 0xFF);
+  goog.asserts.assert(bytes[this.cursor_ + 9] == 0x01);
+
+  this.cursor_ += 10;
   goog.asserts.assert(this.cursor_ <= this.end_);
   return x;
 };
@@ -731,24 +733,6 @@
 
 
 /**
- * Reads a signed, zigzag-encoded 64-bit varint from the binary stream and
- * returns its valud as a string.
- *
- * Zigzag encoding is a modification of varint encoding that reduces the
- * storage overhead for small negative integers - for more details on the
- * format, see https://developers.google.com/protocol-buffers/docs/encoding
- *
- * @return {string} The decoded signed, zigzag-encoded 64-bit varint as a
- * string.
- */
-jspb.BinaryDecoder.prototype.readZigzagVarint64String = function() {
-  // TODO(haberman): write lossless 64-bit zig-zag math.
-  var value = this.readZigzagVarint64();
-  return value.toString();
-};
-
-
-/**
  * Reads a raw unsigned 8-bit integer from the binary stream.
  *
  * @return {number} The unsigned 8-bit integer read from the binary stream.
@@ -807,20 +791,6 @@
 
 
 /**
- * Reads a raw unsigned 64-bit integer from the binary stream. Note that since
- * Javascript represents all numbers as double-precision floats, there will be
- * precision lost if the absolute value of the integer is larger than 2^53.
- *
- * @return {string} The unsigned 64-bit integer read from the binary stream.
- */
-jspb.BinaryDecoder.prototype.readUint64String = function() {
-  var bitsLow = this.readUint32();
-  var bitsHigh = this.readUint32();
-  return jspb.utils.joinUnsignedDecimalString(bitsLow, bitsHigh);
-};
-
-
-/**
  * Reads a raw signed 8-bit integer from the binary stream.
  *
  * @return {number} The signed 8-bit integer read from the binary stream.
@@ -879,20 +849,6 @@
 
 
 /**
- * Reads a raw signed 64-bit integer from the binary stream and returns it as a
- * string.
- *
- * @return {string} The signed 64-bit integer read from the binary stream.
- *     Precision will be lost if the integer exceeds 2^53.
- */
-jspb.BinaryDecoder.prototype.readInt64String = function() {
-  var bitsLow = this.readUint32();
-  var bitsHigh = this.readUint32();
-  return jspb.utils.joinSignedDecimalString(bitsLow, bitsHigh);
-};
-
-
-/**
  * Reads a 32-bit floating-point number from the binary stream, using the
  * temporary buffer to realign the data.
  *
@@ -939,9 +895,11 @@
 
 /**
  * Reads and parses a UTF-8 encoded unicode string from the stream.
- * The code is inspired by maps.vectortown.parse.StreamedDataViewReader.
- * Supports codepoints from U+0000 up to U+10FFFF.
- * (http://en.wikipedia.org/wiki/UTF-8).
+ * The code is inspired by maps.vectortown.parse.StreamedDataViewReader, with
+ * the exception that the implementation here does not get confused if it
+ * encounters characters longer than three bytes. These characters are ignored
+ * though, as they are extremely rare: three UTF-8 bytes cover virtually all
+ * characters in common use (http://en.wikipedia.org/wiki/UTF-8).
  * @param {number} length The length of the string to read.
  * @return {string} The decoded string.
  */
@@ -949,50 +907,30 @@
   var bytes = this.bytes_;
   var cursor = this.cursor_;
   var end = cursor + length;
-  var codeUnits = [];
+  var chars = [];
 
-  var result = '';
   while (cursor < end) {
     var c = bytes[cursor++];
     if (c < 128) { // Regular 7-bit ASCII.
-      codeUnits.push(c);
+      chars.push(c);
     } else if (c < 192) {
       // UTF-8 continuation mark. We are out of sync. This
       // might happen if we attempted to read a character
-      // with more than four bytes.
+      // with more than three bytes.
       continue;
     } else if (c < 224) { // UTF-8 with two bytes.
       var c2 = bytes[cursor++];
-      codeUnits.push(((c & 31) << 6) | (c2 & 63));
+      chars.push(((c & 31) << 6) | (c2 & 63));
     } else if (c < 240) { // UTF-8 with three bytes.
       var c2 = bytes[cursor++];
       var c3 = bytes[cursor++];
-      codeUnits.push(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
-    } else if (c < 248) { // UTF-8 with 4 bytes.
-      var c2 = bytes[cursor++];
-      var c3 = bytes[cursor++];
-      var c4 = bytes[cursor++];
-      // Characters written on 4 bytes have 21 bits for a codepoint.
-      // We can't fit that on 16bit characters, so we use surrogates.
-      var codepoint = ((c & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63);
-      // Surrogates formula from wikipedia.
-      // 1. Subtract 0x10000 from codepoint
-      codepoint -= 0x10000;
-      // 2. Split this into the high 10-bit value and the low 10-bit value
-      // 3. Add 0xD800 to the high value to form the high surrogate
-      // 4. Add 0xDC00 to the low value to form the low surrogate:
-      var low = (codepoint & 1023) + 0xDC00;
-      var high = ((codepoint >> 10) & 1023) + 0xD800;
-      codeUnits.push(high, low);
-    }
-
-    // Avoid exceeding the maximum stack size when calling {@code apply}.
-    if (codeUnits.length >= 8192) {
-      result += String.fromCharCode.apply(null, codeUnits);
-      codeUnits.length = 0;
+      chars.push(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
     }
   }
-  result += goog.crypt.byteArrayToString(codeUnits);
+
+  // String.fromCharCode.apply is faster than manually appending characters on
+  // Chrome 25+, and generates no additional cons string garbage.
+  var result = String.fromCharCode.apply(null, chars);
   this.cursor_ = cursor;
   return result;
 };
diff --git a/js/binary/decoder_test.js b/js/binary/decoder_test.js
index b19e1d1..d045e91 100644
--- a/js/binary/decoder_test.js
+++ b/js/binary/decoder_test.js
@@ -147,8 +147,9 @@
 describe('binaryDecoderTest', function() {
   /**
    * Tests the decoder instance cache.
+   * @suppress {visibility}
    */
-  it('testInstanceCache', /** @suppress {visibility} */ function() {
+  it('testInstanceCache', function() {
     // Empty the instance caches.
     jspb.BinaryDecoder.instanceCache_ = [];
 
@@ -210,48 +211,6 @@
     assertEquals(hashD, decoder.readFixedHash64());
   });
 
-  /**
-   * Tests reading and writing large strings
-   */
-  it('testLargeStrings', function() {
-    var encoder = new jspb.BinaryEncoder();
-
-    var len = 150000;
-    var long_string = '';
-    for (var i = 0; i < len; i++) {
-      long_string += 'a';
-    }
-
-    encoder.writeString(long_string);
-
-    var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-    assertEquals(long_string, decoder.readString(len));
-  });
-
-  /**
-   * Test encoding and decoding utf-8.
-   */
-   it('testUtf8', function() {
-    var encoder = new jspb.BinaryEncoder();
-
-    var ascii = "ASCII should work in 3, 2, 1...";
-    var utf8_two_bytes = "©";
-    var utf8_three_bytes = "❄";
-    var utf8_four_bytes = "😁";
-
-    encoder.writeString(ascii);
-    encoder.writeString(utf8_two_bytes);
-    encoder.writeString(utf8_three_bytes);
-    encoder.writeString(utf8_four_bytes);
-
-    var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-    assertEquals(ascii, decoder.readString(ascii.length));
-    assertEquals(utf8_two_bytes, decoder.readString(utf8_two_bytes.length));
-    assertEquals(utf8_three_bytes, decoder.readString(utf8_three_bytes.length));
-    assertEquals(utf8_four_bytes, decoder.readString(utf8_four_bytes.length));
-   });
 
   /**
    * Verifies that misuse of the decoder class triggers assertions.
@@ -270,7 +229,24 @@
     assertThrows(function() {decoder.readSignedVarint64()});
     decoder.reset();
     assertThrows(function() {decoder.readZigzagVarint64()});
-    decoder.reset();
+
+    // Positive 32-bit varints encoded with 1 bits in positions 33 through 35
+    // should trigger assertions.
+    decoder.setBlock([255, 255, 255, 255, 0x1F]);
+    assertThrows(function() {decoder.readUnsignedVarint32()});
+
+    decoder.setBlock([255, 255, 255, 255, 0x2F]);
+    assertThrows(function() {decoder.readUnsignedVarint32()});
+
+    decoder.setBlock([255, 255, 255, 255, 0x4F]);
+    assertThrows(function() {decoder.readUnsignedVarint32()});
+
+    // Negative 32-bit varints encoded with non-1 bits in the high dword should
+    // trigger assertions.
+    decoder.setBlock([255, 255, 255, 255, 255, 255, 0, 255, 255, 1]);
+    assertThrows(function() {decoder.readUnsignedVarint32()});
+
+    decoder.setBlock([255, 255, 255, 255, 255, 255, 255, 255, 255, 0]);
     assertThrows(function() {decoder.readUnsignedVarint32()});
   });
 
diff --git a/js/binary/encoder.js b/js/binary/encoder.js
index 8e9f5bb..c9b0c2a 100644
--- a/js/binary/encoder.js
+++ b/js/binary/encoder.js
@@ -100,24 +100,6 @@
 
 
 /**
- * Encodes a 64-bit integer in 32:32 split representation into its wire-format
- * fixed representation and stores it in the buffer.
- * @param {number} lowBits The low 32 bits of the int.
- * @param {number} highBits The high 32 bits of the int.
- */
-jspb.BinaryEncoder.prototype.writeSplitFixed64 = function(lowBits, highBits) {
-  goog.asserts.assert(lowBits == Math.floor(lowBits));
-  goog.asserts.assert(highBits == Math.floor(highBits));
-  goog.asserts.assert((lowBits >= 0) &&
-                      (lowBits < jspb.BinaryConstants.TWO_TO_32));
-  goog.asserts.assert((highBits >= 0) &&
-                      (highBits < jspb.BinaryConstants.TWO_TO_32));
-  this.writeUint32(lowBits);
-  this.writeUint32(highBits);
-};
-
-
-/**
  * Encodes a 32-bit unsigned integer into its wire-format varint representation
  * and stores it in the buffer.
  * @param {number} value The integer to convert.
@@ -226,18 +208,6 @@
 
 
 /**
- * Encodes a JavaScript decimal string into its wire-format, zigzag-encoded
- * varint representation and stores it in the buffer. Integers not representable
- * in 64 bits will be truncated.
- * @param {string} value The integer to convert.
- */
-jspb.BinaryEncoder.prototype.writeZigzagVarint64String = function(value) {
-  // TODO(haberman): write lossless 64-bit zig-zag math.
-  this.writeZigzagVarint64(parseInt(value, 10));
-};
-
-
-/**
  * Writes a 8-bit unsigned integer to the buffer. Numbers outside the range
  * [0,2^8) will be truncated.
  * @param {number} value The value to write.
@@ -344,21 +314,8 @@
   goog.asserts.assert((value >= -jspb.BinaryConstants.TWO_TO_63) &&
                       (value < jspb.BinaryConstants.TWO_TO_63));
   jspb.utils.splitInt64(value);
-  this.writeSplitFixed64(jspb.utils.split64Low, jspb.utils.split64High);
-};
-
-
-/**
- * Writes a 64-bit integer decimal strings to the buffer. Numbers outside the
- * range [-2^63,2^63) will be truncated.
- * @param {string} value The value to write.
- */
-jspb.BinaryEncoder.prototype.writeInt64String = function(value) {
-  goog.asserts.assert(value == Math.floor(value));
-  goog.asserts.assert((+value >= -jspb.BinaryConstants.TWO_TO_63) &&
-                      (+value < jspb.BinaryConstants.TWO_TO_63));
-  jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(value));
-  this.writeSplitFixed64(jspb.utils.split64Low, jspb.utils.split64High);
+  this.writeUint32(jspb.utils.split64Low);
+  this.writeUint32(jspb.utils.split64High);
 };
 
 
@@ -390,13 +347,11 @@
 
 
 /**
- * Writes a boolean value to the buffer as a varint. We allow numbers as input
- * because the JSPB code generator uses 0/1 instead of true/false to save space
- * in the string representation of the proto.
- * @param {boolean|number} value The value to write.
+ * Writes a boolean value to the buffer as a varint.
+ * @param {boolean} value The value to write.
  */
 jspb.BinaryEncoder.prototype.writeBool = function(value) {
-  goog.asserts.assert(goog.isBoolean(value) || goog.isNumber(value));
+  goog.asserts.assert(goog.isBoolean(value));
   this.buffer_.push(value ? 1 : 0);
 };
 
@@ -455,35 +410,18 @@
 jspb.BinaryEncoder.prototype.writeString = function(value) {
   var oldLength = this.buffer_.length;
 
+  // UTF16 to UTF8 conversion loop swiped from goog.crypt.stringToUtf8ByteArray.
   for (var i = 0; i < value.length; i++) {
-
     var c = value.charCodeAt(i);
-
     if (c < 128) {
       this.buffer_.push(c);
     } else if (c < 2048) {
       this.buffer_.push((c >> 6) | 192);
       this.buffer_.push((c & 63) | 128);
-    } else if (c < 65536) {
-      // Look for surrogates
-      if (c >= 0xD800 && c <= 0xDBFF && i + 1 < value.length) {
-        var second = value.charCodeAt(i + 1);
-        if (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate
-          // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
-          c = (c - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
-
-          this.buffer_.push((c >> 18) | 240);
-          this.buffer_.push(((c >> 12) & 63 ) | 128);
-          this.buffer_.push(((c >> 6) & 63) | 128);
-          this.buffer_.push((c & 63) | 128);
-          i++;
-        }
-      }
-      else {
-        this.buffer_.push((c >> 12) | 224);
-        this.buffer_.push(((c >> 6) & 63) | 128);
-        this.buffer_.push((c & 63) | 128);
-      }
+    } else {
+      this.buffer_.push((c >> 12) | 224);
+      this.buffer_.push(((c >> 6) & 63) | 128);
+      this.buffer_.push((c & 63) | 128);
     }
   }
 
diff --git a/js/binary/message_test.js b/js/binary/message_test.js
deleted file mode 100644
index 4edc666..0000000
--- a/js/binary/message_test.js
+++ /dev/null
@@ -1,60 +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.
-
-// Test suite is written using Jasmine -- see http://jasmine.github.io/
-
-goog.setTestOnly();
-
-goog.require('goog.testing.asserts');
-
-// CommonJS-LoadFromFile: test_pb proto.jspb.test
-goog.require('proto.jspb.test.Deeply.Nested.Message');
-
-// CommonJS-LoadFromFile: test2_pb proto.jspb.test
-goog.require('proto.jspb.test.ForeignNestedFieldMessage');
-
-describe('Message test suite', function() {
-  // Verify that we can successfully use a field referring to a nested message
-  // from a different .proto file.
-  it('testForeignNestedMessage', function() {
-    var msg = new proto.jspb.test.ForeignNestedFieldMessage();
-    var nested = new proto.jspb.test.Deeply.Nested.Message();
-    nested.setCount(5);
-    msg.setDeeplyNestedMessage(nested);
-    assertEquals(5, msg.getDeeplyNestedMessage().getCount());
-
-    // After a serialization-deserialization round trip we should get back the
-    // same data we started with.
-    var serialized = msg.serializeBinary();
-    var deserialized =
-        proto.jspb.test.ForeignNestedFieldMessage.deserializeBinary(serialized);
-    assertEquals(5, deserialized.getDeeplyNestedMessage().getCount());
-  });
-});
diff --git a/js/binary/proto_test.js b/js/binary/proto_test.js
index f5e1b6b..14d0f42 100644
--- a/js/binary/proto_test.js
+++ b/js/binary/proto_test.js
@@ -32,7 +32,6 @@
 
 goog.require('goog.crypt.base64');
 goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryWriter');
 goog.require('jspb.Message');
 
 // CommonJS-LoadFromFile: ../testbinary_pb proto.jspb.test
@@ -88,9 +87,6 @@
 goog.require('proto.jspb.test.extendRepeatedUint32List');
 goog.require('proto.jspb.test.extendRepeatedUint64List');
 
-// CommonJS-LoadFromFile: ../node_modules/google-protobuf/google/protobuf/any_pb proto.google.protobuf
-goog.require('proto.google.protobuf.Any');
-
 
 var suite = {};
 
@@ -198,6 +194,8 @@
  * @param {proto.jspb.test.TestAllTypes} copy
  */
 function checkAllFields(original, copy) {
+  assertTrue(jspb.Message.equals(original, copy));
+
   assertEquals(copy.getOptionalInt32(), -42);
   assertEquals(copy.getOptionalInt64(), -0x7fffffff00000000);
   assertEquals(copy.getOptionalUint32(), 0x80000000);
@@ -272,9 +270,6 @@
   assertElementsEquals(copy.getPackedRepeatedFloatList(), [1.5]);
   assertElementsEquals(copy.getPackedRepeatedDoubleList(), [-1.5]);
 
-
-  // Check last so we get more granular errors first.
-  assertTrue(jspb.Message.equals(original, copy));
 }
 
 
@@ -283,7 +278,8 @@
  * @param {!proto.jspb.test.TestExtendable} msg
  */
 function checkExtensions(msg) {
-  assertEquals(0, msg.getExtension(proto.jspb.test.extendOptionalInt32));
+  assertEquals(-42,
+      msg.getExtension(proto.jspb.test.extendOptionalInt32));
   assertEquals(-0x7fffffff00000000,
       msg.getExtension(proto.jspb.test.extendOptionalInt64));
   assertEquals(0x80000000,
@@ -500,7 +496,7 @@
     msg.setRepeatedBytesList([BYTES_B64, BYTES_B64]);
     assertGetters();
 
-    msg.setRepeatedBytesList([]);
+    msg.setRepeatedBytesList(null);
     assertEquals(0, msg.getRepeatedBytesList().length);
     assertEquals(0, msg.getRepeatedBytesList_asB64().length);
     assertEquals(0, msg.getRepeatedBytesList_asU8().length);
@@ -511,7 +507,8 @@
    * @param {proto.jspb.test.TestExtendable} msg
    */
   function fillExtensions(msg) {
-    msg.setExtension(proto.jspb.test.extendOptionalInt32, 0);
+    msg.setExtension(
+        proto.jspb.test.extendOptionalInt32, -42);
     msg.setExtension(
         proto.jspb.test.extendOptionalInt64, -0x7fffffff00000000);
     msg.setExtension(
@@ -628,36 +625,4 @@
     var decoded = proto.jspb.test.TestExtendable.deserializeBinary(encoded);
     checkExtensions(decoded);
   });
-
-  /**
-   * Tests that unknown extensions don't cause deserialization failure.
-   */
-  it('testUnknownExtension', function() {
-    var msg = new proto.jspb.test.TestExtendable();
-    fillExtensions(msg);
-    var writer = new jspb.BinaryWriter();
-    writer.writeBool((1 << 29) - 1, true);
-    proto.jspb.test.TestExtendable.serializeBinaryToWriter(msg, writer);
-    var encoded = writer.getResultBuffer();
-    var decoded = proto.jspb.test.TestExtendable.deserializeBinary(encoded);
-    checkExtensions(decoded);
-  });
-
-  it('testAnyWellKnownType', function() {
-    var any = new proto.google.protobuf.Any();
-    var msg = new proto.jspb.test.TestAllTypes();
-
-    fillAllFields(msg);
-
-    any.pack(msg.serializeBinary(), 'jspb.test.TestAllTypes');
-
-    assertEquals('type.googleapis.com/jspb.test.TestAllTypes',
-                 any.getTypeUrl());
-
-    var msg2 = any.unpack(
-        proto.jspb.test.TestAllTypes.deserializeBinary,
-        'jspb.test.TestAllTypes');
-
-    checkAllFields(msg, msg2);
-  });
 });
diff --git a/js/binary/reader.js b/js/binary/reader.js
index d5d698f..15f9043 100644
--- a/js/binary/reader.js
+++ b/js/binary/reader.js
@@ -744,20 +744,6 @@
 
 
 /**
- * Reads a signed zigzag-encoded 64-bit integer field from the binary stream,
- * or throws an error if the next field in the stream is not of the correct
- * wire type.
- *
- * @return {string} The value of the signed 64-bit integer field as a decimal string.
- */
-jspb.BinaryReader.prototype.readSint64String = function() {
-  goog.asserts.assert(
-      this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
-  return this.decoder_.readZigzagVarint64String();
-};
-
-
-/**
  * Reads an unsigned 32-bit fixed-length integer fiield from the binary stream,
  * or throws an error if the next field in the stream is not of the correct
  * wire type.
@@ -786,28 +772,11 @@
 
 
 /**
- * Reads a signed 64-bit integer field from the binary stream as a string, or
- * throws an error if the next field in the stream is not of the correct wire
- * type.
- *
- * Returns the value as a string.
- *
- * @return {string} The value of the unsigned 64-bit integer field as a decimal
- * string.
- */
-jspb.BinaryReader.prototype.readFixed64String = function() {
-  goog.asserts.assert(
-      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
-  return this.decoder_.readUint64String();
-};
-
-
-/**
  * Reads a signed 32-bit fixed-length integer fiield from the binary stream, or
  * throws an error if the next field in the stream is not of the correct wire
  * type.
  *
- * @return {number} The value of the signed 32-bit integer field.
+ * @return {number} The value of the double field.
  */
 jspb.BinaryReader.prototype.readSfixed32 = function() {
   goog.asserts.assert(
@@ -817,26 +786,11 @@
 
 
 /**
- * Reads a signed 32-bit fixed-length integer fiield from the binary stream, or
- * throws an error if the next field in the stream is not of the correct wire
- * type.
- *
- * @return {string} The value of the signed 32-bit integer field as a decimal
- * string.
- */
-jspb.BinaryReader.prototype.readSfixed32String = function() {
-  goog.asserts.assert(
-      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
-  return this.decoder_.readInt32().toString();
-};
-
-
-/**
  * Reads a signed 64-bit fixed-length integer fiield from the binary stream, or
  * throws an error if the next field in the stream is not of the correct wire
  * type.
  *
- * @return {number} The value of the sfixed64 field.
+ * @return {number} The value of the float field.
  */
 jspb.BinaryReader.prototype.readSfixed64 = function() {
   goog.asserts.assert(
@@ -846,22 +800,6 @@
 
 
 /**
- * Reads a signed 64-bit fixed-length integer fiield from the binary stream, or
- * throws an error if the next field in the stream is not of the correct wire
- * type.
- *
- * Returns the value as a string.
- *
- * @return {string} The value of the sfixed64 field as a decimal string.
- */
-jspb.BinaryReader.prototype.readSfixed64String = function() {
-  goog.asserts.assert(
-      this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
-  return this.decoder_.readInt64String();
-};
-
-
-/**
  * Reads a 32-bit floating-point field from the binary stream, or throws an
  * error if the next field in the stream is not of the correct wire type.
  *
@@ -971,7 +909,7 @@
 
 /**
  * Reads a packed scalar field using the supplied raw reader function.
- * @param {function(this:jspb.BinaryDecoder)} decodeMethod
+ * @param {function()} decodeMethod
  * @return {!Array}
  * @private
  */
@@ -1090,16 +1028,6 @@
 
 
 /**
- * Reads a packed sint64 field, which consists of a length header and a list of
- * zigzag varints.  Returns a list of strings.
- * @return {!Array.<string>}
- */
-jspb.BinaryReader.prototype.readPackedSint64String = function() {
-  return this.readPackedField_(this.decoder_.readZigzagVarint64String);
-};
-
-
-/**
  * Reads a packed fixed32 field, which consists of a length header and a list
  * of unsigned 32-bit ints.
  * @return {!Array.<number>}
@@ -1120,16 +1048,6 @@
 
 
 /**
- * Reads a packed fixed64 field, which consists of a length header and a list
- * of unsigned 64-bit ints.  Returns a list of strings.
- * @return {!Array.<number>}
- */
-jspb.BinaryReader.prototype.readPackedFixed64String = function() {
-  return this.readPackedField_(this.decoder_.readUint64String);
-};
-
-
-/**
  * Reads a packed sfixed32 field, which consists of a length header and a list
  * of 32-bit ints.
  * @return {!Array.<number>}
@@ -1150,16 +1068,6 @@
 
 
 /**
- * Reads a packed sfixed64 field, which consists of a length header and a list
- * of 64-bit ints.  Returns a list of strings.
- * @return {!Array.<string>}
- */
-jspb.BinaryReader.prototype.readPackedSfixed64String = function() {
-  return this.readPackedField_(this.decoder_.readInt64String);
-};
-
-
-/**
  * Reads a packed float field, which consists of a length header and a list of
  * floats.
  * @return {!Array.<number>}
diff --git a/js/binary/reader_test.js b/js/binary/reader_test.js
index 9571138..6f7e5d4 100644
--- a/js/binary/reader_test.js
+++ b/js/binary/reader_test.js
@@ -52,8 +52,9 @@
 describe('binaryReaderTest', function() {
   /**
    * Tests the reader instance cache.
+   * @suppress {visibility}
    */
-  it('testInstanceCaches', /** @suppress {visibility} */ function() {
+  it('testInstanceCaches', function() {
     var writer = new jspb.BinaryWriter();
     var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
     writer.writeMessage(1, dummyMessage, goog.nullFunction);
@@ -130,8 +131,9 @@
 
   /**
    * Verifies that misuse of the reader class triggers assertions.
+   * @suppress {checkTypes|visibility}
    */
-  it('testReadErrors', /** @suppress {checkTypes|visibility} */ function() {
+  it('testReadErrors', function() {
     // Calling readMessage on a non-delimited field should trigger an
     // assertion.
     var reader = jspb.BinaryReader.alloc([8, 1]);
@@ -198,7 +200,7 @@
    * @private
    * @suppress {missingProperties}
    */
-  var doTestUnsignedField_ = function(readField,
+  function doTestUnsignedField_(readField,
       writeField, epsilon, upperLimit, filter) {
     assertNotNull(readField);
     assertNotNull(writeField);
@@ -250,7 +252,7 @@
    * @private
    * @suppress {missingProperties}
    */
-  var doTestSignedField_ = function(readField,
+  function doTestSignedField_(readField,
       writeField, epsilon, lowerLimit, upperLimit, filter) {
     var writer = new jspb.BinaryWriter();
 
@@ -319,12 +321,12 @@
    * Tests fields that use varint encoding.
    */
   it('testVarintFields', function() {
-    assertNotUndefined(jspb.BinaryReader.prototype.readUint32);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeUint32);
-    assertNotUndefined(jspb.BinaryReader.prototype.readUint64);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeUint64);
-    assertNotUndefined(jspb.BinaryReader.prototype.readBool);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeBool);
+    assertNotNull(jspb.BinaryReader.prototype.readUint32);
+    assertNotNull(jspb.BinaryReader.prototype.writeUint32);
+    assertNotNull(jspb.BinaryReader.prototype.readUint64);
+    assertNotNull(jspb.BinaryReader.prototype.writeUint64);
+    assertNotNull(jspb.BinaryReader.prototype.readBool);
+    assertNotNull(jspb.BinaryReader.prototype.writeBool);
     doTestUnsignedField_(
         jspb.BinaryReader.prototype.readUint32,
         jspb.BinaryWriter.prototype.writeUint32,
@@ -358,57 +360,6 @@
 
 
   /**
-   * Tests reading a field from hexadecimal string (format: '08 BE EF').
-   * @param {Function} readField
-   * @param {number} expected
-   * @param {string} hexString
-   */
-  function doTestHexStringVarint_(readField, expected, hexString) {
-    var bytesCount = (hexString.length + 1) / 3;
-    var bytes = new Uint8Array(bytesCount);
-    for (var i = 0; i < bytesCount; i++) {
-      bytes[i] = parseInt(hexString.substring(i * 3, i * 3 + 2), 16);
-    }
-    var reader = jspb.BinaryReader.alloc(bytes);
-    reader.nextField();
-    assertEquals(expected, readField.call(reader));
-  }
-
-
-  /**
-   * Tests non-canonical redundant varint decoding.
-   */
-  it('testRedundantVarintFields', function() {
-    assertNotNull(jspb.BinaryReader.prototype.readUint32);
-    assertNotNull(jspb.BinaryReader.prototype.readUint64);
-    assertNotNull(jspb.BinaryReader.prototype.readSint32);
-    assertNotNull(jspb.BinaryReader.prototype.readSint64);
-
-    // uint32 and sint32 take no more than 5 bytes
-    // 08 - field prefix (type = 0 means varint)
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readUint32,
-      12, '08 8C 80 80 80 00');
-
-    // 11 stands for -6 in zigzag encoding
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readSint32,
-      -6, '08 8B 80 80 80 00');
-
-    // uint64 and sint64 take no more than 10 bytes
-    // 08 - field prefix (type = 0 means varint)
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readUint64,
-      12, '08 8C 80 80 80 80 80 80 80 80 00');
-
-    // 11 stands for -6 in zigzag encoding
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readSint64,
-      -6, '08 8B 80 80 80 80 80 80 80 80 00');
-  });
-
-
-  /**
    * Tests 64-bit fields that are handled as strings.
    */
   it('testStringInt64Fields', function() {
diff --git a/js/binary/utils.js b/js/binary/utils.js
index c706bff..5140555 100644
--- a/js/binary/utils.js
+++ b/js/binary/utils.js
@@ -38,7 +38,6 @@
 goog.provide('jspb.utils');
 
 goog.require('goog.asserts');
-goog.require('goog.crypt');
 goog.require('goog.crypt.base64');
 goog.require('goog.string');
 goog.require('jspb.BinaryConstants');
@@ -431,7 +430,7 @@
 
 /**
  * Individual digits for number->string conversion.
- * @const {!Array.<string>}
+ * @const {!Array.<number>}
  */
 jspb.utils.DIGITS = [
   '0', '1', '2', '3', '4', '5', '6', '7',
@@ -614,17 +613,7 @@
     muladd(1, 1);
   }
 
-  return goog.crypt.byteArrayToString(resultBytes);
-};
-
-
-/**
- * Converts a signed or unsigned decimal string into two 32-bit halves, and
- * stores them in the temp variables listed above.
- * @param {string} value The decimal string to convert.
- */
-jspb.utils.splitDecimalString = function(value) {
-  jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(value));
+  return String.fromCharCode.apply(null, resultBytes);
 };
 
 
diff --git a/js/binary/utils_test.js b/js/binary/utils_test.js
index 6b481dc..d27e5ea 100644
--- a/js/binary/utils_test.js
+++ b/js/binary/utils_test.js
@@ -36,7 +36,6 @@
  * @author aappleby@google.com (Austin Appleby)
  */
 
-goog.require('goog.crypt');
 goog.require('goog.crypt.base64');
 goog.require('goog.testing.asserts');
 goog.require('jspb.BinaryConstants');
@@ -206,31 +205,31 @@
     var convert = jspb.utils.decimalStringToHash64;
 
     result = convert('0');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
 
     result = convert('-1');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
 
     result = convert('18446744073709551615');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
 
     result = convert('9223372036854775808');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
 
     result = convert('-9223372036854775808');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
 
     result = convert('123456789123456789');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0x15, 0x5F, 0xD0, 0xAC, 0x4B, 0x9B, 0xB6, 0x01]), result);
 
     result = convert('-123456789123456789');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
       [0xEB, 0xA0, 0x2F, 0x53, 0xB4, 0x64, 0x49, 0xFE]), result);
   });
 
@@ -260,21 +259,21 @@
     var convert = jspb.utils.hexStringToHash64;
 
     result = convert('0x0000000000000000');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
         [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
 
     result = convert('0xffffffffffffffff');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
         [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
 
     // Hex string is big-endian, hash string is little-endian.
     result = convert('0x123456789ABCDEF0');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
         [0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12]), result);
 
     // Capitalization should not matter.
     result = convert('0x0000abcdefABCDEF');
-    assertEquals(goog.crypt.byteArrayToString(
+    assertEquals(String.fromCharCode.apply(null,
         [0xEF, 0xCD, 0xAB, 0xEF, 0xCD, 0xAB, 0x00, 0x00]), result);
   });
 
@@ -644,7 +643,7 @@
     var sourceBytes = new Uint8Array(sourceData);
     var sourceBuffer = sourceBytes.buffer;
     var sourceBase64 = goog.crypt.base64.encodeByteArray(sourceData);
-    var sourceString = goog.crypt.byteArrayToString(sourceData);
+    var sourceString = String.fromCharCode.apply(null, sourceData);
 
     function check(result) {
       assertEquals(Uint8Array, result.constructor);
diff --git a/js/binary/writer.js b/js/binary/writer.js
index 037e92b..be4478e 100644
--- a/js/binary/writer.js
+++ b/js/binary/writer.js
@@ -235,7 +235,7 @@
 
 
 /**
- * Converts the encoded data into a base64-encoded string.
+ * Converts the encoded data into a bas64-encoded string.
  * @return {string}
  */
 jspb.BinaryWriter.prototype.getResultBase64String = function() {
@@ -435,20 +435,6 @@
 
 
 /**
- * Writes a zigzag varint field to the buffer without range checking.
- * @param {number} field The field number.
- * @param {string?} value The value to write.
- * @private
- */
-jspb.BinaryWriter.prototype.writeZigzagVarint64String_ = function(
-    field, value) {
-  if (value == null) return;
-  this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.VARINT);
-  this.encoder_.writeZigzagVarint64String(value);
-};
-
-
-/**
  * Writes an int32 field to the buffer. Numbers outside the range [-2^31,2^31)
  * will be truncated.
  * @param {number} field The field number.
@@ -589,20 +575,6 @@
 
 
 /**
- * Writes a sint64 field to the buffer. Numbers outside the range [-2^63,2^63)
- * will be truncated.
- * @param {number} field The field number.
- * @param {string?} value The decimal string to write.
- */
-jspb.BinaryWriter.prototype.writeSint64String = function(field, value) {
-  if (value == null) return;
-  goog.asserts.assert((+value >= -jspb.BinaryConstants.TWO_TO_63) &&
-                      (+value < jspb.BinaryConstants.TWO_TO_63));
-  this.writeZigzagVarint64String_(field, value);
-};
-
-
-/**
  * Writes a fixed32 field to the buffer. Numbers outside the range [0,2^32)
  * will be truncated.
  * @param {number} field The field number.
@@ -633,19 +605,6 @@
 
 
 /**
- * Writes a fixed64 field (with value as a string) to the buffer.
- * @param {number} field The field number.
- * @param {string?} value The value to write.
- */
-jspb.BinaryWriter.prototype.writeFixed64String = function(field, value) {
-  if (value == null) return;
-  var num = jspb.arith.UInt64.fromString(value);
-  this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.FIXED64);
-  this.encoder_.writeSplitFixed64(num.lo, num.hi);
-};
-
-
-/**
  * Writes a sfixed32 field to the buffer. Numbers outside the range
  * [-2^31,2^31) will be truncated.
  * @param {number} field The field number.
@@ -676,20 +635,6 @@
 
 
 /**
- * Writes a sfixed64 string field to the buffer. Numbers outside the range
- * [-2^63,2^63) will be truncated.
- * @param {number} field The field number.
- * @param {string?} value The value to write.
- */
-jspb.BinaryWriter.prototype.writeSfixed64String = function(field, value) {
-  if (value == null) return;
-  var num = jspb.arith.Int64.fromString(value);
-  this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.FIXED64);
-  this.encoder_.writeSplitFixed64(num.lo, num.hi);
-};
-
-
-/**
  * Writes a single-precision floating point field to the buffer. Numbers
  * requiring more than 32 bits of precision will be truncated.
  * @param {number} field The field number.
@@ -716,15 +661,13 @@
 
 
 /**
- * Writes a boolean field to the buffer. We allow numbers as input
- * because the JSPB code generator uses 0/1 instead of true/false to save space
- * in the string representation of the proto.
+ * Writes a boolean field to the buffer.
  * @param {number} field The field number.
- * @param {boolean?|number?} value The value to write.
+ * @param {boolean?} value The value to write.
  */
 jspb.BinaryWriter.prototype.writeBool = function(field, value) {
   if (value == null) return;
-  goog.asserts.assert(goog.isBoolean(value) || goog.isNumber(value));
+  goog.asserts.assert(goog.isBoolean(value));
   this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.VARINT);
   this.encoder_.writeBool(value);
 };
@@ -774,19 +717,11 @@
 
 /**
  * Writes a message to the buffer.
+ * @template MessageType
  * @param {number} field The field number.
  * @param {?MessageType} value The message to write.
- * @param {function(MessageTypeNonNull, !jspb.BinaryWriter)} writerCallback
- *     Will be invoked with the value to write and the writer to write it with.
- * @template MessageType
- * Use go/closure-ttl to declare a non-nullable version of MessageType.  Replace
- * the null in blah|null with none.  This is necessary because the compiler will
- * infer MessageType to be nullable if the value parameter is nullable.
- * @template MessageTypeNonNull :=
- *     cond(isUnknown(MessageType), unknown(),
- *       mapunion(MessageType, (X) =>
- *         cond(eq(X, 'null'), none(), X)))
- * =:
+ * @param {!jspb.WriterFunction} writerCallback Will be invoked with the value
+ *     to write and the writer to write it with.
  */
 jspb.BinaryWriter.prototype.writeMessage = function(
     field, value, writerCallback) {
@@ -800,20 +735,12 @@
 /**
  * Writes a group message to the buffer.
  *
+ * @template MessageType
  * @param {number} field The field number.
  * @param {?MessageType} value The message to write, wrapped with START_GROUP /
  *     END_GROUP tags. Will be a no-op if 'value' is null.
- * @param {function(MessageTypeNonNull, !jspb.BinaryWriter)} writerCallback
- *     Will be invoked with the value to write and the writer to write it with.
- * @template MessageType
- * Use go/closure-ttl to declare a non-nullable version of MessageType.  Replace
- * the null in blah|null with none.  This is necessary because the compiler will
- * infer MessageType to be nullable if the value parameter is nullable.
- * @template MessageTypeNonNull :=
- *     cond(isUnknown(MessageType), unknown(),
- *       mapunion(MessageType, (X) =>
- *         cond(eq(X, 'null'), none(), X)))
- * =:
+ * @param {!jspb.WriterFunction} writerCallback Will be invoked with the value
+ *     to write and the writer to write it with.
  */
 jspb.BinaryWriter.prototype.writeGroup = function(
     field, value, writerCallback) {
@@ -853,11 +780,28 @@
 
 
 /**
- * Writes an array of numbers to the buffer as a repeated 32-bit int field.
+ * Writes an array of numbers to the buffer as a repeated varint field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
+ * @private
  */
-jspb.BinaryWriter.prototype.writeRepeatedInt32 = function(field, value) {
+jspb.BinaryWriter.prototype.writeRepeatedUnsignedVarint32_ =
+    function(field, value) {
+  if (value == null) return;
+  for (var i = 0; i < value.length; i++) {
+    this.writeUnsignedVarint32_(field, value[i]);
+  }
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a repeated varint field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writeRepeatedSignedVarint32_ =
+    function(field, value) {
   if (value == null) return;
   for (var i = 0; i < value.length; i++) {
     this.writeSignedVarint32_(field, value[i]);
@@ -866,12 +810,80 @@
 
 
 /**
+ * Writes an array of numbers to the buffer as a repeated varint field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writeRepeatedUnsignedVarint64_ =
+    function(field, value) {
+  if (value == null) return;
+  for (var i = 0; i < value.length; i++) {
+    this.writeUnsignedVarint64_(field, value[i]);
+  }
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a repeated varint field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writeRepeatedSignedVarint64_ =
+    function(field, value) {
+  if (value == null) return;
+  for (var i = 0; i < value.length; i++) {
+    this.writeSignedVarint64_(field, value[i]);
+  }
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a repeated zigzag field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writeRepeatedZigzag32_ = function(field, value) {
+  if (value == null) return;
+  for (var i = 0; i < value.length; i++) {
+    this.writeZigzagVarint32_(field, value[i]);
+  }
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a repeated zigzag field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writeRepeatedZigzag_ = function(field, value) {
+  if (value == null) return;
+  for (var i = 0; i < value.length; i++) {
+    this.writeZigzagVarint64_(field, value[i]);
+  }
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a repeated 32-bit int field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ */
+jspb.BinaryWriter.prototype.writeRepeatedInt32 =
+    jspb.BinaryWriter.prototype.writeRepeatedSignedVarint32_;
+
+
+/**
  * Writes an array of numbers formatted as strings to the buffer as a repeated
  * 32-bit int field.
  * @param {number} field The field number.
  * @param {?Array.<string>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedInt32String = function(field, value) {
+jspb.BinaryWriter.prototype.writeRepeatedInt32String =
+    function(field, value) {
   if (value == null) return;
   for (var i = 0; i < value.length; i++) {
     this.writeInt32String(field, value[i]);
@@ -884,12 +896,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedInt64 = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeSignedVarint64_(field, value[i]);
-  }
-};
+jspb.BinaryWriter.prototype.writeRepeatedInt64 =
+    jspb.BinaryWriter.prototype.writeRepeatedSignedVarint64_;
 
 
 /**
@@ -898,7 +906,8 @@
  * @param {number} field The field number.
  * @param {?Array.<string>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedInt64String = function(field, value) {
+jspb.BinaryWriter.prototype.writeRepeatedInt64String =
+    function(field, value) {
   if (value == null) return;
   for (var i = 0; i < value.length; i++) {
     this.writeInt64String(field, value[i]);
@@ -912,12 +921,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedUint32 = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeUnsignedVarint32_(field, value[i]);
-  }
-};
+jspb.BinaryWriter.prototype.writeRepeatedUint32 =
+    jspb.BinaryWriter.prototype.writeRepeatedUnsignedVarint32_;
 
 
 /**
@@ -926,7 +931,8 @@
  * @param {number} field The field number.
  * @param {?Array.<string>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedUint32String = function(field, value) {
+jspb.BinaryWriter.prototype.writeRepeatedUint32String =
+    function(field, value) {
   if (value == null) return;
   for (var i = 0; i < value.length; i++) {
     this.writeUint32String(field, value[i]);
@@ -940,12 +946,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedUint64 = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeUnsignedVarint64_(field, value[i]);
-  }
-};
+jspb.BinaryWriter.prototype.writeRepeatedUint64 =
+    jspb.BinaryWriter.prototype.writeRepeatedUnsignedVarint64_;
 
 
 /**
@@ -954,7 +956,8 @@
  * @param {number} field The field number.
  * @param {?Array.<string>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedUint64String = function(field, value) {
+jspb.BinaryWriter.prototype.writeRepeatedUint64String =
+    function(field, value) {
   if (value == null) return;
   for (var i = 0; i < value.length; i++) {
     this.writeUint64String(field, value[i]);
@@ -967,12 +970,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedSint32 = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeZigzagVarint32_(field, value[i]);
-  }
-};
+jspb.BinaryWriter.prototype.writeRepeatedSint32 =
+    jspb.BinaryWriter.prototype.writeRepeatedZigzag32_;
 
 
 /**
@@ -980,25 +979,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writeRepeatedSint64 = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeZigzagVarint64_(field, value[i]);
-  }
-};
-
-
-/**
- * Writes an array numbers to the buffer as a repeated signed 64-bit int field.
- * @param {number} field The field number.
- * @param {?Array.<string>} value The array of ints to write.
- */
-jspb.BinaryWriter.prototype.writeRepeatedSint64String = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeZigzagVarint64String_(field, value[i]);
-  }
-};
+jspb.BinaryWriter.prototype.writeRepeatedSint64 =
+    jspb.BinaryWriter.prototype.writeRepeatedZigzag_;
 
 
 /**
@@ -1030,21 +1012,6 @@
 
 
 /**
- * Writes an array of numbers to the buffer as a repeated fixed64 field. This
- * works for both signed and unsigned fixed64s.
- * @param {number} field The field number.
- * @param {?Array.<string>} value The array of decimal strings to write.
- */
-jspb.BinaryWriter.prototype.writeRepeatedFixed64String = function(
-    field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeFixed64String(field, value[i]);
-  }
-};
-
-
-/**
  * Writes an array of numbers to the buffer as a repeated sfixed32 field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
@@ -1071,20 +1038,6 @@
 
 
 /**
- * Writes an array of decimal strings to the buffer as a repeated sfixed64
- * field.
- * @param {number} field The field number.
- * @param {?Array.<string>} value The array of decimal strings to write.
- */
-jspb.BinaryWriter.prototype.writeRepeatedSfixed64String = function(field, value) {
-  if (value == null) return;
-  for (var i = 0; i < value.length; i++) {
-    this.writeSfixed64String(field, value[i]);
-  }
-};
-
-
-/**
  * Writes an array of numbers to the buffer as a repeated float field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
@@ -1169,8 +1122,8 @@
  * @param {number} field The field number.
  * @param {?Array.<MessageType>} value The array of messages to
  *    write.
- * @param {function(MessageType, !jspb.BinaryWriter)} writerCallback
- *     Will be invoked with the value to write and the writer to write it with.
+ * @param {!jspb.WriterFunction} writerCallback Will be invoked with the value
+ *     to write and the writer to write it with.
  */
 jspb.BinaryWriter.prototype.writeRepeatedMessage = function(
     field, value, writerCallback) {
@@ -1189,8 +1142,8 @@
  * @param {number} field The field number.
  * @param {?Array.<MessageType>} value The array of messages to
  *    write.
- * @param {function(MessageType, !jspb.BinaryWriter)} writerCallback
- *     Will be invoked with the value to write and the writer to write it with.
+ * @param {!jspb.WriterFunction} writerCallback Will be invoked with the value
+ *     to write and the writer to write it with.
  */
 jspb.BinaryWriter.prototype.writeRepeatedGroup = function(
     field, value, writerCallback) {
@@ -1234,11 +1187,30 @@
 
 
 /**
- * Writes an array of numbers to the buffer as a packed 32-bit int field.
+ * Writes an array of numbers to the buffer as a packed varint field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
+ * @private
  */
-jspb.BinaryWriter.prototype.writePackedInt32 = function(field, value) {
+jspb.BinaryWriter.prototype.writePackedUnsignedVarint32_ = function(
+    field, value) {
+  if (value == null || !value.length) return;
+  var bookmark = this.beginDelimited_(field);
+  for (var i = 0; i < value.length; i++) {
+    this.encoder_.writeUnsignedVarint32(value[i]);
+  }
+  this.endDelimited_(bookmark);
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a packed varint field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writePackedSignedVarint32_ = function(
+    field, value) {
   if (value == null || !value.length) return;
   var bookmark = this.beginDelimited_(field);
   for (var i = 0; i < value.length; i++) {
@@ -1249,6 +1221,81 @@
 
 
 /**
+ * Writes an array of numbers to the buffer as a packed varint field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writePackedUnsignedVarint64_ = function(
+    field, value) {
+  if (value == null || !value.length) return;
+  var bookmark = this.beginDelimited_(field);
+  for (var i = 0; i < value.length; i++) {
+    this.encoder_.writeUnsignedVarint64(value[i]);
+  }
+  this.endDelimited_(bookmark);
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a packed varint field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writePackedSignedVarint64_ = function(
+    field, value) {
+  if (value == null || !value.length) return;
+  var bookmark = this.beginDelimited_(field);
+  for (var i = 0; i < value.length; i++) {
+    this.encoder_.writeSignedVarint64(value[i]);
+  }
+  this.endDelimited_(bookmark);
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a packed zigzag field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writePackedZigzag32_ = function(field, value) {
+  if (value == null || !value.length) return;
+  var bookmark = this.beginDelimited_(field);
+  for (var i = 0; i < value.length; i++) {
+    this.encoder_.writeZigzagVarint32(value[i]);
+  }
+  this.endDelimited_(bookmark);
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a packed zigzag field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ * @private
+ */
+jspb.BinaryWriter.prototype.writePackedZigzag64_ = function(field, value) {
+  if (value == null || !value.length) return;
+  var bookmark = this.beginDelimited_(field);
+  for (var i = 0; i < value.length; i++) {
+    this.encoder_.writeZigzagVarint64(value[i]);
+  }
+  this.endDelimited_(bookmark);
+};
+
+
+/**
+ * Writes an array of numbers to the buffer as a packed 32-bit int field.
+ * @param {number} field The field number.
+ * @param {?Array.<number>} value The array of ints to write.
+ */
+jspb.BinaryWriter.prototype.writePackedInt32 =
+    jspb.BinaryWriter.prototype.writePackedSignedVarint32_;
+
+
+/**
  * Writes an array of numbers represented as strings to the buffer as a packed
  * 32-bit int field.
  * @param {number} field
@@ -1269,14 +1316,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writePackedInt64 = function(field, value) {
-  if (value == null || !value.length) return;
-  var bookmark = this.beginDelimited_(field);
-  for (var i = 0; i < value.length; i++) {
-    this.encoder_.writeSignedVarint64(value[i]);
-  }
-  this.endDelimited_(bookmark);
-};
+jspb.BinaryWriter.prototype.writePackedInt64 =
+    jspb.BinaryWriter.prototype.writePackedSignedVarint64_;
 
 
 /**
@@ -1285,7 +1326,8 @@
  * @param {number} field
  * @param {?Array.<string>} value
  */
-jspb.BinaryWriter.prototype.writePackedInt64String = function(field, value) {
+jspb.BinaryWriter.prototype.writePackedInt64String =
+    function(field, value) {
   if (value == null || !value.length) return;
   var bookmark = this.beginDelimited_(field);
   for (var i = 0; i < value.length; i++) {
@@ -1301,14 +1343,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writePackedUint32 = function(field, value) {
-  if (value == null || !value.length) return;
-  var bookmark = this.beginDelimited_(field);
-  for (var i = 0; i < value.length; i++) {
-    this.encoder_.writeUnsignedVarint32(value[i]);
-  }
-  this.endDelimited_(bookmark);
-};
+jspb.BinaryWriter.prototype.writePackedUint32 =
+    jspb.BinaryWriter.prototype.writePackedUnsignedVarint32_;
 
 
 /**
@@ -1333,14 +1369,8 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writePackedUint64 = function(field, value) {
-  if (value == null || !value.length) return;
-  var bookmark = this.beginDelimited_(field);
-  for (var i = 0; i < value.length; i++) {
-    this.encoder_.writeUnsignedVarint64(value[i]);
-  }
-  this.endDelimited_(bookmark);
-};
+jspb.BinaryWriter.prototype.writePackedUint64 =
+    jspb.BinaryWriter.prototype.writePackedUnsignedVarint64_;
 
 
 /**
@@ -1366,46 +1396,17 @@
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writePackedSint32 = function(field, value) {
-  if (value == null || !value.length) return;
-  var bookmark = this.beginDelimited_(field);
-  for (var i = 0; i < value.length; i++) {
-    this.encoder_.writeZigzagVarint32(value[i]);
-  }
-  this.endDelimited_(bookmark);
-};
+jspb.BinaryWriter.prototype.writePackedSint32 =
+    jspb.BinaryWriter.prototype.writePackedZigzag32_;
 
 
 /**
- * Writes an array of numbers to the buffer as a packed signed 64-bit int field.
+ * Writes an array numbers to the buffer as a packed signed 64-bit int field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
  */
-jspb.BinaryWriter.prototype.writePackedSint64 = function(field, value) {
-  if (value == null || !value.length) return;
-  var bookmark = this.beginDelimited_(field);
-  for (var i = 0; i < value.length; i++) {
-    this.encoder_.writeZigzagVarint64(value[i]);
-  }
-  this.endDelimited_(bookmark);
-};
-
-
-/**
- * Writes an array of decimal strings to the buffer as a packed signed 64-bit
- * int field.
- * @param {number} field The field number.
- * @param {?Array.<string>} value The array of decimal strings to write.
- */
-jspb.BinaryWriter.prototype.writePackedSint64String = function(field, value) {
-  if (value == null || !value.length) return;
-  var bookmark = this.beginDelimited_(field);
-  for (var i = 0; i < value.length; i++) {
-    // TODO(haberman): make lossless
-    this.encoder_.writeZigzagVarint64(parseInt(value[i], 10));
-  }
-  this.endDelimited_(bookmark);
-};
+jspb.BinaryWriter.prototype.writePackedSint64 =
+    jspb.BinaryWriter.prototype.writePackedZigzag64_;
 
 
 /**
@@ -1439,23 +1440,6 @@
 
 
 /**
- * Writes an array of numbers represented as strings to the buffer as a packed
- * fixed64 field.
- * @param {number} field The field number.
- * @param {?Array.<string>} value The array of strings to write.
- */
-jspb.BinaryWriter.prototype.writePackedFixed64String = function(field, value) {
-  if (value == null || !value.length) return;
-  this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.DELIMITED);
-  this.encoder_.writeUnsignedVarint32(value.length * 8);
-  for (var i = 0; i < value.length; i++) {
-    var num = jspb.arith.UInt64.fromString(value[i]);
-    this.encoder_.writeSplitFixed64(num.lo, num.hi);
-  }
-};
-
-
-/**
  * Writes an array of numbers to the buffer as a packed sfixed32 field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
@@ -1486,21 +1470,6 @@
 
 
 /**
- * Writes an array of numbers to the buffer as a packed sfixed64 field.
- * @param {number} field The field number.
- * @param {?Array.<string>} value The array of decimal strings to write.
- */
-jspb.BinaryWriter.prototype.writePackedSfixed64String = function(field, value) {
-  if (value == null || !value.length) return;
-  this.writeFieldHeader_(field, jspb.BinaryConstants.WireType.DELIMITED);
-  this.encoder_.writeUnsignedVarint32(value.length * 8);
-  for (var i = 0; i < value.length; i++) {
-    this.encoder_.writeInt64String(value[i]);
-  }
-};
-
-
-/**
  * Writes an array of numbers to the buffer as a packed float field.
  * @param {number} field The field number.
  * @param {?Array.<number>} value The array of ints to write.
diff --git a/js/binary/writer_test.js b/js/binary/writer_test.js
index 118eecf..54d37a2 100644
--- a/js/binary/writer_test.js
+++ b/js/binary/writer_test.js
@@ -47,7 +47,9 @@
  * @param {function()} func This function should throw an error when run.
  */
 function assertFails(func) {
-  assertThrows(func);
+  var e = assertThrows(func);
+  console.log(e);
+  //assertNotNull(e.toString().match(/Error/));
 }
 
 
diff --git a/js/commonjs/export.js b/js/commonjs/export.js
index a93ee92..a3cfbd6 100644
--- a/js/commonjs/export.js
+++ b/js/commonjs/export.js
@@ -5,27 +5,18 @@
  * the google-protobuf.js file that we build at distribution time.
  */
 
-// Include a dummy provide statement so that closurebuilder.py does not skip over this
-// file.
-goog.provide('jspb.Export');
-
 goog.require('goog.object');
 goog.require('jspb.BinaryReader');
 goog.require('jspb.BinaryWriter');
-goog.require('jspb.ExtensionFieldBinaryInfo');
 goog.require('jspb.ExtensionFieldInfo');
 goog.require('jspb.Message');
-goog.require('jspb.Map');
 
-exports.Map = jspb.Map;
 exports.Message = jspb.Message;
 exports.BinaryReader = jspb.BinaryReader;
 exports.BinaryWriter = jspb.BinaryWriter;
 exports.ExtensionFieldInfo = jspb.ExtensionFieldInfo;
-exports.ExtensionFieldBinaryInfo = jspb.ExtensionFieldBinaryInfo;
 
 // These are used by generated code but should not be used directly by clients.
 exports.exportSymbol = goog.exportSymbol;
 exports.inherits = goog.inherits;
 exports.object = {extend: goog.object.extend};
-exports.typeOf = goog.typeOf;
diff --git a/js/commonjs/export_asserts.js b/js/commonjs/export_asserts.js
index ad9446c..5219d12 100644
--- a/js/commonjs/export_asserts.js
+++ b/js/commonjs/export_asserts.js
@@ -6,10 +6,6 @@
  * closure_asserts_commonjs.js that is only used at testing time.
  */
 
-// Include a dummy provide statement so that closurebuilder.py does not skip over this
-// file.
-goog.provide('jspb.ExportAsserts');
-
 goog.require('goog.testing.asserts');
 
 var global = Function('return this')();
diff --git a/js/commonjs/export_testdeps.js b/js/commonjs/export_testdeps.js
index 6f5cd08..59c77ca 100644
--- a/js/commonjs/export_testdeps.js
+++ b/js/commonjs/export_testdeps.js
@@ -7,16 +7,11 @@
  * export_asserts.js.
  */
 
-// Include a dummy provide statement so that closurebuilder.py does not skip over this
-// file.
-goog.provide('jspb.ExportTestDeps');
-
 goog.require('goog.crypt.base64');
 goog.require('jspb.arith.Int64');
 goog.require('jspb.arith.UInt64');
 goog.require('jspb.BinaryEncoder');
 goog.require('jspb.BinaryDecoder');
-goog.require('jspb.BinaryWriter');
 goog.require('jspb.utils');
 
 exports.goog = goog;
diff --git a/js/compatibility_tests/v3.0.0/binary/arith_test.js b/js/compatibility_tests/v3.0.0/binary/arith_test.js
deleted file mode 100644
index 89796bf..0000000
--- a/js/compatibility_tests/v3.0.0/binary/arith_test.js
+++ /dev/null
@@ -1,355 +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.
-
-/**
- * @fileoverview Test cases for Int64-manipulation functions.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author cfallin@google.com (Chris Fallin)
- */
-
-goog.require('goog.testing.asserts');
-goog.require('jspb.arith.Int64');
-goog.require('jspb.arith.UInt64');
-
-
-describe('binaryArithTest', function() {
-  /**
-   * Tests comparison operations.
-   */
-  it('testCompare', function() {
-    var a = new jspb.arith.UInt64(1234, 5678);
-    var b = new jspb.arith.UInt64(1234, 5678);
-    assertEquals(a.cmp(b), 0);
-    assertEquals(b.cmp(a), 0);
-    b.lo -= 1;
-    assertEquals(a.cmp(b), 1);
-    assertEquals(b.cmp(a), -1);
-    b.lo += 2;
-    assertEquals(a.cmp(b), -1);
-    assertEquals(b.cmp(a), 1);
-    b.lo = a.lo;
-    b.hi = a.hi - 1;
-    assertEquals(a.cmp(b), 1);
-    assertEquals(b.cmp(a), -1);
-
-    assertEquals(a.zero(), false);
-    assertEquals(a.msb(), false);
-    assertEquals(a.lsb(), false);
-    a.hi = 0;
-    a.lo = 0;
-    assertEquals(a.zero(), true);
-    a.hi = 0x80000000;
-    assertEquals(a.zero(), false);
-    assertEquals(a.msb(), true);
-    a.lo = 0x00000001;
-    assertEquals(a.lsb(), true);
-  });
-
-
-  /**
-   * Tests shifts.
-   */
-  it('testShifts', function() {
-    var a = new jspb.arith.UInt64(1, 0);
-    assertEquals(a.lo, 1);
-    assertEquals(a.hi, 0);
-    var orig = a;
-    a = a.leftShift();
-    assertEquals(orig.lo, 1);  // original unmodified.
-    assertEquals(orig.hi, 0);
-    assertEquals(a.lo, 2);
-    assertEquals(a.hi, 0);
-    a = a.leftShift();
-    assertEquals(a.lo, 4);
-    assertEquals(a.hi, 0);
-    for (var i = 0; i < 29; i++) {
-      a = a.leftShift();
-    }
-    assertEquals(a.lo, 0x80000000);
-    assertEquals(a.hi, 0);
-    a = a.leftShift();
-    assertEquals(a.lo, 0);
-    assertEquals(a.hi, 1);
-    a = a.leftShift();
-    assertEquals(a.lo, 0);
-    assertEquals(a.hi, 2);
-    a = a.rightShift();
-    a = a.rightShift();
-    assertEquals(a.lo, 0x80000000);
-    assertEquals(a.hi, 0);
-    a = a.rightShift();
-    assertEquals(a.lo, 0x40000000);
-    assertEquals(a.hi, 0);
-  });
-
-
-  /**
-   * Tests additions.
-   */
-  it('testAdd', function() {
-    var a = new jspb.arith.UInt64(/* lo = */ 0x89abcdef,
-                                         /* hi = */ 0x01234567);
-    var b = new jspb.arith.UInt64(/* lo = */ 0xff52ab91,
-                                         /* hi = */ 0x92fa2123);
-    // Addition with carry.
-    var c = a.add(b);
-    assertEquals(a.lo, 0x89abcdef);  // originals unmodified.
-    assertEquals(a.hi, 0x01234567);
-    assertEquals(b.lo, 0xff52ab91);
-    assertEquals(b.hi, 0x92fa2123);
-    assertEquals(c.lo, 0x88fe7980);
-    assertEquals(c.hi, 0x941d668b);
-
-    // Simple addition without carry.
-    a.lo = 2;
-    a.hi = 0;
-    b.lo = 3;
-    b.hi = 0;
-    c = a.add(b);
-    assertEquals(c.lo, 5);
-    assertEquals(c.hi, 0);
-  });
-
-
-  /**
-   * Test subtractions.
-   */
-  it('testSub', function() {
-    var kLength = 10;
-    var hiValues = [0x1682ef32,
-                    0x583902f7,
-                    0xb62f5955,
-                    0x6ea99bbf,
-                    0x25a39c20,
-                    0x0700a08b,
-                    0x00f7304d,
-                    0x91a5b5af,
-                    0x89077fd2,
-                    0xe09e347c];
-    var loValues = [0xe1538b18,
-                    0xbeacd556,
-                    0x74100758,
-                    0x96e3cb26,
-                    0x56c37c3f,
-                    0xe00b3f7d,
-                    0x859f25d7,
-                    0xc2ee614a,
-                    0xe1d21cd7,
-                    0x30aae6a4];
-    for (var i = 0; i < kLength; i++) {
-      for (var j = 0; j < kLength; j++) {
-        var a = new jspb.arith.UInt64(loValues[i], hiValues[j]);
-        var b = new jspb.arith.UInt64(loValues[j], hiValues[i]);
-        var c = a.add(b).sub(b);
-        assertEquals(c.hi, a.hi);
-        assertEquals(c.lo, a.lo);
-      }
-    }
-  });
-
-
-  /**
-   * Tests 32-by-32 multiplication.
-   */
-  it('testMul32x32', function() {
-    var testData = [
-      // a        b          low(a*b)   high(a*b)
-      [0xc0abe2f8, 0x1607898a, 0x5de711b0, 0x109471b8],
-      [0x915eb3cb, 0x4fb66d0e, 0xbd0d441a, 0x2d43d0bc],
-      [0xfe4efe70, 0x80b48c37, 0xbcddea10, 0x7fdada0c],
-      [0xe222fd4a, 0xe43d524a, 0xd5e0eb64, 0xc99d549c],
-      [0xd171f469, 0xb94ebd01, 0x4be17969, 0x979bc4fa],
-      [0x829cc1df, 0xe2598b38, 0xf4157dc8, 0x737c12ad],
-      [0xf10c3767, 0x8382881e, 0x942b3612, 0x7bd428b8],
-      [0xb0f6dd24, 0x232597e1, 0x079c98a4, 0x184bbce7],
-      [0xfcdb05a7, 0x902f55bc, 0x636199a4, 0x8e69f412],
-      [0x0dd0bfa9, 0x916e27b1, 0x6e2542d9, 0x07d92e65]
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = testData[i][0] >>> 0;
-      var b = testData[i][1] >>> 0;
-      var cLow = testData[i][2] >>> 0;
-      var cHigh = testData[i][3] >>> 0;
-      var c = jspb.arith.UInt64.mul32x32(a, b);
-      assertEquals(c.lo, cLow);
-      assertEquals(c.hi, cHigh);
-    }
-  });
-
-
-  /**
-   * Tests 64-by-32 multiplication.
-   */
-  it('testMul', function() {
-    // 64x32 bits produces 96 bits of product. The multiplication function under
-    // test truncates the top 32 bits, so we compare against a 64-bit expected
-    // product.
-    var testData = [
-      // low(a)   high(a)               low(a*b)   high(a*b)
-      [0xec10955b, 0x360eb168, 0x4b7f3f5b, 0xbfcb7c59, 0x9517da5f],
-      [0x42b000fc, 0x9d101642, 0x6fa1ab72, 0x2584c438, 0x6a9e6d2b],
-      [0xf42d4fb4, 0xae366403, 0xa65a1000, 0x92434000, 0x1ff978df],
-      [0x17e2f56b, 0x25487693, 0xf13f98c7, 0x73794e2d, 0xa96b0c6a],
-      [0x492f241f, 0x76c0eb67, 0x7377ac44, 0xd4336c3c, 0xfc4b1ebe],
-      [0xd6b92321, 0xe184fa48, 0xd6e76904, 0x93141584, 0xcbf44da1],
-      [0x4bf007ea, 0x968c0a9e, 0xf5e4026a, 0x4fdb1ae4, 0x61b9fb7d],
-      [0x10a83be7, 0x2d685ba6, 0xc9e5fb7f, 0x2ad43499, 0x3742473d],
-      [0x2f261829, 0x1aca681a, 0x3d3494e3, 0x8213205b, 0x283719f8],
-      [0xe4f2ce21, 0x2e74b7bd, 0xd801b38b, 0xbc17feeb, 0xc6c44e0f]
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
-      var prod = a.mul(testData[i][2]);
-      assertEquals(prod.lo, testData[i][3]);
-      assertEquals(prod.hi, testData[i][4]);
-    }
-  });
-
-
-  /**
-   * Tests 64-div-by-32 division.
-   */
-  it('testDiv', function() {
-    // Compute a/b, yielding quot = a/b and rem = a%b.
-    var testData = [
-      // --- divisors in (0, 2^32-1) to test full divisor range
-      // low(a)   high(a)    b          low(quot)  high(quot) rem
-      [0x712443f1, 0xe85cefcc, 0xc1a7050b, 0x332c79ad, 0x00000001, 0x92ffa882],
-      [0x11912915, 0xb2699eb5, 0x30467cbe, 0xb21b4be4, 0x00000003, 0x283465dd],
-      [0x0d917982, 0x201f2a6e, 0x3f35bf03, 0x8217c8e4, 0x00000000, 0x153402d6],
-      [0xa072c108, 0x74020c96, 0xc60568fd, 0x95f9613e, 0x00000000, 0x3f4676c2],
-      [0xd845d5d8, 0xcdd235c4, 0x20426475, 0x6154e78b, 0x00000006, 0x202fb751],
-      [0xa4dbf71f, 0x9e90465e, 0xf08e022f, 0xa8be947f, 0x00000000, 0xbe43b5ce],
-      [0x3dbe627f, 0xa791f4b9, 0x28a5bd89, 0x1f5dfe93, 0x00000004, 0x02bf9ed4],
-      [0x5c1c53ee, 0xccf5102e, 0x198576e7, 0x07e3ae31, 0x00000008, 0x02ea8fb7],
-      [0xfef1e581, 0x04714067, 0xca6540c1, 0x059e73ec, 0x00000000, 0x31658095],
-      [0x1e2dd90c, 0x13dd6667, 0x8b2184c3, 0x248d1a42, 0x00000000, 0x4ca6d0c6],
-      // --- divisors in (0, 2^16-1) to test larger quotient high-words
-      // low(a)   high(a)    b          low(quot)  high(quot) rem
-      [0x86722b47, 0x2cd57c9a, 0x00003123, 0x2ae41b7a, 0x0000e995, 0x00000f99],
-      [0x1dd7884c, 0xf5e839bc, 0x00009eeb, 0x5c886242, 0x00018c21, 0x000099b6],
-      [0x5c53d625, 0x899fc7e5, 0x000087d7, 0xd625007a, 0x0001035c, 0x000019af],
-      [0x6932d932, 0x9d0a5488, 0x000051fb, 0x9d976143, 0x0001ea63, 0x00004981],
-      [0x4d18bb85, 0x0c92fb31, 0x00001d9f, 0x03265ab4, 0x00006cac, 0x000001b9],
-      [0xbe756768, 0xdea67ccb, 0x00008a03, 0x58add442, 0x00019cff, 0x000056a2],
-      [0xe2466f9a, 0x2521f114, 0x0000c350, 0xa0c0860d, 0x000030ab, 0x0000a48a],
-      [0xf00ddad1, 0xe2f5446a, 0x00002cfc, 0x762697a6, 0x00050b96, 0x00000b69],
-      [0xa879152a, 0x0a70e0a5, 0x00007cdf, 0xb44151b3, 0x00001567, 0x0000363d],
-      [0x7179a74c, 0x46083fff, 0x0000253c, 0x4d39ba6e, 0x0001e17f, 0x00000f84]
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
-      var result = a.div(testData[i][2]);
-      var quotient = result[0];
-      var remainder = result[1];
-      assertEquals(quotient.lo, testData[i][3]);
-      assertEquals(quotient.hi, testData[i][4]);
-      assertEquals(remainder.lo, testData[i][5]);
-    }
-  });
-
-
-  /**
-   * Tests .toString() and .fromString().
-   */
-  it('testStrings', function() {
-    var testData = [
-        [0x5e84c935, 0xcae33d0e, '14619595947299359029'],
-        [0x62b3b8b8, 0x93480544, '10612738313170434232'],
-        [0x319bfb13, 0xc01c4172, '13843011313344445203'],
-        [0x5b8a65fb, 0xa5885b31, '11927883880638080507'],
-        [0x6bdb80f1, 0xb0d1b16b, '12741159895737008369'],
-        [0x4b82b442, 0x2e0d8c97, '3318463081876730946'],
-        [0x780d5208, 0x7d76752c, '9040542135845999112'],
-        [0x2e46800f, 0x0993778d, '690026616168284175'],
-        [0xf00a7e32, 0xcd8e3931, '14811839111111540274'],
-        [0x1baeccd6, 0x923048c4, '10533999535534820566'],
-        [0x03669d29, 0xbff3ab72, '13831587386756603177'],
-        [0x2526073e, 0x01affc81, '121593346566522686'],
-        [0xc24244e0, 0xd7f40d0e, '15561076969511732448'],
-        [0xc56a341e, 0xa68b66a7, '12000798502816461854'],
-        [0x8738d64d, 0xbfe78604, '13828168534871037517'],
-        [0x5baff03b, 0xd7572aea, '15516918227177304123'],
-        [0x4a843d8a, 0x864e132b, '9677693725920476554'],
-        [0x25b4e94d, 0x22b54dc6, '2500990681505655117'],
-        [0x6bbe664b, 0x55a5cc0e, '6171563226690381387'],
-        [0xee916c81, 0xb00aabb3, '12685140089732426881']
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
-      var roundtrip = jspb.arith.UInt64.fromString(a.toString());
-      assertEquals(roundtrip.lo, a.lo);
-      assertEquals(roundtrip.hi, a.hi);
-      assertEquals(a.toString(), testData[i][2]);
-    }
-  });
-
-
-  /**
-   * Tests signed Int64s. These are built on UInt64s, so we only need to test
-   * the explicit overrides: .toString() and .fromString().
-   */
-  it('testSignedInt64', function() {
-    var testStrings = [
-        '-7847499644178593666',
-        '3771946501229139523',
-        '2872856549054995060',
-        '-5780049594274350904',
-        '3383785956695105201',
-        '2973055184857072610',
-        '-3879428459215627206',
-        '4589812431064156631',
-        '8484075557333689940',
-        '1075325817098092407',
-        '-4346697501012292314',
-        '2488620459718316637',
-        '6112655187423520672',
-        '-3655278273928612104',
-        '3439154019435803196',
-        '1004112478843763757',
-        '-6587790776614368413',
-        '664320065099714586',
-        '4760412909973292912',
-        '-7911903989602274672'
-    ];
-
-    for (var i = 0; i < testStrings.length; i++) {
-      var roundtrip =
-          jspb.arith.Int64.fromString(testStrings[i]).toString();
-      assertEquals(roundtrip, testStrings[i]);
-    }
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/binary/decoder_test.js b/js/compatibility_tests/v3.0.0/binary/decoder_test.js
deleted file mode 100644
index fce2fe1..0000000
--- a/js/compatibility_tests/v3.0.0/binary/decoder_test.js
+++ /dev/null
@@ -1,317 +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.
-
-/**
- * @fileoverview Test cases for jspb's binary protocol buffer decoder.
- *
- * There are two particular magic numbers that need to be pointed out -
- * 2^64-1025 is the largest number representable as both a double and an
- * unsigned 64-bit integer, and 2^63-513 is the largest number representable as
- * both a double and a signed 64-bit integer.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryConstants');
-goog.require('jspb.BinaryDecoder');
-goog.require('jspb.BinaryEncoder');
-
-
-/**
- * Tests encoding and decoding of unsigned types.
- * @param {Function} readValue
- * @param {Function} writeValue
- * @param {number} epsilon
- * @param {number} upperLimit
- * @param {Function} filter
- * @suppress {missingProperties|visibility}
- */
-function doTestUnsignedValue(readValue,
-    writeValue, epsilon, upperLimit, filter) {
-  var encoder = new jspb.BinaryEncoder();
-
-  // Encode zero and limits.
-  writeValue.call(encoder, filter(0));
-  writeValue.call(encoder, filter(epsilon));
-  writeValue.call(encoder, filter(upperLimit));
-
-  // Encode positive values.
-  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-    writeValue.call(encoder, filter(cursor));
-  }
-
-  var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-  // Check zero and limits.
-  assertEquals(filter(0), readValue.call(decoder));
-  assertEquals(filter(epsilon), readValue.call(decoder));
-  assertEquals(filter(upperLimit), readValue.call(decoder));
-
-  // Check positive values.
-  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-    if (filter(cursor) != readValue.call(decoder)) throw 'fail!';
-  }
-
-  // Encoding values outside the valid range should assert.
-  assertThrows(function() {writeValue.call(encoder, -1);});
-  assertThrows(function() {writeValue.call(encoder, upperLimit * 1.1);});
-}
-
-
-/**
- * Tests encoding and decoding of signed types.
- * @param {Function} readValue
- * @param {Function} writeValue
- * @param {number} epsilon
- * @param {number} lowerLimit
- * @param {number} upperLimit
- * @param {Function} filter
- * @suppress {missingProperties}
- */
-function doTestSignedValue(readValue,
-    writeValue, epsilon, lowerLimit, upperLimit, filter) {
-  var encoder = new jspb.BinaryEncoder();
-
-  // Encode zero and limits.
-  writeValue.call(encoder, filter(lowerLimit));
-  writeValue.call(encoder, filter(-epsilon));
-  writeValue.call(encoder, filter(0));
-  writeValue.call(encoder, filter(epsilon));
-  writeValue.call(encoder, filter(upperLimit));
-
-  var inputValues = [];
-
-  // Encode negative values.
-  for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) {
-    var val = filter(cursor);
-    writeValue.call(encoder, val);
-    inputValues.push(val);
-  }
-
-  // Encode positive values.
-  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-    var val = filter(cursor);
-    writeValue.call(encoder, val);
-    inputValues.push(val);
-  }
-
-  var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-  // Check zero and limits.
-  assertEquals(filter(lowerLimit), readValue.call(decoder));
-  assertEquals(filter(-epsilon), readValue.call(decoder));
-  assertEquals(filter(0), readValue.call(decoder));
-  assertEquals(filter(epsilon), readValue.call(decoder));
-  assertEquals(filter(upperLimit), readValue.call(decoder));
-
-  // Verify decoded values.
-  for (var i = 0; i < inputValues.length; i++) {
-    assertEquals(inputValues[i], readValue.call(decoder));
-  }
-
-  // Encoding values outside the valid range should assert.
-  assertThrows(function() {writeValue.call(encoder, lowerLimit * 1.1);});
-  assertThrows(function() {writeValue.call(encoder, upperLimit * 1.1);});
-}
-
-describe('binaryDecoderTest', function() {
-  /**
-   * Tests the decoder instance cache.
-   */
-  it('testInstanceCache', /** @suppress {visibility} */ function() {
-    // Empty the instance caches.
-    jspb.BinaryDecoder.instanceCache_ = [];
-
-    // Allocating and then freeing a decoder should put it in the instance
-    // cache.
-    jspb.BinaryDecoder.alloc().free();
-
-    assertEquals(1, jspb.BinaryDecoder.instanceCache_.length);
-
-    // Allocating and then freeing three decoders should leave us with three in
-    // the cache.
-
-    var decoder1 = jspb.BinaryDecoder.alloc();
-    var decoder2 = jspb.BinaryDecoder.alloc();
-    var decoder3 = jspb.BinaryDecoder.alloc();
-    decoder1.free();
-    decoder2.free();
-    decoder3.free();
-
-    assertEquals(3, jspb.BinaryDecoder.instanceCache_.length);
-  });
-
-
-  /**
-   * Tests reading 64-bit integers as hash strings.
-   */
-  it('testHashStrings', function() {
-    var encoder = new jspb.BinaryEncoder();
-
-    var hashA = String.fromCharCode(0x00, 0x00, 0x00, 0x00,
-                                    0x00, 0x00, 0x00, 0x00);
-    var hashB = String.fromCharCode(0x12, 0x34, 0x00, 0x00,
-                                    0x00, 0x00, 0x00, 0x00);
-    var hashC = String.fromCharCode(0x12, 0x34, 0x56, 0x78,
-                                    0x87, 0x65, 0x43, 0x21);
-    var hashD = String.fromCharCode(0xFF, 0xFF, 0xFF, 0xFF,
-                                    0xFF, 0xFF, 0xFF, 0xFF);
-
-    encoder.writeVarintHash64(hashA);
-    encoder.writeVarintHash64(hashB);
-    encoder.writeVarintHash64(hashC);
-    encoder.writeVarintHash64(hashD);
-
-    encoder.writeFixedHash64(hashA);
-    encoder.writeFixedHash64(hashB);
-    encoder.writeFixedHash64(hashC);
-    encoder.writeFixedHash64(hashD);
-
-    var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-    assertEquals(hashA, decoder.readVarintHash64());
-    assertEquals(hashB, decoder.readVarintHash64());
-    assertEquals(hashC, decoder.readVarintHash64());
-    assertEquals(hashD, decoder.readVarintHash64());
-
-    assertEquals(hashA, decoder.readFixedHash64());
-    assertEquals(hashB, decoder.readFixedHash64());
-    assertEquals(hashC, decoder.readFixedHash64());
-    assertEquals(hashD, decoder.readFixedHash64());
-  });
-
-
-  /**
-   * Verifies that misuse of the decoder class triggers assertions.
-   * @suppress {checkTypes|visibility}
-   */
-  it('testDecodeErrors', function() {
-    // Reading a value past the end of the stream should trigger an assertion.
-    var decoder = jspb.BinaryDecoder.alloc([0, 1, 2]);
-    assertThrows(function() {decoder.readUint64()});
-
-    // Overlong varints should trigger assertions.
-    decoder.setBlock([255, 255, 255, 255, 255, 255,
-                      255, 255, 255, 255, 255, 0]);
-    assertThrows(function() {decoder.readUnsignedVarint64()});
-    decoder.reset();
-    assertThrows(function() {decoder.readSignedVarint64()});
-    decoder.reset();
-    assertThrows(function() {decoder.readZigzagVarint64()});
-    decoder.reset();
-    assertThrows(function() {decoder.readUnsignedVarint32()});
-  });
-
-
-  /**
-   * Tests encoding and decoding of unsigned integers.
-   */
-  it('testUnsignedIntegers', function() {
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint8,
-        jspb.BinaryEncoder.prototype.writeUint8,
-        1, 0xFF, Math.round);
-
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint16,
-        jspb.BinaryEncoder.prototype.writeUint16,
-        1, 0xFFFF, Math.round);
-
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint32,
-        jspb.BinaryEncoder.prototype.writeUint32,
-        1, 0xFFFFFFFF, Math.round);
-
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint64,
-        jspb.BinaryEncoder.prototype.writeUint64,
-        1, Math.pow(2, 64) - 1025, Math.round);
-  });
-
-
-  /**
-   * Tests encoding and decoding of signed integers.
-   */
-  it('testSignedIntegers', function() {
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt8,
-        jspb.BinaryEncoder.prototype.writeInt8,
-        1, -0x80, 0x7F, Math.round);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt16,
-        jspb.BinaryEncoder.prototype.writeInt16,
-        1, -0x8000, 0x7FFF, Math.round);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt32,
-        jspb.BinaryEncoder.prototype.writeInt32,
-        1, -0x80000000, 0x7FFFFFFF, Math.round);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt64,
-        jspb.BinaryEncoder.prototype.writeInt64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-  });
-
-
-  /**
-   * Tests encoding and decoding of floats.
-   */
-  it('testFloats', function() {
-    /**
-     * @param {number} x
-     * @return {number}
-     */
-    function truncate(x) {
-      var temp = new Float32Array(1);
-      temp[0] = x;
-      return temp[0];
-    }
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readFloat,
-        jspb.BinaryEncoder.prototype.writeFloat,
-        jspb.BinaryConstants.FLOAT32_EPS,
-        -jspb.BinaryConstants.FLOAT32_MAX,
-        jspb.BinaryConstants.FLOAT32_MAX,
-        truncate);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readDouble,
-        jspb.BinaryEncoder.prototype.writeDouble,
-        jspb.BinaryConstants.FLOAT64_EPS * 10,
-        -jspb.BinaryConstants.FLOAT64_MAX,
-        jspb.BinaryConstants.FLOAT64_MAX,
-        function(x) { return x; });
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/binary/proto_test.js b/js/compatibility_tests/v3.0.0/binary/proto_test.js
deleted file mode 100644
index 14d0f42..0000000
--- a/js/compatibility_tests/v3.0.0/binary/proto_test.js
+++ /dev/null
@@ -1,628 +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.
-
-// Test suite is written using Jasmine -- see http://jasmine.github.io/
-
-goog.require('goog.crypt.base64');
-goog.require('goog.testing.asserts');
-goog.require('jspb.Message');
-
-// CommonJS-LoadFromFile: ../testbinary_pb proto.jspb.test
-goog.require('proto.jspb.test.ExtendsWithMessage');
-goog.require('proto.jspb.test.ForeignEnum');
-goog.require('proto.jspb.test.ForeignMessage');
-goog.require('proto.jspb.test.TestAllTypes');
-goog.require('proto.jspb.test.TestExtendable');
-goog.require('proto.jspb.test.extendOptionalBool');
-goog.require('proto.jspb.test.extendOptionalBytes');
-goog.require('proto.jspb.test.extendOptionalDouble');
-goog.require('proto.jspb.test.extendOptionalFixed32');
-goog.require('proto.jspb.test.extendOptionalFixed64');
-goog.require('proto.jspb.test.extendOptionalFloat');
-goog.require('proto.jspb.test.extendOptionalForeignEnum');
-goog.require('proto.jspb.test.extendOptionalInt32');
-goog.require('proto.jspb.test.extendOptionalInt64');
-goog.require('proto.jspb.test.extendOptionalSfixed32');
-goog.require('proto.jspb.test.extendOptionalSfixed64');
-goog.require('proto.jspb.test.extendOptionalSint32');
-goog.require('proto.jspb.test.extendOptionalSint64');
-goog.require('proto.jspb.test.extendOptionalString');
-goog.require('proto.jspb.test.extendOptionalUint32');
-goog.require('proto.jspb.test.extendOptionalUint64');
-goog.require('proto.jspb.test.extendPackedRepeatedBoolList');
-goog.require('proto.jspb.test.extendPackedRepeatedDoubleList');
-goog.require('proto.jspb.test.extendPackedRepeatedFixed32List');
-goog.require('proto.jspb.test.extendPackedRepeatedFixed64List');
-goog.require('proto.jspb.test.extendPackedRepeatedFloatList');
-goog.require('proto.jspb.test.extendPackedRepeatedForeignEnumList');
-goog.require('proto.jspb.test.extendPackedRepeatedInt32List');
-goog.require('proto.jspb.test.extendPackedRepeatedInt64List');
-goog.require('proto.jspb.test.extendPackedRepeatedSfixed32List');
-goog.require('proto.jspb.test.extendPackedRepeatedSfixed64List');
-goog.require('proto.jspb.test.extendPackedRepeatedSint32List');
-goog.require('proto.jspb.test.extendPackedRepeatedSint64List');
-goog.require('proto.jspb.test.extendPackedRepeatedUint32List');
-goog.require('proto.jspb.test.extendPackedRepeatedUint64List');
-goog.require('proto.jspb.test.extendRepeatedBoolList');
-goog.require('proto.jspb.test.extendRepeatedBytesList');
-goog.require('proto.jspb.test.extendRepeatedDoubleList');
-goog.require('proto.jspb.test.extendRepeatedFixed32List');
-goog.require('proto.jspb.test.extendRepeatedFixed64List');
-goog.require('proto.jspb.test.extendRepeatedFloatList');
-goog.require('proto.jspb.test.extendRepeatedForeignEnumList');
-goog.require('proto.jspb.test.extendRepeatedInt32List');
-goog.require('proto.jspb.test.extendRepeatedInt64List');
-goog.require('proto.jspb.test.extendRepeatedSfixed32List');
-goog.require('proto.jspb.test.extendRepeatedSfixed64List');
-goog.require('proto.jspb.test.extendRepeatedSint32List');
-goog.require('proto.jspb.test.extendRepeatedSint64List');
-goog.require('proto.jspb.test.extendRepeatedStringList');
-goog.require('proto.jspb.test.extendRepeatedUint32List');
-goog.require('proto.jspb.test.extendRepeatedUint64List');
-
-
-var suite = {};
-
-var BYTES = new Uint8Array([1, 2, 8, 9]);
-
-var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES);
-
-
-/**
- * Helper: fill all fields on a TestAllTypes message.
- * @param {proto.jspb.test.TestAllTypes} msg
- */
-function fillAllFields(msg) {
-  msg.setOptionalInt32(-42);
-  // can be exactly represented by JS number (64-bit double, i.e., 52-bit
-  // mantissa).
-  msg.setOptionalInt64(-0x7fffffff00000000);
-  msg.setOptionalUint32(0x80000000);
-  msg.setOptionalUint64(0xf000000000000000);
-  msg.setOptionalSint32(-100);
-  msg.setOptionalSint64(-0x8000000000000000);
-  msg.setOptionalFixed32(1234);
-  msg.setOptionalFixed64(0x1234567800000000);
-  msg.setOptionalSfixed32(-1234);
-  msg.setOptionalSfixed64(-0x1234567800000000);
-  msg.setOptionalFloat(1.5);
-  msg.setOptionalDouble(-1.5);
-  msg.setOptionalBool(true);
-  msg.setOptionalString('hello world');
-  msg.setOptionalBytes(BYTES);
-  msg.setOptionalGroup(new proto.jspb.test.TestAllTypes.OptionalGroup());
-  msg.getOptionalGroup().setA(100);
-  var submsg = new proto.jspb.test.ForeignMessage();
-  submsg.setC(16);
-  msg.setOptionalForeignMessage(submsg);
-  msg.setOptionalForeignEnum(proto.jspb.test.ForeignEnum.FOREIGN_FOO);
-  msg.setOneofString('oneof');
-
-
-  msg.setRepeatedInt32List([-42]);
-  msg.setRepeatedInt64List([-0x7fffffff00000000]);
-  msg.setRepeatedUint32List([0x80000000]);
-  msg.setRepeatedUint64List([0xf000000000000000]);
-  msg.setRepeatedSint32List([-100]);
-  msg.setRepeatedSint64List([-0x8000000000000000]);
-  msg.setRepeatedFixed32List([1234]);
-  msg.setRepeatedFixed64List([0x1234567800000000]);
-  msg.setRepeatedSfixed32List([-1234]);
-  msg.setRepeatedSfixed64List([-0x1234567800000000]);
-  msg.setRepeatedFloatList([1.5]);
-  msg.setRepeatedDoubleList([-1.5]);
-  msg.setRepeatedBoolList([true]);
-  msg.setRepeatedStringList(['hello world']);
-  msg.setRepeatedBytesList([BYTES, BYTES]);
-  msg.setRepeatedGroupList([new proto.jspb.test.TestAllTypes.RepeatedGroup()]);
-  msg.getRepeatedGroupList()[0].setA(100);
-  submsg = new proto.jspb.test.ForeignMessage();
-  submsg.setC(1000);
-  msg.setRepeatedForeignMessageList([submsg]);
-  msg.setRepeatedForeignEnumList([proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-  msg.setPackedRepeatedInt32List([-42]);
-  msg.setPackedRepeatedInt64List([-0x7fffffff00000000]);
-  msg.setPackedRepeatedUint32List([0x80000000]);
-  msg.setPackedRepeatedUint64List([0xf000000000000000]);
-  msg.setPackedRepeatedSint32List([-100]);
-  msg.setPackedRepeatedSint64List([-0x8000000000000000]);
-  msg.setPackedRepeatedFixed32List([1234]);
-  msg.setPackedRepeatedFixed64List([0x1234567800000000]);
-  msg.setPackedRepeatedSfixed32List([-1234]);
-  msg.setPackedRepeatedSfixed64List([-0x1234567800000000]);
-  msg.setPackedRepeatedFloatList([1.5]);
-  msg.setPackedRepeatedDoubleList([-1.5]);
-  msg.setPackedRepeatedBoolList([true]);
-
-}
-
-
-/**
- * Helper: compare a bytes field to an expected value
- * @param {Uint8Array|string} arr
- * @param {Uint8Array} expected
- * @return {boolean}
- */
-function bytesCompare(arr, expected) {
-  if (goog.isString(arr)) {
-    arr = goog.crypt.base64.decodeStringToUint8Array(arr);
-  }
-  if (arr.length != expected.length) {
-    return false;
-  }
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] != expected[i]) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-/**
- * Helper: verify contents of given TestAllTypes message as set by
- * fillAllFields().
- * @param {proto.jspb.test.TestAllTypes} original
- * @param {proto.jspb.test.TestAllTypes} copy
- */
-function checkAllFields(original, copy) {
-  assertTrue(jspb.Message.equals(original, copy));
-
-  assertEquals(copy.getOptionalInt32(), -42);
-  assertEquals(copy.getOptionalInt64(), -0x7fffffff00000000);
-  assertEquals(copy.getOptionalUint32(), 0x80000000);
-  assertEquals(copy.getOptionalUint64(), 0xf000000000000000);
-  assertEquals(copy.getOptionalSint32(), -100);
-  assertEquals(copy.getOptionalSint64(), -0x8000000000000000);
-  assertEquals(copy.getOptionalFixed32(), 1234);
-  assertEquals(copy.getOptionalFixed64(), 0x1234567800000000);
-  assertEquals(copy.getOptionalSfixed32(), -1234);
-  assertEquals(copy.getOptionalSfixed64(), -0x1234567800000000);
-  assertEquals(copy.getOptionalFloat(), 1.5);
-  assertEquals(copy.getOptionalDouble(), -1.5);
-  assertEquals(copy.getOptionalBool(), true);
-  assertEquals(copy.getOptionalString(), 'hello world');
-  assertEquals(true, bytesCompare(copy.getOptionalBytes(), BYTES));
-  assertEquals(true, bytesCompare(copy.getOptionalBytes_asU8(), BYTES));
-  assertEquals(
-      copy.getOptionalBytes_asB64(), goog.crypt.base64.encodeByteArray(BYTES));
-
-  assertEquals(copy.getOptionalGroup().getA(), 100);
-  assertEquals(copy.getOptionalForeignMessage().getC(), 16);
-  assertEquals(copy.getOptionalForeignEnum(),
-      proto.jspb.test.ForeignEnum.FOREIGN_FOO);
-
-
-  assertEquals(copy.getOneofString(), 'oneof');
-  assertEquals(copy.getOneofFieldCase(),
-      proto.jspb.test.TestAllTypes.OneofFieldCase.ONEOF_STRING);
-
-  assertElementsEquals(copy.getRepeatedInt32List(), [-42]);
-  assertElementsEquals(copy.getRepeatedInt64List(), [-0x7fffffff00000000]);
-  assertElementsEquals(copy.getRepeatedUint32List(), [0x80000000]);
-  assertElementsEquals(copy.getRepeatedUint64List(), [0xf000000000000000]);
-  assertElementsEquals(copy.getRepeatedSint32List(), [-100]);
-  assertElementsEquals(copy.getRepeatedSint64List(), [-0x8000000000000000]);
-  assertElementsEquals(copy.getRepeatedFixed32List(), [1234]);
-  assertElementsEquals(copy.getRepeatedFixed64List(), [0x1234567800000000]);
-  assertElementsEquals(copy.getRepeatedSfixed32List(), [-1234]);
-  assertElementsEquals(copy.getRepeatedSfixed64List(), [-0x1234567800000000]);
-  assertElementsEquals(copy.getRepeatedFloatList(), [1.5]);
-  assertElementsEquals(copy.getRepeatedDoubleList(), [-1.5]);
-  assertElementsEquals(copy.getRepeatedBoolList(), [true]);
-  assertElementsEquals(copy.getRepeatedStringList(), ['hello world']);
-  assertEquals(copy.getRepeatedBytesList().length, 2);
-  assertEquals(true, bytesCompare(copy.getRepeatedBytesList_asU8()[0], BYTES));
-  assertEquals(true, bytesCompare(copy.getRepeatedBytesList()[0], BYTES));
-  assertEquals(true, bytesCompare(copy.getRepeatedBytesList_asU8()[1], BYTES));
-  assertEquals(copy.getRepeatedBytesList_asB64()[0], BYTES_B64);
-  assertEquals(copy.getRepeatedBytesList_asB64()[1], BYTES_B64);
-  assertEquals(copy.getRepeatedGroupList().length, 1);
-  assertEquals(copy.getRepeatedGroupList()[0].getA(), 100);
-  assertEquals(copy.getRepeatedForeignMessageList().length, 1);
-  assertEquals(copy.getRepeatedForeignMessageList()[0].getC(), 1000);
-  assertElementsEquals(copy.getRepeatedForeignEnumList(),
-      [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-  assertElementsEquals(copy.getPackedRepeatedInt32List(), [-42]);
-  assertElementsEquals(copy.getPackedRepeatedInt64List(),
-      [-0x7fffffff00000000]);
-  assertElementsEquals(copy.getPackedRepeatedUint32List(), [0x80000000]);
-  assertElementsEquals(copy.getPackedRepeatedUint64List(),
-      [0xf000000000000000]);
-  assertElementsEquals(copy.getPackedRepeatedSint32List(), [-100]);
-  assertElementsEquals(copy.getPackedRepeatedSint64List(),
-      [-0x8000000000000000]);
-  assertElementsEquals(copy.getPackedRepeatedFixed32List(), [1234]);
-  assertElementsEquals(copy.getPackedRepeatedFixed64List(),
-      [0x1234567800000000]);
-  assertElementsEquals(copy.getPackedRepeatedSfixed32List(), [-1234]);
-  assertElementsEquals(copy.getPackedRepeatedSfixed64List(),
-      [-0x1234567800000000]);
-  assertElementsEquals(copy.getPackedRepeatedFloatList(), [1.5]);
-  assertElementsEquals(copy.getPackedRepeatedDoubleList(), [-1.5]);
-
-}
-
-
-/**
- * Helper: verify that all expected extensions are present.
- * @param {!proto.jspb.test.TestExtendable} msg
- */
-function checkExtensions(msg) {
-  assertEquals(-42,
-      msg.getExtension(proto.jspb.test.extendOptionalInt32));
-  assertEquals(-0x7fffffff00000000,
-      msg.getExtension(proto.jspb.test.extendOptionalInt64));
-  assertEquals(0x80000000,
-      msg.getExtension(proto.jspb.test.extendOptionalUint32));
-  assertEquals(0xf000000000000000,
-      msg.getExtension(proto.jspb.test.extendOptionalUint64));
-  assertEquals(-100,
-      msg.getExtension(proto.jspb.test.extendOptionalSint32));
-  assertEquals(-0x8000000000000000,
-      msg.getExtension(proto.jspb.test.extendOptionalSint64));
-  assertEquals(1234,
-      msg.getExtension(proto.jspb.test.extendOptionalFixed32));
-  assertEquals(0x1234567800000000,
-      msg.getExtension(proto.jspb.test.extendOptionalFixed64));
-  assertEquals(-1234,
-      msg.getExtension(proto.jspb.test.extendOptionalSfixed32));
-  assertEquals(-0x1234567800000000,
-      msg.getExtension(proto.jspb.test.extendOptionalSfixed64));
-  assertEquals(1.5,
-      msg.getExtension(proto.jspb.test.extendOptionalFloat));
-  assertEquals(-1.5,
-      msg.getExtension(proto.jspb.test.extendOptionalDouble));
-  assertEquals(true,
-      msg.getExtension(proto.jspb.test.extendOptionalBool));
-  assertEquals('hello world',
-      msg.getExtension(proto.jspb.test.extendOptionalString));
-  assertEquals(
-      true, bytesCompare(
-                msg.getExtension(proto.jspb.test.extendOptionalBytes), BYTES));
-  assertEquals(16,
-      msg.getExtension(
-          proto.jspb.test.ExtendsWithMessage.optionalExtension).getFoo());
-
-
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedInt32List),
-      [-42]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedInt64List),
-      [-0x7fffffff00000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedUint32List),
-      [0x80000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedUint64List),
-      [0xf000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSint32List),
-      [-100]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSint64List),
-      [-0x8000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedFixed32List),
-      [1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedFixed64List),
-      [0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSfixed32List),
-      [-1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSfixed64List),
-      [-0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedFloatList),
-      [1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedDoubleList),
-      [-1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedBoolList),
-      [true]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedStringList),
-      ['hello world']);
-  assertEquals(
-      true,
-      bytesCompare(
-          msg.getExtension(proto.jspb.test.extendRepeatedBytesList)[0], BYTES));
-  assertEquals(1000,
-      msg.getExtension(
-          proto.jspb.test.ExtendsWithMessage.repeatedExtensionList)[0]
-      .getFoo());
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedForeignEnumList),
-      [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedInt32List),
-      [-42]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedInt64List),
-      [-0x7fffffff00000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedUint32List),
-      [0x80000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedUint64List),
-      [0xf000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSint32List),
-      [-100]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSint64List),
-      [-0x8000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedFixed32List),
-      [1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedFixed64List),
-      [0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSfixed32List),
-      [-1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSfixed64List),
-      [-0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedFloatList),
-      [1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedDoubleList),
-      [-1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedBoolList),
-      [true]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedForeignEnumList),
-      [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-}
-
-
-describe('protoBinaryTest', function() {
-  /**
-   * Tests a basic serialization-deserializaton round-trip with all supported
-   * field types (on the TestAllTypes message type).
-   */
-  it('testRoundTrip', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-    fillAllFields(msg);
-    var encoded = msg.serializeBinary();
-    var decoded = proto.jspb.test.TestAllTypes.deserializeBinary(encoded);
-    checkAllFields(msg, decoded);
-  });
-
-  /**
-   * Test that base64 string and Uint8Array are interchangeable in bytes fields.
-   */
-  it('testBytesFieldsGettersInterop', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-    // Set from a base64 string and check all the getters work.
-    msg.setOptionalBytes(BYTES_B64);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    // Test binary serialize round trip doesn't break it.
-    msg = proto.jspb.test.TestAllTypes.deserializeBinary(msg.serializeBinary());
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    msg = new proto.jspb.test.TestAllTypes();
-    // Set from a Uint8Array and check all the getters work.
-    msg.setOptionalBytes(BYTES);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-  });
-
-  /**
-   * Test that bytes setters will receive result of any of the getters.
-   */
-  it('testBytesFieldsSettersInterop', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-    msg.setOptionalBytes(BYTES);
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    msg.setOptionalBytes(msg.getOptionalBytes());
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-    msg.setOptionalBytes(msg.getOptionalBytes_asB64());
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-    msg.setOptionalBytes(msg.getOptionalBytes_asU8());
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-  });
-
-  /**
-   * Test that bytes setters will receive result of any of the getters.
-   */
-  it('testRepeatedBytesGetters', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-
-    function assertGetters() {
-      assertTrue(goog.isString(msg.getRepeatedBytesList_asB64()[0]));
-      assertTrue(goog.isString(msg.getRepeatedBytesList_asB64()[1]));
-      assertTrue(msg.getRepeatedBytesList_asU8()[0] instanceof Uint8Array);
-      assertTrue(msg.getRepeatedBytesList_asU8()[1] instanceof Uint8Array);
-
-      assertTrue(bytesCompare(msg.getRepeatedBytesList()[0], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList()[1], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asB64()[0], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asB64()[1], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asU8()[0], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asU8()[1], BYTES));
-    }
-
-    msg.setRepeatedBytesList([BYTES, BYTES]);
-    assertGetters();
-
-    msg.setRepeatedBytesList([BYTES_B64, BYTES_B64]);
-    assertGetters();
-
-    msg.setRepeatedBytesList(null);
-    assertEquals(0, msg.getRepeatedBytesList().length);
-    assertEquals(0, msg.getRepeatedBytesList_asB64().length);
-    assertEquals(0, msg.getRepeatedBytesList_asU8().length);
-  });
-
-  /**
-   * Helper: fill all extension values.
-   * @param {proto.jspb.test.TestExtendable} msg
-   */
-  function fillExtensions(msg) {
-    msg.setExtension(
-        proto.jspb.test.extendOptionalInt32, -42);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalInt64, -0x7fffffff00000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalUint32, 0x80000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalUint64, 0xf000000000000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSint32, -100);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSint64, -0x8000000000000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalFixed32, 1234);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalFixed64, 0x1234567800000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSfixed32, -1234);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSfixed64, -0x1234567800000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalFloat, 1.5);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalDouble, -1.5);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalBool, true);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalString, 'hello world');
-    msg.setExtension(proto.jspb.test.extendOptionalBytes, BYTES);
-    var submsg = new proto.jspb.test.ExtendsWithMessage();
-    submsg.setFoo(16);
-    msg.setExtension(
-        proto.jspb.test.ExtendsWithMessage.optionalExtension, submsg);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalForeignEnum,
-        proto.jspb.test.ForeignEnum.FOREIGN_FOO);
-
-
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedInt32List, [-42]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedInt64List, [-0x7fffffff00000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedUint32List, [0x80000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedUint64List, [0xf000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSint32List, [-100]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSint64List, [-0x8000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedFixed32List, [1234]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedFixed64List, [0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSfixed32List, [-1234]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSfixed64List, [-0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedFloatList, [1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedDoubleList, [-1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedBoolList, [true]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedStringList, ['hello world']);
-    msg.setExtension(proto.jspb.test.extendRepeatedBytesList, [BYTES]);
-    submsg = new proto.jspb.test.ExtendsWithMessage();
-    submsg.setFoo(1000);
-    msg.setExtension(
-        proto.jspb.test.ExtendsWithMessage.repeatedExtensionList, [submsg]);
-    msg.setExtension(proto.jspb.test.extendRepeatedForeignEnumList,
-        [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedInt32List, [-42]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedInt64List, [-0x7fffffff00000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedUint32List, [0x80000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedUint64List, [0xf000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSint32List, [-100]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSint64List, [-0x8000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedFixed32List, [1234]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedFixed64List, [0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSfixed32List, [-1234]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSfixed64List,
-        [-0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedFloatList, [1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedDoubleList, [-1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedBoolList, [true]);
-    msg.setExtension(proto.jspb.test.extendPackedRepeatedForeignEnumList,
-        [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-  }
-
-
-  /**
-   * Tests extension serialization and deserialization.
-   */
-  it('testExtensions', function() {
-    var msg = new proto.jspb.test.TestExtendable();
-    fillExtensions(msg);
-    var encoded = msg.serializeBinary();
-    var decoded = proto.jspb.test.TestExtendable.deserializeBinary(encoded);
-    checkExtensions(decoded);
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/binary/reader_test.js b/js/compatibility_tests/v3.0.0/binary/reader_test.js
deleted file mode 100644
index 9571138..0000000
--- a/js/compatibility_tests/v3.0.0/binary/reader_test.js
+++ /dev/null
@@ -1,922 +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.
-
-/**
- * @fileoverview Test cases for jspb's binary protocol buffer reader.
- *
- * There are two particular magic numbers that need to be pointed out -
- * 2^64-1025 is the largest number representable as both a double and an
- * unsigned 64-bit integer, and 2^63-513 is the largest number representable as
- * both a double and a signed 64-bit integer.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryConstants');
-goog.require('jspb.BinaryDecoder');
-goog.require('jspb.BinaryReader');
-goog.require('jspb.BinaryWriter');
-
-
-
-describe('binaryReaderTest', function() {
-  /**
-   * Tests the reader instance cache.
-   */
-  it('testInstanceCaches', /** @suppress {visibility} */ function() {
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-    writer.writeMessage(1, dummyMessage, goog.nullFunction);
-    writer.writeMessage(2, dummyMessage, goog.nullFunction);
-
-    var buffer = writer.getResultBuffer();
-
-    // Empty the instance caches.
-    jspb.BinaryReader.instanceCache_ = [];
-
-    // Allocating and then freeing three decoders should leave us with three in
-    // the cache.
-
-    var decoder1 = jspb.BinaryDecoder.alloc();
-    var decoder2 = jspb.BinaryDecoder.alloc();
-    var decoder3 = jspb.BinaryDecoder.alloc();
-    decoder1.free();
-    decoder2.free();
-    decoder3.free();
-
-    assertEquals(3, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-
-    // Allocating and then freeing a reader should remove one decoder from its
-    // cache, but it should stay stuck to the reader afterwards since we can't
-    // have a reader without a decoder.
-    jspb.BinaryReader.alloc().free();
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(1, jspb.BinaryReader.instanceCache_.length);
-
-    // Allocating a reader should remove a reader from the cache.
-    var reader = jspb.BinaryReader.alloc(buffer);
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-
-    // Processing the message reuses the current reader.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-    });
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-    });
-
-    assertEquals(false, reader.nextField());
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-
-    // Freeing the reader should put it back into the cache.
-    reader.free();
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(1, jspb.BinaryReader.instanceCache_.length);
-  });
-
-
-  /**
-   * @param {number} x
-   * @return {number}
-   */
-  function truncate(x) {
-    var temp = new Float32Array(1);
-    temp[0] = x;
-    return temp[0];
-  }
-
-
-  /**
-   * Verifies that misuse of the reader class triggers assertions.
-   */
-  it('testReadErrors', /** @suppress {checkTypes|visibility} */ function() {
-    // Calling readMessage on a non-delimited field should trigger an
-    // assertion.
-    var reader = jspb.BinaryReader.alloc([8, 1]);
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-    reader.nextField();
-    assertThrows(function() {
-      reader.readMessage(dummyMessage, goog.nullFunction);
-    });
-
-    // Reading past the end of the stream should trigger an assertion.
-    reader = jspb.BinaryReader.alloc([9, 1]);
-    reader.nextField();
-    assertThrows(function() {reader.readFixed64()});
-
-    // Reading past the end of a submessage should trigger an assertion.
-    reader = jspb.BinaryReader.alloc([10, 4, 13, 1, 1, 1]);
-    reader.nextField();
-    reader.readMessage(dummyMessage, function() {
-      reader.nextField();
-      assertThrows(function() {reader.readFixed32()});
-    });
-
-    // Skipping an invalid field should trigger an assertion.
-    reader = jspb.BinaryReader.alloc([12, 1]);
-    reader.nextWireType_ = 1000;
-    assertThrows(function() {reader.skipField()});
-
-    // Reading fields with the wrong wire type should assert.
-    reader = jspb.BinaryReader.alloc([9, 0, 0, 0, 0, 0, 0, 0, 0]);
-    reader.nextField();
-    assertThrows(function() {reader.readInt32()});
-    assertThrows(function() {reader.readInt32String()});
-    assertThrows(function() {reader.readInt64()});
-    assertThrows(function() {reader.readInt64String()});
-    assertThrows(function() {reader.readUint32()});
-    assertThrows(function() {reader.readUint32String()});
-    assertThrows(function() {reader.readUint64()});
-    assertThrows(function() {reader.readUint64String()});
-    assertThrows(function() {reader.readSint32()});
-    assertThrows(function() {reader.readBool()});
-    assertThrows(function() {reader.readEnum()});
-
-    reader = jspb.BinaryReader.alloc([8, 1]);
-    reader.nextField();
-    assertThrows(function() {reader.readFixed32()});
-    assertThrows(function() {reader.readFixed64()});
-    assertThrows(function() {reader.readSfixed32()});
-    assertThrows(function() {reader.readSfixed64()});
-    assertThrows(function() {reader.readFloat()});
-    assertThrows(function() {reader.readDouble()});
-
-    assertThrows(function() {reader.readString()});
-    assertThrows(function() {reader.readBytes()});
-  });
-
-
-  /**
-   * Tests encoding and decoding of unsigned field types.
-   * @param {Function} readField
-   * @param {Function} writeField
-   * @param {number} epsilon
-   * @param {number} upperLimit
-   * @param {Function} filter
-   * @private
-   * @suppress {missingProperties}
-   */
-  var doTestUnsignedField_ = function(readField,
-      writeField, epsilon, upperLimit, filter) {
-    assertNotNull(readField);
-    assertNotNull(writeField);
-
-    var writer = new jspb.BinaryWriter();
-
-    // Encode zero and limits.
-    writeField.call(writer, 1, filter(0));
-    writeField.call(writer, 2, filter(epsilon));
-    writeField.call(writer, 3, filter(upperLimit));
-
-    // Encode positive values.
-    for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-      writeField.call(writer, 4, filter(cursor));
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    // Check zero and limits.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(filter(0), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(filter(epsilon), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(3, reader.getFieldNumber());
-    assertEquals(filter(upperLimit), readField.call(reader));
-
-    // Check positive values.
-    for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-      reader.nextField();
-      if (4 != reader.getFieldNumber()) throw 'fail!';
-      if (filter(cursor) != readField.call(reader)) throw 'fail!';
-    }
-  };
-
-
-  /**
-   * Tests encoding and decoding of signed field types.
-   * @param {Function} readField
-   * @param {Function} writeField
-   * @param {number} epsilon
-   * @param {number} lowerLimit
-   * @param {number} upperLimit
-   * @param {Function} filter
-   * @private
-   * @suppress {missingProperties}
-   */
-  var doTestSignedField_ = function(readField,
-      writeField, epsilon, lowerLimit, upperLimit, filter) {
-    var writer = new jspb.BinaryWriter();
-
-    // Encode zero and limits.
-    writeField.call(writer, 1, filter(lowerLimit));
-    writeField.call(writer, 2, filter(-epsilon));
-    writeField.call(writer, 3, filter(0));
-    writeField.call(writer, 4, filter(epsilon));
-    writeField.call(writer, 5, filter(upperLimit));
-
-    var inputValues = [];
-
-    // Encode negative values.
-    for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) {
-      var val = filter(cursor);
-      writeField.call(writer, 6, val);
-      inputValues.push({
-        fieldNumber: 6,
-        value: val
-      });
-    }
-
-    // Encode positive values.
-    for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-      var val = filter(cursor);
-      writeField.call(writer, 7, val);
-      inputValues.push({
-        fieldNumber: 7,
-        value: val
-      });
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    // Check zero and limits.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(filter(lowerLimit), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(filter(-epsilon), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(3, reader.getFieldNumber());
-    assertEquals(filter(0), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(4, reader.getFieldNumber());
-    assertEquals(filter(epsilon), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(5, reader.getFieldNumber());
-    assertEquals(filter(upperLimit), readField.call(reader));
-
-    for (var i = 0; i < inputValues.length; i++) {
-      var expected = inputValues[i];
-      reader.nextField();
-      assertEquals(expected.fieldNumber, reader.getFieldNumber());
-      assertEquals(expected.value, readField.call(reader));
-    }
-  };
-
-
-  /**
-   * Tests fields that use varint encoding.
-   */
-  it('testVarintFields', function() {
-    assertNotUndefined(jspb.BinaryReader.prototype.readUint32);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeUint32);
-    assertNotUndefined(jspb.BinaryReader.prototype.readUint64);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeUint64);
-    assertNotUndefined(jspb.BinaryReader.prototype.readBool);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeBool);
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readUint32,
-        jspb.BinaryWriter.prototype.writeUint32,
-        1, Math.pow(2, 32) - 1, Math.round);
-
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readUint64,
-        jspb.BinaryWriter.prototype.writeUint64,
-        1, Math.pow(2, 64) - 1025, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readInt32,
-        jspb.BinaryWriter.prototype.writeInt32,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readInt64,
-        jspb.BinaryWriter.prototype.writeInt64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readEnum,
-        jspb.BinaryWriter.prototype.writeEnum,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readBool,
-        jspb.BinaryWriter.prototype.writeBool,
-        1, 1, function(x) { return !!x; });
-  });
-
-
-  /**
-   * Tests reading a field from hexadecimal string (format: '08 BE EF').
-   * @param {Function} readField
-   * @param {number} expected
-   * @param {string} hexString
-   */
-  function doTestHexStringVarint_(readField, expected, hexString) {
-    var bytesCount = (hexString.length + 1) / 3;
-    var bytes = new Uint8Array(bytesCount);
-    for (var i = 0; i < bytesCount; i++) {
-      bytes[i] = parseInt(hexString.substring(i * 3, i * 3 + 2), 16);
-    }
-    var reader = jspb.BinaryReader.alloc(bytes);
-    reader.nextField();
-    assertEquals(expected, readField.call(reader));
-  }
-
-
-  /**
-   * Tests non-canonical redundant varint decoding.
-   */
-  it('testRedundantVarintFields', function() {
-    assertNotNull(jspb.BinaryReader.prototype.readUint32);
-    assertNotNull(jspb.BinaryReader.prototype.readUint64);
-    assertNotNull(jspb.BinaryReader.prototype.readSint32);
-    assertNotNull(jspb.BinaryReader.prototype.readSint64);
-
-    // uint32 and sint32 take no more than 5 bytes
-    // 08 - field prefix (type = 0 means varint)
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readUint32,
-      12, '08 8C 80 80 80 00');
-
-    // 11 stands for -6 in zigzag encoding
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readSint32,
-      -6, '08 8B 80 80 80 00');
-
-    // uint64 and sint64 take no more than 10 bytes
-    // 08 - field prefix (type = 0 means varint)
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readUint64,
-      12, '08 8C 80 80 80 80 80 80 80 80 00');
-
-    // 11 stands for -6 in zigzag encoding
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readSint64,
-      -6, '08 8B 80 80 80 80 80 80 80 80 00');
-  });
-
-
-  /**
-   * Tests 64-bit fields that are handled as strings.
-   */
-  it('testStringInt64Fields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var testSignedData = [
-      '2730538252207801776',
-      '-2688470994844604560',
-      '3398529779486536359',
-      '3568577411627971000',
-      '272477188847484900',
-      '-6649058714086158188',
-      '-7695254765712060806',
-      '-4525541438037104029',
-      '-4993706538836508568',
-      '4990160321893729138'
-    ];
-    var testUnsignedData = [
-      '7822732630241694882',
-      '6753602971916687352',
-      '2399935075244442116',
-      '8724292567325338867',
-      '16948784802625696584',
-      '4136275908516066934',
-      '3575388346793700364',
-      '5167142028379259461',
-      '1557573948689737699',
-      '17100725280812548567'
-    ];
-
-    for (var i = 0; i < testSignedData.length; i++) {
-      writer.writeInt64String(2 * i + 1, testSignedData[i]);
-      writer.writeUint64String(2 * i + 2, testUnsignedData[i]);
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    for (var i = 0; i < testSignedData.length; i++) {
-      reader.nextField();
-      assertEquals(2 * i + 1, reader.getFieldNumber());
-      assertEquals(testSignedData[i], reader.readInt64String());
-      reader.nextField();
-      assertEquals(2 * i + 2, reader.getFieldNumber());
-      assertEquals(testUnsignedData[i], reader.readUint64String());
-    }
-  });
-
-
-  /**
-   * Tests fields that use zigzag encoding.
-   */
-  it('testZigzagFields', function() {
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSint32,
-        jspb.BinaryWriter.prototype.writeSint32,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSint64,
-        jspb.BinaryWriter.prototype.writeSint64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-  });
-
-
-  /**
-   * Tests fields that use fixed-length encoding.
-   */
-  it('testFixedFields', function() {
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readFixed32,
-        jspb.BinaryWriter.prototype.writeFixed32,
-        1, Math.pow(2, 32) - 1, Math.round);
-
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readFixed64,
-        jspb.BinaryWriter.prototype.writeFixed64,
-        1, Math.pow(2, 64) - 1025, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSfixed32,
-        jspb.BinaryWriter.prototype.writeSfixed32,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSfixed64,
-        jspb.BinaryWriter.prototype.writeSfixed64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-  });
-
-
-  /**
-   * Tests floating point fields.
-   */
-  it('testFloatFields', function() {
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readFloat,
-        jspb.BinaryWriter.prototype.writeFloat,
-        jspb.BinaryConstants.FLOAT32_MIN,
-        -jspb.BinaryConstants.FLOAT32_MAX,
-        jspb.BinaryConstants.FLOAT32_MAX,
-        truncate);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readDouble,
-        jspb.BinaryWriter.prototype.writeDouble,
-        jspb.BinaryConstants.FLOAT64_EPS * 10,
-        -jspb.BinaryConstants.FLOAT64_MIN,
-        jspb.BinaryConstants.FLOAT64_MIN,
-        function(x) { return x; });
-  });
-
-
-  /**
-   * Tests length-delimited string fields.
-   */
-  it('testStringFields', function() {
-    var s1 = 'The quick brown fox jumps over the lazy dog.';
-    var s2 = '人人生而自由,在尊嚴和權利上一律平等。';
-
-    var writer = new jspb.BinaryWriter();
-
-    writer.writeString(1, s1);
-    writer.writeString(2, s2);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(s1, reader.readString());
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(s2, reader.readString());
-  });
-
-
-  /**
-   * Tests length-delimited byte fields.
-   */
-  it('testByteFields', function() {
-    var message = [];
-    var lowerLimit = 1;
-    var upperLimit = 256;
-    var scale = 1.1;
-
-    var writer = new jspb.BinaryWriter();
-
-    for (var cursor = lowerLimit; cursor < upperLimit; cursor *= 1.1) {
-      var len = Math.round(cursor);
-      var bytes = [];
-      for (var i = 0; i < len; i++) bytes.push(i % 256);
-
-      writer.writeBytes(len, bytes);
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    for (var cursor = lowerLimit; reader.nextField(); cursor *= 1.1) {
-      var len = Math.round(cursor);
-      if (len != reader.getFieldNumber()) throw 'fail!';
-
-      var bytes = reader.readBytes();
-      if (len != bytes.length) throw 'fail!';
-      for (var i = 0; i < bytes.length; i++) {
-        if (i % 256 != bytes[i]) throw 'fail!';
-      }
-    }
-  });
-
-
-  /**
-   * Tests nested messages.
-   */
-  it('testNesting', function() {
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    writer.writeInt32(1, 100);
-
-    // Add one message with 3 int fields.
-    writer.writeMessage(2, dummyMessage, function() {
-      writer.writeInt32(3, 300);
-      writer.writeInt32(4, 400);
-      writer.writeInt32(5, 500);
-    });
-
-    // Add one empty message.
-    writer.writeMessage(6, dummyMessage, goog.nullFunction);
-
-    writer.writeInt32(7, 700);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    // Validate outermost message.
-
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(100, reader.readInt32());
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      // Validate embedded message 1.
-      reader.nextField();
-      assertEquals(3, reader.getFieldNumber());
-      assertEquals(300, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(4, reader.getFieldNumber());
-      assertEquals(400, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(5, reader.getFieldNumber());
-      assertEquals(500, reader.readInt32());
-
-      assertEquals(false, reader.nextField());
-    });
-
-    reader.nextField();
-    assertEquals(6, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      // Validate embedded message 2.
-
-      assertEquals(false, reader.nextField());
-    });
-
-    reader.nextField();
-    assertEquals(7, reader.getFieldNumber());
-    assertEquals(700, reader.readInt32());
-
-    assertEquals(false, reader.nextField());
-  });
-
-  /**
-   * Tests skipping fields of each type by interleaving them with sentinel
-   * values and skipping everything that's not a sentinel.
-   */
-  it('testSkipField', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var sentinel = 123456789;
-
-    // Write varint fields of different sizes.
-    writer.writeInt32(1, sentinel);
-    writer.writeInt32(1, 1);
-    writer.writeInt32(1, 1000);
-    writer.writeInt32(1, 1000000);
-    writer.writeInt32(1, 1000000000);
-
-    // Write fixed 64-bit encoded fields.
-    writer.writeInt32(2, sentinel);
-    writer.writeDouble(2, 1);
-    writer.writeFixed64(2, 1);
-    writer.writeSfixed64(2, 1);
-
-    // Write fixed 32-bit encoded fields.
-    writer.writeInt32(3, sentinel);
-    writer.writeFloat(3, 1);
-    writer.writeFixed32(3, 1);
-    writer.writeSfixed32(3, 1);
-
-    // Write delimited fields.
-    writer.writeInt32(4, sentinel);
-    writer.writeBytes(4, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-    writer.writeString(4, 'The quick brown fox jumps over the lazy dog');
-
-    // Write a group with a nested group inside.
-    writer.writeInt32(5, sentinel);
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-    writer.writeGroup(5, dummyMessage, function() {
-      writer.writeInt64(42, 42);
-      writer.writeGroup(6, dummyMessage, function() {
-        writer.writeInt64(84, 42);
-      });
-    });
-
-    // Write final sentinel.
-    writer.writeInt32(6, sentinel);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    function skip(field, count) {
-      for (var i = 0; i < count; i++) {
-        reader.nextField();
-        if (field != reader.getFieldNumber()) throw 'fail!';
-        reader.skipField();
-      }
-    }
-
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(1, 4);
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(2, 3);
-
-    reader.nextField();
-    assertEquals(3, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(3, 3);
-
-    reader.nextField();
-    assertEquals(4, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(4, 2);
-
-    reader.nextField();
-    assertEquals(5, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(5, 1);
-
-    reader.nextField();
-    assertEquals(6, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-  });
-
-
-  /**
-   * Tests packed fields.
-   */
-  it('testPackedFields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var sentinel = 123456789;
-
-    var unsignedData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
-    var signedData = [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10];
-    var floatData = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10];
-    var doubleData = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10];
-    var boolData = [true, false, true, true, false, false, true, false];
-
-    for (var i = 0; i < floatData.length; i++) {
-      floatData[i] = truncate(floatData[i]);
-    }
-
-    writer.writeInt32(1, sentinel);
-
-    writer.writePackedInt32(2, signedData);
-    writer.writePackedInt64(2, signedData);
-    writer.writePackedUint32(2, unsignedData);
-    writer.writePackedUint64(2, unsignedData);
-    writer.writePackedSint32(2, signedData);
-    writer.writePackedSint64(2, signedData);
-    writer.writePackedFixed32(2, unsignedData);
-    writer.writePackedFixed64(2, unsignedData);
-    writer.writePackedSfixed32(2, signedData);
-    writer.writePackedSfixed64(2, signedData);
-    writer.writePackedFloat(2, floatData);
-    writer.writePackedDouble(2, doubleData);
-    writer.writePackedBool(2, boolData);
-    writer.writePackedEnum(2, unsignedData);
-
-    writer.writeInt32(3, sentinel);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    reader.nextField();
-    assertEquals(sentinel, reader.readInt32());
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedInt32(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedInt64(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedUint32(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedUint64(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSint32(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSint64(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedFixed32(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedFixed64(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSfixed32(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSfixed64(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedFloat(), floatData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedDouble(), doubleData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedBool(), boolData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedEnum(), unsignedData);
-
-    reader.nextField();
-    assertEquals(sentinel, reader.readInt32());
-  });
-
-
-  /**
-   * Byte blobs inside nested messages should always have their byte offset set
-   * relative to the start of the outermost blob, not the start of their parent
-   * blob.
-   */
-  it('testNestedBlobs', function() {
-    // Create a proto consisting of two nested messages, with the inner one
-    // containing a blob of bytes.
-
-    var fieldTag = (1 << 3) | jspb.BinaryConstants.WireType.DELIMITED;
-    var blob = [1, 2, 3, 4, 5];
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    writer.writeMessage(1, dummyMessage, function() {
-      writer.writeMessage(1, dummyMessage, function() {
-        writer.writeBytes(1, blob);
-      });
-    });
-
-    // Peel off the outer two message layers. Each layer should have two bytes
-    // of overhead, one for the field tag and one for the length of the inner
-    // blob.
-
-    var decoder1 = new jspb.BinaryDecoder(writer.getResultBuffer());
-    assertEquals(fieldTag, decoder1.readUnsignedVarint32());
-    assertEquals(blob.length + 4, decoder1.readUnsignedVarint32());
-
-    var decoder2 = new jspb.BinaryDecoder(decoder1.readBytes(blob.length + 4));
-    assertEquals(fieldTag, decoder2.readUnsignedVarint32());
-    assertEquals(blob.length + 2, decoder2.readUnsignedVarint32());
-
-    assertEquals(fieldTag, decoder2.readUnsignedVarint32());
-    assertEquals(blob.length, decoder2.readUnsignedVarint32());
-    var bytes = decoder2.readBytes(blob.length);
-
-    assertElementsEquals(bytes, blob);
-  });
-
-
-  /**
-   * Tests read callbacks.
-   */
-  it('testReadCallbacks', function() {
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    // Add an int, a submessage, and another int.
-    writer.writeInt32(1, 100);
-
-    writer.writeMessage(2, dummyMessage, function() {
-      writer.writeInt32(3, 300);
-      writer.writeInt32(4, 400);
-      writer.writeInt32(5, 500);
-    });
-
-    writer.writeInt32(7, 700);
-
-    // Create the reader and register a custom read callback.
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    /**
-     * @param {!jspb.BinaryReader} reader
-     * @return {*}
-     */
-    function readCallback(reader) {
-      reader.nextField();
-      assertEquals(3, reader.getFieldNumber());
-      assertEquals(300, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(4, reader.getFieldNumber());
-      assertEquals(400, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(5, reader.getFieldNumber());
-      assertEquals(500, reader.readInt32());
-
-      assertEquals(false, reader.nextField());
-    };
-
-    reader.registerReadCallback('readCallback', readCallback);
-
-    // Read the container message.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(100, reader.readInt32());
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      // Decode the embedded message using the registered callback.
-      reader.runReadCallback('readCallback');
-    });
-
-    reader.nextField();
-    assertEquals(7, reader.getFieldNumber());
-    assertEquals(700, reader.readInt32());
-
-    assertEquals(false, reader.nextField());
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/binary/utils_test.js b/js/compatibility_tests/v3.0.0/binary/utils_test.js
deleted file mode 100644
index d27e5ea..0000000
--- a/js/compatibility_tests/v3.0.0/binary/utils_test.js
+++ /dev/null
@@ -1,668 +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.
-
-/**
- * @fileoverview Test cases for jspb's helper functions.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.crypt.base64');
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryConstants');
-goog.require('jspb.BinaryWriter');
-goog.require('jspb.utils');
-
-
-/**
- * @param {number} x
- * @return {number}
- */
-function truncate(x) {
-  var temp = new Float32Array(1);
-  temp[0] = x;
-  return temp[0];
-}
-
-
-/**
- * Converts an 64-bit integer in split representation to a 64-bit hash string
- * (8 bits encoded per character).
- * @param {number} bitsLow The low 32 bits of the split 64-bit integer.
- * @param {number} bitsHigh The high 32 bits of the split 64-bit integer.
- * @return {string} The encoded hash string, 8 bits per character.
- */
-function toHashString(bitsLow, bitsHigh) {
-  return String.fromCharCode((bitsLow >>> 0) & 0xFF,
-                             (bitsLow >>> 8) & 0xFF,
-                             (bitsLow >>> 16) & 0xFF,
-                             (bitsLow >>> 24) & 0xFF,
-                             (bitsHigh >>> 0) & 0xFF,
-                             (bitsHigh >>> 8) & 0xFF,
-                             (bitsHigh >>> 16) & 0xFF,
-                             (bitsHigh >>> 24) & 0xFF);
-}
-
-
-describe('binaryUtilsTest', function() {
-  /**
-   * Tests lossless binary-to-decimal conversion.
-   */
-  it('testDecimalConversion', function() {
-    // Check some magic numbers.
-    var result =
-        jspb.utils.joinUnsignedDecimalString(0x89e80001, 0x8ac72304);
-    assertEquals('10000000000000000001', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xacd05f15, 0x1b69b4b);
-    assertEquals('123456789123456789', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xeb1f0ad2, 0xab54a98c);
-    assertEquals('12345678901234567890', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xe3b70cb1, 0x891087b8);
-    assertEquals('9876543210987654321', result);
-
-    // Check limits.
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00000000);
-    assertEquals('0', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xFFFFFFFF, 0xFFFFFFFF);
-    assertEquals('18446744073709551615', result);
-
-    // Check each bit of the low dword.
-    for (var i = 0; i < 32; i++) {
-      var low = (1 << i) >>> 0;
-      result = jspb.utils.joinUnsignedDecimalString(low, 0);
-      assertEquals('' + Math.pow(2, i), result);
-    }
-
-    // Check the first 20 bits of the high dword.
-    for (var i = 0; i < 20; i++) {
-      var high = (1 << i) >>> 0;
-      result = jspb.utils.joinUnsignedDecimalString(0, high);
-      assertEquals('' + Math.pow(2, 32 + i), result);
-    }
-
-    // V8's internal double-to-string conversion is inaccurate for values above
-    // 2^52, even if they're representable integers - check the rest of the bits
-    // manually against the correct string representations of 2^N.
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00100000);
-    assertEquals('4503599627370496', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00200000);
-    assertEquals('9007199254740992', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00400000);
-    assertEquals('18014398509481984', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00800000);
-    assertEquals('36028797018963968', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x01000000);
-    assertEquals('72057594037927936', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x02000000);
-    assertEquals('144115188075855872', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x04000000);
-    assertEquals('288230376151711744', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x08000000);
-    assertEquals('576460752303423488', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x10000000);
-    assertEquals('1152921504606846976', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x20000000);
-    assertEquals('2305843009213693952', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x40000000);
-    assertEquals('4611686018427387904', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x80000000);
-    assertEquals('9223372036854775808', result);
-  });
-
-
-  /**
-   * Going from hash strings to decimal strings should also be lossless.
-   */
-  it('testHashToDecimalConversion', function() {
-    var result;
-    var convert = jspb.utils.hash64ToDecimalString;
-
-    result = convert(toHashString(0x00000000, 0x00000000), false);
-    assertEquals('0', result);
-
-    result = convert(toHashString(0x00000000, 0x00000000), true);
-    assertEquals('0', result);
-
-    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF), false);
-    assertEquals('18446744073709551615', result);
-
-    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF), true);
-    assertEquals('-1', result);
-
-    result = convert(toHashString(0x00000000, 0x80000000), false);
-    assertEquals('9223372036854775808', result);
-
-    result = convert(toHashString(0x00000000, 0x80000000), true);
-    assertEquals('-9223372036854775808', result);
-
-    result = convert(toHashString(0xacd05f15, 0x01b69b4b), false);
-    assertEquals('123456789123456789', result);
-
-    result = convert(toHashString(~0xacd05f15 + 1, ~0x01b69b4b), true);
-    assertEquals('-123456789123456789', result);
-
-    // And converting arrays of hashes should work the same way.
-    result = jspb.utils.hash64ArrayToDecimalStrings([
-      toHashString(0xFFFFFFFF, 0xFFFFFFFF),
-      toHashString(0x00000000, 0x80000000),
-      toHashString(0xacd05f15, 0x01b69b4b)], false);
-    assertEquals(3, result.length);
-    assertEquals('18446744073709551615', result[0]);
-    assertEquals('9223372036854775808', result[1]);
-    assertEquals('123456789123456789', result[2]);
-  });
-
-  /*
-   * Going from decimal strings to hash strings should be lossless.
-   */
-  it('testDecimalToHashConversion', function() {
-    var result;
-    var convert = jspb.utils.decimalStringToHash64;
-
-    result = convert('0');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
-
-    result = convert('-1');
-    assertEquals(String.fromCharCode.apply(null,
-      [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
-
-    result = convert('18446744073709551615');
-    assertEquals(String.fromCharCode.apply(null,
-      [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
-
-    result = convert('9223372036854775808');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
-
-    result = convert('-9223372036854775808');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
-
-    result = convert('123456789123456789');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x15, 0x5F, 0xD0, 0xAC, 0x4B, 0x9B, 0xB6, 0x01]), result);
-
-    result = convert('-123456789123456789');
-    assertEquals(String.fromCharCode.apply(null,
-      [0xEB, 0xA0, 0x2F, 0x53, 0xB4, 0x64, 0x49, 0xFE]), result);
-  });
-
-  /**
-   * Going from hash strings to hex strings should be lossless.
-   */
-  it('testHashToHexConversion', function() {
-    var result;
-    var convert = jspb.utils.hash64ToHexString;
-
-    result = convert(toHashString(0x00000000, 0x00000000));
-    assertEquals('0x0000000000000000', result);
-
-    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF));
-    assertEquals('0xffffffffffffffff', result);
-
-    result = convert(toHashString(0x12345678, 0x9ABCDEF0));
-    assertEquals('0x9abcdef012345678', result);
-  });
-
-
-  /**
-   * Going from hex strings to hash strings should be lossless.
-   */
-  it('testHexToHashConversion', function() {
-    var result;
-    var convert = jspb.utils.hexStringToHash64;
-
-    result = convert('0x0000000000000000');
-    assertEquals(String.fromCharCode.apply(null,
-        [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
-
-    result = convert('0xffffffffffffffff');
-    assertEquals(String.fromCharCode.apply(null,
-        [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
-
-    // Hex string is big-endian, hash string is little-endian.
-    result = convert('0x123456789ABCDEF0');
-    assertEquals(String.fromCharCode.apply(null,
-        [0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12]), result);
-
-    // Capitalization should not matter.
-    result = convert('0x0000abcdefABCDEF');
-    assertEquals(String.fromCharCode.apply(null,
-        [0xEF, 0xCD, 0xAB, 0xEF, 0xCD, 0xAB, 0x00, 0x00]), result);
-  });
-
-
-  /**
-   * Going from numbers to hash strings should be lossless for up to 53 bits of
-   * precision.
-   */
-  it('testNumberToHashConversion', function() {
-    var result;
-    var convert = jspb.utils.numberToHash64;
-
-    result = convert(0x0000000000000);
-    assertEquals('0x0000000000000000', jspb.utils.hash64ToHexString(result));
-
-    result = convert(0xFFFFFFFFFFFFF);
-    assertEquals('0x000fffffffffffff', jspb.utils.hash64ToHexString(result));
-
-    result = convert(0x123456789ABCD);
-    assertEquals('0x000123456789abcd', jspb.utils.hash64ToHexString(result));
-
-    result = convert(0xDCBA987654321);
-    assertEquals('0x000dcba987654321', jspb.utils.hash64ToHexString(result));
-
-    // 53 bits of precision should not be truncated.
-    result = convert(0x10000000000001);
-    assertEquals('0x0010000000000001', jspb.utils.hash64ToHexString(result));
-
-    // 54 bits of precision should be truncated.
-    result = convert(0x20000000000001);
-    assertNotEquals(
-        '0x0020000000000001', jspb.utils.hash64ToHexString(result));
-  });
-
-
-  /**
-   * Sanity check the behavior of Javascript's strings when doing funny things
-   * with unicode characters.
-   */
-  it('sanityCheckUnicodeStrings', function() {
-    var strings = new Array(65536);
-
-    // All possible unsigned 16-bit values should be storable in a string, they
-    // shouldn't do weird things with the length of the string, and they should
-    // come back out of the string unchanged.
-    for (var i = 0; i < 65536; i++) {
-      strings[i] = 'a' + String.fromCharCode(i) + 'a';
-      if (3 != strings[i].length) throw 'fail!';
-      if (i != strings[i].charCodeAt(1)) throw 'fail!';
-    }
-
-    // Each unicode character should compare equal to itself and not equal to a
-    // different unicode character.
-    for (var i = 0; i < 65536; i++) {
-      if (strings[i] != strings[i]) throw 'fail!';
-      if (strings[i] == strings[(i + 1) % 65536]) throw 'fail!';
-    }
-  });
-
-
-  /**
-   * Tests conversion from 32-bit floating point numbers to split64 numbers.
-   */
-  it('testFloat32ToSplit64', function() {
-    var f32_eps = jspb.BinaryConstants.FLOAT32_EPS;
-    var f32_min = jspb.BinaryConstants.FLOAT32_MIN;
-    var f32_max = jspb.BinaryConstants.FLOAT32_MAX;
-
-    // NaN.
-    jspb.utils.splitFloat32(NaN);
-    if (!isNaN(jspb.utils.joinFloat32(jspb.utils.split64Low,
-                                      jspb.utils.split64High))) {
-      throw 'fail!';
-    }
-
-    /**
-     * @param {number} x
-     * @param {number=} opt_bits
-     */
-    function test(x, opt_bits) {
-      jspb.utils.splitFloat32(x);
-      if (goog.isDef(opt_bits)) {
-        if (opt_bits != jspb.utils.split64Low) throw 'fail!';
-      }
-      if (truncate(x) != jspb.utils.joinFloat32(jspb.utils.split64Low,
-          jspb.utils.split64High)) {
-        throw 'fail!';
-      }
-    }
-
-    // Positive and negative infinity.
-    test(Infinity, 0x7f800000);
-    test(-Infinity, 0xff800000);
-
-    // Positive and negative zero.
-    test(0, 0x00000000);
-    test(-0, 0x80000000);
-
-    // Positive and negative epsilon.
-    test(f32_eps, 0x00000001);
-    test(-f32_eps, 0x80000001);
-
-    // Positive and negative min.
-    test(f32_min, 0x00800000);
-    test(-f32_min, 0x80800000);
-
-    // Positive and negative max.
-    test(f32_max, 0x7F7FFFFF);
-    test(-f32_max, 0xFF7FFFFF);
-
-    // Various positive values.
-    var cursor = f32_eps * 10;
-    while (cursor != Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-
-    // Various negative values.
-    cursor = -f32_eps * 10;
-    while (cursor != -Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-  });
-
-
-  /**
-   * Tests conversion from 64-bit floating point numbers to split64 numbers.
-   */
-  it('testFloat64ToSplit64', function() {
-    var f64_eps = jspb.BinaryConstants.FLOAT64_EPS;
-    var f64_min = jspb.BinaryConstants.FLOAT64_MIN;
-    var f64_max = jspb.BinaryConstants.FLOAT64_MAX;
-
-    // NaN.
-    jspb.utils.splitFloat64(NaN);
-    if (!isNaN(jspb.utils.joinFloat64(jspb.utils.split64Low,
-        jspb.utils.split64High))) {
-      throw 'fail!';
-    }
-
-    /**
-     * @param {number} x
-     * @param {number=} opt_highBits
-     * @param {number=} opt_lowBits
-     */
-    function test(x, opt_highBits, opt_lowBits) {
-      jspb.utils.splitFloat64(x);
-      if (goog.isDef(opt_highBits)) {
-        if (opt_highBits != jspb.utils.split64High) throw 'fail!';
-      }
-      if (goog.isDef(opt_lowBits)) {
-        if (opt_lowBits != jspb.utils.split64Low) throw 'fail!';
-      }
-      if (x != jspb.utils.joinFloat64(jspb.utils.split64Low,
-          jspb.utils.split64High)) {
-        throw 'fail!';
-      }
-    }
-
-    // Positive and negative infinity.
-    test(Infinity, 0x7ff00000, 0x00000000);
-    test(-Infinity, 0xfff00000, 0x00000000);
-
-    // Positive and negative zero.
-    test(0, 0x00000000, 0x00000000);
-    test(-0, 0x80000000, 0x00000000);
-
-    // Positive and negative epsilon.
-    test(f64_eps, 0x00000000, 0x00000001);
-    test(-f64_eps, 0x80000000, 0x00000001);
-
-    // Positive and negative min.
-    test(f64_min, 0x00100000, 0x00000000);
-    test(-f64_min, 0x80100000, 0x00000000);
-
-    // Positive and negative max.
-    test(f64_max, 0x7FEFFFFF, 0xFFFFFFFF);
-    test(-f64_max, 0xFFEFFFFF, 0xFFFFFFFF);
-
-    // Various positive values.
-    var cursor = f64_eps * 10;
-    while (cursor != Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-
-    // Various negative values.
-    cursor = -f64_eps * 10;
-    while (cursor != -Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-  });
-
-
-  /**
-   * Tests counting packed varints.
-   */
-  it('testCountVarints', function() {
-    var values = [];
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      values.push(Math.floor(i));
-    }
-
-    var writer = new jspb.BinaryWriter();
-    writer.writePackedUint64(1, values);
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-
-    // We should have two more varints than we started with - one for the field
-    // tag, one for the packed length.
-    assertEquals(values.length + 2,
-                 jspb.utils.countVarints(buffer, 0, buffer.length));
-  });
-
-
-  /**
-   * Tests counting matching varint fields.
-   */
-  it('testCountVarintFields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeUint64(1, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countVarintFields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeUint64(123456789, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countVarintFields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests counting matching fixed32 fields.
-   */
-  it('testCountFixed32Fields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeFixed32(1, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed32Fields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeFixed32(123456789, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed32Fields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests counting matching fixed64 fields.
-   */
-  it('testCountFixed64Fields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeDouble(1, i);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed64Fields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeDouble(123456789, i);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed64Fields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests counting matching delimited fields.
-   */
-  it('testCountDelimitedFields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000; i *= 1.1) {
-      writer.writeBytes(1, [Math.floor(i)]);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countDelimitedFields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000; i *= 1.1) {
-      writer.writeBytes(123456789, [Math.floor(i)]);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countDelimitedFields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests byte format for debug strings.
-   */
-  it('testDebugBytesToTextFormat', function() {
-    assertEquals('""', jspb.utils.debugBytesToTextFormat(null));
-    assertEquals('"\\x00\\x10\\xff"',
-        jspb.utils.debugBytesToTextFormat([0, 16, 255]));
-  });
-
-
-  /**
-   * Tests converting byte blob sources into byte blobs.
-   */
-  it('testByteSourceToUint8Array', function() {
-    var convert = jspb.utils.byteSourceToUint8Array;
-
-    var sourceData = [];
-    for (var i = 0; i < 256; i++) {
-      sourceData.push(i);
-    }
-
-    var sourceBytes = new Uint8Array(sourceData);
-    var sourceBuffer = sourceBytes.buffer;
-    var sourceBase64 = goog.crypt.base64.encodeByteArray(sourceData);
-    var sourceString = String.fromCharCode.apply(null, sourceData);
-
-    function check(result) {
-      assertEquals(Uint8Array, result.constructor);
-      assertEquals(sourceData.length, result.length);
-      for (var i = 0; i < result.length; i++) {
-        assertEquals(sourceData[i], result[i]);
-      }
-    }
-
-    // Converting Uint8Arrays into Uint8Arrays should be a no-op.
-    assertEquals(sourceBytes, convert(sourceBytes));
-
-    // Converting Array.<numbers> into Uint8Arrays should work.
-    check(convert(sourceData));
-
-    // Converting ArrayBuffers into Uint8Arrays should work.
-    check(convert(sourceBuffer));
-
-    // Converting base64-encoded strings into Uint8Arrays should work.
-    check(convert(sourceBase64));
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/binary/writer_test.js b/js/compatibility_tests/v3.0.0/binary/writer_test.js
deleted file mode 100644
index d5dadb4..0000000
--- a/js/compatibility_tests/v3.0.0/binary/writer_test.js
+++ /dev/null
@@ -1,122 +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.
-
-/**
- * @fileoverview Test cases for jspb's binary protocol buffer writer. In
- * practice BinaryWriter is used to drive the Decoder and Reader test cases,
- * so only writer-specific tests are here.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.crypt');
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryWriter');
-
-
-/**
- * @param {function()} func This function should throw an error when run.
- */
-function assertFails(func) {
-  var e = assertThrows(func);
-  //assertNotNull(e.toString().match(/Error/));
-}
-
-
-describe('binaryWriterTest', function() {
-  /**
-   * Verifies that misuse of the writer class triggers assertions.
-   */
-  it('testWriteErrors', function() {
-    // Submessages with invalid field indices should assert.
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    assertFails(function() {
-      writer.writeMessage(-1, dummyMessage, goog.nullFunction);
-    });
-
-    // Writing invalid field indices should assert.
-    writer = new jspb.BinaryWriter();
-    assertFails(function() {writer.writeUint64(-1, 1);});
-
-    // Writing out-of-range field values should assert.
-    writer = new jspb.BinaryWriter();
-
-    assertFails(function() {writer.writeInt32(1, -Infinity);});
-    assertFails(function() {writer.writeInt32(1, Infinity);});
-
-    assertFails(function() {writer.writeInt64(1, -Infinity);});
-    assertFails(function() {writer.writeInt64(1, Infinity);});
-
-    assertFails(function() {writer.writeUint32(1, -1);});
-    assertFails(function() {writer.writeUint32(1, Infinity);});
-
-    assertFails(function() {writer.writeUint64(1, -1);});
-    assertFails(function() {writer.writeUint64(1, Infinity);});
-
-    assertFails(function() {writer.writeSint32(1, -Infinity);});
-    assertFails(function() {writer.writeSint32(1, Infinity);});
-
-    assertFails(function() {writer.writeSint64(1, -Infinity);});
-    assertFails(function() {writer.writeSint64(1, Infinity);});
-
-    assertFails(function() {writer.writeFixed32(1, -1);});
-    assertFails(function() {writer.writeFixed32(1, Infinity);});
-
-    assertFails(function() {writer.writeFixed64(1, -1);});
-    assertFails(function() {writer.writeFixed64(1, Infinity);});
-
-    assertFails(function() {writer.writeSfixed32(1, -Infinity);});
-    assertFails(function() {writer.writeSfixed32(1, Infinity);});
-
-    assertFails(function() {writer.writeSfixed64(1, -Infinity);});
-    assertFails(function() {writer.writeSfixed64(1, Infinity);});
-  });
-
-
-  /**
-   * Basic test of retrieving the result as a Uint8Array buffer
-   */
-  it('testGetResultBuffer', function() {
-    var expected = '0864120b48656c6c6f20776f726c641a0301020320c801';
-
-    var writer = new jspb.BinaryWriter();
-    writer.writeUint32(1, 100);
-    writer.writeString(2, 'Hello world');
-    writer.writeBytes(3, new Uint8Array([1, 2, 3]));
-    writer.writeUint32(4, 200);
-
-    var buffer = writer.getResultBuffer();
-    assertEquals(expected, goog.crypt.byteArrayToHex(buffer));
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/commonjs/export_asserts.js b/js/compatibility_tests/v3.0.0/commonjs/export_asserts.js
deleted file mode 100644
index 5219d12..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/export_asserts.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @fileoverview Exports symbols needed only by tests.
- *
- * This file exports several Closure Library symbols that are only
- * used by tests.  It is used to generate a file
- * closure_asserts_commonjs.js that is only used at testing time.
- */
-
-goog.require('goog.testing.asserts');
-
-var global = Function('return this')();
-
-// All of the closure "assert" functions are exported at the global level.
-//
-// The Google Closure assert functions start with assert, eg.
-//   assertThrows
-//   assertNotThrows
-//   assertTrue
-//   ...
-//
-// The one exception is the "fail" function.
-function shouldExport(str) {
-  return str.lastIndexOf('assert') === 0 || str == 'fail';
-}
-
-for (var key in global) {
-  if ((typeof key == "string") && global.hasOwnProperty(key) &&
-      shouldExport(key)) {
-    exports[key] = global[key];
-  }
-}
-
-// The COMPILED variable is set by Closure compiler to "true" when it compiles
-// JavaScript, so in practice this is equivalent to "exports.COMPILED = true".
-// This will disable some debugging functionality in debug.js.  We could
-// investigate whether this can/should be enabled in CommonJS builds.
-exports.COMPILED = COMPILED
diff --git a/js/compatibility_tests/v3.0.0/commonjs/export_testdeps.js b/js/compatibility_tests/v3.0.0/commonjs/export_testdeps.js
deleted file mode 100644
index 59c77ca..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/export_testdeps.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * @fileoverview Export symbols needed by tests in CommonJS style.
- *
- * This file is like export.js, but for symbols that are only used by tests.
- * However we exclude assert functions here, because they are exported into
- * the global namespace, so those are handled as a special case in
- * export_asserts.js.
- */
-
-goog.require('goog.crypt.base64');
-goog.require('jspb.arith.Int64');
-goog.require('jspb.arith.UInt64');
-goog.require('jspb.BinaryEncoder');
-goog.require('jspb.BinaryDecoder');
-goog.require('jspb.utils');
-
-exports.goog = goog;
-exports.jspb = jspb;
diff --git a/js/compatibility_tests/v3.0.0/commonjs/import_test.js b/js/compatibility_tests/v3.0.0/commonjs/import_test.js
deleted file mode 100644
index ffa34fe..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/import_test.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-// Test suite is written using Jasmine -- see http://jasmine.github.io/
-
-
-
-var googleProtobuf = require('google-protobuf');
-var asserts = require('closure_asserts_commonjs');
-var global = Function('return this')();
-
-// Bring asserts into the global namespace.
-googleProtobuf.object.extend(global, asserts);
-googleProtobuf.exportSymbol('jspb.Message', googleProtobuf.Message, global);
-
-var test7_pb = require('./test7/test7_pb');
-googleProtobuf.exportSymbol('proto.jspb.test.framing.FramingMessage', test7_pb.FramingMessage, global);
-
-describe('Import test suite', function() {
-  it('testImportedMessage', function() {
-    var framing1 = new proto.jspb.test.framing.FramingMessage([]);
-    var framing2 = new proto.jspb.test.framing.FramingMessage([]);
-    assertObjectEquals(framing1.toObject(), framing2.toObject());
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/commonjs/jasmine.json b/js/compatibility_tests/v3.0.0/commonjs/jasmine.json
deleted file mode 100644
index 666b8ed..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/jasmine.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "spec_dir": "",
-    "spec_files": [
-        "*_test.js",
-        "binary/proto_test.js"
-    ],
-    "helpers": [
-    ]
-}
diff --git a/js/compatibility_tests/v3.0.0/commonjs/rewrite_tests_for_commonjs.js b/js/compatibility_tests/v3.0.0/commonjs/rewrite_tests_for_commonjs.js
deleted file mode 100644
index b6d90d2..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/rewrite_tests_for_commonjs.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @fileoverview Utility to translate test files to CommonJS imports.
- *
- * This is a somewhat hacky tool designed to do one very specific thing.
- * All of the test files in *_test.js are written with Closure-style
- * imports (goog.require()).  This works great for running the tests
- * against Closure-style generated code, but we also want to run the
- * tests against CommonJS-style generated code without having to fork
- * the tests.
- *
- * Closure-style imports import each individual type by name.  This is
- * very different than CommonJS imports which are by file.  So we put
- * special comments in these tests like:
- *
- * // CommonJS-LoadFromFile: test_pb
- * goog.require('proto.jspb.test.CloneExtension');
- * goog.require('proto.jspb.test.Complex');
- * goog.require('proto.jspb.test.DefaultValues');
- *
- * This script parses that special comment and uses it to generate proper
- * CommonJS require() statements so that the tests can run and pass using
- * CommonJS imports.  The script will change the above statements into:
- *
- *   var test_pb = require('test_pb');
- *   googleProtobuf.exportSymbol('proto.jspb.test.CloneExtension', test_pb.CloneExtension, global);
- *   googleProtobuf.exportSymbol('proto.jspb.test.Complex', test_pb.Complex, global);
- *   googleProtobuf.exportSymbol('proto.jspb.test.DefaultValues', test_pb.DefaultValues, global);
- *
- * (The "exportSymbol" function will define the given names in the global
- * namespace, taking care not to overwrite any previous value for
- * "proto.jspb.test").
- */
-
-var lineReader = require('readline').createInterface({
-  input: process.stdin,
-  output: process.stdout
-});
-
-function tryStripPrefix(str, prefix) {
-  if (str.lastIndexOf(prefix) !== 0) {
-    throw "String: " + str + " didn't start with: " + prefix;
-  }
-  return str.substr(prefix.length);
-}
-
-function camelCase(str) {
-  var ret = '';
-  var ucaseNext = false;
-  for (var i = 0; i < str.length; i++) {
-    if (str[i] == '-') {
-      ucaseNext = true;
-    } else if (ucaseNext) {
-      ret += str[i].toUpperCase();
-      ucaseNext = false;
-    } else {
-      ret += str[i];
-    }
-  }
-  return ret;
-}
-
-var module = null;
-var pkg = null;
-
-// Header: goes in every file at the top.
-console.log("var global = Function('return this')();");
-console.log("var googleProtobuf = require('google-protobuf');");
-console.log("var testdeps = require('testdeps_commonjs');");
-console.log("global.goog = testdeps.goog;");
-console.log("global.jspb = testdeps.jspb;");
-console.log("var asserts = require('closure_asserts_commonjs');");
-console.log("");
-console.log("// Bring asserts into the global namespace.");
-console.log("googleProtobuf.object.extend(global, asserts);");
-
-lineReader.on('line', function(line) {
-  var isRequire = line.match(/goog\.require\('([^']*)'\)/);
-  var isLoadFromFile = line.match(/CommonJS-LoadFromFile: (\S*) (.*)/);
-  var isSetTestOnly = line.match(/goog.setTestOnly()/);
-  if (isRequire) {
-    if (module) {  // Skip goog.require() lines before the first directive.
-      var fullSym = isRequire[1];
-      var sym = tryStripPrefix(fullSym, pkg);
-      console.log("googleProtobuf.exportSymbol('" + fullSym + "', " + module + sym + ', global);');
-    }
-  } else if (isLoadFromFile) {
-    var module_path = isLoadFromFile[1].split('/');
-    module = camelCase(module_path[module_path.length - 1]);
-    pkg = isLoadFromFile[2];
-
-    if (module != "googleProtobuf") {  // We unconditionally require this in the header.
-      console.log("var " + module + " = require('./" + isLoadFromFile[1] + "');");
-    }
-  } else if (!isSetTestOnly) {  // Remove goog.setTestOnly() lines.
-    console.log(line);
-  }
-});
diff --git a/js/compatibility_tests/v3.0.0/commonjs/test6/test6.proto b/js/compatibility_tests/v3.0.0/commonjs/test6/test6.proto
deleted file mode 100644
index a060925..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/test6/test6.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test.importing;
-
-message ImportedMessage {
-  string string_value = 1;
-}
diff --git a/js/compatibility_tests/v3.0.0/commonjs/test7/test7.proto b/js/compatibility_tests/v3.0.0/commonjs/test7/test7.proto
deleted file mode 100644
index f5574a3..0000000
--- a/js/compatibility_tests/v3.0.0/commonjs/test7/test7.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test.framing;
-
-import "test6/test6.proto";
-
-message FramingMessage {
-  jspb.test.importing.ImportedMessage imported_message = 1;
-}
diff --git a/js/compatibility_tests/v3.0.0/data.proto b/js/compatibility_tests/v3.0.0/data.proto
deleted file mode 100644
index 74a8a99..0000000
--- a/js/compatibility_tests/v3.0.0/data.proto
+++ /dev/null
@@ -1,51 +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.
-
-// Author: mwr@google.com (Mark Rawling)
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test;
-
-// legacy data, must be nested
-message data {
-  message NestedData {
-    required string str = 1;
-  }
-}
-
-// new data, does not require nesting
-message UnnestedData {
-  required string str = 1;
-}
-
diff --git a/js/compatibility_tests/v3.0.0/debug_test.js b/js/compatibility_tests/v3.0.0/debug_test.js
deleted file mode 100644
index 01cbf89..0000000
--- a/js/compatibility_tests/v3.0.0/debug_test.js
+++ /dev/null
@@ -1,105 +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.
-
-goog.setTestOnly();
-
-goog.require('goog.testing.asserts');
-
-// CommonJS-LoadFromFile: google-protobuf
-goog.require('jspb.debug');
-
-// CommonJS-LoadFromFile: test_pb
-goog.require('proto.jspb.test.HasExtensions');
-goog.require('proto.jspb.test.IsExtension');
-goog.require('proto.jspb.test.Simple1');
-
-
-
-describe('debugTest', function() {
-  it('testSimple1', function() {
-    if (COMPILED) {
-      return;
-    }
-    var message = new proto.jspb.test.Simple1();
-    message.setAString('foo');
-    assertObjectEquals({
-      $name: 'proto.jspb.test.Simple1',
-      'aString': 'foo',
-      'aRepeatedStringList': []
-    }, jspb.debug.dump(message));
-
-    message.setABoolean(true);
-    message.setARepeatedStringList(['1', '2']);
-
-    assertObjectEquals({
-      $name: 'proto.jspb.test.Simple1',
-      'aString': 'foo',
-      'aRepeatedStringList': ['1', '2'],
-      'aBoolean': true
-    }, jspb.debug.dump(message));
-
-    message.setAString(undefined);
-
-    assertObjectEquals({
-      $name: 'proto.jspb.test.Simple1',
-      'aRepeatedStringList': ['1', '2'],
-      'aBoolean': true
-    }, jspb.debug.dump(message));
-  });
-
-
-  it('testExtensions', function() {
-    if (COMPILED) {
-      return;
-    }
-    var extension = new proto.jspb.test.IsExtension();
-    extension.setExt1('ext1field');
-    var extendable = new proto.jspb.test.HasExtensions();
-    extendable.setStr1('v1');
-    extendable.setStr2('v2');
-    extendable.setStr3('v3');
-    extendable.setExtension(proto.jspb.test.IsExtension.extField, extension);
-
-    assertObjectEquals({
-      '$name': 'proto.jspb.test.HasExtensions',
-      'str1': 'v1',
-      'str2': 'v2',
-      'str3': 'v3',
-      '$extensions': {
-        'extField': {
-          '$name': 'proto.jspb.test.IsExtension',
-          'ext1': 'ext1field'
-        },
-        'repeatedSimpleList': []
-      }
-    }, jspb.debug.dump(extendable));
-  });
-
-});
diff --git a/js/compatibility_tests/v3.0.0/jasmine1.json b/js/compatibility_tests/v3.0.0/jasmine1.json
deleted file mode 100644
index 6653c01..0000000
--- a/js/compatibility_tests/v3.0.0/jasmine1.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "spec_dir": "",
-    "spec_files": [
-        "*_test.js",
-        "binary/*_test.js"
-    ],
-    "helpers": [
-        "../../../js/node_modules/google-closure-library/closure/goog/bootstrap/nodejs.js",
-        "../../../js/node_loader.js",
-        "../../../js/deps.js",
-        "../../../js/google/protobuf/any.js",
-        "../../../js/google/protobuf/struct.js",
-        "../../../js/google/protobuf/timestamp.js",
-        "testproto_libs1.js",
-        "testproto_libs2.js"
-    ]
-}
diff --git a/js/compatibility_tests/v3.0.0/jasmine2.json b/js/compatibility_tests/v3.0.0/jasmine2.json
deleted file mode 100644
index 3208078..0000000
--- a/js/compatibility_tests/v3.0.0/jasmine2.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "spec_dir": "",
-    "spec_files": [
-        "*_test.js",
-        "binary/*_test.js"
-    ],
-    "helpers": [
-        "../../../js/node_modules/google-closure-library/closure/goog/bootstrap/nodejs.js",
-        "../../../js/node_loader.js",
-        "../../../js/deps.js",
-        "../../../js/google/protobuf/any.js",
-        "../../../js/google/protobuf/struct.js",
-        "../../../js/google/protobuf/timestamp.js",
-        "testproto_libs1_new.js",
-        "testproto_libs2.js"
-    ]
-}
diff --git a/js/compatibility_tests/v3.0.0/jasmine3.json b/js/compatibility_tests/v3.0.0/jasmine3.json
deleted file mode 100644
index 3fb9a1b..0000000
--- a/js/compatibility_tests/v3.0.0/jasmine3.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "spec_dir": "",
-    "spec_files": [
-        "*_test.js",
-        "binary/*_test.js"
-    ],
-    "helpers": [
-        "../../../js/node_modules/google-closure-library/closure/goog/bootstrap/nodejs.js",
-        "../../../js/node_loader.js",
-        "../../../js/deps.js",
-        "../../../js/google/protobuf/any.js",
-        "../../../js/google/protobuf/struct.js",
-        "../../../js/google/protobuf/timestamp.js",
-        "testproto_libs1.js",
-        "testproto_libs2_new.js"
-    ]
-}
diff --git a/js/compatibility_tests/v3.0.0/message_test.js b/js/compatibility_tests/v3.0.0/message_test.js
deleted file mode 100644
index b779143..0000000
--- a/js/compatibility_tests/v3.0.0/message_test.js
+++ /dev/null
@@ -1,1080 +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.
-
-// Test suite is written using Jasmine -- see http://jasmine.github.io/
-
-goog.setTestOnly();
-
-goog.require('goog.json');
-goog.require('goog.testing.asserts');
-goog.require('goog.userAgent');
-
-// CommonJS-LoadFromFile: google-protobuf jspb
-goog.require('jspb.Message');
-
-// CommonJS-LoadFromFile: test5_pb proto.jspb.exttest.beta
-goog.require('proto.jspb.exttest.beta.floatingStrField');
-
-// CommonJS-LoadFromFile: test3_pb proto.jspb.exttest
-goog.require('proto.jspb.exttest.floatingMsgField');
-
-// CommonJS-LoadFromFile: test4_pb proto.jspb.exttest
-goog.require('proto.jspb.exttest.floatingMsgFieldTwo');
-
-// CommonJS-LoadFromFile: test_pb proto.jspb.test
-goog.require('proto.jspb.test.CloneExtension');
-goog.require('proto.jspb.test.Complex');
-goog.require('proto.jspb.test.DefaultValues');
-goog.require('proto.jspb.test.Empty');
-goog.require('proto.jspb.test.EnumContainer');
-goog.require('proto.jspb.test.floatingMsgField');
-goog.require('proto.jspb.test.FloatingPointFields');
-goog.require('proto.jspb.test.floatingStrField');
-goog.require('proto.jspb.test.HasExtensions');
-goog.require('proto.jspb.test.IndirectExtension');
-goog.require('proto.jspb.test.IsExtension');
-goog.require('proto.jspb.test.OptionalFields');
-goog.require('proto.jspb.test.OuterEnum');
-goog.require('proto.jspb.test.OuterMessage.Complex');
-goog.require('proto.jspb.test.Simple1');
-goog.require('proto.jspb.test.Simple2');
-goog.require('proto.jspb.test.SpecialCases');
-goog.require('proto.jspb.test.TestClone');
-goog.require('proto.jspb.test.TestEndsWithBytes');
-goog.require('proto.jspb.test.TestGroup');
-goog.require('proto.jspb.test.TestGroup1');
-goog.require('proto.jspb.test.TestMessageWithOneof');
-goog.require('proto.jspb.test.TestReservedNames');
-goog.require('proto.jspb.test.TestReservedNamesExtension');
-
-// CommonJS-LoadFromFile: test2_pb proto.jspb.test
-goog.require('proto.jspb.test.ExtensionMessage');
-goog.require('proto.jspb.test.TestExtensionsMessage');
-
-
-
-
-describe('Message test suite', function() {
-  it('testEmptyProto', function() {
-    var empty1 = new proto.jspb.test.Empty([]);
-    var empty2 = new proto.jspb.test.Empty([]);
-    assertObjectEquals({}, empty1.toObject());
-    assertObjectEquals('Message should not be corrupted:', empty2, empty1);
-  });
-
-  it('testTopLevelEnum', function() {
-    var response = new proto.jspb.test.EnumContainer([]);
-    response.setOuterEnum(proto.jspb.test.OuterEnum.FOO);
-    assertEquals(proto.jspb.test.OuterEnum.FOO, response.getOuterEnum());
-  });
-
-  it('testByteStrings', function() {
-    var data = new proto.jspb.test.DefaultValues([]);
-    data.setBytesField('some_bytes');
-    assertEquals('some_bytes', data.getBytesField());
-  });
-
-  it('testComplexConversion', function() {
-    var data1 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
-    var data2 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
-    var foo = new proto.jspb.test.Complex(data1);
-    var bar = new proto.jspb.test.Complex(data2);
-    var result = foo.toObject();
-    assertObjectEquals({
-      aString: 'a',
-      anOutOfOrderBool: 1,
-      aNestedMessage: {
-        anInt: 11
-      },
-      aRepeatedMessageList: [{anInt: 22}, {anInt: 33}],
-      aRepeatedStringList: ['s1', 's2']
-    }, result);
-
-    // Now test with the jspb instances included.
-    result = foo.toObject(true /* opt_includeInstance */);
-    assertObjectEquals({
-      aString: 'a',
-      anOutOfOrderBool: 1,
-      aNestedMessage: {
-        anInt: 11,
-        $jspbMessageInstance: foo.getANestedMessage()
-      },
-      aRepeatedMessageList: [
-        {anInt: 22, $jspbMessageInstance: foo.getARepeatedMessageList()[0]},
-        {anInt: 33, $jspbMessageInstance: foo.getARepeatedMessageList()[1]}
-      ],
-      aRepeatedStringList: ['s1', 's2'],
-      $jspbMessageInstance: foo
-    }, result);
-
-  });
-
-  it('testMissingFields', function() {
-    var foo = new proto.jspb.test.Complex([
-        undefined, undefined, undefined, [],
-        undefined, undefined, undefined, undefined]);
-    var bar = new proto.jspb.test.Complex([
-        undefined, undefined, undefined, [],
-        undefined, undefined, undefined, undefined]);
-    var result = foo.toObject();
-    assertObjectEquals({
-      aString: undefined,
-      anOutOfOrderBool: undefined,
-      aNestedMessage: {
-        anInt: undefined
-      },
-      // Note: JsPb converts undefined repeated fields to empty arrays.
-      aRepeatedMessageList: [],
-      aRepeatedStringList: []
-    }, result);
-
-  });
-
-  it('testNestedComplexMessage', function() {
-    // Instantiate the message and set a unique field, just to ensure that we
-    // are not getting jspb.test.Complex instead.
-    var msg = new proto.jspb.test.OuterMessage.Complex();
-    msg.setInnerComplexField(5);
-  });
-
-  it('testSpecialCases', function() {
-    // Note: Some property names are reserved in JavaScript.
-    // These names are converted to the Js property named pb_<reserved_name>.
-    var special =
-        new proto.jspb.test.SpecialCases(['normal', 'default', 'function',
-        'var']);
-    var result = special.toObject();
-    assertObjectEquals({
-      normal: 'normal',
-      pb_default: 'default',
-      pb_function: 'function',
-      pb_var: 'var'
-    }, result);
-  });
-
-  it('testDefaultValues', function() {
-    var defaultString = "default<>\'\"abc";
-    var response = new proto.jspb.test.DefaultValues();
-
-    // Test toObject
-    var expectedObject = {
-      stringField: defaultString,
-      boolField: true,
-      intField: 11,
-      enumField: 13,
-      emptyField: '',
-      bytesField: 'bW9v'
-    };
-    assertObjectEquals(expectedObject, response.toObject());
-
-
-    // Test getters
-    response = new proto.jspb.test.DefaultValues();
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertEquals('', response.getEmptyField());
-    assertEquals('bW9v', response.getBytesField());
-
-    function makeDefault(values) {
-      return new proto.jspb.test.DefaultValues(values);
-    }
-
-    // Test with undefined values,
-    // Use push to workaround IE treating undefined array elements as holes.
-    response = makeDefault([undefined, undefined, undefined, undefined]);
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-
-    // Test with null values, as would be returned by a JSON serializer.
-    response = makeDefault([null, null, null, null]);
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-
-    // Test with false-like values.
-    response = makeDefault(['', false, 0, 0]);
-    assertEquals('', response.getStringField());
-    assertEquals(false, response.getBoolField());
-    assertEquals(true, response.getIntField() == 0);
-    assertEquals(true, response.getEnumField() == 0);
-    assertTrue(response.hasStringField());
-    assertTrue(response.hasBoolField());
-    assertTrue(response.hasIntField());
-    assertTrue(response.hasEnumField());
-
-    // Test that clearing the values reverts them to the default state.
-    response = makeDefault(['blah', false, 111, 77]);
-    response.clearStringField(); response.clearBoolField();
-    response.clearIntField(); response.clearEnumField();
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-
-    // Test that setFoo(null) clears the values.
-    response = makeDefault(['blah', false, 111, 77]);
-    response.setStringField(null); response.setBoolField(null);
-    response.setIntField(undefined); response.setEnumField(undefined);
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-  });
-
-  it('testMessageRegistration', function() {
-    // goog.require(SomeResponse) will include its library, which will in
-    // turn add SomeResponse to the message registry.
-    assertEquals(jspb.Message.registry_['res'], proto.jspb.test.SomeResponse);
-  });
-
-  it('testClearFields', function() {
-    var data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
-    var foo = new proto.jspb.test.OptionalFields(data);
-    foo.clearAString();
-    foo.clearABool();
-    foo.clearANestedMessage();
-    foo.clearARepeatedMessageList();
-    foo.clearARepeatedStringList();
-    assertEquals('', foo.getAString());
-    assertEquals(false, foo.getABool());
-    assertUndefined(foo.getANestedMessage());
-    assertFalse(foo.hasAString());
-    assertFalse(foo.hasABool());
-    assertObjectEquals([], foo.getARepeatedMessageList());
-    assertObjectEquals([], foo.getARepeatedStringList());
-    // NOTE: We want the missing fields in 'expected' to be undefined,
-    // but we actually get a sparse array instead. We could use something
-    // like [1,undefined,2] to avoid this, except that this is still
-    // sparse on IE. No comment...
-    var expected = [,,, [], []];
-    expected[0] = expected[1] = expected[2] = undefined;
-    assertObjectEquals(expected, foo.toArray());
-
-    // Test set(null). We could deprecated this in favor of clear(), but
-    // it's also convenient to have.
-    data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
-    foo = new proto.jspb.test.OptionalFields(data);
-    foo.setAString(null);
-    foo.setABool(null);
-    foo.setANestedMessage(null);
-    foo.setARepeatedMessageList(null);
-    foo.setARepeatedStringList(null);
-    assertEquals('', foo.getAString());
-    assertEquals(false, foo.getABool());
-    assertNull(foo.getANestedMessage());
-    assertFalse(foo.hasAString());
-    assertFalse(foo.hasABool());
-    assertObjectEquals([], foo.getARepeatedMessageList());
-    assertObjectEquals([], foo.getARepeatedStringList());
-    assertObjectEquals([null, null, null, [], []], foo.toArray());
-
-    // Test set(undefined). Again, not something we really need, and not
-    // supported directly by our typing, but it should 'do the right thing'.
-    data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
-    foo = new proto.jspb.test.OptionalFields(data);
-    foo.setAString(undefined);
-    foo.setABool(undefined);
-    foo.setANestedMessage(undefined);
-    foo.setARepeatedMessageList(undefined);
-    foo.setARepeatedStringList(undefined);
-    assertEquals('', foo.getAString());
-    assertEquals(false, foo.getABool());
-    assertUndefined(foo.getANestedMessage());
-    assertFalse(foo.hasAString());
-    assertFalse(foo.hasABool());
-    assertObjectEquals([], foo.getARepeatedMessageList());
-    assertObjectEquals([], foo.getARepeatedStringList());
-    expected = [,,, [], []];
-    expected[0] = expected[1] = expected[2] = undefined;
-    assertObjectEquals(expected, foo.toArray());
-  });
-
-  it('testDifferenceRawObject', function() {
-    var p1 = new proto.jspb.test.HasExtensions(['hi', 'diff', {}]);
-    var p2 = new proto.jspb.test.HasExtensions(['hi', 'what',
-                                               {1000: 'unique'}]);
-    var diff = /** @type {proto.jspb.test.HasExtensions} */
-        (jspb.Message.difference(p1, p2));
-    assertEquals('', diff.getStr1());
-    assertEquals('what', diff.getStr2());
-    assertEquals('', diff.getStr3());
-    assertEquals('unique', diff.extensionObject_[1000]);
-  });
-
-  it('testEqualsSimple', function() {
-    var s1 = new proto.jspb.test.Simple1(['hi']);
-    assertTrue(jspb.Message.equals(s1, new proto.jspb.test.Simple1(['hi'])));
-    assertFalse(jspb.Message.equals(s1, new proto.jspb.test.Simple1(['bye'])));
-    var s1b = new proto.jspb.test.Simple1(['hi', ['hello']]);
-    assertTrue(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['hi', ['hello']])));
-    assertTrue(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['hi', ['hello', undefined,
-                                            undefined, undefined]])));
-    assertFalse(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['no', ['hello']])));
-    // Test with messages of different types
-    var s2 = new proto.jspb.test.Simple2(['hi']);
-    assertFalse(jspb.Message.equals(s1, s2));
-  });
-
-  it('testEquals_softComparison', function() {
-    var s1 = new proto.jspb.test.Simple1(['hi', [], null]);
-    assertTrue(jspb.Message.equals(s1,
-        new proto.jspb.test.Simple1(['hi', []])));
-
-    var s1b = new proto.jspb.test.Simple1(['hi', [], true]);
-    assertTrue(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['hi', [], 1])));
-  });
-
-  it('testEqualsComplex', function() {
-    var data1 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
-    var data2 = ['a',,, [, 11], [[, 22], [, 34]],, ['s1', 's2'],, 1];
-    var data3 = ['a',,, [, 11], [[, 22]],, ['s1', 's2'],, 1];
-    var data4 = ['hi'];
-    var c1a = new proto.jspb.test.Complex(data1);
-    var c1b = new proto.jspb.test.Complex(data1);
-    var c2 = new proto.jspb.test.Complex(data2);
-    var c3 = new proto.jspb.test.Complex(data3);
-    var s1 = new proto.jspb.test.Simple1(data4);
-
-    assertTrue(jspb.Message.equals(c1a, c1b));
-    assertFalse(jspb.Message.equals(c1a, c2));
-    assertFalse(jspb.Message.equals(c2, c3));
-    assertFalse(jspb.Message.equals(c1a, s1));
-  });
-
-  it('testEqualsExtensionsConstructed', function() {
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([]),
-        new proto.jspb.test.HasExtensions([{}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}])
-    ));
-    assertFalse(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'b'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions([,,, {100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([,,, {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi',,, {100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi',,, {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}])
-    ));
-  });
-
-  it('testEqualsExtensionsUnconstructed', function() {
-    assertTrue(jspb.Message.compareFields([], [{}]));
-    assertTrue(jspb.Message.compareFields([,,, {}], []));
-    assertTrue(jspb.Message.compareFields([,,, {}], [,, {}]));
-    assertTrue(jspb.Message.compareFields(
-        ['hi', {100: [{200: 'a'}]}], ['hi', {100: [{200: 'a'}]}]));
-    assertFalse(jspb.Message.compareFields(
-        ['hi', {100: [{200: 'a'}]}], ['hi', {100: [{200: 'b'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        [{100: [{200: 'a'}]}], [{100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        [{100: [{200: 'a'}]}], [,,, {100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        [,,, {100: [{200: 'a'}]}], [{100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        ['hi', {100: [{200: 'a'}]}], ['hi',,, {100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        ['hi',,, {100: [{200: 'a'}]}], ['hi', {100: [{200: 'a'}]}]));
-  });
-
-  it('testToMap', function() {
-    var p1 = new proto.jspb.test.Simple1(['k', ['v']]);
-    var p2 = new proto.jspb.test.Simple1(['k1', ['v1', 'v2']]);
-    var soymap = jspb.Message.toMap([p1, p2],
-        proto.jspb.test.Simple1.prototype.getAString,
-        proto.jspb.test.Simple1.prototype.toObject);
-    assertEquals('k', soymap['k'].aString);
-    assertArrayEquals(['v'], soymap['k'].aRepeatedStringList);
-    var protomap = jspb.Message.toMap([p1, p2],
-        proto.jspb.test.Simple1.prototype.getAString);
-    assertEquals('k', protomap['k'].getAString());
-    assertArrayEquals(['v'], protomap['k'].getARepeatedStringList());
-  });
-
-  it('testClone', function() {
-    var supportsUint8Array =
-        !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
-    var original = new proto.jspb.test.TestClone();
-    original.setStr('v1');
-    var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
-    var simple2 = new proto.jspb.test.Simple1(['x2', ['y2', 'z2']]);
-    var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
-    original.setSimple1(simple1);
-    original.setSimple2List([simple2, simple3]);
-    var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
-    original.setBytesField(bytes1);
-    var extension = new proto.jspb.test.CloneExtension();
-    extension.setExt('e1');
-    original.setExtension(proto.jspb.test.IsExtension.extField, extension);
-    var clone = original.cloneMessage();
-    assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],,
-      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }],
-        clone.toArray());
-    clone.setStr('v2');
-    var simple4 = new proto.jspb.test.Simple1(['a1', ['b1', 'c1']]);
-    var simple5 = new proto.jspb.test.Simple1(['a2', ['b2', 'c2']]);
-    var simple6 = new proto.jspb.test.Simple1(['a3', ['b3', 'c3']]);
-    clone.setSimple1(simple4);
-    clone.setSimple2List([simple5, simple6]);
-    if (supportsUint8Array) {
-      clone.getBytesField()[0] = 4;
-      assertObjectEquals(bytes1, original.getBytesField());
-    }
-    var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
-    clone.setBytesField(bytes2);
-    var newExtension = new proto.jspb.test.CloneExtension();
-    newExtension.setExt('e2');
-    clone.setExtension(proto.jspb.test.CloneExtension.extField, newExtension);
-    assertArrayEquals(['v2',, ['a1', ['b1', 'c1']],,
-      [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]], bytes2,, { 100: [, 'e2'] }],
-        clone.toArray());
-    assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],,
-      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }],
-        original.toArray());
-  });
-
-  it('testCopyInto', function() {
-    var supportsUint8Array =
-        !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
-    var original = new proto.jspb.test.TestClone();
-    original.setStr('v1');
-    var dest = new proto.jspb.test.TestClone();
-    dest.setStr('override');
-    var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
-    var simple2 = new proto.jspb.test.Simple1(['x2', ['y2', 'z2']]);
-    var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
-    var destSimple1 = new proto.jspb.test.Simple1(['ox1', ['oy1', 'oz1']]);
-    var destSimple2 = new proto.jspb.test.Simple1(['ox2', ['oy2', 'oz2']]);
-    var destSimple3 = new proto.jspb.test.Simple1(['ox3', ['oy3', 'oz3']]);
-    original.setSimple1(simple1);
-    original.setSimple2List([simple2, simple3]);
-    dest.setSimple1(destSimple1);
-    dest.setSimple2List([destSimple2, destSimple3]);
-    var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
-    var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
-    original.setBytesField(bytes1);
-    dest.setBytesField(bytes2);
-    var extension = new proto.jspb.test.CloneExtension();
-    extension.setExt('e1');
-    original.setExtension(proto.jspb.test.CloneExtension.extField, extension);
-
-    jspb.Message.copyInto(original, dest);
-    assertArrayEquals(original.toArray(), dest.toArray());
-    assertEquals('x1', dest.getSimple1().getAString());
-    assertEquals('e1',
-        dest.getExtension(proto.jspb.test.CloneExtension.extField).getExt());
-    dest.getSimple1().setAString('new value');
-    assertNotEquals(dest.getSimple1().getAString(),
-        original.getSimple1().getAString());
-    if (supportsUint8Array) {
-      dest.getBytesField()[0] = 7;
-      assertObjectEquals(bytes1, original.getBytesField());
-      assertObjectEquals(new Uint8Array([7, 2, 3]), dest.getBytesField());
-    } else {
-      dest.setBytesField('789');
-      assertObjectEquals(bytes1, original.getBytesField());
-      assertObjectEquals('789', dest.getBytesField());
-    }
-    dest.getExtension(proto.jspb.test.CloneExtension.extField).
-        setExt('new value');
-    assertNotEquals(
-        dest.getExtension(proto.jspb.test.CloneExtension.extField).getExt(),
-        original.getExtension(
-            proto.jspb.test.CloneExtension.extField).getExt());
-  });
-
-  it('testCopyInto_notSameType', function() {
-    var a = new proto.jspb.test.TestClone();
-    var b = new proto.jspb.test.Simple1(['str', ['s1', 's2']]);
-
-    var e = assertThrows(function() {
-      jspb.Message.copyInto(a, b);
-    });
-    assertContains('should have the same type', e.message);
-  });
-
-  it('testExtensions', function() {
-    var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
-    var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2']]);
-    var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
-    extendable.setExtension(proto.jspb.test.IsExtension.extField, extension1);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.simple,
-                            extension2);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.str, 'xyzzy');
-    extendable.setExtension(proto.jspb.test.IndirectExtension.repeatedStrList,
-        ['a', 'b']);
-    var s1 = new proto.jspb.test.Simple1(['foo', ['s1', 's2']]);
-    var s2 = new proto.jspb.test.Simple1(['bar', ['t1', 't2']]);
-    extendable.setExtension(
-        proto.jspb.test.IndirectExtension.repeatedSimpleList,
-        [s1, s2]);
-    assertObjectEquals(extension1,
-        extendable.getExtension(proto.jspb.test.IsExtension.extField));
-    assertObjectEquals(extension2,
-        extendable.getExtension(proto.jspb.test.IndirectExtension.simple));
-    assertObjectEquals('xyzzy',
-        extendable.getExtension(proto.jspb.test.IndirectExtension.str));
-    assertObjectEquals(['a', 'b'], extendable.getExtension(
-        proto.jspb.test.IndirectExtension.repeatedStrList));
-    assertObjectEquals([s1, s2], extendable.getExtension(
-        proto.jspb.test.IndirectExtension.repeatedSimpleList));
-    // Not supported yet, but it should work...
-    extendable.setExtension(proto.jspb.test.IndirectExtension.simple, null);
-    assertNull(
-        extendable.getExtension(proto.jspb.test.IndirectExtension.simple));
-    extendable.setExtension(proto.jspb.test.IndirectExtension.str, null);
-    assertNull(extendable.getExtension(proto.jspb.test.IndirectExtension.str));
-
-
-    // Extension fields with jspb.ignore = true are ignored.
-    assertUndefined(proto.jspb.test.IndirectExtension['ignored']);
-    assertUndefined(proto.jspb.test.HasExtensions['ignoredFloating']);
-  });
-
-  it('testFloatingExtensions', function() {
-    // From an autogenerated container.
-    var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
-    var extension = new proto.jspb.test.Simple1(['foo', ['s1', 's2']]);
-    extendable.setExtension(proto.jspb.test.simple1, extension);
-    assertObjectEquals(extension,
-        extendable.getExtension(proto.jspb.test.simple1));
-
-    // From _lib mode.
-    extension = new proto.jspb.test.ExtensionMessage(['s1']);
-    extendable = new proto.jspb.test.TestExtensionsMessage([16]);
-    extendable.setExtension(proto.jspb.test.floatingMsgField, extension);
-    extendable.setExtension(proto.jspb.test.floatingStrField, 's2');
-    assertObjectEquals(extension,
-        extendable.getExtension(proto.jspb.test.floatingMsgField));
-    assertObjectEquals('s2',
-        extendable.getExtension(proto.jspb.test.floatingStrField));
-    assertNotUndefined(proto.jspb.exttest.floatingMsgField);
-    assertNotUndefined(proto.jspb.exttest.floatingMsgFieldTwo);
-    assertNotUndefined(proto.jspb.exttest.beta.floatingStrField);
-  });
-
-  it('testToObject_extendedObject', function() {
-    var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
-    var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2'], true]);
-    var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
-    extendable.setExtension(proto.jspb.test.IsExtension.extField, extension1);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.simple,
-                            extension2);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.str, 'xyzzy');
-    extendable.setExtension(proto.jspb.test.IndirectExtension.repeatedStrList,
-        ['a', 'b']);
-    var s1 = new proto.jspb.test.Simple1(['foo', ['s1', 's2'], true]);
-    var s2 = new proto.jspb.test.Simple1(['bar', ['t1', 't2'], false]);
-    extendable.setExtension(
-        proto.jspb.test.IndirectExtension.repeatedSimpleList,
-        [s1, s2]);
-    assertObjectEquals({
-      str1: 'v1', str2: 'v2', str3: 'v3',
-      extField: { ext1: 'ext1field' },
-      simple: {
-        aString: 'str', aRepeatedStringList: ['s1', 's2'], aBoolean: true
-      },
-      str: 'xyzzy',
-      repeatedStrList: ['a', 'b'],
-      repeatedSimpleList: [
-        { aString: 'foo', aRepeatedStringList: ['s1', 's2'], aBoolean: true},
-        { aString: 'bar', aRepeatedStringList: ['t1', 't2'], aBoolean: false}
-      ]
-    }, extendable.toObject());
-
-    // Now, with instances included.
-    assertObjectEquals({
-      str1: 'v1', str2: 'v2', str3: 'v3',
-      extField: {
-        ext1: 'ext1field',
-        $jspbMessageInstance:
-            extendable.getExtension(proto.jspb.test.IsExtension.extField)
-      },
-      simple: {
-        aString: 'str',
-        aRepeatedStringList: ['s1', 's2'],
-        aBoolean: true,
-        $jspbMessageInstance:
-            extendable.getExtension(proto.jspb.test.IndirectExtension.simple)
-      },
-      str: 'xyzzy',
-      repeatedStrList: ['a', 'b'],
-      repeatedSimpleList: [{
-        aString: 'foo',
-        aRepeatedStringList: ['s1', 's2'],
-        aBoolean: true,
-        $jspbMessageInstance: s1
-      }, {
-        aString: 'bar',
-        aRepeatedStringList: ['t1', 't2'],
-        aBoolean: false,
-        $jspbMessageInstance: s2
-      }],
-      $jspbMessageInstance: extendable
-    }, extendable.toObject(true /* opt_includeInstance */));
-  });
-
-  it('testInitialization_emptyArray', function() {
-    var msg = new proto.jspb.test.HasExtensions([]);
-    if (jspb.Message.MINIMIZE_MEMORY_ALLOCATIONS) {
-      assertArrayEquals([], msg.toArray());
-    } else {
-      // Extension object is created past all regular fields.
-      assertArrayEquals([,,, {}], msg.toArray());
-    }
-  });
-
-  it('testInitialization_justExtensionObject', function() {
-    var msg = new proto.jspb.test.Empty([{1: 'hi'}]);
-    // The extensionObject is not moved from its original location.
-    assertArrayEquals([{1: 'hi'}], msg.toArray());
-  });
-
-  it('testInitialization_incompleteList', function() {
-    var msg = new proto.jspb.test.Empty([1, {4: 'hi'}]);
-    // The extensionObject is not moved from its original location.
-    assertArrayEquals([1, {4: 'hi'}], msg.toArray());
-  });
-
-  it('testInitialization_forwardCompatible', function() {
-    var msg = new proto.jspb.test.Empty([1, 2, 3, {1: 'hi'}]);
-    assertArrayEquals([1, 2, 3, {1: 'hi'}], msg.toArray());
-  });
-
-  it('testExtendedMessageEnsureObject', function() {
-    var data = new proto.jspb.test.HasExtensions(['str1',
-        {'a_key': 'an_object'}]);
-    assertEquals('an_object', data.extensionObject_['a_key']);
-  });
-
-  it('testToObject_hasExtensionField', function() {
-    var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]);
-    var obj = data.toObject();
-    assertEquals('str1', obj.str1);
-    assertEquals('ext1', obj.extField.ext1);
-  });
-
-  it('testGetExtension', function() {
-    var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]);
-    assertEquals('str1', data.getStr1());
-    var extension = data.getExtension(proto.jspb.test.IsExtension.extField);
-    assertNotNull(extension);
-    assertEquals('ext1', extension.getExt1());
-  });
-
-  it('testSetExtension', function() {
-    var data = new proto.jspb.test.HasExtensions();
-    var extensionMessage = new proto.jspb.test.IsExtension(['is_extension']);
-    data.setExtension(proto.jspb.test.IsExtension.extField, extensionMessage);
-    var obj = data.toObject();
-    assertNotNull(
-        data.getExtension(proto.jspb.test.IsExtension.extField));
-    assertEquals('is_extension', obj.extField.ext1);
-  });
-
-  /**
-   * Note that group is long deprecated, we only support it because JsPb has
-   * a goal of being able to generate JS classes for all proto descriptors.
-   */
-  it('testGroups', function() {
-    var group = new proto.jspb.test.TestGroup();
-    var someGroup = new proto.jspb.test.TestGroup.RepeatedGroup();
-    someGroup.setId('g1');
-    someGroup.setSomeBoolList([true, false]);
-    group.setRepeatedGroupList([someGroup]);
-    var groups = group.getRepeatedGroupList();
-    assertEquals('g1', groups[0].getId());
-    assertObjectEquals([true, false], groups[0].getSomeBoolList());
-    assertObjectEquals({id: 'g1', someBoolList: [true, false]},
-        groups[0].toObject());
-    assertObjectEquals({
-      repeatedGroupList: [{id: 'g1', someBoolList: [true, false]}],
-      requiredGroup: {id: undefined},
-      optionalGroup: undefined,
-      requiredSimple: {aRepeatedStringList: [], aString: undefined},
-      optionalSimple: undefined,
-      id: undefined
-    }, group.toObject());
-    var group1 = new proto.jspb.test.TestGroup1();
-    group1.setGroup(someGroup);
-    assertEquals(someGroup, group1.getGroup());
-  });
-
-  it('testNonExtensionFieldsAfterExtensionRange', function() {
-    var data = [{'1': 'a_string'}];
-    var message = new proto.jspb.test.Complex(data);
-    assertArrayEquals([], message.getARepeatedStringList());
-  });
-
-  it('testReservedGetterNames', function() {
-    var message = new proto.jspb.test.TestReservedNames();
-    message.setExtension$(11);
-    message.setExtension(proto.jspb.test.TestReservedNamesExtension.foo, 12);
-    assertEquals(11, message.getExtension$());
-    assertEquals(12, message.getExtension(
-        proto.jspb.test.TestReservedNamesExtension.foo));
-    assertObjectEquals({extension: 11, foo: 12}, message.toObject());
-  });
-
-  it('testInitializeMessageWithUnsetOneof', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof([]);
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.
-            PARTIAL_ONEOF_NOT_SET,
-        message.getPartialOneofCase());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.
-            RECURSIVE_ONEOF_NOT_SET,
-        message.getRecursiveOneofCase());
-  });
-
-  it('testInitializeMessageWithSingleValueSetInOneof', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof([,, 'x']);
-
-    assertEquals('x', message.getPone());
-    assertEquals('', message.getPthree());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
-        message.getPartialOneofCase());
-  });
-
-  it('testKeepsLastWireValueSetInUnion_multipleValues', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof([,, 'x',, 'y']);
-
-    assertEquals('', message.getPone());
-    assertEquals('y', message.getPthree());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PTHREE,
-        message.getPartialOneofCase());
-  });
-
-  it('testSettingOneofFieldClearsOthers', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals('', message.getPone());
-    assertEquals('', message.getPthree());
-    assertFalse(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPone('hi');
-    assertEquals('hi', message.getPone());
-    assertEquals('', message.getPthree());
-    assertTrue(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPthree('bye');
-    assertEquals('', message.getPone());
-    assertEquals('bye', message.getPthree());
-    assertFalse(message.hasPone());
-    assertTrue(message.hasPthree());
-  });
-
-  it('testSettingOneofFieldDoesNotClearFieldsFromOtherUnions', function() {
-    var other = new proto.jspb.test.TestMessageWithOneof;
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals('', message.getPone());
-    assertEquals('', message.getPthree());
-    assertUndefined(message.getRone());
-    assertFalse(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPone('hi');
-    message.setRone(other);
-    assertEquals('hi', message.getPone());
-    assertEquals('', message.getPthree());
-    assertEquals(other, message.getRone());
-    assertTrue(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPthree('bye');
-    assertEquals('', message.getPone());
-    assertEquals('bye', message.getPthree());
-    assertEquals(other, message.getRone());
-    assertFalse(message.hasPone());
-    assertTrue(message.hasPthree());
-  });
-
-  it('testUnsetsOneofCaseWhenFieldIsCleared', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.
-            PARTIAL_ONEOF_NOT_SET,
-        message.getPartialOneofCase());
-
-    message.setPone('hi');
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
-        message.getPartialOneofCase());
-
-    message.clearPone();
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.
-            PARTIAL_ONEOF_NOT_SET,
-        message.getPartialOneofCase());
-  });
-
-  it('testMessageWithDefaultOneofValues', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(1234, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase
-            .DEFAULT_ONEOF_A_NOT_SET,
-        message.getDefaultOneofACase());
-
-    message.setAone(567);
-    assertEquals(567, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE,
-        message.getDefaultOneofACase());
-
-    message.setAtwo(890);
-    assertEquals(1234, message.getAone());
-    assertEquals(890, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.ATWO,
-        message.getDefaultOneofACase());
-
-    message.clearAtwo();
-    assertEquals(1234, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase
-            .DEFAULT_ONEOF_A_NOT_SET,
-        message.getDefaultOneofACase());
-  });
-
-  it('testMessageWithDefaultOneofValues_defaultNotOnFirstField', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(0, message.getBone());
-    assertEquals(1234, message.getBtwo());
-    assertFalse(message.hasBone());
-    assertFalse(message.hasBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase
-            .DEFAULT_ONEOF_B_NOT_SET,
-        message.getDefaultOneofBCase());
-
-    message.setBone(2);
-    assertEquals(2, message.getBone());
-    assertEquals(1234, message.getBtwo());
-    assertTrue(message.hasBone());
-    assertFalse(message.hasBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BONE,
-        message.getDefaultOneofBCase());
-
-    message.setBtwo(3);
-    assertEquals(0, message.getBone());
-    assertFalse(message.hasBone());
-    assertTrue(message.hasBtwo());
-    assertEquals(3, message.getBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
-        message.getDefaultOneofBCase());
-
-    message.clearBtwo();
-    assertEquals(0, message.getBone());
-    assertFalse(message.hasBone());
-    assertFalse(message.hasBtwo());
-    assertEquals(1234, message.getBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase
-            .DEFAULT_ONEOF_B_NOT_SET,
-        message.getDefaultOneofBCase());
-  });
-
-  it('testInitializeMessageWithOneofDefaults', function() {
-    var message =
-        new proto.jspb.test.TestMessageWithOneof(new Array(9).concat(567));
-    assertEquals(567, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE,
-        message.getDefaultOneofACase());
-
-    message =
-        new proto.jspb.test.TestMessageWithOneof(new Array(10).concat(890));
-    assertEquals(1234, message.getAone());
-    assertEquals(890, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.ATWO,
-        message.getDefaultOneofACase());
-
-    message =
-        new proto.jspb.test.TestMessageWithOneof(new Array(9).concat(567, 890));
-    assertEquals(1234, message.getAone());
-    assertEquals(890, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.ATWO,
-        message.getDefaultOneofACase());
-  });
-
-  it('testInitializeMessageWithOneofDefaults_defaultNotSetOnFirstField',
-      function() {
-        var message;
-
-        message =
-            new proto.jspb.test.TestMessageWithOneof(new Array(11).concat(567));
-        assertEquals(567, message.getBone());
-        assertEquals(1234, message.getBtwo());
-        assertEquals(
-            proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BONE,
-            message.getDefaultOneofBCase());
-
-        message =
-            new proto.jspb.test.TestMessageWithOneof(new Array(12).concat(890));
-        assertEquals(0, message.getBone());
-        assertEquals(890, message.getBtwo());
-        assertEquals(
-            proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
-            message.getDefaultOneofBCase());
-
-        message = new proto.jspb.test.TestMessageWithOneof(
-            new Array(11).concat(567, 890));
-        assertEquals(0, message.getBone());
-        assertEquals(890, message.getBtwo());
-        assertEquals(
-            proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
-            message.getDefaultOneofBCase());
-      });
-
-  it('testOneofContainingAnotherMessage', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.
-            RECURSIVE_ONEOF_NOT_SET,
-        message.getRecursiveOneofCase());
-
-    var other = new proto.jspb.test.TestMessageWithOneof;
-    message.setRone(other);
-    assertEquals(other, message.getRone());
-    assertEquals('', message.getRtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.RONE,
-        message.getRecursiveOneofCase());
-
-    message.setRtwo('hi');
-    assertUndefined(message.getRone());
-    assertEquals('hi', message.getRtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.RTWO,
-        message.getRecursiveOneofCase());
-  });
-
-  it('testQueryingOneofCaseEnsuresOnlyOneFieldIsSetInUnderlyingArray',
-     function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    message.setPone('x');
-    assertEquals('x', message.getPone());
-    assertEquals('', message.getPthree());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
-        message.getPartialOneofCase());
-
-    var array = message.toArray();
-    assertEquals('x', array[2]);
-    assertUndefined(array[4]);
-    array[4] = 'y';
-
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PTHREE,
-        message.getPartialOneofCase());
-    assertUndefined(array[2]);
-    assertEquals('y', array[4]);
-  });
-
-  it('testFloatingPointFieldsSupportNan', function() {
-    var assertNan = function(x) {
-      assertTrue('Expected ' + x + ' (' + goog.typeOf(x) + ') to be NaN.',
-          goog.isNumber(x) && isNaN(x));
-    };
-
-    var message = new proto.jspb.test.FloatingPointFields([
-      'NaN', 'NaN', ['NaN', 'NaN'], 'NaN',
-      'NaN', 'NaN', ['NaN', 'NaN'], 'NaN'
-    ]);
-    assertNan(message.getOptionalFloatField());
-    assertNan(message.getRequiredFloatField());
-    assertNan(message.getRepeatedFloatFieldList()[0]);
-    assertNan(message.getRepeatedFloatFieldList()[1]);
-    assertNan(message.getDefaultFloatField());
-    assertNan(message.getOptionalDoubleField());
-    assertNan(message.getRequiredDoubleField());
-    assertNan(message.getRepeatedDoubleFieldList()[0]);
-    assertNan(message.getRepeatedDoubleFieldList()[1]);
-    assertNan(message.getDefaultDoubleField());
-  });
-
-});
diff --git a/js/compatibility_tests/v3.0.0/proto3_test.js b/js/compatibility_tests/v3.0.0/proto3_test.js
deleted file mode 100644
index fab0fd4..0000000
--- a/js/compatibility_tests/v3.0.0/proto3_test.js
+++ /dev/null
@@ -1,329 +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.
-
-goog.require('goog.crypt.base64');
-goog.require('goog.testing.asserts');
-
-// CommonJS-LoadFromFile: testbinary_pb proto.jspb.test
-goog.require('proto.jspb.test.ForeignMessage');
-
-// CommonJS-LoadFromFile: proto3_test_pb proto.jspb.test
-goog.require('proto.jspb.test.Proto3Enum');
-goog.require('proto.jspb.test.TestProto3');
-
-
-var BYTES = new Uint8Array([1, 2, 8, 9]);
-var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES);
-
-
-/**
- * Helper: compare a bytes field to an expected value
- * @param {Uint8Array|string} arr
- * @param {Uint8Array} expected
- * @return {boolean}
- */
-function bytesCompare(arr, expected) {
-  if (goog.isString(arr)) {
-    arr = goog.crypt.base64.decodeStringToUint8Array(arr);
-  }
-  if (arr.length != expected.length) {
-    return false;
-  }
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] != expected[i]) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-describe('proto3Test', function() {
-  /**
-   * Test defaults for proto3 message fields.
-   */
-  it('testProto3FieldDefaults', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    assertEquals(msg.getOptionalInt32(), 0);
-    assertEquals(msg.getOptionalInt64(), 0);
-    assertEquals(msg.getOptionalUint32(), 0);
-    assertEquals(msg.getOptionalUint64(), 0);
-    assertEquals(msg.getOptionalSint32(), 0);
-    assertEquals(msg.getOptionalSint64(), 0);
-    assertEquals(msg.getOptionalFixed32(), 0);
-    assertEquals(msg.getOptionalFixed64(), 0);
-    assertEquals(msg.getOptionalSfixed32(), 0);
-    assertEquals(msg.getOptionalSfixed64(), 0);
-    assertEquals(msg.getOptionalFloat(), 0);
-    assertEquals(msg.getOptionalDouble(), 0);
-    assertEquals(msg.getOptionalString(), '');
-
-    // TODO(b/26173701): when we change bytes fields default getter to return
-    // Uint8Array, we'll want to switch this assertion to match the u8 case.
-    assertEquals(typeof msg.getOptionalBytes(), 'string');
-    assertEquals(msg.getOptionalBytes_asU8() instanceof Uint8Array, true);
-    assertEquals(typeof msg.getOptionalBytes_asB64(), 'string');
-    assertEquals(msg.getOptionalBytes().length, 0);
-    assertEquals(msg.getOptionalBytes_asU8().length, 0);
-    assertEquals(msg.getOptionalBytes_asB64(), '');
-
-    assertEquals(msg.getOptionalForeignEnum(),
-                 proto.jspb.test.Proto3Enum.PROTO3_FOO);
-    assertEquals(msg.getOptionalForeignMessage(), undefined);
-    assertEquals(msg.getOptionalForeignMessage(), undefined);
-
-    assertEquals(msg.getRepeatedInt32List().length, 0);
-    assertEquals(msg.getRepeatedInt64List().length, 0);
-    assertEquals(msg.getRepeatedUint32List().length, 0);
-    assertEquals(msg.getRepeatedUint64List().length, 0);
-    assertEquals(msg.getRepeatedSint32List().length, 0);
-    assertEquals(msg.getRepeatedSint64List().length, 0);
-    assertEquals(msg.getRepeatedFixed32List().length, 0);
-    assertEquals(msg.getRepeatedFixed64List().length, 0);
-    assertEquals(msg.getRepeatedSfixed32List().length, 0);
-    assertEquals(msg.getRepeatedSfixed64List().length, 0);
-    assertEquals(msg.getRepeatedFloatList().length, 0);
-    assertEquals(msg.getRepeatedDoubleList().length, 0);
-    assertEquals(msg.getRepeatedStringList().length, 0);
-    assertEquals(msg.getRepeatedBytesList().length, 0);
-    assertEquals(msg.getRepeatedForeignEnumList().length, 0);
-    assertEquals(msg.getRepeatedForeignMessageList().length, 0);
-
-  });
-
-
-  /**
-   * Test that all fields can be set and read via a serialization roundtrip.
-   */
-  it('testProto3FieldSetGet', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    msg.setOptionalInt32(-42);
-    msg.setOptionalInt64(-0x7fffffff00000000);
-    msg.setOptionalUint32(0x80000000);
-    msg.setOptionalUint64(0xf000000000000000);
-    msg.setOptionalSint32(-100);
-    msg.setOptionalSint64(-0x8000000000000000);
-    msg.setOptionalFixed32(1234);
-    msg.setOptionalFixed64(0x1234567800000000);
-    msg.setOptionalSfixed32(-1234);
-    msg.setOptionalSfixed64(-0x1234567800000000);
-    msg.setOptionalFloat(1.5);
-    msg.setOptionalDouble(-1.5);
-    msg.setOptionalBool(true);
-    msg.setOptionalString('hello world');
-    msg.setOptionalBytes(BYTES);
-    var submsg = new proto.jspb.test.ForeignMessage();
-    submsg.setC(16);
-    msg.setOptionalForeignMessage(submsg);
-    msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_BAR);
-
-    msg.setRepeatedInt32List([-42]);
-    msg.setRepeatedInt64List([-0x7fffffff00000000]);
-    msg.setRepeatedUint32List([0x80000000]);
-    msg.setRepeatedUint64List([0xf000000000000000]);
-    msg.setRepeatedSint32List([-100]);
-    msg.setRepeatedSint64List([-0x8000000000000000]);
-    msg.setRepeatedFixed32List([1234]);
-    msg.setRepeatedFixed64List([0x1234567800000000]);
-    msg.setRepeatedSfixed32List([-1234]);
-    msg.setRepeatedSfixed64List([-0x1234567800000000]);
-    msg.setRepeatedFloatList([1.5]);
-    msg.setRepeatedDoubleList([-1.5]);
-    msg.setRepeatedBoolList([true]);
-    msg.setRepeatedStringList(['hello world']);
-    msg.setRepeatedBytesList([BYTES]);
-    submsg = new proto.jspb.test.ForeignMessage();
-    submsg.setC(1000);
-    msg.setRepeatedForeignMessageList([submsg]);
-    msg.setRepeatedForeignEnumList([proto.jspb.test.Proto3Enum.PROTO3_BAR]);
-
-    msg.setOneofString('asdf');
-
-    var serialized = msg.serializeBinary();
-    msg = proto.jspb.test.TestProto3.deserializeBinary(serialized);
-
-    assertEquals(msg.getOptionalInt32(), -42);
-    assertEquals(msg.getOptionalInt64(), -0x7fffffff00000000);
-    assertEquals(msg.getOptionalUint32(), 0x80000000);
-    assertEquals(msg.getOptionalUint64(), 0xf000000000000000);
-    assertEquals(msg.getOptionalSint32(), -100);
-    assertEquals(msg.getOptionalSint64(), -0x8000000000000000);
-    assertEquals(msg.getOptionalFixed32(), 1234);
-    assertEquals(msg.getOptionalFixed64(), 0x1234567800000000);
-    assertEquals(msg.getOptionalSfixed32(), -1234);
-    assertEquals(msg.getOptionalSfixed64(), -0x1234567800000000);
-    assertEquals(msg.getOptionalFloat(), 1.5);
-    assertEquals(msg.getOptionalDouble(), -1.5);
-    assertEquals(msg.getOptionalBool(), true);
-    assertEquals(msg.getOptionalString(), 'hello world');
-    assertEquals(true, bytesCompare(msg.getOptionalBytes(), BYTES));
-    assertEquals(msg.getOptionalForeignMessage().getC(), 16);
-    assertEquals(msg.getOptionalForeignEnum(),
-        proto.jspb.test.Proto3Enum.PROTO3_BAR);
-
-    assertElementsEquals(msg.getRepeatedInt32List(), [-42]);
-    assertElementsEquals(msg.getRepeatedInt64List(), [-0x7fffffff00000000]);
-    assertElementsEquals(msg.getRepeatedUint32List(), [0x80000000]);
-    assertElementsEquals(msg.getRepeatedUint64List(), [0xf000000000000000]);
-    assertElementsEquals(msg.getRepeatedSint32List(), [-100]);
-    assertElementsEquals(msg.getRepeatedSint64List(), [-0x8000000000000000]);
-    assertElementsEquals(msg.getRepeatedFixed32List(), [1234]);
-    assertElementsEquals(msg.getRepeatedFixed64List(), [0x1234567800000000]);
-    assertElementsEquals(msg.getRepeatedSfixed32List(), [-1234]);
-    assertElementsEquals(msg.getRepeatedSfixed64List(), [-0x1234567800000000]);
-    assertElementsEquals(msg.getRepeatedFloatList(), [1.5]);
-    assertElementsEquals(msg.getRepeatedDoubleList(), [-1.5]);
-    assertElementsEquals(msg.getRepeatedBoolList(), [true]);
-    assertElementsEquals(msg.getRepeatedStringList(), ['hello world']);
-    assertEquals(msg.getRepeatedBytesList().length, 1);
-    assertEquals(true, bytesCompare(msg.getRepeatedBytesList()[0], BYTES));
-    assertEquals(msg.getRepeatedForeignMessageList().length, 1);
-    assertEquals(msg.getRepeatedForeignMessageList()[0].getC(), 1000);
-    assertElementsEquals(msg.getRepeatedForeignEnumList(),
-        [proto.jspb.test.Proto3Enum.PROTO3_BAR]);
-
-    assertEquals(msg.getOneofString(), 'asdf');
-  });
-
-
-  /**
-   * Test that oneofs continue to have a notion of field presence.
-   */
-  it('testOneofs', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    msg.setOneofUint32(42);
-    assertEquals(msg.getOneofUint32(), 42);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
-    assertTrue(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-
-    var submsg = new proto.jspb.test.ForeignMessage();
-    msg.setOneofForeignMessage(submsg);
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), submsg);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    msg.setOneofString('hello');
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), 'hello');
-    assertEquals(msg.getOneofBytes(), '');
-    assertFalse(msg.hasOneofUint32());
-    assertTrue(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    msg.setOneofBytes(goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes_asB64(),
-        goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertTrue(msg.hasOneofBytes());
-  });
-
-
-  /**
-   * Test that "default"-valued primitive fields are not emitted on the wire.
-   */
-  it('testNoSerializeDefaults', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    // Set each primitive to a non-default value, then back to its default, to
-    // ensure that the serialization is actually checking the value and not just
-    // whether it has ever been set.
-    msg.setOptionalInt32(42);
-    msg.setOptionalInt32(0);
-    msg.setOptionalDouble(3.14);
-    msg.setOptionalDouble(0.0);
-    msg.setOptionalBool(true);
-    msg.setOptionalBool(false);
-    msg.setOptionalString('hello world');
-    msg.setOptionalString('');
-    msg.setOptionalBytes(goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    msg.setOptionalBytes('');
-    msg.setOptionalForeignMessage(new proto.jspb.test.ForeignMessage());
-    msg.setOptionalForeignMessage(null);
-    msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_BAR);
-    msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_FOO);
-    msg.setOneofUint32(32);
-    msg.setOneofUint32(null);
-
-
-    var serialized = msg.serializeBinary();
-    assertEquals(0, serialized.length);
-  });
-
-  /**
-   * Test that base64 string and Uint8Array are interchangeable in bytes fields.
-   */
-  it('testBytesFieldsInterop', function() {
-    var msg = new proto.jspb.test.TestProto3();
-    // Set as a base64 string and check all the getters work.
-    msg.setOptionalBytes(BYTES_B64);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    // Test binary serialize round trip doesn't break it.
-    msg = proto.jspb.test.TestProto3.deserializeBinary(msg.serializeBinary());
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    msg = new proto.jspb.test.TestProto3();
-    // Set as a Uint8Array and check all the getters work.
-    msg.setOptionalBytes(BYTES);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-  });
-});
diff --git a/js/compatibility_tests/v3.0.0/proto3_test.proto b/js/compatibility_tests/v3.0.0/proto3_test.proto
deleted file mode 100644
index acb6716..0000000
--- a/js/compatibility_tests/v3.0.0/proto3_test.proto
+++ /dev/null
@@ -1,89 +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.
-
-syntax = "proto3";
-
-import "testbinary.proto";
-
-package jspb.test;
-
-message TestProto3 {
-     int32 optional_int32    =  1;
-     int64 optional_int64    =  2;
-    uint32 optional_uint32   =  3;
-    uint64 optional_uint64   =  4;
-    sint32 optional_sint32   =  5;
-    sint64 optional_sint64   =  6;
-   fixed32 optional_fixed32  =  7;
-   fixed64 optional_fixed64  =  8;
-  sfixed32 optional_sfixed32 =  9;
-  sfixed64 optional_sfixed64 = 10;
-     float optional_float    = 11;
-    double optional_double   = 12;
-      bool optional_bool     = 13;
-    string optional_string   = 14;
-     bytes optional_bytes    = 15;
-
-  ForeignMessage optional_foreign_message = 19;
-  Proto3Enum     optional_foreign_enum    = 22;
-
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated ForeignMessage repeated_foreign_message = 49;
-  repeated Proto3Enum     repeated_foreign_enum    = 52;
-
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    ForeignMessage oneof_foreign_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-  }
-}
-
-enum Proto3Enum {
-  PROTO3_FOO = 0;
-  PROTO3_BAR = 1;
-  PROTO3_BAZ = 2;
-}
diff --git a/js/compatibility_tests/v3.0.0/test.proto b/js/compatibility_tests/v3.0.0/test.proto
deleted file mode 100644
index 937ffb8..0000000
--- a/js/compatibility_tests/v3.0.0/test.proto
+++ /dev/null
@@ -1,236 +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.
-
-// Author: mwr@google.com (Mark Rawling)
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-import "google/protobuf/descriptor.proto";
-
-package jspb.test;
-
-message Empty {
-}
-
-enum OuterEnum {
-  FOO = 1;
-  BAR = 2;
-}
-
-message EnumContainer {
-  optional OuterEnum outer_enum = 1;
-}
-
-message Simple1 {
-  required string a_string = 1;
-  repeated string a_repeated_string = 2;
-  optional bool a_boolean = 3;
-}
-
-// A message that differs from Simple1 only by name
-message Simple2 {
-  required string a_string = 1;
-  repeated string a_repeated_string = 2;
-}
-
-message SpecialCases {
-  required string normal = 1;
-  // Examples of Js reserved names that are converted to pb_<name>.
-  required string default = 2;
-  required string function = 3;
-  required string var = 4;
-}
-
-message OptionalFields {
-  message Nested {
-    optional int32 an_int = 1;
-  }
-  optional string a_string = 1;
-  required bool a_bool = 2;
-  optional Nested a_nested_message = 3;
-  repeated Nested a_repeated_message = 4;
-  repeated string a_repeated_string = 5;
-}
-
-message HasExtensions {
-  optional string str1 = 1;
-  optional string str2 = 2;
-  optional string str3 = 3;
-  extensions 10 to max;
-}
-
-message Complex {
-  message Nested {
-    required int32 an_int = 2;
-  }
-  required string a_string = 1;
-  required bool an_out_of_order_bool = 9;
-  optional Nested a_nested_message = 4;
-  repeated Nested a_repeated_message = 5;
-  repeated string a_repeated_string = 7;
-}
-
-message OuterMessage {
-  // Make sure this doesn't conflict with the other Complex message.
-  message Complex {
-    optional int32 inner_complex_field = 1;
-  }
-}
-
-message IsExtension {
-  extend HasExtensions {
-    optional IsExtension ext_field = 100;
-  }
-  optional string ext1 = 1;
-
-  // Extensions of proto2 Descriptor messages will be ignored.
-  extend google.protobuf.EnumOptions {
-    optional string simple_option = 42113038;
-  }
-}
-
-message IndirectExtension {
-  extend HasExtensions {
-    optional Simple1 simple = 101;
-    optional string str = 102;
-    repeated string repeated_str = 103;
-    repeated Simple1 repeated_simple = 104;
-  }
-}
-
-extend HasExtensions {
-  optional Simple1 simple1 = 105;
-}
-
-message DefaultValues {
-  enum Enum {
-    E1 = 13;
-    E2 = 77;
-  }
-  optional string string_field = 1 [default="default<>\'\"abc"];
-  optional bool bool_field = 2 [default=true];
-  optional int64 int_field = 3 [default=11];
-  optional Enum enum_field = 4 [default=E1];
-  optional string empty_field = 6 [default=""];
-  optional bytes bytes_field = 8 [default="moo"]; // Base64 encoding is "bW9v"
-}
-
-message FloatingPointFields {
-  optional float optional_float_field = 1;
-  required float required_float_field = 2;
-  repeated float repeated_float_field = 3;
-  optional float default_float_field = 4 [default = 2.0];
-  optional double optional_double_field = 5;
-  required double required_double_field = 6;
-  repeated double repeated_double_field = 7;
-  optional double default_double_field = 8 [default = 2.0];
-}
-
-message TestClone {
-  optional string str = 1;
-  optional Simple1 simple1 = 3;
-  repeated Simple1 simple2 = 5;
-  optional bytes bytes_field = 6;
-  optional string unused = 7;
-  extensions 10 to max;
-}
-
-message CloneExtension {
-  extend TestClone {
-    optional CloneExtension ext_field = 100;
-  }
-  optional string ext = 2;
-}
-
-message TestGroup {
-  repeated group RepeatedGroup = 1 {
-    required string id = 1;
-    repeated bool some_bool = 2;
-  }
-  required group RequiredGroup = 2 {
-    required string id = 1;
-  }
-  optional group OptionalGroup = 3 {
-    required string id = 1;
-  }
-  optional string id = 4;
-  required Simple2 required_simple = 5;
-  optional Simple2 optional_simple = 6;
-}
-
-message TestGroup1 {
-  optional TestGroup.RepeatedGroup group = 1;
-}
-
-message TestReservedNames {
-  optional int32 extension = 1;
-  extensions 10 to max;
-}
-
-message TestReservedNamesExtension {
-  extend TestReservedNames {
-    optional int32 foo = 10;
-  }
-}
-
-message TestMessageWithOneof {
-
-  oneof partial_oneof {
-    string pone = 3;
-    string pthree = 5;
-  }
-
-  oneof recursive_oneof {
-    TestMessageWithOneof rone = 6;
-    string rtwo = 7;
-  }
-
-  optional bool normal_field = 8;
-  repeated string repeated_field = 9;
-
-  oneof default_oneof_a {
-    int32 aone = 10 [default = 1234];
-    int32 atwo = 11;
-  }
-
-  oneof default_oneof_b {
-    int32 bone = 12;
-    int32 btwo = 13 [default = 1234];
-  }
-}
-
-message TestEndsWithBytes {
-  optional int32 value = 1;
-  optional bytes data = 2;
-}
-
diff --git a/js/compatibility_tests/v3.0.0/test.sh b/js/compatibility_tests/v3.0.0/test.sh
deleted file mode 100755
index 9d58f30..0000000
--- a/js/compatibility_tests/v3.0.0/test.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# Download protoc 3.0.0 from Maven if it is not already present.
-OLD_PROTOC_URL=https://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0/protoc-3.0.0-linux-x86_64.exe
-if [ ! -f protoc ]; then
-  wget $OLD_PROTOC_URL -O protoc
-  chmod +x protoc
-fi
-
-pushd ../..
-npm install && npm test
-popd
-
-old_protoc=./protoc
-new_protoc=../../../src/protoc
-
-# The protos in group 2 have some dependencies on protos in group 1. The tests
-# will verify that the generated code for one group can be regenerated
-# independently of the other group in a compatible way.
-#
-# Note: these lists of protos duplicate the lists in gulpfile.js. Ideally we
-# should find a good way of having a single source of truth for this.
-group1_protos="data.proto test3.proto test5.proto commonjs/test6/test6.proto testbinary.proto testempty.proto test.proto"
-group2_protos="proto3_test.proto test2.proto test4.proto commonjs/test7/test7.proto"
-
-# We test the following cases:
-#
-# Case 1: build groups 1 and 2 with the old protoc
-# Case 2: build group 1 with new protoc but group 2 with old protoc
-# Case 3: build group 1 with old protoc but group 2 with new protoc
-#
-# In each case, we use the current runtime.
-
-#
-# CommonJS tests
-#
-mkdir -p commonjs_out{1,2,3}
-# Case 1
-$old_protoc --js_out=import_style=commonjs,binary:commonjs_out1 -I ../../../src -I commonjs -I . $group1_protos
-$old_protoc --js_out=import_style=commonjs,binary:commonjs_out1 -I ../../../src -I commonjs -I . $group2_protos
-# Case 2
-$new_protoc --js_out=import_style=commonjs,binary:commonjs_out2 -I ../../../src -I commonjs -I . $group1_protos
-$old_protoc --js_out=import_style=commonjs,binary:commonjs_out2 -I ../../../src -I commonjs -I . $group2_protos
-# Case 3
-$old_protoc --js_out=import_style=commonjs,binary:commonjs_out3 -I ../../../src -I commonjs -I . $group1_protos
-$new_protoc --js_out=import_style=commonjs,binary:commonjs_out3 -I ../../../src -I commonjs -I . $group2_protos
-
-mkdir -p commonjs_out/binary
-for file in *_test.js binary/*_test.js; do
-  node commonjs/rewrite_tests_for_commonjs.js < "$file" > "commonjs_out/$file"
-done
-cp commonjs/{jasmine.json,import_test.js} commonjs_out/
-mkdir -p commonjs_out/test_node_modules
-../../node_modules/google-closure-library/closure/bin/calcdeps.py -i commonjs/export_asserts.js -p . -p ../../node_modules/google-closure-library/closure -o compiled --compiler_jar ../../node_modules/google-closure-compiler/compiler.jar > commonjs_out/test_node_modules/closure_asserts_commonjs.js
-../../node_modules/google-closure-library/closure/bin/calcdeps.py -i commonjs/export_testdeps.js -p ../.. -p ../../node_modules/google-closure-library/closure -o compiled --compiler_jar ../../node_modules/google-closure-compiler/compiler.jar > commonjs_out/test_node_modules/testdeps_commonjs.js
-cp ../../google-protobuf.js commonjs_out/test_node_modules
-cp -r ../../commonjs_out/node_modules commonjs_out
-
-echo
-echo "Running tests with CommonJS imports"
-echo "-----------------------------------"
-for i in 1 2 3; do
-  cp -r commonjs_out/* "commonjs_out$i"
-  pushd "commonjs_out$i"
-  JASMINE_CONFIG_PATH=jasmine.json NODE_PATH=test_node_modules ../../../node_modules/.bin/jasmine
-  popd
-done
-
-#
-# Closure tests
-#
-$old_protoc --js_out=library=testproto_libs1,binary:.  -I ../../../src -I commonjs -I . $group1_protos
-$old_protoc --js_out=library=testproto_libs2,binary:.  -I ../../../src -I commonjs -I . $group2_protos
-$new_protoc --js_out=library=testproto_libs1_new,binary:.  -I ../../../src -I commonjs -I . $group1_protos
-$new_protoc --js_out=library=testproto_libs2_new,binary:.  -I ../../../src -I commonjs -I . $group2_protos
-
-echo
-echo "Running tests with Closure-style imports"
-echo "----------------------------------------"
-
-# Case 1
-JASMINE_CONFIG_PATH=jasmine1.json ../../node_modules/.bin/jasmine
-# Case 2
-JASMINE_CONFIG_PATH=jasmine2.json ../../node_modules/.bin/jasmine
-# Case 3
-JASMINE_CONFIG_PATH=jasmine3.json ../../node_modules/.bin/jasmine
-
-# Remove these files so that calcdeps.py does not get confused by them the next
-# time this script runs.
-rm testproto_libs[12]*
diff --git a/js/compatibility_tests/v3.0.0/test2.proto b/js/compatibility_tests/v3.0.0/test2.proto
deleted file mode 100644
index 44e55ef..0000000
--- a/js/compatibility_tests/v3.0.0/test2.proto
+++ /dev/null
@@ -1,54 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test;
-
-message TestExtensionsMessage {
-  optional int32 intfield = 1;
-  extensions 100 to max;
-}
-
-message ExtensionMessage {
-  extend TestExtensionsMessage {
-    optional ExtensionMessage ext_field = 100;
-  }
-  optional string ext1 = 1;
-}
-
-// Floating extensions are only supported when generating a _lib.js library.
-extend TestExtensionsMessage {
-  optional ExtensionMessage floating_msg_field = 101;
-  optional string floating_str_field = 102;
-}
diff --git a/js/compatibility_tests/v3.0.0/test3.proto b/js/compatibility_tests/v3.0.0/test3.proto
deleted file mode 100644
index 940a552..0000000
--- a/js/compatibility_tests/v3.0.0/test3.proto
+++ /dev/null
@@ -1,53 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest;
-
-message TestExtensionsMessage {
-  optional int32 intfield = 1;
-  extensions 100 to max;
-}
-
-message ExtensionMessage {
-  extend TestExtensionsMessage {
-    optional ExtensionMessage ext_field = 100;
-  }
-  optional string ext1 = 1;
-}
-
-extend TestExtensionsMessage {
-  optional ExtensionMessage floating_msg_field = 101;
-  optional string floating_str_field = 102;
-}
diff --git a/js/compatibility_tests/v3.0.0/test4.proto b/js/compatibility_tests/v3.0.0/test4.proto
deleted file mode 100644
index cf2451e..0000000
--- a/js/compatibility_tests/v3.0.0/test4.proto
+++ /dev/null
@@ -1,42 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest;
-
-import "test3.proto";
-
-extend TestExtensionsMessage {
-  optional ExtensionMessage floating_msg_field_two = 103;
-}
diff --git a/js/compatibility_tests/v3.0.0/test5.proto b/js/compatibility_tests/v3.0.0/test5.proto
deleted file mode 100644
index 3497951..0000000
--- a/js/compatibility_tests/v3.0.0/test5.proto
+++ /dev/null
@@ -1,44 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest.beta;
-
-message TestBetaExtensionsMessage {
-  extensions 100 to max;
-}
-
-extend TestBetaExtensionsMessage {
-  optional string floating_str_field = 101;
-}
diff --git a/js/compatibility_tests/v3.0.0/testbinary.proto b/js/compatibility_tests/v3.0.0/testbinary.proto
deleted file mode 100644
index 116f17f..0000000
--- a/js/compatibility_tests/v3.0.0/testbinary.proto
+++ /dev/null
@@ -1,212 +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.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-
-package jspb.test;
-
-// These types are borrowed from `unittest.proto` in the protobuf tree. We want
-// to ensure that the binary-format support will handle all field types
-// properly.
-message TestAllTypes {
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional ForeignMessage                       optional_foreign_message = 19;
-  optional ForeignEnum                          optional_foreign_enum    = 22;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-
-  // Packed repeated
-  repeated    int32 packed_repeated_int32    = 61 [packed=true];
-  repeated    int64 packed_repeated_int64    = 62 [packed=true];
-  repeated   uint32 packed_repeated_uint32   = 63 [packed=true];
-  repeated   uint64 packed_repeated_uint64   = 64 [packed=true];
-  repeated   sint32 packed_repeated_sint32   = 65 [packed=true];
-  repeated   sint64 packed_repeated_sint64   = 66 [packed=true];
-  repeated  fixed32 packed_repeated_fixed32  = 67 [packed=true];
-  repeated  fixed64 packed_repeated_fixed64  = 68 [packed=true];
-  repeated sfixed32 packed_repeated_sfixed32 = 69 [packed=true];
-  repeated sfixed64 packed_repeated_sfixed64 = 70 [packed=true];
-  repeated    float packed_repeated_float    = 71 [packed=true];
-  repeated   double packed_repeated_double   = 72 [packed=true];
-  repeated     bool packed_repeated_bool     = 73 [packed=true];
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    ForeignMessage oneof_foreign_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-  }
-
-}
-
-message ForeignMessage {
-  optional int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestExtendable {
-  extensions 1 to max;
-}
-
-message ExtendsWithMessage {
-  extend TestExtendable {
-    optional ExtendsWithMessage optional_extension = 19;
-    repeated ExtendsWithMessage repeated_extension = 49;
-  }
-  optional int32 foo = 1;
-}
-
-extend TestExtendable {
-  optional    int32 extend_optional_int32    =  1;
-  optional    int64 extend_optional_int64    =  2;
-  optional   uint32 extend_optional_uint32   =  3;
-  optional   uint64 extend_optional_uint64   =  4;
-  optional   sint32 extend_optional_sint32   =  5;
-  optional   sint64 extend_optional_sint64   =  6;
-  optional  fixed32 extend_optional_fixed32  =  7;
-  optional  fixed64 extend_optional_fixed64  =  8;
-  optional sfixed32 extend_optional_sfixed32 =  9;
-  optional sfixed64 extend_optional_sfixed64 = 10;
-  optional    float extend_optional_float    = 11;
-  optional   double extend_optional_double   = 12;
-  optional     bool extend_optional_bool     = 13;
-  optional   string extend_optional_string   = 14;
-  optional    bytes extend_optional_bytes    = 15;
-  optional ForeignEnum extend_optional_foreign_enum    = 22;
-
-  repeated    int32 extend_repeated_int32    = 31;
-  repeated    int64 extend_repeated_int64    = 32;
-  repeated   uint32 extend_repeated_uint32   = 33;
-  repeated   uint64 extend_repeated_uint64   = 34;
-  repeated   sint32 extend_repeated_sint32   = 35;
-  repeated   sint64 extend_repeated_sint64   = 36;
-  repeated  fixed32 extend_repeated_fixed32  = 37;
-  repeated  fixed64 extend_repeated_fixed64  = 38;
-  repeated sfixed32 extend_repeated_sfixed32 = 39;
-  repeated sfixed64 extend_repeated_sfixed64 = 40;
-  repeated    float extend_repeated_float    = 41;
-  repeated   double extend_repeated_double   = 42;
-  repeated     bool extend_repeated_bool     = 43;
-  repeated   string extend_repeated_string   = 44;
-  repeated    bytes extend_repeated_bytes    = 45;
-  repeated ForeignEnum extend_repeated_foreign_enum    = 52;
-
-  repeated    int32 extend_packed_repeated_int32    = 61 [packed=true];
-  repeated    int64 extend_packed_repeated_int64    = 62 [packed=true];
-  repeated   uint32 extend_packed_repeated_uint32   = 63 [packed=true];
-  repeated   uint64 extend_packed_repeated_uint64   = 64 [packed=true];
-  repeated   sint32 extend_packed_repeated_sint32   = 65 [packed=true];
-  repeated   sint64 extend_packed_repeated_sint64   = 66 [packed=true];
-  repeated  fixed32 extend_packed_repeated_fixed32  = 67 [packed=true];
-  repeated  fixed64 extend_packed_repeated_fixed64  = 68 [packed=true];
-  repeated sfixed32 extend_packed_repeated_sfixed32 = 69 [packed=true];
-  repeated sfixed64 extend_packed_repeated_sfixed64 = 70 [packed=true];
-  repeated    float extend_packed_repeated_float    = 71 [packed=true];
-  repeated   double extend_packed_repeated_double   = 72 [packed=true];
-  repeated     bool extend_packed_repeated_bool     = 73 [packed=true];
-  repeated ForeignEnum extend_packed_repeated_foreign_enum    = 82
-      [packed=true];
-
-}
-
-message TestMapFields {
-  map<string, string> map_string_string = 1;
-  map<string, int32> map_string_int32 = 2;
-  map<string, int64> map_string_int64 = 3;
-  map<string, bool> map_string_bool = 4;
-  map<string, double> map_string_double = 5;
-  map<string, MapValueEnum> map_string_enum = 6;
-  map<string, MapValueMessage> map_string_msg = 7;
-
-  map<int32, string> map_int32_string = 8;
-  map<int64, string> map_int64_string = 9;
-  map<bool, string> map_bool_string = 10;
-
-  optional TestMapFields test_map_fields = 11;
-  map<string, TestMapFields> map_string_testmapfields = 12;
-}
-
-enum MapValueEnum {
-  MAP_VALUE_FOO = 0;
-  MAP_VALUE_BAR = 1;
-  MAP_VALUE_BAZ = 2;
-}
-
-message MapValueMessage {
-  optional int32 foo = 1;
-}
diff --git a/js/compatibility_tests/v3.0.0/testempty.proto b/js/compatibility_tests/v3.0.0/testempty.proto
deleted file mode 100644
index 960bce4..0000000
--- a/js/compatibility_tests/v3.0.0/testempty.proto
+++ /dev/null
@@ -1,34 +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.
-
-syntax = "proto2";
-
-package javatests.com.google.apps.jspb;
-
diff --git a/js/compatibility_tests/v3.1.0/binary/arith_test.js b/js/compatibility_tests/v3.1.0/binary/arith_test.js
deleted file mode 100644
index 89796bf..0000000
--- a/js/compatibility_tests/v3.1.0/binary/arith_test.js
+++ /dev/null
@@ -1,355 +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.
-
-/**
- * @fileoverview Test cases for Int64-manipulation functions.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author cfallin@google.com (Chris Fallin)
- */
-
-goog.require('goog.testing.asserts');
-goog.require('jspb.arith.Int64');
-goog.require('jspb.arith.UInt64');
-
-
-describe('binaryArithTest', function() {
-  /**
-   * Tests comparison operations.
-   */
-  it('testCompare', function() {
-    var a = new jspb.arith.UInt64(1234, 5678);
-    var b = new jspb.arith.UInt64(1234, 5678);
-    assertEquals(a.cmp(b), 0);
-    assertEquals(b.cmp(a), 0);
-    b.lo -= 1;
-    assertEquals(a.cmp(b), 1);
-    assertEquals(b.cmp(a), -1);
-    b.lo += 2;
-    assertEquals(a.cmp(b), -1);
-    assertEquals(b.cmp(a), 1);
-    b.lo = a.lo;
-    b.hi = a.hi - 1;
-    assertEquals(a.cmp(b), 1);
-    assertEquals(b.cmp(a), -1);
-
-    assertEquals(a.zero(), false);
-    assertEquals(a.msb(), false);
-    assertEquals(a.lsb(), false);
-    a.hi = 0;
-    a.lo = 0;
-    assertEquals(a.zero(), true);
-    a.hi = 0x80000000;
-    assertEquals(a.zero(), false);
-    assertEquals(a.msb(), true);
-    a.lo = 0x00000001;
-    assertEquals(a.lsb(), true);
-  });
-
-
-  /**
-   * Tests shifts.
-   */
-  it('testShifts', function() {
-    var a = new jspb.arith.UInt64(1, 0);
-    assertEquals(a.lo, 1);
-    assertEquals(a.hi, 0);
-    var orig = a;
-    a = a.leftShift();
-    assertEquals(orig.lo, 1);  // original unmodified.
-    assertEquals(orig.hi, 0);
-    assertEquals(a.lo, 2);
-    assertEquals(a.hi, 0);
-    a = a.leftShift();
-    assertEquals(a.lo, 4);
-    assertEquals(a.hi, 0);
-    for (var i = 0; i < 29; i++) {
-      a = a.leftShift();
-    }
-    assertEquals(a.lo, 0x80000000);
-    assertEquals(a.hi, 0);
-    a = a.leftShift();
-    assertEquals(a.lo, 0);
-    assertEquals(a.hi, 1);
-    a = a.leftShift();
-    assertEquals(a.lo, 0);
-    assertEquals(a.hi, 2);
-    a = a.rightShift();
-    a = a.rightShift();
-    assertEquals(a.lo, 0x80000000);
-    assertEquals(a.hi, 0);
-    a = a.rightShift();
-    assertEquals(a.lo, 0x40000000);
-    assertEquals(a.hi, 0);
-  });
-
-
-  /**
-   * Tests additions.
-   */
-  it('testAdd', function() {
-    var a = new jspb.arith.UInt64(/* lo = */ 0x89abcdef,
-                                         /* hi = */ 0x01234567);
-    var b = new jspb.arith.UInt64(/* lo = */ 0xff52ab91,
-                                         /* hi = */ 0x92fa2123);
-    // Addition with carry.
-    var c = a.add(b);
-    assertEquals(a.lo, 0x89abcdef);  // originals unmodified.
-    assertEquals(a.hi, 0x01234567);
-    assertEquals(b.lo, 0xff52ab91);
-    assertEquals(b.hi, 0x92fa2123);
-    assertEquals(c.lo, 0x88fe7980);
-    assertEquals(c.hi, 0x941d668b);
-
-    // Simple addition without carry.
-    a.lo = 2;
-    a.hi = 0;
-    b.lo = 3;
-    b.hi = 0;
-    c = a.add(b);
-    assertEquals(c.lo, 5);
-    assertEquals(c.hi, 0);
-  });
-
-
-  /**
-   * Test subtractions.
-   */
-  it('testSub', function() {
-    var kLength = 10;
-    var hiValues = [0x1682ef32,
-                    0x583902f7,
-                    0xb62f5955,
-                    0x6ea99bbf,
-                    0x25a39c20,
-                    0x0700a08b,
-                    0x00f7304d,
-                    0x91a5b5af,
-                    0x89077fd2,
-                    0xe09e347c];
-    var loValues = [0xe1538b18,
-                    0xbeacd556,
-                    0x74100758,
-                    0x96e3cb26,
-                    0x56c37c3f,
-                    0xe00b3f7d,
-                    0x859f25d7,
-                    0xc2ee614a,
-                    0xe1d21cd7,
-                    0x30aae6a4];
-    for (var i = 0; i < kLength; i++) {
-      for (var j = 0; j < kLength; j++) {
-        var a = new jspb.arith.UInt64(loValues[i], hiValues[j]);
-        var b = new jspb.arith.UInt64(loValues[j], hiValues[i]);
-        var c = a.add(b).sub(b);
-        assertEquals(c.hi, a.hi);
-        assertEquals(c.lo, a.lo);
-      }
-    }
-  });
-
-
-  /**
-   * Tests 32-by-32 multiplication.
-   */
-  it('testMul32x32', function() {
-    var testData = [
-      // a        b          low(a*b)   high(a*b)
-      [0xc0abe2f8, 0x1607898a, 0x5de711b0, 0x109471b8],
-      [0x915eb3cb, 0x4fb66d0e, 0xbd0d441a, 0x2d43d0bc],
-      [0xfe4efe70, 0x80b48c37, 0xbcddea10, 0x7fdada0c],
-      [0xe222fd4a, 0xe43d524a, 0xd5e0eb64, 0xc99d549c],
-      [0xd171f469, 0xb94ebd01, 0x4be17969, 0x979bc4fa],
-      [0x829cc1df, 0xe2598b38, 0xf4157dc8, 0x737c12ad],
-      [0xf10c3767, 0x8382881e, 0x942b3612, 0x7bd428b8],
-      [0xb0f6dd24, 0x232597e1, 0x079c98a4, 0x184bbce7],
-      [0xfcdb05a7, 0x902f55bc, 0x636199a4, 0x8e69f412],
-      [0x0dd0bfa9, 0x916e27b1, 0x6e2542d9, 0x07d92e65]
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = testData[i][0] >>> 0;
-      var b = testData[i][1] >>> 0;
-      var cLow = testData[i][2] >>> 0;
-      var cHigh = testData[i][3] >>> 0;
-      var c = jspb.arith.UInt64.mul32x32(a, b);
-      assertEquals(c.lo, cLow);
-      assertEquals(c.hi, cHigh);
-    }
-  });
-
-
-  /**
-   * Tests 64-by-32 multiplication.
-   */
-  it('testMul', function() {
-    // 64x32 bits produces 96 bits of product. The multiplication function under
-    // test truncates the top 32 bits, so we compare against a 64-bit expected
-    // product.
-    var testData = [
-      // low(a)   high(a)               low(a*b)   high(a*b)
-      [0xec10955b, 0x360eb168, 0x4b7f3f5b, 0xbfcb7c59, 0x9517da5f],
-      [0x42b000fc, 0x9d101642, 0x6fa1ab72, 0x2584c438, 0x6a9e6d2b],
-      [0xf42d4fb4, 0xae366403, 0xa65a1000, 0x92434000, 0x1ff978df],
-      [0x17e2f56b, 0x25487693, 0xf13f98c7, 0x73794e2d, 0xa96b0c6a],
-      [0x492f241f, 0x76c0eb67, 0x7377ac44, 0xd4336c3c, 0xfc4b1ebe],
-      [0xd6b92321, 0xe184fa48, 0xd6e76904, 0x93141584, 0xcbf44da1],
-      [0x4bf007ea, 0x968c0a9e, 0xf5e4026a, 0x4fdb1ae4, 0x61b9fb7d],
-      [0x10a83be7, 0x2d685ba6, 0xc9e5fb7f, 0x2ad43499, 0x3742473d],
-      [0x2f261829, 0x1aca681a, 0x3d3494e3, 0x8213205b, 0x283719f8],
-      [0xe4f2ce21, 0x2e74b7bd, 0xd801b38b, 0xbc17feeb, 0xc6c44e0f]
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
-      var prod = a.mul(testData[i][2]);
-      assertEquals(prod.lo, testData[i][3]);
-      assertEquals(prod.hi, testData[i][4]);
-    }
-  });
-
-
-  /**
-   * Tests 64-div-by-32 division.
-   */
-  it('testDiv', function() {
-    // Compute a/b, yielding quot = a/b and rem = a%b.
-    var testData = [
-      // --- divisors in (0, 2^32-1) to test full divisor range
-      // low(a)   high(a)    b          low(quot)  high(quot) rem
-      [0x712443f1, 0xe85cefcc, 0xc1a7050b, 0x332c79ad, 0x00000001, 0x92ffa882],
-      [0x11912915, 0xb2699eb5, 0x30467cbe, 0xb21b4be4, 0x00000003, 0x283465dd],
-      [0x0d917982, 0x201f2a6e, 0x3f35bf03, 0x8217c8e4, 0x00000000, 0x153402d6],
-      [0xa072c108, 0x74020c96, 0xc60568fd, 0x95f9613e, 0x00000000, 0x3f4676c2],
-      [0xd845d5d8, 0xcdd235c4, 0x20426475, 0x6154e78b, 0x00000006, 0x202fb751],
-      [0xa4dbf71f, 0x9e90465e, 0xf08e022f, 0xa8be947f, 0x00000000, 0xbe43b5ce],
-      [0x3dbe627f, 0xa791f4b9, 0x28a5bd89, 0x1f5dfe93, 0x00000004, 0x02bf9ed4],
-      [0x5c1c53ee, 0xccf5102e, 0x198576e7, 0x07e3ae31, 0x00000008, 0x02ea8fb7],
-      [0xfef1e581, 0x04714067, 0xca6540c1, 0x059e73ec, 0x00000000, 0x31658095],
-      [0x1e2dd90c, 0x13dd6667, 0x8b2184c3, 0x248d1a42, 0x00000000, 0x4ca6d0c6],
-      // --- divisors in (0, 2^16-1) to test larger quotient high-words
-      // low(a)   high(a)    b          low(quot)  high(quot) rem
-      [0x86722b47, 0x2cd57c9a, 0x00003123, 0x2ae41b7a, 0x0000e995, 0x00000f99],
-      [0x1dd7884c, 0xf5e839bc, 0x00009eeb, 0x5c886242, 0x00018c21, 0x000099b6],
-      [0x5c53d625, 0x899fc7e5, 0x000087d7, 0xd625007a, 0x0001035c, 0x000019af],
-      [0x6932d932, 0x9d0a5488, 0x000051fb, 0x9d976143, 0x0001ea63, 0x00004981],
-      [0x4d18bb85, 0x0c92fb31, 0x00001d9f, 0x03265ab4, 0x00006cac, 0x000001b9],
-      [0xbe756768, 0xdea67ccb, 0x00008a03, 0x58add442, 0x00019cff, 0x000056a2],
-      [0xe2466f9a, 0x2521f114, 0x0000c350, 0xa0c0860d, 0x000030ab, 0x0000a48a],
-      [0xf00ddad1, 0xe2f5446a, 0x00002cfc, 0x762697a6, 0x00050b96, 0x00000b69],
-      [0xa879152a, 0x0a70e0a5, 0x00007cdf, 0xb44151b3, 0x00001567, 0x0000363d],
-      [0x7179a74c, 0x46083fff, 0x0000253c, 0x4d39ba6e, 0x0001e17f, 0x00000f84]
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
-      var result = a.div(testData[i][2]);
-      var quotient = result[0];
-      var remainder = result[1];
-      assertEquals(quotient.lo, testData[i][3]);
-      assertEquals(quotient.hi, testData[i][4]);
-      assertEquals(remainder.lo, testData[i][5]);
-    }
-  });
-
-
-  /**
-   * Tests .toString() and .fromString().
-   */
-  it('testStrings', function() {
-    var testData = [
-        [0x5e84c935, 0xcae33d0e, '14619595947299359029'],
-        [0x62b3b8b8, 0x93480544, '10612738313170434232'],
-        [0x319bfb13, 0xc01c4172, '13843011313344445203'],
-        [0x5b8a65fb, 0xa5885b31, '11927883880638080507'],
-        [0x6bdb80f1, 0xb0d1b16b, '12741159895737008369'],
-        [0x4b82b442, 0x2e0d8c97, '3318463081876730946'],
-        [0x780d5208, 0x7d76752c, '9040542135845999112'],
-        [0x2e46800f, 0x0993778d, '690026616168284175'],
-        [0xf00a7e32, 0xcd8e3931, '14811839111111540274'],
-        [0x1baeccd6, 0x923048c4, '10533999535534820566'],
-        [0x03669d29, 0xbff3ab72, '13831587386756603177'],
-        [0x2526073e, 0x01affc81, '121593346566522686'],
-        [0xc24244e0, 0xd7f40d0e, '15561076969511732448'],
-        [0xc56a341e, 0xa68b66a7, '12000798502816461854'],
-        [0x8738d64d, 0xbfe78604, '13828168534871037517'],
-        [0x5baff03b, 0xd7572aea, '15516918227177304123'],
-        [0x4a843d8a, 0x864e132b, '9677693725920476554'],
-        [0x25b4e94d, 0x22b54dc6, '2500990681505655117'],
-        [0x6bbe664b, 0x55a5cc0e, '6171563226690381387'],
-        [0xee916c81, 0xb00aabb3, '12685140089732426881']
-    ];
-
-    for (var i = 0; i < testData.length; i++) {
-      var a = new jspb.arith.UInt64(testData[i][0], testData[i][1]);
-      var roundtrip = jspb.arith.UInt64.fromString(a.toString());
-      assertEquals(roundtrip.lo, a.lo);
-      assertEquals(roundtrip.hi, a.hi);
-      assertEquals(a.toString(), testData[i][2]);
-    }
-  });
-
-
-  /**
-   * Tests signed Int64s. These are built on UInt64s, so we only need to test
-   * the explicit overrides: .toString() and .fromString().
-   */
-  it('testSignedInt64', function() {
-    var testStrings = [
-        '-7847499644178593666',
-        '3771946501229139523',
-        '2872856549054995060',
-        '-5780049594274350904',
-        '3383785956695105201',
-        '2973055184857072610',
-        '-3879428459215627206',
-        '4589812431064156631',
-        '8484075557333689940',
-        '1075325817098092407',
-        '-4346697501012292314',
-        '2488620459718316637',
-        '6112655187423520672',
-        '-3655278273928612104',
-        '3439154019435803196',
-        '1004112478843763757',
-        '-6587790776614368413',
-        '664320065099714586',
-        '4760412909973292912',
-        '-7911903989602274672'
-    ];
-
-    for (var i = 0; i < testStrings.length; i++) {
-      var roundtrip =
-          jspb.arith.Int64.fromString(testStrings[i]).toString();
-      assertEquals(roundtrip, testStrings[i]);
-    }
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/binary/decoder_test.js b/js/compatibility_tests/v3.1.0/binary/decoder_test.js
deleted file mode 100644
index fce2fe1..0000000
--- a/js/compatibility_tests/v3.1.0/binary/decoder_test.js
+++ /dev/null
@@ -1,317 +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.
-
-/**
- * @fileoverview Test cases for jspb's binary protocol buffer decoder.
- *
- * There are two particular magic numbers that need to be pointed out -
- * 2^64-1025 is the largest number representable as both a double and an
- * unsigned 64-bit integer, and 2^63-513 is the largest number representable as
- * both a double and a signed 64-bit integer.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryConstants');
-goog.require('jspb.BinaryDecoder');
-goog.require('jspb.BinaryEncoder');
-
-
-/**
- * Tests encoding and decoding of unsigned types.
- * @param {Function} readValue
- * @param {Function} writeValue
- * @param {number} epsilon
- * @param {number} upperLimit
- * @param {Function} filter
- * @suppress {missingProperties|visibility}
- */
-function doTestUnsignedValue(readValue,
-    writeValue, epsilon, upperLimit, filter) {
-  var encoder = new jspb.BinaryEncoder();
-
-  // Encode zero and limits.
-  writeValue.call(encoder, filter(0));
-  writeValue.call(encoder, filter(epsilon));
-  writeValue.call(encoder, filter(upperLimit));
-
-  // Encode positive values.
-  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-    writeValue.call(encoder, filter(cursor));
-  }
-
-  var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-  // Check zero and limits.
-  assertEquals(filter(0), readValue.call(decoder));
-  assertEquals(filter(epsilon), readValue.call(decoder));
-  assertEquals(filter(upperLimit), readValue.call(decoder));
-
-  // Check positive values.
-  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-    if (filter(cursor) != readValue.call(decoder)) throw 'fail!';
-  }
-
-  // Encoding values outside the valid range should assert.
-  assertThrows(function() {writeValue.call(encoder, -1);});
-  assertThrows(function() {writeValue.call(encoder, upperLimit * 1.1);});
-}
-
-
-/**
- * Tests encoding and decoding of signed types.
- * @param {Function} readValue
- * @param {Function} writeValue
- * @param {number} epsilon
- * @param {number} lowerLimit
- * @param {number} upperLimit
- * @param {Function} filter
- * @suppress {missingProperties}
- */
-function doTestSignedValue(readValue,
-    writeValue, epsilon, lowerLimit, upperLimit, filter) {
-  var encoder = new jspb.BinaryEncoder();
-
-  // Encode zero and limits.
-  writeValue.call(encoder, filter(lowerLimit));
-  writeValue.call(encoder, filter(-epsilon));
-  writeValue.call(encoder, filter(0));
-  writeValue.call(encoder, filter(epsilon));
-  writeValue.call(encoder, filter(upperLimit));
-
-  var inputValues = [];
-
-  // Encode negative values.
-  for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) {
-    var val = filter(cursor);
-    writeValue.call(encoder, val);
-    inputValues.push(val);
-  }
-
-  // Encode positive values.
-  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-    var val = filter(cursor);
-    writeValue.call(encoder, val);
-    inputValues.push(val);
-  }
-
-  var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-  // Check zero and limits.
-  assertEquals(filter(lowerLimit), readValue.call(decoder));
-  assertEquals(filter(-epsilon), readValue.call(decoder));
-  assertEquals(filter(0), readValue.call(decoder));
-  assertEquals(filter(epsilon), readValue.call(decoder));
-  assertEquals(filter(upperLimit), readValue.call(decoder));
-
-  // Verify decoded values.
-  for (var i = 0; i < inputValues.length; i++) {
-    assertEquals(inputValues[i], readValue.call(decoder));
-  }
-
-  // Encoding values outside the valid range should assert.
-  assertThrows(function() {writeValue.call(encoder, lowerLimit * 1.1);});
-  assertThrows(function() {writeValue.call(encoder, upperLimit * 1.1);});
-}
-
-describe('binaryDecoderTest', function() {
-  /**
-   * Tests the decoder instance cache.
-   */
-  it('testInstanceCache', /** @suppress {visibility} */ function() {
-    // Empty the instance caches.
-    jspb.BinaryDecoder.instanceCache_ = [];
-
-    // Allocating and then freeing a decoder should put it in the instance
-    // cache.
-    jspb.BinaryDecoder.alloc().free();
-
-    assertEquals(1, jspb.BinaryDecoder.instanceCache_.length);
-
-    // Allocating and then freeing three decoders should leave us with three in
-    // the cache.
-
-    var decoder1 = jspb.BinaryDecoder.alloc();
-    var decoder2 = jspb.BinaryDecoder.alloc();
-    var decoder3 = jspb.BinaryDecoder.alloc();
-    decoder1.free();
-    decoder2.free();
-    decoder3.free();
-
-    assertEquals(3, jspb.BinaryDecoder.instanceCache_.length);
-  });
-
-
-  /**
-   * Tests reading 64-bit integers as hash strings.
-   */
-  it('testHashStrings', function() {
-    var encoder = new jspb.BinaryEncoder();
-
-    var hashA = String.fromCharCode(0x00, 0x00, 0x00, 0x00,
-                                    0x00, 0x00, 0x00, 0x00);
-    var hashB = String.fromCharCode(0x12, 0x34, 0x00, 0x00,
-                                    0x00, 0x00, 0x00, 0x00);
-    var hashC = String.fromCharCode(0x12, 0x34, 0x56, 0x78,
-                                    0x87, 0x65, 0x43, 0x21);
-    var hashD = String.fromCharCode(0xFF, 0xFF, 0xFF, 0xFF,
-                                    0xFF, 0xFF, 0xFF, 0xFF);
-
-    encoder.writeVarintHash64(hashA);
-    encoder.writeVarintHash64(hashB);
-    encoder.writeVarintHash64(hashC);
-    encoder.writeVarintHash64(hashD);
-
-    encoder.writeFixedHash64(hashA);
-    encoder.writeFixedHash64(hashB);
-    encoder.writeFixedHash64(hashC);
-    encoder.writeFixedHash64(hashD);
-
-    var decoder = jspb.BinaryDecoder.alloc(encoder.end());
-
-    assertEquals(hashA, decoder.readVarintHash64());
-    assertEquals(hashB, decoder.readVarintHash64());
-    assertEquals(hashC, decoder.readVarintHash64());
-    assertEquals(hashD, decoder.readVarintHash64());
-
-    assertEquals(hashA, decoder.readFixedHash64());
-    assertEquals(hashB, decoder.readFixedHash64());
-    assertEquals(hashC, decoder.readFixedHash64());
-    assertEquals(hashD, decoder.readFixedHash64());
-  });
-
-
-  /**
-   * Verifies that misuse of the decoder class triggers assertions.
-   * @suppress {checkTypes|visibility}
-   */
-  it('testDecodeErrors', function() {
-    // Reading a value past the end of the stream should trigger an assertion.
-    var decoder = jspb.BinaryDecoder.alloc([0, 1, 2]);
-    assertThrows(function() {decoder.readUint64()});
-
-    // Overlong varints should trigger assertions.
-    decoder.setBlock([255, 255, 255, 255, 255, 255,
-                      255, 255, 255, 255, 255, 0]);
-    assertThrows(function() {decoder.readUnsignedVarint64()});
-    decoder.reset();
-    assertThrows(function() {decoder.readSignedVarint64()});
-    decoder.reset();
-    assertThrows(function() {decoder.readZigzagVarint64()});
-    decoder.reset();
-    assertThrows(function() {decoder.readUnsignedVarint32()});
-  });
-
-
-  /**
-   * Tests encoding and decoding of unsigned integers.
-   */
-  it('testUnsignedIntegers', function() {
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint8,
-        jspb.BinaryEncoder.prototype.writeUint8,
-        1, 0xFF, Math.round);
-
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint16,
-        jspb.BinaryEncoder.prototype.writeUint16,
-        1, 0xFFFF, Math.round);
-
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint32,
-        jspb.BinaryEncoder.prototype.writeUint32,
-        1, 0xFFFFFFFF, Math.round);
-
-    doTestUnsignedValue(
-        jspb.BinaryDecoder.prototype.readUint64,
-        jspb.BinaryEncoder.prototype.writeUint64,
-        1, Math.pow(2, 64) - 1025, Math.round);
-  });
-
-
-  /**
-   * Tests encoding and decoding of signed integers.
-   */
-  it('testSignedIntegers', function() {
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt8,
-        jspb.BinaryEncoder.prototype.writeInt8,
-        1, -0x80, 0x7F, Math.round);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt16,
-        jspb.BinaryEncoder.prototype.writeInt16,
-        1, -0x8000, 0x7FFF, Math.round);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt32,
-        jspb.BinaryEncoder.prototype.writeInt32,
-        1, -0x80000000, 0x7FFFFFFF, Math.round);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readInt64,
-        jspb.BinaryEncoder.prototype.writeInt64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-  });
-
-
-  /**
-   * Tests encoding and decoding of floats.
-   */
-  it('testFloats', function() {
-    /**
-     * @param {number} x
-     * @return {number}
-     */
-    function truncate(x) {
-      var temp = new Float32Array(1);
-      temp[0] = x;
-      return temp[0];
-    }
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readFloat,
-        jspb.BinaryEncoder.prototype.writeFloat,
-        jspb.BinaryConstants.FLOAT32_EPS,
-        -jspb.BinaryConstants.FLOAT32_MAX,
-        jspb.BinaryConstants.FLOAT32_MAX,
-        truncate);
-
-    doTestSignedValue(
-        jspb.BinaryDecoder.prototype.readDouble,
-        jspb.BinaryEncoder.prototype.writeDouble,
-        jspb.BinaryConstants.FLOAT64_EPS * 10,
-        -jspb.BinaryConstants.FLOAT64_MAX,
-        jspb.BinaryConstants.FLOAT64_MAX,
-        function(x) { return x; });
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/binary/proto_test.js b/js/compatibility_tests/v3.1.0/binary/proto_test.js
deleted file mode 100644
index 26e1d30..0000000
--- a/js/compatibility_tests/v3.1.0/binary/proto_test.js
+++ /dev/null
@@ -1,628 +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.
-
-// Test suite is written using Jasmine -- see http://jasmine.github.io/
-
-goog.require('goog.crypt.base64');
-goog.require('goog.testing.asserts');
-goog.require('jspb.Message');
-
-// CommonJS-LoadFromFile: ../testbinary_pb proto.jspb.test
-goog.require('proto.jspb.test.ExtendsWithMessage');
-goog.require('proto.jspb.test.ForeignEnum');
-goog.require('proto.jspb.test.ForeignMessage');
-goog.require('proto.jspb.test.TestAllTypes');
-goog.require('proto.jspb.test.TestExtendable');
-goog.require('proto.jspb.test.extendOptionalBool');
-goog.require('proto.jspb.test.extendOptionalBytes');
-goog.require('proto.jspb.test.extendOptionalDouble');
-goog.require('proto.jspb.test.extendOptionalFixed32');
-goog.require('proto.jspb.test.extendOptionalFixed64');
-goog.require('proto.jspb.test.extendOptionalFloat');
-goog.require('proto.jspb.test.extendOptionalForeignEnum');
-goog.require('proto.jspb.test.extendOptionalInt32');
-goog.require('proto.jspb.test.extendOptionalInt64');
-goog.require('proto.jspb.test.extendOptionalSfixed32');
-goog.require('proto.jspb.test.extendOptionalSfixed64');
-goog.require('proto.jspb.test.extendOptionalSint32');
-goog.require('proto.jspb.test.extendOptionalSint64');
-goog.require('proto.jspb.test.extendOptionalString');
-goog.require('proto.jspb.test.extendOptionalUint32');
-goog.require('proto.jspb.test.extendOptionalUint64');
-goog.require('proto.jspb.test.extendPackedRepeatedBoolList');
-goog.require('proto.jspb.test.extendPackedRepeatedDoubleList');
-goog.require('proto.jspb.test.extendPackedRepeatedFixed32List');
-goog.require('proto.jspb.test.extendPackedRepeatedFixed64List');
-goog.require('proto.jspb.test.extendPackedRepeatedFloatList');
-goog.require('proto.jspb.test.extendPackedRepeatedForeignEnumList');
-goog.require('proto.jspb.test.extendPackedRepeatedInt32List');
-goog.require('proto.jspb.test.extendPackedRepeatedInt64List');
-goog.require('proto.jspb.test.extendPackedRepeatedSfixed32List');
-goog.require('proto.jspb.test.extendPackedRepeatedSfixed64List');
-goog.require('proto.jspb.test.extendPackedRepeatedSint32List');
-goog.require('proto.jspb.test.extendPackedRepeatedSint64List');
-goog.require('proto.jspb.test.extendPackedRepeatedUint32List');
-goog.require('proto.jspb.test.extendPackedRepeatedUint64List');
-goog.require('proto.jspb.test.extendRepeatedBoolList');
-goog.require('proto.jspb.test.extendRepeatedBytesList');
-goog.require('proto.jspb.test.extendRepeatedDoubleList');
-goog.require('proto.jspb.test.extendRepeatedFixed32List');
-goog.require('proto.jspb.test.extendRepeatedFixed64List');
-goog.require('proto.jspb.test.extendRepeatedFloatList');
-goog.require('proto.jspb.test.extendRepeatedForeignEnumList');
-goog.require('proto.jspb.test.extendRepeatedInt32List');
-goog.require('proto.jspb.test.extendRepeatedInt64List');
-goog.require('proto.jspb.test.extendRepeatedSfixed32List');
-goog.require('proto.jspb.test.extendRepeatedSfixed64List');
-goog.require('proto.jspb.test.extendRepeatedSint32List');
-goog.require('proto.jspb.test.extendRepeatedSint64List');
-goog.require('proto.jspb.test.extendRepeatedStringList');
-goog.require('proto.jspb.test.extendRepeatedUint32List');
-goog.require('proto.jspb.test.extendRepeatedUint64List');
-
-
-var suite = {};
-
-var BYTES = new Uint8Array([1, 2, 8, 9]);
-
-var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES);
-
-
-/**
- * Helper: fill all fields on a TestAllTypes message.
- * @param {proto.jspb.test.TestAllTypes} msg
- */
-function fillAllFields(msg) {
-  msg.setOptionalInt32(-42);
-  // can be exactly represented by JS number (64-bit double, i.e., 52-bit
-  // mantissa).
-  msg.setOptionalInt64(-0x7fffffff00000000);
-  msg.setOptionalUint32(0x80000000);
-  msg.setOptionalUint64(0xf000000000000000);
-  msg.setOptionalSint32(-100);
-  msg.setOptionalSint64(-0x8000000000000000);
-  msg.setOptionalFixed32(1234);
-  msg.setOptionalFixed64(0x1234567800000000);
-  msg.setOptionalSfixed32(-1234);
-  msg.setOptionalSfixed64(-0x1234567800000000);
-  msg.setOptionalFloat(1.5);
-  msg.setOptionalDouble(-1.5);
-  msg.setOptionalBool(true);
-  msg.setOptionalString('hello world');
-  msg.setOptionalBytes(BYTES);
-  msg.setOptionalGroup(new proto.jspb.test.TestAllTypes.OptionalGroup());
-  msg.getOptionalGroup().setA(100);
-  var submsg = new proto.jspb.test.ForeignMessage();
-  submsg.setC(16);
-  msg.setOptionalForeignMessage(submsg);
-  msg.setOptionalForeignEnum(proto.jspb.test.ForeignEnum.FOREIGN_FOO);
-  msg.setOneofString('oneof');
-
-
-  msg.setRepeatedInt32List([-42]);
-  msg.setRepeatedInt64List([-0x7fffffff00000000]);
-  msg.setRepeatedUint32List([0x80000000]);
-  msg.setRepeatedUint64List([0xf000000000000000]);
-  msg.setRepeatedSint32List([-100]);
-  msg.setRepeatedSint64List([-0x8000000000000000]);
-  msg.setRepeatedFixed32List([1234]);
-  msg.setRepeatedFixed64List([0x1234567800000000]);
-  msg.setRepeatedSfixed32List([-1234]);
-  msg.setRepeatedSfixed64List([-0x1234567800000000]);
-  msg.setRepeatedFloatList([1.5]);
-  msg.setRepeatedDoubleList([-1.5]);
-  msg.setRepeatedBoolList([true]);
-  msg.setRepeatedStringList(['hello world']);
-  msg.setRepeatedBytesList([BYTES, BYTES]);
-  msg.setRepeatedGroupList([new proto.jspb.test.TestAllTypes.RepeatedGroup()]);
-  msg.getRepeatedGroupList()[0].setA(100);
-  submsg = new proto.jspb.test.ForeignMessage();
-  submsg.setC(1000);
-  msg.setRepeatedForeignMessageList([submsg]);
-  msg.setRepeatedForeignEnumList([proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-  msg.setPackedRepeatedInt32List([-42]);
-  msg.setPackedRepeatedInt64List([-0x7fffffff00000000]);
-  msg.setPackedRepeatedUint32List([0x80000000]);
-  msg.setPackedRepeatedUint64List([0xf000000000000000]);
-  msg.setPackedRepeatedSint32List([-100]);
-  msg.setPackedRepeatedSint64List([-0x8000000000000000]);
-  msg.setPackedRepeatedFixed32List([1234]);
-  msg.setPackedRepeatedFixed64List([0x1234567800000000]);
-  msg.setPackedRepeatedSfixed32List([-1234]);
-  msg.setPackedRepeatedSfixed64List([-0x1234567800000000]);
-  msg.setPackedRepeatedFloatList([1.5]);
-  msg.setPackedRepeatedDoubleList([-1.5]);
-  msg.setPackedRepeatedBoolList([true]);
-
-}
-
-
-/**
- * Helper: compare a bytes field to an expected value
- * @param {Uint8Array|string} arr
- * @param {Uint8Array} expected
- * @return {boolean}
- */
-function bytesCompare(arr, expected) {
-  if (goog.isString(arr)) {
-    arr = goog.crypt.base64.decodeStringToUint8Array(arr);
-  }
-  if (arr.length != expected.length) {
-    return false;
-  }
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] != expected[i]) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-/**
- * Helper: verify contents of given TestAllTypes message as set by
- * fillAllFields().
- * @param {proto.jspb.test.TestAllTypes} original
- * @param {proto.jspb.test.TestAllTypes} copy
- */
-function checkAllFields(original, copy) {
-  assertTrue(jspb.Message.equals(original, copy));
-
-  assertEquals(copy.getOptionalInt32(), -42);
-  assertEquals(copy.getOptionalInt64(), -0x7fffffff00000000);
-  assertEquals(copy.getOptionalUint32(), 0x80000000);
-  assertEquals(copy.getOptionalUint64(), 0xf000000000000000);
-  assertEquals(copy.getOptionalSint32(), -100);
-  assertEquals(copy.getOptionalSint64(), -0x8000000000000000);
-  assertEquals(copy.getOptionalFixed32(), 1234);
-  assertEquals(copy.getOptionalFixed64(), 0x1234567800000000);
-  assertEquals(copy.getOptionalSfixed32(), -1234);
-  assertEquals(copy.getOptionalSfixed64(), -0x1234567800000000);
-  assertEquals(copy.getOptionalFloat(), 1.5);
-  assertEquals(copy.getOptionalDouble(), -1.5);
-  assertEquals(copy.getOptionalBool(), true);
-  assertEquals(copy.getOptionalString(), 'hello world');
-  assertEquals(true, bytesCompare(copy.getOptionalBytes(), BYTES));
-  assertEquals(true, bytesCompare(copy.getOptionalBytes_asU8(), BYTES));
-  assertEquals(
-      copy.getOptionalBytes_asB64(), goog.crypt.base64.encodeByteArray(BYTES));
-
-  assertEquals(copy.getOptionalGroup().getA(), 100);
-  assertEquals(copy.getOptionalForeignMessage().getC(), 16);
-  assertEquals(copy.getOptionalForeignEnum(),
-      proto.jspb.test.ForeignEnum.FOREIGN_FOO);
-
-
-  assertEquals(copy.getOneofString(), 'oneof');
-  assertEquals(copy.getOneofFieldCase(),
-      proto.jspb.test.TestAllTypes.OneofFieldCase.ONEOF_STRING);
-
-  assertElementsEquals(copy.getRepeatedInt32List(), [-42]);
-  assertElementsEquals(copy.getRepeatedInt64List(), [-0x7fffffff00000000]);
-  assertElementsEquals(copy.getRepeatedUint32List(), [0x80000000]);
-  assertElementsEquals(copy.getRepeatedUint64List(), [0xf000000000000000]);
-  assertElementsEquals(copy.getRepeatedSint32List(), [-100]);
-  assertElementsEquals(copy.getRepeatedSint64List(), [-0x8000000000000000]);
-  assertElementsEquals(copy.getRepeatedFixed32List(), [1234]);
-  assertElementsEquals(copy.getRepeatedFixed64List(), [0x1234567800000000]);
-  assertElementsEquals(copy.getRepeatedSfixed32List(), [-1234]);
-  assertElementsEquals(copy.getRepeatedSfixed64List(), [-0x1234567800000000]);
-  assertElementsEquals(copy.getRepeatedFloatList(), [1.5]);
-  assertElementsEquals(copy.getRepeatedDoubleList(), [-1.5]);
-  assertElementsEquals(copy.getRepeatedBoolList(), [true]);
-  assertElementsEquals(copy.getRepeatedStringList(), ['hello world']);
-  assertEquals(copy.getRepeatedBytesList().length, 2);
-  assertEquals(true, bytesCompare(copy.getRepeatedBytesList_asU8()[0], BYTES));
-  assertEquals(true, bytesCompare(copy.getRepeatedBytesList()[0], BYTES));
-  assertEquals(true, bytesCompare(copy.getRepeatedBytesList_asU8()[1], BYTES));
-  assertEquals(copy.getRepeatedBytesList_asB64()[0], BYTES_B64);
-  assertEquals(copy.getRepeatedBytesList_asB64()[1], BYTES_B64);
-  assertEquals(copy.getRepeatedGroupList().length, 1);
-  assertEquals(copy.getRepeatedGroupList()[0].getA(), 100);
-  assertEquals(copy.getRepeatedForeignMessageList().length, 1);
-  assertEquals(copy.getRepeatedForeignMessageList()[0].getC(), 1000);
-  assertElementsEquals(copy.getRepeatedForeignEnumList(),
-      [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-  assertElementsEquals(copy.getPackedRepeatedInt32List(), [-42]);
-  assertElementsEquals(copy.getPackedRepeatedInt64List(),
-      [-0x7fffffff00000000]);
-  assertElementsEquals(copy.getPackedRepeatedUint32List(), [0x80000000]);
-  assertElementsEquals(copy.getPackedRepeatedUint64List(),
-      [0xf000000000000000]);
-  assertElementsEquals(copy.getPackedRepeatedSint32List(), [-100]);
-  assertElementsEquals(copy.getPackedRepeatedSint64List(),
-      [-0x8000000000000000]);
-  assertElementsEquals(copy.getPackedRepeatedFixed32List(), [1234]);
-  assertElementsEquals(copy.getPackedRepeatedFixed64List(),
-      [0x1234567800000000]);
-  assertElementsEquals(copy.getPackedRepeatedSfixed32List(), [-1234]);
-  assertElementsEquals(copy.getPackedRepeatedSfixed64List(),
-      [-0x1234567800000000]);
-  assertElementsEquals(copy.getPackedRepeatedFloatList(), [1.5]);
-  assertElementsEquals(copy.getPackedRepeatedDoubleList(), [-1.5]);
-
-}
-
-
-/**
- * Helper: verify that all expected extensions are present.
- * @param {!proto.jspb.test.TestExtendable} msg
- */
-function checkExtensions(msg) {
-  assertEquals(-42,
-      msg.getExtension(proto.jspb.test.extendOptionalInt32));
-  assertEquals(-0x7fffffff00000000,
-      msg.getExtension(proto.jspb.test.extendOptionalInt64));
-  assertEquals(0x80000000,
-      msg.getExtension(proto.jspb.test.extendOptionalUint32));
-  assertEquals(0xf000000000000000,
-      msg.getExtension(proto.jspb.test.extendOptionalUint64));
-  assertEquals(-100,
-      msg.getExtension(proto.jspb.test.extendOptionalSint32));
-  assertEquals(-0x8000000000000000,
-      msg.getExtension(proto.jspb.test.extendOptionalSint64));
-  assertEquals(1234,
-      msg.getExtension(proto.jspb.test.extendOptionalFixed32));
-  assertEquals(0x1234567800000000,
-      msg.getExtension(proto.jspb.test.extendOptionalFixed64));
-  assertEquals(-1234,
-      msg.getExtension(proto.jspb.test.extendOptionalSfixed32));
-  assertEquals(-0x1234567800000000,
-      msg.getExtension(proto.jspb.test.extendOptionalSfixed64));
-  assertEquals(1.5,
-      msg.getExtension(proto.jspb.test.extendOptionalFloat));
-  assertEquals(-1.5,
-      msg.getExtension(proto.jspb.test.extendOptionalDouble));
-  assertEquals(true,
-      msg.getExtension(proto.jspb.test.extendOptionalBool));
-  assertEquals('hello world',
-      msg.getExtension(proto.jspb.test.extendOptionalString));
-  assertEquals(
-      true, bytesCompare(
-                msg.getExtension(proto.jspb.test.extendOptionalBytes), BYTES));
-  assertEquals(16,
-      msg.getExtension(
-          proto.jspb.test.ExtendsWithMessage.optionalExtension).getFoo());
-
-
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedInt32List),
-      [-42]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedInt64List),
-      [-0x7fffffff00000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedUint32List),
-      [0x80000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedUint64List),
-      [0xf000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSint32List),
-      [-100]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSint64List),
-      [-0x8000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedFixed32List),
-      [1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedFixed64List),
-      [0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSfixed32List),
-      [-1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedSfixed64List),
-      [-0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedFloatList),
-      [1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedDoubleList),
-      [-1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedBoolList),
-      [true]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedStringList),
-      ['hello world']);
-  assertEquals(
-      true,
-      bytesCompare(
-          msg.getExtension(proto.jspb.test.extendRepeatedBytesList)[0], BYTES));
-  assertEquals(1000,
-      msg.getExtension(
-          proto.jspb.test.ExtendsWithMessage.repeatedExtensionList)[0]
-      .getFoo());
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendRepeatedForeignEnumList),
-      [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedInt32List),
-      [-42]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedInt64List),
-      [-0x7fffffff00000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedUint32List),
-      [0x80000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedUint64List),
-      [0xf000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSint32List),
-      [-100]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSint64List),
-      [-0x8000000000000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedFixed32List),
-      [1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedFixed64List),
-      [0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSfixed32List),
-      [-1234]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedSfixed64List),
-      [-0x1234567800000000]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedFloatList),
-      [1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedDoubleList),
-      [-1.5]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedBoolList),
-      [true]);
-  assertElementsEquals(
-      msg.getExtension(proto.jspb.test.extendPackedRepeatedForeignEnumList),
-      [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-}
-
-
-describe('protoBinaryTest', function() {
-  /**
-   * Tests a basic serialization-deserializaton round-trip with all supported
-   * field types (on the TestAllTypes message type).
-   */
-  it('testRoundTrip', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-    fillAllFields(msg);
-    var encoded = msg.serializeBinary();
-    var decoded = proto.jspb.test.TestAllTypes.deserializeBinary(encoded);
-    checkAllFields(msg, decoded);
-  });
-
-  /**
-   * Test that base64 string and Uint8Array are interchangeable in bytes fields.
-   */
-  it('testBytesFieldsGettersInterop', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-    // Set from a base64 string and check all the getters work.
-    msg.setOptionalBytes(BYTES_B64);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    // Test binary serialize round trip doesn't break it.
-    msg = proto.jspb.test.TestAllTypes.deserializeBinary(msg.serializeBinary());
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    msg = new proto.jspb.test.TestAllTypes();
-    // Set from a Uint8Array and check all the getters work.
-    msg.setOptionalBytes(BYTES);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-  });
-
-  /**
-   * Test that bytes setters will receive result of any of the getters.
-   */
-  it('testBytesFieldsSettersInterop', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-    msg.setOptionalBytes(BYTES);
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    msg.setOptionalBytes(msg.getOptionalBytes());
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-    msg.setOptionalBytes(msg.getOptionalBytes_asB64());
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-    msg.setOptionalBytes(msg.getOptionalBytes_asU8());
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-  });
-
-  /**
-   * Test that bytes setters will receive result of any of the getters.
-   */
-  it('testRepeatedBytesGetters', function() {
-    var msg = new proto.jspb.test.TestAllTypes();
-
-    function assertGetters() {
-      assertTrue(goog.isString(msg.getRepeatedBytesList_asB64()[0]));
-      assertTrue(goog.isString(msg.getRepeatedBytesList_asB64()[1]));
-      assertTrue(msg.getRepeatedBytesList_asU8()[0] instanceof Uint8Array);
-      assertTrue(msg.getRepeatedBytesList_asU8()[1] instanceof Uint8Array);
-
-      assertTrue(bytesCompare(msg.getRepeatedBytesList()[0], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList()[1], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asB64()[0], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asB64()[1], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asU8()[0], BYTES));
-      assertTrue(bytesCompare(msg.getRepeatedBytesList_asU8()[1], BYTES));
-    }
-
-    msg.setRepeatedBytesList([BYTES, BYTES]);
-    assertGetters();
-
-    msg.setRepeatedBytesList([BYTES_B64, BYTES_B64]);
-    assertGetters();
-
-    msg.setRepeatedBytesList([]);
-    assertEquals(0, msg.getRepeatedBytesList().length);
-    assertEquals(0, msg.getRepeatedBytesList_asB64().length);
-    assertEquals(0, msg.getRepeatedBytesList_asU8().length);
-  });
-
-  /**
-   * Helper: fill all extension values.
-   * @param {proto.jspb.test.TestExtendable} msg
-   */
-  function fillExtensions(msg) {
-    msg.setExtension(
-        proto.jspb.test.extendOptionalInt32, -42);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalInt64, -0x7fffffff00000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalUint32, 0x80000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalUint64, 0xf000000000000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSint32, -100);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSint64, -0x8000000000000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalFixed32, 1234);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalFixed64, 0x1234567800000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSfixed32, -1234);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalSfixed64, -0x1234567800000000);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalFloat, 1.5);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalDouble, -1.5);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalBool, true);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalString, 'hello world');
-    msg.setExtension(proto.jspb.test.extendOptionalBytes, BYTES);
-    var submsg = new proto.jspb.test.ExtendsWithMessage();
-    submsg.setFoo(16);
-    msg.setExtension(
-        proto.jspb.test.ExtendsWithMessage.optionalExtension, submsg);
-    msg.setExtension(
-        proto.jspb.test.extendOptionalForeignEnum,
-        proto.jspb.test.ForeignEnum.FOREIGN_FOO);
-
-
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedInt32List, [-42]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedInt64List, [-0x7fffffff00000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedUint32List, [0x80000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedUint64List, [0xf000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSint32List, [-100]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSint64List, [-0x8000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedFixed32List, [1234]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedFixed64List, [0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSfixed32List, [-1234]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedSfixed64List, [-0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedFloatList, [1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedDoubleList, [-1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedBoolList, [true]);
-    msg.setExtension(
-        proto.jspb.test.extendRepeatedStringList, ['hello world']);
-    msg.setExtension(proto.jspb.test.extendRepeatedBytesList, [BYTES]);
-    submsg = new proto.jspb.test.ExtendsWithMessage();
-    submsg.setFoo(1000);
-    msg.setExtension(
-        proto.jspb.test.ExtendsWithMessage.repeatedExtensionList, [submsg]);
-    msg.setExtension(proto.jspb.test.extendRepeatedForeignEnumList,
-        [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedInt32List, [-42]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedInt64List, [-0x7fffffff00000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedUint32List, [0x80000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedUint64List, [0xf000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSint32List, [-100]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSint64List, [-0x8000000000000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedFixed32List, [1234]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedFixed64List, [0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSfixed32List, [-1234]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedSfixed64List,
-        [-0x1234567800000000]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedFloatList, [1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedDoubleList, [-1.5]);
-    msg.setExtension(
-        proto.jspb.test.extendPackedRepeatedBoolList, [true]);
-    msg.setExtension(proto.jspb.test.extendPackedRepeatedForeignEnumList,
-        [proto.jspb.test.ForeignEnum.FOREIGN_FOO]);
-
-  }
-
-
-  /**
-   * Tests extension serialization and deserialization.
-   */
-  it('testExtensions', function() {
-    var msg = new proto.jspb.test.TestExtendable();
-    fillExtensions(msg);
-    var encoded = msg.serializeBinary();
-    var decoded = proto.jspb.test.TestExtendable.deserializeBinary(encoded);
-    checkExtensions(decoded);
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/binary/reader_test.js b/js/compatibility_tests/v3.1.0/binary/reader_test.js
deleted file mode 100644
index 9571138..0000000
--- a/js/compatibility_tests/v3.1.0/binary/reader_test.js
+++ /dev/null
@@ -1,922 +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.
-
-/**
- * @fileoverview Test cases for jspb's binary protocol buffer reader.
- *
- * There are two particular magic numbers that need to be pointed out -
- * 2^64-1025 is the largest number representable as both a double and an
- * unsigned 64-bit integer, and 2^63-513 is the largest number representable as
- * both a double and a signed 64-bit integer.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryConstants');
-goog.require('jspb.BinaryDecoder');
-goog.require('jspb.BinaryReader');
-goog.require('jspb.BinaryWriter');
-
-
-
-describe('binaryReaderTest', function() {
-  /**
-   * Tests the reader instance cache.
-   */
-  it('testInstanceCaches', /** @suppress {visibility} */ function() {
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-    writer.writeMessage(1, dummyMessage, goog.nullFunction);
-    writer.writeMessage(2, dummyMessage, goog.nullFunction);
-
-    var buffer = writer.getResultBuffer();
-
-    // Empty the instance caches.
-    jspb.BinaryReader.instanceCache_ = [];
-
-    // Allocating and then freeing three decoders should leave us with three in
-    // the cache.
-
-    var decoder1 = jspb.BinaryDecoder.alloc();
-    var decoder2 = jspb.BinaryDecoder.alloc();
-    var decoder3 = jspb.BinaryDecoder.alloc();
-    decoder1.free();
-    decoder2.free();
-    decoder3.free();
-
-    assertEquals(3, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-
-    // Allocating and then freeing a reader should remove one decoder from its
-    // cache, but it should stay stuck to the reader afterwards since we can't
-    // have a reader without a decoder.
-    jspb.BinaryReader.alloc().free();
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(1, jspb.BinaryReader.instanceCache_.length);
-
-    // Allocating a reader should remove a reader from the cache.
-    var reader = jspb.BinaryReader.alloc(buffer);
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-
-    // Processing the message reuses the current reader.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-    });
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-    });
-
-    assertEquals(false, reader.nextField());
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(0, jspb.BinaryReader.instanceCache_.length);
-
-    // Freeing the reader should put it back into the cache.
-    reader.free();
-
-    assertEquals(2, jspb.BinaryDecoder.instanceCache_.length);
-    assertEquals(1, jspb.BinaryReader.instanceCache_.length);
-  });
-
-
-  /**
-   * @param {number} x
-   * @return {number}
-   */
-  function truncate(x) {
-    var temp = new Float32Array(1);
-    temp[0] = x;
-    return temp[0];
-  }
-
-
-  /**
-   * Verifies that misuse of the reader class triggers assertions.
-   */
-  it('testReadErrors', /** @suppress {checkTypes|visibility} */ function() {
-    // Calling readMessage on a non-delimited field should trigger an
-    // assertion.
-    var reader = jspb.BinaryReader.alloc([8, 1]);
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-    reader.nextField();
-    assertThrows(function() {
-      reader.readMessage(dummyMessage, goog.nullFunction);
-    });
-
-    // Reading past the end of the stream should trigger an assertion.
-    reader = jspb.BinaryReader.alloc([9, 1]);
-    reader.nextField();
-    assertThrows(function() {reader.readFixed64()});
-
-    // Reading past the end of a submessage should trigger an assertion.
-    reader = jspb.BinaryReader.alloc([10, 4, 13, 1, 1, 1]);
-    reader.nextField();
-    reader.readMessage(dummyMessage, function() {
-      reader.nextField();
-      assertThrows(function() {reader.readFixed32()});
-    });
-
-    // Skipping an invalid field should trigger an assertion.
-    reader = jspb.BinaryReader.alloc([12, 1]);
-    reader.nextWireType_ = 1000;
-    assertThrows(function() {reader.skipField()});
-
-    // Reading fields with the wrong wire type should assert.
-    reader = jspb.BinaryReader.alloc([9, 0, 0, 0, 0, 0, 0, 0, 0]);
-    reader.nextField();
-    assertThrows(function() {reader.readInt32()});
-    assertThrows(function() {reader.readInt32String()});
-    assertThrows(function() {reader.readInt64()});
-    assertThrows(function() {reader.readInt64String()});
-    assertThrows(function() {reader.readUint32()});
-    assertThrows(function() {reader.readUint32String()});
-    assertThrows(function() {reader.readUint64()});
-    assertThrows(function() {reader.readUint64String()});
-    assertThrows(function() {reader.readSint32()});
-    assertThrows(function() {reader.readBool()});
-    assertThrows(function() {reader.readEnum()});
-
-    reader = jspb.BinaryReader.alloc([8, 1]);
-    reader.nextField();
-    assertThrows(function() {reader.readFixed32()});
-    assertThrows(function() {reader.readFixed64()});
-    assertThrows(function() {reader.readSfixed32()});
-    assertThrows(function() {reader.readSfixed64()});
-    assertThrows(function() {reader.readFloat()});
-    assertThrows(function() {reader.readDouble()});
-
-    assertThrows(function() {reader.readString()});
-    assertThrows(function() {reader.readBytes()});
-  });
-
-
-  /**
-   * Tests encoding and decoding of unsigned field types.
-   * @param {Function} readField
-   * @param {Function} writeField
-   * @param {number} epsilon
-   * @param {number} upperLimit
-   * @param {Function} filter
-   * @private
-   * @suppress {missingProperties}
-   */
-  var doTestUnsignedField_ = function(readField,
-      writeField, epsilon, upperLimit, filter) {
-    assertNotNull(readField);
-    assertNotNull(writeField);
-
-    var writer = new jspb.BinaryWriter();
-
-    // Encode zero and limits.
-    writeField.call(writer, 1, filter(0));
-    writeField.call(writer, 2, filter(epsilon));
-    writeField.call(writer, 3, filter(upperLimit));
-
-    // Encode positive values.
-    for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-      writeField.call(writer, 4, filter(cursor));
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    // Check zero and limits.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(filter(0), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(filter(epsilon), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(3, reader.getFieldNumber());
-    assertEquals(filter(upperLimit), readField.call(reader));
-
-    // Check positive values.
-    for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-      reader.nextField();
-      if (4 != reader.getFieldNumber()) throw 'fail!';
-      if (filter(cursor) != readField.call(reader)) throw 'fail!';
-    }
-  };
-
-
-  /**
-   * Tests encoding and decoding of signed field types.
-   * @param {Function} readField
-   * @param {Function} writeField
-   * @param {number} epsilon
-   * @param {number} lowerLimit
-   * @param {number} upperLimit
-   * @param {Function} filter
-   * @private
-   * @suppress {missingProperties}
-   */
-  var doTestSignedField_ = function(readField,
-      writeField, epsilon, lowerLimit, upperLimit, filter) {
-    var writer = new jspb.BinaryWriter();
-
-    // Encode zero and limits.
-    writeField.call(writer, 1, filter(lowerLimit));
-    writeField.call(writer, 2, filter(-epsilon));
-    writeField.call(writer, 3, filter(0));
-    writeField.call(writer, 4, filter(epsilon));
-    writeField.call(writer, 5, filter(upperLimit));
-
-    var inputValues = [];
-
-    // Encode negative values.
-    for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) {
-      var val = filter(cursor);
-      writeField.call(writer, 6, val);
-      inputValues.push({
-        fieldNumber: 6,
-        value: val
-      });
-    }
-
-    // Encode positive values.
-    for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
-      var val = filter(cursor);
-      writeField.call(writer, 7, val);
-      inputValues.push({
-        fieldNumber: 7,
-        value: val
-      });
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    // Check zero and limits.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(filter(lowerLimit), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(filter(-epsilon), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(3, reader.getFieldNumber());
-    assertEquals(filter(0), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(4, reader.getFieldNumber());
-    assertEquals(filter(epsilon), readField.call(reader));
-
-    reader.nextField();
-    assertEquals(5, reader.getFieldNumber());
-    assertEquals(filter(upperLimit), readField.call(reader));
-
-    for (var i = 0; i < inputValues.length; i++) {
-      var expected = inputValues[i];
-      reader.nextField();
-      assertEquals(expected.fieldNumber, reader.getFieldNumber());
-      assertEquals(expected.value, readField.call(reader));
-    }
-  };
-
-
-  /**
-   * Tests fields that use varint encoding.
-   */
-  it('testVarintFields', function() {
-    assertNotUndefined(jspb.BinaryReader.prototype.readUint32);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeUint32);
-    assertNotUndefined(jspb.BinaryReader.prototype.readUint64);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeUint64);
-    assertNotUndefined(jspb.BinaryReader.prototype.readBool);
-    assertNotUndefined(jspb.BinaryWriter.prototype.writeBool);
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readUint32,
-        jspb.BinaryWriter.prototype.writeUint32,
-        1, Math.pow(2, 32) - 1, Math.round);
-
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readUint64,
-        jspb.BinaryWriter.prototype.writeUint64,
-        1, Math.pow(2, 64) - 1025, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readInt32,
-        jspb.BinaryWriter.prototype.writeInt32,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readInt64,
-        jspb.BinaryWriter.prototype.writeInt64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readEnum,
-        jspb.BinaryWriter.prototype.writeEnum,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readBool,
-        jspb.BinaryWriter.prototype.writeBool,
-        1, 1, function(x) { return !!x; });
-  });
-
-
-  /**
-   * Tests reading a field from hexadecimal string (format: '08 BE EF').
-   * @param {Function} readField
-   * @param {number} expected
-   * @param {string} hexString
-   */
-  function doTestHexStringVarint_(readField, expected, hexString) {
-    var bytesCount = (hexString.length + 1) / 3;
-    var bytes = new Uint8Array(bytesCount);
-    for (var i = 0; i < bytesCount; i++) {
-      bytes[i] = parseInt(hexString.substring(i * 3, i * 3 + 2), 16);
-    }
-    var reader = jspb.BinaryReader.alloc(bytes);
-    reader.nextField();
-    assertEquals(expected, readField.call(reader));
-  }
-
-
-  /**
-   * Tests non-canonical redundant varint decoding.
-   */
-  it('testRedundantVarintFields', function() {
-    assertNotNull(jspb.BinaryReader.prototype.readUint32);
-    assertNotNull(jspb.BinaryReader.prototype.readUint64);
-    assertNotNull(jspb.BinaryReader.prototype.readSint32);
-    assertNotNull(jspb.BinaryReader.prototype.readSint64);
-
-    // uint32 and sint32 take no more than 5 bytes
-    // 08 - field prefix (type = 0 means varint)
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readUint32,
-      12, '08 8C 80 80 80 00');
-
-    // 11 stands for -6 in zigzag encoding
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readSint32,
-      -6, '08 8B 80 80 80 00');
-
-    // uint64 and sint64 take no more than 10 bytes
-    // 08 - field prefix (type = 0 means varint)
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readUint64,
-      12, '08 8C 80 80 80 80 80 80 80 80 00');
-
-    // 11 stands for -6 in zigzag encoding
-    doTestHexStringVarint_(
-      jspb.BinaryReader.prototype.readSint64,
-      -6, '08 8B 80 80 80 80 80 80 80 80 00');
-  });
-
-
-  /**
-   * Tests 64-bit fields that are handled as strings.
-   */
-  it('testStringInt64Fields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var testSignedData = [
-      '2730538252207801776',
-      '-2688470994844604560',
-      '3398529779486536359',
-      '3568577411627971000',
-      '272477188847484900',
-      '-6649058714086158188',
-      '-7695254765712060806',
-      '-4525541438037104029',
-      '-4993706538836508568',
-      '4990160321893729138'
-    ];
-    var testUnsignedData = [
-      '7822732630241694882',
-      '6753602971916687352',
-      '2399935075244442116',
-      '8724292567325338867',
-      '16948784802625696584',
-      '4136275908516066934',
-      '3575388346793700364',
-      '5167142028379259461',
-      '1557573948689737699',
-      '17100725280812548567'
-    ];
-
-    for (var i = 0; i < testSignedData.length; i++) {
-      writer.writeInt64String(2 * i + 1, testSignedData[i]);
-      writer.writeUint64String(2 * i + 2, testUnsignedData[i]);
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    for (var i = 0; i < testSignedData.length; i++) {
-      reader.nextField();
-      assertEquals(2 * i + 1, reader.getFieldNumber());
-      assertEquals(testSignedData[i], reader.readInt64String());
-      reader.nextField();
-      assertEquals(2 * i + 2, reader.getFieldNumber());
-      assertEquals(testUnsignedData[i], reader.readUint64String());
-    }
-  });
-
-
-  /**
-   * Tests fields that use zigzag encoding.
-   */
-  it('testZigzagFields', function() {
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSint32,
-        jspb.BinaryWriter.prototype.writeSint32,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSint64,
-        jspb.BinaryWriter.prototype.writeSint64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-  });
-
-
-  /**
-   * Tests fields that use fixed-length encoding.
-   */
-  it('testFixedFields', function() {
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readFixed32,
-        jspb.BinaryWriter.prototype.writeFixed32,
-        1, Math.pow(2, 32) - 1, Math.round);
-
-    doTestUnsignedField_(
-        jspb.BinaryReader.prototype.readFixed64,
-        jspb.BinaryWriter.prototype.writeFixed64,
-        1, Math.pow(2, 64) - 1025, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSfixed32,
-        jspb.BinaryWriter.prototype.writeSfixed32,
-        1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readSfixed64,
-        jspb.BinaryWriter.prototype.writeSfixed64,
-        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
-  });
-
-
-  /**
-   * Tests floating point fields.
-   */
-  it('testFloatFields', function() {
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readFloat,
-        jspb.BinaryWriter.prototype.writeFloat,
-        jspb.BinaryConstants.FLOAT32_MIN,
-        -jspb.BinaryConstants.FLOAT32_MAX,
-        jspb.BinaryConstants.FLOAT32_MAX,
-        truncate);
-
-    doTestSignedField_(
-        jspb.BinaryReader.prototype.readDouble,
-        jspb.BinaryWriter.prototype.writeDouble,
-        jspb.BinaryConstants.FLOAT64_EPS * 10,
-        -jspb.BinaryConstants.FLOAT64_MIN,
-        jspb.BinaryConstants.FLOAT64_MIN,
-        function(x) { return x; });
-  });
-
-
-  /**
-   * Tests length-delimited string fields.
-   */
-  it('testStringFields', function() {
-    var s1 = 'The quick brown fox jumps over the lazy dog.';
-    var s2 = '人人生而自由,在尊嚴和權利上一律平等。';
-
-    var writer = new jspb.BinaryWriter();
-
-    writer.writeString(1, s1);
-    writer.writeString(2, s2);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(s1, reader.readString());
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(s2, reader.readString());
-  });
-
-
-  /**
-   * Tests length-delimited byte fields.
-   */
-  it('testByteFields', function() {
-    var message = [];
-    var lowerLimit = 1;
-    var upperLimit = 256;
-    var scale = 1.1;
-
-    var writer = new jspb.BinaryWriter();
-
-    for (var cursor = lowerLimit; cursor < upperLimit; cursor *= 1.1) {
-      var len = Math.round(cursor);
-      var bytes = [];
-      for (var i = 0; i < len; i++) bytes.push(i % 256);
-
-      writer.writeBytes(len, bytes);
-    }
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    for (var cursor = lowerLimit; reader.nextField(); cursor *= 1.1) {
-      var len = Math.round(cursor);
-      if (len != reader.getFieldNumber()) throw 'fail!';
-
-      var bytes = reader.readBytes();
-      if (len != bytes.length) throw 'fail!';
-      for (var i = 0; i < bytes.length; i++) {
-        if (i % 256 != bytes[i]) throw 'fail!';
-      }
-    }
-  });
-
-
-  /**
-   * Tests nested messages.
-   */
-  it('testNesting', function() {
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    writer.writeInt32(1, 100);
-
-    // Add one message with 3 int fields.
-    writer.writeMessage(2, dummyMessage, function() {
-      writer.writeInt32(3, 300);
-      writer.writeInt32(4, 400);
-      writer.writeInt32(5, 500);
-    });
-
-    // Add one empty message.
-    writer.writeMessage(6, dummyMessage, goog.nullFunction);
-
-    writer.writeInt32(7, 700);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    // Validate outermost message.
-
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(100, reader.readInt32());
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      // Validate embedded message 1.
-      reader.nextField();
-      assertEquals(3, reader.getFieldNumber());
-      assertEquals(300, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(4, reader.getFieldNumber());
-      assertEquals(400, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(5, reader.getFieldNumber());
-      assertEquals(500, reader.readInt32());
-
-      assertEquals(false, reader.nextField());
-    });
-
-    reader.nextField();
-    assertEquals(6, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      // Validate embedded message 2.
-
-      assertEquals(false, reader.nextField());
-    });
-
-    reader.nextField();
-    assertEquals(7, reader.getFieldNumber());
-    assertEquals(700, reader.readInt32());
-
-    assertEquals(false, reader.nextField());
-  });
-
-  /**
-   * Tests skipping fields of each type by interleaving them with sentinel
-   * values and skipping everything that's not a sentinel.
-   */
-  it('testSkipField', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var sentinel = 123456789;
-
-    // Write varint fields of different sizes.
-    writer.writeInt32(1, sentinel);
-    writer.writeInt32(1, 1);
-    writer.writeInt32(1, 1000);
-    writer.writeInt32(1, 1000000);
-    writer.writeInt32(1, 1000000000);
-
-    // Write fixed 64-bit encoded fields.
-    writer.writeInt32(2, sentinel);
-    writer.writeDouble(2, 1);
-    writer.writeFixed64(2, 1);
-    writer.writeSfixed64(2, 1);
-
-    // Write fixed 32-bit encoded fields.
-    writer.writeInt32(3, sentinel);
-    writer.writeFloat(3, 1);
-    writer.writeFixed32(3, 1);
-    writer.writeSfixed32(3, 1);
-
-    // Write delimited fields.
-    writer.writeInt32(4, sentinel);
-    writer.writeBytes(4, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-    writer.writeString(4, 'The quick brown fox jumps over the lazy dog');
-
-    // Write a group with a nested group inside.
-    writer.writeInt32(5, sentinel);
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-    writer.writeGroup(5, dummyMessage, function() {
-      writer.writeInt64(42, 42);
-      writer.writeGroup(6, dummyMessage, function() {
-        writer.writeInt64(84, 42);
-      });
-    });
-
-    // Write final sentinel.
-    writer.writeInt32(6, sentinel);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    function skip(field, count) {
-      for (var i = 0; i < count; i++) {
-        reader.nextField();
-        if (field != reader.getFieldNumber()) throw 'fail!';
-        reader.skipField();
-      }
-    }
-
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(1, 4);
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(2, 3);
-
-    reader.nextField();
-    assertEquals(3, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(3, 3);
-
-    reader.nextField();
-    assertEquals(4, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(4, 2);
-
-    reader.nextField();
-    assertEquals(5, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-    skip(5, 1);
-
-    reader.nextField();
-    assertEquals(6, reader.getFieldNumber());
-    assertEquals(sentinel, reader.readInt32());
-  });
-
-
-  /**
-   * Tests packed fields.
-   */
-  it('testPackedFields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var sentinel = 123456789;
-
-    var unsignedData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
-    var signedData = [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10];
-    var floatData = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10];
-    var doubleData = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10];
-    var boolData = [true, false, true, true, false, false, true, false];
-
-    for (var i = 0; i < floatData.length; i++) {
-      floatData[i] = truncate(floatData[i]);
-    }
-
-    writer.writeInt32(1, sentinel);
-
-    writer.writePackedInt32(2, signedData);
-    writer.writePackedInt64(2, signedData);
-    writer.writePackedUint32(2, unsignedData);
-    writer.writePackedUint64(2, unsignedData);
-    writer.writePackedSint32(2, signedData);
-    writer.writePackedSint64(2, signedData);
-    writer.writePackedFixed32(2, unsignedData);
-    writer.writePackedFixed64(2, unsignedData);
-    writer.writePackedSfixed32(2, signedData);
-    writer.writePackedSfixed64(2, signedData);
-    writer.writePackedFloat(2, floatData);
-    writer.writePackedDouble(2, doubleData);
-    writer.writePackedBool(2, boolData);
-    writer.writePackedEnum(2, unsignedData);
-
-    writer.writeInt32(3, sentinel);
-
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    reader.nextField();
-    assertEquals(sentinel, reader.readInt32());
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedInt32(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedInt64(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedUint32(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedUint64(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSint32(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSint64(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedFixed32(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedFixed64(), unsignedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSfixed32(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedSfixed64(), signedData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedFloat(), floatData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedDouble(), doubleData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedBool(), boolData);
-
-    reader.nextField();
-    assertElementsEquals(reader.readPackedEnum(), unsignedData);
-
-    reader.nextField();
-    assertEquals(sentinel, reader.readInt32());
-  });
-
-
-  /**
-   * Byte blobs inside nested messages should always have their byte offset set
-   * relative to the start of the outermost blob, not the start of their parent
-   * blob.
-   */
-  it('testNestedBlobs', function() {
-    // Create a proto consisting of two nested messages, with the inner one
-    // containing a blob of bytes.
-
-    var fieldTag = (1 << 3) | jspb.BinaryConstants.WireType.DELIMITED;
-    var blob = [1, 2, 3, 4, 5];
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    writer.writeMessage(1, dummyMessage, function() {
-      writer.writeMessage(1, dummyMessage, function() {
-        writer.writeBytes(1, blob);
-      });
-    });
-
-    // Peel off the outer two message layers. Each layer should have two bytes
-    // of overhead, one for the field tag and one for the length of the inner
-    // blob.
-
-    var decoder1 = new jspb.BinaryDecoder(writer.getResultBuffer());
-    assertEquals(fieldTag, decoder1.readUnsignedVarint32());
-    assertEquals(blob.length + 4, decoder1.readUnsignedVarint32());
-
-    var decoder2 = new jspb.BinaryDecoder(decoder1.readBytes(blob.length + 4));
-    assertEquals(fieldTag, decoder2.readUnsignedVarint32());
-    assertEquals(blob.length + 2, decoder2.readUnsignedVarint32());
-
-    assertEquals(fieldTag, decoder2.readUnsignedVarint32());
-    assertEquals(blob.length, decoder2.readUnsignedVarint32());
-    var bytes = decoder2.readBytes(blob.length);
-
-    assertElementsEquals(bytes, blob);
-  });
-
-
-  /**
-   * Tests read callbacks.
-   */
-  it('testReadCallbacks', function() {
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    // Add an int, a submessage, and another int.
-    writer.writeInt32(1, 100);
-
-    writer.writeMessage(2, dummyMessage, function() {
-      writer.writeInt32(3, 300);
-      writer.writeInt32(4, 400);
-      writer.writeInt32(5, 500);
-    });
-
-    writer.writeInt32(7, 700);
-
-    // Create the reader and register a custom read callback.
-    var reader = jspb.BinaryReader.alloc(writer.getResultBuffer());
-
-    /**
-     * @param {!jspb.BinaryReader} reader
-     * @return {*}
-     */
-    function readCallback(reader) {
-      reader.nextField();
-      assertEquals(3, reader.getFieldNumber());
-      assertEquals(300, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(4, reader.getFieldNumber());
-      assertEquals(400, reader.readInt32());
-
-      reader.nextField();
-      assertEquals(5, reader.getFieldNumber());
-      assertEquals(500, reader.readInt32());
-
-      assertEquals(false, reader.nextField());
-    };
-
-    reader.registerReadCallback('readCallback', readCallback);
-
-    // Read the container message.
-    reader.nextField();
-    assertEquals(1, reader.getFieldNumber());
-    assertEquals(100, reader.readInt32());
-
-    reader.nextField();
-    assertEquals(2, reader.getFieldNumber());
-    reader.readMessage(dummyMessage, function() {
-      // Decode the embedded message using the registered callback.
-      reader.runReadCallback('readCallback');
-    });
-
-    reader.nextField();
-    assertEquals(7, reader.getFieldNumber());
-    assertEquals(700, reader.readInt32());
-
-    assertEquals(false, reader.nextField());
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/binary/utils_test.js b/js/compatibility_tests/v3.1.0/binary/utils_test.js
deleted file mode 100644
index d27e5ea..0000000
--- a/js/compatibility_tests/v3.1.0/binary/utils_test.js
+++ /dev/null
@@ -1,668 +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.
-
-/**
- * @fileoverview Test cases for jspb's helper functions.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.crypt.base64');
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryConstants');
-goog.require('jspb.BinaryWriter');
-goog.require('jspb.utils');
-
-
-/**
- * @param {number} x
- * @return {number}
- */
-function truncate(x) {
-  var temp = new Float32Array(1);
-  temp[0] = x;
-  return temp[0];
-}
-
-
-/**
- * Converts an 64-bit integer in split representation to a 64-bit hash string
- * (8 bits encoded per character).
- * @param {number} bitsLow The low 32 bits of the split 64-bit integer.
- * @param {number} bitsHigh The high 32 bits of the split 64-bit integer.
- * @return {string} The encoded hash string, 8 bits per character.
- */
-function toHashString(bitsLow, bitsHigh) {
-  return String.fromCharCode((bitsLow >>> 0) & 0xFF,
-                             (bitsLow >>> 8) & 0xFF,
-                             (bitsLow >>> 16) & 0xFF,
-                             (bitsLow >>> 24) & 0xFF,
-                             (bitsHigh >>> 0) & 0xFF,
-                             (bitsHigh >>> 8) & 0xFF,
-                             (bitsHigh >>> 16) & 0xFF,
-                             (bitsHigh >>> 24) & 0xFF);
-}
-
-
-describe('binaryUtilsTest', function() {
-  /**
-   * Tests lossless binary-to-decimal conversion.
-   */
-  it('testDecimalConversion', function() {
-    // Check some magic numbers.
-    var result =
-        jspb.utils.joinUnsignedDecimalString(0x89e80001, 0x8ac72304);
-    assertEquals('10000000000000000001', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xacd05f15, 0x1b69b4b);
-    assertEquals('123456789123456789', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xeb1f0ad2, 0xab54a98c);
-    assertEquals('12345678901234567890', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xe3b70cb1, 0x891087b8);
-    assertEquals('9876543210987654321', result);
-
-    // Check limits.
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00000000);
-    assertEquals('0', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0xFFFFFFFF, 0xFFFFFFFF);
-    assertEquals('18446744073709551615', result);
-
-    // Check each bit of the low dword.
-    for (var i = 0; i < 32; i++) {
-      var low = (1 << i) >>> 0;
-      result = jspb.utils.joinUnsignedDecimalString(low, 0);
-      assertEquals('' + Math.pow(2, i), result);
-    }
-
-    // Check the first 20 bits of the high dword.
-    for (var i = 0; i < 20; i++) {
-      var high = (1 << i) >>> 0;
-      result = jspb.utils.joinUnsignedDecimalString(0, high);
-      assertEquals('' + Math.pow(2, 32 + i), result);
-    }
-
-    // V8's internal double-to-string conversion is inaccurate for values above
-    // 2^52, even if they're representable integers - check the rest of the bits
-    // manually against the correct string representations of 2^N.
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00100000);
-    assertEquals('4503599627370496', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00200000);
-    assertEquals('9007199254740992', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00400000);
-    assertEquals('18014398509481984', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00800000);
-    assertEquals('36028797018963968', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x01000000);
-    assertEquals('72057594037927936', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x02000000);
-    assertEquals('144115188075855872', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x04000000);
-    assertEquals('288230376151711744', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x08000000);
-    assertEquals('576460752303423488', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x10000000);
-    assertEquals('1152921504606846976', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x20000000);
-    assertEquals('2305843009213693952', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x40000000);
-    assertEquals('4611686018427387904', result);
-
-    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x80000000);
-    assertEquals('9223372036854775808', result);
-  });
-
-
-  /**
-   * Going from hash strings to decimal strings should also be lossless.
-   */
-  it('testHashToDecimalConversion', function() {
-    var result;
-    var convert = jspb.utils.hash64ToDecimalString;
-
-    result = convert(toHashString(0x00000000, 0x00000000), false);
-    assertEquals('0', result);
-
-    result = convert(toHashString(0x00000000, 0x00000000), true);
-    assertEquals('0', result);
-
-    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF), false);
-    assertEquals('18446744073709551615', result);
-
-    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF), true);
-    assertEquals('-1', result);
-
-    result = convert(toHashString(0x00000000, 0x80000000), false);
-    assertEquals('9223372036854775808', result);
-
-    result = convert(toHashString(0x00000000, 0x80000000), true);
-    assertEquals('-9223372036854775808', result);
-
-    result = convert(toHashString(0xacd05f15, 0x01b69b4b), false);
-    assertEquals('123456789123456789', result);
-
-    result = convert(toHashString(~0xacd05f15 + 1, ~0x01b69b4b), true);
-    assertEquals('-123456789123456789', result);
-
-    // And converting arrays of hashes should work the same way.
-    result = jspb.utils.hash64ArrayToDecimalStrings([
-      toHashString(0xFFFFFFFF, 0xFFFFFFFF),
-      toHashString(0x00000000, 0x80000000),
-      toHashString(0xacd05f15, 0x01b69b4b)], false);
-    assertEquals(3, result.length);
-    assertEquals('18446744073709551615', result[0]);
-    assertEquals('9223372036854775808', result[1]);
-    assertEquals('123456789123456789', result[2]);
-  });
-
-  /*
-   * Going from decimal strings to hash strings should be lossless.
-   */
-  it('testDecimalToHashConversion', function() {
-    var result;
-    var convert = jspb.utils.decimalStringToHash64;
-
-    result = convert('0');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
-
-    result = convert('-1');
-    assertEquals(String.fromCharCode.apply(null,
-      [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
-
-    result = convert('18446744073709551615');
-    assertEquals(String.fromCharCode.apply(null,
-      [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
-
-    result = convert('9223372036854775808');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
-
-    result = convert('-9223372036854775808');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
-
-    result = convert('123456789123456789');
-    assertEquals(String.fromCharCode.apply(null,
-      [0x15, 0x5F, 0xD0, 0xAC, 0x4B, 0x9B, 0xB6, 0x01]), result);
-
-    result = convert('-123456789123456789');
-    assertEquals(String.fromCharCode.apply(null,
-      [0xEB, 0xA0, 0x2F, 0x53, 0xB4, 0x64, 0x49, 0xFE]), result);
-  });
-
-  /**
-   * Going from hash strings to hex strings should be lossless.
-   */
-  it('testHashToHexConversion', function() {
-    var result;
-    var convert = jspb.utils.hash64ToHexString;
-
-    result = convert(toHashString(0x00000000, 0x00000000));
-    assertEquals('0x0000000000000000', result);
-
-    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF));
-    assertEquals('0xffffffffffffffff', result);
-
-    result = convert(toHashString(0x12345678, 0x9ABCDEF0));
-    assertEquals('0x9abcdef012345678', result);
-  });
-
-
-  /**
-   * Going from hex strings to hash strings should be lossless.
-   */
-  it('testHexToHashConversion', function() {
-    var result;
-    var convert = jspb.utils.hexStringToHash64;
-
-    result = convert('0x0000000000000000');
-    assertEquals(String.fromCharCode.apply(null,
-        [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
-
-    result = convert('0xffffffffffffffff');
-    assertEquals(String.fromCharCode.apply(null,
-        [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
-
-    // Hex string is big-endian, hash string is little-endian.
-    result = convert('0x123456789ABCDEF0');
-    assertEquals(String.fromCharCode.apply(null,
-        [0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12]), result);
-
-    // Capitalization should not matter.
-    result = convert('0x0000abcdefABCDEF');
-    assertEquals(String.fromCharCode.apply(null,
-        [0xEF, 0xCD, 0xAB, 0xEF, 0xCD, 0xAB, 0x00, 0x00]), result);
-  });
-
-
-  /**
-   * Going from numbers to hash strings should be lossless for up to 53 bits of
-   * precision.
-   */
-  it('testNumberToHashConversion', function() {
-    var result;
-    var convert = jspb.utils.numberToHash64;
-
-    result = convert(0x0000000000000);
-    assertEquals('0x0000000000000000', jspb.utils.hash64ToHexString(result));
-
-    result = convert(0xFFFFFFFFFFFFF);
-    assertEquals('0x000fffffffffffff', jspb.utils.hash64ToHexString(result));
-
-    result = convert(0x123456789ABCD);
-    assertEquals('0x000123456789abcd', jspb.utils.hash64ToHexString(result));
-
-    result = convert(0xDCBA987654321);
-    assertEquals('0x000dcba987654321', jspb.utils.hash64ToHexString(result));
-
-    // 53 bits of precision should not be truncated.
-    result = convert(0x10000000000001);
-    assertEquals('0x0010000000000001', jspb.utils.hash64ToHexString(result));
-
-    // 54 bits of precision should be truncated.
-    result = convert(0x20000000000001);
-    assertNotEquals(
-        '0x0020000000000001', jspb.utils.hash64ToHexString(result));
-  });
-
-
-  /**
-   * Sanity check the behavior of Javascript's strings when doing funny things
-   * with unicode characters.
-   */
-  it('sanityCheckUnicodeStrings', function() {
-    var strings = new Array(65536);
-
-    // All possible unsigned 16-bit values should be storable in a string, they
-    // shouldn't do weird things with the length of the string, and they should
-    // come back out of the string unchanged.
-    for (var i = 0; i < 65536; i++) {
-      strings[i] = 'a' + String.fromCharCode(i) + 'a';
-      if (3 != strings[i].length) throw 'fail!';
-      if (i != strings[i].charCodeAt(1)) throw 'fail!';
-    }
-
-    // Each unicode character should compare equal to itself and not equal to a
-    // different unicode character.
-    for (var i = 0; i < 65536; i++) {
-      if (strings[i] != strings[i]) throw 'fail!';
-      if (strings[i] == strings[(i + 1) % 65536]) throw 'fail!';
-    }
-  });
-
-
-  /**
-   * Tests conversion from 32-bit floating point numbers to split64 numbers.
-   */
-  it('testFloat32ToSplit64', function() {
-    var f32_eps = jspb.BinaryConstants.FLOAT32_EPS;
-    var f32_min = jspb.BinaryConstants.FLOAT32_MIN;
-    var f32_max = jspb.BinaryConstants.FLOAT32_MAX;
-
-    // NaN.
-    jspb.utils.splitFloat32(NaN);
-    if (!isNaN(jspb.utils.joinFloat32(jspb.utils.split64Low,
-                                      jspb.utils.split64High))) {
-      throw 'fail!';
-    }
-
-    /**
-     * @param {number} x
-     * @param {number=} opt_bits
-     */
-    function test(x, opt_bits) {
-      jspb.utils.splitFloat32(x);
-      if (goog.isDef(opt_bits)) {
-        if (opt_bits != jspb.utils.split64Low) throw 'fail!';
-      }
-      if (truncate(x) != jspb.utils.joinFloat32(jspb.utils.split64Low,
-          jspb.utils.split64High)) {
-        throw 'fail!';
-      }
-    }
-
-    // Positive and negative infinity.
-    test(Infinity, 0x7f800000);
-    test(-Infinity, 0xff800000);
-
-    // Positive and negative zero.
-    test(0, 0x00000000);
-    test(-0, 0x80000000);
-
-    // Positive and negative epsilon.
-    test(f32_eps, 0x00000001);
-    test(-f32_eps, 0x80000001);
-
-    // Positive and negative min.
-    test(f32_min, 0x00800000);
-    test(-f32_min, 0x80800000);
-
-    // Positive and negative max.
-    test(f32_max, 0x7F7FFFFF);
-    test(-f32_max, 0xFF7FFFFF);
-
-    // Various positive values.
-    var cursor = f32_eps * 10;
-    while (cursor != Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-
-    // Various negative values.
-    cursor = -f32_eps * 10;
-    while (cursor != -Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-  });
-
-
-  /**
-   * Tests conversion from 64-bit floating point numbers to split64 numbers.
-   */
-  it('testFloat64ToSplit64', function() {
-    var f64_eps = jspb.BinaryConstants.FLOAT64_EPS;
-    var f64_min = jspb.BinaryConstants.FLOAT64_MIN;
-    var f64_max = jspb.BinaryConstants.FLOAT64_MAX;
-
-    // NaN.
-    jspb.utils.splitFloat64(NaN);
-    if (!isNaN(jspb.utils.joinFloat64(jspb.utils.split64Low,
-        jspb.utils.split64High))) {
-      throw 'fail!';
-    }
-
-    /**
-     * @param {number} x
-     * @param {number=} opt_highBits
-     * @param {number=} opt_lowBits
-     */
-    function test(x, opt_highBits, opt_lowBits) {
-      jspb.utils.splitFloat64(x);
-      if (goog.isDef(opt_highBits)) {
-        if (opt_highBits != jspb.utils.split64High) throw 'fail!';
-      }
-      if (goog.isDef(opt_lowBits)) {
-        if (opt_lowBits != jspb.utils.split64Low) throw 'fail!';
-      }
-      if (x != jspb.utils.joinFloat64(jspb.utils.split64Low,
-          jspb.utils.split64High)) {
-        throw 'fail!';
-      }
-    }
-
-    // Positive and negative infinity.
-    test(Infinity, 0x7ff00000, 0x00000000);
-    test(-Infinity, 0xfff00000, 0x00000000);
-
-    // Positive and negative zero.
-    test(0, 0x00000000, 0x00000000);
-    test(-0, 0x80000000, 0x00000000);
-
-    // Positive and negative epsilon.
-    test(f64_eps, 0x00000000, 0x00000001);
-    test(-f64_eps, 0x80000000, 0x00000001);
-
-    // Positive and negative min.
-    test(f64_min, 0x00100000, 0x00000000);
-    test(-f64_min, 0x80100000, 0x00000000);
-
-    // Positive and negative max.
-    test(f64_max, 0x7FEFFFFF, 0xFFFFFFFF);
-    test(-f64_max, 0xFFEFFFFF, 0xFFFFFFFF);
-
-    // Various positive values.
-    var cursor = f64_eps * 10;
-    while (cursor != Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-
-    // Various negative values.
-    cursor = -f64_eps * 10;
-    while (cursor != -Infinity) {
-      test(cursor);
-      cursor *= 1.1;
-    }
-  });
-
-
-  /**
-   * Tests counting packed varints.
-   */
-  it('testCountVarints', function() {
-    var values = [];
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      values.push(Math.floor(i));
-    }
-
-    var writer = new jspb.BinaryWriter();
-    writer.writePackedUint64(1, values);
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-
-    // We should have two more varints than we started with - one for the field
-    // tag, one for the packed length.
-    assertEquals(values.length + 2,
-                 jspb.utils.countVarints(buffer, 0, buffer.length));
-  });
-
-
-  /**
-   * Tests counting matching varint fields.
-   */
-  it('testCountVarintFields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeUint64(1, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countVarintFields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeUint64(123456789, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countVarintFields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests counting matching fixed32 fields.
-   */
-  it('testCountFixed32Fields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeFixed32(1, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed32Fields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeFixed32(123456789, Math.floor(i));
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed32Fields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests counting matching fixed64 fields.
-   */
-  it('testCountFixed64Fields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeDouble(1, i);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed64Fields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000000000; i *= 1.1) {
-      writer.writeDouble(123456789, i);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countFixed64Fields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests counting matching delimited fields.
-   */
-  it('testCountDelimitedFields', function() {
-    var writer = new jspb.BinaryWriter();
-
-    var count = 0;
-    for (var i = 1; i < 1000; i *= 1.1) {
-      writer.writeBytes(1, [Math.floor(i)]);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    var buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countDelimitedFields(buffer, 0, buffer.length, 1));
-
-    writer = new jspb.BinaryWriter();
-
-    count = 0;
-    for (var i = 1; i < 1000; i *= 1.1) {
-      writer.writeBytes(123456789, [Math.floor(i)]);
-      count++;
-    }
-    writer.writeString(2, 'terminator');
-
-    buffer = new Uint8Array(writer.getResultBuffer());
-    assertEquals(count,
-        jspb.utils.countDelimitedFields(buffer, 0, buffer.length, 123456789));
-  });
-
-
-  /**
-   * Tests byte format for debug strings.
-   */
-  it('testDebugBytesToTextFormat', function() {
-    assertEquals('""', jspb.utils.debugBytesToTextFormat(null));
-    assertEquals('"\\x00\\x10\\xff"',
-        jspb.utils.debugBytesToTextFormat([0, 16, 255]));
-  });
-
-
-  /**
-   * Tests converting byte blob sources into byte blobs.
-   */
-  it('testByteSourceToUint8Array', function() {
-    var convert = jspb.utils.byteSourceToUint8Array;
-
-    var sourceData = [];
-    for (var i = 0; i < 256; i++) {
-      sourceData.push(i);
-    }
-
-    var sourceBytes = new Uint8Array(sourceData);
-    var sourceBuffer = sourceBytes.buffer;
-    var sourceBase64 = goog.crypt.base64.encodeByteArray(sourceData);
-    var sourceString = String.fromCharCode.apply(null, sourceData);
-
-    function check(result) {
-      assertEquals(Uint8Array, result.constructor);
-      assertEquals(sourceData.length, result.length);
-      for (var i = 0; i < result.length; i++) {
-        assertEquals(sourceData[i], result[i]);
-      }
-    }
-
-    // Converting Uint8Arrays into Uint8Arrays should be a no-op.
-    assertEquals(sourceBytes, convert(sourceBytes));
-
-    // Converting Array.<numbers> into Uint8Arrays should work.
-    check(convert(sourceData));
-
-    // Converting ArrayBuffers into Uint8Arrays should work.
-    check(convert(sourceBuffer));
-
-    // Converting base64-encoded strings into Uint8Arrays should work.
-    check(convert(sourceBase64));
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/binary/writer_test.js b/js/compatibility_tests/v3.1.0/binary/writer_test.js
deleted file mode 100644
index d5dadb4..0000000
--- a/js/compatibility_tests/v3.1.0/binary/writer_test.js
+++ /dev/null
@@ -1,122 +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.
-
-/**
- * @fileoverview Test cases for jspb's binary protocol buffer writer. In
- * practice BinaryWriter is used to drive the Decoder and Reader test cases,
- * so only writer-specific tests are here.
- *
- * Test suite is written using Jasmine -- see http://jasmine.github.io/
- *
- * @author aappleby@google.com (Austin Appleby)
- */
-
-goog.require('goog.crypt');
-goog.require('goog.testing.asserts');
-goog.require('jspb.BinaryWriter');
-
-
-/**
- * @param {function()} func This function should throw an error when run.
- */
-function assertFails(func) {
-  var e = assertThrows(func);
-  //assertNotNull(e.toString().match(/Error/));
-}
-
-
-describe('binaryWriterTest', function() {
-  /**
-   * Verifies that misuse of the writer class triggers assertions.
-   */
-  it('testWriteErrors', function() {
-    // Submessages with invalid field indices should assert.
-    var writer = new jspb.BinaryWriter();
-    var dummyMessage = /** @type {!jspb.BinaryMessage} */({});
-
-    assertFails(function() {
-      writer.writeMessage(-1, dummyMessage, goog.nullFunction);
-    });
-
-    // Writing invalid field indices should assert.
-    writer = new jspb.BinaryWriter();
-    assertFails(function() {writer.writeUint64(-1, 1);});
-
-    // Writing out-of-range field values should assert.
-    writer = new jspb.BinaryWriter();
-
-    assertFails(function() {writer.writeInt32(1, -Infinity);});
-    assertFails(function() {writer.writeInt32(1, Infinity);});
-
-    assertFails(function() {writer.writeInt64(1, -Infinity);});
-    assertFails(function() {writer.writeInt64(1, Infinity);});
-
-    assertFails(function() {writer.writeUint32(1, -1);});
-    assertFails(function() {writer.writeUint32(1, Infinity);});
-
-    assertFails(function() {writer.writeUint64(1, -1);});
-    assertFails(function() {writer.writeUint64(1, Infinity);});
-
-    assertFails(function() {writer.writeSint32(1, -Infinity);});
-    assertFails(function() {writer.writeSint32(1, Infinity);});
-
-    assertFails(function() {writer.writeSint64(1, -Infinity);});
-    assertFails(function() {writer.writeSint64(1, Infinity);});
-
-    assertFails(function() {writer.writeFixed32(1, -1);});
-    assertFails(function() {writer.writeFixed32(1, Infinity);});
-
-    assertFails(function() {writer.writeFixed64(1, -1);});
-    assertFails(function() {writer.writeFixed64(1, Infinity);});
-
-    assertFails(function() {writer.writeSfixed32(1, -Infinity);});
-    assertFails(function() {writer.writeSfixed32(1, Infinity);});
-
-    assertFails(function() {writer.writeSfixed64(1, -Infinity);});
-    assertFails(function() {writer.writeSfixed64(1, Infinity);});
-  });
-
-
-  /**
-   * Basic test of retrieving the result as a Uint8Array buffer
-   */
-  it('testGetResultBuffer', function() {
-    var expected = '0864120b48656c6c6f20776f726c641a0301020320c801';
-
-    var writer = new jspb.BinaryWriter();
-    writer.writeUint32(1, 100);
-    writer.writeString(2, 'Hello world');
-    writer.writeBytes(3, new Uint8Array([1, 2, 3]));
-    writer.writeUint32(4, 200);
-
-    var buffer = writer.getResultBuffer();
-    assertEquals(expected, goog.crypt.byteArrayToHex(buffer));
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/commonjs/test6/test6.proto b/js/compatibility_tests/v3.1.0/commonjs/test6/test6.proto
deleted file mode 100644
index a060925..0000000
--- a/js/compatibility_tests/v3.1.0/commonjs/test6/test6.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test.importing;
-
-message ImportedMessage {
-  string string_value = 1;
-}
diff --git a/js/compatibility_tests/v3.1.0/commonjs/test7/test7.proto b/js/compatibility_tests/v3.1.0/commonjs/test7/test7.proto
deleted file mode 100644
index f5574a3..0000000
--- a/js/compatibility_tests/v3.1.0/commonjs/test7/test7.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test.framing;
-
-import "test6/test6.proto";
-
-message FramingMessage {
-  jspb.test.importing.ImportedMessage imported_message = 1;
-}
diff --git a/js/compatibility_tests/v3.1.0/data.proto b/js/compatibility_tests/v3.1.0/data.proto
deleted file mode 100644
index 74a8a99..0000000
--- a/js/compatibility_tests/v3.1.0/data.proto
+++ /dev/null
@@ -1,51 +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.
-
-// Author: mwr@google.com (Mark Rawling)
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test;
-
-// legacy data, must be nested
-message data {
-  message NestedData {
-    required string str = 1;
-  }
-}
-
-// new data, does not require nesting
-message UnnestedData {
-  required string str = 1;
-}
-
diff --git a/js/compatibility_tests/v3.1.0/debug_test.js b/js/compatibility_tests/v3.1.0/debug_test.js
deleted file mode 100644
index 702cc76..0000000
--- a/js/compatibility_tests/v3.1.0/debug_test.js
+++ /dev/null
@@ -1,105 +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.
-
-goog.setTestOnly();
-
-goog.require('goog.testing.asserts');
-
-// CommonJS-LoadFromFile: google-protobuf
-goog.require('jspb.debug');
-
-// CommonJS-LoadFromFile: test_pb
-goog.require('proto.jspb.test.HasExtensions');
-goog.require('proto.jspb.test.IsExtension');
-goog.require('proto.jspb.test.Simple1');
-
-
-
-describe('debugTest', function() {
-  it('testSimple1', function() {
-    if (COMPILED) {
-      return;
-    }
-    var message = new proto.jspb.test.Simple1();
-    message.setAString('foo');
-    assertObjectEquals({
-      $name: 'proto.jspb.test.Simple1',
-      'aString': 'foo',
-      'aRepeatedStringList': []
-    }, jspb.debug.dump(message));
-
-    message.setABoolean(true);
-    message.setARepeatedStringList(['1', '2']);
-
-    assertObjectEquals({
-      $name: 'proto.jspb.test.Simple1',
-      'aString': 'foo',
-      'aRepeatedStringList': ['1', '2'],
-      'aBoolean': true
-    }, jspb.debug.dump(message));
-
-    message.clearAString();
-
-    assertObjectEquals({
-      $name: 'proto.jspb.test.Simple1',
-      'aRepeatedStringList': ['1', '2'],
-      'aBoolean': true
-    }, jspb.debug.dump(message));
-  });
-
-
-  it('testExtensions', function() {
-    if (COMPILED) {
-      return;
-    }
-    var extension = new proto.jspb.test.IsExtension();
-    extension.setExt1('ext1field');
-    var extendable = new proto.jspb.test.HasExtensions();
-    extendable.setStr1('v1');
-    extendable.setStr2('v2');
-    extendable.setStr3('v3');
-    extendable.setExtension(proto.jspb.test.IsExtension.extField, extension);
-
-    assertObjectEquals({
-      '$name': 'proto.jspb.test.HasExtensions',
-      'str1': 'v1',
-      'str2': 'v2',
-      'str3': 'v3',
-      '$extensions': {
-        'extField': {
-          '$name': 'proto.jspb.test.IsExtension',
-          'ext1': 'ext1field'
-        },
-        'repeatedSimpleList': []
-      }
-    }, jspb.debug.dump(extendable));
-  });
-
-});
diff --git a/js/compatibility_tests/v3.1.0/maps_test.js b/js/compatibility_tests/v3.1.0/maps_test.js
deleted file mode 100644
index 0d442f4..0000000
--- a/js/compatibility_tests/v3.1.0/maps_test.js
+++ /dev/null
@@ -1,301 +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.
-
-goog.require('goog.testing.asserts');
-goog.require('goog.userAgent');
-
-// CommonJS-LoadFromFile: testbinary_pb proto.jspb.test
-goog.require('proto.jspb.test.MapValueEnum');
-goog.require('proto.jspb.test.MapValueMessage');
-goog.require('proto.jspb.test.TestMapFields');
-
-// CommonJS-LoadFromFile: test_pb proto.jspb.test
-goog.require('proto.jspb.test.MapValueMessageNoBinary');
-goog.require('proto.jspb.test.TestMapFieldsNoBinary');
-
-/**
- * Helper: check that the given map has exactly this set of (sorted) entries.
- * @param {!jspb.Map} map
- * @param {!Array<!Array<?>>} entries
- */
-function checkMapEquals(map, entries) {
-  var arr = map.toArray();
-  assertEquals(arr.length, entries.length);
-  for (var i = 0; i < arr.length; i++) {
-    assertElementsEquals(arr[i], entries[i]);
-  }
-}
-
-/**
- * Converts an ES6 iterator to an array.
- * @template T
- * @param {!Iterator<T>} iter an iterator
- * @return {!Array<T>}
- */
-function toArray(iter) {
-  var arr = [];
-  while (true) {
-    var val = iter.next();
-    if (val.done) {
-      break;
-    }
-    arr.push(val.value);
-  }
-  return arr;
-}
-
-
-/**
- * Helper: generate test methods for this TestMapFields class.
- * @param {?} msgInfo
- * @param {?} submessageCtor
- * @param {!string} suffix
- */
-function makeTests(msgInfo, submessageCtor, suffix) {
-  /**
-   * Helper: fill all maps on a TestMapFields.
-   * @param {?} msg
-   */
-  var fillMapFields = function(msg) {
-    msg.getMapStringStringMap().set('asdf', 'jkl;').set('key 2', 'hello world');
-    msg.getMapStringInt32Map().set('a', 1).set('b', -2);
-    msg.getMapStringInt64Map().set('c', 0x100000000).set('d', 0x200000000);
-    msg.getMapStringBoolMap().set('e', true).set('f', false);
-    msg.getMapStringDoubleMap().set('g', 3.14159).set('h', 2.71828);
-    msg.getMapStringEnumMap()
-        .set('i', proto.jspb.test.MapValueEnum.MAP_VALUE_BAR)
-        .set('j', proto.jspb.test.MapValueEnum.MAP_VALUE_BAZ);
-    msg.getMapStringMsgMap()
-        .set('k', new submessageCtor())
-        .set('l', new submessageCtor());
-    msg.getMapStringMsgMap().get('k').setFoo(42);
-    msg.getMapStringMsgMap().get('l').setFoo(84);
-    msg.getMapInt32StringMap().set(-1, 'a').set(42, 'b');
-    msg.getMapInt64StringMap().set(0x123456789abc, 'c').set(0xcba987654321, 'd');
-    msg.getMapBoolStringMap().set(false, 'e').set(true, 'f');
-  };
-
-  /**
-   * Helper: check all maps on a TestMapFields.
-   * @param {?} msg
-   */
-  var checkMapFields = function(msg) {
-    checkMapEquals(msg.getMapStringStringMap(), [
-          ['asdf', 'jkl;'],
-          ['key 2', 'hello world']
-    ]);
-    checkMapEquals(msg.getMapStringInt32Map(), [
-          ['a', 1],
-          ['b', -2]
-    ]);
-    checkMapEquals(msg.getMapStringInt64Map(), [
-          ['c', 0x100000000],
-          ['d', 0x200000000]
-    ]);
-    checkMapEquals(msg.getMapStringBoolMap(), [
-          ['e', true],
-          ['f', false]
-    ]);
-    checkMapEquals(msg.getMapStringDoubleMap(), [
-          ['g', 3.14159],
-          ['h', 2.71828]
-    ]);
-    checkMapEquals(msg.getMapStringEnumMap(), [
-          ['i', proto.jspb.test.MapValueEnum.MAP_VALUE_BAR],
-          ['j', proto.jspb.test.MapValueEnum.MAP_VALUE_BAZ]
-    ]);
-    checkMapEquals(msg.getMapInt32StringMap(), [
-          [-1, 'a'],
-          [42, 'b']
-    ]);
-    checkMapEquals(msg.getMapInt64StringMap(), [
-          [0x123456789abc, 'c'],
-          [0xcba987654321, 'd']
-    ]);
-    checkMapEquals(msg.getMapBoolStringMap(), [
-          [false, 'e'],
-          [true, 'f']
-    ]);
-
-    assertEquals(msg.getMapStringMsgMap().getLength(), 2);
-    assertEquals(msg.getMapStringMsgMap().get('k').getFoo(), 42);
-    assertEquals(msg.getMapStringMsgMap().get('l').getFoo(), 84);
-
-    var entries = toArray(msg.getMapStringMsgMap().entries());
-    assertEquals(entries.length, 2);
-    entries.forEach(function(entry) {
-      var key = entry[0];
-      var val = entry[1];
-      assert(val === msg.getMapStringMsgMap().get(key));
-    });
-
-    msg.getMapStringMsgMap().forEach(function(val, key) {
-      assert(val === msg.getMapStringMsgMap().get(key));
-    });
-  };
-
-  it('testMapStringStringField' + suffix, function() {
-    var msg = new msgInfo.constructor();
-    assertEquals(msg.getMapStringStringMap().getLength(), 0);
-    assertEquals(msg.getMapStringInt32Map().getLength(), 0);
-    assertEquals(msg.getMapStringInt64Map().getLength(), 0);
-    assertEquals(msg.getMapStringBoolMap().getLength(), 0);
-    assertEquals(msg.getMapStringDoubleMap().getLength(), 0);
-    assertEquals(msg.getMapStringEnumMap().getLength(), 0);
-    assertEquals(msg.getMapStringMsgMap().getLength(), 0);
-
-    // Re-create to clear out any internally-cached wrappers, etc.
-    msg = new msgInfo.constructor();
-    var m = msg.getMapStringStringMap();
-    assertEquals(m.has('asdf'), false);
-    assertEquals(m.get('asdf'), undefined);
-    m.set('asdf', 'hello world');
-    assertEquals(m.has('asdf'), true);
-    assertEquals(m.get('asdf'), 'hello world');
-    m.set('jkl;', 'key 2');
-    assertEquals(m.has('jkl;'), true);
-    assertEquals(m.get('jkl;'), 'key 2');
-    assertEquals(m.getLength(), 2);
-    var it = m.entries();
-    assertElementsEquals(it.next().value, ['asdf', 'hello world']);
-    assertElementsEquals(it.next().value, ['jkl;', 'key 2']);
-    assertEquals(it.next().done, true);
-    checkMapEquals(m, [
-        ['asdf', 'hello world'],
-        ['jkl;', 'key 2']
-    ]);
-    m.del('jkl;');
-    assertEquals(m.has('jkl;'), false);
-    assertEquals(m.get('jkl;'), undefined);
-    assertEquals(m.getLength(), 1);
-    it = m.keys();
-    assertEquals(it.next().value, 'asdf');
-    assertEquals(it.next().done, true);
-    it = m.values();
-    assertEquals(it.next().value, 'hello world');
-    assertEquals(it.next().done, true);
-
-    var count = 0;
-    m.forEach(function(value, key, map) {
-      assertEquals(map, m);
-      assertEquals(key, 'asdf');
-      assertEquals(value, 'hello world');
-      count++;
-    });
-    assertEquals(count, 1);
-
-    m.clear();
-    assertEquals(m.getLength(), 0);
-  });
-
-
-  /**
-   * Tests operations on maps with all key and value types.
-   */
-  it('testAllMapTypes' + suffix, function() {
-    var msg = new msgInfo.constructor();
-    fillMapFields(msg);
-    checkMapFields(msg);
-  });
-
-
-  if (msgInfo.deserializeBinary) {
-    /**
-     * Tests serialization and deserialization in binary format.
-     */
-    it('testBinaryFormat' + suffix, function() {
-      if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(10)) {
-        // IE8/9 currently doesn't support binary format because they lack
-        // TypedArray.
-        return;
-      }
-
-      // Check that the format is correct.
-      var msg = new msgInfo.constructor();
-      msg.getMapStringStringMap().set('A', 'a');
-      var serialized = msg.serializeBinary();
-      var expectedSerialized = [
-          0x0a, 0x6, // field 1 (map_string_string), delimited, length 6
-          0x0a, 0x1, // field 1 in submessage (key), delimited, length 1
-          0x41,      // ASCII 'A'
-          0x12, 0x1, // field 2 in submessage (value), delimited, length 1
-          0x61       // ASCII 'a'
-      ];
-      assertEquals(serialized.length, expectedSerialized.length);
-      for (var i = 0; i < serialized.length; i++) {
-        assertEquals(serialized[i], expectedSerialized[i]);
-      }
-
-      // Check that all map fields successfully round-trip.
-      msg = new msgInfo.constructor();
-      fillMapFields(msg);
-      serialized = msg.serializeBinary();
-      var decoded = msgInfo.deserializeBinary(serialized);
-      checkMapFields(decoded);
-    });
-  }
-
-  /**
-   * Exercises the lazy map<->underlying array sync.
-   */
-  it('testLazyMapSync' + suffix, function() {
-    // Start with a JSPB array containing a few map entries.
-    var entries = [
-        ['a', 'entry 1'],
-        ['c', 'entry 2'],
-        ['b', 'entry 3']
-    ];
-    var msg = new msgInfo.constructor([entries]);
-    assertEquals(entries.length, 3);
-    assertEquals(entries[0][0], 'a');
-    assertEquals(entries[1][0], 'c');
-    assertEquals(entries[2][0], 'b');
-    msg.getMapStringStringMap().del('a');
-    assertEquals(entries.length, 3);  // not yet sync'd
-    msg.toArray();                // force a sync
-    assertEquals(entries.length, 2);
-    assertEquals(entries[0][0], 'b'); // now in sorted order
-    assertEquals(entries[1][0], 'c');
-
-    var a = msg.toArray();
-    assertEquals(a[0], entries);  // retains original reference
-  });
-}
-
-describe('mapsTest', function() {
-  makeTests({
-    constructor: proto.jspb.test.TestMapFields,
-    deserializeBinary: proto.jspb.test.TestMapFields.deserializeBinary
-  }, proto.jspb.test.MapValueMessage, "_Binary");
-  makeTests({
-    constructor: proto.jspb.test.TestMapFieldsNoBinary,
-    deserializeBinary: null
-  }, proto.jspb.test.MapValueMessageNoBinary, "_NoBinary");
-});
diff --git a/js/compatibility_tests/v3.1.0/message_test.js b/js/compatibility_tests/v3.1.0/message_test.js
deleted file mode 100644
index c102378..0000000
--- a/js/compatibility_tests/v3.1.0/message_test.js
+++ /dev/null
@@ -1,1032 +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.
-
-// Test suite is written using Jasmine -- see http://jasmine.github.io/
-
-goog.setTestOnly();
-
-goog.require('goog.json');
-goog.require('goog.testing.asserts');
-goog.require('goog.userAgent');
-
-// CommonJS-LoadFromFile: google-protobuf jspb
-goog.require('jspb.Message');
-
-// CommonJS-LoadFromFile: test5_pb proto.jspb.exttest.beta
-goog.require('proto.jspb.exttest.beta.floatingStrField');
-
-// CommonJS-LoadFromFile: test3_pb proto.jspb.exttest
-goog.require('proto.jspb.exttest.floatingMsgField');
-
-// CommonJS-LoadFromFile: test4_pb proto.jspb.exttest
-goog.require('proto.jspb.exttest.floatingMsgFieldTwo');
-
-// CommonJS-LoadFromFile: test_pb proto.jspb.test
-goog.require('proto.jspb.test.CloneExtension');
-goog.require('proto.jspb.test.Complex');
-goog.require('proto.jspb.test.DefaultValues');
-goog.require('proto.jspb.test.Empty');
-goog.require('proto.jspb.test.EnumContainer');
-goog.require('proto.jspb.test.floatingMsgField');
-goog.require('proto.jspb.test.FloatingPointFields');
-goog.require('proto.jspb.test.floatingStrField');
-goog.require('proto.jspb.test.HasExtensions');
-goog.require('proto.jspb.test.IndirectExtension');
-goog.require('proto.jspb.test.IsExtension');
-goog.require('proto.jspb.test.OptionalFields');
-goog.require('proto.jspb.test.OuterEnum');
-goog.require('proto.jspb.test.OuterMessage.Complex');
-goog.require('proto.jspb.test.Simple1');
-goog.require('proto.jspb.test.Simple2');
-goog.require('proto.jspb.test.SpecialCases');
-goog.require('proto.jspb.test.TestClone');
-goog.require('proto.jspb.test.TestEndsWithBytes');
-goog.require('proto.jspb.test.TestGroup');
-goog.require('proto.jspb.test.TestGroup1');
-goog.require('proto.jspb.test.TestMessageWithOneof');
-goog.require('proto.jspb.test.TestReservedNames');
-goog.require('proto.jspb.test.TestReservedNamesExtension');
-
-// CommonJS-LoadFromFile: test2_pb proto.jspb.test
-goog.require('proto.jspb.test.ExtensionMessage');
-goog.require('proto.jspb.test.TestExtensionsMessage');
-
-
-
-
-describe('Message test suite', function() {
-  it('testEmptyProto', function() {
-    var empty1 = new proto.jspb.test.Empty([]);
-    var empty2 = new proto.jspb.test.Empty([]);
-    assertObjectEquals({}, empty1.toObject());
-    assertObjectEquals('Message should not be corrupted:', empty2, empty1);
-  });
-
-  it('testTopLevelEnum', function() {
-    var response = new proto.jspb.test.EnumContainer([]);
-    response.setOuterEnum(proto.jspb.test.OuterEnum.FOO);
-    assertEquals(proto.jspb.test.OuterEnum.FOO, response.getOuterEnum());
-  });
-
-  it('testByteStrings', function() {
-    var data = new proto.jspb.test.DefaultValues([]);
-    data.setBytesField('some_bytes');
-    assertEquals('some_bytes', data.getBytesField());
-  });
-
-  it('testComplexConversion', function() {
-    var data1 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
-    var data2 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
-    var foo = new proto.jspb.test.Complex(data1);
-    var bar = new proto.jspb.test.Complex(data2);
-    var result = foo.toObject();
-    assertObjectEquals({
-      aString: 'a',
-      anOutOfOrderBool: 1,
-      aNestedMessage: {
-        anInt: 11
-      },
-      aRepeatedMessageList: [{anInt: 22}, {anInt: 33}],
-      aRepeatedStringList: ['s1', 's2']
-    }, result);
-
-    // Now test with the jspb instances included.
-    result = foo.toObject(true /* opt_includeInstance */);
-    assertObjectEquals({
-      aString: 'a',
-      anOutOfOrderBool: 1,
-      aNestedMessage: {
-        anInt: 11,
-        $jspbMessageInstance: foo.getANestedMessage()
-      },
-      aRepeatedMessageList: [
-        {anInt: 22, $jspbMessageInstance: foo.getARepeatedMessageList()[0]},
-        {anInt: 33, $jspbMessageInstance: foo.getARepeatedMessageList()[1]}
-      ],
-      aRepeatedStringList: ['s1', 's2'],
-      $jspbMessageInstance: foo
-    }, result);
-
-  });
-
-  it('testMissingFields', function() {
-    var foo = new proto.jspb.test.Complex([
-        undefined, undefined, undefined, [],
-        undefined, undefined, undefined, undefined]);
-    var bar = new proto.jspb.test.Complex([
-        undefined, undefined, undefined, [],
-        undefined, undefined, undefined, undefined]);
-    var result = foo.toObject();
-    assertObjectEquals({
-      aString: undefined,
-      anOutOfOrderBool: undefined,
-      aNestedMessage: {
-        anInt: undefined
-      },
-      // Note: JsPb converts undefined repeated fields to empty arrays.
-      aRepeatedMessageList: [],
-      aRepeatedStringList: []
-    }, result);
-
-  });
-
-  it('testNestedComplexMessage', function() {
-    // Instantiate the message and set a unique field, just to ensure that we
-    // are not getting jspb.test.Complex instead.
-    var msg = new proto.jspb.test.OuterMessage.Complex();
-    msg.setInnerComplexField(5);
-  });
-
-  it('testSpecialCases', function() {
-    // Note: Some property names are reserved in JavaScript.
-    // These names are converted to the Js property named pb_<reserved_name>.
-    var special =
-        new proto.jspb.test.SpecialCases(['normal', 'default', 'function',
-        'var']);
-    var result = special.toObject();
-    assertObjectEquals({
-      normal: 'normal',
-      pb_default: 'default',
-      pb_function: 'function',
-      pb_var: 'var'
-    }, result);
-  });
-
-  it('testDefaultValues', function() {
-    var defaultString = "default<>\'\"abc";
-    var response = new proto.jspb.test.DefaultValues();
-
-    // Test toObject
-    var expectedObject = {
-      stringField: defaultString,
-      boolField: true,
-      intField: 11,
-      enumField: 13,
-      emptyField: '',
-      bytesField: 'bW9v'
-    };
-    assertObjectEquals(expectedObject, response.toObject());
-
-
-    // Test getters
-    response = new proto.jspb.test.DefaultValues();
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertEquals('', response.getEmptyField());
-    assertEquals('bW9v', response.getBytesField());
-
-    function makeDefault(values) {
-      return new proto.jspb.test.DefaultValues(values);
-    }
-
-    // Test with undefined values,
-    // Use push to workaround IE treating undefined array elements as holes.
-    response = makeDefault([undefined, undefined, undefined, undefined]);
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-
-    // Test with null values, as would be returned by a JSON serializer.
-    response = makeDefault([null, null, null, null]);
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-
-    // Test with false-like values.
-    response = makeDefault(['', false, 0, 0]);
-    assertEquals('', response.getStringField());
-    assertEquals(false, response.getBoolField());
-    assertEquals(true, response.getIntField() == 0);
-    assertEquals(true, response.getEnumField() == 0);
-    assertTrue(response.hasStringField());
-    assertTrue(response.hasBoolField());
-    assertTrue(response.hasIntField());
-    assertTrue(response.hasEnumField());
-
-    // Test that clearing the values reverts them to the default state.
-    response = makeDefault(['blah', false, 111, 77]);
-    response.clearStringField(); response.clearBoolField();
-    response.clearIntField(); response.clearEnumField();
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-
-    // Test that setFoo(null) clears the values.
-    response = makeDefault(['blah', false, 111, 77]);
-    response.setStringField(null); response.setBoolField(null);
-    response.setIntField(undefined); response.setEnumField(undefined);
-    assertEquals(defaultString, response.getStringField());
-    assertEquals(true, response.getBoolField());
-    assertEquals(11, response.getIntField());
-    assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
-  });
-
-  it('testClearFields', function() {
-    var data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
-    var foo = new proto.jspb.test.OptionalFields(data);
-    foo.clearAString();
-    foo.clearABool();
-    foo.clearANestedMessage();
-    foo.clearARepeatedMessageList();
-    foo.clearARepeatedStringList();
-    assertEquals('', foo.getAString());
-    assertEquals(false, foo.getABool());
-    assertUndefined(foo.getANestedMessage());
-    assertFalse(foo.hasAString());
-    assertFalse(foo.hasABool());
-    assertObjectEquals([], foo.getARepeatedMessageList());
-    assertObjectEquals([], foo.getARepeatedStringList());
-    // NOTE: We want the missing fields in 'expected' to be undefined,
-    // but we actually get a sparse array instead. We could use something
-    // like [1,undefined,2] to avoid this, except that this is still
-    // sparse on IE. No comment...
-    var expected = [,,, [], []];
-    expected[0] = expected[1] = expected[2] = undefined;
-    assertObjectEquals(expected, foo.toArray());
-  });
-
-  it('testDifferenceRawObject', /** @suppress {visibility} */ function() {
-    var p1 = new proto.jspb.test.HasExtensions(['hi', 'diff', {}]);
-    var p2 = new proto.jspb.test.HasExtensions(['hi', 'what',
-                                               {1000: 'unique'}]);
-    var diff = /** @type {proto.jspb.test.HasExtensions} */
-        (jspb.Message.difference(p1, p2));
-    assertEquals('', diff.getStr1());
-    assertEquals('what', diff.getStr2());
-    assertEquals('', diff.getStr3());
-    assertEquals('unique', diff.extensionObject_[1000]);
-  });
-
-  it('testEqualsSimple', function() {
-    var s1 = new proto.jspb.test.Simple1(['hi']);
-    assertTrue(jspb.Message.equals(s1, new proto.jspb.test.Simple1(['hi'])));
-    assertFalse(jspb.Message.equals(s1, new proto.jspb.test.Simple1(['bye'])));
-    var s1b = new proto.jspb.test.Simple1(['hi', ['hello']]);
-    assertTrue(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['hi', ['hello']])));
-    assertTrue(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['hi', ['hello', undefined,
-                                            undefined, undefined]])));
-    assertFalse(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['no', ['hello']])));
-    // Test with messages of different types
-    var s2 = new proto.jspb.test.Simple2(['hi']);
-    assertFalse(jspb.Message.equals(s1, s2));
-  });
-
-  it('testEquals_softComparison', function() {
-    var s1 = new proto.jspb.test.Simple1(['hi', [], null]);
-    assertTrue(jspb.Message.equals(s1,
-        new proto.jspb.test.Simple1(['hi', []])));
-
-    var s1b = new proto.jspb.test.Simple1(['hi', [], true]);
-    assertTrue(jspb.Message.equals(s1b,
-        new proto.jspb.test.Simple1(['hi', [], 1])));
-  });
-
-  it('testEqualsComplex', function() {
-    var data1 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
-    var data2 = ['a',,, [, 11], [[, 22], [, 34]],, ['s1', 's2'],, 1];
-    var data3 = ['a',,, [, 11], [[, 22]],, ['s1', 's2'],, 1];
-    var data4 = ['hi'];
-    var c1a = new proto.jspb.test.Complex(data1);
-    var c1b = new proto.jspb.test.Complex(data1);
-    var c2 = new proto.jspb.test.Complex(data2);
-    var c3 = new proto.jspb.test.Complex(data3);
-    var s1 = new proto.jspb.test.Simple1(data4);
-
-    assertTrue(jspb.Message.equals(c1a, c1b));
-    assertFalse(jspb.Message.equals(c1a, c2));
-    assertFalse(jspb.Message.equals(c2, c3));
-    assertFalse(jspb.Message.equals(c1a, s1));
-  });
-
-  it('testEqualsExtensionsConstructed', function() {
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([]),
-        new proto.jspb.test.HasExtensions([{}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}])
-    ));
-    assertFalse(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'b'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions([,,, {100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions([,,, {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi',,, {100: [{200: 'a'}]}])
-    ));
-    assertTrue(jspb.Message.equals(
-        new proto.jspb.test.HasExtensions(['hi',,, {100: [{200: 'a'}]}]),
-        new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}])
-    ));
-  });
-
-  it('testEqualsExtensionsUnconstructed', function() {
-    assertTrue(jspb.Message.compareFields([], [{}]));
-    assertTrue(jspb.Message.compareFields([,,, {}], []));
-    assertTrue(jspb.Message.compareFields([,,, {}], [,, {}]));
-    assertTrue(jspb.Message.compareFields(
-        ['hi', {100: [{200: 'a'}]}], ['hi', {100: [{200: 'a'}]}]));
-    assertFalse(jspb.Message.compareFields(
-        ['hi', {100: [{200: 'a'}]}], ['hi', {100: [{200: 'b'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        [{100: [{200: 'a'}]}], [{100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        [{100: [{200: 'a'}]}], [,,, {100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        [,,, {100: [{200: 'a'}]}], [{100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        ['hi', {100: [{200: 'a'}]}], ['hi',,, {100: [{200: 'a'}]}]));
-    assertTrue(jspb.Message.compareFields(
-        ['hi',,, {100: [{200: 'a'}]}], ['hi', {100: [{200: 'a'}]}]));
-  });
-
-  it('testToMap', function() {
-    var p1 = new proto.jspb.test.Simple1(['k', ['v']]);
-    var p2 = new proto.jspb.test.Simple1(['k1', ['v1', 'v2']]);
-    var soymap = jspb.Message.toMap([p1, p2],
-        proto.jspb.test.Simple1.prototype.getAString,
-        proto.jspb.test.Simple1.prototype.toObject);
-    assertEquals('k', soymap['k'].aString);
-    assertArrayEquals(['v'], soymap['k'].aRepeatedStringList);
-    var protomap = jspb.Message.toMap([p1, p2],
-        proto.jspb.test.Simple1.prototype.getAString);
-    assertEquals('k', protomap['k'].getAString());
-    assertArrayEquals(['v'], protomap['k'].getARepeatedStringList());
-  });
-
-  it('testClone', function() {
-    var supportsUint8Array =
-        !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
-    var original = new proto.jspb.test.TestClone();
-    original.setStr('v1');
-    var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
-    var simple2 = new proto.jspb.test.Simple1(['x2', ['y2', 'z2']]);
-    var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
-    original.setSimple1(simple1);
-    original.setSimple2List([simple2, simple3]);
-    var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
-    original.setBytesField(bytes1);
-    var extension = new proto.jspb.test.CloneExtension();
-    extension.setExt('e1');
-    original.setExtension(proto.jspb.test.IsExtension.extField, extension);
-    var clone = original.clone();
-    assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],,
-      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }],
-        clone.toArray());
-    clone.setStr('v2');
-    var simple4 = new proto.jspb.test.Simple1(['a1', ['b1', 'c1']]);
-    var simple5 = new proto.jspb.test.Simple1(['a2', ['b2', 'c2']]);
-    var simple6 = new proto.jspb.test.Simple1(['a3', ['b3', 'c3']]);
-    clone.setSimple1(simple4);
-    clone.setSimple2List([simple5, simple6]);
-    if (supportsUint8Array) {
-      clone.getBytesField()[0] = 4;
-      assertObjectEquals(bytes1, original.getBytesField());
-    }
-    var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
-    clone.setBytesField(bytes2);
-    var newExtension = new proto.jspb.test.CloneExtension();
-    newExtension.setExt('e2');
-    clone.setExtension(proto.jspb.test.CloneExtension.extField, newExtension);
-    assertArrayEquals(['v2',, ['a1', ['b1', 'c1']],,
-      [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]], bytes2,, { 100: [, 'e2'] }],
-        clone.toArray());
-    assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],,
-      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }],
-        original.toArray());
-  });
-
-  it('testCopyInto', function() {
-    var supportsUint8Array =
-        !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
-    var original = new proto.jspb.test.TestClone();
-    original.setStr('v1');
-    var dest = new proto.jspb.test.TestClone();
-    dest.setStr('override');
-    var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
-    var simple2 = new proto.jspb.test.Simple1(['x2', ['y2', 'z2']]);
-    var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
-    var destSimple1 = new proto.jspb.test.Simple1(['ox1', ['oy1', 'oz1']]);
-    var destSimple2 = new proto.jspb.test.Simple1(['ox2', ['oy2', 'oz2']]);
-    var destSimple3 = new proto.jspb.test.Simple1(['ox3', ['oy3', 'oz3']]);
-    original.setSimple1(simple1);
-    original.setSimple2List([simple2, simple3]);
-    dest.setSimple1(destSimple1);
-    dest.setSimple2List([destSimple2, destSimple3]);
-    var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
-    var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
-    original.setBytesField(bytes1);
-    dest.setBytesField(bytes2);
-    var extension = new proto.jspb.test.CloneExtension();
-    extension.setExt('e1');
-    original.setExtension(proto.jspb.test.CloneExtension.extField, extension);
-
-    jspb.Message.copyInto(original, dest);
-    assertArrayEquals(original.toArray(), dest.toArray());
-    assertEquals('x1', dest.getSimple1().getAString());
-    assertEquals('e1',
-        dest.getExtension(proto.jspb.test.CloneExtension.extField).getExt());
-    dest.getSimple1().setAString('new value');
-    assertNotEquals(dest.getSimple1().getAString(),
-        original.getSimple1().getAString());
-    if (supportsUint8Array) {
-      dest.getBytesField()[0] = 7;
-      assertObjectEquals(bytes1, original.getBytesField());
-      assertObjectEquals(new Uint8Array([7, 2, 3]), dest.getBytesField());
-    } else {
-      dest.setBytesField('789');
-      assertObjectEquals(bytes1, original.getBytesField());
-      assertObjectEquals('789', dest.getBytesField());
-    }
-    dest.getExtension(proto.jspb.test.CloneExtension.extField).
-        setExt('new value');
-    assertNotEquals(
-        dest.getExtension(proto.jspb.test.CloneExtension.extField).getExt(),
-        original.getExtension(
-            proto.jspb.test.CloneExtension.extField).getExt());
-  });
-
-  it('testCopyInto_notSameType', function() {
-    var a = new proto.jspb.test.TestClone();
-    var b = new proto.jspb.test.Simple1(['str', ['s1', 's2']]);
-
-    var e = assertThrows(function() {
-      jspb.Message.copyInto(a, b);
-    });
-    assertContains('should have the same type', e.message);
-  });
-
-  it('testExtensions', function() {
-    var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
-    var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2']]);
-    var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
-    extendable.setExtension(proto.jspb.test.IsExtension.extField, extension1);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.simple,
-                            extension2);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.str, 'xyzzy');
-    extendable.setExtension(proto.jspb.test.IndirectExtension.repeatedStrList,
-        ['a', 'b']);
-    var s1 = new proto.jspb.test.Simple1(['foo', ['s1', 's2']]);
-    var s2 = new proto.jspb.test.Simple1(['bar', ['t1', 't2']]);
-    extendable.setExtension(
-        proto.jspb.test.IndirectExtension.repeatedSimpleList,
-        [s1, s2]);
-    assertObjectEquals(extension1,
-        extendable.getExtension(proto.jspb.test.IsExtension.extField));
-    assertObjectEquals(extension2,
-        extendable.getExtension(proto.jspb.test.IndirectExtension.simple));
-    assertObjectEquals('xyzzy',
-        extendable.getExtension(proto.jspb.test.IndirectExtension.str));
-    assertObjectEquals(['a', 'b'], extendable.getExtension(
-        proto.jspb.test.IndirectExtension.repeatedStrList));
-    assertObjectEquals([s1, s2], extendable.getExtension(
-        proto.jspb.test.IndirectExtension.repeatedSimpleList));
-    // Not supported yet, but it should work...
-    extendable.setExtension(proto.jspb.test.IndirectExtension.simple, null);
-    assertNull(
-        extendable.getExtension(proto.jspb.test.IndirectExtension.simple));
-    extendable.setExtension(proto.jspb.test.IndirectExtension.str, null);
-    assertNull(extendable.getExtension(proto.jspb.test.IndirectExtension.str));
-
-
-    // Extension fields with jspb.ignore = true are ignored.
-    assertUndefined(proto.jspb.test.IndirectExtension['ignored']);
-    assertUndefined(proto.jspb.test.HasExtensions['ignoredFloating']);
-  });
-
-  it('testFloatingExtensions', function() {
-    // From an autogenerated container.
-    var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
-    var extension = new proto.jspb.test.Simple1(['foo', ['s1', 's2']]);
-    extendable.setExtension(proto.jspb.test.simple1, extension);
-    assertObjectEquals(extension,
-        extendable.getExtension(proto.jspb.test.simple1));
-
-    // From _lib mode.
-    extension = new proto.jspb.test.ExtensionMessage(['s1']);
-    extendable = new proto.jspb.test.TestExtensionsMessage([16]);
-    extendable.setExtension(proto.jspb.test.floatingMsgField, extension);
-    extendable.setExtension(proto.jspb.test.floatingStrField, 's2');
-    assertObjectEquals(extension,
-        extendable.getExtension(proto.jspb.test.floatingMsgField));
-    assertObjectEquals('s2',
-        extendable.getExtension(proto.jspb.test.floatingStrField));
-    assertNotUndefined(proto.jspb.exttest.floatingMsgField);
-    assertNotUndefined(proto.jspb.exttest.floatingMsgFieldTwo);
-    assertNotUndefined(proto.jspb.exttest.beta.floatingStrField);
-  });
-
-  it('testToObject_extendedObject', function() {
-    var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
-    var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2'], true]);
-    var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
-    extendable.setExtension(proto.jspb.test.IsExtension.extField, extension1);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.simple,
-                            extension2);
-    extendable.setExtension(proto.jspb.test.IndirectExtension.str, 'xyzzy');
-    extendable.setExtension(proto.jspb.test.IndirectExtension.repeatedStrList,
-        ['a', 'b']);
-    var s1 = new proto.jspb.test.Simple1(['foo', ['s1', 's2'], true]);
-    var s2 = new proto.jspb.test.Simple1(['bar', ['t1', 't2'], false]);
-    extendable.setExtension(
-        proto.jspb.test.IndirectExtension.repeatedSimpleList,
-        [s1, s2]);
-    assertObjectEquals({
-      str1: 'v1', str2: 'v2', str3: 'v3',
-      extField: { ext1: 'ext1field' },
-      simple: {
-        aString: 'str', aRepeatedStringList: ['s1', 's2'], aBoolean: true
-      },
-      str: 'xyzzy',
-      repeatedStrList: ['a', 'b'],
-      repeatedSimpleList: [
-        { aString: 'foo', aRepeatedStringList: ['s1', 's2'], aBoolean: true},
-        { aString: 'bar', aRepeatedStringList: ['t1', 't2'], aBoolean: false}
-      ]
-    }, extendable.toObject());
-
-    // Now, with instances included.
-    assertObjectEquals({
-      str1: 'v1', str2: 'v2', str3: 'v3',
-      extField: {
-        ext1: 'ext1field',
-        $jspbMessageInstance:
-            extendable.getExtension(proto.jspb.test.IsExtension.extField)
-      },
-      simple: {
-        aString: 'str',
-        aRepeatedStringList: ['s1', 's2'],
-        aBoolean: true,
-        $jspbMessageInstance:
-            extendable.getExtension(proto.jspb.test.IndirectExtension.simple)
-      },
-      str: 'xyzzy',
-      repeatedStrList: ['a', 'b'],
-      repeatedSimpleList: [{
-        aString: 'foo',
-        aRepeatedStringList: ['s1', 's2'],
-        aBoolean: true,
-        $jspbMessageInstance: s1
-      }, {
-        aString: 'bar',
-        aRepeatedStringList: ['t1', 't2'],
-        aBoolean: false,
-        $jspbMessageInstance: s2
-      }],
-      $jspbMessageInstance: extendable
-    }, extendable.toObject(true /* opt_includeInstance */));
-  });
-
-  it('testInitialization_emptyArray', function() {
-    var msg = new proto.jspb.test.HasExtensions([]);
-    assertArrayEquals([], msg.toArray());
-  });
-
-  it('testInitialization_justExtensionObject', function() {
-    var msg = new proto.jspb.test.Empty([{1: 'hi'}]);
-    // The extensionObject is not moved from its original location.
-    assertArrayEquals([{1: 'hi'}], msg.toArray());
-  });
-
-  it('testInitialization_incompleteList', function() {
-    var msg = new proto.jspb.test.Empty([1, {4: 'hi'}]);
-    // The extensionObject is not moved from its original location.
-    assertArrayEquals([1, {4: 'hi'}], msg.toArray());
-  });
-
-  it('testInitialization_forwardCompatible', function() {
-    var msg = new proto.jspb.test.Empty([1, 2, 3, {1: 'hi'}]);
-    assertArrayEquals([1, 2, 3, {1: 'hi'}], msg.toArray());
-  });
-
-  it('testExtendedMessageEnsureObject',
-     /** @suppress {visibility} */ function() {
-       var data =
-           new proto.jspb.test.HasExtensions(['str1', {'a_key': 'an_object'}]);
-       assertEquals('an_object', data.extensionObject_['a_key']);
-     });
-
-  it('testToObject_hasExtensionField', function() {
-    var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]);
-    var obj = data.toObject();
-    assertEquals('str1', obj.str1);
-    assertEquals('ext1', obj.extField.ext1);
-  });
-
-  it('testGetExtension', function() {
-    var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]);
-    assertEquals('str1', data.getStr1());
-    var extension = data.getExtension(proto.jspb.test.IsExtension.extField);
-    assertNotNull(extension);
-    assertEquals('ext1', extension.getExt1());
-  });
-
-  it('testSetExtension', function() {
-    var data = new proto.jspb.test.HasExtensions();
-    var extensionMessage = new proto.jspb.test.IsExtension(['is_extension']);
-    data.setExtension(proto.jspb.test.IsExtension.extField, extensionMessage);
-    var obj = data.toObject();
-    assertNotNull(
-        data.getExtension(proto.jspb.test.IsExtension.extField));
-    assertEquals('is_extension', obj.extField.ext1);
-  });
-
-  /**
-   * Note that group is long deprecated, we only support it because JsPb has
-   * a goal of being able to generate JS classes for all proto descriptors.
-   */
-  it('testGroups', function() {
-    var group = new proto.jspb.test.TestGroup();
-    var someGroup = new proto.jspb.test.TestGroup.RepeatedGroup();
-    someGroup.setId('g1');
-    someGroup.setSomeBoolList([true, false]);
-    group.setRepeatedGroupList([someGroup]);
-    var groups = group.getRepeatedGroupList();
-    assertEquals('g1', groups[0].getId());
-    assertObjectEquals([true, false], groups[0].getSomeBoolList());
-    assertObjectEquals({id: 'g1', someBoolList: [true, false]},
-        groups[0].toObject());
-    assertObjectEquals({
-      repeatedGroupList: [{id: 'g1', someBoolList: [true, false]}],
-      requiredGroup: {id: undefined},
-      optionalGroup: undefined,
-      requiredSimple: {aRepeatedStringList: [], aString: undefined},
-      optionalSimple: undefined,
-      id: undefined
-    }, group.toObject());
-    var group1 = new proto.jspb.test.TestGroup1();
-    group1.setGroup(someGroup);
-    assertEquals(someGroup, group1.getGroup());
-  });
-
-  it('testNonExtensionFieldsAfterExtensionRange', function() {
-    var data = [{'1': 'a_string'}];
-    var message = new proto.jspb.test.Complex(data);
-    assertArrayEquals([], message.getARepeatedStringList());
-  });
-
-  it('testReservedGetterNames', function() {
-    var message = new proto.jspb.test.TestReservedNames();
-    message.setExtension$(11);
-    message.setExtension(proto.jspb.test.TestReservedNamesExtension.foo, 12);
-    assertEquals(11, message.getExtension$());
-    assertEquals(12, message.getExtension(
-        proto.jspb.test.TestReservedNamesExtension.foo));
-    assertObjectEquals({extension: 11, foo: 12}, message.toObject());
-  });
-
-  it('testInitializeMessageWithUnsetOneof', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof([]);
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.
-            PARTIAL_ONEOF_NOT_SET,
-        message.getPartialOneofCase());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.
-            RECURSIVE_ONEOF_NOT_SET,
-        message.getRecursiveOneofCase());
-  });
-
-  it('testInitializeMessageWithSingleValueSetInOneof', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof([,, 'x']);
-
-    assertEquals('x', message.getPone());
-    assertEquals('', message.getPthree());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
-        message.getPartialOneofCase());
-  });
-
-  it('testKeepsLastWireValueSetInUnion_multipleValues', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof([,, 'x',, 'y']);
-
-    assertEquals('', message.getPone());
-    assertEquals('y', message.getPthree());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PTHREE,
-        message.getPartialOneofCase());
-  });
-
-  it('testSettingOneofFieldClearsOthers', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals('', message.getPone());
-    assertEquals('', message.getPthree());
-    assertFalse(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPone('hi');
-    assertEquals('hi', message.getPone());
-    assertEquals('', message.getPthree());
-    assertTrue(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPthree('bye');
-    assertEquals('', message.getPone());
-    assertEquals('bye', message.getPthree());
-    assertFalse(message.hasPone());
-    assertTrue(message.hasPthree());
-  });
-
-  it('testSettingOneofFieldDoesNotClearFieldsFromOtherUnions', function() {
-    var other = new proto.jspb.test.TestMessageWithOneof;
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals('', message.getPone());
-    assertEquals('', message.getPthree());
-    assertUndefined(message.getRone());
-    assertFalse(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPone('hi');
-    message.setRone(other);
-    assertEquals('hi', message.getPone());
-    assertEquals('', message.getPthree());
-    assertEquals(other, message.getRone());
-    assertTrue(message.hasPone());
-    assertFalse(message.hasPthree());
-
-    message.setPthree('bye');
-    assertEquals('', message.getPone());
-    assertEquals('bye', message.getPthree());
-    assertEquals(other, message.getRone());
-    assertFalse(message.hasPone());
-    assertTrue(message.hasPthree());
-  });
-
-  it('testUnsetsOneofCaseWhenFieldIsCleared', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.
-            PARTIAL_ONEOF_NOT_SET,
-        message.getPartialOneofCase());
-
-    message.setPone('hi');
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
-        message.getPartialOneofCase());
-
-    message.clearPone();
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.
-            PARTIAL_ONEOF_NOT_SET,
-        message.getPartialOneofCase());
-  });
-
-  it('testMessageWithDefaultOneofValues', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(1234, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase
-            .DEFAULT_ONEOF_A_NOT_SET,
-        message.getDefaultOneofACase());
-
-    message.setAone(567);
-    assertEquals(567, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE,
-        message.getDefaultOneofACase());
-
-    message.setAtwo(890);
-    assertEquals(1234, message.getAone());
-    assertEquals(890, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.ATWO,
-        message.getDefaultOneofACase());
-
-    message.clearAtwo();
-    assertEquals(1234, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase
-            .DEFAULT_ONEOF_A_NOT_SET,
-        message.getDefaultOneofACase());
-  });
-
-  it('testMessageWithDefaultOneofValues_defaultNotOnFirstField', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(0, message.getBone());
-    assertEquals(1234, message.getBtwo());
-    assertFalse(message.hasBone());
-    assertFalse(message.hasBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase
-            .DEFAULT_ONEOF_B_NOT_SET,
-        message.getDefaultOneofBCase());
-
-    message.setBone(2);
-    assertEquals(2, message.getBone());
-    assertEquals(1234, message.getBtwo());
-    assertTrue(message.hasBone());
-    assertFalse(message.hasBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BONE,
-        message.getDefaultOneofBCase());
-
-    message.setBtwo(3);
-    assertEquals(0, message.getBone());
-    assertFalse(message.hasBone());
-    assertTrue(message.hasBtwo());
-    assertEquals(3, message.getBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
-        message.getDefaultOneofBCase());
-
-    message.clearBtwo();
-    assertEquals(0, message.getBone());
-    assertFalse(message.hasBone());
-    assertFalse(message.hasBtwo());
-    assertEquals(1234, message.getBtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase
-            .DEFAULT_ONEOF_B_NOT_SET,
-        message.getDefaultOneofBCase());
-  });
-
-  it('testInitializeMessageWithOneofDefaults', function() {
-    var message =
-        new proto.jspb.test.TestMessageWithOneof(new Array(9).concat(567));
-    assertEquals(567, message.getAone());
-    assertEquals(0, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE,
-        message.getDefaultOneofACase());
-
-    message =
-        new proto.jspb.test.TestMessageWithOneof(new Array(10).concat(890));
-    assertEquals(1234, message.getAone());
-    assertEquals(890, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.ATWO,
-        message.getDefaultOneofACase());
-
-    message =
-        new proto.jspb.test.TestMessageWithOneof(new Array(9).concat(567, 890));
-    assertEquals(1234, message.getAone());
-    assertEquals(890, message.getAtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.ATWO,
-        message.getDefaultOneofACase());
-  });
-
-  it('testInitializeMessageWithOneofDefaults_defaultNotSetOnFirstField',
-      function() {
-        var message;
-
-        message =
-            new proto.jspb.test.TestMessageWithOneof(new Array(11).concat(567));
-        assertEquals(567, message.getBone());
-        assertEquals(1234, message.getBtwo());
-        assertEquals(
-            proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BONE,
-            message.getDefaultOneofBCase());
-
-        message =
-            new proto.jspb.test.TestMessageWithOneof(new Array(12).concat(890));
-        assertEquals(0, message.getBone());
-        assertEquals(890, message.getBtwo());
-        assertEquals(
-            proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
-            message.getDefaultOneofBCase());
-
-        message = new proto.jspb.test.TestMessageWithOneof(
-            new Array(11).concat(567, 890));
-        assertEquals(0, message.getBone());
-        assertEquals(890, message.getBtwo());
-        assertEquals(
-            proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
-            message.getDefaultOneofBCase());
-      });
-
-  it('testOneofContainingAnotherMessage', function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.
-            RECURSIVE_ONEOF_NOT_SET,
-        message.getRecursiveOneofCase());
-
-    var other = new proto.jspb.test.TestMessageWithOneof;
-    message.setRone(other);
-    assertEquals(other, message.getRone());
-    assertEquals('', message.getRtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.RONE,
-        message.getRecursiveOneofCase());
-
-    message.setRtwo('hi');
-    assertUndefined(message.getRone());
-    assertEquals('hi', message.getRtwo());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.RTWO,
-        message.getRecursiveOneofCase());
-  });
-
-  it('testQueryingOneofCaseEnsuresOnlyOneFieldIsSetInUnderlyingArray',
-     function() {
-    var message = new proto.jspb.test.TestMessageWithOneof;
-    message.setPone('x');
-    assertEquals('x', message.getPone());
-    assertEquals('', message.getPthree());
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
-        message.getPartialOneofCase());
-
-    var array = message.toArray();
-    assertEquals('x', array[2]);
-    assertUndefined(array[4]);
-    array[4] = 'y';
-
-    assertEquals(
-        proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PTHREE,
-        message.getPartialOneofCase());
-    assertUndefined(array[2]);
-    assertEquals('y', array[4]);
-  });
-
-  it('testFloatingPointFieldsSupportNan', function() {
-    var assertNan = function(x) {
-      assertTrue('Expected ' + x + ' (' + goog.typeOf(x) + ') to be NaN.',
-          goog.isNumber(x) && isNaN(x));
-    };
-
-    var message = new proto.jspb.test.FloatingPointFields([
-      'NaN', 'NaN', ['NaN', 'NaN'], 'NaN',
-      'NaN', 'NaN', ['NaN', 'NaN'], 'NaN'
-    ]);
-    assertNan(message.getOptionalFloatField());
-    assertNan(message.getRequiredFloatField());
-    assertNan(message.getRepeatedFloatFieldList()[0]);
-    assertNan(message.getRepeatedFloatFieldList()[1]);
-    assertNan(message.getDefaultFloatField());
-    assertNan(message.getOptionalDoubleField());
-    assertNan(message.getRequiredDoubleField());
-    assertNan(message.getRepeatedDoubleFieldList()[0]);
-    assertNan(message.getRepeatedDoubleFieldList()[1]);
-    assertNan(message.getDefaultDoubleField());
-  });
-
-});
diff --git a/js/compatibility_tests/v3.1.0/proto3_test.js b/js/compatibility_tests/v3.1.0/proto3_test.js
deleted file mode 100644
index 3c929ef..0000000
--- a/js/compatibility_tests/v3.1.0/proto3_test.js
+++ /dev/null
@@ -1,329 +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.
-
-goog.require('goog.crypt.base64');
-goog.require('goog.testing.asserts');
-
-// CommonJS-LoadFromFile: testbinary_pb proto.jspb.test
-goog.require('proto.jspb.test.ForeignMessage');
-
-// CommonJS-LoadFromFile: proto3_test_pb proto.jspb.test
-goog.require('proto.jspb.test.Proto3Enum');
-goog.require('proto.jspb.test.TestProto3');
-
-
-var BYTES = new Uint8Array([1, 2, 8, 9]);
-var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES);
-
-
-/**
- * Helper: compare a bytes field to an expected value
- * @param {Uint8Array|string} arr
- * @param {Uint8Array} expected
- * @return {boolean}
- */
-function bytesCompare(arr, expected) {
-  if (goog.isString(arr)) {
-    arr = goog.crypt.base64.decodeStringToUint8Array(arr);
-  }
-  if (arr.length != expected.length) {
-    return false;
-  }
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] != expected[i]) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-describe('proto3Test', function() {
-  /**
-   * Test defaults for proto3 message fields.
-   */
-  it('testProto3FieldDefaults', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    assertEquals(msg.getOptionalInt32(), 0);
-    assertEquals(msg.getOptionalInt64(), 0);
-    assertEquals(msg.getOptionalUint32(), 0);
-    assertEquals(msg.getOptionalUint64(), 0);
-    assertEquals(msg.getOptionalSint32(), 0);
-    assertEquals(msg.getOptionalSint64(), 0);
-    assertEquals(msg.getOptionalFixed32(), 0);
-    assertEquals(msg.getOptionalFixed64(), 0);
-    assertEquals(msg.getOptionalSfixed32(), 0);
-    assertEquals(msg.getOptionalSfixed64(), 0);
-    assertEquals(msg.getOptionalFloat(), 0);
-    assertEquals(msg.getOptionalDouble(), 0);
-    assertEquals(msg.getOptionalString(), '');
-
-    // TODO(b/26173701): when we change bytes fields default getter to return
-    // Uint8Array, we'll want to switch this assertion to match the u8 case.
-    assertEquals(typeof msg.getOptionalBytes(), 'string');
-    assertEquals(msg.getOptionalBytes_asU8() instanceof Uint8Array, true);
-    assertEquals(typeof msg.getOptionalBytes_asB64(), 'string');
-    assertEquals(msg.getOptionalBytes().length, 0);
-    assertEquals(msg.getOptionalBytes_asU8().length, 0);
-    assertEquals(msg.getOptionalBytes_asB64(), '');
-
-    assertEquals(msg.getOptionalForeignEnum(),
-                 proto.jspb.test.Proto3Enum.PROTO3_FOO);
-    assertEquals(msg.getOptionalForeignMessage(), undefined);
-    assertEquals(msg.getOptionalForeignMessage(), undefined);
-
-    assertEquals(msg.getRepeatedInt32List().length, 0);
-    assertEquals(msg.getRepeatedInt64List().length, 0);
-    assertEquals(msg.getRepeatedUint32List().length, 0);
-    assertEquals(msg.getRepeatedUint64List().length, 0);
-    assertEquals(msg.getRepeatedSint32List().length, 0);
-    assertEquals(msg.getRepeatedSint64List().length, 0);
-    assertEquals(msg.getRepeatedFixed32List().length, 0);
-    assertEquals(msg.getRepeatedFixed64List().length, 0);
-    assertEquals(msg.getRepeatedSfixed32List().length, 0);
-    assertEquals(msg.getRepeatedSfixed64List().length, 0);
-    assertEquals(msg.getRepeatedFloatList().length, 0);
-    assertEquals(msg.getRepeatedDoubleList().length, 0);
-    assertEquals(msg.getRepeatedStringList().length, 0);
-    assertEquals(msg.getRepeatedBytesList().length, 0);
-    assertEquals(msg.getRepeatedForeignEnumList().length, 0);
-    assertEquals(msg.getRepeatedForeignMessageList().length, 0);
-
-  });
-
-
-  /**
-   * Test that all fields can be set and read via a serialization roundtrip.
-   */
-  it('testProto3FieldSetGet', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    msg.setOptionalInt32(-42);
-    msg.setOptionalInt64(-0x7fffffff00000000);
-    msg.setOptionalUint32(0x80000000);
-    msg.setOptionalUint64(0xf000000000000000);
-    msg.setOptionalSint32(-100);
-    msg.setOptionalSint64(-0x8000000000000000);
-    msg.setOptionalFixed32(1234);
-    msg.setOptionalFixed64(0x1234567800000000);
-    msg.setOptionalSfixed32(-1234);
-    msg.setOptionalSfixed64(-0x1234567800000000);
-    msg.setOptionalFloat(1.5);
-    msg.setOptionalDouble(-1.5);
-    msg.setOptionalBool(true);
-    msg.setOptionalString('hello world');
-    msg.setOptionalBytes(BYTES);
-    var submsg = new proto.jspb.test.ForeignMessage();
-    submsg.setC(16);
-    msg.setOptionalForeignMessage(submsg);
-    msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_BAR);
-
-    msg.setRepeatedInt32List([-42]);
-    msg.setRepeatedInt64List([-0x7fffffff00000000]);
-    msg.setRepeatedUint32List([0x80000000]);
-    msg.setRepeatedUint64List([0xf000000000000000]);
-    msg.setRepeatedSint32List([-100]);
-    msg.setRepeatedSint64List([-0x8000000000000000]);
-    msg.setRepeatedFixed32List([1234]);
-    msg.setRepeatedFixed64List([0x1234567800000000]);
-    msg.setRepeatedSfixed32List([-1234]);
-    msg.setRepeatedSfixed64List([-0x1234567800000000]);
-    msg.setRepeatedFloatList([1.5]);
-    msg.setRepeatedDoubleList([-1.5]);
-    msg.setRepeatedBoolList([true]);
-    msg.setRepeatedStringList(['hello world']);
-    msg.setRepeatedBytesList([BYTES]);
-    submsg = new proto.jspb.test.ForeignMessage();
-    submsg.setC(1000);
-    msg.setRepeatedForeignMessageList([submsg]);
-    msg.setRepeatedForeignEnumList([proto.jspb.test.Proto3Enum.PROTO3_BAR]);
-
-    msg.setOneofString('asdf');
-
-    var serialized = msg.serializeBinary();
-    msg = proto.jspb.test.TestProto3.deserializeBinary(serialized);
-
-    assertEquals(msg.getOptionalInt32(), -42);
-    assertEquals(msg.getOptionalInt64(), -0x7fffffff00000000);
-    assertEquals(msg.getOptionalUint32(), 0x80000000);
-    assertEquals(msg.getOptionalUint64(), 0xf000000000000000);
-    assertEquals(msg.getOptionalSint32(), -100);
-    assertEquals(msg.getOptionalSint64(), -0x8000000000000000);
-    assertEquals(msg.getOptionalFixed32(), 1234);
-    assertEquals(msg.getOptionalFixed64(), 0x1234567800000000);
-    assertEquals(msg.getOptionalSfixed32(), -1234);
-    assertEquals(msg.getOptionalSfixed64(), -0x1234567800000000);
-    assertEquals(msg.getOptionalFloat(), 1.5);
-    assertEquals(msg.getOptionalDouble(), -1.5);
-    assertEquals(msg.getOptionalBool(), true);
-    assertEquals(msg.getOptionalString(), 'hello world');
-    assertEquals(true, bytesCompare(msg.getOptionalBytes(), BYTES));
-    assertEquals(msg.getOptionalForeignMessage().getC(), 16);
-    assertEquals(msg.getOptionalForeignEnum(),
-        proto.jspb.test.Proto3Enum.PROTO3_BAR);
-
-    assertElementsEquals(msg.getRepeatedInt32List(), [-42]);
-    assertElementsEquals(msg.getRepeatedInt64List(), [-0x7fffffff00000000]);
-    assertElementsEquals(msg.getRepeatedUint32List(), [0x80000000]);
-    assertElementsEquals(msg.getRepeatedUint64List(), [0xf000000000000000]);
-    assertElementsEquals(msg.getRepeatedSint32List(), [-100]);
-    assertElementsEquals(msg.getRepeatedSint64List(), [-0x8000000000000000]);
-    assertElementsEquals(msg.getRepeatedFixed32List(), [1234]);
-    assertElementsEquals(msg.getRepeatedFixed64List(), [0x1234567800000000]);
-    assertElementsEquals(msg.getRepeatedSfixed32List(), [-1234]);
-    assertElementsEquals(msg.getRepeatedSfixed64List(), [-0x1234567800000000]);
-    assertElementsEquals(msg.getRepeatedFloatList(), [1.5]);
-    assertElementsEquals(msg.getRepeatedDoubleList(), [-1.5]);
-    assertElementsEquals(msg.getRepeatedBoolList(), [true]);
-    assertElementsEquals(msg.getRepeatedStringList(), ['hello world']);
-    assertEquals(msg.getRepeatedBytesList().length, 1);
-    assertEquals(true, bytesCompare(msg.getRepeatedBytesList()[0], BYTES));
-    assertEquals(msg.getRepeatedForeignMessageList().length, 1);
-    assertEquals(msg.getRepeatedForeignMessageList()[0].getC(), 1000);
-    assertElementsEquals(msg.getRepeatedForeignEnumList(),
-        [proto.jspb.test.Proto3Enum.PROTO3_BAR]);
-
-    assertEquals(msg.getOneofString(), 'asdf');
-  });
-
-
-  /**
-   * Test that oneofs continue to have a notion of field presence.
-   */
-  it('testOneofs', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    msg.setOneofUint32(42);
-    assertEquals(msg.getOneofUint32(), 42);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
-    assertTrue(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-
-    var submsg = new proto.jspb.test.ForeignMessage();
-    msg.setOneofForeignMessage(submsg);
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), submsg);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    msg.setOneofString('hello');
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), 'hello');
-    assertEquals(msg.getOneofBytes(), '');
-    assertFalse(msg.hasOneofUint32());
-    assertTrue(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    msg.setOneofBytes(goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    assertEquals(msg.getOneofUint32(), 0);
-    assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes_asB64(),
-        goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofString());
-    assertTrue(msg.hasOneofBytes());
-  });
-
-
-  /**
-   * Test that "default"-valued primitive fields are not emitted on the wire.
-   */
-  it('testNoSerializeDefaults', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    // Set each primitive to a non-default value, then back to its default, to
-    // ensure that the serialization is actually checking the value and not just
-    // whether it has ever been set.
-    msg.setOptionalInt32(42);
-    msg.setOptionalInt32(0);
-    msg.setOptionalDouble(3.14);
-    msg.setOptionalDouble(0.0);
-    msg.setOptionalBool(true);
-    msg.setOptionalBool(false);
-    msg.setOptionalString('hello world');
-    msg.setOptionalString('');
-    msg.setOptionalBytes(goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    msg.setOptionalBytes('');
-    msg.setOptionalForeignMessage(new proto.jspb.test.ForeignMessage());
-    msg.setOptionalForeignMessage(null);
-    msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_BAR);
-    msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_FOO);
-    msg.setOneofUint32(32);
-    msg.clearOneofUint32();
-
-
-    var serialized = msg.serializeBinary();
-    assertEquals(0, serialized.length);
-  });
-
-  /**
-   * Test that base64 string and Uint8Array are interchangeable in bytes fields.
-   */
-  it('testBytesFieldsInterop', function() {
-    var msg = new proto.jspb.test.TestProto3();
-    // Set as a base64 string and check all the getters work.
-    msg.setOptionalBytes(BYTES_B64);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    // Test binary serialize round trip doesn't break it.
-    msg = proto.jspb.test.TestProto3.deserializeBinary(msg.serializeBinary());
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-    msg = new proto.jspb.test.TestProto3();
-    // Set as a Uint8Array and check all the getters work.
-    msg.setOptionalBytes(BYTES);
-    assertTrue(bytesCompare(msg.getOptionalBytes_asU8(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes_asB64(), BYTES));
-    assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
-
-  });
-});
diff --git a/js/compatibility_tests/v3.1.0/proto3_test.proto b/js/compatibility_tests/v3.1.0/proto3_test.proto
deleted file mode 100644
index acb6716..0000000
--- a/js/compatibility_tests/v3.1.0/proto3_test.proto
+++ /dev/null
@@ -1,89 +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.
-
-syntax = "proto3";
-
-import "testbinary.proto";
-
-package jspb.test;
-
-message TestProto3 {
-     int32 optional_int32    =  1;
-     int64 optional_int64    =  2;
-    uint32 optional_uint32   =  3;
-    uint64 optional_uint64   =  4;
-    sint32 optional_sint32   =  5;
-    sint64 optional_sint64   =  6;
-   fixed32 optional_fixed32  =  7;
-   fixed64 optional_fixed64  =  8;
-  sfixed32 optional_sfixed32 =  9;
-  sfixed64 optional_sfixed64 = 10;
-     float optional_float    = 11;
-    double optional_double   = 12;
-      bool optional_bool     = 13;
-    string optional_string   = 14;
-     bytes optional_bytes    = 15;
-
-  ForeignMessage optional_foreign_message = 19;
-  Proto3Enum     optional_foreign_enum    = 22;
-
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated ForeignMessage repeated_foreign_message = 49;
-  repeated Proto3Enum     repeated_foreign_enum    = 52;
-
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    ForeignMessage oneof_foreign_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-  }
-}
-
-enum Proto3Enum {
-  PROTO3_FOO = 0;
-  PROTO3_BAR = 1;
-  PROTO3_BAZ = 2;
-}
diff --git a/js/compatibility_tests/v3.1.0/test.proto b/js/compatibility_tests/v3.1.0/test.proto
deleted file mode 100644
index 48cb37e..0000000
--- a/js/compatibility_tests/v3.1.0/test.proto
+++ /dev/null
@@ -1,262 +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.
-
-// Author: mwr@google.com (Mark Rawling)
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-import "google/protobuf/descriptor.proto";
-
-package jspb.test;
-
-message Empty {
-}
-
-enum OuterEnum {
-  FOO = 1;
-  BAR = 2;
-}
-
-message EnumContainer {
-  optional OuterEnum outer_enum = 1;
-}
-
-message Simple1 {
-  required string a_string = 1;
-  repeated string a_repeated_string = 2;
-  optional bool a_boolean = 3;
-}
-
-// A message that differs from Simple1 only by name
-message Simple2 {
-  required string a_string = 1;
-  repeated string a_repeated_string = 2;
-}
-
-message SpecialCases {
-  required string normal = 1;
-  // Examples of Js reserved names that are converted to pb_<name>.
-  required string default = 2;
-  required string function = 3;
-  required string var = 4;
-}
-
-message OptionalFields {
-  message Nested {
-    optional int32 an_int = 1;
-  }
-  optional string a_string = 1;
-  required bool a_bool = 2;
-  optional Nested a_nested_message = 3;
-  repeated Nested a_repeated_message = 4;
-  repeated string a_repeated_string = 5;
-}
-
-message HasExtensions {
-  optional string str1 = 1;
-  optional string str2 = 2;
-  optional string str3 = 3;
-  extensions 10 to max;
-}
-
-message Complex {
-  message Nested {
-    required int32 an_int = 2;
-  }
-  required string a_string = 1;
-  required bool an_out_of_order_bool = 9;
-  optional Nested a_nested_message = 4;
-  repeated Nested a_repeated_message = 5;
-  repeated string a_repeated_string = 7;
-}
-
-message OuterMessage {
-  // Make sure this doesn't conflict with the other Complex message.
-  message Complex {
-    optional int32 inner_complex_field = 1;
-  }
-}
-
-message IsExtension {
-  extend HasExtensions {
-    optional IsExtension ext_field = 100;
-  }
-  optional string ext1 = 1;
-
-  // Extensions of proto2 Descriptor messages will be ignored.
-  extend google.protobuf.EnumOptions {
-    optional string simple_option = 42113038;
-  }
-}
-
-message IndirectExtension {
-  extend HasExtensions {
-    optional Simple1 simple = 101;
-    optional string str = 102;
-    repeated string repeated_str = 103;
-    repeated Simple1 repeated_simple = 104;
-  }
-}
-
-extend HasExtensions {
-  optional Simple1 simple1 = 105;
-}
-
-message DefaultValues {
-  enum Enum {
-    E1 = 13;
-    E2 = 77;
-  }
-  optional string string_field = 1 [default="default<>\'\"abc"];
-  optional bool bool_field = 2 [default=true];
-  optional int64 int_field = 3 [default=11];
-  optional Enum enum_field = 4 [default=E1];
-  optional string empty_field = 6 [default=""];
-  optional bytes bytes_field = 8 [default="moo"]; // Base64 encoding is "bW9v"
-}
-
-message FloatingPointFields {
-  optional float optional_float_field = 1;
-  required float required_float_field = 2;
-  repeated float repeated_float_field = 3;
-  optional float default_float_field = 4 [default = 2.0];
-  optional double optional_double_field = 5;
-  required double required_double_field = 6;
-  repeated double repeated_double_field = 7;
-  optional double default_double_field = 8 [default = 2.0];
-}
-
-message TestClone {
-  optional string str = 1;
-  optional Simple1 simple1 = 3;
-  repeated Simple1 simple2 = 5;
-  optional bytes bytes_field = 6;
-  optional string unused = 7;
-  extensions 10 to max;
-}
-
-message CloneExtension {
-  extend TestClone {
-    optional CloneExtension ext_field = 100;
-  }
-  optional string ext = 2;
-}
-
-message TestGroup {
-  repeated group RepeatedGroup = 1 {
-    required string id = 1;
-    repeated bool some_bool = 2;
-  }
-  required group RequiredGroup = 2 {
-    required string id = 1;
-  }
-  optional group OptionalGroup = 3 {
-    required string id = 1;
-  }
-  optional string id = 4;
-  required Simple2 required_simple = 5;
-  optional Simple2 optional_simple = 6;
-}
-
-message TestGroup1 {
-  optional TestGroup.RepeatedGroup group = 1;
-}
-
-message TestReservedNames {
-  optional int32 extension = 1;
-  extensions 10 to max;
-}
-
-message TestReservedNamesExtension {
-  extend TestReservedNames {
-    optional int32 foo = 10;
-  }
-}
-
-message TestMessageWithOneof {
-
-  oneof partial_oneof {
-    string pone = 3;
-    string pthree = 5;
-  }
-
-  oneof recursive_oneof {
-    TestMessageWithOneof rone = 6;
-    string rtwo = 7;
-  }
-
-  optional bool normal_field = 8;
-  repeated string repeated_field = 9;
-
-  oneof default_oneof_a {
-    int32 aone = 10 [default = 1234];
-    int32 atwo = 11;
-  }
-
-  oneof default_oneof_b {
-    int32 bone = 12;
-    int32 btwo = 13 [default = 1234];
-  }
-}
-
-message TestEndsWithBytes {
-  optional int32 value = 1;
-  optional bytes data = 2;
-}
-
-message TestMapFieldsNoBinary {
-  map<string, string> map_string_string = 1;
-  map<string, int32> map_string_int32 = 2;
-  map<string, int64> map_string_int64 = 3;
-  map<string, bool> map_string_bool = 4;
-  map<string, double> map_string_double = 5;
-  map<string, MapValueEnumNoBinary> map_string_enum = 6;
-  map<string, MapValueMessageNoBinary> map_string_msg = 7;
-
-  map<int32, string> map_int32_string = 8;
-  map<int64, string> map_int64_string = 9;
-  map<bool, string> map_bool_string = 10;
-
-  optional TestMapFieldsNoBinary test_map_fields = 11;
-  map<string, TestMapFieldsNoBinary> map_string_testmapfields = 12;
-}
-
-enum MapValueEnumNoBinary {
-  MAP_VALUE_FOO_NOBINARY = 0;
-  MAP_VALUE_BAR_NOBINARY = 1;
-  MAP_VALUE_BAZ_NOBINARY = 2;
-}
-
-message MapValueMessageNoBinary {
-  optional int32 foo = 1;
-}
diff --git a/js/compatibility_tests/v3.1.0/test2.proto b/js/compatibility_tests/v3.1.0/test2.proto
deleted file mode 100644
index 44e55ef..0000000
--- a/js/compatibility_tests/v3.1.0/test2.proto
+++ /dev/null
@@ -1,54 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.test;
-
-message TestExtensionsMessage {
-  optional int32 intfield = 1;
-  extensions 100 to max;
-}
-
-message ExtensionMessage {
-  extend TestExtensionsMessage {
-    optional ExtensionMessage ext_field = 100;
-  }
-  optional string ext1 = 1;
-}
-
-// Floating extensions are only supported when generating a _lib.js library.
-extend TestExtensionsMessage {
-  optional ExtensionMessage floating_msg_field = 101;
-  optional string floating_str_field = 102;
-}
diff --git a/js/compatibility_tests/v3.1.0/test3.proto b/js/compatibility_tests/v3.1.0/test3.proto
deleted file mode 100644
index 940a552..0000000
--- a/js/compatibility_tests/v3.1.0/test3.proto
+++ /dev/null
@@ -1,53 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest;
-
-message TestExtensionsMessage {
-  optional int32 intfield = 1;
-  extensions 100 to max;
-}
-
-message ExtensionMessage {
-  extend TestExtensionsMessage {
-    optional ExtensionMessage ext_field = 100;
-  }
-  optional string ext1 = 1;
-}
-
-extend TestExtensionsMessage {
-  optional ExtensionMessage floating_msg_field = 101;
-  optional string floating_str_field = 102;
-}
diff --git a/js/compatibility_tests/v3.1.0/test4.proto b/js/compatibility_tests/v3.1.0/test4.proto
deleted file mode 100644
index cf2451e..0000000
--- a/js/compatibility_tests/v3.1.0/test4.proto
+++ /dev/null
@@ -1,42 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest;
-
-import "test3.proto";
-
-extend TestExtensionsMessage {
-  optional ExtensionMessage floating_msg_field_two = 103;
-}
diff --git a/js/compatibility_tests/v3.1.0/test5.proto b/js/compatibility_tests/v3.1.0/test5.proto
deleted file mode 100644
index 3497951..0000000
--- a/js/compatibility_tests/v3.1.0/test5.proto
+++ /dev/null
@@ -1,44 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest.beta;
-
-message TestBetaExtensionsMessage {
-  extensions 100 to max;
-}
-
-extend TestBetaExtensionsMessage {
-  optional string floating_str_field = 101;
-}
diff --git a/js/compatibility_tests/v3.1.0/testbinary.proto b/js/compatibility_tests/v3.1.0/testbinary.proto
deleted file mode 100644
index 116f17f..0000000
--- a/js/compatibility_tests/v3.1.0/testbinary.proto
+++ /dev/null
@@ -1,212 +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.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-
-package jspb.test;
-
-// These types are borrowed from `unittest.proto` in the protobuf tree. We want
-// to ensure that the binary-format support will handle all field types
-// properly.
-message TestAllTypes {
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional ForeignMessage                       optional_foreign_message = 19;
-  optional ForeignEnum                          optional_foreign_enum    = 22;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-
-  // Packed repeated
-  repeated    int32 packed_repeated_int32    = 61 [packed=true];
-  repeated    int64 packed_repeated_int64    = 62 [packed=true];
-  repeated   uint32 packed_repeated_uint32   = 63 [packed=true];
-  repeated   uint64 packed_repeated_uint64   = 64 [packed=true];
-  repeated   sint32 packed_repeated_sint32   = 65 [packed=true];
-  repeated   sint64 packed_repeated_sint64   = 66 [packed=true];
-  repeated  fixed32 packed_repeated_fixed32  = 67 [packed=true];
-  repeated  fixed64 packed_repeated_fixed64  = 68 [packed=true];
-  repeated sfixed32 packed_repeated_sfixed32 = 69 [packed=true];
-  repeated sfixed64 packed_repeated_sfixed64 = 70 [packed=true];
-  repeated    float packed_repeated_float    = 71 [packed=true];
-  repeated   double packed_repeated_double   = 72 [packed=true];
-  repeated     bool packed_repeated_bool     = 73 [packed=true];
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    ForeignMessage oneof_foreign_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-  }
-
-}
-
-message ForeignMessage {
-  optional int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestExtendable {
-  extensions 1 to max;
-}
-
-message ExtendsWithMessage {
-  extend TestExtendable {
-    optional ExtendsWithMessage optional_extension = 19;
-    repeated ExtendsWithMessage repeated_extension = 49;
-  }
-  optional int32 foo = 1;
-}
-
-extend TestExtendable {
-  optional    int32 extend_optional_int32    =  1;
-  optional    int64 extend_optional_int64    =  2;
-  optional   uint32 extend_optional_uint32   =  3;
-  optional   uint64 extend_optional_uint64   =  4;
-  optional   sint32 extend_optional_sint32   =  5;
-  optional   sint64 extend_optional_sint64   =  6;
-  optional  fixed32 extend_optional_fixed32  =  7;
-  optional  fixed64 extend_optional_fixed64  =  8;
-  optional sfixed32 extend_optional_sfixed32 =  9;
-  optional sfixed64 extend_optional_sfixed64 = 10;
-  optional    float extend_optional_float    = 11;
-  optional   double extend_optional_double   = 12;
-  optional     bool extend_optional_bool     = 13;
-  optional   string extend_optional_string   = 14;
-  optional    bytes extend_optional_bytes    = 15;
-  optional ForeignEnum extend_optional_foreign_enum    = 22;
-
-  repeated    int32 extend_repeated_int32    = 31;
-  repeated    int64 extend_repeated_int64    = 32;
-  repeated   uint32 extend_repeated_uint32   = 33;
-  repeated   uint64 extend_repeated_uint64   = 34;
-  repeated   sint32 extend_repeated_sint32   = 35;
-  repeated   sint64 extend_repeated_sint64   = 36;
-  repeated  fixed32 extend_repeated_fixed32  = 37;
-  repeated  fixed64 extend_repeated_fixed64  = 38;
-  repeated sfixed32 extend_repeated_sfixed32 = 39;
-  repeated sfixed64 extend_repeated_sfixed64 = 40;
-  repeated    float extend_repeated_float    = 41;
-  repeated   double extend_repeated_double   = 42;
-  repeated     bool extend_repeated_bool     = 43;
-  repeated   string extend_repeated_string   = 44;
-  repeated    bytes extend_repeated_bytes    = 45;
-  repeated ForeignEnum extend_repeated_foreign_enum    = 52;
-
-  repeated    int32 extend_packed_repeated_int32    = 61 [packed=true];
-  repeated    int64 extend_packed_repeated_int64    = 62 [packed=true];
-  repeated   uint32 extend_packed_repeated_uint32   = 63 [packed=true];
-  repeated   uint64 extend_packed_repeated_uint64   = 64 [packed=true];
-  repeated   sint32 extend_packed_repeated_sint32   = 65 [packed=true];
-  repeated   sint64 extend_packed_repeated_sint64   = 66 [packed=true];
-  repeated  fixed32 extend_packed_repeated_fixed32  = 67 [packed=true];
-  repeated  fixed64 extend_packed_repeated_fixed64  = 68 [packed=true];
-  repeated sfixed32 extend_packed_repeated_sfixed32 = 69 [packed=true];
-  repeated sfixed64 extend_packed_repeated_sfixed64 = 70 [packed=true];
-  repeated    float extend_packed_repeated_float    = 71 [packed=true];
-  repeated   double extend_packed_repeated_double   = 72 [packed=true];
-  repeated     bool extend_packed_repeated_bool     = 73 [packed=true];
-  repeated ForeignEnum extend_packed_repeated_foreign_enum    = 82
-      [packed=true];
-
-}
-
-message TestMapFields {
-  map<string, string> map_string_string = 1;
-  map<string, int32> map_string_int32 = 2;
-  map<string, int64> map_string_int64 = 3;
-  map<string, bool> map_string_bool = 4;
-  map<string, double> map_string_double = 5;
-  map<string, MapValueEnum> map_string_enum = 6;
-  map<string, MapValueMessage> map_string_msg = 7;
-
-  map<int32, string> map_int32_string = 8;
-  map<int64, string> map_int64_string = 9;
-  map<bool, string> map_bool_string = 10;
-
-  optional TestMapFields test_map_fields = 11;
-  map<string, TestMapFields> map_string_testmapfields = 12;
-}
-
-enum MapValueEnum {
-  MAP_VALUE_FOO = 0;
-  MAP_VALUE_BAR = 1;
-  MAP_VALUE_BAZ = 2;
-}
-
-message MapValueMessage {
-  optional int32 foo = 1;
-}
diff --git a/js/compatibility_tests/v3.1.0/testempty.proto b/js/compatibility_tests/v3.1.0/testempty.proto
deleted file mode 100644
index 960bce4..0000000
--- a/js/compatibility_tests/v3.1.0/testempty.proto
+++ /dev/null
@@ -1,34 +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.
-
-syntax = "proto2";
-
-package javatests.com.google.apps.jspb;
-
diff --git a/js/debug.js b/js/debug.js
index 46b2485..3701a09 100644
--- a/js/debug.js
+++ b/js/debug.js
@@ -94,9 +94,8 @@
     var match = /^get([A-Z]\w*)/.exec(name);
     if (match && name != 'getExtension' &&
         name != 'getJsPbMessageId') {
-      var has = 'has' + match[1];
-      if (!thing[has] || thing[has]()) {
-        var val = thing[name]();
+      var val = thing[name]();
+      if (val != null) {
         object[jspb.debug.formatFieldName_(match[1])] = jspb.debug.dump_(val);
       }
     }
diff --git a/js/debug_test.js b/js/debug_test.js
index 702cc76..01cbf89 100644
--- a/js/debug_test.js
+++ b/js/debug_test.js
@@ -65,7 +65,7 @@
       'aBoolean': true
     }, jspb.debug.dump(message));
 
-    message.clearAString();
+    message.setAString(undefined);
 
     assertObjectEquals({
       $name: 'proto.jspb.test.Simple1',
diff --git a/js/gulpfile.js b/js/gulpfile.js
index fc9559f..c522015 100644
--- a/js/gulpfile.js
+++ b/js/gulpfile.js
@@ -8,41 +8,8 @@
 
 var protoc = process.env.PROTOC || '../src/protoc';
 
-var wellKnownTypes = [
-  '../src/google/protobuf/any.proto',
-  '../src/google/protobuf/api.proto',
-  '../src/google/protobuf/compiler/plugin.proto',
-  '../src/google/protobuf/descriptor.proto',
-  '../src/google/protobuf/duration.proto',
-  '../src/google/protobuf/empty.proto',
-  '../src/google/protobuf/field_mask.proto',
-  '../src/google/protobuf/source_context.proto',
-  '../src/google/protobuf/struct.proto',
-  '../src/google/protobuf/timestamp.proto',
-  '../src/google/protobuf/type.proto',
-  '../src/google/protobuf/wrappers.proto',
-];
-
-var group1Protos = [
-  'data.proto',
-  'test3.proto',
-  'test5.proto',
-  'commonjs/test6/test6.proto',
-  'test8.proto',
-  'testbinary.proto',
-  'testempty.proto',
-  'test.proto',
-];
-
-var group2Protos = [
-  'proto3_test.proto',
-  'test2.proto',
-  'test4.proto',
-  'commonjs/test7/test7.proto',
-];
-
-gulp.task('genproto_well_known_types_closure', function (cb) {
-  exec(protoc + ' --js_out=one_output_file_per_input_file,binary:. -I ../src -I . ' + wellKnownTypes.join(' '),
+gulp.task('genproto_closure', function (cb) {
+  exec(protoc + ' --js_out=library=testproto_libs,binary:.  -I ../src -I . *.proto ../src/google/protobuf/descriptor.proto',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
@@ -50,8 +17,8 @@
   });
 });
 
-gulp.task('genproto_group1_closure', function (cb) {
-  exec(protoc + ' --js_out=library=testproto_libs1,binary:.  -I ../src -I . ' + group1Protos.join(' '),
+gulp.task('genproto_commonjs', function (cb) {
+  exec('mkdir -p commonjs_out && ' + protoc + ' --js_out=import_style=commonjs,binary:commonjs_out -I ../src -I commonjs -I . *.proto commonjs/test*/*.proto ../src/google/protobuf/descriptor.proto',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
@@ -59,75 +26,10 @@
   });
 });
 
-gulp.task('genproto_group2_closure', function (cb) {
-  exec(protoc + ' --js_out=library=testproto_libs2,binary:.  -I ../src -I . -I commonjs ' + group2Protos.join(' '),
-       function (err, stdout, stderr) {
-    console.log(stdout);
-    console.log(stderr);
-    cb(err);
-  });
-});
-
-gulp.task('genproto_well_known_types_commonjs', function (cb) {
-  exec('mkdir -p commonjs_out && ' + protoc + ' --js_out=import_style=commonjs,binary:commonjs_out -I ../src ' + wellKnownTypes.join(' '),
-       function (err, stdout, stderr) {
-    console.log(stdout);
-    console.log(stderr);
-    cb(err);
-  });
-});
-
-gulp.task('genproto_group1_commonjs', function (cb) {
-  exec('mkdir -p commonjs_out && ' + protoc + ' --js_out=import_style=commonjs,binary:commonjs_out -I ../src -I commonjs -I . ' + group1Protos.join(' '),
-       function (err, stdout, stderr) {
-    console.log(stdout);
-    console.log(stderr);
-    cb(err);
-  });
-});
-
-gulp.task('genproto_group2_commonjs', function (cb) {
-  exec('mkdir -p commonjs_out && ' + protoc + ' --js_out=import_style=commonjs,binary:commonjs_out -I ../src -I commonjs -I . ' + group2Protos.join(' '),
-       function (err, stdout, stderr) {
-    console.log(stdout);
-    console.log(stderr);
-    cb(err);
-  });
-});
-
-gulp.task('genproto_commonjs_wellknowntypes', function (cb) {
-  exec('mkdir -p commonjs_out/node_modules/google-protobuf && ' + protoc + ' --js_out=import_style=commonjs,binary:commonjs_out/node_modules/google-protobuf -I ../src ' + wellKnownTypes.join(' '),
-       function (err, stdout, stderr) {
-    console.log(stdout);
-    console.log(stderr);
-    cb(err);
-  });
-});
-
-gulp.task('genproto_wellknowntypes', function (cb) {
-  exec(protoc + ' --js_out=import_style=commonjs,binary:. -I ../src ' + wellKnownTypes.join(' '),
-       function (err, stdout, stderr) {
-    console.log(stdout);
-    console.log(stderr);
-    cb(err);
-  });
-});
-
-function getClosureBuilderCommand(exportsFile, outputFile) {
-  return './node_modules/google-closure-library/closure/bin/build/closurebuilder.py ' +
-  '--root node_modules ' +
-  '-o compiled ' +
-  '--compiler_jar node_modules/google-closure-compiler/compiler.jar ' +
-  '-i ' + exportsFile + ' ' +
-  'map.js message.js binary/arith.js binary/constants.js binary/decoder.js ' +
-  'binary/encoder.js binary/reader.js binary/utils.js binary/writer.js ' +
-  exportsFile  + ' > ' + outputFile;
-}
-
-gulp.task('dist', ['genproto_wellknowntypes'], function (cb) {
+gulp.task('dist', function (cb) {
   // TODO(haberman): minify this more aggressively.
   // Will require proper externs/exports.
-  exec(getClosureBuilderCommand('commonjs/export.js', 'google-protobuf.js'),
+  exec('./node_modules/google-closure-library/closure/bin/calcdeps.py -i message.js -i binary/reader.js -i binary/writer.js -i commonjs/export.js -p . -p node_modules/google-closure-library/closure -o compiled --compiler_jar node_modules/google-closure-compiler/compiler.jar > google-protobuf.js',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
@@ -136,10 +38,7 @@
 });
 
 gulp.task('commonjs_asserts', function (cb) {
-  exec('mkdir -p commonjs_out/test_node_modules && ' +
-       getClosureBuilderCommand(
-           'commonjs/export_asserts.js',
-           'commonjs_out/test_node_modules/closure_asserts_commonjs.js'),
+  exec('mkdir -p commonjs_out/test_node_modules && ./node_modules/google-closure-library/closure/bin/calcdeps.py -i commonjs/export_asserts.js -p . -p node_modules/google-closure-library/closure -o compiled --compiler_jar node_modules/google-closure-compiler/compiler.jar > commonjs_out/test_node_modules/closure_asserts_commonjs.js',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
@@ -148,10 +47,7 @@
 });
 
 gulp.task('commonjs_testdeps', function (cb) {
-  exec('mkdir -p commonjs_out/test_node_modules && ' +
-       getClosureBuilderCommand(
-           'commonjs/export_testdeps.js',
-           'commonjs_out/test_node_modules/testdeps_commonjs.js'),
+  exec('mkdir -p commonjs_out/test_node_modules && ./node_modules/google-closure-library/closure/bin/calcdeps.py -i commonjs/export_testdeps.js -p . -p node_modules/google-closure-library/closure -o compiled --compiler_jar node_modules/google-closure-compiler/compiler.jar > commonjs_out/test_node_modules/testdeps_commonjs.js',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
@@ -159,7 +55,7 @@
   });
 });
 
-gulp.task('make_commonjs_out', ['dist', 'genproto_well_known_types_commonjs', 'genproto_group1_commonjs', 'genproto_group2_commonjs', 'genproto_commonjs_wellknowntypes', 'commonjs_asserts', 'commonjs_testdeps'], function (cb) {
+gulp.task('make_commonjs_out', ['dist', 'genproto_commonjs', 'commonjs_asserts', 'commonjs_testdeps'], function (cb) {
   // TODO(haberman): minify this more aggressively.
   // Will require proper externs/exports.
   var cmd = "mkdir -p commonjs_out/binary && mkdir -p commonjs_out/test_node_modules && ";
@@ -182,8 +78,8 @@
   });
 });
 
-gulp.task('deps', ['genproto_well_known_types_closure', 'genproto_group1_closure', 'genproto_group2_closure'], function (cb) {
-  exec('./node_modules/google-closure-library/closure/bin/build/depswriter.py binary/arith.js binary/constants.js binary/decoder.js binary/encoder.js binary/reader.js binary/utils.js binary/writer.js debug.js map.js message.js node_loader.js test_bootstrap.js > deps.js',
+gulp.task('deps', ['genproto_closure'], function (cb) {
+  exec('./node_modules/google-closure-library/closure/bin/build/depswriter.py *.js binary/*.js > deps.js',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
@@ -191,7 +87,7 @@
   });
 });
 
-gulp.task('test_closure', ['genproto_well_known_types_closure', 'genproto_group1_closure', 'genproto_group2_closure', 'deps'], function (cb) {
+gulp.task('test_closure', ['genproto_closure', 'deps'], function (cb) {
   exec('JASMINE_CONFIG_PATH=jasmine.json ./node_modules/.bin/jasmine',
        function (err, stdout, stderr) {
     console.log(stdout);
diff --git a/js/jasmine.json b/js/jasmine.json
index aeea72f..f83c54c 100644
--- a/js/jasmine.json
+++ b/js/jasmine.json
@@ -7,11 +7,6 @@
     "helpers": [
         "node_modules/google-closure-library/closure/goog/bootstrap/nodejs.js",
         "node_loader.js",
-        "deps.js",
-        "google/protobuf/any.js",
-        "google/protobuf/struct.js",
-        "google/protobuf/timestamp.js",
-        "testproto_libs1.js",
-        "testproto_libs2.js"
+        "deps.js"
     ]
 }
diff --git a/js/map.js b/js/map.js
deleted file mode 100644
index d423499..0000000
--- a/js/map.js
+++ /dev/null
@@ -1,531 +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.
-
-goog.provide('jspb.Map');
-
-goog.require('goog.asserts');
-
-goog.forwardDeclare('jspb.BinaryReader');
-goog.forwardDeclare('jspb.BinaryWriter');
-
-
-
-/**
- * Constructs a new Map. A Map is a container that is used to implement map
- * fields on message objects. It closely follows the ES6 Map API; however,
- * it is distinct because we do not want to depend on external polyfills or
- * on ES6 itself.
- *
- * This constructor should only be called from generated message code. It is not
- * intended for general use by library consumers.
- *
- * @template K, V
- *
- * @param {!Array<!Array<!Object>>} arr
- *
- * @param {?function(new:V)|function(new:V,?)=} opt_valueCtor
- *    The constructor for type V, if type V is a message type.
- *
- * @constructor
- * @struct
- */
-jspb.Map = function(arr, opt_valueCtor) {
-  /** @const @private */
-  this.arr_ = arr;
-  /** @const @private */
-  this.valueCtor_ = opt_valueCtor;
-
-  /** @type {!Object<string, !jspb.Map.Entry_<K,V>>} @private */
-  this.map_ = {};
-
-  /**
-   * Is `this.arr_ updated with respect to `this.map_`?
-   * @type {boolean}
-   */
-  this.arrClean = true;
-
-  if (this.arr_.length > 0) {
-    this.loadFromArray_();
-  }
-};
-
-
-/**
- * Load initial content from underlying array.
- * @private
- */
-jspb.Map.prototype.loadFromArray_ = function() {
-  for (var i = 0; i < this.arr_.length; i++) {
-    var record = this.arr_[i];
-    var key = record[0];
-    var value = record[1];
-    this.map_[key.toString()] = new jspb.Map.Entry_(key, value);
-  }
-  this.arrClean = true;
-};
-
-
-/**
- * Synchronize content to underlying array, if needed, and return it.
- * @return {!Array<!Array<!Object>>}
- */
-jspb.Map.prototype.toArray = function() {
-  if (this.arrClean) {
-    if (this.valueCtor_) {
-      // We need to recursively sync maps in submessages to their arrays.
-      var m = this.map_;
-      for (var p in m) {
-        if (Object.prototype.hasOwnProperty.call(m, p)) {
-          var valueWrapper = /** @type {?jspb.Message} */ (m[p].valueWrapper);
-          if (valueWrapper) {
-            valueWrapper.toArray();
-          }
-        }
-      }
-    }
-  } else {
-    // Delete all elements.
-    this.arr_.length = 0;
-    var strKeys = this.stringKeys_();
-    // Output keys in deterministic (sorted) order.
-    strKeys.sort();
-    for (var i = 0; i < strKeys.length; i++) {
-      var entry = this.map_[strKeys[i]];
-      var valueWrapper = /** @type {!Object} */ (entry.valueWrapper);
-      if (valueWrapper) {
-        valueWrapper.toArray();
-      }
-      this.arr_.push([entry.key, entry.value]);
-    }
-    this.arrClean = true;
-  }
-  return this.arr_;
-};
-
-
-/**
- * Returns the map formatted as an array of key-value pairs, suitable for the
- * toObject() form of a message.
- *
- * @param {boolean=} includeInstance Whether to include the JSPB instance for
- *    transitional soy proto support: http://goto/soy-param-migration
- * @param {!function((boolean|undefined),V):!Object=} valueToObject
- *    The static toObject() method, if V is a message type.
- * @return {!Array<!Array<!Object>>}
- */
-jspb.Map.prototype.toObject = function(includeInstance, valueToObject) {
-  var rawArray = this.toArray();
-  var entries = [];
-  for (var i = 0; i < rawArray.length; i++) {
-    var entry = this.map_[rawArray[i][0].toString()];
-    this.wrapEntry_(entry);
-    var valueWrapper = /** @type {V|undefined} */ (entry.valueWrapper);
-    if (valueWrapper) {
-      goog.asserts.assert(valueToObject);
-      entries.push([entry.key, valueToObject(includeInstance, valueWrapper)]);
-    } else {
-      entries.push([entry.key, entry.value]);
-    }
-  }
-  return entries;
-};
-
-
-/**
- * Returns a Map from the given array of key-value pairs when the values are of
- * message type. The values in the array must match the format returned by their
- * message type's toObject() method.
- *
- * @template K, V
- * @param {!Array<!Array<!Object>>} entries
- * @param {!function(new:V)|function(new:V,?)} valueCtor
- *    The constructor for type V.
- * @param {!function(!Object):V} valueFromObject
- *    The fromObject function for type V.
- * @return {!jspb.Map<K, V>}
- */
-jspb.Map.fromObject = function(entries, valueCtor, valueFromObject) {
-  var result = new jspb.Map([], valueCtor);
-  for (var i = 0; i < entries.length; i++) {
-    var key = entries[i][0];
-    var value = valueFromObject(entries[i][1]);
-    result.set(key, value);
-  }
-  return result;
-};
-
-
-/**
- * Helper: an IteratorIterable over an array.
- * @template T
- * @param {!Array<T>} arr the array
- * @implements {IteratorIterable<T>}
- * @constructor @struct
- * @private
- */
-jspb.Map.ArrayIteratorIterable_ = function(arr) {
-  /** @type {number} @private */
-  this.idx_ = 0;
-
-  /** @const @private */
-  this.arr_ = arr;
-};
-
-
-/** @override @final */
-jspb.Map.ArrayIteratorIterable_.prototype.next = function() {
-  if (this.idx_ < this.arr_.length) {
-    return {done: false, value: this.arr_[this.idx_++]};
-  } else {
-    return {done: true, value: undefined};
-  }
-};
-
-if (typeof(Symbol) != 'undefined') {
-  /** @override */
-  jspb.Map.ArrayIteratorIterable_.prototype[Symbol.iterator] = function() {
-    return this;
-  };
-}
-
-
-/**
- * Returns the map's length (number of key/value pairs).
- * @return {number}
- */
-jspb.Map.prototype.getLength = function() {
-  return this.stringKeys_().length;
-};
-
-
-/**
- * Clears the map.
- */
-jspb.Map.prototype.clear = function() {
-  this.map_ = {};
-  this.arrClean = false;
-};
-
-
-/**
- * Deletes a particular key from the map.
- * N.B.: differs in name from ES6 Map's `delete` because IE8 does not support
- * reserved words as property names.
- * @this {jspb.Map}
- * @param {K} key
- * @return {boolean} Whether any entry with this key was deleted.
- */
-jspb.Map.prototype.del = function(key) {
-  var keyValue = key.toString();
-  var hadKey = this.map_.hasOwnProperty(keyValue);
-  delete this.map_[keyValue];
-  this.arrClean = false;
-  return hadKey;
-};
-
-
-/**
- * Returns an array of [key, value] pairs in the map.
- *
- * This is redundant compared to the plain entries() method, but we provide this
- * to help out Angular 1.x users.  Still evaluating whether this is the best
- * option.
- *
- * @return {!Array<!Array<K|V>>}
- */
-jspb.Map.prototype.getEntryList = function() {
-  var entries = [];
-  var strKeys = this.stringKeys_();
-  strKeys.sort();
-  for (var i = 0; i < strKeys.length; i++) {
-    var entry = this.map_[strKeys[i]];
-    entries.push([entry.key, entry.value]);
-  }
-  return entries;
-};
-
-
-/**
- * Returns an iterator-iterable over [key, value] pairs in the map.
- * Closure compiler sadly doesn't support tuples, ie. Iterator<[K,V]>.
- * @return {!IteratorIterable<!Array<K|V>>} The iterator-iterable.
- */
-jspb.Map.prototype.entries = function() {
-  var entries = [];
-  var strKeys = this.stringKeys_();
-  strKeys.sort();
-  for (var i = 0; i < strKeys.length; i++) {
-    var entry = this.map_[strKeys[i]];
-    entries.push([entry.key, this.wrapEntry_(entry)]);
-  }
-  return new jspb.Map.ArrayIteratorIterable_(entries);
-};
-
-
-/**
- * Returns an iterator-iterable over keys in the map.
- * @return {!IteratorIterable<K>} The iterator-iterable.
- */
-jspb.Map.prototype.keys = function() {
-  var keys = [];
-  var strKeys = this.stringKeys_();
-  strKeys.sort();
-  for (var i = 0; i < strKeys.length; i++) {
-    var entry = this.map_[strKeys[i]];
-    keys.push(entry.key);
-  }
-  return new jspb.Map.ArrayIteratorIterable_(keys);
-};
-
-
-/**
- * Returns an iterator-iterable over values in the map.
- * @return {!IteratorIterable<V>} The iterator-iterable.
- */
-jspb.Map.prototype.values = function() {
-  var values = [];
-  var strKeys = this.stringKeys_();
-  strKeys.sort();
-  for (var i = 0; i < strKeys.length; i++) {
-    var entry = this.map_[strKeys[i]];
-    values.push(this.wrapEntry_(entry));
-  }
-  return new jspb.Map.ArrayIteratorIterable_(values);
-};
-
-
-/**
- * Iterates over entries in the map, calling a function on each.
- * @template T
- * @param {function(this:T, V, K, ?jspb.Map<K, V>)} cb
- * @param {T=} opt_thisArg
- */
-jspb.Map.prototype.forEach = function(cb, opt_thisArg) {
-  var strKeys = this.stringKeys_();
-  strKeys.sort();
-  for (var i = 0; i < strKeys.length; i++) {
-    var entry = this.map_[strKeys[i]];
-    cb.call(opt_thisArg, this.wrapEntry_(entry), entry.key, this);
-  }
-};
-
-
-/**
- * Sets a key in the map to the given value.
- * @param {K} key The key
- * @param {V} value The value
- * @return {!jspb.Map<K,V>}
- */
-jspb.Map.prototype.set = function(key, value) {
-  var entry = new jspb.Map.Entry_(key);
-  if (this.valueCtor_) {
-    entry.valueWrapper = value;
-    // .toArray() on a message returns a reference to the underlying array
-    // rather than a copy.
-    entry.value = value.toArray();
-  } else {
-    entry.value = value;
-  }
-  this.map_[key.toString()] = entry;
-  this.arrClean = false;
-  return this;
-};
-
-
-/**
- * Helper: lazily construct a wrapper around an entry, if needed, and return the
- * user-visible type.
- * @param {!jspb.Map.Entry_<K,V>} entry
- * @return {V}
- * @private
- */
-jspb.Map.prototype.wrapEntry_ = function(entry) {
-  if (this.valueCtor_) {
-    if (!entry.valueWrapper) {
-      entry.valueWrapper = new this.valueCtor_(entry.value);
-    }
-    return /** @type {V} */ (entry.valueWrapper);
-  } else {
-    return entry.value;
-  }
-};
-
-
-/**
- * Gets the value corresponding to a key in the map.
- * @param {K} key
- * @return {V|undefined} The value, or `undefined` if key not present
- */
-jspb.Map.prototype.get = function(key) {
-  var keyValue = key.toString();
-  var entry = this.map_[keyValue];
-  if (entry) {
-    return this.wrapEntry_(entry);
-  } else {
-    return undefined;
-  }
-};
-
-
-/**
- * Determines whether the given key is present in the map.
- * @param {K} key
- * @return {boolean} `true` if the key is present
- */
-jspb.Map.prototype.has = function(key) {
-  var keyValue = key.toString();
-  return (keyValue in this.map_);
-};
-
-
-/**
- * Write this Map field in wire format to a BinaryWriter, using the given field
- * number.
- * @param {number} fieldNumber
- * @param {!jspb.BinaryWriter} writer
- * @param {!function(this:jspb.BinaryWriter,number,K)} keyWriterFn
- *     The method on BinaryWriter that writes type K to the stream.
- * @param {!function(this:jspb.BinaryWriter,number,V,?=)|
- *          function(this:jspb.BinaryWriter,number,V,?)} valueWriterFn
- *     The method on BinaryWriter that writes type V to the stream.  May be
- *     writeMessage, in which case the second callback arg form is used.
- * @param {function(V,!jspb.BinaryWriter)=} opt_valueWriterCallback
- *    The BinaryWriter serialization callback for type V, if V is a message
- *    type.
- */
-jspb.Map.prototype.serializeBinary = function(
-    fieldNumber, writer, keyWriterFn, valueWriterFn, opt_valueWriterCallback) {
-  var strKeys = this.stringKeys_();
-  strKeys.sort();
-  for (var i = 0; i < strKeys.length; i++) {
-    var entry = this.map_[strKeys[i]];
-    writer.beginSubMessage(fieldNumber);
-    keyWriterFn.call(writer, 1, entry.key);
-    if (this.valueCtor_) {
-      valueWriterFn.call(writer, 2, this.wrapEntry_(entry),
-                         opt_valueWriterCallback);
-    } else {
-      valueWriterFn.call(writer, 2, entry.value);
-    }
-    writer.endSubMessage();
-  }
-};
-
-
-/**
- * Read one key/value message from the given BinaryReader. Compatible as the
- * `reader` callback parameter to jspb.BinaryReader.readMessage, to be called
- * when a key/value pair submessage is encountered.
- * @template K, V
- * @param {!jspb.Map} map
- * @param {!jspb.BinaryReader} reader
- * @param {!function(this:jspb.BinaryReader):K} keyReaderFn
- *     The method on BinaryReader that reads type K from the stream.
- *
- * @param {!function(this:jspb.BinaryReader):V|
- *          function(this:jspb.BinaryReader,V,
- *                  function(V,!jspb.BinaryReader))} valueReaderFn
- *    The method on BinaryReader that reads type V from the stream. May be
- *    readMessage, in which case the second callback arg form is used.
- *
- * @param {?function(V,!jspb.BinaryReader)=} opt_valueReaderCallback
- *    The BinaryReader parsing callback for type V, if V is a message type.
- *
- */
-jspb.Map.deserializeBinary = function(map, reader, keyReaderFn, valueReaderFn,
-                                      opt_valueReaderCallback) {
-  var key = undefined;
-  var value = undefined;
-
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    if (field == 1) {
-      // Key.
-      key = keyReaderFn.call(reader);
-    } else if (field == 2) {
-      // Value.
-      if (map.valueCtor_) {
-        value = new map.valueCtor_();
-        valueReaderFn.call(reader, value, opt_valueReaderCallback);
-      } else {
-        value = valueReaderFn.call(reader);
-      }
-    }
-  }
-
-  goog.asserts.assert(key != undefined);
-  goog.asserts.assert(value != undefined);
-  map.set(key, value);
-};
-
-
-/**
- * Helper: compute the list of all stringified keys in the underlying Object
- * map.
- * @return {!Array<string>}
- * @private
- */
-jspb.Map.prototype.stringKeys_ = function() {
-  var m = this.map_;
-  var ret = [];
-  for (var p in m) {
-    if (Object.prototype.hasOwnProperty.call(m, p)) {
-      ret.push(p);
-    }
-  }
-  return ret;
-};
-
-
-
-/**
- * @param {K} key The entry's key.
- * @param {V=} opt_value The entry's value wrapper.
- * @constructor
- * @struct
- * @template K, V
- * @private
- */
-jspb.Map.Entry_ = function(key, opt_value) {
-  /** @const {K} */
-  this.key = key;
-
-  // The JSPB-serializable value.  For primitive types this will be of type V.
-  // For message types it will be an array.
-  /** @type {V} */
-  this.value = opt_value;
-
-  // Only used for submessage values.
-  /** @type {V} */
-  this.valueWrapper = undefined;
-};
diff --git a/js/maps_test.js b/js/maps_test.js
deleted file mode 100755
index e8dd2f2..0000000
--- a/js/maps_test.js
+++ /dev/null
@@ -1,350 +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.
-
-goog.require('goog.testing.asserts');
-goog.require('goog.userAgent');
-
-// CommonJS-LoadFromFile: testbinary_pb proto.jspb.test
-goog.require('proto.jspb.test.MapValueEnum');
-goog.require('proto.jspb.test.MapValueMessage');
-goog.require('proto.jspb.test.TestMapFields');
-
-// CommonJS-LoadFromFile: test_pb proto.jspb.test
-goog.require('proto.jspb.test.MapValueMessageNoBinary');
-goog.require('proto.jspb.test.TestMapFieldsNoBinary');
-
-/**
- * Helper: check that the given map has exactly this set of (sorted) entries.
- * @param {!jspb.Map} map
- * @param {!Array<!Array<?>>} entries
- */
-function checkMapEquals(map, entries) {
-  var arr = map.toArray();
-  assertEquals(arr.length, entries.length);
-  for (var i = 0; i < arr.length; i++) {
-    assertElementsEquals(arr[i], entries[i]);
-  }
-}
-
-/**
- * Converts an ES6 iterator to an array.
- * @template T
- * @param {!Iterator<T>} iter an iterator
- * @return {!Array<T>}
- */
-function toArray(iter) {
-  var arr = [];
-  while (true) {
-    var val = iter.next();
-    if (val.done) {
-      break;
-    }
-    arr.push(val.value);
-  }
-  return arr;
-}
-
-
-/**
- * Helper: generate test methods for this TestMapFields class.
- * @param {?} msgInfo
- * @param {?} submessageCtor
- * @param {!string} suffix
- */
-function makeTests(msgInfo, submessageCtor, suffix) {
-  /**
-   * Helper: fill all maps on a TestMapFields.
-   * @param {?} msg
-   */
-  var fillMapFields = function(msg) {
-    msg.getMapStringStringMap().set('asdf', 'jkl;').set('key 2', 'hello world');
-    msg.getMapStringInt32Map().set('a', 1).set('b', -2);
-    msg.getMapStringInt64Map().set('c', 0x100000000).set('d', 0x200000000);
-    msg.getMapStringBoolMap().set('e', true).set('f', false);
-    msg.getMapStringDoubleMap().set('g', 3.14159).set('h', 2.71828);
-    msg.getMapStringEnumMap()
-        .set('i', proto.jspb.test.MapValueEnum.MAP_VALUE_BAR)
-        .set('j', proto.jspb.test.MapValueEnum.MAP_VALUE_BAZ);
-    msg.getMapStringMsgMap()
-        .set('k', new submessageCtor())
-        .set('l', new submessageCtor());
-    msg.getMapStringMsgMap().get('k').setFoo(42);
-    msg.getMapStringMsgMap().get('l').setFoo(84);
-    msg.getMapInt32StringMap().set(-1, 'a').set(42, 'b');
-    msg.getMapInt64StringMap().set(0x123456789abc, 'c').set(0xcba987654321, 'd');
-    msg.getMapBoolStringMap().set(false, 'e').set(true, 'f');
-  };
-
-  /**
-   * Helper: check all maps on a TestMapFields.
-   * @param {?} msg
-   */
-  var checkMapFields = function(msg) {
-    checkMapEquals(msg.getMapStringStringMap(), [
-          ['asdf', 'jkl;'],
-          ['key 2', 'hello world']
-    ]);
-    checkMapEquals(msg.getMapStringInt32Map(), [
-          ['a', 1],
-          ['b', -2]
-    ]);
-    checkMapEquals(msg.getMapStringInt64Map(), [
-          ['c', 0x100000000],
-          ['d', 0x200000000]
-    ]);
-    checkMapEquals(msg.getMapStringBoolMap(), [
-          ['e', true],
-          ['f', false]
-    ]);
-    checkMapEquals(msg.getMapStringDoubleMap(), [
-          ['g', 3.14159],
-          ['h', 2.71828]
-    ]);
-    checkMapEquals(msg.getMapStringEnumMap(), [
-          ['i', proto.jspb.test.MapValueEnum.MAP_VALUE_BAR],
-          ['j', proto.jspb.test.MapValueEnum.MAP_VALUE_BAZ]
-    ]);
-    checkMapEquals(msg.getMapInt32StringMap(), [
-          [-1, 'a'],
-          [42, 'b']
-    ]);
-    checkMapEquals(msg.getMapInt64StringMap(), [
-          [0x123456789abc, 'c'],
-          [0xcba987654321, 'd']
-    ]);
-    checkMapEquals(msg.getMapBoolStringMap(), [
-          [false, 'e'],
-          [true, 'f']
-    ]);
-
-    assertEquals(msg.getMapStringMsgMap().getLength(), 2);
-    assertEquals(msg.getMapStringMsgMap().get('k').getFoo(), 42);
-    assertEquals(msg.getMapStringMsgMap().get('l').getFoo(), 84);
-
-    var entries = toArray(msg.getMapStringMsgMap().entries());
-    assertEquals(entries.length, 2);
-    entries.forEach(function(entry) {
-      var key = entry[0];
-      var val = entry[1];
-      assert(val === msg.getMapStringMsgMap().get(key));
-    });
-
-    msg.getMapStringMsgMap().forEach(function(val, key) {
-      assert(val === msg.getMapStringMsgMap().get(key));
-    });
-  };
-
-  it('testMapStringStringField' + suffix, function() {
-    var msg = new msgInfo.constructor();
-    assertEquals(msg.getMapStringStringMap().getLength(), 0);
-    assertEquals(msg.getMapStringInt32Map().getLength(), 0);
-    assertEquals(msg.getMapStringInt64Map().getLength(), 0);
-    assertEquals(msg.getMapStringBoolMap().getLength(), 0);
-    assertEquals(msg.getMapStringDoubleMap().getLength(), 0);
-    assertEquals(msg.getMapStringEnumMap().getLength(), 0);
-    assertEquals(msg.getMapStringMsgMap().getLength(), 0);
-
-    // Re-create to clear out any internally-cached wrappers, etc.
-    msg = new msgInfo.constructor();
-    var m = msg.getMapStringStringMap();
-    assertEquals(m.has('asdf'), false);
-    assertEquals(m.get('asdf'), undefined);
-    m.set('asdf', 'hello world');
-    assertEquals(m.has('asdf'), true);
-    assertEquals(m.get('asdf'), 'hello world');
-    m.set('jkl;', 'key 2');
-    assertEquals(m.has('jkl;'), true);
-    assertEquals(m.get('jkl;'), 'key 2');
-    assertEquals(m.getLength(), 2);
-    var it = m.entries();
-    assertElementsEquals(it.next().value, ['asdf', 'hello world']);
-    assertElementsEquals(it.next().value, ['jkl;', 'key 2']);
-    assertEquals(it.next().done, true);
-    checkMapEquals(m, [
-        ['asdf', 'hello world'],
-        ['jkl;', 'key 2']
-    ]);
-    m.del('jkl;');
-    assertEquals(m.has('jkl;'), false);
-    assertEquals(m.get('jkl;'), undefined);
-    assertEquals(m.getLength(), 1);
-    it = m.keys();
-    assertEquals(it.next().value, 'asdf');
-    assertEquals(it.next().done, true);
-    it = m.values();
-    assertEquals(it.next().value, 'hello world');
-    assertEquals(it.next().done, true);
-
-    var count = 0;
-    m.forEach(function(value, key, map) {
-      assertEquals(map, m);
-      assertEquals(key, 'asdf');
-      assertEquals(value, 'hello world');
-      count++;
-    });
-    assertEquals(count, 1);
-
-    m.clear();
-    assertEquals(m.getLength(), 0);
-  });
-
-
-  /**
-   * Tests operations on maps with all key and value types.
-   */
-  it('testAllMapTypes' + suffix, function() {
-    var msg = new msgInfo.constructor();
-    fillMapFields(msg);
-    checkMapFields(msg);
-  });
-
-
-  if (msgInfo.deserializeBinary) {
-    /**
-     * Tests serialization and deserialization in binary format.
-     */
-    it('testBinaryFormat' + suffix, function() {
-      if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(10)) {
-        // IE8/9 currently doesn't support binary format because they lack
-        // TypedArray.
-        return;
-      }
-
-      // Check that the format is correct.
-      var msg = new msgInfo.constructor();
-      msg.getMapStringStringMap().set('A', 'a');
-      var serialized = msg.serializeBinary();
-      var expectedSerialized = [
-          0x0a, 0x6, // field 1 (map_string_string), delimited, length 6
-          0x0a, 0x1, // field 1 in submessage (key), delimited, length 1
-          0x41,      // ASCII 'A'
-          0x12, 0x1, // field 2 in submessage (value), delimited, length 1
-          0x61       // ASCII 'a'
-      ];
-      assertEquals(serialized.length, expectedSerialized.length);
-      for (var i = 0; i < serialized.length; i++) {
-        assertEquals(serialized[i], expectedSerialized[i]);
-      }
-
-      // Check that all map fields successfully round-trip.
-      msg = new msgInfo.constructor();
-      fillMapFields(msg);
-      serialized = msg.serializeBinary();
-      var decoded = msgInfo.deserializeBinary(serialized);
-      checkMapFields(decoded);
-    });
-  }
-
-
-  /**
-   * Exercises the lazy map<->underlying array sync.
-   */
-  it('testLazyMapSync' + suffix, function() {
-    // Start with a JSPB array containing a few map entries.
-    var entries = [
-        ['a', 'entry 1'],
-        ['c', 'entry 2'],
-        ['b', 'entry 3']
-    ];
-    var msg = new msgInfo.constructor([entries]);
-    assertEquals(entries.length, 3);
-    assertEquals(entries[0][0], 'a');
-    assertEquals(entries[1][0], 'c');
-    assertEquals(entries[2][0], 'b');
-    msg.getMapStringStringMap().del('a');
-    assertEquals(entries.length, 3);  // not yet sync'd
-    msg.toArray();                // force a sync
-    assertEquals(entries.length, 2);
-    assertEquals(entries[0][0], 'b'); // now in sorted order
-    assertEquals(entries[1][0], 'c');
-
-    var a = msg.toArray();
-    assertEquals(a[0], entries);  // retains original reference
-  });
-
-  /**
-   * Returns IteratorIterables for entries(), keys() and values().
-   */
-  it('testIteratorIterables' + suffix, function() {
-    var msg = new msgInfo.constructor();
-    var m = msg.getMapStringStringMap();
-    m.set('key1', 'value1');
-    m.set('key2', 'value2');
-    var entryIterator = m.entries();
-    assertElementsEquals(entryIterator.next().value, ['key1', 'value1']);
-    assertElementsEquals(entryIterator.next().value, ['key2', 'value2']);
-    assertEquals(entryIterator.next().done, true);
-
-    if (typeof(Symbol) != 'undefined') {
-      var entryIterable = m.entries()[Symbol.iterator]();
-      assertElementsEquals(entryIterable.next().value, ['key1', 'value1']);
-      assertElementsEquals(entryIterable.next().value, ['key2', 'value2']);
-      assertEquals(entryIterable.next().done, true);
-    }
-
-    var keyIterator = m.keys();
-    assertEquals(keyIterator.next().value, 'key1');
-    assertEquals(keyIterator.next().value, 'key2');
-    assertEquals(keyIterator.next().done, true);
-
-    if (typeof(Symbol) != 'undefined') {
-      var keyIterable = m.keys()[Symbol.iterator]();
-      assertEquals(keyIterable.next().value, 'key1');
-      assertEquals(keyIterable.next().value, 'key2');
-      assertEquals(keyIterable.next().done, true);
-    }
-    var valueIterator = m.values();
-    assertEquals(valueIterator.next().value, 'value1');
-    assertEquals(valueIterator.next().value, 'value2');
-    assertEquals(valueIterator.next().done, true);
-
-    if (typeof(Symbol) != 'undefined') {
-      var valueIterable = m.values()[Symbol.iterator]();
-      assertEquals(valueIterable.next().value, 'value1');
-      assertEquals(valueIterable.next().value, 'value2');
-      assertEquals(valueIterable.next().done, true);
-    }
-  });
-}
-
-describe('mapsTest', function() {
-  makeTests(
-      {
-        constructor: proto.jspb.test.TestMapFields,
-        deserializeBinary: proto.jspb.test.TestMapFields.deserializeBinary
-      },
-      proto.jspb.test.MapValueMessage, '_Binary');
-  makeTests(
-      {
-        constructor: proto.jspb.test.TestMapFieldsNoBinary,
-        deserializeBinary: null
-      },
-      proto.jspb.test.MapValueMessageNoBinary, '_NoBinary');
-});
diff --git a/js/message.js b/js/message.js
index 1484229..813e6b8 100644
--- a/js/message.js
+++ b/js/message.js
@@ -34,14 +34,13 @@
  * @author mwr@google.com (Mark Rawling)
  */
 
-goog.provide('jspb.ExtensionFieldBinaryInfo');
 goog.provide('jspb.ExtensionFieldInfo');
 goog.provide('jspb.Message');
 
 goog.require('goog.array');
 goog.require('goog.asserts');
 goog.require('goog.crypt.base64');
-goog.require('jspb.Map');
+goog.require('goog.json');
 
 // Not needed in compilation units that have no protos with xids.
 goog.forwardDeclare('xid.String');
@@ -84,12 +83,19 @@
  * @param {?function(new: jspb.Message, Array=)} ctor
  * @param {?function((boolean|undefined),!jspb.Message):!Object} toObjectFn
  * @param {number} isRepeated
+ * @param {?function(number,?)=} opt_binaryReaderFn
+ * @param {?function(number,?)|function(number,?,?,?,?,?)=} opt_binaryWriterFn
+ * @param {?function(?,?)=} opt_binaryMessageSerializeFn
+ * @param {?function(?,?)=} opt_binaryMessageDeserializeFn
+ * @param {?boolean=} opt_isPacked
  * @constructor
  * @struct
  * @template T
  */
 jspb.ExtensionFieldInfo = function(fieldNumber, fieldName, ctor, toObjectFn,
-    isRepeated) {
+    isRepeated, opt_binaryReaderFn, opt_binaryWriterFn,
+    opt_binaryMessageSerializeFn, opt_binaryMessageDeserializeFn,
+    opt_isPacked) {
   /** @const */
   this.fieldIndex = fieldNumber;
   /** @const */
@@ -99,38 +105,20 @@
   /** @const */
   this.toObjectFn = toObjectFn;
   /** @const */
-  this.isRepeated = isRepeated;
-};
-
-/**
- * Stores binary-related information for a single extension field.
- * @param {!jspb.ExtensionFieldInfo<T>} fieldInfo
- * @param {function(this:jspb.BinaryReader,number,?)} binaryReaderFn
- * @param {function(this:jspb.BinaryWriter,number,?)
- *        |function(this:jspb.BinaryWriter,number,?,?,?,?,?)} binaryWriterFn
- * @param {function(?,?)=} opt_binaryMessageSerializeFn
- * @param {function(?,?)=} opt_binaryMessageDeserializeFn
- * @param {boolean=} opt_isPacked
- * @constructor
- * @struct
- * @template T
- */
-jspb.ExtensionFieldBinaryInfo = function(fieldInfo, binaryReaderFn, binaryWriterFn,
-    opt_binaryMessageSerializeFn, opt_binaryMessageDeserializeFn, opt_isPacked) {
+  this.binaryReaderFn = opt_binaryReaderFn;
   /** @const */
-  this.fieldInfo = fieldInfo;
-  /** @const */
-  this.binaryReaderFn = binaryReaderFn;
-  /** @const */
-  this.binaryWriterFn = binaryWriterFn;
+  this.binaryWriterFn = opt_binaryWriterFn;
   /** @const */
   this.binaryMessageSerializeFn = opt_binaryMessageSerializeFn;
   /** @const */
   this.binaryMessageDeserializeFn = opt_binaryMessageDeserializeFn;
   /** @const */
+  this.isRepeated = isRepeated;
+  /** @const */
   this.isPacked = opt_isPacked;
 };
 
+
 /**
  * @return {boolean} Does this field represent a sub Message?
  */
@@ -141,21 +129,6 @@
 
 /**
  * Base class for all JsPb messages.
- *
- * Several common methods (toObject, serializeBinary, in particular) are not
- * defined on the prototype to encourage code patterns that minimize code bloat
- * due to otherwise unused code on all protos contained in the project.
- *
- * If you want to call these methods on a generic message, either
- * pass in your instance of method as a parameter:
- *     someFunction(instanceOfKnownProto,
- *                  KnownProtoClass.prototype.serializeBinary);
- * or use a lambda that knows the type:
- *     someFunction(()=>instanceOfKnownProto.serializeBinary());
- * or, if you don't care about code size, just suppress the
- *     WARNING - Property serializeBinary never defined on jspb.Message
- * and call it the intuitive way.
- *
  * @constructor
  * @struct
  */
@@ -190,22 +163,6 @@
 
 
 /**
- * @define {boolean} Whether to generate toString methods for objects. Turn
- *     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);
-
-
-/**
- * @define {boolean} Whether arrays passed to initialize() can be assumed to be
- *     local (e.g. not from another iframe) and thus safely classified with
- *     instanceof Array.
- */
-goog.define('jspb.Message.ASSUME_LOCAL_ARRAYS', false);
-
-
-/**
  * @define {boolean} Turning on this flag does NOT change the behavior of JSPB
  *     and only affects private internal state. It may, however, break some
  *     tests that use naive deeply-equals algorithms, because using a proto
@@ -217,7 +174,7 @@
 
 
 /**
- * Does this JavaScript environment support Uint8Aray typed arrays?
+ * Does this browser support Uint8Aray typed arrays?
  * @type {boolean}
  * @private
  */
@@ -350,7 +307,7 @@
   // which would otherwise go unused.
   msg.arrayIndexOffset_ = messageId === 0 ? -1 : 0;
   msg.array = data;
-  jspb.Message.initPivotAndExtensionObject_(msg, suggestedPivot);
+  jspb.Message.materializeExtensionObject_(msg, suggestedPivot);
   msg.convertedFloatingPointFields_ = {};
 
   if (repeatedFields) {
@@ -363,7 +320,6 @@
                 jspb.Message.EMPTY_LIST_SENTINEL_ :
                 []);
       } else {
-        jspb.Message.maybeInitEmptyExtensionObject_(msg);
         msg.extensionObject_[fieldNumber] =
             msg.extensionObject_[fieldNumber] ||
             (jspb.Message.MINIMIZE_MEMORY_ALLOCATIONS ?
@@ -396,28 +352,17 @@
 
 
 /**
- * Returns true if the provided argument is an array.
- * @param {*} o The object to classify as array or not.
- * @return {boolean} True if the provided object is an array.
- * @private
- */
-jspb.Message.isArray_ = function(o) {
-  return jspb.Message.ASSUME_LOCAL_ARRAYS ? o instanceof Array :
-                                            goog.isArray(o);
-};
-
-
-/**
+ * Ensures that the array contains an extension object if necessary.
  * If the array contains an extension object in its last position, then the
- * object is kept in place and its position is used as the pivot.  If not,
- * decides the pivot of the message based on suggestedPivot without
- * materializing the extension object.
- *
+ * object is kept in place and its position is used as the pivot.  If not, then
+ * create an extension object using suggestedPivot.  If suggestedPivot is -1,
+ * we don't have an extension object at all, in which case all fields are stored
+ * in the array.
  * @param {!jspb.Message} msg The JsPb proto to modify.
  * @param {number} suggestedPivot See description for initialize().
  * @private
  */
-jspb.Message.initPivotAndExtensionObject_ = function(msg, suggestedPivot) {
+jspb.Message.materializeExtensionObject_ = function(msg, suggestedPivot) {
   if (msg.array.length) {
     var foundIndex = msg.array.length - 1;
     var obj = msg.array[foundIndex];
@@ -426,24 +371,32 @@
     // the object is not an array, since arrays are valid field values.
     // NOTE(lukestebbing): We avoid looking at .length to avoid a JIT bug
     // in Safari on iOS 8. See the description of CL/86511464 for details.
-    if (obj && typeof obj == 'object' && !jspb.Message.isArray_(obj) &&
-        !(jspb.Message.SUPPORTS_UINT8ARRAY_ && obj instanceof Uint8Array)) {
+    if (obj && typeof obj == 'object' && !goog.isArray(obj)) {
       msg.pivot_ = foundIndex - msg.arrayIndexOffset_;
       msg.extensionObject_ = obj;
       return;
     }
   }
-
+  // This complexity exists because we keep all extension fields in the
+  // extensionObject_ regardless of proto field number. Changing this would
+  // simplify the code here, but it would require changing the serialization
+  // format from the server, which is not backwards compatible.
+  // TODO(jshneier): Should we just treat extension fields the same as
+  // non-extension fields, and select whether they appear in the object or in
+  // the array purely based on tag number? This would allow simplifying all the
+  // get/setExtension logic, but it would require the breaking change described
+  // above.
   if (suggestedPivot > -1) {
     msg.pivot_ = suggestedPivot;
-    // Avoid changing the shape of the proto with an empty extension object by
-    // deferring the materialization of the extension object until the first
-    // time a field set into it (may be due to getting a repeated proto field
-    // from it, in which case a new empty array is set into it at first).
-    msg.extensionObject_ = null;
+    var pivotIndex = jspb.Message.getIndex_(msg, suggestedPivot);
+    if (!jspb.Message.MINIMIZE_MEMORY_ALLOCATIONS) {
+      msg.extensionObject_ = msg.array[pivotIndex] = {};
+    } else {
+      // Initialize to null to avoid changing the shape of the proto when it
+      // gets eventually set.
+      msg.extensionObject_ = null;
+    }
   } else {
-    // suggestedPivot is -1, which means that we don't have an extension object
-    // at all, in which case all fields are stored in the array.
     msg.pivot_ = Number.MAX_VALUE;
   }
 };
@@ -503,7 +456,7 @@
   for (var fieldNumber in extensions) {
     var fieldInfo = extensions[fieldNumber];
     var value = getExtensionFn.call(proto, fieldInfo);
-    if (value != null) {
+    if (value) {
       for (var name in fieldInfo.fieldName) {
         if (fieldInfo.fieldName.hasOwnProperty(name)) {
           break; // the compiled field name
@@ -530,24 +483,22 @@
  * @param {!jspb.Message} proto The proto whose extensions to convert.
  * @param {*} writer The binary-format writer to write to.
  * @param {!Object} extensions The proto class' registered extensions.
- * @param {function(this:jspb.Message,!jspb.ExtensionFieldInfo) : *} getExtensionFn The proto
+ * @param {function(jspb.ExtensionFieldInfo) : *} getExtensionFn The proto
  *     class' getExtension function. Passed for effective dead code removal.
  */
 jspb.Message.serializeBinaryExtensions = function(proto, writer, extensions,
     getExtensionFn) {
   for (var fieldNumber in extensions) {
-    var binaryFieldInfo = extensions[fieldNumber];
-    var fieldInfo = binaryFieldInfo.fieldInfo;
-
+    var fieldInfo = extensions[fieldNumber];
     // The old codegen doesn't add the extra fields to ExtensionFieldInfo, so we
     // need to gracefully error-out here rather than produce a null dereference
     // below.
-    if (!binaryFieldInfo.binaryWriterFn) {
+    if (!fieldInfo.binaryWriterFn) {
       throw new Error('Message extension present that was generated ' +
                       'without binary serialization support');
     }
     var value = getExtensionFn.call(proto, fieldInfo);
-    if (value != null) {
+    if (value) {
       if (fieldInfo.isMessageType()) {
         // If the message type of the extension was generated without binary
         // support, there may not be a binary message serializer function, and
@@ -555,17 +506,16 @@
         // message may require binary support, so we can *only* catch this error
         // here, at runtime (and this decoupled codegen is the whole point of
         // extensions!).
-        if (binaryFieldInfo.binaryMessageSerializeFn) {
-          binaryFieldInfo.binaryWriterFn.call(writer, fieldInfo.fieldIndex,
-              value, binaryFieldInfo.binaryMessageSerializeFn);
+        if (fieldInfo.binaryMessageSerializeFn) {
+          fieldInfo.binaryWriterFn.call(writer, fieldInfo.fieldIndex,
+              value, fieldInfo.binaryMessageSerializeFn);
         } else {
           throw new Error('Message extension present holding submessage ' +
                           'without binary support enabled, and message is ' +
                           'being serialized to binary format');
         }
       } else {
-        binaryFieldInfo.binaryWriterFn.call(
-            writer, fieldInfo.fieldIndex, value);
+        fieldInfo.binaryWriterFn.call(writer, fieldInfo.fieldIndex, value);
       }
     }
   }
@@ -576,23 +526,19 @@
  * Reads an extension field from the given reader and, if a valid extension,
  * sets the extension value.
  * @param {!jspb.Message} msg A jspb proto.
- * @param {{
- *   skipField:function(this:jspb.BinaryReader),
- *   getFieldNumber:function(this:jspb.BinaryReader):number
- * }} reader
+ * @param {{skipField:function(),getFieldNumber:function():number}} reader
  * @param {!Object} extensions The extensions object.
- * @param {function(this:jspb.Message,!jspb.ExtensionFieldInfo)} getExtensionFn
- * @param {function(this:jspb.Message,!jspb.ExtensionFieldInfo, ?)} setExtensionFn
+ * @param {function(jspb.ExtensionFieldInfo)} getExtensionFn
+ * @param {function(jspb.ExtensionFieldInfo, ?)} setExtensionFn
  */
 jspb.Message.readBinaryExtension = function(msg, reader, extensions,
     getExtensionFn, setExtensionFn) {
-  var binaryFieldInfo = extensions[reader.getFieldNumber()];
-  if (!binaryFieldInfo) {
+  var fieldInfo = extensions[reader.getFieldNumber()];
+  if (!fieldInfo) {
     reader.skipField();
     return;
   }
-  var fieldInfo = binaryFieldInfo.fieldInfo;
-  if (!binaryFieldInfo.binaryReaderFn) {
+  if (!fieldInfo.binaryReaderFn) {
     throw new Error('Deserializing extension whose generated code does not ' +
                     'support binary format');
   }
@@ -600,14 +546,14 @@
   var value;
   if (fieldInfo.isMessageType()) {
     value = new fieldInfo.ctor();
-    binaryFieldInfo.binaryReaderFn.call(
-        reader, value, binaryFieldInfo.binaryMessageDeserializeFn);
+    fieldInfo.binaryReaderFn.call(
+        reader, value, fieldInfo.binaryMessageDeserializeFn);
   } else {
     // All other types.
-    value = binaryFieldInfo.binaryReaderFn.call(reader);
+    value = fieldInfo.binaryReaderFn.call(reader);
   }
 
-  if (fieldInfo.isRepeated && !binaryFieldInfo.isPacked) {
+  if (fieldInfo.isRepeated && !fieldInfo.isPacked) {
     var currentList = getExtensionFn.call(msg, fieldInfo);
     if (!currentList) {
       setExtensionFn.call(msg, fieldInfo, [value]);
@@ -637,9 +583,6 @@
     }
     return val;
   } else {
-    if (!msg.extensionObject_) {
-      return undefined;
-    }
     var val = msg.extensionObject_[fieldNumber];
     if (val === jspb.Message.EMPTY_LIST_SENTINEL_) {
       return msg.extensionObject_[fieldNumber] = [];
@@ -650,32 +593,6 @@
 
 
 /**
- * Gets the value of a non-extension repeated field.
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @return {!Array}
- * The field's value.
- * @protected
- */
-jspb.Message.getRepeatedField = function(msg, fieldNumber) {
-  if (fieldNumber < msg.pivot_) {
-    var index = jspb.Message.getIndex_(msg, fieldNumber);
-    var val = msg.array[index];
-    if (val === jspb.Message.EMPTY_LIST_SENTINEL_) {
-      return msg.array[index] = [];
-    }
-    return val;
-  }
-
-  var val = msg.extensionObject_[fieldNumber];
-  if (val === jspb.Message.EMPTY_LIST_SENTINEL_) {
-    return msg.extensionObject_[fieldNumber] = [];
-  }
-  return val;
-};
-
-
-/**
  * Gets the value of an optional float or double field.
  * @param {!jspb.Message} msg A jspb proto.
  * @param {number} fieldNumber The field number.
@@ -697,7 +614,7 @@
  * @protected
  */
 jspb.Message.getRepeatedFloatingPointField = function(msg, fieldNumber) {
-  var values = jspb.Message.getRepeatedField(msg, fieldNumber);
+  var values = jspb.Message.getField(msg, fieldNumber);
   if (!msg.convertedFloatingPointFields_) {
     msg.convertedFloatingPointFields_ = {};
   }
@@ -810,7 +727,7 @@
  * @return {T} The field's value.
  * @protected
  */
-jspb.Message.getFieldWithDefault = function(msg, fieldNumber, defaultValue) {
+jspb.Message.getFieldProto3 = function(msg, fieldNumber, defaultValue) {
   var value = jspb.Message.getField(msg, fieldNumber);
   if (value == null) {
     return defaultValue;
@@ -821,58 +738,6 @@
 
 
 /**
- * Alias for getFieldWithDefault used by older generated code.
- * @template T
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {T} defaultValue The default value.
- * @return {T} The field's value.
- * @protected
- */
-jspb.Message.getFieldProto3 = jspb.Message.getFieldWithDefault;
-
-
-/**
- * Gets the value of a map field, lazily creating the map container if
- * necessary.
- *
- * This should only be called from generated code, because it requires knowledge
- * of serialization/parsing callbacks (which are required by the map at
- * construction time, and the map may be constructed here).
- *
- * @template K, V
- * @param {!jspb.Message} msg
- * @param {number} fieldNumber
- * @param {boolean|undefined} noLazyCreate
- * @param {?=} opt_valueCtor
- * @return {!jspb.Map<K, V>|undefined}
- * @protected
- */
-jspb.Message.getMapField = function(msg, fieldNumber, noLazyCreate,
-    opt_valueCtor) {
-  if (!msg.wrappers_) {
-    msg.wrappers_ = {};
-  }
-  // If we already have a map in the map wrappers, return that.
-  if (fieldNumber in msg.wrappers_) {
-    return msg.wrappers_[fieldNumber];
-  } else if (noLazyCreate) {
-    return undefined;
-  } else {
-    // Wrap the underlying elements array with a Map.
-    var arr = jspb.Message.getField(msg, fieldNumber);
-    if (!arr) {
-      arr = [];
-      jspb.Message.setField(msg, fieldNumber, arr);
-    }
-    return msg.wrappers_[fieldNumber] =
-        new jspb.Map(
-            /** @type {!Array<!Array<!Object>>} */ (arr), opt_valueCtor);
-  }
-};
-
-
-/**
  * Sets the value of a non-extension field.
  * @param {!jspb.Message} msg A jspb proto.
  * @param {number} fieldNumber The field number.
@@ -883,125 +748,12 @@
   if (fieldNumber < msg.pivot_) {
     msg.array[jspb.Message.getIndex_(msg, fieldNumber)] = value;
   } else {
-    jspb.Message.maybeInitEmptyExtensionObject_(msg);
     msg.extensionObject_[fieldNumber] = value;
   }
 };
 
 
 /**
- * Sets the value of a non-extension integer field of a proto3
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {number} value New value
- * @protected
- */
-jspb.Message.setProto3IntField = function(msg, fieldNumber, value) {
-  jspb.Message.setFieldIgnoringDefault_(msg, fieldNumber, value, 0);
-};
-
-
-/**
- * Sets the value of a non-extension floating point field of a proto3
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {number} value New value
- * @protected
- */
-jspb.Message.setProto3FloatField = function(msg, fieldNumber, value) {
-  jspb.Message.setFieldIgnoringDefault_(msg, fieldNumber, value, 0.0);
-};
-
-
-/**
- * Sets the value of a non-extension boolean field of a proto3
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {boolean} value New value
- * @protected
- */
-jspb.Message.setProto3BooleanField = function(msg, fieldNumber, value) {
-  jspb.Message.setFieldIgnoringDefault_(msg, fieldNumber, value, false);
-};
-
-
-/**
- * Sets the value of a non-extension String field of a proto3
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {string} value New value
- * @protected
- */
-jspb.Message.setProto3StringField = function(msg, fieldNumber, value) {
-  jspb.Message.setFieldIgnoringDefault_(msg, fieldNumber, value, "");
-};
-
-
-/**
- * Sets the value of a non-extension Bytes field of a proto3
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {!Uint8Array|string} value New value
- * @protected
- */
-jspb.Message.setProto3BytesField = function(msg, fieldNumber, value) {
-  jspb.Message.setFieldIgnoringDefault_(msg, fieldNumber, value, "");
-};
-
-
-/**
- * Sets the value of a non-extension enum field of a proto3
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {number} value New value
- * @protected
- */
-jspb.Message.setProto3EnumField = function(msg, fieldNumber, value) {
-  jspb.Message.setFieldIgnoringDefault_(msg, fieldNumber, value, 0);
-};
-
-
-
-/**
- * Sets the value of a non-extension primitive field, with proto3 (non-nullable
- * primitives) semantics of ignoring values that are equal to the type's
- * default.
- * @template T
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {!Uint8Array|string|number|boolean|undefined} value New value
- * @param {!Uint8Array|string|number|boolean} defaultValue The default value.
- * @private
- */
-jspb.Message.setFieldIgnoringDefault_ = function(
-    msg, fieldNumber, value, defaultValue) {
-  if (value != defaultValue) {
-    jspb.Message.setField(msg, fieldNumber, value);
-  } else {
-    msg.array[jspb.Message.getIndex_(msg, fieldNumber)] = null;
-  }
-};
-
-
-/**
- * Adds a value to a repeated, primitive field.
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {string|number|boolean|!Uint8Array} value New value
- * @param {number=} opt_index Index where to put new value.
- * @protected
- */
-jspb.Message.addToRepeatedField = function(msg, fieldNumber, value, opt_index) {
-  var arr = jspb.Message.getRepeatedField(msg, fieldNumber);
-  if (opt_index != undefined) {
-    arr.splice(opt_index, 0, value);
-  } else {
-    arr.push(value);
-  }
-};
-
-
-/**
  * Sets the value of a field in a oneof union and clears all other fields in
  * the union.
  * @param {!jspb.Message} msg A jspb proto.
@@ -1098,34 +850,21 @@
  * @protected
  */
 jspb.Message.getRepeatedWrapperField = function(msg, ctor, fieldNumber) {
-  jspb.Message.wrapRepeatedField_(msg, ctor, fieldNumber);
-  var val = msg.wrappers_[fieldNumber];
-  if (val == jspb.Message.EMPTY_LIST_SENTINEL_) {
-    val = msg.wrappers_[fieldNumber] = [];
-  }
-  return /** @type {!Array<!jspb.Message>} */ (val);
-};
-
-
-/**
- * Wraps underlying array into proto message representation if it wasn't done
- * before.
- * @param {!jspb.Message} msg A jspb proto.
- * @param {function(new:jspb.Message, ?Array)} ctor Constructor for the field.
- * @param {number} fieldNumber The field number.
- * @private
- */
-jspb.Message.wrapRepeatedField_ = function(msg, ctor, fieldNumber) {
   if (!msg.wrappers_) {
     msg.wrappers_ = {};
   }
   if (!msg.wrappers_[fieldNumber]) {
-    var data = jspb.Message.getRepeatedField(msg, fieldNumber);
+    var data = jspb.Message.getField(msg, fieldNumber);
     for (var wrappers = [], i = 0; i < data.length; i++) {
       wrappers[i] = new ctor(data[i]);
     }
     msg.wrappers_[fieldNumber] = wrappers;
   }
+  var val = msg.wrappers_[fieldNumber];
+  if (val == jspb.Message.EMPTY_LIST_SENTINEL_) {
+    val = msg.wrappers_[fieldNumber] = [];
+  }
+  return /** @type {Array<!jspb.Message>} */ (val);
 };
 
 
@@ -1133,8 +872,7 @@
  * Sets a proto field and syncs it to the backing array.
  * @param {!jspb.Message} msg A jspb proto.
  * @param {number} fieldNumber The field number.
- * @param {?jspb.Message|?jspb.Map|undefined} value A new value for this proto
- * field.
+ * @param {jspb.Message|undefined} value A new value for this proto field.
  * @protected
  */
 jspb.Message.setWrapperField = function(msg, fieldNumber, value) {
@@ -1186,48 +924,6 @@
 
 
 /**
- * Add a message to a repeated proto field.
- * @param {!jspb.Message} msg A jspb proto.
- * @param {number} fieldNumber The field number.
- * @param {T_CHILD|undefined} value Proto that will be added to the
- *     repeated field.
- * @param {function(new:T_CHILD, ?Array=)} ctor The constructor of the
- *     message type.
- * @param {number|undefined} index Index at which to insert the value.
- * @return {T_CHILD_NOT_UNDEFINED} proto that was inserted to the repeated field
- * @template MessageType
- * Use go/closure-ttl to declare a non-undefined version of T_CHILD. Replace the
- * undefined in blah|undefined with none. This is necessary because the compiler
- * will infer T_CHILD to be |undefined.
- * @template T_CHILD
- * @template T_CHILD_NOT_UNDEFINED :=
- *     cond(isUnknown(T_CHILD), unknown(),
- *       mapunion(T_CHILD, (X) =>
- *         cond(eq(X, 'undefined'), none(), X)))
- * =:
- * @protected
- */
-jspb.Message.addToRepeatedWrapperField = function(
-    msg, fieldNumber, value, ctor, index) {
-  jspb.Message.wrapRepeatedField_(msg, ctor, fieldNumber);
-  var wrapperArray = msg.wrappers_[fieldNumber];
-  if (!wrapperArray) {
-    wrapperArray = msg.wrappers_[fieldNumber] = [];
-  }
-  var insertedValue = value ? value : new ctor();
-  var array = jspb.Message.getRepeatedField(msg, fieldNumber);
-  if (index != undefined) {
-    wrapperArray.splice(index, 0, insertedValue);
-    array.splice(index, 0, insertedValue.toArray());
-  } else {
-    wrapperArray.push(insertedValue);
-    array.push(insertedValue.toArray());
-  }
-  return insertedValue;
-};
-
-
-/**
  * Converts a JsPb repeated message field into a map. The map will contain
  * protos unless an optional toObject function is given, in which case it will
  * contain objects suitable for Soy rendering.
@@ -1257,51 +953,17 @@
 
 
 /**
- * Syncs all map fields' contents back to their underlying arrays.
- * @private
- */
-jspb.Message.prototype.syncMapFields_ = function() {
-  // This iterates over submessage, map, and repeated fields, which is intended.
-  // Submessages can contain maps which also need to be synced.
-  //
-  // There is a lot of opportunity for optimization here.  For example we could
-  // statically determine that some messages have no submessages with maps and
-  // optimize this method away for those just by generating one extra static
-  // boolean per message type.
-  if (this.wrappers_) {
-    for (var fieldNumber in this.wrappers_) {
-      var val = this.wrappers_[fieldNumber];
-      if (goog.isArray(val)) {
-        for (var i = 0; i < val.length; i++) {
-          if (val[i]) {
-            val[i].toArray();
-          }
-        }
-      } else {
-        // Works for submessages and maps.
-        if (val) {
-          val.toArray();
-        }
-      }
-    }
-  }
-};
-
-
-/**
  * Returns the internal array of this proto.
  * <p>Note: If you use this array to construct a second proto, the content
  * would then be partially shared between the two protos.
  * @return {!Array} The proto represented as an array.
  */
 jspb.Message.prototype.toArray = function() {
-  this.syncMapFields_();
   return this.array;
 };
 
 
 
-if (jspb.Message.GENERATE_TO_STRING) {
 
 /**
  * Creates a string representation of the internal data array of this proto.
@@ -1310,11 +972,9 @@
  * @override
  */
 jspb.Message.prototype.toString = function() {
-  this.syncMapFields_();
   return this.array.toString();
 };
 
-}
 
 /**
  * Gets the value of the extension field from the extended object.
@@ -1363,39 +1023,32 @@
  * @param {jspb.ExtensionFieldInfo} fieldInfo Specifies the field to set.
  * @param {jspb.Message|string|Uint8Array|number|boolean|Array?} value The value
  *     to set.
- * @return {THIS} For chaining
- * @this {THIS}
- * @template THIS
  */
 jspb.Message.prototype.setExtension = function(fieldInfo, value) {
-  // Cast self, since the inferred THIS is unknown inside the function body.
-  // https://github.com/google/closure-compiler/issues/1411#issuecomment-232442220
-  var self = /** @type {!jspb.Message} */ (this);
-  if (!self.wrappers_) {
-    self.wrappers_ = {};
+  if (!this.wrappers_) {
+    this.wrappers_ = {};
   }
-  jspb.Message.maybeInitEmptyExtensionObject_(self);
+  jspb.Message.maybeInitEmptyExtensionObject_(this);
   var fieldNumber = fieldInfo.fieldIndex;
   if (fieldInfo.isRepeated) {
     value = value || [];
     if (fieldInfo.isMessageType()) {
-      self.wrappers_[fieldNumber] = value;
-      self.extensionObject_[fieldNumber] = goog.array.map(
+      this.wrappers_[fieldNumber] = value;
+      this.extensionObject_[fieldNumber] = goog.array.map(
           /** @type {Array<jspb.Message>} */ (value), function(msg) {
         return msg.toArray();
       });
     } else {
-      self.extensionObject_[fieldNumber] = value;
+      this.extensionObject_[fieldNumber] = value;
     }
   } else {
     if (fieldInfo.isMessageType()) {
-      self.wrappers_[fieldNumber] = value;
-      self.extensionObject_[fieldNumber] = value ? value.toArray() : value;
+      this.wrappers_[fieldNumber] = value;
+      this.extensionObject_[fieldNumber] = value ? value.toArray() : value;
     } else {
-      self.extensionObject_[fieldNumber] = value;
+      this.extensionObject_[fieldNumber] = value;
     }
   }
-  return self;
 };
 
 
@@ -1564,30 +1217,7 @@
 
 
 /**
- * Templated, type-safe cloneMessage definition.
- * @return {THIS}
- * @this {THIS}
- * @template THIS
- */
-jspb.Message.prototype.cloneMessage = function() {
-  return jspb.Message.cloneMessage(/** @type {!jspb.Message} */ (this));
-};
-
-/**
- * Alias clone to cloneMessage. goog.object.unsafeClone uses clone to
- * efficiently copy objects. Without this alias, copying jspb messages comes
- * with a large performance penalty.
- * @return {THIS}
- * @this {THIS}
- * @template THIS
- */
-jspb.Message.prototype.clone = function() {
-  return jspb.Message.cloneMessage(/** @type {!jspb.Message} */ (this));
-};
-
-/**
- * Static clone function. NOTE: A type-safe method called "cloneMessage"
- * exists
+ * Static clone function. NOTE: A type-safe method called "cloneMessage" exists
  * on each generated JsPb class. Do not call this function directly.
  * @param {!jspb.Message} msg A message to clone.
  * @return {!jspb.Message} A deep clone of the given message.
@@ -1663,9 +1293,6 @@
     }
     return clonedArray;
   }
-  if (jspb.Message.SUPPORTS_UINT8ARRAY_ && obj instanceof Uint8Array) {
-    return new Uint8Array(obj);
-  }
   var clone = {};
   for (var key in obj) {
     if ((o = obj[key]) != null) {
@@ -1708,4 +1335,3 @@
  * @type {!Object.<number, jspb.ExtensionFieldInfo>}
  */
 jspb.Message.messageSetExtensions = {};
-jspb.Message.messageSetExtensionsBinary = {};
diff --git a/js/message_test.js b/js/message_test.js
index 7d61dac..01add5f 100644
--- a/js/message_test.js
+++ b/js/message_test.js
@@ -33,17 +33,11 @@
 goog.setTestOnly();
 
 goog.require('goog.json');
-goog.require('goog.string');
 goog.require('goog.testing.asserts');
-goog.require('goog.userAgent');
 
 // CommonJS-LoadFromFile: google-protobuf jspb
 goog.require('jspb.Message');
 
-// CommonJS-LoadFromFile: test8_pb proto.jspb.exttest.nested
-goog.require('proto.jspb.exttest.nested.TestNestedExtensionsMessage');
-goog.require('proto.jspb.exttest.nested.TestOuterMessage');
-
 // CommonJS-LoadFromFile: test5_pb proto.jspb.exttest.beta
 goog.require('proto.jspb.exttest.beta.floatingStrField');
 
@@ -72,7 +66,6 @@
 goog.require('proto.jspb.test.Simple2');
 goog.require('proto.jspb.test.SpecialCases');
 goog.require('proto.jspb.test.TestClone');
-goog.require('proto.jspb.test.TestEndsWithBytes');
 goog.require('proto.jspb.test.TestGroup');
 goog.require('proto.jspb.test.TestGroup1');
 goog.require('proto.jspb.test.TestMessageWithOneof');
@@ -84,6 +77,8 @@
 goog.require('proto.jspb.test.TestExtensionsMessage');
 
 
+
+
 describe('Message test suite', function() {
   it('testEmptyProto', function() {
     var empty1 = new proto.jspb.test.Empty([]);
@@ -218,10 +213,6 @@
     assertEquals(true, response.getBoolField());
     assertEquals(11, response.getIntField());
     assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
 
     // Test with null values, as would be returned by a JSON serializer.
     response = makeDefault([null, null, null, null]);
@@ -229,10 +220,6 @@
     assertEquals(true, response.getBoolField());
     assertEquals(11, response.getIntField());
     assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
 
     // Test with false-like values.
     response = makeDefault(['', false, 0, 0]);
@@ -240,10 +227,6 @@
     assertEquals(false, response.getBoolField());
     assertEquals(true, response.getIntField() == 0);
     assertEquals(true, response.getEnumField() == 0);
-    assertTrue(response.hasStringField());
-    assertTrue(response.hasBoolField());
-    assertTrue(response.hasIntField());
-    assertTrue(response.hasEnumField());
 
     // Test that clearing the values reverts them to the default state.
     response = makeDefault(['blah', false, 111, 77]);
@@ -253,10 +236,6 @@
     assertEquals(true, response.getBoolField());
     assertEquals(11, response.getIntField());
     assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
 
     // Test that setFoo(null) clears the values.
     response = makeDefault(['blah', false, 111, 77]);
@@ -266,13 +245,18 @@
     assertEquals(true, response.getBoolField());
     assertEquals(11, response.getIntField());
     assertEquals(13, response.getEnumField());
-    assertFalse(response.hasStringField());
-    assertFalse(response.hasBoolField());
-    assertFalse(response.hasIntField());
-    assertFalse(response.hasEnumField());
+  });
+
+  it('testMessageRegistration', function() {
+    // goog.require(SomeResponse) will include its library, which will in
+    // turn add SomeResponse to the message registry.
+    assertEquals(jspb.Message.registry_['res'], proto.jspb.test.SomeResponse);
   });
 
   it('testClearFields', function() {
+    // We don't set 'proper' defaults, rather, bools, strings,
+    // etc, are cleared to undefined or null and take on the Javascript
+    // meaning for that value. Repeated fields are set to [] when cleared.
     var data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
     var foo = new proto.jspb.test.OptionalFields(data);
     foo.clearAString();
@@ -280,11 +264,9 @@
     foo.clearANestedMessage();
     foo.clearARepeatedMessageList();
     foo.clearARepeatedStringList();
-    assertEquals('', foo.getAString());
-    assertEquals(false, foo.getABool());
+    assertUndefined(foo.getAString());
+    assertUndefined(foo.getABool());
     assertUndefined(foo.getANestedMessage());
-    assertFalse(foo.hasAString());
-    assertFalse(foo.hasABool());
     assertObjectEquals([], foo.getARepeatedMessageList());
     assertObjectEquals([], foo.getARepeatedStringList());
     // NOTE: We want the missing fields in 'expected' to be undefined,
@@ -294,17 +276,51 @@
     var expected = [,,, [], []];
     expected[0] = expected[1] = expected[2] = undefined;
     assertObjectEquals(expected, foo.toArray());
+
+    // Test set(null). We could deprecated this in favor of clear(), but
+    // it's also convenient to have.
+    data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
+    foo = new proto.jspb.test.OptionalFields(data);
+    foo.setAString(null);
+    foo.setABool(null);
+    foo.setANestedMessage(null);
+    foo.setARepeatedMessageList(null);
+    foo.setARepeatedStringList(null);
+    assertNull(foo.getAString());
+    assertNull(foo.getABool());
+    assertNull(foo.getANestedMessage());
+    assertObjectEquals([], foo.getARepeatedMessageList());
+    assertObjectEquals([], foo.getARepeatedStringList());
+    assertObjectEquals([null, null, null, [], []], foo.toArray());
+
+    // Test set(undefined). Again, not something we really need, and not
+    // supported directly by our typing, but it should 'do the right thing'.
+    data = ['str', true, [11], [[22], [33]], ['s1', 's2']];
+    foo = new proto.jspb.test.OptionalFields(data);
+    foo.setAString(undefined);
+    foo.setABool(undefined);
+    foo.setANestedMessage(undefined);
+    foo.setARepeatedMessageList(undefined);
+    foo.setARepeatedStringList(undefined);
+    assertUndefined(foo.getAString());
+    assertUndefined(foo.getABool());
+    assertUndefined(foo.getANestedMessage());
+    assertObjectEquals([], foo.getARepeatedMessageList());
+    assertObjectEquals([], foo.getARepeatedStringList());
+    expected = [,,, [], []];
+    expected[0] = expected[1] = expected[2] = undefined;
+    assertObjectEquals(expected, foo.toArray());
   });
 
-  it('testDifferenceRawObject', /** @suppress {visibility} */ function() {
+  it('testDifferenceRawObject', function() {
     var p1 = new proto.jspb.test.HasExtensions(['hi', 'diff', {}]);
     var p2 = new proto.jspb.test.HasExtensions(['hi', 'what',
                                                {1000: 'unique'}]);
     var diff = /** @type {proto.jspb.test.HasExtensions} */
         (jspb.Message.difference(p1, p2));
-    assertEquals('', diff.getStr1());
+    assertUndefined(diff.getStr1());
     assertEquals('what', diff.getStr2());
-    assertEquals('', diff.getStr3());
+    assertUndefined(diff.getStr3());
     assertEquals('unique', diff.extensionObject_[1000]);
   });
 
@@ -422,8 +438,6 @@
   });
 
   it('testClone', function() {
-    var supportsUint8Array =
-        !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
     var original = new proto.jspb.test.TestClone();
     original.setStr('v1');
     var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
@@ -431,14 +445,12 @@
     var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
     original.setSimple1(simple1);
     original.setSimple2List([simple2, simple3]);
-    var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
-    original.setBytesField(bytes1);
     var extension = new proto.jspb.test.CloneExtension();
     extension.setExt('e1');
     original.setExtension(proto.jspb.test.IsExtension.extField, extension);
-    var clone = original.clone();
+    var clone = original.cloneMessage();
     assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],,
-      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }],
+      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]],,, { 100: [, 'e1'] }],
         clone.toArray());
     clone.setStr('v2');
     var simple4 = new proto.jspb.test.Simple1(['a1', ['b1', 'c1']]);
@@ -446,26 +458,18 @@
     var simple6 = new proto.jspb.test.Simple1(['a3', ['b3', 'c3']]);
     clone.setSimple1(simple4);
     clone.setSimple2List([simple5, simple6]);
-    if (supportsUint8Array) {
-      clone.getBytesField()[0] = 4;
-      assertObjectEquals(bytes1, original.getBytesField());
-    }
-    var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
-    clone.setBytesField(bytes2);
     var newExtension = new proto.jspb.test.CloneExtension();
     newExtension.setExt('e2');
     clone.setExtension(proto.jspb.test.CloneExtension.extField, newExtension);
     assertArrayEquals(['v2',, ['a1', ['b1', 'c1']],,
-      [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]], bytes2,, { 100: [, 'e2'] }],
+      [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]],,, { 100: [, 'e2'] }],
         clone.toArray());
     assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],,
-      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }],
+      [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]],,, { 100: [, 'e1'] }],
         original.toArray());
   });
 
   it('testCopyInto', function() {
-    var supportsUint8Array =
-        !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
     var original = new proto.jspb.test.TestClone();
     original.setStr('v1');
     var dest = new proto.jspb.test.TestClone();
@@ -480,10 +484,6 @@
     original.setSimple2List([simple2, simple3]);
     dest.setSimple1(destSimple1);
     dest.setSimple2List([destSimple2, destSimple3]);
-    var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
-    var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
-    original.setBytesField(bytes1);
-    dest.setBytesField(bytes2);
     var extension = new proto.jspb.test.CloneExtension();
     extension.setExt('e1');
     original.setExtension(proto.jspb.test.CloneExtension.extField, extension);
@@ -496,15 +496,6 @@
     dest.getSimple1().setAString('new value');
     assertNotEquals(dest.getSimple1().getAString(),
         original.getSimple1().getAString());
-    if (supportsUint8Array) {
-      dest.getBytesField()[0] = 7;
-      assertObjectEquals(bytes1, original.getBytesField());
-      assertObjectEquals(new Uint8Array([7, 2, 3]), dest.getBytesField());
-    } else {
-      dest.setBytesField('789');
-      assertObjectEquals(bytes1, original.getBytesField());
-      assertObjectEquals('789', dest.getBytesField());
-    }
     dest.getExtension(proto.jspb.test.CloneExtension.extField).
         setExt('new value');
     assertNotEquals(
@@ -583,14 +574,6 @@
     assertNotUndefined(proto.jspb.exttest.beta.floatingStrField);
   });
 
-  it('testNestedExtensions', function() {
-    var extendable = new proto.jspb.exttest.nested.TestNestedExtensionsMessage();
-    var extension = new proto.jspb.exttest.nested.TestOuterMessage.NestedExtensionMessage(['s1']);
-    extendable.setExtension(proto.jspb.exttest.nested.TestOuterMessage.innerExtension, extension);
-    assertObjectEquals(extension,
-        extendable.getExtension(proto.jspb.exttest.nested.TestOuterMessage.innerExtension));
-  });
-
   it('testToObject_extendedObject', function() {
     var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
     var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2'], true]);
@@ -654,7 +637,12 @@
 
   it('testInitialization_emptyArray', function() {
     var msg = new proto.jspb.test.HasExtensions([]);
-    assertArrayEquals([], msg.toArray());
+    if (jspb.Message.MINIMIZE_MEMORY_ALLOCATIONS) {
+      assertArrayEquals([], msg.toArray());
+    } else {
+      // Extension object is created past all regular fields.
+      assertArrayEquals([,,, {}], msg.toArray());
+    }
   });
 
   it('testInitialization_justExtensionObject', function() {
@@ -674,19 +662,17 @@
     assertArrayEquals([1, 2, 3, {1: 'hi'}], msg.toArray());
   });
 
-  it('testExtendedMessageEnsureObject',
-     /** @suppress {visibility} */ function() {
-       var data =
-           new proto.jspb.test.HasExtensions(['str1', {'a_key': 'an_object'}]);
-       assertEquals('an_object', data.extensionObject_['a_key']);
-     });
+  it('testExtendedMessageEnsureObject', function() {
+    var data = new proto.jspb.test.HasExtensions(['str1',
+        {'a_key': 'an_object'}]);
+    assertEquals('an_object', data.extensionObject_['a_key']);
+  });
 
   it('testToObject_hasExtensionField', function() {
-    var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1'], 102: ''}]);
+    var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]);
     var obj = data.toObject();
     assertEquals('str1', obj.str1);
     assertEquals('ext1', obj.extField.ext1);
-    assertEquals('', obj.str);
   });
 
   it('testGetExtension', function() {
@@ -767,7 +753,7 @@
     var message = new proto.jspb.test.TestMessageWithOneof([,, 'x']);
 
     assertEquals('x', message.getPone());
-    assertEquals('', message.getPthree());
+    assertUndefined(message.getPthree());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
         message.getPartialOneofCase());
@@ -776,7 +762,7 @@
   it('testKeepsLastWireValueSetInUnion_multipleValues', function() {
     var message = new proto.jspb.test.TestMessageWithOneof([,, 'x',, 'y']);
 
-    assertEquals('', message.getPone());
+    assertUndefined('x', message.getPone());
     assertEquals('y', message.getPthree());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PTHREE,
@@ -785,47 +771,35 @@
 
   it('testSettingOneofFieldClearsOthers', function() {
     var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals('', message.getPone());
-    assertEquals('', message.getPthree());
-    assertFalse(message.hasPone());
-    assertFalse(message.hasPthree());
+    assertUndefined(message.getPone());
+    assertUndefined(message.getPthree());
 
     message.setPone('hi');
     assertEquals('hi', message.getPone());
-    assertEquals('', message.getPthree());
-    assertTrue(message.hasPone());
-    assertFalse(message.hasPthree());
+    assertUndefined(message.getPthree());
 
     message.setPthree('bye');
-    assertEquals('', message.getPone());
+    assertUndefined(message.getPone());
     assertEquals('bye', message.getPthree());
-    assertFalse(message.hasPone());
-    assertTrue(message.hasPthree());
   });
 
   it('testSettingOneofFieldDoesNotClearFieldsFromOtherUnions', function() {
     var other = new proto.jspb.test.TestMessageWithOneof;
     var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals('', message.getPone());
-    assertEquals('', message.getPthree());
+    assertUndefined(message.getPone());
+    assertUndefined(message.getPthree());
     assertUndefined(message.getRone());
-    assertFalse(message.hasPone());
-    assertFalse(message.hasPthree());
 
     message.setPone('hi');
     message.setRone(other);
     assertEquals('hi', message.getPone());
-    assertEquals('', message.getPthree());
+    assertUndefined(message.getPthree());
     assertEquals(other, message.getRone());
-    assertTrue(message.hasPone());
-    assertFalse(message.hasPthree());
 
     message.setPthree('bye');
-    assertEquals('', message.getPone());
+    assertUndefined(message.getPone());
     assertEquals('bye', message.getPthree());
     assertEquals(other, message.getRone());
-    assertFalse(message.hasPone());
-    assertTrue(message.hasPthree());
   });
 
   it('testUnsetsOneofCaseWhenFieldIsCleared', function() {
@@ -850,7 +824,7 @@
   it('testMessageWithDefaultOneofValues', function() {
     var message = new proto.jspb.test.TestMessageWithOneof;
     assertEquals(1234, message.getAone());
-    assertEquals(0, message.getAtwo());
+    assertUndefined(message.getAtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofACase
             .DEFAULT_ONEOF_A_NOT_SET,
@@ -858,7 +832,7 @@
 
     message.setAone(567);
     assertEquals(567, message.getAone());
-    assertEquals(0, message.getAtwo());
+    assertUndefined(message.getAtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE,
         message.getDefaultOneofACase());
@@ -872,7 +846,7 @@
 
     message.clearAtwo();
     assertEquals(1234, message.getAone());
-    assertEquals(0, message.getAtwo());
+    assertUndefined(message.getAtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofACase
             .DEFAULT_ONEOF_A_NOT_SET,
@@ -881,10 +855,8 @@
 
   it('testMessageWithDefaultOneofValues_defaultNotOnFirstField', function() {
     var message = new proto.jspb.test.TestMessageWithOneof;
-    assertEquals(0, message.getBone());
+    assertUndefined(message.getBone());
     assertEquals(1234, message.getBtwo());
-    assertFalse(message.hasBone());
-    assertFalse(message.hasBtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase
             .DEFAULT_ONEOF_B_NOT_SET,
@@ -893,25 +865,19 @@
     message.setBone(2);
     assertEquals(2, message.getBone());
     assertEquals(1234, message.getBtwo());
-    assertTrue(message.hasBone());
-    assertFalse(message.hasBtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BONE,
         message.getDefaultOneofBCase());
 
     message.setBtwo(3);
-    assertEquals(0, message.getBone());
-    assertFalse(message.hasBone());
-    assertTrue(message.hasBtwo());
+    assertUndefined(message.getBone());
     assertEquals(3, message.getBtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
         message.getDefaultOneofBCase());
 
     message.clearBtwo();
-    assertEquals(0, message.getBone());
-    assertFalse(message.hasBone());
-    assertFalse(message.hasBtwo());
+    assertUndefined(message.getBone());
     assertEquals(1234, message.getBtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase
@@ -923,7 +889,7 @@
     var message =
         new proto.jspb.test.TestMessageWithOneof(new Array(9).concat(567));
     assertEquals(567, message.getAone());
-    assertEquals(0, message.getAtwo());
+    assertUndefined(message.getAtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE,
         message.getDefaultOneofACase());
@@ -959,7 +925,7 @@
 
         message =
             new proto.jspb.test.TestMessageWithOneof(new Array(12).concat(890));
-        assertEquals(0, message.getBone());
+        assertUndefined(message.getBone());
         assertEquals(890, message.getBtwo());
         assertEquals(
             proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
@@ -967,7 +933,7 @@
 
         message = new proto.jspb.test.TestMessageWithOneof(
             new Array(11).concat(567, 890));
-        assertEquals(0, message.getBone());
+        assertUndefined(message.getBone());
         assertEquals(890, message.getBtwo());
         assertEquals(
             proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO,
@@ -984,7 +950,7 @@
     var other = new proto.jspb.test.TestMessageWithOneof;
     message.setRone(other);
     assertEquals(other, message.getRone());
-    assertEquals('', message.getRtwo());
+    assertUndefined(message.getRtwo());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.RONE,
         message.getRecursiveOneofCase());
@@ -1002,7 +968,7 @@
     var message = new proto.jspb.test.TestMessageWithOneof;
     message.setPone('x');
     assertEquals('x', message.getPone());
-    assertEquals('', message.getPthree());
+    assertUndefined(message.getPthree());
     assertEquals(
         proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
         message.getPartialOneofCase());
diff --git a/js/package.json b/js/package.json
index 39d99f9..ae05722 100644
--- a/js/package.json
+++ b/js/package.json
@@ -1,19 +1,17 @@
 {
   "name": "google-protobuf",
-  "version": "3.5.2",
+  "version": "3.0.0-alpha.6",
   "description": "Protocol Buffers for JavaScript",
   "main": "google-protobuf.js",
-  "files": [
-    "google"
-  ],
-  "dependencies": {},
-  "devDependencies": {
-    "glob": "~6.0.4",
-    "google-closure-compiler": "~20160619.0.0",
+  "dependencies": {
     "google-closure-library": "~20160125.0.0",
     "gulp": "~3.9.0",
     "jasmine": "~2.4.1"
   },
+  "devDependencies": {
+    "google-closure-compiler": "~20151216.2.0",
+    "glob": "~6.0.4"
+  },
   "scripts": {
     "test": "node ./node_modules/gulp/bin/gulp.js test"
   },
@@ -21,6 +19,6 @@
     "type": "git",
     "url": "https://github.com/google/protobuf/tree/master/js"
   },
-  "author": "Google Protocol Buffers Team",
-  "license" : "BSD-3-Clause"
+  "author": "",
+  "license": "Apache-2.0"
 }
diff --git a/js/proto3_test.js b/js/proto3_test.js
index 4aed88b..4dd7790 100644
--- a/js/proto3_test.js
+++ b/js/proto3_test.js
@@ -38,12 +38,6 @@
 goog.require('proto.jspb.test.Proto3Enum');
 goog.require('proto.jspb.test.TestProto3');
 
-// CommonJS-LoadFromFile: google/protobuf/timestamp_pb proto.google.protobuf
-goog.require('proto.google.protobuf.Timestamp');
-
-// CommonJS-LoadFromFile: google/protobuf/struct_pb proto.google.protobuf
-goog.require('proto.google.protobuf.Struct');
-
 
 var BYTES = new Uint8Array([1, 2, 8, 9]);
 var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES);
@@ -72,37 +66,6 @@
 
 
 describe('proto3Test', function() {
-
-  /**
-   * Test default values don't affect equality test.
-   */
-  it('testEqualsProto3', function() {
-    var msg1 = new proto.jspb.test.TestProto3();
-    var msg2 = new proto.jspb.test.TestProto3();
-    msg2.setOptionalString('');
-
-    assertTrue(jspb.Message.equals(msg1, msg2));
-  });
-
-
-  /**
-   * Test setting when a field has default semantics.
-   */
-  it('testSetProto3ToValueAndBackToDefault', function() {
-    var msg = new proto.jspb.test.TestProto3();
-
-    // Setting should work normally.
-    msg.setOptionalString('optionalString');
-    assertEquals(msg.getOptionalString(), 'optionalString');
-
-    // Clearing should work too ...
-    msg.setOptionalString('');
-    assertEquals(msg.getOptionalString(), '');
-
-    // ... and shouldn't affect the equality with a brand new message.
-    assertTrue(jspb.Message.equals(msg, new proto.jspb.test.TestProto3()));
-  });
-
   /**
    * Test defaults for proto3 message fields.
    */
@@ -256,67 +219,39 @@
    * Test that oneofs continue to have a notion of field presence.
    */
   it('testOneofs', function() {
-    // Default instance.
     var msg = new proto.jspb.test.TestProto3();
-    assertEquals(msg.getOneofUint32(), 0);
+
+    assertEquals(msg.getOneofUint32(), undefined);
     assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
+    assertEquals(msg.getOneofString(), undefined);
+    assertEquals(msg.getOneofBytes(), undefined);
 
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofForeignMessage());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    // Integer field.
     msg.setOneofUint32(42);
     assertEquals(msg.getOneofUint32(), 42);
     assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
+    assertEquals(msg.getOneofString(), undefined);
+    assertEquals(msg.getOneofBytes(), undefined);
 
-    assertTrue(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofForeignMessage());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
 
-    // Sub-message field.
     var submsg = new proto.jspb.test.ForeignMessage();
     msg.setOneofForeignMessage(submsg);
-    assertEquals(msg.getOneofUint32(), 0);
+    assertEquals(msg.getOneofUint32(), undefined);
     assertEquals(msg.getOneofForeignMessage(), submsg);
-    assertEquals(msg.getOneofString(), '');
-    assertEquals(msg.getOneofBytes(), '');
+    assertEquals(msg.getOneofString(), undefined);
+    assertEquals(msg.getOneofBytes(), undefined);
 
-    assertFalse(msg.hasOneofUint32());
-    assertTrue(msg.hasOneofForeignMessage());
-    assertFalse(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    // String field.
     msg.setOneofString('hello');
-    assertEquals(msg.getOneofUint32(), 0);
+    assertEquals(msg.getOneofUint32(), undefined);
     assertEquals(msg.getOneofForeignMessage(), undefined);
     assertEquals(msg.getOneofString(), 'hello');
-    assertEquals(msg.getOneofBytes(), '');
+    assertEquals(msg.getOneofBytes(), undefined);
 
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofForeignMessage());
-    assertTrue(msg.hasOneofString());
-    assertFalse(msg.hasOneofBytes());
-
-    // Bytes field.
     msg.setOneofBytes(goog.crypt.base64.encodeString('\u00FF\u00FF'));
-    assertEquals(msg.getOneofUint32(), 0);
+    assertEquals(msg.getOneofUint32(), undefined);
     assertEquals(msg.getOneofForeignMessage(), undefined);
-    assertEquals(msg.getOneofString(), '');
+    assertEquals(msg.getOneofString(), undefined);
     assertEquals(msg.getOneofBytes_asB64(),
         goog.crypt.base64.encodeString('\u00FF\u00FF'));
-
-    assertFalse(msg.hasOneofUint32());
-    assertFalse(msg.hasOneofForeignMessage());
-    assertFalse(msg.hasOneofString());
-    assertTrue(msg.hasOneofBytes());
   });
 
 
@@ -344,7 +279,7 @@
     msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_BAR);
     msg.setOptionalForeignEnum(proto.jspb.test.Proto3Enum.PROTO3_FOO);
     msg.setOneofUint32(32);
-    msg.clearOneofUint32();
+    msg.setOneofUint32(null);
 
 
     var serialized = msg.serializeBinary();
@@ -376,36 +311,4 @@
     assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
 
   });
-
-  it('testTimestampWellKnownType', function() {
-    var msg = new proto.google.protobuf.Timestamp();
-    msg.fromDate(new Date(123456789));
-    assertEquals(123456, msg.getSeconds());
-    assertEquals(789000000, msg.getNanos());
-    var date = msg.toDate();
-    assertEquals(123456789, date.getTime());
-  });
-
-  it('testStructWellKnownType', function() {
-    var jsObj = {
-      abc: "def",
-      number: 12345.678,
-      nullKey: null,
-      boolKey: true,
-      listKey: [1, null, true, false, "abc"],
-      structKey: {foo: "bar", somenum: 123},
-      complicatedKey: [{xyz: {abc: [3, 4, null, false]}}, "zzz"]
-    };
-
-    var struct = proto.google.protobuf.Struct.fromJavaScript(jsObj);
-    var jsObj2 = struct.toJavaScript();
-
-    assertEquals("def", jsObj2.abc);
-    assertEquals(12345.678, jsObj2.number);
-    assertEquals(null, jsObj2.nullKey);
-    assertEquals(true, jsObj2.boolKey);
-    assertEquals("abc", jsObj2.listKey[4]);
-    assertEquals("bar", jsObj2.structKey.foo);
-    assertEquals(4, jsObj2.complicatedKey[0].xyz.abc[1]);
-  });
 });
diff --git a/js/proto3_test.proto b/js/proto3_test.proto
index 0d073ea..acb6716 100644
--- a/js/proto3_test.proto
+++ b/js/proto3_test.proto
@@ -86,5 +86,4 @@
   PROTO3_FOO = 0;
   PROTO3_BAR = 1;
   PROTO3_BAZ = 2;
-  MSG_PROTO3_BAH = 3;
 }
diff --git a/js/test.proto b/js/test.proto
index 7c881c0..6b9dc89 100644
--- a/js/test.proto
+++ b/js/test.proto
@@ -160,7 +160,6 @@
   optional string str = 1;
   optional Simple1 simple1 = 3;
   repeated Simple1 simple2 = 5;
-  optional bytes bytes_field = 6;
   optional string unused = 7;
   extensions 10 to max;
 }
@@ -229,53 +228,3 @@
   }
 }
 
-message TestEndsWithBytes {
-  optional int32 value = 1;
-  optional bytes data = 2;
-}
-
-
-message Int64Types {
-  optional int64 int64_normal = 1 [jstype=JS_NORMAL];
-  optional sint64 int64_string = 2 [jstype=JS_STRING];
-  optional uint64 int64_number = 3 [jstype=JS_NUMBER];
-
-}
-
-message TestMapFieldsNoBinary {
-
-  map<string, string> map_string_string = 1;
-  map<string, int32> map_string_int32 = 2;
-  map<string, int64> map_string_int64 = 3;
-  map<string, bool> map_string_bool = 4;
-  map<string, double> map_string_double = 5;
-  map<string, MapValueEnumNoBinary> map_string_enum = 6;
-  map<string, MapValueMessageNoBinary> map_string_msg = 7;
-
-  map<int32, string> map_int32_string = 8;
-  map<int64, string> map_int64_string = 9;
-  map<bool, string> map_bool_string = 10;
-
-  optional TestMapFieldsNoBinary test_map_fields = 11;
-  map<string, TestMapFieldsNoBinary> map_string_testmapfields = 12;
-}
-
-enum MapValueEnumNoBinary {
-  MAP_VALUE_FOO_NOBINARY = 0;
-  MAP_VALUE_BAR_NOBINARY = 1;
-  MAP_VALUE_BAZ_NOBINARY = 2;
-}
-
-message MapValueMessageNoBinary {
-
-  optional int32 foo = 1;
-}
-
-message Deeply {
-  message Nested {
-    message Message {
-      optional int32 count = 1;
-    }
-  }
-}
-
diff --git a/js/test2.proto b/js/test2.proto
index b67f93f..44e55ef 100644
--- a/js/test2.proto
+++ b/js/test2.proto
@@ -35,8 +35,6 @@
 
 package jspb.test;
 
-import "test.proto";
-
 message TestExtensionsMessage {
   optional int32 intfield = 1;
   extensions 100 to max;
@@ -54,7 +52,3 @@
   optional ExtensionMessage floating_msg_field = 101;
   optional string floating_str_field = 102;
 }
-
-message ForeignNestedFieldMessage {
-  optional Deeply.Nested.Message deeply_nested_message = 1;
-}
diff --git a/js/test8.proto b/js/test8.proto
deleted file mode 100644
index 2ae80da..0000000
--- a/js/test8.proto
+++ /dev/null
@@ -1,50 +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.
-
-syntax = "proto2";
-
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
-
-package jspb.exttest.nested;
-
-message TestNestedExtensionsMessage {
-  optional int32 intfield = 1;
-  extensions 100 to max;
-}
-
-message TestOuterMessage {
-  message NestedExtensionMessage {
-    optional string ext1 = 1;
-  }
-  extend TestNestedExtensionsMessage {
-    optional NestedExtensionMessage inner_extension = 100;
-  }
-}
diff --git a/js/testbinary.proto b/js/testbinary.proto
index 116f17f..60c7019 100644
--- a/js/testbinary.proto
+++ b/js/testbinary.proto
@@ -183,30 +183,3 @@
       [packed=true];
 
 }
-
-message TestMapFields {
-  map<string, string> map_string_string = 1;
-  map<string, int32> map_string_int32 = 2;
-  map<string, int64> map_string_int64 = 3;
-  map<string, bool> map_string_bool = 4;
-  map<string, double> map_string_double = 5;
-  map<string, MapValueEnum> map_string_enum = 6;
-  map<string, MapValueMessage> map_string_msg = 7;
-
-  map<int32, string> map_int32_string = 8;
-  map<int64, string> map_int64_string = 9;
-  map<bool, string> map_bool_string = 10;
-
-  optional TestMapFields test_map_fields = 11;
-  map<string, TestMapFields> map_string_testmapfields = 12;
-}
-
-enum MapValueEnum {
-  MAP_VALUE_FOO = 0;
-  MAP_VALUE_BAR = 1;
-  MAP_VALUE_BAZ = 2;
-}
-
-message MapValueMessage {
-  optional int32 foo = 1;
-}
diff --git a/kokoro/README.md b/kokoro/README.md
deleted file mode 100644
index 0791c92..0000000
--- a/kokoro/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-
-Kokoro Infrastructure
-----------------------
-
-The files in this directory serve as plumbing for running Protobuf
-tests under Kokoro, our internal CI.
\ No newline at end of file
diff --git a/kokoro/linux/cpp_distcheck/build.sh b/kokoro/linux/cpp_distcheck/build.sh
deleted file mode 100755
index b8b57e3..0000000
--- a/kokoro/linux/cpp_distcheck/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/linux/prepare_build_linux_rc
-
-./tests.sh cpp_distcheck
diff --git a/kokoro/linux/cpp_distcheck/continuous.cfg b/kokoro/linux/cpp_distcheck/continuous.cfg
deleted file mode 100644
index 4289f6a..0000000
--- a/kokoro/linux/cpp_distcheck/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/cpp_distcheck/presubmit.cfg b/kokoro/linux/cpp_distcheck/presubmit.cfg
deleted file mode 100644
index 4289f6a..0000000
--- a/kokoro/linux/cpp_distcheck/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/csharp/build.sh b/kokoro/linux/csharp/build.sh
deleted file mode 100755
index de178b8..0000000
--- a/kokoro/linux/csharp/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/linux/prepare_build_linux_rc
-
-./tests.sh csharp
diff --git a/kokoro/linux/csharp/continuous.cfg b/kokoro/linux/csharp/continuous.cfg
deleted file mode 100644
index 3d17767..0000000
--- a/kokoro/linux/csharp/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/csharp/presubmit.cfg b/kokoro/linux/csharp/presubmit.cfg
deleted file mode 100644
index 3d17767..0000000
--- a/kokoro/linux/csharp/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/java_compatibility/build.sh b/kokoro/linux/java_compatibility/build.sh
deleted file mode 100755
index b1ef279..0000000
--- a/kokoro/linux/java_compatibility/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/linux/prepare_build_linux_rc
-
-./tests.sh java_compatibility
diff --git a/kokoro/linux/java_compatibility/continuous.cfg b/kokoro/linux/java_compatibility/continuous.cfg
deleted file mode 100644
index 4897f5c..0000000
--- a/kokoro/linux/java_compatibility/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_compatibility/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/java_compatibility/presubmit.cfg b/kokoro/linux/java_compatibility/presubmit.cfg
deleted file mode 100644
index 4897f5c..0000000
--- a/kokoro/linux/java_compatibility/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_compatibility/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/prepare_build_linux_rc b/kokoro/linux/prepare_build_linux_rc
deleted file mode 100644
index 4c3f255..0000000
--- a/kokoro/linux/prepare_build_linux_rc
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-
-# Source this rc script to prepare the environment for Linux builds
-
-# Set up dotnet
-sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
-sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
-sudo apt-get update
-sudo apt-get install -y dotnet-dev-1.0.4
diff --git a/kokoro/linux/python_compatibility/build.sh b/kokoro/linux/python_compatibility/build.sh
deleted file mode 100755
index 041e65f..0000000
--- a/kokoro/linux/python_compatibility/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/linux/prepare_build_linux_rc
-
-./tests.sh python_compatibility
diff --git a/kokoro/linux/python_compatibility/continuous.cfg b/kokoro/linux/python_compatibility/continuous.cfg
deleted file mode 100644
index 4cf6bb0..0000000
--- a/kokoro/linux/python_compatibility/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_compatibility/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/python_compatibility/presubmit.cfg b/kokoro/linux/python_compatibility/presubmit.cfg
deleted file mode 100644
index 4cf6bb0..0000000
--- a/kokoro/linux/python_compatibility/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_compatibility/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/cpp/build.sh b/kokoro/macos/cpp/build.sh
deleted file mode 100755
index bae2ebb..0000000
--- a/kokoro/macos/cpp/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh cpp
diff --git a/kokoro/macos/cpp/continuous.cfg b/kokoro/macos/cpp/continuous.cfg
deleted file mode 100644
index 4bea1cb..0000000
--- a/kokoro/macos/cpp/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/cpp/presubmit.cfg b/kokoro/macos/cpp/presubmit.cfg
deleted file mode 100644
index 4bea1cb..0000000
--- a/kokoro/macos/cpp/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/cpp_distcheck/build.sh b/kokoro/macos/cpp_distcheck/build.sh
deleted file mode 100755
index d729b63..0000000
--- a/kokoro/macos/cpp_distcheck/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh cpp_distcheck
diff --git a/kokoro/macos/cpp_distcheck/continuous.cfg b/kokoro/macos/cpp_distcheck/continuous.cfg
deleted file mode 100644
index 89441bc..0000000
--- a/kokoro/macos/cpp_distcheck/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/cpp_distcheck/presubmit.cfg b/kokoro/macos/cpp_distcheck/presubmit.cfg
deleted file mode 100644
index 89441bc..0000000
--- a/kokoro/macos/cpp_distcheck/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/javascript/build.sh b/kokoro/macos/javascript/build.sh
deleted file mode 100755
index 016832a..0000000
--- a/kokoro/macos/javascript/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh javascript
diff --git a/kokoro/macos/javascript/continuous.cfg b/kokoro/macos/javascript/continuous.cfg
deleted file mode 100644
index b478cc1..0000000
--- a/kokoro/macos/javascript/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/javascript/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/javascript/presubmit.cfg b/kokoro/macos/javascript/presubmit.cfg
deleted file mode 100644
index b478cc1..0000000
--- a/kokoro/macos/javascript/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/javascript/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/jruby/build.sh b/kokoro/macos/jruby/build.sh
deleted file mode 100755
index c82eaeb..0000000
--- a/kokoro/macos/jruby/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh jruby
diff --git a/kokoro/macos/jruby/continuous.cfg b/kokoro/macos/jruby/continuous.cfg
deleted file mode 100644
index f1310fd..0000000
--- a/kokoro/macos/jruby/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/jruby/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/jruby/presubmit.cfg b/kokoro/macos/jruby/presubmit.cfg
deleted file mode 100644
index f1310fd..0000000
--- a/kokoro/macos/jruby/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/jruby/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_cocoapods_integration/build.sh b/kokoro/macos/objectivec_cocoapods_integration/build.sh
deleted file mode 100755
index f96d289..0000000
--- a/kokoro/macos/objectivec_cocoapods_integration/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh objectivec_cocoapods_integration
diff --git a/kokoro/macos/objectivec_cocoapods_integration/continuous.cfg b/kokoro/macos/objectivec_cocoapods_integration/continuous.cfg
deleted file mode 100644
index 952874e..0000000
--- a/kokoro/macos/objectivec_cocoapods_integration/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_cocoapods_integration/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_cocoapods_integration/presubmit.cfg b/kokoro/macos/objectivec_cocoapods_integration/presubmit.cfg
deleted file mode 100644
index 952874e..0000000
--- a/kokoro/macos/objectivec_cocoapods_integration/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_cocoapods_integration/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_debug/build.sh b/kokoro/macos/objectivec_ios_debug/build.sh
deleted file mode 100755
index 1055d72..0000000
--- a/kokoro/macos/objectivec_ios_debug/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh objectivec_ios_debug
diff --git a/kokoro/macos/objectivec_ios_debug/continuous.cfg b/kokoro/macos/objectivec_ios_debug/continuous.cfg
deleted file mode 100644
index 473d545..0000000
--- a/kokoro/macos/objectivec_ios_debug/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_debug/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_debug/presubmit.cfg b/kokoro/macos/objectivec_ios_debug/presubmit.cfg
deleted file mode 100644
index 473d545..0000000
--- a/kokoro/macos/objectivec_ios_debug/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_debug/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_release/build.sh b/kokoro/macos/objectivec_ios_release/build.sh
deleted file mode 100755
index 76ce3ba..0000000
--- a/kokoro/macos/objectivec_ios_release/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh objectivec_ios_release
diff --git a/kokoro/macos/objectivec_ios_release/continuous.cfg b/kokoro/macos/objectivec_ios_release/continuous.cfg
deleted file mode 100644
index 3cbfb68..0000000
--- a/kokoro/macos/objectivec_ios_release/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_release/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_release/presubmit.cfg b/kokoro/macos/objectivec_ios_release/presubmit.cfg
deleted file mode 100644
index 3cbfb68..0000000
--- a/kokoro/macos/objectivec_ios_release/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_release/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_osx/build.sh b/kokoro/macos/objectivec_osx/build.sh
deleted file mode 100755
index 000be27..0000000
--- a/kokoro/macos/objectivec_osx/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh objectivec_osx
diff --git a/kokoro/macos/objectivec_osx/continuous.cfg b/kokoro/macos/objectivec_osx/continuous.cfg
deleted file mode 100644
index 41bd46a..0000000
--- a/kokoro/macos/objectivec_osx/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_osx/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_osx/presubmit.cfg b/kokoro/macos/objectivec_osx/presubmit.cfg
deleted file mode 100644
index 41bd46a..0000000
--- a/kokoro/macos/objectivec_osx/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_osx/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php5.6_mac/build.sh b/kokoro/macos/php5.6_mac/build.sh
deleted file mode 100755
index 7487889..0000000
--- a/kokoro/macos/php5.6_mac/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh php5.6_mac
diff --git a/kokoro/macos/php5.6_mac/continuous.cfg b/kokoro/macos/php5.6_mac/continuous.cfg
deleted file mode 100644
index ff345e9..0000000
--- a/kokoro/macos/php5.6_mac/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php5.6_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php5.6_mac/presubmit.cfg b/kokoro/macos/php5.6_mac/presubmit.cfg
deleted file mode 100644
index ff345e9..0000000
--- a/kokoro/macos/php5.6_mac/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php5.6_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php7.0_mac/build.sh b/kokoro/macos/php7.0_mac/build.sh
deleted file mode 100755
index e5a37e3..0000000
--- a/kokoro/macos/php7.0_mac/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh php7.0_mac
diff --git a/kokoro/macos/php7.0_mac/continuous.cfg b/kokoro/macos/php7.0_mac/continuous.cfg
deleted file mode 100644
index c2c1811..0000000
--- a/kokoro/macos/php7.0_mac/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.0_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php7.0_mac/presubmit.cfg b/kokoro/macos/php7.0_mac/presubmit.cfg
deleted file mode 100644
index c2c1811..0000000
--- a/kokoro/macos/php7.0_mac/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.0_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/prepare_build_macos_rc b/kokoro/macos/prepare_build_macos_rc
deleted file mode 100755
index dfe66ff..0000000
--- a/kokoro/macos/prepare_build_macos_rc
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-#
-# This script sets up a Kokoro MacOS worker for running Protobuf tests
-
-##
-# Select Xcode version
-
-export DEVELOPER_DIR=/Applications/Xcode_8.1.app/Contents/Developer
-
-##
-# Select C/C++ compilers
-
-export CC=gcc
-export CXX=g++
-
-##
-# Install Brew and core softwares
-
-ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
-source $HOME/.rvm/scripts/rvm
-brew tap homebrew/homebrew-php
-brew uninstall node icu4c
-brew install gflags gpg gpg2 node pcre php56 ruby
-
-##
-# Install Tox
-
-sudo pip install tox==2.4.1
-
-##
-# Install RVM
-
-gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
-command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
-curl -sSL https://get.rvm.io | bash -s stable --ruby
diff --git a/kokoro/macos/python/build.sh b/kokoro/macos/python/build.sh
deleted file mode 100755
index 6b17b95..0000000
--- a/kokoro/macos/python/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh python
diff --git a/kokoro/macos/python/continuous.cfg b/kokoro/macos/python/continuous.cfg
deleted file mode 100644
index 0fc8b50..0000000
--- a/kokoro/macos/python/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/python/presubmit.cfg b/kokoro/macos/python/presubmit.cfg
deleted file mode 100644
index 0fc8b50..0000000
--- a/kokoro/macos/python/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/python_cpp/build.sh b/kokoro/macos/python_cpp/build.sh
deleted file mode 100755
index cb53def..0000000
--- a/kokoro/macos/python_cpp/build.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-g++ --version
-
-./tests.sh python_cpp
diff --git a/kokoro/macos/python_cpp/continuous.cfg b/kokoro/macos/python_cpp/continuous.cfg
deleted file mode 100644
index 22f4a0e..0000000
--- a/kokoro/macos/python_cpp/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python_cpp/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/python_cpp/presubmit.cfg b/kokoro/macos/python_cpp/presubmit.cfg
deleted file mode 100644
index 22f4a0e..0000000
--- a/kokoro/macos/python_cpp/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python_cpp/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/ruby21/build.sh b/kokoro/macos/ruby21/build.sh
deleted file mode 100755
index 748ea65..0000000
--- a/kokoro/macos/ruby21/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh ruby21
diff --git a/kokoro/macos/ruby21/continuous.cfg b/kokoro/macos/ruby21/continuous.cfg
deleted file mode 100644
index 489796d..0000000
--- a/kokoro/macos/ruby21/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby21/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/ruby21/presubmit.cfg b/kokoro/macos/ruby21/presubmit.cfg
deleted file mode 100644
index 489796d..0000000
--- a/kokoro/macos/ruby21/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby21/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/ruby22/build.sh b/kokoro/macos/ruby22/build.sh
deleted file mode 100755
index 5c4de42..0000000
--- a/kokoro/macos/ruby22/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh ruby22
diff --git a/kokoro/macos/ruby22/continuous.cfg b/kokoro/macos/ruby22/continuous.cfg
deleted file mode 100644
index d270544..0000000
--- a/kokoro/macos/ruby22/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby22/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/ruby22/presubmit.cfg b/kokoro/macos/ruby22/presubmit.cfg
deleted file mode 100644
index d270544..0000000
--- a/kokoro/macos/ruby22/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby22/build.sh"
-timeout_mins: 1440
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
deleted file mode 100644
index d3288e2..0000000
--- a/m4/ax_cxx_compile_stdcxx.m4
+++ /dev/null
@@ -1,1001 +0,0 @@
-# ===========================================================================
-#   http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
-#
-# DESCRIPTION
-#
-#   Check for baseline language coverage in the compiler for the specified
-#   version of the C++ standard.  If necessary, add switches to CXX and
-#   CXXCPP to enable support.  VERSION may be '11' (for the C++11 standard)
-#   or '14' (for the C++14 standard).
-#
-#   The second argument, if specified, indicates whether you insist on an
-#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
-#   -std=c++11).  If neither is specified, you get whatever works, with
-#   preference for an extended mode.
-#
-#   The third argument, if specified 'mandatory' or if left unspecified,
-#   indicates that baseline support for the specified C++ standard is
-#   required and that the macro should error out if no mode with that
-#   support is found.  If specified 'optional', then configuration proceeds
-#   regardless, after defining HAVE_CXX${VERSION} if and only if a
-#   supporting mode is found.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
-#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
-#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
-#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
-#   Copyright (c) 2015 Paul Norman <penorman@mac.com>
-#   Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
-#   Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved.  This file is offered as-is, without any
-#   warranty.
-
-#serial 6
-
-dnl  This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
-dnl  (serial version number 13).
-
-AX_REQUIRE_DEFINED([AC_MSG_WARN])
-AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
-  m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
-        [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
-        [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
-        [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
-  m4_if([$2], [], [],
-        [$2], [ext], [],
-        [$2], [noext], [],
-        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
-  m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
-        [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
-        [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
-        [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
-  AC_LANG_PUSH([C++])dnl
-  ac_success=no
-  AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
-  ax_cv_cxx_compile_cxx$1,
-  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
-    [ax_cv_cxx_compile_cxx$1=yes],
-    [ax_cv_cxx_compile_cxx$1=no])])
-  if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
-    ac_success=yes
-  fi
-
-  m4_if([$2], [noext], [], [dnl
-  if test x$ac_success = xno; then
-    for alternative in ${ax_cxx_compile_alternatives}; do
-      switch="-std=gnu++${alternative}"
-      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
-      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
-                     $cachevar,
-        [ac_save_CXX="$CXX"
-         CXX="$CXX $switch"
-         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
-          [eval $cachevar=yes],
-          [eval $cachevar=no])
-         CXX="$ac_save_CXX"])
-      if eval test x\$$cachevar = xyes; then
-        CXX="$CXX $switch"
-        if test -n "$CXXCPP" ; then
-          CXXCPP="$CXXCPP $switch"
-        fi
-        ac_success=yes
-        break
-      fi
-    done
-  fi])
-
-  m4_if([$2], [ext], [], [dnl
-  if test x$ac_success = xno; then
-    dnl HP's aCC needs +std=c++11 according to:
-    dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
-    dnl Cray's crayCC needs "-h std=c++11"
-    for alternative in ${ax_cxx_compile_alternatives}; do
-      for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
-        cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
-        AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
-                       $cachevar,
-          [ac_save_CXX="$CXX"
-           CXX="$CXX $switch"
-           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
-            [eval $cachevar=yes],
-            [eval $cachevar=no])
-           CXX="$ac_save_CXX"])
-        if eval test x\$$cachevar = xyes; then
-          CXX="$CXX $switch"
-          if test -n "$CXXCPP" ; then
-            CXXCPP="$CXXCPP $switch"
-          fi
-          ac_success=yes
-          break
-        fi
-      done
-      if test x$ac_success = xyes; then
-        break
-      fi
-    done
-  fi])
-  AC_LANG_POP([C++])
-  if test x$ax_cxx_compile_cxx$1_required = xtrue; then
-    if test x$ac_success = xno; then
-      AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
-    fi
-  fi
-  if test x$ac_success = xno; then
-    HAVE_CXX$1=0
-    AC_MSG_NOTICE([No compiler with C++$1 support was found])
-  else
-    HAVE_CXX$1=1
-    AC_DEFINE(HAVE_CXX$1,1,
-              [define if the compiler supports basic C++$1 syntax])
-  fi
-  AC_SUBST(HAVE_CXX$1)
-  m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])])
-])
-
-
-dnl  Test body for checking C++11 support
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-)
-
-
-dnl  Test body for checking C++14 support
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
-)
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
-)
-
-dnl  Tests for new features in C++11
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
-
-// If the compiler admits that it is not ready for C++11, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus < 201103L
-
-#error "This is not a C++11 compiler"
-
-#else
-
-#include <utility>
-
-namespace cxx11
-{
-
-  namespace test_static_assert
-  {
-
-    template <typename T>
-    struct check
-    {
-      static_assert(sizeof(int) <= sizeof(T), "not big enough");
-    };
-
-  }
-
-  namespace test_final_override
-  {
-
-    struct Base
-    {
-      virtual void f() {}
-    };
-
-    struct Derived : public Base
-    {
-      virtual void f() override {}
-    };
-
-  }
-
-  namespace test_double_right_angle_brackets
-  {
-
-    template < typename T >
-    struct check {};
-
-    typedef check<void> single_type;
-    typedef check<check<void>> double_type;
-    typedef check<check<check<void>>> triple_type;
-    typedef check<check<check<check<void>>>> quadruple_type;
-
-  }
-
-  namespace test_decltype
-  {
-
-    int
-    f()
-    {
-      int a = 1;
-      decltype(a) b = 2;
-      return a + b;
-    }
-
-  }
-
-  namespace test_type_deduction
-  {
-
-    template < typename T1, typename T2 >
-    struct is_same
-    {
-      static const bool value = false;
-    };
-
-    template < typename T >
-    struct is_same<T, T>
-    {
-      static const bool value = true;
-    };
-
-    template < typename T1, typename T2 >
-    auto
-    add(T1 a1, T2 a2) -> decltype(a1 + a2)
-    {
-      return a1 + a2;
-    }
-
-    int
-    test(const int c, volatile int v)
-    {
-      static_assert(is_same<int, decltype(0)>::value == true, "");
-      static_assert(is_same<int, decltype(c)>::value == false, "");
-      static_assert(is_same<int, decltype(v)>::value == false, "");
-      auto ac = c;
-      auto av = v;
-      auto sumi = ac + av + 'x';
-      auto sumf = ac + av + 1.0;
-      static_assert(is_same<int, decltype(ac)>::value == true, "");
-      static_assert(is_same<int, decltype(av)>::value == true, "");
-      static_assert(is_same<int, decltype(sumi)>::value == true, "");
-      static_assert(is_same<int, decltype(sumf)>::value == false, "");
-      static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
-      return (sumf > 0.0) ? sumi : add(c, v);
-    }
-
-  }
-
-  namespace test_noexcept
-  {
-
-    int f() { return 0; }
-    int g() noexcept { return 0; }
-
-    static_assert(noexcept(f()) == false, "");
-    static_assert(noexcept(g()) == true, "");
-
-  }
-
-  namespace test_constexpr
-  {
-
-    template < typename CharT >
-    unsigned long constexpr
-    strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
-    {
-      return *s ? strlen_c_r(s + 1, acc + 1) : acc;
-    }
-
-    template < typename CharT >
-    unsigned long constexpr
-    strlen_c(const CharT *const s) noexcept
-    {
-      return strlen_c_r(s, 0UL);
-    }
-
-    static_assert(strlen_c("") == 0UL, "");
-    static_assert(strlen_c("1") == 1UL, "");
-    static_assert(strlen_c("example") == 7UL, "");
-    static_assert(strlen_c("another\0example") == 7UL, "");
-
-  }
-
-  namespace test_rvalue_references
-  {
-
-    template < int N >
-    struct answer
-    {
-      static constexpr int value = N;
-    };
-
-    answer<1> f(int&)       { return answer<1>(); }
-    answer<2> f(const int&) { return answer<2>(); }
-    answer<3> f(int&&)      { return answer<3>(); }
-
-    void
-    test()
-    {
-      int i = 0;
-      const int c = 0;
-      static_assert(decltype(f(i))::value == 1, "");
-      static_assert(decltype(f(c))::value == 2, "");
-      static_assert(decltype(f(0))::value == 3, "");
-    }
-
-  }
-
-  namespace test_uniform_initialization
-  {
-
-    struct test
-    {
-      static const int zero {};
-      static const int one {1};
-    };
-
-    static_assert(test::zero == 0, "");
-    static_assert(test::one == 1, "");
-
-  }
-
-  namespace test_lambdas
-  {
-
-    void
-    test1()
-    {
-      auto lambda1 = [](){};
-      auto lambda2 = lambda1;
-      lambda1();
-      lambda2();
-    }
-
-    int
-    test2()
-    {
-      auto a = [](int i, int j){ return i + j; }(1, 2);
-      auto b = []() -> int { return '0'; }();
-      auto c = [=](){ return a + b; }();
-      auto d = [&](){ return c; }();
-      auto e = [a, &b](int x) mutable {
-        const auto identity = [](int y){ return y; };
-        for (auto i = 0; i < a; ++i)
-          a += b--;
-        return x + identity(a + b);
-      }(0);
-      return a + b + c + d + e;
-    }
-
-    int
-    test3()
-    {
-      const auto nullary = [](){ return 0; };
-      const auto unary = [](int x){ return x; };
-      using nullary_t = decltype(nullary);
-      using unary_t = decltype(unary);
-      const auto higher1st = [](nullary_t f){ return f(); };
-      const auto higher2nd = [unary](nullary_t f1){
-        return [unary, f1](unary_t f2){ return f2(unary(f1())); };
-      };
-      return higher1st(nullary) + higher2nd(nullary)(unary);
-    }
-
-  }
-
-  namespace test_variadic_templates
-  {
-
-    template <int...>
-    struct sum;
-
-    template <int N0, int... N1toN>
-    struct sum<N0, N1toN...>
-    {
-      static constexpr auto value = N0 + sum<N1toN...>::value;
-    };
-
-    template <>
-    struct sum<>
-    {
-      static constexpr auto value = 0;
-    };
-
-    static_assert(sum<>::value == 0, "");
-    static_assert(sum<1>::value == 1, "");
-    static_assert(sum<23>::value == 23, "");
-    static_assert(sum<1, 2>::value == 3, "");
-    static_assert(sum<5, 5, 11>::value == 21, "");
-    static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
-
-  }
-
-  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
-  // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
-  // because of this.
-  namespace test_template_alias_sfinae
-  {
-
-    struct foo {};
-
-    template<typename T>
-    using member = typename T::member_type;
-
-    template<typename T>
-    void func(...) {}
-
-    template<typename T>
-    void func(member<T>*) {}
-
-    void test();
-
-    void test() { func<foo>(0); }
-
-  }
-
-  namespace test_std_move_and_forward
-  {
-    struct message {};
-    char foo(message&) { return '\0'; }
-    int foo(message&&) { return 0; }
-
-    template<typename Arg, typename RT>
-    void check(Arg&& arg, RT rt) {
-      static_assert(sizeof(rt) == sizeof(foo(std::forward<Arg>(arg))), "");
-    }
-    void test() {
-      message a;
-      check(a, char());
-      check(std::move(a), int());
-    }
-  }
-
-}  // namespace cxx11
-
-#endif  // __cplusplus >= 201103L
-
-]])
-
-
-dnl  Tests for new features in C++14
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
-
-// If the compiler admits that it is not ready for C++14, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus < 201402L
-
-#error "This is not a C++14 compiler"
-
-#else
-
-namespace cxx14
-{
-
-  namespace test_polymorphic_lambdas
-  {
-
-    int
-    test()
-    {
-      const auto lambda = [](auto&&... args){
-        const auto istiny = [](auto x){
-          return (sizeof(x) == 1UL) ? 1 : 0;
-        };
-        const int aretiny[] = { istiny(args)... };
-        return aretiny[0];
-      };
-      return lambda(1, 1L, 1.0f, '1');
-    }
-
-  }
-
-  namespace test_binary_literals
-  {
-
-    constexpr auto ivii = 0b0000000000101010;
-    static_assert(ivii == 42, "wrong value");
-
-  }
-
-  namespace test_generalized_constexpr
-  {
-
-    template < typename CharT >
-    constexpr unsigned long
-    strlen_c(const CharT *const s) noexcept
-    {
-      auto length = 0UL;
-      for (auto p = s; *p; ++p)
-        ++length;
-      return length;
-    }
-
-    static_assert(strlen_c("") == 0UL, "");
-    static_assert(strlen_c("x") == 1UL, "");
-    static_assert(strlen_c("test") == 4UL, "");
-    static_assert(strlen_c("another\0test") == 7UL, "");
-
-  }
-
-  namespace test_lambda_init_capture
-  {
-
-    int
-    test()
-    {
-      auto x = 0;
-      const auto lambda1 = [a = x](int b){ return a + b; };
-      const auto lambda2 = [a = lambda1(x)](){ return a; };
-      return lambda2();
-    }
-
-  }
-
-  namespace test_digit_separators
-  {
-
-    constexpr auto ten_million = 100'000'000;
-    static_assert(ten_million == 100000000, "");
-
-  }
-
-  namespace test_return_type_deduction
-  {
-
-    auto f(int& x) { return x; }
-    decltype(auto) g(int& x) { return x; }
-
-    template < typename T1, typename T2 >
-    struct is_same
-    {
-      static constexpr auto value = false;
-    };
-
-    template < typename T >
-    struct is_same<T, T>
-    {
-      static constexpr auto value = true;
-    };
-
-    int
-    test()
-    {
-      auto x = 0;
-      static_assert(is_same<int, decltype(f(x))>::value, "");
-      static_assert(is_same<int&, decltype(g(x))>::value, "");
-      return x;
-    }
-
-  }
-
-}  // namespace cxx14
-
-#endif  // __cplusplus >= 201402L
-
-]])
-
-
-dnl  Tests for new features in C++17
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
-
-// If the compiler admits that it is not ready for C++17, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus <= 201402L
-
-#error "This is not a C++17 compiler"
-
-#else
-
-#if defined(__clang__)
-  #define REALLY_CLANG
-#else
-  #if defined(__GNUC__)
-    #define REALLY_GCC
-  #endif
-#endif
-
-#include <initializer_list>
-#include <utility>
-#include <type_traits>
-
-namespace cxx17
-{
-
-#if !defined(REALLY_CLANG)
-  namespace test_constexpr_lambdas
-  {
-
-    // TODO: test it with clang++ from git
-
-    constexpr int foo = [](){return 42;}();
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-  namespace test::nested_namespace::definitions
-  {
-
-  }
-
-  namespace test_fold_expression
-  {
-
-    template<typename... Args>
-    int multiply(Args... args)
-    {
-      return (args * ... * 1);
-    }
-
-    template<typename... Args>
-    bool all(Args... args)
-    {
-      return (args && ...);
-    }
-
-  }
-
-  namespace test_extended_static_assert
-  {
-
-    static_assert (true);
-
-  }
-
-  namespace test_auto_brace_init_list
-  {
-
-    auto foo = {5};
-    auto bar {5};
-
-    static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
-    static_assert(std::is_same<int, decltype(bar)>::value);
-  }
-
-  namespace test_typename_in_template_template_parameter
-  {
-
-    template<template<typename> typename X> struct D;
-
-  }
-
-  namespace test_fallthrough_nodiscard_maybe_unused_attributes
-  {
-
-    int f1()
-    {
-      return 42;
-    }
-
-    [[nodiscard]] int f2()
-    {
-      [[maybe_unused]] auto unused = f1();
-
-      switch (f1())
-      {
-      case 17:
-        f1();
-        [[fallthrough]];
-      case 42:
-        f1();
-      }
-      return f1();
-    }
-
-  }
-
-  namespace test_extended_aggregate_initialization
-  {
-
-    struct base1
-    {
-      int b1, b2 = 42;
-    };
-
-    struct base2
-    {
-      base2() {
-        b3 = 42;
-      }
-      int b3;
-    };
-
-    struct derived : base1, base2
-    {
-        int d;
-    };
-
-    derived d1 {{1, 2}, {}, 4};  // full initialization
-    derived d2 {{}, {}, 4};      // value-initialized bases
-
-  }
-
-  namespace test_general_range_based_for_loop
-  {
-
-    struct iter
-    {
-      int i;
-
-      int& operator* ()
-      {
-        return i;
-      }
-
-      const int& operator* () const
-      {
-        return i;
-      }
-
-      iter& operator++()
-      {
-        ++i;
-        return *this;
-      }
-    };
-
-    struct sentinel
-    {
-      int i;
-    };
-
-    bool operator== (const iter& i, const sentinel& s)
-    {
-      return i.i == s.i;
-    }
-
-    bool operator!= (const iter& i, const sentinel& s)
-    {
-      return !(i == s);
-    }
-
-    struct range
-    {
-      iter begin() const
-      {
-        return {0};
-      }
-
-      sentinel end() const
-      {
-        return {5};
-      }
-    };
-
-    void f()
-    {
-      range r {};
-
-      for (auto i : r)
-      {
-        [[maybe_unused]] auto v = i;
-      }
-    }
-
-  }
-
-  namespace test_lambda_capture_asterisk_this_by_value
-  {
-
-    struct t
-    {
-      int i;
-      int foo()
-      {
-        return [*this]()
-        {
-          return i;
-        }();
-      }
-    };
-
-  }
-
-  namespace test_enum_class_construction
-  {
-
-    enum class byte : unsigned char
-    {};
-
-    byte foo {42};
-
-  }
-
-  namespace test_constexpr_if
-  {
-
-    template <bool cond>
-    int f ()
-    {
-      if constexpr(cond)
-      {
-        return 13;
-      }
-      else
-      {
-        return 42;
-      }
-    }
-
-  }
-
-  namespace test_selection_statement_with_initializer
-  {
-
-    int f()
-    {
-      return 13;
-    }
-
-    int f2()
-    {
-      if (auto i = f(); i > 0)
-      {
-        return 3;
-      }
-
-      switch (auto i = f(); i + 4)
-      {
-      case 17:
-        return 2;
-
-      default:
-        return 1;
-      }
-    }
-
-  }
-
-#if !defined(REALLY_CLANG)
-  namespace test_template_argument_deduction_for_class_templates
-  {
-
-    // TODO: test it with clang++ from git
-
-    template <typename T1, typename T2>
-    struct pair
-    {
-      pair (T1 p1, T2 p2)
-        : m1 {p1},
-          m2 {p2}
-      {}
-
-      T1 m1;
-      T2 m2;
-    };
-
-    void f()
-    {
-      [[maybe_unused]] auto p = pair{13, 42u};
-    }
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-  namespace test_non_type_auto_template_parameters
-  {
-
-    template <auto n>
-    struct B
-    {};
-
-    B<5> b1;
-    B<'a'> b2;
-
-  }
-
-#if !defined(REALLY_CLANG)
-  namespace test_structured_bindings
-  {
-
-    // TODO: test it with clang++ from git
-
-    int arr[2] = { 1, 2 };
-    std::pair<int, int> pr = { 1, 2 };
-
-    auto f1() -> int(&)[2]
-    {
-      return arr;
-    }
-
-    auto f2() -> std::pair<int, int>&
-    {
-      return pr;
-    }
-
-    struct S
-    {
-      int x1 : 2;
-      volatile double y1;
-    };
-
-    S f3()
-    {
-      return {};
-    }
-
-    auto [ x1, y1 ] = f1();
-    auto& [ xr1, yr1 ] = f1();
-    auto [ x2, y2 ] = f2();
-    auto& [ xr2, yr2 ] = f2();
-    const auto [ x3, y3 ] = f3();
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-#if !defined(REALLY_CLANG)
-  namespace test_exception_spec_type_system
-  {
-
-    // TODO: test it with clang++ from git
-
-    struct Good {};
-    struct Bad {};
-
-    void g1() noexcept;
-    void g2();
-
-    template<typename T>
-    Bad
-    f(T*, T*);
-
-    template<typename T1, typename T2>
-    Good
-    f(T1*, T2*);
-
-    static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-  namespace test_inline_variables
-  {
-
-    template<class T> void f(T)
-    {}
-
-    template<class T> inline T g(T)
-    {
-      return T{};
-    }
-
-    template<> inline void f<>(int)
-    {}
-
-    template<> int g<>(int)
-    {
-      return 5;
-    }
-
-  }
-
-}  // namespace cxx17
-
-#endif  // __cplusplus <= 201402L
-
-]])
diff --git a/m4/ax_prog_cc_for_build.m4 b/m4/ax_prog_cc_for_build.m4
deleted file mode 100644
index 77fd346..0000000
--- a/m4/ax_prog_cc_for_build.m4
+++ /dev/null
@@ -1,125 +0,0 @@
-# ===========================================================================
-#   http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_PROG_CC_FOR_BUILD
-#
-# DESCRIPTION
-#
-#   This macro searches for a C compiler that generates native executables,
-#   that is a C compiler that surely is not a cross-compiler. This can be
-#   useful if you have to generate source code at compile-time like for
-#   example GCC does.
-#
-#   The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
-#   needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
-#   The value of these variables can be overridden by the user by specifying
-#   a compiler with an environment variable (like you do for standard CC).
-#
-#   It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
-#   file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
-#   the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
-#   substituted in the Makefile.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 8
-
-AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
-AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_CPP])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-dnl Use the standard macros, but make them use other variable names
-dnl
-pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
-pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
-pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
-pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
-pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
-pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
-pushdef([ac_cv_objext], ac_cv_build_objext)dnl
-pushdef([ac_exeext], ac_build_exeext)dnl
-pushdef([ac_objext], ac_build_objext)dnl
-pushdef([CC], CC_FOR_BUILD)dnl
-pushdef([CPP], CPP_FOR_BUILD)dnl
-pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
-pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
-pushdef([host], build)dnl
-pushdef([host_alias], build_alias)dnl
-pushdef([host_cpu], build_cpu)dnl
-pushdef([host_vendor], build_vendor)dnl
-pushdef([host_os], build_os)dnl
-pushdef([ac_cv_host], ac_cv_build)dnl
-pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-pushdef([ac_cpp], ac_build_cpp)dnl
-pushdef([ac_compile], ac_build_compile)dnl
-pushdef([ac_link], ac_build_link)dnl
-
-save_cross_compiling=$cross_compiling
-save_ac_tool_prefix=$ac_tool_prefix
-cross_compiling=no
-ac_tool_prefix=
-
-AC_PROG_CC
-AC_PROG_CPP
-AC_EXEEXT
-
-ac_tool_prefix=$save_ac_tool_prefix
-cross_compiling=$save_cross_compiling
-
-dnl Restore the old definitions
-dnl
-popdef([ac_link])dnl
-popdef([ac_compile])dnl
-popdef([ac_cpp])dnl
-popdef([ac_cv_host_os])dnl
-popdef([ac_cv_host_vendor])dnl
-popdef([ac_cv_host_cpu])dnl
-popdef([ac_cv_host_alias])dnl
-popdef([ac_cv_host])dnl
-popdef([host_os])dnl
-popdef([host_vendor])dnl
-popdef([host_cpu])dnl
-popdef([host_alias])dnl
-popdef([host])dnl
-popdef([LDFLAGS])dnl
-popdef([CPPFLAGS])dnl
-popdef([CFLAGS])dnl
-popdef([CPP])dnl
-popdef([CC])dnl
-popdef([ac_objext])dnl
-popdef([ac_exeext])dnl
-popdef([ac_cv_objext])dnl
-popdef([ac_cv_exeext])dnl
-popdef([ac_cv_prog_cc_g])dnl
-popdef([ac_cv_prog_cc_cross])dnl
-popdef([ac_cv_prog_cc_works])dnl
-popdef([ac_cv_prog_gcc])dnl
-popdef([ac_cv_prog_CPP])dnl
-
-dnl Finally, set Makefile variables
-dnl
-BUILD_EXEEXT=$ac_build_exeext
-BUILD_OBJEXT=$ac_build_objext
-AC_SUBST(BUILD_EXEEXT)dnl
-AC_SUBST(BUILD_OBJEXT)dnl
-AC_SUBST([CFLAGS_FOR_BUILD])dnl
-AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
-AC_SUBST([LDFLAGS_FOR_BUILD])dnl
-])
diff --git a/m4/ax_prog_cxx_for_build.m4 b/m4/ax_prog_cxx_for_build.m4
deleted file mode 100644
index 8cc0f73..0000000
--- a/m4/ax_prog_cxx_for_build.m4
+++ /dev/null
@@ -1,110 +0,0 @@
-# ===========================================================================
-#   http://www.gnu.org/software/autoconf-archive/ax_prog_cxx_for_build.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_PROG_CXX_FOR_BUILD
-#
-# DESCRIPTION
-#
-#   This macro searches for a C++ compiler that generates native
-#   executables, that is a C++ compiler that surely is not a cross-compiler.
-#   This can be useful if you have to generate source code at compile-time
-#   like for example GCC does.
-#
-#   The macro sets the CXX_FOR_BUILD and CXXCPP_FOR_BUILD macros to anything
-#   needed to compile or link (CXX_FOR_BUILD) and preprocess
-#   (CXXCPP_FOR_BUILD). The value of these variables can be overridden by
-#   the user by specifying a compiler with an environment variable (like you
-#   do for standard CXX).
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-#   Copyright (c) 2012 Avionic Design GmbH
-#
-#   Based on the AX_PROG_CC_FOR_BUILD macro by Paolo Bonzini.
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 2
-
-AU_ALIAS([AC_PROG_CXX_FOR_BUILD], [AX_PROG_CXX_FOR_BUILD])
-AC_DEFUN([AX_PROG_CXX_FOR_BUILD], [dnl
-AC_REQUIRE([AX_PROG_CC_FOR_BUILD])dnl
-AC_REQUIRE([AC_PROG_CXX])dnl
-AC_REQUIRE([AC_PROG_CXXCPP])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-dnl Use the standard macros, but make them use other variable names
-dnl
-pushdef([ac_cv_prog_CXXCPP], ac_cv_build_prog_CXXCPP)dnl
-pushdef([ac_cv_prog_gxx], ac_cv_build_prog_gxx)dnl
-pushdef([ac_cv_prog_cxx_works], ac_cv_build_prog_cxx_works)dnl
-pushdef([ac_cv_prog_cxx_cross], ac_cv_build_prog_cxx_cross)dnl
-pushdef([ac_cv_prog_cxx_g], ac_cv_build_prog_cxx_g)dnl
-pushdef([CXX], CXX_FOR_BUILD)dnl
-pushdef([CXXCPP], CXXCPP_FOR_BUILD)dnl
-pushdef([CXXFLAGS], CXXFLAGS_FOR_BUILD)dnl
-pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-pushdef([CXXCPPFLAGS], CXXCPPFLAGS_FOR_BUILD)dnl
-pushdef([host], build)dnl
-pushdef([host_alias], build_alias)dnl
-pushdef([host_cpu], build_cpu)dnl
-pushdef([host_vendor], build_vendor)dnl
-pushdef([host_os], build_os)dnl
-pushdef([ac_cv_host], ac_cv_build)dnl
-pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-pushdef([ac_cxxcpp], ac_build_cxxcpp)dnl
-pushdef([ac_compile], ac_build_compile)dnl
-pushdef([ac_link], ac_build_link)dnl
-
-save_cross_compiling=$cross_compiling
-save_ac_tool_prefix=$ac_tool_prefix
-cross_compiling=no
-ac_tool_prefix=
-
-AC_PROG_CXX
-AC_PROG_CXXCPP
-
-ac_tool_prefix=$save_ac_tool_prefix
-cross_compiling=$save_cross_compiling
-
-dnl Restore the old definitions
-dnl
-popdef([ac_link])dnl
-popdef([ac_compile])dnl
-popdef([ac_cxxcpp])dnl
-popdef([ac_cv_host_os])dnl
-popdef([ac_cv_host_vendor])dnl
-popdef([ac_cv_host_cpu])dnl
-popdef([ac_cv_host_alias])dnl
-popdef([ac_cv_host])dnl
-popdef([host_os])dnl
-popdef([host_vendor])dnl
-popdef([host_cpu])dnl
-popdef([host_alias])dnl
-popdef([host])dnl
-popdef([CXXCPPFLAGS])dnl
-popdef([CPPFLAGS])dnl
-popdef([CXXFLAGS])dnl
-popdef([CXXCPP])dnl
-popdef([CXX])dnl
-popdef([ac_cv_prog_cxx_g])dnl
-popdef([ac_cv_prog_cxx_cross])dnl
-popdef([ac_cv_prog_cxx_works])dnl
-popdef([ac_cv_prog_gxx])dnl
-popdef([ac_cv_prog_CXXCPP])dnl
-
-dnl Finally, set Makefile variables
-dnl
-AC_SUBST([CXXFLAGS_FOR_BUILD])dnl
-AC_SUBST([CXXCPPFLAGS_FOR_BUILD])dnl
-])
diff --git a/objectivec/.gitignore b/objectivec/.gitignore
deleted file mode 100644
index f786ffc..0000000
--- a/objectivec/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-## Build generated
-build/
-DerivedData/
-
-## Various settings
-*.pbxuser
-!default.pbxuser
-*.mode1v3
-!default.mode1v3
-*.mode2v3
-!default.mode2v3
-*.perspectivev3
-!default.perspectivev3
-xcuserdata/
-
-## Other
-*.moved-aside
-*.xccheckout
-*.xcscmblueprint
-
-## Obj-C/Swift specific
-*.hmap
-*.ipa
diff --git a/objectivec/DevTools/check_version_stamps.sh b/objectivec/DevTools/check_version_stamps.sh
index 1acbe2a..325b71d 100755
--- a/objectivec/DevTools/check_version_stamps.sh
+++ b/objectivec/DevTools/check_version_stamps.sh
@@ -1,4 +1,4 @@
-#!/bin/bash -eu
+#!/bin/bash
 
 # This script checks that the runtime version number constant in the compiler
 # source and in the runtime source is the same.
@@ -8,6 +8,8 @@
 # builds would break. At the same time, we don't want the runtime source
 # depending on the compiler sources; so two copies of the constant are needed.
 
+set -eu
+
 readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
 readonly ProtoRootDir="${ScriptDir}/../.."
 
@@ -16,40 +18,39 @@
     exit 1
 }
 
-readonly GeneratorSrc="${ProtoRootDir}/src/google/protobuf/compiler/objectivec/objectivec_file.cc"
+readonly ConstantName=GOOGLE_PROTOBUF_OBJC_GEN_VERSION
+
+# Collect version from plugin sources.
+
+readonly PluginSrc="${ProtoRootDir}/src/google/protobuf/compiler/objectivec/objectivec_file.cc"
+readonly PluginVersion=$( \
+    cat "${PluginSrc}" \
+        | sed -n -e "s:const int32 ${ConstantName} = \([0-9]*\);:\1:p"
+)
+
+if [[ -z "${PluginVersion}" ]] ; then
+    die "Failed to find ${ConstantName} in the plugin source (${PluginSrc})."
+fi
+
+# Collect version from runtime sources.
+
 readonly RuntimeSrc="${ProtoRootDir}/objectivec/GPBBootstrap.h"
+readonly RuntimeVersion=$( \
+    cat "${RuntimeSrc}" \
+        | sed -n -e "s:#define ${ConstantName} \([0-9]*\):\1:p"
+)
 
-check_constant() {
-  local ConstantName="$1"
+if [[ -z "${RuntimeVersion}" ]] ; then
+    die "Failed to find ${ConstantName} in the runtime source (${RuntimeSrc})."
+fi
 
-  # Collect version from generator sources.
-  local GeneratorVersion=$( \
-      cat "${GeneratorSrc}" \
-          | sed -n -e "s:const int32 ${ConstantName} = \([0-9]*\);:\1:p"
-  )
-  if [[ -z "${GeneratorVersion}" ]] ; then
-      die "Failed to find ${ConstantName} in the generator source (${GeneratorSrc})."
-  fi
+# Compare them.
 
-  # Collect version from runtime sources.
-  local RuntimeVersion=$( \
-      cat "${RuntimeSrc}" \
-          | sed -n -e "s:#define ${ConstantName} \([0-9]*\):\1:p"
-  )
-  if [[ -z "${RuntimeVersion}" ]] ; then
-      die "Failed to find ${ConstantName} in the runtime source (${RuntimeSrc})."
-  fi
-
-  # Compare them.
-  if [[ "${GeneratorVersion}" != "${RuntimeVersion}" ]] ; then
-      die "${ConstantName} values don't match!
-  Generator: ${GeneratorVersion} from ${GeneratorSrc}
-    Runtime: ${RuntimeVersion} from ${RuntimeSrc}
+if [[ "${PluginVersion}" != "${RuntimeVersion}" ]] ; then
+    die "Versions don't match!
+   Plugin: ${PluginVersion} from ${PluginSrc}
+  Runtime: ${RuntimeVersion} from ${RuntimeSrc}
 "
-  fi
-}
-
-# Do the check.
-check_constant GOOGLE_PROTOBUF_OBJC_VERSION
+fi
 
 # Success
diff --git a/objectivec/DevTools/compile_testing_protos.sh b/objectivec/DevTools/compile_testing_protos.sh
index d7f3f60..8295313 100755
--- a/objectivec/DevTools/compile_testing_protos.sh
+++ b/objectivec/DevTools/compile_testing_protos.sh
@@ -1,16 +1,17 @@
-#!/bin/bash -eu
+#!/bin/bash
+
 # Invoked by the Xcode projects to build the protos needed for the unittests.
 
+set -eu
+
 readonly OUTPUT_DIR="${PROJECT_DERIVED_FILE_DIR}/protos"
 
-# -----------------------------------------------------------------------------
 # Helper for bailing.
 die() {
   echo "Error: $1"
   exit 2
 }
 
-# -----------------------------------------------------------------------------
 # What to do.
 case "${ACTION}" in
   "")
@@ -25,19 +26,12 @@
     ;;
 esac
 
-# -----------------------------------------------------------------------------
-# Ensure the output dir exists
-mkdir -p "${OUTPUT_DIR}/google/protobuf"
-
-# -----------------------------------------------------------------------------
-# Move to the top of the protobuf directories and ensure there is a protoc
-# binary to use.
+# Move to the top of the protobuf directories.
 cd "${SRCROOT}/.."
+
 [[ -x src/protoc ]] || \
   die "Could not find the protoc binary; make sure you have built it (objectivec/DevTools/full_mac_build.sh -h)."
 
-# -----------------------------------------------------------------------------
-# See the compiler or proto files have changed.
 RUN_PROTOC=no
 if [[ ! -d "${OUTPUT_DIR}" ]] ; then
   RUN_PROTOC=yes
@@ -56,7 +50,7 @@
   # Find the oldest output file.
   readonly OldestOutput=$(find \
         "${OUTPUT_DIR}" \
-        -type f -name "*pbobjc.[hm]" -print0 \
+        -type f -print0 \
         | xargs -0 stat -f "%m %N" \
         | sort -n -r | tail -n1 | cut -f2- -d" ")
   # If the newest input is newer than the oldest output, regenerate.
@@ -70,30 +64,10 @@
   exit 0
 fi
 
-# -----------------------------------------------------------------------------
-# Prune out all the files from previous generations to ensure we only have
-# current ones.
-find "${OUTPUT_DIR}" \
-    -type f -name "*pbobjc.[hm]" -print0 \
-    | xargs -0 rm -rf
-
-# -----------------------------------------------------------------------------
-# Helper to invoke protoc
-compile_protos() {
-  src/protoc                                   \
-    --objc_out="${OUTPUT_DIR}/google/protobuf" \
-    --proto_path=src/google/protobuf/          \
-    --proto_path=src                           \
-    "$@"
-}
-
-# -----------------------------------------------------------------------------
-# Generate most of the proto files that exist in the C++ src tree.  Several
-# are used in the tests, but the extra don't hurt in that they ensure ObjC
-# sources can be generated from them.
+# Ensure the output dir exists
+mkdir -p "${OUTPUT_DIR}/google/protobuf"
 
 CORE_PROTO_FILES=(
-  src/google/protobuf/any_test.proto
   src/google/protobuf/unittest_arena.proto
   src/google/protobuf/unittest_custom_options.proto
   src/google/protobuf/unittest_enormous_descriptor.proto
@@ -116,34 +90,35 @@
   src/google/protobuf/map_lite_unittest.proto
   src/google/protobuf/map_proto2_unittest.proto
   src/google/protobuf/map_unittest.proto
-  # The unittest_custom_options.proto extends the messages in descriptor.proto
-  # so we build it in to test extending in general. The library doesn't provide
-  # a descriptor as it doesn't use the classes/enums.
+)
+
+# The unittest_custom_options.proto extends the messages in descriptor.proto
+# so we build it in to test extending in general. The library doesn't provide
+# a descriptor as it doesn't use the classes/enums.
+CORE_PROTO_FILES+=(
   src/google/protobuf/descriptor.proto
 )
 
-# Note: there is overlap in package.Message names between some of the test
-# files, so they can't be generated all at once. This works because the overlap
-# isn't linked into a single binary.
+compile_proto() {
+  src/protoc                                   \
+    --objc_out="${OUTPUT_DIR}/google/protobuf" \
+    --proto_path=src/google/protobuf/          \
+    --proto_path=src                           \
+    $*
+}
+
 for a_proto in "${CORE_PROTO_FILES[@]}" ; do
-  compile_protos "${a_proto}"
+  compile_proto "${a_proto}"
 done
 
-# -----------------------------------------------------------------------------
-# Generate the Objective C specific testing protos.
-compile_protos \
-  --proto_path="objectivec/Tests" \
-  objectivec/Tests/unittest_cycle.proto \
-  objectivec/Tests/unittest_deprecated.proto \
-  objectivec/Tests/unittest_deprecated_file.proto \
-  objectivec/Tests/unittest_extension_chain_a.proto \
-  objectivec/Tests/unittest_extension_chain_b.proto \
-  objectivec/Tests/unittest_extension_chain_c.proto \
-  objectivec/Tests/unittest_extension_chain_d.proto \
-  objectivec/Tests/unittest_extension_chain_e.proto \
-  objectivec/Tests/unittest_extension_chain_f.proto \
-  objectivec/Tests/unittest_extension_chain_g.proto \
-  objectivec/Tests/unittest_runtime_proto2.proto \
-  objectivec/Tests/unittest_runtime_proto3.proto \
-  objectivec/Tests/unittest_objc.proto \
+OBJC_PROTO_FILES=(
+  objectivec/Tests/unittest_cycle.proto
+  objectivec/Tests/unittest_runtime_proto2.proto
+  objectivec/Tests/unittest_runtime_proto3.proto
+  objectivec/Tests/unittest_objc.proto
   objectivec/Tests/unittest_objc_startup.proto
+)
+
+for a_proto in "${OBJC_PROTO_FILES[@]}" ; do
+  compile_proto --proto_path="objectivec/Tests" "${a_proto}"
+done
diff --git a/objectivec/DevTools/full_mac_build.sh b/objectivec/DevTools/full_mac_build.sh
index a825789..ff51d9f 100755
--- a/objectivec/DevTools/full_mac_build.sh
+++ b/objectivec/DevTools/full_mac_build.sh
@@ -37,16 +37,10 @@
          Skip the invoke of Xcode to test the runtime on both iOS and OS X.
    --skip-xcode-ios
          Skip the invoke of Xcode to test the runtime on iOS.
-   --skip-xcode-debug
-         Skip the Xcode Debug configuration.
-   --skip-xcode-release
-         Skip the Xcode Release configuration.
    --skip-xcode-osx
          Skip the invoke of Xcode to test the runtime on OS X.
    --skip-objc-conformance
          Skip the Objective C conformance tests (run on OS X).
-   --xcode-quiet
-         Pass -quiet to xcodebuild.
 
 EOF
 }
@@ -72,8 +66,8 @@
 }
 
 NUM_MAKE_JOBS=$(/usr/sbin/sysctl -n hw.ncpu)
-if [[ "${NUM_MAKE_JOBS}" -lt 2 ]] ; then
-  NUM_MAKE_JOBS=2
+if [[ "${NUM_MAKE_JOBS}" -lt 4 ]] ; then
+  NUM_MAKE_JOBS=4
 fi
 
 DO_AUTOGEN=no
@@ -82,10 +76,7 @@
 CORE_ONLY=no
 DO_XCODE_IOS_TESTS=yes
 DO_XCODE_OSX_TESTS=yes
-DO_XCODE_DEBUG=yes
-DO_XCODE_RELEASE=yes
 DO_OBJC_CONFORMANCE_TESTS=yes
-XCODE_QUIET=no
 while [[ $# != 0 ]]; do
   case "${1}" in
     -h | --help )
@@ -118,18 +109,9 @@
     --skip-xcode-osx )
       DO_XCODE_OSX_TESTS=no
       ;;
-    --skip-xcode-debug )
-      DO_XCODE_DEBUG=no
-      ;;
-    --skip-xcode-release )
-      DO_XCODE_RELEASE=no
-      ;;
     --skip-objc-conformance )
       DO_OBJC_CONFORMANCE_TESTS=no
       ;;
-    --xcode-quiet )
-      XCODE_QUIET=yes
-      ;;
     -*)
       echo "ERROR: Unknown option: ${1}" 1>&2
       printUsage
@@ -169,12 +151,8 @@
         -project objectivec/ProtocolBuffers_iOS.xcodeproj
         -scheme ProtocolBuffers
     )
-    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
-      "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Debug clean
-    fi
-    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
-      "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Release clean
-    fi
+  "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Debug clean
+  "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Release clean
   fi
   if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then
     XCODEBUILD_CLEAN_BASE_OSX=(
@@ -182,12 +160,8 @@
         -project objectivec/ProtocolBuffers_OSX.xcodeproj
         -scheme ProtocolBuffers
     )
-    if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
-      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean
-    fi
-    if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
-      "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean
-    fi
+  "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean
+  "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean
   fi
 fi
 
@@ -223,66 +197,45 @@
   exit 1
 fi
 
-readonly XCODE_VERSION_LINE="$(xcodebuild -version | grep Xcode\  )"
-readonly XCODE_VERSION="${XCODE_VERSION_LINE/Xcode /}"  # drop the prefix.
-
 if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then
   XCODEBUILD_TEST_BASE_IOS=(
     xcodebuild
       -project objectivec/ProtocolBuffers_iOS.xcodeproj
       -scheme ProtocolBuffers
   )
-  if [[ "${XCODE_QUIET}" == "yes" ]] ; then
-    XCODEBUILD_TEST_BASE_IOS+=( -quiet )
-  fi
   # Don't need to worry about form factors or retina/non retina;
   # just pick a mix of OS Versions and 32/64 bit.
   # NOTE: Different Xcode have different simulated hardware/os support.
+  readonly XCODE_VERSION_LINE="$(xcodebuild -version | grep Xcode\  )"
+  readonly XCODE_VERSION="${XCODE_VERSION_LINE/Xcode /}"  # drop the prefix.
+  IOS_SIMULATOR_NAME="Simulator"
   case "${XCODE_VERSION}" in
     6.* )
-      echo "ERROR: Xcode 6.3/6.4 no longer supported for building, please use 8.0 or higher." 1>&2
+      echo "ERROR: Xcode 6.3/6.4 no longer supported for building, please use 7.0 or higher." 1>&2
       exit 10
       ;;
+    7.1* )
+      XCODEBUILD_TEST_BASE_IOS+=(
+          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
+          -destination "platform=iOS Simulator,name=iPhone 6,OS=9.0" # 64bit
+          -destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
+          -destination "platform=iOS Simulator,name=iPad Air,OS=9.0" # 64bit
+      )
+      ;;
+    7.3* )
+      XCODEBUILD_TEST_BASE_IOS+=(
+          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
+          -destination "platform=iOS Simulator,name=iPhone 6,OS=9.3" # 64bit
+          -destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
+          -destination "platform=iOS Simulator,name=iPad Air,OS=9.3" # 64bit
+      )
+      ;;
     7.* )
-      echo "ERROR: The unittests include Swift code that is now Swift 3.0." 1>&2
-      echo "ERROR: Xcode 8.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2
-      exit 11
-      ;;
-    8.0* )
-      # The 8.* device seem to hang and never start under Xcode 8.
-      XCODEBUILD_TEST_BASE_IOS+=(
-          -destination "platform=iOS Simulator,name=iPhone 4s,OS=9.0" # 32bit
-          -destination "platform=iOS Simulator,name=iPhone 7,OS=10.0" # 64bit
-          -destination "platform=iOS Simulator,name=iPad 2,OS=9.0" # 32bit
-          -destination "platform=iOS Simulator,name=iPad Pro (9.7 inch),OS=10.0" # 64bit
-      )
-      ;;
-    8.1* )
       XCODEBUILD_TEST_BASE_IOS+=(
           -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
-          -destination "platform=iOS Simulator,name=iPhone 7,OS=10.1" # 64bit
+          -destination "platform=iOS Simulator,name=iPhone 6,OS=9.2" # 64bit
           -destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
-          -destination "platform=iOS Simulator,name=iPad Pro (9.7 inch),OS=10.1" # 64bit
-      )
-      ;;
-    8.2* )
-      XCODEBUILD_TEST_BASE_IOS+=(
-          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
-          -destination "platform=iOS Simulator,name=iPhone 7,OS=10.2" # 64bit
-          -destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
-          -destination "platform=iOS Simulator,name=iPad Pro (9.7 inch),OS=10.2" # 64bit
-      )
-      ;;
-    8.3* )
-      XCODEBUILD_TEST_BASE_IOS+=(
-          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
-          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
-      )
-      ;;
-    9.0* )
-      XCODEBUILD_TEST_BASE_IOS+=(
-          -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
-          -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
+          -destination "platform=iOS Simulator,name=iPad Air,OS=9.2" # 64bit
       )
       ;;
     * )
@@ -290,16 +243,12 @@
       exit 2
       ;;
   esac
-  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
-    header "Doing Xcode iOS build/tests - Debug"
-    "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Debug test
-  fi
-  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
-    header "Doing Xcode iOS build/tests - Release"
-    "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Release test
-  fi
+  header "Doing Xcode iOS build/tests - Debug"
+  "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Debug test
+  header "Doing Xcode iOS build/tests - Release"
+  "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Release test
   # Don't leave the simulator in the developer's face.
-  killall Simulator
+  killall "${IOS_SIMULATOR_NAME}"
 fi
 if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then
   XCODEBUILD_TEST_BASE_OSX=(
@@ -309,32 +258,13 @@
       # Since the ObjC 2.0 Runtime is required, 32bit OS X isn't supported.
       -destination "platform=OS X,arch=x86_64" # 64bit
   )
-  if [[ "${XCODE_QUIET}" == "yes" ]] ; then
-    XCODEBUILD_TEST_BASE_OSX+=( -quiet )
-  fi
-  case "${XCODE_VERSION}" in
-    6.* )
-      echo "ERROR: Xcode 6.3/6.4 no longer supported for building, please use 8.0 or higher." 1>&2
-      exit 10
-      ;;
-    7.* )
-      echo "ERROR: The unittests include Swift code that is now Swift 3.0." 1>&2
-      echo "ERROR: Xcode 8.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2
-      exit 11
-      ;;
-  esac
-  if [[ "${DO_XCODE_DEBUG}" == "yes" ]] ; then
-    header "Doing Xcode OS X build/tests - Debug"
-    "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Debug test
-  fi
-  if [[ "${DO_XCODE_RELEASE}" == "yes" ]] ; then
-    header "Doing Xcode OS X build/tests - Release"
-    "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Release test
-  fi
+  header "Doing Xcode OS X build/tests - Debug"
+  "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Debug test
+  header "Doing Xcode OS X build/tests - Release"
+  "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Release test
 fi
 
 if [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then
-  header "Running ObjC Conformance Tests"
   cd conformance
   wrapped_make -j "${NUM_MAKE_JOBS}" test_objc
   cd ..
diff --git a/objectivec/DevTools/pddm.py b/objectivec/DevTools/pddm.py
index 0b5b7b4..9a11fec 100755
--- a/objectivec/DevTools/pddm.py
+++ b/objectivec/DevTools/pddm.py
@@ -124,7 +124,6 @@
   return re.compile(r'\b(?P<macro_ref>(?P<name>(%s))\((?P<args>.*?)\))' %
                     '|'.join(macro_names))
 
-
 def _MacroArgRefRe(macro_arg_names):
   # Takes in a list of macro arg names and makes a regex that will match
   # uses of those args.
@@ -319,26 +318,25 @@
       return macro.body
     assert len(arg_values) == len(macro.args)
     args = dict(zip(macro.args, arg_values))
-
     def _lookupArg(match):
       val = args[match.group('name')]
       opt = match.group('option')
       if opt:
-        if opt == 'S':  # Spaces for the length
+        if opt == 'S': # Spaces for the length
           return ' ' * len(val)
-        elif opt == 'l':  # Lowercase first character
+        elif opt == 'l': # Lowercase first character
           if val:
             return val[0].lower() + val[1:]
           else:
             return val
-        elif opt == 'L':  # All Lowercase
+        elif opt == 'L': # All Lowercase
           return val.lower()
-        elif opt == 'u':  # Uppercase first character
+        elif opt == 'u': # Uppercase first character
           if val:
             return val[0].upper() + val[1:]
           else:
             return val
-        elif opt == 'U':  # All Uppercase
+        elif opt == 'U': # All Uppercase
           return val.upper()
         else:
           raise PDDMError('Unknown arg option "%s$%s" while expanding "%s".%s'
@@ -352,7 +350,6 @@
 
   def _EvalMacrosRefs(self, text, macro_stack):
     macro_ref_re = _MacroRefRe(self._macros.keys())
-
     def _resolveMacro(match):
       return self._Expand(match, macro_stack)
     return macro_ref_re.sub(_resolveMacro, text)
@@ -499,10 +496,9 @@
       # Add the ending marker.
       if len(captured_lines) == 1:
         result.append('//%%PDDM-EXPAND-END %s' %
-                      captured_lines[0][directive_len:].strip())
+                       captured_lines[0][directive_len:].strip())
       else:
-        result.append('//%%PDDM-EXPAND-END (%s expansions)' %
-                      len(captured_lines))
+        result.append('//%%PDDM-EXPAND-END (%s expansions)' % len(captured_lines))
 
       return result
 
@@ -673,15 +669,15 @@
 
     if src_file.processed_content != src_file.original_content:
       if not opts.dry_run:
-        print('Updating for "%s".' % a_path)
+        print 'Updating for "%s".' % a_path
         with open(a_path, 'w') as f:
           f.write(src_file.processed_content)
       else:
         # Special result to indicate things need updating.
-        print('Update needed for "%s".' % a_path)
+        print 'Update needed for "%s".' % a_path
         result = 1
     elif opts.verbose:
-      print('No update for "%s".' % a_path)
+      print 'No update for "%s".' % a_path
 
   return result
 
diff --git a/objectivec/GPBArray.h b/objectivec/GPBArray.h
index 638b288..afda57f 100644
--- a/objectivec/GPBArray.h
+++ b/objectivec/GPBArray.h
@@ -32,6 +32,11 @@
 
 #import "GPBRuntimeTypes.h"
 
+// These classes are used for repeated fields of basic data types. They are used because
+// they perform better than boxing into NSNumbers in NSArrays.
+
+// Note: These are not meant to be subclassed.
+
 NS_ASSUME_NONNULL_BEGIN
 
 //%PDDM-EXPAND DECLARE_ARRAYS()
@@ -39,171 +44,39 @@
 
 #pragma mark - Int32
 
-/**
- * Class used for repeated fields of int32_t values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32Array : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBInt32Array.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBInt32Array with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBInt32Array with value in it.
- **/
 + (instancetype)arrayWithValue:(int32_t)value;
-
-/**
- * Creates and initializes a GPBInt32Array with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBInt32Array with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBInt32Array *)array;
-
-/**
- * Creates and initializes a GPBInt32Array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBInt32Array with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBInt32Array.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBInt32Array with a copy of the values.
- **/
-- (instancetype)initWithValues:(const int32_t [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const int32_t [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBInt32Array with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBInt32Array *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBInt32Array with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (int32_t)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(int32_t)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const int32_t [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const int32_t [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBInt32Array *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(int32_t)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(int32_t)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -211,171 +84,39 @@
 
 #pragma mark - UInt32
 
-/**
- * Class used for repeated fields of uint32_t values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32Array : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBUInt32Array.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBUInt32Array with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBUInt32Array with value in it.
- **/
 + (instancetype)arrayWithValue:(uint32_t)value;
-
-/**
- * Creates and initializes a GPBUInt32Array with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBUInt32Array with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBUInt32Array *)array;
-
-/**
- * Creates and initializes a GPBUInt32Array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBUInt32Array with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBUInt32Array.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBUInt32Array with a copy of the values.
- **/
-- (instancetype)initWithValues:(const uint32_t [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const uint32_t [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBUInt32Array with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBUInt32Array *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBUInt32Array with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (uint32_t)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(uint32_t value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(uint32_t value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(uint32_t)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const uint32_t [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const uint32_t [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBUInt32Array *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(uint32_t)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(uint32_t)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -383,171 +124,39 @@
 
 #pragma mark - Int64
 
-/**
- * Class used for repeated fields of int64_t values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64Array : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBInt64Array.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBInt64Array with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBInt64Array with value in it.
- **/
 + (instancetype)arrayWithValue:(int64_t)value;
-
-/**
- * Creates and initializes a GPBInt64Array with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBInt64Array with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBInt64Array *)array;
-
-/**
- * Creates and initializes a GPBInt64Array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBInt64Array with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBInt64Array.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBInt64Array with a copy of the values.
- **/
-- (instancetype)initWithValues:(const int64_t [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const int64_t [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBInt64Array with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBInt64Array *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBInt64Array with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (int64_t)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(int64_t value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(int64_t value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(int64_t)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const int64_t [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const int64_t [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBInt64Array *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(int64_t)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(int64_t)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -555,171 +164,39 @@
 
 #pragma mark - UInt64
 
-/**
- * Class used for repeated fields of uint64_t values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64Array : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBUInt64Array.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBUInt64Array with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBUInt64Array with value in it.
- **/
 + (instancetype)arrayWithValue:(uint64_t)value;
-
-/**
- * Creates and initializes a GPBUInt64Array with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBUInt64Array with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBUInt64Array *)array;
-
-/**
- * Creates and initializes a GPBUInt64Array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBUInt64Array with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBUInt64Array.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBUInt64Array with a copy of the values.
- **/
-- (instancetype)initWithValues:(const uint64_t [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const uint64_t [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBUInt64Array with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBUInt64Array *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBUInt64Array with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (uint64_t)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(uint64_t value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(uint64_t value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(uint64_t)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const uint64_t [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const uint64_t [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBUInt64Array *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(uint64_t)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(uint64_t)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -727,171 +204,39 @@
 
 #pragma mark - Float
 
-/**
- * Class used for repeated fields of float values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBFloatArray : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBFloatArray.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBFloatArray with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBFloatArray with value in it.
- **/
 + (instancetype)arrayWithValue:(float)value;
-
-/**
- * Creates and initializes a GPBFloatArray with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBFloatArray with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBFloatArray *)array;
-
-/**
- * Creates and initializes a GPBFloatArray with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBFloatArray with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBFloatArray.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBFloatArray with a copy of the values.
- **/
-- (instancetype)initWithValues:(const float [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const float [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBFloatArray with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBFloatArray *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBFloatArray with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (float)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(float value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(float value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(float)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const float [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const float [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBFloatArray *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(float)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(float)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -899,171 +244,39 @@
 
 #pragma mark - Double
 
-/**
- * Class used for repeated fields of double values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBDoubleArray : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBDoubleArray.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBDoubleArray with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBDoubleArray with value in it.
- **/
 + (instancetype)arrayWithValue:(double)value;
-
-/**
- * Creates and initializes a GPBDoubleArray with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBDoubleArray with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBDoubleArray *)array;
-
-/**
- * Creates and initializes a GPBDoubleArray with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBDoubleArray with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBDoubleArray.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBDoubleArray with a copy of the values.
- **/
-- (instancetype)initWithValues:(const double [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const double [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBDoubleArray with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBDoubleArray *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBDoubleArray with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (double)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(double value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(double value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(double)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const double [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const double [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBDoubleArray *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(double)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(double)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -1071,171 +284,39 @@
 
 #pragma mark - Bool
 
-/**
- * Class used for repeated fields of BOOL values. This performs better than
- * boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolArray : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty GPBBoolArray.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBBoolArray with the single element given.
- *
- * @param value The value to be placed in the array.
- *
- * @return A newly instanced GPBBoolArray with value in it.
- **/
 + (instancetype)arrayWithValue:(BOOL)value;
-
-/**
- * Creates and initializes a GPBBoolArray with the contents of the given
- * array.
- *
- * @param array Array with the contents to be put into the new array.
- *
- * @return A newly instanced GPBBoolArray with the contents of array.
- **/
 + (instancetype)arrayWithValueArray:(GPBBoolArray *)array;
-
-/**
- * Creates and initializes a GPBBoolArray with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBBoolArray with a capacity of count.
- **/
 + (instancetype)arrayWithCapacity:(NSUInteger)count;
 
-/**
- * @return A newly initialized and empty GPBBoolArray.
- **/
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBBoolArray with a copy of the values.
- **/
-- (instancetype)initWithValues:(const BOOL [__nullable])values
+// Initializes the array, copying the values.
+- (instancetype)initWithValues:(const BOOL [])values
                          count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBBoolArray with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBBoolArray *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBBoolArray with a capacity of count.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)count;
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (BOOL)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(BOOL value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(BOOL value, NSUInteger idx, BOOL *stop))block;
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(BOOL)value;
-
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const BOOL [__nullable])values count:(NSUInteger)count;
-
-/**
- * Adds the values from the given array to this array.
- *
- * @param array The array containing the elements to add to this array.
- **/
+- (void)addValues:(const BOOL [])values count:(NSUInteger)count;
 - (void)addValuesFromArray:(GPBBoolArray *)array;
 
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(BOOL)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(BOOL)value;
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -1243,108 +324,27 @@
 
 #pragma mark - Enum
 
-/**
- * This class is used for repeated fields of int32_t values. This performs
- * better than boxing into NSNumbers in NSArrays.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBEnumArray : NSObject <NSCopying>
 
-/** The number of elements contained in the array. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty GPBEnumArray.
- **/
 + (instancetype)array;
-
-/**
- * Creates and initializes a GPBEnumArray with the enum validation function
- * given.
- *
- * @param func The enum validation function for the array.
- *
- * @return A newly instanced GPBEnumArray.
- **/
 + (instancetype)arrayWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a GPBEnumArray with the enum validation function
- * given and the single raw value given.
- *
- * @param func  The enum validation function for the array.
- * @param value The raw value to add to this array.
- *
- * @return A newly instanced GPBEnumArray.
- **/
 + (instancetype)arrayWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                    rawValue:(int32_t)value;
-
-/**
- * Creates and initializes a GPBEnumArray that adds the elements from the
- * given array.
- *
- * @param array Array containing the values to add to the new array.
- *
- * @return A newly instanced GPBEnumArray.
- **/
 + (instancetype)arrayWithValueArray:(GPBEnumArray *)array;
-
-/**
- * Creates and initializes a GPBEnumArray with the given enum validation
- * function and with the givencapacity.
- *
- * @param func  The enum validation function for the array.
- * @param count The capacity needed for the array.
- *
- * @return A newly instanced GPBEnumArray with a capacity of count.
- **/
 + (instancetype)arrayWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                    capacity:(NSUInteger)count;
 
-/**
- * Initializes the array with the given enum validation function.
- *
- * @param func The enum validation function for the array.
- *
- * @return A newly initialized GPBEnumArray with a copy of the values.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
     NS_DESIGNATED_INITIALIZER;
 
-/**
- * Initializes the array, copying the given values.
- *
- * @param func   The enum validation function for the array.
- * @param values An array with the values to put inside this array.
- * @param count  The number of elements to copy into the array.
- *
- * @return A newly initialized GPBEnumArray with a copy of the values.
- **/
+// Initializes the array, copying the values.
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
+                                 rawValues:(const int32_t [])values
                                      count:(NSUInteger)count;
-
-/**
- * Initializes the array, copying the given values.
- *
- * @param array An array with the values to put inside this array.
- *
- * @return A newly initialized GPBEnumArray with a copy of the values.
- **/
 - (instancetype)initWithValueArray:(GPBEnumArray *)array;
-
-/**
- * Initializes the array with the given capacity.
- *
- * @param func  The enum validation function for the array.
- * @param count The capacity needed for the array.
- *
- * @return A newly initialized GPBEnumArray with a capacity of count.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)count;
 
@@ -1352,68 +352,18 @@
 // valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value at the given index.
- *
- * @param index The index of the value to get.
- *
- * @return The value at the given index.
- **/
 - (int32_t)valueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
                         usingBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block;
 
 // These methods bypass the validationFunc to provide access to values that were not
 // known at the time the binary was compiled.
 
-/**
- * Gets the raw enum value at the given index.
- *
- * @param index The index of the raw enum value to get.
- *
- * @return The raw enum value at the given index.
- **/
 - (int32_t)rawValueAtIndex:(NSUInteger)index;
 
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateRawValuesWithBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block;
-
-/**
- * Enumerates the values on this array with the given block.
- *
- * @param opts  Options to control the enumeration.
- * @param block The block to enumerate with.
- *   **value**: The current value being enumerated.
- *   **idx**:   The index of the current value.
- *   **stop**:  A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts
                            usingBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block;
 
@@ -1422,114 +372,29 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Adds a value to this array.
- *
- * @param value The value to add to this array.
- **/
 - (void)addValue:(int32_t)value;
+- (void)addValues:(const int32_t [])values count:(NSUInteger)count;
 
-/**
- * Adds values to this array.
- *
- * @param values The values to add to this array.
- * @param count  The number of elements to add.
- **/
-- (void)addValues:(const int32_t [__nullable])values count:(NSUInteger)count;
-
-
-/**
- * Inserts a value into the given position.
- *
- * @param value The value to add to this array.
- * @param index The index into which to insert the value.
- **/
 - (void)insertValue:(int32_t)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the value at the given index with the given value.
- *
- * @param index The index for which to replace the value.
- * @param value The value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withValue:(int32_t)value;
 
 // These methods bypass the validationFunc to provide setting of values that were not
 // known at the time the binary was compiled.
 
-/**
- * Adds a raw enum value to this array.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param value The raw enum value to add to the array.
- **/
 - (void)addRawValue:(int32_t)value;
-
-/**
- * Adds raw enum values to this array.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param array Array containing the raw enum values to add to this array.
- **/
 - (void)addRawValuesFromArray:(GPBEnumArray *)array;
+- (void)addRawValues:(const int32_t [])values count:(NSUInteger)count;
 
-/**
- * Adds raw enum values to this array.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param values Array containing the raw enum values to add to this array.
- * @param count  The number of raw values to add.
- **/
-- (void)addRawValues:(const int32_t [__nullable])values count:(NSUInteger)count;
-
-/**
- * Inserts a raw enum value at the given index.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param value Raw enum value to add.
- * @param index The index into which to insert the value.
- **/
 - (void)insertRawValue:(int32_t)value atIndex:(NSUInteger)index;
 
-/**
- * Replaces the raw enum value at the given index with the given value.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param index The index for which to replace the value.
- * @param value The raw enum value to replace with.
- **/
 - (void)replaceValueAtIndex:(NSUInteger)index withRawValue:(int32_t)value;
 
 // No validation applies to these methods.
 
-/**
- * Removes the value at the given index.
- *
- * @param index The index of the value to remove.
- **/
 - (void)removeValueAtIndex:(NSUInteger)index;
-
-/**
- * Removes all the values from this array.
- **/
 - (void)removeAll;
 
-/**
- * Exchanges the values between the given indexes.
- *
- * @param idx1 The index of the first element to exchange.
- * @param idx2 The index of the second element to exchange.
- **/
 - (void)exchangeValueAtIndex:(NSUInteger)idx1
             withValueAtIndex:(NSUInteger)idx2;
 
@@ -1556,82 +421,20 @@
 //%PDDM-DEFINE ARRAY_INTERFACE_SIMPLE(NAME, TYPE)
 //%#pragma mark - NAME
 //%
-//%/**
-//% * Class used for repeated fields of ##TYPE## values. This performs better than
-//% * boxing into NSNumbers in NSArrays.
-//% *
-//% * @note This class is not meant to be subclassed.
-//% **/
 //%@interface GPB##NAME##Array : NSObject <NSCopying>
 //%
-//%/** The number of elements contained in the array. */
 //%@property(nonatomic, readonly) NSUInteger count;
 //%
-//%/**
-//% * @return A newly instanced and empty GPB##NAME##Array.
-//% **/
 //%+ (instancetype)array;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array with the single element given.
-//% *
-//% * @param value The value to be placed in the array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array with value in it.
-//% **/
 //%+ (instancetype)arrayWithValue:(TYPE)value;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array with the contents of the given
-//% * array.
-//% *
-//% * @param array Array with the contents to be put into the new array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array with the contents of array.
-//% **/
 //%+ (instancetype)arrayWithValueArray:(GPB##NAME##Array *)array;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array with the given capacity.
-//% *
-//% * @param count The capacity needed for the array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array with a capacity of count.
-//% **/
 //%+ (instancetype)arrayWithCapacity:(NSUInteger)count;
 //%
-//%/**
-//% * @return A newly initialized and empty GPB##NAME##Array.
-//% **/
 //%- (instancetype)init NS_DESIGNATED_INITIALIZER;
-//%
-//%/**
-//% * Initializes the array, copying the given values.
-//% *
-//% * @param values An array with the values to put inside this array.
-//% * @param count  The number of elements to copy into the array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a copy of the values.
-//% **/
-//%- (instancetype)initWithValues:(const TYPE [__nullable])values
+//%// Initializes the array, copying the values.
+//%- (instancetype)initWithValues:(const TYPE [])values
 //%                         count:(NSUInteger)count;
-//%
-//%/**
-//% * Initializes the array, copying the given values.
-//% *
-//% * @param array An array with the values to put inside this array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a copy of the values.
-//% **/
 //%- (instancetype)initWithValueArray:(GPB##NAME##Array *)array;
-//%
-//%/**
-//% * Initializes the array with the given capacity.
-//% *
-//% * @param count The capacity needed for the array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a capacity of count.
-//% **/
 //%- (instancetype)initWithCapacity:(NSUInteger)count;
 //%
 //%ARRAY_IMMUTABLE_INTERFACE(NAME, TYPE, Basic)
@@ -1648,108 +451,27 @@
 //%PDDM-DEFINE ARRAY_INTERFACE_ENUM(NAME, TYPE)
 //%#pragma mark - NAME
 //%
-//%/**
-//% * This class is used for repeated fields of ##TYPE## values. This performs
-//% * better than boxing into NSNumbers in NSArrays.
-//% *
-//% * @note This class is not meant to be subclassed.
-//% **/
 //%@interface GPB##NAME##Array : NSObject <NSCopying>
 //%
-//%/** The number of elements contained in the array. */
 //%@property(nonatomic, readonly) NSUInteger count;
-//%/** The validation function to check if the enums are valid. */
 //%@property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 //%
-//%/**
-//% * @return A newly instanced and empty GPB##NAME##Array.
-//% **/
 //%+ (instancetype)array;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array with the enum validation function
-//% * given.
-//% *
-//% * @param func The enum validation function for the array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array.
-//% **/
 //%+ (instancetype)arrayWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array with the enum validation function
-//% * given and the single raw value given.
-//% *
-//% * @param func  The enum validation function for the array.
-//% * @param value The raw value to add to this array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array.
-//% **/
 //%+ (instancetype)arrayWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%                                   rawValue:(TYPE)value;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array that adds the elements from the
-//% * given array.
-//% *
-//% * @param array Array containing the values to add to the new array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array.
-//% **/
 //%+ (instancetype)arrayWithValueArray:(GPB##NAME##Array *)array;
-//%
-//%/**
-//% * Creates and initializes a GPB##NAME##Array with the given enum validation
-//% * function and with the givencapacity.
-//% *
-//% * @param func  The enum validation function for the array.
-//% * @param count The capacity needed for the array.
-//% *
-//% * @return A newly instanced GPB##NAME##Array with a capacity of count.
-//% **/
 //%+ (instancetype)arrayWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%                                   capacity:(NSUInteger)count;
 //%
-//%/**
-//% * Initializes the array with the given enum validation function.
-//% *
-//% * @param func The enum validation function for the array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a copy of the values.
-//% **/
 //%- (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%    NS_DESIGNATED_INITIALIZER;
 //%
-//%/**
-//% * Initializes the array, copying the given values.
-//% *
-//% * @param func   The enum validation function for the array.
-//% * @param values An array with the values to put inside this array.
-//% * @param count  The number of elements to copy into the array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a copy of the values.
-//% **/
+//%// Initializes the array, copying the values.
 //%- (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-//%                                 rawValues:(const TYPE [__nullable])values
+//%                                 rawValues:(const TYPE [])values
 //%                                     count:(NSUInteger)count;
-//%
-//%/**
-//% * Initializes the array, copying the given values.
-//% *
-//% * @param array An array with the values to put inside this array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a copy of the values.
-//% **/
 //%- (instancetype)initWithValueArray:(GPB##NAME##Array *)array;
-//%
-//%/**
-//% * Initializes the array with the given capacity.
-//% *
-//% * @param func  The enum validation function for the array.
-//% * @param count The capacity needed for the array.
-//% *
-//% * @return A newly initialized GPB##NAME##Array with a capacity of count.
-//% **/
 //%- (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%                                  capacity:(NSUInteger)count;
 //%
@@ -1762,34 +484,9 @@
 //%// These methods bypass the validationFunc to provide access to values that were not
 //%// known at the time the binary was compiled.
 //%
-//%/**
-//% * Gets the raw enum value at the given index.
-//% *
-//% * @param index The index of the raw enum value to get.
-//% *
-//% * @return The raw enum value at the given index.
-//% **/
 //%- (TYPE)rawValueAtIndex:(NSUInteger)index;
 //%
-//%/**
-//% * Enumerates the values on this array with the given block.
-//% *
-//% * @param block The block to enumerate with.
-//% *   **value**: The current value being enumerated.
-//% *   **idx**:   The index of the current value.
-//% *   **stop**:  A pointer to a boolean that when set stops the enumeration.
-//% **/
 //%- (void)enumerateRawValuesWithBlock:(void (^)(TYPE value, NSUInteger idx, BOOL *stop))block;
-//%
-//%/**
-//% * Enumerates the values on this array with the given block.
-//% *
-//% * @param opts  Options to control the enumeration.
-//% * @param block The block to enumerate with.
-//% *   **value**: The current value being enumerated.
-//% *   **idx**:   The index of the current value.
-//% *   **stop**:  A pointer to a boolean that when set stops the enumeration.
-//% **/
 //%- (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts
 //%                           usingBlock:(void (^)(TYPE value, NSUInteger idx, BOOL *stop))block;
 //%
@@ -1804,88 +501,23 @@
 //%
 
 //%PDDM-DEFINE ARRAY_IMMUTABLE_INTERFACE(NAME, TYPE, HELPER_NAME)
-//%/**
-//% * Gets the value at the given index.
-//% *
-//% * @param index The index of the value to get.
-//% *
-//% * @return The value at the given index.
-//% **/
 //%- (TYPE)valueAtIndex:(NSUInteger)index;
 //%
-//%/**
-//% * Enumerates the values on this array with the given block.
-//% *
-//% * @param block The block to enumerate with.
-//% *   **value**: The current value being enumerated.
-//% *   **idx**:   The index of the current value.
-//% *   **stop**:  A pointer to a boolean that when set stops the enumeration.
-//% **/
 //%- (void)enumerateValuesWithBlock:(void (^)(TYPE value, NSUInteger idx, BOOL *stop))block;
-//%
-//%/**
-//% * Enumerates the values on this array with the given block.
-//% *
-//% * @param opts  Options to control the enumeration.
-//% * @param block The block to enumerate with.
-//% *   **value**: The current value being enumerated.
-//% *   **idx**:   The index of the current value.
-//% *   **stop**:  A pointer to a boolean that when set stops the enumeration.
-//% **/
 //%- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
 //%                        usingBlock:(void (^)(TYPE value, NSUInteger idx, BOOL *stop))block;
 
 //%PDDM-DEFINE ARRAY_MUTABLE_INTERFACE(NAME, TYPE, HELPER_NAME)
-//%/**
-//% * Adds a value to this array.
-//% *
-//% * @param value The value to add to this array.
-//% **/
 //%- (void)addValue:(TYPE)value;
-//%
-//%/**
-//% * Adds values to this array.
-//% *
-//% * @param values The values to add to this array.
-//% * @param count  The number of elements to add.
-//% **/
-//%- (void)addValues:(const TYPE [__nullable])values count:(NSUInteger)count;
-//%
+//%- (void)addValues:(const TYPE [])values count:(NSUInteger)count;
 //%ARRAY_EXTRA_MUTABLE_METHODS1_##HELPER_NAME(NAME, TYPE)
-//%/**
-//% * Inserts a value into the given position.
-//% *
-//% * @param value The value to add to this array.
-//% * @param index The index into which to insert the value.
-//% **/
 //%- (void)insertValue:(TYPE)value atIndex:(NSUInteger)index;
 //%
-//%/**
-//% * Replaces the value at the given index with the given value.
-//% *
-//% * @param index The index for which to replace the value.
-//% * @param value The value to replace with.
-//% **/
 //%- (void)replaceValueAtIndex:(NSUInteger)index withValue:(TYPE)value;
 //%ARRAY_EXTRA_MUTABLE_METHODS2_##HELPER_NAME(NAME, TYPE)
-//%/**
-//% * Removes the value at the given index.
-//% *
-//% * @param index The index of the value to remove.
-//% **/
 //%- (void)removeValueAtIndex:(NSUInteger)index;
-//%
-//%/**
-//% * Removes all the values from this array.
-//% **/
 //%- (void)removeAll;
 //%
-//%/**
-//% * Exchanges the values between the given indexes.
-//% *
-//% * @param idx1 The index of the first element to exchange.
-//% * @param idx2 The index of the second element to exchange.
-//% **/
 //%- (void)exchangeValueAtIndex:(NSUInteger)idx1
 //%            withValueAtIndex:(NSUInteger)idx2;
 
@@ -1894,11 +526,6 @@
 //
 
 //%PDDM-DEFINE ARRAY_EXTRA_MUTABLE_METHODS1_Basic(NAME, TYPE)
-//%/**
-//% * Adds the values from the given array to this array.
-//% *
-//% * @param array The array containing the elements to add to this array.
-//% **/
 //%- (void)addValuesFromArray:(GPB##NAME##Array *)array;
 //%
 //%PDDM-DEFINE ARRAY_EXTRA_MUTABLE_METHODS2_Basic(NAME, TYPE)
@@ -1910,57 +537,12 @@
 //%// These methods bypass the validationFunc to provide setting of values that were not
 //%// known at the time the binary was compiled.
 //%
-//%/**
-//% * Adds a raw enum value to this array.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param value The raw enum value to add to the array.
-//% **/
 //%- (void)addRawValue:(TYPE)value;
-//%
-//%/**
-//% * Adds raw enum values to this array.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param array Array containing the raw enum values to add to this array.
-//% **/
 //%- (void)addRawValuesFromArray:(GPB##NAME##Array *)array;
+//%- (void)addRawValues:(const TYPE [])values count:(NSUInteger)count;
 //%
-//%/**
-//% * Adds raw enum values to this array.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param values Array containing the raw enum values to add to this array.
-//% * @param count  The number of raw values to add.
-//% **/
-//%- (void)addRawValues:(const TYPE [__nullable])values count:(NSUInteger)count;
-//%
-//%/**
-//% * Inserts a raw enum value at the given index.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param value Raw enum value to add.
-//% * @param index The index into which to insert the value.
-//% **/
 //%- (void)insertRawValue:(TYPE)value atIndex:(NSUInteger)index;
 //%
-//%/**
-//% * Replaces the raw enum value at the given index with the given value.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param index The index for which to replace the value.
-//% * @param value The raw enum value to replace with.
-//% **/
 //%- (void)replaceValueAtIndex:(NSUInteger)index withRawValue:(TYPE)value;
 //%
 //%// No validation applies to these methods.
diff --git a/objectivec/GPBArray.m b/objectivec/GPBArray.m
index f401631..426c7cb 100644
--- a/objectivec/GPBArray.m
+++ b/objectivec/GPBArray.m
@@ -32,12 +32,6 @@
 
 #import "GPBMessage_PackagePrivate.h"
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 // Mutable arrays use an internal buffer that can always hold a multiple of this elements.
 #define kChunkSize 16
 #define CapacityFromCount(x) (((x / kChunkSize) + 1) * kChunkSize)
@@ -164,16 +158,15 @@
 //%  [super dealloc];
 //%}
 //%
-//%- (BOOL)isEqual:(id)other {
+//%- (BOOL)isEqual:(GPB##NAME##Array *)other {
 //%  if (self == other) {
 //%    return YES;
 //%  }
 //%  if (![other isKindOfClass:[GPB##NAME##Array class]]) {
 //%    return NO;
 //%  }
-//%  GPB##NAME##Array *otherArray = other;
-//%  return (_count == otherArray->_count
-//%          && memcmp(_values, otherArray->_values, (_count * sizeof(TYPE))) == 0);
+//%  return (_count == other->_count
+//%          && memcmp(_values, other->_values, (_count * sizeof(TYPE))) == 0);
 //%}
 //%
 //%- (NSUInteger)hash {
@@ -195,7 +188,7 @@
 //%}
 //%
 //%- (void)enumerate##ACCESSOR_NAME##ValuesWithBlock:(void (^)(TYPE value, NSUInteger idx, BOOL *stop))block {
-//%  [self enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+//%  [self enumerate##ACCESSOR_NAME##ValuesWithOptions:0 usingBlock:block];
 //%}
 //%
 //%- (void)enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)opts
@@ -375,16 +368,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32Array *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32Array class]]) {
     return NO;
   }
-  GPBInt32Array *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(int32_t))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(int32_t))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -406,7 +398,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -623,16 +615,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32Array *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32Array class]]) {
     return NO;
   }
-  GPBUInt32Array *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(uint32_t))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(uint32_t))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -654,7 +645,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(uint32_t value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -871,16 +862,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64Array *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64Array class]]) {
     return NO;
   }
-  GPBInt64Array *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(int64_t))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(int64_t))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -902,7 +892,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(int64_t value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -1119,16 +1109,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64Array *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64Array class]]) {
     return NO;
   }
-  GPBUInt64Array *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(uint64_t))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(uint64_t))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -1150,7 +1139,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(uint64_t value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -1367,16 +1356,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBFloatArray *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBFloatArray class]]) {
     return NO;
   }
-  GPBFloatArray *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(float))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(float))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -1398,7 +1386,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(float value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -1615,16 +1603,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBDoubleArray *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBDoubleArray class]]) {
     return NO;
   }
-  GPBDoubleArray *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(double))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(double))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -1646,7 +1633,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(double value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -1863,16 +1850,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolArray *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolArray class]]) {
     return NO;
   }
-  GPBBoolArray *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(BOOL))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(BOOL))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -1894,7 +1880,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(BOOL value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -2135,16 +2121,15 @@
   [super dealloc];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBEnumArray *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBEnumArray class]]) {
     return NO;
   }
-  GPBEnumArray *otherArray = other;
-  return (_count == otherArray->_count
-          && memcmp(_values, otherArray->_values, (_count * sizeof(int32_t))) == 0);
+  return (_count == other->_count
+          && memcmp(_values, other->_values, (_count * sizeof(int32_t))) == 0);
 }
 
 - (NSUInteger)hash {
@@ -2166,7 +2151,7 @@
 }
 
 - (void)enumerateRawValuesWithBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateRawValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateRawValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts
@@ -2218,7 +2203,7 @@
 }
 
 - (void)enumerateValuesWithBlock:(void (^)(int32_t value, NSUInteger idx, BOOL *stop))block {
-  [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
+  [self enumerateValuesWithOptions:0 usingBlock:block];
 }
 
 - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
@@ -2519,14 +2504,14 @@
 
 - (id)copyWithZone:(NSZone *)zone {
   if (_array == nil) {
-    return [[NSMutableArray allocWithZone:zone] init];
+    _array = [[NSMutableArray alloc] init];
   }
   return [_array copyWithZone:zone];
 }
 
 - (id)mutableCopyWithZone:(NSZone *)zone {
   if (_array == nil) {
-    return [[NSMutableArray allocWithZone:zone] init];
+    _array = [[NSMutableArray alloc] init];
   }
   return [_array mutableCopyWithZone:zone];
 }
@@ -2547,5 +2532,3 @@
 }
 
 @end
-
-#pragma clang diagnostic pop
diff --git a/objectivec/GPBBootstrap.h b/objectivec/GPBBootstrap.h
index ed53ae7..ffefa77 100644
--- a/objectivec/GPBBootstrap.h
+++ b/objectivec/GPBBootstrap.h
@@ -28,13 +28,11 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-/**
- * The Objective C runtime has complete enough info that most protos don’t end
- * up using this, so leaving it on is no cost or very little cost.  If you
- * happen to see it causing bloat, this is the way to disable it. If you do
- * need to disable it, try only disabling it for Release builds as having
- * full TextFormat can be useful for debugging.
- **/
+// The Objective C runtime has complete enough info that most protos don’t end
+// up using this, so leaving it on is no cost or very little cost.  If you
+// happen to see it causing bloat, this is the way to disable it. If you do
+// need to disable it, try only disabling it for Release builds as having
+// full TextFormat can be useful for debugging.
 #ifndef GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
 #define GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS 0
 #endif
@@ -44,45 +42,30 @@
 #if !__has_feature(objc_fixed_enum)
  #error All supported Xcode versions should support objc_fixed_enum.
 #endif
-
 // If the headers are imported into Objective-C++, we can run into an issue
 // where the defintion of NS_ENUM (really CF_ENUM) changes based on the C++
 // standard that is in effect.  If it isn't C++11 or higher, the definition
 // doesn't allow us to forward declare. We work around this one case by
 // providing a local definition. The default case has to use NS_ENUM for the
 // magic that is Swift bridging of enums.
-#if (defined(__cplusplus) && __cplusplus && __cplusplus < 201103L)
+#if (__cplusplus && __cplusplus < 201103L)
  #define GPB_ENUM(X) enum X : int32_t X; enum X : int32_t
 #else
  #define GPB_ENUM(X) NS_ENUM(int32_t, X)
 #endif
-
-/**
- * GPB_ENUM_FWD_DECLARE is used for forward declaring enums, for example:
- *
- * ```
- * GPB_ENUM_FWD_DECLARE(Foo_Enum)
- *
- * @interface BarClass : NSObject
- * @property (nonatomic) enum Foo_Enum value;
- * - (void)bazMethod:(enum Foo_Enum):value;
- * @end
- * ```
- **/
+// GPB_ENUM_FWD_DECLARE is used for forward declaring enums, ex:
+//   GPB_ENUM_FWD_DECLARE(Foo_Enum)
+//   @property (nonatomic) Foo_Enum value;
 #define GPB_ENUM_FWD_DECLARE(X) enum X : int32_t
 
-/**
- * Based upon CF_INLINE. Forces inlining in non DEBUG builds.
- **/
+// Based upon CF_INLINE. Forces inlining in release.
 #if !defined(DEBUG)
 #define GPB_INLINE static __inline__ __attribute__((always_inline))
 #else
 #define GPB_INLINE static __inline__
 #endif
 
-/**
- * For use in public headers that might need to deal with ARC.
- **/
+// For use in public headers that might need to deal with ARC.
 #ifndef GPB_UNSAFE_UNRETAINED
 #if __has_feature(objc_arc)
 #define GPB_UNSAFE_UNRETAINED __unsafe_unretained
@@ -93,31 +76,10 @@
 
 // If property name starts with init we need to annotate it to get past ARC.
 // http://stackoverflow.com/questions/18723226/how-do-i-annotate-an-objective-c-property-with-an-objc-method-family/18723227#18723227
-//
-// Meant to be used internally by generated code.
 #define GPB_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
 
-// ----------------------------------------------------------------------------
-// These version numbers are all internal to the ObjC Protobuf runtime; they
-// are used to ensure compatibility between the generated sources and the
-// headers being compiled against and/or the version of sources being run
-// against.
-//
-// They are all #defines so the values are captured into every .o file they
-// are used in and to allow comparisons in the preprocessor.
-
-// Current library runtime version.
-// - Gets bumped when the runtime makes changes to the interfaces between the
-//   generated code and runtime (things added/removed, etc).
-#define GOOGLE_PROTOBUF_OBJC_VERSION 30002
-
-// Minimum runtime version supported for compiling/running against.
-// - Gets changed when support for the older generated code is dropped.
-#define GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION 30001
-
-
-// This is a legacy constant now frozen in time for old generated code. If
-// GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION ever gets moved above 30001 then
-// this should also change to break code compiled with an old runtime that
-// can't be supported any more.
+// The protoc-gen-objc version which works with the current version of the
+// generated Objective C sources.  In general we don't want to change the
+// runtime interfaces (or this version) as it means everything has to be
+// regenerated.
 #define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30001
diff --git a/objectivec/GPBCodedInputStream.h b/objectivec/GPBCodedInputStream.h
index fbe5009..d64b64e 100644
--- a/objectivec/GPBCodedInputStream.h
+++ b/objectivec/GPBCodedInputStream.h
@@ -35,217 +35,94 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-CF_EXTERN_C_BEGIN
-
-/**
- * @c GPBCodedInputStream exception name. Exceptions raised from
- * @c GPBCodedInputStream contain an underlying error in the userInfo dictionary
- * under the GPBCodedInputStreamUnderlyingErrorKey key.
- **/
-extern NSString *const GPBCodedInputStreamException;
-
-/** The key under which the underlying NSError from the exception is stored. */
-extern NSString *const GPBCodedInputStreamUnderlyingErrorKey;
-
-/** NSError domain used for @c GPBCodedInputStream errors. */
-extern NSString *const GPBCodedInputStreamErrorDomain;
-
-/**
- * Error code for NSError with @c GPBCodedInputStreamErrorDomain.
- **/
-typedef NS_ENUM(NSInteger, GPBCodedInputStreamErrorCode) {
-  /** The size does not fit in the remaining bytes to be read. */
-  GPBCodedInputStreamErrorInvalidSize = -100,
-  /** Attempted to read beyond the subsection limit. */
-  GPBCodedInputStreamErrorSubsectionLimitReached = -101,
-  /** The requested subsection limit is invalid. */
-  GPBCodedInputStreamErrorInvalidSubsectionLimit = -102,
-  /** Invalid tag read. */
-  GPBCodedInputStreamErrorInvalidTag = -103,
-  /** Invalid UTF-8 character in a string. */
-  GPBCodedInputStreamErrorInvalidUTF8 = -104,
-  /** Invalid VarInt read. */
-  GPBCodedInputStreamErrorInvalidVarInt = -105,
-  /** The maximum recursion depth of messages was exceeded. */
-  GPBCodedInputStreamErrorRecursionDepthExceeded = -106,
-};
-
-CF_EXTERN_C_END
-
-/**
- * Reads and decodes protocol message fields.
- *
- * The common uses of protocol buffers shouldn't need to use this class.
- * @c GPBMessage's provide a @c +parseFromData:error: and
- * @c +parseFromData:extensionRegistry:error: method that will decode a
- * message for you.
- *
- * @note Subclassing of @c GPBCodedInputStream is NOT supported.
- **/
+/// Reads and decodes protocol message fields.
+///
+/// The common uses of protocol buffers shouldn't need to use this class.
+/// @c GPBMessage's provide a @c +parseFromData:error: and @c
+/// +parseFromData:extensionRegistry:error: method that will decode a
+/// message for you.
+///
+/// @note Subclassing of GPBCodedInputStream is NOT supported.
 @interface GPBCodedInputStream : NSObject
 
-/**
- * Creates a new stream wrapping some data.
- *
- * @param data The data to wrap inside the stream.
- *
- * @return A newly instanced GPBCodedInputStream.
- **/
+/// Creates a new stream wrapping some data.
 + (instancetype)streamWithData:(NSData *)data;
 
-/**
- * Initializes a stream wrapping some data.
- *
- * @param data The data to wrap inside the stream.
- *
- * @return A newly initialized GPBCodedInputStream.
- **/
+/// Initializes a stream wrapping some data.
 - (instancetype)initWithData:(NSData *)data;
 
-/**
- * Attempts to read a field tag, returning zero if we have reached EOF.
- * Protocol message parsers use this to read tags, since a protocol message
- * may legally end wherever a tag occurs, and zero is not a valid tag number.
- *
- * @return The field tag, or zero if EOF was reached.
- **/
+/// Attempt to read a field tag, returning zero if we have reached EOF.
+/// Protocol message parsers use this to read tags, since a protocol message
+/// may legally end wherever a tag occurs, and zero is not a valid tag number.
 - (int32_t)readTag;
 
-/**
- * @return A double read from the stream.
- **/
+/// Read and return a double.
 - (double)readDouble;
-/**
- * @return A float read from the stream.
- **/
+/// Read and return a float.
 - (float)readFloat;
-/**
- * @return A uint64 read from the stream.
- **/
+/// Read and return a uint64.
 - (uint64_t)readUInt64;
-/**
- * @return A uint32 read from the stream.
- **/
+/// Read and return a uint32.
 - (uint32_t)readUInt32;
-/**
- * @return An int64 read from the stream.
- **/
+/// Read and return an int64.
 - (int64_t)readInt64;
-/**
- * @return An int32 read from the stream.
- **/
+/// Read and return an int32.
 - (int32_t)readInt32;
-/**
- * @return A fixed64 read from the stream.
- **/
+/// Read and return a fixed64.
 - (uint64_t)readFixed64;
-/**
- * @return A fixed32 read from the stream.
- **/
+/// Read and return a fixed32.
 - (uint32_t)readFixed32;
-/**
- * @return An enum read from the stream.
- **/
+/// Read and return an enum (int).
 - (int32_t)readEnum;
-/**
- * @return A sfixed32 read from the stream.
- **/
+/// Read and return a sfixed32.
 - (int32_t)readSFixed32;
-/**
- * @return A fixed64 read from the stream.
- **/
+/// Read and return a sfixed64.
 - (int64_t)readSFixed64;
-/**
- * @return A sint32 read from the stream.
- **/
+/// Read and return a sint32.
 - (int32_t)readSInt32;
-/**
- * @return A sint64 read from the stream.
- **/
+/// Read and return a sint64.
 - (int64_t)readSInt64;
-/**
- * @return A boolean read from the stream.
- **/
+/// Read and return a boolean.
 - (BOOL)readBool;
-/**
- * @return A string read from the stream.
- **/
+/// Read and return a string.
 - (NSString *)readString;
-/**
- * @return Data read from the stream.
- **/
+/// Read and return length delimited data.
 - (NSData *)readBytes;
 
-/**
- * Read an embedded message field value from the stream.
- *
- * @param message           The message to set fields on as they are read.
- * @param extensionRegistry An optional extension registry to use to lookup
- *                          extensions for message.
- **/
+/// Read an embedded message field value from the stream.
+///
+/// @param message           The message to set fields on as they are read.
+/// @param extensionRegistry An optional extension registry to use to lookup
+///                          extensions for @message.
 - (void)readMessage:(GPBMessage *)message
   extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
 
-/**
- * Reads and discards a single field, given its tag value.
- *
- * @param tag The tag number of the field to skip.
- *
- * @return NO if the tag is an endgroup tag (in which case nothing is skipped),
- *         YES in all other cases.
- **/
+/// Reads and discards a single field, given its tag value.
+///
+/// @param tag The tag number of the field to skip.
+///
+/// @return NO if the tag is an endgroup tag (in which case nothing is skipped),
+///         YES in all other cases.
 - (BOOL)skipField:(int32_t)tag;
 
-/**
- * Reads and discards an entire message. This will read either until EOF or
- * until an endgroup tag, whichever comes first.
- **/
+/// Reads and discards an entire message.  This will read either until EOF
+/// or until an endgroup tag, whichever comes first.
 - (void)skipMessage;
 
-/**
- * Check to see if the logical end of the stream has been reached.
- *
- * @note This can return NO when there is no more data, but the current parsing
- *       expected more data.
- *
- * @return YES if the logical end of the stream has been reached, NO otherwise.
- **/
+/// Check to see if the logical end of the stream has been reached.
+///
+/// This can return NO when there is no more data, but the current parsing
+/// expected more data.
 - (BOOL)isAtEnd;
 
-/**
- * @return The offset into the stream.
- **/
+/// The offset into the stream.
 - (size_t)position;
 
-/**
- * Moves the limit to the given byte offset starting at the current location.
- *
- * @exception GPBCodedInputStreamException If the requested bytes exceeed the
- *            current limit.
- *
- * @param byteLimit The number of bytes to move the limit, offset to the current
- *                  location.
- *
- * @return The limit offset before moving the new limit.
- */
-- (size_t)pushLimit:(size_t)byteLimit;
-
-/**
- * Moves the limit back to the offset as it was before calling pushLimit:.
- *
- * @param oldLimit The number of bytes to move the current limit. Usually this
- *                 is the value returned by the pushLimit: method.
- */
-- (void)popLimit:(size_t)oldLimit;
-
-/**
- * Verifies that the last call to -readTag returned the given tag value. This
- * is used to verify that a nested group ended with the correct end tag.
- *
- * @exception NSParseErrorException If the value does not match the last tag.
- *
- * @param expected The tag that was expected.
- **/
+/// Verifies that the last call to @c -readTag returned the given tag value.
+/// This is used to verify that a nested group ended with the correct end tag.
+/// Throws @c NSParseErrorException if value does not match the last tag.
+///
+/// @param expected The tag that was expected.
 - (void)checkLastTagWas:(int32_t)expected;
 
 @end
diff --git a/objectivec/GPBCodedInputStream.m b/objectivec/GPBCodedInputStream.m
index 0759640..319ec15 100644
--- a/objectivec/GPBCodedInputStream.m
+++ b/objectivec/GPBCodedInputStream.m
@@ -36,53 +36,17 @@
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBWireFormat.h"
 
-NSString *const GPBCodedInputStreamException =
-    GPBNSStringifySymbol(GPBCodedInputStreamException);
-
-NSString *const GPBCodedInputStreamUnderlyingErrorKey =
-    GPBNSStringifySymbol(GPBCodedInputStreamUnderlyingErrorKey);
-
-NSString *const GPBCodedInputStreamErrorDomain =
-    GPBNSStringifySymbol(GPBCodedInputStreamErrorDomain);
-
-// Matching:
-// https://github.com/google/protobuf/blob/master/java/core/src/main/java/com/google/protobuf/CodedInputStream.java#L62
-//  private static final int DEFAULT_RECURSION_LIMIT = 100;
-// https://github.com/google/protobuf/blob/master/src/google/protobuf/io/coded_stream.cc#L86
-//  int CodedInputStream::default_recursion_limit_ = 100;
-static const NSUInteger kDefaultRecursionLimit = 100;
-
-static void RaiseException(NSInteger code, NSString *reason) {
-  NSDictionary *errorInfo = nil;
-  if ([reason length]) {
-    errorInfo = @{ GPBErrorReasonKey: reason };
-  }
-  NSError *error = [NSError errorWithDomain:GPBCodedInputStreamErrorDomain
-                                       code:code
-                                   userInfo:errorInfo];
-
-  NSDictionary *exceptionInfo =
-      @{ GPBCodedInputStreamUnderlyingErrorKey: error };
-  [[[NSException alloc] initWithName:GPBCodedInputStreamException
-                              reason:reason
-                            userInfo:exceptionInfo] raise];
-}
-
-static void CheckRecursionLimit(GPBCodedInputStreamState *state) {
-  if (state->recursionDepth >= kDefaultRecursionLimit) {
-    RaiseException(GPBCodedInputStreamErrorRecursionDepthExceeded, nil);
-  }
-}
+static const NSUInteger kDefaultRecursionLimit = 64;
 
 static void CheckSize(GPBCodedInputStreamState *state, size_t size) {
   size_t newSize = state->bufferPos + size;
   if (newSize > state->bufferSize) {
-    RaiseException(GPBCodedInputStreamErrorInvalidSize, nil);
+    [NSException raise:NSParseErrorException format:@""];
   }
   if (newSize > state->currentLimit) {
     // Fast forward to end of currentLimit;
     state->bufferPos = state->currentLimit;
-    RaiseException(GPBCodedInputStreamErrorSubsectionLimitReached, nil);
+    [NSException raise:NSParseErrorException format:@""];
   }
 }
 
@@ -105,6 +69,41 @@
   return value;
 }
 
+static int32_t ReadRawVarint32(GPBCodedInputStreamState *state) {
+  int8_t tmp = ReadRawByte(state);
+  if (tmp >= 0) {
+    return tmp;
+  }
+  int32_t result = tmp & 0x7f;
+  if ((tmp = ReadRawByte(state)) >= 0) {
+    result |= tmp << 7;
+  } else {
+    result |= (tmp & 0x7f) << 7;
+    if ((tmp = ReadRawByte(state)) >= 0) {
+      result |= tmp << 14;
+    } else {
+      result |= (tmp & 0x7f) << 14;
+      if ((tmp = ReadRawByte(state)) >= 0) {
+        result |= tmp << 21;
+      } else {
+        result |= (tmp & 0x7f) << 21;
+        result |= (tmp = ReadRawByte(state)) << 28;
+        if (tmp < 0) {
+          // Discard upper 32 bits.
+          for (int i = 0; i < 5; i++) {
+            if (ReadRawByte(state) >= 0) {
+              return result;
+            }
+          }
+          [NSException raise:NSParseErrorException
+                      format:@"Unable to read varint32"];
+        }
+      }
+    }
+  }
+  return result;
+}
+
 static int64_t ReadRawVarint64(GPBCodedInputStreamState *state) {
   int32_t shift = 0;
   int64_t result = 0;
@@ -116,14 +115,10 @@
     }
     shift += 7;
   }
-  RaiseException(GPBCodedInputStreamErrorInvalidVarInt, @"Invalid VarInt64");
+  [NSException raise:NSParseErrorException format:@"Unable to read varint64"];
   return 0;
 }
 
-static int32_t ReadRawVarint32(GPBCodedInputStreamState *state) {
-  return (int32_t)ReadRawVarint64(state);
-}
-
 static void SkipRawData(GPBCodedInputStreamState *state, size_t size) {
   CheckSize(state, size);
   state->bufferPos += size;
@@ -205,15 +200,10 @@
   }
 
   state->lastTag = ReadRawVarint32(state);
-  // Tags have to include a valid wireformat.
-  if (!GPBWireFormatIsValidTag(state->lastTag)) {
-    RaiseException(GPBCodedInputStreamErrorInvalidTag,
-                   @"Invalid wireformat in tag.");
-  }
-  // Zero is not a valid field number.
-  if (GPBWireFormatGetTagFieldNumber(state->lastTag) == 0) {
-    RaiseException(GPBCodedInputStreamErrorInvalidTag,
-                   @"A zero field number on the wire is invalid.");
+  if (state->lastTag == 0) {
+    // If we actually read zero, that's not a valid tag.
+    [NSException raise:NSParseErrorException
+                format:@"Invalid last tag %d", state->lastTag];
   }
   return state->lastTag;
 }
@@ -236,7 +226,8 @@
       NSLog(@"UTF-8 failure, is some field type 'string' when it should be "
             @"'bytes'?");
 #endif
-      RaiseException(GPBCodedInputStreamErrorInvalidUTF8, nil);
+      [NSException raise:NSParseErrorException
+                  format:@"Invalid UTF-8 for a 'string'"];
     }
   }
   return result;
@@ -271,7 +262,8 @@
   byteLimit += state->bufferPos;
   size_t oldLimit = state->currentLimit;
   if (byteLimit > oldLimit) {
-    RaiseException(GPBCodedInputStreamErrorInvalidSubsectionLimit, nil);
+    [NSException raise:NSInvalidArgumentException
+                format:@"byteLimit > oldLimit: %tu > %tu", byteLimit, oldLimit];
   }
   state->currentLimit = byteLimit;
   return oldLimit;
@@ -294,7 +286,8 @@
 void GPBCodedInputStreamCheckLastTagWas(GPBCodedInputStreamState *state,
                                         int32_t value) {
   if (state->lastTag != value) {
-    RaiseException(GPBCodedInputStreamErrorInvalidTag, @"Unexpected tag read");
+    [NSException raise:NSParseErrorException
+                format:@"Last tag: %d should be %d", state->lastTag, value];
   }
 }
 
@@ -323,12 +316,6 @@
   [super dealloc];
 }
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 - (int32_t)readTag {
   return GPBCodedInputStreamReadTag(&state_);
 }
@@ -338,7 +325,6 @@
 }
 
 - (BOOL)skipField:(int32_t)tag {
-  NSAssert(GPBWireFormatIsValidTag(tag), @"Invalid tag");
   switch (GPBWireFormatGetTagWireType(tag)) {
     case GPBWireFormatVarint:
       GPBCodedInputStreamReadInt32(&state_);
@@ -361,6 +347,8 @@
       SkipRawData(&state_, sizeof(int32_t));
       return YES;
   }
+  [NSException raise:NSParseErrorException format:@"Invalid tag %d", tag];
+  return NO;
 }
 
 - (void)skipMessage {
@@ -380,14 +368,6 @@
   return state_.bufferPos;
 }
 
-- (size_t)pushLimit:(size_t)byteLimit {
-  return GPBCodedInputStreamPushLimit(&state_, byteLimit);
-}
-
-- (void)popLimit:(size_t)oldLimit {
-  GPBCodedInputStreamPopLimit(&state_, oldLimit);
-}
-
 - (double)readDouble {
   return GPBCodedInputStreamReadDouble(&state_);
 }
@@ -427,7 +407,11 @@
 - (void)readGroup:(int32_t)fieldNumber
               message:(GPBMessage *)message
     extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
-  CheckRecursionLimit(&state_);
+  if (state_.recursionDepth >= kDefaultRecursionLimit) {
+    [NSException raise:NSParseErrorException
+                format:@"recursionDepth(%tu) >= %tu", state_.recursionDepth,
+                       kDefaultRecursionLimit];
+  }
   ++state_.recursionDepth;
   [message mergeFromCodedInputStream:self extensionRegistry:extensionRegistry];
   GPBCodedInputStreamCheckLastTagWas(
@@ -437,7 +421,11 @@
 
 - (void)readUnknownGroup:(int32_t)fieldNumber
                  message:(GPBUnknownFieldSet *)message {
-  CheckRecursionLimit(&state_);
+  if (state_.recursionDepth >= kDefaultRecursionLimit) {
+    [NSException raise:NSParseErrorException
+                format:@"recursionDepth(%tu) >= %tu", state_.recursionDepth,
+                       kDefaultRecursionLimit];
+  }
   ++state_.recursionDepth;
   [message mergeFromCodedInputStream:self];
   GPBCodedInputStreamCheckLastTagWas(
@@ -447,8 +435,12 @@
 
 - (void)readMessage:(GPBMessage *)message
     extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
-  CheckRecursionLimit(&state_);
   int32_t length = ReadRawVarint32(&state_);
+  if (state_.recursionDepth >= kDefaultRecursionLimit) {
+    [NSException raise:NSParseErrorException
+                format:@"recursionDepth(%tu) >= %tu", state_.recursionDepth,
+                       kDefaultRecursionLimit];
+  }
   size_t oldLimit = GPBCodedInputStreamPushLimit(&state_, length);
   ++state_.recursionDepth;
   [message mergeFromCodedInputStream:self extensionRegistry:extensionRegistry];
@@ -461,8 +453,12 @@
     extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
                 field:(GPBFieldDescriptor *)field
         parentMessage:(GPBMessage *)parentMessage {
-  CheckRecursionLimit(&state_);
   int32_t length = ReadRawVarint32(&state_);
+  if (state_.recursionDepth >= kDefaultRecursionLimit) {
+    [NSException raise:NSParseErrorException
+                format:@"recursionDepth(%tu) >= %tu", state_.recursionDepth,
+                       kDefaultRecursionLimit];
+  }
   size_t oldLimit = GPBCodedInputStreamPushLimit(&state_, length);
   ++state_.recursionDepth;
   GPBDictionaryReadEntry(mapDictionary, self, extensionRegistry, field,
@@ -500,6 +496,4 @@
   return GPBCodedInputStreamReadSInt64(&state_);
 }
 
-#pragma clang diagnostic pop
-
 @end
diff --git a/objectivec/GPBCodedOutputStream.h b/objectivec/GPBCodedOutputStream.h
index 23c404b..8272880 100644
--- a/objectivec/GPBCodedOutputStream.h
+++ b/objectivec/GPBCodedOutputStream.h
@@ -46,131 +46,63 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-/**
- * @c GPBCodedOutputStream exception names.
- **/
-extern NSString *const GPBCodedOutputStreamException_OutOfSpace;
-extern NSString *const GPBCodedOutputStreamException_WriteFailed;
-
-/**
- * Writes out protocol message fields.
- *
- * The common uses of protocol buffers shouldn't need to use this class.
- * GPBMessage's provide a -data method that will serialize the message for you.
- *
- * @note Any -write* api can raise the GPBCodedOutputStreamException_*
- *       exceptions.
- *
- * @note Subclassing of GPBCodedOutputStream is NOT supported.
- **/
+/// Writes out protocol message fields.
+///
+/// The common uses of protocol buffers shouldn't need to use this class.
+/// @c GPBMessage's provide a @c -data method that will serialize the message
+/// for you.
+///
+/// @note Subclassing of GPBCodedOutputStream is NOT supported.
 @interface GPBCodedOutputStream : NSObject
 
-/**
- * Creates a stream to fill in the given data. Data must be sized to fit or
- * an error will be raised when out of space.
- *
- * @param data The data where the stream will be written to.
- *
- * @return A newly instanced GPBCodedOutputStream.
- **/
+/// Creates a stream to fill in the given data. Data must be sized to fit or
+/// an error will be raised when out of space.
 + (instancetype)streamWithData:(NSMutableData *)data;
 
-/**
- * Creates a stream to write into the given NSOutputStream.
- *
- * @param output The output stream where the stream will be written to.
- *
- * @return A newly instanced GPBCodedOutputStream.
- **/
+/// Creates a stream to write into the given @c NSOutputStream.
 + (instancetype)streamWithOutputStream:(NSOutputStream *)output;
 
-/**
- * Initializes a stream to fill in the given data. Data must be sized to fit
- * or an error will be raised when out of space.
- *
- * @param data The data where the stream will be written to.
- *
- * @return A newly initialized GPBCodedOutputStream.
- **/
+/// Initializes a stream to fill in the given data. Data must be sized to fit
+/// or an error will be raised when out of space.
 - (instancetype)initWithData:(NSMutableData *)data;
 
-/**
- * Initializes a stream to write into the given @c NSOutputStream.
- *
- * @param output The output stream where the stream will be written to.
- *
- * @return A newly initialized GPBCodedOutputStream.
- **/
+/// Initializes a stream to write into the given @c NSOutputStream.
 - (instancetype)initWithOutputStream:(NSOutputStream *)output;
 
-/**
- * Flush any buffered data out.
- **/
+/// Flush any buffered data out.
 - (void)flush;
 
-/**
- * Write the raw byte out.
- *
- * @param value The value to write out.
- **/
+/// Write the raw byte out.
 - (void)writeRawByte:(uint8_t)value;
 
-/**
- * Write the tag for the given field number and wire format.
- *
- * @param fieldNumber The field number.
- * @param format      The wire format the data for the field will be in.
- **/
+/// Write the tag for the given field number and wire format.
+///
+/// @param fieldNumber The field number.
+/// @param format      The wire format the data for the field will be in.
 - (void)writeTag:(uint32_t)fieldNumber format:(GPBWireFormat)format;
 
-/**
- * Write a 32bit value out in little endian format.
- *
- * @param value The value to write out.
- **/
+/// Write a 32bit value out in little endian format.
 - (void)writeRawLittleEndian32:(int32_t)value;
-/**
- * Write a 64bit value out in little endian format.
- *
- * @param value The value to write out.
- **/
+/// Write a 64bit value out in little endian format.
 - (void)writeRawLittleEndian64:(int64_t)value;
 
-/**
- * Write a 32bit value out in varint format.
- *
- * @param value The value to write out.
- **/
+/// Write a 32bit value out in varint format.
 - (void)writeRawVarint32:(int32_t)value;
-/**
- * Write a 64bit value out in varint format.
- *
- * @param value The value to write out.
- **/
+/// Write a 64bit value out in varint format.
 - (void)writeRawVarint64:(int64_t)value;
 
-/**
- * Write a size_t out as a 32bit varint value.
- *
- * @note This will truncate 64 bit values to 32.
- *
- * @param value The value to write out.
- **/
+/// Write a size_t out as a 32bit varint value.
+///
+/// @note This will truncate 64 bit values to 32.
 - (void)writeRawVarintSizeTAs32:(size_t)value;
 
-/**
- * Writes the contents of an NSData out.
- *
- * @param data The data to write out.
- **/
+/// Writes the contents of an @c NSData out.
 - (void)writeRawData:(NSData *)data;
-/**
- * Writes out the given data.
- *
- * @param data   The data blob to write out.
- * @param offset The offset into the blob to start writing out.
- * @param length The number of bytes from the blob to write out.
- **/
+/// Writes out the given data.
+///
+/// @param data   The data blob to write out.
+/// @param offset The offset into the blob to start writing out.
+/// @param length The number of bytes from the blob to write out.
 - (void)writeRawPtr:(const void *)data
              offset:(size_t)offset
              length:(size_t)length;
@@ -178,471 +110,179 @@
 //%PDDM-EXPAND _WRITE_DECLS()
 // This block of code is generated, do not edit it directly.
 
-/**
- * Write a double for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a double for the given field number.
 - (void)writeDouble:(int32_t)fieldNumber value:(double)value;
-/**
- * Write a packed array of double for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of double for the given field number.
 - (void)writeDoubleArray:(int32_t)fieldNumber
                   values:(GPBDoubleArray *)values
                      tag:(uint32_t)tag;
-/**
- * Write a double without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a double without any tag.
 - (void)writeDoubleNoTag:(double)value;
 
-/**
- * Write a float for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a float for the given field number.
 - (void)writeFloat:(int32_t)fieldNumber value:(float)value;
-/**
- * Write a packed array of float for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of float for the given field number.
 - (void)writeFloatArray:(int32_t)fieldNumber
                  values:(GPBFloatArray *)values
                     tag:(uint32_t)tag;
-/**
- * Write a float without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a float without any tag.
 - (void)writeFloatNoTag:(float)value;
 
-/**
- * Write a uint64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a uint64_t for the given field number.
 - (void)writeUInt64:(int32_t)fieldNumber value:(uint64_t)value;
-/**
- * Write a packed array of uint64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of uint64_t for the given field number.
 - (void)writeUInt64Array:(int32_t)fieldNumber
                   values:(GPBUInt64Array *)values
                      tag:(uint32_t)tag;
-/**
- * Write a uint64_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a uint64_t without any tag.
 - (void)writeUInt64NoTag:(uint64_t)value;
 
-/**
- * Write a int64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int64_t for the given field number.
 - (void)writeInt64:(int32_t)fieldNumber value:(int64_t)value;
-/**
- * Write a packed array of int64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int64_t for the given field number.
 - (void)writeInt64Array:(int32_t)fieldNumber
                  values:(GPBInt64Array *)values
                     tag:(uint32_t)tag;
-/**
- * Write a int64_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int64_t without any tag.
 - (void)writeInt64NoTag:(int64_t)value;
 
-/**
- * Write a int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int32_t for the given field number.
 - (void)writeInt32:(int32_t)fieldNumber value:(int32_t)value;
-/**
- * Write a packed array of int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int32_t for the given field number.
 - (void)writeInt32Array:(int32_t)fieldNumber
                  values:(GPBInt32Array *)values
                     tag:(uint32_t)tag;
-/**
- * Write a int32_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int32_t without any tag.
 - (void)writeInt32NoTag:(int32_t)value;
 
-/**
- * Write a uint32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a uint32_t for the given field number.
 - (void)writeUInt32:(int32_t)fieldNumber value:(uint32_t)value;
-/**
- * Write a packed array of uint32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of uint32_t for the given field number.
 - (void)writeUInt32Array:(int32_t)fieldNumber
                   values:(GPBUInt32Array *)values
                      tag:(uint32_t)tag;
-/**
- * Write a uint32_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a uint32_t without any tag.
 - (void)writeUInt32NoTag:(uint32_t)value;
 
-/**
- * Write a uint64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a uint64_t for the given field number.
 - (void)writeFixed64:(int32_t)fieldNumber value:(uint64_t)value;
-/**
- * Write a packed array of uint64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of uint64_t for the given field number.
 - (void)writeFixed64Array:(int32_t)fieldNumber
                    values:(GPBUInt64Array *)values
                       tag:(uint32_t)tag;
-/**
- * Write a uint64_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a uint64_t without any tag.
 - (void)writeFixed64NoTag:(uint64_t)value;
 
-/**
- * Write a uint32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a uint32_t for the given field number.
 - (void)writeFixed32:(int32_t)fieldNumber value:(uint32_t)value;
-/**
- * Write a packed array of uint32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of uint32_t for the given field number.
 - (void)writeFixed32Array:(int32_t)fieldNumber
                    values:(GPBUInt32Array *)values
                       tag:(uint32_t)tag;
-/**
- * Write a uint32_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a uint32_t without any tag.
 - (void)writeFixed32NoTag:(uint32_t)value;
 
-/**
- * Write a int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int32_t for the given field number.
 - (void)writeSInt32:(int32_t)fieldNumber value:(int32_t)value;
-/**
- * Write a packed array of int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int32_t for the given field number.
 - (void)writeSInt32Array:(int32_t)fieldNumber
                   values:(GPBInt32Array *)values
                      tag:(uint32_t)tag;
-/**
- * Write a int32_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int32_t without any tag.
 - (void)writeSInt32NoTag:(int32_t)value;
 
-/**
- * Write a int64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int64_t for the given field number.
 - (void)writeSInt64:(int32_t)fieldNumber value:(int64_t)value;
-/**
- * Write a packed array of int64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int64_t for the given field number.
 - (void)writeSInt64Array:(int32_t)fieldNumber
                   values:(GPBInt64Array *)values
                      tag:(uint32_t)tag;
-/**
- * Write a int64_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int64_t without any tag.
 - (void)writeSInt64NoTag:(int64_t)value;
 
-/**
- * Write a int64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int64_t for the given field number.
 - (void)writeSFixed64:(int32_t)fieldNumber value:(int64_t)value;
-/**
- * Write a packed array of int64_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int64_t for the given field number.
 - (void)writeSFixed64Array:(int32_t)fieldNumber
                     values:(GPBInt64Array *)values
                        tag:(uint32_t)tag;
-/**
- * Write a int64_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int64_t without any tag.
 - (void)writeSFixed64NoTag:(int64_t)value;
 
-/**
- * Write a int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int32_t for the given field number.
 - (void)writeSFixed32:(int32_t)fieldNumber value:(int32_t)value;
-/**
- * Write a packed array of int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int32_t for the given field number.
 - (void)writeSFixed32Array:(int32_t)fieldNumber
                     values:(GPBInt32Array *)values
                        tag:(uint32_t)tag;
-/**
- * Write a int32_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int32_t without any tag.
 - (void)writeSFixed32NoTag:(int32_t)value;
 
-/**
- * Write a BOOL for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a BOOL for the given field number.
 - (void)writeBool:(int32_t)fieldNumber value:(BOOL)value;
-/**
- * Write a packed array of BOOL for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of BOOL for the given field number.
 - (void)writeBoolArray:(int32_t)fieldNumber
                 values:(GPBBoolArray *)values
                    tag:(uint32_t)tag;
-/**
- * Write a BOOL without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a BOOL without any tag.
 - (void)writeBoolNoTag:(BOOL)value;
 
-/**
- * Write a int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a int32_t for the given field number.
 - (void)writeEnum:(int32_t)fieldNumber value:(int32_t)value;
-/**
- * Write a packed array of int32_t for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- * @param tag         The tag assigned to the values.
- **/
+/// Write a packed array of int32_t for the given field number.
 - (void)writeEnumArray:(int32_t)fieldNumber
                 values:(GPBEnumArray *)values
                    tag:(uint32_t)tag;
-/**
- * Write a int32_t without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a int32_t without any tag.
 - (void)writeEnumNoTag:(int32_t)value;
 
-/**
- * Write a NSString for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a NSString for the given field number.
 - (void)writeString:(int32_t)fieldNumber value:(NSString *)value;
-/**
- * Write an array of NSString for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- **/
+/// Write an array of NSString for the given field number.
 - (void)writeStringArray:(int32_t)fieldNumber values:(NSArray<NSString*> *)values;
-/**
- * Write a NSString without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a NSString without any tag.
 - (void)writeStringNoTag:(NSString *)value;
 
-/**
- * Write a GPBMessage for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a GPBMessage for the given field number.
 - (void)writeMessage:(int32_t)fieldNumber value:(GPBMessage *)value;
-/**
- * Write an array of GPBMessage for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- **/
+/// Write an array of GPBMessage for the given field number.
 - (void)writeMessageArray:(int32_t)fieldNumber values:(NSArray<GPBMessage*> *)values;
-/**
- * Write a GPBMessage without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a GPBMessage without any tag.
 - (void)writeMessageNoTag:(GPBMessage *)value;
 
-/**
- * Write a NSData for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a NSData for the given field number.
 - (void)writeBytes:(int32_t)fieldNumber value:(NSData *)value;
-/**
- * Write an array of NSData for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- **/
+/// Write an array of NSData for the given field number.
 - (void)writeBytesArray:(int32_t)fieldNumber values:(NSArray<NSData*> *)values;
-/**
- * Write a NSData without any tag.
- *
- * @param value The value to write out.
- **/
+/// Write a NSData without any tag.
 - (void)writeBytesNoTag:(NSData *)value;
 
-/**
- * Write a GPBMessage for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a GPBMessage for the given field number.
 - (void)writeGroup:(int32_t)fieldNumber
              value:(GPBMessage *)value;
-/**
- * Write an array of GPBMessage for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- **/
+/// Write an array of GPBMessage for the given field number.
 - (void)writeGroupArray:(int32_t)fieldNumber values:(NSArray<GPBMessage*> *)values;
-/**
- * Write a GPBMessage without any tag (but does write the endGroup tag).
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a GPBMessage without any tag (but does write the endGroup tag).
 - (void)writeGroupNoTag:(int32_t)fieldNumber
                   value:(GPBMessage *)value;
 
-/**
- * Write a GPBUnknownFieldSet for the given field number.
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a GPBUnknownFieldSet for the given field number.
 - (void)writeUnknownGroup:(int32_t)fieldNumber
                     value:(GPBUnknownFieldSet *)value;
-/**
- * Write an array of GPBUnknownFieldSet for the given field number.
- *
- * @param fieldNumber The field number assigned to the values.
- * @param values      The values to write out.
- **/
+/// Write an array of GPBUnknownFieldSet for the given field number.
 - (void)writeUnknownGroupArray:(int32_t)fieldNumber values:(NSArray<GPBUnknownFieldSet*> *)values;
-/**
- * Write a GPBUnknownFieldSet without any tag (but does write the endGroup tag).
- *
- * @param fieldNumber The field number assigned to the value.
- * @param value       The value to write out.
- **/
+/// Write a GPBUnknownFieldSet without any tag (but does write the endGroup tag).
 - (void)writeUnknownGroupNoTag:(int32_t)fieldNumber
                          value:(GPBUnknownFieldSet *)value;
 
 //%PDDM-EXPAND-END _WRITE_DECLS()
 
-/**
-Write a MessageSet extension field to the stream. For historical reasons,
-the wire format differs from normal fields.
-
-@param fieldNumber The extension field number to write out.
-@param value       The message from where to get the extension.
-*/
+/// Write a MessageSet extension field to the stream. For historical reasons,
+/// the wire format differs from normal fields.
 - (void)writeMessageSetExtension:(int32_t)fieldNumber value:(GPBMessage *)value;
 
-/**
-Write an unparsed MessageSet extension field to the stream. For historical
-reasons, the wire format differs from normal fields.
-
-@param fieldNumber The extension field number to write out.
-@param value       The raw message from where to get the extension.
-*/
+/// Write an unparsed MessageSet extension field to the stream. For
+/// historical reasons, the wire format differs from normal fields.
 - (void)writeRawMessageSetExtension:(int32_t)fieldNumber value:(NSData *)value;
 
 @end
@@ -651,76 +291,32 @@
 
 // Write methods for types that can be in packed arrays.
 //%PDDM-DEFINE _WRITE_PACKABLE_DECLS(NAME, ARRAY_TYPE, TYPE)
-//%/**
-//% * Write a TYPE for the given field number.
-//% *
-//% * @param fieldNumber The field number assigned to the value.
-//% * @param value       The value to write out.
-//% **/
+//%/// Write a TYPE for the given field number.
 //%- (void)write##NAME:(int32_t)fieldNumber value:(TYPE)value;
-//%/**
-//% * Write a packed array of TYPE for the given field number.
-//% *
-//% * @param fieldNumber The field number assigned to the values.
-//% * @param values      The values to write out.
-//% * @param tag         The tag assigned to the values.
-//% **/
+//%/// Write a packed array of TYPE for the given field number.
 //%- (void)write##NAME##Array:(int32_t)fieldNumber
 //%       NAME$S     values:(GPB##ARRAY_TYPE##Array *)values
 //%       NAME$S        tag:(uint32_t)tag;
-//%/**
-//% * Write a TYPE without any tag.
-//% *
-//% * @param value The value to write out.
-//% **/
+//%/// Write a TYPE without any tag.
 //%- (void)write##NAME##NoTag:(TYPE)value;
 //%
 // Write methods for types that aren't in packed arrays.
 //%PDDM-DEFINE _WRITE_UNPACKABLE_DECLS(NAME, TYPE)
-//%/**
-//% * Write a TYPE for the given field number.
-//% *
-//% * @param fieldNumber The field number assigned to the value.
-//% * @param value       The value to write out.
-//% **/
+//%/// Write a TYPE for the given field number.
 //%- (void)write##NAME:(int32_t)fieldNumber value:(TYPE *)value;
-//%/**
-//% * Write an array of TYPE for the given field number.
-//% *
-//% * @param fieldNumber The field number assigned to the values.
-//% * @param values      The values to write out.
-//% **/
+//%/// Write an array of TYPE for the given field number.
 //%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray<##TYPE##*> *)values;
-//%/**
-//% * Write a TYPE without any tag.
-//% *
-//% * @param value The value to write out.
-//% **/
+//%/// Write a TYPE without any tag.
 //%- (void)write##NAME##NoTag:(TYPE *)value;
 //%
 // Special write methods for Groups.
 //%PDDM-DEFINE _WRITE_GROUP_DECLS(NAME, TYPE)
-//%/**
-//% * Write a TYPE for the given field number.
-//% *
-//% * @param fieldNumber The field number assigned to the value.
-//% * @param value       The value to write out.
-//% **/
+//%/// Write a TYPE for the given field number.
 //%- (void)write##NAME:(int32_t)fieldNumber
 //%       NAME$S value:(TYPE *)value;
-//%/**
-//% * Write an array of TYPE for the given field number.
-//% *
-//% * @param fieldNumber The field number assigned to the values.
-//% * @param values      The values to write out.
-//% **/
+//%/// Write an array of TYPE for the given field number.
 //%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray<##TYPE##*> *)values;
-//%/**
-//% * Write a TYPE without any tag (but does write the endGroup tag).
-//% *
-//% * @param fieldNumber The field number assigned to the value.
-//% * @param value       The value to write out.
-//% **/
+//%/// Write a TYPE without any tag (but does write the endGroup tag).
 //%- (void)write##NAME##NoTag:(int32_t)fieldNumber
 //%            NAME$S value:(TYPE *)value;
 //%
diff --git a/objectivec/GPBCodedOutputStream.m b/objectivec/GPBCodedOutputStream.m
index c299040..fd9ed66 100644
--- a/objectivec/GPBCodedOutputStream.m
+++ b/objectivec/GPBCodedOutputStream.m
@@ -36,11 +36,6 @@
 #import "GPBUnknownFieldSet_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"
 
-// These values are the existing values so as not to break any code that might
-// have already been inspecting them when they weren't documented/exposed.
-NSString *const GPBCodedOutputStreamException_OutOfSpace = @"OutOfSpace";
-NSString *const GPBCodedOutputStreamException_WriteFailed = @"WriteFailed";
-
 // Structure for containing state of a GPBCodedInputStream. Brought out into
 // a struct so that we can inline several common functions instead of dealing
 // with overhead of ObjC dispatch.
@@ -64,13 +59,13 @@
 static void GPBRefreshBuffer(GPBOutputBufferState *state) {
   if (state->output == nil) {
     // We're writing to a single buffer.
-    [NSException raise:GPBCodedOutputStreamException_OutOfSpace format:@""];
+    [NSException raise:@"OutOfSpace" format:@""];
   }
   if (state->position != 0) {
     NSInteger written =
         [state->output write:state->bytes maxLength:state->position];
     if (written != (NSInteger)state->position) {
-      [NSException raise:GPBCodedOutputStreamException_WriteFailed format:@""];
+      [NSException raise:@"WriteFailed" format:@""];
     }
     state->position = 0;
   }
@@ -149,6 +144,22 @@
   GPBWriteRawByte(state, (int32_t)(value >> 56) & 0xFF);
 }
 
+#if DEBUG && !defined(NS_BLOCK_ASSERTIONS)
++ (void)load {
+  // This test exists to verify that CFStrings with embedded NULLs will work
+  // for us. If this Assert fails, all code below that depends on
+  // CFStringGetCStringPtr will NOT work properly on strings that contain
+  // embedded NULLs, and we do get that in some protobufs.
+  // Note that this will not be compiled in release.
+  // We didn't feel that just keeping it in a unit test was sufficient because
+  // the Protobuf unit tests are only run when somebody is actually working
+  // on protobufs.
+  CFStringRef zeroTest = CFSTR("Test\0String");
+  const char *cString = CFStringGetCStringPtr(zeroTest, kCFStringEncodingUTF8);
+  NSAssert(cString == NULL, @"Serious Error");
+}
+#endif  // DEBUG && !defined(NS_BLOCK_ASSERTIONS)
+
 - (void)dealloc {
   [self flush];
   [state_.output close];
@@ -192,12 +203,6 @@
   return [[[self alloc] initWithData:data] autorelease];
 }
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 - (void)writeDoubleNoTag:(double)value {
   GPBWriteRawLittleEndian64(&state_, GPBConvertDoubleToInt64(value));
 }
@@ -271,15 +276,19 @@
 }
 
 - (void)writeStringNoTag:(const NSString *)value {
-  size_t length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+  // If you are concerned about embedded NULLs see the test in
+  // +load above.
+  const char *quickString =
+      CFStringGetCStringPtr((CFStringRef)value, kCFStringEncodingUTF8);
+  size_t length = (quickString != NULL)
+                      ? strlen(quickString)
+                      : [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
   GPBWriteRawVarint32(&state_, (int32_t)length);
+
   if (length == 0) {
     return;
   }
 
-  const char *quickString =
-      CFStringGetCStringPtr((CFStringRef)value, kCFStringEncodingUTF8);
-
   // Fast path: Most strings are short, if the buffer already has space,
   // add to it directly.
   NSUInteger bufferBytesLeft = state_.size - state_.position;
@@ -295,7 +304,7 @@
                      maxLength:bufferBytesLeft
                     usedLength:&usedBufferLength
                       encoding:NSUTF8StringEncoding
-                       options:(NSStringEncodingConversionOptions)0
+                       options:0
                          range:NSMakeRange(0, [value length])
                 remainingRange:NULL];
     }
@@ -972,8 +981,6 @@
   GPBWriteRawLittleEndian64(&state_, value);
 }
 
-#pragma clang diagnostic pop
-
 @end
 
 size_t GPBComputeDoubleSizeNoTag(Float64 value) {
@@ -1023,7 +1030,14 @@
 }
 
 size_t GPBComputeStringSizeNoTag(NSString *value) {
-  NSUInteger length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+  // If you are concerned about embedded NULLs see the test in
+  // +load above.
+  const char *quickString =
+      CFStringGetCStringPtr((CFStringRef)value, kCFStringEncodingUTF8);
+  NSUInteger length =
+      (quickString != NULL)
+          ? strlen(quickString)
+          : [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
   return GPBComputeRawVarint32SizeForInteger(length) + length;
 }
 
diff --git a/objectivec/GPBDescriptor.h b/objectivec/GPBDescriptor.h
index 651f4de..a6eff0f 100644
--- a/objectivec/GPBDescriptor.h
+++ b/objectivec/GPBDescriptor.h
@@ -39,250 +39,103 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-/** Syntax used in the proto file. */
 typedef NS_ENUM(uint8_t, GPBFileSyntax) {
-  /** Unknown syntax. */
   GPBFileSyntaxUnknown = 0,
-  /** Proto2 syntax. */
   GPBFileSyntaxProto2 = 2,
-  /** Proto3 syntax. */
   GPBFileSyntaxProto3 = 3,
 };
 
-/** Type of proto field. */
 typedef NS_ENUM(uint8_t, GPBFieldType) {
-  /** Optional/required field. Only valid for proto2 fields. */
-  GPBFieldTypeSingle,
-  /** Repeated field. */
-  GPBFieldTypeRepeated,
-  /** Map field. */
-  GPBFieldTypeMap,
+  GPBFieldTypeSingle,    // optional/required
+  GPBFieldTypeRepeated,  // repeated
+  GPBFieldTypeMap,       // map<K,V>
 };
 
-/**
- * Describes a proto message.
- **/
 @interface GPBDescriptor : NSObject<NSCopying>
 
-/** Name of the message. */
 @property(nonatomic, readonly, copy) NSString *name;
-/** Fields declared in the message. */
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBFieldDescriptor*> *fields;
-/** Oneofs declared in the message. */
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBOneofDescriptor*> *oneofs;
-/** Extension range declared for the message. */
 @property(nonatomic, readonly, nullable) const GPBExtensionRange *extensionRanges;
-/** Number of extension ranges declared for the message. */
 @property(nonatomic, readonly) uint32_t extensionRangesCount;
-/** Descriptor for the file where the message was defined. */
 @property(nonatomic, readonly, assign) GPBFileDescriptor *file;
 
-/** Whether the message is in wire format or not. */
 @property(nonatomic, readonly, getter=isWireFormat) BOOL wireFormat;
-/** The class of this message. */
 @property(nonatomic, readonly) Class messageClass;
-/** Containing message descriptor if this message is nested, or nil otherwise. */
-@property(readonly, nullable) GPBDescriptor *containingType;
-/**
- * Fully qualified name for this message (package.message). Can be nil if the
- * value is unable to be computed.
- */
-@property(readonly, nullable) NSString *fullName;
 
-/**
- * Gets the field for the given number.
- *
- * @param fieldNumber The number for the field to get.
- *
- * @return The field descriptor for the given number, or nil if not found.
- **/
 - (nullable GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber;
-
-/**
- * Gets the field for the given name.
- *
- * @param name The name for the field to get.
- *
- * @return The field descriptor for the given name, or nil if not found.
- **/
 - (nullable GPBFieldDescriptor *)fieldWithName:(NSString *)name;
-
-/**
- * Gets the oneof for the given name.
- *
- * @param name The name for the oneof to get.
- *
- * @return The oneof descriptor for the given name, or nil if not found.
- **/
 - (nullable GPBOneofDescriptor *)oneofWithName:(NSString *)name;
 
 @end
 
-/**
- * Describes a proto file.
- **/
 @interface GPBFileDescriptor : NSObject
 
-/** The package declared in the proto file. */
 @property(nonatomic, readonly, copy) NSString *package;
-/** The objc prefix declared in the proto file. */
-@property(nonatomic, readonly, copy, nullable) NSString *objcPrefix;
-/** The syntax of the proto file. */
 @property(nonatomic, readonly) GPBFileSyntax syntax;
 
 @end
 
-/**
- * Describes a oneof field.
- **/
 @interface GPBOneofDescriptor : NSObject
-/** Name of the oneof field. */
 @property(nonatomic, readonly) NSString *name;
-/** Fields declared in the oneof. */
 @property(nonatomic, readonly) NSArray<GPBFieldDescriptor*> *fields;
 
-/**
- * Gets the field for the given number.
- *
- * @param fieldNumber The number for the field to get.
- *
- * @return The field descriptor for the given number, or nil if not found.
- **/
 - (nullable GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber;
-
-/**
- * Gets the field for the given name.
- *
- * @param name The name for the field to get.
- *
- * @return The field descriptor for the given name, or nil if not found.
- **/
 - (nullable GPBFieldDescriptor *)fieldWithName:(NSString *)name;
-
 @end
 
-/**
- * Describes a proto field.
- **/
 @interface GPBFieldDescriptor : NSObject
 
-/** Name of the field. */
 @property(nonatomic, readonly, copy) NSString *name;
-/** Number associated with the field. */
 @property(nonatomic, readonly) uint32_t number;
-/** Data type contained in the field. */
 @property(nonatomic, readonly) GPBDataType dataType;
-/** Whether it has a default value or not. */
 @property(nonatomic, readonly) BOOL hasDefaultValue;
-/** Default value for the field. */
 @property(nonatomic, readonly) GPBGenericValue defaultValue;
-/** Whether this field is required. Only valid for proto2 fields. */
 @property(nonatomic, readonly, getter=isRequired) BOOL required;
-/** Whether this field is optional. */
 @property(nonatomic, readonly, getter=isOptional) BOOL optional;
-/** Type of field (single, repeated, map). */
 @property(nonatomic, readonly) GPBFieldType fieldType;
-/** Type of the key if the field is a map. The value's type is -fieldType. */
+// If it is a map, the value type is in -type.
 @property(nonatomic, readonly) GPBDataType mapKeyDataType;
-/** Whether the field is packable. */
 @property(nonatomic, readonly, getter=isPackable) BOOL packable;
 
-/** The containing oneof if this field is part of one, nil otherwise. */
 @property(nonatomic, readonly, assign, nullable) GPBOneofDescriptor *containingOneof;
 
-/** Class of the message if the field is of message type. */
+// Message properties
 @property(nonatomic, readonly, assign, nullable) Class msgClass;
 
-/** Descriptor for the enum if this field is an enum. */
+// Enum properties
 @property(nonatomic, readonly, strong, nullable) GPBEnumDescriptor *enumDescriptor;
 
-/**
- * Checks whether the given enum raw value is a valid enum value.
- *
- * @param value The raw enum value to check.
- *
- * @return YES if value is a valid enum raw value.
- **/
 - (BOOL)isValidEnumValue:(int32_t)value;
 
-/** @return Name for the text format, or nil if not known. */
+// For now, this will return nil if it doesn't know the name to use for
+// TextFormat.
 - (nullable NSString *)textFormatName;
 
 @end
 
-/**
- * Describes a proto enum.
- **/
 @interface GPBEnumDescriptor : NSObject
 
-/** Name of the enum. */
 @property(nonatomic, readonly, copy) NSString *name;
-/** Function that validates that raw values are valid enum values. */
 @property(nonatomic, readonly) GPBEnumValidationFunc enumVerifier;
 
-/**
- * Returns the enum value name for the given raw enum.
- *
- * @param number The raw enum value.
- *
- * @return The name of the enum value passed, or nil if not valid.
- **/
 - (nullable NSString *)enumNameForValue:(int32_t)number;
-
-/**
- * Gets the enum raw value for the given enum name.
- *
- * @param outValue A pointer where the value will be set.
- * @param name     The enum name for which to get the raw value.
- *
- * @return YES if a value was copied into the pointer, NO otherwise.
- **/
 - (BOOL)getValue:(nullable int32_t *)outValue forEnumName:(NSString *)name;
 
-/**
- * Returns the text format for the given raw enum value.
- *
- * @param number The raw enum value.
- *
- * @return The text format name for the raw enum value, or nil if not valid.
- **/
 - (nullable NSString *)textFormatNameForValue:(int32_t)number;
 
-/**
- * Gets the enum raw value for the given text format name.
- *
- * @param outValue       A pointer where the value will be set.
- * @param textFormatName The text format name for which to get the raw value.
- *
- * @return YES if a value was copied into the pointer, NO otherwise.
- **/
-- (BOOL)getValue:(nullable int32_t *)outValue forEnumTextFormatName:(NSString *)textFormatName;
-
 @end
 
-/**
- * Describes a proto extension.
- **/
 @interface GPBExtensionDescriptor : NSObject<NSCopying>
-/** Field number under which the extension is stored. */
 @property(nonatomic, readonly) uint32_t fieldNumber;
-/** The containing message class, i.e. the class extended by this extension. */
 @property(nonatomic, readonly) Class containingMessageClass;
-/** Data type contained in the extension. */
 @property(nonatomic, readonly) GPBDataType dataType;
-/** Whether the extension is repeated. */
 @property(nonatomic, readonly, getter=isRepeated) BOOL repeated;
-/** Whether the extension is packable. */
 @property(nonatomic, readonly, getter=isPackable) BOOL packable;
-/** The class of the message if the extension is of message type. */
 @property(nonatomic, readonly, assign) Class msgClass;
-/** The singleton name for the extension. */
 @property(nonatomic, readonly) NSString *singletonName;
-/** The enum descriptor if the extension is of enum type. */
 @property(nonatomic, readonly, strong, nullable) GPBEnumDescriptor *enumDescriptor;
-/** The default value for the extension. */
-@property(nonatomic, readonly, nullable) id defaultValue;
-
+@property(nonatomic, readonly) id defaultValue;
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/objectivec/GPBDescriptor.m b/objectivec/GPBDescriptor.m
index 3c3844d..2709737 100644
--- a/objectivec/GPBDescriptor.m
+++ b/objectivec/GPBDescriptor.m
@@ -36,16 +36,8 @@
 #import "GPBWireFormat.h"
 #import "GPBMessage_PackagePrivate.h"
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
-// The addresses of these variables are used as keys for objc_getAssociatedObject.
+// The address of this variable is used as a key for obj_getAssociatedObject.
 static const char kTextFormatExtraValueKey = 0;
-static const char kParentClassNameValueKey = 0;
-static const char kClassNameSuffixKey = 0;
 
 // Utility function to generate selectors on the fly.
 static SEL SelFromStrings(const char *prefix, const char *middle,
@@ -217,102 +209,10 @@
   extensionRangesCount_ = count;
 }
 
-- (void)setupContainingMessageClassName:(const char *)msgClassName {
-  // Note: Only fetch the class here, can't send messages to it because
-  // that could cause cycles back to this class within +initialize if
-  // two messages have each other in fields (i.e. - they build a graph).
-  NSAssert(objc_getClass(msgClassName), @"Class %s not defined", msgClassName);
-  NSValue *parentNameValue = [NSValue valueWithPointer:msgClassName];
-  objc_setAssociatedObject(self, &kParentClassNameValueKey,
-                           parentNameValue,
-                           OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-}
-
-- (void)setupMessageClassNameSuffix:(NSString *)suffix {
-  if (suffix.length) {
-    objc_setAssociatedObject(self, &kClassNameSuffixKey,
-                             suffix,
-                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-  }
-}
-
 - (NSString *)name {
   return NSStringFromClass(messageClass_);
 }
 
-- (GPBDescriptor *)containingType {
-  NSValue *parentNameValue =
-      objc_getAssociatedObject(self, &kParentClassNameValueKey);
-  if (!parentNameValue) {
-    return nil;
-  }
-  const char *parentName = [parentNameValue pointerValue];
-  Class parentClass = objc_getClass(parentName);
-  NSAssert(parentClass, @"Class %s not defined", parentName);
-  return [parentClass descriptor];
-}
-
-- (NSString *)fullName {
-  NSString *className = NSStringFromClass(self.messageClass);
-  GPBFileDescriptor *file = self.file;
-  NSString *objcPrefix = file.objcPrefix;
-  if (objcPrefix && ![className hasPrefix:objcPrefix]) {
-    NSAssert(0,
-             @"Class didn't have correct prefix? (%@ - %@)",
-             className, objcPrefix);
-    return nil;
-  }
-  GPBDescriptor *parent = self.containingType;
-
-  NSString *name = nil;
-  if (parent) {
-    NSString *parentClassName = NSStringFromClass(parent.messageClass);
-    // The generator will add _Class to avoid reserved words, drop it.
-    NSString *suffix = objc_getAssociatedObject(parent, &kClassNameSuffixKey);
-    if (suffix) {
-      if (![parentClassName hasSuffix:suffix]) {
-        NSAssert(0,
-                 @"ParentMessage class didn't have correct suffix? (%@ - %@)",
-                 className, suffix);
-        return nil;
-      }
-      parentClassName =
-          [parentClassName substringToIndex:(parentClassName.length - suffix.length)];
-    }
-    NSString *parentPrefix = [parentClassName stringByAppendingString:@"_"];
-    if (![className hasPrefix:parentPrefix]) {
-      NSAssert(0,
-               @"Class didn't have the correct parent name prefix? (%@ - %@)",
-               parentPrefix, className);
-      return nil;
-    }
-    name = [className substringFromIndex:parentPrefix.length];
-  } else {
-    name = [className substringFromIndex:objcPrefix.length];
-  }
-
-  // The generator will add _Class to avoid reserved words, drop it.
-  NSString *suffix = objc_getAssociatedObject(self, &kClassNameSuffixKey);
-  if (suffix) {
-    if (![name hasSuffix:suffix]) {
-      NSAssert(0,
-               @"Message class didn't have correct suffix? (%@ - %@)",
-               name, suffix);
-      return nil;
-    }
-    name = [name substringToIndex:(name.length - suffix.length)];
-  }
-
-  NSString *prefix = (parent != nil ? parent.fullName : file.package);
-  NSString *result;
-  if (prefix.length > 0) {
-    result = [NSString stringWithFormat:@"%@.%@", prefix, name];
-  } else {
-    result = name;
-  }
-  return result;
-}
-
 - (id)copyWithZone:(NSZone *)zone {
 #pragma unused(zone)
   return [self retain];
@@ -349,27 +249,13 @@
 
 @implementation GPBFileDescriptor {
   NSString *package_;
-  NSString *objcPrefix_;
   GPBFileSyntax syntax_;
 }
 
 @synthesize package = package_;
-@synthesize objcPrefix = objcPrefix_;
 @synthesize syntax = syntax_;
 
 - (instancetype)initWithPackage:(NSString *)package
-                     objcPrefix:(NSString *)objcPrefix
-                         syntax:(GPBFileSyntax)syntax {
-  self = [super init];
-  if (self) {
-    package_ = [package copy];
-    objcPrefix_ = [objcPrefix copy];
-    syntax_ = syntax;
-  }
-  return self;
-}
-
-- (instancetype)initWithPackage:(NSString *)package
                          syntax:(GPBFileSyntax)syntax {
   self = [super init];
   if (self) {
@@ -379,12 +265,6 @@
   return self;
 }
 
-- (void)dealloc {
-  [package_ release];
-  [objcPrefix_ release];
-  [super dealloc];
-}
-
 @end
 
 @implementation GPBOneofDescriptor
@@ -525,9 +405,6 @@
     // Extra type specific data.
     if (isMessage) {
       const char *className = coreDesc->dataTypeSpecific.className;
-      // Note: Only fetch the class here, can't send messages to it because
-      // that could cause cycles back to this class within +initialize if
-      // two messages have each other in fields (i.e. - they build a graph).
       msgClass_ = objc_getClass(className);
       NSAssert(msgClass_, @"Class %s not defined", className);
     } else if (dataType == GPBDataTypeEnum) {
@@ -868,22 +745,6 @@
   return NO;
 }
 
-- (BOOL)getValue:(int32_t *)outValue forEnumTextFormatName:(NSString *)textFormatName {
-    if (nameOffsets_ == NULL) [self calcValueNameOffsets];
-
-    for (uint32_t i = 0; i < valueCount_; ++i) {
-        int32_t value = values_[i];
-        NSString *valueTextFormatName = [self textFormatNameForValue:value];
-        if ([valueTextFormatName isEqual:textFormatName]) {
-            if (outValue) {
-                *outValue = value;
-            }
-            return YES;
-        }
-    }
-    return NO;
-}
-
 - (NSString *)textFormatNameForValue:(int32_t)number {
   if (nameOffsets_ == NULL) [self calcValueNameOffsets];
 
@@ -942,7 +803,7 @@
   if ((self = [super init])) {
     description_ = description;
 
-#if defined(DEBUG) && DEBUG
+#if DEBUG
     const char *className = description->messageOrGroupClassName;
     if (className) {
       NSAssert(objc_lookUpClass(className) != Nil,
@@ -1027,6 +888,10 @@
   return GPBExtensionIsRepeated(description_);
 }
 
+- (BOOL)isMap {
+  return (description_->options & GPBFieldMapKeyMask) != 0;
+}
+
 - (BOOL)isPackable {
   return GPBExtensionIsPacked(description_);
 }
@@ -1096,5 +961,3 @@
 }
 
 @end
-
-#pragma clang diagnostic pop
diff --git a/objectivec/GPBDescriptor_PackagePrivate.h b/objectivec/GPBDescriptor_PackagePrivate.h
index 452b3f8..e3d0a80 100644
--- a/objectivec/GPBDescriptor_PackagePrivate.h
+++ b/objectivec/GPBDescriptor_PackagePrivate.h
@@ -37,7 +37,6 @@
 
 // Describes attributes of the field.
 typedef NS_OPTIONS(uint16_t, GPBFieldFlags) {
-  GPBFieldNone            = 0,
   // These map to standard protobuf concepts.
   GPBFieldRequired        = 1 << 0,
   GPBFieldRepeated        = 1 << 1,
@@ -112,7 +111,6 @@
 
 // Describes attributes of the extension.
 typedef NS_OPTIONS(uint8_t, GPBExtensionOptions) {
-  GPBExtensionNone          = 0,
   // These map to standard protobuf concepts.
   GPBExtensionRepeated      = 1 << 0,
   GPBExtensionPacked        = 1 << 1,
@@ -132,7 +130,6 @@
 } GPBExtensionDescription;
 
 typedef NS_OPTIONS(uint32_t, GPBDescriptorInitializationFlags) {
-  GPBDescriptorInitializationFlag_None              = 0,
   GPBDescriptorInitializationFlag_FieldsWithDefault = 1 << 0,
   GPBDescriptorInitializationFlag_WireFormat        = 1 << 1,
 };
@@ -168,16 +165,11 @@
       firstHasIndex:(int32_t)firstHasIndex;
 - (void)setupExtraTextInfo:(const char *)extraTextFormatInfo;
 - (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count;
-- (void)setupContainingMessageClassName:(const char *)msgClassName;
-- (void)setupMessageClassNameSuffix:(NSString *)suffix;
 
 @end
 
 @interface GPBFileDescriptor ()
 - (instancetype)initWithPackage:(NSString *)package
-                     objcPrefix:(NSString *)objcPrefix
-                         syntax:(GPBFileSyntax)syntax;
-- (instancetype)initWithPackage:(NSString *)package
                          syntax:(GPBFileSyntax)syntax;
 @end
 
@@ -253,12 +245,6 @@
 
 CF_EXTERN_C_BEGIN
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 GPB_INLINE BOOL GPBFieldIsMapOrArray(GPBFieldDescriptor *field) {
   return (field->description_->flags &
           (GPBFieldRepeated | GPBFieldMapKeyMask)) != 0;
@@ -276,8 +262,6 @@
   return field->description_->number;
 }
 
-#pragma clang diagnostic pop
-
 uint32_t GPBFieldTag(GPBFieldDescriptor *self);
 
 // For repeated fields, alternateWireType is the wireType with the opposite
@@ -286,6 +270,10 @@
 // would be the wire type for packed.
 uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self);
 
+GPB_INLINE BOOL GPBPreserveUnknownFields(GPBFileSyntax syntax) {
+  return syntax != GPBFileSyntaxProto3;
+}
+
 GPB_INLINE BOOL GPBHasPreservingUnknownEnumSemantics(GPBFileSyntax syntax) {
   return syntax == GPBFileSyntaxProto3;
 }
@@ -303,23 +291,23 @@
 }
 
 // Helper for compile time assets.
-#ifndef GPBInternalCompileAssert
+#ifndef _GPBCompileAssert
   #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
-    #define GPBInternalCompileAssert(test, msg) _Static_assert((test), #msg)
+    #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
   #else
     // Pre-Xcode 7 support.
-    #define GPBInternalCompileAssertSymbolInner(line, msg) GPBInternalCompileAssert ## line ## __ ## msg
-    #define GPBInternalCompileAssertSymbol(line, msg) GPBInternalCompileAssertSymbolInner(line, msg)
-    #define GPBInternalCompileAssert(test, msg) \
-        typedef char GPBInternalCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
+    #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
+    #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg)
+    #define _GPBCompileAssert(test, msg) \
+        typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
   #endif  // __has_feature(c_static_assert) || __has_extension(c_static_assert)
-#endif // GPBInternalCompileAssert
+#endif // _GPBCompileAssert
 
 // Sanity check that there isn't padding between the field description
 // structures with and without a default.
-GPBInternalCompileAssert(sizeof(GPBMessageFieldDescriptionWithDefault) ==
-                         (sizeof(GPBGenericValue) +
-                          sizeof(GPBMessageFieldDescription)),
-                         DescriptionsWithDefault_different_size_than_expected);
+_GPBCompileAssert(sizeof(GPBMessageFieldDescriptionWithDefault) ==
+                  (sizeof(GPBGenericValue) +
+                   sizeof(GPBMessageFieldDescription)),
+                  DescriptionsWithDefault_different_size_than_expected);
 
 CF_EXTERN_C_END
diff --git a/objectivec/GPBDictionary.h b/objectivec/GPBDictionary.h
index 9d67415..3120814 100644
--- a/objectivec/GPBDictionary.h
+++ b/objectivec/GPBDictionary.h
@@ -32,14 +32,10 @@
 
 #import "GPBRuntimeTypes.h"
 
-// Note on naming: for the classes holding numeric values, a more natural
-// naming of the method might be things like "-valueForKey:",
-// "-setValue:forKey:"; etc. But those selectors are also defined by Key Value
-// Coding (KVC) as categories on NSObject. So "overloading" the selectors with
-// other meanings can cause warnings (based on compiler settings), but more
-// importantly, some of those selector get called as KVC breaks up keypaths.
-// So if those selectors are used, using KVC will compile cleanly, but could
-// crash as it invokes those selectors with the wrong types of arguments.
+// These classes are used for map fields of basic data types. They are used because
+// they perform better than boxing into NSNumbers in NSDictionaries.
+
+// Note: These are not meant to be subclassed.
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -48,1134 +44,275 @@
 
 #pragma mark - UInt32 -> UInt32
 
-/**
- * Class used for map fields of <uint32_t, uint32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32UInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [__nullable])values
-                              forKeys:(const uint32_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(uint32_t)key;
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt32s:(const uint32_t [__nullable])values
-                        forKeys:(const uint32_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable uint32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, uint32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32UInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt32:(uint32_t)value forKey:(uint32_t)key;
+- (void)setValue:(uint32_t)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt32ForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Int32
 
-/**
- * Class used for map fields of <uint32_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32Int32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt32s:(const int32_t [__nullable])values
-                             forKeys:(const uint32_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int32_t [])values
+                             forKeys:(const uint32_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt32Int32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt32s:(const int32_t [__nullable])values
-                       forKeys:(const uint32_t [__nullable])keys
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const uint32_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt32Int32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32Int32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt32:(int32_t)value forKey:(uint32_t)key;
+- (void)setValue:(int32_t)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt32ForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> UInt64
 
-/**
- * Class used for map fields of <uint32_t, uint64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32UInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [__nullable])values
-                              forKeys:(const uint32_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(uint32_t)key;
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt64s:(const uint64_t [__nullable])values
-                        forKeys:(const uint32_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable uint64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, uint64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32UInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt64:(uint64_t)value forKey:(uint32_t)key;
+- (void)setValue:(uint64_t)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt64ForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Int64
 
-/**
- * Class used for map fields of <uint32_t, int64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32Int64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt64s:(const int64_t [__nullable])values
-                             forKeys:(const uint32_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int64_t [])values
+                             forKeys:(const uint32_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt32Int64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt64s:(const int64_t [__nullable])values
-                       forKeys:(const uint32_t [__nullable])keys
+- (instancetype)initWithValues:(const int64_t [])values
+                       forKeys:(const uint32_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt32Int64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable int64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, int64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32Int64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt64:(int64_t)value forKey:(uint32_t)key;
+- (void)setValue:(int64_t)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt64ForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Bool
 
-/**
- * Class used for map fields of <uint32_t, BOOL>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32BoolDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithBools:(const BOOL [__nullable])values
-                            forKeys:(const uint32_t [__nullable])keys
-                              count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(uint32_t)key;
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt32BoolDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithBools:(const BOOL [__nullable])values
-                      forKeys:(const uint32_t [__nullable])keys
-                        count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt32BoolDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getBool:(nullable BOOL *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable BOOL *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, BOOL value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32BoolDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setBool:(BOOL)value forKey:(uint32_t)key;
+- (void)setValue:(BOOL)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeBoolForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Float
 
-/**
- * Class used for map fields of <uint32_t, float>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32FloatDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithFloats:(const float [__nullable])values
-                             forKeys:(const uint32_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const float [])values
+                             forKeys:(const uint32_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt32FloatDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithFloats:(const float [__nullable])values
-                       forKeys:(const uint32_t [__nullable])keys
+- (instancetype)initWithValues:(const float [])values
+                       forKeys:(const uint32_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt32FloatDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getFloat:(nullable float *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable float *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, float value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32FloatDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setFloat:(float)value forKey:(uint32_t)key;
+- (void)setValue:(float)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeFloatForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Double
 
-/**
- * Class used for map fields of <uint32_t, double>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32DoubleDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithDoubles:(const double [__nullable])values
-                              forKeys:(const uint32_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(uint32_t)key;
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt32DoubleDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithDoubles:(const double [__nullable])values
-                        forKeys:(const uint32_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt32DoubleDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getDouble:(nullable double *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable double *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, double value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32DoubleDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setDouble:(double)value forKey:(uint32_t)key;
+- (void)setValue:(double)value forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeDoubleForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Enum
 
-/**
- * Class used for map fields of <uint32_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32EnumDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly instanced dictionary.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param func     The enum validation function for the dictionary.
- * @param rawValue The raw enum value to be placed in the dictionary.
- * @param key      The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         rawValue:(int32_t)rawValue
                                           forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                       rawValues:(const int32_t [__nullable])values
-                                         forKeys:(const uint32_t [__nullable])keys
+                                       rawValues:(const int32_t [])values
+                                         forKeys:(const uint32_t [])keys
                                            count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt32EnumDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         capacity:(NSUInteger)numItems;
 
-/**
- * Initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly initialized dictionary.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly initialized dictionary with the keys and values in it.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
-                                   forKeys:(const uint32_t [__nullable])keys
+                                 rawValues:(const int32_t [])values
+                                   forKeys:(const uint32_t [])keys
                                      count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly initialized dictionary with the entries from the given
- *         dictionary in it.
- **/
 - (instancetype)initWithDictionary:(GPBUInt32EnumDictionary *)dictionary;
-
-/**
- * Initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly initialized dictionary with the given capacity.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)numItems;
 
@@ -1183,63 +320,19 @@
 // is not a valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getEnum:(nullable int32_t *)value forKey:(uint32_t)key;
+- (BOOL)valueForKey:(uint32_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Gets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue Pointer into which the value will be set, if found.
- * @param key      Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getRawValue:(nullable int32_t *)rawValue forKey:(uint32_t)key;
+// These methods bypass the validationFunc to provide access to values that were not
+// known at the time the binary was compiled.
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param block The block to enumerate with.
- *   **key**:      The key for the current entry.
- *   **rawValue**: The value for the current entry
- *   **stop**:     A pointer to a boolean that when set stops the enumeration.
- **/
+- (BOOL)valueForKey:(uint32_t)key rawValue:(nullable int32_t *)rawValue;
+
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(uint32_t key, int32_t rawValue, BOOL *stop))block;
 
-/**
- * Adds the keys and raw enum values from another dictionary.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addRawEntriesFromDictionary:(GPBUInt32EnumDictionary *)otherDictionary;
 
 // If value is not a valid enumerator as defined by validationFunc, these
@@ -1247,1312 +340,325 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setEnum:(int32_t)value forKey:(uint32_t)key;
+- (void)setValue:(int32_t)value forKey:(uint32_t)key;
 
-/**
- * Sets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue The raw enum value to set.
- * @param key      The key under which to store the raw enum value.
- **/
+// This method bypass the validationFunc to provide setting of values that were not
+// known at the time the binary was compiled.
 - (void)setRawValue:(int32_t)rawValue forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeEnumForKey:(uint32_t)aKey;
+// No validation applies to these methods.
 
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt32 -> Object
 
-/**
- * Class used for map fields of <uint32_t, ObjectType>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt32ObjectDictionary<__covariant ObjectType> : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param object     The value to be placed in the dictionary.
- * @param key        The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithObject:(ObjectType)object
                               forKey:(uint32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param objects      The values to be placed in the dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                              forKeys:(const uint32_t [__nullable])keys
++ (instancetype)dictionaryWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                              forKeys:(const uint32_t [])keys
                                 count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt32ObjectDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param objects      The values to be placed in this dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                        forKeys:(const uint32_t [__nullable])keys
+- (instancetype)initWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                        forKeys:(const uint32_t [])keys
                           count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt32ObjectDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Fetches the object stored under the given key.
- *
- * @param key Key under which the value is stored, if present.
- *
- * @return The object if found, nil otherwise.
- **/
 - (ObjectType)objectForKey:(uint32_t)key;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:         The key for the current entry.
- *   **object**:      The value for the current entry
- *   **stop**:        A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(uint32_t key, ObjectType object, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt32ObjectDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param object     The value to set.
- * @param key        The key under which to store the value.
- **/
 - (void)setObject:(ObjectType)object forKey:(uint32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
 - (void)removeObjectForKey:(uint32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> UInt32
 
-/**
- * Class used for map fields of <int32_t, uint32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32UInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [__nullable])values
-                              forKeys:(const int32_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(int32_t)key;
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt32UInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt32s:(const uint32_t [__nullable])values
-                        forKeys:(const int32_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt32UInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable uint32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, uint32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32UInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt32:(uint32_t)value forKey:(int32_t)key;
+- (void)setValue:(uint32_t)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt32ForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Int32
 
-/**
- * Class used for map fields of <int32_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32Int32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt32s:(const int32_t [__nullable])values
-                             forKeys:(const int32_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int32_t [])values
+                             forKeys:(const int32_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt32Int32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt32s:(const int32_t [__nullable])values
-                       forKeys:(const int32_t [__nullable])keys
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const int32_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt32Int32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32Int32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt32:(int32_t)value forKey:(int32_t)key;
+- (void)setValue:(int32_t)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt32ForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> UInt64
 
-/**
- * Class used for map fields of <int32_t, uint64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32UInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [__nullable])values
-                              forKeys:(const int32_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(int32_t)key;
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt32UInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt64s:(const uint64_t [__nullable])values
-                        forKeys:(const int32_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt32UInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable uint64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, uint64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32UInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt64:(uint64_t)value forKey:(int32_t)key;
+- (void)setValue:(uint64_t)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt64ForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Int64
 
-/**
- * Class used for map fields of <int32_t, int64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32Int64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt64s:(const int64_t [__nullable])values
-                             forKeys:(const int32_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int64_t [])values
+                             forKeys:(const int32_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt32Int64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt64s:(const int64_t [__nullable])values
-                       forKeys:(const int32_t [__nullable])keys
+- (instancetype)initWithValues:(const int64_t [])values
+                       forKeys:(const int32_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt32Int64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable int64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, int64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32Int64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt64:(int64_t)value forKey:(int32_t)key;
+- (void)setValue:(int64_t)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt64ForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Bool
 
-/**
- * Class used for map fields of <int32_t, BOOL>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32BoolDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithBools:(const BOOL [__nullable])values
-                            forKeys:(const int32_t [__nullable])keys
-                              count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(int32_t)key;
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt32BoolDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithBools:(const BOOL [__nullable])values
-                      forKeys:(const int32_t [__nullable])keys
-                        count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt32BoolDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getBool:(nullable BOOL *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable BOOL *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, BOOL value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32BoolDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setBool:(BOOL)value forKey:(int32_t)key;
+- (void)setValue:(BOOL)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeBoolForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Float
 
-/**
- * Class used for map fields of <int32_t, float>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32FloatDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithFloats:(const float [__nullable])values
-                             forKeys:(const int32_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const float [])values
+                             forKeys:(const int32_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt32FloatDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithFloats:(const float [__nullable])values
-                       forKeys:(const int32_t [__nullable])keys
+- (instancetype)initWithValues:(const float [])values
+                       forKeys:(const int32_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt32FloatDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getFloat:(nullable float *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable float *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, float value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32FloatDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setFloat:(float)value forKey:(int32_t)key;
+- (void)setValue:(float)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeFloatForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Double
 
-/**
- * Class used for map fields of <int32_t, double>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32DoubleDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithDoubles:(const double [__nullable])values
-                              forKeys:(const int32_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(int32_t)key;
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt32DoubleDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithDoubles:(const double [__nullable])values
-                        forKeys:(const int32_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt32DoubleDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getDouble:(nullable double *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable double *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, double value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32DoubleDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setDouble:(double)value forKey:(int32_t)key;
+- (void)setValue:(double)value forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeDoubleForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Enum
 
-/**
- * Class used for map fields of <int32_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32EnumDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly instanced dictionary.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param func     The enum validation function for the dictionary.
- * @param rawValue The raw enum value to be placed in the dictionary.
- * @param key      The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         rawValue:(int32_t)rawValue
                                           forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                       rawValues:(const int32_t [__nullable])values
-                                         forKeys:(const int32_t [__nullable])keys
+                                       rawValues:(const int32_t [])values
+                                         forKeys:(const int32_t [])keys
                                            count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt32EnumDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         capacity:(NSUInteger)numItems;
 
-/**
- * Initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly initialized dictionary.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly initialized dictionary with the keys and values in it.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
-                                   forKeys:(const int32_t [__nullable])keys
+                                 rawValues:(const int32_t [])values
+                                   forKeys:(const int32_t [])keys
                                      count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly initialized dictionary with the entries from the given
- *         dictionary in it.
- **/
 - (instancetype)initWithDictionary:(GPBInt32EnumDictionary *)dictionary;
-
-/**
- * Initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly initialized dictionary with the given capacity.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)numItems;
 
@@ -2560,63 +666,19 @@
 // is not a valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getEnum:(nullable int32_t *)value forKey:(int32_t)key;
+- (BOOL)valueForKey:(int32_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Gets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue Pointer into which the value will be set, if found.
- * @param key      Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getRawValue:(nullable int32_t *)rawValue forKey:(int32_t)key;
+// These methods bypass the validationFunc to provide access to values that were not
+// known at the time the binary was compiled.
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param block The block to enumerate with.
- *   **key**:      The key for the current entry.
- *   **rawValue**: The value for the current entry
- *   **stop**:     A pointer to a boolean that when set stops the enumeration.
- **/
+- (BOOL)valueForKey:(int32_t)key rawValue:(nullable int32_t *)rawValue;
+
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(int32_t key, int32_t rawValue, BOOL *stop))block;
 
-/**
- * Adds the keys and raw enum values from another dictionary.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addRawEntriesFromDictionary:(GPBInt32EnumDictionary *)otherDictionary;
 
 // If value is not a valid enumerator as defined by validationFunc, these
@@ -2624,1312 +686,325 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setEnum:(int32_t)value forKey:(int32_t)key;
+- (void)setValue:(int32_t)value forKey:(int32_t)key;
 
-/**
- * Sets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue The raw enum value to set.
- * @param key      The key under which to store the raw enum value.
- **/
+// This method bypass the validationFunc to provide setting of values that were not
+// known at the time the binary was compiled.
 - (void)setRawValue:(int32_t)rawValue forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeEnumForKey:(int32_t)aKey;
+// No validation applies to these methods.
 
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int32_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int32 -> Object
 
-/**
- * Class used for map fields of <int32_t, ObjectType>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt32ObjectDictionary<__covariant ObjectType> : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param object     The value to be placed in the dictionary.
- * @param key        The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithObject:(ObjectType)object
                               forKey:(int32_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param objects      The values to be placed in the dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                              forKeys:(const int32_t [__nullable])keys
++ (instancetype)dictionaryWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                              forKeys:(const int32_t [])keys
                                 count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt32ObjectDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param objects      The values to be placed in this dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                        forKeys:(const int32_t [__nullable])keys
+- (instancetype)initWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                        forKeys:(const int32_t [])keys
                           count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt32ObjectDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Fetches the object stored under the given key.
- *
- * @param key Key under which the value is stored, if present.
- *
- * @return The object if found, nil otherwise.
- **/
 - (ObjectType)objectForKey:(int32_t)key;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:         The key for the current entry.
- *   **object**:      The value for the current entry
- *   **stop**:        A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(int32_t key, ObjectType object, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt32ObjectDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param object     The value to set.
- * @param key        The key under which to store the value.
- **/
 - (void)setObject:(ObjectType)object forKey:(int32_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
 - (void)removeObjectForKey:(int32_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> UInt32
 
-/**
- * Class used for map fields of <uint64_t, uint32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64UInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [__nullable])values
-                              forKeys:(const uint64_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(uint64_t)key;
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt32s:(const uint32_t [__nullable])values
-                        forKeys:(const uint64_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable uint32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, uint32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64UInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt32:(uint32_t)value forKey:(uint64_t)key;
+- (void)setValue:(uint32_t)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt32ForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Int32
 
-/**
- * Class used for map fields of <uint64_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64Int32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt32s:(const int32_t [__nullable])values
-                             forKeys:(const uint64_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int32_t [])values
+                             forKeys:(const uint64_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt64Int32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt32s:(const int32_t [__nullable])values
-                       forKeys:(const uint64_t [__nullable])keys
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const uint64_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt64Int32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64Int32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt32:(int32_t)value forKey:(uint64_t)key;
+- (void)setValue:(int32_t)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt32ForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> UInt64
 
-/**
- * Class used for map fields of <uint64_t, uint64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64UInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [__nullable])values
-                              forKeys:(const uint64_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(uint64_t)key;
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt64s:(const uint64_t [__nullable])values
-                        forKeys:(const uint64_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable uint64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, uint64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64UInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt64:(uint64_t)value forKey:(uint64_t)key;
+- (void)setValue:(uint64_t)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt64ForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Int64
 
-/**
- * Class used for map fields of <uint64_t, int64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64Int64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt64s:(const int64_t [__nullable])values
-                             forKeys:(const uint64_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int64_t [])values
+                             forKeys:(const uint64_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt64Int64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt64s:(const int64_t [__nullable])values
-                       forKeys:(const uint64_t [__nullable])keys
+- (instancetype)initWithValues:(const int64_t [])values
+                       forKeys:(const uint64_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt64Int64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable int64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, int64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64Int64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt64:(int64_t)value forKey:(uint64_t)key;
+- (void)setValue:(int64_t)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt64ForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Bool
 
-/**
- * Class used for map fields of <uint64_t, BOOL>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64BoolDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithBools:(const BOOL [__nullable])values
-                            forKeys:(const uint64_t [__nullable])keys
-                              count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(uint64_t)key;
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt64BoolDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithBools:(const BOOL [__nullable])values
-                      forKeys:(const uint64_t [__nullable])keys
-                        count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt64BoolDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getBool:(nullable BOOL *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable BOOL *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, BOOL value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64BoolDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setBool:(BOOL)value forKey:(uint64_t)key;
+- (void)setValue:(BOOL)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeBoolForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Float
 
-/**
- * Class used for map fields of <uint64_t, float>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64FloatDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithFloats:(const float [__nullable])values
-                             forKeys:(const uint64_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const float [])values
+                             forKeys:(const uint64_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt64FloatDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithFloats:(const float [__nullable])values
-                       forKeys:(const uint64_t [__nullable])keys
+- (instancetype)initWithValues:(const float [])values
+                       forKeys:(const uint64_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt64FloatDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getFloat:(nullable float *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable float *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, float value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64FloatDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setFloat:(float)value forKey:(uint64_t)key;
+- (void)setValue:(float)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeFloatForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Double
 
-/**
- * Class used for map fields of <uint64_t, double>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64DoubleDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithDoubles:(const double [__nullable])values
-                              forKeys:(const uint64_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(uint64_t)key;
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBUInt64DoubleDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithDoubles:(const double [__nullable])values
-                        forKeys:(const uint64_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBUInt64DoubleDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getDouble:(nullable double *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable double *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, double value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64DoubleDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setDouble:(double)value forKey:(uint64_t)key;
+- (void)setValue:(double)value forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeDoubleForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Enum
 
-/**
- * Class used for map fields of <uint64_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64EnumDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly instanced dictionary.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param func     The enum validation function for the dictionary.
- * @param rawValue The raw enum value to be placed in the dictionary.
- * @param key      The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         rawValue:(int32_t)rawValue
                                           forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                       rawValues:(const int32_t [__nullable])values
-                                         forKeys:(const uint64_t [__nullable])keys
+                                       rawValues:(const int32_t [])values
+                                         forKeys:(const uint64_t [])keys
                                            count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt64EnumDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         capacity:(NSUInteger)numItems;
 
-/**
- * Initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly initialized dictionary.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly initialized dictionary with the keys and values in it.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
-                                   forKeys:(const uint64_t [__nullable])keys
+                                 rawValues:(const int32_t [])values
+                                   forKeys:(const uint64_t [])keys
                                      count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly initialized dictionary with the entries from the given
- *         dictionary in it.
- **/
 - (instancetype)initWithDictionary:(GPBUInt64EnumDictionary *)dictionary;
-
-/**
- * Initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly initialized dictionary with the given capacity.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)numItems;
 
@@ -3937,63 +1012,19 @@
 // is not a valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getEnum:(nullable int32_t *)value forKey:(uint64_t)key;
+- (BOOL)valueForKey:(uint64_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Gets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue Pointer into which the value will be set, if found.
- * @param key      Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getRawValue:(nullable int32_t *)rawValue forKey:(uint64_t)key;
+// These methods bypass the validationFunc to provide access to values that were not
+// known at the time the binary was compiled.
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param block The block to enumerate with.
- *   **key**:      The key for the current entry.
- *   **rawValue**: The value for the current entry
- *   **stop**:     A pointer to a boolean that when set stops the enumeration.
- **/
+- (BOOL)valueForKey:(uint64_t)key rawValue:(nullable int32_t *)rawValue;
+
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(uint64_t key, int32_t rawValue, BOOL *stop))block;
 
-/**
- * Adds the keys and raw enum values from another dictionary.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addRawEntriesFromDictionary:(GPBUInt64EnumDictionary *)otherDictionary;
 
 // If value is not a valid enumerator as defined by validationFunc, these
@@ -4001,1312 +1032,325 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setEnum:(int32_t)value forKey:(uint64_t)key;
+- (void)setValue:(int32_t)value forKey:(uint64_t)key;
 
-/**
- * Sets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue The raw enum value to set.
- * @param key      The key under which to store the raw enum value.
- **/
+// This method bypass the validationFunc to provide setting of values that were not
+// known at the time the binary was compiled.
 - (void)setRawValue:(int32_t)rawValue forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeEnumForKey:(uint64_t)aKey;
+// No validation applies to these methods.
 
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(uint64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - UInt64 -> Object
 
-/**
- * Class used for map fields of <uint64_t, ObjectType>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBUInt64ObjectDictionary<__covariant ObjectType> : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param object     The value to be placed in the dictionary.
- * @param key        The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithObject:(ObjectType)object
                               forKey:(uint64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param objects      The values to be placed in the dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                              forKeys:(const uint64_t [__nullable])keys
++ (instancetype)dictionaryWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                              forKeys:(const uint64_t [])keys
                                 count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBUInt64ObjectDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param objects      The values to be placed in this dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                        forKeys:(const uint64_t [__nullable])keys
+- (instancetype)initWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                        forKeys:(const uint64_t [])keys
                           count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBUInt64ObjectDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Fetches the object stored under the given key.
- *
- * @param key Key under which the value is stored, if present.
- *
- * @return The object if found, nil otherwise.
- **/
 - (ObjectType)objectForKey:(uint64_t)key;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:         The key for the current entry.
- *   **object**:      The value for the current entry
- *   **stop**:        A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(uint64_t key, ObjectType object, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBUInt64ObjectDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param object     The value to set.
- * @param key        The key under which to store the value.
- **/
 - (void)setObject:(ObjectType)object forKey:(uint64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
 - (void)removeObjectForKey:(uint64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> UInt32
 
-/**
- * Class used for map fields of <int64_t, uint32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64UInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [__nullable])values
-                              forKeys:(const int64_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(int64_t)key;
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt64UInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt32s:(const uint32_t [__nullable])values
-                        forKeys:(const int64_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt64UInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable uint32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, uint32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64UInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt32:(uint32_t)value forKey:(int64_t)key;
+- (void)setValue:(uint32_t)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt32ForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Int32
 
-/**
- * Class used for map fields of <int64_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64Int32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt32s:(const int32_t [__nullable])values
-                             forKeys:(const int64_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int32_t [])values
+                             forKeys:(const int64_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt64Int32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt32s:(const int32_t [__nullable])values
-                       forKeys:(const int64_t [__nullable])keys
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const int64_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt64Int32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64Int32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt32:(int32_t)value forKey:(int64_t)key;
+- (void)setValue:(int32_t)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt32ForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> UInt64
 
-/**
- * Class used for map fields of <int64_t, uint64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64UInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [__nullable])values
-                              forKeys:(const int64_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(int64_t)key;
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt64UInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt64s:(const uint64_t [__nullable])values
-                        forKeys:(const int64_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt64UInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable uint64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, uint64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64UInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt64:(uint64_t)value forKey:(int64_t)key;
+- (void)setValue:(uint64_t)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt64ForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Int64
 
-/**
- * Class used for map fields of <int64_t, int64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64Int64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt64s:(const int64_t [__nullable])values
-                             forKeys:(const int64_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int64_t [])values
+                             forKeys:(const int64_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt64Int64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt64s:(const int64_t [__nullable])values
-                       forKeys:(const int64_t [__nullable])keys
+- (instancetype)initWithValues:(const int64_t [])values
+                       forKeys:(const int64_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt64Int64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable int64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, int64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64Int64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt64:(int64_t)value forKey:(int64_t)key;
+- (void)setValue:(int64_t)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt64ForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Bool
 
-/**
- * Class used for map fields of <int64_t, BOOL>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64BoolDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithBools:(const BOOL [__nullable])values
-                            forKeys:(const int64_t [__nullable])keys
-                              count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(int64_t)key;
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt64BoolDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithBools:(const BOOL [__nullable])values
-                      forKeys:(const int64_t [__nullable])keys
-                        count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt64BoolDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getBool:(nullable BOOL *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable BOOL *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, BOOL value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64BoolDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setBool:(BOOL)value forKey:(int64_t)key;
+- (void)setValue:(BOOL)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeBoolForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Float
 
-/**
- * Class used for map fields of <int64_t, float>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64FloatDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithFloats:(const float [__nullable])values
-                             forKeys:(const int64_t [__nullable])keys
++ (instancetype)dictionaryWithValues:(const float [])values
+                             forKeys:(const int64_t [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt64FloatDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithFloats:(const float [__nullable])values
-                       forKeys:(const int64_t [__nullable])keys
+- (instancetype)initWithValues:(const float [])values
+                       forKeys:(const int64_t [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt64FloatDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getFloat:(nullable float *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable float *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, float value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64FloatDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setFloat:(float)value forKey:(int64_t)key;
+- (void)setValue:(float)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeFloatForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Double
 
-/**
- * Class used for map fields of <int64_t, double>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64DoubleDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithDoubles:(const double [__nullable])values
-                              forKeys:(const int64_t [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(int64_t)key;
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBInt64DoubleDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithDoubles:(const double [__nullable])values
-                        forKeys:(const int64_t [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBInt64DoubleDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getDouble:(nullable double *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable double *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, double value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64DoubleDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setDouble:(double)value forKey:(int64_t)key;
+- (void)setValue:(double)value forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeDoubleForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Enum
 
-/**
- * Class used for map fields of <int64_t, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64EnumDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly instanced dictionary.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param func     The enum validation function for the dictionary.
- * @param rawValue The raw enum value to be placed in the dictionary.
- * @param key      The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         rawValue:(int32_t)rawValue
                                           forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                       rawValues:(const int32_t [__nullable])values
-                                         forKeys:(const int64_t [__nullable])keys
+                                       rawValues:(const int32_t [])values
+                                         forKeys:(const int64_t [])keys
                                            count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt64EnumDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         capacity:(NSUInteger)numItems;
 
-/**
- * Initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly initialized dictionary.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly initialized dictionary with the keys and values in it.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
-                                   forKeys:(const int64_t [__nullable])keys
+                                 rawValues:(const int32_t [])values
+                                   forKeys:(const int64_t [])keys
                                      count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly initialized dictionary with the entries from the given
- *         dictionary in it.
- **/
 - (instancetype)initWithDictionary:(GPBInt64EnumDictionary *)dictionary;
-
-/**
- * Initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly initialized dictionary with the given capacity.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)numItems;
 
@@ -5314,63 +1358,19 @@
 // is not a valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getEnum:(nullable int32_t *)value forKey:(int64_t)key;
+- (BOOL)valueForKey:(int64_t)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, int32_t value, BOOL *stop))block;
 
-/**
- * Gets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue Pointer into which the value will be set, if found.
- * @param key      Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getRawValue:(nullable int32_t *)rawValue forKey:(int64_t)key;
+// These methods bypass the validationFunc to provide access to values that were not
+// known at the time the binary was compiled.
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param block The block to enumerate with.
- *   **key**:      The key for the current entry.
- *   **rawValue**: The value for the current entry
- *   **stop**:     A pointer to a boolean that when set stops the enumeration.
- **/
+- (BOOL)valueForKey:(int64_t)key rawValue:(nullable int32_t *)rawValue;
+
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(int64_t key, int32_t rawValue, BOOL *stop))block;
 
-/**
- * Adds the keys and raw enum values from another dictionary.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addRawEntriesFromDictionary:(GPBInt64EnumDictionary *)otherDictionary;
 
 // If value is not a valid enumerator as defined by validationFunc, these
@@ -5378,1312 +1378,325 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setEnum:(int32_t)value forKey:(int64_t)key;
+- (void)setValue:(int32_t)value forKey:(int64_t)key;
 
-/**
- * Sets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue The raw enum value to set.
- * @param key      The key under which to store the raw enum value.
- **/
+// This method bypass the validationFunc to provide setting of values that were not
+// known at the time the binary was compiled.
 - (void)setRawValue:(int32_t)rawValue forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeEnumForKey:(int64_t)aKey;
+// No validation applies to these methods.
 
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(int64_t)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Int64 -> Object
 
-/**
- * Class used for map fields of <int64_t, ObjectType>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBInt64ObjectDictionary<__covariant ObjectType> : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param object     The value to be placed in the dictionary.
- * @param key        The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithObject:(ObjectType)object
                               forKey:(int64_t)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param objects      The values to be placed in the dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                              forKeys:(const int64_t [__nullable])keys
++ (instancetype)dictionaryWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                              forKeys:(const int64_t [])keys
                                 count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBInt64ObjectDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param objects      The values to be placed in this dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                        forKeys:(const int64_t [__nullable])keys
+- (instancetype)initWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                        forKeys:(const int64_t [])keys
                           count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBInt64ObjectDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Fetches the object stored under the given key.
- *
- * @param key Key under which the value is stored, if present.
- *
- * @return The object if found, nil otherwise.
- **/
 - (ObjectType)objectForKey:(int64_t)key;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:         The key for the current entry.
- *   **object**:      The value for the current entry
- *   **stop**:        A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(int64_t key, ObjectType object, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBInt64ObjectDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param object     The value to set.
- * @param key        The key under which to store the value.
- **/
 - (void)setObject:(ObjectType)object forKey:(int64_t)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
 - (void)removeObjectForKey:(int64_t)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> UInt32
 
-/**
- * Class used for map fields of <BOOL, uint32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolUInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [__nullable])values
-                              forKeys:(const BOOL [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(BOOL)key;
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt32s:(const uint32_t [__nullable])values
-                        forKeys:(const BOOL [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBBoolUInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable uint32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, uint32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolUInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt32:(uint32_t)value forKey:(BOOL)key;
+- (void)setValue:(uint32_t)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt32ForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Int32
 
-/**
- * Class used for map fields of <BOOL, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt32s:(const int32_t [__nullable])values
-                             forKeys:(const BOOL [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int32_t [])values
+                             forKeys:(const BOOL [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBBoolInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt32s:(const int32_t [__nullable])values
-                       forKeys:(const BOOL [__nullable])keys
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const BOOL [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBBoolInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, int32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt32:(int32_t)value forKey:(BOOL)key;
+- (void)setValue:(int32_t)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt32ForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> UInt64
 
-/**
- * Class used for map fields of <BOOL, uint64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolUInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [__nullable])values
-                              forKeys:(const BOOL [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(BOOL)key;
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt64s:(const uint64_t [__nullable])values
-                        forKeys:(const BOOL [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBBoolUInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable uint64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, uint64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolUInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt64:(uint64_t)value forKey:(BOOL)key;
+- (void)setValue:(uint64_t)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt64ForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Int64
 
-/**
- * Class used for map fields of <BOOL, int64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt64s:(const int64_t [__nullable])values
-                             forKeys:(const BOOL [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int64_t [])values
+                             forKeys:(const BOOL [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBBoolInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt64s:(const int64_t [__nullable])values
-                       forKeys:(const BOOL [__nullable])keys
+- (instancetype)initWithValues:(const int64_t [])values
+                       forKeys:(const BOOL [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBBoolInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable int64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, int64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt64:(int64_t)value forKey:(BOOL)key;
+- (void)setValue:(int64_t)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt64ForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Bool
 
-/**
- * Class used for map fields of <BOOL, BOOL>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolBoolDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithBools:(const BOOL [__nullable])values
-                            forKeys:(const BOOL [__nullable])keys
-                              count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(BOOL)key;
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBBoolBoolDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithBools:(const BOOL [__nullable])values
-                      forKeys:(const BOOL [__nullable])keys
-                        count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBBoolBoolDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getBool:(nullable BOOL *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable BOOL *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, BOOL value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolBoolDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setBool:(BOOL)value forKey:(BOOL)key;
+- (void)setValue:(BOOL)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeBoolForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Float
 
-/**
- * Class used for map fields of <BOOL, float>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolFloatDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithFloats:(const float [__nullable])values
-                             forKeys:(const BOOL [__nullable])keys
++ (instancetype)dictionaryWithValues:(const float [])values
+                             forKeys:(const BOOL [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBBoolFloatDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithFloats:(const float [__nullable])values
-                       forKeys:(const BOOL [__nullable])keys
+- (instancetype)initWithValues:(const float [])values
+                       forKeys:(const BOOL [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBBoolFloatDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getFloat:(nullable float *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable float *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, float value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolFloatDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setFloat:(float)value forKey:(BOOL)key;
+- (void)setValue:(float)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeFloatForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Double
 
-/**
- * Class used for map fields of <BOOL, double>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolDoubleDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithDoubles:(const double [__nullable])values
-                              forKeys:(const BOOL [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(BOOL)key;
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBBoolDoubleDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithDoubles:(const double [__nullable])values
-                        forKeys:(const BOOL [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBBoolDoubleDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getDouble:(nullable double *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable double *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, double value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolDoubleDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setDouble:(double)value forKey:(BOOL)key;
+- (void)setValue:(double)value forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeDoubleForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Enum
 
-/**
- * Class used for map fields of <BOOL, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolEnumDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly instanced dictionary.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param func     The enum validation function for the dictionary.
- * @param rawValue The raw enum value to be placed in the dictionary.
- * @param key      The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         rawValue:(int32_t)rawValue
                                           forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                       rawValues:(const int32_t [__nullable])values
-                                         forKeys:(const BOOL [__nullable])keys
+                                       rawValues:(const int32_t [])values
+                                         forKeys:(const BOOL [])keys
                                            count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBBoolEnumDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         capacity:(NSUInteger)numItems;
 
-/**
- * Initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly initialized dictionary.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly initialized dictionary with the keys and values in it.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
-                                   forKeys:(const BOOL [__nullable])keys
+                                 rawValues:(const int32_t [])values
+                                   forKeys:(const BOOL [])keys
                                      count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly initialized dictionary with the entries from the given
- *         dictionary in it.
- **/
 - (instancetype)initWithDictionary:(GPBBoolEnumDictionary *)dictionary;
-
-/**
- * Initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly initialized dictionary with the given capacity.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)numItems;
 
@@ -6691,63 +1704,19 @@
 // is not a valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getEnum:(nullable int32_t *)value forKey:(BOOL)key;
+- (BOOL)valueForKey:(BOOL)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, int32_t value, BOOL *stop))block;
 
-/**
- * Gets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue Pointer into which the value will be set, if found.
- * @param key      Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getRawValue:(nullable int32_t *)rawValue forKey:(BOOL)key;
+// These methods bypass the validationFunc to provide access to values that were not
+// known at the time the binary was compiled.
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param block The block to enumerate with.
- *   **key**:      The key for the current entry.
- *   **rawValue**: The value for the current entry
- *   **stop**:     A pointer to a boolean that when set stops the enumeration.
- **/
+- (BOOL)valueForKey:(BOOL)key rawValue:(nullable int32_t *)rawValue;
+
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(BOOL key, int32_t rawValue, BOOL *stop))block;
 
-/**
- * Adds the keys and raw enum values from another dictionary.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addRawEntriesFromDictionary:(GPBBoolEnumDictionary *)otherDictionary;
 
 // If value is not a valid enumerator as defined by validationFunc, these
@@ -6755,1312 +1724,325 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setEnum:(int32_t)value forKey:(BOOL)key;
+- (void)setValue:(int32_t)value forKey:(BOOL)key;
 
-/**
- * Sets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue The raw enum value to set.
- * @param key      The key under which to store the raw enum value.
- **/
+// This method bypass the validationFunc to provide setting of values that were not
+// known at the time the binary was compiled.
 - (void)setRawValue:(int32_t)rawValue forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeEnumForKey:(BOOL)aKey;
+// No validation applies to these methods.
 
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(BOOL)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - Bool -> Object
 
-/**
- * Class used for map fields of <BOOL, ObjectType>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBBoolObjectDictionary<__covariant ObjectType> : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param object     The value to be placed in the dictionary.
- * @param key        The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithObject:(ObjectType)object
                               forKey:(BOOL)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param objects      The values to be placed in the dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                              forKeys:(const BOOL [__nullable])keys
++ (instancetype)dictionaryWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                              forKeys:(const BOOL [])keys
                                 count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBBoolObjectDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param objects      The values to be placed in this dictionary.
- * @param keys         The keys under which to store the values.
- * @param count        The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithObjects:(const ObjectType __nonnull GPB_UNSAFE_UNRETAINED [__nullable])objects
-                        forKeys:(const BOOL [__nullable])keys
+- (instancetype)initWithObjects:(const ObjectType GPB_UNSAFE_UNRETAINED [])objects
+                        forKeys:(const BOOL [])keys
                           count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBBoolObjectDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Fetches the object stored under the given key.
- *
- * @param key Key under which the value is stored, if present.
- *
- * @return The object if found, nil otherwise.
- **/
 - (ObjectType)objectForKey:(BOOL)key;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:         The key for the current entry.
- *   **object**:      The value for the current entry
- *   **stop**:        A pointer to a boolean that when set stops the enumeration.
- **/
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(BOOL key, ObjectType object, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBBoolObjectDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param object     The value to set.
- * @param key        The key under which to store the value.
- **/
 - (void)setObject:(ObjectType)object forKey:(BOOL)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
 - (void)removeObjectForKey:(BOOL)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> UInt32
 
-/**
- * Class used for map fields of <NSString, uint32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringUInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [__nullable])values
-                              forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(NSString *)key;
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBStringUInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt32s:(const uint32_t [__nullable])values
-                        forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBStringUInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable uint32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, uint32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringUInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt32:(uint32_t)value forKey:(NSString *)key;
+- (void)setValue:(uint32_t)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt32ForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> Int32
 
-/**
- * Class used for map fields of <NSString, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringInt32Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt32s:(const int32_t [__nullable])values
-                             forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int32_t [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBStringInt32Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt32s:(const int32_t [__nullable])values
-                       forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBStringInt32Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, int32_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringInt32Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt32:(int32_t)value forKey:(NSString *)key;
+- (void)setValue:(int32_t)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt32ForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> UInt64
 
-/**
- * Class used for map fields of <NSString, uint64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringUInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [__nullable])values
-                              forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(NSString *)key;
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBStringUInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithUInt64s:(const uint64_t [__nullable])values
-                        forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBStringUInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable uint64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, uint64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringUInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setUInt64:(uint64_t)value forKey:(NSString *)key;
+- (void)setValue:(uint64_t)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeUInt64ForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> Int64
 
-/**
- * Class used for map fields of <NSString, int64_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringInt64Dictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithInt64s:(const int64_t [__nullable])values
-                             forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
++ (instancetype)dictionaryWithValues:(const int64_t [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBStringInt64Dictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithInt64s:(const int64_t [__nullable])values
-                       forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
+- (instancetype)initWithValues:(const int64_t [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBStringInt64Dictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable int64_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, int64_t value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringInt64Dictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setInt64:(int64_t)value forKey:(NSString *)key;
+- (void)setValue:(int64_t)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeInt64ForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> Bool
 
-/**
- * Class used for map fields of <NSString, BOOL>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringBoolDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithBools:(const BOOL [__nullable])values
-                            forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                              count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(NSString *)key;
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBStringBoolDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithBools:(const BOOL [__nullable])values
-                      forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                        count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBStringBoolDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getBool:(nullable BOOL *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable BOOL *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, BOOL value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringBoolDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setBool:(BOOL)value forKey:(NSString *)key;
+- (void)setValue:(BOOL)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeBoolForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> Float
 
-/**
- * Class used for map fields of <NSString, float>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringFloatDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithFloats:(const float [__nullable])values
-                             forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
++ (instancetype)dictionaryWithValues:(const float [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBStringFloatDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithFloats:(const float [__nullable])values
-                       forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
+- (instancetype)initWithValues:(const float [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
 - (instancetype)initWithDictionary:(GPBStringFloatDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getFloat:(nullable float *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable float *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, float value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringFloatDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setFloat:(float)value forKey:(NSString *)key;
+- (void)setValue:(float)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeFloatForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> Double
 
-/**
- * Class used for map fields of <NSString, double>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringDoubleDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param value     The value to be placed in the dictionary.
- * @param key       The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param values      The values to be placed in the dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
-+ (instancetype)dictionaryWithDoubles:(const double [__nullable])values
-                              forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                                count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(NSString *)key;
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                               count:(NSUInteger)count;
 + (instancetype)dictionaryWithDictionary:(GPBStringDoubleDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 
-/**
- * Initializes this dictionary, copying the given values and keys.
- *
- * @param values      The values to be placed in this dictionary.
- * @param keys        The keys under which to store the values.
- * @param count       The number of elements to copy into the dictionary.
- *
- * @return A newly initialized dictionary with a copy of the values and keys.
- **/
-- (instancetype)initWithDoubles:(const double [__nullable])values
-                        forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
-                          count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes this dictionary, copying the entries from the given dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to this dictionary.
- *
- * @return A newly initialized dictionary with the entries of the given dictionary.
- **/
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
+                         count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithDictionary:(GPBStringDoubleDictionary *)dictionary;
-
-/**
- * Initializes this dictionary with the requested capacity.
- *
- * @param numItems Number of items needed for this dictionary.
- *
- * @return A newly initialized dictionary with the requested capacity.
- **/
 - (instancetype)initWithCapacity:(NSUInteger)numItems;
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getDouble:(nullable double *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable double *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, double value, BOOL *stop))block;
 
-/**
- * Adds the keys and values from another dictionary.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addEntriesFromDictionary:(GPBStringDoubleDictionary *)otherDictionary;
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setDouble:(double)value forKey:(NSString *)key;
+- (void)setValue:(double)value forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeDoubleForKey:(NSString *)aKey;
-
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
 
 #pragma mark - String -> Enum
 
-/**
- * Class used for map fields of <NSString, int32_t>
- * values. This performs better than boxing into NSNumbers in NSDictionaries.
- *
- * @note This class is not meant to be subclassed.
- **/
 @interface GPBStringEnumDictionary : NSObject <NSCopying>
 
-/** Number of entries stored in this dictionary. */
 @property(nonatomic, readonly) NSUInteger count;
-/** The validation function to check if the enums are valid. */
 @property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 
-/**
- * @return A newly instanced and empty dictionary.
- **/
 + (instancetype)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly instanced dictionary.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Creates and initializes a dictionary with the single entry given.
- *
- * @param func     The enum validation function for the dictionary.
- * @param rawValue The raw enum value to be placed in the dictionary.
- * @param key      The key under which to store the value.
- *
- * @return A newly instanced dictionary with the key and value in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         rawValue:(int32_t)rawValue
                                           forKey:(NSString *)key;
-
-/**
- * Creates and initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly instanced dictionary with the keys and values in it.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                       rawValues:(const int32_t [__nullable])values
-                                         forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
+                                       rawValues:(const int32_t [])values
+                                         forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                                            count:(NSUInteger)count;
-
-/**
- * Creates and initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly instanced dictionary with the entries from the given
- *         dictionary in it.
- **/
 + (instancetype)dictionaryWithDictionary:(GPBStringEnumDictionary *)dictionary;
-
-/**
- * Creates and initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly instanced dictionary with the given capacity.
- **/
 + (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                         capacity:(NSUInteger)numItems;
 
-/**
- * Initializes a dictionary with the given validation function.
- *
- * @param func The enum validation function for the dictionary.
- *
- * @return A newly initialized dictionary.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-
-/**
- * Initializes a dictionary with the entries given.
- *
- * @param func   The enum validation function for the dictionary.
- * @param values The raw enum values values to be placed in the dictionary.
- * @param keys   The keys under which to store the values.
- * @param count  The number of entries to store in the dictionary.
- *
- * @return A newly initialized dictionary with the keys and values in it.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-                                 rawValues:(const int32_t [__nullable])values
-                                   forKeys:(const NSString * __nonnull GPB_UNSAFE_UNRETAINED [__nullable])keys
+                                 rawValues:(const int32_t [])values
+                                   forKeys:(const NSString * GPB_UNSAFE_UNRETAINED [])keys
                                      count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializes a dictionary with the entries from the given.
- * dictionary.
- *
- * @param dictionary Dictionary containing the entries to add to the dictionary.
- *
- * @return A newly initialized dictionary with the entries from the given
- *         dictionary in it.
- **/
 - (instancetype)initWithDictionary:(GPBStringEnumDictionary *)dictionary;
-
-/**
- * Initializes a dictionary with the given capacity.
- *
- * @param func     The enum validation function for the dictionary.
- * @param numItems Capacity needed for the dictionary.
- *
- * @return A newly initialized dictionary with the given capacity.
- **/
 - (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
                                   capacity:(NSUInteger)numItems;
 
@@ -8068,63 +2050,19 @@
 // is not a valid enumerator as defined by validationFunc. If the actual value is
 // desired, use "raw" version of the method.
 
-/**
- * Gets the value for the given key.
- *
- * @param value Pointer into which the value will be set, if found.
- * @param key   Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getEnum:(nullable int32_t *)value forKey:(NSString *)key;
+- (BOOL)valueForKey:(NSString *)key value:(nullable int32_t *)value;
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @param block The block to enumerate with.
- *   **key**:        The key for the current entry.
- *   **value**:      The value for the current entry
- *   **stop**:       A pointer to a boolean that when set stops the enumeration.
- **/
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, int32_t value, BOOL *stop))block;
 
-/**
- * Gets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue Pointer into which the value will be set, if found.
- * @param key      Key under which the value is stored, if present.
- *
- * @return YES if the key was found and the value was copied, NO otherwise.
- **/
-- (BOOL)getRawValue:(nullable int32_t *)rawValue forKey:(NSString *)key;
+// These methods bypass the validationFunc to provide access to values that were not
+// known at the time the binary was compiled.
 
-/**
- * Enumerates the keys and values on this dictionary with the given block.
- *
- * @note This method bypass the validationFunc to enable the access of values that
- *       were not known at the time the binary was compiled.
- *
- * @param block The block to enumerate with.
- *   **key**:      The key for the current entry.
- *   **rawValue**: The value for the current entry
- *   **stop**:     A pointer to a boolean that when set stops the enumeration.
- **/
+- (BOOL)valueForKey:(NSString *)key rawValue:(nullable int32_t *)rawValue;
+
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(NSString *key, int32_t rawValue, BOOL *stop))block;
 
-/**
- * Adds the keys and raw enum values from another dictionary.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param otherDictionary Dictionary containing entries to be added to this
- *                        dictionary.
- **/
 - (void)addRawEntriesFromDictionary:(GPBStringEnumDictionary *)otherDictionary;
 
 // If value is not a valid enumerator as defined by validationFunc, these
@@ -8132,35 +2070,15 @@
 // to the default value. Use the rawValue methods below to assign non enumerator
 // values.
 
-/**
- * Sets the value for the given key.
- *
- * @param value     The value to set.
- * @param key       The key under which to store the value.
- **/
-- (void)setEnum:(int32_t)value forKey:(NSString *)key;
+- (void)setValue:(int32_t)value forKey:(NSString *)key;
 
-/**
- * Sets the raw enum value for the given key.
- *
- * @note This method bypass the validationFunc to enable the setting of values that
- *       were not known at the time the binary was compiled.
- *
- * @param rawValue The raw enum value to set.
- * @param key      The key under which to store the raw enum value.
- **/
+// This method bypass the validationFunc to provide setting of values that were not
+// known at the time the binary was compiled.
 - (void)setRawValue:(int32_t)rawValue forKey:(NSString *)key;
 
-/**
- * Removes the entry for the given key.
- *
- * @param aKey Key to be removed from this dictionary.
- **/
-- (void)removeEnumForKey:(NSString *)aKey;
+// No validation applies to these methods.
 
-/**
- * Removes all entries in this dictionary.
- **/
+- (void)removeValueForKey:(NSString *)aKey;
 - (void)removeAll;
 
 @end
@@ -8189,147 +2107,54 @@
 //%DICTIONARY_KEY_TO_POD_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, Double, double)
 //%DICTIONARY_KEY_TO_ENUM_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, Enum, int32_t)
 //%PDDM-DEFINE DICTIONARY_KEY_TO_POD_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, VALUE_NAME, VALUE_TYPE)
-//%DICTIONARY_COMMON_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, VALUE_NAME, VALUE_TYPE, POD, VALUE_NAME, value)
+//%DICTIONARY_COMMON_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, VALUE_NAME, VALUE_TYPE, POD, value)
 //%PDDM-DEFINE DICTIONARY_POD_KEY_TO_OBJECT_INTERFACE(KEY_NAME, KEY_TYPE, VALUE_NAME, VALUE_TYPE)
-//%DICTIONARY_COMMON_INTERFACE(KEY_NAME, KEY_TYPE, , POD, VALUE_NAME, VALUE_TYPE, OBJECT, Object, object)
-//%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_TYPE, VNAME)
-//%/**
-//% * Gets the value for the given key.
-//% *
-//% * @param value Pointer into which the value will be set, if found.
-//% * @param key   Key under which the value is stored, if present.
-//% *
-//% * @return YES if the key was found and the value was copied, NO otherwise.
-//% **/
-//%- (BOOL)get##VNAME##:(nullable VALUE_TYPE *)value forKey:(KEY_TYPE)key;
-//%PDDM-DEFINE VALUE_FOR_KEY_OBJECT(KEY_TYPE, VALUE_TYPE, VNAME)
-//%/**
-//% * Fetches the object stored under the given key.
-//% *
-//% * @param key Key under which the value is stored, if present.
-//% *
-//% * @return The object if found, nil otherwise.
-//% **/
+//%DICTIONARY_COMMON_INTERFACE(KEY_NAME, KEY_TYPE, , POD, VALUE_NAME, VALUE_TYPE, OBJECT, object)
+//%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_TYPE)
+//%- (BOOL)valueForKey:(KEY_TYPE)key value:(nullable VALUE_TYPE *)value;
+//%PDDM-DEFINE VALUE_FOR_KEY_OBJECT(KEY_TYPE, VALUE_TYPE)
 //%- (VALUE_TYPE)objectForKey:(KEY_TYPE)key;
-//%PDDM-DEFINE VALUE_FOR_KEY_Enum(KEY_TYPE, VALUE_TYPE, VNAME)
-//%VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_TYPE, VNAME)
+//%PDDM-DEFINE VALUE_FOR_KEY_Enum(KEY_TYPE, VALUE_TYPE)
+//%VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_TYPE)
 //%PDDM-DEFINE ARRAY_ARG_MODIFIERPOD()
 // Nothing
 //%PDDM-DEFINE ARRAY_ARG_MODIFIEREnum()
 // Nothing
 //%PDDM-DEFINE ARRAY_ARG_MODIFIEROBJECT()
-//%__nonnull GPB_UNSAFE_UNRETAINED ##
+//%GPB_UNSAFE_UNRETAINED ##
 //%PDDM-DEFINE DICTIONARY_CLASS_DECLPOD(KEY_NAME, VALUE_NAME, VALUE_TYPE)
 //%GPB##KEY_NAME##VALUE_NAME##Dictionary
 //%PDDM-DEFINE DICTIONARY_CLASS_DECLEnum(KEY_NAME, VALUE_NAME, VALUE_TYPE)
 //%GPB##KEY_NAME##VALUE_NAME##Dictionary
 //%PDDM-DEFINE DICTIONARY_CLASS_DECLOBJECT(KEY_NAME, VALUE_NAME, VALUE_TYPE)
 //%GPB##KEY_NAME##VALUE_NAME##Dictionary<__covariant VALUE_TYPE>
-//%PDDM-DEFINE DICTIONARY_COMMON_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME, VNAME_VAR)
+//%PDDM-DEFINE DICTIONARY_COMMON_INTERFACE(KEY_NAME, KEY_TYPE, KisP, KHELPER, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME)
 //%#pragma mark - KEY_NAME -> VALUE_NAME
 //%
-//%/**
-//% * Class used for map fields of <##KEY_TYPE##, ##VALUE_TYPE##>
-//% * values. This performs better than boxing into NSNumbers in NSDictionaries.
-//% *
-//% * @note This class is not meant to be subclassed.
-//% **/
 //%@interface DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) : NSObject <NSCopying>
 //%
-//%/** Number of entries stored in this dictionary. */
 //%@property(nonatomic, readonly) NSUInteger count;
 //%
-//%/**
-//% * @return A newly instanced and empty dictionary.
-//% **/
 //%+ (instancetype)dictionary;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the single entry given.
-//% *
-//% * @param ##VNAME_VAR     The value to be placed in the dictionary.
-//% * @param key ##VNAME_VAR$S## The key under which to store the value.
-//% *
-//% * @return A newly instanced dictionary with the key and value in it.
-//% **/
-//%+ (instancetype)dictionaryWith##VNAME##:(VALUE_TYPE)##VNAME_VAR
+//%+ (instancetype)dictionaryWith##VNAME$u##:(VALUE_TYPE)##VNAME
 //%                       ##VNAME$S## forKey:(KEY_TYPE##KisP$S##KisP)key;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the entries given.
-//% *
-//% * @param ##VNAME_VAR##s      The values to be placed in the dictionary.
-//% * @param keys ##VNAME_VAR$S##  The keys under which to store the values.
-//% * @param count ##VNAME_VAR$S## The number of entries to store in the dictionary.
-//% *
-//% * @return A newly instanced dictionary with the keys and values in it.
-//% **/
-//%+ (instancetype)dictionaryWith##VNAME##s:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[__nullable])##VNAME_VAR##s
-//%                      ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[__nullable])keys
+//%+ (instancetype)dictionaryWith##VNAME$u##s:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[])##VNAME##s
+//%                      ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[])keys
 //%                      ##VNAME$S##    count:(NSUInteger)count;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the entries from the given.
-//% * dictionary.
-//% *
-//% * @param dictionary Dictionary containing the entries to add to the dictionary.
-//% *
-//% * @return A newly instanced dictionary with the entries from the given
-//% *         dictionary in it.
-//% **/
 //%+ (instancetype)dictionaryWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the given capacity.
-//% *
-//% * @param numItems Capacity needed for the dictionary.
-//% *
-//% * @return A newly instanced dictionary with the given capacity.
-//% **/
 //%+ (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
 //%
-//%/**
-//% * Initializes this dictionary, copying the given values and keys.
-//% *
-//% * @param ##VNAME_VAR##s      The values to be placed in this dictionary.
-//% * @param keys ##VNAME_VAR$S##  The keys under which to store the values.
-//% * @param count ##VNAME_VAR$S## The number of elements to copy into the dictionary.
-//% *
-//% * @return A newly initialized dictionary with a copy of the values and keys.
-//% **/
-//%- (instancetype)initWith##VNAME##s:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[__nullable])##VNAME_VAR##s
-//%                ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[__nullable])keys
+//%- (instancetype)initWith##VNAME$u##s:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[])##VNAME##s
+//%                ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[])keys
 //%                ##VNAME$S##    count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-//%
-//%/**
-//% * Initializes this dictionary, copying the entries from the given dictionary.
-//% *
-//% * @param dictionary Dictionary containing the entries to add to this dictionary.
-//% *
-//% * @return A newly initialized dictionary with the entries of the given dictionary.
-//% **/
 //%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary;
-//%
-//%/**
-//% * Initializes this dictionary with the requested capacity.
-//% *
-//% * @param numItems Number of items needed for this dictionary.
-//% *
-//% * @return A newly initialized dictionary with the requested capacity.
-//% **/
 //%- (instancetype)initWithCapacity:(NSUInteger)numItems;
 //%
-//%DICTIONARY_IMMUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME, VNAME_VAR)
+//%DICTIONARY_IMMUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME)
 //%
-//%/**
-//% * Adds the keys and values from another dictionary.
-//% *
-//% * @param otherDictionary Dictionary containing entries to be added to this
-//% *                        dictionary.
-//% **/
 //%- (void)addEntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)otherDictionary;
 //%
-//%DICTIONARY_MUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME, VNAME_VAR)
+//%DICTIONARY_MUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME)
 //%
 //%@end
 //%
@@ -8339,126 +2164,30 @@
 //%PDDM-DEFINE DICTIONARY_KEY_TO_ENUM_INTERFACE2(KEY_NAME, KEY_TYPE, KisP, KHELPER, VALUE_NAME, VALUE_TYPE, VHELPER)
 //%#pragma mark - KEY_NAME -> VALUE_NAME
 //%
-//%/**
-//% * Class used for map fields of <##KEY_TYPE##, ##VALUE_TYPE##>
-//% * values. This performs better than boxing into NSNumbers in NSDictionaries.
-//% *
-//% * @note This class is not meant to be subclassed.
-//% **/
 //%@interface GPB##KEY_NAME##VALUE_NAME##Dictionary : NSObject <NSCopying>
 //%
-//%/** Number of entries stored in this dictionary. */
 //%@property(nonatomic, readonly) NSUInteger count;
-//%/** The validation function to check if the enums are valid. */
 //%@property(nonatomic, readonly) GPBEnumValidationFunc validationFunc;
 //%
-//%/**
-//% * @return A newly instanced and empty dictionary.
-//% **/
 //%+ (instancetype)dictionary;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the given validation function.
-//% *
-//% * @param func The enum validation function for the dictionary.
-//% *
-//% * @return A newly instanced dictionary.
-//% **/
 //%+ (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the single entry given.
-//% *
-//% * @param func     The enum validation function for the dictionary.
-//% * @param rawValue The raw enum value to be placed in the dictionary.
-//% * @param key      The key under which to store the value.
-//% *
-//% * @return A newly instanced dictionary with the key and value in it.
-//% **/
 //%+ (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%                                        rawValue:(VALUE_TYPE)rawValue
 //%                                          forKey:(KEY_TYPE##KisP$S##KisP)key;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the entries given.
-//% *
-//% * @param func   The enum validation function for the dictionary.
-//% * @param values The raw enum values values to be placed in the dictionary.
-//% * @param keys   The keys under which to store the values.
-//% * @param count  The number of entries to store in the dictionary.
-//% *
-//% * @return A newly instanced dictionary with the keys and values in it.
-//% **/
 //%+ (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
-//%                                       rawValues:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[__nullable])values
-//%                                         forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[__nullable])keys
+//%                                       rawValues:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[])values
+//%                                         forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[])keys
 //%                                           count:(NSUInteger)count;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the entries from the given.
-//% * dictionary.
-//% *
-//% * @param dictionary Dictionary containing the entries to add to the dictionary.
-//% *
-//% * @return A newly instanced dictionary with the entries from the given
-//% *         dictionary in it.
-//% **/
 //%+ (instancetype)dictionaryWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary;
-//%
-//%/**
-//% * Creates and initializes a dictionary with the given capacity.
-//% *
-//% * @param func     The enum validation function for the dictionary.
-//% * @param numItems Capacity needed for the dictionary.
-//% *
-//% * @return A newly instanced dictionary with the given capacity.
-//% **/
 //%+ (instancetype)dictionaryWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%                                        capacity:(NSUInteger)numItems;
 //%
-//%/**
-//% * Initializes a dictionary with the given validation function.
-//% *
-//% * @param func The enum validation function for the dictionary.
-//% *
-//% * @return A newly initialized dictionary.
-//% **/
 //%- (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func;
-//%
-//%/**
-//% * Initializes a dictionary with the entries given.
-//% *
-//% * @param func   The enum validation function for the dictionary.
-//% * @param values The raw enum values values to be placed in the dictionary.
-//% * @param keys   The keys under which to store the values.
-//% * @param count  The number of entries to store in the dictionary.
-//% *
-//% * @return A newly initialized dictionary with the keys and values in it.
-//% **/
 //%- (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
-//%                                 rawValues:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[__nullable])values
-//%                                   forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[__nullable])keys
+//%                                 rawValues:(const VALUE_TYPE ARRAY_ARG_MODIFIER##VHELPER()[])values
+//%                                   forKeys:(const KEY_TYPE##KisP$S##KisP ARRAY_ARG_MODIFIER##KHELPER()[])keys
 //%                                     count:(NSUInteger)count NS_DESIGNATED_INITIALIZER;
-//%
-//%/**
-//% * Initializes a dictionary with the entries from the given.
-//% * dictionary.
-//% *
-//% * @param dictionary Dictionary containing the entries to add to the dictionary.
-//% *
-//% * @return A newly initialized dictionary with the entries from the given
-//% *         dictionary in it.
-//% **/
 //%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary;
-//%
-//%/**
-//% * Initializes a dictionary with the given capacity.
-//% *
-//% * @param func     The enum validation function for the dictionary.
-//% * @param numItems Capacity needed for the dictionary.
-//% *
-//% * @return A newly initialized dictionary with the given capacity.
-//% **/
 //%- (instancetype)initWithValidationFunction:(nullable GPBEnumValidationFunc)func
 //%                                  capacity:(NSUInteger)numItems;
 //%
@@ -8466,44 +2195,16 @@
 //%// is not a valid enumerator as defined by validationFunc. If the actual value is
 //%// desired, use "raw" version of the method.
 //%
-//%DICTIONARY_IMMUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, Enum, value)
+//%DICTIONARY_IMMUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, value)
 //%
-//%/**
-//% * Gets the raw enum value for the given key.
-//% *
-//% * @note This method bypass the validationFunc to enable the access of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param rawValue Pointer into which the value will be set, if found.
-//% * @param key      Key under which the value is stored, if present.
-//% *
-//% * @return YES if the key was found and the value was copied, NO otherwise.
-//% **/
-//%- (BOOL)getRawValue:(nullable VALUE_TYPE *)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key;
+//%// These methods bypass the validationFunc to provide access to values that were not
+//%// known at the time the binary was compiled.
 //%
-//%/**
-//% * Enumerates the keys and values on this dictionary with the given block.
-//% *
-//% * @note This method bypass the validationFunc to enable the access of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param block The block to enumerate with.
-//% *   **key**:      The key for the current entry.
-//% *   **rawValue**: The value for the current entry
-//% *   **stop**:     A pointer to a boolean that when set stops the enumeration.
-//% **/
+//%- (BOOL)valueForKey:(KEY_TYPE##KisP$S##KisP)key rawValue:(nullable VALUE_TYPE *)rawValue;
+//%
 //%- (void)enumerateKeysAndRawValuesUsingBlock:
 //%    (void (^)(KEY_TYPE KisP##key, VALUE_TYPE rawValue, BOOL *stop))block;
 //%
-//%/**
-//% * Adds the keys and raw enum values from another dictionary.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param otherDictionary Dictionary containing entries to be added to this
-//% *                        dictionary.
-//% **/
 //%- (void)addRawEntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)otherDictionary;
 //%
 //%// If value is not a valid enumerator as defined by validationFunc, these
@@ -8511,44 +2212,21 @@
 //%// to the default value. Use the rawValue methods below to assign non enumerator
 //%// values.
 //%
-//%DICTIONARY_MUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, Enum, value)
+//%DICTIONARY_MUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, value)
 //%
 //%@end
 //%
 
-//%PDDM-DEFINE DICTIONARY_IMMUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME, VNAME_VAR)
-//%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_TYPE, VNAME)
+//%PDDM-DEFINE DICTIONARY_IMMUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME)
+//%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_TYPE)
 //%
-//%/**
-//% * Enumerates the keys and values on this dictionary with the given block.
-//% *
-//% * @param block The block to enumerate with.
-//% *   **key**: ##VNAME_VAR$S##  The key for the current entry.
-//% *   **VNAME_VAR**:      The value for the current entry
-//% *   **stop**: ##VNAME_VAR$S## A pointer to a boolean that when set stops the enumeration.
-//% **/
-//%- (void)enumerateKeysAnd##VNAME##sUsingBlock:
-//%    (void (^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop))block;
+//%- (void)enumerateKeysAnd##VNAME$u##sUsingBlock:
+//%    (void (^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME, BOOL *stop))block;
 
-//%PDDM-DEFINE DICTIONARY_MUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME, VNAME_VAR)
-//%/**
-//% * Sets the value for the given key.
-//% *
-//% * @param ##VNAME_VAR     The value to set.
-//% * @param key ##VNAME_VAR$S## The key under which to store the value.
-//% **/
-//%- (void)set##VNAME##:(VALUE_TYPE)##VNAME_VAR forKey:(KEY_TYPE##KisP$S##KisP)key;
+//%PDDM-DEFINE DICTIONARY_MUTABLE_INTERFACE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, VHELPER, VNAME)
+//%- (void)set##VNAME$u##:(VALUE_TYPE)##VNAME forKey:(KEY_TYPE##KisP$S##KisP)key;
 //%DICTIONARY_EXTRA_MUTABLE_METHODS_##VHELPER(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE)
-//%/**
-//% * Removes the entry for the given key.
-//% *
-//% * @param aKey Key to be removed from this dictionary.
-//% **/
-//%- (void)remove##VNAME##ForKey:(KEY_TYPE##KisP$S##KisP)aKey;
-//%
-//%/**
-//% * Removes all entries in this dictionary.
-//% **/
+//%- (void)remove##VNAME$u##ForKey:(KEY_TYPE##KisP$S##KisP)aKey;
 //%- (void)removeAll;
 
 //%PDDM-DEFINE DICTIONARY_EXTRA_MUTABLE_METHODS_POD(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE)
@@ -8557,14 +2235,9 @@
 // Empty
 //%PDDM-DEFINE DICTIONARY_EXTRA_MUTABLE_METHODS_Enum(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE)
 //%
-//%/**
-//% * Sets the raw enum value for the given key.
-//% *
-//% * @note This method bypass the validationFunc to enable the setting of values that
-//% *       were not known at the time the binary was compiled.
-//% *
-//% * @param rawValue The raw enum value to set.
-//% * @param key      The key under which to store the raw enum value.
-//% **/
+//%// This method bypass the validationFunc to provide setting of values that were not
+//%// known at the time the binary was compiled.
 //%- (void)setRawValue:(VALUE_TYPE)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key;
 //%
+//%// No validation applies to these methods.
+//%
diff --git a/objectivec/GPBDictionary.m b/objectivec/GPBDictionary.m
index 7713376..3bd146e 100644
--- a/objectivec/GPBDictionary.m
+++ b/objectivec/GPBDictionary.m
@@ -45,12 +45,6 @@
 // directly.
 // ------------------------------------------------------------------
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 // Used to include code only visible to specific versions of the static
 // analyzer. Useful for wrapping code that only exists to silence the analyzer.
 // Determine the values you want to use for BEGIN_APPLE_BUILD_VERSION,
@@ -329,15 +323,13 @@
 
 size_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
   GPBDataType mapValueType = GPBGetFieldDataType(field);
-  size_t result = 0;
-  NSString *key;
-  NSEnumerator *keys = [dict keyEnumerator];
-  while ((key = [keys nextObject])) {
-    id obj = dict[key];
+  __block size_t result = 0;
+  [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = GPBComputeStringSize(kMapKeyFieldNumber, key);
     msgSize += ComputeDictObjectFieldSize(obj, kMapValueFieldNumber, mapValueType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * dict.count;
   return result;
@@ -349,10 +341,8 @@
   NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
   GPBDataType mapValueType = GPBGetFieldDataType(field);
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSString *key;
-  NSEnumerator *keys = [dict keyEnumerator];
-  while ((key = [keys nextObject])) {
-    id obj = dict[key];
+  [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
+    #pragma unused(stop)
     // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
@@ -363,16 +353,14 @@
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     [outputStream writeString:kMapKeyFieldNumber value:key];
     WriteDictObjectField(outputStream, obj, kMapValueFieldNumber, mapValueType);
-  }
+  }];
 }
 
 BOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
   NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
   NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeMessage, @"Unexpected value type");
   #pragma unused(field)  // For when asserts are off in release.
-  GPBMessage *msg;
-  NSEnumerator *objects = [dict objectEnumerator];
-  while ((msg = [objects nextObject])) {
+  for (GPBMessage *msg in [dict objectEnumerator]) {
     if (!msg.initialized) {
       return NO;
     }
@@ -412,7 +400,7 @@
       valueToFill->valueInt32 = GPBCodedInputStreamReadInt32(&stream->state_);
       break;
     case GPBDataTypeInt64:
-      valueToFill->valueInt64 = GPBCodedInputStreamReadInt64(&stream->state_);
+      valueToFill->valueInt64 = GPBCodedInputStreamReadInt32(&stream->state_);
       break;
     case GPBDataTypeSInt32:
       valueToFill->valueInt32 = GPBCodedInputStreamReadSInt32(&stream->state_);
@@ -496,8 +484,6 @@
       key.valueString = [@"" retain];
     }
     if (GPBDataTypeIsObject(valueDataType) && value.valueString == nil) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wswitch-enum"
       switch (valueDataType) {
         case GPBDataTypeString:
           value.valueString = [@"" retain];
@@ -519,7 +505,6 @@
           // Nothing
           break;
       }
-#pragma clang diagnostic pop
     }
 
     if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
@@ -583,12 +568,12 @@
 //%DICTIONARY_KEY_TO_ENUM_IMPL(KEY_NAME, KEY_TYPE, KisP, Enum, int32_t, KHELPER)
 
 //%PDDM-DEFINE DICTIONARY_KEY_TO_POD_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
-//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD, VALUE_NAME, value)
+//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, POD, value)
 
 //%PDDM-DEFINE DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, VALUE_NAME, VALUE_TYPE)
-//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, , VALUE_NAME, VALUE_TYPE, POD, OBJECT, Object, object)
+//%DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, , VALUE_NAME, VALUE_TYPE, POD, OBJECT, object)
 
-//%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR)
+//%PDDM-DEFINE DICTIONARY_COMMON_IMPL(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME)
 //%#pragma mark - KEY_NAME -> VALUE_NAME
 //%
 //%@implementation GPB##KEY_NAME##VALUE_NAME##Dictionary {
@@ -597,24 +582,24 @@
 //%}
 //%
 //%+ (instancetype)dictionary {
-//%  return [[[self alloc] initWith##VNAME##s:NULL forKeys:NULL count:0] autorelease];
+//%  return [[[self alloc] initWith##VNAME$u##s:NULL forKeys:NULL count:0] autorelease];
 //%}
 //%
-//%+ (instancetype)dictionaryWith##VNAME##:(VALUE_TYPE)##VNAME_VAR
+//%+ (instancetype)dictionaryWith##VNAME$u##:(VALUE_TYPE)##VNAME
 //%                      ##VNAME$S##  forKey:(KEY_TYPE##KisP$S##KisP)key {
-//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME##s:forKeys:count:
+//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME$u##s:forKeys:count:
 //%  // on to get the type correct.
-//%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME##s:&##VNAME_VAR
+//%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME$u##s:&##VNAME
 //%               KEY_NAME$S VALUE_NAME$S                        ##VNAME$S##  forKeys:&key
 //%               KEY_NAME$S VALUE_NAME$S                        ##VNAME$S##    count:1] autorelease];
 //%}
 //%
-//%+ (instancetype)dictionaryWith##VNAME##s:(const VALUE_TYPE [])##VNAME_VAR##s
+//%+ (instancetype)dictionaryWith##VNAME$u##s:(const VALUE_TYPE [])##VNAME##s
 //%                      ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
 //%                      ##VNAME$S##    count:(NSUInteger)count {
-//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME##s:forKeys:count:
+//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME$u##s:forKeys:count:
 //%  // on to get the type correct.
-//%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME##s:##VNAME_VAR##s
+//%  return [[(GPB##KEY_NAME##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME$u##s:##VNAME##s
 //%               KEY_NAME$S VALUE_NAME$S                               forKeys:keys
 //%               KEY_NAME$S VALUE_NAME$S                                 count:count] autorelease];
 //%}
@@ -630,18 +615,18 @@
 //%}
 //%
 //%- (instancetype)init {
-//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
+//%  return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
 //%}
 //%
-//%- (instancetype)initWith##VNAME##s:(const VALUE_TYPE [])##VNAME_VAR##s
+//%- (instancetype)initWith##VNAME$u##s:(const VALUE_TYPE [])##VNAME##s
 //%                ##VNAME$S##  forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
 //%                ##VNAME$S##    count:(NSUInteger)count {
 //%  self = [super init];
 //%  if (self) {
 //%    _dictionary = [[NSMutableDictionary alloc] init];
-//%    if (count && VNAME_VAR##s && keys) {
+//%    if (count && VNAME##s && keys) {
 //%      for (NSUInteger i = 0; i < count; ++i) {
-//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME_VAR##s[i], ______)##DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______)        [_dictionary setObject:WRAPPED##VHELPER(VNAME_VAR##s[i]) forKey:WRAPPED##KHELPER(keys[i])];
+//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME##s[i], ______)##DICTIONARY_VALIDATE_KEY_##KHELPER(keys[i], ______)        [_dictionary setObject:WRAPPED##VHELPER(VNAME##s[i]) forKey:WRAPPED##KHELPER(keys[i])];
 //%      }
 //%    }
 //%  }
@@ -649,7 +634,7 @@
 //%}
 //%
 //%- (instancetype)initWithDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)dictionary {
-//%  self = [self initWith##VNAME##s:NULL forKeys:NULL count:0];
+//%  self = [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
 //%  if (self) {
 //%    if (dictionary) {
 //%      [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -660,14 +645,14 @@
 //%
 //%- (instancetype)initWithCapacity:(NSUInteger)numItems {
 //%  #pragma unused(numItems)
-//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
+//%  return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
 //%}
 //%
-//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, )
+//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, )
 //%
 //%VALUE_FOR_KEY_##VHELPER(KEY_TYPE##KisP$S##KisP, VALUE_NAME, VALUE_TYPE, KHELPER)
 //%
-//%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, )
+//%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, )
 //%
 //%@end
 //%
@@ -777,9 +762,9 @@
 //%  return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
 //%}
 //%
-//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, value, Raw)
+//%DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, value, Raw)
 //%
-//%- (BOOL)getEnum:(VALUE_TYPE *)value forKey:(KEY_TYPE##KisP$S##KisP)key {
+//%- (BOOL)valueForKey:(KEY_TYPE##KisP$S##KisP)key value:(VALUE_TYPE *)value {
 //%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
 //%  if (wrapped && value) {
 //%    VALUE_TYPE result = UNWRAP##VALUE_NAME(wrapped);
@@ -791,7 +776,7 @@
 //%  return (wrapped != NULL);
 //%}
 //%
-//%- (BOOL)getRawValue:(VALUE_TYPE *)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key {
+//%- (BOOL)valueForKey:(KEY_TYPE##KisP$S##KisP)key rawValue:(VALUE_TYPE *)rawValue {
 //%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
 //%  if (wrapped && rawValue) {
 //%    *rawValue = UNWRAP##VALUE_NAME(wrapped);
@@ -799,28 +784,23 @@
 //%  return (wrapped != NULL);
 //%}
 //%
-//%- (void)enumerateKeysAndEnumsUsingBlock:
+//%- (void)enumerateKeysAndValuesUsingBlock:
 //%    (void (^)(KEY_TYPE KisP##key, VALUE_TYPE value, BOOL *stop))block {
 //%  GPBEnumValidationFunc func = _validationFunc;
-//%  BOOL stop = NO;
-//%  NSEnumerator *keys = [_dictionary keyEnumerator];
-//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
-//%  while ((aKey = [keys nextObject])) {
-//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##aValue = _dictionary[aKey];
+//%  [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYPE)##aKey,
+//%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##aValue,
+//%                                                   BOOL *stop) {
 //%      VALUE_TYPE unwrapped = UNWRAP##VALUE_NAME(aValue);
 //%      if (!func(unwrapped)) {
 //%        unwrapped = kGPBUnrecognizedEnumeratorValue;
 //%      }
-//%    block(UNWRAP##KEY_NAME(aKey), unwrapped, &stop);
-//%    if (stop) {
-//%      break;
-//%    }
-//%  }
+//%      block(UNWRAP##KEY_NAME(aKey), unwrapped, stop);
+//%  }];
 //%}
 //%
-//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, Value, Enum, value, Raw)
+//%DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, value, Raw)
 //%
-//%- (void)setEnum:(VALUE_TYPE)value forKey:(KEY_TYPE##KisP$S##KisP)key {
+//%- (void)setValue:(VALUE_TYPE)value forKey:(KEY_TYPE##KisP$S##KisP)key {
 //%DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  if (!_validationFunc(value)) {
 //%    [NSException raise:NSInvalidArgumentException
 //%                format:@"GPB##KEY_NAME##VALUE_NAME##Dictionary: Attempt to set an unknown enum value (%d)",
@@ -836,7 +816,7 @@
 //%@end
 //%
 
-//%PDDM-DEFINE DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ACCESSOR_NAME)
+//%PDDM-DEFINE DICTIONARY_IMMUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, ACCESSOR_NAME)
 //%- (void)dealloc {
 //%  NSAssert(!_autocreator,
 //%           @"%@: Autocreator must be cleared before release, autocreator: %@",
@@ -849,15 +829,14 @@
 //%  return [[GPB##KEY_NAME##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self];
 //%}
 //%
-//%- (BOOL)isEqual:(id)other {
+//%- (BOOL)isEqual:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)other {
 //%  if (self == other) {
 //%    return YES;
 //%  }
 //%  if (![other isKindOfClass:[GPB##KEY_NAME##VALUE_NAME##Dictionary class]]) {
 //%    return NO;
 //%  }
-//%  GPB##KEY_NAME##VALUE_NAME##Dictionary *otherDictionary = other;
-//%  return [_dictionary isEqual:otherDictionary->_dictionary];
+//%  return [_dictionary isEqual:other->_dictionary];
 //%}
 //%
 //%- (NSUInteger)hash {
@@ -872,39 +851,32 @@
 //%  return _dictionary.count;
 //%}
 //%
-//%- (void)enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:
-//%    (void (^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop))block {
-//%  BOOL stop = NO;
-//%  NSDictionary *internal = _dictionary;
-//%  NSEnumerator *keys = [internal keyEnumerator];
-//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
-//%  while ((aKey = [keys nextObject])) {
-//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
-//%    block(UNWRAP##KEY_NAME(aKey), UNWRAP##VALUE_NAME(a##VNAME_VAR$u), &stop);
-//%    if (stop) {
-//%      break;
-//%    }
-//%  }
+//%- (void)enumerateKeysAnd##ACCESSOR_NAME##VNAME$u##sUsingBlock:
+//%    (void (^)(KEY_TYPE KisP##key, VALUE_TYPE VNAME, BOOL *stop))block {
+//%  [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYPE)##aKey,
+//%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME$u,
+//%                                                   BOOL *stop) {
+//%      block(UNWRAP##KEY_NAME(aKey), UNWRAP##VALUE_NAME(a##VNAME$u), stop);
+//%  }];
 //%}
 //%
 //%EXTRA_METHODS_##VHELPER(KEY_NAME, VALUE_NAME)- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-//%  NSDictionary *internal = _dictionary;
-//%  NSUInteger count = internal.count;
+//%  NSUInteger count = _dictionary.count;
 //%  if (count == 0) {
 //%    return 0;
 //%  }
 //%
 //%  GPBDataType valueDataType = GPBGetFieldDataType(field);
 //%  GPBDataType keyDataType = field.mapKeyDataType;
-//%  size_t result = 0;
-//%  NSEnumerator *keys = [internal keyEnumerator];
-//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
-//%  while ((aKey = [keys nextObject])) {
-//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
+//%  __block size_t result = 0;
+//%  [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYPE)##aKey,
+//%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME$u##,
+//%                                                   BOOL *stop) {
+//%    #pragma unused(stop)
 //%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
-//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME_VAR$u), kMapValueFieldNumber, valueDataType);
+//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME$u), kMapValueFieldNumber, valueDataType);
 //%    result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-//%  }
+//%  }];
 //%  size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
 //%  result += tagSize * count;
 //%  return result;
@@ -915,22 +887,20 @@
 //%  GPBDataType valueDataType = GPBGetFieldDataType(field);
 //%  GPBDataType keyDataType = field.mapKeyDataType;
 //%  uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-//%  NSDictionary *internal = _dictionary;
-//%  NSEnumerator *keys = [internal keyEnumerator];
-//%  ENUM_TYPE##KHELPER(KEY_TYPE)##aKey;
-//%  while ((aKey = [keys nextObject])) {
-//%    ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME_VAR$u = internal[aKey];
+//%  [_dictionary enumerateKeysAndObjectsUsingBlock:^(ENUM_TYPE##KHELPER(KEY_TYPE)##aKey,
+//%                                                   ENUM_TYPE##VHELPER(VALUE_TYPE)##a##VNAME$u,
+//%                                                   BOOL *stop) {
+//%    #pragma unused(stop)
+//%    // Write the tag.
 //%    [outputStream writeInt32NoTag:tag];
 //%    // Write the size of the message.
-//%    KEY_TYPE KisP##unwrappedKey = UNWRAP##KEY_NAME(aKey);
-//%    VALUE_TYPE unwrappedValue = UNWRAP##VALUE_NAME(a##VNAME_VAR$u);
-//%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+//%    size_t msgSize = ComputeDict##KEY_NAME##FieldSize(UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
+//%    msgSize += ComputeDict##VALUE_NAME##FieldSize(UNWRAP##VALUE_NAME(a##VNAME$u), kMapValueFieldNumber, valueDataType);
 //%    [outputStream writeInt32NoTag:(int32_t)msgSize];
 //%    // Write the fields.
-//%    WriteDict##KEY_NAME##Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-//%    WriteDict##VALUE_NAME##Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-//%  }
+//%    WriteDict##KEY_NAME##Field(outputStream, UNWRAP##KEY_NAME(aKey), kMapKeyFieldNumber, keyDataType);
+//%    WriteDict##VALUE_NAME##Field(outputStream, UNWRAP##VALUE_NAME(a##VNAME$u), kMapValueFieldNumber, valueDataType);
+//%  }];
 //%}
 //%
 //%SERIAL_DATA_FOR_ENTRY_##VHELPER(KEY_NAME, VALUE_NAME)- (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -939,14 +909,12 @@
 //%}
 //%
 //%- (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-//%  [self enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop) {
+//%  [self enumerateKeysAnd##ACCESSOR_NAME##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME, BOOL *stop) {
 //%      #pragma unused(stop)
-//%      block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME_VAR));
+//%      block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME));
 //%  }];
 //%}
-//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_VAR, ACCESSOR_NAME)
-//%DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME, VNAME_VAR, ACCESSOR_NAME)
-//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE2(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, VNAME_REMOVE, VNAME_VAR, ACCESSOR_NAME)
+//%PDDM-DEFINE DICTIONARY_MUTABLE_CORE(KEY_NAME, KEY_TYPE, KisP, VALUE_NAME, VALUE_TYPE, KHELPER, VHELPER, VNAME, ACCESSOR_NAME)
 //%- (void)add##ACCESSOR_NAME##EntriesFromDictionary:(GPB##KEY_NAME##VALUE_NAME##Dictionary *)otherDictionary {
 //%  if (otherDictionary) {
 //%    [_dictionary addEntriesFromDictionary:otherDictionary->_dictionary];
@@ -956,14 +924,14 @@
 //%  }
 //%}
 //%
-//%- (void)set##ACCESSOR_NAME##VNAME##:(VALUE_TYPE)VNAME_VAR forKey:(KEY_TYPE##KisP$S##KisP)key {
-//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME_VAR, )##DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  [_dictionary setObject:WRAPPED##VHELPER(VNAME_VAR) forKey:WRAPPED##KHELPER(key)];
+//%- (void)set##ACCESSOR_NAME##VNAME$u##:(VALUE_TYPE)VNAME forKey:(KEY_TYPE##KisP$S##KisP)key {
+//%DICTIONARY_VALIDATE_VALUE_##VHELPER(VNAME, )##DICTIONARY_VALIDATE_KEY_##KHELPER(key, )  [_dictionary setObject:WRAPPED##VHELPER(VNAME) forKey:WRAPPED##KHELPER(key)];
 //%  if (_autocreator) {
 //%    GPBAutocreatedDictionaryModified(_autocreator, self);
 //%  }
 //%}
 //%
-//%- (void)remove##VNAME_REMOVE##ForKey:(KEY_TYPE##KisP$S##KisP)aKey {
+//%- (void)remove##VNAME$u##ForKey:(KEY_TYPE##KisP$S##KisP)aKey {
 //%  [_dictionary removeObjectForKey:WRAPPED##KHELPER(aKey)];
 //%}
 //%
@@ -976,11 +944,11 @@
 //
 
 //%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_POD_IMPL(VALUE_NAME, VALUE_TYPE)
-//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, POD, VALUE_NAME, value)
+//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, POD, value)
 //%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(VALUE_NAME, VALUE_TYPE)
-//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, OBJECT, Object, object)
+//%DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, OBJECT, object)
 
-//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, HELPER, VNAME, VNAME_VAR)
+//%PDDM-DEFINE DICTIONARY_BOOL_KEY_TO_VALUE_IMPL(VALUE_NAME, VALUE_TYPE, HELPER, VNAME)
 //%#pragma mark - Bool -> VALUE_NAME
 //%
 //%@implementation GPBBool##VALUE_NAME##Dictionary {
@@ -989,24 +957,24 @@
 //%BOOL_DICT_HAS_STORAGE_##HELPER()}
 //%
 //%+ (instancetype)dictionary {
-//%  return [[[self alloc] initWith##VNAME##s:NULL forKeys:NULL count:0] autorelease];
+//%  return [[[self alloc] initWith##VNAME$u##s:NULL forKeys:NULL count:0] autorelease];
 //%}
 //%
-//%+ (instancetype)dictionaryWith##VNAME##:(VALUE_TYPE)VNAME_VAR
+//%+ (instancetype)dictionaryWith##VNAME$u##:(VALUE_TYPE)VNAME
 //%                      ##VNAME$S##  forKey:(BOOL)key {
-//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME##s:forKeys:count:
+//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME$u##s:forKeys:count:
 //%  // on to get the type correct.
-//%  return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME##s:&##VNAME_VAR
+//%  return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME$u##s:&##VNAME
 //%                    VALUE_NAME$S                        ##VNAME$S##  forKeys:&key
 //%                    VALUE_NAME$S                        ##VNAME$S##    count:1] autorelease];
 //%}
 //%
-//%+ (instancetype)dictionaryWith##VNAME##s:(const VALUE_TYPE [])##VNAME_VAR##s
+//%+ (instancetype)dictionaryWith##VNAME$u##s:(const VALUE_TYPE [])##VNAME##s
 //%                      ##VNAME$S##  forKeys:(const BOOL [])keys
 //%                      ##VNAME$S##    count:(NSUInteger)count {
-//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME##s:forKeys:count:
+//%  // Cast is needed so the compiler knows what class we are invoking initWith##VNAME$u##s:forKeys:count:
 //%  // on to get the type correct.
-//%  return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME##s:##VNAME_VAR##s
+//%  return [[(GPBBool##VALUE_NAME##Dictionary*)[self alloc] initWith##VNAME$u##s:##VNAME##s
 //%                    VALUE_NAME$S                        ##VNAME$S##  forKeys:keys
 //%                    VALUE_NAME$S                        ##VNAME$S##    count:count] autorelease];
 //%}
@@ -1022,14 +990,14 @@
 //%}
 //%
 //%- (instancetype)init {
-//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
+//%  return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
 //%}
 //%
 //%BOOL_DICT_INITS_##HELPER(VALUE_NAME, VALUE_TYPE)
 //%
 //%- (instancetype)initWithCapacity:(NSUInteger)numItems {
 //%  #pragma unused(numItems)
-//%  return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
+//%  return [self initWith##VNAME$u##s:NULL forKeys:NULL count:0];
 //%}
 //%
 //%BOOL_DICT_DEALLOC##HELPER()
@@ -1038,20 +1006,19 @@
 //%  return [[GPBBool##VALUE_NAME##Dictionary allocWithZone:zone] initWithDictionary:self];
 //%}
 //%
-//%- (BOOL)isEqual:(id)other {
+//%- (BOOL)isEqual:(GPBBool##VALUE_NAME##Dictionary *)other {
 //%  if (self == other) {
 //%    return YES;
 //%  }
 //%  if (![other isKindOfClass:[GPBBool##VALUE_NAME##Dictionary class]]) {
 //%    return NO;
 //%  }
-//%  GPBBool##VALUE_NAME##Dictionary *otherDictionary = other;
-//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) != BOOL_DICT_W_HAS##HELPER(0, otherDictionary->)) ||
-//%      (BOOL_DICT_W_HAS##HELPER(1, ) != BOOL_DICT_W_HAS##HELPER(1, otherDictionary->))) {
+//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) != BOOL_DICT_W_HAS##HELPER(0, other->)) ||
+//%      (BOOL_DICT_W_HAS##HELPER(1, ) != BOOL_DICT_W_HAS##HELPER(1, other->))) {
 //%    return NO;
 //%  }
-//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) && (NEQ_##HELPER(_values[0], otherDictionary->_values[0]))) ||
-//%      (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], otherDictionary->_values[1])))) {
+//%  if ((BOOL_DICT_W_HAS##HELPER(0, ) && (NEQ_##HELPER(_values[0], other->_values[0]))) ||
+//%      (BOOL_DICT_W_HAS##HELPER(1, ) && (NEQ_##HELPER(_values[1], other->_values[1])))) {
 //%    return NO;
 //%  }
 //%  return YES;
@@ -1077,7 +1044,7 @@
 //%  return (BOOL_DICT_W_HAS##HELPER(0, ) ? 1 : 0) + (BOOL_DICT_W_HAS##HELPER(1, ) ? 1 : 0);
 //%}
 //%
-//%BOOL_VALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE)
+//%BOOL_VALUE_FOR_KEY_##HELPER(VALUE_TYPE)
 //%
 //%BOOL_SET_GPBVALUE_FOR_KEY_##HELPER(VALUE_NAME, VALUE_TYPE, VisP)
 //%
@@ -1090,8 +1057,8 @@
 //%  }
 //%}
 //%
-//%- (void)enumerateKeysAnd##VNAME##sUsingBlock:
-//%    (void (^)(BOOL key, VALUE_TYPE VNAME_VAR, BOOL *stop))block {
+//%- (void)enumerateKeysAnd##VNAME$u##sUsingBlock:
+//%    (void (^)(BOOL key, VALUE_TYPE VNAME, BOOL *stop))block {
 //%  BOOL stop = NO;
 //%  if (BOOL_DICT_HAS##HELPER(0, )) {
 //%    block(NO, _values[0], &stop);
@@ -1148,7 +1115,7 @@
 //
 
 //%PDDM-DEFINE VALUE_FOR_KEY_POD(KEY_TYPE, VALUE_NAME, VALUE_TYPE, KHELPER)
-//%- (BOOL)get##VALUE_NAME##:(nullable VALUE_TYPE *)value forKey:(KEY_TYPE)key {
+//%- (BOOL)valueForKey:(KEY_TYPE)key value:(VALUE_TYPE *)value {
 //%  NSNumber *wrapped = [_dictionary objectForKey:WRAPPED##KHELPER(key)];
 //%  if (wrapped && value) {
 //%    *value = UNWRAP##VALUE_NAME(wrapped);
@@ -1238,9 +1205,9 @@
 //%  BOOL _valueSet[2];
 //%
 //%PDDM-DEFINE BOOL_DICT_INITS_POD(VALUE_NAME, VALUE_TYPE)
-//%- (instancetype)initWith##VALUE_NAME##s:(const VALUE_TYPE [])values
-//%                 ##VALUE_NAME$S## forKeys:(const BOOL [])keys
-//%                 ##VALUE_NAME$S##   count:(NSUInteger)count {
+//%- (instancetype)initWithValues:(const VALUE_TYPE [])values
+//%                       forKeys:(const BOOL [])keys
+//%                         count:(NSUInteger)count {
 //%  self = [super init];
 //%  if (self) {
 //%    for (NSUInteger i = 0; i < count; ++i) {
@@ -1253,7 +1220,7 @@
 //%}
 //%
 //%- (instancetype)initWithDictionary:(GPBBool##VALUE_NAME##Dictionary *)dictionary {
-//%  self = [self initWith##VALUE_NAME##s:NULL forKeys:NULL count:0];
+//%  self = [self initWithValues:NULL forKeys:NULL count:0];
 //%  if (self) {
 //%    if (dictionary) {
 //%      for (int i = 0; i < 2; ++i) {
@@ -1279,8 +1246,8 @@
 //%BOOL_DICT_HASPOD(IDX, REF)
 //%PDDM-DEFINE BOOL_DICT_HASPOD(IDX, REF)
 //%REF##_valueSet[IDX]
-//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_POD(VALUE_NAME, VALUE_TYPE)
-//%- (BOOL)get##VALUE_NAME##:(VALUE_TYPE *)value forKey:(BOOL)key {
+//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_POD(VALUE_TYPE)
+//%- (BOOL)valueForKey:(BOOL)key value:(VALUE_TYPE *)value {
 //%  int idx = (key ? 1 : 0);
 //%  if (_valueSet[idx]) {
 //%    if (value) {
@@ -1312,7 +1279,7 @@
 //%  }
 //%}
 //%
-//%- (void)set##VALUE_NAME:(VALUE_TYPE)value forKey:(BOOL)key {
+//%- (void)setValue:(VALUE_TYPE)value forKey:(BOOL)key {
 //%  int idx = (key ? 1 : 0);
 //%  _values[idx] = value;
 //%  _valueSet[idx] = YES;
@@ -1321,7 +1288,7 @@
 //%  }
 //%}
 //%
-//%- (void)remove##VALUE_NAME##ForKey:(BOOL)aKey {
+//%- (void)removeValueForKey:(BOOL)aKey {
 //%  _valueSet[aKey ? 1 : 0] = NO;
 //%}
 //%
@@ -1386,15 +1353,14 @@
 //%- (instancetype)deepCopyWithZone:(NSZone *)zone {
 //%  GPB##KEY_NAME##VALUE_NAME##Dictionary *newDict =
 //%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
-//%  NSEnumerator *keys = [_dictionary keyEnumerator];
-//%  id aKey;
-//%  NSMutableDictionary *internalDict = newDict->_dictionary;
-//%  while ((aKey = [keys nextObject])) {
-//%    GPBMessage *msg = _dictionary[aKey];
+//%  [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
+//%                                                   GPBMessage *msg,
+//%                                                   BOOL *stop) {
+//%    #pragma unused(stop)
 //%    GPBMessage *copiedMsg = [msg copyWithZone:zone];
-//%    [internalDict setObject:copiedMsg forKey:aKey];
+//%    [newDict->_dictionary setObject:copiedMsg forKey:aKey];
 //%    [copiedMsg release];
-//%  }
+//%  }];
 //%  return newDict;
 //%}
 //%
@@ -1483,7 +1449,7 @@
 //%(BOOL_DICT_HASOBJECT(IDX, REF))
 //%PDDM-DEFINE BOOL_DICT_HASOBJECT(IDX, REF)
 //%REF##_values[IDX] != nil
-//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_OBJECT(VALUE_NAME, VALUE_TYPE)
+//%PDDM-DEFINE BOOL_VALUE_FOR_KEY_OBJECT(VALUE_TYPE)
 //%- (VALUE_TYPE)objectForKey:(BOOL)key {
 //%  return _values[key ? 1 : 0];
 //%}
@@ -1550,24 +1516,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(uint32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithUInt32s:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [])values
-                              forKeys:(const uint32_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithUInt32s:values
+  return [[(GPBUInt32UInt32Dictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -1583,12 +1549,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt32s:(const uint32_t [])values
-                        forKeys:(const uint32_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -1602,7 +1568,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32UInt32Dictionary *)dictionary {
-  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -1613,7 +1579,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -1628,15 +1594,14 @@
   return [[GPBUInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32UInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32UInt32Dictionary class]]) {
     return NO;
   }
-  GPBUInt32UInt32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -1651,39 +1616,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, uint32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue unsignedIntValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue unsignedIntValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -1694,22 +1652,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    uint32_t unwrappedValue = [aValue unsignedIntValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -1718,13 +1674,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt32sUsingBlock:^(uint32_t key, uint32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, uint32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%u", value]);
   }];
 }
 
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(uint32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedIntValue];
@@ -1741,14 +1697,14 @@
   }
 }
 
-- (void)setUInt32:(uint32_t)value forKey:(uint32_t)key {
+- (void)setValue:(uint32_t)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt32ForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -1766,24 +1722,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithInt32s:&value
+  return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32s:(const int32_t [])values
++ (instancetype)dictionaryWithValues:(const int32_t [])values
                              forKeys:(const uint32_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithInt32s:values
+  return [[(GPBUInt32Int32Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -1799,10 +1755,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt32s:(const int32_t [])values
+- (instancetype)initWithValues:(const int32_t [])values
                        forKeys:(const uint32_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -1818,7 +1774,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32Int32Dictionary *)dictionary {
-  self = [self initWithInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -1829,7 +1785,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -1844,15 +1800,14 @@
   return [[GPBUInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32Int32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32Int32Dictionary class]]) {
     return NO;
   }
-  GPBUInt32Int32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -1867,39 +1822,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -1910,22 +1858,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -1934,13 +1880,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt32sUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%d", value]);
   }];
 }
 
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped intValue];
@@ -1957,14 +1903,14 @@
   }
 }
 
-- (void)setInt32:(int32_t)value forKey:(uint32_t)key {
+- (void)setValue:(int32_t)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt32ForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -1982,24 +1928,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(uint32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithUInt64s:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [])values
-                              forKeys:(const uint32_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithUInt64s:values
+  return [[(GPBUInt32UInt64Dictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -2015,12 +1961,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt64s:(const uint64_t [])values
-                        forKeys:(const uint32_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -2034,7 +1980,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32UInt64Dictionary *)dictionary {
-  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -2045,7 +1991,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -2060,15 +2006,14 @@
   return [[GPBUInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32UInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32UInt64Dictionary class]]) {
     return NO;
   }
-  GPBUInt32UInt64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -2083,39 +2028,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, uint64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue unsignedLongLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue unsignedLongLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -2126,22 +2064,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -2150,13 +2086,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt64sUsingBlock:^(uint32_t key, uint64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, uint64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%llu", value]);
   }];
 }
 
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(uint64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedLongLongValue];
@@ -2173,14 +2109,14 @@
   }
 }
 
-- (void)setUInt64:(uint64_t)value forKey:(uint32_t)key {
+- (void)setValue:(uint64_t)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt64ForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -2198,24 +2134,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithInt64s:&value
+  return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64s:(const int64_t [])values
++ (instancetype)dictionaryWithValues:(const int64_t [])values
                              forKeys:(const uint32_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithInt64s:values
+  return [[(GPBUInt32Int64Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -2231,10 +2167,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt64s:(const int64_t [])values
+- (instancetype)initWithValues:(const int64_t [])values
                        forKeys:(const uint32_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -2250,7 +2186,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32Int64Dictionary *)dictionary {
-  self = [self initWithInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -2261,7 +2197,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -2276,15 +2212,14 @@
   return [[GPBUInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32Int64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32Int64Dictionary class]]) {
     return NO;
   }
-  GPBUInt32Int64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -2299,39 +2234,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, int64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue longLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue longLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -2342,22 +2270,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    int64_t unwrappedValue = [aValue longLongValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -2366,13 +2292,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt64sUsingBlock:^(uint32_t key, int64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, int64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%lld", value]);
   }];
 }
 
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(int64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped longLongValue];
@@ -2389,14 +2315,14 @@
   }
 }
 
-- (void)setInt64:(int64_t)value forKey:(uint32_t)key {
+- (void)setValue:(int64_t)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt64ForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -2414,24 +2340,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithBools:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(uint32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32BoolDictionary*)[self alloc] initWithBools:&value
-                                                        forKeys:&key
-                                                          count:1] autorelease];
+  return [[(GPBUInt32BoolDictionary*)[self alloc] initWithValues:&value
+                                                         forKeys:&key
+                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithBools:(const BOOL [])values
-                            forKeys:(const uint32_t [])keys
-                              count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32BoolDictionary*)[self alloc] initWithBools:values
+  return [[(GPBUInt32BoolDictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -2447,12 +2373,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithBools:(const BOOL [])values
-                      forKeys:(const uint32_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -2466,7 +2392,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32BoolDictionary *)dictionary {
-  self = [self initWithBools:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -2477,7 +2403,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -2492,15 +2418,14 @@
   return [[GPBUInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32BoolDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32BoolDictionary class]]) {
     return NO;
   }
-  GPBUInt32BoolDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -2515,39 +2440,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, BOOL value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue boolValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue boolValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -2558,22 +2476,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    BOOL unwrappedValue = [aValue boolValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -2582,13 +2498,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndBoolsUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], (value ? @"true" : @"false"));
   }];
 }
 
-- (BOOL)getBool:(nullable BOOL *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(BOOL *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped boolValue];
@@ -2605,14 +2521,14 @@
   }
 }
 
-- (void)setBool:(BOOL)value forKey:(uint32_t)key {
+- (void)setValue:(BOOL)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeBoolForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -2630,24 +2546,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithFloats:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32FloatDictionary*)[self alloc] initWithFloats:&value
+  return [[(GPBUInt32FloatDictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloats:(const float [])values
++ (instancetype)dictionaryWithValues:(const float [])values
                              forKeys:(const uint32_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32FloatDictionary*)[self alloc] initWithFloats:values
+  return [[(GPBUInt32FloatDictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -2663,10 +2579,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithFloats:(const float [])values
+- (instancetype)initWithValues:(const float [])values
                        forKeys:(const uint32_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -2682,7 +2598,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32FloatDictionary *)dictionary {
-  self = [self initWithFloats:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -2693,7 +2609,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -2708,15 +2624,14 @@
   return [[GPBUInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32FloatDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32FloatDictionary class]]) {
     return NO;
   }
-  GPBUInt32FloatDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -2731,39 +2646,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, float value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue floatValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue floatValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -2774,22 +2682,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    float unwrappedValue = [aValue floatValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -2798,13 +2704,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndFloatsUsingBlock:^(uint32_t key, float value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, float value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
   }];
 }
 
-- (BOOL)getFloat:(nullable float *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(float *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped floatValue];
@@ -2821,14 +2727,14 @@
   }
 }
 
-- (void)setFloat:(float)value forKey:(uint32_t)key {
+- (void)setValue:(float)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeFloatForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -2846,24 +2752,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithDoubles:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(uint32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(uint32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithDoubles:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithDoubles:(const double [])values
-                              forKeys:(const uint32_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const uint32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithDoubles:values
+  return [[(GPBUInt32DoubleDictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -2879,12 +2785,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithDoubles:(const double [])values
-                        forKeys:(const uint32_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -2898,7 +2804,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt32DoubleDictionary *)dictionary {
-  self = [self initWithDoubles:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -2909,7 +2815,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -2924,15 +2830,14 @@
   return [[GPBUInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32DoubleDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32DoubleDictionary class]]) {
     return NO;
   }
-  GPBUInt32DoubleDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -2947,39 +2852,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, double value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue doubleValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue doubleValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -2990,22 +2888,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    double unwrappedValue = [aValue doubleValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -3014,13 +2910,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndDoublesUsingBlock:^(uint32_t key, double value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint32_t key, double value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
   }];
 }
 
-- (BOOL)getDouble:(nullable double *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(double *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped doubleValue];
@@ -3037,14 +2933,14 @@
   }
 }
 
-- (void)setDouble:(double)value forKey:(uint32_t)key {
+- (void)setValue:(double)value forKey:(uint32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeDoubleForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -3168,15 +3064,14 @@
   return [[GPBUInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32EnumDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32EnumDictionary class]]) {
     return NO;
   }
-  GPBUInt32EnumDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -3193,37 +3088,30 @@
 
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(uint32_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedIntValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -3234,22 +3122,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (NSData *)serializedDataForUnknownValue:(int32_t)value
@@ -3276,7 +3162,7 @@
   }];
 }
 
-- (BOOL)getEnum:(int32_t *)value forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     int32_t result = [wrapped intValue];
@@ -3288,7 +3174,7 @@
   return (wrapped != NULL);
 }
 
-- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint32_t)key {
+- (BOOL)valueForKey:(uint32_t)key rawValue:(int32_t *)rawValue {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && rawValue) {
     *rawValue = [wrapped intValue];
@@ -3296,23 +3182,18 @@
   return (wrapped != NULL);
 }
 
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint32_t key, int32_t value, BOOL *stop))block {
   GPBEnumValidationFunc func = _validationFunc;
-  BOOL stop = NO;
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
       int32_t unwrapped = [aValue intValue];
       if (!func(unwrapped)) {
         unwrapped = kGPBUnrecognizedEnumeratorValue;
       }
-    block([aKey unsignedIntValue], unwrapped, &stop);
-    if (stop) {
-      break;
-    }
-  }
+      block([aKey unsignedIntValue], unwrapped, stop);
+  }];
 }
 
 - (void)addRawEntriesFromDictionary:(GPBUInt32EnumDictionary *)otherDictionary {
@@ -3331,7 +3212,7 @@
   }
 }
 
-- (void)removeEnumForKey:(uint32_t)aKey {
+- (void)removeValueForKey:(uint32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -3339,7 +3220,7 @@
   [_dictionary removeAllObjects];
 }
 
-- (void)setEnum:(int32_t)value forKey:(uint32_t)key {
+- (void)setValue:(int32_t)value forKey:(uint32_t)key {
   if (!_validationFunc(value)) {
     [NSException raise:NSInvalidArgumentException
                 format:@"GPBUInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
@@ -3444,15 +3325,14 @@
   return [[GPBUInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt32ObjectDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt32ObjectDictionary class]]) {
     return NO;
   }
-  GPBUInt32ObjectDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -3469,17 +3349,11 @@
 
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(uint32_t key, id object, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
-    block([aKey unsignedIntValue], aObject, &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+      block([aKey unsignedIntValue], aObject, stop);
+  }];
 }
 
 - (BOOL)isInitialized {
@@ -3494,36 +3368,34 @@
 - (instancetype)deepCopyWithZone:(NSZone *)zone {
   GPBUInt32ObjectDictionary *newDict =
       [[GPBUInt32ObjectDictionary alloc] init];
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  id aKey;
-  NSMutableDictionary *internalDict = newDict->_dictionary;
-  while ((aKey = [keys nextObject])) {
-    GPBMessage *msg = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
+                                                   GPBMessage *msg,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     GPBMessage *copiedMsg = [msg copyWithZone:zone];
-    [internalDict setObject:copiedMsg forKey:aKey];
+    [newDict->_dictionary setObject:copiedMsg forKey:aKey];
     [copiedMsg release];
-  }
+  }];
   return newDict;
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -3534,22 +3406,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint32_t unwrappedKey = [aKey unsignedIntValue];
-    id unwrappedValue = aObject;
-    size_t msgSize = ComputeDictUInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt32FieldSize([aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt32Field(outputStream, [aKey unsignedIntValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -3610,24 +3480,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(int32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithUInt32s:&value
-                                                           forKeys:&key
-                                                             count:1] autorelease];
+  return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithValues:&value
+                                                          forKeys:&key
+                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [])values
-                              forKeys:(const int32_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithUInt32s:values
+  return [[(GPBInt32UInt32Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -3643,12 +3513,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt32s:(const uint32_t [])values
-                        forKeys:(const int32_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -3662,7 +3532,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32UInt32Dictionary *)dictionary {
-  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -3673,7 +3543,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -3688,15 +3558,14 @@
   return [[GPBInt32UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32UInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32UInt32Dictionary class]]) {
     return NO;
   }
-  GPBInt32UInt32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -3711,39 +3580,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, uint32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue unsignedIntValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue unsignedIntValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -3754,22 +3616,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    uint32_t unwrappedValue = [aValue unsignedIntValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -3778,13 +3638,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt32sUsingBlock:^(int32_t key, uint32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, uint32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%u", value]);
   }];
 }
 
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(uint32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedIntValue];
@@ -3801,14 +3661,14 @@
   }
 }
 
-- (void)setUInt32:(uint32_t)value forKey:(int32_t)key {
+- (void)setValue:(uint32_t)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt32ForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -3826,24 +3686,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32Int32Dictionary*)[self alloc] initWithInt32s:&value
+  return [[(GPBInt32Int32Dictionary*)[self alloc] initWithValues:&value
                                                          forKeys:&key
                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32s:(const int32_t [])values
++ (instancetype)dictionaryWithValues:(const int32_t [])values
                              forKeys:(const int32_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32Int32Dictionary*)[self alloc] initWithInt32s:values
+  return [[(GPBInt32Int32Dictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -3859,10 +3719,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt32s:(const int32_t [])values
+- (instancetype)initWithValues:(const int32_t [])values
                        forKeys:(const int32_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -3878,7 +3738,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32Int32Dictionary *)dictionary {
-  self = [self initWithInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -3889,7 +3749,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -3904,15 +3764,14 @@
   return [[GPBInt32Int32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32Int32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32Int32Dictionary class]]) {
     return NO;
   }
-  GPBInt32Int32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -3927,39 +3786,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -3970,22 +3822,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -3994,13 +3844,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt32sUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%d", value]);
   }];
 }
 
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped intValue];
@@ -4017,14 +3867,14 @@
   }
 }
 
-- (void)setInt32:(int32_t)value forKey:(int32_t)key {
+- (void)setValue:(int32_t)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt32ForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -4042,24 +3892,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(int32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithUInt64s:&value
-                                                           forKeys:&key
-                                                             count:1] autorelease];
+  return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithValues:&value
+                                                          forKeys:&key
+                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [])values
-                              forKeys:(const int32_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithUInt64s:values
+  return [[(GPBInt32UInt64Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -4075,12 +3925,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt64s:(const uint64_t [])values
-                        forKeys:(const int32_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -4094,7 +3944,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32UInt64Dictionary *)dictionary {
-  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -4105,7 +3955,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -4120,15 +3970,14 @@
   return [[GPBInt32UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32UInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32UInt64Dictionary class]]) {
     return NO;
   }
-  GPBInt32UInt64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -4143,39 +3992,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, uint64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue unsignedLongLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue unsignedLongLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -4186,22 +4028,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -4210,13 +4050,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt64sUsingBlock:^(int32_t key, uint64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, uint64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%llu", value]);
   }];
 }
 
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(uint64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedLongLongValue];
@@ -4233,14 +4073,14 @@
   }
 }
 
-- (void)setUInt64:(uint64_t)value forKey:(int32_t)key {
+- (void)setValue:(uint64_t)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt64ForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -4258,24 +4098,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32Int64Dictionary*)[self alloc] initWithInt64s:&value
+  return [[(GPBInt32Int64Dictionary*)[self alloc] initWithValues:&value
                                                          forKeys:&key
                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64s:(const int64_t [])values
++ (instancetype)dictionaryWithValues:(const int64_t [])values
                              forKeys:(const int32_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32Int64Dictionary*)[self alloc] initWithInt64s:values
+  return [[(GPBInt32Int64Dictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -4291,10 +4131,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt64s:(const int64_t [])values
+- (instancetype)initWithValues:(const int64_t [])values
                        forKeys:(const int32_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -4310,7 +4150,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32Int64Dictionary *)dictionary {
-  self = [self initWithInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -4321,7 +4161,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -4336,15 +4176,14 @@
   return [[GPBInt32Int64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32Int64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32Int64Dictionary class]]) {
     return NO;
   }
-  GPBInt32Int64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -4359,39 +4198,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, int64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue longLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue longLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -4402,22 +4234,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    int64_t unwrappedValue = [aValue longLongValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -4426,13 +4256,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt64sUsingBlock:^(int32_t key, int64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, int64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%lld", value]);
   }];
 }
 
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(int64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped longLongValue];
@@ -4449,14 +4279,14 @@
   }
 }
 
-- (void)setInt64:(int64_t)value forKey:(int32_t)key {
+- (void)setValue:(int64_t)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt64ForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -4474,24 +4304,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithBools:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(int32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32BoolDictionary*)[self alloc] initWithBools:&value
-                                                       forKeys:&key
-                                                         count:1] autorelease];
+  return [[(GPBInt32BoolDictionary*)[self alloc] initWithValues:&value
+                                                        forKeys:&key
+                                                          count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithBools:(const BOOL [])values
-                            forKeys:(const int32_t [])keys
-                              count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32BoolDictionary*)[self alloc] initWithBools:values
+  return [[(GPBInt32BoolDictionary*)[self alloc] initWithValues:values
                                                         forKeys:keys
                                                           count:count] autorelease];
 }
@@ -4507,12 +4337,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithBools:(const BOOL [])values
-                      forKeys:(const int32_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -4526,7 +4356,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32BoolDictionary *)dictionary {
-  self = [self initWithBools:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -4537,7 +4367,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -4552,15 +4382,14 @@
   return [[GPBInt32BoolDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32BoolDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32BoolDictionary class]]) {
     return NO;
   }
-  GPBInt32BoolDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -4575,39 +4404,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, BOOL value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue boolValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue boolValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -4618,22 +4440,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    BOOL unwrappedValue = [aValue boolValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -4642,13 +4462,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndBoolsUsingBlock:^(int32_t key, BOOL value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, BOOL value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], (value ? @"true" : @"false"));
   }];
 }
 
-- (BOOL)getBool:(nullable BOOL *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(BOOL *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped boolValue];
@@ -4665,14 +4485,14 @@
   }
 }
 
-- (void)setBool:(BOOL)value forKey:(int32_t)key {
+- (void)setValue:(BOOL)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeBoolForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -4690,24 +4510,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithFloats:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32FloatDictionary*)[self alloc] initWithFloats:&value
+  return [[(GPBInt32FloatDictionary*)[self alloc] initWithValues:&value
                                                          forKeys:&key
                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloats:(const float [])values
++ (instancetype)dictionaryWithValues:(const float [])values
                              forKeys:(const int32_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32FloatDictionary*)[self alloc] initWithFloats:values
+  return [[(GPBInt32FloatDictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -4723,10 +4543,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithFloats:(const float [])values
+- (instancetype)initWithValues:(const float [])values
                        forKeys:(const int32_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -4742,7 +4562,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32FloatDictionary *)dictionary {
-  self = [self initWithFloats:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -4753,7 +4573,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -4768,15 +4588,14 @@
   return [[GPBInt32FloatDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32FloatDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32FloatDictionary class]]) {
     return NO;
   }
-  GPBInt32FloatDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -4791,39 +4610,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, float value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue floatValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue floatValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -4834,22 +4646,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    float unwrappedValue = [aValue floatValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -4858,13 +4668,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndFloatsUsingBlock:^(int32_t key, float value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, float value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
   }];
 }
 
-- (BOOL)getFloat:(nullable float *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(float *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped floatValue];
@@ -4881,14 +4691,14 @@
   }
 }
 
-- (void)setFloat:(float)value forKey:(int32_t)key {
+- (void)setValue:(float)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeFloatForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -4906,24 +4716,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithDoubles:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(int32_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(int32_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32DoubleDictionary*)[self alloc] initWithDoubles:&value
-                                                           forKeys:&key
-                                                             count:1] autorelease];
+  return [[(GPBInt32DoubleDictionary*)[self alloc] initWithValues:&value
+                                                          forKeys:&key
+                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithDoubles:(const double [])values
-                              forKeys:(const int32_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const int32_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt32DoubleDictionary*)[self alloc] initWithDoubles:values
+  return [[(GPBInt32DoubleDictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -4939,12 +4749,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithDoubles:(const double [])values
-                        forKeys:(const int32_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -4958,7 +4768,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt32DoubleDictionary *)dictionary {
-  self = [self initWithDoubles:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -4969,7 +4779,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -4984,15 +4794,14 @@
   return [[GPBInt32DoubleDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32DoubleDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32DoubleDictionary class]]) {
     return NO;
   }
-  GPBInt32DoubleDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -5007,39 +4816,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, double value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue doubleValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue doubleValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -5050,22 +4852,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    double unwrappedValue = [aValue doubleValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -5074,13 +4874,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndDoublesUsingBlock:^(int32_t key, double value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int32_t key, double value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
   }];
 }
 
-- (BOOL)getDouble:(nullable double *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(double *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped doubleValue];
@@ -5097,14 +4897,14 @@
   }
 }
 
-- (void)setDouble:(double)value forKey:(int32_t)key {
+- (void)setValue:(double)value forKey:(int32_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeDoubleForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -5228,15 +5028,14 @@
   return [[GPBInt32EnumDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32EnumDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32EnumDictionary class]]) {
     return NO;
   }
-  GPBInt32EnumDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -5253,37 +5052,30 @@
 
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(int32_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey intValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey intValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -5294,22 +5086,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (NSData *)serializedDataForUnknownValue:(int32_t)value
@@ -5336,7 +5126,7 @@
   }];
 }
 
-- (BOOL)getEnum:(int32_t *)value forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     int32_t result = [wrapped intValue];
@@ -5348,7 +5138,7 @@
   return (wrapped != NULL);
 }
 
-- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int32_t)key {
+- (BOOL)valueForKey:(int32_t)key rawValue:(int32_t *)rawValue {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && rawValue) {
     *rawValue = [wrapped intValue];
@@ -5356,23 +5146,18 @@
   return (wrapped != NULL);
 }
 
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int32_t key, int32_t value, BOOL *stop))block {
   GPBEnumValidationFunc func = _validationFunc;
-  BOOL stop = NO;
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
       int32_t unwrapped = [aValue intValue];
       if (!func(unwrapped)) {
         unwrapped = kGPBUnrecognizedEnumeratorValue;
       }
-    block([aKey intValue], unwrapped, &stop);
-    if (stop) {
-      break;
-    }
-  }
+      block([aKey intValue], unwrapped, stop);
+  }];
 }
 
 - (void)addRawEntriesFromDictionary:(GPBInt32EnumDictionary *)otherDictionary {
@@ -5391,7 +5176,7 @@
   }
 }
 
-- (void)removeEnumForKey:(int32_t)aKey {
+- (void)removeValueForKey:(int32_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -5399,7 +5184,7 @@
   [_dictionary removeAllObjects];
 }
 
-- (void)setEnum:(int32_t)value forKey:(int32_t)key {
+- (void)setValue:(int32_t)value forKey:(int32_t)key {
   if (!_validationFunc(value)) {
     [NSException raise:NSInvalidArgumentException
                 format:@"GPBInt32EnumDictionary: Attempt to set an unknown enum value (%d)",
@@ -5504,15 +5289,14 @@
   return [[GPBInt32ObjectDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt32ObjectDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt32ObjectDictionary class]]) {
     return NO;
   }
-  GPBInt32ObjectDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -5529,17 +5313,11 @@
 
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(int32_t key, id object, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
-    block([aKey intValue], aObject, &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+      block([aKey intValue], aObject, stop);
+  }];
 }
 
 - (BOOL)isInitialized {
@@ -5554,36 +5332,34 @@
 - (instancetype)deepCopyWithZone:(NSZone *)zone {
   GPBInt32ObjectDictionary *newDict =
       [[GPBInt32ObjectDictionary alloc] init];
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  id aKey;
-  NSMutableDictionary *internalDict = newDict->_dictionary;
-  while ((aKey = [keys nextObject])) {
-    GPBMessage *msg = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
+                                                   GPBMessage *msg,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     GPBMessage *copiedMsg = [msg copyWithZone:zone];
-    [internalDict setObject:copiedMsg forKey:aKey];
+    [newDict->_dictionary setObject:copiedMsg forKey:aKey];
     [copiedMsg release];
-  }
+  }];
   return newDict;
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -5594,22 +5370,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int32_t unwrappedKey = [aKey intValue];
-    id unwrappedValue = aObject;
-    size_t msgSize = ComputeDictInt32FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt32FieldSize([aKey intValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt32Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt32Field(outputStream, [aKey intValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -5670,24 +5444,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(uint64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithUInt32s:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [])values
-                              forKeys:(const uint64_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithUInt32s:values
+  return [[(GPBUInt64UInt32Dictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -5703,12 +5477,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt32s:(const uint32_t [])values
-                        forKeys:(const uint64_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -5722,7 +5496,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64UInt32Dictionary *)dictionary {
-  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -5733,7 +5507,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -5748,15 +5522,14 @@
   return [[GPBUInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64UInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64UInt32Dictionary class]]) {
     return NO;
   }
-  GPBUInt64UInt32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -5771,39 +5544,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, uint32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue unsignedIntValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue unsignedIntValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -5814,22 +5580,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    uint32_t unwrappedValue = [aValue unsignedIntValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -5838,13 +5602,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt32sUsingBlock:^(uint64_t key, uint32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, uint32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%u", value]);
   }];
 }
 
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(uint32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedIntValue];
@@ -5861,14 +5625,14 @@
   }
 }
 
-- (void)setUInt32:(uint32_t)value forKey:(uint64_t)key {
+- (void)setValue:(uint32_t)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt32ForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -5886,24 +5650,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithInt32s:&value
+  return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32s:(const int32_t [])values
++ (instancetype)dictionaryWithValues:(const int32_t [])values
                              forKeys:(const uint64_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithInt32s:values
+  return [[(GPBUInt64Int32Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -5919,10 +5683,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt32s:(const int32_t [])values
+- (instancetype)initWithValues:(const int32_t [])values
                        forKeys:(const uint64_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -5938,7 +5702,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64Int32Dictionary *)dictionary {
-  self = [self initWithInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -5949,7 +5713,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -5964,15 +5728,14 @@
   return [[GPBUInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64Int32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64Int32Dictionary class]]) {
     return NO;
   }
-  GPBUInt64Int32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -5987,39 +5750,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -6030,22 +5786,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -6054,13 +5808,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt32sUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%d", value]);
   }];
 }
 
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped intValue];
@@ -6077,14 +5831,14 @@
   }
 }
 
-- (void)setInt32:(int32_t)value forKey:(uint64_t)key {
+- (void)setValue:(int32_t)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt32ForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -6102,24 +5856,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(uint64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithUInt64s:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [])values
-                              forKeys:(const uint64_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithUInt64s:values
+  return [[(GPBUInt64UInt64Dictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -6135,12 +5889,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt64s:(const uint64_t [])values
-                        forKeys:(const uint64_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -6154,7 +5908,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64UInt64Dictionary *)dictionary {
-  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -6165,7 +5919,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -6180,15 +5934,14 @@
   return [[GPBUInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64UInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64UInt64Dictionary class]]) {
     return NO;
   }
-  GPBUInt64UInt64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -6203,39 +5956,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, uint64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue unsignedLongLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue unsignedLongLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -6246,22 +5992,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -6270,13 +6014,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt64sUsingBlock:^(uint64_t key, uint64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, uint64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%llu", value]);
   }];
 }
 
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(uint64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedLongLongValue];
@@ -6293,14 +6037,14 @@
   }
 }
 
-- (void)setUInt64:(uint64_t)value forKey:(uint64_t)key {
+- (void)setValue:(uint64_t)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt64ForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -6318,24 +6062,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithInt64s:&value
+  return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64s:(const int64_t [])values
++ (instancetype)dictionaryWithValues:(const int64_t [])values
                              forKeys:(const uint64_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithInt64s:values
+  return [[(GPBUInt64Int64Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -6351,10 +6095,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt64s:(const int64_t [])values
+- (instancetype)initWithValues:(const int64_t [])values
                        forKeys:(const uint64_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -6370,7 +6114,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64Int64Dictionary *)dictionary {
-  self = [self initWithInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -6381,7 +6125,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -6396,15 +6140,14 @@
   return [[GPBUInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64Int64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64Int64Dictionary class]]) {
     return NO;
   }
-  GPBUInt64Int64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -6419,39 +6162,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, int64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue longLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue longLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -6462,22 +6198,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    int64_t unwrappedValue = [aValue longLongValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -6486,13 +6220,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt64sUsingBlock:^(uint64_t key, int64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, int64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%lld", value]);
   }];
 }
 
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(int64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped longLongValue];
@@ -6509,14 +6243,14 @@
   }
 }
 
-- (void)setInt64:(int64_t)value forKey:(uint64_t)key {
+- (void)setValue:(int64_t)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt64ForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -6534,24 +6268,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithBools:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(uint64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64BoolDictionary*)[self alloc] initWithBools:&value
-                                                        forKeys:&key
-                                                          count:1] autorelease];
+  return [[(GPBUInt64BoolDictionary*)[self alloc] initWithValues:&value
+                                                         forKeys:&key
+                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithBools:(const BOOL [])values
-                            forKeys:(const uint64_t [])keys
-                              count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64BoolDictionary*)[self alloc] initWithBools:values
+  return [[(GPBUInt64BoolDictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -6567,12 +6301,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithBools:(const BOOL [])values
-                      forKeys:(const uint64_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -6586,7 +6320,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64BoolDictionary *)dictionary {
-  self = [self initWithBools:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -6597,7 +6331,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -6612,15 +6346,14 @@
   return [[GPBUInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64BoolDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64BoolDictionary class]]) {
     return NO;
   }
-  GPBUInt64BoolDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -6635,39 +6368,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, BOOL value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue boolValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue boolValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -6678,22 +6404,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    BOOL unwrappedValue = [aValue boolValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -6702,13 +6426,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndBoolsUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], (value ? @"true" : @"false"));
   }];
 }
 
-- (BOOL)getBool:(nullable BOOL *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(BOOL *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped boolValue];
@@ -6725,14 +6449,14 @@
   }
 }
 
-- (void)setBool:(BOOL)value forKey:(uint64_t)key {
+- (void)setValue:(BOOL)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeBoolForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -6750,24 +6474,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithFloats:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64FloatDictionary*)[self alloc] initWithFloats:&value
+  return [[(GPBUInt64FloatDictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloats:(const float [])values
++ (instancetype)dictionaryWithValues:(const float [])values
                              forKeys:(const uint64_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64FloatDictionary*)[self alloc] initWithFloats:values
+  return [[(GPBUInt64FloatDictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -6783,10 +6507,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithFloats:(const float [])values
+- (instancetype)initWithValues:(const float [])values
                        forKeys:(const uint64_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -6802,7 +6526,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64FloatDictionary *)dictionary {
-  self = [self initWithFloats:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -6813,7 +6537,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -6828,15 +6552,14 @@
   return [[GPBUInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64FloatDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64FloatDictionary class]]) {
     return NO;
   }
-  GPBUInt64FloatDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -6851,39 +6574,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, float value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue floatValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue floatValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -6894,22 +6610,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    float unwrappedValue = [aValue floatValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -6918,13 +6632,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndFloatsUsingBlock:^(uint64_t key, float value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, float value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
   }];
 }
 
-- (BOOL)getFloat:(nullable float *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(float *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped floatValue];
@@ -6941,14 +6655,14 @@
   }
 }
 
-- (void)setFloat:(float)value forKey:(uint64_t)key {
+- (void)setValue:(float)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeFloatForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -6966,24 +6680,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithDoubles:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(uint64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(uint64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithDoubles:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithDoubles:(const double [])values
-                              forKeys:(const uint64_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const uint64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithDoubles:values
+  return [[(GPBUInt64DoubleDictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -6999,12 +6713,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithDoubles:(const double [])values
-                        forKeys:(const uint64_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -7018,7 +6732,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBUInt64DoubleDictionary *)dictionary {
-  self = [self initWithDoubles:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -7029,7 +6743,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -7044,15 +6758,14 @@
   return [[GPBUInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64DoubleDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64DoubleDictionary class]]) {
     return NO;
   }
-  GPBUInt64DoubleDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -7067,39 +6780,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, double value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue doubleValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue doubleValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -7110,22 +6816,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    double unwrappedValue = [aValue doubleValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -7134,13 +6838,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndDoublesUsingBlock:^(uint64_t key, double value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(uint64_t key, double value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
   }];
 }
 
-- (BOOL)getDouble:(nullable double *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(double *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped doubleValue];
@@ -7157,14 +6861,14 @@
   }
 }
 
-- (void)setDouble:(double)value forKey:(uint64_t)key {
+- (void)setValue:(double)value forKey:(uint64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeDoubleForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -7288,15 +6992,14 @@
   return [[GPBUInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64EnumDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64EnumDictionary class]]) {
     return NO;
   }
-  GPBUInt64EnumDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -7313,37 +7016,30 @@
 
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(uint64_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey unsignedLongLongValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -7354,22 +7050,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (NSData *)serializedDataForUnknownValue:(int32_t)value
@@ -7396,7 +7090,7 @@
   }];
 }
 
-- (BOOL)getEnum:(int32_t *)value forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     int32_t result = [wrapped intValue];
@@ -7408,7 +7102,7 @@
   return (wrapped != NULL);
 }
 
-- (BOOL)getRawValue:(int32_t *)rawValue forKey:(uint64_t)key {
+- (BOOL)valueForKey:(uint64_t)key rawValue:(int32_t *)rawValue {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && rawValue) {
     *rawValue = [wrapped intValue];
@@ -7416,23 +7110,18 @@
   return (wrapped != NULL);
 }
 
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(uint64_t key, int32_t value, BOOL *stop))block {
   GPBEnumValidationFunc func = _validationFunc;
-  BOOL stop = NO;
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
       int32_t unwrapped = [aValue intValue];
       if (!func(unwrapped)) {
         unwrapped = kGPBUnrecognizedEnumeratorValue;
       }
-    block([aKey unsignedLongLongValue], unwrapped, &stop);
-    if (stop) {
-      break;
-    }
-  }
+      block([aKey unsignedLongLongValue], unwrapped, stop);
+  }];
 }
 
 - (void)addRawEntriesFromDictionary:(GPBUInt64EnumDictionary *)otherDictionary {
@@ -7451,7 +7140,7 @@
   }
 }
 
-- (void)removeEnumForKey:(uint64_t)aKey {
+- (void)removeValueForKey:(uint64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -7459,7 +7148,7 @@
   [_dictionary removeAllObjects];
 }
 
-- (void)setEnum:(int32_t)value forKey:(uint64_t)key {
+- (void)setValue:(int32_t)value forKey:(uint64_t)key {
   if (!_validationFunc(value)) {
     [NSException raise:NSInvalidArgumentException
                 format:@"GPBUInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
@@ -7564,15 +7253,14 @@
   return [[GPBUInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBUInt64ObjectDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBUInt64ObjectDictionary class]]) {
     return NO;
   }
-  GPBUInt64ObjectDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -7589,17 +7277,11 @@
 
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(uint64_t key, id object, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
-    block([aKey unsignedLongLongValue], aObject, &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+      block([aKey unsignedLongLongValue], aObject, stop);
+  }];
 }
 
 - (BOOL)isInitialized {
@@ -7614,36 +7296,34 @@
 - (instancetype)deepCopyWithZone:(NSZone *)zone {
   GPBUInt64ObjectDictionary *newDict =
       [[GPBUInt64ObjectDictionary alloc] init];
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  id aKey;
-  NSMutableDictionary *internalDict = newDict->_dictionary;
-  while ((aKey = [keys nextObject])) {
-    GPBMessage *msg = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
+                                                   GPBMessage *msg,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     GPBMessage *copiedMsg = [msg copyWithZone:zone];
-    [internalDict setObject:copiedMsg forKey:aKey];
+    [newDict->_dictionary setObject:copiedMsg forKey:aKey];
     [copiedMsg release];
-  }
+  }];
   return newDict;
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -7654,22 +7334,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    uint64_t unwrappedKey = [aKey unsignedLongLongValue];
-    id unwrappedValue = aObject;
-    size_t msgSize = ComputeDictUInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictUInt64FieldSize([aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictUInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictUInt64Field(outputStream, [aKey unsignedLongLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -7730,24 +7408,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(int64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithUInt32s:&value
-                                                           forKeys:&key
-                                                             count:1] autorelease];
+  return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithValues:&value
+                                                          forKeys:&key
+                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [])values
-                              forKeys:(const int64_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithUInt32s:values
+  return [[(GPBInt64UInt32Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -7763,12 +7441,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt32s:(const uint32_t [])values
-                        forKeys:(const int64_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -7782,7 +7460,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64UInt32Dictionary *)dictionary {
-  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -7793,7 +7471,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -7808,15 +7486,14 @@
   return [[GPBInt64UInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64UInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64UInt32Dictionary class]]) {
     return NO;
   }
-  GPBInt64UInt32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -7831,39 +7508,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, uint32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue unsignedIntValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue unsignedIntValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -7874,22 +7544,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    uint32_t unwrappedValue = [aValue unsignedIntValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -7898,13 +7566,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt32sUsingBlock:^(int64_t key, uint32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, uint32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%u", value]);
   }];
 }
 
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(uint32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedIntValue];
@@ -7921,14 +7589,14 @@
   }
 }
 
-- (void)setUInt32:(uint32_t)value forKey:(int64_t)key {
+- (void)setValue:(uint32_t)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt32ForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -7946,24 +7614,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64Int32Dictionary*)[self alloc] initWithInt32s:&value
+  return [[(GPBInt64Int32Dictionary*)[self alloc] initWithValues:&value
                                                          forKeys:&key
                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32s:(const int32_t [])values
++ (instancetype)dictionaryWithValues:(const int32_t [])values
                              forKeys:(const int64_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64Int32Dictionary*)[self alloc] initWithInt32s:values
+  return [[(GPBInt64Int32Dictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -7979,10 +7647,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt32s:(const int32_t [])values
+- (instancetype)initWithValues:(const int32_t [])values
                        forKeys:(const int64_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -7998,7 +7666,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64Int32Dictionary *)dictionary {
-  self = [self initWithInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -8009,7 +7677,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -8024,15 +7692,14 @@
   return [[GPBInt64Int32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64Int32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64Int32Dictionary class]]) {
     return NO;
   }
-  GPBInt64Int32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -8047,39 +7714,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -8090,22 +7750,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -8114,13 +7772,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt32sUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%d", value]);
   }];
 }
 
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped intValue];
@@ -8137,14 +7795,14 @@
   }
 }
 
-- (void)setInt32:(int32_t)value forKey:(int64_t)key {
+- (void)setValue:(int32_t)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt32ForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -8162,24 +7820,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(int64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithUInt64s:&value
-                                                           forKeys:&key
-                                                             count:1] autorelease];
+  return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithValues:&value
+                                                          forKeys:&key
+                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [])values
-                              forKeys:(const int64_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithUInt64s:values
+  return [[(GPBInt64UInt64Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -8195,12 +7853,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt64s:(const uint64_t [])values
-                        forKeys:(const int64_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -8214,7 +7872,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64UInt64Dictionary *)dictionary {
-  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -8225,7 +7883,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -8240,15 +7898,14 @@
   return [[GPBInt64UInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64UInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64UInt64Dictionary class]]) {
     return NO;
   }
-  GPBInt64UInt64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -8263,39 +7920,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, uint64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue unsignedLongLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue unsignedLongLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -8306,22 +7956,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -8330,13 +7978,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt64sUsingBlock:^(int64_t key, uint64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, uint64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%llu", value]);
   }];
 }
 
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(uint64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped unsignedLongLongValue];
@@ -8353,14 +8001,14 @@
   }
 }
 
-- (void)setUInt64:(uint64_t)value forKey:(int64_t)key {
+- (void)setValue:(uint64_t)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeUInt64ForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -8378,24 +8026,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64Int64Dictionary*)[self alloc] initWithInt64s:&value
+  return [[(GPBInt64Int64Dictionary*)[self alloc] initWithValues:&value
                                                          forKeys:&key
                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64s:(const int64_t [])values
++ (instancetype)dictionaryWithValues:(const int64_t [])values
                              forKeys:(const int64_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64Int64Dictionary*)[self alloc] initWithInt64s:values
+  return [[(GPBInt64Int64Dictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -8411,10 +8059,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt64s:(const int64_t [])values
+- (instancetype)initWithValues:(const int64_t [])values
                        forKeys:(const int64_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -8430,7 +8078,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64Int64Dictionary *)dictionary {
-  self = [self initWithInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -8441,7 +8089,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -8456,15 +8104,14 @@
   return [[GPBInt64Int64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64Int64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64Int64Dictionary class]]) {
     return NO;
   }
-  GPBInt64Int64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -8479,39 +8126,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, int64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue longLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue longLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -8522,22 +8162,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    int64_t unwrappedValue = [aValue longLongValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -8546,13 +8184,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt64sUsingBlock:^(int64_t key, int64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, int64_t value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%lld", value]);
   }];
 }
 
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(int64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped longLongValue];
@@ -8569,14 +8207,14 @@
   }
 }
 
-- (void)setInt64:(int64_t)value forKey:(int64_t)key {
+- (void)setValue:(int64_t)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeInt64ForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -8594,24 +8232,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithBools:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(int64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64BoolDictionary*)[self alloc] initWithBools:&value
-                                                       forKeys:&key
-                                                         count:1] autorelease];
+  return [[(GPBInt64BoolDictionary*)[self alloc] initWithValues:&value
+                                                        forKeys:&key
+                                                          count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithBools:(const BOOL [])values
-                            forKeys:(const int64_t [])keys
-                              count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64BoolDictionary*)[self alloc] initWithBools:values
+  return [[(GPBInt64BoolDictionary*)[self alloc] initWithValues:values
                                                         forKeys:keys
                                                           count:count] autorelease];
 }
@@ -8627,12 +8265,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithBools:(const BOOL [])values
-                      forKeys:(const int64_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -8646,7 +8284,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64BoolDictionary *)dictionary {
-  self = [self initWithBools:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -8657,7 +8295,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -8672,15 +8310,14 @@
   return [[GPBInt64BoolDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64BoolDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64BoolDictionary class]]) {
     return NO;
   }
-  GPBInt64BoolDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -8695,39 +8332,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, BOOL value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue boolValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue boolValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -8738,22 +8368,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    BOOL unwrappedValue = [aValue boolValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -8762,13 +8390,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndBoolsUsingBlock:^(int64_t key, BOOL value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, BOOL value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], (value ? @"true" : @"false"));
   }];
 }
 
-- (BOOL)getBool:(nullable BOOL *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(BOOL *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped boolValue];
@@ -8785,14 +8413,14 @@
   }
 }
 
-- (void)setBool:(BOOL)value forKey:(int64_t)key {
+- (void)setValue:(BOOL)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeBoolForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -8810,24 +8438,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithFloats:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64FloatDictionary*)[self alloc] initWithFloats:&value
+  return [[(GPBInt64FloatDictionary*)[self alloc] initWithValues:&value
                                                          forKeys:&key
                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloats:(const float [])values
++ (instancetype)dictionaryWithValues:(const float [])values
                              forKeys:(const int64_t [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64FloatDictionary*)[self alloc] initWithFloats:values
+  return [[(GPBInt64FloatDictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -8843,10 +8471,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithFloats:(const float [])values
+- (instancetype)initWithValues:(const float [])values
                        forKeys:(const int64_t [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -8862,7 +8490,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64FloatDictionary *)dictionary {
-  self = [self initWithFloats:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -8873,7 +8501,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -8888,15 +8516,14 @@
   return [[GPBInt64FloatDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64FloatDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64FloatDictionary class]]) {
     return NO;
   }
-  GPBInt64FloatDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -8911,39 +8538,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, float value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue floatValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue floatValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -8954,22 +8574,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    float unwrappedValue = [aValue floatValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -8978,13 +8596,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndFloatsUsingBlock:^(int64_t key, float value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, float value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
   }];
 }
 
-- (BOOL)getFloat:(nullable float *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(float *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped floatValue];
@@ -9001,14 +8619,14 @@
   }
 }
 
-- (void)setFloat:(float)value forKey:(int64_t)key {
+- (void)setValue:(float)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeFloatForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -9026,24 +8644,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithDoubles:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(int64_t)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(int64_t)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64DoubleDictionary*)[self alloc] initWithDoubles:&value
-                                                           forKeys:&key
-                                                             count:1] autorelease];
+  return [[(GPBInt64DoubleDictionary*)[self alloc] initWithValues:&value
+                                                          forKeys:&key
+                                                            count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithDoubles:(const double [])values
-                              forKeys:(const int64_t [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const int64_t [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBInt64DoubleDictionary*)[self alloc] initWithDoubles:values
+  return [[(GPBInt64DoubleDictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -9059,12 +8677,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithDoubles:(const double [])values
-                        forKeys:(const int64_t [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -9078,7 +8696,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBInt64DoubleDictionary *)dictionary {
-  self = [self initWithDoubles:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -9089,7 +8707,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -9104,15 +8722,14 @@
   return [[GPBInt64DoubleDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64DoubleDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64DoubleDictionary class]]) {
     return NO;
   }
-  GPBInt64DoubleDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -9127,39 +8744,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, double value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue doubleValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue doubleValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -9170,22 +8780,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    double unwrappedValue = [aValue doubleValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -9194,13 +8802,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndDoublesUsingBlock:^(int64_t key, double value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(int64_t key, double value, BOOL *stop) {
       #pragma unused(stop)
       block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
   }];
 }
 
-- (BOOL)getDouble:(nullable double *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(double *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     *value = [wrapped doubleValue];
@@ -9217,14 +8825,14 @@
   }
 }
 
-- (void)setDouble:(double)value forKey:(int64_t)key {
+- (void)setValue:(double)value forKey:(int64_t)key {
   [_dictionary setObject:@(value) forKey:@(key)];
   if (_autocreator) {
     GPBAutocreatedDictionaryModified(_autocreator, self);
   }
 }
 
-- (void)removeDoubleForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -9348,15 +8956,14 @@
   return [[GPBInt64EnumDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64EnumDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64EnumDictionary class]]) {
     return NO;
   }
-  GPBInt64EnumDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -9373,37 +8980,30 @@
 
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(int64_t key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block([aKey longLongValue], [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -9414,22 +9014,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (NSData *)serializedDataForUnknownValue:(int32_t)value
@@ -9456,7 +9054,7 @@
   }];
 }
 
-- (BOOL)getEnum:(int32_t *)value forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && value) {
     int32_t result = [wrapped intValue];
@@ -9468,7 +9066,7 @@
   return (wrapped != NULL);
 }
 
-- (BOOL)getRawValue:(int32_t *)rawValue forKey:(int64_t)key {
+- (BOOL)valueForKey:(int64_t)key rawValue:(int32_t *)rawValue {
   NSNumber *wrapped = [_dictionary objectForKey:@(key)];
   if (wrapped && rawValue) {
     *rawValue = [wrapped intValue];
@@ -9476,23 +9074,18 @@
   return (wrapped != NULL);
 }
 
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(int64_t key, int32_t value, BOOL *stop))block {
   GPBEnumValidationFunc func = _validationFunc;
-  BOOL stop = NO;
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
       int32_t unwrapped = [aValue intValue];
       if (!func(unwrapped)) {
         unwrapped = kGPBUnrecognizedEnumeratorValue;
       }
-    block([aKey longLongValue], unwrapped, &stop);
-    if (stop) {
-      break;
-    }
-  }
+      block([aKey longLongValue], unwrapped, stop);
+  }];
 }
 
 - (void)addRawEntriesFromDictionary:(GPBInt64EnumDictionary *)otherDictionary {
@@ -9511,7 +9104,7 @@
   }
 }
 
-- (void)removeEnumForKey:(int64_t)aKey {
+- (void)removeValueForKey:(int64_t)aKey {
   [_dictionary removeObjectForKey:@(aKey)];
 }
 
@@ -9519,7 +9112,7 @@
   [_dictionary removeAllObjects];
 }
 
-- (void)setEnum:(int32_t)value forKey:(int64_t)key {
+- (void)setValue:(int32_t)value forKey:(int64_t)key {
   if (!_validationFunc(value)) {
     [NSException raise:NSInvalidArgumentException
                 format:@"GPBInt64EnumDictionary: Attempt to set an unknown enum value (%d)",
@@ -9624,15 +9217,14 @@
   return [[GPBInt64ObjectDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBInt64ObjectDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBInt64ObjectDictionary class]]) {
     return NO;
   }
-  GPBInt64ObjectDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -9649,17 +9241,11 @@
 
 - (void)enumerateKeysAndObjectsUsingBlock:
     (void (^)(int64_t key, id object, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
-    block([aKey longLongValue], aObject, &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+      block([aKey longLongValue], aObject, stop);
+  }];
 }
 
 - (BOOL)isInitialized {
@@ -9674,36 +9260,34 @@
 - (instancetype)deepCopyWithZone:(NSZone *)zone {
   GPBInt64ObjectDictionary *newDict =
       [[GPBInt64ObjectDictionary alloc] init];
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  id aKey;
-  NSMutableDictionary *internalDict = newDict->_dictionary;
-  while ((aKey = [keys nextObject])) {
-    GPBMessage *msg = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(id aKey,
+                                                   GPBMessage *msg,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     GPBMessage *copiedMsg = [msg copyWithZone:zone];
-    [internalDict setObject:copiedMsg forKey:aKey];
+    [newDict->_dictionary setObject:copiedMsg forKey:aKey];
     [copiedMsg release];
-  }
+  }];
   return newDict;
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -9714,22 +9298,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSNumber *aKey;
-  while ((aKey = [keys nextObject])) {
-    id aObject = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSNumber *aKey,
+                                                   id aObject,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    int64_t unwrappedKey = [aKey longLongValue];
-    id unwrappedValue = aObject;
-    size_t msgSize = ComputeDictInt64FieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictObjectFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictInt64FieldSize([aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictObjectFieldSize(aObject, kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictInt64Field(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictObjectField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictInt64Field(outputStream, [aKey longLongValue], kMapKeyFieldNumber, keyDataType);
+    WriteDictObjectField(outputStream, aObject, kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -9790,24 +9372,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(NSString *)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringUInt32Dictionary*)[self alloc] initWithUInt32s:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBStringUInt32Dictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [])values
-                              forKeys:(const NSString * [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const NSString * [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringUInt32Dictionary*)[self alloc] initWithUInt32s:values
+  return [[(GPBStringUInt32Dictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -9823,12 +9405,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt32s:(const uint32_t [])values
-                        forKeys:(const NSString * [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const NSString * [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -9846,7 +9428,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringUInt32Dictionary *)dictionary {
-  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -9857,7 +9439,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -9872,15 +9454,14 @@
   return [[GPBStringUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringUInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringUInt32Dictionary class]]) {
     return NO;
   }
-  GPBStringUInt32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -9895,39 +9476,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, uint32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue unsignedIntValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue unsignedIntValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -9938,22 +9512,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    uint32_t unwrappedValue = [aValue unsignedIntValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt32FieldSize([aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt32Field(outputStream, [aValue unsignedIntValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -9962,13 +9534,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt32sUsingBlock:^(NSString *key, uint32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, uint32_t value, BOOL *stop) {
       #pragma unused(stop)
       block(key, [NSString stringWithFormat:@"%u", value]);
   }];
 }
 
-- (BOOL)getUInt32:(nullable uint32_t *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(uint32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped unsignedIntValue];
@@ -9985,7 +9557,7 @@
   }
 }
 
-- (void)setUInt32:(uint32_t)value forKey:(NSString *)key {
+- (void)setValue:(uint32_t)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -9996,7 +9568,7 @@
   }
 }
 
-- (void)removeUInt32ForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -10014,24 +9586,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringInt32Dictionary*)[self alloc] initWithInt32s:&value
+  return [[(GPBStringInt32Dictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32s:(const int32_t [])values
++ (instancetype)dictionaryWithValues:(const int32_t [])values
                              forKeys:(const NSString * [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringInt32Dictionary*)[self alloc] initWithInt32s:values
+  return [[(GPBStringInt32Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -10047,10 +9619,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt32s:(const int32_t [])values
+- (instancetype)initWithValues:(const int32_t [])values
                        forKeys:(const NSString * [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -10070,7 +9642,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringInt32Dictionary *)dictionary {
-  self = [self initWithInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -10081,7 +9653,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -10096,15 +9668,14 @@
   return [[GPBStringInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringInt32Dictionary class]]) {
     return NO;
   }
-  GPBStringInt32Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -10119,39 +9690,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -10162,22 +9726,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt32FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt32FieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt32Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictInt32Field(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -10186,13 +9748,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt32sUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
       #pragma unused(stop)
       block(key, [NSString stringWithFormat:@"%d", value]);
   }];
 }
 
-- (BOOL)getInt32:(nullable int32_t *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped intValue];
@@ -10209,7 +9771,7 @@
   }
 }
 
-- (void)setInt32:(int32_t)value forKey:(NSString *)key {
+- (void)setValue:(int32_t)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -10220,7 +9782,7 @@
   }
 }
 
-- (void)removeInt32ForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -10238,24 +9800,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(NSString *)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringUInt64Dictionary*)[self alloc] initWithUInt64s:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBStringUInt64Dictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [])values
-                              forKeys:(const NSString * [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const NSString * [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringUInt64Dictionary*)[self alloc] initWithUInt64s:values
+  return [[(GPBStringUInt64Dictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -10271,12 +9833,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt64s:(const uint64_t [])values
-                        forKeys:(const NSString * [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const NSString * [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -10294,7 +9856,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringUInt64Dictionary *)dictionary {
-  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -10305,7 +9867,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -10320,15 +9882,14 @@
   return [[GPBStringUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringUInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringUInt64Dictionary class]]) {
     return NO;
   }
-  GPBStringUInt64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -10343,39 +9904,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, uint64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue unsignedLongLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue unsignedLongLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -10386,22 +9940,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    uint64_t unwrappedValue = [aValue unsignedLongLongValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictUInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictUInt64FieldSize([aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictUInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictUInt64Field(outputStream, [aValue unsignedLongLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -10410,13 +9962,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndUInt64sUsingBlock:^(NSString *key, uint64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, uint64_t value, BOOL *stop) {
       #pragma unused(stop)
       block(key, [NSString stringWithFormat:@"%llu", value]);
   }];
 }
 
-- (BOOL)getUInt64:(nullable uint64_t *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(uint64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped unsignedLongLongValue];
@@ -10433,7 +9985,7 @@
   }
 }
 
-- (void)setUInt64:(uint64_t)value forKey:(NSString *)key {
+- (void)setValue:(uint64_t)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -10444,7 +9996,7 @@
   }
 }
 
-- (void)removeUInt64ForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -10462,24 +10014,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringInt64Dictionary*)[self alloc] initWithInt64s:&value
+  return [[(GPBStringInt64Dictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64s:(const int64_t [])values
++ (instancetype)dictionaryWithValues:(const int64_t [])values
                              forKeys:(const NSString * [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringInt64Dictionary*)[self alloc] initWithInt64s:values
+  return [[(GPBStringInt64Dictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -10495,10 +10047,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt64s:(const int64_t [])values
+- (instancetype)initWithValues:(const int64_t [])values
                        forKeys:(const NSString * [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -10518,7 +10070,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringInt64Dictionary *)dictionary {
-  self = [self initWithInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -10529,7 +10081,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -10544,15 +10096,14 @@
   return [[GPBStringInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringInt64Dictionary class]]) {
     return NO;
   }
-  GPBStringInt64Dictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -10567,39 +10118,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, int64_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue longLongValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue longLongValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -10610,22 +10154,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    int64_t unwrappedValue = [aValue longLongValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictInt64FieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictInt64FieldSize([aValue longLongValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictInt64Field(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictInt64Field(outputStream, [aValue longLongValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -10634,13 +10176,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndInt64sUsingBlock:^(NSString *key, int64_t value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, int64_t value, BOOL *stop) {
       #pragma unused(stop)
       block(key, [NSString stringWithFormat:@"%lld", value]);
   }];
 }
 
-- (BOOL)getInt64:(nullable int64_t *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(int64_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped longLongValue];
@@ -10657,7 +10199,7 @@
   }
 }
 
-- (void)setInt64:(int64_t)value forKey:(NSString *)key {
+- (void)setValue:(int64_t)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -10668,7 +10210,7 @@
   }
 }
 
-- (void)removeInt64ForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -10686,24 +10228,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithBools:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(NSString *)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringBoolDictionary*)[self alloc] initWithBools:&value
-                                                        forKeys:&key
-                                                          count:1] autorelease];
+  return [[(GPBStringBoolDictionary*)[self alloc] initWithValues:&value
+                                                         forKeys:&key
+                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithBools:(const BOOL [])values
-                            forKeys:(const NSString * [])keys
-                              count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const NSString * [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringBoolDictionary*)[self alloc] initWithBools:values
+  return [[(GPBStringBoolDictionary*)[self alloc] initWithValues:values
                                                          forKeys:keys
                                                            count:count] autorelease];
 }
@@ -10719,12 +10261,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithBools:(const BOOL [])values
-                      forKeys:(const NSString * [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const NSString * [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -10742,7 +10284,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringBoolDictionary *)dictionary {
-  self = [self initWithBools:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -10753,7 +10295,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -10768,15 +10310,14 @@
   return [[GPBStringBoolDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringBoolDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringBoolDictionary class]]) {
     return NO;
   }
-  GPBStringBoolDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -10791,39 +10332,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, BOOL value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue boolValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue boolValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -10834,22 +10368,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    BOOL unwrappedValue = [aValue boolValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictBoolFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictBoolFieldSize([aValue boolValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictBoolField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictBoolField(outputStream, [aValue boolValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -10858,13 +10390,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndBoolsUsingBlock:^(NSString *key, BOOL value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, BOOL value, BOOL *stop) {
       #pragma unused(stop)
       block(key, (value ? @"true" : @"false"));
   }];
 }
 
-- (BOOL)getBool:(nullable BOOL *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(BOOL *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped boolValue];
@@ -10881,7 +10413,7 @@
   }
 }
 
-- (void)setBool:(BOOL)value forKey:(NSString *)key {
+- (void)setValue:(BOOL)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -10892,7 +10424,7 @@
   }
 }
 
-- (void)removeBoolForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -10910,24 +10442,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithFloats:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringFloatDictionary*)[self alloc] initWithFloats:&value
+  return [[(GPBStringFloatDictionary*)[self alloc] initWithValues:&value
                                                           forKeys:&key
                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloats:(const float [])values
++ (instancetype)dictionaryWithValues:(const float [])values
                              forKeys:(const NSString * [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringFloatDictionary*)[self alloc] initWithFloats:values
+  return [[(GPBStringFloatDictionary*)[self alloc] initWithValues:values
                                                           forKeys:keys
                                                             count:count] autorelease];
 }
@@ -10943,10 +10475,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithFloats:(const float [])values
+- (instancetype)initWithValues:(const float [])values
                        forKeys:(const NSString * [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -10966,7 +10498,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringFloatDictionary *)dictionary {
-  self = [self initWithFloats:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -10977,7 +10509,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -10992,15 +10524,14 @@
   return [[GPBStringFloatDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringFloatDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringFloatDictionary class]]) {
     return NO;
   }
-  GPBStringFloatDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -11015,39 +10546,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, float value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue floatValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue floatValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -11058,22 +10582,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    float unwrappedValue = [aValue floatValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictFloatFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictFloatFieldSize([aValue floatValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictFloatField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictFloatField(outputStream, [aValue floatValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -11082,13 +10604,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndFloatsUsingBlock:^(NSString *key, float value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, float value, BOOL *stop) {
       #pragma unused(stop)
       block(key, [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
   }];
 }
 
-- (BOOL)getFloat:(nullable float *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(float *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped floatValue];
@@ -11105,7 +10627,7 @@
   }
 }
 
-- (void)setFloat:(float)value forKey:(NSString *)key {
+- (void)setValue:(float)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -11116,7 +10638,7 @@
   }
 }
 
-- (void)removeFloatForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -11134,24 +10656,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithDoubles:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(NSString *)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(NSString *)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringDoubleDictionary*)[self alloc] initWithDoubles:&value
-                                                            forKeys:&key
-                                                              count:1] autorelease];
+  return [[(GPBStringDoubleDictionary*)[self alloc] initWithValues:&value
+                                                           forKeys:&key
+                                                             count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithDoubles:(const double [])values
-                              forKeys:(const NSString * [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const NSString * [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBStringDoubleDictionary*)[self alloc] initWithDoubles:values
+  return [[(GPBStringDoubleDictionary*)[self alloc] initWithValues:values
                                                            forKeys:keys
                                                              count:count] autorelease];
 }
@@ -11167,12 +10689,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithDoubles:(const double [])values
-                        forKeys:(const NSString * [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const NSString * [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -11190,7 +10712,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBStringDoubleDictionary *)dictionary {
-  self = [self initWithDoubles:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       [_dictionary addEntriesFromDictionary:dictionary->_dictionary];
@@ -11201,7 +10723,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 - (void)dealloc {
@@ -11216,15 +10738,14 @@
   return [[GPBStringDoubleDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringDoubleDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringDoubleDictionary class]]) {
     return NO;
   }
-  GPBStringDoubleDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -11239,39 +10760,32 @@
   return _dictionary.count;
 }
 
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, double value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue doubleValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue doubleValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -11282,22 +10796,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    double unwrappedValue = [aValue doubleValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictDoubleFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictDoubleFieldSize([aValue doubleValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictDoubleField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictDoubleField(outputStream, [aValue doubleValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (void)setGPBGenericValue:(GPBGenericValue *)value
@@ -11306,13 +10818,13 @@
 }
 
 - (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block {
-  [self enumerateKeysAndDoublesUsingBlock:^(NSString *key, double value, BOOL *stop) {
+  [self enumerateKeysAndValuesUsingBlock:^(NSString *key, double value, BOOL *stop) {
       #pragma unused(stop)
       block(key, [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
   }];
 }
 
-- (BOOL)getDouble:(nullable double *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(double *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     *value = [wrapped doubleValue];
@@ -11329,7 +10841,7 @@
   }
 }
 
-- (void)setDouble:(double)value forKey:(NSString *)key {
+- (void)setValue:(double)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -11340,7 +10852,7 @@
   }
 }
 
-- (void)removeDoubleForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -11468,15 +10980,14 @@
   return [[GPBStringEnumDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBStringEnumDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBStringEnumDictionary class]]) {
     return NO;
   }
-  GPBStringEnumDictionary *otherDictionary = other;
-  return [_dictionary isEqual:otherDictionary->_dictionary];
+  return [_dictionary isEqual:other->_dictionary];
 }
 
 - (NSUInteger)hash {
@@ -11493,37 +11004,30 @@
 
 - (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(NSString *key, int32_t value, BOOL *stop))block {
-  BOOL stop = NO;
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
-    block(aKey, [aValue intValue], &stop);
-    if (stop) {
-      break;
-    }
-  }
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+      block(aKey, [aValue intValue], stop);
+  }];
 }
 
 - (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
-  NSDictionary *internal = _dictionary;
-  NSUInteger count = internal.count;
+  NSUInteger count = _dictionary.count;
   if (count == 0) {
     return 0;
   }
 
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
-  size_t result = 0;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  __block size_t result = 0;
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
     size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
     msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     result += GPBComputeRawVarint32SizeForInteger(msgSize) + msgSize;
-  }
+  }];
   size_t tagSize = GPBComputeWireFormatTagSize(GPBFieldNumber(field), GPBDataTypeMessage);
   result += tagSize * count;
   return result;
@@ -11534,22 +11038,20 @@
   GPBDataType valueDataType = GPBGetFieldDataType(field);
   GPBDataType keyDataType = field.mapKeyDataType;
   uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
-  NSDictionary *internal = _dictionary;
-  NSEnumerator *keys = [internal keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = internal[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
+    #pragma unused(stop)
+    // Write the tag.
     [outputStream writeInt32NoTag:tag];
     // Write the size of the message.
-    NSString *unwrappedKey = aKey;
-    int32_t unwrappedValue = [aValue intValue];
-    size_t msgSize = ComputeDictStringFieldSize(unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    msgSize += ComputeDictEnumFieldSize(unwrappedValue, kMapValueFieldNumber, valueDataType);
+    size_t msgSize = ComputeDictStringFieldSize(aKey, kMapKeyFieldNumber, keyDataType);
+    msgSize += ComputeDictEnumFieldSize([aValue intValue], kMapValueFieldNumber, valueDataType);
     [outputStream writeInt32NoTag:(int32_t)msgSize];
     // Write the fields.
-    WriteDictStringField(outputStream, unwrappedKey, kMapKeyFieldNumber, keyDataType);
-    WriteDictEnumField(outputStream, unwrappedValue, kMapValueFieldNumber, valueDataType);
-  }
+    WriteDictStringField(outputStream, aKey, kMapKeyFieldNumber, keyDataType);
+    WriteDictEnumField(outputStream, [aValue intValue], kMapValueFieldNumber, valueDataType);
+  }];
 }
 
 - (NSData *)serializedDataForUnknownValue:(int32_t)value
@@ -11576,7 +11078,7 @@
   }];
 }
 
-- (BOOL)getEnum:(int32_t *)value forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key value:(int32_t *)value {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && value) {
     int32_t result = [wrapped intValue];
@@ -11588,7 +11090,7 @@
   return (wrapped != NULL);
 }
 
-- (BOOL)getRawValue:(int32_t *)rawValue forKey:(NSString *)key {
+- (BOOL)valueForKey:(NSString *)key rawValue:(int32_t *)rawValue {
   NSNumber *wrapped = [_dictionary objectForKey:key];
   if (wrapped && rawValue) {
     *rawValue = [wrapped intValue];
@@ -11596,23 +11098,18 @@
   return (wrapped != NULL);
 }
 
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(NSString *key, int32_t value, BOOL *stop))block {
   GPBEnumValidationFunc func = _validationFunc;
-  BOOL stop = NO;
-  NSEnumerator *keys = [_dictionary keyEnumerator];
-  NSString *aKey;
-  while ((aKey = [keys nextObject])) {
-    NSNumber *aValue = _dictionary[aKey];
+  [_dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *aKey,
+                                                   NSNumber *aValue,
+                                                   BOOL *stop) {
       int32_t unwrapped = [aValue intValue];
       if (!func(unwrapped)) {
         unwrapped = kGPBUnrecognizedEnumeratorValue;
       }
-    block(aKey, unwrapped, &stop);
-    if (stop) {
-      break;
-    }
-  }
+      block(aKey, unwrapped, stop);
+  }];
 }
 
 - (void)addRawEntriesFromDictionary:(GPBStringEnumDictionary *)otherDictionary {
@@ -11635,7 +11132,7 @@
   }
 }
 
-- (void)removeEnumForKey:(NSString *)aKey {
+- (void)removeValueForKey:(NSString *)aKey {
   [_dictionary removeObjectForKey:aKey];
 }
 
@@ -11643,7 +11140,7 @@
   [_dictionary removeAllObjects];
 }
 
-- (void)setEnum:(int32_t)value forKey:(NSString *)key {
+- (void)setValue:(int32_t)value forKey:(NSString *)key {
   if (!key) {
     [NSException raise:NSInvalidArgumentException
                 format:@"Attempting to add nil key to a Dictionary"];
@@ -11677,26 +11174,26 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32:(uint32_t)value
-                              forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint32_t)value
+                             forKey:(BOOL)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithUInt32s:&value
-                                                          forKeys:&key
-                                                            count:1] autorelease];
+  return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithValues:&value
+                                                         forKeys:&key
+                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt32s:(const uint32_t [])values
-                              forKeys:(const BOOL [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt32s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint32_t [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithUInt32s:values
-                                                          forKeys:keys
-                                                            count:count] autorelease];
+  return [[(GPBBoolUInt32Dictionary*)[self alloc] initWithValues:values
+                                                         forKeys:keys
+                                                           count:count] autorelease];
 }
 
 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
@@ -11710,12 +11207,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt32s:(const uint32_t [])values
-                        forKeys:(const BOOL [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint32_t [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     for (NSUInteger i = 0; i < count; ++i) {
@@ -11728,7 +11225,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolUInt32Dictionary *)dictionary {
-  self = [self initWithUInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -11744,7 +11241,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -11760,20 +11257,19 @@
   return [[GPBBoolUInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolUInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolUInt32Dictionary class]]) {
     return NO;
   }
-  GPBBoolUInt32Dictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -11799,7 +11295,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getUInt32:(uint32_t *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(uint32_t *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -11826,7 +11322,7 @@
   }
 }
 
-- (void)enumerateKeysAndUInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, uint32_t value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -11887,7 +11383,7 @@
   }
 }
 
-- (void)setUInt32:(uint32_t)value forKey:(BOOL)key {
+- (void)setValue:(uint32_t)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -11896,7 +11392,7 @@
   }
 }
 
-- (void)removeUInt32ForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -11919,24 +11415,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt32s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32:(int32_t)value
++ (instancetype)dictionaryWithValue:(int32_t)value
                              forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolInt32Dictionary*)[self alloc] initWithInt32s:&value
+  return [[(GPBBoolInt32Dictionary*)[self alloc] initWithValues:&value
                                                         forKeys:&key
                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt32s:(const int32_t [])values
++ (instancetype)dictionaryWithValues:(const int32_t [])values
                              forKeys:(const BOOL [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt32s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolInt32Dictionary*)[self alloc] initWithInt32s:values
+  return [[(GPBBoolInt32Dictionary*)[self alloc] initWithValues:values
                                                         forKeys:keys
                                                           count:count] autorelease];
 }
@@ -11952,10 +11448,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt32s:(const int32_t [])values
+- (instancetype)initWithValues:(const int32_t [])values
                        forKeys:(const BOOL [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -11970,7 +11466,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolInt32Dictionary *)dictionary {
-  self = [self initWithInt32s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -11986,7 +11482,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt32s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -12002,20 +11498,19 @@
   return [[GPBBoolInt32Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolInt32Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolInt32Dictionary class]]) {
     return NO;
   }
-  GPBBoolInt32Dictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -12041,7 +11536,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getInt32:(int32_t *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(int32_t *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -12068,7 +11563,7 @@
   }
 }
 
-- (void)enumerateKeysAndInt32sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, int32_t value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -12129,7 +11624,7 @@
   }
 }
 
-- (void)setInt32:(int32_t)value forKey:(BOOL)key {
+- (void)setValue:(int32_t)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -12138,7 +11633,7 @@
   }
 }
 
-- (void)removeInt32ForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -12161,26 +11656,26 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithUInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64:(uint64_t)value
-                              forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValue:(uint64_t)value
+                             forKey:(BOOL)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithUInt64s:&value
-                                                          forKeys:&key
-                                                            count:1] autorelease];
+  return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithValues:&value
+                                                         forKeys:&key
+                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithUInt64s:(const uint64_t [])values
-                              forKeys:(const BOOL [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithUInt64s:forKeys:count:
++ (instancetype)dictionaryWithValues:(const uint64_t [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithUInt64s:values
-                                                          forKeys:keys
-                                                            count:count] autorelease];
+  return [[(GPBBoolUInt64Dictionary*)[self alloc] initWithValues:values
+                                                         forKeys:keys
+                                                           count:count] autorelease];
 }
 
 + (instancetype)dictionaryWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
@@ -12194,12 +11689,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithUInt64s:(const uint64_t [])values
-                        forKeys:(const BOOL [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const uint64_t [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     for (NSUInteger i = 0; i < count; ++i) {
@@ -12212,7 +11707,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolUInt64Dictionary *)dictionary {
-  self = [self initWithUInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -12228,7 +11723,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithUInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -12244,20 +11739,19 @@
   return [[GPBBoolUInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolUInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolUInt64Dictionary class]]) {
     return NO;
   }
-  GPBBoolUInt64Dictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -12283,7 +11777,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getUInt64:(uint64_t *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(uint64_t *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -12310,7 +11804,7 @@
   }
 }
 
-- (void)enumerateKeysAndUInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, uint64_t value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -12371,7 +11865,7 @@
   }
 }
 
-- (void)setUInt64:(uint64_t)value forKey:(BOOL)key {
+- (void)setValue:(uint64_t)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -12380,7 +11874,7 @@
   }
 }
 
-- (void)removeUInt64ForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -12403,24 +11897,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithInt64s:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64:(int64_t)value
++ (instancetype)dictionaryWithValue:(int64_t)value
                              forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolInt64Dictionary*)[self alloc] initWithInt64s:&value
+  return [[(GPBBoolInt64Dictionary*)[self alloc] initWithValues:&value
                                                         forKeys:&key
                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithInt64s:(const int64_t [])values
++ (instancetype)dictionaryWithValues:(const int64_t [])values
                              forKeys:(const BOOL [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithInt64s:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolInt64Dictionary*)[self alloc] initWithInt64s:values
+  return [[(GPBBoolInt64Dictionary*)[self alloc] initWithValues:values
                                                         forKeys:keys
                                                           count:count] autorelease];
 }
@@ -12436,10 +11930,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithInt64s:(const int64_t [])values
+- (instancetype)initWithValues:(const int64_t [])values
                        forKeys:(const BOOL [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -12454,7 +11948,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolInt64Dictionary *)dictionary {
-  self = [self initWithInt64s:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -12470,7 +11964,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithInt64s:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -12486,20 +11980,19 @@
   return [[GPBBoolInt64Dictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolInt64Dictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolInt64Dictionary class]]) {
     return NO;
   }
-  GPBBoolInt64Dictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -12525,7 +12018,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getInt64:(int64_t *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(int64_t *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -12552,7 +12045,7 @@
   }
 }
 
-- (void)enumerateKeysAndInt64sUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, int64_t value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -12613,7 +12106,7 @@
   }
 }
 
-- (void)setInt64:(int64_t)value forKey:(BOOL)key {
+- (void)setValue:(int64_t)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -12622,7 +12115,7 @@
   }
 }
 
-- (void)removeInt64ForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -12645,26 +12138,26 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithBools:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithBool:(BOOL)value
-                            forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValue:(BOOL)value
+                             forKey:(BOOL)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolBoolDictionary*)[self alloc] initWithBools:&value
-                                                      forKeys:&key
-                                                        count:1] autorelease];
+  return [[(GPBBoolBoolDictionary*)[self alloc] initWithValues:&value
+                                                       forKeys:&key
+                                                         count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithBools:(const BOOL [])values
-                            forKeys:(const BOOL [])keys
-                              count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithBools:forKeys:count:
++ (instancetype)dictionaryWithValues:(const BOOL [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolBoolDictionary*)[self alloc] initWithBools:values
-                                                      forKeys:keys
-                                                        count:count] autorelease];
+  return [[(GPBBoolBoolDictionary*)[self alloc] initWithValues:values
+                                                       forKeys:keys
+                                                         count:count] autorelease];
 }
 
 + (instancetype)dictionaryWithDictionary:(GPBBoolBoolDictionary *)dictionary {
@@ -12678,12 +12171,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithBools:(const BOOL [])values
-                      forKeys:(const BOOL [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const BOOL [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     for (NSUInteger i = 0; i < count; ++i) {
@@ -12696,7 +12189,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolBoolDictionary *)dictionary {
-  self = [self initWithBools:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -12712,7 +12205,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithBools:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -12728,20 +12221,19 @@
   return [[GPBBoolBoolDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolBoolDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolBoolDictionary class]]) {
     return NO;
   }
-  GPBBoolBoolDictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -12767,7 +12259,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getBool:(BOOL *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(BOOL *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -12794,7 +12286,7 @@
   }
 }
 
-- (void)enumerateKeysAndBoolsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, BOOL value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -12855,7 +12347,7 @@
   }
 }
 
-- (void)setBool:(BOOL)value forKey:(BOOL)key {
+- (void)setValue:(BOOL)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -12864,7 +12356,7 @@
   }
 }
 
-- (void)removeBoolForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -12887,24 +12379,24 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithFloats:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloat:(float)value
++ (instancetype)dictionaryWithValue:(float)value
                              forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolFloatDictionary*)[self alloc] initWithFloats:&value
+  return [[(GPBBoolFloatDictionary*)[self alloc] initWithValues:&value
                                                         forKeys:&key
                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithFloats:(const float [])values
++ (instancetype)dictionaryWithValues:(const float [])values
                              forKeys:(const BOOL [])keys
                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithFloats:forKeys:count:
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolFloatDictionary*)[self alloc] initWithFloats:values
+  return [[(GPBBoolFloatDictionary*)[self alloc] initWithValues:values
                                                         forKeys:keys
                                                           count:count] autorelease];
 }
@@ -12920,10 +12412,10 @@
 }
 
 - (instancetype)init {
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithFloats:(const float [])values
+- (instancetype)initWithValues:(const float [])values
                        forKeys:(const BOOL [])keys
                          count:(NSUInteger)count {
   self = [super init];
@@ -12938,7 +12430,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolFloatDictionary *)dictionary {
-  self = [self initWithFloats:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -12954,7 +12446,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithFloats:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -12970,20 +12462,19 @@
   return [[GPBBoolFloatDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolFloatDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolFloatDictionary class]]) {
     return NO;
   }
-  GPBBoolFloatDictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -13009,7 +12500,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getFloat:(float *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(float *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -13036,7 +12527,7 @@
   }
 }
 
-- (void)enumerateKeysAndFloatsUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, float value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -13097,7 +12588,7 @@
   }
 }
 
-- (void)setFloat:(float)value forKey:(BOOL)key {
+- (void)setValue:(float)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -13106,7 +12597,7 @@
   }
 }
 
-- (void)removeFloatForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -13129,26 +12620,26 @@
 }
 
 + (instancetype)dictionary {
-  return [[[self alloc] initWithDoubles:NULL forKeys:NULL count:0] autorelease];
+  return [[[self alloc] initWithValues:NULL forKeys:NULL count:0] autorelease];
 }
 
-+ (instancetype)dictionaryWithDouble:(double)value
-                              forKey:(BOOL)key {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValue:(double)value
+                             forKey:(BOOL)key {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolDoubleDictionary*)[self alloc] initWithDoubles:&value
-                                                          forKeys:&key
-                                                            count:1] autorelease];
+  return [[(GPBBoolDoubleDictionary*)[self alloc] initWithValues:&value
+                                                         forKeys:&key
+                                                           count:1] autorelease];
 }
 
-+ (instancetype)dictionaryWithDoubles:(const double [])values
-                              forKeys:(const BOOL [])keys
-                                count:(NSUInteger)count {
-  // Cast is needed so the compiler knows what class we are invoking initWithDoubles:forKeys:count:
++ (instancetype)dictionaryWithValues:(const double [])values
+                             forKeys:(const BOOL [])keys
+                               count:(NSUInteger)count {
+  // Cast is needed so the compiler knows what class we are invoking initWithValues:forKeys:count:
   // on to get the type correct.
-  return [[(GPBBoolDoubleDictionary*)[self alloc] initWithDoubles:values
-                                                          forKeys:keys
-                                                            count:count] autorelease];
+  return [[(GPBBoolDoubleDictionary*)[self alloc] initWithValues:values
+                                                         forKeys:keys
+                                                           count:count] autorelease];
 }
 
 + (instancetype)dictionaryWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
@@ -13162,12 +12653,12 @@
 }
 
 - (instancetype)init {
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
-- (instancetype)initWithDoubles:(const double [])values
-                        forKeys:(const BOOL [])keys
-                          count:(NSUInteger)count {
+- (instancetype)initWithValues:(const double [])values
+                       forKeys:(const BOOL [])keys
+                         count:(NSUInteger)count {
   self = [super init];
   if (self) {
     for (NSUInteger i = 0; i < count; ++i) {
@@ -13180,7 +12671,7 @@
 }
 
 - (instancetype)initWithDictionary:(GPBBoolDoubleDictionary *)dictionary {
-  self = [self initWithDoubles:NULL forKeys:NULL count:0];
+  self = [self initWithValues:NULL forKeys:NULL count:0];
   if (self) {
     if (dictionary) {
       for (int i = 0; i < 2; ++i) {
@@ -13196,7 +12687,7 @@
 
 - (instancetype)initWithCapacity:(NSUInteger)numItems {
   #pragma unused(numItems)
-  return [self initWithDoubles:NULL forKeys:NULL count:0];
+  return [self initWithValues:NULL forKeys:NULL count:0];
 }
 
 #if !defined(NS_BLOCK_ASSERTIONS)
@@ -13212,20 +12703,19 @@
   return [[GPBBoolDoubleDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolDoubleDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolDoubleDictionary class]]) {
     return NO;
   }
-  GPBBoolDoubleDictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -13251,7 +12741,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getDouble:(double *)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(double *)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -13278,7 +12768,7 @@
   }
 }
 
-- (void)enumerateKeysAndDoublesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, double value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -13339,7 +12829,7 @@
   }
 }
 
-- (void)setDouble:(double)value forKey:(BOOL)key {
+- (void)setValue:(double)value forKey:(BOOL)key {
   int idx = (key ? 1 : 0);
   _values[idx] = value;
   _valueSet[idx] = YES;
@@ -13348,7 +12838,7 @@
   }
 }
 
-- (void)removeDoubleForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -13453,20 +12943,19 @@
   return [[GPBBoolObjectDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolObjectDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolObjectDictionary class]]) {
     return NO;
   }
-  GPBBoolObjectDictionary *otherDictionary = other;
-  if (((_values[0] != nil) != (otherDictionary->_values[0] != nil)) ||
-      ((_values[1] != nil) != (otherDictionary->_values[1] != nil))) {
+  if (((_values[0] != nil) != (other->_values[0] != nil)) ||
+      ((_values[1] != nil) != (other->_values[1] != nil))) {
     return NO;
   }
-  if (((_values[0] != nil) && (![_values[0] isEqual:otherDictionary->_values[0]])) ||
-      ((_values[1] != nil) && (![_values[1] isEqual:otherDictionary->_values[1]]))) {
+  if (((_values[0] != nil) && (![_values[0] isEqual:other->_values[0]])) ||
+      ((_values[1] != nil) && (![_values[1] isEqual:other->_values[1]]))) {
     return NO;
   }
   return YES;
@@ -13744,20 +13233,19 @@
   return [[GPBBoolEnumDictionary allocWithZone:zone] initWithDictionary:self];
 }
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBBoolEnumDictionary *)other {
   if (self == other) {
     return YES;
   }
   if (![other isKindOfClass:[GPBBoolEnumDictionary class]]) {
     return NO;
   }
-  GPBBoolEnumDictionary *otherDictionary = other;
-  if ((_valueSet[0] != otherDictionary->_valueSet[0]) ||
-      (_valueSet[1] != otherDictionary->_valueSet[1])) {
+  if ((_valueSet[0] != other->_valueSet[0]) ||
+      (_valueSet[1] != other->_valueSet[1])) {
     return NO;
   }
-  if ((_valueSet[0] && (_values[0] != otherDictionary->_values[0])) ||
-      (_valueSet[1] && (_values[1] != otherDictionary->_values[1]))) {
+  if ((_valueSet[0] && (_values[0] != other->_values[0])) ||
+      (_valueSet[1] && (_values[1] != other->_values[1]))) {
     return NO;
   }
   return YES;
@@ -13783,7 +13271,7 @@
   return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
 }
 
-- (BOOL)getEnum:(int32_t*)value forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key value:(int32_t*)value {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (value) {
@@ -13798,7 +13286,7 @@
   return NO;
 }
 
-- (BOOL)getRawValue:(int32_t*)rawValue forKey:(BOOL)key {
+- (BOOL)valueForKey:(BOOL)key rawValue:(int32_t*)rawValue {
   int idx = (key ? 1 : 0);
   if (_valueSet[idx]) {
     if (rawValue) {
@@ -13809,7 +13297,7 @@
   return NO;
 }
 
-- (void)enumerateKeysAndRawValuesUsingBlock:
+- (void)enumerateKeysAndValuesUsingBlock:
     (void (^)(BOOL key, int32_t value, BOOL *stop))block {
   BOOL stop = NO;
   if (_valueSet[0]) {
@@ -13820,7 +13308,7 @@
   }
 }
 
-- (void)enumerateKeysAndEnumsUsingBlock:
+- (void)enumerateKeysAndRawValuesUsingBlock:
     (void (^)(BOOL key, int32_t rawValue, BOOL *stop))block {
   BOOL stop = NO;
   GPBEnumValidationFunc func = _validationFunc;
@@ -13925,7 +13413,7 @@
   }
 }
 
-- (void)setEnum:(int32_t)value forKey:(BOOL)key {
+- (void)setValue:(int32_t)value forKey:(BOOL)key {
   if (!_validationFunc(value)) {
     [NSException raise:NSInvalidArgumentException
                 format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum value (%d)",
@@ -13948,7 +13436,7 @@
   }
 }
 
-- (void)removeEnumForKey:(BOOL)aKey {
+- (void)removeValueForKey:(BOOL)aKey {
   _valueSet[aKey ? 1 : 0] = NO;
 }
 
@@ -14025,26 +13513,22 @@
 
 - (id)copyWithZone:(NSZone *)zone {
   if (_dictionary == nil) {
-    return [[NSMutableDictionary allocWithZone:zone] init];
+    _dictionary = [[NSMutableDictionary alloc] init];
   }
   return [_dictionary copyWithZone:zone];
 }
 
 - (id)mutableCopyWithZone:(NSZone *)zone {
   if (_dictionary == nil) {
-    return [[NSMutableDictionary allocWithZone:zone] init];
+    _dictionary = [[NSMutableDictionary alloc] init];
   }
   return [_dictionary mutableCopyWithZone:zone];
 }
 
-// Not really needed, but subscripting is likely common enough it doesn't hurt
-// to ensure it goes directly to the real NSMutableDictionary.
 - (id)objectForKeyedSubscript:(id)key {
   return [_dictionary objectForKeyedSubscript:key];
 }
 
-// Not really needed, but subscripting is likely common enough it doesn't hurt
-// to ensure it goes directly to the real NSMutableDictionary.
 - (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
   if (_dictionary == nil) {
     _dictionary = [[NSMutableDictionary alloc] init];
@@ -14069,5 +13553,3 @@
 }
 
 @end
-
-#pragma clang diagnostic pop
diff --git a/objectivec/GPBExtensionInternals.m b/objectivec/GPBExtensionInternals.m
index 290c82a..7d0dcb2 100644
--- a/objectivec/GPBExtensionInternals.m
+++ b/objectivec/GPBExtensionInternals.m
@@ -45,8 +45,6 @@
     __attribute__((ns_returns_retained));
 
 GPB_INLINE size_t DataTypeSize(GPBDataType dataType) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wswitch-enum"
   switch (dataType) {
     case GPBDataTypeBool:
       return 1;
@@ -61,7 +59,6 @@
     default:
       return 0;
   }
-#pragma clang diagnostic pop
 }
 
 static size_t ComputePBSerializedSizeNoTagOfObject(GPBDataType dataType, id object) {
@@ -264,12 +261,6 @@
   }
 }
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 void GPBExtensionMergeFromInputStream(GPBExtensionDescriptor *extension,
                                       BOOL isPackedOnStream,
                                       GPBCodedInputStream *input,
@@ -387,5 +378,3 @@
 
   return nil;
 }
-
-#pragma clang diagnostic pop
diff --git a/objectivec/GPBExtensionRegistry.h b/objectivec/GPBExtensionRegistry.h
index d79632d..08a6472 100644
--- a/objectivec/GPBExtensionRegistry.h
+++ b/objectivec/GPBExtensionRegistry.h
@@ -35,50 +35,45 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-/**
- * A table of known extensions, searchable by name or field number.  When
- * parsing a protocol message that might have extensions, you must provide a
- * GPBExtensionRegistry in which you have registered any extensions that you
- * want to be able to parse. Otherwise, those extensions will just be treated
- * like unknown fields.
- *
- * The *Root classes provide `+extensionRegistry` for the extensions defined
- * in a given file *and* all files it imports. You can also create a
- * GPBExtensionRegistry, and merge those registries to handle parsing
- * extensions defined from non overlapping files.
- *
- * ```
- * GPBExtensionRegistry *registry = [[MyProtoFileRoot extensionRegistry] copy];
- * [registry addExtension:[OtherMessage neededExtension]]; // Not in MyProtoFile
- * NSError *parseError;
- * MyMessage *msg = [MyMessage parseData:data extensionRegistry:registry error:&parseError];
- * ```
- **/
+/// A table of known extensions, searchable by name or field number.  When
+/// parsing a protocol message that might have extensions, you must provide a
+/// @c GPBExtensionRegistry in which you have registered any extensions that you
+/// want to be able to parse. Otherwise, those extensions will just be treated
+/// like unknown fields.
+///
+/// The @c *Root classes provide @c +extensionRegistry for the extensions defined
+/// in a given file *and* all files it imports. You can also create a
+/// @c GPBExtensionRegistry, and merge those registries to handle parsing
+/// extensions defined from non overlapping files.
+///
+/// @code
+/// GPBExtensionRegistry *registry =
+///     [[[MyProtoFileRoot extensionRegistry] copy] autorelease];
+/// [registry addExtension:[OtherMessage neededExtension];  // Not in MyProtoFile
+/// NSError *parseError = nil;
+/// MyMessage *msg = [MyMessage parseData:data
+///                     extensionRegistry:registry
+///                                 error:&parseError];
+/// @endcode
 @interface GPBExtensionRegistry : NSObject<NSCopying>
 
-/**
- * Adds the given GPBExtensionDescriptor to this registry.
- *
- * @param extension The extension description to add.
- **/
+/// Add the given @c GPBExtensionDescriptor to this registry.
+///
+/// @param extension The extension description to add.
 - (void)addExtension:(GPBExtensionDescriptor *)extension;
 
-/**
- * Adds all the extensions from another registry to this registry.
- *
- * @param registry The registry to merge into this registry.
- **/
+/// Adds all the extensions from another registry to this registry.
+///
+/// @param registry The registry to merge into this registry.
 - (void)addExtensions:(GPBExtensionRegistry *)registry;
 
-/**
- * Looks for the extension registered for the given field number on a given
- * GPBDescriptor.
- *
- * @param descriptor  The descriptor to look for a registered extension on.
- * @param fieldNumber The field number of the extension to look for.
- *
- * @return The registered GPBExtensionDescriptor or nil if none was found.
- **/
+/// Looks for the extension registered for the given field number on a given
+/// @c GPBDescriptor.
+///
+/// @param descriptor  The descriptor to look for a registered extension on.
+/// @param fieldNumber The field number of an extension to look for.
+///
+/// @return The registered @c GPBExtensionDescripto or nil if none was found.
 - (nullable GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
                                                 fieldNumber:(NSInteger)fieldNumber;
 
diff --git a/objectivec/GPBExtensionRegistry.m b/objectivec/GPBExtensionRegistry.m
index b056a52..df61a17 100644
--- a/objectivec/GPBExtensionRegistry.m
+++ b/objectivec/GPBExtensionRegistry.m
@@ -34,6 +34,8 @@
 #import "GPBDescriptor.h"
 
 @implementation GPBExtensionRegistry {
+  // TODO(dmaclach): Reimplement with CFDictionaries that don't use
+  // objects as keys.
   NSMutableDictionary *mutableClassMap_;
 }
 
@@ -49,56 +51,43 @@
   [super dealloc];
 }
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 - (instancetype)copyWithZone:(NSZone *)zone {
   GPBExtensionRegistry *result = [[[self class] allocWithZone:zone] init];
-  [result addExtensions:self];
+  if (result && mutableClassMap_.count) {
+    [result->mutableClassMap_ addEntriesFromDictionary:mutableClassMap_];
+  }
   return result;
 }
 
+- (NSMutableDictionary *)extensionMapForContainingMessageClass:
+        (Class)containingMessageClass {
+  NSMutableDictionary *extensionMap =
+      [mutableClassMap_ objectForKey:containingMessageClass];
+  if (extensionMap == nil) {
+    extensionMap = [NSMutableDictionary dictionary];
+    [mutableClassMap_ setObject:extensionMap
+                         forKey:(id<NSCopying>)containingMessageClass];
+  }
+  return extensionMap;
+}
+
 - (void)addExtension:(GPBExtensionDescriptor *)extension {
   if (extension == nil) {
     return;
   }
 
   Class containingMessageClass = extension.containingMessageClass;
-  CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)
-      [mutableClassMap_ objectForKey:containingMessageClass];
-  if (extensionMap == nil) {
-    // Use a custom dictionary here because the keys are numbers and conversion
-    // back and forth from NSNumber isn't worth the cost.
-    extensionMap = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL,
-                                             &kCFTypeDictionaryValueCallBacks);
-    [mutableClassMap_ setObject:(id)extensionMap
-                         forKey:(id<NSCopying>)containingMessageClass];
-    CFRelease(extensionMap);
-  }
-
-  ssize_t key = extension.fieldNumber;
-  CFDictionarySetValue(extensionMap, (const void *)key, extension);
+  NSMutableDictionary *extensionMap =
+      [self extensionMapForContainingMessageClass:containingMessageClass];
+  [extensionMap setObject:extension forKey:@(extension.fieldNumber)];
 }
 
 - (GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
                                        fieldNumber:(NSInteger)fieldNumber {
   Class messageClass = descriptor.messageClass;
-  CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)
+  NSDictionary *extensionMap =
       [mutableClassMap_ objectForKey:messageClass];
-  ssize_t key = fieldNumber;
-  GPBExtensionDescriptor *result =
-      (extensionMap
-       ? CFDictionaryGetValue(extensionMap, (const void *)key)
-       : nil);
-  return result;
-}
-
-static void CopyKeyValue(const void *key, const void *value, void *context) {
-  CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)context;
-  CFDictionarySetValue(extensionMap, key, value);
+  return [extensionMap objectForKey:@(fieldNumber)];
 }
 
 - (void)addExtensions:(GPBExtensionRegistry *)registry {
@@ -107,24 +96,13 @@
     return;
   }
   NSMutableDictionary *otherClassMap = registry->mutableClassMap_;
-  [otherClassMap enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL * stop) {
-#pragma unused(stop)
-    Class containingMessageClass = key;
-    CFMutableDictionaryRef otherExtensionMap = (CFMutableDictionaryRef)value;
-
-    CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)
-        [mutableClassMap_ objectForKey:containingMessageClass];
-    if (extensionMap == nil) {
-      extensionMap = CFDictionaryCreateMutableCopy(kCFAllocatorDefault, 0, otherExtensionMap);
-      [mutableClassMap_ setObject:(id)extensionMap
-                           forKey:(id<NSCopying>)containingMessageClass];
-      CFRelease(extensionMap);
-    } else {
-      CFDictionaryApplyFunction(otherExtensionMap, CopyKeyValue, extensionMap);
-    }
-  }];
+  for (Class containingMessageClass in otherClassMap) {
+    NSMutableDictionary *extensionMap =
+        [self extensionMapForContainingMessageClass:containingMessageClass];
+    NSMutableDictionary *otherExtensionMap =
+        [registry extensionMapForContainingMessageClass:containingMessageClass];
+    [extensionMap addEntriesFromDictionary:otherExtensionMap];
+  }
 }
 
-#pragma clang diagnostic pop
-
 @end
diff --git a/objectivec/GPBMessage.h b/objectivec/GPBMessage.h
index 276740d..58c42d0 100644
--- a/objectivec/GPBMessage.h
+++ b/objectivec/GPBMessage.h
@@ -44,427 +44,265 @@
 
 CF_EXTERN_C_BEGIN
 
-/** NSError domain used for errors. */
+/// NSError domain used for errors.
 extern NSString *const GPBMessageErrorDomain;
 
-/** Error codes for NSErrors originated in GPBMessage. */
+/// Error code for NSError with GPBMessageErrorDomain.
 typedef NS_ENUM(NSInteger, GPBMessageErrorCode) {
-  /** Uncategorized error. */
-  GPBMessageErrorCodeOther = -100,
-  /** Message couldn't be serialized because it is missing required fields. */
+  /// The data being parsed is bad and a message can not be created from it.
+  GPBMessageErrorCodeMalformedData = -100,
+  /// A message can't be serialized because it is missing required fields.
   GPBMessageErrorCodeMissingRequiredField = -101,
 };
 
-/**
- * Key under which the GPBMessage error's reason is stored inside the userInfo
- * dictionary.
- **/
-extern NSString *const GPBErrorReasonKey;
+#ifdef DEBUG
+/// In DEBUG ONLY, an NSException is thrown when a parsed message doesn't
+/// contain required fields. This key allows you to retrieve the parsed message
+/// from the exception's @c userInfo dictionary.
+extern NSString *const GPBExceptionMessageKey;
+#endif  // DEBUG
 
 CF_EXTERN_C_END
 
-/**
- * Base class that each generated message subclasses from.
- *
- * @note @c NSCopying support is a "deep copy", in that all sub objects are
- *       copied.  Just like you wouldn't want a UIView/NSView trying to
- *       exist in two places, you don't want a sub message to be a property
- *       property of two other messages.
- *
- * @note While the class support NSSecureCoding, if the message has any
- *       extensions, they will end up reloaded in @c unknownFields as there is
- *       no way for the @c NSCoding plumbing to pass through a
- *       @c GPBExtensionRegistry. To support extensions, instead of passing the
- *       calls off to the Message, simple store the result of @c data, and then
- *       when loading, fetch the data and use
- *       @c +parseFromData:extensionRegistry:error: to provide an extension
- *       registry.
- **/
+/// Base class for all of the generated message classes.
 @interface GPBMessage : NSObject<NSSecureCoding, NSCopying>
 
-// If you add an instance method/property to this class that may conflict with
-// fields declared in protos, you need to update objective_helpers.cc. The main
-// cases are methods that take no arguments, or setFoo:/hasFoo: type methods.
+// NOTE: If you add a instance method/property to this class that may conflict
+// with methods declared in protos, you need to update objective_helpers.cc.
+// The main cases are methods that take no arguments, or setFoo:/hasFoo: type
+// methods.
 
-/**
- * The set of unknown fields for this message.
- *
- * Only messages from proto files declared with "proto2" syntax support unknown
- * fields. For "proto3" syntax, any unknown fields found while parsing are
- * dropped.
- **/
+/// The unknown fields for this message.
+///
+/// Only messages from proto files declared with "proto2" syntax support unknown
+/// fields. For "proto3" syntax, any unknown fields found while parsing are
+/// dropped.
 @property(nonatomic, copy, nullable) GPBUnknownFieldSet *unknownFields;
 
-/**
- * Whether the message, along with all submessages, have the required fields
- * set. This is only applicable for files declared with "proto2" syntax, as
- * there are no required fields for "proto3" syntax.
- **/
+/// Are all required fields set in the message and all embedded messages.
 @property(nonatomic, readonly, getter=isInitialized) BOOL initialized;
 
-/**
- * @return An autoreleased message with the default values set.
- **/
+/// Returns an autoreleased instance.
 + (instancetype)message;
 
-/**
- * Creates a new instance by parsing the provided data. This method should be
- * sent to the generated message class that the data should be interpreted as.
- * If there is an error the method returns nil and the error is returned in
- * errorPtr (when provided).
- *
- * @note In DEBUG builds, the parsed message is checked to be sure all required
- *       fields were provided, and the parse will fail if some are missing.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param data     The data to parse.
- * @param errorPtr An optional error pointer to fill in with a failure reason if
- *                 the data can not be parsed.
- *
- * @return A new instance of the generated class.
- **/
-+ (nullable instancetype)parseFromData:(NSData *)data error:(NSError **)errorPtr;
+/// Creates a new instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data     The data to parse.
+/// @param errorPtr An optional error pointer to fill in with a failure reason if
+///                 the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
++ (instancetype)parseFromData:(NSData *)data error:(NSError **)errorPtr;
 
-/**
- * Creates a new instance by parsing the data. This method should be sent to
- * the generated message class that the data should be interpreted as. If
- * there is an error the method returns nil and the error is returned in
- * errorPtr (when provided).
- *
- * @note In DEBUG builds, the parsed message is checked to be sure all required
- *       fields were provided, and the parse will fail if some are missing.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param data              The data to parse.
- * @param extensionRegistry The extension registry to use to look up extensions.
- * @param errorPtr          An optional error pointer to fill in with a failure
- *                          reason if the data can not be parsed.
- *
- * @return A new instance of the generated class.
- **/
-+ (nullable instancetype)parseFromData:(NSData *)data
-                     extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
-                                 error:(NSError **)errorPtr;
+/// Creates a new instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data              The data to parse.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
++ (instancetype)parseFromData:(NSData *)data
+            extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
+                        error:(NSError **)errorPtr;
 
-/**
- * Creates a new instance by parsing the data from the given input stream. This
- * method should be sent to the generated message class that the data should
- * be interpreted as. If there is an error the method returns nil and the error
- * is returned in errorPtr (when provided).
- *
- * @note In DEBUG builds, the parsed message is checked to be sure all required
- *       fields were provided, and the parse will fail if some are missing.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param input             The stream to read data from.
- * @param extensionRegistry The extension registry to use to look up extensions.
- * @param errorPtr          An optional error pointer to fill in with a failure
- *                          reason if the data can not be parsed.
- *
- * @return A new instance of the generated class.
- **/
-+ (nullable instancetype)parseFromCodedInputStream:(GPBCodedInputStream *)input
+/// Creates a new instance by parsing the data from the given input stream. This
+/// method should be sent to the generated message class that the data should
+/// be interpreted as. If there is an error the method returns nil and the error
+/// is returned in errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param input             The stream to read data from.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
++ (instancetype)parseFromCodedInputStream:(GPBCodedInputStream *)input
+                        extensionRegistry:
+                            (nullable GPBExtensionRegistry *)extensionRegistry
+                                    error:(NSError **)errorPtr;
+
+/// Creates a new instance by parsing the data from the given input stream. This
+/// method should be sent to the generated message class that the data should
+/// be interpreted as. If there is an error the method returns nil and the error
+/// is returned in errorPtr (when provided).
+///
+/// @note Unlike the parseFrom... methods, this never checks to see if all of
+///       the required fields are set. So this method can be used to reload
+///       messages that may not be complete.
+///
+/// @param input             The stream to read data from.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+///
+/// @return A new instance of the class messaged.
++ (instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
                                  extensionRegistry:
                                      (nullable GPBExtensionRegistry *)extensionRegistry
                                              error:(NSError **)errorPtr;
 
-/**
- * Creates a new instance by parsing the data from the given input stream. This
- * method should be sent to the generated message class that the data should
- * be interpreted as. If there is an error the method returns nil and the error
- * is returned in errorPtr (when provided).
- *
- * @note Unlike the parseFrom... methods, this never checks to see if all of
- *       the required fields are set. So this method can be used to reload
- *       messages that may not be complete.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param input             The stream to read data from.
- * @param extensionRegistry The extension registry to use to look up extensions.
- * @param errorPtr          An optional error pointer to fill in with a failure
- *                          reason if the data can not be parsed.
- *
- * @return A new instance of the generated class.
- **/
-+ (nullable instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
-                                          extensionRegistry:
-                                              (nullable GPBExtensionRegistry *)extensionRegistry
-                                                      error:(NSError **)errorPtr;
+/// Initializes an instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data     The data to parse.
+/// @param errorPtr An optional error pointer to fill in with a failure reason if
+///                 the data can not be parsed.
+- (instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr;
 
-/**
- * Initializes an instance by parsing the data. This method should be sent to
- * the generated message class that the data should be interpreted as. If
- * there is an error the method returns nil and the error is returned in
- * errorPtr (when provided).
- *
- * @note In DEBUG builds, the parsed message is checked to be sure all required
- *       fields were provided, and the parse will fail if some are missing.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param data     The data to parse.
- * @param errorPtr An optional error pointer to fill in with a failure reason if
- *                 the data can not be parsed.
- *
- * @return An initialized instance of the generated class.
- **/
-- (nullable instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr;
+/// Initializes an instance by parsing the data. This method should be sent to
+/// the generated message class that the data should be interpreted as. If
+/// there is an error the method returns nil and the error is returned in
+/// errorPtr (when provided).
+///
+/// @note In DEBUG builds, the parsed message is checked to be sure all required
+///       fields were provided, and the parse will fail if some are missing.
+///
+/// @param data              The data to parse.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+- (instancetype)initWithData:(NSData *)data
+           extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
+                       error:(NSError **)errorPtr;
 
-/**
- * Initializes an instance by parsing the data. This method should be sent to
- * the generated message class that the data should be interpreted as. If
- * there is an error the method returns nil and the error is returned in
- * errorPtr (when provided).
- *
- * @note In DEBUG builds, the parsed message is checked to be sure all required
- *       fields were provided, and the parse will fail if some are missing.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param data              The data to parse.
- * @param extensionRegistry The extension registry to use to look up extensions.
- * @param errorPtr          An optional error pointer to fill in with a failure
- *                          reason if the data can not be parsed.
- *
- * @return An initialized instance of the generated class.
- **/
-- (nullable instancetype)initWithData:(NSData *)data
-                    extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
-                                error:(NSError **)errorPtr;
+/// Initializes an instance by parsing the data from the given input stream. This
+/// method should be sent to the generated message class that the data should
+/// be interpreted as. If there is an error the method returns nil and the error
+/// is returned in errorPtr (when provided).
+///
+/// @note Unlike the parseFrom... methods, this never checks to see if all of
+///       the required fields are set. So this method can be used to reload
+///       messages that may not be complete.
+///
+/// @param input             The stream to read data from.
+/// @param extensionRegistry The extension registry to use to look up extensions.
+/// @param errorPtr          An optional error pointer to fill in with a failure
+///                          reason if the data can not be parsed.
+- (instancetype)initWithCodedInputStream:(GPBCodedInputStream *)input
+                       extensionRegistry:
+                           (nullable GPBExtensionRegistry *)extensionRegistry
+                                   error:(NSError **)errorPtr;
 
-/**
- * Initializes an instance by parsing the data from the given input stream. This
- * method should be sent to the generated message class that the data should
- * be interpreted as. If there is an error the method returns nil and the error
- * is returned in errorPtr (when provided).
- *
- * @note Unlike the parseFrom... methods, this never checks to see if all of
- *       the required fields are set. So this method can be used to reload
- *       messages that may not be complete.
- *
- * @note The errors returned are likely coming from the domain and codes listed
- *       at the top of this file and GPBCodedInputStream.h.
- *
- * @param input             The stream to read data from.
- * @param extensionRegistry The extension registry to use to look up extensions.
- * @param errorPtr          An optional error pointer to fill in with a failure
- *                          reason if the data can not be parsed.
- *
- * @return An initialized instance of the generated class.
- **/
-- (nullable instancetype)initWithCodedInputStream:(GPBCodedInputStream *)input
-                                extensionRegistry:
-                                    (nullable GPBExtensionRegistry *)extensionRegistry
-                                            error:(NSError **)errorPtr;
-
-/**
- * Parses the given data as this message's class, and merges those values into
- * this message.
- *
- * @param data              The binary representation of the message to merge.
- * @param extensionRegistry The extension registry to use to look up extensions.
- *
- * @exception GPBCodedInputStreamException Exception thrown when parsing was
- *                                         unsuccessful.
- **/
-- (void)mergeFromData:(NSData *)data
-    extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
-
-/**
- * Merges the fields from another message (of the same type) into this
- * message.
- *
- * @param other Message to merge into this message.
- **/
-- (void)mergeFrom:(GPBMessage *)other;
-
-/**
- * Writes out the message to the given coded output stream.
- *
- * @param output The coded output stream into which to write the message.
- *
- * @note This can raise the GPBCodedOutputStreamException_* exceptions.
- *
- **/
+/// Writes out the message to the given output stream.
 - (void)writeToCodedOutputStream:(GPBCodedOutputStream *)output;
-
-/**
- * Writes out the message to the given output stream.
- *
- * @param output The output stream into which to write the message.
- *
- * @note This can raise the GPBCodedOutputStreamException_* exceptions.
- **/
+/// Writes out the message to the given output stream.
 - (void)writeToOutputStream:(NSOutputStream *)output;
 
-/**
- * Writes out a varint for the message size followed by the the message to
- * the given output stream.
- *
- * @param output The coded output stream into which to write the message.
- *
- * @note This can raise the GPBCodedOutputStreamException_* exceptions.
- **/
+/// Writes out a varint for the message size followed by the the message to
+/// the given output stream.
 - (void)writeDelimitedToCodedOutputStream:(GPBCodedOutputStream *)output;
-
-/**
- * Writes out a varint for the message size followed by the the message to
- * the given output stream.
- *
- * @param output The output stream into which to write the message.
- *
- * @note This can raise the GPBCodedOutputStreamException_* exceptions.
- **/
+/// Writes out a varint for the message size followed by the the message to
+/// the given output stream.
 - (void)writeDelimitedToOutputStream:(NSOutputStream *)output;
 
-/**
- * Serializes the message to an NSData.
- *
- * If there is an error while generating the data, nil is returned.
- *
- * @note This value is not cached, so if you are using it repeatedly, cache
- *       it yourself.
- *
- * @note In DEBUG ONLY, the message is also checked for all required field,
- *       if one is missing, nil will be returned.
- *
- * @return The binary representation of the message.
- **/
+/// Serializes the message to a @c NSData.
+///
+/// If there is an error while generating the data, nil is returned.
+///
+/// @note This value is not cached, so if you are using it repeatedly, cache
+///       it yourself.
+///
+/// @note In DEBUG ONLY, the message is also checked for all required field,
+///       if one is missing, nil will be returned.
 - (nullable NSData *)data;
 
-/**
- * Serializes a varint with the message size followed by the message data,
- * returning that as an NSData.
- *
- * @note This value is not cached, so if you are using it repeatedly, it is
- *       recommended to keep a local copy.
- *
- * @return The binary representation of the size along with the message.
- **/
+/// Serializes a varint with the message size followed by the message data,
+/// returning that as a @c NSData.
+///
+/// @note This value is not cached, so if you are using it repeatedly, cache
+///       it yourself.
 - (NSData *)delimitedData;
 
-/**
- * Calculates the size of the object if it were serialized.
- *
- * This is not a cached value. If you are following a pattern like this:
- *
- * ```
- * size_t size = [aMsg serializedSize];
- * NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
- * [foo writeSize:size];
- * [foo appendData:[aMsg data]];
- * ```
- *
- * you would be better doing:
- *
- * ```
- * NSData *data = [aMsg data];
- * NSUInteger size = [aMsg length];
- * NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
- * [foo writeSize:size];
- * [foo appendData:data];
- * ```
- *
- * @return The size of the message in it's binary representation.
- **/
+/// Calculates the size of the object if it were serialized.
+///
+/// This is not a cached value. If you are following a pattern like this:
+/// @code
+///   size_t size = [aMsg serializedSize];
+///   NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
+///   [foo writeSize:size];
+///   [foo appendData:[aMsg data]];
+/// @endcode
+/// you would be better doing:
+/// @code
+///   NSData *data = [aMsg data];
+///   NSUInteger size = [aMsg length];
+///   NSMutableData *foo = [NSMutableData dataWithCapacity:size + sizeof(size)];
+///   [foo writeSize:size];
+///   [foo appendData:data];
+/// @endcode
 - (size_t)serializedSize;
 
-/**
- * @return The descriptor for the message class.
- **/
+/// Return the descriptor for the message class.
 + (GPBDescriptor *)descriptor;
-
-/**
- * Return the descriptor for the message.
- **/
+/// Return the descriptor for the message.
 - (GPBDescriptor *)descriptor;
 
-/**
- * @return An array with the extension descriptors that are currently set on the
- * message.
- **/
-- (NSArray *)extensionsCurrentlySet;
-
-/**
- * Checks whether there is an extension set on the message which matches the
- * given extension descriptor.
- *
- * @param extension Extension descriptor to check if it's set on the message.
- *
- * @return Whether the extension is currently set on the message.
- **/
+/// Test to see if the given extension is set on the message.
 - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension;
 
-/*
- * Fetches the given extension's value for this message.
- *
- * Extensions use boxed values (NSNumbers) for PODs and NSMutableArrays for
- * repeated fields. If the extension is a Message one will be auto created for
- * you and returned similar to fields.
- *
- * @param extension The extension descriptor of the extension to fetch.
- *
- * @return The extension matching the given descriptor, or nil if none found.
- **/
+/// Fetches the given extension's value for this message.
+///
+/// Extensions use boxed values (NSNumbers) for PODs and NSMutableArrays for
+/// repeated fields. If the extension is a Message one will be auto created for you
+/// and returned similar to fields.
 - (nullable id)getExtension:(GPBExtensionDescriptor *)extension;
 
-/**
- * Sets the given extension's value for this message. This only applies for
- * single field extensions (i.e. - not repeated fields).
- *
- * Extensions use boxed values (NSNumbers).
- *
- * @param extension The extension descriptor under which to set the value.
- * @param value     The value to be set as the extension.
- **/
-- (void)setExtension:(GPBExtensionDescriptor *)extension
-               value:(nullable id)value;
+/// Sets the given extension's value for this message. This is only for single
+/// field extensions (i.e. - not repeated fields).
+///
+/// Extensions use boxed values (@c NSNumbers).
+- (void)setExtension:(GPBExtensionDescriptor *)extension value:(nullable id)value;
 
-/**
- * Adds the given value to the extension for this message. This only applies
- * to repeated field extensions. If the field is a repeated POD type, the value
- * should be an NSNumber.
- *
- * @param extension The extension descriptor under which to add the value.
- * @param value     The value to be added to the repeated extension.
- **/
+/// Adds the given value to the extension for this message. This is only for
+/// repeated field extensions. If the field is a repeated POD type the @c value
+/// is a @c NSNumber.
 - (void)addExtension:(GPBExtensionDescriptor *)extension value:(id)value;
 
-/**
- * Replaces the value at the given index with the given value for the extension
- * on this message. This only applies to repeated field extensions. If the field
- * is a repeated POD type, the value is should be an NSNumber.
- *
- * @param extension The extension descriptor under which to replace the value.
- * @param index     The index of the extension to be replaced.
- * @param value     The value to be replaced in the repeated extension.
- **/
+/// Replaces the given value at an index for the extension on this message. This
+/// is only for repeated field extensions. If the field is a repeated POD type
+/// the @c value is a @c NSNumber.
 - (void)setExtension:(GPBExtensionDescriptor *)extension
                index:(NSUInteger)index
                value:(id)value;
 
-/**
- * Clears the given extension for this message.
- *
- * @param extension The extension descriptor to be cleared from this message.
- **/
+/// Clears the given extension for this message.
 - (void)clearExtension:(GPBExtensionDescriptor *)extension;
 
-/**
- * Resets all of the fields of this message to their default values.
- **/
+/// Resets all of the fields of this message to their default values.
 - (void)clear;
 
+/// Parses a message of this type from the input and merges it with this
+/// message.
+///
+/// @note This will throw if there is an error parsing the data.
+- (void)mergeFromData:(NSData *)data
+    extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
+
+/// Merges the fields from another message (of the same type) into this
+/// message.
+- (void)mergeFrom:(GPBMessage *)other;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m
index 37cff6c..8134e25 100644
--- a/objectivec/GPBMessage.m
+++ b/objectivec/GPBMessage.m
@@ -44,16 +44,13 @@
 #import "GPBUnknownFieldSet_PackagePrivate.h"
 #import "GPBUtilities_PackagePrivate.h"
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 NSString *const GPBMessageErrorDomain =
     GPBNSStringifySymbol(GPBMessageErrorDomain);
 
-NSString *const GPBErrorReasonKey = @"Reason";
+#ifdef DEBUG
+NSString *const GPBExceptionMessageKey =
+    GPBNSStringifySymbol(GPBExceptionMessage);
+#endif  // DEBUG
 
 static NSString *const kGPBDataCoderKey = @"GPBData";
 
@@ -98,39 +95,24 @@
                                               NSZone *zone)
     __attribute__((ns_returns_retained));
 
-#ifdef DEBUG
 static NSError *MessageError(NSInteger code, NSDictionary *userInfo) {
   return [NSError errorWithDomain:GPBMessageErrorDomain
                              code:code
                          userInfo:userInfo];
 }
-#endif
 
-static NSError *ErrorFromException(NSException *exception) {
-  NSError *error = nil;
-
-  if ([exception.name isEqual:GPBCodedInputStreamException]) {
-    NSDictionary *exceptionInfo = exception.userInfo;
-    error = exceptionInfo[GPBCodedInputStreamUnderlyingErrorKey];
+static NSError *MessageErrorWithReason(NSInteger code, NSString *reason) {
+  NSDictionary *userInfo = nil;
+  if ([reason length]) {
+    userInfo = @{ @"Reason" : reason };
   }
-
-  if (!error) {
-    NSString *reason = exception.reason;
-    NSDictionary *userInfo = nil;
-    if ([reason length]) {
-      userInfo = @{ GPBErrorReasonKey : reason };
-    }
-
-    error = [NSError errorWithDomain:GPBMessageErrorDomain
-                                code:GPBMessageErrorCodeOther
-                            userInfo:userInfo];
-  }
-  return error;
+  return MessageError(code, userInfo);
 }
 
+
 static void CheckExtension(GPBMessage *self,
                            GPBExtensionDescriptor *extension) {
-  if (![self isKindOfClass:extension.containingMessageClass]) {
+  if ([self class] != extension.containingMessageClass) {
     [NSException
          raise:NSInvalidArgumentException
         format:@"Extension %@ used on wrong class (%@ instead of %@)",
@@ -712,7 +694,7 @@
     return;
   }
 
-#if defined(DEBUG) && DEBUG && !defined(NS_BLOCK_ASSERTIONS)
+#if DEBUG && !defined(NS_BLOCK_ASSERTIONS)
   // Either the autocreator must have its "has" flag set to YES, or it must be
   // NO and not equal to ourselves.
   BOOL autocreatorHas =
@@ -738,25 +720,6 @@
   self->autocreatorExtension_ = nil;
 }
 
-// Call this before using the readOnlySemaphore_. This ensures it is created only once.
-void GPBPrepareReadOnlySemaphore(GPBMessage *self) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-
-  // Create the semaphore on demand (rather than init) as developers might not cause them
-  // to be needed, and the heap usage can add up.  The atomic swap is used to avoid needing
-  // another lock around creating it.
-  if (self->readOnlySemaphore_ == nil) {
-    dispatch_semaphore_t worker = dispatch_semaphore_create(1);
-    if (!OSAtomicCompareAndSwapPtrBarrier(NULL, worker, (void * volatile *)&(self->readOnlySemaphore_))) {
-      dispatch_release(worker);
-    }
-  }
-
-#pragma clang diagnostic pop
-}
-
 static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
   if (!self->unknownFields_) {
     self->unknownFields_ = [[GPBUnknownFieldSet alloc] init];
@@ -853,7 +816,8 @@
       [self release];
       self = nil;
       if (errorPtr) {
-        *errorPtr = ErrorFromException(exception);
+        *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData,
+                                           exception.reason);
       }
     }
 #ifdef DEBUG
@@ -884,7 +848,8 @@
       [self release];
       self = nil;
       if (errorPtr) {
-        *errorPtr = ErrorFromException(exception);
+        *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData,
+                                           exception.reason);
       }
     }
 #ifdef DEBUG
@@ -1042,11 +1007,9 @@
       if (arrayOrMap) {
         if (field.fieldType == GPBFieldTypeRepeated) {
           if (GPBFieldDataTypeIsObject(field)) {
-            if ([arrayOrMap isKindOfClass:[GPBAutocreatedArray class]]) {
-              GPBAutocreatedArray *autoArray = arrayOrMap;
-              if (autoArray->_autocreator == self) {
-                autoArray->_autocreator = nil;
-              }
+            GPBAutocreatedArray *autoArray = arrayOrMap;
+            if (autoArray->_autocreator == self) {
+              autoArray->_autocreator = nil;
             }
           } else {
             // Type doesn't matter, it is a GPB*Array.
@@ -1058,11 +1021,9 @@
         } else {
           if ((field.mapKeyDataType == GPBDataTypeString) &&
               GPBFieldDataTypeIsObject(field)) {
-            if ([arrayOrMap isKindOfClass:[GPBAutocreatedDictionary class]]) {
-              GPBAutocreatedDictionary *autoDict = arrayOrMap;
-              if (autoDict->_autocreator == self) {
-                autoDict->_autocreator = nil;
-              }
+            GPBAutocreatedDictionary *autoDict = arrayOrMap;
+            if (autoDict->_autocreator == self) {
+              autoDict->_autocreator = nil;
             }
           } else {
             // Type doesn't matter, it is a GPB*Dictionary.
@@ -1775,7 +1736,7 @@
 }
 
 - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension {
-#if defined(DEBUG) && DEBUG
+#if DEBUG
   CheckExtension(self, extension);
 #endif  // DEBUG
   return nil != [extensionMap_ objectForKey:extension];
@@ -1800,6 +1761,11 @@
   }
 }
 
+- (NSArray *)sortedExtensionsInUse {
+  return [[extensionMap_ allKeys]
+      sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
+}
+
 - (void)setExtension:(GPBExtensionDescriptor *)extension value:(id)value {
   if (!value) {
     [self clearExtension:extension];
@@ -1956,7 +1922,8 @@
   @catch (NSException *exception) {
     message = nil;
     if (errorPtr) {
-      *errorPtr = ErrorFromException(exception);
+      *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData,
+                                         exception.reason);
     }
   }
 #ifdef DEBUG
@@ -2297,9 +2264,6 @@
   while (YES) {
     BOOL merged = NO;
     tag = GPBCodedInputStreamReadTag(state);
-    if (tag == 0) {
-      break;  // Reached end.
-    }
     for (NSUInteger i = 0; i < numFields; ++i) {
       if (startingIndex >= numFields) startingIndex = 0;
       GPBFieldDescriptor *fieldDescriptor = fields[startingIndex];
@@ -2338,7 +2302,7 @@
       }
     }  // for(i < numFields)
 
-    if (!merged && (tag != 0)) {
+    if (!merged) {
       // Primitive, repeated types can be packed on unpacked on the wire, and
       // are parsed either way.  The above loop covered tag in the preferred
       // for, so this need to check the alternate form.
@@ -2372,11 +2336,17 @@
         // zero signals EOF / limit reached
         return;
       } else {
-        if (![self parseUnknownField:input
-                   extensionRegistry:extensionRegistry
-                                 tag:tag]) {
-          // it's an endgroup tag
-          return;
+        if (GPBPreserveUnknownFields(syntax)) {
+          if (![self parseUnknownField:input
+                     extensionRegistry:extensionRegistry
+                                   tag:tag]) {
+            // it's an endgroup tag
+            return;
+          }
+        } else {
+          if (![input skipField:tag]) {
+            return;
+          }
         }
       }
     }  // if(!merged)
@@ -2587,7 +2557,7 @@
 
 #pragma mark - isEqual: & hash Support
 
-- (BOOL)isEqual:(id)other {
+- (BOOL)isEqual:(GPBMessage *)other {
   if (other == self) {
     return YES;
   }
@@ -2596,10 +2566,9 @@
     return NO;
   }
 
-  GPBMessage *otherMsg = other;
   GPBDescriptor *descriptor = [[self class] descriptor];
   uint8_t *selfStorage = (uint8_t *)messageStorage_;
-  uint8_t *otherStorage = (uint8_t *)otherMsg->messageStorage_;
+  uint8_t *otherStorage = (uint8_t *)other->messageStorage_;
 
   for (GPBFieldDescriptor *field in descriptor->fields_) {
     if (GPBFieldIsMapOrArray(field)) {
@@ -2652,7 +2621,7 @@
         case GPBDataTypeFixed32:
         case GPBDataTypeUInt32:
         case GPBDataTypeFloat: {
-          GPBInternalCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits);
+          _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits);
           // These are all 32bit, signed/unsigned doesn't matter for equality.
           uint32_t *selfValPtr = (uint32_t *)&selfStorage[fieldOffset];
           uint32_t *otherValPtr = (uint32_t *)&otherStorage[fieldOffset];
@@ -2667,7 +2636,7 @@
         case GPBDataTypeFixed64:
         case GPBDataTypeUInt64:
         case GPBDataTypeDouble: {
-          GPBInternalCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits);
+          _GPBCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits);
           // These are all 64bit, signed/unsigned doesn't matter for equality.
           uint64_t *selfValPtr = (uint64_t *)&selfStorage[fieldOffset];
           uint64_t *otherValPtr = (uint64_t *)&otherStorage[fieldOffset];
@@ -2693,14 +2662,14 @@
   }  // for(fields)
 
   // nil and empty are equal
-  if (extensionMap_.count != 0 || otherMsg->extensionMap_.count != 0) {
-    if (![extensionMap_ isEqual:otherMsg->extensionMap_]) {
+  if (extensionMap_.count != 0 || other->extensionMap_.count != 0) {
+    if (![extensionMap_ isEqual:other->extensionMap_]) {
       return NO;
     }
   }
 
   // nil and empty are equal
-  GPBUnknownFieldSet *otherUnknowns = otherMsg->unknownFields_;
+  GPBUnknownFieldSet *otherUnknowns = other->unknownFields_;
   if ([unknownFields_ countOfFields] != 0 ||
       [otherUnknowns countOfFields] != 0) {
     if (![unknownFields_ isEqual:otherUnknowns]) {
@@ -2764,7 +2733,7 @@
         case GPBDataTypeFixed32:
         case GPBDataTypeUInt32:
         case GPBDataTypeFloat: {
-          GPBInternalCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits);
+          _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits);
           // These are all 32bit, just mix it in.
           uint32_t *valPtr = (uint32_t *)&storage[fieldOffset];
           result = prime * result + *valPtr;
@@ -2776,7 +2745,7 @@
         case GPBDataTypeFixed64:
         case GPBDataTypeUInt64:
         case GPBDataTypeDouble: {
-          GPBInternalCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits);
+          _GPBCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits);
           // These are all 64bit, just mix what fits into an NSUInteger in.
           uint64_t *valPtr = (uint64_t *)&storage[fieldOffset];
           result = prime * result + (NSUInteger)(*valPtr);
@@ -2823,7 +2792,7 @@
   return description;
 }
 
-#if defined(DEBUG) && DEBUG
+#if DEBUG
 
 // Xcode 5.1 added support for custom quick look info.
 // https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/CustomClassDisplay_in_QuickLook/CH01-quick_look_for_custom_objects/CH01-quick_look_for_custom_objects.html#//apple_ref/doc/uid/TP40014001-CH2-SW1
@@ -3077,7 +3046,7 @@
 + (BOOL)resolveInstanceMethod:(SEL)sel {
   const GPBDescriptor *descriptor = [self descriptor];
   if (!descriptor) {
-    return [super resolveInstanceMethod:sel];
+    return NO;
   }
 
   // NOTE: hasOrCountSel_/setHasSel_ will be NULL if the field for the given
@@ -3165,17 +3134,8 @@
   if (result.impToAdd) {
     const char *encoding =
         GPBMessageEncodingForSelector(result.encodingSelector, YES);
-    Class msgClass = descriptor.messageClass;
-    BOOL methodAdded = class_addMethod(msgClass, sel, result.impToAdd, encoding);
-    // class_addMethod() is documented as also failing if the method was already
-    // added; so we check if the method is already there and return success so
-    // the method dispatch will still happen.  Why would it already be added?
-    // Two threads could cause the same method to be bound at the same time,
-    // but only one will actually bind it; the other still needs to return true
-    // so things will dispatch.
-    if (!methodAdded) {
-      methodAdded = GPBClassHasSel(msgClass, sel);
-    }
+    BOOL methodAdded = class_addMethod(descriptor.messageClass, sel,
+                                       result.impToAdd, encoding);
     return methodAdded;
   }
   return [super resolveInstanceMethod:sel];
@@ -3183,7 +3143,7 @@
 
 + (BOOL)resolveClassMethod:(SEL)sel {
   // Extensions scoped to a Message and looked up via class methods.
-  if (GPBResolveExtensionClassMethod([self descriptor].messageClass, sel)) {
+  if (GPBResolveExtensionClassMethod(self, sel)) {
     return YES;
   }
   return [super resolveClassMethod:sel];
@@ -3222,35 +3182,3 @@
 }
 
 @end
-
-#pragma mark - Messages from GPBUtilities.h but defined here for access to helpers.
-
-// Only exists for public api, no core code should use this.
-id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field) {
-#if defined(DEBUG) && DEBUG
-  if (field.fieldType != GPBFieldTypeRepeated) {
-    [NSException raise:NSInvalidArgumentException
-                format:@"%@.%@ is not a repeated field.",
-     [self class], field.name];
-  }
-#endif
-  GPBDescriptor *descriptor = [[self class] descriptor];
-  GPBFileSyntax syntax = descriptor.file.syntax;
-  return GetOrCreateArrayIvarWithField(self, field, syntax);
-}
-
-// Only exists for public api, no core code should use this.
-id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field) {
-#if defined(DEBUG) && DEBUG
-  if (field.fieldType != GPBFieldTypeMap) {
-    [NSException raise:NSInvalidArgumentException
-                format:@"%@.%@ is not a map<> field.",
-     [self class], field.name];
-  }
-#endif
-  GPBDescriptor *descriptor = [[self class] descriptor];
-  GPBFileSyntax syntax = descriptor.file.syntax;
-  return GetOrCreateMapIvarWithField(self, field, syntax);
-}
-
-#pragma clang diagnostic pop
diff --git a/objectivec/GPBMessage_PackagePrivate.h b/objectivec/GPBMessage_PackagePrivate.h
index 90834d4..478db2c 100644
--- a/objectivec/GPBMessage_PackagePrivate.h
+++ b/objectivec/GPBMessage_PackagePrivate.h
@@ -70,6 +70,7 @@
   // Use of readOnlySemaphore_ must be prefaced by a call to
   // GPBPrepareReadOnlySemaphore to ensure it has been created. This allows
   // readOnlySemaphore_ to be only created when actually needed.
+  dispatch_once_t readOnlySemaphoreCreationOnce_;
   dispatch_semaphore_t readOnlySemaphore_;
 }
 
@@ -77,6 +78,10 @@
 // returns nil if the extension is not set)
 - (id)getExistingExtension:(GPBExtensionDescriptor *)extension;
 
+// Returns an array of GPBExtensionDescriptor* for all the extensions currently
+// in use on the message.  They are sorted by field number.
+- (NSArray *)sortedExtensionsInUse;
+
 // Parses a message of this type from the input and merges it with this
 // message.
 //
@@ -104,7 +109,11 @@
 
 
 // Call this before using the readOnlySemaphore_. This ensures it is created only once.
-void GPBPrepareReadOnlySemaphore(GPBMessage *self);
+NS_INLINE void GPBPrepareReadOnlySemaphore(GPBMessage *self) {
+  dispatch_once(&self->readOnlySemaphoreCreationOnce_, ^{
+    self->readOnlySemaphore_ = dispatch_semaphore_create(1);
+  });
+}
 
 // Returns a new instance that was automatically created by |autocreator| for
 // its field |field|.
diff --git a/objectivec/GPBProtocolBuffers.h b/objectivec/GPBProtocolBuffers.h
index 68d8854..677903e 100644
--- a/objectivec/GPBProtocolBuffers.h
+++ b/objectivec/GPBProtocolBuffers.h
@@ -44,33 +44,14 @@
 #import "GPBWellKnownTypes.h"
 #import "GPBWireFormat.h"
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
 // Well-known proto types
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Any.pbobjc.h>
- #import <Protobuf/Api.pbobjc.h>
- #import <Protobuf/Duration.pbobjc.h>
- #import <Protobuf/Empty.pbobjc.h>
- #import <Protobuf/FieldMask.pbobjc.h>
- #import <Protobuf/SourceContext.pbobjc.h>
- #import <Protobuf/Struct.pbobjc.h>
- #import <Protobuf/Timestamp.pbobjc.h>
- #import <Protobuf/Type.pbobjc.h>
- #import <Protobuf/Wrappers.pbobjc.h>
-#else
- #import "google/protobuf/Any.pbobjc.h"
- #import "google/protobuf/Api.pbobjc.h"
- #import "google/protobuf/Duration.pbobjc.h"
- #import "google/protobuf/Empty.pbobjc.h"
- #import "google/protobuf/FieldMask.pbobjc.h"
- #import "google/protobuf/SourceContext.pbobjc.h"
- #import "google/protobuf/Struct.pbobjc.h"
- #import "google/protobuf/Timestamp.pbobjc.h"
- #import "google/protobuf/Type.pbobjc.h"
- #import "google/protobuf/Wrappers.pbobjc.h"
-#endif
+#import "google/protobuf/Any.pbobjc.h"
+#import "google/protobuf/Api.pbobjc.h"
+#import "google/protobuf/Duration.pbobjc.h"
+#import "google/protobuf/Empty.pbobjc.h"
+#import "google/protobuf/FieldMask.pbobjc.h"
+#import "google/protobuf/SourceContext.pbobjc.h"
+#import "google/protobuf/Struct.pbobjc.h"
+#import "google/protobuf/Timestamp.pbobjc.h"
+#import "google/protobuf/Type.pbobjc.h"
+#import "google/protobuf/Wrappers.pbobjc.h"
diff --git a/objectivec/GPBProtocolBuffers.m b/objectivec/GPBProtocolBuffers.m
index d04c8be..8512af7 100644
--- a/objectivec/GPBProtocolBuffers.m
+++ b/objectivec/GPBProtocolBuffers.m
@@ -31,14 +31,6 @@
 // If you want to build protocol buffers in your own project without adding the
 // project dependency, you can just add this file.
 
-
-// This warning seems to treat code differently when it is #imported than when
-// it is inline in the file.  GPBDictionary.m compiles cleanly in other targets,
-// but when #imported here it triggers a bunch of warnings that don't make
-// much sense, and don't trigger when compiled directly.  So we shut off the
-// warnings here.
-#pragma clang diagnostic ignored "-Wnullability-completeness"
-
 #import "GPBArray.m"
 #import "GPBCodedInputStream.m"
 #import "GPBCodedOutputStream.m"
@@ -54,13 +46,15 @@
 #import "GPBWellKnownTypes.m"
 #import "GPBWireFormat.m"
 
+// Duration and Timestamp are #imported into GPBWellKnownTypes.m to the
+// Objective C categories added will always be linked in with the classes.
 #import "google/protobuf/Any.pbobjc.m"
 #import "google/protobuf/Api.pbobjc.m"
-#import "google/protobuf/Duration.pbobjc.m"
+// #import "google/protobuf/Duration.pbobjc.m"
 #import "google/protobuf/Empty.pbobjc.m"
 #import "google/protobuf/FieldMask.pbobjc.m"
 #import "google/protobuf/SourceContext.pbobjc.m"
 #import "google/protobuf/Struct.pbobjc.m"
-#import "google/protobuf/Timestamp.pbobjc.m"
+// #import "google/protobuf/Timestamp.pbobjc.m"
 #import "google/protobuf/Type.pbobjc.m"
 #import "google/protobuf/Wrappers.pbobjc.m"
diff --git a/objectivec/GPBRootObject.h b/objectivec/GPBRootObject.h
index d2e2aeb..c05b5c6 100644
--- a/objectivec/GPBRootObject.h
+++ b/objectivec/GPBRootObject.h
@@ -34,17 +34,12 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-/**
- * Every generated proto file defines a local "Root" class that exposes a
- * GPBExtensionRegistry for all the extensions defined by that file and
- * the files it depends on.
- **/
+/// Every generated proto file defines a local "Root" class that exposes a
+/// @c GPBExtensionRegistry for all the extensions defined by that file and
+/// the files it depends on.
 @interface GPBRootObject : NSObject
 
-/**
- * @return An extension registry for the given file and all the files it depends
- * on.
- **/
+/// An extension registry for the given file and all the files it depends on.
 + (GPBExtensionRegistry *)extensionRegistry;
 
 @end
diff --git a/objectivec/GPBRootObject.m b/objectivec/GPBRootObject.m
index 585d205..4570716 100644
--- a/objectivec/GPBRootObject.m
+++ b/objectivec/GPBRootObject.m
@@ -184,10 +184,11 @@
   dispatch_semaphore_wait(gExtensionSingletonDictionarySemaphore,
                           DISPATCH_TIME_FOREVER);
   id extension = (id)CFDictionaryGetValue(gExtensionSingletonDictionary, key);
-  // We can't remove the key from the dictionary here (as an optimization),
-  // two threads could have gone into +resolveClassMethod: for the same method,
-  // and ended up here; there's no way to ensure both return YES without letting
-  // both try to wire in the method.
+  if (extension) {
+    // The method is getting wired in to the class, so no need to keep it in
+    // the dictionary.
+    CFDictionaryRemoveValue(gExtensionSingletonDictionary, key);
+  }
   dispatch_semaphore_signal(gExtensionSingletonDictionarySemaphore);
   return extension;
 }
@@ -211,17 +212,9 @@
 #pragma unused(obj)
       return extension;
     });
-    BOOL methodAdded = class_addMethod(metaClass, sel, imp, encoding);
-    // class_addMethod() is documented as also failing if the method was already
-    // added; so we check if the method is already there and return success so
-    // the method dispatch will still happen.  Why would it already be added?
-    // Two threads could cause the same method to be bound at the same time,
-    // but only one will actually bind it; the other still needs to return true
-    // so things will dispatch.
-    if (!methodAdded) {
-      methodAdded = GPBClassHasSel(metaClass, sel);
+    if (class_addMethod(metaClass, sel, imp, encoding)) {
+      return YES;
     }
-    return methodAdded;
   }
   return NO;
 }
diff --git a/objectivec/GPBRuntimeTypes.h b/objectivec/GPBRuntimeTypes.h
index 4d55206..0a38b11 100644
--- a/objectivec/GPBRuntimeTypes.h
+++ b/objectivec/GPBRuntimeTypes.h
@@ -36,28 +36,21 @@
 @class GPBMessage;
 @class GPBInt32Array;
 
-/**
- * Verifies that a given value can be represented by an enum type.
- * */
+// Function used to verify that a given value can be represented by an
+// enum type.
 typedef BOOL (*GPBEnumValidationFunc)(int32_t);
 
-/**
- * Fetches an EnumDescriptor.
- * */
+// Function used to fetch an EnumDescriptor.
 typedef GPBEnumDescriptor *(*GPBEnumDescriptorFunc)(void);
 
-/**
- * Magic value used at runtime to indicate an enum value that wasn't know at
- * compile time.
- * */
+// Magic values used for when an the at runtime to indicate an enum value
+// that wasn't know at compile time.
 enum {
   kGPBUnrecognizedEnumeratorValue = (int32_t)0xFBADBEEF,
 };
 
-/**
- * A union for storing all possible Protobuf values. Note that owner is
- * responsible for memory management of object types.
- * */
+// A union for storing all possible Protobuf values.
+// Note that owner is responsible for memory management of object types.
 typedef union {
   BOOL valueBool;
   int32_t valueInt32;
@@ -72,73 +65,38 @@
   int32_t valueEnum;
 } GPBGenericValue;
 
-/**
- * Enum listing the possible data types that a field can contain.
- * 
- * @note Do not change the order of this enum (or add things to it) without
- *       thinking about it very carefully. There are several things that depend
- *       on the order.
- * */
+// Do not change the order of this enum (or add things to it) without thinking
+// about it very carefully. There are several things that depend on the order.
 typedef NS_ENUM(uint8_t, GPBDataType) {
-  /** Field contains boolean value(s). */
   GPBDataTypeBool = 0,
-  /** Field contains unsigned 4 byte value(s). */
   GPBDataTypeFixed32,
-  /** Field contains signed 4 byte value(s). */
   GPBDataTypeSFixed32,
-  /** Field contains float value(s). */
   GPBDataTypeFloat,
-  /** Field contains unsigned 8 byte value(s). */
   GPBDataTypeFixed64,
-  /** Field contains signed 8 byte value(s). */
   GPBDataTypeSFixed64,
-  /** Field contains double value(s). */
   GPBDataTypeDouble,
-  /**
-   * Field contains variable length value(s). Inefficient for encoding negative
-   * numbers – if your field is likely to have negative values, use
-   * GPBDataTypeSInt32 instead.
-   **/
   GPBDataTypeInt32,
-  /**
-   * Field contains variable length value(s). Inefficient for encoding negative
-   * numbers – if your field is likely to have negative values, use
-   * GPBDataTypeSInt64 instead.
-   **/
   GPBDataTypeInt64,
-  /** Field contains signed variable length integer value(s). */
   GPBDataTypeSInt32,
-  /** Field contains signed variable length integer value(s). */
   GPBDataTypeSInt64,
-  /** Field contains unsigned variable length integer value(s). */
   GPBDataTypeUInt32,
-  /** Field contains unsigned variable length integer value(s). */
   GPBDataTypeUInt64,
-  /** Field contains an arbitrary sequence of bytes. */
   GPBDataTypeBytes,
-  /** Field contains UTF-8 encoded or 7-bit ASCII text. */
   GPBDataTypeString,
-  /** Field contains message type(s). */
   GPBDataTypeMessage,
-  /** Field contains message type(s). */
   GPBDataTypeGroup,
-  /** Field contains enum value(s). */
   GPBDataTypeEnum,
 };
 
 enum {
-  /**
-   * A count of the number of types in GPBDataType. Separated out from the
-   * GPBDataType enum to avoid warnings regarding not handling GPBDataType_Count
-   * in switch statements.
-   **/
+  // A count of the number of types in GPBDataType. Separated out from the
+  // GPBDataType enum to avoid warnings regarding not handling
+  // GPBDataType_Count in switch statements.
   GPBDataType_Count = GPBDataTypeEnum + 1
 };
 
-/** An extension range. */
+// An extension range.
 typedef struct GPBExtensionRange {
-  /** Inclusive. */
-  uint32_t start;
-  /** Exclusive. */
-  uint32_t end;
+  uint32_t start;  // inclusive
+  uint32_t end;    // exclusive
 } GPBExtensionRange;
diff --git a/objectivec/GPBUnknownField.h b/objectivec/GPBUnknownField.h
index 5b96023..0f301e4 100644
--- a/objectivec/GPBUnknownField.h
+++ b/objectivec/GPBUnknownField.h
@@ -36,62 +36,52 @@
 @class GPBUnknownFieldSet;
 
 NS_ASSUME_NONNULL_BEGIN
-/**
- * Store an unknown field. These are used in conjunction with
- * GPBUnknownFieldSet.
- **/
+
+/// Store an unknown field. These are used in conjunction with @c GPBUnknownFieldSet
 @interface GPBUnknownField : NSObject<NSCopying>
 
-/** Initialize a field with the given number. */
-- (instancetype)initWithNumber:(int32_t)number;
-
-/** The field number the data is stored under. */
+/// The field number the data is stored under.
 @property(nonatomic, readonly, assign) int32_t number;
 
-/** An array of varint values for this field. */
+/// An array of varint values for this field.
 @property(nonatomic, readonly, strong) GPBUInt64Array *varintList;
 
-/** An array of fixed32 values for this field. */
+/// An array of fixed32 values for this field.
 @property(nonatomic, readonly, strong) GPBUInt32Array *fixed32List;
 
-/** An array of fixed64 values for this field. */
+/// An array of fixed64 values for this field.
 @property(nonatomic, readonly, strong) GPBUInt64Array *fixed64List;
 
-/** An array of data values for this field. */
+/// An array of data values for this field.
 @property(nonatomic, readonly, strong) NSArray<NSData*> *lengthDelimitedList;
 
-/** An array of groups of values for this field. */
+/// An array of groups of values for this field.
 @property(nonatomic, readonly, strong) NSArray<GPBUnknownFieldSet*> *groupList;
 
-/**
- * Add a value to the varintList.
- *
- * @param value The value to add.
- **/
+
+/// Add a value to the varintList.
+///
+/// @param value The value to add.
 - (void)addVarint:(uint64_t)value;
-/**
- * Add a value to the fixed32List.
- *
- * @param value The value to add.
- **/
+
+/// Add a value to the fixed32List.
+///
+/// @param value The value to add.
 - (void)addFixed32:(uint32_t)value;
-/**
- * Add a value to the fixed64List.
- *
- * @param value The value to add.
- **/
+
+/// Add a value to the fixed64List.
+///
+/// @param value The value to add.
 - (void)addFixed64:(uint64_t)value;
-/**
- * Add a value to the lengthDelimitedList.
- *
- * @param value The value to add.
- **/
+
+/// Add a value to the lengthDelimitedList.
+///
+/// @param value The value to add.
 - (void)addLengthDelimited:(NSData *)value;
-/**
- * Add a value to the groupList.
- *
- * @param value The value to add.
- **/
+
+/// Add a value to the groupList.
+///
+/// @param value The value to add.
 - (void)addGroup:(GPBUnknownFieldSet *)value;
 
 @end
diff --git a/objectivec/GPBUnknownField.m b/objectivec/GPBUnknownField.m
index 9d5c97f..0e29bde 100644
--- a/objectivec/GPBUnknownField.m
+++ b/objectivec/GPBUnknownField.m
@@ -67,19 +67,13 @@
   [super dealloc];
 }
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 - (id)copyWithZone:(NSZone *)zone {
   GPBUnknownField *result =
       [[GPBUnknownField allocWithZone:zone] initWithNumber:number_];
   result->mutableFixed32List_ = [mutableFixed32List_ copyWithZone:zone];
   result->mutableFixed64List_ = [mutableFixed64List_ copyWithZone:zone];
   result->mutableLengthDelimitedList_ =
-      [mutableLengthDelimitedList_ mutableCopyWithZone:zone];
+      [mutableLengthDelimitedList_ copyWithZone:zone];
   result->mutableVarintList_ = [mutableVarintList_ copyWithZone:zone];
   if (mutableGroupList_.count) {
     result->mutableGroupList_ = [[NSMutableArray allocWithZone:zone]
@@ -97,7 +91,6 @@
   if (self == object) return YES;
   if (![object isKindOfClass:[GPBUnknownField class]]) return NO;
   GPBUnknownField *field = (GPBUnknownField *)object;
-  if (number_ != field->number_) return NO;
   BOOL equalVarint =
       (mutableVarintList_.count == 0 && field->mutableVarintList_.count == 0) ||
       [mutableVarintList_ isEqual:field->mutableVarintList_];
@@ -203,9 +196,8 @@
 }
 
 - (NSString *)description {
-  NSMutableString *description =
-      [NSMutableString stringWithFormat:@"<%@ %p>: Field: %d {\n",
-       [self class], self, number_];
+  NSMutableString *description = [NSMutableString
+      stringWithFormat:@"<%@ %p>: Field: %d {\n", [self class], self, number_];
   [mutableVarintList_
       enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
 #pragma unused(idx, stop)
@@ -331,6 +323,4 @@
   }
 }
 
-#pragma clang diagnostic pop
-
 @end
diff --git a/objectivec/GPBUnknownFieldSet.h b/objectivec/GPBUnknownFieldSet.h
index 1b5f24f..cf61299 100644
--- a/objectivec/GPBUnknownFieldSet.h
+++ b/objectivec/GPBUnknownFieldSet.h
@@ -34,48 +34,31 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-/**
- * A collection of unknown fields. Fields parsed from the binary representation
- * of a message that are unknown end up in an instance of this set. This only
- * applies for files declared with the "proto2" syntax. Files declared with the
- * "proto3" syntax discard the unknown values.
- **/
+/// A collection of unknown fields.
 @interface GPBUnknownFieldSet : NSObject<NSCopying>
 
-/**
- * Tests to see if the given field number has a value.
- *
- * @param number The field number to check.
- *
- * @return YES if there is an unknown field for the given field number.
- **/
+/// Tests to see if the given field number has a value.
+///
+/// @param number The field number to check.
+///
+/// @return YES if there is an unknown field for the given field number.
 - (BOOL)hasField:(int32_t)number;
 
-/**
- * Fetches the GPBUnknownField for the given field number.
- *
- * @param number The field number to look up.
- *
- * @return The GPBUnknownField or nil if none found.
- **/
+/// Fetches the @c GPBUnknownField for the given field number.
+///
+/// @param number The field number to look up.
+///
+/// @return The @c GPBUnknownField or nil.
 - (nullable GPBUnknownField *)getField:(int32_t)number;
 
-/**
- * @return The number of fields in this set.
- **/
+/// Returns the number of fields in this set.
 - (NSUInteger)countOfFields;
 
-/**
- * Adds the given field to the set.
- *
- * @param field The field to add to the set.
- **/
+/// Adds the given field to the set.
 - (void)addField:(GPBUnknownField *)field;
 
-/**
- * @return An array of the GPBUnknownFields sorted by the field numbers.
- **/
-- (NSArray<GPBUnknownField *> *)sortedFields;
+/// Returns an NSArray of the @c GPBUnknownFields sorted by the field numbers.
+- (NSArray<GPBUnknownField*> *)sortedFields;
 
 @end
 
diff --git a/objectivec/GPBUnknownFieldSet.m b/objectivec/GPBUnknownFieldSet.m
index a7335f0..4ddc0d2 100644
--- a/objectivec/GPBUnknownFieldSet.m
+++ b/objectivec/GPBUnknownFieldSet.m
@@ -36,6 +36,39 @@
 #import "GPBUtilities.h"
 #import "GPBWireFormat.h"
 
+#pragma mark CFDictionaryKeyCallBacks
+
+// We use a custom dictionary here because our keys are numbers and
+// conversion back and forth from NSNumber was costing us performance.
+// If/when we move to C++ this could be done using a std::map and some
+// careful retain/release calls.
+
+static const void *GPBUnknownFieldSetKeyRetain(CFAllocatorRef allocator,
+                                               const void *value) {
+#pragma unused(allocator)
+  return value;
+}
+
+static void GPBUnknownFieldSetKeyRelease(CFAllocatorRef allocator,
+                                         const void *value) {
+#pragma unused(allocator)
+#pragma unused(value)
+}
+
+static CFStringRef GPBUnknownFieldSetCopyKeyDescription(const void *value) {
+  return CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%d"),
+                                  (int)value);
+}
+
+static Boolean GPBUnknownFieldSetKeyEqual(const void *value1,
+                                          const void *value2) {
+  return value1 == value2;
+}
+
+static CFHashCode GPBUnknownFieldSetKeyHash(const void *value) {
+  return (CFHashCode)value;
+}
+
 #pragma mark Helpers
 
 static void checkNumber(int32_t number) {
@@ -60,12 +93,6 @@
   [copied release];
 }
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 - (id)copyWithZone:(NSZone *)zone {
   GPBUnknownFieldSet *result = [[GPBUnknownFieldSet allocWithZone:zone] init];
   if (fields_) {
@@ -121,7 +148,7 @@
 }
 
 - (NSArray *)sortedFields {
-  if (!fields_) return [NSArray array];
+  if (!fields_) return nil;
   size_t count = CFDictionaryGetCount(fields_);
   ssize_t keys[count];
   GPBUnknownField *values[count];
@@ -258,9 +285,13 @@
   int32_t number = [field number];
   checkNumber(number);
   if (!fields_) {
-    // Use a custom dictionary here because the keys are numbers and conversion
-    // back and forth from NSNumber isn't worth the cost.
-    fields_ = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL,
+    CFDictionaryKeyCallBacks keyCallBacks = {
+        // See description above for reason for using custom dictionary.
+        0, GPBUnknownFieldSetKeyRetain, GPBUnknownFieldSetKeyRelease,
+        GPBUnknownFieldSetCopyKeyDescription, GPBUnknownFieldSetKeyEqual,
+        GPBUnknownFieldSetKeyHash,
+    };
+    fields_ = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &keyCallBacks,
                                         &kCFTypeDictionaryValueCallBacks);
   }
   ssize_t key = number;
@@ -322,7 +353,6 @@
 }
 
 - (BOOL)mergeFieldFrom:(int32_t)tag input:(GPBCodedInputStream *)input {
-  NSAssert(GPBWireFormatIsValidTag(tag), @"Got passed an invalid tag");
   int32_t number = GPBWireFormatGetTagFieldNumber(tag);
   GPBCodedInputStreamState *state = &input->state_;
   switch (GPBWireFormatGetTagWireType(tag)) {
@@ -390,6 +420,4 @@
   }
 }
 
-#pragma clang diagnostic pop
-
 @end
diff --git a/objectivec/GPBUnknownField_PackagePrivate.h b/objectivec/GPBUnknownField_PackagePrivate.h
index 2b4c789..1fbce0f 100644
--- a/objectivec/GPBUnknownField_PackagePrivate.h
+++ b/objectivec/GPBUnknownField_PackagePrivate.h
@@ -36,6 +36,8 @@
 
 @interface GPBUnknownField ()
 
+- (instancetype)initWithNumber:(int32_t)number;
+
 - (void)writeToOutput:(GPBCodedOutputStream *)output;
 - (size_t)serializedSize;
 
diff --git a/objectivec/GPBUtilities.h b/objectivec/GPBUtilities.h
index 5464dfb..b720932 100644
--- a/objectivec/GPBUtilities.h
+++ b/objectivec/GPBUtilities.h
@@ -38,58 +38,34 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-/**
- * Generates a string that should be a valid "TextFormat" for the C++ version
- * of Protocol Buffers.
- *
- * @param message    The message to generate from.
- * @param lineIndent A string to use as the prefix for all lines generated. Can
- *                   be nil if no extra indent is needed.
- *
- * @return An NSString with the TextFormat of the message.
- **/
+/// Generates a string that should be a valid "Text Format" for the C++ version
+/// of Protocol Buffers.
+///
+///  @param message    The message to generate from.
+///  @param lineIndent A string to use as the prefix for all lines generated. Can
+///                    be nil if no extra indent is needed.
+///
+/// @return A @c NSString with the Text Format of the message.
 NSString *GPBTextFormatForMessage(GPBMessage *message,
                                   NSString * __nullable lineIndent);
 
-/**
- * Generates a string that should be a valid "TextFormat" for the C++ version
- * of Protocol Buffers.
- *
- * @param unknownSet The unknown field set to generate from.
- * @param lineIndent A string to use as the prefix for all lines generated. Can
- *                   be nil if no extra indent is needed.
- *
- * @return An NSString with the TextFormat of the unknown field set.
- **/
+/// Generates a string that should be a valid "Text Format" for the C++ version
+/// of Protocol Buffers.
+///
+///  @param unknownSet The unknown field set to generate from.
+///  @param lineIndent A string to use as the prefix for all lines generated. Can
+///                    be nil if no extra indent is needed.
+///
+/// @return A @c NSString with the Text Format of the unknown field set.
 NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet * __nullable unknownSet,
                                           NSString * __nullable lineIndent);
 
-/**
- * Checks if the given field number is set on a message.
- *
- * @param self        The message to check.
- * @param fieldNumber The field number to check.
- *
- * @return YES if the field number is set on the given message.
- **/
+/// Test if the given field is set on a message.
 BOOL GPBMessageHasFieldNumberSet(GPBMessage *self, uint32_t fieldNumber);
-
-/**
- * Checks if the given field is set on a message.
- *
- * @param self  The message to check.
- * @param field The field to check.
- *
- * @return YES if the field is set on the given message.
- **/
+/// Test if the given field is set on a message.
 BOOL GPBMessageHasFieldSet(GPBMessage *self, GPBFieldDescriptor *field);
 
-/**
- * Clears the given field for the given message.
- *
- * @param self  The message for which to clear the field.
- * @param field The field to clear.
- **/
+/// Clear the given field of a message.
 void GPBClearMessageField(GPBMessage *self, GPBFieldDescriptor *field);
 
 //%PDDM-EXPAND GPB_ACCESSORS()
@@ -97,306 +73,114 @@
 
 
 //
-// Get/Set a given field from/to a message.
+// Get/Set the given field of a message.
 //
 
 // Single Fields
 
-/**
- * Gets the value of a bytes field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a bytes field.
 NSData *GPBGetMessageBytesField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a bytes field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a bytes field.
 void GPBSetMessageBytesField(GPBMessage *self, GPBFieldDescriptor *field, NSData *value);
 
-/**
- * Gets the value of a string field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a string field.
 NSString *GPBGetMessageStringField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a string field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a string field.
 void GPBSetMessageStringField(GPBMessage *self, GPBFieldDescriptor *field, NSString *value);
 
-/**
- * Gets the value of a message field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a message field.
 GPBMessage *GPBGetMessageMessageField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a message field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a message field.
 void GPBSetMessageMessageField(GPBMessage *self, GPBFieldDescriptor *field, GPBMessage *value);
 
-/**
- * Gets the value of a group field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a group field.
 GPBMessage *GPBGetMessageGroupField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a group field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a group field.
 void GPBSetMessageGroupField(GPBMessage *self, GPBFieldDescriptor *field, GPBMessage *value);
 
-/**
- * Gets the value of a bool field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a bool field.
 BOOL GPBGetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a bool field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a bool field.
 void GPBSetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field, BOOL value);
 
-/**
- * Gets the value of an int32 field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of an int32 field.
 int32_t GPBGetMessageInt32Field(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of an int32 field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of an int32 field.
 void GPBSetMessageInt32Field(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 
-/**
- * Gets the value of an uint32 field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of an uint32 field.
 uint32_t GPBGetMessageUInt32Field(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of an uint32 field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of an uint32 field.
 void GPBSetMessageUInt32Field(GPBMessage *self, GPBFieldDescriptor *field, uint32_t value);
 
-/**
- * Gets the value of an int64 field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of an int64 field.
 int64_t GPBGetMessageInt64Field(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of an int64 field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of an int64 field.
 void GPBSetMessageInt64Field(GPBMessage *self, GPBFieldDescriptor *field, int64_t value);
 
-/**
- * Gets the value of an uint64 field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of an uint64 field.
 uint64_t GPBGetMessageUInt64Field(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of an uint64 field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of an uint64 field.
 void GPBSetMessageUInt64Field(GPBMessage *self, GPBFieldDescriptor *field, uint64_t value);
 
-/**
- * Gets the value of a float field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a float field.
 float GPBGetMessageFloatField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a float field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a float field.
 void GPBSetMessageFloatField(GPBMessage *self, GPBFieldDescriptor *field, float value);
 
-/**
- * Gets the value of a double field.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- **/
+/// Gets the value of a double field.
 double GPBGetMessageDoubleField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a double field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The to set in the field.
- **/
+/// Sets the value of a double field.
 void GPBSetMessageDoubleField(GPBMessage *self, GPBFieldDescriptor *field, double value);
 
-/**
- * Gets the given enum field of a message. For proto3, if the value isn't a
- * member of the enum, @c kGPBUnrecognizedEnumeratorValue will be returned.
- * GPBGetMessageRawEnumField will bypass the check and return whatever value
- * was set.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- *
- * @return The enum value for the given field.
- **/
+/// Get the given enum field of a message. For proto3, if the value isn't a
+/// member of the enum, @c kGPBUnrecognizedEnumeratorValue will be returned.
+/// GPBGetMessageRawEnumField will bypass the check and return whatever value
+/// was set.
 int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Set the given enum field of a message. You can only set values that are
- * members of the enum.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The enum value to set in the field.
- **/
-void GPBSetMessageEnumField(GPBMessage *self,
-                            GPBFieldDescriptor *field,
-                            int32_t value);
-
-/**
- * Get the given enum field of a message. No check is done to ensure the value
- * was defined in the enum.
- *
- * @param self  The message from which to get the field.
- * @param field The field to get.
- *
- * @return The raw enum value for the given field.
- **/
+/// Set the given enum field of a message. You can only set values that are
+/// members of the enum.
+void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
+/// Get the given enum field of a message. No check is done to ensure the value
+/// was defined in the enum.
 int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Set the given enum field of a message. You can set the value to anything,
- * even a value that is not a member of the enum.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param value The raw enum value to set in the field.
- **/
-void GPBSetMessageRawEnumField(GPBMessage *self,
-                               GPBFieldDescriptor *field,
-                               int32_t value);
+/// Set the given enum field of a message. You can set the value to anything,
+/// even a value that is not a member of the enum.
+void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 
 // Repeated Fields
 
-/**
- * Gets the value of a repeated field.
- *
- * @param self  The message from which to get the field.
- * @param field The repeated field to get.
- *
- * @return A GPB*Array or an NSMutableArray based on the field's type.
- **/
+/// Gets the value of a repeated field.
+///
+/// The result will be @c GPB*Array or @c NSMutableArray based on the
+/// field's type.
 id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a repeated field.
- *
- * @param self  The message into which to set the field.
- * @param field The field to set.
- * @param array A GPB*Array or NSMutableArray based on the field's type.
- **/
-void GPBSetMessageRepeatedField(GPBMessage *self,
-                                GPBFieldDescriptor *field,
-                                id array);
+/// Sets the value of a repeated field.
+///
+/// The value should be @c GPB*Array or @c NSMutableArray based on the
+/// field's type.
+void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array);
 
 // Map Fields
 
-/**
- * Gets the value of a map<> field.
- *
- * @param self  The message from which to get the field.
- * @param field The repeated field to get.
- *
- * @return A GPB*Dictionary or NSMutableDictionary based on the field's type.
- **/
+/// Gets the value of a map<> field.
+///
+/// The result will be @c GPB*Dictionary or @c NSMutableDictionary based on
+/// the field's type.
 id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field);
-
-/**
- * Sets the value of a map<> field.
- *
- * @param self       The message into which to set the field.
- * @param field      The field to set.
- * @param dictionary A GPB*Dictionary or NSMutableDictionary based on the
- *                   field's type.
- **/
-void GPBSetMessageMapField(GPBMessage *self,
-                           GPBFieldDescriptor *field,
-                           id dictionary);
+/// Sets the value of a map<> field.
+///
+/// The object should be @c GPB*Dictionary or @c NSMutableDictionary based
+/// on the field's type.
+void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary);
 
 //%PDDM-EXPAND-END GPB_ACCESSORS()
 
-/**
- * Returns an empty NSData to assign to byte fields when you wish to assign them
- * to empty. Prevents allocating a lot of little [NSData data] objects.
- **/
+// Returns an empty NSData to assign to byte fields when you wish
+// to assign them to empty. Prevents allocating a lot of little [NSData data]
+// objects.
 NSData *GPBEmptyNSData(void) __attribute__((pure));
 
-/**
- * Drops the `unknownFields` from the given message and from all sub message.
- **/
-void GPBMessageDropUnknownFieldsRecursively(GPBMessage *message);
-
 NS_ASSUME_NONNULL_END
 
 CF_EXTERN_C_END
@@ -405,7 +189,7 @@
 //%PDDM-DEFINE GPB_ACCESSORS()
 //%
 //%//
-//%// Get/Set a given field from/to a message.
+//%// Get/Set the given field of a message.
 //%//
 //%
 //%// Single Fields
@@ -421,119 +205,53 @@
 //%GPB_ACCESSOR_SINGLE(UInt64, uint64_t, n)
 //%GPB_ACCESSOR_SINGLE(Float, float, )
 //%GPB_ACCESSOR_SINGLE(Double, double, )
-//%/**
-//% * Gets the given enum field of a message. For proto3, if the value isn't a
-//% * member of the enum, @c kGPBUnrecognizedEnumeratorValue will be returned.
-//% * GPBGetMessageRawEnumField will bypass the check and return whatever value
-//% * was set.
-//% *
-//% * @param self  The message from which to get the field.
-//% * @param field The field to get.
-//% *
-//% * @return The enum value for the given field.
-//% **/
+//%/// Get the given enum field of a message. For proto3, if the value isn't a
+//%/// member of the enum, @c kGPBUnrecognizedEnumeratorValue will be returned.
+//%/// GPBGetMessageRawEnumField will bypass the check and return whatever value
+//%/// was set.
 //%int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field);
-//%
-//%/**
-//% * Set the given enum field of a message. You can only set values that are
-//% * members of the enum.
-//% *
-//% * @param self  The message into which to set the field.
-//% * @param field The field to set.
-//% * @param value The enum value to set in the field.
-//% **/
-//%void GPBSetMessageEnumField(GPBMessage *self,
-//%                            GPBFieldDescriptor *field,
-//%                            int32_t value);
-//%
-//%/**
-//% * Get the given enum field of a message. No check is done to ensure the value
-//% * was defined in the enum.
-//% *
-//% * @param self  The message from which to get the field.
-//% * @param field The field to get.
-//% *
-//% * @return The raw enum value for the given field.
-//% **/
+//%/// Set the given enum field of a message. You can only set values that are
+//%/// members of the enum.
+//%void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
+//%/// Get the given enum field of a message. No check is done to ensure the value
+//%/// was defined in the enum.
 //%int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field);
-//%
-//%/**
-//% * Set the given enum field of a message. You can set the value to anything,
-//% * even a value that is not a member of the enum.
-//% *
-//% * @param self  The message into which to set the field.
-//% * @param field The field to set.
-//% * @param value The raw enum value to set in the field.
-//% **/
-//%void GPBSetMessageRawEnumField(GPBMessage *self,
-//%                               GPBFieldDescriptor *field,
-//%                               int32_t value);
+//%/// Set the given enum field of a message. You can set the value to anything,
+//%/// even a value that is not a member of the enum.
+//%void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
 //%
 //%// Repeated Fields
 //%
-//%/**
-//% * Gets the value of a repeated field.
-//% *
-//% * @param self  The message from which to get the field.
-//% * @param field The repeated field to get.
-//% *
-//% * @return A GPB*Array or an NSMutableArray based on the field's type.
-//% **/
+//%/// Gets the value of a repeated field.
+//%///
+//%/// The result will be @c GPB*Array or @c NSMutableArray based on the
+//%/// field's type.
 //%id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field);
-//%
-//%/**
-//% * Sets the value of a repeated field.
-//% *
-//% * @param self  The message into which to set the field.
-//% * @param field The field to set.
-//% * @param array A GPB*Array or NSMutableArray based on the field's type.
-//% **/
-//%void GPBSetMessageRepeatedField(GPBMessage *self,
-//%                                GPBFieldDescriptor *field,
-//%                                id array);
+//%/// Sets the value of a repeated field.
+//%///
+//%/// The value should be @c GPB*Array or @c NSMutableArray based on the
+//%/// field's type.
+//%void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array);
 //%
 //%// Map Fields
 //%
-//%/**
-//% * Gets the value of a map<> field.
-//% *
-//% * @param self  The message from which to get the field.
-//% * @param field The repeated field to get.
-//% *
-//% * @return A GPB*Dictionary or NSMutableDictionary based on the field's type.
-//% **/
+//%/// Gets the value of a map<> field.
+//%///
+//%/// The result will be @c GPB*Dictionary or @c NSMutableDictionary based on
+//%/// the field's type.
 //%id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field);
-//%
-//%/**
-//% * Sets the value of a map<> field.
-//% *
-//% * @param self       The message into which to set the field.
-//% * @param field      The field to set.
-//% * @param dictionary A GPB*Dictionary or NSMutableDictionary based on the
-//% *                   field's type.
-//% **/
-//%void GPBSetMessageMapField(GPBMessage *self,
-//%                           GPBFieldDescriptor *field,
-//%                           id dictionary);
+//%/// Sets the value of a map<> field.
+//%///
+//%/// The object should be @c GPB*Dictionary or @c NSMutableDictionary based
+//%/// on the field's type.
+//%void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary);
 //%
 
 //%PDDM-DEFINE GPB_ACCESSOR_SINGLE(NAME, TYPE, AN)
 //%GPB_ACCESSOR_SINGLE_FULL(NAME, TYPE, AN, )
 //%PDDM-DEFINE GPB_ACCESSOR_SINGLE_FULL(NAME, TYPE, AN, TisP)
-//%/**
-//% * Gets the value of a##AN NAME$L field.
-//% *
-//% * @param self  The message from which to get the field.
-//% * @param field The field to get.
-//% **/
+//%/// Gets the value of a##AN NAME$L field.
 //%TYPE TisP##GPBGetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field);
-//%
-//%/**
-//% * Sets the value of a##AN NAME$L field.
-//% *
-//% * @param self  The message into which to set the field.
-//% * @param field The field to set.
-//% * @param value The to set in the field.
-//% **/
+//%/// Sets the value of a##AN NAME$L field.
 //%void GPBSetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field, TYPE TisP##value);
 //%
diff --git a/objectivec/GPBUtilities.m b/objectivec/GPBUtilities.m
index 5029ec7..447c749 100644
--- a/objectivec/GPBUtilities.m
+++ b/objectivec/GPBUtilities.m
@@ -39,12 +39,6 @@
 #import "GPBUnknownField.h"
 #import "GPBUnknownFieldSet.h"
 
-// Direct access is use for speed, to avoid even internally declaring things
-// read/write, etc. The warning is enabled in the project to ensure code calling
-// protos can turn on -Wdirect-ivar-access without issues.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 static void AppendTextFormatForMessage(GPBMessage *message,
                                        NSMutableString *toStr,
                                        NSString *lineIndent);
@@ -58,169 +52,8 @@
   return defaultNSData;
 }
 
-void GPBMessageDropUnknownFieldsRecursively(GPBMessage *initialMessage) {
-  if (!initialMessage) {
-    return;
-  }
-
-  // Use an array as a list to process to avoid recursion.
-  NSMutableArray *todo = [NSMutableArray arrayWithObject:initialMessage];
-
-  while (todo.count) {
-    GPBMessage *msg = todo.lastObject;
-    [todo removeLastObject];
-
-    // Clear unknowns.
-    msg.unknownFields = nil;
-
-    // Handle the message fields.
-    GPBDescriptor *descriptor = [[msg class] descriptor];
-    for (GPBFieldDescriptor *field in descriptor->fields_) {
-      if (!GPBFieldDataTypeIsMessage(field)) {
-        continue;
-      }
-      switch (field.fieldType) {
-        case GPBFieldTypeSingle:
-          if (GPBGetHasIvarField(msg, field)) {
-            GPBMessage *fieldMessage = GPBGetObjectIvarWithFieldNoAutocreate(msg, field);
-            [todo addObject:fieldMessage];
-          }
-          break;
-
-        case GPBFieldTypeRepeated: {
-          NSArray *fieldMessages = GPBGetObjectIvarWithFieldNoAutocreate(msg, field);
-          if (fieldMessages.count) {
-            [todo addObjectsFromArray:fieldMessages];
-          }
-          break;
-        }
-
-        case GPBFieldTypeMap: {
-          id rawFieldMap = GPBGetObjectIvarWithFieldNoAutocreate(msg, field);
-          switch (field.mapKeyDataType) {
-            case GPBDataTypeBool:
-              [(GPBBoolObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
-                  BOOL key, id _Nonnull object, BOOL * _Nonnull stop) {
-                #pragma unused(key, stop)
-                [todo addObject:object];
-              }];
-              break;
-            case GPBDataTypeFixed32:
-            case GPBDataTypeUInt32:
-              [(GPBUInt32ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
-                  uint32_t key, id _Nonnull object, BOOL * _Nonnull stop) {
-                #pragma unused(key, stop)
-                [todo addObject:object];
-              }];
-              break;
-            case GPBDataTypeInt32:
-            case GPBDataTypeSFixed32:
-            case GPBDataTypeSInt32:
-              [(GPBInt32ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
-                  int32_t key, id _Nonnull object, BOOL * _Nonnull stop) {
-                #pragma unused(key, stop)
-                [todo addObject:object];
-              }];
-              break;
-            case GPBDataTypeFixed64:
-            case GPBDataTypeUInt64:
-              [(GPBUInt64ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
-                  uint64_t key, id _Nonnull object, BOOL * _Nonnull stop) {
-                #pragma unused(key, stop)
-                [todo addObject:object];
-              }];
-              break;
-            case GPBDataTypeInt64:
-            case GPBDataTypeSFixed64:
-            case GPBDataTypeSInt64:
-              [(GPBInt64ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
-                  int64_t key, id _Nonnull object, BOOL * _Nonnull stop) {
-                #pragma unused(key, stop)
-                [todo addObject:object];
-              }];
-              break;
-            case GPBDataTypeString:
-              [(NSDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
-                  NSString * _Nonnull key, GPBMessage * _Nonnull obj, BOOL * _Nonnull stop) {
-                #pragma unused(key, stop)
-                [todo addObject:obj];
-              }];
-              break;
-            case GPBDataTypeFloat:
-            case GPBDataTypeDouble:
-            case GPBDataTypeEnum:
-            case GPBDataTypeBytes:
-            case GPBDataTypeGroup:
-            case GPBDataTypeMessage:
-              NSCAssert(NO, @"Aren't valid key types.");
-          }
-          break;
-        }  // switch(field.mapKeyDataType)
-      }  // switch(field.fieldType)
-    }  // for(fields)
-
-    // Handle any extensions holding messages.
-    for (GPBExtensionDescriptor *extension in [msg extensionsCurrentlySet]) {
-      if (!GPBDataTypeIsMessage(extension.dataType)) {
-        continue;
-      }
-      if (extension.isRepeated) {
-        NSArray *extMessages = [msg getExtension:extension];
-        [todo addObjectsFromArray:extMessages];
-      } else {
-        GPBMessage *extMessage = [msg getExtension:extension];
-        [todo addObject:extMessage];
-      }
-    }  // for(extensionsCurrentlySet)
-
-  }  // while(todo.count)
-}
-
-
-// -- About Version Checks --
-// There's actually 3 places these checks all come into play:
-// 1. When the generated source is compile into .o files, the header check
-//    happens. This is checking the protoc used matches the library being used
-//    when making the .o.
-// 2. Every place a generated proto header is included in a developer's code,
-//    the header check comes into play again. But this time it is checking that
-//    the current library headers being used still support/match the ones for
-//    the generated code.
-// 3. At runtime the final check here (GPBCheckRuntimeVersionsInternal), is
-//    called from the generated code passing in values captured when the
-//    generated code's .o was made. This checks that at runtime the generated
-//    code and runtime library match.
-
-void GPBCheckRuntimeVersionSupport(int32_t objcRuntimeVersion) {
-  // NOTE: This is passing the value captured in the compiled code to check
-  // against the values captured when the runtime support was compiled. This
-  // ensures the library code isn't in a different framework/library that
-  // was generated with a non matching version.
-  if (GOOGLE_PROTOBUF_OBJC_VERSION < objcRuntimeVersion) {
-    // Library is too old for headers.
-    [NSException raise:NSInternalInconsistencyException
-                format:@"Linked to ProtocolBuffer runtime version %d,"
-                       @" but code compiled needing atleast %d!",
-                       GOOGLE_PROTOBUF_OBJC_VERSION, objcRuntimeVersion];
-  }
-  if (objcRuntimeVersion < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION) {
-    // Headers are too old for library.
-    [NSException raise:NSInternalInconsistencyException
-                format:@"Proto generation source compiled against runtime"
-                       @" version %d, but this version of the runtime only"
-                       @" supports back to %d!",
-                       objcRuntimeVersion,
-                       GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION];
-  }
-}
-
-// This api is no longer used for version checks. 30001 is the last version
-// using this old versioning model. When that support is removed, this function
-// can be removed (along with the declaration in GPBUtilities_PackagePrivate.h).
 void GPBCheckRuntimeVersionInternal(int32_t version) {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION == 30001,
-                           time_to_remove_this_old_version_shim);
-  if (version != GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION) {
+  if (version != GOOGLE_PROTOBUF_OBJC_GEN_VERSION) {
     [NSException raise:NSInternalInconsistencyException
                 format:@"Linked to ProtocolBuffer runtime version %d,"
                        @" but code compiled with version %d!",
@@ -379,10 +212,9 @@
 //%  TYPE *typePtr = (TYPE *)&storage[field->description_->offset];
 //%  *typePtr = value;
 //%  // proto2: any value counts as having been set; proto3, it
-//%  // has to be a non zero value or be in a oneof.
-//%  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-//%                   || (value != (TYPE)0)
-//%                   || (field->containingOneof_ != NULL));
+//%  // has to be a non zero value.
+//%  BOOL hasValue =
+//%    (syntax == GPBFileSyntaxProto2) || (value != (TYPE)0);
 //%  GPBSetHasIvarField(self, field, hasValue);
 //%  GPBBecomeVisibleToAutocreator(self);
 //%}
@@ -499,19 +331,8 @@
     // zero, they are being cleared.
     if ((syntax == GPBFileSyntaxProto3) && !fieldIsMessage &&
         ([value length] == 0)) {
-      // Except, if the field was in a oneof, then it still gets recorded as
-      // having been set so the state of the oneof can be serialized back out.
-      if (!oneof) {
-        setHasValue = NO;
-      }
-      if (setHasValue) {
-        NSCAssert(value != nil, @"Should never be setting has for nil");
-      } else {
-        // The value passed in was retained, it must be released since we
-        // aren't saving anything in the field.
-        [value release];
-        value = nil;
-      }
+      setHasValue = NO;
+      value = nil;
     }
     GPBSetHasIvarField(self, field, setHasValue);
   }
@@ -527,11 +348,9 @@
       if (field.fieldType == GPBFieldTypeRepeated) {
         // If the old array was autocreated by us, then clear it.
         if (GPBDataTypeIsObject(fieldType)) {
-          if ([oldValue isKindOfClass:[GPBAutocreatedArray class]]) {
-            GPBAutocreatedArray *autoArray = oldValue;
-            if (autoArray->_autocreator == self) {
-              autoArray->_autocreator = nil;
-            }
+          GPBAutocreatedArray *autoArray = oldValue;
+          if (autoArray->_autocreator == self) {
+            autoArray->_autocreator = nil;
           }
         } else {
           // Type doesn't matter, it is a GPB*Array.
@@ -544,11 +363,9 @@
         // If the old map was autocreated by us, then clear it.
         if ((field.mapKeyDataType == GPBDataTypeString) &&
             GPBDataTypeIsObject(fieldType)) {
-          if ([oldValue isKindOfClass:[GPBAutocreatedDictionary class]]) {
-            GPBAutocreatedDictionary *autoDict = oldValue;
-            if (autoDict->_autocreator == self) {
-              autoDict->_autocreator = nil;
-            }
+          GPBAutocreatedDictionary *autoDict = oldValue;
+          if (autoDict->_autocreator == self) {
+            autoDict->_autocreator = nil;
           }
         } else {
           // Type doesn't matter, it is a GPB*Dictionary.
@@ -701,10 +518,9 @@
   GPBSetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number, value);
 
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (BOOL)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (BOOL)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -751,10 +567,9 @@
   int32_t *typePtr = (int32_t *)&storage[field->description_->offset];
   *typePtr = value;
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (int32_t)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (int32_t)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -801,10 +616,9 @@
   uint32_t *typePtr = (uint32_t *)&storage[field->description_->offset];
   *typePtr = value;
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (uint32_t)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (uint32_t)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -851,10 +665,9 @@
   int64_t *typePtr = (int64_t *)&storage[field->description_->offset];
   *typePtr = value;
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (int64_t)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (int64_t)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -901,10 +714,9 @@
   uint64_t *typePtr = (uint64_t *)&storage[field->description_->offset];
   *typePtr = value;
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (uint64_t)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (uint64_t)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -951,10 +763,9 @@
   float *typePtr = (float *)&storage[field->description_->offset];
   *typePtr = value;
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (float)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (float)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -1001,10 +812,9 @@
   double *typePtr = (double *)&storage[field->description_->offset];
   *typePtr = value;
   // proto2: any value counts as having been set; proto3, it
-  // has to be a non zero value or be in a oneof.
-  BOOL hasValue = ((syntax == GPBFileSyntaxProto2)
-                   || (value != (double)0)
-                   || (field->containingOneof_ != NULL));
+  // has to be a non zero value.
+  BOOL hasValue =
+    (syntax == GPBFileSyntaxProto2) || (value != (double)0);
   GPBSetHasIvarField(self, field, hasValue);
   GPBBecomeVisibleToAutocreator(self);
 }
@@ -1079,11 +889,21 @@
 
 //%PDDM-EXPAND-END (4 expansions)
 
-// GPBGetMessageRepeatedField is defined in GPBMessage.m
+// Only exists for public api, no core code should use this.
+id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field) {
+#if DEBUG
+  if (field.fieldType != GPBFieldTypeRepeated) {
+    [NSException raise:NSInvalidArgumentException
+                format:@"%@.%@ is not a repeated field.",
+                       [self class], field.name];
+  }
+#endif
+  return GPBGetObjectIvarWithField(self, field);
+}
 
 // Only exists for public api, no core code should use this.
 void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id array) {
-#if defined(DEBUG) && DEBUG
+#if DEBUG
   if (field.fieldType != GPBFieldTypeRepeated) {
     [NSException raise:NSInvalidArgumentException
                 format:@"%@.%@ is not a repeated field.",
@@ -1122,10 +942,10 @@
     case GPBDataTypeString:
     case GPBDataTypeMessage:
     case GPBDataTypeGroup:
-      expectedClass = [NSMutableArray class];
+      expectedClass = [NSMutableDictionary class];
       break;
     case GPBDataTypeEnum:
-      expectedClass = [GPBEnumArray class];
+      expectedClass = [GPBBoolArray class];
       break;
   }
   if (array && ![array isKindOfClass:expectedClass]) {
@@ -1137,7 +957,7 @@
   GPBSetObjectIvarWithField(self, field, array);
 }
 
-#if defined(DEBUG) && DEBUG
+#if DEBUG
 static NSString *TypeToStr(GPBDataType dataType) {
   switch (dataType) {
     case GPBDataTypeBool:
@@ -1171,12 +991,22 @@
 }
 #endif
 
-// GPBGetMessageMapField is defined in GPBMessage.m
+// Only exists for public api, no core code should use this.
+id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field) {
+#if DEBUG
+  if (field.fieldType != GPBFieldTypeMap) {
+    [NSException raise:NSInvalidArgumentException
+                format:@"%@.%@ is not a map<> field.",
+                       [self class], field.name];
+  }
+#endif
+  return GPBGetObjectIvarWithField(self, field);
+}
 
 // Only exists for public api, no core code should use this.
 void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field,
                            id dictionary) {
-#if defined(DEBUG) && DEBUG
+#if DEBUG
   if (field.fieldType != GPBFieldTypeMap) {
     [NSException raise:NSInvalidArgumentException
                 format:@"%@.%@ is not a map<> field.",
@@ -1236,15 +1066,7 @@
       case '\'': [destStr appendString:@"\\\'"]; break;
       case '\\': [destStr appendString:@"\\\\"]; break;
       default:
-        // This differs slightly from the C++ code in that the C++ doesn't
-        // generate UTF8; it looks at the string in UTF8, but escapes every
-        // byte > 0x7E.
-        if (aChar < 0x20) {
-          [destStr appendFormat:@"\\%d%d%d",
-                                (aChar / 64), ((aChar % 64) / 8), (aChar % 8)];
-        } else {
-          [destStr appendFormat:@"%C", aChar];
-        }
+        [destStr appendFormat:@"%C", aChar];
         break;
     }
   }
@@ -1311,8 +1133,6 @@
       [toStr appendString:@"\n"];
 
       [toStr appendString:valueLine];
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wswitch-enum"
       switch (valueDataType) {
         case GPBDataTypeString:
           AppendStringEscaped(value, toStr);
@@ -1333,7 +1153,6 @@
           NSCAssert(NO, @"Can't happen");
           break;
       }
-#pragma clang diagnostic pop
       [toStr appendString:@"\n"];
 
       [toStr appendString:msgEnd];
@@ -1355,8 +1174,6 @@
       }
 
       [toStr appendString:valueLine];
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wswitch-enum"
       switch (valueDataType) {
         case GPBDataTypeString:
           AppendStringEscaped(valueObj, toStr);
@@ -1394,7 +1211,6 @@
           [toStr appendString:valueObj];
           break;
       }
-#pragma clang diagnostic pop
       [toStr appendString:@"\n"];
 
       [toStr appendString:msgEnd];
@@ -1664,8 +1480,7 @@
   NSUInteger fieldCount = fieldsArray.count;
   const GPBExtensionRange *extensionRanges = descriptor.extensionRanges;
   NSUInteger extensionRangesCount = descriptor.extensionRangesCount;
-  NSArray *activeExtensions = [[message extensionsCurrentlySet]
-      sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
+  NSArray *activeExtensions = [message sortedExtensionsInUse];
   for (NSUInteger i = 0, j = 0; i < fieldCount || j < extensionRangesCount;) {
     if (i == fieldCount) {
       AppendTextFormatForMessageExtensionRange(
@@ -1891,27 +1706,6 @@
   return result;
 }
 
-#pragma clang diagnostic pop
-
-BOOL GPBClassHasSel(Class aClass, SEL sel) {
-  // NOTE: We have to use class_copyMethodList, all other runtime method
-  // lookups actually also resolve the method implementation and this
-  // is called from within those methods.
-
-  BOOL result = NO;
-  unsigned int methodCount = 0;
-  Method *methodList = class_copyMethodList(aClass, &methodCount);
-  for (unsigned int i = 0; i < methodCount; ++i) {
-    SEL methodSelector = method_getName(methodList[i]);
-    if (methodSelector == sel) {
-      result = YES;
-      break;
-    }
-  }
-  free(methodList);
-  return result;
-}
-
 #pragma mark - GPBMessageSignatureProtocol
 
 // A series of selectors that are used solely to get @encoding values
diff --git a/objectivec/GPBUtilities_PackagePrivate.h b/objectivec/GPBUtilities_PackagePrivate.h
index 16859d4..a6b6c84 100644
--- a/objectivec/GPBUtilities_PackagePrivate.h
+++ b/objectivec/GPBUtilities_PackagePrivate.h
@@ -50,20 +50,9 @@
 
 // These two are used to inject a runtime check for version mismatch into the
 // generated sources to make sure they are linked with a supporting runtime.
-void GPBCheckRuntimeVersionSupport(int32_t objcRuntimeVersion);
-GPB_INLINE void GPB_DEBUG_CHECK_RUNTIME_VERSIONS() {
-  // NOTE: By being inline here, this captures the value from the library's
-  // headers at the time the generated code was compiled.
-#if defined(DEBUG) && DEBUG
-  GPBCheckRuntimeVersionSupport(GOOGLE_PROTOBUF_OBJC_VERSION);
-#endif
-}
-
-// Legacy version of the checks, remove when GOOGLE_PROTOBUF_OBJC_GEN_VERSION
-// goes away (see more info in GPBBootstrap.h).
 void GPBCheckRuntimeVersionInternal(int32_t version);
 GPB_INLINE void GPBDebugCheckRuntimeVersion() {
-#if defined(DEBUG) && DEBUG
+#if DEBUG
   GPBCheckRuntimeVersionInternal(GOOGLE_PROTOBUF_OBJC_GEN_VERSION);
 #endif
 }
@@ -107,7 +96,7 @@
 // negative values must be sign-extended to 64 bits to be varint encoded,
 // thus always taking 10 bytes on the wire.)
 GPB_INLINE int32_t GPBDecodeZigZag32(uint32_t n) {
-  return (int32_t)(GPBLogicalRightShift32((int32_t)n, 1) ^ -((int32_t)(n) & 1));
+  return GPBLogicalRightShift32(n, 1) ^ -(n & 1);
 }
 
 // Decode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers
@@ -115,7 +104,7 @@
 // negative values must be sign-extended to 64 bits to be varint encoded,
 // thus always taking 10 bytes on the wire.)
 GPB_INLINE int64_t GPBDecodeZigZag64(uint64_t n) {
-  return (int64_t)(GPBLogicalRightShift64((int64_t)n, 1) ^ -((int64_t)(n) & 1));
+  return GPBLogicalRightShift64(n, 1) ^ -(n & 1);
 }
 
 // Encode a ZigZag-encoded 32-bit value.  ZigZag encodes signed integers
@@ -124,7 +113,7 @@
 // thus always taking 10 bytes on the wire.)
 GPB_INLINE uint32_t GPBEncodeZigZag32(int32_t n) {
   // Note:  the right-shift must be arithmetic
-  return (uint32_t)((n << 1) ^ (n >> 31));
+  return (n << 1) ^ (n >> 31);
 }
 
 // Encode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers
@@ -133,13 +122,9 @@
 // thus always taking 10 bytes on the wire.)
 GPB_INLINE uint64_t GPBEncodeZigZag64(int64_t n) {
   // Note:  the right-shift must be arithmetic
-  return (uint64_t)((n << 1) ^ (n >> 63));
+  return (n << 1) ^ (n >> 63);
 }
 
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wswitch-enum"
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-
 GPB_INLINE BOOL GPBDataTypeIsObject(GPBDataType type) {
   switch (type) {
     case GPBDataTypeBytes:
@@ -202,8 +187,6 @@
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
                         int32_t oneofHasIndex, uint32_t fieldNumberNotToClear);
 
-#pragma clang diagnostic pop
-
 //%PDDM-DEFINE GPB_IVAR_SET_DECL(NAME, TYPE)
 //%void GPBSet##NAME##IvarWithFieldInternal(GPBMessage *self,
 //%            NAME$S                     GPBFieldDescriptor *field,
@@ -345,6 +328,4 @@
 + (id)getClassValue;
 @end
 
-BOOL GPBClassHasSel(Class aClass, SEL sel);
-
 CF_EXTERN_C_END
diff --git a/objectivec/GPBWellKnownTypes.h b/objectivec/GPBWellKnownTypes.h
index 04df417..28442fb 100644
--- a/objectivec/GPBWellKnownTypes.h
+++ b/objectivec/GPBWellKnownTypes.h
@@ -30,216 +30,23 @@
 
 #import <Foundation/Foundation.h>
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Any.pbobjc.h>
- #import <Protobuf/Duration.pbobjc.h>
- #import <Protobuf/Timestamp.pbobjc.h>
-#else
- #import "google/protobuf/Any.pbobjc.h"
- #import "google/protobuf/Duration.pbobjc.h"
- #import "google/protobuf/Timestamp.pbobjc.h"
-#endif
+#import "google/protobuf/Duration.pbobjc.h"
+#import "google/protobuf/Timestamp.pbobjc.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
-#pragma mark - Errors
-
-/** NSError domain used for errors. */
-extern NSString *const GPBWellKnownTypesErrorDomain;
-
-/** Error code for NSError with GPBWellKnownTypesErrorDomain. */
-typedef NS_ENUM(NSInteger, GPBWellKnownTypesErrorCode) {
-  /** The type_url could not be computed for the requested GPBMessage class. */
-  GPBWellKnownTypesErrorCodeFailedToComputeTypeURL = -100,
-  /** type_url in a Any doesn’t match that of the requested GPBMessage class. */
-  GPBWellKnownTypesErrorCodeTypeURLMismatch = -101,
-};
-
-#pragma mark - GPBTimestamp
-
-/**
- * Category for GPBTimestamp to work with standard Foundation time/date types.
- **/
+// Extension to GPBTimestamp to work with standard Foundation time/date types.
 @interface GPBTimestamp (GBPWellKnownTypes)
-
-/** The NSDate representation of this GPBTimestamp. */
 @property(nonatomic, readwrite, strong) NSDate *date;
-
-/**
- * The NSTimeInterval representation of this GPBTimestamp.
- *
- * @note: Not all second/nanos combinations can be represented in a
- * NSTimeInterval, so getting this could be a lossy transform.
- **/
 @property(nonatomic, readwrite) NSTimeInterval timeIntervalSince1970;
-
-/**
- * Initializes a GPBTimestamp with the given NSDate.
- *
- * @param date The date to configure the GPBTimestamp with.
- *
- * @return A newly initialized GPBTimestamp.
- **/
 - (instancetype)initWithDate:(NSDate *)date;
-
-/**
- * Initializes a GPBTimestamp with the given NSTimeInterval.
- *
- * @param timeIntervalSince1970 Time interval to configure the GPBTimestamp with.
- *
- * @return A newly initialized GPBTimestamp.
- **/
 - (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970;
-
 @end
 
-#pragma mark - GPBDuration
-
-/**
- * Category for GPBDuration to work with standard Foundation time type.
- **/
+// Extension to GPBDuration to work with standard Foundation time type.
 @interface GPBDuration (GBPWellKnownTypes)
-
-/**
- * The NSTimeInterval representation of this GPBDuration.
- *
- * @note: Not all second/nanos combinations can be represented in a
- * NSTimeInterval, so getting this could be a lossy transform.
- **/
-@property(nonatomic, readwrite) NSTimeInterval timeInterval;
-
-/**
- * Initializes a GPBDuration with the given NSTimeInterval.
- *
- * @param timeInterval Time interval to configure the GPBDuration with.
- *
- * @return A newly initialized GPBDuration.
- **/
-- (instancetype)initWithTimeInterval:(NSTimeInterval)timeInterval;
-
-// These next two methods are deprecated because GBPDuration has no need of a
-// "base" time. The older methods were about symmetry with GBPTimestamp, but
-// the unix epoch usage is too confusing.
-
-/** Deprecated, use timeInterval instead. */
-@property(nonatomic, readwrite) NSTimeInterval timeIntervalSince1970
-    __attribute__((deprecated("Use timeInterval")));
-/** Deprecated, use initWithTimeInterval: instead. */
-- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970
-    __attribute__((deprecated("Use initWithTimeInterval:")));
-
-@end
-
-#pragma mark - GPBAny
-
-/**
- * Category for GPBAny to help work with the message within the object.
- **/
-@interface GPBAny (GBPWellKnownTypes)
-
-/**
- * Convenience method to create a GPBAny containing the serialized message.
- * This uses type.googleapis.com/ as the type_url's prefix.
- *
- * @param message  The message to be packed into the GPBAny.
- * @param errorPtr Pointer to an error that will be populated if something goes
- *                 wrong.
- *
- * @return A newly configured GPBAny with the given message, or nil on failure.
- */
-+ (nullable instancetype)anyWithMessage:(nonnull GPBMessage *)message
-                                  error:(NSError **)errorPtr;
-
-/**
- * Convenience method to create a GPBAny containing the serialized message.
- *
- * @param message       The message to be packed into the GPBAny.
- * @param typeURLPrefix The URL prefix to apply for type_url.
- * @param errorPtr      Pointer to an error that will be populated if something
- *                      goes wrong.
- *
- * @return A newly configured GPBAny with the given message, or nil on failure.
- */
-+ (nullable instancetype)anyWithMessage:(nonnull GPBMessage *)message
-                          typeURLPrefix:(nonnull NSString *)typeURLPrefix
-                                  error:(NSError **)errorPtr;
-
-/**
- * Initializes a GPBAny to contain the serialized message. This uses
- * type.googleapis.com/ as the type_url's prefix.
- *
- * @param message  The message to be packed into the GPBAny.
- * @param errorPtr Pointer to an error that will be populated if something goes
- *                 wrong.
- *
- * @return A newly configured GPBAny with the given message, or nil on failure.
- */
-- (nullable instancetype)initWithMessage:(nonnull GPBMessage *)message
-                                   error:(NSError **)errorPtr;
-
-/**
- * Initializes a GPBAny to contain the serialized message.
- *
- * @param message       The message to be packed into the GPBAny.
- * @param typeURLPrefix The URL prefix to apply for type_url.
- * @param errorPtr      Pointer to an error that will be populated if something
- *                      goes wrong.
- *
- * @return A newly configured GPBAny with the given message, or nil on failure.
- */
-- (nullable instancetype)initWithMessage:(nonnull GPBMessage *)message
-                           typeURLPrefix:(nonnull NSString *)typeURLPrefix
-                                   error:(NSError **)errorPtr;
-
-/**
- * Packs the serialized message into this GPBAny. This uses
- * type.googleapis.com/ as the type_url's prefix.
- *
- * @param message  The message to be packed into the GPBAny.
- * @param errorPtr Pointer to an error that will be populated if something goes
- *                 wrong.
- *
- * @return Whether the packing was successful or not.
- */
-- (BOOL)packWithMessage:(nonnull GPBMessage *)message
-                  error:(NSError **)errorPtr;
-
-/**
- * Packs the serialized message into this GPBAny.
- *
- * @param message       The message to be packed into the GPBAny.
- * @param typeURLPrefix The URL prefix to apply for type_url.
- * @param errorPtr      Pointer to an error that will be populated if something
- *                      goes wrong.
- *
- * @return Whether the packing was successful or not.
- */
-- (BOOL)packWithMessage:(nonnull GPBMessage *)message
-          typeURLPrefix:(nonnull NSString *)typeURLPrefix
-                  error:(NSError **)errorPtr;
-
-/**
- * Unpacks the serialized message as if it was an instance of the given class.
- *
- * @note When checking type_url, the base URL is not checked, only the fully
- *       qualified name.
- *
- * @param messageClass The class to use to deserialize the contained message.
- * @param errorPtr     Pointer to an error that will be populated if something
- *                     goes wrong.
- *
- * @return An instance of the given class populated with the contained data, or
- *         nil on failure.
- */
-- (nullable GPBMessage *)unpackMessageClass:(Class)messageClass
-                                      error:(NSError **)errorPtr;
-
+@property(nonatomic, readwrite) NSTimeInterval timeIntervalSince1970;
+- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970;
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/objectivec/GPBWellKnownTypes.m b/objectivec/GPBWellKnownTypes.m
index 2808afe..fe02f5d 100644
--- a/objectivec/GPBWellKnownTypes.m
+++ b/objectivec/GPBWellKnownTypes.m
@@ -32,63 +32,24 @@
 // the static library. If these were compiled separately, the category methods
 // below would be stripped by the linker.
 
+#import "google/protobuf/Timestamp.pbobjc.m"
+#import "google/protobuf/Duration.pbobjc.m"
 #import "GPBWellKnownTypes.h"
 
-#import "GPBUtilities_PackagePrivate.h"
-
-NSString *const GPBWellKnownTypesErrorDomain =
-    GPBNSStringifySymbol(GPBWellKnownTypesErrorDomain);
-
-static NSString *kTypePrefixGoogleApisCom = @"type.googleapis.com/";
-
-static NSTimeInterval TimeIntervalFromSecondsAndNanos(int64_t seconds,
-                                                      int32_t nanos) {
+static NSTimeInterval TimeIntervalSince1970FromSecondsAndNanos(int64_t seconds,
+                                                               int32_t nanos) {
   return seconds + (NSTimeInterval)nanos / 1e9;
 }
 
-static int32_t SecondsAndNanosFromTimeInterval(NSTimeInterval time,
-                                               int64_t *outSeconds,
-                                               BOOL nanosMustBePositive) {
+static int32_t SecondsAndNanosFromTimeIntervalSince1970(NSTimeInterval time,
+                                                        int64_t *outSeconds) {
   NSTimeInterval seconds;
   NSTimeInterval nanos = modf(time, &seconds);
-
-  if (nanosMustBePositive && (nanos < 0)) {
-    // Per Timestamp.proto, nanos is non-negative and "Negative second values with
-    // fractions must still have non-negative nanos values that count forward in
-    // time. Must be from 0 to 999,999,999 inclusive."
-    --seconds;
-    nanos = 1.0 + nanos;
-  }
-
   nanos *= 1e9;
   *outSeconds = (int64_t)seconds;
   return (int32_t)nanos;
 }
 
-static NSString *BuildTypeURL(NSString *typeURLPrefix, NSString *fullName) {
-  if (typeURLPrefix.length == 0) {
-    return fullName;
-  }
-
-  if ([typeURLPrefix hasSuffix:@"/"]) {
-    return [typeURLPrefix stringByAppendingString:fullName];
-  }
-
-  return [NSString stringWithFormat:@"%@/%@", typeURLPrefix, fullName];
-}
-
-static NSString *ParseTypeFromURL(NSString *typeURLString) {
-  NSRange range = [typeURLString rangeOfString:@"/" options:NSBackwardsSearch];
-  if ((range.location == NSNotFound) ||
-      (NSMaxRange(range) == typeURLString.length)) {
-    return nil;
-  }
-  NSString *result = [typeURLString substringFromIndex:range.location + 1];
-  return result;
-}
-
-#pragma mark - GPBTimestamp
-
 @implementation GPBTimestamp (GBPWellKnownTypes)
 
 - (instancetype)initWithDate:(NSDate *)date {
@@ -98,8 +59,8 @@
 - (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
   if ((self = [super init])) {
     int64_t seconds;
-    int32_t nanos = SecondsAndNanosFromTimeInterval(
-        timeIntervalSince1970, &seconds, YES);
+    int32_t nanos = SecondsAndNanosFromTimeIntervalSince1970(
+        timeIntervalSince1970, &seconds);
     self.seconds = seconds;
     self.nanos = nanos;
   }
@@ -115,158 +76,42 @@
 }
 
 - (NSTimeInterval)timeIntervalSince1970 {
-  return TimeIntervalFromSecondsAndNanos(self.seconds, self.nanos);
+  return TimeIntervalSince1970FromSecondsAndNanos(self.seconds, self.nanos);
 }
 
 - (void)setTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
   int64_t seconds;
   int32_t nanos =
-      SecondsAndNanosFromTimeInterval(timeIntervalSince1970, &seconds, YES);
+      SecondsAndNanosFromTimeIntervalSince1970(timeIntervalSince1970, &seconds);
   self.seconds = seconds;
   self.nanos = nanos;
 }
 
 @end
 
-#pragma mark - GPBDuration
-
 @implementation GPBDuration (GBPWellKnownTypes)
 
-- (instancetype)initWithTimeInterval:(NSTimeInterval)timeInterval {
+- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
   if ((self = [super init])) {
     int64_t seconds;
-    int32_t nanos = SecondsAndNanosFromTimeInterval(
-        timeInterval, &seconds, NO);
+    int32_t nanos = SecondsAndNanosFromTimeIntervalSince1970(
+        timeIntervalSince1970, &seconds);
     self.seconds = seconds;
     self.nanos = nanos;
   }
   return self;
 }
 
-- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
-  return [self initWithTimeInterval:timeIntervalSince1970];
-}
-
-- (NSTimeInterval)timeInterval {
-  return TimeIntervalFromSecondsAndNanos(self.seconds, self.nanos);
-}
-
-- (void)setTimeInterval:(NSTimeInterval)timeInterval {
-  int64_t seconds;
-  int32_t nanos =
-      SecondsAndNanosFromTimeInterval(timeInterval, &seconds, NO);
-  self.seconds = seconds;
-  self.nanos = nanos;
-}
-
 - (NSTimeInterval)timeIntervalSince1970 {
-  return self.timeInterval;
+  return TimeIntervalSince1970FromSecondsAndNanos(self.seconds, self.nanos);
 }
 
 - (void)setTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
-  self.timeInterval = timeIntervalSince1970;
-}
-
-@end
-
-#pragma mark - GPBAny
-
-@implementation GPBAny (GBPWellKnownTypes)
-
-+ (instancetype)anyWithMessage:(GPBMessage *)message
-                         error:(NSError **)errorPtr {
-  return [self anyWithMessage:message
-                typeURLPrefix:kTypePrefixGoogleApisCom
-                        error:errorPtr];
-}
-
-+ (instancetype)anyWithMessage:(GPBMessage *)message
-                 typeURLPrefix:(NSString *)typeURLPrefix
-                         error:(NSError **)errorPtr {
-  return [[[self alloc] initWithMessage:message
-                          typeURLPrefix:typeURLPrefix
-                                  error:errorPtr] autorelease];
-}
-
-- (instancetype)initWithMessage:(GPBMessage *)message
-                          error:(NSError **)errorPtr {
-  return [self initWithMessage:message
-                 typeURLPrefix:kTypePrefixGoogleApisCom
-                         error:errorPtr];
-}
-
-- (instancetype)initWithMessage:(GPBMessage *)message
-                  typeURLPrefix:(NSString *)typeURLPrefix
-                          error:(NSError **)errorPtr {
-  self = [self init];
-  if (self) {
-    if (![self packWithMessage:message
-                 typeURLPrefix:typeURLPrefix
-                         error:errorPtr]) {
-      [self release];
-      self = nil;
-    }
-  }
-  return self;
-}
-
-- (BOOL)packWithMessage:(GPBMessage *)message
-                  error:(NSError **)errorPtr {
-  return [self packWithMessage:message
-                 typeURLPrefix:kTypePrefixGoogleApisCom
-                         error:errorPtr];
-}
-
-- (BOOL)packWithMessage:(GPBMessage *)message
-          typeURLPrefix:(NSString *)typeURLPrefix
-                  error:(NSError **)errorPtr {
-  NSString *fullName = [message descriptor].fullName;
-  if (fullName.length == 0) {
-    if (errorPtr) {
-      *errorPtr =
-          [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
-                              code:GPBWellKnownTypesErrorCodeFailedToComputeTypeURL
-                          userInfo:nil];
-    }
-    return NO;
-  }
-  if (errorPtr) {
-    *errorPtr = nil;
-  }
-  self.typeURL = BuildTypeURL(typeURLPrefix, fullName);
-  self.value = message.data;
-  return YES;
-}
-
-- (GPBMessage *)unpackMessageClass:(Class)messageClass
-                             error:(NSError **)errorPtr {
-  NSString *fullName = [messageClass descriptor].fullName;
-  if (fullName.length == 0) {
-    if (errorPtr) {
-      *errorPtr =
-          [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
-                              code:GPBWellKnownTypesErrorCodeFailedToComputeTypeURL
-                      userInfo:nil];
-    }
-    return nil;
-  }
-
-  NSString *expectedFullName = ParseTypeFromURL(self.typeURL);
-  if ((expectedFullName == nil) || ![expectedFullName isEqual:fullName]) {
-    if (errorPtr) {
-      *errorPtr =
-          [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
-                              code:GPBWellKnownTypesErrorCodeTypeURLMismatch
-                          userInfo:nil];
-    }
-    return nil;
-  }
-
-  // Any is proto3, which means no extensions, so this assumes anything put
-  // within an any also won't need extensions. A second helper could be added
-  // if needed.
-  return [messageClass parseFromData:self.value
-                               error:errorPtr];
+  int64_t seconds;
+  int32_t nanos =
+      SecondsAndNanosFromTimeIntervalSince1970(timeIntervalSince1970, &seconds);
+  self.seconds = seconds;
+  self.nanos = nanos;
 }
 
 @end
diff --git a/objectivec/GPBWireFormat.h b/objectivec/GPBWireFormat.h
index c5941a3..29cf2f0 100644
--- a/objectivec/GPBWireFormat.h
+++ b/objectivec/GPBWireFormat.h
@@ -53,7 +53,6 @@
     __attribute__((const));
 GPBWireFormat GPBWireFormatGetTagWireType(uint32_t tag) __attribute__((const));
 uint32_t GPBWireFormatGetTagFieldNumber(uint32_t tag) __attribute__((const));
-BOOL GPBWireFormatIsValidTag(uint32_t tag) __attribute__((const));
 
 GPBWireFormat GPBWireFormatForType(GPBDataType dataType, BOOL isPacked)
     __attribute__((const));
diff --git a/objectivec/GPBWireFormat.m b/objectivec/GPBWireFormat.m
index 860a339..193235d 100644
--- a/objectivec/GPBWireFormat.m
+++ b/objectivec/GPBWireFormat.m
@@ -49,13 +49,6 @@
   return GPBLogicalRightShift32(tag, GPBWireFormatTagTypeBits);
 }
 
-BOOL GPBWireFormatIsValidTag(uint32_t tag) {
-  uint32_t formatBits = (tag & GPBWireFormatTagTypeMask);
-  // The valid GPBWireFormat* values are 0-5, anything else is not a valid tag.
-  BOOL result = (formatBits <= 5);
-  return result;
-}
-
 GPBWireFormat GPBWireFormatForType(GPBDataType type, BOOL isPacked) {
   if (isPacked) {
     return GPBWireFormatLengthDelimited;
diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
index 266b05a..3093425 100644
--- a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
@@ -23,6 +23,7 @@
 		8B4248D21A927E1500BC1EC6 /* GPBWellKnownTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248D01A927E1500BC1EC6 /* GPBWellKnownTypes.m */; };
 		8B4248DC1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248DB1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m */; };
 		8B79657B14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
+		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
 		8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
@@ -52,13 +53,9 @@
 		F4487C751AADF7F500531423 /* GPBMessageTests+Runtime.m in Sources */ = {isa = PBXBuildFile; fileRef = F4487C741AADF7F500531423 /* GPBMessageTests+Runtime.m */; };
 		F4487C7F1AAF62CD00531423 /* GPBMessageTests+Serialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F4487C7E1AAF62CD00531423 /* GPBMessageTests+Serialization.m */; };
 		F4487C831AAF6AB300531423 /* GPBMessageTests+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */; };
-		F4584D821ECCB52A00803AB6 /* GPBExtensionRegistryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = F4584D7E1ECCB38900803AB6 /* GPBExtensionRegistryTest.m */; };
 		F45C69CC16DFD08D0081955B /* GPBExtensionInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */; };
 		F45E57C71AE6DC6A000B7D99 /* text_format_map_unittest_data.txt in Resources */ = {isa = PBXBuildFile; fileRef = F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */; };
-		F47476E51D21A524007C7B1A /* Duration.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248D41A92826400BC1EC6 /* Duration.pbobjc.m */; };
-		F47476E61D21A524007C7B1A /* Timestamp.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248D61A92826400BC1EC6 /* Timestamp.pbobjc.m */; };
 		F4B51B1E1BBC610700744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4B51B1D1BBC610700744318 /* GPBObjectiveCPlusPlusTest.mm */; };
-		F4C4B9E41E1D976300D3B61D /* GPBDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C4B9E21E1D974F00D3B61D /* GPBDictionaryTests.m */; };
 		F4E675971B21D0000054530B /* Any.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675871B21D0000054530B /* Any.pbobjc.m */; };
 		F4E675991B21D0000054530B /* Api.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675891B21D0000054530B /* Api.pbobjc.m */; };
 		F4E6759B1B21D0000054530B /* Empty.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E6758B1B21D0000054530B /* Empty.pbobjc.m */; };
@@ -67,7 +64,14 @@
 		F4E675A11B21D0000054530B /* Struct.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675911B21D0000054530B /* Struct.pbobjc.m */; };
 		F4E675A31B21D0000054530B /* Type.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675931B21D0000054530B /* Type.pbobjc.m */; };
 		F4E675A51B21D0000054530B /* Wrappers.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675951B21D0000054530B /* Wrappers.pbobjc.m */; };
-		F4F8D8831D789FD9002CE128 /* GPBUnittestProtos2.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F8D8811D789FCE002CE128 /* GPBUnittestProtos2.m */; };
+		F4E675AE1B21D0A70054530B /* Any.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675871B21D0000054530B /* Any.pbobjc.m */; };
+		F4E675AF1B21D0A70054530B /* Api.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675891B21D0000054530B /* Api.pbobjc.m */; };
+		F4E675B01B21D0A70054530B /* Empty.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E6758B1B21D0000054530B /* Empty.pbobjc.m */; };
+		F4E675B11B21D0A70054530B /* FieldMask.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E6758D1B21D0000054530B /* FieldMask.pbobjc.m */; };
+		F4E675B21B21D0A70054530B /* SourceContext.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E6758F1B21D0000054530B /* SourceContext.pbobjc.m */; };
+		F4E675B31B21D0A70054530B /* Struct.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675911B21D0000054530B /* Struct.pbobjc.m */; };
+		F4E675B41B21D0A70054530B /* Type.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675931B21D0000054530B /* Type.pbobjc.m */; };
+		F4E675B51B21D0A70054530B /* Wrappers.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675951B21D0000054530B /* Wrappers.pbobjc.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -181,7 +185,6 @@
 		F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
 		F44929001C866B1900C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
 		F451D3F51A8AAE8700B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
-		F4584D7E1ECCB38900803AB6 /* GPBExtensionRegistryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionRegistryTest.m; sourceTree = "<group>"; };
 		F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
 		F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text_format_map_unittest_data.txt; sourceTree = "<group>"; };
 		F4AC9E1D1A8BEB3500BD6E83 /* unittest_cycle.proto */ = {isa = PBXFileReference; lastKnownFileType = text; path = unittest_cycle.proto; sourceTree = "<group>"; };
@@ -190,7 +193,6 @@
 		F4B6B8B21A9CCBDA00892426 /* GPBUnknownFieldSet_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBUnknownFieldSet_PackagePrivate.h; sourceTree = "<group>"; };
 		F4B6B8B61A9CD1DE00892426 /* GPBExtensionInternals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBExtensionInternals.h; sourceTree = "<group>"; };
 		F4B6B8B81A9CD1DE00892426 /* GPBRootObject_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRootObject_PackagePrivate.h; sourceTree = "<group>"; };
-		F4C4B9E21E1D974F00D3B61D /* GPBDictionaryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDictionaryTests.m; sourceTree = "<group>"; };
 		F4CF31701B162ED800BD9B06 /* unittest_objc_startup.proto */ = {isa = PBXFileReference; lastKnownFileType = text; path = unittest_objc_startup.proto; sourceTree = "<group>"; };
 		F4E675861B21D0000054530B /* Any.pbobjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Any.pbobjc.h; path = google/protobuf/Any.pbobjc.h; sourceTree = "<group>"; };
 		F4E675871B21D0000054530B /* Any.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Any.pbobjc.m; path = google/protobuf/Any.pbobjc.m; sourceTree = "<group>"; };
@@ -216,7 +218,6 @@
 		F4E675AB1B21D05C0054530B /* struct.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = struct.proto; path = ../src/google/protobuf/struct.proto; sourceTree = "<group>"; };
 		F4E675AC1B21D05C0054530B /* type.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = type.proto; path = ../src/google/protobuf/type.proto; sourceTree = "<group>"; };
 		F4E675AD1B21D05C0054530B /* wrappers.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = wrappers.proto; path = ../src/google/protobuf/wrappers.proto; sourceTree = "<group>"; };
-		F4F8D8811D789FCE002CE128 /* GPBUnittestProtos2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos2.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -397,7 +398,6 @@
 				7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */,
 				5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */,
 				F4353D1C1AB8822D005A6198 /* GPBDescriptorTests.m */,
-				F4C4B9E21E1D974F00D3B61D /* GPBDictionaryTests.m */,
 				F4353D2C1AC06F10005A6198 /* GPBDictionaryTests.pddm */,
 				F4353D2D1AC06F10005A6198 /* GPBDictionaryTests+Bool.m */,
 				F4353D2E1AC06F10005A6198 /* GPBDictionaryTests+Int32.m */,
@@ -405,7 +405,6 @@
 				F4353D301AC06F10005A6198 /* GPBDictionaryTests+String.m */,
 				F4353D311AC06F10005A6198 /* GPBDictionaryTests+UInt32.m */,
 				F4353D321AC06F10005A6198 /* GPBDictionaryTests+UInt64.m */,
-				F4584D7E1ECCB38900803AB6 /* GPBExtensionRegistryTest.m */,
 				7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
 				F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */,
 				F4487C741AADF7F500531423 /* GPBMessageTests+Runtime.m */,
@@ -416,13 +415,12 @@
 				7461B6AB0F94FDF800A0C422 /* GPBTestUtilities.h */,
 				7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */,
 				8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */,
-				F4F8D8811D789FCE002CE128 /* GPBUnittestProtos2.m */,
 				7461B6B80F94FDF900A0C422 /* GPBUnknownFieldSetTest.m */,
 				7461B6BA0F94FDF900A0C422 /* GPBUtilitiesTests.m */,
 				8B4248DB1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m */,
 				7461B6BC0F94FDF900A0C422 /* GPBWireFormatTests.m */,
-				F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */,
 				F43C88CF191D77FC009E917D /* text_format_unittest_data.txt */,
+				F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */,
 				8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */,
 				F4AC9E1D1A8BEB3500BD6E83 /* unittest_cycle.proto */,
 				8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */,
@@ -432,8 +430,8 @@
 				8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */,
 				8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */,
 				8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */,
-				F4CF31701B162ED800BD9B06 /* unittest_objc_startup.proto */,
 				8B09AAF614B663A7007B4184 /* unittest_objc.proto */,
+				F4CF31701B162ED800BD9B06 /* unittest_objc_startup.proto */,
 				8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */,
 				F4487C781AADFB3100531423 /* unittest_runtime_proto2.proto */,
 				F4487C791AADFB3200531423 /* unittest_runtime_proto3.proto */,
@@ -562,10 +560,9 @@
 			attributes = {
 				LastSwiftUpdateCheck = 0710;
 				LastTestingUpgradeCheck = 0600;
-				LastUpgradeCheck = 0900;
+				LastUpgradeCheck = 0710;
 				TargetAttributes = {
 					8BBEA4A5147C727100C4ADB7 = {
-						LastSwiftMigration = 0800;
 						TestTargetID = 8B9A5EA41831993600A9D33B;
 					};
 					F45BBC141B0CE3C6002D064D = {
@@ -637,7 +634,6 @@
 				F4E6759D1B21D0000054530B /* FieldMask.pbobjc.m in Sources */,
 				7461B54C0F94FB4E00A0C422 /* GPBUnknownField.m in Sources */,
 				7461B5530F94FB4E00A0C422 /* GPBMessage.m in Sources */,
-				F47476E51D21A524007C7B1A /* Duration.pbobjc.m in Sources */,
 				7461B5610F94FB4E00A0C422 /* GPBUnknownFieldSet.m in Sources */,
 				7461B5630F94FB4E00A0C422 /* GPBUtilities.m in Sources */,
 				7461B5640F94FB4E00A0C422 /* GPBWireFormat.m in Sources */,
@@ -652,7 +648,6 @@
 				F4E675A31B21D0000054530B /* Type.pbobjc.m in Sources */,
 				F4E675A11B21D0000054530B /* Struct.pbobjc.m in Sources */,
 				F4E675A51B21D0000054530B /* Wrappers.pbobjc.m in Sources */,
-				F47476E61D21A524007C7B1A /* Timestamp.pbobjc.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -665,15 +660,19 @@
 				F4353D361AC06F10005A6198 /* GPBDictionaryTests+Int64.m in Sources */,
 				F4353D391AC06F10005A6198 /* GPBDictionaryTests+UInt64.m in Sources */,
 				8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */,
+				F4E675B21B21D0A70054530B /* SourceContext.pbobjc.m in Sources */,
 				8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */,
 				F4B51B1E1BBC610700744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
 				F4487C7F1AAF62CD00531423 /* GPBMessageTests+Serialization.m in Sources */,
 				8B4248DC1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m in Sources */,
-				F4F8D8831D789FD9002CE128 /* GPBUnittestProtos2.m in Sources */,
+				F4E675B01B21D0A70054530B /* Empty.pbobjc.m in Sources */,
+				F4E675B41B21D0A70054530B /* Type.pbobjc.m in Sources */,
 				F4353D1D1AB8822D005A6198 /* GPBDescriptorTests.m in Sources */,
+				F4E675B51B21D0A70054530B /* Wrappers.pbobjc.m in Sources */,
+				F4E675AE1B21D0A70054530B /* Any.pbobjc.m in Sources */,
 				8B4248BB1A8C256A00BC1EC6 /* GPBSwiftTests.swift in Sources */,
-				F4584D821ECCB52A00803AB6 /* GPBExtensionRegistryTest.m in Sources */,
 				5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
+				F4E675B31B21D0A70054530B /* Struct.pbobjc.m in Sources */,
 				F4487C751AADF7F500531423 /* GPBMessageTests+Runtime.m in Sources */,
 				F4353D351AC06F10005A6198 /* GPBDictionaryTests+Int32.m in Sources */,
 				8BBEA4B0147C727D00C4ADB7 /* GPBTestUtilities.m in Sources */,
@@ -684,10 +683,12 @@
 				F4353D371AC06F10005A6198 /* GPBDictionaryTests+String.m in Sources */,
 				F4353D381AC06F10005A6198 /* GPBDictionaryTests+UInt32.m in Sources */,
 				8BBEA4B7147C727D00C4ADB7 /* GPBUtilitiesTests.m in Sources */,
-				F4C4B9E41E1D976300D3B61D /* GPBDictionaryTests.m in Sources */,
 				8BBEA4B8147C727D00C4ADB7 /* GPBWireFormatTests.m in Sources */,
+				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
+				F4E675B11B21D0A70054530B /* FieldMask.pbobjc.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
+				F4E675AF1B21D0A70054530B /* Api.pbobjc.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -744,18 +745,10 @@
 				);
 				INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-				OTHER_LDFLAGS = "-ObjC";
 				PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.${PRODUCT_NAME:identifier}";
 				PRODUCT_NAME = UnitTests;
 				SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
-				SWIFT_VERSION = 3.0;
-				WARNING_CFLAGS = (
-					"$(inherited)",
-					"-Wno-documentation-unknown-command",
-					"-Wno-reserved-id-macro",
-					"-Wno-direct-ivar-access",
-				);
 			};
 			name = Debug;
 		};
@@ -770,17 +763,9 @@
 				);
 				INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-				OTHER_LDFLAGS = "-ObjC";
 				PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.${PRODUCT_NAME:identifier}";
 				PRODUCT_NAME = UnitTests;
 				SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
-				SWIFT_VERSION = 3.0;
-				WARNING_CFLAGS = (
-					"$(inherited)",
-					"-Wno-documentation-unknown-command",
-					"-Wno-reserved-id-macro",
-					"-Wno-direct-ivar-access",
-				);
 			};
 			name = Release;
 		};
@@ -788,33 +773,18 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = YES;
-				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
 				CLANG_STATIC_ANALYZER_MODE = deep;
-				CLANG_WARN_ASSIGN_ENUM = YES;
-				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
-				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
-				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES;
-				CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
 				CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
-				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES;
-				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
-				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
-				CLANG_WARN_SUSPICIOUS_MOVE = YES;
-				CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
 				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
 				GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
@@ -832,7 +802,6 @@
 				GCC_WARN_SHADOW = YES;
 				GCC_WARN_SIGN_COMPARE = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNKNOWN_PRAGMAS = YES;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_LABEL = YES;
@@ -843,14 +812,6 @@
 				ONLY_ACTIVE_ARCH = YES;
 				RUN_CLANG_STATIC_ANALYZER = YES;
 				SDKROOT = macosx;
-				WARNING_CFLAGS = (
-					"-Wdocumentation-unknown-command",
-					"-Wundef",
-					"-Wreserved-id-macro",
-					"-Wswitch-enum",
-					"-Wdirect-ivar-access",
-					"-Woverriding-method-mismatch",
-				);
 			};
 			name = Debug;
 		};
@@ -858,33 +819,18 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = YES;
-				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
 				CLANG_STATIC_ANALYZER_MODE = deep;
-				CLANG_WARN_ASSIGN_ENUM = YES;
-				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
-				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
-				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES;
-				CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
 				CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
-				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES;
-				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
-				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
-				CLANG_WARN_SUSPICIOUS_MOVE = YES;
-				CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				ENABLE_NS_ASSERTIONS = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
 				GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
 				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
@@ -900,7 +846,6 @@
 				GCC_WARN_SHADOW = YES;
 				GCC_WARN_SIGN_COMPARE = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNKNOWN_PRAGMAS = YES;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_LABEL = YES;
@@ -910,15 +855,6 @@
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
 				RUN_CLANG_STATIC_ANALYZER = YES;
 				SDKROOT = macosx;
-				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
-				WARNING_CFLAGS = (
-					"-Wdocumentation-unknown-command",
-					"-Wundef",
-					"-Wreserved-id-macro",
-					"-Wswitch-enum",
-					"-Wdirect-ivar-access",
-					"-Woverriding-method-mismatch",
-				);
 			};
 			name = Release;
 		};
diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme b/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme
index d3c2938..25814c5 100644
--- a/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme
+++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0900"
+   LastUpgradeVersion = "0710"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -26,7 +26,6 @@
       buildConfiguration = "Release"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
@@ -52,12 +51,6 @@
                   Identifier = "DescriptorTests">
                </Test>
                <Test
-                  Identifier = "GPBAutocreatedArrayTests">
-               </Test>
-               <Test
-                  Identifier = "GPBAutocreatedDictionaryTests">
-               </Test>
-               <Test
                   Identifier = "GPBBoolArrayTests">
                </Test>
                <Test
@@ -97,9 +90,6 @@
                   Identifier = "GPBEnumArrayTests">
                </Test>
                <Test
-                  Identifier = "GPBExtensionRegistryTest">
-               </Test>
-               <Test
                   Identifier = "GPBFloatArrayTests">
                </Test>
                <Test
@@ -301,7 +291,6 @@
       buildConfiguration = "Release"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme b/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme
index e7fb821..8f510f5 100644
--- a/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme
+++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0900"
+   LastUpgradeVersion = "0710"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -54,9 +54,7 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      codeCoverageEnabled = "YES">
+      shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
             skipped = "NO">
@@ -90,7 +88,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
index 1f1172b..b622181 100644
--- a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
@@ -23,6 +23,7 @@
 		8B4248E41A929C8900BC1EC6 /* GPBWellKnownTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248E21A929C8900BC1EC6 /* GPBWellKnownTypes.m */; };
 		8B4248E61A929C9900BC1EC6 /* GPBWellKnownTypesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */; };
 		8B79657B14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
+		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
 		8B9742331A89D19F00DCE92C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B9742321A89D19F00DCE92C /* LaunchScreen.xib */; };
@@ -60,13 +61,17 @@
 		F4487C771AADF84900531423 /* GPBMessageTests+Runtime.m in Sources */ = {isa = PBXBuildFile; fileRef = F4487C761AADF84900531423 /* GPBMessageTests+Runtime.m */; };
 		F4487C811AAF62FC00531423 /* GPBMessageTests+Serialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */; };
 		F4487C851AAF6AC500531423 /* GPBMessageTests+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */; };
-		F4584D831ECCB53600803AB6 /* GPBExtensionRegistryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */; };
 		F45C69CC16DFD08D0081955B /* GPBExtensionInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */; };
 		F45E57C91AE6DC98000B7D99 /* text_format_map_unittest_data.txt in Resources */ = {isa = PBXBuildFile; fileRef = F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */; };
-		F47476E91D21A537007C7B1A /* Duration.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248DE1A929C7D00BC1EC6 /* Duration.pbobjc.m */; };
-		F47476EA1D21A537007C7B1A /* Timestamp.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B4248E01A929C7D00BC1EC6 /* Timestamp.pbobjc.m */; };
 		F4B51B1C1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4B51B1B1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm */; };
-		F4C4B9E71E1D97BF00D3B61D /* GPBDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C4B9E51E1D97BB00D3B61D /* GPBDictionaryTests.m */; };
+		F4E675C81B21D1610054530B /* Any.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675B71B21D1440054530B /* Any.pbobjc.m */; };
+		F4E675C91B21D1610054530B /* Api.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675B91B21D1440054530B /* Api.pbobjc.m */; };
+		F4E675CA1B21D1610054530B /* Empty.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675BC1B21D1440054530B /* Empty.pbobjc.m */; };
+		F4E675CB1B21D1610054530B /* FieldMask.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675BE1B21D1440054530B /* FieldMask.pbobjc.m */; };
+		F4E675CC1B21D1610054530B /* SourceContext.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C01B21D1440054530B /* SourceContext.pbobjc.m */; };
+		F4E675CD1B21D1610054530B /* Struct.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C21B21D1440054530B /* Struct.pbobjc.m */; };
+		F4E675CE1B21D1610054530B /* Type.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C51B21D1440054530B /* Type.pbobjc.m */; };
+		F4E675CF1B21D1610054530B /* Wrappers.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C71B21D1440054530B /* Wrappers.pbobjc.m */; };
 		F4E675D01B21D1620054530B /* Any.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675B71B21D1440054530B /* Any.pbobjc.m */; };
 		F4E675D11B21D1620054530B /* Api.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675B91B21D1440054530B /* Api.pbobjc.m */; };
 		F4E675D21B21D1620054530B /* Empty.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675BC1B21D1440054530B /* Empty.pbobjc.m */; };
@@ -75,7 +80,6 @@
 		F4E675D51B21D1620054530B /* Struct.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C21B21D1440054530B /* Struct.pbobjc.m */; };
 		F4E675D61B21D1620054530B /* Type.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C51B21D1440054530B /* Type.pbobjc.m */; };
 		F4E675D71B21D1620054530B /* Wrappers.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E675C71B21D1440054530B /* Wrappers.pbobjc.m */; };
-		F4F8D8861D78A193002CE128 /* GPBUnittestProtos2.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F8D8841D78A186002CE128 /* GPBUnittestProtos2.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -203,7 +207,6 @@
 		F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
 		F44929021C866B3B00C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
 		F451D3F61A8AAEA600B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
-		F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPBExtensionRegistryTest.m; path = Tests/GPBExtensionRegistryTest.m; sourceTree = SOURCE_ROOT; };
 		F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
 		F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text_format_map_unittest_data.txt; sourceTree = "<group>"; };
 		F4AC9E1C1A8BEB1000BD6E83 /* unittest_cycle.proto */ = {isa = PBXFileReference; lastKnownFileType = text; path = unittest_cycle.proto; sourceTree = "<group>"; };
@@ -212,7 +215,6 @@
 		F4B6B8B11A9CCBBB00892426 /* GPBUnknownFieldSet_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBUnknownFieldSet_PackagePrivate.h; sourceTree = "<group>"; };
 		F4B6B8B31A9CD1C600892426 /* GPBExtensionInternals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBExtensionInternals.h; sourceTree = "<group>"; };
 		F4B6B8B51A9CD1C600892426 /* GPBRootObject_PackagePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRootObject_PackagePrivate.h; sourceTree = "<group>"; };
-		F4C4B9E51E1D97BB00D3B61D /* GPBDictionaryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDictionaryTests.m; sourceTree = "<group>"; };
 		F4CF31711B162EF500BD9B06 /* unittest_objc_startup.proto */ = {isa = PBXFileReference; lastKnownFileType = text; path = unittest_objc_startup.proto; sourceTree = "<group>"; };
 		F4E675B61B21D1440054530B /* Any.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Any.pbobjc.h; path = google/protobuf/Any.pbobjc.h; sourceTree = "<group>"; };
 		F4E675B71B21D1440054530B /* Any.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Any.pbobjc.m; path = google/protobuf/Any.pbobjc.m; sourceTree = "<group>"; };
@@ -239,7 +241,6 @@
 		F4E675DD1B21D1DE0054530B /* struct.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = struct.proto; path = ../src/google/protobuf/struct.proto; sourceTree = "<group>"; };
 		F4E675DE1B21D1DE0054530B /* type.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = type.proto; path = ../src/google/protobuf/type.proto; sourceTree = "<group>"; };
 		F4E675DF1B21D1DE0054530B /* wrappers.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = wrappers.proto; path = ../src/google/protobuf/wrappers.proto; sourceTree = "<group>"; };
-		F4F8D8841D78A186002CE128 /* GPBUnittestProtos2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos2.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -435,7 +436,6 @@
 				7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */,
 				5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */,
 				F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */,
-				F4C4B9E51E1D97BB00D3B61D /* GPBDictionaryTests.m */,
 				F4353D3A1AC06F31005A6198 /* GPBDictionaryTests.pddm */,
 				F4353D3B1AC06F31005A6198 /* GPBDictionaryTests+Bool.m */,
 				F4353D3C1AC06F31005A6198 /* GPBDictionaryTests+Int32.m */,
@@ -443,7 +443,6 @@
 				F4353D3E1AC06F31005A6198 /* GPBDictionaryTests+String.m */,
 				F4353D3F1AC06F31005A6198 /* GPBDictionaryTests+UInt32.m */,
 				F4353D401AC06F31005A6198 /* GPBDictionaryTests+UInt64.m */,
-				F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */,
 				7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
 				F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */,
 				F4487C761AADF84900531423 /* GPBMessageTests+Runtime.m */,
@@ -454,13 +453,12 @@
 				7461B6AB0F94FDF800A0C422 /* GPBTestUtilities.h */,
 				7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */,
 				8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */,
-				F4F8D8841D78A186002CE128 /* GPBUnittestProtos2.m */,
 				7461B6B80F94FDF900A0C422 /* GPBUnknownFieldSetTest.m */,
 				7461B6BA0F94FDF900A0C422 /* GPBUtilitiesTests.m */,
 				8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */,
 				7461B6BC0F94FDF900A0C422 /* GPBWireFormatTests.m */,
-				F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */,
 				F43C88CF191D77FC009E917D /* text_format_unittest_data.txt */,
+				F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */,
 				8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */,
 				F4AC9E1C1A8BEB1000BD6E83 /* unittest_cycle.proto */,
 				8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */,
@@ -470,8 +468,8 @@
 				8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */,
 				8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */,
 				8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */,
-				F4CF31711B162EF500BD9B06 /* unittest_objc_startup.proto */,
 				8B09AAF614B663A7007B4184 /* unittest_objc.proto */,
+				F4CF31711B162EF500BD9B06 /* unittest_objc_startup.proto */,
 				8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */,
 				F4487C7A1AADFB5500531423 /* unittest_runtime_proto2.proto */,
 				F4487C7B1AADFB5500531423 /* unittest_runtime_proto3.proto */,
@@ -639,10 +637,9 @@
 			attributes = {
 				LastSwiftUpdateCheck = 0710;
 				LastTestingUpgradeCheck = 0600;
-				LastUpgradeCheck = 0900;
+				LastUpgradeCheck = 0710;
 				TargetAttributes = {
 					8BBEA4A5147C727100C4ADB7 = {
-						LastSwiftMigration = 0800;
 						TestTargetID = 8B9A5EA41831993600A9D33B;
 					};
 					F45BBC0E1B0CDB50002D064D = {
@@ -725,7 +722,6 @@
 				F4E675D31B21D1620054530B /* FieldMask.pbobjc.m in Sources */,
 				7461B54C0F94FB4E00A0C422 /* GPBUnknownField.m in Sources */,
 				7461B5530F94FB4E00A0C422 /* GPBMessage.m in Sources */,
-				F47476E91D21A537007C7B1A /* Duration.pbobjc.m in Sources */,
 				7461B5610F94FB4E00A0C422 /* GPBUnknownFieldSet.m in Sources */,
 				7461B5630F94FB4E00A0C422 /* GPBUtilities.m in Sources */,
 				7461B5640F94FB4E00A0C422 /* GPBWireFormat.m in Sources */,
@@ -740,7 +736,6 @@
 				F4E675D61B21D1620054530B /* Type.pbobjc.m in Sources */,
 				F4E675D51B21D1620054530B /* Struct.pbobjc.m in Sources */,
 				F4E675D71B21D1620054530B /* Wrappers.pbobjc.m in Sources */,
-				F47476EA1D21A537007C7B1A /* Timestamp.pbobjc.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -761,15 +756,19 @@
 				F4353D441AC06F31005A6198 /* GPBDictionaryTests+Int64.m in Sources */,
 				F4353D471AC06F31005A6198 /* GPBDictionaryTests+UInt64.m in Sources */,
 				8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */,
+				F4E675CC1B21D1610054530B /* SourceContext.pbobjc.m in Sources */,
 				8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */,
 				F4487C811AAF62FC00531423 /* GPBMessageTests+Serialization.m in Sources */,
 				8B4248E61A929C9900BC1EC6 /* GPBWellKnownTypesTest.m in Sources */,
+				F4E675CA1B21D1610054530B /* Empty.pbobjc.m in Sources */,
+				F4E675CE1B21D1610054530B /* Type.pbobjc.m in Sources */,
 				F4353D1F1AB88243005A6198 /* GPBDescriptorTests.m in Sources */,
-				F4F8D8861D78A193002CE128 /* GPBUnittestProtos2.m in Sources */,
+				F4E675CF1B21D1610054530B /* Wrappers.pbobjc.m in Sources */,
 				F4B51B1C1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
+				F4E675C81B21D1610054530B /* Any.pbobjc.m in Sources */,
 				8B4248B41A8BD96E00BC1EC6 /* GPBSwiftTests.swift in Sources */,
-				F4584D831ECCB53600803AB6 /* GPBExtensionRegistryTest.m in Sources */,
 				5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
+				F4E675CD1B21D1610054530B /* Struct.pbobjc.m in Sources */,
 				F4487C771AADF84900531423 /* GPBMessageTests+Runtime.m in Sources */,
 				F4353D431AC06F31005A6198 /* GPBDictionaryTests+Int32.m in Sources */,
 				8BBEA4B0147C727D00C4ADB7 /* GPBTestUtilities.m in Sources */,
@@ -780,10 +779,12 @@
 				F4353D451AC06F31005A6198 /* GPBDictionaryTests+String.m in Sources */,
 				F4353D461AC06F31005A6198 /* GPBDictionaryTests+UInt32.m in Sources */,
 				8BBEA4B7147C727D00C4ADB7 /* GPBUtilitiesTests.m in Sources */,
-				F4C4B9E71E1D97BF00D3B61D /* GPBDictionaryTests.m in Sources */,
 				8BBEA4B8147C727D00C4ADB7 /* GPBWireFormatTests.m in Sources */,
+				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
+				F4E675CB1B21D1610054530B /* FieldMask.pbobjc.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
+				F4E675C91B21D1610054530B /* Api.pbobjc.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -852,7 +853,7 @@
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				INFOPLIST_FILE = "$(SRCROOT)/Tests/iOSTestHarness/Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 7.1;
 				PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME:rfc1034identifier}";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -867,7 +868,7 @@
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				INFOPLIST_FILE = "$(SRCROOT)/Tests/iOSTestHarness/Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 7.1;
 				PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME:rfc1034identifier}";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -889,25 +890,17 @@
 					"$(SRCROOT)",
 				);
 				INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 7.1;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"\"$(DEVELOPER_DIR)/usr/lib\"",
 				);
-				OTHER_LDFLAGS = "-ObjC";
 				PRODUCT_NAME = UnitTests;
 				SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
-				SWIFT_VERSION = 3.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSTestHarness.app/iOSTestHarness";
-				WARNING_CFLAGS = (
-					"$(inherited)",
-					"-Wno-documentation-unknown-command",
-					"-Wno-reserved-id-macro",
-					"-Wno-direct-ivar-access",
-				);
 			};
 			name = Debug;
 		};
@@ -925,24 +918,16 @@
 					"$(SRCROOT)",
 				);
 				INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 7.1;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"\"$(DEVELOPER_DIR)/usr/lib\"",
 				);
-				OTHER_LDFLAGS = "-ObjC";
 				PRODUCT_NAME = UnitTests;
 				SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
-				SWIFT_VERSION = 3.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSTestHarness.app/iOSTestHarness";
-				WARNING_CFLAGS = (
-					"$(inherited)",
-					"-Wno-documentation-unknown-command",
-					"-Wno-reserved-id-macro",
-					"-Wno-direct-ivar-access",
-				);
 			};
 			name = Release;
 		};
@@ -950,34 +935,19 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = YES;
-				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
 				CLANG_STATIC_ANALYZER_MODE = deep;
-				CLANG_WARN_ASSIGN_ENUM = YES;
-				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
-				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
-				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES;
-				CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
 				CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
-				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES;
-				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
-				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
-				CLANG_WARN_SUSPICIOUS_MOVE = YES;
-				CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
 				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
 				GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
@@ -995,25 +965,16 @@
 				GCC_WARN_SHADOW = YES;
 				GCC_WARN_SIGN_COMPARE = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNKNOWN_PRAGMAS = YES;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_LABEL = YES;
 				GCC_WARN_UNUSED_PARAMETER = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				GENERATE_PROFILING_CODE = NO;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
 				ONLY_ACTIVE_ARCH = YES;
 				RUN_CLANG_STATIC_ANALYZER = YES;
 				SDKROOT = iphoneos;
-				WARNING_CFLAGS = (
-					"-Wdocumentation-unknown-command",
-					"-Wundef",
-					"-Wreserved-id-macro",
-					"-Wswitch-enum",
-					"-Wdirect-ivar-access",
-					"-Woverriding-method-mismatch",
-				);
 			};
 			name = Debug;
 		};
@@ -1021,34 +982,19 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = YES;
-				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
 				CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
 				CLANG_STATIC_ANALYZER_MODE = deep;
-				CLANG_WARN_ASSIGN_ENUM = YES;
-				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
-				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
-				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES;
-				CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
 				CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
-				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES;
-				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
-				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
-				CLANG_WARN_SUSPICIOUS_MOVE = YES;
-				CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				ENABLE_NS_ASSERTIONS = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
 				GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
 				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
@@ -1064,25 +1010,15 @@
 				GCC_WARN_SHADOW = YES;
 				GCC_WARN_SIGN_COMPARE = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNKNOWN_PRAGMAS = YES;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_LABEL = YES;
 				GCC_WARN_UNUSED_PARAMETER = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				GENERATE_PROFILING_CODE = NO;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
 				RUN_CLANG_STATIC_ANALYZER = YES;
 				SDKROOT = iphoneos;
-				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
-				WARNING_CFLAGS = (
-					"-Wdocumentation-unknown-command",
-					"-Wundef",
-					"-Wreserved-id-macro",
-					"-Wswitch-enum",
-					"-Wdirect-ivar-access",
-					"-Woverriding-method-mismatch",
-				);
 			};
 			name = Release;
 		};
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/FFE465CA-0E74-40E8-9F09-500B66B7DCB2.plist b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/FFE465CA-0E74-40E8-9F09-500B66B7DCB2.plist
new file mode 100644
index 0000000..0ac0943
--- /dev/null
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/FFE465CA-0E74-40E8-9F09-500B66B7DCB2.plist
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>classNames</key>
+	<dict>
+		<key>PerfTests</key>
+		<dict>
+			<key>testExtensionsPerformance</key>
+			<dict>
+				<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
+				<dict>
+					<key>baselineAverage</key>
+					<real>0.9</real>
+					<key>baselineIntegrationDisplayName</key>
+					<string>Feb 5, 2015, 9:42:41 AM</string>
+				</dict>
+			</dict>
+			<key>testHas</key>
+			<dict>
+				<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
+				<dict>
+					<key>baselineAverage</key>
+					<real>0.09</real>
+					<key>baselineIntegrationDisplayName</key>
+					<string>Feb 5, 2015, 9:42:35 AM</string>
+				</dict>
+			</dict>
+			<key>testMessagePerformance</key>
+			<dict>
+				<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
+				<dict>
+					<key>baselineAverage</key>
+					<real>0.57</real>
+					<key>baselineIntegrationDisplayName</key>
+					<string>Feb 5, 2015, 9:42:47 AM</string>
+				</dict>
+			</dict>
+			<key>testPackedExtensionsPerformance</key>
+			<dict>
+				<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
+				<dict>
+					<key>baselineAverage</key>
+					<real>0.75</real>
+					<key>baselineIntegrationDisplayName</key>
+					<string>Feb 5, 2015, 9:42:51 AM</string>
+				</dict>
+			</dict>
+			<key>testPackedTypesPerformance</key>
+			<dict>
+				<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
+				<dict>
+					<key>baselineAverage</key>
+					<real>0.26</real>
+					<key>baselineIntegrationDisplayName</key>
+					<string>Feb 5, 2015, 9:42:55 AM</string>
+				</dict>
+			</dict>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/Info.plist b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/Info.plist
new file mode 100644
index 0000000..45bb9c1
--- /dev/null
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/Info.plist
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>runDestinationsByUUID</key>
+	<dict>
+		<key>FFE465CA-0E74-40E8-9F09-500B66B7DCB2</key>
+		<dict>
+			<key>targetArchitecture</key>
+			<string>arm64</string>
+			<key>targetDevice</key>
+			<dict>
+				<key>modelCode</key>
+				<string>iPhone7,1</string>
+				<key>platformIdentifier</key>
+				<string>com.apple.platform.iphoneos</string>
+			</dict>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme
index 03acb08..0b96b75 100644
--- a/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0900"
+   LastUpgradeVersion = "0710"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -26,7 +26,6 @@
       buildConfiguration = "Release"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
@@ -52,12 +51,6 @@
                   Identifier = "DescriptorTests">
                </Test>
                <Test
-                  Identifier = "GPBAutocreatedArrayTests">
-               </Test>
-               <Test
-                  Identifier = "GPBAutocreatedDictionaryTests">
-               </Test>
-               <Test
                   Identifier = "GPBBoolArrayTests">
                </Test>
                <Test
@@ -97,9 +90,6 @@
                   Identifier = "GPBEnumArrayTests">
                </Test>
                <Test
-                  Identifier = "GPBExtensionRegistryTest">
-               </Test>
-               <Test
                   Identifier = "GPBFloatArrayTests">
                </Test>
                <Test
@@ -310,7 +300,6 @@
       buildConfiguration = "Release"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme
index 98bcd56..7d219bc 100644
--- a/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0900"
+   LastUpgradeVersion = "0710"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -54,9 +54,7 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      codeCoverageEnabled = "YES">
+      shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
             skipped = "NO">
@@ -90,7 +88,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
diff --git a/objectivec/README.md b/objectivec/README.md
index 7226f0b..c7313e4 100644
--- a/objectivec/README.md
+++ b/objectivec/README.md
@@ -44,7 +44,7 @@
 If the target is using ARC, remember to turn off ARC (`-fno-objc-arc`) for the
 `.m` files.
 
-The files generated by `protoc` for the `*.proto` files (`\*.pbobjc.h` and
+The files generated by `protoc` for the `*.proto` files (`\*.pbobjc.h' and
 `\*.pbobjc.m`) are then also added to the target.
 
 Usage
@@ -123,8 +123,8 @@
 
 The Objective C classes/enums can be used from Swift code.
 
-Objective C Generator Proto File Options
-----------------------------------------
+Objective C Generator Options
+-----------------------------
 
 **objc_class_prefix=\<prefix\>** (no default)
 
@@ -133,42 +133,6 @@
 and Objects (for messages) generated from the proto. Convention is to base
 the prefix on the package the proto is in.
 
-Objective C Generator `protoc` Options
---------------------------------------
-
-When generating Objective C code, `protoc` supports a `--objc_opt` argument; the
-argument is comma-delimited name/value pairs (_key=value,key2=value2_). The
-_keys_ are used to change the behavior during generation. The currently
-supported keys are:
-
-  * `generate_for_named_framework`: The `value` used for this key will be used
-    when generating the `#import` statements in the generated code.  Instead
-    of being plain `#import "some/path/file.pbobjc.h"` lines, they will be
-    framework based, i.e. - `#import <VALUE/file.pbobjc.h>`.
-
-    _NOTE:_ If this is used with `named_framework_to_proto_path_mappings_path`,
-    then this is effectively the _default_ to use for everything that wasn't
-    mapped by the other.
-
-  * `named_framework_to_proto_path_mappings_path`: The `value` used for this key
-    is a path to a file containing the listing of framework names and proto
-    files. The generator uses this to decide if another proto file referenced
-    should use a framework style import vs. a user level import
-    (`#import <FRAMEWORK/file.pbobjc.h>` vs `#import "dir/file.pbobjc.h"`).
-
-    The format of the file is:
-      * An entry is a line of `frameworkName: file.proto, dir/file2.proto`.
-      * Comments start with `#`.
-      * A comment can go on a line after an entry.
-        (i.e. - `frameworkName: file.proto # comment`)
-
-    Any number of files can be listed for a framework, just separate them with
-    commas.
-
-    There can be multiple lines listing the same frameworkName incase it has a
-    lot of proto files included in it; and having multiple lines makes things
-    easier to read.
-
 Contributing
 ------------
 
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.pbxproj b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.pbxproj
deleted file mode 100644
index b9df381..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,290 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		F4D5A0AE1CEE2D8F00562D79 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F4D5A0AD1CEE2D8F00562D79 /* AppDelegate.m */; };
-		F4D5A0B11CEE2D8F00562D79 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F4D5A0B01CEE2D8F00562D79 /* main.m */; };
-		F4D5A0B31CEE2D8F00562D79 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4D5A0B21CEE2D8F00562D79 /* Assets.xcassets */; };
-		F4D5A0B61CEE2D8F00562D79 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4D5A0B41CEE2D8F00562D79 /* MainMenu.xib */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
-		F4D5A0A91CEE2D8F00562D79 /* OSXCocoaPodsTester.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OSXCocoaPodsTester.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		F4D5A0AC1CEE2D8F00562D79 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
-		F4D5A0AD1CEE2D8F00562D79 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
-		F4D5A0B01CEE2D8F00562D79 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		F4D5A0B21CEE2D8F00562D79 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
-		F4D5A0B51CEE2D8F00562D79 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
-		F4D5A0B71CEE2D8F00562D79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		F4D5A0A61CEE2D8F00562D79 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		F4D5A0A01CEE2D8F00562D79 = {
-			isa = PBXGroup;
-			children = (
-				F4D5A0AB1CEE2D8F00562D79 /* OSXCocoaPodsTester */,
-				F4D5A0AA1CEE2D8F00562D79 /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		F4D5A0AA1CEE2D8F00562D79 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				F4D5A0A91CEE2D8F00562D79 /* OSXCocoaPodsTester.app */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		F4D5A0AB1CEE2D8F00562D79 /* OSXCocoaPodsTester */ = {
-			isa = PBXGroup;
-			children = (
-				F4D5A0AC1CEE2D8F00562D79 /* AppDelegate.h */,
-				F4D5A0AD1CEE2D8F00562D79 /* AppDelegate.m */,
-				F4D5A0B21CEE2D8F00562D79 /* Assets.xcassets */,
-				F4D5A0B41CEE2D8F00562D79 /* MainMenu.xib */,
-				F4D5A0B71CEE2D8F00562D79 /* Info.plist */,
-				F4D5A0AF1CEE2D8F00562D79 /* Supporting Files */,
-			);
-			path = OSXCocoaPodsTester;
-			sourceTree = "<group>";
-		};
-		F4D5A0AF1CEE2D8F00562D79 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				F4D5A0B01CEE2D8F00562D79 /* main.m */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		F4D5A0A81CEE2D8F00562D79 /* OSXCocoaPodsTester */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = F4D5A0BA1CEE2D8F00562D79 /* Build configuration list for PBXNativeTarget "OSXCocoaPodsTester" */;
-			buildPhases = (
-				F4D5A0A51CEE2D8F00562D79 /* Sources */,
-				F4D5A0A61CEE2D8F00562D79 /* Frameworks */,
-				F4D5A0A71CEE2D8F00562D79 /* Resources */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = OSXCocoaPodsTester;
-			productName = OSXCocoaPodsTester;
-			productReference = F4D5A0A91CEE2D8F00562D79 /* OSXCocoaPodsTester.app */;
-			productType = "com.apple.product-type.application";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		F4D5A0A11CEE2D8F00562D79 /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0730;
-				ORGANIZATIONNAME = Google;
-				TargetAttributes = {
-					F4D5A0A81CEE2D8F00562D79 = {
-						CreatedOnToolsVersion = 7.3.1;
-					};
-				};
-			};
-			buildConfigurationList = F4D5A0A41CEE2D8F00562D79 /* Build configuration list for PBXProject "OSXCocoaPodsTester" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-				Base,
-			);
-			mainGroup = F4D5A0A01CEE2D8F00562D79;
-			productRefGroup = F4D5A0AA1CEE2D8F00562D79 /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				F4D5A0A81CEE2D8F00562D79 /* OSXCocoaPodsTester */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		F4D5A0A71CEE2D8F00562D79 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				F4D5A0B31CEE2D8F00562D79 /* Assets.xcassets in Resources */,
-				F4D5A0B61CEE2D8F00562D79 /* MainMenu.xib in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		F4D5A0A51CEE2D8F00562D79 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				F4D5A0B11CEE2D8F00562D79 /* main.m in Sources */,
-				F4D5A0AE1CEE2D8F00562D79 /* AppDelegate.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
-		F4D5A0B41CEE2D8F00562D79 /* MainMenu.xib */ = {
-			isa = PBXVariantGroup;
-			children = (
-				F4D5A0B51CEE2D8F00562D79 /* Base */,
-			);
-			name = MainMenu.xib;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		F4D5A0B81CEE2D8F00562D79 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ANALYZER_NONNULL = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = NO;
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				ENABLE_TESTABILITY = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.11;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				ONLY_ACTIVE_ARCH = YES;
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		F4D5A0B91CEE2D8F00562D79 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ANALYZER_NONNULL = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				CODE_SIGN_IDENTITY = "-";
-				COPY_PHASE_STRIP = NO;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_NS_ASSERTIONS = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.11;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		F4D5A0BB1CEE2D8F00562D79 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				COMBINE_HIDPI_IMAGES = YES;
-				INFOPLIST_FILE = OSXCocoaPodsTester/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
-				PRODUCT_BUNDLE_IDENTIFIER = com.google.OSXCocoaPodsTester;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Debug;
-		};
-		F4D5A0BC1CEE2D8F00562D79 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				COMBINE_HIDPI_IMAGES = YES;
-				INFOPLIST_FILE = OSXCocoaPodsTester/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
-				PRODUCT_BUNDLE_IDENTIFIER = com.google.OSXCocoaPodsTester;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		F4D5A0A41CEE2D8F00562D79 /* Build configuration list for PBXProject "OSXCocoaPodsTester" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				F4D5A0B81CEE2D8F00562D79 /* Debug */,
-				F4D5A0B91CEE2D8F00562D79 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		F4D5A0BA1CEE2D8F00562D79 /* Build configuration list for PBXNativeTarget "OSXCocoaPodsTester" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				F4D5A0BB1CEE2D8F00562D79 /* Debug */,
-				F4D5A0BC1CEE2D8F00562D79 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = F4D5A0A11CEE2D8F00562D79 /* Project object */;
-}
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 6d874e2..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Workspace
-   version = "1.0">
-   <FileRef
-      location = "self:OSXCocoaPodsTester.xcodeproj">
-   </FileRef>
-</Workspace>
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/OSXCocoaPodsTester.xcscheme b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/OSXCocoaPodsTester.xcscheme
deleted file mode 100644
index 56f8782..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/OSXCocoaPodsTester.xcscheme
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "0730"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "F4D5A0A81CEE2D8F00562D79"
-               BuildableName = "OSXCocoaPodsTester.app"
-               BlueprintName = "OSXCocoaPodsTester"
-               ReferencedContainer = "container:OSXCocoaPodsTester.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "F4D5A0A81CEE2D8F00562D79"
-            BuildableName = "OSXCocoaPodsTester.app"
-            BlueprintName = "OSXCocoaPodsTester"
-            ReferencedContainer = "container:OSXCocoaPodsTester.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "YES"
-      debugServiceExtension = "internal"
-      allowLocationSimulation = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "F4D5A0A81CEE2D8F00562D79"
-            BuildableName = "OSXCocoaPodsTester.app"
-            BlueprintName = "OSXCocoaPodsTester"
-            ReferencedContainer = "container:OSXCocoaPodsTester.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "F4D5A0A81CEE2D8F00562D79"
-            BuildableName = "OSXCocoaPodsTester.app"
-            BlueprintName = "OSXCocoaPodsTester"
-            ReferencedContainer = "container:OSXCocoaPodsTester.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.h b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.h
deleted file mode 100644
index c7ab521..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface AppDelegate : NSObject <NSApplicationDelegate>
-
-
-@end
-
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.m b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.m
deleted file mode 100644
index 08735a0..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.m
+++ /dev/null
@@ -1,48 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import "AppDelegate.h"
-
-@interface AppDelegate ()
-
-@property (weak) IBOutlet NSWindow *window;
-@end
-
-@implementation AppDelegate
-
-- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
-  // Insert code here to initialize your application
-}
-
-- (void)applicationWillTerminate:(NSNotification *)aNotification {
-  // Insert code here to tear down your application
-}
-
-@end
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 2db2b1c..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "mac",
-      "size" : "16x16",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "16x16",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "32x32",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "32x32",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "128x128",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "128x128",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "256x256",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "256x256",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "512x512",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "mac",
-      "size" : "512x512",
-      "scale" : "2x"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}
\ No newline at end of file
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Base.lproj/MainMenu.xib b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Base.lproj/MainMenu.xib
deleted file mode 100644
index aa3547c..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Base.lproj/MainMenu.xib
+++ /dev/null
@@ -1,680 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6233" systemVersion="14A329f" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6233"/>
-    </dependencies>
-    <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
-            <connections>
-                <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
-            </connections>
-        </customObject>
-        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
-        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
-        <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModuleProvider="">
-            <connections>
-                <outlet property="window" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
-            </connections>
-        </customObject>
-        <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
-        <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
-            <items>
-                <menuItem title="OSXCocoaPodsTester" id="1Xt-HY-uBw">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="OSXCocoaPodsTester" systemMenu="apple" id="uQy-DD-JDr">
-                        <items>
-                            <menuItem title="About OSXCocoaPodsTester" id="5kV-Vb-QxS">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
-                            <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
-                            <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
-                            <menuItem title="Services" id="NMo-om-nkz">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
-                            <menuItem title="Hide OSXCocoaPodsTester" keyEquivalent="h" id="Olw-nP-bQN">
-                                <connections>
-                                    <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
-                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                <connections>
-                                    <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Show All" id="Kd2-mp-pUS">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
-                            <menuItem title="Quit OSXCocoaPodsTester" keyEquivalent="q" id="4sb-4s-VLi">
-                                <connections>
-                                    <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
-                                </connections>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="File" id="dMs-cI-mzQ">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="File" id="bib-Uj-vzu">
-                        <items>
-                            <menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
-                                <connections>
-                                    <action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
-                                <connections>
-                                    <action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Open Recent" id="tXI-mr-wws">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
-                                    <items>
-                                        <menuItem title="Clear Menu" id="vNY-rz-j42">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
-                            <menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
-                                <connections>
-                                    <action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
-                                <connections>
-                                    <action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
-                                <connections>
-                                    <action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Revert to Saved" id="KaW-ft-85H">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
-                            <menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
-                                <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
-                                <connections>
-                                    <action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
-                                <connections>
-                                    <action selector="print:" target="-1" id="qaZ-4w-aoO"/>
-                                </connections>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="Edit" id="5QF-Oa-p0T">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Edit" id="W48-6f-4Dl">
-                        <items>
-                            <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
-                                <connections>
-                                    <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
-                                <connections>
-                                    <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
-                            <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
-                                <connections>
-                                    <action selector="cut:" target="-1" id="YJe-68-I9s"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
-                                <connections>
-                                    <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
-                                <connections>
-                                    <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
-                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                <connections>
-                                    <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Delete" id="pa3-QI-u2k">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
-                                <connections>
-                                    <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
-                            <menuItem title="Find" id="4EN-yA-p0u">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Find" id="1b7-l0-nxx">
-                                    <items>
-                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
-                                            <connections>
-                                                <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
-                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                            <connections>
-                                                <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
-                                            <connections>
-                                                <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
-                                            <connections>
-                                                <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
-                                            <connections>
-                                                <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
-                                            <connections>
-                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
-                                    <items>
-                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
-                                            <connections>
-                                                <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
-                                            <connections>
-                                                <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
-                                        <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem title="Substitutions" id="9ic-FL-obx">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
-                                    <items>
-                                        <menuItem title="Show Substitutions" id="z6F-FW-3nz">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
-                                        <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Smart Quotes" id="hQb-2v-fYv">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Smart Dashes" id="rgM-f4-ycn">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Smart Links" id="cwL-P1-jid">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Data Detectors" id="tRr-pd-1PS">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Text Replacement" id="HFQ-gK-NFA">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem title="Transformations" id="2oI-Rn-ZJC">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
-                                    <items>
-                                        <menuItem title="Make Upper Case" id="vmV-6d-7jI">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Make Lower Case" id="d9M-CD-aMd">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Capitalize" id="UEZ-Bs-lqG">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem title="Speech" id="xrE-MZ-jX0">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
-                                    <items>
-                                        <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="Format" id="jxT-CU-nIS">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Format" id="GEO-Iw-cKr">
-                        <items>
-                            <menuItem title="Font" id="Gi5-1S-RQB">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
-                                    <items>
-                                        <menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
-                                            <connections>
-                                                <action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
-                                            <connections>
-                                                <action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
-                                            <connections>
-                                                <action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
-                                            <connections>
-                                                <action selector="underline:" target="-1" id="FYS-2b-JAY"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
-                                        <menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
-                                            <connections>
-                                                <action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
-                                            <connections>
-                                                <action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
-                                        <menuItem title="Kern" id="jBQ-r6-VK2">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Kern" id="tlD-Oa-oAM">
-                                                <items>
-                                                    <menuItem title="Use Default" id="GUa-eO-cwY">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Use None" id="cDB-IK-hbR">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Tighten" id="46P-cB-AYj">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Loosen" id="ogc-rX-tC1">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem title="Ligatures" id="o6e-r0-MWq">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
-                                                <items>
-                                                    <menuItem title="Use Default" id="agt-UL-0e3">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Use None" id="J7y-lM-qPV">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Use All" id="xQD-1f-W4t">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem title="Baseline" id="OaQ-X3-Vso">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Baseline" id="ijk-EB-dga">
-                                                <items>
-                                                    <menuItem title="Use Default" id="3Om-Ey-2VK">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Superscript" id="Rqc-34-cIF">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Subscript" id="I0S-gh-46l">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Raise" id="2h7-ER-AoG">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem title="Lower" id="1tx-W0-xDw">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
-                                        <menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
-                                            <connections>
-                                                <action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
-                                        <menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
-                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                            <connections>
-                                                <action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
-                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                            <connections>
-                                                <action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                            <menuItem title="Text" id="Fal-I4-PZk">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <menu key="submenu" title="Text" id="d9c-me-L2H">
-                                    <items>
-                                        <menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
-                                            <connections>
-                                                <action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
-                                            <connections>
-                                                <action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Justify" id="J5U-5w-g23">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
-                                            <connections>
-                                                <action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
-                                        <menuItem title="Writing Direction" id="H1b-Si-o9J">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
-                                                <items>
-                                                    <menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="YGs-j5-SAR">
-                                                        <string key="title">	Default</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem id="Lbh-J2-qVU">
-                                                        <string key="title">	Left to Right</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem id="jFq-tB-4Kx">
-                                                        <string key="title">	Right to Left</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
-                                                    <menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                    </menuItem>
-                                                    <menuItem id="Nop-cj-93Q">
-                                                        <string key="title">	Default</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem id="BgM-ve-c93">
-                                                        <string key="title">	Left to Right</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                    <menuItem id="RB4-Sm-HuC">
-                                                        <string key="title">	Right to Left</string>
-                                                        <modifierMask key="keyEquivalentModifierMask"/>
-                                                        <connections>
-                                                            <action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
-                                                        </connections>
-                                                    </menuItem>
-                                                </items>
-                                            </menu>
-                                        </menuItem>
-                                        <menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
-                                        <menuItem title="Show Ruler" id="vLm-3I-IUL">
-                                            <modifierMask key="keyEquivalentModifierMask"/>
-                                            <connections>
-                                                <action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
-                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
-                                            <connections>
-                                                <action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
-                                            </connections>
-                                        </menuItem>
-                                        <menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
-                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
-                                            <connections>
-                                                <action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
-                                            </connections>
-                                        </menuItem>
-                                    </items>
-                                </menu>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="View" id="H8h-7b-M4v">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="View" id="HyV-fh-RgO">
-                        <items>
-                            <menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
-                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
-                                <connections>
-                                    <action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
-                                </connections>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="Window" id="aUF-d1-5bR">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
-                        <items>
-                            <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
-                                <connections>
-                                    <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem title="Zoom" id="R4o-n2-Eq4">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
-                                </connections>
-                            </menuItem>
-                            <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
-                            <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
-                                <modifierMask key="keyEquivalentModifierMask"/>
-                                <connections>
-                                    <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
-                                </connections>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-                <menuItem title="Help" id="wpr-3q-Mcd">
-                    <modifierMask key="keyEquivalentModifierMask"/>
-                    <menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
-                        <items>
-                            <menuItem title="OSXCocoaPodsTester Help" keyEquivalent="?" id="FKE-Sm-Kum">
-                                <connections>
-                                    <action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
-                                </connections>
-                            </menuItem>
-                        </items>
-                    </menu>
-                </menuItem>
-            </items>
-        </menu>
-        <window title="OSXCocoaPodsTester" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
-            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
-            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
-            <rect key="contentRect" x="335" y="390" width="480" height="360"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
-            <view key="contentView" id="EiT-Mj-1SZ">
-                <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
-                <autoresizingMask key="autoresizingMask"/>
-            </view>
-        </window>
-    </objects>
-</document>
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Info.plist b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Info.plist
deleted file mode 100644
index ed806e4..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Info.plist
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>$(EXECUTABLE_NAME)</string>
-	<key>CFBundleIconFile</key>
-	<string></string>
-	<key>CFBundleIdentifier</key>
-	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>$(PRODUCT_NAME)</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-	<key>LSMinimumSystemVersion</key>
-	<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
-	<key>NSHumanReadableCopyright</key>
-	<string>Copyright © 2016 Google. All rights reserved.</string>
-	<key>NSMainNibFile</key>
-	<string>MainMenu</string>
-	<key>NSPrincipalClass</key>
-	<string>NSApplication</string>
-</dict>
-</plist>
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/main.m b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/main.m
deleted file mode 100644
index b230090..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/main.m
+++ /dev/null
@@ -1,35 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import <Cocoa/Cocoa.h>
-
-int main(int argc, const char * argv[]) {
-  return NSApplicationMain(argc, argv);
-}
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-framework b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-framework
deleted file mode 100644
index 27eeafc..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-framework
+++ /dev/null
@@ -1,10 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :osx, '10.9'
-
-install! 'cocoapods', :deterministic_uuids => false
-
-use_frameworks!
-
-target 'OSXCocoaPodsTester' do
-  pod 'Protobuf', :path => '../../../..'
-end
diff --git a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-static b/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-static
deleted file mode 100644
index 5dfc8de..0000000
--- a/objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-static
+++ /dev/null
@@ -1,8 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :osx, '10.9'
-
-install! 'cocoapods', :deterministic_uuids => false
-
-target 'OSXCocoaPodsTester' do
-  pod 'Protobuf', :path => '../../../..'
-end
diff --git a/objectivec/Tests/CocoaPods/README.md b/objectivec/Tests/CocoaPods/README.md
deleted file mode 100644
index 0878591..0000000
--- a/objectivec/Tests/CocoaPods/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-CocoaPods Protocol Buffers Integration Tests
-============================================
-
-The sub directories are the basic projects as created by Xcode 6.3. They are
-used to then drive `pod` and `xcodebuild` to ensure things integrate/build
-as expected.
-
-`run_tests.sh` defaults to running all the tests, invoke it with `--help` to
-see the arguments to control what tests are run.
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-framework b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-framework
deleted file mode 100644
index 913a289..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-framework
+++ /dev/null
@@ -1,10 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
-
-install! 'cocoapods', :deterministic_uuids => false
-
-use_frameworks!
-
-target 'iOSCocoaPodsTester' do
-  pod 'Protobuf', :path => '../../../..'
-end
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-static b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-static
deleted file mode 100644
index e9b3c23..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-static
+++ /dev/null
@@ -1,8 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
-
-install! 'cocoapods', :deterministic_uuids => false
-
-target 'iOSCocoaPodsTester' do
-  pod 'Protobuf', :path => '../../../..'
-end
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.pbxproj b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.pbxproj
deleted file mode 100644
index 27fb553..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,309 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		F4D5A08B1CEE01E200562D79 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F4D5A08A1CEE01E200562D79 /* main.m */; };
-		F4D5A08E1CEE01E200562D79 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F4D5A08D1CEE01E200562D79 /* AppDelegate.m */; };
-		F4D5A0911CEE01E200562D79 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4D5A0901CEE01E200562D79 /* ViewController.m */; };
-		F4D5A0941CEE01E200562D79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F4D5A0921CEE01E200562D79 /* Main.storyboard */; };
-		F4D5A0961CEE01E200562D79 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4D5A0951CEE01E200562D79 /* Assets.xcassets */; };
-		F4D5A0991CEE01E200562D79 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F4D5A0971CEE01E200562D79 /* LaunchScreen.storyboard */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
-		F4D5A0861CEE01E200562D79 /* iOSCocoaPodsTester.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSCocoaPodsTester.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		F4D5A08A1CEE01E200562D79 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		F4D5A08C1CEE01E200562D79 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
-		F4D5A08D1CEE01E200562D79 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
-		F4D5A08F1CEE01E200562D79 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
-		F4D5A0901CEE01E200562D79 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
-		F4D5A0931CEE01E200562D79 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
-		F4D5A0951CEE01E200562D79 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
-		F4D5A0981CEE01E200562D79 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		F4D5A09A1CEE01E200562D79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		F4D5A0831CEE01E200562D79 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		F4D5A07D1CEE01E200562D79 = {
-			isa = PBXGroup;
-			children = (
-				F4D5A0881CEE01E200562D79 /* iOSCocoaPodsTester */,
-				F4D5A0871CEE01E200562D79 /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		F4D5A0871CEE01E200562D79 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				F4D5A0861CEE01E200562D79 /* iOSCocoaPodsTester.app */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		F4D5A0881CEE01E200562D79 /* iOSCocoaPodsTester */ = {
-			isa = PBXGroup;
-			children = (
-				F4D5A08C1CEE01E200562D79 /* AppDelegate.h */,
-				F4D5A08D1CEE01E200562D79 /* AppDelegate.m */,
-				F4D5A08F1CEE01E200562D79 /* ViewController.h */,
-				F4D5A0901CEE01E200562D79 /* ViewController.m */,
-				F4D5A0921CEE01E200562D79 /* Main.storyboard */,
-				F4D5A0951CEE01E200562D79 /* Assets.xcassets */,
-				F4D5A0971CEE01E200562D79 /* LaunchScreen.storyboard */,
-				F4D5A09A1CEE01E200562D79 /* Info.plist */,
-				F4D5A0891CEE01E200562D79 /* Supporting Files */,
-			);
-			path = iOSCocoaPodsTester;
-			sourceTree = "<group>";
-		};
-		F4D5A0891CEE01E200562D79 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				F4D5A08A1CEE01E200562D79 /* main.m */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		F4D5A0851CEE01E200562D79 /* iOSCocoaPodsTester */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = F4D5A09D1CEE01E200562D79 /* Build configuration list for PBXNativeTarget "iOSCocoaPodsTester" */;
-			buildPhases = (
-				F4D5A0821CEE01E200562D79 /* Sources */,
-				F4D5A0831CEE01E200562D79 /* Frameworks */,
-				F4D5A0841CEE01E200562D79 /* Resources */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = iOSCocoaPodsTester;
-			productName = iOSCocoaPodsTester;
-			productReference = F4D5A0861CEE01E200562D79 /* iOSCocoaPodsTester.app */;
-			productType = "com.apple.product-type.application";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		F4D5A07E1CEE01E200562D79 /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0730;
-				ORGANIZATIONNAME = Google;
-				TargetAttributes = {
-					F4D5A0851CEE01E200562D79 = {
-						CreatedOnToolsVersion = 7.3.1;
-					};
-				};
-			};
-			buildConfigurationList = F4D5A0811CEE01E200562D79 /* Build configuration list for PBXProject "iOSCocoaPodsTester" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-				Base,
-			);
-			mainGroup = F4D5A07D1CEE01E200562D79;
-			productRefGroup = F4D5A0871CEE01E200562D79 /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				F4D5A0851CEE01E200562D79 /* iOSCocoaPodsTester */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		F4D5A0841CEE01E200562D79 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				F4D5A0991CEE01E200562D79 /* LaunchScreen.storyboard in Resources */,
-				F4D5A0961CEE01E200562D79 /* Assets.xcassets in Resources */,
-				F4D5A0941CEE01E200562D79 /* Main.storyboard in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		F4D5A0821CEE01E200562D79 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				F4D5A0911CEE01E200562D79 /* ViewController.m in Sources */,
-				F4D5A08E1CEE01E200562D79 /* AppDelegate.m in Sources */,
-				F4D5A08B1CEE01E200562D79 /* main.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
-		F4D5A0921CEE01E200562D79 /* Main.storyboard */ = {
-			isa = PBXVariantGroup;
-			children = (
-				F4D5A0931CEE01E200562D79 /* Base */,
-			);
-			name = Main.storyboard;
-			sourceTree = "<group>";
-		};
-		F4D5A0971CEE01E200562D79 /* LaunchScreen.storyboard */ = {
-			isa = PBXVariantGroup;
-			children = (
-				F4D5A0981CEE01E200562D79 /* Base */,
-			);
-			name = LaunchScreen.storyboard;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		F4D5A09B1CEE01E200562D79 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ANALYZER_NONNULL = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				COPY_PHASE_STRIP = NO;
-				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				ENABLE_TESTABILITY = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				ONLY_ACTIVE_ARCH = YES;
-				SDKROOT = iphoneos;
-				TARGETED_DEVICE_FAMILY = "1,2";
-			};
-			name = Debug;
-		};
-		F4D5A09C1CEE01E200562D79 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ANALYZER_NONNULL = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				COPY_PHASE_STRIP = NO;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				ENABLE_NS_ASSERTIONS = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				SDKROOT = iphoneos;
-				TARGETED_DEVICE_FAMILY = "1,2";
-				VALIDATE_PRODUCT = YES;
-			};
-			name = Release;
-		};
-		F4D5A09E1CEE01E200562D79 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				INFOPLIST_FILE = iOSCocoaPodsTester/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
-				PRODUCT_BUNDLE_IDENTIFIER = com.google.iOSCocoaPodsTester;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Debug;
-		};
-		F4D5A09F1CEE01E200562D79 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				INFOPLIST_FILE = iOSCocoaPodsTester/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
-				PRODUCT_BUNDLE_IDENTIFIER = com.google.iOSCocoaPodsTester;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		F4D5A0811CEE01E200562D79 /* Build configuration list for PBXProject "iOSCocoaPodsTester" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				F4D5A09B1CEE01E200562D79 /* Debug */,
-				F4D5A09C1CEE01E200562D79 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		F4D5A09D1CEE01E200562D79 /* Build configuration list for PBXNativeTarget "iOSCocoaPodsTester" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				F4D5A09E1CEE01E200562D79 /* Debug */,
-				F4D5A09F1CEE01E200562D79 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = F4D5A07E1CEE01E200562D79 /* Project object */;
-}
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 008f7b4..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Workspace
-   version = "1.0">
-   <FileRef
-      location = "self:iOSCocoaPodsTester.xcodeproj">
-   </FileRef>
-</Workspace>
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/iOSCocoaPodsTester.xcscheme b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/iOSCocoaPodsTester.xcscheme
deleted file mode 100644
index 9558dd7..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/iOSCocoaPodsTester.xcscheme
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "0730"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "F4D5A0851CEE01E200562D79"
-               BuildableName = "iOSCocoaPodsTester.app"
-               BlueprintName = "iOSCocoaPodsTester"
-               ReferencedContainer = "container:iOSCocoaPodsTester.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "F4D5A0851CEE01E200562D79"
-            BuildableName = "iOSCocoaPodsTester.app"
-            BlueprintName = "iOSCocoaPodsTester"
-            ReferencedContainer = "container:iOSCocoaPodsTester.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "YES"
-      debugServiceExtension = "internal"
-      allowLocationSimulation = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "F4D5A0851CEE01E200562D79"
-            BuildableName = "iOSCocoaPodsTester.app"
-            BlueprintName = "iOSCocoaPodsTester"
-            ReferencedContainer = "container:iOSCocoaPodsTester.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "F4D5A0851CEE01E200562D79"
-            BuildableName = "iOSCocoaPodsTester.app"
-            BlueprintName = "iOSCocoaPodsTester"
-            ReferencedContainer = "container:iOSCocoaPodsTester.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.h b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.h
deleted file mode 100644
index 5eca690..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import <UIKit/UIKit.h>
-
-@interface AppDelegate : UIResponder <UIApplicationDelegate>
-
-@property (strong, nonatomic) UIWindow *window;
-
-
-@end
-
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.m b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.m
deleted file mode 100644
index dd7b969..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.m
+++ /dev/null
@@ -1,67 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import "AppDelegate.h"
-
-@interface AppDelegate ()
-
-@end
-
-@implementation AppDelegate
-
-
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-  // Override point for customization after application launch.
-  return YES;
-}
-
-- (void)applicationWillResignActive:(UIApplication *)application {
-  // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
-  // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
-}
-
-- (void)applicationDidEnterBackground:(UIApplication *)application {
-  // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
-  // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
-}
-
-- (void)applicationWillEnterForeground:(UIApplication *)application {
-  // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
-}
-
-- (void)applicationDidBecomeActive:(UIApplication *)application {
-  // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
-}
-
-- (void)applicationWillTerminate:(UIApplication *)application {
-  // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
-}
-
-@end
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 36d2c80..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "40x40",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "40x40",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "60x60",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "60x60",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "76x76",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "76x76",
-      "scale" : "2x"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}
\ No newline at end of file
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/LaunchScreen.storyboard b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index 2e721e1..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
-    </dependencies>
-    <scenes>
-        <!--View Controller-->
-        <scene sceneID="EHf-IW-A2E">
-            <objects>
-                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
-                    <layoutGuides>
-                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
-                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
-                    </layoutGuides>
-                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <animations/>
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
-                    </view>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="53" y="375"/>
-        </scene>
-    </scenes>
-</document>
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/Main.storyboard b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/Main.storyboard
deleted file mode 100644
index 82cd159..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
-    <dependencies>
-        <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
-    </dependencies>
-    <scenes>
-        <!--View Controller-->
-        <scene sceneID="tne-QT-ifu">
-            <objects>
-                <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
-                    <layoutGuides>
-                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
-                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
-                    </layoutGuides>
-                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
-                    </view>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
-            </objects>
-        </scene>
-    </scenes>
-</document>
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Info.plist b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Info.plist
deleted file mode 100644
index 40c6215..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Info.plist
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>$(EXECUTABLE_NAME)</string>
-	<key>CFBundleIdentifier</key>
-	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>$(PRODUCT_NAME)</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-	<key>LSRequiresIPhoneOS</key>
-	<true/>
-	<key>UILaunchStoryboardName</key>
-	<string>LaunchScreen</string>
-	<key>UIMainStoryboardFile</key>
-	<string>Main</string>
-	<key>UIRequiredDeviceCapabilities</key>
-	<array>
-		<string>armv7</string>
-	</array>
-	<key>UISupportedInterfaceOrientations</key>
-	<array>
-		<string>UIInterfaceOrientationPortrait</string>
-		<string>UIInterfaceOrientationLandscapeLeft</string>
-		<string>UIInterfaceOrientationLandscapeRight</string>
-	</array>
-	<key>UISupportedInterfaceOrientations~ipad</key>
-	<array>
-		<string>UIInterfaceOrientationPortrait</string>
-		<string>UIInterfaceOrientationPortraitUpsideDown</string>
-		<string>UIInterfaceOrientationLandscapeLeft</string>
-		<string>UIInterfaceOrientationLandscapeRight</string>
-	</array>
-</dict>
-</plist>
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.h b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.h
deleted file mode 100644
index 777257b..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import <UIKit/UIKit.h>
-
-@interface ViewController : UIViewController
-
-
-@end
-
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.m b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.m
deleted file mode 100644
index c3b7e6c..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.m
+++ /dev/null
@@ -1,49 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import "ViewController.h"
-
-@interface ViewController ()
-
-@end
-
-@implementation ViewController
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  // Do any additional setup after loading the view, typically from a nib.
-}
-
-- (void)didReceiveMemoryWarning {
-  [super didReceiveMemoryWarning];
-  // Dispose of any resources that can be recreated.
-}
-
-@end
diff --git a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/main.m b/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/main.m
deleted file mode 100644
index 4df0b76..0000000
--- a/objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/main.m
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-#import <UIKit/UIKit.h>
-#import "AppDelegate.h"
-
-int main(int argc, char * argv[]) {
-  @autoreleasepool {
-      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
-  }
-}
diff --git a/objectivec/Tests/CocoaPods/run_tests.sh b/objectivec/Tests/CocoaPods/run_tests.sh
deleted file mode 100755
index 6d3e12b..0000000
--- a/objectivec/Tests/CocoaPods/run_tests.sh
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/bin/bash
-#
-# Helper to run the pods tests.
-
-set -eu
-
-readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
-
-printUsage() {
-  NAME=$(basename "${0}")
-  cat << EOF
-usage: ${NAME} [OPTIONS]
-
-This script runs some test to check the CocoaPods integration.
-
-OPTIONS:
-
- General:
-
-   -h, --help
-         Show this message
-   --skip-static
-         Skip the static based pods tests.
-   --skip-framework
-         Skip the framework based pods tests.
-   --skip-ios
-         Skip the iOS pods tests.
-   --skip-osx
-         Skip the OS X pods tests.
-
-EOF
-}
-
-TEST_MODES=( "static" "framework" )
-TEST_NAMES=( "iOSCocoaPodsTester" "OSXCocoaPodsTester" )
-while [[ $# != 0 ]]; do
-  case "${1}" in
-    -h | --help )
-      printUsage
-      exit 0
-      ;;
-    --skip-static )
-      TEST_MODES=(${TEST_MODES[@]/static})
-      ;;
-    --skip-framework )
-      TEST_MODES=(${TEST_MODES[@]/framework})
-      ;;
-    --skip-ios )
-      TEST_NAMES=(${TEST_NAMES[@]/iOSCocoaPodsTester})
-      ;;
-    --skip-osx )
-      TEST_NAMES=(${TEST_NAMES[@]/OSXCocoaPodsTester})
-      ;;
-    -*)
-      echo "ERROR: Unknown option: ${1}" 1>&2
-      printUsage
-      exit 1
-      ;;
-    *)
-      echo "ERROR: Unknown argument: ${1}" 1>&2
-      printUsage
-      exit 1
-      ;;
-  esac
-  shift
-done
-
-# Sanity check.
-if [[ "${#TEST_NAMES[@]}" == 0 ]] ; then
-  echo "ERROR: Need to run at least iOS or OS X tests." 1>&2
-  exit 2
-fi
-if [[ "${#TEST_MODES[@]}" == 0 ]] ; then
-  echo "ERROR: Need to run at least static or frameworks tests." 1>&2
-  exit 2
-fi
-
-header() {
-  echo ""
-  echo "========================================================================"
-  echo "    ${@}"
-  echo "========================================================================"
-  echo ""
-}
-
-# Cleanup hook for do_test, assumes directory is correct.
-cleanup() {
-  local TEST_NAME="$1"
-
-  echo "Cleaning up..."
-
-  # Generally don't let things fail, and eat common stdout, but let stderr show
-  # incase something does hiccup.
-  xcodebuild -workspace "${TEST_NAME}.xcworkspace" -scheme "${TEST_NAME}" clean > /dev/null || true
-  pod deintegrate > /dev/null || true
-  # Flush the cache so nothing is left behind.
-  pod cache clean --all || true
-  # Delete the files left after pod deintegrate.
-  rm -f Podfile.lock || true
-  rm -rf "${TEST_NAME}.xcworkspace" || true
-  git checkout -- "${TEST_NAME}.xcodeproj" || true
-  # Remove the Podfile that was put in place.
-  rm -f Podfile || true
-}
-
-do_test() {
-  local TEST_NAME="$1"
-  local TEST_MODE="$2"
-
-  header "${TEST_NAME}" - Mode: "${TEST_MODE}"
-  cd "${ScriptDir}/${TEST_NAME}"
-
-  # Hook in cleanup for any failures.
-  trap "cleanup ${TEST_NAME}" EXIT
-
-  # Ensure nothing is cached by pods to start with that could throw things off.
-  pod cache clean --all
-
-  # Put the right Podfile in place.
-  cp -f "Podfile-${TEST_MODE}" "Podfile"
-
-  xcodebuild_args=( "-workspace" "${TEST_NAME}.xcworkspace" "-scheme" "${TEST_NAME}" )
-
-  # For iOS, if the SDK is not provided it tries to use iphoneos, and the test
-  # fail on Travis since those machines don't have a Code Signing identity.
-  if  [[ "${TEST_NAME}" == iOS* ]] ; then
-    # Apparently the destination flag is required to avoid "Unsupported architecture"
-    # errors.
-    xcodebuild_args+=(
-        -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO
-        -destination "platform=iOS Simulator,name=iPad 2,OS=9.3"
-    )
-  fi
-
-  # Do the work!
-  pod install --verbose
-
-  xcodebuild "${xcodebuild_args[@]}" build
-
-  # Clear the hook and manually run cleanup.
-  trap - EXIT
-  cleanup "${TEST_NAME}"
-}
-
-# Run the tests.
-for TEST_NAME in "${TEST_NAMES[@]}" ; do
-  for TEST_MODE in "${TEST_MODES[@]}" ; do
-    do_test "${TEST_NAME}" "${TEST_MODE}"
-  done
-done
diff --git a/objectivec/Tests/GPBARCUnittestProtos.m b/objectivec/Tests/GPBARCUnittestProtos.m
index 29f6ccf..28d2396 100644
--- a/objectivec/Tests/GPBARCUnittestProtos.m
+++ b/objectivec/Tests/GPBARCUnittestProtos.m
@@ -42,8 +42,6 @@
 #import "google/protobuf/Unittest.pbobjc.h"
 #import "google/protobuf/UnittestCustomOptions.pbobjc.h"
 #import "google/protobuf/UnittestCycle.pbobjc.h"
-#import "google/protobuf/UnittestDeprecated.pbobjc.h"
-#import "google/protobuf/UnittestDeprecatedFile.pbobjc.h"
 #import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
 #import "google/protobuf/UnittestEmbedOptimizeFor.pbobjc.h"
 #import "google/protobuf/UnittestEmpty.pbobjc.h"
diff --git a/objectivec/Tests/GPBArrayTests.m b/objectivec/Tests/GPBArrayTests.m
index e414d90..0fb15e4 100644
--- a/objectivec/Tests/GPBArrayTests.m
+++ b/objectivec/Tests/GPBArrayTests.m
@@ -32,14 +32,12 @@
 #import <XCTest/XCTest.h>
 
 #import "GPBArray.h"
-#import "GPBArray_PackagePrivate.h"
 
 #import "GPBTestUtilities.h"
 
 // To let the testing macros work, add some extra methods to simplify things.
 @interface GPBEnumArray (TestingTweak)
 + (instancetype)arrayWithValue:(int32_t)value;
-+ (instancetype)arrayWithCapacity:(NSUInteger)count;
 - (instancetype)initWithValues:(const int32_t [])values
                          count:(NSUInteger)count;
 @end
@@ -73,10 +71,6 @@
                                          rawValues:&value
                                              count:1] autorelease];
 }
-+ (instancetype)arrayWithCapacity:(NSUInteger)count {
-  return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
-                                          capacity:count] autorelease];
-}
 - (instancetype)initWithValues:(const int32_t [])values
                          count:(NSUInteger)count {
   return [self initWithValidationFunction:TestingEnum_IsValidValue
@@ -182,8 +176,6 @@
 //%    XCTAssertNotEqual(idx, 0U);
 //%    ++idx2;
 //%  }];
-//%  // Ensure description doesn't choke.
-//%  XCTAssertTrue(array.description.length > 10);
 //%  [array release];
 //%}
 //%
@@ -208,10 +200,6 @@
 //%            NAME$S                     count:GPBARRAYSIZE(kValues3)];
 //%  XCTAssertNotNil(array3);
 //%
-//%  // Identity
-//%  XCTAssertTrue([array1 isEqual:array1]);
-//%  // Wrong type doesn't blow up.
-//%  XCTAssertFalse([array1 isEqual:@"bogus"]);
 //%  // 1/1Prime should be different objects, but equal.
 //%  XCTAssertNotEqual(array1, array1prime);
 //%  XCTAssertEqualObjects(array1, array1prime);
@@ -282,12 +270,6 @@
 //%  [array add##HELPER##ValuesFromArray:array2];
 //%  XCTAssertEqual(array.count, 5U);
 //%
-//%  // Zero/nil inputs do nothing.
-//%  [array addValues:kValues1 count:0];
-//%  XCTAssertEqual(array.count, 5U);
-//%  [array addValues:NULL count:5];
-//%  XCTAssertEqual(array.count, 5U);
-//%
 //%  XCTAssertEqual([array valueAtIndex:0], VAL1);
 //%  XCTAssertEqual([array valueAtIndex:1], VAL2);
 //%  XCTAssertEqual([array valueAtIndex:2], VAL3);
@@ -408,9 +390,9 @@
 //%- (void)testInternalResizing {
 //%  const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 };
 //%  GPB##NAME##Array *array =
-//%      [GPB##NAME##Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
+//%      [[GPB##NAME##Array alloc] initWithValues:kValues
+//%            NAME$S                     count:GPBARRAYSIZE(kValues)];
 //%  XCTAssertNotNil(array);
-//%  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 //%
 //%  // Add/remove to trigger the intneral buffer to grow/shrink.
 //%  for (int i = 0; i < 100; ++i) {
@@ -427,6 +409,7 @@
 //%  XCTAssertEqual(array.count, 404U);
 //%  [array removeAll];
 //%  XCTAssertEqual(array.count, 0U);
+//%  [array release];
 //%}
 //%
 //%@end
@@ -526,8 +509,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -552,10 +533,6 @@
                                       count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -626,12 +603,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 1);
   XCTAssertEqual([array valueAtIndex:1], 2);
   XCTAssertEqual([array valueAtIndex:2], 3);
@@ -752,9 +723,9 @@
 - (void)testInternalResizing {
   const int32_t kValues[] = { 1, 2, 3, 4 };
   GPBInt32Array *array =
-      [GPBInt32Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBInt32Array alloc] initWithValues:kValues
+                                      count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -771,6 +742,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -870,8 +842,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -896,10 +866,6 @@
                                        count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -970,12 +936,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 11U);
   XCTAssertEqual([array valueAtIndex:1], 12U);
   XCTAssertEqual([array valueAtIndex:2], 13U);
@@ -1096,9 +1056,9 @@
 - (void)testInternalResizing {
   const uint32_t kValues[] = { 11U, 12U, 13U, 14U };
   GPBUInt32Array *array =
-      [GPBUInt32Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32Array alloc] initWithValues:kValues
+                                       count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -1115,6 +1075,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -1214,8 +1175,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -1240,10 +1199,6 @@
                                       count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -1314,12 +1269,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 31LL);
   XCTAssertEqual([array valueAtIndex:1], 32LL);
   XCTAssertEqual([array valueAtIndex:2], 33LL);
@@ -1440,9 +1389,9 @@
 - (void)testInternalResizing {
   const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL };
   GPBInt64Array *array =
-      [GPBInt64Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBInt64Array alloc] initWithValues:kValues
+                                      count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -1459,6 +1408,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -1558,8 +1508,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -1584,10 +1532,6 @@
                                        count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -1658,12 +1602,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 41ULL);
   XCTAssertEqual([array valueAtIndex:1], 42ULL);
   XCTAssertEqual([array valueAtIndex:2], 43ULL);
@@ -1784,9 +1722,9 @@
 - (void)testInternalResizing {
   const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL };
   GPBUInt64Array *array =
-      [GPBUInt64Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64Array alloc] initWithValues:kValues
+                                       count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -1803,6 +1741,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -1902,8 +1841,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -1928,10 +1865,6 @@
                                       count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -2002,12 +1935,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 51.f);
   XCTAssertEqual([array valueAtIndex:1], 52.f);
   XCTAssertEqual([array valueAtIndex:2], 53.f);
@@ -2128,9 +2055,9 @@
 - (void)testInternalResizing {
   const float kValues[] = { 51.f, 52.f, 53.f, 54.f };
   GPBFloatArray *array =
-      [GPBFloatArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBFloatArray alloc] initWithValues:kValues
+                                      count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -2147,6 +2074,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -2246,8 +2174,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -2272,10 +2198,6 @@
                                        count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -2346,12 +2268,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 61.);
   XCTAssertEqual([array valueAtIndex:1], 62.);
   XCTAssertEqual([array valueAtIndex:2], 63.);
@@ -2472,9 +2388,9 @@
 - (void)testInternalResizing {
   const double kValues[] = { 61., 62., 63., 64. };
   GPBDoubleArray *array =
-      [GPBDoubleArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBDoubleArray alloc] initWithValues:kValues
+                                       count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -2491,6 +2407,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -2590,8 +2507,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -2616,10 +2531,6 @@
                                      count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -2690,12 +2601,6 @@
   [array addValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], TRUE);
   XCTAssertEqual([array valueAtIndex:1], TRUE);
   XCTAssertEqual([array valueAtIndex:2], FALSE);
@@ -2816,9 +2721,9 @@
 - (void)testInternalResizing {
   const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
   GPBBoolArray *array =
-      [GPBBoolArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBBoolArray alloc] initWithValues:kValues
+                                     count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -2835,6 +2740,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -2934,8 +2840,6 @@
     XCTAssertNotEqual(idx, 0U);
     ++idx2;
   }];
-  // Ensure description doesn't choke.
-  XCTAssertTrue(array.description.length > 10);
   [array release];
 }
 
@@ -2960,10 +2864,6 @@
                                      count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(array3);
 
-  // Identity
-  XCTAssertTrue([array1 isEqual:array1]);
-  // Wrong type doesn't blow up.
-  XCTAssertFalse([array1 isEqual:@"bogus"]);
   // 1/1Prime should be different objects, but equal.
   XCTAssertNotEqual(array1, array1prime);
   XCTAssertEqualObjects(array1, array1prime);
@@ -3034,12 +2934,6 @@
   [array addRawValuesFromArray:array2];
   XCTAssertEqual(array.count, 5U);
 
-  // Zero/nil inputs do nothing.
-  [array addValues:kValues1 count:0];
-  XCTAssertEqual(array.count, 5U);
-  [array addValues:NULL count:5];
-  XCTAssertEqual(array.count, 5U);
-
   XCTAssertEqual([array valueAtIndex:0], 71);
   XCTAssertEqual([array valueAtIndex:1], 72);
   XCTAssertEqual([array valueAtIndex:2], 73);
@@ -3160,9 +3054,9 @@
 - (void)testInternalResizing {
   const int32_t kValues[] = { 71, 72, 73, 74 };
   GPBEnumArray *array =
-      [GPBEnumArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
+      [[GPBEnumArray alloc] initWithValues:kValues
+                                     count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(array);
-  [array addValues:kValues count:GPBARRAYSIZE(kValues)];
 
   // Add/remove to trigger the intneral buffer to grow/shrink.
   for (int i = 0; i < 100; ++i) {
@@ -3179,6 +3073,7 @@
   XCTAssertEqual(array.count, 404U);
   [array removeAll];
   XCTAssertEqual(array.count, 0U);
+  [array release];
 }
 
 @end
@@ -3541,175 +3436,3 @@
 }
 
 @end
-
-#pragma mark - GPBAutocreatedArray Tests
-
-// These are hand written tests to double check some behaviors of the
-// GPBAutocreatedArray.
-
-// NOTE: GPBAutocreatedArray is private to the library, users of the library
-// should never have to directly deal with this class.
-
-@interface GPBAutocreatedArrayTests : XCTestCase
-@end
-
-@implementation GPBAutocreatedArrayTests
-
-- (void)testEquality {
-  GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
-
-  XCTAssertTrue([array isEqual:@[]]);
-  XCTAssertTrue([array isEqualToArray:@[]]);
-
-  XCTAssertFalse([array isEqual:@[ @"foo" ]]);
-  XCTAssertFalse([array isEqualToArray:@[ @"foo" ]]);
-
-  [array addObject:@"foo"];
-
-  XCTAssertFalse([array isEqual:@[]]);
-  XCTAssertFalse([array isEqualToArray:@[]]);
-  XCTAssertTrue([array isEqual:@[ @"foo" ]]);
-  XCTAssertTrue([array isEqualToArray:@[ @"foo" ]]);
-  XCTAssertFalse([array isEqual:@[ @"bar" ]]);
-  XCTAssertFalse([array isEqualToArray:@[ @"bar" ]]);
-
-  GPBAutocreatedArray *array2 = [[GPBAutocreatedArray alloc] init];
-
-  XCTAssertFalse([array isEqual:array2]);
-  XCTAssertFalse([array isEqualToArray:array2]);
-
-  [array2 addObject:@"bar"];
-  XCTAssertFalse([array isEqual:array2]);
-  XCTAssertFalse([array isEqualToArray:array2]);
-
-  [array2 replaceObjectAtIndex:0 withObject:@"foo"];
-  XCTAssertTrue([array isEqual:array2]);
-  XCTAssertTrue([array isEqualToArray:array2]);
-
-  [array2 release];
-  [array release];
-}
-
-- (void)testCopy {
-  {
-    GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
-
-    NSArray *cpy = [array copy];
-    XCTAssertTrue(cpy != array); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)0);
-
-    NSArray *cpy2 = [array copy];
-    XCTAssertTrue(cpy2 != array); // Ptr compare
-    // Can't compare cpy and cpy2 because NSArray has a singleton empty
-    // array it uses, so the ptrs are the same.
-    XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)0);
-
-    [cpy2 release];
-    [cpy release];
-    [array release];
-  }
-
-  {
-    GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
-
-    NSMutableArray *cpy = [array mutableCopy];
-    XCTAssertTrue(cpy != array); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSMutableArray class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)0);
-
-    NSMutableArray *cpy2 = [array mutableCopy];
-    XCTAssertTrue(cpy2 != array); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSMutableArray class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)0);
-
-    [cpy2 release];
-    [cpy release];
-    [array release];
-  }
-
-  {
-    GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
-    [array addObject:@"foo"];
-    [array addObject:@"bar"];
-
-    NSArray *cpy = [array copy];
-    XCTAssertTrue(cpy != array); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy[0], @"foo");
-    XCTAssertEqualObjects(cpy[1], @"bar");
-
-    NSArray *cpy2 = [array copy];
-    XCTAssertTrue(cpy2 != array); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy2[0], @"foo");
-    XCTAssertEqualObjects(cpy2[1], @"bar");
-
-    [cpy2 release];
-    [cpy release];
-    [array release];
-  }
-
-  {
-    GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
-    [array addObject:@"foo"];
-    [array addObject:@"bar"];
-
-    NSMutableArray *cpy = [array mutableCopy];
-    XCTAssertTrue(cpy != array); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy[0], @"foo");
-    XCTAssertEqualObjects(cpy[1], @"bar");
-
-    NSMutableArray *cpy2 = [array mutableCopy];
-    XCTAssertTrue(cpy2 != array); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy2[0], @"foo");
-    XCTAssertEqualObjects(cpy2[1], @"bar");
-
-    [cpy2 release];
-    [cpy release];
-    [array release];
-  }
-}
-
-- (void)testIndexedSubscriptSupport {
-  // The base NSArray/NSMutableArray behaviors for *IndexedSubscript methods
-  // should still work via the methods that one has to override to make an
-  // NSMutableArray subclass.  i.e. - this should "just work" and if these
-  // crash/fail, then something is wrong in how NSMutableArray is subclassed.
-
-  GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
-
-  [array addObject:@"foo"];
-  [array addObject:@"bar"];
-  XCTAssertEqual(array.count, (NSUInteger)2);
-  XCTAssertEqualObjects(array[0], @"foo");
-  XCTAssertEqualObjects(array[1], @"bar");
-  array[0] = @"foo2";
-  array[2] = @"baz";
-  XCTAssertEqual(array.count, (NSUInteger)3);
-  XCTAssertEqualObjects(array[0], @"foo2");
-  XCTAssertEqualObjects(array[1], @"bar");
-  XCTAssertEqualObjects(array[2], @"baz");
-
-  [array release];
-}
-
-@end
diff --git a/objectivec/Tests/GPBCodedInputStreamTests.m b/objectivec/Tests/GPBCodedInputStreamTests.m
index d8e128f..cc40215 100644
--- a/objectivec/Tests/GPBCodedInputStreamTests.m
+++ b/objectivec/Tests/GPBCodedInputStreamTests.m
@@ -62,101 +62,52 @@
 #define bytes(...) [self bytes_with_sentinel:0, __VA_ARGS__, 256]
 
 - (void)testDecodeZigZag {
-  [self assertReadZigZag32:bytes(0x0) value:0];
-  [self assertReadZigZag32:bytes(0x1) value:-1];
-  [self assertReadZigZag32:bytes(0x2) value:1];
-  [self assertReadZigZag32:bytes(0x3) value:-2];
+  XCTAssertEqual(0, GPBDecodeZigZag32(0));
+  XCTAssertEqual(-1, GPBDecodeZigZag32(1));
+  XCTAssertEqual(1, GPBDecodeZigZag32(2));
+  XCTAssertEqual(-2, GPBDecodeZigZag32(3));
+  XCTAssertEqual((int32_t)0x3FFFFFFF, GPBDecodeZigZag32(0x7FFFFFFE));
+  XCTAssertEqual((int32_t)0xC0000000, GPBDecodeZigZag32(0x7FFFFFFF));
+  XCTAssertEqual((int32_t)0x7FFFFFFF, GPBDecodeZigZag32(0xFFFFFFFE));
+  XCTAssertEqual((int32_t)0x80000000, GPBDecodeZigZag32(0xFFFFFFFF));
 
-  [self assertReadZigZag32:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0x07) value:(int32_t)0x3FFFFFFF];
-  [self assertReadZigZag32:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x07) value:(int32_t)0xC0000000];
-  [self assertReadZigZag32:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0x0F) value:(int32_t)0x7FFFFFFF];
-  [self assertReadZigZag32:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x0F) value:(int32_t)0x80000000];
-
-  [self assertReadZigZag64:bytes(0x0) value:0];
-  [self assertReadZigZag64:bytes(0x1) value:-1];
-  [self assertReadZigZag64:bytes(0x2) value:1];
-  [self assertReadZigZag64:bytes(0x3) value:-2];
-
-  [self assertReadZigZag64:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0x07) value:(int32_t)0x3FFFFFFF];
-  [self assertReadZigZag64:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x07) value:(int32_t)0xC0000000];
-  [self assertReadZigZag64:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0x0F) value:(int32_t)0x7FFFFFFF];
-  [self assertReadZigZag64:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x0F) value:(int32_t)0x80000000];
-
-  [self assertReadZigZag64:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01) value:0x7FFFFFFFFFFFFFFFL];
-  [self assertReadZigZag64:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01) value:0x8000000000000000L];
+  XCTAssertEqual((int64_t)0, GPBDecodeZigZag64(0));
+  XCTAssertEqual((int64_t)-1, GPBDecodeZigZag64(1));
+  XCTAssertEqual((int64_t)1, GPBDecodeZigZag64(2));
+  XCTAssertEqual((int64_t)-2, GPBDecodeZigZag64(3));
+  XCTAssertEqual((int64_t)0x000000003FFFFFFFL,
+                 GPBDecodeZigZag64(0x000000007FFFFFFEL));
+  XCTAssertEqual((int64_t)0xFFFFFFFFC0000000L,
+                 GPBDecodeZigZag64(0x000000007FFFFFFFL));
+  XCTAssertEqual((int64_t)0x000000007FFFFFFFL,
+                 GPBDecodeZigZag64(0x00000000FFFFFFFEL));
+  XCTAssertEqual((int64_t)0xFFFFFFFF80000000L,
+                 GPBDecodeZigZag64(0x00000000FFFFFFFFL));
+  XCTAssertEqual((int64_t)0x7FFFFFFFFFFFFFFFL,
+                 GPBDecodeZigZag64(0xFFFFFFFFFFFFFFFEL));
+  XCTAssertEqual((int64_t)0x8000000000000000L,
+                 GPBDecodeZigZag64(0xFFFFFFFFFFFFFFFFL));
 }
 
 - (void)assertReadVarint:(NSData*)data value:(int64_t)value {
-  if (value <= INT32_MAX && value >= INT32_MIN) {
-    {
-      GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-      XCTAssertEqual((int32_t)value, [input readInt32]);
-    }
-    {
-      GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-      XCTAssertEqual((int32_t)value, [input readEnum]);
-    }
-  }
-  if (value <= UINT32_MAX && value >= 0) {
+  {
     GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual((uint32_t)value, [input readUInt32]);
+    XCTAssertEqual((int32_t)value, [input readInt32]);
   }
   {
     GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
     XCTAssertEqual(value, [input readInt64]);
   }
-  if (value >= 0) {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual((uint64_t)value, [input readUInt64]);
-  }
 }
 
 - (void)assertReadLittleEndian32:(NSData*)data value:(int32_t)value {
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value, [input readSFixed32]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(GPBConvertInt32ToFloat(value), [input readFloat]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual((uint32_t)value, [input readFixed32]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value, [input readSFixed32]);
-  }
+  GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
+  XCTAssertEqual(value, [input readSFixed32]);
 }
 
 - (void)assertReadLittleEndian64:(NSData*)data value:(int64_t)value {
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value, [input readSFixed64]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(GPBConvertInt64ToDouble(value), [input readDouble]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual((uint64_t)value, [input readFixed64]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value, [input readSFixed64]);
-  }
-}
-
-- (void)assertReadZigZag32:(NSData*)data value:(int64_t)value {
   GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-  XCTAssertEqual((int32_t)value, [input readSInt32]);
-}
-
-- (void)assertReadZigZag64:(NSData*)data value:(int64_t)value {
-  GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-  XCTAssertEqual(value, [input readSInt64]);
+  XCTAssertEqual(value, [input readSFixed64]);
 }
 
 - (void)assertReadVarintFailure:(NSData*)data {
@@ -177,28 +128,12 @@
   XCTAssertEqual(((uint8_t*)data.bytes)[1], (uint8_t)0x74);
 }
 
-- (void)testReadBool {
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:bytes(0x00)];
-    XCTAssertEqual(NO, [input readBool]);
-  }
-  {
-    GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:bytes(0x01)];
-    XCTAssertEqual(YES, [input readBool]);
-  }
-}
-
 - (void)testReadVarint {
   [self assertReadVarint:bytes(0x00) value:0];
   [self assertReadVarint:bytes(0x01) value:1];
   [self assertReadVarint:bytes(0x7f) value:127];
   // 14882
   [self assertReadVarint:bytes(0xa2, 0x74) value:(0x22 << 0) | (0x74 << 7)];
-  // 1904930
-  [self assertReadVarint:bytes(0xa2, 0xa2, 0x74) value:(0x22 << 0) | (0x22 << 7) | (0x74 << 14)];
-  // 243831074
-  [self assertReadVarint:bytes(0xa2, 0xa2, 0xa2, 0x74)
-                   value:(0x22 << 0) | (0x22 << 7) | (0x22 << 14) | (0x74 << 21)];
   // 2961488830
   [self assertReadVarint:bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b)
                    value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) |
@@ -228,45 +163,6 @@
   [self assertReadVarintFailure:bytes(0x80)];
 }
 
-- (void)testReadVarint32FromVarint64 {
-  {
-    // Turn on lower 31 bits of the upper half on a 64 bit varint.
-    NSData* data = bytes(0x80, 0x80, 0x80, 0x80, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E);
-
-    int32_t value32 = 0x0;
-    GPBCodedInputStream* input32 = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value32, [input32 readInt32]);
-
-    int64_t value64 = INT64_MAX & 0xFFFFFFFF00000000;
-    GPBCodedInputStream* input64 = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value64, [input64 readInt64]);
-  }
-  {
-    // Turn on lower 31 bits and lower 31 bits on upper half on a 64 bit varint.
-    NSData* data = bytes(0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E);
-
-    int32_t value32 = INT32_MAX;
-    GPBCodedInputStream* input32 = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value32, [input32 readInt32]);
-
-    int64_t value64 = INT64_MAX & 0xFFFFFFFF7FFFFFFF;
-    GPBCodedInputStream* input64 = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value64, [input64 readInt64]);
-  }
-  {
-    // Turn on bits 32 and 64 bit on a 64 bit varint.
-    NSData* data = bytes(0x80, 0x80, 0x80, 0x80, 0x88, 0x80, 0x80, 0x80, 0x80, 0x01);
-
-    int32_t value32 = INT32_MIN;
-    GPBCodedInputStream* input32 = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value32, [input32 readInt32]);
-
-    int64_t value64 = INT64_MIN | (0x01L << 31);
-    GPBCodedInputStream* input64 = [GPBCodedInputStream streamWithData:data];
-    XCTAssertEqual(value64, [input64 readInt64]);
-  }
-}
-
 - (void)testReadLittleEndian {
   [self assertReadLittleEndian32:bytes(0x78, 0x56, 0x34, 0x12)
                            value:0x12345678];
@@ -369,27 +265,6 @@
   XCTAssertThrows([input readBytes]);
 }
 
-- (void)testReadEmptyString {
-  NSData *data = bytes(0x00);
-  GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-  XCTAssertEqualObjects(@"", [input readString]);
-}
-
-- (void)testInvalidGroupEndTagThrows {
-  NSData *data = bytes(0x0B, 0x1A, 0x02, 0x4B, 0x50, 0x14);
-  GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
-  XCTAssertThrowsSpecificNamed([input skipMessage],
-                               NSException,
-                               GPBCodedInputStreamException,
-                               @"should throw a GPBCodedInputStreamException exception ");
-}
-
-- (void)testBytesWithNegativeSize {
-  NSData *data = bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x0F);
-  GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:data];
-  XCTAssertNil([input readBytes]);
-}
-
 // Verifies fix for b/10315336.
 // Note: Now that there isn't a custom string class under the hood, this test
 // isn't as critical, but it does cover bad input and if a custom class is added
diff --git a/objectivec/Tests/GPBCodedOuputStreamTests.m b/objectivec/Tests/GPBCodedOuputStreamTests.m
index 2ad326b..0723b64 100644
--- a/objectivec/Tests/GPBCodedOuputStreamTests.m
+++ b/objectivec/Tests/GPBCodedOuputStreamTests.m
@@ -193,32 +193,6 @@
   }
 }
 
-- (void)assertWriteStringNoTag:(NSData*)data
-                         value:(NSString *)value
-                       context:(NSString *)contextMessage {
-  NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
-  GPBCodedOutputStream* output =
-      [GPBCodedOutputStream streamWithOutputStream:rawOutput];
-  [output writeStringNoTag:value];
-  [output flush];
-
-  NSData* actual =
-      [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
-  XCTAssertEqualObjects(data, actual, @"%@", contextMessage);
-
-  // Try different block sizes.
-  for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
-    rawOutput = [NSOutputStream outputStreamToMemory];
-    output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
-                                               bufferSize:blockSize];
-    [output writeStringNoTag:value];
-    [output flush];
-
-    actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
-    XCTAssertEqualObjects(data, actual, @"%@", contextMessage);
-  }
-}
-
 - (void)testWriteVarint1 {
   [self assertWriteVarint:bytes(0x00) value:0];
 }
@@ -363,64 +337,4 @@
   XCTAssertEqualObjects(rawBytes, goldenData);
 }
 
-- (void)testCFStringGetCStringPtrAndStringsWithNullChars {
-  // This test exists to verify that CFStrings with embedded NULLs still expose
-  // their raw buffer if they are backed by UTF8 storage. If this fails, the
-  // quick/direct access paths in GPBCodedOutputStream that depend on
-  // CFStringGetCStringPtr need to be re-evalutated (maybe just removed).
-  // And yes, we do get NULLs in strings from some servers.
-
-  char zeroTest[] = "\0Test\0String";
-  // Note: there is a \0 at the end of this since it is a c-string.
-  NSString *asNSString = [[NSString alloc] initWithBytes:zeroTest
-                                                  length:sizeof(zeroTest)
-                                                encoding:NSUTF8StringEncoding];
-  const char *cString =
-      CFStringGetCStringPtr((CFStringRef)asNSString, kCFStringEncodingUTF8);
-  XCTAssertTrue(cString != NULL);
-  // Again, if the above assert fails, then it means NSString no longer exposes
-  // the raw utf8 storage of a string created from utf8 input, so the code using
-  // CFStringGetCStringPtr in GPBCodedOutputStream will still work (it will take
-  // a different code path); but the optimizations for when
-  // CFStringGetCStringPtr does work could possibly go away.
-
-  XCTAssertEqual(sizeof(zeroTest),
-                 [asNSString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
-  XCTAssertTrue(0 == memcmp(cString, zeroTest, sizeof(zeroTest)));
-  [asNSString release];
-}
-
-- (void)testWriteStringsWithZeroChar {
-  // Unicode allows `\0` as a character, and NSString is a class cluster, so
-  // there are a few different classes that could end up beind a given string.
-  // Historically, we've seen differences based on constant strings in code and
-  // strings built via the NSString apis. So this round trips them to ensure
-  // they are acting as expected.
-
-  NSArray<NSString *> *strs = @[
-    @"\0at start",
-    @"in\0middle",
-    @"at end\0",
-  ];
-  int i = 0;
-  for (NSString *str in strs) {
-    NSData *asUTF8 = [str dataUsingEncoding:NSUTF8StringEncoding];
-    NSMutableData *expected = [NSMutableData data];
-    uint8_t lengthByte = (uint8_t)asUTF8.length;
-    [expected appendBytes:&lengthByte length:1];
-    [expected appendData:asUTF8];
-
-    NSString *context = [NSString stringWithFormat:@"Loop %d - Literal", i];
-    [self assertWriteStringNoTag:expected value:str context:context];
-
-    // Force a new string to be built which gets a different class from the
-    // NSString class cluster than the literal did.
-    NSString *str2 = [NSString stringWithFormat:@"%@", str];
-    context = [NSString stringWithFormat:@"Loop %d - Built", i];
-    [self assertWriteStringNoTag:expected value:str2 context:context];
-
-    ++i;
-  }
-}
-
 @end
diff --git a/objectivec/Tests/GPBDescriptorTests.m b/objectivec/Tests/GPBDescriptorTests.m
index 199ea65..a1923c9 100644
--- a/objectivec/Tests/GPBDescriptorTests.m
+++ b/objectivec/Tests/GPBDescriptorTests.m
@@ -32,43 +32,14 @@
 
 #import <objc/runtime.h>
 
-#import "GPBDescriptor_PackagePrivate.h"
+#import "GPBDescriptor.h"
 #import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
-#import "google/protobuf/Descriptor.pbobjc.h"
 
 @interface DescriptorTests : GPBTestCase
 @end
 
 @implementation DescriptorTests
 
-- (void)testDescriptor_containingType {
-  GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor];
-  GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor];
-  XCTAssertNil(testAllTypesDesc.containingType);
-  XCTAssertNotNil(nestedMessageDesc.containingType);
-  XCTAssertEqual(nestedMessageDesc.containingType, testAllTypesDesc);  // Ptr comparison
-}
-
-- (void)testDescriptor_fullName {
-  GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor];
-  XCTAssertEqualObjects(testAllTypesDesc.fullName, @"protobuf_unittest.TestAllTypes");
-  GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor];
-  XCTAssertEqualObjects(nestedMessageDesc.fullName, @"protobuf_unittest.TestAllTypes.NestedMessage");
-
-  // Prefixes removed.
-  GPBDescriptor *descDesc = [GPBDescriptorProto descriptor];
-  XCTAssertEqualObjects(descDesc.fullName, @"google.protobuf.DescriptorProto");
-  GPBDescriptor *descExtRngDesc = [GPBDescriptorProto_ExtensionRange descriptor];
-  XCTAssertEqualObjects(descExtRngDesc.fullName, @"google.protobuf.DescriptorProto.ExtensionRange");
-
-  // Things that get "_Class" added.
-  GPBDescriptor *pointDesc = [Point_Class descriptor];
-  XCTAssertEqualObjects(pointDesc.fullName, @"protobuf_unittest.Point");
-  GPBDescriptor *pointRectDesc = [Point_Rect descriptor];
-  XCTAssertEqualObjects(pointRectDesc.fullName, @"protobuf_unittest.Point.Rect");
-}
-
 - (void)testFieldDescriptor {
   GPBDescriptor *descriptor = [TestAllTypes descriptor];
 
@@ -83,8 +54,6 @@
   XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
   XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
                         @"TestAllTypes_NestedEnum");
-  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
-  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
 
   // Foreign Enum
   fieldDescriptorWithName = [descriptor fieldWithName:@"optionalForeignEnum"];
@@ -95,8 +64,6 @@
   XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
   XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
                         @"ForeignEnum");
-  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
-  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
 
   // Import Enum
   fieldDescriptorWithName = [descriptor fieldWithName:@"optionalImportEnum"];
@@ -107,8 +74,6 @@
   XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
   XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
                         @"ImportEnum");
-  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
-  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
 
   // Nested Message
   fieldDescriptorWithName = [descriptor fieldWithName:@"optionalNestedMessage"];
@@ -117,8 +82,6 @@
   XCTAssertNotNil(fieldDescriptorWithNumber);
   XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
   XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor);
-  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
-  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
 
   // Foreign Message
   fieldDescriptorWithName =
@@ -128,8 +91,6 @@
   XCTAssertNotNil(fieldDescriptorWithNumber);
   XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
   XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor);
-  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
-  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
 
   // Import Message
   fieldDescriptorWithName = [descriptor fieldWithName:@"optionalImportMessage"];
@@ -138,12 +99,6 @@
   XCTAssertNotNil(fieldDescriptorWithNumber);
   XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
   XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor);
-  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
-  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
-
-  // Some failed lookups.
-  XCTAssertNil([descriptor fieldWithName:@"NOT THERE"]);
-  XCTAssertNil([descriptor fieldWithNumber:9876543]);
 }
 
 - (void)testEnumDescriptor {
@@ -170,13 +125,6 @@
       [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Baz"]);
   XCTAssertEqual(value, TestAllTypes_NestedEnum_Baz);
 
-  // TextFormat
-  enumName = [descriptor textFormatNameForValue:1];
-  XCTAssertNotNil(enumName);
-  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:@"FOO"]);
-  XCTAssertEqual(value, TestAllTypes_NestedEnum_Foo);
-  XCTAssertNil([descriptor textFormatNameForValue:99999]);
-
   // Bad values
   enumName = [descriptor enumNameForValue:0];
   XCTAssertNil(enumName);
@@ -186,8 +134,6 @@
                           forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
   XCTAssertFalse([descriptor getValue:NULL
                           forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
-  XCTAssertFalse([descriptor getValue:NULL forEnumTextFormatName:@"Unknown"]);
-  XCTAssertFalse([descriptor getValue:&value forEnumTextFormatName:@"Unknown"]);
 }
 
 - (void)testEnumValueValidator {
@@ -270,102 +216,4 @@
   XCTAssertNil(bazString.containingOneof);
 }
 
-- (void)testExtensiondDescriptor {
-  Class msgClass = [TestAllExtensions class];
-  Class packedMsgClass = [TestPackedExtensions class];
-
-  // Int
-
-  GPBExtensionDescriptor *descriptor = [UnittestRoot optionalInt32Extension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertEqualObjects(descriptor.defaultValue, @0);
-  XCTAssertNil(descriptor.enumDescriptor);
-
-  descriptor = [UnittestRoot defaultInt32Extension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertEqualObjects(descriptor.defaultValue, @41);
-  XCTAssertNil(descriptor.enumDescriptor);
-
-  // Enum
-
-  descriptor = [UnittestRoot optionalNestedEnumExtension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertEqual(descriptor.defaultValue, @1);
-  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum");
-
-  descriptor = [UnittestRoot defaultNestedEnumExtension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertEqual(descriptor.defaultValue, @2);
-  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum");
-
-  // Message
-
-  descriptor = [UnittestRoot optionalNestedMessageExtension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertNil(descriptor.defaultValue);
-  XCTAssertNil(descriptor.enumDescriptor);
-
-  // Repeated Int
-
-  descriptor = [UnittestRoot repeatedInt32Extension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertNil(descriptor.defaultValue);
-  XCTAssertNil(descriptor.enumDescriptor);
-
-  descriptor = [UnittestRoot packedInt32Extension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, packedMsgClass);  // ptr equality
-  XCTAssertTrue(descriptor.isPackable);
-  XCTAssertNil(descriptor.defaultValue);
-  XCTAssertNil(descriptor.enumDescriptor);
-
-  // Repeated Enum
-
-  descriptor = [UnittestRoot repeatedNestedEnumExtension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertNil(descriptor.defaultValue);
-  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum");
-
-  descriptor = [UnittestRoot packedEnumExtension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, packedMsgClass);  // ptr equality
-  XCTAssertTrue(descriptor.isPackable);
-  XCTAssertNil(descriptor.defaultValue);
-  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"ForeignEnum");
-
-  // Repeated Message
-
-  descriptor = [UnittestRoot repeatedNestedMessageExtension];
-  XCTAssertNotNil(descriptor);
-  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
-  XCTAssertFalse(descriptor.isPackable);
-  XCTAssertNil(descriptor.defaultValue);
-  XCTAssertNil(descriptor.enumDescriptor);
-
-  // Compare (used internally for serialization).
-
-  GPBExtensionDescriptor *ext1 = [UnittestRoot optionalInt32Extension];
-  XCTAssertEqual(ext1.fieldNumber, 1u);
-  GPBExtensionDescriptor *ext2 = [UnittestRoot optionalInt64Extension];
-  XCTAssertEqual(ext2.fieldNumber, 2u);
-
-  XCTAssertEqual([ext1 compareByFieldNumber:ext2], NSOrderedAscending);
-  XCTAssertEqual([ext2 compareByFieldNumber:ext1], NSOrderedDescending);
-  XCTAssertEqual([ext1 compareByFieldNumber:ext1], NSOrderedSame);
-}
-
 @end
diff --git a/objectivec/Tests/GPBDictionaryTests+Bool.m b/objectivec/Tests/GPBDictionaryTests+Bool.m
index 0dbe07b..afa3d11 100644
--- a/objectivec/Tests/GPBDictionaryTests+Bool.m
+++ b/objectivec/Tests/GPBDictionaryTests+Bool.m
@@ -54,8 +54,8 @@
   GPBBoolUInt32Dictionary *dict = [[GPBBoolUInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:YES]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -63,15 +63,15 @@
 }
 
 - (void)testOne {
-  GPBBoolUInt32Dictionary *dict = [GPBBoolUInt32Dictionary dictionaryWithUInt32:100U forKey:YES];
+  GPBBoolUInt32Dictionary *dict = [GPBBoolUInt32Dictionary dictionaryWithValue:100U forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:NO]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, 100U);
     XCTAssertNotEqual(stop, NULL);
@@ -82,23 +82,23 @@
   const BOOL kKeys[] = { YES, NO };
   const uint32_t kValues[] = { 100U, 101U };
   GPBBoolUInt32Dictionary *dict =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 101U);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   uint32_t *seenValues = malloc(2 * sizeof(uint32_t));
-  [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -120,7 +120,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -136,29 +136,29 @@
   const uint32_t kValues2[] = { 101U, 100U };
   const uint32_t kValues3[] = { 101U };
   GPBBoolUInt32Dictionary *dict1 =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues1
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolUInt32Dictionary *dict1prime =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues1
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolUInt32Dictionary *dict2 =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues2
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolUInt32Dictionary *dict3 =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues1
-                                               forKeys:kKeys2
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolUInt32Dictionary *dict4 =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues3
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues3)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -187,9 +187,9 @@
   const BOOL kKeys[] = { YES, NO };
   const uint32_t kValues[] = { 100U, 101U };
   GPBBoolUInt32Dictionary *dict =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolUInt32Dictionary *dict2 = [dict copy];
@@ -208,9 +208,9 @@
   const BOOL kKeys[] = { YES, NO };
   const uint32_t kValues[] = { 100U, 101U };
   GPBBoolUInt32Dictionary *dict =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolUInt32Dictionary *dict2 =
@@ -228,25 +228,25 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt32:100U forKey:YES];
+  [dict setValue:100U forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const uint32_t kValues[] = { 101U };
   GPBBoolUInt32Dictionary *dict2 =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
 
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 101U);
   [dict2 release];
 }
@@ -255,32 +255,32 @@
   const BOOL kKeys[] = { YES, NO};
   const uint32_t kValues[] = { 100U, 101U };
   GPBBoolUInt32Dictionary *dict =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues
-                                        forKeys:kKeys
-                                          count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeUInt32ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeUInt32ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:YES]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -288,51 +288,51 @@
   const BOOL kKeys[] = { YES, NO };
   const uint32_t kValues[] = { 100U, 101U };
   GPBBoolUInt32Dictionary *dict =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 101U);
 
-  [dict setUInt32:101U forKey:YES];
+  [dict setValue:101U forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 101U);
 
-  [dict setUInt32:100U forKey:NO];
+  [dict setValue:100U forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 100U);
 
   const BOOL kKeys2[] = { NO, YES };
   const uint32_t kValues2[] = { 101U, 100U };
   GPBBoolUInt32Dictionary *dict2 =
-      [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues2
-                                               forKeys:kKeys2
-                                                 count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolUInt32Dictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 101U);
 
   [dict2 release];
@@ -355,8 +355,8 @@
   GPBBoolInt32Dictionary *dict = [[GPBBoolInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:YES]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -364,15 +364,15 @@
 }
 
 - (void)testOne {
-  GPBBoolInt32Dictionary *dict = [GPBBoolInt32Dictionary dictionaryWithInt32:200 forKey:YES];
+  GPBBoolInt32Dictionary *dict = [GPBBoolInt32Dictionary dictionaryWithValue:200 forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:NO]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, 200);
     XCTAssertNotEqual(stop, NULL);
@@ -383,23 +383,23 @@
   const BOOL kKeys[] = { YES, NO };
   const int32_t kValues[] = { 200, 201 };
   GPBBoolInt32Dictionary *dict =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 201);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   int32_t *seenValues = malloc(2 * sizeof(int32_t));
-  [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -421,7 +421,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -437,27 +437,27 @@
   const int32_t kValues2[] = { 201, 200 };
   const int32_t kValues3[] = { 201 };
   GPBBoolInt32Dictionary *dict1 =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolInt32Dictionary *dict1prime =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolInt32Dictionary *dict2 =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues2
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolInt32Dictionary *dict3 =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys2
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolInt32Dictionary *dict4 =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues3
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues3
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -488,7 +488,7 @@
   const BOOL kKeys[] = { YES, NO };
   const int32_t kValues[] = { 200, 201 };
   GPBBoolInt32Dictionary *dict =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -509,7 +509,7 @@
   const BOOL kKeys[] = { YES, NO };
   const int32_t kValues[] = { 200, 201 };
   GPBBoolInt32Dictionary *dict =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -529,13 +529,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt32:200 forKey:YES];
+  [dict setValue:200 forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const int32_t kValues[] = { 201 };
   GPBBoolInt32Dictionary *dict2 =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -543,11 +543,11 @@
   XCTAssertEqual(dict.count, 2U);
 
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 201);
   [dict2 release];
 }
@@ -556,32 +556,32 @@
   const BOOL kKeys[] = { YES, NO};
   const int32_t kValues[] = { 200, 201 };
   GPBBoolInt32Dictionary *dict =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues
                                       forKeys:kKeys
                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeInt32ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeInt32ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:YES]);
-  XCTAssertFalse([dict getInt32:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -589,51 +589,51 @@
   const BOOL kKeys[] = { YES, NO };
   const int32_t kValues[] = { 200, 201 };
   GPBBoolInt32Dictionary *dict =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 201);
 
-  [dict setInt32:201 forKey:YES];
+  [dict setValue:201 forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 201);
 
-  [dict setInt32:200 forKey:NO];
+  [dict setValue:200 forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 200);
 
   const BOOL kKeys2[] = { NO, YES };
   const int32_t kValues2[] = { 201, 200 };
   GPBBoolInt32Dictionary *dict2 =
-      [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBBoolInt32Dictionary alloc] initWithValues:kValues2
                                              forKeys:kKeys2
                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt32:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt32:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 201);
 
   [dict2 release];
@@ -656,8 +656,8 @@
   GPBBoolUInt64Dictionary *dict = [[GPBBoolUInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:YES]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -665,15 +665,15 @@
 }
 
 - (void)testOne {
-  GPBBoolUInt64Dictionary *dict = [GPBBoolUInt64Dictionary dictionaryWithUInt64:300U forKey:YES];
+  GPBBoolUInt64Dictionary *dict = [GPBBoolUInt64Dictionary dictionaryWithValue:300U forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:NO]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, 300U);
     XCTAssertNotEqual(stop, NULL);
@@ -684,23 +684,23 @@
   const BOOL kKeys[] = { YES, NO };
   const uint64_t kValues[] = { 300U, 301U };
   GPBBoolUInt64Dictionary *dict =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 301U);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   uint64_t *seenValues = malloc(2 * sizeof(uint64_t));
-  [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -722,7 +722,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -738,29 +738,29 @@
   const uint64_t kValues2[] = { 301U, 300U };
   const uint64_t kValues3[] = { 301U };
   GPBBoolUInt64Dictionary *dict1 =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues1
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolUInt64Dictionary *dict1prime =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues1
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolUInt64Dictionary *dict2 =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues2
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolUInt64Dictionary *dict3 =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues1
-                                               forKeys:kKeys2
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolUInt64Dictionary *dict4 =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues3
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues3)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -789,9 +789,9 @@
   const BOOL kKeys[] = { YES, NO };
   const uint64_t kValues[] = { 300U, 301U };
   GPBBoolUInt64Dictionary *dict =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolUInt64Dictionary *dict2 = [dict copy];
@@ -810,9 +810,9 @@
   const BOOL kKeys[] = { YES, NO };
   const uint64_t kValues[] = { 300U, 301U };
   GPBBoolUInt64Dictionary *dict =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolUInt64Dictionary *dict2 =
@@ -830,25 +830,25 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt64:300U forKey:YES];
+  [dict setValue:300U forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const uint64_t kValues[] = { 301U };
   GPBBoolUInt64Dictionary *dict2 =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
 
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 301U);
   [dict2 release];
 }
@@ -857,32 +857,32 @@
   const BOOL kKeys[] = { YES, NO};
   const uint64_t kValues[] = { 300U, 301U };
   GPBBoolUInt64Dictionary *dict =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues
-                                        forKeys:kKeys
-                                          count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeUInt64ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeUInt64ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:YES]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -890,51 +890,51 @@
   const BOOL kKeys[] = { YES, NO };
   const uint64_t kValues[] = { 300U, 301U };
   GPBBoolUInt64Dictionary *dict =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 301U);
 
-  [dict setUInt64:301U forKey:YES];
+  [dict setValue:301U forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 301U);
 
-  [dict setUInt64:300U forKey:NO];
+  [dict setValue:300U forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 300U);
 
   const BOOL kKeys2[] = { NO, YES };
   const uint64_t kValues2[] = { 301U, 300U };
   GPBBoolUInt64Dictionary *dict2 =
-      [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues2
-                                               forKeys:kKeys2
-                                                 count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolUInt64Dictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getUInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getUInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 301U);
 
   [dict2 release];
@@ -957,8 +957,8 @@
   GPBBoolInt64Dictionary *dict = [[GPBBoolInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:YES]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -966,15 +966,15 @@
 }
 
 - (void)testOne {
-  GPBBoolInt64Dictionary *dict = [GPBBoolInt64Dictionary dictionaryWithInt64:400 forKey:YES];
+  GPBBoolInt64Dictionary *dict = [GPBBoolInt64Dictionary dictionaryWithValue:400 forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:NO]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, 400);
     XCTAssertNotEqual(stop, NULL);
@@ -985,23 +985,23 @@
   const BOOL kKeys[] = { YES, NO };
   const int64_t kValues[] = { 400, 401 };
   GPBBoolInt64Dictionary *dict =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 401);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   int64_t *seenValues = malloc(2 * sizeof(int64_t));
-  [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1023,7 +1023,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1039,27 +1039,27 @@
   const int64_t kValues2[] = { 401, 400 };
   const int64_t kValues3[] = { 401 };
   GPBBoolInt64Dictionary *dict1 =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolInt64Dictionary *dict1prime =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolInt64Dictionary *dict2 =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues2
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolInt64Dictionary *dict3 =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys2
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolInt64Dictionary *dict4 =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues3
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues3
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1090,7 +1090,7 @@
   const BOOL kKeys[] = { YES, NO };
   const int64_t kValues[] = { 400, 401 };
   GPBBoolInt64Dictionary *dict =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1111,7 +1111,7 @@
   const BOOL kKeys[] = { YES, NO };
   const int64_t kValues[] = { 400, 401 };
   GPBBoolInt64Dictionary *dict =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1131,13 +1131,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt64:400 forKey:YES];
+  [dict setValue:400 forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const int64_t kValues[] = { 401 };
   GPBBoolInt64Dictionary *dict2 =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1145,11 +1145,11 @@
   XCTAssertEqual(dict.count, 2U);
 
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 401);
   [dict2 release];
 }
@@ -1158,32 +1158,32 @@
   const BOOL kKeys[] = { YES, NO};
   const int64_t kValues[] = { 400, 401 };
   GPBBoolInt64Dictionary *dict =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues
                                       forKeys:kKeys
                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeInt64ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeInt64ForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:YES]);
-  XCTAssertFalse([dict getInt64:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -1191,51 +1191,51 @@
   const BOOL kKeys[] = { YES, NO };
   const int64_t kValues[] = { 400, 401 };
   GPBBoolInt64Dictionary *dict =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 401);
 
-  [dict setInt64:401 forKey:YES];
+  [dict setValue:401 forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 401);
 
-  [dict setInt64:400 forKey:NO];
+  [dict setValue:400 forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 400);
 
   const BOOL kKeys2[] = { NO, YES };
   const int64_t kValues2[] = { 401, 400 };
   GPBBoolInt64Dictionary *dict2 =
-      [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBBoolInt64Dictionary alloc] initWithValues:kValues2
                                              forKeys:kKeys2
                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:YES]);
-  XCTAssertTrue([dict getInt64:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:NO]);
-  XCTAssertTrue([dict getInt64:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 401);
 
   [dict2 release];
@@ -1258,8 +1258,8 @@
   GPBBoolBoolDictionary *dict = [[GPBBoolBoolDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:YES]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1267,15 +1267,15 @@
 }
 
 - (void)testOne {
-  GPBBoolBoolDictionary *dict = [GPBBoolBoolDictionary dictionaryWithBool:NO forKey:YES];
+  GPBBoolBoolDictionary *dict = [GPBBoolBoolDictionary dictionaryWithValue:NO forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:NO]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, NO);
     XCTAssertNotEqual(stop, NULL);
@@ -1286,23 +1286,23 @@
   const BOOL kKeys[] = { YES, NO };
   const BOOL kValues[] = { NO, YES };
   GPBBoolBoolDictionary *dict =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues
-                                           forKeys:kKeys
-                                             count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues
+                                            forKeys:kKeys
+                                              count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:NO]);
-  XCTAssertTrue([dict getBool:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, YES);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   BOOL *seenValues = malloc(2 * sizeof(BOOL));
-  [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1324,7 +1324,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1340,29 +1340,29 @@
   const BOOL kValues2[] = { YES, NO };
   const BOOL kValues3[] = { YES };
   GPBBoolBoolDictionary *dict1 =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues1
-                                           forKeys:kKeys1
-                                             count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues1
+                                            forKeys:kKeys1
+                                              count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolBoolDictionary *dict1prime =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues1
-                                           forKeys:kKeys1
-                                             count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues1
+                                            forKeys:kKeys1
+                                              count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolBoolDictionary *dict2 =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues2
-                                           forKeys:kKeys1
-                                             count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues2
+                                            forKeys:kKeys1
+                                              count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolBoolDictionary *dict3 =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues1
-                                           forKeys:kKeys2
-                                             count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues1
+                                            forKeys:kKeys2
+                                              count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolBoolDictionary *dict4 =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues3
-                                           forKeys:kKeys1
-                                             count:GPBARRAYSIZE(kValues3)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues3
+                                            forKeys:kKeys1
+                                              count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1391,9 +1391,9 @@
   const BOOL kKeys[] = { YES, NO };
   const BOOL kValues[] = { NO, YES };
   GPBBoolBoolDictionary *dict =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues
-                                           forKeys:kKeys
-                                             count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues
+                                            forKeys:kKeys
+                                              count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolBoolDictionary *dict2 = [dict copy];
@@ -1412,9 +1412,9 @@
   const BOOL kKeys[] = { YES, NO };
   const BOOL kValues[] = { NO, YES };
   GPBBoolBoolDictionary *dict =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues
-                                           forKeys:kKeys
-                                             count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues
+                                            forKeys:kKeys
+                                              count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolBoolDictionary *dict2 =
@@ -1432,25 +1432,25 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setBool:NO forKey:YES];
+  [dict setValue:NO forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const BOOL kValues[] = { YES };
   GPBBoolBoolDictionary *dict2 =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues
-                                           forKeys:kKeys
-                                             count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues
+                                            forKeys:kKeys
+                                              count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
 
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:NO]);
-  XCTAssertTrue([dict getBool:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, YES);
   [dict2 release];
 }
@@ -1459,32 +1459,32 @@
   const BOOL kKeys[] = { YES, NO};
   const BOOL kValues[] = { NO, YES };
   GPBBoolBoolDictionary *dict =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues
-                                    forKeys:kKeys
-                                      count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues
+                                     forKeys:kKeys
+                                       count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeBoolForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeBoolForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:YES]);
-  XCTAssertFalse([dict getBool:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -1492,51 +1492,51 @@
   const BOOL kKeys[] = { YES, NO };
   const BOOL kValues[] = { NO, YES };
   GPBBoolBoolDictionary *dict =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues
-                                           forKeys:kKeys
-                                             count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues
+                                     forKeys:kKeys
+                                       count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:NO]);
-  XCTAssertTrue([dict getBool:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, YES);
 
-  [dict setBool:YES forKey:YES];
+  [dict setValue:YES forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:NO]);
-  XCTAssertTrue([dict getBool:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, YES);
 
-  [dict setBool:NO forKey:NO];
+  [dict setValue:NO forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:NO]);
-  XCTAssertTrue([dict getBool:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, NO);
 
   const BOOL kKeys2[] = { NO, YES };
   const BOOL kValues2[] = { YES, NO };
   GPBBoolBoolDictionary *dict2 =
-      [[GPBBoolBoolDictionary alloc] initWithBools:kValues2
-                                           forKeys:kKeys2
-                                             count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolBoolDictionary alloc] initWithValues:kValues2
+                                            forKeys:kKeys2
+                                              count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:YES]);
-  XCTAssertTrue([dict getBool:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:NO]);
-  XCTAssertTrue([dict getBool:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, YES);
 
   [dict2 release];
@@ -1559,8 +1559,8 @@
   GPBBoolFloatDictionary *dict = [[GPBBoolFloatDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:YES]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1568,15 +1568,15 @@
 }
 
 - (void)testOne {
-  GPBBoolFloatDictionary *dict = [GPBBoolFloatDictionary dictionaryWithFloat:500.f forKey:YES];
+  GPBBoolFloatDictionary *dict = [GPBBoolFloatDictionary dictionaryWithValue:500.f forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:NO]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, 500.f);
     XCTAssertNotEqual(stop, NULL);
@@ -1587,23 +1587,23 @@
   const BOOL kKeys[] = { YES, NO };
   const float kValues[] = { 500.f, 501.f };
   GPBBoolFloatDictionary *dict =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:NO]);
-  XCTAssertTrue([dict getFloat:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 501.f);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   float *seenValues = malloc(2 * sizeof(float));
-  [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1625,7 +1625,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1641,27 +1641,27 @@
   const float kValues2[] = { 501.f, 500.f };
   const float kValues3[] = { 501.f };
   GPBBoolFloatDictionary *dict1 =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues1
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolFloatDictionary *dict1prime =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues1
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolFloatDictionary *dict2 =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues2
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues2
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolFloatDictionary *dict3 =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues1
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues1
                                              forKeys:kKeys2
                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolFloatDictionary *dict4 =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues3
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues3
                                              forKeys:kKeys1
                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1692,7 +1692,7 @@
   const BOOL kKeys[] = { YES, NO };
   const float kValues[] = { 500.f, 501.f };
   GPBBoolFloatDictionary *dict =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1713,7 +1713,7 @@
   const BOOL kKeys[] = { YES, NO };
   const float kValues[] = { 500.f, 501.f };
   GPBBoolFloatDictionary *dict =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1733,13 +1733,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setFloat:500.f forKey:YES];
+  [dict setValue:500.f forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const float kValues[] = { 501.f };
   GPBBoolFloatDictionary *dict2 =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues
                                              forKeys:kKeys
                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1747,11 +1747,11 @@
   XCTAssertEqual(dict.count, 2U);
 
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:NO]);
-  XCTAssertTrue([dict getFloat:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 501.f);
   [dict2 release];
 }
@@ -1760,32 +1760,32 @@
   const BOOL kKeys[] = { YES, NO};
   const float kValues[] = { 500.f, 501.f };
   GPBBoolFloatDictionary *dict =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues
                                       forKeys:kKeys
                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeFloatForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeFloatForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:YES]);
-  XCTAssertFalse([dict getFloat:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -1793,51 +1793,51 @@
   const BOOL kKeys[] = { YES, NO };
   const float kValues[] = { 500.f, 501.f };
   GPBBoolFloatDictionary *dict =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:NO]);
-  XCTAssertTrue([dict getFloat:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 501.f);
 
-  [dict setFloat:501.f forKey:YES];
+  [dict setValue:501.f forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:NO]);
-  XCTAssertTrue([dict getFloat:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 501.f);
 
-  [dict setFloat:500.f forKey:NO];
+  [dict setValue:500.f forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:NO]);
-  XCTAssertTrue([dict getFloat:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 500.f);
 
   const BOOL kKeys2[] = { NO, YES };
   const float kValues2[] = { 501.f, 500.f };
   GPBBoolFloatDictionary *dict2 =
-      [[GPBBoolFloatDictionary alloc] initWithFloats:kValues2
+      [[GPBBoolFloatDictionary alloc] initWithValues:kValues2
                                              forKeys:kKeys2
                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:YES]);
-  XCTAssertTrue([dict getFloat:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:NO]);
-  XCTAssertTrue([dict getFloat:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 501.f);
 
   [dict2 release];
@@ -1860,8 +1860,8 @@
   GPBBoolDoubleDictionary *dict = [[GPBBoolDoubleDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:YES]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1869,15 +1869,15 @@
 }
 
 - (void)testOne {
-  GPBBoolDoubleDictionary *dict = [GPBBoolDoubleDictionary dictionaryWithDouble:600. forKey:YES];
+  GPBBoolDoubleDictionary *dict = [GPBBoolDoubleDictionary dictionaryWithValue:600. forKey:YES];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:NO]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
     XCTAssertEqual(aKey, YES);
     XCTAssertEqual(aValue, 600.);
     XCTAssertNotEqual(stop, NULL);
@@ -1888,23 +1888,23 @@
   const BOOL kKeys[] = { YES, NO };
   const double kValues[] = { 600., 601. };
   GPBBoolDoubleDictionary *dict =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:NO]);
-  XCTAssertTrue([dict getDouble:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 601.);
 
   __block NSUInteger idx = 0;
   BOOL *seenKeys = malloc(2 * sizeof(BOOL));
   double *seenValues = malloc(2 * sizeof(double));
-  [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 2U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1926,7 +1926,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 0) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1942,29 +1942,29 @@
   const double kValues2[] = { 601., 600. };
   const double kValues3[] = { 601. };
   GPBBoolDoubleDictionary *dict1 =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues1
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBBoolDoubleDictionary *dict1prime =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues1
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBBoolDoubleDictionary *dict2 =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues2
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBBoolDoubleDictionary *dict3 =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues1
-                                               forKeys:kKeys2
-                                                 count:GPBARRAYSIZE(kValues1)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBBoolDoubleDictionary *dict4 =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues3
-                                               forKeys:kKeys1
-                                                 count:GPBARRAYSIZE(kValues3)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1993,9 +1993,9 @@
   const BOOL kKeys[] = { YES, NO };
   const double kValues[] = { 600., 601. };
   GPBBoolDoubleDictionary *dict =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolDoubleDictionary *dict2 = [dict copy];
@@ -2014,9 +2014,9 @@
   const BOOL kKeys[] = { YES, NO };
   const double kValues[] = { 600., 601. };
   GPBBoolDoubleDictionary *dict =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBBoolDoubleDictionary *dict2 =
@@ -2034,25 +2034,25 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setDouble:600. forKey:YES];
+  [dict setValue:600. forKey:YES];
   XCTAssertEqual(dict.count, 1U);
 
   const BOOL kKeys[] = { NO };
   const double kValues[] = { 601. };
   GPBBoolDoubleDictionary *dict2 =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
 
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:NO]);
-  XCTAssertTrue([dict getDouble:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 601.);
   [dict2 release];
 }
@@ -2061,32 +2061,32 @@
   const BOOL kKeys[] = { YES, NO};
   const double kValues[] = { 600., 601. };
   GPBBoolDoubleDictionary *dict =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues
-                                        forKeys:kKeys
-                                          count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
 
-  [dict removeDoubleForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   // Remove again does nothing.
-  [dict removeDoubleForKey:NO];
+  [dict removeValueForKey:NO];
   XCTAssertEqual(dict.count, 1U);
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:YES]);
-  XCTAssertFalse([dict getDouble:NULL forKey:NO]);
+  XCTAssertFalse([dict valueForKey:YES value:NULL]);
+  XCTAssertFalse([dict valueForKey:NO value:NULL]);
   [dict release];
 }
 
@@ -2094,51 +2094,51 @@
   const BOOL kKeys[] = { YES, NO };
   const double kValues[] = { 600., 601. };
   GPBBoolDoubleDictionary *dict =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:NO]);
-  XCTAssertTrue([dict getDouble:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 601.);
 
-  [dict setDouble:601. forKey:YES];
+  [dict setValue:601. forKey:YES];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:NO]);
-  XCTAssertTrue([dict getDouble:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 601.);
 
-  [dict setDouble:600. forKey:NO];
+  [dict setValue:600. forKey:NO];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:NO]);
-  XCTAssertTrue([dict getDouble:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 600.);
 
   const BOOL kKeys2[] = { NO, YES };
   const double kValues2[] = { 601., 600. };
   GPBBoolDoubleDictionary *dict2 =
-      [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues2
-                                               forKeys:kKeys2
-                                                 count:GPBARRAYSIZE(kValues2)];
+      [[GPBBoolDoubleDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:YES]);
-  XCTAssertTrue([dict getDouble:&value forKey:YES]);
+  XCTAssertTrue([dict valueForKey:YES value:NULL]);
+  XCTAssertTrue([dict valueForKey:YES value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:NO]);
-  XCTAssertTrue([dict getDouble:&value forKey:NO]);
+  XCTAssertTrue([dict valueForKey:NO value:NULL]);
+  XCTAssertTrue([dict valueForKey:NO value:&value]);
   XCTAssertEqual(value, 601.);
 
   [dict2 release];
@@ -2378,8 +2378,8 @@
   const NSString* kObjects[] = { @"abc", @"def" };
   GPBBoolObjectDictionary<NSString*> *dict =
       [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kObjects)];
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 2U);
   XCTAssertEqualObjects([dict objectForKey:YES], @"abc");
diff --git a/objectivec/Tests/GPBDictionaryTests+Int32.m b/objectivec/Tests/GPBDictionaryTests+Int32.m
index c539bdc..54dd2ed 100644
--- a/objectivec/Tests/GPBDictionaryTests+Int32.m
+++ b/objectivec/Tests/GPBDictionaryTests+Int32.m
@@ -45,10 +45,10 @@
 
 // To let the testing macros work, add some extra methods to simplify things.
 @interface GPBInt32EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(int32_t)key;
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const int32_t [])keys
-                        count:(NSUInteger)count;
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(int32_t)key;
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count;
 @end
 
 static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -64,7 +64,7 @@
 }
 
 @implementation GPBInt32EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(int32_t)key {
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(int32_t)key {
   // Cast is needed to compiler knows what class we are invoking initWithValues: on to get the
   // type correct.
   return [[(GPBInt32EnumDictionary*)[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
@@ -72,9 +72,9 @@
                                                                     forKeys:&key
                                                                       count:1] autorelease];
 }
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const int32_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const int32_t [])keys
+                         count:(NSUInteger)count {
   return [self initWithValidationFunction:TestingEnum_IsValidValue
                                 rawValues:values
                                   forKeys:keys
@@ -94,8 +94,8 @@
   GPBInt32UInt32Dictionary *dict = [[GPBInt32UInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:11]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -103,15 +103,15 @@
 }
 
 - (void)testOne {
-  GPBInt32UInt32Dictionary *dict = [GPBInt32UInt32Dictionary dictionaryWithUInt32:100U forKey:11];
+  GPBInt32UInt32Dictionary *dict = [GPBInt32UInt32Dictionary dictionaryWithValue:100U forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:12]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 100U);
     XCTAssertNotEqual(stop, NULL);
@@ -122,27 +122,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const uint32_t kValues[] = { 100U, 101U, 102U };
   GPBInt32UInt32Dictionary *dict =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   uint32_t *seenValues = malloc(3 * sizeof(uint32_t));
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -164,7 +164,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -180,29 +180,29 @@
   const uint32_t kValues2[] = { 100U, 103U, 102U };
   const uint32_t kValues3[] = { 100U, 101U, 102U, 103U };
   GPBInt32UInt32Dictionary *dict1 =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32UInt32Dictionary *dict1prime =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32UInt32Dictionary *dict2 =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32UInt32Dictionary *dict3 =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32UInt32Dictionary *dict4 =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues3
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues3
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -231,9 +231,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt32UInt32Dictionary *dict =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32UInt32Dictionary *dict2 = [dict copy];
@@ -252,9 +252,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt32UInt32Dictionary *dict =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32UInt32Dictionary *dict2 =
@@ -272,31 +272,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt32:100U forKey:11];
+  [dict setValue:100U forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const uint32_t kValues[] = { 101U, 102U, 103U };
   GPBInt32UInt32Dictionary *dict2 =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 103U);
   [dict2 release];
 }
@@ -305,57 +305,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt32UInt32Dictionary *dict =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt32ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 103U);
 
   // Remove again does nothing.
-  [dict removeUInt32ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict removeUInt32ForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:11]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:12]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:13]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -363,75 +363,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt32UInt32Dictionary *dict =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:103U forKey:11];
+  [dict setValue:103U forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:101U forKey:14];
+  [dict setValue:101U forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 101U);
 
   const int32_t kKeys2[] = { 12, 13 };
   const uint32_t kValues2[] = { 102U, 100U };
   GPBInt32UInt32Dictionary *dict2 =
-      [[GPBInt32UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32UInt32Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 101U);
 
   [dict2 release];
@@ -451,8 +451,8 @@
   GPBInt32Int32Dictionary *dict = [[GPBInt32Int32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:11]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -460,15 +460,15 @@
 }
 
 - (void)testOne {
-  GPBInt32Int32Dictionary *dict = [GPBInt32Int32Dictionary dictionaryWithInt32:200 forKey:11];
+  GPBInt32Int32Dictionary *dict = [GPBInt32Int32Dictionary dictionaryWithValue:200 forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:12]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 200);
     XCTAssertNotEqual(stop, NULL);
@@ -479,27 +479,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const int32_t kValues[] = { 200, 201, 202 };
   GPBInt32Int32Dictionary *dict =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndInt32sUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -521,7 +521,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt32sUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -537,27 +537,27 @@
   const int32_t kValues2[] = { 200, 203, 202 };
   const int32_t kValues3[] = { 200, 201, 202, 203 };
   GPBInt32Int32Dictionary *dict1 =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32Int32Dictionary *dict1prime =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32Int32Dictionary *dict2 =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32Int32Dictionary *dict3 =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32Int32Dictionary *dict4 =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues3
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues3
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -588,7 +588,7 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt32Int32Dictionary *dict =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -609,7 +609,7 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt32Int32Dictionary *dict =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -629,13 +629,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt32:200 forKey:11];
+  [dict setValue:200 forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const int32_t kValues[] = { 201, 202, 203 };
   GPBInt32Int32Dictionary *dict2 =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -643,17 +643,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 203);
   [dict2 release];
 }
@@ -662,57 +662,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt32Int32Dictionary *dict =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt32ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 203);
 
   // Remove again does nothing.
-  [dict removeInt32ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict removeInt32ForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:11]);
-  XCTAssertFalse([dict getInt32:NULL forKey:12]);
-  XCTAssertFalse([dict getInt32:NULL forKey:13]);
-  XCTAssertFalse([dict getInt32:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -720,75 +720,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt32Int32Dictionary *dict =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:203 forKey:11];
+  [dict setValue:203 forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:201 forKey:14];
+  [dict setValue:201 forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 201);
 
   const int32_t kKeys2[] = { 12, 13 };
   const int32_t kValues2[] = { 202, 200 };
   GPBInt32Int32Dictionary *dict2 =
-      [[GPBInt32Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBInt32Int32Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:11]);
-  XCTAssertTrue([dict getInt32:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:12]);
-  XCTAssertTrue([dict getInt32:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:13]);
-  XCTAssertTrue([dict getInt32:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:14]);
-  XCTAssertTrue([dict getInt32:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 201);
 
   [dict2 release];
@@ -808,8 +808,8 @@
   GPBInt32UInt64Dictionary *dict = [[GPBInt32UInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:11]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -817,15 +817,15 @@
 }
 
 - (void)testOne {
-  GPBInt32UInt64Dictionary *dict = [GPBInt32UInt64Dictionary dictionaryWithUInt64:300U forKey:11];
+  GPBInt32UInt64Dictionary *dict = [GPBInt32UInt64Dictionary dictionaryWithValue:300U forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:12]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 300U);
     XCTAssertNotEqual(stop, NULL);
@@ -836,27 +836,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const uint64_t kValues[] = { 300U, 301U, 302U };
   GPBInt32UInt64Dictionary *dict =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   uint64_t *seenValues = malloc(3 * sizeof(uint64_t));
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -878,7 +878,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -894,29 +894,29 @@
   const uint64_t kValues2[] = { 300U, 303U, 302U };
   const uint64_t kValues3[] = { 300U, 301U, 302U, 303U };
   GPBInt32UInt64Dictionary *dict1 =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32UInt64Dictionary *dict1prime =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32UInt64Dictionary *dict2 =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32UInt64Dictionary *dict3 =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32UInt64Dictionary *dict4 =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues3
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues3
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -945,9 +945,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt32UInt64Dictionary *dict =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32UInt64Dictionary *dict2 = [dict copy];
@@ -966,9 +966,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt32UInt64Dictionary *dict =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32UInt64Dictionary *dict2 =
@@ -986,31 +986,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt64:300U forKey:11];
+  [dict setValue:300U forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const uint64_t kValues[] = { 301U, 302U, 303U };
   GPBInt32UInt64Dictionary *dict2 =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 303U);
   [dict2 release];
 }
@@ -1019,57 +1019,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt32UInt64Dictionary *dict =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt64ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 303U);
 
   // Remove again does nothing.
-  [dict removeUInt64ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict removeUInt64ForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:11]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:12]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:13]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -1077,75 +1077,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt32UInt64Dictionary *dict =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:303U forKey:11];
+  [dict setValue:303U forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:301U forKey:14];
+  [dict setValue:301U forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 301U);
 
   const int32_t kKeys2[] = { 12, 13 };
   const uint64_t kValues2[] = { 302U, 300U };
   GPBInt32UInt64Dictionary *dict2 =
-      [[GPBInt32UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32UInt64Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getUInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getUInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getUInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getUInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 301U);
 
   [dict2 release];
@@ -1165,8 +1165,8 @@
   GPBInt32Int64Dictionary *dict = [[GPBInt32Int64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:11]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1174,15 +1174,15 @@
 }
 
 - (void)testOne {
-  GPBInt32Int64Dictionary *dict = [GPBInt32Int64Dictionary dictionaryWithInt64:400 forKey:11];
+  GPBInt32Int64Dictionary *dict = [GPBInt32Int64Dictionary dictionaryWithValue:400 forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:12]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 400);
     XCTAssertNotEqual(stop, NULL);
@@ -1193,27 +1193,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const int64_t kValues[] = { 400, 401, 402 };
   GPBInt32Int64Dictionary *dict =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   int64_t *seenValues = malloc(3 * sizeof(int64_t));
-  [dict enumerateKeysAndInt64sUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1235,7 +1235,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt64sUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1251,27 +1251,27 @@
   const int64_t kValues2[] = { 400, 403, 402 };
   const int64_t kValues3[] = { 400, 401, 402, 403 };
   GPBInt32Int64Dictionary *dict1 =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32Int64Dictionary *dict1prime =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32Int64Dictionary *dict2 =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32Int64Dictionary *dict3 =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32Int64Dictionary *dict4 =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues3
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues3
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1302,7 +1302,7 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt32Int64Dictionary *dict =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1323,7 +1323,7 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt32Int64Dictionary *dict =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1343,13 +1343,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt64:400 forKey:11];
+  [dict setValue:400 forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const int64_t kValues[] = { 401, 402, 403 };
   GPBInt32Int64Dictionary *dict2 =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1357,17 +1357,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 403);
   [dict2 release];
 }
@@ -1376,57 +1376,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt32Int64Dictionary *dict =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt64ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 403);
 
   // Remove again does nothing.
-  [dict removeInt64ForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict removeInt64ForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:11]);
-  XCTAssertFalse([dict getInt64:NULL forKey:12]);
-  XCTAssertFalse([dict getInt64:NULL forKey:13]);
-  XCTAssertFalse([dict getInt64:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -1434,75 +1434,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt32Int64Dictionary *dict =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:403 forKey:11];
+  [dict setValue:403 forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:401 forKey:14];
+  [dict setValue:401 forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 401);
 
   const int32_t kKeys2[] = { 12, 13 };
   const int64_t kValues2[] = { 402, 400 };
   GPBInt32Int64Dictionary *dict2 =
-      [[GPBInt32Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBInt32Int64Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:11]);
-  XCTAssertTrue([dict getInt64:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:12]);
-  XCTAssertTrue([dict getInt64:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:13]);
-  XCTAssertTrue([dict getInt64:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:14]);
-  XCTAssertTrue([dict getInt64:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 401);
 
   [dict2 release];
@@ -1522,8 +1522,8 @@
   GPBInt32BoolDictionary *dict = [[GPBInt32BoolDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:11]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1531,15 +1531,15 @@
 }
 
 - (void)testOne {
-  GPBInt32BoolDictionary *dict = [GPBInt32BoolDictionary dictionaryWithBool:YES forKey:11];
+  GPBInt32BoolDictionary *dict = [GPBInt32BoolDictionary dictionaryWithValue:YES forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:12]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, YES);
     XCTAssertNotEqual(stop, NULL);
@@ -1550,27 +1550,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const BOOL kValues[] = { YES, YES, NO };
   GPBInt32BoolDictionary *dict =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   BOOL *seenValues = malloc(3 * sizeof(BOOL));
-  [dict enumerateKeysAndBoolsUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1592,7 +1592,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndBoolsUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1608,29 +1608,29 @@
   const BOOL kValues2[] = { YES, NO, NO };
   const BOOL kValues3[] = { YES, YES, NO, NO };
   GPBInt32BoolDictionary *dict1 =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32BoolDictionary *dict1prime =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32BoolDictionary *dict2 =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues2
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32BoolDictionary *dict3 =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues1
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32BoolDictionary *dict4 =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues3
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues3
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1659,9 +1659,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt32BoolDictionary *dict =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32BoolDictionary *dict2 = [dict copy];
@@ -1680,9 +1680,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt32BoolDictionary *dict =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32BoolDictionary *dict2 =
@@ -1700,31 +1700,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setBool:YES forKey:11];
+  [dict setValue:YES forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const BOOL kValues[] = { YES, NO, NO };
   GPBInt32BoolDictionary *dict2 =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, NO);
   [dict2 release];
 }
@@ -1733,57 +1733,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt32BoolDictionary *dict =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeBoolForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, NO);
 
   // Remove again does nothing.
-  [dict removeBoolForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict removeBoolForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:11]);
-  XCTAssertFalse([dict getBool:NULL forKey:12]);
-  XCTAssertFalse([dict getBool:NULL forKey:13]);
-  XCTAssertFalse([dict getBool:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -1791,75 +1791,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt32BoolDictionary *dict =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:NO forKey:11];
+  [dict setValue:NO forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:YES forKey:14];
+  [dict setValue:YES forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, YES);
 
   const int32_t kKeys2[] = { 12, 13 };
   const BOOL kValues2[] = { NO, YES };
   GPBInt32BoolDictionary *dict2 =
-      [[GPBInt32BoolDictionary alloc] initWithBools:kValues2
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32BoolDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:11]);
-  XCTAssertTrue([dict getBool:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:12]);
-  XCTAssertTrue([dict getBool:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:13]);
-  XCTAssertTrue([dict getBool:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:14]);
-  XCTAssertTrue([dict getBool:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, YES);
 
   [dict2 release];
@@ -1879,8 +1879,8 @@
   GPBInt32FloatDictionary *dict = [[GPBInt32FloatDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:11]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1888,15 +1888,15 @@
 }
 
 - (void)testOne {
-  GPBInt32FloatDictionary *dict = [GPBInt32FloatDictionary dictionaryWithFloat:500.f forKey:11];
+  GPBInt32FloatDictionary *dict = [GPBInt32FloatDictionary dictionaryWithValue:500.f forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:12]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 500.f);
     XCTAssertNotEqual(stop, NULL);
@@ -1907,27 +1907,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const float kValues[] = { 500.f, 501.f, 502.f };
   GPBInt32FloatDictionary *dict =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   float *seenValues = malloc(3 * sizeof(float));
-  [dict enumerateKeysAndFloatsUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1949,7 +1949,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndFloatsUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1965,27 +1965,27 @@
   const float kValues2[] = { 500.f, 503.f, 502.f };
   const float kValues3[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt32FloatDictionary *dict1 =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32FloatDictionary *dict1prime =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32FloatDictionary *dict2 =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32FloatDictionary *dict3 =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32FloatDictionary *dict4 =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues3
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues3
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -2016,7 +2016,7 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt32FloatDictionary *dict =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2037,7 +2037,7 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt32FloatDictionary *dict =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2057,13 +2057,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setFloat:500.f forKey:11];
+  [dict setValue:500.f forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const float kValues[] = { 501.f, 502.f, 503.f };
   GPBInt32FloatDictionary *dict2 =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -2071,17 +2071,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 503.f);
   [dict2 release];
 }
@@ -2090,57 +2090,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt32FloatDictionary *dict =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeFloatForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 503.f);
 
   // Remove again does nothing.
-  [dict removeFloatForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict removeFloatForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:11]);
-  XCTAssertFalse([dict getFloat:NULL forKey:12]);
-  XCTAssertFalse([dict getFloat:NULL forKey:13]);
-  XCTAssertFalse([dict getFloat:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -2148,75 +2148,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt32FloatDictionary *dict =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:503.f forKey:11];
+  [dict setValue:503.f forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:501.f forKey:14];
+  [dict setValue:501.f forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 501.f);
 
   const int32_t kKeys2[] = { 12, 13 };
   const float kValues2[] = { 502.f, 500.f };
   GPBInt32FloatDictionary *dict2 =
-      [[GPBInt32FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBInt32FloatDictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:11]);
-  XCTAssertTrue([dict getFloat:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:12]);
-  XCTAssertTrue([dict getFloat:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:13]);
-  XCTAssertTrue([dict getFloat:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:14]);
-  XCTAssertTrue([dict getFloat:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 501.f);
 
   [dict2 release];
@@ -2236,8 +2236,8 @@
   GPBInt32DoubleDictionary *dict = [[GPBInt32DoubleDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:11]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2245,15 +2245,15 @@
 }
 
 - (void)testOne {
-  GPBInt32DoubleDictionary *dict = [GPBInt32DoubleDictionary dictionaryWithDouble:600. forKey:11];
+  GPBInt32DoubleDictionary *dict = [GPBInt32DoubleDictionary dictionaryWithValue:600. forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:12]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 600.);
     XCTAssertNotEqual(stop, NULL);
@@ -2264,27 +2264,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const double kValues[] = { 600., 601., 602. };
   GPBInt32DoubleDictionary *dict =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   double *seenValues = malloc(3 * sizeof(double));
-  [dict enumerateKeysAndDoublesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2306,7 +2306,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndDoublesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2322,29 +2322,29 @@
   const double kValues2[] = { 600., 603., 602. };
   const double kValues3[] = { 600., 601., 602., 603. };
   GPBInt32DoubleDictionary *dict1 =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32DoubleDictionary *dict1prime =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32DoubleDictionary *dict2 =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues2
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32DoubleDictionary *dict3 =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues1
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32DoubleDictionary *dict4 =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues3
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues3
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2373,9 +2373,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt32DoubleDictionary *dict =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32DoubleDictionary *dict2 = [dict copy];
@@ -2394,9 +2394,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt32DoubleDictionary *dict =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32DoubleDictionary *dict2 =
@@ -2414,31 +2414,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setDouble:600. forKey:11];
+  [dict setValue:600. forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const double kValues[] = { 601., 602., 603. };
   GPBInt32DoubleDictionary *dict2 =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 603.);
   [dict2 release];
 }
@@ -2447,57 +2447,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt32DoubleDictionary *dict =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeDoubleForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 603.);
 
   // Remove again does nothing.
-  [dict removeDoubleForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict removeDoubleForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:11]);
-  XCTAssertFalse([dict getDouble:NULL forKey:12]);
-  XCTAssertFalse([dict getDouble:NULL forKey:13]);
-  XCTAssertFalse([dict getDouble:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -2505,75 +2505,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt32DoubleDictionary *dict =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:603. forKey:11];
+  [dict setValue:603. forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:601. forKey:14];
+  [dict setValue:601. forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 601.);
 
   const int32_t kKeys2[] = { 12, 13 };
   const double kValues2[] = { 602., 600. };
   GPBInt32DoubleDictionary *dict2 =
-      [[GPBInt32DoubleDictionary alloc] initWithDoubles:kValues2
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32DoubleDictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:11]);
-  XCTAssertTrue([dict getDouble:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:12]);
-  XCTAssertTrue([dict getDouble:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:13]);
-  XCTAssertTrue([dict getDouble:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:14]);
-  XCTAssertTrue([dict getDouble:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 601.);
 
   [dict2 release];
@@ -2593,8 +2593,8 @@
   GPBInt32EnumDictionary *dict = [[GPBInt32EnumDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:11]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2602,15 +2602,15 @@
 }
 
 - (void)testOne {
-  GPBInt32EnumDictionary *dict = [GPBInt32EnumDictionary dictionaryWithEnum:700 forKey:11];
+  GPBInt32EnumDictionary *dict = [GPBInt32EnumDictionary dictionaryWithValue:700 forKey:11];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 11);
     XCTAssertEqual(aValue, 700);
     XCTAssertNotEqual(stop, NULL);
@@ -2621,27 +2621,27 @@
   const int32_t kKeys[] = { 11, 12, 13 };
   const int32_t kValues[] = { 700, 701, 702 };
   GPBInt32EnumDictionary *dict =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2663,7 +2663,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2679,29 +2679,29 @@
   const int32_t kValues2[] = { 700, 703, 702 };
   const int32_t kValues3[] = { 700, 701, 702, 703 };
   GPBInt32EnumDictionary *dict1 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt32EnumDictionary *dict1prime =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt32EnumDictionary *dict2 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues2
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt32EnumDictionary *dict3 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues1
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt32EnumDictionary *dict4 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues3
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues3
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2730,9 +2730,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt32EnumDictionary *dict =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32EnumDictionary *dict2 = [dict copy];
@@ -2751,9 +2751,9 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt32EnumDictionary *dict =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt32EnumDictionary *dict2 =
@@ -2771,31 +2771,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setEnum:700 forKey:11];
+  [dict setValue:700 forKey:11];
   XCTAssertEqual(dict.count, 1U);
 
   const int32_t kKeys[] = { 12, 13, 14 };
   const int32_t kValues[] = { 701, 702, 703 };
   GPBInt32EnumDictionary *dict2 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 703);
   [dict2 release];
 }
@@ -2804,57 +2804,57 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt32EnumDictionary *dict =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 703);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict removeEnumForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:11]);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertFalse([dict getEnum:NULL forKey:13]);
-  XCTAssertFalse([dict getEnum:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -2862,75 +2862,75 @@
   const int32_t kKeys[] = { 11, 12, 13, 14 };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt32EnumDictionary *dict =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:703 forKey:11];
+  [dict setValue:703 forKey:11];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:701 forKey:14];
+  [dict setValue:701 forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 701);
 
   const int32_t kKeys2[] = { 12, 13 };
   const int32_t kValues2[] = { 702, 700 };
   GPBInt32EnumDictionary *dict2 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues2
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 701);
 
   [dict2 release];
@@ -2958,24 +2958,24 @@
   XCTAssertEqual(dict.count, 3U);
   XCTAssertTrue(dict.validationFunc == TestingEnum_IsValidValue);  // Pointer comparison
   int32_t value;
-  XCTAssertTrue([dict getRawValue:NULL forKey:11]);
-  XCTAssertTrue([dict getRawValue:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:12]);
-  XCTAssertTrue([dict getRawValue:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getRawValue:NULL forKey:13]);
-  XCTAssertTrue([dict getRawValue:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:13 rawValue:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getRawValue:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 rawValue:NULL]);
 
   __block NSUInteger idx = 0;
   int32_t *seenKeys = malloc(3 * sizeof(int32_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -3136,7 +3136,7 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertThrowsSpecificNamed([dict setEnum:801 forKey:12],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:801 forKey:12],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 0U);
   [dict setRawValue:801 forKey:12];  // Unknown
@@ -3145,31 +3145,31 @@
   const int32_t kKeys[] = { 11, 13, 14 };
   const int32_t kValues[] = { 700, 702, 803 };  // Unknown
   GPBInt32EnumDictionary *dict2 =
-      [[GPBInt32EnumDictionary alloc] initWithEnums:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt32EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:12]);
-  XCTAssertTrue([dict getRawValue:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:14]);
-  XCTAssertTrue([dict getRawValue:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:&value]);
   XCTAssertEqual(value, 803);
   [dict2 release];
 }
@@ -3185,51 +3185,51 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:14]);
-  XCTAssertTrue([dict getRawValue:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:12];
+  [dict removeValueForKey:12];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:14]);
-  XCTAssertTrue([dict getRawValue:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  [dict removeEnumForKey:14];
+  [dict removeValueForKey:14];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:11]);
-  XCTAssertFalse([dict getEnum:NULL forKey:12]);
-  XCTAssertFalse([dict getEnum:NULL forKey:13]);
-  XCTAssertFalse([dict getEnum:NULL forKey:14]);
+  XCTAssertFalse([dict valueForKey:11 value:NULL]);
+  XCTAssertFalse([dict valueForKey:12 value:NULL]);
+  XCTAssertFalse([dict valueForKey:13 value:NULL]);
+  XCTAssertFalse([dict valueForKey:14 value:NULL]);
   [dict release];
 }
 
@@ -3244,63 +3244,63 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:12]);
-  XCTAssertTrue([dict getRawValue:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:14]);
-  XCTAssertTrue([dict getRawValue:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  XCTAssertThrowsSpecificNamed([dict setEnum:803 forKey:11],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:803 forKey:11],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:11]);
-  XCTAssertTrue([dict getEnum:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 value:NULL]);
+  XCTAssertTrue([dict valueForKey:11 value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:12]);
-  XCTAssertTrue([dict getRawValue:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:14]);
-  XCTAssertTrue([dict getRawValue:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:803 forKey:11];  // Unknown
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:11]);
-  XCTAssertTrue([dict getRawValue:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:12]);
-  XCTAssertTrue([dict getRawValue:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:14]);
-  XCTAssertTrue([dict getRawValue:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:14 rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:700 forKey:14];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:11]);
-  XCTAssertTrue([dict getRawValue:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:12]);
-  XCTAssertTrue([dict getRawValue:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:12 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:13]);
-  XCTAssertTrue([dict getEnum:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 value:NULL]);
+  XCTAssertTrue([dict valueForKey:13 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 700);
 
   const int32_t kKeys2[] = { 12, 13 };
@@ -3313,17 +3313,17 @@
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:11]);
-  XCTAssertTrue([dict getRawValue:&value forKey:11]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:11 rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getEnum:NULL forKey:12]);
-  XCTAssertTrue([dict getEnum:&value forKey:12]);
+  XCTAssertTrue([dict valueForKey:12 value:NULL]);
+  XCTAssertTrue([dict valueForKey:12 value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:13]);
-  XCTAssertTrue([dict getRawValue:&value forKey:13]);
+  XCTAssertTrue([dict valueForKey:13 rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:13 rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:14]);
-  XCTAssertTrue([dict getEnum:&value forKey:14]);
+  XCTAssertTrue([dict valueForKey:14 value:NULL]);
+  XCTAssertTrue([dict valueForKey:14 value:&value]);
   XCTAssertEqual(value, 700);
 
   [dict2 release];
@@ -3559,8 +3559,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBInt32ObjectDictionary<NSString*> *dict =
       [[GPBInt32ObjectDictionary alloc] initWithObjects:kObjects
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kObjects)];
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
@@ -3600,8 +3600,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBInt32ObjectDictionary<NSString*> *dict =
       [[GPBInt32ObjectDictionary alloc] initWithObjects:kObjects
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kObjects)];
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   XCTAssertEqualObjects([dict objectForKey:11], @"abc");
diff --git a/objectivec/Tests/GPBDictionaryTests+Int64.m b/objectivec/Tests/GPBDictionaryTests+Int64.m
index b90cdf8..66bc648 100644
--- a/objectivec/Tests/GPBDictionaryTests+Int64.m
+++ b/objectivec/Tests/GPBDictionaryTests+Int64.m
@@ -45,10 +45,10 @@
 
 // To let the testing macros work, add some extra methods to simplify things.
 @interface GPBInt64EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(int64_t)key;
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const int64_t [])keys
-                        count:(NSUInteger)count;
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(int64_t)key;
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count;
 @end
 
 static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -64,7 +64,7 @@
 }
 
 @implementation GPBInt64EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(int64_t)key {
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(int64_t)key {
   // Cast is needed to compiler knows what class we are invoking initWithValues: on to get the
   // type correct.
   return [[(GPBInt64EnumDictionary*)[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
@@ -72,9 +72,9 @@
                                                                     forKeys:&key
                                                                       count:1] autorelease];
 }
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const int64_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const int64_t [])keys
+                         count:(NSUInteger)count {
   return [self initWithValidationFunction:TestingEnum_IsValidValue
                                 rawValues:values
                                   forKeys:keys
@@ -94,8 +94,8 @@
   GPBInt64UInt32Dictionary *dict = [[GPBInt64UInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:21LL]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -103,15 +103,15 @@
 }
 
 - (void)testOne {
-  GPBInt64UInt32Dictionary *dict = [GPBInt64UInt32Dictionary dictionaryWithUInt32:100U forKey:21LL];
+  GPBInt64UInt32Dictionary *dict = [GPBInt64UInt32Dictionary dictionaryWithValue:100U forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:22LL]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 100U);
     XCTAssertNotEqual(stop, NULL);
@@ -122,27 +122,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const uint32_t kValues[] = { 100U, 101U, 102U };
   GPBInt64UInt32Dictionary *dict =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   uint32_t *seenValues = malloc(3 * sizeof(uint32_t));
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -164,7 +164,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt32sUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -180,29 +180,29 @@
   const uint32_t kValues2[] = { 100U, 103U, 102U };
   const uint32_t kValues3[] = { 100U, 101U, 102U, 103U };
   GPBInt64UInt32Dictionary *dict1 =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64UInt32Dictionary *dict1prime =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64UInt32Dictionary *dict2 =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64UInt32Dictionary *dict3 =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64UInt32Dictionary *dict4 =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues3
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues3
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -231,9 +231,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt64UInt32Dictionary *dict =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64UInt32Dictionary *dict2 = [dict copy];
@@ -252,9 +252,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt64UInt32Dictionary *dict =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64UInt32Dictionary *dict2 =
@@ -272,31 +272,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt32:100U forKey:21LL];
+  [dict setValue:100U forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const uint32_t kValues[] = { 101U, 102U, 103U };
   GPBInt64UInt32Dictionary *dict2 =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 103U);
   [dict2 release];
 }
@@ -305,57 +305,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt64UInt32Dictionary *dict =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt32ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 103U);
 
   // Remove again does nothing.
-  [dict removeUInt32ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict removeUInt32ForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -363,75 +363,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBInt64UInt32Dictionary *dict =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:103U forKey:21LL];
+  [dict setValue:103U forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:101U forKey:24LL];
+  [dict setValue:101U forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 101U);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const uint32_t kValues2[] = { 102U, 100U };
   GPBInt64UInt32Dictionary *dict2 =
-      [[GPBInt64UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64UInt32Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 101U);
 
   [dict2 release];
@@ -451,8 +451,8 @@
   GPBInt64Int32Dictionary *dict = [[GPBInt64Int32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:21LL]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -460,15 +460,15 @@
 }
 
 - (void)testOne {
-  GPBInt64Int32Dictionary *dict = [GPBInt64Int32Dictionary dictionaryWithInt32:200 forKey:21LL];
+  GPBInt64Int32Dictionary *dict = [GPBInt64Int32Dictionary dictionaryWithValue:200 forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:22LL]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 200);
     XCTAssertNotEqual(stop, NULL);
@@ -479,27 +479,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const int32_t kValues[] = { 200, 201, 202 };
   GPBInt64Int32Dictionary *dict =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndInt32sUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -521,7 +521,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt32sUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -537,27 +537,27 @@
   const int32_t kValues2[] = { 200, 203, 202 };
   const int32_t kValues3[] = { 200, 201, 202, 203 };
   GPBInt64Int32Dictionary *dict1 =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64Int32Dictionary *dict1prime =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64Int32Dictionary *dict2 =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64Int32Dictionary *dict3 =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64Int32Dictionary *dict4 =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues3
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues3
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -588,7 +588,7 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt64Int32Dictionary *dict =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -609,7 +609,7 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt64Int32Dictionary *dict =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -629,13 +629,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt32:200 forKey:21LL];
+  [dict setValue:200 forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 201, 202, 203 };
   GPBInt64Int32Dictionary *dict2 =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -643,17 +643,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 203);
   [dict2 release];
 }
@@ -662,57 +662,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt64Int32Dictionary *dict =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt32ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 203);
 
   // Remove again does nothing.
-  [dict removeInt32ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict removeInt32ForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:21LL]);
-  XCTAssertFalse([dict getInt32:NULL forKey:22LL]);
-  XCTAssertFalse([dict getInt32:NULL forKey:23LL]);
-  XCTAssertFalse([dict getInt32:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -720,75 +720,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBInt64Int32Dictionary *dict =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:203 forKey:21LL];
+  [dict setValue:203 forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:201 forKey:24LL];
+  [dict setValue:201 forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 201);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const int32_t kValues2[] = { 202, 200 };
   GPBInt64Int32Dictionary *dict2 =
-      [[GPBInt64Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBInt64Int32Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt32:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 201);
 
   [dict2 release];
@@ -808,8 +808,8 @@
   GPBInt64UInt64Dictionary *dict = [[GPBInt64UInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:21LL]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -817,15 +817,15 @@
 }
 
 - (void)testOne {
-  GPBInt64UInt64Dictionary *dict = [GPBInt64UInt64Dictionary dictionaryWithUInt64:300U forKey:21LL];
+  GPBInt64UInt64Dictionary *dict = [GPBInt64UInt64Dictionary dictionaryWithValue:300U forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:22LL]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 300U);
     XCTAssertNotEqual(stop, NULL);
@@ -836,27 +836,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const uint64_t kValues[] = { 300U, 301U, 302U };
   GPBInt64UInt64Dictionary *dict =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   uint64_t *seenValues = malloc(3 * sizeof(uint64_t));
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -878,7 +878,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt64sUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -894,29 +894,29 @@
   const uint64_t kValues2[] = { 300U, 303U, 302U };
   const uint64_t kValues3[] = { 300U, 301U, 302U, 303U };
   GPBInt64UInt64Dictionary *dict1 =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64UInt64Dictionary *dict1prime =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64UInt64Dictionary *dict2 =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64UInt64Dictionary *dict3 =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64UInt64Dictionary *dict4 =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues3
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues3
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -945,9 +945,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt64UInt64Dictionary *dict =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64UInt64Dictionary *dict2 = [dict copy];
@@ -966,9 +966,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt64UInt64Dictionary *dict =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64UInt64Dictionary *dict2 =
@@ -986,31 +986,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt64:300U forKey:21LL];
+  [dict setValue:300U forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const uint64_t kValues[] = { 301U, 302U, 303U };
   GPBInt64UInt64Dictionary *dict2 =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 303U);
   [dict2 release];
 }
@@ -1019,57 +1019,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt64UInt64Dictionary *dict =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt64ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 303U);
 
   // Remove again does nothing.
-  [dict removeUInt64ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict removeUInt64ForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -1077,75 +1077,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBInt64UInt64Dictionary *dict =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:303U forKey:21LL];
+  [dict setValue:303U forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:301U forKey:24LL];
+  [dict setValue:301U forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 301U);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const uint64_t kValues2[] = { 302U, 300U };
   GPBInt64UInt64Dictionary *dict2 =
-      [[GPBInt64UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64UInt64Dictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 301U);
 
   [dict2 release];
@@ -1165,8 +1165,8 @@
   GPBInt64Int64Dictionary *dict = [[GPBInt64Int64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:21LL]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1174,15 +1174,15 @@
 }
 
 - (void)testOne {
-  GPBInt64Int64Dictionary *dict = [GPBInt64Int64Dictionary dictionaryWithInt64:400 forKey:21LL];
+  GPBInt64Int64Dictionary *dict = [GPBInt64Int64Dictionary dictionaryWithValue:400 forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:22LL]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 400);
     XCTAssertNotEqual(stop, NULL);
@@ -1193,27 +1193,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const int64_t kValues[] = { 400, 401, 402 };
   GPBInt64Int64Dictionary *dict =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   int64_t *seenValues = malloc(3 * sizeof(int64_t));
-  [dict enumerateKeysAndInt64sUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1235,7 +1235,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt64sUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1251,27 +1251,27 @@
   const int64_t kValues2[] = { 400, 403, 402 };
   const int64_t kValues3[] = { 400, 401, 402, 403 };
   GPBInt64Int64Dictionary *dict1 =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64Int64Dictionary *dict1prime =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64Int64Dictionary *dict2 =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64Int64Dictionary *dict3 =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64Int64Dictionary *dict4 =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues3
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues3
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1302,7 +1302,7 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt64Int64Dictionary *dict =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1323,7 +1323,7 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt64Int64Dictionary *dict =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1343,13 +1343,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt64:400 forKey:21LL];
+  [dict setValue:400 forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const int64_t kValues[] = { 401, 402, 403 };
   GPBInt64Int64Dictionary *dict2 =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1357,17 +1357,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 403);
   [dict2 release];
 }
@@ -1376,57 +1376,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt64Int64Dictionary *dict =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt64ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 403);
 
   // Remove again does nothing.
-  [dict removeInt64ForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict removeInt64ForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:21LL]);
-  XCTAssertFalse([dict getInt64:NULL forKey:22LL]);
-  XCTAssertFalse([dict getInt64:NULL forKey:23LL]);
-  XCTAssertFalse([dict getInt64:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -1434,75 +1434,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBInt64Int64Dictionary *dict =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:403 forKey:21LL];
+  [dict setValue:403 forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:401 forKey:24LL];
+  [dict setValue:401 forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 401);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const int64_t kValues2[] = { 402, 400 };
   GPBInt64Int64Dictionary *dict2 =
-      [[GPBInt64Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBInt64Int64Dictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:21LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:22LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:23LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:24LL]);
-  XCTAssertTrue([dict getInt64:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 401);
 
   [dict2 release];
@@ -1522,8 +1522,8 @@
   GPBInt64BoolDictionary *dict = [[GPBInt64BoolDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:21LL]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1531,15 +1531,15 @@
 }
 
 - (void)testOne {
-  GPBInt64BoolDictionary *dict = [GPBInt64BoolDictionary dictionaryWithBool:YES forKey:21LL];
+  GPBInt64BoolDictionary *dict = [GPBInt64BoolDictionary dictionaryWithValue:YES forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:22LL]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, YES);
     XCTAssertNotEqual(stop, NULL);
@@ -1550,27 +1550,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const BOOL kValues[] = { YES, YES, NO };
   GPBInt64BoolDictionary *dict =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   BOOL *seenValues = malloc(3 * sizeof(BOOL));
-  [dict enumerateKeysAndBoolsUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1592,7 +1592,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndBoolsUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1608,29 +1608,29 @@
   const BOOL kValues2[] = { YES, NO, NO };
   const BOOL kValues3[] = { YES, YES, NO, NO };
   GPBInt64BoolDictionary *dict1 =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64BoolDictionary *dict1prime =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64BoolDictionary *dict2 =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues2
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64BoolDictionary *dict3 =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues1
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64BoolDictionary *dict4 =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues3
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues3
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1659,9 +1659,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt64BoolDictionary *dict =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64BoolDictionary *dict2 = [dict copy];
@@ -1680,9 +1680,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt64BoolDictionary *dict =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64BoolDictionary *dict2 =
@@ -1700,31 +1700,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setBool:YES forKey:21LL];
+  [dict setValue:YES forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const BOOL kValues[] = { YES, NO, NO };
   GPBInt64BoolDictionary *dict2 =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, NO);
   [dict2 release];
 }
@@ -1733,57 +1733,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt64BoolDictionary *dict =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeBoolForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, NO);
 
   // Remove again does nothing.
-  [dict removeBoolForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict removeBoolForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:21LL]);
-  XCTAssertFalse([dict getBool:NULL forKey:22LL]);
-  XCTAssertFalse([dict getBool:NULL forKey:23LL]);
-  XCTAssertFalse([dict getBool:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -1791,75 +1791,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBInt64BoolDictionary *dict =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:NO forKey:21LL];
+  [dict setValue:NO forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:YES forKey:24LL];
+  [dict setValue:YES forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, YES);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const BOOL kValues2[] = { NO, YES };
   GPBInt64BoolDictionary *dict2 =
-      [[GPBInt64BoolDictionary alloc] initWithBools:kValues2
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64BoolDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:21LL]);
-  XCTAssertTrue([dict getBool:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:22LL]);
-  XCTAssertTrue([dict getBool:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:23LL]);
-  XCTAssertTrue([dict getBool:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:24LL]);
-  XCTAssertTrue([dict getBool:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, YES);
 
   [dict2 release];
@@ -1879,8 +1879,8 @@
   GPBInt64FloatDictionary *dict = [[GPBInt64FloatDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:21LL]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1888,15 +1888,15 @@
 }
 
 - (void)testOne {
-  GPBInt64FloatDictionary *dict = [GPBInt64FloatDictionary dictionaryWithFloat:500.f forKey:21LL];
+  GPBInt64FloatDictionary *dict = [GPBInt64FloatDictionary dictionaryWithValue:500.f forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:22LL]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 500.f);
     XCTAssertNotEqual(stop, NULL);
@@ -1907,27 +1907,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const float kValues[] = { 500.f, 501.f, 502.f };
   GPBInt64FloatDictionary *dict =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   float *seenValues = malloc(3 * sizeof(float));
-  [dict enumerateKeysAndFloatsUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1949,7 +1949,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndFloatsUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1965,27 +1965,27 @@
   const float kValues2[] = { 500.f, 503.f, 502.f };
   const float kValues3[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt64FloatDictionary *dict1 =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64FloatDictionary *dict1prime =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64FloatDictionary *dict2 =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64FloatDictionary *dict3 =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues1
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64FloatDictionary *dict4 =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues3
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues3
                                               forKeys:kKeys1
                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -2016,7 +2016,7 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt64FloatDictionary *dict =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2037,7 +2037,7 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt64FloatDictionary *dict =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2057,13 +2057,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setFloat:500.f forKey:21LL];
+  [dict setValue:500.f forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const float kValues[] = { 501.f, 502.f, 503.f };
   GPBInt64FloatDictionary *dict2 =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues
                                               forKeys:kKeys
                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -2071,17 +2071,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 503.f);
   [dict2 release];
 }
@@ -2090,57 +2090,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt64FloatDictionary *dict =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeFloatForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 503.f);
 
   // Remove again does nothing.
-  [dict removeFloatForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict removeFloatForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:21LL]);
-  XCTAssertFalse([dict getFloat:NULL forKey:22LL]);
-  XCTAssertFalse([dict getFloat:NULL forKey:23LL]);
-  XCTAssertFalse([dict getFloat:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -2148,75 +2148,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBInt64FloatDictionary *dict =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:503.f forKey:21LL];
+  [dict setValue:503.f forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:501.f forKey:24LL];
+  [dict setValue:501.f forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 501.f);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const float kValues2[] = { 502.f, 500.f };
   GPBInt64FloatDictionary *dict2 =
-      [[GPBInt64FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBInt64FloatDictionary alloc] initWithValues:kValues2
                                               forKeys:kKeys2
                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:21LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:22LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:23LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:24LL]);
-  XCTAssertTrue([dict getFloat:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 501.f);
 
   [dict2 release];
@@ -2236,8 +2236,8 @@
   GPBInt64DoubleDictionary *dict = [[GPBInt64DoubleDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:21LL]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2245,15 +2245,15 @@
 }
 
 - (void)testOne {
-  GPBInt64DoubleDictionary *dict = [GPBInt64DoubleDictionary dictionaryWithDouble:600. forKey:21LL];
+  GPBInt64DoubleDictionary *dict = [GPBInt64DoubleDictionary dictionaryWithValue:600. forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:22LL]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 600.);
     XCTAssertNotEqual(stop, NULL);
@@ -2264,27 +2264,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const double kValues[] = { 600., 601., 602. };
   GPBInt64DoubleDictionary *dict =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   double *seenValues = malloc(3 * sizeof(double));
-  [dict enumerateKeysAndDoublesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2306,7 +2306,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndDoublesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2322,29 +2322,29 @@
   const double kValues2[] = { 600., 603., 602. };
   const double kValues3[] = { 600., 601., 602., 603. };
   GPBInt64DoubleDictionary *dict1 =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64DoubleDictionary *dict1prime =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues1
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64DoubleDictionary *dict2 =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues2
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64DoubleDictionary *dict3 =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues1
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues1
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64DoubleDictionary *dict4 =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues3
-                                                forKeys:kKeys1
-                                                  count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues3
+                                               forKeys:kKeys1
+                                                 count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2373,9 +2373,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt64DoubleDictionary *dict =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64DoubleDictionary *dict2 = [dict copy];
@@ -2394,9 +2394,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt64DoubleDictionary *dict =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64DoubleDictionary *dict2 =
@@ -2414,31 +2414,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setDouble:600. forKey:21LL];
+  [dict setValue:600. forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const double kValues[] = { 601., 602., 603. };
   GPBInt64DoubleDictionary *dict2 =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues
+                                               forKeys:kKeys
+                                                 count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 603.);
   [dict2 release];
 }
@@ -2447,57 +2447,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt64DoubleDictionary *dict =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeDoubleForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 603.);
 
   // Remove again does nothing.
-  [dict removeDoubleForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict removeDoubleForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:21LL]);
-  XCTAssertFalse([dict getDouble:NULL forKey:22LL]);
-  XCTAssertFalse([dict getDouble:NULL forKey:23LL]);
-  XCTAssertFalse([dict getDouble:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -2505,75 +2505,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBInt64DoubleDictionary *dict =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:603. forKey:21LL];
+  [dict setValue:603. forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:601. forKey:24LL];
+  [dict setValue:601. forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 601.);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const double kValues2[] = { 602., 600. };
   GPBInt64DoubleDictionary *dict2 =
-      [[GPBInt64DoubleDictionary alloc] initWithDoubles:kValues2
-                                                forKeys:kKeys2
-                                                  count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64DoubleDictionary alloc] initWithValues:kValues2
+                                               forKeys:kKeys2
+                                                 count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:21LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:22LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:23LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:24LL]);
-  XCTAssertTrue([dict getDouble:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 601.);
 
   [dict2 release];
@@ -2593,8 +2593,8 @@
   GPBInt64EnumDictionary *dict = [[GPBInt64EnumDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:21LL]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2602,15 +2602,15 @@
 }
 
 - (void)testOne {
-  GPBInt64EnumDictionary *dict = [GPBInt64EnumDictionary dictionaryWithEnum:700 forKey:21LL];
+  GPBInt64EnumDictionary *dict = [GPBInt64EnumDictionary dictionaryWithValue:700 forKey:21LL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 21LL);
     XCTAssertEqual(aValue, 700);
     XCTAssertNotEqual(stop, NULL);
@@ -2621,27 +2621,27 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL };
   const int32_t kValues[] = { 700, 701, 702 };
   GPBInt64EnumDictionary *dict =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2663,7 +2663,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2679,29 +2679,29 @@
   const int32_t kValues2[] = { 700, 703, 702 };
   const int32_t kValues3[] = { 700, 701, 702, 703 };
   GPBInt64EnumDictionary *dict1 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBInt64EnumDictionary *dict1prime =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues1
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBInt64EnumDictionary *dict2 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues2
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBInt64EnumDictionary *dict3 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues1
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues1)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues1
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBInt64EnumDictionary *dict4 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues3
-                                            forKeys:kKeys1
-                                              count:GPBARRAYSIZE(kValues3)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues3
+                                             forKeys:kKeys1
+                                               count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2730,9 +2730,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt64EnumDictionary *dict =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64EnumDictionary *dict2 = [dict copy];
@@ -2751,9 +2751,9 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt64EnumDictionary *dict =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBInt64EnumDictionary *dict2 =
@@ -2771,31 +2771,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setEnum:700 forKey:21LL];
+  [dict setValue:700 forKey:21LL];
   XCTAssertEqual(dict.count, 1U);
 
   const int64_t kKeys[] = { 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 701, 702, 703 };
   GPBInt64EnumDictionary *dict2 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 703);
   [dict2 release];
 }
@@ -2804,57 +2804,57 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt64EnumDictionary *dict =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 703);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict removeEnumForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:21LL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:23LL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -2862,75 +2862,75 @@
   const int64_t kKeys[] = { 21LL, 22LL, 23LL, 24LL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBInt64EnumDictionary *dict =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                            forKeys:kKeys
-                                              count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                      forKeys:kKeys
+                                        count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:703 forKey:21LL];
+  [dict setValue:703 forKey:21LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:701 forKey:24LL];
+  [dict setValue:701 forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 701);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
   const int32_t kValues2[] = { 702, 700 };
   GPBInt64EnumDictionary *dict2 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues2
-                                            forKeys:kKeys2
-                                              count:GPBARRAYSIZE(kValues2)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues2
+                                             forKeys:kKeys2
+                                               count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 701);
 
   [dict2 release];
@@ -2958,24 +2958,24 @@
   XCTAssertEqual(dict.count, 3U);
   XCTAssertTrue(dict.validationFunc == TestingEnum_IsValidValue);  // Pointer comparison
   int32_t value;
-  XCTAssertTrue([dict getRawValue:NULL forKey:21LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:22LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getRawValue:NULL forKey:23LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL rawValue:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getRawValue:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL rawValue:NULL]);
 
   __block NSUInteger idx = 0;
   int64_t *seenKeys = malloc(3 * sizeof(int64_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -3136,7 +3136,7 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertThrowsSpecificNamed([dict setEnum:801 forKey:22LL],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:801 forKey:22LL],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 0U);
   [dict setRawValue:801 forKey:22LL];  // Unknown
@@ -3145,31 +3145,31 @@
   const int64_t kKeys[] = { 21LL, 23LL, 24LL };
   const int32_t kValues[] = { 700, 702, 803 };  // Unknown
   GPBInt64EnumDictionary *dict2 =
-      [[GPBInt64EnumDictionary alloc] initWithEnums:kValues
-                                              forKeys:kKeys
-                                                count:GPBARRAYSIZE(kValues)];
+      [[GPBInt64EnumDictionary alloc] initWithValues:kValues
+                                             forKeys:kKeys
+                                               count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:22LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:24LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:&value]);
   XCTAssertEqual(value, 803);
   [dict2 release];
 }
@@ -3185,51 +3185,51 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:24LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:22LL];
+  [dict removeValueForKey:22LL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:24LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  [dict removeEnumForKey:24LL];
+  [dict removeValueForKey:24LL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:21LL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:22LL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:23LL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:24LL]);
+  XCTAssertFalse([dict valueForKey:21LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:22LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:23LL value:NULL]);
+  XCTAssertFalse([dict valueForKey:24LL value:NULL]);
   [dict release];
 }
 
@@ -3244,63 +3244,63 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:22LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:24LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  XCTAssertThrowsSpecificNamed([dict setEnum:803 forKey:21LL],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:803 forKey:21LL],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:21LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:22LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:24LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:803 forKey:21LL];  // Unknown
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:21LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:22LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:24LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:700 forKey:24LL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:21LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:22LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:23LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 700);
 
   const int64_t kKeys2[] = { 22LL, 23LL };
@@ -3313,17 +3313,17 @@
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:21LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:21LL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:21LL rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getEnum:NULL forKey:22LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:22LL]);
+  XCTAssertTrue([dict valueForKey:22LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:22LL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:23LL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:23LL]);
+  XCTAssertTrue([dict valueForKey:23LL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:23LL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:24LL]);
-  XCTAssertTrue([dict getEnum:&value forKey:24LL]);
+  XCTAssertTrue([dict valueForKey:24LL value:NULL]);
+  XCTAssertTrue([dict valueForKey:24LL value:&value]);
   XCTAssertEqual(value, 700);
 
   [dict2 release];
@@ -3559,8 +3559,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBInt64ObjectDictionary<NSString*> *dict =
       [[GPBInt64ObjectDictionary alloc] initWithObjects:kObjects
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kObjects)];
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
@@ -3600,8 +3600,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBInt64ObjectDictionary<NSString*> *dict =
       [[GPBInt64ObjectDictionary alloc] initWithObjects:kObjects
-                                                forKeys:kKeys
-                                                  count:GPBARRAYSIZE(kObjects)];
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   XCTAssertEqualObjects([dict objectForKey:21LL], @"abc");
diff --git a/objectivec/Tests/GPBDictionaryTests+String.m b/objectivec/Tests/GPBDictionaryTests+String.m
index 5df1d51..bfa10b1 100644
--- a/objectivec/Tests/GPBDictionaryTests+String.m
+++ b/objectivec/Tests/GPBDictionaryTests+String.m
@@ -45,10 +45,10 @@
 
 // To let the testing macros work, add some extra methods to simplify things.
 @interface GPBStringEnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(NSString *)key;
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const NSString * [])keys
-                        count:(NSUInteger)count;
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(NSString *)key;
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const NSString * [])keys
+                         count:(NSUInteger)count;
 @end
 
 static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -64,7 +64,7 @@
 }
 
 @implementation GPBStringEnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(NSString *)key {
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(NSString *)key {
   // Cast is needed to compiler knows what class we are invoking initWithValues: on to get the
   // type correct.
   return [[(GPBStringEnumDictionary*)[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
@@ -72,9 +72,9 @@
                                                                      forKeys:&key
                                                                        count:1] autorelease];
 }
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const NSString * [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const NSString * [])keys
+                         count:(NSUInteger)count {
   return [self initWithValidationFunction:TestingEnum_IsValidValue
                                 rawValues:values
                                   forKeys:keys
@@ -94,8 +94,8 @@
   GPBStringUInt32Dictionary *dict = [[GPBStringUInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -103,15 +103,15 @@
 }
 
 - (void)testOne {
-  GPBStringUInt32Dictionary *dict = [GPBStringUInt32Dictionary dictionaryWithUInt32:100U forKey:@"foo"];
+  GPBStringUInt32Dictionary *dict = [GPBStringUInt32Dictionary dictionaryWithValue:100U forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 100U);
     XCTAssertNotEqual(stop, NULL);
@@ -122,27 +122,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const uint32_t kValues[] = { 100U, 101U, 102U };
   GPBStringUInt32Dictionary *dict =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   uint32_t *seenValues = malloc(3 * sizeof(uint32_t));
-  [dict enumerateKeysAndUInt32sUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -164,7 +164,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt32sUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -180,29 +180,29 @@
   const uint32_t kValues2[] = { 100U, 103U, 102U };
   const uint32_t kValues3[] = { 100U, 101U, 102U, 103U };
   GPBStringUInt32Dictionary *dict1 =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringUInt32Dictionary *dict1prime =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringUInt32Dictionary *dict2 =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringUInt32Dictionary *dict3 =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringUInt32Dictionary *dict4 =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -231,9 +231,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBStringUInt32Dictionary *dict =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringUInt32Dictionary *dict2 = [dict copy];
@@ -252,9 +252,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBStringUInt32Dictionary *dict =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringUInt32Dictionary *dict2 =
@@ -272,31 +272,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt32:100U forKey:@"foo"];
+  [dict setValue:100U forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const uint32_t kValues[] = { 101U, 102U, 103U };
   GPBStringUInt32Dictionary *dict2 =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 103U);
   [dict2 release];
 }
@@ -305,57 +305,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBStringUInt32Dictionary *dict =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt32ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 103U);
 
   // Remove again does nothing.
-  [dict removeUInt32ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict removeUInt32ForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -363,75 +363,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBStringUInt32Dictionary *dict =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:103U forKey:@"foo"];
+  [dict setValue:103U forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:101U forKey:@"mumble"];
+  [dict setValue:101U forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 101U);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const uint32_t kValues2[] = { 102U, 100U };
   GPBStringUInt32Dictionary *dict2 =
-      [[GPBStringUInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringUInt32Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 101U);
 
   [dict2 release];
@@ -451,8 +451,8 @@
   GPBStringInt32Dictionary *dict = [[GPBStringInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -460,15 +460,15 @@
 }
 
 - (void)testOne {
-  GPBStringInt32Dictionary *dict = [GPBStringInt32Dictionary dictionaryWithInt32:200 forKey:@"foo"];
+  GPBStringInt32Dictionary *dict = [GPBStringInt32Dictionary dictionaryWithValue:200 forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 200);
     XCTAssertNotEqual(stop, NULL);
@@ -479,27 +479,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const int32_t kValues[] = { 200, 201, 202 };
   GPBStringInt32Dictionary *dict =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndInt32sUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -521,7 +521,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt32sUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -537,27 +537,27 @@
   const int32_t kValues2[] = { 200, 203, 202 };
   const int32_t kValues3[] = { 200, 201, 202, 203 };
   GPBStringInt32Dictionary *dict1 =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringInt32Dictionary *dict1prime =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringInt32Dictionary *dict2 =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringInt32Dictionary *dict3 =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringInt32Dictionary *dict4 =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues3
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -588,7 +588,7 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBStringInt32Dictionary *dict =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -609,7 +609,7 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBStringInt32Dictionary *dict =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -629,13 +629,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt32:200 forKey:@"foo"];
+  [dict setValue:200 forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 201, 202, 203 };
   GPBStringInt32Dictionary *dict2 =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -643,17 +643,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 203);
   [dict2 release];
 }
@@ -662,57 +662,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBStringInt32Dictionary *dict =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt32ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 203);
 
   // Remove again does nothing.
-  [dict removeInt32ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict removeInt32ForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getInt32:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -720,75 +720,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBStringInt32Dictionary *dict =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:203 forKey:@"foo"];
+  [dict setValue:203 forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:201 forKey:@"mumble"];
+  [dict setValue:201 forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 201);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const int32_t kValues2[] = { 202, 200 };
   GPBStringInt32Dictionary *dict2 =
-      [[GPBStringInt32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBStringInt32Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt32:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 201);
 
   [dict2 release];
@@ -808,8 +808,8 @@
   GPBStringUInt64Dictionary *dict = [[GPBStringUInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -817,15 +817,15 @@
 }
 
 - (void)testOne {
-  GPBStringUInt64Dictionary *dict = [GPBStringUInt64Dictionary dictionaryWithUInt64:300U forKey:@"foo"];
+  GPBStringUInt64Dictionary *dict = [GPBStringUInt64Dictionary dictionaryWithValue:300U forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 300U);
     XCTAssertNotEqual(stop, NULL);
@@ -836,27 +836,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const uint64_t kValues[] = { 300U, 301U, 302U };
   GPBStringUInt64Dictionary *dict =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   uint64_t *seenValues = malloc(3 * sizeof(uint64_t));
-  [dict enumerateKeysAndUInt64sUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -878,7 +878,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt64sUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -894,29 +894,29 @@
   const uint64_t kValues2[] = { 300U, 303U, 302U };
   const uint64_t kValues3[] = { 300U, 301U, 302U, 303U };
   GPBStringUInt64Dictionary *dict1 =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringUInt64Dictionary *dict1prime =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringUInt64Dictionary *dict2 =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringUInt64Dictionary *dict3 =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringUInt64Dictionary *dict4 =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -945,9 +945,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBStringUInt64Dictionary *dict =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringUInt64Dictionary *dict2 = [dict copy];
@@ -966,9 +966,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBStringUInt64Dictionary *dict =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringUInt64Dictionary *dict2 =
@@ -986,31 +986,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt64:300U forKey:@"foo"];
+  [dict setValue:300U forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const uint64_t kValues[] = { 301U, 302U, 303U };
   GPBStringUInt64Dictionary *dict2 =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 303U);
   [dict2 release];
 }
@@ -1019,57 +1019,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBStringUInt64Dictionary *dict =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt64ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 303U);
 
   // Remove again does nothing.
-  [dict removeUInt64ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict removeUInt64ForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -1077,75 +1077,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBStringUInt64Dictionary *dict =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:303U forKey:@"foo"];
+  [dict setValue:303U forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:301U forKey:@"mumble"];
+  [dict setValue:301U forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 301U);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const uint64_t kValues2[] = { 302U, 300U };
   GPBStringUInt64Dictionary *dict2 =
-      [[GPBStringUInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringUInt64Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getUInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 301U);
 
   [dict2 release];
@@ -1165,8 +1165,8 @@
   GPBStringInt64Dictionary *dict = [[GPBStringInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1174,15 +1174,15 @@
 }
 
 - (void)testOne {
-  GPBStringInt64Dictionary *dict = [GPBStringInt64Dictionary dictionaryWithInt64:400 forKey:@"foo"];
+  GPBStringInt64Dictionary *dict = [GPBStringInt64Dictionary dictionaryWithValue:400 forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 400);
     XCTAssertNotEqual(stop, NULL);
@@ -1193,27 +1193,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const int64_t kValues[] = { 400, 401, 402 };
   GPBStringInt64Dictionary *dict =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   int64_t *seenValues = malloc(3 * sizeof(int64_t));
-  [dict enumerateKeysAndInt64sUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1235,7 +1235,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt64sUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1251,27 +1251,27 @@
   const int64_t kValues2[] = { 400, 403, 402 };
   const int64_t kValues3[] = { 400, 401, 402, 403 };
   GPBStringInt64Dictionary *dict1 =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringInt64Dictionary *dict1prime =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringInt64Dictionary *dict2 =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringInt64Dictionary *dict3 =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringInt64Dictionary *dict4 =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues3
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1302,7 +1302,7 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBStringInt64Dictionary *dict =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1323,7 +1323,7 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBStringInt64Dictionary *dict =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1343,13 +1343,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt64:400 forKey:@"foo"];
+  [dict setValue:400 forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const int64_t kValues[] = { 401, 402, 403 };
   GPBStringInt64Dictionary *dict2 =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1357,17 +1357,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 403);
   [dict2 release];
 }
@@ -1376,57 +1376,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBStringInt64Dictionary *dict =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt64ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 403);
 
   // Remove again does nothing.
-  [dict removeInt64ForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict removeInt64ForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getInt64:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -1434,75 +1434,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBStringInt64Dictionary *dict =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:403 forKey:@"foo"];
+  [dict setValue:403 forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:401 forKey:@"mumble"];
+  [dict setValue:401 forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 401);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const int64_t kValues2[] = { 402, 400 };
   GPBStringInt64Dictionary *dict2 =
-      [[GPBStringInt64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBStringInt64Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getInt64:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 401);
 
   [dict2 release];
@@ -1522,8 +1522,8 @@
   GPBStringBoolDictionary *dict = [[GPBStringBoolDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1531,15 +1531,15 @@
 }
 
 - (void)testOne {
-  GPBStringBoolDictionary *dict = [GPBStringBoolDictionary dictionaryWithBool:YES forKey:@"foo"];
+  GPBStringBoolDictionary *dict = [GPBStringBoolDictionary dictionaryWithValue:YES forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, YES);
     XCTAssertNotEqual(stop, NULL);
@@ -1550,27 +1550,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const BOOL kValues[] = { YES, YES, NO };
   GPBStringBoolDictionary *dict =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   BOOL *seenValues = malloc(3 * sizeof(BOOL));
-  [dict enumerateKeysAndBoolsUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1592,7 +1592,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndBoolsUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1608,29 +1608,29 @@
   const BOOL kValues2[] = { YES, NO, NO };
   const BOOL kValues3[] = { YES, YES, NO, NO };
   GPBStringBoolDictionary *dict1 =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringBoolDictionary *dict1prime =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringBoolDictionary *dict2 =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues2
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringBoolDictionary *dict3 =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringBoolDictionary *dict4 =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues3
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues3)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1659,9 +1659,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBStringBoolDictionary *dict =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringBoolDictionary *dict2 = [dict copy];
@@ -1680,9 +1680,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBStringBoolDictionary *dict =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringBoolDictionary *dict2 =
@@ -1700,31 +1700,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setBool:YES forKey:@"foo"];
+  [dict setValue:YES forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const BOOL kValues[] = { YES, NO, NO };
   GPBStringBoolDictionary *dict2 =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, NO);
   [dict2 release];
 }
@@ -1733,57 +1733,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBStringBoolDictionary *dict =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeBoolForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, NO);
 
   // Remove again does nothing.
-  [dict removeBoolForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict removeBoolForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getBool:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -1791,75 +1791,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBStringBoolDictionary *dict =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:NO forKey:@"foo"];
+  [dict setValue:NO forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:YES forKey:@"mumble"];
+  [dict setValue:YES forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, YES);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const BOOL kValues2[] = { NO, YES };
   GPBStringBoolDictionary *dict2 =
-      [[GPBStringBoolDictionary alloc] initWithBools:kValues2
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringBoolDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getBool:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, YES);
 
   [dict2 release];
@@ -1879,8 +1879,8 @@
   GPBStringFloatDictionary *dict = [[GPBStringFloatDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1888,15 +1888,15 @@
 }
 
 - (void)testOne {
-  GPBStringFloatDictionary *dict = [GPBStringFloatDictionary dictionaryWithFloat:500.f forKey:@"foo"];
+  GPBStringFloatDictionary *dict = [GPBStringFloatDictionary dictionaryWithValue:500.f forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 500.f);
     XCTAssertNotEqual(stop, NULL);
@@ -1907,27 +1907,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const float kValues[] = { 500.f, 501.f, 502.f };
   GPBStringFloatDictionary *dict =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   float *seenValues = malloc(3 * sizeof(float));
-  [dict enumerateKeysAndFloatsUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1949,7 +1949,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndFloatsUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1965,27 +1965,27 @@
   const float kValues2[] = { 500.f, 503.f, 502.f };
   const float kValues3[] = { 500.f, 501.f, 502.f, 503.f };
   GPBStringFloatDictionary *dict1 =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues1
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringFloatDictionary *dict1prime =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues1
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringFloatDictionary *dict2 =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues2
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringFloatDictionary *dict3 =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues1
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringFloatDictionary *dict4 =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues3
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -2016,7 +2016,7 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBStringFloatDictionary *dict =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2037,7 +2037,7 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBStringFloatDictionary *dict =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2057,13 +2057,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setFloat:500.f forKey:@"foo"];
+  [dict setValue:500.f forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const float kValues[] = { 501.f, 502.f, 503.f };
   GPBStringFloatDictionary *dict2 =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -2071,17 +2071,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 503.f);
   [dict2 release];
 }
@@ -2090,57 +2090,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBStringFloatDictionary *dict =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeFloatForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 503.f);
 
   // Remove again does nothing.
-  [dict removeFloatForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict removeFloatForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getFloat:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -2148,75 +2148,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBStringFloatDictionary *dict =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:503.f forKey:@"foo"];
+  [dict setValue:503.f forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:501.f forKey:@"mumble"];
+  [dict setValue:501.f forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 501.f);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const float kValues2[] = { 502.f, 500.f };
   GPBStringFloatDictionary *dict2 =
-      [[GPBStringFloatDictionary alloc] initWithFloats:kValues2
+      [[GPBStringFloatDictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getFloat:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 501.f);
 
   [dict2 release];
@@ -2236,8 +2236,8 @@
   GPBStringDoubleDictionary *dict = [[GPBStringDoubleDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2245,15 +2245,15 @@
 }
 
 - (void)testOne {
-  GPBStringDoubleDictionary *dict = [GPBStringDoubleDictionary dictionaryWithDouble:600. forKey:@"foo"];
+  GPBStringDoubleDictionary *dict = [GPBStringDoubleDictionary dictionaryWithValue:600. forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 600.);
     XCTAssertNotEqual(stop, NULL);
@@ -2264,27 +2264,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const double kValues[] = { 600., 601., 602. };
   GPBStringDoubleDictionary *dict =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   double *seenValues = malloc(3 * sizeof(double));
-  [dict enumerateKeysAndDoublesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2306,7 +2306,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndDoublesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2322,29 +2322,29 @@
   const double kValues2[] = { 600., 603., 602. };
   const double kValues3[] = { 600., 601., 602., 603. };
   GPBStringDoubleDictionary *dict1 =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringDoubleDictionary *dict1prime =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringDoubleDictionary *dict2 =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringDoubleDictionary *dict3 =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringDoubleDictionary *dict4 =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2373,9 +2373,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBStringDoubleDictionary *dict =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringDoubleDictionary *dict2 = [dict copy];
@@ -2394,9 +2394,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBStringDoubleDictionary *dict =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringDoubleDictionary *dict2 =
@@ -2414,31 +2414,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setDouble:600. forKey:@"foo"];
+  [dict setValue:600. forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const double kValues[] = { 601., 602., 603. };
   GPBStringDoubleDictionary *dict2 =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 603.);
   [dict2 release];
 }
@@ -2447,57 +2447,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBStringDoubleDictionary *dict =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeDoubleForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 603.);
 
   // Remove again does nothing.
-  [dict removeDoubleForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict removeDoubleForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getDouble:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -2505,75 +2505,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBStringDoubleDictionary *dict =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:603. forKey:@"foo"];
+  [dict setValue:603. forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:601. forKey:@"mumble"];
+  [dict setValue:601. forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 601.);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const double kValues2[] = { 602., 600. };
   GPBStringDoubleDictionary *dict2 =
-      [[GPBStringDoubleDictionary alloc] initWithDoubles:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringDoubleDictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getDouble:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 601.);
 
   [dict2 release];
@@ -2593,8 +2593,8 @@
   GPBStringEnumDictionary *dict = [[GPBStringEnumDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"foo"]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2602,15 +2602,15 @@
 }
 
 - (void)testOne {
-  GPBStringEnumDictionary *dict = [GPBStringEnumDictionary dictionaryWithEnum:700 forKey:@"foo"];
+  GPBStringEnumDictionary *dict = [GPBStringEnumDictionary dictionaryWithValue:700 forKey:@"foo"];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqualObjects(aKey, @"foo");
     XCTAssertEqual(aValue, 700);
     XCTAssertNotEqual(stop, NULL);
@@ -2621,27 +2621,27 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz" };
   const int32_t kValues[] = { 700, 701, 702 };
   GPBStringEnumDictionary *dict =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2663,7 +2663,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2679,29 +2679,29 @@
   const int32_t kValues2[] = { 700, 703, 702 };
   const int32_t kValues3[] = { 700, 701, 702, 703 };
   GPBStringEnumDictionary *dict1 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBStringEnumDictionary *dict1prime =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBStringEnumDictionary *dict2 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues2
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBStringEnumDictionary *dict3 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBStringEnumDictionary *dict4 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues3
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues3)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2730,9 +2730,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBStringEnumDictionary *dict =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringEnumDictionary *dict2 = [dict copy];
@@ -2751,9 +2751,9 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBStringEnumDictionary *dict =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBStringEnumDictionary *dict2 =
@@ -2771,31 +2771,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setEnum:700 forKey:@"foo"];
+  [dict setValue:700 forKey:@"foo"];
   XCTAssertEqual(dict.count, 1U);
 
   const NSString *kKeys[] = { @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 701, 702, 703 };
   GPBStringEnumDictionary *dict2 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 703);
   [dict2 release];
 }
@@ -2804,57 +2804,57 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBStringEnumDictionary *dict =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 703);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict removeEnumForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -2862,75 +2862,75 @@
   const NSString *kKeys[] = { @"foo", @"bar", @"baz", @"mumble" };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBStringEnumDictionary *dict =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:703 forKey:@"foo"];
+  [dict setValue:703 forKey:@"foo"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:701 forKey:@"mumble"];
+  [dict setValue:701 forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 701);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
   const int32_t kValues2[] = { 702, 700 };
   GPBStringEnumDictionary *dict2 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues2
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 701);
 
   [dict2 release];
@@ -2958,24 +2958,24 @@
   XCTAssertEqual(dict.count, 3U);
   XCTAssertTrue(dict.validationFunc == TestingEnum_IsValidValue);  // Pointer comparison
   int32_t value;
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" rawValue:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getRawValue:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" rawValue:NULL]);
 
   __block NSUInteger idx = 0;
   NSString **seenKeys = malloc(3 * sizeof(NSString*));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -3136,7 +3136,7 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertThrowsSpecificNamed([dict setEnum:801 forKey:@"bar"],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:801 forKey:@"bar"],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 0U);
   [dict setRawValue:801 forKey:@"bar"];  // Unknown
@@ -3145,31 +3145,31 @@
   const NSString *kKeys[] = { @"foo", @"baz", @"mumble" };
   const int32_t kValues[] = { 700, 702, 803 };  // Unknown
   GPBStringEnumDictionary *dict2 =
-      [[GPBStringEnumDictionary alloc] initWithEnums:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBStringEnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:&value]);
   XCTAssertEqual(value, 803);
   [dict2 release];
 }
@@ -3185,51 +3185,51 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:@"bar"];
+  [dict removeValueForKey:@"bar"];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  [dict removeEnumForKey:@"mumble"];
+  [dict removeValueForKey:@"mumble"];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertFalse([dict getEnum:NULL forKey:@"mumble"]);
+  XCTAssertFalse([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertFalse([dict valueForKey:@"mumble" value:NULL]);
   [dict release];
 }
 
@@ -3244,63 +3244,63 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  XCTAssertThrowsSpecificNamed([dict setEnum:803 forKey:@"foo"],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:803 forKey:@"foo"],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:803 forKey:@"foo"];  // Unknown
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:700 forKey:@"mumble"];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 700);
 
   const NSString *kKeys2[] = { @"bar", @"baz" };
@@ -3313,17 +3313,17 @@
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"foo"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"foo"]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"foo" rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"bar"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"bar"]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"bar" value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:@"baz"]);
-  XCTAssertTrue([dict getRawValue:&value forKey:@"baz"]);
+  XCTAssertTrue([dict valueForKey:@"baz" rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:@"baz" rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:@"mumble"]);
-  XCTAssertTrue([dict getEnum:&value forKey:@"mumble"]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:NULL]);
+  XCTAssertTrue([dict valueForKey:@"mumble" value:&value]);
   XCTAssertEqual(value, 700);
 
   [dict2 release];
diff --git a/objectivec/Tests/GPBDictionaryTests+UInt32.m b/objectivec/Tests/GPBDictionaryTests+UInt32.m
index 1d3f6f7..499f2ad 100644
--- a/objectivec/Tests/GPBDictionaryTests+UInt32.m
+++ b/objectivec/Tests/GPBDictionaryTests+UInt32.m
@@ -45,10 +45,10 @@
 
 // To let the testing macros work, add some extra methods to simplify things.
 @interface GPBUInt32EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(uint32_t)key;
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const uint32_t [])keys
-                        count:(NSUInteger)count;
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(uint32_t)key;
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count;
 @end
 
 static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -64,7 +64,7 @@
 }
 
 @implementation GPBUInt32EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(uint32_t)key {
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(uint32_t)key {
   // Cast is needed to compiler knows what class we are invoking initWithValues: on to get the
   // type correct.
   return [[(GPBUInt32EnumDictionary*)[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
@@ -72,9 +72,9 @@
                                                                      forKeys:&key
                                                                        count:1] autorelease];
 }
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const uint32_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const uint32_t [])keys
+                         count:(NSUInteger)count {
   return [self initWithValidationFunction:TestingEnum_IsValidValue
                                 rawValues:values
                                   forKeys:keys
@@ -94,8 +94,8 @@
   GPBUInt32UInt32Dictionary *dict = [[GPBUInt32UInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:1U]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -103,15 +103,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32UInt32Dictionary *dict = [GPBUInt32UInt32Dictionary dictionaryWithUInt32:100U forKey:1U];
+  GPBUInt32UInt32Dictionary *dict = [GPBUInt32UInt32Dictionary dictionaryWithValue:100U forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:2U]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 100U);
     XCTAssertNotEqual(stop, NULL);
@@ -122,27 +122,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const uint32_t kValues[] = { 100U, 101U, 102U };
   GPBUInt32UInt32Dictionary *dict =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   uint32_t *seenValues = malloc(3 * sizeof(uint32_t));
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -164,7 +164,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -180,29 +180,29 @@
   const uint32_t kValues2[] = { 100U, 103U, 102U };
   const uint32_t kValues3[] = { 100U, 101U, 102U, 103U };
   GPBUInt32UInt32Dictionary *dict1 =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32UInt32Dictionary *dict1prime =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32UInt32Dictionary *dict2 =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32UInt32Dictionary *dict3 =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32UInt32Dictionary *dict4 =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -231,9 +231,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt32UInt32Dictionary *dict =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32UInt32Dictionary *dict2 = [dict copy];
@@ -252,9 +252,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt32UInt32Dictionary *dict =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32UInt32Dictionary *dict2 =
@@ -272,31 +272,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt32:100U forKey:1U];
+  [dict setValue:100U forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const uint32_t kValues[] = { 101U, 102U, 103U };
   GPBUInt32UInt32Dictionary *dict2 =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 103U);
   [dict2 release];
 }
@@ -305,57 +305,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt32UInt32Dictionary *dict =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt32ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 103U);
 
   // Remove again does nothing.
-  [dict removeUInt32ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict removeUInt32ForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:1U]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:2U]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:3U]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -363,75 +363,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt32UInt32Dictionary *dict =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:103U forKey:1U];
+  [dict setValue:103U forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:101U forKey:4U];
+  [dict setValue:101U forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 101U);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const uint32_t kValues2[] = { 102U, 100U };
   GPBUInt32UInt32Dictionary *dict2 =
-      [[GPBUInt32UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32UInt32Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 101U);
 
   [dict2 release];
@@ -451,8 +451,8 @@
   GPBUInt32Int32Dictionary *dict = [[GPBUInt32Int32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:1U]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -460,15 +460,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32Int32Dictionary *dict = [GPBUInt32Int32Dictionary dictionaryWithInt32:200 forKey:1U];
+  GPBUInt32Int32Dictionary *dict = [GPBUInt32Int32Dictionary dictionaryWithValue:200 forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:2U]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 200);
     XCTAssertNotEqual(stop, NULL);
@@ -479,27 +479,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const int32_t kValues[] = { 200, 201, 202 };
   GPBUInt32Int32Dictionary *dict =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -521,7 +521,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -537,27 +537,27 @@
   const int32_t kValues2[] = { 200, 203, 202 };
   const int32_t kValues3[] = { 200, 201, 202, 203 };
   GPBUInt32Int32Dictionary *dict1 =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32Int32Dictionary *dict1prime =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32Int32Dictionary *dict2 =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32Int32Dictionary *dict3 =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32Int32Dictionary *dict4 =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues3
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -588,7 +588,7 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt32Int32Dictionary *dict =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -609,7 +609,7 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt32Int32Dictionary *dict =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -629,13 +629,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt32:200 forKey:1U];
+  [dict setValue:200 forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const int32_t kValues[] = { 201, 202, 203 };
   GPBUInt32Int32Dictionary *dict2 =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -643,17 +643,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 203);
   [dict2 release];
 }
@@ -662,57 +662,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt32Int32Dictionary *dict =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt32ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 203);
 
   // Remove again does nothing.
-  [dict removeInt32ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict removeInt32ForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:1U]);
-  XCTAssertFalse([dict getInt32:NULL forKey:2U]);
-  XCTAssertFalse([dict getInt32:NULL forKey:3U]);
-  XCTAssertFalse([dict getInt32:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -720,75 +720,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt32Int32Dictionary *dict =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:203 forKey:1U];
+  [dict setValue:203 forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:201 forKey:4U];
+  [dict setValue:201 forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 201);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const int32_t kValues2[] = { 202, 200 };
   GPBUInt32Int32Dictionary *dict2 =
-      [[GPBUInt32Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBUInt32Int32Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt32:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt32:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt32:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt32:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 201);
 
   [dict2 release];
@@ -808,8 +808,8 @@
   GPBUInt32UInt64Dictionary *dict = [[GPBUInt32UInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:1U]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -817,15 +817,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32UInt64Dictionary *dict = [GPBUInt32UInt64Dictionary dictionaryWithUInt64:300U forKey:1U];
+  GPBUInt32UInt64Dictionary *dict = [GPBUInt32UInt64Dictionary dictionaryWithValue:300U forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:2U]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 300U);
     XCTAssertNotEqual(stop, NULL);
@@ -836,27 +836,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const uint64_t kValues[] = { 300U, 301U, 302U };
   GPBUInt32UInt64Dictionary *dict =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   uint64_t *seenValues = malloc(3 * sizeof(uint64_t));
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -878,7 +878,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -894,29 +894,29 @@
   const uint64_t kValues2[] = { 300U, 303U, 302U };
   const uint64_t kValues3[] = { 300U, 301U, 302U, 303U };
   GPBUInt32UInt64Dictionary *dict1 =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32UInt64Dictionary *dict1prime =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32UInt64Dictionary *dict2 =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32UInt64Dictionary *dict3 =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32UInt64Dictionary *dict4 =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -945,9 +945,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt32UInt64Dictionary *dict =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32UInt64Dictionary *dict2 = [dict copy];
@@ -966,9 +966,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt32UInt64Dictionary *dict =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32UInt64Dictionary *dict2 =
@@ -986,31 +986,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt64:300U forKey:1U];
+  [dict setValue:300U forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const uint64_t kValues[] = { 301U, 302U, 303U };
   GPBUInt32UInt64Dictionary *dict2 =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 303U);
   [dict2 release];
 }
@@ -1019,57 +1019,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt32UInt64Dictionary *dict =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt64ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 303U);
 
   // Remove again does nothing.
-  [dict removeUInt64ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict removeUInt64ForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:1U]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:2U]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:3U]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -1077,75 +1077,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt32UInt64Dictionary *dict =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:303U forKey:1U];
+  [dict setValue:303U forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:301U forKey:4U];
+  [dict setValue:301U forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 301U);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const uint64_t kValues2[] = { 302U, 300U };
   GPBUInt32UInt64Dictionary *dict2 =
-      [[GPBUInt32UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32UInt64Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getUInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 301U);
 
   [dict2 release];
@@ -1165,8 +1165,8 @@
   GPBUInt32Int64Dictionary *dict = [[GPBUInt32Int64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:1U]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1174,15 +1174,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32Int64Dictionary *dict = [GPBUInt32Int64Dictionary dictionaryWithInt64:400 forKey:1U];
+  GPBUInt32Int64Dictionary *dict = [GPBUInt32Int64Dictionary dictionaryWithValue:400 forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:2U]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 400);
     XCTAssertNotEqual(stop, NULL);
@@ -1193,27 +1193,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const int64_t kValues[] = { 400, 401, 402 };
   GPBUInt32Int64Dictionary *dict =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   int64_t *seenValues = malloc(3 * sizeof(int64_t));
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1235,7 +1235,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1251,27 +1251,27 @@
   const int64_t kValues2[] = { 400, 403, 402 };
   const int64_t kValues3[] = { 400, 401, 402, 403 };
   GPBUInt32Int64Dictionary *dict1 =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32Int64Dictionary *dict1prime =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32Int64Dictionary *dict2 =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32Int64Dictionary *dict3 =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32Int64Dictionary *dict4 =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues3
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1302,7 +1302,7 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt32Int64Dictionary *dict =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1323,7 +1323,7 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt32Int64Dictionary *dict =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1343,13 +1343,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt64:400 forKey:1U];
+  [dict setValue:400 forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const int64_t kValues[] = { 401, 402, 403 };
   GPBUInt32Int64Dictionary *dict2 =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1357,17 +1357,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 403);
   [dict2 release];
 }
@@ -1376,57 +1376,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt32Int64Dictionary *dict =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt64ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 403);
 
   // Remove again does nothing.
-  [dict removeInt64ForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict removeInt64ForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:1U]);
-  XCTAssertFalse([dict getInt64:NULL forKey:2U]);
-  XCTAssertFalse([dict getInt64:NULL forKey:3U]);
-  XCTAssertFalse([dict getInt64:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -1434,75 +1434,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt32Int64Dictionary *dict =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:403 forKey:1U];
+  [dict setValue:403 forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:401 forKey:4U];
+  [dict setValue:401 forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 401);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const int64_t kValues2[] = { 402, 400 };
   GPBUInt32Int64Dictionary *dict2 =
-      [[GPBUInt32Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBUInt32Int64Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:1U]);
-  XCTAssertTrue([dict getInt64:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:2U]);
-  XCTAssertTrue([dict getInt64:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:3U]);
-  XCTAssertTrue([dict getInt64:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:4U]);
-  XCTAssertTrue([dict getInt64:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 401);
 
   [dict2 release];
@@ -1522,8 +1522,8 @@
   GPBUInt32BoolDictionary *dict = [[GPBUInt32BoolDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:1U]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1531,15 +1531,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32BoolDictionary *dict = [GPBUInt32BoolDictionary dictionaryWithBool:YES forKey:1U];
+  GPBUInt32BoolDictionary *dict = [GPBUInt32BoolDictionary dictionaryWithValue:YES forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:2U]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, YES);
     XCTAssertNotEqual(stop, NULL);
@@ -1550,27 +1550,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const BOOL kValues[] = { YES, YES, NO };
   GPBUInt32BoolDictionary *dict =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   BOOL *seenValues = malloc(3 * sizeof(BOOL));
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1592,7 +1592,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1608,29 +1608,29 @@
   const BOOL kValues2[] = { YES, NO, NO };
   const BOOL kValues3[] = { YES, YES, NO, NO };
   GPBUInt32BoolDictionary *dict1 =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32BoolDictionary *dict1prime =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32BoolDictionary *dict2 =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues2
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32BoolDictionary *dict3 =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32BoolDictionary *dict4 =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues3
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1659,9 +1659,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt32BoolDictionary *dict =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32BoolDictionary *dict2 = [dict copy];
@@ -1680,9 +1680,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt32BoolDictionary *dict =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32BoolDictionary *dict2 =
@@ -1700,31 +1700,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setBool:YES forKey:1U];
+  [dict setValue:YES forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const BOOL kValues[] = { YES, NO, NO };
   GPBUInt32BoolDictionary *dict2 =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, NO);
   [dict2 release];
 }
@@ -1733,57 +1733,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt32BoolDictionary *dict =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeBoolForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, NO);
 
   // Remove again does nothing.
-  [dict removeBoolForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict removeBoolForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:1U]);
-  XCTAssertFalse([dict getBool:NULL forKey:2U]);
-  XCTAssertFalse([dict getBool:NULL forKey:3U]);
-  XCTAssertFalse([dict getBool:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -1791,75 +1791,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt32BoolDictionary *dict =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:NO forKey:1U];
+  [dict setValue:NO forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:YES forKey:4U];
+  [dict setValue:YES forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, YES);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const BOOL kValues2[] = { NO, YES };
   GPBUInt32BoolDictionary *dict2 =
-      [[GPBUInt32BoolDictionary alloc] initWithBools:kValues2
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32BoolDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:1U]);
-  XCTAssertTrue([dict getBool:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:2U]);
-  XCTAssertTrue([dict getBool:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:3U]);
-  XCTAssertTrue([dict getBool:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:4U]);
-  XCTAssertTrue([dict getBool:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, YES);
 
   [dict2 release];
@@ -1879,8 +1879,8 @@
   GPBUInt32FloatDictionary *dict = [[GPBUInt32FloatDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:1U]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1888,15 +1888,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32FloatDictionary *dict = [GPBUInt32FloatDictionary dictionaryWithFloat:500.f forKey:1U];
+  GPBUInt32FloatDictionary *dict = [GPBUInt32FloatDictionary dictionaryWithValue:500.f forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:2U]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 500.f);
     XCTAssertNotEqual(stop, NULL);
@@ -1907,27 +1907,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const float kValues[] = { 500.f, 501.f, 502.f };
   GPBUInt32FloatDictionary *dict =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   float *seenValues = malloc(3 * sizeof(float));
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1949,7 +1949,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1965,27 +1965,27 @@
   const float kValues2[] = { 500.f, 503.f, 502.f };
   const float kValues3[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt32FloatDictionary *dict1 =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32FloatDictionary *dict1prime =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32FloatDictionary *dict2 =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32FloatDictionary *dict3 =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32FloatDictionary *dict4 =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues3
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -2016,7 +2016,7 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt32FloatDictionary *dict =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2037,7 +2037,7 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt32FloatDictionary *dict =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2057,13 +2057,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setFloat:500.f forKey:1U];
+  [dict setValue:500.f forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const float kValues[] = { 501.f, 502.f, 503.f };
   GPBUInt32FloatDictionary *dict2 =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -2071,17 +2071,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 503.f);
   [dict2 release];
 }
@@ -2090,57 +2090,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt32FloatDictionary *dict =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeFloatForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 503.f);
 
   // Remove again does nothing.
-  [dict removeFloatForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict removeFloatForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:1U]);
-  XCTAssertFalse([dict getFloat:NULL forKey:2U]);
-  XCTAssertFalse([dict getFloat:NULL forKey:3U]);
-  XCTAssertFalse([dict getFloat:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -2148,75 +2148,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt32FloatDictionary *dict =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:503.f forKey:1U];
+  [dict setValue:503.f forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:501.f forKey:4U];
+  [dict setValue:501.f forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 501.f);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const float kValues2[] = { 502.f, 500.f };
   GPBUInt32FloatDictionary *dict2 =
-      [[GPBUInt32FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBUInt32FloatDictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:1U]);
-  XCTAssertTrue([dict getFloat:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:2U]);
-  XCTAssertTrue([dict getFloat:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:3U]);
-  XCTAssertTrue([dict getFloat:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:4U]);
-  XCTAssertTrue([dict getFloat:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 501.f);
 
   [dict2 release];
@@ -2236,8 +2236,8 @@
   GPBUInt32DoubleDictionary *dict = [[GPBUInt32DoubleDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:1U]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2245,15 +2245,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32DoubleDictionary *dict = [GPBUInt32DoubleDictionary dictionaryWithDouble:600. forKey:1U];
+  GPBUInt32DoubleDictionary *dict = [GPBUInt32DoubleDictionary dictionaryWithValue:600. forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:2U]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 600.);
     XCTAssertNotEqual(stop, NULL);
@@ -2264,27 +2264,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const double kValues[] = { 600., 601., 602. };
   GPBUInt32DoubleDictionary *dict =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   double *seenValues = malloc(3 * sizeof(double));
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2306,7 +2306,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2322,29 +2322,29 @@
   const double kValues2[] = { 600., 603., 602. };
   const double kValues3[] = { 600., 601., 602., 603. };
   GPBUInt32DoubleDictionary *dict1 =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32DoubleDictionary *dict1prime =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32DoubleDictionary *dict2 =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32DoubleDictionary *dict3 =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32DoubleDictionary *dict4 =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2373,9 +2373,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt32DoubleDictionary *dict =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32DoubleDictionary *dict2 = [dict copy];
@@ -2394,9 +2394,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt32DoubleDictionary *dict =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32DoubleDictionary *dict2 =
@@ -2414,31 +2414,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setDouble:600. forKey:1U];
+  [dict setValue:600. forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const double kValues[] = { 601., 602., 603. };
   GPBUInt32DoubleDictionary *dict2 =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 603.);
   [dict2 release];
 }
@@ -2447,57 +2447,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt32DoubleDictionary *dict =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeDoubleForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 603.);
 
   // Remove again does nothing.
-  [dict removeDoubleForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict removeDoubleForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:1U]);
-  XCTAssertFalse([dict getDouble:NULL forKey:2U]);
-  XCTAssertFalse([dict getDouble:NULL forKey:3U]);
-  XCTAssertFalse([dict getDouble:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -2505,75 +2505,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt32DoubleDictionary *dict =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:603. forKey:1U];
+  [dict setValue:603. forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:601. forKey:4U];
+  [dict setValue:601. forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 601.);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const double kValues2[] = { 602., 600. };
   GPBUInt32DoubleDictionary *dict2 =
-      [[GPBUInt32DoubleDictionary alloc] initWithDoubles:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32DoubleDictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:1U]);
-  XCTAssertTrue([dict getDouble:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:2U]);
-  XCTAssertTrue([dict getDouble:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:3U]);
-  XCTAssertTrue([dict getDouble:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:4U]);
-  XCTAssertTrue([dict getDouble:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 601.);
 
   [dict2 release];
@@ -2593,8 +2593,8 @@
   GPBUInt32EnumDictionary *dict = [[GPBUInt32EnumDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:1U]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2602,15 +2602,15 @@
 }
 
 - (void)testOne {
-  GPBUInt32EnumDictionary *dict = [GPBUInt32EnumDictionary dictionaryWithEnum:700 forKey:1U];
+  GPBUInt32EnumDictionary *dict = [GPBUInt32EnumDictionary dictionaryWithValue:700 forKey:1U];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 1U);
     XCTAssertEqual(aValue, 700);
     XCTAssertNotEqual(stop, NULL);
@@ -2621,27 +2621,27 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U };
   const int32_t kValues[] = { 700, 701, 702 };
   GPBUInt32EnumDictionary *dict =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2663,7 +2663,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2679,29 +2679,29 @@
   const int32_t kValues2[] = { 700, 703, 702 };
   const int32_t kValues3[] = { 700, 701, 702, 703 };
   GPBUInt32EnumDictionary *dict1 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt32EnumDictionary *dict1prime =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt32EnumDictionary *dict2 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues2
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt32EnumDictionary *dict3 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt32EnumDictionary *dict4 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues3
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2730,9 +2730,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt32EnumDictionary *dict =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32EnumDictionary *dict2 = [dict copy];
@@ -2751,9 +2751,9 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt32EnumDictionary *dict =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt32EnumDictionary *dict2 =
@@ -2771,31 +2771,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setEnum:700 forKey:1U];
+  [dict setValue:700 forKey:1U];
   XCTAssertEqual(dict.count, 1U);
 
   const uint32_t kKeys[] = { 2U, 3U, 4U };
   const int32_t kValues[] = { 701, 702, 703 };
   GPBUInt32EnumDictionary *dict2 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 703);
   [dict2 release];
 }
@@ -2804,57 +2804,57 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt32EnumDictionary *dict =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 703);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict removeEnumForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:1U]);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertFalse([dict getEnum:NULL forKey:3U]);
-  XCTAssertFalse([dict getEnum:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -2862,75 +2862,75 @@
   const uint32_t kKeys[] = { 1U, 2U, 3U, 4U };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt32EnumDictionary *dict =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:703 forKey:1U];
+  [dict setValue:703 forKey:1U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:701 forKey:4U];
+  [dict setValue:701 forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 701);
 
   const uint32_t kKeys2[] = { 2U, 3U };
   const int32_t kValues2[] = { 702, 700 };
   GPBUInt32EnumDictionary *dict2 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues2
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 701);
 
   [dict2 release];
@@ -2958,24 +2958,24 @@
   XCTAssertEqual(dict.count, 3U);
   XCTAssertTrue(dict.validationFunc == TestingEnum_IsValidValue);  // Pointer comparison
   int32_t value;
-  XCTAssertTrue([dict getRawValue:NULL forKey:1U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:2U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getRawValue:NULL forKey:3U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:3U rawValue:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getRawValue:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U rawValue:NULL]);
 
   __block NSUInteger idx = 0;
   uint32_t *seenKeys = malloc(3 * sizeof(uint32_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -3136,7 +3136,7 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertThrowsSpecificNamed([dict setEnum:801 forKey:2U],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:801 forKey:2U],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 0U);
   [dict setRawValue:801 forKey:2U];  // Unknown
@@ -3145,31 +3145,31 @@
   const uint32_t kKeys[] = { 1U, 3U, 4U };
   const int32_t kValues[] = { 700, 702, 803 };  // Unknown
   GPBUInt32EnumDictionary *dict2 =
-      [[GPBUInt32EnumDictionary alloc] initWithEnums:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt32EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:2U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:4U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:&value]);
   XCTAssertEqual(value, 803);
   [dict2 release];
 }
@@ -3185,51 +3185,51 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:4U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:2U];
+  [dict removeValueForKey:2U];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:4U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  [dict removeEnumForKey:4U];
+  [dict removeValueForKey:4U];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:1U]);
-  XCTAssertFalse([dict getEnum:NULL forKey:2U]);
-  XCTAssertFalse([dict getEnum:NULL forKey:3U]);
-  XCTAssertFalse([dict getEnum:NULL forKey:4U]);
+  XCTAssertFalse([dict valueForKey:1U value:NULL]);
+  XCTAssertFalse([dict valueForKey:2U value:NULL]);
+  XCTAssertFalse([dict valueForKey:3U value:NULL]);
+  XCTAssertFalse([dict valueForKey:4U value:NULL]);
   [dict release];
 }
 
@@ -3244,63 +3244,63 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:2U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:4U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  XCTAssertThrowsSpecificNamed([dict setEnum:803 forKey:1U],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:803 forKey:1U],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:1U]);
-  XCTAssertTrue([dict getEnum:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U value:NULL]);
+  XCTAssertTrue([dict valueForKey:1U value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:2U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:4U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:803 forKey:1U];  // Unknown
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:1U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:2U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:4U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:4U rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:700 forKey:4U];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:1U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:2U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:2U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:3U]);
-  XCTAssertTrue([dict getEnum:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U value:NULL]);
+  XCTAssertTrue([dict valueForKey:3U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 700);
 
   const uint32_t kKeys2[] = { 2U, 3U };
@@ -3313,17 +3313,17 @@
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:1U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:1U]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:1U rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getEnum:NULL forKey:2U]);
-  XCTAssertTrue([dict getEnum:&value forKey:2U]);
+  XCTAssertTrue([dict valueForKey:2U value:NULL]);
+  XCTAssertTrue([dict valueForKey:2U value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:3U]);
-  XCTAssertTrue([dict getRawValue:&value forKey:3U]);
+  XCTAssertTrue([dict valueForKey:3U rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:3U rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:4U]);
-  XCTAssertTrue([dict getEnum:&value forKey:4U]);
+  XCTAssertTrue([dict valueForKey:4U value:NULL]);
+  XCTAssertTrue([dict valueForKey:4U value:&value]);
   XCTAssertEqual(value, 700);
 
   [dict2 release];
@@ -3559,8 +3559,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBUInt32ObjectDictionary<NSString*> *dict =
       [[GPBUInt32ObjectDictionary alloc] initWithObjects:kObjects
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kObjects)];
+                                          forKeys:kKeys
+                                            count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
@@ -3600,8 +3600,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBUInt32ObjectDictionary<NSString*> *dict =
       [[GPBUInt32ObjectDictionary alloc] initWithObjects:kObjects
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kObjects)];
+                                          forKeys:kKeys
+                                            count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   XCTAssertEqualObjects([dict objectForKey:1U], @"abc");
diff --git a/objectivec/Tests/GPBDictionaryTests+UInt64.m b/objectivec/Tests/GPBDictionaryTests+UInt64.m
index 94c116f..327e154 100644
--- a/objectivec/Tests/GPBDictionaryTests+UInt64.m
+++ b/objectivec/Tests/GPBDictionaryTests+UInt64.m
@@ -45,10 +45,10 @@
 
 // To let the testing macros work, add some extra methods to simplify things.
 @interface GPBUInt64EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(uint64_t)key;
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const uint64_t [])keys
-                        count:(NSUInteger)count;
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(uint64_t)key;
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count;
 @end
 
 static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -64,7 +64,7 @@
 }
 
 @implementation GPBUInt64EnumDictionary (TestingTweak)
-+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(uint64_t)key {
++ (instancetype)dictionaryWithValue:(int32_t)value forKey:(uint64_t)key {
   // Cast is needed to compiler knows what class we are invoking initWithValues: on to get the
   // type correct.
   return [[(GPBUInt64EnumDictionary*)[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
@@ -72,9 +72,9 @@
                                                                      forKeys:&key
                                                                        count:1] autorelease];
 }
-- (instancetype)initWithEnums:(const int32_t [])values
-                      forKeys:(const uint64_t [])keys
-                        count:(NSUInteger)count {
+- (instancetype)initWithValues:(const int32_t [])values
+                       forKeys:(const uint64_t [])keys
+                         count:(NSUInteger)count {
   return [self initWithValidationFunction:TestingEnum_IsValidValue
                                 rawValues:values
                                   forKeys:keys
@@ -94,8 +94,8 @@
   GPBUInt64UInt32Dictionary *dict = [[GPBUInt64UInt32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:31ULL]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -103,15 +103,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64UInt32Dictionary *dict = [GPBUInt64UInt32Dictionary dictionaryWithUInt32:100U forKey:31ULL];
+  GPBUInt64UInt32Dictionary *dict = [GPBUInt64UInt32Dictionary dictionaryWithValue:100U forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:32ULL]);
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 100U);
     XCTAssertNotEqual(stop, NULL);
@@ -122,27 +122,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const uint32_t kValues[] = { 100U, 101U, 102U };
   GPBUInt64UInt32Dictionary *dict =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   uint32_t *seenValues = malloc(3 * sizeof(uint32_t));
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -164,7 +164,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt32sUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -180,29 +180,29 @@
   const uint32_t kValues2[] = { 100U, 103U, 102U };
   const uint32_t kValues3[] = { 100U, 101U, 102U, 103U };
   GPBUInt64UInt32Dictionary *dict1 =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64UInt32Dictionary *dict1prime =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64UInt32Dictionary *dict2 =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64UInt32Dictionary *dict3 =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64UInt32Dictionary *dict4 =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -231,9 +231,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt64UInt32Dictionary *dict =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64UInt32Dictionary *dict2 = [dict copy];
@@ -252,9 +252,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt64UInt32Dictionary *dict =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64UInt32Dictionary *dict2 =
@@ -272,31 +272,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt32:100U forKey:31ULL];
+  [dict setValue:100U forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const uint32_t kValues[] = { 101U, 102U, 103U };
   GPBUInt64UInt32Dictionary *dict2 =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 103U);
   [dict2 release];
 }
@@ -305,57 +305,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt64UInt32Dictionary *dict =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt32ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 103U);
 
   // Remove again does nothing.
-  [dict removeUInt32ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict removeUInt32ForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getUInt32:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -363,75 +363,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint32_t kValues[] = { 100U, 101U, 102U, 103U };
   GPBUInt64UInt32Dictionary *dict =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint32_t value;
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:103U forKey:31ULL];
+  [dict setValue:103U forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 103U);
 
-  [dict setUInt32:101U forKey:34ULL];
+  [dict setValue:101U forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 101U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 101U);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const uint32_t kValues2[] = { 102U, 100U };
   GPBUInt64UInt32Dictionary *dict2 =
-      [[GPBUInt64UInt32Dictionary alloc] initWithUInt32s:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64UInt32Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 103U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 102U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 100U);
-  XCTAssertTrue([dict getUInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 101U);
 
   [dict2 release];
@@ -451,8 +451,8 @@
   GPBUInt64Int32Dictionary *dict = [[GPBUInt64Int32Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:31ULL]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -460,15 +460,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64Int32Dictionary *dict = [GPBUInt64Int32Dictionary dictionaryWithInt32:200 forKey:31ULL];
+  GPBUInt64Int32Dictionary *dict = [GPBUInt64Int32Dictionary dictionaryWithValue:200 forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:32ULL]);
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 200);
     XCTAssertNotEqual(stop, NULL);
@@ -479,27 +479,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const int32_t kValues[] = { 200, 201, 202 };
   GPBUInt64Int32Dictionary *dict =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -521,7 +521,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt32sUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -537,27 +537,27 @@
   const int32_t kValues2[] = { 200, 203, 202 };
   const int32_t kValues3[] = { 200, 201, 202, 203 };
   GPBUInt64Int32Dictionary *dict1 =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64Int32Dictionary *dict1prime =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64Int32Dictionary *dict2 =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64Int32Dictionary *dict3 =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues1
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64Int32Dictionary *dict4 =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues3
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -588,7 +588,7 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt64Int32Dictionary *dict =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -609,7 +609,7 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt64Int32Dictionary *dict =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -629,13 +629,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt32:200 forKey:31ULL];
+  [dict setValue:200 forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 201, 202, 203 };
   GPBUInt64Int32Dictionary *dict2 =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -643,17 +643,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 203);
   [dict2 release];
 }
@@ -662,57 +662,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt64Int32Dictionary *dict =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt32ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 203);
 
   // Remove again does nothing.
-  [dict removeInt32ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict removeInt32ForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertFalse([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertFalse([dict getInt32:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getInt32:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -720,75 +720,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 200, 201, 202, 203 };
   GPBUInt64Int32Dictionary *dict =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:203 forKey:31ULL];
+  [dict setValue:203 forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 203);
 
-  [dict setInt32:201 forKey:34ULL];
+  [dict setValue:201 forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 201);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 201);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const int32_t kValues2[] = { 202, 200 };
   GPBUInt64Int32Dictionary *dict2 =
-      [[GPBUInt64Int32Dictionary alloc] initWithInt32s:kValues2
+      [[GPBUInt64Int32Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt32:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 203);
-  XCTAssertTrue([dict getInt32:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 202);
-  XCTAssertTrue([dict getInt32:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 200);
-  XCTAssertTrue([dict getInt32:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt32:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 201);
 
   [dict2 release];
@@ -808,8 +808,8 @@
   GPBUInt64UInt64Dictionary *dict = [[GPBUInt64UInt64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:31ULL]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -817,15 +817,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64UInt64Dictionary *dict = [GPBUInt64UInt64Dictionary dictionaryWithUInt64:300U forKey:31ULL];
+  GPBUInt64UInt64Dictionary *dict = [GPBUInt64UInt64Dictionary dictionaryWithValue:300U forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:32ULL]);
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 300U);
     XCTAssertNotEqual(stop, NULL);
@@ -836,27 +836,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const uint64_t kValues[] = { 300U, 301U, 302U };
   GPBUInt64UInt64Dictionary *dict =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   uint64_t *seenValues = malloc(3 * sizeof(uint64_t));
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -878,7 +878,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndUInt64sUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -894,29 +894,29 @@
   const uint64_t kValues2[] = { 300U, 303U, 302U };
   const uint64_t kValues3[] = { 300U, 301U, 302U, 303U };
   GPBUInt64UInt64Dictionary *dict1 =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64UInt64Dictionary *dict1prime =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64UInt64Dictionary *dict2 =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64UInt64Dictionary *dict3 =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64UInt64Dictionary *dict4 =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -945,9 +945,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt64UInt64Dictionary *dict =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64UInt64Dictionary *dict2 = [dict copy];
@@ -966,9 +966,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt64UInt64Dictionary *dict =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64UInt64Dictionary *dict2 =
@@ -986,31 +986,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setUInt64:300U forKey:31ULL];
+  [dict setValue:300U forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const uint64_t kValues[] = { 301U, 302U, 303U };
   GPBUInt64UInt64Dictionary *dict2 =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 303U);
   [dict2 release];
 }
@@ -1019,57 +1019,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt64UInt64Dictionary *dict =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeUInt64ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 303U);
 
   // Remove again does nothing.
-  [dict removeUInt64ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict removeUInt64ForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getUInt64:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -1077,75 +1077,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const uint64_t kValues[] = { 300U, 301U, 302U, 303U };
   GPBUInt64UInt64Dictionary *dict =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   uint64_t value;
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:303U forKey:31ULL];
+  [dict setValue:303U forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 303U);
 
-  [dict setUInt64:301U forKey:34ULL];
+  [dict setValue:301U forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 301U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 301U);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const uint64_t kValues2[] = { 302U, 300U };
   GPBUInt64UInt64Dictionary *dict2 =
-      [[GPBUInt64UInt64Dictionary alloc] initWithUInt64s:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64UInt64Dictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 303U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 302U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 300U);
-  XCTAssertTrue([dict getUInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getUInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 301U);
 
   [dict2 release];
@@ -1165,8 +1165,8 @@
   GPBUInt64Int64Dictionary *dict = [[GPBUInt64Int64Dictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:31ULL]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1174,15 +1174,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64Int64Dictionary *dict = [GPBUInt64Int64Dictionary dictionaryWithInt64:400 forKey:31ULL];
+  GPBUInt64Int64Dictionary *dict = [GPBUInt64Int64Dictionary dictionaryWithValue:400 forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:32ULL]);
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 400);
     XCTAssertNotEqual(stop, NULL);
@@ -1193,27 +1193,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const int64_t kValues[] = { 400, 401, 402 };
   GPBUInt64Int64Dictionary *dict =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   int64_t *seenValues = malloc(3 * sizeof(int64_t));
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1235,7 +1235,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndInt64sUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1251,27 +1251,27 @@
   const int64_t kValues2[] = { 400, 403, 402 };
   const int64_t kValues3[] = { 400, 401, 402, 403 };
   GPBUInt64Int64Dictionary *dict1 =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64Int64Dictionary *dict1prime =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64Int64Dictionary *dict2 =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64Int64Dictionary *dict3 =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues1
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64Int64Dictionary *dict4 =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues3
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -1302,7 +1302,7 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt64Int64Dictionary *dict =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1323,7 +1323,7 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt64Int64Dictionary *dict =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -1343,13 +1343,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setInt64:400 forKey:31ULL];
+  [dict setValue:400 forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const int64_t kValues[] = { 401, 402, 403 };
   GPBUInt64Int64Dictionary *dict2 =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -1357,17 +1357,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 403);
   [dict2 release];
 }
@@ -1376,57 +1376,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt64Int64Dictionary *dict =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeInt64ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 403);
 
   // Remove again does nothing.
-  [dict removeInt64ForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict removeInt64ForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertFalse([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertFalse([dict getInt64:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getInt64:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -1434,75 +1434,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int64_t kValues[] = { 400, 401, 402, 403 };
   GPBUInt64Int64Dictionary *dict =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int64_t value;
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:403 forKey:31ULL];
+  [dict setValue:403 forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 403);
 
-  [dict setInt64:401 forKey:34ULL];
+  [dict setValue:401 forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 401);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 401);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const int64_t kValues2[] = { 402, 400 };
   GPBUInt64Int64Dictionary *dict2 =
-      [[GPBUInt64Int64Dictionary alloc] initWithInt64s:kValues2
+      [[GPBUInt64Int64Dictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getInt64:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 403);
-  XCTAssertTrue([dict getInt64:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 402);
-  XCTAssertTrue([dict getInt64:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 400);
-  XCTAssertTrue([dict getInt64:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getInt64:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 401);
 
   [dict2 release];
@@ -1522,8 +1522,8 @@
   GPBUInt64BoolDictionary *dict = [[GPBUInt64BoolDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:31ULL]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1531,15 +1531,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64BoolDictionary *dict = [GPBUInt64BoolDictionary dictionaryWithBool:YES forKey:31ULL];
+  GPBUInt64BoolDictionary *dict = [GPBUInt64BoolDictionary dictionaryWithValue:YES forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:32ULL]);
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, YES);
     XCTAssertNotEqual(stop, NULL);
@@ -1550,27 +1550,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const BOOL kValues[] = { YES, YES, NO };
   GPBUInt64BoolDictionary *dict =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   BOOL *seenValues = malloc(3 * sizeof(BOOL));
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1592,7 +1592,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndBoolsUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1608,29 +1608,29 @@
   const BOOL kValues2[] = { YES, NO, NO };
   const BOOL kValues3[] = { YES, YES, NO, NO };
   GPBUInt64BoolDictionary *dict1 =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64BoolDictionary *dict1prime =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64BoolDictionary *dict2 =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues2
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64BoolDictionary *dict3 =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues1
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64BoolDictionary *dict4 =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues3
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -1659,9 +1659,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt64BoolDictionary *dict =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64BoolDictionary *dict2 = [dict copy];
@@ -1680,9 +1680,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt64BoolDictionary *dict =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64BoolDictionary *dict2 =
@@ -1700,31 +1700,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setBool:YES forKey:31ULL];
+  [dict setValue:YES forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const BOOL kValues[] = { YES, NO, NO };
   GPBUInt64BoolDictionary *dict2 =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, NO);
   [dict2 release];
 }
@@ -1733,57 +1733,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt64BoolDictionary *dict =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeBoolForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, NO);
 
   // Remove again does nothing.
-  [dict removeBoolForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict removeBoolForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertFalse([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertFalse([dict getBool:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getBool:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getBool:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getBool:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getBool:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -1791,75 +1791,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const BOOL kValues[] = { YES, YES, NO, NO };
   GPBUInt64BoolDictionary *dict =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   BOOL value;
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:NO forKey:31ULL];
+  [dict setValue:NO forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, NO);
 
-  [dict setBool:YES forKey:34ULL];
+  [dict setValue:YES forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, YES);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const BOOL kValues2[] = { NO, YES };
   GPBUInt64BoolDictionary *dict2 =
-      [[GPBUInt64BoolDictionary alloc] initWithBools:kValues2
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64BoolDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getBool:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, NO);
-  XCTAssertTrue([dict getBool:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, YES);
-  XCTAssertTrue([dict getBool:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getBool:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, YES);
 
   [dict2 release];
@@ -1879,8 +1879,8 @@
   GPBUInt64FloatDictionary *dict = [[GPBUInt64FloatDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:31ULL]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -1888,15 +1888,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64FloatDictionary *dict = [GPBUInt64FloatDictionary dictionaryWithFloat:500.f forKey:31ULL];
+  GPBUInt64FloatDictionary *dict = [GPBUInt64FloatDictionary dictionaryWithValue:500.f forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:32ULL]);
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 500.f);
     XCTAssertNotEqual(stop, NULL);
@@ -1907,27 +1907,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const float kValues[] = { 500.f, 501.f, 502.f };
   GPBUInt64FloatDictionary *dict =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   float *seenValues = malloc(3 * sizeof(float));
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -1949,7 +1949,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndFloatsUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -1965,27 +1965,27 @@
   const float kValues2[] = { 500.f, 503.f, 502.f };
   const float kValues3[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt64FloatDictionary *dict1 =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64FloatDictionary *dict1prime =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64FloatDictionary *dict2 =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64FloatDictionary *dict3 =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues1
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues1
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64FloatDictionary *dict4 =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues3
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues3
                                                forKeys:kKeys1
                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
@@ -2016,7 +2016,7 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt64FloatDictionary *dict =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2037,7 +2037,7 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt64FloatDictionary *dict =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
@@ -2057,13 +2057,13 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setFloat:500.f forKey:31ULL];
+  [dict setValue:500.f forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const float kValues[] = { 501.f, 502.f, 503.f };
   GPBUInt64FloatDictionary *dict2 =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues
                                                forKeys:kKeys
                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
@@ -2071,17 +2071,17 @@
   XCTAssertEqual(dict.count, 4U);
 
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 503.f);
   [dict2 release];
 }
@@ -2090,57 +2090,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt64FloatDictionary *dict =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeFloatForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 503.f);
 
   // Remove again does nothing.
-  [dict removeFloatForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict removeFloatForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertFalse([dict getFloat:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getFloat:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -2148,75 +2148,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const float kValues[] = { 500.f, 501.f, 502.f, 503.f };
   GPBUInt64FloatDictionary *dict =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues
+                                        forKeys:kKeys
+                                          count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   float value;
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:503.f forKey:31ULL];
+  [dict setValue:503.f forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 503.f);
 
-  [dict setFloat:501.f forKey:34ULL];
+  [dict setValue:501.f forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 501.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 501.f);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const float kValues2[] = { 502.f, 500.f };
   GPBUInt64FloatDictionary *dict2 =
-      [[GPBUInt64FloatDictionary alloc] initWithFloats:kValues2
+      [[GPBUInt64FloatDictionary alloc] initWithValues:kValues2
                                                forKeys:kKeys2
                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getFloat:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 503.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 502.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 500.f);
-  XCTAssertTrue([dict getFloat:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getFloat:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 501.f);
 
   [dict2 release];
@@ -2236,8 +2236,8 @@
   GPBUInt64DoubleDictionary *dict = [[GPBUInt64DoubleDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:31ULL]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2245,15 +2245,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64DoubleDictionary *dict = [GPBUInt64DoubleDictionary dictionaryWithDouble:600. forKey:31ULL];
+  GPBUInt64DoubleDictionary *dict = [GPBUInt64DoubleDictionary dictionaryWithValue:600. forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:32ULL]);
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 600.);
     XCTAssertNotEqual(stop, NULL);
@@ -2264,27 +2264,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const double kValues[] = { 600., 601., 602. };
   GPBUInt64DoubleDictionary *dict =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   double *seenValues = malloc(3 * sizeof(double));
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2306,7 +2306,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndDoublesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2322,29 +2322,29 @@
   const double kValues2[] = { 600., 603., 602. };
   const double kValues3[] = { 600., 601., 602., 603. };
   GPBUInt64DoubleDictionary *dict1 =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64DoubleDictionary *dict1prime =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64DoubleDictionary *dict2 =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues2
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64DoubleDictionary *dict3 =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues1
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues1
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64DoubleDictionary *dict4 =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues3
-                                                 forKeys:kKeys1
-                                                   count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues3
+                                                forKeys:kKeys1
+                                                  count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2373,9 +2373,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt64DoubleDictionary *dict =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64DoubleDictionary *dict2 = [dict copy];
@@ -2394,9 +2394,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt64DoubleDictionary *dict =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64DoubleDictionary *dict2 =
@@ -2414,31 +2414,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setDouble:600. forKey:31ULL];
+  [dict setValue:600. forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const double kValues[] = { 601., 602., 603. };
   GPBUInt64DoubleDictionary *dict2 =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues
+                                                forKeys:kKeys
+                                                  count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 603.);
   [dict2 release];
 }
@@ -2447,57 +2447,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt64DoubleDictionary *dict =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeDoubleForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 603.);
 
   // Remove again does nothing.
-  [dict removeDoubleForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict removeDoubleForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertFalse([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertFalse([dict getDouble:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getDouble:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -2505,75 +2505,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const double kValues[] = { 600., 601., 602., 603. };
   GPBUInt64DoubleDictionary *dict =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues
+                                         forKeys:kKeys
+                                           count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   double value;
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:603. forKey:31ULL];
+  [dict setValue:603. forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 603.);
 
-  [dict setDouble:601. forKey:34ULL];
+  [dict setValue:601. forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 601.);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 601.);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const double kValues2[] = { 602., 600. };
   GPBUInt64DoubleDictionary *dict2 =
-      [[GPBUInt64DoubleDictionary alloc] initWithDoubles:kValues2
-                                                 forKeys:kKeys2
-                                                   count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64DoubleDictionary alloc] initWithValues:kValues2
+                                                forKeys:kKeys2
+                                                  count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getDouble:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 603.);
-  XCTAssertTrue([dict getDouble:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 602.);
-  XCTAssertTrue([dict getDouble:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 600.);
-  XCTAssertTrue([dict getDouble:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getDouble:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 601.);
 
   [dict2 release];
@@ -2593,8 +2593,8 @@
   GPBUInt64EnumDictionary *dict = [[GPBUInt64EnumDictionary alloc] init];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:31ULL]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue, stop)
     XCTFail(@"Shouldn't get here!");
   }];
@@ -2602,15 +2602,15 @@
 }
 
 - (void)testOne {
-  GPBUInt64EnumDictionary *dict = [GPBUInt64EnumDictionary dictionaryWithEnum:700 forKey:31ULL];
+  GPBUInt64EnumDictionary *dict = [GPBUInt64EnumDictionary dictionaryWithValue:700 forKey:31ULL];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 1U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertEqual(aKey, 31ULL);
     XCTAssertEqual(aValue, 700);
     XCTAssertNotEqual(stop, NULL);
@@ -2621,27 +2621,27 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL };
   const int32_t kValues[] = { 700, 701, 702 };
   GPBUInt64EnumDictionary *dict =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -2663,7 +2663,7 @@
 
   // Stopping the enumeration.
   idx = 0;
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     #pragma unused(aKey, aValue)
     if (idx == 1) *stop = YES;
     XCTAssertNotEqual(idx, 2U);
@@ -2679,29 +2679,29 @@
   const int32_t kValues2[] = { 700, 703, 702 };
   const int32_t kValues3[] = { 700, 701, 702, 703 };
   GPBUInt64EnumDictionary *dict1 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1);
   GPBUInt64EnumDictionary *dict1prime =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict1prime);
   GPBUInt64EnumDictionary *dict2 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues2
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   GPBUInt64EnumDictionary *dict3 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues1
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues1)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues1
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues1)];
   XCTAssertNotNil(dict3);
   GPBUInt64EnumDictionary *dict4 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues3
-                                             forKeys:kKeys1
-                                               count:GPBARRAYSIZE(kValues3)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues3
+                                              forKeys:kKeys1
+                                                count:GPBARRAYSIZE(kValues3)];
   XCTAssertNotNil(dict4);
 
   // 1/1Prime should be different objects, but equal.
@@ -2730,9 +2730,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt64EnumDictionary *dict =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64EnumDictionary *dict2 = [dict copy];
@@ -2751,9 +2751,9 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt64EnumDictionary *dict =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
 
   GPBUInt64EnumDictionary *dict2 =
@@ -2771,31 +2771,31 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  [dict setEnum:700 forKey:31ULL];
+  [dict setValue:700 forKey:31ULL];
   XCTAssertEqual(dict.count, 1U);
 
   const uint64_t kKeys[] = { 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 701, 702, 703 };
   GPBUInt64EnumDictionary *dict2 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 703);
   [dict2 release];
 }
@@ -2804,57 +2804,57 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt64EnumDictionary *dict =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 703);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict removeEnumForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -2862,75 +2862,75 @@
   const uint64_t kKeys[] = { 31ULL, 32ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 700, 701, 702, 703 };
   GPBUInt64EnumDictionary *dict =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                             forKeys:kKeys
-                                               count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                       forKeys:kKeys
+                                         count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:703 forKey:31ULL];
+  [dict setValue:703 forKey:31ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 703);
 
-  [dict setEnum:701 forKey:34ULL];
+  [dict setValue:701 forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 701);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 701);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
   const int32_t kValues2[] = { 702, 700 };
   GPBUInt64EnumDictionary *dict2 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues2
-                                             forKeys:kKeys2
-                                               count:GPBARRAYSIZE(kValues2)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues2
+                                              forKeys:kKeys2
+                                                count:GPBARRAYSIZE(kValues2)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 703);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 701);
 
   [dict2 release];
@@ -2958,24 +2958,24 @@
   XCTAssertEqual(dict.count, 3U);
   XCTAssertTrue(dict.validationFunc == TestingEnum_IsValidValue);  // Pointer comparison
   int32_t value;
-  XCTAssertTrue([dict getRawValue:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getRawValue:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL rawValue:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getRawValue:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL rawValue:NULL]);
 
   __block NSUInteger idx = 0;
   uint64_t *seenKeys = malloc(3 * sizeof(uint64_t));
   int32_t *seenValues = malloc(3 * sizeof(int32_t));
-  [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
+  [dict enumerateKeysAndValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
     XCTAssertLessThan(idx, 3U);
     seenKeys[idx] = aKey;
     seenValues[idx] = aValue;
@@ -3136,7 +3136,7 @@
   XCTAssertNotNil(dict);
 
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertThrowsSpecificNamed([dict setEnum:801 forKey:32ULL],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:801 forKey:32ULL],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 0U);
   [dict setRawValue:801 forKey:32ULL];  // Unknown
@@ -3145,31 +3145,31 @@
   const uint64_t kKeys[] = { 31ULL, 33ULL, 34ULL };
   const int32_t kValues[] = { 700, 702, 803 };  // Unknown
   GPBUInt64EnumDictionary *dict2 =
-      [[GPBUInt64EnumDictionary alloc] initWithEnums:kValues
-                                               forKeys:kKeys
-                                                 count:GPBARRAYSIZE(kValues)];
+      [[GPBUInt64EnumDictionary alloc] initWithValues:kValues
+                                              forKeys:kKeys
+                                                count:GPBARRAYSIZE(kValues)];
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
 
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, kGPBUnrecognizedEnumeratorValue);
-  XCTAssertTrue([dict getRawValue:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
   [dict2 release];
 }
@@ -3185,51 +3185,51 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
-  [dict removeEnumForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   // Remove again does nothing.
-  [dict removeEnumForKey:32ULL];
+  [dict removeValueForKey:32ULL];
   XCTAssertEqual(dict.count, 3U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  [dict removeEnumForKey:34ULL];
+  [dict removeValueForKey:34ULL];
   XCTAssertEqual(dict.count, 2U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertFalse([dict getEnum:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
 
   [dict removeAll];
   XCTAssertEqual(dict.count, 0U);
-  XCTAssertFalse([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertFalse([dict getEnum:NULL forKey:34ULL]);
+  XCTAssertFalse([dict valueForKey:31ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:32ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:33ULL value:NULL]);
+  XCTAssertFalse([dict valueForKey:34ULL value:NULL]);
   [dict release];
 }
 
@@ -3244,63 +3244,63 @@
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   int32_t value;
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
-  XCTAssertThrowsSpecificNamed([dict setEnum:803 forKey:31ULL],  // Unknown
+  XCTAssertThrowsSpecificNamed([dict setValue:803 forKey:31ULL],  // Unknown
                                NSException, NSInvalidArgumentException);
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getEnum:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL value:&value]);
   XCTAssertEqual(value, 700);
-  XCTAssertTrue([dict getRawValue:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:803 forKey:31ULL];  // Unknown
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
 
   [dict setRawValue:700 forKey:34ULL];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getRawValue:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 700);
 
   const uint64_t kKeys2[] = { 32ULL, 33ULL };
@@ -3313,17 +3313,17 @@
   XCTAssertNotNil(dict2);
   [dict addRawEntriesFromDictionary:dict2];
   XCTAssertEqual(dict.count, 4U);
-  XCTAssertTrue([dict getRawValue:NULL forKey:31ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:31ULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:31ULL rawValue:&value]);
   XCTAssertEqual(value, 803);
-  XCTAssertTrue([dict getEnum:NULL forKey:32ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:32ULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:32ULL value:&value]);
   XCTAssertEqual(value, 702);
-  XCTAssertTrue([dict getRawValue:NULL forKey:33ULL]);
-  XCTAssertTrue([dict getRawValue:&value forKey:33ULL]);
+  XCTAssertTrue([dict valueForKey:33ULL rawValue:NULL]);
+  XCTAssertTrue([dict valueForKey:33ULL rawValue:&value]);
   XCTAssertEqual(value, 801);
-  XCTAssertTrue([dict getEnum:NULL forKey:34ULL]);
-  XCTAssertTrue([dict getEnum:&value forKey:34ULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:NULL]);
+  XCTAssertTrue([dict valueForKey:34ULL value:&value]);
   XCTAssertEqual(value, 700);
 
   [dict2 release];
@@ -3559,8 +3559,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBUInt64ObjectDictionary<NSString*> *dict =
       [[GPBUInt64ObjectDictionary alloc] initWithObjects:kObjects
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kObjects)];
+                                          forKeys:kKeys
+                                            count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
 
@@ -3600,8 +3600,8 @@
   const NSString* kObjects[] = { @"abc", @"def", @"ghi", @"jkl" };
   GPBUInt64ObjectDictionary<NSString*> *dict =
       [[GPBUInt64ObjectDictionary alloc] initWithObjects:kObjects
-                                                 forKeys:kKeys
-                                                   count:GPBARRAYSIZE(kObjects)];
+                                          forKeys:kKeys
+                                            count:GPBARRAYSIZE(kObjects)];
   XCTAssertNotNil(dict);
   XCTAssertEqual(dict.count, 4U);
   XCTAssertEqualObjects([dict objectForKey:31ULL], @"abc");
diff --git a/objectivec/Tests/GPBDictionaryTests.m b/objectivec/Tests/GPBDictionaryTests.m
deleted file mode 100644
index 52b4b32..0000000
--- a/objectivec/Tests/GPBDictionaryTests.m
+++ /dev/null
@@ -1,186 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-#import <Foundation/Foundation.h>
-#import <XCTest/XCTest.h>
-
-#import "GPBDictionary.h"
-#import "GPBDictionary_PackagePrivate.h"
-
-#import "GPBTestUtilities.h"
-
-#pragma mark - GPBAutocreatedDictionary Tests
-
-// These are hand written tests to double check some behaviors of the
-// GPBAutocreatedDictionary.  The GPBDictionary+[type]Tests files are generate
-// tests.
-
-// NOTE: GPBAutocreatedDictionary is private to the library, users of the
-// library should never have to directly deal with this class.
-
-@interface GPBAutocreatedDictionaryTests : XCTestCase
-@end
-
-@implementation GPBAutocreatedDictionaryTests
-
-- (void)testEquality {
-  GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
-
-  XCTAssertTrue([dict isEqual:@{}]);
-  XCTAssertTrue([dict isEqualToDictionary:@{}]);
-
-  XCTAssertFalse([dict isEqual:@{ @"foo" : @"bar" }]);
-  XCTAssertFalse([dict isEqualToDictionary:@{ @"foo" : @"bar" }]);
-
-  [dict setObject:@"bar" forKey:@"foo"];
-
-  XCTAssertFalse([dict isEqual:@{}]);
-  XCTAssertFalse([dict isEqualToDictionary:@{}]);
-  XCTAssertTrue([dict isEqual:@{ @"foo" : @"bar" }]);
-  XCTAssertTrue([dict isEqualToDictionary:@{ @"foo" : @"bar" }]);
-  XCTAssertFalse([dict isEqual:@{ @"bar" : @"baz" }]);
-  XCTAssertFalse([dict isEqualToDictionary:@{ @"bar" : @"baz" }]);
-
-  GPBAutocreatedDictionary *dict2 = [[GPBAutocreatedDictionary alloc] init];
-
-  XCTAssertFalse([dict isEqual:dict2]);
-  XCTAssertFalse([dict isEqualToDictionary:dict2]);
-
-  [dict2 setObject:@"mumble" forKey:@"foo"];
-  XCTAssertFalse([dict isEqual:dict2]);
-  XCTAssertFalse([dict isEqualToDictionary:dict2]);
-
-  [dict2 setObject:@"bar" forKey:@"foo"];
-  XCTAssertTrue([dict isEqual:dict2]);
-  XCTAssertTrue([dict isEqualToDictionary:dict2]);
-
-  [dict2 release];
-  [dict release];
-}
-
-- (void)testCopy {
-  {
-    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
-
-    NSDictionary *cpy = [dict copy];
-    XCTAssertTrue(cpy != dict); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)0);
-
-    NSDictionary *cpy2 = [dict copy];
-    XCTAssertTrue(cpy2 != dict); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)0);
-
-    [cpy2 release];
-    [cpy release];
-    [dict release];
-  }
-
-  {
-    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
-
-    NSMutableDictionary *cpy = [dict mutableCopy];
-    XCTAssertTrue(cpy != dict); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)0);
-
-    NSMutableDictionary *cpy2 = [dict mutableCopy];
-    XCTAssertTrue(cpy2 != dict); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)0);
-
-    [cpy2 release];
-    [cpy release];
-    [dict release];
-  }
-
-  {
-    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
-    dict[@"foo"] = @"bar";
-    dict[@"baz"] = @"mumble";
-
-    NSDictionary *cpy = [dict copy];
-    XCTAssertTrue(cpy != dict); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy[@"foo"], @"bar");
-    XCTAssertEqualObjects(cpy[@"baz"], @"mumble");
-
-    NSDictionary *cpy2 = [dict copy];
-    XCTAssertTrue(cpy2 != dict); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy2[@"foo"], @"bar");
-    XCTAssertEqualObjects(cpy2[@"baz"], @"mumble");
-
-    [cpy2 release];
-    [cpy release];
-    [dict release];
-  }
-
-  {
-    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
-    dict[@"foo"] = @"bar";
-    dict[@"baz"] = @"mumble";
-
-    NSMutableDictionary *cpy = [dict mutableCopy];
-    XCTAssertTrue(cpy != dict); // Ptr compare
-    XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]);
-    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy[@"foo"], @"bar");
-    XCTAssertEqualObjects(cpy[@"baz"], @"mumble");
-
-    NSMutableDictionary *cpy2 = [dict mutableCopy];
-    XCTAssertTrue(cpy2 != dict); // Ptr compare
-    XCTAssertTrue(cpy2 != cpy); // Ptr compare
-    XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]);
-    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
-    XCTAssertEqual(cpy2.count, (NSUInteger)2);
-    XCTAssertEqualObjects(cpy2[@"foo"], @"bar");
-    XCTAssertEqualObjects(cpy2[@"baz"], @"mumble");
-
-    [cpy2 release];
-    [cpy release];
-    [dict release];
-  }
-}
-
-@end
diff --git a/objectivec/Tests/GPBDictionaryTests.pddm b/objectivec/Tests/GPBDictionaryTests.pddm
index d6aa721..0951294 100644
--- a/objectivec/Tests/GPBDictionaryTests.pddm
+++ b/objectivec/Tests/GPBDictionaryTests.pddm
@@ -69,8 +69,8 @@
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict = [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 0U);
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY1)
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
 //%    #pragma unused(aKey, a##VNAME$u, stop)
 //%    XCTFail(@"Shouldn't get here!");
 //%  }];
@@ -78,12 +78,12 @@
 //%}
 //%
 //%- (void)testOne {
-//%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict = [GPB##KEY_NAME##VALUE_NAME##Dictionary dictionaryWith##VALUE_NAME$u##:VAL1 forKey:KEY1];
+//%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict = [GPB##KEY_NAME##VALUE_NAME##Dictionary dictionaryWith##VNAME$u##:VAL1 forKey:KEY1];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 1U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
 //%    XCTAssertEqual##KSUFFIX(aKey, KEY1);
 //%    XCTAssertEqual##VSUFFIX(a##VNAME$u, VAL1);
 //%    XCTAssertNotEqual(stop, NULL);
@@ -94,20 +94,20 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2, KEY3 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2, VAL3 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME$u##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 3U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY4)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY4)
 //%
 //%  __block NSUInteger idx = 0;
 //%  KEY_TYPE KisP##*seenKeys = malloc(3 * sizeof(KEY_TYPE##KisP));
 //%  VALUE_TYPE *seen##VNAME$u##s = malloc(3 * sizeof(VALUE_TYPE));
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
 //%    XCTAssertLessThan(idx, 3U);
 //%    seenKeys[idx] = aKey;
 //%    seen##VNAME$u##s[idx] = a##VNAME$u##;
@@ -129,7 +129,7 @@
 //%
 //%  // Stopping the enumeration.
 //%  idx = 0;
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
 //%    #pragma unused(aKey, a##VNAME$u)
 //%    if (idx == 1) *stop = YES;
 //%    XCTAssertNotEqual(idx, 2U);
@@ -145,29 +145,29 @@
 //%  const VALUE_TYPE k##VNAME$u##s2[] = { VAL1, VAL4, VAL3 };
 //%  const VALUE_TYPE k##VNAME$u##s3[] = { VAL1, VAL2, VAL3, VAL4 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict1 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
 //%  XCTAssertNotNil(dict1);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict1prime =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
 //%  XCTAssertNotNil(dict1prime);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
 //%  XCTAssertNotNil(dict2);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict3 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
 //%  XCTAssertNotNil(dict3);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict4 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s3
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s3)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s3
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s3)];
 //%  XCTAssertNotNil(dict4);
 //%
 //%  // 1/1Prime should be different objects, but equal.
@@ -196,9 +196,9 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2, KEY3, KEY4 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2, VAL3, VAL4 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 = [dict copy];
@@ -217,9 +217,9 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2, KEY3, KEY4 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2, VAL3, VAL4 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
@@ -237,23 +237,23 @@
 //%  XCTAssertNotNil(dict);
 //%
 //%  XCTAssertEqual(dict.count, 0U);
-//%  [dict set##VALUE_NAME##:VAL1 forKey:KEY1];
+//%  [dict set##VNAME$u##:VAL1 forKey:KEY1];
 //%  XCTAssertEqual(dict.count, 1U);
 //%
 //%  const KEY_TYPE KisP##kKeys[] = { KEY2, KEY3, KEY4 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL2, VAL3, VAL4 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict2);
 //%  [dict add##VACCESSOR##EntriesFromDictionary:dict2];
 //%  XCTAssertEqual(dict.count, 4U);
 //%
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL4)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL4)
 //%  [dict2 release];
 //%}
 //%
@@ -261,40 +261,40 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2, KEY3, KEY4 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2, VAL3, VAL4 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 4U);
 //%
-//%  [dict remove##VALUE_NAME##ForKey:KEY2];
+//%  [dict remove##VNAME$u##ForKey:KEY2];
 //%  XCTAssertEqual(dict.count, 3U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL4)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL4)
 //%
 //%  // Remove again does nothing.
-//%  [dict remove##VALUE_NAME##ForKey:KEY2];
+//%  [dict remove##VNAME$u##ForKey:KEY2];
 //%  XCTAssertEqual(dict.count, 3U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL4)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL4)
 //%
-//%  [dict remove##VALUE_NAME##ForKey:KEY4];
+//%  [dict remove##VNAME$u##ForKey:KEY4];
 //%  XCTAssertEqual(dict.count, 2U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY4)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY4)
 //%
 //%  [dict removeAll];
 //%  XCTAssertEqual(dict.count, 0U);
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY3)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY4)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY3)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY4)
 //%  [dict release];
 //%}
 //%
@@ -302,43 +302,43 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2, KEY3, KEY4 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2, VAL3, VAL4 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 4U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL4)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL4)
 //%
-//%  [dict set##VALUE_NAME##:VAL4 forKey:KEY1];
+//%  [dict set##VNAME$u##:VAL4 forKey:KEY1];
 //%  XCTAssertEqual(dict.count, 4U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL4)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL4)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL4)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL4)
 //%
-//%  [dict set##VALUE_NAME##:VAL2 forKey:KEY4];
+//%  [dict set##VNAME$u##:VAL2 forKey:KEY4];
 //%  XCTAssertEqual(dict.count, 4U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL4)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL4)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL2)
 //%
 //%  const KEY_TYPE KisP##kKeys2[] = { KEY2, KEY3 };
 //%  const VALUE_TYPE k##VNAME$u##s2[] = { VAL3, VAL1 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
 //%  XCTAssertNotNil(dict2);
 //%  [dict add##VACCESSOR##EntriesFromDictionary:dict2];
 //%  XCTAssertEqual(dict.count, 4U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL4)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY3, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY4, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL4)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL3)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY3, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY4, VAL2)
 //%
 //%  [dict2 release];
 //%  [dict release];
@@ -369,15 +369,15 @@
 //%  XCTAssertEqual(dict.count, 3U);
 //%  XCTAssertTrue(dict.validationFunc == TestingEnum_IsValidValue);  // Pointer comparison
 //%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_RAW_VALUE##VHELPER(dict, value, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY2, kGPBUnrecognizedEnumeratorValue)
+//%TEST_VALUE##VHELPER(dict, value, KEY2, kGPBUnrecognizedEnumeratorValue)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY2, VAL2)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY3, VAL3)
-//%RAW_VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY4)
+//%RAW_VALUE_NOT_FOUND##VHELPER(dict, KEY4)
 //%
 //%  __block NSUInteger idx = 0;
 //%  KEY_TYPE KisP##*seenKeys = malloc(3 * sizeof(KEY_TYPE##KisP));
 //%  VALUE_TYPE *seenValues = malloc(3 * sizeof(VALUE_TYPE));
-//%  [dict enumerateKeysAndEnumsUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE aValue, BOOL *stop) {
+//%  [dict enumerateKeysAndValuesUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE aValue, BOOL *stop) {
 //%    XCTAssertLessThan(idx, 3U);
 //%    seenKeys[idx] = aKey;
 //%    seenValues[idx] = aValue;
@@ -538,7 +538,7 @@
 //%  XCTAssertNotNil(dict);
 //%
 //%  XCTAssertEqual(dict.count, 0U);
-//%  XCTAssertThrowsSpecificNamed([dict setEnum:VAL2 forKey:KEY2],  // Unknown
+//%  XCTAssertThrowsSpecificNamed([dict setValue:VAL2 forKey:KEY2],  // Unknown
 //%                               NSException, NSInvalidArgumentException);
 //%  XCTAssertEqual(dict.count, 0U);
 //%  [dict setRawValue:VAL2 forKey:KEY2];  // Unknown
@@ -547,18 +547,18 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY3, KEY4 };
 //%  const VALUE_TYPE kValues[] = { VAL1, VAL3, VAL4 };  // Unknown
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWithEnums:kValues
-//%           KEY_NAME$S VALUE_NAME$S                         forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                           count:GPBARRAYSIZE(kValues)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWithValues:kValues
+//%           KEY_NAME$S VALUE_NAME$S                        forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                          count:GPBARRAYSIZE(kValues)];
 //%  XCTAssertNotNil(dict2);
 //%  [dict addRawEntriesFromDictionary:dict2];
 //%  XCTAssertEqual(dict.count, 4U);
 //%
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY2, kGPBUnrecognizedEnumeratorValue)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_VALUE##VHELPER(dict, value, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, value, KEY2, kGPBUnrecognizedEnumeratorValue)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY4, kGPBUnrecognizedEnumeratorValue)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY4, kGPBUnrecognizedEnumeratorValue)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY4, VAL4)
 //%  [dict2 release];
 //%}
@@ -574,34 +574,34 @@
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 4U);
 //%
-//%  [dict removeEnumForKey:KEY2];
+//%  [dict removeValueForKey:KEY2];
 //%  XCTAssertEqual(dict.count, 3U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_VALUE##VHELPER(dict, value, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY4, VAL4)
 //%
 //%  // Remove again does nothing.
-//%  [dict removeEnumForKey:KEY2];
+//%  [dict removeValueForKey:KEY2];
 //%  XCTAssertEqual(dict.count, 3U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY4, VAL4)
 //%
-//%  [dict removeEnumForKey:KEY4];
+//%  [dict removeValueForKey:KEY4];
 //%  XCTAssertEqual(dict.count, 2U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY4)
+//%TEST_VALUE##VHELPER(dict, value, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY4)
 //%
 //%  [dict removeAll];
 //%  XCTAssertEqual(dict.count, 0U);
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY3)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY4)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY3)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY4)
 //%  [dict release];
 //%}
 //%
@@ -615,32 +615,32 @@
 //%           KEY_NAME$S VALUE_NAME$S                                      count:GPBARRAYSIZE(kValues)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 4U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY1, VAL1)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, value)TEST_VALUE##VHELPER(dict, value, KEY1, VAL1)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY4, VAL4)
 //%
-//%  XCTAssertThrowsSpecificNamed([dict setEnum:VAL4 forKey:KEY1],  // Unknown
+//%  XCTAssertThrowsSpecificNamed([dict setValue:VAL4 forKey:KEY1],  // Unknown
 //%                               NSException, NSInvalidArgumentException);
 //%  XCTAssertEqual(dict.count, 4U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, value, KEY1, VAL1)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY4, VAL4)
 //%
 //%  [dict setRawValue:VAL4 forKey:KEY1];  // Unknown
 //%  XCTAssertEqual(dict.count, 4U);
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY1, VAL4)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY4, VAL4)
 //%
 //%  [dict setRawValue:VAL1 forKey:KEY4];
 //%  XCTAssertEqual(dict.count, 4U);
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY1, VAL4)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY2, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY3, VAL3)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY4, VAL1)
+//%TEST_VALUE##VHELPER(dict, value, KEY3, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY4, VAL1)
 //%
 //%  const KEY_TYPE KisP##kKeys2[] = { KEY2, KEY3 };
 //%  const VALUE_TYPE kValues2[] = { VAL3, VAL2 };  // Unknown
@@ -653,9 +653,9 @@
 //%  [dict addRawEntriesFromDictionary:dict2];
 //%  XCTAssertEqual(dict.count, 4U);
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY1, VAL4)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY2, VAL3)
+//%TEST_VALUE##VHELPER(dict, value, KEY2, VAL3)
 //%TEST_RAW_VALUE##VHELPER(dict, value, KEY3, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, value, KEY4, VAL1)
+//%TEST_VALUE##VHELPER(dict, value, KEY4, VAL1)
 //%
 //%  [dict2 release];
 //%  [dict release];
@@ -694,19 +694,19 @@
 //%PDDM-DEFINE DECLARE_VALUE_STORAGEPOD(VALUE_TYPE, NAME)
 //%  VALUE_TYPE NAME;
 //%
-//%PDDM-DEFINE VALUE_NOT_FOUNDPOD(VALUE_NAME, DICT, KEY)
-//%  XCTAssertFalse([DICT get##VALUE_NAME##:NULL forKey:KEY]);
-//%PDDM-DEFINE TEST_VALUEPOD(VALUE_NAME, DICT, STORAGE, KEY, VALUE)
-//%  XCTAssertTrue([DICT get##VALUE_NAME##:NULL forKey:KEY]);
-//%  XCTAssertTrue([DICT get##VALUE_NAME##:&STORAGE forKey:KEY]);
+//%PDDM-DEFINE VALUE_NOT_FOUNDPOD(DICT, KEY)
+//%  XCTAssertFalse([DICT valueForKey:KEY value:NULL]);
+//%PDDM-DEFINE TEST_VALUEPOD(DICT, STORAGE, KEY, VALUE)
+//%  XCTAssertTrue([DICT valueForKey:KEY value:NULL]);
+//%  XCTAssertTrue([DICT valueForKey:KEY value:&STORAGE]);
 //%  XCTAssertEqual(STORAGE, VALUE);
 //%PDDM-DEFINE COMPARE_KEYS(KEY1, KEY2)
 //%KEY1 == KEY2
-//%PDDM-DEFINE RAW_VALUE_NOT_FOUNDPOD(VALUE_NAME, DICT, KEY)
-//%  XCTAssertFalse([DICT getRawValue:NULL forKey:KEY]);
+//%PDDM-DEFINE RAW_VALUE_NOT_FOUNDPOD(DICT, KEY)
+//%  XCTAssertFalse([DICT valueForKey:KEY rawValue:NULL]);
 //%PDDM-DEFINE TEST_RAW_VALUEPOD(DICT, STORAGE, KEY, VALUE)
-//%  XCTAssertTrue([DICT getRawValue:NULL forKey:KEY]);
-//%  XCTAssertTrue([DICT getRawValue:&STORAGE forKey:KEY]);
+//%  XCTAssertTrue([DICT valueForKey:KEY rawValue:NULL]);
+//%  XCTAssertTrue([DICT valueForKey:KEY rawValue:&STORAGE]);
 //%  XCTAssertEqual(STORAGE, VALUE);
 
 //
@@ -715,9 +715,9 @@
 
 //%PDDM-DEFINE DECLARE_VALUE_STORAGEOBJECT(VALUE_TYPE, NAME)
 // Empty
-//%PDDM-DEFINE VALUE_NOT_FOUNDOBJECT(VALUE_NAME, DICT, KEY)
+//%PDDM-DEFINE VALUE_NOT_FOUNDOBJECT(DICT, KEY)
 //%  XCTAssertNil([DICT objectForKey:KEY]);
-//%PDDM-DEFINE TEST_VALUEOBJECT(VALUE_NAME, DICT, STORAGE, KEY, VALUE)
+//%PDDM-DEFINE TEST_VALUEOBJECT(DICT, STORAGE, KEY, VALUE)
 //%  XCTAssertEqualObjects([DICT objectForKey:KEY], VALUE);
 //%PDDM-DEFINE COMPARE_KEYSObjects(KEY1, KEY2)
 //%[KEY1 isEqual:KEY2]
@@ -729,10 +729,10 @@
 //%PDDM-DEFINE TEST_HELPERS(KEY_NAME, KEY_TYPE, KisP)
 //%// To let the testing macros work, add some extra methods to simplify things.
 //%@interface GPB##KEY_NAME##EnumDictionary (TestingTweak)
-//%+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(KEY_TYPE##KisP$S##KisP)key;
-//%- (instancetype)initWithEnums:(const int32_t [])values
-//%                      forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
-//%                        count:(NSUInteger)count;
+//%+ (instancetype)dictionaryWithValue:(int32_t)value forKey:(KEY_TYPE##KisP$S##KisP)key;
+//%- (instancetype)initWithValues:(const int32_t [])values
+//%                       forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
+//%                         count:(NSUInteger)count;
 //%@end
 //%
 //%static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -748,7 +748,7 @@
 //%}
 //%
 //%@implementation GPB##KEY_NAME##EnumDictionary (TestingTweak)
-//%+ (instancetype)dictionaryWithEnum:(int32_t)value forKey:(KEY_TYPE##KisP$S##KisP)key {
+//%+ (instancetype)dictionaryWithValue:(int32_t)value forKey:(KEY_TYPE##KisP$S##KisP)key {
 //%  // Cast is needed to compiler knows what class we are invoking initWithValues: on to get the
 //%  // type correct.
 //%  return [[(GPB##KEY_NAME##EnumDictionary*)[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
@@ -756,9 +756,9 @@
 //%                KEY_NAME$S                                               forKeys:&key
 //%                KEY_NAME$S                                                 count:1] autorelease];
 //%}
-//%- (instancetype)initWithEnums:(const int32_t [])values
-//%                      forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
-//%                        count:(NSUInteger)count {
+//%- (instancetype)initWithValues:(const int32_t [])values
+//%                       forKeys:(const KEY_TYPE##KisP$S##KisP [])keys
+//%                         count:(NSUInteger)count {
 //%  return [self initWithValidationFunction:TestingEnum_IsValidValue
 //%                                rawValues:values
 //%                                  forKeys:keys
@@ -792,8 +792,8 @@
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict = [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] init];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 0U);
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//%  [dict enumerateKeysAnd##VALUE_NAME##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY1)
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
 //%    #pragma unused(aKey, a##VNAME$u##, stop)
 //%    XCTFail(@"Shouldn't get here!");
 //%  }];
@@ -801,12 +801,12 @@
 //%}
 //%
 //%- (void)testOne {
-//%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict = [GPB##KEY_NAME##VALUE_NAME##Dictionary dictionaryWith##VALUE_NAME$u##:VAL1 forKey:KEY1];
+//%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict = [GPB##KEY_NAME##VALUE_NAME##Dictionary dictionaryWith##VNAME$u##:VAL1 forKey:KEY1];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 1U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
 //%    XCTAssertEqual##KSUFFIX(aKey, KEY1);
 //%    XCTAssertEqual##VSUFFIX(a##VNAME$u, VAL1);
 //%    XCTAssertNotEqual(stop, NULL);
@@ -817,18 +817,18 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 2U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
 //%
 //%  __block NSUInteger idx = 0;
 //%  KEY_TYPE KisP##*seenKeys = malloc(2 * sizeof(KEY_TYPE##KisP));
 //%  VALUE_TYPE *seen##VNAME$u##s = malloc(2 * sizeof(VALUE_TYPE));
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
 //%    XCTAssertLessThan(idx, 2U);
 //%    seenKeys[idx] = aKey;
 //%    seen##VNAME$u##s[idx] = a##VNAME$u;
@@ -850,7 +850,7 @@
 //%
 //%  // Stopping the enumeration.
 //%  idx = 0;
-//%  [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
+//%  [dict enumerateKeysAnd##VNAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
 //%    #pragma unused(aKey, a##VNAME$u)
 //%    if (idx == 0) *stop = YES;
 //%    XCTAssertNotEqual(idx, 2U);
@@ -866,29 +866,29 @@
 //%  const VALUE_TYPE k##VNAME$u##s2[] = { VAL2, VAL1 };
 //%  const VALUE_TYPE k##VNAME$u##s3[] = { VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict1 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
 //%  XCTAssertNotNil(dict1);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict1prime =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
 //%  XCTAssertNotNil(dict1prime);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
 //%  XCTAssertNotNil(dict2);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict3 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s1)];
 //%  XCTAssertNotNil(dict3);
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict4 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s3
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys1
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s3)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s3
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys1
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s3)];
 //%  XCTAssertNotNil(dict4);
 //%
 //%  // 1/1Prime should be different objects, but equal.
@@ -917,9 +917,9 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 = [dict copy];
@@ -938,9 +938,9 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
@@ -958,21 +958,21 @@
 //%  XCTAssertNotNil(dict);
 //%
 //%  XCTAssertEqual(dict.count, 0U);
-//%  [dict set##VALUE_NAME:VAL1 forKey:KEY1];
+//%  [dict set##VNAME$u:VAL1 forKey:KEY1];
 //%  XCTAssertEqual(dict.count, 1U);
 //%
 //%  const KEY_TYPE KisP##kKeys[] = { KEY2 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict2);
 //%  [dict addEntriesFromDictionary:dict2];
 //%  XCTAssertEqual(dict.count, 2U);
 //%
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
 //%  [dict2 release];
 //%}
 //%
@@ -980,27 +980,27 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2};
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S          ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S          ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 2U);
 //%
-//%  [dict remove##VALUE_NAME##ForKey:KEY2];
+//%  [dict remove##VNAME$u##ForKey:KEY2];
 //%  XCTAssertEqual(dict.count, 1U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
 //%
 //%  // Remove again does nothing.
-//%  [dict remove##VALUE_NAME##ForKey:KEY2];
+//%  [dict remove##VNAME$u##ForKey:KEY2];
 //%  XCTAssertEqual(dict.count, 1U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
 //%
 //%  [dict removeAll];
 //%  XCTAssertEqual(dict.count, 0U);
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY2)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY1)
+//%VALUE_NOT_FOUND##VHELPER(dict, KEY2)
 //%  [dict release];
 //%}
 //%
@@ -1008,35 +1008,35 @@
 //%  const KEY_TYPE KisP##kKeys[] = { KEY1, KEY2 };
 //%  const VALUE_TYPE k##VNAME$u##s[] = { VAL1, VAL2 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##  forKeys:kKeys
+//%           KEY_NAME$S VALUE_NAME$S          ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s)];
 //%  XCTAssertNotNil(dict);
 //%  XCTAssertEqual(dict.count, 2U);
-//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
+//%DECLARE_VALUE_STORAGE##VHELPER(VALUE_TYPE, VNAME)TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
 //%
-//%  [dict set##VALUE_NAME##:VAL2 forKey:KEY1];
+//%  [dict set##VNAME$u##:VAL2 forKey:KEY1];
 //%  XCTAssertEqual(dict.count, 2U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
 //%
-//%  [dict set##VALUE_NAME##:VAL1 forKey:KEY2];
+//%  [dict set##VNAME$u##:VAL1 forKey:KEY2];
 //%  XCTAssertEqual(dict.count, 2U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL2)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL1)
 //%
 //%  const KEY_TYPE KisP##kKeys2[] = { KEY2, KEY1 };
 //%  const VALUE_TYPE k##VNAME$u##s2[] = { VAL2, VAL1 };
 //%  DICTIONARY_CLASS_DECL##VHELPER(KEY_NAME, VALUE_NAME, VALUE_TYPE) *dict2 =
-//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VALUE_NAME##s:k##VNAME$u##s2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##  forKeys:kKeys2
-//%           KEY_NAME$S VALUE_NAME$S                 ##VALUE_NAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
+//%      [[GPB##KEY_NAME##VALUE_NAME##Dictionary alloc] initWith##VNAME$u##s:k##VNAME$u##s2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##  forKeys:kKeys2
+//%           KEY_NAME$S VALUE_NAME$S                 ##VNAME$S##    count:GPBARRAYSIZE(k##VNAME$u##s2)];
 //%  XCTAssertNotNil(dict2);
 //%  [dict addEntriesFromDictionary:dict2];
 //%  XCTAssertEqual(dict.count, 2U);
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY1, VAL1)
-//%TEST_VALUE##VHELPER(VALUE_NAME, dict, VNAME, KEY2, VAL2)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY1, VAL1)
+//%TEST_VALUE##VHELPER(dict, VNAME, KEY2, VAL2)
 //%
 //%  [dict2 release];
 //%  [dict release];
diff --git a/objectivec/Tests/GPBExtensionRegistryTest.m b/objectivec/Tests/GPBExtensionRegistryTest.m
deleted file mode 100644
index b116882..0000000
--- a/objectivec/Tests/GPBExtensionRegistryTest.m
+++ /dev/null
@@ -1,138 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-#import "GPBTestUtilities.h"
-
-#import "GPBExtensionRegistry.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-
-@interface GPBExtensionRegistryTest : GPBTestCase
-@end
-
-@implementation GPBExtensionRegistryTest
-
-- (void)testBasics {
-  GPBExtensionRegistry *reg = [[[GPBExtensionRegistry alloc] init] autorelease];
-  XCTAssertNotNil(reg);
-
-  XCTAssertNil([reg extensionForDescriptor:[TestAllExtensions descriptor]
-                               fieldNumber:1]);
-  XCTAssertNil([reg extensionForDescriptor:[TestAllTypes descriptor]
-                               fieldNumber:1]);
-
-  [reg addExtension:[UnittestRoot optionalInt32Extension]];
-  [reg addExtension:[UnittestRoot packedInt64Extension]];
-
-  XCTAssertTrue([reg extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
-                [UnittestRoot optionalInt32Extension]); // ptr equality
-  XCTAssertNil([reg extensionForDescriptor:[TestAllTypes descriptor]
-                               fieldNumber:1]);
-  XCTAssertTrue([reg extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91] ==
-                [UnittestRoot packedInt64Extension]); // ptr equality
-}
-
-- (void)testCopy {
-  GPBExtensionRegistry *reg1 = [[[GPBExtensionRegistry alloc] init] autorelease];
-  [reg1 addExtension:[UnittestRoot optionalInt32Extension]];
-
-  GPBExtensionRegistry *reg2 = [[reg1 copy] autorelease];
-  XCTAssertNotNil(reg2);
-
-  XCTAssertTrue([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
-                [UnittestRoot optionalInt32Extension]); // ptr equality
-  XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
-                [UnittestRoot optionalInt32Extension]); // ptr equality
-
-  // Message class that had registered extension(s) at the -copy time.
-
-  [reg1 addExtension:[UnittestRoot optionalBoolExtension]];
-  [reg2 addExtension:[UnittestRoot optionalStringExtension]];
-
-  XCTAssertTrue([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13] ==
-                [UnittestRoot optionalBoolExtension]); // ptr equality
-  XCTAssertNil([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14]);
-  XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13]);
-  XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14] ==
-                [UnittestRoot optionalStringExtension]); // ptr equality
-
-  // Message class that did not have any registered extensions at the -copy time.
-
-  [reg1 addExtension:[UnittestRoot packedInt64Extension]];
-  [reg2 addExtension:[UnittestRoot packedSint32Extension]];
-
-  XCTAssertTrue([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91] ==
-                [UnittestRoot packedInt64Extension]); // ptr equality
-  XCTAssertNil([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94]);
-  XCTAssertNil([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91]);
-  XCTAssertTrue([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94] ==
-                [UnittestRoot packedSint32Extension]); // ptr equality
-
-}
-
-- (void)testAddExtensions {
-  GPBExtensionRegistry *reg1 = [[[GPBExtensionRegistry alloc] init] autorelease];
-  [reg1 addExtension:[UnittestRoot optionalInt32Extension]];
-
-  GPBExtensionRegistry *reg2 = [[[GPBExtensionRegistry alloc] init] autorelease];
-
-  XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor]
-                                fieldNumber:1]);
-
-  [reg2 addExtensions:reg1];
-
-  XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
-                [UnittestRoot optionalInt32Extension]); // ptr equality
-
-  // Confirm adding to the first doesn't add to the second.
-
-  [reg1 addExtension:[UnittestRoot optionalBoolExtension]];
-  [reg1 addExtension:[UnittestRoot packedInt64Extension]];
-
-  XCTAssertTrue([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13] ==
-                [UnittestRoot optionalBoolExtension]); // ptr equality
-  XCTAssertTrue([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91] ==
-                [UnittestRoot packedInt64Extension]); // ptr equality
-  XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13]);
-  XCTAssertNil([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91]);
-
-  // Confirm adding to the second doesn't add to the first.
-
-  [reg2 addExtension:[UnittestRoot optionalStringExtension]];
-  [reg2 addExtension:[UnittestRoot packedSint32Extension]];
-
-  XCTAssertNil([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14]);
-  XCTAssertNil([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94]);
-  XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14] ==
-                [UnittestRoot optionalStringExtension]); // ptr equality
-  XCTAssertTrue([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94] ==
-                [UnittestRoot packedSint32Extension]); // ptr equality
-}
-
-@end
diff --git a/objectivec/Tests/GPBMessageTests+Runtime.m b/objectivec/Tests/GPBMessageTests+Runtime.m
index 0058311..5e19771 100644
--- a/objectivec/Tests/GPBMessageTests+Runtime.m
+++ b/objectivec/Tests/GPBMessageTests+Runtime.m
@@ -36,7 +36,6 @@
 
 #import "google/protobuf/MapUnittest.pbobjc.h"
 #import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestCycle.pbobjc.h"
 #import "google/protobuf/UnittestObjcStartup.pbobjc.h"
 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
@@ -50,24 +49,11 @@
 // specific.
 
 - (void)testStartupOrdering {
-  // Message class/Root class initialization is a little tricky, so these just
-  // create some possible patterns that can be a problem. The messages don't
-  // have to be exercised, just creating them is enough to test.  If there
-  // is a problem, the runtime should assert or hang.
-  //
-  // Note: the messages from these proto files should not be used in any other
-  // tests, that way when they are referenced here it will be the first use and
-  // initialization will take place now.
-
+  // Just have to create a message.  Nothing else uses the classes from
+  // this file, so the first selector invoked on the class will initialize
+  // it, which also initializes the root.
   TestObjCStartupMessage *message = [TestObjCStartupMessage message];
   XCTAssertNotNil(message);
-
-  CycleBaz *baz = [CycleBaz message];
-  CycleBar *bar = [CycleBar message];
-  CycleFoo *foo = [CycleFoo message];
-  XCTAssertNotNil(baz);
-  XCTAssertNotNil(bar);
-  XCTAssertNotNil(foo);
 }
 
 - (void)testProto2HasMethodSupport {
@@ -340,17 +326,6 @@
 //%    [msg release];
 //%  }
 //%
-//%PDDM-DEFINE PROTO2_TEST_CLEAR_FIELD_WITH_NIL(FIELD, VALUE)
-//%  {  // optional##FIELD
-//%    Message2 *msg = [[Message2 alloc] init];
-//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
-//%    msg.optional##FIELD = VALUE;
-//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
-//%    msg.optional##FIELD = nil;
-//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional##FIELD));
-//%    [msg release];
-//%  }
-//%
 //%PDDM-DEFINE PROTO2_TEST_HAS_FIELDS()
 //%PROTO2_TEST_HAS_FIELD(Int32, 1, 0)
 //%PROTO2_TEST_HAS_FIELD(Int64, 1, 0)
@@ -372,14 +347,6 @@
 //%  //
 //%
 //%PROTO2_TEST_HAS_FIELD(Enum, Message2_Enum_Bar, Message2_Enum_Foo)
-//%  //
-//%  // Nil can also be used to clear strings, bytes, groups, and messages.
-//%  //
-//%
-//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(String, @"foo")
-//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding])
-//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Group, [Message2_OptionalGroup message])
-//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message2 message])
 //%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS()
 // This block of code is generated, do not edit it directly.
 
@@ -691,57 +658,13 @@
     [msg release];
   }
 
-  //
-  // Nil can also be used to clear strings, bytes, groups, and messages.
-  //
-
-  {  // optionalString
-    Message2 *msg = [[Message2 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
-    msg.optionalString = @"foo";
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
-    msg.optionalString = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalString));
-    [msg release];
-  }
-
-  {  // optionalBytes
-    Message2 *msg = [[Message2 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
-    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
-    msg.optionalBytes = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalBytes));
-    [msg release];
-  }
-
-  {  // optionalGroup
-    Message2 *msg = [[Message2 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalGroup));
-    msg.optionalGroup = [Message2_OptionalGroup message];
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalGroup));
-    msg.optionalGroup = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalGroup));
-    [msg release];
-  }
-
-  {  // optionalMessage
-    Message2 *msg = [[Message2 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalMessage));
-    msg.optionalMessage = [Message2 message];
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalMessage));
-    msg.optionalMessage = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_OptionalMessage));
-    [msg release];
-  }
-
 //%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS()
 }
 
 - (void)testProto3SingleFieldHasBehavior {
   //
-  // Setting to any value but the default value (0) should result has*
-  // being true.  When set to the default, shouldn't be true.
+  // Setting to any value including the default value (0) should result has*
+  // being true.
   //
 
 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
@@ -755,17 +678,6 @@
 //%    [msg release];
 //%  }
 //%
-//%PDDM-DEFINE PROTO3_TEST_CLEAR_FIELD_WITH_NIL(FIELD, VALUE)
-//%  {  // optional##FIELD
-//%    Message3 *msg = [[Message3 alloc] init];
-//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
-//%    msg.optional##FIELD = VALUE;
-//%    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
-//%    msg.optional##FIELD = nil;
-//%    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional##FIELD));
-//%    [msg release];
-//%  }
-//%
 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELDS()
 //%PROTO3_TEST_HAS_FIELD(Int32, 1, 0)
 //%PROTO3_TEST_HAS_FIELD(Int64, 1, 0)
@@ -783,17 +695,10 @@
 //%PROTO3_TEST_HAS_FIELD(String, @"foo", @"")
 //%PROTO3_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data])
 //%  //
-//%  // Test doesn't apply to optionalMessage (no groups in proto3).
+//%  // Test doesn't apply to optionalGroup/optionalMessage.
 //%  //
 //%
 //%PROTO3_TEST_HAS_FIELD(Enum, Message3_Enum_Bar, Message3_Enum_Foo)
-//%  //
-//%  // Nil can also be used to clear strings, bytes, and messages (no groups in proto3).
-//%  //
-//%
-//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(String, @"foo")
-//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding])
-//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message3 message])
 //%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS()
 // This block of code is generated, do not edit it directly.
 
@@ -948,7 +853,7 @@
   }
 
   //
-  // Test doesn't apply to optionalMessage (no groups in proto3).
+  // Test doesn't apply to optionalGroup/optionalMessage.
   //
 
   {  // optionalEnum
@@ -961,40 +866,6 @@
     [msg release];
   }
 
-  //
-  // Nil can also be used to clear strings, bytes, and messages (no groups in proto3).
-  //
-
-  {  // optionalString
-    Message3 *msg = [[Message3 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
-    msg.optionalString = @"foo";
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
-    msg.optionalString = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalString));
-    [msg release];
-  }
-
-  {  // optionalBytes
-    Message3 *msg = [[Message3 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
-    msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
-    msg.optionalBytes = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalBytes));
-    [msg release];
-  }
-
-  {  // optionalMessage
-    Message3 *msg = [[Message3 alloc] init];
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalMessage));
-    msg.optionalMessage = [Message3 message];
-    XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalMessage));
-    msg.optionalMessage = nil;
-    XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_OptionalMessage));
-    [msg release];
-  }
-
 //%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS()
 }
 
@@ -2101,262 +1972,6 @@
   [msg release];
 }
 
-- (void)testProto2OneofSetToDefault {
-
-  // proto3 doesn't normally write out zero (default) fields, but if they are
-  // in a oneof it does.  proto2 doesn't have this special behavior, but we
-  // still confirm setting to the explicit default does set the case to be
-  // sure the runtime is working correctly.
-
-  NSString *oneofStringDefault = @"string";
-  NSData *oneofBytesDefault = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
-
-  Message2 *msg = [[Message2 alloc] init];
-
-  uint32_t values[] = {
-    Message2_O_OneOfCase_OneofInt32,
-    Message2_O_OneOfCase_OneofInt64,
-    Message2_O_OneOfCase_OneofUint32,
-    Message2_O_OneOfCase_OneofUint64,
-    Message2_O_OneOfCase_OneofSint32,
-    Message2_O_OneOfCase_OneofSint64,
-    Message2_O_OneOfCase_OneofFixed32,
-    Message2_O_OneOfCase_OneofFixed64,
-    Message2_O_OneOfCase_OneofSfixed32,
-    Message2_O_OneOfCase_OneofSfixed64,
-    Message2_O_OneOfCase_OneofFloat,
-    Message2_O_OneOfCase_OneofDouble,
-    Message2_O_OneOfCase_OneofBool,
-    Message2_O_OneOfCase_OneofString,
-    Message2_O_OneOfCase_OneofBytes,
-    // Skip group
-    // Skip message
-    Message2_O_OneOfCase_OneofEnum,
-  };
-
-  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
-    switch (values[i]) {
-      case Message2_O_OneOfCase_OneofInt32:
-        msg.oneofInt32 = 100;
-        break;
-      case Message2_O_OneOfCase_OneofInt64:
-        msg.oneofInt64 = 101;
-        break;
-      case Message2_O_OneOfCase_OneofUint32:
-        msg.oneofUint32 = 102;
-        break;
-      case Message2_O_OneOfCase_OneofUint64:
-        msg.oneofUint64 = 103;
-        break;
-      case Message2_O_OneOfCase_OneofSint32:
-        msg.oneofSint32 = 104;
-        break;
-      case Message2_O_OneOfCase_OneofSint64:
-        msg.oneofSint64 = 105;
-        break;
-      case Message2_O_OneOfCase_OneofFixed32:
-        msg.oneofFixed32 = 106;
-        break;
-      case Message2_O_OneOfCase_OneofFixed64:
-        msg.oneofFixed64 = 107;
-        break;
-      case Message2_O_OneOfCase_OneofSfixed32:
-        msg.oneofSfixed32 = 108;
-        break;
-      case Message2_O_OneOfCase_OneofSfixed64:
-        msg.oneofSfixed64 = 109;
-        break;
-      case Message2_O_OneOfCase_OneofFloat:
-        msg.oneofFloat = 110.0f;
-        break;
-      case Message2_O_OneOfCase_OneofDouble:
-        msg.oneofDouble = 111.0;
-        break;
-      case Message2_O_OneOfCase_OneofBool:
-        msg.oneofBool = YES;
-        break;
-      case Message2_O_OneOfCase_OneofString:
-        msg.oneofString = oneofStringDefault;
-        break;
-      case Message2_O_OneOfCase_OneofBytes:
-        msg.oneofBytes = oneofBytesDefault;
-        break;
-      case Message2_O_OneOfCase_OneofEnum:
-        msg.oneofEnum = Message3_Enum_Baz;
-        break;
-      default:
-        XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
-        break;
-    }
-
-    // Should be set to the correct case.
-    XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
-
-    // Confirm everything is the defaults.
-    XCTAssertEqual(msg.oneofInt32, 100, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofInt64, 101, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofUint32, 102U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofUint64, 103U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSint32, 104, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSint64, 105, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofFixed32, 106U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofFixed64, 107U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSfixed32, 108, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSfixed64, 109, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofFloat, 110.0f, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofDouble, 111.0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofBool, YES, "Loop: %zd", i);
-    XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
-    XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
-    // Skip group, no default to consider.
-    // Skip message, no default to consider.
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz, "Loop: %zd", i);
-  }
-
-  // We special case nil on string, data, group, and message, ensure they work
-  // as expected. i.e. - it clears the case.
-  msg.oneofString = nil;
-  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
-  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
-  msg.oneofBytes = nil;
-  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
-  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
-  msg.oneofGroup = nil;
-  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
-  XCTAssertNotNil(msg.oneofGroup);
-  msg.oneofMessage = nil;
-  XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
-  XCTAssertNotNil(msg.oneofMessage);
-
-  [msg release];
-}
-
-- (void)testProto3OneofSetToZero {
-
-  // Normally setting a proto3 field to the zero value should result in it being
-  // reset/cleared.  But in a oneof, it still gets recored so it can go out
-  // over the wire and the other side can see what was set in the oneof.
-
-  NSString *oneofStringDefault = @"";
-  NSData *oneofBytesDefault = [NSData data];
-
-  Message3 *msg = [[Message3 alloc] init];
-
-  uint32_t values[] = {
-    Message3_O_OneOfCase_OneofInt32,
-    Message3_O_OneOfCase_OneofInt64,
-    Message3_O_OneOfCase_OneofUint32,
-    Message3_O_OneOfCase_OneofUint64,
-    Message3_O_OneOfCase_OneofSint32,
-    Message3_O_OneOfCase_OneofSint64,
-    Message3_O_OneOfCase_OneofFixed32,
-    Message3_O_OneOfCase_OneofFixed64,
-    Message3_O_OneOfCase_OneofSfixed32,
-    Message3_O_OneOfCase_OneofSfixed64,
-    Message3_O_OneOfCase_OneofFloat,
-    Message3_O_OneOfCase_OneofDouble,
-    Message3_O_OneOfCase_OneofBool,
-    Message3_O_OneOfCase_OneofString,
-    Message3_O_OneOfCase_OneofBytes,
-    Message3_O_OneOfCase_OneofMessage,
-    Message3_O_OneOfCase_OneofEnum,
-  };
-
-  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
-    switch (values[i]) {
-      case Message3_O_OneOfCase_OneofInt32:
-        msg.oneofInt32 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofInt64:
-        msg.oneofInt64 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofUint32:
-        msg.oneofUint32 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofUint64:
-        msg.oneofUint64 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofSint32:
-        msg.oneofSint32 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofSint64:
-        msg.oneofSint64 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofFixed32:
-        msg.oneofFixed32 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofFixed64:
-        msg.oneofFixed64 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofSfixed32:
-        msg.oneofSfixed32 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofSfixed64:
-        msg.oneofSfixed64 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofFloat:
-        msg.oneofFloat = 0.0f;
-        break;
-      case Message3_O_OneOfCase_OneofDouble:
-        msg.oneofDouble = 0.0;
-        break;
-      case Message3_O_OneOfCase_OneofBool:
-        msg.oneofBool = NO;
-        break;
-      case Message3_O_OneOfCase_OneofString:
-        msg.oneofString = oneofStringDefault;
-        break;
-      case Message3_O_OneOfCase_OneofBytes:
-        msg.oneofBytes = oneofBytesDefault;
-        break;
-      case Message3_O_OneOfCase_OneofMessage:
-        msg.oneofMessage.optionalInt32 = 0;
-        break;
-      case Message3_O_OneOfCase_OneofEnum:
-        msg.oneofEnum = Message3_Enum_Foo;
-        break;
-      default:
-        XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
-        break;
-    }
-
-    // Should be set to the correct case.
-    XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
-
-    // Confirm everything is still zeros.
-    XCTAssertEqual(msg.oneofInt32, 0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofInt64, 0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofUint32, 0U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofUint64, 0U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSint32, 0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSint64, 0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofFixed32, 0U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofFixed64, 0U, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSfixed32, 0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofSfixed64, 0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofFloat, 0.0f, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofDouble, 0.0, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofBool, NO, "Loop: %zd", i);
-    XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
-    XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
-    XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i);
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i);
-  }
-
-  // We special case nil on string, data, message, ensure they work as expected.
-  msg.oneofString = nil;
-  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
-  XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
-  msg.oneofBytes = nil;
-  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
-  XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
-  msg.oneofMessage = nil;
-  XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
-  XCTAssertNotNil(msg.oneofMessage);
-
-  [msg release];
-}
-
 - (void)testCopyingMakesUniqueObjects {
   const int repeatCount = 5;
   TestAllTypes *msg1 = [TestAllTypes message];
@@ -2451,46 +2066,6 @@
       }];
 }
 
-- (void)test_GPBGetMessageRepeatedField {
-  TestAllTypes *message = [TestAllTypes message];
-  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"repeatedStringArray"];
-  XCTAssertNotNil(fieldDescriptor);
-  NSMutableArray *fieldArray = GPBGetMessageRepeatedField(message, fieldDescriptor);
-  XCTAssertNotNil(fieldArray);  // Should have autocreated.
-  XCTAssertTrue(fieldArray == message.repeatedStringArray);  // Same pointer
-}
-
-- (void)test_GPBSetMessageRepeatedField {
-  TestAllTypes *message = [TestAllTypes message];
-  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"repeatedStringArray"];
-  XCTAssertNotNil(fieldDescriptor);
-
-  NSMutableArray *fieldArray = [NSMutableArray arrayWithObject:@"foo"];
-  GPBSetMessageRepeatedField(message, fieldDescriptor, fieldArray);
-  XCTAssertTrue(fieldArray == message.repeatedStringArray);  // Same pointer
-  XCTAssertEqualObjects(@"foo", message.repeatedStringArray.firstObject);
-}
-
-- (void)test_GPBGetMessageMapField {
-  TestMap *message = [TestMap message];
-  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"mapStringString"];
-  XCTAssertNotNil(fieldDescriptor);
-  NSMutableDictionary *fieldMap = GPBGetMessageMapField(message, fieldDescriptor);
-  XCTAssertNotNil(fieldMap);  // Should have autocreated.
-  XCTAssertTrue(fieldMap == message.mapStringString);  // Same pointer
-}
-
-- (void)test_GPBSetMessageMapField {
-  TestMap *message = [TestMap message];
-  GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"mapStringString"];
-  XCTAssertNotNil(fieldDescriptor);
-
-  NSMutableDictionary *fieldMap = [NSMutableDictionary dictionaryWithObject:@"bar" forKey:@"foo"];
-  GPBSetMessageMapField(message, fieldDescriptor, fieldMap);
-  XCTAssertTrue(fieldMap == message.mapStringString);  // Same pointer
-  XCTAssertEqualObjects(@"bar", message.mapStringString[@"foo"]);
-}
-
 #pragma mark - Subset from from map_tests.cc
 
 // TEST(GeneratedMapFieldTest, IsInitialized)
diff --git a/objectivec/Tests/GPBMessageTests+Serialization.m b/objectivec/Tests/GPBMessageTests+Serialization.m
index 55d77a1..0d811a9 100644
--- a/objectivec/Tests/GPBMessageTests+Serialization.m
+++ b/objectivec/Tests/GPBMessageTests+Serialization.m
@@ -42,6 +42,10 @@
 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
 
+static NSData *DataFromCStr(const char *str) {
+  return [NSData dataWithBytes:str length:strlen(str)];
+}
+
 @interface MessageSerializationTests : GPBTestCase
 @end
 
@@ -109,6 +113,35 @@
   [msg release];
 }
 
+- (void)testProto3DroppingUnknownFields {
+  DropUnknownsFooWithExtraFields *fooWithExtras =
+      [[DropUnknownsFooWithExtraFields alloc] init];
+
+  fooWithExtras.int32Value = 1;
+  fooWithExtras.enumValue = DropUnknownsFooWithExtraFields_NestedEnum_Baz;
+  fooWithExtras.extraInt32Value = 2;
+
+  NSData *data = [fooWithExtras data];
+  XCTAssertNotNil(data);
+  DropUnknownsFoo *foo = [DropUnknownsFoo parseFromData:data error:NULL];
+
+  XCTAssertEqual(foo.int32Value, 1);
+  XCTAssertEqual(foo.enumValue, DropUnknownsFoo_NestedEnum_Baz);
+  // Nothing should end up in the unknowns.
+  XCTAssertEqual([foo.unknownFields countOfFields], 0U);
+
+  [fooWithExtras release];
+  data = [foo data];
+  fooWithExtras =
+      [DropUnknownsFooWithExtraFields parseFromData:data error:NULL];
+  XCTAssertEqual(fooWithExtras.int32Value, 1);
+  XCTAssertEqual(fooWithExtras.enumValue,
+                 DropUnknownsFooWithExtraFields_NestedEnum_Baz);
+  // And the extra value is gone (back to the default).
+  XCTAssertEqual(fooWithExtras.extraInt32Value, 0);
+  XCTAssertEqual([foo.unknownFields countOfFields], 0U);
+}
+
 - (void)testProto2UnknownEnumToUnknownField {
   Message3 *orig = [[Message3 alloc] init];
 
@@ -848,156 +881,6 @@
   XCTAssertEqualObjects(extsParse, extsOrig);
 }
 
-- (void)testErrorSubsectionInvalidLimit {
-  NSData *data = DataFromCStr(
-      "\x0A\x08\x0A\x07\x12\x04\x72\x02\x4B\x50\x12\x04\x72\x02\x4B\x50");
-  NSError *error = nil;
-  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
-                                                        error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
-}
-
-- (void)testErrorSubsectionLimitReached {
-  NSData *data = DataFromCStr("\x0A\x06\x12\x03\x72\x02\x4B\x50");
-  NSError *error = nil;
-  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
-                                                        error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorSubsectionLimitReached);
-}
-
-- (void)testErrorInvalidVarint {
-  NSData *data = DataFromCStr("\x72\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF");
-  NSError *error = nil;
-  TestAllTypes *msg = [TestAllTypes parseFromData:data error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidVarInt);
-}
-
-- (void)testErrorInvalidUTF8 {
-  NSData *data = DataFromCStr("\x72\x04\xF4\xFF\xFF\xFF");
-  NSError *error = nil;
-  TestAllTypes *msg = [TestAllTypes parseFromData:data error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidUTF8);
-}
-
-- (void)testErrorInvalidSize {
-  NSData *data = DataFromCStr("\x72\x03\x4B\x50");
-  NSError *error = nil;
-  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
-                                                        error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSize);
-}
-
-- (void)testErrorInvalidTag {
-  NSData *data = DataFromCStr("\x0F");
-  NSError *error = nil;
-  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
-                                                        error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag);
-}
-
-- (void)testZeroFieldNum {
-  // These are ConformanceTestSuite::TestIllegalTags.
-
-  const char *tests[] = {
-    "\1DEADBEEF",
-    "\2\1\1",
-    "\3\4",
-    "\5DEAD"
-  };
-
-  for (size_t i = 0; i < GPBARRAYSIZE(tests); ++i) {
-    NSData *data = DataFromCStr(tests[i]);
-
-    {
-      // Message from proto2 syntax file
-      NSError *error = nil;
-      Message2 *msg = [Message2 parseFromData:data error:&error];
-      XCTAssertNil(msg, @"i = %zd", i);
-      XCTAssertNotNil(error, @"i = %zd", i);
-      XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain, @"i = %zd", i);
-      XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag, @"i = %zd", i);
-    }
-
-    {
-      // Message from proto3 syntax file
-      NSError *error = nil;
-      Message3 *msg = [Message3 parseFromData:data error:&error];
-      XCTAssertNil(msg, @"i = %zd", i);
-      XCTAssertNotNil(error, @"i = %zd", i);
-      XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain, @"i = %zd", i);
-      XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag, @"i = %zd", i);
-    }
-  }
-}
-
-- (void)testErrorRecursionDepthReached {
-  NSData *data = DataFromCStr(
-      "\x0A\xF2\x01\x0A\xEF\x01\x0A\xEC\x01\x0A\xE9\x01\x0A\xE6\x01"
-      "\x0A\xE3\x01\x0A\xE0\x01\x0A\xDD\x01\x0A\xDA\x01\x0A\xD7\x01"
-      "\x0A\xD4\x01\x0A\xD1\x01\x0A\xCE\x01\x0A\xCB\x01\x0A\xC8\x01"
-      "\x0A\xC5\x01\x0A\xC2\x01\x0A\xBF\x01\x0A\xBC\x01\x0A\xB9\x01"
-      "\x0A\xB6\x01\x0A\xB3\x01\x0A\xB0\x01\x0A\xAD\x01\x0A\xAA\x01"
-      "\x0A\xA7\x01\x0A\xA4\x01\x0A\xA1\x01\x0A\x9E\x01\x0A\x9B\x01"
-      "\x0A\x98\x01\x0A\x95\x01\x0A\x92\x01\x0A\x8F\x01\x0A\x8C\x01"
-      "\x0A\x89\x01\x0A\x86\x01\x0A\x83\x01\x0A\x80\x01\x0A\x7E"
-      "\x0A\x7C\x0A\x7A\x0A\x78\x0A\x76\x0A\x74\x0A\x72\x0A\x70"
-      "\x0A\x6E\x0A\x6C\x0A\x6A\x0A\x68\x0A\x66\x0A\x64\x0A\x62"
-      "\x0A\x60\x0A\x5E\x0A\x5C\x0A\x5A\x0A\x58\x0A\x56\x0A\x54"
-      "\x0A\x52\x0A\x50\x0A\x4E\x0A\x4C\x0A\x4A\x0A\x48\x0A\x46"
-      "\x0A\x44\x0A\x42\x0A\x40\x0A\x3E\x0A\x3C\x0A\x3A\x0A\x38"
-      "\x0A\x36\x0A\x34\x0A\x32\x0A\x30\x0A\x2E\x0A\x2C\x0A\x2A"
-      "\x0A\x28\x0A\x26\x0A\x24\x0A\x22\x0A\x20\x0A\x1E\x0A\x1C"
-      "\x0A\x1A\x0A\x18\x0A\x16\x0A\x14\x0A\x12\x0A\x10\x0A\x0E"
-      "\x0A\x0C\x0A\x0A\x0A\x08\x0A\x06\x12\x04\x72\x02\x4B\x50");
-  NSError *error = nil;
-  NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
-                                                        error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorRecursionDepthExceeded);
-}
-
-- (void)testParseDelimitedDataWithNegativeSize {
-  NSData *data = DataFromCStr("\xFF\xFF\xFF\xFF\x0F");
-  GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:data];
-  NSError *error;
-  [GPBMessage parseDelimitedFromCodedInputStream:input
-                               extensionRegistry:nil
-                                           error:&error];
-  XCTAssertNil(error);
-}
-
-#ifdef DEBUG
-- (void)testErrorMissingRequiredField {
-  NSData *data = DataFromCStr("");
-  NSError *error = nil;
-  TestRequired *msg = [TestRequired parseFromData:data error:&error];
-  XCTAssertNil(msg);
-  XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
-  XCTAssertEqual(error.code, GPBMessageErrorCodeMissingRequiredField);
-}
-#endif
-
 #pragma mark - Subset from from map_tests.cc
 
 // TEST(GeneratedMapFieldTest, StandardWireFormat)
@@ -1007,7 +890,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
   XCTAssertEqual(val, 1);
 
   [msg release];
@@ -1021,7 +904,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
   XCTAssertEqual(val, 1);
 
   [msg release];
@@ -1035,7 +918,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
   XCTAssertEqual(val, 1);
 
   [msg release];
@@ -1049,7 +932,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
   XCTAssertEqual(val, 2);
 
   [msg release];
@@ -1063,7 +946,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:0]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:0 value:&val]);
   XCTAssertEqual(val, 1);
 
   [msg release];
@@ -1077,7 +960,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
   XCTAssertEqual(val, 0);
 
   [msg release];
@@ -1091,7 +974,7 @@
   TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
   XCTAssertEqual(msg.mapInt32Int32.count, 1U);
   int32_t val = 666;
-  XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
+  XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
   XCTAssertEqual(val, 3);
 
   [msg release];
@@ -1106,8 +989,8 @@
   TestMap *msg = [TestMap parseFromData:data error:&error];
   XCTAssertNil(msg);
   XCTAssertNotNil(error);
-  XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
-  XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
+  XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
+  XCTAssertEqual(error.code, GPBMessageErrorCodeMalformedData);
 }
 
 // TEST(GeneratedMapFieldTest, Proto2UnknownEnum)
@@ -1118,17 +1001,17 @@
       dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
   orig.unknownMapField = [GPBInt32EnumDictionary
       dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
-  [orig.knownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
-                       forKey:0];
-  [orig.unknownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
-                         forKey:0];
+  [orig.knownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
+                        forKey:0];
+  [orig.unknownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
+                          forKey:0];
 
   NSData *data = [orig data];
   XCTAssertNotNil(data);
   TestEnumMap *msg1 = [TestEnumMap parseFromData:data error:NULL];
   XCTAssertEqual(msg1.knownMapField.count, 1U);
   int32_t val = -1;
-  XCTAssertTrue([msg1.knownMapField getEnum:&val forKey:0]);
+  XCTAssertTrue([msg1.knownMapField valueForKey:0 value:&val]);
   XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
   XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
 
@@ -1137,11 +1020,11 @@
       [TestEnumMapPlusExtra parseFromData:data error:NULL];
   val = -1;
   XCTAssertEqual(msg2.knownMapField.count, 1U);
-  XCTAssertTrue([msg2.knownMapField getEnum:&val forKey:0]);
+  XCTAssertTrue([msg2.knownMapField valueForKey:0 value:&val]);
   XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumFoo);
   val = -1;
   XCTAssertEqual(msg2.unknownMapField.count, 1U);
-  XCTAssertTrue([msg2.unknownMapField getEnum:&val forKey:0]);
+  XCTAssertTrue([msg2.unknownMapField valueForKey:0 value:&val]);
   XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
   XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
 
@@ -1157,37 +1040,32 @@
 
   // Key/Value data should result in different byte lengths on wire to ensure
   // everything is right.
-  [msg.mapInt32Int32 setInt32:1000 forKey:200];
-  [msg.mapInt32Int32 setInt32:101 forKey:2001];
-  [msg.mapInt64Int64 setInt64:1002 forKey:202];
-  [msg.mapInt64Int64 setInt64:103 forKey:2003];
-  [msg.mapInt64Int64 setInt64:4294967296 forKey:4294967297];
-  [msg.mapUint32Uint32 setUInt32:1004 forKey:204];
-  [msg.mapUint32Uint32 setUInt32:105 forKey:2005];
-  [msg.mapUint64Uint64 setUInt64:1006 forKey:206];
-  [msg.mapUint64Uint64 setUInt64:107 forKey:2007];
-  [msg.mapUint64Uint64 setUInt64:4294967298 forKey:4294967299];
-  [msg.mapSint32Sint32 setInt32:1008 forKey:208];
-  [msg.mapSint32Sint32 setInt32:109 forKey:2009];
-  [msg.mapSint64Sint64 setInt64:1010 forKey:210];
-  [msg.mapSint64Sint64 setInt64:111 forKey:2011];
-  [msg.mapSint64Sint64 setInt64:4294967300 forKey:4294967301];
-  [msg.mapFixed32Fixed32 setUInt32:1012 forKey:212];
-  [msg.mapFixed32Fixed32 setUInt32:113 forKey:2013];
-  [msg.mapFixed64Fixed64 setUInt64:1014 forKey:214];
-  [msg.mapFixed64Fixed64 setUInt64:115 forKey:2015];
-  [msg.mapFixed64Fixed64 setUInt64:4294967302 forKey:4294967303];
-  [msg.mapSfixed32Sfixed32 setInt32:1016 forKey:216];
-  [msg.mapSfixed32Sfixed32 setInt32:117 forKey:2017];
-  [msg.mapSfixed64Sfixed64 setInt64:1018 forKey:218];
-  [msg.mapSfixed64Sfixed64 setInt64:119 forKey:2019];
-  [msg.mapSfixed64Sfixed64 setInt64:4294967304 forKey:4294967305];
-  [msg.mapInt32Float setFloat:1020.f forKey:220];
-  [msg.mapInt32Float setFloat:121.f forKey:2021];
-  [msg.mapInt32Double setDouble:1022. forKey:222];
-  [msg.mapInt32Double setDouble:123. forKey:2023];
-  [msg.mapBoolBool setBool:false forKey:true];
-  [msg.mapBoolBool setBool:true forKey:false];
+  [msg.mapInt32Int32 setValue:1000 forKey:200];
+  [msg.mapInt32Int32 setValue:101 forKey:2001];
+  [msg.mapInt64Int64 setValue:1002 forKey:202];
+  [msg.mapInt64Int64 setValue:103 forKey:2003];
+  [msg.mapUint32Uint32 setValue:1004 forKey:204];
+  [msg.mapUint32Uint32 setValue:105 forKey:2005];
+  [msg.mapUint64Uint64 setValue:1006 forKey:206];
+  [msg.mapUint64Uint64 setValue:107 forKey:2007];
+  [msg.mapSint32Sint32 setValue:1008 forKey:208];
+  [msg.mapSint32Sint32 setValue:109 forKey:2009];
+  [msg.mapSint64Sint64 setValue:1010 forKey:210];
+  [msg.mapSint64Sint64 setValue:111 forKey:2011];
+  [msg.mapFixed32Fixed32 setValue:1012 forKey:212];
+  [msg.mapFixed32Fixed32 setValue:113 forKey:2013];
+  [msg.mapFixed64Fixed64 setValue:1014 forKey:214];
+  [msg.mapFixed64Fixed64 setValue:115 forKey:2015];
+  [msg.mapSfixed32Sfixed32 setValue:1016 forKey:216];
+  [msg.mapSfixed32Sfixed32 setValue:117 forKey:2017];
+  [msg.mapSfixed64Sfixed64 setValue:1018 forKey:218];
+  [msg.mapSfixed64Sfixed64 setValue:119 forKey:2019];
+  [msg.mapInt32Float setValue:1020.f forKey:220];
+  [msg.mapInt32Float setValue:121.f forKey:2021];
+  [msg.mapInt32Double setValue:1022. forKey:222];
+  [msg.mapInt32Double setValue:123. forKey:2023];
+  [msg.mapBoolBool setValue:false forKey:true];
+  [msg.mapBoolBool setValue:true forKey:false];
   msg.mapStringString[@"224"] = @"1024";
   msg.mapStringString[@"2025"] = @"125";
   msg.mapStringBytes[@"226"] = DataFromCStr("1026");
@@ -1196,12 +1074,12 @@
   val1.optionalInt32 = 1028;
   Message2 *val2 = [[Message2 alloc] init];
   val2.optionalInt32 = 129;
-  [msg.mapStringMessage setObject:val1 forKey:@"228"];
-  [msg.mapStringMessage setObject:val2 forKey:@"2029"];
+  [msg.mapStringMessage setValue:val1 forKey:@"228"];
+  [msg.mapStringMessage setValue:val2 forKey:@"2029"];
   [msg.mapInt32Bytes setObject:DataFromCStr("1030 bytes") forKey:230];
   [msg.mapInt32Bytes setObject:DataFromCStr("131") forKey:2031];
-  [msg.mapInt32Enum setEnum:Message2_Enum_Bar forKey:232];
-  [msg.mapInt32Enum setEnum:Message2_Enum_Baz forKey:2033];
+  [msg.mapInt32Enum setValue:Message2_Enum_Bar forKey:232];
+  [msg.mapInt32Enum setValue:Message2_Enum_Baz forKey:2033];
   Message2 *val3 = [[Message2 alloc] init];
   val3.optionalInt32 = 1034;
   Message2 *val4 = [[Message2 alloc] init];
diff --git a/objectivec/Tests/GPBMessageTests.m b/objectivec/Tests/GPBMessageTests.m
index c15535c..89d1fce 100644
--- a/objectivec/Tests/GPBMessageTests.m
+++ b/objectivec/Tests/GPBMessageTests.m
@@ -1082,20 +1082,6 @@
   [repeatedStringArray release];
 }
 
-- (void)testSetOverAutocreatedArrayAndSetAgain {
-  // Ensure when dealing with replacing an array it is handled being either
-  // an autocreated one or a straight NSArray.
-
-  // The real test here is that nothing crashes while doing the work.
-  TestAllTypes *message = [TestAllTypes message];
-  [message.repeatedStringArray addObject:@"foo"];
-  XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)1);
-  message.repeatedStringArray = [NSMutableArray arrayWithObjects:@"bar", @"bar2", nil];
-  XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)2);
-  message.repeatedStringArray = [NSMutableArray arrayWithObject:@"baz"];
-  XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)1);
-}
-
 - (void)testReplaceAutocreatedArray {
   // Replacing array should orphan the old one and cause its creator to become
   // visible.
@@ -1185,7 +1171,7 @@
   XCTAssertFalse([message2.a hasA]);
 
   // But adding an element to the map should.
-  [message.a.a.iToI setInt32:100 forKey:200];
+  [message.a.a.iToI setValue:100 forKey:200];
   XCTAssertTrue([message hasA]);
   XCTAssertTrue([message.a hasA]);
   XCTAssertEqual([message.a.a.iToI count], (NSUInteger)1);
@@ -1204,7 +1190,7 @@
   message1a.a.iToI = message1b.a.iToI;
   XCTAssertTrue([message1a hasA]);
   XCTAssertFalse([message1b hasA]);
-  [message1a.a.iToI setInt32:1 forKey:2];
+  [message1a.a.iToI setValue:1 forKey:2];
   XCTAssertTrue([message1a hasA]);
   XCTAssertTrue([message1b hasA]);
   XCTAssertEqual(message1a.a.iToI, message1b.a.iToI);
@@ -1238,7 +1224,7 @@
   // with different objects that are equal).
   TestRecursiveMessageWithRepeatedField *message3 =
       [TestRecursiveMessageWithRepeatedField message];
-  message3.iToI = [GPBInt32Int32Dictionary dictionaryWithInt32:10 forKey:20];
+  message3.iToI = [GPBInt32Int32Dictionary dictionaryWithValue:10 forKey:20];
   message3.strToStr =
       [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"123"];
   XCTAssertNotNil(message.iToI);
@@ -1295,23 +1281,6 @@
   [strToStr release];
 }
 
-- (void)testSetOverAutocreatedMapAndSetAgain {
-  // Ensure when dealing with replacing a map it is handled being either
-  // an autocreated one or a straight NSDictionary.
-
-  // The real test here is that nothing crashes while doing the work.
-  TestRecursiveMessageWithRepeatedField *message =
-      [TestRecursiveMessageWithRepeatedField message];
-  message.strToStr[@"foo"] = @"bar";
-  XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
-  message.strToStr =
-      [NSMutableDictionary dictionaryWithObjectsAndKeys:@"bar", @"key1", @"baz", @"key2", nil];
-  XCTAssertEqual(message.strToStr_Count, (NSUInteger)2);
-  message.strToStr =
-      [NSMutableDictionary dictionaryWithObject:@"baz" forKey:@"mumble"];
-  XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
-}
-
 - (void)testReplaceAutocreatedMap {
   // Replacing map should orphan the old one and cause its creator to become
   // visible.
@@ -1323,7 +1292,7 @@
     XCTAssertFalse([message hasA]);
     GPBInt32Int32Dictionary *iToI = [message.a.iToI retain];
     XCTAssertEqual(iToI->_autocreator, message.a);  // Pointer comparision
-    message.a.iToI = [GPBInt32Int32Dictionary dictionaryWithInt32:6 forKey:7];
+    message.a.iToI = [GPBInt32Int32Dictionary dictionaryWithValue:6 forKey:7];
     XCTAssertTrue([message hasA]);
     XCTAssertNotEqual(message.a.iToI, iToI);  // Pointer comparision
     XCTAssertNil(iToI->_autocreator);
diff --git a/objectivec/Tests/GPBPerfTests.m b/objectivec/Tests/GPBPerfTests.m
index 8dd0ffc..1259d14 100644
--- a/objectivec/Tests/GPBPerfTests.m
+++ b/objectivec/Tests/GPBPerfTests.m
@@ -64,112 +64,6 @@
   }];
 }
 
-- (void)testMessageSerialParsingPerformance {
-  // This and the next test are meant to monitor that the parsing functionality of protos does not
-  // lock across threads when parsing different instances. The Serial version of the test should run
-  // around ~2 times slower than the Parallel version since it's parsing the protos in the same
-  // thread.
-  TestAllTypes *allTypesMessage = [TestAllTypes message];
-  [self setAllFields:allTypesMessage repeatedCount:2];
-  NSData *allTypesData = allTypesMessage.data;
-
-  [self measureBlock:^{
-    for (int i = 0; i < 500; ++i) {
-      [TestAllTypes parseFromData:allTypesData error:NULL];
-      [TestAllTypes parseFromData:allTypesData error:NULL];
-    }
-  }];
-}
-
-- (void)testMessageParallelParsingPerformance {
-  // This and the previous test are meant to monitor that the parsing functionality of protos does
-  // not lock across threads when parsing different instances. The Serial version of the test should
-  // run around ~2 times slower than the Parallel version since it's parsing the protos in the same
-  // thread.
-  TestAllTypes *allTypesMessage = [TestAllTypes message];
-  [self setAllFields:allTypesMessage repeatedCount:2];
-  NSData *allTypesData = allTypesMessage.data;
-
-  dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT);
-
-  [self measureBlock:^{
-    for (int i = 0; i < 500; ++i) {
-      dispatch_group_t group = dispatch_group_create();
-
-      dispatch_group_async(group, concurrentQueue, ^{
-        [TestAllTypes parseFromData:allTypesData error:NULL];
-      });
-
-      dispatch_group_async(group, concurrentQueue, ^{
-        [TestAllTypes parseFromData:allTypesData error:NULL];
-      });
-
-      dispatch_group_notify(group, concurrentQueue, ^{});
-
-      dispatch_release(group);
-    }
-  }];
-
-  dispatch_release(concurrentQueue);
-}
-
-- (void)testMessageSerialExtensionsParsingPerformance {
-  // This and the next test are meant to monitor that the parsing functionality of protos does not
-  // lock across threads when parsing different instances when using extensions. The Serial version
-  // of the test should run around ~2 times slower than the Parallel version since it's parsing the
-  // protos in the same thread.
-  TestAllExtensions *allExtensionsMessage = [TestAllExtensions message];
-  [self setAllExtensions:allExtensionsMessage repeatedCount:2];
-  NSData *allExtensionsData = allExtensionsMessage.data;
-
-  [self measureBlock:^{
-    for (int i = 0; i < 500; ++i) {
-      [TestAllExtensions parseFromData:allExtensionsData
-                     extensionRegistry:[self extensionRegistry]
-                                 error:NULL];
-      [TestAllExtensions parseFromData:allExtensionsData
-                     extensionRegistry:[self extensionRegistry]
-                                 error:NULL];
-    }
-  }];
-}
-
-- (void)testMessageParallelExtensionsParsingPerformance {
-  // This and the previous test are meant to monitor that the parsing functionality of protos does
-  // not lock across threads when parsing different instances when using extensions. The Serial
-  // version of the test should run around ~2 times slower than the Parallel version since it's
-  // parsing the protos in the same thread.
-  TestAllExtensions *allExtensionsMessage = [TestAllExtensions message];
-  [self setAllExtensions:allExtensionsMessage repeatedCount:2];
-  NSData *allExtensionsData = allExtensionsMessage.data;
-
-  dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT);
-
-  [self measureBlock:^{
-    for (int i = 0; i < 500; ++i) {
-      dispatch_group_t group = dispatch_group_create();
-
-      dispatch_group_async(group, concurrentQueue, ^{
-        [TestAllExtensions parseFromData:allExtensionsData
-                       extensionRegistry:[UnittestRoot extensionRegistry]
-                                   error:NULL];
-      });
-
-      dispatch_group_async(group, concurrentQueue, ^{
-        [TestAllExtensions parseFromData:allExtensionsData
-                       extensionRegistry:[UnittestRoot extensionRegistry]
-                                   error:NULL];
-      });
-
-      dispatch_group_notify(group, concurrentQueue, ^{});
-
-      dispatch_release(group);
-    }
-  }];
-
-  dispatch_release(concurrentQueue);
-}
-
 - (void)testExtensionsPerformance {
   [self measureBlock:^{
     for (int i = 0; i < 200; ++i) {
diff --git a/objectivec/Tests/GPBSwiftTests.swift b/objectivec/Tests/GPBSwiftTests.swift
index 9d8a0fa..36ed2a6 100644
--- a/objectivec/Tests/GPBSwiftTests.swift
+++ b/objectivec/Tests/GPBSwiftTests.swift
@@ -42,23 +42,23 @@
 
     msg.optionalInt32 = 100
     msg.optionalString = "abc"
-    msg.optionalEnum = .bar
+    msg.optionalEnum = .Bar
     msg2.optionalString = "other"
-    msg.optional = msg2
+    msg.optionalMessage = msg2
     msg3.a = 200
     msg.optionalGroup = msg3
     msg.repeatedInt32Array.addValue(300)
     msg.repeatedInt32Array.addValue(301)
-    msg.repeatedStringArray.add("mno")
-    msg.repeatedStringArray.add("pqr")
-    msg.repeatedEnumArray.addValue(Message2_Enum.bar.rawValue)
-    msg.repeatedEnumArray.addValue(Message2_Enum.baz.rawValue)
-    msg.mapInt32Int32.setInt32(400, forKey:500)
-    msg.mapInt32Int32.setInt32(401, forKey:501)
-    msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
-    msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
-    msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
-    msg.mapInt32Enum.setEnum(Message2_Enum.baz.rawValue, forKey:601)
+    msg.repeatedStringArray.addObject("mno")
+    msg.repeatedStringArray.addObject("pqr")
+    msg.repeatedEnumArray.addValue(Message2_Enum.Bar.rawValue)
+    msg.repeatedEnumArray.addValue(Message2_Enum.Baz.rawValue)
+    msg.mapInt32Int32.setValue(400, forKey:500)
+    msg.mapInt32Int32.setValue(401, forKey:501)
+    msg.mapStringString.setObject("foo", forKey:"bar")
+    msg.mapStringString.setObject("abc", forKey:"xyz")
+    msg.mapInt32Enum.setValue(Message2_Enum.Bar.rawValue, forKey:600)
+    msg.mapInt32Enum.setValue(Message2_Enum.Baz.rawValue, forKey:601)
 
     // Check has*.
     XCTAssertTrue(msg.hasOptionalInt32)
@@ -75,34 +75,34 @@
     XCTAssertEqual(msg.optionalInt32, Int32(100))
     XCTAssertEqual(msg.optionalString, "abc")
     XCTAssertEqual(msg2.optionalString, "other")
-    XCTAssertTrue(msg.optional === msg2)
-    XCTAssertEqual(msg.optionalEnum, Message2_Enum.bar)
+    XCTAssertTrue(msg.optionalMessage === msg2)
+    XCTAssertEqual(msg.optionalEnum, Message2_Enum.Bar)
     XCTAssertEqual(msg3.a, Int32(200))
     XCTAssertTrue(msg.optionalGroup === msg3)
     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
-    XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
-    XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
+    XCTAssertEqual(msg.repeatedInt32Array.valueAtIndex(0), Int32(300))
+    XCTAssertEqual(msg.repeatedInt32Array.valueAtIndex(1), Int32(301))
     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
-    XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
-    XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
+    XCTAssertEqual(msg.repeatedStringArray.objectAtIndex(0) as? String, "mno")
+    XCTAssertEqual(msg.repeatedStringArray.objectAtIndex(1) as? String, "pqr")
     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
-    XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message2_Enum.bar.rawValue)
-    XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message2_Enum.baz.rawValue)
+    XCTAssertEqual(msg.repeatedEnumArray.valueAtIndex(0), Message2_Enum.Bar.rawValue)
+    XCTAssertEqual(msg.repeatedEnumArray.valueAtIndex(1), Message2_Enum.Baz.rawValue)
     XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
-    var intValue: Int32 = 0
-    XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500))
+    var intValue: Int32 = 0;
+    XCTAssertTrue(msg.mapInt32Int32.valueForKey(500, value:&intValue))
     XCTAssertEqual(intValue, Int32(400))
-    XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501))
+    XCTAssertTrue(msg.mapInt32Int32.valueForKey(501, value:&intValue))
     XCTAssertEqual(intValue, Int32(401))
     XCTAssertEqual(msg.mapStringString.count, Int(2))
-    XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
-    XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
+    XCTAssertEqual(msg.mapStringString.objectForKey("bar") as? String, "foo")
+    XCTAssertEqual(msg.mapStringString.objectForKey("xyz") as? String, "abc")
     XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
-    XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
-    XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
-    XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
-    XCTAssertEqual(intValue, Message2_Enum.baz.rawValue)
+    XCTAssertTrue(msg.mapInt32Enum.valueForKey(600, value:&intValue))
+    XCTAssertEqual(intValue, Message2_Enum.Bar.rawValue)
+    XCTAssertTrue(msg.mapInt32Enum.valueForKey(601, value:&intValue))
+    XCTAssertEqual(intValue, Message2_Enum.Baz.rawValue)
 
     // Clearing a string with nil.
     msg2.optionalString = nil
@@ -124,8 +124,8 @@
     XCTAssertFalse(msg.hasOptionalFloat)
     XCTAssertEqual(msg.optionalInt32, Int32(0))
     XCTAssertEqual(msg.optionalString, "")
-    XCTAssertTrue(msg.optional !== msg2)  // New instance
-    XCTAssertEqual(msg.optionalEnum, Message2_Enum.foo)  // Default
+    XCTAssertTrue(msg.optionalMessage !== msg2)  // New instance
+    XCTAssertEqual(msg.optionalEnum, Message2_Enum.Foo)  // Default
     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
     XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
@@ -140,22 +140,22 @@
 
     msg.optionalInt32 = 100
     msg.optionalString = "abc"
-    msg.optionalEnum = .bar
+    msg.optionalEnum = .Bar
     msg2.optionalString = "other"
-    msg.optional = msg2
+    msg.optionalMessage = msg2
     msg.repeatedInt32Array.addValue(300)
     msg.repeatedInt32Array.addValue(301)
-    msg.repeatedStringArray.add("mno")
-    msg.repeatedStringArray.add("pqr")
+    msg.repeatedStringArray.addObject("mno")
+    msg.repeatedStringArray.addObject("pqr")
     // "proto3" syntax lets enum get unknown values.
-    msg.repeatedEnumArray.addValue(Message3_Enum.bar.rawValue)
+    msg.repeatedEnumArray.addValue(Message3_Enum.Bar.rawValue)
     msg.repeatedEnumArray.addRawValue(666)
     SetMessage3_OptionalEnum_RawValue(msg2, 666)
-    msg.mapInt32Int32.setInt32(400, forKey:500)
-    msg.mapInt32Int32.setInt32(401, forKey:501)
-    msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
-    msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
-    msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
+    msg.mapInt32Int32.setValue(400, forKey:500)
+    msg.mapInt32Int32.setValue(401, forKey:501)
+    msg.mapStringString.setObject("foo", forKey:"bar")
+    msg.mapStringString.setObject("abc", forKey:"xyz")
+    msg.mapInt32Enum.setValue(Message2_Enum.Bar.rawValue, forKey:600)
     // "proto3" syntax lets enum get unknown values.
     msg.mapInt32Enum.setRawValue(666, forKey:601)
 
@@ -167,36 +167,36 @@
     XCTAssertEqual(msg.optionalInt32, Int32(100))
     XCTAssertEqual(msg.optionalString, "abc")
     XCTAssertEqual(msg2.optionalString, "other")
-    XCTAssertTrue(msg.optional === msg2)
-    XCTAssertEqual(msg.optionalEnum, Message3_Enum.bar)
+    XCTAssertTrue(msg.optionalMessage === msg2)
+    XCTAssertEqual(msg.optionalEnum, Message3_Enum.Bar)
     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
-    XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
-    XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
+    XCTAssertEqual(msg.repeatedInt32Array.valueAtIndex(0), Int32(300))
+    XCTAssertEqual(msg.repeatedInt32Array.valueAtIndex(1), Int32(301))
     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
-    XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
-    XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
+    XCTAssertEqual(msg.repeatedStringArray.objectAtIndex(0) as? String, "mno")
+    XCTAssertEqual(msg.repeatedStringArray.objectAtIndex(1) as? String, "pqr")
     XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
-    XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message3_Enum.bar.rawValue)
-    XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
-    XCTAssertEqual(msg.repeatedEnumArray.rawValue(at: 1), 666)
-    XCTAssertEqual(msg2.optionalEnum, Message3_Enum.gpbUnrecognizedEnumeratorValue)
+    XCTAssertEqual(msg.repeatedEnumArray.valueAtIndex(0), Message3_Enum.Bar.rawValue)
+    XCTAssertEqual(msg.repeatedEnumArray.valueAtIndex(1), Message3_Enum.GPBUnrecognizedEnumeratorValue.rawValue)
+    XCTAssertEqual(msg.repeatedEnumArray.rawValueAtIndex(1), 666)
+    XCTAssertEqual(msg2.optionalEnum, Message3_Enum.GPBUnrecognizedEnumeratorValue)
     XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Int32(666))
     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
-    var intValue: Int32 = 0
-    XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:500))
+    var intValue: Int32 = 0;
+    XCTAssertTrue(msg.mapInt32Int32.valueForKey(500, value:&intValue))
     XCTAssertEqual(intValue, Int32(400))
-    XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:501))
+    XCTAssertTrue(msg.mapInt32Int32.valueForKey(501, value:&intValue))
     XCTAssertEqual(intValue, Int32(401))
     XCTAssertEqual(msg.mapStringString.count, Int(2))
-    XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
-    XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
+    XCTAssertEqual(msg.mapStringString.objectForKey("bar") as? String, "foo")
+    XCTAssertEqual(msg.mapStringString.objectForKey("xyz") as? String, "abc")
     XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
-    XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
-    XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
-    XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
-    XCTAssertEqual(intValue, Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
-    XCTAssertTrue(msg.mapInt32Enum.getRawValue(&intValue, forKey:601))
+    XCTAssertTrue(msg.mapInt32Enum.valueForKey(600, value:&intValue))
+    XCTAssertEqual(intValue, Message2_Enum.Bar.rawValue)
+    XCTAssertTrue(msg.mapInt32Enum.valueForKey(601, value:&intValue))
+    XCTAssertEqual(intValue, Message3_Enum.GPBUnrecognizedEnumeratorValue.rawValue)
+    XCTAssertTrue(msg.mapInt32Enum.valueForKey(601, rawValue:&intValue))
     XCTAssertEqual(intValue, 666)
 
     // Clearing a string with nil.
@@ -204,23 +204,23 @@
     XCTAssertEqual(msg2.optionalString, "")
 
     // Clearing a message with nil.
-    msg.optional = nil
+    msg.optionalMessage = nil
     XCTAssertFalse(msg.hasOptionalMessage)
-    XCTAssertTrue(msg.optional !== msg2)  // New instance
+    XCTAssertTrue(msg.optionalMessage !== msg2)  // New instance
 
     // Clear.
     msg.clear()
     XCTAssertFalse(msg.hasOptionalMessage)
     XCTAssertEqual(msg.optionalInt32, Int32(0))
     XCTAssertEqual(msg.optionalString, "")
-    XCTAssertTrue(msg.optional !== msg2)  // New instance
-    XCTAssertEqual(msg.optionalEnum, Message3_Enum.foo)  // Default
+    XCTAssertTrue(msg.optionalMessage !== msg2)  // New instance
+    XCTAssertEqual(msg.optionalEnum, Message3_Enum.Foo)  // Default
     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
     XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
     msg2.clear()
-    XCTAssertEqual(msg2.optionalEnum, Message3_Enum.foo)  // Default
-    XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.foo.rawValue)
+    XCTAssertEqual(msg2.optionalEnum, Message3_Enum.Foo)  // Default
+    XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.Foo.rawValue)
     XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
     XCTAssertEqual(msg.mapStringString.count, Int(0))
     XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
@@ -234,201 +234,201 @@
 
     // Access shouldn't result in has* but should return objects.
     let msg2 = msg.optionalGroup
-    let msg3 = msg.optional.optional
-    let msg4 = msg.optional
+    let msg3 = msg.optionalMessage.optionalMessage
+    let msg4 = msg.optionalMessage
     XCTAssertNotNil(msg2)
     XCTAssertNotNil(msg3)
     XCTAssertFalse(msg.hasOptionalGroup)
-    XCTAssertFalse(msg.optional.hasOptionalMessage)
+    XCTAssertFalse(msg.optionalMessage.hasOptionalMessage)
     XCTAssertFalse(msg.hasOptionalMessage)
 
     // Setting things should trigger has* getting set.
     msg.optionalGroup.a = 10
-    msg.optional.optional.optionalInt32 = 100
+    msg.optionalMessage.optionalMessage.optionalInt32 = 100
     XCTAssertTrue(msg.hasOptionalGroup)
-    XCTAssertTrue(msg.optional.hasOptionalMessage)
+    XCTAssertTrue(msg.optionalMessage.hasOptionalMessage)
     XCTAssertTrue(msg.hasOptionalMessage)
 
     // And they should be the same pointer as before.
     XCTAssertTrue(msg2 === msg.optionalGroup)
-    XCTAssertTrue(msg3 === msg.optional.optional)
-    XCTAssertTrue(msg4 === msg.optional)
+    XCTAssertTrue(msg3 === msg.optionalMessage.optionalMessage)
+    XCTAssertTrue(msg4 === msg.optionalMessage)
 
     // Clear gets us new objects next time around.
     msg.clear()
     XCTAssertFalse(msg.hasOptionalGroup)
-    XCTAssertFalse(msg.optional.hasOptionalMessage)
+    XCTAssertFalse(msg.optionalMessage.hasOptionalMessage)
     XCTAssertFalse(msg.hasOptionalMessage)
     msg.optionalGroup.a = 20
-    msg.optional.optional.optionalInt32 = 200
+    msg.optionalMessage.optionalMessage.optionalInt32 = 200
     XCTAssertTrue(msg.hasOptionalGroup)
-    XCTAssertTrue(msg.optional.hasOptionalMessage)
+    XCTAssertTrue(msg.optionalMessage.hasOptionalMessage)
     XCTAssertTrue(msg.hasOptionalMessage)
     XCTAssertTrue(msg2 !== msg.optionalGroup)
-    XCTAssertTrue(msg3 !== msg.optional.optional)
-    XCTAssertTrue(msg4 !== msg.optional)
+    XCTAssertTrue(msg3 !== msg.optionalMessage.optionalMessage)
+    XCTAssertTrue(msg4 !== msg.optionalMessage)
 
     // Explicit set of a message, means autocreated object doesn't bind.
     msg.clear()
-    let autoCreated = msg.optional
+    let autoCreated = msg.optionalMessage
     XCTAssertFalse(msg.hasOptionalMessage)
     let msg5 = Message2()
     msg5.optionalInt32 = 123
-    msg.optional = msg5
+    msg.optionalMessage = msg5
     XCTAssertTrue(msg.hasOptionalMessage)
     // Modifing the autocreated doesn't replaced the explicit set one.
-    autoCreated?.optionalInt32 = 456
+    autoCreated.optionalInt32 = 456
     XCTAssertTrue(msg.hasOptionalMessage)
-    XCTAssertTrue(msg.optional === msg5)
-    XCTAssertEqual(msg.optional.optionalInt32, Int32(123))
+    XCTAssertTrue(msg.optionalMessage === msg5)
+    XCTAssertEqual(msg.optionalMessage.optionalInt32, Int32(123))
   }
 
   func testProto2OneOfSupport() {
     let msg = Message2()
 
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.GPBUnsetOneOfCase)
     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
-    let autoCreated = msg.oneof  // Default create one.
+    XCTAssertEqual(msg.oneofEnum, Message2_Enum.Baz)  // Default
+    let autoCreated = msg.oneofMessage  // Default create one.
     XCTAssertNotNil(autoCreated)
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.GPBUnsetOneOfCase)
 
     msg.oneofInt32 = 10
     XCTAssertEqual(msg.oneofInt32, Int32(10))
     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
+    XCTAssertEqual(msg.oneofEnum, Message2_Enum.Baz)  // Default
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.OneofInt32)
 
     msg.oneofFloat = 20.0
     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(20.0))
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofFloat)
+    XCTAssertEqual(msg.oneofEnum, Message2_Enum.Baz)  // Default
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.OneofFloat)
 
-    msg.oneofEnum = .bar
+    msg.oneofEnum = .Bar
     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum.bar)
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofEnum)
+    XCTAssertEqual(msg.oneofEnum, Message2_Enum.Bar)
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.OneofEnum)
 
     // Sets via the autocreated instance.
-    msg.oneof.optionalInt32 = 200
+    msg.oneofMessage.optionalInt32 = 200
     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
+    XCTAssertEqual(msg.oneofEnum, Message2_Enum.Baz)  // Default
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(200))
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.OneofMessage)
 
     // Clear the oneof.
     Message2_ClearOOneOfCase(msg)
     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
-    let autoCreated2 = msg.oneof  // Default create one
+    XCTAssertEqual(msg.oneofEnum, Message2_Enum.Baz)  // Default
+    let autoCreated2 = msg.oneofMessage  // Default create one
     XCTAssertNotNil(autoCreated2)
     XCTAssertTrue(autoCreated2 !== autoCreated)  // New instance
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(0))  // Default
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.GPBUnsetOneOfCase)
 
     msg.oneofInt32 = 10
     XCTAssertEqual(msg.oneofInt32, Int32(10))
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.OneofInt32)
 
     // Confirm Message.clear() handles the oneof correctly.
     msg.clear()
     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.GPBUnsetOneOfCase)
 
     // Sets via the autocreated instance.
-    msg.oneof.optionalInt32 = 300
-    XCTAssertTrue(msg.oneof !== autoCreated)  // New instance
-    XCTAssertTrue(msg.oneof !== autoCreated2)  // New instance
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
+    msg.oneofMessage.optionalInt32 = 300
+    XCTAssertTrue(msg.oneofMessage !== autoCreated)  // New instance
+    XCTAssertTrue(msg.oneofMessage !== autoCreated2)  // New instance
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(300))
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.OneofMessage)
 
     // Set message to nil clears the oneof.
-    msg.oneof = nil
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
-    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
+    msg.oneofMessage = nil
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(0))  // Default
+    XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.GPBUnsetOneOfCase)
 }
 
   func testProto3OneOfSupport() {
     let msg = Message3()
 
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.GPBUnsetOneOfCase)
     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
-    let autoCreated = msg.oneof  // Default create one.
+    XCTAssertEqual(msg.oneofEnum, Message3_Enum.Foo)  // Default
+    let autoCreated = msg.oneofMessage  // Default create one.
     XCTAssertNotNil(autoCreated)
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.GPBUnsetOneOfCase)
 
     msg.oneofInt32 = 10
     XCTAssertEqual(msg.oneofInt32, Int32(10))
     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
+    XCTAssertEqual(msg.oneofEnum, Message3_Enum.Foo)  // Default
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.OneofInt32)
 
     msg.oneofFloat = 20.0
     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(20.0))
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofFloat)
+    XCTAssertEqual(msg.oneofEnum, Message3_Enum.Foo)  // Default
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.OneofFloat)
 
-    msg.oneofEnum = .bar
+    msg.oneofEnum = .Bar
     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum.bar)
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofEnum)
+    XCTAssertEqual(msg.oneofEnum, Message3_Enum.Bar)
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.OneofEnum)
 
     // Sets via the autocreated instance.
-    msg.oneof.optionalInt32 = 200
+    msg.oneofMessage.optionalInt32 = 200
     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
-    XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
+    XCTAssertEqual(msg.oneofEnum, Message3_Enum.Foo)  // Default
+    XCTAssertTrue(msg.oneofMessage === autoCreated)  // Still the same
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(200))
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.OneofMessage)
 
     // Clear the oneof.
     Message3_ClearOOneOfCase(msg)
     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
-    XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
-    let autoCreated2 = msg.oneof  // Default create one
+    XCTAssertEqual(msg.oneofEnum, Message3_Enum.Foo)  // Default
+    let autoCreated2 = msg.oneofMessage  // Default create one
     XCTAssertNotNil(autoCreated2)
     XCTAssertTrue(autoCreated2 !== autoCreated)  // New instance
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(0))  // Default
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.GPBUnsetOneOfCase)
 
     msg.oneofInt32 = 10
     XCTAssertEqual(msg.oneofInt32, Int32(10))
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.OneofInt32)
 
     // Confirm Message.clear() handles the oneof correctly.
     msg.clear()
     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.GPBUnsetOneOfCase)
 
     // Sets via the autocreated instance.
-    msg.oneof.optionalInt32 = 300
-    XCTAssertTrue(msg.oneof !== autoCreated)  // New instance
-    XCTAssertTrue(msg.oneof !== autoCreated2)  // New instance
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
+    msg.oneofMessage.optionalInt32 = 300
+    XCTAssertTrue(msg.oneofMessage !== autoCreated)  // New instance
+    XCTAssertTrue(msg.oneofMessage !== autoCreated2)  // New instance
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(300))
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.OneofMessage)
 
     // Set message to nil clears the oneof.
-    msg.oneof = nil
-    XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
-    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
+    msg.oneofMessage = nil
+    XCTAssertEqual(msg.oneofMessage.optionalInt32, Int32(0))  // Default
+    XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.GPBUnsetOneOfCase)
   }
 
   func testSerialization() {
@@ -437,16 +437,16 @@
     msg.optionalInt32 = 100
     msg.optionalInt64 = 101
     msg.optionalGroup.a = 102
-    msg.repeatedStringArray.add("abc")
-    msg.repeatedStringArray.add("def")
-    msg.mapInt32Int32.setInt32(200, forKey:300)
-    msg.mapInt32Int32.setInt32(201, forKey:201)
-    msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
-    msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
+    msg.repeatedStringArray.addObject("abc")
+    msg.repeatedStringArray.addObject("def")
+    msg.mapInt32Int32.setValue(200, forKey:300)
+    msg.mapInt32Int32.setValue(201, forKey:201)
+    msg.mapStringString.setObject("foo", forKey:"bar")
+    msg.mapStringString.setObject("abc", forKey:"xyz")
 
     let data = msg.data()
 
-    let msg2 = try! Message2(data: data!)
+    let msg2 = Message2(data: data!, error:nil)
     XCTAssertTrue(msg2 !== msg)  // New instance
     XCTAssertEqual(msg.optionalInt32, Int32(100))
     XCTAssertEqual(msg.optionalInt64, Int64(101))
diff --git a/objectivec/Tests/GPBTestUtilities.h b/objectivec/Tests/GPBTestUtilities.h
index 780184b..44c8084 100644
--- a/objectivec/Tests/GPBTestUtilities.h
+++ b/objectivec/Tests/GPBTestUtilities.h
@@ -39,9 +39,6 @@
 @class TestUnpackedExtensions;
 @class GPBExtensionRegistry;
 
-static inline NSData *DataFromCStr(const char *str) {
-  return [NSData dataWithBytes:str length:strlen(str)];
-}
 
 // Helper for uses of C arrays in tests cases.
 #ifndef GPBARRAYSIZE
diff --git a/objectivec/Tests/GPBTestUtilities.m b/objectivec/Tests/GPBTestUtilities.m
index ebccaac..726761a 100644
--- a/objectivec/Tests/GPBTestUtilities.m
+++ b/objectivec/Tests/GPBTestUtilities.m
@@ -1089,19 +1089,19 @@
 
 - (void)setAllMapFields:(TestMap *)message numEntries:(uint32_t)count {
   for (uint32_t i = 0; i < count; i++) {
-    [message.mapInt32Int32 setInt32:(i + 1) forKey:100 + i * 100];
-    [message.mapInt64Int64 setInt64:(i + 1) forKey:101 + i * 100];
-    [message.mapUint32Uint32 setUInt32:(i + 1) forKey:102 + i * 100];
-    [message.mapUint64Uint64 setUInt64:(i + 1) forKey:103 + i * 100];
-    [message.mapSint32Sint32 setInt32:(i + 1) forKey:104 + i * 100];
-    [message.mapSint64Sint64 setInt64:(i + 1) forKey:105 + i * 100];
-    [message.mapFixed32Fixed32 setUInt32:(i + 1) forKey:106 + i * 100];
-    [message.mapFixed64Fixed64 setUInt64:(i + 1) forKey:107 + i * 100];
-    [message.mapSfixed32Sfixed32 setInt32:(i + 1) forKey:108 + i * 100];
-    [message.mapSfixed64Sfixed64 setInt64:(i + 1) forKey:109 + i * 100];
-    [message.mapInt32Float setFloat:(i + 1) forKey:110 + i * 100];
-    [message.mapInt32Double setDouble:(i + 1) forKey:111 + i * 100];
-    [message.mapBoolBool setBool:((i % 2) == 1) forKey:((i % 2) == 0)];
+    [message.mapInt32Int32 setValue:(i + 1) forKey:100 + i * 100];
+    [message.mapInt64Int64 setValue:(i + 1) forKey:101 + i * 100];
+    [message.mapUint32Uint32 setValue:(i + 1) forKey:102 + i * 100];
+    [message.mapUint64Uint64 setValue:(i + 1) forKey:103 + i * 100];
+    [message.mapSint32Sint32 setValue:(i + 1) forKey:104 + i * 100];
+    [message.mapSint64Sint64 setValue:(i + 1) forKey:105 + i * 100];
+    [message.mapFixed32Fixed32 setValue:(i + 1) forKey:106 + i * 100];
+    [message.mapFixed64Fixed64 setValue:(i + 1) forKey:107 + i * 100];
+    [message.mapSfixed32Sfixed32 setValue:(i + 1) forKey:108 + i * 100];
+    [message.mapSfixed64Sfixed64 setValue:(i + 1) forKey:109 + i * 100];
+    [message.mapInt32Float setValue:(i + 1) forKey:110 + i * 100];
+    [message.mapInt32Double setValue:(i + 1) forKey:111 + i * 100];
+    [message.mapBoolBool setValue:((i % 2) == 1) forKey:((i % 2) == 0)];
 
     NSString *keyStr = [[NSString alloc] initWithFormat:@"%d", 112 + i * 100];
     NSString *dataStr = [[NSString alloc] initWithFormat:@"%d", i + 1];
@@ -1114,8 +1114,8 @@
     [data release];
 
     [message.mapInt32Enum
-        setEnum:(i % 2) ? MapEnum_MapEnumBar : MapEnum_MapEnumBaz
-         forKey:114 + i * 100];
+        setValue:(i % 2) ? MapEnum_MapEnumBar : MapEnum_MapEnumBaz
+          forKey:114 + i * 100];
 
     ForeignMessage *subMsg = [[ForeignMessage alloc] init];
     subMsg.c = i + 1;
diff --git a/objectivec/Tests/GPBUnittestProtos.m b/objectivec/Tests/GPBUnittestProtos.m
index 756bd99..d19beee 100644
--- a/objectivec/Tests/GPBUnittestProtos.m
+++ b/objectivec/Tests/GPBUnittestProtos.m
@@ -36,15 +36,12 @@
 // a descriptor as it doesn't use the classes/enums.
 #import "google/protobuf/Descriptor.pbobjc.m"
 
-#import "google/protobuf/AnyTest.pbobjc.m"
 #import "google/protobuf/MapProto2Unittest.pbobjc.m"
 #import "google/protobuf/MapUnittest.pbobjc.m"
 #import "google/protobuf/Unittest.pbobjc.m"
 #import "google/protobuf/UnittestArena.pbobjc.m"
 #import "google/protobuf/UnittestCustomOptions.pbobjc.m"
 #import "google/protobuf/UnittestCycle.pbobjc.m"
-#import "google/protobuf/UnittestDeprecated.pbobjc.m"
-#import "google/protobuf/UnittestDeprecatedFile.pbobjc.m"
 #import "google/protobuf/UnittestDropUnknownFields.pbobjc.m"
 #import "google/protobuf/UnittestEmbedOptimizeFor.pbobjc.m"
 #import "google/protobuf/UnittestEmpty.pbobjc.m"
@@ -65,11 +62,3 @@
 #import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.m"
 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.m"
 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.m"
-
-#import "google/protobuf/UnittestExtensionChainA.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainB.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainC.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainD.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainE.pbobjc.m"
-// See GPBUnittestProtos2.m for for "UnittestExtensionChainF.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainG.pbobjc.m"
diff --git a/objectivec/Tests/GPBUnittestProtos2.m b/objectivec/Tests/GPBUnittestProtos2.m
deleted file mode 100644
index ef9f070..0000000
--- a/objectivec/Tests/GPBUnittestProtos2.m
+++ /dev/null
@@ -1,34 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 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.
-
-// This one file in the chain tests is compiled by itself to ensure if was
-// generated with the extra #imports needed to pull in the indirect Root class
-// used in its Root registry.
-#import "google/protobuf/UnittestExtensionChainF.pbobjc.m"
diff --git a/objectivec/Tests/GPBUnknownFieldSetTest.m b/objectivec/Tests/GPBUnknownFieldSetTest.m
index 8e03a42..01217ca 100644
--- a/objectivec/Tests/GPBUnknownFieldSetTest.m
+++ b/objectivec/Tests/GPBUnknownFieldSetTest.m
@@ -60,93 +60,8 @@
   unknownFields_ = emptyMessage_.unknownFields;
 }
 
-- (void)testInvalidFieldNumber {
-  GPBUnknownFieldSet *set = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* field = [[[GPBUnknownField alloc] initWithNumber:0] autorelease];
-  XCTAssertThrowsSpecificNamed([set addField:field], NSException, NSInvalidArgumentException);
-}
-
-- (void)testEqualityAndHash {
-  // Empty
-
-  GPBUnknownFieldSet *set1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  XCTAssertTrue([set1 isEqual:set1]);
-  XCTAssertFalse([set1 isEqual:@"foo"]);
-  GPBUnknownFieldSet *set2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  XCTAssertEqualObjects(set1, set2);
-  XCTAssertEqual([set1 hash], [set2 hash]);
-
-  // Varint
-
-  GPBUnknownField* field1 = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
-  [field1 addVarint:1];
-  [set1 addField:field1];
-  XCTAssertNotEqualObjects(set1, set2);
-  GPBUnknownField* field2 = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
-  [field2 addVarint:1];
-  [set2 addField:field2];
-  XCTAssertEqualObjects(set1, set2);
-  XCTAssertEqual([set1 hash], [set2 hash]);
-
-  // Fixed32
-
-  field1 = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
-  [field1 addFixed32:2];
-  [set1 addField:field1];
-  XCTAssertNotEqualObjects(set1, set2);
-  field2 = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
-  [field2 addFixed32:2];
-  [set2 addField:field2];
-  XCTAssertEqualObjects(set1, set2);
-  XCTAssertEqual([set1 hash], [set2 hash]);
-
-  // Fixed64
-
-  field1 = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
-  [field1 addFixed64:3];
-  [set1 addField:field1];
-  XCTAssertNotEqualObjects(set1, set2);
-  field2 = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
-  [field2 addFixed64:3];
-  [set2 addField:field2];
-  XCTAssertEqualObjects(set1, set2);
-  XCTAssertEqual([set1 hash], [set2 hash]);
-
-  // LengthDelimited
-
-  field1 = [[[GPBUnknownField alloc] initWithNumber:4] autorelease];
-  [field1 addLengthDelimited:DataFromCStr("foo")];
-  [set1 addField:field1];
-  XCTAssertNotEqualObjects(set1, set2);
-  field2 = [[[GPBUnknownField alloc] initWithNumber:4] autorelease];
-  [field2 addLengthDelimited:DataFromCStr("foo")];
-  [set2 addField:field2];
-  XCTAssertEqualObjects(set1, set2);
-  XCTAssertEqual([set1 hash], [set2 hash]);
-
-  // Group
-
-  GPBUnknownFieldSet *group1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup1 = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
-  [fieldGroup1 addVarint:1];
-  [group1 addField:fieldGroup1];
-  GPBUnknownFieldSet *group2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup2 = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
-  [fieldGroup2 addVarint:1];
-  [group2 addField:fieldGroup2];
-
-  field1 = [[[GPBUnknownField alloc] initWithNumber:5] autorelease];
-  [field1 addGroup:group1];
-  [set1 addField:field1];
-  XCTAssertNotEqualObjects(set1, set2);
-  field2 = [[[GPBUnknownField alloc] initWithNumber:5] autorelease];
-  [field2 addGroup:group2];
-  [set2 addField:field2];
-  XCTAssertEqualObjects(set1, set2);
-  XCTAssertEqual([set1 hash], [set2 hash]);
-
-  // Exercise description for completeness.
-  XCTAssertTrue(set1.description.length > 10);
+- (GPBUnknownField *)getField:(int32_t)number {
+  return [unknownFields_ getField:number];
 }
 
 // Constructs a protocol buffer which contains fields with all the same
@@ -201,24 +116,6 @@
   field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
   [field addVarint:4];
   [set1 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:4] autorelease];
-  [field addFixed32:6];
-  [set1 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:5] autorelease];
-  [field addFixed64:20];
-  [set1 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
-  [field addLengthDelimited:DataFromCStr("data1")];
-  [set1 addField:field];
-
-  GPBUnknownFieldSet *group1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup1 = [[[GPBUnknownField alloc] initWithNumber:200] autorelease];
-  [fieldGroup1 addVarint:100];
-  [group1 addField:fieldGroup1];
-
-  field = [[[GPBUnknownField alloc] initWithNumber:11] autorelease];
-  [field addGroup:group1];
-  [set1 addField:field];
 
   GPBUnknownFieldSet* set2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
   field = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
@@ -227,63 +124,22 @@
   field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
   [field addVarint:3];
   [set2 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:4] autorelease];
-  [field addFixed32:7];
-  [set2 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:5] autorelease];
-  [field addFixed64:30];
-  [set2 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
-  [field addLengthDelimited:DataFromCStr("data2")];
-  [set2 addField:field];
-
-  GPBUnknownFieldSet *group2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup2 = [[[GPBUnknownField alloc] initWithNumber:201] autorelease];
-  [fieldGroup2 addVarint:99];
-  [group2 addField:fieldGroup2];
-
-  field = [[[GPBUnknownField alloc] initWithNumber:11] autorelease];
-  [field addGroup:group2];
-  [set2 addField:field];
 
   GPBUnknownFieldSet* set3 = [[[GPBUnknownFieldSet alloc] init] autorelease];
   field = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
   [field addVarint:1];
   [set3 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
-  [field addVarint:2];
-  [set3 addField:field];
   field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
   [field addVarint:4];
   [set3 addField:field];
+
+  GPBUnknownFieldSet* set4 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+  field = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
+  [field addVarint:2];
+  [set4 addField:field];
+  field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
   [field addVarint:3];
-  [set3 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:4] autorelease];
-  [field addFixed32:6];
-  [field addFixed32:7];
-  [set3 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:5] autorelease];
-  [field addFixed64:20];
-  [field addFixed64:30];
-  [set3 addField:field];
-  field = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
-  [field addLengthDelimited:DataFromCStr("data1")];
-  [field addLengthDelimited:DataFromCStr("data2")];
-  [set3 addField:field];
-
-  GPBUnknownFieldSet *group3a = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup3a1 = [[[GPBUnknownField alloc] initWithNumber:200] autorelease];
-  [fieldGroup3a1 addVarint:100];
-  [group3a addField:fieldGroup3a1];
-  GPBUnknownFieldSet *group3b = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup3b2 = [[[GPBUnknownField alloc] initWithNumber:201] autorelease];
-  [fieldGroup3b2 addVarint:99];
-  [group3b addField:fieldGroup3b2];
-
-  field = [[[GPBUnknownField alloc] initWithNumber:11] autorelease];
-  [field addGroup:group1];
-  [field addGroup:group3b];
-  [set3 addField:field];
+  [set4 addField:field];
 
   TestEmptyMessage* source1 = [TestEmptyMessage message];
   [source1 setUnknownFields:set1];
@@ -291,6 +147,8 @@
   [source2 setUnknownFields:set2];
   TestEmptyMessage* source3 = [TestEmptyMessage message];
   [source3 setUnknownFields:set3];
+  TestEmptyMessage* source4 = [TestEmptyMessage message];
+  [source4 setUnknownFields:set4];
 
   TestEmptyMessage* destination1 = [TestEmptyMessage message];
   [destination1 mergeFrom:source1];
@@ -298,10 +156,9 @@
 
   TestEmptyMessage* destination2 = [TestEmptyMessage message];
   [destination2 mergeFrom:source3];
+  [destination2 mergeFrom:source4];
 
   XCTAssertEqualObjects(destination1.data, destination2.data);
-  XCTAssertEqualObjects(destination1.data, source3.data);
-  XCTAssertEqualObjects(destination2.data, source3.data);
 }
 
 - (void)testClearMessage {
@@ -387,107 +244,6 @@
   XCTAssertEqual(0x7FFFFFFFFFFFFFFFULL, [field2.varintList valueAtIndex:0]);
 }
 
-#pragma mark - Field tests
-// Some tests directly on fields since the dictionary in FieldSet can gate
-// testing some of these.
-
-- (void)testFieldEqualityAndHash {
-  GPBUnknownField* field1 = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
-  XCTAssertTrue([field1 isEqual:field1]);
-  XCTAssertFalse([field1 isEqual:@"foo"]);
-  GPBUnknownField* field2 = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
-  XCTAssertNotEqualObjects(field1, field2);
-
-  field2 = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  // Varint
-
-  [field1 addVarint:10];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addVarint:10];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-  [field1 addVarint:11];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addVarint:11];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  // Fixed32
-
-  [field1 addFixed32:20];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addFixed32:20];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-  [field1 addFixed32:21];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addFixed32:21];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  // Fixed64
-
-  [field1 addFixed64:30];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addFixed64:30];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-  [field1 addFixed64:31];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addFixed64:31];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  // LengthDelimited
-
-  [field1 addLengthDelimited:DataFromCStr("foo")];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addLengthDelimited:DataFromCStr("foo")];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-  [field1 addLengthDelimited:DataFromCStr("bar")];
-  XCTAssertNotEqualObjects(field1, field2);
-  [field2 addLengthDelimited:DataFromCStr("bar")];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  // Group
-
-  GPBUnknownFieldSet *group = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  GPBUnknownField* fieldGroup = [[[GPBUnknownField alloc] initWithNumber:100] autorelease];
-  [fieldGroup addVarint:100];
-  [group addField:fieldGroup];
-  [field1 addGroup:group];
-  XCTAssertNotEqualObjects(field1, field2);
-  group = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  fieldGroup = [[[GPBUnknownField alloc] initWithNumber:100] autorelease];
-  [fieldGroup addVarint:100];
-  [group addField:fieldGroup];
-  [field2 addGroup:group];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  group = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  fieldGroup = [[[GPBUnknownField alloc] initWithNumber:101] autorelease];
-  [fieldGroup addVarint:101];
-  [group addField:fieldGroup];
-  [field1 addGroup:group];
-  XCTAssertNotEqualObjects(field1, field2);
-  group = [[[GPBUnknownFieldSet alloc] init] autorelease];
-  fieldGroup = [[[GPBUnknownField alloc] initWithNumber:101] autorelease];
-  [fieldGroup addVarint:101];
-  [group addField:fieldGroup];
-  [field2 addGroup:group];
-  XCTAssertEqualObjects(field1, field2);
-  XCTAssertEqual([field1 hash], [field2 hash]);
-
-  // Exercise description for completeness.
-  XCTAssertTrue(field1.description.length > 10);
-}
-
 - (void)testMergingFields {
   GPBUnknownField* field1 = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
   [field1 addVarint:1];
@@ -495,8 +251,9 @@
   [field1 addFixed64:3];
   [field1 addLengthDelimited:[NSData dataWithBytes:"hello" length:5]];
   [field1 addGroup:[[unknownFields_ copy] autorelease]];
-  GPBUnknownField* field2 = [[[GPBUnknownField alloc] initWithNumber:1] autorelease];
+  GPBUnknownField* field2 = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
   [field2 mergeFromField:field1];
+  XCTAssertEqualObjects(field1, field2);
 }
 
 @end
diff --git a/objectivec/Tests/GPBUtilitiesTests.m b/objectivec/Tests/GPBUtilitiesTests.m
index 2e206a5..ba1fc27 100644
--- a/objectivec/Tests/GPBUtilitiesTests.m
+++ b/objectivec/Tests/GPBUtilitiesTests.m
@@ -39,7 +39,6 @@
 #import "GPBDescriptor.h"
 #import "GPBDescriptor_PackagePrivate.h"
 #import "GPBMessage.h"
-#import "GPBUnknownField_PackagePrivate.h"
 
 #import "google/protobuf/MapUnittest.pbobjc.h"
 #import "google/protobuf/Unittest.pbobjc.h"
@@ -171,230 +170,4 @@
 
 // TODO(thomasvl): add test with extensions once those format with correct names.
 
-- (void)testSetRepeatedFields {
-  TestAllTypes *message = [TestAllTypes message];
-
-  NSDictionary *repeatedFieldValues = @{
-    @"repeatedStringArray" : [@[@"foo", @"bar"] mutableCopy],
-    @"repeatedBoolArray" : [GPBBoolArray arrayWithValue:YES],
-    @"repeatedInt32Array" : [GPBInt32Array arrayWithValue:14],
-    @"repeatedInt64Array" : [GPBInt64Array arrayWithValue:15],
-    @"repeatedUint32Array" : [GPBUInt32Array arrayWithValue:16],
-    @"repeatedUint64Array" : [GPBUInt64Array arrayWithValue:16],
-    @"repeatedFloatArray" : [GPBFloatArray arrayWithValue:16],
-    @"repeatedDoubleArray" : [GPBDoubleArray arrayWithValue:16],
-    @"repeatedNestedEnumArray" :
-        [GPBEnumArray arrayWithValidationFunction:TestAllTypes_NestedEnum_IsValidValue
-                                         rawValue:TestAllTypes_NestedEnum_Foo],
-  };
-  for (NSString *fieldName in repeatedFieldValues) {
-    GPBFieldDescriptor *field =
-        [message.descriptor fieldWithName:fieldName];
-    XCTAssertNotNil(field, @"No field with name: %@", fieldName);
-    id expectedValues = repeatedFieldValues[fieldName];
-    GPBSetMessageRepeatedField(message, field, expectedValues);
-    XCTAssertEqualObjects(expectedValues,
-                          [message valueForKeyPath:fieldName]);
-  }
-}
-
-// Helper to make an unknown field set with something in it.
-static GPBUnknownFieldSet *UnknownFieldsSetHelper(int num) {
-  GPBUnknownFieldSet *result =
-      [[[GPBUnknownFieldSet alloc] init] autorelease];
-
-  GPBUnknownField *field =
-      [[[GPBUnknownField alloc] initWithNumber:num] autorelease];
-  [field addVarint:num];
-  [result addField:field];
-
-  return result;
-}
-
-- (void)testDropMessageUnknownFieldsRecursively {
-  TestAllExtensions *message = [TestAllExtensions message];
-
-  // Give it unknownFields.
-  message.unknownFields = UnknownFieldsSetHelper(777);
-
-  // Given it extensions that include a message with unknown fields of its own.
-  {
-    // Int
-    [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
-
-    // Group
-    OptionalGroup_extension *optionalGroup = [OptionalGroup_extension message];
-    optionalGroup.a = 123;
-    optionalGroup.unknownFields = UnknownFieldsSetHelper(779);
-    [message setExtension:[UnittestRoot optionalGroupExtension]
-                    value:optionalGroup];
-
-    // Message
-    TestAllTypes_NestedMessage *nestedMessage =
-        [TestAllTypes_NestedMessage message];
-    nestedMessage.bb = 456;
-    nestedMessage.unknownFields = UnknownFieldsSetHelper(778);
-    [message setExtension:[UnittestRoot optionalNestedMessageExtension]
-                    value:nestedMessage];
-
-    // Repeated Group
-    RepeatedGroup_extension *repeatedGroup =
-      [[RepeatedGroup_extension alloc] init];
-    repeatedGroup.a = 567;
-    repeatedGroup.unknownFields = UnknownFieldsSetHelper(780);
-    [message addExtension:[UnittestRoot repeatedGroupExtension]
-                    value:repeatedGroup];
-    [repeatedGroup release];
-
-    // Repeated Message
-    nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
-    nestedMessage.bb = 678;
-    nestedMessage.unknownFields = UnknownFieldsSetHelper(781);
-    [message addExtension:[UnittestRoot repeatedNestedMessageExtension]
-                    value:nestedMessage];
-    [nestedMessage release];
-  }
-
-  // Confirm everything is there.
-
-  XCTAssertNotNil(message);
-  XCTAssertNotNil(message.unknownFields);
-  XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt32Extension]]);
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot optionalGroupExtension]]);
-    OptionalGroup_extension *optionalGroup =
-        [message getExtension:[UnittestRoot optionalGroupExtension]];
-    XCTAssertNotNil(optionalGroup);
-    XCTAssertEqual(optionalGroup.a, 123);
-    XCTAssertNotNil(optionalGroup.unknownFields);
-  }
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
-    TestAllTypes_NestedMessage *nestedMessage =
-        [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
-    XCTAssertNotNil(nestedMessage);
-    XCTAssertEqual(nestedMessage.bb, 456);
-    XCTAssertNotNil(nestedMessage.unknownFields);
-  }
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedGroupExtension]]);
-    NSArray *repeatedGroups = [message getExtension:[UnittestRoot repeatedGroupExtension]];
-    XCTAssertEqual(repeatedGroups.count, (NSUInteger)1);
-    RepeatedGroup_extension *repeatedGroup = repeatedGroups.firstObject;
-    XCTAssertNotNil(repeatedGroup);
-    XCTAssertEqual(repeatedGroup.a, 567);
-    XCTAssertNotNil(repeatedGroup.unknownFields);
-  }
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedNestedMessageExtension]]);
-    NSArray *repeatedNestedMessages = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
-    XCTAssertEqual(repeatedNestedMessages.count, (NSUInteger)1);
-    TestAllTypes_NestedMessage *repeatedNestedMessage = repeatedNestedMessages.firstObject;
-    XCTAssertNotNil(repeatedNestedMessage);
-    XCTAssertEqual(repeatedNestedMessage.bb, 678);
-    XCTAssertNotNil(repeatedNestedMessage.unknownFields);
-  }
-
-  // Drop them.
-  GPBMessageDropUnknownFieldsRecursively(message);
-
-  // Confirm unknowns are gone from within the messages.
-
-  XCTAssertNotNil(message);
-  XCTAssertNil(message.unknownFields);
-  XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt32Extension]]);
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot optionalGroupExtension]]);
-    OptionalGroup_extension *optionalGroup =
-        [message getExtension:[UnittestRoot optionalGroupExtension]];
-    XCTAssertNotNil(optionalGroup);
-    XCTAssertEqual(optionalGroup.a, 123);
-    XCTAssertNil(optionalGroup.unknownFields);
-  }
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
-    TestAllTypes_NestedMessage *nestedMessage =
-        [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
-    XCTAssertNotNil(nestedMessage);
-    XCTAssertEqual(nestedMessage.bb, 456);
-    XCTAssertNil(nestedMessage.unknownFields);
-  }
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedGroupExtension]]);
-    NSArray *repeatedGroups = [message getExtension:[UnittestRoot repeatedGroupExtension]];
-    XCTAssertEqual(repeatedGroups.count, (NSUInteger)1);
-    RepeatedGroup_extension *repeatedGroup = repeatedGroups.firstObject;
-    XCTAssertNotNil(repeatedGroup);
-    XCTAssertEqual(repeatedGroup.a, 567);
-    XCTAssertNil(repeatedGroup.unknownFields);
-  }
-
-  {
-    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedNestedMessageExtension]]);
-    NSArray *repeatedNestedMessages = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
-    XCTAssertEqual(repeatedNestedMessages.count, (NSUInteger)1);
-    TestAllTypes_NestedMessage *repeatedNestedMessage = repeatedNestedMessages.firstObject;
-    XCTAssertNotNil(repeatedNestedMessage);
-    XCTAssertEqual(repeatedNestedMessage.bb, 678);
-    XCTAssertNil(repeatedNestedMessage.unknownFields);
-  }
-
-}
-
-- (void)testDropMessageUnknownFieldsRecursively_Maps {
-  TestMap *message = [TestMap message];
-
-  {
-    ForeignMessage *foreignMessage = [ForeignMessage message];
-    foreignMessage.unknownFields = UnknownFieldsSetHelper(100);
-    [message.mapInt32ForeignMessage setObject:foreignMessage forKey:100];
-
-    foreignMessage = [ForeignMessage message];
-    foreignMessage.unknownFields = UnknownFieldsSetHelper(101);
-    [message.mapStringForeignMessage setObject:foreignMessage forKey:@"101"];
-  }
-
-  // Confirm everything is there.
-
-  XCTAssertNotNil(message);
-
-  {
-    ForeignMessage *foreignMessage = [message.mapInt32ForeignMessage objectForKey:100];
-    XCTAssertNotNil(foreignMessage);
-    XCTAssertNotNil(foreignMessage.unknownFields);
-  }
-
-  {
-    ForeignMessage *foreignMessage = [message.mapStringForeignMessage objectForKey:@"101"];
-    XCTAssertNotNil(foreignMessage);
-    XCTAssertNotNil(foreignMessage.unknownFields);
-  }
-
-  GPBMessageDropUnknownFieldsRecursively(message);
-
-  // Confirm unknowns are gone from within the messages.
-
-  XCTAssertNotNil(message);
-
-  {
-    ForeignMessage *foreignMessage = [message.mapInt32ForeignMessage objectForKey:100];
-    XCTAssertNotNil(foreignMessage);
-    XCTAssertNil(foreignMessage.unknownFields);
-  }
-
-  {
-    ForeignMessage *foreignMessage = [message.mapStringForeignMessage objectForKey:@"101"];
-    XCTAssertNotNil(foreignMessage);
-    XCTAssertNil(foreignMessage.unknownFields);
-  }
-
-}
-
 @end
diff --git a/objectivec/Tests/GPBWellKnownTypesTest.m b/objectivec/Tests/GPBWellKnownTypesTest.m
index 592d5af..78f4e63 100644
--- a/objectivec/Tests/GPBWellKnownTypesTest.m
+++ b/objectivec/Tests/GPBWellKnownTypesTest.m
@@ -32,8 +32,8 @@
 
 #import <XCTest/XCTest.h>
 
-#import "GPBTestUtilities.h"
-#import "google/protobuf/AnyTest.pbobjc.h"
+// A basically random interval into the future for testing with.
+static const NSTimeInterval kFutureOffsetInterval = 15000;
 
 // Nanosecond time accuracy
 static const NSTimeInterval kTimeAccuracy = 1e-9;
@@ -44,171 +44,59 @@
 @implementation WellKnownTypesTest
 
 - (void)testTimeStamp {
-  // Test negative and positive values.
-  NSTimeInterval values[] = {
-      -428027599.483999967, -1234567.0, -0.5, 0, 0.75, 54321.0, 2468086,483999967
-  };
-  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
-    NSTimeInterval value = values[i];
+  // Test Creation.
+  NSDate *date = [NSDate date];
+  GPBTimestamp *timeStamp = [[GPBTimestamp alloc] initWithDate:date];
+  NSDate *timeStampDate = timeStamp.date;
 
-    // Test Creation - date.
-    NSDate *date = [NSDate dateWithTimeIntervalSince1970:value];
-    GPBTimestamp *timeStamp = [[GPBTimestamp alloc] initWithDate:date];
+  // Comparing timeIntervals instead of directly comparing dates because date
+  // equality requires the time intervals to be exactly the same, and the
+  // timeintervals go through a bit of floating point error as they are
+  // converted back and forth from the internal representation.
+  XCTAssertEqualWithAccuracy(date.timeIntervalSince1970,
+                             timeStampDate.timeIntervalSince1970,
+                             kTimeAccuracy);
 
-    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
-                                @"Offset %f - Date: %@", (double)value, date);
-    XCTAssertLessThan(timeStamp.nanos, 1e9,
-                      @"Offset %f - Date: %@", (double)value, date);
+  NSTimeInterval time = [date timeIntervalSince1970];
+  GPBTimestamp *timeStamp2 =
+      [[GPBTimestamp alloc] initWithTimeIntervalSince1970:time];
+  NSTimeInterval durationTime = timeStamp2.timeIntervalSince1970;
+  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
+  [timeStamp release];
 
-    // Comparing timeIntervals instead of directly comparing dates because date
-    // equality requires the time intervals to be exactly the same, and the
-    // timeintervals go through a bit of floating point error as they are
-    // converted back and forth from the internal representation.
-    XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
-                               kTimeAccuracy,
-                               @"Offset %f - Date: %@", (double)value, date);
-    [timeStamp release];
+  // Test Mutation.
+  date = [NSDate dateWithTimeIntervalSinceNow:kFutureOffsetInterval];
+  timeStamp2.date = date;
+  timeStampDate = timeStamp2.date;
+  XCTAssertEqualWithAccuracy(date.timeIntervalSince1970,
+                             timeStampDate.timeIntervalSince1970,
+                             kTimeAccuracy);
 
-    // Test Creation - timeIntervalSince1970.
-    timeStamp = [[GPBTimestamp alloc] initWithTimeIntervalSince1970:value];
-
-    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
-                                @"Offset %f - Date: %@", (double)value, date);
-    XCTAssertLessThan(timeStamp.nanos, 1e9,
-                      @"Offset %f - Date: %@", (double)value, date);
-
-    XCTAssertEqualWithAccuracy(value, timeStamp.timeIntervalSince1970,
-                               kTimeAccuracy,
-                               @"Offset %f - Date: %@", (double)value, date);
-    [timeStamp release];
-
-    // Test Mutation - date.
-    timeStamp = [[GPBTimestamp alloc] init];
-    timeStamp.date = date;
-
-    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
-                                @"Offset %f - Date: %@", (double)value, date);
-    XCTAssertLessThan(timeStamp.nanos, 1e9,
-                      @"Offset %f - Date: %@", (double)value, date);
-
-    XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
-                               kTimeAccuracy,
-                               @"Offset %f - Date: %@", (double)value, date);
-    [timeStamp release];
-
-    // Test Mutation - timeIntervalSince1970.
-    timeStamp = [[GPBTimestamp alloc] init];
-    timeStamp.timeIntervalSince1970 = value;
-
-    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
-                                @"Offset %f - Date: %@", (double)value, date);
-    XCTAssertLessThan(timeStamp.nanos, 1e9,
-                      @"Offset %f - Date: %@", (double)value, date);
-
-    XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
-                               kTimeAccuracy,
-                               @"Offset %f - Date: %@", (double)value, date);
-
-    [timeStamp release];
-  }
+  time = date.timeIntervalSince1970;
+  timeStamp2.timeIntervalSince1970 = time;
+  durationTime = timeStamp2.timeIntervalSince1970;
+  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
+  [timeStamp2 release];
 }
 
 - (void)testDuration {
-  // Test negative and positive values.
-  NSTimeInterval values[] = { -1000.0001, -500.0, -0.5, 0, 0.75, 1000.0, 2000.0002 };
-  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
-    NSTimeInterval value = values[i];
+  // Test Creation.
+  NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
+  GPBDuration *duration =
+      [[GPBDuration alloc] initWithTimeIntervalSince1970:time];
+  NSTimeInterval durationTime = duration.timeIntervalSince1970;
+  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
+  [duration release];
 
-    // Test Creation.
-    GPBDuration *duration =
-        [[GPBDuration alloc] initWithTimeInterval:value];
-    XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy,
-                               @"For interval %f", (double)value);
-    if (value > 0) {
-      XCTAssertGreaterThanOrEqual(duration.seconds, 0,
-                                  @"For interval %f", (double)value);
-      XCTAssertGreaterThanOrEqual(duration.nanos, 0,
-                                  @"For interval %f", (double)value);
-    } else {
-      XCTAssertLessThanOrEqual(duration.seconds, 0,
-                               @"For interval %f", (double)value);
-      XCTAssertLessThanOrEqual(duration.nanos, 0,
-                               @"For interval %f", (double)value);
-    }
-    [duration release];
-
-    // Test Mutation.
-    duration = [[GPBDuration alloc] init];
-    duration.timeInterval = value;
-    XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy,
-                               @"For interval %f", (double)value);
-    if (value > 0) {
-      XCTAssertGreaterThanOrEqual(duration.seconds, 0,
-                                  @"For interval %f", (double)value);
-      XCTAssertGreaterThanOrEqual(duration.nanos, 0,
-                                  @"For interval %f", (double)value);
-    } else {
-      XCTAssertLessThanOrEqual(duration.seconds, 0,
-                               @"For interval %f", (double)value);
-      XCTAssertLessThanOrEqual(duration.nanos, 0,
-                               @"For interval %f", (double)value);
-    }
-    [duration release];
-  }
-}
-
-- (void)testAnyHelpers {
-
-  // Set and extract covers most of the code.
-
-  TestAny *subMessage = [TestAny message];
-  subMessage.int32Value = 12345;
-  TestAny *message = [TestAny message];
-  NSError *err = nil;
-  message.anyValue = [GPBAny anyWithMessage:subMessage error:&err];
-  XCTAssertNil(err);
-
-  NSData *data = message.data;
-  XCTAssertNotNil(data);
-
-  TestAny *message2 = [TestAny parseFromData:data error:&err];
-  XCTAssertNil(err);
-  XCTAssertNotNil(message2);
-  XCTAssertTrue(message2.hasAnyValue);
-
-  TestAny *subMessage2 =
-      (TestAny *)[message.anyValue unpackMessageClass:[TestAny class]
-                                                error:&err];
-  XCTAssertNil(err);
-  XCTAssertNotNil(subMessage2);
-  XCTAssertEqual(subMessage2.int32Value, 12345);
-
-  // NULL errorPtr in the two calls.
-
-  message.anyValue = [GPBAny anyWithMessage:subMessage error:NULL];
-  NSData *data2 = message.data;
-  XCTAssertEqualObjects(data2, data);
-
-  TestAny *subMessage3 =
-      (TestAny *)[message.anyValue unpackMessageClass:[TestAny class]
-                                                error:NULL];
-  XCTAssertNotNil(subMessage3);
-  XCTAssertEqualObjects(subMessage2, subMessage3);
-
-  // Try to extract wrong type.
-
-  GPBTimestamp *wrongMessage =
-      (GPBTimestamp *)[message.anyValue unpackMessageClass:[GPBTimestamp class]
-                                                     error:&err];
-  XCTAssertNotNil(err);
-  XCTAssertNil(wrongMessage);
-  XCTAssertEqualObjects(err.domain, GPBWellKnownTypesErrorDomain);
-  XCTAssertEqual(err.code, GPBWellKnownTypesErrorCodeTypeURLMismatch);
-
-  wrongMessage =
-      (GPBTimestamp *)[message.anyValue unpackMessageClass:[GPBTimestamp class]
-                                                     error:NULL];
-  XCTAssertNil(wrongMessage);
+  // Test Mutation.
+  GPBDuration *duration2 =
+      [[GPBDuration alloc] initWithTimeIntervalSince1970:time];
+  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:kFutureOffsetInterval];
+  time = date.timeIntervalSince1970;
+  duration2.timeIntervalSince1970 = time;
+  durationTime = duration2.timeIntervalSince1970;
+  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
+  [duration2 release];
 }
 
 @end
diff --git a/objectivec/Tests/GPBWireFormatTests.m b/objectivec/Tests/GPBWireFormatTests.m
index dbeab21..2a406f1 100644
--- a/objectivec/Tests/GPBWireFormatTests.m
+++ b/objectivec/Tests/GPBWireFormatTests.m
@@ -46,7 +46,6 @@
   TestAllTypes* message = [self allSetRepeatedCount:kGPBDefaultRepeatCount];
 
   NSData* rawBytes = message.data;
-  [self assertFieldsInOrder:rawBytes];
   XCTAssertEqual(message.serializedSize, (size_t)rawBytes.length);
 
   TestAllTypes* message2 = [TestAllTypes parseFromData:rawBytes error:NULL];
@@ -59,7 +58,6 @@
       [self packedSetRepeatedCount:kGPBDefaultRepeatCount];
 
   NSData* rawBytes = message.data;
-  [self assertFieldsInOrder:rawBytes];
   XCTAssertEqual(message.serializedSize, (size_t)rawBytes.length);
 
   TestPackedTypes* message2 =
@@ -76,7 +74,6 @@
   TestAllExtensions* message =
       [self allExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
   NSData* rawBytes = message.data;
-  [self assertFieldsInOrder:rawBytes];
   XCTAssertEqual(message.serializedSize, (size_t)rawBytes.length);
 
   TestAllTypes* message2 = [TestAllTypes parseFromData:rawBytes error:NULL];
@@ -90,7 +87,6 @@
   TestPackedExtensions* message =
       [self packedExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
   NSData* rawBytes = message.data;
-  [self assertFieldsInOrder:rawBytes];
 
   TestPackedTypes* message2 =
       [self packedSetRepeatedCount:kGPBDefaultRepeatCount];
@@ -106,7 +102,6 @@
 
   TestAllTypes* message = [self allSetRepeatedCount:kGPBDefaultRepeatCount];
   NSData* rawBytes = message.data;
-  [self assertFieldsInOrder:rawBytes];
 
   GPBExtensionRegistry* registry = [self extensionRegistry];
 
@@ -118,7 +113,7 @@
 }
 
 
-- (void)testExtensionsSerializedSize {
+- (void) testExtensionsSerializedSize {
   size_t allSet = [self allSetRepeatedCount:kGPBDefaultRepeatCount].serializedSize;
   size_t extensionSet = [self allExtensionsSetRepeatedCount:kGPBDefaultRepeatCount].serializedSize;
   XCTAssertEqual(allSet, extensionSet);
@@ -129,7 +124,6 @@
   TestPackedExtensions* message =
       [self packedExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
   NSData* rawBytes = message.data;
-  [self assertFieldsInOrder:rawBytes];
 
   GPBExtensionRegistry* registry = [self extensionRegistry];
 
diff --git a/objectivec/Tests/unittest_cycle.proto b/objectivec/Tests/unittest_cycle.proto
index afc1b0f..5f6f56a 100644
--- a/objectivec/Tests/unittest_cycle.proto
+++ b/objectivec/Tests/unittest_cycle.proto
@@ -31,8 +31,10 @@
 
 package protobuf_unittest;
 
-// Cycles in the Message graph can cause problems for message class
-// initialization order.
+// Cycles in the Message graph can cause problems for the mutable classes
+// since the properties on the mutable class change types. This file just
+// needs to generate source, and that source must compile, to ensure the
+// generated source works for this sort of case.
 
 // You can't make a object graph that spans files, so this can only be done
 // within a single proto file.
diff --git a/objectivec/Tests/unittest_deprecated.proto b/objectivec/Tests/unittest_deprecated.proto
deleted file mode 100644
index 96a52bb..0000000
--- a/objectivec/Tests/unittest_deprecated.proto
+++ /dev/null
@@ -1,95 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_deprecated;
-option objc_class_prefix = "Dep";
-
-//
-// This file is like unittest_deprecated_file.proto, but uses message, enum,
-// enum value, and field level deprecation.
-//
-// The source generated from this file needs to be inspect to confirm it has
-// all of the expected annotations. It also will be compiled into the unittest
-// and that compile should be clean without errors.
-//
-
-// Mix of field types marked as deprecated.
-message Msg1 {
-  extensions 100 to max;
-
-  optional string string_field = 1 [deprecated=true];
-  required int32 int_field = 2 [deprecated=true];
-  repeated fixed32 fixed_field = 3 [deprecated=true];
-  optional Msg1 msg_field = 4 [deprecated=true];
-}
-
-// Mix of extension field types marked as deprecated.
-extend Msg1 {
-  optional string string_ext_field = 101 [deprecated=true];
-  optional int32 int_ext_field = 102 [deprecated=true];
-  repeated fixed32 fixed_ext_field = 103 [deprecated=true];
-  optional Msg1 msg_ext_field = 104 [deprecated=true];
-}
-
-// Mix of extension field types (scoped to a message) marked as deprecated.
-message Msg1A {
-  extend Msg1 {
-    optional string string_ext2_field = 201 [deprecated=true];
-    optional int32 int_ext2_field = 202 [deprecated=true];
-    repeated fixed32 fixed_ext2_field = 203 [deprecated=true];
-    optional Msg1 msg_ext2_field = 204 [deprecated=true];
-  }
-}
-
-// Enum value marked as deprecated.
-enum Enum1 {
-  ENUM1_ONE   = 1;
-  ENUM1_TWO   = 2;
-  ENUM1_THREE = 3 [deprecated=true];
-}
-
-// Message marked as deprecated.
-message Msg2 {
-  option deprecated = true;
-
-  optional string string_field = 1;
-  required int32 int_field = 2;
-  repeated fixed32 fixed_field = 3;
-}
-
-// Enum marked as deprecated.
-enum Enum2 {
-  option deprecated = true;
-
-  ENUM2_ONE   = 1;
-  ENUM2_TWO   = 2;
-  ENUM2_THREE = 3;
-}
diff --git a/objectivec/Tests/unittest_deprecated_file.proto b/objectivec/Tests/unittest_deprecated_file.proto
deleted file mode 100644
index ef92e7d..0000000
--- a/objectivec/Tests/unittest_deprecated_file.proto
+++ /dev/null
@@ -1,76 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_deprecated_file;
-option objc_class_prefix = "FileDep";
-
-//
-// This file is like unittest_deprecated.proto, but does NOT use message, enum,
-// enum value, or field level deprecation; instead it uses the file level option
-// to mark everything.
-//
-// The source generated from this file needs to be inspect to confirm it has
-// all of the expected annotations. It also will be compiled into the unittest
-// and that compile should be clean without errors.
-//
-option deprecated = true;
-
-// Message to catch the deprecation.
-message Msg1 {
-  extensions 100 to max;
-
-  optional string string_field = 1;
-}
-
-// Mix of extension field types to catch the deprecation.
-extend Msg1 {
-  optional string string_ext_field = 101;
-  optional int32 int_ext_field = 102;
-  repeated fixed32 fixed_ext_field = 103;
-  optional Msg1 msg_ext_field = 104;
-}
-
-// Mix of extension field types (scoped to a message) to catch the deprecation.
-message Msg1A {
-  extend Msg1 {
-    optional string string_ext2_field = 201;
-    optional int32 int_ext2_field = 202;
-    repeated fixed32 fixed_ext2_field = 203;
-    optional Msg1 msg_ext2_field = 204;
-  }
-}
-
-// Enum to catch the deprecation.
-enum Enum1 {
-  ENUM1_ONE   = 1;
-  ENUM1_TWO   = 2;
-  ENUM1_THREE = 3;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_a.proto b/objectivec/Tests/unittest_extension_chain_a.proto
deleted file mode 100644
index 6a227eb..0000000
--- a/objectivec/Tests/unittest_extension_chain_a.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-import "unittest_extension_chain_b.proto";
-import "unittest_extension_chain_c.proto";
-import "unittest_extension_chain_d.proto";
-
-// The Root for this file should end up adding the local extension and merging
-// in the extensions from D's Root (unittest and C will come via D's).
-
-message ChainAMessage {
-  optional ChainBMessage b = 1;
-  optional ChainCMessage c = 2;
-  optional ChainDMessage d = 3;
-}
-
-extend TestAllExtensions {
-  optional int32 chain_a_extension = 10001;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_b.proto b/objectivec/Tests/unittest_extension_chain_b.proto
deleted file mode 100644
index 0da7ed3..0000000
--- a/objectivec/Tests/unittest_extension_chain_b.proto
+++ /dev/null
@@ -1,47 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-import "unittest_extension_chain_c.proto";
-
-// The Root for this file should end up adding the local extension and merging
-// in the extensions from C's Root (unittest will come via C's).
-
-message ChainBMessage {
-  optional ChainCMessage c = 1;
-}
-
-extend TestAllExtensions {
-  optional int32 chain_b_extension = 10002;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_c.proto b/objectivec/Tests/unittest_extension_chain_c.proto
deleted file mode 100644
index c702900..0000000
--- a/objectivec/Tests/unittest_extension_chain_c.proto
+++ /dev/null
@@ -1,45 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-// The Root for this file should end up adding the local extension and merging
-// in the extensions from unittest.proto's Root.
-
-message ChainCMessage {
-  optional int32 my_field = 1;
-}
-
-extend TestAllExtensions {
-  optional int32 chain_c_extension = 10003;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_d.proto b/objectivec/Tests/unittest_extension_chain_d.proto
deleted file mode 100644
index f9abe3b..0000000
--- a/objectivec/Tests/unittest_extension_chain_d.proto
+++ /dev/null
@@ -1,49 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-import "unittest_extension_chain_b.proto";
-import "unittest_extension_chain_c.proto";
-
-// The root should end up needing to merge B (C will be merged into B, so it
-// doesn't need to be directly merged).
-
-message ChainDMessage {
-  optional ChainBMessage b = 1;
-  optional ChainCMessage c = 2;
-}
-
-extend TestAllExtensions {
-  optional int32 chain_d_extension = 10004;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_e.proto b/objectivec/Tests/unittest_extension_chain_e.proto
deleted file mode 100644
index fe11663..0000000
--- a/objectivec/Tests/unittest_extension_chain_e.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "google/protobuf/unittest.proto";
-
-// The Root for this file should end up just merging in unittest's Root.
-
-message ChainEMessage {
-  optional TestAllTypes my_field = 1;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_f.proto b/objectivec/Tests/unittest_extension_chain_f.proto
deleted file mode 100644
index b9bed72..0000000
--- a/objectivec/Tests/unittest_extension_chain_f.proto
+++ /dev/null
@@ -1,44 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "unittest_extension_chain_g.proto";
-
-// The Root for this file should just be merging in the extensions from C's
-// Root (because G doens't define anything itself).
-
-// The generated source will also have to directly import C's .h file so it can
-// compile the reference to C's Root class.
-
-message ChainFMessage {
-  optional ChainGMessage g = 1;
-}
diff --git a/objectivec/Tests/unittest_extension_chain_g.proto b/objectivec/Tests/unittest_extension_chain_g.proto
deleted file mode 100644
index aee827b..0000000
--- a/objectivec/Tests/unittest_extension_chain_g.proto
+++ /dev/null
@@ -1,41 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2016 Google Inc.  All rights reserved.
-//
-// 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 = "proto2";
-
-package protobuf_unittest;
-
-import "unittest_extension_chain_c.proto";
-
-// The Root for this file should just be merging in the extensions from C's
-// Root.
-
-message ChainGMessage {
-  optional ChainCMessage c = 1;
-}
diff --git a/objectivec/Tests/unittest_objc.proto b/objectivec/Tests/unittest_objc.proto
index e5577fa..f6ab6a2 100644
--- a/objectivec/Tests/unittest_objc.proto
+++ b/objectivec/Tests/unittest_objc.proto
@@ -29,20 +29,10 @@
 
 syntax = "proto2";
 
-import "google/protobuf/any.proto";
 import "google/protobuf/unittest.proto";
 
 package protobuf_unittest;
 
-// Used to check that Headerdocs and appledoc work correctly. If these comments
-// are not handled correctly, Xcode will fail to build the tests.
-message TestGeneratedComments {
-  // This is a string that could contain stuff like
-  // mime types as image/* or */plain. Maybe twitter usernames
-  // like @protobuf, @google or @something.
-  optional string string_field = 1;
-}
-
 // Using the messages in unittest.proto, setup for recursive cases for testing
 // extensions at various depths.
 extend TestAllExtensions {
@@ -457,11 +447,3 @@
   optional bool bool_field_31 = 31;
   optional bool bool_field_32 = 32;
 }
-
-// Reference to a WKT to test (via generated code inspection), the handling
-// of #imports.  Within the WKTs, references to each other are just path
-// based imports, but when reference from another proto file, they should be
-// conditional to support the framework import style.
-message WKTRefereceMessage {
-  optional google.protobuf.Any an_any = 1;
-}
diff --git a/objectivec/google/protobuf/Any.pbobjc.h b/objectivec/google/protobuf/Any.pbobjc.h
index b17e76f..4002a98 100644
--- a/objectivec/google/protobuf/Any.pbobjc.h
+++ b/objectivec/google/protobuf/Any.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/any.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,16 +18,14 @@
 
 #pragma mark - GPBAnyRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBAnyRoot : GPBRootObject
 @end
 
@@ -51,115 +36,91 @@
   GPBAny_FieldNumber_Value = 2,
 };
 
-/**
- * `Any` contains an arbitrary serialized protocol buffer message along with a
- * URL that describes the type of the serialized message.
- *
- * Protobuf library provides support to pack/unpack Any values in the form
- * of utility functions or additional generated methods of the Any type.
- *
- * Example 1: Pack and unpack a message in C++.
- *
- *     Foo foo = ...;
- *     Any any;
- *     any.PackFrom(foo);
- *     ...
- *     if (any.UnpackTo(&foo)) {
- *       ...
- *     }
- *
- * Example 2: Pack and unpack a message in Java.
- *
- *     Foo foo = ...;
- *     Any any = Any.pack(foo);
- *     ...
- *     if (any.is(Foo.class)) {
- *       foo = any.unpack(Foo.class);
- *     }
- *
- *  Example 3: Pack and unpack a message in Python.
- *
- *     foo = Foo(...)
- *     any = Any()
- *     any.Pack(foo)
- *     ...
- *     if any.Is(Foo.DESCRIPTOR):
- *       any.Unpack(foo)
- *       ...
- *
- *  Example 4: Pack and unpack a message in Go
- *
- *      foo := &pb.Foo{...}
- *      any, err := ptypes.MarshalAny(foo)
- *      ...
- *      foo := &pb.Foo{}
- *      if err := ptypes.UnmarshalAny(any, foo); err != nil {
- *        ...
- *      }
- *
- * The pack methods provided by protobuf library will by default use
- * 'type.googleapis.com/full.type.name' as the type URL and the unpack
- * methods only use the fully qualified type name after the last '/'
- * in the type URL, for example "foo.bar.com/x/y.z" will yield type
- * name "y.z".
- *
- *
- * JSON
- * ====
- * The JSON representation of an `Any` value uses the regular
- * representation of the deserialized, embedded message, with an
- * additional field `\@type` which contains the type URL. Example:
- *
- *     package google.profile;
- *     message Person {
- *       string first_name = 1;
- *       string last_name = 2;
- *     }
- *
- *     {
- *       "\@type": "type.googleapis.com/google.profile.Person",
- *       "firstName": <string>,
- *       "lastName": <string>
- *     }
- *
- * If the embedded message type is well-known and has a custom JSON
- * representation, that representation will be embedded adding a field
- * `value` which holds the custom JSON in addition to the `\@type`
- * field. Example (for message [google.protobuf.Duration][]):
- *
- *     {
- *       "\@type": "type.googleapis.com/google.protobuf.Duration",
- *       "value": "1.212s"
- *     }
- **/
+/// `Any` contains an arbitrary serialized protocol buffer message along with a
+/// URL that describes the type of the serialized message.
+///
+/// Protobuf library provides support to pack/unpack Any values in the form
+/// of utility functions or additional generated methods of the Any type.
+///
+/// Example 1: Pack and unpack a message in C++.
+///
+///     Foo foo = ...;
+///     Any any;
+///     any.PackFrom(foo);
+///     ...
+///     if (any.UnpackTo(&foo)) {
+///       ...
+///     }
+///
+/// Example 2: Pack and unpack a message in Java.
+///
+///     Foo foo = ...;
+///     Any any = Any.pack(foo);
+///     ...
+///     if (any.is(Foo.class)) {
+///       foo = any.unpack(Foo.class);
+///     }
+///
+/// The pack methods provided by protobuf library will by default use
+/// 'type.googleapis.com/full.type.name' as the type URL and the unpack
+/// methods only use the fully qualified type name after the last '/'
+/// in the type URL, for example "foo.bar.com/x/y.z" will yield type
+/// name "y.z".
+///
+///
+/// JSON
+/// ====
+/// The JSON representation of an `Any` value uses the regular
+/// representation of the deserialized, embedded message, with an
+/// additional field `\@type` which contains the type URL. Example:
+///
+///     package google.profile;
+///     message Person {
+///       string first_name = 1;
+///       string last_name = 2;
+///     }
+///
+///     {
+///       "\@type": "type.googleapis.com/google.profile.Person",
+///       "firstName": <string>,
+///       "lastName": <string>
+///     }
+///
+/// If the embedded message type is well-known and has a custom JSON
+/// representation, that representation will be embedded adding a field
+/// `value` which holds the custom JSON in addition to the `\@type`
+/// field. Example (for message [google.protobuf.Duration][]):
+///
+///     {
+///       "\@type": "type.googleapis.com/google.protobuf.Duration",
+///       "value": "1.212s"
+///     }
 @interface GPBAny : GPBMessage
 
-/**
- * A URL/resource name whose content describes the type of the
- * serialized protocol buffer message.
- *
- * For URLs which use the scheme `http`, `https`, or no scheme, the
- * following restrictions and interpretations apply:
- *
- * * If no scheme is provided, `https` is assumed.
- * * The last segment of the URL's path must represent the fully
- *   qualified name of the type (as in `path/google.protobuf.Duration`).
- *   The name should be in a canonical form (e.g., leading "." is
- *   not accepted).
- * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
- *   value in binary format, or produce an error.
- * * Applications are allowed to cache lookup results based on the
- *   URL, or have them precompiled into a binary to avoid any
- *   lookup. Therefore, binary compatibility needs to be preserved
- *   on changes to types. (Use versioned type names to manage
- *   breaking changes.)
- *
- * Schemes other than `http`, `https` (or the empty scheme) might be
- * used with implementation specific semantics.
- **/
+/// A URL/resource name whose content describes the type of the
+/// serialized protocol buffer message.
+///
+/// For URLs which use the schema `http`, `https`, or no schema, the
+/// following restrictions and interpretations apply:
+///
+/// * If no schema is provided, `https` is assumed.
+/// * The last segment of the URL's path must represent the fully
+///   qualified name of the type (as in `path/google.protobuf.Duration`).
+///   The name should be in a canonical form (e.g., leading "." is
+///   not accepted).
+/// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+///   value in binary format, or produce an error.
+/// * Applications are allowed to cache lookup results based on the
+///   URL, or have them precompiled into a binary to avoid any
+///   lookup. Therefore, binary compatibility needs to be preserved
+///   on changes to types. (Use versioned type names to manage
+///   breaking changes.)
+///
+/// Schemas other than `http`, `https` (or the empty schema) might be
+/// used with implementation specific semantics.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 
-/** Must be a valid serialized protocol buffer of the above specified type. */
+/// Must be a valid serialized protocol buffer of the above specified type.
 @property(nonatomic, readwrite, copy, null_resettable) NSData *value;
 
 @end
diff --git a/objectivec/google/protobuf/Any.pbobjc.m b/objectivec/google/protobuf/Any.pbobjc.m
index d210643..6a1bf89 100644
--- a/objectivec/google/protobuf/Any.pbobjc.m
+++ b/objectivec/google/protobuf/Any.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/any.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Any.pbobjc.h>
-#else
- #import "google/protobuf/Any.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Any.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBAnyRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBAnyRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -72,7 +53,7 @@
         .number = GPBAny_FieldNumber_TypeURL,
         .hasIndex = 0,
         .offset = (uint32_t)offsetof(GPBAny__storage_, typeURL),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom),
+        .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
       },
       {
@@ -92,7 +73,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBAny__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
 #if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     static const char *extraTextFormatInfo =
         "\001\001\004\241!!\000";
diff --git a/objectivec/google/protobuf/Api.pbobjc.h b/objectivec/google/protobuf/Api.pbobjc.h
index 095fc2c..d66df62 100644
--- a/objectivec/google/protobuf/Api.pbobjc.h
+++ b/objectivec/google/protobuf/Api.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/api.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -37,16 +24,14 @@
 
 #pragma mark - GPBApiRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBApiRoot : GPBRootObject
 @end
 
@@ -62,86 +47,67 @@
   GPBApi_FieldNumber_Syntax = 7,
 };
 
-/**
- * Api is a light-weight descriptor for an API Interface.
- *
- * Interfaces are also described as "protocol buffer services" in some contexts,
- * such as by the "service" keyword in a .proto file, but they are different
- * from API Services, which represent a concrete implementation of an interface
- * as opposed to simply a description of methods and bindings. They are also
- * sometimes simply referred to as "APIs" in other contexts, such as the name of
- * this message itself. See https://cloud.google.com/apis/design/glossary for
- * detailed terminology.
- **/
+/// Api is a light-weight descriptor for a protocol buffer service.
 @interface GPBApi : GPBMessage
 
-/**
- * The fully qualified name of this interface, including package name
- * followed by the interface's simple name.
- **/
+/// The fully qualified name of this api, including package name
+/// followed by the api's simple name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/** The methods of this interface, in unspecified order. */
+/// The methods of this api, in unspecified order.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMethod*> *methodsArray;
-/** The number of items in @c methodsArray without causing the array to be created. */
+/// The number of items in @c methodsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger methodsArray_Count;
 
-/** Any metadata attached to the interface. */
+/// Any metadata attached to the API.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
-/**
- * A version string for this interface. If specified, must have the form
- * `major-version.minor-version`, as in `1.10`. If the minor version is
- * omitted, it defaults to zero. If the entire version field is empty, the
- * major version is derived from the package name, as outlined below. If the
- * field is not empty, the version in the package name will be verified to be
- * consistent with what is provided here.
- *
- * The versioning schema uses [semantic
- * versioning](http://semver.org) where the major version number
- * indicates a breaking change and the minor version an additive,
- * non-breaking change. Both version numbers are signals to users
- * what to expect from different versions, and should be carefully
- * chosen based on the product plan.
- *
- * The major version is also reflected in the package name of the
- * interface, which must end in `v<major-version>`, as in
- * `google.feature.v1`. For major versions 0 and 1, the suffix can
- * be omitted. Zero major versions must only be used for
- * experimental, non-GA interfaces.
- **/
+/// A version string for this api. If specified, must have the form
+/// `major-version.minor-version`, as in `1.10`. If the minor version
+/// is omitted, it defaults to zero. If the entire version field is
+/// empty, the major version is derived from the package name, as
+/// outlined below. If the field is not empty, the version in the
+/// package name will be verified to be consistent with what is
+/// provided here.
+///
+/// The versioning schema uses [semantic
+/// versioning](http://semver.org) where the major version number
+/// indicates a breaking change and the minor version an additive,
+/// non-breaking change. Both version numbers are signals to users
+/// what to expect from different versions, and should be carefully
+/// chosen based on the product plan.
+///
+/// The major version is also reflected in the package name of the
+/// API, which must end in `v<major-version>`, as in
+/// `google.feature.v1`. For major versions 0 and 1, the suffix can
+/// be omitted. Zero major versions must only be used for
+/// experimental, none-GA apis.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *version;
 
-/**
- * Source context for the protocol buffer service represented by this
- * message.
- **/
+/// Source context for the protocol buffer service represented by this
+/// message.
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
-/** Test to see if @c sourceContext has been set. */
+/// Test to see if @c sourceContext has been set.
 @property(nonatomic, readwrite) BOOL hasSourceContext;
 
-/** Included interfaces. See [Mixin][]. */
+/// Included APIs. See [Mixin][].
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMixin*> *mixinsArray;
-/** The number of items in @c mixinsArray without causing the array to be created. */
+/// The number of items in @c mixinsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger mixinsArray_Count;
 
-/** The source syntax of the service. */
+/// The source syntax of the service.
 @property(nonatomic, readwrite) enum GPBSyntax syntax;
 
 @end
 
-/**
- * Fetches the raw value of a @c GPBApi's @c syntax property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBApi's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBApi_Syntax_RawValue(GPBApi *message);
-/**
- * Sets the raw value of an @c GPBApi's @c syntax property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBApi's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBApi_Syntax_RawValue(GPBApi *message, int32_t value);
 
 #pragma mark - GPBMethod
@@ -156,46 +122,40 @@
   GPBMethod_FieldNumber_Syntax = 7,
 };
 
-/**
- * Method represents a method of an API interface.
- **/
+/// Method represents a method of an api.
 @interface GPBMethod : GPBMessage
 
-/** The simple name of this method. */
+/// The simple name of this method.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/** A URL of the input message type. */
+/// A URL of the input message type.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *requestTypeURL;
 
-/** If true, the request is streamed. */
+/// If true, the request is streamed.
 @property(nonatomic, readwrite) BOOL requestStreaming;
 
-/** The URL of the output message type. */
+/// The URL of the output message type.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *responseTypeURL;
 
-/** If true, the response is streamed. */
+/// If true, the response is streamed.
 @property(nonatomic, readwrite) BOOL responseStreaming;
 
-/** Any metadata attached to the method. */
+/// Any metadata attached to the method.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
-/** The source syntax of this method. */
+/// The source syntax of this method.
 @property(nonatomic, readwrite) enum GPBSyntax syntax;
 
 @end
 
-/**
- * Fetches the raw value of a @c GPBMethod's @c syntax property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBMethod's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBMethod_Syntax_RawValue(GPBMethod *message);
-/**
- * Sets the raw value of an @c GPBMethod's @c syntax property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBMethod's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBMethod_Syntax_RawValue(GPBMethod *message, int32_t value);
 
 #pragma mark - GPBMixin
@@ -205,95 +165,90 @@
   GPBMixin_FieldNumber_Root = 2,
 };
 
-/**
- * Declares an API Interface to be included in this interface. The including
- * interface must redeclare all the methods from the included interface, but
- * documentation and options are inherited as follows:
- *
- * - If after comment and whitespace stripping, the documentation
- *   string of the redeclared method is empty, it will be inherited
- *   from the original method.
- *
- * - Each annotation belonging to the service config (http,
- *   visibility) which is not set in the redeclared method will be
- *   inherited.
- *
- * - If an http annotation is inherited, the path pattern will be
- *   modified as follows. Any version prefix will be replaced by the
- *   version of the including interface plus the [root][] path if
- *   specified.
- *
- * Example of a simple mixin:
- *
- *     package google.acl.v1;
- *     service AccessControl {
- *       // Get the underlying ACL object.
- *       rpc GetAcl(GetAclRequest) returns (Acl) {
- *         option (google.api.http).get = "/v1/{resource=**}:getAcl";
- *       }
- *     }
- *
- *     package google.storage.v2;
- *     service Storage {
- *       rpc GetAcl(GetAclRequest) returns (Acl);
- *
- *       // Get a data record.
- *       rpc GetData(GetDataRequest) returns (Data) {
- *         option (google.api.http).get = "/v2/{resource=**}";
- *       }
- *     }
- *
- * Example of a mixin configuration:
- *
- *     apis:
- *     - name: google.storage.v2.Storage
- *       mixins:
- *       - name: google.acl.v1.AccessControl
- *
- * The mixin construct implies that all methods in `AccessControl` are
- * also declared with same name and request/response types in
- * `Storage`. A documentation generator or annotation processor will
- * see the effective `Storage.GetAcl` method after inherting
- * documentation and annotations as follows:
- *
- *     service Storage {
- *       // Get the underlying ACL object.
- *       rpc GetAcl(GetAclRequest) returns (Acl) {
- *         option (google.api.http).get = "/v2/{resource=**}:getAcl";
- *       }
- *       ...
- *     }
- *
- * Note how the version in the path pattern changed from `v1` to `v2`.
- *
- * If the `root` field in the mixin is specified, it should be a
- * relative path under which inherited HTTP paths are placed. Example:
- *
- *     apis:
- *     - name: google.storage.v2.Storage
- *       mixins:
- *       - name: google.acl.v1.AccessControl
- *         root: acls
- *
- * This implies the following inherited HTTP annotation:
- *
- *     service Storage {
- *       // Get the underlying ACL object.
- *       rpc GetAcl(GetAclRequest) returns (Acl) {
- *         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
- *       }
- *       ...
- *     }
- **/
+/// Declares an API to be included in this API. The including API must
+/// redeclare all the methods from the included API, but documentation
+/// and options are inherited as follows:
+///
+/// - If after comment and whitespace stripping, the documentation
+///   string of the redeclared method is empty, it will be inherited
+///   from the original method.
+///
+/// - Each annotation belonging to the service config (http,
+///   visibility) which is not set in the redeclared method will be
+///   inherited.
+///
+/// - If an http annotation is inherited, the path pattern will be
+///   modified as follows. Any version prefix will be replaced by the
+///   version of the including API plus the [root][] path if specified.
+///
+/// Example of a simple mixin:
+///
+///     package google.acl.v1;
+///     service AccessControl {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v1/{resource=**}:getAcl";
+///       }
+///     }
+///
+///     package google.storage.v2;
+///     service Storage {
+///       rpc GetAcl(GetAclRequest) returns (Acl);
+///
+///       // Get a data record.
+///       rpc GetData(GetDataRequest) returns (Data) {
+///         option (google.api.http).get = "/v2/{resource=**}";
+///       }
+///     }
+///
+/// Example of a mixin configuration:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///
+/// The mixin construct implies that all methods in `AccessControl` are
+/// also declared with same name and request/response types in
+/// `Storage`. A documentation generator or annotation processor will
+/// see the effective `Storage.GetAcl` method after inherting
+/// documentation and annotations as follows:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
+///
+/// Note how the version in the path pattern changed from `v1` to `v2`.
+///
+/// If the `root` field in the mixin is specified, it should be a
+/// relative path under which inherited HTTP paths are placed. Example:
+///
+///     apis:
+///     - name: google.storage.v2.Storage
+///       mixins:
+///       - name: google.acl.v1.AccessControl
+///         root: acls
+///
+/// This implies the following inherited HTTP annotation:
+///
+///     service Storage {
+///       // Get the underlying ACL object.
+///       rpc GetAcl(GetAclRequest) returns (Acl) {
+///         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+///       }
+///       ...
+///     }
 @interface GPBMixin : GPBMessage
 
-/** The fully qualified name of the interface which is included. */
+/// The fully qualified name of the API which is included.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/**
- * If non-empty specifies a path under which inherited HTTP paths
- * are rooted.
- **/
+/// If non-empty specifies a path under which inherited HTTP paths
+/// are rooted.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *root;
 
 @end
diff --git a/objectivec/google/protobuf/Api.pbobjc.m b/objectivec/google/protobuf/Api.pbobjc.m
index 58b4715..45a06e6 100644
--- a/objectivec/google/protobuf/Api.pbobjc.m
+++ b/objectivec/google/protobuf/Api.pbobjc.m
@@ -1,27 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/api.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Api.pbobjc.h>
- #import <Protobuf/SourceContext.pbobjc.h>
- #import <Protobuf/Type.pbobjc.h>
-#else
- #import "google/protobuf/Api.pbobjc.h"
- #import "google/protobuf/SourceContext.pbobjc.h"
- #import "google/protobuf/Type.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Api.pbobjc.h"
+#import "google/protobuf/SourceContext.pbobjc.h"
+#import "google/protobuf/Type.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -31,8 +14,18 @@
 
 @implementation GPBApiRoot
 
-// No extensions in the file and none of the imports (direct or indirect)
-// defined extensions, so no need to generate +extensionRegistry.
++ (GPBExtensionRegistry*)extensionRegistry {
+  // This is called by +initialize so there is no need to worry
+  // about thread safety and initialization of registry.
+  static GPBExtensionRegistry* registry = nil;
+  if (!registry) {
+    GPBDebugCheckRuntimeVersion();
+    registry = [[GPBExtensionRegistry alloc] init];
+    [registry addExtensions:[GPBSourceContextRoot extensionRegistry]];
+    [registry addExtensions:[GPBTypeRoot extensionRegistry]];
+  }
+  return registry;
+}
 
 @end
 
@@ -43,9 +36,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -140,7 +132,7 @@
         .number = GPBApi_FieldNumber_Syntax,
         .hasIndex = 3,
         .offset = (uint32_t)offsetof(GPBApi__storage_, syntax),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
     };
@@ -151,7 +143,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBApi__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -214,7 +206,7 @@
         .number = GPBMethod_FieldNumber_RequestTypeURL,
         .hasIndex = 1,
         .offset = (uint32_t)offsetof(GPBMethod__storage_, requestTypeURL),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom),
+        .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
       },
       {
@@ -232,7 +224,7 @@
         .number = GPBMethod_FieldNumber_ResponseTypeURL,
         .hasIndex = 4,
         .offset = (uint32_t)offsetof(GPBMethod__storage_, responseTypeURL),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom),
+        .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
       },
       {
@@ -259,7 +251,7 @@
         .number = GPBMethod_FieldNumber_Syntax,
         .hasIndex = 7,
         .offset = (uint32_t)offsetof(GPBMethod__storage_, syntax),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
     };
@@ -270,7 +262,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBMethod__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
 #if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     static const char *extraTextFormatInfo =
         "\002\002\007\244\241!!\000\004\010\244\241!!\000";
@@ -341,7 +333,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBMixin__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Duration.pbobjc.h b/objectivec/google/protobuf/Duration.pbobjc.h
index d9a388a..29888d6 100644
--- a/objectivec/google/protobuf/Duration.pbobjc.h
+++ b/objectivec/google/protobuf/Duration.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/duration.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,16 +18,14 @@
 
 #pragma mark - GPBDurationRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBDurationRoot : GPBRootObject
 @end
 
@@ -51,83 +36,58 @@
   GPBDuration_FieldNumber_Nanos = 2,
 };
 
-/**
- * A Duration represents a signed, fixed-length span of time represented
- * as a count of seconds and fractions of seconds at nanosecond
- * resolution. It is independent of any calendar and concepts like "day"
- * or "month". It is related to Timestamp in that the difference between
- * two Timestamp values is a Duration and it can be added or subtracted
- * from a Timestamp. Range is approximately +-10,000 years.
- *
- * # Examples
- *
- * Example 1: Compute Duration from two Timestamps in pseudo code.
- *
- *     Timestamp start = ...;
- *     Timestamp end = ...;
- *     Duration duration = ...;
- *
- *     duration.seconds = end.seconds - start.seconds;
- *     duration.nanos = end.nanos - start.nanos;
- *
- *     if (duration.seconds < 0 && duration.nanos > 0) {
- *       duration.seconds += 1;
- *       duration.nanos -= 1000000000;
- *     } else if (durations.seconds > 0 && duration.nanos < 0) {
- *       duration.seconds -= 1;
- *       duration.nanos += 1000000000;
- *     }
- *
- * Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
- *
- *     Timestamp start = ...;
- *     Duration duration = ...;
- *     Timestamp end = ...;
- *
- *     end.seconds = start.seconds + duration.seconds;
- *     end.nanos = start.nanos + duration.nanos;
- *
- *     if (end.nanos < 0) {
- *       end.seconds -= 1;
- *       end.nanos += 1000000000;
- *     } else if (end.nanos >= 1000000000) {
- *       end.seconds += 1;
- *       end.nanos -= 1000000000;
- *     }
- *
- * Example 3: Compute Duration from datetime.timedelta in Python.
- *
- *     td = datetime.timedelta(days=3, minutes=10)
- *     duration = Duration()
- *     duration.FromTimedelta(td)
- *
- * # JSON Mapping
- *
- * In JSON format, the Duration type is encoded as a string rather than an
- * object, where the string ends in the suffix "s" (indicating seconds) and
- * is preceded by the number of seconds, with nanoseconds expressed as
- * fractional seconds. For example, 3 seconds with 0 nanoseconds should be
- * encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
- * be expressed in JSON format as "3.000000001s", and 3 seconds and 1
- * microsecond should be expressed in JSON format as "3.000001s".
- **/
+/// A Duration represents a signed, fixed-length span of time represented
+/// as a count of seconds and fractions of seconds at nanosecond
+/// resolution. It is independent of any calendar and concepts like "day"
+/// or "month". It is related to Timestamp in that the difference between
+/// two Timestamp values is a Duration and it can be added or subtracted
+/// from a Timestamp. Range is approximately +-10,000 years.
+///
+/// Example 1: Compute Duration from two Timestamps in pseudo code.
+///
+///     Timestamp start = ...;
+///     Timestamp end = ...;
+///     Duration duration = ...;
+///
+///     duration.seconds = end.seconds - start.seconds;
+///     duration.nanos = end.nanos - start.nanos;
+///
+///     if (duration.seconds < 0 && duration.nanos > 0) {
+///       duration.seconds += 1;
+///       duration.nanos -= 1000000000;
+///     } else if (durations.seconds > 0 && duration.nanos < 0) {
+///       duration.seconds -= 1;
+///       duration.nanos += 1000000000;
+///     }
+///
+/// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+///
+///     Timestamp start = ...;
+///     Duration duration = ...;
+///     Timestamp end = ...;
+///
+///     end.seconds = start.seconds + duration.seconds;
+///     end.nanos = start.nanos + duration.nanos;
+///
+///     if (end.nanos < 0) {
+///       end.seconds -= 1;
+///       end.nanos += 1000000000;
+///     } else if (end.nanos >= 1000000000) {
+///       end.seconds += 1;
+///       end.nanos -= 1000000000;
+///     }
 @interface GPBDuration : GPBMessage
 
-/**
- * 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
- **/
+/// Signed seconds of the span of time. Must be from -315,576,000,000
+/// to +315,576,000,000 inclusive.
 @property(nonatomic, readwrite) int64_t seconds;
 
-/**
- * Signed fractions of a second at nanosecond resolution of the span
- * of time. Durations less than one second are represented with a 0
- * `seconds` field and a positive or negative `nanos` field. For durations
- * of one second or more, a non-zero value for the `nanos` field must be
- * of the same sign as the `seconds` field. Must be from -999,999,999
- * to +999,999,999 inclusive.
- **/
+/// Signed fractions of a second at nanosecond resolution of the span
+/// of time. Durations less than one second are represented with a 0
+/// `seconds` field and a positive or negative `nanos` field. For durations
+/// of one second or more, a non-zero value for the `nanos` field must be
+/// of the same sign as the `seconds` field. Must be from -999,999,999
+/// to +999,999,999 inclusive.
 @property(nonatomic, readwrite) int32_t nanos;
 
 @end
diff --git a/objectivec/google/protobuf/Duration.pbobjc.m b/objectivec/google/protobuf/Duration.pbobjc.m
index bafb64a..7dd6b64 100644
--- a/objectivec/google/protobuf/Duration.pbobjc.m
+++ b/objectivec/google/protobuf/Duration.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/duration.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Duration.pbobjc.h>
-#else
- #import "google/protobuf/Duration.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Duration.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBDurationRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBDurationRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -92,7 +73,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBDuration__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Empty.pbobjc.h b/objectivec/google/protobuf/Empty.pbobjc.h
index bd49cfd..f33db01 100644
--- a/objectivec/google/protobuf/Empty.pbobjc.h
+++ b/objectivec/google/protobuf/Empty.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/empty.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,32 +18,28 @@
 
 #pragma mark - GPBEmptyRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBEmptyRoot : GPBRootObject
 @end
 
 #pragma mark - GPBEmpty
 
-/**
- * A generic empty message that you can re-use to avoid defining duplicated
- * empty messages in your APIs. A typical example is to use it as the request
- * or the response type of an API method. For instance:
- *
- *     service Foo {
- *       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
- *     }
- *
- * The JSON representation for `Empty` is empty JSON object `{}`.
- **/
+/// A generic empty message that you can re-use to avoid defining duplicated
+/// empty messages in your APIs. A typical example is to use it as the request
+/// or the response type of an API method. For instance:
+///
+///     service Foo {
+///       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+///     }
+///
+/// The JSON representation for `Empty` is empty JSON object `{}`.
 @interface GPBEmpty : GPBMessage
 
 @end
diff --git a/objectivec/google/protobuf/Empty.pbobjc.m b/objectivec/google/protobuf/Empty.pbobjc.m
index 506b500..88753aa 100644
--- a/objectivec/google/protobuf/Empty.pbobjc.m
+++ b/objectivec/google/protobuf/Empty.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/empty.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Empty.pbobjc.h>
-#else
- #import "google/protobuf/Empty.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Empty.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBEmptyRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBEmptyRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -68,7 +49,7 @@
                                         fields:NULL
                                     fieldCount:0
                                    storageSize:sizeof(GPBEmpty__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/FieldMask.pbobjc.h b/objectivec/google/protobuf/FieldMask.pbobjc.h
index 75cf856..73cbd8a 100644
--- a/objectivec/google/protobuf/FieldMask.pbobjc.h
+++ b/objectivec/google/protobuf/FieldMask.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/field_mask.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,16 +18,14 @@
 
 #pragma mark - GPBFieldMaskRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBFieldMaskRoot : GPBRootObject
 @end
 
@@ -50,220 +35,160 @@
   GPBFieldMask_FieldNumber_PathsArray = 1,
 };
 
-/**
- * `FieldMask` represents a set of symbolic field paths, for example:
- *
- *     paths: "f.a"
- *     paths: "f.b.d"
- *
- * Here `f` represents a field in some root message, `a` and `b`
- * fields in the message found in `f`, and `d` a field found in the
- * message in `f.b`.
- *
- * Field masks are used to specify a subset of fields that should be
- * returned by a get operation or modified by an update operation.
- * Field masks also have a custom JSON encoding (see below).
- *
- * # Field Masks in Projections
- *
- * When used in the context of a projection, a response message or
- * sub-message is filtered by the API to only contain those fields as
- * specified in the mask. For example, if the mask in the previous
- * example is applied to a response message as follows:
- *
- *     f {
- *       a : 22
- *       b {
- *         d : 1
- *         x : 2
- *       }
- *       y : 13
- *     }
- *     z: 8
- *
- * The result will not contain specific values for fields x,y and z
- * (their value will be set to the default, and omitted in proto text
- * output):
- *
- *
- *     f {
- *       a : 22
- *       b {
- *         d : 1
- *       }
- *     }
- *
- * A repeated field is not allowed except at the last position of a
- * paths string.
- *
- * If a FieldMask object is not present in a get operation, the
- * operation applies to all fields (as if a FieldMask of all fields
- * had been specified).
- *
- * Note that a field mask does not necessarily apply to the
- * top-level response message. In case of a REST get operation, the
- * field mask applies directly to the response, but in case of a REST
- * list operation, the mask instead applies to each individual message
- * in the returned resource list. In case of a REST custom method,
- * other definitions may be used. Where the mask applies will be
- * clearly documented together with its declaration in the API.  In
- * any case, the effect on the returned resource/resources is required
- * behavior for APIs.
- *
- * # Field Masks in Update Operations
- *
- * A field mask in update operations specifies which fields of the
- * targeted resource are going to be updated. The API is required
- * to only change the values of the fields as specified in the mask
- * and leave the others untouched. If a resource is passed in to
- * describe the updated values, the API ignores the values of all
- * fields not covered by the mask.
- *
- * If a repeated field is specified for an update operation, the existing
- * repeated values in the target resource will be overwritten by the new values.
- * Note that a repeated field is only allowed in the last position of a `paths`
- * string.
- *
- * If a sub-message is specified in the last position of the field mask for an
- * update operation, then the existing sub-message in the target resource is
- * overwritten. Given the target message:
- *
- *     f {
- *       b {
- *         d : 1
- *         x : 2
- *       }
- *       c : 1
- *     }
- *
- * And an update message:
- *
- *     f {
- *       b {
- *         d : 10
- *       }
- *     }
- *
- * then if the field mask is:
- *
- *  paths: "f.b"
- *
- * then the result will be:
- *
- *     f {
- *       b {
- *         d : 10
- *       }
- *       c : 1
- *     }
- *
- * However, if the update mask was:
- *
- *  paths: "f.b.d"
- *
- * then the result would be:
- *
- *     f {
- *       b {
- *         d : 10
- *         x : 2
- *       }
- *       c : 1
- *     }
- *
- * In order to reset a field's value to the default, the field must
- * be in the mask and set to the default value in the provided resource.
- * Hence, in order to reset all fields of a resource, provide a default
- * instance of the resource and set all fields in the mask, or do
- * not provide a mask as described below.
- *
- * If a field mask is not present on update, the operation applies to
- * all fields (as if a field mask of all fields has been specified).
- * Note that in the presence of schema evolution, this may mean that
- * fields the client does not know and has therefore not filled into
- * the request will be reset to their default. If this is unwanted
- * behavior, a specific service may require a client to always specify
- * a field mask, producing an error if not.
- *
- * As with get operations, the location of the resource which
- * describes the updated values in the request message depends on the
- * operation kind. In any case, the effect of the field mask is
- * required to be honored by the API.
- *
- * ## Considerations for HTTP REST
- *
- * The HTTP kind of an update operation which uses a field mask must
- * be set to PATCH instead of PUT in order to satisfy HTTP semantics
- * (PUT must only be used for full updates).
- *
- * # JSON Encoding of Field Masks
- *
- * In JSON, a field mask is encoded as a single string where paths are
- * separated by a comma. Fields name in each path are converted
- * to/from lower-camel naming conventions.
- *
- * As an example, consider the following message declarations:
- *
- *     message Profile {
- *       User user = 1;
- *       Photo photo = 2;
- *     }
- *     message User {
- *       string display_name = 1;
- *       string address = 2;
- *     }
- *
- * In proto a field mask for `Profile` may look as such:
- *
- *     mask {
- *       paths: "user.display_name"
- *       paths: "photo"
- *     }
- *
- * In JSON, the same mask is represented as below:
- *
- *     {
- *       mask: "user.displayName,photo"
- *     }
- *
- * # Field Masks and Oneof Fields
- *
- * Field masks treat fields in oneofs just as regular fields. Consider the
- * following message:
- *
- *     message SampleMessage {
- *       oneof test_oneof {
- *         string name = 4;
- *         SubMessage sub_message = 9;
- *       }
- *     }
- *
- * The field mask can be:
- *
- *     mask {
- *       paths: "name"
- *     }
- *
- * Or:
- *
- *     mask {
- *       paths: "sub_message"
- *     }
- *
- * Note that oneof type names ("test_oneof" in this case) cannot be used in
- * paths.
- *
- * ## Field Mask Verification
- *
- * The implementation of the all the API methods, which have any FieldMask type
- * field in the request, should verify the included field paths, and return
- * `INVALID_ARGUMENT` error if any path is duplicated or unmappable.
- **/
+/// `FieldMask` represents a set of symbolic field paths, for example:
+///
+///     paths: "f.a"
+///     paths: "f.b.d"
+///
+/// Here `f` represents a field in some root message, `a` and `b`
+/// fields in the message found in `f`, and `d` a field found in the
+/// message in `f.b`.
+///
+/// Field masks are used to specify a subset of fields that should be
+/// returned by a get operation or modified by an update operation.
+/// Field masks also have a custom JSON encoding (see below).
+///
+/// # Field Masks in Projections
+///
+/// When used in the context of a projection, a response message or
+/// sub-message is filtered by the API to only contain those fields as
+/// specified in the mask. For example, if the mask in the previous
+/// example is applied to a response message as follows:
+///
+///     f {
+///       a : 22
+///       b {
+///         d : 1
+///         x : 2
+///       }
+///       y : 13
+///     }
+///     z: 8
+///
+/// The result will not contain specific values for fields x,y and z
+/// (their value will be set to the default, and omitted in proto text
+/// output):
+///
+///
+///     f {
+///       a : 22
+///       b {
+///         d : 1
+///       }
+///     }
+///
+/// A repeated field is not allowed except at the last position of a
+/// field mask.
+///
+/// If a FieldMask object is not present in a get operation, the
+/// operation applies to all fields (as if a FieldMask of all fields
+/// had been specified).
+///
+/// Note that a field mask does not necessarily apply to the
+/// top-level response message. In case of a REST get operation, the
+/// field mask applies directly to the response, but in case of a REST
+/// list operation, the mask instead applies to each individual message
+/// in the returned resource list. In case of a REST custom method,
+/// other definitions may be used. Where the mask applies will be
+/// clearly documented together with its declaration in the API.  In
+/// any case, the effect on the returned resource/resources is required
+/// behavior for APIs.
+///
+/// # Field Masks in Update Operations
+///
+/// A field mask in update operations specifies which fields of the
+/// targeted resource are going to be updated. The API is required
+/// to only change the values of the fields as specified in the mask
+/// and leave the others untouched. If a resource is passed in to
+/// describe the updated values, the API ignores the values of all
+/// fields not covered by the mask.
+///
+/// In order to reset a field's value to the default, the field must
+/// be in the mask and set to the default value in the provided resource.
+/// Hence, in order to reset all fields of a resource, provide a default
+/// instance of the resource and set all fields in the mask, or do
+/// not provide a mask as described below.
+///
+/// If a field mask is not present on update, the operation applies to
+/// all fields (as if a field mask of all fields has been specified).
+/// Note that in the presence of schema evolution, this may mean that
+/// fields the client does not know and has therefore not filled into
+/// the request will be reset to their default. If this is unwanted
+/// behavior, a specific service may require a client to always specify
+/// a field mask, producing an error if not.
+///
+/// As with get operations, the location of the resource which
+/// describes the updated values in the request message depends on the
+/// operation kind. In any case, the effect of the field mask is
+/// required to be honored by the API.
+///
+/// ## Considerations for HTTP REST
+///
+/// The HTTP kind of an update operation which uses a field mask must
+/// be set to PATCH instead of PUT in order to satisfy HTTP semantics
+/// (PUT must only be used for full updates).
+///
+/// # JSON Encoding of Field Masks
+///
+/// In JSON, a field mask is encoded as a single string where paths are
+/// separated by a comma. Fields name in each path are converted
+/// to/from lower-camel naming conventions.
+///
+/// As an example, consider the following message declarations:
+///
+///     message Profile {
+///       User user = 1;
+///       Photo photo = 2;
+///     }
+///     message User {
+///       string display_name = 1;
+///       string address = 2;
+///     }
+///
+/// In proto a field mask for `Profile` may look as such:
+///
+///     mask {
+///       paths: "user.display_name"
+///       paths: "photo"
+///     }
+///
+/// In JSON, the same mask is represented as below:
+///
+///     {
+///       mask: "user.displayName,photo"
+///     }
+///
+/// # Field Masks and Oneof Fields
+///
+/// Field masks treat fields in oneofs just as regular fields. Consider the
+/// following message:
+///
+///     message SampleMessage {
+///       oneof test_oneof {
+///         string name = 4;
+///         SubMessage sub_message = 9;
+///       }
+///     }
+///
+/// The field mask can be:
+///
+///     mask {
+///       paths: "name"
+///     }
+///
+/// Or:
+///
+///     mask {
+///       paths: "sub_message"
+///     }
+///
+/// Note that oneof type names ("test_oneof" in this case) cannot be used in
+/// paths.
 @interface GPBFieldMask : GPBMessage
 
-/** The set of field mask paths. */
+/// The set of field mask paths.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *pathsArray;
-/** The number of items in @c pathsArray without causing the array to be created. */
+/// The number of items in @c pathsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger pathsArray_Count;
 
 @end
diff --git a/objectivec/google/protobuf/FieldMask.pbobjc.m b/objectivec/google/protobuf/FieldMask.pbobjc.m
index b0915af..8c241af 100644
--- a/objectivec/google/protobuf/FieldMask.pbobjc.m
+++ b/objectivec/google/protobuf/FieldMask.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/field_mask.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/FieldMask.pbobjc.h>
-#else
- #import "google/protobuf/FieldMask.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/FieldMask.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBFieldMaskRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBFieldMaskRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -81,7 +62,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBFieldMask__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/SourceContext.pbobjc.h b/objectivec/google/protobuf/SourceContext.pbobjc.h
index 799d190..8775348 100644
--- a/objectivec/google/protobuf/SourceContext.pbobjc.h
+++ b/objectivec/google/protobuf/SourceContext.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/source_context.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,16 +18,14 @@
 
 #pragma mark - GPBSourceContextRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBSourceContextRoot : GPBRootObject
 @end
 
@@ -50,16 +35,12 @@
   GPBSourceContext_FieldNumber_FileName = 1,
 };
 
-/**
- * `SourceContext` represents information about the source of a
- * protobuf element, like the file in which it is defined.
- **/
+/// `SourceContext` represents information about the source of a
+/// protobuf element, like the file in which it is defined.
 @interface GPBSourceContext : GPBMessage
 
-/**
- * The path-qualified name of the .proto file that contained the associated
- * protobuf element.  For example: `"google/protobuf/source_context.proto"`.
- **/
+/// The path-qualified name of the .proto file that contained the associated
+/// protobuf element.  For example: `"google/protobuf/source.proto"`.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *fileName;
 
 @end
diff --git a/objectivec/google/protobuf/SourceContext.pbobjc.m b/objectivec/google/protobuf/SourceContext.pbobjc.m
index 83bfa34..9500712 100644
--- a/objectivec/google/protobuf/SourceContext.pbobjc.m
+++ b/objectivec/google/protobuf/SourceContext.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/source_context.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/SourceContext.pbobjc.h>
-#else
- #import "google/protobuf/SourceContext.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/SourceContext.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBSourceContextRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBSourceContextRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -81,7 +62,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBSourceContext__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Struct.pbobjc.h b/objectivec/google/protobuf/Struct.pbobjc.h
index 3fc80ca..3924b4b 100644
--- a/objectivec/google/protobuf/Struct.pbobjc.h
+++ b/objectivec/google/protobuf/Struct.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/struct.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -35,43 +22,35 @@
 
 #pragma mark - Enum GPBNullValue
 
-/**
- * `NullValue` is a singleton enumeration to represent the null value for the
- * `Value` type union.
- *
- *  The JSON representation for `NullValue` is JSON `null`.
- **/
+/// `NullValue` is a singleton enumeration to represent the null value for the
+/// `Value` type union.
+///
+///  The JSON representation for `NullValue` is JSON `null`.
 typedef GPB_ENUM(GPBNullValue) {
-  /**
-   * Value used if any message's field encounters a value that is not defined
-   * by this enum. The message will also have C functions to get/set the rawValue
-   * of the field.
-   **/
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBNullValue_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  /** Null value. */
+  /// Null value.
   GPBNullValue_NullValue = 0,
 };
 
 GPBEnumDescriptor *GPBNullValue_EnumDescriptor(void);
 
-/**
- * Checks to see if the given value is defined by the enum or was not known at
- * the time this source was generated.
- **/
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBNullValue_IsValidValue(int32_t value);
 
 #pragma mark - GPBStructRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBStructRoot : GPBRootObject
 @end
 
@@ -81,21 +60,19 @@
   GPBStruct_FieldNumber_Fields = 1,
 };
 
-/**
- * `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
- * scripting languages like JS a struct is represented as an
- * object. The details of that representation are described together
- * with the proto support for the language.
- *
- * The JSON representation for `Struct` is JSON object.
- **/
+/// `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
+/// scripting languages like JS a struct is represented as an
+/// object. The details of that representation are described together
+/// with the proto support for the language.
+///
+/// The JSON representation for `Struct` is JSON object.
 @interface GPBStruct : GPBMessage
 
-/** Unordered map of dynamically typed values. */
+/// Unordered map of dynamically typed values.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableDictionary<NSString*, GPBValue*> *fields;
-/** The number of items in @c fields without causing the array to be created. */
+/// The number of items in @c fields without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger fields_Count;
 
 @end
@@ -121,54 +98,46 @@
   GPBValue_Kind_OneOfCase_ListValue = 6,
 };
 
-/**
- * `Value` represents a dynamically typed value which can be either
- * null, a number, a string, a boolean, a recursive struct value, or a
- * list of values. A producer of value is expected to set one of that
- * variants, absence of any variant indicates an error.
- *
- * The JSON representation for `Value` is JSON value.
- **/
+/// `Value` represents a dynamically typed value which can be either
+/// null, a number, a string, a boolean, a recursive struct value, or a
+/// list of values. A producer of value is expected to set one of that
+/// variants, absence of any variant indicates an error.
+///
+/// The JSON representation for `Value` is JSON value.
 @interface GPBValue : GPBMessage
 
-/** The kind of value. */
+/// The kind of value.
 @property(nonatomic, readonly) GPBValue_Kind_OneOfCase kindOneOfCase;
 
-/** Represents a null value. */
+/// Represents a null value.
 @property(nonatomic, readwrite) GPBNullValue nullValue;
 
-/** Represents a double value. */
+/// Represents a double value.
 @property(nonatomic, readwrite) double numberValue;
 
-/** Represents a string value. */
+/// Represents a string value.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *stringValue;
 
-/** Represents a boolean value. */
+/// Represents a boolean value.
 @property(nonatomic, readwrite) BOOL boolValue;
 
-/** Represents a structured value. */
+/// Represents a structured value.
 @property(nonatomic, readwrite, strong, null_resettable) GPBStruct *structValue;
 
-/** Represents a repeated `Value`. */
+/// Represents a repeated `Value`.
 @property(nonatomic, readwrite, strong, null_resettable) GPBListValue *listValue;
 
 @end
 
-/**
- * Fetches the raw value of a @c GPBValue's @c nullValue property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBValue's @c nullValue property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBValue_NullValue_RawValue(GPBValue *message);
-/**
- * Sets the raw value of an @c GPBValue's @c nullValue property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBValue's @c nullValue property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBValue_NullValue_RawValue(GPBValue *message, int32_t value);
 
-/**
- * Clears whatever value was set for the oneof 'kind'.
- **/
+/// Clears whatever value was set for the oneof 'kind'.
 void GPBValue_ClearKindOneOfCase(GPBValue *message);
 
 #pragma mark - GPBListValue
@@ -177,16 +146,14 @@
   GPBListValue_FieldNumber_ValuesArray = 1,
 };
 
-/**
- * `ListValue` is a wrapper around a repeated field of values.
- *
- * The JSON representation for `ListValue` is JSON array.
- **/
+/// `ListValue` is a wrapper around a repeated field of values.
+///
+/// The JSON representation for `ListValue` is JSON array.
 @interface GPBListValue : GPBMessage
 
-/** Repeated field of dynamically typed values. */
+/// Repeated field of dynamically typed values.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBValue*> *valuesArray;
-/** The number of items in @c valuesArray without causing the array to be created. */
+/// The number of items in @c valuesArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger valuesArray_Count;
 
 @end
diff --git a/objectivec/google/protobuf/Struct.pbobjc.m b/objectivec/google/protobuf/Struct.pbobjc.m
index f36ec58..6094002 100644
--- a/objectivec/google/protobuf/Struct.pbobjc.m
+++ b/objectivec/google/protobuf/Struct.pbobjc.m
@@ -1,36 +1,17 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/struct.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Struct.pbobjc.h>
-#else
- #import "google/protobuf/Struct.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Struct.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#pragma clang diagnostic ignored "-Wdirect-ivar-access"
 
 #pragma mark - GPBStructRoot
 
 @implementation GPBStructRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBStructRoot_FileDescriptor
@@ -40,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -114,7 +94,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBStruct__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -156,7 +136,7 @@
         .number = GPBValue_FieldNumber_NullValue,
         .hasIndex = -1,
         .offset = (uint32_t)offsetof(GPBValue__storage_, nullValue),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
       {
@@ -212,7 +192,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     static const char *oneofs[] = {
       "kind",
     };
@@ -241,7 +221,7 @@
 
 void GPBValue_ClearKindOneOfCase(GPBValue *message) {
   GPBDescriptor *descriptor = [message descriptor];
-  GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0];
+  GPBOneofDescriptor *oneof = descriptor->oneofs_[0];
   GPBMaybeClearOneof(message, oneof, -1, 0);
 }
 #pragma mark - GPBListValue
@@ -278,7 +258,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBListValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Timestamp.pbobjc.h b/objectivec/google/protobuf/Timestamp.pbobjc.h
index 0b670c3..925dca8 100644
--- a/objectivec/google/protobuf/Timestamp.pbobjc.h
+++ b/objectivec/google/protobuf/Timestamp.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/timestamp.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,16 +18,14 @@
 
 #pragma mark - GPBTimestampRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBTimestampRoot : GPBRootObject
 @end
 
@@ -51,99 +36,70 @@
   GPBTimestamp_FieldNumber_Nanos = 2,
 };
 
-/**
- * A Timestamp represents a point in time independent of any time zone
- * or calendar, represented as seconds and fractions of seconds at
- * nanosecond resolution in UTC Epoch time. It is encoded using the
- * Proleptic Gregorian Calendar which extends the Gregorian calendar
- * backwards to year one. It is encoded assuming all minutes are 60
- * seconds long, i.e. leap seconds are "smeared" so that no leap second
- * table is needed for interpretation. Range is from
- * 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
- * By restricting to that range, we ensure that we can convert to
- * and from  RFC 3339 date strings.
- * See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
- *
- * # Examples
- *
- * Example 1: Compute Timestamp from POSIX `time()`.
- *
- *     Timestamp timestamp;
- *     timestamp.set_seconds(time(NULL));
- *     timestamp.set_nanos(0);
- *
- * Example 2: Compute Timestamp from POSIX `gettimeofday()`.
- *
- *     struct timeval tv;
- *     gettimeofday(&tv, NULL);
- *
- *     Timestamp timestamp;
- *     timestamp.set_seconds(tv.tv_sec);
- *     timestamp.set_nanos(tv.tv_usec * 1000);
- *
- * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
- *
- *     FILETIME ft;
- *     GetSystemTimeAsFileTime(&ft);
- *     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
- *
- *     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
- *     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
- *     Timestamp timestamp;
- *     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
- *     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
- *
- * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
- *
- *     long millis = System.currentTimeMillis();
- *
- *     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
- *         .setNanos((int) ((millis % 1000) * 1000000)).build();
- *
- *
- * Example 5: Compute Timestamp from current time in Python.
- *
- *     timestamp = Timestamp()
- *     timestamp.GetCurrentTime()
- *
- * # JSON Mapping
- *
- * In JSON format, the Timestamp type is encoded as a string in the
- * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
- * format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
- * where {year} is always expressed using four digits while {month}, {day},
- * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
- * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
- * are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
- * is required, though only UTC (as indicated by "Z") is presently supported.
- *
- * For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
- * 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]
- * 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()`](
- * http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--)
- * to obtain a formatter capable of generating timestamps in this format.
- **/
+/// A Timestamp represents a point in time independent of any time zone
+/// or calendar, represented as seconds and fractions of seconds at
+/// nanosecond resolution in UTC Epoch time. It is encoded using the
+/// Proleptic Gregorian Calendar which extends the Gregorian calendar
+/// backwards to year one. It is encoded assuming all minutes are 60
+/// seconds long, i.e. leap seconds are "smeared" so that no leap second
+/// table is needed for interpretation. Range is from
+/// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
+/// By restricting to that range, we ensure that we can convert to
+/// and from  RFC 3339 date strings.
+/// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
+///
+/// Example 1: Compute Timestamp from POSIX `time()`.
+///
+///     Timestamp timestamp;
+///     timestamp.set_seconds(time(NULL));
+///     timestamp.set_nanos(0);
+///
+/// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+///
+///     struct timeval tv;
+///     gettimeofday(&tv, NULL);
+///
+///     Timestamp timestamp;
+///     timestamp.set_seconds(tv.tv_sec);
+///     timestamp.set_nanos(tv.tv_usec * 1000);
+///
+/// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+///
+///     FILETIME ft;
+///     GetSystemTimeAsFileTime(&ft);
+///     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+///
+///     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+///     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+///     Timestamp timestamp;
+///     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+///     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+///
+/// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+///
+///     long millis = System.currentTimeMillis();
+///
+///     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+///         .setNanos((int) ((millis % 1000) * 1000000)).build();
+///
+///
+/// Example 5: Compute Timestamp from current time in Python.
+///
+///     now = time.time()
+///     seconds = int(now)
+///     nanos = int((now - seconds) * 10**9)
+///     timestamp = Timestamp(seconds=seconds, nanos=nanos)
 @interface GPBTimestamp : GPBMessage
 
-/**
- * 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.
- **/
+/// Represents seconds of UTC time since Unix epoch
+/// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
+/// 9999-12-31T23:59:59Z inclusive.
 @property(nonatomic, readwrite) int64_t seconds;
 
-/**
- * Non-negative fractions of a second at nanosecond resolution. Negative
- * second values with fractions must still have non-negative nanos values
- * that count forward in time. Must be from 0 to 999,999,999
- * inclusive.
- **/
+/// Non-negative fractions of a second at nanosecond resolution. Negative
+/// second values with fractions must still have non-negative nanos values
+/// that count forward in time. Must be from 0 to 999,999,999
+/// inclusive.
 @property(nonatomic, readwrite) int32_t nanos;
 
 @end
diff --git a/objectivec/google/protobuf/Timestamp.pbobjc.m b/objectivec/google/protobuf/Timestamp.pbobjc.m
index 4ab159f..f35e435 100644
--- a/objectivec/google/protobuf/Timestamp.pbobjc.m
+++ b/objectivec/google/protobuf/Timestamp.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/timestamp.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Timestamp.pbobjc.h>
-#else
- #import "google/protobuf/Timestamp.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Timestamp.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBTimestampRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBTimestampRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -92,7 +73,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBTimestamp__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Type.pbobjc.h b/objectivec/google/protobuf/Type.pbobjc.h
index 1798697..590d970 100644
--- a/objectivec/google/protobuf/Type.pbobjc.h
+++ b/objectivec/google/protobuf/Type.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/type.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -37,148 +24,134 @@
 
 #pragma mark - Enum GPBSyntax
 
-/** The syntax in which a protocol buffer element is defined. */
+/// The syntax in which a protocol buffer element is defined.
 typedef GPB_ENUM(GPBSyntax) {
-  /**
-   * Value used if any message's field encounters a value that is not defined
-   * by this enum. The message will also have C functions to get/set the rawValue
-   * of the field.
-   **/
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBSyntax_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  /** Syntax `proto2`. */
+  /// Syntax `proto2`.
   GPBSyntax_SyntaxProto2 = 0,
 
-  /** Syntax `proto3`. */
+  /// Syntax `proto3`.
   GPBSyntax_SyntaxProto3 = 1,
 };
 
 GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void);
 
-/**
- * Checks to see if the given value is defined by the enum or was not known at
- * the time this source was generated.
- **/
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBSyntax_IsValidValue(int32_t value);
 
 #pragma mark - Enum GPBField_Kind
 
-/** Basic field types. */
+/// Basic field types.
 typedef GPB_ENUM(GPBField_Kind) {
-  /**
-   * Value used if any message's field encounters a value that is not defined
-   * by this enum. The message will also have C functions to get/set the rawValue
-   * of the field.
-   **/
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBField_Kind_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  /** Field type unknown. */
+  /// Field type unknown.
   GPBField_Kind_TypeUnknown = 0,
 
-  /** Field type double. */
+  /// Field type double.
   GPBField_Kind_TypeDouble = 1,
 
-  /** Field type float. */
+  /// Field type float.
   GPBField_Kind_TypeFloat = 2,
 
-  /** Field type int64. */
+  /// Field type int64.
   GPBField_Kind_TypeInt64 = 3,
 
-  /** Field type uint64. */
+  /// Field type uint64.
   GPBField_Kind_TypeUint64 = 4,
 
-  /** Field type int32. */
+  /// Field type int32.
   GPBField_Kind_TypeInt32 = 5,
 
-  /** Field type fixed64. */
+  /// Field type fixed64.
   GPBField_Kind_TypeFixed64 = 6,
 
-  /** Field type fixed32. */
+  /// Field type fixed32.
   GPBField_Kind_TypeFixed32 = 7,
 
-  /** Field type bool. */
+  /// Field type bool.
   GPBField_Kind_TypeBool = 8,
 
-  /** Field type string. */
+  /// Field type string.
   GPBField_Kind_TypeString = 9,
 
-  /** Field type group. Proto2 syntax only, and deprecated. */
+  /// Field type group. Proto2 syntax only, and deprecated.
   GPBField_Kind_TypeGroup = 10,
 
-  /** Field type message. */
+  /// Field type message.
   GPBField_Kind_TypeMessage = 11,
 
-  /** Field type bytes. */
+  /// Field type bytes.
   GPBField_Kind_TypeBytes = 12,
 
-  /** Field type uint32. */
+  /// Field type uint32.
   GPBField_Kind_TypeUint32 = 13,
 
-  /** Field type enum. */
+  /// Field type enum.
   GPBField_Kind_TypeEnum = 14,
 
-  /** Field type sfixed32. */
+  /// Field type sfixed32.
   GPBField_Kind_TypeSfixed32 = 15,
 
-  /** Field type sfixed64. */
+  /// Field type sfixed64.
   GPBField_Kind_TypeSfixed64 = 16,
 
-  /** Field type sint32. */
+  /// Field type sint32.
   GPBField_Kind_TypeSint32 = 17,
 
-  /** Field type sint64. */
+  /// Field type sint64.
   GPBField_Kind_TypeSint64 = 18,
 };
 
 GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void);
 
-/**
- * Checks to see if the given value is defined by the enum or was not known at
- * the time this source was generated.
- **/
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBField_Kind_IsValidValue(int32_t value);
 
 #pragma mark - Enum GPBField_Cardinality
 
-/** Whether a field is optional, required, or repeated. */
+/// Whether a field is optional, required, or repeated.
 typedef GPB_ENUM(GPBField_Cardinality) {
-  /**
-   * Value used if any message's field encounters a value that is not defined
-   * by this enum. The message will also have C functions to get/set the rawValue
-   * of the field.
-   **/
+  /// Value used if any message's field encounters a value that is not defined
+  /// by this enum. The message will also have C functions to get/set the rawValue
+  /// of the field.
   GPBField_Cardinality_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,
-  /** For fields with unknown cardinality. */
+  /// For fields with unknown cardinality.
   GPBField_Cardinality_CardinalityUnknown = 0,
 
-  /** For optional fields. */
+  /// For optional fields.
   GPBField_Cardinality_CardinalityOptional = 1,
 
-  /** For required fields. Proto2 syntax only. */
+  /// For required fields. Proto2 syntax only.
   GPBField_Cardinality_CardinalityRequired = 2,
 
-  /** For repeated fields. */
+  /// For repeated fields.
   GPBField_Cardinality_CardinalityRepeated = 3,
 };
 
 GPBEnumDescriptor *GPBField_Cardinality_EnumDescriptor(void);
 
-/**
- * Checks to see if the given value is defined by the enum or was not known at
- * the time this source was generated.
- **/
+/// Checks to see if the given value is defined by the enum or was not known at
+/// the time this source was generated.
 BOOL GPBField_Cardinality_IsValidValue(int32_t value);
 
 #pragma mark - GPBTypeRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBTypeRoot : GPBRootObject
 @end
 
@@ -193,49 +166,43 @@
   GPBType_FieldNumber_Syntax = 6,
 };
 
-/**
- * A protocol buffer message type.
- **/
+/// A protocol buffer message type.
 @interface GPBType : GPBMessage
 
-/** The fully qualified message name. */
+/// The fully qualified message name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/** The list of fields. */
+/// The list of fields.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBField*> *fieldsArray;
-/** The number of items in @c fieldsArray without causing the array to be created. */
+/// The number of items in @c fieldsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger fieldsArray_Count;
 
-/** The list of types appearing in `oneof` definitions in this type. */
+/// The list of types appearing in `oneof` definitions in this type.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *oneofsArray;
-/** The number of items in @c oneofsArray without causing the array to be created. */
+/// The number of items in @c oneofsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger oneofsArray_Count;
 
-/** The protocol buffer options. */
+/// The protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
-/** The source context. */
+/// The source context.
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
-/** Test to see if @c sourceContext has been set. */
+/// Test to see if @c sourceContext has been set.
 @property(nonatomic, readwrite) BOOL hasSourceContext;
 
-/** The source syntax. */
+/// The source syntax.
 @property(nonatomic, readwrite) GPBSyntax syntax;
 
 @end
 
-/**
- * Fetches the raw value of a @c GPBType's @c syntax property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBType's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBType_Syntax_RawValue(GPBType *message);
-/**
- * Sets the raw value of an @c GPBType's @c syntax property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBType's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBType_Syntax_RawValue(GPBType *message, int32_t value);
 
 #pragma mark - GPBField
@@ -253,73 +220,59 @@
   GPBField_FieldNumber_DefaultValue = 11,
 };
 
-/**
- * A single field of a message type.
- **/
+/// A single field of a message type.
 @interface GPBField : GPBMessage
 
-/** The field type. */
+/// The field type.
 @property(nonatomic, readwrite) GPBField_Kind kind;
 
-/** The field cardinality. */
+/// The field cardinality.
 @property(nonatomic, readwrite) GPBField_Cardinality cardinality;
 
-/** The field number. */
+/// The field number.
 @property(nonatomic, readwrite) int32_t number;
 
-/** The field name. */
+/// The field name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/**
- * The field type URL, without the scheme, for message or enumeration
- * types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
- **/
+/// The field type URL, without the scheme, for message or enumeration
+/// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;
 
-/**
- * The index of the field type in `Type.oneofs`, for message or enumeration
- * types. The first type has index 1; zero means the type is not in the list.
- **/
+/// The index of the field type in `Type.oneofs`, for message or enumeration
+/// types. The first type has index 1; zero means the type is not in the list.
 @property(nonatomic, readwrite) int32_t oneofIndex;
 
-/** Whether to use alternative packed wire representation. */
+/// Whether to use alternative packed wire representation.
 @property(nonatomic, readwrite) BOOL packed;
 
-/** The protocol buffer options. */
+/// The protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
-/** The field JSON name. */
+/// The field JSON name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *jsonName;
 
-/** The string value of the default value of this field. Proto2 syntax only. */
+/// The string value of the default value of this field. Proto2 syntax only.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *defaultValue;
 
 @end
 
-/**
- * Fetches the raw value of a @c GPBField's @c kind property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBField's @c kind property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBField_Kind_RawValue(GPBField *message);
-/**
- * Sets the raw value of an @c GPBField's @c kind property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBField's @c kind property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBField_Kind_RawValue(GPBField *message, int32_t value);
 
-/**
- * Fetches the raw value of a @c GPBField's @c cardinality property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBField's @c cardinality property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBField_Cardinality_RawValue(GPBField *message);
-/**
- * Sets the raw value of an @c GPBField's @c cardinality property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBField's @c cardinality property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBField_Cardinality_RawValue(GPBField *message, int32_t value);
 
 #pragma mark - GPBEnum
@@ -332,44 +285,38 @@
   GPBEnum_FieldNumber_Syntax = 5,
 };
 
-/**
- * Enum type definition.
- **/
+/// Enum type definition.
 @interface GPBEnum : GPBMessage
 
-/** Enum type name. */
+/// Enum type name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/** Enum value definitions. */
+/// Enum value definitions.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumValue*> *enumvalueArray;
-/** The number of items in @c enumvalueArray without causing the array to be created. */
+/// The number of items in @c enumvalueArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger enumvalueArray_Count;
 
-/** Protocol buffer options. */
+/// Protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
-/** The source context. */
+/// The source context.
 @property(nonatomic, readwrite, strong, null_resettable) GPBSourceContext *sourceContext;
-/** Test to see if @c sourceContext has been set. */
+/// Test to see if @c sourceContext has been set.
 @property(nonatomic, readwrite) BOOL hasSourceContext;
 
-/** The source syntax. */
+/// The source syntax.
 @property(nonatomic, readwrite) GPBSyntax syntax;
 
 @end
 
-/**
- * Fetches the raw value of a @c GPBEnum's @c syntax property, even
- * if the value was not defined by the enum at the time the code was generated.
- **/
+/// Fetches the raw value of a @c GPBEnum's @c syntax property, even
+/// if the value was not defined by the enum at the time the code was generated.
 int32_t GPBEnum_Syntax_RawValue(GPBEnum *message);
-/**
- * Sets the raw value of an @c GPBEnum's @c syntax property, allowing
- * it to be set to a value that was not defined by the enum at the time the code
- * was generated.
- **/
+/// Sets the raw value of an @c GPBEnum's @c syntax property, allowing
+/// it to be set to a value that was not defined by the enum at the time the code
+/// was generated.
 void SetGPBEnum_Syntax_RawValue(GPBEnum *message, int32_t value);
 
 #pragma mark - GPBEnumValue
@@ -380,20 +327,18 @@
   GPBEnumValue_FieldNumber_OptionsArray = 3,
 };
 
-/**
- * Enum value definition.
- **/
+/// Enum value definition.
 @interface GPBEnumValue : GPBMessage
 
-/** Enum value name. */
+/// Enum value name.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/** Enum value number. */
+/// Enum value number.
 @property(nonatomic, readwrite) int32_t number;
 
-/** Protocol buffer options. */
+/// Protocol buffer options.
 @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/// The number of items in @c optionsArray without causing the array to be created.
 @property(nonatomic, readonly) NSUInteger optionsArray_Count;
 
 @end
@@ -405,28 +350,16 @@
   GPBOption_FieldNumber_Value = 2,
 };
 
-/**
- * A protocol buffer option, which can be attached to a message, field,
- * enumeration, etc.
- **/
+/// A protocol buffer option, which can be attached to a message, field,
+/// enumeration, etc.
 @interface GPBOption : GPBMessage
 
-/**
- * The option's name. For protobuf built-in options (options defined in
- * descriptor.proto), this is the short name. For example, `"map_entry"`.
- * For custom options, it should be the fully-qualified name. For example,
- * `"google.api.http"`.
- **/
+/// The option's name. For example, `"java_package"`.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *name;
 
-/**
- * The option's value packed in an Any message. If the value is a primitive,
- * the corresponding wrapper type defined in google/protobuf/wrappers.proto
- * should be used. If the value is an enum, it should be stored as an int32
- * value using the google.protobuf.Int32Value type.
- **/
+/// The option's value. For example, `"com.google.protobuf"`.
 @property(nonatomic, readwrite, strong, null_resettable) GPBAny *value;
-/** Test to see if @c value has been set. */
+/// Test to see if @c value has been set.
 @property(nonatomic, readwrite) BOOL hasValue;
 
 @end
diff --git a/objectivec/google/protobuf/Type.pbobjc.m b/objectivec/google/protobuf/Type.pbobjc.m
index 7a94938..5554a22 100644
--- a/objectivec/google/protobuf/Type.pbobjc.m
+++ b/objectivec/google/protobuf/Type.pbobjc.m
@@ -1,27 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/type.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Type.pbobjc.h>
- #import <Protobuf/Any.pbobjc.h>
- #import <Protobuf/SourceContext.pbobjc.h>
-#else
- #import "google/protobuf/Type.pbobjc.h"
- #import "google/protobuf/Any.pbobjc.h"
- #import "google/protobuf/SourceContext.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Type.pbobjc.h"
+#import "google/protobuf/Any.pbobjc.h"
+#import "google/protobuf/SourceContext.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -31,8 +14,18 @@
 
 @implementation GPBTypeRoot
 
-// No extensions in the file and none of the imports (direct or indirect)
-// defined extensions, so no need to generate +extensionRegistry.
++ (GPBExtensionRegistry*)extensionRegistry {
+  // This is called by +initialize so there is no need to worry
+  // about thread safety and initialization of registry.
+  static GPBExtensionRegistry* registry = nil;
+  if (!registry) {
+    GPBDebugCheckRuntimeVersion();
+    registry = [[GPBExtensionRegistry alloc] init];
+    [registry addExtensions:[GPBAnyRoot extensionRegistry]];
+    [registry addExtensions:[GPBSourceContextRoot extensionRegistry]];
+  }
+  return registry;
+}
 
 @end
 
@@ -43,9 +36,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -163,7 +155,7 @@
         .number = GPBType_FieldNumber_Syntax,
         .hasIndex = 2,
         .offset = (uint32_t)offsetof(GPBType__storage_, syntax),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
     };
@@ -174,7 +166,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBType__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -235,7 +227,7 @@
         .number = GPBField_FieldNumber_Kind,
         .hasIndex = 0,
         .offset = (uint32_t)offsetof(GPBField__storage_, kind),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
       {
@@ -244,7 +236,7 @@
         .number = GPBField_FieldNumber_Cardinality,
         .hasIndex = 1,
         .offset = (uint32_t)offsetof(GPBField__storage_, cardinality),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
       {
@@ -271,7 +263,7 @@
         .number = GPBField_FieldNumber_TypeURL,
         .hasIndex = 4,
         .offset = (uint32_t)offsetof(GPBField__storage_, typeURL),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom),
+        .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
       },
       {
@@ -327,7 +319,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBField__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
 #if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     static const char *extraTextFormatInfo =
         "\001\006\004\241!!\000";
@@ -544,7 +536,7 @@
         .number = GPBEnum_FieldNumber_Syntax,
         .hasIndex = 2,
         .offset = (uint32_t)offsetof(GPBEnum__storage_, syntax),
-        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor),
+        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
       },
     };
@@ -555,7 +547,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBEnum__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -632,7 +624,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBEnumValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -686,7 +678,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBOption__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Wrappers.pbobjc.h b/objectivec/google/protobuf/Wrappers.pbobjc.h
index 3cb9fe7..4651050 100644
--- a/objectivec/google/protobuf/Wrappers.pbobjc.h
+++ b/objectivec/google/protobuf/Wrappers.pbobjc.h
@@ -1,23 +1,10 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/wrappers.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
+#import "GPBProtocolBuffers.h"
 
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers.h>
-#else
- #import "GPBProtocolBuffers.h"
-#endif
-
-#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
-#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
-#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
+#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
 // @@protoc_insertion_point(imports)
@@ -31,16 +18,14 @@
 
 #pragma mark - GPBWrappersRoot
 
-/**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- *   + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
+/// Exposes the extension registry for this file.
+///
+/// The base class provides:
+/// @code
+///   + (GPBExtensionRegistry *)extensionRegistry;
+/// @endcode
+/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
+/// this file and all files that it depends on.
 @interface GPBWrappersRoot : GPBRootObject
 @end
 
@@ -50,14 +35,12 @@
   GPBDoubleValue_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `double`.
- *
- * The JSON representation for `DoubleValue` is JSON number.
- **/
+/// Wrapper message for `double`.
+///
+/// The JSON representation for `DoubleValue` is JSON number.
 @interface GPBDoubleValue : GPBMessage
 
-/** The double value. */
+/// The double value.
 @property(nonatomic, readwrite) double value;
 
 @end
@@ -68,14 +51,12 @@
   GPBFloatValue_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `float`.
- *
- * The JSON representation for `FloatValue` is JSON number.
- **/
+/// Wrapper message for `float`.
+///
+/// The JSON representation for `FloatValue` is JSON number.
 @interface GPBFloatValue : GPBMessage
 
-/** The float value. */
+/// The float value.
 @property(nonatomic, readwrite) float value;
 
 @end
@@ -86,14 +67,12 @@
   GPBInt64Value_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `int64`.
- *
- * The JSON representation for `Int64Value` is JSON string.
- **/
+/// Wrapper message for `int64`.
+///
+/// The JSON representation for `Int64Value` is JSON string.
 @interface GPBInt64Value : GPBMessage
 
-/** The int64 value. */
+/// The int64 value.
 @property(nonatomic, readwrite) int64_t value;
 
 @end
@@ -104,14 +83,12 @@
   GPBUInt64Value_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `uint64`.
- *
- * The JSON representation for `UInt64Value` is JSON string.
- **/
+/// Wrapper message for `uint64`.
+///
+/// The JSON representation for `UInt64Value` is JSON string.
 @interface GPBUInt64Value : GPBMessage
 
-/** The uint64 value. */
+/// The uint64 value.
 @property(nonatomic, readwrite) uint64_t value;
 
 @end
@@ -122,14 +99,12 @@
   GPBInt32Value_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `int32`.
- *
- * The JSON representation for `Int32Value` is JSON number.
- **/
+/// Wrapper message for `int32`.
+///
+/// The JSON representation for `Int32Value` is JSON number.
 @interface GPBInt32Value : GPBMessage
 
-/** The int32 value. */
+/// The int32 value.
 @property(nonatomic, readwrite) int32_t value;
 
 @end
@@ -140,14 +115,12 @@
   GPBUInt32Value_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `uint32`.
- *
- * The JSON representation for `UInt32Value` is JSON number.
- **/
+/// Wrapper message for `uint32`.
+///
+/// The JSON representation for `UInt32Value` is JSON number.
 @interface GPBUInt32Value : GPBMessage
 
-/** The uint32 value. */
+/// The uint32 value.
 @property(nonatomic, readwrite) uint32_t value;
 
 @end
@@ -158,14 +131,12 @@
   GPBBoolValue_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `bool`.
- *
- * The JSON representation for `BoolValue` is JSON `true` and `false`.
- **/
+/// Wrapper message for `bool`.
+///
+/// The JSON representation for `BoolValue` is JSON `true` and `false`.
 @interface GPBBoolValue : GPBMessage
 
-/** The bool value. */
+/// The bool value.
 @property(nonatomic, readwrite) BOOL value;
 
 @end
@@ -176,14 +147,12 @@
   GPBStringValue_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `string`.
- *
- * The JSON representation for `StringValue` is JSON string.
- **/
+/// Wrapper message for `string`.
+///
+/// The JSON representation for `StringValue` is JSON string.
 @interface GPBStringValue : GPBMessage
 
-/** The string value. */
+/// The string value.
 @property(nonatomic, readwrite, copy, null_resettable) NSString *value;
 
 @end
@@ -194,14 +163,12 @@
   GPBBytesValue_FieldNumber_Value = 1,
 };
 
-/**
- * Wrapper message for `bytes`.
- *
- * The JSON representation for `BytesValue` is JSON string.
- **/
+/// Wrapper message for `bytes`.
+///
+/// The JSON representation for `BytesValue` is JSON string.
 @interface GPBBytesValue : GPBMessage
 
-/** The bytes value. */
+/// The bytes value.
 @property(nonatomic, readwrite, copy, null_resettable) NSData *value;
 
 @end
diff --git a/objectivec/google/protobuf/Wrappers.pbobjc.m b/objectivec/google/protobuf/Wrappers.pbobjc.m
index 5479eb1..5cc6c2e 100644
--- a/objectivec/google/protobuf/Wrappers.pbobjc.m
+++ b/objectivec/google/protobuf/Wrappers.pbobjc.m
@@ -1,23 +1,8 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/wrappers.proto
 
-// This CPP symbol can be defined to use imports that match up to the framework
-// imports needed when using CocoaPods.
-#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)
- #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>
-#else
- #import "GPBProtocolBuffers_RuntimeSupport.h"
-#endif
-
-#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS
- #import <Protobuf/Wrappers.pbobjc.h>
-#else
- #import "google/protobuf/Wrappers.pbobjc.h"
-#endif
+#import "GPBProtocolBuffers_RuntimeSupport.h"
+#import "google/protobuf/Wrappers.pbobjc.h"
 // @@protoc_insertion_point(imports)
 
 #pragma clang diagnostic push
@@ -27,9 +12,6 @@
 
 @implementation GPBWrappersRoot
 
-// No extensions in the file and no imports, so no need to generate
-// +extensionRegistry.
-
 @end
 
 #pragma mark - GPBWrappersRoot_FileDescriptor
@@ -39,9 +21,8 @@
   // about thread safety of the singleton.
   static GPBFileDescriptor *descriptor = NULL;
   if (!descriptor) {
-    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
+    GPBDebugCheckRuntimeVersion();
     descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                 objcPrefix:@"GPB"
                                                      syntax:GPBFileSyntaxProto3];
   }
   return descriptor;
@@ -81,7 +62,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBDoubleValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -124,7 +105,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBFloatValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -167,7 +148,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBInt64Value__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -210,7 +191,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBUInt64Value__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -253,7 +234,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBInt32Value__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -296,7 +277,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBUInt32Value__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -338,7 +319,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBBoolValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -381,7 +362,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBStringValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -424,7 +405,7 @@
                                         fields:fields
                                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBBytesValue__storage_)
-                                         flags:GPBDescriptorInitializationFlag_None];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/php/README.md b/php/README.md
deleted file mode 100644
index cebeb3e..0000000
--- a/php/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-This directory contains the Protocol Buffers runtime implementation via both a
-pure PHP package and a native c extension. The pure PHP package is intended to
-provide usability to wider range of PHP platforms, while the c extension is
-intended to provide higher performance. Both implementations provide the same
-runtime APIs and share the same generated code. Users don’t need to re-generate
-code for the same proto definition when they want to switch the implementation
-later.
-
-Both implementations make use of generated PHP code that defines message and
-enum types in PHP. We strongly recommend using protoc's PHP generation support
-with .proto files. The build process in this directory only installs the
-extension/package; you need to install protoc as well to have PHP code
-generation functionality.
-
-## Requirements
-
-To use PHP runtime library requires:
-
-- C extension: PHP 5.5.x or 5.6.x.
-- PHP package: PHP 5.5, 5.6 or 7.
-
-## Installation
-
-### C Extension
-
-#### Prerequirements
-
-To install the c extension, the following tools are needed:
-* autoconf
-* automake
-* libtool
-* make
-* gcc
-* pear
-* pecl
-
-On Ubuntu, you can install them with:
-```
-sudo apt-get install php-pear php5-dev autoconf automake libtool make gcc
-```
-On other platforms, please use the corresponding package managing tool to
-install them before proceeding.
-
-#### Installation from Source (Building extension)
-
-To build the c extension, run the following command:
-```
-cd ext/google/protobuf
-pear package
-sudo pecl install protobuf-{VERSION}.tgz
-```
-
-#### Installation from PECL
-
-When we release a version of Protocol Buffers, we will upload the extension to
-[PECL](https://pecl.php.net/). To use this pre-packaged extension, simply
-install it as you would any other extension:
-
-```
-sudo pecl install protobuf-{VERSION}
-```
-
-### PHP Package
-
-#### Installation from composer
-
-Simply add "google/protobuf" to the 'require' section of composer.json in your
-project.
-
-### Protoc
-
-Once the extension or package is installed, if you wish to generate PHP code
-from a `.proto` file, you will also want to install the Protocol Buffers
-compiler (protoc), as described in this repository's main `README` file.  The
-version of `protoc` included in the latest release supports the `--php_out`
-option to generate PHP code:
-```
-protoc --php_out=out_dir test.proto
-```
-
-## Usage
-
-For generated code:
-  https://developers.google.com/protocol-buffers/docs/reference/php-generated
-
-Known Issues
-------------
-
-* Missing native support for well known types.
-* Missing support for proto2.
-* No API provided for clear/copy messages.
-* No API provided for encoding/decoding with stream.
-* Map fields may not be garbage-collected if there is cycle reference.
-* No debug information for messages in c extension.
-* HHVM not tested.
-* C extension not tested on windows, mac, php 7.0.
-* Message name cannot be Empty.
diff --git a/php/composer.json b/php/composer.json
deleted file mode 100644
index 34e0447..0000000
--- a/php/composer.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "name": "google/protobuf",
-  "type": "library",
-  "description": "proto library for PHP",
-  "keywords": ["proto"],
-  "homepage": "https://developers.google.com/protocol-buffers/",
-  "license": "BSD-3-Clause",
-  "require": {
-    "php": ">=5.5.0"
-  },
-  "require-dev": {
-    "phpunit/phpunit": ">=4.8.0"
-  },
-  "autoload": {
-    "psr-4": {
-      "Google\\Protobuf\\": "src/Google/Protobuf",
-      "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf",
-      "": "tests/generated"
-    }
-  }
-}
diff --git a/php/ext/google/protobuf/array.c b/php/ext/google/protobuf/array.c
deleted file mode 100644
index e69bef4..0000000
--- a/php/ext/google/protobuf/array.c
+++ /dev/null
@@ -1,545 +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.
-
-#include <ext/spl/spl_iterators.h>
-#include <Zend/zend_API.h>
-#include <Zend/zend_interfaces.h>
-
-#include "protobuf.h"
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetGet, 0, 0, 1)
-  ZEND_ARG_INFO(0, index)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetSet, 0, 0, 2)
-  ZEND_ARG_INFO(0, index)
-  ZEND_ARG_INFO(0, newval)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_void, 0)
-ZEND_END_ARG_INFO()
-
-static zend_function_entry repeated_field_methods[] = {
-  PHP_ME(RepeatedField, __construct,  NULL,              ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, append,       NULL,              ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, offsetExists, arginfo_offsetGet, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, offsetGet,    arginfo_offsetGet, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, offsetSet,    arginfo_offsetSet, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, offsetUnset,  arginfo_offsetGet, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, count,        arginfo_void,      ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedField, getIterator,  arginfo_void,      ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-static zend_function_entry repeated_field_iter_methods[] = {
-  PHP_ME(RepeatedFieldIter, rewind,      arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedFieldIter, current,     arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedFieldIter, key,         arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedFieldIter, next,        arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(RepeatedFieldIter, valid,       arginfo_void, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-// Forward declare static functions.
-
-static int repeated_field_array_init(zval *array, upb_fieldtype_t type,
-                                     uint size ZEND_FILE_LINE_DC);
-static void repeated_field_write_dimension(zval *object, zval *offset,
-                                           zval *value TSRMLS_DC);
-static int repeated_field_has_dimension(zval *object, zval *offset TSRMLS_DC);
-static HashTable *repeated_field_get_gc(zval *object, CACHED_VALUE **table,
-                                        int *n TSRMLS_DC);
-#if PHP_MAJOR_VERSION < 7
-static zend_object_value repeated_field_create(zend_class_entry *ce TSRMLS_DC);
-static zend_object_value repeated_field_iter_create(zend_class_entry *ce TSRMLS_DC);
-#else
-static zend_object *repeated_field_create(zend_class_entry *ce TSRMLS_DC);
-static zend_object *repeated_field_iter_create(zend_class_entry *ce TSRMLS_DC);
-#endif
-
-// -----------------------------------------------------------------------------
-// RepeatedField creation/desctruction
-// -----------------------------------------------------------------------------
-
-zend_class_entry* repeated_field_type;
-zend_class_entry* repeated_field_iter_type;
-zend_object_handlers* repeated_field_handlers;
-zend_object_handlers* repeated_field_iter_handlers;
-
-// Define object free method.
-PHP_PROTO_OBJECT_FREE_START(RepeatedField, repeated_field)
-#if PHP_MAJOR_VERSION < 7
-php_proto_zval_ptr_dtor(intern->array);
-#else
-php_proto_zval_ptr_dtor(&intern->array);
-#endif
-PHP_PROTO_OBJECT_FREE_END
-
-PHP_PROTO_OBJECT_DTOR_START(RepeatedField, repeated_field)
-PHP_PROTO_OBJECT_DTOR_END
-
-// Define object create method.
-PHP_PROTO_OBJECT_CREATE_START(RepeatedField, repeated_field)
-#if PHP_MAJOR_VERSION < 7
-intern->array = NULL;
-#endif
-intern->type = 0;
-intern->msg_ce = NULL;
-PHP_PROTO_OBJECT_CREATE_END(RepeatedField, repeated_field)
-
-// Init class entry.
-PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\RepeatedField",
-                           RepeatedField, repeated_field)
-zend_class_implements(repeated_field_type TSRMLS_CC, 3, spl_ce_ArrayAccess,
-                      zend_ce_aggregate, spl_ce_Countable);
-repeated_field_handlers->write_dimension = repeated_field_write_dimension;
-repeated_field_handlers->get_gc = repeated_field_get_gc;
-PHP_PROTO_INIT_CLASS_END
-
-// Define array element free function.
-#if PHP_MAJOR_VERSION < 7
-static inline void php_proto_array_string_release(void *value) {
-  zval_ptr_dtor(value);
-}
-
-static inline void php_proto_array_object_release(void *value) {
-  zval_ptr_dtor(value);
-}
-static inline void php_proto_array_default_release(void *value) {
-}
-#else
-static inline void php_proto_array_string_release(zval *value) {
-  void* ptr = Z_PTR_P(value);
-  zend_string* object = *(zend_string**)ptr;
-  zend_string_release(object);
-  efree(ptr);
-}
-static inline void php_proto_array_object_release(zval *value) {
-  zval_ptr_dtor(value);
-}
-static void php_proto_array_default_release(zval* value) {
-  void* ptr = Z_PTR_P(value);
-  efree(ptr);
-}
-#endif
-
-static int repeated_field_array_init(zval *array, upb_fieldtype_t type,
-                                     uint size ZEND_FILE_LINE_DC) {
-  PHP_PROTO_ALLOC_ARRAY(array);
-
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      zend_hash_init(Z_ARRVAL_P(array), size, NULL,
-                     php_proto_array_string_release, 0);
-      break;
-    case UPB_TYPE_MESSAGE:
-      zend_hash_init(Z_ARRVAL_P(array), size, NULL,
-                     php_proto_array_object_release, 0);
-      break;
-    default:
-      zend_hash_init(Z_ARRVAL_P(array), size, NULL,
-                     php_proto_array_default_release, 0);
-  }
-  return SUCCESS;
-}
-
-// -----------------------------------------------------------------------------
-// RepeatedField Handlers
-// -----------------------------------------------------------------------------
-
-static void repeated_field_write_dimension(zval *object, zval *offset,
-                                           zval *value TSRMLS_DC) {
-  uint64_t index;
-
-  RepeatedField *intern = UNBOX(RepeatedField, object);
-  HashTable *ht = PHP_PROTO_HASH_OF(intern->array);
-  int size = native_slot_size(intern->type);
-
-  unsigned char memory[NATIVE_SLOT_MAX_SIZE];
-  memset(memory, 0, NATIVE_SLOT_MAX_SIZE);
-
-  if (!native_slot_set_by_array(intern->type, intern->msg_ce, memory,
-                                value TSRMLS_CC)) {
-    return;
-  }
-
-  if (!offset || Z_TYPE_P(offset) == IS_NULL) {
-    index = zend_hash_num_elements(PHP_PROTO_HASH_OF(intern->array));
-  } else {
-    if (protobuf_convert_to_uint64(offset, &index)) {
-      if (!zend_hash_index_exists(ht, index)) {
-        zend_error(E_USER_ERROR, "Element at %llu doesn't exist.\n",
-                   (long long unsigned int)index);
-        return;
-      }
-    } else {
-      return;
-    }
-  }
-
-  if (intern->type == UPB_TYPE_MESSAGE) {
-    php_proto_zend_hash_index_update_zval(ht, index, *(zval**)memory);
-  } else {
-    php_proto_zend_hash_index_update_mem(ht, index, memory, size, NULL);
-  }
-}
-
-#if PHP_MAJOR_VERSION < 7
-static HashTable *repeated_field_get_gc(zval *object, zval ***table,
-                                        int *n TSRMLS_DC) {
-#else
-static HashTable *repeated_field_get_gc(zval *object, zval **table, int *n) {
-#endif
-  *table = NULL;
-  *n = 0;
-  RepeatedField *intern = UNBOX(RepeatedField, object);
-  return PHP_PROTO_HASH_OF(intern->array);
-}
-
-// -----------------------------------------------------------------------------
-// C RepeatedField Utilities
-// -----------------------------------------------------------------------------
-
-void *repeated_field_index_native(RepeatedField *intern, int index TSRMLS_DC) {
-  HashTable *ht = PHP_PROTO_HASH_OF(intern->array);
-  void *value;
-
-  if (intern->type == UPB_TYPE_MESSAGE) {
-    if (php_proto_zend_hash_index_find_zval(ht, index, (void **)&value) ==
-        FAILURE) {
-      zend_error(E_USER_ERROR, "Element at %d doesn't exist.\n", index);
-      return NULL;
-    }
-  } else {
-    if (php_proto_zend_hash_index_find_mem(ht, index, (void **)&value) ==
-        FAILURE) {
-      zend_error(E_USER_ERROR, "Element at %d doesn't exist.\n", index);
-      return NULL;
-    }
-  }
-
-  return value;
-}
-
-void repeated_field_push_native(RepeatedField *intern, void *value) {
-  HashTable *ht = PHP_PROTO_HASH_OF(intern->array);
-  int size = native_slot_size(intern->type);
-  if (intern->type == UPB_TYPE_MESSAGE) {
-    php_proto_zend_hash_next_index_insert_zval(ht, value);
-  } else {
-    php_proto_zend_hash_next_index_insert_mem(ht, (void **)value, size, NULL);
-  }
-}
-
-void repeated_field_create_with_field(
-    zend_class_entry *ce, const upb_fielddef *field,
-    CACHED_VALUE *repeated_field PHP_PROTO_TSRMLS_DC) {
-  upb_fieldtype_t type = upb_fielddef_type(field);
-  const zend_class_entry *msg_ce = field_type_class(field PHP_PROTO_TSRMLS_CC);
-  repeated_field_create_with_type(ce, type, msg_ce,
-                                  repeated_field PHP_PROTO_TSRMLS_CC);
-}
-
-void repeated_field_create_with_type(
-    zend_class_entry *ce, upb_fieldtype_t type, const zend_class_entry *msg_ce,
-    CACHED_VALUE *repeated_field PHP_PROTO_TSRMLS_DC) {
-  CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(CACHED_PTR_TO_ZVAL_PTR(repeated_field),
-                                   repeated_field_type);
-
-  RepeatedField *intern =
-      UNBOX(RepeatedField, CACHED_TO_ZVAL_PTR(*repeated_field));
-  intern->type = type;
-  intern->msg_ce = msg_ce;
-#if PHP_MAJOR_VERSION < 7
-  MAKE_STD_ZVAL(intern->array);
-  repeated_field_array_init(intern->array, intern->type, 0 ZEND_FILE_LINE_CC);
-#else
-  repeated_field_array_init(&intern->array, intern->type, 0 ZEND_FILE_LINE_CC);
-#endif
-
-  // TODO(teboring): Link class entry for message and enum
-}
-
-
-// -----------------------------------------------------------------------------
-// PHP RepeatedField Methods
-// -----------------------------------------------------------------------------
-
-/**
- * Constructs an instance of RepeatedField.
- * @param long Type of the stored element.
- * @param string Message/Enum class name (message/enum fields only).
- */
-PHP_METHOD(RepeatedField, __construct) {
-  long type;
-  zend_class_entry* klass = NULL;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|C", &type, &klass) ==
-      FAILURE) {
-    return;
-  }
-
-  RepeatedField *intern = UNBOX(RepeatedField, getThis());
-  intern->type = to_fieldtype(type);
-  intern->msg_ce = klass;
-
-#if PHP_MAJOR_VERSION < 7
-  MAKE_STD_ZVAL(intern->array);
-  repeated_field_array_init(intern->array, intern->type, 0 ZEND_FILE_LINE_CC);
-#else
-  repeated_field_array_init(&intern->array, intern->type, 0 ZEND_FILE_LINE_CC);
-#endif
-
-  if (intern->type == UPB_TYPE_MESSAGE && klass == NULL) {
-    zend_error(E_USER_ERROR, "Message type must have concrete class.");
-    return;
-  }
-
-  // TODO(teboring): Consider enum.
-}
-
-/**
- * Append element to the end of the repeated field.
- * @param object The element to be added.
- */
-PHP_METHOD(RepeatedField, append) {
-  zval *value;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) ==
-      FAILURE) {
-    return;
-  }
-  repeated_field_write_dimension(getThis(), NULL, value TSRMLS_CC);
-}
-
-/**
- * Check whether the element at given index exists.
- * @param long The index to be checked.
- * @return bool True if the element at the given index exists.
- */
-PHP_METHOD(RepeatedField, offsetExists) {
-  long index;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    return;
-  }
-
-  RepeatedField *intern = UNBOX(RepeatedField, getThis());
-
-  RETURN_BOOL(index >= 0 &&
-              index < zend_hash_num_elements(PHP_PROTO_HASH_OF(intern->array)));
-}
-
-/**
- * Return the element at the given index.
- * This will also be called for: $ele = $arr[0]
- * @param long The index of the element to be fetched.
- * @return object The stored element at given index.
- * @exception Invalid type for index.
- * @exception Non-existing index.
- */
-PHP_METHOD(RepeatedField, offsetGet) {
-  long index;
-  void *memory;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    return;
-  }
-
-  RepeatedField *intern = UNBOX(RepeatedField, getThis());
-  HashTable *table = PHP_PROTO_HASH_OF(intern->array);
-
-  if (intern->type == UPB_TYPE_MESSAGE) {
-    if (php_proto_zend_hash_index_find_zval(table, index, (void **)&memory) ==
-        FAILURE) {
-      zend_error(E_USER_ERROR, "Element at %ld doesn't exist.\n", index);
-      return;
-    }
-  } else {
-    if (php_proto_zend_hash_index_find_mem(table, index, (void **)&memory) ==
-        FAILURE) {
-      zend_error(E_USER_ERROR, "Element at %ld doesn't exist.\n", index);
-      return;
-    }
-  }
-  native_slot_get_by_array(intern->type, memory,
-                           ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
-}
-
-/**
- * Assign the element at the given index.
- * This will also be called for: $arr []= $ele and $arr[0] = ele
- * @param long The index of the element to be assigned.
- * @param object The element to be assigned.
- * @exception Invalid type for index.
- * @exception Non-existing index.
- * @exception Incorrect type of the element.
- */
-PHP_METHOD(RepeatedField, offsetSet) {
-  zval *index, *value;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &index, &value) ==
-      FAILURE) {
-    return;
-  }
-  repeated_field_write_dimension(getThis(), index, value TSRMLS_CC);
-}
-
-/**
- * Remove the element at the given index.
- * This will also be called for: unset($arr)
- * @param long The index of the element to be removed.
- * @exception Invalid type for index.
- * @exception The element to be removed is not at the end of the RepeatedField.
- */
-PHP_METHOD(RepeatedField, offsetUnset) {
-  long index;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    return;
-  }
-
-  RepeatedField *intern = UNBOX(RepeatedField, getThis());
-
-  // Only the element at the end of the array can be removed.
-  if (index == -1 ||
-      index != (zend_hash_num_elements(PHP_PROTO_HASH_OF(intern->array)) - 1)) {
-    zend_error(E_USER_ERROR, "Cannot remove element at %ld.\n", index);
-    return;
-  }
-
-  zend_hash_index_del(PHP_PROTO_HASH_OF(intern->array), index);
-}
-
-/**
- * Return the number of stored elements.
- * This will also be called for: count($arr)
- * @return long The number of stored elements.
- */
-PHP_METHOD(RepeatedField, count) {
-  RepeatedField *intern = UNBOX(RepeatedField, getThis());
-
-  if (zend_parse_parameters_none() == FAILURE) {
-    return;
-  }
-
-  RETURN_LONG(zend_hash_num_elements(PHP_PROTO_HASH_OF(intern->array)));
-}
-
-/**
- * Return the beginning iterator.
- * This will also be called for: foreach($arr)
- * @return object Beginning iterator.
- */
-PHP_METHOD(RepeatedField, getIterator) {
-  CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(return_value,
-                                   repeated_field_iter_type);
-
-  RepeatedField *intern = UNBOX(RepeatedField, getThis());
-  RepeatedFieldIter *iter = UNBOX(RepeatedFieldIter, return_value);
-  iter->repeated_field = intern;
-  iter->position = 0;
-}
-
-// -----------------------------------------------------------------------------
-// RepeatedFieldIter creation/desctruction
-// -----------------------------------------------------------------------------
-
-// Define object free method.
-PHP_PROTO_OBJECT_FREE_START(RepeatedFieldIter, repeated_field_iter)
-PHP_PROTO_OBJECT_FREE_END
-
-PHP_PROTO_OBJECT_DTOR_START(RepeatedFieldIter, repeated_field_iter)
-PHP_PROTO_OBJECT_DTOR_END
-
-// Define object create method.
-PHP_PROTO_OBJECT_CREATE_START(RepeatedFieldIter, repeated_field_iter)
-intern->repeated_field = NULL;
-intern->position = 0;
-PHP_PROTO_OBJECT_CREATE_END(RepeatedFieldIter, repeated_field_iter)
-
-// Init class entry.
-PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\RepeatedFieldIter",
-                           RepeatedFieldIter, repeated_field_iter)
-zend_class_implements(repeated_field_iter_type TSRMLS_CC, 1, zend_ce_iterator);
-PHP_PROTO_INIT_CLASS_END
-
-// -----------------------------------------------------------------------------
-// PHP RepeatedFieldIter Methods
-// -----------------------------------------------------------------------------
-
-PHP_METHOD(RepeatedFieldIter, rewind) {
-  RepeatedFieldIter *intern = UNBOX(RepeatedFieldIter, getThis());
-  intern->position = 0;
-}
-
-PHP_METHOD(RepeatedFieldIter, current) {
-  RepeatedFieldIter *intern = UNBOX(RepeatedFieldIter, getThis());
-  RepeatedField *repeated_field = intern->repeated_field;
-
-  long index;
-  void *memory;
-
-  HashTable *table = PHP_PROTO_HASH_OF(repeated_field->array);
-
-  if (repeated_field->type == UPB_TYPE_MESSAGE) {
-    if (php_proto_zend_hash_index_find_zval(table, intern->position,
-                                            (void **)&memory) == FAILURE) {
-      zend_error(E_USER_ERROR, "Element at %d doesn't exist.\n", index);
-      return;
-    }
-  } else {
-    if (php_proto_zend_hash_index_find_mem(table, intern->position,
-                                           (void **)&memory) == FAILURE) {
-      zend_error(E_USER_ERROR, "Element at %d doesn't exist.\n", index);
-      return;
-    }
-  }
-  native_slot_get_by_array(repeated_field->type, memory,
-                           ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
-}
-
-PHP_METHOD(RepeatedFieldIter, key) {
-  RepeatedFieldIter *intern = UNBOX(RepeatedFieldIter, getThis());
-  RETURN_LONG(intern->position);
-}
-
-PHP_METHOD(RepeatedFieldIter, next) {
-  RepeatedFieldIter *intern = UNBOX(RepeatedFieldIter, getThis());
-  ++intern->position;
-}
-
-PHP_METHOD(RepeatedFieldIter, valid) {
-  RepeatedFieldIter *intern = UNBOX(RepeatedFieldIter, getThis());
-  RETURN_BOOL(zend_hash_num_elements(PHP_PROTO_HASH_OF(
-                  intern->repeated_field->array)) > intern->position);
-}
diff --git a/php/ext/google/protobuf/config.m4 b/php/ext/google/protobuf/config.m4
index ab032e4..b5946f7 100644
--- a/php/ext/google/protobuf/config.m4
+++ b/php/ext/google/protobuf/config.m4
@@ -1,10 +1,10 @@
+dnl lines starting with "dnl" are comments
+
 PHP_ARG_ENABLE(protobuf, whether to enable Protobuf extension, [  --enable-protobuf   Enable Protobuf extension])
 
 if test "$PHP_PROTOBUF" != "no"; then
 
-  PHP_NEW_EXTENSION(
-    protobuf,
-    array.c def.c encode_decode.c map.c message.c protobuf.c storage.c type_check.c upb.c utf8.c,
-    $ext_shared)
+  dnl this defines the extension
+  PHP_NEW_EXTENSION(protobuf, upb.c protobuf.c def.c message.c storage.c, $ext_shared)
 
 fi
diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c
index 8140fe4..fc18806 100644
--- a/php/ext/google/protobuf/def.c
+++ b/php/ext/google/protobuf/def.c
@@ -1,688 +1,147 @@
-// 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.
-
 #include "protobuf.h"
 
-// Forward declare.
-static void descriptor_init_c_instance(Descriptor* intern TSRMLS_DC);
-static void descriptor_free_c(Descriptor* object TSRMLS_DC);
-
-static void field_descriptor_init_c_instance(FieldDescriptor* intern TSRMLS_DC);
-static void field_descriptor_free_c(FieldDescriptor* object TSRMLS_DC);
-
-static void enum_descriptor_init_c_instance(EnumDescriptor* intern TSRMLS_DC);
-static void enum_descriptor_free_c(EnumDescriptor* object TSRMLS_DC);
-
-static void enum_value_descriptor_init_c_instance(
-    EnumValueDescriptor *intern TSRMLS_DC);
-static void enum_value_descriptor_free_c(EnumValueDescriptor *object TSRMLS_DC);
-
-static void descriptor_pool_free_c(DescriptorPool* object TSRMLS_DC);
-static void descriptor_pool_init_c_instance(DescriptorPool* pool TSRMLS_DC);
-
-static void internal_descriptor_pool_free_c(
-    InternalDescriptorPool *object TSRMLS_DC);
-static void internal_descriptor_pool_init_c_instance(
-    InternalDescriptorPool *pool TSRMLS_DC);
-
-static void oneof_descriptor_free_c(Oneof* object TSRMLS_DC);
-static void oneof_descriptor_init_c_instance(Oneof* pool TSRMLS_DC);
-
 // -----------------------------------------------------------------------------
 // Common Utilities
 // -----------------------------------------------------------------------------
 
-static void check_upb_status(const upb_status* status, const char* msg) {
+void check_upb_status(const upb_status* status, const char* msg) {
   if (!upb_ok(status)) {
-    zend_error(E_ERROR, "%s: %s\n", msg, upb_status_errmsg(status));
+    zend_error("%s: %s\n", msg, upb_status_errmsg(status));
   }
 }
 
-static void upb_filedef_free(void *r) {
-  upb_filedef *f = *(upb_filedef **)r;
-  size_t i;
 
-  for (i = 0; i < upb_filedef_depcount(f); i++) {
-    upb_filedef_unref(upb_filedef_dep(f, i), f);
+static upb_def *check_notfrozen(const upb_def *def) {
+  if (upb_def_isfrozen(def)) {
+    zend_error(E_ERROR,
+               "Attempt to modify a frozen descriptor. Once descriptors are "
+               "added to the descriptor pool, they may not be modified.");
   }
-
-  upb_inttable_uninit(&f->defs);
-  upb_inttable_uninit(&f->deps);
-  upb_gfree((void *)f->name);
-  upb_gfree((void *)f->package);
-  upb_gfree(f);
+  return (upb_def *)def;
 }
 
-// Camel-case the field name and append "Entry" for generated map entry name.
-// e.g. map<KeyType, ValueType> foo_map => FooMapEntry
-static void append_map_entry_name(char *result, const char *field_name,
-                                  int pos) {
-  bool cap_next = true;
-  int i;
+static upb_msgdef *check_msgdef_notfrozen(const upb_msgdef *def) {
+  return upb_downcast_msgdef_mutable(check_notfrozen((const upb_def *)def));
+}
 
-  for (i = 0; i < strlen(field_name); ++i) {
-    if (field_name[i] == '_') {
-      cap_next = true;
-    } else if (cap_next) {
-      // Note: Do not use ctype.h due to locales.
-      if ('a' <= field_name[i] && field_name[i] <= 'z') {
-        result[pos++] = field_name[i] - 'a' + 'A';
-      } else {
-        result[pos++] = field_name[i];
-      }
-      cap_next = false;
-    } else {
-      result[pos++] = field_name[i];
-    }
+static upb_fielddef *check_fielddef_notfrozen(const upb_fielddef *def) {
+  return upb_downcast_fielddef_mutable(check_notfrozen((const upb_def *)def));
+}
+
+#define PROTOBUF_WRAP_INTERN(wrapper, intern, intern_dtor)            \
+  Z_TYPE_P(wrapper) = IS_OBJECT;                                      \
+  Z_OBJVAL_P(wrapper)                                                 \
+      .handle = zend_objects_store_put(                               \
+      intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, \
+      intern_dtor, NULL TSRMLS_CC);                                   \
+  Z_OBJVAL_P(wrapper).handlers = zend_get_std_object_handlers();
+
+#define PROTOBUF_SETUP_ZEND_WRAPPER(class_name, class_name_lower, wrapper,    \
+                                    intern)                                   \
+  Z_TYPE_P(wrapper) = IS_OBJECT;                                              \
+  class_name *intern = ALLOC(class_name);                                     \
+  memset(intern, 0, sizeof(class_name));                                      \
+  class_name_lower##_init_c_instance(intern TSRMLS_CC);                       \
+  Z_OBJVAL_P(wrapper)                                                         \
+      .handle = zend_objects_store_put(intern, NULL, class_name_lower##_free, \
+                                       NULL TSRMLS_CC);                       \
+  Z_OBJVAL_P(wrapper).handlers = zend_get_std_object_handlers();
+
+#define PROTOBUF_CREATE_ZEND_WRAPPER(class_name, class_name_lower, wrapper, \
+                                     intern)                                \
+  MAKE_STD_ZVAL(wrapper);                                                   \
+  PROTOBUF_SETUP_ZEND_WRAPPER(class_name, class_name_lower, wrapper, intern);
+
+#define DEFINE_CLASS(name, name_lower, string_name)                          \
+  zend_class_entry *name_lower##_type;                                       \
+  void name_lower##_init(TSRMLS_D) {                                         \
+    zend_class_entry class_type;                                             \
+    INIT_CLASS_ENTRY(class_type, string_name, name_lower##_methods);         \
+    name_lower##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
+    name_lower##_type->create_object = name_lower##_create;                  \
+  }                                                                          \
+  name *php_to_##name_lower(zval *val TSRMLS_DC) {                           \
+    return (name *)zend_object_store_get_object(val TSRMLS_CC);              \
+  }                                                                          \
+  void name_lower##_free(void *object TSRMLS_DC) {                           \
+    name *intern = (name *)object;                                           \
+    name_lower##_free_c(intern TSRMLS_CC);                                   \
+    efree(object);                                                           \
+  }                                                                          \
+  zend_object_value name_lower##_create(zend_class_entry *ce TSRMLS_DC) {    \
+    zend_object_value return_value;                                          \
+    name *intern = (name *)emalloc(sizeof(name));                            \
+    memset(intern, 0, sizeof(name));                                         \
+    name_lower##_init_c_instance(intern TSRMLS_CC);                          \
+    return_value.handle = zend_objects_store_put(                            \
+        intern, (zend_objects_store_dtor_t)zend_objects_destroy_object,      \
+        name_lower##_free, NULL TSRMLS_CC);                                  \
+    return_value.handlers = zend_get_std_object_handlers();                  \
+    return return_value;                                                     \
   }
-  strcat(result, "Entry");
-}
-
-#define CHECK_UPB(code, msg)             \
-  do {                                   \
-    upb_status status = UPB_STATUS_INIT; \
-    code;                                \
-    check_upb_status(&status, msg);      \
-  } while (0)
-
-// -----------------------------------------------------------------------------
-// GPBType
-// -----------------------------------------------------------------------------
-
-zend_class_entry* gpb_type_type;
-
-static zend_function_entry gpb_type_methods[] = {
-  ZEND_FE_END
-};
-
-void gpb_type_init(TSRMLS_D) {
-  zend_class_entry class_type;
-  INIT_CLASS_ENTRY(class_type, "Google\\Protobuf\\Internal\\GPBType",
-                   gpb_type_methods);
-  gpb_type_type = zend_register_internal_class(&class_type TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("DOUBLE"),  1 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("FLOAT"),   2 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("INT64"),   3 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("UINT64"),  4 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("INT32"),   5 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("FIXED64"), 6 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("FIXED32"), 7 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("BOOL"),    8 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("STRING"),  9 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("GROUP"),   10 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("MESSAGE"), 11 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("BYTES"),   12 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("UINT32"),  13 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("ENUM"),    14 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("SFIXED32"),
-                                   15 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("SFIXED64"),
-                                   16 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("SINT32"), 17 TSRMLS_CC);
-  zend_declare_class_constant_long(gpb_type_type, STR("SINT64"), 18 TSRMLS_CC);
-}
-
-// -----------------------------------------------------------------------------
-// Descriptor
-// -----------------------------------------------------------------------------
-
-static zend_function_entry descriptor_methods[] = {
-  PHP_ME(Descriptor, getClass, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Descriptor, getFullName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Descriptor, getField, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Descriptor, getFieldCount, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Descriptor, getOneofDecl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Descriptor, getOneofDeclCount, NULL, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-DEFINE_CLASS(Descriptor, descriptor, "Google\\Protobuf\\Descriptor");
-
-static void descriptor_free_c(Descriptor *self TSRMLS_DC) {
-  if (self->layout) {
-    free_layout(self->layout);
-  }
-  if (self->fill_handlers) {
-    upb_handlers_unref(self->fill_handlers, &self->fill_handlers);
-  }
-  if (self->fill_method) {
-    upb_pbdecodermethod_unref(self->fill_method, &self->fill_method);
-  }
-  if (self->json_fill_method) {
-    upb_json_parsermethod_unref(self->json_fill_method,
-                                &self->json_fill_method);
-  }
-  if (self->pb_serialize_handlers) {
-    upb_handlers_unref(self->pb_serialize_handlers,
-                       &self->pb_serialize_handlers);
-  }
-  if (self->json_serialize_handlers) {
-    upb_handlers_unref(self->json_serialize_handlers,
-                       &self->json_serialize_handlers);
-  }
-  if (self->json_serialize_handlers_preserve) {
-    upb_handlers_unref(self->json_serialize_handlers_preserve,
-                       &self->json_serialize_handlers_preserve);
-  }
-}
-
-static void descriptor_init_c_instance(Descriptor *desc TSRMLS_DC) {
-  desc->msgdef = NULL;
-  desc->layout = NULL;
-  desc->klass = NULL;
-  desc->fill_handlers = NULL;
-  desc->fill_method = NULL;
-  desc->json_fill_method = NULL;
-  desc->pb_serialize_handlers = NULL;
-  desc->json_serialize_handlers = NULL;
-  desc->json_serialize_handlers_preserve = NULL;
-}
-
-PHP_METHOD(Descriptor, getClass) {
-  Descriptor *intern = UNBOX(Descriptor, getThis());
-#if PHP_MAJOR_VERSION < 7
-  const char* classname = intern->klass->name;
-#else
-  const char* classname = ZSTR_VAL(intern->klass->name);
-#endif
-  PHP_PROTO_RETVAL_STRINGL(classname, strlen(classname), 1);
-}
-
-PHP_METHOD(Descriptor, getFullName) {
-  Descriptor *intern = UNBOX(Descriptor, getThis());
-  const char* fullname = upb_msgdef_fullname(intern->msgdef);
-  PHP_PROTO_RETVAL_STRINGL(fullname, strlen(fullname), 1);
-}
-
-PHP_METHOD(Descriptor, getField) {
-  long index;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    zend_error(E_USER_ERROR, "Expect integer for index.\n");
-    return;
-  }
-
-  Descriptor *intern = UNBOX(Descriptor, getThis());
-  int field_num = upb_msgdef_numfields(intern->msgdef);
-  if (index < 0 || index >= field_num) {
-    zend_error(E_USER_ERROR, "Cannot get element at %ld.\n", index);
-    return;
-  }
-
-  upb_msg_field_iter iter;
-  int i;
-  for(upb_msg_field_begin(&iter, intern->msgdef), i = 0;
-      !upb_msg_field_done(&iter) && i < index;
-      upb_msg_field_next(&iter), i++);
-  const upb_fielddef *field = upb_msg_iter_field(&iter);
-
-  PHP_PROTO_HASHTABLE_VALUE field_hashtable_value = get_def_obj(field);
-  if (field_hashtable_value == NULL) {
-#if PHP_MAJOR_VERSION < 7
-    MAKE_STD_ZVAL(field_hashtable_value);
-    ZVAL_OBJ(field_hashtable_value, field_descriptor_type->create_object(
-                                        field_descriptor_type TSRMLS_CC));
-    Z_DELREF_P(field_hashtable_value);
-#else
-    field_hashtable_value =
-        field_descriptor_type->create_object(field_descriptor_type TSRMLS_CC);
-    --GC_REFCOUNT(field_hashtable_value);
-#endif
-    FieldDescriptor *field_php =
-        UNBOX_HASHTABLE_VALUE(FieldDescriptor, field_hashtable_value);
-    field_php->fielddef = field;
-    add_def_obj(field, field_hashtable_value);
-  }
-
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(field_hashtable_value, 1, 0);
-#else
-  ++GC_REFCOUNT(field_hashtable_value);
-  RETURN_OBJ(field_hashtable_value);
-#endif
-}
-
-PHP_METHOD(Descriptor, getFieldCount) {
-  Descriptor *intern = UNBOX(Descriptor, getThis());
-  RETURN_LONG(upb_msgdef_numfields(intern->msgdef));
-}
-
-PHP_METHOD(Descriptor, getOneofDecl) {
-  long index;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    zend_error(E_USER_ERROR, "Expect integer for index.\n");
-    return;
-  }
-
-  Descriptor *intern = UNBOX(Descriptor, getThis());
-  int field_num = upb_msgdef_numoneofs(intern->msgdef);
-  if (index < 0 || index >= field_num) {
-    zend_error(E_USER_ERROR, "Cannot get element at %ld.\n", index);
-    return;
-  }
-
-  upb_msg_oneof_iter iter;
-  int i;
-  for(upb_msg_oneof_begin(&iter, intern->msgdef), i = 0;
-      !upb_msg_oneof_done(&iter) && i < index;
-      upb_msg_oneof_next(&iter), i++);
-  upb_oneofdef *oneof = upb_msg_iter_oneof(&iter);
-
-  ZVAL_OBJ(return_value, oneof_descriptor_type->create_object(
-                             oneof_descriptor_type TSRMLS_CC));
-  Oneof *oneof_php = UNBOX(Oneof, return_value);
-  oneof_php->oneofdef = oneof;
-}
-
-PHP_METHOD(Descriptor, getOneofDeclCount) {
-  Descriptor *intern = UNBOX(Descriptor, getThis());
-  RETURN_LONG(upb_msgdef_numoneofs(intern->msgdef));
-}
-
-// -----------------------------------------------------------------------------
-// EnumDescriptor
-// -----------------------------------------------------------------------------
-
-static zend_function_entry enum_descriptor_methods[] = {
-  PHP_ME(EnumDescriptor, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumDescriptor, getValueCount, NULL, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-DEFINE_CLASS(EnumDescriptor, enum_descriptor,
-             "Google\\Protobuf\\EnumDescriptor");
-
-static void enum_descriptor_free_c(EnumDescriptor *self TSRMLS_DC) {
-}
-
-static void enum_descriptor_init_c_instance(EnumDescriptor *self TSRMLS_DC) {
-  self->enumdef = NULL;
-  self->klass = NULL;
-}
-
-PHP_METHOD(EnumDescriptor, getValue) {
-  long index;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    zend_error(E_USER_ERROR, "Expect integer for index.\n");
-    return;
-  }
-
-  EnumDescriptor *intern = UNBOX(EnumDescriptor, getThis());
-  int field_num = upb_enumdef_numvals(intern->enumdef);
-  if (index < 0 || index >= field_num) {
-    zend_error(E_USER_ERROR, "Cannot get element at %ld.\n", index);
-    return;
-  }
-
-  upb_enum_iter iter;
-  int i;
-  for(upb_enum_begin(&iter, intern->enumdef), i = 0;
-      !upb_enum_done(&iter) && i < index;
-      upb_enum_next(&iter), i++);
-
-  ZVAL_OBJ(return_value, enum_value_descriptor_type->create_object(
-                             enum_value_descriptor_type TSRMLS_CC));
-  EnumValueDescriptor *enum_value_php =
-      UNBOX(EnumValueDescriptor, return_value);
-  enum_value_php->name = upb_enum_iter_name(&iter);
-  enum_value_php->number = upb_enum_iter_number(&iter);
-}
-
-PHP_METHOD(EnumDescriptor, getValueCount) {
-  EnumDescriptor *intern = UNBOX(EnumDescriptor, getThis());
-  RETURN_LONG(upb_enumdef_numvals(intern->enumdef));
-}
-
-// -----------------------------------------------------------------------------
-// EnumValueDescriptor
-// -----------------------------------------------------------------------------
-
-static zend_function_entry enum_value_descriptor_methods[] = {
-  PHP_ME(EnumValueDescriptor, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValueDescriptor, getNumber, NULL, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-DEFINE_CLASS(EnumValueDescriptor, enum_value_descriptor,
-             "Google\\Protobuf\\EnumValueDescriptor");
-
-static void enum_value_descriptor_free_c(EnumValueDescriptor *self TSRMLS_DC) {
-}
-
-static void enum_value_descriptor_init_c_instance(EnumValueDescriptor *self TSRMLS_DC) {
-  self->name = NULL;
-  self->number = 0;
-}
-
-PHP_METHOD(EnumValueDescriptor, getName) {
-  EnumValueDescriptor *intern = UNBOX(EnumValueDescriptor, getThis());
-  PHP_PROTO_RETVAL_STRINGL(intern->name, strlen(intern->name), 1);
-}
-
-PHP_METHOD(EnumValueDescriptor, getNumber) {
-  EnumValueDescriptor *intern = UNBOX(EnumValueDescriptor, getThis());
-  RETURN_LONG(intern->number);
-}
-
-// -----------------------------------------------------------------------------
-// FieldDescriptor
-// -----------------------------------------------------------------------------
-
-static zend_function_entry field_descriptor_methods[] = {
-  PHP_ME(FieldDescriptor, getName,   NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldDescriptor, getNumber, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldDescriptor, getLabel,  NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldDescriptor, getType,   NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldDescriptor, isMap,     NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldDescriptor, getEnumType, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldDescriptor, getMessageType, NULL, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-DEFINE_CLASS(FieldDescriptor, field_descriptor,
-             "Google\\Protobuf\\FieldDescriptor");
-
-static void field_descriptor_free_c(FieldDescriptor *self TSRMLS_DC) {
-}
-
-static void field_descriptor_init_c_instance(FieldDescriptor *self TSRMLS_DC) {
-  self->fielddef = NULL;
-}
-
-upb_fieldtype_t to_fieldtype(upb_descriptortype_t type) {
-  switch (type) {
-#define CASE(descriptor_type, type)           \
-  case UPB_DESCRIPTOR_TYPE_##descriptor_type: \
-    return UPB_TYPE_##type;
-
-  CASE(FLOAT,    FLOAT);
-  CASE(DOUBLE,   DOUBLE);
-  CASE(BOOL,     BOOL);
-  CASE(STRING,   STRING);
-  CASE(BYTES,    BYTES);
-  CASE(MESSAGE,  MESSAGE);
-  CASE(GROUP,    MESSAGE);
-  CASE(ENUM,     ENUM);
-  CASE(INT32,    INT32);
-  CASE(INT64,    INT64);
-  CASE(UINT32,   UINT32);
-  CASE(UINT64,   UINT64);
-  CASE(SINT32,   INT32);
-  CASE(SINT64,   INT64);
-  CASE(FIXED32,  UINT32);
-  CASE(FIXED64,  UINT64);
-  CASE(SFIXED32, INT32);
-  CASE(SFIXED64, INT64);
-
-#undef CONVERT
-
-  }
-
-  zend_error(E_ERROR, "Unknown field type.");
-  return 0;
-}
-
-PHP_METHOD(FieldDescriptor, getName) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  const char* name = upb_fielddef_name(intern->fielddef);
-  PHP_PROTO_RETVAL_STRINGL(name, strlen(name), 1);
-}
-
-PHP_METHOD(FieldDescriptor, getNumber) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  RETURN_LONG(upb_fielddef_number(intern->fielddef));
-}
-
-PHP_METHOD(FieldDescriptor, getLabel) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  RETURN_LONG(upb_fielddef_label(intern->fielddef));
-}
-
-PHP_METHOD(FieldDescriptor, getType) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  RETURN_LONG(upb_fielddef_descriptortype(intern->fielddef));
-}
-
-PHP_METHOD(FieldDescriptor, isMap) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  RETURN_BOOL(upb_fielddef_ismap(intern->fielddef));
-}
-
-PHP_METHOD(FieldDescriptor, getEnumType) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  const upb_enumdef *enumdef = upb_fielddef_enumsubdef(intern->fielddef);
-  if (enumdef == NULL) {
-    char error_msg[100];
-    sprintf(error_msg, "Cannot get enum type for non-enum field '%s'",
-            upb_fielddef_name(intern->fielddef));
-    zend_throw_exception(NULL, error_msg, 0 TSRMLS_CC);
-    return;
-  }
-  PHP_PROTO_HASHTABLE_VALUE desc = get_def_obj(enumdef);
-
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(desc, 1, 0);
-#else
-  ++GC_REFCOUNT(desc);
-  RETURN_OBJ(desc);
-#endif
-}
-
-PHP_METHOD(FieldDescriptor, getMessageType) {
-  FieldDescriptor *intern = UNBOX(FieldDescriptor, getThis());
-  const upb_msgdef *msgdef = upb_fielddef_msgsubdef(intern->fielddef);
-  if (msgdef == NULL) {
-    char error_msg[100];
-    sprintf(error_msg, "Cannot get message type for non-message field '%s'",
-            upb_fielddef_name(intern->fielddef));
-    zend_throw_exception(NULL, error_msg, 0 TSRMLS_CC);
-    return;
-  }
-  PHP_PROTO_HASHTABLE_VALUE desc = get_def_obj(msgdef);
-
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(desc, 1, 0);
-#else
-  ++GC_REFCOUNT(desc);
-  RETURN_OBJ(desc);
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// Oneof
-// -----------------------------------------------------------------------------
-
-static zend_function_entry oneof_descriptor_methods[] = {
-  PHP_ME(Oneof, getName,  NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Oneof, getField, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Oneof, getFieldCount, NULL, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-DEFINE_CLASS(Oneof, oneof_descriptor,
-             "Google\\Protobuf\\OneofDescriptor");
-
-static void oneof_descriptor_free_c(Oneof *self TSRMLS_DC) {
-}
-
-static void oneof_descriptor_init_c_instance(Oneof *self TSRMLS_DC) {
-  self->oneofdef = NULL;
-}
-
-PHP_METHOD(Oneof, getName) {
-  Oneof *intern = UNBOX(Oneof, getThis());
-  const char *name = upb_oneofdef_name(intern->oneofdef);
-  PHP_PROTO_RETVAL_STRINGL(name, strlen(name), 1);
-}
-
-PHP_METHOD(Oneof, getField) {
-  long index;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    zend_error(E_USER_ERROR, "Expect integer for index.\n");
-    return;
-  }
-
-  Oneof *intern = UNBOX(Oneof, getThis());
-  int field_num = upb_oneofdef_numfields(intern->oneofdef);
-  if (index < 0 || index >= field_num) {
-    zend_error(E_USER_ERROR, "Cannot get element at %ld.\n", index);
-    return;
-  }
-
-  upb_oneof_iter iter;
-  int i;
-  for(upb_oneof_begin(&iter, intern->oneofdef), i = 0;
-      !upb_oneof_done(&iter) && i < index;
-      upb_oneof_next(&iter), i++);
-  const upb_fielddef *field = upb_oneof_iter_field(&iter);
-
-  PHP_PROTO_HASHTABLE_VALUE field_hashtable_value = get_def_obj(field);
-  if (field_hashtable_value == NULL) {
-#if PHP_MAJOR_VERSION < 7
-    MAKE_STD_ZVAL(field_hashtable_value);
-    ZVAL_OBJ(field_hashtable_value, field_descriptor_type->create_object(
-                                        field_descriptor_type TSRMLS_CC));
-#else
-    field_hashtable_value =
-        field_descriptor_type->create_object(field_descriptor_type TSRMLS_CC);
-#endif
-    FieldDescriptor *field_php =
-        UNBOX_HASHTABLE_VALUE(FieldDescriptor, field_hashtable_value);
-    field_php->fielddef = field;
-    add_def_obj(field, field_hashtable_value);
-  }
-
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(field_hashtable_value, 1, 0);
-#else
-  ++GC_REFCOUNT(field_hashtable_value);
-  RETURN_OBJ(field_hashtable_value);
-#endif
-}
-
-PHP_METHOD(Oneof, getFieldCount) {
-  Oneof *intern = UNBOX(Oneof, getThis());
-  RETURN_LONG(upb_oneofdef_numfields(intern->oneofdef));
-}
 
 // -----------------------------------------------------------------------------
 // DescriptorPool
 // -----------------------------------------------------------------------------
 
 static zend_function_entry descriptor_pool_methods[] = {
-  PHP_ME(DescriptorPool, getGeneratedPool, NULL,
-         ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(DescriptorPool, getDescriptorByClassName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(DescriptorPool, getEnumDescriptorByClassName, NULL, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-static zend_function_entry internal_descriptor_pool_methods[] = {
-  PHP_ME(InternalDescriptorPool, getGeneratedPool, NULL,
-         ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(InternalDescriptorPool, internalAddGeneratedFile, NULL, ZEND_ACC_PUBLIC)
+  PHP_ME(DescriptorPool, addMessage, NULL, ZEND_ACC_PUBLIC)
+  PHP_ME(DescriptorPool, finalize, NULL, ZEND_ACC_PUBLIC)
   ZEND_FE_END
 };
 
 DEFINE_CLASS(DescriptorPool, descriptor_pool,
              "Google\\Protobuf\\DescriptorPool");
-DEFINE_CLASS(InternalDescriptorPool, internal_descriptor_pool,
-             "Google\\Protobuf\\Internal\\DescriptorPool");
 
-// wrapper of generated pool
-#if PHP_MAJOR_VERSION < 7
-zval* generated_pool_php;
-zval* internal_generated_pool_php;
-#else
-zend_object *generated_pool_php;
-zend_object *internal_generated_pool_php;
-#endif
-InternalDescriptorPool *generated_pool;  // The actual generated pool
+DescriptorPool *generated_pool;  // The actual generated pool
 
-void init_generated_pool_once(TSRMLS_D) {
-  if (generated_pool == NULL) {
-#if PHP_MAJOR_VERSION < 7
-    MAKE_STD_ZVAL(generated_pool_php);
-    MAKE_STD_ZVAL(internal_generated_pool_php);
-    ZVAL_OBJ(internal_generated_pool_php,
-             internal_descriptor_pool_type->create_object(
-                 internal_descriptor_pool_type TSRMLS_CC));
-    generated_pool = UNBOX(InternalDescriptorPool, internal_generated_pool_php);
-    ZVAL_OBJ(generated_pool_php, descriptor_pool_type->create_object(
-                                     descriptor_pool_type TSRMLS_CC));
-#else
-    internal_generated_pool_php = internal_descriptor_pool_type->create_object(
-        internal_descriptor_pool_type TSRMLS_CC);
-    generated_pool = (InternalDescriptorPool *)((char *)internal_generated_pool_php -
-                                        XtOffsetOf(InternalDescriptorPool, std));
-    generated_pool_php =
-        descriptor_pool_type->create_object(descriptor_pool_type TSRMLS_CC);
-#endif
+ZEND_FUNCTION(get_generated_pool) {
+  if (PROTOBUF_G(generated_pool) == NULL) {
+    MAKE_STD_ZVAL(PROTOBUF_G(generated_pool));
+    Z_TYPE_P(PROTOBUF_G(generated_pool)) = IS_OBJECT;
+    generated_pool = ALLOC(DescriptorPool);
+    descriptor_pool_init_c_instance(generated_pool TSRMLS_CC);
+    Z_OBJ_HANDLE_P(PROTOBUF_G(generated_pool)) = zend_objects_store_put(
+        generated_pool, NULL,
+        (zend_objects_free_object_storage_t)descriptor_pool_free, NULL TSRMLS_CC);
+    Z_OBJ_HT_P(PROTOBUF_G(generated_pool)) = zend_get_std_object_handlers();
   }
+  RETURN_ZVAL(PROTOBUF_G(generated_pool), 1, 0);
 }
 
-static void internal_descriptor_pool_init_c_instance(
-    InternalDescriptorPool *pool TSRMLS_DC) {
-  pool->symtab = upb_symtab_new();
+void descriptor_pool_init_c_instance(DescriptorPool* pool TSRMLS_DC) {
+  zend_object_std_init(&pool->std, descriptor_pool_type TSRMLS_CC);
+  pool->symtab = upb_symtab_new(&pool->symtab);
 
   ALLOC_HASHTABLE(pool->pending_list);
   zend_hash_init(pool->pending_list, 1, NULL, ZVAL_PTR_DTOR, 0);
 }
 
-static void internal_descriptor_pool_free_c(
-    InternalDescriptorPool *pool TSRMLS_DC) {
-  upb_symtab_free(pool->symtab);
-
+void descriptor_pool_free_c(DescriptorPool *pool TSRMLS_DC) {
+  upb_symtab_unref(pool->symtab, &pool->symtab);
   zend_hash_destroy(pool->pending_list);
   FREE_HASHTABLE(pool->pending_list);
 }
 
-static void descriptor_pool_init_c_instance(DescriptorPool *pool TSRMLS_DC) {
-  assert(generated_pool != NULL);
-  pool->intern = generated_pool;
-}
-
-static void descriptor_pool_free_c(DescriptorPool *pool TSRMLS_DC) {
-}
-
-static void validate_enumdef(const upb_enumdef *enumdef) {
-  // Verify that an entry exists with integer value 0. (This is the default
-  // value.)
-  const char *lookup = upb_enumdef_iton(enumdef, 0);
-  if (lookup == NULL) {
-    zend_error(E_USER_ERROR,
-               "Enum definition does not contain a value for '0'.");
+PHP_METHOD(DescriptorPool, addMessage) {
+  char *name = NULL;
+  int str_len;
+  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &str_len) ==
+      FAILURE) {
+    return;
   }
+
+  zval* retval = NULL;
+  PROTOBUF_CREATE_ZEND_WRAPPER(MessageBuilderContext, message_builder_context,
+                               retval, context);
+
+  MAKE_STD_ZVAL(context->pool);
+  ZVAL_ZVAL(context->pool, getThis(), 1, 0);
+
+  Descriptor *desc = php_to_descriptor(context->descriptor TSRMLS_CC);
+  Descriptor_name_set(desc, name);
+
+  RETURN_ZVAL(retval, 0, 1);
 }
 
 static void validate_msgdef(const upb_msgdef* msgdef) {
@@ -698,303 +157,225 @@
   }
 }
 
-PHP_METHOD(DescriptorPool, getGeneratedPool) {
-  init_generated_pool_once(TSRMLS_C);
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(generated_pool_php, 1, 0);
-#else
-  ++GC_REFCOUNT(generated_pool_php);
-  RETURN_OBJ(generated_pool_php);
-#endif
+PHP_METHOD(DescriptorPool, finalize) {
+  DescriptorPool *self = php_to_descriptor_pool(getThis() TSRMLS_CC);
+  Bucket *temp;
+  int i, num;
+
+  num = zend_hash_num_elements(self->pending_list);
+  upb_def **defs = emalloc(sizeof(upb_def *) * num);
+
+  for (i = 0, temp = self->pending_list->pListHead; temp != NULL;
+       temp = temp->pListNext) {
+    zval *def_php = *(zval **)temp->pData;
+    Descriptor* desc = php_to_descriptor(def_php TSRMLS_CC);
+    defs[i] = (upb_def *)desc->msgdef;
+    validate_msgdef((const upb_msgdef *)defs[i++]);
+  }
+
+  CHECK_UPB(upb_symtab_add(self->symtab, (upb_def **)defs, num, NULL, &status),
+            "Unable to add defs to DescriptorPool");
+
+  for (temp = self->pending_list->pListHead; temp != NULL;
+       temp = temp->pListNext) {
+    // zval *def_php = *(zval **)temp->pData;
+    // Descriptor* desc = php_to_descriptor(def_php TSRMLS_CC);
+    build_class_from_descriptor((zval *)temp->pDataPtr TSRMLS_CC);
+  }
+
+  FREE(defs);
+  zend_hash_destroy(self->pending_list);
+  zend_hash_init(self->pending_list, 1, NULL, ZVAL_PTR_DTOR, 0);
 }
 
-PHP_METHOD(InternalDescriptorPool, getGeneratedPool) {
-  init_generated_pool_once(TSRMLS_C);
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(internal_generated_pool_php, 1, 0);
-#else
-  ++GC_REFCOUNT(internal_generated_pool_php);
-  RETURN_OBJ(internal_generated_pool_php);
-#endif
+// -----------------------------------------------------------------------------
+// Descriptor
+// -----------------------------------------------------------------------------
+
+static zend_function_entry descriptor_methods[] = {
+  ZEND_FE_END
+};
+
+DEFINE_CLASS(Descriptor, descriptor, "Google\\Protobuf\\Descriptor");
+
+void descriptor_free_c(Descriptor *self TSRMLS_DC) {
+  upb_msg_field_iter iter;
+  upb_msg_field_begin(&iter, self->msgdef);
+  while (!upb_msg_field_done(&iter)) {
+    upb_fielddef *fielddef = upb_msg_iter_field(&iter);
+    upb_fielddef_unref(fielddef, &fielddef);
+    upb_msg_field_next(&iter);
+  }
+  upb_msgdef_unref(self->msgdef, &self->msgdef);
+  if (self->layout) {
+    free_layout(self->layout);
+  }
 }
 
-static void classname_no_prefix(const char *fullname, const char *package_name,
-                                char *class_name) {
-  size_t i = 0, j;
-  bool first_char = true, is_reserved = false;
-  size_t pkg_name_len = package_name == NULL ? 0 : strlen(package_name);
-  size_t message_name_start = package_name == NULL ? 0 : pkg_name_len + 1;
-  size_t message_len = (strlen(fullname) - message_name_start);
+static void descriptor_add_field(Descriptor *desc,
+                                 const upb_fielddef *fielddef) {
+  upb_msgdef *mut_def = check_msgdef_notfrozen(desc->msgdef);
+  upb_fielddef *mut_field_def = check_fielddef_notfrozen(fielddef);
+  CHECK_UPB(upb_msgdef_addfield(mut_def, mut_field_def, NULL, &status),
+            "Adding field to Descriptor failed");
+  // add_def_obj(fielddef, obj);
+}
 
-  // Submessage is concatenated with its containing messages by '_'.
-  for (j = message_name_start; j < message_name_start + message_len; j++) {
-    if (fullname[j] == '.') {
-      class_name[i++] = '_';
-    } else {
-      class_name[i++] = fullname[j];
+void descriptor_init_c_instance(Descriptor* desc TSRMLS_DC) {
+  zend_object_std_init(&desc->std, descriptor_type TSRMLS_CC);
+  desc->msgdef = upb_msgdef_new(&desc->msgdef);
+  desc->layout = NULL;
+  // MAKE_STD_ZVAL(intern->klass);
+  // ZVAL_NULL(intern->klass);
+  desc->pb_serialize_handlers = NULL;
+}
+
+void Descriptor_name_set(Descriptor *desc, const char *name) {
+  upb_msgdef *mut_def = check_msgdef_notfrozen(desc->msgdef);
+  CHECK_UPB(upb_msgdef_setfullname(mut_def, name, &status),
+            "Error setting Descriptor name");
+}
+
+// -----------------------------------------------------------------------------
+// FieldDescriptor
+// -----------------------------------------------------------------------------
+
+static void field_descriptor_name_set(const upb_fielddef* fielddef,
+                                      const char *name) {
+  upb_fielddef *mut_def = check_fielddef_notfrozen(fielddef);
+  CHECK_UPB(upb_fielddef_setname(mut_def, name, &status),
+            "Error setting FieldDescriptor name");
+}
+
+static void field_descriptor_label_set(const upb_fielddef* fielddef,
+                                       upb_label_t upb_label) {
+  upb_fielddef *mut_def = check_fielddef_notfrozen(fielddef);
+  upb_fielddef_setlabel(mut_def, upb_label);
+}
+
+upb_fieldtype_t string_to_descriptortype(const char *type) {
+#define CONVERT(upb, str)   \
+  if (!strcmp(type, str)) { \
+    return UPB_DESCRIPTOR_TYPE_##upb;  \
+  }
+
+  CONVERT(FLOAT, "float");
+  CONVERT(DOUBLE, "double");
+  CONVERT(BOOL, "bool");
+  CONVERT(STRING, "string");
+  CONVERT(BYTES, "bytes");
+  CONVERT(MESSAGE, "message");
+  CONVERT(GROUP, "group");
+  CONVERT(ENUM, "enum");
+  CONVERT(INT32, "int32");
+  CONVERT(INT64, "int64");
+  CONVERT(UINT32, "uint32");
+  CONVERT(UINT64, "uint64");
+  CONVERT(SINT32, "sint32");
+  CONVERT(SINT64, "sint64");
+  CONVERT(FIXED32, "fixed32");
+  CONVERT(FIXED64, "fixed64");
+  CONVERT(SFIXED32, "sfixed32");
+  CONVERT(SFIXED64, "sfixed64");
+
+#undef CONVERT
+
+  zend_error(E_ERROR, "Unknown field type.");
+  return 0;
+}
+
+static void field_descriptor_type_set(const upb_fielddef* fielddef,
+                                      const char *type) {
+  upb_fielddef *mut_def = check_fielddef_notfrozen(fielddef);
+  upb_fielddef_setdescriptortype(mut_def, string_to_descriptortype(type));
+}
+
+static void field_descriptor_number_set(const upb_fielddef* fielddef,
+                                        int number) {
+  upb_fielddef *mut_def = check_fielddef_notfrozen(fielddef);
+  CHECK_UPB(upb_fielddef_setnumber(mut_def, number, &status),
+            "Error setting field number");
+}
+
+// -----------------------------------------------------------------------------
+// MessageBuilderContext
+// -----------------------------------------------------------------------------
+
+static zend_function_entry message_builder_context_methods[] = {
+    PHP_ME(MessageBuilderContext, finalizeToPool, NULL, ZEND_ACC_PUBLIC)
+    PHP_ME(MessageBuilderContext, optional, NULL, ZEND_ACC_PUBLIC)
+    {NULL, NULL, NULL}
+};
+
+DEFINE_CLASS(MessageBuilderContext, message_builder_context,
+             "Google\\Protobuf\\Internal\\MessageBuilderContext");
+
+void message_builder_context_free_c(MessageBuilderContext *context TSRMLS_DC) {
+  zval_ptr_dtor(&context->descriptor);
+  zval_ptr_dtor(&context->pool);
+}
+
+void message_builder_context_init_c_instance(
+    MessageBuilderContext *context TSRMLS_DC) {
+  zend_object_std_init(&context->std, message_builder_context_type TSRMLS_CC);
+  PROTOBUF_CREATE_ZEND_WRAPPER(Descriptor, descriptor, context->descriptor,
+                               desc);
+}
+
+static void msgdef_add_field(Descriptor *desc, upb_label_t upb_label,
+                             const char *name, const char *type, int number,
+                             const char *type_class) {
+  upb_fielddef *fielddef = upb_fielddef_new(&fielddef);
+  upb_fielddef_setpacked(fielddef, false);
+
+  field_descriptor_label_set(fielddef, upb_label);
+  field_descriptor_name_set(fielddef, name);
+  field_descriptor_type_set(fielddef, type);
+  field_descriptor_number_set(fielddef, number);
+
+// //   if (type_class != Qnil) {
+// //     if (TYPE(type_class) != T_STRING) {
+// //       rb_raise(rb_eArgError, "Expected string for type class");
+// //     }
+// //     // Make it an absolute type name by prepending a dot.
+// //     type_class = rb_str_append(rb_str_new2("."), type_class);
+// //     rb_funcall(fielddef, rb_intern("submsg_name="), 1, type_class);
+// //   }
+  descriptor_add_field(desc, fielddef);
+}
+
+PHP_METHOD(MessageBuilderContext, optional) {
+  MessageBuilderContext *self = php_to_message_builder_context(getThis() TSRMLS_CC);
+  Descriptor *desc = php_to_descriptor(self->descriptor TSRMLS_CC);
+  // VALUE name, type, number, type_class;
+  const char *name, *type, *type_class;
+  int number, name_str_len, type_str_len, type_class_str_len;
+  if (ZEND_NUM_ARGS() == 3) {
+    if (zend_parse_parameters(3 TSRMLS_CC, "ssl", &name,
+                              &name_str_len, &type, &type_str_len, &number) == FAILURE) {
+      return;
     }
-  }
-}
-
-static const char *classname_prefix(const char *classname,
-                                    const char *prefix_given,
-                                    const char *package_name) {
-  size_t i;
-  bool is_reserved = false;
-
-  if (prefix_given != NULL && strcmp(prefix_given, "") != 0) {
-    return prefix_given;
-  }
-
-  char* lower = ALLOC_N(char, strlen(classname) + 1);
-  i = 0;
-  while(classname[i]) {
-    lower[i] = (char)tolower(classname[i]);
-    i++;
-  }
-  lower[i] = 0;
-
-  is_reserved = is_reserved_name(lower);
-  FREE(lower);
-
-  if (is_reserved) {
-    if (package_name != NULL && strcmp("google.protobuf", package_name) == 0) {
-      return "GPB";
-    } else {
-      return "PB";
+  } else {
+    if (zend_parse_parameters(4 TSRMLS_CC, "ssls", &name,
+                              &name_str_len, &type, &type_str_len, &number, &type_class,
+                              &type_class_str_len) == FAILURE) {
+      return;
     }
   }
 
-  return "";
+  msgdef_add_field(desc, UPB_LABEL_OPTIONAL, name, type, number, type_class);
+
+  zval_copy_ctor(getThis());
+  RETURN_ZVAL(getThis(), 1, 0);
 }
 
-static void convert_to_class_name_inplace(const char *package,
-                                          const char *namespace_given,
-                                          const char *prefix, char *classname) {
-  size_t prefix_len = prefix == NULL ? 0 : strlen(prefix);
-  size_t classname_len = strlen(classname);
-  int i = 0, j;
-  bool first_char = true;
+PHP_METHOD(MessageBuilderContext, finalizeToPool) {
+  MessageBuilderContext *self = php_to_message_builder_context(getThis() TSRMLS_CC);
+  DescriptorPool *pool = php_to_descriptor_pool(self->pool TSRMLS_CC);
+  Descriptor* desc = php_to_descriptor(self->descriptor TSRMLS_CC);
 
-  size_t package_len = package == NULL ? 0 : strlen(package);
-  size_t namespace_given_len =
-      namespace_given == NULL ? 0 : strlen(namespace_given);
-  bool use_namespace_given = namespace_given != NULL;
-  size_t namespace_len =
-      use_namespace_given ? namespace_given_len : package_len;
-
-  int offset = namespace_len != 0 ? 2 : 0;
-
-  for (j = 0; j < classname_len; j++) {
-    classname[namespace_len + prefix_len + classname_len + offset - 1 - j] =
-        classname[classname_len - j - 1];
-  }
-
-  if (namespace_len != 0) {
-    classname[i++] = '\\';
-    for (j = 0; j < namespace_len; j++) {
-      if (use_namespace_given) {
-        classname[i++] = namespace_given[j];
-        continue;
-      }
-      // php packages are divided by '\'.
-      if (package[j] == '.') {
-        classname[i++] = '\\';
-        first_char = true;
-      } else if (first_char) {
-        // PHP package uses camel case.
-        if (package[j] < 'A' || package[j] > 'Z') {
-          classname[i++] = package[j] + 'A' - 'a';
-        } else {
-          classname[i++] = package[j];
-        }
-        first_char = false;
-      } else {
-        classname[i++] = package[j];
-      }
-    }
-    classname[i++] = '\\';
-  }
-
-  memcpy(classname + i, prefix, prefix_len);
-}
-
-void internal_add_generated_file(const char *data, PHP_PROTO_SIZE data_len,
-                                 InternalDescriptorPool *pool TSRMLS_DC) {
-  upb_filedef **files;
-  size_t i;
-
-  CHECK_UPB(files = upb_loaddescriptor(data, data_len, &pool, &status),
-            "Parse binary descriptors to internal descriptors failed");
-
-  // This method is called only once in each file.
-  assert(files[0] != NULL);
-  assert(files[1] == NULL);
-
-  CHECK_UPB(upb_symtab_addfile(pool->symtab, files[0], &status),
-            "Unable to add file to DescriptorPool");
-
-  // For each enum/message, we need its PHP class, upb descriptor and its PHP
-  // wrapper. These information are needed later for encoding, decoding and type
-  // checking. However, sometimes we just have one of them. In order to find
-  // them quickly, here, we store the mapping for them.
-  for (i = 0; i < upb_filedef_defcount(files[0]); i++) {
-    const upb_def *def = upb_filedef_def(files[0], i);
-    switch (upb_def_type(def)) {
-#define CASE_TYPE(def_type, def_type_lower, desc_type, desc_type_lower)        \
-  case UPB_DEF_##def_type: {                                                   \
-    CREATE_HASHTABLE_VALUE(desc, desc_php, desc_type, desc_type_lower##_type); \
-    const upb_##def_type_lower *def_type_lower =                               \
-        upb_downcast_##def_type_lower(def);                                    \
-    desc->def_type_lower = def_type_lower;                                     \
-    add_def_obj(desc->def_type_lower, desc_php);                               \
-    /* Unlike other messages, MapEntry is shared by all map fields and doesn't \
-     * have generated PHP class.*/                                             \
-    if (upb_def_type(def) == UPB_DEF_MSG &&                                    \
-        upb_msgdef_mapentry(upb_downcast_msgdef(def))) {                       \
-      break;                                                                   \
-    }                                                                          \
-    /* Prepend '.' to package name to make it absolute. In the 5 additional    \
-     * bytes allocated, one for '.', one for trailing 0, and 3 for 'GPB' if    \
-     * given message is google.protobuf.Empty.*/                               \
-    const char *fullname = upb_##def_type_lower##_fullname(def_type_lower);    \
-    const char *php_namespace = upb_filedef_phpnamespace(files[0]);            \
-    const char *prefix_given = upb_filedef_phpprefix(files[0]);                \
-    size_t classname_len = strlen(fullname) + 5;                               \
-    if (prefix_given != NULL) {                                                \
-      classname_len += strlen(prefix_given);                                   \
-    }                                                                          \
-    if (php_namespace != NULL) {                                               \
-      classname_len += strlen(php_namespace);                                  \
-    }                                                                          \
-    char *classname = ecalloc(sizeof(char), classname_len);                    \
-    const char *package = upb_filedef_package(files[0]);                       \
-    classname_no_prefix(fullname, package, classname);                         \
-    const char *prefix = classname_prefix(classname, prefix_given, package);   \
-    convert_to_class_name_inplace(package, php_namespace, prefix, classname);  \
-    PHP_PROTO_CE_DECLARE pce;                                                  \
-    if (php_proto_zend_lookup_class(classname, strlen(classname), &pce) ==     \
-        FAILURE) {                                                             \
-      zend_error(E_ERROR, "Generated message class %s hasn't been defined",    \
-                 classname);                                                   \
-      return;                                                                  \
-    } else {                                                                   \
-      desc->klass = PHP_PROTO_CE_UNREF(pce);                                   \
-    }                                                                          \
-    add_ce_obj(desc->klass, desc_php);                                         \
-    add_proto_obj(upb_##def_type_lower##_fullname(desc->def_type_lower),       \
-                  desc_php);                                                   \
-    efree(classname);                                                          \
-    break;                                                                     \
-  }
-
-      CASE_TYPE(MSG, msgdef, Descriptor, descriptor)
-      CASE_TYPE(ENUM, enumdef, EnumDescriptor, enum_descriptor)
-#undef CASE_TYPE
-
-      default:
-        break;
-    }
-  }
-
-  for (i = 0; i < upb_filedef_defcount(files[0]); i++) {
-    const upb_def *def = upb_filedef_def(files[0], i);
-    if (upb_def_type(def) == UPB_DEF_MSG) {
-      const upb_msgdef *msgdef = upb_downcast_msgdef(def);
-      PHP_PROTO_HASHTABLE_VALUE desc_php = get_def_obj(msgdef);
-      build_class_from_descriptor(desc_php TSRMLS_CC);
-    }
-  }
-
-  upb_filedef_unref(files[0], &pool);
-  upb_gfree(files);
-}
-
-PHP_METHOD(InternalDescriptorPool, internalAddGeneratedFile) {
-  char *data = NULL;
-  PHP_PROTO_SIZE data_len;
-  upb_filedef **files;
-  size_t i;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len) ==
-      FAILURE) {
-    return;
-  }
-
-  InternalDescriptorPool *pool = UNBOX(InternalDescriptorPool, getThis());
-  internal_add_generated_file(data, data_len, pool TSRMLS_CC);
-}
-
-PHP_METHOD(DescriptorPool, getDescriptorByClassName) {
-  DescriptorPool *public_pool = UNBOX(DescriptorPool, getThis());
-  InternalDescriptorPool *pool = public_pool->intern;
-
-  char *classname = NULL;
-  PHP_PROTO_SIZE classname_len;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &classname,
-                            &classname_len) == FAILURE) {
-    return;
-  }
-
-  PHP_PROTO_CE_DECLARE pce;
-  if (php_proto_zend_lookup_class(classname, classname_len, &pce) ==
-      FAILURE) {
-    RETURN_NULL();
-  }
-
-  PHP_PROTO_HASHTABLE_VALUE desc = get_ce_obj(PHP_PROTO_CE_UNREF(pce));
-  if (desc == NULL) {
-    RETURN_NULL();
-  }
-
-  zend_class_entry* instance_ce = HASHTABLE_VALUE_CE(desc);
-
-  if (!instanceof_function(instance_ce, descriptor_type TSRMLS_CC)) {
-    RETURN_NULL();
-  }
-
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(desc, 1, 0);
-#else
-  ++GC_REFCOUNT(desc);
-  RETURN_OBJ(desc);
-#endif
-}
-
-PHP_METHOD(DescriptorPool, getEnumDescriptorByClassName) {
-  DescriptorPool *public_pool = UNBOX(DescriptorPool, getThis());
-  InternalDescriptorPool *pool = public_pool->intern;
-
-  char *classname = NULL;
-  PHP_PROTO_SIZE classname_len;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &classname,
-                            &classname_len) == FAILURE) {
-    return;
-  }
-
-  PHP_PROTO_CE_DECLARE pce;
-  if (php_proto_zend_lookup_class(classname, classname_len, &pce) ==
-      FAILURE) {
-    RETURN_NULL();
-  }
-
-  PHP_PROTO_HASHTABLE_VALUE desc = get_ce_obj(PHP_PROTO_CE_UNREF(pce));
-  if (desc == NULL) {
-    RETURN_NULL();
-  }
-
-  zend_class_entry* instance_ce = HASHTABLE_VALUE_CE(desc);
-
-  if (!instanceof_function(instance_ce, enum_descriptor_type TSRMLS_CC)) {
-    RETURN_NULL();
-  }
-
-#if PHP_MAJOR_VERSION < 7
-  RETURN_ZVAL(desc, 1, 0);
-#else
-  ++GC_REFCOUNT(desc);
-  RETURN_OBJ(desc);
-#endif
+  Z_ADDREF_P(self->descriptor);
+  zend_hash_next_index_insert(pool->pending_list, &self->descriptor,
+                              sizeof(zval *), NULL);
+  RETURN_ZVAL(self->pool, 1, 0);
 }
diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c
deleted file mode 100644
index a8c47f4..0000000
--- a/php/ext/google/protobuf/encode_decode.c
+++ /dev/null
@@ -1,1715 +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.
-
-#include "protobuf.h"
-#include "utf8.h"
-
-/* stringsink *****************************************************************/
-
-typedef struct {
-  upb_byteshandler handler;
-  upb_bytessink sink;
-  char *ptr;
-  size_t len, size;
-} stringsink;
-
-
-static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
-  stringsink *sink = _sink;
-  sink->len = 0;
-  return sink;
-}
-
-static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
-                                size_t len, const upb_bufhandle *handle) {
-  stringsink *sink = _sink;
-  size_t new_size = sink->size;
-
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  while (sink->len + len > new_size) {
-    new_size *= 2;
-  }
-
-  if (new_size != sink->size) {
-    sink->ptr = realloc(sink->ptr, new_size);
-    sink->size = new_size;
-  }
-
-  memcpy(sink->ptr + sink->len, ptr, len);
-  sink->len += len;
-
-  return len;
-}
-
-void stringsink_init(stringsink *sink) {
-  upb_byteshandler_init(&sink->handler);
-  upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
-  upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
-
-  upb_bytessink_reset(&sink->sink, &sink->handler, sink);
-
-  sink->size = 32;
-  sink->ptr = malloc(sink->size);
-  sink->len = 0;
-}
-
-void stringsink_uninit(stringsink *sink) { free(sink->ptr); }
-
-/* stackenv *****************************************************************/
-
-// Stack-allocated context during an encode/decode operation. Contains the upb
-// environment and its stack-based allocator, an initial buffer for allocations
-// to avoid malloc() when possible, and a template for PHP exception messages
-// if any error occurs.
-#define STACK_ENV_STACKBYTES 4096
-typedef struct {
-  upb_env env;
-  const char *php_error_template;
-  char allocbuf[STACK_ENV_STACKBYTES];
-} stackenv;
-
-
-static void stackenv_init(stackenv* se, const char* errmsg);
-static void stackenv_uninit(stackenv* se);
-
-// Callback invoked by upb if any error occurs during parsing or serialization.
-static bool env_error_func(void* ud, const upb_status* status) {
-    char err_msg[100] = "";
-    stackenv* se = ud;
-    // Free the env -- zend_error will longjmp up the stack past the
-    // encode/decode function so it would not otherwise have been freed.
-    stackenv_uninit(se);
-
-    // TODO(teboring): have a way to verify that this is actually a parse error,
-    // instead of just throwing "parse error" unconditionally.
-    sprintf(err_msg, se->php_error_template, upb_status_errmsg(status));
-    TSRMLS_FETCH();
-    zend_throw_exception(NULL, err_msg, 0 TSRMLS_CC);
-    // Never reached.
-    return false;
-}
-
-static void stackenv_init(stackenv* se, const char* errmsg) {
-  se->php_error_template = errmsg;
-  upb_env_init2(&se->env, se->allocbuf, sizeof(se->allocbuf), NULL);
-  upb_env_seterrorfunc(&se->env, env_error_func, se);
-}
-
-static void stackenv_uninit(stackenv* se) {
-  upb_env_uninit(&se->env);
-}
-
-// -----------------------------------------------------------------------------
-// Parsing.
-// -----------------------------------------------------------------------------
-
-#define DEREF(msg, ofs, type) *(type*)(((uint8_t *)msg) + ofs)
-
-// Creates a handlerdata that simply contains the offset for this field.
-static const void* newhandlerdata(upb_handlers* h, uint32_t ofs) {
-  size_t* hd_ofs = (size_t*)malloc(sizeof(size_t));
-  *hd_ofs = ofs;
-  upb_handlers_addcleanup(h, hd_ofs, free);
-  return hd_ofs;
-}
-
-typedef size_t (*encodeunknown_handlerfunc)(void* _sink, const void* hd,
-                                            const char* ptr, size_t len,
-                                            const upb_bufhandle* handle);
-
-typedef struct {
-  encodeunknown_handlerfunc handler;
-} unknownfields_handlerdata_t;
-
-// Creates a handlerdata for unknown fields.
-static const void *newunknownfieldshandlerdata(upb_handlers* h) {
-  unknownfields_handlerdata_t* hd =
-      (unknownfields_handlerdata_t*)malloc(sizeof(unknownfields_handlerdata_t));
-  hd->handler = stringsink_string;
-  upb_handlers_addcleanup(h, hd, free);
-  return hd;
-}
-
-typedef struct {
-  size_t ofs;
-  const upb_msgdef *md;
-} submsg_handlerdata_t;
-
-// Creates a handlerdata that contains offset and submessage type information.
-static const void *newsubmsghandlerdata(upb_handlers* h, uint32_t ofs,
-                                        const upb_fielddef* f) {
-  submsg_handlerdata_t* hd =
-      (submsg_handlerdata_t*)malloc(sizeof(submsg_handlerdata_t));
-  hd->ofs = ofs;
-  hd->md = upb_fielddef_msgsubdef(f);
-  upb_handlers_addcleanup(h, hd, free);
-  return hd;
-}
-
-typedef struct {
-  size_t ofs;              // union data slot
-  size_t case_ofs;         // oneof_case field
-  int property_ofs;        // properties table cache
-  uint32_t oneof_case_num; // oneof-case number to place in oneof_case field
-  const upb_msgdef *md;    // msgdef, for oneof submessage handler
-  const upb_msgdef *parent_md;  // msgdef, for parent submessage
-} oneof_handlerdata_t;
-
-static const void *newoneofhandlerdata(upb_handlers *h,
-                                       uint32_t ofs,
-                                       uint32_t case_ofs,
-                                       int property_ofs,
-                                       const upb_msgdef *m,
-                                       const upb_fielddef *f) {
-  oneof_handlerdata_t* hd =
-      (oneof_handlerdata_t*)malloc(sizeof(oneof_handlerdata_t));
-  hd->ofs = ofs;
-  hd->case_ofs = case_ofs;
-  hd->property_ofs = property_ofs;
-  hd->parent_md = m;
-  // We reuse the field tag number as a oneof union discriminant tag. Note that
-  // we don't expose these numbers to the user, so the only requirement is that
-  // we have some unique ID for each union case/possibility. The field tag
-  // numbers are already present and are easy to use so there's no reason to
-  // create a separate ID space. In addition, using the field tag number here
-  // lets us easily look up the field in the oneof accessor.
-  hd->oneof_case_num = upb_fielddef_number(f);
-  if (upb_fielddef_type(f) == UPB_TYPE_MESSAGE) {
-    hd->md = upb_fielddef_msgsubdef(f);
-  } else {
-    hd->md = NULL;
-  }
-  upb_handlers_addcleanup(h, hd, free);
-  return hd;
-}
-
-// A handler that starts a repeated field.  Gets the Repeated*Field instance for
-// this field (such an instance always exists even in an empty message).
-static void *startseq_handler(void* closure, const void* hd) {
-  MessageHeader* msg = closure;
-  const size_t *ofs = hd;
-  return CACHED_PTR_TO_ZVAL_PTR(DEREF(message_data(msg), *ofs, CACHED_VALUE*));
-}
-
-// Handlers that append primitive values to a repeated field.
-#define DEFINE_APPEND_HANDLER(type, ctype)                          \
-  static bool append##type##_handler(void* closure, const void* hd, \
-                                     ctype val) {                   \
-    zval* array = (zval*)closure;                                   \
-    TSRMLS_FETCH();                                                 \
-    RepeatedField* intern = UNBOX(RepeatedField, array);            \
-    repeated_field_push_native(intern, &val);                       \
-    return true;                                                    \
-  }
-
-DEFINE_APPEND_HANDLER(bool,   bool)
-DEFINE_APPEND_HANDLER(int32,  int32_t)
-DEFINE_APPEND_HANDLER(uint32, uint32_t)
-DEFINE_APPEND_HANDLER(float,  float)
-DEFINE_APPEND_HANDLER(int64,  int64_t)
-DEFINE_APPEND_HANDLER(uint64, uint64_t)
-DEFINE_APPEND_HANDLER(double, double)
-
-// Appends a string to a repeated field.
-static void* appendstr_handler(void *closure,
-                               const void *hd,
-                               size_t size_hint) {
-  zval* array = (zval*)closure;
-  TSRMLS_FETCH();
-  RepeatedField* intern = UNBOX(RepeatedField, array);
-
-#if PHP_MAJOR_VERSION < 7
-  zval* str;
-  MAKE_STD_ZVAL(str);
-  PHP_PROTO_ZVAL_STRING(str, "", 1);
-  repeated_field_push_native(intern, &str);
-  return (void*)str;
-#else
-  zend_string* str = zend_string_init("", 0, 1);
-  repeated_field_push_native(intern, &str);
-  return intern;
-#endif
-}
-
-// Appends a 'bytes' string to a repeated field.
-static void* appendbytes_handler(void *closure,
-                                 const void *hd,
-                                 size_t size_hint) {
-  zval* array = (zval*)closure;
-  TSRMLS_FETCH();
-  RepeatedField* intern = UNBOX(RepeatedField, array);
-
-#if PHP_MAJOR_VERSION < 7
-  zval* str;
-  MAKE_STD_ZVAL(str);
-  PHP_PROTO_ZVAL_STRING(str, "", 1);
-  repeated_field_push_native(intern, &str);
-  return (void*)str;
-#else
-  zend_string* str = zend_string_init("", 0, 1);
-  repeated_field_push_native(intern, &str);
-  return intern;
-#endif
-}
-
-// Handlers that append primitive values to a repeated field.
-#define DEFINE_SINGULAR_HANDLER(type, ctype)                \
-  static bool type##_handler(void* closure, const void* hd, \
-                                     ctype val) {           \
-    MessageHeader* msg = (MessageHeader*)closure;           \
-    const size_t *ofs = hd;                                 \
-    DEREF(message_data(msg), *ofs, ctype) = val;            \
-    return true;                                            \
-  }
-
-DEFINE_SINGULAR_HANDLER(bool,   bool)
-DEFINE_SINGULAR_HANDLER(int32,  int32_t)
-DEFINE_SINGULAR_HANDLER(uint32, uint32_t)
-DEFINE_SINGULAR_HANDLER(float,  float)
-DEFINE_SINGULAR_HANDLER(int64,  int64_t)
-DEFINE_SINGULAR_HANDLER(uint64, uint64_t)
-DEFINE_SINGULAR_HANDLER(double, double)
-
-#undef DEFINE_SINGULAR_HANDLER
-
-#if PHP_MAJOR_VERSION < 7
-static void *empty_php_string(zval** value_ptr) {
-  SEPARATE_ZVAL_IF_NOT_REF(value_ptr);
-  if (Z_TYPE_PP(value_ptr) == IS_STRING &&
-      !IS_INTERNED(Z_STRVAL_PP(value_ptr))) {
-    FREE(Z_STRVAL_PP(value_ptr));
-  }
-  ZVAL_EMPTY_STRING(*value_ptr);
-  return (void*)(*value_ptr);
-}
-#else
-static void *empty_php_string(zval* value_ptr) {
-  if (Z_TYPE_P(value_ptr) == IS_STRING) {
-    zend_string_release(Z_STR_P(value_ptr));
-  }
-  ZVAL_EMPTY_STRING(value_ptr);
-  return value_ptr;
-}
-#endif
-
-// Sets a non-repeated string field in a message.
-static void* str_handler(void *closure,
-                         const void *hd,
-                         size_t size_hint) {
-  MessageHeader* msg = closure;
-  const size_t *ofs = hd;
-  return empty_php_string(DEREF(message_data(msg), *ofs, CACHED_VALUE*));
-}
-
-// Sets a non-repeated 'bytes' field in a message.
-static void* bytes_handler(void *closure,
-                           const void *hd,
-                           size_t size_hint) {
-  MessageHeader* msg = closure;
-  const size_t *ofs = hd;
-  return empty_php_string(DEREF(message_data(msg), *ofs, CACHED_VALUE*));
-}
-
-static size_t stringdata_handler(void* closure, const void* hd,
-                                 const char* str, size_t len,
-                                 const upb_bufhandle* handle) {
-  zval* php_str = (zval*)closure;
-#if PHP_MAJOR_VERSION < 7
-  // Oneof string/bytes fields may have NULL initial value, which doesn't need
-  // to be freed.
-  if (Z_TYPE_P(php_str) == IS_STRING && !IS_INTERNED(Z_STRVAL_P(php_str))) {
-    FREE(Z_STRVAL_P(php_str));
-  }
-  ZVAL_STRINGL(php_str, str, len, 1);
-#else
-  if (Z_TYPE_P(php_str) == IS_STRING) {
-    zend_string_release(Z_STR_P(php_str));
-  }
-  ZVAL_NEW_STR(php_str, zend_string_init(str, len, 0));
-#endif
-  return len;
-}
-
-#if PHP_MAJOR_VERSION >= 7
-static size_t zendstringdata_handler(void* closure, const void* hd,
-                                     const char* str, size_t len,
-                                     const upb_bufhandle* handle) {
-  RepeatedField* intern = (RepeatedField*)closure;
-
-  unsigned char memory[NATIVE_SLOT_MAX_SIZE];
-  memset(memory, 0, NATIVE_SLOT_MAX_SIZE);
-  *(zend_string**)memory = zend_string_init(str, len, 0);
-
-  HashTable *ht = PHP_PROTO_HASH_OF(intern->array);
-  int index = zend_hash_num_elements(ht) - 1;
-  php_proto_zend_hash_index_update_mem(
-      ht, index, memory, sizeof(zend_string*), NULL);
-
-  return len;
-}
-#endif
-
-// Appends a submessage to a repeated field.
-static void *appendsubmsg_handler(void *closure, const void *hd) {
-  zval* array = (zval*)closure;
-  TSRMLS_FETCH();
-  RepeatedField* intern = UNBOX(RepeatedField, array);
-
-  const submsg_handlerdata_t *submsgdata = hd;
-  Descriptor* subdesc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj((void*)submsgdata->md));
-  zend_class_entry* subklass = subdesc->klass;
-  MessageHeader* submsg;
-
-#if PHP_MAJOR_VERSION < 7
-  zval* val = NULL;
-  MAKE_STD_ZVAL(val);
-  ZVAL_OBJ(val, subklass->create_object(subklass TSRMLS_CC));
-  repeated_field_push_native(intern, &val);
-  submsg = UNBOX(MessageHeader, val);
-#else
-  zend_object* obj = subklass->create_object(subklass TSRMLS_CC);
-  repeated_field_push_native(intern, &obj);
-  submsg = (MessageHeader*)((char*)obj - XtOffsetOf(MessageHeader, std));
-#endif
-  custom_data_init(subklass, submsg PHP_PROTO_TSRMLS_CC);
-
-  return submsg;
-}
-
-// Sets a non-repeated submessage field in a message.
-static void *submsg_handler(void *closure, const void *hd) {
-  MessageHeader* msg = closure;
-  const submsg_handlerdata_t* submsgdata = hd;
-  TSRMLS_FETCH();
-  Descriptor* subdesc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj((void*)submsgdata->md));
-  zend_class_entry* subklass = subdesc->klass;
-  zval* submsg_php;
-  MessageHeader* submsg;
-
-  if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(DEREF(message_data(msg), submsgdata->ofs,
-                                            CACHED_VALUE*))) == IS_NULL) {
-#if PHP_MAJOR_VERSION < 7
-    zval* val = NULL;
-    MAKE_STD_ZVAL(val);
-    ZVAL_OBJ(val, subklass->create_object(subklass TSRMLS_CC));
-    MessageHeader* intern = UNBOX(MessageHeader, val);
-    custom_data_init(subklass, intern PHP_PROTO_TSRMLS_CC);
-    php_proto_zval_ptr_dtor(*DEREF(message_data(msg), submsgdata->ofs, zval**));
-    *DEREF(message_data(msg), submsgdata->ofs, zval**) = val;
-#else
-    zend_object* obj = subklass->create_object(subklass TSRMLS_CC);
-    ZVAL_OBJ(DEREF(message_data(msg), submsgdata->ofs, zval*), obj);
-    MessageHeader* intern = UNBOX_HASHTABLE_VALUE(MessageHeader, obj);
-    custom_data_init(subklass, intern PHP_PROTO_TSRMLS_CC);
-#endif
-  }
-
-  submsg_php = CACHED_PTR_TO_ZVAL_PTR(
-      DEREF(message_data(msg), submsgdata->ofs, CACHED_VALUE*));
-
-  submsg = UNBOX(MessageHeader, submsg_php);
-  return submsg;
-}
-
-// Handler data for startmap/endmap handlers.
-typedef struct {
-  size_t ofs;
-  upb_fieldtype_t key_field_type;
-  upb_fieldtype_t value_field_type;
-
-  // We know that we can hold this reference because the handlerdata has the
-  // same lifetime as the upb_handlers struct, and the upb_handlers struct holds
-  // a reference to the upb_msgdef, which in turn has references to its subdefs.
-  const upb_def* value_field_subdef;
-} map_handlerdata_t;
-
-// Temporary frame for map parsing: at the beginning of a map entry message, a
-// submsg handler allocates a frame to hold (i) a reference to the Map object
-// into which this message will be inserted and (ii) storage slots to
-// temporarily hold the key and value for this map entry until the end of the
-// submessage. When the submessage ends, another handler is called to insert the
-// value into the map.
-typedef struct {
-  char key_storage[NATIVE_SLOT_MAX_SIZE];
-  char value_storage[NATIVE_SLOT_MAX_SIZE];
-} map_parse_frame_data_t;
-
-PHP_PROTO_WRAP_OBJECT_START(map_parse_frame_t)
-  map_parse_frame_data_t* data;  // Place needs to be consistent with
-                                 // MessageHeader.
-  zval* map;
-  // In php7, we cannot allocate zval dynamically. So we need to add zval here
-  // to help decoding.
-  zval key_zval;
-  zval value_zval;
-PHP_PROTO_WRAP_OBJECT_END
-typedef struct map_parse_frame_t map_parse_frame_t;
-
-static void map_slot_init(void* memory, upb_fieldtype_t type, zval* cache) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-#if PHP_MAJOR_VERSION < 7
-      // Store zval** in memory in order to be consistent with the layout of
-      // singular fields.
-      zval** holder = ALLOC(zval*);
-      *(zval***)memory = holder;
-      zval* tmp;
-      MAKE_STD_ZVAL(tmp);
-      PHP_PROTO_ZVAL_STRINGL(tmp, "", 0, 1);
-      *holder = tmp;
-#else
-      *(zval**)memory = cache;
-      PHP_PROTO_ZVAL_STRINGL(*(zval**)memory, "", 0, 1);
-#endif
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-#if PHP_MAJOR_VERSION < 7
-      zval** holder = ALLOC(zval*);
-      zval* tmp;
-      MAKE_STD_ZVAL(tmp);
-      ZVAL_NULL(tmp);
-      *holder = tmp;
-      *(zval***)memory = holder;
-#else
-      *(zval**)memory = cache;
-      ZVAL_NULL(*(zval**)memory);
-#endif
-      break;
-    }
-    default:
-      native_slot_init(type, memory, NULL);
-  }
-}
-
-static void map_slot_uninit(void* memory, upb_fieldtype_t type) {
-  switch (type) {
-    case UPB_TYPE_MESSAGE:
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-#if PHP_MAJOR_VERSION < 7
-      zval** holder = *(zval***)memory;
-      zval_ptr_dtor(holder);
-      FREE(holder);
-#else
-      php_proto_zval_ptr_dtor(*(zval**)memory);
-#endif
-      break;
-    }
-    default:
-      break;
-  }
-}
-
-static void map_slot_key(upb_fieldtype_t type, const void* from,
-                         const char** keyval,
-                         size_t* length) {
-  if (type == UPB_TYPE_STRING) {
-#if PHP_MAJOR_VERSION < 7
-    zval* key_php = **(zval***)from;
-#else
-    zval* key_php = *(zval**)from;
-#endif
-    *keyval = Z_STRVAL_P(key_php);
-    *length = Z_STRLEN_P(key_php);
-  } else {
-    *keyval = from;
-    *length = native_slot_size(type);
-  }
-}
-
-static void map_slot_value(upb_fieldtype_t type, const void* from,
-                           upb_value* v) {
-  size_t len;
-  void* to = upb_value_memory(v);
-#ifndef NDEBUG
-  v->ctype = UPB_CTYPE_UINT64;
-#endif
-
-  memset(to, 0, native_slot_size(type));
-
-  switch (type) {
-#if PHP_MAJOR_VERSION < 7
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE: {
-      *(zval**)to = **(zval***)from;
-      Z_ADDREF_PP((zval**)to);
-      break;
-    }
-#else
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      *(zend_string**)to = Z_STR_P(*(zval**)from);
-      zend_string_addref(*(zend_string**)to);
-      break;
-    case UPB_TYPE_MESSAGE:
-      *(zend_object**)to = Z_OBJ_P(*(zval**)from);
-      ++GC_REFCOUNT(*(zend_object**)to);
-      break;
-#endif
-    default:
-      len = native_slot_size(type);
-      memcpy(to, from, len);
-  }
-}
-
-// Handler to begin a map entry: allocates a temporary frame. This is the
-// 'startsubmsg' handler on the msgdef that contains the map field.
-static void *startmapentry_handler(void *closure, const void *hd) {
-  MessageHeader* msg = closure;
-  const map_handlerdata_t* mapdata = hd;
-  zval* map = CACHED_PTR_TO_ZVAL_PTR(
-      DEREF(message_data(msg), mapdata->ofs, CACHED_VALUE*));
-
-  map_parse_frame_t* frame = ALLOC(map_parse_frame_t);
-  frame->data = ALLOC(map_parse_frame_data_t);
-  frame->map = map;
-
-  map_slot_init(&frame->data->key_storage, mapdata->key_field_type,
-                &frame->key_zval);
-  map_slot_init(&frame->data->value_storage, mapdata->value_field_type,
-                &frame->value_zval);
-
-  return frame;
-}
-
-// Handler to end a map entry: inserts the value defined during the message into
-// the map. This is the 'endmsg' handler on the map entry msgdef.
-static bool endmap_handler(void* closure, const void* hd, upb_status* s) {
-  map_parse_frame_t* frame = closure;
-  const map_handlerdata_t* mapdata = hd;
-
-  TSRMLS_FETCH();
-  Map *map = UNBOX(Map, frame->map);
-
-  const char* keyval = NULL;
-  upb_value v;
-  size_t length;
-
-  map_slot_key(map->key_type, &frame->data->key_storage, &keyval, &length);
-  map_slot_value(map->value_type, &frame->data->value_storage, &v);
-
-  map_index_set(map, keyval, length, v);
-
-  map_slot_uninit(&frame->data->key_storage, mapdata->key_field_type);
-  map_slot_uninit(&frame->data->value_storage, mapdata->value_field_type);
-  FREE(frame->data);
-  FREE(frame);
-
-  return true;
-}
-
-// Allocates a new map_handlerdata_t given the map entry message definition. If
-// the offset of the field within the parent message is also given, that is
-// added to the handler data as well. Note that this is called *twice* per map
-// field: once in the parent message handler setup when setting the startsubmsg
-// handler and once in the map entry message handler setup when setting the
-// key/value and endmsg handlers. The reason is that there is no easy way to
-// pass the handlerdata down to the sub-message handler setup.
-static map_handlerdata_t* new_map_handlerdata(
-    size_t ofs,
-    const upb_msgdef* mapentry_def,
-    Descriptor* desc) {
-  const upb_fielddef* key_field;
-  const upb_fielddef* value_field;
-  // TODO(teboring): Use emalloc and efree.
-  map_handlerdata_t* hd =
-      (map_handlerdata_t*)malloc(sizeof(map_handlerdata_t));
-
-  hd->ofs = ofs;
-  key_field = upb_msgdef_itof(mapentry_def, MAP_KEY_FIELD);
-  assert(key_field != NULL);
-  hd->key_field_type = upb_fielddef_type(key_field);
-  value_field = upb_msgdef_itof(mapentry_def, MAP_VALUE_FIELD);
-  assert(value_field != NULL);
-  hd->value_field_type = upb_fielddef_type(value_field);
-  hd->value_field_subdef = upb_fielddef_subdef(value_field);
-
-  return hd;
-}
-
-// Handlers that set primitive values in oneofs.
-#define DEFINE_ONEOF_HANDLER(type, ctype)                          \
-  static bool oneof##type##_handler(void* closure, const void* hd, \
-                                    ctype val) {                   \
-    const oneof_handlerdata_t* oneofdata = hd;                     \
-    MessageHeader* msg = (MessageHeader*)closure;                  \
-    DEREF(message_data(closure), oneofdata->case_ofs, uint32_t) =  \
-        oneofdata->oneof_case_num;                                 \
-    DEREF(message_data(closure), oneofdata->ofs, ctype) = val;     \
-    return true;                                                   \
-  }
-
-DEFINE_ONEOF_HANDLER(bool,   bool)
-DEFINE_ONEOF_HANDLER(int32,  int32_t)
-DEFINE_ONEOF_HANDLER(uint32, uint32_t)
-DEFINE_ONEOF_HANDLER(float,  float)
-DEFINE_ONEOF_HANDLER(int64,  int64_t)
-DEFINE_ONEOF_HANDLER(uint64, uint64_t)
-DEFINE_ONEOF_HANDLER(double, double)
-
-#undef DEFINE_ONEOF_HANDLER
-
-static void oneof_cleanup(MessageHeader* msg,
-                          const oneof_handlerdata_t* oneofdata) {
-  uint32_t old_case_num =
-      DEREF(message_data(msg), oneofdata->case_ofs, uint32_t);
-  if (old_case_num == 0) {
-    return;
-  }
-
-  const upb_fielddef* old_field =
-      upb_msgdef_itof(oneofdata->parent_md, old_case_num);
-  bool need_clean = false;
-
-  switch (upb_fielddef_type(old_field)) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      need_clean = true;
-      break;
-    case UPB_TYPE_MESSAGE:
-      if (oneofdata->oneof_case_num != old_case_num) {
-        need_clean = true;
-      }
-      break;
-    default:
-      break;
-  }
-
-  if (need_clean) {
-#if PHP_MAJOR_VERSION < 7
-    SEPARATE_ZVAL_IF_NOT_REF(
-        DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*));
-    php_proto_zval_ptr_dtor(
-        *DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*));
-    MAKE_STD_ZVAL(*DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*));
-    ZVAL_NULL(*DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*));
-#endif
-  }
-}
-
-// Handlers for string/bytes in a oneof.
-static void *oneofbytes_handler(void *closure,
-                                const void *hd,
-                                size_t size_hint) {
-  MessageHeader* msg = closure;
-  const oneof_handlerdata_t *oneofdata = hd;
-
-  oneof_cleanup(msg, oneofdata);
-
-  DEREF(message_data(msg), oneofdata->case_ofs, uint32_t) =
-      oneofdata->oneof_case_num;
-  DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) =
-      OBJ_PROP(&msg->std, oneofdata->property_ofs);
-
-   return empty_php_string(DEREF(
-       message_data(msg), oneofdata->ofs, CACHED_VALUE*));
-}
-
-static void *oneofstr_handler(void *closure,
-                              const void *hd,
-                              size_t size_hint) {
-  // TODO(teboring): Add it back.
-  // rb_enc_associate(str, kRubyString8bitEncoding);
-  return oneofbytes_handler(closure, hd, size_hint);
-}
-
-// Handler for a submessage field in a oneof.
-static void* oneofsubmsg_handler(void* closure, const void* hd) {
-  MessageHeader* msg = closure;
-  const oneof_handlerdata_t *oneofdata = hd;
-  uint32_t oldcase = DEREF(message_data(msg), oneofdata->case_ofs, uint32_t);
-  TSRMLS_FETCH();
-  Descriptor* subdesc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj((void*)oneofdata->md));
-  zend_class_entry* subklass = subdesc->klass;
-  zval* submsg_php;
-  MessageHeader* submsg;
-
-  if (oldcase != oneofdata->oneof_case_num) {
-    oneof_cleanup(msg, oneofdata);
-
-    // Create new message.
-    DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) =
-        OBJ_PROP(&msg->std, oneofdata->property_ofs);
-    ZVAL_OBJ(CACHED_PTR_TO_ZVAL_PTR(
-        DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)),
-        subklass->create_object(subklass TSRMLS_CC));
-  }
-
-  DEREF(message_data(msg), oneofdata->case_ofs, uint32_t) =
-      oneofdata->oneof_case_num;
-
-  submsg_php = CACHED_PTR_TO_ZVAL_PTR(
-      DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*));
-  submsg = UNBOX(MessageHeader, submsg_php);
-  custom_data_init(subklass, submsg PHP_PROTO_TSRMLS_CC);
-  return submsg;
-}
-
-// Set up handlers for a repeated field.
-static void add_handlers_for_repeated_field(upb_handlers *h,
-                                            const upb_fielddef *f,
-                                            size_t offset) {
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-  upb_handlerattr_sethandlerdata(&attr, newhandlerdata(h, offset));
-  upb_handlers_setstartseq(h, f, startseq_handler, &attr);
-  upb_handlerattr_uninit(&attr);
-
-  switch (upb_fielddef_type(f)) {
-
-#define SET_HANDLER(utype, ltype)                                 \
-  case utype:                                                     \
-    upb_handlers_set##ltype(h, f, append##ltype##_handler, NULL); \
-    break;
-
-    SET_HANDLER(UPB_TYPE_BOOL,   bool);
-    SET_HANDLER(UPB_TYPE_INT32,  int32);
-    SET_HANDLER(UPB_TYPE_UINT32, uint32);
-    SET_HANDLER(UPB_TYPE_ENUM,   int32);
-    SET_HANDLER(UPB_TYPE_FLOAT,  float);
-    SET_HANDLER(UPB_TYPE_INT64,  int64);
-    SET_HANDLER(UPB_TYPE_UINT64, uint64);
-    SET_HANDLER(UPB_TYPE_DOUBLE, double);
-
-#undef SET_HANDLER
-
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      bool is_bytes = upb_fielddef_type(f) == UPB_TYPE_BYTES;
-      upb_handlers_setstartstr(h, f, is_bytes ?
-                               appendbytes_handler : appendstr_handler,
-                               NULL);
-#if PHP_MAJOR_VERSION < 7
-      upb_handlers_setstring(h, f, stringdata_handler, NULL);
-#else
-      upb_handlers_setstring(h, f, zendstringdata_handler, NULL);
-#endif
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-      upb_handlerattr_sethandlerdata(&attr, newsubmsghandlerdata(h, 0, f));
-      upb_handlers_setstartsubmsg(h, f, appendsubmsg_handler, &attr);
-      upb_handlerattr_uninit(&attr);
-      break;
-    }
-  }
-}
-
-// Set up handlers for a singular field.
-static void add_handlers_for_singular_field(upb_handlers *h,
-                                            const upb_fielddef *f,
-                                            size_t offset) {
-  switch (upb_fielddef_type(f)) {
-
-#define SET_HANDLER(utype, ltype)                                     \
-  case utype: {                                                       \
-    upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;               \
-    upb_handlerattr_sethandlerdata(&attr, newhandlerdata(h, offset)); \
-    upb_handlers_set##ltype(h, f, ltype##_handler, &attr);            \
-    break;                                                            \
-  }
-
-    SET_HANDLER(UPB_TYPE_BOOL,   bool);
-    SET_HANDLER(UPB_TYPE_INT32,  int32);
-    SET_HANDLER(UPB_TYPE_UINT32, uint32);
-    SET_HANDLER(UPB_TYPE_ENUM,   int32);
-    SET_HANDLER(UPB_TYPE_FLOAT,  float);
-    SET_HANDLER(UPB_TYPE_INT64,  int64);
-    SET_HANDLER(UPB_TYPE_UINT64, uint64);
-    SET_HANDLER(UPB_TYPE_DOUBLE, double);
-
-#undef SET_HANDLER
-
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      bool is_bytes = upb_fielddef_type(f) == UPB_TYPE_BYTES;
-      upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-      upb_handlerattr_sethandlerdata(&attr, newhandlerdata(h, offset));
-      upb_handlers_setstartstr(h, f,
-                               is_bytes ? bytes_handler : str_handler,
-                               &attr);
-      upb_handlers_setstring(h, f, stringdata_handler, &attr);
-      upb_handlerattr_uninit(&attr);
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-      upb_handlerattr_sethandlerdata(&attr, newsubmsghandlerdata(h, offset, f));
-      upb_handlers_setstartsubmsg(h, f, submsg_handler, &attr);
-      upb_handlerattr_uninit(&attr);
-      break;
-    }
-  }
-}
-
-// Adds handlers to a map field.
-static void add_handlers_for_mapfield(upb_handlers* h,
-                                      const upb_fielddef* fielddef,
-                                      size_t offset,
-                                      Descriptor* desc) {
-  const upb_msgdef* map_msgdef = upb_fielddef_msgsubdef(fielddef);
-  map_handlerdata_t* hd = new_map_handlerdata(offset, map_msgdef, desc);
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-
-  upb_handlers_addcleanup(h, hd, free);
-  upb_handlerattr_sethandlerdata(&attr, hd);
-  upb_handlers_setstartsubmsg(h, fielddef, startmapentry_handler, &attr);
-  upb_handlerattr_uninit(&attr);
-}
-
-// Adds handlers to a map-entry msgdef.
-static void add_handlers_for_mapentry(const upb_msgdef* msgdef, upb_handlers* h,
-                                      Descriptor* desc) {
-  const upb_fielddef* key_field = map_entry_key(msgdef);
-  const upb_fielddef* value_field = map_entry_value(msgdef);
-  map_handlerdata_t* hd = new_map_handlerdata(0, msgdef, desc);
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-
-  upb_handlers_addcleanup(h, hd, free);
-  upb_handlerattr_sethandlerdata(&attr, hd);
-  upb_handlers_setendmsg(h, endmap_handler, &attr);
-
-  add_handlers_for_singular_field(h, key_field,
-                                  offsetof(map_parse_frame_data_t,
-                                           key_storage));
-  add_handlers_for_singular_field(h, value_field,
-                                  offsetof(map_parse_frame_data_t, 
-                                           value_storage));
-}
-
-// Set up handlers for a oneof field.
-static void add_handlers_for_oneof_field(upb_handlers *h,
-                                         const upb_msgdef *m,
-                                         const upb_fielddef *f,
-                                         size_t offset,
-                                         size_t oneof_case_offset,
-                                         int property_cache_offset) {
-
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-  upb_handlerattr_sethandlerdata(
-      &attr, newoneofhandlerdata(h, offset, oneof_case_offset,
-                                 property_cache_offset, m, f));
-
-  switch (upb_fielddef_type(f)) {
-
-#define SET_HANDLER(utype, ltype)                                 \
-  case utype:                                                     \
-    upb_handlers_set##ltype(h, f, oneof##ltype##_handler, &attr); \
-    break;
-
-    SET_HANDLER(UPB_TYPE_BOOL,   bool);
-    SET_HANDLER(UPB_TYPE_INT32,  int32);
-    SET_HANDLER(UPB_TYPE_UINT32, uint32);
-    SET_HANDLER(UPB_TYPE_ENUM,   int32);
-    SET_HANDLER(UPB_TYPE_FLOAT,  float);
-    SET_HANDLER(UPB_TYPE_INT64,  int64);
-    SET_HANDLER(UPB_TYPE_UINT64, uint64);
-    SET_HANDLER(UPB_TYPE_DOUBLE, double);
-
-#undef SET_HANDLER
-
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      bool is_bytes = upb_fielddef_type(f) == UPB_TYPE_BYTES;
-      upb_handlers_setstartstr(h, f, is_bytes ?
-                               oneofbytes_handler : oneofstr_handler,
-                               &attr);
-      upb_handlers_setstring(h, f, stringdata_handler, NULL);
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      upb_handlers_setstartsubmsg(h, f, oneofsubmsg_handler, &attr);
-      break;
-    }
-  }
-
-  upb_handlerattr_uninit(&attr);
-}
-
-static bool add_unknown_handler(void* closure, const void* hd, const char* buf,
-                         size_t size) {
-  encodeunknown_handlerfunc handler =
-      ((unknownfields_handlerdata_t*)hd)->handler;
-
-  MessageHeader* msg = (MessageHeader*)closure;
-  stringsink* unknown = DEREF(message_data(msg), 0, stringsink*);
-  if (unknown == NULL) {
-    DEREF(message_data(msg), 0, stringsink*) = ALLOC(stringsink);
-    unknown = DEREF(message_data(msg), 0, stringsink*);
-    stringsink_init(unknown);
-  }
-
-  handler(unknown, NULL, buf, size, NULL);
-
-  return true;
-}
-
-static void add_handlers_for_message(const void* closure,
-                                     upb_handlers* h) {
-  const upb_msgdef* msgdef = upb_handlers_msgdef(h);
-  TSRMLS_FETCH();
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj((void*)msgdef));
-  upb_msg_field_iter i;
-
-  // If this is a mapentry message type, set up a special set of handlers and
-  // bail out of the normal (user-defined) message type handling.
-  if (upb_msgdef_mapentry(msgdef)) {
-    add_handlers_for_mapentry(msgdef, h, desc);
-    return;
-  }
-
-  // Ensure layout exists. We may be invoked to create handlers for a given
-  // message if we are included as a submsg of another message type before our
-  // class is actually built, so to work around this, we just create the layout
-  // (and handlers, in the class-building function) on-demand.
-  if (desc->layout == NULL) {
-    desc->layout = create_layout(desc->msgdef);
-  }
-
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-  upb_handlerattr_sethandlerdata(&attr, newunknownfieldshandlerdata(h));
-  upb_handlers_setunknown(h, add_unknown_handler, &attr);
-
-  for (upb_msg_field_begin(&i, desc->msgdef);
-       !upb_msg_field_done(&i);
-       upb_msg_field_next(&i)) {
-    const upb_fielddef *f = upb_msg_iter_field(&i);
-    size_t offset = desc->layout->fields[upb_fielddef_index(f)].offset;
-
-    if (upb_fielddef_containingoneof(f)) {
-      size_t oneof_case_offset =
-          desc->layout->fields[upb_fielddef_index(f)].case_offset;
-      int property_cache_index =
-          desc->layout->fields[upb_fielddef_index(f)].cache_index;
-      add_handlers_for_oneof_field(h, desc->msgdef, f, offset,
-                                   oneof_case_offset, property_cache_index);
-    } else if (is_map_field(f)) {
-      add_handlers_for_mapfield(h, f, offset, desc);
-    } else if (upb_fielddef_isseq(f)) {
-      add_handlers_for_repeated_field(h, f, offset);
-    } else {
-      add_handlers_for_singular_field(h, f, offset);
-    }
-  }
-}
-
-// Creates upb handlers for populating a message.
-static const upb_handlers *new_fill_handlers(Descriptor* desc,
-                                             const void* owner) {
-  // TODO(cfallin, haberman): once upb gets a caching/memoization layer for
-  // handlers, reuse subdef handlers so that e.g. if we already parse
-  // B-with-field-of-type-C, we don't have to rebuild the whole hierarchy to
-  // parse A-with-field-of-type-B-with-field-of-type-C.
-  return upb_handlers_newfrozen(desc->msgdef, owner,
-                                add_handlers_for_message, NULL);
-}
-
-// Constructs the handlers for filling a message's data into an in-memory
-// object.
-const upb_handlers* get_fill_handlers(Descriptor* desc) {
-  if (!desc->fill_handlers) {
-    desc->fill_handlers =
-        new_fill_handlers(desc, &desc->fill_handlers);
-  }
-  return desc->fill_handlers;
-}
-
-const upb_pbdecodermethod *new_fillmsg_decodermethod(Descriptor* desc,
-                                                     const void* owner) {
-  const upb_handlers* handlers = get_fill_handlers(desc);
-  upb_pbdecodermethodopts opts;
-  upb_pbdecodermethodopts_init(&opts, handlers);
-
-  return upb_pbdecodermethod_new(&opts, owner);
-}
-
-static const upb_pbdecodermethod *msgdef_decodermethod(Descriptor* desc) {
-  if (desc->fill_method == NULL) {
-    desc->fill_method = new_fillmsg_decodermethod(
-        desc, &desc->fill_method);
-  }
-  return desc->fill_method;
-}
-
-static const upb_json_parsermethod *msgdef_jsonparsermethod(Descriptor* desc) {
-  if (desc->json_fill_method == NULL) {
-    desc->json_fill_method =
-        upb_json_parsermethod_new(desc->msgdef, &desc->json_fill_method);
-  }
-  return desc->json_fill_method;
-}
-
-// -----------------------------------------------------------------------------
-// Serializing.
-// -----------------------------------------------------------------------------
-
-static void putmsg(zval* msg, const Descriptor* desc, upb_sink* sink,
-                   int depth TSRMLS_DC);
-static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
-                      upb_sink* sink, int depth TSRMLS_DC);
-
-static void putstr(zval* str, const upb_fielddef* f, upb_sink* sink);
-
-static void putrawstr(const char* str, int len, const upb_fielddef* f,
-                      upb_sink* sink);
-
-static void putsubmsg(zval* submsg, const upb_fielddef* f, upb_sink* sink,
-                      int depth TSRMLS_DC);
-static void putrawsubmsg(MessageHeader* submsg, const upb_fielddef* f,
-                         upb_sink* sink, int depth TSRMLS_DC);
-
-static void putarray(zval* array, const upb_fielddef* f, upb_sink* sink,
-                     int depth TSRMLS_DC);
-static void putmap(zval* map, const upb_fielddef* f, upb_sink* sink,
-                   int depth TSRMLS_DC);
-
-static upb_selector_t getsel(const upb_fielddef* f, upb_handlertype_t type) {
-  upb_selector_t ret;
-  bool ok = upb_handlers_getselector(f, type, &ret);
-  UPB_ASSERT(ok);
-  return ret;
-}
-
-static void put_optional_value(const void* memory, int len, const upb_fielddef* f,
-                               int depth, upb_sink* sink TSRMLS_DC) {
-  assert(upb_fielddef_label(f) == UPB_LABEL_OPTIONAL);
-
-  switch (upb_fielddef_type(f)) {
-#define T(upbtypeconst, upbtype, ctype, default_value)                         \
-  case upbtypeconst: {                                                         \
-    ctype value = DEREF(memory, 0, ctype);                                     \
-    if (value != default_value) {                                              \
-      upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f)); \
-      upb_sink_put##upbtype(sink, sel, value);                                 \
-    }                                                                          \
-  } break;
-
-    T(UPB_TYPE_FLOAT, float, float, 0.0)
-    T(UPB_TYPE_DOUBLE, double, double, 0.0)
-    T(UPB_TYPE_BOOL, bool, uint8_t, 0)
-    T(UPB_TYPE_ENUM, int32, int32_t, 0)
-    T(UPB_TYPE_INT32, int32, int32_t, 0)
-    T(UPB_TYPE_UINT32, uint32, uint32_t, 0)
-    T(UPB_TYPE_INT64, int64, int64_t, 0)
-    T(UPB_TYPE_UINT64, uint64, uint64_t, 0)
-
-#undef T
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      putrawstr(memory, len, f, sink);
-      break;
-    case UPB_TYPE_MESSAGE: {
-#if PHP_MAJOR_VERSION < 7
-      MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory);
-#else
-      MessageHeader *submsg =
-          (MessageHeader*)((char*)(*(zend_object**)memory) -
-              XtOffsetOf(MessageHeader, std));
-#endif
-      putrawsubmsg(submsg, f, sink, depth TSRMLS_CC);
-      break;
-    }
-    default:
-      assert(false);
-  }
-}
-
-// Only string/bytes fields are stored as zval.
-static const char* raw_value(void* memory, const upb_fielddef* f) {
-  switch (upb_fielddef_type(f)) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-#if PHP_MAJOR_VERSION < 7
-      return Z_STRVAL_PP((zval**)memory);
-#else
-      return ZSTR_VAL(*(zend_string**)memory);
-#endif
-      break;
-    default:
-      return memory;
-  }
-}
-
-static int raw_value_len(void* memory, int len, const upb_fielddef* f) {
-  switch (upb_fielddef_type(f)) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-#if PHP_MAJOR_VERSION < 7
-      return Z_STRLEN_PP((zval**)memory);
-#else
-      return ZSTR_LEN(*(zend_string**)memory);
-#endif
-    default:
-      return len;
-  }
-}
-
-static void putmap(zval* map, const upb_fielddef* f, upb_sink* sink,
-                   int depth TSRMLS_DC) {
-  upb_sink subsink;
-  const upb_fielddef* key_field;
-  const upb_fielddef* value_field;
-  MapIter it;
-  int len, size;
-
-  assert(map != NULL);
-  Map* intern = UNBOX(Map, map);
-  size = upb_strtable_count(&intern->table);
-  if (size == 0) return;
-
-  upb_sink_startseq(sink, getsel(f, UPB_HANDLER_STARTSEQ), &subsink);
-
-  assert(upb_fielddef_type(f) == UPB_TYPE_MESSAGE);
-  key_field = map_field_key(f);
-  value_field = map_field_value(f);
-
-  for (map_begin(map, &it TSRMLS_CC); !map_done(&it); map_next(&it)) {
-    upb_status status;
-
-    upb_sink entry_sink;
-    upb_sink_startsubmsg(&subsink, getsel(f, UPB_HANDLER_STARTSUBMSG),
-                         &entry_sink);
-    upb_sink_startmsg(&entry_sink);
-
-    // Serialize key.
-    const char *key = map_iter_key(&it, &len);
-    put_optional_value(key, len, key_field, depth + 1, &entry_sink TSRMLS_CC);
-
-    // Serialize value.
-    upb_value value = map_iter_value(&it, &len);
-    put_optional_value(raw_value(upb_value_memory(&value), value_field),
-                       raw_value_len(upb_value_memory(&value), len, value_field),
-                       value_field, depth + 1, &entry_sink TSRMLS_CC);
-
-    upb_sink_endmsg(&entry_sink, &status);
-    upb_sink_endsubmsg(&subsink, getsel(f, UPB_HANDLER_ENDSUBMSG));
-  }
-
-  upb_sink_endseq(sink, getsel(f, UPB_HANDLER_ENDSEQ));
-}
-
-static void putmsg(zval* msg_php, const Descriptor* desc, upb_sink* sink,
-                   int depth TSRMLS_DC) {
-  MessageHeader* msg = UNBOX(MessageHeader, msg_php);
-  putrawmsg(msg, desc, sink, depth TSRMLS_CC);
-}
-
-static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
-                      upb_sink* sink, int depth TSRMLS_DC) {
-  upb_msg_field_iter i;
-  upb_status status;
-
-  upb_sink_startmsg(sink);
-
-  // Protect against cycles (possible because users may freely reassign message
-  // and repeated fields) by imposing a maximum recursion depth.
-  if (depth > ENCODE_MAX_NESTING) {
-    zend_error(E_ERROR,
-             "Maximum recursion depth exceeded during encoding.");
-  }
-
-  for (upb_msg_field_begin(&i, desc->msgdef); !upb_msg_field_done(&i);
-       upb_msg_field_next(&i)) {
-    upb_fielddef* f = upb_msg_iter_field(&i);
-    uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset;
-    bool containing_oneof = false;
-
-    if (upb_fielddef_containingoneof(f)) {
-      uint32_t oneof_case_offset =
-          desc->layout->fields[upb_fielddef_index(f)].case_offset;
-      // For a oneof, check that this field is actually present -- skip all the
-      // below if not.
-      if (DEREF(message_data(msg), oneof_case_offset, uint32_t) !=
-          upb_fielddef_number(f)) {
-        continue;
-      }
-      // Otherwise, fall through to the appropriate singular-field handler
-      // below.
-      containing_oneof = true;
-    }
-
-    if (is_map_field(f)) {
-      zval* map = CACHED_PTR_TO_ZVAL_PTR(
-          DEREF(message_data(msg), offset, CACHED_VALUE*));
-      if (map != NULL) {
-        putmap(map, f, sink, depth TSRMLS_CC);
-      }
-    } else if (upb_fielddef_isseq(f)) {
-      zval* array = CACHED_PTR_TO_ZVAL_PTR(
-          DEREF(message_data(msg), offset, CACHED_VALUE*));
-      if (array != NULL) {
-        putarray(array, f, sink, depth TSRMLS_CC);
-      }
-    } else if (upb_fielddef_isstring(f)) {
-      zval* str = CACHED_PTR_TO_ZVAL_PTR(
-          DEREF(message_data(msg), offset, CACHED_VALUE*));
-      if (containing_oneof || Z_STRLEN_P(str) > 0) {
-        putstr(str, f, sink);
-      }
-    } else if (upb_fielddef_issubmsg(f)) {
-      putsubmsg(CACHED_PTR_TO_ZVAL_PTR(
-                    DEREF(message_data(msg), offset, CACHED_VALUE*)),
-                f, sink, depth TSRMLS_CC);
-    } else {
-      upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
-
-#define T(upbtypeconst, upbtype, ctype, default_value)     \
-  case upbtypeconst: {                                     \
-    ctype value = DEREF(message_data(msg), offset, ctype); \
-    if (containing_oneof || value != default_value) {      \
-      upb_sink_put##upbtype(sink, sel, value);             \
-    }                                                      \
-  } break;
-
-      switch (upb_fielddef_type(f)) {
-        T(UPB_TYPE_FLOAT, float, float, 0.0)
-        T(UPB_TYPE_DOUBLE, double, double, 0.0)
-        T(UPB_TYPE_BOOL, bool, uint8_t, 0)
-        case UPB_TYPE_ENUM:
-        T(UPB_TYPE_INT32, int32, int32_t, 0)
-        T(UPB_TYPE_UINT32, uint32, uint32_t, 0)
-        T(UPB_TYPE_INT64, int64, int64_t, 0)
-        T(UPB_TYPE_UINT64, uint64, uint64_t, 0)
-
-        case UPB_TYPE_STRING:
-        case UPB_TYPE_BYTES:
-        case UPB_TYPE_MESSAGE:
-          zend_error(E_ERROR, "Internal error.");
-      }
-
-#undef T
-    }
-  }
-
-  stringsink* unknown = DEREF(message_data(msg), 0, stringsink*);
-  if (unknown != NULL) {
-    upb_sink_putunknown(sink, unknown->ptr, unknown->len);
-  }
-
-  upb_sink_endmsg(sink, &status);
-}
-
-static void putstr(zval* str, const upb_fielddef *f, upb_sink *sink) {
-  upb_sink subsink;
-
-  if (ZVAL_IS_NULL(str)) return;
-
-  assert(Z_TYPE_P(str) == IS_STRING);
-
-  upb_sink_startstr(sink, getsel(f, UPB_HANDLER_STARTSTR), Z_STRLEN_P(str),
-                    &subsink);
-
-  // For oneof string field, we may get here with string length is zero.
-  if (Z_STRLEN_P(str) > 0) {
-    // Ensure that the string has the correct encoding. We also check at
-    // field-set time, but the user may have mutated the string object since
-    // then.
-    if (upb_fielddef_type(f) == UPB_TYPE_STRING &&
-        !is_structurally_valid_utf8(Z_STRVAL_P(str), Z_STRLEN_P(str))) {
-      zend_error(E_USER_ERROR, "Given string is not UTF8 encoded.");
-      return;
-    }
-    upb_sink_putstring(&subsink, getsel(f, UPB_HANDLER_STRING), Z_STRVAL_P(str),
-                       Z_STRLEN_P(str), NULL);
-  }
-
-  upb_sink_endstr(sink, getsel(f, UPB_HANDLER_ENDSTR));
-}
-
-static void putrawstr(const char* str, int len, const upb_fielddef* f,
-                      upb_sink* sink) {
-  upb_sink subsink;
-
-  if (len == 0) return;
-
-  // Ensure that the string has the correct encoding. We also check at field-set
-  // time, but the user may have mutated the string object since then.
-  if (upb_fielddef_type(f) == UPB_TYPE_STRING &&
-      !is_structurally_valid_utf8(str, len)) {
-    zend_error(E_USER_ERROR, "Given string is not UTF8 encoded.");
-    return;
-  }
-
-  upb_sink_startstr(sink, getsel(f, UPB_HANDLER_STARTSTR), len, &subsink);
-  upb_sink_putstring(&subsink, getsel(f, UPB_HANDLER_STRING), str, len, NULL);
-  upb_sink_endstr(sink, getsel(f, UPB_HANDLER_ENDSTR));
-}
-
-static void putsubmsg(zval* submsg_php, const upb_fielddef* f, upb_sink* sink,
-                      int depth TSRMLS_DC) {
-  if (Z_TYPE_P(submsg_php) == IS_NULL) return;
-
-  MessageHeader *submsg = UNBOX(MessageHeader, submsg_php);
-  putrawsubmsg(submsg, f, sink, depth TSRMLS_CC);
-}
-
-static void putrawsubmsg(MessageHeader* submsg, const upb_fielddef* f,
-                         upb_sink* sink, int depth TSRMLS_DC) {
-  upb_sink subsink;
-
-  Descriptor* subdesc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(upb_fielddef_msgsubdef(f)));
-
-  upb_sink_startsubmsg(sink, getsel(f, UPB_HANDLER_STARTSUBMSG), &subsink);
-  putrawmsg(submsg, subdesc, &subsink, depth + 1 TSRMLS_CC);
-  upb_sink_endsubmsg(sink, getsel(f, UPB_HANDLER_ENDSUBMSG));
-}
-
-static void putarray(zval* array, const upb_fielddef* f, upb_sink* sink,
-                     int depth TSRMLS_DC) {
-  upb_sink subsink;
-  upb_fieldtype_t type = upb_fielddef_type(f);
-  upb_selector_t sel = 0;
-  int size, i;
-
-  assert(array != NULL);
-  RepeatedField* intern = UNBOX(RepeatedField, array);
-  HashTable *ht = PHP_PROTO_HASH_OF(intern->array);
-  size = zend_hash_num_elements(ht);
-  if (size == 0) return;
-
-  upb_sink_startseq(sink, getsel(f, UPB_HANDLER_STARTSEQ), &subsink);
-
-  if (upb_fielddef_isprimitive(f)) {
-    sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
-  }
-
-  for (i = 0; i < size; i++) {
-    void* memory = repeated_field_index_native(intern, i TSRMLS_CC);
-    switch (type) {
-#define T(upbtypeconst, upbtype, ctype)                      \
-  case upbtypeconst:                                         \
-    upb_sink_put##upbtype(&subsink, sel, *((ctype*)memory)); \
-    break;
-
-      T(UPB_TYPE_FLOAT, float, float)
-      T(UPB_TYPE_DOUBLE, double, double)
-      T(UPB_TYPE_BOOL, bool, int8_t)
-      case UPB_TYPE_ENUM:
-        T(UPB_TYPE_INT32, int32, int32_t)
-        T(UPB_TYPE_UINT32, uint32, uint32_t)
-        T(UPB_TYPE_INT64, int64, int64_t)
-        T(UPB_TYPE_UINT64, uint64, uint64_t)
-
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES: {
-#if PHP_MAJOR_VERSION < 7
-        const char* rawstr = Z_STRVAL_P(*(zval**)memory);
-        int len = Z_STRLEN_P(*(zval**)memory);
-#else
-        const char* rawstr = ZSTR_VAL(*(zend_string**)memory);
-        int len = ZSTR_LEN(*(zend_string**)memory);
-#endif
-        putrawstr(rawstr, len, f, &subsink);
-        break;
-      }
-      case UPB_TYPE_MESSAGE: {
-#if PHP_MAJOR_VERSION < 7
-        MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory);
-#else
-        MessageHeader *submsg =
-            (MessageHeader*)((char*)(Z_OBJ_P((zval*)memory)) -
-                XtOffsetOf(MessageHeader, std));
-#endif
-        putrawsubmsg(submsg, f, &subsink, depth TSRMLS_CC);
-        break;
-      }
-
-#undef T
-    }
-  }
-  upb_sink_endseq(sink, getsel(f, UPB_HANDLER_ENDSEQ));
-}
-
-static const upb_handlers* msgdef_pb_serialize_handlers(Descriptor* desc) {
-  if (desc->pb_serialize_handlers == NULL) {
-    desc->pb_serialize_handlers =
-        upb_pb_encoder_newhandlers(desc->msgdef, &desc->pb_serialize_handlers);
-  }
-  return desc->pb_serialize_handlers;
-}
-
-static const upb_handlers* msgdef_json_serialize_handlers(
-    Descriptor* desc, bool preserve_proto_fieldnames) {
-  if (preserve_proto_fieldnames) {
-    if (desc->json_serialize_handlers == NULL) {
-      desc->json_serialize_handlers =
-          upb_json_printer_newhandlers(
-              desc->msgdef, true, &desc->json_serialize_handlers);
-    }
-    return desc->json_serialize_handlers;
-  } else {
-    if (desc->json_serialize_handlers_preserve == NULL) {
-      desc->json_serialize_handlers_preserve =
-          upb_json_printer_newhandlers(
-              desc->msgdef, false, &desc->json_serialize_handlers_preserve);
-    }
-    return desc->json_serialize_handlers_preserve;
-  }
-}
-
-// -----------------------------------------------------------------------------
-// PHP encode/decode methods
-// -----------------------------------------------------------------------------
-
-void serialize_to_string(zval* val, zval* return_value TSRMLS_DC) {
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(val)));
-
-  stringsink sink;
-  stringsink_init(&sink);
-
-  {
-    const upb_handlers* serialize_handlers = msgdef_pb_serialize_handlers(desc);
-
-    stackenv se;
-    upb_pb_encoder* encoder;
-
-    stackenv_init(&se, "Error occurred during encoding: %s");
-    encoder = upb_pb_encoder_create(&se.env, serialize_handlers, &sink.sink);
-
-    putmsg(val, desc, upb_pb_encoder_input(encoder), 0 TSRMLS_CC);
-
-    PHP_PROTO_RETVAL_STRINGL(sink.ptr, sink.len, 1);
-
-    stackenv_uninit(&se);
-    stringsink_uninit(&sink);
-  }
-}
-
-PHP_METHOD(Message, serializeToString) {
-  serialize_to_string(getThis(), return_value TSRMLS_CC);
-}
-
-void merge_from_string(const char* data, int data_len, const Descriptor* desc,
-                       MessageHeader* msg) {
-  const upb_pbdecodermethod* method = msgdef_decodermethod(desc);
-  const upb_handlers* h = upb_pbdecodermethod_desthandlers(method);
-  stackenv se;
-  upb_sink sink;
-  upb_pbdecoder* decoder;
-  stackenv_init(&se, "Error occurred during parsing: %s");
-
-  upb_sink_reset(&sink, h, msg);
-  decoder = upb_pbdecoder_create(&se.env, method, &sink);
-  upb_bufsrc_putbuf(data, data_len, upb_pbdecoder_input(decoder));
-
-  stackenv_uninit(&se);
-}
-
-PHP_METHOD(Message, mergeFromString) {
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis())));
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-
-  char *data = NULL;
-  PHP_PROTO_SIZE data_len;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len) ==
-      FAILURE) {
-    return;
-  }
-
-  merge_from_string(data, data_len, desc, msg);
-}
-
-PHP_METHOD(Message, serializeToJsonString) {
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis())));
-
-  zend_bool preserve_proto_fieldnames = false;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b",
-                            &preserve_proto_fieldnames) == FAILURE) {
-    return;
-  }
-
-  stringsink sink;
-  stringsink_init(&sink);
-
-  {
-    const upb_handlers* serialize_handlers =
-        msgdef_json_serialize_handlers(desc, preserve_proto_fieldnames);
-    upb_json_printer* printer;
-    stackenv se;
-
-    stackenv_init(&se, "Error occurred during encoding: %s");
-    printer = upb_json_printer_create(&se.env, serialize_handlers, &sink.sink);
-
-    putmsg(getThis(), desc, upb_json_printer_input(printer), 0 TSRMLS_CC);
-
-    PHP_PROTO_RETVAL_STRINGL(sink.ptr, sink.len, 1);
-
-    stackenv_uninit(&se);
-    stringsink_uninit(&sink);
-  }
-}
-
-PHP_METHOD(Message, mergeFromJsonString) {
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis())));
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-
-  char *data = NULL;
-  PHP_PROTO_SIZE data_len;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len) ==
-      FAILURE) {
-    return;
-  }
-
-  // TODO(teboring): Check and respect string encoding. If not UTF-8, we need to
-  // convert, because string handlers pass data directly to message string
-  // fields.
-
-  // TODO(teboring): Clear message.
-
-  {
-    const upb_json_parsermethod* method = msgdef_jsonparsermethod(desc);
-    stackenv se;
-    upb_sink sink;
-    upb_json_parser* parser;
-    stackenv_init(&se, "Error occurred during parsing: %s");
-
-    upb_sink_reset(&sink, get_fill_handlers(desc), msg);
-    parser = upb_json_parser_create(&se.env, method, &sink);
-    upb_bufsrc_putbuf(data, data_len, upb_json_parser_input(parser));
-
-    stackenv_uninit(&se);
-  }
-}
-
-// TODO(teboring): refactoring with putrawmsg
-static void discard_unknown_fields(MessageHeader* msg) {
-  upb_msg_field_iter it;
-
-  stringsink* unknown = DEREF(message_data(msg), 0, stringsink*);
-  if (unknown != NULL) {
-    stringsink_uninit(unknown);
-    FREE(unknown);
-    DEREF(message_data(msg), 0, stringsink*) = NULL;
-  }
-
-  // Recursively discard unknown fields of submessages.
-  Descriptor* desc = msg->descriptor;
-  TSRMLS_FETCH();
-  for (upb_msg_field_begin(&it, desc->msgdef);
-       !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    upb_fielddef* f = upb_msg_iter_field(&it);
-    uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset;
-    bool containing_oneof = false;
-
-    if (upb_fielddef_containingoneof(f)) {
-      uint32_t oneof_case_offset =
-          desc->layout->fields[upb_fielddef_index(f)].case_offset;
-      // For a oneof, check that this field is actually present -- skip all the
-      // below if not.
-      if (DEREF(message_data(msg), oneof_case_offset, uint32_t) !=
-          upb_fielddef_number(f)) {
-        continue;
-      }
-      // Otherwise, fall through to the appropriate singular-field handler
-      // below.
-      containing_oneof = true;
-    }
-
-    if (is_map_field(f)) {
-      MapIter map_it;
-      int len, size;
-      const upb_fielddef* value_field;
-
-      value_field = map_field_value(f);
-      if (!upb_fielddef_issubmsg(value_field)) continue;
-
-      zval* map_php = CACHED_PTR_TO_ZVAL_PTR(
-          DEREF(message_data(msg), offset, CACHED_VALUE*));
-      if (map_php == NULL) continue;
-
-      Map* intern = UNBOX(Map, map_php);
-      for (map_begin(map_php, &map_it TSRMLS_CC);
-           !map_done(&map_it); map_next(&map_it)) {
-        upb_value value = map_iter_value(&map_it, &len);
-        void* memory = raw_value(upb_value_memory(&value), value_field);
-#if PHP_MAJOR_VERSION < 7
-        MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory);
-#else
-        MessageHeader *submsg =
-            (MessageHeader*)((char*)(Z_OBJ_P((zval*)memory)) -
-                XtOffsetOf(MessageHeader, std));
-#endif
-        discard_unknown_fields(submsg);
-      }
-    } else if (upb_fielddef_isseq(f)) {
-      if (!upb_fielddef_issubmsg(f)) continue;
-
-      zval* array_php = CACHED_PTR_TO_ZVAL_PTR(
-          DEREF(message_data(msg), offset, CACHED_VALUE*));
-      if (array_php == NULL) continue;
-
-      int size, i;
-      RepeatedField* intern = UNBOX(RepeatedField, array_php);
-      HashTable *ht = PHP_PROTO_HASH_OF(intern->array);
-      size = zend_hash_num_elements(ht);
-      if (size == 0) continue;
-
-      for (i = 0; i < size; i++) {
-        void* memory = repeated_field_index_native(intern, i TSRMLS_CC);
-#if PHP_MAJOR_VERSION < 7
-        MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory);
-#else
-        MessageHeader *submsg =
-            (MessageHeader*)((char*)(Z_OBJ_P((zval*)memory)) -
-                XtOffsetOf(MessageHeader, std));
-#endif
-        discard_unknown_fields(submsg);
-      }
-    } else if (upb_fielddef_issubmsg(f)) {
-      zval* submsg_php = CACHED_PTR_TO_ZVAL_PTR(
-          DEREF(message_data(msg), offset, CACHED_VALUE*));
-      if (Z_TYPE_P(submsg_php) == IS_NULL) continue;
-      MessageHeader* submsg = UNBOX(MessageHeader, submsg_php);
-      discard_unknown_fields(submsg);
-    }
-  }
-}
-
-PHP_METHOD(Message, discardUnknownFields) {
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-  discard_unknown_fields(msg);
-}
diff --git a/php/ext/google/protobuf/map.c b/php/ext/google/protobuf/map.c
deleted file mode 100644
index ab8a518..0000000
--- a/php/ext/google/protobuf/map.c
+++ /dev/null
@@ -1,589 +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.
-
-#include <ext/spl/spl_iterators.h>
-#include <Zend/zend_API.h>
-#include <Zend/zend_interfaces.h>
-
-#include "protobuf.h"
-#include "utf8.h"
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetGet, 0, 0, 1)
-  ZEND_ARG_INFO(0, index)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetSet, 0, 0, 2)
-  ZEND_ARG_INFO(0, index)
-  ZEND_ARG_INFO(0, newval)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_void, 0)
-ZEND_END_ARG_INFO()
-
-// Utilities
-
-void* upb_value_memory(upb_value* v) {
-  return (void*)(&v->val);
-}
-
-// -----------------------------------------------------------------------------
-// Basic map operations on top of upb's strtable.
-//
-// Note that we roll our own `Map` container here because, as for
-// `RepeatedField`, we want a strongly-typed container. This is so that any user
-// errors due to incorrect map key or value types are raised as close as
-// possible to the error site, rather than at some deferred point (e.g.,
-// serialization).
-//
-// We build our `Map` on top of upb_strtable so that we're able to take
-// advantage of the native_slot storage abstraction, as RepeatedField does.
-// (This is not quite a perfect mapping -- see the key conversions below -- but
-// gives us full support and error-checking for all value types for free.)
-// -----------------------------------------------------------------------------
-
-// Map values are stored using the native_slot abstraction (as with repeated
-// field values), but keys are a bit special. Since we use a strtable, we need
-// to store keys as sequences of bytes such that equality of those bytes maps
-// one-to-one to equality of keys. We store strings directly (i.e., they map to
-// their own bytes) and integers as native integers (using the native_slot
-// abstraction).
-
-// Note that there is another tradeoff here in keeping string keys as native
-// strings rather than PHP strings: traversing the Map requires conversion to
-// PHP string values on every traversal, potentially creating more garbage. We
-// should consider ways to cache a PHP version of the key if this becomes an
-// issue later.
-
-// Forms a key to use with the underlying strtable from a PHP key value. |buf|
-// must point to TABLE_KEY_BUF_LENGTH bytes of temporary space, used to
-// construct a key byte sequence if needed. |out_key| and |out_length| provide
-// the resulting key data/length.
-#define TABLE_KEY_BUF_LENGTH 8  // sizeof(uint64_t)
-static bool table_key(Map* self, zval* key,
-                      char* buf,
-                      const char** out_key,
-                      size_t* out_length TSRMLS_DC) {
-  switch (self->key_type) {
-    case UPB_TYPE_STRING:
-      if (!protobuf_convert_to_string(key)) {
-        return false;
-      }
-      if (!is_structurally_valid_utf8(Z_STRVAL_P(key), Z_STRLEN_P(key))) {
-        zend_error(E_USER_ERROR, "Given key is not UTF8 encoded.");
-        return false;
-      }
-      *out_key = Z_STRVAL_P(key);
-      *out_length = Z_STRLEN_P(key);
-      break;
-
-#define CASE_TYPE(upb_type, type, c_type, php_type)                     \
-  case UPB_TYPE_##upb_type: {                                           \
-    c_type type##_value;                                                \
-    if (!protobuf_convert_to_##type(key, &type##_value)) {              \
-      return false;                                                     \
-    }                                                                   \
-    native_slot_set_by_array(self->key_type, NULL, buf, key TSRMLS_CC); \
-    *out_key = buf;                                                     \
-    *out_length = native_slot_size(self->key_type);                     \
-    break;                                                              \
-  }
-      CASE_TYPE(BOOL, bool, int8_t, BOOL)
-      CASE_TYPE(INT32, int32, int32_t, LONG)
-      CASE_TYPE(INT64, int64, int64_t, LONG)
-      CASE_TYPE(UINT32, uint32, uint32_t, LONG)
-      CASE_TYPE(UINT64, uint64, uint64_t, LONG)
-
-#undef CASE_TYPE
-
-    default:
-      // Map constructor should not allow a Map with another key type to be
-      // constructed.
-      assert(false);
-      break;
-  }
-
-  return true;
-}
-
-// -----------------------------------------------------------------------------
-// MapField methods
-// -----------------------------------------------------------------------------
-
-static zend_function_entry map_field_methods[] = {
-  PHP_ME(MapField, __construct,  NULL,              ZEND_ACC_PUBLIC)
-  PHP_ME(MapField, offsetExists, arginfo_offsetGet, ZEND_ACC_PUBLIC)
-  PHP_ME(MapField, offsetGet,    arginfo_offsetGet, ZEND_ACC_PUBLIC)
-  PHP_ME(MapField, offsetSet,    arginfo_offsetSet, ZEND_ACC_PUBLIC)
-  PHP_ME(MapField, offsetUnset,  arginfo_offsetGet, ZEND_ACC_PUBLIC)
-  PHP_ME(MapField, count,        arginfo_void,      ZEND_ACC_PUBLIC)
-  PHP_ME(MapField, getIterator,  arginfo_void,      ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-// Forward declare static functions.
-
-static void map_field_write_dimension(zval *object, zval *key,
-                                      zval *value TSRMLS_DC);
-
-// -----------------------------------------------------------------------------
-// MapField creation/desctruction
-// -----------------------------------------------------------------------------
-
-zend_class_entry* map_field_type;
-zend_class_entry* map_field_iter_type;
-
-zend_object_handlers* map_field_handlers;
-zend_object_handlers* map_field_iter_handlers;
-
-static void map_begin_internal(Map *map, MapIter *iter) {
-  iter->self = map;
-  upb_strtable_begin(&iter->it, &map->table);
-}
-
-static HashTable *map_field_get_gc(zval *object, CACHED_VALUE **table, int *n) {
-  // TODO(teboring): Unfortunately, zend engine does not support garbage
-  // collection for custom array. We have to use zend engine's native array
-  // instead.
-  *table = NULL;
-  *n = 0;
-  return NULL;
-}
-
-// Define map value element free function.
-#if PHP_MAJOR_VERSION < 7
-static inline void php_proto_map_string_release(void *value) {
-  zval_ptr_dtor(value);
-}
-
-static inline void php_proto_map_object_release(void *value) {
-  zval_ptr_dtor(value);
-}
-#else
-static inline void php_proto_map_string_release(void *value) {
-  zend_string* object = *(zend_string**)value;
-  zend_string_release(object);
-}
-static inline void php_proto_map_object_release(void *value) {
-  zend_object* object = *(zend_object**)value;
-  if(--GC_REFCOUNT(object) == 0) {
-    zend_objects_store_del(object);
-  }
-}
-#endif
-
-// Define object free method.
-PHP_PROTO_OBJECT_FREE_START(Map, map_field)
-MapIter it;
-int len;
-for (map_begin_internal(intern, &it); !map_done(&it); map_next(&it)) {
-  upb_value value = map_iter_value(&it, &len);
-  void *mem = upb_value_memory(&value);
-  switch (intern->value_type) {
-    case UPB_TYPE_MESSAGE:
-      php_proto_map_object_release(mem);
-      break;
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      php_proto_map_string_release(mem);
-      break;
-    default:
-      break;
-  }
-}
-upb_strtable_uninit(&intern->table);
-PHP_PROTO_OBJECT_FREE_END
-
-PHP_PROTO_OBJECT_DTOR_START(Map, map_field)
-PHP_PROTO_OBJECT_DTOR_END
-
-// Define object create method.
-PHP_PROTO_OBJECT_CREATE_START(Map, map_field)
-// Table value type is always UINT64: this ensures enough space to store the
-// native_slot value.
-if (!upb_strtable_init(&intern->table, UPB_CTYPE_UINT64)) {
-  zend_error(E_USER_ERROR, "Could not allocate table.");
-}
-PHP_PROTO_OBJECT_CREATE_END(Map, map_field)
-
-// Init class entry.
-PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\MapField", Map,
-                           map_field)
-zend_class_implements(map_field_type TSRMLS_CC, 3, spl_ce_ArrayAccess,
-                      zend_ce_aggregate, spl_ce_Countable);
-map_field_handlers->write_dimension = map_field_write_dimension;
-map_field_handlers->get_gc = map_field_get_gc;
-PHP_PROTO_INIT_CLASS_END
-
-void map_field_create_with_field(const zend_class_entry *ce,
-                                 const upb_fielddef *field,
-                                 CACHED_VALUE *map_field PHP_PROTO_TSRMLS_DC) {
-  const upb_fielddef *key_field = map_field_key(field);
-  const upb_fielddef *value_field = map_field_value(field);
-  map_field_create_with_type(
-      ce, upb_fielddef_type(key_field), upb_fielddef_type(value_field),
-      field_type_class(value_field TSRMLS_CC), map_field PHP_PROTO_TSRMLS_CC);
-}
-
-void map_field_create_with_type(const zend_class_entry *ce,
-                                upb_fieldtype_t key_type,
-                                upb_fieldtype_t value_type,
-                                const zend_class_entry *msg_ce,
-                                CACHED_VALUE *map_field PHP_PROTO_TSRMLS_DC) {
-  CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(CACHED_PTR_TO_ZVAL_PTR(map_field),
-                                   map_field_type);
-  Map *intern = UNBOX(Map, CACHED_TO_ZVAL_PTR(*map_field));
-  intern->key_type = key_type;
-  intern->value_type = value_type;
-  intern->msg_ce = msg_ce;
-}
-
-// -----------------------------------------------------------------------------
-// MapField Handlers
-// -----------------------------------------------------------------------------
-
-static bool map_field_read_dimension(zval *object, zval *key, int type,
-                                     CACHED_VALUE *retval TSRMLS_DC) {
-  Map *intern = UNBOX(Map, object);
-
-  char keybuf[TABLE_KEY_BUF_LENGTH];
-  const char* keyval = NULL;
-  size_t length = 0;
-  upb_value v;
-#ifndef NDEBUG
-  v.ctype = UPB_CTYPE_UINT64;
-#endif
-  if (!table_key(intern, key, keybuf, &keyval, &length TSRMLS_CC)) {
-    return false;
-  }
-
-  if (upb_strtable_lookup2(&intern->table, keyval, length, &v)) {
-    void* mem = upb_value_memory(&v);
-    native_slot_get_by_map_value(intern->value_type, mem, retval TSRMLS_CC);
-    return true;
-  } else {
-    zend_error(E_USER_ERROR, "Given key doesn't exist.");
-    return false;
-  }
-}
-
-static bool map_index_unset(Map *intern, const char* keyval, int length) {
-  upb_value old_value;
-  if (upb_strtable_remove2(&intern->table, keyval, length, &old_value)) {
-    switch (intern->value_type) {
-      case UPB_TYPE_MESSAGE: {
-#if PHP_MAJOR_VERSION < 7
-        zval_ptr_dtor(upb_value_memory(&old_value));
-#else
-        zend_object* object = *(zend_object**)upb_value_memory(&old_value);
-        if(--GC_REFCOUNT(object) == 0) {
-          zend_objects_store_del(object);
-        }
-#endif
-        break;
-      }
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES: {
-#if PHP_MAJOR_VERSION < 7
-        zval_ptr_dtor(upb_value_memory(&old_value));
-#else
-        zend_string* object = *(zend_string**)upb_value_memory(&old_value);
-        zend_string_release(object);
-#endif
-        break;
-      }
-      default:
-        break;
-    }
-  }
-}
-
-bool map_index_set(Map *intern, const char* keyval, int length, upb_value v) {
-  // Replace any existing value by issuing a 'remove' operation first.
-  map_index_unset(intern, keyval, length);
-
-  if (!upb_strtable_insert2(&intern->table, keyval, length, v)) {
-    zend_error(E_USER_ERROR, "Could not insert into table");
-    return false;
-  }
-
-  return true;
-}
-
-static void map_field_write_dimension(zval *object, zval *key,
-                                      zval *value TSRMLS_DC) {
-  Map *intern = UNBOX(Map, object);
-
-  char keybuf[TABLE_KEY_BUF_LENGTH];
-  const char* keyval = NULL;
-  size_t length = 0;
-  upb_value v;
-  void* mem;
-  if (!table_key(intern, key, keybuf, &keyval, &length TSRMLS_CC)) {
-    return;
-  }
-
-  mem = upb_value_memory(&v);
-  memset(mem, 0, native_slot_size(intern->value_type));
-  if (!native_slot_set_by_map(intern->value_type, intern->msg_ce, mem,
-                                value TSRMLS_CC)) {
-    return;
-  }
-#ifndef NDEBUG
-  v.ctype = UPB_CTYPE_UINT64;
-#endif
-
-  map_index_set(intern, keyval, length, v);
-}
-
-static bool map_field_unset_dimension(zval *object, zval *key TSRMLS_DC) {
-  Map *intern = UNBOX(Map, object);
-
-  char keybuf[TABLE_KEY_BUF_LENGTH];
-  const char* keyval = NULL;
-  size_t length = 0;
-  upb_value v;
-  if (!table_key(intern, key, keybuf, &keyval, &length TSRMLS_CC)) {
-    return false;
-  }
-#ifndef NDEBUG
-  v.ctype = UPB_CTYPE_UINT64;
-#endif
-
-  map_index_unset(intern, keyval, length);
-
-  return true;
-}
-
-// -----------------------------------------------------------------------------
-// PHP MapField Methods
-// -----------------------------------------------------------------------------
-
-PHP_METHOD(MapField, __construct) {
-  long key_type, value_type;
-  zend_class_entry* klass = NULL;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll|C", &key_type,
-                            &value_type, &klass) == FAILURE) {
-    return;
-  }
-
-  Map *intern = UNBOX(Map, getThis());
-  intern->key_type = to_fieldtype(key_type);
-  intern->value_type = to_fieldtype(value_type);
-  intern->msg_ce = klass;
-
-  // Check that the key type is an allowed type.
-  switch (intern->key_type) {
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_UINT64:
-    case UPB_TYPE_BOOL:
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      // These are OK.
-      break;
-    default:
-      zend_error(E_USER_ERROR, "Invalid key type for map.");
-  }
-}
-
-PHP_METHOD(MapField, offsetExists) {
-  zval *key;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &key) ==
-      FAILURE) {
-    return;
-  }
-
-  Map *intern = UNBOX(Map, getThis());
-
-  char keybuf[TABLE_KEY_BUF_LENGTH];
-  const char* keyval = NULL;
-  size_t length = 0;
-  upb_value v;
-#ifndef NDEBUG
-  v.ctype = UPB_CTYPE_UINT64;
-#endif
-  if (!table_key(intern, key, keybuf, &keyval, &length TSRMLS_CC)) {
-    RETURN_BOOL(false);
-  }
-
-  RETURN_BOOL(upb_strtable_lookup2(&intern->table, keyval, length, &v));
-}
-
-PHP_METHOD(MapField, offsetGet) {
-  zval *index, *value;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &index) ==
-      FAILURE) {
-    return;
-  }
-  map_field_read_dimension(getThis(), index, BP_VAR_R,
-                           ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
-}
-
-PHP_METHOD(MapField, offsetSet) {
-  zval *index, *value;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &index, &value) ==
-      FAILURE) {
-    return;
-  }
-  map_field_write_dimension(getThis(), index, value TSRMLS_CC);
-}
-
-PHP_METHOD(MapField, offsetUnset) {
-  zval *index;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &index) ==
-      FAILURE) {
-    return;
-  }
-  map_field_unset_dimension(getThis(), index TSRMLS_CC);
-}
-
-PHP_METHOD(MapField, count) {
-  Map *intern = UNBOX(Map, getThis());
-
-  if (zend_parse_parameters_none() == FAILURE) {
-    return;
-  }
-
-  RETURN_LONG(upb_strtable_count(&intern->table));
-}
-
-PHP_METHOD(MapField, getIterator) {
-  CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(return_value,
-                                   map_field_iter_type);
-
-  Map *intern = UNBOX(Map, getThis());
-  MapIter *iter = UNBOX(MapIter, return_value);
-  map_begin(getThis(), iter TSRMLS_CC);
-}
-
-// -----------------------------------------------------------------------------
-// Map Iterator
-// -----------------------------------------------------------------------------
-
-void map_begin(zval *map_php, MapIter *iter TSRMLS_DC) {
-  Map *self = UNBOX(Map, map_php);
-  map_begin_internal(self, iter);
-}
-
-void map_next(MapIter *iter) {
-  upb_strtable_next(&iter->it);
-}
-
-bool map_done(MapIter *iter) {
-  return upb_strtable_done(&iter->it);
-}
-
-const char *map_iter_key(MapIter *iter, int *len) {
-  *len = upb_strtable_iter_keylength(&iter->it);
-  return upb_strtable_iter_key(&iter->it);
-}
-
-upb_value map_iter_value(MapIter *iter, int *len) {
-  *len = native_slot_size(iter->self->value_type);
-  return upb_strtable_iter_value(&iter->it);
-}
-
-// -----------------------------------------------------------------------------
-// MapFieldIter methods
-// -----------------------------------------------------------------------------
-static zend_function_entry map_field_iter_methods[] = {
-  PHP_ME(MapFieldIter, rewind,      arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(MapFieldIter, current,     arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(MapFieldIter, key,         arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(MapFieldIter, next,        arginfo_void, ZEND_ACC_PUBLIC)
-  PHP_ME(MapFieldIter, valid,       arginfo_void, ZEND_ACC_PUBLIC)
-  ZEND_FE_END
-};
-
-// -----------------------------------------------------------------------------
-// MapFieldIter creation/desctruction
-// -----------------------------------------------------------------------------
-
-// Define object free method.
-PHP_PROTO_OBJECT_FREE_START(MapIter, map_field_iter)
-PHP_PROTO_OBJECT_FREE_END
-
-PHP_PROTO_OBJECT_DTOR_START(MapIter, map_field_iter)
-PHP_PROTO_OBJECT_DTOR_END
-
-// Define object create method.
-PHP_PROTO_OBJECT_CREATE_START(MapIter, map_field_iter)
-intern->self = NULL;
-PHP_PROTO_OBJECT_CREATE_END(MapIter, map_field_iter)
-
-// Init class entry.
-PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\MapFieldIter",
-                           MapIter, map_field_iter)
-zend_class_implements(map_field_iter_type TSRMLS_CC, 1, zend_ce_iterator);
-PHP_PROTO_INIT_CLASS_END
-
-// -----------------------------------------------------------------------------
-// PHP MapFieldIter Methods
-// -----------------------------------------------------------------------------
-
-PHP_METHOD(MapFieldIter, rewind) {
-  MapIter *intern = UNBOX(MapIter, getThis());
-  map_begin_internal(intern->self, intern);
-}
-
-PHP_METHOD(MapFieldIter, current) {
-  MapIter *intern = UNBOX(MapIter, getThis());
-  Map *map_field = intern->self;
-
-  int value_length = 0;
-  upb_value value = map_iter_value(intern, &value_length);
-
-  void* mem = upb_value_memory(&value);
-  native_slot_get_by_map_value(map_field->value_type, mem,
-                               ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
-}
-
-PHP_METHOD(MapFieldIter, key) {
-  MapIter *intern = UNBOX(MapIter, getThis());
-  Map *map_field = intern->self;
-
-  int key_length = 0;
-  const char* key = map_iter_key(intern, &key_length);
-
-  native_slot_get_by_map_key(map_field->key_type, key, key_length,
-                             ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
-}
-
-PHP_METHOD(MapFieldIter, next) {
-  MapIter *intern = UNBOX(MapIter, getThis());
-  map_next(intern);
-}
-
-PHP_METHOD(MapFieldIter, valid) {
-  MapIter *intern = UNBOX(MapIter, getThis());
-  RETURN_BOOL(!map_done(intern));
-}
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index e801f4a..c062d66 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -29,2094 +29,245 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include <php.h>
-#include <stdlib.h>
 
 #include "protobuf.h"
-#include "utf8.h"
 
-zend_class_entry* message_type;
-zend_object_handlers* message_handlers;
-static const char TYPE_URL_PREFIX[] = "type.googleapis.com/";
-static void hex_to_binary(const char* hex, char** binary, int* binary_len);
+// -----------------------------------------------------------------------------
+// Class/module creation from msgdefs and enumdefs, respectively.
+// -----------------------------------------------------------------------------
+
+void* message_data(void* msg) {
+  return ((uint8_t *)msg) + sizeof(MessageHeader);
+}
+
+void message_set_property(zval* object, zval* field_name, zval* value,
+                          const zend_literal* key TSRMLS_DC) {
+  const upb_fielddef* field;
+
+  MessageHeader* self = zend_object_store_get_object(object TSRMLS_CC);
+
+  CHECK_TYPE(field_name, IS_STRING);
+  field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(field_name));
+  if (field == NULL) {
+    zend_error(E_ERROR, "Unknown field: %s", Z_STRVAL_P(field_name));
+  }
+  layout_set(self->descriptor->layout, message_data(self), field, value);
+}
+
+zval* message_get_property(zval* object, zval* member, int type,
+                             const zend_literal* key TSRMLS_DC) {
+  MessageHeader* self =
+      (MessageHeader*)zend_object_store_get_object(object TSRMLS_CC);
+  CHECK_TYPE(member, IS_STRING);
+
+  const upb_fielddef* field;
+  field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
+  if (field == NULL) {
+    return EG(uninitialized_zval_ptr);
+  }
+  zval* retval = layout_get(self->descriptor->layout, message_data(self), field TSRMLS_CC);
+  return retval;
+}
 
 static  zend_function_entry message_methods[] = {
-  PHP_ME(Message, clear, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, discardUnknownFields, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, serializeToString, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, mergeFromString, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, serializeToJsonString, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, mergeFromJsonString, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, mergeFrom, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED)
-  PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED)
-  PHP_ME(Message, whichOneof, NULL, ZEND_ACC_PROTECTED)
-  PHP_ME(Message, __construct, NULL, ZEND_ACC_PROTECTED)
+  PHP_ME(Message, encode, NULL, ZEND_ACC_PUBLIC)
   {NULL, NULL, NULL}
 };
 
-// Forward declare static functions.
+/* stringsink *****************************************************************/
 
-#if PHP_MAJOR_VERSION < 7
-static void message_set_property(zval* object, zval* member, zval* value,
-                                 php_proto_zend_literal key TSRMLS_DC);
-static zval* message_get_property(zval* object, zval* member, int type,
-                                  const zend_literal* key TSRMLS_DC);
-static zval** message_get_property_ptr_ptr(zval* object, zval* member, int type,
-                                           php_proto_zend_literal key TSRMLS_DC);
-static HashTable* message_get_gc(zval* object, zval*** table, int* n TSRMLS_DC);
-#else
-static void message_set_property(zval* object, zval* member, zval* value,
-                                 void** cache_slot);
-static zval* message_get_property(zval* object, zval* member, int type,
-                                  void** cache_slot, zval* rv);
-static zval* message_get_property_ptr_ptr(zval* object, zval* member, int type,
-                                          void** cache_slot);
-static HashTable* message_get_gc(zval* object, zval** table, int* n);
-#endif
-static HashTable* message_get_properties(zval* object TSRMLS_DC);
+// This should probably be factored into a common upb component.
 
-// -----------------------------------------------------------------------------
-// PHP Message Handlers
-// -----------------------------------------------------------------------------
+typedef struct {
+  upb_byteshandler handler;
+  upb_bytessink sink;
+  char *ptr;
+  size_t len, size;
+} stringsink;
 
-// Define object free method.
-PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
-  if (*(void**)intern->data != NULL) {
-    stringsink_uninit(*(void**)intern->data);
-    FREE(*(void**)intern->data);
-  }
-  FREE(intern->data);
-PHP_PROTO_OBJECT_FREE_END
-
-PHP_PROTO_OBJECT_DTOR_START(MessageHeader, message)
-PHP_PROTO_OBJECT_DTOR_END
-
-// Define object create method.
-PHP_PROTO_OBJECT_CREATE_START(MessageHeader, message)
-// Because php call this create func before calling the sub-message's
-// constructor defined in PHP, it's possible that the decriptor of this class
-// hasn't been added to descritpor pool (when the class is first
-// instantiated). In that case, we will defer the initialization of the custom
-// data to the parent Message's constructor, which will be called by
-// sub-message's constructors after the descriptor has been added.
-PHP_PROTO_OBJECT_CREATE_END(MessageHeader, message)
-
-// Init class entry.
-PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\Message",
-                           MessageHeader, message)
-  message_handlers->write_property = message_set_property;
-  message_handlers->read_property = message_get_property;
-  message_handlers->get_property_ptr_ptr = message_get_property_ptr_ptr;
-  message_handlers->get_properties = message_get_properties;
-  message_handlers->get_gc = message_get_gc;
-PHP_PROTO_INIT_CLASS_END
-
-static void message_set_property_internal(zval* object, zval* member,
-                                          zval* value TSRMLS_DC) {
-  const upb_fielddef* field;
-
-  MessageHeader* self = UNBOX(MessageHeader, object);
-
-  field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
-  if (field == NULL) {
-    zend_error(E_USER_ERROR, "Unknown field: %s", Z_STRVAL_P(member));
-  }
-
-  layout_set(self->descriptor->layout, self, field, value TSRMLS_CC);
+static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
+  stringsink *sink = _sink;
+  sink->len = 0;
+  return sink;
 }
 
-#if PHP_MAJOR_VERSION < 7
-static void message_set_property(zval* object, zval* member, zval* value,
-                                 php_proto_zend_literal key TSRMLS_DC) {
-#else
-static void message_set_property(zval* object, zval* member, zval* value,
-                                 void** cache_slot) {
-#endif
-  if (Z_TYPE_P(member) != IS_STRING) {
-    zend_error(E_USER_ERROR, "Unexpected type for field name");
-    return;
+static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
+                                size_t len, const upb_bufhandle *handle) {
+  stringsink *sink = _sink;
+  size_t new_size = sink->size;
+
+  UPB_UNUSED(hd);
+  UPB_UNUSED(handle);
+
+  while (sink->len + len > new_size) {
+    new_size *= 2;
   }
 
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-  if (Z_OBJCE_P(object) != EG(scope)) {
-#else
-  if (Z_OBJCE_P(object) != zend_get_executed_scope()) {
-#endif
-    // User cannot set property directly (e.g., $m->a = 1)
-    zend_error(E_USER_ERROR, "Cannot access private property.");
-    return;
+  if (new_size != sink->size) {
+    sink->ptr = realloc(sink->ptr, new_size);
+    sink->size = new_size;
   }
 
-  message_set_property_internal(object, member, value TSRMLS_CC);
+  memcpy(sink->ptr + sink->len, ptr, len);
+  sink->len += len;
+
+  return len;
 }
 
-static zval* message_get_property_internal(zval* object,
-                                           zval* member TSRMLS_DC) {
-  MessageHeader* self = UNBOX(MessageHeader, object);
-  const upb_fielddef* field;
-  field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
-  if (field == NULL) {
-    return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
-  }
+void stringsink_init(stringsink *sink) {
+  upb_byteshandler_init(&sink->handler);
+  upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
+  upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
 
-  zend_property_info* property_info;
-#if PHP_MAJOR_VERSION < 7
-  property_info =
-      zend_get_property_info(Z_OBJCE_P(object), member, true TSRMLS_CC);
-#else
-  property_info =
-      zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(member), true);
-#endif
-  return layout_get(
-      self->descriptor->layout, message_data(self), field,
-      OBJ_PROP(Z_OBJ_P(object), property_info->offset) TSRMLS_CC);
+  upb_bytessink_reset(&sink->sink, &sink->handler, sink);
+
+  sink->size = 32;
+  sink->ptr = malloc(sink->size);
+  sink->len = 0;
 }
 
-static void message_get_oneof_property_internal(zval* object, zval* member,
-                                                zval* return_value TSRMLS_DC) {
-  MessageHeader* self = UNBOX(MessageHeader, object);
-  const upb_fielddef* field;
-  field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
-  if (field == NULL) {
-    return;
-  }
+void stringsink_uninit(stringsink *sink) { free(sink->ptr); }
 
-  layout_get(self->descriptor->layout, message_data(self), field,
-             ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
+// Stack-allocated context during an encode/decode operation. Contains the upb
+// environment and its stack-based allocator, an initial buffer for allocations
+// to avoid malloc() when possible, and a template for PHP exception messages
+// if any error occurs.
+#define STACK_ENV_STACKBYTES 4096
+typedef struct {
+  upb_env env;
+  upb_seededalloc alloc;
+  const char *php_error_template;
+  char allocbuf[STACK_ENV_STACKBYTES];
+} stackenv;
+
+static void stackenv_init(stackenv* se, const char* errmsg);
+static void stackenv_uninit(stackenv* se);
+
+// Callback invoked by upb if any error occurs during parsing or serialization.
+static bool env_error_func(void* ud, const upb_status* status) {
+    stackenv* se = ud;
+    // Free the env -- rb_raise will longjmp up the stack past the encode/decode
+    // function so it would not otherwise have been freed.
+    stackenv_uninit(se);
+
+    // TODO(teboring): have a way to verify that this is actually a parse error,
+    // instead of just throwing "parse error" unconditionally.
+    zend_error(E_ERROR, se->php_error_template);
+    // Never reached.
+    return false;
 }
 
-#if PHP_MAJOR_VERSION < 7
-static zval* message_get_property(zval* object, zval* member, int type,
-                                  const zend_literal* key TSRMLS_DC) {
-#else
-static zval* message_get_property(zval* object, zval* member, int type,
-                                  void** cache_slot, zval* rv) {
-#endif
-  if (Z_TYPE_P(member) != IS_STRING) {
-    zend_error(E_USER_ERROR, "Property name has to be a string.");
-    return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
-  }
-
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-  if (Z_OBJCE_P(object) != EG(scope)) {
-#else
-  if (Z_OBJCE_P(object) != zend_get_executed_scope()) {
-#endif
-    // User cannot get property directly (e.g., $a = $m->a)
-    zend_error(E_USER_ERROR, "Cannot access private property.");
-    return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
-  }
-
-  return message_get_property_internal(object, member TSRMLS_CC);
+static void stackenv_init(stackenv* se, const char* errmsg) {
+  se->php_error_template = errmsg;
+  upb_env_init(&se->env);
+  upb_seededalloc_init(&se->alloc, &se->allocbuf, STACK_ENV_STACKBYTES);
+  upb_env_setallocfunc(&se->env, upb_seededalloc_getallocfunc(&se->alloc),
+                       &se->alloc);
+  upb_env_seterrorfunc(&se->env, env_error_func, se);
 }
 
-#if PHP_MAJOR_VERSION < 7
-static zval** message_get_property_ptr_ptr(zval* object, zval* member, int type,
-                                           php_proto_zend_literal key
-                                               TSRMLS_DC) {
-#else
-static zval* message_get_property_ptr_ptr(zval* object, zval* member, int type,
-                                          void** cache_slot) {
-#endif
-  return NULL;
-}
-
-static HashTable* message_get_properties(zval* object TSRMLS_DC) {
-  return NULL;
-}
-
-static HashTable* message_get_gc(zval* object, CACHED_VALUE** table,
-                                 int* n TSRMLS_DC) {
-  zend_object* zobj = Z_OBJ_P(object);
-  *table = zobj->properties_table;
-  *n = zobj->ce->default_properties_count;
-  return NULL;
+static void stackenv_uninit(stackenv* se) {
+  upb_env_uninit(&se->env);
+  upb_seededalloc_uninit(&se->alloc);
 }
 
 // -----------------------------------------------------------------------------
-// C Message Utilities
+// Message
 // -----------------------------------------------------------------------------
 
-void* message_data(MessageHeader* msg) {
-  return msg->data;
-}
-
-void custom_data_init(const zend_class_entry* ce,
-                      MessageHeader* intern PHP_PROTO_TSRMLS_DC) {
-  Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(ce));
-  intern->data = ALLOC_N(uint8_t, desc->layout->size);
-  memset(message_data(intern), 0, desc->layout->size);
-  // We wrap first so that everything in the message object is GC-rooted in
-  // case a collection happens during object creation in layout_init().
-  intern->descriptor = desc;
-  layout_init(desc->layout, message_data(intern),
-              &intern->std PHP_PROTO_TSRMLS_CC);
-}
-
-void build_class_from_descriptor(
-    PHP_PROTO_HASHTABLE_VALUE php_descriptor TSRMLS_DC) {
-  Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, php_descriptor);
-
-  // Map entries don't have existing php class.
-  if (upb_msgdef_mapentry(desc->msgdef)) {
-    return;
+static const upb_handlers* msgdef_pb_serialize_handlers(Descriptor* desc) {
+  if (desc->pb_serialize_handlers == NULL) {
+    desc->pb_serialize_handlers =
+        upb_pb_encoder_newhandlers(desc->msgdef, &desc->pb_serialize_handlers);
   }
+  return desc->pb_serialize_handlers;
+}
 
-  zend_class_entry* registered_ce = desc->klass;
+PHP_METHOD(Message, encode) {
+  Descriptor* desc = (Descriptor*)zend_object_store_get_object(
+      CE_STATIC_MEMBERS(Z_OBJCE_P(getThis()))[0] TSRMLS_CC);
 
+  stringsink sink;
+  stringsink_init(&sink);
+
+  {
+    const upb_handlers* serialize_handlers = msgdef_pb_serialize_handlers(desc);
+
+    stackenv se;
+    upb_pb_encoder* encoder;
+
+    stackenv_init(&se, "Error occurred during encoding: %s");
+    encoder = upb_pb_encoder_create(&se.env, serialize_handlers, &sink.sink);
+
+    putmsg(getThis(), desc, upb_pb_encoder_input(encoder), 0);
+
+    RETVAL_STRINGL(sink.ptr, sink.len, 1);
+
+    stackenv_uninit(&se);
+    stringsink_uninit(&sink);
+  }
+}
+
+void message_free(void * object TSRMLS_DC) {
+  FREE(object);
+}
+
+zend_object_value message_create(zend_class_entry* ce TSRMLS_DC) {
+  zend_object_value return_value;
+
+  zval* php_descriptor = get_def_obj(ce);
+
+  Descriptor* desc = zend_object_store_get_object(php_descriptor TSRMLS_CC);
+  MessageHeader* msg = (MessageHeader*)ALLOC_N(
+      uint8_t, sizeof(MessageHeader) + desc->layout->size);
+  memset(message_data(msg), 0, desc->layout->size);
+
+  // We wrap first so that everything in the message object is GC-rooted in case
+  // a collection happens during object creation in layout_init().
+  msg->descriptor = desc;
+
+  layout_init(desc->layout, message_data(msg));
+  zend_object_std_init(&msg->std, ce TSRMLS_CC);
+
+  return_value.handle = zend_objects_store_put(
+      msg, (zend_objects_store_dtor_t)zend_objects_destroy_object,
+      message_free, NULL TSRMLS_CC);
+
+  return_value.handlers = PROTOBUF_G(message_handlers);
+  return return_value;
+}
+
+const zend_class_entry* build_class_from_descriptor(
+    zval* php_descriptor TSRMLS_DC) {
+  Descriptor* desc = php_to_descriptor(php_descriptor);
   if (desc->layout == NULL) {
     MessageLayout* layout = create_layout(desc->msgdef);
     desc->layout = layout;
   }
+  // TODO(teboring): Add it back.
+  // if (desc->fill_method == NULL) {
+  //   desc->fill_method = new_fillmsg_decodermethod(desc, &desc->fill_method);
+  // }
+
+  const char* name = upb_msgdef_fullname(desc->msgdef);
+  if (name == NULL) {
+    zend_error(E_ERROR, "Descriptor does not have assigned name.");
+  }
+
+  zend_class_entry class_entry;
+  INIT_CLASS_ENTRY_EX(class_entry, name, strlen(name), message_methods);
+  zend_class_entry* registered_ce =
+      zend_register_internal_class(&class_entry TSRMLS_CC);
+
+  add_def_obj(registered_ce, php_descriptor);
+
+  if (PROTOBUF_G(message_handlers) == NULL) {
+    PROTOBUF_G(message_handlers) = ALLOC(zend_object_handlers);
+    memcpy(PROTOBUF_G(message_handlers), zend_get_std_object_handlers(),
+           sizeof(zend_object_handlers));
+    PROTOBUF_G(message_handlers)->write_property = message_set_property;
+    PROTOBUF_G(message_handlers)->read_property = message_get_property;
+  }
 
   registered_ce->create_object = message_create;
 }
-
-// -----------------------------------------------------------------------------
-// PHP Methods
-// -----------------------------------------------------------------------------
-
-// At the first time the message is created, the class entry hasn't been
-// modified. As a result, the first created instance will be a normal zend
-// object. Here, we manually modify it to our message in such a case.
-PHP_METHOD(Message, __construct) {
-  zend_class_entry* ce = Z_OBJCE_P(getThis());
-  if (EXPECTED(class_added(ce))) {
-    MessageHeader* intern = UNBOX(MessageHeader, getThis());
-    custom_data_init(ce, intern PHP_PROTO_TSRMLS_CC);
-  }
-}
-
-PHP_METHOD(Message, clear) {
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-  Descriptor* desc = msg->descriptor;
-  zend_class_entry* ce = desc->klass;
-
-  zend_object_std_dtor(&msg->std TSRMLS_CC);
-  object_properties_init(&msg->std, ce);
-
-  layout_init(desc->layout, message_data(msg), &msg->std TSRMLS_CC);
-}
-
-PHP_METHOD(Message, mergeFrom) {
-  zval* value;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &value,
-                            message_type) == FAILURE) {
-    return;
-  }
-
-  MessageHeader* from = UNBOX(MessageHeader, value);
-  MessageHeader* to = UNBOX(MessageHeader, getThis());
-
-  if(from->descriptor != to->descriptor) {
-    zend_error(E_USER_ERROR, "Cannot merge messages with different class.");
-    return;
-  }
-
-  layout_merge(from->descriptor->layout, from, to TSRMLS_CC);
-}
-
-PHP_METHOD(Message, readOneof) {
-  PHP_PROTO_LONG index;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
-      FAILURE) {
-    return;
-  }
-
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-
-  const upb_fielddef* field = upb_msgdef_itof(msg->descriptor->msgdef, index);
-
-  // Unlike singular fields, oneof fields share cached property. So we cannot
-  // let lay_get modify the cached property. Instead, we pass in the return
-  // value directly.
-  layout_get(msg->descriptor->layout, message_data(msg), field,
-             ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
-}
-
-PHP_METHOD(Message, writeOneof) {
-  PHP_PROTO_LONG index;
-  zval* value;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &index, &value) ==
-      FAILURE) {
-    return;
-  }
-
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-
-  const upb_fielddef* field = upb_msgdef_itof(msg->descriptor->msgdef, index);
-
-  layout_set(msg->descriptor->layout, msg, field, value TSRMLS_CC);
-}
-
-PHP_METHOD(Message, whichOneof) {
-  char* oneof_name;
-  PHP_PROTO_SIZE length;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &oneof_name,
-                            &length) == FAILURE) {
-    return;
-  }
-
-  MessageHeader* msg = UNBOX(MessageHeader, getThis());
-
-  const upb_oneofdef* oneof =
-      upb_msgdef_ntoo(msg->descriptor->msgdef, oneof_name, length);
-  const char* oneof_case_name = layout_get_oneof_case(
-      msg->descriptor->layout, message_data(msg), oneof TSRMLS_CC);
-  PHP_PROTO_RETURN_STRING(oneof_case_name, 1);
-}
-
-// -----------------------------------------------------------------------------
-// Well Known Types Support
-// -----------------------------------------------------------------------------
-
-#define PHP_PROTO_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD,       \
-                                  LOWER_FIELD)                                 \
-  PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) {                                  \
-    zval member;                                                               \
-    PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1);                            \
-    PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type);                            \
-    zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \
-    PHP_PROTO_FAKE_SCOPE_END;                                                  \
-    zval_dtor(&member);                                                        \
-    PHP_PROTO_RETVAL_ZVAL(value);                                              \
-  }                                                                            \
-  PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) {                                  \
-    zval* value = NULL;                                                        \
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) ==       \
-        FAILURE) {                                                             \
-      return;                                                                  \
-    }                                                                          \
-    zval member;                                                               \
-    PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1);                            \
-    message_set_property_internal(getThis(), &member, value TSRMLS_CC);        \
-    zval_dtor(&member);                                                        \
-    PHP_PROTO_RETVAL_ZVAL(getThis());                                          \
-  }
-
-#define PHP_PROTO_ONEOF_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
-                                        LOWER_FIELD)                           \
-  PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) {                                  \
-    zval member;                                                               \
-    PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1);                            \
-    PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type);                            \
-    message_get_oneof_property_internal(getThis(), &member,                    \
-                                        return_value TSRMLS_CC);               \
-    PHP_PROTO_FAKE_SCOPE_END;                                                  \
-    zval_dtor(&member);                                                        \
-  }                                                                            \
-  PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) {                                  \
-    zval* value = NULL;                                                        \
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) ==       \
-        FAILURE) {                                                             \
-      return;                                                                  \
-    }                                                                          \
-    zval member;                                                               \
-    PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1);                            \
-    message_set_property_internal(getThis(), &member, value TSRMLS_CC);        \
-    zval_dtor(&member);                                                        \
-    PHP_PROTO_RETVAL_ZVAL(getThis());                                          \
-  }
-
-#define PHP_PROTO_ONEOF_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
-                                  LOWER_FIELD)                           \
-  PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) {                            \
-    MessageHeader* msg = UNBOX(MessageHeader, getThis());                \
-    PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type);                      \
-    const upb_oneofdef* oneof = upb_msgdef_ntoo(                         \
-        msg->descriptor->msgdef, LOWER_FIELD, strlen(LOWER_FIELD));      \
-    const char* oneof_case_name = layout_get_oneof_case(                 \
-        msg->descriptor->layout, message_data(msg), oneof TSRMLS_CC);    \
-    PHP_PROTO_FAKE_SCOPE_END;                                            \
-    PHP_PROTO_RETURN_STRING(oneof_case_name, 1);                         \
-  }
-
-// Forward declare file init functions
-static void init_file_any(TSRMLS_D);
-static void init_file_api(TSRMLS_D);
-static void init_file_duration(TSRMLS_D);
-static void init_file_field_mask(TSRMLS_D);
-static void init_file_empty(TSRMLS_D);
-static void init_file_source_context(TSRMLS_D);
-static void init_file_struct(TSRMLS_D);
-static void init_file_timestamp(TSRMLS_D);
-static void init_file_type(TSRMLS_D);
-static void init_file_wrappers(TSRMLS_D);
-
-// Define file init functions
-static void init_file_any(TSRMLS_D) {
-  if (is_inited_file_any) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0acd010a19676f6f676c652f70726f746f6275662f616e792e70726f746f"
-      "120f676f6f676c652e70726f746f62756622260a03416e7912100a087479"
-      "70655f75726c180120012809120d0a0576616c756518022001280c426f0a"
-      "13636f6d2e676f6f676c652e70726f746f6275664208416e7950726f746f"
-      "50015a256769746875622e636f6d2f676f6c616e672f70726f746f627566"
-      "2f7074797065732f616e79a20203475042aa021e476f6f676c652e50726f"
-      "746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_any = true;
-}
-
-static void init_file_api(TSRMLS_D) {
-  if (is_inited_file_api) return;
-  init_file_source_context(TSRMLS_C);
-  init_file_type(TSRMLS_C);
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0aee050a19676f6f676c652f70726f746f6275662f6170692e70726f746f"
-      "120f676f6f676c652e70726f746f6275661a24676f6f676c652f70726f74"
-      "6f6275662f736f757263655f636f6e746578742e70726f746f1a1a676f6f"
-      "676c652f70726f746f6275662f747970652e70726f746f2281020a034170"
-      "69120c0a046e616d6518012001280912280a076d6574686f647318022003"
-      "280b32172e676f6f676c652e70726f746f6275662e4d6574686f6412280a"
-      "076f7074696f6e7318032003280b32172e676f6f676c652e70726f746f62"
-      "75662e4f7074696f6e120f0a0776657273696f6e18042001280912360a0e"
-      "736f757263655f636f6e7465787418052001280b321e2e676f6f676c652e"
-      "70726f746f6275662e536f75726365436f6e7465787412260a066d697869"
-      "6e7318062003280b32162e676f6f676c652e70726f746f6275662e4d6978"
-      "696e12270a0673796e74617818072001280e32172e676f6f676c652e7072"
-      "6f746f6275662e53796e74617822d5010a064d6574686f64120c0a046e61"
-      "6d6518012001280912180a10726571756573745f747970655f75726c1802"
-      "2001280912190a11726571756573745f73747265616d696e671803200128"
-      "0812190a11726573706f6e73655f747970655f75726c180420012809121a"
-      "0a12726573706f6e73655f73747265616d696e6718052001280812280a07"
-      "6f7074696f6e7318062003280b32172e676f6f676c652e70726f746f6275"
-      "662e4f7074696f6e12270a0673796e74617818072001280e32172e676f6f"
-      "676c652e70726f746f6275662e53796e74617822230a054d6978696e120c"
-      "0a046e616d65180120012809120c0a04726f6f7418022001280942750a13"
-      "636f6d2e676f6f676c652e70726f746f627566420841706950726f746f50"
-      "015a2b676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f"
-      "70726f746f6275662f6170693b617069a20203475042aa021e476f6f676c"
-      "652e50726f746f6275662e57656c6c4b6e6f776e5479706573620670726f"
-      "746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_api = true;
-}
-
-static void init_file_duration(TSRMLS_D) {
-  if (is_inited_file_duration) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0ae3010a1e676f6f676c652f70726f746f6275662f6475726174696f6e2e"
-      "70726f746f120f676f6f676c652e70726f746f627566222a0a0844757261"
-      "74696f6e120f0a077365636f6e6473180120012803120d0a056e616e6f73"
-      "180220012805427c0a13636f6d2e676f6f676c652e70726f746f62756642"
-      "0d4475726174696f6e50726f746f50015a2a6769746875622e636f6d2f67"
-      "6f6c616e672f70726f746f6275662f7074797065732f6475726174696f6e"
-      "f80101a20203475042aa021e476f6f676c652e50726f746f6275662e5765"
-      "6c6c4b6e6f776e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_duration = true;
-}
-
-static void init_file_field_mask(TSRMLS_D) {
-  if (is_inited_file_field_mask) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0ae3010a20676f6f676c652f70726f746f6275662f6669656c645f6d6173"
-      "6b2e70726f746f120f676f6f676c652e70726f746f627566221a0a094669"
-      "656c644d61736b120d0a0570617468731801200328094289010a13636f6d"
-      "2e676f6f676c652e70726f746f627566420e4669656c644d61736b50726f"
-      "746f50015a39676f6f676c652e676f6c616e672e6f72672f67656e70726f"
-      "746f2f70726f746f6275662f6669656c645f6d61736b3b6669656c645f6d"
-      "61736ba20203475042aa021e476f6f676c652e50726f746f6275662e5765"
-      "6c6c4b6e6f776e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_field_mask = true;
-}
-
-static void init_file_empty(TSRMLS_D) {
-  if (is_inited_file_empty) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0ab7010a1b676f6f676c652f70726f746f6275662f656d7074792e70726f"
-      "746f120f676f6f676c652e70726f746f62756622070a05456d7074794276"
-      "0a13636f6d2e676f6f676c652e70726f746f627566420a456d7074795072"
-      "6f746f50015a276769746875622e636f6d2f676f6c616e672f70726f746f"
-      "6275662f7074797065732f656d707479f80101a20203475042aa021e476f"
-      "6f676c652e50726f746f6275662e57656c6c4b6e6f776e54797065736206"
-      "70726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_empty = true;
-}
-
-static void init_file_source_context(TSRMLS_D) {
-  if (is_inited_file_source_context) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0afb010a24676f6f676c652f70726f746f6275662f736f757263655f636f"
-      "6e746578742e70726f746f120f676f6f676c652e70726f746f6275662222"
-      "0a0d536f75726365436f6e7465787412110a0966696c655f6e616d651801"
-      "200128094295010a13636f6d2e676f6f676c652e70726f746f6275664212"
-      "536f75726365436f6e7465787450726f746f50015a41676f6f676c652e67"
-      "6f6c616e672e6f72672f67656e70726f746f2f70726f746f6275662f736f"
-      "757263655f636f6e746578743b736f757263655f636f6e74657874a20203"
-      "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77"
-      "6e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_source_context = true;
-}
-
-static void init_file_struct(TSRMLS_D) {
-  if (is_inited_file_struct) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0a81050a1c676f6f676c652f70726f746f6275662f7374727563742e7072"
-      "6f746f120f676f6f676c652e70726f746f6275662284010a065374727563"
-      "7412330a066669656c647318012003280b32232e676f6f676c652e70726f"
-      "746f6275662e5374727563742e4669656c6473456e7472791a450a0b4669"
-      "656c6473456e747279120b0a036b657918012001280912250a0576616c75"
-      "6518022001280b32162e676f6f676c652e70726f746f6275662e56616c75"
-      "653a02380122ea010a0556616c756512300a0a6e756c6c5f76616c756518"
-      "012001280e321a2e676f6f676c652e70726f746f6275662e4e756c6c5661"
-      "6c7565480012160a0c6e756d6265725f76616c7565180220012801480012"
-      "160a0c737472696e675f76616c7565180320012809480012140a0a626f6f"
-      "6c5f76616c75651804200128084800122f0a0c7374727563745f76616c75"
-      "6518052001280b32172e676f6f676c652e70726f746f6275662e53747275"
-      "6374480012300a0a6c6973745f76616c756518062001280b321a2e676f6f"
-      "676c652e70726f746f6275662e4c69737456616c7565480042060a046b69"
-      "6e6422330a094c69737456616c756512260a0676616c7565731801200328"
-      "0b32162e676f6f676c652e70726f746f6275662e56616c75652a1b0a094e"
-      "756c6c56616c7565120e0a0a4e554c4c5f56414c554510004281010a1363"
-      "6f6d2e676f6f676c652e70726f746f627566420b53747275637450726f74"
-      "6f50015a316769746875622e636f6d2f676f6c616e672f70726f746f6275"
-      "662f7074797065732f7374727563743b7374727563747062f80101a20203"
-      "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77"
-      "6e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_struct = true;
-}
-
-static void init_file_timestamp(TSRMLS_D) {
-  if (is_inited_file_timestamp) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0ae7010a1f676f6f676c652f70726f746f6275662f74696d657374616d70"
-      "2e70726f746f120f676f6f676c652e70726f746f627566222b0a0954696d"
-      "657374616d70120f0a077365636f6e6473180120012803120d0a056e616e"
-      "6f73180220012805427e0a13636f6d2e676f6f676c652e70726f746f6275"
-      "66420e54696d657374616d7050726f746f50015a2b6769746875622e636f"
-      "6d2f676f6c616e672f70726f746f6275662f7074797065732f74696d6573"
-      "74616d70f80101a20203475042aa021e476f6f676c652e50726f746f6275"
-      "662e57656c6c4b6e6f776e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_timestamp = true;
-}
-
-static void init_file_type(TSRMLS_D) {
-  if (is_inited_file_type) return;
-  init_file_any(TSRMLS_C);
-  init_file_source_context(TSRMLS_C);
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0aba0c0a1a676f6f676c652f70726f746f6275662f747970652e70726f74"
-      "6f120f676f6f676c652e70726f746f6275661a19676f6f676c652f70726f"
-      "746f6275662f616e792e70726f746f1a24676f6f676c652f70726f746f62"
-      "75662f736f757263655f636f6e746578742e70726f746f22d7010a045479"
-      "7065120c0a046e616d6518012001280912260a066669656c647318022003"
-      "280b32162e676f6f676c652e70726f746f6275662e4669656c64120e0a06"
-      "6f6e656f667318032003280912280a076f7074696f6e7318042003280b32"
-      "172e676f6f676c652e70726f746f6275662e4f7074696f6e12360a0e736f"
-      "757263655f636f6e7465787418052001280b321e2e676f6f676c652e7072"
-      "6f746f6275662e536f75726365436f6e7465787412270a0673796e746178"
-      "18062001280e32172e676f6f676c652e70726f746f6275662e53796e7461"
-      "7822d5050a054669656c6412290a046b696e6418012001280e321b2e676f"
-      "6f676c652e70726f746f6275662e4669656c642e4b696e6412370a0b6361"
-      "7264696e616c69747918022001280e32222e676f6f676c652e70726f746f"
-      "6275662e4669656c642e43617264696e616c697479120e0a066e756d6265"
-      "72180320012805120c0a046e616d6518042001280912100a08747970655f"
-      "75726c18062001280912130a0b6f6e656f665f696e646578180720012805"
-      "120e0a067061636b656418082001280812280a076f7074696f6e73180920"
-      "03280b32172e676f6f676c652e70726f746f6275662e4f7074696f6e1211"
-      "0a096a736f6e5f6e616d65180a2001280912150a0d64656661756c745f76"
-      "616c7565180b2001280922c8020a044b696e6412100a0c545950455f554e"
-      "4b4e4f574e1000120f0a0b545950455f444f55424c451001120e0a0a5459"
-      "50455f464c4f41541002120e0a0a545950455f494e5436341003120f0a0b"
-      "545950455f55494e5436341004120e0a0a545950455f494e543332100512"
-      "100a0c545950455f46495845443634100612100a0c545950455f46495845"
-      "4433321007120d0a09545950455f424f4f4c1008120f0a0b545950455f53"
-      "5452494e471009120e0a0a545950455f47524f5550100a12100a0c545950"
-      "455f4d455353414745100b120e0a0a545950455f4259544553100c120f0a"
-      "0b545950455f55494e543332100d120d0a09545950455f454e554d100e12"
-      "110a0d545950455f5346495845443332100f12110a0d545950455f534649"
-      "58454436341010120f0a0b545950455f53494e5433321011120f0a0b5459"
-      "50455f53494e543634101222740a0b43617264696e616c69747912170a13"
-      "43415244494e414c4954595f554e4b4e4f574e100012180a144341524449"
-      "4e414c4954595f4f5054494f4e414c100112180a1443415244494e414c49"
-      "54595f5245515549524544100212180a1443415244494e414c4954595f52"
-      "45504541544544100322ce010a04456e756d120c0a046e616d6518012001"
-      "2809122d0a09656e756d76616c756518022003280b321a2e676f6f676c65"
-      "2e70726f746f6275662e456e756d56616c756512280a076f7074696f6e73"
-      "18032003280b32172e676f6f676c652e70726f746f6275662e4f7074696f"
-      "6e12360a0e736f757263655f636f6e7465787418042001280b321e2e676f"
-      "6f676c652e70726f746f6275662e536f75726365436f6e7465787412270a"
-      "0673796e74617818052001280e32172e676f6f676c652e70726f746f6275"
-      "662e53796e74617822530a09456e756d56616c7565120c0a046e616d6518"
-      "0120012809120e0a066e756d62657218022001280512280a076f7074696f"
-      "6e7318032003280b32172e676f6f676c652e70726f746f6275662e4f7074"
-      "696f6e223b0a064f7074696f6e120c0a046e616d6518012001280912230a"
-      "0576616c756518022001280b32142e676f6f676c652e70726f746f627566"
-      "2e416e792a2e0a0653796e74617812110a0d53594e5441585f50524f544f"
-      "32100012110a0d53594e5441585f50524f544f331001427d0a13636f6d2e"
-      "676f6f676c652e70726f746f62756642095479706550726f746f50015a2f"
-      "676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f70726f"
-      "746f6275662f70747970653b7074797065f80101a20203475042aa021e47"
-      "6f6f676c652e50726f746f6275662e57656c6c4b6e6f776e547970657362"
-      "0670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_type = true;
-}
-
-static void init_file_wrappers(TSRMLS_D) {
-  if (is_inited_file_wrappers) return;
-  init_generated_pool_once(TSRMLS_C);
-  const char* generated_file =
-      "0abf030a1e676f6f676c652f70726f746f6275662f77726170706572732e"
-      "70726f746f120f676f6f676c652e70726f746f627566221c0a0b446f7562"
-      "6c6556616c7565120d0a0576616c7565180120012801221b0a0a466c6f61"
-      "7456616c7565120d0a0576616c7565180120012802221b0a0a496e743634"
-      "56616c7565120d0a0576616c7565180120012803221c0a0b55496e743634"
-      "56616c7565120d0a0576616c7565180120012804221b0a0a496e74333256"
-      "616c7565120d0a0576616c7565180120012805221c0a0b55496e74333256"
-      "616c7565120d0a0576616c756518012001280d221a0a09426f6f6c56616c"
-      "7565120d0a0576616c7565180120012808221c0a0b537472696e6756616c"
-      "7565120d0a0576616c7565180120012809221b0a0a427974657356616c75"
-      "65120d0a0576616c756518012001280c427c0a13636f6d2e676f6f676c65"
-      "2e70726f746f627566420d577261707065727350726f746f50015a2a6769"
-      "746875622e636f6d2f676f6c616e672f70726f746f6275662f7074797065"
-      "732f7772617070657273f80101a20203475042aa021e476f6f676c652e50"
-      "726f746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33";
-  char* binary;
-  int binary_len;
-  hex_to_binary(generated_file, &binary, &binary_len);
-  internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
-  FREE(binary);
-  is_inited_file_wrappers = true;
-}
-
-// -----------------------------------------------------------------------------
-// Define enum
-// -----------------------------------------------------------------------------
-
-// -----------------------------------------------------------------------------
-// Field_Cardinality
-// -----------------------------------------------------------------------------
-
-static zend_function_entry field_cardinality_methods[] = {
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* field_cardinality_type;
-
-// Init class entry.
-PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field_Cardinality",
-                                Field_Cardinality, field_cardinality)
-  zend_declare_class_constant_long(field_cardinality_type,
-                                   "CARDINALITY_UNKNOWN", 19, 0 TSRMLS_CC);
-  zend_declare_class_constant_long(field_cardinality_type,
-                                   "CARDINALITY_OPTIONAL", 20, 1 TSRMLS_CC);
-  zend_declare_class_constant_long(field_cardinality_type,
-                                   "CARDINALITY_REQUIRED", 20, 2 TSRMLS_CC);
-  zend_declare_class_constant_long(field_cardinality_type,
-                                   "CARDINALITY_REPEATED", 20, 3 TSRMLS_CC);
-PHP_PROTO_INIT_ENUMCLASS_END
-
-// -----------------------------------------------------------------------------
-// Field_Kind
-// -----------------------------------------------------------------------------
-
-static zend_function_entry field_kind_methods[] = {
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* field_kind_type;
-
-// Init class entry.
-PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field_Kind",
-                                Field_Kind, field_kind)
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_UNKNOWN", 12, 0 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_DOUBLE", 11, 1 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_FLOAT", 10, 2 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_INT64", 10, 3 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_UINT64", 11, 4 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_INT32", 10, 5 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_FIXED64", 12, 6 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_FIXED32", 12, 7 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_BOOL", 9, 8 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_STRING", 11, 9 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_GROUP", 10, 10 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_MESSAGE", 12, 11 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_BYTES", 10, 12 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_UINT32", 11, 13 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_ENUM", 9, 14 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_SFIXED32", 13, 15 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_SFIXED64", 13, 16 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_SINT32", 11, 17 TSRMLS_CC);
-  zend_declare_class_constant_long(field_kind_type,
-                                   "TYPE_SINT64", 11, 18 TSRMLS_CC);
-PHP_PROTO_INIT_ENUMCLASS_END
-
-// -----------------------------------------------------------------------------
-// NullValue
-// -----------------------------------------------------------------------------
-
-static zend_function_entry null_value_methods[] = {
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* null_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\NullValue",
-                                NullValue, null_value)
-  zend_declare_class_constant_long(null_value_type,
-                                   "NULL_VALUE", 10, 0 TSRMLS_CC);
-PHP_PROTO_INIT_ENUMCLASS_END
-
-// -----------------------------------------------------------------------------
-// Syntax
-// -----------------------------------------------------------------------------
-
-static zend_function_entry syntax_methods[] = {
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* syntax_type;
-
-// Init class entry.
-PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Syntax",
-                                Syntax, syntax)
-  zend_declare_class_constant_long(syntax_type,
-                                   "SYNTAX_PROTO2", 13, 0 TSRMLS_CC);
-  zend_declare_class_constant_long(syntax_type,
-                                   "SYNTAX_PROTO3", 13, 1 TSRMLS_CC);
-PHP_PROTO_INIT_ENUMCLASS_END
-
-
-
-// -----------------------------------------------------------------------------
-// Define message
-// -----------------------------------------------------------------------------
-
-// -----------------------------------------------------------------------------
-// Any
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry any_methods[] = {
-  PHP_ME(Any, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, getTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, setTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, setValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, pack,     NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, unpack,   NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Any, is,       NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* any_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Any", Any, any)
-  zend_class_implements(any_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_string(any_type, "type_url", strlen("type_url"),
-                               "" ,ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_string(any_type, "value", strlen("value"),
-                               "" ,ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-static void hex_to_binary(const char* hex, char** binary, int* binary_len) {
-  int i;
-  int hex_len = strlen(hex);
-  *binary_len = hex_len / 2;
-  *binary = ALLOC_N(char, *binary_len);
-  for (i = 0; i < *binary_len; i++) {
-    char value = 0;
-    if (hex[i * 2] >= '0' && hex[i * 2] <= '9') {
-      value += (hex[i * 2] - '0') * 16;
-    } else {
-      value += (hex[i * 2] - 'a' + 10) * 16;
-    }
-    if (hex[i * 2 + 1] >= '0' && hex[i * 2 + 1] <= '9') {
-      value += hex[i * 2 + 1] - '0';
-    } else {
-      value += hex[i * 2 + 1] - 'a' + 10;
-    }
-    (*binary)[i] = value;
-  }
-}
-
-PHP_METHOD(Any, __construct) {
-  init_file_any(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(any_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Any, any, TypeUrl, "type_url")
-PHP_PROTO_FIELD_ACCESSORS(Any, any, Value,   "value")
-
-PHP_METHOD(Any, unpack) {
-  // Get type url.
-  zval type_url_member;
-  PHP_PROTO_ZVAL_STRING(&type_url_member, "type_url", 1);
-  PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
-  zval* type_url_php = php_proto_message_read_property(
-      getThis(), &type_url_member PHP_PROTO_TSRMLS_CC);
-  zval_dtor(&type_url_member);
-  PHP_PROTO_FAKE_SCOPE_END;
-
-  // Get fully-qualified name from type url.
-  size_t url_prefix_len = strlen(TYPE_URL_PREFIX);
-  const char* type_url = Z_STRVAL_P(type_url_php);
-  size_t type_url_len = Z_STRLEN_P(type_url_php);
-
-  if (url_prefix_len > type_url_len ||
-      strncmp(TYPE_URL_PREFIX, type_url, url_prefix_len) != 0) {
-    zend_throw_exception(
-        NULL, "Type url needs to be type.googleapis.com/fully-qulified",
-        0 TSRMLS_CC);
-    return;
-  }
-
-  const char* fully_qualified_name = type_url + url_prefix_len;
-  PHP_PROTO_HASHTABLE_VALUE desc_php = get_proto_obj(fully_qualified_name);
-  if (desc_php == NULL) {
-    zend_throw_exception(
-        NULL, "Specified message in any hasn't been added to descriptor pool",
-        0 TSRMLS_CC);
-    return;
-  }
-  Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, desc_php);
-  zend_class_entry* klass = desc->klass;
-  ZVAL_OBJ(return_value, klass->create_object(klass TSRMLS_CC));
-  MessageHeader* msg = UNBOX(MessageHeader, return_value);
-  custom_data_init(klass, msg PHP_PROTO_TSRMLS_CC);
-
-  // Get value.
-  zval value_member;
-  PHP_PROTO_ZVAL_STRING(&value_member, "value", 1);
-  PHP_PROTO_FAKE_SCOPE_RESTART(any_type);
-  zval* value = php_proto_message_read_property(
-      getThis(), &value_member PHP_PROTO_TSRMLS_CC);
-  zval_dtor(&value_member);
-  PHP_PROTO_FAKE_SCOPE_END;
-
-  merge_from_string(Z_STRVAL_P(value), Z_STRLEN_P(value), desc, msg);
-}
-
-PHP_METHOD(Any, pack) {
-  zval* val;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &val) ==
-      FAILURE) {
-    return;
-  }
-
-  if (!instanceof_function(Z_OBJCE_P(val), message_type TSRMLS_CC)) {
-    zend_error(E_USER_ERROR, "Given value is not an instance of Message.");
-    return;
-  }
-
-  // Set value by serialized data.
-  zval data;
-  serialize_to_string(val, &data TSRMLS_CC);
-
-  zval member;
-  PHP_PROTO_ZVAL_STRING(&member, "value", 1);
-
-  PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
-  message_handlers->write_property(getThis(), &member, &data,
-                                   NULL PHP_PROTO_TSRMLS_CC);
-  zval_dtor(&data);
-  zval_dtor(&member);
-  PHP_PROTO_FAKE_SCOPE_END;
-
-  // Set type url.
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(val)));
-  const char* fully_qualified_name = upb_msgdef_fullname(desc->msgdef);
-  size_t type_url_len =
-      strlen(TYPE_URL_PREFIX) + strlen(fully_qualified_name) + 1;
-  char* type_url = ALLOC_N(char, type_url_len);
-  sprintf(type_url, "%s%s", TYPE_URL_PREFIX, fully_qualified_name);
-  zval type_url_php;
-  PHP_PROTO_ZVAL_STRING(&type_url_php, type_url, 1);
-  PHP_PROTO_ZVAL_STRING(&member, "type_url", 1);
-
-  PHP_PROTO_FAKE_SCOPE_RESTART(any_type);
-  message_handlers->write_property(getThis(), &member, &type_url_php,
-                                   NULL PHP_PROTO_TSRMLS_CC);
-  zval_dtor(&type_url_php);
-  zval_dtor(&member);
-  PHP_PROTO_FAKE_SCOPE_END;
-  FREE(type_url);
-}
-
-PHP_METHOD(Any, is) {
-  zend_class_entry *klass = NULL;
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "C", &klass) ==
-      FAILURE) {
-    return;
-  }
-
-  PHP_PROTO_HASHTABLE_VALUE desc_php = get_ce_obj(klass);
-  if (desc_php == NULL) {
-    RETURN_BOOL(false);
-  }
-
-  // Create corresponded type url.
-  Descriptor* desc =
-      UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(klass));
-  const char* fully_qualified_name = upb_msgdef_fullname(desc->msgdef);
-  size_t type_url_len =
-      strlen(TYPE_URL_PREFIX) + strlen(fully_qualified_name) + 1;
-  char* type_url = ALLOC_N(char, type_url_len);
-  sprintf(type_url, "%s%s", TYPE_URL_PREFIX, fully_qualified_name);
-
-  // Fetch stored type url.
-  zval member;
-  PHP_PROTO_ZVAL_STRING(&member, "type_url", 1);
-  PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
-  zval* value =
-      php_proto_message_read_property(getThis(), &member PHP_PROTO_TSRMLS_CC);
-  zval_dtor(&member);
-  PHP_PROTO_FAKE_SCOPE_END;
-
-  // Compare two type url.
-  bool is = strcmp(type_url, Z_STRVAL_P(value)) == 0;
-  FREE(type_url);
-
-  RETURN_BOOL(is);
-}
-
-// -----------------------------------------------------------------------------
-// Duration
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry duration_methods[] = {
-  PHP_ME(Duration, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Duration, getSeconds, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Duration, setSeconds, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Duration, getNanos, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Duration, setNanos, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* duration_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Duration",
-                                 Duration, duration)
-  zend_class_implements(duration_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_long(duration_type, "seconds", strlen("seconds"),
-                             0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_long(duration_type, "nanos", strlen("nanos"),
-                             0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Duration, __construct) {
-  init_file_duration(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(duration_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Duration, duration, Seconds, "seconds")
-PHP_PROTO_FIELD_ACCESSORS(Duration, duration, Nanos,   "nanos")
-
-// -----------------------------------------------------------------------------
-// Timestamp
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry timestamp_methods[] = {
-  PHP_ME(Timestamp, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Timestamp, fromDateTime, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Timestamp, toDateTime, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Timestamp, getSeconds, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Timestamp, setSeconds, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Timestamp, getNanos, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Timestamp, setNanos, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* timestamp_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Timestamp",
-                                 Timestamp, timestamp)
-  zend_class_implements(timestamp_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_long(timestamp_type, "seconds", strlen("seconds"),
-                             0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_long(timestamp_type, "nanos", strlen("nanos"),
-                             0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Timestamp, __construct) {
-  init_file_timestamp(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(timestamp_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds")
-PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos,   "nanos")
-
-PHP_METHOD(Timestamp, fromDateTime) {
-  zval* datetime;
-  zval member;
-
-  PHP_PROTO_CE_DECLARE date_interface_ce;
-  if (php_proto_zend_lookup_class("\\DatetimeInterface", 18,
-                                  &date_interface_ce) == FAILURE) {
-    zend_error(E_ERROR, "Make sure date extension is enabled.");
-    return;
-  }
-
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime,
-                            PHP_PROTO_CE_UNREF(date_interface_ce)) == FAILURE) {
-    zend_error(E_USER_ERROR, "Expect DatetimeInterface.");
-    return;
-  }
-
-  // Get timestamp from Datetime object.
-  zval retval;
-  zval function_name;
-  int64_t timestamp;
-
-#if PHP_MAJOR_VERSION < 7
-  INIT_ZVAL(retval);
-  INIT_ZVAL(function_name);
-#endif
-
-  PHP_PROTO_ZVAL_STRING(&function_name, "date_timestamp_get", 1);
-
-  if (call_user_function(EG(function_table), NULL, &function_name, &retval, 1,
-          ZVAL_PTR_TO_CACHED_PTR(datetime) TSRMLS_CC) == FAILURE) {
-    zend_error(E_ERROR, "Cannot get timestamp from DateTime.");
-    return;
-  }
-
-  protobuf_convert_to_int64(&retval, &timestamp);
-
-  zval_dtor(&retval);
-  zval_dtor(&function_name);
-
-  // Set seconds
-  MessageHeader* self = UNBOX(MessageHeader, getThis());
-  const upb_fielddef* field =
-      upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
-  void* storage = message_data(self);
-  void* memory = slot_memory(self->descriptor->layout, storage, field);
-  *(int64_t*)memory = timestamp;
-
-  // Set nanos
-  field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
-  storage = message_data(self);
-  memory = slot_memory(self->descriptor->layout, storage, field);
-  *(int32_t*)memory = 0;
-
-  RETURN_NULL();
-}
-
-PHP_METHOD(Timestamp, toDateTime) {
-  // Get seconds
-  MessageHeader* self = UNBOX(MessageHeader, getThis());
-  const upb_fielddef* field =
-      upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
-  void* storage = message_data(self);
-  void* memory = slot_memory(self->descriptor->layout, storage, field);
-  int64_t seconds = *(int64_t*)memory;
-
-  // Get nanos
-  field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
-  memory = slot_memory(self->descriptor->layout, storage, field);
-  int32_t nanos = *(int32_t*)memory;
-
-  // Get formated time string.
-  char formated_time[50];
-  time_t raw_time = seconds;
-  struct tm *utc_time = gmtime(&raw_time);
-  strftime(formated_time, sizeof(formated_time), "%Y-%m-%dT%H:%M:%SUTC",
-           utc_time);
-
-  // Create Datetime object.
-  zval datetime;
-  zval formated_time_php;
-  zval function_name;
-  int64_t timestamp = 0;
-
-#if PHP_MAJOR_VERSION < 7
-  INIT_ZVAL(function_name);
-  INIT_ZVAL(formated_time_php);
-#endif
-
-  PHP_PROTO_ZVAL_STRING(&function_name, "date_create", 1);
-  PHP_PROTO_ZVAL_STRING(&formated_time_php, formated_time, 1);
-
-  CACHED_VALUE params[1] = {ZVAL_TO_CACHED_VALUE(formated_time_php)};
-
-  if (call_user_function(EG(function_table), NULL,
-                         &function_name, &datetime, 1,
-                         params TSRMLS_CC) == FAILURE) {
-    zend_error(E_ERROR, "Cannot create DateTime.");
-    return;
-  }
-
-  zval_dtor(&formated_time_php);
-  zval_dtor(&function_name);
-
-#if PHP_MAJOR_VERSION < 7
-  zval* datetime_ptr = &datetime;
-  PHP_PROTO_RETVAL_ZVAL(datetime_ptr);
-#else
-  ZVAL_OBJ(return_value, Z_OBJ(datetime));
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// Api
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry api_methods[] = {
-  PHP_ME(Api, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getMethods, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setMethods, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getVersion, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setVersion, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getSourceContext, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setSourceContext, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getMixins, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setMixins, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, getSyntax, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Api, setSyntax, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* api_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Api",
-                                 Api, api)
-  zend_class_implements(api_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(api_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(api_type, "methods", strlen("methods"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(api_type, "options", strlen("options"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(api_type, "version", strlen("version"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(api_type, "source_context", strlen("source_context"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(api_type, "mixins", strlen("mixins"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(api_type, "syntax", strlen("syntax"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Api, __construct) {
-  init_file_api(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(api_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Api, api, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Api, api, Methods, "methods")
-PHP_PROTO_FIELD_ACCESSORS(Api, api, Options, "options")
-PHP_PROTO_FIELD_ACCESSORS(Api, api, Version, "version")
-PHP_PROTO_FIELD_ACCESSORS(Api, api, SourceContext, "source_context")
-PHP_PROTO_FIELD_ACCESSORS(Api, api, Mixins, "mixins")
-PHP_PROTO_FIELD_ACCESSORS(Api, api, Syntax, "syntax")
-
-// -----------------------------------------------------------------------------
-// BoolValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry bool_value_methods[] = {
-  PHP_ME(BoolValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(BoolValue, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(BoolValue, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* bool_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\BoolValue",
-                                 BoolValue, bool_value)
-  zend_class_implements(bool_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(bool_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(BoolValue, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(bool_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(BoolValue, bool_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// BytesValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry bytes_value_methods[] = {
-  PHP_ME(BytesValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(BytesValue, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(BytesValue, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* bytes_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\BytesValue",
-                                 BytesValue, bytes_value)
-  zend_class_implements(bytes_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(bytes_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(BytesValue, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(bytes_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(BytesValue, bytes_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// DoubleValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry double_value_methods[] = {
-  PHP_ME(DoubleValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(DoubleValue, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(DoubleValue, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* double_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\DoubleValue",
-                                 DoubleValue, double_value)
-  zend_class_implements(double_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(double_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(DoubleValue, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(double_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(DoubleValue, double_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// Enum
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry enum_methods[] = {
-  PHP_ME(Enum, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, getEnumvalue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, setEnumvalue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, getOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, setOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, getSourceContext, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, setSourceContext, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, getSyntax, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Enum, setSyntax, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* enum_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Enum",
-                                 Enum, enum)
-  zend_class_implements(enum_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(enum_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(enum_type, "enumvalue", strlen("enumvalue"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(enum_type, "options", strlen("options"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(enum_type, "source_context", strlen("source_context"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(enum_type, "syntax", strlen("syntax"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Enum, __construct) {
-  init_file_type(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(enum_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Enumvalue, "enumvalue")
-PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Options, "options")
-PHP_PROTO_FIELD_ACCESSORS(Enum, enum, SourceContext, "source_context")
-PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Syntax, "syntax")
-
-// -----------------------------------------------------------------------------
-// EnumValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry enum_value_methods[] = {
-  PHP_ME(EnumValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValue, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValue, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValue, getNumber, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValue, setNumber, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValue, getOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(EnumValue, setOptions, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* enum_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\EnumValue",
-                                 EnumValue, enum_value)
-  zend_class_implements(enum_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(enum_value_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(enum_value_type, "number", strlen("number"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(enum_value_type, "options", strlen("options"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(EnumValue, __construct) {
-  init_file_type(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(enum_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Number, "number")
-PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Options, "options")
-
-// -----------------------------------------------------------------------------
-// FieldMask
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry field_mask_methods[] = {
-  PHP_ME(FieldMask, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldMask, getPaths, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FieldMask, setPaths, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* field_mask_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\FieldMask",
-                                 FieldMask, field_mask)
-  zend_class_implements(field_mask_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(field_mask_type, "paths", strlen("paths"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(FieldMask, __construct) {
-  init_file_field_mask(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(field_mask_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(FieldMask, field_mask, Paths, "paths")
-
-// -----------------------------------------------------------------------------
-// Field
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry field_methods[] = {
-  PHP_ME(Field, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getKind, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setKind, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getCardinality, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setCardinality, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getNumber, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setNumber, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getOneofIndex, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setOneofIndex, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getPacked, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setPacked, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getJsonName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setJsonName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, getDefaultValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Field, setDefaultValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* field_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Field",
-                                 Field, field)
-  zend_class_implements(field_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(field_type, "kind", strlen("kind"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "cardinality", strlen("cardinality"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "number", strlen("number"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "type_url", strlen("type_url"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "oneof_index", strlen("oneof_index"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "packed", strlen("packed"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "options", strlen("options"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "json_name", strlen("json_name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(field_type, "default_value", strlen("default_value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Field, __construct) {
-  init_file_type(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(field_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Field, field, Kind, "kind")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, Cardinality, "cardinality")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, Number, "number")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, TypeUrl, "type_url")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, OneofIndex, "oneof_index")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, Packed, "packed")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, Options, "options")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, JsonName, "json_name")
-PHP_PROTO_FIELD_ACCESSORS(Field, field, DefaultValue, "default_value")
-
-// -----------------------------------------------------------------------------
-// FloatValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry float_value_methods[] = {
-  PHP_ME(FloatValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FloatValue, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(FloatValue, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* float_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\FloatValue",
-                                 FloatValue, float_value)
-  zend_class_implements(float_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(float_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(FloatValue, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(float_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(FloatValue, float_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// GPBEmpty
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry empty_methods[] = {
-  PHP_ME(GPBEmpty, __construct, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* empty_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\GPBEmpty",
-                                 GPBEmpty, empty)
-  zend_class_implements(empty_type TSRMLS_CC, 1, message_type);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(GPBEmpty, __construct) {
-  init_file_empty(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(empty_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-
-// -----------------------------------------------------------------------------
-// Int32Value
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry int32_value_methods[] = {
-  PHP_ME(Int32Value, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Int32Value, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Int32Value, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* int32_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Int32Value",
-                                 Int32Value, int32_value)
-  zend_class_implements(int32_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(int32_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Int32Value, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(int32_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Int32Value, int32_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// Int64Value
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry int64_value_methods[] = {
-  PHP_ME(Int64Value, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Int64Value, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Int64Value, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* int64_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Int64Value",
-                                 Int64Value, int64_value)
-  zend_class_implements(int64_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(int64_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Int64Value, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(int64_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Int64Value, int64_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// ListValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry list_value_methods[] = {
-  PHP_ME(ListValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(ListValue, getValues, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(ListValue, setValues, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* list_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\ListValue",
-                                 ListValue, list_value)
-  zend_class_implements(list_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(list_value_type, "values", strlen("values"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(ListValue, __construct) {
-  init_file_struct(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(list_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(ListValue, list_value, Values, "values")
-
-// -----------------------------------------------------------------------------
-// Method
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry method_methods[] = {
-  PHP_ME(Method, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getRequestTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setRequestTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getRequestStreaming, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setRequestStreaming, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getResponseTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setResponseTypeUrl, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getResponseStreaming, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setResponseStreaming, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, getSyntax, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Method, setSyntax, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* method_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Method",
-                                 Method, method)
-  zend_class_implements(method_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(method_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(method_type, "request_type_url", strlen("request_type_url"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(method_type, "request_streaming", strlen("request_streaming"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(method_type, "response_type_url", strlen("response_type_url"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(method_type, "response_streaming", strlen("response_streaming"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(method_type, "options", strlen("options"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(method_type, "syntax", strlen("syntax"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Method, __construct) {
-  init_file_api(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(method_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Method, method, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Method, method, RequestTypeUrl, "request_type_url")
-PHP_PROTO_FIELD_ACCESSORS(Method, method, RequestStreaming, "request_streaming")
-PHP_PROTO_FIELD_ACCESSORS(Method, method, ResponseTypeUrl, "response_type_url")
-PHP_PROTO_FIELD_ACCESSORS(Method, method, ResponseStreaming, "response_streaming")
-PHP_PROTO_FIELD_ACCESSORS(Method, method, Options, "options")
-PHP_PROTO_FIELD_ACCESSORS(Method, method, Syntax, "syntax")
-
-// -----------------------------------------------------------------------------
-// Mixin
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry mixin_methods[] = {
-  PHP_ME(Mixin, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Mixin, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Mixin, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Mixin, getRoot, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Mixin, setRoot, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* mixin_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Mixin",
-                                 Mixin, mixin)
-  zend_class_implements(mixin_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(mixin_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(mixin_type, "root", strlen("root"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Mixin, __construct) {
-  init_file_api(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(mixin_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Mixin, mixin, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Mixin, mixin, Root, "root")
-
-// -----------------------------------------------------------------------------
-// Option
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry option_methods[] = {
-  PHP_ME(Option, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Option, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Option, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Option, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Option, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* option_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Option",
-                                 Option, option)
-  zend_class_implements(option_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(option_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(option_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Option, __construct) {
-  init_file_type(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(option_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Option, option, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Option, option, Value, "value")
-
-// -----------------------------------------------------------------------------
-// SourceContext
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry source_context_methods[] = {
-  PHP_ME(SourceContext, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(SourceContext, getFileName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(SourceContext, setFileName, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* source_context_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\SourceContext",
-                                 SourceContext, source_context)
-  zend_class_implements(source_context_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(source_context_type, "file_name", strlen("file_name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(SourceContext, __construct) {
-  init_file_source_context(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(source_context_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(SourceContext, source_context, FileName, "file_name")
-
-// -----------------------------------------------------------------------------
-// StringValue
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry string_value_methods[] = {
-  PHP_ME(StringValue, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(StringValue, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(StringValue, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* string_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\StringValue",
-                                 StringValue, string_value)
-  zend_class_implements(string_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(string_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(StringValue, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(string_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(StringValue, string_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// Struct
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry struct_methods[] = {
-  PHP_ME(Struct, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Struct, getFields, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Struct, setFields, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* struct_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Struct",
-                                 Struct, struct)
-  zend_class_implements(struct_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(struct_type, "fields", strlen("fields"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Struct, __construct) {
-  init_file_struct(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(struct_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Struct, struct, Fields, "fields")
-
-// -----------------------------------------------------------------------------
-// Type
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry type_methods[] = {
-  PHP_ME(Type, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, getName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, setName, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, getFields, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, setFields, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, getOneofs, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, setOneofs, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, getOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, setOptions, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, getSourceContext, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, setSourceContext, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, getSyntax, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Type, setSyntax, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* type_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Type",
-                                 Type, type)
-  zend_class_implements(type_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(type_type, "name", strlen("name"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(type_type, "fields", strlen("fields"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(type_type, "oneofs", strlen("oneofs"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(type_type, "options", strlen("options"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(type_type, "source_context", strlen("source_context"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-  zend_declare_property_null(type_type, "syntax", strlen("syntax"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Type, __construct) {
-  init_file_type(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(type_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(Type, type, Name, "name")
-PHP_PROTO_FIELD_ACCESSORS(Type, type, Fields, "fields")
-PHP_PROTO_FIELD_ACCESSORS(Type, type, Oneofs, "oneofs")
-PHP_PROTO_FIELD_ACCESSORS(Type, type, Options, "options")
-PHP_PROTO_FIELD_ACCESSORS(Type, type, SourceContext, "source_context")
-PHP_PROTO_FIELD_ACCESSORS(Type, type, Syntax, "syntax")
-
-// -----------------------------------------------------------------------------
-// UInt32Value
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry u_int32_value_methods[] = {
-  PHP_ME(UInt32Value, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(UInt32Value, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(UInt32Value, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* u_int32_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\UInt32Value",
-                                 UInt32Value, u_int32_value)
-  zend_class_implements(u_int32_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(u_int32_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(UInt32Value, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(u_int32_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(UInt32Value, u_int32_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// UInt64Value
-// -----------------------------------------------------------------------------
-
-static  zend_function_entry u_int64_value_methods[] = {
-  PHP_ME(UInt64Value, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(UInt64Value, getValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(UInt64Value, setValue, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* u_int64_value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\UInt64Value",
-                                 UInt64Value, u_int64_value)
-  zend_class_implements(u_int64_value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(u_int64_value_type, "value", strlen("value"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(UInt64Value, __construct) {
-  init_file_wrappers(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(u_int64_value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_FIELD_ACCESSORS(UInt64Value, u_int64_value, Value, "value")
-
-// -----------------------------------------------------------------------------
-// Value
-// -----------------------------------------------------------------------------
-
-static zend_function_entry value_methods[] = {
-  PHP_ME(Value, __construct, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getNullValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, setNullValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getNumberValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, setNumberValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getStringValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, setStringValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getBoolValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, setBoolValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getStructValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, setStructValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getListValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, setListValue, NULL, ZEND_ACC_PUBLIC)
-  PHP_ME(Value, getKind, NULL, ZEND_ACC_PUBLIC)
-  {NULL, NULL, NULL}
-};
-
-zend_class_entry* value_type;
-
-// Init class entry.
-PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Value",
-                                 Value, value)
-  zend_class_implements(value_type TSRMLS_CC, 1, message_type);
-  zend_declare_property_null(value_type, "kind", strlen("kind"),
-                             ZEND_ACC_PRIVATE TSRMLS_CC);
-PHP_PROTO_INIT_SUBMSGCLASS_END
-
-PHP_METHOD(Value, __construct) {
-  init_file_struct(TSRMLS_C);
-  MessageHeader* intern = UNBOX(MessageHeader, getThis());
-  custom_data_init(value_type, intern PHP_PROTO_TSRMLS_CC);
-}
-
-PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, NullValue, "null_value")
-PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, NumberValue, "number_value")
-PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, StringValue, "string_value")
-PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, BoolValue, "bool_value")
-PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, StructValue, "struct_value")
-PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, ListValue, "list_value")
-PHP_PROTO_ONEOF_ACCESSORS(Value, value, Kind, "kind")
-
-// -----------------------------------------------------------------------------
-// GPBMetadata files for well known types
-// -----------------------------------------------------------------------------
-
-#define DEFINE_GPBMETADATA_FILE(LOWERNAME, CAMELNAME, CLASSNAME)      \
-  zend_class_entry* gpb_metadata_##LOWERNAME##_type;                  \
-  static zend_function_entry gpb_metadata_##LOWERNAME##_methods[] = { \
-    PHP_ME(GPBMetadata_##CAMELNAME, initOnce, NULL,                   \
-           ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)                         \
-    ZEND_FE_END                                                       \
-  };                                                                  \
-  void gpb_metadata_##LOWERNAME##_init(TSRMLS_D) {                    \
-    zend_class_entry class_type;                                      \
-    INIT_CLASS_ENTRY(class_type, CLASSNAME,                           \
-                     gpb_metadata_##LOWERNAME##_methods);             \
-    gpb_metadata_##LOWERNAME##_type =                                 \
-        zend_register_internal_class(&class_type TSRMLS_CC);          \
-  }                                                                   \
-  PHP_METHOD(GPBMetadata_##CAMELNAME, initOnce) {                     \
-    init_file_##LOWERNAME(TSRMLS_C);                                  \
-  }
-
-DEFINE_GPBMETADATA_FILE(any, Any, "GPBMetadata\\Google\\Protobuf\\Any");
-DEFINE_GPBMETADATA_FILE(api, Api, "GPBMetadata\\Google\\Protobuf\\Api");
-DEFINE_GPBMETADATA_FILE(duration, Duration,
-                        "GPBMetadata\\Google\\Protobuf\\Duration");
-DEFINE_GPBMETADATA_FILE(field_mask, FieldMask,
-                        "GPBMetadata\\Google\\Protobuf\\FieldMask");
-DEFINE_GPBMETADATA_FILE(empty, Empty,
-                        "GPBMetadata\\Google\\Protobuf\\GPBEmpty");
-DEFINE_GPBMETADATA_FILE(source_context, SourceContext,
-                        "GPBMetadata\\Google\\Protobuf\\SourceContext");
-DEFINE_GPBMETADATA_FILE(struct, Struct,
-                        "GPBMetadata\\Google\\Protobuf\\Struct");
-DEFINE_GPBMETADATA_FILE(timestamp, Timestamp,
-                        "GPBMetadata\\Google\\Protobuf\\Timestamp");
-DEFINE_GPBMETADATA_FILE(type, Type, "GPBMetadata\\Google\\Protobuf\\Type");
-DEFINE_GPBMETADATA_FILE(wrappers, Wrappers,
-                        "GPBMetadata\\Google\\Protobuf\\Wrappers");
-
-#undef DEFINE_GPBMETADATA_FILE
diff --git a/php/ext/google/protobuf/package.xml b/php/ext/google/protobuf/package.xml
deleted file mode 100644
index 3a556ac..0000000
--- a/php/ext/google/protobuf/package.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.9.5" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
- <name>protobuf</name>
- <channel>pecl.php.net</channel>
- <summary>Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.</summary>
- <description>https://developers.google.com/protocol-buffers/</description>
- <lead>
-  <name>Bo Yang</name>
-  <user>stanleycheung</user>
-  <email>protobuf-opensource@google.com</email>
-  <active>yes</active>
- </lead>
- <date>2018-03-06</date>
- <time>11:02:07</time>
- <version>
-  <release>3.5.2</release>
-  <api>3.5.2</api>
- </version>
- <stability>
-  <release>stable</release>
-  <api>stable</api>
- </stability>
- <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
- <notes>
-GA release.
- </notes>
- <contents>
-  <dir baseinstalldir="/" name="/">
-    <file baseinstalldir="/" name="config.m4" role="src" />
-    <file baseinstalldir="/" name="array.c" role="src" />
-    <file baseinstalldir="/" name="def.c" role="src" />
-    <file baseinstalldir="/" name="encode_decode.c" role="src" />
-    <file baseinstalldir="/" name="map.c" role="src" />
-    <file baseinstalldir="/" name="message.c" role="src" />
-    <file baseinstalldir="/" name="protobuf.c" role="src" />
-    <file baseinstalldir="/" name="protobuf.h" role="src" />
-    <file baseinstalldir="/" name="storage.c" role="src" />
-    <file baseinstalldir="/" name="type_check.c" role="src" />
-    <file baseinstalldir="/" name="upb.c" role="src" />
-    <file baseinstalldir="/" name="upb.h" role="src" />
-    <file baseinstalldir="/" name="utf8.c" role="src" />
-    <file baseinstalldir="/" name="utf8.h" role="src" />
-    <file baseinstalldir="/" name="LICENSE" role="doc" />
-  </dir>
- </contents>
- <dependencies>
-  <required>
-   <php>
-    <min>5.5.9</min>
-   </php>
-   <pearinstaller>
-    <min>1.4.0</min>
-   </pearinstaller>
-  </required>
- </dependencies>
- <providesextension>protobuf</providesextension>
- <extsrcrelease />
- <changelog>
-  <release>
-   <version>
-    <release>3.1.0a1</release>
-    <api>3.1.0a1</api>
-   </version>
-   <stability>
-    <release>alpha</release>
-    <api>alpha</api>
-   </stability>
-   <date>2016-09-23</date>
-   <time>16:06:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-First alpha release
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.2.0a1</release>
-    <api>3.2.0a1</api>
-   </version>
-   <stability>
-    <release>alpha</release>
-    <api>alpha</api>
-   </stability>
-   <date>2017-01-13</date>
-   <time>16:06:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-Second alpha release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.3.0</release>
-    <api>3.3.0</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-04-28</date>
-   <time>16:06:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.3.1</release>
-    <api>3.3.0</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-05-08</date>
-   <time>15:33:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.3.2</release>
-    <api>3.3.0</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-06-21</date>
-   <time>15:33:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.4.0</release>
-    <api>3.4.0</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-08-16</date>
-   <time>15:33:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.4.1</release>
-    <api>3.4.1</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-09-14</date>
-   <time>11:02:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.5.0</release>
-    <api>3.5.0</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-11-15</date>
-   <time>11:02:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.5.0.1</release>
-    <api>3.5.0.1</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-12-06</date>
-   <time>11:02:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.5.1</release>
-    <api>3.5.1</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2017-12-11</date>
-   <time>11:02:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-GA release.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>3.5.2</release>
-    <api>3.5.2</api>
-   </version>
-   <stability>
-    <release>stable</release>
-    <api>stable</api>
-   </stability>
-   <date>2018-03-06</date>
-   <time>11:02:07</time>
-   <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
-   <notes>
-G  A release.
-   </notes>
-  </release>
- </changelog>
-</package>
diff --git a/php/ext/google/protobuf/protobuf.c b/php/ext/google/protobuf/protobuf.c
index da00302..b1ace8b 100644
--- a/php/ext/google/protobuf/protobuf.c
+++ b/php/ext/google/protobuf/protobuf.c
@@ -1,33 +1,3 @@
-// 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.
-
 #include "protobuf.h"
 
 #include <zend_hash.h>
@@ -35,187 +5,56 @@
 ZEND_DECLARE_MODULE_GLOBALS(protobuf)
 static PHP_GINIT_FUNCTION(protobuf);
 static PHP_GSHUTDOWN_FUNCTION(protobuf);
-static PHP_RINIT_FUNCTION(protobuf);
-static PHP_RSHUTDOWN_FUNCTION(protobuf);
-static PHP_MINIT_FUNCTION(protobuf);
-static PHP_MSHUTDOWN_FUNCTION(protobuf);
 
+// -----------------------------------------------------------------------------
 // Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
 // instances.
-static HashTable* upb_def_to_php_obj_map;
-// Global map from message/enum's php class entry to corresponding wrapper
-// Descriptor/EnumDescriptor instances.
-static HashTable* ce_to_php_obj_map;
-// Global map from message/enum's proto fully-qualified name to corresponding
-// wrapper Descriptor/EnumDescriptor instances.
-static HashTable* proto_to_php_obj_map;
-static HashTable* reserved_names;
-
-// -----------------------------------------------------------------------------
-// Global maps.
 // -----------------------------------------------------------------------------
 
-static void add_to_table(HashTable* t, const void* def, void* value) {
-  uint nIndex = (ulong)def & t->nTableMask;
+void add_def_obj(const void* def, zval* value) {
+  uint nIndex = (ulong)def & PROTOBUF_G(upb_def_to_php_obj_map).nTableMask;
 
   zval* pDest = NULL;
-  php_proto_zend_hash_index_update_mem(t, (zend_ulong)def, &value,
-                                       sizeof(zval*), (void**)&pDest);
+  Z_ADDREF_P(value);
+  zend_hash_index_update(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def,
+                         &value, sizeof(zval*), &pDest);
 }
 
-static void* get_from_table(const HashTable* t, const void* def) {
-  void** value;
-  if (php_proto_zend_hash_index_find_mem(t, (zend_ulong)def, (void**)&value) ==
-      FAILURE) {
+zval* get_def_obj(const void* def) {
+  zval** value;
+  if (zend_hash_index_find(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def,
+                           &value) == FAILURE) {
+    zend_error(E_ERROR, "PHP object not found for given definition.\n");
     return NULL;
   }
   return *value;
 }
 
-static bool exist_in_table(const HashTable* t, const void* def) {
-  void** value;
-  return (php_proto_zend_hash_index_find_mem(t, (zend_ulong)def,
-                                             (void**)&value) == SUCCESS);
-}
-
-static void add_to_list(HashTable* t, void* value) {
-  zval* pDest = NULL;
-  php_proto_zend_hash_next_index_insert_mem(t, &value, sizeof(void*),
-                                        (void**)&pDest);
-}
-
-static void add_to_strtable(HashTable* t, const char* key, int key_size,
-                            void* value) {
-  zval* pDest = NULL;
-  php_proto_zend_hash_update_mem(t, key, key_size, &value, sizeof(void*),
-                                 (void**)&pDest);
-}
-
-static void* get_from_strtable(const HashTable* t, const char* key, int key_size) {
-  void** value;
-  if (php_proto_zend_hash_find_mem(t, key, key_size, (void**)&value) ==
-      FAILURE) {
-    return NULL;
-  }
-  return *value;
-}
-
-void add_def_obj(const void* def, PHP_PROTO_HASHTABLE_VALUE value) {
-#if PHP_MAJOR_VERSION < 7
-  Z_ADDREF_P(value);
-#else
-  ++GC_REFCOUNT(value);
-#endif
-  add_to_table(upb_def_to_php_obj_map, def, value);
-}
-
-PHP_PROTO_HASHTABLE_VALUE get_def_obj(const void* def) {
-  return (PHP_PROTO_HASHTABLE_VALUE)get_from_table(upb_def_to_php_obj_map, def);
-}
-
-void add_ce_obj(const void* ce, PHP_PROTO_HASHTABLE_VALUE value) {
-#if PHP_MAJOR_VERSION < 7
-  Z_ADDREF_P(value);
-#else
-  ++GC_REFCOUNT(value);
-#endif
-  add_to_table(ce_to_php_obj_map, ce, value);
-}
-
-PHP_PROTO_HASHTABLE_VALUE get_ce_obj(const void* ce) {
-  return (PHP_PROTO_HASHTABLE_VALUE)get_from_table(ce_to_php_obj_map, ce);
-}
-
-bool class_added(const void* ce) {
-  return exist_in_table(ce_to_php_obj_map, ce);
-}
-
-void add_proto_obj(const char* proto, PHP_PROTO_HASHTABLE_VALUE value) {
-#if PHP_MAJOR_VERSION < 7
-  Z_ADDREF_P(value);
-#else
-  ++GC_REFCOUNT(value);
-#endif
-  add_to_strtable(proto_to_php_obj_map, proto, strlen(proto), value);
-}
-
-PHP_PROTO_HASHTABLE_VALUE get_proto_obj(const char* proto) {
-  return (PHP_PROTO_HASHTABLE_VALUE)get_from_strtable(proto_to_php_obj_map,
-                                                      proto, strlen(proto));
-}
-
-// -----------------------------------------------------------------------------
-// Well Known Types.
-// -----------------------------------------------------------------------------
-
-bool is_inited_file_any;
-bool is_inited_file_api;
-bool is_inited_file_duration;
-bool is_inited_file_field_mask;
-bool is_inited_file_empty;
-bool is_inited_file_source_context;
-bool is_inited_file_struct;
-bool is_inited_file_timestamp;
-bool is_inited_file_type;
-bool is_inited_file_wrappers;
-
-// -----------------------------------------------------------------------------
-// Reserved Name.
-// -----------------------------------------------------------------------------
-
-// Although we already have kReservedNames, we still add them to hash table to
-// speed up look up.
-const char *const kReservedNames[] = {
-    "abstract",   "and",        "array",        "as",           "break",
-    "callable",   "case",       "catch",        "class",        "clone",
-    "const",      "continue",   "declare",      "default",      "die",
-    "do",         "echo",       "else",         "elseif",       "empty",
-    "enddeclare", "endfor",     "endforeach",   "endif",        "endswitch",
-    "endwhile",   "eval",       "exit",         "extends",      "final",
-    "for",        "foreach",    "function",     "global",       "goto",
-    "if",         "implements", "include",      "include_once", "instanceof",
-    "insteadof",  "interface",  "isset",        "list",         "namespace",
-    "new",        "or",         "print",        "private",      "protected",
-    "public",     "require",    "require_once", "return",       "static",
-    "switch",     "throw",      "trait",        "try",          "unset",
-    "use",        "var",        "while",        "xor",          "int",
-    "float",      "bool",       "string",       "true",         "false",
-    "null",       "void",       "iterable"};
-const int kReservedNamesSize = 73;
-
-bool is_reserved_name(const char* name) {
-  void** value;
-  return (php_proto_zend_hash_find(reserved_names, name, strlen(name),
-                                   (void**)&value) == SUCCESS);
-}
-
 // -----------------------------------------------------------------------------
 // Utilities.
 // -----------------------------------------------------------------------------
 
+// define the function(s) we want to add
 zend_function_entry protobuf_functions[] = {
+  ZEND_FE(get_generated_pool, NULL)
   ZEND_FE_END
 };
 
-static const zend_module_dep protobuf_deps[] = {
-  ZEND_MOD_OPTIONAL("date")
-  ZEND_MOD_END
-};
-
+// "protobuf_functions" refers to the struct defined above
+// we'll be filling in more of this later: you can use this to specify
+// globals, php.ini info, startup and teardown functions, etc.
 zend_module_entry protobuf_module_entry = {
-  STANDARD_MODULE_HEADER_EX,
-  NULL,
-  protobuf_deps,
-  PHP_PROTOBUF_EXTNAME,     // extension name
-  protobuf_functions,       // function list
-  PHP_MINIT(protobuf),      // process startup
-  PHP_MSHUTDOWN(protobuf),  // process shutdown
-  PHP_RINIT(protobuf),      // request shutdown
-  PHP_RSHUTDOWN(protobuf),  // request shutdown
-  NULL,                 // extension info
+  STANDARD_MODULE_HEADER,
+  PHP_PROTOBUF_EXTNAME, // extension name
+  protobuf_functions,   // function list
+  PHP_MINIT(protobuf),  // process startup
+  NULL,  // process shutdown
+  NULL,  // request startup
+  NULL,  // request shutdown
+  NULL,  // extension info
   PHP_PROTOBUF_VERSION, // extension version
   PHP_MODULE_GLOBALS(protobuf),  // globals descriptor
-  PHP_GINIT(protobuf),  // globals ctor
+  PHP_GINIT(protobuf), // globals ctor
   PHP_GSHUTDOWN(protobuf),  // globals dtor
   NULL,  // post deactivate
   STANDARD_MODULE_PROPERTIES_EX
@@ -226,175 +65,25 @@
 
 // global variables
 static PHP_GINIT_FUNCTION(protobuf) {
+  protobuf_globals->generated_pool = NULL;
+  generated_pool = NULL;
+  protobuf_globals->message_handlers = NULL;
+  zend_hash_init(&protobuf_globals->upb_def_to_php_obj_map, 16, NULL,
+                 ZVAL_PTR_DTOR, 0);
 }
 
 static PHP_GSHUTDOWN_FUNCTION(protobuf) {
+  if (protobuf_globals->generated_pool != NULL) {
+    FREE_ZVAL(protobuf_globals->generated_pool);
+  }
+  if (protobuf_globals->message_handlers != NULL) {
+    FREE(protobuf_globals->message_handlers);
+  }
+  zend_hash_destroy(&protobuf_globals->upb_def_to_php_obj_map);
 }
 
-#if PHP_MAJOR_VERSION >= 7
-static void php_proto_hashtable_descriptor_release(zval* value) {
-  void* ptr = Z_PTR_P(value);
-  zend_object* object = *(zend_object**)ptr;
-  if(--GC_REFCOUNT(object) == 0) {
-    zend_objects_store_del(object);
-  }
-  efree(ptr);
-}
-#endif
-
-static PHP_RINIT_FUNCTION(protobuf) {
-  int i = 0;
-
-  ALLOC_HASHTABLE(upb_def_to_php_obj_map);
-  zend_hash_init(upb_def_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0);
-
-  ALLOC_HASHTABLE(ce_to_php_obj_map);
-  zend_hash_init(ce_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0);
-
-  ALLOC_HASHTABLE(proto_to_php_obj_map);
-  zend_hash_init(proto_to_php_obj_map, 16, NULL, HASHTABLE_VALUE_DTOR, 0);
-
-  ALLOC_HASHTABLE(reserved_names);
-  zend_hash_init(reserved_names, 16, NULL, NULL, 0);
-  for (i = 0; i < kReservedNamesSize; i++) {
-    php_proto_zend_hash_update(reserved_names, kReservedNames[i],
-                               strlen(kReservedNames[i]));
-  }
-
-  generated_pool = NULL;
-  generated_pool_php = NULL;
-  internal_generated_pool_php = NULL;
-
-  is_inited_file_any = false;
-  is_inited_file_api = false;
-  is_inited_file_duration = false;
-  is_inited_file_field_mask = false;
-  is_inited_file_empty = false;
-  is_inited_file_source_context = false;
-  is_inited_file_struct = false;
-  is_inited_file_timestamp = false;
-  is_inited_file_type = false;
-  is_inited_file_wrappers = false;
-
-  return 0;
-}
-
-static PHP_RSHUTDOWN_FUNCTION(protobuf) {
-  zend_hash_destroy(upb_def_to_php_obj_map);
-  FREE_HASHTABLE(upb_def_to_php_obj_map);
-
-  zend_hash_destroy(ce_to_php_obj_map);
-  FREE_HASHTABLE(ce_to_php_obj_map);
-
-  zend_hash_destroy(proto_to_php_obj_map);
-  FREE_HASHTABLE(proto_to_php_obj_map);
-
-  zend_hash_destroy(reserved_names);
-  FREE_HASHTABLE(reserved_names);
-
-#if PHP_MAJOR_VERSION < 7
-  if (generated_pool_php != NULL) {
-    zval_dtor(generated_pool_php);
-    FREE_ZVAL(generated_pool_php);
-  }
-  if (internal_generated_pool_php != NULL) {
-    zval_dtor(internal_generated_pool_php);
-    FREE_ZVAL(internal_generated_pool_php);
-  }
-#else
-  if (generated_pool_php != NULL) {
-    zval tmp;
-    ZVAL_OBJ(&tmp, generated_pool_php);
-    zval_dtor(&tmp);
-  }
-  if (internal_generated_pool_php != NULL) {
-    zval tmp;
-    ZVAL_OBJ(&tmp, internal_generated_pool_php);
-    zval_dtor(&tmp);
-  }
-#endif
-
-  is_inited_file_any = true;
-  is_inited_file_api = true;
-  is_inited_file_duration = true;
-  is_inited_file_field_mask = true;
-  is_inited_file_empty = true;
-  is_inited_file_source_context = true;
-  is_inited_file_struct = true;
-  is_inited_file_timestamp = true;
-  is_inited_file_type = true;
-  is_inited_file_wrappers = true;
-
-  return 0;
-}
-
-static PHP_MINIT_FUNCTION(protobuf) {
+PHP_MINIT_FUNCTION(protobuf) {
   descriptor_pool_init(TSRMLS_C);
   descriptor_init(TSRMLS_C);
-  enum_descriptor_init(TSRMLS_C);
-  enum_value_descriptor_init(TSRMLS_C);
-  field_descriptor_init(TSRMLS_C);
-  gpb_type_init(TSRMLS_C);
-  internal_descriptor_pool_init(TSRMLS_C);
-  map_field_init(TSRMLS_C);
-  map_field_iter_init(TSRMLS_C);
-  message_init(TSRMLS_C);
-  oneof_descriptor_init(TSRMLS_C);
-  repeated_field_init(TSRMLS_C);
-  repeated_field_iter_init(TSRMLS_C);
-  util_init(TSRMLS_C);
-
-  gpb_metadata_any_init(TSRMLS_C);
-  gpb_metadata_api_init(TSRMLS_C);
-  gpb_metadata_duration_init(TSRMLS_C);
-  gpb_metadata_field_mask_init(TSRMLS_C);
-  gpb_metadata_empty_init(TSRMLS_C);
-  gpb_metadata_source_context_init(TSRMLS_C);
-  gpb_metadata_struct_init(TSRMLS_C);
-  gpb_metadata_timestamp_init(TSRMLS_C);
-  gpb_metadata_type_init(TSRMLS_C);
-  gpb_metadata_wrappers_init(TSRMLS_C);
-
-  any_init(TSRMLS_C);
-  api_init(TSRMLS_C);
-  bool_value_init(TSRMLS_C);
-  bytes_value_init(TSRMLS_C);
-  double_value_init(TSRMLS_C);
-  duration_init(TSRMLS_C);
-  enum_init(TSRMLS_C);
-  enum_value_init(TSRMLS_C);
-  field_cardinality_init(TSRMLS_C);
-  field_init(TSRMLS_C);
-  field_kind_init(TSRMLS_C);
-  field_mask_init(TSRMLS_C);
-  float_value_init(TSRMLS_C);
-  empty_init(TSRMLS_C);
-  int32_value_init(TSRMLS_C);
-  int64_value_init(TSRMLS_C);
-  list_value_init(TSRMLS_C);
-  method_init(TSRMLS_C);
-  mixin_init(TSRMLS_C);
-  null_value_init(TSRMLS_C);
-  option_init(TSRMLS_C);
-  source_context_init(TSRMLS_C);
-  string_value_init(TSRMLS_C);
-  struct_init(TSRMLS_C);
-  syntax_init(TSRMLS_C);
-  timestamp_init(TSRMLS_C);
-  type_init(TSRMLS_C);
-  u_int32_value_init(TSRMLS_C);
-  u_int64_value_init(TSRMLS_C);
-  value_init(TSRMLS_C);
-
-  return 0;
-}
-
-static PHP_MSHUTDOWN_FUNCTION(protobuf) {
-  PEFREE(message_handlers);
-  PEFREE(repeated_field_handlers);
-  PEFREE(repeated_field_iter_handlers);
-  PEFREE(map_field_handlers);
-  PEFREE(map_field_iter_handlers);
-
-  return 0;
+  message_builder_context_init(TSRMLS_C);
 }
diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h
index c15bde2..f903855 100644
--- a/php/ext/google/protobuf/protobuf.h
+++ b/php/ext/google/protobuf/protobuf.h
@@ -1,1000 +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.
-
 #ifndef __GOOGLE_PROTOBUF_PHP_PROTOBUF_H__
 #define __GOOGLE_PROTOBUF_PHP_PROTOBUF_H__
 
 #include <php.h>
 
-// ubp.h has to be placed after php.h. Othwise, php.h will introduce NDEBUG.
 #include "upb.h"
 
 #define PHP_PROTOBUF_EXTNAME "protobuf"
-#define PHP_PROTOBUF_VERSION "3.5.2"
+#define PHP_PROTOBUF_VERSION "0.01"
 
-#define MAX_LENGTH_OF_INT64 20
-#define SIZEOF_INT64 8
-
-// -----------------------------------------------------------------------------
-// PHP7 Wrappers
-// ----------------------------------------------------------------------------
-
-#if PHP_MAJOR_VERSION < 7
-
-#define php_proto_zend_literal const zend_literal*
-#define PHP_PROTO_CASE_IS_BOOL IS_BOOL
-#define PHP_PROTO_SIZE int
-#define PHP_PROTO_LONG long
-#define PHP_PROTO_TSRMLS_DC TSRMLS_DC
-#define PHP_PROTO_TSRMLS_CC TSRMLS_CC
-
-// PHP String
-
-#define PHP_PROTO_ZVAL_STRING(zval_ptr, s, copy) \
-  ZVAL_STRING(zval_ptr, s, copy)
-#define PHP_PROTO_ZVAL_STRINGL(zval_ptr, s, len, copy) \
-  ZVAL_STRINGL(zval_ptr, s, len, copy)
-#define PHP_PROTO_RETURN_STRING(s, copy) RETURN_STRING(s, copy)
-#define PHP_PROTO_RETURN_STRINGL(s, len, copy) RETURN_STRINGL(s, len, copy)
-#define PHP_PROTO_RETVAL_STRINGL(s, len, copy) RETVAL_STRINGL(s, len, copy)
-#define php_proto_zend_make_printable_zval(from, to) \
-  {                                                  \
-    int use_copy;                                    \
-    zend_make_printable_zval(from, to, &use_copy);   \
-  }
-
-// PHP Array
-
-#define PHP_PROTO_HASH_OF(array) Z_ARRVAL_P(array)
-
-#define php_proto_zend_hash_index_update_zval(ht, h, pData) \
-  zend_hash_index_update(ht, h, &(pData), sizeof(void*), NULL)
-
-#define php_proto_zend_hash_update_zval(ht, key, key_len, value) \
-  zend_hash_update(ht, key, key_len, value, sizeof(void*), NULL)
-
-#define php_proto_zend_hash_update(ht, key, key_len) \
-  zend_hash_update(ht, key, key_len, 0, 0, NULL)
-
-#define php_proto_zend_hash_index_update_mem(ht, h, pData, nDataSize, pDest) \
-  zend_hash_index_update(ht, h, pData, nDataSize, pDest)
-
-#define php_proto_zend_hash_update_mem(ht, key, key_len, pData, nDataSize, \
-                                       pDest)                              \
-  zend_hash_update(ht, key, key_len, pData, nDataSize, pDest)
-
-#define php_proto_zend_hash_index_find_zval(ht, h, pDest) \
-  zend_hash_index_find(ht, h, pDest)
-
-#define php_proto_zend_hash_find(ht, key, key_len, pDest) \
-  zend_hash_find(ht, key, key_len, pDest)
-
-#define php_proto_zend_hash_index_find_mem(ht, h, pDest) \
-  zend_hash_index_find(ht, h, pDest)
-
-#define php_proto_zend_hash_find_zval(ht, key, key_len, pDest) \
-  zend_hash_find(ht, key, key_len, pDest)
-
-#define php_proto_zend_hash_find_mem(ht, key, key_len, pDest) \
-  zend_hash_find(ht, key, key_len, pDest)
-
-#define php_proto_zend_hash_next_index_insert_zval(ht, pData) \
-  zend_hash_next_index_insert(ht, pData, sizeof(void*), NULL)
-
-#define php_proto_zend_hash_next_index_insert_mem(ht, pData, nDataSize, pDest) \
-  zend_hash_next_index_insert(ht, pData, nDataSize, pDest)
-
-#define php_proto_zend_hash_get_current_data_ex(ht, pDest, pos) \
-  zend_hash_get_current_data_ex(ht, pDest, pos)
-
-// PHP Object
-
-#define PHP_PROTO_WRAP_OBJECT_START(name) \
-  struct name {                           \
-    zend_object std;
-#define PHP_PROTO_WRAP_OBJECT_END \
-  };
-
-#define PHP_PROTO_INIT_SUBMSGCLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)   \
-  void LOWWERNAME##_init(TSRMLS_D) {                                         \
-    zend_class_entry class_type;                                             \
-    const char* class_name = CLASSNAME;                                      \
-    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
-                        LOWWERNAME##_methods);                               \
-    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
-    LOWWERNAME##_type->create_object = message_create;
-#define PHP_PROTO_INIT_SUBMSGCLASS_END \
-  }
-
-#define PHP_PROTO_INIT_ENUMCLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)     \
-  void LOWWERNAME##_init(TSRMLS_D) {                                         \
-    zend_class_entry class_type;                                             \
-    const char* class_name = CLASSNAME;                                      \
-    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
-                        LOWWERNAME##_methods);                               \
-    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC);
-#define PHP_PROTO_INIT_ENUMCLASS_END \
-  }
-
-#define PHP_PROTO_INIT_CLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)         \
-  void LOWWERNAME##_init(TSRMLS_D) {                                         \
-    zend_class_entry class_type;                                             \
-    const char* class_name = CLASSNAME;                                      \
-    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
-                        LOWWERNAME##_methods);                               \
-    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
-    LOWWERNAME##_type->create_object = LOWWERNAME##_create;                  \
-    LOWWERNAME##_handlers = PEMALLOC(zend_object_handlers);                  \
-    memcpy(LOWWERNAME##_handlers, zend_get_std_object_handlers(),            \
-           sizeof(zend_object_handlers));
-#define PHP_PROTO_INIT_CLASS_END \
-  }
-
-#define PHP_PROTO_OBJECT_CREATE_START(NAME, LOWWERNAME) \
-  static zend_object_value LOWWERNAME##_create(         \
-      zend_class_entry* ce TSRMLS_DC) {                 \
-    PHP_PROTO_ALLOC_CLASS_OBJECT(NAME, ce);             \
-    zend_object_std_init(&intern->std, ce TSRMLS_CC);   \
-    object_properties_init(&intern->std, ce);
-#define PHP_PROTO_OBJECT_CREATE_END(NAME, LOWWERNAME)                          \
-  PHP_PROTO_FREE_CLASS_OBJECT(NAME, LOWWERNAME##_free, LOWWERNAME##_handlers); \
-  }
-
-#define PHP_PROTO_OBJECT_FREE_START(classname, lowername) \
-  void lowername##_free(void* object TSRMLS_DC) {         \
-    classname* intern = object;
-#define PHP_PROTO_OBJECT_FREE_END                 \
-    zend_object_std_dtor(&intern->std TSRMLS_CC); \
-    efree(intern);                                \
-  }
-
-#define PHP_PROTO_OBJECT_DTOR_START(classname, lowername)
-#define PHP_PROTO_OBJECT_DTOR_END
-
-#define CACHED_VALUE zval*
-#define CACHED_TO_ZVAL_PTR(VALUE) (VALUE)
-#define CACHED_PTR_TO_ZVAL_PTR(VALUE) (*VALUE)
-#define ZVAL_PTR_TO_CACHED_PTR(VALUE) (&VALUE)
-#define ZVAL_PTR_TO_CACHED_VALUE(VALUE) (VALUE)
-#define ZVAL_TO_CACHED_VALUE(VALUE) (&VALUE)
-
-#define CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(zval_ptr, class_type) \
-  ZVAL_OBJ(zval_ptr, class_type->create_object(class_type TSRMLS_CC));
-
-#define PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(value) \
-  SEPARATE_ZVAL_IF_NOT_REF(value)
-
-#define PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL EG(uninitialized_zval_ptr)
-
-#define OBJ_PROP(OBJECT, OFFSET) &((OBJECT)->properties_table[OFFSET])
-
-#define php_proto_zval_ptr_dtor(zval_ptr) \
-  zval_ptr_dtor(&(zval_ptr))
-
-#define PHP_PROTO_ALLOC_CLASS_OBJECT(class_object, class_type) \
-  class_object* intern;                                        \
-  intern = (class_object*)emalloc(sizeof(class_object));       \
-  memset(intern, 0, sizeof(class_object));
-
-#define PHP_PROTO_FREE_CLASS_OBJECT(class_object, class_object_free, handler) \
-  zend_object_value retval = {0};                                             \
-  retval.handle = zend_objects_store_put(                                     \
-      intern, (zend_objects_store_dtor_t)zend_objects_destroy_object,         \
-      class_object_free, NULL TSRMLS_CC);                                     \
-  retval.handlers = handler;                                                  \
-  return retval;
-
-#define PHP_PROTO_ALLOC_ARRAY(zval_ptr)  \
-  ALLOC_HASHTABLE(Z_ARRVAL_P(zval_ptr)); \
-  Z_TYPE_P(zval_ptr) = IS_ARRAY;
-
-#define ZVAL_OBJ(zval_ptr, call_create) \
-  Z_TYPE_P(zval_ptr) = IS_OBJECT;       \
-  Z_OBJVAL_P(zval_ptr) = call_create;
-
-#define UNBOX(class_name, val) \
-  (class_name*)zend_object_store_get_object(val TSRMLS_CC);
-
-#define UNBOX_HASHTABLE_VALUE(class_name, val) UNBOX(class_name, val)
-
-#define HASHTABLE_VALUE_DTOR ZVAL_PTR_DTOR
-
-#define PHP_PROTO_HASHTABLE_VALUE zval*
-#define HASHTABLE_VALUE_CE(val) Z_OBJCE_P(val)
-
-#define CREATE_HASHTABLE_VALUE(OBJ, WRAPPED_OBJ, OBJ_TYPE, OBJ_CLASS_ENTRY) \
-  OBJ_TYPE* OBJ;                                                            \
-  PHP_PROTO_HASHTABLE_VALUE WRAPPED_OBJ;                                    \
-  MAKE_STD_ZVAL(WRAPPED_OBJ);                                               \
-  ZVAL_OBJ(WRAPPED_OBJ,                                                     \
-           OBJ_CLASS_ENTRY->create_object(OBJ_CLASS_ENTRY TSRMLS_CC));      \
-  OBJ = UNBOX_HASHTABLE_VALUE(OBJ_TYPE, WRAPPED_OBJ);                       \
-  Z_DELREF_P(desc_php);
-
-#define PHP_PROTO_CE_DECLARE zend_class_entry**
-#define PHP_PROTO_CE_UNREF(ce) (*ce)
-
-#define php_proto_zend_lookup_class(name, name_length, ce) \
-  zend_lookup_class(name, name_length, ce TSRMLS_CC)
-
-#define PHP_PROTO_RETVAL_ZVAL(value) ZVAL_ZVAL(return_value, value, 1, 0)
-
-#else  // PHP_MAJOR_VERSION >= 7
-
-#define php_proto_zend_literal void**
-#define PHP_PROTO_CASE_IS_BOOL IS_TRUE: case IS_FALSE
-#define PHP_PROTO_SIZE size_t
-#define PHP_PROTO_LONG zend_long
-#define PHP_PROTO_TSRMLS_DC
-#define PHP_PROTO_TSRMLS_CC
-
-// PHP String
-
-#define PHP_PROTO_ZVAL_STRING(zval_ptr, s, copy) \
-  ZVAL_STRING(zval_ptr, s)
-#define PHP_PROTO_ZVAL_STRINGL(zval_ptr, s, len, copy) \
-  ZVAL_STRINGL(zval_ptr, s, len)
-#define PHP_PROTO_RETURN_STRING(s, copy) RETURN_STRING(s)
-#define PHP_PROTO_RETURN_STRINGL(s, len, copy) RETURN_STRINGL(s, len)
-#define PHP_PROTO_RETVAL_STRINGL(s, len, copy) RETVAL_STRINGL(s, len)
-#define php_proto_zend_make_printable_zval(from, to) \
-  zend_make_printable_zval(from, to)
-
-// PHP Array
-
-#define PHP_PROTO_HASH_OF(array) Z_ARRVAL_P(&array)
-
-static inline int php_proto_zend_hash_index_update_zval(HashTable* ht, ulong h,
-                                                        zval* pData) {
-  void* result = NULL;
-  result = zend_hash_index_update(ht, h, pData);
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_update(HashTable* ht, const char* key,
-                                             size_t key_len) {
-  void* result = NULL;
-  zval temp;
-  ZVAL_LONG(&temp, 0);
-  result = zend_hash_str_update(ht, key, key_len, &temp);
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_index_update_mem(HashTable* ht, ulong h,
-                                                   void* pData, uint nDataSize,
-                                                   void** pDest) {
-  void* result = NULL;
-  result = zend_hash_index_update_mem(ht, h, pData, nDataSize);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_update_zval(HashTable* ht,
-                                                  const char* key, uint key_len,
-                                                  zval* pData) {
-  zend_string* internal_key = zend_string_init(key, key_len, 0);
-  zend_hash_update(ht, internal_key, pData);
-}
-
-static inline int php_proto_zend_hash_update_mem(HashTable* ht, const char* key,
-                                                 uint key_len, void* pData,
-                                                 uint nDataSize, void** pDest) {
-  zend_string* internal_key = zend_string_init(key, key_len, 0);
-  void* result = zend_hash_update_mem(ht, internal_key, pData, nDataSize);
-  zend_string_release(internal_key);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_index_find_zval(const HashTable* ht,
-                                                      ulong h, void** pDest) {
-  zval* result = zend_hash_index_find(ht, h);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_find(const HashTable* ht, const char* key,
-                                           size_t key_len, void** pDest) {
-  void* result = NULL;
-  result = zend_hash_str_find(ht, key, key_len);
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_index_find_mem(const HashTable* ht,
-                                                     ulong h, void** pDest) {
-  void* result = NULL;
-  result = zend_hash_index_find_ptr(ht, h);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_find_zval(const HashTable* ht,
-                                                const char* key, uint key_len,
-                                                void** pDest) {
-  zend_string* internal_key = zend_string_init(key, key_len, 1);
-  zval* result = zend_hash_find(ht, internal_key);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_find_mem(const HashTable* ht,
-                                                const char* key, uint key_len,
-                                                void** pDest) {
-  zend_string* internal_key = zend_string_init(key, key_len, 1);
-  void* result = zend_hash_find_ptr(ht, internal_key);
-  zend_string_release(internal_key);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_next_index_insert_zval(HashTable* ht,
-                                                             void* pData) {
-  zval tmp;
-  ZVAL_OBJ(&tmp, *(zend_object**)pData);
-  zval* result = zend_hash_next_index_insert(ht, &tmp);
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_next_index_insert_mem(HashTable* ht,
-                                                            void* pData,
-                                                            uint nDataSize,
-                                                            void** pDest) {
-  void* result = NULL;
-  result = zend_hash_next_index_insert_mem(ht, pData, nDataSize);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht,
-                                                          void** pDest,
-                                                          HashPosition* pos) {
-  void* result = NULL;
-  result = zend_hash_get_current_data_ex(ht, pos);
-  if (pDest != NULL) *pDest = result;
-  return result != NULL ? SUCCESS : FAILURE;
-}
-
-// PHP Object
-
-#define PHP_PROTO_WRAP_OBJECT_START(name) struct name {
-#define PHP_PROTO_WRAP_OBJECT_END \
-  zend_object std;                \
-  };
-
-#define PHP_PROTO_INIT_SUBMSGCLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)   \
-  void LOWWERNAME##_init(TSRMLS_D) {                                         \
-    zend_class_entry class_type;                                             \
-    const char* class_name = CLASSNAME;                                      \
-    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
-                        LOWWERNAME##_methods);                               \
-    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
-    LOWWERNAME##_type->create_object = message_create;
-#define PHP_PROTO_INIT_SUBMSGCLASS_END \
-  }
-
-#define PHP_PROTO_INIT_ENUMCLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)     \
-  void LOWWERNAME##_init(TSRMLS_D) {                                         \
-    zend_class_entry class_type;                                             \
-    const char* class_name = CLASSNAME;                                      \
-    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
-                        LOWWERNAME##_methods);                               \
-    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC);
-#define PHP_PROTO_INIT_ENUMCLASS_END \
-  }
-
-#define PHP_PROTO_INIT_CLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)         \
-  void LOWWERNAME##_init(TSRMLS_D) {                                         \
-    zend_class_entry class_type;                                             \
-    const char* class_name = CLASSNAME;                                      \
-    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
-                        LOWWERNAME##_methods);                               \
-    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
-    LOWWERNAME##_type->create_object = LOWWERNAME##_create;                  \
-    LOWWERNAME##_handlers = PEMALLOC(zend_object_handlers);                  \
-    memcpy(LOWWERNAME##_handlers, zend_get_std_object_handlers(),            \
-           sizeof(zend_object_handlers));                                    \
-    LOWWERNAME##_handlers->free_obj = LOWWERNAME##_free;                     \
-    LOWWERNAME##_handlers->dtor_obj = LOWWERNAME##_dtor;                     \
-    LOWWERNAME##_handlers->offset = XtOffsetOf(CAMELNAME, std);
-#define PHP_PROTO_INIT_CLASS_END \
-  }
-
-#define PHP_PROTO_OBJECT_FREE_START(classname, lowername) \
-  void lowername##_free(zend_object* object) {            \
-    classname* intern =                                   \
-        (classname*)((char*)object - XtOffsetOf(classname, std));
-#define PHP_PROTO_OBJECT_FREE_END           \
-  }
-
-#define PHP_PROTO_OBJECT_DTOR_START(classname, lowername) \
-  void lowername##_dtor(zend_object* object) {            \
-    classname* intern =                                   \
-        (classname*)((char*)object - XtOffsetOf(classname, std));
-#define PHP_PROTO_OBJECT_DTOR_END           \
-    zend_object_std_dtor(object TSRMLS_CC); \
-  }
-
-#define PHP_PROTO_OBJECT_CREATE_START(NAME, LOWWERNAME)                     \
-  static zend_object* LOWWERNAME##_create(zend_class_entry* ce TSRMLS_DC) { \
-    PHP_PROTO_ALLOC_CLASS_OBJECT(NAME, ce);                                 \
-    zend_object_std_init(&intern->std, ce TSRMLS_CC);                       \
-    object_properties_init(&intern->std, ce);
-#define PHP_PROTO_OBJECT_CREATE_END(NAME, LOWWERNAME)                          \
-  PHP_PROTO_FREE_CLASS_OBJECT(NAME, LOWWERNAME##_free, LOWWERNAME##_handlers); \
-  }
-
-#define CACHED_VALUE zval
-#define CACHED_TO_ZVAL_PTR(VALUE) (&VALUE)
-#define CACHED_PTR_TO_ZVAL_PTR(VALUE) (VALUE)
-#define ZVAL_PTR_TO_CACHED_PTR(VALUE) (VALUE)
-#define ZVAL_PTR_TO_CACHED_VALUE(VALUE) (*VALUE)
-#define ZVAL_TO_CACHED_VALUE(VALUE) (VALUE)
-
-#define CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(zval_ptr, class_type) \
-  ZVAL_OBJ(zval_ptr, class_type->create_object(class_type));
-
-#define PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(value) ;
-
-#define PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL &EG(uninitialized_zval)
-
-#define php_proto_zval_ptr_dtor(zval_ptr) \
-  zval_ptr_dtor(zval_ptr)
-
-#define PHP_PROTO_ALLOC_CLASS_OBJECT(class_object, class_type)               \
-  class_object* intern;                                                      \
-  int size = sizeof(class_object) + zend_object_properties_size(class_type); \
-  intern = ecalloc(1, size);                                                 \
-  memset(intern, 0, size);
-
-#define PHP_PROTO_FREE_CLASS_OBJECT(class_object, class_object_free, handler) \
-  intern->std.handlers = handler;                                             \
-  return &intern->std;
-
-#define PHP_PROTO_ALLOC_ARRAY(zval_ptr) \
-  ZVAL_NEW_ARR(zval_ptr)
-
-#define UNBOX(class_name, val) \
-  (class_name*)((char*)Z_OBJ_P(val) - XtOffsetOf(class_name, std));
-
-#define UNBOX_HASHTABLE_VALUE(class_name, val) \
-  (class_name*)((char*)val - XtOffsetOf(class_name, std))
-
-#define HASHTABLE_VALUE_DTOR php_proto_hashtable_descriptor_release
-
-#define PHP_PROTO_HASHTABLE_VALUE zend_object*
-#define HASHTABLE_VALUE_CE(val) val->ce
-
-#define CREATE_HASHTABLE_VALUE(OBJ, WRAPPED_OBJ, OBJ_TYPE, OBJ_CLASS_ENTRY) \
-  OBJ_TYPE* OBJ;                                                            \
-  PHP_PROTO_HASHTABLE_VALUE WRAPPED_OBJ;                                    \
-  WRAPPED_OBJ = OBJ_CLASS_ENTRY->create_object(OBJ_CLASS_ENTRY);            \
-  OBJ = UNBOX_HASHTABLE_VALUE(OBJ_TYPE, WRAPPED_OBJ);                       \
-  --GC_REFCOUNT(WRAPPED_OBJ);
-
-#define PHP_PROTO_CE_DECLARE zend_class_entry*
-#define PHP_PROTO_CE_UNREF(ce) (ce)
-
-static inline int php_proto_zend_lookup_class(
-    const char* name, int name_length, zend_class_entry** ce TSRMLS_DC) {
-  zend_string *zstr_name = zend_string_init(name, name_length, 0);
-  *ce = zend_lookup_class(zstr_name);
-  zend_string_release(zstr_name);
-  return *ce != NULL ? SUCCESS : FAILURE;
-}
-
-#define PHP_PROTO_RETVAL_ZVAL(value) ZVAL_COPY(return_value, value)
-
-#endif  // PHP_MAJOR_VERSION >= 7
-
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-#define PHP_PROTO_FAKE_SCOPE_BEGIN(klass)  \
-  zend_class_entry* old_scope = EG(scope); \
-  EG(scope) = klass;
-#define PHP_PROTO_FAKE_SCOPE_RESTART(klass) \
-  old_scope = EG(scope);                    \
-  EG(scope) = klass;
-#define PHP_PROTO_FAKE_SCOPE_END EG(scope) = old_scope;
-#else
-#define PHP_PROTO_FAKE_SCOPE_BEGIN(klass)       \
-  zend_class_entry* old_scope = EG(fake_scope); \
-  EG(fake_scope) = klass;
-#define PHP_PROTO_FAKE_SCOPE_RESTART(klass) \
-  old_scope = EG(fake_scope);               \
-  EG(fake_scope) = klass;
-#define PHP_PROTO_FAKE_SCOPE_END EG(fake_scope) = old_scope;
-#endif
-
-// Define PHP class
-#define DEFINE_PROTOBUF_INIT_CLASS(CLASSNAME, CAMELNAME, LOWERNAME) \
-  PHP_PROTO_INIT_CLASS_START(CLASSNAME, CAMELNAME, LOWERNAME)       \
-  PHP_PROTO_INIT_CLASS_END
-
-#define DEFINE_PROTOBUF_CREATE(NAME, LOWERNAME)  \
-  PHP_PROTO_OBJECT_CREATE_START(NAME, LOWERNAME) \
-  LOWERNAME##_init_c_instance(intern TSRMLS_CC); \
-  PHP_PROTO_OBJECT_CREATE_END(NAME, LOWERNAME)
-
-#define DEFINE_PROTOBUF_FREE(CAMELNAME, LOWERNAME)  \
-  PHP_PROTO_OBJECT_FREE_START(CAMELNAME, LOWERNAME) \
-  LOWERNAME##_free_c(intern TSRMLS_CC);             \
-  PHP_PROTO_OBJECT_FREE_END
-
-#define DEFINE_PROTOBUF_DTOR(CAMELNAME, LOWERNAME)  \
-  PHP_PROTO_OBJECT_DTOR_START(CAMELNAME, LOWERNAME) \
-  PHP_PROTO_OBJECT_DTOR_END
-
-#define DEFINE_CLASS(NAME, LOWERNAME, string_name) \
-  zend_class_entry *LOWERNAME##_type;              \
-  zend_object_handlers *LOWERNAME##_handlers;      \
-  DEFINE_PROTOBUF_FREE(NAME, LOWERNAME)            \
-  DEFINE_PROTOBUF_DTOR(NAME, LOWERNAME)            \
-  DEFINE_PROTOBUF_CREATE(NAME, LOWERNAME)          \
-  DEFINE_PROTOBUF_INIT_CLASS(string_name, NAME, LOWERNAME)
-
-// -----------------------------------------------------------------------------
-// Forward Declaration
-// ----------------------------------------------------------------------------
-
-struct Any;
-struct Api;
-struct BoolValue;
-struct BytesValue;
-struct Descriptor;
+// Forward decls.
 struct DescriptorPool;
-struct DoubleValue;
-struct Duration;
-struct Enum;
-struct EnumDescriptor;
-struct EnumValue;
-struct EnumValueDescriptor;
-struct Field;
+struct Descriptor;
 struct FieldDescriptor;
-struct FieldMask;
-struct Field_Cardinality;
-struct Field_Kind;
-struct FloatValue;
-struct GPBEmpty;
-struct Int32Value;
-struct Int64Value;
-struct InternalDescriptorPool;
-struct ListValue;
-struct Map;
-struct MapIter;
+struct EnumDescriptor;
+struct MessageLayout;
 struct MessageField;
 struct MessageHeader;
-struct MessageLayout;
-struct Method;
-struct Mixin;
-struct NullValue;
-struct Oneof;
-struct Option;
-struct RepeatedField;
-struct RepeatedFieldIter;
-struct SourceContext;
-struct StringValue;
-struct Struct;
-struct Syntax;
-struct Timestamp;
-struct Type;
-struct UInt32Value;
-struct UInt64Value;
-struct Value;
+struct MessageBuilderContext;
+struct EnumBuilderContext;
 
-typedef struct Any Any;
-typedef struct Api Api;
-typedef struct BoolValue BoolValue;
-typedef struct BytesValue BytesValue;
-typedef struct Descriptor Descriptor;
 typedef struct DescriptorPool DescriptorPool;
-typedef struct DoubleValue DoubleValue;
-typedef struct Duration Duration;
-typedef struct EnumDescriptor EnumDescriptor;
-typedef struct Enum Enum;
-typedef struct EnumValueDescriptor EnumValueDescriptor;
-typedef struct EnumValue EnumValue;
-typedef struct Field_Cardinality Field_Cardinality;
+typedef struct Descriptor Descriptor;
 typedef struct FieldDescriptor FieldDescriptor;
-typedef struct Field Field;
-typedef struct Field_Kind Field_Kind;
-typedef struct FieldMask FieldMask;
-typedef struct FloatValue FloatValue;
-typedef struct GPBEmpty GPBEmpty;
-typedef struct Int32Value Int32Value;
-typedef struct Int64Value Int64Value;
-typedef struct InternalDescriptorPool InternalDescriptorPool;
-typedef struct ListValue ListValue;
-typedef struct MapIter MapIter;
-typedef struct Map Map;
+typedef struct OneofDescriptor OneofDescriptor;
+typedef struct EnumDescriptor EnumDescriptor;
+typedef struct MessageLayout MessageLayout;
 typedef struct MessageField MessageField;
 typedef struct MessageHeader MessageHeader;
-typedef struct MessageLayout MessageLayout;
-typedef struct Method Method;
-typedef struct Mixin Mixin;
-typedef struct NullValue NullValue;
-typedef struct Oneof Oneof;
-typedef struct Option Option;
-typedef struct RepeatedFieldIter RepeatedFieldIter;
-typedef struct RepeatedField RepeatedField;
-typedef struct SourceContext SourceContext;
-typedef struct StringValue StringValue;
-typedef struct Struct Struct;
-typedef struct Syntax Syntax;
-typedef struct Timestamp Timestamp;
-typedef struct Type Type;
-typedef struct UInt32Value UInt32Value;
-typedef struct UInt64Value UInt64Value;
-typedef struct Value Value;
+typedef struct MessageBuilderContext MessageBuilderContext;
+typedef struct OneofBuilderContext OneofBuilderContext;
+typedef struct EnumBuilderContext EnumBuilderContext;
 
-// -----------------------------------------------------------------------------
-// Globals.
-// -----------------------------------------------------------------------------
+extern zend_class_entry* builder_type;
+extern zend_class_entry* descriptor_type;
+extern zend_class_entry* message_builder_context_type;
+
+extern DescriptorPool* generated_pool;  // The actual generated pool
 
 ZEND_BEGIN_MODULE_GLOBALS(protobuf)
+  zval* generated_pool;
+  zend_object_handlers* message_handlers;
+  HashTable upb_def_to_php_obj_map;
 ZEND_END_MODULE_GLOBALS(protobuf)
 
-// Init module and PHP classes.
-void any_init(TSRMLS_D);
-void api_init(TSRMLS_D);
-void bool_value_init(TSRMLS_D);
-void bytes_value_init(TSRMLS_D);
-void descriptor_init(TSRMLS_D);
-void descriptor_pool_init(TSRMLS_D);
-void double_value_init(TSRMLS_D);
-void duration_init(TSRMLS_D);
-void empty_init(TSRMLS_D);
-void enum_descriptor_init(TSRMLS_D);
-void enum_init(TSRMLS_D);
-void enum_value_init(TSRMLS_D);
-void field_cardinality_init(TSRMLS_D);
-void field_descriptor_init(TSRMLS_D);
-void field_init(TSRMLS_D);
-void field_kind_init(TSRMLS_D);
-void field_mask_init(TSRMLS_D);
-void float_value_init(TSRMLS_D);
-void gpb_type_init(TSRMLS_D);
-void int32_value_init(TSRMLS_D);
-void int64_value_init(TSRMLS_D);
-void internal_descriptor_pool_init(TSRMLS_D);
-void list_value_init(TSRMLS_D);
-void map_field_init(TSRMLS_D);
-void map_field_iter_init(TSRMLS_D);
-void message_init(TSRMLS_D);
-void method_init(TSRMLS_D);
-void mixin_init(TSRMLS_D);
-void null_value_init(TSRMLS_D);
-void oneof_descriptor_init(TSRMLS_D);
-void option_init(TSRMLS_D);
-void repeated_field_init(TSRMLS_D);
-void repeated_field_iter_init(TSRMLS_D);
-void source_context_init(TSRMLS_D);
-void string_value_init(TSRMLS_D);
-void struct_init(TSRMLS_D);
-void syntax_init(TSRMLS_D);
-void timestamp_init(TSRMLS_D);
-void type_init(TSRMLS_D);
-void uint32_value_init(TSRMLS_D);
-void uint64_value_init(TSRMLS_D);
-void util_init(TSRMLS_D);
-void value_init(TSRMLS_D);
+ZEND_DECLARE_MODULE_GLOBALS(protobuf)
 
-void gpb_metadata_any_init(TSRMLS_D);
-void gpb_metadata_api_init(TSRMLS_D);
-void gpb_metadata_duration_init(TSRMLS_D);
-void gpb_metadata_field_mask_init(TSRMLS_D);
-void gpb_metadata_empty_init(TSRMLS_D);
-void gpb_metadata_source_context_init(TSRMLS_D);
-void gpb_metadata_struct_init(TSRMLS_D);
-void gpb_metadata_timestamp_init(TSRMLS_D);
-void gpb_metadata_type_init(TSRMLS_D);
-void gpb_metadata_wrappers_init(TSRMLS_D);
-
-// Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
-// instances.
-void add_def_obj(const void* def, PHP_PROTO_HASHTABLE_VALUE value);
-PHP_PROTO_HASHTABLE_VALUE get_def_obj(const void* def);
-
-// Global map from PHP class entries to wrapper Descriptor/EnumDescriptor
-// instances.
-void add_ce_obj(const void* ce, PHP_PROTO_HASHTABLE_VALUE value);
-PHP_PROTO_HASHTABLE_VALUE get_ce_obj(const void* ce);
-bool class_added(const void* ce);
-
-// Global map from message/enum's proto fully-qualified name to corresponding
-// wrapper Descriptor/EnumDescriptor instances.
-void add_proto_obj(const char* proto, PHP_PROTO_HASHTABLE_VALUE value);
-PHP_PROTO_HASHTABLE_VALUE get_proto_obj(const char* proto);
-
-extern zend_class_entry* map_field_type;
-extern zend_class_entry* repeated_field_type;
+#ifdef ZTS
+#define PROTOBUF_G(v) TSRMG(protobuf_globals_id, zend_protobuf_globals*, v)
+#else
+#define PROTOBUF_G(v) (protobuf_globals.v)
+#endif
 
 // -----------------------------------------------------------------------------
-// Descriptor.
+// PHP functions and global variables.
 // -----------------------------------------------------------------------------
 
-PHP_PROTO_WRAP_OBJECT_START(DescriptorPool)
-  InternalDescriptorPool* intern;
-PHP_PROTO_WRAP_OBJECT_END
+PHP_MINIT_FUNCTION(protobuf);
 
-PHP_METHOD(DescriptorPool, getGeneratedPool);
-PHP_METHOD(DescriptorPool, getDescriptorByClassName);
-PHP_METHOD(DescriptorPool, getEnumDescriptorByClassName);
+// -----------------------------------------------------------------------------
+// PHP class structure.
+// -----------------------------------------------------------------------------
 
-PHP_PROTO_WRAP_OBJECT_START(InternalDescriptorPool)
+struct DescriptorPool {
+  zend_object std;
   upb_symtab* symtab;
   HashTable* pending_list;
-PHP_PROTO_WRAP_OBJECT_END
+};
 
-PHP_METHOD(InternalDescriptorPool, getGeneratedPool);
-PHP_METHOD(InternalDescriptorPool, internalAddGeneratedFile);
-
-void internal_add_generated_file(const char* data, PHP_PROTO_SIZE data_len,
-                                 InternalDescriptorPool* pool TSRMLS_DC);
-void init_generated_pool_once(TSRMLS_D);
-
-// wrapper of generated pool
-#if PHP_MAJOR_VERSION < 7
-extern zval* generated_pool_php;
-extern zval* internal_generated_pool_php;
-void descriptor_pool_free(void* object TSRMLS_DC);
-void internal_descriptor_pool_free(void* object TSRMLS_DC);
-#else
-extern zend_object *generated_pool_php;
-extern zend_object *internal_generated_pool_php;
-void descriptor_pool_free(zend_object* object);
-void internal_descriptor_pool_free(zend_object* object);
-#endif
-extern InternalDescriptorPool* generated_pool;  // The actual generated pool
-
-PHP_PROTO_WRAP_OBJECT_START(Descriptor)
+struct Descriptor {
+  zend_object std;
   const upb_msgdef* msgdef;
   MessageLayout* layout;
-  zend_class_entry* klass;  // begins as NULL
-  const upb_handlers* fill_handlers;
-  const upb_pbdecodermethod* fill_method;
-  const upb_json_parsermethod* json_fill_method;
+  // zval* klass;  // begins as NULL
+  // const upb_handlers* fill_handlers;
+  // const upb_pbdecodermethod* fill_method;
   const upb_handlers* pb_serialize_handlers;
-  const upb_handlers* json_serialize_handlers;
-  const upb_handlers* json_serialize_handlers_preserve;
-PHP_PROTO_WRAP_OBJECT_END
+  // const upb_handlers* json_serialize_handlers;
+  // Handlers hold type class references for sub-message fields directly in some
+  // cases. We need to keep these rooted because they might otherwise be
+  // collected.
+  // zval_array typeclass_references;
+};
 
-PHP_METHOD(Descriptor, getClass);
-PHP_METHOD(Descriptor, getFullName);
-PHP_METHOD(Descriptor, getField);
-PHP_METHOD(Descriptor, getFieldCount);
-PHP_METHOD(Descriptor, getOneofDecl);
-PHP_METHOD(Descriptor, getOneofDeclCount);
-
-extern zend_class_entry* descriptor_type;
-
-void descriptor_name_set(Descriptor *desc, const char *name);
-
-PHP_PROTO_WRAP_OBJECT_START(FieldDescriptor)
+struct FieldDescriptor {
+  zend_object std;
   const upb_fielddef* fielddef;
-PHP_PROTO_WRAP_OBJECT_END
+};
 
-PHP_METHOD(FieldDescriptor, getName);
-PHP_METHOD(FieldDescriptor, getNumber);
-PHP_METHOD(FieldDescriptor, getLabel);
-PHP_METHOD(FieldDescriptor, getType);
-PHP_METHOD(FieldDescriptor, isMap);
-PHP_METHOD(FieldDescriptor, getEnumType);
-PHP_METHOD(FieldDescriptor, getMessageType);
+struct OneofDescriptor {
+  zend_object std;
+  const upb_oneofdef* oneofdef;
+};
 
-extern zend_class_entry* field_descriptor_type;
-
-PHP_PROTO_WRAP_OBJECT_START(EnumDescriptor)
+struct EnumDescriptor {
+  zend_object std;
   const upb_enumdef* enumdef;
-  zend_class_entry* klass;  // begins as NULL
-PHP_PROTO_WRAP_OBJECT_END
-
-PHP_METHOD(EnumDescriptor, getValue);
-PHP_METHOD(EnumDescriptor, getValueCount);
-
-extern zend_class_entry* enum_descriptor_type;
-
-PHP_PROTO_WRAP_OBJECT_START(EnumValueDescriptor)
-  const char* name;
-  int32_t number;
-PHP_PROTO_WRAP_OBJECT_END
-
-PHP_METHOD(EnumValueDescriptor, getName);
-PHP_METHOD(EnumValueDescriptor, getNumber);
-
-extern zend_class_entry* enum_value_descriptor_type;
-
-// -----------------------------------------------------------------------------
-// Message class creation.
-// -----------------------------------------------------------------------------
-
-void* message_data(MessageHeader* msg);
-void custom_data_init(const zend_class_entry* ce,
-                      MessageHeader* msg PHP_PROTO_TSRMLS_DC);
-
-// Build PHP class for given descriptor. Instead of building from scratch, this
-// function modifies existing class which has been partially defined in PHP
-// code.
-void build_class_from_descriptor(
-    PHP_PROTO_HASHTABLE_VALUE php_descriptor TSRMLS_DC);
-
-extern zend_class_entry* message_type;
-extern zend_object_handlers* message_handlers;
-
-// -----------------------------------------------------------------------------
-// Message layout / storage.
-// -----------------------------------------------------------------------------
-
-/*
- * In c extension, each protobuf message is a zval instance. The zval instance
- * is like union, which can be used to store int, string, zend_object_value and
- * etc. For protobuf message, the zval instance is used to store the
- * zend_object_value.
- *
- * The zend_object_value is composed of handlers and a handle to look up the
- * actual stored data. The handlers are pointers to functions, e.g., read,
- * write, and etc, to access properties.
- *
- * The actual data of protobuf messages is stored as MessageHeader in zend
- * engine's central repository. Each MessageHeader instance is composed of a
- * zend_object, a Descriptor instance and the real message data.
- *
- * For the reason that PHP's native types may not be large enough to store
- * protobuf message's field (e.g., int64), all message's data is stored in
- * custom memory layout and is indexed by the Descriptor instance.
- *
- * The zend_object contains the zend class entry and the properties table. The
- * zend class entry contains all information about protobuf message's
- * corresponding PHP class. The most useful information is the offset table of
- * properties. Because read access to properties requires returning zval
- * instance, we need to convert data from the custom layout to zval instance.
- * Instead of creating zval instance for every read access, we use the zval
- * instances in the properties table in the zend_object as cache.  When
- * accessing properties, the offset is needed to find the zval property in
- * zend_object's properties table. These properties will be updated using the
- * data from custom memory layout only when reading these properties.
- *
- * zval
- * |-zend_object_value obj
- *   |-zend_object_handlers* handlers -> |-read_property_handler
- *   |                                   |-write_property_handler
- *   |                              ++++++++++++++++++++++
- *   |-zend_object_handle handle -> + central repository +
- *                                  ++++++++++++++++++++++
- *  MessageHeader <-----------------|
- *  |-zend_object std
- *  | |-class_entry* ce -> class_entry
- *  | |                    |-HashTable properties_table (name->offset)
- *  | |-zval** properties_table <------------------------------|
- *  |                         |------> zval* property(cache)
- *  |-Descriptor* desc (name->offset)
- *  |-void** data <-----------|
- *           |-----------------------> void* property(data)
- *
- */
-
-#define MESSAGE_FIELD_NO_CASE ((size_t)-1)
-
-struct MessageField {
-  size_t offset;
-  int cache_index;  // Each field except oneof field has a zval cache to avoid
-                    // multiple creation when being accessed.
-  size_t case_offset;   // for oneofs, a uint32. Else, MESSAGE_FIELD_NO_CASE.
+  // zval* module;  // begins as NULL
 };
 
-struct MessageLayout {
-  const upb_msgdef* msgdef;
-  MessageField* fields;
-  size_t size;
-};
-
-PHP_PROTO_WRAP_OBJECT_START(MessageHeader)
-  void* data;  // Point to the real message data.
-               // Place needs to be consistent with map_parse_frame_data_t.
-  Descriptor* descriptor;  // Kept alive by self.class.descriptor reference.
-PHP_PROTO_WRAP_OBJECT_END
-
-MessageLayout* create_layout(const upb_msgdef* msgdef);
-void layout_init(MessageLayout* layout, void* storage,
-                 zend_object* object PHP_PROTO_TSRMLS_DC);
-zval* layout_get(MessageLayout* layout, const void* storage,
-                 const upb_fielddef* field, CACHED_VALUE* cache TSRMLS_DC);
-void layout_set(MessageLayout* layout, MessageHeader* header,
-                const upb_fielddef* field, zval* val TSRMLS_DC);
-void layout_merge(MessageLayout* layout, MessageHeader* from,
-                  MessageHeader* to TSRMLS_DC);
-const char* layout_get_oneof_case(MessageLayout* layout, const void* storage,
-                                  const upb_oneofdef* oneof TSRMLS_DC);
-void free_layout(MessageLayout* layout);
-void* slot_memory(MessageLayout* layout, const void* storage,
-                  const upb_fielddef* field);
-
-PHP_METHOD(Message, clear);
-PHP_METHOD(Message, mergeFrom);
-PHP_METHOD(Message, readOneof);
-PHP_METHOD(Message, writeOneof);
-PHP_METHOD(Message, whichOneof);
-PHP_METHOD(Message, __construct);
-
-// -----------------------------------------------------------------------------
-// Encode / Decode.
-// -----------------------------------------------------------------------------
-
-// Maximum depth allowed during encoding, to avoid stack overflows due to
-// cycles.
-#define ENCODE_MAX_NESTING 63
-
-// Constructs the upb decoder method for parsing messages of this type.
-// This is called from the message class creation code.
-const upb_pbdecodermethod *new_fillmsg_decodermethod(Descriptor *desc,
-                                                     const void *owner);
-void serialize_to_string(zval* val, zval* return_value TSRMLS_DC);
-void merge_from_string(const char* data, int data_len, const Descriptor* desc,
-                       MessageHeader* msg);
-
-PHP_METHOD(Message, serializeToString);
-PHP_METHOD(Message, mergeFromString);
-PHP_METHOD(Message, serializeToJsonString);
-PHP_METHOD(Message, mergeFromJsonString);
-PHP_METHOD(Message, discardUnknownFields);
-
-// -----------------------------------------------------------------------------
-// Type check / conversion.
-// -----------------------------------------------------------------------------
-
-bool protobuf_convert_to_int32(zval* from, int32_t* to);
-bool protobuf_convert_to_uint32(zval* from, uint32_t* to);
-bool protobuf_convert_to_int64(zval* from, int64_t* to);
-bool protobuf_convert_to_uint64(zval* from, uint64_t* to);
-bool protobuf_convert_to_float(zval* from, float* to);
-bool protobuf_convert_to_double(zval* from, double* to);
-bool protobuf_convert_to_bool(zval* from, int8_t* to);
-bool protobuf_convert_to_string(zval* from);
-
-void check_repeated_field(const zend_class_entry* klass, PHP_PROTO_LONG type,
-                          zval* val, zval* return_value);
-void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type,
-                     PHP_PROTO_LONG value_type, zval* val, zval* return_value);
-
-PHP_METHOD(Util, checkInt32);
-PHP_METHOD(Util, checkUint32);
-PHP_METHOD(Util, checkInt64);
-PHP_METHOD(Util, checkUint64);
-PHP_METHOD(Util, checkEnum);
-PHP_METHOD(Util, checkFloat);
-PHP_METHOD(Util, checkDouble);
-PHP_METHOD(Util, checkBool);
-PHP_METHOD(Util, checkString);
-PHP_METHOD(Util, checkBytes);
-PHP_METHOD(Util, checkMessage);
-PHP_METHOD(Util, checkMapField);
-PHP_METHOD(Util, checkRepeatedField);
-
 // -----------------------------------------------------------------------------
 // Native slot storage abstraction.
 // -----------------------------------------------------------------------------
@@ -1002,465 +105,177 @@
 #define NATIVE_SLOT_MAX_SIZE sizeof(uint64_t)
 
 size_t native_slot_size(upb_fieldtype_t type);
-bool native_slot_set(upb_fieldtype_t type, const zend_class_entry* klass,
-                     void* memory, zval* value TSRMLS_DC);
-// String/Message is stored differently in array/map from normal message fields.
-// So we need to make a special method to handle that.
-bool native_slot_set_by_array(upb_fieldtype_t type,
-                              const zend_class_entry* klass, void* memory,
-                              zval* value TSRMLS_DC);
-bool native_slot_set_by_map(upb_fieldtype_t type, const zend_class_entry* klass,
-                            void* memory, zval* value TSRMLS_DC);
-void native_slot_init(upb_fieldtype_t type, void* memory, CACHED_VALUE* cache);
-// For each property, in order to avoid conversion between the zval object and
-// the actual data type during parsing/serialization, the containing message
-// object use the custom memory layout to store the actual data type for each
-// property inside of it.  To access a property from php code, the property
-// needs to be converted to a zval object. The message object is not responsible
-// for providing such a zval object. Instead the caller needs to provide one
-// (cache) and update it with the actual data (memory).
-void native_slot_get(upb_fieldtype_t type, const void* memory,
-                     CACHED_VALUE* cache TSRMLS_DC);
-// String/Message is stored differently in array/map from normal message fields.
-// So we need to make a special method to handle that.
-void native_slot_get_by_array(upb_fieldtype_t type, const void* memory,
-                     CACHED_VALUE* cache TSRMLS_DC);
-void native_slot_get_by_map_key(upb_fieldtype_t type, const void* memory,
-                                int length, CACHED_VALUE* cache TSRMLS_DC);
-void native_slot_get_by_map_value(upb_fieldtype_t type, const void* memory,
-                                  CACHED_VALUE* cache TSRMLS_DC);
-void native_slot_get_default(upb_fieldtype_t type,
-                             CACHED_VALUE* cache TSRMLS_DC);
-
-// -----------------------------------------------------------------------------
-// Map Field.
-// -----------------------------------------------------------------------------
-
-extern zend_object_handlers* map_field_handlers;
-extern zend_object_handlers* map_field_iter_handlers;
-
-PHP_PROTO_WRAP_OBJECT_START(Map)
-  upb_fieldtype_t key_type;
-  upb_fieldtype_t value_type;
-  const zend_class_entry* msg_ce;  // class entry for value message
-  upb_strtable table;
-PHP_PROTO_WRAP_OBJECT_END
-
-PHP_PROTO_WRAP_OBJECT_START(MapIter)
-  Map* self;
-  upb_strtable_iter it;
-PHP_PROTO_WRAP_OBJECT_END
-
-void map_begin(zval* self, MapIter* iter TSRMLS_DC);
-void map_next(MapIter* iter);
-bool map_done(MapIter* iter);
-const char* map_iter_key(MapIter* iter, int* len);
-upb_value map_iter_value(MapIter* iter, int* len);
-
-// These operate on a map-entry msgdef.
-const upb_fielddef* map_entry_key(const upb_msgdef* msgdef);
-const upb_fielddef* map_entry_value(const upb_msgdef* msgdef);
-
-void map_field_create_with_field(const zend_class_entry* ce,
-                                 const upb_fielddef* field,
-                                 CACHED_VALUE* map_field PHP_PROTO_TSRMLS_DC);
-void map_field_create_with_type(const zend_class_entry* ce,
-                                upb_fieldtype_t key_type,
-                                upb_fieldtype_t value_type,
-                                const zend_class_entry* msg_ce,
-                                CACHED_VALUE* map_field PHP_PROTO_TSRMLS_DC);
-void* upb_value_memory(upb_value* v);
 
 #define MAP_KEY_FIELD 1
 #define MAP_VALUE_FIELD 2
 
+// Oneof case slot value to indicate that no oneof case is set. The value `0` is
+// safe because field numbers are used as case identifiers, and no field can
+// have a number of 0.
+#define ONEOF_CASE_NONE 0
+
 // These operate on a map field (i.e., a repeated field of submessages whose
 // submessage type is a map-entry msgdef).
 bool is_map_field(const upb_fielddef* field);
 const upb_fielddef* map_field_key(const upb_fielddef* field);
 const upb_fielddef* map_field_value(const upb_fielddef* field);
 
-bool map_index_set(Map *intern, const char* keyval, int length, upb_value v);
-
-PHP_METHOD(MapField, __construct);
-PHP_METHOD(MapField, offsetExists);
-PHP_METHOD(MapField, offsetGet);
-PHP_METHOD(MapField, offsetSet);
-PHP_METHOD(MapField, offsetUnset);
-PHP_METHOD(MapField, count);
-PHP_METHOD(MapField, getIterator);
-
-PHP_METHOD(MapFieldIter, rewind);
-PHP_METHOD(MapFieldIter, current);
-PHP_METHOD(MapFieldIter, key);
-PHP_METHOD(MapFieldIter, next);
-PHP_METHOD(MapFieldIter, valid);
+// These operate on a map-entry msgdef.
+const upb_fielddef* map_entry_key(const upb_msgdef* msgdef);
+const upb_fielddef* map_entry_value(const upb_msgdef* msgdef);
 
 // -----------------------------------------------------------------------------
-// Repeated Field.
+// Message layout / storage.
 // -----------------------------------------------------------------------------
 
-extern zend_object_handlers* repeated_field_handlers;
-extern zend_object_handlers* repeated_field_iter_handlers;
+#define MESSAGE_FIELD_NO_CASE ((size_t)-1)
 
-PHP_PROTO_WRAP_OBJECT_START(RepeatedField)
-#if PHP_MAJOR_VERSION < 7
-  zval* array;
-#else
-  zval array;
-#endif
-  upb_fieldtype_t type;
-  const zend_class_entry* msg_ce;  // class entry for containing message
-                                   // (for message field only).
-PHP_PROTO_WRAP_OBJECT_END
+struct MessageField {
+  size_t offset;
+  size_t case_offset;  // for oneofs, a uint32. Else, MESSAGE_FIELD_NO_CASE.
+};
 
-PHP_PROTO_WRAP_OBJECT_START(RepeatedFieldIter)
-  RepeatedField* repeated_field;
-  long position;
-PHP_PROTO_WRAP_OBJECT_END
+struct MessageLayout {
+  const upb_msgdef* msgdef;
+  MessageField* fields;
+  size_t size;
+};
 
-void repeated_field_create_with_field(
-    zend_class_entry* ce, const upb_fielddef* field,
-    CACHED_VALUE* repeated_field PHP_PROTO_TSRMLS_DC);
-void repeated_field_create_with_type(
-    zend_class_entry* ce, upb_fieldtype_t type, const zend_class_entry* msg_ce,
-    CACHED_VALUE* repeated_field PHP_PROTO_TSRMLS_DC);
-// Return the element at the index position from the repeated field. There is
-// not restriction on the type of stored elements.
-void *repeated_field_index_native(RepeatedField *intern, int index TSRMLS_DC);
-// Add the element to the end of the repeated field. There is not restriction on
-// the type of stored elements.
-void repeated_field_push_native(RepeatedField *intern, void *value);
-
-PHP_METHOD(RepeatedField, __construct);
-PHP_METHOD(RepeatedField, append);
-PHP_METHOD(RepeatedField, offsetExists);
-PHP_METHOD(RepeatedField, offsetGet);
-PHP_METHOD(RepeatedField, offsetSet);
-PHP_METHOD(RepeatedField, offsetUnset);
-PHP_METHOD(RepeatedField, count);
-PHP_METHOD(RepeatedField, getIterator);
-
-PHP_METHOD(RepeatedFieldIter, rewind);
-PHP_METHOD(RepeatedFieldIter, current);
-PHP_METHOD(RepeatedFieldIter, key);
-PHP_METHOD(RepeatedFieldIter, next);
-PHP_METHOD(RepeatedFieldIter, valid);
+void layout_init(MessageLayout* layout, void* storage);
+zval* layout_get(MessageLayout* layout, const void* storage,
+                 const upb_fielddef* field TSRMLS_DC);
+MessageLayout* create_layout(const upb_msgdef* msgdef);
+void free_layout(MessageLayout* layout);
+zval* native_slot_get(upb_fieldtype_t type, /*VALUE type_class,*/
+                      const void* memory TSRMLS_DC);
 
 // -----------------------------------------------------------------------------
-// Oneof Field.
+// Message class creation.
 // -----------------------------------------------------------------------------
 
-PHP_PROTO_WRAP_OBJECT_START(Oneof)
-  upb_oneofdef* oneofdef;
-  int index;    // Index of field in oneof. -1 if not set.
-  char value[NATIVE_SLOT_MAX_SIZE];
-PHP_PROTO_WRAP_OBJECT_END
+struct MessageHeader {
+  zend_object std;
+  Descriptor* descriptor;  // kept alive by self.class.descriptor reference.
+                           // Data comes after this.
+};
 
-PHP_METHOD(Oneof, getName);
-PHP_METHOD(Oneof, getField);
-PHP_METHOD(Oneof, getFieldCount);
+struct MessageBuilderContext {
+  zend_object std;
+  zval* descriptor;
+  zval* pool;
+};
 
-extern zend_class_entry* oneof_descriptor_type;
+struct OneofBuilderContext {
+  zend_object std;
+  // VALUE descriptor;
+  // VALUE builder;
+};
 
-// Oneof case slot value to indicate that no oneof case is set. The value `0` is
-// safe because field numbers are used as case identifiers, and no field can
-// have a number of 0.
-#define ONEOF_CASE_NONE 0
+struct EnumBuilderContext {
+  zend_object std;
+  // VALUE enumdesc;
+};
+
+// Forward-declare all of the PHP method implementations.
+
+DescriptorPool* php_to_descriptor_pool(zval* value TSRMLS_DC);
+zend_object_value descriptor_pool_create(zend_class_entry *ce TSRMLS_DC);
+void descriptor_pool_free_c(DescriptorPool* object TSRMLS_DC);
+void descriptor_pool_free(void* object TSRMLS_DC);
+void descriptor_pool_init_c_instance(DescriptorPool* pool TSRMLS_DC);
+PHP_METHOD(DescriptorPool, addMessage);
+PHP_METHOD(DescriptorPool, finalize);
+
+Descriptor* php_to_descriptor(zval* value TSRMLS_DC);
+zend_object_value descriptor_create(zend_class_entry *ce TSRMLS_DC);
+void descriptor_init_c_instance(Descriptor* intern TSRMLS_DC);
+void descriptor_free_c(Descriptor* object TSRMLS_DC);
+void descriptor_free(void* object TSRMLS_DC);
+void descriptor_name_set(Descriptor *desc, const char *name);
+
+MessageBuilderContext* php_to_message_builder_context(zval* value TSRMLS_DC);
+zend_object_value message_builder_context_create(
+    zend_class_entry* ce TSRMLS_DC);
+void message_builder_context_init_c_instance(
+    MessageBuilderContext* intern TSRMLS_DC);
+void message_builder_context_free_c(MessageBuilderContext* object TSRMLS_DC);
+void message_builder_context_free(void* object TSRMLS_DC);
+PHP_METHOD(MessageBuilderContext, optional);
+PHP_METHOD(MessageBuilderContext, finalizeToPool);
+
+PHP_METHOD(Message, encode);
+const zend_class_entry* build_class_from_descriptor(
+    zval* php_descriptor TSRMLS_DC);
+
+PHP_FUNCTION(get_generated_pool);
 
 // -----------------------------------------------------------------------------
-// Well Known Type.
-// -----------------------------------------------------------------------------
+// Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
+// instances.
+// ----------------------------------------------------------------------------
 
-extern bool is_inited_file_any;
-extern bool is_inited_file_api;
-extern bool is_inited_file_duration;
-extern bool is_inited_file_field_mask;
-extern bool is_inited_file_empty;
-extern bool is_inited_file_source_context;
-extern bool is_inited_file_struct;
-extern bool is_inited_file_timestamp;
-extern bool is_inited_file_type;
-extern bool is_inited_file_wrappers;
-
-PHP_METHOD(GPBMetadata_Any, initOnce);
-PHP_METHOD(GPBMetadata_Api, initOnce);
-PHP_METHOD(GPBMetadata_Duration, initOnce);
-PHP_METHOD(GPBMetadata_FieldMask, initOnce);
-PHP_METHOD(GPBMetadata_Empty, initOnce);
-PHP_METHOD(GPBMetadata_SourceContext, initOnce);
-PHP_METHOD(GPBMetadata_Struct, initOnce);
-PHP_METHOD(GPBMetadata_Timestamp, initOnce);
-PHP_METHOD(GPBMetadata_Type, initOnce);
-PHP_METHOD(GPBMetadata_Wrappers, initOnce);
-
-PHP_METHOD(Any, __construct);
-PHP_METHOD(Any, getTypeUrl);
-PHP_METHOD(Any, setTypeUrl);
-PHP_METHOD(Any, getValue);
-PHP_METHOD(Any, setValue);
-PHP_METHOD(Any, unpack);
-PHP_METHOD(Any, pack);
-PHP_METHOD(Any, is);
-
-PHP_METHOD(Duration, __construct);
-PHP_METHOD(Duration, getSeconds);
-PHP_METHOD(Duration, setSeconds);
-PHP_METHOD(Duration, getNanos);
-PHP_METHOD(Duration, setNanos);
-
-PHP_METHOD(Timestamp, __construct);
-PHP_METHOD(Timestamp, fromDateTime);
-PHP_METHOD(Timestamp, toDateTime);
-PHP_METHOD(Timestamp, getSeconds);
-PHP_METHOD(Timestamp, setSeconds);
-PHP_METHOD(Timestamp, getNanos);
-PHP_METHOD(Timestamp, setNanos);
-
-PHP_METHOD(Api, __construct);
-PHP_METHOD(Api, getName);
-PHP_METHOD(Api, setName);
-PHP_METHOD(Api, getMethods);
-PHP_METHOD(Api, setMethods);
-PHP_METHOD(Api, getOptions);
-PHP_METHOD(Api, setOptions);
-PHP_METHOD(Api, getVersion);
-PHP_METHOD(Api, setVersion);
-PHP_METHOD(Api, getSourceContext);
-PHP_METHOD(Api, setSourceContext);
-PHP_METHOD(Api, getMixins);
-PHP_METHOD(Api, setMixins);
-PHP_METHOD(Api, getSyntax);
-PHP_METHOD(Api, setSyntax);
-
-PHP_METHOD(BoolValue, __construct);
-PHP_METHOD(BoolValue, getValue);
-PHP_METHOD(BoolValue, setValue);
-
-PHP_METHOD(BytesValue, __construct);
-PHP_METHOD(BytesValue, getValue);
-PHP_METHOD(BytesValue, setValue);
-
-PHP_METHOD(DoubleValue, __construct);
-PHP_METHOD(DoubleValue, getValue);
-PHP_METHOD(DoubleValue, setValue);
-
-PHP_METHOD(Enum, __construct);
-PHP_METHOD(Enum, getName);
-PHP_METHOD(Enum, setName);
-PHP_METHOD(Enum, getEnumvalue);
-PHP_METHOD(Enum, setEnumvalue);
-PHP_METHOD(Enum, getOptions);
-PHP_METHOD(Enum, setOptions);
-PHP_METHOD(Enum, getSourceContext);
-PHP_METHOD(Enum, setSourceContext);
-PHP_METHOD(Enum, getSyntax);
-PHP_METHOD(Enum, setSyntax);
-
-PHP_METHOD(EnumValue, __construct);
-PHP_METHOD(EnumValue, getName);
-PHP_METHOD(EnumValue, setName);
-PHP_METHOD(EnumValue, getNumber);
-PHP_METHOD(EnumValue, setNumber);
-PHP_METHOD(EnumValue, getOptions);
-PHP_METHOD(EnumValue, setOptions);
-
-PHP_METHOD(FieldMask, __construct);
-PHP_METHOD(FieldMask, getPaths);
-PHP_METHOD(FieldMask, setPaths);
-
-PHP_METHOD(Field, __construct);
-PHP_METHOD(Field, getKind);
-PHP_METHOD(Field, setKind);
-PHP_METHOD(Field, getCardinality);
-PHP_METHOD(Field, setCardinality);
-PHP_METHOD(Field, getNumber);
-PHP_METHOD(Field, setNumber);
-PHP_METHOD(Field, getName);
-PHP_METHOD(Field, setName);
-PHP_METHOD(Field, getTypeUrl);
-PHP_METHOD(Field, setTypeUrl);
-PHP_METHOD(Field, getOneofIndex);
-PHP_METHOD(Field, setOneofIndex);
-PHP_METHOD(Field, getPacked);
-PHP_METHOD(Field, setPacked);
-PHP_METHOD(Field, getOptions);
-PHP_METHOD(Field, setOptions);
-PHP_METHOD(Field, getJsonName);
-PHP_METHOD(Field, setJsonName);
-PHP_METHOD(Field, getDefaultValue);
-PHP_METHOD(Field, setDefaultValue);
-
-PHP_METHOD(FloatValue, __construct);
-PHP_METHOD(FloatValue, getValue);
-PHP_METHOD(FloatValue, setValue);
-
-PHP_METHOD(GPBEmpty, __construct);
-
-PHP_METHOD(Int32Value, __construct);
-PHP_METHOD(Int32Value, getValue);
-PHP_METHOD(Int32Value, setValue);
-
-PHP_METHOD(Int64Value, __construct);
-PHP_METHOD(Int64Value, getValue);
-PHP_METHOD(Int64Value, setValue);
-
-PHP_METHOD(ListValue, __construct);
-PHP_METHOD(ListValue, getValues);
-PHP_METHOD(ListValue, setValues);
-
-PHP_METHOD(Method, __construct);
-PHP_METHOD(Method, getName);
-PHP_METHOD(Method, setName);
-PHP_METHOD(Method, getRequestTypeUrl);
-PHP_METHOD(Method, setRequestTypeUrl);
-PHP_METHOD(Method, getRequestStreaming);
-PHP_METHOD(Method, setRequestStreaming);
-PHP_METHOD(Method, getResponseTypeUrl);
-PHP_METHOD(Method, setResponseTypeUrl);
-PHP_METHOD(Method, getResponseStreaming);
-PHP_METHOD(Method, setResponseStreaming);
-PHP_METHOD(Method, getOptions);
-PHP_METHOD(Method, setOptions);
-PHP_METHOD(Method, getSyntax);
-PHP_METHOD(Method, setSyntax);
-
-PHP_METHOD(Mixin, __construct);
-PHP_METHOD(Mixin, getName);
-PHP_METHOD(Mixin, setName);
-PHP_METHOD(Mixin, getRoot);
-PHP_METHOD(Mixin, setRoot);
-
-PHP_METHOD(Option, __construct);
-PHP_METHOD(Option, getName);
-PHP_METHOD(Option, setName);
-PHP_METHOD(Option, getValue);
-PHP_METHOD(Option, setValue);
-
-PHP_METHOD(SourceContext, __construct);
-PHP_METHOD(SourceContext, getFileName);
-PHP_METHOD(SourceContext, setFileName);
-
-PHP_METHOD(StringValue, __construct);
-PHP_METHOD(StringValue, getValue);
-PHP_METHOD(StringValue, setValue);
-
-PHP_METHOD(Struct, __construct);
-PHP_METHOD(Struct, getFields);
-PHP_METHOD(Struct, setFields);
-
-PHP_METHOD(Type, __construct);
-PHP_METHOD(Type, getName);
-PHP_METHOD(Type, setName);
-PHP_METHOD(Type, getFields);
-PHP_METHOD(Type, setFields);
-PHP_METHOD(Type, getOneofs);
-PHP_METHOD(Type, setOneofs);
-PHP_METHOD(Type, getOptions);
-PHP_METHOD(Type, setOptions);
-PHP_METHOD(Type, getSourceContext);
-PHP_METHOD(Type, setSourceContext);
-PHP_METHOD(Type, getSyntax);
-PHP_METHOD(Type, setSyntax);
-
-PHP_METHOD(UInt32Value, __construct);
-PHP_METHOD(UInt32Value, getValue);
-PHP_METHOD(UInt32Value, setValue);
-
-PHP_METHOD(UInt64Value, __construct);
-PHP_METHOD(UInt64Value, getValue);
-PHP_METHOD(UInt64Value, setValue);
-
-PHP_METHOD(Value, __construct);
-PHP_METHOD(Value, getNullValue);
-PHP_METHOD(Value, setNullValue);
-PHP_METHOD(Value, getNumberValue);
-PHP_METHOD(Value, setNumberValue);
-PHP_METHOD(Value, getStringValue);
-PHP_METHOD(Value, setStringValue);
-PHP_METHOD(Value, getBoolValue);
-PHP_METHOD(Value, setBoolValue);
-PHP_METHOD(Value, getStructValue);
-PHP_METHOD(Value, setStructValue);
-PHP_METHOD(Value, getListValue);
-PHP_METHOD(Value, setListValue);
-PHP_METHOD(Value, getKind);
-
-extern zend_class_entry* any_type;
-extern zend_class_entry* api_type;
-extern zend_class_entry* bool_value_type;
-extern zend_class_entry* bytes_value_type;
-extern zend_class_entry* double_value_type;
-extern zend_class_entry* duration_type;
-extern zend_class_entry* empty_type;
-extern zend_class_entry* enum_type;
-extern zend_class_entry* enum_value_type;
-extern zend_class_entry* field_cardinality_type;
-extern zend_class_entry* field_kind_type;
-extern zend_class_entry* field_mask_type;
-extern zend_class_entry* field_type;
-extern zend_class_entry* float_value_type;
-extern zend_class_entry* int32_value_type;
-extern zend_class_entry* int64_value_type;
-extern zend_class_entry* list_value_type;
-extern zend_class_entry* method_type;
-extern zend_class_entry* mixin_type;
-extern zend_class_entry* null_value_type;
-extern zend_class_entry* option_type;
-extern zend_class_entry* source_context_type;
-extern zend_class_entry* string_value_type;
-extern zend_class_entry* struct_type;
-extern zend_class_entry* syntax_type;
-extern zend_class_entry* timestamp_type;
-extern zend_class_entry* type_type;
-extern zend_class_entry* uint32_value_type;
-extern zend_class_entry* uint64_value_type;
-extern zend_class_entry* value_type;
-
-// -----------------------------------------------------------------------------
-// Upb.
-// -----------------------------------------------------------------------------
-
-upb_fieldtype_t to_fieldtype(upb_descriptortype_t type);
-const zend_class_entry* field_type_class(
-    const upb_fielddef* field PHP_PROTO_TSRMLS_DC);
+void add_def_obj(const void* def, zval* value);
+zval* get_def_obj(const void* def);
 
 // -----------------------------------------------------------------------------
 // Utilities.
 // -----------------------------------------------------------------------------
 
+// PHP Array utils.
+#define Z_ARRVAL_SIZE_P(zval_p) zend_hash_num_elements(Z_ARRVAL_P(zval_p))
+#define Z_ARRVAL_BEGIN_P(zval_p) Z_ARRVAL_P(zval_p)->pListHead
+#define Z_BUCKET_NEXT_PP(bucket_pp) *bucket_pp = (*bucket_pp)->pListNext
+
+#define DEFINE_PHP_OBJECT(class_name, class_name_lower, name) \
+  do {                                                        \
+    zval* name;                                               \
+    MAKE_STD_ZVAL(name);                                      \
+    object_init_ex(name, class_name_lower##_type);            \
+  } while (0)
+
+#define DEFINE_PHP_WRAPPER(class_name, class_name_lower, name, intern) \
+  zval* name;                                                          \
+  MAKE_STD_ZVAL(name);                                                 \
+  object_init_ex(name, class_name_lower##_type);                       \
+  Z_OBJVAL_P(name)                                                     \
+      .handle = zend_objects_store_put(                                \
+      intern, (zend_objects_store_dtor_t)zend_objects_destroy_object,  \
+      class_name_lower##_free, NULL TSRMLS_CC);
+
+#define DEFINE_PHP_ZVAL(name) \
+  do {                        \
+    zval* name;               \
+    MAKE_STD_ZVAL(name);      \
+  } while (0)
+
+#define DEFINE_PHP_STRING(name, value) \
+  do {                                 \
+    zval* name;                        \
+    MAKE_STD_ZVAL(name);               \
+    ZVAL_STRING(name, value, 1);       \
+  } while (0)
+
+// Upb Utilities
+
+void check_upb_status(const upb_status* status, const char* msg);
+
+#define CHECK_UPB(code, msg)             \
+  do {                                   \
+    upb_status status = UPB_STATUS_INIT; \
+    code;                                \
+    check_upb_status(&status, msg);      \
+  } while (0)
+
 // Memory management
+
 #define ALLOC(class_name) (class_name*) emalloc(sizeof(class_name))
-#define PEMALLOC(class_name) (class_name*) pemalloc(sizeof(class_name), 1)
 #define ALLOC_N(class_name, n) (class_name*) emalloc(sizeof(class_name) * n)
 #define FREE(object) efree(object)
-#define PEFREE(object) pefree(object, 1)
 
-// String argument.
-#define STR(str) (str), strlen(str)
-
-// Zend Value
-#if PHP_MAJOR_VERSION < 7
-#define Z_OBJ_P(zval_p)                                       \
-  ((zend_object*)(EG(objects_store)                           \
-                      .object_buckets[Z_OBJ_HANDLE_P(zval_p)] \
-                      .bucket.obj.object))
-#endif
-
-// Message handler
-static inline zval* php_proto_message_read_property(
-    zval* msg, zval* member PHP_PROTO_TSRMLS_DC) {
-#if PHP_MAJOR_VERSION < 7
-  return message_handlers->read_property(msg, member, BP_VAR_R,
-                                         NULL PHP_PROTO_TSRMLS_CC);
-#else
-  return message_handlers->read_property(msg, member, BP_VAR_R, NULL,
-                                         NULL PHP_PROTO_TSRMLS_CC);
-#endif
-}
-
-// Reserved name
-bool is_reserved_name(const char* name);
-bool is_valid_constant_name(const char* name);
+// Type Checking
+#define CHECK_TYPE(field, type)             \
+  if (Z_TYPE_P(field) != type) {            \
+    zend_error(E_ERROR, "Unexpected type"); \
+  }
 
 #endif  // __GOOGLE_PROTOBUF_PHP_PROTOBUF_H__
diff --git a/php/ext/google/protobuf/storage.c b/php/ext/google/protobuf/storage.c
index e7910c8..e5a09c1 100644
--- a/php/ext/google/protobuf/storage.c
+++ b/php/ext/google/protobuf/storage.c
@@ -1,43 +1,19 @@
-// 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.
-
 #include <stdint.h>
 #include <protobuf.h>
-#include <Zend/zend.h>
-
-#include "utf8.h"
 
 // -----------------------------------------------------------------------------
-// Native slot storage.
+// PHP <-> native slot management.
 // -----------------------------------------------------------------------------
 
+static zval* int32_to_zval(int32_t value) {
+  zval* tmp;
+  MAKE_STD_ZVAL(tmp);
+  ZVAL_LONG(tmp, value);
+  php_printf("int32 to zval\n");
+  // ZVAL_LONG(tmp, 1);
+  return tmp;
+}
+
 #define DEREF(memory, type) *(type*)(memory)
 
 size_t native_slot_size(upb_fieldtype_t type) {
@@ -45,9 +21,9 @@
     case UPB_TYPE_FLOAT: return 4;
     case UPB_TYPE_DOUBLE: return 8;
     case UPB_TYPE_BOOL: return 1;
-    case UPB_TYPE_STRING: return sizeof(void*);
-    case UPB_TYPE_BYTES: return sizeof(void*);
-    case UPB_TYPE_MESSAGE: return sizeof(void*);
+    case UPB_TYPE_STRING: return sizeof(zval*);
+    case UPB_TYPE_BYTES: return sizeof(zval*);
+    case UPB_TYPE_MESSAGE: return sizeof(zval*);
     case UPB_TYPE_ENUM: return 4;
     case UPB_TYPE_INT32: return 4;
     case UPB_TYPE_INT64: return 8;
@@ -57,212 +33,72 @@
   }
 }
 
-static bool native_slot_is_default(upb_fieldtype_t type, const void* memory) {
-  switch (type) {
-#define CASE_TYPE(upb_type, c_type)    \
-  case UPB_TYPE_##upb_type: {          \
-    return DEREF(memory, c_type) == 0; \
-  }
-    CASE_TYPE(INT32,  int32_t )
-    CASE_TYPE(UINT32, uint32_t)
-    CASE_TYPE(ENUM,   int32_t )
-    CASE_TYPE(INT64,  int64_t )
-    CASE_TYPE(UINT64, uint64_t)
-    CASE_TYPE(FLOAT,  float   )
-    CASE_TYPE(DOUBLE, double  )
-    CASE_TYPE(BOOL,   int8_t  )
-
-#undef CASE_TYPE
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-      return Z_STRLEN_P(CACHED_PTR_TO_ZVAL_PTR(DEREF(memory, CACHED_VALUE*))) ==
-             0;
-    case UPB_TYPE_MESSAGE:
-      return Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(DEREF(memory, CACHED_VALUE*))) ==
-             IS_NULL;
-    default: return false;
-  }
+static bool is_php_num(zval* value) {
+  // Is numerial string also valid?
+  return (Z_TYPE_P(value) == IS_LONG ||
+          Z_TYPE_P(value) == IS_DOUBLE);
 }
 
-bool native_slot_set(upb_fieldtype_t type, const zend_class_entry* klass,
-                     void* memory, zval* value PHP_PROTO_TSRMLS_DC) {
+void native_slot_check_int_range_precision(upb_fieldtype_t type, zval* val) {
+  // TODO(teboring): Add it back.
+  // if (!is_php_num(val)) {
+  //   zend_error(E_ERROR, "Expected number type for integral field.");
+  // }
+
+  // if (Z_TYPE_P(val) == IS_DOUBLE) {
+  //   double dbl_val = NUM2DBL(val);
+  //   if (floor(dbl_val) != dbl_val) {
+  //     zend_error(E_ERROR,
+  //              "Non-integral floating point value assigned to integer field.");
+  //   }
+  // }
+  // if (type == UPB_TYPE_UINT32 || type == UPB_TYPE_UINT64) {
+  //   if (NUM2DBL(val) < 0) {
+  //     zend_error(E_ERROR,
+  //              "Assigning negative value to unsigned integer field.");
+  //   }
+  // }
+}
+
+zval* native_slot_get(upb_fieldtype_t type, /*VALUE type_class,*/
+                      const void* memory TSRMLS_DC) {
+  zval* retval = NULL;
   switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      if (!protobuf_convert_to_string(value)) {
-        return false;
-      }
-      if (type == UPB_TYPE_STRING &&
-          !is_structurally_valid_utf8(Z_STRVAL_P(value), Z_STRLEN_P(value))) {
-        zend_error(E_USER_ERROR, "Given string is not UTF8 encoded.");
-        return false;
-      }
-
-      zval* cached_zval = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (EXPECTED(cached_zval != NULL)) {
-#if PHP_MAJOR_VERSION < 7
-        REPLACE_ZVAL_VALUE((zval**)memory, value, 1);
-#else
-        zend_assign_to_variable(cached_zval, value, IS_CV);
-#endif
-      }
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      if (Z_TYPE_P(value) != IS_OBJECT && Z_TYPE_P(value) != IS_NULL) {
-        zend_error(E_USER_ERROR, "Given value is not message.");
-        return false;
-      }
-      if (Z_TYPE_P(value) == IS_OBJECT && klass != Z_OBJCE_P(value)) {
-        zend_error(E_USER_ERROR, "Given message does not have correct class.");
-        return false;
-      }
-
-      zval* property_ptr = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (EXPECTED(property_ptr != value)) {
-        php_proto_zval_ptr_dtor(property_ptr);
-      }
-
-#if PHP_MAJOR_VERSION < 7
-      DEREF(memory, zval*) = value;
-      Z_ADDREF_P(value);
-#else
-      ZVAL_ZVAL(property_ptr, value, 1, 0);
-#endif
-      break;
-    }
-
-#define CASE_TYPE(upb_type, type, c_type, php_type)              \
-  case UPB_TYPE_##upb_type: {                                    \
-    c_type type##_value;                                         \
-    if (protobuf_convert_to_##type(value, &type##_value)) {      \
-      DEREF(memory, c_type) = type##_value;                      \
-    }                                                            \
-    break;                                                       \
-  }
-      CASE_TYPE(INT32,  int32,  int32_t,  LONG)
-      CASE_TYPE(UINT32, uint32, uint32_t, LONG)
-      CASE_TYPE(ENUM,   int32,  int32_t,  LONG)
-      CASE_TYPE(INT64,  int64,  int64_t,  LONG)
-      CASE_TYPE(UINT64, uint64, uint64_t, LONG)
-      CASE_TYPE(FLOAT,  float,  float,    DOUBLE)
-      CASE_TYPE(DOUBLE, double, double,   DOUBLE)
-      CASE_TYPE(BOOL,   bool,   int8_t,   BOOL)
-
-#undef CASE_TYPE
-
+    // TODO(teboring): Add it back.
+    // case UPB_TYPE_FLOAT:
+    //   return DBL2NUM(DEREF(memory, float));
+    // case UPB_TYPE_DOUBLE:
+    //   return DBL2NUM(DEREF(memory, double));
+    // case UPB_TYPE_BOOL:
+    //   return DEREF(memory, int8_t) ? Qtrue : Qfalse;
+    // case UPB_TYPE_STRING:
+    // case UPB_TYPE_BYTES:
+    // case UPB_TYPE_MESSAGE:
+    //   return DEREF(memory, VALUE);
+    // case UPB_TYPE_ENUM: {
+    //   int32_t val = DEREF(memory, int32_t);
+    //   VALUE symbol = enum_lookup(type_class, INT2NUM(val));
+    //   if (symbol == Qnil) {
+    //     return INT2NUM(val);
+    //   } else {
+    //     return symbol;
+    //   }
+    // }
+    case UPB_TYPE_INT32:
+      return int32_to_zval(DEREF(memory, int32_t));
+    // TODO(teboring): Add it back.
+    // case UPB_TYPE_INT64:
+    //   return LL2NUM(DEREF(memory, int64_t));
+    // case UPB_TYPE_UINT32:
+    //   return UINT2NUM(DEREF(memory, uint32_t));
+    // case UPB_TYPE_UINT64:
+    //   return ULL2NUM(DEREF(memory, uint64_t));
     default:
-      break;
+      return EG(uninitialized_zval_ptr);
   }
-
-  return true;
 }
 
-bool native_slot_set_by_array(upb_fieldtype_t type,
-                              const zend_class_entry* klass, void* memory,
-                              zval* value TSRMLS_DC) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      if (!protobuf_convert_to_string(value)) {
-        return false;
-      }
-      if (type == UPB_TYPE_STRING &&
-          !is_structurally_valid_utf8(Z_STRVAL_P(value), Z_STRLEN_P(value))) {
-        zend_error(E_USER_ERROR, "Given string is not UTF8 encoded.");
-        return false;
-      }
-
-      // Handles repeated/map string field. Memory provided by
-      // RepeatedField/Map is not initialized.
-#if PHP_MAJOR_VERSION < 7
-      MAKE_STD_ZVAL(DEREF(memory, zval*));
-      PHP_PROTO_ZVAL_STRINGL(DEREF(memory, zval*), Z_STRVAL_P(value),
-                             Z_STRLEN_P(value), 1);
-#else
-      *(zend_string**)memory = zend_string_dup(Z_STR_P(value), 0);
-#endif
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      if (Z_TYPE_P(value) != IS_OBJECT) {
-        zend_error(E_USER_ERROR, "Given value is not message.");
-        return false;
-      }
-      if (Z_TYPE_P(value) == IS_OBJECT && klass != Z_OBJCE_P(value)) {
-        zend_error(E_USER_ERROR, "Given message does not have correct class.");
-        return false;
-      }
-#if PHP_MAJOR_VERSION < 7
-      if (EXPECTED(DEREF(memory, zval*) != value)) {
-        DEREF(memory, zval*) = value;
-        Z_ADDREF_P(value);
-      }
-#else
-      DEREF(memory, zval*) = value;
-      ++GC_REFCOUNT(Z_OBJ_P(value));
-#endif
-      break;
-    }
-    default:
-      return native_slot_set(type, klass, memory, value TSRMLS_CC);
-  }
-  return true;
-}
-
-bool native_slot_set_by_map(upb_fieldtype_t type, const zend_class_entry* klass,
-                            void* memory, zval* value TSRMLS_DC) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      if (!protobuf_convert_to_string(value)) {
-        return false;
-      }
-      if (type == UPB_TYPE_STRING &&
-          !is_structurally_valid_utf8(Z_STRVAL_P(value), Z_STRLEN_P(value))) {
-        zend_error(E_USER_ERROR, "Given string is not UTF8 encoded.");
-        return false;
-      }
-
-      // Handles repeated/map string field. Memory provided by
-      // RepeatedField/Map is not initialized.
-#if PHP_MAJOR_VERSION < 7
-      MAKE_STD_ZVAL(DEREF(memory, zval*));
-      PHP_PROTO_ZVAL_STRINGL(DEREF(memory, zval*), Z_STRVAL_P(value),
-                             Z_STRLEN_P(value), 1);
-#else
-      *(zend_string**)memory = zend_string_dup(Z_STR_P(value), 0);
-#endif
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      if (Z_TYPE_P(value) != IS_OBJECT) {
-        zend_error(E_USER_ERROR, "Given value is not message.");
-        return false;
-      }
-      if (Z_TYPE_P(value) == IS_OBJECT && klass != Z_OBJCE_P(value)) {
-        zend_error(E_USER_ERROR, "Given message does not have correct class.");
-        return false;
-      }
-#if PHP_MAJOR_VERSION < 7
-      if (EXPECTED(DEREF(memory, zval*) != value)) {
-        DEREF(memory, zval*) = value;
-        Z_ADDREF_P(value);
-      }
-#else
-      DEREF(memory, zend_object*) = Z_OBJ_P(value);
-      ++GC_REFCOUNT(Z_OBJ_P(value));
-#endif
-      break;
-    }
-    default:
-      return native_slot_set(type, klass, memory, value TSRMLS_CC);
-  }
-  return true;
-}
-
-void native_slot_init(upb_fieldtype_t type, void* memory, CACHED_VALUE* cache) {
-  zval* tmp = NULL;
+void native_slot_init(upb_fieldtype_t type, void* memory) {
   switch (type) {
     case UPB_TYPE_FLOAT:
       DEREF(memory, float) = 0.0;
@@ -273,11 +109,17 @@
     case UPB_TYPE_BOOL:
       DEREF(memory, int8_t) = 0;
       break;
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE:
-      DEREF(memory, CACHED_VALUE*) = cache;
-      break;
+    // TODO(teboring): Add it back.
+    // case UPB_TYPE_STRING:
+    // case UPB_TYPE_BYTES:
+    //   DEREF(memory, VALUE) = php_str_new2("");
+    //   php_enc_associate(DEREF(memory, VALUE), (type == UPB_TYPE_BYTES)
+    //                                              ? kRubyString8bitEncoding
+    //                                              : kRubyStringUtf8Encoding);
+    //   break;
+    // case UPB_TYPE_MESSAGE:
+    //   DEREF(memory, VALUE) = Qnil;
+    //   break;
     case UPB_TYPE_ENUM:
     case UPB_TYPE_INT32:
       DEREF(memory, int32_t) = 0;
@@ -296,198 +138,122 @@
   }
 }
 
-void native_slot_get(upb_fieldtype_t type, const void* memory,
-                     CACHED_VALUE* cache TSRMLS_DC) {
+void native_slot_set(upb_fieldtype_t type, /*VALUE type_class,*/ void* memory,
+                     zval* value) {
+  native_slot_set_value_and_case(type, /*type_class,*/ memory, value, NULL, 0);
+}
+
+void native_slot_set_value_and_case(upb_fieldtype_t type, /*VALUE type_class,*/
+                                    void* memory, zval* value,
+                                    uint32_t* case_memory,
+                                    uint32_t case_number) {
   switch (type) {
-#define CASE(upb_type, php_type, c_type)                                   \
-  case UPB_TYPE_##upb_type:                                                \
-    PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);                             \
-    ZVAL_##php_type(CACHED_PTR_TO_ZVAL_PTR(cache), DEREF(memory, c_type)); \
-    return;
-
-    CASE(FLOAT, DOUBLE, float)
-    CASE(DOUBLE, DOUBLE, double)
-    CASE(BOOL, BOOL, int8_t)
-    CASE(INT32, LONG, int32_t)
-    CASE(ENUM, LONG, uint32_t)
-
-#undef CASE
-
-#if SIZEOF_LONG == 4
-#define CASE(upb_type, c_type)                                       \
-  case UPB_TYPE_##upb_type: {                                        \
-    PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);                       \
-    char buffer[MAX_LENGTH_OF_INT64];                                \
-    sprintf(buffer, "%lld", DEREF(memory, c_type));                  \
-    PHP_PROTO_ZVAL_STRING(CACHED_PTR_TO_ZVAL_PTR(cache), buffer, 1); \
-    return;                                                          \
-  }
-#else
-#define CASE(upb_type, c_type)                                       \
-  case UPB_TYPE_##upb_type: {                                        \
-    PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);                       \
-    ZVAL_LONG(CACHED_PTR_TO_ZVAL_PTR(cache), DEREF(memory, c_type)); \
-    return;                                                          \
-  }
-#endif
-CASE(UINT64, uint64_t)
-CASE(INT64,  int64_t)
-#undef CASE
-
-    case UPB_TYPE_UINT32: {
-      // Prepend bit-1 for negative numbers, so that uint32 value will be
-      // consistent on both 32-bit and 64-bit architectures.
-      PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);
-      int value = DEREF(memory, int32_t);
-      if (sizeof(int) == 8) {
-        value |= (-((value >> 31) & 0x1) & 0xFFFFFFFF00000000);
+    case UPB_TYPE_FLOAT:
+      if (!Z_TYPE_P(value) == IS_LONG) {
+        zend_error(E_ERROR, "Expected number type for float field.");
       }
-      ZVAL_LONG(CACHED_PTR_TO_ZVAL_PTR(cache), value);
-      return;
+      DEREF(memory, float) = Z_DVAL_P(value);
+      break;
+    case UPB_TYPE_DOUBLE:
+      // TODO(teboring): Add it back.
+      // if (!is_php_num(value)) {
+      //   zend_error(E_ERROR, "Expected number type for double field.");
+      // }
+      // DEREF(memory, double) = Z_DVAL_P(value);
+      break;
+    case UPB_TYPE_BOOL: {
+      int8_t val = -1;
+      if (zval_is_true(value)) {
+        val = 1;
+      } else {
+        val = 0;
+      }
+      // TODO(teboring): Add it back.
+      // else if (value == Qfalse) {
+      //   val = 0;
+      // }
+      // else {
+      //   php_raise(php_eTypeError, "Invalid argument for boolean field.");
+      // }
+      DEREF(memory, int8_t) = val;
+      break;
     }
-
     case UPB_TYPE_STRING:
     case UPB_TYPE_BYTES: {
-      // For optional string/bytes/message fields, the cache is owned by the
-      // containing message and should have been updated during
-      // setting/decoding. However, oneof accessor call this function by
-      // providing the return value directly, which is not the same as the cache
-      // value.
-      zval* value = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (CACHED_PTR_TO_ZVAL_PTR(cache) != value) {
-        PHP_PROTO_ZVAL_STRINGL(CACHED_PTR_TO_ZVAL_PTR(cache), Z_STRVAL_P(value),
-                               Z_STRLEN_P(value), 1);
-      }
+      // TODO(teboring): Add it back.
+      // if (Z_TYPE_P(value) != IS_STRING) {
+      //   zend_error(E_ERROR, "Invalid argument for string field.");
+      // }
+      // native_slot_validate_string_encoding(type, value);
+      // DEREF(memory, zval*) = value;
       break;
     }
     case UPB_TYPE_MESSAGE: {
-      // Same as above for string/bytes fields.
-      zval* value = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (CACHED_PTR_TO_ZVAL_PTR(cache) != value) {
-        ZVAL_ZVAL(CACHED_PTR_TO_ZVAL_PTR(cache), value, 1, 0);
-      }
-      return;
-    }
-    default:
-      return;
-  }
-}
-
-void native_slot_get_by_array(upb_fieldtype_t type, const void* memory,
-                              CACHED_VALUE* cache TSRMLS_DC) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-#if PHP_MAJOR_VERSION < 7
-      zval* value = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (EXPECTED(CACHED_PTR_TO_ZVAL_PTR(cache) != value)) {
-        PHP_PROTO_ZVAL_STRINGL(CACHED_PTR_TO_ZVAL_PTR(cache),
-                               Z_STRVAL_P(value), Z_STRLEN_P(value), 1);
-      }
-#else
-      ZVAL_NEW_STR(cache, zend_string_dup(*(zend_string**)memory, 0));
-#endif
-      return;
-    }
-    case UPB_TYPE_MESSAGE: {
-#if PHP_MAJOR_VERSION < 7
-      zval* value = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (EXPECTED(CACHED_PTR_TO_ZVAL_PTR(cache) != value)) {
-        ZVAL_ZVAL(CACHED_PTR_TO_ZVAL_PTR(cache), value, 1, 0);
-      }
-#else
-      ZVAL_COPY(CACHED_PTR_TO_ZVAL_PTR(cache), memory);
-#endif
-      return;
-    }
-    default:
-      native_slot_get(type, memory, cache TSRMLS_CC);
-  }
-}
-
-void native_slot_get_by_map_key(upb_fieldtype_t type, const void* memory,
-                                int length, CACHED_VALUE* cache TSRMLS_DC) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      PHP_PROTO_ZVAL_STRINGL(CACHED_PTR_TO_ZVAL_PTR(cache), memory, length, 1);
-      return;
-    }
-    default:
-      native_slot_get(type, memory, cache TSRMLS_CC);
-  }
-}
-
-void native_slot_get_by_map_value(upb_fieldtype_t type, const void* memory,
-                              CACHED_VALUE* cache TSRMLS_DC) {
-  switch (type) {
-    case UPB_TYPE_MESSAGE: {
-#if PHP_MAJOR_VERSION < 7
-      zval* value = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-      if (EXPECTED(CACHED_PTR_TO_ZVAL_PTR(cache) != value)) {
-        ZVAL_ZVAL(CACHED_PTR_TO_ZVAL_PTR(cache), value, 1, 0);
-      }
-#else
-      ++GC_REFCOUNT(*(zend_object**)memory);
-      ZVAL_OBJ(cache, *(zend_object**)memory);
-#endif
-      return;
-    }
-    default:
-      native_slot_get_by_array(type, memory, cache TSRMLS_CC);
-  }
-}
-
-void native_slot_get_default(upb_fieldtype_t type,
-                             CACHED_VALUE* cache TSRMLS_DC) {
-  switch (type) {
-#define CASE(upb_type, php_type)                       \
-  case UPB_TYPE_##upb_type:                            \
-    PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);         \
-    ZVAL_##php_type(CACHED_PTR_TO_ZVAL_PTR(cache), 0); \
-    return;
-
-    CASE(FLOAT, DOUBLE)
-    CASE(DOUBLE, DOUBLE)
-    CASE(BOOL, BOOL)
-    CASE(INT32, LONG)
-    CASE(UINT32, LONG)
-    CASE(ENUM, LONG)
-
-#undef CASE
-
-#if SIZEOF_LONG == 4
-#define CASE(upb_type)                                            \
-  case UPB_TYPE_##upb_type: {                                     \
-    PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);                    \
-    PHP_PROTO_ZVAL_STRING(CACHED_PTR_TO_ZVAL_PTR(cache), "0", 1); \
-    return;                                                       \
-  }
-#else
-#define CASE(upb_type)                           \
-  case UPB_TYPE_##upb_type: {                    \
-    PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);   \
-    ZVAL_LONG(CACHED_PTR_TO_ZVAL_PTR(cache), 0); \
-    return;                                      \
-  }
-#endif
-CASE(UINT64)
-CASE(INT64)
-#undef CASE
-
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);
-      PHP_PROTO_ZVAL_STRINGL(CACHED_PTR_TO_ZVAL_PTR(cache), "", 0, 1);
+      // TODO(teboring): Add it back.
+      // if (CLASS_OF(value) == CLASS_OF(Qnil)) {
+      //   value = Qnil;
+      // } else if (CLASS_OF(value) != type_class) {
+      //   php_raise(php_eTypeError,
+      //            "Invalid type %s to assign to submessage field.",
+      //            php_class2name(CLASS_OF(value)));
+      // }
+      // DEREF(memory, VALUE) = value;
       break;
     }
-    case UPB_TYPE_MESSAGE: {
-      PHP_PROTO_SEPARATE_ZVAL_IF_NOT_REF(cache);
-      ZVAL_NULL(CACHED_PTR_TO_ZVAL_PTR(cache));
-      return;
+    case UPB_TYPE_ENUM: {
+      // TODO(teboring): Add it back.
+      // int32_t int_val = 0;
+      // if (!is_php_num(value) && TYPE(value) != T_SYMBOL) {
+      //   php_raise(php_eTypeError,
+      //            "Expected number or symbol type for enum field.");
+      // }
+      // if (TYPE(value) == T_SYMBOL) {
+      //   // Ensure that the given symbol exists in the enum module.
+      //   VALUE lookup = php_funcall(type_class, php_intern("resolve"), 1, value);
+      //   if (lookup == Qnil) {
+      //     php_raise(php_eRangeError, "Unknown symbol value for enum field.");
+      //   } else {
+      //     int_val = NUM2INT(lookup);
+      //   }
+      // } else {
+      //   native_slot_check_int_range_precision(UPB_TYPE_INT32, value);
+      //   int_val = NUM2INT(value);
+      // }
+      // DEREF(memory, int32_t) = int_val;
+      // break;
     }
+    case UPB_TYPE_INT32:
+    case UPB_TYPE_INT64:
+    case UPB_TYPE_UINT32:
+    case UPB_TYPE_UINT64:
+      native_slot_check_int_range_precision(type, value);
+      switch (type) {
+        case UPB_TYPE_INT32:
+          php_printf("Setting INT32 field\n");
+          DEREF(memory, int32_t) = Z_LVAL_P(value);
+          break;
+        case UPB_TYPE_INT64:
+          // TODO(teboring): Add it back.
+          // DEREF(memory, int64_t) = NUM2LL(value);
+          break;
+        case UPB_TYPE_UINT32:
+          // TODO(teboring): Add it back.
+          // DEREF(memory, uint32_t) = NUM2UINT(value);
+          break;
+        case UPB_TYPE_UINT64:
+          // TODO(teboring): Add it back.
+          // DEREF(memory, uint64_t) = NUM2ULL(value);
+          break;
+        default:
+          break;
+      }
+      break;
     default:
-      return;
+      break;
+  }
+
+  if (case_memory != NULL) {
+    *case_memory = case_number;
   }
 }
 
@@ -515,42 +281,6 @@
   return tryget_map_entry_msgdef(field) != NULL;
 }
 
-const upb_fielddef* map_field_key(const upb_fielddef* field) {
-  const upb_msgdef* subdef = map_entry_msgdef(field);
-  return map_entry_key(subdef);
-}
-
-const upb_fielddef* map_field_value(const upb_fielddef* field) {
-  const upb_msgdef* subdef = map_entry_msgdef(field);
-  return map_entry_value(subdef);
-}
-
-const upb_fielddef* map_entry_key(const upb_msgdef* msgdef) {
-  const upb_fielddef* key_field = upb_msgdef_itof(msgdef, MAP_KEY_FIELD);
-  assert(key_field != NULL);
-  return key_field;
-}
-
-const upb_fielddef* map_entry_value(const upb_msgdef* msgdef) {
-  const upb_fielddef* value_field = upb_msgdef_itof(msgdef, MAP_VALUE_FIELD);
-  assert(value_field != NULL);
-  return value_field;
-}
-
-const zend_class_entry* field_type_class(
-    const upb_fielddef* field PHP_PROTO_TSRMLS_DC) {
-  if (upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
-    Descriptor* desc = UNBOX_HASHTABLE_VALUE(
-        Descriptor, get_def_obj(upb_fielddef_subdef(field)));
-    return desc->klass;
-  } else if (upb_fielddef_type(field) == UPB_TYPE_ENUM) {
-    EnumDescriptor* desc = UNBOX_HASHTABLE_VALUE(
-        EnumDescriptor, get_def_obj(upb_fielddef_subdef(field)));
-    return desc->klass;
-  }
-  return NULL;
-}
-
 // -----------------------------------------------------------------------------
 // Memory layout management.
 // -----------------------------------------------------------------------------
@@ -560,35 +290,13 @@
   return (offset + granularity - 1) & ~(granularity - 1);
 }
 
-static uint32_t* slot_oneof_case(MessageLayout* layout, const void* storage,
-                                 const upb_fielddef* field) {
-  return (uint32_t*)(((uint8_t*)storage) +
-                     layout->fields[upb_fielddef_index(field)].case_offset);
-}
-
-static int slot_property_cache(MessageLayout* layout, const void* storage,
-                               const upb_fielddef* field) {
-  return layout->fields[upb_fielddef_index(field)].cache_index;
-}
-
-void* slot_memory(MessageLayout* layout, const void* storage,
-                         const upb_fielddef* field) {
-  return ((uint8_t*)storage) + layout->fields[upb_fielddef_index(field)].offset;
-}
-
 MessageLayout* create_layout(const upb_msgdef* msgdef) {
   MessageLayout* layout = ALLOC(MessageLayout);
   int nfields = upb_msgdef_numfields(msgdef);
   upb_msg_field_iter it;
   upb_msg_oneof_iter oit;
   size_t off = 0;
-  int i = 0;
 
-  // Reserve space for unknown fields.
-  off += sizeof(void*);
-
-  TSRMLS_FETCH();
-  Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msgdef));
   layout->fields = ALLOC_N(MessageField, nfields);
 
   for (upb_msg_field_begin(&it, msgdef); !upb_msg_field_done(&it);
@@ -614,37 +322,6 @@
     layout->fields[upb_fielddef_index(field)].offset = off;
     layout->fields[upb_fielddef_index(field)].case_offset =
         MESSAGE_FIELD_NO_CASE;
-
-    const char* fieldname = upb_fielddef_name(field);
-
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-    zend_class_entry* old_scope = EG(scope);
-    EG(scope) = desc->klass;
-#else
-    zend_class_entry* old_scope = EG(fake_scope);
-    EG(fake_scope) = desc->klass;
-#endif
-
-#if PHP_MAJOR_VERSION < 7
-    zval member;
-    ZVAL_STRINGL(&member, fieldname, strlen(fieldname), 0);
-    zend_property_info* property_info =
-        zend_get_property_info(desc->klass, &member, true TSRMLS_CC);
-#else
-    zend_string* member = zend_string_init(fieldname, strlen(fieldname), 1);
-    zend_property_info* property_info =
-        zend_get_property_info(desc->klass, member, true);
-    zend_string_release(member);
-#endif
-
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-    EG(scope) = old_scope;
-#else
-    EG(fake_scope) = old_scope;
-#endif
-
-    layout->fields[upb_fielddef_index(field)].cache_index =
-        property_info->offset;
     off += field_size;
   }
 
@@ -672,46 +349,15 @@
     // Align the offset .
     off = align_up_to( off, field_size);
     // Assign all fields in the oneof this same offset.
-    const char* oneofname = upb_oneofdef_name(oneof);
     for (upb_oneof_begin(&fit, oneof); !upb_oneof_done(&fit);
          upb_oneof_next(&fit)) {
       const upb_fielddef* field = upb_oneof_iter_field(&fit);
       layout->fields[upb_fielddef_index(field)].offset = off;
-
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-      zend_class_entry* old_scope = EG(scope);
-      EG(scope) = desc->klass;
-#else
-      zend_class_entry* old_scope = EG(fake_scope);
-      EG(fake_scope) = desc->klass;
-#endif
-
-#if PHP_MAJOR_VERSION < 7
-      zval member;
-      ZVAL_STRINGL(&member, oneofname, strlen(oneofname), 0);
-      zend_property_info* property_info =
-          zend_get_property_info(desc->klass, &member, true TSRMLS_CC);
-#else
-      zend_string* member = zend_string_init(oneofname, strlen(oneofname), 1);
-      zend_property_info* property_info =
-          zend_get_property_info(desc->klass, member, true);
-      zend_string_release(member);
-#endif
-
-#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
-      EG(scope) = old_scope;
-#else
-      EG(fake_scope) = old_scope;
-#endif
-
-      layout->fields[upb_fielddef_index(field)].cache_index =
-          property_info->offset;
     }
-    i++;
     off += field_size;
   }
 
-  // Now the case offset.
+  // Now the case fields.
   for (upb_msg_oneof_begin(&oit, msgdef); !upb_msg_oneof_done(&oit);
        upb_msg_oneof_next(&oit)) {
     const upb_oneofdef* oneof = upb_msg_iter_oneof(&oit);
@@ -743,403 +389,151 @@
   FREE(layout);
 }
 
-void layout_init(MessageLayout* layout, void* storage,
-                 zend_object* object PHP_PROTO_TSRMLS_DC) {
-  int i;
+// TODO(teboring): Add it back.
+// VALUE field_type_class(const upb_fielddef* field) {
+//   VALUE type_class = Qnil;
+//   if (upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
+//     VALUE submsgdesc = get_def_obj(upb_fielddef_subdef(field));
+//     type_class = Descriptor_msgclass(submsgdesc);
+//   } else if (upb_fielddef_type(field) == UPB_TYPE_ENUM) {
+//     VALUE subenumdesc = get_def_obj(upb_fielddef_subdef(field));
+//     type_class = EnumDescriptor_enummodule(subenumdesc);
+//   }
+//   return type_class;
+// }
+
+static void* slot_memory(MessageLayout* layout, const void* storage,
+                         const upb_fielddef* field) {
+  return ((uint8_t*)storage) + layout->fields[upb_fielddef_index(field)].offset;
+}
+
+static uint32_t* slot_oneof_case(MessageLayout* layout, const void* storage,
+                                 const upb_fielddef* field) {
+  return (uint32_t*)(((uint8_t*)storage) +
+                     layout->fields[upb_fielddef_index(field)].case_offset);
+}
+
+void layout_set(MessageLayout* layout, void* storage, const upb_fielddef* field,
+                zval* val) {
+  void* memory = slot_memory(layout, storage, field);
+  uint32_t* oneof_case = slot_oneof_case(layout, storage, field);
+
+  if (upb_fielddef_containingoneof(field)) {
+    if (Z_TYPE_P(val) == IS_NULL) {
+      // Assigning nil to a oneof field clears the oneof completely.
+      *oneof_case = ONEOF_CASE_NONE;
+      memset(memory, 0, NATIVE_SLOT_MAX_SIZE);
+    } else {
+      // The transition between field types for a single oneof (union) slot is
+      // somewhat complex because we need to ensure that a GC triggered at any
+      // point by a call into the Ruby VM sees a valid state for this field and
+      // does not either go off into the weeds (following what it thinks is a
+      // VALUE but is actually a different field type) or miss an object (seeing
+      // what it thinks is a primitive field but is actually a VALUE for the new
+      // field type).
+      //
+      // In order for the transition to be safe, the oneof case slot must be in
+      // sync with the value slot whenever the Ruby VM has been called. Thus, we
+      // use native_slot_set_value_and_case(), which ensures that both the value
+      // and case number are altered atomically (w.r.t. the Ruby VM).
+      native_slot_set_value_and_case(upb_fielddef_type(field),
+                                     /*field_type_class(field),*/ memory, val,
+                                     oneof_case, upb_fielddef_number(field));
+    }
+  } else if (is_map_field(field)) {
+    // TODO(teboring): Add it back.
+    // check_map_field_type(val, field);
+    // DEREF(memory, zval*) = val;
+  } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
+    // TODO(teboring): Add it back.
+    // check_repeated_field_type(val, field);
+    // DEREF(memory, zval*) = val;
+  } else {
+    native_slot_set(upb_fielddef_type(field), /*field_type_class(field),*/ memory,
+                    val);
+  }
+}
+
+void layout_init(MessageLayout* layout, void* storage) {
   upb_msg_field_iter it;
-
-  // Init unknown fields
-  memset(storage, 0, sizeof(void*));
-
-  for (upb_msg_field_begin(&it, layout->msgdef), i = 0; !upb_msg_field_done(&it);
-       upb_msg_field_next(&it), i++) {
+  for (upb_msg_field_begin(&it, layout->msgdef); !upb_msg_field_done(&it);
+       upb_msg_field_next(&it)) {
     const upb_fielddef* field = upb_msg_iter_field(&it);
     void* memory = slot_memory(layout, storage, field);
     uint32_t* oneof_case = slot_oneof_case(layout, storage, field);
-    int cache_index = slot_property_cache(layout, storage, field);
-    CACHED_VALUE* property_ptr = OBJ_PROP(object, cache_index);
 
     if (upb_fielddef_containingoneof(field)) {
-      memset(memory, 0, NATIVE_SLOT_MAX_SIZE);
-      *oneof_case = ONEOF_CASE_NONE;
+      // TODO(teboring): Add it back.
+      // memset(memory, 0, NATIVE_SLOT_MAX_SIZE);
+      // *oneof_case = ONEOF_CASE_NONE;
     } else if (is_map_field(field)) {
-      zval_ptr_dtor(property_ptr);
-#if PHP_MAJOR_VERSION < 7
-      MAKE_STD_ZVAL(*property_ptr);
-#endif
-      map_field_create_with_field(map_field_type, field,
-                                  property_ptr PHP_PROTO_TSRMLS_CC);
-      DEREF(memory, CACHED_VALUE*) = property_ptr;
+      // TODO(teboring): Add it back.
+      // VALUE map = Qnil;
+
+      // const upb_fielddef* key_field = map_field_key(field);
+      // const upb_fielddef* value_field = map_field_value(field);
+      // VALUE type_class = field_type_class(value_field);
+
+      // if (type_class != Qnil) {
+      //   VALUE args[3] = {
+      //       fieldtype_to_php(upb_fielddef_type(key_field)),
+      //       fieldtype_to_php(upb_fielddef_type(value_field)), type_class,
+      //   };
+      //   map = php_class_new_instance(3, args, cMap);
+      // } else {
+      //   VALUE args[2] = {
+      //       fieldtype_to_php(upb_fielddef_type(key_field)),
+      //       fieldtype_to_php(upb_fielddef_type(value_field)),
+      //   };
+      //   map = php_class_new_instance(2, args, cMap);
+      // }
+
+      // DEREF(memory, VALUE) = map;
     } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
-      zval_ptr_dtor(property_ptr);
-#if PHP_MAJOR_VERSION < 7
-      MAKE_STD_ZVAL(*property_ptr);
-#endif
-      repeated_field_create_with_field(repeated_field_type, field,
-                                       property_ptr PHP_PROTO_TSRMLS_CC);
-      DEREF(memory, CACHED_VALUE*) = property_ptr;
+      // TODO(teboring): Add it back.
+      // VALUE ary = Qnil;
+
+      // VALUE type_class = field_type_class(field);
+
+      // if (type_class != Qnil) {
+      //   VALUE args[2] = {
+      //       fieldtype_to_php(upb_fielddef_type(field)), type_class,
+      //   };
+      //   ary = php_class_new_instance(2, args, cRepeatedField);
+      // } else {
+      //   VALUE args[1] = {fieldtype_to_php(upb_fielddef_type(field))};
+      //   ary = php_class_new_instance(1, args, cRepeatedField);
+      // }
+
+      // DEREF(memory, VALUE) = ary;
     } else {
-      native_slot_init(upb_fielddef_type(field), memory, property_ptr);
+      native_slot_init(upb_fielddef_type(field), memory);
     }
   }
 }
 
-// For non-singular fields, the related memory needs to point to the actual
-// zval in properties table first.
-static void* value_memory(const upb_fielddef* field, void* memory) {
-  switch (upb_fielddef_type(field)) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE:
-      memory = DEREF(memory, CACHED_VALUE*);
-      break;
-    default:
-      // No operation
-      break;
-  }
-  return memory;
-}
-
 zval* layout_get(MessageLayout* layout, const void* storage,
-                 const upb_fielddef* field, CACHED_VALUE* cache TSRMLS_DC) {
+                 const upb_fielddef* field TSRMLS_DC) {
   void* memory = slot_memory(layout, storage, field);
   uint32_t* oneof_case = slot_oneof_case(layout, storage, field);
 
   if (upb_fielddef_containingoneof(field)) {
     if (*oneof_case != upb_fielddef_number(field)) {
-      native_slot_get_default(upb_fielddef_type(field), cache TSRMLS_CC);
-    } else {
-      native_slot_get(upb_fielddef_type(field), value_memory(field, memory),
-                      cache TSRMLS_CC);
+      return NULL;
+      // TODO(teboring): Add it back.
+      // return Qnil;
     }
-    return CACHED_PTR_TO_ZVAL_PTR(cache);
+      return NULL;
+    // TODO(teboring): Add it back.
+    // return native_slot_get(upb_fielddef_type(field), field_type_class(field),
+    //                        memory);
   } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
-    return CACHED_PTR_TO_ZVAL_PTR(cache);
+      return NULL;
+    // TODO(teboring): Add it back.
+    // return *((VALUE*)memory);
   } else {
-    native_slot_get(upb_fielddef_type(field), value_memory(field, memory),
-                    cache TSRMLS_CC);
-    return CACHED_PTR_TO_ZVAL_PTR(cache);
+    return native_slot_get(
+        upb_fielddef_type(field), /*field_type_class(field), */
+        memory TSRMLS_CC);
   }
 }
-
-void layout_set(MessageLayout* layout, MessageHeader* header,
-                const upb_fielddef* field, zval* val TSRMLS_DC) {
-  void* storage = message_data(header);
-  void* memory = slot_memory(layout, storage, field);
-  uint32_t* oneof_case = slot_oneof_case(layout, storage, field);
-
-  if (upb_fielddef_containingoneof(field)) {
-    upb_fieldtype_t type = upb_fielddef_type(field);
-    zend_class_entry *ce = NULL;
-
-    // For non-singular fields, the related memory needs to point to the actual
-    // zval in properties table first.
-    switch (type) {
-      case UPB_TYPE_MESSAGE: {
-        const upb_msgdef* msg = upb_fielddef_msgsubdef(field);
-        Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msg));
-        ce = desc->klass;
-        // Intentionally fall through.
-      }
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES: {
-        int property_cache_index =
-            header->descriptor->layout->fields[upb_fielddef_index(field)]
-                .cache_index;
-        DEREF(memory, CACHED_VALUE*) =
-            OBJ_PROP(&header->std, property_cache_index);
-        memory = DEREF(memory, CACHED_VALUE*);
-        break;
-      }
-      default:
-        break;
-    }
-
-    native_slot_set(type, ce, memory, val TSRMLS_CC);
-    *oneof_case = upb_fielddef_number(field);
-  } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
-    // Works for both repeated and map fields
-    memory = DEREF(memory, void**);
-    zval* property_ptr = CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory);
-
-    if (EXPECTED(property_ptr != val)) {
-      zend_class_entry *subce = NULL;
-      zval converted_value;
-
-      if (upb_fielddef_ismap(field)) {
-        const upb_msgdef* mapmsg = upb_fielddef_msgsubdef(field);
-        const upb_fielddef* keyfield = upb_msgdef_ntof(mapmsg, "key", 3);
-        const upb_fielddef* valuefield = upb_msgdef_ntof(mapmsg, "value", 5);
-        if (upb_fielddef_descriptortype(valuefield) ==
-            UPB_DESCRIPTOR_TYPE_MESSAGE) {
-          const upb_msgdef* submsg = upb_fielddef_msgsubdef(valuefield);
-          Descriptor* subdesc =
-              UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(submsg));
-          subce = subdesc->klass;
-        }
-        check_map_field(subce, upb_fielddef_descriptortype(keyfield),
-                        upb_fielddef_descriptortype(valuefield), val,
-                        &converted_value);
-      } else {
-        if (upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
-          const upb_msgdef* submsg = upb_fielddef_msgsubdef(field);
-          Descriptor* subdesc =
-              UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(submsg));
-          subce = subdesc->klass;
-        }
-
-        check_repeated_field(subce, upb_fielddef_descriptortype(field), val,
-                             &converted_value);
-      }
-#if PHP_MAJOR_VERSION < 7
-      REPLACE_ZVAL_VALUE((zval**)memory, &converted_value, 1);
-#else
-      php_proto_zval_ptr_dtor(property_ptr);
-      ZVAL_ZVAL(property_ptr, &converted_value, 1, 0);
-#endif
-      zval_dtor(&converted_value);
-    }
-  } else {
-    upb_fieldtype_t type = upb_fielddef_type(field);
-    zend_class_entry *ce = NULL;
-    if (type == UPB_TYPE_MESSAGE) {
-      const upb_msgdef* msg = upb_fielddef_msgsubdef(field);
-      Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msg));
-      ce = desc->klass;
-    }
-    native_slot_set(type, ce, value_memory(field, memory), val TSRMLS_CC);
-  }
-}
-
-static void native_slot_merge(const upb_fielddef* field, const void* from_memory,
-                         void* to_memory PHP_PROTO_TSRMLS_DC) {
-  upb_fieldtype_t type = upb_fielddef_type(field);
-  zend_class_entry* ce = NULL;
-  if (!native_slot_is_default(type, from_memory)) {
-    switch (type) {
-#define CASE_TYPE(upb_type, c_type)                        \
-  case UPB_TYPE_##upb_type: {                              \
-    DEREF(to_memory, c_type) = DEREF(from_memory, c_type); \
-    break;                                                 \
-  }
-      CASE_TYPE(INT32, int32_t)
-      CASE_TYPE(UINT32, uint32_t)
-      CASE_TYPE(ENUM, int32_t)
-      CASE_TYPE(INT64, int64_t)
-      CASE_TYPE(UINT64, uint64_t)
-      CASE_TYPE(FLOAT, float)
-      CASE_TYPE(DOUBLE, double)
-      CASE_TYPE(BOOL, int8_t)
-
-#undef CASE_TYPE
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES:
-        native_slot_set(type, NULL, value_memory(field, to_memory),
-                        CACHED_PTR_TO_ZVAL_PTR(DEREF(
-                            from_memory, CACHED_VALUE*)) PHP_PROTO_TSRMLS_CC);
-        break;
-      case UPB_TYPE_MESSAGE: {
-        const upb_msgdef* msg = upb_fielddef_msgsubdef(field);
-        Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msg));
-        ce = desc->klass;
-        if (native_slot_is_default(type, to_memory)) {
-#if PHP_MAJOR_VERSION < 7
-          SEPARATE_ZVAL_IF_NOT_REF((zval**)value_memory(field, to_memory));
-#endif
-          CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(
-              CACHED_PTR_TO_ZVAL_PTR(DEREF(to_memory, CACHED_VALUE*)), ce);
-          MessageHeader* submsg =
-              UNBOX(MessageHeader,
-                    CACHED_PTR_TO_ZVAL_PTR(DEREF(to_memory, CACHED_VALUE*)));
-          custom_data_init(ce, submsg PHP_PROTO_TSRMLS_CC);
-        }
-
-        MessageHeader* sub_from =
-            UNBOX(MessageHeader,
-                  CACHED_PTR_TO_ZVAL_PTR(DEREF(from_memory, CACHED_VALUE*)));
-        MessageHeader* sub_to =
-            UNBOX(MessageHeader,
-                  CACHED_PTR_TO_ZVAL_PTR(DEREF(to_memory, CACHED_VALUE*)));
-
-        layout_merge(desc->layout, sub_from, sub_to PHP_PROTO_TSRMLS_CC);
-        break;
-      }
-    }
-  }
-}
-
-static void native_slot_merge_by_array(const upb_fielddef* field, const void* from_memory,
-                         void* to_memory PHP_PROTO_TSRMLS_DC) {
-  upb_fieldtype_t type = upb_fielddef_type(field);
-  switch (type) {
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-#if PHP_MAJOR_VERSION < 7
-      MAKE_STD_ZVAL(DEREF(to_memory, zval*));
-      PHP_PROTO_ZVAL_STRINGL(DEREF(to_memory, zval*),
-                             Z_STRVAL_P(*(zval**)from_memory),
-                             Z_STRLEN_P(*(zval**)from_memory), 1);
-#else
-      DEREF(to_memory, zend_string*) =
-          zend_string_dup(*(zend_string**)from_memory, 0);
-#endif
-      break;
-    }
-    case UPB_TYPE_MESSAGE: {
-      const upb_msgdef* msg = upb_fielddef_msgsubdef(field);
-      Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msg));
-      zend_class_entry* ce = desc->klass;
-#if PHP_MAJOR_VERSION < 7
-      MAKE_STD_ZVAL(DEREF(to_memory, zval*));
-      CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(DEREF(to_memory, zval*), ce);
-#else
-      DEREF(to_memory, zend_object*) = ce->create_object(ce TSRMLS_CC);
-#endif
-      MessageHeader* sub_from = UNBOX_HASHTABLE_VALUE(
-          MessageHeader, DEREF(from_memory, PHP_PROTO_HASHTABLE_VALUE));
-      MessageHeader* sub_to = UNBOX_HASHTABLE_VALUE(
-          MessageHeader, DEREF(to_memory, PHP_PROTO_HASHTABLE_VALUE));
-      custom_data_init(ce, sub_to PHP_PROTO_TSRMLS_CC);
-
-      layout_merge(desc->layout, sub_from, sub_to PHP_PROTO_TSRMLS_CC);
-      break;
-    }
-    default:
-      native_slot_merge(field, from_memory, to_memory PHP_PROTO_TSRMLS_CC);
-      break;
-  }
-}
-
-void layout_merge(MessageLayout* layout, MessageHeader* from,
-                  MessageHeader* to PHP_PROTO_TSRMLS_DC) {
-  int i, j;
-  upb_msg_field_iter it;
-
-  for (upb_msg_field_begin(&it, layout->msgdef), i = 0; !upb_msg_field_done(&it);
-       upb_msg_field_next(&it), i++) {
-    const upb_fielddef* field = upb_msg_iter_field(&it);
-
-    void* to_memory = slot_memory(layout, message_data(to), field);
-    void* from_memory = slot_memory(layout, message_data(from), field);
-
-    if (upb_fielddef_containingoneof(field)) {
-      uint32_t oneof_case_offset =
-          layout->fields[upb_fielddef_index(field)].case_offset;
-      // For a oneof, check that this field is actually present -- skip all the
-      // below if not.
-      if (DEREF((message_data(from) + oneof_case_offset), uint32_t) !=
-          upb_fielddef_number(field)) {
-        continue;
-      }
-      uint32_t* from_oneof_case = slot_oneof_case(layout, message_data(from), field);
-      uint32_t* to_oneof_case = slot_oneof_case(layout, message_data(to), field);
-
-      // For non-singular fields, the related memory needs to point to the
-      // actual zval in properties table first.
-      switch (upb_fielddef_type(field)) {
-        case UPB_TYPE_MESSAGE:
-        case UPB_TYPE_STRING:
-        case UPB_TYPE_BYTES: {
-          int property_cache_index =
-              layout->fields[upb_fielddef_index(field)].cache_index;
-          DEREF(to_memory, CACHED_VALUE*) =
-              OBJ_PROP(&to->std, property_cache_index);
-          break;
-        }
-        default:
-          break;
-      }
-
-      *to_oneof_case = *from_oneof_case;
-
-      // Otherwise, fall through to the appropriate singular-field handler
-      // below.
-    }
-
-    if (is_map_field(field)) {
-      int size, key_length, value_length;
-      MapIter map_it;
-
-      zval* to_map_php =
-          CACHED_PTR_TO_ZVAL_PTR(DEREF(to_memory, CACHED_VALUE*));
-      zval* from_map_php =
-          CACHED_PTR_TO_ZVAL_PTR(DEREF(from_memory, CACHED_VALUE*));
-      Map* to_map = UNBOX(Map, to_map_php);
-      Map* from_map = UNBOX(Map, from_map_php);
-
-      size = upb_strtable_count(&from_map->table);
-      if (size == 0) continue;
-
-      const upb_msgdef *mapentry_def = upb_fielddef_msgsubdef(field);
-      const upb_fielddef *value_field = upb_msgdef_itof(mapentry_def, 2);
-
-      for (map_begin(from_map_php, &map_it TSRMLS_CC); !map_done(&map_it);
-           map_next(&map_it)) {
-        const char* key = map_iter_key(&map_it, &key_length);
-        upb_value from_value = map_iter_value(&map_it, &value_length);
-        upb_value to_value;
-        void* from_mem = upb_value_memory(&from_value);
-        void* to_mem = upb_value_memory(&to_value);
-        memset(to_mem, 0, native_slot_size(to_map->value_type));
-
-        native_slot_merge_by_array(value_field, from_mem,
-                                   to_mem PHP_PROTO_TSRMLS_CC);
-
-        map_index_set(to_map, key, key_length, to_value);
-      }
-
-    } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
-      zval* to_array_php = CACHED_PTR_TO_ZVAL_PTR(DEREF(to_memory, CACHED_VALUE*));
-      zval* from_array_php = CACHED_PTR_TO_ZVAL_PTR(DEREF(from_memory, CACHED_VALUE*));
-      RepeatedField* to_array = UNBOX(RepeatedField, to_array_php);
-      RepeatedField* from_array = UNBOX(RepeatedField, from_array_php);
-
-      int size = zend_hash_num_elements(PHP_PROTO_HASH_OF(from_array->array));
-      if (size > 0) {
-        for (j = 0; j < size; j++) {
-          void* from_memory = NULL;
-          void* to_memory =
-              ALLOC_N(char, native_slot_size(upb_fielddef_type(field)));
-          memset(to_memory, 0, native_slot_size(upb_fielddef_type(field)));
-
-          if (to_array->type == UPB_TYPE_MESSAGE) {
-            php_proto_zend_hash_index_find_zval(
-                PHP_PROTO_HASH_OF(from_array->array), j, (void**)&from_memory);
-#if PHP_MAJOR_VERSION >= 7
-            from_memory = &Z_OBJ_P((zval*)from_memory);
-#endif
-          } else {
-            php_proto_zend_hash_index_find_mem(
-                PHP_PROTO_HASH_OF(from_array->array), j, (void**)&from_memory);
-          }
-
-          native_slot_merge_by_array(field, from_memory,
-                                     to_memory PHP_PROTO_TSRMLS_CC);
-          repeated_field_push_native(to_array, to_memory);
-          FREE(to_memory);
-        }
-      }
-    } else {
-      native_slot_merge(field, from_memory, to_memory PHP_PROTO_TSRMLS_CC);
-    }
-  }
-}
-
-const char* layout_get_oneof_case(MessageLayout* layout, const void* storage,
-                                  const upb_oneofdef* oneof TSRMLS_DC) {
-  upb_oneof_iter i;
-  const upb_fielddef* first_field;
-
-  // Oneof is guaranteed to have at least one field. Get the first field.
-  for(upb_oneof_begin(&i, oneof); !upb_oneof_done(&i); upb_oneof_next(&i)) {
-    first_field = upb_oneof_iter_field(&i);
-    break;
-  }
-
-  uint32_t* oneof_case = slot_oneof_case(layout, storage, first_field);
-  if (*oneof_case == 0) {
-    return "";
-  }
-  const upb_fielddef* field = upb_oneofdef_itof(oneof, *oneof_case);
-  return upb_fielddef_name(field);
-}
diff --git a/php/ext/google/protobuf/test.php b/php/ext/google/protobuf/test.php
new file mode 100644
index 0000000..6bbadd4
--- /dev/null
+++ b/php/ext/google/protobuf/test.php
@@ -0,0 +1,15 @@
+<?php
+
+
+namespace Google\Protobuf;
+
+$pool = get_generated_pool();
+$pool->addMessage("TestMessage")
+    ->optional("optional_int32_a", "int32", 1)
+    ->optional("optional_int32_b", "int32", 2)
+    ->finalizeToPool()
+    ->finalize();
+
+$test_message = new \TestMessage();
+
+?>
diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c
deleted file mode 100644
index 85f5051..0000000
--- a/php/ext/google/protobuf/type_check.c
+++ /dev/null
@@ -1,575 +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.
-
-#include <Zend/zend_operators.h>
-
-#include "protobuf.h"
-#include "utf8.h"
-
-static zend_class_entry* util_type;
-static const char int64_min_digits[] = "9223372036854775808";
-
-ZEND_BEGIN_ARG_INFO_EX(arg_check_optional, 0, 0, 1)
-  ZEND_ARG_INFO(1, val)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arg_check_message, 0, 0, 2)
-  ZEND_ARG_INFO(1, val)
-  ZEND_ARG_INFO(0, klass)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arg_check_repeated, 0, 0, 2)
-  ZEND_ARG_INFO(1, val)
-  ZEND_ARG_INFO(0, type)
-  ZEND_ARG_INFO(0, klass)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arg_check_map, 0, 0, 3)
-  ZEND_ARG_INFO(1, val)
-  ZEND_ARG_INFO(0, key_type)
-  ZEND_ARG_INFO(0, value_type)
-  ZEND_ARG_INFO(0, klass)
-ZEND_END_ARG_INFO()
-
-static zend_function_entry util_methods[] = {
-  PHP_ME(Util, checkInt32,  arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkUint32, arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkInt64,  arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkUint64, arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkEnum,   arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkFloat,  arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkDouble, arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkBool,   arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkString, arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkBytes,  arg_check_optional, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkMessage, arg_check_message, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkMapField,    arg_check_map, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  PHP_ME(Util, checkRepeatedField, arg_check_repeated,
-         ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-  ZEND_FE_END
-};
-
-void util_init(TSRMLS_D) {
-  zend_class_entry class_type;
-  INIT_CLASS_ENTRY(class_type, "Google\\Protobuf\\Internal\\GPBUtil",
-                   util_methods);
-  util_type = zend_register_internal_class(&class_type TSRMLS_CC);
-}
-
-// -----------------------------------------------------------------------------
-// Type checking/conversion.
-// -----------------------------------------------------------------------------
-
-// This is modified from is_numeric_string in zend_operators.h. The behavior of 
-// this function is the same as is_numeric_string, except that this takes
-// int64_t as input instead of long.
-static zend_uchar convert_numeric_string(
-    const char *str, int length, int64_t *lval, double *dval) {
-  const char *ptr;
-  int base = 10, digits = 0, dp_or_e = 0;
-  double local_dval = 0.0;
-  zend_uchar type;
-
-  if (length == 0) {
-    return IS_NULL;
-  }
-
-  while (*str == ' ' || *str == '\t' || *str == '\n' || 
-         *str == '\r' || *str == '\v' || *str == '\f') {
-    str++;
-    length--;
-  }
-  ptr = str;
-
-  if (*ptr == '-' || *ptr == '+') {
-    ptr++;
-  }
-
-  if (ZEND_IS_DIGIT(*ptr)) {
-    // Handle hex numbers
-    // str is used instead of ptr to disallow signs and keep old behavior.
-    if (length > 2 && *str == '0' && (str[1] == 'x' || str[1] == 'X')) {
-      base = 16;
-      ptr += 2;
-    }
-
-    // Skip any leading 0s.
-    while (*ptr == '0') {
-      ptr++;
-    }
-
-    // Count the number of digits. If a decimal point/exponent is found,
-    // it's a double. Otherwise, if there's a dval or no need to check for
-    // a full match, stop when there are too many digits for a int64 */
-    for (type = IS_LONG;
-        !(digits >= MAX_LENGTH_OF_INT64 && dval);
-        digits++, ptr++) {
-check_digits:
-      if (ZEND_IS_DIGIT(*ptr) || (base == 16 && ZEND_IS_XDIGIT(*ptr))) {
-        continue;
-      } else if (base == 10) {
-        if (*ptr == '.' && dp_or_e < 1) {
-          goto process_double;
-        } else if ((*ptr == 'e' || *ptr == 'E') && dp_or_e < 2) {
-          const char *e = ptr + 1;
-
-          if (*e == '-' || *e == '+') {
-            ptr = e++;
-          }
-          if (ZEND_IS_DIGIT(*e)) {
-            goto process_double;
-          }
-        }
-      }
-      break;
-    }
-
-    if (base == 10) {
-      if (digits >= MAX_LENGTH_OF_INT64) {
-        dp_or_e = -1;
-        goto process_double;
-      }
-    } else if (!(digits < SIZEOF_INT64 * 2 ||
-               (digits == SIZEOF_INT64 * 2 && ptr[-digits] <= '7'))) {
-      if (dval) {
-        local_dval = zend_hex_strtod(str, &ptr);
-      }
-      type = IS_DOUBLE;
-    }
-  } else if (*ptr == '.' && ZEND_IS_DIGIT(ptr[1])) {
-process_double:
-    type = IS_DOUBLE;
-
-    // If there's a dval, do the conversion; else continue checking
-    // the digits if we need to check for a full match.
-    if (dval) {
-      local_dval = zend_strtod(str, &ptr);
-    } else if (dp_or_e != -1) {
-      dp_or_e = (*ptr++ == '.') ? 1 : 2;
-      goto check_digits;
-    }
-  } else {
-    return IS_NULL;
-  }
-  if (ptr != str + length) {
-    zend_error(E_NOTICE, "A non well formed numeric value encountered");
-    return 0;
-  }
-
-  if (type == IS_LONG) {
-    if (digits == MAX_LENGTH_OF_INT64 - 1) {
-      int cmp = strcmp(&ptr[-digits], int64_min_digits);
-
-      if (!(cmp < 0 || (cmp == 0 && *str == '-'))) {
-        if (dval) {
-          *dval = zend_strtod(str, NULL);
-        }
-
-	return IS_DOUBLE;
-      }
-    }
-    if (lval) {
-      *lval = strtoll(str, NULL, base);
-    }
-    return IS_LONG;
-  } else {
-    if (dval) {
-      *dval = local_dval;
-    }
-    return IS_DOUBLE;
-  }
-}
-
-#define CONVERT_TO_INTEGER(type)                                             \
-  static bool convert_int64_to_##type(int64_t val, type##_t* type##_value) { \
-    *type##_value = (type##_t)val;                                           \
-    return true;                                                             \
-  }                                                                          \
-                                                                             \
-  static bool convert_double_to_##type(double val, type##_t* type##_value) { \
-    *type##_value = (type##_t)zend_dval_to_lval(val);                        \
-    return true;                                                             \
-  }                                                                          \
-                                                                             \
-  static bool convert_string_to_##type(const char* val, int len,             \
-                                       type##_t* type##_value) {             \
-    int64_t lval;                                                            \
-    double dval;                                                             \
-                                                                             \
-    switch (convert_numeric_string(val, len, &lval, &dval)) {                \
-      case IS_DOUBLE: {                                                      \
-        return convert_double_to_##type(dval, type##_value);                 \
-      }                                                                      \
-      case IS_LONG: {                                                        \
-        return convert_int64_to_##type(lval, type##_value);                  \
-      }                                                                      \
-      default:                                                               \
-        zend_error(E_USER_ERROR,                                             \
-                   "Given string value cannot be converted to integer.");    \
-        return false;                                                        \
-    }                                                                        \
-  }                                                                          \
-                                                                             \
-  bool protobuf_convert_to_##type(zval* from, type##_t* to) {                \
-    switch (Z_TYPE_P(from)) {                                                \
-      case IS_LONG: {                                                        \
-        return convert_int64_to_##type(Z_LVAL_P(from), to);                  \
-      }                                                                      \
-      case IS_DOUBLE: {                                                      \
-        return convert_double_to_##type(Z_DVAL_P(from), to);                 \
-      }                                                                      \
-      case IS_STRING: {                                                      \
-        return convert_string_to_##type(Z_STRVAL_P(from), Z_STRLEN_P(from),  \
-                                        to);                                 \
-      }                                                                      \
-      default: {                                                             \
-        zend_error(E_USER_ERROR,                                             \
-                   "Given value cannot be converted to integer.");           \
-        return false;                                                        \
-      }                                                                      \
-    }                                                                        \
-    return false;                                                            \
-  }
-
-CONVERT_TO_INTEGER(int32);
-CONVERT_TO_INTEGER(uint32);
-CONVERT_TO_INTEGER(int64);
-CONVERT_TO_INTEGER(uint64);
-
-#undef CONVERT_TO_INTEGER
-
-#define CONVERT_TO_FLOAT(type)                                              \
-  static bool convert_int64_to_##type(int64_t val, type* type##_value) {    \
-    *type##_value = (type)val;                                              \
-    return true;                                                            \
-  }                                                                         \
-                                                                            \
-  static bool convert_double_to_##type(double val, type* type##_value) {    \
-    *type##_value = (type)val;                                              \
-    return true;                                                            \
-  }                                                                         \
-                                                                            \
-  static bool convert_string_to_##type(const char* val, int len,            \
-                                       type* type##_value) {                \
-    int64_t lval;                                                           \
-    double dval;                                                            \
-                                                                            \
-    switch (convert_numeric_string(val, len, &lval, &dval)) {               \
-      case IS_DOUBLE: {                                                     \
-        *type##_value = (type)dval;                                         \
-        return true;                                                        \
-      }                                                                     \
-      case IS_LONG: {                                                       \
-        *type##_value = (type)lval;                                         \
-        return true;                                                        \
-      }                                                                     \
-      default:                                                              \
-        zend_error(E_USER_ERROR,                                            \
-                   "Given string value cannot be converted to integer.");   \
-        return false;                                                       \
-    }                                                                       \
-  }                                                                         \
-                                                                            \
-  bool protobuf_convert_to_##type(zval* from, type* to) {                   \
-    switch (Z_TYPE_P(from)) {                                               \
-      case IS_LONG: {                                                       \
-        return convert_int64_to_##type(Z_LVAL_P(from), to);                 \
-      }                                                                     \
-      case IS_DOUBLE: {                                                     \
-        return convert_double_to_##type(Z_DVAL_P(from), to);                \
-      }                                                                     \
-      case IS_STRING: {                                                     \
-        return convert_string_to_##type(Z_STRVAL_P(from), Z_STRLEN_P(from), \
-                                        to);                                \
-      }                                                                     \
-      default: {                                                            \
-        zend_error(E_USER_ERROR,                                            \
-                   "Given value cannot be converted to integer.");          \
-        return false;                                                       \
-      }                                                                     \
-    }                                                                       \
-    return false;                                                           \
-  }
-
-CONVERT_TO_FLOAT(float);
-CONVERT_TO_FLOAT(double);
-
-#undef CONVERT_TO_FLOAT
-
-bool protobuf_convert_to_bool(zval* from, int8_t* to) {
-  switch (Z_TYPE_P(from)) {
-#if PHP_MAJOR_VERSION < 7
-    case IS_BOOL:
-      *to = (int8_t)Z_BVAL_P(from);
-      break;
-#else
-    case IS_TRUE:
-      *to = 1;
-      break;
-    case IS_FALSE:
-      *to = 0;
-      break;
-#endif
-    case IS_LONG:
-      *to = (int8_t)(Z_LVAL_P(from) != 0);
-      break;
-    case IS_DOUBLE:
-      *to = (int8_t)(Z_LVAL_P(from) != 0);
-      break;
-    case IS_STRING: {
-      char* strval = Z_STRVAL_P(from);
-
-      if (Z_STRLEN_P(from) == 0 ||
-          (Z_STRLEN_P(from) == 1 && Z_STRVAL_P(from)[0] == '0')) {
-        *to = 0;
-      } else {
-        *to = 1;
-      }
-    } break;
-    default: {
-      zend_error(E_USER_ERROR, "Given value cannot be converted to bool.");
-      return false;
-    }
-  }
-  return true;
-}
-
-bool protobuf_convert_to_string(zval* from) {
-  switch (Z_TYPE_P(from)) {
-    case IS_STRING: {
-      return true;
-    }
-#if PHP_MAJOR_VERSION < 7
-    case IS_BOOL:
-#else
-    case IS_TRUE:
-    case IS_FALSE:
-#endif
-    case IS_LONG:
-    case IS_DOUBLE: {
-      zval tmp;
-      php_proto_zend_make_printable_zval(from, &tmp);
-      ZVAL_COPY_VALUE(from, &tmp);
-      return true;
-    }
-    default:
-      zend_error(E_USER_ERROR, "Given value cannot be converted to string.");
-      return false;
-  }
-}
-
-// -----------------------------------------------------------------------------
-// PHP Functions.
-// -----------------------------------------------------------------------------
-
-// The implementation of type checking for primitive fields is empty. This is
-// because type checking is done when direct assigning message fields (e.g.,
-// foo->a = 1). Functions defined here are place holders in generated code for
-// pure PHP implementation (c extension and pure PHP share the same generated
-// code).
-#define PHP_TYPE_CHECK(type) \
-  PHP_METHOD(Util, check##type) {}
-
-PHP_TYPE_CHECK(Int32)
-PHP_TYPE_CHECK(Uint32)
-PHP_TYPE_CHECK(Int64)
-PHP_TYPE_CHECK(Uint64)
-PHP_TYPE_CHECK(Enum)
-PHP_TYPE_CHECK(Float)
-PHP_TYPE_CHECK(Double)
-PHP_TYPE_CHECK(Bool)
-PHP_TYPE_CHECK(String)
-PHP_TYPE_CHECK(Bytes)
-
-#undef PHP_TYPE_CHECK
-
-PHP_METHOD(Util, checkMessage) {
-  zval* val;
-  zend_class_entry* klass = NULL;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o!C", &val, &klass) ==
-      FAILURE) {
-    return;
-  }
-  if (val == NULL) {
-    RETURN_NULL();
-  }
-  if (!instanceof_function(Z_OBJCE_P(val), klass TSRMLS_CC)) {
-    zend_error(E_USER_ERROR, "Given value is not an instance of %s.",
-               klass->name);
-    return;
-  }
-  RETURN_ZVAL(val, 1, 0);
-}
-
-void check_repeated_field(const zend_class_entry* klass, PHP_PROTO_LONG type,
-                          zval* val, zval* return_value) {
-#if PHP_MAJOR_VERSION >= 7
-  if (Z_ISREF_P(val)) {
-    ZVAL_DEREF(val);
-  }
-#endif
-
-  TSRMLS_FETCH();
-  if (Z_TYPE_P(val) == IS_ARRAY) {
-    HashTable* table = HASH_OF(val);
-    HashPosition pointer;
-    void* memory;
-
-#if PHP_MAJOR_VERSION < 7
-    zval* repeated_field;
-    MAKE_STD_ZVAL(repeated_field);
-#else
-    zval repeated_field;
-#endif
-
-    repeated_field_create_with_type(repeated_field_type, to_fieldtype(type),
-                                    klass, &repeated_field TSRMLS_CC);
-
-    for (zend_hash_internal_pointer_reset_ex(table, &pointer);
-         php_proto_zend_hash_get_current_data_ex(table, (void**)&memory,
-                                                 &pointer) == SUCCESS;
-         zend_hash_move_forward_ex(table, &pointer)) {
-      repeated_field_handlers->write_dimension(
-          CACHED_TO_ZVAL_PTR(repeated_field), NULL,
-          CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC);
-    }
-
-    RETURN_ZVAL(CACHED_TO_ZVAL_PTR(repeated_field), 1, 1);
-
-  } else if (Z_TYPE_P(val) == IS_OBJECT) {
-    if (!instanceof_function(Z_OBJCE_P(val), repeated_field_type TSRMLS_CC)) {
-      zend_error(E_USER_ERROR, "Given value is not an instance of %s.",
-                 repeated_field_type->name);
-      return;
-    }
-    RepeatedField* intern = UNBOX(RepeatedField, val);
-    if (to_fieldtype(type) != intern->type) {
-      zend_error(E_USER_ERROR, "Incorrect repeated field type.");
-      return;
-    }
-    if (klass != NULL && intern->msg_ce != klass) {
-      zend_error(E_USER_ERROR,
-                 "Expect a repeated field of %s, but %s is given.", klass->name,
-                 intern->msg_ce->name);
-      return;
-    }
-    RETURN_ZVAL(val, 1, 0);
-  } else {
-    zend_error(E_USER_ERROR, "Incorrect repeated field type.");
-    return;
-  }
-}
-
-PHP_METHOD(Util, checkRepeatedField) {
-  zval* val;
-  PHP_PROTO_LONG type;
-  const zend_class_entry* klass = NULL;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl|C", &val, &type,
-                            &klass) == FAILURE) {
-    return;
-  }
-  RETURN_ZVAL(val, 1, 0);
-}
-
-void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type,
-                     PHP_PROTO_LONG value_type, zval* val, zval* return_value) {
-#if PHP_MAJOR_VERSION >= 7
-  if (Z_ISREF_P(val)) {
-    ZVAL_DEREF(val);
-  }
-#endif
-
-  TSRMLS_FETCH();
-  if (Z_TYPE_P(val) == IS_ARRAY) {
-    HashTable* table = Z_ARRVAL_P(val);
-    HashPosition pointer;
-    zval key;
-    void* value;
-
-#if PHP_MAJOR_VERSION < 7
-    zval* map_field;
-    MAKE_STD_ZVAL(map_field);
-#else
-    zval map_field;
-#endif
-
-    map_field_create_with_type(map_field_type, to_fieldtype(key_type),
-                               to_fieldtype(value_type), klass,
-                               &map_field TSRMLS_CC);
-
-    for (zend_hash_internal_pointer_reset_ex(table, &pointer);
-         php_proto_zend_hash_get_current_data_ex(table, (void**)&value,
-                                                 &pointer) == SUCCESS;
-         zend_hash_move_forward_ex(table, &pointer)) {
-      zend_hash_get_current_key_zval_ex(table, &key, &pointer);
-      map_field_handlers->write_dimension(
-          CACHED_TO_ZVAL_PTR(map_field), &key,
-          CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC);
-      zval_dtor(&key);
-    }
-
-    RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1);
-  } else if (Z_TYPE_P(val) == IS_OBJECT) {
-    if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) {
-      zend_error(E_USER_ERROR, "Given value is not an instance of %s.",
-                 map_field_type->name);
-      return;
-    }
-    Map* intern = UNBOX(Map, val);
-    if (to_fieldtype(key_type) != intern->key_type) {
-      zend_error(E_USER_ERROR, "Incorrect map field key type.");
-      return;
-    }
-    if (to_fieldtype(value_type) != intern->value_type) {
-      zend_error(E_USER_ERROR, "Incorrect map field value type.");
-      return;
-    }
-    if (klass != NULL && intern->msg_ce != klass) {
-      zend_error(E_USER_ERROR, "Expect a map field of %s, but %s is given.",
-                 klass->name, intern->msg_ce->name);
-      return;
-    }
-    RETURN_ZVAL(val, 1, 0);
-  } else {
-    zend_error(E_USER_ERROR, "Incorrect map field type.");
-    return;
-  }
-}
-
-PHP_METHOD(Util, checkMapField) {
-  zval* val;
-  PHP_PROTO_LONG key_type, value_type;
-  const zend_class_entry* klass = NULL;
-  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zll|C", &val, &key_type,
-                            &value_type, &klass) == FAILURE) {
-    return;
-  }
-  RETURN_ZVAL(val, 1, 0);
-}
diff --git a/php/ext/google/protobuf/upb.c b/php/ext/google/protobuf/upb.c
index c02a5ce..048a163 100644
--- a/php/ext/google/protobuf/upb.c
+++ b/php/ext/google/protobuf/upb.c
@@ -2,586 +2,6 @@
 #include "upb.h"
 
 
-/* Maps descriptor type -> upb field type.  */
-static const uint8_t upb_desctype_to_fieldtype[] = {
-  UPB_WIRE_TYPE_END_GROUP,  /* ENDGROUP */
-  UPB_TYPE_DOUBLE,          /* DOUBLE */
-  UPB_TYPE_FLOAT,           /* FLOAT */
-  UPB_TYPE_INT64,           /* INT64 */
-  UPB_TYPE_UINT64,          /* UINT64 */
-  UPB_TYPE_INT32,           /* INT32 */
-  UPB_TYPE_UINT64,          /* FIXED64 */
-  UPB_TYPE_UINT32,          /* FIXED32 */
-  UPB_TYPE_BOOL,            /* BOOL */
-  UPB_TYPE_STRING,          /* STRING */
-  UPB_TYPE_MESSAGE,         /* GROUP */
-  UPB_TYPE_MESSAGE,         /* MESSAGE */
-  UPB_TYPE_BYTES,           /* BYTES */
-  UPB_TYPE_UINT32,          /* UINT32 */
-  UPB_TYPE_ENUM,            /* ENUM */
-  UPB_TYPE_INT32,           /* SFIXED32 */
-  UPB_TYPE_INT64,           /* SFIXED64 */
-  UPB_TYPE_INT32,           /* SINT32 */
-  UPB_TYPE_INT64,           /* SINT64 */
-};
-
-/* Data pertaining to the parse. */
-typedef struct {
-  upb_env *env;
-  /* Current decoding pointer.  Points to the beginning of a field until we
-   * have finished decoding the whole field. */
-  const char *ptr;
-} upb_decstate;
-
-/* Data pertaining to a single message frame. */
-typedef struct {
-  const char *limit;
-  int32_t group_number;  /* 0 if we are not parsing a group. */
-
-  /* These members are unset for an unknown group frame. */
-  char *msg;
-  const upb_msglayout_msginit_v1 *m;
-} upb_decframe;
-
-#define CHK(x) if (!(x)) { return false; }
-
-static bool upb_skip_unknowngroup(upb_decstate *d, int field_number,
-                                  const char *limit);
-static bool upb_decode_message(upb_decstate *d, const char *limit,
-                               int group_number, char *msg,
-                               const upb_msglayout_msginit_v1 *l);
-
-static bool upb_decode_varint(const char **ptr, const char *limit,
-                              uint64_t *val) {
-  uint8_t byte;
-  int bitpos = 0;
-  const char *p = *ptr;
-  *val = 0;
-
-  do {
-    CHK(bitpos < 70 && p < limit);
-    byte = *p;
-    *val |= (uint64_t)(byte & 0x7F) << bitpos;
-    p++;
-    bitpos += 7;
-  } while (byte & 0x80);
-
-  *ptr = p;
-  return true;
-}
-
-static bool upb_decode_varint32(const char **ptr, const char *limit,
-                                uint32_t *val) {
-  uint64_t u64;
-  CHK(upb_decode_varint(ptr, limit, &u64) && u64 <= UINT32_MAX);
-  *val = u64;
-  return true;
-}
-
-static bool upb_decode_64bit(const char **ptr, const char *limit,
-                             uint64_t *val) {
-  CHK(limit - *ptr >= 8);
-  memcpy(val, *ptr, 8);
-  *ptr += 8;
-  return true;
-}
-
-static bool upb_decode_32bit(const char **ptr, const char *limit,
-                             uint32_t *val) {
-  CHK(limit - *ptr >= 4);
-  memcpy(val, *ptr, 4);
-  *ptr += 4;
-  return true;
-}
-
-static bool upb_decode_tag(const char **ptr, const char *limit,
-                           int *field_number, int *wire_type) {
-  uint32_t tag = 0;
-  CHK(upb_decode_varint32(ptr, limit, &tag));
-  *field_number = tag >> 3;
-  *wire_type = tag & 7;
-  return true;
-}
-
-static int32_t upb_zzdecode_32(uint32_t n) {
-  return (n >> 1) ^ -(int32_t)(n & 1);
-}
-
-static int64_t upb_zzdecode_64(uint64_t n) {
-  return (n >> 1) ^ -(int64_t)(n & 1);
-}
-
-static bool upb_decode_string(const char **ptr, const char *limit,
-                              upb_stringview *val) {
-  uint32_t len;
-
-  CHK(upb_decode_varint32(ptr, limit, &len) &&
-      len < INT32_MAX &&
-      limit - *ptr >= (int32_t)len);
-
-  *val = upb_stringview_make(*ptr, len);
-  *ptr += len;
-  return true;
-}
-
-static void upb_set32(void *msg, size_t ofs, uint32_t val) {
-  memcpy((char*)msg + ofs, &val, sizeof(val));
-}
-
-static bool upb_append_unknown(upb_decstate *d, upb_decframe *frame,
-                               const char *start) {
-  UPB_UNUSED(d);
-  UPB_UNUSED(frame);
-  UPB_UNUSED(start);
-  return true;
-}
-
-static bool upb_skip_unknownfielddata(upb_decstate *d, upb_decframe *frame,
-                                      int field_number, int wire_type) {
-  switch (wire_type) {
-    case UPB_WIRE_TYPE_VARINT: {
-      uint64_t val;
-      return upb_decode_varint(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_32BIT: {
-      uint32_t val;
-      return upb_decode_32bit(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_64BIT: {
-      uint64_t val;
-      return upb_decode_64bit(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_DELIMITED: {
-      upb_stringview val;
-      return upb_decode_string(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_START_GROUP:
-      return upb_skip_unknowngroup(d, field_number, frame->limit);
-    case UPB_WIRE_TYPE_END_GROUP:
-      CHK(field_number == frame->group_number);
-      frame->limit = d->ptr;
-      return true;
-  }
-  return false;
-}
-
-static bool upb_array_grow(upb_array *arr, size_t elements) {
-  size_t needed = arr->len + elements;
-  size_t new_size = UPB_MAX(arr->size, 8);
-  size_t new_bytes;
-  size_t old_bytes;
-  void *new_data;
-
-  while (new_size < needed) {
-    new_size *= 2;
-  }
-
-  old_bytes = arr->len * arr->element_size;
-  new_bytes = new_size * arr->element_size;
-  new_data = upb_realloc(arr->alloc, arr->data, old_bytes, new_bytes);
-  CHK(new_data);
-
-  arr->data = new_data;
-  arr->size = new_size;
-  return true;
-}
-
-static void *upb_array_reserve(upb_array *arr, size_t elements) {
-  if (arr->size - arr->len < elements) {
-    CHK(upb_array_grow(arr, elements));
-  }
-  return (char*)arr->data + (arr->len * arr->element_size);
-}
-
-static void *upb_array_add(upb_array *arr, size_t elements) {
-  void *ret = upb_array_reserve(arr, elements);
-  arr->len += elements;
-  return ret;
-}
-
-static upb_array *upb_getarr(upb_decframe *frame,
-                             const upb_msglayout_fieldinit_v1 *field) {
-  UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
-  return *(upb_array**)&frame->msg[field->offset];
-}
-
-static upb_array *upb_getorcreatearr(upb_decstate *d,
-                                     upb_decframe *frame,
-                                     const upb_msglayout_fieldinit_v1 *field) {
-  upb_array *arr = upb_getarr(frame, field);
-
-  if (!arr) {
-    arr = upb_env_malloc(d->env, sizeof(*arr));
-    if (!arr) {
-      return NULL;
-    }
-    upb_array_init(arr, upb_desctype_to_fieldtype[field->type],
-                   upb_arena_alloc(upb_env_arena(d->env)));
-    *(upb_array**)&frame->msg[field->offset] = arr;
-  }
-
-  return arr;
-}
-
-static void upb_sethasbit(upb_decframe *frame,
-                          const upb_msglayout_fieldinit_v1 *field) {
-  UPB_ASSERT(field->hasbit != UPB_NO_HASBIT);
-  frame->msg[field->hasbit / 8] |= (1 << (field->hasbit % 8));
-}
-
-static void upb_setoneofcase(upb_decframe *frame,
-                             const upb_msglayout_fieldinit_v1 *field) {
-  UPB_ASSERT(field->oneof_index != UPB_NOT_IN_ONEOF);
-  upb_set32(frame->msg, frame->m->oneofs[field->oneof_index].case_offset,
-            field->number);
-}
-
-static char *upb_decode_prepareslot(upb_decstate *d,
-                                    upb_decframe *frame,
-                                    const upb_msglayout_fieldinit_v1 *field) {
-  char *field_mem = frame->msg + field->offset;
-  upb_array *arr;
-
-  if (field->label == UPB_LABEL_REPEATED) {
-    arr = upb_getorcreatearr(d, frame, field);
-    field_mem = upb_array_reserve(arr, 1);
-  }
-
-  return field_mem;
-}
-
-static void upb_decode_setpresent(upb_decframe *frame,
-                                  const upb_msglayout_fieldinit_v1 *field) {
-  if (field->label == UPB_LABEL_REPEATED) {
-   upb_array *arr = upb_getarr(frame, field);
-   UPB_ASSERT(arr->len < arr->size);
-   arr->len++;
-  } else if (field->oneof_index != UPB_NOT_IN_ONEOF) {
-    upb_setoneofcase(frame, field);
-  } else if (field->hasbit != UPB_NO_HASBIT) {
-    upb_sethasbit(frame, field);
-  }
-}
-
-static bool upb_decode_submsg(upb_decstate *d,
-                              upb_decframe *frame,
-                              const char *limit,
-                              const upb_msglayout_fieldinit_v1 *field,
-                              int group_number) {
-  char *submsg = *(void**)&frame->msg[field->offset];
-  const upb_msglayout_msginit_v1 *subm;
-
-  UPB_ASSERT(field->submsg_index != UPB_NO_SUBMSG);
-  subm = frame->m->submsgs[field->submsg_index];
-  UPB_ASSERT(subm);
-
-  if (!submsg) {
-    submsg = upb_env_malloc(d->env, upb_msg_sizeof((upb_msglayout *)subm));
-    CHK(submsg);
-    submsg = upb_msg_init(
-        submsg, (upb_msglayout*)subm, upb_arena_alloc(upb_env_arena(d->env)));
-    *(void**)&frame->msg[field->offset] = submsg;
-  }
-
-  upb_decode_message(d, limit, group_number, submsg, subm);
-
-  return true;
-}
-
-static bool upb_decode_varintfield(upb_decstate *d, upb_decframe *frame,
-                                   const char *field_start,
-                                   const upb_msglayout_fieldinit_v1 *field) {
-  uint64_t val;
-  void *field_mem;
-
-  field_mem = upb_decode_prepareslot(d, frame, field);
-  CHK(field_mem);
-  CHK(upb_decode_varint(&d->ptr, frame->limit, &val));
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      memcpy(field_mem, &val, sizeof(val));
-      break;
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM: {
-      uint32_t val32 = val;
-      memcpy(field_mem, &val32, sizeof(val32));
-      break;
-    }
-    case UPB_DESCRIPTOR_TYPE_BOOL: {
-      bool valbool = val != 0;
-      memcpy(field_mem, &valbool, sizeof(valbool));
-      break;
-    }
-    case UPB_DESCRIPTOR_TYPE_SINT32: {
-      int32_t decoded = upb_zzdecode_32(val);
-      memcpy(field_mem, &decoded, sizeof(decoded));
-      break;
-    }
-    case UPB_DESCRIPTOR_TYPE_SINT64: {
-      int64_t decoded = upb_zzdecode_64(val);
-      memcpy(field_mem, &decoded, sizeof(decoded));
-      break;
-    }
-    default:
-      return upb_append_unknown(d, frame, field_start);
-  }
-
-  upb_decode_setpresent(frame, field);
-  return true;
-}
-
-static bool upb_decode_64bitfield(upb_decstate *d, upb_decframe *frame,
-                                  const char *field_start,
-                                  const upb_msglayout_fieldinit_v1 *field) {
-  void *field_mem;
-  uint64_t val;
-
-  field_mem = upb_decode_prepareslot(d, frame, field);
-  CHK(field_mem);
-  CHK(upb_decode_64bit(&d->ptr, frame->limit, &val));
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-      memcpy(field_mem, &val, sizeof(val));
-      break;
-    default:
-      return upb_append_unknown(d, frame, field_start);
-  }
-
-  upb_decode_setpresent(frame, field);
-  return true;
-}
-
-static bool upb_decode_32bitfield(upb_decstate *d, upb_decframe *frame,
-                                  const char *field_start,
-                                  const upb_msglayout_fieldinit_v1 *field) {
-  void *field_mem;
-  uint32_t val;
-
-  field_mem = upb_decode_prepareslot(d, frame, field);
-  CHK(field_mem);
-  CHK(upb_decode_32bit(&d->ptr, frame->limit, &val));
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      memcpy(field_mem, &val, sizeof(val));
-      break;
-    default:
-      return upb_append_unknown(d, frame, field_start);
-  }
-
-  upb_decode_setpresent(frame, field);
-  return true;
-}
-
-static bool upb_decode_fixedpacked(upb_array *arr, upb_stringview data,
-                                   int elem_size) {
-  int elements = data.size / elem_size;
-  void *field_mem;
-
-  CHK((size_t)(elements * elem_size) == data.size);
-  field_mem = upb_array_add(arr, elements);
-  CHK(field_mem);
-  memcpy(field_mem, data.data, data.size);
-  return true;
-}
-
-static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
-                               const char *field_start,
-                               const upb_msglayout_fieldinit_v1 *field,
-                               upb_stringview val) {
-  upb_array *arr = upb_getorcreatearr(d, frame, field);
-
-#define VARINT_CASE(ctype, decode) { \
-  const char *ptr = val.data; \
-  const char *limit = ptr + val.size; \
-  while (ptr < limit) { \
-    uint64_t val; \
-    void *field_mem; \
-    ctype decoded; \
-    CHK(upb_decode_varint(&ptr, limit, &val)); \
-    decoded = (decode)(val); \
-    field_mem = upb_array_add(arr, 1); \
-    CHK(field_mem); \
-    memcpy(field_mem, &decoded, sizeof(ctype)); \
-  } \
-  return true; \
-}
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_STRING:
-    case UPB_DESCRIPTOR_TYPE_BYTES: {
-      void *field_mem = upb_array_add(arr, 1);
-      CHK(field_mem);
-      memcpy(field_mem, &val, sizeof(val));
-      return true;
-    }
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      return upb_decode_fixedpacked(arr, val, sizeof(int32_t));
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-      return upb_decode_fixedpacked(arr, val, sizeof(int64_t));
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM:
-      /* TODO: proto2 enum field that isn't in the enum. */
-      VARINT_CASE(uint32_t, uint32_t);
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      VARINT_CASE(uint64_t, uint64_t);
-    case UPB_DESCRIPTOR_TYPE_BOOL:
-      VARINT_CASE(bool, bool);
-    case UPB_DESCRIPTOR_TYPE_SINT32:
-      VARINT_CASE(int32_t, upb_zzdecode_32);
-    case UPB_DESCRIPTOR_TYPE_SINT64:
-      VARINT_CASE(int64_t, upb_zzdecode_64);
-    case UPB_DESCRIPTOR_TYPE_MESSAGE:
-      CHK(val.size <= (size_t)(frame->limit - val.data));
-      return upb_decode_submsg(d, frame, val.data + val.size, field, 0);
-    case UPB_DESCRIPTOR_TYPE_GROUP:
-      return upb_append_unknown(d, frame, field_start);
-  }
-#undef VARINT_CASE
-  UPB_UNREACHABLE();
-}
-
-static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
-                                      const char *field_start,
-                                      const upb_msglayout_fieldinit_v1 *field) {
-  upb_stringview val;
-
-  CHK(upb_decode_string(&d->ptr, frame->limit, &val));
-
-  if (field->label == UPB_LABEL_REPEATED) {
-    return upb_decode_toarray(d, frame, field_start, field, val);
-  } else {
-    switch ((upb_descriptortype_t)field->type) {
-      case UPB_DESCRIPTOR_TYPE_STRING:
-      case UPB_DESCRIPTOR_TYPE_BYTES: {
-        void *field_mem = upb_decode_prepareslot(d, frame, field);
-        CHK(field_mem);
-        memcpy(field_mem, &val, sizeof(val));
-        break;
-      }
-      case UPB_DESCRIPTOR_TYPE_MESSAGE:
-        CHK(val.size <= (size_t)(frame->limit - val.data));
-        CHK(upb_decode_submsg(d, frame, val.data + val.size, field, 0));
-        break;
-      default:
-        /* TODO(haberman): should we accept the last element of a packed? */
-        return upb_append_unknown(d, frame, field_start);
-    }
-    upb_decode_setpresent(frame, field);
-    return true;
-  }
-}
-
-static const upb_msglayout_fieldinit_v1 *upb_find_field(
-    const upb_msglayout_msginit_v1 *l, uint32_t field_number) {
-  /* Lots of optimization opportunities here. */
-  int i;
-  for (i = 0; i < l->field_count; i++) {
-    if (l->fields[i].number == field_number) {
-      return &l->fields[i];
-    }
-  }
-
-  return NULL;  /* Unknown field. */
-}
-
-static bool upb_decode_field(upb_decstate *d, upb_decframe *frame) {
-  int field_number;
-  int wire_type;
-  const char *field_start = d->ptr;
-  const upb_msglayout_fieldinit_v1 *field;
-
-  CHK(upb_decode_tag(&d->ptr, frame->limit, &field_number, &wire_type));
-  field = upb_find_field(frame->m, field_number);
-
-  if (field) {
-    switch (wire_type) {
-      case UPB_WIRE_TYPE_VARINT:
-        return upb_decode_varintfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_32BIT:
-        return upb_decode_32bitfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_64BIT:
-        return upb_decode_64bitfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_DELIMITED:
-        return upb_decode_delimitedfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_START_GROUP:
-        CHK(field->type == UPB_DESCRIPTOR_TYPE_GROUP);
-        return upb_decode_submsg(d, frame, frame->limit, field, field_number);
-      case UPB_WIRE_TYPE_END_GROUP:
-        CHK(frame->group_number == field_number)
-        frame->limit = d->ptr;
-        return true;
-      default:
-        return false;
-    }
-  } else {
-    CHK(field_number != 0);
-    return upb_skip_unknownfielddata(d, frame, field_number, wire_type);
-  }
-}
-
-static bool upb_skip_unknowngroup(upb_decstate *d, int field_number,
-                                  const char *limit) {
-  upb_decframe frame;
-  frame.msg = NULL;
-  frame.m = NULL;
-  frame.group_number = field_number;
-  frame.limit = limit;
-
-  while (d->ptr < frame.limit) {
-    int wire_type;
-    int field_number;
-
-    CHK(upb_decode_tag(&d->ptr, frame.limit, &field_number, &wire_type));
-    CHK(upb_skip_unknownfielddata(d, &frame, field_number, wire_type));
-  }
-
-  return true;
-}
-
-static bool upb_decode_message(upb_decstate *d, const char *limit,
-                               int group_number, char *msg,
-                               const upb_msglayout_msginit_v1 *l) {
-  upb_decframe frame;
-  frame.group_number = group_number;
-  frame.limit = limit;
-  frame.msg = msg;
-  frame.m = l;
-
-  while (d->ptr < frame.limit) {
-    CHK(upb_decode_field(d, &frame));
-  }
-
-  return true;
-}
-
-bool upb_decode(upb_stringview buf, void *msg,
-                const upb_msglayout_msginit_v1 *l, upb_env *env) {
-  upb_decstate state;
-  state.ptr = buf.data;
-  state.env = env;
-
-  return upb_decode_message(&state, buf.data + buf.size, 0, msg, l);
-}
-
-#undef CHK
-
-
-#include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -591,7 +11,7 @@
 } str_t;
 
 static str_t *newstr(const char *data, size_t len) {
-  str_t *ret = upb_gmalloc(sizeof(*ret) + len);
+  str_t *ret = malloc(sizeof(*ret) + len);
   if (!ret) return NULL;
   ret->len = len;
   memcpy(ret->str, data, len);
@@ -599,7 +19,7 @@
   return ret;
 }
 
-static void freestr(str_t *s) { upb_gfree(s); }
+static void freestr(str_t *s) { free(s); }
 
 /* isalpha() etc. from <ctype.h> are locale-dependent, which we don't want. */
 static bool upb_isbetween(char c, char low, char high) {
@@ -644,22 +64,6 @@
   return !start;
 }
 
-static bool upb_isoneof(const upb_refcounted *def) {
-  return def->vtbl == &upb_oneofdef_vtbl;
-}
-
-static bool upb_isfield(const upb_refcounted *def) {
-  return def->vtbl == &upb_fielddef_vtbl;
-}
-
-static const upb_oneofdef *upb_trygetoneof(const upb_refcounted *def) {
-  return upb_isoneof(def) ? (const upb_oneofdef*)def : NULL;
-}
-
-static const upb_fielddef *upb_trygetfield(const upb_refcounted *def) {
-  return upb_isfield(def) ? (const upb_fielddef*)def : NULL;
-}
-
 
 /* upb_def ********************************************************************/
 
@@ -667,38 +71,28 @@
 
 const char *upb_def_fullname(const upb_def *d) { return d->fullname; }
 
-const char *upb_def_name(const upb_def *d) {
-  const char *p;
-
-  if (d->fullname == NULL) {
-    return NULL;
-  } else if ((p = strrchr(d->fullname, '.')) == NULL) {
-    /* No '.' in the name, return the full string. */
-    return d->fullname;
-  } else {
-    /* Return one past the last '.'. */
-    return p + 1;
-  }
-}
-
 bool upb_def_setfullname(upb_def *def, const char *fullname, upb_status *s) {
-  UPB_ASSERT(!upb_def_isfrozen(def));
-  if (!upb_isident(fullname, strlen(fullname), true, s)) {
-    return false;
-  }
-
-  fullname = upb_gstrdup(fullname);
-  if (!fullname) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-
-  upb_gfree((void*)def->fullname);
-  def->fullname = fullname;
+  assert(!upb_def_isfrozen(def));
+  if (!upb_isident(fullname, strlen(fullname), true, s)) return false;
+  free((void*)def->fullname);
+  def->fullname = upb_strdup(fullname);
   return true;
 }
 
-const upb_filedef *upb_def_file(const upb_def *d) { return d->file; }
+upb_def *upb_def_dup(const upb_def *def, const void *o) {
+  switch (def->type) {
+    case UPB_DEF_MSG:
+      return upb_msgdef_upcast_mutable(
+          upb_msgdef_dup(upb_downcast_msgdef(def), o));
+    case UPB_DEF_FIELD:
+      return upb_fielddef_upcast_mutable(
+          upb_fielddef_dup(upb_downcast_fielddef(def), o));
+    case UPB_DEF_ENUM:
+      return upb_enumdef_upcast_mutable(
+          upb_enumdef_dup(upb_downcast_enumdef(def), o));
+    default: assert(false); return NULL;
+  }
+}
 
 static bool upb_def_init(upb_def *def, upb_deftype_t type,
                          const struct upb_refcounted_vtbl *vtbl,
@@ -707,12 +101,11 @@
   def->type = type;
   def->fullname = NULL;
   def->came_from_user = false;
-  def->file = NULL;
   return true;
 }
 
 static void upb_def_uninit(upb_def *def) {
-  upb_gfree((void*)def->fullname);
+  free((void*)def->fullname);
 }
 
 static const char *msgdef_name(const upb_msgdef *m) {
@@ -767,14 +160,14 @@
     bool has_default_number = upb_fielddef_enumhasdefaultint32(f);
 
     /* Previously verified by upb_validate_enumdef(). */
-    UPB_ASSERT(upb_enumdef_numvals(upb_fielddef_enumsubdef(f)) > 0);
+    assert(upb_enumdef_numvals(upb_fielddef_enumsubdef(f)) > 0);
 
     /* We've already validated that we have an associated enumdef and that it
      * has at least one member, so at least one of these should be true.
      * Because if the user didn't set anything, we'll pick up the enum's
      * default, but if the user *did* set something we should at least pick up
      * the one they set (int32 or string). */
-    UPB_ASSERT(has_default_name || has_default_number);
+    assert(has_default_name || has_default_number);
 
     if (!has_default_name) {
       upb_status_seterrf(s,
@@ -830,7 +223,7 @@
 uint32_t field_rank(const upb_fielddef *f) {
   uint32_t ret = upb_fielddef_number(f);
   const uint32_t high_bit = 1 << 30;
-  UPB_ASSERT(ret < high_bit);
+  assert(ret < high_bit);
   if (!upb_fielddef_issubmsg(f))
     ret |= high_bit;
   return ret;
@@ -846,32 +239,20 @@
   /* Sort fields.  upb internally relies on UPB_TYPE_MESSAGE fields having the
    * lowest indexes, but we do not publicly guarantee this. */
   upb_msg_field_iter j;
-  upb_msg_oneof_iter k;
   int i;
   uint32_t selector;
   int n = upb_msgdef_numfields(m);
-  upb_fielddef **fields;
-
-  if (n == 0) {
-    m->selector_count = UPB_STATIC_SELECTOR_COUNT;
-    m->submsg_field_count = 0;
-    return true;
-  }
-
-  fields = upb_gmalloc(n * sizeof(*fields));
-  if (!fields) {
-    upb_upberr_setoom(s);
-    return false;
-  }
+  upb_fielddef **fields = malloc(n * sizeof(*fields));
+  if (!fields) return false;
 
   m->submsg_field_count = 0;
   for(i = 0, upb_msg_field_begin(&j, m);
       !upb_msg_field_done(&j);
       upb_msg_field_next(&j), i++) {
     upb_fielddef *f = upb_msg_iter_field(&j);
-    UPB_ASSERT(f->msg.def == m);
+    assert(f->msg.def == m);
     if (!upb_validate_field(f, s)) {
-      upb_gfree(fields);
+      free(fields);
       return false;
     }
     if (upb_fielddef_issubmsg(f)) {
@@ -905,7 +286,6 @@
     v = upb_value_bool(true);
     upb_inttable_insert(&t, UPB_STARTMSG_SELECTOR, v);
     upb_inttable_insert(&t, UPB_ENDMSG_SELECTOR, v);
-    upb_inttable_insert(&t, UPB_UNKNOWN_SELECTOR, v);
     for(upb_msg_field_begin(&j, m);
         !upb_msg_field_done(&j);
         upb_msg_field_next(&j)) {
@@ -932,19 +312,15 @@
 #undef TRY
 #endif
 
-  for(upb_msg_oneof_begin(&k, m), i = 0;
-      !upb_msg_oneof_done(&k);
-      upb_msg_oneof_next(&k), i++) {
-    upb_oneofdef *o = upb_msg_iter_oneof(&k);
-    o->index = i;
-  }
-
-  upb_gfree(fields);
+  free(fields);
   return true;
 }
 
-bool _upb_def_validate(upb_def *const*defs, size_t n, upb_status *s) {
-  size_t i;
+bool upb_def_freeze(upb_def *const* defs, int n, upb_status *s) {
+  int i;
+  int maxdepth;
+  bool ret;
+  upb_status_clear(s);
 
   /* First perform validation, in two passes so we can check that we have a
    * transitive closure without needing to search. */
@@ -957,23 +333,21 @@
     } else if (def->type == UPB_DEF_FIELD) {
       upb_status_seterrmsg(s, "standalone fielddefs can not be frozen");
       goto err;
+    } else if (def->type == UPB_DEF_ENUM) {
+      if (!upb_validate_enumdef(upb_dyncast_enumdef(def), s)) {
+        goto err;
+      }
     } else {
       /* Set now to detect transitive closure in the second pass. */
       def->came_from_user = true;
-
-      if (def->type == UPB_DEF_ENUM &&
-          !upb_validate_enumdef(upb_dyncast_enumdef(def), s)) {
-        goto err;
-      }
     }
   }
 
   /* Second pass of validation.  Also assign selector bases and indexes, and
    * compact tables. */
   for (i = 0; i < n; i++) {
-    upb_def *def = defs[i];
-    upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
-    upb_enumdef *e = upb_dyncast_enumdef_mutable(def);
+    upb_msgdef *m = upb_dyncast_msgdef_mutable(defs[i]);
+    upb_enumdef *e = upb_dyncast_enumdef_mutable(defs[i]);
     if (m) {
       upb_inttable_compact(&m->itof);
       if (!assign_msg_indices(m, s)) {
@@ -984,68 +358,46 @@
     }
   }
 
-  return true;
+  /* Def graph contains FieldDefs between each MessageDef, so double the
+   * limit. */
+  maxdepth = UPB_MAX_MESSAGE_DEPTH * 2;
+
+  /* Validation all passed; freeze the defs. */
+  ret = upb_refcounted_freeze((upb_refcounted * const *)defs, n, s, maxdepth);
+  assert(!(s && ret != upb_ok(s)));
+  return ret;
 
 err:
   for (i = 0; i < n; i++) {
-    upb_def *def = defs[i];
-    def->came_from_user = false;
+    defs[i]->came_from_user = false;
   }
-  UPB_ASSERT(!(s && upb_ok(s)));
+  assert(!(s && upb_ok(s)));
   return false;
 }
 
-bool upb_def_freeze(upb_def *const* defs, size_t n, upb_status *s) {
-  /* Def graph contains FieldDefs between each MessageDef, so double the
-   * limit. */
-  const size_t maxdepth = UPB_MAX_MESSAGE_DEPTH * 2;
-
-  if (!_upb_def_validate(defs, n, s)) {
-    return false;
-  }
-
-
-  /* Validation all passed; freeze the objects. */
-  return upb_refcounted_freeze((upb_refcounted *const*)defs, n, s, maxdepth);
-}
-
 
 /* upb_enumdef ****************************************************************/
 
-static void visitenum(const upb_refcounted *r, upb_refcounted_visit *visit,
-                      void *closure) {
-  const upb_enumdef *e = (const upb_enumdef*)r;
-  const upb_def *def = upb_enumdef_upcast(e);
-  if (upb_def_file(def)) {
-    visit(r, upb_filedef_upcast(upb_def_file(def)), closure);
-  }
-}
-
-static void freeenum(upb_refcounted *r) {
+static void upb_enumdef_free(upb_refcounted *r) {
   upb_enumdef *e = (upb_enumdef*)r;
   upb_inttable_iter i;
   upb_inttable_begin(&i, &e->iton);
   for( ; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    /* To clean up the upb_gstrdup() from upb_enumdef_addval(). */
-    upb_gfree(upb_value_getcstr(upb_inttable_iter_value(&i)));
+    /* To clean up the upb_strdup() from upb_enumdef_addval(). */
+    free(upb_value_getcstr(upb_inttable_iter_value(&i)));
   }
   upb_strtable_uninit(&e->ntoi);
   upb_inttable_uninit(&e->iton);
   upb_def_uninit(upb_enumdef_upcast_mutable(e));
-  upb_gfree(e);
+  free(e);
 }
 
-const struct upb_refcounted_vtbl upb_enumdef_vtbl = {&visitenum, &freeenum};
-
 upb_enumdef *upb_enumdef_new(const void *owner) {
-  upb_enumdef *e = upb_gmalloc(sizeof(*e));
+  static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_enumdef_free};
+  upb_enumdef *e = malloc(sizeof(*e));
   if (!e) return NULL;
-
-  if (!upb_def_init(upb_enumdef_upcast_mutable(e), UPB_DEF_ENUM,
-                    &upb_enumdef_vtbl, owner)) {
+  if (!upb_def_init(upb_enumdef_upcast_mutable(e), UPB_DEF_ENUM, &vtbl, owner))
     goto err2;
-  }
-
   if (!upb_strtable_init(&e->ntoi, UPB_CTYPE_INT32)) goto err2;
   if (!upb_inttable_init(&e->iton, UPB_CTYPE_CSTR)) goto err1;
   return e;
@@ -1053,10 +405,25 @@
 err1:
   upb_strtable_uninit(&e->ntoi);
 err2:
-  upb_gfree(e);
+  free(e);
   return NULL;
 }
 
+upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner) {
+  upb_enum_iter i;
+  upb_enumdef *new_e = upb_enumdef_new(owner);
+  if (!new_e) return NULL;
+  for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) {
+    bool success = upb_enumdef_addval(
+        new_e, upb_enum_iter_name(&i),upb_enum_iter_number(&i), NULL);
+    if (!success) {
+      upb_enumdef_unref(new_e, owner);
+      return NULL;
+    }
+  }
+  return new_e;
+}
+
 bool upb_enumdef_freeze(upb_enumdef *e, upb_status *status) {
   upb_def *d = upb_enumdef_upcast_mutable(e);
   return upb_def_freeze(&d, 1, status);
@@ -1066,10 +433,6 @@
   return upb_def_fullname(upb_enumdef_upcast(e));
 }
 
-const char *upb_enumdef_name(const upb_enumdef *e) {
-  return upb_def_name(upb_enumdef_upcast(e));
-}
-
 bool upb_enumdef_setfullname(upb_enumdef *e, const char *fullname,
                              upb_status *s) {
   return upb_def_setfullname(upb_enumdef_upcast_mutable(e), fullname, s);
@@ -1077,46 +440,37 @@
 
 bool upb_enumdef_addval(upb_enumdef *e, const char *name, int32_t num,
                         upb_status *status) {
-  char *name2;
-
   if (!upb_isident(name, strlen(name), false, status)) {
     return false;
   }
-
   if (upb_enumdef_ntoiz(e, name, NULL)) {
     upb_status_seterrf(status, "name '%s' is already defined", name);
     return false;
   }
-
   if (!upb_strtable_insert(&e->ntoi, name, upb_value_int32(num))) {
     upb_status_seterrmsg(status, "out of memory");
     return false;
   }
-
-  if (!upb_inttable_lookup(&e->iton, num, NULL)) {
-    name2 = upb_gstrdup(name);
-    if (!name2 || !upb_inttable_insert(&e->iton, num, upb_value_cstr(name2))) {
-      upb_status_seterrmsg(status, "out of memory");
-      upb_strtable_remove(&e->ntoi, name, NULL);
-      return false;
-    }
+  if (!upb_inttable_lookup(&e->iton, num, NULL) &&
+      !upb_inttable_insert(&e->iton, num, upb_value_cstr(upb_strdup(name)))) {
+    upb_status_seterrmsg(status, "out of memory");
+    upb_strtable_remove(&e->ntoi, name, NULL);
+    return false;
   }
-
   if (upb_enumdef_numvals(e) == 1) {
     bool ok = upb_enumdef_setdefault(e, num, NULL);
-    UPB_ASSERT(ok);
+    UPB_ASSERT_VAR(ok, ok);
   }
-
   return true;
 }
 
 int32_t upb_enumdef_default(const upb_enumdef *e) {
-  UPB_ASSERT(upb_enumdef_iton(e, e->defaultval));
+  assert(upb_enumdef_iton(e, e->defaultval));
   return e->defaultval;
 }
 
 bool upb_enumdef_setdefault(upb_enumdef *e, int32_t val, upb_status *s) {
-  UPB_ASSERT(!upb_enumdef_isfrozen(e));
+  assert(!upb_enumdef_isfrozen(e));
   if (!upb_enumdef_iton(e, val)) {
     upb_status_seterrf(s, "number '%d' is not in the enum.", val);
     return false;
@@ -1171,40 +525,32 @@
     freestr(f->defaultval.bytes);
 }
 
-const char *upb_fielddef_fullname(const upb_fielddef *e) {
-  return upb_def_fullname(upb_fielddef_upcast(e));
-}
-
 static void visitfield(const upb_refcounted *r, upb_refcounted_visit *visit,
                        void *closure) {
   const upb_fielddef *f = (const upb_fielddef*)r;
-  const upb_def *def = upb_fielddef_upcast(f);
   if (upb_fielddef_containingtype(f)) {
     visit(r, upb_msgdef_upcast2(upb_fielddef_containingtype(f)), closure);
   }
   if (upb_fielddef_containingoneof(f)) {
-    visit(r, upb_oneofdef_upcast(upb_fielddef_containingoneof(f)), closure);
+    visit(r, upb_oneofdef_upcast2(upb_fielddef_containingoneof(f)), closure);
   }
   if (upb_fielddef_subdef(f)) {
     visit(r, upb_def_upcast(upb_fielddef_subdef(f)), closure);
   }
-  if (upb_def_file(def)) {
-    visit(r, upb_filedef_upcast(upb_def_file(def)), closure);
-  }
 }
 
 static void freefield(upb_refcounted *r) {
   upb_fielddef *f = (upb_fielddef*)r;
   upb_fielddef_uninit_default(f);
   if (f->subdef_is_symbolic)
-    upb_gfree(f->sub.name);
+    free(f->sub.name);
   upb_def_uninit(upb_fielddef_upcast_mutable(f));
-  upb_gfree(f);
+  free(f);
 }
 
 static const char *enumdefaultstr(const upb_fielddef *f) {
   const upb_enumdef *e;
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   e = upb_fielddef_enumsubdef(f);
   if (f->default_is_string && f->defaultval.bytes) {
     /* Default was explicitly set as a string. */
@@ -1221,7 +567,7 @@
       /* Default is completely unset; pull enumdef default. */
       if (upb_enumdef_numvals(e) > 0) {
         const char *name = upb_enumdef_iton(e, upb_enumdef_default(e));
-        UPB_ASSERT(name);
+        assert(name);
         return name;
       }
     }
@@ -1231,7 +577,7 @@
 
 static bool enumdefaultint32(const upb_fielddef *f, int32_t *val) {
   const upb_enumdef *e;
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   e = upb_fielddef_enumsubdef(f);
   if (!f->default_is_string) {
     /* Default was explicitly set as an integer. */
@@ -1255,14 +601,12 @@
   return false;
 }
 
-const struct upb_refcounted_vtbl upb_fielddef_vtbl = {visitfield, freefield};
-
 upb_fielddef *upb_fielddef_new(const void *o) {
-  upb_fielddef *f = upb_gmalloc(sizeof(*f));
+  static const struct upb_refcounted_vtbl vtbl = {visitfield, freefield};
+  upb_fielddef *f = malloc(sizeof(*f));
   if (!f) return NULL;
-  if (!upb_def_init(upb_fielddef_upcast_mutable(f), UPB_DEF_FIELD,
-                    &upb_fielddef_vtbl, o)) {
-    upb_gfree(f);
+  if (!upb_def_init(upb_fielddef_upcast_mutable(f), UPB_DEF_FIELD, &vtbl, o)) {
+    free(f);
     return NULL;
   }
   f->msg.def = NULL;
@@ -1291,12 +635,48 @@
   return f;
 }
 
+upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner) {
+  const char *srcname;
+  upb_fielddef *newf = upb_fielddef_new(owner);
+  if (!newf) return NULL;
+  upb_fielddef_settype(newf, upb_fielddef_type(f));
+  upb_fielddef_setlabel(newf, upb_fielddef_label(f));
+  upb_fielddef_setnumber(newf, upb_fielddef_number(f), NULL);
+  upb_fielddef_setname(newf, upb_fielddef_name(f), NULL);
+  if (f->default_is_string && f->defaultval.bytes) {
+    str_t *s = f->defaultval.bytes;
+    upb_fielddef_setdefaultstr(newf, s->str, s->len, NULL);
+  } else {
+    newf->default_is_string = f->default_is_string;
+    newf->defaultval = f->defaultval;
+  }
+
+  if (f->subdef_is_symbolic) {
+    srcname = f->sub.name;  /* Might be NULL. */
+  } else {
+    srcname = f->sub.def ? upb_def_fullname(f->sub.def) : NULL;
+  }
+  if (srcname) {
+    char *newname = malloc(strlen(f->sub.def->fullname) + 2);
+    if (!newname) {
+      upb_fielddef_unref(newf, owner);
+      return NULL;
+    }
+    strcpy(newname, ".");
+    strcat(newname, f->sub.def->fullname);
+    upb_fielddef_setsubdefname(newf, newname, NULL);
+    free(newname);
+  }
+
+  return newf;
+}
+
 bool upb_fielddef_typeisset(const upb_fielddef *f) {
   return f->type_is_set_;
 }
 
 upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f) {
-  UPB_ASSERT(f->type_is_set_);
+  assert(f->type_is_set_);
   return f->type_;
 }
 
@@ -1336,45 +716,6 @@
   return upb_def_fullname(upb_fielddef_upcast(f));
 }
 
-size_t upb_fielddef_getjsonname(const upb_fielddef *f, char *buf, size_t len) {
-  const char *name = upb_fielddef_name(f);
-  size_t src, dst = 0;
-  bool ucase_next = false;
-
-#define WRITE(byte) \
-  ++dst; \
-  if (dst < len) buf[dst - 1] = byte; \
-  else if (dst == len) buf[dst - 1] = '\0'
-
-  if (!name) {
-    WRITE('\0');
-    return 0;
-  }
-
-  /* Implement the transformation as described in the spec:
-   *   1. upper case all letters after an underscore.
-   *   2. remove all underscores.
-   */
-  for (src = 0; name[src]; src++) {
-    if (name[src] == '_') {
-      ucase_next = true;
-      continue;
-    }
-
-    if (ucase_next) {
-      WRITE(toupper(name[src]));
-      ucase_next = false;
-    } else {
-      WRITE(name[src]);
-    }
-  }
-
-  WRITE('\0');
-  return dst;
-
-#undef WRITE
-}
-
 const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f) {
   return f->msg_is_symbolic ? NULL : f->msg.def;
 }
@@ -1392,28 +733,20 @@
 }
 
 static void release_containingtype(upb_fielddef *f) {
-  if (f->msg_is_symbolic) upb_gfree(f->msg.name);
+  if (f->msg_is_symbolic) free(f->msg.name);
 }
 
 bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name,
                                         upb_status *s) {
-  char *name_copy;
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   if (upb_fielddef_containingtype(f)) {
     upb_status_seterrmsg(s, "field has already been added to a message.");
     return false;
   }
   /* TODO: validate name (upb_isident() doesn't quite work atm because this name
    * may have a leading "."). */
-
-  name_copy = upb_gstrdup(name);
-  if (!name_copy) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-
   release_containingtype(f);
-  f->msg.name = name_copy;
+  f->msg.name = upb_strdup(name);
   f->msg_is_symbolic = true;
   return true;
 }
@@ -1429,7 +762,7 @@
 static void chkdefaulttype(const upb_fielddef *f, upb_fieldtype_t type) {
   UPB_UNUSED(f);
   UPB_UNUSED(type);
-  UPB_ASSERT(f->type_is_set_ && upb_fielddef_type(f) == type);
+  assert(f->type_is_set_ && upb_fielddef_type(f) == type);
 }
 
 int64_t upb_fielddef_defaultint64(const upb_fielddef *f) {
@@ -1441,7 +774,7 @@
   if (f->type_is_set_ && upb_fielddef_type(f) == UPB_TYPE_ENUM) {
     int32_t val;
     bool ok = enumdefaultint32(f, &val);
-    UPB_ASSERT(ok);
+    UPB_ASSERT_VAR(ok, ok);
     return val;
   } else {
     chkdefaulttype(f, UPB_TYPE_INT32);
@@ -1475,14 +808,14 @@
 }
 
 const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len) {
-  UPB_ASSERT(f->type_is_set_);
-  UPB_ASSERT(upb_fielddef_type(f) == UPB_TYPE_STRING ||
+  assert(f->type_is_set_);
+  assert(upb_fielddef_type(f) == UPB_TYPE_STRING ||
          upb_fielddef_type(f) == UPB_TYPE_BYTES ||
          upb_fielddef_type(f) == UPB_TYPE_ENUM);
 
   if (upb_fielddef_type(f) == UPB_TYPE_ENUM) {
     const char *ret = enumdefaultstr(f);
-    UPB_ASSERT(ret);
+    assert(ret);
     /* Enum defaults can't have embedded NULLs. */
     if (len) *len = strlen(ret);
     return ret;
@@ -1564,8 +897,8 @@
 }
 
 void upb_fielddef_settype(upb_fielddef *f, upb_fieldtype_t type) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_checktype(type));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_checktype(type));
   upb_fielddef_uninit_default(f);
   f->type_ = type;
   f->type_is_set_ = true;
@@ -1573,7 +906,7 @@
 }
 
 void upb_fielddef_setdescriptortype(upb_fielddef *f, int type) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   switch (type) {
     case UPB_DESCRIPTOR_TYPE_DOUBLE:
       upb_fielddef_settype(f, UPB_TYPE_DOUBLE);
@@ -1615,7 +948,7 @@
     case UPB_DESCRIPTOR_TYPE_ENUM:
       upb_fielddef_settype(f, UPB_TYPE_ENUM);
       break;
-    default: UPB_ASSERT(false);
+    default: assert(false);
   }
 
   if (type == UPB_DESCRIPTOR_TYPE_FIXED64 ||
@@ -1673,34 +1006,34 @@
 }
 
 void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->is_extension_ = is_extension;
 }
 
 void upb_fielddef_setlazy(upb_fielddef *f, bool lazy) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->lazy_ = lazy;
 }
 
 void upb_fielddef_setpacked(upb_fielddef *f, bool packed) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->packed_ = packed;
 }
 
 void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_checklabel(label));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_checklabel(label));
   f->label_ = label;
 }
 
 void upb_fielddef_setintfmt(upb_fielddef *f, upb_intfmt_t fmt) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_checkintfmt(fmt));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_checkintfmt(fmt));
   f->intfmt = fmt;
 }
 
 void upb_fielddef_settagdelim(upb_fielddef *f, bool tag_delim) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->tagdelim = tag_delim;
   f->tagdelim = tag_delim;
 }
@@ -1708,12 +1041,12 @@
 static bool checksetdefault(upb_fielddef *f, upb_fieldtype_t type) {
   if (!f->type_is_set_ || upb_fielddef_isfrozen(f) ||
       upb_fielddef_type(f) != type) {
-    UPB_ASSERT(false);
+    assert(false);
     return false;
   }
   if (f->default_is_string) {
     str_t *s = f->defaultval.bytes;
-    UPB_ASSERT(s || type == UPB_TYPE_ENUM);
+    assert(s || type == UPB_TYPE_ENUM);
     if (s) freestr(s);
   }
   f->default_is_string = false;
@@ -1761,16 +1094,16 @@
 bool upb_fielddef_setdefaultstr(upb_fielddef *f, const void *str, size_t len,
                                 upb_status *s) {
   str_t *str2;
-  UPB_ASSERT(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE_ENUM);
+  assert(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE_ENUM);
   if (f->type_ == UPB_TYPE_ENUM && !upb_isident(str, len, false, s))
     return false;
 
   if (f->default_is_string) {
     str_t *s = f->defaultval.bytes;
-    UPB_ASSERT(s || f->type_ == UPB_TYPE_ENUM);
+    assert(s || f->type_ == UPB_TYPE_ENUM);
     if (s) freestr(s);
   } else {
-    UPB_ASSERT(f->type_ == UPB_TYPE_ENUM);
+    assert(f->type_ == UPB_TYPE_ENUM);
   }
 
   str2 = newstr(str, len);
@@ -1781,18 +1114,18 @@
 
 void upb_fielddef_setdefaultcstr(upb_fielddef *f, const char *str,
                                  upb_status *s) {
-  UPB_ASSERT(f->type_is_set_);
+  assert(f->type_is_set_);
   upb_fielddef_setdefaultstr(f, str, str ? strlen(str) : 0, s);
 }
 
 bool upb_fielddef_enumhasdefaultint32(const upb_fielddef *f) {
   int32_t val;
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   return enumdefaultint32(f, &val);
 }
 
 bool upb_fielddef_enumhasdefaultstr(const upb_fielddef *f) {
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   return enumdefaultstr(f) != NULL;
 }
 
@@ -1814,7 +1147,7 @@
 
 static void release_subdef(upb_fielddef *f) {
   if (f->subdef_is_symbolic) {
-    upb_gfree(f->sub.name);
+    free(f->sub.name);
   } else if (f->sub.def) {
     upb_unref2(f->sub.def, f);
   }
@@ -1822,8 +1155,8 @@
 
 bool upb_fielddef_setsubdef(upb_fielddef *f, const upb_def *subdef,
                             upb_status *s) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_hassubdef(f));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_hassubdef(f));
   if (subdef && !upb_subdef_typecheck(f, subdef, s)) return false;
   release_subdef(f);
   f->sub.def = subdef;
@@ -1844,23 +1177,15 @@
 
 bool upb_fielddef_setsubdefname(upb_fielddef *f, const char *name,
                                 upb_status *s) {
-  char *name_copy;
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   if (!upb_fielddef_hassubdef(f)) {
     upb_status_seterrmsg(s, "field type does not accept a subdef");
     return false;
   }
-
-  name_copy = upb_gstrdup(name);
-  if (!name_copy) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-
   /* TODO: validate name (upb_isident() doesn't quite work atm because this name
    * may have a leading "."). */
   release_subdef(f);
-  f->sub.name = name_copy;
+  f->sub.name = upb_strdup(name);
   f->subdef_is_symbolic = true;
   return true;
 }
@@ -1887,16 +1212,6 @@
          upb_msgdef_mapentry(upb_fielddef_msgsubdef(f));
 }
 
-bool upb_fielddef_haspresence(const upb_fielddef *f) {
-  if (upb_fielddef_isseq(f)) return false;
-  if (upb_fielddef_issubmsg(f)) return true;
-
-  /* Primitive field: return true unless there is a message that specifies
-   * presence should not exist. */
-  if (f->msg_is_symbolic || !f->msg.def) return true;
-  return f->msg.def->syntax == UPB_SYNTAX_PROTO2;
-}
-
 bool upb_fielddef_hassubdef(const upb_fielddef *f) {
   return upb_fielddef_issubmsg(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM;
 }
@@ -1919,7 +1234,6 @@
                      void *closure) {
   upb_msg_oneof_iter o;
   const upb_msgdef *m = (const upb_msgdef*)r;
-  const upb_def *def = upb_msgdef_upcast(m);
   upb_msg_field_iter i;
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
@@ -1931,45 +1245,75 @@
       !upb_msg_oneof_done(&o);
       upb_msg_oneof_next(&o)) {
     upb_oneofdef *f = upb_msg_iter_oneof(&o);
-    visit(r, upb_oneofdef_upcast(f), closure);
-  }
-  if (upb_def_file(def)) {
-    visit(r, upb_filedef_upcast(upb_def_file(def)), closure);
+    visit(r, upb_oneofdef_upcast2(f), closure);
   }
 }
 
 static void freemsg(upb_refcounted *r) {
   upb_msgdef *m = (upb_msgdef*)r;
+  upb_strtable_uninit(&m->ntoo);
   upb_strtable_uninit(&m->ntof);
   upb_inttable_uninit(&m->itof);
   upb_def_uninit(upb_msgdef_upcast_mutable(m));
-  upb_gfree(m);
+  free(m);
 }
 
-const struct upb_refcounted_vtbl upb_msgdef_vtbl = {visitmsg, freemsg};
-
 upb_msgdef *upb_msgdef_new(const void *owner) {
-  upb_msgdef *m = upb_gmalloc(sizeof(*m));
+  static const struct upb_refcounted_vtbl vtbl = {visitmsg, freemsg};
+  upb_msgdef *m = malloc(sizeof(*m));
   if (!m) return NULL;
-
-  if (!upb_def_init(upb_msgdef_upcast_mutable(m), UPB_DEF_MSG, &upb_msgdef_vtbl,
-                    owner)) {
+  if (!upb_def_init(upb_msgdef_upcast_mutable(m), UPB_DEF_MSG, &vtbl, owner))
     goto err2;
-  }
-
-  if (!upb_inttable_init(&m->itof, UPB_CTYPE_PTR)) goto err2;
-  if (!upb_strtable_init(&m->ntof, UPB_CTYPE_PTR)) goto err1;
+  if (!upb_inttable_init(&m->itof, UPB_CTYPE_PTR)) goto err3;
+  if (!upb_strtable_init(&m->ntof, UPB_CTYPE_PTR)) goto err2;
+  if (!upb_strtable_init(&m->ntoo, UPB_CTYPE_PTR)) goto err1;
   m->map_entry = false;
-  m->syntax = UPB_SYNTAX_PROTO2;
   return m;
 
 err1:
-  upb_inttable_uninit(&m->itof);
+  upb_strtable_uninit(&m->ntof);
 err2:
-  upb_gfree(m);
+  upb_inttable_uninit(&m->itof);
+err3:
+  free(m);
   return NULL;
 }
 
+upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner) {
+  bool ok;
+  upb_msg_field_iter i;
+  upb_msg_oneof_iter o;
+
+  upb_msgdef *newm = upb_msgdef_new(owner);
+  if (!newm) return NULL;
+  ok = upb_def_setfullname(upb_msgdef_upcast_mutable(newm),
+                           upb_def_fullname(upb_msgdef_upcast(m)),
+                           NULL);
+  newm->map_entry = m->map_entry;
+  UPB_ASSERT_VAR(ok, ok);
+  for(upb_msg_field_begin(&i, m);
+      !upb_msg_field_done(&i);
+      upb_msg_field_next(&i)) {
+    upb_fielddef *f = upb_fielddef_dup(upb_msg_iter_field(&i), &f);
+    /* Fields in oneofs are dup'd below. */
+    if (upb_fielddef_containingoneof(f)) continue;
+    if (!f || !upb_msgdef_addfield(newm, f, &f, NULL)) {
+      upb_msgdef_unref(newm, owner);
+      return NULL;
+    }
+  }
+  for(upb_msg_oneof_begin(&o, m);
+      !upb_msg_oneof_done(&o);
+      upb_msg_oneof_next(&o)) {
+    upb_oneofdef *f = upb_oneofdef_dup(upb_msg_iter_oneof(&o), &f);
+    if (!f || !upb_msgdef_addoneof(newm, f, &f, NULL)) {
+      upb_msgdef_unref(newm, owner);
+      return NULL;
+    }
+  }
+  return newm;
+}
+
 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status) {
   upb_def *d = upb_msgdef_upcast_mutable(m);
   return upb_def_freeze(&d, 1, status);
@@ -1979,28 +1323,11 @@
   return upb_def_fullname(upb_msgdef_upcast(m));
 }
 
-const char *upb_msgdef_name(const upb_msgdef *m) {
-  return upb_def_name(upb_msgdef_upcast(m));
-}
-
 bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname,
                             upb_status *s) {
   return upb_def_setfullname(upb_msgdef_upcast_mutable(m), fullname, s);
 }
 
-bool upb_msgdef_setsyntax(upb_msgdef *m, upb_syntax_t syntax) {
-  if (syntax != UPB_SYNTAX_PROTO2 && syntax != UPB_SYNTAX_PROTO3) {
-    return false;
-  }
-
-  m->syntax = syntax;
-  return true;
-}
-
-upb_syntax_t upb_msgdef_syntax(const upb_msgdef *m) {
-  return m->syntax;
-}
-
 /* Helper: check that the field |f| is safe to add to msgdef |m|. Set an error
  * on status |s| and return false if not. */
 static bool check_field_add(const upb_msgdef *m, const upb_fielddef *f,
@@ -2011,11 +1338,9 @@
   } else if (upb_fielddef_name(f) == NULL || upb_fielddef_number(f) == 0) {
     upb_status_seterrmsg(s, "field name or number were not set");
     return false;
-  } else if (upb_msgdef_itof(m, upb_fielddef_number(f))) {
-    upb_status_seterrmsg(s, "duplicate field number");
-    return false;
-  } else if (upb_strtable_lookup(&m->ntof, upb_fielddef_name(f), NULL)) {
-    upb_status_seterrmsg(s, "name conflicts with existing field or oneof");
+  } else if (upb_msgdef_ntofz(m, upb_fielddef_name(f)) ||
+             upb_msgdef_itof(m, upb_fielddef_number(f))) {
+    upb_status_seterrmsg(s, "duplicate field name or number for field");
     return false;
   }
   return true;
@@ -2048,7 +1373,6 @@
    * This method is idempotent. Check if |f| is already part of this msgdef and
    * return immediately if so. */
   if (upb_fielddef_containingtype(f) == m) {
-    if (ref_donor) upb_fielddef_unref(f, ref_donor);
     return true;
   }
 
@@ -2077,8 +1401,8 @@
   } else if (upb_oneofdef_name(o) == NULL) {
     upb_status_seterrmsg(s, "oneofdef name was not set");
     return false;
-  } else if (upb_strtable_lookup(&m->ntof, upb_oneofdef_name(o), NULL)) {
-    upb_status_seterrmsg(s, "name conflicts with existing field or oneof");
+  } else if (upb_msgdef_ntooz(m, upb_oneofdef_name(o))) {
+    upb_status_seterrmsg(s, "duplicate oneof name");
     return false;
   }
 
@@ -2095,7 +1419,7 @@
 
   /* Add oneof itself first. */
   o->parent = m;
-  upb_strtable_insert(&m->ntof, upb_oneofdef_name(o), upb_value_ptr(o));
+  upb_strtable_insert(&m->ntoo, upb_oneofdef_name(o), upb_value_ptr(o));
   upb_ref2(o, m);
   upb_ref2(m, o);
 
@@ -2119,51 +1443,27 @@
 const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name,
                                     size_t len) {
   upb_value val;
-
-  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
-    return NULL;
-  }
-
-  return upb_trygetfield(upb_value_getptr(val));
+  return upb_strtable_lookup2(&m->ntof, name, len, &val) ?
+      upb_value_getptr(val) : NULL;
 }
 
 const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name,
                                     size_t len) {
   upb_value val;
-
-  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
-    return NULL;
-  }
-
-  return upb_trygetoneof(upb_value_getptr(val));
-}
-
-bool upb_msgdef_lookupname(const upb_msgdef *m, const char *name, size_t len,
-                           const upb_fielddef **f, const upb_oneofdef **o) {
-  upb_value val;
-
-  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
-    return false;
-  }
-
-  *o = upb_trygetoneof(upb_value_getptr(val));
-  *f = upb_trygetfield(upb_value_getptr(val));
-  UPB_ASSERT((*o != NULL) ^ (*f != NULL));  /* Exactly one of the two should be set. */
-  return true;
+  return upb_strtable_lookup2(&m->ntoo, name, len, &val) ?
+      upb_value_getptr(val) : NULL;
 }
 
 int upb_msgdef_numfields(const upb_msgdef *m) {
-  /* The number table contains only fields. */
-  return upb_inttable_count(&m->itof);
+  return upb_strtable_count(&m->ntof);
 }
 
 int upb_msgdef_numoneofs(const upb_msgdef *m) {
-  /* The name table includes oneofs, and the number table does not. */
-  return upb_strtable_count(&m->ntof) - upb_inttable_count(&m->itof);
+  return upb_strtable_count(&m->ntoo);
 }
 
 void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry) {
-  UPB_ASSERT(!upb_msgdef_isfrozen(m));
+  assert(!upb_msgdef_isfrozen(m));
   m->map_entry = map_entry;
 }
 
@@ -2190,21 +1490,10 @@
 }
 
 void upb_msg_oneof_begin(upb_msg_oneof_iter *iter, const upb_msgdef *m) {
-  upb_strtable_begin(iter, &m->ntof);
-  /* We need to skip past any initial fields. */
-  while (!upb_strtable_done(iter) &&
-         !upb_isoneof(upb_value_getptr(upb_strtable_iter_value(iter)))) {
-    upb_strtable_next(iter);
-  }
+  upb_strtable_begin(iter, &m->ntoo);
 }
 
-void upb_msg_oneof_next(upb_msg_oneof_iter *iter) {
-  /* We need to skip past fields to return only oneofs. */
-  do {
-    upb_strtable_next(iter);
-  } while (!upb_strtable_done(iter) &&
-           !upb_isoneof(upb_value_getptr(upb_strtable_iter_value(iter))));
-}
+void upb_msg_oneof_next(upb_msg_oneof_iter *iter) { upb_strtable_next(iter); }
 
 bool upb_msg_oneof_done(const upb_msg_oneof_iter *iter) {
   return upb_strtable_done(iter);
@@ -2237,61 +1526,58 @@
   upb_oneofdef *o = (upb_oneofdef*)r;
   upb_strtable_uninit(&o->ntof);
   upb_inttable_uninit(&o->itof);
-  upb_gfree((void*)o->name);
-  upb_gfree(o);
+  upb_def_uninit(upb_oneofdef_upcast_mutable(o));
+  free(o);
 }
 
-const struct upb_refcounted_vtbl upb_oneofdef_vtbl = {visitoneof, freeoneof};
-
 upb_oneofdef *upb_oneofdef_new(const void *owner) {
-  upb_oneofdef *o = upb_gmalloc(sizeof(*o));
-
-  if (!o) {
-    return NULL;
-  }
-
+  static const struct upb_refcounted_vtbl vtbl = {visitoneof, freeoneof};
+  upb_oneofdef *o = malloc(sizeof(*o));
   o->parent = NULL;
-  o->name = NULL;
-
-  if (!upb_refcounted_init(upb_oneofdef_upcast_mutable(o), &upb_oneofdef_vtbl,
-                           owner)) {
+  if (!o) return NULL;
+  if (!upb_def_init(upb_oneofdef_upcast_mutable(o), UPB_DEF_ONEOF, &vtbl,
+                    owner))
     goto err2;
-  }
-
   if (!upb_inttable_init(&o->itof, UPB_CTYPE_PTR)) goto err2;
   if (!upb_strtable_init(&o->ntof, UPB_CTYPE_PTR)) goto err1;
-
   return o;
 
 err1:
   upb_inttable_uninit(&o->itof);
 err2:
-  upb_gfree(o);
+  free(o);
   return NULL;
 }
 
-const char *upb_oneofdef_name(const upb_oneofdef *o) { return o->name; }
+upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner) {
+  bool ok;
+  upb_oneof_iter i;
+  upb_oneofdef *newo = upb_oneofdef_new(owner);
+  if (!newo) return NULL;
+  ok = upb_def_setfullname(upb_oneofdef_upcast_mutable(newo),
+                           upb_def_fullname(upb_oneofdef_upcast(o)), NULL);
+  UPB_ASSERT_VAR(ok, ok);
+  for (upb_oneof_begin(&i, o); !upb_oneof_done(&i); upb_oneof_next(&i)) {
+    upb_fielddef *f = upb_fielddef_dup(upb_oneof_iter_field(&i), &f);
+    if (!f || !upb_oneofdef_addfield(newo, f, &f, NULL)) {
+      upb_oneofdef_unref(newo, owner);
+      return NULL;
+    }
+  }
+  return newo;
+}
 
-bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s) {
-  UPB_ASSERT(!upb_oneofdef_isfrozen(o));
+const char *upb_oneofdef_name(const upb_oneofdef *o) {
+  return upb_def_fullname(upb_oneofdef_upcast(o));
+}
+
+bool upb_oneofdef_setname(upb_oneofdef *o, const char *fullname,
+                             upb_status *s) {
   if (upb_oneofdef_containingtype(o)) {
     upb_status_seterrmsg(s, "oneof already added to a message");
     return false;
   }
-
-  if (!upb_isident(name, strlen(name), true, s)) {
-    return false;
-  }
-
-  name = upb_gstrdup(name);
-  if (!name) {
-    upb_status_seterrmsg(s, "One of memory");
-    return false;
-  }
-
-  upb_gfree((void*)o->name);
-  o->name = name;
-  return true;
+  return upb_def_setfullname(upb_oneofdef_upcast_mutable(o), fullname, s);
 }
 
 const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o) {
@@ -2302,15 +1588,11 @@
   return upb_strtable_count(&o->ntof);
 }
 
-uint32_t upb_oneofdef_index(const upb_oneofdef *o) {
-  return o->index;
-}
-
 bool upb_oneofdef_addfield(upb_oneofdef *o, upb_fielddef *f,
                            const void *ref_donor,
                            upb_status *s) {
-  UPB_ASSERT(!upb_oneofdef_isfrozen(o));
-  UPB_ASSERT(!o->parent || !upb_msgdef_isfrozen(o->parent));
+  assert(!upb_oneofdef_isfrozen(o));
+  assert(!o->parent || !upb_msgdef_isfrozen(o->parent));
 
   /* This method is idempotent. Check if |f| is already part of this oneofdef
    * and return immediately if so. */
@@ -2414,938 +1696,287 @@
   upb_inttable_iter_setdone(iter);
 }
 
-/* upb_filedef ****************************************************************/
 
-static void visitfiledef(const upb_refcounted *r, upb_refcounted_visit *visit,
-                         void *closure) {
-  const upb_filedef *f = (const upb_filedef*)r;
-  size_t i;
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 
-  for(i = 0; i < upb_filedef_defcount(f); i++) {
-    visit(r, upb_def_upcast(upb_filedef_def(f, i)), closure);
+typedef struct cleanup_ent {
+  upb_cleanup_func *cleanup;
+  void *ud;
+  struct cleanup_ent *next;
+} cleanup_ent;
+
+static void *seeded_alloc(void *ud, void *ptr, size_t oldsize, size_t size);
+
+/* Default allocator **********************************************************/
+
+/* Just use realloc, keeping all allocated blocks in a linked list to destroy at
+ * the end. */
+
+typedef struct mem_block {
+  /* List is doubly-linked, because in cases where realloc() moves an existing
+   * block, we need to be able to remove the old pointer from the list
+   * efficiently. */
+  struct mem_block *prev, *next;
+#ifndef NDEBUG
+  size_t size;  /* Doesn't include mem_block structure. */
+#endif
+} mem_block;
+
+typedef struct {
+  mem_block *head;
+} default_alloc_ud;
+
+static void *default_alloc(void *_ud, void *ptr, size_t oldsize, size_t size) {
+  default_alloc_ud *ud = _ud;
+  mem_block *from, *block;
+  void *ret;
+  UPB_UNUSED(oldsize);
+
+  from = ptr ? (void*)((char*)ptr - sizeof(mem_block)) : NULL;
+
+#ifndef NDEBUG
+  if (from) {
+    assert(oldsize <= from->size);
   }
-}
+#endif
 
-static void freefiledef(upb_refcounted *r) {
-  upb_filedef *f = (upb_filedef*)r;
-  size_t i;
+  /* TODO(haberman): we probably need to provide even better alignment here,
+   * like 16-byte alignment of the returned data pointer. */
+  block = realloc(from, size + sizeof(mem_block));
+  if (!block) return NULL;
+  ret = (char*)block + sizeof(*block);
 
-  for(i = 0; i < upb_filedef_depcount(f); i++) {
-    upb_filedef_unref(upb_filedef_dep(f, i), f);
-  }
+#ifndef NDEBUG
+  block->size = size;
+#endif
 
-  upb_inttable_uninit(&f->defs);
-  upb_inttable_uninit(&f->deps);
-  upb_gfree((void*)f->name);
-  upb_gfree((void*)f->package);
-  upb_gfree((void*)f->phpprefix);
-  upb_gfree((void*)f->phpnamespace);
-  upb_gfree(f);
-}
-
-const struct upb_refcounted_vtbl upb_filedef_vtbl = {visitfiledef, freefiledef};
-
-upb_filedef *upb_filedef_new(const void *owner) {
-  upb_filedef *f = upb_gmalloc(sizeof(*f));
-
-  if (!f) {
-    return NULL;
-  }
-
-  f->package = NULL;
-  f->name = NULL;
-  f->phpprefix = NULL;
-  f->phpnamespace = NULL;
-  f->syntax = UPB_SYNTAX_PROTO2;
-
-  if (!upb_refcounted_init(upb_filedef_upcast_mutable(f), &upb_filedef_vtbl,
-                           owner)) {
-    goto err;
-  }
-
-  if (!upb_inttable_init(&f->defs, UPB_CTYPE_CONSTPTR)) {
-    goto err;
-  }
-
-  if (!upb_inttable_init(&f->deps, UPB_CTYPE_CONSTPTR)) {
-    goto err2;
-  }
-
-  return f;
-
-
-err2:
-  upb_inttable_uninit(&f->defs);
-
-err:
-  upb_gfree(f);
-  return NULL;
-}
-
-const char *upb_filedef_name(const upb_filedef *f) {
-  return f->name;
-}
-
-const char *upb_filedef_package(const upb_filedef *f) {
-  return f->package;
-}
-
-const char *upb_filedef_phpprefix(const upb_filedef *f) {
-  return f->phpprefix;
-}
-
-const char *upb_filedef_phpnamespace(const upb_filedef *f) {
-  return f->phpnamespace;
-}
-
-upb_syntax_t upb_filedef_syntax(const upb_filedef *f) {
-  return f->syntax;
-}
-
-size_t upb_filedef_defcount(const upb_filedef *f) {
-  return upb_inttable_count(&f->defs);
-}
-
-size_t upb_filedef_depcount(const upb_filedef *f) {
-  return upb_inttable_count(&f->deps);
-}
-
-const upb_def *upb_filedef_def(const upb_filedef *f, size_t i) {
-  upb_value v;
-
-  if (upb_inttable_lookup32(&f->defs, i, &v)) {
-    return upb_value_getconstptr(v);
-  } else {
-    return NULL;
-  }
-}
-
-const upb_filedef *upb_filedef_dep(const upb_filedef *f, size_t i) {
-  upb_value v;
-
-  if (upb_inttable_lookup32(&f->deps, i, &v)) {
-    return upb_value_getconstptr(v);
-  } else {
-    return NULL;
-  }
-}
-
-bool upb_filedef_setname(upb_filedef *f, const char *name, upb_status *s) {
-  name = upb_gstrdup(name);
-  if (!name) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-  upb_gfree((void*)f->name);
-  f->name = name;
-  return true;
-}
-
-bool upb_filedef_setpackage(upb_filedef *f, const char *package,
-                            upb_status *s) {
-  if (!upb_isident(package, strlen(package), true, s)) return false;
-  package = upb_gstrdup(package);
-  if (!package) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-  upb_gfree((void*)f->package);
-  f->package = package;
-  return true;
-}
-
-bool upb_filedef_setphpprefix(upb_filedef *f, const char *phpprefix,
-                              upb_status *s) {
-  phpprefix = upb_gstrdup(phpprefix);
-  if (!phpprefix) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-  upb_gfree((void*)f->phpprefix);
-  f->phpprefix = phpprefix;
-  return true;
-}
-
-bool upb_filedef_setphpnamespace(upb_filedef *f, const char *phpnamespace,
-                                 upb_status *s) {
-  phpnamespace = upb_gstrdup(phpnamespace);
-  if (!phpnamespace) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-  upb_gfree((void*)f->phpnamespace);
-  f->phpnamespace = phpnamespace;
-  return true;
-}
-
-bool upb_filedef_setsyntax(upb_filedef *f, upb_syntax_t syntax,
-                           upb_status *s) {
-  UPB_UNUSED(s);
-  if (syntax != UPB_SYNTAX_PROTO2 &&
-      syntax != UPB_SYNTAX_PROTO3) {
-    upb_status_seterrmsg(s, "Unknown syntax value.");
-    return false;
-  }
-  f->syntax = syntax;
-
-  {
-    /* Set all messages in this file to match. */
-    size_t i;
-    for (i = 0; i < upb_filedef_defcount(f); i++) {
-      /* Casting const away is safe since all defs in mutable filedef must
-       * also be mutable. */
-      upb_def *def = (upb_def*)upb_filedef_def(f, i);
-
-      upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
-      if (m) {
-        m->syntax = syntax;
-      }
+  if (from) {
+    if (block != from) {
+      /* The block was moved, so pointers in next and prev blocks must be
+       * updated to its new location. */
+      if (block->next) block->next->prev = block;
+      if (block->prev) block->prev->next = block;
+      if (ud->head == from) ud->head = block;
     }
-  }
-
-  return true;
-}
-
-bool upb_filedef_adddef(upb_filedef *f, upb_def *def, const void *ref_donor,
-                        upb_status *s) {
-  if (def->file) {
-    upb_status_seterrmsg(s, "Def is already part of another filedef.");
-    return false;
-  }
-
-  if (upb_inttable_push(&f->defs, upb_value_constptr(def))) {
-    def->file = f;
-    upb_ref2(def, f);
-    upb_ref2(f, def);
-    if (ref_donor) upb_def_unref(def, ref_donor);
-    if (def->type == UPB_DEF_MSG) {
-      upb_downcast_msgdef_mutable(def)->syntax = f->syntax;
-    }
-    return true;
   } else {
-    upb_upberr_setoom(s);
-    return false;
-  }
-}
-
-bool upb_filedef_adddep(upb_filedef *f, const upb_filedef *dep) {
-  if (upb_inttable_push(&f->deps, upb_value_constptr(dep))) {
-    /* Regular ref instead of ref2 because files can't form cycles. */
-    upb_filedef_ref(dep, f);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-void upb_symtab_free(upb_symtab *s) {
-  upb_strtable_iter i;
-  upb_strtable_begin(&i, &s->symtab);
-  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-    const upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
-    upb_def_unref(def, s);
-  }
-  upb_strtable_uninit(&s->symtab);
-  upb_gfree(s);
-}
-
-upb_symtab *upb_symtab_new() {
-  upb_symtab *s = upb_gmalloc(sizeof(*s));
-  if (!s) {
-    return NULL;
+    /* Insert at head of linked list. */
+    block->prev = NULL;
+    block->next = ud->head;
+    if (block->next) block->next->prev = block;
+    ud->head = block;
   }
 
-  upb_strtable_init(&s->symtab, UPB_CTYPE_PTR);
-  return s;
-}
-
-const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym) {
-  upb_value v;
-  upb_def *ret = upb_strtable_lookup(&s->symtab, sym, &v) ?
-      upb_value_getptr(v) : NULL;
   return ret;
 }
 
-const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
-  upb_value v;
-  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
-      upb_value_getptr(v) : NULL;
-  return def ? upb_dyncast_msgdef(def) : NULL;
-}
+static void default_alloc_cleanup(void *_ud) {
+  default_alloc_ud *ud = _ud;
+  mem_block *block = ud->head;
 
-const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
-  upb_value v;
-  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
-      upb_value_getptr(v) : NULL;
-  return def ? upb_dyncast_enumdef(def) : NULL;
-}
-
-/* Given a symbol and the base symbol inside which it is defined, find the
- * symbol's definition in t. */
-static upb_def *upb_resolvename(const upb_strtable *t,
-                                const char *base, const char *sym) {
-  if(strlen(sym) == 0) return NULL;
-  if(sym[0] == '.') {
-    /* Symbols starting with '.' are absolute, so we do a single lookup.
-     * Slice to omit the leading '.' */
-    upb_value v;
-    return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;
-  } else {
-    /* Remove components from base until we find an entry or run out.
-     * TODO: This branch is totally broken, but currently not used. */
-    (void)base;
-    UPB_ASSERT(false);
-    return NULL;
+  while (block) {
+    void *to_free = block;
+    block = block->next;
+    free(to_free);
   }
 }
 
-const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
-                                  const char *sym) {
-  upb_def *ret = upb_resolvename(&s->symtab, base, sym);
-  return ret;
-}
 
-/* TODO(haberman): we need a lot more testing of error conditions. */
-static bool symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
-                       void *ref_donor, upb_refcounted *freeze_also,
-                       upb_status *status) {
-  size_t i;
-  size_t add_n;
-  size_t freeze_n;
-  upb_strtable_iter iter;
-  upb_refcounted **add_objs = NULL;
-  upb_def **add_defs = NULL;
-  size_t add_objs_size;
-  upb_strtable addtab;
+/* Standard error functions ***************************************************/
 
-  if (n == 0 && !freeze_also) {
-    return true;
-  }
-
-  if (!upb_strtable_init(&addtab, UPB_CTYPE_PTR)) {
-    upb_status_seterrmsg(status, "out of memory");
-    return false;
-  }
-
-  /* Add new defs to our "add" set. */
-  for (i = 0; i < n; i++) {
-    upb_def *def = defs[i];
-    const char *fullname;
-    upb_fielddef *f;
-
-    if (upb_def_isfrozen(def)) {
-      upb_status_seterrmsg(status, "added defs must be mutable");
-      goto err;
-    }
-    UPB_ASSERT(!upb_def_isfrozen(def));
-    fullname = upb_def_fullname(def);
-    if (!fullname) {
-      upb_status_seterrmsg(
-          status, "Anonymous defs cannot be added to a symtab");
-      goto err;
-    }
-
-    f = upb_dyncast_fielddef_mutable(def);
-
-    if (f) {
-      if (!upb_fielddef_containingtypename(f)) {
-        upb_status_seterrmsg(status,
-                             "Standalone fielddefs must have a containing type "
-                             "(extendee) name set");
-        goto err;
-      }
-    } else {
-      if (upb_strtable_lookup(&addtab, fullname, NULL)) {
-        upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);
-        goto err;
-      }
-      if (upb_strtable_lookup(&s->symtab, fullname, NULL)) {
-        upb_status_seterrf(status, "Symtab already has a def named '%s'",
-                           fullname);
-        goto err;
-      }
-      if (!upb_strtable_insert(&addtab, fullname, upb_value_ptr(def)))
-        goto oom_err;
-      upb_def_donateref(def, ref_donor, s);
-    }
-
-    if (upb_dyncast_fielddef_mutable(def)) {
-      /* TODO(haberman): allow adding extensions attached to files. */
-      upb_status_seterrf(status, "Can't add extensions to symtab.\n");
-      goto err;
-    }
-  }
-
-  /* Now using the table, resolve symbolic references for subdefs. */
-  upb_strtable_begin(&iter, &addtab);
-  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
-    const char *base;
-    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
-    upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
-    upb_msg_field_iter j;
-
-    if (!m) continue;
-    /* Type names are resolved relative to the message in which they appear. */
-    base = upb_msgdef_fullname(m);
-
-    for(upb_msg_field_begin(&j, m);
-        !upb_msg_field_done(&j);
-        upb_msg_field_next(&j)) {
-      upb_fielddef *f = upb_msg_iter_field(&j);
-      const char *name = upb_fielddef_subdefname(f);
-      if (name && !upb_fielddef_subdef(f)) {
-        /* Try the lookup in the current set of to-be-added defs first. If not
-         * there, try existing defs. */
-        upb_def *subdef = upb_resolvename(&addtab, base, name);
-        if (subdef == NULL) {
-          subdef = upb_resolvename(&s->symtab, base, name);
-        }
-        if (subdef == NULL) {
-          upb_status_seterrf(
-              status, "couldn't resolve name '%s' in message '%s'", name, base);
-          goto err;
-        } else if (!upb_fielddef_setsubdef(f, subdef, status)) {
-          goto err;
-        }
-      }
-    }
-  }
-
-  /* We need an array of the defs in addtab, for passing to
-   * upb_refcounted_freeze(). */
-  add_objs_size = upb_strtable_count(&addtab);
-  if (freeze_also) {
-    add_objs_size++;
-  }
-
-  add_defs = upb_gmalloc(sizeof(void*) * add_objs_size);
-  if (add_defs == NULL) goto oom_err;
-  upb_strtable_begin(&iter, &addtab);
-  for (add_n = 0; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
-    add_defs[add_n++] = upb_value_getptr(upb_strtable_iter_value(&iter));
-  }
-
-  /* Validate defs. */
-  if (!_upb_def_validate(add_defs, add_n, status)) {
-    goto err;
-  }
-
-  /* Cheat a little and give the array a new type.
-   * This is probably undefined behavior, but this code will be deleted soon. */
-  add_objs = (upb_refcounted**)add_defs;
-
-  freeze_n = add_n;
-  if (freeze_also) {
-    add_objs[freeze_n++] = freeze_also;
-  }
-
-  if (!upb_refcounted_freeze(add_objs, freeze_n, status,
-                             UPB_MAX_MESSAGE_DEPTH * 2)) {
-    goto err;
-  }
-
-  /* This must be delayed until all errors have been detected, since error
-   * recovery code uses this table to cleanup defs. */
-  upb_strtable_uninit(&addtab);
-
-  /* TODO(haberman) we don't properly handle errors after this point (like
-   * OOM in upb_strtable_insert() below). */
-  for (i = 0; i < add_n; i++) {
-    upb_def *def = (upb_def*)add_objs[i];
-    const char *name = upb_def_fullname(def);
-    bool success;
-    success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));
-    UPB_ASSERT(success);
-  }
-  upb_gfree(add_defs);
-  return true;
-
-oom_err:
-  upb_status_seterrmsg(status, "out of memory");
-err: {
-    /* We need to donate the refs back. */
-    upb_strtable_begin(&iter, &addtab);
-    for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
-      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
-      upb_def_donateref(def, s, ref_donor);
-    }
-  }
-  upb_strtable_uninit(&addtab);
-  upb_gfree(add_defs);
-  UPB_ASSERT(!upb_ok(status));
+static bool default_err(void *ud, const upb_status *status) {
+  UPB_UNUSED(ud);
+  UPB_UNUSED(status);
   return false;
 }
 
-bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
-                    void *ref_donor, upb_status *status) {
-  return symtab_add(s, defs, n, ref_donor, NULL, status);
+static bool write_err_to(void *ud, const upb_status *status) {
+  upb_status *copy_to = ud;
+  upb_status_copy(copy_to, status);
+  return false;
 }
 
-bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status *status) {
-  size_t n;
-  size_t i;
-  upb_def **defs;
-  bool ret;
 
-  n = upb_filedef_defcount(file);
-  if (n == 0) {
-    return true;
-  }
-  defs = upb_gmalloc(sizeof(*defs) * n);
+/* upb_env ********************************************************************/
 
-  if (defs == NULL) {
-    upb_status_seterrmsg(status, "Out of memory");
-    return false;
-  }
+void upb_env_init(upb_env *e) {
+  default_alloc_ud *ud = (default_alloc_ud*)&e->default_alloc_ud;
+  e->ok_ = true;
+  e->bytes_allocated = 0;
+  e->cleanup_head = NULL;
 
-  for (i = 0; i < n; i++) {
-    defs[i] = upb_filedef_mutabledef(file, i);
-  }
+  ud->head = NULL;
 
-  ret = symtab_add(s, defs, n, NULL, upb_filedef_upcast_mutable(file), status);
-
-  upb_gfree(defs);
-  return ret;
+  /* Set default functions. */
+  upb_env_setallocfunc(e, default_alloc, ud);
+  upb_env_seterrorfunc(e, default_err, NULL);
 }
 
-/* Iteration. */
+void upb_env_uninit(upb_env *e) {
+  cleanup_ent *ent = e->cleanup_head;
 
-static void advance_to_matching(upb_symtab_iter *iter) {
-  if (iter->type == UPB_DEF_ANY)
-    return;
+  while (ent) {
+    ent->cleanup(ent->ud);
+    ent = ent->next;
+  }
 
-  while (!upb_strtable_done(&iter->iter) &&
-         iter->type != upb_symtab_iter_def(iter)->type) {
-    upb_strtable_next(&iter->iter);
+  /* Must do this after running cleanup functions, because this will delete
+     the memory we store our cleanup entries in! */
+  if (e->alloc == default_alloc) {
+    default_alloc_cleanup(e->alloc_ud);
   }
 }
 
-void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
-                      upb_deftype_t type) {
-  upb_strtable_begin(&iter->iter, &s->symtab);
-  iter->type = type;
-  advance_to_matching(iter);
+UPB_FORCEINLINE void upb_env_setallocfunc(upb_env *e, upb_alloc_func *alloc,
+                                          void *ud) {
+  e->alloc = alloc;
+  e->alloc_ud = ud;
 }
 
-void upb_symtab_next(upb_symtab_iter *iter) {
-  upb_strtable_next(&iter->iter);
-  advance_to_matching(iter);
+UPB_FORCEINLINE void upb_env_seterrorfunc(upb_env *e, upb_error_func *func,
+                                          void *ud) {
+  e->err = func;
+  e->err_ud = ud;
 }
 
-bool upb_symtab_done(const upb_symtab_iter *iter) {
-  return upb_strtable_done(&iter->iter);
+void upb_env_reporterrorsto(upb_env *e, upb_status *status) {
+  e->err = write_err_to;
+  e->err_ud = status;
 }
 
-const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter) {
-  return upb_value_getptr(upb_strtable_iter_value(&iter->iter));
-}
-/* We encode backwards, to avoid pre-computing lengths (one-pass encode). */
-
-
-#define UPB_PB_VARINT_MAX_LEN 10
-#define CHK(x) do { if (!(x)) { return false; } } while(0)
-
-/* Maps descriptor type -> upb field type.  */
-static const uint8_t upb_desctype_to_fieldtype2[] = {
-  UPB_WIRE_TYPE_END_GROUP,  /* ENDGROUP */
-  UPB_TYPE_DOUBLE,          /* DOUBLE */
-  UPB_TYPE_FLOAT,           /* FLOAT */
-  UPB_TYPE_INT64,           /* INT64 */
-  UPB_TYPE_UINT64,          /* UINT64 */
-  UPB_TYPE_INT32,           /* INT32 */
-  UPB_TYPE_UINT64,          /* FIXED64 */
-  UPB_TYPE_UINT32,          /* FIXED32 */
-  UPB_TYPE_BOOL,            /* BOOL */
-  UPB_TYPE_STRING,          /* STRING */
-  UPB_TYPE_MESSAGE,         /* GROUP */
-  UPB_TYPE_MESSAGE,         /* MESSAGE */
-  UPB_TYPE_BYTES,           /* BYTES */
-  UPB_TYPE_UINT32,          /* UINT32 */
-  UPB_TYPE_ENUM,            /* ENUM */
-  UPB_TYPE_INT32,           /* SFIXED32 */
-  UPB_TYPE_INT64,           /* SFIXED64 */
-  UPB_TYPE_INT32,           /* SINT32 */
-  UPB_TYPE_INT64,           /* SINT64 */
-};
-
-static size_t upb_encode_varint(uint64_t val, char *buf) {
-  size_t i;
-  if (val < 128) { buf[0] = val; return 1; }
-  i = 0;
-  while (val) {
-    uint8_t byte = val & 0x7fU;
-    val >>= 7;
-    if (val) byte |= 0x80U;
-    buf[i++] = byte;
-  }
-  return i;
+bool upb_env_ok(const upb_env *e) {
+  return e->ok_;
 }
 
-static uint32_t upb_zzencode_32(int32_t n) { return (n << 1) ^ (n >> 31); }
-static uint64_t upb_zzencode_64(int64_t n) { return (n << 1) ^ (n >> 63); }
-
-typedef struct {
-  upb_env *env;
-  char *buf, *ptr, *limit;
-} upb_encstate;
-
-static size_t upb_roundup_pow2(size_t bytes) {
-  size_t ret = 128;
-  while (ret < bytes) {
-    ret *= 2;
-  }
-  return ret;
+bool upb_env_reporterror(upb_env *e, const upb_status *status) {
+  e->ok_ = false;
+  return e->err(e->err_ud, status);
 }
 
-static bool upb_encode_growbuffer(upb_encstate *e, size_t bytes) {
-  size_t old_size = e->limit - e->buf;
-  size_t new_size = upb_roundup_pow2(bytes + (e->limit - e->ptr));
-  char *new_buf = upb_env_realloc(e->env, e->buf, old_size, new_size);
-  CHK(new_buf);
+bool upb_env_addcleanup(upb_env *e, upb_cleanup_func *func, void *ud) {
+  cleanup_ent *ent = upb_env_malloc(e, sizeof(cleanup_ent));
+  if (!ent) return false;
 
-  /* We want previous data at the end, realloc() put it at the beginning. */
-  memmove(e->limit - old_size, e->buf, old_size);
+  ent->cleanup = func;
+  ent->ud = ud;
+  ent->next = e->cleanup_head;
+  e->cleanup_head = ent;
 
-  e->ptr = new_buf + new_size - (e->limit - e->ptr);
-  e->limit = new_buf + new_size;
-  e->buf = new_buf;
   return true;
 }
 
-/* Call to ensure that at least "bytes" bytes are available for writing at
- * e->ptr.  Returns false if the bytes could not be allocated. */
-static bool upb_encode_reserve(upb_encstate *e, size_t bytes) {
-  CHK(UPB_LIKELY((size_t)(e->ptr - e->buf) >= bytes) ||
-      upb_encode_growbuffer(e, bytes));
-
-  e->ptr -= bytes;
-  return true;
-}
-
-/* Writes the given bytes to the buffer, handling reserve/advance. */
-static bool upb_put_bytes(upb_encstate *e, const void *data, size_t len) {
-  CHK(upb_encode_reserve(e, len));
-  memcpy(e->ptr, data, len);
-  return true;
-}
-
-static bool upb_put_fixed64(upb_encstate *e, uint64_t val) {
-  /* TODO(haberman): byte-swap for big endian. */
-  return upb_put_bytes(e, &val, sizeof(uint64_t));
-}
-
-static bool upb_put_fixed32(upb_encstate *e, uint32_t val) {
-  /* TODO(haberman): byte-swap for big endian. */
-  return upb_put_bytes(e, &val, sizeof(uint32_t));
-}
-
-static bool upb_put_varint(upb_encstate *e, uint64_t val) {
-  size_t len;
-  char *start;
-  CHK(upb_encode_reserve(e, UPB_PB_VARINT_MAX_LEN));
-  len = upb_encode_varint(val, e->ptr);
-  start = e->ptr + UPB_PB_VARINT_MAX_LEN - len;
-  memmove(start, e->ptr, len);
-  e->ptr = start;
-  return true;
-}
-
-static bool upb_put_double(upb_encstate *e, double d) {
-  uint64_t u64;
-  UPB_ASSERT(sizeof(double) == sizeof(uint64_t));
-  memcpy(&u64, &d, sizeof(uint64_t));
-  return upb_put_fixed64(e, u64);
-}
-
-static bool upb_put_float(upb_encstate *e, float d) {
-  uint32_t u32;
-  UPB_ASSERT(sizeof(float) == sizeof(uint32_t));
-  memcpy(&u32, &d, sizeof(uint32_t));
-  return upb_put_fixed32(e, u32);
-}
-
-static uint32_t upb_readcase(const char *msg, const upb_msglayout_msginit_v1 *m,
-                             int oneof_index) {
-  uint32_t ret;
-  memcpy(&ret, msg + m->oneofs[oneof_index].case_offset, sizeof(ret));
-  return ret;
-}
-
-static bool upb_readhasbit(const char *msg,
-                           const upb_msglayout_fieldinit_v1 *f) {
-  UPB_ASSERT(f->hasbit != UPB_NO_HASBIT);
-  return msg[f->hasbit / 8] & (1 << (f->hasbit % 8));
-}
-
-static bool upb_put_tag(upb_encstate *e, int field_number, int wire_type) {
-  return upb_put_varint(e, (field_number << 3) | wire_type);
-}
-
-static bool upb_put_fixedarray(upb_encstate *e, const upb_array *arr,
-                               size_t size) {
-  size_t bytes = arr->len * size;
-  return upb_put_bytes(e, arr->data, bytes) && upb_put_varint(e, bytes);
-}
-
-bool upb_encode_message(upb_encstate *e, const char *msg,
-                        const upb_msglayout_msginit_v1 *m,
-                        size_t *size);
-
-static bool upb_encode_array(upb_encstate *e, const char *field_mem,
-                             const upb_msglayout_msginit_v1 *m,
-                             const upb_msglayout_fieldinit_v1 *f) {
-  const upb_array *arr = *(const upb_array**)field_mem;
-
-  if (arr == NULL || arr->len == 0) {
-    return true;
-  }
-
-  UPB_ASSERT(arr->type == upb_desctype_to_fieldtype2[f->type]);
-
-#define VARINT_CASE(ctype, encode) { \
-  ctype *start = arr->data; \
-  ctype *ptr = start + arr->len; \
-  size_t pre_len = e->limit - e->ptr; \
-  do { \
-    ptr--; \
-    CHK(upb_put_varint(e, encode)); \
-  } while (ptr != start); \
-  CHK(upb_put_varint(e, e->limit - e->ptr - pre_len)); \
-} \
-break; \
-do { ; } while(0)
-
-  switch (f->type) {
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-      CHK(upb_put_fixedarray(e, arr, sizeof(double)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-      CHK(upb_put_fixedarray(e, arr, sizeof(float)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-      CHK(upb_put_fixedarray(e, arr, sizeof(uint64_t)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      CHK(upb_put_fixedarray(e, arr, sizeof(uint32_t)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      VARINT_CASE(uint64_t, *ptr);
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM:
-      VARINT_CASE(uint32_t, *ptr);
-    case UPB_DESCRIPTOR_TYPE_BOOL:
-      VARINT_CASE(bool, *ptr);
-    case UPB_DESCRIPTOR_TYPE_SINT32:
-      VARINT_CASE(int32_t, upb_zzencode_32(*ptr));
-    case UPB_DESCRIPTOR_TYPE_SINT64:
-      VARINT_CASE(int64_t, upb_zzencode_64(*ptr));
-    case UPB_DESCRIPTOR_TYPE_STRING:
-    case UPB_DESCRIPTOR_TYPE_BYTES: {
-      upb_stringview *start = arr->data;
-      upb_stringview *ptr = start + arr->len;
-      do {
-        ptr--;
-        CHK(upb_put_bytes(e, ptr->data, ptr->size) &&
-            upb_put_varint(e, ptr->size) &&
-            upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
-      } while (ptr != start);
-      return true;
-    }
-    case UPB_DESCRIPTOR_TYPE_GROUP: {
-      void **start = arr->data;
-      void **ptr = start + arr->len;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      do {
-        size_t size;
-        ptr--;
-        CHK(upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
-            upb_encode_message(e, *ptr, subm, &size) &&
-            upb_put_tag(e, f->number, UPB_WIRE_TYPE_START_GROUP));
-      } while (ptr != start);
-      return true;
-    }
-    case UPB_DESCRIPTOR_TYPE_MESSAGE: {
-      void **start = arr->data;
-      void **ptr = start + arr->len;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      do {
-        size_t size;
-        ptr--;
-        CHK(upb_encode_message(e, *ptr, subm, &size) &&
-            upb_put_varint(e, size) &&
-            upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
-      } while (ptr != start);
-      return true;
-    }
-  }
-#undef VARINT_CASE
-
-  /* We encode all primitive arrays as packed, regardless of what was specified
-   * in the .proto file.  Could special case 1-sized arrays. */
-  CHK(upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
-  return true;
-}
-
-static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
-                                   const upb_msglayout_msginit_v1 *m,
-                                   const upb_msglayout_fieldinit_v1 *f,
-                                   bool is_proto3) {
-  bool skip_zero_value = is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF;
-
-#define CASE(ctype, type, wire_type, encodeval) do { \
-  ctype val = *(ctype*)field_mem; \
-  if (skip_zero_value && val == 0) { \
-    return true; \
-  } \
-  return upb_put_ ## type(e, encodeval) && \
-      upb_put_tag(e, f->number, wire_type); \
-} while(0)
-
-  switch (f->type) {
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-      CASE(double, double, UPB_WIRE_TYPE_64BIT, val);
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-      CASE(float, float, UPB_WIRE_TYPE_32BIT, val);
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      CASE(uint64_t, varint, UPB_WIRE_TYPE_VARINT, val);
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM:
-      CASE(uint32_t, varint, UPB_WIRE_TYPE_VARINT, val);
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-      CASE(uint64_t, fixed64, UPB_WIRE_TYPE_64BIT, val);
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      CASE(uint32_t, fixed32, UPB_WIRE_TYPE_32BIT, val);
-    case UPB_DESCRIPTOR_TYPE_BOOL:
-      CASE(bool, varint, UPB_WIRE_TYPE_VARINT, val);
-    case UPB_DESCRIPTOR_TYPE_SINT32:
-      CASE(int32_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_32(val));
-    case UPB_DESCRIPTOR_TYPE_SINT64:
-      CASE(int64_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_64(val));
-    case UPB_DESCRIPTOR_TYPE_STRING:
-    case UPB_DESCRIPTOR_TYPE_BYTES: {
-      upb_stringview view = *(upb_stringview*)field_mem;
-      if (skip_zero_value && view.size == 0) {
-        return true;
-      }
-      return upb_put_bytes(e, view.data, view.size) &&
-          upb_put_varint(e, view.size) &&
-          upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED);
-    }
-    case UPB_DESCRIPTOR_TYPE_GROUP: {
-      size_t size;
-      void *submsg = *(void**)field_mem;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      if (skip_zero_value && submsg == NULL) {
-        return true;
-      }
-      return upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
-          upb_encode_message(e, submsg, subm, &size) &&
-          upb_put_tag(e, f->number, UPB_WIRE_TYPE_START_GROUP);
-    }
-    case UPB_DESCRIPTOR_TYPE_MESSAGE: {
-      size_t size;
-      void *submsg = *(void**)field_mem;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      if (skip_zero_value && submsg == NULL) {
-        return true;
-      }
-      return upb_encode_message(e, submsg, subm, &size) &&
-          upb_put_varint(e, size) &&
-          upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED);
-    }
-  }
-#undef CASE
-  UPB_UNREACHABLE();
-}
-
-bool upb_encode_hasscalarfield(const char *msg,
-                               const upb_msglayout_msginit_v1 *m,
-                               const upb_msglayout_fieldinit_v1 *f) {
-  if (f->oneof_index != UPB_NOT_IN_ONEOF) {
-    return upb_readcase(msg, m, f->oneof_index) == f->number;
-  } else if (m->is_proto2) {
-    return upb_readhasbit(msg, f);
+void *upb_env_malloc(upb_env *e, size_t size) {
+  e->bytes_allocated += size;
+  if (e->alloc == seeded_alloc) {
+    /* This is equivalent to the next branch, but allows inlining for a
+     * measurable perf benefit. */
+    return seeded_alloc(e->alloc_ud, NULL, 0, size);
   } else {
-    /* For proto3, we'll test for the field being empty later. */
-    return true;
+    return e->alloc(e->alloc_ud, NULL, 0, size);
   }
 }
 
-bool upb_encode_message(upb_encstate* e, const char *msg,
-                        const upb_msglayout_msginit_v1 *m,
-                        size_t *size) {
-  int i;
-  char *buf_end = e->ptr;
+void *upb_env_realloc(upb_env *e, void *ptr, size_t oldsize, size_t size) {
+  char *ret;
+  assert(oldsize <= size);
+  ret = e->alloc(e->alloc_ud, ptr, oldsize, size);
 
-  if (msg == NULL) {
-    return true;
-  }
+#ifndef NDEBUG
+  /* Overwrite non-preserved memory to ensure callers are passing the oldsize
+   * that they truly require. */
+  memset(ret + oldsize, 0xff, size - oldsize);
+#endif
 
-  for (i = m->field_count - 1; i >= 0; i--) {
-    const upb_msglayout_fieldinit_v1 *f = &m->fields[i];
+  return ret;
+}
 
-    if (f->label == UPB_LABEL_REPEATED) {
-      CHK(upb_encode_array(e, msg + f->offset, m, f));
+size_t upb_env_bytesallocated(const upb_env *e) {
+  return e->bytes_allocated;
+}
+
+
+/* upb_seededalloc ************************************************************/
+
+/* Be conservative and choose 16 in case anyone is using SSE. */
+static const size_t maxalign = 16;
+
+static size_t align_up(size_t size) {
+  return ((size + maxalign - 1) / maxalign) * maxalign;
+}
+
+UPB_FORCEINLINE static void *seeded_alloc(void *ud, void *ptr, size_t oldsize,
+                                          size_t size) {
+  upb_seededalloc *a = ud;
+
+  size = align_up(size);
+
+  assert(a->mem_limit >= a->mem_ptr);
+
+  if (oldsize == 0 && size <= (size_t)(a->mem_limit - a->mem_ptr)) {
+    /* Fast path: we can satisfy from the initial allocation. */
+    void *ret = a->mem_ptr;
+    a->mem_ptr += size;
+    return ret;
+  } else {
+    char *chptr = ptr;
+    /* Slow path: fallback to other allocator. */
+    a->need_cleanup = true;
+    /* Is `ptr` part of the user-provided initial block? Don't pass it to the
+     * default allocator if so; otherwise, it may try to realloc() the block. */
+    if (chptr >= a->mem_base && chptr < a->mem_limit) {
+      void *ret;
+      assert(chptr + oldsize <= a->mem_limit);
+      ret = a->alloc(a->alloc_ud, NULL, 0, size);
+      if (ret) memcpy(ret, ptr, oldsize);
+      return ret;
     } else {
-      if (upb_encode_hasscalarfield(msg, m, f)) {
-        CHK(upb_encode_scalarfield(e, msg + f->offset, m, f, !m->is_proto2));
-      }
+      return a->alloc(a->alloc_ud, ptr, oldsize, size);
     }
   }
-
-  *size = buf_end - e->ptr;
-  return true;
 }
 
-char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *m,
-                 upb_env *env, size_t *size) {
-  upb_encstate e;
-  e.env = env;
-  e.buf = NULL;
-  e.limit = NULL;
-  e.ptr = NULL;
+void upb_seededalloc_init(upb_seededalloc *a, void *mem, size_t len) {
+  default_alloc_ud *ud = (default_alloc_ud*)&a->default_alloc_ud;
+  a->mem_base = mem;
+  a->mem_ptr = mem;
+  a->mem_limit = (char*)mem + len;
+  a->need_cleanup = false;
+  a->returned_allocfunc = false;
 
-  if (!upb_encode_message(&e, msg, m, size)) {
-    *size = 0;
-    return NULL;
-  }
+  ud->head = NULL;
 
-  *size = e.limit - e.ptr;
+  upb_seededalloc_setfallbackalloc(a, default_alloc, ud);
+}
 
-  if (*size == 0) {
-    static char ch;
-    return &ch;
-  } else {
-    UPB_ASSERT(e.ptr);
-    return e.ptr;
+void upb_seededalloc_uninit(upb_seededalloc *a) {
+  if (a->alloc == default_alloc && a->need_cleanup) {
+    default_alloc_cleanup(a->alloc_ud);
   }
 }
 
-#undef CHK
+UPB_FORCEINLINE void upb_seededalloc_setfallbackalloc(upb_seededalloc *a,
+                                                      upb_alloc_func *alloc,
+                                                      void *ud) {
+  assert(!a->returned_allocfunc);
+  a->alloc = alloc;
+  a->alloc_ud = ud;
+}
+
+upb_alloc_func *upb_seededalloc_getallocfunc(upb_seededalloc *a) {
+  a->returned_allocfunc = true;
+  return seeded_alloc;
+}
 /*
 ** TODO(haberman): it's unclear whether a lot of the consistency checks should
-** UPB_ASSERT() or return false.
+** assert() or return false.
 */
 
 
+#include <stdlib.h>
 #include <string.h>
 
 
-static void *upb_calloc(size_t size) {
-  void *mem = upb_gmalloc(size);
-  if (mem) {
-    memset(mem, 0, size);
-  }
-  return mem;
-}
 
 /* Defined for the sole purpose of having a unique pointer value for
  * UPB_NO_CLOSURE. */
@@ -3365,8 +1996,8 @@
 
   upb_inttable_uninit(&h->cleanup_);
   upb_msgdef_unref(h->msg, h);
-  upb_gfree(h->sub);
-  upb_gfree(h);
+  free(h->sub);
+  free(h);
 }
 
 static void visithandlers(const upb_refcounted *r, upb_refcounted_visit *visit,
@@ -3442,7 +2073,7 @@
 static int32_t trygetsel(upb_handlers *h, const upb_fielddef *f,
                          upb_handlertype_t type) {
   upb_selector_t sel;
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   if (upb_handlers_msgdef(h) != upb_fielddef_containingtype(f)) {
     upb_status_seterrf(
         &h->status_, "type mismatch: field %s does not belong to message %s",
@@ -3462,7 +2093,7 @@
 static upb_selector_t handlers_getsel(upb_handlers *h, const upb_fielddef *f,
                              upb_handlertype_t type) {
   int32_t sel = trygetsel(h, f, type);
-  UPB_ASSERT(sel >= 0);
+  assert(sel >= 0);
   return sel;
 }
 
@@ -3478,7 +2109,7 @@
   const void *closure_type;
   const void **context_closure_type;
 
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
 
   if (sel < 0) {
     upb_status_seterrmsg(&h->status_,
@@ -3558,7 +2189,7 @@
   const void *ret;
   upb_selector_t sel;
 
-  UPB_ASSERT(type != UPB_HANDLER_STRING);
+  assert(type != UPB_HANDLER_STRING);
   ret = h->top_closure_type;
 
   if (upb_fielddef_isseq(f) &&
@@ -3613,23 +2244,17 @@
   int extra;
   upb_handlers *h;
 
-  UPB_ASSERT(upb_msgdef_isfrozen(md));
+  assert(upb_msgdef_isfrozen(md));
 
   extra = sizeof(upb_handlers_tabent) * (md->selector_count - 1);
-  h = upb_calloc(sizeof(*h) + extra);
+  h = calloc(sizeof(*h) + extra, 1);
   if (!h) return NULL;
 
   h->msg = md;
   upb_msgdef_ref(h->msg, h);
   upb_status_clear(&h->status_);
-
-  if (md->submsg_field_count > 0) {
-    h->sub = upb_calloc(md->submsg_field_count * sizeof(*h->sub));
-    if (!h->sub) goto oom;
-  } else {
-    h->sub = 0;
-  }
-
+  h->sub = calloc(md->submsg_field_count, sizeof(*h->sub));
+  if (!h->sub) goto oom;
   if (!upb_refcounted_init(upb_handlers_upcast_mutable(h), &vtbl, owner))
     goto oom;
   if (!upb_inttable_init(&h->cleanup_, UPB_CTYPE_FPTR)) goto oom;
@@ -3662,18 +2287,18 @@
 
   r = upb_handlers_upcast_mutable(ret);
   ok = upb_refcounted_freeze(&r, 1, NULL, UPB_MAX_HANDLER_DEPTH);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
 
   return ret;
 }
 
 const upb_status *upb_handlers_status(upb_handlers *h) {
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   return &h->status_;
 }
 
 void upb_handlers_clearerr(upb_handlers *h) {
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   upb_status_clear(&h->status_);
 }
 
@@ -3701,12 +2326,6 @@
 
 #undef SETTER
 
-bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func,
-                             upb_handlerattr *attr) {
-  return doset(h, UPB_UNKNOWN_SELECTOR, NULL, UPB_HANDLER_INT32,
-               (upb_func *)func, attr);
-}
-
 bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,
                               upb_handlerattr *attr) {
   return doset(h, UPB_STARTMSG_SELECTOR, NULL, UPB_HANDLER_INT32,
@@ -3715,16 +2334,16 @@
 
 bool upb_handlers_setendmsg(upb_handlers *h, upb_endmsg_handlerfunc *func,
                             upb_handlerattr *attr) {
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   return doset(h, UPB_ENDMSG_SELECTOR, NULL, UPB_HANDLER_INT32,
                (upb_func *)func, attr);
 }
 
 bool upb_handlers_setsubhandlers(upb_handlers *h, const upb_fielddef *f,
                                  const upb_handlers *sub) {
-  UPB_ASSERT(sub);
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
-  UPB_ASSERT(upb_fielddef_issubmsg(f));
+  assert(sub);
+  assert(!upb_handlers_isfrozen(h));
+  assert(upb_fielddef_issubmsg(f));
   if (SUBH_F(h, f)) return false;  /* Can't reset. */
   if (upb_msgdef_upcast(upb_handlers_msgdef(sub)) != upb_fielddef_subdef(f)) {
     return false;
@@ -3736,7 +2355,7 @@
 
 const upb_handlers *upb_handlers_getsubhandlers(const upb_handlers *h,
                                                 const upb_fielddef *f) {
-  UPB_ASSERT(upb_fielddef_issubmsg(f));
+  assert(upb_fielddef_issubmsg(f));
   return SUBH_F(h, f);
 }
 
@@ -3762,7 +2381,7 @@
     return false;
   }
   ok = upb_inttable_insertptr(&h->cleanup_, p, upb_value_fptr(func));
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return true;
 }
 
@@ -3863,7 +2482,7 @@
     case UPB_TYPE_FLOAT: return UPB_HANDLER_FLOAT;
     case UPB_TYPE_DOUBLE: return UPB_HANDLER_DOUBLE;
     case UPB_TYPE_BOOL: return UPB_HANDLER_BOOL;
-    default: UPB_ASSERT(false); return -1;  /* Invalid input. */
+    default: assert(false); return -1;  /* Invalid input. */
   }
 }
 
@@ -3926,7 +2545,7 @@
       *s = f->selector_base;
       break;
   }
-  UPB_ASSERT((size_t)*s < upb_fielddef_containingtype(f)->selector_count);
+  assert((size_t)*s < upb_fielddef_containingtype(f)->selector_count);
   return true;
 }
 
@@ -4031,1191 +2650,6 @@
   h->table[UPB_ENDSTR_SELECTOR].attr.handler_data_ = d;
   return true;
 }
-
-
-static bool is_power_of_two(size_t val) {
-  return (val & (val - 1)) == 0;
-}
-
-/* Align up to the given power of 2. */
-static size_t align_up(size_t val, size_t align) {
-  UPB_ASSERT(is_power_of_two(align));
-  return (val + align - 1) & ~(align - 1);
-}
-
-static size_t div_round_up(size_t n, size_t d) {
-  return (n + d - 1) / d;
-}
-
-bool upb_fieldtype_mapkeyok(upb_fieldtype_t type) {
-  return type == UPB_TYPE_BOOL || type == UPB_TYPE_INT32 ||
-         type == UPB_TYPE_UINT32 || type == UPB_TYPE_INT64 ||
-         type == UPB_TYPE_UINT64 || type == UPB_TYPE_STRING;
-}
-
-void *upb_array_pack(const upb_array *arr, void *p, size_t *ofs, size_t size);
-void *upb_map_pack(const upb_map *map, void *p, size_t *ofs, size_t size);
-
-#define PTR_AT(msg, ofs, type) (type*)((char*)msg + ofs)
-#define VOIDPTR_AT(msg, ofs) PTR_AT(msg, ofs, void)
-#define ENCODE_MAX_NESTING 64
-#define CHECK_TRUE(x) if (!(x)) { return false; }
-
-/** upb_msgval ****************************************************************/
-
-#define upb_alignof(t) offsetof(struct { char c; t x; }, x)
-
-/* These functions will generate real memcpy() calls on ARM sadly, because
- * the compiler assumes they might not be aligned. */
-
-static upb_msgval upb_msgval_read(const void *p, size_t ofs,
-                                  uint8_t size) {
-  upb_msgval val;
-  p = (char*)p + ofs;
-  memcpy(&val, p, size);
-  return val;
-}
-
-static void upb_msgval_write(void *p, size_t ofs, upb_msgval val,
-                             uint8_t size) {
-  p = (char*)p + ofs;
-  memcpy(p, &val, size);
-}
-
-static size_t upb_msgval_sizeof(upb_fieldtype_t type) {
-  switch (type) {
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT64:
-      return 8;
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_FLOAT:
-      return 4;
-    case UPB_TYPE_BOOL:
-      return 1;
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE:
-      return sizeof(void*);
-    case UPB_TYPE_STRING:
-      return sizeof(upb_stringview);
-  }
-  UPB_UNREACHABLE();
-}
-
-static uint8_t upb_msg_fieldsize(const upb_msglayout_fieldinit_v1 *field) {
-  if (field->label == UPB_LABEL_REPEATED) {
-    return sizeof(void*);
-  } else {
-    return upb_msgval_sizeof(field->type);
-  }
-}
-
-static uint8_t upb_msg_fielddefsize(const upb_fielddef *f) {
-  if (upb_fielddef_isseq(f)) {
-    return sizeof(void*);
-  } else {
-    return upb_msgval_sizeof(upb_fielddef_type(f));
-  }
-}
-
-/* TODO(haberman): this is broken right now because upb_msgval can contain
- * a char* / size_t pair, which is too big for a upb_value.  To fix this
- * we'll probably need to dynamically allocate a upb_msgval and store a
- * pointer to that in the tables for extensions/maps. */
-static upb_value upb_toval(upb_msgval val) {
-  upb_value ret;
-  UPB_UNUSED(val);
-  memset(&ret, 0, sizeof(upb_value));  /* XXX */
-  return ret;
-}
-
-static upb_msgval upb_msgval_fromval(upb_value val) {
-  upb_msgval ret;
-  UPB_UNUSED(val);
-  memset(&ret, 0, sizeof(upb_msgval));  /* XXX */
-  return ret;
-}
-
-static upb_ctype_t upb_fieldtotabtype(upb_fieldtype_t type) {
-  switch (type) {
-    case UPB_TYPE_FLOAT: return UPB_CTYPE_FLOAT;
-    case UPB_TYPE_DOUBLE: return UPB_CTYPE_DOUBLE;
-    case UPB_TYPE_BOOL: return UPB_CTYPE_BOOL;
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE:
-    case UPB_TYPE_STRING: return UPB_CTYPE_CONSTPTR;
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_INT32: return UPB_CTYPE_INT32;
-    case UPB_TYPE_UINT32: return UPB_CTYPE_UINT32;
-    case UPB_TYPE_INT64: return UPB_CTYPE_INT64;
-    case UPB_TYPE_UINT64: return UPB_CTYPE_UINT64;
-    default: UPB_ASSERT(false); return 0;
-  }
-}
-
-static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
-  switch (upb_fielddef_type(f)) {
-      case UPB_TYPE_FLOAT:
-        return upb_msgval_float(upb_fielddef_defaultfloat(f));
-      case UPB_TYPE_DOUBLE:
-        return upb_msgval_double(upb_fielddef_defaultdouble(f));
-      case UPB_TYPE_BOOL:
-        return upb_msgval_bool(upb_fielddef_defaultbool(f));
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES: {
-        size_t len;
-        const char *ptr = upb_fielddef_defaultstr(f, &len);
-        return upb_msgval_makestr(ptr, len);
-      }
-      case UPB_TYPE_MESSAGE:
-        return upb_msgval_msg(NULL);
-      case UPB_TYPE_ENUM:
-      case UPB_TYPE_INT32:
-        return upb_msgval_int32(upb_fielddef_defaultint32(f));
-      case UPB_TYPE_UINT32:
-        return upb_msgval_uint32(upb_fielddef_defaultuint32(f));
-      case UPB_TYPE_INT64:
-        return upb_msgval_int64(upb_fielddef_defaultint64(f));
-      case UPB_TYPE_UINT64:
-        return upb_msgval_uint64(upb_fielddef_defaultuint64(f));
-      default:
-        UPB_ASSERT(false);
-        return upb_msgval_msg(NULL);
-  }
-}
-
-
-/** upb_msglayout *************************************************************/
-
-struct upb_msglayout {
-  struct upb_msglayout_msginit_v1 data;
-};
-
-static void upb_msglayout_free(upb_msglayout *l) {
-  upb_gfree(l->data.default_msg);
-  upb_gfree(l);
-}
-
-static size_t upb_msglayout_place(upb_msglayout *l, size_t size) {
-  size_t ret;
-
-  l->data.size = align_up(l->data.size, size);
-  ret = l->data.size;
-  l->data.size += size;
-  return ret;
-}
-
-static uint32_t upb_msglayout_offset(const upb_msglayout *l,
-                                     const upb_fielddef *f) {
-  return l->data.fields[upb_fielddef_index(f)].offset;
-}
-
-static uint32_t upb_msglayout_hasbit(const upb_msglayout *l,
-                                     const upb_fielddef *f) {
-  return l->data.fields[upb_fielddef_index(f)].hasbit;
-}
-
-static bool upb_msglayout_initdefault(upb_msglayout *l, const upb_msgdef *m) {
-  upb_msg_field_iter it;
-
-  if (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2 && l->data.size) {
-    /* Allocate default message and set default values in it. */
-    l->data.default_msg = upb_gmalloc(l->data.size);
-    if (!l->data.default_msg) {
-      return false;
-    }
-
-    memset(l->data.default_msg, 0, l->data.size);
-
-    for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
-         upb_msg_field_next(&it)) {
-      const upb_fielddef* f = upb_msg_iter_field(&it);
-
-      if (upb_fielddef_containingoneof(f)) {
-        continue;
-      }
-
-      /* TODO(haberman): handle strings. */
-      if (!upb_fielddef_isstring(f) &&
-          !upb_fielddef_issubmsg(f) &&
-          !upb_fielddef_isseq(f)) {
-        upb_msg_set(l->data.default_msg,
-                    upb_fielddef_index(f),
-                    upb_msgval_fromdefault(f),
-                    l);
-      }
-    }
-  }
-
-  return true;
-}
-
-static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
-  upb_msg_field_iter it;
-  upb_msg_oneof_iter oit;
-  upb_msglayout *l;
-  size_t hasbit;
-  size_t submsg_count = 0;
-  const upb_msglayout_msginit_v1 **submsgs;
-  upb_msglayout_fieldinit_v1 *fields;
-  upb_msglayout_oneofinit_v1 *oneofs;
-
-  for (upb_msg_field_begin(&it, m);
-       !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    const upb_fielddef* f = upb_msg_iter_field(&it);
-    if (upb_fielddef_issubmsg(f)) {
-      submsg_count++;
-    }
-  }
-
-  l = upb_gmalloc(sizeof(*l));
-  if (!l) return NULL;
-
-  memset(l, 0, sizeof(*l));
-
-  fields = upb_gmalloc(upb_msgdef_numfields(m) * sizeof(*fields));
-  submsgs = upb_gmalloc(submsg_count * sizeof(*submsgs));
-  oneofs = upb_gmalloc(upb_msgdef_numoneofs(m) * sizeof(*oneofs));
-
-  if ((!fields && upb_msgdef_numfields(m)) ||
-      (!submsgs && submsg_count) ||
-      (!oneofs && upb_msgdef_numoneofs(m))) {
-    /* OOM. */
-    upb_gfree(l);
-    upb_gfree(fields);
-    upb_gfree(submsgs);
-    upb_gfree(oneofs);
-    return NULL;
-  }
-
-  l->data.field_count = upb_msgdef_numfields(m);
-  l->data.oneof_count = upb_msgdef_numoneofs(m);
-  l->data.fields = fields;
-  l->data.submsgs = submsgs;
-  l->data.oneofs = oneofs;
-  l->data.is_proto2 = (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2);
-
-  /* Allocate data offsets in three stages:
-   *
-   * 1. hasbits.
-   * 2. regular fields.
-   * 3. oneof fields.
-   *
-   * OPT: There is a lot of room for optimization here to minimize the size.
-   */
-
-  /* Allocate hasbits and set basic field attributes. */
-  for (upb_msg_field_begin(&it, m), hasbit = 0;
-       !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    const upb_fielddef* f = upb_msg_iter_field(&it);
-    upb_msglayout_fieldinit_v1 *field = &fields[upb_fielddef_index(f)];
-
-    field->number = upb_fielddef_number(f);
-    field->type = upb_fielddef_type(f);
-    field->label = upb_fielddef_label(f);
-
-    if (upb_fielddef_containingoneof(f)) {
-      field->oneof_index = upb_oneofdef_index(upb_fielddef_containingoneof(f));
-    } else {
-      field->oneof_index = UPB_NOT_IN_ONEOF;
-    }
-
-    if (upb_fielddef_haspresence(f) && !upb_fielddef_containingoneof(f)) {
-      field->hasbit = hasbit++;
-    }
-  }
-
-  /* Account for space used by hasbits. */
-  l->data.size = div_round_up(hasbit, 8);
-
-  /* Allocate non-oneof fields. */
-  for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    const upb_fielddef* f = upb_msg_iter_field(&it);
-    size_t field_size = upb_msg_fielddefsize(f);
-    size_t index = upb_fielddef_index(f);
-
-    if (upb_fielddef_containingoneof(f)) {
-      /* Oneofs are handled separately below. */
-      continue;
-    }
-
-    fields[index].offset = upb_msglayout_place(l, field_size);
-  }
-
-  /* Allocate oneof fields.  Each oneof field consists of a uint32 for the case
-   * and space for the actual data. */
-  for (upb_msg_oneof_begin(&oit, m); !upb_msg_oneof_done(&oit);
-       upb_msg_oneof_next(&oit)) {
-    const upb_oneofdef* o = upb_msg_iter_oneof(&oit);
-    upb_oneof_iter fit;
-
-    size_t case_size = sizeof(uint32_t);  /* Could potentially optimize this. */
-    upb_msglayout_oneofinit_v1 *oneof = &oneofs[upb_oneofdef_index(o)];
-    size_t field_size = 0;
-
-    /* Calculate field size: the max of all field sizes. */
-    for (upb_oneof_begin(&fit, o);
-         !upb_oneof_done(&fit);
-         upb_oneof_next(&fit)) {
-      const upb_fielddef* f = upb_oneof_iter_field(&fit);
-      field_size = UPB_MAX(field_size, upb_msg_fielddefsize(f));
-    }
-
-    /* Align and allocate case offset. */
-    oneof->case_offset = upb_msglayout_place(l, case_size);
-    oneof->data_offset = upb_msglayout_place(l, field_size);
-  }
-
-  /* Size of the entire structure should be a multiple of its greatest
-   * alignment.  TODO: track overall alignment for real? */
-  l->data.size = align_up(l->data.size, 8);
-
-  if (upb_msglayout_initdefault(l, m)) {
-    return l;
-  } else {
-    upb_msglayout_free(l);
-    return NULL;
-  }
-}
-
-
-/** upb_msgfactory ************************************************************/
-
-struct upb_msgfactory {
-  const upb_symtab *symtab;  /* We own a ref. */
-  upb_inttable layouts;
-  upb_inttable mergehandlers;
-};
-
-upb_msgfactory *upb_msgfactory_new(const upb_symtab *symtab) {
-  upb_msgfactory *ret = upb_gmalloc(sizeof(*ret));
-
-  ret->symtab = symtab;
-  upb_inttable_init(&ret->layouts, UPB_CTYPE_PTR);
-  upb_inttable_init(&ret->mergehandlers, UPB_CTYPE_CONSTPTR);
-
-  return ret;
-}
-
-void upb_msgfactory_free(upb_msgfactory *f) {
-  upb_inttable_iter i;
-  upb_inttable_begin(&i, &f->layouts);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    upb_msglayout *l = upb_value_getptr(upb_inttable_iter_value(&i));
-    upb_msglayout_free(l);
-  }
-
-  upb_inttable_begin(&i, &f->mergehandlers);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    const upb_handlers *h = upb_value_getconstptr(upb_inttable_iter_value(&i));
-    upb_handlers_unref(h, f);
-  }
-
-  upb_inttable_uninit(&f->layouts);
-  upb_inttable_uninit(&f->mergehandlers);
-  upb_gfree(f);
-}
-
-const upb_symtab *upb_msgfactory_symtab(const upb_msgfactory *f) {
-  return f->symtab;
-}
-
-const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
-                                              const upb_msgdef *m) {
-  upb_value v;
-  UPB_ASSERT(upb_symtab_lookupmsg(f->symtab, upb_msgdef_fullname(m)) == m);
-  UPB_ASSERT(!upb_msgdef_mapentry(m));
-
-  if (upb_inttable_lookupptr(&f->layouts, m, &v)) {
-    UPB_ASSERT(upb_value_getptr(v));
-    return upb_value_getptr(v);
-  } else {
-    upb_msgfactory *mutable_f = (void*)f;
-    upb_msglayout *l = upb_msglayout_new(m);
-    upb_inttable_insertptr(&mutable_f->layouts, m, upb_value_ptr(l));
-    UPB_ASSERT(l);
-    return l;
-  }
-}
-
-/* Our handlers that we don't expose externally. */
-
-void *upb_msg_startstr(void *msg, const void *hd, size_t size_hint) {
-  uint32_t ofs = (uintptr_t)hd;
-  upb_alloc *alloc = upb_msg_alloc(msg);
-  upb_msgval val;
-  UPB_UNUSED(size_hint);
-
-  val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
-
-  upb_free(alloc, (void*)val.str.data);
-  val.str.data = NULL;
-  val.str.size = 0;
-
-  upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
-  return msg;
-}
-
-size_t upb_msg_str(void *msg, const void *hd, const char *ptr, size_t size,
-                   const upb_bufhandle *handle) {
-  uint32_t ofs = (uintptr_t)hd;
-  upb_alloc *alloc = upb_msg_alloc(msg);
-  upb_msgval val;
-  size_t newsize;
-  UPB_UNUSED(handle);
-
-  val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
-
-  newsize = val.str.size + size;
-  val.str.data = upb_realloc(alloc, (void*)val.str.data, val.str.size, newsize);
-
-  if (!val.str.data) {
-    return false;
-  }
-
-  memcpy((char*)val.str.data + val.str.size, ptr, size);
-  val.str.size = newsize;
-  upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
-  return size;
-}
-
-static void callback(const void *closure, upb_handlers *h) {
-  upb_msgfactory *factory = (upb_msgfactory*)closure;
-  const upb_msgdef *md = upb_handlers_msgdef(h);
-  const upb_msglayout* layout = upb_msgfactory_getlayout(factory, md);
-  upb_msg_field_iter i;
-  UPB_UNUSED(factory);
-
-  for(upb_msg_field_begin(&i, md);
-      !upb_msg_field_done(&i);
-      upb_msg_field_next(&i)) {
-    const upb_fielddef *f = upb_msg_iter_field(&i);
-    size_t offset = upb_msglayout_offset(layout, f);
-    upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-    upb_handlerattr_sethandlerdata(&attr, (void*)offset);
-
-    if (upb_fielddef_isseq(f)) {
-    } else if (upb_fielddef_isstring(f)) {
-      upb_handlers_setstartstr(h, f, upb_msg_startstr, &attr);
-      upb_handlers_setstring(h, f, upb_msg_str, &attr);
-    } else {
-      upb_msg_setscalarhandler(
-          h, f, offset, upb_msglayout_hasbit(layout, f));
-    }
-  }
-}
-
-const upb_handlers *upb_msgfactory_getmergehandlers(upb_msgfactory *f,
-                                                    const upb_msgdef *m) {
-  upb_msgfactory *mutable_f = (void*)f;
-
-  /* TODO(haberman): properly cache these. */
-  const upb_handlers *ret = upb_handlers_newfrozen(m, f, callback, f);
-  upb_inttable_push(&mutable_f->mergehandlers, upb_value_constptr(ret));
-
-  return ret;
-}
-
-const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
-                                                     const upb_handlers *h) {
-  const upb_msgdef *md = upb_handlers_msgdef(h);
-  return (const upb_visitorplan*)upb_msgfactory_getlayout(f, md);
-}
-
-
-/** upb_visitor ***************************************************************/
-
-struct upb_visitor {
-  const upb_msglayout *layout;
-  upb_sink *sink;
-};
-
-static upb_selector_t getsel2(const upb_fielddef *f, upb_handlertype_t type) {
-  upb_selector_t ret;
-  bool ok = upb_handlers_getselector(f, type, &ret);
-  UPB_ASSERT(ok);
-  return ret;
-}
-
-static bool upb_visitor_hasfield(const upb_msg *msg, const upb_fielddef *f,
-                                 const upb_msglayout *layout) {
-  int field_index = upb_fielddef_index(f);
-  if (upb_fielddef_isseq(f)) {
-    return upb_msgval_getarr(upb_msg_get(msg, field_index, layout)) != NULL;
-  } else if (upb_msgdef_syntax(upb_fielddef_containingtype(f)) ==
-             UPB_SYNTAX_PROTO2) {
-    return upb_msg_has(msg, field_index, layout);
-  } else {
-    upb_msgval val = upb_msg_get(msg, field_index, layout);
-    switch (upb_fielddef_type(f)) {
-      case UPB_TYPE_FLOAT:
-        return upb_msgval_getfloat(val) != 0;
-      case UPB_TYPE_DOUBLE:
-        return upb_msgval_getdouble(val) != 0;
-      case UPB_TYPE_BOOL:
-        return upb_msgval_getbool(val);
-      case UPB_TYPE_ENUM:
-      case UPB_TYPE_INT32:
-        return upb_msgval_getint32(val) != 0;
-      case UPB_TYPE_UINT32:
-        return upb_msgval_getuint32(val) != 0;
-      case UPB_TYPE_INT64:
-        return upb_msgval_getint64(val) != 0;
-      case UPB_TYPE_UINT64:
-        return upb_msgval_getuint64(val) != 0;
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES:
-        return upb_msgval_getstr(val).size > 0;
-      case UPB_TYPE_MESSAGE:
-        return upb_msgval_getmsg(val) != NULL;
-    }
-    UPB_UNREACHABLE();
-  }
-}
-
-static bool upb_visitor_visitmsg2(const upb_msg *msg,
-                                  const upb_msglayout *layout, upb_sink *sink,
-                                  int depth) {
-  const upb_msgdef *md = upb_handlers_msgdef(sink->handlers);
-  upb_msg_field_iter i;
-  upb_status status;
-
-  upb_sink_startmsg(sink);
-
-  /* Protect against cycles (possible because users may freely reassign message
-   * and repeated fields) by imposing a maximum recursion depth. */
-  if (depth > ENCODE_MAX_NESTING) {
-    return false;
-  }
-
-  for (upb_msg_field_begin(&i, md);
-       !upb_msg_field_done(&i);
-       upb_msg_field_next(&i)) {
-    upb_fielddef *f = upb_msg_iter_field(&i);
-    upb_msgval val;
-
-    if (!upb_visitor_hasfield(msg, f, layout)) {
-      continue;
-    }
-
-    val = upb_msg_get(msg, upb_fielddef_index(f), layout);
-
-    if (upb_fielddef_isseq(f)) {
-      const upb_array *arr = upb_msgval_getarr(val);
-      UPB_ASSERT(arr);
-      /* TODO: putary(ary, f, sink, depth);*/
-    } else if (upb_fielddef_issubmsg(f)) {
-      const upb_map *map = upb_msgval_getmap(val);
-      UPB_ASSERT(map);
-      /* TODO: putmap(map, f, sink, depth);*/
-    } else if (upb_fielddef_isstring(f)) {
-      /* TODO putstr(); */
-    } else {
-      upb_selector_t sel = getsel2(f, upb_handlers_getprimitivehandlertype(f));
-      UPB_ASSERT(upb_fielddef_isprimitive(f));
-
-      switch (upb_fielddef_type(f)) {
-        case UPB_TYPE_FLOAT:
-          CHECK_TRUE(upb_sink_putfloat(sink, sel, upb_msgval_getfloat(val)));
-          break;
-        case UPB_TYPE_DOUBLE:
-          CHECK_TRUE(upb_sink_putdouble(sink, sel, upb_msgval_getdouble(val)));
-          break;
-        case UPB_TYPE_BOOL:
-          CHECK_TRUE(upb_sink_putbool(sink, sel, upb_msgval_getbool(val)));
-          break;
-        case UPB_TYPE_ENUM:
-        case UPB_TYPE_INT32:
-          CHECK_TRUE(upb_sink_putint32(sink, sel, upb_msgval_getint32(val)));
-          break;
-        case UPB_TYPE_UINT32:
-          CHECK_TRUE(upb_sink_putuint32(sink, sel, upb_msgval_getuint32(val)));
-          break;
-        case UPB_TYPE_INT64:
-          CHECK_TRUE(upb_sink_putint64(sink, sel, upb_msgval_getint64(val)));
-          break;
-        case UPB_TYPE_UINT64:
-          CHECK_TRUE(upb_sink_putuint64(sink, sel, upb_msgval_getuint64(val)));
-          break;
-        case UPB_TYPE_STRING:
-        case UPB_TYPE_BYTES:
-        case UPB_TYPE_MESSAGE:
-          UPB_UNREACHABLE();
-      }
-    }
-  }
-
-  upb_sink_endmsg(sink, &status);
-  return true;
-}
-
-upb_visitor *upb_visitor_create(upb_env *e, const upb_visitorplan *vp,
-                                upb_sink *output) {
-  upb_visitor *visitor = upb_env_malloc(e, sizeof(*visitor));
-  visitor->layout = (const upb_msglayout*)vp;
-  visitor->sink = output;
-  return visitor;
-}
-
-bool upb_visitor_visitmsg(upb_visitor *visitor, const upb_msg *msg) {
-  return upb_visitor_visitmsg2(msg, visitor->layout, visitor->sink, 0);
-}
-
-
-/** upb_msg *******************************************************************/
-
-/* If we always read/write as a consistent type to each address, this shouldn't
- * violate aliasing.
- */
-#define DEREF(msg, ofs, type) *PTR_AT(msg, ofs, type)
-
-/* Internal members of a upb_msg.  We can change this without breaking binary
- * compatibility.  We put these before the user's data.  The user's upb_msg*
- * points after the upb_msg_internal. */
-
-/* Used when a message is not extendable. */
-typedef struct {
-  /* TODO(haberman): add unknown fields. */
-  upb_alloc *alloc;
-} upb_msg_internal;
-
-/* Used when a message is extendable. */
-typedef struct {
-  upb_inttable *extdict;
-  upb_msg_internal base;
-} upb_msg_internal_withext;
-
-static int upb_msg_internalsize(const upb_msglayout *l) {
-    return sizeof(upb_msg_internal) - l->data.extendable * sizeof(void*);
-}
-
-static upb_msg_internal *upb_msg_getinternal(upb_msg *msg) {
-  return VOIDPTR_AT(msg, -sizeof(upb_msg_internal));
-}
-
-static const upb_msg_internal *upb_msg_getinternal_const(const upb_msg *msg) {
-  return VOIDPTR_AT(msg, -sizeof(upb_msg_internal));
-}
-
-static upb_msg_internal_withext *upb_msg_getinternalwithext(
-    upb_msg *msg, const upb_msglayout *l) {
-  UPB_ASSERT(l->data.extendable);
-  return VOIDPTR_AT(msg, -sizeof(upb_msg_internal_withext));
-}
-
-static const upb_msglayout_fieldinit_v1 *upb_msg_checkfield(
-    int field_index, const upb_msglayout *l) {
-  UPB_ASSERT(field_index >= 0 && field_index < l->data.field_count);
-  return &l->data.fields[field_index];
-}
-
-static bool upb_msg_inoneof(const upb_msglayout_fieldinit_v1 *field) {
-  return field->oneof_index != UPB_NOT_IN_ONEOF;
-}
-
-static uint32_t *upb_msg_oneofcase(const upb_msg *msg, int field_index,
-                                   const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-  UPB_ASSERT(upb_msg_inoneof(field));
-  return PTR_AT(msg, l->data.oneofs[field->oneof_index].case_offset, uint32_t);
-}
-
-size_t upb_msg_sizeof(const upb_msglayout *l) {
-  return l->data.size + upb_msg_internalsize(l);
-}
-
-upb_msg *upb_msg_init(void *mem, const upb_msglayout *l, upb_alloc *a) {
-  upb_msg *msg = VOIDPTR_AT(mem, upb_msg_internalsize(l));
-
-  /* Initialize normal members. */
-  if (l->data.default_msg) {
-    memcpy(msg, l->data.default_msg, l->data.size);
-  } else {
-    memset(msg, 0, l->data.size);
-  }
-
-  /* Initialize internal members. */
-  upb_msg_getinternal(msg)->alloc = a;
-
-  if (l->data.extendable) {
-    upb_msg_getinternalwithext(msg, l)->extdict = NULL;
-  }
-
-  return msg;
-}
-
-void *upb_msg_uninit(upb_msg *msg, const upb_msglayout *l) {
-  if (l->data.extendable) {
-    upb_inttable *ext_dict = upb_msg_getinternalwithext(msg, l)->extdict;
-    if (ext_dict) {
-      upb_inttable_uninit2(ext_dict, upb_msg_alloc(msg));
-      upb_free(upb_msg_alloc(msg), ext_dict);
-    }
-  }
-
-  return VOIDPTR_AT(msg, -upb_msg_internalsize(l));
-}
-
-upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a) {
-  void *mem = upb_malloc(a, upb_msg_sizeof(l));
-  return mem ? upb_msg_init(mem, l, a) : NULL;
-}
-
-void upb_msg_free(upb_msg *msg, const upb_msglayout *l) {
-  upb_free(upb_msg_alloc(msg), upb_msg_uninit(msg, l));
-}
-
-upb_alloc *upb_msg_alloc(const upb_msg *msg) {
-  return upb_msg_getinternal_const(msg)->alloc;
-}
-
-bool upb_msg_has(const upb_msg *msg,
-                 int field_index,
-                 const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-
-  UPB_ASSERT(l->data.is_proto2);
-
-  if (upb_msg_inoneof(field)) {
-    /* Oneofs are set when the oneof number is set to this field. */
-    return *upb_msg_oneofcase(msg, field_index, l) == field->number;
-  } else {
-    /* Other fields are set when their hasbit is set. */
-    uint32_t hasbit = l->data.fields[field_index].hasbit;
-    return DEREF(msg, hasbit / 8, char) | (1 << (hasbit % 8));
-  }
-}
-
-upb_msgval upb_msg_get(const upb_msg *msg, int field_index,
-                       const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-  int size = upb_msg_fieldsize(field);
-
-  if (upb_msg_inoneof(field)) {
-    if (*upb_msg_oneofcase(msg, field_index, l) == field->number) {
-      size_t ofs = l->data.oneofs[field->oneof_index].data_offset;
-      return upb_msgval_read(msg, ofs, size);
-    } else {
-      /* Return default. */
-      return upb_msgval_read(l->data.default_msg, field->offset, size);
-    }
-  } else {
-    return upb_msgval_read(msg, field->offset, size);
-  }
-}
-
-void upb_msg_set(upb_msg *msg, int field_index, upb_msgval val,
-                 const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-  int size = upb_msg_fieldsize(field);
-
-  if (upb_msg_inoneof(field)) {
-    size_t ofs = l->data.oneofs[field->oneof_index].data_offset;
-    *upb_msg_oneofcase(msg, field_index, l) = field->number;
-    upb_msgval_write(msg, ofs, val, size);
-  } else {
-    upb_msgval_write(msg, field->offset, val, size);
-  }
-}
-
-
-/** upb_array *****************************************************************/
-
-#define DEREF_ARR(arr, i, type) ((type*)arr->data)[i]
-
-size_t upb_array_sizeof(upb_fieldtype_t type) {
-  UPB_UNUSED(type);
-  return sizeof(upb_array);
-}
-
-void upb_array_init(upb_array *arr, upb_fieldtype_t type, upb_alloc *alloc) {
-  arr->type = type;
-  arr->data = NULL;
-  arr->len = 0;
-  arr->size = 0;
-  arr->element_size = upb_msgval_sizeof(type);
-  arr->alloc = alloc;
-}
-
-void upb_array_uninit(upb_array *arr) {
-  upb_free(arr->alloc, arr->data);
-}
-
-upb_array *upb_array_new(upb_fieldtype_t type, upb_alloc *a) {
-  upb_array *ret = upb_malloc(a, upb_array_sizeof(type));
-
-  if (ret) {
-    upb_array_init(ret, type, a);
-  }
-
-  return ret;
-}
-
-void upb_array_free(upb_array *arr) {
-  upb_array_uninit(arr);
-  upb_free(arr->alloc, arr);
-}
-
-size_t upb_array_size(const upb_array *arr) {
-  return arr->len;
-}
-
-upb_fieldtype_t upb_array_type(const upb_array *arr) {
-  return arr->type;
-}
-
-upb_msgval upb_array_get(const upb_array *arr, size_t i) {
-  UPB_ASSERT(i < arr->len);
-  return upb_msgval_read(arr->data, i * arr->element_size, arr->element_size);
-}
-
-bool upb_array_set(upb_array *arr, size_t i, upb_msgval val) {
-  UPB_ASSERT(i <= arr->len);
-
-  if (i == arr->len) {
-    /* Extending the array. */
-
-    if (i == arr->size) {
-      /* Need to reallocate. */
-      size_t new_size = UPB_MAX(arr->size * 2, 8);
-      size_t new_bytes = new_size * arr->element_size;
-      size_t old_bytes = arr->size * arr->element_size;
-      upb_msgval *new_data =
-          upb_realloc(arr->alloc, arr->data, old_bytes, new_bytes);
-
-      if (!new_data) {
-        return false;
-      }
-
-      arr->data = new_data;
-      arr->size = new_size;
-    }
-
-    arr->len = i + 1;
-  }
-
-  upb_msgval_write(arr->data, i * arr->element_size, val, arr->element_size);
-  return true;
-}
-
-
-/** upb_map *******************************************************************/
-
-struct upb_map {
-  upb_fieldtype_t key_type;
-  upb_fieldtype_t val_type;
-  /* We may want to optimize this to use inttable where possible, for greater
-   * efficiency and lower memory footprint. */
-  upb_strtable strtab;
-  upb_alloc *alloc;
-};
-
-static void upb_map_tokey(upb_fieldtype_t type, upb_msgval *key,
-                          const char **out_key, size_t *out_len) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-      /* Point to string data of the input key. */
-      *out_key = key->str.data;
-      *out_len = key->str.size;
-      return;
-    case UPB_TYPE_BOOL:
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT64:
-      /* Point to the key itself.  XXX: big-endian. */
-      *out_key = (const char*)key;
-      *out_len = upb_msgval_sizeof(type);
-      return;
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_FLOAT:
-    case UPB_TYPE_MESSAGE:
-      break;  /* Cannot be a map key. */
-  }
-  UPB_UNREACHABLE();
-}
-
-static upb_msgval upb_map_fromkey(upb_fieldtype_t type, const char *key,
-                                  size_t len) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-      return upb_msgval_makestr(key, len);
-    case UPB_TYPE_BOOL:
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT64:
-      return upb_msgval_read(key, 0, upb_msgval_sizeof(type));
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_FLOAT:
-    case UPB_TYPE_MESSAGE:
-      break;  /* Cannot be a map key. */
-  }
-  UPB_UNREACHABLE();
-}
-
-size_t upb_map_sizeof(upb_fieldtype_t ktype, upb_fieldtype_t vtype) {
-  /* Size does not currently depend on key/value type. */
-  UPB_UNUSED(ktype);
-  UPB_UNUSED(vtype);
-  return sizeof(upb_map);
-}
-
-bool upb_map_init(upb_map *map, upb_fieldtype_t ktype, upb_fieldtype_t vtype,
-                  upb_alloc *a) {
-  upb_ctype_t vtabtype = upb_fieldtotabtype(vtype);
-  UPB_ASSERT(upb_fieldtype_mapkeyok(ktype));
-  map->key_type = ktype;
-  map->val_type = vtype;
-  map->alloc = a;
-
-  if (!upb_strtable_init2(&map->strtab, vtabtype, a)) {
-    return false;
-  }
-
-  return true;
-}
-
-void upb_map_uninit(upb_map *map) {
-  upb_strtable_uninit2(&map->strtab, map->alloc);
-}
-
-upb_map *upb_map_new(upb_fieldtype_t ktype, upb_fieldtype_t vtype,
-                     upb_alloc *a) {
-  upb_map *map = upb_malloc(a, upb_map_sizeof(ktype, vtype));
-
-  if (!map) {
-    return NULL;
-  }
-
-  if (!upb_map_init(map, ktype, vtype, a)) {
-    return NULL;
-  }
-
-  return map;
-}
-
-void upb_map_free(upb_map *map) {
-  upb_map_uninit(map);
-  upb_free(map->alloc, map);
-}
-
-size_t upb_map_size(const upb_map *map) {
-  return upb_strtable_count(&map->strtab);
-}
-
-upb_fieldtype_t upb_map_keytype(const upb_map *map) {
-  return map->key_type;
-}
-
-upb_fieldtype_t upb_map_valuetype(const upb_map *map) {
-  return map->val_type;
-}
-
-bool upb_map_get(const upb_map *map, upb_msgval key, upb_msgval *val) {
-  upb_value tabval;
-  const char *key_str;
-  size_t key_len;
-  bool ret;
-
-  upb_map_tokey(map->key_type, &key, &key_str, &key_len);
-  ret = upb_strtable_lookup2(&map->strtab, key_str, key_len, &tabval);
-  if (ret) {
-    memcpy(val, &tabval, sizeof(tabval));
-  }
-
-  return ret;
-}
-
-bool upb_map_set(upb_map *map, upb_msgval key, upb_msgval val,
-                 upb_msgval *removed) {
-  const char *key_str;
-  size_t key_len;
-  upb_value tabval = upb_toval(val);
-  upb_value removedtabval;
-  upb_alloc *a = map->alloc;
-
-  upb_map_tokey(map->key_type, &key, &key_str, &key_len);
-
-  /* TODO(haberman): add overwrite operation to minimize number of lookups. */
-  if (upb_strtable_lookup2(&map->strtab, key_str, key_len, NULL)) {
-    upb_strtable_remove3(&map->strtab, key_str, key_len, &removedtabval, a);
-    memcpy(&removed, &removedtabval, sizeof(removed));
-  }
-
-  return upb_strtable_insert3(&map->strtab, key_str, key_len, tabval, a);
-}
-
-bool upb_map_del(upb_map *map, upb_msgval key) {
-  const char *key_str;
-  size_t key_len;
-  upb_alloc *a = map->alloc;
-
-  upb_map_tokey(map->key_type, &key, &key_str, &key_len);
-  return upb_strtable_remove3(&map->strtab, key_str, key_len, NULL, a);
-}
-
-
-/** upb_mapiter ***************************************************************/
-
-struct upb_mapiter {
-  upb_strtable_iter iter;
-  upb_fieldtype_t key_type;
-};
-
-size_t upb_mapiter_sizeof() {
-  return sizeof(upb_mapiter);
-}
-
-void upb_mapiter_begin(upb_mapiter *i, const upb_map *map) {
-  upb_strtable_begin(&i->iter, &map->strtab);
-  i->key_type = map->key_type;
-}
-
-upb_mapiter *upb_mapiter_new(const upb_map *t, upb_alloc *a) {
-  upb_mapiter *ret = upb_malloc(a, upb_mapiter_sizeof());
-
-  if (!ret) {
-    return NULL;
-  }
-
-  upb_mapiter_begin(ret, t);
-  return ret;
-}
-
-void upb_mapiter_free(upb_mapiter *i, upb_alloc *a) {
-  upb_free(a, i);
-}
-
-void upb_mapiter_next(upb_mapiter *i) {
-  upb_strtable_next(&i->iter);
-}
-
-bool upb_mapiter_done(const upb_mapiter *i) {
-  return upb_strtable_done(&i->iter);
-}
-
-upb_msgval upb_mapiter_key(const upb_mapiter *i) {
-  return upb_map_fromkey(i->key_type, upb_strtable_iter_key(&i->iter),
-                         upb_strtable_iter_keylength(&i->iter));
-}
-
-upb_msgval upb_mapiter_value(const upb_mapiter *i) {
-  return upb_msgval_fromval(upb_strtable_iter_value(&i->iter));
-}
-
-void upb_mapiter_setdone(upb_mapiter *i) {
-  upb_strtable_iter_setdone(&i->iter);
-}
-
-bool upb_mapiter_isequal(const upb_mapiter *i1, const upb_mapiter *i2) {
-  return upb_strtable_iter_isequal(&i1->iter, &i2->iter);
-}
-
-
-/** Handlers for upb_msg ******************************************************/
-
-typedef struct {
-  size_t offset;
-  int32_t hasbit;
-} upb_msg_handlerdata;
-
-/* Fallback implementation if the handler is not specialized by the producer. */
-#define MSG_WRITER(type, ctype)                                               \
-  bool upb_msg_set ## type (void *c, const void *hd, ctype val) {             \
-    uint8_t *m = c;                                                           \
-    const upb_msg_handlerdata *d = hd;                                        \
-    if (d->hasbit > 0)                                                        \
-      *(uint8_t*)&m[d->hasbit / 8] |= 1 << (d->hasbit % 8);                   \
-    *(ctype*)&m[d->offset] = val;                                             \
-    return true;                                                              \
-  }                                                                           \
-
-MSG_WRITER(double, double)
-MSG_WRITER(float,  float)
-MSG_WRITER(int32,  int32_t)
-MSG_WRITER(int64,  int64_t)
-MSG_WRITER(uint32, uint32_t)
-MSG_WRITER(uint64, uint64_t)
-MSG_WRITER(bool,   bool)
-
-bool upb_msg_setscalarhandler(upb_handlers *h, const upb_fielddef *f,
-                              size_t offset, int32_t hasbit) {
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-  bool ok;
-
-  upb_msg_handlerdata *d = upb_gmalloc(sizeof(*d));
-  if (!d) return false;
-  d->offset = offset;
-  d->hasbit = hasbit;
-
-  upb_handlerattr_sethandlerdata(&attr, d);
-  upb_handlerattr_setalwaysok(&attr, true);
-  upb_handlers_addcleanup(h, d, upb_gfree);
-
-#define TYPE(u, l) \
-  case UPB_TYPE_##u: \
-    ok = upb_handlers_set##l(h, f, upb_msg_set##l, &attr); break;
-
-  ok = false;
-
-  switch (upb_fielddef_type(f)) {
-    TYPE(INT64,  int64);
-    TYPE(INT32,  int32);
-    TYPE(ENUM,   int32);
-    TYPE(UINT64, uint64);
-    TYPE(UINT32, uint32);
-    TYPE(DOUBLE, double);
-    TYPE(FLOAT,  float);
-    TYPE(BOOL,   bool);
-    default: UPB_ASSERT(false); break;
-  }
-#undef TYPE
-
-  upb_handlerattr_uninit(&attr);
-  return ok;
-}
-
-bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
-                                  upb_selector_t s,
-                                  upb_fieldtype_t *type,
-                                  size_t *offset,
-                                  int32_t *hasbit) {
-  const upb_msg_handlerdata *d;
-  upb_func *f = upb_handlers_gethandler(h, s);
-
-  if ((upb_int64_handlerfunc*)f == upb_msg_setint64) {
-    *type = UPB_TYPE_INT64;
-  } else if ((upb_int32_handlerfunc*)f == upb_msg_setint32) {
-    *type = UPB_TYPE_INT32;
-  } else if ((upb_uint64_handlerfunc*)f == upb_msg_setuint64) {
-    *type = UPB_TYPE_UINT64;
-  } else if ((upb_uint32_handlerfunc*)f == upb_msg_setuint32) {
-    *type = UPB_TYPE_UINT32;
-  } else if ((upb_double_handlerfunc*)f == upb_msg_setdouble) {
-    *type = UPB_TYPE_DOUBLE;
-  } else if ((upb_float_handlerfunc*)f == upb_msg_setfloat) {
-    *type = UPB_TYPE_FLOAT;
-  } else if ((upb_bool_handlerfunc*)f == upb_msg_setbool) {
-    *type = UPB_TYPE_BOOL;
-  } else {
-    return false;
-  }
-
-  d = upb_handlers_gethandlerdata(h, s);
-  *offset = d->offset;
-  *hasbit = d->hasbit;
-  return true;
-}
 /*
 ** upb::RefCounted Implementation
 **
@@ -5235,6 +2669,7 @@
 
 
 #include <setjmp.h>
+#include <stdlib.h>
 
 static void freeobj(upb_refcounted *o);
 
@@ -5310,31 +2745,8 @@
 /* UPB_DEBUG_REFS mode counts on being able to malloc() memory in some
  * code-paths that can normally never fail, like upb_refcounted_ref().  Since
  * we have no way to propagage out-of-memory errors back to the user, and since
- * these errors can only occur in UPB_DEBUG_REFS mode, we use an allocator that
- * immediately aborts on failure (avoiding the global allocator, which might
- * inject failures). */
-
-#include <stdlib.h>
-
-static void *upb_debugrefs_allocfunc(upb_alloc *alloc, void *ptr,
-                                     size_t oldsize, size_t size) {
-  UPB_UNUSED(alloc);
-  UPB_UNUSED(oldsize);
-  if (size == 0) {
-    free(ptr);
-    return NULL;
-  } else {
-    void *ret = realloc(ptr, size);
-
-    if (!ret) {
-      abort();
-    }
-
-    return ret;
-  }
-}
-
-upb_alloc upb_alloc_debugrefs = {&upb_debugrefs_allocfunc};
+ * these errors can only occur in UPB_DEBUG_REFS mode, we immediately fail. */
+#define CHECK_OOM(predicate) if (!(predicate)) { assert(predicate); exit(1); }
 
 typedef struct {
   int count;  /* How many refs there are (duplicates only allowed for ref2). */
@@ -5342,7 +2754,8 @@
 } trackedref;
 
 static trackedref *trackedref_new(bool is_ref2) {
-  trackedref *ret = upb_malloc(&upb_alloc_debugrefs, sizeof(*ret));
+  trackedref *ret = malloc(sizeof(*ret));
+  CHECK_OOM(ret);
   ret->count = 1;
   ret->is_ref2 = is_ref2;
   return ret;
@@ -5351,7 +2764,7 @@
 static void track(const upb_refcounted *r, const void *owner, bool ref2) {
   upb_value v;
 
-  UPB_ASSERT(owner);
+  assert(owner);
   if (owner == UPB_UNTRACKED_REF) return;
 
   upb_lock();
@@ -5362,20 +2775,20 @@
      * tracking behavior we get with regular refs.  Since ref2s only happen
      * inside upb, we'll accept this limitation until/unless there is a really
      * difficult upb-internal bug that can't be figured out without it. */
-    UPB_ASSERT(ref2);
-    UPB_ASSERT(ref->is_ref2);
+    assert(ref2);
+    assert(ref->is_ref2);
     ref->count++;
   } else {
     trackedref *ref = trackedref_new(ref2);
-    upb_inttable_insertptr2(r->refs, owner, upb_value_ptr(ref),
-                            &upb_alloc_debugrefs);
+    bool ok = upb_inttable_insertptr(r->refs, owner, upb_value_ptr(ref));
+    CHECK_OOM(ok);
     if (ref2) {
       /* We know this cast is safe when it is a ref2, because it's coming from
        * another refcounted object. */
       const upb_refcounted *from = owner;
-      UPB_ASSERT(!upb_inttable_lookupptr(from->ref2s, r, NULL));
-      upb_inttable_insertptr2(from->ref2s, r, upb_value_ptr(NULL),
-                              &upb_alloc_debugrefs);
+      assert(!upb_inttable_lookupptr(from->ref2s, r, NULL));
+      ok = upb_inttable_insertptr(from->ref2s, r, upb_value_ptr(NULL));
+      CHECK_OOM(ok);
     }
   }
   upb_unlock();
@@ -5386,15 +2799,15 @@
   bool found;
   trackedref *ref;
 
-  UPB_ASSERT(owner);
+  assert(owner);
   if (owner == UPB_UNTRACKED_REF) return;
 
   upb_lock();
   found = upb_inttable_lookupptr(r->refs, owner, &v);
   /* This assert will fail if an owner attempts to release a ref it didn't have. */
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   ref = upb_value_getptr(v);
-  UPB_ASSERT(ref->is_ref2 == ref2);
+  assert(ref->is_ref2 == ref2);
   if (--ref->count == 0) {
     free(ref);
     upb_inttable_removeptr(r->refs, owner, NULL);
@@ -5403,7 +2816,7 @@
        * another refcounted object. */
       const upb_refcounted *from = owner;
       bool removed = upb_inttable_removeptr(from->ref2s, r, NULL);
-      UPB_ASSERT(removed);
+      assert(removed);
     }
   }
   upb_unlock();
@@ -5416,9 +2829,9 @@
 
   upb_lock();
   found = upb_inttable_lookupptr(r->refs, owner, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   ref = upb_value_getptr(v);
-  UPB_ASSERT(ref->is_ref2 == ref2);
+  assert(ref->is_ref2 == ref2);
   upb_unlock();
 }
 
@@ -5433,17 +2846,19 @@
     upb_value v;
     upb_value count;
     trackedref *ref;
+    bool ok;
     bool found;
 
     upb_refcounted *to = (upb_refcounted*)upb_inttable_iter_key(&i);
 
     /* To get the count we need to look in the target's table. */
     found = upb_inttable_lookupptr(to->refs, owner, &v);
-    UPB_ASSERT(found);
+    assert(found);
     ref = upb_value_getptr(v);
     count = upb_value_int32(ref->count);
 
-    upb_inttable_insertptr2(tab, to, count, &upb_alloc_debugrefs);
+    ok = upb_inttable_insertptr(tab, to, count);
+    CHECK_OOM(ok);
   }
   upb_unlock();
 }
@@ -5461,50 +2876,62 @@
   bool removed;
   int32_t newcount;
 
-  UPB_ASSERT(obj == s->obj);
-  UPB_ASSERT(subobj);
+  assert(obj == s->obj);
+  assert(subobj);
   removed = upb_inttable_removeptr(ref2, subobj, &v);
   /* The following assertion will fail if the visit() function visits a subobj
    * that it did not have a ref2 on, or visits the same subobj too many times. */
-  UPB_ASSERT(removed);
+  assert(removed);
   newcount = upb_value_getint32(v) - 1;
   if (newcount > 0) {
-    upb_inttable_insert2(ref2, (uintptr_t)subobj, upb_value_int32(newcount),
-                         &upb_alloc_debugrefs);
+    upb_inttable_insert(ref2, (uintptr_t)subobj, upb_value_int32(newcount));
   }
 }
 
 static void visit(const upb_refcounted *r, upb_refcounted_visit *v,
                   void *closure) {
+  bool ok;
+
   /* In DEBUG_REFS mode we know what existing ref2 refs there are, so we know
    * exactly the set of nodes that visit() should visit.  So we verify visit()'s
    * correctness here. */
   check_state state;
   state.obj = r;
-  upb_inttable_init2(&state.ref2, UPB_CTYPE_INT32, &upb_alloc_debugrefs);
+  ok = upb_inttable_init(&state.ref2, UPB_CTYPE_INT32);
+  CHECK_OOM(ok);
   getref2s(r, &state.ref2);
 
   /* This should visit any children in the ref2 table. */
   if (r->vtbl->visit) r->vtbl->visit(r, visit_check, &state);
 
   /* This assertion will fail if the visit() function missed any children. */
-  UPB_ASSERT(upb_inttable_count(&state.ref2) == 0);
-  upb_inttable_uninit2(&state.ref2, &upb_alloc_debugrefs);
+  assert(upb_inttable_count(&state.ref2) == 0);
+  upb_inttable_uninit(&state.ref2);
   if (r->vtbl->visit) r->vtbl->visit(r, v, closure);
 }
 
-static void trackinit(upb_refcounted *r) {
-  r->refs = upb_malloc(&upb_alloc_debugrefs, sizeof(*r->refs));
-  r->ref2s = upb_malloc(&upb_alloc_debugrefs, sizeof(*r->ref2s));
-  upb_inttable_init2(r->refs, UPB_CTYPE_PTR, &upb_alloc_debugrefs);
-  upb_inttable_init2(r->ref2s, UPB_CTYPE_PTR, &upb_alloc_debugrefs);
+static bool trackinit(upb_refcounted *r) {
+  r->refs = malloc(sizeof(*r->refs));
+  r->ref2s = malloc(sizeof(*r->ref2s));
+  if (!r->refs || !r->ref2s) goto err1;
+
+  if (!upb_inttable_init(r->refs, UPB_CTYPE_PTR)) goto err1;
+  if (!upb_inttable_init(r->ref2s, UPB_CTYPE_PTR)) goto err2;
+  return true;
+
+err2:
+  upb_inttable_uninit(r->refs);
+err1:
+  free(r->refs);
+  free(r->ref2s);
+  return false;
 }
 
 static void trackfree(const upb_refcounted *r) {
-  upb_inttable_uninit2(r->refs, &upb_alloc_debugrefs);
-  upb_inttable_uninit2(r->ref2s, &upb_alloc_debugrefs);
-  upb_free(&upb_alloc_debugrefs, r->refs);
-  upb_free(&upb_alloc_debugrefs, r->ref2s);
+  upb_inttable_uninit(r->refs);
+  upb_inttable_uninit(r->ref2s);
+  free(r->refs);
+  free(r->ref2s);
 }
 
 #else
@@ -5527,8 +2954,9 @@
   UPB_UNUSED(ref2);
 }
 
-static void trackinit(upb_refcounted *r) {
+static bool trackinit(upb_refcounted *r) {
   UPB_UNUSED(r);
+  return true;
 }
 
 static void trackfree(const upb_refcounted *r) {
@@ -5595,7 +3023,7 @@
 static uint64_t getattr(const tarjan *t, const upb_refcounted *r) {
   upb_value v;
   bool found = upb_inttable_lookupptr(&t->objattr, r, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   return upb_value_getuint64(v);
 }
 
@@ -5609,13 +3037,13 @@
 }
 
 static void set_gray(tarjan *t, const upb_refcounted *r) {
-  UPB_ASSERT(color(t, r) == BLACK);
+  assert(color(t, r) == BLACK);
   setattr(t, r, GRAY);
 }
 
 /* Pushes an obj onto the Tarjan stack and sets it to GREEN. */
 static void push(tarjan *t, const upb_refcounted *r) {
-  UPB_ASSERT(color(t, r) == BLACK || color(t, r) == GRAY);
+  assert(color(t, r) == BLACK || color(t, r) == GRAY);
   /* This defines the attr layout for the GREEN state.  "index" and "lowlink"
    * get 31 bits, which is plenty (limit of 2B objects frozen at a time). */
   setattr(t, r, GREEN | (t->index << 2) | (t->index << 33));
@@ -5630,7 +3058,7 @@
  * SCC group. */
 static upb_refcounted *pop(tarjan *t) {
   upb_refcounted *r = upb_value_getptr(upb_inttable_pop(&t->stack));
-  UPB_ASSERT(color(t, r) == GREEN);
+  assert(color(t, r) == GREEN);
   /* This defines the attr layout for nodes in the WHITE state.
    * Top of group stack is [group, NULL]; we point at group. */
   setattr(t, r, WHITE | (upb_inttable_count(&t->groups) - 2) << 8);
@@ -5638,19 +3066,19 @@
 }
 
 static void tarjan_newgroup(tarjan *t) {
-  uint32_t *group = upb_gmalloc(sizeof(*group));
+  uint32_t *group = malloc(sizeof(*group));
   if (!group) oom(t);
   /* Push group and empty group leader (we'll fill in leader later). */
   if (!upb_inttable_push(&t->groups, upb_value_ptr(group)) ||
       !upb_inttable_push(&t->groups, upb_value_ptr(NULL))) {
-    upb_gfree(group);
+    free(group);
     oom(t);
   }
   *group = 0;
 }
 
 static uint32_t idx(tarjan *t, const upb_refcounted *r) {
-  UPB_ASSERT(color(t, r) == GREEN);
+  assert(color(t, r) == GREEN);
   return (getattr(t, r) >> 2) & 0x7FFFFFFF;
 }
 
@@ -5663,7 +3091,7 @@
 }
 
 static void set_lowlink(tarjan *t, const upb_refcounted *r, uint32_t lowlink) {
-  UPB_ASSERT(color(t, r) == GREEN);
+  assert(color(t, r) == GREEN);
   setattr(t, r, ((uint64_t)lowlink << 33) | (getattr(t, r) & 0x1FFFFFFFF));
 }
 
@@ -5672,10 +3100,10 @@
   upb_value v;
   bool found;
 
-  UPB_ASSERT(color(t, r) == WHITE);
+  assert(color(t, r) == WHITE);
   groupnum = getattr(t, r) >> 8;
   found = upb_inttable_lookup(&t->groups, groupnum, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   return upb_value_getptr(v);
 }
 
@@ -5686,10 +3114,10 @@
   upb_value v;
   bool found;
 
-  UPB_ASSERT(color(t, r) == WHITE);
+  assert(color(t, r) == WHITE);
   leader_slot = (getattr(t, r) >> 8) + 1;
   found = upb_inttable_lookup(&t->groups, leader_slot, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   if (upb_value_getptr(v)) {
     return upb_value_getptr(v);
   } else {
@@ -5749,7 +3177,7 @@
 static void crossref(const upb_refcounted *r, const upb_refcounted *subobj,
                      void *_t) {
   tarjan *t = _t;
-  UPB_ASSERT(color(t, r) > BLACK);
+  assert(color(t, r) > BLACK);
   if (color(t, subobj) > BLACK && r->group != subobj->group) {
     /* Previously this ref was not reflected in subobj->group because they
      * were in the same group; now that they are split a ref must be taken. */
@@ -5817,13 +3245,13 @@
       upb_refcounted *move = obj->next;
       if (obj == move) {
         /* Removing the last object from a group. */
-        UPB_ASSERT(*obj->group == obj->individual_count);
-        upb_gfree(obj->group);
+        assert(*obj->group == obj->individual_count);
+        free(obj->group);
       } else {
         obj->next = move->next;
         /* This may decrease to zero; we'll collect GRAY objects (if any) that
          * remain in the group in the third pass. */
-        UPB_ASSERT(*move->group >= move->individual_count);
+        assert(*move->group >= move->individual_count);
         *move->group -= move->individual_count;
       }
 
@@ -5836,7 +3264,7 @@
         *move->group = move->individual_count;
       } else {
         /* Group already has at least one object in it. */
-        UPB_ASSERT(leader->group == group(&t, move));
+        assert(leader->group == group(&t, move));
         move->group = group(&t, move);
         move->next = leader->next;
         leader->next = move;
@@ -5874,7 +3302,7 @@
         /* We eagerly free() the group's count (since we can't easily determine
          * the group's remaining size it's the easiest way to ensure it gets
          * done). */
-        upb_gfree(obj->group);
+        free(obj->group);
 
         /* Visit to release ref2's (done in a separate pass since release_ref2
          * depends on o->group being unmodified so it can test merged()). */
@@ -5894,7 +3322,7 @@
   if (!ret) {
     upb_inttable_begin(&iter, &t.groups);
     for(; !upb_inttable_done(&iter); upb_inttable_next(&iter))
-      upb_gfree(upb_value_getptr(upb_inttable_iter_value(&iter)));
+      free(upb_value_getptr(upb_inttable_iter_value(&iter)));
   }
   upb_inttable_uninit(&t.groups);
 err3:
@@ -5918,7 +3346,7 @@
 
   if (merged(r, from)) return;
   *r->group += *from->group;
-  upb_gfree(from->group);
+  free(from->group);
   base = from;
 
   /* Set all refcount pointers in the "from" chain to the merged refcount.
@@ -5926,7 +3354,7 @@
    * TODO(haberman): this linear algorithm can result in an overall O(n^2) bound
    * if the user continuously extends a group by one object.  Prevent this by
    * using one of the techniques in this paper:
-   *     http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/Union-Find-Tarjan.pdf */
+   *     ftp://www.ncedc.org/outgoing/geomorph/dino/orals/p245-tarjan.pdf */
   do { from->group = r->group; } while ((from = from->next) != base);
 
   /* Merge the two circularly linked lists by swapping their next pointers. */
@@ -5943,7 +3371,7 @@
   UPB_UNUSED(closure);
   untrack(subobj, obj, true);
   if (!merged(obj, subobj)) {
-    UPB_ASSERT(subobj->is_frozen);
+    assert(subobj->is_frozen);
     unref(subobj);
   }
 }
@@ -5952,7 +3380,7 @@
   if (unrefgroup(r->group)) {
     const upb_refcounted *o;
 
-    upb_gfree(r->group);
+    free(r->group);
 
     /* In two passes, since release_ref2 needs a guarantee that any subobjs
      * are alive. */
@@ -5962,7 +3390,7 @@
     o = r;
     do {
       const upb_refcounted *next = o->next;
-      UPB_ASSERT(o->is_frozen || o->individual_count == 0);
+      assert(o->is_frozen || o->individual_count == 0);
       freeobj((upb_refcounted*)o);
       o = next;
     } while(o != r);
@@ -5986,9 +3414,9 @@
    * basically every program using upb. */
   const int x = 1;
 #ifdef UPB_BIG_ENDIAN
-  UPB_ASSERT(*(char*)&x != 1);
+  assert(*(char*)&x != 1);
 #else
-  UPB_ASSERT(*(char*)&x == 1);
+  assert(*(char*)&x == 1);
 #endif
 #endif
 
@@ -5996,10 +3424,13 @@
   r->vtbl = vtbl;
   r->individual_count = 0;
   r->is_frozen = false;
-  r->group = upb_gmalloc(sizeof(*r->group));
+  r->group = malloc(sizeof(*r->group));
   if (!r->group) return false;
   *r->group = 0;
-  trackinit(r);
+  if (!trackinit(r)) {
+    free(r->group);
+    return false;
+  }
   upb_refcounted_ref(r, owner);
   return true;
 }
@@ -6023,7 +3454,7 @@
 }
 
 void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from) {
-  UPB_ASSERT(!from->is_frozen);  /* Non-const pointer implies this. */
+  assert(!from->is_frozen);  /* Non-const pointer implies this. */
   track(r, from, true);
   if (r->is_frozen) {
     refgroup(r->group);
@@ -6033,18 +3464,18 @@
 }
 
 void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from) {
-  UPB_ASSERT(!from->is_frozen);  /* Non-const pointer implies this. */
+  assert(!from->is_frozen);  /* Non-const pointer implies this. */
   untrack(r, from, true);
   if (r->is_frozen) {
     unref(r);
   } else {
-    UPB_ASSERT(merged(r, from));
+    assert(merged(r, from));
   }
 }
 
 void upb_refcounted_donateref(
     const upb_refcounted *r, const void *from, const void *to) {
-  UPB_ASSERT(from != to);
+  assert(from != to);
   if (to != NULL)
     upb_refcounted_ref(r, to);
   if (from != NULL)
@@ -6058,101 +3489,524 @@
 bool upb_refcounted_freeze(upb_refcounted *const*roots, int n, upb_status *s,
                            int maxdepth) {
   int i;
-  bool ret;
   for (i = 0; i < n; i++) {
-    UPB_ASSERT(!roots[i]->is_frozen);
+    assert(!roots[i]->is_frozen);
   }
-  ret = freeze(roots, n, s, maxdepth);
-  UPB_ASSERT(!s || ret == upb_ok(s));
+  return freeze(roots, n, s, maxdepth);
+}
+
+
+#include <stdlib.h>
+
+/* Fallback implementation if the shim is not specialized by the JIT. */
+#define SHIM_WRITER(type, ctype)                                              \
+  bool upb_shim_set ## type (void *c, const void *hd, ctype val) {            \
+    uint8_t *m = c;                                                           \
+    const upb_shim_data *d = hd;                                              \
+    if (d->hasbit > 0)                                                        \
+      *(uint8_t*)&m[d->hasbit / 8] |= 1 << (d->hasbit % 8);                   \
+    *(ctype*)&m[d->offset] = val;                                             \
+    return true;                                                              \
+  }                                                                           \
+
+SHIM_WRITER(double, double)
+SHIM_WRITER(float,  float)
+SHIM_WRITER(int32,  int32_t)
+SHIM_WRITER(int64,  int64_t)
+SHIM_WRITER(uint32, uint32_t)
+SHIM_WRITER(uint64, uint64_t)
+SHIM_WRITER(bool,   bool)
+#undef SHIM_WRITER
+
+bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
+                  int32_t hasbit) {
+  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
+  bool ok;
+
+  upb_shim_data *d = malloc(sizeof(*d));
+  if (!d) return false;
+  d->offset = offset;
+  d->hasbit = hasbit;
+
+  upb_handlerattr_sethandlerdata(&attr, d);
+  upb_handlerattr_setalwaysok(&attr, true);
+  upb_handlers_addcleanup(h, d, free);
+
+#define TYPE(u, l) \
+  case UPB_TYPE_##u: \
+    ok = upb_handlers_set##l(h, f, upb_shim_set##l, &attr); break;
+
+  ok = false;
+
+  switch (upb_fielddef_type(f)) {
+    TYPE(INT64,  int64);
+    TYPE(INT32,  int32);
+    TYPE(ENUM,   int32);
+    TYPE(UINT64, uint64);
+    TYPE(UINT32, uint32);
+    TYPE(DOUBLE, double);
+    TYPE(FLOAT,  float);
+    TYPE(BOOL,   bool);
+    default: assert(false); break;
+  }
+#undef TYPE
+
+  upb_handlerattr_uninit(&attr);
+  return ok;
+}
+
+const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,
+                                      upb_fieldtype_t *type) {
+  upb_func *f = upb_handlers_gethandler(h, s);
+
+  if ((upb_int64_handlerfunc*)f == upb_shim_setint64) {
+    *type = UPB_TYPE_INT64;
+  } else if ((upb_int32_handlerfunc*)f == upb_shim_setint32) {
+    *type = UPB_TYPE_INT32;
+  } else if ((upb_uint64_handlerfunc*)f == upb_shim_setuint64) {
+    *type = UPB_TYPE_UINT64;
+  } else if ((upb_uint32_handlerfunc*)f == upb_shim_setuint32) {
+    *type = UPB_TYPE_UINT32;
+  } else if ((upb_double_handlerfunc*)f == upb_shim_setdouble) {
+    *type = UPB_TYPE_DOUBLE;
+  } else if ((upb_float_handlerfunc*)f == upb_shim_setfloat) {
+    *type = UPB_TYPE_FLOAT;
+  } else if ((upb_bool_handlerfunc*)f == upb_shim_setbool) {
+    *type = UPB_TYPE_BOOL;
+  } else {
+    return NULL;
+  }
+
+  return (const upb_shim_data*)upb_handlers_gethandlerdata(h, s);
+}
+
+
+#include <stdlib.h>
+#include <string.h>
+
+static void upb_symtab_free(upb_refcounted *r) {
+  upb_symtab *s = (upb_symtab*)r;
+  upb_strtable_iter i;
+  upb_strtable_begin(&i, &s->symtab);
+  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
+    const upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
+    upb_def_unref(def, s);
+  }
+  upb_strtable_uninit(&s->symtab);
+  free(s);
+}
+
+
+upb_symtab *upb_symtab_new(const void *owner) {
+  static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_symtab_free};
+  upb_symtab *s = malloc(sizeof(*s));
+  upb_refcounted_init(upb_symtab_upcast_mutable(s), &vtbl, owner);
+  upb_strtable_init(&s->symtab, UPB_CTYPE_PTR);
+  return s;
+}
+
+void upb_symtab_freeze(upb_symtab *s) {
+  upb_refcounted *r;
+  bool ok;
+
+  assert(!upb_symtab_isfrozen(s));
+  r = upb_symtab_upcast_mutable(s);
+  /* The symtab does not take ref2's (see refcounted.h) on the defs, because
+   * defs cannot refer back to the table and therefore cannot create cycles.  So
+   * 0 will suffice for maxdepth here. */
+  ok = upb_refcounted_freeze(&r, 1, NULL, 0);
+  UPB_ASSERT_VAR(ok, ok);
+}
+
+const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym) {
+  upb_value v;
+  upb_def *ret = upb_strtable_lookup(&s->symtab, sym, &v) ?
+      upb_value_getptr(v) : NULL;
   return ret;
 }
 
+const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
+  upb_value v;
+  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
+      upb_value_getptr(v) : NULL;
+  return def ? upb_dyncast_msgdef(def) : NULL;
+}
 
-bool upb_bufsrc_putbuf(const char *buf, size_t len, upb_bytessink *sink) {
-  void *subc;
-  bool ret;
-  upb_bufhandle handle;
-  upb_bufhandle_init(&handle);
-  upb_bufhandle_setbuf(&handle, buf, 0);
-  ret = upb_bytessink_start(sink, len, &subc);
-  if (ret && len != 0) {
-    ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) >= len);
+const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
+  upb_value v;
+  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
+      upb_value_getptr(v) : NULL;
+  return def ? upb_dyncast_enumdef(def) : NULL;
+}
+
+/* Given a symbol and the base symbol inside which it is defined, find the
+ * symbol's definition in t. */
+static upb_def *upb_resolvename(const upb_strtable *t,
+                                const char *base, const char *sym) {
+  if(strlen(sym) == 0) return NULL;
+  if(sym[0] == '.') {
+    /* Symbols starting with '.' are absolute, so we do a single lookup.
+     * Slice to omit the leading '.' */
+    upb_value v;
+    return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;
+  } else {
+    /* Remove components from base until we find an entry or run out.
+     * TODO: This branch is totally broken, but currently not used. */
+    (void)base;
+    assert(false);
+    return NULL;
   }
-  if (ret) {
-    ret = upb_bytessink_end(sink);
-  }
-  upb_bufhandle_uninit(&handle);
+}
+
+const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
+                                  const char *sym) {
+  upb_def *ret = upb_resolvename(&s->symtab, base, sym);
   return ret;
 }
 
-struct upb_bufsink {
-  upb_byteshandler handler;
-  upb_bytessink sink;
-  upb_env *env;
-  char *ptr;
-  size_t len, size;
-};
+/* Starts a depth-first traversal at "def", recursing into any subdefs
+ * (ie. submessage types).  Adds duplicates of existing defs to addtab
+ * wherever necessary, so that the resulting symtab will be consistent once
+ * addtab is added.
+ *
+ * More specifically, if any def D is found in the DFS that:
+ *
+ *   1. can reach a def that is being replaced by something in addtab, AND
+ *
+ *   2. is not itself being replaced already (ie. this name doesn't already
+ *      exist in addtab)
+ *
+ * ...then a duplicate (new copy) of D will be added to addtab.
+ *
+ * Returns true if this happened for any def reachable from "def."
+ *
+ * It is slightly tricky to do this correctly in the presence of cycles.  If we
+ * detect that our DFS has hit a cycle, we might not yet know if any SCCs on
+ * our stack can reach a def in addtab or not.  Once we figure this out, that
+ * answer needs to apply to *all* defs in these SCCs, even if we visited them
+ * already.  So a straight up one-pass cycle-detecting DFS won't work.
+ *
+ * To work around this problem, we traverse each SCC (which we already
+ * computed, since these defs are frozen) as a single node.  We first compute
+ * whether the SCC as a whole can reach any def in addtab, then we dup (or not)
+ * the entire SCC.  This requires breaking the encapsulation of upb_refcounted,
+ * since that is where we get the data about what SCC we are in. */
+static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,
+                            const void *new_owner, upb_inttable *seen,
+                            upb_status *s) {
+  upb_value v;
+  bool need_dup;
+  const upb_def *base;
+  const void* memoize_key;
 
-static void *upb_bufsink_start(void *_sink, const void *hd, size_t size_hint) {
-  upb_bufsink *sink = _sink;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(size_hint);
-  sink->len = 0;
-  return sink;
-}
+  /* Memoize results of this function for efficiency (since we're traversing a
+   * DAG this is not needed to limit the depth of the search).
+   *
+   * We memoize by SCC instead of by individual def. */
+  memoize_key = def->base.group;
 
-static size_t upb_bufsink_string(void *_sink, const void *hd, const char *ptr,
-                                size_t len, const upb_bufhandle *handle) {
-  upb_bufsink *sink = _sink;
-  size_t new_size = sink->size;
+  if (upb_inttable_lookupptr(seen, memoize_key, &v))
+    return upb_value_getbool(v);
 
-  UPB_ASSERT(new_size > 0);
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
+  /* Visit submessages for all messages in the SCC. */
+  need_dup = false;
+  base = def;
+  do {
+    upb_value v;
+    const upb_msgdef *m;
 
-  while (sink->len + len > new_size) {
-    new_size *= 2;
+    assert(upb_def_isfrozen(def));
+    if (def->type == UPB_DEF_FIELD) continue;
+    if (upb_strtable_lookup(addtab, upb_def_fullname(def), &v)) {
+      need_dup = true;
+    }
+
+    /* For messages, continue the recursion by visiting all subdefs, but only
+     * ones in different SCCs. */
+    m = upb_dyncast_msgdef(def);
+    if (m) {
+      upb_msg_field_iter i;
+      for(upb_msg_field_begin(&i, m);
+          !upb_msg_field_done(&i);
+          upb_msg_field_next(&i)) {
+        upb_fielddef *f = upb_msg_iter_field(&i);
+        const upb_def *subdef;
+
+        if (!upb_fielddef_hassubdef(f)) continue;
+        subdef = upb_fielddef_subdef(f);
+
+        /* Skip subdefs in this SCC. */
+        if (def->base.group == subdef->base.group) continue;
+
+        /* |= to avoid short-circuit; we need its side-effects. */
+        need_dup |= upb_resolve_dfs(subdef, addtab, new_owner, seen, s);
+        if (!upb_ok(s)) return false;
+      }
+    }
+  } while ((def = (upb_def*)def->base.next) != base);
+
+  if (need_dup) {
+    /* Dup all defs in this SCC that don't already have entries in addtab. */
+    def = base;
+    do {
+      const char *name;
+
+      if (def->type == UPB_DEF_FIELD) continue;
+      name = upb_def_fullname(def);
+      if (!upb_strtable_lookup(addtab, name, NULL)) {
+        upb_def *newdef = upb_def_dup(def, new_owner);
+        if (!newdef) goto oom;
+        newdef->came_from_user = false;
+        if (!upb_strtable_insert(addtab, name, upb_value_ptr(newdef)))
+          goto oom;
+      }
+    } while ((def = (upb_def*)def->base.next) != base);
   }
 
-  if (new_size != sink->size) {
-    sink->ptr = upb_env_realloc(sink->env, sink->ptr, sink->size, new_size);
-    sink->size = new_size;
+  upb_inttable_insertptr(seen, memoize_key, upb_value_bool(need_dup));
+  return need_dup;
+
+oom:
+  upb_status_seterrmsg(s, "out of memory");
+  return false;
+}
+
+/* TODO(haberman): we need a lot more testing of error conditions.
+ * The came_from_user stuff in particular is not tested. */
+bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
+                    upb_status *status) {
+  int i;
+  upb_strtable_iter iter;
+  upb_def **add_defs = NULL;
+  upb_strtable addtab;
+  upb_inttable seen;
+
+  assert(!upb_symtab_isfrozen(s));
+  if (!upb_strtable_init(&addtab, UPB_CTYPE_PTR)) {
+    upb_status_seterrmsg(status, "out of memory");
+    return false;
   }
 
-  memcpy(sink->ptr + sink->len, ptr, len);
-  sink->len += len;
+  /* Add new defs to our "add" set. */
+  for (i = 0; i < n; i++) {
+    upb_def *def = defs[i];
+    const char *fullname;
+    upb_fielddef *f;
 
-  return len;
+    if (upb_def_isfrozen(def)) {
+      upb_status_seterrmsg(status, "added defs must be mutable");
+      goto err;
+    }
+    assert(!upb_def_isfrozen(def));
+    fullname = upb_def_fullname(def);
+    if (!fullname) {
+      upb_status_seterrmsg(
+          status, "Anonymous defs cannot be added to a symtab");
+      goto err;
+    }
+
+    f = upb_dyncast_fielddef_mutable(def);
+
+    if (f) {
+      if (!upb_fielddef_containingtypename(f)) {
+        upb_status_seterrmsg(status,
+                             "Standalone fielddefs must have a containing type "
+                             "(extendee) name set");
+        goto err;
+      }
+    } else {
+      if (upb_strtable_lookup(&addtab, fullname, NULL)) {
+        upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);
+        goto err;
+      }
+      /* We need this to back out properly, because if there is a failure we
+       * need to donate the ref back to the caller. */
+      def->came_from_user = true;
+      upb_def_donateref(def, ref_donor, s);
+      if (!upb_strtable_insert(&addtab, fullname, upb_value_ptr(def)))
+        goto oom_err;
+    }
+  }
+
+  /* Add standalone fielddefs (ie. extensions) to the appropriate messages.
+   * If the appropriate message only exists in the existing symtab, duplicate
+   * it so we have a mutable copy we can add the fields to. */
+  for (i = 0; i < n; i++) {
+    upb_def *def = defs[i];
+    upb_fielddef *f = upb_dyncast_fielddef_mutable(def);
+    const char *msgname;
+    upb_value v;
+    upb_msgdef *m;
+
+    if (!f) continue;
+    msgname = upb_fielddef_containingtypename(f);
+    /* We validated this earlier in this function. */
+    assert(msgname);
+
+    /* If the extendee name is absolutely qualified, move past the initial ".".
+     * TODO(haberman): it is not obvious what it would mean if this was not
+     * absolutely qualified. */
+    if (msgname[0] == '.') {
+      msgname++;
+    }
+
+    if (upb_strtable_lookup(&addtab, msgname, &v)) {
+      /* Extendee is in the set of defs the user asked us to add. */
+      m = upb_value_getptr(v);
+    } else {
+      /* Need to find and dup the extendee from the existing symtab. */
+      const upb_msgdef *frozen_m = upb_symtab_lookupmsg(s, msgname);
+      if (!frozen_m) {
+        upb_status_seterrf(status,
+                           "Tried to extend message %s that does not exist "
+                           "in this SymbolTable.",
+                           msgname);
+        goto err;
+      }
+      m = upb_msgdef_dup(frozen_m, s);
+      if (!m) goto oom_err;
+      if (!upb_strtable_insert(&addtab, msgname, upb_value_ptr(m))) {
+        upb_msgdef_unref(m, s);
+        goto oom_err;
+      }
+    }
+
+    if (!upb_msgdef_addfield(m, f, ref_donor, status)) {
+      goto err;
+    }
+  }
+
+  /* Add dups of any existing def that can reach a def with the same name as
+   * anything in our "add" set. */
+  if (!upb_inttable_init(&seen, UPB_CTYPE_BOOL)) goto oom_err;
+  upb_strtable_begin(&iter, &s->symtab);
+  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
+    upb_resolve_dfs(def, &addtab, s, &seen, status);
+    if (!upb_ok(status)) goto err;
+  }
+  upb_inttable_uninit(&seen);
+
+  /* Now using the table, resolve symbolic references for subdefs. */
+  upb_strtable_begin(&iter, &addtab);
+  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    const char *base;
+    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
+    upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
+    upb_msg_field_iter j;
+
+    if (!m) continue;
+    /* Type names are resolved relative to the message in which they appear. */
+    base = upb_msgdef_fullname(m);
+
+    for(upb_msg_field_begin(&j, m);
+        !upb_msg_field_done(&j);
+        upb_msg_field_next(&j)) {
+      upb_fielddef *f = upb_msg_iter_field(&j);
+      const char *name = upb_fielddef_subdefname(f);
+      if (name && !upb_fielddef_subdef(f)) {
+        /* Try the lookup in the current set of to-be-added defs first. If not
+         * there, try existing defs. */
+        upb_def *subdef = upb_resolvename(&addtab, base, name);
+        if (subdef == NULL) {
+          subdef = upb_resolvename(&s->symtab, base, name);
+        }
+        if (subdef == NULL) {
+          upb_status_seterrf(
+              status, "couldn't resolve name '%s' in message '%s'", name, base);
+          goto err;
+        } else if (!upb_fielddef_setsubdef(f, subdef, status)) {
+          goto err;
+        }
+      }
+    }
+  }
+
+  /* We need an array of the defs in addtab, for passing to upb_def_freeze. */
+  add_defs = malloc(sizeof(void*) * upb_strtable_count(&addtab));
+  if (add_defs == NULL) goto oom_err;
+  upb_strtable_begin(&iter, &addtab);
+  for (n = 0; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    add_defs[n++] = upb_value_getptr(upb_strtable_iter_value(&iter));
+  }
+
+  if (!upb_def_freeze(add_defs, n, status)) goto err;
+
+  /* This must be delayed until all errors have been detected, since error
+   * recovery code uses this table to cleanup defs. */
+  upb_strtable_uninit(&addtab);
+
+  /* TODO(haberman) we don't properly handle errors after this point (like
+   * OOM in upb_strtable_insert() below). */
+  for (i = 0; i < n; i++) {
+    upb_def *def = add_defs[i];
+    const char *name = upb_def_fullname(def);
+    upb_value v;
+    bool success;
+
+    if (upb_strtable_remove(&s->symtab, name, &v)) {
+      const upb_def *def = upb_value_getptr(v);
+      upb_def_unref(def, s);
+    }
+    success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));
+    UPB_ASSERT_VAR(success, success == true);
+  }
+  free(add_defs);
+  return true;
+
+oom_err:
+  upb_status_seterrmsg(status, "out of memory");
+err: {
+    /* For defs the user passed in, we need to donate the refs back.  For defs
+     * we dup'd, we need to just unref them. */
+    upb_strtable_begin(&iter, &addtab);
+    for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
+      bool came_from_user = def->came_from_user;
+      def->came_from_user = false;
+      if (came_from_user) {
+        upb_def_donateref(def, s, ref_donor);
+      } else {
+        upb_def_unref(def, s);
+      }
+    }
+  }
+  upb_strtable_uninit(&addtab);
+  free(add_defs);
+  assert(!upb_ok(status));
+  return false;
 }
 
-upb_bufsink *upb_bufsink_new(upb_env *env) {
-  upb_bufsink *sink = upb_env_malloc(env, sizeof(upb_bufsink));
-  upb_byteshandler_init(&sink->handler);
-  upb_byteshandler_setstartstr(&sink->handler, upb_bufsink_start, NULL);
-  upb_byteshandler_setstring(&sink->handler, upb_bufsink_string, NULL);
+/* Iteration. */
 
-  upb_bytessink_reset(&sink->sink, &sink->handler, sink);
+static void advance_to_matching(upb_symtab_iter *iter) {
+  if (iter->type == UPB_DEF_ANY)
+    return;
 
-  sink->env = env;
-  sink->size = 32;
-  sink->ptr = upb_env_malloc(env, sink->size);
-  sink->len = 0;
-
-  return sink;
+  while (!upb_strtable_done(&iter->iter) &&
+         iter->type != upb_symtab_iter_def(iter)->type) {
+    upb_strtable_next(&iter->iter);
+  }
 }
 
-void upb_bufsink_free(upb_bufsink *sink) {
-  upb_env_free(sink->env, sink->ptr);
-  upb_env_free(sink->env, sink);
+void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
+                      upb_deftype_t type) {
+  upb_strtable_begin(&iter->iter, &s->symtab);
+  iter->type = type;
+  advance_to_matching(iter);
 }
 
-upb_bytessink *upb_bufsink_sink(upb_bufsink *sink) {
-  return &sink->sink;
+void upb_symtab_next(upb_symtab_iter *iter) {
+  upb_strtable_next(&iter->iter);
+  advance_to_matching(iter);
 }
 
-const char *upb_bufsink_getdata(const upb_bufsink *sink, size_t *len) {
-  *len = sink->len;
-  return sink->ptr;
+bool upb_symtab_done(const upb_symtab_iter *iter) {
+  return upb_strtable_done(&iter->iter);
+}
+
+const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter) {
+  return upb_value_getptr(upb_strtable_iter_value(&iter->iter));
 }
 /*
 ** upb_table Implementation
@@ -6161,6 +4015,7 @@
 */
 
 
+#include <stdlib.h>
 #include <string.h>
 
 #define UPB_MAXARRSIZE 16  /* 64k. */
@@ -6169,12 +4024,6 @@
 #define ARRAY_SIZE(x) \
     ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
 
-static void upb_check_alloc(upb_table *t, upb_alloc *a) {
-  UPB_UNUSED(t);
-  UPB_UNUSED(a);
-  UPB_ASSERT_DEBUGVAR(t->alloc == a);
-}
-
 static const double MAX_LOAD = 0.85;
 
 /* The minimum utilization of the array part of a mixed hash/array table.  This
@@ -6192,11 +4041,11 @@
   return UPB_MIN(UPB_MAXARRSIZE, ret);
 }
 
-char *upb_strdup(const char *s, upb_alloc *a) {
-  return upb_strdup2(s, strlen(s), a);
+char *upb_strdup(const char *s) {
+  return upb_strdup2(s, strlen(s));
 }
 
-char *upb_strdup2(const char *s, size_t len, upb_alloc *a) {
+char *upb_strdup2(const char *s, size_t len) {
   size_t n;
   char *p;
 
@@ -6205,7 +4054,7 @@
   /* Always null-terminate, even if binary data; but don't rely on the input to
    * have a null-terminating byte since it may be a raw binary buffer. */
   n = len + 1;
-  p = upb_malloc(a, n);
+  p = malloc(n);
   if (p) {
     memcpy(p, s, len);
     p[len] = 0;
@@ -6246,27 +4095,19 @@
 }
 
 static bool isfull(upb_table *t) {
-  if (upb_table_size(t) == 0) {
-    return true;
-  } else {
-    return ((double)(t->count + 1) / upb_table_size(t)) > MAX_LOAD;
-  }
+  return (double)(t->count + 1) / upb_table_size(t) > MAX_LOAD;
 }
 
-static bool init(upb_table *t, upb_ctype_t ctype, uint8_t size_lg2,
-                 upb_alloc *a) {
+static bool init(upb_table *t, upb_ctype_t ctype, uint8_t size_lg2) {
   size_t bytes;
 
   t->count = 0;
   t->ctype = ctype;
   t->size_lg2 = size_lg2;
   t->mask = upb_table_size(t) ? upb_table_size(t) - 1 : 0;
-#ifndef NDEBUG
-  t->alloc = a;
-#endif
   bytes = upb_table_size(t) * sizeof(upb_tabent);
   if (bytes > 0) {
-    t->entries = upb_malloc(a, bytes);
+    t->entries = malloc(bytes);
     if (!t->entries) return false;
     memset(mutable_entries(t), 0, bytes);
   } else {
@@ -6275,14 +4116,11 @@
   return true;
 }
 
-static void uninit(upb_table *t, upb_alloc *a) {
-  upb_check_alloc(t, a);
-  upb_free(a, mutable_entries(t));
-}
+static void uninit(upb_table *t) { free(mutable_entries(t)); }
 
 static upb_tabent *emptyent(upb_table *t) {
   upb_tabent *e = mutable_entries(t) + upb_table_size(t);
-  while (1) { if (upb_tabent_isempty(--e)) return e; UPB_ASSERT(e > t->entries); }
+  while (1) { if (upb_tabent_isempty(--e)) return e; assert(e > t->entries); }
 }
 
 static upb_tabent *getentry_mutable(upb_table *t, uint32_t hash) {
@@ -6327,8 +4165,10 @@
   upb_tabent *mainpos_e;
   upb_tabent *our_e;
 
-  UPB_ASSERT(findentry(t, key, hash, eql) == NULL);
-  UPB_ASSERT_DEBUGVAR(val.ctype == t->ctype);
+  UPB_UNUSED(eql);
+  UPB_UNUSED(key);
+  assert(findentry(t, key, hash, eql) == NULL);
+  assert(val.ctype == t->ctype);
 
   t->count++;
   mainpos_e = getentry_mutable(t, hash);
@@ -6355,7 +4195,7 @@
       *new_e = *mainpos_e;  /* copies next. */
       while (chain->next != mainpos_e) {
         chain = (upb_tabent*)chain->next;
-        UPB_ASSERT(chain);
+        assert(chain);
       }
       chain->next = new_e;
       our_e = mainpos_e;
@@ -6364,7 +4204,7 @@
   }
   our_e->key = tabkey;
   our_e->val.val = val.val;
-  UPB_ASSERT(findentry(t, key, hash, eql) == our_e);
+  assert(findentry(t, key, hash, eql) == our_e);
 }
 
 static bool rm(upb_table *t, lookupkey_t key, upb_value *val,
@@ -6374,33 +4214,38 @@
   if (eql(chain->key, key)) {
     /* Element to remove is at the head of its chain. */
     t->count--;
-    if (val) _upb_value_setval(val, chain->val.val, t->ctype);
-    if (removed) *removed = chain->key;
+    if (val) {
+      _upb_value_setval(val, chain->val.val, t->ctype);
+    }
     if (chain->next) {
       upb_tabent *move = (upb_tabent*)chain->next;
       *chain = *move;
+      if (removed) *removed = move->key;
       move->key = 0;  /* Make the slot empty. */
     } else {
+      if (removed) *removed = chain->key;
       chain->key = 0;  /* Make the slot empty. */
     }
     return true;
   } else {
     /* Element to remove is either in a non-head position or not in the
      * table. */
-    while (chain->next && !eql(chain->next->key, key)) {
+    while (chain->next && !eql(chain->next->key, key))
       chain = (upb_tabent*)chain->next;
-    }
     if (chain->next) {
       /* Found element to remove. */
-      upb_tabent *rm = (upb_tabent*)chain->next;
-      t->count--;
-      if (val) _upb_value_setval(val, chain->next->val.val, t->ctype);
+      upb_tabent *rm;
+
+      if (val) {
+        _upb_value_setval(val, chain->next->val.val, t->ctype);
+      }
+      rm = (upb_tabent*)chain->next;
       if (removed) *removed = rm->key;
-      rm->key = 0;  /* Make the slot empty. */
+      rm->key = 0;
       chain->next = rm->next;
+      t->count--;
       return true;
     } else {
-      /* Element to remove is not in the table. */
       return false;
     }
   }
@@ -6424,8 +4269,8 @@
 
 /* A simple "subclass" of upb_table that only adds a hash function for strings. */
 
-static upb_tabkey strcopy(lookupkey_t k2, upb_alloc *a) {
-  char *str = upb_malloc(a, k2.str.len + sizeof(uint32_t) + 1);
+static upb_tabkey strcopy(lookupkey_t k2) {
+  char *str = malloc(k2.str.len + sizeof(uint32_t) + 1);
   if (str == NULL) return 0;
   memcpy(str, &k2.str.len, sizeof(uint32_t));
   memcpy(str + sizeof(uint32_t), k2.str.str, k2.str.len + 1);
@@ -6444,56 +4289,51 @@
   return len == k2.str.len && memcmp(str, k2.str.str, len) == 0;
 }
 
-bool upb_strtable_init2(upb_strtable *t, upb_ctype_t ctype, upb_alloc *a) {
-  return init(&t->t, ctype, 2, a);
+bool upb_strtable_init(upb_strtable *t, upb_ctype_t ctype) {
+  return init(&t->t, ctype, 2);
 }
 
-void upb_strtable_uninit2(upb_strtable *t, upb_alloc *a) {
+void upb_strtable_uninit(upb_strtable *t) {
   size_t i;
   for (i = 0; i < upb_table_size(&t->t); i++)
-    upb_free(a, (void*)t->t.entries[i].key);
-  uninit(&t->t, a);
+    free((void*)t->t.entries[i].key);
+  uninit(&t->t);
 }
 
-bool upb_strtable_resize(upb_strtable *t, size_t size_lg2, upb_alloc *a) {
+bool upb_strtable_resize(upb_strtable *t, size_t size_lg2) {
   upb_strtable new_table;
   upb_strtable_iter i;
 
-  upb_check_alloc(&t->t, a);
-
-  if (!init(&new_table.t, t->t.ctype, size_lg2, a))
+  if (!init(&new_table.t, t->t.ctype, size_lg2))
     return false;
   upb_strtable_begin(&i, t);
   for ( ; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-    upb_strtable_insert3(
+    upb_strtable_insert2(
         &new_table,
         upb_strtable_iter_key(&i),
         upb_strtable_iter_keylength(&i),
-        upb_strtable_iter_value(&i),
-        a);
+        upb_strtable_iter_value(&i));
   }
-  upb_strtable_uninit2(t, a);
+  upb_strtable_uninit(t);
   *t = new_table;
   return true;
 }
 
-bool upb_strtable_insert3(upb_strtable *t, const char *k, size_t len,
-                          upb_value v, upb_alloc *a) {
+bool upb_strtable_insert2(upb_strtable *t, const char *k, size_t len,
+                          upb_value v) {
   lookupkey_t key;
   upb_tabkey tabkey;
   uint32_t hash;
 
-  upb_check_alloc(&t->t, a);
-
   if (isfull(&t->t)) {
     /* Need to resize.  New table of double the size, add old elements to it. */
-    if (!upb_strtable_resize(t, t->t.size_lg2 + 1, a)) {
+    if (!upb_strtable_resize(t, t->t.size_lg2 + 1)) {
       return false;
     }
   }
 
   key = strkey2(k, len);
-  tabkey = strcopy(key, a);
+  tabkey = strcopy(key);
   if (tabkey == 0) return false;
 
   hash = MurmurHash2(key.str.str, key.str.len, 0);
@@ -6507,12 +4347,12 @@
   return lookup(&t->t, strkey2(key, len), v, hash, &streql);
 }
 
-bool upb_strtable_remove3(upb_strtable *t, const char *key, size_t len,
-                         upb_value *val, upb_alloc *alloc) {
-  uint32_t hash = MurmurHash2(key, len, 0);
+bool upb_strtable_remove2(upb_strtable *t, const char *key, size_t len,
+                         upb_value *val) {
+  uint32_t hash = MurmurHash2(key, strlen(key), 0);
   upb_tabkey tabkey;
   if (rm(&t->t, strkey2(key, len), val, &tabkey, hash, &streql)) {
-    upb_free(alloc, (void*)tabkey);
+    free((void*)tabkey);
     return true;
   } else {
     return false;
@@ -6539,20 +4379,20 @@
          upb_tabent_isempty(str_tabent(i));
 }
 
-const char *upb_strtable_iter_key(const upb_strtable_iter *i) {
-  UPB_ASSERT(!upb_strtable_done(i));
+const char *upb_strtable_iter_key(upb_strtable_iter *i) {
+  assert(!upb_strtable_done(i));
   return upb_tabstr(str_tabent(i)->key, NULL);
 }
 
-size_t upb_strtable_iter_keylength(const upb_strtable_iter *i) {
+size_t upb_strtable_iter_keylength(upb_strtable_iter *i) {
   uint32_t len;
-  UPB_ASSERT(!upb_strtable_done(i));
+  assert(!upb_strtable_done(i));
   upb_tabstr(str_tabent(i)->key, &len);
   return len;
 }
 
 upb_value upb_strtable_iter_value(const upb_strtable_iter *i) {
-  UPB_ASSERT(!upb_strtable_done(i));
+  assert(!upb_strtable_done(i));
   return _upb_value_val(str_tabent(i)->val.val, i->t->t.ctype);
 }
 
@@ -6611,26 +4451,26 @@
     upb_inttable_iter i;
     upb_inttable_begin(&i, t);
     for(; !upb_inttable_done(&i); upb_inttable_next(&i), count++) {
-      UPB_ASSERT(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));
+      assert(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));
     }
-    UPB_ASSERT(count == upb_inttable_count(t));
+    assert(count == upb_inttable_count(t));
   }
 #endif
 }
 
 bool upb_inttable_sizedinit(upb_inttable *t, upb_ctype_t ctype,
-                            size_t asize, int hsize_lg2, upb_alloc *a) {
+                            size_t asize, int hsize_lg2) {
   size_t array_bytes;
 
-  if (!init(&t->t, ctype, hsize_lg2, a)) return false;
+  if (!init(&t->t, ctype, hsize_lg2)) return false;
   /* Always make the array part at least 1 long, so that we know key 0
    * won't be in the hash part, which simplifies things. */
   t->array_size = UPB_MAX(1, asize);
   t->array_count = 0;
   array_bytes = t->array_size * sizeof(upb_value);
-  t->array = upb_malloc(a, array_bytes);
+  t->array = malloc(array_bytes);
   if (!t->array) {
-    uninit(&t->t, a);
+    uninit(&t->t);
     return false;
   }
   memset(mutable_array(t), 0xff, array_bytes);
@@ -6638,25 +4478,25 @@
   return true;
 }
 
-bool upb_inttable_init2(upb_inttable *t, upb_ctype_t ctype, upb_alloc *a) {
-  return upb_inttable_sizedinit(t, ctype, 0, 4, a);
+bool upb_inttable_init(upb_inttable *t, upb_ctype_t ctype) {
+  return upb_inttable_sizedinit(t, ctype, 0, 4);
 }
 
-void upb_inttable_uninit2(upb_inttable *t, upb_alloc *a) {
-  uninit(&t->t, a);
-  upb_free(a, mutable_array(t));
+void upb_inttable_uninit(upb_inttable *t) {
+  uninit(&t->t);
+  free(mutable_array(t));
 }
 
-bool upb_inttable_insert2(upb_inttable *t, uintptr_t key, upb_value val,
-                          upb_alloc *a) {
+bool upb_inttable_insert(upb_inttable *t, uintptr_t key, upb_value val) {
+  /* XXX: Table can't store value (uint64_t)-1.  Need to somehow statically
+   * guarantee that this is not necessary, or fix the limitation. */
   upb_tabval tabval;
   tabval.val = val.val;
-  UPB_ASSERT(upb_arrhas(tabval));  /* This will reject (uint64_t)-1.  Fix this. */
-
-  upb_check_alloc(&t->t, a);
+  UPB_UNUSED(tabval);
+  assert(upb_arrhas(tabval));
 
   if (key < t->array_size) {
-    UPB_ASSERT(!upb_arrhas(t->array[key]));
+    assert(!upb_arrhas(t->array[key]));
     t->array_count++;
     mutable_array(t)[key].val = val.val;
   } else {
@@ -6664,11 +4504,8 @@
       /* Need to resize the hash part, but we re-use the array part. */
       size_t i;
       upb_table new_table;
-
-      if (!init(&new_table, t->t.ctype, t->t.size_lg2 + 1, a)) {
+      if (!init(&new_table, t->t.ctype, t->t.size_lg2 + 1))
         return false;
-      }
-
       for (i = begin(&t->t); i < upb_table_size(&t->t); i = next(&t->t, i)) {
         const upb_tabent *e = &t->t.entries[i];
         uint32_t hash;
@@ -6679,9 +4516,9 @@
         insert(&new_table, intkey(e->key), e->key, v, hash, &inthash, &inteql);
       }
 
-      UPB_ASSERT(t->t.count == new_table.count);
+      assert(t->t.count == new_table.count);
 
-      uninit(&t->t, a);
+      uninit(&t->t);
       t->t = new_table;
     }
     insert(&t->t, intkey(key), key, val, upb_inthash(key), &inthash, &inteql);
@@ -6719,28 +4556,27 @@
       success = false;
     }
   } else {
-    success = rm(&t->t, intkey(key), val, NULL, upb_inthash(key), &inteql);
+    upb_tabkey removed;
+    uint32_t hash = upb_inthash(key);
+    success = rm(&t->t, intkey(key), val, &removed, hash, &inteql);
   }
   check(t);
   return success;
 }
 
-bool upb_inttable_push2(upb_inttable *t, upb_value val, upb_alloc *a) {
-  upb_check_alloc(&t->t, a);
-  return upb_inttable_insert2(t, upb_inttable_count(t), val, a);
+bool upb_inttable_push(upb_inttable *t, upb_value val) {
+  return upb_inttable_insert(t, upb_inttable_count(t), val);
 }
 
 upb_value upb_inttable_pop(upb_inttable *t) {
   upb_value val;
   bool ok = upb_inttable_remove(t, upb_inttable_count(t) - 1, &val);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return val;
 }
 
-bool upb_inttable_insertptr2(upb_inttable *t, const void *key, upb_value val,
-                             upb_alloc *a) {
-  upb_check_alloc(&t->t, a);
-  return upb_inttable_insert2(t, (uintptr_t)key, val, a);
+bool upb_inttable_insertptr(upb_inttable *t, const void *key, upb_value val) {
+  return upb_inttable_insert(t, (uintptr_t)key, val);
 }
 
 bool upb_inttable_lookupptr(const upb_inttable *t, const void *key,
@@ -6752,74 +4588,77 @@
   return upb_inttable_remove(t, (uintptr_t)key, val);
 }
 
-void upb_inttable_compact2(upb_inttable *t, upb_alloc *a) {
-  /* A power-of-two histogram of the table keys. */
-  size_t counts[UPB_MAXARRSIZE + 1] = {0};
-
-  /* The max key in each bucket. */
-  uintptr_t max[UPB_MAXARRSIZE + 1] = {0};
-
+void upb_inttable_compact(upb_inttable *t) {
+  /* Create a power-of-two histogram of the table keys. */
+  int counts[UPB_MAXARRSIZE + 1] = {0};
+  uintptr_t max_key = 0;
   upb_inttable_iter i;
-  size_t arr_count;
-  int size_lg2;
+  size_t arr_size;
+  int arr_count;
   upb_inttable new_t;
 
-  upb_check_alloc(&t->t, a);
-
   upb_inttable_begin(&i, t);
   for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {
     uintptr_t key = upb_inttable_iter_key(&i);
-    int bucket = log2ceil(key);
-    max[bucket] = UPB_MAX(max[bucket], key);
-    counts[bucket]++;
+    if (key > max_key) {
+      max_key = key;
+    }
+    counts[log2ceil(key)]++;
   }
 
-  /* Find the largest power of two that satisfies the MIN_DENSITY
-   * definition (while actually having some keys). */
+  arr_size = 1;
   arr_count = upb_inttable_count(t);
 
-  for (size_lg2 = ARRAY_SIZE(counts) - 1; size_lg2 > 0; size_lg2--) {
-    if (counts[size_lg2] == 0) {
-      /* We can halve again without losing any entries. */
-      continue;
-    } else if (arr_count >= (1 << size_lg2) * MIN_DENSITY) {
-      break;
+  if (upb_inttable_count(t) >= max_key * MIN_DENSITY) {
+    /* We can put 100% of the entries in the array part. */
+    arr_size = max_key + 1;
+  } else {
+    /* Find the largest power of two that satisfies the MIN_DENSITY
+     * definition. */
+    int size_lg2;
+    for (size_lg2 = ARRAY_SIZE(counts) - 1; size_lg2 > 1; size_lg2--) {
+      arr_size = 1 << size_lg2;
+      arr_count -= counts[size_lg2];
+      if (arr_count >= arr_size * MIN_DENSITY) {
+        break;
+      }
     }
-
-    arr_count -= counts[size_lg2];
   }
 
-  UPB_ASSERT(arr_count <= upb_inttable_count(t));
+  /* Array part must always be at least 1 entry large to catch lookups of key
+   * 0.  Key 0 must always be in the array part because "0" in the hash part
+   * denotes an empty entry. */
+  arr_size = UPB_MAX(arr_size, 1);
 
   {
     /* Insert all elements into new, perfectly-sized table. */
-    size_t arr_size = max[size_lg2] + 1;  /* +1 so arr[max] will fit. */
-    size_t hash_count = upb_inttable_count(t) - arr_count;
-    size_t hash_size = hash_count ? (hash_count / MAX_LOAD) + 1 : 0;
-    size_t hashsize_lg2 = log2ceil(hash_size);
+    int hash_count = upb_inttable_count(t) - arr_count;
+    int hash_size = hash_count ? (hash_count / MAX_LOAD) + 1 : 0;
+    int hashsize_lg2 = log2ceil(hash_size);
 
-    upb_inttable_sizedinit(&new_t, t->t.ctype, arr_size, hashsize_lg2, a);
+    assert(hash_count >= 0);
+    upb_inttable_sizedinit(&new_t, t->t.ctype, arr_size, hashsize_lg2);
     upb_inttable_begin(&i, t);
     for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {
       uintptr_t k = upb_inttable_iter_key(&i);
-      upb_inttable_insert2(&new_t, k, upb_inttable_iter_value(&i), a);
+      upb_inttable_insert(&new_t, k, upb_inttable_iter_value(&i));
     }
-    UPB_ASSERT(new_t.array_size == arr_size);
-    UPB_ASSERT(new_t.t.size_lg2 == hashsize_lg2);
+    assert(new_t.array_size == arr_size);
+    assert(new_t.t.size_lg2 == hashsize_lg2);
   }
-  upb_inttable_uninit2(t, a);
+  upb_inttable_uninit(t);
   *t = new_t;
 }
 
 /* Iteration. */
 
 static const upb_tabent *int_tabent(const upb_inttable_iter *i) {
-  UPB_ASSERT(!i->array_part);
+  assert(!i->array_part);
   return &i->t->t.entries[i->index];
 }
 
 static upb_tabval int_arrent(const upb_inttable_iter *i) {
-  UPB_ASSERT(i->array_part);
+  assert(i->array_part);
   return i->t->array[i->index];
 }
 
@@ -6856,12 +4695,12 @@
 }
 
 uintptr_t upb_inttable_iter_key(const upb_inttable_iter *i) {
-  UPB_ASSERT(!upb_inttable_done(i));
+  assert(!upb_inttable_done(i));
   return i->array_part ? i->index : int_tabent(i)->key;
 }
 
 upb_value upb_inttable_iter_value(const upb_inttable_iter *i) {
-  UPB_ASSERT(!upb_inttable_done(i));
+  assert(!upb_inttable_done(i));
   return _upb_value_val(
       i->array_part ? i->t->array[i->index].val : int_tabent(i)->val.val,
       i->t->t.ctype);
@@ -7079,23 +4918,10 @@
 static void nullz(upb_status *status) {
   const char *ellipsis = "...";
   size_t len = strlen(ellipsis);
-  UPB_ASSERT(sizeof(status->msg) > len);
+  assert(sizeof(status->msg) > len);
   memcpy(status->msg + sizeof(status->msg) - len, ellipsis, len);
 }
 
-
-/* upb_upberr *****************************************************************/
-
-upb_errorspace upb_upberr = {"upb error"};
-
-void upb_upberr_setoom(upb_status *status) {
-  status->error_space_ = &upb_upberr;
-  upb_status_seterrmsg(status, "Out of memory");
-}
-
-
-/* upb_status *****************************************************************/
-
 void upb_status_clear(upb_status *status) {
   if (!status) return;
   status->ok_ = true;
@@ -7134,610 +4960,311 @@
   nullz(status);
 }
 
+void upb_status_seterrcode(upb_status *status, upb_errorspace *space,
+                           int code) {
+  if (!status) return;
+  status->ok_ = false;
+  status->error_space_ = space;
+  status->code_ = code;
+  space->set_message(status, code);
+}
+
 void upb_status_copy(upb_status *to, const upb_status *from) {
   if (!to) return;
   *to = *from;
 }
-
-
-/* upb_alloc ******************************************************************/
-
-static void *upb_global_allocfunc(upb_alloc *alloc, void *ptr, size_t oldsize,
-                                  size_t size) {
-  UPB_UNUSED(alloc);
-  UPB_UNUSED(oldsize);
-  if (size == 0) {
-    free(ptr);
-    return NULL;
-  } else {
-    return realloc(ptr, size);
-  }
-}
-
-upb_alloc upb_alloc_global = {&upb_global_allocfunc};
-
-
-/* upb_arena ******************************************************************/
-
-/* Be conservative and choose 16 in case anyone is using SSE. */
-static const size_t maxalign = 16;
-
-static size_t align_up_max(size_t size) {
-  return ((size + maxalign - 1) / maxalign) * maxalign;
-}
-
-typedef struct mem_block {
-  struct mem_block *next;
-  size_t size;
-  size_t used;
-  bool owned;
-  /* Data follows. */
-} mem_block;
-
-typedef struct cleanup_ent {
-  struct cleanup_ent *next;
-  upb_cleanup_func *cleanup;
-  void *ud;
-} cleanup_ent;
-
-static void upb_arena_addblock(upb_arena *a, void *ptr, size_t size,
-                               bool owned) {
-  mem_block *block = ptr;
-
-  block->next = a->block_head;
-  block->size = size;
-  block->used = align_up_max(sizeof(mem_block));
-  block->owned = owned;
-
-  a->block_head = block;
-
-  /* TODO(haberman): ASAN poison. */
-}
-
-
-static mem_block *upb_arena_allocblock(upb_arena *a, size_t size) {
-  size_t block_size = UPB_MAX(size, a->next_block_size) + sizeof(mem_block);
-  mem_block *block = upb_malloc(a->block_alloc, block_size);
-
-  if (!block) {
-    return NULL;
-  }
-
-  upb_arena_addblock(a, block, block_size, true);
-  a->next_block_size = UPB_MIN(block_size * 2, a->max_block_size);
-
-  return block;
-}
-
-static void *upb_arena_doalloc(upb_alloc *alloc, void *ptr, size_t oldsize,
-                               size_t size) {
-  upb_arena *a = (upb_arena*)alloc;  /* upb_alloc is initial member. */
-  mem_block *block = a->block_head;
-  void *ret;
-
-  if (size == 0) {
-    return NULL;  /* We are an arena, don't need individual frees. */
-  }
-
-  size = align_up_max(size);
-
-  /* TODO(haberman): special-case if this is a realloc of the last alloc? */
-
-  if (!block || block->size - block->used < size) {
-    /* Slow path: have to allocate a new block. */
-    block = upb_arena_allocblock(a, size);
-
-    if (!block) {
-      return NULL;  /* Out of memory. */
-    }
-  }
-
-  ret = (char*)block + block->used;
-  block->used += size;
-
-  if (oldsize > 0) {
-    memcpy(ret, ptr, oldsize);  /* Preserve existing data. */
-  }
-
-  /* TODO(haberman): ASAN unpoison. */
-
-  a->bytes_allocated += size;
-  return ret;
-}
-
-/* Public Arena API ***********************************************************/
-
-void upb_arena_init(upb_arena *a) {
-  a->alloc.func = &upb_arena_doalloc;
-  a->block_alloc = &upb_alloc_global;
-  a->bytes_allocated = 0;
-  a->next_block_size = 256;
-  a->max_block_size = 16384;
-  a->cleanup_head = NULL;
-  a->block_head = NULL;
-}
-
-void upb_arena_init2(upb_arena *a, void *mem, size_t size, upb_alloc *alloc) {
-  upb_arena_init(a);
-
-  if (size > sizeof(mem_block)) {
-    upb_arena_addblock(a, mem, size, false);
-  }
-
-  if (alloc) {
-    a->block_alloc = alloc;
-  }
-}
-
-void upb_arena_uninit(upb_arena *a) {
-  cleanup_ent *ent = a->cleanup_head;
-  mem_block *block = a->block_head;
-
-  while (ent) {
-    ent->cleanup(ent->ud);
-    ent = ent->next;
-  }
-
-  /* Must do this after running cleanup functions, because this will delete
-   * the memory we store our cleanup entries in! */
-  while (block) {
-    mem_block *next = block->next;
-
-    if (block->owned) {
-      upb_free(a->block_alloc, block);
-    }
-
-    block = next;
-  }
-
-  /* Protect against multiple-uninit. */
-  a->cleanup_head = NULL;
-  a->block_head = NULL;
-}
-
-bool upb_arena_addcleanup(upb_arena *a, upb_cleanup_func *func, void *ud) {
-  cleanup_ent *ent = upb_malloc(&a->alloc, sizeof(cleanup_ent));
-  if (!ent) {
-    return false;  /* Out of memory. */
-  }
-
-  ent->cleanup = func;
-  ent->ud = ud;
-  ent->next = a->cleanup_head;
-  a->cleanup_head = ent;
-
-  return true;
-}
-
-size_t upb_arena_bytesallocated(const upb_arena *a) {
-  return a->bytes_allocated;
-}
-
-
-/* Standard error functions ***************************************************/
-
-static bool default_err(void *ud, const upb_status *status) {
-  UPB_UNUSED(ud);
-  UPB_UNUSED(status);
-  return false;
-}
-
-static bool write_err_to(void *ud, const upb_status *status) {
-  upb_status *copy_to = ud;
-  upb_status_copy(copy_to, status);
-  return false;
-}
-
-
-/* upb_env ********************************************************************/
-
-void upb_env_initonly(upb_env *e) {
-  e->ok_ = true;
-  e->error_func_ = &default_err;
-  e->error_ud_ = NULL;
-}
-
-void upb_env_init(upb_env *e) {
-  upb_arena_init(&e->arena_);
-  upb_env_initonly(e);
-}
-
-void upb_env_init2(upb_env *e, void *mem, size_t n, upb_alloc *alloc) {
-  upb_arena_init2(&e->arena_, mem, n, alloc);
-  upb_env_initonly(e);
-}
-
-void upb_env_uninit(upb_env *e) {
-  upb_arena_uninit(&e->arena_);
-}
-
-void upb_env_seterrorfunc(upb_env *e, upb_error_func *func, void *ud) {
-  e->error_func_ = func;
-  e->error_ud_ = ud;
-}
-
-void upb_env_reporterrorsto(upb_env *e, upb_status *s) {
-  e->error_func_ = &write_err_to;
-  e->error_ud_ = s;
-}
-
-bool upb_env_reporterror(upb_env *e, const upb_status *status) {
-  e->ok_ = false;
-  return e->error_func_(e->error_ud_, status);
-}
-
-void *upb_env_malloc(upb_env *e, size_t size) {
-  return upb_malloc(&e->arena_.alloc, size);
-}
-
-void *upb_env_realloc(upb_env *e, void *ptr, size_t oldsize, size_t size) {
-  return upb_realloc(&e->arena_.alloc, ptr, oldsize, size);
-}
-
-void upb_env_free(upb_env *e, void *ptr) {
-  upb_free(&e->arena_.alloc, ptr);
-}
-
-bool upb_env_addcleanup(upb_env *e, upb_cleanup_func *func, void *ud) {
-  return upb_arena_addcleanup(&e->arena_, func, ud);
-}
-
-size_t upb_env_bytesallocated(const upb_env *e) {
-  return upb_arena_bytesallocated(&e->arena_);
-}
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- *     upb/descriptor/descriptor.proto
- *
+/* This file was generated by upbc (the upb compiler).
  * Do not edit -- your changes will be discarded when the file is
  * regenerated. */
 
 
-static const upb_msgdef msgs[22];
-static const upb_fielddef fields[107];
-static const upb_enumdef enums[5];
+static const upb_msgdef msgs[20];
+static const upb_fielddef fields[81];
+static const upb_enumdef enums[4];
 static const upb_tabent strentries[236];
-static const upb_tabent intentries[18];
-static const upb_tabval arrays[187];
+static const upb_tabent intentries[14];
+static const upb_tabval arrays[232];
 
 #ifdef UPB_DEBUG_REFS
-static upb_inttable reftables[268];
+static upb_inttable reftables[212];
 #endif
 
-static const upb_msgdef msgs[22] = {
-  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 41, 8, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[0]), false, UPB_SYNTAX_PROTO2, &reftables[0], &reftables[1]),
-  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]), false, UPB_SYNTAX_PROTO2, &reftables[2], &reftables[3]),
-  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ReservedRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[14], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[20]), false, UPB_SYNTAX_PROTO2, &reftables[4], &reftables[5]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[17], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[24]), false, UPB_SYNTAX_PROTO2, &reftables[6], &reftables[7]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 9, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[21], 4, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]), false, UPB_SYNTAX_PROTO2, &reftables[8], &reftables[9]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 9, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[25], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[32]), false, UPB_SYNTAX_PROTO2, &reftables[10], &reftables[11]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[29], 2, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[36]), false, UPB_SYNTAX_PROTO2, &reftables[12], &reftables[13]),
-  UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 24, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[40]), false, UPB_SYNTAX_PROTO2, &reftables[14], &reftables[15]),
-  UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 13, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[42], 11, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[56]), false, UPB_SYNTAX_PROTO2, &reftables[16], &reftables[17]),
-  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 43, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[53], 13, 12), UPB_STRTABLE_INIT(12, 15, UPB_CTYPE_PTR, 4, &strentries[72]), false, UPB_SYNTAX_PROTO2, &reftables[18], &reftables[19]),
-  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[66], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[88]), false, UPB_SYNTAX_PROTO2, &reftables[20], &reftables[21]),
-  UPB_MSGDEF_INIT("google.protobuf.FileOptions", 38, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 42, 17), UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, &reftables[22], &reftables[23]),
-  UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 11, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[110], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, &reftables[24], &reftables[25]),
-  UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 16, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[118], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, &reftables[26], &reftables[27]),
-  UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[125], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, &reftables[28], &reftables[29]),
-  UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[126], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, &reftables[30], &reftables[31]),
-  UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[128], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, &reftables[32], &reftables[33]),
-  UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[132], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, &reftables[34], &reftables[35]),
-  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[133], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, &reftables[36], &reftables[37]),
-  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 20, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[135], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, &reftables[38], &reftables[39]),
-  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 19, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[142], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, &reftables[40], &reftables[41]),
-  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 7, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[151], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, &reftables[42], &reftables[43]),
+static const upb_msgdef msgs[20] = {
+  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 27, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 8, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[0]),&reftables[0], &reftables[1]),
+  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 4, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[8], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]),&reftables[2], &reftables[3]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[20]),&reftables[4], &reftables[5]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 7, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[15], 8, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[24]),&reftables[6], &reftables[7]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 8, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[23], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]),&reftables[8], &reftables[9]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 6, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[27], 4, 0), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[32]),&reftables[10], &reftables[11]),
+  UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 19, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 9, 8), UPB_STRTABLE_INIT(8, 15, UPB_CTYPE_PTR, 4, &strentries[36]),&reftables[12], &reftables[13]),
+  UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 14, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[40], 32, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[52]),&reftables[14], &reftables[15]),
+  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 39, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[72], 12, 11), UPB_STRTABLE_INIT(11, 15, UPB_CTYPE_PTR, 4, &strentries[68]),&reftables[16], &reftables[17]),
+  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[84], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[84]),&reftables[18], &reftables[19]),
+  UPB_MSGDEF_INIT("google.protobuf.FileOptions", 21, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[86], 64, 9), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[88]),&reftables[20], &reftables[21]),
+  UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[150], 16, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[104]),&reftables[22], &reftables[23]),
+  UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 13, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[166], 5, 4), UPB_STRTABLE_INIT(4, 7, UPB_CTYPE_PTR, 3, &strentries[108]),&reftables[24], &reftables[25]),
+  UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 6, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[10], &arrays[171], 4, 0), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[116]),&reftables[26], &reftables[27]),
+  UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[175], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[120]),&reftables[28], &reftables[29]),
+  UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 6, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[12], &arrays[179], 4, 0), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[124]),&reftables[30], &reftables[31]),
+  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[183], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[128]),&reftables[32], &reftables[33]),
+  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 14, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[185], 5, 4), UPB_STRTABLE_INIT(4, 7, UPB_CTYPE_PTR, 3, &strentries[132]),&reftables[34], &reftables[35]),
+  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 18, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[190], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[140]),&reftables[36], &reftables[37]),
+  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[199], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[156]),&reftables[38], &reftables[39]),
 };
 
-static const upb_fielddef fields[107] = {
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL, 16, 6, {0},&reftables[44], &reftables[45]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL, 7, 1, {0},&reftables[46], &reftables[47]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL, 24, 12, {0},&reftables[48], &reftables[49]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[11], NULL, 18, 6, {0},&reftables[50], &reftables[51]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "client_streaming", 5, &msgs[13], NULL, 14, 4, {0},&reftables[52], &reftables[53]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "csharp_namespace", 37, &msgs[11], NULL, 28, 14, {0},&reftables[54], &reftables[55]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[8], (const upb_def*)(&enums[2]), 7, 1, {0},&reftables[56], &reftables[57]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[7], NULL, 17, 7, {0},&reftables[58], &reftables[59]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[9], NULL, 31, 8, {0},&reftables[60], &reftables[61]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[8], NULL, 9, 3, {0},&reftables[62], &reftables[63]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[14], NULL, 7, 1, {0},&reftables[64], &reftables[65]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[12], NULL, 9, 3, {0},&reftables[66], &reftables[67]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 23, &msgs[11], NULL, 22, 10, {0},&reftables[68], &reftables[69]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 1, &msgs[6], NULL, 7, 1, {0},&reftables[70], &reftables[71]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[4], NULL, 8, 2, {0},&reftables[72], &reftables[73]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[17], NULL, 7, 1, {0},&reftables[74], &reftables[75]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[20], NULL, 12, 4, {0},&reftables[76], &reftables[77]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[2], NULL, 4, 1, {0},&reftables[78], &reftables[79]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 4, 1, {0},&reftables[80], &reftables[81]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[9], (const upb_def*)(&msgs[3]), 14, 1, {0},&reftables[82], &reftables[83]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[3]), 19, 2, {0},&reftables[84], &reftables[85]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[7], NULL, 8, 2, {0},&reftables[86], &reftables[87]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[7]), 25, 4, {0},&reftables[88], &reftables[89]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[9], (const upb_def*)(&msgs[7]), 20, 3, {0},&reftables[90], &reftables[91]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 22, 3, {0},&reftables[92], &reftables[93]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[7]), 13, 0, {0},&reftables[94], &reftables[95]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[10], (const upb_def*)(&msgs[9]), 6, 0, {0},&reftables[96], &reftables[97]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[11], NULL, 15, 5, {0},&reftables[98], &reftables[99]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[20], NULL, 7, 1, {0},&reftables[100], &reftables[101]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[13], NULL, 8, 2, {0},&reftables[102], &reftables[103]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[21], NULL, 6, 1, {0},&reftables[104], &reftables[105]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[11], NULL, 21, 9, {0},&reftables[106], &reftables[107]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[11], NULL, 19, 7, {0},&reftables[108], &reftables[109]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[11], NULL, 14, 4, {0},&reftables[110], &reftables[111]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[11], NULL, 10, 2, {0},&reftables[112], &reftables[113]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[11], NULL, 7, 1, {0},&reftables[114], &reftables[115]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_string_check_utf8", 27, &msgs[11], NULL, 23, 11, {0},&reftables[116], &reftables[117]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "javanano_use_deprecated_package", 38, &msgs[11], NULL, 31, 15, {0},&reftables[118], &reftables[119]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "json_name", 10, &msgs[7], NULL, 21, 9, {0},&reftables[120], &reftables[121]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "jstype", 6, &msgs[8], (const upb_def*)(&enums[3]), 11, 5, {0},&reftables[122], &reftables[123]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[7], (const upb_def*)(&enums[0]), 12, 4, {0},&reftables[124], &reftables[125]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[8], NULL, 10, 4, {0},&reftables[126], &reftables[127]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[19], NULL, 9, 2, {0},&reftables[128], &reftables[129]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "leading_detached_comments", 6, &msgs[19], NULL, 17, 4, {0},&reftables[130], &reftables[131]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[18], (const upb_def*)(&msgs[19]), 6, 0, {0},&reftables[132], &reftables[133]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "map_entry", 7, &msgs[12], NULL, 10, 4, {0},&reftables[134], &reftables[135]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[12], NULL, 7, 1, {0},&reftables[136], &reftables[137]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]), 11, 0, {0},&reftables[138], &reftables[139]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]), 7, 0, {0},&reftables[140], &reftables[141]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]), 6, 0, {0},&reftables[142], &reftables[143]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 5, 1, {0},&reftables[144], &reftables[145]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 23, 6, {0},&reftables[146], &reftables[147]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 9, 2, {0},&reftables[148], &reftables[149]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL, 9, 2, {0},&reftables[150], &reftables[151]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 3, 0, {0},&reftables[152], &reftables[153]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 5, 1, {0},&reftables[154], &reftables[155]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL, 5, 1, {0},&reftables[156], &reftables[157]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 33, 8, {0},&reftables[158], &reftables[159]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL, 3, 0, {0},&reftables[160], &reftables[161]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL, 11, 3, {0},&reftables[162], &reftables[163]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 16, 1, {0},&reftables[164], &reftables[165]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL, 8, 2, {0},&reftables[166], &reftables[167]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 11, 3, {0},&reftables[168], &reftables[169]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 8, 2, {0},&reftables[170], &reftables[171]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL, 25, 13, {0},&reftables[172], &reftables[173]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]), 29, 6, {0},&reftables[174], &reftables[175]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL, 20, 8, {0},&reftables[176], &reftables[177]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]), 13, 3, {0},&reftables[178], &reftables[179]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 26, 5, {0},&reftables[180], &reftables[181]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 21, 4, {0},&reftables[182], &reftables[183]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 4, 0, {0},&reftables[184], &reftables[185]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 4, 0, {0},&reftables[186], &reftables[187]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 8, 1, {0},&reftables[188], &reftables[189]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 8, 1, {0},&reftables[190], &reftables[191]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 4, 0, {0},&reftables[192], &reftables[193]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL, 11, 3, {0},&reftables[194], &reftables[195]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL, 26, 7, {0},&reftables[196], &reftables[197]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL, 8, 2, {0},&reftables[198], &reftables[199]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL, 5, 0, {0},&reftables[200], &reftables[201]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_class_prefix", 40, &msgs[11], NULL, 32, 16, {0},&reftables[202], &reftables[203]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_namespace", 41, &msgs[11], NULL, 35, 17, {0},&reftables[204], &reftables[205]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 10, 2, {0},&reftables[206], &reftables[207]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 36, 9, {0},&reftables[208], &reftables[209]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 20, 8, {0},&reftables[210], &reftables[211]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 38, 9, {0},&reftables[212], &reftables[213]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 32, 7, {0},&reftables[214], &reftables[215]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 15, 5, {0},&reftables[216], &reftables[217]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 17, 2, {0},&reftables[218], &reftables[219]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 22, 5, {0},&reftables[220], &reftables[221]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 8, 1, {0},&reftables[222], &reftables[223]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 3, 0, {0},&reftables[224], &reftables[225]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 3, 0, {0},&reftables[226], &reftables[227]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 13, 5, {0},&reftables[228], &reftables[229]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 40, 11, {0},&reftables[230], &reftables[231]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 12, 3, {0},&reftables[232], &reftables[233]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 13, 5, {0},&reftables[234], &reftables[235]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 14, 6, {0},&reftables[236], &reftables[237]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[238], &reftables[239]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[240], &reftables[241]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[242], &reftables[243]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[244], &reftables[245]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[246], &reftables[247]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[248], &reftables[249]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[250], &reftables[251]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 7, 0, {0},&reftables[252], &reftables[253]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 12, 6, {0},&reftables[254], &reftables[255]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 39, 10, {0},&reftables[256], &reftables[257]),
+static const upb_fielddef fields[81] = {
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[18], NULL, 15, 6, {0},&reftables[40], &reftables[41]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[3], NULL, 6, 1, {0},&reftables[42], &reftables[43]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[10], NULL, 17, 6, {0},&reftables[44], &reftables[45]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[7], (const upb_def*)(&enums[2]), 6, 1, {0},&reftables[46], &reftables[47]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[6], NULL, 16, 7, {0},&reftables[48], &reftables[49]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[8], NULL, 30, 8, {0},&reftables[50], &reftables[51]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[7], NULL, 8, 3, {0},&reftables[52], &reftables[53]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[18], NULL, 11, 4, {0},&reftables[54], &reftables[55]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 3, 1, {0},&reftables[56], &reftables[57]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[2]), 16, 2, {0},&reftables[58], &reftables[59]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[8], (const upb_def*)(&msgs[2]), 13, 1, {0},&reftables[60], &reftables[61]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "experimental_map_key", 9, &msgs[7], NULL, 10, 5, {0},&reftables[62], &reftables[63]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[6], NULL, 7, 2, {0},&reftables[64], &reftables[65]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[8], (const upb_def*)(&msgs[6]), 19, 3, {0},&reftables[66], &reftables[67]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[6]), 22, 4, {0},&reftables[68], &reftables[69]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 19, 3, {0},&reftables[70], &reftables[71]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[6]), 10, 0, {0},&reftables[72], &reftables[73]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[9], (const upb_def*)(&msgs[8]), 5, 0, {0},&reftables[74], &reftables[75]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[10], NULL, 14, 5, {0},&reftables[76], &reftables[77]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[18], NULL, 6, 1, {0},&reftables[78], &reftables[79]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[12], NULL, 7, 2, {0},&reftables[80], &reftables[81]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[19], NULL, 5, 1, {0},&reftables[82], &reftables[83]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[10], NULL, 20, 9, {0},&reftables[84], &reftables[85]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[10], NULL, 18, 7, {0},&reftables[86], &reftables[87]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[10], NULL, 13, 4, {0},&reftables[88], &reftables[89]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[10], NULL, 9, 2, {0},&reftables[90], &reftables[91]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[10], NULL, 6, 1, {0},&reftables[92], &reftables[93]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[6], (const upb_def*)(&enums[0]), 11, 4, {0},&reftables[94], &reftables[95]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[7], NULL, 9, 4, {0},&reftables[96], &reftables[97]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[17], NULL, 8, 2, {0},&reftables[98], &reftables[99]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[16], (const upb_def*)(&msgs[17]), 5, 0, {0},&reftables[100], &reftables[101]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[11], NULL, 6, 1, {0},&reftables[102], &reftables[103]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[8], (const upb_def*)(&msgs[0]), 10, 0, {0},&reftables[104], &reftables[105]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[14], (const upb_def*)(&msgs[12]), 6, 0, {0},&reftables[106], &reftables[107]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[8], NULL, 22, 6, {0},&reftables[108], &reftables[109]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[14], NULL, 8, 2, {0},&reftables[110], &reftables[111]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[18], (const upb_def*)(&msgs[19]), 5, 0, {0},&reftables[112], &reftables[113]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[4], NULL, 4, 1, {0},&reftables[114], &reftables[115]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 24, 6, {0},&reftables[116], &reftables[117]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[12], NULL, 4, 1, {0},&reftables[118], &reftables[119]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[2], NULL, 8, 2, {0},&reftables[120], &reftables[121]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[6], NULL, 4, 1, {0},&reftables[122], &reftables[123]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[19], NULL, 2, 0, {0},&reftables[124], &reftables[125]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[18], NULL, 10, 3, {0},&reftables[126], &reftables[127]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 13, 1, {0},&reftables[128], &reftables[129]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[11], NULL, 7, 2, {0},&reftables[130], &reftables[131]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[6], NULL, 10, 3, {0},&reftables[132], &reftables[133]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[4], NULL, 7, 2, {0},&reftables[134], &reftables[135]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[10], (const upb_def*)(&enums[3]), 12, 3, {0},&reftables[136], &reftables[137]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[11]), 23, 5, {0},&reftables[138], &reftables[139]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[2], (const upb_def*)(&msgs[3]), 7, 1, {0},&reftables[140], &reftables[141]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[6], (const upb_def*)(&msgs[7]), 3, 0, {0},&reftables[142], &reftables[143]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[4], (const upb_def*)(&msgs[5]), 3, 0, {0},&reftables[144], &reftables[145]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[8], (const upb_def*)(&msgs[10]), 20, 4, {0},&reftables[146], &reftables[147]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[14], (const upb_def*)(&msgs[15]), 7, 1, {0},&reftables[148], &reftables[149]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[12], (const upb_def*)(&msgs[13]), 3, 0, {0},&reftables[150], &reftables[151]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[12], NULL, 10, 3, {0},&reftables[152], &reftables[153]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[8], NULL, 25, 7, {0},&reftables[154], &reftables[155]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[7], NULL, 7, 2, {0},&reftables[156], &reftables[157]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[17], NULL, 4, 0, {0},&reftables[158], &reftables[159]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[18], NULL, 9, 2, {0},&reftables[160], &reftables[161]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[8], NULL, 35, 9, {0},&reftables[162], &reftables[163]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[10], NULL, 19, 8, {0},&reftables[164], &reftables[165]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[8], (const upb_def*)(&msgs[14]), 16, 2, {0},&reftables[166], &reftables[167]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[8], (const upb_def*)(&msgs[16]), 21, 5, {0},&reftables[168], &reftables[169]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[17], NULL, 7, 1, {0},&reftables[170], &reftables[171]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 2, 0, {0},&reftables[172], &reftables[173]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[18], NULL, 12, 5, {0},&reftables[174], &reftables[175]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[17], NULL, 11, 3, {0},&reftables[176], &reftables[177]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[6], (const upb_def*)(&enums[1]), 12, 5, {0},&reftables[178], &reftables[179]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[6], NULL, 13, 6, {0},&reftables[180], &reftables[181]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[5], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[182], &reftables[183]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[15], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[184], &reftables[185]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[3], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[186], &reftables[187]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[13], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[188], &reftables[189]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[10], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[190], &reftables[191]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[192], &reftables[193]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[7], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[194], &reftables[195]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[2], (const upb_def*)(&msgs[4]), 6, 0, {0},&reftables[196], &reftables[197]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[7], NULL, 13, 6, {0},&reftables[198], &reftables[199]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[8], NULL, 38, 10, {0},&reftables[200], &reftables[201]),
 };
 
-static const upb_enumdef enums[5] = {
-  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[188]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[154], 4, 3), 0, &reftables[258], &reftables[259]),
-  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[192]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[158], 19, 18), 0, &reftables[260], &reftables[261]),
-  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[224]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[177], 3, 3), 0, &reftables[262], &reftables[263]),
-  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.JSType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[228]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[180], 3, 3), 0, &reftables[264], &reftables[265]),
-  UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[232]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[183], 4, 3), 0, &reftables[266], &reftables[267]),
+static const upb_enumdef enums[4] = {
+  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[160]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[202], 4, 3), 0, &reftables[202], &reftables[203]),
+  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[164]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[206], 19, 18), 0, &reftables[204], &reftables[205]),
+  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[196]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[225], 3, 3), 0, &reftables[206], &reftables[207]),
+  UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[200]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[228], 4, 3), 0, &reftables[208], &reftables[209]),
 };
 
 static const upb_tabent strentries[236] = {
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[22]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "reserved_name"), UPB_TABVALUE_PTR_INIT(&fields[84]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[38]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "field"), UPB_TABVALUE_PTR_INIT(&fields[25]), &strentries[12]},
-  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "extension_range"), UPB_TABVALUE_PTR_INIT(&fields[24]), &strentries[14]},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "field"), UPB_TABVALUE_PTR_INIT(&fields[16]), NULL},
+  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "extension_range"), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "nested_type"), UPB_TABVALUE_PTR_INIT(&fields[60]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "reserved_range"), UPB_TABVALUE_PTR_INIT(&fields[85]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[68]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "oneof_decl"), UPB_TABVALUE_PTR_INIT(&fields[65]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), &strentries[13]},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[91]), NULL},
-  {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[18]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[90]), NULL},
-  {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[17]), NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "nested_type"), UPB_TABVALUE_PTR_INIT(&fields[44]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[104]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[52]), &strentries[26]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[49]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[9]), &strentries[14]},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[66]), NULL},
+  {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[8]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[78]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[50]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[40]), &strentries[22]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "allow_alias"), UPB_TABVALUE_PTR_INIT(&fields[1]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[63]), NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[47]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[50]), &strentries[34]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "oneof_index"), UPB_TABVALUE_PTR_INIT(&fields[66]), NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "label"), UPB_TABVALUE_PTR_INIT(&fields[40]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[56]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[52]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[37]), &strentries[30]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[62]), &strentries[53]},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "label"), UPB_TABVALUE_PTR_INIT(&fields[27]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "extendee"), UPB_TABVALUE_PTR_INIT(&fields[21]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "json_name"), UPB_TABVALUE_PTR_INIT(&fields[38]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[95]), &strentries[50]},
-  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "default_value"), UPB_TABVALUE_PTR_INIT(&fields[7]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[105]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[41]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "packed"), UPB_TABVALUE_PTR_INIT(&fields[77]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "lazy"), UPB_TABVALUE_PTR_INIT(&fields[41]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "ctype"), UPB_TABVALUE_PTR_INIT(&fields[6]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "jstype"), UPB_TABVALUE_PTR_INIT(&fields[39]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[9]), NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[46]), &strentries[49]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[23]), NULL},
-  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[106]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL},
+  {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "extendee"), UPB_TABVALUE_PTR_INIT(&fields[12]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[69]), &strentries[48]},
+  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "default_value"), UPB_TABVALUE_PTR_INIT(&fields[4]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "experimental_map_key"), UPB_TABVALUE_PTR_INIT(&fields[11]), &strentries[67]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[87]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[88]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "syntax"), UPB_TABVALUE_PTR_INIT(&fields[93]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "dependency"), UPB_TABVALUE_PTR_INIT(&fields[8]), NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "message_type"), UPB_TABVALUE_PTR_INIT(&fields[47]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "package"), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[69]), &strentries[86]},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[19]), NULL},
-  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[82]), &strentries[85]},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "file"), UPB_TABVALUE_PTR_INIT(&fields[26]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "cc_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[3]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "csharp_namespace"), UPB_TABVALUE_PTR_INIT(&fields[5]), &strentries[116]},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "packed"), UPB_TABVALUE_PTR_INIT(&fields[58]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "lazy"), UPB_TABVALUE_PTR_INIT(&fields[28]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "ctype"), UPB_TABVALUE_PTR_INIT(&fields[3]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[6]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[77]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL},
+  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[80]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[34]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[63]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[64]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "dependency"), UPB_TABVALUE_PTR_INIT(&fields[5]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "message_type"), UPB_TABVALUE_PTR_INIT(&fields[32]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "package"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[82]},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
+  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[61]), &strentries[81]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "file"), UPB_TABVALUE_PTR_INIT(&fields[17]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "cc_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[2]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "java_multiple_files"), UPB_TABVALUE_PTR_INIT(&fields[24]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\025", "\000", "\000", "\000", "java_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[23]), &strentries[102]},
+  {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "java_generate_equals_and_hash"), UPB_TABVALUE_PTR_INIT(&fields[22]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "go_package"), UPB_TABVALUE_PTR_INIT(&fields[18]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "java_package"), UPB_TABVALUE_PTR_INIT(&fields[26]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "optimize_for"), UPB_TABVALUE_PTR_INIT(&fields[48]), NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[62]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "java_outer_classname"), UPB_TABVALUE_PTR_INIT(&fields[25]), NULL},
+  {UPB_TABKEY_STR("\027", "\000", "\000", "\000", "message_set_wire_format"), UPB_TABVALUE_PTR_INIT(&fields[31]), &strentries[106]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL},
+  {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "no_standard_descriptor_accessor"), UPB_TABVALUE_PTR_INIT(&fields[45]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[39]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "input_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "output_type"), UPB_TABVALUE_PTR_INIT(&fields[56]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[54]), &strentries[122]},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "method"), UPB_TABVALUE_PTR_INIT(&fields[33]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[35]), &strentries[121]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[72]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "go_package"), UPB_TABVALUE_PTR_INIT(&fields[27]), NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "java_package"), UPB_TABVALUE_PTR_INIT(&fields[35]), &strentries[120]},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "java_outer_classname"), UPB_TABVALUE_PTR_INIT(&fields[34]), NULL},
-  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "php_namespace"), UPB_TABVALUE_PTR_INIT(&fields[80]), &strentries[113]},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "java_multiple_files"), UPB_TABVALUE_PTR_INIT(&fields[33]), &strentries[117]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL},
-  {UPB_TABKEY_STR("\025", "\000", "\000", "\000", "java_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[32]), &strentries[118]},
-  {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "java_generate_equals_and_hash"), UPB_TABVALUE_PTR_INIT(&fields[31]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "php_class_prefix"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL},
-  {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "javanano_use_deprecated_package"), UPB_TABVALUE_PTR_INIT(&fields[37]), &strentries[123]},
-  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[83]), NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "optimize_for"), UPB_TABVALUE_PTR_INIT(&fields[67]), NULL},
-  {UPB_TABKEY_STR("\026", "\000", "\000", "\000", "java_string_check_utf8"), UPB_TABVALUE_PTR_INIT(&fields[36]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[12]), &strentries[119]},
-  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "objc_class_prefix"), UPB_TABVALUE_PTR_INIT(&fields[64]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "cc_enable_arenas"), UPB_TABVALUE_PTR_INIT(&fields[2]), NULL},
-  {UPB_TABKEY_STR("\027", "\000", "\000", "\000", "message_set_wire_format"), UPB_TABVALUE_PTR_INIT(&fields[46]), &strentries[128]},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[11]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "map_entry"), UPB_TABVALUE_PTR_INIT(&fields[45]), NULL},
-  {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "no_standard_descriptor_accessor"), UPB_TABVALUE_PTR_INIT(&fields[61]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "client_streaming"), UPB_TABVALUE_PTR_INIT(&fields[4]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "server_streaming"), UPB_TABVALUE_PTR_INIT(&fields[86]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "input_type"), UPB_TABVALUE_PTR_INIT(&fields[29]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "output_type"), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
+  {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "location"), UPB_TABVALUE_PTR_INIT(&fields[30]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[65]), &strentries[139]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[54]), NULL},
+  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[68]), NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "leading_comments"), UPB_TABVALUE_PTR_INIT(&fields[29]), &strentries[137]},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "path"), UPB_TABVALUE_PTR_INIT(&fields[59]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "double_value"), UPB_TABVALUE_PTR_INIT(&fields[7]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[72]), &strentries[150]},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "method"), UPB_TABVALUE_PTR_INIT(&fields[48]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[149]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[36]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "location"), UPB_TABVALUE_PTR_INIT(&fields[44]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[89]), &strentries[167]},
-  {UPB_TABKEY_STR("\031", "\000", "\000", "\000", "leading_detached_comments"), UPB_TABVALUE_PTR_INIT(&fields[43]), &strentries[165]},
-  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[94]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "leading_comments"), UPB_TABVALUE_PTR_INIT(&fields[42]), &strentries[164]},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "path"), UPB_TABVALUE_PTR_INIT(&fields[78]), NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "double_value"), UPB_TABVALUE_PTR_INIT(&fields[16]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[49]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "negative_int_value"), UPB_TABVALUE_PTR_INIT(&fields[59]), NULL},
+  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "negative_int_value"), UPB_TABVALUE_PTR_INIT(&fields[43]), NULL},
   {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "aggregate_value"), UPB_TABVALUE_PTR_INIT(&fields[0]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[81]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "identifier_value"), UPB_TABVALUE_PTR_INIT(&fields[28]), NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[92]), &strentries[182]},
+  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[60]), NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "identifier_value"), UPB_TABVALUE_PTR_INIT(&fields[19]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[67]), &strentries[154]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "is_extension"), UPB_TABVALUE_PTR_INIT(&fields[30]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "name_part"), UPB_TABVALUE_PTR_INIT(&fields[58]), NULL},
-  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REQUIRED"), UPB_TABVALUE_INT_INIT(2), &strentries[190]},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "is_extension"), UPB_TABVALUE_PTR_INIT(&fields[21]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "name_part"), UPB_TABVALUE_PTR_INIT(&fields[42]), NULL},
+  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REQUIRED"), UPB_TABVALUE_INT_INIT(2), &strentries[162]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REPEATED"), UPB_TABVALUE_INT_INIT(3), NULL},
   {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_OPTIONAL"), UPB_TABVALUE_INT_INIT(1), NULL},
@@ -7747,17 +5274,17 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_STRING"), UPB_TABVALUE_INT_INIT(9), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_FLOAT"), UPB_TABVALUE_INT_INIT(2), &strentries[221]},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_FLOAT"), UPB_TABVALUE_INT_INIT(2), &strentries[193]},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_DOUBLE"), UPB_TABVALUE_INT_INIT(1), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT32"), UPB_TABVALUE_INT_INIT(5), NULL},
   {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "TYPE_SFIXED32"), UPB_TABVALUE_INT_INIT(15), NULL},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_FIXED32"), UPB_TABVALUE_INT_INIT(7), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_MESSAGE"), UPB_TABVALUE_INT_INIT(11), &strentries[222]},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_MESSAGE"), UPB_TABVALUE_INT_INIT(11), &strentries[194]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT64"), UPB_TABVALUE_INT_INIT(3), &strentries[219]},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT64"), UPB_TABVALUE_INT_INIT(3), &strentries[191]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7765,7 +5292,7 @@
   {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "TYPE_ENUM"), UPB_TABVALUE_INT_INIT(14), NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT32"), UPB_TABVALUE_INT_INIT(13), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT64"), UPB_TABVALUE_INT_INIT(4), &strentries[218]},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT64"), UPB_TABVALUE_INT_INIT(4), &strentries[190]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "TYPE_SFIXED64"), UPB_TABVALUE_INT_INIT(16), NULL},
   {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_BYTES"), UPB_TABVALUE_INT_INIT(12), NULL},
@@ -7775,110 +5302,131 @@
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_SINT32"), UPB_TABVALUE_INT_INIT(17), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "CORD"), UPB_TABVALUE_INT_INIT(1), NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "STRING"), UPB_TABVALUE_INT_INIT(0), &strentries[225]},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "STRING"), UPB_TABVALUE_INT_INIT(0), &strentries[197]},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "STRING_PIECE"), UPB_TABVALUE_INT_INIT(2), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "JS_NORMAL"), UPB_TABVALUE_INT_INIT(0), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "JS_NUMBER"), UPB_TABVALUE_INT_INIT(2), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "JS_STRING"), UPB_TABVALUE_INT_INIT(1), NULL},
   {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "CODE_SIZE"), UPB_TABVALUE_INT_INIT(2), NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "SPEED"), UPB_TABVALUE_INT_INIT(1), &strentries[235]},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "SPEED"), UPB_TABVALUE_INT_INIT(1), &strentries[203]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "LITE_RUNTIME"), UPB_TABVALUE_INT_INIT(3), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\047", "\000", "\000", "\000", "google.protobuf.SourceCodeInfo.Location"), UPB_TABVALUE_PTR_INIT(&msgs[17]), NULL},
+  {UPB_TABKEY_STR("\043", "\000", "\000", "\000", "google.protobuf.UninterpretedOption"), UPB_TABVALUE_PTR_INIT(&msgs[18]), NULL},
+  {UPB_TABKEY_STR("\043", "\000", "\000", "\000", "google.protobuf.FileDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[8]), NULL},
+  {UPB_TABKEY_STR("\045", "\000", "\000", "\000", "google.protobuf.MethodDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[12]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\040", "\000", "\000", "\000", "google.protobuf.EnumValueOptions"), UPB_TABVALUE_PTR_INIT(&msgs[5]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "google.protobuf.DescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[0]), &strentries[228]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\036", "\000", "\000", "\000", "google.protobuf.SourceCodeInfo"), UPB_TABVALUE_PTR_INIT(&msgs[16]), NULL},
+  {UPB_TABKEY_STR("\051", "\000", "\000", "\000", "google.protobuf.FieldDescriptorProto.Type"), UPB_TABVALUE_PTR_INIT(&enums[1]), NULL},
+  {UPB_TABKEY_STR("\056", "\000", "\000", "\000", "google.protobuf.DescriptorProto.ExtensionRange"), UPB_TABVALUE_PTR_INIT(&msgs[1]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\050", "\000", "\000", "\000", "google.protobuf.EnumValueDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[4]), NULL},
+  {UPB_TABKEY_STR("\034", "\000", "\000", "\000", "google.protobuf.FieldOptions"), UPB_TABVALUE_PTR_INIT(&msgs[7]), NULL},
+  {UPB_TABKEY_STR("\033", "\000", "\000", "\000", "google.protobuf.FileOptions"), UPB_TABVALUE_PTR_INIT(&msgs[10]), NULL},
+  {UPB_TABKEY_STR("\043", "\000", "\000", "\000", "google.protobuf.EnumDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[2]), &strentries[233]},
+  {UPB_TABKEY_STR("\052", "\000", "\000", "\000", "google.protobuf.FieldDescriptorProto.Label"), UPB_TABVALUE_PTR_INIT(&enums[0]), NULL},
+  {UPB_TABKEY_STR("\046", "\000", "\000", "\000", "google.protobuf.ServiceDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[14]), NULL},
+  {UPB_TABKEY_STR("\042", "\000", "\000", "\000", "google.protobuf.FieldOptions.CType"), UPB_TABVALUE_PTR_INIT(&enums[2]), &strentries[229]},
+  {UPB_TABKEY_STR("\041", "\000", "\000", "\000", "google.protobuf.FileDescriptorSet"), UPB_TABVALUE_PTR_INIT(&msgs[9]), &strentries[235]},
+  {UPB_TABKEY_STR("\033", "\000", "\000", "\000", "google.protobuf.EnumOptions"), UPB_TABVALUE_PTR_INIT(&msgs[3]), NULL},
+  {UPB_TABKEY_STR("\044", "\000", "\000", "\000", "google.protobuf.FieldDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[6]), NULL},
+  {UPB_TABKEY_STR("\050", "\000", "\000", "\000", "google.protobuf.FileOptions.OptimizeMode"), UPB_TABVALUE_PTR_INIT(&enums[3]), &strentries[221]},
+  {UPB_TABKEY_STR("\036", "\000", "\000", "\000", "google.protobuf.ServiceOptions"), UPB_TABVALUE_PTR_INIT(&msgs[15]), NULL},
+  {UPB_TABKEY_STR("\036", "\000", "\000", "\000", "google.protobuf.MessageOptions"), UPB_TABVALUE_PTR_INIT(&msgs[11]), NULL},
+  {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "google.protobuf.MethodOptions"), UPB_TABVALUE_PTR_INIT(&msgs[13]), &strentries[226]},
+  {UPB_TABKEY_STR("\054", "\000", "\000", "\000", "google.protobuf.UninterpretedOption.NamePart"), UPB_TABVALUE_PTR_INIT(&msgs[19]), NULL},
 };
 
-static const upb_tabent intentries[18] = {
+static const upb_tabent intentries[14] = {
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[77]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[72]), NULL},
 };
 
-static const upb_tabval arrays[187] = {
+static const upb_tabval arrays[232] = {
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[57]),
-  UPB_TABVALUE_PTR_INIT(&fields[25]),
-  UPB_TABVALUE_PTR_INIT(&fields[60]),
-  UPB_TABVALUE_PTR_INIT(&fields[20]),
-  UPB_TABVALUE_PTR_INIT(&fields[24]),
-  UPB_TABVALUE_PTR_INIT(&fields[22]),
-  UPB_TABVALUE_PTR_INIT(&fields[68]),
-  UPB_TABVALUE_PTR_INIT(&fields[65]),
-  UPB_TABVALUE_PTR_INIT(&fields[85]),
-  UPB_TABVALUE_PTR_INIT(&fields[84]),
+  UPB_TABVALUE_PTR_INIT(&fields[38]),
+  UPB_TABVALUE_PTR_INIT(&fields[16]),
+  UPB_TABVALUE_PTR_INIT(&fields[44]),
+  UPB_TABVALUE_PTR_INIT(&fields[9]),
+  UPB_TABVALUE_PTR_INIT(&fields[15]),
+  UPB_TABVALUE_PTR_INIT(&fields[14]),
+  UPB_TABVALUE_PTR_INIT(&fields[49]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[91]),
-  UPB_TABVALUE_PTR_INIT(&fields[18]),
+  UPB_TABVALUE_PTR_INIT(&fields[66]),
+  UPB_TABVALUE_PTR_INIT(&fields[8]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[90]),
-  UPB_TABVALUE_PTR_INIT(&fields[17]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[52]),
-  UPB_TABVALUE_PTR_INIT(&fields[104]),
-  UPB_TABVALUE_PTR_INIT(&fields[73]),
+  UPB_TABVALUE_PTR_INIT(&fields[40]),
+  UPB_TABVALUE_PTR_INIT(&fields[78]),
+  UPB_TABVALUE_PTR_INIT(&fields[50]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[1]),
-  UPB_TABVALUE_PTR_INIT(&fields[14]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[50]),
-  UPB_TABVALUE_PTR_INIT(&fields[63]),
-  UPB_TABVALUE_PTR_INIT(&fields[74]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[13]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[56]),
-  UPB_TABVALUE_PTR_INIT(&fields[21]),
-  UPB_TABVALUE_PTR_INIT(&fields[62]),
-  UPB_TABVALUE_PTR_INIT(&fields[40]),
-  UPB_TABVALUE_PTR_INIT(&fields[95]),
-  UPB_TABVALUE_PTR_INIT(&fields[96]),
-  UPB_TABVALUE_PTR_INIT(&fields[7]),
-  UPB_TABVALUE_PTR_INIT(&fields[70]),
-  UPB_TABVALUE_PTR_INIT(&fields[66]),
-  UPB_TABVALUE_PTR_INIT(&fields[38]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[6]),
-  UPB_TABVALUE_PTR_INIT(&fields[77]),
-  UPB_TABVALUE_PTR_INIT(&fields[9]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[37]),
+  UPB_TABVALUE_PTR_INIT(&fields[47]),
+  UPB_TABVALUE_PTR_INIT(&fields[52]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[41]),
-  UPB_TABVALUE_PTR_INIT(&fields[39]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[105]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[51]),
-  UPB_TABVALUE_PTR_INIT(&fields[76]),
-  UPB_TABVALUE_PTR_INIT(&fields[8]),
-  UPB_TABVALUE_PTR_INIT(&fields[47]),
-  UPB_TABVALUE_PTR_INIT(&fields[19]),
-  UPB_TABVALUE_PTR_INIT(&fields[87]),
-  UPB_TABVALUE_PTR_INIT(&fields[23]),
+  UPB_TABVALUE_PTR_INIT(&fields[12]),
+  UPB_TABVALUE_PTR_INIT(&fields[46]),
+  UPB_TABVALUE_PTR_INIT(&fields[27]),
   UPB_TABVALUE_PTR_INIT(&fields[69]),
-  UPB_TABVALUE_PTR_INIT(&fields[88]),
-  UPB_TABVALUE_PTR_INIT(&fields[82]),
-  UPB_TABVALUE_PTR_INIT(&fields[106]),
-  UPB_TABVALUE_PTR_INIT(&fields[93]),
+  UPB_TABVALUE_PTR_INIT(&fields[70]),
+  UPB_TABVALUE_PTR_INIT(&fields[4]),
+  UPB_TABVALUE_PTR_INIT(&fields[51]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[26]),
+  UPB_TABVALUE_PTR_INIT(&fields[3]),
+  UPB_TABVALUE_PTR_INIT(&fields[58]),
+  UPB_TABVALUE_PTR_INIT(&fields[6]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[35]),
+  UPB_TABVALUE_PTR_INIT(&fields[28]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[11]),
+  UPB_TABVALUE_PTR_INIT(&fields[79]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
@@ -7886,83 +5434,134 @@
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[34]),
-  UPB_TABVALUE_PTR_INIT(&fields[67]),
-  UPB_TABVALUE_PTR_INIT(&fields[33]),
-  UPB_TABVALUE_PTR_INIT(&fields[27]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[3]),
+  UPB_TABVALUE_PTR_INIT(&fields[57]),
+  UPB_TABVALUE_PTR_INIT(&fields[5]),
   UPB_TABVALUE_PTR_INIT(&fields[32]),
-  UPB_TABVALUE_PTR_INIT(&fields[83]),
+  UPB_TABVALUE_PTR_INIT(&fields[10]),
+  UPB_TABVALUE_PTR_INIT(&fields[63]),
+  UPB_TABVALUE_PTR_INIT(&fields[13]),
+  UPB_TABVALUE_PTR_INIT(&fields[53]),
+  UPB_TABVALUE_PTR_INIT(&fields[64]),
+  UPB_TABVALUE_PTR_INIT(&fields[61]),
+  UPB_TABVALUE_PTR_INIT(&fields[80]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[31]),
+  UPB_TABVALUE_PTR_INIT(&fields[17]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[12]),
+  UPB_TABVALUE_PTR_INIT(&fields[26]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[36]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[25]),
+  UPB_TABVALUE_PTR_INIT(&fields[48]),
+  UPB_TABVALUE_PTR_INIT(&fields[24]),
+  UPB_TABVALUE_PTR_INIT(&fields[18]),
+  UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[2]),
+  UPB_TABVALUE_PTR_INIT(&fields[23]),
+  UPB_TABVALUE_PTR_INIT(&fields[62]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[22]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[64]),
-  UPB_TABVALUE_PTR_INIT(&fields[5]),
-  UPB_TABVALUE_PTR_INIT(&fields[37]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[79]),
-  UPB_TABVALUE_PTR_INIT(&fields[80]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[46]),
-  UPB_TABVALUE_PTR_INIT(&fields[61]),
-  UPB_TABVALUE_PTR_INIT(&fields[11]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[31]),
   UPB_TABVALUE_PTR_INIT(&fields[45]),
   UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[39]),
+  UPB_TABVALUE_PTR_INIT(&fields[20]),
+  UPB_TABVALUE_PTR_INIT(&fields[56]),
   UPB_TABVALUE_PTR_INIT(&fields[55]),
-  UPB_TABVALUE_PTR_INIT(&fields[29]),
-  UPB_TABVALUE_PTR_INIT(&fields[75]),
-  UPB_TABVALUE_PTR_INIT(&fields[71]),
-  UPB_TABVALUE_PTR_INIT(&fields[4]),
-  UPB_TABVALUE_PTR_INIT(&fields[86]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[35]),
+  UPB_TABVALUE_PTR_INIT(&fields[33]),
   UPB_TABVALUE_PTR_INIT(&fields[54]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[53]),
-  UPB_TABVALUE_PTR_INIT(&fields[48]),
-  UPB_TABVALUE_PTR_INIT(&fields[72]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[44]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[78]),
-  UPB_TABVALUE_PTR_INIT(&fields[89]),
-  UPB_TABVALUE_PTR_INIT(&fields[42]),
-  UPB_TABVALUE_PTR_INIT(&fields[94]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[43]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[49]),
-  UPB_TABVALUE_PTR_INIT(&fields[28]),
-  UPB_TABVALUE_PTR_INIT(&fields[81]),
+  UPB_TABVALUE_PTR_INIT(&fields[30]),
+  UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[59]),
-  UPB_TABVALUE_PTR_INIT(&fields[16]),
-  UPB_TABVALUE_PTR_INIT(&fields[92]),
+  UPB_TABVALUE_PTR_INIT(&fields[65]),
+  UPB_TABVALUE_PTR_INIT(&fields[29]),
+  UPB_TABVALUE_PTR_INIT(&fields[68]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[36]),
+  UPB_TABVALUE_PTR_INIT(&fields[19]),
+  UPB_TABVALUE_PTR_INIT(&fields[60]),
+  UPB_TABVALUE_PTR_INIT(&fields[43]),
+  UPB_TABVALUE_PTR_INIT(&fields[7]),
+  UPB_TABVALUE_PTR_INIT(&fields[67]),
   UPB_TABVALUE_PTR_INIT(&fields[0]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[58]),
-  UPB_TABVALUE_PTR_INIT(&fields[30]),
+  UPB_TABVALUE_PTR_INIT(&fields[42]),
+  UPB_TABVALUE_PTR_INIT(&fields[21]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT("LABEL_OPTIONAL"),
   UPB_TABVALUE_PTR_INIT("LABEL_REQUIRED"),
@@ -7989,73 +5588,21 @@
   UPB_TABVALUE_PTR_INIT("STRING"),
   UPB_TABVALUE_PTR_INIT("CORD"),
   UPB_TABVALUE_PTR_INIT("STRING_PIECE"),
-  UPB_TABVALUE_PTR_INIT("JS_NORMAL"),
-  UPB_TABVALUE_PTR_INIT("JS_STRING"),
-  UPB_TABVALUE_PTR_INIT("JS_NUMBER"),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT("SPEED"),
   UPB_TABVALUE_PTR_INIT("CODE_SIZE"),
   UPB_TABVALUE_PTR_INIT("LITE_RUNTIME"),
 };
 
+static const upb_symtab symtab = UPB_SYMTAB_INIT(UPB_STRTABLE_INIT(24, 31, UPB_CTYPE_PTR, 5, &strentries[204]), &reftables[210], &reftables[211]);
+
+const upb_symtab *upbdefs_google_protobuf_descriptor(const void *owner) {
+  upb_symtab_ref(&symtab, owner);
+  return &symtab;
+}
+
 #ifdef UPB_DEBUG_REFS
-static upb_inttable reftables[268] = {
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
+static upb_inttable reftables[212] = {
   UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
   UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
   UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
@@ -8271,45 +5818,6 @@
 };
 #endif
 
-static const upb_msgdef *refm(const upb_msgdef *m, const void *owner) {
-  upb_msgdef_ref(m, owner);
-  return m;
-}
-
-static const upb_enumdef *refe(const upb_enumdef *e, const void *owner) {
-  upb_enumdef_ref(e, owner);
-  return e;
-}
-
-/* Public API. */
-const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_get(const void *owner) { return refm(&msgs[0], owner); }
-const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_get(const void *owner) { return refm(&msgs[1], owner); }
-const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_get(const void *owner) { return refm(&msgs[2], owner); }
-const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto_get(const void *owner) { return refm(&msgs[3], owner); }
-const upb_msgdef *upbdefs_google_protobuf_EnumOptions_get(const void *owner) { return refm(&msgs[4], owner); }
-const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto_get(const void *owner) { return refm(&msgs[5], owner); }
-const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions_get(const void *owner) { return refm(&msgs[6], owner); }
-const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto_get(const void *owner) { return refm(&msgs[7], owner); }
-const upb_msgdef *upbdefs_google_protobuf_FieldOptions_get(const void *owner) { return refm(&msgs[8], owner); }
-const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto_get(const void *owner) { return refm(&msgs[9], owner); }
-const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet_get(const void *owner) { return refm(&msgs[10], owner); }
-const upb_msgdef *upbdefs_google_protobuf_FileOptions_get(const void *owner) { return refm(&msgs[11], owner); }
-const upb_msgdef *upbdefs_google_protobuf_MessageOptions_get(const void *owner) { return refm(&msgs[12], owner); }
-const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto_get(const void *owner) { return refm(&msgs[13], owner); }
-const upb_msgdef *upbdefs_google_protobuf_MethodOptions_get(const void *owner) { return refm(&msgs[14], owner); }
-const upb_msgdef *upbdefs_google_protobuf_OneofDescriptorProto_get(const void *owner) { return refm(&msgs[15], owner); }
-const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto_get(const void *owner) { return refm(&msgs[16], owner); }
-const upb_msgdef *upbdefs_google_protobuf_ServiceOptions_get(const void *owner) { return refm(&msgs[17], owner); }
-const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_get(const void *owner) { return refm(&msgs[18], owner); }
-const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location_get(const void *owner) { return refm(&msgs[19], owner); }
-const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_get(const void *owner) { return refm(&msgs[20], owner); }
-const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePart_get(const void *owner) { return refm(&msgs[21], owner); }
-
-const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label_get(const void *owner) { return refe(&enums[0], owner); }
-const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type_get(const void *owner) { return refe(&enums[1], owner); }
-const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType_get(const void *owner) { return refe(&enums[2], owner); }
-const upb_enumdef *upbdefs_google_protobuf_FieldOptions_JSType_get(const void *owner) { return refe(&enums[3], owner); }
-const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode_get(const void *owner) { return refe(&enums[4], owner); }
 /*
 ** XXX: The routines in this file that consume a string do not currently
 ** support having the string span buffers.  In the future, as upb_sink and
@@ -8323,10 +5831,14 @@
 #include <stdlib.h>
 #include <string.h>
 
-/* Compares a NULL-terminated string with a non-NULL-terminated string. */
-static bool upb_streq(const char *str, const char *buf, size_t n) {
-  return strlen(str) == n && memcmp(str, buf, n) == 0;
-}
+/* upb_deflist is an internal-only dynamic array for storing a growing list of
+ * upb_defs. */
+typedef struct {
+  upb_def **defs;
+  size_t len;
+  size_t size;
+  bool owned;
+} upb_deflist;
 
 /* We keep a stack of all the messages scopes we are currently in, as well as
  * the top-level file scope.  This is necessary to correctly qualify the
@@ -8337,8 +5849,6 @@
   /* Index of the first def that is under this scope.  For msgdefs, the
    * msgdef itself is at start-1. */
   int start;
-  uint32_t oneof_start;
-  uint32_t oneof_index;
 } upb_descreader_frame;
 
 /* The maximum number of nested declarations that are allowed, ie.
@@ -8355,12 +5865,9 @@
 
 struct upb_descreader {
   upb_sink sink;
-  upb_inttable files;
-  upb_strtable files_by_name;
-  upb_filedef *file;  /* The last file in files. */
+  upb_deflist defs;
   upb_descreader_frame stack[UPB_MAX_MESSAGE_NESTING];
   int stack_len;
-  upb_inttable oneofs;
 
   uint32_t number;
   char *name;
@@ -8372,8 +5879,8 @@
   upb_fielddef *f;
 };
 
-static char *upb_gstrndup(const char *buf, size_t n) {
-  char *ret = upb_gmalloc(n + 1);
+static char *upb_strndup(const char *buf, size_t n) {
+  char *ret = malloc(n + 1);
   if (!ret) return NULL;
   memcpy(ret, buf, n);
   ret[n] = '\0';
@@ -8387,12 +5894,9 @@
  * Caller owns a ref on the returned string. */
 static char *upb_join(const char *base, const char *name) {
   if (!base || strlen(base) == 0) {
-    return upb_gstrdup(name);
+    return upb_strdup(name);
   } else {
-    char *ret = upb_gmalloc(strlen(base) + strlen(name) + 2);
-    if (!ret) {
-      return NULL;
-    }
+    char *ret = malloc(strlen(base) + strlen(name) + 2);
     ret[0] = '\0';
     strcat(ret, base);
     strcat(ret, ".");
@@ -8401,256 +5905,121 @@
   }
 }
 
-/* Qualify the defname for all defs starting with offset "start" with "str". */
-static bool upb_descreader_qualify(upb_filedef *f, char *str, int32_t start) {
+
+/* upb_deflist ****************************************************************/
+
+void upb_deflist_init(upb_deflist *l) {
+  l->size = 0;
+  l->defs = NULL;
+  l->len = 0;
+  l->owned = true;
+}
+
+void upb_deflist_uninit(upb_deflist *l) {
   size_t i;
-  for (i = start; i < upb_filedef_defcount(f); i++) {
-    upb_def *def = upb_filedef_mutabledef(f, i);
-    char *name = upb_join(str, upb_def_fullname(def));
-    if (!name) {
-      /* Need better logic here; at this point we've qualified some names but
-       * not others. */
-      return false;
-    }
-    upb_def_setfullname(def, name, NULL);
-    upb_gfree(name);
+  if (l->owned)
+    for(i = 0; i < l->len; i++)
+      upb_def_unref(l->defs[i], l);
+  free(l->defs);
+}
+
+bool upb_deflist_push(upb_deflist *l, upb_def *d) {
+  if(++l->len >= l->size) {
+    size_t new_size = UPB_MAX(l->size, 4);
+    new_size *= 2;
+    l->defs = realloc(l->defs, new_size * sizeof(void *));
+    if (!l->defs) return false;
+    l->size = new_size;
   }
+  l->defs[l->len - 1] = d;
   return true;
 }
 
+void upb_deflist_donaterefs(upb_deflist *l, void *owner) {
+  size_t i;
+  assert(l->owned);
+  for (i = 0; i < l->len; i++)
+    upb_def_donateref(l->defs[i], l, owner);
+  l->owned = false;
+}
+
+static upb_def *upb_deflist_last(upb_deflist *l) {
+  return l->defs[l->len-1];
+}
+
+/* Qualify the defname for all defs starting with offset "start" with "str". */
+static void upb_deflist_qualify(upb_deflist *l, char *str, int32_t start) {
+  uint32_t i;
+  for (i = start; i < l->len; i++) {
+    upb_def *def = l->defs[i];
+    char *name = upb_join(str, upb_def_fullname(def));
+    upb_def_setfullname(def, name, NULL);
+    free(name);
+  }
+}
+
 
 /* upb_descreader  ************************************************************/
 
 static upb_msgdef *upb_descreader_top(upb_descreader *r) {
   int index;
-  UPB_ASSERT(r->stack_len > 1);
+  assert(r->stack_len > 1);
   index = r->stack[r->stack_len-1].start - 1;
-  UPB_ASSERT(index >= 0);
-  return upb_downcast_msgdef_mutable(upb_filedef_mutabledef(r->file, index));
+  assert(index >= 0);
+  return upb_downcast_msgdef_mutable(r->defs.defs[index]);
 }
 
 static upb_def *upb_descreader_last(upb_descreader *r) {
-  return upb_filedef_mutabledef(r->file, upb_filedef_defcount(r->file) - 1);
+  return upb_deflist_last(&r->defs);
 }
 
 /* Start/end handlers for FileDescriptorProto and DescriptorProto (the two
  * entities that have names and can contain sub-definitions. */
 void upb_descreader_startcontainer(upb_descreader *r) {
   upb_descreader_frame *f = &r->stack[r->stack_len++];
-  f->start = upb_filedef_defcount(r->file);
-  f->oneof_start = upb_inttable_count(&r->oneofs);
-  f->oneof_index = 0;
+  f->start = r->defs.len;
   f->name = NULL;
 }
 
-bool upb_descreader_endcontainer(upb_descreader *r) {
-  upb_descreader_frame *f = &r->stack[r->stack_len - 1];
-
-  while (upb_inttable_count(&r->oneofs) > f->oneof_start) {
-    upb_oneofdef *o = upb_value_getptr(upb_inttable_pop(&r->oneofs));
-    bool ok = upb_msgdef_addoneof(upb_descreader_top(r), o, &r->oneofs, NULL);
-    UPB_ASSERT(ok);
-  }
-
-  if (!upb_descreader_qualify(r->file, f->name, f->start)) {
-    return false;
-  }
-  upb_gfree(f->name);
+void upb_descreader_endcontainer(upb_descreader *r) {
+  upb_descreader_frame *f = &r->stack[--r->stack_len];
+  upb_deflist_qualify(&r->defs, f->name, f->start);
+  free(f->name);
   f->name = NULL;
-
-  r->stack_len--;
-  return true;
 }
 
 void upb_descreader_setscopename(upb_descreader *r, char *str) {
   upb_descreader_frame *f = &r->stack[r->stack_len-1];
-  upb_gfree(f->name);
+  free(f->name);
   f->name = str;
 }
 
-static upb_oneofdef *upb_descreader_getoneof(upb_descreader *r,
-                                             uint32_t index) {
-  bool found;
-  upb_value val;
-  upb_descreader_frame *f = &r->stack[r->stack_len-1];
-
-  /* DescriptorProto messages can be nested, so we will see the nested messages
-   * between when we see the FieldDescriptorProto and the OneofDescriptorProto.
-   * We need to preserve the oneofs in between these two things. */
-  index += f->oneof_start;
-
-  while (upb_inttable_count(&r->oneofs) <= index) {
-    upb_inttable_push(&r->oneofs, upb_value_ptr(upb_oneofdef_new(&r->oneofs)));
-  }
-
-  found = upb_inttable_lookup(&r->oneofs, index, &val);
-  UPB_ASSERT(found);
-  return upb_value_getptr(val);
-}
-
-/** Handlers for google.protobuf.FileDescriptorSet. ***************************/
-
-static void *fileset_startfile(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  UPB_UNUSED(hd);
-  r->file = upb_filedef_new(&r->files);
-  upb_inttable_push(&r->files, upb_value_ptr(r->file));
-  return r;
-}
-
-/** Handlers for google.protobuf.FileDescriptorProto. *************************/
-
-static bool file_start(void *closure, const void *hd) {
-  upb_descreader *r = closure;
+/* Handlers for google.protobuf.FileDescriptorProto. */
+static bool file_startmsg(void *r, const void *hd) {
   UPB_UNUSED(hd);
   upb_descreader_startcontainer(r);
   return true;
 }
 
-static bool file_end(void *closure, const void *hd, upb_status *status) {
+static bool file_endmsg(void *closure, const void *hd, upb_status *status) {
   upb_descreader *r = closure;
   UPB_UNUSED(hd);
   UPB_UNUSED(status);
-  return upb_descreader_endcontainer(r);
-}
-
-static size_t file_onname(void *closure, const void *hd, const char *buf,
-                          size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  char *name;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  name = upb_gstrndup(buf, n);
-  upb_strtable_insert(&r->files_by_name, name, upb_value_ptr(r->file));
-  /* XXX: see comment at the top of the file. */
-  ok = upb_filedef_setname(r->file, name, NULL);
-  upb_gfree(name);
-  UPB_ASSERT(ok);
-  return n;
+  upb_descreader_endcontainer(r);
+  return true;
 }
 
 static size_t file_onpackage(void *closure, const void *hd, const char *buf,
                              size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *package;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  package = upb_gstrndup(buf, n);
-  /* XXX: see comment at the top of the file. */
-  upb_descreader_setscopename(r, package);
-  ok = upb_filedef_setpackage(r->file, package, NULL);
-  UPB_ASSERT(ok);
-  return n;
-}
-
-static void *file_startphpnamespace(void *closure, const void *hd,
-                                    size_t size_hint) {
-  upb_descreader *r = closure;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(size_hint);
-
-  ok = upb_filedef_setphpnamespace(r->file, "", NULL);
-  UPB_ASSERT(ok);
-  return closure;
-}
-
-static size_t file_onphpnamespace(void *closure, const void *hd,
-                                  const char *buf, size_t n,
-                                  const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  char *php_namespace;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  php_namespace = upb_gstrndup(buf, n);
-  ok = upb_filedef_setphpnamespace(r->file, php_namespace, NULL);
-  upb_gfree(php_namespace);
-  UPB_ASSERT(ok);
-  return n;
-}
-
-static size_t file_onphpprefix(void *closure, const void *hd, const char *buf,
-                             size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  char *prefix;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  prefix = upb_gstrndup(buf, n);
-  ok = upb_filedef_setphpprefix(r->file, prefix, NULL);
-  upb_gfree(prefix);
-  UPB_ASSERT(ok);
-  return n;
-}
-
-static size_t file_onsyntax(void *closure, const void *hd, const char *buf,
-                            size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  bool ok;
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
   /* XXX: see comment at the top of the file. */
-  if (upb_streq("proto2", buf, n)) {
-    ok = upb_filedef_setsyntax(r->file, UPB_SYNTAX_PROTO2, NULL);
-  } else if (upb_streq("proto3", buf, n)) {
-    ok = upb_filedef_setsyntax(r->file, UPB_SYNTAX_PROTO3, NULL);
-  } else {
-    ok = false;
-  }
-
-  UPB_ASSERT(ok);
+  upb_descreader_setscopename(r, upb_strndup(buf, n));
   return n;
 }
 
-static void *file_startmsg(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  upb_msgdef *m = upb_msgdef_new(&m);
-  bool ok = upb_filedef_addmsg(r->file, m, &m, NULL);
-  UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
-  return r;
-}
-
-static void *file_startenum(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  upb_enumdef *e = upb_enumdef_new(&e);
-  bool ok = upb_filedef_addenum(r->file, e, &e, NULL);
-  UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
-  return r;
-}
-
-static void *file_startext(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  bool ok;
-  r->f = upb_fielddef_new(r);
-  ok = upb_filedef_addext(r->file, r->f, r, NULL);
-  UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
-  return r;
-}
-
-static size_t file_ondep(void *closure, const void *hd, const char *buf,
-                         size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  upb_value val;
-  if (upb_strtable_lookup2(&r->files_by_name, buf, n, &val)) {
-    upb_filedef_adddep(r->file, upb_value_getptr(val));
-  }
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-  return n;
-}
-
-/** Handlers for google.protobuf.EnumValueDescriptorProto. *********************/
-
+/* Handlers for google.protobuf.EnumValueDescriptorProto. */
 static bool enumval_startmsg(void *closure, const void *hd) {
   upb_descreader *r = closure;
   UPB_UNUSED(hd);
@@ -8665,8 +6034,8 @@
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
   /* XXX: see comment at the top of the file. */
-  upb_gfree(r->name);
-  r->name = upb_gstrndup(buf, n);
+  free(r->name);
+  r->name = upb_strndup(buf, n);
   r->saw_name = true;
   return n;
 }
@@ -8690,12 +6059,20 @@
   }
   e = upb_downcast_enumdef_mutable(upb_descreader_last(r));
   upb_enumdef_addval(e, r->name, r->number, status);
-  upb_gfree(r->name);
+  free(r->name);
   r->name = NULL;
   return true;
 }
 
-/** Handlers for google.protobuf.EnumDescriptorProto. *************************/
+
+/* Handlers for google.protobuf.EnumDescriptorProto. */
+static bool enum_startmsg(void *closure, const void *hd) {
+  upb_descreader *r = closure;
+  UPB_UNUSED(hd);
+  upb_deflist_push(&r->defs,
+                   upb_enumdef_upcast_mutable(upb_enumdef_new(&r->defs)));
+  return true;
+}
 
 static bool enum_endmsg(void *closure, const void *hd, upb_status *status) {
   upb_descreader *r = closure;
@@ -8717,22 +6094,21 @@
 static size_t enum_onname(void *closure, const void *hd, const char *buf,
                           size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *fullname = upb_gstrndup(buf, n);
+  char *fullname = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
   /* XXX: see comment at the top of the file. */
   upb_def_setfullname(upb_descreader_last(r), fullname, NULL);
-  upb_gfree(fullname);
+  free(fullname);
   return n;
 }
 
-/** Handlers for google.protobuf.FieldDescriptorProto *************************/
-
+/* Handlers for google.protobuf.FieldDescriptorProto */
 static bool field_startmsg(void *closure, const void *hd) {
   upb_descreader *r = closure;
   UPB_UNUSED(hd);
-  UPB_ASSERT(r->f);
-  upb_gfree(r->default_string);
+  r->f = upb_fielddef_new(&r->defs);
+  free(r->default_string);
   r->default_string = NULL;
 
   /* fielddefs default to packed, but descriptors default to non-packed. */
@@ -8817,9 +6193,9 @@
   UPB_UNUSED(hd);
 
   /* TODO: verify that all required fields were present. */
-  UPB_ASSERT(upb_fielddef_number(f) != 0);
-  UPB_ASSERT(upb_fielddef_name(f) != NULL);
-  UPB_ASSERT((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f));
+  assert(upb_fielddef_number(f) != 0);
+  assert(upb_fielddef_name(f) != NULL);
+  assert((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f));
 
   if (r->default_string) {
     if (upb_fielddef_issubmsg(f)) {
@@ -8874,50 +6250,49 @@
 
 static bool field_onnumber(void *closure, const void *hd, int32_t val) {
   upb_descreader *r = closure;
-  bool ok;
+  bool ok = upb_fielddef_setnumber(r->f, val, NULL);
   UPB_UNUSED(hd);
 
-  ok = upb_fielddef_setnumber(r->f, val, NULL);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return true;
 }
 
 static size_t field_onname(void *closure, const void *hd, const char *buf,
                            size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
   /* XXX: see comment at the top of the file. */
   upb_fielddef_setname(r->f, name, NULL);
-  upb_gfree(name);
+  free(name);
   return n;
 }
 
 static size_t field_ontypename(void *closure, const void *hd, const char *buf,
                                size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
   /* XXX: see comment at the top of the file. */
   upb_fielddef_setsubdefname(r->f, name, NULL);
-  upb_gfree(name);
+  free(name);
   return n;
 }
 
 static size_t field_onextendee(void *closure, const void *hd, const char *buf,
                                size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
   /* XXX: see comment at the top of the file. */
   upb_fielddef_setcontainingtypename(r->f, name, NULL);
-  upb_gfree(name);
+  free(name);
   return n;
 }
 
@@ -8930,49 +6305,23 @@
   /* Have to convert from string to the correct type, but we might not know the
    * type yet, so we save it as a string until the end of the field.
    * XXX: see comment at the top of the file. */
-  upb_gfree(r->default_string);
-  r->default_string = upb_gstrndup(buf, n);
+  free(r->default_string);
+  r->default_string = upb_strndup(buf, n);
   return n;
 }
 
-static bool field_ononeofindex(void *closure, const void *hd, int32_t index) {
-  upb_descreader *r = closure;
-  upb_oneofdef *o = upb_descreader_getoneof(r, index);
-  bool ok = upb_oneofdef_addfield(o, r->f, &r->f, NULL);
-  UPB_UNUSED(hd);
-
-  UPB_ASSERT(ok);
-  return true;
-}
-
-/** Handlers for google.protobuf.OneofDescriptorProto. ************************/
-
-static size_t oneof_name(void *closure, const void *hd, const char *buf,
-                         size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  upb_descreader_frame *f = &r->stack[r->stack_len-1];
-  upb_oneofdef *o = upb_descreader_getoneof(r, f->oneof_index++);
-  char *name_null_terminated = upb_gstrndup(buf, n);
-  bool ok = upb_oneofdef_setname(o, name_null_terminated, NULL);
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  UPB_ASSERT(ok);
-  free(name_null_terminated);
-  return n;
-}
-
-/** Handlers for google.protobuf.DescriptorProto ******************************/
-
-static bool msg_start(void *closure, const void *hd) {
+/* Handlers for google.protobuf.DescriptorProto (representing a message). */
+static bool msg_startmsg(void *closure, const void *hd) {
   upb_descreader *r = closure;
   UPB_UNUSED(hd);
 
+  upb_deflist_push(&r->defs,
+                   upb_msgdef_upcast_mutable(upb_msgdef_new(&r->defs)));
   upb_descreader_startcontainer(r);
   return true;
 }
 
-static bool msg_end(void *closure, const void *hd, upb_status *status) {
+static bool msg_endmsg(void *closure, const void *hd, upb_status *status) {
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
   UPB_UNUSED(hd);
@@ -8981,15 +6330,16 @@
     upb_status_seterrmsg(status, "Encountered message with no name.");
     return false;
   }
-  return upb_descreader_endcontainer(r);
+  upb_descreader_endcontainer(r);
+  return true;
 }
 
-static size_t msg_name(void *closure, const void *hd, const char *buf,
-                       size_t n, const upb_bufhandle *handle) {
+static size_t msg_onname(void *closure, const void *hd, const char *buf,
+                         size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
   /* XXX: see comment at the top of the file. */
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
@@ -8998,168 +6348,91 @@
   return n;
 }
 
-static void *msg_startmsg(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  upb_msgdef *m = upb_msgdef_new(&m);
-  bool ok = upb_filedef_addmsg(r->file, m, &m, NULL);
-  UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
-  return r;
-}
-
-static void *msg_startext(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  upb_fielddef *f = upb_fielddef_new(&f);
-  bool ok = upb_filedef_addext(r->file, f, &f, NULL);
-  UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
-  return r;
-}
-
-static void *msg_startfield(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  r->f = upb_fielddef_new(&r->f);
-  /* We can't add the new field to the message until its name/number are
-   * filled in. */
-  UPB_UNUSED(hd);
-  return r;
-}
-
-static bool msg_endfield(void *closure, const void *hd) {
-  upb_descreader *r = closure;
-  upb_msgdef *m = upb_descreader_top(r);
-  bool ok;
-  UPB_UNUSED(hd);
-
-  /* Oneof fields are added to the msgdef through their oneof, so don't need to
-   * be added here. */
-  if (upb_fielddef_containingoneof(r->f) == NULL) {
-    ok = upb_msgdef_addfield(m, r->f, &r->f, NULL);
-    UPB_ASSERT(ok);
-  }
-  r->f = NULL;
-  return true;
-}
-
-static bool msg_onmapentry(void *closure, const void *hd, bool mapentry) {
+static bool msg_onendfield(void *closure, const void *hd) {
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
   UPB_UNUSED(hd);
 
-  upb_msgdef_setmapentry(m, mapentry);
+  upb_msgdef_addfield(m, r->f, &r->defs, NULL);
   r->f = NULL;
   return true;
 }
 
+static bool pushextension(void *closure, const void *hd) {
+  upb_descreader *r = closure;
+  UPB_UNUSED(hd);
 
+  assert(upb_fielddef_containingtypename(r->f));
+  upb_fielddef_setisextension(r->f, true);
+  upb_deflist_push(&r->defs, upb_fielddef_upcast_mutable(r->f));
+  r->f = NULL;
+  return true;
+}
 
-/** Code to register handlers *************************************************/
-
-#define F(msg, field) upbdefs_google_protobuf_ ## msg ## _f_ ## field(m)
+#define D(name) upbdefs_google_protobuf_ ## name(s)
 
 static void reghandlers(const void *closure, upb_handlers *h) {
+  const upb_symtab *s = closure;
   const upb_msgdef *m = upb_handlers_msgdef(h);
-  UPB_UNUSED(closure);
 
-  if (upbdefs_google_protobuf_FileDescriptorSet_is(m)) {
-    upb_handlers_setstartsubmsg(h, F(FileDescriptorSet, file),
-                                &fileset_startfile, NULL);
-  } else if (upbdefs_google_protobuf_DescriptorProto_is(m)) {
-    upb_handlers_setstartmsg(h, &msg_start, NULL);
-    upb_handlers_setendmsg(h, &msg_end, NULL);
-    upb_handlers_setstring(h, F(DescriptorProto, name), &msg_name, NULL);
-    upb_handlers_setstartsubmsg(h, F(DescriptorProto, extension), &msg_startext,
-                                NULL);
-    upb_handlers_setstartsubmsg(h, F(DescriptorProto, nested_type),
-                                &msg_startmsg, NULL);
-    upb_handlers_setstartsubmsg(h, F(DescriptorProto, field),
-                                &msg_startfield, NULL);
-    upb_handlers_setendsubmsg(h, F(DescriptorProto, field),
-                              &msg_endfield, NULL);
-    upb_handlers_setstartsubmsg(h, F(DescriptorProto, enum_type),
-                                &file_startenum, NULL);
-  } else if (upbdefs_google_protobuf_FileDescriptorProto_is(m)) {
-    upb_handlers_setstartmsg(h, &file_start, NULL);
-    upb_handlers_setendmsg(h, &file_end, NULL);
-    upb_handlers_setstring(h, F(FileDescriptorProto, name), &file_onname,
+  if (m == D(DescriptorProto)) {
+    upb_handlers_setstartmsg(h, &msg_startmsg, NULL);
+    upb_handlers_setendmsg(h, &msg_endmsg, NULL);
+    upb_handlers_setstring(h, D(DescriptorProto_name), &msg_onname, NULL);
+    upb_handlers_setendsubmsg(h, D(DescriptorProto_field), &msg_onendfield,
+                              NULL);
+    upb_handlers_setendsubmsg(h, D(DescriptorProto_extension), &pushextension,
+                              NULL);
+  } else if (m == D(FileDescriptorProto)) {
+    upb_handlers_setstartmsg(h, &file_startmsg, NULL);
+    upb_handlers_setendmsg(h, &file_endmsg, NULL);
+    upb_handlers_setstring(h, D(FileDescriptorProto_package), &file_onpackage,
                            NULL);
-    upb_handlers_setstring(h, F(FileDescriptorProto, package), &file_onpackage,
-                           NULL);
-    upb_handlers_setstring(h, F(FileDescriptorProto, syntax), &file_onsyntax,
-                           NULL);
-    upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, message_type),
-                                &file_startmsg, NULL);
-    upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, enum_type),
-                                &file_startenum, NULL);
-    upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, extension),
-                                &file_startext, NULL);
-    upb_handlers_setstring(h, F(FileDescriptorProto, dependency),
-                           &file_ondep, NULL);
-  } else if (upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)) {
+    upb_handlers_setendsubmsg(h, D(FileDescriptorProto_extension), &pushextension,
+                              NULL);
+  } else if (m == D(EnumValueDescriptorProto)) {
     upb_handlers_setstartmsg(h, &enumval_startmsg, NULL);
     upb_handlers_setendmsg(h, &enumval_endmsg, NULL);
-    upb_handlers_setstring(h, F(EnumValueDescriptorProto, name), &enumval_onname, NULL);
-    upb_handlers_setint32(h, F(EnumValueDescriptorProto, number), &enumval_onnumber,
+    upb_handlers_setstring(h, D(EnumValueDescriptorProto_name), &enumval_onname, NULL);
+    upb_handlers_setint32(h, D(EnumValueDescriptorProto_number), &enumval_onnumber,
                           NULL);
-  } else if (upbdefs_google_protobuf_EnumDescriptorProto_is(m)) {
+  } else if (m == D(EnumDescriptorProto)) {
+    upb_handlers_setstartmsg(h, &enum_startmsg, NULL);
     upb_handlers_setendmsg(h, &enum_endmsg, NULL);
-    upb_handlers_setstring(h, F(EnumDescriptorProto, name), &enum_onname, NULL);
-  } else if (upbdefs_google_protobuf_FieldDescriptorProto_is(m)) {
+    upb_handlers_setstring(h, D(EnumDescriptorProto_name), &enum_onname, NULL);
+  } else if (m == D(FieldDescriptorProto)) {
     upb_handlers_setstartmsg(h, &field_startmsg, NULL);
     upb_handlers_setendmsg(h, &field_endmsg, NULL);
-    upb_handlers_setint32(h, F(FieldDescriptorProto, type), &field_ontype,
+    upb_handlers_setint32(h, D(FieldDescriptorProto_type), &field_ontype,
                           NULL);
-    upb_handlers_setint32(h, F(FieldDescriptorProto, label), &field_onlabel,
+    upb_handlers_setint32(h, D(FieldDescriptorProto_label), &field_onlabel,
                           NULL);
-    upb_handlers_setint32(h, F(FieldDescriptorProto, number), &field_onnumber,
+    upb_handlers_setint32(h, D(FieldDescriptorProto_number), &field_onnumber,
                           NULL);
-    upb_handlers_setstring(h, F(FieldDescriptorProto, name), &field_onname,
+    upb_handlers_setstring(h, D(FieldDescriptorProto_name), &field_onname,
                            NULL);
-    upb_handlers_setstring(h, F(FieldDescriptorProto, type_name),
+    upb_handlers_setstring(h, D(FieldDescriptorProto_type_name),
                            &field_ontypename, NULL);
-    upb_handlers_setstring(h, F(FieldDescriptorProto, extendee),
+    upb_handlers_setstring(h, D(FieldDescriptorProto_extendee),
                            &field_onextendee, NULL);
-    upb_handlers_setstring(h, F(FieldDescriptorProto, default_value),
+    upb_handlers_setstring(h, D(FieldDescriptorProto_default_value),
                            &field_ondefaultval, NULL);
-    upb_handlers_setint32(h, F(FieldDescriptorProto, oneof_index),
-                          &field_ononeofindex, NULL);
-  } else if (upbdefs_google_protobuf_OneofDescriptorProto_is(m)) {
-    upb_handlers_setstring(h, F(OneofDescriptorProto, name), &oneof_name, NULL);
-  } else if (upbdefs_google_protobuf_FieldOptions_is(m)) {
-    upb_handlers_setbool(h, F(FieldOptions, lazy), &field_onlazy, NULL);
-    upb_handlers_setbool(h, F(FieldOptions, packed), &field_onpacked, NULL);
-  } else if (upbdefs_google_protobuf_MessageOptions_is(m)) {
-    upb_handlers_setbool(h, F(MessageOptions, map_entry), &msg_onmapentry, NULL);
-  } else if (upbdefs_google_protobuf_FileOptions_is(m)) {
-    upb_handlers_setstring(h, F(FileOptions, php_class_prefix),
-                           &file_onphpprefix, NULL);
-    upb_handlers_setstartstr(h, F(FileOptions, php_namespace),
-                             &file_startphpnamespace, NULL);
-    upb_handlers_setstring(h, F(FileOptions, php_namespace),
-                           &file_onphpnamespace, NULL);
+  } else if (m == D(FieldOptions)) {
+    upb_handlers_setbool(h, D(FieldOptions_lazy), &field_onlazy, NULL);
+    upb_handlers_setbool(h, D(FieldOptions_packed), &field_onpacked, NULL);
   }
-
-  UPB_ASSERT(upb_ok(upb_handlers_status(h)));
 }
 
-#undef F
+#undef D
 
 void descreader_cleanup(void *_r) {
   upb_descreader *r = _r;
-  size_t i;
-
-  for (i = 0; i < upb_descreader_filecount(r); i++) {
-    upb_filedef_unref(upb_descreader_file(r, i), &r->files);
-  }
-
-  upb_gfree(r->name);
-  upb_inttable_uninit(&r->files);
-  upb_strtable_uninit(&r->files_by_name);
-  upb_inttable_uninit(&r->oneofs);
-  upb_gfree(r->default_string);
+  free(r->name);
+  upb_deflist_uninit(&r->defs);
+  free(r->default_string);
   while (r->stack_len > 0) {
     upb_descreader_frame *f = &r->stack[--r->stack_len];
-    upb_gfree(f->name);
+    free(f->name);
   }
 }
 
@@ -9172,9 +6445,7 @@
     return NULL;
   }
 
-  upb_inttable_init(&r->files, UPB_CTYPE_PTR);
-  upb_strtable_init(&r->files_by_name, UPB_CTYPE_PTR);
-  upb_inttable_init(&r->oneofs, UPB_CTYPE_PTR);
+  upb_deflist_init(&r->defs);
   upb_sink_reset(upb_descreader_input(r), h, r);
   r->stack_len = 0;
   r->name = NULL;
@@ -9183,17 +6454,10 @@
   return r;
 }
 
-size_t upb_descreader_filecount(const upb_descreader *r) {
-  return upb_inttable_count(&r->files);
-}
-
-upb_filedef *upb_descreader_file(const upb_descreader *r, size_t i) {
-  upb_value v;
-  if (upb_inttable_lookup(&r->files, i, &v)) {
-    return upb_value_getptr(v);
-  } else {
-    return NULL;
-  }
+upb_def **upb_descreader_getdefs(upb_descreader *r, void *owner, int *n) {
+  *n = r->defs.len;
+  upb_deflist_donaterefs(&r->defs, owner);
+  return r->defs.defs;
 }
 
 upb_sink *upb_descreader_input(upb_descreader *r) {
@@ -9201,9 +6465,10 @@
 }
 
 const upb_handlers *upb_descreader_newhandlers(const void *owner) {
-  const upb_msgdef *m = upbdefs_google_protobuf_FileDescriptorSet_get(&m);
-  const upb_handlers *h = upb_handlers_newfrozen(m, owner, reghandlers, NULL);
-  upb_msgdef_unref(m, &m);
+  const upb_symtab *s = upbdefs_google_protobuf_descriptor(&s);
+  const upb_handlers *h = upb_handlers_newfrozen(
+      upbdefs_google_protobuf_FileDescriptorSet(s), owner, reghandlers, s);
+  upb_symtab_unref(s, &s);
   return h;
 }
 /*
@@ -9237,8 +6502,8 @@
 #ifdef UPB_USE_JIT_X64
   upb_pbdecoder_freejit(g);
 #endif
-  upb_gfree(g->bytecode);
-  upb_gfree(g);
+  free(g->bytecode);
+  free(g);
 }
 
 static void visitgroup(const upb_refcounted *r, upb_refcounted_visit *visit,
@@ -9253,7 +6518,7 @@
 }
 
 mgroup *newgroup(const void *owner) {
-  mgroup *g = upb_gmalloc(sizeof(*g));
+  mgroup *g = malloc(sizeof(*g));
   static const struct upb_refcounted_vtbl vtbl = {visitgroup, freegroup};
   upb_refcounted_init(mgroup_upcast_mutable(g), &vtbl, owner);
   upb_inttable_init(&g->methods, UPB_CTYPE_PTR);
@@ -9273,7 +6538,7 @@
   }
 
   upb_inttable_uninit(&method->dispatch);
-  upb_gfree(method);
+  free(method);
 }
 
 static void visitmethod(const upb_refcounted *r, upb_refcounted_visit *visit,
@@ -9285,7 +6550,7 @@
 static upb_pbdecodermethod *newmethod(const upb_handlers *dest_handlers,
                                       mgroup *group) {
   static const struct upb_refcounted_vtbl vtbl = {visitmethod, freemethod};
-  upb_pbdecodermethod *ret = upb_gmalloc(sizeof(*ret));
+  upb_pbdecodermethod *ret = malloc(sizeof(*ret));
   upb_refcounted_init(upb_pbdecodermethod_upcast_mutable(ret), &vtbl, &ret);
   upb_byteshandler_init(&ret->input_handler_);
 
@@ -9348,7 +6613,7 @@
 } compiler;
 
 static compiler *newcompiler(mgroup *group, bool lazy) {
-  compiler *ret = upb_gmalloc(sizeof(*ret));
+  compiler *ret = malloc(sizeof(*ret));
   int i;
 
   ret->group = group;
@@ -9361,7 +6626,7 @@
 }
 
 static void freecompiler(compiler *c) {
-  upb_gfree(c);
+  free(c);
 }
 
 const size_t ptr_words = sizeof(void*) / sizeof(uint32_t);
@@ -9389,7 +6654,7 @@
     case OP_TAGN:
       return false;
     default:
-      UPB_ASSERT(false);
+      assert(false);
       return false;
   }
 }
@@ -9408,7 +6673,7 @@
   } else {
     *instruction = (*instruction & ~0xff00) | ((ofs & 0xff) << 8);
   }
-  UPB_ASSERT(getofs(*instruction) == ofs);  /* Would fail in cases of overflow. */
+  assert(getofs(*instruction) == ofs);  /* Would fail in cases of overflow. */
 }
 
 static uint32_t pcofs(compiler *c) { return c->pc - c->group->bytecode; }
@@ -9420,7 +6685,7 @@
   int val;
   uint32_t *codep;
 
-  UPB_ASSERT(label < MAXLABEL);
+  assert(label < MAXLABEL);
   val = c->fwd_labels[label];
   codep = (val == EMPTYLABEL) ? NULL : c->group->bytecode + val;
   while (codep) {
@@ -9441,7 +6706,7 @@
  * The returned value is the offset that should be written into the instruction.
  */
 static int32_t labelref(compiler *c, int label) {
-  UPB_ASSERT(label < MAXLABEL);
+  assert(label < MAXLABEL);
   if (label == LABEL_DISPATCH) {
     /* No resolving required. */
     return 0;
@@ -9465,15 +6730,14 @@
     size_t oldsize = g->bytecode_end - g->bytecode;
     size_t newsize = UPB_MAX(oldsize * 2, 64);
     /* TODO(haberman): handle OOM. */
-    g->bytecode = upb_grealloc(g->bytecode, oldsize * sizeof(uint32_t),
-                                            newsize * sizeof(uint32_t));
+    g->bytecode = realloc(g->bytecode, newsize * sizeof(uint32_t));
     g->bytecode_end = g->bytecode + newsize;
     c->pc = g->bytecode + ofs;
   }
   *c->pc++ = v;
 }
 
-static void putop(compiler *c, int op, ...) {
+static void putop(compiler *c, opcode op, ...) {
   va_list ap;
   va_start(ap, op);
 
@@ -9541,7 +6805,7 @@
       int label = va_arg(ap, int);
       uint64_t tag = va_arg(ap, uint64_t);
       uint32_t instruction = op | (tag << 16);
-      UPB_ASSERT(tag <= 0xffff);
+      assert(tag <= 0xffff);
       setofs(&instruction, labelref(c, label));
       put32(c, instruction);
       break;
@@ -9678,7 +6942,7 @@
   uint32_t tag = (upb_fielddef_number(f) << 3) | wire_type;
   uint64_t encoded_tag = upb_vencode32(tag);
   /* No tag should be greater than 5 bytes. */
-  UPB_ASSERT(encoded_tag <= 0xffffffffff);
+  assert(encoded_tag <= 0xffffffffff);
   return encoded_tag;
 }
 
@@ -9701,7 +6965,7 @@
 static upb_selector_t getsel(const upb_fielddef *f, upb_handlertype_t type) {
   upb_selector_t selector;
   bool ok = upb_handlers_getselector(f, type, &selector);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return selector;
 }
 
@@ -9713,7 +6977,7 @@
   uint8_t wt1;
   uint8_t old_wt2;
   upb_pbdecoder_unpackdispatch(dispatch, &ofs, &wt1, &old_wt2);
-  UPB_ASSERT(old_wt2 == NO_WIRE_TYPE);  /* wt2 should not be set yet. */
+  assert(old_wt2 == NO_WIRE_TYPE);  /* wt2 should not be set yet. */
   return upb_pbdecoder_packdispatch(ofs, wt1, new_wt2);
 }
 
@@ -9803,12 +7067,7 @@
 
   if (!sub_m) {
     /* Don't emit any code for this field at all; it will be parsed as an
-     * unknown field.
-     *
-     * TODO(haberman): we should change this to parse it as a string field
-     * instead.  It will probably be faster, but more importantly, once we
-     * start vending unknown fields, a field shouldn't be treated as unknown
-     * just because it doesn't have subhandlers registered. */
+     * unknown field. */
     return;
   }
 
@@ -9915,7 +7174,7 @@
    * setting in the fielddef.  This will favor (in speed) whichever was
    * specified. */
 
-  UPB_ASSERT((int)parse_type >= 0 && parse_type <= OP_MAX);
+  assert((int)parse_type >= 0 && parse_type <= OP_MAX);
   sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
   wire_type = upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];
   if (upb_fielddef_isseq(f)) {
@@ -9957,7 +7216,7 @@
   upb_msg_field_iter i;
   upb_value val;
 
-  UPB_ASSERT(method);
+  assert(method);
 
   /* Clear all entries in the dispatch table. */
   upb_inttable_uninit(&method->dispatch);
@@ -10105,7 +7364,7 @@
   compiler *c;
 
   UPB_UNUSED(allowjit);
-  UPB_ASSERT(upb_handlers_isfrozen(dest));
+  assert(upb_handlers_isfrozen(dest));
 
   g = newgroup(owner);
   c = newcompiler(g, lazy);
@@ -10125,16 +7384,11 @@
 
 #ifdef UPB_DUMP_BYTECODE
   {
-    FILE *f = fopen("/tmp/upb-bytecode", "w");
-    UPB_ASSERT(f);
+    FILE *f = fopen("/tmp/upb-bytecode", "wb");
+    assert(f);
     dumpbc(g->bytecode, g->bytecode_end, stderr);
     dumpbc(g->bytecode, g->bytecode_end, f);
     fclose(f);
-
-    f = fopen("/tmp/upb-bytecode.bin", "wb");
-    UPB_ASSERT(f);
-    fwrite(g->bytecode, 1, g->bytecode_end - g->bytecode, f);
-    fclose(f);
   }
 #endif
 
@@ -10182,7 +7436,7 @@
   upb_inttable_push(&c->groups, upb_value_constptr(g));
 
   ok = upb_inttable_lookupptr(&g->methods, opts->handlers, &v);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return upb_value_getptr(v);
 }
 
@@ -10234,11 +7488,6 @@
 
 static opcode halt = OP_HALT;
 
-/* A dummy character we can point to when the user passes us a NULL buffer.
- * We need this because in C (NULL + 0) and (NULL - NULL) are undefined
- * behavior, which would invalidate functions like curbufleft(). */
-static const char dummy_char;
-
 /* Whether an op consumes any of the input buffer. */
 static bool consumes_input(opcode op) {
   switch (op) {
@@ -10315,7 +7564,7 @@
 /* How many bytes can be safely read from d->ptr without reading past end-of-buf
  * or past the current delimited end. */
 static size_t curbufleft(const upb_pbdecoder *d) {
-  UPB_ASSERT(d->data_end >= d->ptr);
+  assert(d->data_end >= d->ptr);
   return d->data_end - d->ptr;
 }
 
@@ -10336,7 +7585,7 @@
 
 /* Advances d->ptr. */
 static void advance(upb_pbdecoder *d, size_t len) {
-  UPB_ASSERT(curbufleft(d) >= len);
+  assert(curbufleft(d) >= len);
   d->ptr += len;
 }
 
@@ -10369,7 +7618,7 @@
 }
 
 static void advancetobuf(upb_pbdecoder *d, const char *buf, size_t len) {
-  UPB_ASSERT(curbufleft(d) == 0);
+  assert(curbufleft(d) == 0);
   d->bufstart_ofs += (d->end - d->buf);
   switchtobuf(d, buf, buf + len);
 }
@@ -10378,7 +7627,7 @@
   /* The assertion here is in the interests of efficiency, not correctness.
    * We are trying to ensure that we don't checkpoint() more often than
    * necessary. */
-  UPB_ASSERT(d->checkpoint != d->ptr);
+  assert(d->checkpoint != d->ptr);
   d->checkpoint = d->ptr;
 }
 
@@ -10389,12 +7638,12 @@
  * won't actually be read.
  */
 static int32_t skip(upb_pbdecoder *d, size_t bytes) {
-  UPB_ASSERT(!in_residual_buf(d, d->ptr) || d->size_param == 0);
-  UPB_ASSERT(d->skip == 0);
+  assert(!in_residual_buf(d, d->ptr) || d->size_param == 0);
+  assert(d->skip == 0);
   if (bytes > delim_remaining(d)) {
     seterr(d, "Skipped value extended beyond enclosing submessage.");
     return upb_pbdecoder_suspend(d);
-  } else if (bufleft(d) >= bytes) {
+  } else if (bufleft(d) > bytes) {
     /* Skipped data is all in current buffer, and more is still available. */
     advance(d, bytes);
     d->skip = 0;
@@ -10416,31 +7665,25 @@
                              size_t size, const upb_bufhandle *handle) {
   UPB_UNUSED(p);  /* Useless; just for the benefit of the JIT. */
 
-  /* d->skip and d->residual_end could probably elegantly be represented
-   * as a single variable, to more easily represent this invariant. */
-  UPB_ASSERT(!(d->skip && d->residual_end > d->residual));
-
-  /* We need to remember the original size_param, so that the value we return
-   * is relative to it, even if we do some skipping first. */
+  d->buf_param = buf;
   d->size_param = size;
   d->handle = handle;
 
-  /* Have to handle this case specially (ie. not with skip()) because the user
-   * is allowed to pass a NULL buffer here, which won't allow us to safely
-   * calculate a d->end or use our normal functions like curbufleft(). */
-  if (d->skip && d->skip >= size) {
-    d->skip -= size;
-    d->bufstart_ofs += size;
-    buf = &dummy_char;
-    size = 0;
-
-    /* We can't just return now, because we might need to execute some ops
-     * like CHECKDELIM, which could call some callbacks and pop the stack. */
+  if (d->residual_end > d->residual) {
+    /* We have residual bytes from the last buffer. */
+    assert(d->ptr == d->residual);
+  } else {
+    switchtobuf(d, buf, buf + size);
   }
 
-  /* We need to pretend that this was the actual buffer param, since some of the
-   * calculations assume that d->ptr/d->buf is relative to this. */
-  d->buf_param = buf;
+  d->checkpoint = d->ptr;
+
+  if (d->skip) {
+    size_t skip_bytes = d->skip;
+    d->skip = 0;
+    CHECK_RETURN(skip(d, skip_bytes));
+    d->checkpoint = d->ptr;
+  }
 
   if (!buf) {
     /* NULL buf is ok if its entire span is covered by the "skip" above, but
@@ -10449,27 +7692,9 @@
     return upb_pbdecoder_suspend(d);
   }
 
-  if (d->residual_end > d->residual) {
-    /* We have residual bytes from the last buffer. */
-    UPB_ASSERT(d->ptr == d->residual);
-  } else {
-    switchtobuf(d, buf, buf + size);
-  }
-
-  d->checkpoint = d->ptr;
-
-  /* Handle skips that don't cover the whole buffer (as above). */
-  if (d->skip) {
-    size_t skip_bytes = d->skip;
-    d->skip = 0;
-    CHECK_RETURN(skip(d, skip_bytes));
-    checkpoint(d);
-  }
-
-  /* If we're inside an unknown group, continue to parse unknown values. */
   if (d->top->groupnum < 0) {
     CHECK_RETURN(upb_pbdecoder_skipunknown(d, -1, 0));
-    checkpoint(d);
+    d->checkpoint = d->ptr;
   }
 
   return DECODE_OK;
@@ -10484,14 +7709,15 @@
     d->ptr = d->residual;
     return 0;
   } else {
-    size_t ret = d->size_param - (d->end - d->checkpoint);
-    UPB_ASSERT(!in_residual_buf(d, d->checkpoint));
-    UPB_ASSERT(d->buf == d->buf_param || d->buf == &dummy_char);
+    size_t consumed;
+    assert(!in_residual_buf(d, d->checkpoint));
+    assert(d->buf == d->buf_param);
 
-    d->bufstart_ofs += (d->checkpoint - d->buf);
+    consumed = d->checkpoint - d->buf;
+    d->bufstart_ofs += consumed;
     d->residual_end = d->residual;
     switchtobuf(d, d->residual, d->residual_end);
-    return ret;
+    return consumed;
   }
 }
 
@@ -10506,7 +7732,7 @@
 
   if (d->checkpoint == d->residual) {
     /* Checkpoint was in residual buf; append user byte(s) to residual buf. */
-    UPB_ASSERT((d->residual_end - d->residual) + d->size_param <=
+    assert((d->residual_end - d->residual) + d->size_param <=
            sizeof(d->residual));
     if (!in_residual_buf(d, d->ptr)) {
       d->bufstart_ofs -= (d->residual_end - d->residual);
@@ -10516,11 +7742,11 @@
   } else {
     /* Checkpoint was in user buf; old residual bytes not needed. */
     size_t save;
-    UPB_ASSERT(!in_residual_buf(d, d->checkpoint));
+    assert(!in_residual_buf(d, d->checkpoint));
 
     d->ptr = d->checkpoint;
     save = curbufleft(d);
-    UPB_ASSERT(save <= sizeof(d->residual));
+    assert(save <= sizeof(d->residual));
     memcpy(d->residual, d->ptr, save);
     d->residual_end = d->residual + save;
     d->bufstart_ofs = offset(d);
@@ -10534,7 +7760,7 @@
  * Requires that this many bytes are available in the current buffer. */
 UPB_FORCEINLINE static void consumebytes(upb_pbdecoder *d, void *buf,
                                          size_t bytes) {
-  UPB_ASSERT(bytes <= curbufleft(d));
+  assert(bytes <= curbufleft(d));
   memcpy(buf, d->ptr, bytes);
   advance(d, bytes);
 }
@@ -10547,7 +7773,7 @@
   const size_t avail = curbufleft(d);
   consumebytes(d, buf, avail);
   bytes -= avail;
-  UPB_ASSERT(bytes > 0);
+  assert(bytes > 0);
   if (in_residual_buf(d, d->ptr)) {
     advancetobuf(d, d->buf_param, d->size_param);
   }
@@ -10609,7 +7835,8 @@
   int bitpos;
   *u64 = 0;
   for(bitpos = 0; bitpos < 70 && (byte & 0x80); bitpos += 7) {
-    CHECK_RETURN(getbytes(d, &byte, 1));
+    int32_t ret = getbytes(d, &byte, 1);
+    if (ret >= 0) return ret;
     *u64 |= (uint64_t)(byte & 0x7F) << bitpos;
   }
   if(bitpos == 70 && (byte & 0x80)) {
@@ -10730,7 +7957,7 @@
   if (read == bytes && data == expected) {
     /* Advance past matched bytes. */
     int32_t ok = getbytes(d, &data, read);
-    UPB_ASSERT(ok < 0);
+    UPB_ASSERT_VAR(ok, ok < 0);
     return DECODE_OK;
   } else if (read < bytes && memcmp(&data, &expected, read) == 0) {
     return suspend_save(d);
@@ -10756,6 +7983,7 @@
       return upb_pbdecoder_suspend(d);
     }
 
+    /* TODO: deliver to unknown field callback. */
     switch (wire_type) {
       case UPB_WIRE_TYPE_32BIT:
         CHECK_RETURN(skip(d, 4));
@@ -10793,8 +8021,6 @@
     }
 
     if (d->top->groupnum >= 0) {
-      /* TODO: More code needed for handling unknown groups. */
-      upb_sink_putunknown(&d->top->sink, d->checkpoint, d->ptr - d->checkpoint);
       return DECODE_OK;
     }
 
@@ -10806,7 +8032,7 @@
 static void goto_endmsg(upb_pbdecoder *d) {
   upb_value v;
   bool found = upb_inttable_lookup32(d->top->dispatch, DISPATCH_ENDMSG, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   d->pc = d->top->base + upb_value_getuint64(v);
 }
 
@@ -10840,7 +8066,7 @@
     } else if (wire_type == ((v >> 8) & 0xff)) {
       bool found =
           upb_inttable_lookup(dispatch, fieldnum + UPB_MAX_FIELDNUMBER, &val);
-      UPB_ASSERT(found);
+      UPB_ASSERT_VAR(found, found);
       d->pc = d->top->base + upb_value_getuint64(val);
       return DECODE_OK;
     }
@@ -10852,7 +8078,7 @@
    * can re-check the delimited end. */
   d->last--;  /* Necessary if we get suspended */
   d->pc = d->last;
-  UPB_ASSERT(getop(*d->last) == OP_CHECKDELIM);
+  assert(getop(*d->last) == OP_CHECKDELIM);
 
   /* Unknown field or ENDGROUP. */
   retval = upb_pbdecoder_skipunknown(d, fieldnum, wire_type);
@@ -10870,7 +8096,7 @@
 /* Callers know that the stack is more than one deep because the opcodes that
  * call this only occur after PUSH operations. */
 upb_pbdecoder_frame *outer_frame(upb_pbdecoder *d) {
-  UPB_ASSERT(d->top != d->stack);
+  assert(d->top != d->stack);
   return d->top - 1;
 }
 
@@ -10902,7 +8128,7 @@
     op = getop(instruction);
     arg = instruction >> 8;
     longofs = arg;
-    UPB_ASSERT(d->ptr != d->residual_end);
+    assert(d->ptr != d->residual_end);
     UPB_UNUSED(group);
 #ifdef UPB_DUMP_BYTECODE
     fprintf(stderr, "s_ofs=%d buf_ofs=%d data_rem=%d buf_rem=%d delim_rem=%d "
@@ -10977,7 +8203,7 @@
           } else {
             int32_t ret = skip(d, n);
             /* This shouldn't return DECODE_OK, because n > len. */
-            UPB_ASSERT(ret >= 0);
+            assert(ret >= 0);
             return ret;
           }
         }
@@ -10999,7 +8225,7 @@
         d->top->groupnum = *d->pc++;
       )
       VMCASE(OP_POP,
-        UPB_ASSERT(d->top > d->stack);
+        assert(d->top > d->stack);
         decoder_pop(d);
       )
       VMCASE(OP_PUSHLENDELIM,
@@ -11015,7 +8241,7 @@
         /* We are guaranteed of this assert because we never allow ourselves to
          * consume bytes beyond data_end, which covers delim_end when non-NULL.
          */
-        UPB_ASSERT(!(d->delim_end && d->ptr > d->delim_end));
+        assert(!(d->delim_end && d->ptr > d->delim_end));
         if (d->ptr == d->delim_end)
           d->pc += longofs;
       )
@@ -11024,7 +8250,7 @@
         d->pc += longofs;
       )
       VMCASE(OP_RET,
-        UPB_ASSERT(d->call_len > 0);
+        assert(d->call_len > 0);
         d->pc = d->callstack[--d->call_len];
       )
       VMCASE(OP_BRANCH,
@@ -11151,7 +8377,7 @@
     if (p != method->code_base.ptr) p--;
     if (getop(*p) == OP_CHECKDELIM) {
       /* Rewind from OP_TAG* to OP_CHECKDELIM. */
-      UPB_ASSERT(getop(*d->pc) == OP_TAG1 ||
+      assert(getop(*d->pc) == OP_TAG1 ||
              getop(*d->pc) == OP_TAG2 ||
              getop(*d->pc) == OP_TAGN ||
              getop(*d->pc) == OP_DISPATCH);
@@ -11210,12 +8436,11 @@
   d->env = e;
   d->limit = d->stack + default_max_nesting - 1;
   d->stack_size = default_max_nesting;
-  d->status = NULL;
 
   upb_pbdecoder_reset(d);
   upb_bytessink_reset(&d->input_, &m->input_handler_, d);
 
-  UPB_ASSERT(sink);
+  assert(sink);
   if (d->method_->dest_handlers_) {
     if (sink->handlers != d->method_->dest_handlers_)
       return NULL;
@@ -11223,8 +8448,7 @@
   upb_sink_reset(&d->top->sink, sink->handlers, sink->closure);
 
   /* If this fails, increase the value in decoder.h. */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(e) - size_before <=
-                      UPB_PB_DECODER_SIZE);
+  assert(upb_env_bytesallocated(e) - size_before <= UPB_PB_DECODER_SIZE);
   return d;
 }
 
@@ -11245,7 +8469,7 @@
 }
 
 bool upb_pbdecoder_setmaxnesting(upb_pbdecoder *d, size_t max) {
-  UPB_ASSERT(d->top >= d->stack);
+  assert(d->top >= d->stack);
 
   if (max < (size_t)(d->top - d->stack)) {
     /* Can't set a limit smaller than what we are currently at. */
@@ -11333,6 +8557,7 @@
 */
 
 
+#include <stdlib.h>
 
 /* The output buffer is divided into segments; a segment is a string of data
  * that is "ready to go" -- it does not need any varint lengths inserted into
@@ -11404,7 +8629,7 @@
 /* TODO(haberman): handle pushback */
 static void putbuf(upb_pb_encoder *e, const char *buf, size_t len) {
   size_t n = upb_bytessink_putbuf(e->output_, e->subc, buf, len, NULL);
-  UPB_ASSERT(n == len);
+  UPB_ASSERT_VAR(n, n == len);
 }
 
 static upb_pb_encoder_segment *top(upb_pb_encoder *e) {
@@ -11444,7 +8669,7 @@
 /* Call when "bytes" bytes have been writte at e->ptr.  The caller *must* have
  * previously called reserve() with at least this many bytes. */
 static void encoder_advance(upb_pb_encoder *e, size_t bytes) {
-  UPB_ASSERT((size_t)(e->limit - e->ptr) >= bytes);
+  assert((size_t)(e->limit - e->ptr) >= bytes);
   e->ptr += bytes;
 }
 
@@ -11479,7 +8704,7 @@
  * length. */
 static void accumulate(upb_pb_encoder *e) {
   size_t run_len;
-  UPB_ASSERT(e->ptr >= e->runbegin);
+  assert(e->ptr >= e->runbegin);
   run_len = e->ptr - e->runbegin;
   e->segptr->seglen += run_len;
   top(e)->msglen += run_len;
@@ -11577,12 +8802,12 @@
                     upb_handlerattr *attr) {
   uint32_t n = upb_fielddef_number(f);
 
-  tag_t *tag = upb_gmalloc(sizeof(tag_t));
+  tag_t *tag = malloc(sizeof(tag_t));
   tag->bytes = upb_vencode64((n << 3) | wt, tag->tag);
 
   upb_handlerattr_init(attr);
   upb_handlerattr_sethandlerdata(attr, tag);
-  upb_handlers_addcleanup(h, tag, upb_gfree);
+  upb_handlers_addcleanup(h, tag, free);
 }
 
 static bool encode_tag(upb_pb_encoder *e, const tag_t *tag) {
@@ -11650,12 +8875,6 @@
   return ok ? c : UPB_BREAK;
 }
 
-static bool encode_unknown(void *c, const void *hd, const char *buf,
-                           size_t len) {
-  UPB_UNUSED(hd);
-  return encode_bytes(c, buf, len) && commit(c);
-}
-
 static bool encode_enddelimfield(void *c, const void *hd) {
   UPB_UNUSED(hd);
   return end_delim(c);
@@ -11693,7 +8912,7 @@
 T(double,   double,   dbl2uint64,   encode_fixed64)
 T(float,    float,    flt2uint32,   encode_fixed32)
 T(int64,    int64_t,  uint64_t,     encode_varint)
-T(int32,    int32_t,  int64_t,      encode_varint)
+T(int32,    int32_t,  uint32_t,     encode_varint)
 T(fixed64,  uint64_t, uint64_t,     encode_fixed64)
 T(fixed32,  uint32_t, uint32_t,     encode_fixed32)
 T(bool,     bool,     bool,         encode_varint)
@@ -11718,7 +8937,6 @@
 
   upb_handlers_setstartmsg(h, startmsg, NULL);
   upb_handlers_setendmsg(h, endmsg, NULL);
-  upb_handlers_setunknown(h, encode_unknown, NULL);
 
   m = upb_handlers_msgdef(h);
   for(upb_msg_field_begin(&i, m);
@@ -11841,17 +9059,19 @@
   e->ptr = e->buf;
 
   /* If this fails, increase the value in encoder.h. */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(env) - size_before <=
-                      UPB_PB_ENCODER_SIZE);
+  assert(upb_env_bytesallocated(env) - size_before <= UPB_PB_ENCODER_SIZE);
   return e;
 }
 
 upb_sink *upb_pb_encoder_input(upb_pb_encoder *e) { return &e->input_; }
 
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
-upb_filedef **upb_loaddescriptor(const char *buf, size_t n, const void *owner,
-                                 upb_status *status) {
+upb_def **upb_load_defs_from_descriptor(const char *str, size_t len, int *n,
+                                        void *owner, upb_status *status) {
   /* Create handlers. */
   const upb_pbdecodermethod *decoder_m;
   const upb_handlers *reader_h = upb_descreader_newhandlers(&reader_h);
@@ -11860,8 +9080,8 @@
   upb_pbdecoder *decoder;
   upb_descreader *reader;
   bool ok;
-  size_t i;
-  upb_filedef **ret = NULL;
+  upb_def **ret = NULL;
+  upb_def **defs;
 
   upb_pbdecodermethodopts_init(&opts, reader_h);
   decoder_m = upb_pbdecodermethod_new(&opts, &decoder_m);
@@ -11873,24 +9093,12 @@
   decoder = upb_pbdecoder_create(&env, decoder_m, upb_descreader_input(reader));
 
   /* Push input data. */
-  ok = upb_bufsrc_putbuf(buf, n, upb_pbdecoder_input(decoder));
+  ok = upb_bufsrc_putbuf(str, len, upb_pbdecoder_input(decoder));
 
-  if (!ok) {
-    goto cleanup;
-  }
-
-  ret = upb_gmalloc(sizeof (*ret) * (upb_descreader_filecount(reader) + 1));
-
-  if (!ret) {
-    goto cleanup;
-  }
-
-  for (i = 0; i < upb_descreader_filecount(reader); i++) {
-    ret[i] = upb_descreader_file(reader, i);
-    upb_filedef_ref(ret[i], owner);
-  }
-
-  ret[i] = NULL;
+  if (!ok) goto cleanup;
+  defs = upb_descreader_getdefs(reader, owner, n);
+  ret = malloc(sizeof(upb_def*) * (*n));
+  memcpy(ret, defs, sizeof(upb_def*) * (*n));
 
 cleanup:
   upb_env_uninit(&env);
@@ -11898,6 +9106,51 @@
   upb_pbdecodermethod_unref(decoder_m, &decoder_m);
   return ret;
 }
+
+bool upb_load_descriptor_into_symtab(upb_symtab *s, const char *str, size_t len,
+                                     upb_status *status) {
+  int n;
+  bool success;
+  upb_def **defs = upb_load_defs_from_descriptor(str, len, &n, &defs, status);
+  if (!defs) return false;
+  success = upb_symtab_add(s, defs, n, &defs, status);
+  free(defs);
+  return success;
+}
+
+char *upb_readfile(const char *filename, size_t *len) {
+  long size;
+  char *buf;
+  FILE *f = fopen(filename, "rb");
+  if(!f) return NULL;
+  if(fseek(f, 0, SEEK_END) != 0) goto error;
+  size = ftell(f);
+  if(size < 0) goto error;
+  if(fseek(f, 0, SEEK_SET) != 0) goto error;
+  buf = malloc(size + 1);
+  if(size && fread(buf, size, 1, f) != 1) goto error;
+  fclose(f);
+  if (len) *len = size;
+  return buf;
+
+error:
+  fclose(f);
+  return NULL;
+}
+
+bool upb_load_descriptor_file_into_symtab(upb_symtab *symtab, const char *fname,
+                                          upb_status *status) {
+  size_t len;
+  bool success;
+  char *data = upb_readfile(fname, &len);
+  if (!data) {
+    if (status) upb_status_seterrf(status, "Couldn't read file: %s", fname);
+    return false;
+  }
+  success = upb_load_descriptor_into_symtab(symtab, data, len, status);
+  free(data);
+  return success;
+}
 /*
  * upb::pb::TextPrinter
  *
@@ -11911,6 +9164,7 @@
 #include <inttypes.h>
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 
@@ -12006,14 +9260,14 @@
   va_end(args_copy);
 
   /* + 1 for NULL terminator (vsprintf() requires it even if we don't). */
-  str = upb_gmalloc(len + 1);
+  str = malloc(len + 1);
   if (!str) return false;
   written = vsprintf(str, fmt, args);
   va_end(args);
-  UPB_ASSERT(written == len);
+  UPB_ASSERT_VAR(written, written == len);
 
   ok = upb_bytessink_putbuf(p->output_, p->subc, str, len, NULL);
-  upb_gfree(str);
+  free(str);
   return ok;
 }
 
@@ -12309,6 +9563,57 @@
   return r;
 }
 
+/* Given an encoded varint v, returns an integer with a single bit set that
+ * indicates the end of the varint.  Subtracting one from this value will
+ * yield a mask that leaves only bits that are part of the varint.  Returns
+ * 0 if the varint is unterminated. */
+static uint64_t upb_get_vstopbit(uint64_t v) {
+  uint64_t cbits = v | 0x7f7f7f7f7f7f7f7fULL;
+  return ~cbits & (cbits+1);
+}
+
+/* A branchless decoder.  Credit to Pascal Massimino for the bit-twiddling. */
+upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r) {
+  uint64_t b;
+  uint64_t stop_bit;
+  upb_decoderet my_r;
+  memcpy(&b, r.p, sizeof(b));
+  stop_bit = upb_get_vstopbit(b);
+  b =  (b & 0x7f7f7f7f7f7f7f7fULL) & (stop_bit - 1);
+  b +=       b & 0x007f007f007f007fULL;
+  b +=  3 * (b & 0x0000ffff0000ffffULL);
+  b += 15 * (b & 0x00000000ffffffffULL);
+  if (stop_bit == 0) {
+    /* Error: unterminated varint. */
+    upb_decoderet err_r = {(void*)0, 0};
+    return err_r;
+  }
+  my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
+                            r.val | (b << 7));
+  return my_r;
+}
+
+/* A branchless decoder.  Credit to Daniel Wright for the bit-twiddling. */
+upb_decoderet upb_vdecode_max8_wright(upb_decoderet r) {
+  uint64_t b;
+  uint64_t stop_bit;
+  upb_decoderet my_r;
+  memcpy(&b, r.p, sizeof(b));
+  stop_bit = upb_get_vstopbit(b);
+  b &= (stop_bit - 1);
+  b = ((b & 0x7f007f007f007f00ULL) >> 1) | (b & 0x007f007f007f007fULL);
+  b = ((b & 0xffff0000ffff0000ULL) >> 2) | (b & 0x0000ffff0000ffffULL);
+  b = ((b & 0xffffffff00000000ULL) >> 4) | (b & 0x00000000ffffffffULL);
+  if (stop_bit == 0) {
+    /* Error: unterminated varint. */
+    upb_decoderet err_r = {(void*)0, 0};
+    return err_r;
+  }
+  my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
+                            r.val | (b << 14));
+  return my_r;
+}
+
 #line 1 "upb/json/parser.rl"
 /*
 ** upb::json::Parser (upb_json_parser)
@@ -12331,12 +9636,12 @@
 ** - handling of keys/escape-sequences/etc that span input buffers.
 */
 
-#include <errno.h>
-#include <float.h>
-#include <math.h>
+#include <stdio.h>
 #include <stdint.h>
-#include <stdlib.h>
+#include <assert.h>
 #include <string.h>
+#include <stdlib.h>
+#include <errno.h>
 
 
 #define UPB_JSON_MAX_DEPTH 64
@@ -12349,9 +9654,6 @@
   const upb_msgdef *m;
   const upb_fielddef *f;
 
-  /* The table mapping json name to fielddef for this message. */
-  upb_strtable *name_table;
-
   /* We are in a repeated-field context, ready to emit mapentries as
    * submessages. This flag alters the start-of-object (open-brace) behavior to
    * begin a sequence of mapentry messages rather than a single submessage. */
@@ -12372,7 +9674,7 @@
 
 struct upb_json_parser {
   upb_env *env;
-  const upb_json_parsermethod *method;
+  upb_byteshandler input_handler_;
   upb_bytessink input_;
 
   /* Stack to track the JSON scopes we are in. */
@@ -12407,19 +9709,6 @@
   uint32_t digit;
 };
 
-struct upb_json_parsermethod {
-  upb_refcounted base;
-
-  upb_byteshandler input_handler_;
-
-  /* Mainly for the purposes of refcounting, so all the fielddefs we point
-   * to stay alive. */
-  const upb_msgdef *msg;
-
-  /* Keys are upb_msgdef*, values are upb_strtable (json_name -> fielddef) */
-  upb_inttable name_tables;
-};
-
 #define PARSER_CHECK_RETURN(x) if (!(x)) return false
 
 /* Used to signal that a capture has been suspended. */
@@ -12429,7 +9718,7 @@
                                              upb_handlertype_t type) {
   upb_selector_t sel;
   bool ok = upb_handlers_getselector(p->top->f, type, &sel);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return sel;
 }
 
@@ -12448,13 +9737,6 @@
   return true;
 }
 
-static void set_name_table(upb_json_parser *p, upb_jsonparser_frame *frame) {
-  upb_value v;
-  bool ok = upb_inttable_lookupptr(&p->method->name_tables, frame->m, &v);
-  UPB_ASSERT(ok);
-  frame->name_table = upb_value_getptr(v);
-}
-
 /* There are GCC/Clang built-ins for overflow checking which we could start
  * using if there was any performance benefit to it. */
 
@@ -12574,7 +9856,7 @@
     val = b64lookup(ptr[0]) << 18 |
           b64lookup(ptr[1]) << 12;
 
-    UPB_ASSERT(!(val & 0x80000000));
+    assert(!(val & 0x80000000));
     output = val >> 16;
     upb_sink_putstring(&p->top->sink, sel, &output, 1, NULL);
     return true;
@@ -12628,8 +9910,9 @@
  *      the true value in a contiguous buffer. */
 
 static void assert_accumulate_empty(upb_json_parser *p) {
-  UPB_ASSERT(p->accumulated == NULL);
-  UPB_ASSERT(p->accumulated_len == 0);
+  UPB_UNUSED(p);
+  assert(p->accumulated == NULL);
+  assert(p->accumulated_len == 0);
 }
 
 static void accumulate_clear(upb_json_parser *p) {
@@ -12695,7 +9978,7 @@
  * call, and writes the length to *len.  This with point either to the input
  * buffer or a temporary accumulate buffer. */
 static const char *accumulate_getptr(upb_json_parser *p, size_t *len) {
-  UPB_ASSERT(p->accumulated);
+  assert(p->accumulated);
   *len = p->accumulated_len;
   return p->accumulated;
 }
@@ -12733,7 +10016,7 @@
  * the end. */
 static void multipart_startaccum(upb_json_parser *p) {
   assert_accumulate_empty(p);
-  UPB_ASSERT(p->multipart_state == MULTIPART_INACTIVE);
+  assert(p->multipart_state == MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_ACCUMULATE;
 }
 
@@ -12741,7 +10024,7 @@
  * value with the given selector. */
 static void multipart_start(upb_json_parser *p, upb_selector_t sel) {
   assert_accumulate_empty(p);
-  UPB_ASSERT(p->multipart_state == MULTIPART_INACTIVE);
+  assert(p->multipart_state == MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_PUSHEAGERLY;
   p->string_selector = sel;
 }
@@ -12774,7 +10057,7 @@
 /* Note: this invalidates the accumulate buffer!  Call only after reading its
  * contents. */
 static void multipart_end(upb_json_parser *p) {
-  UPB_ASSERT(p->multipart_state != MULTIPART_INACTIVE);
+  assert(p->multipart_state != MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_INACTIVE;
   accumulate_clear(p);
 }
@@ -12787,13 +10070,13 @@
  * region. */
 
 static void capture_begin(upb_json_parser *p, const char *ptr) {
-  UPB_ASSERT(p->multipart_state != MULTIPART_INACTIVE);
-  UPB_ASSERT(p->capture == NULL);
+  assert(p->multipart_state != MULTIPART_INACTIVE);
+  assert(p->capture == NULL);
   p->capture = ptr;
 }
 
 static bool capture_end(upb_json_parser *p, const char *ptr) {
-  UPB_ASSERT(p->capture);
+  assert(p->capture);
   if (multipart_text(p, p->capture, ptr - p->capture, true)) {
     p->capture = NULL;
     return true;
@@ -12826,7 +10109,7 @@
 
 static void capture_resume(upb_json_parser *p, const char *ptr) {
   if (p->capture) {
-    UPB_ASSERT(p->capture == &suspend_capture);
+    assert(p->capture == &suspend_capture);
     p->capture = ptr;
   }
 }
@@ -12848,7 +10131,7 @@
     case '"': return '"';
     case '\\': return '\\';
     default:
-      UPB_ASSERT(0);
+      assert(0);
       return 'x';
   }
 }
@@ -12872,7 +10155,7 @@
   } else if (ch >= 'a' && ch <= 'f') {
     p->digit += ((ch - 'a') + 10);
   } else {
-    UPB_ASSERT(ch >= 'A' && ch <= 'F');
+    assert(ch >= 'A' && ch <= 'F');
     p->digit += ((ch - 'A') + 10);
   }
 }
@@ -12918,142 +10201,21 @@
   capture_begin(p, ptr);
 }
 
-static bool parse_number(upb_json_parser *p, bool is_quoted);
+static bool parse_number(upb_json_parser *p);
 
 static bool end_number(upb_json_parser *p, const char *ptr) {
   if (!capture_end(p, ptr)) {
     return false;
   }
 
-  return parse_number(p, false);
+  return parse_number(p);
 }
 
-/* |buf| is NULL-terminated. |buf| itself will never include quotes;
- * |is_quoted| tells us whether this text originally appeared inside quotes. */
-static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,
-                                     bool is_quoted) {
-  size_t len = strlen(buf);
-  const char *bufend = buf + len;
-  char *end;
-  upb_fieldtype_t type = upb_fielddef_type(p->top->f);
-  double val;
-  double dummy;
-  double inf = 1.0 / 0.0;  /* C89 does not have an INFINITY macro. */
-
-  errno = 0;
-
-  if (len == 0 || buf[0] == ' ') {
-    return false;
-  }
-
-  /* For integer types, first try parsing with integer-specific routines.
-   * If these succeed, they will be more accurate for int64/uint64 than
-   * strtod().
-   */
-  switch (type) {
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_INT32: {
-      long val = strtol(buf, &end, 0);
-      if (errno == ERANGE || end != bufend) {
-        break;
-      } else if (val > INT32_MAX || val < INT32_MIN) {
-        return false;
-      } else {
-        upb_sink_putint32(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    case UPB_TYPE_UINT32: {
-      unsigned long val = strtoul(buf, &end, 0);
-      if (end != bufend) {
-        break;
-      } else if (val > UINT32_MAX || errno == ERANGE) {
-        return false;
-      } else {
-        upb_sink_putuint32(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    /* XXX: We can't handle [u]int64 properly on 32-bit machines because
-     * strto[u]ll isn't in C89. */
-    case UPB_TYPE_INT64: {
-      long val = strtol(buf, &end, 0);
-      if (errno == ERANGE || end != bufend) {
-        break;
-      } else {
-        upb_sink_putint64(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    case UPB_TYPE_UINT64: {
-      unsigned long val = strtoul(p->accumulated, &end, 0);
-      if (end != bufend) {
-        break;
-      } else if (errno == ERANGE) {
-        return false;
-      } else {
-        upb_sink_putuint64(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    default:
-      break;
-  }
-
-  if (type != UPB_TYPE_DOUBLE && type != UPB_TYPE_FLOAT && is_quoted) {
-    /* Quoted numbers for integer types are not allowed to be in double form. */
-    return false;
-  }
-
-  if (len == strlen("Infinity") && strcmp(buf, "Infinity") == 0) {
-    /* C89 does not have an INFINITY macro. */
-    val = inf;
-  } else if (len == strlen("-Infinity") && strcmp(buf, "-Infinity") == 0) {
-    val = -inf;
-  } else {
-    val = strtod(buf, &end);
-    if (errno == ERANGE || end != bufend) {
-      return false;
-    }
-  }
-
-  switch (type) {
-#define CASE(capitaltype, smalltype, ctype, min, max)                     \
-    case UPB_TYPE_ ## capitaltype: {                                      \
-      if (modf(val, &dummy) != 0 || val > max || val < min) {             \
-        return false;                                                     \
-      } else {                                                            \
-        upb_sink_put ## smalltype(&p->top->sink, parser_getsel(p),        \
-                                  (ctype)val);                            \
-        return true;                                                      \
-      }                                                                   \
-      break;                                                              \
-    }
-    case UPB_TYPE_ENUM:
-    CASE(INT32, int32, int32_t, INT32_MIN, INT32_MAX);
-    CASE(INT64, int64, int64_t, INT64_MIN, INT64_MAX);
-    CASE(UINT32, uint32, uint32_t, 0, UINT32_MAX);
-    CASE(UINT64, uint64, uint64_t, 0, UINT64_MAX);
-#undef CASE
-
-    case UPB_TYPE_DOUBLE:
-      upb_sink_putdouble(&p->top->sink, parser_getsel(p), val);
-      return true;
-    case UPB_TYPE_FLOAT:
-      if ((val > FLT_MAX || val < -FLT_MAX) && val != inf && val != -inf) {
-        return false;
-      } else {
-        upb_sink_putfloat(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    default:
-      return false;
-  }
-}
-
-static bool parse_number(upb_json_parser *p, bool is_quoted) {
+static bool parse_number(upb_json_parser *p) {
   size_t len;
   const char *buf;
+  const char *myend;
+  char *end;
 
   /* strtol() and friends unfortunately do not support specifying the length of
    * the input string, so we need to force a copy into a NULL-terminated buffer. */
@@ -13062,16 +10224,80 @@
   }
 
   buf = accumulate_getptr(p, &len);
+  myend = buf + len - 1;  /* One for NULL. */
 
-  if (parse_number_from_buffer(p, buf, is_quoted)) {
-    multipart_end(p);
-    return true;
-  } else {
-    upb_status_seterrf(&p->status, "error parsing number: %s", buf);
-    upb_env_reporterror(p->env, &p->status);
-    multipart_end(p);
-    return false;
+  /* XXX: We are using strtol to parse integers, but this is wrong as even
+   * integers can be represented as 1e6 (for example), which strtol can't
+   * handle correctly.
+   *
+   * XXX: Also, we can't handle large integers properly because strto[u]ll
+   * isn't in C89.
+   *
+   * XXX: Also, we don't properly check floats for overflow, since strtof
+   * isn't in C89. */
+  switch (upb_fielddef_type(p->top->f)) {
+    case UPB_TYPE_ENUM:
+    case UPB_TYPE_INT32: {
+      long val = strtol(p->accumulated, &end, 0);
+      if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putint32(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_INT64: {
+      long long val = strtol(p->accumulated, &end, 0);
+      if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putint64(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_UINT32: {
+      unsigned long val = strtoul(p->accumulated, &end, 0);
+      if (val > UINT32_MAX || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putuint32(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_UINT64: {
+      unsigned long long val = strtoul(p->accumulated, &end, 0);
+      if (val > UINT64_MAX || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putuint64(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_DOUBLE: {
+      double val = strtod(p->accumulated, &end);
+      if (errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putdouble(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_FLOAT: {
+      float val = strtod(p->accumulated, &end);
+      if (errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putfloat(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    default:
+      assert(false);
   }
+
+  multipart_end(p);
+
+  return true;
+
+err:
+  upb_status_seterrf(&p->status, "error parsing number: %s", buf);
+  upb_env_reporterror(p->env, &p->status);
+  multipart_end(p);
+  return false;
 }
 
 static bool parser_putbool(upb_json_parser *p, bool val) {
@@ -13086,13 +10312,13 @@
   }
 
   ok = upb_sink_putbool(&p->top->sink, parser_getsel(p), val);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
 
   return true;
 }
 
 static bool start_stringval(upb_json_parser *p) {
-  UPB_ASSERT(p->top->f);
+  assert(p->top->f);
 
   if (upb_fielddef_isstring(p->top->f)) {
     upb_jsonparser_frame *inner;
@@ -13107,7 +10333,6 @@
     upb_sink_startstr(&p->top->sink, sel, 0, &inner->sink);
     inner->m = p->top->m;
     inner->f = p->top->f;
-    inner->name_table = NULL;
     inner->is_map = false;
     inner->is_mapentry = false;
     p->top = inner;
@@ -13124,16 +10349,17 @@
       multipart_startaccum(p);
       return true;
     }
-  } else if (upb_fielddef_type(p->top->f) != UPB_TYPE_BOOL &&
-             upb_fielddef_type(p->top->f) != UPB_TYPE_MESSAGE) {
-    /* No need to push a frame -- numeric values in quotes remain in the
-     * current parser frame.  These values must accmulate so we can convert
-     * them all at once at the end. */
+  } else if (upb_fielddef_type(p->top->f) == UPB_TYPE_ENUM) {
+    /* No need to push a frame -- symbolic enum names in quotes remain in the
+     * current parser frame.
+     *
+     * Enum string values must accumulate so we can look up the value in a table
+     * once it is complete. */
     multipart_startaccum(p);
     return true;
   } else {
     upb_status_seterrf(&p->status,
-                       "String specified for bool or submessage field: %s",
+                       "String specified for non-string/non-enum field: %s",
                        upb_fielddef_name(p->top->f));
     upb_env_reporterror(p->env, &p->status);
     return false;
@@ -13153,8 +10379,8 @@
 
     case UPB_TYPE_STRING: {
       upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);
-      p->top--;
       upb_sink_endstr(&p->top->sink, sel);
+      p->top--;
       break;
     }
 
@@ -13180,17 +10406,8 @@
       break;
     }
 
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_UINT64:
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_FLOAT:
-      ok = parse_number(p, true);
-      break;
-
     default:
-      UPB_ASSERT(false);
+      assert(false);
       upb_status_seterrmsg(&p->status, "Internal error in JSON decoder");
       upb_env_reporterror(p->env, &p->status);
       ok = false;
@@ -13203,7 +10420,7 @@
 }
 
 static void start_member(upb_json_parser *p) {
-  UPB_ASSERT(!p->top->f);
+  assert(!p->top->f);
   multipart_startaccum(p);
 }
 
@@ -13232,7 +10449,7 @@
     case UPB_TYPE_UINT32:
     case UPB_TYPE_UINT64:
       /* Invoke end_number. The accum buffer has the number's text already. */
-      if (!parse_number(p, true)) {
+      if (!parse_number(p)) {
         return false;
       }
       break;
@@ -13261,7 +10478,7 @@
       sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);
       upb_sink_putstring(&subsink, sel, buf, len, NULL);
       sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);
-      upb_sink_endstr(&p->top->sink, sel);
+      upb_sink_endstr(&subsink, sel);
       multipart_end(p);
       break;
     }
@@ -13302,7 +10519,6 @@
   sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
   upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
   inner->m = mapentrymsg;
-  inner->name_table = NULL;
   inner->mapfield = mapfield;
   inner->is_map = false;
 
@@ -13332,27 +10548,27 @@
 }
 
 static bool end_membername(upb_json_parser *p) {
-  UPB_ASSERT(!p->top->f);
+  assert(!p->top->f);
 
   if (p->top->is_map) {
     return handle_mapentry(p);
   } else {
     size_t len;
     const char *buf = accumulate_getptr(p, &len);
-    upb_value v;
+    const upb_fielddef *f = upb_msgdef_ntof(p->top->m, buf, len);
 
-    if (upb_strtable_lookup2(p->top->name_table, buf, len, &v)) {
-      p->top->f = upb_value_getconstptr(v);
-      multipart_end(p);
-
-      return true;
-    } else {
+    if (!f) {
       /* TODO(haberman): Ignore unknown fields if requested/configured to do
        * so. */
       upb_status_seterrf(&p->status, "No such field: %.*s\n", (int)len, buf);
       upb_env_reporterror(p->env, &p->status);
       return false;
     }
+
+    p->top->f = f;
+    multipart_end(p);
+
+    return true;
   }
 }
 
@@ -13364,7 +10580,7 @@
     bool ok;
     const upb_fielddef *mapfield;
 
-    UPB_ASSERT(p->top > p->stack);
+    assert(p->top > p->stack);
     /* send ENDMSG on submsg. */
     upb_sink_endmsg(&p->top->sink, &s);
     mapfield = p->top->mapfield;
@@ -13372,7 +10588,7 @@
     /* send ENDSUBMSG in repeated-field-of-mapentries frame. */
     p->top--;
     ok = upb_handlers_getselector(mapfield, UPB_HANDLER_ENDSUBMSG, &sel);
-    UPB_ASSERT(ok);
+    UPB_ASSERT_VAR(ok, ok);
     upb_sink_endsubmsg(&p->top->sink, sel);
   }
 
@@ -13380,7 +10596,7 @@
 }
 
 static bool start_subobject(upb_json_parser *p) {
-  UPB_ASSERT(p->top->f);
+  assert(p->top->f);
 
   if (upb_fielddef_ismap(p->top->f)) {
     upb_jsonparser_frame *inner;
@@ -13394,7 +10610,6 @@
     sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
     upb_sink_startseq(&p->top->sink, sel, &inner->sink);
     inner->m = upb_fielddef_msgsubdef(p->top->f);
-    inner->name_table = NULL;
     inner->mapfield = p->top->f;
     inner->f = NULL;
     inner->is_map = true;
@@ -13415,7 +10630,6 @@
     sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
     upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
     inner->m = upb_fielddef_msgsubdef(p->top->f);
-    set_name_table(p, inner);
     inner->f = NULL;
     inner->is_map = false;
     inner->is_mapentry = false;
@@ -13449,7 +10663,7 @@
   upb_jsonparser_frame *inner;
   upb_selector_t sel;
 
-  UPB_ASSERT(p->top->f);
+  assert(p->top->f);
 
   if (!upb_fielddef_isseq(p->top->f)) {
     upb_status_seterrf(&p->status,
@@ -13465,7 +10679,6 @@
   sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
   upb_sink_startseq(&p->top->sink, sel, &inner->sink);
   inner->m = p->top->m;
-  inner->name_table = NULL;
   inner->f = p->top->f;
   inner->is_map = false;
   inner->is_mapentry = false;
@@ -13477,7 +10690,7 @@
 static void end_array(upb_json_parser *p) {
   upb_selector_t sel;
 
-  UPB_ASSERT(p->top > p->stack);
+  assert(p->top > p->stack);
 
   p->top--;
   sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
@@ -13523,11 +10736,11 @@
  * final state once, when the closing '"' is seen. */
 
 
-#line 1310 "upb/json/parser.rl"
+#line 1218 "upb/json/parser.rl"
 
 
 
-#line 1222 "upb/json/parser.c"
+#line 1130 "upb/json/parser.c"
 static const char _json_actions[] = {
 	0, 1, 0, 1, 2, 1, 3, 1, 
 	5, 1, 6, 1, 7, 1, 8, 1, 
@@ -13676,7 +10889,7 @@
 static const int json_en_main = 1;
 
 
-#line 1313 "upb/json/parser.rl"
+#line 1221 "upb/json/parser.rl"
 
 size_t parse(void *closure, const void *hd, const char *buf, size_t size,
              const upb_bufhandle *handle) {
@@ -13698,7 +10911,7 @@
   capture_resume(parser, buf);
 
   
-#line 1393 "upb/json/parser.c"
+#line 1301 "upb/json/parser.c"
 	{
 	int _klen;
 	unsigned int _trans;
@@ -13773,118 +10986,118 @@
 		switch ( *_acts++ )
 		{
 	case 0:
-#line 1225 "upb/json/parser.rl"
+#line 1133 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
 	case 1:
-#line 1226 "upb/json/parser.rl"
+#line 1134 "upb/json/parser.rl"
 	{ p--; {stack[top++] = cs; cs = 10; goto _again;} }
 	break;
 	case 2:
-#line 1230 "upb/json/parser.rl"
+#line 1138 "upb/json/parser.rl"
 	{ start_text(parser, p); }
 	break;
 	case 3:
-#line 1231 "upb/json/parser.rl"
+#line 1139 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_text(parser, p)); }
 	break;
 	case 4:
-#line 1237 "upb/json/parser.rl"
+#line 1145 "upb/json/parser.rl"
 	{ start_hex(parser); }
 	break;
 	case 5:
-#line 1238 "upb/json/parser.rl"
+#line 1146 "upb/json/parser.rl"
 	{ hexdigit(parser, p); }
 	break;
 	case 6:
-#line 1239 "upb/json/parser.rl"
+#line 1147 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_hex(parser)); }
 	break;
 	case 7:
-#line 1245 "upb/json/parser.rl"
+#line 1153 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(escape(parser, p)); }
 	break;
 	case 8:
-#line 1251 "upb/json/parser.rl"
+#line 1159 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
 	case 9:
-#line 1254 "upb/json/parser.rl"
+#line 1162 "upb/json/parser.rl"
 	{ {stack[top++] = cs; cs = 19; goto _again;} }
 	break;
 	case 10:
-#line 1256 "upb/json/parser.rl"
+#line 1164 "upb/json/parser.rl"
 	{ p--; {stack[top++] = cs; cs = 27; goto _again;} }
 	break;
 	case 11:
-#line 1261 "upb/json/parser.rl"
+#line 1169 "upb/json/parser.rl"
 	{ start_member(parser); }
 	break;
 	case 12:
-#line 1262 "upb/json/parser.rl"
+#line 1170 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_membername(parser)); }
 	break;
 	case 13:
-#line 1265 "upb/json/parser.rl"
+#line 1173 "upb/json/parser.rl"
 	{ end_member(parser); }
 	break;
 	case 14:
-#line 1271 "upb/json/parser.rl"
+#line 1179 "upb/json/parser.rl"
 	{ start_object(parser); }
 	break;
 	case 15:
-#line 1274 "upb/json/parser.rl"
+#line 1182 "upb/json/parser.rl"
 	{ end_object(parser); }
 	break;
 	case 16:
-#line 1280 "upb/json/parser.rl"
+#line 1188 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_array(parser)); }
 	break;
 	case 17:
-#line 1284 "upb/json/parser.rl"
+#line 1192 "upb/json/parser.rl"
 	{ end_array(parser); }
 	break;
 	case 18:
-#line 1289 "upb/json/parser.rl"
+#line 1197 "upb/json/parser.rl"
 	{ start_number(parser, p); }
 	break;
 	case 19:
-#line 1290 "upb/json/parser.rl"
+#line 1198 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_number(parser, p)); }
 	break;
 	case 20:
-#line 1292 "upb/json/parser.rl"
+#line 1200 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_stringval(parser)); }
 	break;
 	case 21:
-#line 1293 "upb/json/parser.rl"
+#line 1201 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_stringval(parser)); }
 	break;
 	case 22:
-#line 1295 "upb/json/parser.rl"
+#line 1203 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(parser_putbool(parser, true)); }
 	break;
 	case 23:
-#line 1297 "upb/json/parser.rl"
+#line 1205 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(parser_putbool(parser, false)); }
 	break;
 	case 24:
-#line 1299 "upb/json/parser.rl"
+#line 1207 "upb/json/parser.rl"
 	{ /* null value */ }
 	break;
 	case 25:
-#line 1301 "upb/json/parser.rl"
+#line 1209 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_subobject(parser)); }
 	break;
 	case 26:
-#line 1302 "upb/json/parser.rl"
+#line 1210 "upb/json/parser.rl"
 	{ end_subobject(parser); }
 	break;
 	case 27:
-#line 1307 "upb/json/parser.rl"
+#line 1215 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
-#line 1579 "upb/json/parser.c"
+#line 1487 "upb/json/parser.c"
 		}
 	}
 
@@ -13897,10 +11110,10 @@
 	_out: {}
 	}
 
-#line 1334 "upb/json/parser.rl"
+#line 1242 "upb/json/parser.rl"
 
   if (p != pe) {
-    upb_status_seterrf(&parser->status, "Parse error at '%.*s'\n", pe - p, p);
+    upb_status_seterrf(&parser->status, "Parse error at %s\n", p);
     upb_env_reporterror(parser->env, &parser->status);
   } else {
     capture_suspend(parser, &p);
@@ -13938,13 +11151,13 @@
 
   /* Emit Ragel initialization of the parser. */
   
-#line 1633 "upb/json/parser.c"
+#line 1541 "upb/json/parser.c"
 	{
 	cs = json_start;
 	top = 0;
 	}
 
-#line 1374 "upb/json/parser.rl"
+#line 1282 "upb/json/parser.rl"
   p->current_state = cs;
   p->parser_top = top;
   accumulate_clear(p);
@@ -13954,84 +11167,10 @@
   upb_status_clear(&p->status);
 }
 
-static void visit_json_parsermethod(const upb_refcounted *r,
-                                    upb_refcounted_visit *visit,
-                                    void *closure) {
-  const upb_json_parsermethod *method = (upb_json_parsermethod*)r;
-  visit(r, upb_msgdef_upcast2(method->msg), closure);
-}
-
-static void free_json_parsermethod(upb_refcounted *r) {
-  upb_json_parsermethod *method = (upb_json_parsermethod*)r;
-
-  upb_inttable_iter i;
-  upb_inttable_begin(&i, &method->name_tables);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    upb_value val = upb_inttable_iter_value(&i);
-    upb_strtable *t = upb_value_getptr(val);
-    upb_strtable_uninit(t);
-    upb_gfree(t);
-  }
-
-  upb_inttable_uninit(&method->name_tables);
-
-  upb_gfree(r);
-}
-
-static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
-  upb_msg_field_iter i;
-  upb_strtable *t;
-
-  /* It would be nice to stack-allocate this, but protobufs do not limit the
-   * length of fields to any reasonable limit. */
-  char *buf = NULL;
-  size_t len = 0;
-
-  if (upb_inttable_lookupptr(&m->name_tables, md, NULL)) {
-    return;
-  }
-
-  /* TODO(haberman): handle malloc failure. */
-  t = upb_gmalloc(sizeof(*t));
-  upb_strtable_init(t, UPB_CTYPE_CONSTPTR);
-  upb_inttable_insertptr(&m->name_tables, md, upb_value_ptr(t));
-
-  for(upb_msg_field_begin(&i, md);
-      !upb_msg_field_done(&i);
-      upb_msg_field_next(&i)) {
-    const upb_fielddef *f = upb_msg_iter_field(&i);
-
-    /* Add an entry for the JSON name. */
-    size_t field_len = upb_fielddef_getjsonname(f, buf, len);
-    if (field_len > len) {
-      size_t len2;
-      buf = upb_grealloc(buf, 0, field_len);
-      len = field_len;
-      len2 = upb_fielddef_getjsonname(f, buf, len);
-      UPB_ASSERT(len == len2);
-    }
-    upb_strtable_insert(t, buf, upb_value_constptr(f));
-
-    if (strcmp(buf, upb_fielddef_name(f)) != 0) {
-      /* Since the JSON name is different from the regular field name, add an
-       * entry for the raw name (compliant proto3 JSON parsers must accept
-       * both). */
-      upb_strtable_insert(t, upb_fielddef_name(f), upb_value_constptr(f));
-    }
-
-    if (upb_fielddef_issubmsg(f)) {
-      add_jsonname_table(m, upb_fielddef_msgsubdef(f));
-    }
-  }
-
-  upb_gfree(buf);
-}
 
 /* Public API *****************************************************************/
 
-upb_json_parser *upb_json_parser_create(upb_env *env,
-                                        const upb_json_parsermethod *method,
-                                        upb_sink *output) {
+upb_json_parser *upb_json_parser_create(upb_env *env, upb_sink *output) {
 #ifndef NDEBUG
   const size_t size_before = upb_env_bytesallocated(env);
 #endif
@@ -14039,59 +11178,35 @@
   if (!p) return false;
 
   p->env = env;
-  p->method = method;
   p->limit = p->stack + UPB_JSON_MAX_DEPTH;
   p->accumulate_buf = NULL;
   p->accumulate_buf_size = 0;
-  upb_bytessink_reset(&p->input_, &method->input_handler_, p);
+  upb_byteshandler_init(&p->input_handler_);
+  upb_byteshandler_setstring(&p->input_handler_, parse, NULL);
+  upb_byteshandler_setendstr(&p->input_handler_, end, NULL);
+  upb_bytessink_reset(&p->input_, &p->input_handler_, p);
 
   json_parser_reset(p);
   upb_sink_reset(&p->top->sink, output->handlers, output->closure);
   p->top->m = upb_handlers_msgdef(output->handlers);
-  set_name_table(p, p->top);
 
   /* If this fails, uncomment and increase the value in parser.h. */
   /* fprintf(stderr, "%zd\n", upb_env_bytesallocated(env) - size_before); */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(env) - size_before <=
-                      UPB_JSON_PARSER_SIZE);
+  assert(upb_env_bytesallocated(env) - size_before <= UPB_JSON_PARSER_SIZE);
   return p;
 }
 
 upb_bytessink *upb_json_parser_input(upb_json_parser *p) {
   return &p->input_;
 }
-
-upb_json_parsermethod *upb_json_parsermethod_new(const upb_msgdef* md,
-                                                 const void* owner) {
-  static const struct upb_refcounted_vtbl vtbl = {visit_json_parsermethod,
-                                                  free_json_parsermethod};
-  upb_json_parsermethod *ret = upb_gmalloc(sizeof(*ret));
-  upb_refcounted_init(upb_json_parsermethod_upcast_mutable(ret), &vtbl, owner);
-
-  ret->msg = md;
-  upb_ref2(md, ret);
-
-  upb_byteshandler_init(&ret->input_handler_);
-  upb_byteshandler_setstring(&ret->input_handler_, parse, ret);
-  upb_byteshandler_setendstr(&ret->input_handler_, end, ret);
-
-  upb_inttable_init(&ret->name_tables, UPB_CTYPE_PTR);
-
-  add_jsonname_table(ret, md);
-
-  return ret;
-}
-
-const upb_byteshandler *upb_json_parsermethod_inputhandler(
-    const upb_json_parsermethod *m) {
-  return &m->input_handler_;
-}
 /*
 ** This currently uses snprintf() to format primitives, and could be optimized
 ** further.
 */
 
 
+#include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 #include <stdint.h>
 
@@ -14118,34 +11233,15 @@
 
 /* StringPiece; a pointer plus a length. */
 typedef struct {
-  char *ptr;
+  const char *ptr;
   size_t len;
 } strpc;
 
-void freestrpc(void *ptr) {
-  strpc *pc = ptr;
-  upb_gfree(pc->ptr);
-  upb_gfree(pc);
-}
-
-/* Convert fielddef name to JSON name and return as a string piece. */
-strpc *newstrpc(upb_handlers *h, const upb_fielddef *f,
-                bool preserve_fieldnames) {
-  /* TODO(haberman): handle malloc failure. */
-  strpc *ret = upb_gmalloc(sizeof(*ret));
-  if (preserve_fieldnames) {
-    ret->ptr = upb_gstrdup(upb_fielddef_name(f));
-    ret->len = strlen(ret->ptr);
-  } else {
-    size_t len;
-    ret->len = upb_fielddef_getjsonname(f, NULL, 0);
-    ret->ptr = upb_gmalloc(ret->len);
-    len = upb_fielddef_getjsonname(f, ret->ptr, ret->len);
-    UPB_ASSERT(len == ret->len);
-    ret->len--;  /* NULL */
-  }
-
-  upb_handlers_addcleanup(h, ret, freestrpc);
+strpc *newstrpc(upb_handlers *h, const upb_fielddef *f) {
+  strpc *ret = malloc(sizeof(*ret));
+  ret->ptr = upb_fielddef_name(f);
+  ret->len = strlen(ret->ptr);
+  upb_handlers_addcleanup(h, ret, free);
   return ret;
 }
 
@@ -14155,7 +11251,7 @@
     upb_json_printer *p, const char *buf, unsigned int len) {
   /* TODO: Will need to change if we support pushback from the sink. */
   size_t n = upb_bytessink_putbuf(p->output_, p->subc_, buf, len, NULL);
-  UPB_ASSERT(n == len);
+  UPB_ASSERT_VAR(n, n == len);
 }
 
 static void print_comma(upb_json_printer *p) {
@@ -14176,7 +11272,7 @@
   return uc < kControlCharLimit || uc == '"' || uc == '\\';
 }
 
-UPB_INLINE const char* json_nice_escape(char c) {
+UPB_INLINE char* json_nice_escape(char c) {
   switch (c) {
     case '"':  return "\\\"";
     case '\\': return "\\\\";
@@ -14241,23 +11337,10 @@
  * Right now we use %.8g and %.17g for float/double, respectively, to match
  * proto2::util::JsonFormat's defaults.  May want to change this later. */
 
-const char neginf[] = "\"-Infinity\"";
-const char inf[] = "\"Infinity\"";
-
 static size_t fmt_double(double val, char* buf, size_t length) {
-  if (val == (1.0 / 0.0)) {
-    CHKLENGTH(length >= strlen(inf));
-    strcpy(buf, inf);
-    return strlen(inf);
-  } else if (val == (-1.0 / 0.0)) {
-    CHKLENGTH(length >= strlen(neginf));
-    strcpy(buf, neginf);
-    return strlen(neginf);
-  } else {
-    size_t n = _upb_snprintf(buf, length, "%.17g", val);
-    CHKLENGTH(n > 0 && n < length);
-    return n;
-  }
+  size_t n = _upb_snprintf(buf, length, "%.17g", val);
+  CHKLENGTH(n > 0 && n < length);
+  return n;
 }
 
 static size_t fmt_float(float val, char* buf, size_t length) {
@@ -14518,7 +11601,7 @@
 
   while (remaining > 2) {
     /* TODO(haberman): handle encoded lengths > sizeof(data) */
-    UPB_ASSERT((limit - to) >= 4);
+    UPB_ASSERT_VAR(limit, (limit - to) >= 4);
 
     to[0] = base64[from[0] >> 2];
     to[1] = base64[((from[0] & 0x3) << 4) | (from[1] >> 4)];
@@ -14662,12 +11745,11 @@
 
 static void set_enum_hd(upb_handlers *h,
                         const upb_fielddef *f,
-                        bool preserve_fieldnames,
                         upb_handlerattr *attr) {
-  EnumHandlerData *hd = upb_gmalloc(sizeof(EnumHandlerData));
+  EnumHandlerData *hd = malloc(sizeof(EnumHandlerData));
   hd->enumdef = (const upb_enumdef *)upb_fielddef_subdef(f);
-  hd->keyname = newstrpc(h, f, preserve_fieldnames);
-  upb_handlers_addcleanup(h, hd, upb_gfree);
+  hd->keyname = newstrpc(h, f);
+  upb_handlers_addcleanup(h, hd, free);
   upb_handlerattr_sethandlerdata(attr, hd);
 }
 
@@ -14683,8 +11765,7 @@
  * our sources that emit mapentry messages do so canonically (with one key
  * field, and then one value field), so this is not a pressing concern at the
  * moment. */
-void printer_sethandlers_mapentry(const void *closure, bool preserve_fieldnames,
-                                  upb_handlers *h) {
+void printer_sethandlers_mapentry(const void *closure, upb_handlers *h) {
   const upb_msgdef *md = upb_handlers_msgdef(h);
 
   /* A mapentry message is printed simply as '"key": value'. Rather than
@@ -14722,7 +11803,7 @@
       upb_handlers_setstring(h, key_field, mapkey_bytes, &empty_attr);
       break;
     default:
-      UPB_ASSERT(false);
+      assert(false);
       break;
   }
 
@@ -14758,7 +11839,7 @@
       break;
     case UPB_TYPE_ENUM: {
       upb_handlerattr enum_attr = UPB_HANDLERATTR_INITIALIZER;
-      set_enum_hd(h, value_field, preserve_fieldnames, &enum_attr);
+      set_enum_hd(h, value_field, &enum_attr);
       upb_handlers_setint32(h, value_field, mapvalue_enum, &enum_attr);
       upb_handlerattr_uninit(&enum_attr);
       break;
@@ -14777,13 +11858,13 @@
   bool is_mapentry = upb_msgdef_mapentry(md);
   upb_handlerattr empty_attr = UPB_HANDLERATTR_INITIALIZER;
   upb_msg_field_iter i;
-  const bool *preserve_fieldnames_ptr = closure;
-  const bool preserve_fieldnames = *preserve_fieldnames_ptr;
+
+  UPB_UNUSED(closure);
 
   if (is_mapentry) {
     /* mapentry messages are sufficiently different that we handle them
      * separately. */
-    printer_sethandlers_mapentry(closure, preserve_fieldnames, h);
+    printer_sethandlers_mapentry(closure, h);
     return;
   }
 
@@ -14804,8 +11885,7 @@
     const upb_fielddef *f = upb_msg_iter_field(&i);
 
     upb_handlerattr name_attr = UPB_HANDLERATTR_INITIALIZER;
-    upb_handlerattr_sethandlerdata(&name_attr,
-                                   newstrpc(h, f, preserve_fieldnames));
+    upb_handlerattr_sethandlerdata(&name_attr, newstrpc(h, f));
 
     if (upb_fielddef_ismap(f)) {
       upb_handlers_setstartseq(h, f, startmap, &name_attr);
@@ -14828,7 +11908,7 @@
          * option later to control this behavior, but we will wait for a real
          * need first. */
         upb_handlerattr enum_attr = UPB_HANDLERATTR_INITIALIZER;
-        set_enum_hd(h, f, preserve_fieldnames, &enum_attr);
+        set_enum_hd(h, f, &enum_attr);
 
         if (upb_fielddef_isseq(f)) {
           upb_handlers_setint32(h, f, repeated_enum, &enum_attr);
@@ -14896,8 +11976,7 @@
   upb_sink_reset(&p->input_, h, p);
 
   /* If this fails, increase the value in printer.h. */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(e) - size_before <=
-                      UPB_JSON_PRINTER_SIZE);
+  assert(upb_env_bytesallocated(e) - size_before <= UPB_JSON_PRINTER_SIZE);
   return p;
 }
 
@@ -14906,8 +11985,6 @@
 }
 
 const upb_handlers *upb_json_printer_newhandlers(const upb_msgdef *md,
-                                                 bool preserve_fieldnames,
                                                  const void *owner) {
-  return upb_handlers_newfrozen(
-      md, owner, printer_sethandlers, &preserve_fieldnames);
+  return upb_handlers_newfrozen(md, owner, printer_sethandlers, NULL);
 }
diff --git a/php/ext/google/protobuf/upb.h b/php/ext/google/protobuf/upb.h
index 10371e8..078e2a2 100644
--- a/php/ext/google/protobuf/upb.h
+++ b/php/ext/google/protobuf/upb.h
@@ -1,5 +1,70 @@
 // Amalgamated source file
 /*
+** Defs are upb's internal representation of the constructs that can appear
+** in a .proto file:
+**
+** - upb::MessageDef (upb_msgdef): describes a "message" construct.
+** - upb::FieldDef (upb_fielddef): describes a message field.
+** - upb::EnumDef (upb_enumdef): describes an enum.
+** - upb::OneofDef (upb_oneofdef): describes a oneof.
+** - upb::Def (upb_def): base class of all the others.
+**
+** TODO: definitions of services.
+**
+** Like upb_refcounted objects, defs are mutable only until frozen, and are
+** only thread-safe once frozen.
+**
+** This is a mixed C/C++ interface that offers a full API to both languages.
+** See the top-level README for more information.
+*/
+
+#ifndef UPB_DEF_H_
+#define UPB_DEF_H_
+
+/*
+** upb::RefCounted (upb_refcounted)
+**
+** A refcounting scheme that supports circular refs.  It accomplishes this by
+** partitioning the set of objects into groups such that no cycle spans groups;
+** we can then reference-count the group as a whole and ignore refs within the
+** group.  When objects are mutable, these groups are computed very
+** conservatively; we group any objects that have ever had a link between them.
+** When objects are frozen, we compute strongly-connected components which
+** allows us to be precise and only group objects that are actually cyclic.
+**
+** This is a mixed C/C++ interface that offers a full API to both languages.
+** See the top-level README for more information.
+*/
+
+#ifndef UPB_REFCOUNTED_H_
+#define UPB_REFCOUNTED_H_
+
+/*
+** upb_table
+**
+** This header is INTERNAL-ONLY!  Its interfaces are not public or stable!
+** This file defines very fast int->upb_value (inttable) and string->upb_value
+** (strtable) hash tables.
+**
+** The table uses chained scatter with Brent's variation (inspired by the Lua
+** implementation of hash tables).  The hash function for strings is Austin
+** Appleby's "MurmurHash."
+**
+** The inttable uses uintptr_t as its key, which guarantees it can be used to
+** store pointers or integers of at least 32 bits (upb isn't really useful on
+** systems where sizeof(void*) < 4).
+**
+** The table must be homogenous (all values of the same type).  In debug
+** mode, we check this on insert and lookup.
+*/
+
+#ifndef UPB_TABLE_H_
+#define UPB_TABLE_H_
+
+#include <assert.h>
+#include <stdint.h>
+#include <string.h>
+/*
 ** This file contains shared definitions that are widely used across upb.
 **
 ** This is a mixed C/C++ interface that offers a full API to both languages.
@@ -9,29 +74,11 @@
 #ifndef UPB_H_
 #define UPB_H_
 
-// php.h intentionally defined NDEBUG. We have to define this macro in order to
-// be used together with php.h
-#ifndef NDEBUG
-#define NDEBUG
-#endif
-
 #include <assert.h>
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stddef.h>
 
-#ifdef __cplusplus
-namespace upb {
-class Allocator;
-class Arena;
-class Environment;
-class ErrorSpace;
-class Status;
-template <int N> class InlinedArena;
-template <int N> class InlinedEnvironment;
-}
-#endif
-
 /* UPB_INLINE: inline if possible, emit standalone code if required. */
 #ifdef __cplusplus
 #define UPB_INLINE inline
@@ -41,9 +88,6 @@
 #define UPB_INLINE static
 #endif
 
-/* Hints to the compiler about likely/unlikely branches. */
-#define UPB_LIKELY(x) __builtin_expect((x),1)
-
 /* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler
  * doesn't provide these preprocessor symbols. */
 #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
@@ -61,21 +105,20 @@
 #define UPB_NORETURN
 #endif
 
-#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L
-/* C99/C++11 versions. */
-#include <stdio.h>
-#define _upb_snprintf snprintf
-#define _upb_vsnprintf vsnprintf
-#define _upb_va_copy(a, b) va_copy(a, b)
-#elif defined __GNUC__
 /* A few hacky workarounds for functions not in C89.
  * For internal use only!
  * TODO(haberman): fix these by including our own implementations, or finding
  * another workaround.
  */
+#ifdef __GNUC__
 #define _upb_snprintf __builtin_snprintf
 #define _upb_vsnprintf __builtin_vsnprintf
 #define _upb_va_copy(a, b) __va_copy(a, b)
+#elif __STDC_VERSION__ >= 199901L
+/* C99 versions. */
+#define _upb_snprintf snprintf
+#define _upb_vsnprintf vsnprintf
+#define _upb_va_copy(a, b) va_copy(a, b)
 #else
 #error Need implementations of [v]snprintf and va_copy
 #endif
@@ -103,7 +146,6 @@
 #define UPB_ASSERT_STDLAYOUT(type) \
   static_assert(std::is_standard_layout<type>::value, \
                 #type " must be standard layout");
-#define UPB_FINAL final
 #else  /* !defined(UPB_CXX11) */
 #define UPB_DISALLOW_COPY_AND_ASSIGN(class_name) \
   class_name(const class_name&); \
@@ -113,7 +155,6 @@
   ~class_name(); \
   UPB_DISALLOW_COPY_AND_ASSIGN(class_name)
 #define UPB_ASSERT_STDLAYOUT(type)
-#define UPB_FINAL
 #endif
 
 /* UPB_DECLARE_TYPE()
@@ -152,15 +193,13 @@
   template <>                                                     \
   class Pointer<cppname> : public PointerBase<cppname, cppbase> { \
    public:                                                        \
-    explicit Pointer(cppname* ptr)                                \
-        : PointerBase<cppname, cppbase>(ptr) {}                   \
+    explicit Pointer(cppname* ptr) : PointerBase(ptr) {}          \
   };                                                              \
   template <>                                                     \
   class Pointer<const cppname>                                    \
       : public PointerBase<const cppname, const cppbase> {        \
    public:                                                        \
-    explicit Pointer(const cppname* ptr)                          \
-        : PointerBase<const cppname, const cppbase>(ptr) {}       \
+    explicit Pointer(const cppname* ptr) : PointerBase(ptr) {}    \
   };                                                              \
   }
 
@@ -172,15 +211,13 @@
   template <>                                                                \
   class Pointer<cppname> : public PointerBase2<cppname, cppbase, cppbase2> { \
    public:                                                                   \
-    explicit Pointer(cppname* ptr)                                           \
-        : PointerBase2<cppname, cppbase, cppbase2>(ptr) {}                   \
+    explicit Pointer(cppname* ptr) : PointerBase2(ptr) {}                    \
   };                                                                         \
   template <>                                                                \
   class Pointer<const cppname>                                               \
       : public PointerBase2<const cppname, const cppbase, const cppbase2> {  \
    public:                                                                   \
-    explicit Pointer(const cppname* ptr)                                     \
-        : PointerBase2<const cppname, const cppbase, const cppbase2>(ptr) {} \
+    explicit Pointer(const cppname* ptr) : PointerBase2(ptr) {}              \
   };                                                                         \
   }
 
@@ -207,28 +244,14 @@
 
 #define UPB_UNUSED(var) (void)var
 
-/* UPB_ASSERT(): in release mode, we use the expression without letting it be
- * evaluated.  This prevents "unused variable" warnings. */
-#ifdef NDEBUG
-#define UPB_ASSERT(expr) do {} while (false && (expr))
-#else
-#define UPB_ASSERT(expr) assert(expr)
-#endif
-
-/* UPB_ASSERT_DEBUGVAR(): assert that uses functions or variables that only
- * exist in debug mode.  This turns into regular assert. */
-#define UPB_ASSERT_DEBUGVAR(expr) assert(expr)
-
-#ifdef __GNUC__
-#define UPB_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while(0)
-#else
-#define UPB_UNREACHABLE() do { assert(0); } while(0)
-#endif
+/* For asserting something about a variable when the variable is not used for
+ * anything else.  This prevents "unused variable" warnings when compiling in
+ * debug mode. */
+#define UPB_ASSERT_VAR(var, predicate) UPB_UNUSED(var); assert(predicate)
 
 /* Generic function type. */
 typedef void upb_func();
 
-
 /* C++ Casts ******************************************************************/
 
 #ifdef __cplusplus
@@ -305,29 +328,130 @@
 
 #endif
 
-/* A list of types as they are encoded on-the-wire. */
-typedef enum {
-  UPB_WIRE_TYPE_VARINT      = 0,
-  UPB_WIRE_TYPE_64BIT       = 1,
-  UPB_WIRE_TYPE_DELIMITED   = 2,
-  UPB_WIRE_TYPE_START_GROUP = 3,
-  UPB_WIRE_TYPE_END_GROUP   = 4,
-  UPB_WIRE_TYPE_32BIT       = 5
-} upb_wiretype_t;
+
+/* upb::reffed_ptr ************************************************************/
+
+#ifdef __cplusplus
+
+#include <algorithm>  /* For std::swap(). */
+
+namespace upb {
+
+/* Provides RAII semantics for upb refcounted objects.  Each reffed_ptr owns a
+ * ref on whatever object it points to (if any). */
+template <class T> class reffed_ptr {
+ public:
+  reffed_ptr() : ptr_(NULL) {}
+
+  /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */
+  template <class U>
+  reffed_ptr(U* val, const void* ref_donor = NULL)
+      : ptr_(upb::upcast(val)) {
+    if (ref_donor) {
+      assert(ptr_);
+      ptr_->DonateRef(ref_donor, this);
+    } else if (ptr_) {
+      ptr_->Ref(this);
+    }
+  }
+
+  template <class U>
+  reffed_ptr(const reffed_ptr<U>& other)
+      : ptr_(upb::upcast(other.get())) {
+    if (ptr_) ptr_->Ref(this);
+  }
+
+  ~reffed_ptr() { if (ptr_) ptr_->Unref(this); }
+
+  template <class U>
+  reffed_ptr& operator=(const reffed_ptr<U>& other) {
+    reset(other.get());
+    return *this;
+  }
+
+  reffed_ptr& operator=(const reffed_ptr& other) {
+    reset(other.get());
+    return *this;
+  }
+
+  /* TODO(haberman): add C++11 move construction/assignment for greater
+   * efficiency. */
+
+  void swap(reffed_ptr& other) {
+    if (ptr_ == other.ptr_) {
+      return;
+    }
+
+    if (ptr_) ptr_->DonateRef(this, &other);
+    if (other.ptr_) other.ptr_->DonateRef(&other, this);
+    std::swap(ptr_, other.ptr_);
+  }
+
+  T& operator*() const {
+    assert(ptr_);
+    return *ptr_;
+  }
+
+  T* operator->() const {
+    assert(ptr_);
+    return ptr_;
+  }
+
+  T* get() const { return ptr_; }
+
+  /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */
+  template <class U>
+  void reset(U* ptr = NULL, const void* ref_donor = NULL) {
+    reffed_ptr(ptr, ref_donor).swap(*this);
+  }
+
+  template <class U>
+  reffed_ptr<U> down_cast() {
+    return reffed_ptr<U>(upb::down_cast<U*>(get()));
+  }
+
+  template <class U>
+  reffed_ptr<U> dyn_cast() {
+    return reffed_ptr<U>(upb::dyn_cast<U*>(get()));
+  }
+
+  /* Plain release() is unsafe; if we were the only owner, it would leak the
+   * object.  Instead we provide this: */
+  T* ReleaseTo(const void* new_owner) {
+    T* ret = NULL;
+    ptr_->DonateRef(this, new_owner);
+    std::swap(ret, ptr_);
+    return ret;
+  }
+
+ private:
+  T* ptr_;
+};
+
+}  /* namespace upb */
+
+#endif  /* __cplusplus */
 
 
-/* upb::ErrorSpace ************************************************************/
+/* upb::Status ****************************************************************/
 
-/* A upb::ErrorSpace represents some domain of possible error values.  This lets
- * upb::Status attach specific error codes to operations, like POSIX/C errno,
- * Win32 error codes, etc.  Clients who want to know the very specific error
- * code can check the error space and then know the type of the integer code.
- *
- * NOTE: upb::ErrorSpace is currently not used and should be considered
- * experimental.  It is important primarily in cases where upb is performing
- * I/O, but upb doesn't currently have any components that do this. */
+#ifdef __cplusplus
+namespace upb {
+class ErrorSpace;
+class Status;
+}
+#endif
 
 UPB_DECLARE_TYPE(upb::ErrorSpace, upb_errorspace)
+UPB_DECLARE_TYPE(upb::Status, upb_status)
+
+/* The maximum length of an error message before it will get truncated. */
+#define UPB_STATUS_MAX_MESSAGE 128
+
+/* An error callback function is used to report errors from some component.
+ * The function can return "true" to indicate that the component should try
+ * to recover and proceed, but this is not always possible. */
+typedef bool upb_errcb_t(void *closure, const upb_status* status);
 
 #ifdef __cplusplus
 class upb::ErrorSpace {
@@ -335,68 +459,44 @@
 struct upb_errorspace {
 #endif
   const char *name;
+  /* Should the error message in the status object according to this code. */
+  void (*set_message)(upb_status* status, int code);
 };
 
-
-/* upb::Status ****************************************************************/
-
-/* upb::Status represents a success or failure status and error message.
- * It owns no resources and allocates no memory, so it should work
- * even in OOM situations. */
-UPB_DECLARE_TYPE(upb::Status, upb_status)
-
-/* The maximum length of an error message before it will get truncated. */
-#define UPB_STATUS_MAX_MESSAGE 128
-
-UPB_BEGIN_EXTERN_C
-
-const char *upb_status_errmsg(const upb_status *status);
-bool upb_ok(const upb_status *status);
-upb_errorspace *upb_status_errspace(const upb_status *status);
-int upb_status_errcode(const upb_status *status);
-
-/* Any of the functions that write to a status object allow status to be NULL,
- * to support use cases where the function's caller does not care about the
- * status message. */
-void upb_status_clear(upb_status *status);
-void upb_status_seterrmsg(upb_status *status, const char *msg);
-void upb_status_seterrf(upb_status *status, const char *fmt, ...);
-void upb_status_vseterrf(upb_status *status, const char *fmt, va_list args);
-void upb_status_copy(upb_status *to, const upb_status *from);
-
-UPB_END_EXTERN_C
-
 #ifdef __cplusplus
 
+/* Object representing a success or failure status.
+ * It owns no resources and allocates no memory, so it should work
+ * even in OOM situations. */
+
 class upb::Status {
  public:
-  Status() { upb_status_clear(this); }
+  Status();
 
   /* Returns true if there is no error. */
-  bool ok() const { return upb_ok(this); }
+  bool ok() const;
 
   /* Optional error space and code, useful if the caller wants to
    * programmatically check the specific kind of error. */
-  ErrorSpace* error_space() { return upb_status_errspace(this); }
-  int error_code() const { return upb_status_errcode(this); }
+  ErrorSpace* error_space();
+  int code() const;
 
-  /* The returned string is invalidated by any other call into the status. */
-  const char *error_message() const { return upb_status_errmsg(this); }
+  const char *error_message() const;
 
   /* The error message will be truncated if it is longer than
    * UPB_STATUS_MAX_MESSAGE-4. */
-  void SetErrorMessage(const char* msg) { upb_status_seterrmsg(this, msg); }
-  void SetFormattedErrorMessage(const char* fmt, ...) {
-    va_list args;
-    va_start(args, fmt);
-    upb_status_vseterrf(this, fmt, args);
-    va_end(args);
-  }
+  void SetErrorMessage(const char* msg);
+  void SetFormattedErrorMessage(const char* fmt, ...);
+
+  /* If there is no error message already, this will use the ErrorSpace to
+   * populate the error message for this code.  The caller can still call
+   * SetErrorMessage() to give a more specific message. */
+  void SetErrorCode(ErrorSpace* space, int code);
 
   /* Resets the status to a successful state with no message. */
-  void Clear() { upb_status_clear(this); }
+  void Clear();
 
-  void CopyFrom(const Status& other) { upb_status_copy(this, &other); }
+  void CopyFrom(const Status& other);
 
  private:
   UPB_DISALLOW_COPY_AND_ASSIGN(Status)
@@ -409,440 +509,65 @@
   int code_;
   upb_errorspace *error_space_;
 
-  /* TODO(haberman): add file/line of error? */
-
   /* Error message; NULL-terminated. */
   char msg[UPB_STATUS_MAX_MESSAGE];
 };
 
 #define UPB_STATUS_INIT {true, 0, NULL, {0}}
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-/** Built-in error spaces. ****************************************************/
+/* The returned string is invalidated by any other call into the status. */
+const char *upb_status_errmsg(const upb_status *status);
+bool upb_ok(const upb_status *status);
+upb_errorspace *upb_status_errspace(const upb_status *status);
+int upb_status_errcode(const upb_status *status);
 
-/* Errors raised by upb that we want to be able to detect programmatically. */
-typedef enum {
-  UPB_NOMEM   /* Can't reuse ENOMEM because it is POSIX, not ISO C. */
-} upb_errcode_t;
-
-extern upb_errorspace upb_upberr;
-
-void upb_upberr_setoom(upb_status *s);
-
-/* Since errno is defined by standard C, we define an error space for it in
- * core upb.  Other error spaces should be defined in other, platform-specific
- * modules. */
-
-extern upb_errorspace upb_errnoerr;
-
-
-/** upb::Allocator ************************************************************/
-
-/* A upb::Allocator is a possibly-stateful allocator object.
- *
- * It could either be an arena allocator (which doesn't require individual
- * free() calls) or a regular malloc() (which does).  The client must therefore
- * free memory unless it knows that the allocator is an arena allocator. */
-UPB_DECLARE_TYPE(upb::Allocator, upb_alloc)
-
-/* A malloc()/free() function.
- * If "size" is 0 then the function acts like free(), otherwise it acts like
- * realloc().  Only "oldsize" bytes from a previous allocation are preserved. */
-typedef void *upb_alloc_func(upb_alloc *alloc, void *ptr, size_t oldsize,
-                             size_t size);
+/* Any of the functions that write to a status object allow status to be NULL,
+ * to support use cases where the function's caller does not care about the
+ * status message. */
+void upb_status_clear(upb_status *status);
+void upb_status_seterrmsg(upb_status *status, const char *msg);
+void upb_status_seterrf(upb_status *status, const char *fmt, ...);
+void upb_status_vseterrf(upb_status *status, const char *fmt, va_list args);
+void upb_status_seterrcode(upb_status *status, upb_errorspace *space, int code);
+void upb_status_copy(upb_status *to, const upb_status *from);
 
 #ifdef __cplusplus
+}  /* extern "C" */
 
-class upb::Allocator UPB_FINAL {
- public:
-  Allocator() {}
+namespace upb {
 
- private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(Allocator)
-
- public:
-#else
-struct upb_alloc {
-#endif  /* __cplusplus */
-  upb_alloc_func *func;
-};
-
-UPB_INLINE void *upb_malloc(upb_alloc *alloc, size_t size) {
-  UPB_ASSERT(alloc);
-  return alloc->func(alloc, NULL, 0, size);
+/* C++ Wrappers */
+inline Status::Status() { Clear(); }
+inline bool Status::ok() const { return upb_ok(this); }
+inline const char* Status::error_message() const {
+  return upb_status_errmsg(this);
+}
+inline void Status::SetErrorMessage(const char* msg) {
+  upb_status_seterrmsg(this, msg);
+}
+inline void Status::SetFormattedErrorMessage(const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+  upb_status_vseterrf(this, fmt, args);
+  va_end(args);
+}
+inline void Status::SetErrorCode(ErrorSpace* space, int code) {
+  upb_status_seterrcode(this, space, code);
+}
+inline void Status::Clear() { upb_status_clear(this); }
+inline void Status::CopyFrom(const Status& other) {
+  upb_status_copy(this, &other);
 }
 
-UPB_INLINE void *upb_realloc(upb_alloc *alloc, void *ptr, size_t oldsize,
-                             size_t size) {
-  UPB_ASSERT(alloc);
-  return alloc->func(alloc, ptr, oldsize, size);
-}
+}  /* namespace upb */
 
-UPB_INLINE void upb_free(upb_alloc *alloc, void *ptr) {
-  assert(alloc);
-  alloc->func(alloc, ptr, 0, 0);
-}
-
-/* The global allocator used by upb.  Uses the standard malloc()/free(). */
-
-extern upb_alloc upb_alloc_global;
-
-/* Functions that hard-code the global malloc.
- *
- * We still get benefit because we can put custom logic into our global
- * allocator, like injecting out-of-memory faults in debug/testing builds. */
-
-UPB_INLINE void *upb_gmalloc(size_t size) {
-  return upb_malloc(&upb_alloc_global, size);
-}
-
-UPB_INLINE void *upb_grealloc(void *ptr, size_t oldsize, size_t size) {
-  return upb_realloc(&upb_alloc_global, ptr, oldsize, size);
-}
-
-UPB_INLINE void upb_gfree(void *ptr) {
-  upb_free(&upb_alloc_global, ptr);
-}
-
-/* upb::Arena *****************************************************************/
-
-/* upb::Arena is a specific allocator implementation that uses arena allocation.
- * The user provides an allocator that will be used to allocate the underlying
- * arena blocks.  Arenas by nature do not require the individual allocations
- * to be freed.  However the Arena does allow users to register cleanup
- * functions that will run when the arena is destroyed.
- *
- * A upb::Arena is *not* thread-safe.
- *
- * You could write a thread-safe arena allocator that satisfies the
- * upb::Allocator interface, but it would not be as efficient for the
- * single-threaded case. */
-UPB_DECLARE_TYPE(upb::Arena, upb_arena)
-
-typedef void upb_cleanup_func(void *ud);
-
-#define UPB_ARENA_BLOCK_OVERHEAD (sizeof(size_t)*4)
-
-UPB_BEGIN_EXTERN_C
-
-void upb_arena_init(upb_arena *a);
-void upb_arena_init2(upb_arena *a, void *mem, size_t n, upb_alloc *alloc);
-void upb_arena_uninit(upb_arena *a);
-bool upb_arena_addcleanup(upb_arena *a, upb_cleanup_func *func, void *ud);
-size_t upb_arena_bytesallocated(const upb_arena *a);
-void upb_arena_setnextblocksize(upb_arena *a, size_t size);
-void upb_arena_setmaxblocksize(upb_arena *a, size_t size);
-UPB_INLINE upb_alloc *upb_arena_alloc(upb_arena *a) { return (upb_alloc*)a; }
-
-UPB_END_EXTERN_C
-
-#ifdef __cplusplus
-
-class upb::Arena {
- public:
-  /* A simple arena with no initial memory block and the default allocator. */
-  Arena() { upb_arena_init(this); }
-
-  /* Constructs an arena with the given initial block which allocates blocks
-   * with the given allocator.  The given allocator must outlive the Arena.
-   *
-   * If you pass NULL for the allocator it will default to the global allocator
-   * upb_alloc_global, and NULL/0 for the initial block will cause there to be
-   * no initial block. */
-  Arena(void *mem, size_t len, Allocator* a) {
-    upb_arena_init2(this, mem, len, a);
-  }
-
-  ~Arena() { upb_arena_uninit(this); }
-
-  /* Sets the size of the next block the Arena will request (unless the
-   * requested allocation is larger).  Each block will double in size until the
-   * max limit is reached. */
-  void SetNextBlockSize(size_t size) { upb_arena_setnextblocksize(this, size); }
-
-  /* Sets the maximum block size.  No blocks larger than this will be requested
-   * from the underlying allocator unless individual arena allocations are
-   * larger. */
-  void SetMaxBlockSize(size_t size) { upb_arena_setmaxblocksize(this, size); }
-
-  /* Allows this arena to be used as a generic allocator.
-   *
-   * The arena does not need free() calls so when using Arena as an allocator
-   * it is safe to skip them.  However they are no-ops so there is no harm in
-   * calling free() either. */
-  Allocator* allocator() { return upb_arena_alloc(this); }
-
-  /* Add a cleanup function to run when the arena is destroyed.
-   * Returns false on out-of-memory. */
-  bool AddCleanup(upb_cleanup_func* func, void* ud) {
-    return upb_arena_addcleanup(this, func, ud);
-  }
-
-  /* Total number of bytes that have been allocated.  It is undefined what
-   * Realloc() does to this counter. */
-  size_t BytesAllocated() const {
-    return upb_arena_bytesallocated(this);
-  }
-
- private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(Arena)
-
-#else
-struct upb_arena {
-#endif  /* __cplusplus */
-  /* We implement the allocator interface.
-   * This must be the first member of upb_arena! */
-  upb_alloc alloc;
-
-  /* Allocator to allocate arena blocks.  We are responsible for freeing these
-   * when we are destroyed. */
-  upb_alloc *block_alloc;
-
-  size_t bytes_allocated;
-  size_t next_block_size;
-  size_t max_block_size;
-
-  /* Linked list of blocks.  Points to an arena_block, defined in env.c */
-  void *block_head;
-
-  /* Cleanup entries.  Pointer to a cleanup_ent, defined in env.c */
-  void *cleanup_head;
-
-  /* For future expansion, since the size of this struct is exposed to users. */
-  void *future1;
-  void *future2;
-};
-
-
-/* upb::Environment ***********************************************************/
-
-/* A upb::Environment provides a means for injecting malloc and an
- * error-reporting callback into encoders/decoders.  This allows them to be
- * independent of nearly all assumptions about their actual environment.
- *
- * It is also a container for allocating the encoders/decoders themselves that
- * insulates clients from knowing their actual size.  This provides ABI
- * compatibility even if the size of the objects change.  And this allows the
- * structure definitions to be in the .c files instead of the .h files, making
- * the .h files smaller and more readable.
- *
- * We might want to consider renaming this to "Pipeline" if/when the concept of
- * a pipeline element becomes more formalized. */
-UPB_DECLARE_TYPE(upb::Environment, upb_env)
-
-/* A function that receives an error report from an encoder or decoder.  The
- * callback can return true to request that the error should be recovered, but
- * if the error is not recoverable this has no effect. */
-typedef bool upb_error_func(void *ud, const upb_status *status);
-
-UPB_BEGIN_EXTERN_C
-
-void upb_env_init(upb_env *e);
-void upb_env_init2(upb_env *e, void *mem, size_t n, upb_alloc *alloc);
-void upb_env_uninit(upb_env *e);
-
-void upb_env_initonly(upb_env *e);
-
-UPB_INLINE upb_arena *upb_env_arena(upb_env *e) { return (upb_arena*)e; }
-bool upb_env_ok(const upb_env *e);
-void upb_env_seterrorfunc(upb_env *e, upb_error_func *func, void *ud);
-
-/* Convenience wrappers around the methods of the contained arena. */
-void upb_env_reporterrorsto(upb_env *e, upb_status *s);
-bool upb_env_reporterror(upb_env *e, const upb_status *s);
-void *upb_env_malloc(upb_env *e, size_t size);
-void *upb_env_realloc(upb_env *e, void *ptr, size_t oldsize, size_t size);
-void upb_env_free(upb_env *e, void *ptr);
-bool upb_env_addcleanup(upb_env *e, upb_cleanup_func *func, void *ud);
-size_t upb_env_bytesallocated(const upb_env *e);
-
-UPB_END_EXTERN_C
-
-#ifdef __cplusplus
-
-class upb::Environment {
- public:
-  /* The given Arena must outlive this environment. */
-  Environment() { upb_env_initonly(this); }
-
-  Environment(void *mem, size_t len, Allocator *a) : arena_(mem, len, a) {
-    upb_env_initonly(this);
-  }
-
-  Arena* arena() { return upb_env_arena(this); }
-
-  /* Set a custom error reporting function. */
-  void SetErrorFunction(upb_error_func* func, void* ud) {
-    upb_env_seterrorfunc(this, func, ud);
-  }
-
-  /* Set the error reporting function to simply copy the status to the given
-   * status and abort. */
-  void ReportErrorsTo(Status* status) { upb_env_reporterrorsto(this, status); }
-
-  /* Returns true if all allocations and AddCleanup() calls have succeeded,
-   * and no errors were reported with ReportError() (except ones that recovered
-   * successfully). */
-  bool ok() const { return upb_env_ok(this); }
-
-  /* Reports an error to this environment's callback, returning true if
-   * the caller should try to recover. */
-  bool ReportError(const Status* status) {
-    return upb_env_reporterror(this, status);
-  }
-
- private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(Environment)
-
-#else
-struct upb_env {
-#endif  /* __cplusplus */
-  upb_arena arena_;
-  upb_error_func *error_func_;
-  void *error_ud_;
-  bool ok_;
-};
-
-
-/* upb::InlinedArena **********************************************************/
-/* upb::InlinedEnvironment ****************************************************/
-
-/* upb::InlinedArena and upb::InlinedEnvironment seed their arenas with a
- * predefined amount of memory.  No heap memory will be allocated until the
- * initial block is exceeded.
- *
- * These types only exist in C++ */
-
-#ifdef __cplusplus
-
-template <int N> class upb::InlinedArena : public upb::Arena {
- public:
-  InlinedArena() : Arena(initial_block_, N, NULL) {}
-  explicit InlinedArena(Allocator* a) : Arena(initial_block_, N, a) {}
-
- private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(InlinedArena)
-
-  char initial_block_[N + UPB_ARENA_BLOCK_OVERHEAD];
-};
-
-template <int N> class upb::InlinedEnvironment : public upb::Environment {
- public:
-  InlinedEnvironment() : Environment(initial_block_, N, NULL) {}
-  explicit InlinedEnvironment(Allocator *a)
-      : Environment(initial_block_, N, a) {}
-
- private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(InlinedEnvironment)
-
-  char initial_block_[N + UPB_ARENA_BLOCK_OVERHEAD];
-};
-
-#endif  /* __cplusplus */
-
-
+#endif
 
 #endif  /* UPB_H_ */
-/*
-** upb_decode: parsing into a upb_msg using a upb_msglayout.
-*/
-
-#ifndef UPB_DECODE_H_
-#define UPB_DECODE_H_
-
-/*
-** upb::Message is a representation for protobuf messages.
-**
-** However it differs from other common representations like
-** google::protobuf::Message in one key way: it does not prescribe any
-** ownership between messages and submessages, and it relies on the
-** client to delete each message/submessage/array/map at the appropriate
-** time.
-**
-** A client can access a upb::Message without knowing anything about
-** ownership semantics, but to create or mutate a message a user needs
-** to implement the memory management themselves.
-**
-** Currently all messages, arrays, and maps store a upb_alloc* internally.
-** Mutating operations use this when they require dynamically-allocated
-** memory.  We could potentially eliminate this size overhead later by
-** letting the user flip a bit on the factory that prevents this from
-** being stored.  The user would then need to use separate functions where
-** the upb_alloc* is passed explicitly.  However for handlers to populate
-** such structures, they would need a place to store this upb_alloc* during
-** parsing; upb_handlers don't currently have a good way to accommodate this.
-**
-** TODO: UTF-8 checking?
-**/
-
-#ifndef UPB_MSG_H_
-#define UPB_MSG_H_
-
-/*
-** Defs are upb's internal representation of the constructs that can appear
-** in a .proto file:
-**
-** - upb::MessageDef (upb_msgdef): describes a "message" construct.
-** - upb::FieldDef (upb_fielddef): describes a message field.
-** - upb::FileDef (upb_filedef): describes a .proto file and its defs.
-** - upb::EnumDef (upb_enumdef): describes an enum.
-** - upb::OneofDef (upb_oneofdef): describes a oneof.
-** - upb::Def (upb_def): base class of all the others.
-**
-** TODO: definitions of services.
-**
-** Like upb_refcounted objects, defs are mutable only until frozen, and are
-** only thread-safe once frozen.
-**
-** This is a mixed C/C++ interface that offers a full API to both languages.
-** See the top-level README for more information.
-*/
-
-#ifndef UPB_DEF_H_
-#define UPB_DEF_H_
-
-/*
-** upb::RefCounted (upb_refcounted)
-**
-** A refcounting scheme that supports circular refs.  It accomplishes this by
-** partitioning the set of objects into groups such that no cycle spans groups;
-** we can then reference-count the group as a whole and ignore refs within the
-** group.  When objects are mutable, these groups are computed very
-** conservatively; we group any objects that have ever had a link between them.
-** When objects are frozen, we compute strongly-connected components which
-** allows us to be precise and only group objects that are actually cyclic.
-**
-** This is a mixed C/C++ interface that offers a full API to both languages.
-** See the top-level README for more information.
-*/
-
-#ifndef UPB_REFCOUNTED_H_
-#define UPB_REFCOUNTED_H_
-
-/*
-** upb_table
-**
-** This header is INTERNAL-ONLY!  Its interfaces are not public or stable!
-** This file defines very fast int->upb_value (inttable) and string->upb_value
-** (strtable) hash tables.
-**
-** The table uses chained scatter with Brent's variation (inspired by the Lua
-** implementation of hash tables).  The hash function for strings is Austin
-** Appleby's "MurmurHash."
-**
-** The inttable uses uintptr_t as its key, which guarantees it can be used to
-** store pointers or integers of at least 32 bits (upb isn't really useful on
-** systems where sizeof(void*) < 4).
-**
-** The table must be homogenous (all values of the same type).  In debug
-** mode, we check this on insert and lookup.
-*/
-
-#ifndef UPB_TABLE_H_
-#define UPB_TABLE_H_
-
-#include <stdint.h>
-#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -863,9 +588,7 @@
   UPB_CTYPE_CSTR     = 6,
   UPB_CTYPE_PTR      = 7,
   UPB_CTYPE_CONSTPTR = 8,
-  UPB_CTYPE_FPTR     = 9,
-  UPB_CTYPE_FLOAT    = 10,
-  UPB_CTYPE_DOUBLE   = 11
+  UPB_CTYPE_FPTR     = 9
 } upb_ctype_t;
 
 typedef struct {
@@ -884,14 +607,10 @@
 #endif
 
 /* Like strdup(), which isn't always available since it's not ANSI C. */
-char *upb_strdup(const char *s, upb_alloc *a);
+char *upb_strdup(const char *s);
 /* Variant that works with a length-delimited rather than NULL-delimited string,
  * as supported by strtable. */
-char *upb_strdup2(const char *s, size_t len, upb_alloc *a);
-
-UPB_INLINE char *upb_gstrdup(const char *s) {
-  return upb_strdup(s, &upb_alloc_global);
-}
+char *upb_strdup2(const char *s, size_t len);
 
 UPB_INLINE void _upb_value_setval(upb_value *v, uint64_t val,
                                   upb_ctype_t ctype) {
@@ -924,7 +643,7 @@
     return ret; \
   } \
   UPB_INLINE type_t upb_value_get ## name(upb_value val) { \
-    UPB_ASSERT_DEBUGVAR(val.ctype == proto_type); \
+    assert(val.ctype == proto_type); \
     return (type_t)(converter)val.val; \
   }
 
@@ -939,29 +658,6 @@
 FUNCS(fptr,     fptr,         upb_func*,    uintptr_t,  UPB_CTYPE_FPTR)
 
 #undef FUNCS
-
-UPB_INLINE void upb_value_setfloat(upb_value *val, float cval) {
-  memcpy(&val->val, &cval, sizeof(cval));
-  SET_TYPE(val->ctype, UPB_CTYPE_FLOAT);
-}
-
-UPB_INLINE void upb_value_setdouble(upb_value *val, double cval) {
-  memcpy(&val->val, &cval, sizeof(cval));
-  SET_TYPE(val->ctype, UPB_CTYPE_DOUBLE);
-}
-
-UPB_INLINE upb_value upb_value_float(float cval) {
-  upb_value ret;
-  upb_value_setfloat(&ret, cval);
-  return ret;
-}
-
-UPB_INLINE upb_value upb_value_double(double cval) {
-  upb_value ret;
-  upb_value_setdouble(&ret, cval);
-  return ret;
-}
-
 #undef SET_TYPE
 
 
@@ -1091,40 +787,14 @@
    * initialize const hash tables.  Then we cast away const when we have to.
    */
   const upb_tabent *entries;
-
-#ifndef NDEBUG
-  /* This table's allocator.  We make the user pass it in to every relevant
-   * function and only use this to check it in debug mode.  We do this solely
-   * to keep upb_table as small as possible.  This might seem slightly paranoid
-   * but the plan is to use upb_table for all map fields and extension sets in
-   * a forthcoming message representation, so there could be a lot of these.
-   * If this turns out to be too annoying later, we can change it (since this
-   * is an internal-only header file). */
-  upb_alloc *alloc;
-#endif
 } upb_table;
 
-#ifdef NDEBUG
-#  define UPB_TABLE_INIT(count, mask, ctype, size_lg2, entries) \
-     {count, mask, ctype, size_lg2, entries}
-#else
-#  ifdef UPB_DEBUG_REFS
-/* At the moment the only mutable tables we statically initialize are debug
- * ref tables. */
-#    define UPB_TABLE_INIT(count, mask, ctype, size_lg2, entries) \
-       {count, mask, ctype, size_lg2, entries, &upb_alloc_debugrefs}
-#  else
-#    define UPB_TABLE_INIT(count, mask, ctype, size_lg2, entries) \
-       {count, mask, ctype, size_lg2, entries, NULL}
-#  endif
-#endif
-
 typedef struct {
   upb_table t;
 } upb_strtable;
 
 #define UPB_STRTABLE_INIT(count, mask, ctype, size_lg2, entries) \
-  {UPB_TABLE_INIT(count, mask, ctype, size_lg2, entries)}
+  {{count, mask, ctype, size_lg2, entries}}
 
 #define UPB_EMPTY_STRTABLE_INIT(ctype)                           \
   UPB_STRTABLE_INIT(0, 0, ctype, 0, NULL)
@@ -1137,7 +807,7 @@
 } upb_inttable;
 
 #define UPB_INTTABLE_INIT(count, mask, ctype, size_lg2, ent, a, asize, acount) \
-  {UPB_TABLE_INIT(count, mask, ctype, size_lg2, ent), a, asize, acount}
+  {{count, mask, ctype, size_lg2, ent}, a, asize, acount}
 
 #define UPB_EMPTY_INTTABLE_INIT(ctype) \
   UPB_INTTABLE_INIT(0, 0, ctype, 0, NULL, NULL, 0, 0)
@@ -1177,26 +847,10 @@
 
 /* Initialize and uninitialize a table, respectively.  If memory allocation
  * failed, false is returned that the table is uninitialized. */
-bool upb_inttable_init2(upb_inttable *table, upb_ctype_t ctype, upb_alloc *a);
-bool upb_strtable_init2(upb_strtable *table, upb_ctype_t ctype, upb_alloc *a);
-void upb_inttable_uninit2(upb_inttable *table, upb_alloc *a);
-void upb_strtable_uninit2(upb_strtable *table, upb_alloc *a);
-
-UPB_INLINE bool upb_inttable_init(upb_inttable *table, upb_ctype_t ctype) {
-  return upb_inttable_init2(table, ctype, &upb_alloc_global);
-}
-
-UPB_INLINE bool upb_strtable_init(upb_strtable *table, upb_ctype_t ctype) {
-  return upb_strtable_init2(table, ctype, &upb_alloc_global);
-}
-
-UPB_INLINE void upb_inttable_uninit(upb_inttable *table) {
-  upb_inttable_uninit2(table, &upb_alloc_global);
-}
-
-UPB_INLINE void upb_strtable_uninit(upb_strtable *table) {
-  upb_strtable_uninit2(table, &upb_alloc_global);
-}
+bool upb_inttable_init(upb_inttable *table, upb_ctype_t ctype);
+bool upb_strtable_init(upb_strtable *table, upb_ctype_t ctype);
+void upb_inttable_uninit(upb_inttable *table);
+void upb_strtable_uninit(upb_strtable *table);
 
 /* Returns the number of values in the table. */
 size_t upb_inttable_count(const upb_inttable *t);
@@ -1204,13 +858,6 @@
   return t->t.count;
 }
 
-void upb_inttable_packedsize(const upb_inttable *t, size_t *size);
-void upb_strtable_packedsize(const upb_strtable *t, size_t *size);
-upb_inttable *upb_inttable_pack(const upb_inttable *t, void *p, size_t *ofs,
-                                size_t size);
-upb_strtable *upb_strtable_pack(const upb_strtable *t, void *p, size_t *ofs,
-                                size_t size);
-
 /* Inserts the given key into the hashtable with the given value.  The key must
  * not already exist in the hash table.  For string tables, the key must be
  * NULL-terminated, and the table will make an internal copy of the key.
@@ -1218,20 +865,9 @@
  *
  * If a table resize was required but memory allocation failed, false is
  * returned and the table is unchanged. */
-bool upb_inttable_insert2(upb_inttable *t, uintptr_t key, upb_value val,
-                          upb_alloc *a);
-bool upb_strtable_insert3(upb_strtable *t, const char *key, size_t len,
-                          upb_value val, upb_alloc *a);
-
-UPB_INLINE bool upb_inttable_insert(upb_inttable *t, uintptr_t key,
-                                    upb_value val) {
-  return upb_inttable_insert2(t, key, val, &upb_alloc_global);
-}
-
-UPB_INLINE bool upb_strtable_insert2(upb_strtable *t, const char *key,
-                                     size_t len, upb_value val) {
-  return upb_strtable_insert3(t, key, len, val, &upb_alloc_global);
-}
+bool upb_inttable_insert(upb_inttable *t, uintptr_t key, upb_value val);
+bool upb_strtable_insert2(upb_strtable *t, const char *key, size_t len,
+                          upb_value val);
 
 /* For NULL-terminated strings. */
 UPB_INLINE bool upb_strtable_insert(upb_strtable *t, const char *key,
@@ -1254,13 +890,8 @@
 /* Removes an item from the table.  Returns true if the remove was successful,
  * and stores the removed item in *val if non-NULL. */
 bool upb_inttable_remove(upb_inttable *t, uintptr_t key, upb_value *val);
-bool upb_strtable_remove3(upb_strtable *t, const char *key, size_t len,
-                          upb_value *val, upb_alloc *alloc);
-
-UPB_INLINE bool upb_strtable_remove2(upb_strtable *t, const char *key,
-                                     size_t len, upb_value *val) {
-  return upb_strtable_remove3(t, key, len, val, &upb_alloc_global);
-}
+bool upb_strtable_remove2(upb_strtable *t, const char *key, size_t len,
+                          upb_value *val);
 
 /* For NULL-terminated strings. */
 UPB_INLINE bool upb_strtable_remove(upb_strtable *t, const char *key,
@@ -1275,33 +906,19 @@
 
 /* Handy routines for treating an inttable like a stack.  May not be mixed with
  * other insert/remove calls. */
-bool upb_inttable_push2(upb_inttable *t, upb_value val, upb_alloc *a);
+bool upb_inttable_push(upb_inttable *t, upb_value val);
 upb_value upb_inttable_pop(upb_inttable *t);
 
-UPB_INLINE bool upb_inttable_push(upb_inttable *t, upb_value val) {
-  return upb_inttable_push2(t, val, &upb_alloc_global);
-}
-
 /* Convenience routines for inttables with pointer keys. */
-bool upb_inttable_insertptr2(upb_inttable *t, const void *key, upb_value val,
-                             upb_alloc *a);
+bool upb_inttable_insertptr(upb_inttable *t, const void *key, upb_value val);
 bool upb_inttable_removeptr(upb_inttable *t, const void *key, upb_value *val);
 bool upb_inttable_lookupptr(
     const upb_inttable *t, const void *key, upb_value *val);
 
-UPB_INLINE bool upb_inttable_insertptr(upb_inttable *t, const void *key,
-                                       upb_value val) {
-  return upb_inttable_insertptr2(t, key, val, &upb_alloc_global);
-}
-
 /* Optimizes the table for the current set of entries, for both memory use and
  * lookup time.  Client should call this after all entries have been inserted;
  * inserting more entries is legal, but will likely require a table resize. */
-void upb_inttable_compact2(upb_inttable *t, upb_alloc *a);
-
-UPB_INLINE void upb_inttable_compact(upb_inttable *t) {
-  upb_inttable_compact2(t, &upb_alloc_global);
-}
+void upb_inttable_compact(upb_inttable *t);
 
 /* A special-case inlinable version of the lookup routine for 32-bit
  * integers. */
@@ -1330,7 +947,7 @@
 }
 
 /* Exposed for testing only. */
-bool upb_strtable_resize(upb_strtable *t, size_t size_lg2, upb_alloc *a);
+bool upb_strtable_resize(upb_strtable *t, size_t size_lg2);
 
 /* Iterators ******************************************************************/
 
@@ -1375,8 +992,8 @@
 void upb_strtable_begin(upb_strtable_iter *i, const upb_strtable *t);
 void upb_strtable_next(upb_strtable_iter *i);
 bool upb_strtable_done(const upb_strtable_iter *i);
-const char *upb_strtable_iter_key(const upb_strtable_iter *i);
-size_t upb_strtable_iter_keylength(const upb_strtable_iter *i);
+const char *upb_strtable_iter_key(upb_strtable_iter *i);
+size_t upb_strtable_iter_keylength(upb_strtable_iter *i);
 upb_value upb_strtable_iter_value(const upb_strtable_iter *i);
 void upb_strtable_iter_setdone(upb_strtable_iter *i);
 bool upb_strtable_iter_isequal(const upb_strtable_iter *i1,
@@ -1429,10 +1046,7 @@
 /* #define UPB_DEBUG_REFS */
 
 #ifdef __cplusplus
-namespace upb {
-class RefCounted;
-template <class T> class reffed_ptr;
-}
+namespace upb { class RefCounted; }
 #endif
 
 UPB_DECLARE_TYPE(upb::RefCounted, upb_refcounted)
@@ -1500,12 +1114,10 @@
 };
 
 #ifdef UPB_DEBUG_REFS
-extern upb_alloc upb_alloc_debugrefs;
-#define UPB_REFCOUNT_INIT(vtbl, refs, ref2s) \
-    {&static_refcount, NULL, vtbl, 0, true, refs, ref2s}
+#define UPB_REFCOUNT_INIT(refs, ref2s) \
+    {&static_refcount, NULL, NULL, 0, true, refs, ref2s}
 #else
-#define UPB_REFCOUNT_INIT(vtbl, refs, ref2s) \
-    {&static_refcount, NULL, vtbl, 0, true}
+#define UPB_REFCOUNT_INIT(refs, ref2s) {&static_refcount, NULL, NULL, 0, true}
 #endif
 
 UPB_BEGIN_EXTERN_C
@@ -1638,111 +1250,6 @@
 }  /* namespace upb */
 #endif
 
-
-/* upb::reffed_ptr ************************************************************/
-
-#ifdef __cplusplus
-
-#include <algorithm>  /* For std::swap(). */
-
-/* Provides RAII semantics for upb refcounted objects.  Each reffed_ptr owns a
- * ref on whatever object it points to (if any). */
-template <class T> class upb::reffed_ptr {
- public:
-  reffed_ptr() : ptr_(NULL) {}
-
-  /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */
-  template <class U>
-  reffed_ptr(U* val, const void* ref_donor = NULL)
-      : ptr_(upb::upcast(val)) {
-    if (ref_donor) {
-      UPB_ASSERT(ptr_);
-      ptr_->DonateRef(ref_donor, this);
-    } else if (ptr_) {
-      ptr_->Ref(this);
-    }
-  }
-
-  template <class U>
-  reffed_ptr(const reffed_ptr<U>& other)
-      : ptr_(upb::upcast(other.get())) {
-    if (ptr_) ptr_->Ref(this);
-  }
-
-  reffed_ptr(const reffed_ptr& other)
-      : ptr_(upb::upcast(other.get())) {
-    if (ptr_) ptr_->Ref(this);
-  }
-
-  ~reffed_ptr() { if (ptr_) ptr_->Unref(this); }
-
-  template <class U>
-  reffed_ptr& operator=(const reffed_ptr<U>& other) {
-    reset(other.get());
-    return *this;
-  }
-
-  reffed_ptr& operator=(const reffed_ptr& other) {
-    reset(other.get());
-    return *this;
-  }
-
-  /* TODO(haberman): add C++11 move construction/assignment for greater
-   * efficiency. */
-
-  void swap(reffed_ptr& other) {
-    if (ptr_ == other.ptr_) {
-      return;
-    }
-
-    if (ptr_) ptr_->DonateRef(this, &other);
-    if (other.ptr_) other.ptr_->DonateRef(&other, this);
-    std::swap(ptr_, other.ptr_);
-  }
-
-  T& operator*() const {
-    UPB_ASSERT(ptr_);
-    return *ptr_;
-  }
-
-  T* operator->() const {
-    UPB_ASSERT(ptr_);
-    return ptr_;
-  }
-
-  T* get() const { return ptr_; }
-
-  /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */
-  template <class U>
-  void reset(U* ptr = NULL, const void* ref_donor = NULL) {
-    reffed_ptr(ptr, ref_donor).swap(*this);
-  }
-
-  template <class U>
-  reffed_ptr<U> down_cast() {
-    return reffed_ptr<U>(upb::down_cast<U*>(get()));
-  }
-
-  template <class U>
-  reffed_ptr<U> dyn_cast() {
-    return reffed_ptr<U>(upb::dyn_cast<U*>(get()));
-  }
-
-  /* Plain release() is unsafe; if we were the only owner, it would leak the
-   * object.  Instead we provide this: */
-  T* ReleaseTo(const void* new_owner) {
-    T* ret = NULL;
-    ptr_->DonateRef(this, new_owner);
-    std::swap(ret, ptr_);
-    return ret;
-  }
-
- private:
-  T* ptr_;
-};
-
-#endif  /* __cplusplus */
-
 #endif  /* UPB_REFCOUNT_H_ */
 
 #ifdef __cplusplus
@@ -1754,20 +1261,12 @@
 class Def;
 class EnumDef;
 class FieldDef;
-class FileDef;
 class MessageDef;
 class OneofDef;
-class SymbolTable;
 }
 #endif
 
 UPB_DECLARE_DERIVED_TYPE(upb::Def, upb::RefCounted, upb_def, upb_refcounted)
-UPB_DECLARE_DERIVED_TYPE(upb::OneofDef, upb::RefCounted, upb_oneofdef,
-                         upb_refcounted)
-UPB_DECLARE_DERIVED_TYPE(upb::FileDef, upb::RefCounted, upb_filedef,
-                         upb_refcounted)
-UPB_DECLARE_TYPE(upb::SymbolTable, upb_symtab)
-
 
 /* The maximum message depth that the type graph can have.  This is a resource
  * limit for the C stack since we sometimes need to recursively traverse the
@@ -1779,16 +1278,15 @@
 #define UPB_MAX_MESSAGE_DEPTH 64
 
 
-/* upb::Def: base class for top-level defs  ***********************************/
+/* upb::Def: base class for defs  *********************************************/
 
-/* All the different kind of defs that can be defined at the top-level and put
- * in a SymbolTable or appear in a FileDef::defs() list.  This excludes some
- * defs (like oneofs and files).  It only includes fields because they can be
- * defined as extensions. */
+/* All the different kind of defs we support.  These correspond 1:1 with
+ * declarations in a .proto file. */
 typedef enum {
   UPB_DEF_MSG,
   UPB_DEF_FIELD,
   UPB_DEF_ENUM,
+  UPB_DEF_ONEOF,
   UPB_DEF_SERVICE,   /* Not yet implemented. */
   UPB_DEF_ANY = -1   /* Wildcard for upb_symtab_get*() */
 } upb_deftype_t;
@@ -1801,6 +1299,8 @@
  public:
   typedef upb_deftype_t Type;
 
+  Def* Dup(const void *owner) const;
+
   /* upb::RefCounted methods like Ref()/Unref(). */
   UPB_REFCOUNTED_CPPMETHODS
 
@@ -1809,9 +1309,6 @@
   /* "fullname" is the def's fully-qualified name (eg. foo.bar.Message). */
   const char *full_name() const;
 
-  /* The final part of a def's name (eg. Message). */
-  const char *name() const;
-
   /* The def must be mutable.  Caller retains ownership of fullname.  Defs are
    * not required to have a name; if a def has no name when it is frozen, it
    * will remain an anonymous def.  On failure, returns false and details in "s"
@@ -1819,11 +1316,6 @@
   bool set_full_name(const char* fullname, upb::Status* s);
   bool set_full_name(const std::string &fullname, upb::Status* s);
 
-  /* The file in which this def appears.  It is not necessary to add a def to a
-   * file (and consequently the accessor may return NULL).  Set this by calling
-   * file->Add(def). */
-  FileDef* file() const;
-
   /* Freezes the given defs; this validates all constraints and marks the defs
    * as frozen (read-only).  "defs" may not contain any fielddefs, but fields
    * of any msgdefs will be frozen.
@@ -1835,7 +1327,7 @@
    *
    * After this operation succeeds, the finalized defs must only be accessed
    * through a const pointer! */
-  static bool Freeze(Def* const* defs, size_t n, Status* status);
+  static bool Freeze(Def* const* defs, int n, Status* status);
   static bool Freeze(const std::vector<Def*>& defs, Status* status);
 
  private:
@@ -1846,18 +1338,16 @@
 
 UPB_BEGIN_EXTERN_C
 
+/* Native C API. */
+upb_def *upb_def_dup(const upb_def *def, const void *owner);
+
 /* Include upb_refcounted methods like upb_def_ref()/upb_def_unref(). */
 UPB_REFCOUNTED_CMETHODS(upb_def, upb_def_upcast)
 
 upb_deftype_t upb_def_type(const upb_def *d);
 const char *upb_def_fullname(const upb_def *d);
-const char *upb_def_name(const upb_def *d);
-const upb_filedef *upb_def_file(const upb_def *d);
 bool upb_def_setfullname(upb_def *def, const char *fullname, upb_status *s);
-bool upb_def_freeze(upb_def *const *defs, size_t n, upb_status *s);
-
-/* Temporary API: for internal use only. */
-bool _upb_def_validate(upb_def *const*defs, size_t n, upb_status *s);
+bool upb_def_freeze(upb_def *const *defs, int n, upb_status *s);
 
 UPB_END_EXTERN_C
 
@@ -1906,7 +1396,7 @@
     return (upb_##lower *)def;                                             \
   }                                                                        \
   UPB_INLINE const upb_##lower *upb_downcast_##lower(const upb_def *def) { \
-    UPB_ASSERT(upb_def_type(def) == UPB_DEF_##upper);                          \
+    assert(upb_def_type(def) == UPB_DEF_##upper);                          \
     return (const upb_##lower *)def;                                       \
   }                                                                        \
   UPB_INLINE upb_##lower *upb_dyncast_##lower##_mutable(upb_def *def) {    \
@@ -1930,6 +1420,7 @@
 UPB_DECLARE_DEF_TYPE(upb::FieldDef, fielddef, FIELD)
 UPB_DECLARE_DEF_TYPE(upb::MessageDef, msgdef, MSG)
 UPB_DECLARE_DEF_TYPE(upb::EnumDef, enumdef, ENUM)
+UPB_DECLARE_DEF_TYPE(upb::OneofDef, oneofdef, ONEOF)
 
 #undef UPB_DECLARE_DEF_TYPE
 #undef UPB_DEF_CASTS
@@ -1942,19 +1433,15 @@
  * types defined in descriptor.proto, which gives INT32 and SINT32 separate
  * types (we distinguish the two with the "integer encoding" enum below). */
 typedef enum {
-  /* Types stored in 1 byte. */
-  UPB_TYPE_BOOL     = 1,
-  /* Types stored in 4 bytes. */
-  UPB_TYPE_FLOAT    = 2,
-  UPB_TYPE_INT32    = 3,
-  UPB_TYPE_UINT32   = 4,
-  UPB_TYPE_ENUM     = 5,  /* Enum values are int32. */
-  /* Types stored as pointers (probably 4 or 8 bytes). */
-  UPB_TYPE_STRING   = 6,
-  UPB_TYPE_BYTES    = 7,
-  UPB_TYPE_MESSAGE  = 8,
-  /* Types stored as 8 bytes. */
-  UPB_TYPE_DOUBLE   = 9,
+  UPB_TYPE_FLOAT    = 1,
+  UPB_TYPE_DOUBLE   = 2,
+  UPB_TYPE_BOOL     = 3,
+  UPB_TYPE_STRING   = 4,
+  UPB_TYPE_BYTES    = 5,
+  UPB_TYPE_MESSAGE  = 6,
+  UPB_TYPE_ENUM     = 7,  /* Enum values are int32. */
+  UPB_TYPE_INT32    = 8,
+  UPB_TYPE_UINT32   = 9,
   UPB_TYPE_INT64    = 10,
   UPB_TYPE_UINT64   = 11
 } upb_fieldtype_t;
@@ -1996,11 +1483,6 @@
   UPB_DESCRIPTOR_TYPE_SINT64   = 18
 } upb_descriptortype_t;
 
-typedef enum {
-  UPB_SYNTAX_PROTO2 = 2,
-  UPB_SYNTAX_PROTO3 = 3
-} upb_syntax_t;
-
 /* Maximum field number allowed for FieldDefs.  This is an inherent limit of the
  * protobuf wire format. */
 #define UPB_MAX_FIELDNUMBER ((1 << 29) - 1)
@@ -2035,6 +1517,13 @@
   /* Returns NULL if memory allocation failed. */
   static reffed_ptr<FieldDef> New();
 
+  /* Duplicates the given field, returning NULL if memory allocation failed.
+   * When a fielddef is duplicated, the subdef (if any) is made symbolic if it
+   * wasn't already.  If the subdef is set but has no name (which is possible
+   * since msgdefs are not required to have a name) the new fielddef's subdef
+   * will be unset. */
+  FieldDef* Dup(const void* owner) const;
+
   /* upb::RefCounted methods like Ref()/Unref(). */
   UPB_REFCOUNTED_CPPMETHODS
 
@@ -2048,27 +1537,6 @@
   uint32_t number() const;   /* Returns 0 if uninitialized. */
   bool is_extension() const;
 
-  /* Copies the JSON name for this field into the given buffer.  Returns the
-   * actual size of the JSON name, including the NULL terminator.  If the
-   * return value is 0, the JSON name is unset.  If the return value is
-   * greater than len, the JSON name was truncated.  The buffer is always
-   * NULL-terminated if len > 0.
-   *
-   * The JSON name always defaults to a camelCased version of the regular
-   * name.  However if the regular name is unset, the JSON name will be unset
-   * also.
-   */
-  size_t GetJsonName(char* buf, size_t len) const;
-
-  /* Convenience version of the above function which copies the JSON name
-   * into the given string, returning false if the name is not set. */
-  template <class T>
-  bool GetJsonName(T* str) {
-    str->resize(GetJsonName(NULL, 0));
-    GetJsonName(&(*str)[0], str->size());
-    return str->size() > 0;
-  }
-
   /* For UPB_TYPE_MESSAGE fields only where is_tag_delimited() == false,
    * indicates whether this field should have lazy parsing handlers that yield
    * the unparsed string for the submessage.
@@ -2089,7 +1557,7 @@
    * whatever message this field belongs to.  Guaranteed to be less than
    * f->containing_type()->field_count().  May only be accessed once the def has
    * been finalized. */
-  uint32_t index() const;
+  int index() const;
 
   /* The MessageDef to which this field belongs.
    *
@@ -2121,12 +1589,6 @@
   bool IsPrimitive() const;
   bool IsMap() const;
 
-  /* Returns whether this field explicitly represents presence.
-   *
-   * For proto2 messages: Returns true for any scalar (non-repeated) field.
-   * For proto3 messages: Returns true for scalar submessage or oneof fields. */
-  bool HasPresence() const;
-
   /* How integers are encoded.  Only meaningful for integer types.
    * Defaults to UPB_INTFMT_VARIABLE, and is reset when "type" changes. */
   IntegerFormat integer_format() const;
@@ -2228,16 +1690,6 @@
   bool set_name(const char* name, upb::Status* s);
   bool set_name(const std::string& name, upb::Status* s);
 
-  /* Sets the JSON name to the given string. */
-  /* TODO(haberman): implement.  Right now only default json_name (camelCase)
-   * is supported. */
-  bool set_json_name(const char* json_name, upb::Status* s);
-  bool set_json_name(const std::string& name, upb::Status* s);
-
-  /* Clears the JSON name. This will make it revert to its default, which is
-   * a camelCased version of the regular field name. */
-  void clear_json_name();
-
   void set_integer_format(IntegerFormat format);
   bool set_tag_delimited(bool tag_delimited, upb::Status* s);
 
@@ -2283,6 +1735,7 @@
 
 /* Native C API. */
 upb_fielddef *upb_fielddef_new(const void *owner);
+upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner);
 
 /* Include upb_refcounted methods like upb_fielddef_ref(). */
 UPB_REFCOUNTED_CMETHODS(upb_fielddef, upb_fielddef_upcast2)
@@ -2301,7 +1754,6 @@
 bool upb_fielddef_isextension(const upb_fielddef *f);
 bool upb_fielddef_lazy(const upb_fielddef *f);
 bool upb_fielddef_packed(const upb_fielddef *f);
-size_t upb_fielddef_getjsonname(const upb_fielddef *f, char *buf, size_t len);
 const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f);
 const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f);
 upb_msgdef *upb_fielddef_containingtype_mutable(upb_fielddef *f);
@@ -2314,7 +1766,6 @@
 bool upb_fielddef_isseq(const upb_fielddef *f);
 bool upb_fielddef_isprimitive(const upb_fielddef *f);
 bool upb_fielddef_ismap(const upb_fielddef *f);
-bool upb_fielddef_haspresence(const upb_fielddef *f);
 int64_t upb_fielddef_defaultint64(const upb_fielddef *f);
 int32_t upb_fielddef_defaultint32(const upb_fielddef *f);
 uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f);
@@ -2336,8 +1787,6 @@
 void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label);
 bool upb_fielddef_setnumber(upb_fielddef *f, uint32_t number, upb_status *s);
 bool upb_fielddef_setname(upb_fielddef *f, const char *name, upb_status *s);
-bool upb_fielddef_setjsonname(upb_fielddef *f, const char *name, upb_status *s);
-bool upb_fielddef_clearjsonname(upb_fielddef *f);
 bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name,
                                         upb_status *s);
 void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension);
@@ -2378,10 +1827,6 @@
 typedef upb_inttable_iter upb_msg_field_iter;
 typedef upb_strtable_iter upb_msg_oneof_iter;
 
-/* Well-known field tag numbers for map-entry messages. */
-#define UPB_MAPENTRY_KEY   1
-#define UPB_MAPENTRY_VALUE 2
-
 #ifdef __cplusplus
 
 /* Structure that describes a single .proto message type.
@@ -2397,7 +1842,6 @@
 
   /* Functionality from upb::Def. */
   const char* full_name() const;
-  const char* name() const;
   bool set_full_name(const char* fullname, Status* s);
   bool set_full_name(const std::string& fullname, Status* s);
 
@@ -2440,16 +1884,6 @@
   bool AddOneof(OneofDef* o, Status* s);
   bool AddOneof(const reffed_ptr<OneofDef>& o, Status* s);
 
-  upb_syntax_t syntax() const;
-
-  /* Returns false if we don't support this syntax value. */
-  bool set_syntax(upb_syntax_t syntax);
-
-  /* Set this to false to indicate that primitive fields should not have
-   * explicit presence information associated with them.  This will affect all
-   * fields added to this message.  Defaults to true. */
-  void SetPrimitivesHavePresence(bool have_presence);
-
   /* These return NULL if the field is not found. */
   FieldDef* FindFieldByNumber(uint32_t number);
   FieldDef* FindFieldByName(const char *name, size_t len);
@@ -2492,6 +1926,16 @@
     return FindOneofByName(str.c_str(), str.size());
   }
 
+  /* Returns a new msgdef that is a copy of the given msgdef (and a copy of all
+   * the fields) but with any references to submessages broken and replaced
+   * with just the name of the submessage.  Returns NULL if memory allocation
+   * failed.
+   *
+   * TODO(haberman): which is more useful, keeping fields resolved or
+   * unresolving them?  If there's no obvious answer, Should this functionality
+   * just be moved into symtab.c? */
+  MessageDef* Dup(const void* owner) const;
+
   /* Is this message a map entry? */
   void setmapentry(bool map_entry);
   bool mapentry() const;
@@ -2626,18 +2070,13 @@
 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status);
 
 const char *upb_msgdef_fullname(const upb_msgdef *m);
-const char *upb_msgdef_name(const upb_msgdef *m);
-int upb_msgdef_numoneofs(const upb_msgdef *m);
-upb_syntax_t upb_msgdef_syntax(const upb_msgdef *m);
+bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname, upb_status *s);
 
+upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner);
 bool upb_msgdef_addfield(upb_msgdef *m, upb_fielddef *f, const void *ref_donor,
                          upb_status *s);
 bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor,
                          upb_status *s);
-bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname, upb_status *s);
-void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry);
-bool upb_msgdef_mapentry(const upb_msgdef *m);
-bool upb_msgdef_setsyntax(upb_msgdef *m, upb_syntax_t syntax);
 
 /* Field lookup in a couple of different variations:
  *   - itof = int to field
@@ -2679,21 +2118,18 @@
   return (upb_oneofdef *)upb_msgdef_ntoo(m, name, len);
 }
 
-/* Lookup of either field or oneof by name.  Returns whether either was found.
- * If the return is true, then the found def will be set, and the non-found
- * one set to NULL. */
-bool upb_msgdef_lookupname(const upb_msgdef *m, const char *name, size_t len,
-                           const upb_fielddef **f, const upb_oneofdef **o);
+void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry);
+bool upb_msgdef_mapentry(const upb_msgdef *m);
 
-UPB_INLINE bool upb_msgdef_lookupnamez(const upb_msgdef *m, const char *name,
-                                       const upb_fielddef **f,
-                                       const upb_oneofdef **o) {
-  return upb_msgdef_lookupname(m, name, strlen(name), f, o);
-}
+/* Well-known field tag numbers for map-entry messages. */
+#define UPB_MAPENTRY_KEY   1
+#define UPB_MAPENTRY_VALUE 2
 
-/* Iteration over fields and oneofs.  For example:
- *
- * upb_msg_field_iter i;
+const upb_oneofdef *upb_msgdef_findoneof(const upb_msgdef *m,
+                                          const char *name);
+int upb_msgdef_numoneofs(const upb_msgdef *m);
+
+/* upb_msg_field_iter i;
  * for(upb_msg_field_begin(&i, m);
  *     !upb_msg_field_done(&i);
  *     upb_msg_field_next(&i)) {
@@ -2739,7 +2175,6 @@
 
   /* Functionality from upb::Def. */
   const char* full_name() const;
-  const char* name() const;
   bool set_full_name(const char* fullname, Status* s);
   bool set_full_name(const std::string& fullname, Status* s);
 
@@ -2774,6 +2209,10 @@
    * first one that was added. */
   const char* FindValueByNumber(int32_t num) const;
 
+  /* Returns a new EnumDef with all the same values.  The new EnumDef will be
+   * owned by the given owner. */
+  EnumDef* Dup(const void* owner) const;
+
   /* Iteration over name/value pairs.  The order is undefined.
    * Adding an enum val invalidates any iterators.
    *
@@ -2801,6 +2240,7 @@
 
 /* Native C API. */
 upb_enumdef *upb_enumdef_new(const void *owner);
+upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner);
 
 /* Include upb_refcounted methods like upb_enumdef_ref(). */
 UPB_REFCOUNTED_CMETHODS(upb_enumdef, upb_enumdef_upcast2)
@@ -2809,7 +2249,6 @@
 
 /* From upb_def. */
 const char *upb_enumdef_fullname(const upb_enumdef *e);
-const char *upb_enumdef_name(const upb_enumdef *e);
 bool upb_enumdef_setfullname(upb_enumdef *e, const char *fullname,
                              upb_status *s);
 
@@ -2845,14 +2284,14 @@
 
 UPB_END_EXTERN_C
 
-
 /* upb::OneofDef **************************************************************/
 
 typedef upb_inttable_iter upb_oneof_iter;
 
 #ifdef __cplusplus
 
-/* Class that represents a oneof. */
+/* Class that represents a oneof.  Its base class is upb::Def (convert with
+ * upb::upcast()). */
 class upb::OneofDef {
  public:
   /* Returns NULL if memory allocation failed. */
@@ -2861,6 +2300,9 @@
   /* upb::RefCounted methods like Ref()/Unref(). */
   UPB_REFCOUNTED_CPPMETHODS
 
+  /* Functionality from upb::Def. */
+  const char* full_name() const;
+
   /* Returns the MessageDef that owns this OneofDef. */
   const MessageDef* containing_type() const;
 
@@ -2868,7 +2310,6 @@
    * by name once added to a message def. */
   const char* name() const;
   bool set_name(const char* name, Status* s);
-  bool set_name(const std::string& name, Status* s);
 
   /* Returns the number of fields currently defined in the oneof. */
   int field_count() const;
@@ -2910,6 +2351,10 @@
   /* Looks up by tag number. */
   const FieldDef* FindFieldByNumber(uint32_t num) const;
 
+  /* Returns a new OneofDef with all the same fields. The OneofDef will be owned
+   * by the given owner. */
+  OneofDef* Dup(const void* owner) const;
+
   /* Iteration over fields.  The order is undefined. */
   class iterator : public std::iterator<std::forward_iterator_tag, FieldDef*> {
    public:
@@ -2955,16 +2400,16 @@
 
 /* Native C API. */
 upb_oneofdef *upb_oneofdef_new(const void *owner);
+upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner);
 
 /* Include upb_refcounted methods like upb_oneofdef_ref(). */
-UPB_REFCOUNTED_CMETHODS(upb_oneofdef, upb_oneofdef_upcast)
+UPB_REFCOUNTED_CMETHODS(upb_oneofdef, upb_oneofdef_upcast2)
 
 const char *upb_oneofdef_name(const upb_oneofdef *o);
+bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
+
 const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o);
 int upb_oneofdef_numfields(const upb_oneofdef *o);
-uint32_t upb_oneofdef_index(const upb_oneofdef *o);
-
-bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
 bool upb_oneofdef_addfield(upb_oneofdef *o, upb_fielddef *f,
                            const void *ref_donor,
                            upb_status *s);
@@ -2994,304 +2439,28 @@
 
 UPB_END_EXTERN_C
 
-
-/* upb::FileDef ***************************************************************/
-
-#ifdef __cplusplus
-
-/* Class that represents a .proto file with some things defined in it.
- *
- * Many users won't care about FileDefs, but they are necessary if you want to
- * read the values of file-level options. */
-class upb::FileDef {
- public:
-  /* Returns NULL if memory allocation failed. */
-  static reffed_ptr<FileDef> New();
-
-  /* upb::RefCounted methods like Ref()/Unref(). */
-  UPB_REFCOUNTED_CPPMETHODS
-
-  /* Get/set name of the file (eg. "foo/bar.proto"). */
-  const char* name() const;
-  bool set_name(const char* name, Status* s);
-  bool set_name(const std::string& name, Status* s);
-
-  /* Package name for definitions inside the file (eg. "foo.bar"). */
-  const char* package() const;
-  bool set_package(const char* package, Status* s);
-
-  /* Sets the php class prefix which is prepended to all php generated classes
-   * from this .proto. Default is empty. */
-  const char* phpprefix() const;
-  bool set_phpprefix(const char* phpprefix, Status* s);
-
-  /* Use this option to change the namespace of php generated classes. Default
-   * is empty. When this option is empty, the package name will be used for
-   * determining the namespace. */
-  const char* phpnamespace() const;
-  bool set_phpnamespace(const char* phpnamespace, Status* s);
-
-  /* Syntax for the file.  Defaults to proto2. */
-  upb_syntax_t syntax() const;
-  void set_syntax(upb_syntax_t syntax);
-
-  /* Get the list of defs from the file.  These are returned in the order that
-   * they were added to the FileDef. */
-  int def_count() const;
-  const Def* def(int index) const;
-  Def* def(int index);
-
-  /* Get the list of dependencies from the file.  These are returned in the
-   * order that they were added to the FileDef. */
-  int dependency_count() const;
-  const FileDef* dependency(int index) const;
-
-  /* Adds defs to this file.  The def must not already belong to another
-   * file.
-   *
-   * Note: this does *not* ensure that this def's name is unique in this file!
-   * Use a SymbolTable if you want to check this property.  Especially since
-   * properly checking uniqueness would require a check across *all* files
-   * (including dependencies). */
-  bool AddDef(Def* def, Status* s);
-  bool AddMessage(MessageDef* m, Status* s);
-  bool AddEnum(EnumDef* e, Status* s);
-  bool AddExtension(FieldDef* f, Status* s);
-
-  /* Adds a dependency of this file. */
-  bool AddDependency(const FileDef* file);
-
-  /* Freezes this FileDef and all messages/enums under it.  All subdefs must be
-   * resolved and all messages/enums must validate.  Returns true if this
-   * succeeded.
-   *
-   * TODO(haberman): should we care whether the file's dependencies are frozen
-   * already? */
-  bool Freeze(Status* s);
-
- private:
-  UPB_DISALLOW_POD_OPS(FileDef, upb::FileDef)
-};
-
-#endif
-
-UPB_BEGIN_EXTERN_C
-
-upb_filedef *upb_filedef_new(const void *owner);
-
-/* Include upb_refcounted methods like upb_msgdef_ref(). */
-UPB_REFCOUNTED_CMETHODS(upb_filedef, upb_filedef_upcast)
-
-const char *upb_filedef_name(const upb_filedef *f);
-const char *upb_filedef_package(const upb_filedef *f);
-const char *upb_filedef_phpprefix(const upb_filedef *f);
-const char *upb_filedef_phpnamespace(const upb_filedef *f);
-upb_syntax_t upb_filedef_syntax(const upb_filedef *f);
-size_t upb_filedef_defcount(const upb_filedef *f);
-size_t upb_filedef_depcount(const upb_filedef *f);
-const upb_def *upb_filedef_def(const upb_filedef *f, size_t i);
-const upb_filedef *upb_filedef_dep(const upb_filedef *f, size_t i);
-
-bool upb_filedef_freeze(upb_filedef *f, upb_status *s);
-bool upb_filedef_setname(upb_filedef *f, const char *name, upb_status *s);
-bool upb_filedef_setpackage(upb_filedef *f, const char *package, upb_status *s);
-bool upb_filedef_setphpprefix(upb_filedef *f, const char *phpprefix,
-                              upb_status *s);
-bool upb_filedef_setphpnamespace(upb_filedef *f, const char *phpnamespace,
-                                 upb_status *s);
-bool upb_filedef_setsyntax(upb_filedef *f, upb_syntax_t syntax, upb_status *s);
-
-bool upb_filedef_adddef(upb_filedef *f, upb_def *def, const void *ref_donor,
-                        upb_status *s);
-bool upb_filedef_adddep(upb_filedef *f, const upb_filedef *dep);
-
-UPB_INLINE bool upb_filedef_addmsg(upb_filedef *f, upb_msgdef *m,
-                                   const void *ref_donor, upb_status *s) {
-  return upb_filedef_adddef(f, upb_msgdef_upcast_mutable(m), ref_donor, s);
-}
-
-UPB_INLINE bool upb_filedef_addenum(upb_filedef *f, upb_enumdef *e,
-                                    const void *ref_donor, upb_status *s) {
-  return upb_filedef_adddef(f, upb_enumdef_upcast_mutable(e), ref_donor, s);
-}
-
-UPB_INLINE bool upb_filedef_addext(upb_filedef *file, upb_fielddef *f,
-                                   const void *ref_donor, upb_status *s) {
-  return upb_filedef_adddef(file, upb_fielddef_upcast_mutable(f), ref_donor, s);
-}
-UPB_INLINE upb_def *upb_filedef_mutabledef(upb_filedef *f, int i) {
-  return (upb_def*)upb_filedef_def(f, i);
-}
-
-UPB_END_EXTERN_C
-
-typedef struct {
- UPB_PRIVATE_FOR_CPP
-  upb_strtable_iter iter;
-  upb_deftype_t type;
-} upb_symtab_iter;
-
-#ifdef __cplusplus
-
-/* Non-const methods in upb::SymbolTable are NOT thread-safe. */
-class upb::SymbolTable {
- public:
-  /* Returns a new symbol table with a single ref owned by "owner."
-   * Returns NULL if memory allocation failed. */
-  static SymbolTable* New();
-  static void Free(upb::SymbolTable* table);
-
-  /* For all lookup functions, the returned pointer is not owned by the
-   * caller; it may be invalidated by any non-const call or unref of the
-   * SymbolTable!  To protect against this, take a ref if desired. */
-
-  /* Freezes the symbol table: prevents further modification of it.
-   * After the Freeze() operation is successful, the SymbolTable must only be
-   * accessed via a const pointer.
-   *
-   * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
-   * a necessary step in using a SymbolTable.  If you have no need for it to be
-   * immutable, there is no need to freeze it ever.  However sometimes it is
-   * useful, and SymbolTables that are statically compiled into the binary are
-   * always frozen by nature. */
-  void Freeze();
-
-  /* Resolves the given symbol using the rules described in descriptor.proto,
-   * namely:
-   *
-   *    If the name starts with a '.', it is fully-qualified.  Otherwise,
-   *    C++-like scoping rules are used to find the type (i.e. first the nested
-   *    types within this message are searched, then within the parent, on up
-   *    to the root namespace).
-   *
-   * If not found, returns NULL. */
-  const Def* Resolve(const char* base, const char* sym) const;
-
-  /* Finds an entry in the symbol table with this exact name.  If not found,
-   * returns NULL. */
-  const Def* Lookup(const char *sym) const;
-  const MessageDef* LookupMessage(const char *sym) const;
-  const EnumDef* LookupEnum(const char *sym) const;
-
-  /* TODO: introduce a C++ iterator, but make it nice and templated so that if
-   * you ask for an iterator of MessageDef the iterated elements are strongly
-   * typed as MessageDef*. */
-
-  /* Adds the given mutable defs to the symtab, resolving all symbols (including
-   * enum default values) and finalizing the defs.  Only one def per name may be
-   * in the list, and the defs may not duplicate any name already in the symtab.
-   * All defs must have a name -- anonymous defs are not allowed.  Anonymous
-   * defs can still be frozen by calling upb_def_freeze() directly.
-   *
-   * The entire operation either succeeds or fails.  If the operation fails,
-   * the symtab is unchanged, false is returned, and status indicates the
-   * error.  The caller passes a ref on all defs to the symtab (even if the
-   * operation fails).
-   *
-   * TODO(haberman): currently failure will leave the symtab unchanged, but may
-   * leave the defs themselves partially resolved.  Does this matter?  If so we
-   * could do a prepass that ensures that all symbols are resolvable and bail
-   * if not, so we don't mutate anything until we know the operation will
-   * succeed. */
-  bool Add(Def*const* defs, size_t n, void* ref_donor, Status* status);
-
-  bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
-    return Add((Def*const*)&defs[0], defs.size(), owner, status);
-  }
-
-  /* Resolves all subdefs for messages in this file and attempts to freeze the
-   * file.  If this succeeds, adds all the symbols to this SymbolTable
-   * (replacing any existing ones with the same names). */
-  bool AddFile(FileDef* file, Status* s);
-
- private:
-  UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable)
-};
-
-#endif  /* __cplusplus */
-
-UPB_BEGIN_EXTERN_C
-
-/* Native C API. */
-
-upb_symtab *upb_symtab_new();
-void upb_symtab_free(upb_symtab* s);
-const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
-                                  const char *sym);
-const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
-const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
-const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
-bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
-                    void *ref_donor, upb_status *status);
-bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status* status);
-
-/* upb_symtab_iter i;
- * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
- *     upb_symtab_next(&i)) {
- *   const upb_def *def = upb_symtab_iter_def(&i);
- *    // ...
- * }
- *
- * For C we don't have separate iterators for const and non-const.
- * It is the caller's responsibility to cast the upb_fielddef* to
- * const if the upb_msgdef* is const. */
-void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
-                      upb_deftype_t type);
-void upb_symtab_next(upb_symtab_iter *iter);
-bool upb_symtab_done(const upb_symtab_iter *iter);
-const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
-
-UPB_END_EXTERN_C
-
-#ifdef __cplusplus
-/* C++ inline wrappers. */
-namespace upb {
-inline SymbolTable* SymbolTable::New() {
-  return upb_symtab_new();
-}
-inline void SymbolTable::Free(SymbolTable* s) {
-  upb_symtab_free(s);
-}
-inline const Def *SymbolTable::Resolve(const char *base,
-                                       const char *sym) const {
-  return upb_symtab_resolve(this, base, sym);
-}
-inline const Def* SymbolTable::Lookup(const char *sym) const {
-  return upb_symtab_lookup(this, sym);
-}
-inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
-  return upb_symtab_lookupmsg(this, sym);
-}
-inline bool SymbolTable::Add(
-    Def*const* defs, size_t n, void* ref_donor, Status* status) {
-  return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
-}
-inline bool SymbolTable::AddFile(FileDef* file, Status* s) {
-  return upb_symtab_addfile(this, file, s);
-}
-}  /* namespace upb */
-#endif
-
 #ifdef __cplusplus
 
 UPB_INLINE const char* upb_safecstr(const std::string& str) {
-  UPB_ASSERT(str.size() == std::strlen(str.c_str()));
+  assert(str.size() == std::strlen(str.c_str()));
   return str.c_str();
 }
 
 /* Inline C++ wrappers. */
 namespace upb {
 
+inline Def* Def::Dup(const void* owner) const {
+  return upb_def_dup(this, owner);
+}
 inline Def::Type Def::def_type() const { return upb_def_type(this); }
 inline const char* Def::full_name() const { return upb_def_fullname(this); }
-inline const char* Def::name() const { return upb_def_name(this); }
 inline bool Def::set_full_name(const char* fullname, Status* s) {
   return upb_def_setfullname(this, fullname, s);
 }
 inline bool Def::set_full_name(const std::string& fullname, Status* s) {
   return upb_def_setfullname(this, upb_safecstr(fullname), s);
 }
-inline bool Def::Freeze(Def* const* defs, size_t n, Status* status) {
+inline bool Def::Freeze(Def* const* defs, int n, Status* status) {
   return upb_def_freeze(defs, n, status);
 }
 inline bool Def::Freeze(const std::vector<Def*>& defs, Status* status) {
@@ -3311,19 +2480,19 @@
   return upb_fielddef_checkintfmt(val);
 }
 inline FieldDef::Type FieldDef::ConvertType(int32_t val) {
-  UPB_ASSERT(CheckType(val));
+  assert(CheckType(val));
   return static_cast<FieldDef::Type>(val);
 }
 inline FieldDef::Label FieldDef::ConvertLabel(int32_t val) {
-  UPB_ASSERT(CheckLabel(val));
+  assert(CheckLabel(val));
   return static_cast<FieldDef::Label>(val);
 }
 inline FieldDef::DescriptorType FieldDef::ConvertDescriptorType(int32_t val) {
-  UPB_ASSERT(CheckDescriptorType(val));
+  assert(CheckDescriptorType(val));
   return static_cast<FieldDef::DescriptorType>(val);
 }
 inline FieldDef::IntegerFormat FieldDef::ConvertIntegerFormat(int32_t val) {
-  UPB_ASSERT(CheckIntegerFormat(val));
+  assert(CheckIntegerFormat(val));
   return static_cast<FieldDef::IntegerFormat>(val);
 }
 
@@ -3331,6 +2500,9 @@
   upb_fielddef *f = upb_fielddef_new(&f);
   return reffed_ptr<FieldDef>(f, &f);
 }
+inline FieldDef* FieldDef::Dup(const void* owner) const {
+  return upb_fielddef_dup(this, owner);
+}
 inline const char* FieldDef::full_name() const {
   return upb_fielddef_fullname(this);
 }
@@ -3355,9 +2527,6 @@
 inline bool FieldDef::is_extension() const {
   return upb_fielddef_isextension(this);
 }
-inline size_t FieldDef::GetJsonName(char* buf, size_t len) const {
-  return upb_fielddef_getjsonname(this, buf, len);
-}
 inline bool FieldDef::lazy() const {
   return upb_fielddef_lazy(this);
 }
@@ -3367,9 +2536,6 @@
 inline bool FieldDef::packed() const {
   return upb_fielddef_packed(this);
 }
-inline uint32_t FieldDef::index() const {
-  return upb_fielddef_index(this);
-}
 inline void FieldDef::set_packed(bool packed) {
   upb_fielddef_setpacked(this, packed);
 }
@@ -3391,15 +2557,6 @@
 inline bool FieldDef::set_name(const std::string& name, Status* s) {
   return upb_fielddef_setname(this, upb_safecstr(name), s);
 }
-inline bool FieldDef::set_json_name(const char *name, Status* s) {
-  return upb_fielddef_setjsonname(this, name, s);
-}
-inline bool FieldDef::set_json_name(const std::string& name, Status* s) {
-  return upb_fielddef_setjsonname(this, upb_safecstr(name), s);
-}
-inline void FieldDef::clear_json_name() {
-  upb_fielddef_clearjsonname(this);
-}
 inline bool FieldDef::set_containing_type_name(const char *name, Status* s) {
   return upb_fielddef_setcontainingtypename(this, name, s);
 }
@@ -3514,21 +2671,12 @@
 inline const char *MessageDef::full_name() const {
   return upb_msgdef_fullname(this);
 }
-inline const char *MessageDef::name() const {
-  return upb_msgdef_name(this);
-}
-inline upb_syntax_t MessageDef::syntax() const {
-  return upb_msgdef_syntax(this);
-}
 inline bool MessageDef::set_full_name(const char* fullname, Status* s) {
   return upb_msgdef_setfullname(this, fullname, s);
 }
 inline bool MessageDef::set_full_name(const std::string& fullname, Status* s) {
   return upb_msgdef_setfullname(this, upb_safecstr(fullname), s);
 }
-inline bool MessageDef::set_syntax(upb_syntax_t syntax) {
-  return upb_msgdef_setsyntax(this, syntax);
-}
 inline bool MessageDef::Freeze(Status* status) {
   return upb_msgdef_freeze(this, status);
 }
@@ -3570,6 +2718,9 @@
                                                    size_t len) const {
   return upb_msgdef_ntoo(this, name, len);
 }
+inline MessageDef* MessageDef::Dup(const void *owner) const {
+  return upb_msgdef_dup(this, owner);
+}
 inline void MessageDef::setmapentry(bool map_entry) {
   upb_msgdef_setmapentry(this, map_entry);
 }
@@ -3707,9 +2858,6 @@
 inline const char* EnumDef::full_name() const {
   return upb_enumdef_fullname(this);
 }
-inline const char* EnumDef::name() const {
-  return upb_enumdef_name(this);
-}
 inline bool EnumDef::set_full_name(const char* fullname, Status* s) {
   return upb_enumdef_setfullname(this, fullname, s);
 }
@@ -3739,6 +2887,9 @@
 inline const char* EnumDef::FindValueByNumber(int32_t num) const {
   return upb_enumdef_iton(this, num);
 }
+inline EnumDef* EnumDef::Dup(const void* owner) const {
+  return upb_enumdef_dup(this, owner);
+}
 
 inline EnumDef::Iterator::Iterator(const EnumDef* e) {
   upb_enum_begin(&iter_, e);
@@ -3756,6 +2907,9 @@
   upb_oneofdef *o = upb_oneofdef_new(&o);
   return reffed_ptr<OneofDef>(o, &o);
 }
+inline const char* OneofDef::full_name() const {
+  return upb_oneofdef_name(this);
+}
 
 inline const MessageDef* OneofDef::containing_type() const {
   return upb_oneofdef_containingtype(this);
@@ -3766,9 +2920,6 @@
 inline bool OneofDef::set_name(const char* name, Status* s) {
   return upb_oneofdef_setname(this, name, s);
 }
-inline bool OneofDef::set_name(const std::string& name, Status* s) {
-  return upb_oneofdef_setname(this, upb_safecstr(name), s);
-}
 inline int OneofDef::field_count() const {
   return upb_oneofdef_numfields(this);
 }
@@ -3837,74 +2988,181 @@
   return !(*this == other);
 }
 
-inline reffed_ptr<FileDef> FileDef::New() {
-  upb_filedef *f = upb_filedef_new(&f);
-  return reffed_ptr<FileDef>(f, &f);
-}
-
-inline const char* FileDef::name() const {
-  return upb_filedef_name(this);
-}
-inline bool FileDef::set_name(const char* name, Status* s) {
-  return upb_filedef_setname(this, name, s);
-}
-inline bool FileDef::set_name(const std::string& name, Status* s) {
-  return upb_filedef_setname(this, upb_safecstr(name), s);
-}
-inline const char* FileDef::package() const {
-  return upb_filedef_package(this);
-}
-inline bool FileDef::set_package(const char* package, Status* s) {
-  return upb_filedef_setpackage(this, package, s);
-}
-inline const char* FileDef::phpprefix() const {
-  return upb_filedef_phpprefix(this);
-}
-inline bool FileDef::set_phpprefix(const char* phpprefix, Status* s) {
-  return upb_filedef_setphpprefix(this, phpprefix, s);
-}
-inline const char* FileDef::phpnamespace() const {
-  return upb_filedef_phpnamespace(this);
-}
-inline bool FileDef::set_phpnamespace(const char* phpnamespace, Status* s) {
-  return upb_filedef_setphpnamespace(this, phpnamespace, s);
-}
-inline int FileDef::def_count() const {
-  return upb_filedef_defcount(this);
-}
-inline const Def* FileDef::def(int index) const {
-  return upb_filedef_def(this, index);
-}
-inline Def* FileDef::def(int index) {
-  return const_cast<Def*>(upb_filedef_def(this, index));
-}
-inline int FileDef::dependency_count() const {
-  return upb_filedef_depcount(this);
-}
-inline const FileDef* FileDef::dependency(int index) const {
-  return upb_filedef_dep(this, index);
-}
-inline bool FileDef::AddDef(Def* def, Status* s) {
-  return upb_filedef_adddef(this, def, NULL, s);
-}
-inline bool FileDef::AddMessage(MessageDef* m, Status* s) {
-  return upb_filedef_addmsg(this, m, NULL, s);
-}
-inline bool FileDef::AddEnum(EnumDef* e, Status* s) {
-  return upb_filedef_addenum(this, e, NULL, s);
-}
-inline bool FileDef::AddExtension(FieldDef* f, Status* s) {
-  return upb_filedef_addext(this, f, NULL, s);
-}
-inline bool FileDef::AddDependency(const FileDef* file) {
-  return upb_filedef_adddep(this, file);
-}
-
 }  /* namespace upb */
 #endif
 
 #endif /* UPB_DEF_H_ */
 /*
+** This file contains definitions of structs that should be considered private
+** and NOT stable across versions of upb.
+**
+** The only reason they are declared here and not in .c files is to allow upb
+** and the application (if desired) to embed statically-initialized instances
+** of structures like defs.
+**
+** If you include this file, all guarantees of ABI compatibility go out the
+** window!  Any code that includes this file needs to recompile against the
+** exact same version of upb that they are linking against.
+**
+** You also need to recompile if you change the value of the UPB_DEBUG_REFS
+** flag.
+*/
+
+
+#ifndef UPB_STATICINIT_H_
+#define UPB_STATICINIT_H_
+
+#ifdef __cplusplus
+/* Because of how we do our typedefs, this header can't be included from C++. */
+#error This file cannot be included from C++
+#endif
+
+/* upb_refcounted *************************************************************/
+
+
+/* upb_def ********************************************************************/
+
+struct upb_def {
+  upb_refcounted base;
+
+  const char *fullname;
+  char type;  /* A upb_deftype_t (char to save space) */
+
+  /* Used as a flag during the def's mutable stage.  Must be false unless
+   * it is currently being used by a function on the stack.  This allows
+   * us to easily determine which defs were passed into the function's
+   * current invocation. */
+  bool came_from_user;
+};
+
+#define UPB_DEF_INIT(name, type, refs, ref2s) \
+    { UPB_REFCOUNT_INIT(refs, ref2s), name, type, false }
+
+
+/* upb_fielddef ***************************************************************/
+
+struct upb_fielddef {
+  upb_def base;
+
+  union {
+    int64_t sint;
+    uint64_t uint;
+    double dbl;
+    float flt;
+    void *bytes;
+  } defaultval;
+  union {
+    const upb_msgdef *def;  /* If !msg_is_symbolic. */
+    char *name;             /* If msg_is_symbolic. */
+  } msg;
+  union {
+    const upb_def *def;  /* If !subdef_is_symbolic. */
+    char *name;          /* If subdef_is_symbolic. */
+  } sub;  /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
+  bool subdef_is_symbolic;
+  bool msg_is_symbolic;
+  const upb_oneofdef *oneof;
+  bool default_is_string;
+  bool type_is_set_;     /* False until type is explicitly set. */
+  bool is_extension_;
+  bool lazy_;
+  bool packed_;
+  upb_intfmt_t intfmt;
+  bool tagdelim;
+  upb_fieldtype_t type_;
+  upb_label_t label_;
+  uint32_t number_;
+  uint32_t selector_base;  /* Used to index into a upb::Handlers table. */
+  uint32_t index_;
+};
+
+#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy,   \
+                          packed, name, num, msgdef, subdef, selector_base,    \
+                          index, defaultval, refs, ref2s)                      \
+  {                                                                            \
+    UPB_DEF_INIT(name, UPB_DEF_FIELD, refs, ref2s), defaultval, {msgdef},      \
+        {subdef}, NULL, false, false,                                          \
+        type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
+        lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
+  }
+
+
+/* upb_msgdef *****************************************************************/
+
+struct upb_msgdef {
+  upb_def base;
+
+  size_t selector_count;
+  uint32_t submsg_field_count;
+
+  /* Tables for looking up fields by number and name. */
+  upb_inttable itof;  /* int to field */
+  upb_strtable ntof;  /* name to field */
+
+  /* Tables for looking up oneofs by name. */
+  upb_strtable ntoo;  /* name to oneof */
+
+  /* Is this a map-entry message?
+   * TODO: set this flag properly for static descriptors; regenerate
+   * descriptor.upb.c. */
+  bool map_entry;
+
+  /* TODO(haberman): proper extension ranges (there can be multiple). */
+};
+
+/* TODO: also support static initialization of the oneofs table. This will be
+ * needed if we compile in descriptors that contain oneofs. */
+#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
+                        refs, ref2s)                                          \
+  {                                                                           \
+    UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count,             \
+        submsg_field_count, itof, ntof,                                       \
+        UPB_EMPTY_STRTABLE_INIT(UPB_CTYPE_PTR), false                         \
+  }
+
+
+/* upb_enumdef ****************************************************************/
+
+struct upb_enumdef {
+  upb_def base;
+
+  upb_strtable ntoi;
+  upb_inttable iton;
+  int32_t defaultval;
+};
+
+#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
+  { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntoi, iton, defaultval }
+
+
+/* upb_oneofdef ***************************************************************/
+
+struct upb_oneofdef {
+  upb_def base;
+
+  upb_strtable ntof;
+  upb_inttable itof;
+  const upb_msgdef *parent;
+};
+
+#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
+  { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntof, itof }
+
+
+/* upb_symtab *****************************************************************/
+
+struct upb_symtab {
+  upb_refcounted base;
+
+  upb_strtable symtab;
+};
+
+#define UPB_SYMTAB_INIT(symtab, refs, ref2s) \
+  { UPB_REFCOUNT_INIT(refs, ref2s), symtab }
+
+
+#endif  /* UPB_STATICINIT_H_ */
+/*
 ** upb::Handlers (upb_handlers)
 **
 ** A upb_handlers is like a virtual table for a upb_msgdef.  Each field of the
@@ -4008,8 +3266,7 @@
 /* Static selectors for upb::Handlers. */
 #define UPB_STARTMSG_SELECTOR 0
 #define UPB_ENDMSG_SELECTOR 1
-#define UPB_UNKNOWN_SELECTOR 2
-#define UPB_STATIC_SELECTOR_COUNT 3
+#define UPB_STATIC_SELECTOR_COUNT 2
 
 /* Static selectors for upb::BytesHandler. */
 #define UPB_STARTSTR_SELECTOR 0
@@ -4516,7 +3773,7 @@
   void AddCleanup(Handlers* h) const {
     if (cleanup_func_) {
       bool ok = h->AddCleanup(cleanup_data_, cleanup_func_);
-      UPB_ASSERT(ok);
+      UPB_ASSERT_VAR(ok, ok);
     }
   }
 
@@ -4538,8 +3795,6 @@
 /* Native C API. */
 
 /* Handler function typedefs. */
-typedef bool upb_unknown_handlerfunc(void *c, const void *hd, const char *buf,
-                                     size_t n);
 typedef bool upb_startmsg_handlerfunc(void *c, const void*);
 typedef bool upb_endmsg_handlerfunc(void *c, const void *, upb_status *status);
 typedef void* upb_startfield_handlerfunc(void *c, const void *hd);
@@ -4593,8 +3848,6 @@
 void upb_handlers_clearerr(upb_handlers *h);
 const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h);
 bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *hfree);
-bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func,
-                             upb_handlerattr *attr);
 
 bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,
                               upb_handlerattr *attr);
@@ -5540,7 +4793,7 @@
   inline bool Handlers::SetValueHandler<vtype>(                                \
       const FieldDef *f,                                                       \
       const Handlers::utype ## Handler& handler) {                             \
-    UPB_ASSERT(!handler.registered_);                                              \
+    assert(!handler.registered_);                                              \
     handler.AddCleanup(this);                                                  \
     handler.registered_ = true;                                                \
     return upb_handlers_set##ltype(this, f, handler.handler_, &handler.attr_); \
@@ -5652,7 +4905,7 @@
 
 template <class T>
 inline Handler<T>::~Handler() {
-  UPB_ASSERT(registered_);
+  assert(registered_);
 }
 
 inline HandlerAttributes::HandlerAttributes() { upb_handlerattr_init(this); }
@@ -5738,63 +4991,63 @@
 }
 inline bool Handlers::SetStartMessageHandler(
     const Handlers::StartMessageHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartmsg(this, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndMessageHandler(
     const Handlers::EndMessageHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendmsg(this, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStartStringHandler(const FieldDef *f,
                                             const StartStringHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartstr(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndStringHandler(const FieldDef *f,
                                           const EndFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendstr(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStringHandler(const FieldDef *f,
                                        const StringHandler& handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstring(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStartSequenceHandler(
     const FieldDef *f, const StartFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartseq(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStartSubMessageHandler(
     const FieldDef *f, const StartFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartsubmsg(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndSubMessageHandler(const FieldDef *f,
                                               const EndFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendsubmsg(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndSequenceHandler(const FieldDef *f,
                                             const EndFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendseq(this, f, handler.handler_, &handler.attr_);
@@ -5849,6 +5102,267 @@
 
 #endif  /* UPB_HANDLERS_H */
 /*
+** upb::Environment (upb_env)
+**
+** A upb::Environment provides a means for injecting malloc and an
+** error-reporting callback into encoders/decoders.  This allows them to be
+** independent of nearly all assumptions about their actual environment.
+**
+** It is also a container for allocating the encoders/decoders themselves that
+** insulates clients from knowing their actual size.  This provides ABI
+** compatibility even if the size of the objects change.  And this allows the
+** structure definitions to be in the .c files instead of the .h files, making
+** the .h files smaller and more readable.
+*/
+
+
+#ifndef UPB_ENV_H_
+#define UPB_ENV_H_
+
+#ifdef __cplusplus
+namespace upb {
+class Environment;
+class SeededAllocator;
+}
+#endif
+
+UPB_DECLARE_TYPE(upb::Environment, upb_env)
+UPB_DECLARE_TYPE(upb::SeededAllocator, upb_seededalloc)
+
+typedef void *upb_alloc_func(void *ud, void *ptr, size_t oldsize, size_t size);
+typedef void upb_cleanup_func(void *ud);
+typedef bool upb_error_func(void *ud, const upb_status *status);
+
+#ifdef __cplusplus
+
+/* An environment is *not* thread-safe. */
+class upb::Environment {
+ public:
+  Environment();
+  ~Environment();
+
+  /* Set a custom memory allocation function for the environment.  May ONLY
+   * be called before any calls to Malloc()/Realloc()/AddCleanup() below.
+   * If this is not called, the system realloc() function will be used.
+   * The given user pointer "ud" will be passed to the allocation function.
+   *
+   * The allocation function will not receive corresponding "free" calls.  it
+   * must ensure that the memory is valid for the lifetime of the Environment,
+   * but it may be reclaimed any time thereafter.  The likely usage is that
+   * "ud" points to a stateful allocator, and that the allocator frees all
+   * memory, arena-style, when it is destroyed.  In this case the allocator must
+   * outlive the Environment.  Another possibility is that the allocation
+   * function returns GC-able memory that is guaranteed to be GC-rooted for the
+   * life of the Environment. */
+  void SetAllocationFunction(upb_alloc_func* alloc, void* ud);
+
+  template<class T>
+  void SetAllocator(T* allocator) {
+    SetAllocationFunction(allocator->GetAllocationFunction(), allocator);
+  }
+
+  /* Set a custom error reporting function. */
+  void SetErrorFunction(upb_error_func* func, void* ud);
+
+  /* Set the error reporting function to simply copy the status to the given
+   * status and abort. */
+  void ReportErrorsTo(Status* status);
+
+  /* Returns true if all allocations and AddCleanup() calls have succeeded,
+   * and no errors were reported with ReportError() (except ones that recovered
+   * successfully). */
+  bool ok() const;
+
+  /* Functions for use by encoders/decoders. **********************************/
+
+  /* Reports an error to this environment's callback, returning true if
+   * the caller should try to recover. */
+  bool ReportError(const Status* status);
+
+  /* Allocate memory.  Uses the environment's allocation function.
+   *
+   * There is no need to free(). All memory will be freed automatically, but is
+   * guaranteed to outlive the Environment. */
+  void* Malloc(size_t size);
+
+  /* Reallocate memory.  Preserves "oldsize" bytes from the existing buffer
+   * Requires: oldsize <= existing_size.
+   *
+   * TODO(haberman): should we also enforce that oldsize <= size? */
+  void* Realloc(void* ptr, size_t oldsize, size_t size);
+
+  /* Add a cleanup function to run when the environment is destroyed.
+   * Returns false on out-of-memory.
+   *
+   * The first call to AddCleanup() after SetAllocationFunction() is guaranteed
+   * to return true -- this makes it possible to robustly set a cleanup handler
+   * for a custom allocation function. */
+  bool AddCleanup(upb_cleanup_func* func, void* ud);
+
+  /* Total number of bytes that have been allocated.  It is undefined what
+   * Realloc() does to this counter. */
+  size_t BytesAllocated() const;
+
+ private:
+  UPB_DISALLOW_COPY_AND_ASSIGN(Environment)
+
+#else
+struct upb_env {
+#endif  /* __cplusplus */
+
+  bool ok_;
+  size_t bytes_allocated;
+
+  /* Alloc function. */
+  upb_alloc_func *alloc;
+  void *alloc_ud;
+
+  /* Error-reporting function. */
+  upb_error_func *err;
+  void *err_ud;
+
+  /* Userdata for default alloc func. */
+  void *default_alloc_ud;
+
+  /* Cleanup entries.  Pointer to a cleanup_ent, defined in env.c */
+  void *cleanup_head;
+
+  /* For future expansion, since the size of this struct is exposed to users. */
+  void *future1;
+  void *future2;
+};
+
+UPB_BEGIN_EXTERN_C
+
+void upb_env_init(upb_env *e);
+void upb_env_uninit(upb_env *e);
+void upb_env_setallocfunc(upb_env *e, upb_alloc_func *func, void *ud);
+void upb_env_seterrorfunc(upb_env *e, upb_error_func *func, void *ud);
+void upb_env_reporterrorsto(upb_env *e, upb_status *status);
+bool upb_env_ok(const upb_env *e);
+bool upb_env_reporterror(upb_env *e, const upb_status *status);
+void *upb_env_malloc(upb_env *e, size_t size);
+void *upb_env_realloc(upb_env *e, void *ptr, size_t oldsize, size_t size);
+bool upb_env_addcleanup(upb_env *e, upb_cleanup_func *func, void *ud);
+size_t upb_env_bytesallocated(const upb_env *e);
+
+UPB_END_EXTERN_C
+
+#ifdef __cplusplus
+
+/* An allocator that allocates from an initial memory region (likely the stack)
+ * before falling back to another allocator. */
+class upb::SeededAllocator {
+ public:
+  SeededAllocator(void *mem, size_t len);
+  ~SeededAllocator();
+
+  /* Set a custom fallback memory allocation function for the allocator, to use
+   * once the initial region runs out.
+   *
+   * May ONLY be called before GetAllocationFunction().  If this is not
+   * called, the system realloc() will be the fallback allocator. */
+  void SetFallbackAllocator(upb_alloc_func *alloc, void *ud);
+
+  /* Gets the allocation function for this allocator. */
+  upb_alloc_func* GetAllocationFunction();
+
+ private:
+  UPB_DISALLOW_COPY_AND_ASSIGN(SeededAllocator)
+
+#else
+struct upb_seededalloc {
+#endif  /* __cplusplus */
+
+  /* Fallback alloc function.  */
+  upb_alloc_func *alloc;
+  upb_cleanup_func *alloc_cleanup;
+  void *alloc_ud;
+  bool need_cleanup;
+  bool returned_allocfunc;
+
+  /* Userdata for default alloc func. */
+  void *default_alloc_ud;
+
+  /* Pointers for the initial memory region. */
+  char *mem_base;
+  char *mem_ptr;
+  char *mem_limit;
+
+  /* For future expansion, since the size of this struct is exposed to users. */
+  void *future1;
+  void *future2;
+};
+
+UPB_BEGIN_EXTERN_C
+
+void upb_seededalloc_init(upb_seededalloc *a, void *mem, size_t len);
+void upb_seededalloc_uninit(upb_seededalloc *a);
+void upb_seededalloc_setfallbackalloc(upb_seededalloc *a, upb_alloc_func *func,
+                                      void *ud);
+upb_alloc_func *upb_seededalloc_getallocfunc(upb_seededalloc *a);
+
+UPB_END_EXTERN_C
+
+#ifdef __cplusplus
+
+namespace upb {
+
+inline Environment::Environment() {
+  upb_env_init(this);
+}
+inline Environment::~Environment() {
+  upb_env_uninit(this);
+}
+inline void Environment::SetAllocationFunction(upb_alloc_func *alloc,
+                                               void *ud) {
+  upb_env_setallocfunc(this, alloc, ud);
+}
+inline void Environment::SetErrorFunction(upb_error_func *func, void *ud) {
+  upb_env_seterrorfunc(this, func, ud);
+}
+inline void Environment::ReportErrorsTo(Status* status) {
+  upb_env_reporterrorsto(this, status);
+}
+inline bool Environment::ok() const {
+  return upb_env_ok(this);
+}
+inline bool Environment::ReportError(const Status* status) {
+  return upb_env_reporterror(this, status);
+}
+inline void *Environment::Malloc(size_t size) {
+  return upb_env_malloc(this, size);
+}
+inline void *Environment::Realloc(void *ptr, size_t oldsize, size_t size) {
+  return upb_env_realloc(this, ptr, oldsize, size);
+}
+inline bool Environment::AddCleanup(upb_cleanup_func *func, void *ud) {
+  return upb_env_addcleanup(this, func, ud);
+}
+inline size_t Environment::BytesAllocated() const {
+  return upb_env_bytesallocated(this);
+}
+
+inline SeededAllocator::SeededAllocator(void *mem, size_t len) {
+  upb_seededalloc_init(this, mem, len);
+}
+inline SeededAllocator::~SeededAllocator() {
+  upb_seededalloc_uninit(this);
+}
+inline void SeededAllocator::SetFallbackAllocator(upb_alloc_func *alloc,
+                                                  void *ud) {
+  upb_seededalloc_setfallbackalloc(this, alloc, ud);
+}
+inline upb_alloc_func *SeededAllocator::GetAllocationFunction() {
+  return upb_seededalloc_getallocfunc(this);
+}
+
+}  /* namespace upb */
+
+#endif  /* __cplusplus */
+
+#endif  /* UPB_ENV_H_ */
+/*
 ** upb::Sink (upb_sink)
 ** upb::BytesSink (upb_bytessink)
 **
@@ -5871,14 +5385,12 @@
 
 #ifdef __cplusplus
 namespace upb {
-class BufferSink;
 class BufferSource;
 class BytesSink;
 class Sink;
 }
 #endif
 
-UPB_DECLARE_TYPE(upb::BufferSink, upb_bufsink)
 UPB_DECLARE_TYPE(upb::BufferSource, upb_bufsrc)
 UPB_DECLARE_TYPE(upb::BytesSink, upb_bytessink)
 UPB_DECLARE_TYPE(upb::Sink, upb_sink)
@@ -6065,13 +5577,6 @@
 
 UPB_BEGIN_EXTERN_C
 
-/* A class for accumulating output string data in a flat buffer. */
-
-upb_bufsink *upb_bufsink_new(upb_env *env);
-void upb_bufsink_free(upb_bufsink *sink);
-upb_bytessink *upb_bufsink_sink(upb_bufsink *sink);
-const char *upb_bufsink_getdata(const upb_bufsink *sink, size_t *len);
-
 /* Inline definitions. */
 
 UPB_INLINE void upb_bytessink_reset(upb_bytessink *s, const upb_byteshandler *h,
@@ -6121,7 +5626,23 @@
                  &s->handler->table[UPB_ENDSTR_SELECTOR].attr));
 }
 
-bool upb_bufsrc_putbuf(const char *buf, size_t len, upb_bytessink *sink);
+UPB_INLINE bool upb_bufsrc_putbuf(const char *buf, size_t len,
+                                  upb_bytessink *sink) {
+  void *subc;
+  bool ret;
+  upb_bufhandle handle;
+  upb_bufhandle_init(&handle);
+  upb_bufhandle_setbuf(&handle, buf, 0);
+  ret = upb_bytessink_start(sink, len, &subc);
+  if (ret && len != 0) {
+    ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) >= len);
+  }
+  if (ret) {
+    ret = upb_bytessink_end(sink);
+  }
+  upb_bufhandle_uninit(&handle);
+  return ret;
+}
 
 #define PUTVAL(type, ctype)                                                    \
   UPB_INLINE bool upb_sink_put##type(upb_sink *s, upb_selector_t sel,          \
@@ -6164,18 +5685,6 @@
   return handler(s->closure, hd, buf, n, handle);
 }
 
-UPB_INLINE bool upb_sink_putunknown(upb_sink *s, const char *buf, size_t n) {
-  typedef upb_unknown_handlerfunc func;
-  func *handler;
-  const void *hd;
-  if (!s->handlers) return true;
-  handler = (func *)upb_handlers_gethandler(s->handlers, UPB_UNKNOWN_SELECTOR);
-
-  if (!handler) return n;
-  hd = upb_handlers_gethandlerdata(s->handlers, UPB_UNKNOWN_SELECTOR);
-  return handler(s->closure, hd, buf, n);
-}
-
 UPB_INLINE bool upb_sink_startmsg(upb_sink *s) {
   typedef upb_startmsg_handlerfunc func;
   func *startmsg;
@@ -6380,642 +5889,259 @@
 #endif
 
 #endif
+/*
+** For handlers that do very tiny, very simple operations, the function call
+** overhead of calling a handler can be significant.  This file allows the
+** user to define handlers that do something very simple like store the value
+** to memory and/or set a hasbit.  JIT compilers can then special-case these
+** handlers and emit specialized code for them instead of actually calling the
+** handler.
+**
+** The functionality is very simple/limited right now but may expand to be able
+** to call another function.
+*/
+
+#ifndef UPB_SHIM_H
+#define UPB_SHIM_H
+
+
+typedef struct {
+  size_t offset;
+  int32_t hasbit;
+} upb_shim_data;
 
 #ifdef __cplusplus
 
 namespace upb {
-class Array;
-class Map;
-class MapIterator;
-class MessageFactory;
-class MessageLayout;
-class Visitor;
-class VisitorPlan;
-}
+
+struct Shim {
+  typedef upb_shim_data Data;
+
+  /* Sets a handler for the given field that writes the value to the given
+   * offset and, if hasbit >= 0, sets a bit at the given bit offset.  Returns
+   * true if the handler was set successfully. */
+  static bool Set(Handlers *h, const FieldDef *f, size_t ofs, int32_t hasbit);
+
+  /* If this handler is a shim, returns the corresponding upb::Shim::Data and
+   * stores the type in "type".  Otherwise returns NULL. */
+  static const Data* GetData(const Handlers* h, Handlers::Selector s,
+                             FieldDef::Type* type);
+};
+
+}  /* namespace upb */
 
 #endif
 
-UPB_DECLARE_TYPE(upb::MessageFactory, upb_msgfactory)
-UPB_DECLARE_TYPE(upb::MessageLayout, upb_msglayout)
-UPB_DECLARE_TYPE(upb::Array, upb_array)
-UPB_DECLARE_TYPE(upb::Map, upb_map)
-UPB_DECLARE_TYPE(upb::MapIterator, upb_mapiter)
-UPB_DECLARE_TYPE(upb::Visitor, upb_visitor)
-UPB_DECLARE_TYPE(upb::VisitorPlan, upb_visitorplan)
-
-/* TODO(haberman): C++ accessors */
-
 UPB_BEGIN_EXTERN_C
 
-typedef void upb_msg;
-
-
-/** upb_msglayout *************************************************************/
-
-/* upb_msglayout represents the memory layout of a given upb_msgdef.  You get
- * instances of this from a upb_msgfactory, and the factory always owns the
- * msglayout. */
-
-
-/** upb_visitor ***************************************************************/
-
-/* upb_visitor will visit all the fields of a message and its submessages.  It
- * uses a upb_visitorplan which you can obtain from a upb_msgfactory. */
-
-upb_visitor *upb_visitor_create(upb_env *e, const upb_visitorplan *vp,
-                                upb_sink *output);
-bool upb_visitor_visitmsg(upb_visitor *v, const upb_msg *msg);
-
-
-/** upb_msgfactory ************************************************************/
-
-/* A upb_msgfactory contains a cache of upb_msglayout, upb_handlers, and
- * upb_visitorplan objects.  These are the objects necessary to represent,
- * populate, and and visit upb_msg objects.
- *
- * These caches are all populated by upb_msgdef, and lazily created on demand.
- */
-
-/* Creates and destroys a msgfactory, respectively.  The messages for this
- * msgfactory must come from |symtab| (which should outlive the msgfactory). */
-upb_msgfactory *upb_msgfactory_new(const upb_symtab *symtab);
-void upb_msgfactory_free(upb_msgfactory *f);
-
-const upb_symtab *upb_msgfactory_symtab(const upb_msgfactory *f);
-
-/* The functions to get cached objects, lazily creating them on demand.  These
- * all require:
- *
- * - m is in upb_msgfactory_symtab(f)
- * - upb_msgdef_mapentry(m) == false (since map messages can't have layouts).
- *
- * The returned objects will live for as long as the msgfactory does.
- *
- * TODO(haberman): consider making this thread-safe and take a const
- * upb_msgfactory. */
-const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
-                                              const upb_msgdef *m);
-const upb_handlers *upb_msgfactory_getmergehandlers(upb_msgfactory *f,
-                                                    const upb_msgdef *m);
-const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
-                                                     const upb_handlers *h);
-
-
-/** upb_stringview ************************************************************/
-
-typedef struct {
-  const char *data;
-  size_t size;
-} upb_stringview;
-
-UPB_INLINE upb_stringview upb_stringview_make(const char *data, size_t size) {
-  upb_stringview ret;
-  ret.data = data;
-  ret.size = size;
-  return ret;
-}
-
-#define UPB_STRINGVIEW_INIT(ptr, len) {ptr, len}
-
-
-/** upb_msgval ****************************************************************/
-
-/* A union representing all possible protobuf values.  Used for generic get/set
- * operations. */
-
-typedef union {
-  bool b;
-  float flt;
-  double dbl;
-  int32_t i32;
-  int64_t i64;
-  uint32_t u32;
-  uint64_t u64;
-  const upb_map* map;
-  const upb_msg* msg;
-  const upb_array* arr;
-  const void* ptr;
-  upb_stringview str;
-} upb_msgval;
-
-#define ACCESSORS(name, membername, ctype) \
-  UPB_INLINE ctype upb_msgval_get ## name(upb_msgval v) { \
-    return v.membername; \
-  } \
-  UPB_INLINE void upb_msgval_set ## name(upb_msgval *v, ctype cval) { \
-    v->membername = cval; \
-  } \
-  UPB_INLINE upb_msgval upb_msgval_ ## name(ctype v) { \
-    upb_msgval ret; \
-    ret.membername = v; \
-    return ret; \
-  }
-
-ACCESSORS(bool,   b,   bool)
-ACCESSORS(float,  flt, float)
-ACCESSORS(double, dbl, double)
-ACCESSORS(int32,  i32, int32_t)
-ACCESSORS(int64,  i64, int64_t)
-ACCESSORS(uint32, u32, uint32_t)
-ACCESSORS(uint64, u64, uint64_t)
-ACCESSORS(map,    map, const upb_map*)
-ACCESSORS(msg,    msg, const upb_msg*)
-ACCESSORS(ptr,    ptr, const void*)
-ACCESSORS(arr,    arr, const upb_array*)
-ACCESSORS(str,    str, upb_stringview)
-
-#undef ACCESSORS
-
-UPB_INLINE upb_msgval upb_msgval_makestr(const char *data, size_t size) {
-  return upb_msgval_str(upb_stringview_make(data, size));
-}
-
-
-/** upb_msg *******************************************************************/
-
-/* A upb_msg represents a protobuf message.  It always corresponds to a specific
- * upb_msglayout, which describes how it is laid out in memory.
- *
- * The message will have a fixed size, as returned by upb_msg_sizeof(), which
- * will be used to store fixed-length fields.  The upb_msg may also allocate
- * dynamic memory internally to store data such as:
- *
- * - extensions
- * - unknown fields
- */
-
-/* Returns the size of a message given this layout. */
-size_t upb_msg_sizeof(const upb_msglayout *l);
-
-/* upb_msg_init() / upb_msg_uninit() allow the user to use a pre-allocated
- * block of memory as a message.  The block's size should be upb_msg_sizeof().
- * upb_msg_uninit() must be called to release internally-allocated memory
- * unless the allocator is an arena that does not require freeing.
- *
- * Please note that upb_msg_init() may return a value that is different than
- * |msg|, so you must assign the return value and not cast your memory block
- * to upb_msg* directly!
- *
- * Please note that upb_msg_uninit() does *not* free any submessages, maps,
- * or arrays referred to by this message's fields.  You must free them manually
- * yourself.
- *
- * upb_msg_uninit returns the original memory block, which may be useful if
- * you dynamically allocated it (though upb_msg_new() would normally be more
- * appropriate in this case). */
-upb_msg *upb_msg_init(void *msg, const upb_msglayout *l, upb_alloc *a);
-void *upb_msg_uninit(upb_msg *msg, const upb_msglayout *l);
-
-/* Like upb_msg_init() / upb_msg_uninit(), except the message's memory is
- * allocated / freed from the given upb_alloc. */
-upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a);
-void upb_msg_free(upb_msg *msg, const upb_msglayout *l);
-
-/* Returns the upb_alloc for the given message.
- * TODO(haberman): get rid of this?  Not sure we want to be storing this
- * for every message. */
-upb_alloc *upb_msg_alloc(const upb_msg *msg);
-
-/* Packs the tree of messages rooted at "msg" into a single hunk of memory,
- * allocated from the given allocator. */
-void *upb_msg_pack(const upb_msg *msg, const upb_msglayout *l,
-                   void *p, size_t *ofs, size_t size);
-
-/* Read-only message API.  Can be safely called by anyone. */
-
-/* Returns the value associated with this field:
- *   - for scalar fields (including strings), the value directly.
- *   - return upb_msg*, or upb_map* for msg/map.
- *     If the field is unset for these field types, returns NULL.
- *
- * TODO(haberman): should we let users store cached array/map/msg
- * pointers here for fields that are unset?  Could be useful for the
- * strongly-owned submessage model (ie. generated C API that doesn't use
- * arenas).
- */
-upb_msgval upb_msg_get(const upb_msg *msg,
-                       int field_index,
-                       const upb_msglayout *l);
-
-/* May only be called for fields where upb_fielddef_haspresence(f) == true. */
-bool upb_msg_has(const upb_msg *msg,
-                 int field_index,
-                 const upb_msglayout *l);
-
-/* Mutable message API.  May only be called by the owner of the message who
- * knows its ownership scheme and how to keep it consistent. */
-
-/* Sets the given field to the given value.  Does not perform any memory
- * management: if you overwrite a pointer to a msg/array/map/string without
- * cleaning it up (or using an arena) it will leak.
- */
-void upb_msg_set(upb_msg *msg,
-                 int field_index,
-                 upb_msgval val,
-                 const upb_msglayout *l);
-
-/* For a primitive field, set it back to its default. For repeated, string, and
- * submessage fields set it back to NULL.  This could involve releasing some
- * internal memory (for example, from an extension dictionary), but it is not
- * recursive in any way and will not recover any memory that may be used by
- * arrays/maps/strings/msgs that this field may have pointed to.
- */
-bool upb_msg_clearfield(upb_msg *msg,
-                        int field_index,
-                        const upb_msglayout *l);
-
-/* TODO(haberman): copyfrom()/mergefrom()? */
-
-
-/** upb_array *****************************************************************/
-
-/* A upb_array stores data for a repeated field.  The memory management
- * semantics are the same as upb_msg.  A upb_array allocates dynamic
- * memory internally for the array elements. */
-
-size_t upb_array_sizeof(upb_fieldtype_t type);
-void upb_array_init(upb_array *arr, upb_fieldtype_t type, upb_alloc *a);
-void upb_array_uninit(upb_array *arr);
-upb_array *upb_array_new(upb_fieldtype_t type, upb_alloc *a);
-void upb_array_free(upb_array *arr);
-
-/* Read-only interface.  Safe for anyone to call. */
-
-size_t upb_array_size(const upb_array *arr);
-upb_fieldtype_t upb_array_type(const upb_array *arr);
-upb_msgval upb_array_get(const upb_array *arr, size_t i);
-
-/* Write interface.  May only be called by the message's owner who can enforce
- * its memory management invariants. */
-
-bool upb_array_set(upb_array *arr, size_t i, upb_msgval val);
-
-
-/** upb_map *******************************************************************/
-
-/* A upb_map stores data for a map field.  The memory management semantics are
- * the same as upb_msg, with one notable exception.  upb_map will internally
- * store a copy of all string keys, but *not* any string values or submessages.
- * So you must ensure that any string or message values outlive the map, and you
- * must delete them manually when they are no longer required. */
-
-size_t upb_map_sizeof(upb_fieldtype_t ktype, upb_fieldtype_t vtype);
-bool upb_map_init(upb_map *map, upb_fieldtype_t ktype, upb_fieldtype_t vtype,
-                  upb_alloc *a);
-void upb_map_uninit(upb_map *map);
-upb_map *upb_map_new(upb_fieldtype_t ktype, upb_fieldtype_t vtype, upb_alloc *a);
-void upb_map_free(upb_map *map);
-
-/* Read-only interface.  Safe for anyone to call. */
-
-size_t upb_map_size(const upb_map *map);
-upb_fieldtype_t upb_map_keytype(const upb_map *map);
-upb_fieldtype_t upb_map_valuetype(const upb_map *map);
-bool upb_map_get(const upb_map *map, upb_msgval key, upb_msgval *val);
-
-/* Write interface.  May only be called by the message's owner who can enforce
- * its memory management invariants. */
-
-/* Sets or overwrites an entry in the map.  Return value indicates whether
- * the operation succeeded or failed with OOM, and also whether an existing
- * key was replaced or not. */
-bool upb_map_set(upb_map *map,
-                 upb_msgval key, upb_msgval val,
-                 upb_msgval *valremoved);
-
-/* Deletes an entry in the map.  Returns true if the key was present. */
-bool upb_map_del(upb_map *map, upb_msgval key);
-
-
-/** upb_mapiter ***************************************************************/
-
-/* For iterating over a map.  Map iterators are invalidated by mutations to the
- * map, but an invalidated iterator will never return junk or crash the process.
- * An invalidated iterator may return entries that were already returned though,
- * and if you keep invalidating the iterator during iteration, the program may
- * enter an infinite loop. */
-
-size_t upb_mapiter_sizeof();
-
-void upb_mapiter_begin(upb_mapiter *i, const upb_map *t);
-upb_mapiter *upb_mapiter_new(const upb_map *t, upb_alloc *a);
-void upb_mapiter_free(upb_mapiter *i, upb_alloc *a);
-void upb_mapiter_next(upb_mapiter *i);
-bool upb_mapiter_done(const upb_mapiter *i);
-
-upb_msgval upb_mapiter_key(const upb_mapiter *i);
-upb_msgval upb_mapiter_value(const upb_mapiter *i);
-void upb_mapiter_setdone(upb_mapiter *i);
-bool upb_mapiter_isequal(const upb_mapiter *i1, const upb_mapiter *i2);
-
-
-/** Handlers ******************************************************************/
-
-/* These are the handlers used internally by upb_msgfactory_getmergehandlers().
- * They write scalar data to a known offset from the message pointer.
- *
- * These would be trivial for anyone to implement themselves, but it's better
- * to use these because some JITs will recognize and specialize these instead
- * of actually calling the function. */
-
-/* Sets a handler for the given primitive field that will write the data at the
- * given offset.  If hasbit > 0, also sets a hasbit at the given bit offset
- * (addressing each byte low to high). */
-bool upb_msg_setscalarhandler(upb_handlers *h,
-                              const upb_fielddef *f,
-                              size_t offset,
-                              int32_t hasbit);
-
-/* If the given handler is a msghandlers_primitive field, returns true and sets
- * *type, *offset and *hasbit.  Otherwise returns false. */
-bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
-                                  upb_selector_t s,
-                                  upb_fieldtype_t *type,
-                                  size_t *offset,
-                                  int32_t *hasbit);
-
-
-/** Interfaces for generated code *********************************************/
-
-#define UPB_NOT_IN_ONEOF UINT16_MAX
-#define UPB_NO_HASBIT UINT16_MAX
-#define UPB_NO_SUBMSG UINT16_MAX
-
-typedef struct {
-  uint32_t number;
-  uint32_t offset;  /* If in a oneof, offset of default in default_msg below. */
-  uint16_t hasbit;        /* UPB_NO_HASBIT if no hasbit. */
-  uint16_t oneof_index;   /* UPB_NOT_IN_ONEOF if not in a oneof. */
-  uint16_t submsg_index;  /* UPB_NO_SUBMSG if no submsg. */
-  uint8_t type;
-  uint8_t label;
-} upb_msglayout_fieldinit_v1;
-
-typedef struct {
-  uint32_t data_offset;
-  uint32_t case_offset;
-} upb_msglayout_oneofinit_v1;
-
-typedef struct upb_msglayout_msginit_v1 {
-  const struct upb_msglayout_msginit_v1 *const* submsgs;
-  const upb_msglayout_fieldinit_v1 *fields;
-  const upb_msglayout_oneofinit_v1 *oneofs;
-  void *default_msg;
-  /* Must be aligned to sizeof(void*).  Doesn't include internal members like
-   * unknown fields, extension dict, pointer to msglayout, etc. */
-  uint32_t size;
-  uint16_t field_count;
-  uint16_t oneof_count;
-  bool extendable;
-  bool is_proto2;
-} upb_msglayout_msginit_v1;
-
-#define UPB_ALIGN_UP_TO(val, align) ((val + (align - 1)) & -align)
-#define UPB_ALIGNED_SIZEOF(type) UPB_ALIGN_UP_TO(sizeof(type), sizeof(void*))
-
-/* Initialize/uninitialize a msglayout from a msginit.  If upb uses v1
- * internally, this will not allocate any memory.  Should only be used by
- * generated code. */
-upb_msglayout *upb_msglayout_frominit_v1(
-    const upb_msglayout_msginit_v1 *init, upb_alloc *a);
-void upb_msglayout_uninit_v1(upb_msglayout *layout, upb_alloc *a);
+/* C API. */
+bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
+                  int32_t hasbit);
+const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,
+                                      upb_fieldtype_t *type);
 
 UPB_END_EXTERN_C
 
-#endif /* UPB_MSG_H_ */
-
-UPB_BEGIN_EXTERN_C
-
-bool upb_decode(upb_stringview buf, void *msg,
-                const upb_msglayout_msginit_v1 *l, upb_env *env);
-
-UPB_END_EXTERN_C
-
-#endif  /* UPB_DECODE_H_ */
-/*
-** structs.int.h: structures definitions that are internal to upb.
-*/
-
-#ifndef UPB_STRUCTS_H_
-#define UPB_STRUCTS_H_
-
-struct upb_array {
-  upb_fieldtype_t type;
-  uint8_t element_size;
-  void *data;   /* Each element is element_size. */
-  size_t len;   /* Measured in elements. */
-  size_t size;  /* Measured in elements. */
-  upb_alloc *alloc;
-};
-
-#endif  /* UPB_STRUCTS_H_ */
-
-/*
-** This file contains definitions of structs that should be considered private
-** and NOT stable across versions of upb.
-**
-** The only reason they are declared here and not in .c files is to allow upb
-** and the application (if desired) to embed statically-initialized instances
-** of structures like defs.
-**
-** If you include this file, all guarantees of ABI compatibility go out the
-** window!  Any code that includes this file needs to recompile against the
-** exact same version of upb that they are linking against.
-**
-** You also need to recompile if you change the value of the UPB_DEBUG_REFS
-** flag.
-*/
-
-
-#ifndef UPB_STATICINIT_H_
-#define UPB_STATICINIT_H_
-
 #ifdef __cplusplus
-/* Because of how we do our typedefs, this header can't be included from C++. */
-#error This file cannot be included from C++
+/* C++ Wrappers. */
+namespace upb {
+inline bool Shim::Set(Handlers* h, const FieldDef* f, size_t ofs,
+                      int32_t hasbit) {
+  return upb_shim_set(h, f, ofs, hasbit);
+}
+inline const Shim::Data* Shim::GetData(const Handlers* h, Handlers::Selector s,
+                                       FieldDef::Type* type) {
+  return upb_shim_getdata(h, s, type);
+}
+}  /* namespace upb */
 #endif
 
-/* upb_refcounted *************************************************************/
-
-
-/* upb_def ********************************************************************/
-
-struct upb_def {
-  upb_refcounted base;
-
-  const char *fullname;
-  const upb_filedef* file;
-  char type;  /* A upb_deftype_t (char to save space) */
-
-  /* Used as a flag during the def's mutable stage.  Must be false unless
-   * it is currently being used by a function on the stack.  This allows
-   * us to easily determine which defs were passed into the function's
-   * current invocation. */
-  bool came_from_user;
-};
-
-#define UPB_DEF_INIT(name, type, vtbl, refs, ref2s) \
-    { UPB_REFCOUNT_INIT(vtbl, refs, ref2s), name, NULL, type, false }
-
-
-/* upb_fielddef ***************************************************************/
-
-struct upb_fielddef {
-  upb_def base;
-
-  union {
-    int64_t sint;
-    uint64_t uint;
-    double dbl;
-    float flt;
-    void *bytes;
-  } defaultval;
-  union {
-    const upb_msgdef *def;  /* If !msg_is_symbolic. */
-    char *name;             /* If msg_is_symbolic. */
-  } msg;
-  union {
-    const upb_def *def;  /* If !subdef_is_symbolic. */
-    char *name;          /* If subdef_is_symbolic. */
-  } sub;  /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
-  bool subdef_is_symbolic;
-  bool msg_is_symbolic;
-  const upb_oneofdef *oneof;
-  bool default_is_string;
-  bool type_is_set_;     /* False until type is explicitly set. */
-  bool is_extension_;
-  bool lazy_;
-  bool packed_;
-  upb_intfmt_t intfmt;
-  bool tagdelim;
-  upb_fieldtype_t type_;
-  upb_label_t label_;
-  uint32_t number_;
-  uint32_t selector_base;  /* Used to index into a upb::Handlers table. */
-  uint32_t index_;
-};
-
-extern const struct upb_refcounted_vtbl upb_fielddef_vtbl;
-
-#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy,   \
-                          packed, name, num, msgdef, subdef, selector_base,    \
-                          index, defaultval, refs, ref2s)                      \
-  {                                                                            \
-    UPB_DEF_INIT(name, UPB_DEF_FIELD, &upb_fielddef_vtbl, refs, ref2s),        \
-        defaultval, {msgdef}, {subdef}, NULL, false, false,                    \
-        type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
-        lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
-  }
-
-
-/* upb_msgdef *****************************************************************/
-
-struct upb_msgdef {
-  upb_def base;
-
-  size_t selector_count;
-  uint32_t submsg_field_count;
-
-  /* Tables for looking up fields by number and name. */
-  upb_inttable itof;  /* int to field */
-  upb_strtable ntof;  /* name to field/oneof */
-
-  /* Is this a map-entry message? */
-  bool map_entry;
-
-  /* Whether this message has proto2 or proto3 semantics. */
-  upb_syntax_t syntax;
-
-  /* TODO(haberman): proper extension ranges (there can be multiple). */
-};
-
-extern const struct upb_refcounted_vtbl upb_msgdef_vtbl;
-
-/* TODO: also support static initialization of the oneofs table. This will be
- * needed if we compile in descriptors that contain oneofs. */
-#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
-                        map_entry, syntax, refs, ref2s)                       \
-  {                                                                           \
-    UPB_DEF_INIT(name, UPB_DEF_MSG, &upb_fielddef_vtbl, refs, ref2s),         \
-        selector_count, submsg_field_count, itof, ntof, map_entry, syntax     \
-  }
-
-
-/* upb_enumdef ****************************************************************/
-
-struct upb_enumdef {
-  upb_def base;
-
-  upb_strtable ntoi;
-  upb_inttable iton;
-  int32_t defaultval;
-};
-
-extern const struct upb_refcounted_vtbl upb_enumdef_vtbl;
-
-#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
-  { UPB_DEF_INIT(name, UPB_DEF_ENUM, &upb_enumdef_vtbl, refs, ref2s), ntoi,    \
-    iton, defaultval }
-
-
-/* upb_oneofdef ***************************************************************/
-
-struct upb_oneofdef {
-  upb_refcounted base;
-
-  uint32_t index;  /* Index within oneofs. */
-  const char *name;
-  upb_strtable ntof;
-  upb_inttable itof;
-  const upb_msgdef *parent;
-};
-
-extern const struct upb_refcounted_vtbl upb_oneofdef_vtbl;
-
-#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
-  { UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), 0, name, ntof, itof }
-
-
-/* upb_symtab *****************************************************************/
-
-struct upb_symtab {
-  upb_refcounted base;
-
-  upb_strtable symtab;
-};
-
-struct upb_filedef {
-  upb_refcounted base;
-
-  const char *name;
-  const char *package;
-  const char *phpprefix;
-  const char *phpnamespace;
-  upb_syntax_t syntax;
-
-  upb_inttable defs;
-  upb_inttable deps;
-};
-
-extern const struct upb_refcounted_vtbl upb_filedef_vtbl;
-
-#endif  /* UPB_STATICINIT_H_ */
+#endif  /* UPB_SHIM_H */
 /*
-** upb_encode: parsing into a upb_msg using a upb_msglayout.
+** upb::SymbolTable (upb_symtab)
+**
+** A symtab (symbol table) stores a name->def map of upb_defs.  Clients could
+** always create such tables themselves, but upb_symtab has logic for resolving
+** symbolic references, and in particular, for keeping a whole set of consistent
+** defs when replacing some subset of those defs.  This logic is nontrivial.
+**
+** This is a mixed C/C++ interface that offers a full API to both languages.
+** See the top-level README for more information.
 */
 
-#ifndef UPB_ENCODE_H_
-#define UPB_ENCODE_H_
+#ifndef UPB_SYMTAB_H_
+#define UPB_SYMTAB_H_
 
 
+#ifdef __cplusplus
+#include <vector>
+namespace upb { class SymbolTable; }
+#endif
+
+UPB_DECLARE_DERIVED_TYPE(upb::SymbolTable, upb::RefCounted,
+                         upb_symtab, upb_refcounted)
+
+typedef struct {
+ UPB_PRIVATE_FOR_CPP
+  upb_strtable_iter iter;
+  upb_deftype_t type;
+} upb_symtab_iter;
+
+#ifdef __cplusplus
+
+/* Non-const methods in upb::SymbolTable are NOT thread-safe. */
+class upb::SymbolTable {
+ public:
+  /* Returns a new symbol table with a single ref owned by "owner."
+   * Returns NULL if memory allocation failed. */
+  static reffed_ptr<SymbolTable> New();
+
+  /* Include RefCounted base methods. */
+  UPB_REFCOUNTED_CPPMETHODS
+
+  /* For all lookup functions, the returned pointer is not owned by the
+   * caller; it may be invalidated by any non-const call or unref of the
+   * SymbolTable!  To protect against this, take a ref if desired. */
+
+  /* Freezes the symbol table: prevents further modification of it.
+   * After the Freeze() operation is successful, the SymbolTable must only be
+   * accessed via a const pointer.
+   *
+   * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
+   * a necessary step in using a SymbolTable.  If you have no need for it to be
+   * immutable, there is no need to freeze it ever.  However sometimes it is
+   * useful, and SymbolTables that are statically compiled into the binary are
+   * always frozen by nature. */
+  void Freeze();
+
+  /* Resolves the given symbol using the rules described in descriptor.proto,
+   * namely:
+   *
+   *    If the name starts with a '.', it is fully-qualified.  Otherwise,
+   *    C++-like scoping rules are used to find the type (i.e. first the nested
+   *    types within this message are searched, then within the parent, on up
+   *    to the root namespace).
+   *
+   * If not found, returns NULL. */
+  const Def* Resolve(const char* base, const char* sym) const;
+
+  /* Finds an entry in the symbol table with this exact name.  If not found,
+   * returns NULL. */
+  const Def* Lookup(const char *sym) const;
+  const MessageDef* LookupMessage(const char *sym) const;
+  const EnumDef* LookupEnum(const char *sym) const;
+
+  /* TODO: introduce a C++ iterator, but make it nice and templated so that if
+   * you ask for an iterator of MessageDef the iterated elements are strongly
+   * typed as MessageDef*. */
+
+  /* Adds the given mutable defs to the symtab, resolving all symbols
+   * (including enum default values) and finalizing the defs.  Only one def per
+   * name may be in the list, but defs can replace existing defs in the symtab.
+   * All defs must have a name -- anonymous defs are not allowed.  Anonymous
+   * defs can still be frozen by calling upb_def_freeze() directly.
+   *
+   * Any existing defs that can reach defs that are being replaced will
+   * themselves be replaced also, so that the resulting set of defs is fully
+   * consistent.
+   *
+   * This logic implemented in this method is a convenience; ultimately it
+   * calls some combination of upb_fielddef_setsubdef(), upb_def_dup(), and
+   * upb_freeze(), any of which the client could call themself.  However, since
+   * the logic for doing so is nontrivial, we provide it here.
+   *
+   * The entire operation either succeeds or fails.  If the operation fails,
+   * the symtab is unchanged, false is returned, and status indicates the
+   * error.  The caller passes a ref on all defs to the symtab (even if the
+   * operation fails).
+   *
+   * TODO(haberman): currently failure will leave the symtab unchanged, but may
+   * leave the defs themselves partially resolved.  Does this matter?  If so we
+   * could do a prepass that ensures that all symbols are resolvable and bail
+   * if not, so we don't mutate anything until we know the operation will
+   * succeed.
+   *
+   * TODO(haberman): since the defs must be mutable, refining a frozen def
+   * requires making mutable copies of the entire tree.  This is wasteful if
+   * only a few messages are changing.  We may want to add a way of adding a
+   * tree of frozen defs to the symtab (perhaps an alternate constructor where
+   * you pass the root of the tree?) */
+  bool Add(Def*const* defs, int n, void* ref_donor, upb_status* status);
+
+  bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
+    return Add((Def*const*)&defs[0], defs.size(), owner, status);
+  }
+
+ private:
+  UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable)
+};
+
+#endif  /* __cplusplus */
+
 UPB_BEGIN_EXTERN_C
 
-char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *l,
-                 upb_env *env, size_t *size);
+/* Native C API. */
+
+/* Include refcounted methods like upb_symtab_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_symtab, upb_symtab_upcast)
+
+upb_symtab *upb_symtab_new(const void *owner);
+void upb_symtab_freeze(upb_symtab *s);
+const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
+                                  const char *sym);
+const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
+const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
+const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
+bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
+                    upb_status *status);
+
+/* upb_symtab_iter i;
+ * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
+ *     upb_symtab_next(&i)) {
+ *   const upb_def *def = upb_symtab_iter_def(&i);
+ *    // ...
+ * }
+ *
+ * For C we don't have separate iterators for const and non-const.
+ * It is the caller's responsibility to cast the upb_fielddef* to
+ * const if the upb_msgdef* is const. */
+void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
+                      upb_deftype_t type);
+void upb_symtab_next(upb_symtab_iter *iter);
+bool upb_symtab_done(const upb_symtab_iter *iter);
+const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
 
 UPB_END_EXTERN_C
 
-#endif  /* UPB_ENCODE_H_ */
+#ifdef __cplusplus
+/* C++ inline wrappers. */
+namespace upb {
+inline reffed_ptr<SymbolTable> SymbolTable::New() {
+  upb_symtab *s = upb_symtab_new(&s);
+  return reffed_ptr<SymbolTable>(s, &s);
+}
+
+inline void SymbolTable::Freeze() {
+  return upb_symtab_freeze(this);
+}
+inline const Def *SymbolTable::Resolve(const char *base,
+                                       const char *sym) const {
+  return upb_symtab_resolve(this, base, sym);
+}
+inline const Def* SymbolTable::Lookup(const char *sym) const {
+  return upb_symtab_lookup(this, sym);
+}
+inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
+  return upb_symtab_lookupmsg(this, sym);
+}
+inline bool SymbolTable::Add(
+    Def*const* defs, int n, void* ref_donor, upb_status* status) {
+  return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
+}
+}  /* namespace upb */
+#endif
+
+#endif  /* UPB_SYMTAB_H_ */
 /*
 ** upb::descriptor::Reader (upb_descreader)
 **
@@ -7055,9 +6181,14 @@
   /* The reader's input; this is where descriptor.proto data should be sent. */
   Sink* input();
 
-  /* Use to get the FileDefs that have been parsed. */
-  size_t file_count() const;
-  FileDef* file(size_t i) const;
+  /* Returns an array of all defs that have been parsed, and transfers ownership
+   * of them to "owner".  The number of defs is stored in *n.  Ownership of the
+   * returned array is retained and is invalidated by any other call into
+   * Reader.
+   *
+   * These defs are not frozen or resolved; they are ready to be added to a
+   * symtab. */
+  upb::Def** GetDefs(void* owner, int* n);
 
   /* Builds and returns handlers for the reader, owned by "owner." */
   static Handlers* NewHandlers(const void* owner);
@@ -7073,8 +6204,7 @@
 /* C API. */
 upb_descreader *upb_descreader_create(upb_env *e, const upb_handlers *h);
 upb_sink *upb_descreader_input(upb_descreader *r);
-size_t upb_descreader_filecount(const upb_descreader *r);
-upb_filedef *upb_descreader_file(const upb_descreader *r, size_t i);
+upb_def **upb_descreader_getdefs(upb_descreader *r, void *owner, int *n);
 const upb_handlers *upb_descreader_newhandlers(const void *owner);
 
 UPB_END_EXTERN_C
@@ -7087,11 +6217,8 @@
   return upb_descreader_create(e, h);
 }
 inline Sink* Reader::input() { return upb_descreader_input(this); }
-inline size_t Reader::file_count() const {
-  return upb_descreader_filecount(this);
-}
-inline FileDef* Reader::file(size_t i) const {
-  return upb_descreader_file(this, i);
+inline upb::Def** Reader::GetDefs(void* owner, int* n) {
+  return upb_descreader_getdefs(this, owner, n);
 }
 }  /* namespace descriptor */
 }  /* namespace upb */
@@ -7104,292 +6231,519 @@
  * actually storing protobufs.  It only contains *defs* which
  * let you reflect over a protobuf *schema*.
  */
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- *     upb/descriptor/descriptor.proto
- *
+/* This file was generated by upbc (the upb compiler).
  * Do not edit -- your changes will be discarded when the file is
  * regenerated. */
 
-#ifndef UPB_DESCRIPTOR_DESCRIPTOR_PROTO_UPB_H_
-#define UPB_DESCRIPTOR_DESCRIPTOR_PROTO_UPB_H_
+#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
+#define GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
 
 
+#ifdef __cplusplus
 UPB_BEGIN_EXTERN_C
+#endif
 
 /* Enums */
 
 typedef enum {
-  google_protobuf_FieldDescriptorProto_LABEL_OPTIONAL = 1,
-  google_protobuf_FieldDescriptorProto_LABEL_REQUIRED = 2,
-  google_protobuf_FieldDescriptorProto_LABEL_REPEATED = 3
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_OPTIONAL = 1,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REQUIRED = 2,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REPEATED = 3
 } google_protobuf_FieldDescriptorProto_Label;
 
 typedef enum {
-  google_protobuf_FieldDescriptorProto_TYPE_DOUBLE = 1,
-  google_protobuf_FieldDescriptorProto_TYPE_FLOAT = 2,
-  google_protobuf_FieldDescriptorProto_TYPE_INT64 = 3,
-  google_protobuf_FieldDescriptorProto_TYPE_UINT64 = 4,
-  google_protobuf_FieldDescriptorProto_TYPE_INT32 = 5,
-  google_protobuf_FieldDescriptorProto_TYPE_FIXED64 = 6,
-  google_protobuf_FieldDescriptorProto_TYPE_FIXED32 = 7,
-  google_protobuf_FieldDescriptorProto_TYPE_BOOL = 8,
-  google_protobuf_FieldDescriptorProto_TYPE_STRING = 9,
-  google_protobuf_FieldDescriptorProto_TYPE_GROUP = 10,
-  google_protobuf_FieldDescriptorProto_TYPE_MESSAGE = 11,
-  google_protobuf_FieldDescriptorProto_TYPE_BYTES = 12,
-  google_protobuf_FieldDescriptorProto_TYPE_UINT32 = 13,
-  google_protobuf_FieldDescriptorProto_TYPE_ENUM = 14,
-  google_protobuf_FieldDescriptorProto_TYPE_SFIXED32 = 15,
-  google_protobuf_FieldDescriptorProto_TYPE_SFIXED64 = 16,
-  google_protobuf_FieldDescriptorProto_TYPE_SINT32 = 17,
-  google_protobuf_FieldDescriptorProto_TYPE_SINT64 = 18
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_DOUBLE = 1,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FLOAT = 2,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT64 = 3,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT64 = 4,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 = 5,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED64 = 6,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED32 = 7,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BOOL = 8,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_STRING = 9,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_GROUP = 10,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_MESSAGE = 11,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BYTES = 12,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT32 = 13,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_ENUM = 14,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED32 = 15,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED64 = 16,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT32 = 17,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT64 = 18
 } google_protobuf_FieldDescriptorProto_Type;
 
 typedef enum {
-  google_protobuf_FieldOptions_STRING = 0,
-  google_protobuf_FieldOptions_CORD = 1,
-  google_protobuf_FieldOptions_STRING_PIECE = 2
+  GOOGLE_PROTOBUF_FIELDOPTIONS_STRING = 0,
+  GOOGLE_PROTOBUF_FIELDOPTIONS_CORD = 1,
+  GOOGLE_PROTOBUF_FIELDOPTIONS_STRING_PIECE = 2
 } google_protobuf_FieldOptions_CType;
 
 typedef enum {
-  google_protobuf_FieldOptions_JS_NORMAL = 0,
-  google_protobuf_FieldOptions_JS_STRING = 1,
-  google_protobuf_FieldOptions_JS_NUMBER = 2
-} google_protobuf_FieldOptions_JSType;
-
-typedef enum {
-  google_protobuf_FileOptions_SPEED = 1,
-  google_protobuf_FileOptions_CODE_SIZE = 2,
-  google_protobuf_FileOptions_LITE_RUNTIME = 3
+  GOOGLE_PROTOBUF_FILEOPTIONS_SPEED = 1,
+  GOOGLE_PROTOBUF_FILEOPTIONS_CODE_SIZE = 2,
+  GOOGLE_PROTOBUF_FILEOPTIONS_LITE_RUNTIME = 3
 } google_protobuf_FileOptions_OptimizeMode;
 
-/* MessageDefs: call these functions to get a ref to a msgdef. */
-const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_EnumOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_FieldOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_FileOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_MessageOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_MethodOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_OneofDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_ServiceOptions_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_get(const void *owner);
-const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePart_get(const void *owner);
+/* Selectors */
 
-/* EnumDefs: call these functions to get a ref to an enumdef. */
-const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label_get(const void *owner);
-const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type_get(const void *owner);
-const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType_get(const void *owner);
-const upb_enumdef *upbdefs_google_protobuf_FieldOptions_JSType_get(const void *owner);
-const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode_get(const void *owner);
+/* google.protobuf.DescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 4
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_STARTSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSEQ 8
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSEQ 9
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSUBMSG 10
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSEQ 11
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSEQ 12
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSUBMSG 13
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 14
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 15
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 16
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSEQ 17
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSEQ 18
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSUBMSG 19
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSEQ 20
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSEQ 21
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSUBMSG 22
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_ENDSUBMSG 23
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STRING 24
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STARTSTR 25
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_ENDSTR 26
 
-/* Functions to test whether this message is of a certain type. */
-UPB_INLINE bool upbdefs_google_protobuf_DescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.DescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.DescriptorProto.ExtensionRange") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.DescriptorProto.ReservedRange") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_EnumDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.EnumDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_EnumOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.EnumOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_EnumValueDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.EnumValueDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_EnumValueOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.EnumValueOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_FieldDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.FieldDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_FieldOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.FieldOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_FileDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.FileDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_FileDescriptorSet_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.FileDescriptorSet") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_FileOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.FileOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_MessageOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.MessageOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_MethodDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.MethodDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_MethodOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.MethodOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_OneofDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.OneofDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_ServiceDescriptorProto_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.ServiceDescriptorProto") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_ServiceOptions_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.ServiceOptions") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_SourceCodeInfo_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.SourceCodeInfo") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_SourceCodeInfo_Location_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.SourceCodeInfo.Location") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_UninterpretedOption_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.UninterpretedOption") == 0;
-}
-UPB_INLINE bool upbdefs_google_protobuf_UninterpretedOption_NamePart_is(const upb_msgdef *m) {
-  return strcmp(upb_msgdef_fullname(m), "google.protobuf.UninterpretedOption.NamePart") == 0;
-}
+/* google.protobuf.DescriptorProto.ExtensionRange */
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_START_INT32 2
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_END_INT32 3
 
-/* Functions to test whether this enum is of a certain type. */
-UPB_INLINE bool upbdefs_google_protobuf_FieldDescriptorProto_Label_is(const upb_enumdef *e) {
-  return strcmp(upb_enumdef_fullname(e), "google.protobuf.FieldDescriptorProto.Label") == 0;
+/* google.protobuf.EnumDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSEQ 4
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSEQ 5
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STRING 8
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STARTSTR 9
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_ENDSTR 10
+
+/* google.protobuf.EnumOptions */
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_ALLOW_ALIAS_BOOL 6
+
+/* google.protobuf.EnumValueDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STRING 4
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STARTSTR 5
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_ENDSTR 6
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_INT32 7
+
+/* google.protobuf.EnumValueOptions */
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+
+/* google.protobuf.FieldDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STRING 4
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STARTSTR 5
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_ENDSTR 6
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STRING 7
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STARTSTR 8
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_ENDSTR 9
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NUMBER_INT32 10
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_INT32 11
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 12
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STRING 13
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STARTSTR 14
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_ENDSTR 15
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STRING 16
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STARTSTR 17
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_ENDSTR 18
+
+/* google.protobuf.FieldOptions */
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_CTYPE_INT32 6
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_PACKED_BOOL 7
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_DEPRECATED_BOOL 8
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_LAZY_BOOL 9
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STRING 10
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STARTSTR 11
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_ENDSTR 12
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_WEAK_BOOL 13
+
+/* google.protobuf.FileDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSUBMSG 4
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_STARTSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSEQ 8
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSEQ 9
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSUBMSG 10
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 11
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 12
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 13
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSEQ 14
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSEQ 15
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSUBMSG 16
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSEQ 17
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSEQ 18
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSUBMSG 19
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 20
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_ENDSUBMSG 21
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STRING 22
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STARTSTR 23
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_ENDSTR 24
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STRING 25
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STARTSTR 26
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_ENDSTR 27
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSEQ 28
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSEQ 29
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STRING 30
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSTR 31
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSTR 32
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_STARTSEQ 33
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_ENDSEQ 34
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_INT32 35
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_STARTSEQ 36
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_ENDSEQ 37
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_INT32 38
+
+/* google.protobuf.FileDescriptorSet */
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSUBMSG 5
+
+/* google.protobuf.FileOptions */
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STRING 6
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STARTSTR 7
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_ENDSTR 8
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STRING 9
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STARTSTR 10
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_ENDSTR 11
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OPTIMIZE_FOR_INT32 12
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_MULTIPLE_FILES_BOOL 13
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STRING 14
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STARTSTR 15
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_ENDSTR 16
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CC_GENERIC_SERVICES_BOOL 17
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERIC_SERVICES_BOOL 18
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_PY_GENERIC_SERVICES_BOOL 19
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERATE_EQUALS_AND_HASH_BOOL 20
+
+/* google.protobuf.MessageOptions */
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MESSAGE_SET_WIRE_FORMAT_BOOL 6
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_NO_STANDARD_DESCRIPTOR_ACCESSOR_BOOL 7
+
+/* google.protobuf.MethodDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STRING 4
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STARTSTR 5
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_ENDSTR 6
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STRING 7
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STARTSTR 8
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_ENDSTR 9
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STRING 10
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STARTSTR 11
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_ENDSTR 12
+
+/* google.protobuf.MethodOptions */
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+
+/* google.protobuf.ServiceDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSEQ 4
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSEQ 5
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STRING 8
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STARTSTR 9
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_ENDSTR 10
+
+/* google.protobuf.ServiceOptions */
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+
+/* google.protobuf.SourceCodeInfo */
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSUBMSG 5
+
+/* google.protobuf.SourceCodeInfo.Location */
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_STARTSEQ 2
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_ENDSEQ 3
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_INT32 4
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_STARTSEQ 5
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_ENDSEQ 6
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_INT32 7
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STRING 8
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STARTSTR 9
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_ENDSTR 10
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STRING 11
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STARTSTR 12
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_ENDSTR 13
+
+/* google.protobuf.UninterpretedOption */
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STRING 6
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STARTSTR 7
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_ENDSTR 8
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_POSITIVE_INT_VALUE_UINT64 9
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NEGATIVE_INT_VALUE_INT64 10
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_DOUBLE_VALUE_DOUBLE 11
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STRING 12
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STARTSTR 13
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_ENDSTR 14
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STRING 15
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STARTSTR 16
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_ENDSTR 17
+
+/* google.protobuf.UninterpretedOption.NamePart */
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STRING 2
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STARTSTR 3
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_ENDSTR 4
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_IS_EXTENSION_BOOL 5
+
+const upb_symtab *upbdefs_google_protobuf_descriptor(const void *owner);
+
+/* MessageDefs */
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto");
+  assert(m);
+  return m;
 }
-UPB_INLINE bool upbdefs_google_protobuf_FieldDescriptorProto_Type_is(const upb_enumdef *e) {
-  return strcmp(upb_enumdef_fullname(e), "google.protobuf.FieldDescriptorProto.Type") == 0;
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto.ExtensionRange");
+  assert(m);
+  return m;
 }
-UPB_INLINE bool upbdefs_google_protobuf_FieldOptions_CType_is(const upb_enumdef *e) {
-  return strcmp(upb_enumdef_fullname(e), "google.protobuf.FieldOptions.CType") == 0;
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumDescriptorProto");
+  assert(m);
+  return m;
 }
-UPB_INLINE bool upbdefs_google_protobuf_FieldOptions_JSType_is(const upb_enumdef *e) {
-  return strcmp(upb_enumdef_fullname(e), "google.protobuf.FieldOptions.JSType") == 0;
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumOptions");
+  assert(m);
+  return m;
 }
-UPB_INLINE bool upbdefs_google_protobuf_FileOptions_OptimizeMode_is(const upb_enumdef *e) {
-  return strcmp(upb_enumdef_fullname(e), "google.protobuf.FileOptions.OptimizeMode") == 0;
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorSet");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MessageOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MessageOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo.Location");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOption");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePart(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOption.NamePart");
+  assert(m);
+  return m;
 }
 
 
-/* Functions to get a fielddef from a msgdef reference. */
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_end(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_start(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_end(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_start(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_enum_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension_range(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_field(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_nested_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_oneof_decl(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_range(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_allow_alias(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_number(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_default_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_extendee(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_json_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_label(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_number(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_oneof_index(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_ctype(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_jstype(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_lazy(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_packed(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_weak(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_enum_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_message_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_public_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_service(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_source_code_info(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_syntax(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 12); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_weak_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 11); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_f_file(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorSet_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_enable_arenas(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 31); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 16); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_csharp_namespace(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 37); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 23); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_go_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 11); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generate_equals_and_hash(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 20); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 17); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_multiple_files(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_outer_classname(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_string_check_utf8(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 27); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_javanano_use_deprecated_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 38); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_objc_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 36); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_optimize_for(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_php_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 40); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_php_namespace(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 41); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_py_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 18); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_map_entry(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_message_set_wire_format(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_no_standard_descriptor_accessor(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_client_streaming(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_input_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_output_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_server_streaming(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 33); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_OneofDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_OneofDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_method(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 33); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_detached_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_path(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_span(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_trailing_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_f_location(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_is_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_name_part(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_aggregate_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_double_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_identifier_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_negative_int_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_positive_int_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_string_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 7); }
+/* EnumDefs */
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescriptorProto.Label");
+  assert(e);
+  return e;
+}
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescriptorProto.Type");
+  assert(e);
+  return e;
+}
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldOptions.CType");
+  assert(e);
+  return e;
+}
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FileOptions.OptimizeMode");
+  assert(e);
+  return e;
+}
+
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_field(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_nested_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_allow_alias(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_default_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_extendee(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_label(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_ctype(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_experimental_map_key(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_lazy(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_packed(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_weak(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_message_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_public_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_service(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_source_code_info(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_weak_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 11); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_file(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorSet(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 16); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_go_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 11); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 20); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 17); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_multiple_files(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_outer_classname(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_optimize_for(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_py_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 18); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_message_set_wire_format(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_input_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_output_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_method(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_path(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_span(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_location(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption_NamePart(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption_NamePart(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_aggregate_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_double_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_identifier_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_negative_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_positive_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_string_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 7); }
 
 UPB_END_EXTERN_C
 
@@ -7398,360 +6752,277 @@
 namespace upbdefs {
 namespace google {
 namespace protobuf {
-
-class DescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  DescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m));
-  }
-
-  static DescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_DescriptorProto_get(&m);
-    return DescriptorProto(m, &m);
-  }
-
-  class ExtensionRange : public ::upb::reffed_ptr<const ::upb::MessageDef> {
-   public:
-    ExtensionRange(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-        : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m));
-    }
-
-    static ExtensionRange get() {
-      const ::upb::MessageDef* m = upbdefs_google_protobuf_DescriptorProto_ExtensionRange_get(&m);
-      return ExtensionRange(m, &m);
-    }
-  };
-
-  class ReservedRange : public ::upb::reffed_ptr<const ::upb::MessageDef> {
-   public:
-    ReservedRange(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-        : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m));
-    }
-
-    static ReservedRange get() {
-      const ::upb::MessageDef* m = upbdefs_google_protobuf_DescriptorProto_ReservedRange_get(&m);
-      return ReservedRange(m, &m);
-    }
-  };
-};
-
-class EnumDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  EnumDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m));
-  }
-
-  static EnumDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_EnumDescriptorProto_get(&m);
-    return EnumDescriptorProto(m, &m);
-  }
-};
-
-class EnumOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  EnumOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m));
-  }
-
-  static EnumOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_EnumOptions_get(&m);
-    return EnumOptions(m, &m);
-  }
-};
-
-class EnumValueDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  EnumValueDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m));
-  }
-
-  static EnumValueDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_EnumValueDescriptorProto_get(&m);
-    return EnumValueDescriptorProto(m, &m);
-  }
-};
-
-class EnumValueOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  EnumValueOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m));
-  }
-
-  static EnumValueOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_EnumValueOptions_get(&m);
-    return EnumValueOptions(m, &m);
-  }
-};
-
-class FieldDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  FieldDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m));
-  }
-
-  static FieldDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_FieldDescriptorProto_get(&m);
-    return FieldDescriptorProto(m, &m);
-  }
-
-  class Label : public ::upb::reffed_ptr<const ::upb::EnumDef> {
-   public:
-    Label(const ::upb::EnumDef* e, const void *ref_donor = NULL)
-        : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_Label_is(e));
-    }
-    static Label get() {
-      const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldDescriptorProto_Label_get(&e);
-      return Label(e, &e);
-    }
-  };
-
-  class Type : public ::upb::reffed_ptr<const ::upb::EnumDef> {
-   public:
-    Type(const ::upb::EnumDef* e, const void *ref_donor = NULL)
-        : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_Type_is(e));
-    }
-    static Type get() {
-      const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldDescriptorProto_Type_get(&e);
-      return Type(e, &e);
-    }
-  };
-};
-
-class FieldOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  FieldOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m));
-  }
-
-  static FieldOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_FieldOptions_get(&m);
-    return FieldOptions(m, &m);
-  }
-
-  class CType : public ::upb::reffed_ptr<const ::upb::EnumDef> {
-   public:
-    CType(const ::upb::EnumDef* e, const void *ref_donor = NULL)
-        : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_CType_is(e));
-    }
-    static CType get() {
-      const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldOptions_CType_get(&e);
-      return CType(e, &e);
-    }
-  };
-
-  class JSType : public ::upb::reffed_ptr<const ::upb::EnumDef> {
-   public:
-    JSType(const ::upb::EnumDef* e, const void *ref_donor = NULL)
-        : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_JSType_is(e));
-    }
-    static JSType get() {
-      const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldOptions_JSType_get(&e);
-      return JSType(e, &e);
-    }
-  };
-};
-
-class FileDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  FileDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m));
-  }
-
-  static FileDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_FileDescriptorProto_get(&m);
-    return FileDescriptorProto(m, &m);
-  }
-};
-
-class FileDescriptorSet : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  FileDescriptorSet(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorSet_is(m));
-  }
-
-  static FileDescriptorSet get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_FileDescriptorSet_get(&m);
-    return FileDescriptorSet(m, &m);
-  }
-};
-
-class FileOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  FileOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m));
-  }
-
-  static FileOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_FileOptions_get(&m);
-    return FileOptions(m, &m);
-  }
-
-  class OptimizeMode : public ::upb::reffed_ptr<const ::upb::EnumDef> {
-   public:
-    OptimizeMode(const ::upb::EnumDef* e, const void *ref_donor = NULL)
-        : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FileOptions_OptimizeMode_is(e));
-    }
-    static OptimizeMode get() {
-      const ::upb::EnumDef* e = upbdefs_google_protobuf_FileOptions_OptimizeMode_get(&e);
-      return OptimizeMode(e, &e);
-    }
-  };
-};
-
-class MessageOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  MessageOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m));
-  }
-
-  static MessageOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_MessageOptions_get(&m);
-    return MessageOptions(m, &m);
-  }
-};
-
-class MethodDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  MethodDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m));
-  }
-
-  static MethodDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_MethodDescriptorProto_get(&m);
-    return MethodDescriptorProto(m, &m);
-  }
-};
-
-class MethodOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  MethodOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m));
-  }
-
-  static MethodOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_MethodOptions_get(&m);
-    return MethodOptions(m, &m);
-  }
-};
-
-class OneofDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  OneofDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_OneofDescriptorProto_is(m));
-  }
-
-  static OneofDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_OneofDescriptorProto_get(&m);
-    return OneofDescriptorProto(m, &m);
-  }
-};
-
-class ServiceDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  ServiceDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m));
-  }
-
-  static ServiceDescriptorProto get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_ServiceDescriptorProto_get(&m);
-    return ServiceDescriptorProto(m, &m);
-  }
-};
-
-class ServiceOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  ServiceOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m));
-  }
-
-  static ServiceOptions get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_ServiceOptions_get(&m);
-    return ServiceOptions(m, &m);
-  }
-};
-
-class SourceCodeInfo : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  SourceCodeInfo(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_is(m));
-  }
-
-  static SourceCodeInfo get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_SourceCodeInfo_get(&m);
-    return SourceCodeInfo(m, &m);
-  }
-
-  class Location : public ::upb::reffed_ptr<const ::upb::MessageDef> {
-   public:
-    Location(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-        : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m));
-    }
-
-    static Location get() {
-      const ::upb::MessageDef* m = upbdefs_google_protobuf_SourceCodeInfo_Location_get(&m);
-      return Location(m, &m);
-    }
-  };
-};
-
-class UninterpretedOption : public ::upb::reffed_ptr<const ::upb::MessageDef> {
- public:
-  UninterpretedOption(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-      : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m));
-  }
-
-  static UninterpretedOption get() {
-    const ::upb::MessageDef* m = upbdefs_google_protobuf_UninterpretedOption_get(&m);
-    return UninterpretedOption(m, &m);
-  }
-
-  class NamePart : public ::upb::reffed_ptr<const ::upb::MessageDef> {
-   public:
-    NamePart(const ::upb::MessageDef* m, const void *ref_donor = NULL)
-        : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m));
-    }
-
-    static NamePart get() {
-      const ::upb::MessageDef* m = upbdefs_google_protobuf_UninterpretedOption_NamePart_get(&m);
-      return NamePart(m, &m);
-    }
-  };
-};
-
+namespace descriptor {
+inline upb::reffed_ptr<const upb::SymbolTable> SymbolTable() {
+  const upb::SymbolTable* s = upbdefs_google_protobuf_descriptor(&s);
+  return upb::reffed_ptr<const upb::SymbolTable>(s, &s);
+}
+}  /* namespace descriptor */
 }  /* namespace protobuf */
 }  /* namespace google */
+
+#define RETURN_REFFED(type, func) \
+    const type* obj = func(upbdefs::google::protobuf::descriptor::SymbolTable().get()); \
+    return upb::reffed_ptr<const type>(obj);
+
+namespace google {
+namespace protobuf {
+namespace DescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_enum_type) }
+inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension) }
+inline upb::reffed_ptr<const upb::FieldDef> extension_range() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension_range) }
+inline upb::reffed_ptr<const upb::FieldDef> field() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_field) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> nested_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_nested_type) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_options) }
+}  /* namespace DescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace DescriptorProto {
+namespace ExtensionRange {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange) }
+inline upb::reffed_ptr<const upb::FieldDef> end() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end) }
+inline upb::reffed_ptr<const upb::FieldDef> start() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start) }
+}  /* namespace ExtensionRange */
+}  /* namespace DescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_value) }
+}  /* namespace EnumDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> allow_alias() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_allow_alias) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_uninterpreted_option) }
+}  /* namespace EnumOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumValueDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_number) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_options) }
+}  /* namespace EnumValueDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumValueOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option) }
+}  /* namespace EnumValueOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FieldDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> default_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_default_value) }
+inline upb::reffed_ptr<const upb::FieldDef> extendee() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_extendee) }
+inline upb::reffed_ptr<const upb::FieldDef> label() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_label) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_number) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type) }
+inline upb::reffed_ptr<const upb::FieldDef> type_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type_name) }
+inline upb::reffed_ptr<const upb::EnumDef> Label() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldDescriptorProto_Label) }
+inline upb::reffed_ptr<const upb::EnumDef> Type() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldDescriptorProto_Type) }
+}  /* namespace FieldDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FieldOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> ctype() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_ctype) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_deprecated) }
+inline upb::reffed_ptr<const upb::FieldDef> experimental_map_key() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_experimental_map_key) }
+inline upb::reffed_ptr<const upb::FieldDef> lazy() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_lazy) }
+inline upb::reffed_ptr<const upb::FieldDef> packed() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_packed) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_uninterpreted_option) }
+inline upb::reffed_ptr<const upb::FieldDef> weak() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_weak) }
+inline upb::reffed_ptr<const upb::EnumDef> CType() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldOptions_CType) }
+}  /* namespace FieldOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FileDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_dependency) }
+inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_enum_type) }
+inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_extension) }
+inline upb::reffed_ptr<const upb::FieldDef> message_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_message_type) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_package) }
+inline upb::reffed_ptr<const upb::FieldDef> public_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_public_dependency) }
+inline upb::reffed_ptr<const upb::FieldDef> service() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_service) }
+inline upb::reffed_ptr<const upb::FieldDef> source_code_info() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_source_code_info) }
+inline upb::reffed_ptr<const upb::FieldDef> weak_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_weak_dependency) }
+}  /* namespace FileDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FileDescriptorSet {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileDescriptorSet) }
+inline upb::reffed_ptr<const upb::FieldDef> file() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorSet_file) }
+}  /* namespace FileDescriptorSet */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FileOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> cc_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> go_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_go_package) }
+inline upb::reffed_ptr<const upb::FieldDef> java_generate_equals_and_hash() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash) }
+inline upb::reffed_ptr<const upb::FieldDef> java_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> java_multiple_files() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_multiple_files) }
+inline upb::reffed_ptr<const upb::FieldDef> java_outer_classname() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_outer_classname) }
+inline upb::reffed_ptr<const upb::FieldDef> java_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_package) }
+inline upb::reffed_ptr<const upb::FieldDef> optimize_for() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_optimize_for) }
+inline upb::reffed_ptr<const upb::FieldDef> py_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_py_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_uninterpreted_option) }
+inline upb::reffed_ptr<const upb::EnumDef> OptimizeMode() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FileOptions_OptimizeMode) }
+}  /* namespace FileOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace MessageOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MessageOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> message_set_wire_format() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_message_set_wire_format) }
+inline upb::reffed_ptr<const upb::FieldDef> no_standard_descriptor_accessor() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_uninterpreted_option) }
+}  /* namespace MessageOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace MethodDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> input_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_input_type) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> output_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_output_type) }
+}  /* namespace MethodDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace MethodOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_uninterpreted_option) }
+}  /* namespace MethodOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace ServiceDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> method() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_method) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_options) }
+}  /* namespace ServiceDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace ServiceOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_uninterpreted_option) }
+}  /* namespace ServiceOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace SourceCodeInfo {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo) }
+inline upb::reffed_ptr<const upb::FieldDef> location() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_location) }
+}  /* namespace SourceCodeInfo */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace SourceCodeInfo {
+namespace Location {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo_Location) }
+inline upb::reffed_ptr<const upb::FieldDef> leading_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments) }
+inline upb::reffed_ptr<const upb::FieldDef> path() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_path) }
+inline upb::reffed_ptr<const upb::FieldDef> span() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_span) }
+inline upb::reffed_ptr<const upb::FieldDef> trailing_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments) }
+}  /* namespace Location */
+}  /* namespace SourceCodeInfo */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace UninterpretedOption {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_UninterpretedOption) }
+inline upb::reffed_ptr<const upb::FieldDef> aggregate_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_aggregate_value) }
+inline upb::reffed_ptr<const upb::FieldDef> double_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_double_value) }
+inline upb::reffed_ptr<const upb::FieldDef> identifier_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_identifier_value) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_name) }
+inline upb::reffed_ptr<const upb::FieldDef> negative_int_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_negative_int_value) }
+inline upb::reffed_ptr<const upb::FieldDef> positive_int_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_positive_int_value) }
+inline upb::reffed_ptr<const upb::FieldDef> string_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_string_value) }
+}  /* namespace UninterpretedOption */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace UninterpretedOption {
+namespace NamePart {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_UninterpretedOption_NamePart) }
+inline upb::reffed_ptr<const upb::FieldDef> is_extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension) }
+inline upb::reffed_ptr<const upb::FieldDef> name_part() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part) }
+}  /* namespace NamePart */
+}  /* namespace UninterpretedOption */
+}  /* namespace protobuf */
+}  /* namespace google */
+
 }  /* namespace upbdefs */
 
-#endif  /* __cplusplus */
 
-#endif  /* UPB_DESCRIPTOR_DESCRIPTOR_PROTO_UPB_H_ */
+#undef RETURN_REFFED
+#endif /* __cplusplus */
+
+#endif  /* GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_ */
 /*
 ** Internal-only definitions for the decoder.
 */
@@ -7759,6 +7030,7 @@
 #ifndef UPB_DECODER_INT_H_
 #define UPB_DECODER_INT_H_
 
+#include <stdlib.h>
 /*
 ** upb::pb::Decoder
 **
@@ -7795,13 +7067,6 @@
 UPB_DECLARE_DERIVED_TYPE(upb::pb::DecoderMethod, upb::RefCounted,
                          upb_pbdecodermethod, upb_refcounted)
 
-/* The maximum number of bytes we are required to buffer internally between
- * calls to the decoder.  The value is 14: a 5 byte unknown tag plus ten-byte
- * varint, less one because we are buffering an incomplete value.
- *
- * Should only be used by unit tests. */
-#define UPB_DECODER_MAX_RESIDUAL_BYTES 14
-
 #ifdef __cplusplus
 
 /* The parameters one uses to construct a DecoderMethod.
@@ -7858,7 +7123,7 @@
  * constructed.  This hint may be an overestimate for some build configurations.
  * But if the decoder library is upgraded without recompiling the application,
  * it may be an underestimate. */
-#define UPB_PB_DECODER_SIZE 4416
+#define UPB_PB_DECODER_SIZE 4408
 
 #ifdef __cplusplus
 
@@ -8276,8 +7541,11 @@
   /* Overall stream offset of "buf." */
   uint64_t bufstart_ofs;
 
-  /* Buffer for residual bytes not parsed from the previous buffer. */
-  char residual[UPB_DECODER_MAX_RESIDUAL_BYTES];
+  /* Buffer for residual bytes not parsed from the previous buffer.
+   * The maximum number of residual bytes we require is 12; a five-byte
+   * unknown tag plus an eight-byte value, less one because the value
+   * is only a partial value. */
+  char residual[12];
   char *residual_end;
 
   /* Bytes of data that should be discarded from the input beore we start
@@ -8405,9 +7673,21 @@
 extern "C" {
 #endif
 
+/* A list of types as they are encoded on-the-wire. */
+typedef enum {
+  UPB_WIRE_TYPE_VARINT      = 0,
+  UPB_WIRE_TYPE_64BIT       = 1,
+  UPB_WIRE_TYPE_DELIMITED   = 2,
+  UPB_WIRE_TYPE_START_GROUP = 3,
+  UPB_WIRE_TYPE_END_GROUP   = 4,
+  UPB_WIRE_TYPE_32BIT       = 5
+} upb_wiretype_t;
+
 #define UPB_MAX_WIRE_TYPE 5
 
-/* The maximum number of bytes that it takes to encode a 64-bit varint. */
+/* The maximum number of bytes that it takes to encode a 64-bit varint.
+ * Note that with a better encoding this could be 9 (TODO: write up a
+ * wiki document about this). */
 #define UPB_PB_VARINT_MAX_LEN 10
 
 /* Array of the "native" (ie. non-packed-repeated) wire type for the given a
@@ -8440,8 +7720,16 @@
   return ret;
 }
 
+/* Four functions for decoding a varint of at most eight bytes.  They are all
+ * functionally identical, but are implemented in different ways and likely have
+ * different performance profiles.  We keep them around for performance testing.
+ *
+ * Note that these functions may not read byte-by-byte, so they must not be used
+ * unless there are at least eight bytes left in the buffer! */
 upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r);
 upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r);
+upb_decoderet upb_vdecode_max8_wright(upb_decoderet r);
+upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r);
 
 /* Template for a function that checks the first two bytes with branching
  * and dispatches 2-10 bytes with a separate function.  Note that this may read
@@ -8466,6 +7754,8 @@
 
 UPB_VARINT_DECODER_CHECK2(branch32, upb_vdecode_max8_branch32)
 UPB_VARINT_DECODER_CHECK2(branch64, upb_vdecode_max8_branch64)
+UPB_VARINT_DECODER_CHECK2(wright, upb_vdecode_max8_wright)
+UPB_VARINT_DECODER_CHECK2(massimino, upb_vdecode_max8_massimino)
 #undef UPB_VARINT_DECODER_CHECK2
 
 /* Our canonical functions for decoding varints, based on the currently
@@ -8477,6 +7767,10 @@
     return upb_vdecode_check2_branch32(p);
 }
 
+UPB_INLINE upb_decoderet upb_vdecode_max8_fast(upb_decoderet r) {
+  return upb_vdecode_max8_massimino(r);
+}
+
 
 /* Encoding *******************************************************************/
 
@@ -8518,9 +7812,9 @@
   char buf[UPB_PB_VARINT_MAX_LEN];
   size_t bytes = upb_vencode64(val, buf);
   uint64_t ret = 0;
-  UPB_ASSERT(bytes <= 5);
+  assert(bytes <= 5);
   memcpy(&ret, buf, bytes);
-  UPB_ASSERT(ret <= 0xffffffffffU);
+  assert(ret <= 0xffffffffffU);
   return ret;
 }
 
@@ -8645,44 +7939,49 @@
 #include <stdbool.h>
 
 #ifdef __cplusplus
-#include <vector>
-
 extern "C" {
 #endif
 
-/* Loads a binary descriptor and returns a NULL-terminated array of unfrozen
- * filedefs.  The caller owns the returned array, which must be freed with
- * upb_gfree(). */
-upb_filedef **upb_loaddescriptor(const char *buf, size_t n, const void *owner,
-                                 upb_status *status);
+/* Loads all defs from the given protobuf binary descriptor, setting default
+ * accessors and a default layout on all messages.  The caller owns the
+ * returned array of defs, which will be of length *n.  On error NULL is
+ * returned and status is set (if non-NULL). */
+upb_def **upb_load_defs_from_descriptor(const char *str, size_t len, int *n,
+                                        void *owner, upb_status *status);
+
+/* Like the previous but also adds the loaded defs to the given symtab. */
+bool upb_load_descriptor_into_symtab(upb_symtab *symtab, const char *str,
+                                     size_t len, upb_status *status);
+
+/* Like the previous but also reads the descriptor from the given filename. */
+bool upb_load_descriptor_file_into_symtab(upb_symtab *symtab, const char *fname,
+                                          upb_status *status);
+
+/* Reads the given filename into a character string, returning NULL if there
+ * was an error. */
+char *upb_readfile(const char *filename, size_t *len);
 
 #ifdef __cplusplus
 }  /* extern "C" */
 
 namespace upb {
 
-inline bool LoadDescriptor(const char* buf, size_t n, Status* status,
-                           std::vector<reffed_ptr<FileDef> >* files) {
-  FileDef** parsed_files = upb_loaddescriptor(buf, n, &parsed_files, status);
+/* All routines that load descriptors expect the descriptor to be a
+ * FileDescriptorSet. */
+inline bool LoadDescriptorFileIntoSymtab(SymbolTable* s, const char *fname,
+                                         Status* status) {
+  return upb_load_descriptor_file_into_symtab(s, fname, status);
+}
 
-  if (parsed_files) {
-    FileDef** p = parsed_files;
-    while (*p) {
-      files->push_back(reffed_ptr<FileDef>(*p, &parsed_files));
-      ++p;
-    }
-    free(parsed_files);
-    return true;
-  } else {
-    return false;
-  }
+inline bool LoadDescriptorIntoSymtab(SymbolTable* s, const char* str,
+                                     size_t len, Status* status) {
+  return upb_load_descriptor_into_symtab(s, str, len, status);
 }
 
 /* Templated so it can accept both string and std::string. */
 template <typename T>
-bool LoadDescriptor(const T& desc, Status* status,
-                    std::vector<reffed_ptr<FileDef> >* files) {
-  return LoadDescriptor(desc.c_str(), desc.size(), status, files);
+bool LoadDescriptorIntoSymtab(SymbolTable* s, const T& desc, Status* status) {
+  return upb_load_descriptor_into_symtab(s, desc.c_str(), desc.size(), status);
 }
 
 }  /* namespace upb */
@@ -8784,14 +8083,11 @@
 namespace upb {
 namespace json {
 class Parser;
-class ParserMethod;
 }  /* namespace json */
 }  /* namespace upb */
 #endif
 
 UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser)
-UPB_DECLARE_DERIVED_TYPE(upb::json::ParserMethod, upb::RefCounted,
-                         upb_json_parsermethod, upb_refcounted)
 
 /* upb::json::Parser **********************************************************/
 
@@ -8799,7 +8095,7 @@
  * constructed.  This hint may be an overestimate for some build configurations.
  * But if the parser library is upgraded without recompiling the application,
  * it may be an underestimate. */
-#define UPB_JSON_PARSER_SIZE 4112
+#define UPB_JSON_PARSER_SIZE 3704
 
 #ifdef __cplusplus
 
@@ -8807,8 +8103,7 @@
  * sink. */
 class upb::json::Parser {
  public:
-  static Parser* Create(Environment* env, const ParserMethod* method,
-                        Sink* output);
+  static Parser* Create(Environment* env, Sink* output);
 
   BytesSink* input();
 
@@ -8816,72 +8111,25 @@
   UPB_DISALLOW_POD_OPS(Parser, upb::json::Parser)
 };
 
-class upb::json::ParserMethod {
- public:
-  /* Include base methods from upb::ReferenceCounted. */
-  UPB_REFCOUNTED_CPPMETHODS
-
-  /* Returns handlers for parsing according to the specified schema. */
-  static reffed_ptr<const ParserMethod> New(const upb::MessageDef* md);
-
-  /* The destination handlers that are statically bound to this method.
-   * This method is only capable of outputting to a sink that uses these
-   * handlers. */
-  const Handlers* dest_handlers() const;
-
-  /* The input handlers for this decoder method. */
-  const BytesHandler* input_handler() const;
-
- private:
-  UPB_DISALLOW_POD_OPS(ParserMethod, upb::json::ParserMethod)
-};
-
 #endif
 
 UPB_BEGIN_EXTERN_C
 
-upb_json_parser* upb_json_parser_create(upb_env* e,
-                                        const upb_json_parsermethod* m,
-                                        upb_sink* output);
+upb_json_parser *upb_json_parser_create(upb_env *e, upb_sink *output);
 upb_bytessink *upb_json_parser_input(upb_json_parser *p);
 
-upb_json_parsermethod* upb_json_parsermethod_new(const upb_msgdef* md,
-                                                 const void* owner);
-const upb_handlers *upb_json_parsermethod_desthandlers(
-    const upb_json_parsermethod *m);
-const upb_byteshandler *upb_json_parsermethod_inputhandler(
-    const upb_json_parsermethod *m);
-
-/* Include refcounted methods like upb_json_parsermethod_ref(). */
-UPB_REFCOUNTED_CMETHODS(upb_json_parsermethod, upb_json_parsermethod_upcast)
-
 UPB_END_EXTERN_C
 
 #ifdef __cplusplus
 
 namespace upb {
 namespace json {
-inline Parser* Parser::Create(Environment* env, const ParserMethod* method,
-                              Sink* output) {
-  return upb_json_parser_create(env, method, output);
+inline Parser* Parser::Create(Environment* env, Sink* output) {
+  return upb_json_parser_create(env, output);
 }
 inline BytesSink* Parser::input() {
   return upb_json_parser_input(this);
 }
-
-inline const Handlers* ParserMethod::dest_handlers() const {
-  return upb_json_parsermethod_desthandlers(this);
-}
-inline const BytesHandler* ParserMethod::input_handler() const {
-  return upb_json_parsermethod_inputhandler(this);
-}
-/* static */
-inline reffed_ptr<const ParserMethod> ParserMethod::New(
-    const MessageDef* md) {
-  const upb_json_parsermethod *m = upb_json_parsermethod_new(md, &m);
-  return reffed_ptr<const ParserMethod>(m, &m);
-}
-
 }  /* namespace json */
 }  /* namespace upb */
 
@@ -8912,7 +8160,7 @@
 
 /* upb::json::Printer *********************************************************/
 
-#define UPB_JSON_PRINTER_SIZE 176
+#define UPB_JSON_PRINTER_SIZE 168
 
 #ifdef __cplusplus
 
@@ -8925,12 +8173,8 @@
   /* The input to the printer. */
   Sink* input();
 
-  /* Returns handlers for printing according to the specified schema.
-   * If preserve_proto_fieldnames is true, the output JSON will use the
-   * original .proto field names (ie. {"my_field":3}) instead of using
-   * camelCased names, which is the default: (eg. {"myField":3}). */
-  static reffed_ptr<const Handlers> NewHandlers(const upb::MessageDef* md,
-                                                bool preserve_proto_fieldnames);
+  /* Returns handlers for printing according to the specified schema. */
+  static reffed_ptr<const Handlers> NewHandlers(const upb::MessageDef* md);
 
   static const size_t kSize = UPB_JSON_PRINTER_SIZE;
 
@@ -8947,7 +8191,6 @@
                                           upb_bytessink *output);
 upb_sink *upb_json_printer_input(upb_json_printer *p);
 const upb_handlers *upb_json_printer_newhandlers(const upb_msgdef *md,
-                                                 bool preserve_fieldnames,
                                                  const void *owner);
 
 UPB_END_EXTERN_C
@@ -8962,9 +8205,8 @@
 }
 inline Sink* Printer::input() { return upb_json_printer_input(this); }
 inline reffed_ptr<const Handlers> Printer::NewHandlers(
-    const upb::MessageDef *md, bool preserve_proto_fieldnames) {
-  const Handlers* h = upb_json_printer_newhandlers(
-      md, preserve_proto_fieldnames, &h);
+    const upb::MessageDef *md) {
+  const Handlers* h = upb_json_printer_newhandlers(md, &h);
   return reffed_ptr<const Handlers>(h, &h);
 }
 }  /* namespace json */
diff --git a/php/ext/google/protobuf/utf8.c b/php/ext/google/protobuf/utf8.c
deleted file mode 100644
index 2752a08..0000000
--- a/php/ext/google/protobuf/utf8.c
+++ /dev/null
@@ -1,68 +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.
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#include "utf8.h"
-
-static const uint8_t utf8_offset[] = {
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-    4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-bool is_structurally_valid_utf8(const char* buf, int len) {
-  int i, j;
-  uint8_t offset;
-
-  i = 0;
-  while (i < len) {
-    offset = utf8_offset[(uint8_t)buf[i]];
-    if (offset == 0 || i + offset > len) {
-      return false;
-    }
-    for (j = i + 1; j < i + offset; j++) {
-      if ((buf[j] & 0xc0) != 0x80) {
-        return false;
-      }
-    }
-    i += offset;
-  }
-  return i == len;
-}
diff --git a/php/ext/google/protobuf/utf8.h b/php/ext/google/protobuf/utf8.h
deleted file mode 100644
index 28b8d87..0000000
--- a/php/ext/google/protobuf/utf8.h
+++ /dev/null
@@ -1,36 +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.
-
-#ifndef GOOGLE_PROTOBUF_UTF8_H_
-#define GOOGLE_PROTOBUF_UTF8_H_
-
-bool is_structurally_valid_utf8(const char* buf, int len);
-
-#endif  // GOOGLE_PROTOBUF_UTF8_H_
diff --git a/php/generate_descriptor_protos.sh b/php/generate_descriptor_protos.sh
deleted file mode 100755
index 372ad69..0000000
--- a/php/generate_descriptor_protos.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-# Run this script to regenerate desriptor protos after the protocol compiler
-# changes.
-
-if test ! -e src/google/protobuf/stubs/common.h; then
-  cat >&2 << __EOF__
-Could not find source code.  Make sure you are running this script from the
-root of the distribution tree.
-__EOF__
-  exit 1
-fi
-
-pushd src
-./protoc --php_out=internal:../php/src google/protobuf/descriptor.proto
-popd
diff --git a/php/phpunit.xml b/php/phpunit.xml
deleted file mode 100644
index 87440bb..0000000
--- a/php/phpunit.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit bootstrap="./tests/bootstrap_phpunit.php"
-         colors="true">
-  <testsuites>
-    <testsuite name="protobuf-tests">
-      <file>tests/php_implementation_test.php</file>
-      <file>tests/array_test.php</file>
-      <file>tests/encode_decode_test.php</file>
-      <file>tests/generated_class_test.php</file>
-      <file>tests/generated_phpdoc_test.php</file>
-      <file>tests/map_field_test.php</file>
-      <file>tests/well_known_test.php</file>
-      <file>tests/descriptors_test.php</file>
-      <file>tests/generated_service_test.php</file>
-    </testsuite>
-  </testsuites>
-</phpunit>
diff --git a/php/src/GPBMetadata/Google/Protobuf/Any.php b/php/src/GPBMetadata/Google/Protobuf/Any.php
deleted file mode 100644
index 22cc250..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Any.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/any.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Any
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0acd010a19676f6f676c652f70726f746f6275662f616e792e70726f746f" .
-            "120f676f6f676c652e70726f746f62756622260a03416e7912100a087479" .
-            "70655f75726c180120012809120d0a0576616c756518022001280c426f0a" .
-            "13636f6d2e676f6f676c652e70726f746f6275664208416e7950726f746f" .
-            "50015a256769746875622e636f6d2f676f6c616e672f70726f746f627566" .
-            "2f7074797065732f616e79a20203475042aa021e476f6f676c652e50726f" .
-            "746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Api.php b/php/src/GPBMetadata/Google/Protobuf/Api.php
deleted file mode 100644
index b18e0d3..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Api.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/api.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Api
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        \GPBMetadata\Google\Protobuf\SourceContext::initOnce();
-        \GPBMetadata\Google\Protobuf\Type::initOnce();
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0ac8050a19676f6f676c652f70726f746f6275662f6170692e70726f746f" .
-            "120f676f6f676c652e70726f746f6275661a1a676f6f676c652f70726f74" .
-            "6f6275662f747970652e70726f746f2281020a03417069120c0a046e616d" .
-            "6518012001280912280a076d6574686f647318022003280b32172e676f6f" .
-            "676c652e70726f746f6275662e4d6574686f6412280a076f7074696f6e73" .
-            "18032003280b32172e676f6f676c652e70726f746f6275662e4f7074696f" .
-            "6e120f0a0776657273696f6e18042001280912360a0e736f757263655f63" .
-            "6f6e7465787418052001280b321e2e676f6f676c652e70726f746f627566" .
-            "2e536f75726365436f6e7465787412260a066d6978696e7318062003280b" .
-            "32162e676f6f676c652e70726f746f6275662e4d6978696e12270a067379" .
-            "6e74617818072001280e32172e676f6f676c652e70726f746f6275662e53" .
-            "796e74617822d5010a064d6574686f64120c0a046e616d65180120012809" .
-            "12180a10726571756573745f747970655f75726c18022001280912190a11" .
-            "726571756573745f73747265616d696e6718032001280812190a11726573" .
-            "706f6e73655f747970655f75726c180420012809121a0a12726573706f6e" .
-            "73655f73747265616d696e6718052001280812280a076f7074696f6e7318" .
-            "062003280b32172e676f6f676c652e70726f746f6275662e4f7074696f6e" .
-            "12270a0673796e74617818072001280e32172e676f6f676c652e70726f74" .
-            "6f6275662e53796e74617822230a054d6978696e120c0a046e616d651801" .
-            "20012809120c0a04726f6f7418022001280942750a13636f6d2e676f6f67" .
-            "6c652e70726f746f627566420841706950726f746f50015a2b676f6f676c" .
-            "652e676f6c616e672e6f72672f67656e70726f746f2f70726f746f627566" .
-            "2f6170693b617069a20203475042aa021e476f6f676c652e50726f746f62" .
-            "75662e57656c6c4b6e6f776e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Duration.php b/php/src/GPBMetadata/Google/Protobuf/Duration.php
deleted file mode 100644
index b1c85ad..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Duration.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/duration.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Duration
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0ae3010a1e676f6f676c652f70726f746f6275662f6475726174696f6e2e" .
-            "70726f746f120f676f6f676c652e70726f746f627566222a0a0844757261" .
-            "74696f6e120f0a077365636f6e6473180120012803120d0a056e616e6f73" .
-            "180220012805427c0a13636f6d2e676f6f676c652e70726f746f62756642" .
-            "0d4475726174696f6e50726f746f50015a2a6769746875622e636f6d2f67" .
-            "6f6c616e672f70726f746f6275662f7074797065732f6475726174696f6e" .
-            "f80101a20203475042aa021e476f6f676c652e50726f746f6275662e5765" .
-            "6c6c4b6e6f776e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/FieldMask.php b/php/src/GPBMetadata/Google/Protobuf/FieldMask.php
deleted file mode 100644
index 5812be1..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/FieldMask.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/field_mask.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class FieldMask
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0ae3010a20676f6f676c652f70726f746f6275662f6669656c645f6d6173" .
-            "6b2e70726f746f120f676f6f676c652e70726f746f627566221a0a094669" .
-            "656c644d61736b120d0a0570617468731801200328094289010a13636f6d" .
-            "2e676f6f676c652e70726f746f627566420e4669656c644d61736b50726f" .
-            "746f50015a39676f6f676c652e676f6c616e672e6f72672f67656e70726f" .
-            "746f2f70726f746f6275662f6669656c645f6d61736b3b6669656c645f6d" .
-            "61736ba20203475042aa021e476f6f676c652e50726f746f6275662e5765" .
-            "6c6c4b6e6f776e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/GPBEmpty.php b/php/src/GPBMetadata/Google/Protobuf/GPBEmpty.php
deleted file mode 100644
index 88f42a1..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/GPBEmpty.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/empty.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class GPBEmpty
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0ab7010a1b676f6f676c652f70726f746f6275662f656d7074792e70726f" .
-            "746f120f676f6f676c652e70726f746f62756622070a05456d7074794276" .
-            "0a13636f6d2e676f6f676c652e70726f746f627566420a456d7074795072" .
-            "6f746f50015a276769746875622e636f6d2f676f6c616e672f70726f746f" .
-            "6275662f7074797065732f656d707479f80101a20203475042aa021e476f" .
-            "6f676c652e50726f746f6275662e57656c6c4b6e6f776e54797065736206" .
-            "70726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
deleted file mode 100644
index b0ca8da..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
+++ /dev/null
@@ -1,275 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace GPBMetadata\Google\Protobuf\Internal;
-
-class Descriptor
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->addMessage('google.protobuf.internal.FileDescriptorSet', \Google\Protobuf\Internal\FileDescriptorSet::class)
-            ->repeated('file', \Google\Protobuf\Internal\GPBType::MESSAGE, 1, 'google.protobuf.internal.FileDescriptorProto')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.FileDescriptorProto', \Google\Protobuf\Internal\FileDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->optional('package', \Google\Protobuf\Internal\GPBType::STRING, 2)
-            ->repeated('dependency', \Google\Protobuf\Internal\GPBType::STRING, 3)
-            ->repeated('public_dependency', \Google\Protobuf\Internal\GPBType::INT32, 10)
-            ->repeated('weak_dependency', \Google\Protobuf\Internal\GPBType::INT32, 11)
-            ->repeated('message_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.DescriptorProto')
-            ->repeated('enum_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 5, 'google.protobuf.internal.EnumDescriptorProto')
-            ->repeated('service', \Google\Protobuf\Internal\GPBType::MESSAGE, 6, 'google.protobuf.internal.ServiceDescriptorProto')
-            ->repeated('extension', \Google\Protobuf\Internal\GPBType::MESSAGE, 7, 'google.protobuf.internal.FieldDescriptorProto')
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.FileOptions')
-            ->optional('source_code_info', \Google\Protobuf\Internal\GPBType::MESSAGE, 9, 'google.protobuf.internal.SourceCodeInfo')
-            ->optional('syntax', \Google\Protobuf\Internal\GPBType::STRING, 12)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.DescriptorProto', \Google\Protobuf\Internal\DescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->repeated('field', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.FieldDescriptorProto')
-            ->repeated('extension', \Google\Protobuf\Internal\GPBType::MESSAGE, 6, 'google.protobuf.internal.FieldDescriptorProto')
-            ->repeated('nested_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.DescriptorProto')
-            ->repeated('enum_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.EnumDescriptorProto')
-            ->repeated('extension_range', \Google\Protobuf\Internal\GPBType::MESSAGE, 5, 'google.protobuf.internal.DescriptorProto.ExtensionRange')
-            ->repeated('oneof_decl', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.OneofDescriptorProto')
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 7, 'google.protobuf.internal.MessageOptions')
-            ->repeated('reserved_range', \Google\Protobuf\Internal\GPBType::MESSAGE, 9, 'google.protobuf.internal.DescriptorProto.ReservedRange')
-            ->repeated('reserved_name', \Google\Protobuf\Internal\GPBType::STRING, 10)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.DescriptorProto.ExtensionRange', \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class)
-            ->optional('start', \Google\Protobuf\Internal\GPBType::INT32, 1)
-            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 2)
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.ExtensionRangeOptions')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.DescriptorProto.ReservedRange', \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class)
-            ->optional('start', \Google\Protobuf\Internal\GPBType::INT32, 1)
-            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 2)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.ExtensionRangeOptions', \Google\Protobuf\Internal\ExtensionRangeOptions::class)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.FieldDescriptorProto', \Google\Protobuf\Internal\FieldDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->optional('number', \Google\Protobuf\Internal\GPBType::INT32, 3)
-            ->optional('label', \Google\Protobuf\Internal\GPBType::ENUM, 4, 'google.protobuf.internal.FieldDescriptorProto.Label')
-            ->optional('type', \Google\Protobuf\Internal\GPBType::ENUM, 5, 'google.protobuf.internal.FieldDescriptorProto.Type')
-            ->optional('type_name', \Google\Protobuf\Internal\GPBType::STRING, 6)
-            ->optional('extendee', \Google\Protobuf\Internal\GPBType::STRING, 2)
-            ->optional('default_value', \Google\Protobuf\Internal\GPBType::STRING, 7)
-            ->optional('oneof_index', \Google\Protobuf\Internal\GPBType::INT32, 9)
-            ->optional('json_name', \Google\Protobuf\Internal\GPBType::STRING, 10)
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.FieldOptions')
-            ->finalizeToPool();
-
-        $pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Type', \Google\Protobuf\Internal\Type::class)
-            ->value("TYPE_DOUBLE", 1)
-            ->value("TYPE_FLOAT", 2)
-            ->value("TYPE_INT64", 3)
-            ->value("TYPE_UINT64", 4)
-            ->value("TYPE_INT32", 5)
-            ->value("TYPE_FIXED64", 6)
-            ->value("TYPE_FIXED32", 7)
-            ->value("TYPE_BOOL", 8)
-            ->value("TYPE_STRING", 9)
-            ->value("TYPE_GROUP", 10)
-            ->value("TYPE_MESSAGE", 11)
-            ->value("TYPE_BYTES", 12)
-            ->value("TYPE_UINT32", 13)
-            ->value("TYPE_ENUM", 14)
-            ->value("TYPE_SFIXED32", 15)
-            ->value("TYPE_SFIXED64", 16)
-            ->value("TYPE_SINT32", 17)
-            ->value("TYPE_SINT64", 18)
-            ->finalizeToPool();
-
-        $pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Label', \Google\Protobuf\Internal\Label::class)
-            ->value("LABEL_OPTIONAL", 1)
-            ->value("LABEL_REQUIRED", 2)
-            ->value("LABEL_REPEATED", 3)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.OneofDescriptorProto', \Google\Protobuf\Internal\OneofDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.OneofOptions')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.EnumDescriptorProto', \Google\Protobuf\Internal\EnumDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->repeated('value', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.EnumValueDescriptorProto')
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumOptions')
-            ->repeated('reserved_range', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.EnumDescriptorProto.EnumReservedRange')
-            ->repeated('reserved_name', \Google\Protobuf\Internal\GPBType::STRING, 5)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.EnumDescriptorProto.EnumReservedRange', \Google\Protobuf\Internal\EnumDescriptorProto_EnumReservedRange::class)
-            ->optional('start', \Google\Protobuf\Internal\GPBType::INT32, 1)
-            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 2)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.EnumValueDescriptorProto', \Google\Protobuf\Internal\EnumValueDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->optional('number', \Google\Protobuf\Internal\GPBType::INT32, 2)
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumValueOptions')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.ServiceDescriptorProto', \Google\Protobuf\Internal\ServiceDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->repeated('method', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.MethodDescriptorProto')
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.ServiceOptions')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.MethodDescriptorProto', \Google\Protobuf\Internal\MethodDescriptorProto::class)
-            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->optional('input_type', \Google\Protobuf\Internal\GPBType::STRING, 2)
-            ->optional('output_type', \Google\Protobuf\Internal\GPBType::STRING, 3)
-            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.MethodOptions')
-            ->optional('client_streaming', \Google\Protobuf\Internal\GPBType::BOOL, 5)
-            ->optional('server_streaming', \Google\Protobuf\Internal\GPBType::BOOL, 6)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.FileOptions', \Google\Protobuf\Internal\FileOptions::class)
-            ->optional('java_package', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->optional('java_outer_classname', \Google\Protobuf\Internal\GPBType::STRING, 8)
-            ->optional('java_multiple_files', \Google\Protobuf\Internal\GPBType::BOOL, 10)
-            ->optional('java_generate_equals_and_hash', \Google\Protobuf\Internal\GPBType::BOOL, 20)
-            ->optional('java_string_check_utf8', \Google\Protobuf\Internal\GPBType::BOOL, 27)
-            ->optional('optimize_for', \Google\Protobuf\Internal\GPBType::ENUM, 9, 'google.protobuf.internal.FileOptions.OptimizeMode')
-            ->optional('go_package', \Google\Protobuf\Internal\GPBType::STRING, 11)
-            ->optional('cc_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 16)
-            ->optional('java_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 17)
-            ->optional('py_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 18)
-            ->optional('php_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 42)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 23)
-            ->optional('cc_enable_arenas', \Google\Protobuf\Internal\GPBType::BOOL, 31)
-            ->optional('objc_class_prefix', \Google\Protobuf\Internal\GPBType::STRING, 36)
-            ->optional('csharp_namespace', \Google\Protobuf\Internal\GPBType::STRING, 37)
-            ->optional('swift_prefix', \Google\Protobuf\Internal\GPBType::STRING, 39)
-            ->optional('php_class_prefix', \Google\Protobuf\Internal\GPBType::STRING, 40)
-            ->optional('php_namespace', \Google\Protobuf\Internal\GPBType::STRING, 41)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addEnum('google.protobuf.internal.FileOptions.OptimizeMode', \Google\Protobuf\Internal\OptimizeMode::class)
-            ->value("SPEED", 1)
-            ->value("CODE_SIZE", 2)
-            ->value("LITE_RUNTIME", 3)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.MessageOptions', \Google\Protobuf\Internal\MessageOptions::class)
-            ->optional('message_set_wire_format', \Google\Protobuf\Internal\GPBType::BOOL, 1)
-            ->optional('no_standard_descriptor_accessor', \Google\Protobuf\Internal\GPBType::BOOL, 2)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 3)
-            ->optional('map_entry', \Google\Protobuf\Internal\GPBType::BOOL, 7)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.FieldOptions', \Google\Protobuf\Internal\FieldOptions::class)
-            ->optional('ctype', \Google\Protobuf\Internal\GPBType::ENUM, 1, 'google.protobuf.internal.FieldOptions.CType')
-            ->optional('packed', \Google\Protobuf\Internal\GPBType::BOOL, 2)
-            ->optional('jstype', \Google\Protobuf\Internal\GPBType::ENUM, 6, 'google.protobuf.internal.FieldOptions.JSType')
-            ->optional('lazy', \Google\Protobuf\Internal\GPBType::BOOL, 5)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 3)
-            ->optional('weak', \Google\Protobuf\Internal\GPBType::BOOL, 10)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addEnum('google.protobuf.internal.FieldOptions.CType', \Google\Protobuf\Internal\CType::class)
-            ->value("STRING", 0)
-            ->value("CORD", 1)
-            ->value("STRING_PIECE", 2)
-            ->finalizeToPool();
-
-        $pool->addEnum('google.protobuf.internal.FieldOptions.JSType', \Google\Protobuf\Internal\JSType::class)
-            ->value("JS_NORMAL", 0)
-            ->value("JS_STRING", 1)
-            ->value("JS_NUMBER", 2)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.OneofOptions', \Google\Protobuf\Internal\OneofOptions::class)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.EnumOptions', \Google\Protobuf\Internal\EnumOptions::class)
-            ->optional('allow_alias', \Google\Protobuf\Internal\GPBType::BOOL, 2)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 3)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.EnumValueOptions', \Google\Protobuf\Internal\EnumValueOptions::class)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 1)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.ServiceOptions', \Google\Protobuf\Internal\ServiceOptions::class)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 33)
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.MethodOptions', \Google\Protobuf\Internal\MethodOptions::class)
-            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 33)
-            ->optional('idempotency_level', \Google\Protobuf\Internal\GPBType::ENUM, 34, 'google.protobuf.internal.MethodOptions.IdempotencyLevel')
-            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-            ->finalizeToPool();
-
-        $pool->addEnum('google.protobuf.internal.MethodOptions.IdempotencyLevel', \Google\Protobuf\Internal\IdempotencyLevel::class)
-            ->value("IDEMPOTENCY_UNKNOWN", 0)
-            ->value("NO_SIDE_EFFECTS", 1)
-            ->value("IDEMPOTENT", 2)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.UninterpretedOption', \Google\Protobuf\Internal\UninterpretedOption::class)
-            ->repeated('name', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.UninterpretedOption.NamePart')
-            ->optional('identifier_value', \Google\Protobuf\Internal\GPBType::STRING, 3)
-            ->optional('positive_int_value', \Google\Protobuf\Internal\GPBType::UINT64, 4)
-            ->optional('negative_int_value', \Google\Protobuf\Internal\GPBType::INT64, 5)
-            ->optional('double_value', \Google\Protobuf\Internal\GPBType::DOUBLE, 6)
-            ->optional('string_value', \Google\Protobuf\Internal\GPBType::BYTES, 7)
-            ->optional('aggregate_value', \Google\Protobuf\Internal\GPBType::STRING, 8)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.UninterpretedOption.NamePart', \Google\Protobuf\Internal\UninterpretedOption_NamePart::class)
-            ->required('name_part', \Google\Protobuf\Internal\GPBType::STRING, 1)
-            ->required('is_extension', \Google\Protobuf\Internal\GPBType::BOOL, 2)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.SourceCodeInfo', \Google\Protobuf\Internal\SourceCodeInfo::class)
-            ->repeated('location', \Google\Protobuf\Internal\GPBType::MESSAGE, 1, 'google.protobuf.internal.SourceCodeInfo.Location')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.SourceCodeInfo.Location', \Google\Protobuf\Internal\SourceCodeInfo_Location::class)
-            ->repeated('path', \Google\Protobuf\Internal\GPBType::INT32, 1)
-            ->repeated('span', \Google\Protobuf\Internal\GPBType::INT32, 2)
-            ->optional('leading_comments', \Google\Protobuf\Internal\GPBType::STRING, 3)
-            ->optional('trailing_comments', \Google\Protobuf\Internal\GPBType::STRING, 4)
-            ->repeated('leading_detached_comments', \Google\Protobuf\Internal\GPBType::STRING, 6)
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.GeneratedCodeInfo', \Google\Protobuf\Internal\GeneratedCodeInfo::class)
-            ->repeated('annotation', \Google\Protobuf\Internal\GPBType::MESSAGE, 1, 'google.protobuf.internal.GeneratedCodeInfo.Annotation')
-            ->finalizeToPool();
-
-        $pool->addMessage('google.protobuf.internal.GeneratedCodeInfo.Annotation', \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class)
-            ->repeated('path', \Google\Protobuf\Internal\GPBType::INT32, 1)
-            ->optional('source_file', \Google\Protobuf\Internal\GPBType::STRING, 2)
-            ->optional('begin', \Google\Protobuf\Internal\GPBType::INT32, 3)
-            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 4)
-            ->finalizeToPool();
-
-        $pool->finish();
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/SourceContext.php b/php/src/GPBMetadata/Google/Protobuf/SourceContext.php
deleted file mode 100644
index 495c6de..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/SourceContext.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/source_context.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class SourceContext
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0afb010a24676f6f676c652f70726f746f6275662f736f757263655f636f" .
-            "6e746578742e70726f746f120f676f6f676c652e70726f746f6275662222" .
-            "0a0d536f75726365436f6e7465787412110a0966696c655f6e616d651801" .
-            "200128094295010a13636f6d2e676f6f676c652e70726f746f6275664212" .
-            "536f75726365436f6e7465787450726f746f50015a41676f6f676c652e67" .
-            "6f6c616e672e6f72672f67656e70726f746f2f70726f746f6275662f736f" .
-            "757263655f636f6e746578743b736f757263655f636f6e74657874a20203" .
-            "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77" .
-            "6e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Struct.php b/php/src/GPBMetadata/Google/Protobuf/Struct.php
deleted file mode 100644
index 96b42af..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Struct.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/struct.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Struct
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0a81050a1c676f6f676c652f70726f746f6275662f7374727563742e7072" .
-            "6f746f120f676f6f676c652e70726f746f6275662284010a065374727563" .
-            "7412330a066669656c647318012003280b32232e676f6f676c652e70726f" .
-            "746f6275662e5374727563742e4669656c6473456e7472791a450a0b4669" .
-            "656c6473456e747279120b0a036b657918012001280912250a0576616c75" .
-            "6518022001280b32162e676f6f676c652e70726f746f6275662e56616c75" .
-            "653a02380122ea010a0556616c756512300a0a6e756c6c5f76616c756518" .
-            "012001280e321a2e676f6f676c652e70726f746f6275662e4e756c6c5661" .
-            "6c7565480012160a0c6e756d6265725f76616c7565180220012801480012" .
-            "160a0c737472696e675f76616c7565180320012809480012140a0a626f6f" .
-            "6c5f76616c75651804200128084800122f0a0c7374727563745f76616c75" .
-            "6518052001280b32172e676f6f676c652e70726f746f6275662e53747275" .
-            "6374480012300a0a6c6973745f76616c756518062001280b321a2e676f6f" .
-            "676c652e70726f746f6275662e4c69737456616c7565480042060a046b69" .
-            "6e6422330a094c69737456616c756512260a0676616c7565731801200328" .
-            "0b32162e676f6f676c652e70726f746f6275662e56616c75652a1b0a094e" .
-            "756c6c56616c7565120e0a0a4e554c4c5f56414c554510004281010a1363" .
-            "6f6d2e676f6f676c652e70726f746f627566420b53747275637450726f74" .
-            "6f50015a316769746875622e636f6d2f676f6c616e672f70726f746f6275" .
-            "662f7074797065732f7374727563743b7374727563747062f80101a20203" .
-            "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77" .
-            "6e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Timestamp.php b/php/src/GPBMetadata/Google/Protobuf/Timestamp.php
deleted file mode 100644
index 373665c..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Timestamp.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/timestamp.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Timestamp
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0ae7010a1f676f6f676c652f70726f746f6275662f74696d657374616d70" .
-            "2e70726f746f120f676f6f676c652e70726f746f627566222b0a0954696d" .
-            "657374616d70120f0a077365636f6e6473180120012803120d0a056e616e" .
-            "6f73180220012805427e0a13636f6d2e676f6f676c652e70726f746f6275" .
-            "66420e54696d657374616d7050726f746f50015a2b6769746875622e636f" .
-            "6d2f676f6c616e672f70726f746f6275662f7074797065732f74696d6573" .
-            "74616d70f80101a20203475042aa021e476f6f676c652e50726f746f6275" .
-            "662e57656c6c4b6e6f776e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Type.php b/php/src/GPBMetadata/Google/Protobuf/Type.php
deleted file mode 100644
index 8fbe8cb..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Type.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Type
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        \GPBMetadata\Google\Protobuf\Any::initOnce();
-        \GPBMetadata\Google\Protobuf\SourceContext::initOnce();
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0a9f0c0a1a676f6f676c652f70726f746f6275662f747970652e70726f74" .
-            "6f120f676f6f676c652e70726f746f6275661a24676f6f676c652f70726f" .
-            "746f6275662f736f757263655f636f6e746578742e70726f746f22d7010a" .
-            "0454797065120c0a046e616d6518012001280912260a066669656c647318" .
-            "022003280b32162e676f6f676c652e70726f746f6275662e4669656c6412" .
-            "0e0a066f6e656f667318032003280912280a076f7074696f6e7318042003" .
-            "280b32172e676f6f676c652e70726f746f6275662e4f7074696f6e12360a" .
-            "0e736f757263655f636f6e7465787418052001280b321e2e676f6f676c65" .
-            "2e70726f746f6275662e536f75726365436f6e7465787412270a0673796e" .
-            "74617818062001280e32172e676f6f676c652e70726f746f6275662e5379" .
-            "6e74617822d5050a054669656c6412290a046b696e6418012001280e321b" .
-            "2e676f6f676c652e70726f746f6275662e4669656c642e4b696e6412370a" .
-            "0b63617264696e616c69747918022001280e32222e676f6f676c652e7072" .
-            "6f746f6275662e4669656c642e43617264696e616c697479120e0a066e75" .
-            "6d626572180320012805120c0a046e616d6518042001280912100a087479" .
-            "70655f75726c18062001280912130a0b6f6e656f665f696e646578180720" .
-            "012805120e0a067061636b656418082001280812280a076f7074696f6e73" .
-            "18092003280b32172e676f6f676c652e70726f746f6275662e4f7074696f" .
-            "6e12110a096a736f6e5f6e616d65180a2001280912150a0d64656661756c" .
-            "745f76616c7565180b2001280922c8020a044b696e6412100a0c54595045" .
-            "5f554e4b4e4f574e1000120f0a0b545950455f444f55424c451001120e0a" .
-            "0a545950455f464c4f41541002120e0a0a545950455f494e543634100312" .
-            "0f0a0b545950455f55494e5436341004120e0a0a545950455f494e543332" .
-            "100512100a0c545950455f46495845443634100612100a0c545950455f46" .
-            "4958454433321007120d0a09545950455f424f4f4c1008120f0a0b545950" .
-            "455f535452494e471009120e0a0a545950455f47524f5550100a12100a0c" .
-            "545950455f4d455353414745100b120e0a0a545950455f4259544553100c" .
-            "120f0a0b545950455f55494e543332100d120d0a09545950455f454e554d" .
-            "100e12110a0d545950455f5346495845443332100f12110a0d545950455f" .
-            "53464958454436341010120f0a0b545950455f53494e5433321011120f0a" .
-            "0b545950455f53494e543634101222740a0b43617264696e616c69747912" .
-            "170a1343415244494e414c4954595f554e4b4e4f574e100012180a144341" .
-            "5244494e414c4954595f4f5054494f4e414c100112180a1443415244494e" .
-            "414c4954595f5245515549524544100212180a1443415244494e414c4954" .
-            "595f5245504541544544100322ce010a04456e756d120c0a046e616d6518" .
-            "0120012809122d0a09656e756d76616c756518022003280b321a2e676f6f" .
-            "676c652e70726f746f6275662e456e756d56616c756512280a076f707469" .
-            "6f6e7318032003280b32172e676f6f676c652e70726f746f6275662e4f70" .
-            "74696f6e12360a0e736f757263655f636f6e7465787418042001280b321e" .
-            "2e676f6f676c652e70726f746f6275662e536f75726365436f6e74657874" .
-            "12270a0673796e74617818052001280e32172e676f6f676c652e70726f74" .
-            "6f6275662e53796e74617822530a09456e756d56616c7565120c0a046e61" .
-            "6d65180120012809120e0a066e756d62657218022001280512280a076f70" .
-            "74696f6e7318032003280b32172e676f6f676c652e70726f746f6275662e" .
-            "4f7074696f6e223b0a064f7074696f6e120c0a046e616d65180120012809" .
-            "12230a0576616c756518022001280b32142e676f6f676c652e70726f746f" .
-            "6275662e416e792a2e0a0653796e74617812110a0d53594e5441585f5052" .
-            "4f544f32100012110a0d53594e5441585f50524f544f331001427d0a1363" .
-            "6f6d2e676f6f676c652e70726f746f62756642095479706550726f746f50" .
-            "015a2f676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f" .
-            "70726f746f6275662f70747970653b7074797065f80101a20203475042aa" .
-            "021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f776e547970" .
-            "6573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/GPBMetadata/Google/Protobuf/Wrappers.php b/php/src/GPBMetadata/Google/Protobuf/Wrappers.php
deleted file mode 100644
index dd72ff4..0000000
--- a/php/src/GPBMetadata/Google/Protobuf/Wrappers.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace GPBMetadata\Google\Protobuf;
-
-class Wrappers
-{
-    public static $is_initialized = false;
-
-    public static function initOnce() {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-
-        if (static::$is_initialized == true) {
-          return;
-        }
-        $pool->internalAddGeneratedFile(hex2bin(
-            "0abf030a1e676f6f676c652f70726f746f6275662f77726170706572732e" .
-            "70726f746f120f676f6f676c652e70726f746f627566221c0a0b446f7562" .
-            "6c6556616c7565120d0a0576616c7565180120012801221b0a0a466c6f61" .
-            "7456616c7565120d0a0576616c7565180120012802221b0a0a496e743634" .
-            "56616c7565120d0a0576616c7565180120012803221c0a0b55496e743634" .
-            "56616c7565120d0a0576616c7565180120012804221b0a0a496e74333256" .
-            "616c7565120d0a0576616c7565180120012805221c0a0b55496e74333256" .
-            "616c7565120d0a0576616c756518012001280d221a0a09426f6f6c56616c" .
-            "7565120d0a0576616c7565180120012808221c0a0b537472696e6756616c" .
-            "7565120d0a0576616c7565180120012809221b0a0a427974657356616c75" .
-            "65120d0a0576616c756518012001280c427c0a13636f6d2e676f6f676c65" .
-            "2e70726f746f627566420d577261707065727350726f746f50015a2a6769" .
-            "746875622e636f6d2f676f6c616e672f70726f746f6275662f7074797065" .
-            "732f7772617070657273f80101a20203475042aa021e476f6f676c652e50" .
-            "726f746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33"
-        ));
-
-        static::$is_initialized = true;
-    }
-}
-
diff --git a/php/src/Google/Protobuf/Any.php b/php/src/Google/Protobuf/Any.php
deleted file mode 100644
index f027b05..0000000
--- a/php/src/Google/Protobuf/Any.php
+++ /dev/null
@@ -1,271 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/any.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBUtil;
-use Google\Protobuf\Internal\Message;
-use Google\Protobuf\Internal\RepeatedField;
-
-/**
- * `Any` contains an arbitrary serialized protocol buffer message along with a
- * URL that describes the type of the serialized message.
- * Protobuf library provides support to pack/unpack Any values in the form
- * of utility functions or additional generated methods of the Any type.
- * Example 1: Pack and unpack a message in C++.
- *     Foo foo = ...;
- *     Any any;
- *     any.PackFrom(foo);
- *     ...
- *     if (any.UnpackTo(&foo)) {
- *       ...
- *     }
- * Example 2: Pack and unpack a message in Java.
- *     Foo foo = ...;
- *     Any any = Any.pack(foo);
- *     ...
- *     if (any.is(Foo.class)) {
- *       foo = any.unpack(Foo.class);
- *     }
- *  Example 3: Pack and unpack a message in Python.
- *     foo = Foo(...)
- *     any = Any()
- *     any.Pack(foo)
- *     ...
- *     if any.Is(Foo.DESCRIPTOR):
- *       any.Unpack(foo)
- *       ...
- * The pack methods provided by protobuf library will by default use
- * 'type.googleapis.com/full.type.name' as the type URL and the unpack
- * methods only use the fully qualified type name after the last '/'
- * in the type URL, for example "foo.bar.com/x/y.z" will yield type
- * name "y.z".
- * JSON
- * ====
- * The JSON representation of an `Any` value uses the regular
- * representation of the deserialized, embedded message, with an
- * additional field `&#64;type` which contains the type URL. Example:
- *     package google.profile;
- *     message Person {
- *       string first_name = 1;
- *       string last_name = 2;
- *     }
- *     {
- *       "&#64;type": "type.googleapis.com/google.profile.Person",
- *       "firstName": <string>,
- *       "lastName": <string>
- *     }
- * If the embedded message type is well-known and has a custom JSON
- * representation, that representation will be embedded adding a field
- * `value` which holds the custom JSON in addition to the `&#64;type`
- * field. Example (for message [google.protobuf.Duration][]):
- *     {
- *       "&#64;type": "type.googleapis.com/google.protobuf.Duration",
- *       "value": "1.212s"
- *     }
- *
- * Generated from protobuf message <code>google.protobuf.Any</code>
- */
-class Any extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * A URL/resource name whose content describes the type of the
-     * serialized protocol buffer message.
-     * For URLs which use the scheme `http`, `https`, or no scheme, the
-     * following restrictions and interpretations apply:
-     * * If no scheme is provided, `https` is assumed.
-     * * The last segment of the URL's path must represent the fully
-     *   qualified name of the type (as in `path/google.protobuf.Duration`).
-     *   The name should be in a canonical form (e.g., leading "." is
-     *   not accepted).
-     * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
-     *   value in binary format, or produce an error.
-     * * Applications are allowed to cache lookup results based on the
-     *   URL, or have them precompiled into a binary to avoid any
-     *   lookup. Therefore, binary compatibility needs to be preserved
-     *   on changes to types. (Use versioned type names to manage
-     *   breaking changes.)
-     * Schemes other than `http`, `https` (or the empty scheme) might be
-     * used with implementation specific semantics.
-     *
-     * Generated from protobuf field <code>string type_url = 1;</code>
-     */
-    private $type_url = '';
-    /**
-     * Must be a valid serialized protocol buffer of the above specified type.
-     *
-     * Generated from protobuf field <code>bytes value = 2;</code>
-     */
-    private $value = '';
-
-    const TYPE_URL_PREFIX = 'type.googleapis.com/';
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Any::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * A URL/resource name whose content describes the type of the
-     * serialized protocol buffer message.
-     * For URLs which use the scheme `http`, `https`, or no scheme, the
-     * following restrictions and interpretations apply:
-     * * If no scheme is provided, `https` is assumed.
-     * * The last segment of the URL's path must represent the fully
-     *   qualified name of the type (as in `path/google.protobuf.Duration`).
-     *   The name should be in a canonical form (e.g., leading "." is
-     *   not accepted).
-     * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
-     *   value in binary format, or produce an error.
-     * * Applications are allowed to cache lookup results based on the
-     *   URL, or have them precompiled into a binary to avoid any
-     *   lookup. Therefore, binary compatibility needs to be preserved
-     *   on changes to types. (Use versioned type names to manage
-     *   breaking changes.)
-     * Schemes other than `http`, `https` (or the empty scheme) might be
-     * used with implementation specific semantics.
-     *
-     * Generated from protobuf field <code>string type_url = 1;</code>
-     * @return string
-     */
-    public function getTypeUrl()
-    {
-        return $this->type_url;
-    }
-
-    /**
-     * A URL/resource name whose content describes the type of the
-     * serialized protocol buffer message.
-     * For URLs which use the scheme `http`, `https`, or no scheme, the
-     * following restrictions and interpretations apply:
-     * * If no scheme is provided, `https` is assumed.
-     * * The last segment of the URL's path must represent the fully
-     *   qualified name of the type (as in `path/google.protobuf.Duration`).
-     *   The name should be in a canonical form (e.g., leading "." is
-     *   not accepted).
-     * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
-     *   value in binary format, or produce an error.
-     * * Applications are allowed to cache lookup results based on the
-     *   URL, or have them precompiled into a binary to avoid any
-     *   lookup. Therefore, binary compatibility needs to be preserved
-     *   on changes to types. (Use versioned type names to manage
-     *   breaking changes.)
-     * Schemes other than `http`, `https` (or the empty scheme) might be
-     * used with implementation specific semantics.
-     *
-     * Generated from protobuf field <code>string type_url = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setTypeUrl($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->type_url = $var;
-
-        return $this;
-    }
-
-    /**
-     * Must be a valid serialized protocol buffer of the above specified type.
-     *
-     * Generated from protobuf field <code>bytes value = 2;</code>
-     * @return string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * Must be a valid serialized protocol buffer of the above specified type.
-     *
-     * Generated from protobuf field <code>bytes value = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->value = $var;
-
-        return $this;
-    }
-
-    /**
-     * This method will try to resolve the type_url in Any message to get the
-     * targeted message type. If failed, an error will be thrown. Otherwise,
-     * the method will create a message of the targeted type and fill it with
-     * the decoded value in Any.
-     * @return unpacked message
-     * @throws Exception Type url needs to be type.googleapis.com/fully-qulified.
-     * @throws Exception Class hasn't been added to descriptor pool.
-     * @throws Exception cannot decode data in value field.
-     */
-    public function unpack()
-    {
-        // Get fully qualifed name from type url.
-        $url_prifix_len = strlen(GPBUtil::TYPE_URL_PREFIX);
-        if (substr($this->type_url, 0, $url_prifix_len) !=
-                GPBUtil::TYPE_URL_PREFIX) {
-            throw new \Exception(
-                "Type url needs to be type.googleapis.com/fully-qulified");
-        }
-        $fully_qualifed_name =
-            substr($this->type_url, $url_prifix_len);
-
-        // Create message according to fully qualified name.
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByProtoName( ".".$fully_qualifed_name);
-        if (is_null($desc)) {
-            throw new \Exception("Class ".$fully_qualifed_name
-                                     ." hasn't been added to descriptor pool");
-        }
-        $klass = $desc->getClass();
-        $msg = new $klass();
-
-        // Merge data into message.
-        $msg->mergeFromString($this->value);
-        return $msg;
-    }
-
-    /**
-     * The type_url will be created according to the given message’s type and
-     * the value is encoded data from the given message..
-     * @param message: A proto message.
-     */
-    public function pack($msg)
-    {
-        if (!$msg instanceof Message) {
-            trigger_error("Given parameter is not a message instance.",
-                          E_USER_ERROR);
-            return;
-        }
-
-        // Set value using serialzed message.
-        $this->value = $msg->serializeToString();
-
-        // Set type url.
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName(get_class($msg));
-        $fully_qualifed_name = $desc->getFullName();
-        $this->type_url = GPBUtil::TYPE_URL_PREFIX.substr(
-            $fully_qualifed_name, 1, strlen($fully_qualifed_name));
-    }
-
-    /**
-     * This method returns whether the type_url in any_message is corresponded
-     * to the given class.
-     * @param klass: The fully qualified PHP class name of a proto message type.
-     */
-    public function is($klass)
-    {
-        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName($klass);
-        $fully_qualifed_name = $desc->getFullName();
-        $type_url = GPBUtil::TYPE_URL_PREFIX.substr(
-            $fully_qualifed_name, 1, strlen($fully_qualifed_name));
-        return $this->type_url === $type_url;
-    }
-}
diff --git a/php/src/Google/Protobuf/Api.php b/php/src/Google/Protobuf/Api.php
deleted file mode 100644
index d0dda3c..0000000
--- a/php/src/Google/Protobuf/Api.php
+++ /dev/null
@@ -1,310 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/api.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Api is a light-weight descriptor for an API Interface.
- * Interfaces are also described as "protocol buffer services" in some contexts,
- * such as by the "service" keyword in a .proto file, but they are different
- * from API Services, which represent a concrete implementation of an interface
- * as opposed to simply a description of methods and bindings. They are also
- * sometimes simply referred to as "APIs" in other contexts, such as the name of
- * this message itself. See https://cloud.google.com/apis/design/glossary for
- * detailed terminology.
- *
- * Generated from protobuf message <code>google.protobuf.Api</code>
- */
-class Api extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The fully qualified name of this interface, including package name
-     * followed by the interface's simple name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * The methods of this interface, in unspecified order.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Method methods = 2;</code>
-     */
-    private $methods;
-    /**
-     * Any metadata attached to the interface.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     */
-    private $options;
-    /**
-     * A version string for this interface. If specified, must have the form
-     * `major-version.minor-version`, as in `1.10`. If the minor version is
-     * omitted, it defaults to zero. If the entire version field is empty, the
-     * major version is derived from the package name, as outlined below. If the
-     * field is not empty, the version in the package name will be verified to be
-     * consistent with what is provided here.
-     * The versioning schema uses [semantic
-     * versioning](http://semver.org) where the major version number
-     * indicates a breaking change and the minor version an additive,
-     * non-breaking change. Both version numbers are signals to users
-     * what to expect from different versions, and should be carefully
-     * chosen based on the product plan.
-     * The major version is also reflected in the package name of the
-     * interface, which must end in `v<major-version>`, as in
-     * `google.feature.v1`. For major versions 0 and 1, the suffix can
-     * be omitted. Zero major versions must only be used for
-     * experimental, non-GA interfaces.
-     *
-     * Generated from protobuf field <code>string version = 4;</code>
-     */
-    private $version = '';
-    /**
-     * Source context for the protocol buffer service represented by this
-     * message.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 5;</code>
-     */
-    private $source_context = null;
-    /**
-     * Included interfaces. See [Mixin][].
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Mixin mixins = 6;</code>
-     */
-    private $mixins;
-    /**
-     * The source syntax of the service.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 7;</code>
-     */
-    private $syntax = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Api::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The fully qualified name of this interface, including package name
-     * followed by the interface's simple name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * The fully qualified name of this interface, including package name
-     * followed by the interface's simple name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * The methods of this interface, in unspecified order.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Method methods = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getMethods()
-    {
-        return $this->methods;
-    }
-
-    /**
-     * The methods of this interface, in unspecified order.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Method methods = 2;</code>
-     * @param \Google\Protobuf\Method[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setMethods($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Method::class);
-        $this->methods = $arr;
-
-        return $this;
-    }
-
-    /**
-     * Any metadata attached to the interface.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Any metadata attached to the interface.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     * @param \Google\Protobuf\Option[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Option::class);
-        $this->options = $arr;
-
-        return $this;
-    }
-
-    /**
-     * A version string for this interface. If specified, must have the form
-     * `major-version.minor-version`, as in `1.10`. If the minor version is
-     * omitted, it defaults to zero. If the entire version field is empty, the
-     * major version is derived from the package name, as outlined below. If the
-     * field is not empty, the version in the package name will be verified to be
-     * consistent with what is provided here.
-     * The versioning schema uses [semantic
-     * versioning](http://semver.org) where the major version number
-     * indicates a breaking change and the minor version an additive,
-     * non-breaking change. Both version numbers are signals to users
-     * what to expect from different versions, and should be carefully
-     * chosen based on the product plan.
-     * The major version is also reflected in the package name of the
-     * interface, which must end in `v<major-version>`, as in
-     * `google.feature.v1`. For major versions 0 and 1, the suffix can
-     * be omitted. Zero major versions must only be used for
-     * experimental, non-GA interfaces.
-     *
-     * Generated from protobuf field <code>string version = 4;</code>
-     * @return string
-     */
-    public function getVersion()
-    {
-        return $this->version;
-    }
-
-    /**
-     * A version string for this interface. If specified, must have the form
-     * `major-version.minor-version`, as in `1.10`. If the minor version is
-     * omitted, it defaults to zero. If the entire version field is empty, the
-     * major version is derived from the package name, as outlined below. If the
-     * field is not empty, the version in the package name will be verified to be
-     * consistent with what is provided here.
-     * The versioning schema uses [semantic
-     * versioning](http://semver.org) where the major version number
-     * indicates a breaking change and the minor version an additive,
-     * non-breaking change. Both version numbers are signals to users
-     * what to expect from different versions, and should be carefully
-     * chosen based on the product plan.
-     * The major version is also reflected in the package name of the
-     * interface, which must end in `v<major-version>`, as in
-     * `google.feature.v1`. For major versions 0 and 1, the suffix can
-     * be omitted. Zero major versions must only be used for
-     * experimental, non-GA interfaces.
-     *
-     * Generated from protobuf field <code>string version = 4;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setVersion($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->version = $var;
-
-        return $this;
-    }
-
-    /**
-     * Source context for the protocol buffer service represented by this
-     * message.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 5;</code>
-     * @return \Google\Protobuf\SourceContext
-     */
-    public function getSourceContext()
-    {
-        return $this->source_context;
-    }
-
-    /**
-     * Source context for the protocol buffer service represented by this
-     * message.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 5;</code>
-     * @param \Google\Protobuf\SourceContext $var
-     * @return $this
-     */
-    public function setSourceContext($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\SourceContext::class);
-        $this->source_context = $var;
-
-        return $this;
-    }
-
-    /**
-     * Included interfaces. See [Mixin][].
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Mixin mixins = 6;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getMixins()
-    {
-        return $this->mixins;
-    }
-
-    /**
-     * Included interfaces. See [Mixin][].
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Mixin mixins = 6;</code>
-     * @param \Google\Protobuf\Mixin[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setMixins($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Mixin::class);
-        $this->mixins = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The source syntax of the service.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 7;</code>
-     * @return int
-     */
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    /**
-     * The source syntax of the service.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 7;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setSyntax($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Syntax::class);
-        $this->syntax = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/BoolValue.php b/php/src/Google/Protobuf/BoolValue.php
deleted file mode 100644
index c28bf94..0000000
--- a/php/src/Google/Protobuf/BoolValue.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `bool`.
- * The JSON representation for `BoolValue` is JSON `true` and `false`.
- *
- * Generated from protobuf message <code>google.protobuf.BoolValue</code>
- */
-class BoolValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The bool value.
-     *
-     * Generated from protobuf field <code>bool value = 1;</code>
-     */
-    private $value = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The bool value.
-     *
-     * Generated from protobuf field <code>bool value = 1;</code>
-     * @return bool
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The bool value.
-     *
-     * Generated from protobuf field <code>bool value = 1;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/BytesValue.php b/php/src/Google/Protobuf/BytesValue.php
deleted file mode 100644
index d6a6b2e..0000000
--- a/php/src/Google/Protobuf/BytesValue.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `bytes`.
- * The JSON representation for `BytesValue` is JSON string.
- *
- * Generated from protobuf message <code>google.protobuf.BytesValue</code>
- */
-class BytesValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The bytes value.
-     *
-     * Generated from protobuf field <code>bytes value = 1;</code>
-     */
-    private $value = '';
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The bytes value.
-     *
-     * Generated from protobuf field <code>bytes value = 1;</code>
-     * @return string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The bytes value.
-     *
-     * Generated from protobuf field <code>bytes value = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Descriptor.php b/php/src/Google/Protobuf/Descriptor.php
deleted file mode 100644
index 986b81e..0000000
--- a/php/src/Google/Protobuf/Descriptor.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GetPublicDescriptorTrait;
-
-class Descriptor
-{
-    use GetPublicDescriptorTrait;
-
-    private $internal_desc;
-
-    /**
-     * @internal
-     */
-    public function __construct($internal_desc)
-    {
-        $this->internal_desc = $internal_desc;
-    }
-
-    /**
-     * @return string Full protobuf message name
-     */
-    public function getFullName()
-    {
-        return trim($this->internal_desc->getFullName(), ".");
-    }
-
-    /**
-     * @return string PHP class name
-     */
-    public function getClass()
-    {
-        return $this->internal_desc->getClass();
-    }
-
-    /**
-     * @param int $index Must be >= 0 and < getFieldCount()
-     * @return FieldDescriptor
-     */
-    public function getField($index)
-    {
-        return $this->getPublicDescriptor($this->internal_desc->getFieldByIndex($index));
-    }
-
-    /**
-     * @return int Number of fields in message
-     */
-    public function getFieldCount()
-    {
-        return count($this->internal_desc->getField());
-    }
-
-    /**
-     * @param int $index Must be >= 0 and < getOneofDeclCount()
-     * @return OneofDescriptor
-     */
-    public function getOneofDecl($index)
-    {
-        return $this->getPublicDescriptor($this->internal_desc->getOneofDecl()[$index]);
-    }
-
-    /**
-     * @return int Number of oneofs in message
-     */
-    public function getOneofDeclCount()
-    {
-        return count($this->internal_desc->getOneofDecl());
-    }
-}
diff --git a/php/src/Google/Protobuf/DescriptorPool.php b/php/src/Google/Protobuf/DescriptorPool.php
deleted file mode 100644
index 119f0e2..0000000
--- a/php/src/Google/Protobuf/DescriptorPool.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-namespace Google\Protobuf;
-
-class DescriptorPool
-{
-    private static $pool;
-
-    private $internal_pool;
-
-    /**
-     * @return DescriptorPool
-     */
-    public static function getGeneratedPool()
-    {
-        if (!isset(self::$pool)) {
-            self::$pool = new DescriptorPool(\Google\Protobuf\Internal\DescriptorPool::getGeneratedPool());
-        }
-        return self::$pool;
-    }
-
-    private function __construct($internal_pool)
-    {
-        $this->internal_pool = $internal_pool;
-    }
-
-    /**
-     * @param string $className A fully qualified protobuf class name
-     * @return Descriptor
-     */
-    public function getDescriptorByClassName($className)
-    {
-        $desc = $this->internal_pool->getDescriptorByClassName($className);
-        return is_null($desc) ? null : $desc->getPublicDescriptor();
-    }
-
-    /**
-     * @param string $className A fully qualified protobuf class name
-     * @return EnumDescriptor
-     */
-    public function getEnumDescriptorByClassName($className)
-    {
-        $desc = $this->internal_pool->getEnumDescriptorByClassName($className);
-        return is_null($desc) ? null : $desc->getPublicDescriptor();
-    }
-}
diff --git a/php/src/Google/Protobuf/DoubleValue.php b/php/src/Google/Protobuf/DoubleValue.php
deleted file mode 100644
index 6718ce3..0000000
--- a/php/src/Google/Protobuf/DoubleValue.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `double`.
- * The JSON representation for `DoubleValue` is JSON number.
- *
- * Generated from protobuf message <code>google.protobuf.DoubleValue</code>
- */
-class DoubleValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The double value.
-     *
-     * Generated from protobuf field <code>double value = 1;</code>
-     */
-    private $value = 0.0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The double value.
-     *
-     * Generated from protobuf field <code>double value = 1;</code>
-     * @return float
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The double value.
-     *
-     * Generated from protobuf field <code>double value = 1;</code>
-     * @param float $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Duration.php b/php/src/Google/Protobuf/Duration.php
deleted file mode 100644
index ca1c4c0..0000000
--- a/php/src/Google/Protobuf/Duration.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/duration.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A Duration represents a signed, fixed-length span of time represented
- * as a count of seconds and fractions of seconds at nanosecond
- * resolution. It is independent of any calendar and concepts like "day"
- * or "month". It is related to Timestamp in that the difference between
- * two Timestamp values is a Duration and it can be added or subtracted
- * from a Timestamp. Range is approximately +-10,000 years.
- * # Examples
- * Example 1: Compute Duration from two Timestamps in pseudo code.
- *     Timestamp start = ...;
- *     Timestamp end = ...;
- *     Duration duration = ...;
- *     duration.seconds = end.seconds - start.seconds;
- *     duration.nanos = end.nanos - start.nanos;
- *     if (duration.seconds < 0 && duration.nanos > 0) {
- *       duration.seconds += 1;
- *       duration.nanos -= 1000000000;
- *     } else if (durations.seconds > 0 && duration.nanos < 0) {
- *       duration.seconds -= 1;
- *       duration.nanos += 1000000000;
- *     }
- * Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
- *     Timestamp start = ...;
- *     Duration duration = ...;
- *     Timestamp end = ...;
- *     end.seconds = start.seconds + duration.seconds;
- *     end.nanos = start.nanos + duration.nanos;
- *     if (end.nanos < 0) {
- *       end.seconds -= 1;
- *       end.nanos += 1000000000;
- *     } else if (end.nanos >= 1000000000) {
- *       end.seconds += 1;
- *       end.nanos -= 1000000000;
- *     }
- * Example 3: Compute Duration from datetime.timedelta in Python.
- *     td = datetime.timedelta(days=3, minutes=10)
- *     duration = Duration()
- *     duration.FromTimedelta(td)
- * # JSON Mapping
- * In JSON format, the Duration type is encoded as a string rather than an
- * object, where the string ends in the suffix "s" (indicating seconds) and
- * is preceded by the number of seconds, with nanoseconds expressed as
- * fractional seconds. For example, 3 seconds with 0 nanoseconds should be
- * encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
- * be expressed in JSON format as "3.000000001s", and 3 seconds and 1
- * microsecond should be expressed in JSON format as "3.000001s".
- *
- * Generated from protobuf message <code>google.protobuf.Duration</code>
- */
-class Duration extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * 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
-     *
-     * Generated from protobuf field <code>int64 seconds = 1;</code>
-     */
-    private $seconds = 0;
-    /**
-     * Signed fractions of a second at nanosecond resolution of the span
-     * of time. Durations less than one second are represented with a 0
-     * `seconds` field and a positive or negative `nanos` field. For durations
-     * of one second or more, a non-zero value for the `nanos` field must be
-     * of the same sign as the `seconds` field. Must be from -999,999,999
-     * to +999,999,999 inclusive.
-     *
-     * Generated from protobuf field <code>int32 nanos = 2;</code>
-     */
-    private $nanos = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Duration::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * 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
-     *
-     * Generated from protobuf field <code>int64 seconds = 1;</code>
-     * @return int|string
-     */
-    public function getSeconds()
-    {
-        return $this->seconds;
-    }
-
-    /**
-     * 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
-     *
-     * Generated from protobuf field <code>int64 seconds = 1;</code>
-     * @param int|string $var
-     * @return $this
-     */
-    public function setSeconds($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->seconds = $var;
-
-        return $this;
-    }
-
-    /**
-     * Signed fractions of a second at nanosecond resolution of the span
-     * of time. Durations less than one second are represented with a 0
-     * `seconds` field and a positive or negative `nanos` field. For durations
-     * of one second or more, a non-zero value for the `nanos` field must be
-     * of the same sign as the `seconds` field. Must be from -999,999,999
-     * to +999,999,999 inclusive.
-     *
-     * Generated from protobuf field <code>int32 nanos = 2;</code>
-     * @return int
-     */
-    public function getNanos()
-    {
-        return $this->nanos;
-    }
-
-    /**
-     * Signed fractions of a second at nanosecond resolution of the span
-     * of time. Durations less than one second are represented with a 0
-     * `seconds` field and a positive or negative `nanos` field. For durations
-     * of one second or more, a non-zero value for the `nanos` field must be
-     * of the same sign as the `seconds` field. Must be from -999,999,999
-     * to +999,999,999 inclusive.
-     *
-     * Generated from protobuf field <code>int32 nanos = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNanos($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->nanos = $var;
-
-        return $this;
-    }
-}
-
diff --git a/php/src/Google/Protobuf/Enum.php b/php/src/Google/Protobuf/Enum.php
deleted file mode 100644
index c63efc7..0000000
--- a/php/src/Google/Protobuf/Enum.php
+++ /dev/null
@@ -1,185 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Enum type definition.
- *
- * Generated from protobuf message <code>google.protobuf.Enum</code>
- */
-class Enum extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Enum type name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * Enum value definitions.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumValue enumvalue = 2;</code>
-     */
-    private $enumvalue;
-    /**
-     * Protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     */
-    private $options;
-    /**
-     * The source context.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 4;</code>
-     */
-    private $source_context = null;
-    /**
-     * The source syntax.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 5;</code>
-     */
-    private $syntax = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Type::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Enum type name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Enum type name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * Enum value definitions.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumValue enumvalue = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getEnumvalue()
-    {
-        return $this->enumvalue;
-    }
-
-    /**
-     * Enum value definitions.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumValue enumvalue = 2;</code>
-     * @param \Google\Protobuf\EnumValue[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setEnumvalue($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\EnumValue::class);
-        $this->enumvalue = $arr;
-
-        return $this;
-    }
-
-    /**
-     * Protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     * @param \Google\Protobuf\Option[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Option::class);
-        $this->options = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The source context.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 4;</code>
-     * @return \Google\Protobuf\SourceContext
-     */
-    public function getSourceContext()
-    {
-        return $this->source_context;
-    }
-
-    /**
-     * The source context.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 4;</code>
-     * @param \Google\Protobuf\SourceContext $var
-     * @return $this
-     */
-    public function setSourceContext($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\SourceContext::class);
-        $this->source_context = $var;
-
-        return $this;
-    }
-
-    /**
-     * The source syntax.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 5;</code>
-     * @return int
-     */
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    /**
-     * The source syntax.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 5;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setSyntax($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Syntax::class);
-        $this->syntax = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/EnumDescriptor.php b/php/src/Google/Protobuf/EnumDescriptor.php
deleted file mode 100644
index a8b56c0..0000000
--- a/php/src/Google/Protobuf/EnumDescriptor.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-namespace Google\Protobuf;
-
-class EnumDescriptor
-{
-    private $internal_desc;
-
-    /**
-     * @internal
-     */
-    public function __construct($internal_desc)
-    {
-        $this->internal_desc = $internal_desc;
-    }
-
-    /**
-     * @return string Full protobuf message name
-     */
-    public function getFullName()
-    {
-        return $this->internal_desc->getFullName();
-    }
-
-    /**
-     * @return string PHP class name
-     */
-    public function getClass()
-    {
-        return $this->internal_desc->getClass();
-    }
-
-    /**
-     * @param int $index Must be >= 0 and < getValueCount()
-     * @return EnumValueDescriptor
-     */
-    public function getValue($index)
-    {
-        return $this->internal_desc->getValueDescriptorByIndex($index);
-    }
-
-    /**
-     * @return int Number of values in enum
-     */
-    public function getValueCount()
-    {
-        return $this->internal_desc->getValueCount();
-    }
-}
diff --git a/php/src/Google/Protobuf/EnumValue.php b/php/src/Google/Protobuf/EnumValue.php
deleted file mode 100644
index e102c29..0000000
--- a/php/src/Google/Protobuf/EnumValue.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Enum value definition.
- *
- * Generated from protobuf message <code>google.protobuf.EnumValue</code>
- */
-class EnumValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Enum value name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * Enum value number.
-     *
-     * Generated from protobuf field <code>int32 number = 2;</code>
-     */
-    private $number = 0;
-    /**
-     * Protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     */
-    private $options;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Type::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Enum value name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Enum value name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * Enum value number.
-     *
-     * Generated from protobuf field <code>int32 number = 2;</code>
-     * @return int
-     */
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    /**
-     * Enum value number.
-     *
-     * Generated from protobuf field <code>int32 number = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-
-        return $this;
-    }
-
-    /**
-     * Protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 3;</code>
-     * @param \Google\Protobuf\Option[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Option::class);
-        $this->options = $arr;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/EnumValueDescriptor.php b/php/src/Google/Protobuf/EnumValueDescriptor.php
deleted file mode 100644
index e76e199..0000000
--- a/php/src/Google/Protobuf/EnumValueDescriptor.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf;
-
-class EnumValueDescriptor
-{
-    private $name;
-    private $number;
-
-    /**
-     * @internal
-     */
-    public function __construct($name, $number)
-    {
-        $this->name = $name;
-        $this->number = $number;
-    }
-
-    /**
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * @return int
-     */
-    public function getNumber()
-    {
-        return $this->number;
-    }
-}
diff --git a/php/src/Google/Protobuf/Field.php b/php/src/Google/Protobuf/Field.php
deleted file mode 100644
index 0b560d8..0000000
--- a/php/src/Google/Protobuf/Field.php
+++ /dev/null
@@ -1,351 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A single field of a message type.
- *
- * Generated from protobuf message <code>google.protobuf.Field</code>
- */
-class Field extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The field type.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Field.Kind kind = 1;</code>
-     */
-    private $kind = 0;
-    /**
-     * The field cardinality.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Field.Cardinality cardinality = 2;</code>
-     */
-    private $cardinality = 0;
-    /**
-     * The field number.
-     *
-     * Generated from protobuf field <code>int32 number = 3;</code>
-     */
-    private $number = 0;
-    /**
-     * The field name.
-     *
-     * Generated from protobuf field <code>string name = 4;</code>
-     */
-    private $name = '';
-    /**
-     * The field type URL, without the scheme, for message or enumeration
-     * types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
-     *
-     * Generated from protobuf field <code>string type_url = 6;</code>
-     */
-    private $type_url = '';
-    /**
-     * The index of the field type in `Type.oneofs`, for message or enumeration
-     * types. The first type has index 1; zero means the type is not in the list.
-     *
-     * Generated from protobuf field <code>int32 oneof_index = 7;</code>
-     */
-    private $oneof_index = 0;
-    /**
-     * Whether to use alternative packed wire representation.
-     *
-     * Generated from protobuf field <code>bool packed = 8;</code>
-     */
-    private $packed = false;
-    /**
-     * The protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 9;</code>
-     */
-    private $options;
-    /**
-     * The field JSON name.
-     *
-     * Generated from protobuf field <code>string json_name = 10;</code>
-     */
-    private $json_name = '';
-    /**
-     * The string value of the default value of this field. Proto2 syntax only.
-     *
-     * Generated from protobuf field <code>string default_value = 11;</code>
-     */
-    private $default_value = '';
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Type::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The field type.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Field.Kind kind = 1;</code>
-     * @return int
-     */
-    public function getKind()
-    {
-        return $this->kind;
-    }
-
-    /**
-     * The field type.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Field.Kind kind = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setKind($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Field_Kind::class);
-        $this->kind = $var;
-
-        return $this;
-    }
-
-    /**
-     * The field cardinality.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Field.Cardinality cardinality = 2;</code>
-     * @return int
-     */
-    public function getCardinality()
-    {
-        return $this->cardinality;
-    }
-
-    /**
-     * The field cardinality.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Field.Cardinality cardinality = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setCardinality($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Field_Cardinality::class);
-        $this->cardinality = $var;
-
-        return $this;
-    }
-
-    /**
-     * The field number.
-     *
-     * Generated from protobuf field <code>int32 number = 3;</code>
-     * @return int
-     */
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    /**
-     * The field number.
-     *
-     * Generated from protobuf field <code>int32 number = 3;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-
-        return $this;
-    }
-
-    /**
-     * The field name.
-     *
-     * Generated from protobuf field <code>string name = 4;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * The field name.
-     *
-     * Generated from protobuf field <code>string name = 4;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * The field type URL, without the scheme, for message or enumeration
-     * types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
-     *
-     * Generated from protobuf field <code>string type_url = 6;</code>
-     * @return string
-     */
-    public function getTypeUrl()
-    {
-        return $this->type_url;
-    }
-
-    /**
-     * The field type URL, without the scheme, for message or enumeration
-     * types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
-     *
-     * Generated from protobuf field <code>string type_url = 6;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setTypeUrl($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->type_url = $var;
-
-        return $this;
-    }
-
-    /**
-     * The index of the field type in `Type.oneofs`, for message or enumeration
-     * types. The first type has index 1; zero means the type is not in the list.
-     *
-     * Generated from protobuf field <code>int32 oneof_index = 7;</code>
-     * @return int
-     */
-    public function getOneofIndex()
-    {
-        return $this->oneof_index;
-    }
-
-    /**
-     * The index of the field type in `Type.oneofs`, for message or enumeration
-     * types. The first type has index 1; zero means the type is not in the list.
-     *
-     * Generated from protobuf field <code>int32 oneof_index = 7;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setOneofIndex($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->oneof_index = $var;
-
-        return $this;
-    }
-
-    /**
-     * Whether to use alternative packed wire representation.
-     *
-     * Generated from protobuf field <code>bool packed = 8;</code>
-     * @return bool
-     */
-    public function getPacked()
-    {
-        return $this->packed;
-    }
-
-    /**
-     * Whether to use alternative packed wire representation.
-     *
-     * Generated from protobuf field <code>bool packed = 8;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setPacked($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->packed = $var;
-
-        return $this;
-    }
-
-    /**
-     * The protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 9;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * The protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 9;</code>
-     * @param \Google\Protobuf\Option[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Option::class);
-        $this->options = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The field JSON name.
-     *
-     * Generated from protobuf field <code>string json_name = 10;</code>
-     * @return string
-     */
-    public function getJsonName()
-    {
-        return $this->json_name;
-    }
-
-    /**
-     * The field JSON name.
-     *
-     * Generated from protobuf field <code>string json_name = 10;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setJsonName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->json_name = $var;
-
-        return $this;
-    }
-
-    /**
-     * The string value of the default value of this field. Proto2 syntax only.
-     *
-     * Generated from protobuf field <code>string default_value = 11;</code>
-     * @return string
-     */
-    public function getDefaultValue()
-    {
-        return $this->default_value;
-    }
-
-    /**
-     * The string value of the default value of this field. Proto2 syntax only.
-     *
-     * Generated from protobuf field <code>string default_value = 11;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setDefaultValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->default_value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/FieldDescriptor.php b/php/src/Google/Protobuf/FieldDescriptor.php
deleted file mode 100644
index ac9271f..0000000
--- a/php/src/Google/Protobuf/FieldDescriptor.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GetPublicDescriptorTrait;
-use Google\Protobuf\Internal\GPBType;
-
-class FieldDescriptor
-{
-    use GetPublicDescriptorTrait;
-
-    private $internal_desc;
-
-    /**
-     * @internal
-     */
-    public function __construct($internal_desc)
-    {
-        $this->internal_desc = $internal_desc;
-    }
-
-    /**
-     * @return string Field name
-     */
-    public function getName()
-    {
-        return $this->internal_desc->getName();
-    }
-
-    /**
-     * @return int Protobuf field number
-     */
-    public function getNumber()
-    {
-        return $this->internal_desc->getNumber();
-    }
-
-    /**
-     * @return int
-     */
-    public function getLabel()
-    {
-        return $this->internal_desc->getLabel();
-    }
-
-    /**
-     * @return int
-     */
-    public function getType()
-    {
-        return $this->internal_desc->getType();
-    }
-
-    /**
-     * @return Descriptor Returns a descriptor for the field type if the field type is a message, otherwise throws \Exception
-     * @throws \Exception
-     */
-    public function getMessageType()
-    {
-        if ($this->getType() == GPBType::MESSAGE) {
-            return $this->getPublicDescriptor($this->internal_desc->getMessageType());
-        } else {
-            throw new \Exception("Cannot get message type for non-message field '" . $this->getName() . "'");
-        }
-    }
-
-    /**
-     * @return EnumDescriptor Returns an enum descriptor if the field type is an enum, otherwise throws \Exception
-     * @throws \Exception
-     */
-    public function getEnumType()
-    {
-        if ($this->getType() == GPBType::ENUM) {
-            return $this->getPublicDescriptor($this->internal_desc->getEnumType());
-        } else {
-            throw new \Exception("Cannot get enum type for non-enum field '" . $this->getName() . "'");
-        }
-    }
-
-    /**
-     * @return boolean
-     */
-    public function isMap()
-    {
-        return $this->internal_desc->isMap();
-    }
-}
diff --git a/php/src/Google/Protobuf/FieldMask.php b/php/src/Google/Protobuf/FieldMask.php
deleted file mode 100644
index e18586a..0000000
--- a/php/src/Google/Protobuf/FieldMask.php
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/field_mask.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * `FieldMask` represents a set of symbolic field paths, for example:
- *     paths: "f.a"
- *     paths: "f.b.d"
- * Here `f` represents a field in some root message, `a` and `b`
- * fields in the message found in `f`, and `d` a field found in the
- * message in `f.b`.
- * Field masks are used to specify a subset of fields that should be
- * returned by a get operation or modified by an update operation.
- * Field masks also have a custom JSON encoding (see below).
- * # Field Masks in Projections
- * When used in the context of a projection, a response message or
- * sub-message is filtered by the API to only contain those fields as
- * specified in the mask. For example, if the mask in the previous
- * example is applied to a response message as follows:
- *     f {
- *       a : 22
- *       b {
- *         d : 1
- *         x : 2
- *       }
- *       y : 13
- *     }
- *     z: 8
- * The result will not contain specific values for fields x,y and z
- * (their value will be set to the default, and omitted in proto text
- * output):
- *     f {
- *       a : 22
- *       b {
- *         d : 1
- *       }
- *     }
- * A repeated field is not allowed except at the last position of a
- * paths string.
- * If a FieldMask object is not present in a get operation, the
- * operation applies to all fields (as if a FieldMask of all fields
- * had been specified).
- * Note that a field mask does not necessarily apply to the
- * top-level response message. In case of a REST get operation, the
- * field mask applies directly to the response, but in case of a REST
- * list operation, the mask instead applies to each individual message
- * in the returned resource list. In case of a REST custom method,
- * other definitions may be used. Where the mask applies will be
- * clearly documented together with its declaration in the API.  In
- * any case, the effect on the returned resource/resources is required
- * behavior for APIs.
- * # Field Masks in Update Operations
- * A field mask in update operations specifies which fields of the
- * targeted resource are going to be updated. The API is required
- * to only change the values of the fields as specified in the mask
- * and leave the others untouched. If a resource is passed in to
- * describe the updated values, the API ignores the values of all
- * fields not covered by the mask.
- * If a repeated field is specified for an update operation, the existing
- * repeated values in the target resource will be overwritten by the new values.
- * Note that a repeated field is only allowed in the last position of a `paths`
- * string.
- * If a sub-message is specified in the last position of the field mask for an
- * update operation, then the existing sub-message in the target resource is
- * overwritten. Given the target message:
- *     f {
- *       b {
- *         d : 1
- *         x : 2
- *       }
- *       c : 1
- *     }
- * And an update message:
- *     f {
- *       b {
- *         d : 10
- *       }
- *     }
- * then if the field mask is:
- *  paths: "f.b"
- * then the result will be:
- *     f {
- *       b {
- *         d : 10
- *       }
- *       c : 1
- *     }
- * However, if the update mask was:
- *  paths: "f.b.d"
- * then the result would be:
- *     f {
- *       b {
- *         d : 10
- *         x : 2
- *       }
- *       c : 1
- *     }
- * In order to reset a field's value to the default, the field must
- * be in the mask and set to the default value in the provided resource.
- * Hence, in order to reset all fields of a resource, provide a default
- * instance of the resource and set all fields in the mask, or do
- * not provide a mask as described below.
- * If a field mask is not present on update, the operation applies to
- * all fields (as if a field mask of all fields has been specified).
- * Note that in the presence of schema evolution, this may mean that
- * fields the client does not know and has therefore not filled into
- * the request will be reset to their default. If this is unwanted
- * behavior, a specific service may require a client to always specify
- * a field mask, producing an error if not.
- * As with get operations, the location of the resource which
- * describes the updated values in the request message depends on the
- * operation kind. In any case, the effect of the field mask is
- * required to be honored by the API.
- * ## Considerations for HTTP REST
- * The HTTP kind of an update operation which uses a field mask must
- * be set to PATCH instead of PUT in order to satisfy HTTP semantics
- * (PUT must only be used for full updates).
- * # JSON Encoding of Field Masks
- * In JSON, a field mask is encoded as a single string where paths are
- * separated by a comma. Fields name in each path are converted
- * to/from lower-camel naming conventions.
- * As an example, consider the following message declarations:
- *     message Profile {
- *       User user = 1;
- *       Photo photo = 2;
- *     }
- *     message User {
- *       string display_name = 1;
- *       string address = 2;
- *     }
- * In proto a field mask for `Profile` may look as such:
- *     mask {
- *       paths: "user.display_name"
- *       paths: "photo"
- *     }
- * In JSON, the same mask is represented as below:
- *     {
- *       mask: "user.displayName,photo"
- *     }
- * # Field Masks and Oneof Fields
- * Field masks treat fields in oneofs just as regular fields. Consider the
- * following message:
- *     message SampleMessage {
- *       oneof test_oneof {
- *         string name = 4;
- *         SubMessage sub_message = 9;
- *       }
- *     }
- * The field mask can be:
- *     mask {
- *       paths: "name"
- *     }
- * Or:
- *     mask {
- *       paths: "sub_message"
- *     }
- * Note that oneof type names ("test_oneof" in this case) cannot be used in
- * paths.
- *
- * Generated from protobuf message <code>google.protobuf.FieldMask</code>
- */
-class FieldMask extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The set of field mask paths.
-     *
-     * Generated from protobuf field <code>repeated string paths = 1;</code>
-     */
-    private $paths;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\FieldMask::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The set of field mask paths.
-     *
-     * Generated from protobuf field <code>repeated string paths = 1;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getPaths()
-    {
-        return $this->paths;
-    }
-
-    /**
-     * The set of field mask paths.
-     *
-     * Generated from protobuf field <code>repeated string paths = 1;</code>
-     * @param string[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setPaths($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
-        $this->paths = $arr;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Field_Cardinality.php b/php/src/Google/Protobuf/Field_Cardinality.php
deleted file mode 100644
index 422587c..0000000
--- a/php/src/Google/Protobuf/Field_Cardinality.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-/**
- * Whether a field is optional, required, or repeated.
- *
- * Protobuf enum <code>Google\Protobuf\Field\Cardinality</code>
- */
-class Field_Cardinality
-{
-    /**
-     * For fields with unknown cardinality.
-     *
-     * Generated from protobuf enum <code>CARDINALITY_UNKNOWN = 0;</code>
-     */
-    const CARDINALITY_UNKNOWN = 0;
-    /**
-     * For optional fields.
-     *
-     * Generated from protobuf enum <code>CARDINALITY_OPTIONAL = 1;</code>
-     */
-    const CARDINALITY_OPTIONAL = 1;
-    /**
-     * For required fields. Proto2 syntax only.
-     *
-     * Generated from protobuf enum <code>CARDINALITY_REQUIRED = 2;</code>
-     */
-    const CARDINALITY_REQUIRED = 2;
-    /**
-     * For repeated fields.
-     *
-     * Generated from protobuf enum <code>CARDINALITY_REPEATED = 3;</code>
-     */
-    const CARDINALITY_REPEATED = 3;
-}
-
diff --git a/php/src/Google/Protobuf/Field_Kind.php b/php/src/Google/Protobuf/Field_Kind.php
deleted file mode 100644
index d077497..0000000
--- a/php/src/Google/Protobuf/Field_Kind.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-/**
- * Basic field types.
- *
- * Protobuf enum <code>Google\Protobuf\Field\Kind</code>
- */
-class Field_Kind
-{
-    /**
-     * Field type unknown.
-     *
-     * Generated from protobuf enum <code>TYPE_UNKNOWN = 0;</code>
-     */
-    const TYPE_UNKNOWN = 0;
-    /**
-     * Field type double.
-     *
-     * Generated from protobuf enum <code>TYPE_DOUBLE = 1;</code>
-     */
-    const TYPE_DOUBLE = 1;
-    /**
-     * Field type float.
-     *
-     * Generated from protobuf enum <code>TYPE_FLOAT = 2;</code>
-     */
-    const TYPE_FLOAT = 2;
-    /**
-     * Field type int64.
-     *
-     * Generated from protobuf enum <code>TYPE_INT64 = 3;</code>
-     */
-    const TYPE_INT64 = 3;
-    /**
-     * Field type uint64.
-     *
-     * Generated from protobuf enum <code>TYPE_UINT64 = 4;</code>
-     */
-    const TYPE_UINT64 = 4;
-    /**
-     * Field type int32.
-     *
-     * Generated from protobuf enum <code>TYPE_INT32 = 5;</code>
-     */
-    const TYPE_INT32 = 5;
-    /**
-     * Field type fixed64.
-     *
-     * Generated from protobuf enum <code>TYPE_FIXED64 = 6;</code>
-     */
-    const TYPE_FIXED64 = 6;
-    /**
-     * Field type fixed32.
-     *
-     * Generated from protobuf enum <code>TYPE_FIXED32 = 7;</code>
-     */
-    const TYPE_FIXED32 = 7;
-    /**
-     * Field type bool.
-     *
-     * Generated from protobuf enum <code>TYPE_BOOL = 8;</code>
-     */
-    const TYPE_BOOL = 8;
-    /**
-     * Field type string.
-     *
-     * Generated from protobuf enum <code>TYPE_STRING = 9;</code>
-     */
-    const TYPE_STRING = 9;
-    /**
-     * Field type group. Proto2 syntax only, and deprecated.
-     *
-     * Generated from protobuf enum <code>TYPE_GROUP = 10;</code>
-     */
-    const TYPE_GROUP = 10;
-    /**
-     * Field type message.
-     *
-     * Generated from protobuf enum <code>TYPE_MESSAGE = 11;</code>
-     */
-    const TYPE_MESSAGE = 11;
-    /**
-     * Field type bytes.
-     *
-     * Generated from protobuf enum <code>TYPE_BYTES = 12;</code>
-     */
-    const TYPE_BYTES = 12;
-    /**
-     * Field type uint32.
-     *
-     * Generated from protobuf enum <code>TYPE_UINT32 = 13;</code>
-     */
-    const TYPE_UINT32 = 13;
-    /**
-     * Field type enum.
-     *
-     * Generated from protobuf enum <code>TYPE_ENUM = 14;</code>
-     */
-    const TYPE_ENUM = 14;
-    /**
-     * Field type sfixed32.
-     *
-     * Generated from protobuf enum <code>TYPE_SFIXED32 = 15;</code>
-     */
-    const TYPE_SFIXED32 = 15;
-    /**
-     * Field type sfixed64.
-     *
-     * Generated from protobuf enum <code>TYPE_SFIXED64 = 16;</code>
-     */
-    const TYPE_SFIXED64 = 16;
-    /**
-     * Field type sint32.
-     *
-     * Generated from protobuf enum <code>TYPE_SINT32 = 17;</code>
-     */
-    const TYPE_SINT32 = 17;
-    /**
-     * Field type sint64.
-     *
-     * Generated from protobuf enum <code>TYPE_SINT64 = 18;</code>
-     */
-    const TYPE_SINT64 = 18;
-}
-
diff --git a/php/src/Google/Protobuf/FloatValue.php b/php/src/Google/Protobuf/FloatValue.php
deleted file mode 100644
index 68787ef..0000000
--- a/php/src/Google/Protobuf/FloatValue.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `float`.
- * The JSON representation for `FloatValue` is JSON number.
- *
- * Generated from protobuf message <code>google.protobuf.FloatValue</code>
- */
-class FloatValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The float value.
-     *
-     * Generated from protobuf field <code>float value = 1;</code>
-     */
-    private $value = 0.0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The float value.
-     *
-     * Generated from protobuf field <code>float value = 1;</code>
-     * @return float
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The float value.
-     *
-     * Generated from protobuf field <code>float value = 1;</code>
-     * @param float $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkFloat($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/GPBEmpty.php b/php/src/Google/Protobuf/GPBEmpty.php
deleted file mode 100644
index 24a93f9..0000000
--- a/php/src/Google/Protobuf/GPBEmpty.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/empty.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A generic empty message that you can re-use to avoid defining duplicated
- * empty messages in your APIs. A typical example is to use it as the request
- * or the response type of an API method. For instance:
- *     service Foo {
- *       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
- *     }
- * The JSON representation for `Empty` is empty JSON object `{}`.
- *
- * Generated from protobuf message <code>google.protobuf.Empty</code>
- */
-class GPBEmpty extends \Google\Protobuf\Internal\Message
-{
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\GPBEmpty::initOnce();
-        parent::__construct();
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Int32Value.php b/php/src/Google/Protobuf/Int32Value.php
deleted file mode 100644
index d48aff1..0000000
--- a/php/src/Google/Protobuf/Int32Value.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `int32`.
- * The JSON representation for `Int32Value` is JSON number.
- *
- * Generated from protobuf message <code>google.protobuf.Int32Value</code>
- */
-class Int32Value extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The int32 value.
-     *
-     * Generated from protobuf field <code>int32 value = 1;</code>
-     */
-    private $value = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The int32 value.
-     *
-     * Generated from protobuf field <code>int32 value = 1;</code>
-     * @return int
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The int32 value.
-     *
-     * Generated from protobuf field <code>int32 value = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Int64Value.php b/php/src/Google/Protobuf/Int64Value.php
deleted file mode 100644
index a6fb9c5..0000000
--- a/php/src/Google/Protobuf/Int64Value.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `int64`.
- * The JSON representation for `Int64Value` is JSON string.
- *
- * Generated from protobuf message <code>google.protobuf.Int64Value</code>
- */
-class Int64Value extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The int64 value.
-     *
-     * Generated from protobuf field <code>int64 value = 1;</code>
-     */
-    private $value = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The int64 value.
-     *
-     * Generated from protobuf field <code>int64 value = 1;</code>
-     * @return int|string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The int64 value.
-     *
-     * Generated from protobuf field <code>int64 value = 1;</code>
-     * @param int|string $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/CodedInputStream.php b/php/src/Google/Protobuf/Internal/CodedInputStream.php
deleted file mode 100644
index b612da5..0000000
--- a/php/src/Google/Protobuf/Internal/CodedInputStream.php
+++ /dev/null
@@ -1,378 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\Uint64;
-
-class CodedInputStream
-{
-
-    private $buffer;
-    private $buffer_size_after_limit;
-    private $buffer_end;
-    private $current;
-    private $current_limit;
-    private $legitimate_message_end;
-    private $recursion_budget;
-    private $recursion_limit;
-    private $total_bytes_limit;
-    private $total_bytes_read;
-
-    const MAX_VARINT_BYTES = 10;
-    const DEFAULT_RECURSION_LIMIT = 100;
-    const DEFAULT_TOTAL_BYTES_LIMIT = 33554432; // 32 << 20, 32MB
-
-    public function __construct($buffer)
-    {
-        $start = 0;
-        $end = strlen($buffer);
-        $this->buffer = $buffer;
-        $this->buffer_size_after_limit = 0;
-        $this->buffer_end = $end;
-        $this->current = $start;
-        $this->current_limit = $end;
-        $this->legitimate_message_end = false;
-        $this->recursion_budget = self::DEFAULT_RECURSION_LIMIT;
-        $this->recursion_limit = self::DEFAULT_RECURSION_LIMIT;
-        $this->total_bytes_limit = self::DEFAULT_TOTAL_BYTES_LIMIT;
-        $this->total_bytes_read = $end - $start;
-    }
-
-    private function advance($amount)
-    {
-        $this->current += $amount;
-    }
-
-    public function bufferSize()
-    {
-        return $this->buffer_end - $this->current;
-    }
-
-    public function current()
-    {
-        return $this->total_bytes_read -
-            ($this->buffer_end - $this->current +
-            $this->buffer_size_after_limit);
-    }
-
-    public function substr($start, $end)
-    {
-        return substr($this->buffer, $start, $end - $start);
-    }
-
-    private function recomputeBufferLimits()
-    {
-        $this->buffer_end += $this->buffer_size_after_limit;
-        $closest_limit = min($this->current_limit, $this->total_bytes_limit);
-        if ($closest_limit < $this->total_bytes_read) {
-            // The limit position is in the current buffer.  We must adjust the
-            // buffer size accordingly.
-            $this->buffer_size_after_limit = $this->total_bytes_read -
-                $closest_limit;
-            $this->buffer_end -= $this->buffer_size_after_limit;
-        } else {
-            $this->buffer_size_after_limit = 0;
-        }
-    }
-
-    private function consumedEntireMessage()
-    {
-        return $this->legitimate_message_end;
-    }
-
-    /**
-     * Read uint32 into $var. Advance buffer with consumed bytes. If the
-     * contained varint is larger than 32 bits, discard the high order bits.
-     * @param $var.
-     */
-    public function readVarint32(&$var)
-    {
-        if (!$this->readVarint64($var)) {
-            return false;
-        }
-
-        if (PHP_INT_SIZE == 4) {
-            $var = bcmod($var, 4294967296);
-        } else {
-            $var &= 0xFFFFFFFF;
-        }
-
-        // Convert large uint32 to int32.
-        if ($var > 0x7FFFFFFF) {
-            if (PHP_INT_SIZE === 8) {
-                $var = $var | (0xFFFFFFFF << 32);
-            } else {
-                $var = bcsub($var, 4294967296);
-            }
-        }
-
-        $var = intval($var);
-        return true;
-    }
-
-    /**
-     * Read Uint64 into $var. Advance buffer with consumed bytes.
-     * @param $var.
-     */
-    public function readVarint64(&$var)
-    {
-        $count = 0;
-
-        if (PHP_INT_SIZE == 4) {
-            $high = 0;
-            $low = 0;
-            $b = 0;
-
-            do {
-                if ($this->current === $this->buffer_end) {
-                    return false;
-                }
-                if ($count === self::MAX_VARINT_BYTES) {
-                    return false;
-                }
-                $b = ord($this->buffer[$this->current]);
-                $bits = 7 * $count;
-                if ($bits >= 32) {
-                    $high |= (($b & 0x7F) << ($bits - 32));
-                } else if ($bits > 25){
-                    // $bits is 28 in this case.
-                    $low |= (($b & 0x7F) << 28);
-                    $high = ($b & 0x7F) >> 4;
-                } else {
-                    $low |= (($b & 0x7F) << $bits);
-                }
-
-                $this->advance(1);
-                $count += 1;
-            } while ($b & 0x80);
-
-            $var = GPBUtil::combineInt32ToInt64($high, $low);
-            if (bccomp($var, 0) < 0) {
-                $var = bcadd($var, "18446744073709551616");
-            }
-        } else {
-            $result = 0;
-            $shift = 0;
-
-            do {
-                if ($this->current === $this->buffer_end) {
-                    return false;
-                }
-                if ($count === self::MAX_VARINT_BYTES) {
-                    return false;
-                }
-
-                $byte = ord($this->buffer[$this->current]);
-                $result |= ($byte & 0x7f) << $shift;
-                $shift += 7;
-                $this->advance(1);
-                $count += 1;
-            } while ($byte > 0x7f);
-
-            $var = $result;
-        }
-
-        return true;
-    }
-
-    /**
-     * Read int into $var. If the result is larger than the largest integer, $var
-     * will be -1. Advance buffer with consumed bytes.
-     * @param $var.
-     */
-    public function readVarintSizeAsInt(&$var)
-    {
-        if (!$this->readVarint64($var)) {
-            return false;
-        }
-        $var = (int)$var;
-        return true;
-    }
-
-    /**
-     * Read 32-bit unsiged integer to $var. If the buffer has less than 4 bytes,
-     * return false. Advance buffer with consumed bytes.
-     * @param $var.
-     */
-    public function readLittleEndian32(&$var)
-    {
-        $data = null;
-        if (!$this->readRaw(4, $data)) {
-            return false;
-        }
-        $var = unpack('V', $data);
-        $var = $var[1];
-        return true;
-    }
-
-    /**
-     * Read 64-bit unsiged integer to $var. If the buffer has less than 8 bytes,
-     * return false. Advance buffer with consumed bytes.
-     * @param $var.
-     */
-    public function readLittleEndian64(&$var)
-    {
-        $data = null;
-        if (!$this->readRaw(4, $data)) {
-            return false;
-        }
-        $low = unpack('V', $data)[1];
-        if (!$this->readRaw(4, $data)) {
-            return false;
-        }
-        $high = unpack('V', $data)[1];
-        if (PHP_INT_SIZE == 4) {
-            $var = GPBUtil::combineInt32ToInt64($high, $low);
-        } else {
-            $var = ($high << 32) | $low;
-        }
-        return true;
-    }
-
-    /**
-     * Read tag into $var. Advance buffer with consumed bytes.
-     * @param $var.
-     */
-    public function readTag()
-    {
-        if ($this->current === $this->buffer_end) {
-            // Make sure that it failed due to EOF, not because we hit
-            // total_bytes_limit, which, unlike normal limits, is not a valid
-            // place to end a message.
-            $current_position = $this->total_bytes_read -
-                $this->buffer_size_after_limit;
-            if ($current_position >= $this->total_bytes_limit) {
-                // Hit total_bytes_limit_.  But if we also hit the normal limit,
-                // we're still OK.
-                $this->legitimate_message_end =
-                    ($this->current_limit === $this->total_bytes_limit);
-            } else {
-                $this->legitimate_message_end = true;
-            }
-            return 0;
-        }
-
-        $result = 0;
-        // The larget tag is 2^29 - 1, which can be represented by int32.
-        $success = $this->readVarint32($result);
-        if ($success) {
-            return $result;
-        } else {
-            return 0;
-        }
-    }
-
-    public function readRaw($size, &$buffer)
-    {
-        $current_buffer_size = 0;
-        if ($this->bufferSize() < $size) {
-            return false;
-        }
-
-        $buffer = substr($this->buffer, $this->current, $size);
-        $this->advance($size);
-
-        return true;
-    }
-
-    /* Places a limit on the number of bytes that the stream may read, starting
-     * from the current position.  Once the stream hits this limit, it will act
-     * like the end of the input has been reached until popLimit() is called.
-     *
-     * As the names imply, the stream conceptually has a stack of limits.  The
-     * shortest limit on the stack is always enforced, even if it is not the top
-     * limit.
-     *
-     * The value returned by pushLimit() is opaque to the caller, and must be
-     * passed unchanged to the corresponding call to popLimit().
-     *
-     * @param integer $byte_limit
-     * @throws Exception Fail to push limit.
-     */
-    public function pushLimit($byte_limit)
-    {
-        // Current position relative to the beginning of the stream.
-        $current_position = $this->current();
-        $old_limit = $this->current_limit;
-
-        // security: byte_limit is possibly evil, so check for negative values
-        // and overflow.
-        if ($byte_limit >= 0 &&
-            $byte_limit <= PHP_INT_MAX - $current_position &&
-            $byte_limit <= $this->current_limit - $current_position) {
-            $this->current_limit = $current_position + $byte_limit;
-            $this->recomputeBufferLimits();
-        } else {
-            throw new GPBDecodeException("Fail to push limit.");
-        }
-
-        return $old_limit;
-    }
-
-    /* The limit passed in is actually the *old* limit, which we returned from
-     * PushLimit().
-     *
-     * @param integer $byte_limit
-     */
-    public function popLimit($byte_limit)
-    {
-        $this->current_limit = $byte_limit;
-        $this->recomputeBufferLimits();
-        // We may no longer be at a legitimate message end.  ReadTag() needs to
-        // be called again to find out.
-        $this->legitimate_message_end = false;
-    }
-
-    public function incrementRecursionDepthAndPushLimit(
-        $byte_limit, &$old_limit, &$recursion_budget)
-    {
-        $old_limit = $this->pushLimit($byte_limit);
-        $recursion_limit = --$this->recursion_limit;
-    }
-
-    public function decrementRecursionDepthAndPopLimit($byte_limit)
-    {
-        $result = $this->consumedEntireMessage();
-        $this->popLimit($byte_limit);
-        ++$this->recursion_budget;
-        return $result;
-    }
-
-    public function bytesUntilLimit()
-    {
-        if ($this->current_limit === PHP_INT_MAX) {
-            return -1;
-        }
-        return $this->current_limit - $this->current;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/CodedOutputStream.php b/php/src/Google/Protobuf/Internal/CodedOutputStream.php
deleted file mode 100644
index f75e9c6..0000000
--- a/php/src/Google/Protobuf/Internal/CodedOutputStream.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class CodedOutputStream
-{
-
-    private $buffer;
-    private $buffer_size;
-    private $current;
-
-    const MAX_VARINT64_BYTES = 10;
-
-    public function __construct($size)
-    {
-        $this->current = 0;
-        $this->buffer_size = $size;
-        $this->buffer = str_repeat(chr(0), $this->buffer_size);
-    }
-
-    public function getData()
-    {
-        return $this->buffer;
-    }
-
-    public function writeVarint32($value, $trim)
-    {
-        $bytes = str_repeat(chr(0), self::MAX_VARINT64_BYTES);
-        $size = self::writeVarintToArray($value, $bytes, $trim);
-        return $this->writeRaw($bytes, $size);
-    }
-
-    public function writeVarint64($value)
-    {
-        $bytes = str_repeat(chr(0), self::MAX_VARINT64_BYTES);
-        $size = self::writeVarintToArray($value, $bytes);
-        return $this->writeRaw($bytes, $size);
-    }
-
-    public function writeLittleEndian32($value)
-    {
-        $bytes = str_repeat(chr(0), 4);
-        $size = self::writeLittleEndian32ToArray($value, $bytes);
-        return $this->writeRaw($bytes, $size);
-    }
-
-    public function writeLittleEndian64($value)
-    {
-        $bytes = str_repeat(chr(0), 8);
-        $size = self::writeLittleEndian64ToArray($value, $bytes);
-        return $this->writeRaw($bytes, $size);
-    }
-
-    public function writeTag($tag)
-    {
-        return $this->writeVarint32($tag, true);
-    }
-
-    public function writeRaw($data, $size)
-    {
-        if ($this->buffer_size < $size) {
-            trigger_error("Output stream doesn't have enough buffer.");
-            return false;
-        }
-
-        for ($i = 0; $i < $size; $i++) {
-            $this->buffer[$this->current] = $data[$i];
-            $this->current++;
-            $this->buffer_size--;
-        }
-        return true;
-    }
-
-    public static function writeVarintToArray($value, &$buffer, $trim = false)
-    {
-        $current = 0;
-
-        $high = 0;
-        $low = 0;
-        if (PHP_INT_SIZE == 4) {
-            GPBUtil::divideInt64ToInt32($value, $high, $low, $trim);
-        } else {
-            $low = $value;
-        }
-
-        while (($low >= 0x80 || $low < 0) || $high != 0) {
-            $buffer[$current] = chr($low | 0x80);
-            $value = ($value >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7));
-            $carry = ($high & 0x7F) << ((PHP_INT_SIZE << 3) - 7);
-            $high = ($high >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7));
-            $low = (($low >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7)) | $carry);
-            $current++;
-        }
-        $buffer[$current] = chr($low);
-        return $current + 1;
-    }
-
-    private static function writeLittleEndian32ToArray($value, &$buffer)
-    {
-        $buffer[0] = chr($value & 0x000000FF);
-        $buffer[1] = chr(($value >> 8) & 0x000000FF);
-        $buffer[2] = chr(($value >> 16) & 0x000000FF);
-        $buffer[3] = chr(($value >> 24) & 0x000000FF);
-        return 4;
-    }
-
-    private static function writeLittleEndian64ToArray($value, &$buffer)
-    {
-        $high = 0;
-        $low = 0;
-        if (PHP_INT_SIZE == 4) {
-            GPBUtil::divideInt64ToInt32($value, $high, $low);
-        } else {
-            $low = $value & 0xFFFFFFFF;
-            $high = ($value >> 32) & 0xFFFFFFFF;
-        }
-
-        $buffer[0] = chr($low & 0x000000FF);
-        $buffer[1] = chr(($low >> 8) & 0x000000FF);
-        $buffer[2] = chr(($low >> 16) & 0x000000FF);
-        $buffer[3] = chr(($low >> 24) & 0x000000FF);
-        $buffer[4] = chr($high & 0x000000FF);
-        $buffer[5] = chr(($high >> 8) & 0x000000FF);
-        $buffer[6] = chr(($high >> 16) & 0x000000FF);
-        $buffer[7] = chr(($high >> 24) & 0x000000FF);
-        return 8;
-    }
-
-}
diff --git a/php/src/Google/Protobuf/Internal/Descriptor.php b/php/src/Google/Protobuf/Internal/Descriptor.php
deleted file mode 100644
index ee3a8bd..0000000
--- a/php/src/Google/Protobuf/Internal/Descriptor.php
+++ /dev/null
@@ -1,208 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class Descriptor
-{
-    use HasPublicDescriptorTrait;
-
-    private $full_name;
-    private $field = [];
-    private $json_to_field = [];
-    private $name_to_field = [];
-    private $index_to_field = [];
-    private $nested_type = [];
-    private $enum_type = [];
-    private $klass;
-    private $options;
-    private $oneof_decl = [];
-
-    public function __construct()
-    {
-        $this->public_desc = new \Google\Protobuf\Descriptor($this);
-    }
-
-    public function addOneofDecl($oneof)
-    {
-        $this->oneof_decl[] = $oneof;
-    }
-
-    public function getOneofDecl()
-    {
-        return $this->oneof_decl;
-    }
-
-    public function setFullName($full_name)
-    {
-        $this->full_name = $full_name;
-    }
-
-    public function getFullName()
-    {
-        return $this->full_name;
-    }
-
-    public function addField($field)
-    {
-        $this->field[$field->getNumber()] = $field;
-        $this->json_to_field[$field->getJsonName()] = $field;
-        $this->name_to_field[$field->getName()] = $field;
-        $this->index_to_field[] = $field;
-    }
-
-    public function getField()
-    {
-        return $this->field;
-    }
-
-    public function addNestedType($desc)
-    {
-        $this->nested_type[] = $desc;
-    }
-
-    public function getNestedType()
-    {
-        return $this->nested_type;
-    }
-
-    public function addEnumType($desc)
-    {
-        $this->enum_type[] = $desc;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function getFieldByNumber($number)
-    {
-        if (!isset($this->field[$number])) {
-          return NULL;
-        } else {
-          return $this->field[$number];
-        }
-    }
-
-    public function getFieldByJsonName($json_name)
-    {
-        if (!isset($this->json_to_field[$json_name])) {
-          return NULL;
-        } else {
-          return $this->json_to_field[$json_name];
-        }
-    }
-
-    public function getFieldByName($name)
-    {
-        if (!isset($this->name_to_field[$name])) {
-          return NULL;
-        } else {
-          return $this->name_to_field[$name];
-        }
-    }
-
-    public function getFieldByIndex($index)
-    {
-        if (count($this->index_to_field) <= $index) {
-            return NULL;
-        } else {
-            return $this->index_to_field[$index];
-        }
-    }
-
-    public function setClass($klass)
-    {
-        $this->klass = $klass;
-    }
-
-    public function getClass()
-    {
-        return $this->klass;
-    }
-
-    public function setOptions($options)
-    {
-        $this->options = $options;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public static function buildFromProto($proto, $file_proto, $containing)
-    {
-        $desc = new Descriptor();
-
-        $message_name_without_package  = "";
-        $classname = "";
-        $fullname = "";
-        GPBUtil::getFullClassName(
-            $proto,
-            $containing,
-            $file_proto,
-            $message_name_without_package,
-            $classname,
-            $fullname);
-        $desc->setFullName($fullname);
-        $desc->setClass($classname);
-        $desc->setOptions($proto->getOptions());
-
-        foreach ($proto->getField() as $field_proto) {
-            $desc->addField(FieldDescriptor::buildFromProto($field_proto));
-        }
-
-        // Handle nested types.
-        foreach ($proto->getNestedType() as $nested_proto) {
-            $desc->addNestedType(Descriptor::buildFromProto(
-              $nested_proto, $file_proto, $message_name_without_package));
-        }
-
-        // Handle nested enum.
-        foreach ($proto->getEnumType() as $enum_proto) {
-            $desc->addEnumType(EnumDescriptor::buildFromProto(
-              $enum_proto, $file_proto, $message_name_without_package));
-        }
-
-        // Handle oneof fields.
-        $index = 0;
-        foreach ($proto->getOneofDecl() as $oneof_proto) {
-            $desc->addOneofDecl(
-                OneofDescriptor::buildFromProto($oneof_proto, $desc, $index));
-            $index++;
-        }
-
-        return $desc;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/DescriptorPool.php b/php/src/Google/Protobuf/Internal/DescriptorPool.php
deleted file mode 100644
index 304c161..0000000
--- a/php/src/Google/Protobuf/Internal/DescriptorPool.php
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\Descriptor;
-use Google\Protobuf\Internal\FileDescriptor;
-use Google\Protobuf\Internal\FileDescriptorSet;
-use Google\Protobuf\Internal\MessageBuilderContext;
-use Google\Protobuf\Internal\EnumBuilderContext;
-
-class DescriptorPool
-{
-    private static $pool;
-    // Map from message names to sub-maps, which are maps from field numbers to
-    // field descriptors.
-    private $class_to_desc = [];
-    private $class_to_enum_desc = [];
-    private $proto_to_class = [];
-
-    public static function getGeneratedPool()
-    {
-        if (!isset(self::$pool)) {
-            self::$pool = new DescriptorPool();
-        }
-        return self::$pool;
-    }
-
-    public function internalAddGeneratedFile($data)
-    {
-        $files = new FileDescriptorSet();
-        $files->mergeFromString($data);
-        $file = FileDescriptor::buildFromProto($files->getFile()[0]);
-
-        foreach ($file->getMessageType() as $desc) {
-            $this->addDescriptor($desc);
-        }
-        unset($desc);
-
-        foreach ($file->getEnumType() as $desc) {
-            $this->addEnumDescriptor($desc);
-        }
-        unset($desc);
-
-        foreach ($file->getMessageType() as $desc) {
-            $this->crossLink($desc);
-        }
-        unset($desc);
-    }
-
-    public function addMessage($name, $klass)
-    {
-        return new MessageBuilderContext($name, $klass, $this);
-    }
-
-    public function addEnum($name, $klass)
-    {
-        return new EnumBuilderContext($name, $klass, $this);
-    }
-
-    public function addDescriptor($descriptor)
-    {
-        $this->proto_to_class[$descriptor->getFullName()] =
-            $descriptor->getClass();
-        $this->class_to_desc[$descriptor->getClass()] = $descriptor;
-        foreach ($descriptor->getNestedType() as $nested_type) {
-            $this->addDescriptor($nested_type);
-        }
-        foreach ($descriptor->getEnumType() as $enum_type) {
-            $this->addEnumDescriptor($enum_type);
-        }
-    }
-
-    public function addEnumDescriptor($descriptor)
-    {
-        $this->proto_to_class[$descriptor->getFullName()] =
-            $descriptor->getClass();
-        $this->class_to_enum_desc[$descriptor->getClass()] = $descriptor;
-    }
-
-    public function getDescriptorByClassName($klass)
-    {
-        if (isset($this->class_to_desc[$klass])) {
-            return $this->class_to_desc[$klass];
-        } else {
-            return null;
-        }
-    }
-
-    public function getEnumDescriptorByClassName($klass)
-    {
-        if (isset($this->class_to_enum_desc[$klass])) {
-            return $this->class_to_enum_desc[$klass];
-        } else {
-            return null;
-        }
-    }
-
-    public function getDescriptorByProtoName($proto)
-    {
-        if (isset($this->proto_to_class[$proto])) {
-            $klass = $this->proto_to_class[$proto];
-            return $this->class_to_desc[$klass];
-        } else {
-          return null;
-        }
-    }
-
-    public function getEnumDescriptorByProtoName($proto)
-    {
-        $klass = $this->proto_to_class[$proto];
-        return $this->class_to_enum_desc[$klass];
-    }
-
-    private function crossLink(Descriptor $desc)
-    {
-        foreach ($desc->getField() as $field) {
-            switch ($field->getType()) {
-                case GPBType::MESSAGE:
-                    $proto = $field->getMessageType();
-                    $field->setMessageType(
-                        $this->getDescriptorByProtoName($proto));
-                    break;
-                case GPBType::ENUM:
-                    $proto = $field->getEnumType();
-                    $field->setEnumType(
-                        $this->getEnumDescriptorByProtoName($proto));
-                    break;
-                default:
-                    break;
-            }
-        }
-        unset($field);
-
-        foreach ($desc->getNestedType() as $nested_type) {
-            $this->crossLink($nested_type);
-        }
-        unset($nested_type);
-    }
-
-    public function finish()
-    {
-        foreach ($this->class_to_desc as $klass => $desc) {
-            $this->crossLink($desc);
-        }
-        unset($desc);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto.php b/php/src/Google/Protobuf/Internal/DescriptorProto.php
deleted file mode 100644
index 1d6959b..0000000
--- a/php/src/Google/Protobuf/Internal/DescriptorProto.php
+++ /dev/null
@@ -1,366 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a message type.
- *
- * Generated from protobuf message <code>google.protobuf.DescriptorProto</code>
- */
-class DescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
-     */
-    private $field;
-    private $has_field = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
-     */
-    private $extension;
-    private $has_extension = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
-     */
-    private $nested_type;
-    private $has_nested_type = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
-     */
-    private $enum_type;
-    private $has_enum_type = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
-     */
-    private $extension_range;
-    private $has_extension_range = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
-     */
-    private $oneof_decl;
-    private $has_oneof_decl = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MessageOptions options = 7;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
-     */
-    private $reserved_range;
-    private $has_reserved_range = false;
-    /**
-     * Reserved field names, which may not be used by fields in the same message.
-     * A given name may only be reserved once.
-     *
-     * Generated from protobuf field <code>repeated string reserved_name = 10;</code>
-     */
-    private $reserved_name;
-    private $has_reserved_name = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getField()
-    {
-        return $this->field;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
-     * @param \Google\Protobuf\Internal\FieldDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setField($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->field = $arr;
-        $this->has_field = true;
-
-        return $this;
-    }
-
-    public function hasField()
-    {
-        return $this->has_field;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
-     * @param \Google\Protobuf\Internal\FieldDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setExtension($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->extension = $arr;
-        $this->has_extension = true;
-
-        return $this;
-    }
-
-    public function hasExtension()
-    {
-        return $this->has_extension;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getNestedType()
-    {
-        return $this->nested_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
-     * @param \Google\Protobuf\Internal\DescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setNestedType($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
-        $this->nested_type = $arr;
-        $this->has_nested_type = true;
-
-        return $this;
-    }
-
-    public function hasNestedType()
-    {
-        return $this->has_nested_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
-     * @param \Google\Protobuf\Internal\EnumDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setEnumType($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
-        $this->enum_type = $arr;
-        $this->has_enum_type = true;
-
-        return $this;
-    }
-
-    public function hasEnumType()
-    {
-        return $this->has_enum_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getExtensionRange()
-    {
-        return $this->extension_range;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
-     * @param \Google\Protobuf\Internal\DescriptorProto_ExtensionRange[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setExtensionRange($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class);
-        $this->extension_range = $arr;
-        $this->has_extension_range = true;
-
-        return $this;
-    }
-
-    public function hasExtensionRange()
-    {
-        return $this->has_extension_range;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOneofDecl()
-    {
-        return $this->oneof_decl;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
-     * @param \Google\Protobuf\Internal\OneofDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOneofDecl($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class);
-        $this->oneof_decl = $arr;
-        $this->has_oneof_decl = true;
-
-        return $this;
-    }
-
-    public function hasOneofDecl()
-    {
-        return $this->has_oneof_decl;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MessageOptions options = 7;</code>
-     * @return \Google\Protobuf\Internal\MessageOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MessageOptions options = 7;</code>
-     * @param \Google\Protobuf\Internal\MessageOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getReservedRange()
-    {
-        return $this->reserved_range;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
-     * @param \Google\Protobuf\Internal\DescriptorProto_ReservedRange[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setReservedRange($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class);
-        $this->reserved_range = $arr;
-        $this->has_reserved_range = true;
-
-        return $this;
-    }
-
-    public function hasReservedRange()
-    {
-        return $this->has_reserved_range;
-    }
-
-    /**
-     * Reserved field names, which may not be used by fields in the same message.
-     * A given name may only be reserved once.
-     *
-     * Generated from protobuf field <code>repeated string reserved_name = 10;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getReservedName()
-    {
-        return $this->reserved_name;
-    }
-
-    /**
-     * Reserved field names, which may not be used by fields in the same message.
-     * A given name may only be reserved once.
-     *
-     * Generated from protobuf field <code>repeated string reserved_name = 10;</code>
-     * @param string[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setReservedName($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
-        $this->reserved_name = $arr;
-        $this->has_reserved_name = true;
-
-        return $this;
-    }
-
-    public function hasReservedName()
-    {
-        return $this->has_reserved_name;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php
deleted file mode 100644
index 1d45599..0000000
--- a/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.DescriptorProto.ExtensionRange</code>
- */
-class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     */
-    private $start = 0;
-    private $has_start = false;
-    /**
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     */
-    private $end = 0;
-    private $has_end = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     * @return int
-     */
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-
-        return $this;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     * @return int
-     */
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-
-        return $this;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code>
-     * @return \Google\Protobuf\Internal\ExtensionRangeOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.ExtensionRangeOptions options = 3;</code>
-     * @param \Google\Protobuf\Internal\ExtensionRangeOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ExtensionRangeOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php
deleted file mode 100644
index b1022d6..0000000
--- a/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Range of reserved tag numbers. Reserved tag numbers may not be used by
- * fields or extension ranges in the same message. Reserved ranges may
- * not overlap.
- *
- * Generated from protobuf message <code>google.protobuf.DescriptorProto.ReservedRange</code>
- */
-class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     */
-    private $start = 0;
-    private $has_start = false;
-    /**
-     * Exclusive.
-     *
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     */
-    private $end = 0;
-    private $has_end = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     * @return int
-     */
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-
-        return $this;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    /**
-     * Exclusive.
-     *
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     * @return int
-     */
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    /**
-     * Exclusive.
-     *
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-
-        return $this;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/EnumBuilderContext.php b/php/src/Google/Protobuf/Internal/EnumBuilderContext.php
deleted file mode 100644
index 0839728..0000000
--- a/php/src/Google/Protobuf/Internal/EnumBuilderContext.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\EnumDescriptor;
-use Google\Protobuf\EnumValueDescriptor;
-
-class EnumBuilderContext
-{
-
-    private $descriptor;
-    private $pool;
-
-    public function __construct($full_name, $klass, $pool)
-    {
-        $this->descriptor = new EnumDescriptor();
-        $this->descriptor->setFullName($full_name);
-        $this->descriptor->setClass($klass);
-        $this->pool = $pool;
-    }
-
-    public function value($name, $number)
-    {
-        $value = new EnumValueDescriptor($name, $number);
-        $this->descriptor->addValue($number, $value);
-        return $this;
-    }
-
-    public function finalizeToPool()
-    {
-        $this->pool->addEnumDescriptor($this->descriptor);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptor.php b/php/src/Google/Protobuf/Internal/EnumDescriptor.php
deleted file mode 100644
index 01649fe..0000000
--- a/php/src/Google/Protobuf/Internal/EnumDescriptor.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\EnumValueDescriptor;
-
-class EnumDescriptor
-{
-    use HasPublicDescriptorTrait;
-
-    private $klass;
-    private $full_name;
-    private $value;
-    private $name_to_value;
-    private $value_descriptor = [];
-
-    public function __construct()
-    {
-        $this->public_desc = new \Google\Protobuf\EnumDescriptor($this);
-    }
-
-    public function setFullName($full_name)
-    {
-        $this->full_name = $full_name;
-    }
-
-    public function getFullName()
-    {
-        return $this->full_name;
-    }
-
-    public function addValue($number, $value)
-    {
-        $this->value[$number] = $value;
-        $this->name_to_value[$value->getName()] = $value;
-        $this->value_descriptor[] = new EnumValueDescriptor($value->getName(), $number);
-    }
-
-    public function getValueByNumber($number)
-    {
-        return $this->value[$number];
-    }
-
-    public function getValueByName($name)
-    {
-        return $this->name_to_value[$name];
-    }
-
-    public function getValueDescriptorByIndex($index)
-    {
-        return $this->value_descriptor[$index];
-    }
-
-    public function getValueCount()
-    {
-        return count($this->value);
-    }
-
-    public function setClass($klass)
-    {
-        $this->klass = $klass;
-    }
-
-    public function getClass()
-    {
-        return $this->klass;
-    }
-
-    public static function buildFromProto($proto, $file_proto, $containing)
-    {
-        $desc = new EnumDescriptor();
-
-        $enum_name_without_package  = "";
-        $classname = "";
-        $fullname = "";
-        GPBUtil::getFullClassName(
-            $proto,
-            $containing,
-            $file_proto,
-            $enum_name_without_package,
-            $classname,
-            $fullname);
-        $desc->setFullName($fullname);
-        $desc->setClass($classname);
-        $values = $proto->getValue();
-        foreach ($values as $value) {
-            $desc->addValue($value->getNumber(), $value);
-        }
-
-        return $desc;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
deleted file mode 100644
index 930f26e..0000000
--- a/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
+++ /dev/null
@@ -1,213 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes an enum type.
- *
- * Generated from protobuf message <code>google.protobuf.EnumDescriptorProto</code>
- */
-class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
-     */
-    private $value;
-    private $has_value = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.EnumOptions options = 3;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-    /**
-     * Range of reserved numeric values. Reserved numeric values may not be used
-     * by enum values in the same enum declaration. Reserved ranges may not
-     * overlap.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;</code>
-     */
-    private $reserved_range;
-    private $has_reserved_range = false;
-    /**
-     * Reserved enum value names, which may not be reused. A given name may only
-     * be reserved once.
-     *
-     * Generated from protobuf field <code>repeated string reserved_name = 5;</code>
-     */
-    private $reserved_name;
-    private $has_reserved_name = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
-     * @param \Google\Protobuf\Internal\EnumValueDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class);
-        $this->value = $arr;
-        $this->has_value = true;
-
-        return $this;
-    }
-
-    public function hasValue()
-    {
-        return $this->has_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.EnumOptions options = 3;</code>
-     * @return \Google\Protobuf\Internal\EnumOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.EnumOptions options = 3;</code>
-     * @param \Google\Protobuf\Internal\EnumOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    /**
-     * Range of reserved numeric values. Reserved numeric values may not be used
-     * by enum values in the same enum declaration. Reserved ranges may not
-     * overlap.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getReservedRange()
-    {
-        return $this->reserved_range;
-    }
-
-    /**
-     * Range of reserved numeric values. Reserved numeric values may not be used
-     * by enum values in the same enum declaration. Reserved ranges may not
-     * overlap.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;</code>
-     * @param \Google\Protobuf\Internal\EnumDescriptorProto_EnumReservedRange[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setReservedRange($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto_EnumReservedRange::class);
-        $this->reserved_range = $arr;
-        $this->has_reserved_range = true;
-
-        return $this;
-    }
-
-    public function hasReservedRange()
-    {
-        return $this->has_reserved_range;
-    }
-
-    /**
-     * Reserved enum value names, which may not be reused. A given name may only
-     * be reserved once.
-     *
-     * Generated from protobuf field <code>repeated string reserved_name = 5;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getReservedName()
-    {
-        return $this->reserved_name;
-    }
-
-    /**
-     * Reserved enum value names, which may not be reused. A given name may only
-     * be reserved once.
-     *
-     * Generated from protobuf field <code>repeated string reserved_name = 5;</code>
-     * @param string[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setReservedName($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
-        $this->reserved_name = $arr;
-        $this->has_reserved_name = true;
-
-        return $this;
-    }
-
-    public function hasReservedName()
-    {
-        return $this->has_reserved_name;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php b/php/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php
deleted file mode 100644
index 6b2449f..0000000
--- a/php/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Range of reserved numeric values. Reserved values may not be used by
- * entries in the same enum. Reserved ranges may not overlap.
- * Note that this is distinct from DescriptorProto.ReservedRange in that it
- * is inclusive such that it can appropriately represent the entire int32
- * domain.
- *
- * Generated from protobuf message <code>google.protobuf.EnumDescriptorProto.EnumReservedRange</code>
- */
-class EnumDescriptorProto_EnumReservedRange extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     */
-    private $start = 0;
-    private $has_start = false;
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     */
-    private $end = 0;
-    private $has_end = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     * @return int
-     */
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 start = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-
-        return $this;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     * @return int
-     */
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    /**
-     * Inclusive.
-     *
-     * Generated from protobuf field <code>optional int32 end = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-
-        return $this;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/EnumOptions.php b/php/src/Google/Protobuf/Internal/EnumOptions.php
deleted file mode 100644
index 3f598a4..0000000
--- a/php/src/Google/Protobuf/Internal/EnumOptions.php
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.EnumOptions</code>
- */
-class EnumOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Set this option to true to allow mapping different tag names to the same
-     * value.
-     *
-     * Generated from protobuf field <code>optional bool allow_alias = 2;</code>
-     */
-    private $allow_alias = false;
-    private $has_allow_alias = false;
-    /**
-     * Is this enum deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the enum, or it will be completely ignored; in the very least, this
-     * is a formalization for deprecating enums.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Set this option to true to allow mapping different tag names to the same
-     * value.
-     *
-     * Generated from protobuf field <code>optional bool allow_alias = 2;</code>
-     * @return bool
-     */
-    public function getAllowAlias()
-    {
-        return $this->allow_alias;
-    }
-
-    /**
-     * Set this option to true to allow mapping different tag names to the same
-     * value.
-     *
-     * Generated from protobuf field <code>optional bool allow_alias = 2;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setAllowAlias($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->allow_alias = $var;
-        $this->has_allow_alias = true;
-
-        return $this;
-    }
-
-    public function hasAllowAlias()
-    {
-        return $this->has_allow_alias;
-    }
-
-    /**
-     * Is this enum deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the enum, or it will be completely ignored; in the very least, this
-     * is a formalization for deprecating enums.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this enum deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the enum, or it will be completely ignored; in the very least, this
-     * is a formalization for deprecating enums.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php
deleted file mode 100644
index e363220..0000000
--- a/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a value within an enum.
- *
- * Generated from protobuf message <code>google.protobuf.EnumValueDescriptorProto</code>
- */
-class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Generated from protobuf field <code>optional int32 number = 2;</code>
-     */
-    private $number = 0;
-    private $has_number = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 number = 2;</code>
-     * @return int
-     */
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 number = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-        $this->has_number = true;
-
-        return $this;
-    }
-
-    public function hasNumber()
-    {
-        return $this->has_number;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
-     * @return \Google\Protobuf\Internal\EnumValueOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
-     * @param \Google\Protobuf\Internal\EnumValueOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/EnumValueOptions.php b/php/src/Google/Protobuf/Internal/EnumValueOptions.php
deleted file mode 100644
index db8de17..0000000
--- a/php/src/Google/Protobuf/Internal/EnumValueOptions.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.EnumValueOptions</code>
- */
-class EnumValueOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Is this enum value deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the enum value, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating enum values.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 1 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Is this enum value deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the enum value, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating enum values.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 1 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this enum value deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the enum value, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating enum values.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 1 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php b/php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php
deleted file mode 100644
index ee9e38b..0000000
--- a/php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.ExtensionRangeOptions</code>
- */
-class ExtensionRangeOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptor.php b/php/src/Google/Protobuf/Internal/FieldDescriptor.php
deleted file mode 100644
index 6644a2e..0000000
--- a/php/src/Google/Protobuf/Internal/FieldDescriptor.php
+++ /dev/null
@@ -1,265 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class FieldDescriptor
-{
-    use HasPublicDescriptorTrait;
-
-    private $name;
-    private $json_name;
-    private $setter;
-    private $getter;
-    private $number;
-    private $label;
-    private $type;
-    private $message_type;
-    private $enum_type;
-    private $packed;
-    private $is_map;
-    private $oneof_index = -1;
-
-    public function __construct()
-    {
-        $this->public_desc = new \Google\Protobuf\FieldDescriptor($this);
-    }
-
-    public function setOneofIndex($index)
-    {
-        $this->oneof_index = $index;
-    }
-
-    public function getOneofIndex()
-    {
-        return $this->oneof_index;
-    }
-
-    public function setName($name)
-    {
-        $this->name = $name;
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setJsonName($json_name)
-    {
-        $this->json_name = $json_name;
-    }
-
-    public function getJsonName()
-    {
-        return $this->json_name;
-    }
-
-    public function setSetter($setter)
-    {
-        $this->setter = $setter;
-    }
-
-    public function getSetter()
-    {
-        return $this->setter;
-    }
-
-    public function setGetter($getter)
-    {
-        $this->getter = $getter;
-    }
-
-    public function getGetter()
-    {
-        return $this->getter;
-    }
-
-    public function setNumber($number)
-    {
-        $this->number = $number;
-    }
-
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    public function setLabel($label)
-    {
-        $this->label = $label;
-    }
-
-    public function getLabel()
-    {
-        return $this->label;
-    }
-
-    public function isRepeated()
-    {
-        return $this->label === GPBLabel::REPEATED;
-    }
-
-    public function setType($type)
-    {
-        $this->type = $type;
-    }
-
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    public function setMessageType($message_type)
-    {
-        $this->message_type = $message_type;
-    }
-
-    public function getMessageType()
-    {
-        return $this->message_type;
-    }
-
-    public function setEnumType($enum_type)
-    {
-        $this->enum_type = $enum_type;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function setPacked($packed)
-    {
-        $this->packed = $packed;
-    }
-
-    public function getPacked()
-    {
-        return $this->packed;
-    }
-
-    public function isPackable()
-    {
-        return $this->isRepeated() && self::isTypePackable($this->type);
-    }
-
-    public function isMap()
-    {
-        return $this->getType() == GPBType::MESSAGE &&
-               !is_null($this->getMessageType()->getOptions()) &&
-               $this->getMessageType()->getOptions()->getMapEntry();
-    }
-
-    public function isTimestamp()
-    {
-        return $this->getType() == GPBType::MESSAGE &&
-            $this->getMessageType()->getClass() === "Google\Protobuf\Timestamp";
-    }
-
-    private static function isTypePackable($field_type)
-    {
-        return ($field_type !== GPBType::STRING  &&
-            $field_type !== GPBType::GROUP   &&
-            $field_type !== GPBType::MESSAGE &&
-            $field_type !== GPBType::BYTES);
-    }
-
-    public static function getFieldDescriptor($proto)
-    {
-        $type_name = null;
-        $type = $proto->getType();
-        switch ($type) {
-            case GPBType::MESSAGE:
-            case GPBType::GROUP:
-            case GPBType::ENUM:
-                $type_name = $proto->getTypeName();
-                break;
-            default:
-                break;
-        }
-
-        $oneof_index = $proto->hasOneofIndex() ? $proto->getOneofIndex() : -1;
-        $packed = false;
-        $options = $proto->getOptions();
-        if ($options !== null) {
-            $packed = $options->getPacked();
-        }
-
-        $field = new FieldDescriptor();
-        $field->setName($proto->getName());
-
-        $json_name = $proto->hasJsonName() ? $proto->getJsonName() :
-            lcfirst(implode('', array_map('ucwords', explode('_', $proto->getName()))));
-        if ($proto->hasJsonName()) {
-            $json_name = $proto->getJsonName();
-        } else {
-            $proto_name = $proto->getName();
-            $json_name = implode('', array_map('ucwords', explode('_', $proto_name)));
-            if ($proto_name[0] !== "_" && !ctype_upper($proto_name[0])) {
-                $json_name = lcfirst($json_name);
-            }
-        }
-        $field->setJsonName($json_name);
-
-        $camel_name = implode('', array_map('ucwords', explode('_', $proto->getName())));
-        $field->setGetter('get' . $camel_name);
-        $field->setSetter('set' . $camel_name);
-        $field->setType($proto->getType());
-        $field->setNumber($proto->getNumber());
-        $field->setLabel($proto->getLabel());
-        $field->setPacked($packed);
-        $field->setOneofIndex($oneof_index);
-
-        // At this time, the message/enum type may have not been added to pool.
-        // So we use the type name as place holder and will replace it with the
-        // actual descriptor in cross building.
-        switch ($type) {
-            case GPBType::MESSAGE:
-                $field->setMessageType($type_name);
-                break;
-            case GPBType::ENUM:
-                $field->setEnumType($type_name);
-                break;
-            default:
-                break;
-        }
-
-        return $field;
-    }
-
-    public static function buildFromProto($proto)
-    {
-        return FieldDescriptor::getFieldDescriptor($proto);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
deleted file mode 100644
index 10c2759..0000000
--- a/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
+++ /dev/null
@@ -1,435 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a field within a message.
- *
- * Generated from protobuf message <code>google.protobuf.FieldDescriptorProto</code>
- */
-class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Generated from protobuf field <code>optional int32 number = 3;</code>
-     */
-    private $number = 0;
-    private $has_number = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
-     */
-    private $label = 0;
-    private $has_label = false;
-    /**
-     * If type_name is set, this need not be set.  If both this and type_name
-     * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
-     */
-    private $type = 0;
-    private $has_type = false;
-    /**
-     * For message and enum types, this is the name of the type.  If the name
-     * starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-     * rules are used to find the type (i.e. first the nested types within this
-     * message are searched, then within the parent, on up to the root
-     * namespace).
-     *
-     * Generated from protobuf field <code>optional string type_name = 6;</code>
-     */
-    private $type_name = '';
-    private $has_type_name = false;
-    /**
-     * For extensions, this is the name of the type being extended.  It is
-     * resolved in the same manner as type_name.
-     *
-     * Generated from protobuf field <code>optional string extendee = 2;</code>
-     */
-    private $extendee = '';
-    private $has_extendee = false;
-    /**
-     * For numeric types, contains the original text representation of the value.
-     * For booleans, "true" or "false".
-     * For strings, contains the default text contents (not escaped in any way).
-     * For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-     * TODO(kenton):  Base-64 encode?
-     *
-     * Generated from protobuf field <code>optional string default_value = 7;</code>
-     */
-    private $default_value = '';
-    private $has_default_value = false;
-    /**
-     * If set, gives the index of a oneof in the containing type's oneof_decl
-     * list.  This field is a member of that oneof.
-     *
-     * Generated from protobuf field <code>optional int32 oneof_index = 9;</code>
-     */
-    private $oneof_index = 0;
-    private $has_oneof_index = false;
-    /**
-     * JSON name of this field. The value is set by protocol compiler. If the
-     * user has set a "json_name" option on this field, that option's value
-     * will be used. Otherwise, it's deduced from the field's name by converting
-     * it to camelCase.
-     *
-     * Generated from protobuf field <code>optional string json_name = 10;</code>
-     */
-    private $json_name = '';
-    private $has_json_name = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions options = 8;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 number = 3;</code>
-     * @return int
-     */
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int32 number = 3;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-        $this->has_number = true;
-
-        return $this;
-    }
-
-    public function hasNumber()
-    {
-        return $this->has_number;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
-     * @return int
-     */
-    public function getLabel()
-    {
-        return $this->label;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setLabel($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class);
-        $this->label = $var;
-        $this->has_label = true;
-
-        return $this;
-    }
-
-    public function hasLabel()
-    {
-        return $this->has_label;
-    }
-
-    /**
-     * If type_name is set, this need not be set.  If both this and type_name
-     * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
-     * @return int
-     */
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    /**
-     * If type_name is set, this need not be set.  If both this and type_name
-     * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setType($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class);
-        $this->type = $var;
-        $this->has_type = true;
-
-        return $this;
-    }
-
-    public function hasType()
-    {
-        return $this->has_type;
-    }
-
-    /**
-     * For message and enum types, this is the name of the type.  If the name
-     * starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-     * rules are used to find the type (i.e. first the nested types within this
-     * message are searched, then within the parent, on up to the root
-     * namespace).
-     *
-     * Generated from protobuf field <code>optional string type_name = 6;</code>
-     * @return string
-     */
-    public function getTypeName()
-    {
-        return $this->type_name;
-    }
-
-    /**
-     * For message and enum types, this is the name of the type.  If the name
-     * starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-     * rules are used to find the type (i.e. first the nested types within this
-     * message are searched, then within the parent, on up to the root
-     * namespace).
-     *
-     * Generated from protobuf field <code>optional string type_name = 6;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setTypeName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->type_name = $var;
-        $this->has_type_name = true;
-
-        return $this;
-    }
-
-    public function hasTypeName()
-    {
-        return $this->has_type_name;
-    }
-
-    /**
-     * For extensions, this is the name of the type being extended.  It is
-     * resolved in the same manner as type_name.
-     *
-     * Generated from protobuf field <code>optional string extendee = 2;</code>
-     * @return string
-     */
-    public function getExtendee()
-    {
-        return $this->extendee;
-    }
-
-    /**
-     * For extensions, this is the name of the type being extended.  It is
-     * resolved in the same manner as type_name.
-     *
-     * Generated from protobuf field <code>optional string extendee = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setExtendee($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->extendee = $var;
-        $this->has_extendee = true;
-
-        return $this;
-    }
-
-    public function hasExtendee()
-    {
-        return $this->has_extendee;
-    }
-
-    /**
-     * For numeric types, contains the original text representation of the value.
-     * For booleans, "true" or "false".
-     * For strings, contains the default text contents (not escaped in any way).
-     * For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-     * TODO(kenton):  Base-64 encode?
-     *
-     * Generated from protobuf field <code>optional string default_value = 7;</code>
-     * @return string
-     */
-    public function getDefaultValue()
-    {
-        return $this->default_value;
-    }
-
-    /**
-     * For numeric types, contains the original text representation of the value.
-     * For booleans, "true" or "false".
-     * For strings, contains the default text contents (not escaped in any way).
-     * For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-     * TODO(kenton):  Base-64 encode?
-     *
-     * Generated from protobuf field <code>optional string default_value = 7;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setDefaultValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->default_value = $var;
-        $this->has_default_value = true;
-
-        return $this;
-    }
-
-    public function hasDefaultValue()
-    {
-        return $this->has_default_value;
-    }
-
-    /**
-     * If set, gives the index of a oneof in the containing type's oneof_decl
-     * list.  This field is a member of that oneof.
-     *
-     * Generated from protobuf field <code>optional int32 oneof_index = 9;</code>
-     * @return int
-     */
-    public function getOneofIndex()
-    {
-        return $this->oneof_index;
-    }
-
-    /**
-     * If set, gives the index of a oneof in the containing type's oneof_decl
-     * list.  This field is a member of that oneof.
-     *
-     * Generated from protobuf field <code>optional int32 oneof_index = 9;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setOneofIndex($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->oneof_index = $var;
-        $this->has_oneof_index = true;
-
-        return $this;
-    }
-
-    public function hasOneofIndex()
-    {
-        return $this->has_oneof_index;
-    }
-
-    /**
-     * JSON name of this field. The value is set by protocol compiler. If the
-     * user has set a "json_name" option on this field, that option's value
-     * will be used. Otherwise, it's deduced from the field's name by converting
-     * it to camelCase.
-     *
-     * Generated from protobuf field <code>optional string json_name = 10;</code>
-     * @return string
-     */
-    public function getJsonName()
-    {
-        return $this->json_name;
-    }
-
-    /**
-     * JSON name of this field. The value is set by protocol compiler. If the
-     * user has set a "json_name" option on this field, that option's value
-     * will be used. Otherwise, it's deduced from the field's name by converting
-     * it to camelCase.
-     *
-     * Generated from protobuf field <code>optional string json_name = 10;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setJsonName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->json_name = $var;
-        $this->has_json_name = true;
-
-        return $this;
-    }
-
-    public function hasJsonName()
-    {
-        return $this->has_json_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions options = 8;</code>
-     * @return \Google\Protobuf\Internal\FieldOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions options = 8;</code>
-     * @param \Google\Protobuf\Internal\FieldOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php
deleted file mode 100644
index f2a32fd..0000000
--- a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-/**
- * Protobuf enum <code>Google\Protobuf\Internal</code>
- */
-class FieldDescriptorProto_Label
-{
-    /**
-     * 0 is reserved for errors
-     *
-     * Generated from protobuf enum <code>LABEL_OPTIONAL = 1;</code>
-     */
-    const LABEL_OPTIONAL = 1;
-    /**
-     * Generated from protobuf enum <code>LABEL_REQUIRED = 2;</code>
-     */
-    const LABEL_REQUIRED = 2;
-    /**
-     * Generated from protobuf enum <code>LABEL_REPEATED = 3;</code>
-     */
-    const LABEL_REPEATED = 3;
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php
deleted file mode 100644
index 1b022de..0000000
--- a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-/**
- * Protobuf enum <code>Google\Protobuf\Internal</code>
- */
-class FieldDescriptorProto_Type
-{
-    /**
-     * 0 is reserved for errors.
-     * Order is weird for historical reasons.
-     *
-     * Generated from protobuf enum <code>TYPE_DOUBLE = 1;</code>
-     */
-    const TYPE_DOUBLE = 1;
-    /**
-     * Generated from protobuf enum <code>TYPE_FLOAT = 2;</code>
-     */
-    const TYPE_FLOAT = 2;
-    /**
-     * Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-     * negative values are likely.
-     *
-     * Generated from protobuf enum <code>TYPE_INT64 = 3;</code>
-     */
-    const TYPE_INT64 = 3;
-    /**
-     * Generated from protobuf enum <code>TYPE_UINT64 = 4;</code>
-     */
-    const TYPE_UINT64 = 4;
-    /**
-     * Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-     * negative values are likely.
-     *
-     * Generated from protobuf enum <code>TYPE_INT32 = 5;</code>
-     */
-    const TYPE_INT32 = 5;
-    /**
-     * Generated from protobuf enum <code>TYPE_FIXED64 = 6;</code>
-     */
-    const TYPE_FIXED64 = 6;
-    /**
-     * Generated from protobuf enum <code>TYPE_FIXED32 = 7;</code>
-     */
-    const TYPE_FIXED32 = 7;
-    /**
-     * Generated from protobuf enum <code>TYPE_BOOL = 8;</code>
-     */
-    const TYPE_BOOL = 8;
-    /**
-     * Generated from protobuf enum <code>TYPE_STRING = 9;</code>
-     */
-    const TYPE_STRING = 9;
-    /**
-     * Tag-delimited aggregate.
-     * Group type is deprecated and not supported in proto3. However, Proto3
-     * implementations should still be able to parse the group wire format and
-     * treat group fields as unknown fields.
-     *
-     * Generated from protobuf enum <code>TYPE_GROUP = 10;</code>
-     */
-    const TYPE_GROUP = 10;
-    /**
-     * Length-delimited aggregate.
-     *
-     * Generated from protobuf enum <code>TYPE_MESSAGE = 11;</code>
-     */
-    const TYPE_MESSAGE = 11;
-    /**
-     * New in version 2.
-     *
-     * Generated from protobuf enum <code>TYPE_BYTES = 12;</code>
-     */
-    const TYPE_BYTES = 12;
-    /**
-     * Generated from protobuf enum <code>TYPE_UINT32 = 13;</code>
-     */
-    const TYPE_UINT32 = 13;
-    /**
-     * Generated from protobuf enum <code>TYPE_ENUM = 14;</code>
-     */
-    const TYPE_ENUM = 14;
-    /**
-     * Generated from protobuf enum <code>TYPE_SFIXED32 = 15;</code>
-     */
-    const TYPE_SFIXED32 = 15;
-    /**
-     * Generated from protobuf enum <code>TYPE_SFIXED64 = 16;</code>
-     */
-    const TYPE_SFIXED64 = 16;
-    /**
-     * Uses ZigZag encoding.
-     *
-     * Generated from protobuf enum <code>TYPE_SINT32 = 17;</code>
-     */
-    const TYPE_SINT32 = 17;
-    /**
-     * Uses ZigZag encoding.
-     *
-     * Generated from protobuf enum <code>TYPE_SINT64 = 18;</code>
-     */
-    const TYPE_SINT64 = 18;
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions.php b/php/src/Google/Protobuf/Internal/FieldOptions.php
deleted file mode 100644
index 169f860..0000000
--- a/php/src/Google/Protobuf/Internal/FieldOptions.php
+++ /dev/null
@@ -1,424 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.FieldOptions</code>
- */
-class FieldOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The ctype option instructs the C++ code generator to use a different
-     * representation of the field than it normally would.  See the specific
-     * options below.  This option is not yet implemented in the open source
-     * release -- sorry, we'll try to include it in a future version!
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
-     */
-    private $ctype = 0;
-    private $has_ctype = false;
-    /**
-     * The packed option can be enabled for repeated primitive fields to enable
-     * a more efficient representation on the wire. Rather than repeatedly
-     * writing the tag and type for each element, the entire array is encoded as
-     * a single length-delimited blob. In proto3, only explicit setting it to
-     * false will avoid using packed encoding.
-     *
-     * Generated from protobuf field <code>optional bool packed = 2;</code>
-     */
-    private $packed = false;
-    private $has_packed = false;
-    /**
-     * The jstype option determines the JavaScript type used for values of the
-     * field.  The option is permitted only for 64 bit integral and fixed types
-     * (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
-     * is represented as JavaScript string, which avoids loss of precision that
-     * can happen when a large value is converted to a floating point JavaScript.
-     * Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
-     * use the JavaScript "number" type.  The behavior of the default option
-     * JS_NORMAL is implementation dependent.
-     * This option is an enum to permit additional types to be added, e.g.
-     * goog.math.Integer.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
-     */
-    private $jstype = 0;
-    private $has_jstype = false;
-    /**
-     * Should this field be parsed lazily?  Lazy applies only to message-type
-     * fields.  It means that when the outer message is initially parsed, the
-     * inner message's contents will not be parsed but instead stored in encoded
-     * form.  The inner message will actually be parsed when it is first accessed.
-     * This is only a hint.  Implementations are free to choose whether to use
-     * eager or lazy parsing regardless of the value of this option.  However,
-     * setting this option true suggests that the protocol author believes that
-     * using lazy parsing on this field is worth the additional bookkeeping
-     * overhead typically needed to implement it.
-     * This option does not affect the public interface of any generated code;
-     * all method signatures remain the same.  Furthermore, thread-safety of the
-     * interface is not affected by this option; const methods remain safe to
-     * call from multiple threads concurrently, while non-const methods continue
-     * to require exclusive access.
-     * Note that implementations may choose not to check required fields within
-     * a lazy sub-message.  That is, calling IsInitialized() on the outer message
-     * may return true even if the inner message has missing required fields.
-     * This is necessary because otherwise the inner message would have to be
-     * parsed in order to perform the check, defeating the purpose of lazy
-     * parsing.  An implementation which chooses not to check required fields
-     * must be consistent about it.  That is, for any particular sub-message, the
-     * implementation must either *always* check its required fields, or *never*
-     * check its required fields, regardless of whether or not the message has
-     * been parsed.
-     *
-     * Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code>
-     */
-    private $lazy = false;
-    private $has_lazy = false;
-    /**
-     * Is this field deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for accessors, or it will be completely ignored; in the very least, this
-     * is a formalization for deprecating fields.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * For Google-internal migration only. Do not use.
-     *
-     * Generated from protobuf field <code>optional bool weak = 10 [default = false];</code>
-     */
-    private $weak = false;
-    private $has_weak = false;
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The ctype option instructs the C++ code generator to use a different
-     * representation of the field than it normally would.  See the specific
-     * options below.  This option is not yet implemented in the open source
-     * release -- sorry, we'll try to include it in a future version!
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
-     * @return int
-     */
-    public function getCtype()
-    {
-        return $this->ctype;
-    }
-
-    /**
-     * The ctype option instructs the C++ code generator to use a different
-     * representation of the field than it normally would.  See the specific
-     * options below.  This option is not yet implemented in the open source
-     * release -- sorry, we'll try to include it in a future version!
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setCtype($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class);
-        $this->ctype = $var;
-        $this->has_ctype = true;
-
-        return $this;
-    }
-
-    public function hasCtype()
-    {
-        return $this->has_ctype;
-    }
-
-    /**
-     * The packed option can be enabled for repeated primitive fields to enable
-     * a more efficient representation on the wire. Rather than repeatedly
-     * writing the tag and type for each element, the entire array is encoded as
-     * a single length-delimited blob. In proto3, only explicit setting it to
-     * false will avoid using packed encoding.
-     *
-     * Generated from protobuf field <code>optional bool packed = 2;</code>
-     * @return bool
-     */
-    public function getPacked()
-    {
-        return $this->packed;
-    }
-
-    /**
-     * The packed option can be enabled for repeated primitive fields to enable
-     * a more efficient representation on the wire. Rather than repeatedly
-     * writing the tag and type for each element, the entire array is encoded as
-     * a single length-delimited blob. In proto3, only explicit setting it to
-     * false will avoid using packed encoding.
-     *
-     * Generated from protobuf field <code>optional bool packed = 2;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setPacked($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->packed = $var;
-        $this->has_packed = true;
-
-        return $this;
-    }
-
-    public function hasPacked()
-    {
-        return $this->has_packed;
-    }
-
-    /**
-     * The jstype option determines the JavaScript type used for values of the
-     * field.  The option is permitted only for 64 bit integral and fixed types
-     * (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
-     * is represented as JavaScript string, which avoids loss of precision that
-     * can happen when a large value is converted to a floating point JavaScript.
-     * Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
-     * use the JavaScript "number" type.  The behavior of the default option
-     * JS_NORMAL is implementation dependent.
-     * This option is an enum to permit additional types to be added, e.g.
-     * goog.math.Integer.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
-     * @return int
-     */
-    public function getJstype()
-    {
-        return $this->jstype;
-    }
-
-    /**
-     * The jstype option determines the JavaScript type used for values of the
-     * field.  The option is permitted only for 64 bit integral and fixed types
-     * (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
-     * is represented as JavaScript string, which avoids loss of precision that
-     * can happen when a large value is converted to a floating point JavaScript.
-     * Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
-     * use the JavaScript "number" type.  The behavior of the default option
-     * JS_NORMAL is implementation dependent.
-     * This option is an enum to permit additional types to be added, e.g.
-     * goog.math.Integer.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setJstype($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class);
-        $this->jstype = $var;
-        $this->has_jstype = true;
-
-        return $this;
-    }
-
-    public function hasJstype()
-    {
-        return $this->has_jstype;
-    }
-
-    /**
-     * Should this field be parsed lazily?  Lazy applies only to message-type
-     * fields.  It means that when the outer message is initially parsed, the
-     * inner message's contents will not be parsed but instead stored in encoded
-     * form.  The inner message will actually be parsed when it is first accessed.
-     * This is only a hint.  Implementations are free to choose whether to use
-     * eager or lazy parsing regardless of the value of this option.  However,
-     * setting this option true suggests that the protocol author believes that
-     * using lazy parsing on this field is worth the additional bookkeeping
-     * overhead typically needed to implement it.
-     * This option does not affect the public interface of any generated code;
-     * all method signatures remain the same.  Furthermore, thread-safety of the
-     * interface is not affected by this option; const methods remain safe to
-     * call from multiple threads concurrently, while non-const methods continue
-     * to require exclusive access.
-     * Note that implementations may choose not to check required fields within
-     * a lazy sub-message.  That is, calling IsInitialized() on the outer message
-     * may return true even if the inner message has missing required fields.
-     * This is necessary because otherwise the inner message would have to be
-     * parsed in order to perform the check, defeating the purpose of lazy
-     * parsing.  An implementation which chooses not to check required fields
-     * must be consistent about it.  That is, for any particular sub-message, the
-     * implementation must either *always* check its required fields, or *never*
-     * check its required fields, regardless of whether or not the message has
-     * been parsed.
-     *
-     * Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code>
-     * @return bool
-     */
-    public function getLazy()
-    {
-        return $this->lazy;
-    }
-
-    /**
-     * Should this field be parsed lazily?  Lazy applies only to message-type
-     * fields.  It means that when the outer message is initially parsed, the
-     * inner message's contents will not be parsed but instead stored in encoded
-     * form.  The inner message will actually be parsed when it is first accessed.
-     * This is only a hint.  Implementations are free to choose whether to use
-     * eager or lazy parsing regardless of the value of this option.  However,
-     * setting this option true suggests that the protocol author believes that
-     * using lazy parsing on this field is worth the additional bookkeeping
-     * overhead typically needed to implement it.
-     * This option does not affect the public interface of any generated code;
-     * all method signatures remain the same.  Furthermore, thread-safety of the
-     * interface is not affected by this option; const methods remain safe to
-     * call from multiple threads concurrently, while non-const methods continue
-     * to require exclusive access.
-     * Note that implementations may choose not to check required fields within
-     * a lazy sub-message.  That is, calling IsInitialized() on the outer message
-     * may return true even if the inner message has missing required fields.
-     * This is necessary because otherwise the inner message would have to be
-     * parsed in order to perform the check, defeating the purpose of lazy
-     * parsing.  An implementation which chooses not to check required fields
-     * must be consistent about it.  That is, for any particular sub-message, the
-     * implementation must either *always* check its required fields, or *never*
-     * check its required fields, regardless of whether or not the message has
-     * been parsed.
-     *
-     * Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setLazy($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->lazy = $var;
-        $this->has_lazy = true;
-
-        return $this;
-    }
-
-    public function hasLazy()
-    {
-        return $this->has_lazy;
-    }
-
-    /**
-     * Is this field deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for accessors, or it will be completely ignored; in the very least, this
-     * is a formalization for deprecating fields.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this field deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for accessors, or it will be completely ignored; in the very least, this
-     * is a formalization for deprecating fields.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * For Google-internal migration only. Do not use.
-     *
-     * Generated from protobuf field <code>optional bool weak = 10 [default = false];</code>
-     * @return bool
-     */
-    public function getWeak()
-    {
-        return $this->weak;
-    }
-
-    /**
-     * For Google-internal migration only. Do not use.
-     *
-     * Generated from protobuf field <code>optional bool weak = 10 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setWeak($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->weak = $var;
-        $this->has_weak = true;
-
-        return $this;
-    }
-
-    public function hasWeak()
-    {
-        return $this->has_weak;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions_CType.php b/php/src/Google/Protobuf/Internal/FieldOptions_CType.php
deleted file mode 100644
index 0f33072..0000000
--- a/php/src/Google/Protobuf/Internal/FieldOptions_CType.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-/**
- * Protobuf enum <code>Google\Protobuf\Internal</code>
- */
-class FieldOptions_CType
-{
-    /**
-     * Default mode.
-     *
-     * Generated from protobuf enum <code>STRING = 0;</code>
-     */
-    const STRING = 0;
-    /**
-     * Generated from protobuf enum <code>CORD = 1;</code>
-     */
-    const CORD = 1;
-    /**
-     * Generated from protobuf enum <code>STRING_PIECE = 2;</code>
-     */
-    const STRING_PIECE = 2;
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php b/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php
deleted file mode 100644
index 73bdf3f..0000000
--- a/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-/**
- * Protobuf enum <code>Google\Protobuf\Internal</code>
- */
-class FieldOptions_JSType
-{
-    /**
-     * Use the default type.
-     *
-     * Generated from protobuf enum <code>JS_NORMAL = 0;</code>
-     */
-    const JS_NORMAL = 0;
-    /**
-     * Use JavaScript strings.
-     *
-     * Generated from protobuf enum <code>JS_STRING = 1;</code>
-     */
-    const JS_STRING = 1;
-    /**
-     * Use JavaScript numbers.
-     *
-     * Generated from protobuf enum <code>JS_NUMBER = 2;</code>
-     */
-    const JS_NUMBER = 2;
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptor.php b/php/src/Google/Protobuf/Internal/FileDescriptor.php
deleted file mode 100644
index 038da38..0000000
--- a/php/src/Google/Protobuf/Internal/FileDescriptor.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class FileDescriptor
-{
-
-    private $package;
-    private $message_type = [];
-    private $enum_type = [];
-
-    public function setPackage($package)
-    {
-        $this->package = $package;
-    }
-
-    public function getPackage()
-    {
-        return $this->package;
-    }
-
-    public function getMessageType()
-    {
-        return $this->message_type;
-    }
-
-    public function addMessageType($desc)
-    {
-        $this->message_type[] = $desc;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function addEnumType($desc)
-    {
-        $this->enum_type[]= $desc;
-    }
-
-    public static function buildFromProto($proto)
-    {
-        $file = new FileDescriptor();
-        $file->setPackage($proto->getPackage());
-        foreach ($proto->getMessageType() as $message_proto) {
-            $file->addMessageType(Descriptor::buildFromProto(
-                $message_proto, $proto, ""));
-        }
-        foreach ($proto->getEnumType() as $enum_proto) {
-            $file->addEnumType(
-                EnumDescriptor::buildFromProto(
-                    $enum_proto,
-                    $proto,
-                    ""));
-        }
-        return $file;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
deleted file mode 100644
index 9ee222d..0000000
--- a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
+++ /dev/null
@@ -1,486 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a complete .proto file.
- *
- * Generated from protobuf message <code>google.protobuf.FileDescriptorProto</code>
- */
-class FileDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * file name, relative to root of source tree
-     *
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * e.g. "foo", "foo.bar", etc.
-     *
-     * Generated from protobuf field <code>optional string package = 2;</code>
-     */
-    private $package = '';
-    private $has_package = false;
-    /**
-     * Names of files imported by this file.
-     *
-     * Generated from protobuf field <code>repeated string dependency = 3;</code>
-     */
-    private $dependency;
-    private $has_dependency = false;
-    /**
-     * Indexes of the public imported files in the dependency list above.
-     *
-     * Generated from protobuf field <code>repeated int32 public_dependency = 10;</code>
-     */
-    private $public_dependency;
-    private $has_public_dependency = false;
-    /**
-     * Indexes of the weak imported files in the dependency list.
-     * For Google-internal migration only. Do not use.
-     *
-     * Generated from protobuf field <code>repeated int32 weak_dependency = 11;</code>
-     */
-    private $weak_dependency;
-    private $has_weak_dependency = false;
-    /**
-     * All top-level definitions in this file.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
-     */
-    private $message_type;
-    private $has_message_type = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
-     */
-    private $enum_type;
-    private $has_enum_type = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
-     */
-    private $service;
-    private $has_service = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
-     */
-    private $extension;
-    private $has_extension = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FileOptions options = 8;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-    /**
-     * This field contains optional information about the original source code.
-     * You may safely remove this entire field without harming runtime
-     * functionality of the descriptors -- the information is needed only by
-     * development tools.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
-     */
-    private $source_code_info = null;
-    private $has_source_code_info = false;
-    /**
-     * The syntax of the proto file.
-     * The supported values are "proto2" and "proto3".
-     *
-     * Generated from protobuf field <code>optional string syntax = 12;</code>
-     */
-    private $syntax = '';
-    private $has_syntax = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * file name, relative to root of source tree
-     *
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * file name, relative to root of source tree
-     *
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * e.g. "foo", "foo.bar", etc.
-     *
-     * Generated from protobuf field <code>optional string package = 2;</code>
-     * @return string
-     */
-    public function getPackage()
-    {
-        return $this->package;
-    }
-
-    /**
-     * e.g. "foo", "foo.bar", etc.
-     *
-     * Generated from protobuf field <code>optional string package = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->package = $var;
-        $this->has_package = true;
-
-        return $this;
-    }
-
-    public function hasPackage()
-    {
-        return $this->has_package;
-    }
-
-    /**
-     * Names of files imported by this file.
-     *
-     * Generated from protobuf field <code>repeated string dependency = 3;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getDependency()
-    {
-        return $this->dependency;
-    }
-
-    /**
-     * Names of files imported by this file.
-     *
-     * Generated from protobuf field <code>repeated string dependency = 3;</code>
-     * @param string[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setDependency($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
-        $this->dependency = $arr;
-        $this->has_dependency = true;
-
-        return $this;
-    }
-
-    public function hasDependency()
-    {
-        return $this->has_dependency;
-    }
-
-    /**
-     * Indexes of the public imported files in the dependency list above.
-     *
-     * Generated from protobuf field <code>repeated int32 public_dependency = 10;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getPublicDependency()
-    {
-        return $this->public_dependency;
-    }
-
-    /**
-     * Indexes of the public imported files in the dependency list above.
-     *
-     * Generated from protobuf field <code>repeated int32 public_dependency = 10;</code>
-     * @param int[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setPublicDependency($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
-        $this->public_dependency = $arr;
-        $this->has_public_dependency = true;
-
-        return $this;
-    }
-
-    public function hasPublicDependency()
-    {
-        return $this->has_public_dependency;
-    }
-
-    /**
-     * Indexes of the weak imported files in the dependency list.
-     * For Google-internal migration only. Do not use.
-     *
-     * Generated from protobuf field <code>repeated int32 weak_dependency = 11;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getWeakDependency()
-    {
-        return $this->weak_dependency;
-    }
-
-    /**
-     * Indexes of the weak imported files in the dependency list.
-     * For Google-internal migration only. Do not use.
-     *
-     * Generated from protobuf field <code>repeated int32 weak_dependency = 11;</code>
-     * @param int[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setWeakDependency($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
-        $this->weak_dependency = $arr;
-        $this->has_weak_dependency = true;
-
-        return $this;
-    }
-
-    public function hasWeakDependency()
-    {
-        return $this->has_weak_dependency;
-    }
-
-    /**
-     * All top-level definitions in this file.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getMessageType()
-    {
-        return $this->message_type;
-    }
-
-    /**
-     * All top-level definitions in this file.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
-     * @param \Google\Protobuf\Internal\DescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setMessageType($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
-        $this->message_type = $arr;
-        $this->has_message_type = true;
-
-        return $this;
-    }
-
-    public function hasMessageType()
-    {
-        return $this->has_message_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
-     * @param \Google\Protobuf\Internal\EnumDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setEnumType($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
-        $this->enum_type = $arr;
-        $this->has_enum_type = true;
-
-        return $this;
-    }
-
-    public function hasEnumType()
-    {
-        return $this->has_enum_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getService()
-    {
-        return $this->service;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
-     * @param \Google\Protobuf\Internal\ServiceDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setService($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class);
-        $this->service = $arr;
-        $this->has_service = true;
-
-        return $this;
-    }
-
-    public function hasService()
-    {
-        return $this->has_service;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
-     * @param \Google\Protobuf\Internal\FieldDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setExtension($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->extension = $arr;
-        $this->has_extension = true;
-
-        return $this;
-    }
-
-    public function hasExtension()
-    {
-        return $this->has_extension;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FileOptions options = 8;</code>
-     * @return \Google\Protobuf\Internal\FileOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FileOptions options = 8;</code>
-     * @param \Google\Protobuf\Internal\FileOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    /**
-     * This field contains optional information about the original source code.
-     * You may safely remove this entire field without harming runtime
-     * functionality of the descriptors -- the information is needed only by
-     * development tools.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
-     * @return \Google\Protobuf\Internal\SourceCodeInfo
-     */
-    public function getSourceCodeInfo()
-    {
-        return $this->source_code_info;
-    }
-
-    /**
-     * This field contains optional information about the original source code.
-     * You may safely remove this entire field without harming runtime
-     * functionality of the descriptors -- the information is needed only by
-     * development tools.
-     *
-     * Generated from protobuf field <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
-     * @param \Google\Protobuf\Internal\SourceCodeInfo $var
-     * @return $this
-     */
-    public function setSourceCodeInfo($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class);
-        $this->source_code_info = $var;
-        $this->has_source_code_info = true;
-
-        return $this;
-    }
-
-    public function hasSourceCodeInfo()
-    {
-        return $this->has_source_code_info;
-    }
-
-    /**
-     * The syntax of the proto file.
-     * The supported values are "proto2" and "proto3".
-     *
-     * Generated from protobuf field <code>optional string syntax = 12;</code>
-     * @return string
-     */
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    /**
-     * The syntax of the proto file.
-     * The supported values are "proto2" and "proto3".
-     *
-     * Generated from protobuf field <code>optional string syntax = 12;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setSyntax($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->syntax = $var;
-        $this->has_syntax = true;
-
-        return $this;
-    }
-
-    public function hasSyntax()
-    {
-        return $this->has_syntax;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorSet.php b/php/src/Google/Protobuf/Internal/FileDescriptorSet.php
deleted file mode 100644
index 0b2cf95..0000000
--- a/php/src/Google/Protobuf/Internal/FileDescriptorSet.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * The protocol compiler can output a FileDescriptorSet containing the .proto
- * files it parses.
- *
- * Generated from protobuf message <code>google.protobuf.FileDescriptorSet</code>
- */
-class FileDescriptorSet extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
-     */
-    private $file;
-    private $has_file = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getFile()
-    {
-        return $this->file;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
-     * @param \Google\Protobuf\Internal\FileDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setFile($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class);
-        $this->file = $arr;
-        $this->has_file = true;
-
-        return $this;
-    }
-
-    public function hasFile()
-    {
-        return $this->has_file;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FileOptions.php b/php/src/Google/Protobuf/Internal/FileOptions.php
deleted file mode 100644
index f3bacad..0000000
--- a/php/src/Google/Protobuf/Internal/FileOptions.php
+++ /dev/null
@@ -1,865 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.FileOptions</code>
- */
-class FileOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Sets the Java package where classes generated from this .proto will be
-     * placed.  By default, the proto package is used, but this is often
-     * inappropriate because proto packages do not normally start with backwards
-     * domain names.
-     *
-     * Generated from protobuf field <code>optional string java_package = 1;</code>
-     */
-    private $java_package = '';
-    private $has_java_package = false;
-    /**
-     * If set, all the classes from the .proto file are wrapped in a single
-     * outer class with the given name.  This applies to both Proto1
-     * (equivalent to the old "--one_java_file" option) and Proto2 (where
-     * a .proto always translates to a single class, but you may want to
-     * explicitly choose the class name).
-     *
-     * Generated from protobuf field <code>optional string java_outer_classname = 8;</code>
-     */
-    private $java_outer_classname = '';
-    private $has_java_outer_classname = false;
-    /**
-     * If set true, then the Java code generator will generate a separate .java
-     * file for each top-level message, enum, and service defined in the .proto
-     * file.  Thus, these types will *not* be nested inside the outer class
-     * named by java_outer_classname.  However, the outer class will still be
-     * generated to contain the file's getDescriptor() method as well as any
-     * top-level extensions defined in the file.
-     *
-     * Generated from protobuf field <code>optional bool java_multiple_files = 10 [default = false];</code>
-     */
-    private $java_multiple_files = false;
-    private $has_java_multiple_files = false;
-    /**
-     * This option does nothing.
-     *
-     * Generated from protobuf field <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
-     */
-    private $java_generate_equals_and_hash = false;
-    private $has_java_generate_equals_and_hash = false;
-    /**
-     * If set true, then the Java2 code generator will generate code that
-     * throws an exception whenever an attempt is made to assign a non-UTF-8
-     * byte sequence to a string field.
-     * Message reflection will do the same.
-     * However, an extension field still accepts non-UTF-8 byte sequences.
-     * This option has no effect on when used with the lite runtime.
-     *
-     * Generated from protobuf field <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
-     */
-    private $java_string_check_utf8 = false;
-    private $has_java_string_check_utf8 = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
-     */
-    private $optimize_for = 0;
-    private $has_optimize_for = false;
-    /**
-     * Sets the Go package where structs generated from this .proto will be
-     * placed. If omitted, the Go package will be derived from the following:
-     *   - The basename of the package import path, if provided.
-     *   - Otherwise, the package statement in the .proto file, if present.
-     *   - Otherwise, the basename of the .proto file, without extension.
-     *
-     * Generated from protobuf field <code>optional string go_package = 11;</code>
-     */
-    private $go_package = '';
-    private $has_go_package = false;
-    /**
-     * Should generic services be generated in each language?  "Generic" services
-     * are not specific to any particular RPC system.  They are generated by the
-     * main code generators in each language (without additional plugins).
-     * Generic services were the only kind of service generation supported by
-     * early versions of google.protobuf.
-     * Generic services are now considered deprecated in favor of using plugins
-     * that generate code specific to your particular RPC system.  Therefore,
-     * these default to false.  Old code which depends on generic services should
-     * explicitly set them to true.
-     *
-     * Generated from protobuf field <code>optional bool cc_generic_services = 16 [default = false];</code>
-     */
-    private $cc_generic_services = false;
-    private $has_cc_generic_services = false;
-    /**
-     * Generated from protobuf field <code>optional bool java_generic_services = 17 [default = false];</code>
-     */
-    private $java_generic_services = false;
-    private $has_java_generic_services = false;
-    /**
-     * Generated from protobuf field <code>optional bool py_generic_services = 18 [default = false];</code>
-     */
-    private $py_generic_services = false;
-    private $has_py_generic_services = false;
-    /**
-     * Generated from protobuf field <code>optional bool php_generic_services = 42 [default = false];</code>
-     */
-    private $php_generic_services = false;
-    private $has_php_generic_services = false;
-    /**
-     * Is this file deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for everything in the file, or it will be completely ignored; in the very
-     * least, this is a formalization for deprecating files.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 23 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * Enables the use of arenas for the proto messages in this file. This applies
-     * only to generated classes for C++.
-     *
-     * Generated from protobuf field <code>optional bool cc_enable_arenas = 31 [default = false];</code>
-     */
-    private $cc_enable_arenas = false;
-    private $has_cc_enable_arenas = false;
-    /**
-     * Sets the objective c class prefix which is prepended to all objective c
-     * generated classes from this .proto. There is no default.
-     *
-     * Generated from protobuf field <code>optional string objc_class_prefix = 36;</code>
-     */
-    private $objc_class_prefix = '';
-    private $has_objc_class_prefix = false;
-    /**
-     * Namespace for generated classes; defaults to the package.
-     *
-     * Generated from protobuf field <code>optional string csharp_namespace = 37;</code>
-     */
-    private $csharp_namespace = '';
-    private $has_csharp_namespace = false;
-    /**
-     * By default Swift generators will take the proto package and CamelCase it
-     * replacing '.' with underscore and use that to prefix the types/symbols
-     * defined. When this options is provided, they will use this value instead
-     * to prefix the types/symbols defined.
-     *
-     * Generated from protobuf field <code>optional string swift_prefix = 39;</code>
-     */
-    private $swift_prefix = '';
-    private $has_swift_prefix = false;
-    /**
-     * Sets the php class prefix which is prepended to all php generated classes
-     * from this .proto. Default is empty.
-     *
-     * Generated from protobuf field <code>optional string php_class_prefix = 40;</code>
-     */
-    private $php_class_prefix = '';
-    private $has_php_class_prefix = false;
-    /**
-     * Use this option to change the namespace of php generated classes. Default
-     * is empty. When this option is empty, the package name will be used for
-     * determining the namespace.
-     *
-     * Generated from protobuf field <code>optional string php_namespace = 41;</code>
-     */
-    private $php_namespace = '';
-    private $has_php_namespace = false;
-    /**
-     * The parser stores options it doesn't recognize here.
-     * See the documentation for the "Options" section above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Sets the Java package where classes generated from this .proto will be
-     * placed.  By default, the proto package is used, but this is often
-     * inappropriate because proto packages do not normally start with backwards
-     * domain names.
-     *
-     * Generated from protobuf field <code>optional string java_package = 1;</code>
-     * @return string
-     */
-    public function getJavaPackage()
-    {
-        return $this->java_package;
-    }
-
-    /**
-     * Sets the Java package where classes generated from this .proto will be
-     * placed.  By default, the proto package is used, but this is often
-     * inappropriate because proto packages do not normally start with backwards
-     * domain names.
-     *
-     * Generated from protobuf field <code>optional string java_package = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setJavaPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->java_package = $var;
-        $this->has_java_package = true;
-
-        return $this;
-    }
-
-    public function hasJavaPackage()
-    {
-        return $this->has_java_package;
-    }
-
-    /**
-     * If set, all the classes from the .proto file are wrapped in a single
-     * outer class with the given name.  This applies to both Proto1
-     * (equivalent to the old "--one_java_file" option) and Proto2 (where
-     * a .proto always translates to a single class, but you may want to
-     * explicitly choose the class name).
-     *
-     * Generated from protobuf field <code>optional string java_outer_classname = 8;</code>
-     * @return string
-     */
-    public function getJavaOuterClassname()
-    {
-        return $this->java_outer_classname;
-    }
-
-    /**
-     * If set, all the classes from the .proto file are wrapped in a single
-     * outer class with the given name.  This applies to both Proto1
-     * (equivalent to the old "--one_java_file" option) and Proto2 (where
-     * a .proto always translates to a single class, but you may want to
-     * explicitly choose the class name).
-     *
-     * Generated from protobuf field <code>optional string java_outer_classname = 8;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setJavaOuterClassname($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->java_outer_classname = $var;
-        $this->has_java_outer_classname = true;
-
-        return $this;
-    }
-
-    public function hasJavaOuterClassname()
-    {
-        return $this->has_java_outer_classname;
-    }
-
-    /**
-     * If set true, then the Java code generator will generate a separate .java
-     * file for each top-level message, enum, and service defined in the .proto
-     * file.  Thus, these types will *not* be nested inside the outer class
-     * named by java_outer_classname.  However, the outer class will still be
-     * generated to contain the file's getDescriptor() method as well as any
-     * top-level extensions defined in the file.
-     *
-     * Generated from protobuf field <code>optional bool java_multiple_files = 10 [default = false];</code>
-     * @return bool
-     */
-    public function getJavaMultipleFiles()
-    {
-        return $this->java_multiple_files;
-    }
-
-    /**
-     * If set true, then the Java code generator will generate a separate .java
-     * file for each top-level message, enum, and service defined in the .proto
-     * file.  Thus, these types will *not* be nested inside the outer class
-     * named by java_outer_classname.  However, the outer class will still be
-     * generated to contain the file's getDescriptor() method as well as any
-     * top-level extensions defined in the file.
-     *
-     * Generated from protobuf field <code>optional bool java_multiple_files = 10 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setJavaMultipleFiles($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_multiple_files = $var;
-        $this->has_java_multiple_files = true;
-
-        return $this;
-    }
-
-    public function hasJavaMultipleFiles()
-    {
-        return $this->has_java_multiple_files;
-    }
-
-    /**
-     * This option does nothing.
-     *
-     * Generated from protobuf field <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
-     * @return bool
-     */
-    public function getJavaGenerateEqualsAndHash()
-    {
-        return $this->java_generate_equals_and_hash;
-    }
-
-    /**
-     * This option does nothing.
-     *
-     * Generated from protobuf field <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setJavaGenerateEqualsAndHash($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_generate_equals_and_hash = $var;
-        $this->has_java_generate_equals_and_hash = true;
-
-        return $this;
-    }
-
-    public function hasJavaGenerateEqualsAndHash()
-    {
-        return $this->has_java_generate_equals_and_hash;
-    }
-
-    /**
-     * If set true, then the Java2 code generator will generate code that
-     * throws an exception whenever an attempt is made to assign a non-UTF-8
-     * byte sequence to a string field.
-     * Message reflection will do the same.
-     * However, an extension field still accepts non-UTF-8 byte sequences.
-     * This option has no effect on when used with the lite runtime.
-     *
-     * Generated from protobuf field <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
-     * @return bool
-     */
-    public function getJavaStringCheckUtf8()
-    {
-        return $this->java_string_check_utf8;
-    }
-
-    /**
-     * If set true, then the Java2 code generator will generate code that
-     * throws an exception whenever an attempt is made to assign a non-UTF-8
-     * byte sequence to a string field.
-     * Message reflection will do the same.
-     * However, an extension field still accepts non-UTF-8 byte sequences.
-     * This option has no effect on when used with the lite runtime.
-     *
-     * Generated from protobuf field <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setJavaStringCheckUtf8($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_string_check_utf8 = $var;
-        $this->has_java_string_check_utf8 = true;
-
-        return $this;
-    }
-
-    public function hasJavaStringCheckUtf8()
-    {
-        return $this->has_java_string_check_utf8;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
-     * @return int
-     */
-    public function getOptimizeFor()
-    {
-        return $this->optimize_for;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setOptimizeFor($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class);
-        $this->optimize_for = $var;
-        $this->has_optimize_for = true;
-
-        return $this;
-    }
-
-    public function hasOptimizeFor()
-    {
-        return $this->has_optimize_for;
-    }
-
-    /**
-     * Sets the Go package where structs generated from this .proto will be
-     * placed. If omitted, the Go package will be derived from the following:
-     *   - The basename of the package import path, if provided.
-     *   - Otherwise, the package statement in the .proto file, if present.
-     *   - Otherwise, the basename of the .proto file, without extension.
-     *
-     * Generated from protobuf field <code>optional string go_package = 11;</code>
-     * @return string
-     */
-    public function getGoPackage()
-    {
-        return $this->go_package;
-    }
-
-    /**
-     * Sets the Go package where structs generated from this .proto will be
-     * placed. If omitted, the Go package will be derived from the following:
-     *   - The basename of the package import path, if provided.
-     *   - Otherwise, the package statement in the .proto file, if present.
-     *   - Otherwise, the basename of the .proto file, without extension.
-     *
-     * Generated from protobuf field <code>optional string go_package = 11;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setGoPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->go_package = $var;
-        $this->has_go_package = true;
-
-        return $this;
-    }
-
-    public function hasGoPackage()
-    {
-        return $this->has_go_package;
-    }
-
-    /**
-     * Should generic services be generated in each language?  "Generic" services
-     * are not specific to any particular RPC system.  They are generated by the
-     * main code generators in each language (without additional plugins).
-     * Generic services were the only kind of service generation supported by
-     * early versions of google.protobuf.
-     * Generic services are now considered deprecated in favor of using plugins
-     * that generate code specific to your particular RPC system.  Therefore,
-     * these default to false.  Old code which depends on generic services should
-     * explicitly set them to true.
-     *
-     * Generated from protobuf field <code>optional bool cc_generic_services = 16 [default = false];</code>
-     * @return bool
-     */
-    public function getCcGenericServices()
-    {
-        return $this->cc_generic_services;
-    }
-
-    /**
-     * Should generic services be generated in each language?  "Generic" services
-     * are not specific to any particular RPC system.  They are generated by the
-     * main code generators in each language (without additional plugins).
-     * Generic services were the only kind of service generation supported by
-     * early versions of google.protobuf.
-     * Generic services are now considered deprecated in favor of using plugins
-     * that generate code specific to your particular RPC system.  Therefore,
-     * these default to false.  Old code which depends on generic services should
-     * explicitly set them to true.
-     *
-     * Generated from protobuf field <code>optional bool cc_generic_services = 16 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setCcGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->cc_generic_services = $var;
-        $this->has_cc_generic_services = true;
-
-        return $this;
-    }
-
-    public function hasCcGenericServices()
-    {
-        return $this->has_cc_generic_services;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bool java_generic_services = 17 [default = false];</code>
-     * @return bool
-     */
-    public function getJavaGenericServices()
-    {
-        return $this->java_generic_services;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bool java_generic_services = 17 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setJavaGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_generic_services = $var;
-        $this->has_java_generic_services = true;
-
-        return $this;
-    }
-
-    public function hasJavaGenericServices()
-    {
-        return $this->has_java_generic_services;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bool py_generic_services = 18 [default = false];</code>
-     * @return bool
-     */
-    public function getPyGenericServices()
-    {
-        return $this->py_generic_services;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bool py_generic_services = 18 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setPyGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->py_generic_services = $var;
-        $this->has_py_generic_services = true;
-
-        return $this;
-    }
-
-    public function hasPyGenericServices()
-    {
-        return $this->has_py_generic_services;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bool php_generic_services = 42 [default = false];</code>
-     * @return bool
-     */
-    public function getPhpGenericServices()
-    {
-        return $this->php_generic_services;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bool php_generic_services = 42 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setPhpGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->php_generic_services = $var;
-        $this->has_php_generic_services = true;
-
-        return $this;
-    }
-
-    public function hasPhpGenericServices()
-    {
-        return $this->has_php_generic_services;
-    }
-
-    /**
-     * Is this file deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for everything in the file, or it will be completely ignored; in the very
-     * least, this is a formalization for deprecating files.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 23 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this file deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for everything in the file, or it will be completely ignored; in the very
-     * least, this is a formalization for deprecating files.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 23 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * Enables the use of arenas for the proto messages in this file. This applies
-     * only to generated classes for C++.
-     *
-     * Generated from protobuf field <code>optional bool cc_enable_arenas = 31 [default = false];</code>
-     * @return bool
-     */
-    public function getCcEnableArenas()
-    {
-        return $this->cc_enable_arenas;
-    }
-
-    /**
-     * Enables the use of arenas for the proto messages in this file. This applies
-     * only to generated classes for C++.
-     *
-     * Generated from protobuf field <code>optional bool cc_enable_arenas = 31 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setCcEnableArenas($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->cc_enable_arenas = $var;
-        $this->has_cc_enable_arenas = true;
-
-        return $this;
-    }
-
-    public function hasCcEnableArenas()
-    {
-        return $this->has_cc_enable_arenas;
-    }
-
-    /**
-     * Sets the objective c class prefix which is prepended to all objective c
-     * generated classes from this .proto. There is no default.
-     *
-     * Generated from protobuf field <code>optional string objc_class_prefix = 36;</code>
-     * @return string
-     */
-    public function getObjcClassPrefix()
-    {
-        return $this->objc_class_prefix;
-    }
-
-    /**
-     * Sets the objective c class prefix which is prepended to all objective c
-     * generated classes from this .proto. There is no default.
-     *
-     * Generated from protobuf field <code>optional string objc_class_prefix = 36;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setObjcClassPrefix($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->objc_class_prefix = $var;
-        $this->has_objc_class_prefix = true;
-
-        return $this;
-    }
-
-    public function hasObjcClassPrefix()
-    {
-        return $this->has_objc_class_prefix;
-    }
-
-    /**
-     * Namespace for generated classes; defaults to the package.
-     *
-     * Generated from protobuf field <code>optional string csharp_namespace = 37;</code>
-     * @return string
-     */
-    public function getCsharpNamespace()
-    {
-        return $this->csharp_namespace;
-    }
-
-    /**
-     * Namespace for generated classes; defaults to the package.
-     *
-     * Generated from protobuf field <code>optional string csharp_namespace = 37;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setCsharpNamespace($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->csharp_namespace = $var;
-        $this->has_csharp_namespace = true;
-
-        return $this;
-    }
-
-    public function hasCsharpNamespace()
-    {
-        return $this->has_csharp_namespace;
-    }
-
-    /**
-     * By default Swift generators will take the proto package and CamelCase it
-     * replacing '.' with underscore and use that to prefix the types/symbols
-     * defined. When this options is provided, they will use this value instead
-     * to prefix the types/symbols defined.
-     *
-     * Generated from protobuf field <code>optional string swift_prefix = 39;</code>
-     * @return string
-     */
-    public function getSwiftPrefix()
-    {
-        return $this->swift_prefix;
-    }
-
-    /**
-     * By default Swift generators will take the proto package and CamelCase it
-     * replacing '.' with underscore and use that to prefix the types/symbols
-     * defined. When this options is provided, they will use this value instead
-     * to prefix the types/symbols defined.
-     *
-     * Generated from protobuf field <code>optional string swift_prefix = 39;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setSwiftPrefix($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->swift_prefix = $var;
-        $this->has_swift_prefix = true;
-
-        return $this;
-    }
-
-    public function hasSwiftPrefix()
-    {
-        return $this->has_swift_prefix;
-    }
-
-    /**
-     * Sets the php class prefix which is prepended to all php generated classes
-     * from this .proto. Default is empty.
-     *
-     * Generated from protobuf field <code>optional string php_class_prefix = 40;</code>
-     * @return string
-     */
-    public function getPhpClassPrefix()
-    {
-        return $this->php_class_prefix;
-    }
-
-    /**
-     * Sets the php class prefix which is prepended to all php generated classes
-     * from this .proto. Default is empty.
-     *
-     * Generated from protobuf field <code>optional string php_class_prefix = 40;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setPhpClassPrefix($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->php_class_prefix = $var;
-        $this->has_php_class_prefix = true;
-
-        return $this;
-    }
-
-    public function hasPhpClassPrefix()
-    {
-        return $this->has_php_class_prefix;
-    }
-
-    /**
-     * Use this option to change the namespace of php generated classes. Default
-     * is empty. When this option is empty, the package name will be used for
-     * determining the namespace.
-     *
-     * Generated from protobuf field <code>optional string php_namespace = 41;</code>
-     * @return string
-     */
-    public function getPhpNamespace()
-    {
-        return $this->php_namespace;
-    }
-
-    /**
-     * Use this option to change the namespace of php generated classes. Default
-     * is empty. When this option is empty, the package name will be used for
-     * determining the namespace.
-     *
-     * Generated from protobuf field <code>optional string php_namespace = 41;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setPhpNamespace($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->php_namespace = $var;
-        $this->has_php_namespace = true;
-
-        return $this;
-    }
-
-    public function hasPhpNamespace()
-    {
-        return $this->has_php_namespace;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here.
-     * See the documentation for the "Options" section above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here.
-     * See the documentation for the "Options" section above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php b/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php
deleted file mode 100644
index 4dd56ef..0000000
--- a/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-/**
- * Generated classes can be optimized for speed or code size.
- *
- * Protobuf enum <code>Google\Protobuf\Internal</code>
- */
-class FileOptions_OptimizeMode
-{
-    /**
-     * Generate complete code for parsing, serialization,
-     *
-     * Generated from protobuf enum <code>SPEED = 1;</code>
-     */
-    const SPEED = 1;
-    /**
-     * etc.
-     *
-     * Generated from protobuf enum <code>CODE_SIZE = 2;</code>
-     */
-    const CODE_SIZE = 2;
-    /**
-     * Generate code using MessageLite and the lite runtime.
-     *
-     * Generated from protobuf enum <code>LITE_RUNTIME = 3;</code>
-     */
-    const LITE_RUNTIME = 3;
-}
-
diff --git a/php/src/Google/Protobuf/Internal/GPBDecodeException.php b/php/src/Google/Protobuf/Internal/GPBDecodeException.php
deleted file mode 100644
index 402d542..0000000
--- a/php/src/Google/Protobuf/Internal/GPBDecodeException.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class GPBDecodeException extends \Exception
-{
-    public function __construct(
-        $message,
-        $code = 0,
-        \Exception $previous = null)
-    {
-        parent::__construct(
-            "Error occurred during parsing: " . $message,
-            $code,
-            $previous);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/GPBJsonWire.php b/php/src/Google/Protobuf/Internal/GPBJsonWire.php
deleted file mode 100644
index 9ae57ab..0000000
--- a/php/src/Google/Protobuf/Internal/GPBJsonWire.php
+++ /dev/null
@@ -1,304 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class GPBJsonWire
-{
-
-    public static function serializeFieldToStream(
-        $value,
-        $field,
-        &$output, $has_field_name = true)
-    {
-        if ($has_field_name) {
-            $output->writeRaw("\"", 1);
-            $field_name = GPBJsonWire::formatFieldName($field);
-            $output->writeRaw($field_name, strlen($field_name));
-            $output->writeRaw("\":", 2);
-        }
-        return static::serializeFieldValueToStream(
-            $value,
-            $field,
-            $output,
-            !$has_field_name);
-    }
-
-    public static function serializeFieldValueToStream(
-        $values,
-        $field,
-        &$output,
-        $is_well_known = false)
-    {
-        if ($field->isMap()) {
-            $output->writeRaw("{", 1);
-            $first = true;
-            $map_entry = $field->getMessageType();
-            $key_field = $map_entry->getFieldByNumber(1);
-            $value_field = $map_entry->getFieldByNumber(2);
-
-            switch ($key_field->getType()) {
-            case GPBType::STRING:
-            case GPBType::SFIXED64:
-            case GPBType::INT64:
-            case GPBType::SINT64:
-            case GPBType::FIXED64:
-            case GPBType::UINT64:
-                $additional_quote = false;
-                break;
-            default:
-                $additional_quote = true;
-            }
-
-            foreach ($values as $key => $value) {
-                if ($first) {
-                    $first = false;
-                } else {
-                    $output->writeRaw(",", 1);
-                }
-                if ($additional_quote) {
-                    $output->writeRaw("\"", 1);
-                }
-                if (!static::serializeSingularFieldValueToStream(
-                    $key,
-                    $key_field,
-                    $output,
-                    $is_well_known)) {
-                    return false;
-                }
-                if ($additional_quote) {
-                    $output->writeRaw("\"", 1);
-                }
-                $output->writeRaw(":", 1);
-                if (!static::serializeSingularFieldValueToStream(
-                    $value,
-                    $value_field,
-                    $output,
-                    $is_well_known)) {
-                    return false;
-                }
-            }
-            $output->writeRaw("}", 1);
-            return true;
-        } elseif ($field->isRepeated()) {
-            $output->writeRaw("[", 1);
-            $first = true;
-            foreach ($values as $value) {
-                if ($first) {
-                    $first = false;
-                } else {
-                    $output->writeRaw(",", 1);
-                }
-                if (!static::serializeSingularFieldValueToStream(
-                    $value,
-                    $field,
-                    $output,
-                    $is_well_known)) {
-                    return false;
-                }
-            }
-            $output->writeRaw("]", 1);
-            return true;
-        } else {
-            return static::serializeSingularFieldValueToStream(
-                $values,
-                $field,
-                $output,
-                $is_well_known);
-        }
-    }
-
-    private static function serializeSingularFieldValueToStream(
-        $value,
-        $field,
-        &$output, $is_well_known = false)
-    {
-        switch ($field->getType()) {
-            case GPBType::SFIXED32:
-            case GPBType::SINT32:
-            case GPBType::INT32:
-                $str_value = strval($value);
-                $output->writeRaw($str_value, strlen($str_value));
-                break;
-            case GPBType::FIXED32:
-            case GPBType::UINT32:
-                if ($value < 0) {
-                    $value = bcadd($value, "4294967296");
-                }
-                $str_value = strval($value);
-                $output->writeRaw($str_value, strlen($str_value));
-                break;
-            case GPBType::FIXED64:
-            case GPBType::UINT64:
-                if ($value < 0) {
-                    $value = bcadd($value, "18446744073709551616");
-                }
-                // Intentional fall through.
-            case GPBType::SFIXED64:
-            case GPBType::INT64:
-            case GPBType::SINT64:
-                $output->writeRaw("\"", 1);
-                $str_value = strval($value);
-                $output->writeRaw($str_value, strlen($str_value));
-                $output->writeRaw("\"", 1);
-                break;
-            case GPBType::FLOAT:
-                if (is_nan($value)) {
-                    $str_value = "\"NaN\"";
-                } elseif ($value === INF) {
-                    $str_value = "\"Infinity\"";
-                } elseif ($value === -INF) {
-                    $str_value = "\"-Infinity\"";
-                } else {
-                    $str_value = sprintf("%.8g", $value);
-                }
-                $output->writeRaw($str_value, strlen($str_value));
-                break;
-            case GPBType::DOUBLE:
-                if (is_nan($value)) {
-                    $str_value = "\"NaN\"";
-                } elseif ($value === INF) {
-                    $str_value = "\"Infinity\"";
-                } elseif ($value === -INF) {
-                    $str_value = "\"-Infinity\"";
-                } else {
-                    $str_value = sprintf("%.17g", $value);
-                }
-                $output->writeRaw($str_value, strlen($str_value));
-                break;
-            case GPBType::ENUM:
-                $enum_desc = $field->getEnumType();
-                if ($enum_desc->getClass() === "Google\Protobuf\NullValue") {
-                    $output->writeRaw("null", 4);
-                    break;
-                }
-                $enum_value_desc = $enum_desc->getValueByNumber($value);
-                if (!is_null($enum_value_desc)) {
-                    $str_value = $enum_value_desc->getName();
-                    $output->writeRaw("\"", 1);
-                    $output->writeRaw($str_value, strlen($str_value));
-                    $output->writeRaw("\"", 1);
-                } else {
-                    $str_value = strval($value);
-                    $output->writeRaw($str_value, strlen($str_value));
-                }
-                break;
-            case GPBType::BOOL:
-                if ($value) {
-                    $output->writeRaw("true", 4);
-                } else {
-                    $output->writeRaw("false", 5);
-                }
-                break;
-            case GPBType::BYTES:
-                $bytes_value = base64_encode($value);
-                $output->writeRaw("\"", 1);
-                $output->writeRaw($bytes_value, strlen($bytes_value));
-                $output->writeRaw("\"", 1);
-                break;
-            case GPBType::STRING:
-                $value = json_encode($value);
-                $output->writeRaw($value, strlen($value));
-                break;
-            //    case GPBType::GROUP:
-            //      echo "GROUP\xA";
-            //      trigger_error("Not implemented.", E_ERROR);
-            //      break;
-            case GPBType::MESSAGE:
-                $value->serializeToJsonStream($output);
-                break;
-            default:
-                user_error("Unsupported type.");
-                return false;
-        }
-        return true;
-    }
-
-    private static function formatFieldName($field)
-    {
-        return $field->getJsonName();
-    }
-
-    // Used for escaping control chars in strings.
-    private static $k_control_char_limit = 0x20;
-
-    private static function jsonNiceEscape($c)
-    {
-      switch ($c) {
-          case '"':  return "\\\"";
-          case '\\': return "\\\\";
-          case '/': return "\\/";
-          case '\b': return "\\b";
-          case '\f': return "\\f";
-          case '\n': return "\\n";
-          case '\r': return "\\r";
-          case '\t': return "\\t";
-          default:   return NULL;
-      }
-    }
-
-    private static function isJsonEscaped($c)
-    {
-        // See RFC 4627.
-        return $c < chr($k_control_char_limit) || $c === "\"" || $c === "\\";
-    }
-
-    public static function escapedJson($value)
-    {
-        $escaped_value = "";
-        $unescaped_run = "";
-        for ($i = 0; $i < strlen($value); $i++) {
-            $c = $value[$i];
-            // Handle escaping.
-            if (static::isJsonEscaped($c)) {
-                // Use a "nice" escape, like \n, if one exists for this
-                // character.
-                $escape = static::jsonNiceEscape($c);
-                if (is_null($escape)) {
-                    $escape = "\\u00" . bin2hex($c);
-                }
-                if ($unescaped_run !== "") {
-                    $escaped_value .= $unescaped_run;
-                    $unescaped_run = "";
-                }
-                $escaped_value .= $escape;
-            } else {
-              if ($unescaped_run === "") {
-                $unescaped_run .= $c;
-              }
-            }
-        }
-        $escaped_value .= $unescaped_run;
-        return $escaped_value;
-    }
-
-}
diff --git a/php/src/Google/Protobuf/Internal/GPBLabel.php b/php/src/Google/Protobuf/Internal/GPBLabel.php
deleted file mode 100644
index 0fb2384..0000000
--- a/php/src/Google/Protobuf/Internal/GPBLabel.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class GPBLabel
-{
-    const OPTIONAL = 1;
-    const REQUIRED = 2;
-    const REPEATED = 3;
-}
diff --git a/php/src/Google/Protobuf/Internal/GPBType.php b/php/src/Google/Protobuf/Internal/GPBType.php
deleted file mode 100644
index fa849ce..0000000
--- a/php/src/Google/Protobuf/Internal/GPBType.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class GPBType
-{
-    const DOUBLE   =  1;
-    const FLOAT    =  2;
-    const INT64    =  3;
-    const UINT64   =  4;
-    const INT32    =  5;
-    const FIXED64  =  6;
-    const FIXED32  =  7;
-    const BOOL     =  8;
-    const STRING   =  9;
-    const GROUP    = 10;
-    const MESSAGE  = 11;
-    const BYTES    = 12;
-    const UINT32   = 13;
-    const ENUM     = 14;
-    const SFIXED32 = 15;
-    const SFIXED64 = 16;
-    const SINT32   = 17;
-    const SINT64   = 18;
-}
diff --git a/php/src/Google/Protobuf/Internal/GPBUtil.php b/php/src/Google/Protobuf/Internal/GPBUtil.php
deleted file mode 100644
index 76f84cb..0000000
--- a/php/src/Google/Protobuf/Internal/GPBUtil.php
+++ /dev/null
@@ -1,571 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Duration;
-use Google\Protobuf\FieldMask;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\MapField;
-
-function camel2underscore($input) {
-    preg_match_all(
-        '!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!',
-        $input,
-        $matches);
-    $ret = $matches[0];
-    foreach ($ret as &$match) {
-        $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
-    }
-    return implode('_', $ret);
-}
-
-class GPBUtil
-{
-    const NANOS_PER_MILLISECOND = 1000000;
-    const NANOS_PER_MICROSECOND = 1000;
-    const TYPE_URL_PREFIX = 'type.googleapis.com/';
-
-    public static function divideInt64ToInt32($value, &$high, &$low, $trim = false)
-    {
-        $isNeg = (bccomp($value, 0) < 0);
-        if ($isNeg) {
-            $value = bcsub(0, $value);
-        }
-
-        $high = bcdiv($value, 4294967296);
-        $low = bcmod($value, 4294967296);
-        if (bccomp($high, 2147483647) > 0) {
-            $high = (int) bcsub($high, 4294967296);
-        } else {
-            $high = (int) $high;
-        }
-        if (bccomp($low, 2147483647) > 0) {
-            $low = (int) bcsub($low, 4294967296);
-        } else {
-            $low = (int) $low;
-        }
-
-        if ($isNeg) {
-            $high = ~$high;
-            $low = ~$low;
-            $low++;
-            if (!$low) {
-                $high = (int)($high + 1);
-            }
-        }
-
-        if ($trim) {
-            $high = 0;
-        }
-    }
-
-    public static function checkString(&$var, $check_utf8)
-    {
-        if (is_array($var) || is_object($var)) {
-            throw new \InvalidArgumentException("Expect string.");
-        }
-        if (!is_string($var)) {
-            $var = strval($var);
-        }
-        if ($check_utf8 && !preg_match('//u', $var)) {
-            throw new \Exception("Expect utf-8 encoding.");
-        }
-    }
-
-    public static function checkEnum(&$var)
-    {
-      static::checkInt32($var);
-    }
-
-    public static function checkInt32(&$var)
-    {
-        if (is_numeric($var)) {
-            $var = intval($var);
-        } else {
-            throw new \Exception("Expect integer.");
-        }
-    }
-
-    public static function checkUint32(&$var)
-    {
-        if (is_numeric($var)) {
-            if (PHP_INT_SIZE === 8) {
-                $var = intval($var);
-                $var |= ((-(($var >> 31) & 0x1)) & ~0xFFFFFFFF);
-            } else {
-                if (bccomp($var, 0x7FFFFFFF) > 0) {
-                    $var = bcsub($var, "4294967296");
-                }
-                $var = (int) $var;
-            }
-        } else {
-            throw new \Exception("Expect integer.");
-        }
-    }
-
-    public static function checkInt64(&$var)
-    {
-        if (is_numeric($var)) {
-            if (PHP_INT_SIZE == 8) {
-                $var = intval($var);
-            } else {
-                if (is_float($var) ||
-                    is_integer($var) ||
-                    (is_string($var) &&
-                         bccomp($var, "9223372036854774784") < 0)) {
-                    $var = number_format($var, 0, ".", "");
-                }
-            }
-        } else {
-            throw new \Exception("Expect integer.");
-        }
-    }
-
-    public static function checkUint64(&$var)
-    {
-        if (is_numeric($var)) {
-            if (PHP_INT_SIZE == 8) {
-                $var = intval($var);
-            } else {
-                $var = number_format($var, 0, ".", "");
-            }
-        } else {
-            throw new \Exception("Expect integer.");
-        }
-    }
-
-    public static function checkFloat(&$var)
-    {
-        if (is_float($var) || is_numeric($var)) {
-            $var = floatval($var);
-        } else {
-            throw new \Exception("Expect float.");
-        }
-    }
-
-    public static function checkDouble(&$var)
-    {
-        if (is_float($var) || is_numeric($var)) {
-            $var = floatval($var);
-        } else {
-            throw new \Exception("Expect float.");
-        }
-    }
-
-    public static function checkBool(&$var)
-    {
-        if (is_array($var) || is_object($var)) {
-            throw new \Exception("Expect boolean.");
-        }
-        $var = boolval($var);
-    }
-
-    public static function checkMessage(&$var, $klass)
-    {
-        if (!$var instanceof $klass && !is_null($var)) {
-            throw new \Exception("Expect message.");
-        }
-    }
-
-    public static function checkRepeatedField(&$var, $type, $klass = null)
-    {
-        if (!$var instanceof RepeatedField && !is_array($var)) {
-            throw new \Exception("Expect array.");
-        }
-        if (is_array($var)) {
-            $tmp = new RepeatedField($type, $klass);
-            foreach ($var as $value) {
-                $tmp[] = $value;
-            }
-            return $tmp;
-        } else {
-            if ($var->getType() != $type) {
-                throw new \Exception(
-                    "Expect repeated field of different type.");
-            }
-            if ($var->getType() === GPBType::MESSAGE &&
-                $var->getClass() !== $klass) {
-                throw new \Exception(
-                    "Expect repeated field of different message.");
-            }
-            return $var;
-        }
-    }
-
-    public static function checkMapField(&$var, $key_type, $value_type, $klass = null)
-    {
-        if (!$var instanceof MapField && !is_array($var)) {
-            throw new \Exception("Expect dict.");
-        }
-        if (is_array($var)) {
-            $tmp = new MapField($key_type, $value_type, $klass);
-            foreach ($var as $key => $value) {
-                $tmp[$key] = $value;
-            }
-            return $tmp;
-        } else {
-            if ($var->getKeyType() != $key_type) {
-                throw new \Exception("Expect map field of key type.");
-            }
-            if ($var->getValueType() != $value_type) {
-                throw new \Exception("Expect map field of value type.");
-            }
-            if ($var->getValueType() === GPBType::MESSAGE &&
-                $var->getValueClass() !== $klass) {
-                throw new \Exception(
-                    "Expect map field of different value message.");
-            }
-            return $var;
-        }
-    }
-
-    public static function Int64($value)
-    {
-        return new Int64($value);
-    }
-
-    public static function Uint64($value)
-    {
-        return new Uint64($value);
-    }
-
-    public static function getClassNamePrefix(
-        $classname,
-        $file_proto)
-    {
-        $option = $file_proto->getOptions();
-        $prefix = is_null($option) ? "" : $option->getPhpClassPrefix();
-        if ($prefix !== "") {
-            return $prefix;
-        }
-
-        $reserved_words = array(
-            "abstract"=>0, "and"=>0, "array"=>0, "as"=>0, "break"=>0,
-            "callable"=>0, "case"=>0, "catch"=>0, "class"=>0, "clone"=>0,
-            "const"=>0, "continue"=>0, "declare"=>0, "default"=>0, "die"=>0,
-            "do"=>0, "echo"=>0, "else"=>0, "elseif"=>0, "empty"=>0,
-            "enddeclare"=>0, "endfor"=>0, "endforeach"=>0, "endif"=>0,
-            "endswitch"=>0, "endwhile"=>0, "eval"=>0, "exit"=>0, "extends"=>0,
-            "final"=>0, "for"=>0, "foreach"=>0, "function"=>0, "global"=>0,
-            "goto"=>0, "if"=>0, "implements"=>0, "include"=>0,
-            "include_once"=>0, "instanceof"=>0, "insteadof"=>0, "interface"=>0,
-            "isset"=>0, "list"=>0, "namespace"=>0, "new"=>0, "or"=>0,
-            "print"=>0, "private"=>0, "protected"=>0, "public"=>0, "require"=>0,
-            "require_once"=>0, "return"=>0, "static"=>0, "switch"=>0,
-            "throw"=>0, "trait"=>0, "try"=>0, "unset"=>0, "use"=>0, "var"=>0,
-            "while"=>0, "xor"=>0, "int"=>0, "float"=>0, "bool"=>0, "string"=>0,
-            "true"=>0, "false"=>0, "null"=>0, "void"=>0, "iterable"=>0
-        );
-
-        if (array_key_exists(strtolower($classname), $reserved_words)) {
-            if ($file_proto->getPackage() === "google.protobuf") {
-                return "GPB";
-            } else {
-                return "PB";
-            }
-        }
-
-        return "";
-    }
-
-    public static function getClassNameWithoutPackage(
-        $name,
-        $file_proto)
-    {
-        $classname = implode('_', explode('.', $name));
-        return static::getClassNamePrefix($classname, $file_proto) . $classname;
-    }
-
-    public static function getFullClassName(
-        $proto,
-        $containing,
-        $file_proto,
-        &$message_name_without_package,
-        &$classname,
-        &$fullname)
-    {
-        // Full name needs to start with '.'.
-        $message_name_without_package = $proto->getName();
-        if ($containing !== "") {
-            $message_name_without_package =
-                $containing . "." . $message_name_without_package;
-        }
-
-        $package = $file_proto->getPackage();
-        if ($package === "") {
-            $fullname = "." . $message_name_without_package;
-        } else {
-            $fullname = "." . $package . "." . $message_name_without_package;
-        }
-
-        $class_name_without_package =
-            static::getClassNameWithoutPackage($message_name_without_package, $file_proto);
-
-        $option = $file_proto->getOptions();
-        if (!is_null($option) && $option->hasPhpNamespace()) {
-            $namespace = $option->getPhpNamespace();
-            if ($namespace !== "") {
-                $classname = $namespace . "\\" . $class_name_without_package;
-                return;
-            } else {
-                $classname = $class_name_without_package;
-                return;
-            }
-        }
-
-        if ($package === "") {
-            $classname = $class_name_without_package;
-        } else {
-            $classname =
-                implode('\\', array_map('ucwords', explode('.', $package))).
-                "\\".$class_name_without_package;
-        }
-    }
-
-    public static function combineInt32ToInt64($high, $low)
-    {
-        $isNeg = $high < 0;
-        if ($isNeg) {
-            $high = ~$high;
-            $low = ~$low;
-            $low++;
-            if (!$low) {
-                $high = (int) ($high + 1);
-            }
-        }
-        $result = bcadd(bcmul($high, 4294967296), $low);
-        if ($low < 0) {
-            $result = bcadd($result, 4294967296);
-        }
-        if ($isNeg) {
-          $result = bcsub(0, $result);
-        }
-        return $result;
-    }
-
-    public static function parseTimestamp($timestamp)
-    {
-        // prevent parsing timestamps containing with the non-existant year "0000"
-        // DateTime::createFromFormat parses without failing but as a nonsensical date
-        if (substr($timestamp, 0, 4) === "0000") {
-            throw new \Exception("Year cannot be zero.");
-        }
-        // prevent parsing timestamps ending with a lowercase z
-        if (substr($timestamp, -1, 1) === "z") {
-            throw new \Exception("Timezone cannot be a lowercase z.");
-        }
-
-        $nanoseconds = 0;
-        $periodIndex = strpos($timestamp, ".");
-        if ($periodIndex !== false) {
-            $nanosecondsLength = 0;
-            // find the next non-numeric character in the timestamp to calculate
-            // the length of the nanoseconds text
-            for ($i = $periodIndex + 1, $length = strlen($timestamp); $i < $length; $i++) {
-                if (!is_numeric($timestamp[$i])) {
-                    $nanosecondsLength = $i - ($periodIndex + 1);
-                    break;
-                }
-            }
-            if ($nanosecondsLength % 3 !== 0) {
-                throw new \Exception("Nanoseconds must be disible by 3.");
-            }
-            if ($nanosecondsLength > 9) {
-                throw new \Exception("Nanoseconds must be in the range of 0 to 999,999,999 nanoseconds.");
-            }
-            if ($nanosecondsLength > 0) {
-                $nanoseconds = substr($timestamp, $periodIndex + 1, $nanosecondsLength);
-                $nanoseconds = intval($nanoseconds);
-
-                // remove the nanoseconds and preceding period from the timestamp
-                $date = substr($timestamp, 0, $periodIndex - 1);
-                $timezone = substr($timestamp, $periodIndex + $nanosecondsLength);
-                $timestamp = $date.$timezone;
-            }
-        }
-
-        $date = \DateTime::createFromFormat(\DateTime::RFC3339, $timestamp, new \DateTimeZone("UTC"));
-        if ($date === false) {
-            throw new \Exception("Invalid RFC 3339 timestamp.");
-        }
-
-        $value = new \Google\Protobuf\Timestamp();
-        $seconds = $date->format("U");
-        $value->setSeconds($seconds);
-        $value->setNanos($nanoseconds);
-        return $value;
-    }
-
-    public static function formatTimestamp($value)
-    {
-        if (bccomp($value->getSeconds(), "253402300800") != -1) {
-          throw new GPBDecodeException("Duration number too large.");
-        }
-        if (bccomp($value->getSeconds(), "-62135596801") != 1) {
-          throw new GPBDecodeException("Duration number too small.");
-        }
-        $nanoseconds = static::getNanosecondsForTimestamp($value->getNanos());
-        if (!empty($nanoseconds)) {
-            $nanoseconds = ".".$nanoseconds;
-        }
-        $date = new \DateTime('@'.$value->getSeconds(), new \DateTimeZone("UTC"));
-        return $date->format("Y-m-d\TH:i:s".$nanoseconds."\Z");
-    }
-
-    public static function parseDuration($value)
-    {
-        if (strlen($value) < 2 || substr($value, -1) !== "s") {
-          throw new GPBDecodeException("Missing s after duration string");
-        }
-        $number = substr($value, 0, -1);
-        if (bccomp($number, "315576000001") != -1) {
-          throw new GPBDecodeException("Duration number too large.");
-        }
-        if (bccomp($number, "-315576000001") != 1) {
-          throw new GPBDecodeException("Duration number too small.");
-        }
-        $pos = strrpos($number, ".");
-        if ($pos !== false) {
-            $seconds = substr($number, 0, $pos);
-            if (bccomp($seconds, 0) < 0) {
-                $nanos = bcmul("0" . substr($number, $pos), -1000000000);
-            } else {
-                $nanos = bcmul("0" . substr($number, $pos), 1000000000);
-            }
-        } else {
-            $seconds = $number;
-            $nanos = 0;
-        }
-        $duration = new Duration();
-        $duration->setSeconds($seconds);
-        $duration->setNanos($nanos);
-        return $duration;
-    }
-
-    public static function formatDuration($value)
-    {
-        if (bccomp($value->getSeconds(), "315576000001") != -1) {
-          throw new GPBDecodeException("Duration number too large.");
-        }
-        if (bccomp($value->getSeconds(), "-315576000001") != 1) {
-          throw new GPBDecodeException("Duration number too small.");
-        }
-        return strval(bcadd($value->getSeconds(),
-                      $value->getNanos() / 1000000000.0, 9));
-    }
-
-
-
-    public static function parseFieldMask($paths_string)
-    {
-        $path_strings = explode(",", $paths_string);
-        $field_mask = new FieldMask();
-        $paths = $field_mask->getPaths();
-        foreach($path_strings as &$path_string) {
-            $field_strings = explode(".", $path_string);
-            foreach($field_strings as &$field_string) {
-                $field_string = camel2underscore($field_string);
-            }
-            $path_string = implode(".", $field_strings);
-            $paths[] = $path_string;
-        }
-        return $field_mask;
-    }
-
-    public static function formatFieldMask($field_mask)
-    {
-        $converted_paths = [];
-        foreach($field_mask->getPaths() as $path) {
-            $fields = explode('.', $path);
-            $converted_path = [];
-            foreach ($fields as $field) {
-                $segments = explode('_', $field);
-                $start = true;
-                $converted_segments = "";
-                foreach($segments as $segment) {
-                  if (!$start) {
-                    $converted = ucfirst($segment);
-                  } else {
-                    $converted = $segment;
-                    $start = false;
-                  }
-                  $converted_segments .= $converted;
-                }
-                $converted_path []= $converted_segments;
-            }
-            $converted_path = implode(".", $converted_path);
-            $converted_paths []= $converted_path;
-        }
-        return implode(",", $converted_paths);
-    }
-
-    public static function getNanosecondsForTimestamp($nanoseconds)
-    {
-        if ($nanoseconds == 0) {
-            return '';
-        }
-        if ($nanoseconds % static::NANOS_PER_MILLISECOND == 0) {
-            return sprintf('%03d', $nanoseconds / static::NANOS_PER_MILLISECOND);
-        }
-        if ($nanoseconds % static::NANOS_PER_MICROSECOND == 0) {
-            return sprintf('%06d', $nanoseconds / static::NANOS_PER_MICROSECOND);
-        }
-        return sprintf('%09d', $nanoseconds);
-    }
-
-    public static function hasSpecialJsonMapping($msg)
-    {
-        return is_a($msg, 'Google\Protobuf\Any')         ||
-               is_a($msg, "Google\Protobuf\ListValue")   ||
-               is_a($msg, "Google\Protobuf\Struct")      ||
-               is_a($msg, "Google\Protobuf\Value")       ||
-               is_a($msg, "Google\Protobuf\Duration")    ||
-               is_a($msg, "Google\Protobuf\Timestamp")   ||
-               is_a($msg, "Google\Protobuf\FieldMask")   ||
-               static::hasJsonValue($msg);
-    }
-
-    public static function hasJsonValue($msg)
-    {
-        return is_a($msg, "Google\Protobuf\DoubleValue") ||
-               is_a($msg, "Google\Protobuf\FloatValue")  ||
-               is_a($msg, "Google\Protobuf\Int64Value")  ||
-               is_a($msg, "Google\Protobuf\UInt64Value") ||
-               is_a($msg, "Google\Protobuf\Int32Value")  ||
-               is_a($msg, "Google\Protobuf\UInt32Value") ||
-               is_a($msg, "Google\Protobuf\BoolValue")   ||
-               is_a($msg, "Google\Protobuf\StringValue") ||
-               is_a($msg, "Google\Protobuf\BytesValue");
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/GPBWire.php b/php/src/Google/Protobuf/Internal/GPBWire.php
deleted file mode 100644
index e7eec55..0000000
--- a/php/src/Google/Protobuf/Internal/GPBWire.php
+++ /dev/null
@@ -1,622 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class GPBWire
-{
-
-    const TAG_TYPE_BITS = 3;
-
-    const WIRETYPE_VARINT  = 0;
-    const WIRETYPE_FIXED64 = 1;
-    const WIRETYPE_LENGTH_DELIMITED = 2;
-    const WIRETYPE_START_GROUP = 3;
-    const WIRETYPE_END_GROUP = 4;
-    const WIRETYPE_FIXED32 = 5;
-
-    const UNKNOWN = 0;
-    const NORMAL_FORMAT = 1;
-    const PACKED_FORMAT = 2;
-
-    public static function getTagFieldNumber($tag)
-    {
-        return ($tag >> self::TAG_TYPE_BITS) &
-            (1 << ((PHP_INT_SIZE * 8) - self::TAG_TYPE_BITS)) - 1;
-    }
-
-    public static function getTagWireType($tag)
-    {
-        return $tag & 0x7;
-    }
-
-    public static function getWireType($type)
-    {
-        switch ($type) {
-            case GPBType::FLOAT:
-            case GPBType::FIXED32:
-            case GPBType::SFIXED32:
-                return self::WIRETYPE_FIXED32;
-            case GPBType::DOUBLE:
-            case GPBType::FIXED64:
-            case GPBType::SFIXED64:
-                return self::WIRETYPE_FIXED64;
-            case GPBType::UINT32:
-            case GPBType::UINT64:
-            case GPBType::INT32:
-            case GPBType::INT64:
-            case GPBType::SINT32:
-            case GPBType::SINT64:
-            case GPBType::ENUM:
-            case GPBType::BOOL:
-                return self::WIRETYPE_VARINT;
-            case GPBType::STRING:
-            case GPBType::BYTES:
-            case GPBType::MESSAGE:
-                return self::WIRETYPE_LENGTH_DELIMITED;
-            case GPBType::GROUP:
-                user_error("Unsupported type.");
-                return 0;
-            default:
-                user_error("Unsupported type.");
-                return 0;
-        }
-    }
-
-  // ZigZag Transform:  Encodes signed integers so that they can be effectively
-  // used with varint encoding.
-  //
-  // varint operates on unsigned integers, encoding smaller numbers into fewer
-  // bytes.  If you try to use it on a signed integer, it will treat this
-  // number as a very large unsigned integer, which means that even small
-  // signed numbers like -1 will take the maximum number of bytes (10) to
-  // encode.  zigZagEncode() maps signed integers to unsigned in such a way
-  // that those with a small absolute value will have smaller encoded values,
-  // making them appropriate for encoding using varint.
-  //
-  // int32 ->     uint32
-  // -------------------------
-  //           0 ->          0
-  //          -1 ->          1
-  //           1 ->          2
-  //          -2 ->          3
-  //         ... ->        ...
-  //  2147483647 -> 4294967294
-  // -2147483648 -> 4294967295
-  //
-  //        >> encode >>
-  //        << decode <<
-  public static function zigZagEncode32($int32)
-  {
-      if (PHP_INT_SIZE == 8) {
-          $trim_int32 = $int32 & 0xFFFFFFFF;
-          return (($trim_int32 << 1) ^ ($int32 << 32 >> 63)) & 0xFFFFFFFF;
-      } else {
-          return ($int32 << 1) ^ ($int32 >> 31);
-      }
-  }
-
-    public static function zigZagDecode32($uint32)
-    {
-        // Fill high 32 bits.
-        if (PHP_INT_SIZE === 8) {
-            $uint32 |= ($uint32 & 0xFFFFFFFF);
-        }
-
-        $int32 = (($uint32 >> 1) & 0x7FFFFFFF) ^ (-($uint32 & 1));
-
-        return $int32;
-    }
-
-    public static function zigZagEncode64($int64)
-    {
-        if (PHP_INT_SIZE == 4) {
-            if (bccomp($int64, 0) >= 0) {
-                return bcmul($int64, 2);
-            } else {
-                return bcsub(bcmul(bcsub(0, $int64), 2), 1);
-            }
-        } else {
-            return ($int64 << 1) ^ ($int64 >> 63);
-        }
-    }
-
-    public static function zigZagDecode64($uint64)
-    {
-        if (PHP_INT_SIZE == 4) {
-            if (bcmod($uint64, 2) == 0) {
-                return bcdiv($uint64, 2, 0);
-            } else {
-                return bcsub(0, bcdiv(bcadd($uint64, 1), 2, 0));
-            }
-        } else {
-            return (($uint64 >> 1) & 0x7FFFFFFFFFFFFFFF) ^ (-($uint64 & 1));
-        }
-    }
-
-    public static function readInt32(&$input, &$value)
-    {
-        return $input->readVarint32($value);
-    }
-
-    public static function readInt64(&$input, &$value)
-    {
-        $success = $input->readVarint64($value);
-        if (PHP_INT_SIZE == 4 && bccomp($value, "9223372036854775807") > 0) {
-            $value = bcsub($value, "18446744073709551616");
-        }
-        return $success;
-    }
-
-    public static function readUint32(&$input, &$value)
-    {
-        return self::readInt32($input, $value);
-    }
-
-    public static function readUint64(&$input, &$value)
-    {
-        return self::readInt64($input, $value);
-    }
-
-    public static function readSint32(&$input, &$value)
-    {
-        if (!$input->readVarint32($value)) {
-            return false;
-        }
-        $value = GPBWire::zigZagDecode32($value);
-        return true;
-    }
-
-    public static function readSint64(&$input, &$value)
-    {
-        if (!$input->readVarint64($value)) {
-            return false;
-        }
-        $value = GPBWire::zigZagDecode64($value);
-        return true;
-    }
-
-    public static function readFixed32(&$input, &$value)
-    {
-        return $input->readLittleEndian32($value);
-    }
-
-    public static function readFixed64(&$input, &$value)
-    {
-        return $input->readLittleEndian64($value);
-    }
-
-    public static function readSfixed32(&$input, &$value)
-    {
-        if (!self::readFixed32($input, $value)) {
-            return false;
-        }
-        if (PHP_INT_SIZE === 8) {
-            $value |= (-($value >> 31) << 32);
-        }
-        return true;
-    }
-
-    public static function readSfixed64(&$input, &$value)
-    {
-        $success = $input->readLittleEndian64($value);
-        if (PHP_INT_SIZE == 4 && bccomp($value, "9223372036854775807") > 0) {
-            $value = bcsub($value, "18446744073709551616");
-        }
-        return $success;
-    }
-
-    public static function readFloat(&$input, &$value)
-    {
-        $data = null;
-        if (!$input->readRaw(4, $data)) {
-            return false;
-        }
-        $value = unpack('f', $data)[1];
-        return true;
-    }
-
-    public static function readDouble(&$input, &$value)
-    {
-        $data = null;
-        if (!$input->readRaw(8, $data)) {
-            return false;
-        }
-        $value = unpack('d', $data)[1];
-        return true;
-    }
-
-    public static function readBool(&$input, &$value)
-    {
-        if (!$input->readVarint64($value)) {
-            return false;
-        }
-        if ($value == 0) {
-            $value = false;
-        } else {
-            $value = true;
-        }
-        return true;
-    }
-
-    public static function readString(&$input, &$value)
-    {
-        $length = 0;
-        return $input->readVarintSizeAsInt($length) && $input->readRaw($length, $value);
-    }
-
-    public static function readMessage(&$input, &$message)
-    {
-        $length = 0;
-        if (!$input->readVarintSizeAsInt($length)) {
-            return false;
-        }
-        $old_limit = 0;
-        $recursion_limit = 0;
-        $input->incrementRecursionDepthAndPushLimit(
-            $length,
-            $old_limit,
-            $recursion_limit);
-        if ($recursion_limit < 0 || !$message->parseFromStream($input)) {
-            return false;
-        }
-        return $input->decrementRecursionDepthAndPopLimit($old_limit);
-    }
-
-    public static function writeTag(&$output, $tag)
-    {
-        return $output->writeTag($tag);
-    }
-
-    public static function writeInt32(&$output, $value)
-    {
-        return $output->writeVarint32($value, false);
-    }
-
-    public static function writeInt64(&$output, $value)
-    {
-        return $output->writeVarint64($value);
-    }
-
-    public static function writeUint32(&$output, $value)
-    {
-        return $output->writeVarint32($value, true);
-    }
-
-    public static function writeUint64(&$output, $value)
-    {
-        return $output->writeVarint64($value);
-    }
-
-    public static function writeSint32(&$output, $value)
-    {
-        $value = GPBWire::zigZagEncode32($value);
-        return $output->writeVarint32($value, true);
-    }
-
-    public static function writeSint64(&$output, $value)
-    {
-        $value = GPBWire::zigZagEncode64($value);
-        return $output->writeVarint64($value);
-    }
-
-    public static function writeFixed32(&$output, $value)
-    {
-        return $output->writeLittleEndian32($value);
-    }
-
-    public static function writeFixed64(&$output, $value)
-    {
-        return $output->writeLittleEndian64($value);
-    }
-
-    public static function writeSfixed32(&$output, $value)
-    {
-        return $output->writeLittleEndian32($value);
-    }
-
-    public static function writeSfixed64(&$output, $value)
-    {
-        return $output->writeLittleEndian64($value);
-    }
-
-    public static function writeBool(&$output, $value)
-    {
-        if ($value) {
-            return $output->writeVarint32(1, true);
-        } else {
-            return $output->writeVarint32(0, true);
-        }
-    }
-
-    public static function writeFloat(&$output, $value)
-    {
-        $data = pack("f", $value);
-        return $output->writeRaw($data, 4);
-    }
-
-    public static function writeDouble(&$output, $value)
-    {
-        $data = pack("d", $value);
-        return $output->writeRaw($data, 8);
-    }
-
-    public static function writeString(&$output, $value)
-    {
-        return self::writeBytes($output, $value);
-    }
-
-    public static function writeBytes(&$output, $value)
-    {
-        $size = strlen($value);
-        if (!$output->writeVarint32($size, true)) {
-            return false;
-        }
-        return $output->writeRaw($value, $size);
-    }
-
-    public static function writeMessage(&$output, $value)
-    {
-        $size = $value->byteSize();
-        if (!$output->writeVarint32($size, true)) {
-            return false;
-        }
-        return $value->serializeToStream($output);
-    }
-
-    public static function makeTag($number, $type)
-    {
-        return ($number << 3) | self::getWireType($type);
-    }
-
-    public static function tagSize($field)
-    {
-        $tag = self::makeTag($field->getNumber(), $field->getType());
-        return self::varint32Size($tag);
-    }
-
-    public static function varint32Size($value, $sign_extended = false)
-    {
-        if ($value < 0) {
-            if ($sign_extended) {
-                return 10;
-            } else {
-                return 5;
-            }
-        }
-        if ($value < (1 <<  7)) {
-            return 1;
-        }
-        if ($value < (1 << 14)) {
-            return 2;
-        }
-        if ($value < (1 << 21)) {
-            return 3;
-        }
-        if ($value < (1 << 28)) {
-            return 4;
-        }
-        return 5;
-    }
-
-    public static function sint32Size($value)
-    {
-        $value = self::zigZagEncode32($value);
-        return self::varint32Size($value);
-    }
-
-    public static function sint64Size($value)
-    {
-        $value = self::zigZagEncode64($value);
-        return self::varint64Size($value);
-    }
-
-    public static function varint64Size($value)
-    {
-        if (PHP_INT_SIZE == 4) {
-            if (bccomp($value, 0) < 0 ||
-                bccomp($value, "9223372036854775807") > 0) {
-                return 10;
-            }    
-            if (bccomp($value, 1 << 7) < 0) {
-                return 1;
-            }
-            if (bccomp($value, 1 << 14) < 0) {
-                return 2;
-            }
-            if (bccomp($value, 1 << 21) < 0) {
-                return 3;
-            }
-            if (bccomp($value, 1 << 28) < 0) {
-                return 4;
-            }
-            if (bccomp($value, '34359738368') < 0) {
-                return 5;
-            }
-            if (bccomp($value, '4398046511104') < 0) {
-                return 6;
-            }
-            if (bccomp($value, '562949953421312') < 0) {
-                return 7;
-            }
-            if (bccomp($value, '72057594037927936') < 0) {
-                return 8;
-            }
-            return 9;
-        } else {
-            if ($value < 0) {
-                return 10;
-            }    
-            if ($value < (1 <<  7)) {
-                return 1;
-            }
-            if ($value < (1 << 14)) {
-                return 2;
-            }
-            if ($value < (1 << 21)) {
-                return 3;
-            }
-            if ($value < (1 << 28)) {
-                return 4;
-            }
-            if ($value < (1 << 35)) {
-                return 5;
-            }
-            if ($value < (1 << 42)) {
-                return 6;
-            }
-            if ($value < (1 << 49)) {
-                return 7;
-            }
-            if ($value < (1 << 56)) {
-                return 8;
-            }
-            return 9;
-        }
-    }
-
-    public static function serializeFieldToStream(
-        $value,
-        $field,
-        $need_tag,
-        &$output)
-    {
-        if ($need_tag) {
-            if (!GPBWire::writeTag(
-                $output,
-                self::makeTag(
-                    $field->getNumber(),
-                    $field->getType()))) {
-                return false;
-            }
-        }
-        switch ($field->getType()) {
-            case GPBType::DOUBLE:
-                if (!GPBWire::writeDouble($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::FLOAT:
-                if (!GPBWire::writeFloat($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::INT64:
-                if (!GPBWire::writeInt64($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::UINT64:
-                if (!GPBWire::writeUint64($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::INT32:
-                if (!GPBWire::writeInt32($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::FIXED32:
-                if (!GPBWire::writeFixed32($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::FIXED64:
-                if (!GPBWire::writeFixed64($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::BOOL:
-                if (!GPBWire::writeBool($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::STRING:
-                if (!GPBWire::writeString($output, $value)) {
-                    return false;
-                }
-                break;
-            //    case GPBType::GROUP:
-            //      echo "GROUP\xA";
-            //      trigger_error("Not implemented.", E_ERROR);
-            //      break;
-            case GPBType::MESSAGE:
-                if (!GPBWire::writeMessage($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::BYTES:
-                if (!GPBWire::writeBytes($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::UINT32:
-                if (PHP_INT_SIZE === 8 && $value < 0) {
-                    $value += 4294967296;
-                }
-                if (!GPBWire::writeUint32($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::ENUM:
-                if (!GPBWire::writeInt32($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::SFIXED32:
-                if (!GPBWire::writeSfixed32($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::SFIXED64:
-                if (!GPBWire::writeSfixed64($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::SINT32:
-                if (!GPBWire::writeSint32($output, $value)) {
-                    return false;
-                }
-                break;
-            case GPBType::SINT64:
-                if (!GPBWire::writeSint64($output, $value)) {
-                    return false;
-                }
-                break;
-            default:
-                user_error("Unsupported type.");
-                return false;
-        }
-
-        return true;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/GPBWireType.php b/php/src/Google/Protobuf/Internal/GPBWireType.php
deleted file mode 100644
index c1ad370..0000000
--- a/php/src/Google/Protobuf/Internal/GPBWireType.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class GPBWireType
-{
-    const VARINT           = 0;
-    const FIXED64          = 1;
-    const LENGTH_DELIMITED = 2;
-    const START_GROUP      = 3;
-    const END_GROUP        = 4;
-    const FIXED32          = 5;
-}
diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
deleted file mode 100644
index ae2ad74..0000000
--- a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes the relationship between generated code and its original source
- * file. A GeneratedCodeInfo message is associated with only one generated
- * source file, but may contain references to different source .proto files.
- *
- * Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo</code>
- */
-class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * An Annotation connects some span of text in generated code to an element
-     * of its generating .proto file.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
-     */
-    private $annotation;
-    private $has_annotation = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * An Annotation connects some span of text in generated code to an element
-     * of its generating .proto file.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getAnnotation()
-    {
-        return $this->annotation;
-    }
-
-    /**
-     * An Annotation connects some span of text in generated code to an element
-     * of its generating .proto file.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
-     * @param \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setAnnotation($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class);
-        $this->annotation = $arr;
-        $this->has_annotation = true;
-
-        return $this;
-    }
-
-    public function hasAnnotation()
-    {
-        return $this->has_annotation;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php
deleted file mode 100644
index 22ac233..0000000
--- a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.GeneratedCodeInfo.Annotation</code>
- */
-class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Identifies the element in the original source .proto file. This field
-     * is formatted the same as SourceCodeInfo.Location.path.
-     *
-     * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code>
-     */
-    private $path;
-    private $has_path = false;
-    /**
-     * Identifies the filesystem path to the original source .proto.
-     *
-     * Generated from protobuf field <code>optional string source_file = 2;</code>
-     */
-    private $source_file = '';
-    private $has_source_file = false;
-    /**
-     * Identifies the starting offset in bytes in the generated code
-     * that relates to the identified object.
-     *
-     * Generated from protobuf field <code>optional int32 begin = 3;</code>
-     */
-    private $begin = 0;
-    private $has_begin = false;
-    /**
-     * Identifies the ending offset in bytes in the generated code that
-     * relates to the identified offset. The end offset should be one past
-     * the last relevant byte (so the length of the text = end - begin).
-     *
-     * Generated from protobuf field <code>optional int32 end = 4;</code>
-     */
-    private $end = 0;
-    private $has_end = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Identifies the element in the original source .proto file. This field
-     * is formatted the same as SourceCodeInfo.Location.path.
-     *
-     * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    /**
-     * Identifies the element in the original source .proto file. This field
-     * is formatted the same as SourceCodeInfo.Location.path.
-     *
-     * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code>
-     * @param int[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setPath($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
-        $this->path = $arr;
-        $this->has_path = true;
-
-        return $this;
-    }
-
-    public function hasPath()
-    {
-        return $this->has_path;
-    }
-
-    /**
-     * Identifies the filesystem path to the original source .proto.
-     *
-     * Generated from protobuf field <code>optional string source_file = 2;</code>
-     * @return string
-     */
-    public function getSourceFile()
-    {
-        return $this->source_file;
-    }
-
-    /**
-     * Identifies the filesystem path to the original source .proto.
-     *
-     * Generated from protobuf field <code>optional string source_file = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setSourceFile($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->source_file = $var;
-        $this->has_source_file = true;
-
-        return $this;
-    }
-
-    public function hasSourceFile()
-    {
-        return $this->has_source_file;
-    }
-
-    /**
-     * Identifies the starting offset in bytes in the generated code
-     * that relates to the identified object.
-     *
-     * Generated from protobuf field <code>optional int32 begin = 3;</code>
-     * @return int
-     */
-    public function getBegin()
-    {
-        return $this->begin;
-    }
-
-    /**
-     * Identifies the starting offset in bytes in the generated code
-     * that relates to the identified object.
-     *
-     * Generated from protobuf field <code>optional int32 begin = 3;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setBegin($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->begin = $var;
-        $this->has_begin = true;
-
-        return $this;
-    }
-
-    public function hasBegin()
-    {
-        return $this->has_begin;
-    }
-
-    /**
-     * Identifies the ending offset in bytes in the generated code that
-     * relates to the identified offset. The end offset should be one past
-     * the last relevant byte (so the length of the text = end - begin).
-     *
-     * Generated from protobuf field <code>optional int32 end = 4;</code>
-     * @return int
-     */
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    /**
-     * Identifies the ending offset in bytes in the generated code that
-     * relates to the identified offset. The end offset should be one past
-     * the last relevant byte (so the length of the text = end - begin).
-     *
-     * Generated from protobuf field <code>optional int32 end = 4;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-
-        return $this;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php b/php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php
deleted file mode 100644
index d22bc30..0000000
--- a/php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-namespace Google\Protobuf\Internal;
-
-trait GetPublicDescriptorTrait
-{
-    private function getPublicDescriptor($desc)
-    {
-        return is_null($desc) ? null : $desc->getPublicDescriptor();
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php b/php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php
deleted file mode 100644
index ed5d166..0000000
--- a/php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-trait HasPublicDescriptorTrait
-{
-    private $public_desc;
-
-    public function getPublicDescriptor()
-    {
-        return $this->public_desc;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/MapEntry.php b/php/src/Google/Protobuf/Internal/MapEntry.php
deleted file mode 100644
index 9c32f1e..0000000
--- a/php/src/Google/Protobuf/Internal/MapEntry.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\Message;
-
-class MapEntry extends Message
-{
-    public $key;
-    public $value;
-
-    public function setKey($key) {
-      $this->key = $key;
-    }
-
-    public function getKey() {
-      return $this->key;
-    }
-
-    public function setValue($value) {
-      $this->value = $value;
-    }
-
-    public function getValue() {
-      return $this->value;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/MapField.php b/php/src/Google/Protobuf/Internal/MapField.php
deleted file mode 100644
index 38736da..0000000
--- a/php/src/Google/Protobuf/Internal/MapField.php
+++ /dev/null
@@ -1,272 +0,0 @@
-<?php
-
-// 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.
-
-/**
- * MapField and MapFieldIter are used by generated protocol message classes to
- * manipulate map fields.
- */
-
-namespace Google\Protobuf\Internal;
-
-/**
- * MapField is used by generated protocol message classes to manipulate map
- * fields. It can be used like native PHP array.
- */
-class MapField implements \ArrayAccess, \IteratorAggregate, \Countable
-{
-    /**
-     * @ignore
-     */
-    private $container;
-    /**
-     * @ignore
-     */
-    private $key_type;
-    /**
-     * @ignore
-     */
-    private $value_type;
-    /**
-     * @ignore
-     */
-    private $value_klass;
-
-    /**
-     * Constructs an instance of MapField.
-     *
-     * @param long $key_type Type of the stored key element.
-     * @param long $value_type Type of the stored value element.
-     * @param string $klass Message/Enum class name of value instance
-     * (message/enum fields only).
-     * @ignore
-     */
-    public function __construct($key_type, $value_type, $klass = null)
-    {
-        $this->container = [];
-        $this->key_type = $key_type;
-        $this->value_type = $value_type;
-        $this->klass = $klass;
-    }
-
-    /**
-     * @ignore
-     */
-    public function getKeyType()
-    {
-        return $this->key_type;
-    }
-
-    /**
-     * @ignore
-     */
-    public function getValueType()
-    {
-        return $this->value_type;
-    }
-
-    /**
-     * @ignore
-     */
-    public function getValueClass()
-    {
-        return $this->klass;
-    }
-
-    /**
-     * Return the element at the given key.
-     *
-     * This will also be called for: $ele = $arr[$key]
-     *
-     * @param object $key The key of the element to be fetched.
-     * @return object The stored element at given key.
-     * @throws ErrorException Invalid type for index.
-     * @throws ErrorException Non-existing index.
-     */
-    public function offsetGet($key)
-    {
-        return $this->container[$key];
-    }
-
-    /**
-     * Assign the element at the given key.
-     *
-     * This will also be called for: $arr[$key] = $value
-     *
-     * @param object $key The key of the element to be fetched.
-     * @param object $value The element to be assigned.
-     * @return void
-     * @throws ErrorException Invalid type for key.
-     * @throws ErrorException Invalid type for value.
-     * @throws ErrorException Non-existing key.
-     */
-    public function offsetSet($key, $value)
-    {
-        $this->checkKey($this->key_type, $key);
-
-        switch ($this->value_type) {
-            case GPBType::INT32:
-                GPBUtil::checkInt32($value);
-                break;
-            case GPBType::UINT32:
-                GPBUtil::checkUint32($value);
-                break;
-            case GPBType::INT64:
-                GPBUtil::checkInt64($value);
-                break;
-            case GPBType::UINT64:
-                GPBUtil::checkUint64($value);
-                break;
-            case GPBType::FLOAT:
-                GPBUtil::checkFloat($value);
-                break;
-            case GPBType::DOUBLE:
-                GPBUtil::checkDouble($value);
-                break;
-            case GPBType::BOOL:
-                GPBUtil::checkBool($value);
-                break;
-            case GPBType::STRING:
-                GPBUtil::checkString($value, true);
-                break;
-            case GPBType::MESSAGE:
-                if (is_null($value)) {
-                  trigger_error("Map element cannot be null.", E_USER_ERROR);
-                }
-                GPBUtil::checkMessage($value, $this->klass);
-                break;
-            default:
-                break;
-        }
-
-        $this->container[$key] = $value;
-    }
-
-    /**
-     * Remove the element at the given key.
-     *
-     * This will also be called for: unset($arr)
-     *
-     * @param object $key The key of the element to be removed.
-     * @return void
-     * @throws ErrorException Invalid type for key.
-     */
-    public function offsetUnset($key)
-    {
-        $this->checkKey($this->key_type, $key);
-        unset($this->container[$key]);
-    }
-
-    /**
-     * Check the existence of the element at the given key.
-     *
-     * This will also be called for: isset($arr)
-     *
-     * @param object $key The key of the element to be removed.
-     * @return bool True if the element at the given key exists.
-     * @throws ErrorException Invalid type for key.
-     */
-    public function offsetExists($key)
-    {
-        $this->checkKey($this->key_type, $key);
-        return isset($this->container[$key]);
-    }
-
-    /**
-     * @ignore
-     */
-    public function getIterator()
-    {
-        return new MapFieldIter($this->container, $this->key_type);
-    }
-
-    /**
-     * Return the number of stored elements.
-     *
-     * This will also be called for: count($arr)
-     *
-     * @return integer The number of stored elements.
-     */
-    public function count()
-    {
-        return count($this->container);
-    }
-
-    /**
-     * @ignore
-     */
-    private function checkKey($key_type, &$key)
-    {
-        switch ($key_type) {
-            case GPBType::INT32:
-                GPBUtil::checkInt32($key);
-                break;
-            case GPBType::UINT32:
-                GPBUtil::checkUint32($key);
-                break;
-            case GPBType::INT64:
-                GPBUtil::checkInt64($key);
-                break;
-            case GPBType::UINT64:
-                GPBUtil::checkUint64($key);
-                break;
-            case GPBType::FIXED64:
-                GPBUtil::checkUint64($key);
-                break;
-            case GPBType::FIXED32:
-                GPBUtil::checkUint32($key);
-                break;
-            case GPBType::SFIXED64:
-                GPBUtil::checkInt64($key);
-                break;
-            case GPBType::SFIXED32:
-                GPBUtil::checkInt32($key);
-                break;
-            case GPBType::SINT64:
-                GPBUtil::checkInt64($key);
-                break;
-            case GPBType::SINT32:
-                GPBUtil::checkInt32($key);
-                break;
-            case GPBType::BOOL:
-                GPBUtil::checkBool($key);
-                break;
-            case GPBType::STRING:
-                GPBUtil::checkString($key, true);
-                break;
-            default:
-                trigger_error(
-                    "Given type cannot be map key.",
-                    E_USER_ERROR);
-                break;
-        }
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/MapFieldIter.php b/php/src/Google/Protobuf/Internal/MapFieldIter.php
deleted file mode 100644
index 88e6c8b..0000000
--- a/php/src/Google/Protobuf/Internal/MapFieldIter.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-// 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.
-
-/**
- * MapField and MapFieldIter are used by generated protocol message classes to
- * manipulate map fields.
- */
-
-namespace Google\Protobuf\Internal;
-
-/**
- * MapFieldIter is used to iterate MapField. It is also need for the foreach
- * syntax.
- */
-class MapFieldIter implements \Iterator
-{
-
-    /**
-     * @ignore
-     */
-    private $container;
-
-    /**
-     * Create iterator instance for MapField.
-     *
-     * @param MapField The MapField instance for which this iterator is
-     * created.
-     * @param GPBType Map key type.
-     * @ignore
-     */
-    public function __construct($container, $key_type)
-    {
-        $this->container = $container;
-        $this->key_type = $key_type;
-    }
-
-    /**
-     * Reset the status of the iterator
-     *
-     * @return void
-     */
-    public function rewind()
-    {
-        return reset($this->container);
-    }
-
-    /**
-     * Return the element at the current position.
-     *
-     * @return object The element at the current position.
-     */
-    public function current()
-    {
-        return current($this->container);
-    }
-
-    /**
-     * Return the current key.
-     *
-     * @return object The current key.
-     */
-    public function key()
-    {
-        $key = key($this->container);
-        if ($this->key_type === GPBType::BOOL) {
-            // PHP associative array stores bool as integer for key.
-            return boolval($key);
-        } elseif ($this->key_type === GPBType::STRING) {
-            // PHP associative array stores int string as int for key.
-            return strval($key);
-        } else {
-            return $key;
-        }
-    }
-
-    /**
-     * Move to the next position.
-     *
-     * @return void
-     */
-    public function next()
-    {
-        return next($this->container);
-    }
-
-    /**
-     * Check whether there are more elements to iterate.
-     *
-     * @return bool True if there are more elements to iterate.
-     */
-    public function valid()
-    {
-        return key($this->container) !== null;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php
deleted file mode 100644
index b7f83c5..0000000
--- a/php/src/Google/Protobuf/Internal/Message.php
+++ /dev/null
@@ -1,1770 +0,0 @@
-<?php
-
-// 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.
-
-/**
- * Defines Message, the parent class extended by all protocol message classes.
- */
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\CodedInputStream;
-use Google\Protobuf\Internal\CodedOutputStream;
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBLabel;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\MapEntry;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\ListValue;
-use Google\Protobuf\Value;
-use Google\Protobuf\Struct;
-use Google\Protobuf\NullValue;
-
-/**
- * Parent class of all proto messages. Users should not instantiate this class
- * or extend this class or its child classes by their own.  See the comment of
- * specific functions for more details.
- */
-class Message
-{
-
-    /**
-     * @ignore
-     */
-    private $desc;
-    private $unknown = "";
-
-    /**
-     * @ignore
-     */
-    public function __construct($desc = NULL)
-    {
-        // MapEntry message is shared by all types of map fields, whose
-        // descriptors are different from each other. Thus, we cannot find a
-        // specific descriptor from the descriptor pool.
-        if (get_class($this) === 'Google\Protobuf\Internal\MapEntry') {
-            $this->desc = $desc;
-            foreach ($desc->getField() as $field) {
-                $setter = $field->getSetter();
-                $this->$setter($this->defaultValue($field));
-            }
-            return;
-        }
-        $pool = DescriptorPool::getGeneratedPool();
-        $this->desc = $pool->getDescriptorByClassName(get_class($this));
-        if (is_null($this->desc)) {
-            user_error(get_class($this) . "is not found in descriptor pool.");
-        }
-        foreach ($this->desc->getField() as $field) {
-            $setter = $field->getSetter();
-            if ($field->isMap()) {
-                $message_type = $field->getMessageType();
-                $key_field = $message_type->getFieldByNumber(1);
-                $value_field = $message_type->getFieldByNumber(2);
-                switch ($value_field->getType()) {
-                    case GPBType::MESSAGE:
-                    case GPBType::GROUP:
-                        $map_field = new MapField(
-                            $key_field->getType(),
-                            $value_field->getType(),
-                            $value_field->getMessageType()->getClass());
-                        $this->$setter($map_field);
-                        break;
-                    case GPBType::ENUM:
-                        $map_field = new MapField(
-                            $key_field->getType(),
-                            $value_field->getType(),
-                            $value_field->getEnumType()->getClass());
-                        $this->$setter($map_field);
-                        break;
-                    default:
-                        $map_field = new MapField(
-                            $key_field->getType(),
-                            $value_field->getType());
-                        $this->$setter($map_field);
-                        break;
-                }
-            } else if ($field->getLabel() === GPBLabel::REPEATED) {
-                switch ($field->getType()) {
-                    case GPBType::MESSAGE:
-                    case GPBType::GROUP:
-                        $repeated_field = new RepeatedField(
-                            $field->getType(),
-                            $field->getMessageType()->getClass());
-                        $this->$setter($repeated_field);
-                        break;
-                    case GPBType::ENUM:
-                        $repeated_field = new RepeatedField(
-                            $field->getType(),
-                            $field->getEnumType()->getClass());
-                        $this->$setter($repeated_field);
-                        break;
-                    default:
-                        $repeated_field = new RepeatedField($field->getType());
-                        $this->$setter($repeated_field);
-                        break;
-                }
-            } else if ($field->getOneofIndex() !== -1) {
-                $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()];
-                $oneof_name = $oneof->getName();
-                $this->$oneof_name = new OneofField($oneof);
-            } else if ($field->getLabel() === GPBLabel::OPTIONAL &&
-                       PHP_INT_SIZE == 4) {
-                switch ($field->getType()) {
-                    case GPBType::INT64:
-                    case GPBType::UINT64:
-                    case GPBType::FIXED64:
-                    case GPBType::SFIXED64:
-                    case GPBType::SINT64:
-                        $this->$setter("0");
-                }
-            }
-        }
-    }
-
-    protected function readOneof($number)
-    {
-        $field = $this->desc->getFieldByNumber($number);
-        $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()];
-        $oneof_name = $oneof->getName();
-        $oneof_field = $this->$oneof_name;
-        if ($number === $oneof_field->getNumber()) {
-            return $oneof_field->getValue();
-        } else {
-            return $this->defaultValue($field);
-        }
-    }
-
-    protected function writeOneof($number, $value)
-    {
-        $field = $this->desc->getFieldByNumber($number);
-        $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()];
-        $oneof_name = $oneof->getName();
-        $oneof_field = $this->$oneof_name;
-        $oneof_field->setValue($value);
-        $oneof_field->setFieldName($field->getName());
-        $oneof_field->setNumber($number);
-    }
-
-    protected function whichOneof($oneof_name)
-    {
-        $oneof_field = $this->$oneof_name;
-        $number = $oneof_field->getNumber();
-        if ($number == 0) {
-          return "";
-        }
-        $field = $this->desc->getFieldByNumber($number);
-        return $field->getName();
-    }
-
-    /**
-     * @ignore
-     */
-    private function defaultValue($field)
-    {
-        $value = null;
-
-        switch ($field->getType()) {
-            case GPBType::DOUBLE:
-            case GPBType::FLOAT:
-                return 0.0;
-            case GPBType::UINT32:
-            case GPBType::INT32:
-            case GPBType::FIXED32:
-            case GPBType::SFIXED32:
-            case GPBType::SINT32:
-            case GPBType::ENUM:
-                return 0;
-            case GPBType::INT64:
-            case GPBType::UINT64:
-            case GPBType::FIXED64:
-            case GPBType::SFIXED64:
-            case GPBType::SINT64:
-                if (PHP_INT_SIZE === 4) {
-                    return '0';
-                } else {
-                    return 0;
-                }
-            case GPBType::BOOL:
-                return false;
-            case GPBType::STRING:
-            case GPBType::BYTES:
-                return "";
-            case GPBType::GROUP:
-            case GPBType::MESSAGE:
-                return null;
-            default:
-                user_error("Unsupported type.");
-                return false;
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    private function skipField($input, $tag)
-    {
-        $number = GPBWire::getTagFieldNumber($tag);
-        if ($number === 0) {
-            throw new GPBDecodeException("Illegal field number zero.");
-        }
-
-        $start = $input->current();
-        switch (GPBWire::getTagWireType($tag)) {
-            case GPBWireType::VARINT:
-                $uint64 = 0;
-                if (!$input->readVarint64($uint64)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside varint.");
-                }
-                break;
-            case GPBWireType::FIXED64:
-                $uint64 = 0;
-                if (!$input->readLittleEndian64($uint64)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside fixed64.");
-                }
-                break;
-            case GPBWireType::FIXED32:
-                $uint32 = 0;
-                if (!$input->readLittleEndian32($uint32)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside fixed32.");
-                }
-                break;
-            case GPBWireType::LENGTH_DELIMITED:
-                $length = 0;
-                if (!$input->readVarint32($length)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside length.");
-                }
-                $data = NULL;
-                if (!$input->readRaw($length, $data)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside length delimited data.");
-                }
-                break;
-            case GPBWireType::START_GROUP:
-            case GPBWireType::END_GROUP:
-                throw new GPBDecodeException("Unexpected wire type.");
-            default:
-                throw new GPBDecodeException("Unexpected wire type.");
-        }
-        $end = $input->current();
-
-        $bytes = str_repeat(chr(0), CodedOutputStream::MAX_VARINT64_BYTES);
-        $size = CodedOutputStream::writeVarintToArray($tag, $bytes, true);
-        $this->unknown .= substr($bytes, 0, $size) . $input->substr($start, $end);
-    }
-
-    /**
-     * @ignore
-     */
-    private static function parseFieldFromStreamNoTag($input, $field, &$value)
-    {
-        switch ($field->getType()) {
-            case GPBType::DOUBLE:
-                if (!GPBWire::readDouble($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside double field.");
-                }
-                break;
-            case GPBType::FLOAT:
-                if (!GPBWire::readFloat($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside float field.");
-                }
-                break;
-            case GPBType::INT64:
-                if (!GPBWire::readInt64($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside int64 field.");
-                }
-                break;
-            case GPBType::UINT64:
-                if (!GPBWire::readUint64($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside uint64 field.");
-                }
-                break;
-            case GPBType::INT32:
-                if (!GPBWire::readInt32($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside int32 field.");
-                }
-                break;
-            case GPBType::FIXED64:
-                if (!GPBWire::readFixed64($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside fixed64 field.");
-                }
-                break;
-            case GPBType::FIXED32:
-                if (!GPBWire::readFixed32($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside fixed32 field.");
-                }
-                break;
-            case GPBType::BOOL:
-                if (!GPBWire::readBool($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside bool field.");
-                }
-                break;
-            case GPBType::STRING:
-                // TODO(teboring): Add utf-8 check.
-                if (!GPBWire::readString($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside string field.");
-                }
-                break;
-            case GPBType::GROUP:
-                trigger_error("Not implemented.", E_ERROR);
-                break;
-            case GPBType::MESSAGE:
-                if ($field->isMap()) {
-                    $value = new MapEntry($field->getMessageType());
-                } else {
-                    $klass = $field->getMessageType()->getClass();
-                    $value = new $klass;
-                }
-                if (!GPBWire::readMessage($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside message.");
-                }
-                break;
-            case GPBType::BYTES:
-                if (!GPBWire::readString($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside bytes field.");
-                }
-                break;
-            case GPBType::UINT32:
-                if (!GPBWire::readUint32($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside uint32 field.");
-                }
-                break;
-            case GPBType::ENUM:
-                // TODO(teboring): Check unknown enum value.
-                if (!GPBWire::readInt32($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside enum field.");
-                }
-                break;
-            case GPBType::SFIXED32:
-                if (!GPBWire::readSfixed32($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside sfixed32 field.");
-                }
-                break;
-            case GPBType::SFIXED64:
-                if (!GPBWire::readSfixed64($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside sfixed64 field.");
-                }
-                break;
-            case GPBType::SINT32:
-                if (!GPBWire::readSint32($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside sint32 field.");
-                }
-                break;
-            case GPBType::SINT64:
-                if (!GPBWire::readSint64($input, $value)) {
-                    throw new GPBDecodeException(
-                        "Unexpected EOF inside sint64 field.");
-                }
-                break;
-            default:
-                user_error("Unsupported type.");
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * @ignore
-     */
-    private function parseFieldFromStream($tag, $input, $field)
-    {
-        $value = null;
-
-        if (is_null($field)) {
-            $value_format = GPBWire::UNKNOWN;
-        } elseif (GPBWire::getTagWireType($tag) ===
-            GPBWire::getWireType($field->getType())) {
-            $value_format = GPBWire::NORMAL_FORMAT;
-        } elseif ($field->isPackable() &&
-            GPBWire::getTagWireType($tag) ===
-            GPBWire::WIRETYPE_LENGTH_DELIMITED) {
-            $value_format = GPBWire::PACKED_FORMAT;
-        } else {
-            // the wire type doesn't match. Put it in our unknown field set.
-            $value_format = GPBWire::UNKNOWN;
-        }
-
-        if ($value_format === GPBWire::UNKNOWN) {
-            $this->skipField($input, $tag);
-            return;
-        } elseif ($value_format === GPBWire::NORMAL_FORMAT) {
-            self::parseFieldFromStreamNoTag($input, $field, $value);
-        } elseif ($value_format === GPBWire::PACKED_FORMAT) {
-            $length = 0;
-            if (!GPBWire::readInt32($input, $length)) {
-                throw new GPBDecodeException(
-                    "Unexpected EOF inside packed length.");
-            }
-            $limit = $input->pushLimit($length);
-            $getter = $field->getGetter();
-            while ($input->bytesUntilLimit() > 0) {
-                self::parseFieldFromStreamNoTag($input, $field, $value);
-                $this->appendHelper($field, $value);
-            }
-            $input->popLimit($limit);
-            return;
-        } else {
-            return;
-        }
-
-        if ($field->isMap()) {
-            $this->kvUpdateHelper($field, $value->getKey(), $value->getValue());
-        } else if ($field->isRepeated()) {
-            $this->appendHelper($field, $value);
-        } else {
-            $setter = $field->getSetter();
-            $this->$setter($value);
-        }
-    }
-
-    /**
-     * Clear all containing fields.
-     * @return null.
-     */
-    public function clear()
-    {
-        $this->unknown = "";
-        foreach ($this->desc->getField() as $field) {
-            $setter = $field->getSetter();
-            if ($field->isMap()) {
-                $message_type = $field->getMessageType();
-                $key_field = $message_type->getFieldByNumber(1);
-                $value_field = $message_type->getFieldByNumber(2);
-                switch ($value_field->getType()) {
-                    case GPBType::MESSAGE:
-                    case GPBType::GROUP:
-                        $map_field = new MapField(
-                            $key_field->getType(),
-                            $value_field->getType(),
-                            $value_field->getMessageType()->getClass());
-                        $this->$setter($map_field);
-                        break;
-                    case GPBType::ENUM:
-                        $map_field = new MapField(
-                            $key_field->getType(),
-                            $value_field->getType(),
-                            $value_field->getEnumType()->getClass());
-                        $this->$setter($map_field);
-                        break;
-                    default:
-                        $map_field = new MapField(
-                            $key_field->getType(),
-                            $value_field->getType());
-                        $this->$setter($map_field);
-                        break;
-                }
-            } else if ($field->getLabel() === GPBLabel::REPEATED) {
-                switch ($field->getType()) {
-                    case GPBType::MESSAGE:
-                    case GPBType::GROUP:
-                        $repeated_field = new RepeatedField(
-                            $field->getType(),
-                            $field->getMessageType()->getClass());
-                        $this->$setter($repeated_field);
-                        break;
-                    case GPBType::ENUM:
-                        $repeated_field = new RepeatedField(
-                            $field->getType(),
-                            $field->getEnumType()->getClass());
-                        $this->$setter($repeated_field);
-                        break;
-                    default:
-                        $repeated_field = new RepeatedField($field->getType());
-                        $this->$setter($repeated_field);
-                        break;
-                }
-            } else if ($field->getOneofIndex() !== -1) {
-                $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()];
-                $oneof_name = $oneof->getName();
-                $this->$oneof_name = new OneofField($oneof);
-            } else if ($field->getLabel() === GPBLabel::OPTIONAL) {
-                switch ($field->getType()) {
-                    case GPBType::DOUBLE   :
-                    case GPBType::FLOAT    :
-                        $this->$setter(0.0);
-                        break;
-                    case GPBType::INT32    :
-                    case GPBType::FIXED32  :
-                    case GPBType::UINT32   :
-                    case GPBType::SFIXED32 :
-                    case GPBType::SINT32   :
-                    case GPBType::ENUM     :
-                        $this->$setter(0);
-                        break;
-                    case GPBType::BOOL     :
-                        $this->$setter(false);
-                        break;
-                    case GPBType::STRING   :
-                    case GPBType::BYTES    :
-                        $this->$setter("");
-                        break;
-                    case GPBType::GROUP    :
-                    case GPBType::MESSAGE  :
-                        $null = null;
-                        $this->$setter($null);
-                        break;
-                }
-                if (PHP_INT_SIZE == 4) {
-                    switch ($field->getType()) {
-                        case GPBType::INT64:
-                        case GPBType::UINT64:
-                        case GPBType::FIXED64:
-                        case GPBType::SFIXED64:
-                        case GPBType::SINT64:
-                            $this->$setter("0");
-                    }
-                } else {
-                    switch ($field->getType()) {
-                        case GPBType::INT64:
-                        case GPBType::UINT64:
-                        case GPBType::FIXED64:
-                        case GPBType::SFIXED64:
-                        case GPBType::SINT64:
-                            $this->$setter(0);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Clear all unknown fields previously parsed.
-     * @return null.
-     */
-    public function discardUnknownFields()
-    {
-        $this->unknown = "";
-        foreach ($this->desc->getField() as $field) {
-            if ($field->getType() != GPBType::MESSAGE) {
-                continue;
-            }
-            if ($field->isMap()) {
-                $value_field = $field->getMessageType()->getFieldByNumber(2);
-                if ($value_field->getType() != GPBType::MESSAGE) {
-                    continue;
-                }
-                $getter = $field->getGetter();
-                $map = $this->$getter();
-                foreach ($map as $key => $value) {
-                    $value->discardUnknownFields();
-                }
-            } else if ($field->getLabel() === GPBLabel::REPEATED) {
-                $getter = $field->getGetter();
-                $arr = $this->$getter();
-                foreach ($arr as $sub) {
-                    $sub->discardUnknownFields();
-                }
-            } else if ($field->getLabel() === GPBLabel::OPTIONAL) {
-                $getter = $field->getGetter();
-                $sub = $this->$getter();
-                if (!is_null($sub)) {
-                    $sub->discardUnknownFields();
-                }
-            }
-        }
-    }
-
-    /**
-     * Merges the contents of the specified message into current message.
-     *
-     * This method merges the contents of the specified message into the
-     * current message. Singular fields that are set in the specified message
-     * overwrite the corresponding fields in the current message.  Repeated
-     * fields are appended. Map fields key-value pairs are overritten.
-     * Singular/Oneof sub-messages are recursively merged. All overritten
-     * sub-messages are deep-copied.
-     *
-     * @param object $msg Protobuf message to be merged from.
-     * @return null.
-     */
-    public function mergeFrom($msg)
-    {
-      if (get_class($this) !== get_class($msg)) {
-          user_error("Cannot merge messages with different class.");
-          return;
-      }
-
-      foreach ($this->desc->getField() as $field) {
-          $setter = $field->getSetter();
-          $getter = $field->getGetter();
-          if ($field->isMap()) {
-              if (count($msg->$getter()) != 0) {
-                  $value_field = $field->getMessageType()->getFieldByNumber(2);
-                  foreach ($msg->$getter() as $key => $value) {
-                      if ($value_field->getType() == GPBType::MESSAGE) {
-                          $klass = $value_field->getMessageType()->getClass();
-                          $copy = new $klass;
-                          $copy->mergeFrom($value);
-
-                          $this->kvUpdateHelper($field, $key, $copy);
-                      } else {
-                          $this->kvUpdateHelper($field, $key, $value);
-                      }
-                  }
-              }
-          } else if ($field->getLabel() === GPBLabel::REPEATED) {
-              if (count($msg->$getter()) != 0) {
-                  foreach ($msg->$getter() as $tmp) {
-                      if ($field->getType() == GPBType::MESSAGE) {
-                          $klass = $field->getMessageType()->getClass();
-                          $copy = new $klass;
-                          $copy->mergeFrom($tmp);
-                          $this->appendHelper($field, $copy);
-                      } else {
-                          $this->appendHelper($field, $tmp);
-                      }
-                  }
-              }
-          } else if ($field->getLabel() === GPBLabel::OPTIONAL) {
-              if($msg->$getter() !== $this->defaultValue($field)) {
-                  $tmp = $msg->$getter();
-                  if ($field->getType() == GPBType::MESSAGE) {
-                      if (is_null($this->$getter())) {
-                          $klass = $field->getMessageType()->getClass();
-                          $new_msg = new $klass;
-                          $this->$setter($new_msg);
-                      }
-                      $this->$getter()->mergeFrom($tmp);
-                  } else {
-                      $this->$setter($tmp);
-                  }
-              }
-          }
-      }
-    }
-
-    /**
-     * Parses a protocol buffer contained in a string.
-     *
-     * This function takes a string in the (non-human-readable) binary wire
-     * format, matching the encoding output by serializeToString().
-     * See mergeFrom() for merging behavior, if the field is already set in the
-     * specified message.
-     *
-     * @param string $data Binary protobuf data.
-     * @return null.
-     * @throws Exception Invalid data.
-     */
-    public function mergeFromString($data)
-    {
-        $input = new CodedInputStream($data);
-        $this->parseFromStream($input);
-    }
-
-    /**
-     * Parses a json string to protobuf message.
-     *
-     * This function takes a string in the json wire format, matching the
-     * encoding output by serializeToJsonString().
-     * See mergeFrom() for merging behavior, if the field is already set in the
-     * specified message.
-     *
-     * @param string $data Json protobuf data.
-     * @return null.
-     * @throws Exception Invalid data.
-     */
-    public function mergeFromJsonString($data)
-    {
-        $input = new RawInputStream($data);
-        $this->parseFromJsonStream($input);
-    }
-
-    /**
-     * @ignore
-     */
-    public function parseFromStream($input)
-    {
-        while (true) {
-            $tag = $input->readTag();
-            // End of input.  This is a valid place to end, so return true.
-            if ($tag === 0) {
-                return true;
-            }
-
-            $number = GPBWire::getTagFieldNumber($tag);
-            $field = $this->desc->getFieldByNumber($number);
-
-            $this->parseFieldFromStream($tag, $input, $field);
-        }
-    }
-
-    private function convertJsonValueToProtoValue(
-        $value,
-        $field,
-        $is_map_key = false)
-    {
-        switch ($field->getType()) {
-            case GPBType::MESSAGE:
-                $klass = $field->getMessageType()->getClass();
-                $submsg = new $klass;
-
-                if (is_a($submsg, "Google\Protobuf\Duration")) {
-                    if (is_null($value)) {
-                        return $this->defaultValue($field);
-                    } else if (!is_string($value)) {
-                        throw new GPBDecodeException("Expect string.");
-                    }
-                    return GPBUtil::parseDuration($value);
-                } else if ($field->isTimestamp()) {
-                    if (is_null($value)) {
-                        return $this->defaultValue($field);
-                    } else if (!is_string($value)) {
-                        throw new GPBDecodeException("Expect string.");
-                    }
-                    try {
-                        $timestamp = GPBUtil::parseTimestamp($value);
-                    } catch (\Exception $e) {
-                        throw new GPBDecodeException("Invalid RFC 3339 timestamp: ".$e->getMessage());
-                    }
-
-                    $submsg->setSeconds($timestamp->getSeconds());
-                    $submsg->setNanos($timestamp->getNanos());
-                } else if (is_a($submsg, "Google\Protobuf\FieldMask")) {
-                    if (is_null($value)) {
-                        return $this->defaultValue($field);
-                    }
-                    try {
-                        return GPBUtil::parseFieldMask($value);
-                    } catch (\Exception $e) {
-                        throw new GPBDecodeException("Invalid FieldMask: ".$e->getMessage());
-                    }
-                } else {
-                    if (is_null($value) &&
-                        !is_a($submsg, "Google\Protobuf\Value")) {
-                        return $this->defaultValue($field);
-                    }
-                    if (GPBUtil::hasSpecialJsonMapping($submsg)) {
-                    } elseif (!is_object($value) && !is_array($value)) {
-                        throw new GPBDecodeException("Expect message.");
-                    }
-                    $submsg->mergeFromJsonArray($value);
-                }
-                return $submsg;
-            case GPBType::ENUM:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                } else if (is_integer($value)) {
-                    return $value;
-                } else {
-                    $enum_value =
-                        $field->getEnumType()->getValueByName($value);
-                }
-                if (!is_null($enum_value)) {
-                    return $enum_value->getNumber();
-                }
-            case GPBType::STRING:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if (!is_string($value)) {
-                    throw new GPBDecodeException("Expect string");
-                }
-                return $value;
-            case GPBType::BYTES:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if (!is_string($value)) {
-                    throw new GPBDecodeException("Expect string");
-                }
-                $proto_value = base64_decode($value, true);
-                if ($proto_value === false) {
-                    throw new GPBDecodeException(
-                        "Invalid base64 characters");
-                }
-                return $proto_value;
-            case GPBType::BOOL:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if ($is_map_key) {
-                    if ($value === "true") {
-                        return true;
-                    }
-                    if ($value === "false") {
-                        return false;
-                    }
-                    throw new GPBDecodeException(
-                        "Bool field only accept bool value");
-                }
-                if (!is_bool($value)) {
-                    throw new GPBDecodeException(
-                        "Bool field only accept bool value");
-                }
-                return $value;
-            case GPBType::FLOAT:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if ($value === "Infinity") {
-                    return INF;
-                }
-                if ($value === "-Infinity") {
-                    return -INF;
-                }
-                if ($value === "NaN") {
-                    return NAN;
-                }
-                return $value;
-            case GPBType::DOUBLE:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if ($value === "Infinity") {
-                    return INF;
-                }
-                if ($value === "-Infinity") {
-                    return -INF;
-                }
-                if ($value === "NaN") {
-                    return NAN;
-                }
-                return $value;
-            case GPBType::INT32:
-            case GPBType::SINT32:
-            case GPBType::SFIXED32:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if (!is_numeric($value)) {
-                   throw new GPBDecodeException(
-                       "Invalid data type for int32 field");
-                }
-                if (bccomp($value, "2147483647") > 0) {
-                   throw new GPBDecodeException(
-                       "Int32 too large");
-                }
-                if (bccomp($value, "-2147483648") < 0) {
-                   throw new GPBDecodeException(
-                       "Int32 too small");
-                }
-                return $value;
-            case GPBType::UINT32:
-            case GPBType::FIXED32:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if (!is_numeric($value)) {
-                   throw new GPBDecodeException(
-                       "Invalid data type for uint32 field");
-                }
-                if (bccomp($value, 4294967295) > 0) {
-                    throw new GPBDecodeException(
-                        "Uint32 too large");
-                }
-                return $value;
-            case GPBType::INT64:
-            case GPBType::SINT64:
-            case GPBType::SFIXED64:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if (!is_numeric($value)) {
-                   throw new GPBDecodeException(
-                       "Invalid data type for int64 field");
-                }
-                if (bccomp($value, "9223372036854775807") > 0) {
-                    throw new GPBDecodeException(
-                        "Int64 too large");
-                }
-                if (bccomp($value, "-9223372036854775808") < 0) {
-                    throw new GPBDecodeException(
-                        "Int64 too small");
-                }
-                return $value;
-            case GPBType::UINT64:
-            case GPBType::FIXED64:
-                if (is_null($value)) {
-                    return $this->defaultValue($field);
-                }
-                if (!is_numeric($value)) {
-                   throw new GPBDecodeException(
-                       "Invalid data type for int64 field");
-                }
-                if (bccomp($value, "18446744073709551615") > 0) {
-                    throw new GPBDecodeException(
-                        "Uint64 too large");
-                }
-                if (bccomp($value, "9223372036854775807") > 0) {
-                    $value = bcsub($value, "18446744073709551616");
-                }
-                return $value;
-            default:
-                return $value;
-        }
-    }
-
-    protected function mergeFromJsonArray($array)
-    {
-        if (is_a($this, "Google\Protobuf\Any")) {
-            $this->clear();
-            $this->setTypeUrl($array["@type"]);
-            $msg = $this->unpack();
-            if (GPBUtil::hasSpecialJsonMapping($msg)) {
-                $msg->mergeFromJsonArray($array["value"]);
-            } else {
-                unset($array["@type"]);
-                $msg->mergeFromJsonArray($array);
-            }
-            $this->setValue($msg->serializeToString());
-            return;
-        }
-        if (is_a($this, "Google\Protobuf\DoubleValue") ||
-            is_a($this, "Google\Protobuf\FloatValue")  ||
-            is_a($this, "Google\Protobuf\Int64Value")  ||
-            is_a($this, "Google\Protobuf\UInt64Value") ||
-            is_a($this, "Google\Protobuf\Int32Value")  ||
-            is_a($this, "Google\Protobuf\UInt32Value") ||
-            is_a($this, "Google\Protobuf\BoolValue")   ||
-            is_a($this, "Google\Protobuf\StringValue")) {
-            $this->setValue($array);
-            return;
-        }
-        if (is_a($this, "Google\Protobuf\BytesValue")) {
-            $this->setValue(base64_decode($array));
-            return;
-        }
-        if (is_a($this, "Google\Protobuf\Duration")) {
-            $this->mergeFrom(GPBUtil::parseDuration($array));
-            return;
-        }
-        if (is_a($this, "Google\Protobuf\FieldMask")) {
-            $this->mergeFrom(GPBUtil::parseFieldMask($array));
-            return;
-        }
-        if (is_a($this, "Google\Protobuf\Timestamp")) {
-            $this->mergeFrom(GPBUtil::parseTimestamp($array));
-            return;
-        }
-        if (is_a($this, "Google\Protobuf\Struct")) {
-            $fields = $this->getFields();
-            foreach($array as $key => $value) {
-                $v = new Value();
-                $v->mergeFromJsonArray($value);
-                $fields[$key] = $v;
-            }
-        }
-        if (is_a($this, "Google\Protobuf\Value")) {
-            if (is_bool($array)) {
-                $this->setBoolValue($array);
-            } elseif (is_string($array)) {
-                $this->setStringValue($array);
-            } elseif (is_null($array)) {
-                $this->setNullValue(0);
-            } elseif (is_double($array) || is_integer($array)) {
-                $this->setNumberValue($array);
-            } elseif (is_array($array)) {
-                if (array_values($array) !== $array) {
-                    // Associative array
-                    $struct_value = $this->getStructValue();
-                    if (is_null($struct_value)) {
-                        $struct_value = new Struct();
-                        $this->setStructValue($struct_value);
-                    }
-                    foreach ($array as $key => $v) {
-                        $value = new Value();
-                        $value->mergeFromJsonArray($v);
-                        $values = $struct_value->getFields();
-                        $values[$key]= $value;
-                    }
-                } else {
-                    // Array
-                    $list_value = $this->getListValue();
-                    if (is_null($list_value)) {
-                        $list_value = new ListValue();
-                        $this->setListValue($list_value);
-                    }
-                    foreach ($array as $v) {
-                        $value = new Value();
-                        $value->mergeFromJsonArray($v);
-                        $values = $list_value->getValues();
-                        $values[]= $value;
-                    }
-                }
-            } else {
-                throw new GPBDecodeException("Invalid type for Value.");
-            }
-            return;
-        }
-        foreach ($array as $key => $value) {
-            $field = $this->desc->getFieldByJsonName($key);
-            if (is_null($field)) {
-                $field = $this->desc->getFieldByName($key);
-                if (is_null($field)) {
-                    continue;
-                }
-            }
-            $setter = $field->getSetter();
-            if ($field->isMap()) {
-                if (is_null($value)) {
-                    continue;
-                }
-                $key_field = $field->getMessageType()->getFieldByNumber(1);
-                $value_field = $field->getMessageType()->getFieldByNumber(2);
-                foreach ($value as $tmp_key => $tmp_value) {
-                    if (is_null($tmp_value)) {
-                        throw new \Exception(
-                            "Map value field element cannot be null.");
-                    }
-                    $proto_key =
-                        $this->convertJsonValueToProtoValue(
-                            $tmp_key,
-                            $key_field,
-                            true);
-                    $proto_value =
-                        $this->convertJsonValueToProtoValue(
-                            $tmp_value,
-                            $value_field);
-                    self::kvUpdateHelper($field, $proto_key, $proto_value);
-                }
-            } else if ($field->isRepeated()) {
-                if (is_null($value)) {
-                    continue;
-                }
-                foreach ($value as $tmp) {
-                    if (is_null($tmp)) {
-                        throw new \Exception(
-                            "Repeated field elements cannot be null.");
-                    }
-                    $proto_value =
-                        $this->convertJsonValueToProtoValue($tmp, $field);
-                    self::appendHelper($field, $proto_value);
-                }
-            } else {
-                $setter = $field->getSetter();
-                $proto_value =
-                    $this->convertJsonValueToProtoValue($value, $field);
-                if ($field->getType() === GPBType::MESSAGE) {
-                    if (is_null($proto_value)) {
-                        continue;
-                    }
-                    $getter = $field->getGetter();
-                    $submsg = $this->$getter();
-                    if (!is_null($submsg)) {
-                        $submsg->mergeFrom($proto_value);
-                        continue;
-                    }
-                }
-                $this->$setter($proto_value);
-            }
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    public function parseFromJsonStream($input)
-    {
-        $array = json_decode($input->getData(), JSON_BIGINT_AS_STRING);
-        if (is_null($array)) {
-            throw new GPBDecodeException(
-                "Cannot decode json string.");
-        }
-        try {
-            $this->mergeFromJsonArray($array);
-        } catch (\Exception $e) {
-            throw new GPBDecodeException($e->getMessage());
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    private function serializeSingularFieldToStream($field, &$output)
-    {
-        if (!$this->existField($field)) {
-            return true;
-        }
-        $getter = $field->getGetter();
-        $value = $this->$getter();
-        if (!GPBWire::serializeFieldToStream($value, $field, true, $output)) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * @ignore
-     */
-    private function serializeRepeatedFieldToStream($field, &$output)
-    {
-        $getter = $field->getGetter();
-        $values = $this->$getter();
-        $count = count($values);
-        if ($count === 0) {
-            return true;
-        }
-
-        $packed = $field->getPacked();
-        if ($packed) {
-            if (!GPBWire::writeTag(
-                $output,
-                GPBWire::makeTag($field->getNumber(), GPBType::STRING))) {
-                return false;
-            }
-            $size = 0;
-            foreach ($values as $value) {
-                $size += $this->fieldDataOnlyByteSize($field, $value);
-            }
-            if (!$output->writeVarint32($size, true)) {
-                return false;
-            }
-        }
-
-        foreach ($values as $value) {
-            if (!GPBWire::serializeFieldToStream(
-                $value,
-                $field,
-                !$packed,
-                $output)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * @ignore
-     */
-    private function serializeMapFieldToStream($field, $output)
-    {
-        $getter = $field->getGetter();
-        $values = $this->$getter();
-        $count = count($values);
-        if ($count === 0) {
-            return true;
-        }
-
-        foreach ($values as $key => $value) {
-            $map_entry = new MapEntry($field->getMessageType());
-            $map_entry->setKey($key);
-            $map_entry->setValue($value);
-            if (!GPBWire::serializeFieldToStream(
-                $map_entry,
-                $field,
-                true,
-                $output)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * @ignore
-     */
-    private function serializeFieldToStream(&$output, $field)
-    {
-        if ($field->isMap()) {
-            return $this->serializeMapFieldToStream($field, $output);
-        } elseif ($field->isRepeated()) {
-            return $this->serializeRepeatedFieldToStream($field, $output);
-        } else {
-            return $this->serializeSingularFieldToStream($field, $output);
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    private function serializeFieldToJsonStream(&$output, $field)
-    {
-        $getter = $field->getGetter();
-        $values = $this->$getter();
-        return GPBJsonWire::serializeFieldToStream(
-            $values, $field, $output, !GPBUtil::hasSpecialJsonMapping($this));
-    }
-
-    /**
-     * @ignore
-     */
-    public function serializeToStream(&$output)
-    {
-        $fields = $this->desc->getField();
-        foreach ($fields as $field) {
-            if (!$this->serializeFieldToStream($output, $field)) {
-                return false;
-            }
-        }
-        $output->writeRaw($this->unknown, strlen($this->unknown));
-        return true;
-    }
-
-    /**
-     * @ignore
-     */
-    public function serializeToJsonStream(&$output)
-    {
-        if (is_a($this, 'Google\Protobuf\Any')) {
-            $output->writeRaw("{", 1);
-            $type_field = $this->desc->getFieldByNumber(1);
-            $value_msg = $this->unpack();
-
-            // Serialize type url.
-            $output->writeRaw("\"@type\":", 8);
-            $output->writeRaw("\"", 1);
-            $output->writeRaw($this->getTypeUrl(), strlen($this->getTypeUrl()));
-            $output->writeRaw("\"", 1);
-
-            // Serialize value
-            if (GPBUtil::hasSpecialJsonMapping($value_msg)) {
-                $output->writeRaw(",\"value\":", 9);
-                $value_msg->serializeToJsonStream($output);
-            } else {
-                $value_fields = $value_msg->desc->getField();
-                foreach ($value_fields as $field) {
-                    if ($value_msg->existField($field)) {
-                        $output->writeRaw(",", 1);
-                        if (!$value_msg->serializeFieldToJsonStream($output, $field)) {
-                            return false;
-                        }
-                    }
-                }
-            }
-
-            $output->writeRaw("}", 1);
-        } elseif (is_a($this, 'Google\Protobuf\FieldMask')) {
-            $field_mask = GPBUtil::formatFieldMask($this);
-            $output->writeRaw("\"", 1);
-            $output->writeRaw($field_mask, strlen($field_mask));
-            $output->writeRaw("\"", 1);
-        } elseif (is_a($this, 'Google\Protobuf\Duration')) {
-            $duration = GPBUtil::formatDuration($this) . "s";
-            $output->writeRaw("\"", 1);
-            $output->writeRaw($duration, strlen($duration));
-            $output->writeRaw("\"", 1);
-        } elseif (get_class($this) === 'Google\Protobuf\Timestamp') {
-            $timestamp = GPBUtil::formatTimestamp($this);
-            $timestamp = json_encode($timestamp);
-            $output->writeRaw($timestamp, strlen($timestamp));
-        } else {
-            if (!GPBUtil::hasSpecialJsonMapping($this)) {
-                $output->writeRaw("{", 1);
-            }
-            $fields = $this->desc->getField();
-            $first = true;
-            foreach ($fields as $field) {
-                if ($this->existField($field) ||
-                    GPBUtil::hasJsonValue($this)) {
-                    if ($first) {
-                        $first = false;
-                    } else {
-                        $output->writeRaw(",", 1);
-                    }
-                    if (!$this->serializeFieldToJsonStream($output, $field)) {
-                        return false;
-                    }
-                }
-            }
-            if (!GPBUtil::hasSpecialJsonMapping($this)) {
-                $output->writeRaw("}", 1);
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Serialize the message to string.
-     * @return string Serialized binary protobuf data.
-     */
-    public function serializeToString()
-    {
-        $output = new CodedOutputStream($this->byteSize());
-        $this->serializeToStream($output);
-        return $output->getData();
-    }
-
-    /**
-     * Serialize the message to json string.
-     * @return string Serialized json protobuf data.
-     */
-    public function serializeToJsonString()
-    {
-        $output = new CodedOutputStream($this->jsonByteSize());
-        $this->serializeToJsonStream($output);
-        return $output->getData();
-    }
-
-    /**
-     * @ignore
-     */
-    private function existField($field)
-    {
-        $oneof_index = $field->getOneofIndex();
-        if ($oneof_index !== -1) {
-            $oneof = $this->desc->getOneofDecl()[$oneof_index];
-            $oneof_name = $oneof->getName();
-            return $this->$oneof_name->getNumber() === $field->getNumber();
-        }
-
-        $getter = $field->getGetter();
-        $values = $this->$getter();
-        if ($field->isMap()) {
-            return count($values) !== 0;
-        } elseif ($field->isRepeated()) {
-            return count($values) !== 0;
-        } else {
-            return $values !== $this->defaultValue($field);
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    private function repeatedFieldDataOnlyByteSize($field)
-    {
-        $size = 0;
-
-        $getter = $field->getGetter();
-        $values = $this->$getter();
-        $count = count($values);
-        if ($count !== 0) {
-            $size += $count * GPBWire::tagSize($field);
-            foreach ($values as $value) {
-                $size += $this->singularFieldDataOnlyByteSize($field);
-            }
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    private function fieldDataOnlyByteSize($field, $value)
-    {
-        $size = 0;
-
-        switch ($field->getType()) {
-            case GPBType::BOOL:
-                $size += 1;
-                break;
-            case GPBType::FLOAT:
-            case GPBType::FIXED32:
-            case GPBType::SFIXED32:
-                $size += 4;
-                break;
-            case GPBType::DOUBLE:
-            case GPBType::FIXED64:
-            case GPBType::SFIXED64:
-                $size += 8;
-                break;
-            case GPBType::INT32:
-            case GPBType::ENUM:
-                $size += GPBWire::varint32Size($value, true);
-                break;
-            case GPBType::UINT32:
-                $size += GPBWire::varint32Size($value);
-                break;
-            case GPBType::UINT64:
-            case GPBType::INT64:
-                $size += GPBWire::varint64Size($value);
-                break;
-            case GPBType::SINT32:
-                $size += GPBWire::sint32Size($value);
-                break;
-            case GPBType::SINT64:
-                $size += GPBWire::sint64Size($value);
-                break;
-            case GPBType::STRING:
-            case GPBType::BYTES:
-                $size += strlen($value);
-                $size += GPBWire::varint32Size($size);
-                break;
-            case GPBType::MESSAGE:
-                $size += $value->byteSize();
-                $size += GPBWire::varint32Size($size);
-                break;
-            case GPBType::GROUP:
-                // TODO(teboring): Add support.
-                user_error("Unsupported type.");
-                break;
-            default:
-                user_error("Unsupported type.");
-                return 0;
-        }
-
-        return $size;
-    }
-
-    /**
-     * @ignore
-     */
-    private function fieldDataOnlyJsonByteSize($field, $value)
-    {
-        $size = 0;
-
-        switch ($field->getType()) {
-            case GPBType::SFIXED32:
-            case GPBType::SINT32:
-            case GPBType::INT32:
-                $size += strlen(strval($value));
-                break;
-            case GPBType::FIXED32:
-            case GPBType::UINT32:
-                if ($value < 0) {
-                    $value = bcadd($value, "4294967296");
-                }
-                $size += strlen(strval($value));
-                break;
-            case GPBType::FIXED64:
-            case GPBType::UINT64:
-                if ($value < 0) {
-                    $value = bcadd($value, "18446744073709551616");
-                }
-                // Intentional fall through.
-            case GPBType::SFIXED64:
-            case GPBType::INT64:
-            case GPBType::SINT64:
-                $size += 2;  // size for ""
-                $size += strlen(strval($value));
-                break;
-            case GPBType::FLOAT:
-                if (is_nan($value)) {
-                    $size += strlen("NaN") + 2;
-                } elseif ($value === INF) {
-                    $size += strlen("Infinity") + 2;
-                } elseif ($value === -INF) {
-                    $size += strlen("-Infinity") + 2;
-                } else {
-                    $size += strlen(sprintf("%.8g", $value));
-                }
-                break;
-            case GPBType::DOUBLE:
-                if (is_nan($value)) {
-                    $size += strlen("NaN") + 2;
-                } elseif ($value === INF) {
-                    $size += strlen("Infinity") + 2;
-                } elseif ($value === -INF) {
-                    $size += strlen("-Infinity") + 2;
-                } else {
-                    $size += strlen(sprintf("%.17g", $value));
-                }
-                break;
-            case GPBType::ENUM:
-                $enum_desc = $field->getEnumType();
-                if ($enum_desc->getClass() === "Google\Protobuf\NullValue") {
-                    $size += 4;
-                    break;
-                }
-                $enum_value_desc = $enum_desc->getValueByNumber($value);
-                if (!is_null($enum_value_desc)) {
-                    $size += 2;  // size for ""
-                    $size += strlen($enum_value_desc->getName());
-                } else {
-                    $str_value = strval($value);
-                    $size += strlen($str_value);
-                }
-                break;
-            case GPBType::BOOL:
-                if ($value) {
-                    $size += 4;
-                } else {
-                    $size += 5;
-                }
-                break;
-            case GPBType::STRING:
-                $value = json_encode($value);
-                $size += strlen($value);
-                break;
-            case GPBType::BYTES:
-                # if (is_a($this, "Google\Protobuf\BytesValue")) {
-                #     $size += strlen(json_encode($value));
-                # } else {
-                #     $size += strlen(base64_encode($value));
-                #     $size += 2;  // size for \"\"
-                # }
-                $size += strlen(base64_encode($value));
-                $size += 2;  // size for \"\"
-                break;
-            case GPBType::MESSAGE:
-                $size += $value->jsonByteSize();
-                break;
-#             case GPBType::GROUP:
-#                 // TODO(teboring): Add support.
-#                 user_error("Unsupported type.");
-#                 break;
-            default:
-                user_error("Unsupported type " . $field->getType());
-                return 0;
-        }
-
-        return $size;
-    }
-
-    /**
-     * @ignore
-     */
-    private function fieldByteSize($field)
-    {
-        $size = 0;
-        if ($field->isMap()) {
-            $getter = $field->getGetter();
-            $values = $this->$getter();
-            $count = count($values);
-            if ($count !== 0) {
-                $size += $count * GPBWire::tagSize($field);
-                $message_type = $field->getMessageType();
-                $key_field = $message_type->getFieldByNumber(1);
-                $value_field = $message_type->getFieldByNumber(2);
-                foreach ($values as $key => $value) {
-                    $data_size = 0;
-                    if ($key != $this->defaultValue($key_field)) {
-                        $data_size += $this->fieldDataOnlyByteSize(
-                            $key_field,
-                            $key);
-                        $data_size += GPBWire::tagSize($key_field);
-                    }
-                    if ($value != $this->defaultValue($value_field)) {
-                        $data_size += $this->fieldDataOnlyByteSize(
-                            $value_field,
-                            $value);
-                        $data_size += GPBWire::tagSize($value_field);
-                    }
-                    $size += GPBWire::varint32Size($data_size) + $data_size;
-                }
-            }
-        } elseif ($field->isRepeated()) {
-            $getter = $field->getGetter();
-            $values = $this->$getter();
-            $count = count($values);
-            if ($count !== 0) {
-                if ($field->getPacked()) {
-                    $data_size = 0;
-                    foreach ($values as $value) {
-                        $data_size += $this->fieldDataOnlyByteSize($field, $value);
-                    }
-                    $size += GPBWire::tagSize($field);
-                    $size += GPBWire::varint32Size($data_size);
-                    $size += $data_size;
-                } else {
-                    $size += $count * GPBWire::tagSize($field);
-                    foreach ($values as $value) {
-                        $size += $this->fieldDataOnlyByteSize($field, $value);
-                    }
-                }
-            }
-        } elseif ($this->existField($field)) {
-            $size += GPBWire::tagSize($field);
-            $getter = $field->getGetter();
-            $value = $this->$getter();
-            $size += $this->fieldDataOnlyByteSize($field, $value);
-        }
-        return $size;
-    }
-
-    /**
-     * @ignore
-     */
-    private function fieldJsonByteSize($field)
-    {
-        $size = 0;
-
-        if ($field->isMap()) {
-            $getter = $field->getGetter();
-            $values = $this->$getter();
-            $count = count($values);
-            if ($count !== 0) {
-                if (!GPBUtil::hasSpecialJsonMapping($this)) {
-                    $size += 3;                              // size for "\"\":".
-                    $size += strlen($field->getJsonName());  // size for field name
-                }
-                $size += 2;  // size for "{}".
-                $size += $count - 1;                     // size for commas
-                $getter = $field->getGetter();
-                $map_entry = $field->getMessageType();
-                $key_field = $map_entry->getFieldByNumber(1);
-                $value_field = $map_entry->getFieldByNumber(2);
-                switch ($key_field->getType()) {
-                case GPBType::STRING:
-                case GPBType::SFIXED64:
-                case GPBType::INT64:
-                case GPBType::SINT64:
-                case GPBType::FIXED64:
-                case GPBType::UINT64:
-                    $additional_quote = false;
-                    break;
-                default:
-                    $additional_quote = true;
-                }
-                foreach ($values as $key => $value) {
-                    if ($additional_quote) {
-                        $size += 2;  // size for ""
-                    }
-                    $size += $this->fieldDataOnlyJsonByteSize($key_field, $key);
-                    $size += $this->fieldDataOnlyJsonByteSize($value_field, $value);
-                    $size += 1;  // size for :
-                }
-            }
-        } elseif ($field->isRepeated()) {
-            $getter = $field->getGetter();
-            $values = $this->$getter();
-            $count = count($values);
-            if ($count !== 0) {
-                if (!GPBUtil::hasSpecialJsonMapping($this)) {
-                    $size += 3;                              // size for "\"\":".
-                    $size += strlen($field->getJsonName());  // size for field name
-                }
-                $size += 2;  // size for "[]".
-                $size += $count - 1;                     // size for commas
-                $getter = $field->getGetter();
-                foreach ($values as $value) {
-                    $size += $this->fieldDataOnlyJsonByteSize($field, $value);
-                }
-            }
-        } elseif ($this->existField($field) || GPBUtil::hasJsonValue($this)) {
-            if (!GPBUtil::hasSpecialJsonMapping($this)) {
-                $size += 3;                              // size for "\"\":".
-                $size += strlen($field->getJsonName());  // size for field name
-            }
-            $getter = $field->getGetter();
-            $value = $this->$getter();
-            $size += $this->fieldDataOnlyJsonByteSize($field, $value);
-        }
-        return $size;
-    }
-
-    /**
-     * @ignore
-     */
-    public function byteSize()
-    {
-        $size = 0;
-
-        $fields = $this->desc->getField();
-        foreach ($fields as $field) {
-            $size += $this->fieldByteSize($field);
-        }
-        $size += strlen($this->unknown);
-        return $size;
-    }
-
-    private function appendHelper($field, $append_value)
-    {
-        $getter = $field->getGetter();
-        $setter = $field->getSetter();
-
-        $field_arr_value = $this->$getter();
-        $field_arr_value[] = $append_value;
-
-        if (!is_object($field_arr_value)) {
-            $this->$setter($field_arr_value);
-        }
-    }
-
-    private function kvUpdateHelper($field, $update_key, $update_value)
-    {
-        $getter = $field->getGetter();
-        $setter = $field->getSetter();
-
-        $field_arr_value = $this->$getter();
-        $field_arr_value[$update_key] = $update_value;
-
-        if (!is_object($field_arr_value)) {
-            $this->$setter($field_arr_value);
-        }
-    }
-
-    /**
-     * @ignore
-     */
-    public function jsonByteSize()
-    {
-        $size = 0;
-        if (is_a($this, 'Google\Protobuf\Any')) {
-            // Size for "{}".
-            $size += 2;
-
-            // Size for "\"@type\":".
-            $size += 8;
-
-            // Size for url. +2 for "" /.
-            $size += strlen($this->getTypeUrl()) + 2;
-
-            $value_msg = $this->unpack();
-            if (GPBUtil::hasSpecialJsonMapping($value_msg)) {
-                // Size for "\",value\":".
-                $size += 9;
-                $size += $value_msg->jsonByteSize();
-            } else {
-                // Size for value. +1 for comma, -2 for "{}".
-                $size += $value_msg->jsonByteSize() -1;
-            }
-        } elseif (get_class($this) === 'Google\Protobuf\FieldMask') {
-            $field_mask = GPBUtil::formatFieldMask($this);
-            $size += strlen($field_mask) + 2;  // 2 for ""
-        } elseif (get_class($this) === 'Google\Protobuf\Duration') {
-            $duration = GPBUtil::formatDuration($this) . "s";
-            $size += strlen($duration) + 2;  // 2 for ""
-        } elseif (get_class($this) === 'Google\Protobuf\Timestamp') {
-            $timestamp = GPBUtil::formatTimestamp($this);
-            $timestamp = json_encode($timestamp);
-            $size += strlen($timestamp);
-        } else {
-            if (!GPBUtil::hasSpecialJsonMapping($this)) {
-                // Size for "{}".
-                $size += 2;
-            }
-
-            $fields = $this->desc->getField();
-            $count = 0;
-            foreach ($fields as $field) {
-                $field_size = $this->fieldJsonByteSize($field);
-                $size += $field_size;
-                if ($field_size != 0) {
-                  $count++;
-                }
-            }
-            // size for comma
-            $size += $count > 0 ? ($count - 1) : 0;
-        }
-        return $size;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/MessageBuilderContext.php b/php/src/Google/Protobuf/Internal/MessageBuilderContext.php
deleted file mode 100644
index 2724d26..0000000
--- a/php/src/Google/Protobuf/Internal/MessageBuilderContext.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBLabel;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\Descriptor;
-use Google\Protobuf\Internal\FieldDescriptor;
-
-class MessageBuilderContext
-{
-
-    private $descriptor;
-    private $pool;
-
-    public function __construct($full_name, $klass, $pool)
-    {
-        $this->descriptor = new Descriptor();
-        $this->descriptor->setFullName($full_name);
-        $this->descriptor->setClass($klass);
-        $this->pool = $pool;
-    }
-
-    private function getFieldDescriptor($name, $label, $type,
-                                      $number, $type_name = null)
-    {
-        $field = new FieldDescriptor();
-        $field->setName($name);
-        $camel_name = implode('', array_map('ucwords', explode('_', $name)));
-        $field->setGetter('get' . $camel_name);
-        $field->setSetter('set' . $camel_name);
-        $field->setType($type);
-        $field->setNumber($number);
-        $field->setLabel($label);
-
-        // At this time, the message/enum type may have not been added to pool.
-        // So we use the type name as place holder and will replace it with the
-        // actual descriptor in cross building.
-        switch ($type) {
-        case GPBType::MESSAGE:
-          $field->setMessageType($type_name);
-          break;
-        case GPBType::ENUM:
-          $field->setEnumType($type_name);
-          break;
-        default:
-          break;
-        }
-
-        return $field;
-    }
-
-    public function optional($name, $type, $number, $type_name = null)
-    {
-        $this->descriptor->addField($this->getFieldDescriptor(
-            $name,
-            GPBLabel::OPTIONAL,
-            $type,
-            $number,
-            $type_name));
-        return $this;
-    }
-
-    public function repeated($name, $type, $number, $type_name = null)
-    {
-        $this->descriptor->addField($this->getFieldDescriptor(
-            $name,
-            GPBLabel::REPEATED,
-            $type,
-            $number,
-            $type_name));
-        return $this;
-    }
-
-    public function required($name, $type, $number, $type_name = null)
-    {
-        $this->descriptor->addField($this->getFieldDescriptor(
-            $name,
-            GPBLabel::REQUIRED,
-            $type,
-            $number,
-            $type_name));
-        return $this;
-    }
-
-    public function finalizeToPool()
-    {
-        $this->pool->addDescriptor($this->descriptor);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/MessageOptions.php b/php/src/Google/Protobuf/Internal/MessageOptions.php
deleted file mode 100644
index 99ff3d0..0000000
--- a/php/src/Google/Protobuf/Internal/MessageOptions.php
+++ /dev/null
@@ -1,328 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.MessageOptions</code>
- */
-class MessageOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Set true to use the old proto1 MessageSet wire format for extensions.
-     * This is provided for backwards-compatibility with the MessageSet wire
-     * format.  You should not use this for any other reason:  It's less
-     * efficient, has fewer features, and is more complicated.
-     * The message must be defined exactly as follows:
-     *   message Foo {
-     *     option message_set_wire_format = true;
-     *     extensions 4 to max;
-     *   }
-     * Note that the message cannot have any defined fields; MessageSets only
-     * have extensions.
-     * All extensions of your type must be singular messages; e.g. they cannot
-     * be int32s, enums, or repeated messages.
-     * Because this is an option, the above two restrictions are not enforced by
-     * the protocol compiler.
-     *
-     * Generated from protobuf field <code>optional bool message_set_wire_format = 1 [default = false];</code>
-     */
-    private $message_set_wire_format = false;
-    private $has_message_set_wire_format = false;
-    /**
-     * Disables the generation of the standard "descriptor()" accessor, which can
-     * conflict with a field of the same name.  This is meant to make migration
-     * from proto1 easier; new code should avoid fields named "descriptor".
-     *
-     * Generated from protobuf field <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
-     */
-    private $no_standard_descriptor_accessor = false;
-    private $has_no_standard_descriptor_accessor = false;
-    /**
-     * Is this message deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the message, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating messages.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * Whether the message is an automatically generated map entry type for the
-     * maps field.
-     * For maps fields:
-     *     map<KeyType, ValueType> map_field = 1;
-     * The parsed descriptor looks like:
-     *     message MapFieldEntry {
-     *         option map_entry = true;
-     *         optional KeyType key = 1;
-     *         optional ValueType value = 2;
-     *     }
-     *     repeated MapFieldEntry map_field = 1;
-     * Implementations may choose not to generate the map_entry=true message, but
-     * use a native map in the target language to hold the keys and values.
-     * The reflection APIs in such implementions still need to work as
-     * if the field is a repeated message field.
-     * NOTE: Do not set the option in .proto files. Always use the maps syntax
-     * instead. The option should only be implicitly set by the proto compiler
-     * parser.
-     *
-     * Generated from protobuf field <code>optional bool map_entry = 7;</code>
-     */
-    private $map_entry = false;
-    private $has_map_entry = false;
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Set true to use the old proto1 MessageSet wire format for extensions.
-     * This is provided for backwards-compatibility with the MessageSet wire
-     * format.  You should not use this for any other reason:  It's less
-     * efficient, has fewer features, and is more complicated.
-     * The message must be defined exactly as follows:
-     *   message Foo {
-     *     option message_set_wire_format = true;
-     *     extensions 4 to max;
-     *   }
-     * Note that the message cannot have any defined fields; MessageSets only
-     * have extensions.
-     * All extensions of your type must be singular messages; e.g. they cannot
-     * be int32s, enums, or repeated messages.
-     * Because this is an option, the above two restrictions are not enforced by
-     * the protocol compiler.
-     *
-     * Generated from protobuf field <code>optional bool message_set_wire_format = 1 [default = false];</code>
-     * @return bool
-     */
-    public function getMessageSetWireFormat()
-    {
-        return $this->message_set_wire_format;
-    }
-
-    /**
-     * Set true to use the old proto1 MessageSet wire format for extensions.
-     * This is provided for backwards-compatibility with the MessageSet wire
-     * format.  You should not use this for any other reason:  It's less
-     * efficient, has fewer features, and is more complicated.
-     * The message must be defined exactly as follows:
-     *   message Foo {
-     *     option message_set_wire_format = true;
-     *     extensions 4 to max;
-     *   }
-     * Note that the message cannot have any defined fields; MessageSets only
-     * have extensions.
-     * All extensions of your type must be singular messages; e.g. they cannot
-     * be int32s, enums, or repeated messages.
-     * Because this is an option, the above two restrictions are not enforced by
-     * the protocol compiler.
-     *
-     * Generated from protobuf field <code>optional bool message_set_wire_format = 1 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setMessageSetWireFormat($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->message_set_wire_format = $var;
-        $this->has_message_set_wire_format = true;
-
-        return $this;
-    }
-
-    public function hasMessageSetWireFormat()
-    {
-        return $this->has_message_set_wire_format;
-    }
-
-    /**
-     * Disables the generation of the standard "descriptor()" accessor, which can
-     * conflict with a field of the same name.  This is meant to make migration
-     * from proto1 easier; new code should avoid fields named "descriptor".
-     *
-     * Generated from protobuf field <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
-     * @return bool
-     */
-    public function getNoStandardDescriptorAccessor()
-    {
-        return $this->no_standard_descriptor_accessor;
-    }
-
-    /**
-     * Disables the generation of the standard "descriptor()" accessor, which can
-     * conflict with a field of the same name.  This is meant to make migration
-     * from proto1 easier; new code should avoid fields named "descriptor".
-     *
-     * Generated from protobuf field <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setNoStandardDescriptorAccessor($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->no_standard_descriptor_accessor = $var;
-        $this->has_no_standard_descriptor_accessor = true;
-
-        return $this;
-    }
-
-    public function hasNoStandardDescriptorAccessor()
-    {
-        return $this->has_no_standard_descriptor_accessor;
-    }
-
-    /**
-     * Is this message deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the message, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating messages.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this message deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the message, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating messages.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 3 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * Whether the message is an automatically generated map entry type for the
-     * maps field.
-     * For maps fields:
-     *     map<KeyType, ValueType> map_field = 1;
-     * The parsed descriptor looks like:
-     *     message MapFieldEntry {
-     *         option map_entry = true;
-     *         optional KeyType key = 1;
-     *         optional ValueType value = 2;
-     *     }
-     *     repeated MapFieldEntry map_field = 1;
-     * Implementations may choose not to generate the map_entry=true message, but
-     * use a native map in the target language to hold the keys and values.
-     * The reflection APIs in such implementions still need to work as
-     * if the field is a repeated message field.
-     * NOTE: Do not set the option in .proto files. Always use the maps syntax
-     * instead. The option should only be implicitly set by the proto compiler
-     * parser.
-     *
-     * Generated from protobuf field <code>optional bool map_entry = 7;</code>
-     * @return bool
-     */
-    public function getMapEntry()
-    {
-        return $this->map_entry;
-    }
-
-    /**
-     * Whether the message is an automatically generated map entry type for the
-     * maps field.
-     * For maps fields:
-     *     map<KeyType, ValueType> map_field = 1;
-     * The parsed descriptor looks like:
-     *     message MapFieldEntry {
-     *         option map_entry = true;
-     *         optional KeyType key = 1;
-     *         optional ValueType value = 2;
-     *     }
-     *     repeated MapFieldEntry map_field = 1;
-     * Implementations may choose not to generate the map_entry=true message, but
-     * use a native map in the target language to hold the keys and values.
-     * The reflection APIs in such implementions still need to work as
-     * if the field is a repeated message field.
-     * NOTE: Do not set the option in .proto files. Always use the maps syntax
-     * instead. The option should only be implicitly set by the proto compiler
-     * parser.
-     *
-     * Generated from protobuf field <code>optional bool map_entry = 7;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setMapEntry($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->map_entry = $var;
-        $this->has_map_entry = true;
-
-        return $this;
-    }
-
-    public function hasMapEntry()
-    {
-        return $this->has_map_entry;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php b/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php
deleted file mode 100644
index ccfce2d..0000000
--- a/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php
+++ /dev/null
@@ -1,246 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a method of a service.
- *
- * Generated from protobuf message <code>google.protobuf.MethodDescriptorProto</code>
- */
-class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Input and output type names.  These are resolved in the same way as
-     * FieldDescriptorProto.type_name, but must refer to a message type.
-     *
-     * Generated from protobuf field <code>optional string input_type = 2;</code>
-     */
-    private $input_type = '';
-    private $has_input_type = false;
-    /**
-     * Generated from protobuf field <code>optional string output_type = 3;</code>
-     */
-    private $output_type = '';
-    private $has_output_type = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MethodOptions options = 4;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-    /**
-     * Identifies if client streams multiple client messages
-     *
-     * Generated from protobuf field <code>optional bool client_streaming = 5 [default = false];</code>
-     */
-    private $client_streaming = false;
-    private $has_client_streaming = false;
-    /**
-     * Identifies if server streams multiple server messages
-     *
-     * Generated from protobuf field <code>optional bool server_streaming = 6 [default = false];</code>
-     */
-    private $server_streaming = false;
-    private $has_server_streaming = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Input and output type names.  These are resolved in the same way as
-     * FieldDescriptorProto.type_name, but must refer to a message type.
-     *
-     * Generated from protobuf field <code>optional string input_type = 2;</code>
-     * @return string
-     */
-    public function getInputType()
-    {
-        return $this->input_type;
-    }
-
-    /**
-     * Input and output type names.  These are resolved in the same way as
-     * FieldDescriptorProto.type_name, but must refer to a message type.
-     *
-     * Generated from protobuf field <code>optional string input_type = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setInputType($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->input_type = $var;
-        $this->has_input_type = true;
-
-        return $this;
-    }
-
-    public function hasInputType()
-    {
-        return $this->has_input_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string output_type = 3;</code>
-     * @return string
-     */
-    public function getOutputType()
-    {
-        return $this->output_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string output_type = 3;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setOutputType($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->output_type = $var;
-        $this->has_output_type = true;
-
-        return $this;
-    }
-
-    public function hasOutputType()
-    {
-        return $this->has_output_type;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MethodOptions options = 4;</code>
-     * @return \Google\Protobuf\Internal\MethodOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MethodOptions options = 4;</code>
-     * @param \Google\Protobuf\Internal\MethodOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    /**
-     * Identifies if client streams multiple client messages
-     *
-     * Generated from protobuf field <code>optional bool client_streaming = 5 [default = false];</code>
-     * @return bool
-     */
-    public function getClientStreaming()
-    {
-        return $this->client_streaming;
-    }
-
-    /**
-     * Identifies if client streams multiple client messages
-     *
-     * Generated from protobuf field <code>optional bool client_streaming = 5 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setClientStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->client_streaming = $var;
-        $this->has_client_streaming = true;
-
-        return $this;
-    }
-
-    public function hasClientStreaming()
-    {
-        return $this->has_client_streaming;
-    }
-
-    /**
-     * Identifies if server streams multiple server messages
-     *
-     * Generated from protobuf field <code>optional bool server_streaming = 6 [default = false];</code>
-     * @return bool
-     */
-    public function getServerStreaming()
-    {
-        return $this->server_streaming;
-    }
-
-    /**
-     * Identifies if server streams multiple server messages
-     *
-     * Generated from protobuf field <code>optional bool server_streaming = 6 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setServerStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->server_streaming = $var;
-        $this->has_server_streaming = true;
-
-        return $this;
-    }
-
-    public function hasServerStreaming()
-    {
-        return $this->has_server_streaming;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/MethodOptions.php b/php/src/Google/Protobuf/Internal/MethodOptions.php
deleted file mode 100644
index baa806b..0000000
--- a/php/src/Google/Protobuf/Internal/MethodOptions.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.MethodOptions</code>
- */
-class MethodOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Is this method deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the method, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating methods.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
-     */
-    private $idempotency_level = 0;
-    private $has_idempotency_level = false;
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Is this method deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the method, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating methods.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this method deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the method, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating methods.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
-     * @return int
-     */
-    public function getIdempotencyLevel()
-    {
-        return $this->idempotency_level;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setIdempotencyLevel($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\MethodOptions_IdempotencyLevel::class);
-        $this->idempotency_level = $var;
-        $this->has_idempotency_level = true;
-
-        return $this;
-    }
-
-    public function hasIdempotencyLevel()
-    {
-        return $this->has_idempotency_level;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php b/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php
deleted file mode 100644
index 9e06d8e..0000000
--- a/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-/**
- * Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
- * or neither? HTTP based RPC implementation may choose GET verb for safe
- * methods, and PUT verb for idempotent methods instead of the default POST.
- *
- * Protobuf enum <code>Google\Protobuf\Internal</code>
- */
-class MethodOptions_IdempotencyLevel
-{
-    /**
-     * Generated from protobuf enum <code>IDEMPOTENCY_UNKNOWN = 0;</code>
-     */
-    const IDEMPOTENCY_UNKNOWN = 0;
-    /**
-     * implies idempotent
-     *
-     * Generated from protobuf enum <code>NO_SIDE_EFFECTS = 1;</code>
-     */
-    const NO_SIDE_EFFECTS = 1;
-    /**
-     * idempotent, but may have side effects
-     *
-     * Generated from protobuf enum <code>IDEMPOTENT = 2;</code>
-     */
-    const IDEMPOTENT = 2;
-}
-
diff --git a/php/src/Google/Protobuf/Internal/OneofDescriptor.php b/php/src/Google/Protobuf/Internal/OneofDescriptor.php
deleted file mode 100644
index 67b107f..0000000
--- a/php/src/Google/Protobuf/Internal/OneofDescriptor.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class OneofDescriptor
-{
-    use HasPublicDescriptorTrait;
-
-    private $name;
-    private $fields;
-
-    public function __construct()
-    {
-        $this->public_desc = new \Google\Protobuf\OneofDescriptor($this);
-    }
-
-    public function setName($name)
-    {
-        $this->name = $name;
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function addField(FieldDescriptor $field)
-    {
-        $this->fields[] = $field;
-    }
-
-    public function getFields()
-    {
-        return $this->fields;
-    }
-
-    public static function buildFromProto($oneof_proto, $desc, $index)
-    {
-        $oneof = new OneofDescriptor();
-        $oneof->setName($oneof_proto->getName());
-        foreach ($desc->getField() as $field) {
-            if ($field->getOneofIndex() == $index) {
-                $oneof->addField($field);
-            }
-        }
-        return $oneof;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
deleted file mode 100644
index 15ff061..0000000
--- a/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a oneof.
- *
- * Generated from protobuf message <code>google.protobuf.OneofDescriptorProto</code>
- */
-class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.OneofOptions options = 2;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.OneofOptions options = 2;</code>
-     * @return \Google\Protobuf\Internal\OneofOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.OneofOptions options = 2;</code>
-     * @param \Google\Protobuf\Internal\OneofOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/OneofField.php b/php/src/Google/Protobuf/Internal/OneofField.php
deleted file mode 100644
index 2c689e8..0000000
--- a/php/src/Google/Protobuf/Internal/OneofField.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class OneofField
-{
-
-    private $desc;
-    private $field_name;
-    private $number = 0;
-    private $value;
-
-    public function __construct($desc)
-    {
-        $this->desc = $desc;
-    }
-
-    public function setValue($value)
-    {
-        $this->value = $value;
-    }
-
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    public function setFieldName($field_name)
-    {
-        $this->field_name = $field_name;
-    }
-
-    public function getFieldName()
-    {
-        return $this->field_name;
-    }
-
-    public function setNumber($number)
-    {
-        $this->number = $number;
-    }
-
-    public function getNumber()
-    {
-        return $this->number;
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/OneofOptions.php b/php/src/Google/Protobuf/Internal/OneofOptions.php
deleted file mode 100644
index e5b4633..0000000
--- a/php/src/Google/Protobuf/Internal/OneofOptions.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.OneofOptions</code>
- */
-class OneofOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/RawInputStream.php b/php/src/Google/Protobuf/Internal/RawInputStream.php
deleted file mode 100644
index 4e7ed5c..0000000
--- a/php/src/Google/Protobuf/Internal/RawInputStream.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-// 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.
-
-namespace Google\Protobuf\Internal;
-
-class RawInputStream
-{
-
-    private $buffer;
-
-    public function __construct($buffer)
-    {
-        $this->buffer = $buffer;
-    }
-
-    public function getData()
-    {
-        return $this->buffer;
-    }
-
-}
diff --git a/php/src/Google/Protobuf/Internal/RepeatedField.php b/php/src/Google/Protobuf/Internal/RepeatedField.php
deleted file mode 100644
index 797b3b3..0000000
--- a/php/src/Google/Protobuf/Internal/RepeatedField.php
+++ /dev/null
@@ -1,227 +0,0 @@
-<?php
-
-// 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.
-
-/**
- * RepeatedField and RepeatedFieldIter are used by generated protocol message
- * classes to manipulate repeated fields.
- */
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * RepeatedField is used by generated protocol message classes to manipulate
- * repeated fields. It can be used like native PHP array.
- */
-class RepeatedField implements \ArrayAccess, \IteratorAggregate, \Countable
-{
-
-    /**
-     * @ignore
-     */
-    private $container;
-    /**
-     * @ignore
-     */
-    private $type;
-    /**
-     * @ignore
-     */
-    private $klass;
-
-    /**
-     * Constructs an instance of RepeatedField.
-     *
-     * @param long $type Type of the stored element.
-     * @param string $klass Message/Enum class name (message/enum fields only).
-     * @ignore
-     */
-    public function __construct($type, $klass = null)
-    {
-        $this->container = [];
-        $this->type = $type;
-        $this->klass = $klass;
-    }
-
-    /**
-     * @ignore
-     */
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    /**
-     * @ignore
-     */
-    public function getClass()
-    {
-        return $this->klass;
-    }
-
-    /**
-     * Return the element at the given index.
-     *
-     * This will also be called for: $ele = $arr[0]
-     *
-     * @param long $offset The index of the element to be fetched.
-     * @return object The stored element at given index.
-     * @throws ErrorException Invalid type for index.
-     * @throws ErrorException Non-existing index.
-     */
-    public function offsetGet($offset)
-    {
-        return $this->container[$offset];
-    }
-
-    /**
-     * Assign the element at the given index.
-     *
-     * This will also be called for: $arr []= $ele and $arr[0] = ele
-     *
-     * @param long $offset The index of the element to be assigned.
-     * @param object $value The element to be assigned.
-     * @return void
-     * @throws ErrorException Invalid type for index.
-     * @throws ErrorException Non-existing index.
-     * @throws ErrorException Incorrect type of the element.
-     */
-    public function offsetSet($offset, $value)
-    {
-        switch ($this->type) {
-            case GPBType::INT32:
-                GPBUtil::checkInt32($value);
-                break;
-            case GPBType::UINT32:
-                GPBUtil::checkUint32($value);
-                break;
-            case GPBType::INT64:
-                GPBUtil::checkInt64($value);
-                break;
-            case GPBType::UINT64:
-                GPBUtil::checkUint64($value);
-                break;
-            case GPBType::FLOAT:
-                GPBUtil::checkFloat($value);
-                break;
-            case GPBType::DOUBLE:
-                GPBUtil::checkDouble($value);
-                break;
-            case GPBType::BOOL:
-                GPBUtil::checkBool($value);
-                break;
-            case GPBType::STRING:
-                GPBUtil::checkString($value, true);
-                break;
-            case GPBType::MESSAGE:
-                if (is_null($value)) {
-                  trigger_error("RepeatedField element cannot be null.",
-                                E_USER_ERROR);
-                }
-                GPBUtil::checkMessage($value, $this->klass);
-                break;
-            default:
-                break;
-        }
-        if (is_null($offset)) {
-            $this->container[] = $value;
-        } else {
-            $count = count($this->container);
-            if (!is_numeric($offset) || $offset < 0 || $offset >= $count) {
-                trigger_error(
-                    "Cannot modify element at the given index",
-                    E_USER_ERROR);
-                return;
-            }
-            $this->container[$offset] = $value;
-        }
-    }
-
-    /**
-     * Remove the element at the given index.
-     *
-     * This will also be called for: unset($arr)
-     *
-     * @param long $offset The index of the element to be removed.
-     * @return void
-     * @throws ErrorException Invalid type for index.
-     * @throws ErrorException The element to be removed is not at the end of the
-     * RepeatedField.
-     */
-    public function offsetUnset($offset)
-    {
-        $count = count($this->container);
-        if (!is_numeric($offset) || $count === 0 || $offset !== $count - 1) {
-            trigger_error(
-                "Cannot remove element at the given index",
-                E_USER_ERROR);
-            return;
-        }
-        array_pop($this->container);
-    }
-
-    /**
-     * Check the existence of the element at the given index.
-     *
-     * This will also be called for: isset($arr)
-     *
-     * @param long $offset The index of the element to be removed.
-     * @return bool True if the element at the given offset exists.
-     * @throws ErrorException Invalid type for index.
-     */
-    public function offsetExists($offset)
-    {
-        return isset($this->container[$offset]);
-    }
-
-    /**
-     * @ignore
-     */
-    public function getIterator()
-    {
-        return new RepeatedFieldIter($this->container);
-    }
-
-    /**
-     * Return the number of stored elements.
-     *
-     * This will also be called for: count($arr)
-     *
-     * @return integer The number of stored elements.
-     */
-    public function count()
-    {
-        return count($this->container);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/RepeatedFieldIter.php b/php/src/Google/Protobuf/Internal/RepeatedFieldIter.php
deleted file mode 100644
index 2b6f823..0000000
--- a/php/src/Google/Protobuf/Internal/RepeatedFieldIter.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-// 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.
-
-/**
- * RepeatedField and RepeatedFieldIter are used by generated protocol message
- * classes to manipulate repeated fields.
- */
-
-namespace Google\Protobuf\Internal;
-
-/**
- * RepeatedFieldIter is used to iterate RepeatedField. It is also need for the
- * foreach syntax.
- */
-class RepeatedFieldIter implements \Iterator
-{
-
-    /**
-     * @ignore
-     */
-    private $position;
-    /**
-     * @ignore
-     */
-    private $container;
-
-    /**
-     * Create iterator instance for RepeatedField.
-     *
-     * @param RepeatedField The RepeatedField instance for which this iterator
-     * is created.
-     * @ignore
-     */
-    public function __construct($container)
-    {
-        $this->position = 0;
-        $this->container = $container;
-    }
-
-    /**
-     * Reset the status of the iterator
-     *
-     * @return void
-     */
-    public function rewind()
-    {
-        $this->position = 0;
-    }
-
-    /**
-     * Return the element at the current position.
-     *
-     * @return object The element at the current position.
-     */
-    public function current()
-    {
-        return $this->container[$this->position];
-    }
-
-    /**
-     * Return the current position.
-     *
-     * @return integer The current position.
-     */
-    public function key()
-    {
-        return $this->position;
-    }
-
-    /**
-     * Move to the next position.
-     *
-     * @return void
-     */
-    public function next()
-    {
-        ++$this->position;
-    }
-
-    /**
-     * Check whether there are more elements to iterate.
-     *
-     * @return bool True if there are more elements to iterate.
-     */
-    public function valid()
-    {
-        return isset($this->container[$this->position]);
-    }
-}
diff --git a/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
deleted file mode 100644
index da88e9c..0000000
--- a/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Describes a service.
- *
- * Generated from protobuf message <code>google.protobuf.ServiceDescriptorProto</code>
- */
-class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     */
-    private $name = '';
-    private $has_name = false;
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
-     */
-    private $method;
-    private $has_method = false;
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.ServiceOptions options = 3;</code>
-     */
-    private $options = null;
-    private $has_options = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getMethod()
-    {
-        return $this->method;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
-     * @param \Google\Protobuf\Internal\MethodDescriptorProto[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setMethod($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class);
-        $this->method = $arr;
-        $this->has_method = true;
-
-        return $this;
-    }
-
-    public function hasMethod()
-    {
-        return $this->has_method;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.ServiceOptions options = 3;</code>
-     * @return \Google\Protobuf\Internal\ServiceOptions
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional .google.protobuf.ServiceOptions options = 3;</code>
-     * @param \Google\Protobuf\Internal\ServiceOptions $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-
-        return $this;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/ServiceOptions.php b/php/src/Google/Protobuf/Internal/ServiceOptions.php
deleted file mode 100644
index 3e7214a..0000000
--- a/php/src/Google/Protobuf/Internal/ServiceOptions.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.ServiceOptions</code>
- */
-class ServiceOptions extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Is this service deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the service, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating services.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code>
-     */
-    private $deprecated = false;
-    private $has_deprecated = false;
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     */
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Is this service deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the service, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating services.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code>
-     * @return bool
-     */
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    /**
-     * Is this service deprecated?
-     * Depending on the target platform, this can emit Deprecated annotations
-     * for the service, or it will be completely ignored; in the very least,
-     * this is a formalization for deprecating services.
-     *
-     * Generated from protobuf field <code>optional bool deprecated = 33 [default = false];</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-
-        return $this;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    /**
-     * The parser stores options it doesn't recognize here. See above.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setUninterpretedOption($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $arr;
-        $this->has_uninterpreted_option = true;
-
-        return $this;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/SourceCodeInfo.php b/php/src/Google/Protobuf/Internal/SourceCodeInfo.php
deleted file mode 100644
index 6ce05ed..0000000
--- a/php/src/Google/Protobuf/Internal/SourceCodeInfo.php
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Encapsulates information about the original source file from which a
- * FileDescriptorProto was generated.
- *
- * Generated from protobuf message <code>google.protobuf.SourceCodeInfo</code>
- */
-class SourceCodeInfo extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * A Location identifies a piece of source code in a .proto file which
-     * corresponds to a particular definition.  This information is intended
-     * to be useful to IDEs, code indexers, documentation generators, and similar
-     * tools.
-     * For example, say we have a file like:
-     *   message Foo {
-     *     optional string foo = 1;
-     *   }
-     * Let's look at just the field definition:
-     *   optional string foo = 1;
-     *   ^       ^^     ^^  ^  ^^^
-     *   a       bc     de  f  ghi
-     * We have the following locations:
-     *   span   path               represents
-     *   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-     *   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-     *   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-     *   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-     *   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-     * Notes:
-     * - A location may refer to a repeated field itself (i.e. not to any
-     *   particular index within it).  This is used whenever a set of elements are
-     *   logically enclosed in a single code segment.  For example, an entire
-     *   extend block (possibly containing multiple extension definitions) will
-     *   have an outer location whose path refers to the "extensions" repeated
-     *   field without an index.
-     * - Multiple locations may have the same path.  This happens when a single
-     *   logical declaration is spread out across multiple places.  The most
-     *   obvious example is the "extend" block again -- there may be multiple
-     *   extend blocks in the same scope, each of which will have the same path.
-     * - A location's span is not always a subset of its parent's span.  For
-     *   example, the "extendee" of an extension declaration appears at the
-     *   beginning of the "extend" block and is shared by all extensions within
-     *   the block.
-     * - Just because a location's span is a subset of some other location's span
-     *   does not mean that it is a descendent.  For example, a "group" defines
-     *   both a type and a field in a single declaration.  Thus, the locations
-     *   corresponding to the type and field and their components will overlap.
-     * - Code which tries to interpret locations should probably be designed to
-     *   ignore those that it doesn't understand, as more types of locations could
-     *   be recorded in the future.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
-     */
-    private $location;
-    private $has_location = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * A Location identifies a piece of source code in a .proto file which
-     * corresponds to a particular definition.  This information is intended
-     * to be useful to IDEs, code indexers, documentation generators, and similar
-     * tools.
-     * For example, say we have a file like:
-     *   message Foo {
-     *     optional string foo = 1;
-     *   }
-     * Let's look at just the field definition:
-     *   optional string foo = 1;
-     *   ^       ^^     ^^  ^  ^^^
-     *   a       bc     de  f  ghi
-     * We have the following locations:
-     *   span   path               represents
-     *   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-     *   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-     *   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-     *   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-     *   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-     * Notes:
-     * - A location may refer to a repeated field itself (i.e. not to any
-     *   particular index within it).  This is used whenever a set of elements are
-     *   logically enclosed in a single code segment.  For example, an entire
-     *   extend block (possibly containing multiple extension definitions) will
-     *   have an outer location whose path refers to the "extensions" repeated
-     *   field without an index.
-     * - Multiple locations may have the same path.  This happens when a single
-     *   logical declaration is spread out across multiple places.  The most
-     *   obvious example is the "extend" block again -- there may be multiple
-     *   extend blocks in the same scope, each of which will have the same path.
-     * - A location's span is not always a subset of its parent's span.  For
-     *   example, the "extendee" of an extension declaration appears at the
-     *   beginning of the "extend" block and is shared by all extensions within
-     *   the block.
-     * - Just because a location's span is a subset of some other location's span
-     *   does not mean that it is a descendent.  For example, a "group" defines
-     *   both a type and a field in a single declaration.  Thus, the locations
-     *   corresponding to the type and field and their components will overlap.
-     * - Code which tries to interpret locations should probably be designed to
-     *   ignore those that it doesn't understand, as more types of locations could
-     *   be recorded in the future.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getLocation()
-    {
-        return $this->location;
-    }
-
-    /**
-     * A Location identifies a piece of source code in a .proto file which
-     * corresponds to a particular definition.  This information is intended
-     * to be useful to IDEs, code indexers, documentation generators, and similar
-     * tools.
-     * For example, say we have a file like:
-     *   message Foo {
-     *     optional string foo = 1;
-     *   }
-     * Let's look at just the field definition:
-     *   optional string foo = 1;
-     *   ^       ^^     ^^  ^  ^^^
-     *   a       bc     de  f  ghi
-     * We have the following locations:
-     *   span   path               represents
-     *   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-     *   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-     *   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-     *   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-     *   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-     * Notes:
-     * - A location may refer to a repeated field itself (i.e. not to any
-     *   particular index within it).  This is used whenever a set of elements are
-     *   logically enclosed in a single code segment.  For example, an entire
-     *   extend block (possibly containing multiple extension definitions) will
-     *   have an outer location whose path refers to the "extensions" repeated
-     *   field without an index.
-     * - Multiple locations may have the same path.  This happens when a single
-     *   logical declaration is spread out across multiple places.  The most
-     *   obvious example is the "extend" block again -- there may be multiple
-     *   extend blocks in the same scope, each of which will have the same path.
-     * - A location's span is not always a subset of its parent's span.  For
-     *   example, the "extendee" of an extension declaration appears at the
-     *   beginning of the "extend" block and is shared by all extensions within
-     *   the block.
-     * - Just because a location's span is a subset of some other location's span
-     *   does not mean that it is a descendent.  For example, a "group" defines
-     *   both a type and a field in a single declaration.  Thus, the locations
-     *   corresponding to the type and field and their components will overlap.
-     * - Code which tries to interpret locations should probably be designed to
-     *   ignore those that it doesn't understand, as more types of locations could
-     *   be recorded in the future.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
-     * @param \Google\Protobuf\Internal\SourceCodeInfo_Location[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setLocation($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class);
-        $this->location = $arr;
-        $this->has_location = true;
-
-        return $this;
-    }
-
-    public function hasLocation()
-    {
-        return $this->has_location;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php b/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php
deleted file mode 100644
index 19ed2bc..0000000
--- a/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php
+++ /dev/null
@@ -1,385 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Generated from protobuf message <code>google.protobuf.SourceCodeInfo.Location</code>
- */
-class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Identifies which part of the FileDescriptorProto was defined at this
-     * location.
-     * Each element is a field number or an index.  They form a path from
-     * the root FileDescriptorProto to the place where the definition.  For
-     * example, this path:
-     *   [ 4, 3, 2, 7, 1 ]
-     * refers to:
-     *   file.message_type(3)  // 4, 3
-     *       .field(7)         // 2, 7
-     *       .name()           // 1
-     * This is because FileDescriptorProto.message_type has field number 4:
-     *   repeated DescriptorProto message_type = 4;
-     * and DescriptorProto.field has field number 2:
-     *   repeated FieldDescriptorProto field = 2;
-     * and FieldDescriptorProto.name has field number 1:
-     *   optional string name = 1;
-     * Thus, the above path gives the location of a field name.  If we removed
-     * the last element:
-     *   [ 4, 3, 2, 7 ]
-     * this path refers to the whole field declaration (from the beginning
-     * of the label to the terminating semicolon).
-     *
-     * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code>
-     */
-    private $path;
-    private $has_path = false;
-    /**
-     * Always has exactly three or four elements: start line, start column,
-     * end line (optional, otherwise assumed same as start line), end column.
-     * These are packed into a single field for efficiency.  Note that line
-     * and column numbers are zero-based -- typically you will want to add
-     * 1 to each before displaying to a user.
-     *
-     * Generated from protobuf field <code>repeated int32 span = 2 [packed = true];</code>
-     */
-    private $span;
-    private $has_span = false;
-    /**
-     * If this SourceCodeInfo represents a complete declaration, these are any
-     * comments appearing before and after the declaration which appear to be
-     * attached to the declaration.
-     * A series of line comments appearing on consecutive lines, with no other
-     * tokens appearing on those lines, will be treated as a single comment.
-     * leading_detached_comments will keep paragraphs of comments that appear
-     * before (but not connected to) the current element. Each paragraph,
-     * separated by empty lines, will be one comment element in the repeated
-     * field.
-     * Only the comment content is provided; comment markers (e.g. //) are
-     * stripped out.  For block comments, leading whitespace and an asterisk
-     * will be stripped from the beginning of each line other than the first.
-     * Newlines are included in the output.
-     * Examples:
-     *   optional int32 foo = 1;  // Comment attached to foo.
-     *   // Comment attached to bar.
-     *   optional int32 bar = 2;
-     *   optional string baz = 3;
-     *   // Comment attached to baz.
-     *   // Another line attached to baz.
-     *   // Comment attached to qux.
-     *   //
-     *   // Another line attached to qux.
-     *   optional double qux = 4;
-     *   // Detached comment for corge. This is not leading or trailing comments
-     *   // to qux or corge because there are blank lines separating it from
-     *   // both.
-     *   // Detached comment for corge paragraph 2.
-     *   optional string corge = 5;
-     *   /&#42; Block comment attached
-     *    * to corge.  Leading asterisks
-     *    * will be removed. *&#47;
-     *   /&#42; Block comment attached to
-     *    * grault. *&#47;
-     *   optional int32 grault = 6;
-     *   // ignored detached comments.
-     *
-     * Generated from protobuf field <code>optional string leading_comments = 3;</code>
-     */
-    private $leading_comments = '';
-    private $has_leading_comments = false;
-    /**
-     * Generated from protobuf field <code>optional string trailing_comments = 4;</code>
-     */
-    private $trailing_comments = '';
-    private $has_trailing_comments = false;
-    /**
-     * Generated from protobuf field <code>repeated string leading_detached_comments = 6;</code>
-     */
-    private $leading_detached_comments;
-    private $has_leading_detached_comments = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Identifies which part of the FileDescriptorProto was defined at this
-     * location.
-     * Each element is a field number or an index.  They form a path from
-     * the root FileDescriptorProto to the place where the definition.  For
-     * example, this path:
-     *   [ 4, 3, 2, 7, 1 ]
-     * refers to:
-     *   file.message_type(3)  // 4, 3
-     *       .field(7)         // 2, 7
-     *       .name()           // 1
-     * This is because FileDescriptorProto.message_type has field number 4:
-     *   repeated DescriptorProto message_type = 4;
-     * and DescriptorProto.field has field number 2:
-     *   repeated FieldDescriptorProto field = 2;
-     * and FieldDescriptorProto.name has field number 1:
-     *   optional string name = 1;
-     * Thus, the above path gives the location of a field name.  If we removed
-     * the last element:
-     *   [ 4, 3, 2, 7 ]
-     * this path refers to the whole field declaration (from the beginning
-     * of the label to the terminating semicolon).
-     *
-     * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    /**
-     * Identifies which part of the FileDescriptorProto was defined at this
-     * location.
-     * Each element is a field number or an index.  They form a path from
-     * the root FileDescriptorProto to the place where the definition.  For
-     * example, this path:
-     *   [ 4, 3, 2, 7, 1 ]
-     * refers to:
-     *   file.message_type(3)  // 4, 3
-     *       .field(7)         // 2, 7
-     *       .name()           // 1
-     * This is because FileDescriptorProto.message_type has field number 4:
-     *   repeated DescriptorProto message_type = 4;
-     * and DescriptorProto.field has field number 2:
-     *   repeated FieldDescriptorProto field = 2;
-     * and FieldDescriptorProto.name has field number 1:
-     *   optional string name = 1;
-     * Thus, the above path gives the location of a field name.  If we removed
-     * the last element:
-     *   [ 4, 3, 2, 7 ]
-     * this path refers to the whole field declaration (from the beginning
-     * of the label to the terminating semicolon).
-     *
-     * Generated from protobuf field <code>repeated int32 path = 1 [packed = true];</code>
-     * @param int[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setPath($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
-        $this->path = $arr;
-        $this->has_path = true;
-
-        return $this;
-    }
-
-    public function hasPath()
-    {
-        return $this->has_path;
-    }
-
-    /**
-     * Always has exactly three or four elements: start line, start column,
-     * end line (optional, otherwise assumed same as start line), end column.
-     * These are packed into a single field for efficiency.  Note that line
-     * and column numbers are zero-based -- typically you will want to add
-     * 1 to each before displaying to a user.
-     *
-     * Generated from protobuf field <code>repeated int32 span = 2 [packed = true];</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getSpan()
-    {
-        return $this->span;
-    }
-
-    /**
-     * Always has exactly three or four elements: start line, start column,
-     * end line (optional, otherwise assumed same as start line), end column.
-     * These are packed into a single field for efficiency.  Note that line
-     * and column numbers are zero-based -- typically you will want to add
-     * 1 to each before displaying to a user.
-     *
-     * Generated from protobuf field <code>repeated int32 span = 2 [packed = true];</code>
-     * @param int[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setSpan($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
-        $this->span = $arr;
-        $this->has_span = true;
-
-        return $this;
-    }
-
-    public function hasSpan()
-    {
-        return $this->has_span;
-    }
-
-    /**
-     * If this SourceCodeInfo represents a complete declaration, these are any
-     * comments appearing before and after the declaration which appear to be
-     * attached to the declaration.
-     * A series of line comments appearing on consecutive lines, with no other
-     * tokens appearing on those lines, will be treated as a single comment.
-     * leading_detached_comments will keep paragraphs of comments that appear
-     * before (but not connected to) the current element. Each paragraph,
-     * separated by empty lines, will be one comment element in the repeated
-     * field.
-     * Only the comment content is provided; comment markers (e.g. //) are
-     * stripped out.  For block comments, leading whitespace and an asterisk
-     * will be stripped from the beginning of each line other than the first.
-     * Newlines are included in the output.
-     * Examples:
-     *   optional int32 foo = 1;  // Comment attached to foo.
-     *   // Comment attached to bar.
-     *   optional int32 bar = 2;
-     *   optional string baz = 3;
-     *   // Comment attached to baz.
-     *   // Another line attached to baz.
-     *   // Comment attached to qux.
-     *   //
-     *   // Another line attached to qux.
-     *   optional double qux = 4;
-     *   // Detached comment for corge. This is not leading or trailing comments
-     *   // to qux or corge because there are blank lines separating it from
-     *   // both.
-     *   // Detached comment for corge paragraph 2.
-     *   optional string corge = 5;
-     *   /&#42; Block comment attached
-     *    * to corge.  Leading asterisks
-     *    * will be removed. *&#47;
-     *   /&#42; Block comment attached to
-     *    * grault. *&#47;
-     *   optional int32 grault = 6;
-     *   // ignored detached comments.
-     *
-     * Generated from protobuf field <code>optional string leading_comments = 3;</code>
-     * @return string
-     */
-    public function getLeadingComments()
-    {
-        return $this->leading_comments;
-    }
-
-    /**
-     * If this SourceCodeInfo represents a complete declaration, these are any
-     * comments appearing before and after the declaration which appear to be
-     * attached to the declaration.
-     * A series of line comments appearing on consecutive lines, with no other
-     * tokens appearing on those lines, will be treated as a single comment.
-     * leading_detached_comments will keep paragraphs of comments that appear
-     * before (but not connected to) the current element. Each paragraph,
-     * separated by empty lines, will be one comment element in the repeated
-     * field.
-     * Only the comment content is provided; comment markers (e.g. //) are
-     * stripped out.  For block comments, leading whitespace and an asterisk
-     * will be stripped from the beginning of each line other than the first.
-     * Newlines are included in the output.
-     * Examples:
-     *   optional int32 foo = 1;  // Comment attached to foo.
-     *   // Comment attached to bar.
-     *   optional int32 bar = 2;
-     *   optional string baz = 3;
-     *   // Comment attached to baz.
-     *   // Another line attached to baz.
-     *   // Comment attached to qux.
-     *   //
-     *   // Another line attached to qux.
-     *   optional double qux = 4;
-     *   // Detached comment for corge. This is not leading or trailing comments
-     *   // to qux or corge because there are blank lines separating it from
-     *   // both.
-     *   // Detached comment for corge paragraph 2.
-     *   optional string corge = 5;
-     *   /&#42; Block comment attached
-     *    * to corge.  Leading asterisks
-     *    * will be removed. *&#47;
-     *   /&#42; Block comment attached to
-     *    * grault. *&#47;
-     *   optional int32 grault = 6;
-     *   // ignored detached comments.
-     *
-     * Generated from protobuf field <code>optional string leading_comments = 3;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setLeadingComments($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->leading_comments = $var;
-        $this->has_leading_comments = true;
-
-        return $this;
-    }
-
-    public function hasLeadingComments()
-    {
-        return $this->has_leading_comments;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string trailing_comments = 4;</code>
-     * @return string
-     */
-    public function getTrailingComments()
-    {
-        return $this->trailing_comments;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string trailing_comments = 4;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setTrailingComments($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->trailing_comments = $var;
-        $this->has_trailing_comments = true;
-
-        return $this;
-    }
-
-    public function hasTrailingComments()
-    {
-        return $this->has_trailing_comments;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated string leading_detached_comments = 6;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getLeadingDetachedComments()
-    {
-        return $this->leading_detached_comments;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated string leading_detached_comments = 6;</code>
-     * @param string[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setLeadingDetachedComments($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
-        $this->leading_detached_comments = $arr;
-        $this->has_leading_detached_comments = true;
-
-        return $this;
-    }
-
-    public function hasLeadingDetachedComments()
-    {
-        return $this->has_leading_detached_comments;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/UninterpretedOption.php b/php/src/Google/Protobuf/Internal/UninterpretedOption.php
deleted file mode 100644
index 4d342eb..0000000
--- a/php/src/Google/Protobuf/Internal/UninterpretedOption.php
+++ /dev/null
@@ -1,272 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A message representing a option the parser does not recognize. This only
- * appears in options protos created by the compiler::Parser class.
- * DescriptorPool resolves these when building Descriptor objects. Therefore,
- * options protos in descriptor objects (e.g. returned by Descriptor::options(),
- * or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
- * in them.
- *
- * Generated from protobuf message <code>google.protobuf.UninterpretedOption</code>
- */
-class UninterpretedOption extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
-     */
-    private $name;
-    private $has_name = false;
-    /**
-     * The value of the uninterpreted option, in whatever type the tokenizer
-     * identified it as during parsing. Exactly one of these should be set.
-     *
-     * Generated from protobuf field <code>optional string identifier_value = 3;</code>
-     */
-    private $identifier_value = '';
-    private $has_identifier_value = false;
-    /**
-     * Generated from protobuf field <code>optional uint64 positive_int_value = 4;</code>
-     */
-    private $positive_int_value = 0;
-    private $has_positive_int_value = false;
-    /**
-     * Generated from protobuf field <code>optional int64 negative_int_value = 5;</code>
-     */
-    private $negative_int_value = 0;
-    private $has_negative_int_value = false;
-    /**
-     * Generated from protobuf field <code>optional double double_value = 6;</code>
-     */
-    private $double_value = 0.0;
-    private $has_double_value = false;
-    /**
-     * Generated from protobuf field <code>optional bytes string_value = 7;</code>
-     */
-    private $string_value = '';
-    private $has_string_value = false;
-    /**
-     * Generated from protobuf field <code>optional string aggregate_value = 8;</code>
-     */
-    private $aggregate_value = '';
-    private $has_aggregate_value = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Generated from protobuf field <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
-     * @param \Google\Protobuf\Internal\UninterpretedOption_NamePart[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class);
-        $this->name = $arr;
-        $this->has_name = true;
-
-        return $this;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    /**
-     * The value of the uninterpreted option, in whatever type the tokenizer
-     * identified it as during parsing. Exactly one of these should be set.
-     *
-     * Generated from protobuf field <code>optional string identifier_value = 3;</code>
-     * @return string
-     */
-    public function getIdentifierValue()
-    {
-        return $this->identifier_value;
-    }
-
-    /**
-     * The value of the uninterpreted option, in whatever type the tokenizer
-     * identified it as during parsing. Exactly one of these should be set.
-     *
-     * Generated from protobuf field <code>optional string identifier_value = 3;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setIdentifierValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->identifier_value = $var;
-        $this->has_identifier_value = true;
-
-        return $this;
-    }
-
-    public function hasIdentifierValue()
-    {
-        return $this->has_identifier_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional uint64 positive_int_value = 4;</code>
-     * @return int|string
-     */
-    public function getPositiveIntValue()
-    {
-        return $this->positive_int_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional uint64 positive_int_value = 4;</code>
-     * @param int|string $var
-     * @return $this
-     */
-    public function setPositiveIntValue($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->positive_int_value = $var;
-        $this->has_positive_int_value = true;
-
-        return $this;
-    }
-
-    public function hasPositiveIntValue()
-    {
-        return $this->has_positive_int_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int64 negative_int_value = 5;</code>
-     * @return int|string
-     */
-    public function getNegativeIntValue()
-    {
-        return $this->negative_int_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional int64 negative_int_value = 5;</code>
-     * @param int|string $var
-     * @return $this
-     */
-    public function setNegativeIntValue($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->negative_int_value = $var;
-        $this->has_negative_int_value = true;
-
-        return $this;
-    }
-
-    public function hasNegativeIntValue()
-    {
-        return $this->has_negative_int_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional double double_value = 6;</code>
-     * @return float
-     */
-    public function getDoubleValue()
-    {
-        return $this->double_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional double double_value = 6;</code>
-     * @param float $var
-     * @return $this
-     */
-    public function setDoubleValue($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->double_value = $var;
-        $this->has_double_value = true;
-
-        return $this;
-    }
-
-    public function hasDoubleValue()
-    {
-        return $this->has_double_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bytes string_value = 7;</code>
-     * @return string
-     */
-    public function getStringValue()
-    {
-        return $this->string_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional bytes string_value = 7;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setStringValue($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->string_value = $var;
-        $this->has_string_value = true;
-
-        return $this;
-    }
-
-    public function hasStringValue()
-    {
-        return $this->has_string_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string aggregate_value = 8;</code>
-     * @return string
-     */
-    public function getAggregateValue()
-    {
-        return $this->aggregate_value;
-    }
-
-    /**
-     * Generated from protobuf field <code>optional string aggregate_value = 8;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setAggregateValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->aggregate_value = $var;
-        $this->has_aggregate_value = true;
-
-        return $this;
-    }
-
-    public function hasAggregateValue()
-    {
-        return $this->has_aggregate_value;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php b/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php
deleted file mode 100644
index c9a6fc3..0000000
--- a/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * The name of the uninterpreted option.  Each string represents a segment in
- * a dot-separated name.  is_extension is true iff a segment represents an
- * extension (denoted with parentheses in options specs in .proto files).
- * E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
- * "foo.(bar.baz).qux".
- *
- * Generated from protobuf message <code>google.protobuf.UninterpretedOption.NamePart</code>
- */
-class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Generated from protobuf field <code>required string name_part = 1;</code>
-     */
-    private $name_part = '';
-    private $has_name_part = false;
-    /**
-     * Generated from protobuf field <code>required bool is_extension = 2;</code>
-     */
-    private $is_extension = false;
-    private $has_is_extension = false;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Generated from protobuf field <code>required string name_part = 1;</code>
-     * @return string
-     */
-    public function getNamePart()
-    {
-        return $this->name_part;
-    }
-
-    /**
-     * Generated from protobuf field <code>required string name_part = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setNamePart($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name_part = $var;
-        $this->has_name_part = true;
-
-        return $this;
-    }
-
-    public function hasNamePart()
-    {
-        return $this->has_name_part;
-    }
-
-    /**
-     * Generated from protobuf field <code>required bool is_extension = 2;</code>
-     * @return bool
-     */
-    public function getIsExtension()
-    {
-        return $this->is_extension;
-    }
-
-    /**
-     * Generated from protobuf field <code>required bool is_extension = 2;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setIsExtension($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->is_extension = $var;
-        $this->has_is_extension = true;
-
-        return $this;
-    }
-
-    public function hasIsExtension()
-    {
-        return $this->has_is_extension;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/ListValue.php b/php/src/Google/Protobuf/ListValue.php
deleted file mode 100644
index 12552ef..0000000
--- a/php/src/Google/Protobuf/ListValue.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/struct.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * `ListValue` is a wrapper around a repeated field of values.
- * The JSON representation for `ListValue` is JSON array.
- *
- * Generated from protobuf message <code>google.protobuf.ListValue</code>
- */
-class ListValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Repeated field of dynamically typed values.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Value values = 1;</code>
-     */
-    private $values;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Struct::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Repeated field of dynamically typed values.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Value values = 1;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getValues()
-    {
-        return $this->values;
-    }
-
-    /**
-     * Repeated field of dynamically typed values.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Value values = 1;</code>
-     * @param \Google\Protobuf\Value[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setValues($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Value::class);
-        $this->values = $arr;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Method.php b/php/src/Google/Protobuf/Method.php
deleted file mode 100644
index f55cb76..0000000
--- a/php/src/Google/Protobuf/Method.php
+++ /dev/null
@@ -1,249 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/api.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Method represents a method of an API interface.
- *
- * Generated from protobuf message <code>google.protobuf.Method</code>
- */
-class Method extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The simple name of this method.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * A URL of the input message type.
-     *
-     * Generated from protobuf field <code>string request_type_url = 2;</code>
-     */
-    private $request_type_url = '';
-    /**
-     * If true, the request is streamed.
-     *
-     * Generated from protobuf field <code>bool request_streaming = 3;</code>
-     */
-    private $request_streaming = false;
-    /**
-     * The URL of the output message type.
-     *
-     * Generated from protobuf field <code>string response_type_url = 4;</code>
-     */
-    private $response_type_url = '';
-    /**
-     * If true, the response is streamed.
-     *
-     * Generated from protobuf field <code>bool response_streaming = 5;</code>
-     */
-    private $response_streaming = false;
-    /**
-     * Any metadata attached to the method.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 6;</code>
-     */
-    private $options;
-    /**
-     * The source syntax of this method.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 7;</code>
-     */
-    private $syntax = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Api::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The simple name of this method.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * The simple name of this method.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * A URL of the input message type.
-     *
-     * Generated from protobuf field <code>string request_type_url = 2;</code>
-     * @return string
-     */
-    public function getRequestTypeUrl()
-    {
-        return $this->request_type_url;
-    }
-
-    /**
-     * A URL of the input message type.
-     *
-     * Generated from protobuf field <code>string request_type_url = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setRequestTypeUrl($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->request_type_url = $var;
-
-        return $this;
-    }
-
-    /**
-     * If true, the request is streamed.
-     *
-     * Generated from protobuf field <code>bool request_streaming = 3;</code>
-     * @return bool
-     */
-    public function getRequestStreaming()
-    {
-        return $this->request_streaming;
-    }
-
-    /**
-     * If true, the request is streamed.
-     *
-     * Generated from protobuf field <code>bool request_streaming = 3;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setRequestStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->request_streaming = $var;
-
-        return $this;
-    }
-
-    /**
-     * The URL of the output message type.
-     *
-     * Generated from protobuf field <code>string response_type_url = 4;</code>
-     * @return string
-     */
-    public function getResponseTypeUrl()
-    {
-        return $this->response_type_url;
-    }
-
-    /**
-     * The URL of the output message type.
-     *
-     * Generated from protobuf field <code>string response_type_url = 4;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setResponseTypeUrl($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->response_type_url = $var;
-
-        return $this;
-    }
-
-    /**
-     * If true, the response is streamed.
-     *
-     * Generated from protobuf field <code>bool response_streaming = 5;</code>
-     * @return bool
-     */
-    public function getResponseStreaming()
-    {
-        return $this->response_streaming;
-    }
-
-    /**
-     * If true, the response is streamed.
-     *
-     * Generated from protobuf field <code>bool response_streaming = 5;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setResponseStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->response_streaming = $var;
-
-        return $this;
-    }
-
-    /**
-     * Any metadata attached to the method.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 6;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * Any metadata attached to the method.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 6;</code>
-     * @param \Google\Protobuf\Option[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Option::class);
-        $this->options = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The source syntax of this method.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 7;</code>
-     * @return int
-     */
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    /**
-     * The source syntax of this method.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 7;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setSyntax($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Syntax::class);
-        $this->syntax = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Mixin.php b/php/src/Google/Protobuf/Mixin.php
deleted file mode 100644
index eb5117e..0000000
--- a/php/src/Google/Protobuf/Mixin.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/api.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Declares an API Interface to be included in this interface. The including
- * interface must redeclare all the methods from the included interface, but
- * documentation and options are inherited as follows:
- * - If after comment and whitespace stripping, the documentation
- *   string of the redeclared method is empty, it will be inherited
- *   from the original method.
- * - Each annotation belonging to the service config (http,
- *   visibility) which is not set in the redeclared method will be
- *   inherited.
- * - If an http annotation is inherited, the path pattern will be
- *   modified as follows. Any version prefix will be replaced by the
- *   version of the including interface plus the [root][] path if
- *   specified.
- * Example of a simple mixin:
- *     package google.acl.v1;
- *     service AccessControl {
- *       // Get the underlying ACL object.
- *       rpc GetAcl(GetAclRequest) returns (Acl) {
- *         option (google.api.http).get = "/v1/{resource=**}:getAcl";
- *       }
- *     }
- *     package google.storage.v2;
- *     service Storage {
- *       rpc GetAcl(GetAclRequest) returns (Acl);
- *       // Get a data record.
- *       rpc GetData(GetDataRequest) returns (Data) {
- *         option (google.api.http).get = "/v2/{resource=**}";
- *       }
- *     }
- * Example of a mixin configuration:
- *     apis:
- *     - name: google.storage.v2.Storage
- *       mixins:
- *       - name: google.acl.v1.AccessControl
- * The mixin construct implies that all methods in `AccessControl` are
- * also declared with same name and request/response types in
- * `Storage`. A documentation generator or annotation processor will
- * see the effective `Storage.GetAcl` method after inherting
- * documentation and annotations as follows:
- *     service Storage {
- *       // Get the underlying ACL object.
- *       rpc GetAcl(GetAclRequest) returns (Acl) {
- *         option (google.api.http).get = "/v2/{resource=**}:getAcl";
- *       }
- *       ...
- *     }
- * Note how the version in the path pattern changed from `v1` to `v2`.
- * If the `root` field in the mixin is specified, it should be a
- * relative path under which inherited HTTP paths are placed. Example:
- *     apis:
- *     - name: google.storage.v2.Storage
- *       mixins:
- *       - name: google.acl.v1.AccessControl
- *         root: acls
- * This implies the following inherited HTTP annotation:
- *     service Storage {
- *       // Get the underlying ACL object.
- *       rpc GetAcl(GetAclRequest) returns (Acl) {
- *         option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
- *       }
- *       ...
- *     }
- *
- * Generated from protobuf message <code>google.protobuf.Mixin</code>
- */
-class Mixin extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The fully qualified name of the interface which is included.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * If non-empty specifies a path under which inherited HTTP paths
-     * are rooted.
-     *
-     * Generated from protobuf field <code>string root = 2;</code>
-     */
-    private $root = '';
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Api::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The fully qualified name of the interface which is included.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * The fully qualified name of the interface which is included.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * If non-empty specifies a path under which inherited HTTP paths
-     * are rooted.
-     *
-     * Generated from protobuf field <code>string root = 2;</code>
-     * @return string
-     */
-    public function getRoot()
-    {
-        return $this->root;
-    }
-
-    /**
-     * If non-empty specifies a path under which inherited HTTP paths
-     * are rooted.
-     *
-     * Generated from protobuf field <code>string root = 2;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setRoot($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->root = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/NullValue.php b/php/src/Google/Protobuf/NullValue.php
deleted file mode 100644
index d4022cc..0000000
--- a/php/src/Google/Protobuf/NullValue.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/struct.proto
-
-namespace Google\Protobuf;
-
-/**
- * `NullValue` is a singleton enumeration to represent the null value for the
- * `Value` type union.
- *  The JSON representation for `NullValue` is JSON `null`.
- *
- * Protobuf enum <code>Google\Protobuf\NullValue</code>
- */
-class NullValue
-{
-    /**
-     * Null value.
-     *
-     * Generated from protobuf enum <code>NULL_VALUE = 0;</code>
-     */
-    const NULL_VALUE = 0;
-}
-
diff --git a/php/src/Google/Protobuf/OneofDescriptor.php b/php/src/Google/Protobuf/OneofDescriptor.php
deleted file mode 100644
index d973663..0000000
--- a/php/src/Google/Protobuf/OneofDescriptor.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GetPublicDescriptorTrait;
-
-class OneofDescriptor
-{
-    use GetPublicDescriptorTrait;
-
-    private $internal_desc;
-
-    /**
-     * @internal
-     */
-    public function __construct($internal_desc)
-    {
-        $this->internal_desc = $internal_desc;
-    }
-
-    /**
-     * @return string The name of the oneof
-     */
-    public function getName()
-    {
-        return $this->internal_desc->getName();
-    }
-
-    /**
-     * @param int $index Must be >= 0 and < getFieldCount()
-     * @return FieldDescriptor
-     */
-    public function getField($index)
-    {
-        return $this->getPublicDescriptor($this->internal_desc->getFields()[$index]);
-    }
-
-    /**
-     * @return int Number of fields in the oneof
-     */
-    public function getFieldCount()
-    {
-        return count($this->internal_desc->getFields());
-    }
-}
diff --git a/php/src/Google/Protobuf/Option.php b/php/src/Google/Protobuf/Option.php
deleted file mode 100644
index f803868..0000000
--- a/php/src/Google/Protobuf/Option.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A protocol buffer option, which can be attached to a message, field,
- * enumeration, etc.
- *
- * Generated from protobuf message <code>google.protobuf.Option</code>
- */
-class Option extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The option's name. For protobuf built-in options (options defined in
-     * descriptor.proto), this is the short name. For example, `"map_entry"`.
-     * For custom options, it should be the fully-qualified name. For example,
-     * `"google.api.http"`.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * The option's value packed in an Any message. If the value is a primitive,
-     * the corresponding wrapper type defined in google/protobuf/wrappers.proto
-     * should be used. If the value is an enum, it should be stored as an int32
-     * value using the google.protobuf.Int32Value type.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Any value = 2;</code>
-     */
-    private $value = null;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Type::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The option's name. For protobuf built-in options (options defined in
-     * descriptor.proto), this is the short name. For example, `"map_entry"`.
-     * For custom options, it should be the fully-qualified name. For example,
-     * `"google.api.http"`.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * The option's name. For protobuf built-in options (options defined in
-     * descriptor.proto), this is the short name. For example, `"map_entry"`.
-     * For custom options, it should be the fully-qualified name. For example,
-     * `"google.api.http"`.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * The option's value packed in an Any message. If the value is a primitive,
-     * the corresponding wrapper type defined in google/protobuf/wrappers.proto
-     * should be used. If the value is an enum, it should be stored as an int32
-     * value using the google.protobuf.Int32Value type.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Any value = 2;</code>
-     * @return \Google\Protobuf\Any
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The option's value packed in an Any message. If the value is a primitive,
-     * the corresponding wrapper type defined in google/protobuf/wrappers.proto
-     * should be used. If the value is an enum, it should be stored as an int32
-     * value using the google.protobuf.Int32Value type.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Any value = 2;</code>
-     * @param \Google\Protobuf\Any $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Any::class);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/SourceContext.php b/php/src/Google/Protobuf/SourceContext.php
deleted file mode 100644
index 07d90c6..0000000
--- a/php/src/Google/Protobuf/SourceContext.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/source_context.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * `SourceContext` represents information about the source of a
- * protobuf element, like the file in which it is defined.
- *
- * Generated from protobuf message <code>google.protobuf.SourceContext</code>
- */
-class SourceContext extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The path-qualified name of the .proto file that contained the associated
-     * protobuf element.  For example: `"google/protobuf/source_context.proto"`.
-     *
-     * Generated from protobuf field <code>string file_name = 1;</code>
-     */
-    private $file_name = '';
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\SourceContext::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The path-qualified name of the .proto file that contained the associated
-     * protobuf element.  For example: `"google/protobuf/source_context.proto"`.
-     *
-     * Generated from protobuf field <code>string file_name = 1;</code>
-     * @return string
-     */
-    public function getFileName()
-    {
-        return $this->file_name;
-    }
-
-    /**
-     * The path-qualified name of the .proto file that contained the associated
-     * protobuf element.  For example: `"google/protobuf/source_context.proto"`.
-     *
-     * Generated from protobuf field <code>string file_name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setFileName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->file_name = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/StringValue.php b/php/src/Google/Protobuf/StringValue.php
deleted file mode 100644
index f6bcc48..0000000
--- a/php/src/Google/Protobuf/StringValue.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `string`.
- * The JSON representation for `StringValue` is JSON string.
- *
- * Generated from protobuf message <code>google.protobuf.StringValue</code>
- */
-class StringValue extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The string value.
-     *
-     * Generated from protobuf field <code>string value = 1;</code>
-     */
-    private $value = '';
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The string value.
-     *
-     * Generated from protobuf field <code>string value = 1;</code>
-     * @return string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The string value.
-     *
-     * Generated from protobuf field <code>string value = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Struct.php b/php/src/Google/Protobuf/Struct.php
deleted file mode 100644
index 721e991..0000000
--- a/php/src/Google/Protobuf/Struct.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/struct.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * `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
- * scripting languages like JS a struct is represented as an
- * object. The details of that representation are described together
- * with the proto support for the language.
- * The JSON representation for `Struct` is JSON object.
- *
- * Generated from protobuf message <code>google.protobuf.Struct</code>
- */
-class Struct extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * Unordered map of dynamically typed values.
-     *
-     * Generated from protobuf field <code>map<string, .google.protobuf.Value> fields = 1;</code>
-     */
-    private $fields;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Struct::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Unordered map of dynamically typed values.
-     *
-     * Generated from protobuf field <code>map<string, .google.protobuf.Value> fields = 1;</code>
-     * @return \Google\Protobuf\Internal\MapField
-     */
-    public function getFields()
-    {
-        return $this->fields;
-    }
-
-    /**
-     * Unordered map of dynamically typed values.
-     *
-     * Generated from protobuf field <code>map<string, .google.protobuf.Value> fields = 1;</code>
-     * @param array|\Google\Protobuf\Internal\MapField $var
-     * @return $this
-     */
-    public function setFields($var)
-    {
-        $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Value::class);
-        $this->fields = $arr;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Syntax.php b/php/src/Google/Protobuf/Syntax.php
deleted file mode 100644
index bb7b789..0000000
--- a/php/src/Google/Protobuf/Syntax.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-/**
- * The syntax in which a protocol buffer element is defined.
- *
- * Protobuf enum <code>Google\Protobuf\Syntax</code>
- */
-class Syntax
-{
-    /**
-     * Syntax `proto2`.
-     *
-     * Generated from protobuf enum <code>SYNTAX_PROTO2 = 0;</code>
-     */
-    const SYNTAX_PROTO2 = 0;
-    /**
-     * Syntax `proto3`.
-     *
-     * Generated from protobuf enum <code>SYNTAX_PROTO3 = 1;</code>
-     */
-    const SYNTAX_PROTO3 = 1;
-}
-
diff --git a/php/src/Google/Protobuf/Timestamp.php b/php/src/Google/Protobuf/Timestamp.php
deleted file mode 100644
index 7da8e95..0000000
--- a/php/src/Google/Protobuf/Timestamp.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/timestamp.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A Timestamp represents a point in time independent of any time zone
- * or calendar, represented as seconds and fractions of seconds at
- * nanosecond resolution in UTC Epoch time. It is encoded using the
- * Proleptic Gregorian Calendar which extends the Gregorian calendar
- * backwards to year one. It is encoded assuming all minutes are 60
- * seconds long, i.e. leap seconds are "smeared" so that no leap second
- * table is needed for interpretation. Range is from
- * 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
- * By restricting to that range, we ensure that we can convert to
- * and from  RFC 3339 date strings.
- * See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
- * # Examples
- * Example 1: Compute Timestamp from POSIX `time()`.
- *     Timestamp timestamp;
- *     timestamp.set_seconds(time(NULL));
- *     timestamp.set_nanos(0);
- * Example 2: Compute Timestamp from POSIX `gettimeofday()`.
- *     struct timeval tv;
- *     gettimeofday(&tv, NULL);
- *     Timestamp timestamp;
- *     timestamp.set_seconds(tv.tv_sec);
- *     timestamp.set_nanos(tv.tv_usec * 1000);
- * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
- *     FILETIME ft;
- *     GetSystemTimeAsFileTime(&ft);
- *     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
- *     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
- *     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
- *     Timestamp timestamp;
- *     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
- *     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
- * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
- *     long millis = System.currentTimeMillis();
- *     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
- *         .setNanos((int) ((millis % 1000) * 1000000)).build();
- * Example 5: Compute Timestamp from current time in Python.
- *     timestamp = Timestamp()
- *     timestamp.GetCurrentTime()
- * # JSON Mapping
- * In JSON format, the Timestamp type is encoded as a string in the
- * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
- * format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
- * where {year} is always expressed using four digits while {month}, {day},
- * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
- * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
- * are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
- * is required, though only UTC (as indicated by "Z") is presently supported.
- * For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
- * 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]
- * 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()`](
- * http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--)
- * to obtain a formatter capable of generating timestamps in this format.
- *
- * Generated from protobuf message <code>google.protobuf.Timestamp</code>
- */
-class Timestamp extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * 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.
-     *
-     * Generated from protobuf field <code>int64 seconds = 1;</code>
-     */
-    private $seconds = 0;
-    /**
-     * Non-negative fractions of a second at nanosecond resolution. Negative
-     * second values with fractions must still have non-negative nanos values
-     * that count forward in time. Must be from 0 to 999,999,999
-     * inclusive.
-     *
-     * Generated from protobuf field <code>int32 nanos = 2;</code>
-     */
-    private $nanos = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Timestamp::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * 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.
-     *
-     * Generated from protobuf field <code>int64 seconds = 1;</code>
-     * @return int|string
-     */
-    public function getSeconds()
-    {
-        return $this->seconds;
-    }
-
-    /**
-     * 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.
-     *
-     * Generated from protobuf field <code>int64 seconds = 1;</code>
-     * @param int|string $var
-     * @return $this
-     */
-    public function setSeconds($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->seconds = $var;
-
-        return $this;
-    }
-
-    /**
-     * Non-negative fractions of a second at nanosecond resolution. Negative
-     * second values with fractions must still have non-negative nanos values
-     * that count forward in time. Must be from 0 to 999,999,999
-     * inclusive.
-     *
-     * Generated from protobuf field <code>int32 nanos = 2;</code>
-     * @return int
-     */
-    public function getNanos()
-    {
-        return $this->nanos;
-    }
-
-    /**
-     * Non-negative fractions of a second at nanosecond resolution. Negative
-     * second values with fractions must still have non-negative nanos values
-     * that count forward in time. Must be from 0 to 999,999,999
-     * inclusive.
-     *
-     * Generated from protobuf field <code>int32 nanos = 2;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNanos($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->nanos = $var;
-
-        return $this;
-    }
-
-    /**
-     * Converts PHP DateTime to Timestamp.
-     *
-     * @param DateTime $datetime
-     */
-    public function fromDateTime($datetime)
-    {
-        if (get_class($datetime) !== \DateTime::class) {
-            trigger_error("Given parameter is not a DateTime.",
-                          E_USER_ERROR);
-        }
-        $this->seconds = $datetime->format('U');
-        $this->nanos = 0;
-    }
-
-    /**
-     * Converts Timestamp to PHP DateTime. Nano second is ignored.
-     *
-     * @return DateTime $datetime
-     */
-    public function toDateTime()
-    {
-        return \DateTime::createFromFormat('U', $this->seconds);
-    }
-}
-
diff --git a/php/src/Google/Protobuf/Type.php b/php/src/Google/Protobuf/Type.php
deleted file mode 100644
index 7dbe2ca..0000000
--- a/php/src/Google/Protobuf/Type.php
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/type.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * A protocol buffer message type.
- *
- * Generated from protobuf message <code>google.protobuf.Type</code>
- */
-class Type extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The fully qualified message name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     */
-    private $name = '';
-    /**
-     * The list of fields.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Field fields = 2;</code>
-     */
-    private $fields;
-    /**
-     * The list of types appearing in `oneof` definitions in this type.
-     *
-     * Generated from protobuf field <code>repeated string oneofs = 3;</code>
-     */
-    private $oneofs;
-    /**
-     * The protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 4;</code>
-     */
-    private $options;
-    /**
-     * The source context.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 5;</code>
-     */
-    private $source_context = null;
-    /**
-     * The source syntax.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 6;</code>
-     */
-    private $syntax = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Type::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The fully qualified message name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * The fully qualified message name.
-     *
-     * Generated from protobuf field <code>string name = 1;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-
-        return $this;
-    }
-
-    /**
-     * The list of fields.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Field fields = 2;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getFields()
-    {
-        return $this->fields;
-    }
-
-    /**
-     * The list of fields.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Field fields = 2;</code>
-     * @param \Google\Protobuf\Field[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setFields($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Field::class);
-        $this->fields = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The list of types appearing in `oneof` definitions in this type.
-     *
-     * Generated from protobuf field <code>repeated string oneofs = 3;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOneofs()
-    {
-        return $this->oneofs;
-    }
-
-    /**
-     * The list of types appearing in `oneof` definitions in this type.
-     *
-     * Generated from protobuf field <code>repeated string oneofs = 3;</code>
-     * @param string[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOneofs($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
-        $this->oneofs = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 4;</code>
-     * @return \Google\Protobuf\Internal\RepeatedField
-     */
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    /**
-     * The protocol buffer options.
-     *
-     * Generated from protobuf field <code>repeated .google.protobuf.Option options = 4;</code>
-     * @param \Google\Protobuf\Option[]|\Google\Protobuf\Internal\RepeatedField $var
-     * @return $this
-     */
-    public function setOptions($var)
-    {
-        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Option::class);
-        $this->options = $arr;
-
-        return $this;
-    }
-
-    /**
-     * The source context.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 5;</code>
-     * @return \Google\Protobuf\SourceContext
-     */
-    public function getSourceContext()
-    {
-        return $this->source_context;
-    }
-
-    /**
-     * The source context.
-     *
-     * Generated from protobuf field <code>.google.protobuf.SourceContext source_context = 5;</code>
-     * @param \Google\Protobuf\SourceContext $var
-     * @return $this
-     */
-    public function setSourceContext($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\SourceContext::class);
-        $this->source_context = $var;
-
-        return $this;
-    }
-
-    /**
-     * The source syntax.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 6;</code>
-     * @return int
-     */
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    /**
-     * The source syntax.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Syntax syntax = 6;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setSyntax($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Syntax::class);
-        $this->syntax = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/UInt32Value.php b/php/src/Google/Protobuf/UInt32Value.php
deleted file mode 100644
index 61a3ddf..0000000
--- a/php/src/Google/Protobuf/UInt32Value.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `uint32`.
- * The JSON representation for `UInt32Value` is JSON number.
- *
- * Generated from protobuf message <code>google.protobuf.UInt32Value</code>
- */
-class UInt32Value extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The uint32 value.
-     *
-     * Generated from protobuf field <code>uint32 value = 1;</code>
-     */
-    private $value = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The uint32 value.
-     *
-     * Generated from protobuf field <code>uint32 value = 1;</code>
-     * @return int
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The uint32 value.
-     *
-     * Generated from protobuf field <code>uint32 value = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/UInt64Value.php b/php/src/Google/Protobuf/UInt64Value.php
deleted file mode 100644
index 69f7eb8..0000000
--- a/php/src/Google/Protobuf/UInt64Value.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/wrappers.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Wrapper message for `uint64`.
- * The JSON representation for `UInt64Value` is JSON string.
- *
- * Generated from protobuf message <code>google.protobuf.UInt64Value</code>
- */
-class UInt64Value extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * The uint64 value.
-     *
-     * Generated from protobuf field <code>uint64 value = 1;</code>
-     */
-    private $value = 0;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Wrappers::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * The uint64 value.
-     *
-     * Generated from protobuf field <code>uint64 value = 1;</code>
-     * @return int|string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * The uint64 value.
-     *
-     * Generated from protobuf field <code>uint64 value = 1;</code>
-     * @param int|string $var
-     * @return $this
-     */
-    public function setValue($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->value = $var;
-
-        return $this;
-    }
-
-}
-
diff --git a/php/src/Google/Protobuf/Value.php b/php/src/Google/Protobuf/Value.php
deleted file mode 100644
index 052a377..0000000
--- a/php/src/Google/Protobuf/Value.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/struct.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * `Value` represents a dynamically typed value which can be either
- * null, a number, a string, a boolean, a recursive struct value, or a
- * list of values. A producer of value is expected to set one of that
- * variants, absence of any variant indicates an error.
- * The JSON representation for `Value` is JSON value.
- *
- * Generated from protobuf message <code>google.protobuf.Value</code>
- */
-class Value extends \Google\Protobuf\Internal\Message
-{
-    protected $kind;
-
-    public function __construct() {
-        \GPBMetadata\Google\Protobuf\Struct::initOnce();
-        parent::__construct();
-    }
-
-    /**
-     * Represents a null value.
-     *
-     * Generated from protobuf field <code>.google.protobuf.NullValue null_value = 1;</code>
-     * @return int
-     */
-    public function getNullValue()
-    {
-        return $this->readOneof(1);
-    }
-
-    /**
-     * Represents a null value.
-     *
-     * Generated from protobuf field <code>.google.protobuf.NullValue null_value = 1;</code>
-     * @param int $var
-     * @return $this
-     */
-    public function setNullValue($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\NullValue::class);
-        $this->writeOneof(1, $var);
-
-        return $this;
-    }
-
-    /**
-     * Represents a double value.
-     *
-     * Generated from protobuf field <code>double number_value = 2;</code>
-     * @return float
-     */
-    public function getNumberValue()
-    {
-        return $this->readOneof(2);
-    }
-
-    /**
-     * Represents a double value.
-     *
-     * Generated from protobuf field <code>double number_value = 2;</code>
-     * @param float $var
-     * @return $this
-     */
-    public function setNumberValue($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->writeOneof(2, $var);
-
-        return $this;
-    }
-
-    /**
-     * Represents a string value.
-     *
-     * Generated from protobuf field <code>string string_value = 3;</code>
-     * @return string
-     */
-    public function getStringValue()
-    {
-        return $this->readOneof(3);
-    }
-
-    /**
-     * Represents a string value.
-     *
-     * Generated from protobuf field <code>string string_value = 3;</code>
-     * @param string $var
-     * @return $this
-     */
-    public function setStringValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->writeOneof(3, $var);
-
-        return $this;
-    }
-
-    /**
-     * Represents a boolean value.
-     *
-     * Generated from protobuf field <code>bool bool_value = 4;</code>
-     * @return bool
-     */
-    public function getBoolValue()
-    {
-        return $this->readOneof(4);
-    }
-
-    /**
-     * Represents a boolean value.
-     *
-     * Generated from protobuf field <code>bool bool_value = 4;</code>
-     * @param bool $var
-     * @return $this
-     */
-    public function setBoolValue($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->writeOneof(4, $var);
-
-        return $this;
-    }
-
-    /**
-     * Represents a structured value.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Struct struct_value = 5;</code>
-     * @return \Google\Protobuf\Struct
-     */
-    public function getStructValue()
-    {
-        return $this->readOneof(5);
-    }
-
-    /**
-     * Represents a structured value.
-     *
-     * Generated from protobuf field <code>.google.protobuf.Struct struct_value = 5;</code>
-     * @param \Google\Protobuf\Struct $var
-     * @return $this
-     */
-    public function setStructValue($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Struct::class);
-        $this->writeOneof(5, $var);
-
-        return $this;
-    }
-
-    /**
-     * Represents a repeated `Value`.
-     *
-     * Generated from protobuf field <code>.google.protobuf.ListValue list_value = 6;</code>
-     * @return \Google\Protobuf\ListValue
-     */
-    public function getListValue()
-    {
-        return $this->readOneof(6);
-    }
-
-    /**
-     * Represents a repeated `Value`.
-     *
-     * Generated from protobuf field <code>.google.protobuf.ListValue list_value = 6;</code>
-     * @param \Google\Protobuf\ListValue $var
-     * @return $this
-     */
-    public function setListValue($var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\ListValue::class);
-        $this->writeOneof(6, $var);
-
-        return $this;
-    }
-
-    /**
-     * @return string
-     */
-    public function getKind()
-    {
-        return $this->whichOneof("kind");
-    }
-
-}
-
diff --git a/php/src/phpdoc.dist.xml b/php/src/phpdoc.dist.xml
deleted file mode 100644
index dd31302..0000000
--- a/php/src/phpdoc.dist.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!-- Install phpDocumentor to generate docs. -->
-<phpdoc>
-  <parser>
-    <target>doc</target>
-  </parser>
-  <transformer>
-    <target>doc</target>
-  </transformer>
-  <files>
-    <file>Google/Protobuf/Internal/MapField.php</file>
-    <file>Google/Protobuf/Internal/Message.php</file>
-    <file>Google/Protobuf/Internal/RepeatedField.php</file>
-  </files>
-</phpdoc>
diff --git a/php/tests/array_test.php b/php/tests/array_test.php
deleted file mode 100644
index 1a26d72..0000000
--- a/php/tests/array_test.php
+++ /dev/null
@@ -1,554 +0,0 @@
-<?php
-
-require_once('test_util.php');
-
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBType;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-
-class RepeatedFieldTest extends PHPUnit_Framework_TestCase
-{
-
-    #########################################################
-    # Test int32 field.
-    #########################################################
-
-    public function testInt32()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-
-        // Test append.
-        $arr[] = MAX_INT32;
-        $this->assertSame(MAX_INT32, $arr[0]);
-        $arr[] = MIN_INT32;
-        $this->assertSame(MIN_INT32, $arr[1]);
-
-        $arr[] = 1.1;
-        $this->assertSame(1, $arr[2]);
-        $arr[] = MAX_INT32_FLOAT;
-        $this->assertSame(MAX_INT32, $arr[3]);
-        $arr[] = MAX_INT32_FLOAT;
-        $this->assertSame(MAX_INT32, $arr[4]);
-
-        $arr[] = '2';
-        $this->assertSame(2, $arr[5]);
-        $arr[] = '3.1';
-        $this->assertSame(3, $arr[6]);
-        $arr[] = MAX_INT32_STRING;
-        $this->assertSame(MAX_INT32, $arr[7]);
-
-        $this->assertEquals(8, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            $this->assertSame(0, $arr[$i]);
-        }
-
-        // Test set.
-        $arr[0] = MAX_INT32;
-        $this->assertSame(MAX_INT32, $arr[0]);
-        $arr[1] = MIN_INT32;
-        $this->assertSame(MIN_INT32, $arr[1]);
-
-        $arr[2] = 1.1;
-        $this->assertSame(1, $arr[2]);
-        $arr[3] = MAX_INT32_FLOAT;
-        $this->assertSame(MAX_INT32, $arr[3]);
-        $arr[4] = MAX_INT32_FLOAT;
-        $this->assertSame(MAX_INT32, $arr[4]);
-
-        $arr[5] = '2';
-        $this->assertSame(2, $arr[5]);
-        $arr[6] = '3.1';
-        $this->assertSame(3, $arr[6]);
-        $arr[7] = MAX_INT32_STRING;
-        $this->assertSame(MAX_INT32, $arr[7]);
-
-        // Test foreach.
-        $arr = new RepeatedField(GPBType::INT32);
-        for ($i = 0; $i < 3; $i++) {
-          $arr[] = $i;
-        }
-        $i = 0;
-        foreach ($arr as $val) {
-          $this->assertSame($i++, $val);
-        }
-        $this->assertSame(3, $i);
-    }
-
-    #########################################################
-    # Test uint32 field.
-    #########################################################
-
-    public function testUint32()
-    {
-        $arr = new RepeatedField(GPBType::UINT32);
-
-        // Test append.
-        $arr[] = MAX_UINT32;
-        $this->assertSame(-1, $arr[0]);
-        $arr[] = -1;
-        $this->assertSame(-1, $arr[1]);
-        $arr[] = MIN_UINT32;
-        $this->assertSame(MIN_UINT32, $arr[2]);
-
-        $arr[] = 1.1;
-        $this->assertSame(1, $arr[3]);
-        $arr[] = MAX_UINT32_FLOAT;
-        $this->assertSame(-1, $arr[4]);
-        $arr[] = -1.0;
-        $this->assertSame(-1, $arr[5]);
-        $arr[] = MIN_UINT32_FLOAT;
-        $this->assertSame(MIN_UINT32, $arr[6]);
-
-        $arr[] = '2';
-        $this->assertSame(2, $arr[7]);
-        $arr[] = '3.1';
-        $this->assertSame(3, $arr[8]);
-        $arr[] = MAX_UINT32_STRING;
-        $this->assertSame(-1, $arr[9]);
-        $arr[] = '-1.0';
-        $this->assertSame(-1, $arr[10]);
-        $arr[] = MIN_UINT32_STRING;
-        $this->assertSame(MIN_UINT32, $arr[11]);
-
-        $this->assertEquals(12, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            $this->assertSame(0, $arr[$i]);
-        }
-
-        // Test set.
-        $arr[0] = MAX_UINT32;
-        $this->assertSame(-1, $arr[0]);
-        $arr[1] = -1;
-        $this->assertSame(-1, $arr[1]);
-        $arr[2] = MIN_UINT32;
-        $this->assertSame(MIN_UINT32, $arr[2]);
-
-        $arr[3] = 1.1;
-        $this->assertSame(1, $arr[3]);
-        $arr[4] = MAX_UINT32_FLOAT;
-        $this->assertSame(-1, $arr[4]);
-        $arr[5] = -1.0;
-        $this->assertSame(-1, $arr[5]);
-        $arr[6] = MIN_UINT32_FLOAT;
-        $this->assertSame(MIN_UINT32, $arr[6]);
-
-        $arr[7] = '2';
-        $this->assertSame(2, $arr[7]);
-        $arr[8] = '3.1';
-        $this->assertSame(3, $arr[8]);
-        $arr[9] = MAX_UINT32_STRING;
-        $this->assertSame(-1, $arr[9]);
-        $arr[10] = '-1.0';
-        $this->assertSame(-1, $arr[10]);
-        $arr[11] = MIN_UINT32_STRING;
-        $this->assertSame(MIN_UINT32, $arr[11]);
-    }
-
-    #########################################################
-    # Test int64 field.
-    #########################################################
-
-    public function testInt64()
-    {
-        $arr = new RepeatedField(GPBType::INT64);
-
-        // Test append.
-        $arr[] = MAX_INT64;
-        $arr[] = MIN_INT64;
-        $arr[] = 1.1;
-        $arr[] = '2';
-        $arr[] = '3.1';
-        $arr[] = MAX_INT64_STRING;
-        $arr[] = MIN_INT64_STRING;
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_INT64, $arr[0]);
-            $this->assertSame(MIN_INT64, $arr[1]);
-            $this->assertSame('1', $arr[2]);
-            $this->assertSame('2', $arr[3]);
-            $this->assertSame('3', $arr[4]);
-            $this->assertSame(MAX_INT64_STRING, $arr[5]);
-            $this->assertSame(MIN_INT64_STRING, $arr[6]);
-        } else {
-            $this->assertSame(MAX_INT64, $arr[0]);
-            $this->assertSame(MIN_INT64, $arr[1]);
-            $this->assertSame(1, $arr[2]);
-            $this->assertSame(2, $arr[3]);
-            $this->assertSame(3, $arr[4]);
-            $this->assertSame(MAX_INT64, $arr[5]);
-            $this->assertSame(MIN_INT64, $arr[6]);
-        }
-
-
-        $this->assertEquals(7, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            if (PHP_INT_SIZE == 4) {
-                $this->assertSame('0', $arr[$i]);
-            } else {
-                $this->assertSame(0, $arr[$i]);
-            }
-        }
-
-        // Test set.
-        $arr[0] = MAX_INT64;
-        $arr[1] = MIN_INT64;
-        $arr[2] = 1.1;
-        $arr[3] = '2';
-        $arr[4] = '3.1';
-        $arr[5] = MAX_INT64_STRING;
-        $arr[6] = MIN_INT64_STRING;
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_INT64_STRING, $arr[0]);
-            $this->assertSame(MIN_INT64_STRING, $arr[1]);
-            $this->assertSame('1', $arr[2]);
-            $this->assertSame('2', $arr[3]);
-            $this->assertSame('3', $arr[4]);
-            $this->assertSame(MAX_INT64_STRING, $arr[5]);
-            $this->assertEquals(MIN_INT64_STRING, $arr[6]);
-        } else {
-            $this->assertSame(MAX_INT64, $arr[0]);
-            $this->assertSame(MIN_INT64, $arr[1]);
-            $this->assertSame(1, $arr[2]);
-            $this->assertSame(2, $arr[3]);
-            $this->assertSame(3, $arr[4]);
-            $this->assertSame(MAX_INT64, $arr[5]);
-            $this->assertEquals(MIN_INT64, $arr[6]);
-        }
-    }
-
-    #########################################################
-    # Test uint64 field.
-    #########################################################
-
-    public function testUint64()
-    {
-        $arr = new RepeatedField(GPBType::UINT64);
-
-        // Test append.
-        $arr[] = MAX_UINT64;
-        $arr[] = 1.1;
-        $arr[] = '2';
-        $arr[] = '3.1';
-        $arr[] = MAX_UINT64_STRING;
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_UINT64_STRING, $arr[0]);
-            $this->assertSame('1', $arr[1]);
-            $this->assertSame('2', $arr[2]);
-            $this->assertSame('3', $arr[3]);
-            $this->assertSame(MAX_UINT64_STRING, $arr[4]);
-        } else {
-            $this->assertSame(MAX_UINT64, $arr[0]);
-            $this->assertSame(1, $arr[1]);
-            $this->assertSame(2, $arr[2]);
-            $this->assertSame(3, $arr[3]);
-            $this->assertSame(MAX_UINT64, $arr[4]);
-            $this->assertSame(5, count($arr));
-        }
-
-        $this->assertSame(5, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            if (PHP_INT_SIZE == 4) {
-                $this->assertSame('0', $arr[$i]);
-            } else {
-                $this->assertSame(0, $arr[$i]);
-            }
-        }
-
-        // Test set.
-        $arr[0] = MAX_UINT64;
-        $arr[1] = 1.1;
-        $arr[2] = '2';
-        $arr[3] = '3.1';
-        $arr[4] = MAX_UINT64_STRING;
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_UINT64_STRING, $arr[0]);
-            $this->assertSame('1', $arr[1]);
-            $this->assertSame('2', $arr[2]);
-            $this->assertSame('3', $arr[3]);
-            $this->assertSame(MAX_UINT64_STRING, $arr[4]);
-        } else {
-            $this->assertSame(MAX_UINT64, $arr[0]);
-            $this->assertSame(1, $arr[1]);
-            $this->assertSame(2, $arr[2]);
-            $this->assertSame(3, $arr[3]);
-            $this->assertSame(MAX_UINT64, $arr[4]);
-        }
-    }
-
-    #########################################################
-    # Test float field.
-    #########################################################
-
-    public function testFloat()
-    {
-        $arr = new RepeatedField(GPBType::FLOAT);
-
-        // Test append.
-        $arr[] = 1;
-        $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
-
-        $arr[] = 1.1;
-        $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
-
-        $arr[] = '2';
-        $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
-        $arr[] = '3.1';
-        $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
-
-        $this->assertEquals(4, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            $this->assertSame(0.0, $arr[$i]);
-        }
-
-        // Test set.
-        $arr[0] = 1;
-        $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
-
-        $arr[1] = 1.1;
-        $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
-
-        $arr[2] = '2';
-        $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
-        $arr[3] = '3.1';
-        $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
-    }
-
-    #########################################################
-    # Test double field.
-    #########################################################
-
-    public function testDouble()
-    {
-        $arr = new RepeatedField(GPBType::DOUBLE);
-
-        // Test append.
-        $arr[] = 1;
-        $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
-
-        $arr[] = 1.1;
-        $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
-
-        $arr[] = '2';
-        $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
-        $arr[] = '3.1';
-        $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
-
-        $this->assertEquals(4, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            $this->assertSame(0.0, $arr[$i]);
-        }
-
-        // Test set.
-        $arr[0] = 1;
-        $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
-
-        $arr[1] = 1.1;
-        $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
-
-        $arr[2] = '2';
-        $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
-        $arr[3] = '3.1';
-        $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
-    }
-
-    #########################################################
-    # Test bool field.
-    #########################################################
-
-    public function testBool()
-    {
-        $arr = new RepeatedField(GPBType::BOOL);
-
-        // Test append.
-        $arr[] = true;
-        $this->assertSame(true, $arr[0]);
-
-        $arr[] = -1;
-        $this->assertSame(true, $arr[1]);
-
-        $arr[] = 1.1;
-        $this->assertSame(true, $arr[2]);
-
-        $arr[] = '';
-        $this->assertSame(false, $arr[3]);
-
-        $this->assertEquals(4, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = 0;
-            $this->assertSame(false, $arr[$i]);
-        }
-
-        // Test set.
-        $arr[0] = true;
-        $this->assertSame(true, $arr[0]);
-
-        $arr[1] = -1;
-        $this->assertSame(true, $arr[1]);
-
-        $arr[2] = 1.1;
-        $this->assertSame(true, $arr[2]);
-
-        $arr[3] = '';
-        $this->assertSame(false, $arr[3]);
-    }
-
-    #########################################################
-    # Test string field.
-    #########################################################
-
-    public function testString()
-    {
-        $arr = new RepeatedField(GPBType::STRING);
-
-        // Test append.
-        $arr[] = 'abc';
-        $this->assertSame('abc', $arr[0]);
-
-        $arr[] = 1;
-        $this->assertSame('1', $arr[1]);
-
-        $arr[] = 1.1;
-        $this->assertSame('1.1', $arr[2]);
-
-        $arr[] = true;
-        $this->assertSame('1', $arr[3]);
-
-        $this->assertEquals(4, count($arr));
-
-        for ($i = 0; $i < count($arr); $i++) {
-            $arr[$i] = '';
-            $this->assertSame('', $arr[$i]);
-        }
-
-        // Test set.
-        $arr[0] = 'abc';
-        $this->assertSame('abc', $arr[0]);
-
-        $arr[1] = 1;
-        $this->assertSame('1', $arr[1]);
-
-        $arr[2] = 1.1;
-        $this->assertSame('1.1', $arr[2]);
-
-        $arr[3] = true;
-        $this->assertSame('1', $arr[3]);
-    }
-
-    #########################################################
-    # Test message field.
-    #########################################################
-
-    public function testMessage()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-
-        // Test append.
-        $sub_m = new TestMessage_Sub();
-        $sub_m->setA(1);
-        $arr[] = $sub_m;
-        $this->assertSame(1, $arr[0]->getA());
-
-        $this->assertEquals(1, count($arr));
-
-        // Test set.
-        $sub_m = new TestMessage_Sub();
-        $sub_m->setA(2);
-        $arr[0] = $sub_m;
-        $this->assertSame(2, $arr[0]->getA());
-
-        // Test foreach.
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        for ($i = 0; $i < 3; $i++) {
-          $arr[] = new TestMessage_Sub();
-          $arr[$i]->setA($i);
-        }
-        $i = 0;
-        foreach ($arr as $val) {
-          $this->assertSame($i++, $val->getA());
-        }
-        $this->assertSame(3, $i);
-    }
-
-    #########################################################
-    # Test offset type
-    #########################################################
-
-    public function testOffset()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = 0;
-
-        $arr[0] = 1;
-        $this->assertSame(1, $arr[0]);
-        $this->assertSame(1, count($arr));
-
-        $arr['0'] = 2;
-        $this->assertSame(2, $arr['0']);
-        $this->assertSame(2, $arr[0]);
-        $this->assertSame(1, count($arr));
-
-        $arr[0.0] = 3;
-        $this->assertSame(3, $arr[0.0]);
-        $this->assertSame(1, count($arr));
-    }
-
-    public function testInsertRemoval()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-
-        $arr[] = 0;
-        $arr[] = 1;
-        $arr[] = 2;
-        $this->assertSame(3, count($arr));
-
-        unset($arr[2]);
-        $this->assertSame(2, count($arr));
-        $this->assertSame(0, $arr[0]);
-        $this->assertSame(1, $arr[1]);
-
-        $arr[] = 3;
-        $this->assertSame(3, count($arr));
-        $this->assertSame(0, $arr[0]);
-        $this->assertSame(1, $arr[1]);
-        $this->assertSame(3, $arr[2]);
-    }
-
-    #########################################################
-    # Test memory leak
-    #########################################################
-
-    public function testCycleLeak()
-    {
-        gc_collect_cycles();
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
-        $arr[] = new TestMessage;
-        $arr[0]->SetRepeatedRecursive($arr);
-
-        // Clean up memory before test.
-        gc_collect_cycles();
-        $start = memory_get_usage();
-        unset($arr);
-
-        // Explicitly trigger garbage collection.
-        gc_collect_cycles();
-
-        $end = memory_get_usage();
-        $this->assertLessThan($start, $end);
-    }
-}
diff --git a/php/tests/autoload.php b/php/tests/autoload.php
old mode 100755
new mode 100644
index b98b13a..af88ba0
--- a/php/tests/autoload.php
+++ b/php/tests/autoload.php
@@ -1,27 +1,4 @@
 <?php
 
-error_reporting(E_ALL);
-
-function getGeneratedFiles($dir, &$results = array())
-{
-    $files = scandir($dir);
-
-    foreach ($files as $key => $value) {
-        $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
-        if (!is_dir($path)) {
-            $results[] = $path;
-        } else if ($value != "." && $value != "..") {
-            getGeneratedFiles($path, $results);
-        }
-    }
-    return $results;
-}
-
-foreach (getGeneratedFiles("generated") as $filename)
-{
-    if (!is_dir($filename)) {
-        include_once $filename;
-    }
-
-}
-
+require_once('test.pb.php');
+require_once('test_util.php');
diff --git a/php/tests/bootstrap_phpunit.php b/php/tests/bootstrap_phpunit.php
deleted file mode 100644
index 8452f15..0000000
--- a/php/tests/bootstrap_phpunit.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-require_once("vendor/autoload.php");
-
-error_reporting(E_ALL);
diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh
deleted file mode 100755
index 7caa46e..0000000
--- a/php/tests/compatibility_test.sh
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/bin/bash
-
-function use_php() {
-  VERSION=$1
-  PHP=`which php`
-  PHP_CONFIG=`which php-config`
-  PHPIZE=`which phpize`
-  ln -sfn "/usr/local/php-${VERSION}/bin/php" $PHP
-  ln -sfn "/usr/local/php-${VERSION}/bin/php-config" $PHP_CONFIG
-  ln -sfn "/usr/local/php-${VERSION}/bin/phpize" $PHPIZE
-}
-
-function generate_proto() {
-  PROTOC1=$1
-  PROTOC2=$2
-
-  rm -rf generated
-  mkdir generated
-
-  $PROTOC1 --php_out=generated proto/test_include.proto
-  $PROTOC2 --php_out=generated proto/test.proto proto/test_no_namespace.proto proto/test_prefix.proto
-  pushd ../../src
-  $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto
-  popd
-}
-
-# Remove tests to expect error. These were added to API tests by mistake.
-function remove_error_test() {
-  local TEMPFILE=`tempfile`
-  cat $1 | \
-  awk -v file=`basename $1` -v dir=`basename $(dirname $1)` '
-    BEGIN {
-      show = 1
-    }
-    /@expectedException PHPUnit_Framework_Error/ { show = 0; next; }
-    / *\*\//                                     { print; next; }
-    / *}/ {
-      if (!show) {
-        show = 1;
-        next;
-      }
-    }
-    show { print }
-  ' > $TEMPFILE
-  cp $TEMPFILE $1
-}
-
-set -ex
-
-# Change to the script's directory.
-cd $(dirname $0)
-
-# The old version of protobuf that we are testing compatibility against.
-case "$1" in
-  ""|3.3.0)
-    OLD_VERSION=3.3.0
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.3.0/protoc-3.3.0-linux-x86_64.exe
-    ;;
-  *)
-    echo "[ERROR]: Unknown version number: $1"
-    exit 1
-    ;;
-esac
-
-# Extract the latest protobuf version number.
-VERSION_NUMBER=`grep "PHP_PROTOBUF_VERSION" ../ext/google/protobuf/protobuf.h | sed "s|#define PHP_PROTOBUF_VERSION \"\(.*\)\"|\1|"`
-
-echo "Running compatibility tests between $VERSION_NUMBER and $OLD_VERSION"
-
-# Check protoc
-[ -f ../../src/protoc ] || {
-  echo "[ERROR]: Please build protoc first."
-  exit 1
-}
-
-# Download old test.
-rm -rf protobuf
-git clone https://github.com/google/protobuf.git
-pushd protobuf
-git checkout v$OLD_VERSION
-popd
-
-# Build and copy the new runtime
-use_php 5.5
-pushd ../ext/google/protobuf
-make clean || true
-phpize && ./configure && make
-popd
-
-rm -rf protobuf/php/ext
-rm -rf protobuf/php/src
-cp -r ../ext protobuf/php/ext/
-cp -r ../src protobuf/php/src/
-
-# Download old version protoc compiler (for linux)
-wget $OLD_VERSION_PROTOC -O old_protoc
-chmod +x old_protoc
-
-NEW_PROTOC=`pwd`/../../src/protoc
-OLD_PROTOC=`pwd`/old_protoc
-cd protobuf/php
-cp -r /usr/local/vendor-5.5 vendor
-wget https://phar.phpunit.de/phpunit-4.8.0.phar -O /usr/bin/phpunit
-
-# Remove implementation detail tests.
-tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php )
-sed -i.bak '/php_implementation_test.php/d' phpunit.xml
-for t in "${tests[@]}"
-do
-  remove_error_test tests/$t
-done
-
-cd tests
-
-# Test A.1:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use old version
-generate_proto $OLD_PROTOC $OLD_PROTOC
-./test.sh
-pushd ..
-phpunit
-popd
-
-# Test A.2:
-#   proto set 1: use new version
-#   proto set 2 which may import protos in set 1: use old version
-generate_proto $NEW_PROTOC $OLD_PROTOC
-./test.sh
-pushd ..
-phpunit
-popd
-
-# Test A.3:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use new version
-generate_proto $OLD_PROTOC $NEW_PROTOC
-./test.sh
-pushd ..
-phpunit
-popd
diff --git a/php/tests/descriptors_test.php b/php/tests/descriptors_test.php
deleted file mode 100644
index 17e8a4f..0000000
--- a/php/tests/descriptors_test.php
+++ /dev/null
@@ -1,246 +0,0 @@
-<?php
-
-require_once('generated/Descriptors/TestDescriptorsEnum.php');
-require_once('generated/Descriptors/TestDescriptorsMessage.php');
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Google\Protobuf\DescriptorPool;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\MapField;
-use Descriptors\TestDescriptorsEnum;
-use Descriptors\TestDescriptorsMessage;
-use Descriptors\TestDescriptorsMessage_Sub;
-
-class DescriptorsTest extends TestBase
-{
-
-    // Redefine these here for compatibility with c extension
-    const GPBLABEL_OPTIONAL = 1;
-    const GPBLABEL_REQUIRED = 2;
-    const GPBLABEL_REPEATED = 3;
-
-    const GPBTYPE_DOUBLE   =  1;
-    const GPBTYPE_FLOAT    =  2;
-    const GPBTYPE_INT64    =  3;
-    const GPBTYPE_UINT64   =  4;
-    const GPBTYPE_INT32    =  5;
-    const GPBTYPE_FIXED64  =  6;
-    const GPBTYPE_FIXED32  =  7;
-    const GPBTYPE_BOOL     =  8;
-    const GPBTYPE_STRING   =  9;
-    const GPBTYPE_GROUP    = 10;
-    const GPBTYPE_MESSAGE  = 11;
-    const GPBTYPE_BYTES    = 12;
-    const GPBTYPE_UINT32   = 13;
-    const GPBTYPE_ENUM     = 14;
-    const GPBTYPE_SFIXED32 = 15;
-    const GPBTYPE_SFIXED64 = 16;
-    const GPBTYPE_SINT32   = 17;
-    const GPBTYPE_SINT64   = 18;
-
-    #########################################################
-    # Test descriptor pool.
-    #########################################################
-
-    public function testDescriptorPool()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
-        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $desc);
-
-        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
-        $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $enumDesc);
-    }
-
-    public function testDescriptorPoolIncorrectArgs()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-
-        $desc = $pool->getDescriptorByClassName('NotAClass');
-        $this->assertNull($desc);
-
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsEnum()));
-        $this->assertNull($desc);
-
-        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsMessage()));
-        $this->assertNull($enumDesc);
-    }
-
-    #########################################################
-    # Test descriptor.
-    #########################################################
-
-    public function testDescriptor()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-        $class = get_class(new TestDescriptorsMessage());
-        $this->assertSame('Descriptors\TestDescriptorsMessage', $class);
-        $desc = $pool->getDescriptorByClassName($class);
-
-        $this->assertSame('descriptors.TestDescriptorsMessage', $desc->getFullName());
-        $this->assertSame($class, $desc->getClass());
-
-        $this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));
-        $this->assertSame(7, $desc->getFieldCount());
-
-        $this->assertInstanceOf('\Google\Protobuf\OneofDescriptor', $desc->getOneofDecl(0));
-        $this->assertSame(1, $desc->getOneofDeclCount());
-    }
-
-    #########################################################
-    # Test enum descriptor.
-    #########################################################
-
-    public function testEnumDescriptor()
-    {
-        // WARNINIG - we need to do this so that TestDescriptorsEnum is registered!!?
-        new TestDescriptorsMessage();
-
-        $pool = DescriptorPool::getGeneratedPool();
-
-        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
-
-        // Build map of enum values
-        $enumDescMap = [];
-        for ($i = 0; $i < $enumDesc->getValueCount(); $i++) {
-            $enumValueDesc = $enumDesc->getValue($i);
-            $this->assertInstanceOf('\Google\Protobuf\EnumValueDescriptor', $enumValueDesc);
-            $enumDescMap[$enumValueDesc->getNumber()] = $enumValueDesc->getName();
-        }
-
-        $this->assertSame('ZERO', $enumDescMap[0]);
-        $this->assertSame('ONE', $enumDescMap[1]);
-
-        $this->assertSame(2, $enumDesc->getValueCount());
-    }
-
-    #########################################################
-    # Test field descriptor.
-    #########################################################
-
-    public function testFieldDescriptor()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
-
-        $fieldDescMap = $this->buildFieldMap($desc);
-
-        // Optional int field
-        $fieldDesc = $fieldDescMap[1];
-        $this->assertSame('optional_int32', $fieldDesc->getName());
-        $this->assertSame(1, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
-        $this->assertFalse($fieldDesc->isMap());
-
-        // Optional enum field
-        $fieldDesc = $fieldDescMap[16];
-        $this->assertSame('optional_enum', $fieldDesc->getName());
-        $this->assertSame(16, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_ENUM, $fieldDesc->getType());
-        $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $fieldDesc->getEnumType());
-        $this->assertFalse($fieldDesc->isMap());
-
-        // Optional message field
-        $fieldDesc = $fieldDescMap[17];
-        $this->assertSame('optional_message', $fieldDesc->getName());
-        $this->assertSame(17, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
-        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
-        $this->assertFalse($fieldDesc->isMap());
-
-        // Repeated int field
-        $fieldDesc = $fieldDescMap[31];
-        $this->assertSame('repeated_int32', $fieldDesc->getName());
-        $this->assertSame(31, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
-        $this->assertFalse($fieldDesc->isMap());
-
-        // Repeated message field
-        $fieldDesc = $fieldDescMap[47];
-        $this->assertSame('repeated_message', $fieldDesc->getName());
-        $this->assertSame(47, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
-        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
-        $this->assertFalse($fieldDesc->isMap());
-
-        // Oneof int field
-        // Tested further in testOneofDescriptor()
-        $fieldDesc = $fieldDescMap[51];
-        $this->assertSame('oneof_int32', $fieldDesc->getName());
-        $this->assertSame(51, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
-        $this->assertFalse($fieldDesc->isMap());
-
-        // Map int-enum field
-        $fieldDesc = $fieldDescMap[71];
-        $this->assertSame('map_int32_enum', $fieldDesc->getName());
-        $this->assertSame(71, $fieldDesc->getNumber());
-        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
-        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
-        $this->assertTrue($fieldDesc->isMap());
-        $mapDesc = $fieldDesc->getMessageType();
-        $this->assertSame('descriptors.TestDescriptorsMessage.MapInt32EnumEntry', $mapDesc->getFullName());
-        $this->assertSame(self::GPBTYPE_INT32, $mapDesc->getField(0)->getType());
-        $this->assertSame(self::GPBTYPE_ENUM, $mapDesc->getField(1)->getType());
-    }
-
-    /**
-     * @expectedException \Exception
-     */
-    public function testFieldDescriptorEnumException()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
-        $fieldDesc = $desc->getField(0);
-        $fieldDesc->getEnumType();
-    }
-
-    /**
-     * @expectedException \Exception
-     */
-    public function testFieldDescriptorMessageException()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
-        $fieldDesc = $desc->getField(0);
-        $fieldDesc->getMessageType();
-    }
-
-    #########################################################
-    # Test oneof descriptor.
-    #########################################################
-
-    public function testOneofDescriptor()
-    {
-        $pool = DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
-
-        $fieldDescMap = $this->buildFieldMap($desc);
-        $fieldDesc = $fieldDescMap[51];
-
-        $oneofDesc = $desc->getOneofDecl(0);
-
-        $this->assertSame('my_oneof', $oneofDesc->getName());
-        $fieldDescFromOneof = $oneofDesc->getField(0);
-        $this->assertSame($fieldDesc, $fieldDescFromOneof);
-        $this->assertSame(1, $oneofDesc->getFieldCount());
-    }
-
-    private function buildFieldMap($desc)
-    {
-        $fieldDescMap = [];
-        for ($i = 0; $i < $desc->getFieldCount(); $i++) {
-            $fieldDesc = $desc->getField($i);
-            $fieldDescMap[$fieldDesc->getNumber()] = $fieldDesc;
-        }
-        return $fieldDescMap;
-    }
-}
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
deleted file mode 100644
index 74d5526..0000000
--- a/php/tests/encode_decode_test.php
+++ /dev/null
@@ -1,525 +0,0 @@
-<?php
-
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Google\Protobuf\RepeatedField;
-use Google\Protobuf\GPBType;
-use Foo\TestEnum;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-use Foo\TestPackedMessage;
-use Foo\TestRandomFieldOrder;
-use Foo\TestUnpackedMessage;
-
-class EncodeDecodeTest extends TestBase
-{
-
-    public function testEncode()
-    {
-        $from = new TestMessage();
-        $this->expectEmptyFields($from);
-        $this->setFields($from);
-        $this->expectFields($from);
-
-        $data = $from->serializeToString();
-        $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()),
-                          bin2hex($data));
-    }
-
-    public function testDecode()
-    {
-        $to = new TestMessage();
-        $to->mergeFromString(TestUtil::getGoldenTestMessage());
-        $this->expectFields($to);
-    }
-
-    public function testEncodeDecode()
-    {
-        $from = new TestMessage();
-        $this->expectEmptyFields($from);
-        $this->setFields($from);
-        $this->expectFields($from);
-
-        $data = $from->serializeToString();
-
-        $to = new TestMessage();
-        $to->mergeFromString($data);
-        $this->expectFields($to);
-    }
-
-    public function testEncodeDecodeEmpty()
-    {
-        $from = new TestMessage();
-        $this->expectEmptyFields($from);
-
-        $data = $from->serializeToString();
-
-        $to = new TestMessage();
-        $to->mergeFromString($data);
-        $this->expectEmptyFields($to);
-    }
-
-    public function testEncodeDecodeOneof()
-    {
-        $m = new TestMessage();
-
-        $m->setOneofInt32(1);
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame(1, $n->getOneofInt32());
-
-        $m->setOneofFloat(2.0);
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame(2.0, $n->getOneofFloat());
-
-        $m->setOneofString('abc');
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame('abc', $n->getOneofString());
-
-        $sub_m = new TestMessage_Sub();
-        $sub_m->setA(1);
-        $m->setOneofMessage($sub_m);
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame(1, $n->getOneofMessage()->getA());
-
-        // Encode default value
-        $m->setOneofEnum(TestEnum::ZERO);
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame("oneof_enum", $n->getMyOneof());
-        $this->assertSame(TestEnum::ZERO, $n->getOneofEnum());
-
-        $m->setOneofString("");
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame("oneof_string", $n->getMyOneof());
-        $this->assertSame("", $n->getOneofString());
-
-        $sub_m = new TestMessage_Sub();
-        $m->setOneofMessage($sub_m);
-        $data = $m->serializeToString();
-        $n = new TestMessage();
-        $n->mergeFromString($data);
-        $this->assertSame("oneof_message", $n->getMyOneof());
-        $this->assertFalse(is_null($n->getOneofMessage()));
-
-    }
-
-    public function testPackedEncode()
-    {
-        $from = new TestPackedMessage();
-        TestUtil::setTestPackedMessage($from);
-        $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
-                          $from->serializeToString());
-    }
-
-    public function testPackedDecodePacked()
-    {
-        $to = new TestPackedMessage();
-        $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
-        TestUtil::assertTestPackedMessage($to);
-    }
-
-    public function testPackedDecodeUnpacked()
-    {
-        $to = new TestPackedMessage();
-        $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
-        TestUtil::assertTestPackedMessage($to);
-    }
-
-    public function testUnpackedEncode()
-    {
-        $from = new TestUnpackedMessage();
-        TestUtil::setTestPackedMessage($from);
-        $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
-                          $from->serializeToString());
-    }
-
-    public function testUnpackedDecodePacked()
-    {
-        $to = new TestUnpackedMessage();
-        $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
-        TestUtil::assertTestPackedMessage($to);
-    }
-
-    public function testUnpackedDecodeUnpacked()
-    {
-        $to = new TestUnpackedMessage();
-        $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
-        TestUtil::assertTestPackedMessage($to);
-    }
-
-    public function testDecodeInt64()
-    {
-        // Read 64 testing
-        $testVals = array(
-            '10'                 => '100a',
-            '100'                => '1064',
-            '800'                => '10a006',
-            '6400'               => '108032',
-            '70400'              => '1080a604',
-            '774400'             => '1080a22f',
-            '9292800'            => '108098b704',
-            '74342400'           => '1080c0b923',
-            '743424000'          => '108080bfe202',
-            '8177664000'         => '108080b5bb1e',
-            '65421312000'        => '108080a8dbf301',
-            '785055744000'       => '108080e0c7ec16',
-            '9420668928000'      => '10808080dd969202',
-            '103627358208000'    => '10808080fff9c717',
-            '1139900940288000'   => '10808080f5bd978302',
-            '13678811283456000'  => '10808080fce699a618',
-            '109430490267648000' => '10808080e0b7ceb1c201',
-            '984874412408832000' => '10808080e0f5c1bed50d',
-        );
-
-        $msg = new TestMessage();
-        foreach ($testVals as $original => $encoded) {
-            $msg->setOptionalInt64($original);
-            $data = $msg->serializeToString();
-            $this->assertSame($encoded, bin2hex($data));
-            $msg->setOptionalInt64(0);
-            $msg->mergeFromString($data);
-            $this->assertEquals($original, $msg->getOptionalInt64());
-        }
-    }
-
-    public function testDecodeToExistingMessage()
-    {
-        $m1 = new TestMessage();
-        $this->setFields($m1);
-        $this->expectFields($m1);
-
-        $m2 = new TestMessage();
-        $this->setFields2($m2);
-        $data = $m2->serializeToString();
-
-        $m1->mergeFromString($data);
-        $this->expectFieldsMerged($m1);
-    }
-
-    public function testDecodeFieldNonExist()
-    {
-        $data = hex2bin('c80501');
-        $m = new TestMessage();
-        $m->mergeFromString($data);
-    }
-
-    public function testEncodeNegativeInt32()
-    {
-        $m = new TestMessage();
-        $m->setOptionalInt32(-1);
-        $data = $m->serializeToString();
-        $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
-    }
-
-    public function testDecodeNegativeInt32()
-    {
-        $m = new TestMessage();
-        $this->assertEquals(0, $m->getOptionalInt32());
-        $m->mergeFromString(hex2bin("08ffffffffffffffffff01"));
-        $this->assertEquals(-1, $m->getOptionalInt32());
-
-        $m = new TestMessage();
-        $this->assertEquals(0, $m->getOptionalInt32());
-        $m->mergeFromString(hex2bin("08ffffffff0f"));
-        $this->assertEquals(-1, $m->getOptionalInt32());
-    }
-
-    public function testRandomFieldOrder()
-    {
-        $m = new TestRandomFieldOrder();
-        $data = $m->serializeToString();
-        $this->assertSame("", $data);
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidInt32()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('08'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidSubMessage()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('9A010108'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidInt64()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('10'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidUInt32()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('18'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidUInt64()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('20'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidSInt32()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('28'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidSInt64()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('30'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidFixed32()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('3D'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidFixed64()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('41'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidSFixed32()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('4D'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidSFixed64()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('51'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidFloat()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('5D'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidDouble()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('61'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidBool()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('68'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidStringLengthMiss()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('72'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidStringDataMiss()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('7201'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidBytesLengthMiss()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('7A'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidBytesDataMiss()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('7A01'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidEnum()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('8001'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidMessageLengthMiss()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('8A01'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidMessageDataMiss()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(hex2bin('8A0101'));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testDecodeInvalidPackedMessageLength()
-    {
-        $m = new TestPackedMessage();
-        $m->mergeFromString(hex2bin('D205'));
-    }
-
-    public function testUnknown()
-    {
-        // Test preserve unknown for varint.
-        $m = new TestMessage();
-        $from = hex2bin('F80601');  // TODO(teboring): Add a util to encode
-                                    // varint for better readability
-        $m->mergeFromString($from);
-        $to = $m->serializeToString();
-        $this->assertSame(bin2hex($from), bin2hex($to));
-
-        // Test preserve unknown for 64-bit.
-        $m = new TestMessage();
-        $from = hex2bin('F9060000000000000000');
-        $m->mergeFromString($from);
-        $to = $m->serializeToString();
-        $this->assertSame(bin2hex($from), bin2hex($to));
-
-        // Test preserve unknown for length delimited.
-        $m = new TestMessage();
-        $from = hex2bin('FA0600');
-        $m->mergeFromString($from);
-        $to = $m->serializeToString();
-        $this->assertSame(bin2hex($from), bin2hex($to));
-
-        // Test preserve unknown for 32-bit.
-        $m = new TestMessage();
-        $from = hex2bin('FD0600000000');
-        $m->mergeFromString($from);
-        $to = $m->serializeToString();
-        $this->assertSame(bin2hex($from), bin2hex($to));
-
-        // Test discard unknown in message.
-        $m = new TestMessage();
-        $from = hex2bin('F80601');
-        $m->mergeFromString($from);
-        $m->discardUnknownFields();
-        $to = $m->serializeToString();
-        $this->assertSame("", bin2hex($to));
-
-        // Test discard unknown for singular message field.
-        $m = new TestMessage();
-        $from = hex2bin('8A0103F80601');
-        $m->mergeFromString($from);
-        $m->discardUnknownFields();
-        $to = $m->serializeToString();
-        $this->assertSame("8a0100", bin2hex($to));
-
-        // Test discard unknown for repeated message field.
-        $m = new TestMessage();
-        $from = hex2bin('FA0203F80601');
-        $m->mergeFromString($from);
-        $m->discardUnknownFields();
-        $to = $m->serializeToString();
-        $this->assertSame("fa0200", bin2hex($to));
-
-        // Test discard unknown for map message value field.
-        $m = new TestMessage();
-        $from = hex2bin("BA050708011203F80601");
-        $m->mergeFromString($from);
-        $m->discardUnknownFields();
-        $to = $m->serializeToString();
-        $this->assertSame("ba050408011200", bin2hex($to));
-
-        // Test discard unknown for singular message field.
-        $m = new TestMessage();
-        $from = hex2bin('9A0403F80601');
-        $m->mergeFromString($from);
-        $m->discardUnknownFields();
-        $to = $m->serializeToString();
-        $this->assertSame("9a0400", bin2hex($to));
-    }
-
-    public function testJsonEncode()
-    {
-        $from = new TestMessage();
-        $this->setFields($from);
-        $data = $from->serializeToJsonString();
-        $to = new TestMessage();
-        $to->mergeFromJsonString($data);
-        $this->expectFields($to);
-    }
-}
diff --git a/php/tests/gdb_test.sh b/php/tests/gdb_test.sh
deleted file mode 100755
index a5f6306..0000000
--- a/php/tests/gdb_test.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
-VERSION=$1
-
-export PATH=/usr/local/php-$VERSION/bin:$PATH
-export C_INCLUDE_PATH=/usr/local/php-$VERSION/include/php/main:/usr/local/php-$VERSION/include/php:$C_INCLUDE_PATH
-export CPLUS_INCLUDE_PATH=/usr/local/php-$VERSION/include/php/main:/usr/local/php-$VERSION/include/php:$CPLUS_INCLUDE_PATH
-
-php -i | grep "Configuration"
-
-# gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which
-# phpunit` --bootstrap autoload.php tmp_test.php
-#
-# gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php encode_decode_test.php
-#
-gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
-#
-# USE_ZEND_ALLOC=0 valgrind --leak-check=yes php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php
deleted file mode 100644
index 53d18ee..0000000
--- a/php/tests/generated_class_test.php
+++ /dev/null
@@ -1,1174 +0,0 @@
-<?php
-
-require_once('generated/NoNamespaceEnum.php');
-require_once('generated/NoNamespaceMessage.php');
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\MapField;
-use Google\Protobuf\Internal\GPBType;
-use Foo\TestEnum;
-use Foo\TestIncludeNamespaceMessage;
-use Foo\TestIncludePrefixMessage;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-use Foo\TestReverseFieldOrder;
-use Foo\testLowerCaseMessage;
-use Foo\testLowerCaseEnum;
-use Php\Test\TestNamespace;
-
-class GeneratedClassTest extends TestBase
-{
-
-    #########################################################
-    # Test field accessors.
-    #########################################################
-
-    public function testSetterGetter()
-    {
-        $m = new TestMessage();
-        $m->setOptionalInt32(1);
-        $this->assertSame(1, $m->getOptionalInt32());
-    }
-
-    #########################################################
-    # Test int32 field.
-    #########################################################
-
-    public function testInt32Field()
-    {
-        $m = new TestMessage();
-
-        // Set integer.
-        $m->setOptionalInt32(MAX_INT32);
-        $this->assertSame(MAX_INT32, $m->getOptionalInt32());
-        $m->setOptionalInt32(MIN_INT32);
-        $this->assertSame(MIN_INT32, $m->getOptionalInt32());
-
-        // Set float.
-        $m->setOptionalInt32(1.1);
-        $this->assertSame(1, $m->getOptionalInt32());
-        $m->setOptionalInt32(MAX_INT32_FLOAT);
-        $this->assertSame(MAX_INT32, $m->getOptionalInt32());
-        $m->setOptionalInt32(MIN_INT32_FLOAT);
-        $this->assertSame(MIN_INT32, $m->getOptionalInt32());
-
-        // Set string.
-        $m->setOptionalInt32('2');
-        $this->assertSame(2, $m->getOptionalInt32());
-        $m->setOptionalInt32('3.1');
-        $this->assertSame(3, $m->getOptionalInt32());
-        $m->setOptionalInt32(MAX_INT32_STRING);
-        $this->assertSame(MAX_INT32, $m->getOptionalInt32());
-        $m->setOptionalInt32(MIN_INT32_STRING);
-        $this->assertSame(MIN_INT32, $m->getOptionalInt32());
-    }
-
-    #########################################################
-    # Test uint32 field.
-    #########################################################
-
-    public function testUint32Field()
-    {
-        $m = new TestMessage();
-
-        // Set integer.
-        $m->setOptionalUint32(MAX_UINT32);
-        $this->assertSame(-1, $m->getOptionalUint32());
-        $m->setOptionalUint32(-1);
-        $this->assertSame(-1, $m->getOptionalUint32());
-        $m->setOptionalUint32(MIN_UINT32);
-        $this->assertSame(MIN_INT32, $m->getOptionalUint32());
-
-        // Set float.
-        $m->setOptionalUint32(1.1);
-        $this->assertSame(1, $m->getOptionalUint32());
-        $m->setOptionalUint32(MAX_UINT32_FLOAT);
-        $this->assertSame(-1, $m->getOptionalUint32());
-        $m->setOptionalUint32(-1.0);
-        $this->assertSame(-1, $m->getOptionalUint32());
-        $m->setOptionalUint32(MIN_UINT32_FLOAT);
-        $this->assertSame(MIN_INT32, $m->getOptionalUint32());
-
-        // Set string.
-        $m->setOptionalUint32('2');
-        $this->assertSame(2, $m->getOptionalUint32());
-        $m->setOptionalUint32('3.1');
-        $this->assertSame(3, $m->getOptionalUint32());
-        $m->setOptionalUint32(MAX_UINT32_STRING);
-        $this->assertSame(-1, $m->getOptionalUint32());
-        $m->setOptionalUint32('-1.0');
-        $this->assertSame(-1, $m->getOptionalUint32());
-        $m->setOptionalUint32(MIN_UINT32_STRING);
-        $this->assertSame(MIN_INT32, $m->getOptionalUint32());
-    }
-
-    #########################################################
-    # Test int64 field.
-    #########################################################
-
-    public function testInt64Field()
-    {
-        $m = new TestMessage();
-
-        // Set integer.
-        $m->setOptionalInt64(MAX_INT64);
-        $this->assertSame(MAX_INT64, $m->getOptionalInt64());
-        $m->setOptionalInt64(MIN_INT64);
-        $this->assertEquals(MIN_INT64, $m->getOptionalInt64());
-
-        // Set float.
-        $m->setOptionalInt64(1.1);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('1', $m->getOptionalInt64());
-        } else {
-            $this->assertSame(1, $m->getOptionalInt64());
-        }
-
-        // Set string.
-        $m->setOptionalInt64('2');
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('2', $m->getOptionalInt64());
-        } else {
-            $this->assertSame(2, $m->getOptionalInt64());
-        }
-
-        $m->setOptionalInt64('3.1');
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('3', $m->getOptionalInt64());
-        } else {
-            $this->assertSame(3, $m->getOptionalInt64());
-        }
-
-        $m->setOptionalInt64(MAX_INT64_STRING);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_INT64_STRING, $m->getOptionalInt64());
-        } else {
-            $this->assertSame(MAX_INT64, $m->getOptionalInt64());
-        }
-
-        $m->setOptionalInt64(MIN_INT64_STRING);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MIN_INT64_STRING, $m->getOptionalInt64());
-        } else {
-            $this->assertSame(MIN_INT64, $m->getOptionalInt64());
-        }
-    }
-
-    #########################################################
-    # Test uint64 field.
-    #########################################################
-
-    public function testUint64Field()
-    {
-        $m = new TestMessage();
-
-        // Set integer.
-        $m->setOptionalUint64(MAX_UINT64);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_UINT64_STRING, $m->getOptionalUint64());
-        } else {
-            $this->assertSame(MAX_UINT64, $m->getOptionalUint64());
-        }
-
-        // Set float.
-        $m->setOptionalUint64(1.1);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('1', $m->getOptionalUint64());
-        } else {
-            $this->assertSame(1, $m->getOptionalUint64());
-        }
-
-        // Set string.
-        $m->setOptionalUint64('2');
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('2', $m->getOptionalUint64());
-        } else {
-            $this->assertSame(2, $m->getOptionalUint64());
-        }
-
-        $m->setOptionalUint64('3.1');
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('3', $m->getOptionalUint64());
-        } else {
-            $this->assertSame(3, $m->getOptionalUint64());
-        }
-
-        $m->setOptionalUint64(MAX_UINT64_STRING);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_UINT64_STRING, $m->getOptionalUint64());
-        } else {
-            $this->assertSame(MAX_UINT64, $m->getOptionalUint64());
-        }
-    }
-
-    #########################################################
-    # Test enum field.
-    #########################################################
-
-    public function testEnumField()
-    {
-        $m = new TestMessage();
-
-        // Set enum.
-        $m->setOptionalEnum(TestEnum::ONE);
-        $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
-
-        // Set integer.
-        $m->setOptionalEnum(1);
-        $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
-
-        // Set float.
-        $m->setOptionalEnum(1.1);
-        $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
-
-        // Set string.
-        $m->setOptionalEnum("1");
-        $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum());
-    }
-
-    public function testNestedEnum()
-    {
-        $m = new TestMessage();
-        $m->setOptionalNestedEnum(\Foo\TestMessage_NestedEnum::ZERO);
-    }
-
-    #########################################################
-    # Test float field.
-    #########################################################
-
-    public function testFloatField()
-    {
-        $m = new TestMessage();
-
-        // Set integer.
-        $m->setOptionalFloat(1);
-        $this->assertEquals(1.0, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
-
-        // Set float.
-        $m->setOptionalFloat(1.1);
-        $this->assertEquals(1.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
-
-        // Set string.
-        $m->setOptionalFloat('2');
-        $this->assertEquals(2.0, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
-        $m->setOptionalFloat('3.1');
-        $this->assertEquals(3.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF);
-    }
-
-    #########################################################
-    # Test double field.
-    #########################################################
-
-    public function testDoubleField()
-    {
-        $m = new TestMessage();
-
-        // Set integer.
-        $m->setOptionalDouble(1);
-        $this->assertEquals(1.0, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
-
-        // Set float.
-        $m->setOptionalDouble(1.1);
-        $this->assertEquals(1.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
-
-        // Set string.
-        $m->setOptionalDouble('2');
-        $this->assertEquals(2.0, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
-        $m->setOptionalDouble('3.1');
-        $this->assertEquals(3.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF);
-    }
-
-    #########################################################
-    # Test bool field.
-    #########################################################
-
-    public function testBoolField()
-    {
-        $m = new TestMessage();
-
-        // Set bool.
-        $m->setOptionalBool(true);
-        $this->assertSame(true, $m->getOptionalBool());
-
-        // Set integer.
-        $m->setOptionalBool(-1);
-        $this->assertSame(true, $m->getOptionalBool());
-
-        // Set float.
-        $m->setOptionalBool(1.1);
-        $this->assertSame(true, $m->getOptionalBool());
-
-        // Set string.
-        $m->setOptionalBool('');
-        $this->assertSame(false, $m->getOptionalBool());
-    }
-
-    #########################################################
-    # Test string field.
-    #########################################################
-
-    public function testStringField()
-    {
-        $m = new TestMessage();
-
-        // Set string.
-        $m->setOptionalString('abc');
-        $this->assertSame('abc', $m->getOptionalString());
-
-        // Set integer.
-        $m->setOptionalString(1);
-        $this->assertSame('1', $m->getOptionalString());
-
-        // Set double.
-        $m->setOptionalString(1.1);
-        $this->assertSame('1.1', $m->getOptionalString());
-
-        // Set bool.
-        $m->setOptionalString(true);
-        $this->assertSame('1', $m->getOptionalString());
-    }
-
-    #########################################################
-    # Test bytes field.
-    #########################################################
-
-    public function testBytesField()
-    {
-        $m = new TestMessage();
-
-        // Set string.
-        $m->setOptionalBytes('abc');
-        $this->assertSame('abc', $m->getOptionalBytes());
-
-        // Set integer.
-        $m->setOptionalBytes(1);
-        $this->assertSame('1', $m->getOptionalBytes());
-
-        // Set double.
-        $m->setOptionalBytes(1.1);
-        $this->assertSame('1.1', $m->getOptionalBytes());
-
-        // Set bool.
-        $m->setOptionalBytes(true);
-        $this->assertSame('1', $m->getOptionalBytes());
-    }
-
-      public function testBytesFieldInvalidUTF8Success()
-      {
-          $m = new TestMessage();
-          $hex = hex2bin("ff");
-          $m->setOptionalBytes($hex);
-      }
-
-    #########################################################
-    # Test message field.
-    #########################################################
-
-    public function testMessageField()
-    {
-        $m = new TestMessage();
-
-        $sub_m = new TestMessage_Sub();
-        $sub_m->setA(1);
-        $m->setOptionalMessage($sub_m);
-        $this->assertSame(1, $m->getOptionalMessage()->getA());
-
-        $null = null;
-        $m->setOptionalMessage($null);
-        $this->assertNull($m->getOptionalMessage());
-    }
-
-    #########################################################
-    # Test repeated field.
-    #########################################################
-
-    public function testRepeatedField()
-    {
-        $m = new TestMessage();
-
-        $repeated_int32 = new RepeatedField(GPBType::INT32);
-        $m->setRepeatedInt32($repeated_int32);
-        $this->assertSame($repeated_int32, $m->getRepeatedInt32());
-    }
-
-    public function testRepeatedFieldViaArray()
-    {
-        $m = new TestMessage();
-
-        $arr = array();
-        $m->setRepeatedInt32($arr);
-        $this->assertSame(0, count($m->getRepeatedInt32()));
-
-        $arr = array(1, 2.1, "3");
-        $m->setRepeatedInt32($arr);
-        $this->assertTrue($m->getRepeatedInt32() instanceof RepeatedField);
-        $this->assertSame("Google\Protobuf\Internal\RepeatedField",
-                          get_class($m->getRepeatedInt32()));
-        $this->assertSame(3, count($m->getRepeatedInt32()));
-        $this->assertSame(1, $m->getRepeatedInt32()[0]);
-        $this->assertSame(2, $m->getRepeatedInt32()[1]);
-        $this->assertSame(3, $m->getRepeatedInt32()[2]);
-        $this->assertFalse($arr instanceof RepeatedField);
-    }
-
-    #########################################################
-    # Test map field.
-    #########################################################
-
-    public function testMapField()
-    {
-        $m = new TestMessage();
-
-        $map_int32_int32 = new MapField(GPBType::INT32, GPBType::INT32);
-        $m->setMapInt32Int32($map_int32_int32);
-        $this->assertSame($map_int32_int32, $m->getMapInt32Int32());
-    }
-
-    public function testMapFieldViaArray()
-    {
-        $m = new TestMessage();
-
-        $dict = array();
-        $m->setMapInt32Int32($dict);
-        $this->assertSame(0, count($m->getMapInt32Int32()));
-
-        $dict = array(5 => 5, 6.1 => 6.1, "7" => "7");
-        $m->setMapInt32Int32($dict);
-        $this->assertTrue($m->getMapInt32Int32() instanceof MapField);
-        $this->assertSame(3, count($m->getMapInt32Int32()));
-        $this->assertSame(5, $m->getMapInt32Int32()[5]);
-        $this->assertSame(6, $m->getMapInt32Int32()[6]);
-        $this->assertSame(7, $m->getMapInt32Int32()[7]);
-        $this->assertFalse($dict instanceof MapField);
-    }
-
-    #########################################################
-    # Test oneof field.
-    #########################################################
-
-    public function testOneofField() {
-        $m = new TestMessage();
-
-        $this->assertSame("", $m->getMyOneof());
-
-        $m->setOneofInt32(1);
-        $this->assertSame(1, $m->getOneofInt32());
-        $this->assertSame(0.0, $m->getOneofFloat());
-        $this->assertSame('', $m->getOneofString());
-        $this->assertSame(NULL, $m->getOneofMessage());
-        $this->assertSame("oneof_int32", $m->getMyOneof());
-
-        $m->setOneofFloat(2.0);
-        $this->assertSame(0, $m->getOneofInt32());
-        $this->assertSame(2.0, $m->getOneofFloat());
-        $this->assertSame('', $m->getOneofString());
-        $this->assertSame(NULL, $m->getOneofMessage());
-        $this->assertSame("oneof_float", $m->getMyOneof());
-
-        $m->setOneofString('abc');
-        $this->assertSame(0, $m->getOneofInt32());
-        $this->assertSame(0.0, $m->getOneofFloat());
-        $this->assertSame('abc', $m->getOneofString());
-        $this->assertSame(NULL, $m->getOneofMessage());
-        $this->assertSame("oneof_string", $m->getMyOneof());
-
-        $sub_m = new TestMessage_Sub();
-        $sub_m->setA(1);
-        $m->setOneofMessage($sub_m);
-        $this->assertSame(0, $m->getOneofInt32());
-        $this->assertSame(0.0, $m->getOneofFloat());
-        $this->assertSame('', $m->getOneofString());
-        $this->assertSame(1, $m->getOneofMessage()->getA());
-        $this->assertSame("oneof_message", $m->getMyOneof());
-    }
-
-    #########################################################
-    # Test clear method.
-    #########################################################
-
-    public function testMessageClear()
-    {
-        $m = new TestMessage();
-        $this->setFields($m);
-        $this->expectFields($m);
-        $m->clear();
-        $this->expectEmptyFields($m);
-    }
-
-    #########################################################
-    # Test mergeFrom method.
-    #########################################################
-
-    public function testMessageMergeFrom()
-    {
-        $m = new TestMessage();
-        $this->setFields($m);
-        $this->expectFields($m);
-        $arr = $m->getOptionalMessage()->getB();
-        $arr[] = 1;
-
-        $n = new TestMessage();
-
-        // Singular
-        $n->setOptionalInt32(100);
-        $sub1 = new TestMessage_Sub();
-        $sub1->setA(101);
-
-        $b = $sub1->getB();
-        $b[] = 102;
-        $sub1->setB($b);
-
-        $n->setOptionalMessage($sub1);
-
-        // Repeated
-        $repeatedInt32 = $n->getRepeatedInt32();
-        $repeatedInt32[] = 200;
-        $n->setRepeatedInt32($repeatedInt32);
-
-        $repeatedString = $n->getRepeatedString();
-        $repeatedString[] = 'abc';
-        $n->setRepeatedString($repeatedString);
-
-        $sub2 = new TestMessage_Sub();
-        $sub2->setA(201);
-        $repeatedMessage = $n->getRepeatedMessage();
-        $repeatedMessage[] = $sub2;
-        $n->setRepeatedMessage($repeatedMessage);
-
-        // Map
-        $mapInt32Int32 = $n->getMapInt32Int32();
-        $mapInt32Int32[1] = 300;
-        $mapInt32Int32[-62] = 301;
-        $n->setMapInt32Int32($mapInt32Int32);
-
-        $mapStringString = $n->getMapStringString();
-        $mapStringString['def'] = 'def';
-        $n->setMapStringString($mapStringString);
-
-        $mapInt32Message = $n->getMapInt32Message();
-        $mapInt32Message[1] = new TestMessage_Sub();
-        $mapInt32Message[1]->setA(302);
-        $mapInt32Message[2] = new TestMessage_Sub();
-        $mapInt32Message[2]->setA(303);
-        $n->setMapInt32Message($mapInt32Message);
-
-        $m->mergeFrom($n);
-
-        $this->assertSame(100, $m->getOptionalInt32());
-        $this->assertSame(42, $m->getOptionalUint32());
-        $this->assertSame(101, $m->getOptionalMessage()->getA());
-        $this->assertSame(2, count($m->getOptionalMessage()->getB()));
-        $this->assertSame(1, $m->getOptionalMessage()->getB()[0]);
-        $this->assertSame(102, $m->getOptionalMessage()->getB()[1]);
-
-        $this->assertSame(3, count($m->getRepeatedInt32()));
-        $this->assertSame(200, $m->getRepeatedInt32()[2]);
-        $this->assertSame(2, count($m->getRepeatedUint32()));
-        $this->assertSame(3, count($m->getRepeatedString()));
-        $this->assertSame('abc', $m->getRepeatedString()[2]);
-        $this->assertSame(3, count($m->getRepeatedMessage()));
-        $this->assertSame(201, $m->getRepeatedMessage()[2]->getA());
-
-        $this->assertSame(2, count($m->getMapInt32Int32()));
-        $this->assertSame(300, $m->getMapInt32Int32()[1]);
-        $this->assertSame(301, $m->getMapInt32Int32()[-62]);
-        $this->assertSame(1, count($m->getMapUint32Uint32()));
-        $this->assertSame(2, count($m->getMapStringString()));
-        $this->assertSame('def', $m->getMapStringString()['def']);
-
-        $this->assertSame(2, count($m->getMapInt32Message()));
-        $this->assertSame(302, $m->getMapInt32Message()[1]->getA());
-        $this->assertSame(303, $m->getMapInt32Message()[2]->getA());
-
-        $this->assertSame("", $m->getMyOneof());
-
-        // Check sub-messages are copied by value.
-        $n->getOptionalMessage()->setA(-101);
-        $this->assertSame(101, $m->getOptionalMessage()->getA());
-
-        $repeatedMessage = $n->getRepeatedMessage();
-        $repeatedMessage[0]->setA(-201);
-        $n->setRepeatedMessage($repeatedMessage);
-        $this->assertSame(201, $m->getRepeatedMessage()[2]->getA());
-
-        $mapInt32Message = $n->getMapInt32Message();
-        $mapInt32Message[1]->setA(-302);
-        $n->setMapInt32Message($mapInt32Message);
-
-        $this->assertSame(302, $m->getMapInt32Message()[1]->getA());
-
-        // Test merge oneof.
-        $m = new TestMessage();
-
-        $n = new TestMessage();
-        $n->setOneofInt32(1);
-        $m->mergeFrom($n);
-        $this->assertSame(1, $m->getOneofInt32());
-
-        $sub = new TestMessage_Sub();
-        $n->setOneofMessage($sub);
-        $n->getOneofMessage()->setA(400);
-        $m->mergeFrom($n);
-        $this->assertSame(400, $m->getOneofMessage()->getA());
-        $n->getOneofMessage()->setA(-400);
-        $this->assertSame(400, $m->getOneofMessage()->getA());
-
-        // Test all fields
-        $m = new TestMessage();
-        $n = new TestMessage();
-        $this->setFields($m);
-        $n->mergeFrom($m);
-        $this->expectFields($n);
-    }
-
-    #########################################################
-    # Test message/enum without namespace.
-    #########################################################
-
-    public function testMessageWithoutNamespace()
-    {
-        $m = new TestMessage();
-        $sub = new NoNameSpaceMessage();
-        $m->setOptionalNoNamespaceMessage($sub);
-        $repeatedNoNamespaceMessage = $m->getRepeatedNoNamespaceMessage();
-        $repeatedNoNamespaceMessage[] = new NoNameSpaceMessage();
-        $m->setRepeatedNoNamespaceMessage($repeatedNoNamespaceMessage);
-
-        $n = new NoNamespaceMessage();
-        $n->setB(NoNamespaceMessage_NestedEnum::ZERO);
-    }
-
-    public function testEnumWithoutNamespace()
-    {
-        $m = new TestMessage();
-        $m->setOptionalNoNamespaceEnum(NoNameSpaceEnum::VALUE_A);
-        $repeatedNoNamespaceEnum = $m->getRepeatedNoNamespaceEnum();
-        $repeatedNoNamespaceEnum[] = NoNameSpaceEnum::VALUE_A;
-        $m->setRepeatedNoNamespaceEnum($repeatedNoNamespaceEnum);
-    }
-
-    #########################################################
-    # Test message with given prefix.
-    #########################################################
-
-    public function testPrefixMessage()
-    {
-        $m = new TestIncludePrefixMessage();
-        $n = new PrefixTestPrefix();
-        $n->setA(1);
-        $m->setPrefixMessage($n);
-        $this->assertSame(1, $m->getPrefixMessage()->getA());
-    }
-
-    #########################################################
-    # Test message with given namespace.
-    #########################################################
-
-    public function testNamespaceMessage()
-    {
-        $m = new TestIncludeNamespaceMessage();
-
-        $n = new TestNamespace();
-        $n->setA(1);
-        $m->setNamespaceMessage($n);
-        $this->assertSame(1, $m->getNamespaceMessage()->getA());
-
-        $n = new TestEmptyNamespace();
-        $n->setA(1);
-        $m->setEmptyNamespaceMessage($n);
-        $this->assertSame(1, $m->getEmptyNamespaceMessage()->getA());
-    }
-
-    #########################################################
-    # Test prefix for reserved words.
-    #########################################################
-
-    public function testPrefixForReservedWords()
-    {
-        $m = new \Foo\TestMessage_Empty();
-        $m = new \Foo\PBEmpty();
-        $m = new \PrefixEmpty();
-        $m = new \Foo\PBARRAY();
-
-        $m = new \Lower\PBabstract();
-        $m = new \Lower\PBand();
-        $m = new \Lower\PBarray();
-        $m = new \Lower\PBas();
-        $m = new \Lower\PBbreak();
-        $m = new \Lower\PBcallable();
-        $m = new \Lower\PBcase();
-        $m = new \Lower\PBcatch();
-        $m = new \Lower\PBclass();
-        $m = new \Lower\PBclone();
-        $m = new \Lower\PBconst();
-        $m = new \Lower\PBcontinue();
-        $m = new \Lower\PBdeclare();
-        $m = new \Lower\PBdefault();
-        $m = new \Lower\PBdie();
-        $m = new \Lower\PBdo();
-        $m = new \Lower\PBecho();
-        $m = new \Lower\PBelse();
-        $m = new \Lower\PBelseif();
-        $m = new \Lower\PBempty();
-        $m = new \Lower\PBenddeclare();
-        $m = new \Lower\PBendfor();
-        $m = new \Lower\PBendforeach();
-        $m = new \Lower\PBendif();
-        $m = new \Lower\PBendswitch();
-        $m = new \Lower\PBendwhile();
-        $m = new \Lower\PBeval();
-        $m = new \Lower\PBexit();
-        $m = new \Lower\PBextends();
-        $m = new \Lower\PBfinal();
-        $m = new \Lower\PBfor();
-        $m = new \Lower\PBforeach();
-        $m = new \Lower\PBfunction();
-        $m = new \Lower\PBglobal();
-        $m = new \Lower\PBgoto();
-        $m = new \Lower\PBif();
-        $m = new \Lower\PBimplements();
-        $m = new \Lower\PBinclude();
-        $m = new \Lower\PBinclude_once();
-        $m = new \Lower\PBinstanceof();
-        $m = new \Lower\PBinsteadof();
-        $m = new \Lower\PBinterface();
-        $m = new \Lower\PBisset();
-        $m = new \Lower\PBlist();
-        $m = new \Lower\PBnamespace();
-        $m = new \Lower\PBnew();
-        $m = new \Lower\PBor();
-        $m = new \Lower\PBprint();
-        $m = new \Lower\PBprivate();
-        $m = new \Lower\PBprotected();
-        $m = new \Lower\PBpublic();
-        $m = new \Lower\PBrequire();
-        $m = new \Lower\PBrequire_once();
-        $m = new \Lower\PBreturn();
-        $m = new \Lower\PBstatic();
-        $m = new \Lower\PBswitch();
-        $m = new \Lower\PBthrow();
-        $m = new \Lower\PBtrait();
-        $m = new \Lower\PBtry();
-        $m = new \Lower\PBunset();
-        $m = new \Lower\PBuse();
-        $m = new \Lower\PBvar();
-        $m = new \Lower\PBwhile();
-        $m = new \Lower\PBxor();
-        $m = new \Lower\PBint();
-        $m = new \Lower\PBfloat();
-        $m = new \Lower\PBbool();
-        $m = new \Lower\PBstring();
-        $m = new \Lower\PBtrue();
-        $m = new \Lower\PBfalse();
-        $m = new \Lower\PBnull();
-        $m = new \Lower\PBvoid();
-        $m = new \Lower\PBiterable();
-
-        $m = new \Upper\PBABSTRACT();
-        $m = new \Upper\PBAND();
-        $m = new \Upper\PBARRAY();
-        $m = new \Upper\PBAS();
-        $m = new \Upper\PBBREAK();
-        $m = new \Upper\PBCALLABLE();
-        $m = new \Upper\PBCASE();
-        $m = new \Upper\PBCATCH();
-        $m = new \Upper\PBCLASS();
-        $m = new \Upper\PBCLONE();
-        $m = new \Upper\PBCONST();
-        $m = new \Upper\PBCONTINUE();
-        $m = new \Upper\PBDECLARE();
-        $m = new \Upper\PBDEFAULT();
-        $m = new \Upper\PBDIE();
-        $m = new \Upper\PBDO();
-        $m = new \Upper\PBECHO();
-        $m = new \Upper\PBELSE();
-        $m = new \Upper\PBELSEIF();
-        $m = new \Upper\PBEMPTY();
-        $m = new \Upper\PBENDDECLARE();
-        $m = new \Upper\PBENDFOR();
-        $m = new \Upper\PBENDFOREACH();
-        $m = new \Upper\PBENDIF();
-        $m = new \Upper\PBENDSWITCH();
-        $m = new \Upper\PBENDWHILE();
-        $m = new \Upper\PBEVAL();
-        $m = new \Upper\PBEXIT();
-        $m = new \Upper\PBEXTENDS();
-        $m = new \Upper\PBFINAL();
-        $m = new \Upper\PBFOR();
-        $m = new \Upper\PBFOREACH();
-        $m = new \Upper\PBFUNCTION();
-        $m = new \Upper\PBGLOBAL();
-        $m = new \Upper\PBGOTO();
-        $m = new \Upper\PBIF();
-        $m = new \Upper\PBIMPLEMENTS();
-        $m = new \Upper\PBINCLUDE();
-        $m = new \Upper\PBINCLUDE_ONCE();
-        $m = new \Upper\PBINSTANCEOF();
-        $m = new \Upper\PBINSTEADOF();
-        $m = new \Upper\PBINTERFACE();
-        $m = new \Upper\PBISSET();
-        $m = new \Upper\PBLIST();
-        $m = new \Upper\PBNAMESPACE();
-        $m = new \Upper\PBNEW();
-        $m = new \Upper\PBOR();
-        $m = new \Upper\PBPRINT();
-        $m = new \Upper\PBPRIVATE();
-        $m = new \Upper\PBPROTECTED();
-        $m = new \Upper\PBPUBLIC();
-        $m = new \Upper\PBREQUIRE();
-        $m = new \Upper\PBREQUIRE_ONCE();
-        $m = new \Upper\PBRETURN();
-        $m = new \Upper\PBSTATIC();
-        $m = new \Upper\PBSWITCH();
-        $m = new \Upper\PBTHROW();
-        $m = new \Upper\PBTRAIT();
-        $m = new \Upper\PBTRY();
-        $m = new \Upper\PBUNSET();
-        $m = new \Upper\PBUSE();
-        $m = new \Upper\PBVAR();
-        $m = new \Upper\PBWHILE();
-        $m = new \Upper\PBXOR();
-        $m = new \Upper\PBINT();
-        $m = new \Upper\PBFLOAT();
-        $m = new \Upper\PBBOOL();
-        $m = new \Upper\PBSTRING();
-        $m = new \Upper\PBTRUE();
-        $m = new \Upper\PBFALSE();
-        $m = new \Upper\PBNULL();
-        $m = new \Upper\PBVOID();
-        $m = new \Upper\PBITERABLE();
-
-        $m = new \Lower_enum\PBabstract();
-        $m = new \Lower_enum\PBand();
-        $m = new \Lower_enum\PBarray();
-        $m = new \Lower_enum\PBas();
-        $m = new \Lower_enum\PBbreak();
-        $m = new \Lower_enum\PBcallable();
-        $m = new \Lower_enum\PBcase();
-        $m = new \Lower_enum\PBcatch();
-        $m = new \Lower_enum\PBclass();
-        $m = new \Lower_enum\PBclone();
-        $m = new \Lower_enum\PBconst();
-        $m = new \Lower_enum\PBcontinue();
-        $m = new \Lower_enum\PBdeclare();
-        $m = new \Lower_enum\PBdefault();
-        $m = new \Lower_enum\PBdie();
-        $m = new \Lower_enum\PBdo();
-        $m = new \Lower_enum\PBecho();
-        $m = new \Lower_enum\PBelse();
-        $m = new \Lower_enum\PBelseif();
-        $m = new \Lower_enum\PBempty();
-        $m = new \Lower_enum\PBenddeclare();
-        $m = new \Lower_enum\PBendfor();
-        $m = new \Lower_enum\PBendforeach();
-        $m = new \Lower_enum\PBendif();
-        $m = new \Lower_enum\PBendswitch();
-        $m = new \Lower_enum\PBendwhile();
-        $m = new \Lower_enum\PBeval();
-        $m = new \Lower_enum\PBexit();
-        $m = new \Lower_enum\PBextends();
-        $m = new \Lower_enum\PBfinal();
-        $m = new \Lower_enum\PBfor();
-        $m = new \Lower_enum\PBforeach();
-        $m = new \Lower_enum\PBfunction();
-        $m = new \Lower_enum\PBglobal();
-        $m = new \Lower_enum\PBgoto();
-        $m = new \Lower_enum\PBif();
-        $m = new \Lower_enum\PBimplements();
-        $m = new \Lower_enum\PBinclude();
-        $m = new \Lower_enum\PBinclude_once();
-        $m = new \Lower_enum\PBinstanceof();
-        $m = new \Lower_enum\PBinsteadof();
-        $m = new \Lower_enum\PBinterface();
-        $m = new \Lower_enum\PBisset();
-        $m = new \Lower_enum\PBlist();
-        $m = new \Lower_enum\PBnamespace();
-        $m = new \Lower_enum\PBnew();
-        $m = new \Lower_enum\PBor();
-        $m = new \Lower_enum\PBprint();
-        $m = new \Lower_enum\PBprivate();
-        $m = new \Lower_enum\PBprotected();
-        $m = new \Lower_enum\PBpublic();
-        $m = new \Lower_enum\PBrequire();
-        $m = new \Lower_enum\PBrequire_once();
-        $m = new \Lower_enum\PBreturn();
-        $m = new \Lower_enum\PBstatic();
-        $m = new \Lower_enum\PBswitch();
-        $m = new \Lower_enum\PBthrow();
-        $m = new \Lower_enum\PBtrait();
-        $m = new \Lower_enum\PBtry();
-        $m = new \Lower_enum\PBunset();
-        $m = new \Lower_enum\PBuse();
-        $m = new \Lower_enum\PBvar();
-        $m = new \Lower_enum\PBwhile();
-        $m = new \Lower_enum\PBxor();
-        $m = new \Lower_enum\PBint();
-        $m = new \Lower_enum\PBfloat();
-        $m = new \Lower_enum\PBbool();
-        $m = new \Lower_enum\PBstring();
-        $m = new \Lower_enum\PBtrue();
-        $m = new \Lower_enum\PBfalse();
-        $m = new \Lower_enum\PBnull();
-        $m = new \Lower_enum\PBvoid();
-        $m = new \Lower_enum\PBiterable();
-
-        $m = new \Upper_enum\PBABSTRACT();
-        $m = new \Upper_enum\PBAND();
-        $m = new \Upper_enum\PBARRAY();
-        $m = new \Upper_enum\PBAS();
-        $m = new \Upper_enum\PBBREAK();
-        $m = new \Upper_enum\PBCALLABLE();
-        $m = new \Upper_enum\PBCASE();
-        $m = new \Upper_enum\PBCATCH();
-        $m = new \Upper_enum\PBCLASS();
-        $m = new \Upper_enum\PBCLONE();
-        $m = new \Upper_enum\PBCONST();
-        $m = new \Upper_enum\PBCONTINUE();
-        $m = new \Upper_enum\PBDECLARE();
-        $m = new \Upper_enum\PBDEFAULT();
-        $m = new \Upper_enum\PBDIE();
-        $m = new \Upper_enum\PBDO();
-        $m = new \Upper_enum\PBECHO();
-        $m = new \Upper_enum\PBELSE();
-        $m = new \Upper_enum\PBELSEIF();
-        $m = new \Upper_enum\PBEMPTY();
-        $m = new \Upper_enum\PBENDDECLARE();
-        $m = new \Upper_enum\PBENDFOR();
-        $m = new \Upper_enum\PBENDFOREACH();
-        $m = new \Upper_enum\PBENDIF();
-        $m = new \Upper_enum\PBENDSWITCH();
-        $m = new \Upper_enum\PBENDWHILE();
-        $m = new \Upper_enum\PBEVAL();
-        $m = new \Upper_enum\PBEXIT();
-        $m = new \Upper_enum\PBEXTENDS();
-        $m = new \Upper_enum\PBFINAL();
-        $m = new \Upper_enum\PBFOR();
-        $m = new \Upper_enum\PBFOREACH();
-        $m = new \Upper_enum\PBFUNCTION();
-        $m = new \Upper_enum\PBGLOBAL();
-        $m = new \Upper_enum\PBGOTO();
-        $m = new \Upper_enum\PBIF();
-        $m = new \Upper_enum\PBIMPLEMENTS();
-        $m = new \Upper_enum\PBINCLUDE();
-        $m = new \Upper_enum\PBINCLUDE_ONCE();
-        $m = new \Upper_enum\PBINSTANCEOF();
-        $m = new \Upper_enum\PBINSTEADOF();
-        $m = new \Upper_enum\PBINTERFACE();
-        $m = new \Upper_enum\PBISSET();
-        $m = new \Upper_enum\PBLIST();
-        $m = new \Upper_enum\PBNAMESPACE();
-        $m = new \Upper_enum\PBNEW();
-        $m = new \Upper_enum\PBOR();
-        $m = new \Upper_enum\PBPRINT();
-        $m = new \Upper_enum\PBPRIVATE();
-        $m = new \Upper_enum\PBPROTECTED();
-        $m = new \Upper_enum\PBPUBLIC();
-        $m = new \Upper_enum\PBREQUIRE();
-        $m = new \Upper_enum\PBREQUIRE_ONCE();
-        $m = new \Upper_enum\PBRETURN();
-        $m = new \Upper_enum\PBSTATIC();
-        $m = new \Upper_enum\PBSWITCH();
-        $m = new \Upper_enum\PBTHROW();
-        $m = new \Upper_enum\PBTRAIT();
-        $m = new \Upper_enum\PBTRY();
-        $m = new \Upper_enum\PBUNSET();
-        $m = new \Upper_enum\PBUSE();
-        $m = new \Upper_enum\PBVAR();
-        $m = new \Upper_enum\PBWHILE();
-        $m = new \Upper_enum\PBXOR();
-        $m = new \Upper_enum\PBINT();
-        $m = new \Upper_enum\PBFLOAT();
-        $m = new \Upper_enum\PBBOOL();
-        $m = new \Upper_enum\PBSTRING();
-        $m = new \Upper_enum\PBTRUE();
-        $m = new \Upper_enum\PBFALSE();
-        $m = new \Upper_enum\PBNULL();
-        $m = new \Upper_enum\PBVOID();
-        $m = new \Upper_enum\PBITERABLE();
-
-        $m = \Lower_enum_value\NotAllowed::PBabstract;
-        $m = \Lower_enum_value\NotAllowed::PBand;
-        $m = \Lower_enum_value\NotAllowed::PBarray;
-        $m = \Lower_enum_value\NotAllowed::PBas;
-        $m = \Lower_enum_value\NotAllowed::PBbreak;
-        $m = \Lower_enum_value\NotAllowed::PBcallable;
-        $m = \Lower_enum_value\NotAllowed::PBcase;
-        $m = \Lower_enum_value\NotAllowed::PBcatch;
-        $m = \Lower_enum_value\NotAllowed::PBclass;
-        $m = \Lower_enum_value\NotAllowed::PBclone;
-        $m = \Lower_enum_value\NotAllowed::PBconst;
-        $m = \Lower_enum_value\NotAllowed::PBcontinue;
-        $m = \Lower_enum_value\NotAllowed::PBdeclare;
-        $m = \Lower_enum_value\NotAllowed::PBdefault;
-        $m = \Lower_enum_value\NotAllowed::PBdie;
-        $m = \Lower_enum_value\NotAllowed::PBdo;
-        $m = \Lower_enum_value\NotAllowed::PBecho;
-        $m = \Lower_enum_value\NotAllowed::PBelse;
-        $m = \Lower_enum_value\NotAllowed::PBelseif;
-        $m = \Lower_enum_value\NotAllowed::PBempty;
-        $m = \Lower_enum_value\NotAllowed::PBenddeclare;
-        $m = \Lower_enum_value\NotAllowed::PBendfor;
-        $m = \Lower_enum_value\NotAllowed::PBendforeach;
-        $m = \Lower_enum_value\NotAllowed::PBendif;
-        $m = \Lower_enum_value\NotAllowed::PBendswitch;
-        $m = \Lower_enum_value\NotAllowed::PBendwhile;
-        $m = \Lower_enum_value\NotAllowed::PBeval;
-        $m = \Lower_enum_value\NotAllowed::PBexit;
-        $m = \Lower_enum_value\NotAllowed::PBextends;
-        $m = \Lower_enum_value\NotAllowed::PBfinal;
-        $m = \Lower_enum_value\NotAllowed::PBfor;
-        $m = \Lower_enum_value\NotAllowed::PBforeach;
-        $m = \Lower_enum_value\NotAllowed::PBfunction;
-        $m = \Lower_enum_value\NotAllowed::PBglobal;
-        $m = \Lower_enum_value\NotAllowed::PBgoto;
-        $m = \Lower_enum_value\NotAllowed::PBif;
-        $m = \Lower_enum_value\NotAllowed::PBimplements;
-        $m = \Lower_enum_value\NotAllowed::PBinclude;
-        $m = \Lower_enum_value\NotAllowed::PBinclude_once;
-        $m = \Lower_enum_value\NotAllowed::PBinstanceof;
-        $m = \Lower_enum_value\NotAllowed::PBinsteadof;
-        $m = \Lower_enum_value\NotAllowed::PBinterface;
-        $m = \Lower_enum_value\NotAllowed::PBisset;
-        $m = \Lower_enum_value\NotAllowed::PBlist;
-        $m = \Lower_enum_value\NotAllowed::PBnamespace;
-        $m = \Lower_enum_value\NotAllowed::PBnew;
-        $m = \Lower_enum_value\NotAllowed::PBor;
-        $m = \Lower_enum_value\NotAllowed::PBprint;
-        $m = \Lower_enum_value\NotAllowed::PBprivate;
-        $m = \Lower_enum_value\NotAllowed::PBprotected;
-        $m = \Lower_enum_value\NotAllowed::PBpublic;
-        $m = \Lower_enum_value\NotAllowed::PBrequire;
-        $m = \Lower_enum_value\NotAllowed::PBrequire_once;
-        $m = \Lower_enum_value\NotAllowed::PBreturn;
-        $m = \Lower_enum_value\NotAllowed::PBstatic;
-        $m = \Lower_enum_value\NotAllowed::PBswitch;
-        $m = \Lower_enum_value\NotAllowed::PBthrow;
-        $m = \Lower_enum_value\NotAllowed::PBtrait;
-        $m = \Lower_enum_value\NotAllowed::PBtry;
-        $m = \Lower_enum_value\NotAllowed::PBunset;
-        $m = \Lower_enum_value\NotAllowed::PBuse;
-        $m = \Lower_enum_value\NotAllowed::PBvar;
-        $m = \Lower_enum_value\NotAllowed::PBwhile;
-        $m = \Lower_enum_value\NotAllowed::PBxor;
-        $m = \Lower_enum_value\NotAllowed::int;
-        $m = \Lower_enum_value\NotAllowed::float;
-        $m = \Lower_enum_value\NotAllowed::bool;
-        $m = \Lower_enum_value\NotAllowed::string;
-        $m = \Lower_enum_value\NotAllowed::true;
-        $m = \Lower_enum_value\NotAllowed::false;
-        $m = \Lower_enum_value\NotAllowed::null;
-        $m = \Lower_enum_value\NotAllowed::void;
-        $m = \Lower_enum_value\NotAllowed::iterable;
-
-        $m = \Upper_enum_value\NotAllowed::PBABSTRACT;
-        $m = \Upper_enum_value\NotAllowed::PBAND;
-        $m = \Upper_enum_value\NotAllowed::PBARRAY;
-        $m = \Upper_enum_value\NotAllowed::PBAS;
-        $m = \Upper_enum_value\NotAllowed::PBBREAK;
-        $m = \Upper_enum_value\NotAllowed::PBCALLABLE;
-        $m = \Upper_enum_value\NotAllowed::PBCASE;
-        $m = \Upper_enum_value\NotAllowed::PBCATCH;
-        $m = \Upper_enum_value\NotAllowed::PBCLASS;
-        $m = \Upper_enum_value\NotAllowed::PBCLONE;
-        $m = \Upper_enum_value\NotAllowed::PBCONST;
-        $m = \Upper_enum_value\NotAllowed::PBCONTINUE;
-        $m = \Upper_enum_value\NotAllowed::PBDECLARE;
-        $m = \Upper_enum_value\NotAllowed::PBDEFAULT;
-        $m = \Upper_enum_value\NotAllowed::PBDIE;
-        $m = \Upper_enum_value\NotAllowed::PBDO;
-        $m = \Upper_enum_value\NotAllowed::PBECHO;
-        $m = \Upper_enum_value\NotAllowed::PBELSE;
-        $m = \Upper_enum_value\NotAllowed::PBELSEIF;
-        $m = \Upper_enum_value\NotAllowed::PBEMPTY;
-        $m = \Upper_enum_value\NotAllowed::PBENDDECLARE;
-        $m = \Upper_enum_value\NotAllowed::PBENDFOR;
-        $m = \Upper_enum_value\NotAllowed::PBENDFOREACH;
-        $m = \Upper_enum_value\NotAllowed::PBENDIF;
-        $m = \Upper_enum_value\NotAllowed::PBENDSWITCH;
-        $m = \Upper_enum_value\NotAllowed::PBENDWHILE;
-        $m = \Upper_enum_value\NotAllowed::PBEVAL;
-        $m = \Upper_enum_value\NotAllowed::PBEXIT;
-        $m = \Upper_enum_value\NotAllowed::PBEXTENDS;
-        $m = \Upper_enum_value\NotAllowed::PBFINAL;
-        $m = \Upper_enum_value\NotAllowed::PBFOR;
-        $m = \Upper_enum_value\NotAllowed::PBFOREACH;
-        $m = \Upper_enum_value\NotAllowed::PBFUNCTION;
-        $m = \Upper_enum_value\NotAllowed::PBGLOBAL;
-        $m = \Upper_enum_value\NotAllowed::PBGOTO;
-        $m = \Upper_enum_value\NotAllowed::PBIF;
-        $m = \Upper_enum_value\NotAllowed::PBIMPLEMENTS;
-        $m = \Upper_enum_value\NotAllowed::PBINCLUDE;
-        $m = \Upper_enum_value\NotAllowed::PBINCLUDE_ONCE;
-        $m = \Upper_enum_value\NotAllowed::PBINSTANCEOF;
-        $m = \Upper_enum_value\NotAllowed::PBINSTEADOF;
-        $m = \Upper_enum_value\NotAllowed::PBINTERFACE;
-        $m = \Upper_enum_value\NotAllowed::PBISSET;
-        $m = \Upper_enum_value\NotAllowed::PBLIST;
-        $m = \Upper_enum_value\NotAllowed::PBNAMESPACE;
-        $m = \Upper_enum_value\NotAllowed::PBNEW;
-        $m = \Upper_enum_value\NotAllowed::PBOR;
-        $m = \Upper_enum_value\NotAllowed::PBPRINT;
-        $m = \Upper_enum_value\NotAllowed::PBPRIVATE;
-        $m = \Upper_enum_value\NotAllowed::PBPROTECTED;
-        $m = \Upper_enum_value\NotAllowed::PBPUBLIC;
-        $m = \Upper_enum_value\NotAllowed::PBREQUIRE;
-        $m = \Upper_enum_value\NotAllowed::PBREQUIRE_ONCE;
-        $m = \Upper_enum_value\NotAllowed::PBRETURN;
-        $m = \Upper_enum_value\NotAllowed::PBSTATIC;
-        $m = \Upper_enum_value\NotAllowed::PBSWITCH;
-        $m = \Upper_enum_value\NotAllowed::PBTHROW;
-        $m = \Upper_enum_value\NotAllowed::PBTRAIT;
-        $m = \Upper_enum_value\NotAllowed::PBTRY;
-        $m = \Upper_enum_value\NotAllowed::PBUNSET;
-        $m = \Upper_enum_value\NotAllowed::PBUSE;
-        $m = \Upper_enum_value\NotAllowed::PBVAR;
-        $m = \Upper_enum_value\NotAllowed::PBWHILE;
-        $m = \Upper_enum_value\NotAllowed::PBXOR;
-        $m = \Upper_enum_value\NotAllowed::INT;
-        $m = \Upper_enum_value\NotAllowed::FLOAT;
-        $m = \Upper_enum_value\NotAllowed::BOOL;
-        $m = \Upper_enum_value\NotAllowed::STRING;
-        $m = \Upper_enum_value\NotAllowed::TRUE;
-        $m = \Upper_enum_value\NotAllowed::FALSE;
-        $m = \Upper_enum_value\NotAllowed::NULL;
-        $m = \Upper_enum_value\NotAllowed::VOID;
-        $m = \Upper_enum_value\NotAllowed::ITERABLE;
-    }
-
-    #########################################################
-    # Test fluent setters.
-    #########################################################
-
-    public function testFluentSetters()
-    {
-        $m = (new TestMessage())
-            ->setOptionalInt32(1)
-            ->setOptionalUInt32(2);
-        $this->assertSame(1, $m->getOptionalInt32());
-        $this->assertSame(2, $m->getOptionalUInt32());
-    }
-
-    #########################################################
-    # Test Reverse Field Order.
-    #########################################################
-
-    public function testReverseFieldOrder()
-    {
-        $m = new TestReverseFieldOrder();
-        $m->setB("abc");
-        $this->assertSame("abc", $m->getB());
-        $this->assertNotSame("abc", $m->getA());
-    }
-
-    #########################################################
-    # Test Reverse Field Order.
-    #########################################################
-
-    public function testLowerCase()
-    {
-        $m = new testLowerCaseMessage();
-        $n = testLowerCaseEnum::VALUE;
-    }
-}
diff --git a/php/tests/generated_phpdoc_test.php b/php/tests/generated_phpdoc_test.php
deleted file mode 100644
index 6c1a26f..0000000
--- a/php/tests/generated_phpdoc_test.php
+++ /dev/null
@@ -1,337 +0,0 @@
-<?php
-
-require_once('generated/NoNamespaceEnum.php');
-require_once('generated/NoNamespaceMessage.php');
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Foo\TestMessage;
-
-class GeneratedPhpdocTest extends TestBase
-{
-    public function testPhpDocForClass()
-    {
-        $class = new ReflectionClass('Foo\TestMessage');
-        $doc = $class->getDocComment();
-        $this->assertContains('foo.TestMessage', $doc);
-    }
-
-    /**
-     * @dataProvider providePhpDocForGettersAndSetters
-     */
-    public function testPhpDocForIntGetters($methods, $expectedDoc)
-    {
-        $class = new ReflectionClass('Foo\TestMessage');
-        foreach ($methods as $method) {
-            $doc = $class->getMethod($method)->getDocComment();
-            $this->assertContains($expectedDoc, $doc);
-        }
-    }
-
-    public function providePhpDocForGettersAndSetters()
-    {
-        return [
-            [
-                [
-                    'setOptionalInt32',
-                    'setOptionalUint32',
-                    'setOptionalSint32',
-                    'setOptionalFixed32',
-                    'setOptionalSfixed32',
-                    'setOneofInt32',
-                    'setOneofUint32',
-                    'setOneofSint32',
-                    'setOneofFixed32',
-                    'setOneofSfixed32',
-                    'setOptionalEnum',
-                    'setOptionalNoNamespaceEnum',
-                    'setOptionalNestedEnum',
-                    'setOneofEnum'
-                ],
-                '@param int $var'
-            ],
-            [
-                [
-                    'setOptionalInt64',
-                    'setOptionalUint64',
-                    'setOptionalSint64',
-                    'setOptionalFixed64',
-                    'setOptionalSfixed64',
-                    'setOneofInt64',
-                    'setOneofUint64',
-                    'setOneofSint64',
-                    'setOneofFixed64',
-                    'setOneofSfixed64',
-                ],
-                '@param int|string $var'
-            ],
-            [
-                [
-                    'getOptionalInt32',
-                    'getOptionalUint32',
-                    'getOptionalSint32',
-                    'getOptionalFixed32',
-                    'getOptionalSfixed32',
-                    'getOneofInt32',
-                    'getOneofUint32',
-                    'getOneofSint32',
-                    'getOneofFixed32',
-                    'getOneofSfixed32',
-                    'getOptionalEnum',
-                    'getOptionalNoNamespaceEnum',
-                    'getOptionalNestedEnum',
-                    'getOneofEnum',
-                ],
-                '@return int'
-            ],
-            [
-                [
-                    'setOptionalInt64',
-                    'setOptionalUint64',
-                    'setOptionalSint64',
-                    'setOptionalFixed64',
-                    'setOptionalSfixed64',
-                    'setOneofInt64',
-                    'setOneofUint64',
-                    'setOneofSint64',
-                    'setOneofFixed64',
-                    'setOneofSfixed64',
-                ],
-                '@param int|string $var'
-            ],
-            [
-                [
-                    'getRepeatedInt32',
-                    'getRepeatedInt64',
-                    'getRepeatedUint32',
-                    'getRepeatedUint64',
-                    'getRepeatedSint32',
-                    'getRepeatedSint64',
-                    'getRepeatedFixed32',
-                    'getRepeatedFixed64',
-                    'getRepeatedSfixed32',
-                    'getRepeatedSfixed64',
-                    'getRepeatedFloat',
-                    'getRepeatedDouble',
-                    'getRepeatedBool',
-                    'getRepeatedString',
-                    'getRepeatedBytes',
-                    'getRepeatedEnum',
-                    'getRepeatedMessage',
-                    'getRepeatedRecursive',
-                    'getRepeatedNoNamespaceMessage',
-                    'getRepeatedNoNamespaceEnum',
-                ],
-                '@return \Google\Protobuf\Internal\RepeatedField'
-            ],
-            [
-                [
-                    'getMapInt32Int32',
-                    'getMapInt64Int64',
-                    'getMapUint32Uint32',
-                    'getMapUint64Uint64',
-                    'getMapSint32Sint32',
-                    'getMapSint64Sint64',
-                    'getMapFixed32Fixed32',
-                    'getMapFixed64Fixed64',
-                    'getMapSfixed32Sfixed32',
-                    'getMapSfixed64Sfixed64',
-                    'getMapInt32Float',
-                    'getMapInt32Double',
-                    'getMapBoolBool',
-                    'getMapStringString',
-                    'getMapInt32Bytes',
-                    'getMapInt32Enum',
-                    'getMapInt32Message',
-                    'getMapRecursive',
-                ],
-                '@return \Google\Protobuf\Internal\MapField'
-            ],
-            [
-                [
-                    'setRepeatedInt32',
-                    'setRepeatedUint32',
-                    'setRepeatedSint32',
-                    'setRepeatedFixed32',
-                    'setRepeatedSfixed32',
-                    'setRepeatedEnum',
-                    'setRepeatedNoNamespaceEnum',
-                ],
-                '@param int[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedInt64',
-                    'setRepeatedUint64',
-                    'setRepeatedSint64',
-                    'setRepeatedFixed64',
-                    'setRepeatedSfixed64',
-                ],
-                '@param int[]|string[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedFloat',
-                    'setRepeatedDouble',
-                ],
-                '@param float[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedBool',
-                ],
-                '@param bool[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedString',
-                    'setRepeatedBytes',
-                ],
-                '@param string[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedMessage',
-                ],
-                '@param \Foo\TestMessage_Sub[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedRecursive',
-                ],
-                '@param \Foo\TestMessage[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setRepeatedNoNamespaceMessage',
-                ],
-                '@param \NoNamespaceMessage[]|\Google\Protobuf\Internal\RepeatedField $var'
-            ],
-            [
-                [
-                    'setMapInt32Int32',
-                    'setMapInt64Int64',
-                    'setMapUint32Uint32',
-                    'setMapUint64Uint64',
-                    'setMapSint32Sint32',
-                    'setMapSint64Sint64',
-                    'setMapFixed32Fixed32',
-                    'setMapFixed64Fixed64',
-                    'setMapSfixed32Sfixed32',
-                    'setMapSfixed64Sfixed64',
-                    'setMapInt32Float',
-                    'setMapInt32Double',
-                    'setMapBoolBool',
-                    'setMapStringString',
-                    'setMapInt32Bytes',
-                    'setMapInt32Enum',
-                    'setMapInt32Message',
-                    'setMapRecursive',
-                ],
-                '@param array|\Google\Protobuf\Internal\MapField $var'
-            ],
-            [
-                [
-                    'getOptionalFloat',
-                    'getOptionalDouble',
-                    'getOneofDouble',
-                    'getOneofFloat',
-                ],
-                '@return float'
-            ],
-            [
-                [
-                    'setOptionalFloat',
-                    'setOptionalDouble',
-                    'setOneofDouble',
-                    'setOneofFloat',
-                ],
-                '@param float $var'
-            ],
-            [
-                [
-                    'getOptionalBool',
-                    'getOneofBool',
-                ],
-                '@return bool'],
-            [
-                [
-                    'setOptionalBool',
-                    'setOneofBool',
-                ],
-                '@param bool $var'
-            ],
-            [
-                [
-                    'getOptionalString',
-                    'getOptionalBytes',
-                    'getOneofString',
-                    'getOneofBytes',
-                    'getMyOneof',
-                ],
-                '@return string'
-            ],
-            [
-                [
-                    'setOptionalString',
-                    'setOptionalBytes',
-                    'setOneofString',
-                    'setOneofBytes',
-                ],
-                '@param string $var'
-            ],
-
-            [
-                [
-                    'getOptionalMessage',
-                    'getOneofMessage'
-                ],
-                '@return \Foo\TestMessage_Sub'
-            ],
-            [
-                [
-                    'setOptionalMessage',
-                    'setOneofMessage'
-                ],
-                '@param \Foo\TestMessage_Sub $var'
-            ],
-            [
-                [
-                    'getOptionalIncludedMessage'
-                ],
-                '@return \Bar\TestInclude'
-            ],
-            [
-                [
-                    'setOptionalIncludedMessage'
-                ],
-                '@param \Bar\TestInclude $var'
-            ],
-            [
-                [
-                    'getRecursive'
-                ],
-                '@return \Foo\TestMessage'
-            ],
-            [
-                [
-                    'setRecursive'
-                ],
-                '@param \Foo\TestMessage $var'
-            ],
-
-            [
-                [
-                    'getOptionalNoNamespaceMessage'
-                ],
-                '@return \NoNamespaceMessage'
-            ],
-            [
-                [
-                    'setOptionalNoNamespaceMessage'
-                ],
-                '@param \NoNamespaceMessage $var'
-            ],
-        ];
-    }
-}
diff --git a/php/tests/generated_service_test.php b/php/tests/generated_service_test.php
deleted file mode 100644
index 5407db9..0000000
--- a/php/tests/generated_service_test.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\MapField;
-use Google\Protobuf\Internal\GPBType;
-use Foo\Greeter;
-use Foo\HelloRequest;
-use Foo\HelloReply;
-
-class GeneratedServiceTest extends TestBase
-{
-    /**
-     * @var \ReflectionClass
-     */
-    private $serviceClass;
-
-    /**
-     * @var \ReflectionClass
-     */
-    private $namespacedServiceClass;
-
-    /**
-     * @var array
-     */
-    private $methodNames = [
-        'sayHello',
-        'sayHelloAgain'
-    ];
-
-    public function setUp()
-    {
-        parent::setUp();
-
-        $this->serviceClass = new ReflectionClass('Foo\GreeterInterface');
-
-        $this->namespacedServiceClass = new ReflectionClass('Bar\OtherGreeterInterface');
-    }
-
-    public function testIsInterface()
-    {
-        $this->assertTrue($this->serviceClass->isInterface());
-    }
-
-    public function testPhpDocForClass()
-    {
-        $this->assertContains('foo.Greeter', $this->serviceClass->getDocComment());
-    }
-
-    public function testPhpDocForNamespacedClass()
-    {
-        $this->assertContains('foo.OtherGreeter', $this->namespacedServiceClass->getDocComment());
-    }
-
-    public function testServiceMethodsAreGenerated()
-    {
-        $this->assertCount(count($this->methodNames), $this->serviceClass->getMethods());
-        foreach ($this->methodNames as $methodName) {
-            $this->assertTrue($this->serviceClass->hasMethod($methodName));
-        }
-    }
-
-    public function testPhpDocForServiceMethod()
-    {
-        foreach ($this->methodNames as $methodName) {
-            $docComment = $this->serviceClass->getMethod($methodName)->getDocComment();
-            $this->assertContains($methodName, $docComment);
-            $this->assertContains('@param \Foo\HelloRequest $request', $docComment);
-            $this->assertContains('@return \Foo\HelloReply', $docComment);
-        }
-    }
-
-    public function testPhpDocForServiceMethodInNamespacedClass()
-    {
-        foreach ($this->methodNames as $methodName) {
-            $docComment = $this->namespacedServiceClass->getMethod($methodName)->getDocComment();
-            $this->assertContains($methodName, $docComment);
-            $this->assertContains('@param \Foo\HelloRequest $request', $docComment);
-            $this->assertContains('@return \Foo\HelloReply', $docComment);
-        }
-    }
-
-    public function testParamForServiceMethod()
-    {
-        foreach ($this->methodNames as $methodName) {
-            $method = $this->serviceClass->getMethod($methodName);
-            $this->assertCount(1, $method->getParameters());
-            $param = $method->getParameters()[0];
-            $this->assertFalse($param->isOptional());
-            $this->assertSame('request', $param->getName());
-            // ReflectionParameter::getType only exists in PHP 7+, so get the type from __toString
-            $this->assertContains('Foo\HelloRequest $request', (string) $param);
-        }
-    }
-
-    public function testParamForServiceMethodInNamespacedClass()
-    {
-        foreach ($this->methodNames as $methodName) {
-            $method = $this->serviceClass->getMethod($methodName);
-            $this->assertCount(1, $method->getParameters());
-            $param = $method->getParameters()[0];
-            $this->assertFalse($param->isOptional());
-            $this->assertSame('request', $param->getName());
-            // ReflectionParameter::getType only exists in PHP 7+, so get the type from __toString
-            $this->assertContains('Foo\HelloRequest $request', (string) $param);
-        }
-    }
-}
diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php
deleted file mode 100644
index cffa252..0000000
--- a/php/tests/map_field_test.php
+++ /dev/null
@@ -1,468 +0,0 @@
-<?php
-
-require_once('test_util.php');
-
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\MapField;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-
-class MapFieldTest extends PHPUnit_Framework_TestCase {
-
-    #########################################################
-    # Test int32 field.
-    #########################################################
-
-    public function testInt32() {
-        $arr = new MapField(GPBType::INT32, GPBType::INT32);
-
-        // Test integer argument.
-        $arr[MAX_INT32] = MAX_INT32;
-        $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
-        $arr[MIN_INT32] = MIN_INT32;
-        $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
-        $this->assertEquals(2, count($arr));
-        $this->assertTrue(isset($arr[MAX_INT32]));
-        $this->assertTrue(isset($arr[MIN_INT32]));
-        unset($arr[MAX_INT32]);
-        unset($arr[MIN_INT32]);
-        $this->assertEquals(0, count($arr));
-
-        // Test float argument.
-        $arr[1.9] = 1.9;
-        $arr[2.1] = 2.1;
-        $this->assertSame(1, $arr[1]);
-        $this->assertSame(2, $arr[2]);
-        $arr[MAX_INT32_FLOAT] = MAX_INT32_FLOAT;
-        $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
-        $arr[MIN_INT32_FLOAT] = MIN_INT32_FLOAT;
-        $this->assertSame(MIN_INT32, $arr[MIN_INT32]);
-        $this->assertEquals(4, count($arr));
-        unset($arr[1.9]);
-        unset($arr[2.9]);
-        unset($arr[MAX_INT32_FLOAT]);
-        unset($arr[MIN_INT32_FLOAT]);
-        $this->assertEquals(0, count($arr));
-
-        // Test string argument.
-        $arr['2'] = '2';
-        $this->assertSame(2, $arr[2]);
-        $arr['3.1'] = '3.1';
-        $this->assertSame(3, $arr[3]);
-        $arr[MAX_INT32_STRING] = MAX_INT32_STRING;
-        $this->assertSame(MAX_INT32, $arr[MAX_INT32]);
-        $this->assertEquals(3, count($arr));
-        unset($arr['2']);
-        unset($arr['3.1']);
-        unset($arr[MAX_INT32_STRING]);
-        $this->assertEquals(0, count($arr));
-
-        // Test foreach.
-        $arr = new MapField(GPBType::INT32, GPBType::INT32);
-        for ($i = 0; $i < 3; $i++) {
-          $arr[$i] = $i;
-        }
-        $i = 0;
-        $arr_test = [];
-        foreach ($arr as $key => $val) {
-          $this->assertSame($key, $val);
-          $arr_test[] = $key;
-          $i++;
-        }
-        $this->assertTrue(isset($arr_test[0]));
-        $this->assertTrue(isset($arr_test[1]));
-        $this->assertTrue(isset($arr_test[2]));
-        $this->assertSame(3, $i);
-    }
-
-    #########################################################
-    # Test uint32 field.
-    #########################################################
-
-    public function testUint32() {
-        $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
-
-        // Test integer argument.
-        $arr[MAX_UINT32] = MAX_UINT32;
-        $this->assertSame(-1, $arr[-1]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[MAX_UINT32]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[-1] = -1;
-        $this->assertSame(-1, $arr[-1]);
-        $arr[MIN_UINT32] = MIN_UINT32;
-        $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
-        $this->assertEquals(2, count($arr));
-        unset($arr[-1]);
-        unset($arr[MIN_UINT32]);
-        $this->assertEquals(0, count($arr));
-
-        // Test float argument.
-        $arr[MAX_UINT32_FLOAT] = MAX_UINT32_FLOAT;
-        $this->assertSame(-1, $arr[-1]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[MAX_UINT32_FLOAT]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[3.1] = 3.1;
-        $this->assertSame(3, $arr[3]);
-        $arr[-1.0] = -1.0;
-        $this->assertSame(-1, $arr[-1]);
-        $arr[MIN_UINT32_FLOAT] = MIN_UINT32_FLOAT;
-        $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
-        $this->assertEquals(3, count($arr));
-        unset($arr[3.1]);
-        unset($arr[-1.0]);
-        unset($arr[MIN_UINT32_FLOAT]);
-        $this->assertEquals(0, count($arr));
-
-        // Test string argument.
-        $arr[MAX_UINT32_STRING] = MAX_UINT32_STRING;
-        $this->assertSame(-1, $arr[-1]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[MAX_UINT32_STRING]);
-        $this->assertEquals(0, count($arr));
-
-        $arr['7'] = '7';
-        $this->assertSame(7, $arr[7]);
-        $arr['3.1'] = '3.1';
-        $this->assertSame(3, $arr[3]);
-        $arr['-1.0'] = '-1.0';
-        $this->assertSame(-1, $arr[-1]);
-        $arr[MIN_UINT32_STRING] = MIN_UINT32_STRING;
-        $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]);
-        $this->assertEquals(4, count($arr));
-        unset($arr['7']);
-        unset($arr['3.1']);
-        unset($arr['-1.0']);
-        unset($arr[MIN_UINT32_STRING]);
-        $this->assertEquals(0, count($arr));
-    }
-
-    #########################################################
-    # Test int64 field.
-    #########################################################
-
-    public function testInt64() {
-        $arr = new MapField(GPBType::INT64, GPBType::INT64);
-
-        // Test integer argument.
-        $arr[MAX_INT64] = MAX_INT64;
-        $arr[MIN_INT64] = MIN_INT64;
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]);
-            $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]);
-        } else {
-            $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
-            $this->assertSame(MIN_INT64, $arr[MIN_INT64]);
-        }
-        $this->assertEquals(2, count($arr));
-        unset($arr[MAX_INT64]);
-        unset($arr[MIN_INT64]);
-        $this->assertEquals(0, count($arr));
-
-        // Test float argument.
-        $arr[1.1] = 1.1;
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('1', $arr['1']);
-        } else {
-            $this->assertSame(1, $arr[1]);
-        }
-        $this->assertEquals(1, count($arr));
-        unset($arr[1.1]);
-        $this->assertEquals(0, count($arr));
-
-        // Test string argument.
-        $arr['2'] = '2';
-        $arr['3.1'] = '3.1';
-        $arr[MAX_INT64_STRING] = MAX_INT64_STRING;
-        $arr[MIN_INT64_STRING] = MIN_INT64_STRING;
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('2', $arr['2']);
-            $this->assertSame('3', $arr['3']);
-            $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]);
-            $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]);
-        } else {
-            $this->assertSame(2, $arr[2]);
-            $this->assertSame(3, $arr[3]);
-            $this->assertSame(MAX_INT64, $arr[MAX_INT64]);
-            $this->assertSame(MIN_INT64, $arr[MIN_INT64]);
-        }
-        $this->assertEquals(4, count($arr));
-        unset($arr['2']);
-        unset($arr['3.1']);
-        unset($arr[MAX_INT64_STRING]);
-        unset($arr[MIN_INT64_STRING]);
-        $this->assertEquals(0, count($arr));
-    }
-
-    #########################################################
-    # Test uint64 field.
-    #########################################################
-
-    public function testUint64() {
-        $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
-
-        // Test integer argument.
-        $arr[MAX_UINT64] = MAX_UINT64;
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]);
-        } else {
-            $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]);
-        }
-        $this->assertEquals(1, count($arr));
-        unset($arr[MAX_UINT64]);
-        $this->assertEquals(0, count($arr));
-
-        // Test float argument.
-        $arr[1.1] = 1.1;
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('1', $arr['1']);
-        } else {
-            $this->assertSame(1, $arr[1]);
-        }
-        $this->assertEquals(1, count($arr));
-        unset($arr[1.1]);
-        $this->assertEquals(0, count($arr));
-
-        // Test string argument.
-        $arr['2'] = '2';
-        $arr['3.1'] = '3.1';
-        $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING;
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('2', $arr['2']);
-            $this->assertSame('3', $arr['3']);
-            $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]);
-        } else {
-            $this->assertSame(2, $arr[2]);
-            $this->assertSame(3, $arr[3]);
-            $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]);
-        }
-
-        $this->assertEquals(3, count($arr));
-        unset($arr['2']);
-        unset($arr['3.1']);
-        unset($arr[MAX_UINT64_STRING]);
-        $this->assertEquals(0, count($arr));
-    }
-
-    #########################################################
-    # Test float field.
-    #########################################################
-
-    public function testFloat() {
-        $arr = new MapField(GPBType::INT32, GPBType::FLOAT);
-
-        // Test set.
-        $arr[0] = 1;
-        $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
-
-        $arr[1] = 1.1;
-        $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
-
-        $arr[2] = '2';
-        $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
-        $arr[3] = '3.1';
-        $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
-
-        $this->assertEquals(4, count($arr));
-    }
-
-    #########################################################
-    # Test double field.
-    #########################################################
-
-    public function testDouble() {
-        $arr = new MapField(GPBType::INT32, GPBType::DOUBLE);
-
-        // Test set.
-        $arr[0] = 1;
-        $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF);
-
-        $arr[1] = 1.1;
-        $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF);
-
-        $arr[2] = '2';
-        $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF);
-        $arr[3] = '3.1';
-        $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF);
-
-        $this->assertEquals(4, count($arr));
-    }
-
-    #########################################################
-    # Test bool field.
-    #########################################################
-
-    public function testBool() {
-        $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
-
-        // Test boolean.
-        $arr[True] = True;
-        $this->assertSame(True, $arr[True]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[True]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[False] = False;
-        $this->assertSame(False, $arr[False]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[False]);
-        $this->assertEquals(0, count($arr));
-
-        // Test integer.
-        $arr[-1] = -1;
-        $this->assertSame(True, $arr[True]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[-1]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[0] = 0;
-        $this->assertSame(False, $arr[False]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[0]);
-        $this->assertEquals(0, count($arr));
-
-        // Test float.
-        $arr[1.1] = 1.1;
-        $this->assertSame(True, $arr[True]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[1.1]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[0.0] = 0.0;
-        $this->assertSame(False, $arr[False]);
-        $this->assertEquals(1, count($arr));
-        unset($arr[0.0]);
-        $this->assertEquals(0, count($arr));
-
-        // Test string.
-        $arr['a'] = 'a';
-        $this->assertSame(True, $arr[True]);
-        $this->assertEquals(1, count($arr));
-        unset($arr['a']);
-        $this->assertEquals(0, count($arr));
-
-        $arr[''] = '';
-        $this->assertSame(False, $arr[False]);
-        $this->assertEquals(1, count($arr));
-        unset($arr['']);
-        $this->assertEquals(0, count($arr));
-    }
-
-    #########################################################
-    # Test string field.
-    #########################################################
-
-    public function testString() {
-        $arr = new MapField(GPBType::STRING, GPBType::STRING);
-
-        // Test set.
-        $arr['abc'] = 'abc';
-        $this->assertSame('abc', $arr['abc']);
-        $this->assertEquals(1, count($arr));
-        unset($arr['abc']);
-        $this->assertEquals(0, count($arr));
-
-        $arr[1] = 1;
-        $this->assertSame('1', $arr['1']);
-        $this->assertEquals(1, count($arr));
-        unset($arr[1]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[1.1] = 1.1;
-        $this->assertSame('1.1', $arr['1.1']);
-        $this->assertEquals(1, count($arr));
-        unset($arr[1.1]);
-        $this->assertEquals(0, count($arr));
-
-        $arr[True] = True;
-        $this->assertSame('1', $arr['1']);
-        $this->assertEquals(1, count($arr));
-        unset($arr[True]);
-        $this->assertEquals(0, count($arr));
-
-        // Test foreach.
-        $arr = new MapField(GPBType::STRING, GPBType::STRING);
-        for ($i = 0; $i < 3; $i++) {
-          $arr[$i] = $i;
-        }
-        $i = 0;
-        $arr_test = [];
-        foreach ($arr as $key => $val) {
-          $this->assertSame($key, $val);
-          $arr_test[] = $key;
-          $i++;
-        }
-        $this->assertTrue(isset($arr_test['0']));
-        $this->assertTrue(isset($arr_test['1']));
-        $this->assertTrue(isset($arr_test['2']));
-        $this->assertSame(3, $i);
-    }
-
-    #########################################################
-    # Test message field.
-    #########################################################
-
-    public function testMessage() {
-        $arr = new MapField(GPBType::INT32,
-            GPBType::MESSAGE, TestMessage_Sub::class);
-
-        // Test append.
-        $sub_m = new TestMessage_Sub();
-        $sub_m->setA(1);
-        $arr[0] = $sub_m;
-        $this->assertSame(1, $arr[0]->getA());
-
-        $this->assertEquals(1, count($arr));
-
-        // Test foreach.
-        $arr = new MapField(GPBType::INT32,
-            GPBType::MESSAGE, TestMessage_Sub::class);
-        for ($i = 0; $i < 3; $i++) {
-          $arr[$i] = new TestMessage_Sub();;
-          $arr[$i]->setA($i);
-        }
-        $i = 0;
-        $key_test = [];
-        $value_test = [];
-        foreach ($arr as $key => $val) {
-          $key_test[] = $key;
-          $value_test[] = $val->getA();
-          $i++;
-        }
-        $this->assertTrue(isset($key_test['0']));
-        $this->assertTrue(isset($key_test['1']));
-        $this->assertTrue(isset($key_test['2']));
-        $this->assertTrue(isset($value_test['0']));
-        $this->assertTrue(isset($value_test['1']));
-        $this->assertTrue(isset($value_test['2']));
-        $this->assertSame(3, $i);
-    }
-
-    #########################################################
-    # Test memory leak
-    #########################################################
-
-    // TODO(teboring): Add it back.
-    // public function testCycleLeak()
-    // {
-    //     $arr = new MapField(GPBType::INT32,
-    //         GPBType::MESSAGE, TestMessage::class);
-    //     $arr[0] = new TestMessage;
-    //     $arr[0]->SetMapRecursive($arr);
-
-    //     // Clean up memory before test.
-    //     gc_collect_cycles();
-    //     $start = memory_get_usage();
-    //     unset($arr);
-
-    //     // Explicitly trigger garbage collection.
-    //     gc_collect_cycles();
-
-    //     $end = memory_get_usage();
-    //     $this->assertLessThan($start, $end);
-    // }
-}
diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php
deleted file mode 100644
index ad55d57..0000000
--- a/php/tests/memory_leak_test.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-
-# phpunit has memory leak by itself. Thus, it cannot be used to test memory leak.
-
-require_once('generated/NoNamespaceEnum.php');
-require_once('generated/NoNamespaceMessage.php');
-require_once('generated/NoNamespaceMessage_NestedEnum.php');
-require_once('generated/PrefixEmpty.php');
-require_once('generated/PrefixTestPrefix.php');
-require_once('generated/TestEmptyNamespace.php');
-require_once('generated/Bar/TestInclude.php');
-require_once('generated/Foo/PBARRAY.php');
-require_once('generated/Foo/PBEmpty.php');
-require_once('generated/Foo/TestEnum.php');
-require_once('generated/Foo/TestIncludeNamespaceMessage.php');
-require_once('generated/Foo/TestIncludePrefixMessage.php');
-require_once('generated/Foo/TestMessage.php');
-require_once('generated/Foo/TestMessage_Empty.php');
-require_once('generated/Foo/TestMessage_NestedEnum.php');
-require_once('generated/Foo/TestMessage_Sub.php');
-require_once('generated/Foo/TestPackedMessage.php');
-require_once('generated/Foo/TestPhpDoc.php');
-require_once('generated/Foo/TestRandomFieldOrder.php');
-require_once('generated/Foo/TestReverseFieldOrder.php');
-require_once('generated/Foo/TestUnpackedMessage.php');
-require_once('generated/Foo/testLowerCaseMessage.php');
-require_once('generated/Foo/testLowerCaseEnum.php');
-require_once('generated/GPBMetadata/Proto/Test.php');
-require_once('generated/GPBMetadata/Proto/TestEmptyPhpNamespace.php');
-require_once('generated/GPBMetadata/Proto/TestInclude.php');
-require_once('generated/GPBMetadata/Proto/TestNoNamespace.php');
-require_once('generated/GPBMetadata/Proto/TestPhpNamespace.php');
-require_once('generated/GPBMetadata/Proto/TestPrefix.php');
-require_once('generated/Php/Test/TestNamespace.php');
-require_once('test_util.php');
-
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBType;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-
-$from = new TestMessage();
-TestUtil::setTestMessage($from);
-TestUtil::assertTestMessage($from);
-
-$data = $from->serializeToString();
-
-$to = new TestMessage();
-$to->mergeFromString($data);
-
-TestUtil::assertTestMessage($to);
-
-$from = new TestMessage();
-TestUtil::setTestMessage2($from);
-
-$data = $from->serializeToString();
-
-$to->mergeFromString($data);
-
-// TODO(teboring): This causes following tests fail in php7.
-# $from->setRecursive($from);
-
-$arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
-$arr[] = new TestMessage;
-$arr[0]->SetRepeatedRecursive($arr);
-
-// Test oneof fields.
-$m = new TestMessage();
-
-$m->setOneofInt32(1);
-assert(1 === $m->getOneofInt32());
-assert(0.0 === $m->getOneofFloat());
-assert('' === $m->getOneofString());
-assert(NULL === $m->getOneofMessage());
-$data = $m->serializeToString();
-$n = new TestMessage();
-$n->mergeFromString($data);
-assert(1 === $n->getOneofInt32());
-
-$m->setOneofFloat(2.0);
-assert(0 === $m->getOneofInt32());
-assert(2.0 === $m->getOneofFloat());
-assert('' === $m->getOneofString());
-assert(NULL === $m->getOneofMessage());
-$data = $m->serializeToString();
-$n = new TestMessage();
-$n->mergeFromString($data);
-assert(2.0 === $n->getOneofFloat());
-
-$m->setOneofString('abc');
-assert(0 === $m->getOneofInt32());
-assert(0.0 === $m->getOneofFloat());
-assert('abc' === $m->getOneofString());
-assert(NULL === $m->getOneofMessage());
-$data = $m->serializeToString();
-$n = new TestMessage();
-$n->mergeFromString($data);
-assert('abc' === $n->getOneofString());
-
-$sub_m = new TestMessage_Sub();
-$sub_m->setA(1);
-$m->setOneofMessage($sub_m);
-assert(0 === $m->getOneofInt32());
-assert(0.0 === $m->getOneofFloat());
-assert('' === $m->getOneofString());
-assert(1 === $m->getOneofMessage()->getA());
-$data = $m->serializeToString();
-$n = new TestMessage();
-$n->mergeFromString($data);
-assert(1 === $n->getOneofMessage()->getA());
-
-$m = new TestMessage();
-$m->mergeFromString(hex2bin('F80601'));
-assert('f80601' === bin2hex($m->serializeToString()));
-
-// Test create repeated field via array.
-$str_arr = array("abc");
-$m = new TestMessage();
-$m->setRepeatedString($str_arr);
-
-// Test create map field via array.
-$str_arr = array("abc"=>"abc");
-$m = new TestMessage();
-$m->setMapStringString($str_arr);
-
-// Test unset
-$from = new TestMessage();
-TestUtil::setTestMessage($from);
-unset($from);
-
-// Test wellknown
-$from = new \Google\Protobuf\Timestamp();
-$from->setSeconds(1);
-assert(1, $from->getSeconds());
-
-$timestamp = new \Google\Protobuf\Timestamp();
-
-date_default_timezone_set('UTC');
-$from = new DateTime('2011-01-01T15:03:01.012345UTC');
-$timestamp->fromDateTime($from);
-assert($from->format('U') == $timestamp->getSeconds());
-assert(0 == $timestamp->getNanos());
-
-$to = $timestamp->toDateTime();
-assert(\DateTime::class == get_class($to));
-assert($from->format('U') == $to->format('U'));
-
-$from = new \Google\Protobuf\Value();
-$from->setNumberValue(1);
-assert(1, $from->getNumberValue());
-
-// Test discard unknown in message.
-$m = new TestMessage();
-$from = hex2bin('F80601');
-$m->mergeFromString($from);
-$m->discardUnknownFields();
-$to = $m->serializeToString();
-assert("" === bin2hex($to));
-
-// Test clear
-$m = new TestMessage();
-TestUtil::setTestMessage($m);
-$m->clear();
-
-// Test unset map element
-$m = new TestMessage();
-$map = $m->getMapStringString();
-$map[1] = 1;
-unset($map[1]);
-
-// Test descriptor
-$pool = \Google\Protobuf\DescriptorPool::getGeneratedPool();
-$desc = $pool->getDescriptorByClassName("\Foo\TestMessage");
-$field = $desc->getField(1);
-
-$from = new TestMessage();
-$to = new TestMessage();
-TestUtil::setTestMessage($from);
-$to->mergeFrom($from);
-TestUtil::assertTestMessage($to);
diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php
deleted file mode 100644
index 5dbc923..0000000
--- a/php/tests/php_implementation_test.php
+++ /dev/null
@@ -1,516 +0,0 @@
-<?php
-
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-use Foo\TestPackedMessage;
-use Google\Protobuf\Internal\CodedInputStream;
-use Google\Protobuf\Internal\FileDescriptorSet;
-use Google\Protobuf\Internal\GPBLabel;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\CodedOutputStream;
-
-class ImplementationTest extends TestBase
-{
-
-    public function testReadInt32()
-    {
-        $value = null;
-
-        // Positive number.
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readInt32($input, $value);
-        $this->assertSame(1, $value);
-
-        // Negative number.
-        $input = new CodedInputStream(hex2bin("ffffffff0f"));
-        GPBWire::readInt32($input, $value);
-        $this->assertSame(-1, $value);
-
-        // Discard overflow bits.
-        $input = new CodedInputStream(hex2bin("ffffffff7f"));
-        GPBWire::readInt32($input, $value);
-        $this->assertSame(-1, $value);
-    }
-
-    public function testReadUint32()
-    {
-        $value = null;
-
-        // Positive number.
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readUint32($input, $value);
-        $this->assertSame(1, $value);
-
-        // Max uint32.
-        $input = new CodedInputStream(hex2bin("ffffffff0f"));
-        GPBWire::readUint32($input, $value);
-        $this->assertSame(-1, $value);
-
-        // Discard overflow bits.
-        $input = new CodedInputStream(hex2bin("ffffffff7f"));
-        GPBWire::readUint32($input, $value);
-        $this->assertSame(-1, $value);
-    }
-
-    public function testReadInt64()
-    {
-        $value = null;
-
-        // Positive number.
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readInt64($input, $value);
-        $this->assertEquals(1, $value);
-
-        // Negative number.
-        $input = new CodedInputStream(hex2bin("ffffffffffffffffff01"));
-        GPBWire::readInt64($input, $value);
-        $this->assertEquals(-1, $value);
-
-        // Discard overflow bits.
-        $input = new CodedInputStream(hex2bin("ffffffffffffffffff0f"));
-        GPBWire::readInt64($input, $value);
-        $this->assertEquals(-1, $value);
-    }
-
-    public function testReadUint64()
-    {
-        $value = null;
-
-        // Positive number.
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readUint64($input, $value);
-        $this->assertEquals(1, $value);
-
-        // Negative number.
-        $input = new CodedInputStream(hex2bin("FFFFFFFFFFFFFFFFFF01"));
-        GPBWire::readUint64($input, $value);
-        $this->assertEquals(-1, $value);
-
-        // Discard overflow bits.
-        $input = new CodedInputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F"));
-        GPBWire::readUint64($input, $value);
-        $this->assertEquals(-1, $value);
-    }
-
-    public function testReadSint32()
-    {
-        $value = null;
-
-        $input = new CodedInputStream(hex2bin("00"));
-        GPBWire::readSint32($input, $value);
-        $this->assertSame(0, $value);
-
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readSint32($input, $value);
-        $this->assertSame(-1, $value);
-
-        $input = new CodedInputStream(hex2bin("02"));
-        GPBWire::readSint32($input, $value);
-        $this->assertSame(1, $value);
-    }
-
-    public function testReadSint64()
-    {
-        $value = null;
-
-        $input = new CodedInputStream(hex2bin("00"));
-        GPBWire::readSint64($input, $value);
-        $this->assertEquals(0, $value);
-
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readSint64($input, $value);
-        $this->assertEquals(-1, $value);
-
-        $input = new CodedInputStream(hex2bin("02"));
-        GPBWire::readSint64($input, $value);
-        $this->assertEquals(1, $value);
-    }
-
-    public function testReadFixed32()
-    {
-        $value = null;
-        $input = new CodedInputStream(hex2bin("12345678"));
-        GPBWire::readFixed32($input, $value);
-        $this->assertSame(0x78563412, $value);
-    }
-
-    public function testReadFixed64()
-    {
-        $value = null;
-        $input = new CodedInputStream(hex2bin("1234567812345678"));
-        GPBWire::readFixed64($input, $value);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame("8671175386481439762", $value);
-        } else {
-            $this->assertSame(0x7856341278563412, $value);
-        }
-    }
-
-    public function testReadSfixed32()
-    {
-        $value = null;
-        $input = new CodedInputStream(hex2bin("12345678"));
-        GPBWire::readSfixed32($input, $value);
-        $this->assertSame(0x78563412, $value);
-    }
-
-    public function testReadFloat()
-    {
-        $value = null;
-        $input = new CodedInputStream(hex2bin("0000803F"));
-        GPBWire::readFloat($input, $value);
-        $this->assertSame(1.0, $value);
-    }
-
-    public function testReadBool()
-    {
-        $value = null;
-
-        $input = new CodedInputStream(hex2bin("00"));
-        GPBWire::readBool($input, $value);
-        $this->assertSame(false, $value);
-
-        $input = new CodedInputStream(hex2bin("01"));
-        GPBWire::readBool($input, $value);
-        $this->assertSame(true, $value);
-    }
-
-    public function testReadDouble()
-    {
-        $value = null;
-        $input = new CodedInputStream(hex2bin("000000000000F03F"));
-        GPBWire::readDouble($input, $value);
-        $this->assertSame(1.0, $value);
-    }
-
-    public function testReadSfixed64()
-    {
-        $value = null;
-        $input = new CodedInputStream(hex2bin("1234567812345678"));
-        GPBWire::readSfixed64($input, $value);
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame("8671175386481439762", $value);
-        } else {
-            $this->assertSame(0x7856341278563412, $value);
-        }
-    }
-
-    public function testZigZagEncodeDecode()
-    {
-        $this->assertSame(0, GPBWire::zigZagEncode32(0));
-        $this->assertSame(1, GPBWire::zigZagEncode32(-1));
-        $this->assertSame(2, GPBWire::zigZagEncode32(1));
-        $this->assertSame(3, GPBWire::zigZagEncode32(-2));
-        $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode32(0x3FFFFFFF));
-        $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(0xC0000000));
-        $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(-1073741824));
-
-        $this->assertSame(0,  GPBWire::zigZagDecode32(0));
-        $this->assertSame(-1, GPBWire::zigZagDecode32(1));
-        $this->assertSame(1,  GPBWire::zigZagDecode32(2));
-        $this->assertSame(-2, GPBWire::zigZagDecode32(3));
-        $this->assertSame(0x3FFFFFFF,  GPBWire::zigZagDecode32(0x7FFFFFFE));
-        $this->assertSame(-1073741824, GPBWire::zigZagDecode32(0x7FFFFFFF));
-        $this->assertSame(0x7FFFFFFF,  GPBWire::zigZagDecode32(0xFFFFFFFE));
-        $this->assertSame((int)-2147483648,GPBWire::zigZagDecode32(0xFFFFFFFF));
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame(-2, GPBWire::zigZagEncode32(0x7FFFFFFF));
-            $this->assertSame(-1, GPBWire::zigZagEncode32(0x80000000));
-            $this->assertSame('0', GPBWire::zigZagEncode64(0));
-            $this->assertSame('1', GPBWire::zigZagEncode64(-1));
-            $this->assertSame('2', GPBWire::zigZagEncode64(1));
-            $this->assertSame('3', GPBWire::zigZagEncode64(-2));
-            $this->assertSame(
-                '2147483646',  // 0x7FFFFFE
-                GPBWire::zigZagEncode64(0x3FFFFFFF));
-            $this->assertSame(
-                '2147483647',  // 0x7FFFFFF
-                GPBWire::zigZagEncode64(-1073741824));  // 0xFFFFFFFFC0000000
-            $this->assertSame(
-                '4294967294',                           // 0xFFFFFFFE
-                GPBWire::zigZagEncode64(2147483647));   // 0x7FFFFFFF
-            $this->assertSame(
-                '4294967295',                           // 0xFFFFFFFF
-                GPBWire::zigZagEncode64(-2147483648));  // 0xFFFFFFFF80000000
-            $this->assertSame(
-                '18446744073709551614',  // 0xFFFFFFFFFFFFFFFE
-                                         // 0x7FFFFFFFFFFFFFFF
-                GPBWire::zigZagEncode64("9223372036854775807"));
-            $this->assertSame(
-                '18446744073709551615',  // 0xFFFFFFFFFFFFFFFF
-                                         // 0x8000000000000000
-                GPBWire::zigZagEncode64("-9223372036854775808"));
-
-            $this->assertSame('0', GPBWire::zigZagDecode64(0));
-            $this->assertSame('-1', GPBWire::zigZagDecode64(1));
-            $this->assertSame('1', GPBWire::zigZagDecode64(2));
-            $this->assertSame('-2', GPBWire::zigZagDecode64(3));
-        } else {
-            $this->assertSame(4294967294, GPBWire::zigZagEncode32(0x7FFFFFFF));
-            $this->assertSame(4294967295, GPBWire::zigZagEncode32(0x80000000));
-            $this->assertSame(0, GPBWire::zigZagEncode64(0));
-            $this->assertSame(1, GPBWire::zigZagEncode64(-1));
-            $this->assertSame(2, GPBWire::zigZagEncode64(1));
-            $this->assertSame(3, GPBWire::zigZagEncode64(-2));
-            $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode64(0x3FFFFFFF));
-            $this->assertSame(
-                0x7FFFFFFF,
-                GPBWire::zigZagEncode64(0xFFFFFFFFC0000000));
-            $this->assertSame(
-                0xFFFFFFFE,
-                GPBWire::zigZagEncode64(0x7FFFFFFF));
-            $this->assertSame(
-                0xFFFFFFFF,
-                GPBWire::zigZagEncode64(0xFFFFFFFF80000000));
-            $this->assertSame(
-                -2,  // 0xFFFFFFFFFFFFFFFE
-                GPBWire::zigZagEncode64(0x7FFFFFFFFFFFFFFF));
-            $this->assertSame(
-                -1,  // 0xFFFFFFFFFFFFFFFF
-                GPBWire::zigZagEncode64(0x8000000000000000));
-
-            $this->assertSame(0, GPBWire::zigZagDecode64(0));
-            $this->assertSame(-1, GPBWire::zigZagDecode64(1));
-            $this->assertSame(1, GPBWire::zigZagDecode64(2));
-            $this->assertSame(-2, GPBWire::zigZagDecode64(3));
-        }
-
-        // Round trip
-        $this->assertSame(0, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(0)));
-        $this->assertSame(1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(1)));
-        $this->assertSame(-1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-1)));
-        $this->assertSame(14927,
-                      GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(14927)));
-        $this->assertSame(-3612,
-                      GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-3612)));
-    }
-
-    public function testDecode()
-    {
-        $m = new TestMessage();
-        $m->mergeFromString(TestUtil::getGoldenTestMessage());
-        TestUtil::assertTestMessage($m);
-    }
-
-    public function testDescriptorDecode()
-    {
-        $file_desc_set = new FileDescriptorSet();
-        $file_desc_set->mergeFromString(hex2bin(
-            "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" .
-            "0b54657374496e636c75646512090a0161180120012805620670726f746f33"));
-
-        $this->assertSame(1, sizeof($file_desc_set->getFile()));
-
-        $file_desc = $file_desc_set->getFile()[0];
-        $this->assertSame("test_include.proto", $file_desc->getName());
-        $this->assertSame("bar", $file_desc->getPackage());
-        $this->assertSame(0, sizeof($file_desc->getDependency()));
-        $this->assertSame(1, sizeof($file_desc->getMessageType()));
-        $this->assertSame(0, sizeof($file_desc->getEnumType()));
-        $this->assertSame("proto3", $file_desc->getSyntax());
-
-        $desc = $file_desc->getMessageType()[0];
-        $this->assertSame("TestInclude", $desc->getName());
-        $this->assertSame(1, sizeof($desc->getField()));
-        $this->assertSame(0, sizeof($desc->getNestedType()));
-        $this->assertSame(0, sizeof($desc->getEnumType()));
-        $this->assertSame(0, sizeof($desc->getOneofDecl()));
-
-        $field = $desc->getField()[0];
-        $this->assertSame("a", $field->getName());
-        $this->assertSame(1, $field->getNumber());
-        $this->assertSame(GPBLabel::OPTIONAL, $field->getLabel());
-        $this->assertSame(GPBType::INT32, $field->getType());
-    }
-
-    public function testReadVarint64()
-    {
-        $var = 0;
-
-        // Empty buffer.
-        $input = new CodedInputStream(hex2bin(''));
-        $this->assertFalse($input->readVarint64($var));
-
-        // The largest varint is 10 bytes long.
-        $input = new CodedInputStream(hex2bin('8080808080808080808001'));
-        $this->assertFalse($input->readVarint64($var));
-
-        // Corrupted varint.
-        $input = new CodedInputStream(hex2bin('808080'));
-        $this->assertFalse($input->readVarint64($var));
-
-        // Normal case.
-        $input = new CodedInputStream(hex2bin('808001'));
-        $this->assertTrue($input->readVarint64($var));
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('16384', $var);
-        } else {
-            $this->assertSame(16384, $var);
-        }
-        $this->assertFalse($input->readVarint64($var));
-
-        // Read two varint.
-        $input = new CodedInputStream(hex2bin('808001808002'));
-        $this->assertTrue($input->readVarint64($var));
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('16384', $var);
-        } else {
-            $this->assertSame(16384, $var);
-        }
-        $this->assertTrue($input->readVarint64($var));
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('32768', $var);
-        } else {
-            $this->assertSame(32768, $var);
-        }
-        $this->assertFalse($input->readVarint64($var));
-
-        // Read 64 testing
-        $testVals = array(
-            '10'                 => '0a000000000000000000',
-            '100'                => '64000000000000000000',
-            '800'                => 'a0060000000000000000',
-            '6400'               => '80320000000000000000',
-            '70400'              => '80a60400000000000000',
-            '774400'             => '80a22f00000000000000',
-            '9292800'            => '8098b704000000000000',
-            '74342400'           => '80c0b923000000000000',
-            '743424000'          => '8080bfe2020000000000',
-            '8177664000'         => '8080b5bb1e0000000000',
-            '65421312000'        => '8080a8dbf30100000000',
-            '785055744000'       => '8080e0c7ec1600000000',
-            '9420668928000'      => '808080dd969202000000',
-            '103627358208000'    => '808080fff9c717000000',
-            '1139900940288000'   => '808080f5bd9783020000',
-            '13678811283456000'  => '808080fce699a6180000',
-            '109430490267648000' => '808080e0b7ceb1c20100',
-            '984874412408832000' => '808080e0f5c1bed50d00',
-        );
-
-        foreach ($testVals as $original => $encoded) {
-            $input = new CodedInputStream(hex2bin($encoded));
-            $this->assertTrue($input->readVarint64($var));
-            $this->assertEquals($original, $var);
-        }
-    }
-
-    public function testReadVarint32()
-    {
-        $var = 0;
-
-        // Empty buffer.
-        $input = new CodedInputStream(hex2bin(''));
-        $this->assertFalse($input->readVarint32($var));
-
-        // The largest varint is 10 bytes long.
-        $input = new CodedInputStream(hex2bin('8080808080808080808001'));
-        $this->assertFalse($input->readVarint32($var));
-
-        // Corrupted varint.
-        $input = new CodedInputStream(hex2bin('808080'));
-        $this->assertFalse($input->readVarint32($var));
-
-        // Normal case.
-        $input = new CodedInputStream(hex2bin('808001'));
-        $this->assertTrue($input->readVarint32($var));
-        $this->assertSame(16384, $var);
-        $this->assertFalse($input->readVarint32($var));
-
-        // Read two varint.
-        $input = new CodedInputStream(hex2bin('808001808002'));
-        $this->assertTrue($input->readVarint32($var));
-        $this->assertSame(16384, $var);
-        $this->assertTrue($input->readVarint32($var));
-        $this->assertSame(32768, $var);
-        $this->assertFalse($input->readVarint32($var));
-
-        // Read a 64-bit integer. High-order bits should be discarded.
-        $input = new CodedInputStream(hex2bin('808081808001'));
-        $this->assertTrue($input->readVarint32($var));
-        $this->assertSame(16384, $var);
-        $this->assertFalse($input->readVarint32($var));
-    }
-
-    public function testReadTag()
-    {
-        $input = new CodedInputStream(hex2bin('808001'));
-        $tag = $input->readTag();
-        $this->assertSame(16384, $tag);
-        $tag = $input->readTag();
-        $this->assertSame(0, $tag);
-    }
-
-    public function testPushPopLimit()
-    {
-        $input = new CodedInputStream(hex2bin('808001'));
-        $old_limit = $input->pushLimit(0);
-        $tag = $input->readTag();
-        $this->assertSame(0, $tag);
-        $input->popLimit($old_limit);
-        $tag = $input->readTag();
-        $this->assertSame(16384, $tag);
-    }
-
-    public function testReadRaw()
-    {
-        $input = new CodedInputStream(hex2bin('808001'));
-        $buffer = null;
-
-        $this->assertTrue($input->readRaw(3, $buffer));
-        $this->assertSame(hex2bin('808001'), $buffer);
-
-        $this->assertFalse($input->readRaw(1, $buffer));
-    }
-
-    public function testWriteVarint32()
-    {
-        $output = new CodedOutputStream(3);
-        $output->writeVarint32(16384, true);
-        $this->assertSame(hex2bin('808001'), $output->getData());
-
-        // Negative numbers are padded to be compatible with int64.
-        $output = new CodedOutputStream(10);
-        $output->writeVarint32(-43, false);
-        $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData());
-    }
-
-    public function testWriteVarint64()
-    {
-        $output = new CodedOutputStream(10);
-        $output->writeVarint64(-43);
-        $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData());
-    }
-
-    public function testWriteLittleEndian32()
-    {
-        $output = new CodedOutputStream(4);
-        $output->writeLittleEndian32(46);
-        $this->assertSame(hex2bin('2E000000'), $output->getData());
-    }
-
-    public function testWriteLittleEndian64()
-    {
-        $output = new CodedOutputStream(8);
-        $output->writeLittleEndian64(47);
-        $this->assertSame(hex2bin('2F00000000000000'), $output->getData());
-    }
-
-    public function testByteSize()
-    {
-        $m = new TestMessage();
-        TestUtil::setTestMessage($m);
-        $this->assertSame(506, $m->byteSize());
-    }
-
-    public function testPackedByteSize()
-    {
-        $m = new TestPackedMessage();
-        TestUtil::setTestPackedMessage($m);
-        $this->assertSame(166, $m->byteSize());
-    }
-}
diff --git a/php/tests/proto/test.proto b/php/tests/proto/test.proto
deleted file mode 100644
index d0109d8..0000000
--- a/php/tests/proto/test.proto
+++ /dev/null
@@ -1,203 +0,0 @@
-syntax = "proto3";
-
-import 'proto/test_include.proto';
-import 'proto/test_no_namespace.proto';
-import 'proto/test_php_namespace.proto';
-import 'proto/test_empty_php_namespace.proto';
-import 'proto/test_prefix.proto';
-
-package foo;
-
-message TestMessage {
-  // Singular
-  int32 optional_int32 = 1;
-  int64 optional_int64 = 2;
-  uint32 optional_uint32 = 3;
-  uint64 optional_uint64 = 4;
-  sint32 optional_sint32 = 5;
-  sint64 optional_sint64 = 6;
-  fixed32 optional_fixed32 = 7;
-  fixed64 optional_fixed64 = 8;
-  sfixed32 optional_sfixed32 = 9;
-  sfixed64 optional_sfixed64 = 10;
-  float optional_float = 11;
-  double optional_double = 12;
-  bool optional_bool = 13;
-  string optional_string = 14;
-  bytes optional_bytes = 15;
-
-  TestEnum optional_enum = 16;
-  Sub optional_message = 17;
-  bar.TestInclude optional_included_message = 18;
-  TestMessage recursive = 19;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated TestEnum repeated_enum = 46;
-  repeated Sub repeated_message = 47;
-  repeated TestMessage repeated_recursive = 48;
-
-  oneof my_oneof {
-    int32  oneof_int32    = 51;
-    int64  oneof_int64    = 52;
-    uint32 oneof_uint32   = 53;
-    uint64 oneof_uint64   = 54;
-    uint32 oneof_sint32   = 55;
-    uint64 oneof_sint64   = 56;
-    uint32 oneof_fixed32  = 57;
-    uint64 oneof_fixed64  = 58;
-    uint32 oneof_sfixed32 = 59;
-    uint64 oneof_sfixed64 = 60;
-    double oneof_double   = 61;
-    float  oneof_float    = 62;
-    bool   oneof_bool     = 63;
-    string oneof_string   = 64;
-    bytes  oneof_bytes    = 65;
-    TestEnum oneof_enum   = 66;
-    Sub    oneof_message  = 67;
-  }
-
-  map<int32,       int32> map_int32_int32       = 71;
-  map<int64,       int64> map_int64_int64       = 72;
-  map<uint32,     uint32> map_uint32_uint32     = 73;
-  map<uint64,     uint64> map_uint64_uint64     = 74;
-  map<sint32,     sint32> map_sint32_sint32     = 75;
-  map<sint64,     sint64> map_sint64_sint64     = 76;
-  map<fixed32,   fixed32> map_fixed32_fixed32   = 77;
-  map<fixed64,   fixed64> map_fixed64_fixed64   = 78;
-  map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79;
-  map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80;
-  map<int32,       float> map_int32_float       = 81;
-  map<int32,      double> map_int32_double      = 82;
-  map<bool,         bool> map_bool_bool         = 83;
-  map<string,     string> map_string_string     = 84;
-  map<int32,       bytes> map_int32_bytes       = 85;
-  map<int32,    TestEnum> map_int32_enum        = 86;
-  map<int32,         Sub> map_int32_message     = 87;
-
-  map<int32, TestMessage> map_recursive = 88;
-
-  message Sub {
-    int32 a = 1;
-    repeated int32 b = 2;
-  }
-
-  // Reserved for non-existing field test.
-  // int32 non_exist = 89;
-
-  NoNamespaceMessage optional_no_namespace_message = 91;
-  NoNamespaceEnum optional_no_namespace_enum = 92;
-  repeated NoNamespaceMessage repeated_no_namespace_message = 93;
-  repeated NoNamespaceEnum repeated_no_namespace_enum = 94;
-
-  enum NestedEnum {
-    ZERO = 0;
-  }
-
-  NestedEnum optional_nested_enum = 101;
-
-  // Test prefix for reserved words.
-  message Empty {
-    int32 a = 1;
-  }
-
-  reserved 111;
-}
-
-enum TestEnum {
-  ZERO = 0;
-  ONE  = 1;
-  TWO  = 2;
-  ECHO = 3;  // Test reserved name.
-}
-
-// Test prefix for reserved words.
-message Empty {
-  int32 a = 1;
-}
-
-message ARRAY {
-  int32 a = 1;
-}
-
-message TestPackedMessage {
-  repeated int32    repeated_int32    = 90  [packed = true];
-  repeated int64    repeated_int64    = 91  [packed = true];
-  repeated uint32   repeated_uint32   = 92  [packed = true];
-  repeated uint64   repeated_uint64   = 93  [packed = true];
-  repeated sint32   repeated_sint32   = 94  [packed = true];
-  repeated sint64   repeated_sint64   = 95  [packed = true];
-  repeated fixed32  repeated_fixed32  = 96  [packed = true];
-  repeated fixed64  repeated_fixed64  = 97  [packed = true];
-  repeated sfixed32 repeated_sfixed32 = 98  [packed = true];
-  repeated sfixed64 repeated_sfixed64 = 99  [packed = true];
-  repeated float    repeated_float    = 100 [packed = true];
-  repeated double   repeated_double   = 101 [packed = true];
-  repeated bool     repeated_bool     = 102 [packed = true];
-  repeated TestEnum repeated_enum     = 103 [packed = true];
-}
-
-// Need to be in sync with TestPackedMessage.
-message TestUnpackedMessage {
-  repeated int32    repeated_int32    = 90  [packed = false];
-  repeated int64    repeated_int64    = 91  [packed = false];
-  repeated uint32   repeated_uint32   = 92  [packed = false];
-  repeated uint64   repeated_uint64   = 93  [packed = false];
-  repeated sint32   repeated_sint32   = 94  [packed = false];
-  repeated sint64   repeated_sint64   = 95  [packed = false];
-  repeated fixed32  repeated_fixed32  = 96  [packed = false];
-  repeated fixed64  repeated_fixed64  = 97  [packed = false];
-  repeated sfixed32 repeated_sfixed32 = 98  [packed = false];
-  repeated sfixed64 repeated_sfixed64 = 99  [packed = false];
-  repeated float    repeated_float    = 100 [packed = false];
-  repeated double   repeated_double   = 101 [packed = false];
-  repeated bool     repeated_bool     = 102 [packed = false];
-  repeated TestEnum repeated_enum     = 103 [packed = false];
-}
-
-// /**/@<>&\{
-message TestPhpDoc {
-  int32 a = 1;
-}
-
-message TestIncludePrefixMessage {
-  TestPrefix prefix_message = 1;
-}
-
-message TestIncludeNamespaceMessage {
-  TestNamespace namespace_message = 1;
-  TestEmptyNamespace empty_namespace_message = 2;
-}
-
-// This will cause upb fields not ordered by the order in the generated code.
-message TestRandomFieldOrder {
-  int64 tag13 = 150;
-  string tag14 = 160;
-}
-
-message TestReverseFieldOrder {
-  repeated int32 a = 2;
-  string b = 1;
-}
-
-message testLowerCaseMessage {
-}
-
-enum testLowerCaseEnum {
-  VALUE = 0;
-}
diff --git a/php/tests/proto/test_descriptors.proto b/php/tests/proto/test_descriptors.proto
deleted file mode 100644
index d42aec7..0000000
--- a/php/tests/proto/test_descriptors.proto
+++ /dev/null
@@ -1,35 +0,0 @@
-syntax = "proto3";
-
-package descriptors;
-
-message TestDescriptorsMessage {
-  int32 optional_int32 = 1;
-  TestDescriptorsEnum optional_enum = 16;
-  Sub optional_message = 17;
-
-  // Repeated
-  repeated int32 repeated_int32 = 31;
-  repeated Sub repeated_message = 47;
-
-  oneof my_oneof {
-    int32 oneof_int32    = 51;
-  }
-
-  map<int32, EnumSub> map_int32_enum = 71;
-
-  message Sub {
-    int32 a = 1;
-    repeated int32 b = 2;
-  }
-
-  enum EnumSub {
-    ZERO = 0;
-    ONE = 1;
-  }
-}
-
-enum TestDescriptorsEnum {
-  ZERO = 0;
-  ONE  = 1;
-}
-
diff --git a/php/tests/proto/test_empty_php_namespace.proto b/php/tests/proto/test_empty_php_namespace.proto
deleted file mode 100644
index 7b4bc74..0000000
--- a/php/tests/proto/test_empty_php_namespace.proto
+++ /dev/null
@@ -1,8 +0,0 @@
-syntax = "proto3";
-
-package foo;
-option php_namespace = "";
-
-message TestEmptyNamespace {
-  int32 a = 1;
-}
diff --git a/php/tests/proto/test_import_descriptor_proto.proto b/php/tests/proto/test_import_descriptor_proto.proto
deleted file mode 100644
index 2a19940..0000000
--- a/php/tests/proto/test_import_descriptor_proto.proto
+++ /dev/null
@@ -1,14 +0,0 @@
-syntax = "proto3";
-
-import "google/protobuf/descriptor.proto";
-
-message TestImportDescriptorProto {
-  extend google.protobuf.MethodOptions {
-    int32 a = 72295727;
-  }
-}
-
-extend google.protobuf.MethodOptions {
-  int32 a = 72295728;
-}
-
diff --git a/php/tests/proto/test_include.proto b/php/tests/proto/test_include.proto
deleted file mode 100644
index 9844617..0000000
--- a/php/tests/proto/test_include.proto
+++ /dev/null
@@ -1,7 +0,0 @@
-syntax = "proto3";
-
-package bar;
-
-message TestInclude {
-  int32 a = 1;
-}
diff --git a/php/tests/proto/test_no_namespace.proto b/php/tests/proto/test_no_namespace.proto
deleted file mode 100644
index 58f13d4..0000000
--- a/php/tests/proto/test_no_namespace.proto
+++ /dev/null
@@ -1,16 +0,0 @@
-syntax = "proto3";
-
-message NoNamespaceMessage {
-  int32 a = 1;
-
-  enum NestedEnum {
-    ZERO = 0;
-  }
-  NestedEnum b = 2;
-  repeated NestedEnum c = 3;
-}
-
-enum NoNamespaceEnum {
-  VALUE_A = 0;
-  VALUE_B = 1;
-}
diff --git a/php/tests/proto/test_php_namespace.proto b/php/tests/proto/test_php_namespace.proto
deleted file mode 100644
index 713187b..0000000
--- a/php/tests/proto/test_php_namespace.proto
+++ /dev/null
@@ -1,8 +0,0 @@
-syntax = "proto3";
-
-package foo;
-option php_namespace = "Php\\Test";
-
-message TestNamespace {
-  int32 a = 1;
-}
diff --git a/php/tests/proto/test_prefix.proto b/php/tests/proto/test_prefix.proto
deleted file mode 100644
index 9bfbad7..0000000
--- a/php/tests/proto/test_prefix.proto
+++ /dev/null
@@ -1,12 +0,0 @@
-syntax = "proto3";
-
-option php_class_prefix = "Prefix";
-
-message TestPrefix {
-  int32 a = 1;
-}
-
-// Test prefix for reserved words.
-message Empty {
-  int32 a = 1;
-}
diff --git a/php/tests/proto/test_reserved_enum_lower.proto b/php/tests/proto/test_reserved_enum_lower.proto
deleted file mode 100644
index d2daeaf..0000000
--- a/php/tests/proto/test_reserved_enum_lower.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-syntax = "proto3";
-
-package lower_enum;
-
-enum abstract { ZERO1 = 0; }
-enum and { ZERO2 = 0; }
-enum array { ZERO3 = 0; }
-enum as { ZERO4 = 0; }
-enum break { ZERO5 = 0; }
-enum callable { ZERO6 = 0; }
-enum case { ZERO7 = 0; }
-enum catch { ZERO8 = 0; }
-enum class { ZERO9 = 0; }
-enum clone { ZERO10 = 0; }
-enum const { ZERO11 = 0; }
-enum continue { ZERO12 = 0; }
-enum declare { ZERO13 = 0; }
-enum default { ZERO14 = 0; }
-enum die { ZERO15 = 0; }
-enum do { ZERO16 = 0; }
-enum echo { ZERO17 = 0; }
-enum else { ZERO18 = 0; }
-enum elseif { ZERO19 = 0; }
-enum empty { ZERO20 = 0; }
-enum enddeclare { ZERO21 = 0; }
-enum endfor { ZERO22 = 0; }
-enum endforeach { ZERO23 = 0; }
-enum endif { ZERO24 = 0; }
-enum endswitch { ZERO25 = 0; }
-enum endwhile { ZERO26 = 0; }
-enum eval { ZERO27 = 0; }
-enum exit { ZERO28 = 0; }
-enum extends { ZERO29 = 0; }
-enum final { ZERO30 = 0; }
-enum for { ZERO31 = 0; }
-enum foreach { ZERO32 = 0; }
-enum function { ZERO33 = 0; }
-enum global { ZERO34 = 0; }
-enum goto { ZERO35 = 0; }
-enum if { ZERO36 = 0; }
-enum implements { ZERO37 = 0; }
-enum include { ZERO38 = 0; }
-enum include_once { ZERO39 = 0; }
-enum instanceof { ZERO40 = 0; }
-enum insteadof { ZERO41 = 0; }
-enum interface { ZERO42 = 0; }
-enum isset { ZERO43 = 0; }
-enum list { ZERO44 = 0; }
-enum namespace { ZERO45 = 0; }
-enum new { ZERO46 = 0; }
-enum or { ZERO47 = 0; }
-enum print { ZERO48 = 0; }
-enum private { ZERO49 = 0; }
-enum protected { ZERO50 = 0; }
-enum public { ZERO51 = 0; }
-enum require { ZERO52 = 0; }
-enum require_once { ZERO53 = 0; }
-enum return { ZERO54 = 0; }
-enum static { ZERO55 = 0; }
-enum switch { ZERO56 = 0; }
-enum throw { ZERO57 = 0; }
-enum trait { ZERO58 = 0; }
-enum try { ZERO59 = 0; }
-enum unset { ZERO60 = 0; }
-enum use { ZERO61 = 0; }
-enum var { ZERO62 = 0; }
-enum while { ZERO63 = 0; }
-enum xor { ZERO64 = 0; }
-enum int { ZERO65 = 0; }
-enum float { ZERO66 = 0; }
-enum bool { ZERO67 = 0; }
-enum string { ZERO68 = 0; }
-enum true { ZERO69 = 0; }
-enum false { ZERO70 = 0; }
-enum null { ZERO71 = 0; }
-enum void { ZERO72 = 0; }
-enum iterable { ZERO73 = 0; }
diff --git a/php/tests/proto/test_reserved_enum_upper.proto b/php/tests/proto/test_reserved_enum_upper.proto
deleted file mode 100644
index a396fea..0000000
--- a/php/tests/proto/test_reserved_enum_upper.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-syntax = "proto3";
-
-package upper_enum;
-
-enum ABSTRACT { ZERO1 = 0; }
-enum AND { ZERO2 = 0; }
-enum ARRAY { ZERO3 = 0; }
-enum AS { ZERO4 = 0; }
-enum BREAK { ZERO5 = 0; }
-enum CALLABLE { ZERO6 = 0; }
-enum CASE { ZERO7 = 0; }
-enum CATCH { ZERO8 = 0; }
-enum CLASS { ZERO9 = 0; }
-enum CLONE { ZERO10 = 0; }
-enum CONST { ZERO11 = 0; }
-enum CONTINUE { ZERO12 = 0; }
-enum DECLARE { ZERO13 = 0; }
-enum DEFAULT { ZERO14 = 0; }
-enum DIE { ZERO15 = 0; }
-enum DO { ZERO16 = 0; }
-enum ECHO { ZERO17 = 0; }
-enum ELSE { ZERO18 = 0; }
-enum ELSEIF { ZERO19 = 0; }
-enum EMPTY { ZERO20 = 0; }
-enum ENDDECLARE { ZERO21 = 0; }
-enum ENDFOR { ZERO22 = 0; }
-enum ENDFOREACH { ZERO23 = 0; }
-enum ENDIF { ZERO24 = 0; }
-enum ENDSWITCH { ZERO25 = 0; }
-enum ENDWHILE { ZERO26 = 0; }
-enum EVAL { ZERO27 = 0; }
-enum EXIT { ZERO28 = 0; }
-enum EXTENDS { ZERO29 = 0; }
-enum FINAL { ZERO30 = 0; }
-enum FOR { ZERO31 = 0; }
-enum FOREACH { ZERO32 = 0; }
-enum FUNCTION { ZERO33 = 0; }
-enum GLOBAL { ZERO34 = 0; }
-enum GOTO { ZERO35 = 0; }
-enum IF { ZERO36 = 0; }
-enum IMPLEMENTS { ZERO37 = 0; }
-enum INCLUDE { ZERO38 = 0; }
-enum INCLUDE_ONCE { ZERO39 = 0; }
-enum INSTANCEOF { ZERO40 = 0; }
-enum INSTEADOF { ZERO41 = 0; }
-enum INTERFACE { ZERO42 = 0; }
-enum ISSET { ZERO43 = 0; }
-enum LIST { ZERO44 = 0; }
-enum NAMESPACE { ZERO45 = 0; }
-enum NEW { ZERO46 = 0; }
-enum OR { ZERO47 = 0; }
-enum PRINT { ZERO48 = 0; }
-enum PRIVATE { ZERO49 = 0; }
-enum PROTECTED { ZERO50 = 0; }
-enum PUBLIC { ZERO51 = 0; }
-enum REQUIRE { ZERO52 = 0; }
-enum REQUIRE_ONCE { ZERO53 = 0; }
-enum RETURN { ZERO54 = 0; }
-enum STATIC { ZERO55 = 0; }
-enum SWITCH { ZERO56 = 0; }
-enum THROW { ZERO57 = 0; }
-enum TRAIT { ZERO58 = 0; }
-enum TRY { ZERO59 = 0; }
-enum UNSET { ZERO60 = 0; }
-enum USE { ZERO61 = 0; }
-enum VAR { ZERO62 = 0; }
-enum WHILE { ZERO63 = 0; }
-enum XOR { ZERO64 = 0; }
-enum INT { ZERO65 = 0; }
-enum FLOAT { ZERO66 = 0; }
-enum BOOL { ZERO67 = 0; }
-enum STRING { ZERO68 = 0; }
-enum TRUE { ZERO69 = 0; }
-enum FALSE { ZERO70 = 0; }
-enum NULL { ZERO71 = 0; }
-enum VOID { ZERO72 = 0; }
-enum ITERABLE { ZERO73 = 0; }
diff --git a/php/tests/proto/test_reserved_enum_value_lower.proto b/php/tests/proto/test_reserved_enum_value_lower.proto
deleted file mode 100644
index 96da319..0000000
--- a/php/tests/proto/test_reserved_enum_value_lower.proto
+++ /dev/null
@@ -1,79 +0,0 @@
-syntax = "proto3";
-
-package lower_enum_value;
-
-enum NotAllowed {
-  abstract = 0;
-  and = 1;
-  array = 2;
-  as = 3;
-  break = 4;
-  callable = 5;
-  case     = 6;
-  catch    = 7;
-  class    = 8;
-  clone    = 9;
-  const    = 10;
-  continue = 11;
-  declare  = 12;
-  default  = 13;
-  die      = 14;
-  do       = 15;
-  echo     = 16;
-  else     = 17;
-  elseif   = 18;
-  empty    = 19;
-  enddeclare = 20;
-  endfor     = 21;
-  endforeach = 22;
-  endif      = 23;
-  endswitch = 24;
-  endwhile = 25;
-  eval = 26;
-  exit = 27;
-  extends = 28;
-  final = 29;
-  for = 30;
-  foreach = 31;
-  function = 32;
-  global = 33;
-  goto = 34;
-  if = 35;
-  implements = 36;
-  include = 37;
-  include_once = 38;
-  instanceof = 39;
-  insteadof = 40;
-  interface = 41;
-  isset = 42;
-  list = 43;
-  namespace = 44;
-  new = 45;
-  or = 46;
-  print = 47;
-  private = 48;
-  protected = 49;
-  public = 50;
-  require = 51;
-  require_once = 52;
-  return = 53;
-  static = 54;
-  switch = 55;
-  throw = 56;
-  trait = 57;
-  try = 58;
-  unset = 59;
-  use = 60;
-  var = 61;
-  while = 62;
-  xor = 63;
-  int = 64;
-  float = 65;
-  bool = 66;
-  string = 67;
-  true = 68;
-  false = 69;
-  null = 70;
-  void = 71;
-  iterable = 72;
-}
diff --git a/php/tests/proto/test_reserved_enum_value_upper.proto b/php/tests/proto/test_reserved_enum_value_upper.proto
deleted file mode 100644
index b026a85..0000000
--- a/php/tests/proto/test_reserved_enum_value_upper.proto
+++ /dev/null
@@ -1,79 +0,0 @@
-syntax = "proto3";
-
-package upper_enum_value;
-
-enum NotAllowed {
-  ABSTRACT = 0;
-  AND = 1;
-  ARRAY = 2;
-  AS = 3;
-  BREAK = 4;
-  CALLABLE = 5;
-  CASE     = 6;
-  CATCH    = 7;
-  CLASS    = 8;
-  CLONE    = 9;
-  CONST    = 10;
-  CONTINUE = 11;
-  DECLARE  = 12;
-  DEFAULT  = 13;
-  DIE      = 14;
-  DO       = 15;
-  ECHO     = 16;
-  ELSE     = 17;
-  ELSEIF   = 18;
-  EMPTY    = 19;
-  ENDDECLARE = 20;
-  ENDFOR     = 21;
-  ENDFOREACH = 22;
-  ENDIF      = 23;
-  ENDSWITCH = 24;
-  ENDWHILE = 25;
-  EVAL = 26;
-  EXIT = 27;
-  EXTENDS = 28;
-  FINAL = 29;
-  FOR = 30;
-  FOREACH = 31;
-  FUNCTION = 32;
-  GLOBAL = 33;
-  GOTO = 34;
-  IF = 35;
-  IMPLEMENTS = 36;
-  INCLUDE = 37;
-  INCLUDE_ONCE = 38;
-  INSTANCEOF = 39;
-  INSTEADOF = 40;
-  INTERFACE = 41;
-  ISSET = 42;
-  LIST = 43;
-  NAMESPACE = 44;
-  NEW = 45;
-  OR = 46;
-  PRINT = 47;
-  PRIVATE = 48;
-  PROTECTED = 49;
-  PUBLIC = 50;
-  REQUIRE = 51;
-  REQUIRE_ONCE = 52;
-  RETURN = 53;
-  STATIC = 54;
-  SWITCH = 55;
-  THROW = 56;
-  TRAIT = 57;
-  TRY = 58;
-  UNSET = 59;
-  USE = 60;
-  VAR = 61;
-  WHILE = 62;
-  XOR = 63;
-  INT = 64;
-  FLOAT = 65;
-  BOOL = 66;
-  STRING = 67;
-  TRUE = 68;
-  FALSE = 69;
-  NULL = 70;
-  VOID = 71;
-  ITERABLE = 72;
-}
diff --git a/php/tests/proto/test_reserved_message_lower.proto b/php/tests/proto/test_reserved_message_lower.proto
deleted file mode 100644
index ed12080..0000000
--- a/php/tests/proto/test_reserved_message_lower.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-syntax = "proto3";
-
-package lower;
-
-message abstract {}
-message and {}
-message array {}
-message as {}
-message break {}
-message callable {}
-message case {}
-message catch {}
-message class {}
-message clone {}
-message const {}
-message continue {}
-message declare {}
-message default {}
-message die {}
-message do {}
-message echo {}
-message else {}
-message elseif {}
-message empty {}
-message enddeclare {}
-message endfor {}
-message endforeach {}
-message endif {}
-message endswitch {}
-message endwhile {}
-message eval {}
-message exit {}
-message extends {}
-message final {}
-message for {}
-message foreach {}
-message function {}
-message global {}
-message goto {}
-message if {}
-message implements {}
-message include {}
-message include_once {}
-message instanceof {}
-message insteadof {}
-message interface {}
-message isset {}
-message list {}
-message namespace {}
-message new {}
-message or {}
-message print {}
-message private {}
-message protected {}
-message public {}
-message require {}
-message require_once {}
-message return {}
-message static {}
-message switch {}
-message throw {}
-message trait {}
-message try {}
-message unset {}
-message use {}
-message var {}
-message while {}
-message xor {}
-message int {}
-message float {}
-message bool {}
-message string {}
-message true {}
-message false {}
-message null {}
-message void {}
-message iterable {}
diff --git a/php/tests/proto/test_reserved_message_upper.proto b/php/tests/proto/test_reserved_message_upper.proto
deleted file mode 100644
index 2917fd1..0000000
--- a/php/tests/proto/test_reserved_message_upper.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-syntax = "proto3";
-
-package upper;
-
-message ABSTRACT {}
-message AND {}
-message ARRAY {}
-message AS {}
-message BREAK {}
-message CALLABLE {}
-message CASE {}
-message CATCH {}
-message CLASS {}
-message CLONE {}
-message CONST {}
-message CONTINUE {}
-message DECLARE {}
-message DEFAULT {}
-message DIE {}
-message DO {}
-message ECHO {}
-message ELSE {}
-message ELSEIF {}
-message EMPTY {}
-message ENDDECLARE {}
-message ENDFOR {}
-message ENDFOREACH {}
-message ENDIF {}
-message ENDSWITCH {}
-message ENDWHILE {}
-message EVAL {}
-message EXIT {}
-message EXTENDS {}
-message FINAL {}
-message FOR {}
-message FOREACH {}
-message FUNCTION {}
-message GLOBAL {}
-message GOTO {}
-message IF {}
-message IMPLEMENTS {}
-message INCLUDE {}
-message INCLUDE_ONCE {}
-message INSTANCEOF {}
-message INSTEADOF {}
-message INTERFACE {}
-message ISSET {}
-message LIST {}
-message NAMESPACE {}
-message NEW {}
-message OR {}
-message PRINT {}
-message PRIVATE {}
-message PROTECTED {}
-message PUBLIC {}
-message REQUIRE {}
-message REQUIRE_ONCE {}
-message RETURN {}
-message STATIC {}
-message SWITCH {}
-message THROW {}
-message TRAIT {}
-message TRY {}
-message UNSET {}
-message USE {}
-message VAR {}
-message WHILE {}
-message XOR {}
-message INT {}
-message FLOAT {}
-message BOOL {}
-message STRING {}
-message TRUE {}
-message FALSE {}
-message NULL {}
-message VOID {}
-message ITERABLE {}
diff --git a/php/tests/proto/test_service.proto b/php/tests/proto/test_service.proto
deleted file mode 100644
index a03dbc4..0000000
--- a/php/tests/proto/test_service.proto
+++ /dev/null
@@ -1,18 +0,0 @@
-syntax = "proto3";
-
-package foo;
-
-option php_generic_services = true;
-
-service Greeter {
-  rpc SayHello (HelloRequest) returns (HelloReply) {}
-  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
-}
-
-message HelloRequest {
-  string name = 1;
-}
-
-message HelloReply {
-  string message = 1;
-}
diff --git a/php/tests/proto/test_service_namespace.proto b/php/tests/proto/test_service_namespace.proto
deleted file mode 100644
index 719aa48..0000000
--- a/php/tests/proto/test_service_namespace.proto
+++ /dev/null
@@ -1,13 +0,0 @@
-syntax = "proto3";
-
-import "proto/test_service.proto";
-
-package foo;
-
-option php_generic_services = true;
-option php_namespace = "Bar";
-
-service OtherGreeter {
-  rpc SayHello (HelloRequest) returns (HelloReply) {}
-  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
-}
diff --git a/php/tests/test.sh b/php/tests/test.sh
deleted file mode 100755
index 2983fe9..0000000
--- a/php/tests/test.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-
-VERSION=$1
-
-export PATH=/usr/local/php-$VERSION/bin:$PATH
-export C_INCLUDE_PATH=/usr/local/php-$VERSION/include/php/main:/usr/local/php-$VERSION/include/php:$C_INCLUDE_PATH
-export CPLUS_INCLUDE_PATH=/usr/local/php-$VERSION/include/php/main:/usr/local/php-$VERSION/include/php:$CPLUS_INCLUDE_PATH
-
-# Compile c extension
-pushd ../ext/google/protobuf/
-make clean || true
-set -e
-# Add following in configure for debug: --enable-debug CFLAGS='-g -O0'
-phpize && ./configure CFLAGS='-g -O0' && make
-popd
-
-tests=( array_test.php encode_decode_test.php generated_class_test.php generated_phpdoc_test.php map_field_test.php well_known_test.php generated_service_test.php descriptors_test.php )
-
-for t in "${tests[@]}"
-do
-  echo "****************************"
-  echo "* $t"
-  echo "****************************"
-  # php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php $t
-  echo ""
-done
-
-# # Make sure to run the memory test in debug mode.
-# php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
-
-export ZEND_DONT_UNLOAD_MODULES=1
-export USE_ZEND_ALLOC=0
-valgrind --leak-check=yes php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
-
-# TODO(teboring): Only for debug (phpunit has memory leak which blocks this beging used by
-# regresssion test.)
-
-# for t in "${tests[@]}"
-# do
-#   echo "****************************"
-#   echo "* $t (memory leak)"
-#   echo "****************************"
-#   valgrind --leak-check=yes php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php $t
-#   echo ""
-# done
diff --git a/php/tests/test_base.php b/php/tests/test_base.php
deleted file mode 100644
index dc5e73f..0000000
--- a/php/tests/test_base.php
+++ /dev/null
@@ -1,342 +0,0 @@
-<?php
-
-use Foo\TestMessage;
-use Foo\TestEnum;
-use Foo\TestMessage_Sub;
-
-class TestBase extends PHPUnit_Framework_TestCase
-{
-
-    public function setFields(TestMessage $m)
-    {
-        TestUtil::setTestMessage($m);
-    }
-
-    public function setFields2(TestMessage $m)
-    {
-        TestUtil::setTestMessage2($m);
-    }
-
-    public function expectFields(TestMessage $m)
-    {
-        $this->assertSame(-42,  $m->getOptionalInt32());
-        $this->assertSame(42,  $m->getOptionalUint32());
-        $this->assertSame(-44,  $m->getOptionalSint32());
-        $this->assertSame(46,   $m->getOptionalFixed32());
-        $this->assertSame(-46,  $m->getOptionalSfixed32());
-        $this->assertSame(1.5,  $m->getOptionalFloat());
-        $this->assertSame(1.6,  $m->getOptionalDouble());
-        $this->assertSame(true, $m->getOptionalBool());
-        $this->assertSame('a',  $m->getOptionalString());
-        $this->assertSame('b',  $m->getOptionalBytes());
-        $this->assertSame(TestEnum::ONE, $m->getOptionalEnum());
-        $this->assertSame(33,   $m->getOptionalMessage()->getA());
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('-43',  $m->getOptionalInt64());
-            $this->assertSame('43',   $m->getOptionalUint64());
-            $this->assertSame('-45',  $m->getOptionalSint64());
-            $this->assertSame('47',   $m->getOptionalFixed64());
-            $this->assertSame('-47',  $m->getOptionalSfixed64());
-        } else {
-            $this->assertSame(-43,  $m->getOptionalInt64());
-            $this->assertSame(43,   $m->getOptionalUint64());
-            $this->assertSame(-45,  $m->getOptionalSint64());
-            $this->assertSame(47,   $m->getOptionalFixed64());
-            $this->assertSame(-47,  $m->getOptionalSfixed64());
-        }
-
-        $this->assertEquals(-42,  $m->getRepeatedInt32()[0]);
-        $this->assertEquals(42,   $m->getRepeatedUint32()[0]);
-        $this->assertEquals(-43,  $m->getRepeatedInt64()[0]);
-        $this->assertEquals(43,   $m->getRepeatedUint64()[0]);
-        $this->assertEquals(-44,  $m->getRepeatedSint32()[0]);
-        $this->assertEquals(-45,  $m->getRepeatedSint64()[0]);
-        $this->assertEquals(46,   $m->getRepeatedFixed32()[0]);
-        $this->assertEquals(47,   $m->getRepeatedFixed64()[0]);
-        $this->assertEquals(-46,  $m->getRepeatedSfixed32()[0]);
-        $this->assertEquals(-47,  $m->getRepeatedSfixed64()[0]);
-        $this->assertEquals(1.5,  $m->getRepeatedFloat()[0]);
-        $this->assertEquals(1.6,  $m->getRepeatedDouble()[0]);
-        $this->assertEquals(true, $m->getRepeatedBool()[0]);
-        $this->assertEquals('a',  $m->getRepeatedString()[0]);
-        $this->assertEquals('b',  $m->getRepeatedBytes()[0]);
-        $this->assertEquals(34,   $m->getRepeatedMessage()[0]->GetA());
-
-        $this->assertEquals(-52,   $m->getRepeatedInt32()[1]);
-        $this->assertEquals(52,    $m->getRepeatedUint32()[1]);
-        $this->assertEquals(-53,   $m->getRepeatedInt64()[1]);
-        $this->assertEquals(53,    $m->getRepeatedUint64()[1]);
-        $this->assertEquals(-54,   $m->getRepeatedSint32()[1]);
-        $this->assertEquals(-55,   $m->getRepeatedSint64()[1]);
-        $this->assertEquals(56,    $m->getRepeatedFixed32()[1]);
-        $this->assertEquals(57,    $m->getRepeatedFixed64()[1]);
-        $this->assertEquals(-56,   $m->getRepeatedSfixed32()[1]);
-        $this->assertEquals(-57,   $m->getRepeatedSfixed64()[1]);
-        $this->assertEquals(2.5,   $m->getRepeatedFloat()[1]);
-        $this->assertEquals(2.6,   $m->getRepeatedDouble()[1]);
-        $this->assertEquals(false, $m->getRepeatedBool()[1]);
-        $this->assertEquals('c',   $m->getRepeatedString()[1]);
-        $this->assertEquals('d',   $m->getRepeatedBytes()[1]);
-        $this->assertEquals(35,    $m->getRepeatedMessage()[1]->GetA());
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertEquals('-63', $m->getMapInt64Int64()['-63']);
-            $this->assertEquals('63',  $m->getMapUint64Uint64()['63']);
-            $this->assertEquals('-65', $m->getMapSint64Sint64()['-65']);
-            $this->assertEquals('67',  $m->getMapFixed64Fixed64()['67']);
-            $this->assertEquals('-69',  $m->getMapSfixed64Sfixed64()['-69']);
-        } else {
-            $this->assertEquals(-63, $m->getMapInt64Int64()[-63]);
-            $this->assertEquals(63,  $m->getMapUint64Uint64()[63]);
-            $this->assertEquals(-65, $m->getMapSint64Sint64()[-65]);
-            $this->assertEquals(67,  $m->getMapFixed64Fixed64()[67]);
-            $this->assertEquals(-69,  $m->getMapSfixed64Sfixed64()[-69]);
-        }
-        $this->assertEquals(-62, $m->getMapInt32Int32()[-62]);
-        $this->assertEquals(62,  $m->getMapUint32Uint32()[62]);
-        $this->assertEquals(-64, $m->getMapSint32Sint32()[-64]);
-        $this->assertEquals(66,  $m->getMapFixed32Fixed32()[66]);
-        $this->assertEquals(-68,  $m->getMapSfixed32Sfixed32()[-68]);
-        $this->assertEquals(3.5, $m->getMapInt32Float()[1]);
-        $this->assertEquals(3.6, $m->getMapInt32Double()[1]);
-        $this->assertEquals(true , $m->getMapBoolBool()[true]);
-        $this->assertEquals('e', $m->getMapStringString()['e']);
-        $this->assertEquals('f', $m->getMapInt32Bytes()[1]);
-        $this->assertEquals(TestEnum::ONE, $m->getMapInt32Enum()[1]);
-        $this->assertEquals(36, $m->getMapInt32Message()[1]->GetA());
-    }
-
-    // Test message merged from setFields and setFields2.
-    public function expectFieldsMerged(TestMessage $m)
-    {
-        $this->assertSame(-144,  $m->getOptionalSint32());
-        $this->assertSame(146,   $m->getOptionalFixed32());
-        $this->assertSame(-146,  $m->getOptionalSfixed32());
-        $this->assertSame(11.5,  $m->getOptionalFloat());
-        $this->assertSame(11.6,  $m->getOptionalDouble());
-        $this->assertSame(true, $m->getOptionalBool());
-        $this->assertSame('aa',  $m->getOptionalString());
-        $this->assertSame('bb',  $m->getOptionalBytes());
-        $this->assertSame(133,   $m->getOptionalMessage()->getA());
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame('-143',  $m->getOptionalInt64());
-            $this->assertSame('143',   $m->getOptionalUint64());
-            $this->assertSame('-145',  $m->getOptionalSint64());
-            $this->assertSame('147',   $m->getOptionalFixed64());
-            $this->assertSame('-147',  $m->getOptionalSfixed64());
-        } else {
-            $this->assertSame(-143,  $m->getOptionalInt64());
-            $this->assertSame(143,   $m->getOptionalUint64());
-            $this->assertSame(-145,  $m->getOptionalSint64());
-            $this->assertSame(147,   $m->getOptionalFixed64());
-            $this->assertSame(-147,  $m->getOptionalSfixed64());
-        }
-
-        $this->assertEquals(-42,  $m->getRepeatedInt32()[0]);
-        $this->assertEquals(42,   $m->getRepeatedUint32()[0]);
-        $this->assertEquals(-43,  $m->getRepeatedInt64()[0]);
-        $this->assertEquals(43,   $m->getRepeatedUint64()[0]);
-        $this->assertEquals(-44,  $m->getRepeatedSint32()[0]);
-        $this->assertEquals(-45,  $m->getRepeatedSint64()[0]);
-        $this->assertEquals(46,   $m->getRepeatedFixed32()[0]);
-        $this->assertEquals(47,   $m->getRepeatedFixed64()[0]);
-        $this->assertEquals(-46,  $m->getRepeatedSfixed32()[0]);
-        $this->assertEquals(-47,  $m->getRepeatedSfixed64()[0]);
-        $this->assertEquals(1.5,  $m->getRepeatedFloat()[0]);
-        $this->assertEquals(1.6,  $m->getRepeatedDouble()[0]);
-        $this->assertEquals(true, $m->getRepeatedBool()[0]);
-        $this->assertEquals('a',  $m->getRepeatedString()[0]);
-        $this->assertEquals('b',  $m->getRepeatedBytes()[0]);
-        $this->assertEquals(TestEnum::ZERO,  $m->getRepeatedEnum()[0]);
-        $this->assertEquals(34,   $m->getRepeatedMessage()[0]->GetA());
-
-        $this->assertEquals(-52,   $m->getRepeatedInt32()[1]);
-        $this->assertEquals(52,    $m->getRepeatedUint32()[1]);
-        $this->assertEquals(-53,   $m->getRepeatedInt64()[1]);
-        $this->assertEquals(53,    $m->getRepeatedUint64()[1]);
-        $this->assertEquals(-54,   $m->getRepeatedSint32()[1]);
-        $this->assertEquals(-55,   $m->getRepeatedSint64()[1]);
-        $this->assertEquals(56,    $m->getRepeatedFixed32()[1]);
-        $this->assertEquals(57,    $m->getRepeatedFixed64()[1]);
-        $this->assertEquals(-56,   $m->getRepeatedSfixed32()[1]);
-        $this->assertEquals(-57,   $m->getRepeatedSfixed64()[1]);
-        $this->assertEquals(2.5,   $m->getRepeatedFloat()[1]);
-        $this->assertEquals(2.6,   $m->getRepeatedDouble()[1]);
-        $this->assertEquals(false, $m->getRepeatedBool()[1]);
-        $this->assertEquals('c',   $m->getRepeatedString()[1]);
-        $this->assertEquals('d',   $m->getRepeatedBytes()[1]);
-        $this->assertEquals(TestEnum::ONE,  $m->getRepeatedEnum()[1]);
-        $this->assertEquals(35,    $m->getRepeatedMessage()[1]->GetA());
-
-        $this->assertEquals(-142,  $m->getRepeatedInt32()[2]);
-        $this->assertEquals(142,   $m->getRepeatedUint32()[2]);
-        $this->assertEquals(-143,  $m->getRepeatedInt64()[2]);
-        $this->assertEquals(143,   $m->getRepeatedUint64()[2]);
-        $this->assertEquals(-144,  $m->getRepeatedSint32()[2]);
-        $this->assertEquals(-145,  $m->getRepeatedSint64()[2]);
-        $this->assertEquals(146,   $m->getRepeatedFixed32()[2]);
-        $this->assertEquals(147,   $m->getRepeatedFixed64()[2]);
-        $this->assertEquals(-146,  $m->getRepeatedSfixed32()[2]);
-        $this->assertEquals(-147,  $m->getRepeatedSfixed64()[2]);
-        $this->assertEquals(11.5,  $m->getRepeatedFloat()[2]);
-        $this->assertEquals(11.6,  $m->getRepeatedDouble()[2]);
-        $this->assertEquals(false, $m->getRepeatedBool()[2]);
-        $this->assertEquals('aa',  $m->getRepeatedString()[2]);
-        $this->assertEquals('bb',  $m->getRepeatedBytes()[2]);
-        $this->assertEquals(TestEnum::TWO,  $m->getRepeatedEnum()[2]);
-        $this->assertEquals(134,   $m->getRepeatedMessage()[2]->GetA());
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertEquals('-163', $m->getMapInt64Int64()['-63']);
-            $this->assertEquals('163',  $m->getMapUint64Uint64()['63']);
-            $this->assertEquals('-165', $m->getMapSint64Sint64()['-65']);
-            $this->assertEquals('167',  $m->getMapFixed64Fixed64()['67']);
-            $this->assertEquals('-169',  $m->getMapSfixed64Sfixed64()['-69']);
-        } else {
-            $this->assertEquals(-163, $m->getMapInt64Int64()[-63]);
-            $this->assertEquals(163,  $m->getMapUint64Uint64()[63]);
-            $this->assertEquals(-165, $m->getMapSint64Sint64()[-65]);
-            $this->assertEquals(167,  $m->getMapFixed64Fixed64()[67]);
-            $this->assertEquals(-169,  $m->getMapSfixed64Sfixed64()[-69]);
-        }
-        $this->assertEquals(-162, $m->getMapInt32Int32()[-62]);
-        $this->assertEquals(162,  $m->getMapUint32Uint32()[62]);
-        $this->assertEquals(-164, $m->getMapSint32Sint32()[-64]);
-        $this->assertEquals(166,  $m->getMapFixed32Fixed32()[66]);
-        $this->assertEquals(-168,  $m->getMapSfixed32Sfixed32()[-68]);
-        $this->assertEquals(13.5, $m->getMapInt32Float()[1]);
-        $this->assertEquals(13.6, $m->getMapInt32Double()[1]);
-        $this->assertEquals(false , $m->getMapBoolBool()[true]);
-        $this->assertEquals('ee', $m->getMapStringString()['e']);
-        $this->assertEquals('ff', $m->getMapInt32Bytes()[1]);
-        $this->assertEquals(TestEnum::TWO, $m->getMapInt32Enum()[1]);
-        $this->assertEquals(136, $m->getMapInt32Message()[1]->GetA());
-
-        if (PHP_INT_SIZE == 4) {
-            $this->assertEquals('-163', $m->getMapInt64Int64()['-163']);
-            $this->assertEquals('163',  $m->getMapUint64Uint64()['163']);
-            $this->assertEquals('-165', $m->getMapSint64Sint64()['-165']);
-            $this->assertEquals('167',  $m->getMapFixed64Fixed64()['167']);
-            $this->assertEquals('-169',  $m->getMapSfixed64Sfixed64()['-169']);
-        } else {
-            $this->assertEquals(-163, $m->getMapInt64Int64()[-163]);
-            $this->assertEquals(163,  $m->getMapUint64Uint64()[163]);
-            $this->assertEquals(-165, $m->getMapSint64Sint64()[-165]);
-            $this->assertEquals(167,  $m->getMapFixed64Fixed64()[167]);
-            $this->assertEquals(-169,  $m->getMapSfixed64Sfixed64()[-169]);
-        }
-        $this->assertEquals(-162, $m->getMapInt32Int32()[-162]);
-        $this->assertEquals(162,  $m->getMapUint32Uint32()[162]);
-        $this->assertEquals(-164, $m->getMapSint32Sint32()[-164]);
-        $this->assertEquals(166,  $m->getMapFixed32Fixed32()[166]);
-        $this->assertEquals(-168,  $m->getMapSfixed32Sfixed32()[-168]);
-        $this->assertEquals(13.5, $m->getMapInt32Float()[2]);
-        $this->assertEquals(13.6, $m->getMapInt32Double()[2]);
-        $this->assertEquals(false , $m->getMapBoolBool()[false]);
-        $this->assertEquals('ee', $m->getMapStringString()['ee']);
-        $this->assertEquals('ff', $m->getMapInt32Bytes()[2]);
-        $this->assertEquals(TestEnum::TWO, $m->getMapInt32Enum()[2]);
-        $this->assertEquals(136, $m->getMapInt32Message()[2]->GetA());
-    }
-
-    public function expectEmptyFields(TestMessage $m)
-    {
-        $this->assertSame(0,   $m->getOptionalInt32());
-        $this->assertSame(0,   $m->getOptionalUint32());
-        $this->assertSame(0,   $m->getOptionalSint32());
-        $this->assertSame(0,   $m->getOptionalFixed32());
-        $this->assertSame(0,   $m->getOptionalSfixed32());
-        $this->assertSame(0.0, $m->getOptionalFloat());
-        $this->assertSame(0.0, $m->getOptionalDouble());
-        $this->assertSame(false, $m->getOptionalBool());
-        $this->assertSame('',  $m->getOptionalString());
-        $this->assertSame('',  $m->getOptionalBytes());
-        $this->assertSame(0, $m->getOptionalEnum());
-        $this->assertNull($m->getOptionalMessage());
-        $this->assertNull($m->getOptionalIncludedMessage());
-        $this->assertNull($m->getRecursive());
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame("0", $m->getOptionalInt64());
-            $this->assertSame("0", $m->getOptionalUint64());
-            $this->assertSame("0", $m->getOptionalSint64());
-            $this->assertSame("0", $m->getOptionalFixed64());
-            $this->assertSame("0", $m->getOptionalSfixed64());
-        } else {
-            $this->assertSame(0, $m->getOptionalInt64());
-            $this->assertSame(0, $m->getOptionalUint64());
-            $this->assertSame(0, $m->getOptionalSint64());
-            $this->assertSame(0, $m->getOptionalFixed64());
-            $this->assertSame(0, $m->getOptionalSfixed64());
-        }
-
-        $this->assertEquals(0, count($m->getRepeatedInt32()));
-        $this->assertEquals(0, count($m->getRepeatedUint32()));
-        $this->assertEquals(0, count($m->getRepeatedInt64()));
-        $this->assertEquals(0, count($m->getRepeatedUint64()));
-        $this->assertEquals(0, count($m->getRepeatedSint32()));
-        $this->assertEquals(0, count($m->getRepeatedSint64()));
-        $this->assertEquals(0, count($m->getRepeatedFixed32()));
-        $this->assertEquals(0, count($m->getRepeatedFixed64()));
-        $this->assertEquals(0, count($m->getRepeatedSfixed32()));
-        $this->assertEquals(0, count($m->getRepeatedSfixed64()));
-        $this->assertEquals(0, count($m->getRepeatedFloat()));
-        $this->assertEquals(0, count($m->getRepeatedDouble()));
-        $this->assertEquals(0, count($m->getRepeatedBool()));
-        $this->assertEquals(0, count($m->getRepeatedString()));
-        $this->assertEquals(0, count($m->getRepeatedBytes()));
-        $this->assertEquals(0, count($m->getRepeatedEnum()));
-        $this->assertEquals(0, count($m->getRepeatedMessage()));
-        $this->assertEquals(0, count($m->getRepeatedRecursive()));
-
-        $this->assertSame("", $m->getMyOneof());
-        $this->assertSame(0,   $m->getOneofInt32());
-        $this->assertSame(0,   $m->getOneofUint32());
-        $this->assertSame(0,   $m->getOneofSint32());
-        $this->assertSame(0,   $m->getOneofFixed32());
-        $this->assertSame(0,   $m->getOneofSfixed32());
-        $this->assertSame(0.0, $m->getOneofFloat());
-        $this->assertSame(0.0, $m->getOneofDouble());
-        $this->assertSame(false, $m->getOneofBool());
-        $this->assertSame('',  $m->getOneofString());
-        $this->assertSame('',  $m->getOneofBytes());
-        $this->assertSame(0, $m->getOneofEnum());
-        $this->assertNull($m->getOptionalMessage());
-        if (PHP_INT_SIZE == 4) {
-            $this->assertSame("0", $m->getOneofInt64());
-            $this->assertSame("0", $m->getOneofUint64());
-            $this->assertSame("0", $m->getOneofSint64());
-            $this->assertSame("0", $m->getOneofFixed64());
-            $this->assertSame("0", $m->getOneofSfixed64());
-        } else {
-            $this->assertSame(0, $m->getOneofInt64());
-            $this->assertSame(0, $m->getOneofUint64());
-            $this->assertSame(0, $m->getOneofSint64());
-            $this->assertSame(0, $m->getOneofFixed64());
-            $this->assertSame(0, $m->getOneofSfixed64());
-        }
-
-        $this->assertEquals(0, count($m->getMapInt64Int64()));
-        $this->assertEquals(0, count($m->getMapUint64Uint64()));
-        $this->assertEquals(0, count($m->getMapSint64Sint64()));
-        $this->assertEquals(0, count($m->getMapFixed64Fixed64()));
-        $this->assertEquals(0, count($m->getMapInt32Int32()));
-        $this->assertEquals(0, count($m->getMapUint32Uint32()));
-        $this->assertEquals(0, count($m->getMapSint32Sint32()));
-        $this->assertEquals(0, count($m->getMapFixed32Fixed32()));
-        $this->assertEquals(0, count($m->getMapSfixed32Sfixed32()));
-        $this->assertEquals(0, count($m->getMapSfixed64Sfixed64()));
-        $this->assertEquals(0, count($m->getMapInt32Float()));
-        $this->assertEquals(0, count($m->getMapInt32Double()));
-        $this->assertEquals(0, count($m->getMapBoolBool()));
-        $this->assertEquals(0, count($m->getMapStringString()));
-        $this->assertEquals(0, count($m->getMapInt32Bytes()));
-        $this->assertEquals(0, count($m->getMapInt32Enum()));
-        $this->assertEquals(0, count($m->getMapInt32Message()));
-        $this->assertEquals(0, count($m->getMapRecursive()));
-    }
-
-  // This test is to avoid the warning of no test by php unit.
-  public function testNone()
-  {
-  }
-}
diff --git a/php/tests/test_util.php b/php/tests/test_util.php
deleted file mode 100644
index c8afdd3..0000000
--- a/php/tests/test_util.php
+++ /dev/null
@@ -1,547 +0,0 @@
-<?php
-
-use Foo\TestEnum;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-use Foo\TestPackedMessage;
-use Foo\TestUnpackedMessage;
-
-define('MAX_FLOAT_DIFF', 0.000001);
-
-if (PHP_INT_SIZE == 8) {
-    define('MAX_INT_STRING', '9223372036854775807');
-    define('MAX_INT_UPPER_STRING', '9223372036854775808');
-} else {
-    define('MAX_INT_STRING', '2147483647');
-    define('MAX_INT_UPPER_STRING', '2147483648');
-}
-
-define('MAX_INT32', 2147483647);
-define('MAX_INT32_FLOAT', 2147483647.0);
-define('MAX_INT32_STRING', '2147483647');
-
-define('MIN_INT32', (int)-2147483648);
-define('MIN_INT32_FLOAT', -2147483648.0);
-define('MIN_INT32_STRING', '-2147483648');
-
-define('MAX_UINT32', 4294967295);
-define('MAX_UINT32_FLOAT', 4294967295.0);
-define('MAX_UINT32_STRING', '4294967295');
-
-define('MIN_UINT32', (int)-2147483648);
-define('MIN_UINT32_FLOAT', -2147483648.0);
-define('MIN_UINT32_STRING', '-2147483648');
-
-define('MAX_INT64_STRING',  '9223372036854775807');
-define('MIN_INT64_STRING',  '-9223372036854775808');
-define('MAX_UINT64_STRING', '-9223372036854775808');
-
-if (PHP_INT_SIZE === 8) {
-    define('MAX_INT64',  (int)9223372036854775807);
-    define('MIN_INT64',  (int)-9223372036854775808);
-    define('MAX_UINT64', (int)-9223372036854775808);
-} else {
-    define('MAX_INT64', MAX_INT64_STRING);
-    define('MIN_INT64', MIN_INT64_STRING);
-    define('MAX_UINT64', MAX_UINT64_STRING);
-}
-
-class TestUtil
-{
-
-    public static function setTestMessage(TestMessage $m)
-    {
-        $m->setOptionalInt32(-42);
-        $m->setOptionalInt64(-43);
-        $m->setOptionalUint32(42);
-        $m->setOptionalUint64(43);
-        $m->setOptionalSint32(-44);
-        $m->setOptionalSint64(-45);
-        $m->setOptionalFixed32(46);
-        $m->setOptionalFixed64(47);
-        $m->setOptionalSfixed32(-46);
-        $m->setOptionalSfixed64(-47);
-        $m->setOptionalFloat(1.5);
-        $m->setOptionalDouble(1.6);
-        $m->setOptionalBool(true);
-        $m->setOptionalString('a');
-        $m->setOptionalBytes('b');
-        $m->setOptionalEnum(TestEnum::ONE);
-        $sub = new TestMessage_Sub();
-        $m->setOptionalMessage($sub);
-        $m->getOptionalMessage()->SetA(33);
-
-        self::appendHelper($m, 'RepeatedInt32',    -42);
-        self::appendHelper($m, 'RepeatedInt64',    -43);
-        self::appendHelper($m, 'RepeatedUint32',    42);
-        self::appendHelper($m, 'RepeatedUint64',    43);
-        self::appendHelper($m, 'RepeatedSint32',   -44);
-        self::appendHelper($m, 'RepeatedSint64',   -45);
-        self::appendHelper($m, 'RepeatedFixed32',   46);
-        self::appendHelper($m, 'RepeatedFixed64',   47);
-        self::appendHelper($m, 'RepeatedSfixed32', -46);
-        self::appendHelper($m, 'RepeatedSfixed64', -47);
-        self::appendHelper($m, 'RepeatedFloat',    1.5);
-        self::appendHelper($m, 'RepeatedDouble',   1.6);
-        self::appendHelper($m, 'RepeatedBool',     true);
-        self::appendHelper($m, 'RepeatedString',   'a');
-        self::appendHelper($m, 'RepeatedBytes',    'b');
-        self::appendHelper($m, 'RepeatedEnum',     TestEnum::ZERO);
-        self::appendHelper($m, 'RepeatedMessage',  new TestMessage_Sub());
-        $m->getRepeatedMessage()[0]->setA(34);
-
-        self::appendHelper($m, 'RepeatedInt32',    -52);
-        self::appendHelper($m, 'RepeatedInt64',    -53);
-        self::appendHelper($m, 'RepeatedUint32',    52);
-        self::appendHelper($m, 'RepeatedUint64',    53);
-        self::appendHelper($m, 'RepeatedSint32',   -54);
-        self::appendHelper($m, 'RepeatedSint64',   -55);
-        self::appendHelper($m, 'RepeatedFixed32',   56);
-        self::appendHelper($m, 'RepeatedFixed64',   57);
-        self::appendHelper($m, 'RepeatedSfixed32', -56);
-        self::appendHelper($m, 'RepeatedSfixed64', -57);
-        self::appendHelper($m, 'RepeatedFloat',    2.5);
-        self::appendHelper($m, 'RepeatedDouble',   2.6);
-        self::appendHelper($m, 'RepeatedBool',     false);
-        self::appendHelper($m, 'RepeatedString',   'c');
-        self::appendHelper($m, 'RepeatedBytes',    'd');
-        self::appendHelper($m, 'RepeatedEnum',     TestEnum::ONE);
-        self::appendHelper($m, 'RepeatedMessage',  new TestMessage_Sub());
-        $m->getRepeatedMessage()[1]->SetA(35);
-
-        self::kvUpdateHelper($m, 'MapInt32Int32', -62, -62);
-        self::kvUpdateHelper($m, 'MapInt64Int64', -63, -63);
-        self::kvUpdateHelper($m, 'MapUint32Uint32', 62, 62);
-        self::kvUpdateHelper($m, 'MapUint64Uint64', 63, 63);
-        self::kvUpdateHelper($m, 'MapSint32Sint32', -64, -64);
-        self::kvUpdateHelper($m, 'MapSint64Sint64', -65, -65);
-        self::kvUpdateHelper($m, 'MapFixed32Fixed32', 66, 66);
-        self::kvUpdateHelper($m, 'MapFixed64Fixed64', 67, 67);
-        self::kvUpdateHelper($m, 'MapSfixed32Sfixed32', -68, -68);
-        self::kvUpdateHelper($m, 'MapSfixed64Sfixed64', -69, -69);
-        self::kvUpdateHelper($m, 'MapInt32Float', 1, 3.5);
-        self::kvUpdateHelper($m, 'MapInt32Double', 1, 3.6);
-        self::kvUpdateHelper($m, 'MapBoolBool', true, true);
-        self::kvUpdateHelper($m, 'MapStringString', 'e', 'e');
-        self::kvUpdateHelper($m, 'MapInt32Bytes', 1, 'f');
-        self::kvUpdateHelper($m, 'MapInt32Enum', 1, TestEnum::ONE);
-        self::kvUpdateHelper($m, 'MapInt32Message', 1, new TestMessage_Sub());
-        $m->getMapInt32Message()[1]->SetA(36);
-    }
-
-    public static function setTestMessage2(TestMessage $m)
-    {
-        $sub = new TestMessage_Sub();
-
-        $m->setOptionalInt32(-142);
-        $m->setOptionalInt64(-143);
-        $m->setOptionalUint32(142);
-        $m->setOptionalUint64(143);
-        $m->setOptionalSint32(-144);
-        $m->setOptionalSint64(-145);
-        $m->setOptionalFixed32(146);
-        $m->setOptionalFixed64(147);
-        $m->setOptionalSfixed32(-146);
-        $m->setOptionalSfixed64(-147);
-        $m->setOptionalFloat(11.5);
-        $m->setOptionalDouble(11.6);
-        $m->setOptionalBool(true);
-        $m->setOptionalString('aa');
-        $m->setOptionalBytes('bb');
-        $m->setOptionalEnum(TestEnum::TWO);
-        $m->setOptionalMessage($sub);
-        $m->getOptionalMessage()->SetA(133);
-
-        self::appendHelper($m, 'RepeatedInt32',    -142);
-        self::appendHelper($m, 'RepeatedInt64',    -143);
-        self::appendHelper($m, 'RepeatedUint32',    142);
-        self::appendHelper($m, 'RepeatedUint64',    143);
-        self::appendHelper($m, 'RepeatedSint32',   -144);
-        self::appendHelper($m, 'RepeatedSint64',   -145);
-        self::appendHelper($m, 'RepeatedFixed32',   146);
-        self::appendHelper($m, 'RepeatedFixed64',   147);
-        self::appendHelper($m, 'RepeatedSfixed32', -146);
-        self::appendHelper($m, 'RepeatedSfixed64', -147);
-        self::appendHelper($m, 'RepeatedFloat',    11.5);
-        self::appendHelper($m, 'RepeatedDouble',   11.6);
-        self::appendHelper($m, 'RepeatedBool',     false);
-        self::appendHelper($m, 'RepeatedString',   'aa');
-        self::appendHelper($m, 'RepeatedBytes',    'bb');
-        self::appendHelper($m, 'RepeatedEnum',     TestEnum::TWO);
-        self::appendHelper($m, 'RepeatedMessage',  new TestMessage_Sub());
-        $m->getRepeatedMessage()[0]->setA(134);
-
-        self::kvUpdateHelper($m, 'MapInt32Int32', -62, -162);
-        self::kvUpdateHelper($m, 'MapInt64Int64', -63, -163);
-        self::kvUpdateHelper($m, 'MapUint32Uint32', 62, 162);
-        self::kvUpdateHelper($m, 'MapUint64Uint64', 63, 163);
-        self::kvUpdateHelper($m, 'MapSint32Sint32', -64, -164);
-        self::kvUpdateHelper($m, 'MapSint64Sint64', -65, -165);
-        self::kvUpdateHelper($m, 'MapFixed32Fixed32', 66, 166);
-        self::kvUpdateHelper($m, 'MapFixed64Fixed64', 67, 167);
-        self::kvUpdateHelper($m, 'MapSfixed32Sfixed32', -68, -168);
-        self::kvUpdateHelper($m, 'MapSfixed64Sfixed64', -69, -169);
-        self::kvUpdateHelper($m, 'MapInt32Float', 1, 13.5);
-        self::kvUpdateHelper($m, 'MapInt32Double', 1, 13.6);
-        self::kvUpdateHelper($m, 'MapBoolBool', true, false);
-        self::kvUpdateHelper($m, 'MapStringString', 'e', 'ee');
-        self::kvUpdateHelper($m, 'MapInt32Bytes', 1, 'ff');
-        self::kvUpdateHelper($m, 'MapInt32Enum', 1, TestEnum::TWO);
-        self::kvUpdateHelper($m, 'MapInt32Message', 1, new TestMessage_Sub());
-        $m->getMapInt32Message()[1]->SetA(136);
-
-        self::kvUpdateHelper($m, 'MapInt32Int32', -162, -162);
-        self::kvUpdateHelper($m, 'MapInt64Int64', -163, -163);
-        self::kvUpdateHelper($m, 'MapUint32Uint32', 162, 162);
-        self::kvUpdateHelper($m, 'MapUint64Uint64', 163, 163);
-        self::kvUpdateHelper($m, 'MapSint32Sint32', -164, -164);
-        self::kvUpdateHelper($m, 'MapSint64Sint64', -165, -165);
-        self::kvUpdateHelper($m, 'MapFixed32Fixed32', 166, 166);
-        self::kvUpdateHelper($m, 'MapFixed64Fixed64', 167, 167);
-        self::kvUpdateHelper($m, 'MapSfixed32Sfixed32', -168, -168);
-        self::kvUpdateHelper($m, 'MapSfixed64Sfixed64', -169, -169);
-        self::kvUpdateHelper($m, 'MapInt32Float', 2, 13.5);
-        self::kvUpdateHelper($m, 'MapInt32Double', 2, 13.6);
-        self::kvUpdateHelper($m, 'MapBoolBool', false, false);
-        self::kvUpdateHelper($m, 'MapStringString', 'ee', 'ee');
-        self::kvUpdateHelper($m, 'MapInt32Bytes', 2, 'ff');
-        self::kvUpdateHelper($m, 'MapInt32Enum', 2, TestEnum::TWO);
-        self::kvUpdateHelper($m, 'MapInt32Message', 2, new TestMessage_Sub());
-        $m->getMapInt32Message()[2]->SetA(136);
-    }
-
-    public static function assertTestMessage(TestMessage $m)
-    {
-        if (PHP_INT_SIZE == 4) {
-            assert('-43' === $m->getOptionalInt64());
-            assert('43'  === $m->getOptionalUint64());
-            assert('-45' === $m->getOptionalSint64());
-            assert('47'  === $m->getOptionalFixed64());
-            assert('-47' === $m->getOptionalSfixed64());
-        } else {
-            assert(-43 === $m->getOptionalInt64());
-            assert(43  === $m->getOptionalUint64());
-            assert(-45 === $m->getOptionalSint64());
-            assert(47  === $m->getOptionalFixed64());
-            assert(-47 === $m->getOptionalSfixed64());
-        }
-        assert(-42 === $m->getOptionalInt32());
-        assert(42  === $m->getOptionalUint32());
-        assert(-44 === $m->getOptionalSint32());
-        assert(46  === $m->getOptionalFixed32());
-        assert(-46 === $m->getOptionalSfixed32());
-        assert(1.5 === $m->getOptionalFloat());
-        assert(1.6 === $m->getOptionalDouble());
-        assert(true=== $m->getOptionalBool());
-        assert('a' === $m->getOptionalString());
-        assert('b' === $m->getOptionalBytes());
-        assert(TestEnum::ONE === $m->getOptionalEnum());
-        assert(33  === $m->getOptionalMessage()->getA());
-
-        if (PHP_INT_SIZE == 4) {
-            assert('-43' === $m->getRepeatedInt64()[0]);
-            assert('43'  === $m->getRepeatedUint64()[0]);
-            assert('-45' === $m->getRepeatedSint64()[0]);
-            assert('47'  === $m->getRepeatedFixed64()[0]);
-            assert('-47' === $m->getRepeatedSfixed64()[0]);
-        } else {
-            assert(-43 === $m->getRepeatedInt64()[0]);
-            assert(43  === $m->getRepeatedUint64()[0]);
-            assert(-45 === $m->getRepeatedSint64()[0]);
-            assert(47  === $m->getRepeatedFixed64()[0]);
-            assert(-47 === $m->getRepeatedSfixed64()[0]);
-        }
-        assert(-42 === $m->getRepeatedInt32()[0]);
-        assert(42  === $m->getRepeatedUint32()[0]);
-        assert(-44 === $m->getRepeatedSint32()[0]);
-        assert(46  === $m->getRepeatedFixed32()[0]);
-        assert(-46 === $m->getRepeatedSfixed32()[0]);
-        assert(1.5 === $m->getRepeatedFloat()[0]);
-        assert(1.6 === $m->getRepeatedDouble()[0]);
-        assert(true=== $m->getRepeatedBool()[0]);
-        assert('a' === $m->getRepeatedString()[0]);
-        assert('b' === $m->getRepeatedBytes()[0]);
-        assert(TestEnum::ZERO === $m->getRepeatedEnum()[0]);
-        assert(34  === $m->getRepeatedMessage()[0]->getA());
-
-        if (PHP_INT_SIZE == 4) {
-            assert('-53' === $m->getRepeatedInt64()[1]);
-            assert('53'  === $m->getRepeatedUint64()[1]);
-            assert('-55' === $m->getRepeatedSint64()[1]);
-            assert('57'  === $m->getRepeatedFixed64()[1]);
-            assert('-57' === $m->getRepeatedSfixed64()[1]);
-        } else {
-            assert(-53 === $m->getRepeatedInt64()[1]);
-            assert(53  === $m->getRepeatedUint64()[1]);
-            assert(-55 === $m->getRepeatedSint64()[1]);
-            assert(57  === $m->getRepeatedFixed64()[1]);
-            assert(-57 === $m->getRepeatedSfixed64()[1]);
-        }
-        assert(-52 === $m->getRepeatedInt32()[1]);
-        assert(52  === $m->getRepeatedUint32()[1]);
-        assert(-54 === $m->getRepeatedSint32()[1]);
-        assert(56  === $m->getRepeatedFixed32()[1]);
-        assert(-56 === $m->getRepeatedSfixed32()[1]);
-        assert(2.5 === $m->getRepeatedFloat()[1]);
-        assert(2.6 === $m->getRepeatedDouble()[1]);
-        assert(false === $m->getRepeatedBool()[1]);
-        assert('c' === $m->getRepeatedString()[1]);
-        assert('d' === $m->getRepeatedBytes()[1]);
-        assert(TestEnum::ONE === $m->getRepeatedEnum()[1]);
-        assert(35  === $m->getRepeatedMessage()[1]->getA());
-
-        if (PHP_INT_SIZE == 4) {
-            assert('-63' === $m->getMapInt64Int64()['-63']);
-            assert('63'  === $m->getMapUint64Uint64()['63']);
-            assert('-65' === $m->getMapSint64Sint64()['-65']);
-            assert('67'  === $m->getMapFixed64Fixed64()['67']);
-            assert('-69'  === $m->getMapSfixed64Sfixed64()['-69']);
-        } else {
-            assert(-63 === $m->getMapInt64Int64()[-63]);
-            assert(63  === $m->getMapUint64Uint64()[63]);
-            assert(-65 === $m->getMapSint64Sint64()[-65]);
-            assert(67  === $m->getMapFixed64Fixed64()[67]);
-            assert(-69  === $m->getMapSfixed64Sfixed64()[-69]);
-        }
-        assert(-62 === $m->getMapInt32Int32()[-62]);
-        assert(62  === $m->getMapUint32Uint32()[62]);
-        assert(-64 === $m->getMapSint32Sint32()[-64]);
-        assert(66  === $m->getMapFixed32Fixed32()[66]);
-        assert(-68  === $m->getMapSfixed32Sfixed32()[-68]);
-        assert(3.5 === $m->getMapInt32Float()[1]);
-        assert(3.6 === $m->getMapInt32Double()[1]);
-        assert(true === $m->getMapBoolBool()[true]);
-        assert('e' === $m->getMapStringString()['e']);
-        assert('f' === $m->getMapInt32Bytes()[1]);
-        assert(TestEnum::ONE === $m->getMapInt32Enum()[1]);
-        assert(36  === $m->getMapInt32Message()[1]->GetA());
-    }
-
-    public static function getGoldenTestMessage()
-    {
-        return hex2bin(
-            "08D6FFFFFFFFFFFFFFFF01" .
-            "10D5FFFFFFFFFFFFFFFF01" .
-            "182A" .
-            "202B" .
-            "2857" .
-            "3059" .
-            "3D2E000000" .
-            "412F00000000000000" .
-            "4DD2FFFFFF" .
-            "51D1FFFFFFFFFFFFFF" .
-            "5D0000C03F" .
-            "619A9999999999F93F" .
-            "6801" .
-            "720161" .
-            "7A0162" .
-            "800101" .
-            "8A01020821" .
-
-            "F801D6FFFFFFFFFFFFFFFF01" .
-            "F801CCFFFFFFFFFFFFFFFF01" .
-            "8002D5FFFFFFFFFFFFFFFF01" .
-            "8002CBFFFFFFFFFFFFFFFF01" .
-            "88022A" .
-            "880234" .
-            "90022B" .
-            "900235" .
-            "980257" .
-            "98026B" .
-            "A00259" .
-            "A0026D" .
-            "AD022E000000" .
-            "AD0238000000" .
-            "B1022F00000000000000" .
-            "B1023900000000000000" .
-            "BD02D2FFFFFF" .
-            "BD02C8FFFFFF" .
-            "C102D1FFFFFFFFFFFFFF" .
-            "C102C7FFFFFFFFFFFFFF" .
-            "CD020000C03F" .
-            "CD0200002040" .
-            "D1029A9999999999F93F" .
-            "D102CDCCCCCCCCCC0440" .
-            "D80201" .
-            "D80200" .
-            "E2020161" .
-            "E2020163" .
-            "EA020162" .
-            "EA020164" .
-            "F00200" .
-            "F00201" .
-            "FA02020822" .
-            "FA02020823" .
-
-            "BA041608C2FFFFFFFFFFFFFFFF0110C2FFFFFFFFFFFFFFFF01" .
-            "C2041608C1FFFFFFFFFFFFFFFF0110C1FFFFFFFFFFFFFFFF01" .
-            "CA0404083E103E" .
-            "D20404083F103F" .
-            "DA0404087f107F" .
-            "E20406088101108101" .
-            "EA040A0D420000001542000000" .
-            "F20412094300000000000000114300000000000000" .
-            "FA040A0DBCFFFFFF15BCFFFFFF" .
-            "82051209BBFFFFFFFFFFFFFF11BBFFFFFFFFFFFFFF" .
-            "8A050708011500006040" .
-            "92050B080111CDCCCCCCCCCC0C40" .
-            "9A050408011001" .
-            "A205060a0165120165" .
-            "AA05050801120166" .
-            "B2050408011001" .
-            "Ba0506080112020824"
-        );
-    }
-
-    public static function setTestPackedMessage($m)
-    {
-        self::appendHelper($m, 'RepeatedInt32', -42);
-        self::appendHelper($m, 'RepeatedInt32', -52);
-        self::appendHelper($m, 'RepeatedInt64', -43);
-        self::appendHelper($m, 'RepeatedInt64', -53);
-        self::appendHelper($m, 'RepeatedUint32', 42);
-        self::appendHelper($m, 'RepeatedUint32', 52);
-        self::appendHelper($m, 'RepeatedUint64', 43);
-        self::appendHelper($m, 'RepeatedUint64', 53);
-        self::appendHelper($m, 'RepeatedSint32', -44);
-        self::appendHelper($m, 'RepeatedSint32', -54);
-        self::appendHelper($m, 'RepeatedSint64', -45);
-        self::appendHelper($m, 'RepeatedSint64', -55);
-        self::appendHelper($m, 'RepeatedFixed32', 46);
-        self::appendHelper($m, 'RepeatedFixed32', 56);
-        self::appendHelper($m, 'RepeatedFixed64', 47);
-        self::appendHelper($m, 'RepeatedFixed64', 57);
-        self::appendHelper($m, 'RepeatedSfixed32', -46);
-        self::appendHelper($m, 'RepeatedSfixed32', -56);
-        self::appendHelper($m, 'RepeatedSfixed64', -47);
-        self::appendHelper($m, 'RepeatedSfixed64', -57);
-        self::appendHelper($m, 'RepeatedFloat', 1.5);
-        self::appendHelper($m, 'RepeatedFloat', 2.5);
-        self::appendHelper($m, 'RepeatedDouble', 1.6);
-        self::appendHelper($m, 'RepeatedDouble', 2.6);
-        self::appendHelper($m, 'RepeatedBool', true);
-        self::appendHelper($m, 'RepeatedBool', false);
-        self::appendHelper($m, 'RepeatedEnum', TestEnum::ONE);
-        self::appendHelper($m, 'RepeatedEnum', TestEnum::ZERO);
-    }
-
-    public static function assertTestPackedMessage($m)
-    {
-        assert(2 === count($m->getRepeatedInt32()));
-        assert(2 === count($m->getRepeatedInt64()));
-        assert(2 === count($m->getRepeatedUint32()));
-        assert(2 === count($m->getRepeatedUint64()));
-        assert(2 === count($m->getRepeatedSint32()));
-        assert(2 === count($m->getRepeatedSint64()));
-        assert(2 === count($m->getRepeatedFixed32()));
-        assert(2 === count($m->getRepeatedFixed64()));
-        assert(2 === count($m->getRepeatedSfixed32()));
-        assert(2 === count($m->getRepeatedSfixed64()));
-        assert(2 === count($m->getRepeatedFloat()));
-        assert(2 === count($m->getRepeatedDouble()));
-        assert(2 === count($m->getRepeatedBool()));
-        assert(2 === count($m->getRepeatedEnum()));
-
-        assert(-42 === $m->getRepeatedInt32()[0]);
-        assert(-52 === $m->getRepeatedInt32()[1]);
-        assert(42  === $m->getRepeatedUint32()[0]);
-        assert(52  === $m->getRepeatedUint32()[1]);
-        assert(-44 === $m->getRepeatedSint32()[0]);
-        assert(-54 === $m->getRepeatedSint32()[1]);
-        assert(46  === $m->getRepeatedFixed32()[0]);
-        assert(56  === $m->getRepeatedFixed32()[1]);
-        assert(-46 === $m->getRepeatedSfixed32()[0]);
-        assert(-56 === $m->getRepeatedSfixed32()[1]);
-        assert(1.5 === $m->getRepeatedFloat()[0]);
-        assert(2.5 === $m->getRepeatedFloat()[1]);
-        assert(1.6 === $m->getRepeatedDouble()[0]);
-        assert(2.6 === $m->getRepeatedDouble()[1]);
-        assert(true  === $m->getRepeatedBool()[0]);
-        assert(false === $m->getRepeatedBool()[1]);
-        assert(TestEnum::ONE  === $m->getRepeatedEnum()[0]);
-        assert(TestEnum::ZERO === $m->getRepeatedEnum()[1]);
-        if (PHP_INT_SIZE == 4) {
-            assert('-43' === $m->getRepeatedInt64()[0]);
-            assert('-53' === $m->getRepeatedInt64()[1]);
-            assert('43'  === $m->getRepeatedUint64()[0]);
-            assert('53'  === $m->getRepeatedUint64()[1]);
-            assert('-45' === $m->getRepeatedSint64()[0]);
-            assert('-55' === $m->getRepeatedSint64()[1]);
-            assert('47'  === $m->getRepeatedFixed64()[0]);
-            assert('57'  === $m->getRepeatedFixed64()[1]);
-            assert('-47' === $m->getRepeatedSfixed64()[0]);
-            assert('-57' === $m->getRepeatedSfixed64()[1]);
-        } else {
-            assert(-43 === $m->getRepeatedInt64()[0]);
-            assert(-53 === $m->getRepeatedInt64()[1]);
-            assert(43  === $m->getRepeatedUint64()[0]);
-            assert(53  === $m->getRepeatedUint64()[1]);
-            assert(-45 === $m->getRepeatedSint64()[0]);
-            assert(-55 === $m->getRepeatedSint64()[1]);
-            assert(47  === $m->getRepeatedFixed64()[0]);
-            assert(57  === $m->getRepeatedFixed64()[1]);
-            assert(-47 === $m->getRepeatedSfixed64()[0]);
-            assert(-57 === $m->getRepeatedSfixed64()[1]);
-        }
-    }
-
-    public static function getGoldenTestPackedMessage()
-    {
-        return hex2bin(
-            "D20514D6FFFFFFFFFFFFFFFF01CCFFFFFFFFFFFFFFFF01" .
-            "DA0514D5FFFFFFFFFFFFFFFF01CBFFFFFFFFFFFFFFFF01" .
-            "E205022A34" .
-            "EA05022B35" .
-            "F20502576B" .
-            "FA0502596D" .
-            "8206082E00000038000000" .
-            "8A06102F000000000000003900000000000000" .
-            "920608D2FFFFFFC8FFFFFF" .
-            "9A0610D1FFFFFFFFFFFFFFC7FFFFFFFFFFFFFF" .
-            "A206080000C03F00002040" .
-            "AA06109A9999999999F93FCDCCCCCCCCCC0440" .
-            "B206020100" .
-            "BA06020100"
-        );
-    }
-
-    public static function getGoldenTestUnpackedMessage()
-    {
-        return hex2bin(
-            "D005D6FFFFFFFFFFFFFFFF01D005CCFFFFFFFFFFFFFFFF01" .
-            "D805D5FFFFFFFFFFFFFFFF01D805CBFFFFFFFFFFFFFFFF01" .
-            "E0052AE00534" .
-            "E8052BE80535" .
-            "F00557F0056B" .
-            "F80559F8056D" .
-            "85062E000000850638000000" .
-            "89062F0000000000000089063900000000000000" .
-            "9506D2FFFFFF9506C8FFFFFF" .
-            "9906D1FFFFFFFFFFFFFF9906C7FFFFFFFFFFFFFF" .
-            "A5060000C03FA50600002040" .
-            "A9069A9999999999F93FA906CDCCCCCCCCCC0440" .
-            "B00601B00600" .
-            "B80601B80600"
-        );
-    }
-
-    private static function appendHelper($obj, $func_suffix, $value)
-    {
-        $getter_function = 'get'.$func_suffix;
-        $setter_function = 'set'.$func_suffix;
-
-        $arr = $obj->$getter_function();
-        $arr[] = $value;
-        $obj->$setter_function($arr);
-    }
-
-    private static function kvUpdateHelper($obj, $func_suffix, $key, $value)
-    {
-        $getter_function = 'get'.$func_suffix;
-        $setter_function = 'set'.$func_suffix;
-
-        $arr = $obj->$getter_function();
-        $arr[$key] = $value;
-        $obj->$setter_function($arr);
-    }
-}
diff --git a/php/tests/undefined_test.php b/php/tests/undefined_test.php
deleted file mode 100644
index dc6b708..0000000
--- a/php/tests/undefined_test.php
+++ /dev/null
@@ -1,920 +0,0 @@
-<?php
-
-require_once('test_util.php');
-
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBType;
-use Foo\TestMessage;
-use Foo\TestMessage_Sub;
-
-class UndefinedTest extends PHPUnit_Framework_TestCase
-{
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32AppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32SetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = 0;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32AppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32SetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = 0;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32AppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT32);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32SetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT32);
-        $arr[] = 0;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32AppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT32);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32SetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT32);
-        $arr[] = 0;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64AppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::INT64);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64SetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::INT64);
-        $arr[] = 0;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64AppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::INT64);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64SetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::INT64);
-        $arr[] = 0;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64AppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT64);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64SetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT64);
-        $arr[] = 0;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64AppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT64);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64SetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::UINT64);
-        $arr[] = 0;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testFloatAppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::FLOAT);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testFloatSetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::FLOAT);
-        $arr[] = 0.0;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testFloatAppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::FLOAT);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testFloatSetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::FLOAT);
-        $arr[] = 0.0;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleAppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::DOUBLE);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleSetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::DOUBLE);
-        $arr[] = 0.0;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleAppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::DOUBLE);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleSetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::DOUBLE);
-        $arr[] = 0.0;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testBoolAppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::BOOL);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testBoolSetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::BOOL);
-        $arr[] = true;
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringAppendMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::STRING);
-        $arr[] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringSetMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::STRING);
-        $arr[] = 'abc';
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringAppendInvalidUTF8Fail()
-    {
-        $arr = new RepeatedField(GPBType::STRING);
-        $hex = hex2bin("ff");
-        $arr[] = $hex;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringSetInvalidUTF8Fail()
-    {
-        $arr = new RepeatedField(GPBType::STRING);
-        $arr[] = 'abc';
-        $hex = hex2bin("ff");
-        $arr[0] = $hex;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageAppendIntFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $arr[] = 1;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetIntFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $arr[] = new TestMessage_Sub;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageAppendStringFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $arr[] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetStringFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $arr[] = new TestMessage_Sub;
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageAppendOtherMessageFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $arr[] = new TestMessage;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageAppendNullFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $null = null;
-        $arr[] = $null;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetNullFail()
-    {
-        $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class);
-        $arr[] = new TestMessage_Sub();
-        $null = null;
-        $arr[0] = $null;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testRemoveMiddleFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-
-        $arr[] = 0;
-        $arr[] = 1;
-        $arr[] = 2;
-        $this->assertSame(3, count($arr));
-
-        unset($arr[1]);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testRemoveEmptyFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-
-        unset($arr[0]);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageOffsetFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = 0;
-        $arr[new TestMessage_Sub()] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringOffsetFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[] = 0;
-        $arr['abc'] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testSetNonExistedOffsetFail()
-    {
-        $arr = new RepeatedField(GPBType::INT32);
-        $arr[0] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32FieldInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalInt32(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32FieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalInt32('abc');
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32FieldInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalUint32(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32FieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalUint32('abc');
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64FieldInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalInt64(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64FieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalInt64('abc');
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64FieldInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalUint64(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64FieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalUint64('abc');
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testFloatFieldInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalFloat(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testFloatFieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalFloat('abc');
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleFieldInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalDouble(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleFieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalDouble('abc');
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testBoolFieldInvalidStringFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalBool(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringFieldInvalidUTF8Fail()
-    {
-        $m = new TestMessage();
-        $hex = hex2bin("ff");
-        $m->setOptionalString($hex);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageFieldWrongTypeFail()
-    {
-        $m = new TestMessage();
-        $a = 1;
-        $m->setOptionalMessage($a);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageFieldWrongClassFail()
-    {
-        $m = new TestMessage();
-        $m->setOptionalMessage(new TestMessage());
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testRepeatedFieldWrongTypeFail()
-    {
-        $m = new TestMessage();
-        $a = 1;
-        $m->setRepeatedInt32($a);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testRepeatedFieldWrongObjectFail()
-    {
-        $m = new TestMessage();
-        $m->setRepeatedInt32($m);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testRepeatedFieldWrongRepeatedTypeFail()
-    {
-        $m = new TestMessage();
-
-        $repeated_int32 = new RepeatedField(GPBType::UINT32);
-        $m->setRepeatedInt32($repeated_int32);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testRepeatedFieldWrongRepeatedMessageClassFail()
-    {
-        $m = new TestMessage();
-
-        $repeated_message = new RepeatedField(GPBType::MESSAGE,
-                                              TestMessage::class);
-        $m->setRepeatedMessage($repeated_message);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMapFieldWrongTypeFail()
-    {
-        $m = new TestMessage();
-        $a = 1;
-        $m->setMapInt32Int32($a);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMapFieldWrongObjectFail()
-    {
-        $m = new TestMessage();
-        $m->setMapInt32Int32($m);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMapFieldWrongRepeatedTypeFail()
-    {
-        $m = new TestMessage();
-
-        $map_uint32_uint32 = new MapField(GPBType::UINT32, GPBType::UINT32);
-        $m->setMapInt32Int32($map_uint32_uint32);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMapFieldWrongRepeatedMessageClassFail()
-    {
-        $m = new TestMessage();
-
-        $map_int32_message = new MapField(GPBType::INT32,
-                                          GPBType::MESSAGE,
-                                          TestMessage::class);
-        $m->setMapInt32Message($map_int32_message);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageMergeFromInvalidTypeFail()
-    {
-        $m = new TestMessage();
-        $n = new TestMessage_Sub();
-        $m->mergeFrom($n);
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32SetStringKeyFail()
-    {
-        $arr = new MapField(GPBType::INT32, GPBType::INT32);
-        $arr['abc'] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32SetStringValueFail()
-    {
-        $arr = new MapField(GPBType::INT32, GPBType::INT32);
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32SetMessageKeyFail()
-    {
-        $arr = new MapField(GPBType::INT32, GPBType::INT32);
-        $arr[new TestMessage_Sub()] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt32SetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::INT32, GPBType::INT32);
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32SetStringKeyFail()
-    {
-        $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
-        $arr['abc'] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32SetStringValueFail()
-    {
-        $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32SetMessageKeyFail()
-    {
-        $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
-        $arr[new TestMessage_Sub()] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint32SetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::UINT32, GPBType::UINT32);
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64SetStringKeyFail()
-    {
-        $arr = new MapField(GPBType::INT64, GPBType::INT64);
-        $arr['abc'] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64SetStringValueFail()
-    {
-        $arr = new MapField(GPBType::INT64, GPBType::INT64);
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64SetMessageKeyFail()
-    {
-        $arr = new MapField(GPBType::INT64, GPBType::INT64);
-        $arr[new TestMessage_Sub()] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testInt64SetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::INT64, GPBType::INT64);
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64SetStringKeyFail()
-    {
-        $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
-        $arr['abc'] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64SetStringValueFail()
-    {
-        $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64SetMessageKeyFail()
-    {
-        $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
-        $arr[new TestMessage_Sub()] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testUint64SetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::UINT64, GPBType::UINT64);
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleSetStringValueFail()
-    {
-        $arr = new MapField(GPBType::INT64, GPBType::DOUBLE);
-        $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testDoubleSetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::INT64, GPBType::DOUBLE);
-        $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testBoolSetMessageKeyFail()
-    {
-        $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
-        $arr[new TestMessage_Sub()] = true;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testBoolSetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::BOOL, GPBType::BOOL);
-        $arr[true] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringSetInvalidUTF8KeyFail()
-    {
-        $arr = new MapField(GPBType::STRING, GPBType::STRING);
-        $arr[hex2bin("ff")] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringSetInvalidUTF8ValueFail()
-    {
-        $arr = new MapField(GPBType::STRING, GPBType::STRING);
-        $arr['abc'] = hex2bin("ff");
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringSetMessageKeyFail()
-    {
-        $arr = new MapField(GPBType::STRING, GPBType::STRING);
-        $arr[new TestMessage_Sub()] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testStringSetMessageValueFail()
-    {
-        $arr = new MapField(GPBType::STRING, GPBType::STRING);
-        $arr['abc'] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetIntValueFail()
-    {
-       $arr =
-           new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
-       $arr[0] = 0;
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetStringValueFail()
-    {
-       $arr =
-           new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
-       $arr[0] = 'abc';
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetOtherMessageValueFail()
-    {
-       $arr =
-           new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
-       $arr[0] = new TestMessage_Sub();
-    }
-
-    /**
-     * @expectedException PHPUnit_Framework_Error
-     */
-    public function testMessageSetNullFail()
-    {
-       $arr =
-           new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class);
-       $null = NULL;
-       $arr[0] = $null;
-    }
-
-}
diff --git a/php/tests/well_known_test.php b/php/tests/well_known_test.php
deleted file mode 100644
index a776068..0000000
--- a/php/tests/well_known_test.php
+++ /dev/null
@@ -1,393 +0,0 @@
-<?php
-
-require_once('test_base.php');
-require_once('test_util.php');
-
-use Foo\TestMessage;
-use Google\Protobuf\Any;
-use Google\Protobuf\Api;
-use Google\Protobuf\BoolValue;
-use Google\Protobuf\BytesValue;
-use Google\Protobuf\DoubleValue;
-use Google\Protobuf\Duration;
-use Google\Protobuf\Enum;
-use Google\Protobuf\EnumValue;
-use Google\Protobuf\Field;
-use Google\Protobuf\FieldMask;
-use Google\Protobuf\Field_Cardinality;
-use Google\Protobuf\Field_Kind;
-use Google\Protobuf\FloatValue;
-use Google\Protobuf\GPBEmpty;
-use Google\Protobuf\Int32Value;
-use Google\Protobuf\Int64Value;
-use Google\Protobuf\ListValue;
-use Google\Protobuf\Method;
-use Google\Protobuf\Mixin;
-use Google\Protobuf\NullValue;
-use Google\Protobuf\Option;
-use Google\Protobuf\SourceContext;
-use Google\Protobuf\StringValue;
-use Google\Protobuf\Struct;
-use Google\Protobuf\Syntax;
-use Google\Protobuf\Timestamp;
-use Google\Protobuf\Type;
-use Google\Protobuf\UInt32Value;
-use Google\Protobuf\UInt64Value;
-use Google\Protobuf\Value;
-
-class NotMessage {}
-
-class WellKnownTest extends TestBase {
-
-    public function testEmpty()
-    {
-        $msg = new GPBEmpty();
-    }
-
-    public function testImportDescriptorProto()
-    {
-        $msg = new TestImportDescriptorProto();
-    }
-
-    public function testAny()
-    {
-        // Create embed message
-        $embed = new TestMessage();
-        $this->setFields($embed);
-        $data = $embed->serializeToString();
-
-        // Set any via normal setter.
-        $any = new Any();
-
-        $this->assertSame(
-            $any, $any->setTypeUrl("type.googleapis.com/foo.TestMessage"));
-        $this->assertSame("type.googleapis.com/foo.TestMessage",
-                          $any->getTypeUrl());
-
-        $this->assertSame($any, $any->setValue($data));
-        $this->assertSame($data, $any->getValue());
-
-        // Test unpack.
-        $msg = $any->unpack();
-        $this->assertTrue($msg instanceof TestMessage);
-        $this->expectFields($msg);
-
-        // Test pack.
-        $any = new Any();
-        $any->pack($embed);
-        $this->assertSame($data, $any->getValue());
-        $this->assertSame("type.googleapis.com/foo.TestMessage", $any->getTypeUrl());
-
-        // Test is.
-        $this->assertTrue($any->is(TestMessage::class));
-        $this->assertFalse($any->is(Any::class));
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testAnyUnpackInvalidTypeUrl()
-    {
-        $any = new Any();
-        $any->setTypeUrl("invalid");
-        $any->unpack();
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testAnyUnpackMessageNotAdded()
-    {
-        $any = new Any();
-        $any->setTypeUrl("type.googleapis.com/MessageNotAdded");
-        $any->unpack();
-    }
-
-    /**
-     * @expectedException Exception
-     */
-    public function testAnyUnpackDecodeError()
-    {
-        $any = new Any();
-        $any->setTypeUrl("type.googleapis.com/foo.TestMessage");
-        $any->setValue("abc");
-        $any->unpack();
-    }
-
-    public function testApi()
-    {
-        $m = new Api();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setMethods([new Method()]);
-        $this->assertSame(1, count($m->getMethods()));
-
-        $m->setOptions([new Option()]);
-        $this->assertSame(1, count($m->getOptions()));
-
-        $m->setVersion("a");
-        $this->assertSame("a", $m->getVersion());
-
-        $m->setSourceContext(new SourceContext());
-        $this->assertFalse(is_null($m->getSourceContext()));
-
-        $m->setMixins([new Mixin()]);
-        $this->assertSame(1, count($m->getMixins()));
-
-        $m->setSyntax(Syntax::SYNTAX_PROTO2);
-        $this->assertSame(Syntax::SYNTAX_PROTO2, $m->getSyntax());
-
-        $m = new Method();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setRequestTypeUrl("a");
-        $this->assertSame("a", $m->getRequestTypeUrl());
-
-        $m->setRequestStreaming(true);
-        $this->assertSame(true, $m->getRequestStreaming());
-
-        $m->setResponseTypeUrl("a");
-        $this->assertSame("a", $m->getResponseTypeUrl());
-
-        $m->setResponseStreaming(true);
-        $this->assertSame(true, $m->getResponseStreaming());
-
-        $m->setOptions([new Option()]);
-        $this->assertSame(1, count($m->getOptions()));
-
-        $m = new Mixin();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setRoot("a");
-        $this->assertSame("a", $m->getRoot());
-    }
-
-    public function testEnum()
-    {
-        $m = new Enum();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setEnumvalue([new EnumValue()]);
-        $this->assertSame(1, count($m->getEnumvalue()));
-
-        $m->setOptions([new Option()]);
-        $this->assertSame(1, count($m->getOptions()));
-
-        $m->setSourceContext(new SourceContext());
-        $this->assertFalse(is_null($m->getSourceContext()));
-
-        $m->setSyntax(Syntax::SYNTAX_PROTO2);
-        $this->assertSame(Syntax::SYNTAX_PROTO2, $m->getSyntax());
-    }
-
-    public function testEnumValue()
-    {
-        $m = new EnumValue();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setNumber(1);
-        $this->assertSame(1, $m->getNumber());
-
-        $m->setOptions([new Option()]);
-        $this->assertSame(1, count($m->getOptions()));
-    }
-
-    public function testField()
-    {
-        $m = new Field();
-
-        $m->setKind(Field_Kind::TYPE_DOUBLE);
-        $this->assertSame(Field_Kind::TYPE_DOUBLE, $m->getKind());
-
-        $m->setCardinality(Field_Cardinality::CARDINALITY_OPTIONAL);
-        $this->assertSame(Field_Cardinality::CARDINALITY_OPTIONAL, $m->getCardinality());
-
-        $m->setNumber(1);
-        $this->assertSame(1, $m->getNumber());
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setTypeUrl("a");
-        $this->assertSame("a", $m->getTypeUrl());
-
-        $m->setOneofIndex(1);
-        $this->assertSame(1, $m->getOneofIndex());
-
-        $m->setPacked(true);
-        $this->assertSame(true, $m->getPacked());
-
-        $m->setOptions([new Option()]);
-        $this->assertSame(1, count($m->getOptions()));
-
-        $m->setJsonName("a");
-        $this->assertSame("a", $m->getJsonName());
-
-        $m->setDefaultValue("a");
-        $this->assertSame("a", $m->getDefaultValue());
-    }
-
-    public function testFieldMask()
-    {
-        $m = new FieldMask();
-        $m->setPaths(["a"]);
-        $this->assertSame(1, count($m->getPaths()));
-    }
-
-    public function testOption()
-    {
-        $m = new Option();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setValue(new Any());
-        $this->assertFalse(is_null($m->getValue()));
-    }
-
-    public function testSourceContext()
-    {
-        $m = new SourceContext();
-        $m->setFileName("a");
-        $this->assertSame("a", $m->getFileName());
-    }
-
-    public function testStruct()
-    {
-        $m = new ListValue();
-        $m->setValues([new Value()]);
-        $this->assertSame(1, count($m->getValues()));
-
-        $m = new Value();
-
-        $m->setNullValue(NullValue::NULL_VALUE);
-        $this->assertSame(NullValue::NULL_VALUE, $m->getNullValue());
-        $this->assertSame("null_value", $m->getKind());
-
-        $m->setNumberValue(1.0);
-        $this->assertSame(1.0, $m->getNumberValue());
-        $this->assertSame("number_value", $m->getKind());
-
-        $m->setStringValue("a");
-        $this->assertSame("a", $m->getStringValue());
-        $this->assertSame("string_value", $m->getKind());
-
-        $m->setBoolValue(true);
-        $this->assertSame(true, $m->getBoolValue());
-        $this->assertSame("bool_value", $m->getKind());
-
-        $m->setStructValue(new Struct());
-        $this->assertFalse(is_null($m->getStructValue()));
-        $this->assertSame("struct_value", $m->getKind());
-
-        $m->setListValue(new ListValue());
-        $this->assertFalse(is_null($m->getListValue()));
-        $this->assertSame("list_value", $m->getKind());
-
-        $m = new Struct();
-        $m->setFields(array("a"=>new Value()));
-        $this->assertSame(1, count($m->getFields()));
-    }
-
-    public function testTimestamp()
-    {
-        $timestamp = new Timestamp();
-
-        $timestamp->setSeconds(1);
-        $timestamp->setNanos(2);
-        $this->assertEquals(1, $timestamp->getSeconds());
-        $this->assertSame(2, $timestamp->getNanos());
-
-        date_default_timezone_set('UTC');
-        $from = new DateTime('2011-01-01T15:03:01.012345UTC');
-        $timestamp->fromDateTime($from);
-        $this->assertEquals($from->format('U'), $timestamp->getSeconds());
-        $this->assertSame(0, $timestamp->getNanos());
-
-        $to = $timestamp->toDateTime();
-        $this->assertSame(\DateTime::class, get_class($to));
-        $this->assertSame($from->format('U'), $to->format('U'));
-    }
-
-    public function testType()
-    {
-        $m = new Type();
-
-        $m->setName("a");
-        $this->assertSame("a", $m->getName());
-
-        $m->setFields([new Field()]);
-        $this->assertSame(1, count($m->getFields()));
-
-        $m->setOneofs(["a"]);
-        $this->assertSame(1, count($m->getOneofs()));
-
-        $m->setOptions([new Option()]);
-        $this->assertSame(1, count($m->getOptions()));
-
-        $m->setSourceContext(new SourceContext());
-        $this->assertFalse(is_null($m->getSourceContext()));
-
-        $m->setSyntax(Syntax::SYNTAX_PROTO2);
-        $this->assertSame(Syntax::SYNTAX_PROTO2, $m->getSyntax());
-    }
-
-    public function testDuration()
-    {
-        $duration = new Duration();
-
-        $duration->setSeconds(1);
-        $duration->setNanos(2);
-        $this->assertEquals(1, $duration->getSeconds());
-        $this->assertSame(2, $duration->getNanos());
-    }
-
-    public function testWrappers()
-    {
-        $m = new DoubleValue();
-        $m->setValue(1.0);
-        $this->assertSame(1.0, $m->getValue());
-
-        $m = new FloatValue();
-        $m->setValue(1.0);
-        $this->assertSame(1.0, $m->getValue());
-
-        $m = new Int64Value();
-        $m->setValue(1);
-        $this->assertEquals(1, $m->getValue());
-
-        $m = new UInt64Value();
-        $m->setValue(1);
-        $this->assertEquals(1, $m->getValue());
-
-        $m = new Int32Value();
-        $m->setValue(1);
-        $this->assertSame(1, $m->getValue());
-
-        $m = new UInt32Value();
-        $m->setValue(1);
-        $this->assertSame(1, $m->getValue());
-
-        $m = new BoolValue();
-        $m->setValue(true);
-        $this->assertSame(true, $m->getValue());
-
-        $m = new StringValue();
-        $m->setValue("a");
-        $this->assertSame("a", $m->getValue());
-
-        $m = new BytesValue();
-        $m->setValue("a");
-        $this->assertSame("a", $m->getValue());
-    }
-}
diff --git a/post_process_dist.sh b/post_process_dist.sh
index eb5f584..82736bd 100755
--- a/post_process_dist.sh
+++ b/post_process_dist.sh
@@ -27,7 +27,7 @@
 
 set -ex
 
-LANGUAGES="cpp csharp java javanano js objectivec python ruby php all"
+LANGUAGES="cpp csharp java javanano js objectivec python ruby"
 BASENAME=`basename $1 .tar.gz`
 VERSION=${BASENAME:9}
 
diff --git a/protobuf.bzl b/protobuf.bzl
index 23380ba..fbcae0b 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -1,27 +1,12 @@
+# -*- mode: python; -*- PYTHON-PREPROCESSING-REQUIRED
+
 def _GetPath(ctx, path):
   if ctx.label.workspace_root:
     return ctx.label.workspace_root + '/' + path
   else:
     return path
 
-def _IsNewExternal(ctx):
-  # Bazel 0.4.4 and older have genfiles paths that look like:
-  #   bazel-out/local-fastbuild/genfiles/external/repo/foo
-  # After the exec root rearrangement, they look like:
-  #   ../repo/bazel-out/local-fastbuild/genfiles/foo
-  return ctx.label.workspace_root.startswith("../")
-
 def _GenDir(ctx):
-  if _IsNewExternal(ctx):
-    # We are using the fact that Bazel 0.4.4+ provides repository-relative paths
-    # for ctx.genfiles_dir.
-    return ctx.genfiles_dir.path + (
-        "/" + ctx.attr.includes[0] if ctx.attr.includes and ctx.attr.includes[0] else "")
-  # This means that we're either in the old version OR the new version in the local repo.
-  # Either way, appending the source path to the genfiles dir works.
-  return ctx.var["GENDIR"] + "/" + _SourceDir(ctx)
-
-def _SourceDir(ctx):
   if not ctx.attr.includes:
     return ctx.label.workspace_root
   if not ctx.attr.includes[0]:
@@ -30,25 +15,18 @@
     return _GetPath(ctx, ctx.attr.includes[0])
   return _GetPath(ctx, ctx.label.package + '/' + ctx.attr.includes[0])
 
-def _CcHdrs(srcs, use_grpc_plugin=False):
-  ret = [s[:-len(".proto")] + ".pb.h" for s in srcs]
-  if use_grpc_plugin:
-    ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs]
-  return ret
-
-def _CcSrcs(srcs, use_grpc_plugin=False):
-  ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs]
-  if use_grpc_plugin:
-    ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
-  return ret
-
 def _CcOuts(srcs, use_grpc_plugin=False):
-  return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin)
+  ret = [s[:-len(".proto")] + ".pb.h" for s in srcs] + \
+        [s[:-len(".proto")] + ".pb.cc" for s in srcs]
+  if use_grpc_plugin:
+    ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs] + \
+           [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
+  return ret
 
 def _PyOuts(srcs):
   return [s[:-len(".proto")] + "_pb2.py" for s in srcs]
 
-def _RelativeOutputPath(path, include, dest=""):
+def _RelativeOutputPath(path, include):
   if include == None:
     return path
 
@@ -57,21 +35,25 @@
 
   if include and include[-1] != '/':
     include = include + '/'
-  if dest and dest[-1] != '/':
-    dest = dest + '/'
 
   path = path[len(include):]
-  return dest + path
+
+  if not path.startswith(PACKAGE_NAME):
+    fail("The package %s is not within the path %s" % (PACKAGE_NAME, path))
+
+  if not PACKAGE_NAME:
+    return path
+
+  return path[len(PACKAGE_NAME)+1:]
 
 def _proto_gen_impl(ctx):
   """General implementation for generating protos"""
   srcs = ctx.files.srcs
   deps = []
   deps += ctx.files.srcs
-  source_dir = _SourceDir(ctx)
   gen_dir = _GenDir(ctx)
-  if source_dir:
-    import_flags = ["-I" + source_dir, "-I" + gen_dir]
+  if gen_dir:
+    import_flags = ["-I" + gen_dir]
   else:
     import_flags = ["-I."]
 
@@ -81,34 +63,20 @@
 
   args = []
   if ctx.attr.gen_cc:
-    args += ["--cpp_out=" + gen_dir]
+    args += ["--cpp_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
   if ctx.attr.gen_py:
-    args += ["--python_out=" + gen_dir]
+    args += ["--python_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
 
-  inputs = srcs + deps
-  if ctx.executable.plugin:
-    plugin = ctx.executable.plugin
-    lang = ctx.attr.plugin_language
-    if not lang and plugin.basename.startswith('protoc-gen-'):
-      lang = plugin.basename[len('protoc-gen-'):]
-    if not lang:
-      fail("cannot infer the target language of plugin", "plugin_language")
-
-    outdir = gen_dir
-    if ctx.attr.plugin_options:
-      outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir
-    args += ["--plugin=protoc-gen-%s=%s" % (lang, plugin.path)]
-    args += ["--%s_out=%s" % (lang, outdir)]
-    inputs += [plugin]
+  if ctx.executable.grpc_cpp_plugin:
+    args += ["--plugin=protoc-gen-grpc=" + ctx.executable.grpc_cpp_plugin.path]
+    args += ["--grpc_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
 
   if args:
     ctx.action(
-        inputs=inputs,
+        inputs=srcs + deps,
         outputs=ctx.outputs.outs,
         arguments=args + import_flags + [s.path for s in srcs],
         executable=ctx.executable.protoc,
-        mnemonic="ProtoCompile",
-        use_default_shell_env=True,
     )
 
   return struct(
@@ -119,24 +87,22 @@
       ),
   )
 
-proto_gen = rule(
+_proto_gen = rule(
     attrs = {
         "srcs": attr.label_list(allow_files = True),
         "deps": attr.label_list(providers = ["proto"]),
         "includes": attr.string_list(),
         "protoc": attr.label(
-            cfg = "host",
+            cfg = HOST_CFG,
             executable = True,
             single_file = True,
             mandatory = True,
         ),
-        "plugin": attr.label(
-            cfg = "host",
-            allow_files = True,
+        "grpc_cpp_plugin": attr.label(
+            cfg = HOST_CFG,
             executable = True,
+            single_file = True,
         ),
-        "plugin_language": attr.string(),
-        "plugin_options": attr.string_list(),
         "gen_cc": attr.bool(),
         "gen_py": attr.bool(),
         "outs": attr.output_list(),
@@ -144,26 +110,6 @@
     output_to_genfiles = True,
     implementation = _proto_gen_impl,
 )
-"""Generates codes from Protocol Buffers definitions.
-
-This rule helps you to implement Skylark macros specific to the target
-language. You should prefer more specific `cc_proto_library `,
-`py_proto_library` and others unless you are adding such wrapper macros.
-
-Args:
-  srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
-    against.
-  deps: a list of dependency labels; must be other proto libraries.
-  includes: a list of include paths to .proto files.
-  protoc: the label of the protocol compiler to generate the sources.
-  plugin: the label of the protocol compiler plugin to be passed to the protocol
-    compiler.
-  plugin_language: the language of the generated sources
-  plugin_options: a list of options to be passed to the plugin
-  gen_cc: generates C++ sources in addition to the ones from the plugin.
-  gen_py: generates Python sources in addition to the ones from the plugin.
-  outs: a list of labels of the expected outputs from the protocol compiler.
-"""
 
 def cc_proto_library(
         name,
@@ -209,7 +155,7 @@
   if internal_bootstrap_hack:
     # For pre-checked-in generated files, we add the internal_bootstrap_hack
     # which will skip the codegen action.
-    proto_gen(
+    _proto_gen(
         name=name + "_genproto",
         srcs=srcs,
         deps=[s + "_genproto" for s in deps],
@@ -227,36 +173,33 @@
   if use_grpc_plugin:
     grpc_cpp_plugin = "//external:grpc_cpp_plugin"
 
-  gen_srcs = _CcSrcs(srcs, use_grpc_plugin)
-  gen_hdrs = _CcHdrs(srcs, use_grpc_plugin)
-  outs = gen_srcs + gen_hdrs
+  outs = _CcOuts(srcs, use_grpc_plugin)
 
-  proto_gen(
+  _proto_gen(
       name=name + "_genproto",
       srcs=srcs,
       deps=[s + "_genproto" for s in deps],
       includes=includes,
       protoc=protoc,
-      plugin=grpc_cpp_plugin,
-      plugin_language="grpc",
+      grpc_cpp_plugin=grpc_cpp_plugin,
       gen_cc=1,
       outs=outs,
       visibility=["//visibility:public"],
   )
 
   if default_runtime and not default_runtime in cc_libs:
-    cc_libs = cc_libs + [default_runtime]
+    cc_libs += [default_runtime]
   if use_grpc_plugin:
-    cc_libs = cc_libs + ["//external:grpc_lib"]
+    cc_libs += ["//external:grpc_lib"]
 
   native.cc_library(
       name=name,
-      srcs=gen_srcs,
-      hdrs=gen_hdrs,
+      srcs=outs,
       deps=cc_libs + deps,
       includes=includes,
       **kargs)
 
+
 def internal_gen_well_known_protos_java(srcs):
   """Bazel rule to generate the gen_well_known_protos_java genrule
 
@@ -264,11 +207,10 @@
     srcs: the well known protos
   """
   root = Label("%s//protobuf_java" % (REPOSITORY_NAME)).workspace_root
-  pkg = PACKAGE_NAME + "/" if PACKAGE_NAME else ""
   if root == "":
-    include = " -I%ssrc " % pkg
+    include = " -Isrc "
   else:
-    include = " -I%s/%ssrc " % (root, pkg)
+    include = " -I%s/src " % root
   native.genrule(
     name = "gen_well_known_protos_java",
     srcs = srcs,
@@ -281,34 +223,6 @@
     tools = [":protoc"],
   )
 
-def internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs):
-  """Macro to copy files to a different directory and then create a filegroup.
-
-  This is used by the //:protobuf_python py_proto_library target to work around
-  an issue caused by Python source files that are part of the same Python
-  package being in separate directories.
-
-  Args:
-    srcs: The source files to copy and add to the filegroup.
-    strip_prefix: Path to the root of the files to copy.
-    dest: The directory to copy the source files into.
-    **kwargs: extra arguments that will be passesd to the filegroup.
-  """
-  outs = [_RelativeOutputPath(s, strip_prefix, dest) for s in srcs]
-
-  native.genrule(
-      name = name + "_genrule",
-      srcs = srcs,
-      outs = outs,
-      cmd = " && ".join(
-          ["cp $(location %s) $(location %s)" %
-           (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]),
-  )
-
-  native.filegroup(
-      name = name,
-      srcs = outs,
-      **kwargs)
 
 def py_proto_library(
         name,
@@ -319,7 +233,6 @@
         include=None,
         default_runtime="//:protobuf_python",
         protoc="//:protoc",
-        use_grpc_plugin=False,
         **kargs):
   """Bazel rule to create a Python protobuf library from proto source files
 
@@ -339,8 +252,6 @@
     default_runtime: the implicitly default runtime which will be depended on by
         the generated py_library target.
     protoc: the label of the protocol compiler to generate the sources.
-    use_grpc_plugin: a flag to indicate whether to call the Python C++ plugin
-        when processing the proto files.
     **kargs: other keyword arguments that are passed to cc_library.
 
   """
@@ -350,14 +261,7 @@
   if include != None:
     includes = [include]
 
-  grpc_python_plugin = None
-  if use_grpc_plugin:
-    grpc_python_plugin = "//external:grpc_python_plugin"
-    # Note: Generated grpc code depends on Python grpc module. This dependency
-    # is not explicitly listed in py_libs. Instead, host system is assumed to
-    # have grpc installed.
-
-  proto_gen(
+  _proto_gen(
       name=name + "_genproto",
       srcs=srcs,
       deps=[s + "_genproto" for s in deps],
@@ -366,12 +270,10 @@
       gen_py=1,
       outs=outs,
       visibility=["//visibility:public"],
-      plugin=grpc_python_plugin,
-      plugin_language="grpc"
   )
 
   if default_runtime and not default_runtime in py_libs + deps:
-    py_libs = py_libs + [default_runtime]
+    py_libs += [default_runtime]
 
   native.py_library(
       name=name,
diff --git a/protoc-artifacts/Dockerfile b/protoc-artifacts/Dockerfile
index 43e6863..fd35b89 100644
--- a/protoc-artifacts/Dockerfile
+++ b/protoc-artifacts/Dockerfile
@@ -15,23 +15,22 @@
 
 # Install Java 8
 RUN wget -q --no-cookies --no-check-certificate \
-    --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \
-    "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz" \
+    --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz" \
     -O - | tar xz -C /var/local
-ENV JAVA_HOME /var/local/jdk1.8.0_131
+ENV JAVA_HOME /var/local/jdk1.8.0_45
 ENV PATH $JAVA_HOME/bin:$PATH
 
 # Install Maven
-RUN wget -q http://apache.cs.utah.edu/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O - | \
+RUN wget -q http://apache.cs.utah.edu/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz -O - | \
     tar xz -C /var/local
-ENV PATH /var/local/apache-maven-3.3.9/bin:$PATH
+ENV PATH /var/local/apache-maven-3.3.3/bin:$PATH
 
 # Install GCC 4.7 to support -static-libstdc++
 RUN wget http://people.centos.org/tru/devtools-1.1/devtools-1.1.repo -P /etc/yum.repos.d
 RUN bash -c 'echo "enabled=1" >> /etc/yum.repos.d/devtools-1.1.repo'
 RUN bash -c "sed -e 's/\$basearch/i386/g' /etc/yum.repos.d/devtools-1.1.repo > /etc/yum.repos.d/devtools-i386-1.1.repo"
 RUN sed -e 's/testing-/testing-i386-/g' -i /etc/yum.repos.d/devtools-i386-1.1.repo
-RUN rpm --rebuilddb && yum install -y devtoolset-1.1 \
+RUN yum install -y devtoolset-1.1 \
                    devtoolset-1.1-libstdc++-devel \
                    devtoolset-1.1-libstdc++-devel.i686
 
diff --git a/protoc-artifacts/README.md b/protoc-artifacts/README.md
index fc8ef58..4320f65 100644
--- a/protoc-artifacts/README.md
+++ b/protoc-artifacts/README.md
@@ -22,17 +22,6 @@
 Cygwin or MinGW for Windows. Please see ``README.md`` of the Protobuf project
 for how to set up the build environment.
 
-## Building from a freshly checked-out source
-
-If you just checked out the Protobuf source from github, you need to
-generate the configure script.
-
-Under the protobuf project directory:
-
-```
-$ ./autogen.sh && ./configure && make
-```
-
 ## To install artifacts locally
 The following command will install the ``protoc`` artifact to your local Maven repository.
 ```
@@ -54,7 +43,7 @@
 - ``os.detected.name``: ``linux``, ``osx``, ``windows``.
 - ``os.detected.arch``: ``x86_32``, ``x86_64``
 
-For example, MinGW32 only ships with 32-bit compilers, but you can still build
+For example, MingGW32 only ships with 32-bit compilers, but you can still build
 32-bit protoc under 64-bit Windows, with the following command:
 ```
 $ mvn install -Dos.detected.arch=x86_32
@@ -70,15 +59,10 @@
 deployment for all platforms. Currently the following platforms are supported:
 - Linux (x86_32 and x86_64)
 - Windows (x86_32 and x86_64) with
-  - Cygwin64 with MinGW compilers (x86_64)
-  - MSYS with MinGW32 (x86_32)
-  - Cross compile in Linux with MinGW-w64 (x86_32, x86_64)
+ - Cygwin with MinGW compilers (both x86_32 and x86_64)
+ - MSYS with MinGW32 (x86_32 only)
 - MacOSX (x86_32 and x86_64)
 
-As for MSYS2/MinGW64 for Windows: protoc will build, but it insists on
-adding a dependency of `libwinpthread-1.dll`, which isn't shipped with
-Windows.
-
 Use the following command to deploy artifacts for the host platform to a
 staging repository.
 ```
@@ -99,32 +83,10 @@
 A 32-bit artifact can be deployed from a 64-bit host with
 ``-Dos.detected.arch=x86_32``
 
-A windows artifact can be deployed from a linux machine with
-``-Dos.detected.name=windows``
-
 When you have done deployment for all platforms, go to
 https://oss.sonatype.org/#stagingRepositories, verify that the staging
 repository has all the binaries, close and release this repository.
 
-## Upload zip packages to github release page.
-After uploading protoc artifacts to Maven Central repository, run the
-build-zip.sh script to bulid zip packages for these protoc binaries
-and upload these zip packages to the download section of the github
-release. For example:
-```
-$ ./build-zip.sh 3.0.0-beta-4
-```
-The above command will create 5 zip files:
-```
-dist/protoc-3.0.0-beta-4-win32.zip
-dist/protoc-3.0.0-beta-4-osx-x86_32.zip
-dist/protoc-3.0.0-beta-4-osx-x86_64.zip
-dist/protoc-3.0.0-beta-4-linux-x86_32.zip
-dist/protoc-3.0.0-beta-4-linux-x86_64.zip
-```
-Before running the script, make sure the artifacts are accessible from:
-http://repo1.maven.org/maven2/com/google/protobuf/protoc/
-
 ### Tips for deploying on Linux
 We build on Centos 6.6 to provide a good compatibility for not very new
 systems. We have provided a ``Dockerfile`` under this directory to build the
@@ -151,7 +113,7 @@
 <settings>
   <servers>
     <server>
-      <id>sonatype-nexus-staging</id>
+      <id>ossrh</id>
       <username>[username]</username>
       <password>[password]</password>
     </server>
@@ -174,11 +136,8 @@
 ### Tested build environments
 We have successfully built artifacts on the following environments:
 - Linux x86_32 and x86_64:
-  - Centos 6.6 (within Docker 1.6.1)
-  - Ubuntu 14.04.2 64-bit
-- Linux aarch_64: Cross compiled with `g++-aarch64-linux-gnu` on Ubuntu 14.04.2 64-bit
+ - Centos 6.6 (within Docker 1.6.1)
+ - Ubuntu 14.04.2 64-bit
 - Windows x86_32: MSYS with ``mingw32-gcc-g++ 4.8.1-4`` on Windows 7 64-bit
-- Windows x86_32: Cross compile with ``i686-w64-mingw32-g++ 4.8.2`` on Ubuntu 14.04.2 64-bit
 - Windows x86_64: Cygwin64 with ``mingw64-x86_64-gcc-g++ 4.8.3-1`` on Windows 7 64-bit
-- Windows x86_64: Cross compile with ``x86_64-w64-mingw32-g++ 4.8.2`` on Ubuntu 14.04.2 64-bit
 - Mac OS X x86_32 and x86_64: Mac OS X 10.9.5
diff --git a/protoc-artifacts/build-protoc.sh b/protoc-artifacts/build-protoc.sh
index fe1dec2..88e6ae5 100755
--- a/protoc-artifacts/build-protoc.sh
+++ b/protoc-artifacts/build-protoc.sh
@@ -1,36 +1,17 @@
 #!/bin/bash
 
-# Builds protoc executable into target/protoc.exe; optionally build protoc
-# plugins into target/protoc-gen-*.exe
+# Builds protoc executable into target/protoc.exe
 # To be run from Maven.
-# Usage: build-protoc.sh <OS> <ARCH> <TARGET>
+# Usage: build-protoc.sh <OS> <ARCH>
 # <OS> and <ARCH> are ${os.detected.name} and ${os.detected.arch} from os-maven-plugin
-# <TARGET> can be "protoc" or "protoc-gen-javalite"
-#
-# The script now supports cross-compiling windows and linux-arm64 in linux-x86
-# environment. Required packages:
-# - Windows: i686-w64-mingw32-gcc (32bit) and x86_64-w64-mingw32-gcc (64bit)
-# - Arm64: g++-aarch64-linux-gnu
-
 OS=$1
 ARCH=$2
-MAKE_TARGET=$3
 
-if [[ $# < 3 ]]; then
+if [[ $# < 2 ]]; then
   echo "No arguments provided. This script is intended to be run from Maven."
   exit 1
 fi
 
-case $MAKE_TARGET in
-  protoc-gen-javalite)
-    ;;
-  protoc)
-    ;;
-  *)
-    echo "Target ""$TARGET"" invalid."
-    exit 1
-esac
-
 # Under Cygwin, bash doesn't have these in PATH when called from Maven which
 # runs in Windows version of Java.
 export PATH="/bin:/usr/bin:$PATH"
@@ -79,8 +60,6 @@
         assertEq $format "elf32-i386" $LINENO
       elif [[ "$ARCH" == x86_64 ]]; then
         assertEq $format "elf64-x86-64" $LINENO
-      elif [[ "$ARCH" == aarch_64 ]]; then
-        assertEq $format "elf64-little" $LINENO
       else
         fail "Unsupported arch: $ARCH"
       fi
@@ -124,9 +103,6 @@
       white_list="linux-gate\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux\.so\.2"
     elif [[ "$ARCH" == x86_64 ]]; then
       white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-x86-64\.so\.2"
-    elif [[ "$ARCH" == aarch_64 ]]; then
-      dump_cmd='objdump -p '"$1"' | grep NEEDED'
-      white_list="libpthread\.so\.0\|libc\.so\.6\|ld-linux-aarch64\.so\.1"
     fi
   elif [[ "$OS" == osx ]]; then
     dump_cmd='otool -L '"$1"' | fgrep dylib'
@@ -150,7 +126,7 @@
 }
 ############################################################################
 
-echo "Building protoc, OS=$OS ARCH=$ARCH TARGET=$TARGET"
+echo "Building protoc, OS=$OS ARCH=$ARCH"
 
 # Nested double quotes are unintuitive, but it works.
 cd "$(dirname "$0")"
@@ -158,7 +134,7 @@
 WORKING_DIR=$(pwd)
 CONFIGURE_ARGS="--disable-shared"
 
-TARGET_FILE=target/$MAKE_TARGET.exe
+MAKE_TARGET="protoc"
 if [[ "$OS" == windows ]]; then
   MAKE_TARGET="${MAKE_TARGET}.exe"
 fi
@@ -191,13 +167,13 @@
       CXXFLAGS="$CXXFLAGS -m64"
     elif [[ "$ARCH" == x86_32 ]]; then
       CXXFLAGS="$CXXFLAGS -m32"
-    elif [[ "$ARCH" == aarch_64 ]]; then
-      CONFIGURE_ARGS="$CONFIGURE_ARGS --host=aarch64-linux-gnu"
     else
       fail "Unsupported arch: $ARCH"
     fi
   elif [[ "$OS" == windows ]]; then
     # Cross-compilation for Windows
+    # TODO(zhangkun83) MinGW 64 always adds dependency on libwinpthread-1.dll,
+    # which is undesirable for repository deployment.
     CONFIGURE_ARGS="$CONFIGURE_ARGS"
     if [[ "$ARCH" == x86_64 ]]; then
       CONFIGURE_ARGS="$CONFIGURE_ARGS --host=x86_64-w64-mingw32"
@@ -226,20 +202,19 @@
 
 # Statically link libgcc and libstdc++.
 # -s to produce stripped binary.
-if [[ "$OS" == windows ]]; then
-  # Also static link libpthread required by mingw64
-  LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -s"
-elif [[ "$OS" != osx ]]; then
-  # And they don't work under Mac.
+# And they don't work under Mac.
+if [[ "$OS" != osx ]]; then
   LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -s"
 fi
 
 export CXXFLAGS LDFLAGS
 
+TARGET_FILE=target/protoc.exe
+
 cd "$WORKING_DIR"/.. && ./configure $CONFIGURE_ARGS &&
   cd src && make clean && make $MAKE_TARGET &&
   cd "$WORKING_DIR" && mkdir -p target &&
-  cp ../src/$MAKE_TARGET $TARGET_FILE ||
+  (cp ../src/protoc $TARGET_FILE || cp ../src/protoc.exe $TARGET_FILE) ||
   exit 1
 
 if [[ "$OS" == osx ]]; then
diff --git a/protoc-artifacts/build-zip.sh b/protoc-artifacts/build-zip.sh
deleted file mode 100755
index f08e275..0000000
--- a/protoc-artifacts/build-zip.sh
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-
-if [ $# -ne 2 ]; then
-  cat <<EOF
-Usage: $0 <TARGET> <VERSION_NUMBER>
-
-TARGET: protoc | protoc-gen-javalite
-
-Example:
-  $ $0 protoc 3.0.0
-  $ $0 protoc-gen-javalite 3.0.0
-
-This script will download pre-built protoc or protoc plugin binaries from maven
-repository and create .zip packages suitable to be included in the github
-release page. If the target is protoc, well-known type .proto files will also be
-included. Each invocation will create 6 zip packages:
-  dist/<TARGET>-<VERSION_NUMBER>-win32.zip
-  dist/<TARGET>-<VERSION_NUMBER>-osx-x86_32.zip
-  dist/<TARGET>-<VERSION_NUMBER>-osx-x86_64.zip
-  dist/<TARGET>-<VERSION_NUMBER>-linux-x86_32.zip
-  dist/<TARGET>-<VERSION_NUMBER>-linux-x86_64.zip
-  dist/<TARGET>-<VERSION_NUMBER>-linux-aarch_64.zip
-EOF
-  exit 1
-fi
-
-TARGET=$1
-VERSION_NUMBER=$2
-
-# <zip file name> <binary file name> pairs.
-declare -a FILE_NAMES=( \
-  win32.zip windows-x86_32.exe \
-  osx-x86_32.zip osx-x86_32.exe \
-  osx-x86_64.zip osx-x86_64.exe \
-  linux-x86_32.zip linux-x86_32.exe \
-  linux-x86_64.zip linux-x86_64.exe \
-  linux-aarch_64.zip linux-aarch_64.exe \
-)
-
-# List of all well-known types to be included.
-declare -a WELL_KNOWN_TYPES=(           \
-  google/protobuf/descriptor.proto      \
-  google/protobuf/any.proto             \
-  google/protobuf/api.proto             \
-  google/protobuf/duration.proto        \
-  google/protobuf/empty.proto           \
-  google/protobuf/field_mask.proto      \
-  google/protobuf/source_context.proto  \
-  google/protobuf/struct.proto          \
-  google/protobuf/timestamp.proto       \
-  google/protobuf/type.proto            \
-  google/protobuf/wrappers.proto        \
-  google/protobuf/compiler/plugin.proto \
-)
-
-set -e
-
-# A temporary working directory to put all files.
-DIR=$(mktemp -d)
-
-# Copy over well-known types.
-mkdir -p ${DIR}/include/google/protobuf/compiler
-for PROTO in ${WELL_KNOWN_TYPES[@]}; do
-  cp -f ../src/${PROTO} ${DIR}/include/${PROTO}
-done
-
-# Create a readme file.
-cat <<EOF > ${DIR}/readme.txt
-Protocol Buffers - Google's data interchange format
-Copyright 2008 Google Inc.
-https://developers.google.com/protocol-buffers/
-
-This package contains a precompiled binary version of the protocol buffer
-compiler (protoc). This binary is intended for users who want to use Protocol
-Buffers in languages other than C++ but do not want to compile protoc
-themselves. To install, simply place this binary somewhere in your PATH.
-
-If you intend to use the included well known types then don't forget to
-copy the contents of the 'include' directory somewhere as well, for example
-into '/usr/local/include/'.
-
-Please refer to our official github site for more installation instructions:
-  https://github.com/google/protobuf
-EOF
-
-mkdir -p dist
-mkdir -p ${DIR}/bin
-# Create a zip file for each binary.
-for((i=0;i<${#FILE_NAMES[@]};i+=2));do
-  ZIP_NAME=${FILE_NAMES[$i]}
-  if [ ${ZIP_NAME:0:3} = "win" ]; then
-    BINARY="$TARGET.exe"
-  else
-    BINARY="$TARGET"
-  fi
-  BINARY_NAME=${FILE_NAMES[$(($i+1))]}
-  BINARY_URL=http://repo1.maven.org/maven2/com/google/protobuf/$TARGET/${VERSION_NUMBER}/$TARGET-${VERSION_NUMBER}-${BINARY_NAME}
-  if ! wget ${BINARY_URL} -O ${DIR}/bin/$BINARY &> /dev/null; then
-    echo "[ERROR] Failed to download ${BINARY_URL}" >&2
-    echo "[ERROR] Skipped $TARGET-${VERSION_NAME}-${ZIP_NAME}" >&2
-    continue
-  fi
-  TARGET_ZIP_FILE=`pwd`/dist/$TARGET-${VERSION_NUMBER}-${ZIP_NAME}
-  pushd $DIR &> /dev/null
-  chmod +x bin/$BINARY
-  if [ "$TARGET" = "protoc" ]; then
-    zip -r ${TARGET_ZIP_FILE} include bin readme.txt &> /dev/null
-  else
-    zip -r ${TARGET_ZIP_FILE} bin &> /dev/null
-  fi
-  rm  bin/$BINARY
-  popd &> /dev/null
-  echo "[INFO] Successfully created ${TARGET_ZIP_FILE}"
-done
diff --git a/protoc-artifacts/pom.xml b/protoc-artifacts/pom.xml
index 72f28d1..e9728a0 100644
--- a/protoc-artifacts/pom.xml
+++ b/protoc-artifacts/pom.xml
@@ -10,7 +10,7 @@
   </parent>
   <groupId>com.google.protobuf</groupId>
   <artifactId>protoc</artifactId>
-  <version>3.5.2</version>
+  <version>3.0.0-beta-2</version>
   <packaging>pom</packaging>
   <name>Protobuf Compiler</name>
   <description>
@@ -21,8 +21,8 @@
   <url>https://developers.google.com/protocol-buffers/</url>
   <licenses>
     <license>
-      <name>3-Clause BSD License</name>
-      <url>https://opensource.org/licenses/BSD-3-Clause</url>
+      <name>New BSD license</name>
+      <url>http://www.opensource.org/licenses/bsd-license.php</url>
       <distribution>repo</distribution>
     </license>
   </licenses>
@@ -59,7 +59,6 @@
             <argument>build-protoc.sh</argument>
             <argument>${os.detected.name}</argument>
             <argument>${os.detected.arch}</argument>
-            <argument>protoc</argument>
           </arguments>
         </configuration>
       </plugin>
diff --git a/python/README.md b/python/README.md
index 4c19429..57acfd9 100644
--- a/python/README.md
+++ b/python/README.md
@@ -32,84 +32,77 @@
 
 1) Make sure you have Python 2.6 or newer.  If in doubt, run:
 
-       $ python -V
+     $ python -V
 
 2) If you do not have setuptools installed, note that it will be
-   downloaded and installed automatically as soon as you run `setup.py`.
+   downloaded and installed automatically as soon as you run setup.py.
    If you would rather install it manually, you may do so by following
-   the instructions on [this page](https://packaging.python.org/en/latest/installing.html#setup-for-installing-packages).
+   the instructions on this page:
 
-3) Build the C++ code, or install a binary distribution of `protoc`.  If
+     https://packaging.python.org/en/latest/installing.html#setup-for-installing-packages
+
+3) Build the C++ code, or install a binary distribution of protoc.  If
    you install a binary distribution, make sure that it is the same
    version as this package.  If in doubt, run:
 
-       $ protoc --version
+     $ protoc --version
 
 4) Build and run the tests:
 
-       $ python setup.py build
-       $ python setup.py test
+     $ python setup.py build
+     $ python setup.py test
 
-   To build, test, and use the C++ implementation, you must first compile
-   `libprotobuf.so`:
+     To build, test, and use the C++ implementation, you must first compile
+     libprotobuf.so:
 
-       $ (cd .. && make)
+     $ (cd .. && make)
 
-   On OS X:
+     On OS X:
 
-   If you are running a Homebrew-provided Python, you must make sure another
-   version of protobuf is not already installed, as Homebrew's Python will
-   search `/usr/local/lib` for `libprotobuf.so` before it searches
-   `../src/.libs`.
+      If you are running a homebrew-provided python, you must make sure another
+      version of protobuf is not already installed, as homebrew's python will
+      search /usr/local/lib for libprotobuf.so before it searches ../src/.libs
+      You can either unlink homebrew's protobuf or install the libprotobuf you
+      built earlier:
 
-   You can either unlink Homebrew's protobuf or install the `libprotobuf` you
-   built earlier:
+      $ brew unlink protobuf
+      or
+      $ (cd .. && make install)
 
-       $ brew unlink protobuf
+     On other *nix:
 
-   or
+      You must make libprotobuf.so dynamically available. You can either
+      install libprotobuf you built earlier, or set LD_LIBRARY_PATH:
 
-       $ (cd .. && make install)
+      $ export LD_LIBRARY_PATH=../src/.libs
+      or
+      $ (cd .. && make install)
 
-    On other *nix:
+     To build the C++ implementation run:
+     $ python setup.py build --cpp_implementation
 
-    You must make `libprotobuf.so` dynamically available. You can either
-    install libprotobuf you built earlier, or set `LD_LIBRARY_PATH`:
-
-       $ export LD_LIBRARY_PATH=../src/.libs
-
-    or
-
-       $ (cd .. && make install)
-
-   To build the C++ implementation run:
-
-       $ python setup.py build --cpp_implementation
-
-   Then run the tests like so:
-
-       $ python setup.py test --cpp_implementation
+     Then run the tests like so:
+     $ python setup.py test --cpp_implementation
 
    If some tests fail, this library may not work correctly on your
    system.  Continue at your own risk.
 
    Please note that there is a known problem with some versions of
    Python on Cygwin which causes the tests to fail after printing the
-   error:  `sem_init: Resource temporarily unavailable`.  This appears
-   to be a [bug either in Cygwin or in
-   Python](http://www.cygwin.com/ml/cygwin/2005-07/msg01378.html).
-
-   We do not know if or when it might be fixed.  We also do not know
+   error:  "sem_init: Resource temporarily unavailable".  This appears
+   to be a bug either in Cygwin or in Python:
+     http://www.cygwin.com/ml/cygwin/2005-07/msg01378.html
+   We do not know if or when it might me fixed.  We also do not know
    how likely it is that this bug will affect users in practice.
 
 5) Install:
 
-       $ python setup.py install
+    $ python setup.py install
 
-   or:
+  or:
 
-       $ (cd .. && make install)
-       $ python setup.py install --cpp_implementation
+    $ (cd .. && make install)
+    $ python setup.py install --cpp_implementation
 
    This step may require superuser privileges.
    NOTE: To use C++ implementation, you need to export an environment
diff --git a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/factory_test1.proto b/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/factory_test1.proto
deleted file mode 100644
index 9f55e03..0000000
--- a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/factory_test1.proto
+++ /dev/null
@@ -1,55 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: matthewtoia@google.com (Matt Toia)
-
-
-package google.protobuf.python.internal;
-
-
-enum Factory1Enum {
-  FACTORY_1_VALUE_0 = 0;
-  FACTORY_1_VALUE_1 = 1;
-}
-
-message Factory1Message {
-  optional Factory1Enum factory_1_enum = 1;
-  enum NestedFactory1Enum {
-    NESTED_FACTORY_1_VALUE_0 = 0;
-    NESTED_FACTORY_1_VALUE_1 = 1;
-  }
-  optional NestedFactory1Enum nested_factory_1_enum = 2;
-  message NestedFactory1Message {
-    optional string value = 1;
-  }
-  optional NestedFactory1Message nested_factory_1_message = 3;
-  optional int32 scalar_value = 4;
-  repeated string list_value = 5;
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/factory_test2.proto b/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/factory_test2.proto
deleted file mode 100644
index d3ce4d7..0000000
--- a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/factory_test2.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: matthewtoia@google.com (Matt Toia)
-
-
-package google.protobuf.python.internal;
-
-import "google/protobuf/internal/factory_test1.proto";
-
-
-enum Factory2Enum {
-  FACTORY_2_VALUE_0 = 0;
-  FACTORY_2_VALUE_1 = 1;
-}
-
-message Factory2Message {
-  required int32 mandatory = 1;
-  optional Factory2Enum factory_2_enum = 2;
-  enum NestedFactory2Enum {
-    NESTED_FACTORY_2_VALUE_0 = 0;
-    NESTED_FACTORY_2_VALUE_1 = 1;
-  }
-  optional NestedFactory2Enum nested_factory_2_enum = 3;
-  message NestedFactory2Message {
-    optional string value = 1;
-  }
-  optional NestedFactory2Message nested_factory_2_message = 4;
-  optional Factory1Message factory_1_message = 5;
-  optional Factory1Enum factory_1_enum = 6;
-  optional Factory1Message.NestedFactory1Enum nested_factory_1_enum = 7;
-  optional Factory1Message.NestedFactory1Message nested_factory_1_message = 8;
-  optional Factory2Message circular_message = 9;
-  optional string scalar_value = 10;
-  repeated string list_value = 11;
-  repeated group Grouped = 12 {
-    optional string part_1 = 13;
-    optional string part_2 = 14;
-  }
-  optional LoopMessage loop = 15;
-  optional int32 int_with_default = 16 [default = 1776];
-  optional double double_with_default = 17 [default = 9.99];
-  optional string string_with_default = 18 [default = "hello world"];
-  optional bool bool_with_default = 19 [default = false];
-  optional Factory2Enum enum_with_default = 20 [default = FACTORY_2_VALUE_1];
-}
-
-message LoopMessage {
-  optional Factory2Message loop = 1;
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_extensions.proto b/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_extensions.proto
deleted file mode 100644
index e2d9701..0000000
--- a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_extensions.proto
+++ /dev/null
@@ -1,58 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: robinson@google.com (Will Robinson)
-
-
-package google.protobuf.internal;
-
-
-message TopLevelMessage {
-  optional ExtendedMessage submessage = 1;
-}
-
-
-message ExtendedMessage {
-  extensions 1 to max;
-}
-
-
-message ForeignMessage {
-  optional int32 foreign_message_int = 1;
-}
-
-
-extend ExtendedMessage {
-  optional int32 optional_int_extension = 1;
-  optional ForeignMessage optional_message_extension = 2;
-
-  repeated int32 repeated_int_extension = 3;
-  repeated ForeignMessage repeated_message_extension = 4;
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_extensions_dynamic.proto b/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_extensions_dynamic.proto
deleted file mode 100644
index df98ac4..0000000
--- a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_extensions_dynamic.proto
+++ /dev/null
@@ -1,49 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: jasonh@google.com (Jason Hsueh)
-//
-// This file is used to test a corner case in the CPP implementation where the
-// generated C++ type is available for the extendee, but the extension is
-// defined in a file whose C++ type is not in the binary.
-
-
-import "google/protobuf/internal/more_extensions.proto";
-
-package google.protobuf.internal;
-
-message DynamicMessageType {
-  optional int32 a = 1;
-}
-
-extend ExtendedMessage {
-  optional int32 dynamic_int32_extension = 100;
-  optional DynamicMessageType dynamic_message_extension = 101;
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_messages.proto b/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_messages.proto
deleted file mode 100644
index c701b44..0000000
--- a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/more_messages.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: robinson@google.com (Will Robinson)
-
-
-package google.protobuf.internal;
-
-// A message where tag numbers are listed out of order, to allow us to test our
-// canonicalization of serialized output, which should always be in tag order.
-// We also mix in some extensions for extra fun.
-message OutOfOrderFields {
-  optional   sint32 optional_sint32   =  5;
-  extensions 4 to 4;
-  optional   uint32 optional_uint32   =  3;
-  extensions 2 to 2;
-  optional    int32 optional_int32    =  1;
-};
-
-
-extend OutOfOrderFields {
-  optional   uint64 optional_uint64   =  4;
-  optional    int64 optional_int64    =  2;
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/test_bad_identifiers.proto b/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/test_bad_identifiers.proto
deleted file mode 100644
index 6a82299..0000000
--- a/python/compatibility_tests/v2.5.0/protos/python/google/protobuf/internal/test_bad_identifiers.proto
+++ /dev/null
@@ -1,52 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-
-
-package protobuf_unittest;
-
-option py_generic_services = true;
-
-message TestBadIdentifiers {
-  extensions 100 to max;
-}
-
-// Make sure these reasonable extension names don't conflict with internal
-// variables.
-extend TestBadIdentifiers {
-  optional string message = 100 [default="foo"];
-  optional string descriptor = 101 [default="bar"];
-  optional string reflection = 102 [default="baz"];
-  optional string service = 103 [default="qux"];
-}
-
-message AnotherMessage {}
-service AnotherService {}
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/descriptor.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/descriptor.proto
deleted file mode 100644
index a785f79..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/descriptor.proto
+++ /dev/null
@@ -1,620 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// The messages in this file describe the definitions found in .proto files.
-// A valid .proto file can be translated directly to a FileDescriptorProto
-// without any other information (e.g. without reading its imports).
-
-
-
-package google.protobuf;
-option java_package = "com.google.protobuf";
-option java_outer_classname = "DescriptorProtos";
-
-// descriptor.proto must be optimized for speed because reflection-based
-// algorithms don't work during bootstrapping.
-option optimize_for = SPEED;
-
-// The protocol compiler can output a FileDescriptorSet containing the .proto
-// files it parses.
-message FileDescriptorSet {
-  repeated FileDescriptorProto file = 1;
-}
-
-// Describes a complete .proto file.
-message FileDescriptorProto {
-  optional string name = 1;       // file name, relative to root of source tree
-  optional string package = 2;    // e.g. "foo", "foo.bar", etc.
-
-  // Names of files imported by this file.
-  repeated string dependency = 3;
-  // Indexes of the public imported files in the dependency list above.
-  repeated int32 public_dependency = 10;
-  // Indexes of the weak imported files in the dependency list.
-  // For Google-internal migration only. Do not use.
-  repeated int32 weak_dependency = 11;
-
-  // All top-level definitions in this file.
-  repeated DescriptorProto message_type = 4;
-  repeated EnumDescriptorProto enum_type = 5;
-  repeated ServiceDescriptorProto service = 6;
-  repeated FieldDescriptorProto extension = 7;
-
-  optional FileOptions options = 8;
-
-  // This field contains optional information about the original source code.
-  // You may safely remove this entire field whithout harming runtime
-  // functionality of the descriptors -- the information is needed only by
-  // development tools.
-  optional SourceCodeInfo source_code_info = 9;
-}
-
-// Describes a message type.
-message DescriptorProto {
-  optional string name = 1;
-
-  repeated FieldDescriptorProto field = 2;
-  repeated FieldDescriptorProto extension = 6;
-
-  repeated DescriptorProto nested_type = 3;
-  repeated EnumDescriptorProto enum_type = 4;
-
-  message ExtensionRange {
-    optional int32 start = 1;
-    optional int32 end = 2;
-  }
-  repeated ExtensionRange extension_range = 5;
-
-  optional MessageOptions options = 7;
-}
-
-// Describes a field within a message.
-message FieldDescriptorProto {
-  enum Type {
-    // 0 is reserved for errors.
-    // Order is weird for historical reasons.
-    TYPE_DOUBLE         = 1;
-    TYPE_FLOAT          = 2;
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-    // negative values are likely.
-    TYPE_INT64          = 3;
-    TYPE_UINT64         = 4;
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-    // negative values are likely.
-    TYPE_INT32          = 5;
-    TYPE_FIXED64        = 6;
-    TYPE_FIXED32        = 7;
-    TYPE_BOOL           = 8;
-    TYPE_STRING         = 9;
-    TYPE_GROUP          = 10;  // Tag-delimited aggregate.
-    TYPE_MESSAGE        = 11;  // Length-delimited aggregate.
-
-    // New in version 2.
-    TYPE_BYTES          = 12;
-    TYPE_UINT32         = 13;
-    TYPE_ENUM           = 14;
-    TYPE_SFIXED32       = 15;
-    TYPE_SFIXED64       = 16;
-    TYPE_SINT32         = 17;  // Uses ZigZag encoding.
-    TYPE_SINT64         = 18;  // Uses ZigZag encoding.
-  };
-
-  enum Label {
-    // 0 is reserved for errors
-    LABEL_OPTIONAL      = 1;
-    LABEL_REQUIRED      = 2;
-    LABEL_REPEATED      = 3;
-    // TODO(sanjay): Should we add LABEL_MAP?
-  };
-
-  optional string name = 1;
-  optional int32 number = 3;
-  optional Label label = 4;
-
-  // If type_name is set, this need not be set.  If both this and type_name
-  // are set, this must be either TYPE_ENUM or TYPE_MESSAGE.
-  optional Type type = 5;
-
-  // For message and enum types, this is the name of the type.  If the name
-  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-  // rules are used to find the type (i.e. first the nested types within this
-  // message are searched, then within the parent, on up to the root
-  // namespace).
-  optional string type_name = 6;
-
-  // For extensions, this is the name of the type being extended.  It is
-  // resolved in the same manner as type_name.
-  optional string extendee = 2;
-
-  // For numeric types, contains the original text representation of the value.
-  // For booleans, "true" or "false".
-  // For strings, contains the default text contents (not escaped in any way).
-  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-  // TODO(kenton):  Base-64 encode?
-  optional string default_value = 7;
-
-  optional FieldOptions options = 8;
-}
-
-// Describes an enum type.
-message EnumDescriptorProto {
-  optional string name = 1;
-
-  repeated EnumValueDescriptorProto value = 2;
-
-  optional EnumOptions options = 3;
-}
-
-// Describes a value within an enum.
-message EnumValueDescriptorProto {
-  optional string name = 1;
-  optional int32 number = 2;
-
-  optional EnumValueOptions options = 3;
-}
-
-// Describes a service.
-message ServiceDescriptorProto {
-  optional string name = 1;
-  repeated MethodDescriptorProto method = 2;
-
-  optional ServiceOptions options = 3;
-}
-
-// Describes a method of a service.
-message MethodDescriptorProto {
-  optional string name = 1;
-
-  // Input and output type names.  These are resolved in the same way as
-  // FieldDescriptorProto.type_name, but must refer to a message type.
-  optional string input_type = 2;
-  optional string output_type = 3;
-
-  optional MethodOptions options = 4;
-}
-
-
-// ===================================================================
-// Options
-
-// Each of the definitions above may have "options" attached.  These are
-// just annotations which may cause code to be generated slightly differently
-// or may contain hints for code that manipulates protocol messages.
-//
-// Clients may define custom options as extensions of the *Options messages.
-// These extensions may not yet be known at parsing time, so the parser cannot
-// store the values in them.  Instead it stores them in a field in the *Options
-// message called uninterpreted_option. This field must have the same name
-// across all *Options messages. We then use this field to populate the
-// extensions when we build a descriptor, at which point all protos have been
-// parsed and so all extensions are known.
-//
-// Extension numbers for custom options may be chosen as follows:
-// * For options which will only be used within a single application or
-//   organization, or for experimental options, use field numbers 50000
-//   through 99999.  It is up to you to ensure that you do not use the
-//   same number for multiple options.
-// * For options which will be published and used publicly by multiple
-//   independent entities, e-mail protobuf-global-extension-registry@google.com
-//   to reserve extension numbers. Simply provide your project name (e.g.
-//   Object-C plugin) and your porject website (if available) -- there's no need
-//   to explain how you intend to use them. Usually you only need one extension
-//   number. You can declare multiple options with only one extension number by
-//   putting them in a sub-message. See the Custom Options section of the docs
-//   for examples:
-//   http://code.google.com/apis/protocolbuffers/docs/proto.html#options
-//   If this turns out to be popular, a web service will be set up
-//   to automatically assign option numbers.
-
-
-message FileOptions {
-
-  // Sets the Java package where classes generated from this .proto will be
-  // placed.  By default, the proto package is used, but this is often
-  // inappropriate because proto packages do not normally start with backwards
-  // domain names.
-  optional string java_package = 1;
-
-
-  // If set, all the classes from the .proto file are wrapped in a single
-  // outer class with the given name.  This applies to both Proto1
-  // (equivalent to the old "--one_java_file" option) and Proto2 (where
-  // a .proto always translates to a single class, but you may want to
-  // explicitly choose the class name).
-  optional string java_outer_classname = 8;
-
-  // If set true, then the Java code generator will generate a separate .java
-  // file for each top-level message, enum, and service defined in the .proto
-  // file.  Thus, these types will *not* be nested inside the outer class
-  // named by java_outer_classname.  However, the outer class will still be
-  // generated to contain the file's getDescriptor() method as well as any
-  // top-level extensions defined in the file.
-  optional bool java_multiple_files = 10 [default=false];
-
-  // If set true, then the Java code generator will generate equals() and
-  // hashCode() methods for all messages defined in the .proto file. This is
-  // purely a speed optimization, as the AbstractMessage base class includes
-  // reflection-based implementations of these methods.
-  optional bool java_generate_equals_and_hash = 20 [default=false];
-
-  // Generated classes can be optimized for speed or code size.
-  enum OptimizeMode {
-    SPEED = 1;        // Generate complete code for parsing, serialization,
-                      // etc.
-    CODE_SIZE = 2;    // Use ReflectionOps to implement these methods.
-    LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
-  }
-  optional OptimizeMode optimize_for = 9 [default=SPEED];
-
-  // Sets the Go package where structs generated from this .proto will be
-  // placed.  There is no default.
-  optional string go_package = 11;
-
-
-
-  // Should generic services be generated in each language?  "Generic" services
-  // are not specific to any particular RPC system.  They are generated by the
-  // main code generators in each language (without additional plugins).
-  // Generic services were the only kind of service generation supported by
-  // early versions of proto2.
-  //
-  // Generic services are now considered deprecated in favor of using plugins
-  // that generate code specific to your particular RPC system.  Therefore,
-  // these default to false.  Old code which depends on generic services should
-  // explicitly set them to true.
-  optional bool cc_generic_services = 16 [default=false];
-  optional bool java_generic_services = 17 [default=false];
-  optional bool py_generic_services = 18 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message MessageOptions {
-  // Set true to use the old proto1 MessageSet wire format for extensions.
-  // This is provided for backwards-compatibility with the MessageSet wire
-  // format.  You should not use this for any other reason:  It's less
-  // efficient, has fewer features, and is more complicated.
-  //
-  // The message must be defined exactly as follows:
-  //   message Foo {
-  //     option message_set_wire_format = true;
-  //     extensions 4 to max;
-  //   }
-  // Note that the message cannot have any defined fields; MessageSets only
-  // have extensions.
-  //
-  // All extensions of your type must be singular messages; e.g. they cannot
-  // be int32s, enums, or repeated messages.
-  //
-  // Because this is an option, the above two restrictions are not enforced by
-  // the protocol compiler.
-  optional bool message_set_wire_format = 1 [default=false];
-
-  // Disables the generation of the standard "descriptor()" accessor, which can
-  // conflict with a field of the same name.  This is meant to make migration
-  // from proto1 easier; new code should avoid fields named "descriptor".
-  optional bool no_standard_descriptor_accessor = 2 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message FieldOptions {
-  // The ctype option instructs the C++ code generator to use a different
-  // representation of the field than it normally would.  See the specific
-  // options below.  This option is not yet implemented in the open source
-  // release -- sorry, we'll try to include it in a future version!
-  optional CType ctype = 1 [default = STRING];
-  enum CType {
-    // Default mode.
-    STRING = 0;
-
-    CORD = 1;
-
-    STRING_PIECE = 2;
-  }
-  // The packed option can be enabled for repeated primitive fields to enable
-  // a more efficient representation on the wire. Rather than repeatedly
-  // writing the tag and type for each element, the entire array is encoded as
-  // a single length-delimited blob.
-  optional bool packed = 2;
-
-
-
-  // Should this field be parsed lazily?  Lazy applies only to message-type
-  // fields.  It means that when the outer message is initially parsed, the
-  // inner message's contents will not be parsed but instead stored in encoded
-  // form.  The inner message will actually be parsed when it is first accessed.
-  //
-  // This is only a hint.  Implementations are free to choose whether to use
-  // eager or lazy parsing regardless of the value of this option.  However,
-  // setting this option true suggests that the protocol author believes that
-  // using lazy parsing on this field is worth the additional bookkeeping
-  // overhead typically needed to implement it.
-  //
-  // This option does not affect the public interface of any generated code;
-  // all method signatures remain the same.  Furthermore, thread-safety of the
-  // interface is not affected by this option; const methods remain safe to
-  // call from multiple threads concurrently, while non-const methods continue
-  // to require exclusive access.
-  //
-  //
-  // Note that implementations may choose not to check required fields within
-  // a lazy sub-message.  That is, calling IsInitialized() on the outher message
-  // may return true even if the inner message has missing required fields.
-  // This is necessary because otherwise the inner message would have to be
-  // parsed in order to perform the check, defeating the purpose of lazy
-  // parsing.  An implementation which chooses not to check required fields
-  // must be consistent about it.  That is, for any particular sub-message, the
-  // implementation must either *always* check its required fields, or *never*
-  // check its required fields, regardless of whether or not the message has
-  // been parsed.
-  optional bool lazy = 5 [default=false];
-
-  // Is this field deprecated?
-  // Depending on the target platform, this can emit Deprecated annotations
-  // for accessors, or it will be completely ignored; in the very least, this
-  // is a formalization for deprecating fields.
-  optional bool deprecated = 3 [default=false];
-
-  // EXPERIMENTAL.  DO NOT USE.
-  // For "map" fields, the name of the field in the enclosed type that
-  // is the key for this map.  For example, suppose we have:
-  //   message Item {
-  //     required string name = 1;
-  //     required string value = 2;
-  //   }
-  //   message Config {
-  //     repeated Item items = 1 [experimental_map_key="name"];
-  //   }
-  // In this situation, the map key for Item will be set to "name".
-  // TODO: Fully-implement this, then remove the "experimental_" prefix.
-  optional string experimental_map_key = 9;
-
-  // For Google-internal migration only. Do not use.
-  optional bool weak = 10 [default=false];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message EnumOptions {
-
-  // Set this option to false to disallow mapping different tag names to a same
-  // value.
-  optional bool allow_alias = 2 [default=true];
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message EnumValueOptions {
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message ServiceOptions {
-
-  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-  //   framework.  We apologize for hoarding these numbers to ourselves, but
-  //   we were already using them long before we decided to release Protocol
-  //   Buffers.
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-message MethodOptions {
-
-  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-  //   framework.  We apologize for hoarding these numbers to ourselves, but
-  //   we were already using them long before we decided to release Protocol
-  //   Buffers.
-
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
-
-// A message representing a option the parser does not recognize. This only
-// appears in options protos created by the compiler::Parser class.
-// DescriptorPool resolves these when building Descriptor objects. Therefore,
-// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-// in them.
-message UninterpretedOption {
-  // The name of the uninterpreted option.  Each string represents a segment in
-  // a dot-separated name.  is_extension is true iff a segment represents an
-  // extension (denoted with parentheses in options specs in .proto files).
-  // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
-  // "foo.(bar.baz).qux".
-  message NamePart {
-    required string name_part = 1;
-    required bool is_extension = 2;
-  }
-  repeated NamePart name = 2;
-
-  // The value of the uninterpreted option, in whatever type the tokenizer
-  // identified it as during parsing. Exactly one of these should be set.
-  optional string identifier_value = 3;
-  optional uint64 positive_int_value = 4;
-  optional int64 negative_int_value = 5;
-  optional double double_value = 6;
-  optional bytes string_value = 7;
-  optional string aggregate_value = 8;
-}
-
-// ===================================================================
-// Optional source code info
-
-// Encapsulates information about the original source file from which a
-// FileDescriptorProto was generated.
-message SourceCodeInfo {
-  // A Location identifies a piece of source code in a .proto file which
-  // corresponds to a particular definition.  This information is intended
-  // to be useful to IDEs, code indexers, documentation generators, and similar
-  // tools.
-  //
-  // For example, say we have a file like:
-  //   message Foo {
-  //     optional string foo = 1;
-  //   }
-  // Let's look at just the field definition:
-  //   optional string foo = 1;
-  //   ^       ^^     ^^  ^  ^^^
-  //   a       bc     de  f  ghi
-  // We have the following locations:
-  //   span   path               represents
-  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-  //
-  // Notes:
-  // - A location may refer to a repeated field itself (i.e. not to any
-  //   particular index within it).  This is used whenever a set of elements are
-  //   logically enclosed in a single code segment.  For example, an entire
-  //   extend block (possibly containing multiple extension definitions) will
-  //   have an outer location whose path refers to the "extensions" repeated
-  //   field without an index.
-  // - Multiple locations may have the same path.  This happens when a single
-  //   logical declaration is spread out across multiple places.  The most
-  //   obvious example is the "extend" block again -- there may be multiple
-  //   extend blocks in the same scope, each of which will have the same path.
-  // - A location's span is not always a subset of its parent's span.  For
-  //   example, the "extendee" of an extension declaration appears at the
-  //   beginning of the "extend" block and is shared by all extensions within
-  //   the block.
-  // - Just because a location's span is a subset of some other location's span
-  //   does not mean that it is a descendent.  For example, a "group" defines
-  //   both a type and a field in a single declaration.  Thus, the locations
-  //   corresponding to the type and field and their components will overlap.
-  // - Code which tries to interpret locations should probably be designed to
-  //   ignore those that it doesn't understand, as more types of locations could
-  //   be recorded in the future.
-  repeated Location location = 1;
-  message Location {
-    // Identifies which part of the FileDescriptorProto was defined at this
-    // location.
-    //
-    // Each element is a field number or an index.  They form a path from
-    // the root FileDescriptorProto to the place where the definition.  For
-    // example, this path:
-    //   [ 4, 3, 2, 7, 1 ]
-    // refers to:
-    //   file.message_type(3)  // 4, 3
-    //       .field(7)         // 2, 7
-    //       .name()           // 1
-    // This is because FileDescriptorProto.message_type has field number 4:
-    //   repeated DescriptorProto message_type = 4;
-    // and DescriptorProto.field has field number 2:
-    //   repeated FieldDescriptorProto field = 2;
-    // and FieldDescriptorProto.name has field number 1:
-    //   optional string name = 1;
-    //
-    // Thus, the above path gives the location of a field name.  If we removed
-    // the last element:
-    //   [ 4, 3, 2, 7 ]
-    // this path refers to the whole field declaration (from the beginning
-    // of the label to the terminating semicolon).
-    repeated int32 path = 1 [packed=true];
-
-    // Always has exactly three or four elements: start line, start column,
-    // end line (optional, otherwise assumed same as start line), end column.
-    // These are packed into a single field for efficiency.  Note that line
-    // and column numbers are zero-based -- typically you will want to add
-    // 1 to each before displaying to a user.
-    repeated int32 span = 2 [packed=true];
-
-    // If this SourceCodeInfo represents a complete declaration, these are any
-    // comments appearing before and after the declaration which appear to be
-    // attached to the declaration.
-    //
-    // A series of line comments appearing on consecutive lines, with no other
-    // tokens appearing on those lines, will be treated as a single comment.
-    //
-    // Only the comment content is provided; comment markers (e.g. //) are
-    // stripped out.  For block comments, leading whitespace and an asterisk
-    // will be stripped from the beginning of each line other than the first.
-    // Newlines are included in the output.
-    //
-    // Examples:
-    //
-    //   optional int32 foo = 1;  // Comment attached to foo.
-    //   // Comment attached to bar.
-    //   optional int32 bar = 2;
-    //
-    //   optional string baz = 3;
-    //   // Comment attached to baz.
-    //   // Another line attached to baz.
-    //
-    //   // Comment attached to qux.
-    //   //
-    //   // Another line attached to qux.
-    //   optional double qux = 4;
-    //
-    //   optional string corge = 5;
-    //   /* Block comment attached
-    //    * to corge.  Leading asterisks
-    //    * will be removed. */
-    //   /* Block comment attached to
-    //    * grault. */
-    //   optional int32 grault = 6;
-    optional string leading_comments = 3;
-    optional string trailing_comments = 4;
-  }
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest.proto
deleted file mode 100644
index 6eb2d86..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest.proto
+++ /dev/null
@@ -1,719 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;     // auto-added
-
-import "google/protobuf/unittest_import.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestProto";
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-message TestAllTypes {
-  message NestedMessage {
-    // The field name "b" fails to compile in proto1 because it conflicts with
-    // a local variable named "b" in one of the generated methods.  Doh.
-    // This file needs to compile in proto1 to test backwards-compatibility.
-    optional int32 bb = 1;
-  }
-
-  enum NestedEnum {
-    FOO = 1;
-    BAR = 2;
-    BAZ = 3;
-  }
-
-  // Singular
-  optional    int32 optional_int32    =  1;
-  optional    int64 optional_int64    =  2;
-  optional   uint32 optional_uint32   =  3;
-  optional   uint64 optional_uint64   =  4;
-  optional   sint32 optional_sint32   =  5;
-  optional   sint64 optional_sint64   =  6;
-  optional  fixed32 optional_fixed32  =  7;
-  optional  fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional    float optional_float    = 11;
-  optional   double optional_double   = 12;
-  optional     bool optional_bool     = 13;
-  optional   string optional_string   = 14;
-  optional    bytes optional_bytes    = 15;
-
-  optional group OptionalGroup = 16 {
-    optional int32 a = 17;
-  }
-
-  optional NestedMessage                        optional_nested_message  = 18;
-  optional ForeignMessage                       optional_foreign_message = 19;
-  optional protobuf_unittest_import.ImportMessage optional_import_message  = 20;
-
-  optional NestedEnum                           optional_nested_enum     = 21;
-  optional ForeignEnum                          optional_foreign_enum    = 22;
-  optional protobuf_unittest_import.ImportEnum    optional_import_enum     = 23;
-
-  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
-  optional string optional_cord = 25 [ctype=CORD];
-
-  // Defined in unittest_import_public.proto
-  optional protobuf_unittest_import.PublicImportMessage
-      optional_public_import_message = 26;
-
-  optional NestedMessage optional_lazy_message = 27 [lazy=true];
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated group RepeatedGroup = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated NestedMessage                        repeated_nested_message  = 48;
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
-
-  repeated NestedEnum                           repeated_nested_enum     = 51;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32    = 61 [default =  41    ];
-  optional    int64 default_int64    = 62 [default =  42    ];
-  optional   uint32 default_uint32   = 63 [default =  43    ];
-  optional   uint64 default_uint64   = 64 [default =  44    ];
-  optional   sint32 default_sint32   = 65 [default = -45    ];
-  optional   sint64 default_sint64   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
-  optional    float default_float    = 71 [default =  51.5  ];
-  optional   double default_double   = 72 [default =  52e3  ];
-  optional     bool default_bool     = 73 [default = true   ];
-  optional   string default_string   = 74 [default = "hello"];
-  optional    bytes default_bytes    = 75 [default = "world"];
-
-  optional NestedEnum  default_nested_enum  = 81 [default = BAR        ];
-  optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
-  optional protobuf_unittest_import.ImportEnum
-      default_import_enum = 83 [default = IMPORT_BAR];
-
-  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
-  optional string default_cord = 85 [ctype=CORD,default="123"];
-}
-
-message TestDeprecatedFields {
-  optional int32 deprecated_int32 = 1 [deprecated=true];
-}
-
-// Define these after TestAllTypes to make sure the compiler can handle
-// that.
-message ForeignMessage {
-  optional int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
-}
-
-message TestAllExtensions {
-  extensions 1 to max;
-}
-
-extend TestAllExtensions {
-  // Singular
-  optional    int32 optional_int32_extension    =  1;
-  optional    int64 optional_int64_extension    =  2;
-  optional   uint32 optional_uint32_extension   =  3;
-  optional   uint64 optional_uint64_extension   =  4;
-  optional   sint32 optional_sint32_extension   =  5;
-  optional   sint64 optional_sint64_extension   =  6;
-  optional  fixed32 optional_fixed32_extension  =  7;
-  optional  fixed64 optional_fixed64_extension  =  8;
-  optional sfixed32 optional_sfixed32_extension =  9;
-  optional sfixed64 optional_sfixed64_extension = 10;
-  optional    float optional_float_extension    = 11;
-  optional   double optional_double_extension   = 12;
-  optional     bool optional_bool_extension     = 13;
-  optional   string optional_string_extension   = 14;
-  optional    bytes optional_bytes_extension    = 15;
-
-  optional group OptionalGroup_extension = 16 {
-    optional int32 a = 17;
-  }
-
-  optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;
-  optional ForeignMessage optional_foreign_message_extension = 19;
-  optional protobuf_unittest_import.ImportMessage
-    optional_import_message_extension = 20;
-
-  optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;
-  optional ForeignEnum optional_foreign_enum_extension = 22;
-  optional protobuf_unittest_import.ImportEnum
-    optional_import_enum_extension = 23;
-
-  optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];
-  optional string optional_cord_extension = 25 [ctype=CORD];
-
-  optional protobuf_unittest_import.PublicImportMessage
-    optional_public_import_message_extension = 26;
-
-  optional TestAllTypes.NestedMessage
-    optional_lazy_message_extension = 27 [lazy=true];
-
-  // Repeated
-  repeated    int32 repeated_int32_extension    = 31;
-  repeated    int64 repeated_int64_extension    = 32;
-  repeated   uint32 repeated_uint32_extension   = 33;
-  repeated   uint64 repeated_uint64_extension   = 34;
-  repeated   sint32 repeated_sint32_extension   = 35;
-  repeated   sint64 repeated_sint64_extension   = 36;
-  repeated  fixed32 repeated_fixed32_extension  = 37;
-  repeated  fixed64 repeated_fixed64_extension  = 38;
-  repeated sfixed32 repeated_sfixed32_extension = 39;
-  repeated sfixed64 repeated_sfixed64_extension = 40;
-  repeated    float repeated_float_extension    = 41;
-  repeated   double repeated_double_extension   = 42;
-  repeated     bool repeated_bool_extension     = 43;
-  repeated   string repeated_string_extension   = 44;
-  repeated    bytes repeated_bytes_extension    = 45;
-
-  repeated group RepeatedGroup_extension = 46 {
-    optional int32 a = 47;
-  }
-
-  repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;
-  repeated ForeignMessage repeated_foreign_message_extension = 49;
-  repeated protobuf_unittest_import.ImportMessage
-    repeated_import_message_extension = 50;
-
-  repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;
-  repeated ForeignEnum repeated_foreign_enum_extension = 52;
-  repeated protobuf_unittest_import.ImportEnum
-    repeated_import_enum_extension = 53;
-
-  repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord_extension = 55 [ctype=CORD];
-
-  repeated TestAllTypes.NestedMessage
-    repeated_lazy_message_extension = 57 [lazy=true];
-
-  // Singular with defaults
-  optional    int32 default_int32_extension    = 61 [default =  41    ];
-  optional    int64 default_int64_extension    = 62 [default =  42    ];
-  optional   uint32 default_uint32_extension   = 63 [default =  43    ];
-  optional   uint64 default_uint64_extension   = 64 [default =  44    ];
-  optional   sint32 default_sint32_extension   = 65 [default = -45    ];
-  optional   sint64 default_sint64_extension   = 66 [default =  46    ];
-  optional  fixed32 default_fixed32_extension  = 67 [default =  47    ];
-  optional  fixed64 default_fixed64_extension  = 68 [default =  48    ];
-  optional sfixed32 default_sfixed32_extension = 69 [default =  49    ];
-  optional sfixed64 default_sfixed64_extension = 70 [default = -50    ];
-  optional    float default_float_extension    = 71 [default =  51.5  ];
-  optional   double default_double_extension   = 72 [default =  52e3  ];
-  optional     bool default_bool_extension     = 73 [default = true   ];
-  optional   string default_string_extension   = 74 [default = "hello"];
-  optional    bytes default_bytes_extension    = 75 [default = "world"];
-
-  optional TestAllTypes.NestedEnum
-    default_nested_enum_extension = 81 [default = BAR];
-  optional ForeignEnum
-    default_foreign_enum_extension = 82 [default = FOREIGN_BAR];
-  optional protobuf_unittest_import.ImportEnum
-    default_import_enum_extension = 83 [default = IMPORT_BAR];
-
-  optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,
-                                                       default="abc"];
-  optional string default_cord_extension = 85 [ctype=CORD, default="123"];
-}
-
-message TestNestedExtension {
-  extend TestAllExtensions {
-    // Check for bug where string extensions declared in tested scope did not
-    // compile.
-    optional string test = 1002 [default="test"];
-  }
-}
-
-// We have separate messages for testing required fields because it's
-// annoying to have to fill in required fields in TestProto in order to
-// do anything with it.  Note that we don't need to test every type of
-// required filed because the code output is basically identical to
-// optional fields for all types.
-message TestRequired {
-  required int32 a = 1;
-  optional int32 dummy2 = 2;
-  required int32 b = 3;
-
-  extend TestAllExtensions {
-    optional TestRequired single = 1000;
-    repeated TestRequired multi  = 1001;
-  }
-
-  // Pad the field count to 32 so that we can test that IsInitialized()
-  // properly checks multiple elements of has_bits_.
-  optional int32 dummy4  =  4;
-  optional int32 dummy5  =  5;
-  optional int32 dummy6  =  6;
-  optional int32 dummy7  =  7;
-  optional int32 dummy8  =  8;
-  optional int32 dummy9  =  9;
-  optional int32 dummy10 = 10;
-  optional int32 dummy11 = 11;
-  optional int32 dummy12 = 12;
-  optional int32 dummy13 = 13;
-  optional int32 dummy14 = 14;
-  optional int32 dummy15 = 15;
-  optional int32 dummy16 = 16;
-  optional int32 dummy17 = 17;
-  optional int32 dummy18 = 18;
-  optional int32 dummy19 = 19;
-  optional int32 dummy20 = 20;
-  optional int32 dummy21 = 21;
-  optional int32 dummy22 = 22;
-  optional int32 dummy23 = 23;
-  optional int32 dummy24 = 24;
-  optional int32 dummy25 = 25;
-  optional int32 dummy26 = 26;
-  optional int32 dummy27 = 27;
-  optional int32 dummy28 = 28;
-  optional int32 dummy29 = 29;
-  optional int32 dummy30 = 30;
-  optional int32 dummy31 = 31;
-  optional int32 dummy32 = 32;
-
-  required int32 c = 33;
-}
-
-message TestRequiredForeign {
-  optional TestRequired optional_message = 1;
-  repeated TestRequired repeated_message = 2;
-  optional int32 dummy = 3;
-}
-
-// Test that we can use NestedMessage from outside TestAllTypes.
-message TestForeignNested {
-  optional TestAllTypes.NestedMessage foreign_nested = 1;
-}
-
-// TestEmptyMessage is used to test unknown field support.
-message TestEmptyMessage {
-}
-
-// Like above, but declare all field numbers as potential extensions.  No
-// actual extensions should ever be defined for this type.
-message TestEmptyMessageWithExtensions {
-  extensions 1 to max;
-}
-
-message TestMultipleExtensionRanges {
-  extensions 42;
-  extensions 4143 to 4243;
-  extensions 65536 to max;
-}
-
-// Test that really large tag numbers don't break anything.
-message TestReallyLargeTagNumber {
-  // The largest possible tag number is 2^28 - 1, since the wire format uses
-  // three bits to communicate wire type.
-  optional int32 a = 1;
-  optional int32 bb = 268435455;
-}
-
-message TestRecursiveMessage {
-  optional TestRecursiveMessage a = 1;
-  optional int32 i = 2;
-}
-
-// Test that mutual recursion works.
-message TestMutualRecursionA {
-  optional TestMutualRecursionB bb = 1;
-}
-
-message TestMutualRecursionB {
-  optional TestMutualRecursionA a = 1;
-  optional int32 optional_int32 = 2;
-}
-
-// Test that groups have disjoint field numbers from their siblings and
-// parents.  This is NOT possible in proto1; only proto2.  When attempting
-// to compile with proto1, this will emit an error; so we only include it
-// in protobuf_unittest_proto.
-message TestDupFieldNumber {                        // NO_PROTO1
-  optional int32 a = 1;                             // NO_PROTO1
-  optional group Foo = 2 { optional int32 a = 1; }  // NO_PROTO1
-  optional group Bar = 3 { optional int32 a = 1; }  // NO_PROTO1
-}                                                   // NO_PROTO1
-
-// Additional messages for testing lazy fields.
-message TestEagerMessage {
-  optional TestAllTypes sub_message = 1 [lazy=false];
-}
-message TestLazyMessage {
-  optional TestAllTypes sub_message = 1 [lazy=true];
-}
-
-// Needed for a Python test.
-message TestNestedMessageHasBits {
-  message NestedMessage {
-    repeated int32 nestedmessage_repeated_int32 = 1;
-    repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2;
-  }
-  optional NestedMessage optional_nested_message = 1;
-}
-
-
-// Test an enum that has multiple values with the same number.
-enum TestEnumWithDupValue {
-  option allow_alias = true;
-  FOO1 = 1;
-  BAR1 = 2;
-  BAZ = 3;
-  FOO2 = 1;
-  BAR2 = 2;
-}
-
-// Test an enum with large, unordered values.
-enum TestSparseEnum {
-  SPARSE_A = 123;
-  SPARSE_B = 62374;
-  SPARSE_C = 12589234;
-  SPARSE_D = -15;
-  SPARSE_E = -53452;
-  SPARSE_F = 0;
-  SPARSE_G = 2;
-}
-
-// Test message with CamelCase field names.  This violates Protocol Buffer
-// standard style.
-message TestCamelCaseFieldNames {
-  optional int32 PrimitiveField = 1;
-  optional string StringField = 2;
-  optional ForeignEnum EnumField = 3;
-  optional ForeignMessage MessageField = 4;
-  optional string StringPieceField = 5 [ctype=STRING_PIECE];
-  optional string CordField = 6 [ctype=CORD];
-
-  repeated int32 RepeatedPrimitiveField = 7;
-  repeated string RepeatedStringField = 8;
-  repeated ForeignEnum RepeatedEnumField = 9;
-  repeated ForeignMessage RepeatedMessageField = 10;
-  repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];
-  repeated string RepeatedCordField = 12 [ctype=CORD];
-}
-
-
-// We list fields out of order, to ensure that we're using field number and not
-// field index to determine serialization order.
-message TestFieldOrderings {
-  optional string my_string = 11;
-  extensions 2 to 10;
-  optional int64 my_int = 1;
-  extensions 12 to 100;
-  optional float my_float = 101;
-}
-
-
-extend TestFieldOrderings {
-  optional string my_extension_string = 50;
-  optional int32 my_extension_int = 5;
-}
-
-
-message TestExtremeDefaultValues {
-  optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"];
-  optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF];
-  optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF];
-  optional  int32 small_int32  = 4 [default = -0x7FFFFFFF];
-  optional  int64 small_int64  = 5 [default = -0x7FFFFFFFFFFFFFFF];
-  optional  int32 really_small_int32 = 21 [default = -0x80000000];
-  optional  int64 really_small_int64 = 22 [default = -0x8000000000000000];
-
-  // The default value here is UTF-8 for "\u1234".  (We could also just type
-  // the UTF-8 text directly into this text file rather than escape it, but
-  // lots of people use editors that would be confused by this.)
-  optional string utf8_string = 6 [default = "\341\210\264"];
-
-  // Tests for single-precision floating-point values.
-  optional float zero_float = 7 [default = 0];
-  optional float one_float = 8 [default = 1];
-  optional float small_float = 9 [default = 1.5];
-  optional float negative_one_float = 10 [default = -1];
-  optional float negative_float = 11 [default = -1.5];
-  // Using exponents
-  optional float large_float = 12 [default = 2E8];
-  optional float small_negative_float = 13 [default = -8e-28];
-
-  // Text for nonfinite floating-point values.
-  optional double inf_double = 14 [default = inf];
-  optional double neg_inf_double = 15 [default = -inf];
-  optional double nan_double = 16 [default = nan];
-  optional float inf_float = 17 [default = inf];
-  optional float neg_inf_float = 18 [default = -inf];
-  optional float nan_float = 19 [default = nan];
-
-  // Tests for C++ trigraphs.
-  // Trigraphs should be escaped in C++ generated files, but they should not be
-  // escaped for other languages.
-  // Note that in .proto file, "\?" is a valid way to escape ? in string
-  // literals.
-  optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"];
-
-  // String defaults containing the character '\000'
-  optional string string_with_zero       = 23 [default = "hel\000lo"];
-  optional  bytes bytes_with_zero        = 24 [default = "wor\000ld"];
-  optional string string_piece_with_zero = 25 [ctype=STRING_PIECE,
-                                               default="ab\000c"];
-  optional string cord_with_zero         = 26 [ctype=CORD,
-                                               default="12\0003"];
-}
-
-message SparseEnumMessage {
-  optional TestSparseEnum sparse_enum = 1;
-}
-
-// Test String and Bytes: string is for valid UTF-8 strings
-message OneString {
-  optional string data = 1;
-}
-
-message MoreString {
-  repeated string data = 1;
-}
-
-message OneBytes {
-  optional bytes data = 1;
-}
-
-message MoreBytes {
-  repeated bytes data = 1;
-}
-
-
-// Test messages for packed fields
-
-message TestPackedTypes {
-  repeated    int32 packed_int32    =  90 [packed = true];
-  repeated    int64 packed_int64    =  91 [packed = true];
-  repeated   uint32 packed_uint32   =  92 [packed = true];
-  repeated   uint64 packed_uint64   =  93 [packed = true];
-  repeated   sint32 packed_sint32   =  94 [packed = true];
-  repeated   sint64 packed_sint64   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
-  repeated    float packed_float    = 100 [packed = true];
-  repeated   double packed_double   = 101 [packed = true];
-  repeated     bool packed_bool     = 102 [packed = true];
-  repeated ForeignEnum packed_enum  = 103 [packed = true];
-}
-
-// A message with the same fields as TestPackedTypes, but without packing. Used
-// to test packed <-> unpacked wire compatibility.
-message TestUnpackedTypes {
-  repeated    int32 unpacked_int32    =  90 [packed = false];
-  repeated    int64 unpacked_int64    =  91 [packed = false];
-  repeated   uint32 unpacked_uint32   =  92 [packed = false];
-  repeated   uint64 unpacked_uint64   =  93 [packed = false];
-  repeated   sint32 unpacked_sint32   =  94 [packed = false];
-  repeated   sint64 unpacked_sint64   =  95 [packed = false];
-  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
-  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
-  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
-  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
-  repeated    float unpacked_float    = 100 [packed = false];
-  repeated   double unpacked_double   = 101 [packed = false];
-  repeated     bool unpacked_bool     = 102 [packed = false];
-  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
-}
-
-message TestPackedExtensions {
-  extensions 1 to max;
-}
-
-extend TestPackedExtensions {
-  repeated    int32 packed_int32_extension    =  90 [packed = true];
-  repeated    int64 packed_int64_extension    =  91 [packed = true];
-  repeated   uint32 packed_uint32_extension   =  92 [packed = true];
-  repeated   uint64 packed_uint64_extension   =  93 [packed = true];
-  repeated   sint32 packed_sint32_extension   =  94 [packed = true];
-  repeated   sint64 packed_sint64_extension   =  95 [packed = true];
-  repeated  fixed32 packed_fixed32_extension  =  96 [packed = true];
-  repeated  fixed64 packed_fixed64_extension  =  97 [packed = true];
-  repeated sfixed32 packed_sfixed32_extension =  98 [packed = true];
-  repeated sfixed64 packed_sfixed64_extension =  99 [packed = true];
-  repeated    float packed_float_extension    = 100 [packed = true];
-  repeated   double packed_double_extension   = 101 [packed = true];
-  repeated     bool packed_bool_extension     = 102 [packed = true];
-  repeated ForeignEnum packed_enum_extension  = 103 [packed = true];
-}
-
-// Used by ExtensionSetTest/DynamicExtensions.  The test actually builds
-// a set of extensions to TestAllExtensions dynamically, based on the fields
-// of this message type.
-message TestDynamicExtensions {
-  enum DynamicEnumType {
-    DYNAMIC_FOO = 2200;
-    DYNAMIC_BAR = 2201;
-    DYNAMIC_BAZ = 2202;
-  }
-  message DynamicMessageType {
-    optional int32 dynamic_field = 2100;
-  }
-
-  optional fixed32 scalar_extension = 2000;
-  optional ForeignEnum enum_extension = 2001;
-  optional DynamicEnumType dynamic_enum_extension = 2002;
-
-  optional ForeignMessage message_extension = 2003;
-  optional DynamicMessageType dynamic_message_extension = 2004;
-
-  repeated string repeated_extension = 2005;
-  repeated sint32 packed_extension = 2006 [packed = true];
-}
-
-message TestRepeatedScalarDifferentTagSizes {
-  // Parsing repeated fixed size values used to fail. This message needs to be
-  // used in order to get a tag of the right size; all of the repeated fields
-  // in TestAllTypes didn't trigger the check.
-  repeated fixed32 repeated_fixed32 = 12;
-  // Check for a varint type, just for good measure.
-  repeated int32   repeated_int32   = 13;
-
-  // These have two-byte tags.
-  repeated fixed64 repeated_fixed64 = 2046;
-  repeated int64   repeated_int64   = 2047;
-
-  // Three byte tags.
-  repeated float   repeated_float   = 262142;
-  repeated uint64  repeated_uint64  = 262143;
-}
-
-// Test that if an optional or required message/group field appears multiple
-// times in the input, they need to be merged.
-message TestParsingMerge {
-  // RepeatedFieldsGenerator defines matching field types as TestParsingMerge,
-  // except that all fields are repeated. In the tests, we will serialize the
-  // RepeatedFieldsGenerator to bytes, and parse the bytes to TestParsingMerge.
-  // Repeated fields in RepeatedFieldsGenerator are expected to be merged into
-  // the corresponding required/optional fields in TestParsingMerge.
-  message RepeatedFieldsGenerator {
-    repeated TestAllTypes field1 = 1;
-    repeated TestAllTypes field2 = 2;
-    repeated TestAllTypes field3 = 3;
-    repeated group Group1 = 10 {
-      optional TestAllTypes field1 = 11;
-    }
-    repeated group Group2 = 20 {
-      optional TestAllTypes field1 = 21;
-    }
-    repeated TestAllTypes ext1 = 1000;
-    repeated TestAllTypes ext2 = 1001;
-  }
-  required TestAllTypes required_all_types = 1;
-  optional TestAllTypes optional_all_types = 2;
-  repeated TestAllTypes repeated_all_types = 3;
-  optional group OptionalGroup = 10 {
-    optional TestAllTypes optional_group_all_types = 11;
-  }
-  repeated group RepeatedGroup = 20 {
-    optional TestAllTypes repeated_group_all_types = 21;
-  }
-  extensions 1000 to max;
-  extend TestParsingMerge {
-    optional TestAllTypes optional_ext = 1000;
-    repeated TestAllTypes repeated_ext = 1001;
-  }
-}
-
-message TestCommentInjectionMessage {
-  // */ <- This should not close the generated doc comment
-  optional string a = 1 [default="*/ <- Neither should this."];
-}
-
-
-// Test that RPC services work.
-message FooRequest  {}
-message FooResponse {}
-
-message FooClientMessage {}
-message FooServerMessage{}
-
-service TestService {
-  rpc Foo(FooRequest) returns (FooResponse);
-  rpc Bar(BarRequest) returns (BarResponse);
-}
-
-
-message BarRequest  {}
-message BarResponse {}
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_custom_options.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_custom_options.proto
deleted file mode 100644
index e591d29..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_custom_options.proto
+++ /dev/null
@@ -1,387 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: benjy@google.com (Benjy Weinberger)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file used to test the "custom options" feature of proto2.
-
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;     // auto-added
-option java_generic_services = true;   // auto-added
-option py_generic_services = true;
-
-// A custom file option (defined below).
-option (file_opt1) = 9876543210;
-
-import "google/protobuf/descriptor.proto";
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-package protobuf_unittest;
-
-
-// Some simple test custom options of various types.
-
-extend google.protobuf.FileOptions {
-  optional uint64 file_opt1 = 7736974;
-}
-
-extend google.protobuf.MessageOptions {
-  optional int32 message_opt1 = 7739036;
-}
-
-extend google.protobuf.FieldOptions {
-  optional fixed64 field_opt1 = 7740936;
-  // This is useful for testing that we correctly register default values for
-  // extension options.
-  optional int32 field_opt2 = 7753913 [default=42];
-}
-
-extend google.protobuf.EnumOptions {
-  optional sfixed32 enum_opt1 = 7753576;
-}
-
-extend google.protobuf.EnumValueOptions {
-  optional int32 enum_value_opt1 = 1560678;
-}
-
-extend google.protobuf.ServiceOptions {
-  optional sint64 service_opt1 = 7887650;
-}
-
-enum MethodOpt1 {
-  METHODOPT1_VAL1 = 1;
-  METHODOPT1_VAL2 = 2;
-}
-
-extend google.protobuf.MethodOptions {
-  optional MethodOpt1 method_opt1 = 7890860;
-}
-
-// A test message with custom options at all possible locations (and also some
-// regular options, to make sure they interact nicely).
-message TestMessageWithCustomOptions {
-  option message_set_wire_format = false;
-
-  option (message_opt1) = -56;
-
-  optional string field1 = 1 [ctype=CORD,
-                              (field_opt1)=8765432109];
-
-  enum AnEnum {
-    option (enum_opt1) = -789;
-
-    ANENUM_VAL1 = 1;
-    ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
-  }
-}
-
-
-// A test RPC service with custom options at all possible locations (and also
-// some regular options, to make sure they interact nicely).
-message CustomOptionFooRequest {
-}
-
-message CustomOptionFooResponse {
-}
-
-message CustomOptionFooClientMessage {
-}
-
-message CustomOptionFooServerMessage {
-}
-
-service TestServiceWithCustomOptions {
-  option (service_opt1) = -9876543210;
-
-  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
-    option (method_opt1) = METHODOPT1_VAL2;
-  }
-}
-
-
-
-// Options of every possible field type, so we can test them all exhaustively.
-
-message DummyMessageContainingEnum {
-  enum TestEnumType {
-    TEST_OPTION_ENUM_TYPE1 = 22;
-    TEST_OPTION_ENUM_TYPE2 = -23;
-  }
-}
-
-message DummyMessageInvalidAsOptionType {
-}
-
-extend google.protobuf.MessageOptions {
-  optional         bool     bool_opt = 7706090;
-  optional        int32    int32_opt = 7705709;
-  optional        int64    int64_opt = 7705542;
-  optional       uint32   uint32_opt = 7704880;
-  optional       uint64   uint64_opt = 7702367;
-  optional       sint32   sint32_opt = 7701568;
-  optional       sint64   sint64_opt = 7700863;
-  optional      fixed32  fixed32_opt = 7700307;
-  optional      fixed64  fixed64_opt = 7700194;
-  optional     sfixed32 sfixed32_opt = 7698645;
-  optional     sfixed64 sfixed64_opt = 7685475;
-  optional        float    float_opt = 7675390;
-  optional       double   double_opt = 7673293;
-  optional       string   string_opt = 7673285;
-  optional        bytes    bytes_opt = 7673238;
-  optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;
-  optional DummyMessageInvalidAsOptionType message_type_opt = 7665967;
-}
-
-message CustomOptionMinIntegerValues {
-  option     (bool_opt) = false;
-  option    (int32_opt) = -0x80000000;
-  option    (int64_opt) = -0x8000000000000000;
-  option   (uint32_opt) = 0;
-  option   (uint64_opt) = 0;
-  option   (sint32_opt) = -0x80000000;
-  option   (sint64_opt) = -0x8000000000000000;
-  option  (fixed32_opt) = 0;
-  option  (fixed64_opt) = 0;
-  option (sfixed32_opt) = -0x80000000;
-  option (sfixed64_opt) = -0x8000000000000000;
-}
-
-message CustomOptionMaxIntegerValues {
-  option     (bool_opt) = true;
-  option    (int32_opt) = 0x7FFFFFFF;
-  option    (int64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option   (uint32_opt) = 0xFFFFFFFF;
-  option   (uint64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option   (sint32_opt) = 0x7FFFFFFF;
-  option   (sint64_opt) = 0x7FFFFFFFFFFFFFFF;
-  option  (fixed32_opt) = 0xFFFFFFFF;
-  option  (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;
-  option (sfixed32_opt) = 0x7FFFFFFF;
-  option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;
-}
-
-message CustomOptionOtherValues {
-  option  (int32_opt) = -100;  // To test sign-extension.
-  option  (float_opt) = 12.3456789;
-  option (double_opt) = 1.234567890123456789;
-  option (string_opt) = "Hello, \"World\"";
-  option  (bytes_opt) = "Hello\0World";
-  option   (enum_opt) = TEST_OPTION_ENUM_TYPE2;
-}
-
-message SettingRealsFromPositiveInts {
-  option  (float_opt) = 12;
-  option (double_opt) = 154;
-}
-
-message SettingRealsFromNegativeInts {
-  option  (float_opt) = -12;
-  option  (double_opt) = -154;
-}
-
-// Options of complex message types, themselves combined and extended in
-// various ways.
-
-message ComplexOptionType1 {
-  optional int32 foo = 1;
-  optional int32 foo2 = 2;
-  optional int32 foo3 = 3;
-
-  extensions 100 to max;
-}
-
-message ComplexOptionType2 {
-  optional ComplexOptionType1 bar = 1;
-  optional int32 baz = 2;
-
-  message ComplexOptionType4 {
-    optional int32 waldo = 1;
-
-    extend google.protobuf.MessageOptions {
-      optional ComplexOptionType4 complex_opt4 = 7633546;
-    }
-  }
-
-  optional ComplexOptionType4 fred = 3;
-
-  extensions 100 to max;
-}
-
-message ComplexOptionType3 {
-  optional int32 qux = 1;
-
-  optional group ComplexOptionType5 = 2 {
-    optional int32 plugh = 3;
-  }
-}
-
-extend ComplexOptionType1 {
-  optional int32 quux = 7663707;
-  optional ComplexOptionType3 corge = 7663442;
-}
-
-extend ComplexOptionType2 {
-  optional int32 grault = 7650927;
-  optional ComplexOptionType1 garply = 7649992;
-}
-
-extend google.protobuf.MessageOptions {
-  optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;
-  optional ComplexOptionType2 complex_opt2 = 7636949;
-  optional ComplexOptionType3 complex_opt3 = 7636463;
-  optional group ComplexOpt6 = 7595468 {
-    optional int32 xyzzy = 7593951;
-  }
-}
-
-// Note that we try various different ways of naming the same extension.
-message VariousComplexOptions {
-  option (.protobuf_unittest.complex_opt1).foo = 42;
-  option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324;
-  option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876;
-  option (complex_opt2).baz = 987;
-  option (complex_opt2).(grault) = 654;
-  option (complex_opt2).bar.foo = 743;
-  option (complex_opt2).bar.(quux) = 1999;
-  option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008;
-  option (complex_opt2).(garply).foo = 741;
-  option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998;
-  option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121;
-  option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
-  option (complex_opt2).fred.waldo = 321;
-  option (protobuf_unittest.complex_opt3).qux = 9;
-  option (complex_opt3).complexoptiontype5.plugh = 22;
-  option (complexopt6).xyzzy = 24;
-}
-
-// ------------------------------------------------------
-// Definitions for testing aggregate option parsing.
-// See descriptor_unittest.cc.
-
-message AggregateMessageSet {
-  option message_set_wire_format = true;
-  extensions 4 to max;
-}
-
-message AggregateMessageSetElement {
-  extend AggregateMessageSet {
-    optional AggregateMessageSetElement message_set_extension = 15447542;
-  }
-  optional string s = 1;
-}
-
-// A helper type used to test aggregate option parsing
-message Aggregate {
-  optional int32 i = 1;
-  optional string s = 2;
-
-  // A nested object
-  optional Aggregate sub = 3;
-
-  // To test the parsing of extensions inside aggregate values
-  optional google.protobuf.FileOptions file = 4;
-  extend google.protobuf.FileOptions {
-    optional Aggregate nested = 15476903;
-  }
-
-  // An embedded message set
-  optional AggregateMessageSet mset = 5;
-}
-
-// Allow Aggregate to be used as an option at all possible locations
-// in the .proto grammer.
-extend google.protobuf.FileOptions      { optional Aggregate fileopt    = 15478479; }
-extend google.protobuf.MessageOptions   { optional Aggregate msgopt     = 15480088; }
-extend google.protobuf.FieldOptions     { optional Aggregate fieldopt   = 15481374; }
-extend google.protobuf.EnumOptions      { optional Aggregate enumopt    = 15483218; }
-extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; }
-extend google.protobuf.ServiceOptions   { optional Aggregate serviceopt = 15497145; }
-extend google.protobuf.MethodOptions    { optional Aggregate methodopt  = 15512713; }
-
-// Try using AggregateOption at different points in the proto grammar
-option (fileopt) = {
-  s: 'FileAnnotation'
-  // Also test the handling of comments
-  /* of both types */ i: 100
-
-  sub { s: 'NestedFileAnnotation' }
-
-  // Include a google.protobuf.FileOptions and recursively extend it with
-  // another fileopt.
-  file {
-    [protobuf_unittest.fileopt] {
-      s:'FileExtensionAnnotation'
-    }
-  }
-
-  // A message set inside an option value
-  mset {
-    [protobuf_unittest.AggregateMessageSetElement.message_set_extension] {
-      s: 'EmbeddedMessageSetElement'
-    }
-  }
-};
-
-message AggregateMessage {
-  option (msgopt) = { i:101 s:'MessageAnnotation' };
-  optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
-}
-
-service AggregateService {
-  option (serviceopt) = { s:'ServiceAnnotation' };
-  rpc Method (AggregateMessage) returns (AggregateMessage) {
-    option (methodopt) = { s:'MethodAnnotation' };
-  }
-}
-
-enum AggregateEnum {
-  option (enumopt) = { s:'EnumAnnotation' };
-  VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
-}
-
-// Test custom options for nested type.
-message NestedOptionType {
-  message NestedMessage {
-    option (message_opt1) = 1001;
-    optional int32 nested_field = 1 [(field_opt1) = 1002];
-  }
-  enum NestedEnum {
-    option (enum_opt1) = 1003;
-    NESTED_ENUM_VALUE = 1 [(enum_value_opt1) = 1004];
-  }
-  extend google.protobuf.FileOptions {
-    optional int32 nested_extension = 7912573 [(field_opt2) = 1005];
-  }
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import.proto
deleted file mode 100644
index c115b11..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import.proto
+++ /dev/null
@@ -1,64 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file which is imported by unittest.proto to test importing.
-
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do
-// "using namespace unittest_import = protobuf_unittest_import".
-package protobuf_unittest_import;
-
-option optimize_for = SPEED;
-
-// Excercise the java_package option.
-option java_package = "com.google.protobuf.test";
-
-// Do not set a java_outer_classname here to verify that Proto2 works without
-// one.
-
-// Test public import
-import public "google/protobuf/unittest_import_public.proto";
-
-message ImportMessage {
-  optional int32 d = 1;
-}
-
-enum ImportEnum {
-  IMPORT_FOO = 7;
-  IMPORT_BAR = 8;
-  IMPORT_BAZ = 9;
-}
-
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public.proto
deleted file mode 100644
index ea5d1b1..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_import_public.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: liujisi@google.com (Pherl Liu)
-
-
-package protobuf_unittest_import;
-
-option java_package = "com.google.protobuf.test";
-
-message PublicImportMessage {
-  optional int32 e = 1;
-}
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_mset.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_mset.proto
deleted file mode 100644
index 3497f09..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_mset.proto
+++ /dev/null
@@ -1,72 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// This file contains messages for testing message_set_wire_format.
-
-package protobuf_unittest;
-
-option optimize_for = SPEED;
-
-// A message with message_set_wire_format.
-message TestMessageSet {
-  option message_set_wire_format = true;
-  extensions 4 to max;
-}
-
-message TestMessageSetContainer {
-  optional TestMessageSet message_set = 1;
-}
-
-message TestMessageSetExtension1 {
-  extend TestMessageSet {
-    optional TestMessageSetExtension1 message_set_extension = 1545008;
-  }
-  optional int32 i = 15;
-}
-
-message TestMessageSetExtension2 {
-  extend TestMessageSet {
-    optional TestMessageSetExtension2 message_set_extension = 1547769;
-  }
-  optional string str = 25;
-}
-
-// MessageSet wire format is equivalent to this.
-message RawMessageSet {
-  repeated group Item = 1 {
-    required int32 type_id = 2;
-    required bytes message = 3;
-  }
-}
-
diff --git a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_no_generic_services.proto b/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_no_generic_services.proto
deleted file mode 100644
index cffb412..0000000
--- a/python/compatibility_tests/v2.5.0/protos/src/proto/google/protobuf/unittest_no_generic_services.proto
+++ /dev/null
@@ -1,52 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.
-
-// Author: kenton@google.com (Kenton Varda)
-
-package google.protobuf.no_generic_services_test;
-
-// *_generic_services are false by default.
-
-message TestMessage {
-  optional int32 a = 1;
-  extensions 1000 to max;
-}
-
-enum TestEnum {
-  FOO = 1;
-}
-
-extend TestMessage {
-  optional int32 test_extension = 1000;
-}
-
-service TestService {
-  rpc Foo(TestMessage) returns(TestMessage);
-}
diff --git a/python/compatibility_tests/v2.5.0/setup.py b/python/compatibility_tests/v2.5.0/setup.py
deleted file mode 100755
index b41d54d..0000000
--- a/python/compatibility_tests/v2.5.0/setup.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#! /usr/bin/env python
-#
-import glob
-import os
-import subprocess
-import sys
-
-from setuptools import setup, Extension, find_packages
-
-if sys.version_info[0] == 3:
-  # Python 3
-  from distutils.command.build_py import build_py_2to3 as _build_py
-else:
-  # Python 2
-  from distutils.command.build_py import build_py as _build_py
-from distutils.spawn import find_executable
-
-def generate_proto(source, code_gen):
-  """Invokes the Protocol Compiler to generate a _pb2.py from the given
-  .proto file."""
-  output = source.replace(".proto", "_pb2.py").replace("protos/src/proto/", "").replace("protos/python/", "")
-
-  if not os.path.exists(source):
-    sys.stderr.write("Can't find required file: %s\n" % source)
-    sys.exit(-1)
-
-  protoc_command = [ code_gen, "-Iprotos/src/proto", "-Iprotos/python", "--python_out=.", source ]
-  if subprocess.call(protoc_command) != 0:
-    sys.exit(-1)
-
-class build_py(_build_py):
-  def run(self):
-    # generate .proto file
-    protoc_1 = "./protoc_1"
-    protoc_2 = "./protoc_2"
-    generate_proto("protos/src/proto/google/protobuf/unittest.proto", protoc_2)
-    generate_proto("protos/src/proto/google/protobuf/unittest_custom_options.proto", protoc_1)
-    generate_proto("protos/src/proto/google/protobuf/unittest_import.proto", protoc_1)
-    generate_proto("protos/src/proto/google/protobuf/unittest_import_public.proto", protoc_1)
-    generate_proto("protos/src/proto/google/protobuf/unittest_mset.proto", protoc_1)
-    generate_proto("protos/src/proto/google/protobuf/unittest_no_generic_services.proto", protoc_1)
-    generate_proto("protos/python/google/protobuf/internal/factory_test1.proto", protoc_1)
-    generate_proto("protos/python/google/protobuf/internal/factory_test2.proto", protoc_1)
-    generate_proto("protos/python/google/protobuf/internal/more_extensions.proto", protoc_1)
-    generate_proto("protos/python/google/protobuf/internal/more_extensions_dynamic.proto", protoc_1)
-    generate_proto("protos/python/google/protobuf/internal/more_messages.proto", protoc_1)
-    generate_proto("protos/python/google/protobuf/internal/test_bad_identifiers.proto", protoc_1)
-
-    # _build_py is an old-style class, so super() doesn't work.
-    _build_py.run(self)
-
-if __name__ == '__main__':
-  # Keep this list of dependencies in sync with tox.ini.
-  install_requires = ['six>=1.9', 'setuptools']
-  if sys.version_info <= (2,7):
-    install_requires.append('ordereddict')
-    install_requires.append('unittest2')
-
-  setup(
-      name='protobuf',
-      description='Protocol Buffers',
-      download_url='https://github.com/google/protobuf/releases',
-      long_description="Protocol Buffers are Google's data interchange format",
-      url='https://developers.google.com/protocol-buffers/',
-      maintainer='protobuf@googlegroups.com',
-      maintainer_email='protobuf@googlegroups.com',
-      license='3-Clause BSD License',
-      classifiers=[
-        "Programming Language :: Python",
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 2.6",
-        "Programming Language :: Python :: 2.7",
-        "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.3",
-        "Programming Language :: Python :: 3.4",
-        ],
-      packages=find_packages(
-          exclude=[
-              'import_test_package',
-          ],
-      ),
-      test_suite='tests.google.protobuf.internal',
-      cmdclass={
-          'build_py': build_py,
-      },
-      install_requires=install_requires,
-  )
diff --git a/python/compatibility_tests/v2.5.0/test.sh b/python/compatibility_tests/v2.5.0/test.sh
deleted file mode 100755
index 78c16ad..0000000
--- a/python/compatibility_tests/v2.5.0/test.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-# Change to the script's directory.
-cd $(dirname $0)
-
-# Version of the tests (i.e., the version of protobuf from where we extracted
-# these tests).
-TEST_VERSION=2.5.0
-
-# The old version of protobuf that we are testing compatibility against. This
-# is usually the same as TEST_VERSION (i.e., we use the tests extracted from
-# that version to test compatibility of the newest runtime against it), but it
-# is also possible to use this same test set to test the compatibiilty of the
-# latest version against other versions.
-case "$1" in
-  ""|2.5.0)
-    OLD_VERSION=2.5.0
-    OLD_VERSION_PROTOC=https://github.com/xfxyjwf/protobuf-compiler-release/raw/master/v2.5.0/linux/protoc
-    ;;
-  2.6.1)
-    OLD_VERSION=2.6.1
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/2.6.1-build2/protoc-2.6.1-build2-linux-x86_64.exe
-    ;;
-  3.0.0-beta-1)
-    OLD_VERSION=3.0.0-beta-1
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-1/protoc-3.0.0-beta-1-linux-x86_64.exe
-    ;;
-  3.0.0-beta-2)
-    OLD_VERSION=3.0.0-beta-2
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-2/protoc-3.0.0-beta-2-linux-x86_64.exe
-    ;;
-  3.0.0-beta-3)
-    OLD_VERSION=3.0.0-beta-3
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-3/protoc-3.0.0-beta-3-linux-x86_64.exe
-    ;;
-  3.0.0-beta-4)
-    OLD_VERSION=3.0.0-beta-4
-    OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0-beta-4/protoc-3.0.0-beta-4-linux-x86_64.exe
-    ;;
-  *)
-    echo "[ERROR]: Unknown version number: $1"
-    exit 1
-    ;;
-esac
-
-# Extract the latest protobuf version number.
-VERSION_NUMBER=`grep "^__version__ = '.*'" ../../google/protobuf/__init__.py | sed "s|__version__ = '\(.*\)'|\1|"`
-
-echo "Running compatibility tests between $VERSION_NUMBER and $OLD_VERSION"
-
-# Check protoc
-[ -f ../../../src/protoc ] || {
-  echo "[ERROR]: Please build protoc first."
-  exit 1
-}
-
-# Test source compatibility. In these tests we recompile everything against
-# the new runtime (including old version generated code).
-rm google -f -r
-mkdir -p google/protobuf/internal
-# Build and copy the new runtime
-cd ../../
-python setup.py build
-cp google/protobuf/*.py compatibility_tests/v2.5.0/google/protobuf/
-cp google/protobuf/internal/*.py compatibility_tests/v2.5.0/google/protobuf/internal/
-cd compatibility_tests/v2.5.0
-cp tests/google/protobuf/internal/test_util.py google/protobuf/internal/
-cp google/protobuf/__init__.py google/
-
-# Download old version protoc compiler (for linux)
-wget $OLD_VERSION_PROTOC -O old_protoc
-chmod +x old_protoc
-
-# Test A.1:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use old version
-cp old_protoc protoc_1
-cp old_protoc protoc_2
-python setup.py build
-python setup.py test
-
-# Test A.2:
-#   proto set 1: use new version
-#   proto set 2 which may import protos in set 1: use old version
-cp ../../../src/protoc protoc_1
-cp old_protoc protoc_2
-python setup.py build
-python setup.py test
-
-# Test A.3:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use new version
-cp old_protoc protoc_1
-cp ../../../src/protoc protoc_2
-python setup.py build
-python setup.py test
-
-rm google -r -f
-rm build -r -f
-rm protoc_1
-rm protoc_2
-rm old_protoc
diff --git a/python/compatibility_tests/v2.5.0/tests/__init__.py b/python/compatibility_tests/v2.5.0/tests/__init__.py
deleted file mode 100644
index 5585614..0000000
--- a/python/compatibility_tests/v2.5.0/tests/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-try:
-  __import__('pkg_resources').declare_namespace(__name__)
-except ImportError:
-  __path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/python/compatibility_tests/v2.5.0/tests/google/__init__.py b/python/compatibility_tests/v2.5.0/tests/google/__init__.py
deleted file mode 100644
index 5585614..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-try:
-  __import__('pkg_resources').declare_namespace(__name__)
-except ImportError:
-  __path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/__init__.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/__init__.py
deleted file mode 100644
index 5585614..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-try:
-  __import__('pkg_resources').declare_namespace(__name__)
-except ImportError:
-  __path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/__init__.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/__init__.py
deleted file mode 100644
index 64c6956..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/__init__.py
+++ /dev/null
@@ -1,37 +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.
-
-# Copyright 2007 Google Inc. All Rights Reserved.
-
-if __name__ != '__main__':
-  try:
-    __import__('pkg_resources').declare_namespace(__name__)
-  except ImportError:
-    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/descriptor_test.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/descriptor_test.py
deleted file mode 100755
index c74f882..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/descriptor_test.py
+++ /dev/null
@@ -1,613 +0,0 @@
-#! /usr/bin/python
-#
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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.
-
-"""Unittest for google.protobuf.internal.descriptor."""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import unittest
-from google.protobuf import unittest_custom_options_pb2
-from google.protobuf import unittest_import_pb2
-from google.protobuf import unittest_pb2
-from google.protobuf import descriptor_pb2
-from google.protobuf import descriptor
-from google.protobuf import text_format
-
-
-TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII = """
-name: 'TestEmptyMessage'
-"""
-
-
-class DescriptorTest(unittest.TestCase):
-
-  def setUp(self):
-    self.my_file = descriptor.FileDescriptor(
-        name='some/filename/some.proto',
-        package='protobuf_unittest'
-        )
-    self.my_enum = descriptor.EnumDescriptor(
-        name='ForeignEnum',
-        full_name='protobuf_unittest.ForeignEnum',
-        filename=None,
-        file=self.my_file,
-        values=[
-          descriptor.EnumValueDescriptor(name='FOREIGN_FOO', index=0, number=4),
-          descriptor.EnumValueDescriptor(name='FOREIGN_BAR', index=1, number=5),
-          descriptor.EnumValueDescriptor(name='FOREIGN_BAZ', index=2, number=6),
-        ])
-    self.my_message = descriptor.Descriptor(
-        name='NestedMessage',
-        full_name='protobuf_unittest.TestAllTypes.NestedMessage',
-        filename=None,
-        file=self.my_file,
-        containing_type=None,
-        fields=[
-          descriptor.FieldDescriptor(
-            name='bb',
-            full_name='protobuf_unittest.TestAllTypes.NestedMessage.bb',
-            index=0, number=1,
-            type=5, cpp_type=1, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None),
-        ],
-        nested_types=[],
-        enum_types=[
-          self.my_enum,
-        ],
-        extensions=[])
-    self.my_method = descriptor.MethodDescriptor(
-        name='Bar',
-        full_name='protobuf_unittest.TestService.Bar',
-        index=0,
-        containing_service=None,
-        input_type=None,
-        output_type=None)
-    self.my_service = descriptor.ServiceDescriptor(
-        name='TestServiceWithOptions',
-        full_name='protobuf_unittest.TestServiceWithOptions',
-        file=self.my_file,
-        index=0,
-        methods=[
-            self.my_method
-        ])
-
-  def testEnumValueName(self):
-    self.assertEqual(self.my_message.EnumValueName('ForeignEnum', 4),
-                     'FOREIGN_FOO')
-
-    self.assertEqual(
-        self.my_message.enum_types_by_name[
-            'ForeignEnum'].values_by_number[4].name,
-        self.my_message.EnumValueName('ForeignEnum', 4))
-
-  def testEnumFixups(self):
-    self.assertEqual(self.my_enum, self.my_enum.values[0].type)
-
-  def testContainingTypeFixups(self):
-    self.assertEqual(self.my_message, self.my_message.fields[0].containing_type)
-    self.assertEqual(self.my_message, self.my_enum.containing_type)
-
-  def testContainingServiceFixups(self):
-    self.assertEqual(self.my_service, self.my_method.containing_service)
-
-  def testGetOptions(self):
-    self.assertEqual(self.my_enum.GetOptions(),
-                     descriptor_pb2.EnumOptions())
-    self.assertEqual(self.my_enum.values[0].GetOptions(),
-                     descriptor_pb2.EnumValueOptions())
-    self.assertEqual(self.my_message.GetOptions(),
-                     descriptor_pb2.MessageOptions())
-    self.assertEqual(self.my_message.fields[0].GetOptions(),
-                     descriptor_pb2.FieldOptions())
-    self.assertEqual(self.my_method.GetOptions(),
-                     descriptor_pb2.MethodOptions())
-    self.assertEqual(self.my_service.GetOptions(),
-                     descriptor_pb2.ServiceOptions())
-
-  def testSimpleCustomOptions(self):
-    file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
-    message_descriptor =\
-        unittest_custom_options_pb2.TestMessageWithCustomOptions.DESCRIPTOR
-    field_descriptor = message_descriptor.fields_by_name["field1"]
-    enum_descriptor = message_descriptor.enum_types_by_name["AnEnum"]
-    enum_value_descriptor =\
-        message_descriptor.enum_values_by_name["ANENUM_VAL2"]
-    service_descriptor =\
-        unittest_custom_options_pb2.TestServiceWithCustomOptions.DESCRIPTOR
-    method_descriptor = service_descriptor.FindMethodByName("Foo")
-
-    file_options = file_descriptor.GetOptions()
-    file_opt1 = unittest_custom_options_pb2.file_opt1
-    self.assertEqual(9876543210, file_options.Extensions[file_opt1])
-    message_options = message_descriptor.GetOptions()
-    message_opt1 = unittest_custom_options_pb2.message_opt1
-    self.assertEqual(-56, message_options.Extensions[message_opt1])
-    field_options = field_descriptor.GetOptions()
-    field_opt1 = unittest_custom_options_pb2.field_opt1
-    self.assertEqual(8765432109, field_options.Extensions[field_opt1])
-    field_opt2 = unittest_custom_options_pb2.field_opt2
-    self.assertEqual(42, field_options.Extensions[field_opt2])
-    enum_options = enum_descriptor.GetOptions()
-    enum_opt1 = unittest_custom_options_pb2.enum_opt1
-    self.assertEqual(-789, enum_options.Extensions[enum_opt1])
-    enum_value_options = enum_value_descriptor.GetOptions()
-    enum_value_opt1 = unittest_custom_options_pb2.enum_value_opt1
-    self.assertEqual(123, enum_value_options.Extensions[enum_value_opt1])
-
-    service_options = service_descriptor.GetOptions()
-    service_opt1 = unittest_custom_options_pb2.service_opt1
-    self.assertEqual(-9876543210, service_options.Extensions[service_opt1])
-    method_options = method_descriptor.GetOptions()
-    method_opt1 = unittest_custom_options_pb2.method_opt1
-    self.assertEqual(unittest_custom_options_pb2.METHODOPT1_VAL2,
-                     method_options.Extensions[method_opt1])
-
-  def testDifferentCustomOptionTypes(self):
-    kint32min = -2**31
-    kint64min = -2**63
-    kint32max = 2**31 - 1
-    kint64max = 2**63 - 1
-    kuint32max = 2**32 - 1
-    kuint64max = 2**64 - 1
-
-    message_descriptor =\
-        unittest_custom_options_pb2.CustomOptionMinIntegerValues.DESCRIPTOR
-    message_options = message_descriptor.GetOptions()
-    self.assertEqual(False, message_options.Extensions[
-        unittest_custom_options_pb2.bool_opt])
-    self.assertEqual(kint32min, message_options.Extensions[
-        unittest_custom_options_pb2.int32_opt])
-    self.assertEqual(kint64min, message_options.Extensions[
-        unittest_custom_options_pb2.int64_opt])
-    self.assertEqual(0, message_options.Extensions[
-        unittest_custom_options_pb2.uint32_opt])
-    self.assertEqual(0, message_options.Extensions[
-        unittest_custom_options_pb2.uint64_opt])
-    self.assertEqual(kint32min, message_options.Extensions[
-        unittest_custom_options_pb2.sint32_opt])
-    self.assertEqual(kint64min, message_options.Extensions[
-        unittest_custom_options_pb2.sint64_opt])
-    self.assertEqual(0, message_options.Extensions[
-        unittest_custom_options_pb2.fixed32_opt])
-    self.assertEqual(0, message_options.Extensions[
-        unittest_custom_options_pb2.fixed64_opt])
-    self.assertEqual(kint32min, message_options.Extensions[
-        unittest_custom_options_pb2.sfixed32_opt])
-    self.assertEqual(kint64min, message_options.Extensions[
-        unittest_custom_options_pb2.sfixed64_opt])
-
-    message_descriptor =\
-        unittest_custom_options_pb2.CustomOptionMaxIntegerValues.DESCRIPTOR
-    message_options = message_descriptor.GetOptions()
-    self.assertEqual(True, message_options.Extensions[
-        unittest_custom_options_pb2.bool_opt])
-    self.assertEqual(kint32max, message_options.Extensions[
-        unittest_custom_options_pb2.int32_opt])
-    self.assertEqual(kint64max, message_options.Extensions[
-        unittest_custom_options_pb2.int64_opt])
-    self.assertEqual(kuint32max, message_options.Extensions[
-        unittest_custom_options_pb2.uint32_opt])
-    self.assertEqual(kuint64max, message_options.Extensions[
-        unittest_custom_options_pb2.uint64_opt])
-    self.assertEqual(kint32max, message_options.Extensions[
-        unittest_custom_options_pb2.sint32_opt])
-    self.assertEqual(kint64max, message_options.Extensions[
-        unittest_custom_options_pb2.sint64_opt])
-    self.assertEqual(kuint32max, message_options.Extensions[
-        unittest_custom_options_pb2.fixed32_opt])
-    self.assertEqual(kuint64max, message_options.Extensions[
-        unittest_custom_options_pb2.fixed64_opt])
-    self.assertEqual(kint32max, message_options.Extensions[
-        unittest_custom_options_pb2.sfixed32_opt])
-    self.assertEqual(kint64max, message_options.Extensions[
-        unittest_custom_options_pb2.sfixed64_opt])
-
-    message_descriptor =\
-        unittest_custom_options_pb2.CustomOptionOtherValues.DESCRIPTOR
-    message_options = message_descriptor.GetOptions()
-    self.assertEqual(-100, message_options.Extensions[
-        unittest_custom_options_pb2.int32_opt])
-    self.assertAlmostEqual(12.3456789, message_options.Extensions[
-        unittest_custom_options_pb2.float_opt], 6)
-    self.assertAlmostEqual(1.234567890123456789, message_options.Extensions[
-        unittest_custom_options_pb2.double_opt])
-    self.assertEqual("Hello, \"World\"", message_options.Extensions[
-        unittest_custom_options_pb2.string_opt])
-    self.assertEqual("Hello\0World", message_options.Extensions[
-        unittest_custom_options_pb2.bytes_opt])
-    dummy_enum = unittest_custom_options_pb2.DummyMessageContainingEnum
-    self.assertEqual(
-        dummy_enum.TEST_OPTION_ENUM_TYPE2,
-        message_options.Extensions[unittest_custom_options_pb2.enum_opt])
-
-    message_descriptor =\
-        unittest_custom_options_pb2.SettingRealsFromPositiveInts.DESCRIPTOR
-    message_options = message_descriptor.GetOptions()
-    self.assertAlmostEqual(12, message_options.Extensions[
-        unittest_custom_options_pb2.float_opt], 6)
-    self.assertAlmostEqual(154, message_options.Extensions[
-        unittest_custom_options_pb2.double_opt])
-
-    message_descriptor =\
-        unittest_custom_options_pb2.SettingRealsFromNegativeInts.DESCRIPTOR
-    message_options = message_descriptor.GetOptions()
-    self.assertAlmostEqual(-12, message_options.Extensions[
-        unittest_custom_options_pb2.float_opt], 6)
-    self.assertAlmostEqual(-154, message_options.Extensions[
-        unittest_custom_options_pb2.double_opt])
-
-  def testComplexExtensionOptions(self):
-    descriptor =\
-        unittest_custom_options_pb2.VariousComplexOptions.DESCRIPTOR
-    options = descriptor.GetOptions()
-    self.assertEqual(42, options.Extensions[
-        unittest_custom_options_pb2.complex_opt1].foo)
-    self.assertEqual(324, options.Extensions[
-        unittest_custom_options_pb2.complex_opt1].Extensions[
-            unittest_custom_options_pb2.quux])
-    self.assertEqual(876, options.Extensions[
-        unittest_custom_options_pb2.complex_opt1].Extensions[
-            unittest_custom_options_pb2.corge].qux)
-    self.assertEqual(987, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].baz)
-    self.assertEqual(654, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].Extensions[
-            unittest_custom_options_pb2.grault])
-    self.assertEqual(743, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].bar.foo)
-    self.assertEqual(1999, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].bar.Extensions[
-            unittest_custom_options_pb2.quux])
-    self.assertEqual(2008, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].bar.Extensions[
-            unittest_custom_options_pb2.corge].qux)
-    self.assertEqual(741, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].Extensions[
-            unittest_custom_options_pb2.garply].foo)
-    self.assertEqual(1998, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].Extensions[
-            unittest_custom_options_pb2.garply].Extensions[
-                unittest_custom_options_pb2.quux])
-    self.assertEqual(2121, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].Extensions[
-            unittest_custom_options_pb2.garply].Extensions[
-                unittest_custom_options_pb2.corge].qux)
-    self.assertEqual(1971, options.Extensions[
-        unittest_custom_options_pb2.ComplexOptionType2
-        .ComplexOptionType4.complex_opt4].waldo)
-    self.assertEqual(321, options.Extensions[
-        unittest_custom_options_pb2.complex_opt2].fred.waldo)
-    self.assertEqual(9, options.Extensions[
-        unittest_custom_options_pb2.complex_opt3].qux)
-    self.assertEqual(22, options.Extensions[
-        unittest_custom_options_pb2.complex_opt3].complexoptiontype5.plugh)
-    self.assertEqual(24, options.Extensions[
-        unittest_custom_options_pb2.complexopt6].xyzzy)
-
-  # Check that aggregate options were parsed and saved correctly in
-  # the appropriate descriptors.
-  def testAggregateOptions(self):
-    file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
-    message_descriptor =\
-        unittest_custom_options_pb2.AggregateMessage.DESCRIPTOR
-    field_descriptor = message_descriptor.fields_by_name["fieldname"]
-    enum_descriptor = unittest_custom_options_pb2.AggregateEnum.DESCRIPTOR
-    enum_value_descriptor = enum_descriptor.values_by_name["VALUE"]
-    service_descriptor =\
-        unittest_custom_options_pb2.AggregateService.DESCRIPTOR
-    method_descriptor = service_descriptor.FindMethodByName("Method")
-
-    # Tests for the different types of data embedded in fileopt
-    file_options = file_descriptor.GetOptions().Extensions[
-        unittest_custom_options_pb2.fileopt]
-    self.assertEqual(100, file_options.i)
-    self.assertEqual("FileAnnotation", file_options.s)
-    self.assertEqual("NestedFileAnnotation", file_options.sub.s)
-    self.assertEqual("FileExtensionAnnotation", file_options.file.Extensions[
-        unittest_custom_options_pb2.fileopt].s)
-    self.assertEqual("EmbeddedMessageSetElement", file_options.mset.Extensions[
-        unittest_custom_options_pb2.AggregateMessageSetElement
-        .message_set_extension].s)
-
-    # Simple tests for all the other types of annotations
-    self.assertEqual(
-        "MessageAnnotation",
-        message_descriptor.GetOptions().Extensions[
-            unittest_custom_options_pb2.msgopt].s)
-    self.assertEqual(
-        "FieldAnnotation",
-        field_descriptor.GetOptions().Extensions[
-            unittest_custom_options_pb2.fieldopt].s)
-    self.assertEqual(
-        "EnumAnnotation",
-        enum_descriptor.GetOptions().Extensions[
-            unittest_custom_options_pb2.enumopt].s)
-    self.assertEqual(
-        "EnumValueAnnotation",
-        enum_value_descriptor.GetOptions().Extensions[
-            unittest_custom_options_pb2.enumvalopt].s)
-    self.assertEqual(
-        "ServiceAnnotation",
-        service_descriptor.GetOptions().Extensions[
-            unittest_custom_options_pb2.serviceopt].s)
-    self.assertEqual(
-        "MethodAnnotation",
-        method_descriptor.GetOptions().Extensions[
-            unittest_custom_options_pb2.methodopt].s)
-
-  def testNestedOptions(self):
-    nested_message =\
-        unittest_custom_options_pb2.NestedOptionType.NestedMessage.DESCRIPTOR
-    self.assertEqual(1001, nested_message.GetOptions().Extensions[
-        unittest_custom_options_pb2.message_opt1])
-    nested_field = nested_message.fields_by_name["nested_field"]
-    self.assertEqual(1002, nested_field.GetOptions().Extensions[
-        unittest_custom_options_pb2.field_opt1])
-    outer_message =\
-        unittest_custom_options_pb2.NestedOptionType.DESCRIPTOR
-    nested_enum = outer_message.enum_types_by_name["NestedEnum"]
-    self.assertEqual(1003, nested_enum.GetOptions().Extensions[
-        unittest_custom_options_pb2.enum_opt1])
-    nested_enum_value = outer_message.enum_values_by_name["NESTED_ENUM_VALUE"]
-    self.assertEqual(1004, nested_enum_value.GetOptions().Extensions[
-        unittest_custom_options_pb2.enum_value_opt1])
-    nested_extension = outer_message.extensions_by_name["nested_extension"]
-    self.assertEqual(1005, nested_extension.GetOptions().Extensions[
-        unittest_custom_options_pb2.field_opt2])
-
-  def testFileDescriptorReferences(self):
-    self.assertEqual(self.my_enum.file, self.my_file)
-    self.assertEqual(self.my_message.file, self.my_file)
-
-  def testFileDescriptor(self):
-    self.assertEqual(self.my_file.name, 'some/filename/some.proto')
-    self.assertEqual(self.my_file.package, 'protobuf_unittest')
-
-
-class DescriptorCopyToProtoTest(unittest.TestCase):
-  """Tests for CopyTo functions of Descriptor."""
-
-  def _AssertProtoEqual(self, actual_proto, expected_class, expected_ascii):
-    expected_proto = expected_class()
-    text_format.Merge(expected_ascii, expected_proto)
-
-    self.assertEqual(
-        actual_proto, expected_proto,
-        'Not equal,\nActual:\n%s\nExpected:\n%s\n'
-        % (str(actual_proto), str(expected_proto)))
-
-  def _InternalTestCopyToProto(self, desc, expected_proto_class,
-                               expected_proto_ascii):
-    actual = expected_proto_class()
-    desc.CopyToProto(actual)
-    self._AssertProtoEqual(
-        actual, expected_proto_class, expected_proto_ascii)
-
-  def testCopyToProto_EmptyMessage(self):
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestEmptyMessage.DESCRIPTOR,
-        descriptor_pb2.DescriptorProto,
-        TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII)
-
-  def testCopyToProto_NestedMessage(self):
-    TEST_NESTED_MESSAGE_ASCII = """
-      name: 'NestedMessage'
-      field: <
-        name: 'bb'
-        number: 1
-        label: 1  # Optional
-        type: 5  # TYPE_INT32
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,
-        descriptor_pb2.DescriptorProto,
-        TEST_NESTED_MESSAGE_ASCII)
-
-  def testCopyToProto_ForeignNestedMessage(self):
-    TEST_FOREIGN_NESTED_ASCII = """
-      name: 'TestForeignNested'
-      field: <
-        name: 'foreign_nested'
-        number: 1
-        label: 1  # Optional
-        type: 11  # TYPE_MESSAGE
-        type_name: '.protobuf_unittest.TestAllTypes.NestedMessage'
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestForeignNested.DESCRIPTOR,
-        descriptor_pb2.DescriptorProto,
-        TEST_FOREIGN_NESTED_ASCII)
-
-  def testCopyToProto_ForeignEnum(self):
-    TEST_FOREIGN_ENUM_ASCII = """
-      name: 'ForeignEnum'
-      value: <
-        name: 'FOREIGN_FOO'
-        number: 4
-      >
-      value: <
-        name: 'FOREIGN_BAR'
-        number: 5
-      >
-      value: <
-        name: 'FOREIGN_BAZ'
-        number: 6
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2._FOREIGNENUM,
-        descriptor_pb2.EnumDescriptorProto,
-        TEST_FOREIGN_ENUM_ASCII)
-
-  def testCopyToProto_Options(self):
-    TEST_DEPRECATED_FIELDS_ASCII = """
-      name: 'TestDeprecatedFields'
-      field: <
-        name: 'deprecated_int32'
-        number: 1
-        label: 1  # Optional
-        type: 5  # TYPE_INT32
-        options: <
-          deprecated: true
-        >
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestDeprecatedFields.DESCRIPTOR,
-        descriptor_pb2.DescriptorProto,
-        TEST_DEPRECATED_FIELDS_ASCII)
-
-  def testCopyToProto_AllExtensions(self):
-    TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII = """
-      name: 'TestEmptyMessageWithExtensions'
-      extension_range: <
-        start: 1
-        end: 536870912
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestEmptyMessageWithExtensions.DESCRIPTOR,
-        descriptor_pb2.DescriptorProto,
-        TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII)
-
-  def testCopyToProto_SeveralExtensions(self):
-    TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII = """
-      name: 'TestMultipleExtensionRanges'
-      extension_range: <
-        start: 42
-        end: 43
-      >
-      extension_range: <
-        start: 4143
-        end: 4244
-      >
-      extension_range: <
-        start: 65536
-        end: 536870912
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR,
-        descriptor_pb2.DescriptorProto,
-        TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII)
-
-  def testCopyToProto_FileDescriptor(self):
-    UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = ("""
-      name: 'google/protobuf/unittest_import.proto'
-      package: 'protobuf_unittest_import'
-      dependency: 'google/protobuf/unittest_import_public.proto'
-      message_type: <
-        name: 'ImportMessage'
-        field: <
-          name: 'd'
-          number: 1
-          label: 1  # Optional
-          type: 5  # TYPE_INT32
-        >
-      >
-      """ +
-      """enum_type: <
-        name: 'ImportEnum'
-        value: <
-          name: 'IMPORT_FOO'
-          number: 7
-        >
-        value: <
-          name: 'IMPORT_BAR'
-          number: 8
-        >
-        value: <
-          name: 'IMPORT_BAZ'
-          number: 9
-        >
-      >
-      options: <
-        java_package: 'com.google.protobuf.test'
-        optimize_for: 1  # SPEED
-      >
-      public_dependency: 0
-      """)
-
-    self._InternalTestCopyToProto(
-        unittest_import_pb2.DESCRIPTOR,
-        descriptor_pb2.FileDescriptorProto,
-        UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII)
-
-  def testCopyToProto_ServiceDescriptor(self):
-    TEST_SERVICE_ASCII = """
-      name: 'TestService'
-      method: <
-        name: 'Foo'
-        input_type: '.protobuf_unittest.FooRequest'
-        output_type: '.protobuf_unittest.FooResponse'
-      >
-      method: <
-        name: 'Bar'
-        input_type: '.protobuf_unittest.BarRequest'
-        output_type: '.protobuf_unittest.BarResponse'
-      >
-      """
-
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestService.DESCRIPTOR,
-        descriptor_pb2.ServiceDescriptorProto,
-        TEST_SERVICE_ASCII)
-
-
-class MakeDescriptorTest(unittest.TestCase):
-  def testMakeDescriptorWithUnsignedIntField(self):
-    file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
-    file_descriptor_proto.name = 'Foo'
-    message_type = file_descriptor_proto.message_type.add()
-    message_type.name = file_descriptor_proto.name
-    field = message_type.field.add()
-    field.number = 1
-    field.name = 'uint64_field'
-    field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
-    field.type = descriptor.FieldDescriptor.TYPE_UINT64
-    result = descriptor.MakeDescriptor(message_type)
-    self.assertEqual(result.fields[0].cpp_type,
-                     descriptor.FieldDescriptor.CPPTYPE_UINT64)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/generator_test.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/generator_test.py
deleted file mode 100755
index 8343aba..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/generator_test.py
+++ /dev/null
@@ -1,269 +0,0 @@
-#! /usr/bin/python
-#
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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.
-
-# TODO(robinson): Flesh this out considerably.  We focused on reflection_test.py
-# first, since it's testing the subtler code, and since it provides decent
-# indirect testing of the protocol compiler output.
-
-"""Unittest that directly tests the output of the pure-Python protocol
-compiler.  See //google/protobuf/reflection_test.py for a test which
-further ensures that we can use Python protocol message objects as we expect.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import unittest
-from google.protobuf.internal import test_bad_identifiers_pb2
-from google.protobuf import unittest_custom_options_pb2
-from google.protobuf import unittest_import_pb2
-from google.protobuf import unittest_import_public_pb2
-from google.protobuf import unittest_mset_pb2
-from google.protobuf import unittest_pb2
-from google.protobuf import unittest_no_generic_services_pb2
-from google.protobuf import service
-
-MAX_EXTENSION = 536870912
-
-
-class GeneratorTest(unittest.TestCase):
-
-  def testNestedMessageDescriptor(self):
-    field_name = 'optional_nested_message'
-    proto_type = unittest_pb2.TestAllTypes
-    self.assertEqual(
-        proto_type.NestedMessage.DESCRIPTOR,
-        proto_type.DESCRIPTOR.fields_by_name[field_name].message_type)
-
-  def testEnums(self):
-    # We test only module-level enums here.
-    # TODO(robinson): Examine descriptors directly to check
-    # enum descriptor output.
-    self.assertEqual(4, unittest_pb2.FOREIGN_FOO)
-    self.assertEqual(5, unittest_pb2.FOREIGN_BAR)
-    self.assertEqual(6, unittest_pb2.FOREIGN_BAZ)
-
-    proto = unittest_pb2.TestAllTypes()
-    self.assertEqual(1, proto.FOO)
-    self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
-    self.assertEqual(2, proto.BAR)
-    self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
-    self.assertEqual(3, proto.BAZ)
-    self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
-
-  def testExtremeDefaultValues(self):
-    message = unittest_pb2.TestExtremeDefaultValues()
-
-    # Python pre-2.6 does not have isinf() or isnan() functions, so we have
-    # to provide our own.
-    def isnan(val):
-      # NaN is never equal to itself.
-      return val != val
-    def isinf(val):
-      # Infinity times zero equals NaN.
-      return not isnan(val) and isnan(val * 0)
-
-    self.assertTrue(isinf(message.inf_double))
-    self.assertTrue(message.inf_double > 0)
-    self.assertTrue(isinf(message.neg_inf_double))
-    self.assertTrue(message.neg_inf_double < 0)
-    self.assertTrue(isnan(message.nan_double))
-
-    self.assertTrue(isinf(message.inf_float))
-    self.assertTrue(message.inf_float > 0)
-    self.assertTrue(isinf(message.neg_inf_float))
-    self.assertTrue(message.neg_inf_float < 0)
-    self.assertTrue(isnan(message.nan_float))
-    self.assertEqual("? ? ?? ?? ??? ??/ ??-", message.cpp_trigraph)
-
-  def testHasDefaultValues(self):
-    desc = unittest_pb2.TestAllTypes.DESCRIPTOR
-
-    expected_has_default_by_name = {
-        'optional_int32': False,
-        'repeated_int32': False,
-        'optional_nested_message': False,
-        'default_int32': True,
-    }
-
-    has_default_by_name = dict(
-        [(f.name, f.has_default_value)
-         for f in desc.fields
-         if f.name in expected_has_default_by_name])
-    self.assertEqual(expected_has_default_by_name, has_default_by_name)
-
-  def testContainingTypeBehaviorForExtensions(self):
-    self.assertEqual(unittest_pb2.optional_int32_extension.containing_type,
-                     unittest_pb2.TestAllExtensions.DESCRIPTOR)
-    self.assertEqual(unittest_pb2.TestRequired.single.containing_type,
-                     unittest_pb2.TestAllExtensions.DESCRIPTOR)
-
-  def testExtensionScope(self):
-    self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope,
-                     None)
-    self.assertEqual(unittest_pb2.TestRequired.single.extension_scope,
-                     unittest_pb2.TestRequired.DESCRIPTOR)
-
-  def testIsExtension(self):
-    self.assertTrue(unittest_pb2.optional_int32_extension.is_extension)
-    self.assertTrue(unittest_pb2.TestRequired.single.is_extension)
-
-    message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR
-    non_extension_descriptor = message_descriptor.fields_by_name['a']
-    self.assertTrue(not non_extension_descriptor.is_extension)
-
-  def testOptions(self):
-    proto = unittest_mset_pb2.TestMessageSet()
-    self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format)
-
-  def testMessageWithCustomOptions(self):
-    proto = unittest_custom_options_pb2.TestMessageWithCustomOptions()
-    enum_options = proto.DESCRIPTOR.enum_types_by_name['AnEnum'].GetOptions()
-    self.assertTrue(enum_options is not None)
-    # TODO(gps): We really should test for the presense of the enum_opt1
-    # extension and for its value to be set to -789.
-
-  def testNestedTypes(self):
-    self.assertEquals(
-        set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types),
-        set([
-            unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,
-            unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR,
-            unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR,
-        ]))
-    self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, [])
-    self.assertEqual(
-        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, [])
-
-  def testContainingType(self):
-    self.assertTrue(
-        unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type is None)
-    self.assertTrue(
-        unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type is None)
-    self.assertEqual(
-        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,
-        unittest_pb2.TestAllTypes.DESCRIPTOR)
-    self.assertEqual(
-        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,
-        unittest_pb2.TestAllTypes.DESCRIPTOR)
-    self.assertEqual(
-        unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type,
-        unittest_pb2.TestAllTypes.DESCRIPTOR)
-
-  def testContainingTypeInEnumDescriptor(self):
-    self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type is None)
-    self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type,
-                     unittest_pb2.TestAllTypes.DESCRIPTOR)
-
-  def testPackage(self):
-    self.assertEqual(
-        unittest_pb2.TestAllTypes.DESCRIPTOR.file.package,
-        'protobuf_unittest')
-    desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR
-    self.assertEqual(desc.file.package, 'protobuf_unittest')
-    self.assertEqual(
-        unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package,
-        'protobuf_unittest_import')
-
-    self.assertEqual(
-        unittest_pb2._FOREIGNENUM.file.package, 'protobuf_unittest')
-    self.assertEqual(
-        unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package,
-        'protobuf_unittest')
-    self.assertEqual(
-        unittest_import_pb2._IMPORTENUM.file.package,
-        'protobuf_unittest_import')
-
-  def testExtensionRange(self):
-    self.assertEqual(
-        unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, [])
-    self.assertEqual(
-        unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges,
-        [(1, MAX_EXTENSION)])
-    self.assertEqual(
-        unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges,
-        [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)])
-
-  def testFileDescriptor(self):
-    self.assertEqual(unittest_pb2.DESCRIPTOR.name,
-                     'google/protobuf/unittest.proto')
-    self.assertEqual(unittest_pb2.DESCRIPTOR.package, 'protobuf_unittest')
-    self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb is None)
-
-  def testNoGenericServices(self):
-    self.assertTrue(hasattr(unittest_no_generic_services_pb2, "TestMessage"))
-    self.assertTrue(hasattr(unittest_no_generic_services_pb2, "FOO"))
-    self.assertTrue(hasattr(unittest_no_generic_services_pb2, "test_extension"))
-
-    # Make sure unittest_no_generic_services_pb2 has no services subclassing
-    # Proto2 Service class.
-    if hasattr(unittest_no_generic_services_pb2, "TestService"):
-      self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService,
-                                  service.Service))
-
-  def testMessageTypesByName(self):
-    file_type = unittest_pb2.DESCRIPTOR
-    self.assertEqual(
-        unittest_pb2._TESTALLTYPES,
-        file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name])
-
-    # Nested messages shouldn't be included in the message_types_by_name
-    # dictionary (like in the C++ API).
-    self.assertFalse(
-        unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name in
-        file_type.message_types_by_name)
-
-  def testPublicImports(self):
-    # Test public imports as embedded message.
-    all_type_proto = unittest_pb2.TestAllTypes()
-    self.assertEqual(0, all_type_proto.optional_public_import_message.e)
-
-    # PublicImportMessage is actually defined in unittest_import_public_pb2
-    # module, and is public imported by unittest_import_pb2 module.
-    public_import_proto = unittest_import_pb2.PublicImportMessage()
-    self.assertEqual(0, public_import_proto.e)
-    self.assertTrue(unittest_import_public_pb2.PublicImportMessage is
-                    unittest_import_pb2.PublicImportMessage)
-
-  def testBadIdentifiers(self):
-    # We're just testing that the code was imported without problems.
-    message = test_bad_identifiers_pb2.TestBadIdentifiers()
-    self.assertEqual(message.Extensions[test_bad_identifiers_pb2.message],
-                     "foo")
-    self.assertEqual(message.Extensions[test_bad_identifiers_pb2.descriptor],
-                     "bar")
-    self.assertEqual(message.Extensions[test_bad_identifiers_pb2.reflection],
-                     "baz")
-    self.assertEqual(message.Extensions[test_bad_identifiers_pb2.service],
-                     "qux")
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/golden_message b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/golden_message
deleted file mode 100644
index 4dd62cd..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/golden_message
+++ /dev/null
Binary files differ
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/golden_packed_fields_message b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/golden_packed_fields_message
deleted file mode 100644
index ee28d38..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/golden_packed_fields_message
+++ /dev/null
Binary files differ
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/message_test.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/message_test.py
deleted file mode 100755
index e71b295..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/message_test.py
+++ /dev/null
@@ -1,499 +0,0 @@
-#! /usr/bin/python
-#
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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 python protocol buffers against the golden message.
-
-Note that the golden messages exercise every known field type, thus this
-test ends up exercising and verifying nearly all of the parsing and
-serialization code in the whole library.
-
-TODO(kenton):  Merge with wire_format_test?  It doesn't make a whole lot of
-sense to call this a test of the "message" module, which only declares an
-abstract interface.
-"""
-
-__author__ = 'gps@google.com (Gregory P. Smith)'
-
-import copy
-import math
-import operator
-import pickle
-
-import unittest
-from google.protobuf import unittest_import_pb2
-from google.protobuf import unittest_pb2
-from google.protobuf.internal import api_implementation
-from google.protobuf.internal import test_util
-from google.protobuf import message
-
-try:
-  cmp                                   # Python 2
-except NameError:
-  cmp = lambda x, y: (x > y) - (x < y)  # Python 3
-
-# Python pre-2.6 does not have isinf() or isnan() functions, so we have
-# to provide our own.
-def isnan(val):
-  # NaN is never equal to itself.
-  return val != val
-def isinf(val):
-  # Infinity times zero equals NaN.
-  return not isnan(val) and isnan(val * 0)
-def IsPosInf(val):
-  return isinf(val) and (val > 0)
-def IsNegInf(val):
-  return isinf(val) and (val < 0)
-
-class MessageTest(unittest.TestCase):
-
-  def testGoldenMessage(self):
-    golden_data = test_util.GoldenFile('golden_message').read()
-    golden_message = unittest_pb2.TestAllTypes()
-    golden_message.ParseFromString(golden_data)
-    test_util.ExpectAllFieldsSet(self, golden_message)
-    self.assertEqual(golden_data, golden_message.SerializeToString())
-    golden_copy = copy.deepcopy(golden_message)
-    self.assertEqual(golden_data, golden_copy.SerializeToString())
-
-  def testGoldenExtensions(self):
-    golden_data = test_util.GoldenFile('golden_message').read()
-    golden_message = unittest_pb2.TestAllExtensions()
-    golden_message.ParseFromString(golden_data)
-    all_set = unittest_pb2.TestAllExtensions()
-    test_util.SetAllExtensions(all_set)
-    self.assertEquals(all_set, golden_message)
-    self.assertEqual(golden_data, golden_message.SerializeToString())
-    golden_copy = copy.deepcopy(golden_message)
-    self.assertEqual(golden_data, golden_copy.SerializeToString())
-
-  def testGoldenPackedMessage(self):
-    golden_data = test_util.GoldenFile('golden_packed_fields_message').read()
-    golden_message = unittest_pb2.TestPackedTypes()
-    golden_message.ParseFromString(golden_data)
-    all_set = unittest_pb2.TestPackedTypes()
-    test_util.SetAllPackedFields(all_set)
-    self.assertEquals(all_set, golden_message)
-    self.assertEqual(golden_data, all_set.SerializeToString())
-    golden_copy = copy.deepcopy(golden_message)
-    self.assertEqual(golden_data, golden_copy.SerializeToString())
-
-  def testGoldenPackedExtensions(self):
-    golden_data = test_util.GoldenFile('golden_packed_fields_message').read()
-    golden_message = unittest_pb2.TestPackedExtensions()
-    golden_message.ParseFromString(golden_data)
-    all_set = unittest_pb2.TestPackedExtensions()
-    test_util.SetAllPackedExtensions(all_set)
-    self.assertEquals(all_set, golden_message)
-    self.assertEqual(golden_data, all_set.SerializeToString())
-    golden_copy = copy.deepcopy(golden_message)
-    self.assertEqual(golden_data, golden_copy.SerializeToString())
-
-  def testPickleSupport(self):
-    golden_data = test_util.GoldenFile('golden_message').read()
-    golden_message = unittest_pb2.TestAllTypes()
-    golden_message.ParseFromString(golden_data)
-    pickled_message = pickle.dumps(golden_message)
-
-    unpickled_message = pickle.loads(pickled_message)
-    self.assertEquals(unpickled_message, golden_message)
-
-  def testPickleIncompleteProto(self):
-    golden_message = unittest_pb2.TestRequired(a=1)
-    pickled_message = pickle.dumps(golden_message)
-
-    unpickled_message = pickle.loads(pickled_message)
-    self.assertEquals(unpickled_message, golden_message)
-    self.assertEquals(unpickled_message.a, 1)
-    # This is still an incomplete proto - so serializing should fail
-    self.assertRaises(message.EncodeError, unpickled_message.SerializeToString)
-
-  def testPositiveInfinity(self):
-    golden_data = ('\x5D\x00\x00\x80\x7F'
-                   '\x61\x00\x00\x00\x00\x00\x00\xF0\x7F'
-                   '\xCD\x02\x00\x00\x80\x7F'
-                   '\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\x7F')
-    golden_message = unittest_pb2.TestAllTypes()
-    golden_message.ParseFromString(golden_data)
-    self.assertTrue(IsPosInf(golden_message.optional_float))
-    self.assertTrue(IsPosInf(golden_message.optional_double))
-    self.assertTrue(IsPosInf(golden_message.repeated_float[0]))
-    self.assertTrue(IsPosInf(golden_message.repeated_double[0]))
-    self.assertEqual(golden_data, golden_message.SerializeToString())
-
-  def testNegativeInfinity(self):
-    golden_data = ('\x5D\x00\x00\x80\xFF'
-                   '\x61\x00\x00\x00\x00\x00\x00\xF0\xFF'
-                   '\xCD\x02\x00\x00\x80\xFF'
-                   '\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\xFF')
-    golden_message = unittest_pb2.TestAllTypes()
-    golden_message.ParseFromString(golden_data)
-    self.assertTrue(IsNegInf(golden_message.optional_float))
-    self.assertTrue(IsNegInf(golden_message.optional_double))
-    self.assertTrue(IsNegInf(golden_message.repeated_float[0]))
-    self.assertTrue(IsNegInf(golden_message.repeated_double[0]))
-    self.assertEqual(golden_data, golden_message.SerializeToString())
-
-  def testNotANumber(self):
-    golden_data = ('\x5D\x00\x00\xC0\x7F'
-                   '\x61\x00\x00\x00\x00\x00\x00\xF8\x7F'
-                   '\xCD\x02\x00\x00\xC0\x7F'
-                   '\xD1\x02\x00\x00\x00\x00\x00\x00\xF8\x7F')
-    golden_message = unittest_pb2.TestAllTypes()
-    golden_message.ParseFromString(golden_data)
-    self.assertTrue(isnan(golden_message.optional_float))
-    self.assertTrue(isnan(golden_message.optional_double))
-    self.assertTrue(isnan(golden_message.repeated_float[0]))
-    self.assertTrue(isnan(golden_message.repeated_double[0]))
-
-    # The protocol buffer may serialize to any one of multiple different
-    # representations of a NaN.  Rather than verify a specific representation,
-    # verify the serialized string can be converted into a correctly
-    # behaving protocol buffer.
-    serialized = golden_message.SerializeToString()
-    message = unittest_pb2.TestAllTypes()
-    message.ParseFromString(serialized)
-    self.assertTrue(isnan(message.optional_float))
-    self.assertTrue(isnan(message.optional_double))
-    self.assertTrue(isnan(message.repeated_float[0]))
-    self.assertTrue(isnan(message.repeated_double[0]))
-
-  def testPositiveInfinityPacked(self):
-    golden_data = ('\xA2\x06\x04\x00\x00\x80\x7F'
-                   '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\x7F')
-    golden_message = unittest_pb2.TestPackedTypes()
-    golden_message.ParseFromString(golden_data)
-    self.assertTrue(IsPosInf(golden_message.packed_float[0]))
-    self.assertTrue(IsPosInf(golden_message.packed_double[0]))
-    self.assertEqual(golden_data, golden_message.SerializeToString())
-
-  def testNegativeInfinityPacked(self):
-    golden_data = ('\xA2\x06\x04\x00\x00\x80\xFF'
-                   '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\xFF')
-    golden_message = unittest_pb2.TestPackedTypes()
-    golden_message.ParseFromString(golden_data)
-    self.assertTrue(IsNegInf(golden_message.packed_float[0]))
-    self.assertTrue(IsNegInf(golden_message.packed_double[0]))
-    self.assertEqual(golden_data, golden_message.SerializeToString())
-
-  def testNotANumberPacked(self):
-    golden_data = ('\xA2\x06\x04\x00\x00\xC0\x7F'
-                   '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF8\x7F')
-    golden_message = unittest_pb2.TestPackedTypes()
-    golden_message.ParseFromString(golden_data)
-    self.assertTrue(isnan(golden_message.packed_float[0]))
-    self.assertTrue(isnan(golden_message.packed_double[0]))
-
-    serialized = golden_message.SerializeToString()
-    message = unittest_pb2.TestPackedTypes()
-    message.ParseFromString(serialized)
-    self.assertTrue(isnan(message.packed_float[0]))
-    self.assertTrue(isnan(message.packed_double[0]))
-
-  def testExtremeFloatValues(self):
-    message = unittest_pb2.TestAllTypes()
-
-    # Most positive exponent, no significand bits set.
-    kMostPosExponentNoSigBits = math.pow(2, 127)
-    message.optional_float = kMostPosExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == kMostPosExponentNoSigBits)
-
-    # Most positive exponent, one significand bit set.
-    kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127)
-    message.optional_float = kMostPosExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == kMostPosExponentOneSigBit)
-
-    # Repeat last two cases with values of same magnitude, but negative.
-    message.optional_float = -kMostPosExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits)
-
-    message.optional_float = -kMostPosExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit)
-
-    # Most negative exponent, no significand bits set.
-    kMostNegExponentNoSigBits = math.pow(2, -127)
-    message.optional_float = kMostNegExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == kMostNegExponentNoSigBits)
-
-    # Most negative exponent, one significand bit set.
-    kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127)
-    message.optional_float = kMostNegExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == kMostNegExponentOneSigBit)
-
-    # Repeat last two cases with values of the same magnitude, but negative.
-    message.optional_float = -kMostNegExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits)
-
-    message.optional_float = -kMostNegExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit)
-
-  def testExtremeDoubleValues(self):
-    message = unittest_pb2.TestAllTypes()
-
-    # Most positive exponent, no significand bits set.
-    kMostPosExponentNoSigBits = math.pow(2, 1023)
-    message.optional_double = kMostPosExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == kMostPosExponentNoSigBits)
-
-    # Most positive exponent, one significand bit set.
-    kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023)
-    message.optional_double = kMostPosExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == kMostPosExponentOneSigBit)
-
-    # Repeat last two cases with values of same magnitude, but negative.
-    message.optional_double = -kMostPosExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits)
-
-    message.optional_double = -kMostPosExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit)
-
-    # Most negative exponent, no significand bits set.
-    kMostNegExponentNoSigBits = math.pow(2, -1023)
-    message.optional_double = kMostNegExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == kMostNegExponentNoSigBits)
-
-    # Most negative exponent, one significand bit set.
-    kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023)
-    message.optional_double = kMostNegExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == kMostNegExponentOneSigBit)
-
-    # Repeat last two cases with values of the same magnitude, but negative.
-    message.optional_double = -kMostNegExponentNoSigBits
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits)
-
-    message.optional_double = -kMostNegExponentOneSigBit
-    message.ParseFromString(message.SerializeToString())
-    self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit)
-
-  def testSortingRepeatedScalarFieldsDefaultComparator(self):
-    """Check some different types with the default comparator."""
-    message = unittest_pb2.TestAllTypes()
-
-    # TODO(mattp): would testing more scalar types strengthen test?
-    message.repeated_int32.append(1)
-    message.repeated_int32.append(3)
-    message.repeated_int32.append(2)
-    message.repeated_int32.sort()
-    self.assertEqual(message.repeated_int32[0], 1)
-    self.assertEqual(message.repeated_int32[1], 2)
-    self.assertEqual(message.repeated_int32[2], 3)
-
-    message.repeated_float.append(1.1)
-    message.repeated_float.append(1.3)
-    message.repeated_float.append(1.2)
-    message.repeated_float.sort()
-    self.assertAlmostEqual(message.repeated_float[0], 1.1)
-    self.assertAlmostEqual(message.repeated_float[1], 1.2)
-    self.assertAlmostEqual(message.repeated_float[2], 1.3)
-
-    message.repeated_string.append('a')
-    message.repeated_string.append('c')
-    message.repeated_string.append('b')
-    message.repeated_string.sort()
-    self.assertEqual(message.repeated_string[0], 'a')
-    self.assertEqual(message.repeated_string[1], 'b')
-    self.assertEqual(message.repeated_string[2], 'c')
-
-    message.repeated_bytes.append('a')
-    message.repeated_bytes.append('c')
-    message.repeated_bytes.append('b')
-    message.repeated_bytes.sort()
-    self.assertEqual(message.repeated_bytes[0], 'a')
-    self.assertEqual(message.repeated_bytes[1], 'b')
-    self.assertEqual(message.repeated_bytes[2], 'c')
-
-  def testSortingRepeatedScalarFieldsCustomComparator(self):
-    """Check some different types with custom comparator."""
-    message = unittest_pb2.TestAllTypes()
-
-    message.repeated_int32.append(-3)
-    message.repeated_int32.append(-2)
-    message.repeated_int32.append(-1)
-    message.repeated_int32.sort(lambda x,y: cmp(abs(x), abs(y)))
-    self.assertEqual(message.repeated_int32[0], -1)
-    self.assertEqual(message.repeated_int32[1], -2)
-    self.assertEqual(message.repeated_int32[2], -3)
-
-    message.repeated_string.append('aaa')
-    message.repeated_string.append('bb')
-    message.repeated_string.append('c')
-    message.repeated_string.sort(lambda x,y: cmp(len(x), len(y)))
-    self.assertEqual(message.repeated_string[0], 'c')
-    self.assertEqual(message.repeated_string[1], 'bb')
-    self.assertEqual(message.repeated_string[2], 'aaa')
-
-  def testSortingRepeatedCompositeFieldsCustomComparator(self):
-    """Check passing a custom comparator to sort a repeated composite field."""
-    message = unittest_pb2.TestAllTypes()
-
-    message.repeated_nested_message.add().bb = 1
-    message.repeated_nested_message.add().bb = 3
-    message.repeated_nested_message.add().bb = 2
-    message.repeated_nested_message.add().bb = 6
-    message.repeated_nested_message.add().bb = 5
-    message.repeated_nested_message.add().bb = 4
-    message.repeated_nested_message.sort(lambda x,y: cmp(x.bb, y.bb))
-    self.assertEqual(message.repeated_nested_message[0].bb, 1)
-    self.assertEqual(message.repeated_nested_message[1].bb, 2)
-    self.assertEqual(message.repeated_nested_message[2].bb, 3)
-    self.assertEqual(message.repeated_nested_message[3].bb, 4)
-    self.assertEqual(message.repeated_nested_message[4].bb, 5)
-    self.assertEqual(message.repeated_nested_message[5].bb, 6)
-
-  def testRepeatedCompositeFieldSortArguments(self):
-    """Check sorting a repeated composite field using list.sort() arguments."""
-    message = unittest_pb2.TestAllTypes()
-
-    get_bb = operator.attrgetter('bb')
-    cmp_bb = lambda a, b: cmp(a.bb, b.bb)
-    message.repeated_nested_message.add().bb = 1
-    message.repeated_nested_message.add().bb = 3
-    message.repeated_nested_message.add().bb = 2
-    message.repeated_nested_message.add().bb = 6
-    message.repeated_nested_message.add().bb = 5
-    message.repeated_nested_message.add().bb = 4
-    message.repeated_nested_message.sort(key=get_bb)
-    self.assertEqual([k.bb for k in message.repeated_nested_message],
-                     [1, 2, 3, 4, 5, 6])
-    message.repeated_nested_message.sort(key=get_bb, reverse=True)
-    self.assertEqual([k.bb for k in message.repeated_nested_message],
-                     [6, 5, 4, 3, 2, 1])
-    message.repeated_nested_message.sort(sort_function=cmp_bb)
-    self.assertEqual([k.bb for k in message.repeated_nested_message],
-                     [1, 2, 3, 4, 5, 6])
-    message.repeated_nested_message.sort(cmp=cmp_bb, reverse=True)
-    self.assertEqual([k.bb for k in message.repeated_nested_message],
-                     [6, 5, 4, 3, 2, 1])
-
-  def testRepeatedScalarFieldSortArguments(self):
-    """Check sorting a scalar field using list.sort() arguments."""
-    message = unittest_pb2.TestAllTypes()
-
-    abs_cmp = lambda a, b: cmp(abs(a), abs(b))
-    message.repeated_int32.append(-3)
-    message.repeated_int32.append(-2)
-    message.repeated_int32.append(-1)
-    message.repeated_int32.sort(key=abs)
-    self.assertEqual(list(message.repeated_int32), [-1, -2, -3])
-    message.repeated_int32.sort(key=abs, reverse=True)
-    self.assertEqual(list(message.repeated_int32), [-3, -2, -1])
-    message.repeated_int32.sort(sort_function=abs_cmp)
-    self.assertEqual(list(message.repeated_int32), [-1, -2, -3])
-    message.repeated_int32.sort(cmp=abs_cmp, reverse=True)
-    self.assertEqual(list(message.repeated_int32), [-3, -2, -1])
-
-    len_cmp = lambda a, b: cmp(len(a), len(b))
-    message.repeated_string.append('aaa')
-    message.repeated_string.append('bb')
-    message.repeated_string.append('c')
-    message.repeated_string.sort(key=len)
-    self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa'])
-    message.repeated_string.sort(key=len, reverse=True)
-    self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c'])
-    message.repeated_string.sort(sort_function=len_cmp)
-    self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa'])
-    message.repeated_string.sort(cmp=len_cmp, reverse=True)
-    self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c'])
-
-  def testParsingMerge(self):
-    """Check the merge behavior when a required or optional field appears
-    multiple times in the input."""
-    messages = [
-        unittest_pb2.TestAllTypes(),
-        unittest_pb2.TestAllTypes(),
-        unittest_pb2.TestAllTypes() ]
-    messages[0].optional_int32 = 1
-    messages[1].optional_int64 = 2
-    messages[2].optional_int32 = 3
-    messages[2].optional_string = 'hello'
-
-    merged_message = unittest_pb2.TestAllTypes()
-    merged_message.optional_int32 = 3
-    merged_message.optional_int64 = 2
-    merged_message.optional_string = 'hello'
-
-    generator = unittest_pb2.TestParsingMerge.RepeatedFieldsGenerator()
-    generator.field1.extend(messages)
-    generator.field2.extend(messages)
-    generator.field3.extend(messages)
-    generator.ext1.extend(messages)
-    generator.ext2.extend(messages)
-    generator.group1.add().field1.MergeFrom(messages[0])
-    generator.group1.add().field1.MergeFrom(messages[1])
-    generator.group1.add().field1.MergeFrom(messages[2])
-    generator.group2.add().field1.MergeFrom(messages[0])
-    generator.group2.add().field1.MergeFrom(messages[1])
-    generator.group2.add().field1.MergeFrom(messages[2])
-
-    data = generator.SerializeToString()
-    parsing_merge = unittest_pb2.TestParsingMerge()
-    parsing_merge.ParseFromString(data)
-
-    # Required and optional fields should be merged.
-    self.assertEqual(parsing_merge.required_all_types, merged_message)
-    self.assertEqual(parsing_merge.optional_all_types, merged_message)
-    self.assertEqual(parsing_merge.optionalgroup.optional_group_all_types,
-                     merged_message)
-    self.assertEqual(parsing_merge.Extensions[
-                     unittest_pb2.TestParsingMerge.optional_ext],
-                     merged_message)
-
-    # Repeated fields should not be merged.
-    self.assertEqual(len(parsing_merge.repeated_all_types), 3)
-    self.assertEqual(len(parsing_merge.repeatedgroup), 3)
-    self.assertEqual(len(parsing_merge.Extensions[
-        unittest_pb2.TestParsingMerge.repeated_ext]), 3)
-
-
-  def testSortEmptyRepeatedCompositeContainer(self):
-    """Exercise a scenario that has led to segfaults in the past.
-    """
-    m = unittest_pb2.TestAllTypes()
-    m.repeated_nested_message.sort()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/service_reflection_test.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/service_reflection_test.py
deleted file mode 100755
index e04f825..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/service_reflection_test.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#! /usr/bin/python
-#
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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.service_reflection."""
-
-__author__ = 'petar@google.com (Petar Petrov)'
-
-import unittest
-from google.protobuf import unittest_pb2
-from google.protobuf import service_reflection
-from google.protobuf import service
-
-
-class FooUnitTest(unittest.TestCase):
-
-  def testService(self):
-    class MockRpcChannel(service.RpcChannel):
-      def CallMethod(self, method, controller, request, response, callback):
-        self.method = method
-        self.controller = controller
-        self.request = request
-        callback(response)
-
-    class MockRpcController(service.RpcController):
-      def SetFailed(self, msg):
-        self.failure_message = msg
-
-    self.callback_response = None
-
-    class MyService(unittest_pb2.TestService):
-      pass
-
-    self.callback_response = None
-
-    def MyCallback(response):
-      self.callback_response = response
-
-    rpc_controller = MockRpcController()
-    channel = MockRpcChannel()
-    srvc = MyService()
-    srvc.Foo(rpc_controller, unittest_pb2.FooRequest(), MyCallback)
-    self.assertEqual('Method Foo not implemented.',
-                     rpc_controller.failure_message)
-    self.assertEqual(None, self.callback_response)
-
-    rpc_controller.failure_message = None
-
-    service_descriptor = unittest_pb2.TestService.GetDescriptor()
-    srvc.CallMethod(service_descriptor.methods[1], rpc_controller,
-                    unittest_pb2.BarRequest(), MyCallback)
-    self.assertEqual('Method Bar not implemented.',
-                     rpc_controller.failure_message)
-    self.assertEqual(None, self.callback_response)
-    
-    class MyServiceImpl(unittest_pb2.TestService):
-      def Foo(self, rpc_controller, request, done):
-        self.foo_called = True
-      def Bar(self, rpc_controller, request, done):
-        self.bar_called = True
-
-    srvc = MyServiceImpl()
-    rpc_controller.failure_message = None
-    srvc.Foo(rpc_controller, unittest_pb2.FooRequest(), MyCallback)
-    self.assertEqual(None, rpc_controller.failure_message)
-    self.assertEqual(True, srvc.foo_called)
-
-    rpc_controller.failure_message = None
-    srvc.CallMethod(service_descriptor.methods[1], rpc_controller,
-                    unittest_pb2.BarRequest(), MyCallback)
-    self.assertEqual(None, rpc_controller.failure_message)
-    self.assertEqual(True, srvc.bar_called)
-
-  def testServiceStub(self):
-    class MockRpcChannel(service.RpcChannel):
-      def CallMethod(self, method, controller, request,
-                     response_class, callback):
-        self.method = method
-        self.controller = controller
-        self.request = request
-        callback(response_class())
-
-    self.callback_response = None
-
-    def MyCallback(response):
-      self.callback_response = response
-
-    channel = MockRpcChannel()
-    stub = unittest_pb2.TestService_Stub(channel)
-    rpc_controller = 'controller'
-    request = 'request'
-
-    # GetDescriptor now static, still works as instance method for compatability
-    self.assertEqual(unittest_pb2.TestService_Stub.GetDescriptor(),
-                     stub.GetDescriptor())
-
-    # Invoke method.
-    stub.Foo(rpc_controller, request, MyCallback)
-
-    self.assertTrue(isinstance(self.callback_response,
-                               unittest_pb2.FooResponse))
-    self.assertEqual(request, channel.request)
-    self.assertEqual(rpc_controller, channel.controller)
-    self.assertEqual(stub.GetDescriptor().methods[0], channel.method)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/test_util.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/test_util.py
deleted file mode 100755
index e2c9db0..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/test_util.py
+++ /dev/null
@@ -1,651 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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.
-
-"""Utilities for Python proto2 tests.
-
-This is intentionally modeled on C++ code in
-//google/protobuf/test_util.*.
-"""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import os.path
-
-from google.protobuf import unittest_import_pb2
-from google.protobuf import unittest_pb2
-
-
-def SetAllNonLazyFields(message):
-  """Sets every non-lazy field in the message to a unique value.
-
-  Args:
-    message: A unittest_pb2.TestAllTypes instance.
-  """
-
-  #
-  # Optional fields.
-  #
-
-  message.optional_int32    = 101
-  message.optional_int64    = 102
-  message.optional_uint32   = 103
-  message.optional_uint64   = 104
-  message.optional_sint32   = 105
-  message.optional_sint64   = 106
-  message.optional_fixed32  = 107
-  message.optional_fixed64  = 108
-  message.optional_sfixed32 = 109
-  message.optional_sfixed64 = 110
-  message.optional_float    = 111
-  message.optional_double   = 112
-  message.optional_bool     = True
-  # TODO(robinson): Firmly spec out and test how
-  # protos interact with unicode.  One specific example:
-  # what happens if we change the literal below to
-  # u'115'?  What *should* happen?  Still some discussion
-  # to finish with Kenton about bytes vs. strings
-  # and forcing everything to be utf8. :-/
-  message.optional_string   = '115'
-  message.optional_bytes    = '116'
-
-  message.optionalgroup.a = 117
-  message.optional_nested_message.bb = 118
-  message.optional_foreign_message.c = 119
-  message.optional_import_message.d = 120
-  message.optional_public_import_message.e = 126
-
-  message.optional_nested_enum = unittest_pb2.TestAllTypes.BAZ
-  message.optional_foreign_enum = unittest_pb2.FOREIGN_BAZ
-  message.optional_import_enum = unittest_import_pb2.IMPORT_BAZ
-
-  message.optional_string_piece = '124'
-  message.optional_cord = '125'
-
-  #
-  # Repeated fields.
-  #
-
-  message.repeated_int32.append(201)
-  message.repeated_int64.append(202)
-  message.repeated_uint32.append(203)
-  message.repeated_uint64.append(204)
-  message.repeated_sint32.append(205)
-  message.repeated_sint64.append(206)
-  message.repeated_fixed32.append(207)
-  message.repeated_fixed64.append(208)
-  message.repeated_sfixed32.append(209)
-  message.repeated_sfixed64.append(210)
-  message.repeated_float.append(211)
-  message.repeated_double.append(212)
-  message.repeated_bool.append(True)
-  message.repeated_string.append('215')
-  message.repeated_bytes.append('216')
-
-  message.repeatedgroup.add().a = 217
-  message.repeated_nested_message.add().bb = 218
-  message.repeated_foreign_message.add().c = 219
-  message.repeated_import_message.add().d = 220
-  message.repeated_lazy_message.add().bb = 227
-
-  message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAR)
-  message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAR)
-  message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAR)
-
-  message.repeated_string_piece.append('224')
-  message.repeated_cord.append('225')
-
-  # Add a second one of each field.
-  message.repeated_int32.append(301)
-  message.repeated_int64.append(302)
-  message.repeated_uint32.append(303)
-  message.repeated_uint64.append(304)
-  message.repeated_sint32.append(305)
-  message.repeated_sint64.append(306)
-  message.repeated_fixed32.append(307)
-  message.repeated_fixed64.append(308)
-  message.repeated_sfixed32.append(309)
-  message.repeated_sfixed64.append(310)
-  message.repeated_float.append(311)
-  message.repeated_double.append(312)
-  message.repeated_bool.append(False)
-  message.repeated_string.append('315')
-  message.repeated_bytes.append('316')
-
-  message.repeatedgroup.add().a = 317
-  message.repeated_nested_message.add().bb = 318
-  message.repeated_foreign_message.add().c = 319
-  message.repeated_import_message.add().d = 320
-  message.repeated_lazy_message.add().bb = 327
-
-  message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAZ)
-  message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAZ)
-  message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAZ)
-
-  message.repeated_string_piece.append('324')
-  message.repeated_cord.append('325')
-
-  #
-  # Fields that have defaults.
-  #
-
-  message.default_int32 = 401
-  message.default_int64 = 402
-  message.default_uint32 = 403
-  message.default_uint64 = 404
-  message.default_sint32 = 405
-  message.default_sint64 = 406
-  message.default_fixed32 = 407
-  message.default_fixed64 = 408
-  message.default_sfixed32 = 409
-  message.default_sfixed64 = 410
-  message.default_float = 411
-  message.default_double = 412
-  message.default_bool = False
-  message.default_string = '415'
-  message.default_bytes = '416'
-
-  message.default_nested_enum = unittest_pb2.TestAllTypes.FOO
-  message.default_foreign_enum = unittest_pb2.FOREIGN_FOO
-  message.default_import_enum = unittest_import_pb2.IMPORT_FOO
-
-  message.default_string_piece = '424'
-  message.default_cord = '425'
-
-
-def SetAllFields(message):
-  SetAllNonLazyFields(message)
-  message.optional_lazy_message.bb = 127
-
-
-def SetAllExtensions(message):
-  """Sets every extension in the message to a unique value.
-
-  Args:
-    message: A unittest_pb2.TestAllExtensions instance.
-  """
-
-  extensions = message.Extensions
-  pb2 = unittest_pb2
-  import_pb2 = unittest_import_pb2
-
-  #
-  # Optional fields.
-  #
-
-  extensions[pb2.optional_int32_extension] = 101
-  extensions[pb2.optional_int64_extension] = 102
-  extensions[pb2.optional_uint32_extension] = 103
-  extensions[pb2.optional_uint64_extension] = 104
-  extensions[pb2.optional_sint32_extension] = 105
-  extensions[pb2.optional_sint64_extension] = 106
-  extensions[pb2.optional_fixed32_extension] = 107
-  extensions[pb2.optional_fixed64_extension] = 108
-  extensions[pb2.optional_sfixed32_extension] = 109
-  extensions[pb2.optional_sfixed64_extension] = 110
-  extensions[pb2.optional_float_extension] = 111
-  extensions[pb2.optional_double_extension] = 112
-  extensions[pb2.optional_bool_extension] = True
-  extensions[pb2.optional_string_extension] = '115'
-  extensions[pb2.optional_bytes_extension] = '116'
-
-  extensions[pb2.optionalgroup_extension].a = 117
-  extensions[pb2.optional_nested_message_extension].bb = 118
-  extensions[pb2.optional_foreign_message_extension].c = 119
-  extensions[pb2.optional_import_message_extension].d = 120
-  extensions[pb2.optional_public_import_message_extension].e = 126
-  extensions[pb2.optional_lazy_message_extension].bb = 127
-
-  extensions[pb2.optional_nested_enum_extension] = pb2.TestAllTypes.BAZ
-  extensions[pb2.optional_nested_enum_extension] = pb2.TestAllTypes.BAZ
-  extensions[pb2.optional_foreign_enum_extension] = pb2.FOREIGN_BAZ
-  extensions[pb2.optional_import_enum_extension] = import_pb2.IMPORT_BAZ
-
-  extensions[pb2.optional_string_piece_extension] = '124'
-  extensions[pb2.optional_cord_extension] = '125'
-
-  #
-  # Repeated fields.
-  #
-
-  extensions[pb2.repeated_int32_extension].append(201)
-  extensions[pb2.repeated_int64_extension].append(202)
-  extensions[pb2.repeated_uint32_extension].append(203)
-  extensions[pb2.repeated_uint64_extension].append(204)
-  extensions[pb2.repeated_sint32_extension].append(205)
-  extensions[pb2.repeated_sint64_extension].append(206)
-  extensions[pb2.repeated_fixed32_extension].append(207)
-  extensions[pb2.repeated_fixed64_extension].append(208)
-  extensions[pb2.repeated_sfixed32_extension].append(209)
-  extensions[pb2.repeated_sfixed64_extension].append(210)
-  extensions[pb2.repeated_float_extension].append(211)
-  extensions[pb2.repeated_double_extension].append(212)
-  extensions[pb2.repeated_bool_extension].append(True)
-  extensions[pb2.repeated_string_extension].append('215')
-  extensions[pb2.repeated_bytes_extension].append('216')
-
-  extensions[pb2.repeatedgroup_extension].add().a = 217
-  extensions[pb2.repeated_nested_message_extension].add().bb = 218
-  extensions[pb2.repeated_foreign_message_extension].add().c = 219
-  extensions[pb2.repeated_import_message_extension].add().d = 220
-  extensions[pb2.repeated_lazy_message_extension].add().bb = 227
-
-  extensions[pb2.repeated_nested_enum_extension].append(pb2.TestAllTypes.BAR)
-  extensions[pb2.repeated_foreign_enum_extension].append(pb2.FOREIGN_BAR)
-  extensions[pb2.repeated_import_enum_extension].append(import_pb2.IMPORT_BAR)
-
-  extensions[pb2.repeated_string_piece_extension].append('224')
-  extensions[pb2.repeated_cord_extension].append('225')
-
-  # Append a second one of each field.
-  extensions[pb2.repeated_int32_extension].append(301)
-  extensions[pb2.repeated_int64_extension].append(302)
-  extensions[pb2.repeated_uint32_extension].append(303)
-  extensions[pb2.repeated_uint64_extension].append(304)
-  extensions[pb2.repeated_sint32_extension].append(305)
-  extensions[pb2.repeated_sint64_extension].append(306)
-  extensions[pb2.repeated_fixed32_extension].append(307)
-  extensions[pb2.repeated_fixed64_extension].append(308)
-  extensions[pb2.repeated_sfixed32_extension].append(309)
-  extensions[pb2.repeated_sfixed64_extension].append(310)
-  extensions[pb2.repeated_float_extension].append(311)
-  extensions[pb2.repeated_double_extension].append(312)
-  extensions[pb2.repeated_bool_extension].append(False)
-  extensions[pb2.repeated_string_extension].append('315')
-  extensions[pb2.repeated_bytes_extension].append('316')
-
-  extensions[pb2.repeatedgroup_extension].add().a = 317
-  extensions[pb2.repeated_nested_message_extension].add().bb = 318
-  extensions[pb2.repeated_foreign_message_extension].add().c = 319
-  extensions[pb2.repeated_import_message_extension].add().d = 320
-  extensions[pb2.repeated_lazy_message_extension].add().bb = 327
-
-  extensions[pb2.repeated_nested_enum_extension].append(pb2.TestAllTypes.BAZ)
-  extensions[pb2.repeated_foreign_enum_extension].append(pb2.FOREIGN_BAZ)
-  extensions[pb2.repeated_import_enum_extension].append(import_pb2.IMPORT_BAZ)
-
-  extensions[pb2.repeated_string_piece_extension].append('324')
-  extensions[pb2.repeated_cord_extension].append('325')
-
-  #
-  # Fields with defaults.
-  #
-
-  extensions[pb2.default_int32_extension] = 401
-  extensions[pb2.default_int64_extension] = 402
-  extensions[pb2.default_uint32_extension] = 403
-  extensions[pb2.default_uint64_extension] = 404
-  extensions[pb2.default_sint32_extension] = 405
-  extensions[pb2.default_sint64_extension] = 406
-  extensions[pb2.default_fixed32_extension] = 407
-  extensions[pb2.default_fixed64_extension] = 408
-  extensions[pb2.default_sfixed32_extension] = 409
-  extensions[pb2.default_sfixed64_extension] = 410
-  extensions[pb2.default_float_extension] = 411
-  extensions[pb2.default_double_extension] = 412
-  extensions[pb2.default_bool_extension] = False
-  extensions[pb2.default_string_extension] = '415'
-  extensions[pb2.default_bytes_extension] = '416'
-
-  extensions[pb2.default_nested_enum_extension] = pb2.TestAllTypes.FOO
-  extensions[pb2.default_foreign_enum_extension] = pb2.FOREIGN_FOO
-  extensions[pb2.default_import_enum_extension] = import_pb2.IMPORT_FOO
-
-  extensions[pb2.default_string_piece_extension] = '424'
-  extensions[pb2.default_cord_extension] = '425'
-
-
-def SetAllFieldsAndExtensions(message):
-  """Sets every field and extension in the message to a unique value.
-
-  Args:
-    message: A unittest_pb2.TestAllExtensions message.
-  """
-  message.my_int = 1
-  message.my_string = 'foo'
-  message.my_float = 1.0
-  message.Extensions[unittest_pb2.my_extension_int] = 23
-  message.Extensions[unittest_pb2.my_extension_string] = 'bar'
-
-
-def ExpectAllFieldsAndExtensionsInOrder(serialized):
-  """Ensures that serialized is the serialization we expect for a message
-  filled with SetAllFieldsAndExtensions().  (Specifically, ensures that the
-  serialization is in canonical, tag-number order).
-  """
-  my_extension_int = unittest_pb2.my_extension_int
-  my_extension_string = unittest_pb2.my_extension_string
-  expected_strings = []
-  message = unittest_pb2.TestFieldOrderings()
-  message.my_int = 1  # Field 1.
-  expected_strings.append(message.SerializeToString())
-  message.Clear()
-  message.Extensions[my_extension_int] = 23  # Field 5.
-  expected_strings.append(message.SerializeToString())
-  message.Clear()
-  message.my_string = 'foo'  # Field 11.
-  expected_strings.append(message.SerializeToString())
-  message.Clear()
-  message.Extensions[my_extension_string] = 'bar'  # Field 50.
-  expected_strings.append(message.SerializeToString())
-  message.Clear()
-  message.my_float = 1.0
-  expected_strings.append(message.SerializeToString())
-  message.Clear()
-  expected = ''.join(expected_strings)
-
-  if expected != serialized:
-    raise ValueError('Expected %r, found %r' % (expected, serialized))
-
-
-def ExpectAllFieldsSet(test_case, message):
-  """Check all fields for correct values have after Set*Fields() is called."""
-  test_case.assertTrue(message.HasField('optional_int32'))
-  test_case.assertTrue(message.HasField('optional_int64'))
-  test_case.assertTrue(message.HasField('optional_uint32'))
-  test_case.assertTrue(message.HasField('optional_uint64'))
-  test_case.assertTrue(message.HasField('optional_sint32'))
-  test_case.assertTrue(message.HasField('optional_sint64'))
-  test_case.assertTrue(message.HasField('optional_fixed32'))
-  test_case.assertTrue(message.HasField('optional_fixed64'))
-  test_case.assertTrue(message.HasField('optional_sfixed32'))
-  test_case.assertTrue(message.HasField('optional_sfixed64'))
-  test_case.assertTrue(message.HasField('optional_float'))
-  test_case.assertTrue(message.HasField('optional_double'))
-  test_case.assertTrue(message.HasField('optional_bool'))
-  test_case.assertTrue(message.HasField('optional_string'))
-  test_case.assertTrue(message.HasField('optional_bytes'))
-
-  test_case.assertTrue(message.HasField('optionalgroup'))
-  test_case.assertTrue(message.HasField('optional_nested_message'))
-  test_case.assertTrue(message.HasField('optional_foreign_message'))
-  test_case.assertTrue(message.HasField('optional_import_message'))
-
-  test_case.assertTrue(message.optionalgroup.HasField('a'))
-  test_case.assertTrue(message.optional_nested_message.HasField('bb'))
-  test_case.assertTrue(message.optional_foreign_message.HasField('c'))
-  test_case.assertTrue(message.optional_import_message.HasField('d'))
-
-  test_case.assertTrue(message.HasField('optional_nested_enum'))
-  test_case.assertTrue(message.HasField('optional_foreign_enum'))
-  test_case.assertTrue(message.HasField('optional_import_enum'))
-
-  test_case.assertTrue(message.HasField('optional_string_piece'))
-  test_case.assertTrue(message.HasField('optional_cord'))
-
-  test_case.assertEqual(101, message.optional_int32)
-  test_case.assertEqual(102, message.optional_int64)
-  test_case.assertEqual(103, message.optional_uint32)
-  test_case.assertEqual(104, message.optional_uint64)
-  test_case.assertEqual(105, message.optional_sint32)
-  test_case.assertEqual(106, message.optional_sint64)
-  test_case.assertEqual(107, message.optional_fixed32)
-  test_case.assertEqual(108, message.optional_fixed64)
-  test_case.assertEqual(109, message.optional_sfixed32)
-  test_case.assertEqual(110, message.optional_sfixed64)
-  test_case.assertEqual(111, message.optional_float)
-  test_case.assertEqual(112, message.optional_double)
-  test_case.assertEqual(True, message.optional_bool)
-  test_case.assertEqual('115', message.optional_string)
-  test_case.assertEqual('116', message.optional_bytes)
-
-  test_case.assertEqual(117, message.optionalgroup.a)
-  test_case.assertEqual(118, message.optional_nested_message.bb)
-  test_case.assertEqual(119, message.optional_foreign_message.c)
-  test_case.assertEqual(120, message.optional_import_message.d)
-  test_case.assertEqual(126, message.optional_public_import_message.e)
-  test_case.assertEqual(127, message.optional_lazy_message.bb)
-
-  test_case.assertEqual(unittest_pb2.TestAllTypes.BAZ,
-                        message.optional_nested_enum)
-  test_case.assertEqual(unittest_pb2.FOREIGN_BAZ,
-                        message.optional_foreign_enum)
-  test_case.assertEqual(unittest_import_pb2.IMPORT_BAZ,
-                        message.optional_import_enum)
-
-  # -----------------------------------------------------------------
-
-  test_case.assertEqual(2, len(message.repeated_int32))
-  test_case.assertEqual(2, len(message.repeated_int64))
-  test_case.assertEqual(2, len(message.repeated_uint32))
-  test_case.assertEqual(2, len(message.repeated_uint64))
-  test_case.assertEqual(2, len(message.repeated_sint32))
-  test_case.assertEqual(2, len(message.repeated_sint64))
-  test_case.assertEqual(2, len(message.repeated_fixed32))
-  test_case.assertEqual(2, len(message.repeated_fixed64))
-  test_case.assertEqual(2, len(message.repeated_sfixed32))
-  test_case.assertEqual(2, len(message.repeated_sfixed64))
-  test_case.assertEqual(2, len(message.repeated_float))
-  test_case.assertEqual(2, len(message.repeated_double))
-  test_case.assertEqual(2, len(message.repeated_bool))
-  test_case.assertEqual(2, len(message.repeated_string))
-  test_case.assertEqual(2, len(message.repeated_bytes))
-
-  test_case.assertEqual(2, len(message.repeatedgroup))
-  test_case.assertEqual(2, len(message.repeated_nested_message))
-  test_case.assertEqual(2, len(message.repeated_foreign_message))
-  test_case.assertEqual(2, len(message.repeated_import_message))
-  test_case.assertEqual(2, len(message.repeated_nested_enum))
-  test_case.assertEqual(2, len(message.repeated_foreign_enum))
-  test_case.assertEqual(2, len(message.repeated_import_enum))
-
-  test_case.assertEqual(2, len(message.repeated_string_piece))
-  test_case.assertEqual(2, len(message.repeated_cord))
-
-  test_case.assertEqual(201, message.repeated_int32[0])
-  test_case.assertEqual(202, message.repeated_int64[0])
-  test_case.assertEqual(203, message.repeated_uint32[0])
-  test_case.assertEqual(204, message.repeated_uint64[0])
-  test_case.assertEqual(205, message.repeated_sint32[0])
-  test_case.assertEqual(206, message.repeated_sint64[0])
-  test_case.assertEqual(207, message.repeated_fixed32[0])
-  test_case.assertEqual(208, message.repeated_fixed64[0])
-  test_case.assertEqual(209, message.repeated_sfixed32[0])
-  test_case.assertEqual(210, message.repeated_sfixed64[0])
-  test_case.assertEqual(211, message.repeated_float[0])
-  test_case.assertEqual(212, message.repeated_double[0])
-  test_case.assertEqual(True, message.repeated_bool[0])
-  test_case.assertEqual('215', message.repeated_string[0])
-  test_case.assertEqual('216', message.repeated_bytes[0])
-
-  test_case.assertEqual(217, message.repeatedgroup[0].a)
-  test_case.assertEqual(218, message.repeated_nested_message[0].bb)
-  test_case.assertEqual(219, message.repeated_foreign_message[0].c)
-  test_case.assertEqual(220, message.repeated_import_message[0].d)
-  test_case.assertEqual(227, message.repeated_lazy_message[0].bb)
-
-  test_case.assertEqual(unittest_pb2.TestAllTypes.BAR,
-                        message.repeated_nested_enum[0])
-  test_case.assertEqual(unittest_pb2.FOREIGN_BAR,
-                        message.repeated_foreign_enum[0])
-  test_case.assertEqual(unittest_import_pb2.IMPORT_BAR,
-                        message.repeated_import_enum[0])
-
-  test_case.assertEqual(301, message.repeated_int32[1])
-  test_case.assertEqual(302, message.repeated_int64[1])
-  test_case.assertEqual(303, message.repeated_uint32[1])
-  test_case.assertEqual(304, message.repeated_uint64[1])
-  test_case.assertEqual(305, message.repeated_sint32[1])
-  test_case.assertEqual(306, message.repeated_sint64[1])
-  test_case.assertEqual(307, message.repeated_fixed32[1])
-  test_case.assertEqual(308, message.repeated_fixed64[1])
-  test_case.assertEqual(309, message.repeated_sfixed32[1])
-  test_case.assertEqual(310, message.repeated_sfixed64[1])
-  test_case.assertEqual(311, message.repeated_float[1])
-  test_case.assertEqual(312, message.repeated_double[1])
-  test_case.assertEqual(False, message.repeated_bool[1])
-  test_case.assertEqual('315', message.repeated_string[1])
-  test_case.assertEqual('316', message.repeated_bytes[1])
-
-  test_case.assertEqual(317, message.repeatedgroup[1].a)
-  test_case.assertEqual(318, message.repeated_nested_message[1].bb)
-  test_case.assertEqual(319, message.repeated_foreign_message[1].c)
-  test_case.assertEqual(320, message.repeated_import_message[1].d)
-  test_case.assertEqual(327, message.repeated_lazy_message[1].bb)
-
-  test_case.assertEqual(unittest_pb2.TestAllTypes.BAZ,
-                        message.repeated_nested_enum[1])
-  test_case.assertEqual(unittest_pb2.FOREIGN_BAZ,
-                        message.repeated_foreign_enum[1])
-  test_case.assertEqual(unittest_import_pb2.IMPORT_BAZ,
-                        message.repeated_import_enum[1])
-
-  # -----------------------------------------------------------------
-
-  test_case.assertTrue(message.HasField('default_int32'))
-  test_case.assertTrue(message.HasField('default_int64'))
-  test_case.assertTrue(message.HasField('default_uint32'))
-  test_case.assertTrue(message.HasField('default_uint64'))
-  test_case.assertTrue(message.HasField('default_sint32'))
-  test_case.assertTrue(message.HasField('default_sint64'))
-  test_case.assertTrue(message.HasField('default_fixed32'))
-  test_case.assertTrue(message.HasField('default_fixed64'))
-  test_case.assertTrue(message.HasField('default_sfixed32'))
-  test_case.assertTrue(message.HasField('default_sfixed64'))
-  test_case.assertTrue(message.HasField('default_float'))
-  test_case.assertTrue(message.HasField('default_double'))
-  test_case.assertTrue(message.HasField('default_bool'))
-  test_case.assertTrue(message.HasField('default_string'))
-  test_case.assertTrue(message.HasField('default_bytes'))
-
-  test_case.assertTrue(message.HasField('default_nested_enum'))
-  test_case.assertTrue(message.HasField('default_foreign_enum'))
-  test_case.assertTrue(message.HasField('default_import_enum'))
-
-  test_case.assertEqual(401, message.default_int32)
-  test_case.assertEqual(402, message.default_int64)
-  test_case.assertEqual(403, message.default_uint32)
-  test_case.assertEqual(404, message.default_uint64)
-  test_case.assertEqual(405, message.default_sint32)
-  test_case.assertEqual(406, message.default_sint64)
-  test_case.assertEqual(407, message.default_fixed32)
-  test_case.assertEqual(408, message.default_fixed64)
-  test_case.assertEqual(409, message.default_sfixed32)
-  test_case.assertEqual(410, message.default_sfixed64)
-  test_case.assertEqual(411, message.default_float)
-  test_case.assertEqual(412, message.default_double)
-  test_case.assertEqual(False, message.default_bool)
-  test_case.assertEqual('415', message.default_string)
-  test_case.assertEqual('416', message.default_bytes)
-
-  test_case.assertEqual(unittest_pb2.TestAllTypes.FOO,
-                        message.default_nested_enum)
-  test_case.assertEqual(unittest_pb2.FOREIGN_FOO,
-                        message.default_foreign_enum)
-  test_case.assertEqual(unittest_import_pb2.IMPORT_FOO,
-                        message.default_import_enum)
-
-def GoldenFile(filename):
-  """Finds the given golden file and returns a file object representing it."""
-
-  # Search up the directory tree looking for the C++ protobuf source code.
-  path = '.'
-  while os.path.exists(path):
-    if os.path.exists(os.path.join(path, 'tests/google/protobuf/internal')):
-      # Found it.  Load the golden file from the testdata directory.
-      full_path = os.path.join(path, 'tests/google/protobuf/internal', filename)
-      return open(full_path, 'rb')
-    path = os.path.join(path, '..')
-
-  raise RuntimeError(
-    'Could not find golden files.  This test must be run from within the '
-    'protobuf source package so that it can read test data files from the '
-    'C++ source tree.')
-
-
-def SetAllPackedFields(message):
-  """Sets every field in the message to a unique value.
-
-  Args:
-    message: A unittest_pb2.TestPackedTypes instance.
-  """
-  message.packed_int32.extend([601, 701])
-  message.packed_int64.extend([602, 702])
-  message.packed_uint32.extend([603, 703])
-  message.packed_uint64.extend([604, 704])
-  message.packed_sint32.extend([605, 705])
-  message.packed_sint64.extend([606, 706])
-  message.packed_fixed32.extend([607, 707])
-  message.packed_fixed64.extend([608, 708])
-  message.packed_sfixed32.extend([609, 709])
-  message.packed_sfixed64.extend([610, 710])
-  message.packed_float.extend([611.0, 711.0])
-  message.packed_double.extend([612.0, 712.0])
-  message.packed_bool.extend([True, False])
-  message.packed_enum.extend([unittest_pb2.FOREIGN_BAR,
-                              unittest_pb2.FOREIGN_BAZ])
-
-
-def SetAllPackedExtensions(message):
-  """Sets every extension in the message to a unique value.
-
-  Args:
-    message: A unittest_pb2.TestPackedExtensions instance.
-  """
-  extensions = message.Extensions
-  pb2 = unittest_pb2
-
-  extensions[pb2.packed_int32_extension].extend([601, 701])
-  extensions[pb2.packed_int64_extension].extend([602, 702])
-  extensions[pb2.packed_uint32_extension].extend([603, 703])
-  extensions[pb2.packed_uint64_extension].extend([604, 704])
-  extensions[pb2.packed_sint32_extension].extend([605, 705])
-  extensions[pb2.packed_sint64_extension].extend([606, 706])
-  extensions[pb2.packed_fixed32_extension].extend([607, 707])
-  extensions[pb2.packed_fixed64_extension].extend([608, 708])
-  extensions[pb2.packed_sfixed32_extension].extend([609, 709])
-  extensions[pb2.packed_sfixed64_extension].extend([610, 710])
-  extensions[pb2.packed_float_extension].extend([611.0, 711.0])
-  extensions[pb2.packed_double_extension].extend([612.0, 712.0])
-  extensions[pb2.packed_bool_extension].extend([True, False])
-  extensions[pb2.packed_enum_extension].extend([unittest_pb2.FOREIGN_BAR,
-                                                unittest_pb2.FOREIGN_BAZ])
-
-
-def SetAllUnpackedFields(message):
-  """Sets every field in the message to a unique value.
-
-  Args:
-    message: A unittest_pb2.TestUnpackedTypes instance.
-  """
-  message.unpacked_int32.extend([601, 701])
-  message.unpacked_int64.extend([602, 702])
-  message.unpacked_uint32.extend([603, 703])
-  message.unpacked_uint64.extend([604, 704])
-  message.unpacked_sint32.extend([605, 705])
-  message.unpacked_sint64.extend([606, 706])
-  message.unpacked_fixed32.extend([607, 707])
-  message.unpacked_fixed64.extend([608, 708])
-  message.unpacked_sfixed32.extend([609, 709])
-  message.unpacked_sfixed64.extend([610, 710])
-  message.unpacked_float.extend([611.0, 711.0])
-  message.unpacked_double.extend([612.0, 712.0])
-  message.unpacked_bool.extend([True, False])
-  message.unpacked_enum.extend([unittest_pb2.FOREIGN_BAR,
-                                unittest_pb2.FOREIGN_BAZ])
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_test.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_test.py
deleted file mode 100755
index 8267cd2..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_test.py
+++ /dev/null
@@ -1,619 +0,0 @@
-#! /usr/bin/python
-#
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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.
-
-"""Test for google.protobuf.text_format."""
-
-__author__ = 'kenton@google.com (Kenton Varda)'
-
-import difflib
-import re
-
-import unittest
-from google.protobuf import text_format
-from google.protobuf.internal import test_util
-from google.protobuf import unittest_pb2
-from google.protobuf import unittest_mset_pb2
-
-
-class TextFormatTest(unittest.TestCase):
-  def ReadGolden(self, golden_filename):
-    f = test_util.GoldenFile(golden_filename)
-    golden_lines = f.readlines()
-    f.close()
-    return golden_lines
-
-  def CompareToGoldenFile(self, text, golden_filename):
-    golden_lines = self.ReadGolden(golden_filename)
-    self.CompareToGoldenLines(text, golden_lines)
-
-  def CompareToGoldenText(self, text, golden_text):
-    self.CompareToGoldenLines(text, golden_text.splitlines(1))
-
-  def CompareToGoldenLines(self, text, golden_lines):
-    actual_lines = text.splitlines(1)
-    self.assertEqual(golden_lines, actual_lines,
-      "Text doesn't match golden.  Diff:\n" +
-      ''.join(difflib.ndiff(golden_lines, actual_lines)))
-
-  def testPrintAllFields(self):
-    message = unittest_pb2.TestAllTypes()
-    test_util.SetAllFields(message)
-    self.CompareToGoldenFile(
-      self.RemoveRedundantZeros(text_format.MessageToString(message)),
-      'text_format_unittest_data.txt')
-
-  def testPrintAllExtensions(self):
-    message = unittest_pb2.TestAllExtensions()
-    test_util.SetAllExtensions(message)
-    self.CompareToGoldenFile(
-      self.RemoveRedundantZeros(text_format.MessageToString(message)),
-      'text_format_unittest_extensions_data.txt')
-
-  def testPrintMessageSet(self):
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    message.message_set.Extensions[ext1].i = 23
-    message.message_set.Extensions[ext2].str = 'foo'
-    self.CompareToGoldenText(text_format.MessageToString(message),
-      'message_set {\n'
-      '  [protobuf_unittest.TestMessageSetExtension1] {\n'
-      '    i: 23\n'
-      '  }\n'
-      '  [protobuf_unittest.TestMessageSetExtension2] {\n'
-      '    str: \"foo\"\n'
-      '  }\n'
-      '}\n')
-
-  """
-  def testPrintBadEnumValue(self):
-    message = unittest_pb2.TestAllTypes()
-    message.optional_nested_enum = 100
-    message.optional_foreign_enum = 101
-    message.optional_import_enum = 102
-    self.CompareToGoldenText(
-        text_format.MessageToString(message),
-        'optional_nested_enum: 100\n'
-        'optional_foreign_enum: 101\n'
-        'optional_import_enum: 102\n')
-
-  def testPrintBadEnumValueExtensions(self):
-    message = unittest_pb2.TestAllExtensions()
-    message.Extensions[unittest_pb2.optional_nested_enum_extension] = 100
-    message.Extensions[unittest_pb2.optional_foreign_enum_extension] = 101
-    message.Extensions[unittest_pb2.optional_import_enum_extension] = 102
-    self.CompareToGoldenText(
-        text_format.MessageToString(message),
-        '[protobuf_unittest.optional_nested_enum_extension]: 100\n'
-        '[protobuf_unittest.optional_foreign_enum_extension]: 101\n'
-        '[protobuf_unittest.optional_import_enum_extension]: 102\n')
-  """
-
-  def testPrintExotic(self):
-    message = unittest_pb2.TestAllTypes()
-    message.repeated_int64.append(-9223372036854775808)
-    message.repeated_uint64.append(18446744073709551615)
-    message.repeated_double.append(123.456)
-    message.repeated_double.append(1.23e22)
-    message.repeated_double.append(1.23e-18)
-    message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
-    message.repeated_string.append(u'\u00fc\ua71f')
-    self.CompareToGoldenText(
-      self.RemoveRedundantZeros(text_format.MessageToString(message)),
-      'repeated_int64: -9223372036854775808\n'
-      'repeated_uint64: 18446744073709551615\n'
-      'repeated_double: 123.456\n'
-      'repeated_double: 1.23e+22\n'
-      'repeated_double: 1.23e-18\n'
-      'repeated_string: '
-        '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n'
-      'repeated_string: "\\303\\274\\352\\234\\237"\n')
-
-  def testPrintNestedMessageAsOneLine(self):
-    message = unittest_pb2.TestAllTypes()
-    msg = message.repeated_nested_message.add()
-    msg.bb = 42;
-    self.CompareToGoldenText(
-        text_format.MessageToString(message, as_one_line=True),
-        'repeated_nested_message { bb: 42 }')
-
-  def testPrintRepeatedFieldsAsOneLine(self):
-    message = unittest_pb2.TestAllTypes()
-    message.repeated_int32.append(1)
-    message.repeated_int32.append(1)
-    message.repeated_int32.append(3)
-    message.repeated_string.append("Google")
-    message.repeated_string.append("Zurich")
-    self.CompareToGoldenText(
-        text_format.MessageToString(message, as_one_line=True),
-        'repeated_int32: 1 repeated_int32: 1 repeated_int32: 3 '
-        'repeated_string: "Google" repeated_string: "Zurich"')
-
-  def testPrintNestedNewLineInStringAsOneLine(self):
-    message = unittest_pb2.TestAllTypes()
-    message.optional_string = "a\nnew\nline"
-    self.CompareToGoldenText(
-        text_format.MessageToString(message, as_one_line=True),
-        'optional_string: "a\\nnew\\nline"')
-
-  def testPrintMessageSetAsOneLine(self):
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    message.message_set.Extensions[ext1].i = 23
-    message.message_set.Extensions[ext2].str = 'foo'
-    self.CompareToGoldenText(
-        text_format.MessageToString(message, as_one_line=True),
-        'message_set {'
-        ' [protobuf_unittest.TestMessageSetExtension1] {'
-        ' i: 23'
-        ' }'
-        ' [protobuf_unittest.TestMessageSetExtension2] {'
-        ' str: \"foo\"'
-        ' }'
-        ' }')
-
-  def testPrintExoticAsOneLine(self):
-    message = unittest_pb2.TestAllTypes()
-    message.repeated_int64.append(-9223372036854775808)
-    message.repeated_uint64.append(18446744073709551615)
-    message.repeated_double.append(123.456)
-    message.repeated_double.append(1.23e22)
-    message.repeated_double.append(1.23e-18)
-    message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
-    message.repeated_string.append(u'\u00fc\ua71f')
-    self.CompareToGoldenText(
-      self.RemoveRedundantZeros(
-          text_format.MessageToString(message, as_one_line=True)),
-      'repeated_int64: -9223372036854775808'
-      ' repeated_uint64: 18446744073709551615'
-      ' repeated_double: 123.456'
-      ' repeated_double: 1.23e+22'
-      ' repeated_double: 1.23e-18'
-      ' repeated_string: '
-      '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""'
-      ' repeated_string: "\\303\\274\\352\\234\\237"')
-
-  def testRoundTripExoticAsOneLine(self):
-    message = unittest_pb2.TestAllTypes()
-    message.repeated_int64.append(-9223372036854775808)
-    message.repeated_uint64.append(18446744073709551615)
-    message.repeated_double.append(123.456)
-    message.repeated_double.append(1.23e22)
-    message.repeated_double.append(1.23e-18)
-    message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
-    message.repeated_string.append(u'\u00fc\ua71f')
-
-    # Test as_utf8 = False.
-    wire_text = text_format.MessageToString(
-        message, as_one_line=True, as_utf8=False)
-    parsed_message = unittest_pb2.TestAllTypes()
-    text_format.Merge(wire_text, parsed_message)
-    self.assertEquals(message, parsed_message)
-
-    # Test as_utf8 = True.
-    wire_text = text_format.MessageToString(
-        message, as_one_line=True, as_utf8=True)
-    parsed_message = unittest_pb2.TestAllTypes()
-    text_format.Merge(wire_text, parsed_message)
-    self.assertEquals(message, parsed_message)
-
-  def testPrintRawUtf8String(self):
-    message = unittest_pb2.TestAllTypes()
-    message.repeated_string.append(u'\u00fc\ua71f')
-    text = text_format.MessageToString(message, as_utf8 = True)
-    self.CompareToGoldenText(text, 'repeated_string: "\303\274\352\234\237"\n')
-    parsed_message = unittest_pb2.TestAllTypes()
-    text_format.Merge(text, parsed_message)
-    self.assertEquals(message, parsed_message)
-
-  def testMessageToString(self):
-    message = unittest_pb2.ForeignMessage()
-    message.c = 123
-    self.assertEqual('c: 123\n', str(message))
-
-  def RemoveRedundantZeros(self, text):
-    # Some platforms print 1e+5 as 1e+005.  This is fine, but we need to remove
-    # these zeros in order to match the golden file.
-    text = text.replace('e+0','e+').replace('e+0','e+') \
-               .replace('e-0','e-').replace('e-0','e-')
-    # Floating point fields are printed with .0 suffix even if they are
-    # actualy integer numbers.
-    text = re.compile('\.0$', re.MULTILINE).sub('', text)
-    return text
-
-  def testMergeGolden(self):
-    golden_text = '\n'.join(self.ReadGolden('text_format_unittest_data.txt'))
-    parsed_message = unittest_pb2.TestAllTypes()
-    text_format.Merge(golden_text, parsed_message)
-
-    message = unittest_pb2.TestAllTypes()
-    test_util.SetAllFields(message)
-    self.assertEquals(message, parsed_message)
-
-  def testMergeGoldenExtensions(self):
-    golden_text = '\n'.join(self.ReadGolden(
-        'text_format_unittest_extensions_data.txt'))
-    parsed_message = unittest_pb2.TestAllExtensions()
-    text_format.Merge(golden_text, parsed_message)
-
-    message = unittest_pb2.TestAllExtensions()
-    test_util.SetAllExtensions(message)
-    self.assertEquals(message, parsed_message)
-
-  def testMergeAllFields(self):
-    message = unittest_pb2.TestAllTypes()
-    test_util.SetAllFields(message)
-    ascii_text = text_format.MessageToString(message)
-
-    parsed_message = unittest_pb2.TestAllTypes()
-    text_format.Merge(ascii_text, parsed_message)
-    self.assertEqual(message, parsed_message)
-    test_util.ExpectAllFieldsSet(self, message)
-
-  def testMergeAllExtensions(self):
-    message = unittest_pb2.TestAllExtensions()
-    test_util.SetAllExtensions(message)
-    ascii_text = text_format.MessageToString(message)
-
-    parsed_message = unittest_pb2.TestAllExtensions()
-    text_format.Merge(ascii_text, parsed_message)
-    self.assertEqual(message, parsed_message)
-
-  def testMergeMessageSet(self):
-    message = unittest_pb2.TestAllTypes()
-    text = ('repeated_uint64: 1\n'
-            'repeated_uint64: 2\n')
-    text_format.Merge(text, message)
-    self.assertEqual(1, message.repeated_uint64[0])
-    self.assertEqual(2, message.repeated_uint64[1])
-
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    text = ('message_set {\n'
-            '  [protobuf_unittest.TestMessageSetExtension1] {\n'
-            '    i: 23\n'
-            '  }\n'
-            '  [protobuf_unittest.TestMessageSetExtension2] {\n'
-            '    str: \"foo\"\n'
-            '  }\n'
-            '}\n')
-    text_format.Merge(text, message)
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    self.assertEquals(23, message.message_set.Extensions[ext1].i)
-    self.assertEquals('foo', message.message_set.Extensions[ext2].str)
-
-  def testMergeExotic(self):
-    message = unittest_pb2.TestAllTypes()
-    text = ('repeated_int64: -9223372036854775808\n'
-            'repeated_uint64: 18446744073709551615\n'
-            'repeated_double: 123.456\n'
-            'repeated_double: 1.23e+22\n'
-            'repeated_double: 1.23e-18\n'
-            'repeated_string: \n'
-            '"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\\'\\""\n'
-            'repeated_string: "foo" \'corge\' "grault"\n'
-            'repeated_string: "\\303\\274\\352\\234\\237"\n'
-            'repeated_string: "\\xc3\\xbc"\n'
-            'repeated_string: "\xc3\xbc"\n')
-    text_format.Merge(text, message)
-
-    self.assertEqual(-9223372036854775808, message.repeated_int64[0])
-    self.assertEqual(18446744073709551615, message.repeated_uint64[0])
-    self.assertEqual(123.456, message.repeated_double[0])
-    self.assertEqual(1.23e22, message.repeated_double[1])
-    self.assertEqual(1.23e-18, message.repeated_double[2])
-    self.assertEqual(
-        '\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0])
-    self.assertEqual('foocorgegrault', message.repeated_string[1])
-    self.assertEqual(u'\u00fc\ua71f', message.repeated_string[2])
-    self.assertEqual(u'\u00fc', message.repeated_string[3])
-
-  def testMergeEmptyText(self):
-    message = unittest_pb2.TestAllTypes()
-    text = ''
-    text_format.Merge(text, message)
-    self.assertEquals(unittest_pb2.TestAllTypes(), message)
-
-  def testMergeInvalidUtf8(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'repeated_string: "\\xc3\\xc3"'
-    self.assertRaises(text_format.ParseError, text_format.Merge, text, message)
-
-  def testMergeSingleWord(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'foo'
-    self.assertRaisesWithMessage(
-        text_format.ParseError,
-        ('1:1 : Message type "protobuf_unittest.TestAllTypes" has no field named '
-         '"foo".'),
-        text_format.Merge, text, message)
-
-  def testMergeUnknownField(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'unknown_field: 8\n'
-    self.assertRaisesWithMessage(
-        text_format.ParseError,
-        ('1:1 : Message type "protobuf_unittest.TestAllTypes" has no field named '
-         '"unknown_field".'),
-        text_format.Merge, text, message)
-
-  def testMergeBadExtension(self):
-    message = unittest_pb2.TestAllExtensions()
-    text = '[unknown_extension]: 8\n'
-    self.assertRaises(
-        text_format.ParseError,
-        text_format.Merge, text, message)
-    message = unittest_pb2.TestAllTypes()
-    self.assertRaisesWithMessage(
-        text_format.ParseError,
-        ('1:2 : Message type "protobuf_unittest.TestAllTypes" does not have '
-         'extensions.'),
-        text_format.Merge, text, message)
-
-  def testMergeGroupNotClosed(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'RepeatedGroup: <'
-    self.assertRaisesWithMessage(
-        text_format.ParseError, '1:16 : Expected ">".',
-        text_format.Merge, text, message)
-
-    text = 'RepeatedGroup: {'
-    self.assertRaisesWithMessage(
-        text_format.ParseError, '1:16 : Expected "}".',
-        text_format.Merge, text, message)
-
-  def testMergeEmptyGroup(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'OptionalGroup: {}'
-    text_format.Merge(text, message)
-    self.assertTrue(message.HasField('optionalgroup'))
-
-    message.Clear()
-
-    message = unittest_pb2.TestAllTypes()
-    text = 'OptionalGroup: <>'
-    text_format.Merge(text, message)
-    self.assertTrue(message.HasField('optionalgroup'))
-
-  def testMergeBadEnumValue(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'optional_nested_enum: BARR'
-    self.assertRaisesWithMessage(
-        text_format.ParseError,
-        ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" '
-         'has no value named BARR.'),
-        text_format.Merge, text, message)
-
-    message = unittest_pb2.TestAllTypes()
-    text = 'optional_nested_enum: 100'
-    self.assertRaisesWithMessage(
-        text_format.ParseError,
-        ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" '
-         'has no value with number 100.'),
-        text_format.Merge, text, message)
-
-  def testMergeBadIntValue(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'optional_int32: bork'
-    self.assertRaisesWithMessage(
-        text_format.ParseError,
-        ('1:17 : Couldn\'t parse integer: bork'),
-        text_format.Merge, text, message)
-
-  def testMergeStringFieldUnescape(self):
-    message = unittest_pb2.TestAllTypes()
-    text = r'''repeated_string: "\xf\x62"
-               repeated_string: "\\xf\\x62"
-               repeated_string: "\\\xf\\\x62"
-               repeated_string: "\\\\xf\\\\x62"
-               repeated_string: "\\\\\xf\\\\\x62"
-               repeated_string: "\x5cx20"'''
-    text_format.Merge(text, message)
-
-    SLASH = '\\'
-    self.assertEqual('\x0fb', message.repeated_string[0])
-    self.assertEqual(SLASH + 'xf' + SLASH + 'x62', message.repeated_string[1])
-    self.assertEqual(SLASH + '\x0f' + SLASH + 'b', message.repeated_string[2])
-    self.assertEqual(SLASH + SLASH + 'xf' + SLASH + SLASH + 'x62',
-                     message.repeated_string[3])
-    self.assertEqual(SLASH + SLASH + '\x0f' + SLASH + SLASH + 'b',
-                     message.repeated_string[4])
-    self.assertEqual(SLASH + 'x20', message.repeated_string[5])
-
-  def assertRaisesWithMessage(self, e_class, e, func, *args, **kwargs):
-    """Same as assertRaises, but also compares the exception message."""
-    if hasattr(e_class, '__name__'):
-      exc_name = e_class.__name__
-    else:
-      exc_name = str(e_class)
-
-    try:
-      func(*args, **kwargs)
-    except e_class as expr:
-      if str(expr) != e:
-        msg = '%s raised, but with wrong message: "%s" instead of "%s"'
-        raise self.failureException(msg % (exc_name,
-                                           str(expr).encode('string_escape'),
-                                           e.encode('string_escape')))
-      return
-    else:
-      raise self.failureException('%s not raised' % exc_name)
-
-
-class TokenizerTest(unittest.TestCase):
-  """
-  def testSimpleTokenCases(self):
-    text = ('identifier1:"string1"\n     \n\n'
-            'identifier2 : \n \n123  \n  identifier3 :\'string\'\n'
-            'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\'aaaa\\\'bbbb\'\n'
-            'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n'
-            'ID9: 22 ID10: -111111111111111111 ID11: -22\n'
-            'ID12: 2222222222222222222 ID13: 1.23456f ID14: 1.2e+2f '
-            'false_bool:  0 true_BOOL:t \n true_bool1:  1 false_BOOL1:f ' )
-    tokenizer = text_format._Tokenizer(text)
-    methods = [(tokenizer.ConsumeIdentifier, 'identifier1'),
-               ':',
-               (tokenizer.ConsumeString, 'string1'),
-               (tokenizer.ConsumeIdentifier, 'identifier2'),
-               ':',
-               (tokenizer.ConsumeInt32, 123),
-               (tokenizer.ConsumeIdentifier, 'identifier3'),
-               ':',
-               (tokenizer.ConsumeString, 'string'),
-               (tokenizer.ConsumeIdentifier, 'identifiER_4'),
-               ':',
-               (tokenizer.ConsumeFloat, 1.1e+2),
-               (tokenizer.ConsumeIdentifier, 'ID5'),
-               ':',
-               (tokenizer.ConsumeFloat, -0.23),
-               (tokenizer.ConsumeIdentifier, 'ID6'),
-               ':',
-               (tokenizer.ConsumeString, 'aaaa\'bbbb'),
-               (tokenizer.ConsumeIdentifier, 'ID7'),
-               ':',
-               (tokenizer.ConsumeString, 'aa\"bb'),
-               (tokenizer.ConsumeIdentifier, 'ID8'),
-               ':',
-               '{',
-               (tokenizer.ConsumeIdentifier, 'A'),
-               ':',
-               (tokenizer.ConsumeFloat, float('inf')),
-               (tokenizer.ConsumeIdentifier, 'B'),
-               ':',
-               (tokenizer.ConsumeFloat, -float('inf')),
-               (tokenizer.ConsumeIdentifier, 'C'),
-               ':',
-               (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'D'),
-               ':',
-               (tokenizer.ConsumeBool, False),
-               '}',
-               (tokenizer.ConsumeIdentifier, 'ID9'),
-               ':',
-               (tokenizer.ConsumeUint32, 22),
-               (tokenizer.ConsumeIdentifier, 'ID10'),
-               ':',
-               (tokenizer.ConsumeInt64, -111111111111111111),
-               (tokenizer.ConsumeIdentifier, 'ID11'),
-               ':',
-               (tokenizer.ConsumeInt32, -22),
-               (tokenizer.ConsumeIdentifier, 'ID12'),
-               ':',
-               (tokenizer.ConsumeUint64, 2222222222222222222),
-               (tokenizer.ConsumeIdentifier, 'ID13'),
-               ':',
-               (tokenizer.ConsumeFloat, 1.23456),
-               (tokenizer.ConsumeIdentifier, 'ID14'),
-               ':',
-               (tokenizer.ConsumeFloat, 1.2e+2),
-               (tokenizer.ConsumeIdentifier, 'false_bool'),
-               ':',
-               (tokenizer.ConsumeBool, False),
-               (tokenizer.ConsumeIdentifier, 'true_BOOL'),
-               ':',
-               (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'true_bool1'),
-               ':',
-               (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'false_BOOL1'),
-               ':',
-               (tokenizer.ConsumeBool, False)]
-
-    i = 0
-    while not tokenizer.AtEnd():
-      m = methods[i]
-      if type(m) == str:
-        token = tokenizer.token
-        self.assertEqual(token, m)
-        tokenizer.NextToken()
-      else:
-        self.assertEqual(m[1], m[0]())
-      i += 1
-
-  def testConsumeIntegers(self):
-    # This test only tests the failures in the integer parsing methods as well
-    # as the '0' special cases.
-    int64_max = (1 << 63) - 1
-    uint32_max = (1 << 32) - 1
-    text = '-1 %d %d' % (uint32_max + 1, int64_max + 1)
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64)
-    self.assertEqual(-1, tokenizer.ConsumeInt32())
-
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32)
-    self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64())
-
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64)
-    self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64())
-    self.assertTrue(tokenizer.AtEnd())
-
-    text = '-0 -0 0 0'
-    tokenizer = text_format._Tokenizer(text)
-    self.assertEqual(0, tokenizer.ConsumeUint32())
-    self.assertEqual(0, tokenizer.ConsumeUint64())
-    self.assertEqual(0, tokenizer.ConsumeUint32())
-    self.assertEqual(0, tokenizer.ConsumeUint64())
-    self.assertTrue(tokenizer.AtEnd())
-    """
-
-  def testConsumeByteString(self):
-    text = '"string1\''
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
-
-    text = 'string1"'
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
-
-    text = '\n"\\xt"'
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
-
-    text = '\n"\\"'
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
-
-    text = '\n"\\x"'
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
-
-  def testConsumeBool(self):
-    text = 'not-a-bool'
-    tokenizer = text_format._Tokenizer(text)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_unittest_data.txt b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_unittest_data.txt
deleted file mode 100644
index bbe5882..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_unittest_data.txt
+++ /dev/null
@@ -1,128 +0,0 @@
-optional_int32: 101
-optional_int64: 102
-optional_uint32: 103
-optional_uint64: 104
-optional_sint32: 105
-optional_sint64: 106
-optional_fixed32: 107
-optional_fixed64: 108
-optional_sfixed32: 109
-optional_sfixed64: 110
-optional_float: 111
-optional_double: 112
-optional_bool: true
-optional_string: "115"
-optional_bytes: "116"
-OptionalGroup {
-  a: 117
-}
-optional_nested_message {
-  bb: 118
-}
-optional_foreign_message {
-  c: 119
-}
-optional_import_message {
-  d: 120
-}
-optional_nested_enum: BAZ
-optional_foreign_enum: FOREIGN_BAZ
-optional_import_enum: IMPORT_BAZ
-optional_string_piece: "124"
-optional_cord: "125"
-optional_public_import_message {
-  e: 126
-}
-optional_lazy_message {
-  bb: 127
-}
-repeated_int32: 201
-repeated_int32: 301
-repeated_int64: 202
-repeated_int64: 302
-repeated_uint32: 203
-repeated_uint32: 303
-repeated_uint64: 204
-repeated_uint64: 304
-repeated_sint32: 205
-repeated_sint32: 305
-repeated_sint64: 206
-repeated_sint64: 306
-repeated_fixed32: 207
-repeated_fixed32: 307
-repeated_fixed64: 208
-repeated_fixed64: 308
-repeated_sfixed32: 209
-repeated_sfixed32: 309
-repeated_sfixed64: 210
-repeated_sfixed64: 310
-repeated_float: 211
-repeated_float: 311
-repeated_double: 212
-repeated_double: 312
-repeated_bool: true
-repeated_bool: false
-repeated_string: "215"
-repeated_string: "315"
-repeated_bytes: "216"
-repeated_bytes: "316"
-RepeatedGroup {
-  a: 217
-}
-RepeatedGroup {
-  a: 317
-}
-repeated_nested_message {
-  bb: 218
-}
-repeated_nested_message {
-  bb: 318
-}
-repeated_foreign_message {
-  c: 219
-}
-repeated_foreign_message {
-  c: 319
-}
-repeated_import_message {
-  d: 220
-}
-repeated_import_message {
-  d: 320
-}
-repeated_nested_enum: BAR
-repeated_nested_enum: BAZ
-repeated_foreign_enum: FOREIGN_BAR
-repeated_foreign_enum: FOREIGN_BAZ
-repeated_import_enum: IMPORT_BAR
-repeated_import_enum: IMPORT_BAZ
-repeated_string_piece: "224"
-repeated_string_piece: "324"
-repeated_cord: "225"
-repeated_cord: "325"
-repeated_lazy_message {
-  bb: 227
-}
-repeated_lazy_message {
-  bb: 327
-}
-default_int32: 401
-default_int64: 402
-default_uint32: 403
-default_uint64: 404
-default_sint32: 405
-default_sint64: 406
-default_fixed32: 407
-default_fixed64: 408
-default_sfixed32: 409
-default_sfixed64: 410
-default_float: 411
-default_double: 412
-default_bool: false
-default_string: "415"
-default_bytes: "416"
-default_nested_enum: FOO
-default_foreign_enum: FOREIGN_FOO
-default_import_enum: IMPORT_FOO
-default_string_piece: "424"
-default_cord: "425"
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_unittest_extensions_data.txt b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_unittest_extensions_data.txt
deleted file mode 100644
index 0a217f0..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/text_format_unittest_extensions_data.txt
+++ /dev/null
@@ -1,128 +0,0 @@
-[protobuf_unittest.optional_int32_extension]: 101
-[protobuf_unittest.optional_int64_extension]: 102
-[protobuf_unittest.optional_uint32_extension]: 103
-[protobuf_unittest.optional_uint64_extension]: 104
-[protobuf_unittest.optional_sint32_extension]: 105
-[protobuf_unittest.optional_sint64_extension]: 106
-[protobuf_unittest.optional_fixed32_extension]: 107
-[protobuf_unittest.optional_fixed64_extension]: 108
-[protobuf_unittest.optional_sfixed32_extension]: 109
-[protobuf_unittest.optional_sfixed64_extension]: 110
-[protobuf_unittest.optional_float_extension]: 111
-[protobuf_unittest.optional_double_extension]: 112
-[protobuf_unittest.optional_bool_extension]: true
-[protobuf_unittest.optional_string_extension]: "115"
-[protobuf_unittest.optional_bytes_extension]: "116"
-[protobuf_unittest.optionalgroup_extension] {
-  a: 117
-}
-[protobuf_unittest.optional_nested_message_extension] {
-  bb: 118
-}
-[protobuf_unittest.optional_foreign_message_extension] {
-  c: 119
-}
-[protobuf_unittest.optional_import_message_extension] {
-  d: 120
-}
-[protobuf_unittest.optional_nested_enum_extension]: BAZ
-[protobuf_unittest.optional_foreign_enum_extension]: FOREIGN_BAZ
-[protobuf_unittest.optional_import_enum_extension]: IMPORT_BAZ
-[protobuf_unittest.optional_string_piece_extension]: "124"
-[protobuf_unittest.optional_cord_extension]: "125"
-[protobuf_unittest.optional_public_import_message_extension] {
-  e: 126
-}
-[protobuf_unittest.optional_lazy_message_extension] {
-  bb: 127
-}
-[protobuf_unittest.repeated_int32_extension]: 201
-[protobuf_unittest.repeated_int32_extension]: 301
-[protobuf_unittest.repeated_int64_extension]: 202
-[protobuf_unittest.repeated_int64_extension]: 302
-[protobuf_unittest.repeated_uint32_extension]: 203
-[protobuf_unittest.repeated_uint32_extension]: 303
-[protobuf_unittest.repeated_uint64_extension]: 204
-[protobuf_unittest.repeated_uint64_extension]: 304
-[protobuf_unittest.repeated_sint32_extension]: 205
-[protobuf_unittest.repeated_sint32_extension]: 305
-[protobuf_unittest.repeated_sint64_extension]: 206
-[protobuf_unittest.repeated_sint64_extension]: 306
-[protobuf_unittest.repeated_fixed32_extension]: 207
-[protobuf_unittest.repeated_fixed32_extension]: 307
-[protobuf_unittest.repeated_fixed64_extension]: 208
-[protobuf_unittest.repeated_fixed64_extension]: 308
-[protobuf_unittest.repeated_sfixed32_extension]: 209
-[protobuf_unittest.repeated_sfixed32_extension]: 309
-[protobuf_unittest.repeated_sfixed64_extension]: 210
-[protobuf_unittest.repeated_sfixed64_extension]: 310
-[protobuf_unittest.repeated_float_extension]: 211
-[protobuf_unittest.repeated_float_extension]: 311
-[protobuf_unittest.repeated_double_extension]: 212
-[protobuf_unittest.repeated_double_extension]: 312
-[protobuf_unittest.repeated_bool_extension]: true
-[protobuf_unittest.repeated_bool_extension]: false
-[protobuf_unittest.repeated_string_extension]: "215"
-[protobuf_unittest.repeated_string_extension]: "315"
-[protobuf_unittest.repeated_bytes_extension]: "216"
-[protobuf_unittest.repeated_bytes_extension]: "316"
-[protobuf_unittest.repeatedgroup_extension] {
-  a: 217
-}
-[protobuf_unittest.repeatedgroup_extension] {
-  a: 317
-}
-[protobuf_unittest.repeated_nested_message_extension] {
-  bb: 218
-}
-[protobuf_unittest.repeated_nested_message_extension] {
-  bb: 318
-}
-[protobuf_unittest.repeated_foreign_message_extension] {
-  c: 219
-}
-[protobuf_unittest.repeated_foreign_message_extension] {
-  c: 319
-}
-[protobuf_unittest.repeated_import_message_extension] {
-  d: 220
-}
-[protobuf_unittest.repeated_import_message_extension] {
-  d: 320
-}
-[protobuf_unittest.repeated_nested_enum_extension]: BAR
-[protobuf_unittest.repeated_nested_enum_extension]: BAZ
-[protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAR
-[protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAZ
-[protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAR
-[protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAZ
-[protobuf_unittest.repeated_string_piece_extension]: "224"
-[protobuf_unittest.repeated_string_piece_extension]: "324"
-[protobuf_unittest.repeated_cord_extension]: "225"
-[protobuf_unittest.repeated_cord_extension]: "325"
-[protobuf_unittest.repeated_lazy_message_extension] {
-  bb: 227
-}
-[protobuf_unittest.repeated_lazy_message_extension] {
-  bb: 327
-}
-[protobuf_unittest.default_int32_extension]: 401
-[protobuf_unittest.default_int64_extension]: 402
-[protobuf_unittest.default_uint32_extension]: 403
-[protobuf_unittest.default_uint64_extension]: 404
-[protobuf_unittest.default_sint32_extension]: 405
-[protobuf_unittest.default_sint64_extension]: 406
-[protobuf_unittest.default_fixed32_extension]: 407
-[protobuf_unittest.default_fixed64_extension]: 408
-[protobuf_unittest.default_sfixed32_extension]: 409
-[protobuf_unittest.default_sfixed64_extension]: 410
-[protobuf_unittest.default_float_extension]: 411
-[protobuf_unittest.default_double_extension]: 412
-[protobuf_unittest.default_bool_extension]: false
-[protobuf_unittest.default_string_extension]: "415"
-[protobuf_unittest.default_bytes_extension]: "416"
-[protobuf_unittest.default_nested_enum_extension]: FOO
-[protobuf_unittest.default_foreign_enum_extension]: FOREIGN_FOO
-[protobuf_unittest.default_import_enum_extension]: IMPORT_FOO
-[protobuf_unittest.default_string_piece_extension]: "424"
-[protobuf_unittest.default_cord_extension]: "425"
diff --git a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/wire_format_test.py b/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/wire_format_test.py
deleted file mode 100755
index 7600778..0000000
--- a/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/wire_format_test.py
+++ /dev/null
@@ -1,253 +0,0 @@
-#! /usr/bin/python
-#
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# http://code.google.com/p/protobuf/
-#
-# 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.
-
-"""Test for google.protobuf.internal.wire_format."""
-
-__author__ = 'robinson@google.com (Will Robinson)'
-
-import unittest
-from google.protobuf import message
-from google.protobuf.internal import wire_format
-
-
-class WireFormatTest(unittest.TestCase):
-
-  def testPackTag(self):
-    field_number = 0xabc
-    tag_type = 2
-    self.assertEqual((field_number << 3) | tag_type,
-                     wire_format.PackTag(field_number, tag_type))
-    PackTag = wire_format.PackTag
-    # Number too high.
-    self.assertRaises(message.EncodeError, PackTag, field_number, 6)
-    # Number too low.
-    self.assertRaises(message.EncodeError, PackTag, field_number, -1)
-
-  def testUnpackTag(self):
-    # Test field numbers that will require various varint sizes.
-    for expected_field_number in (1, 15, 16, 2047, 2048):
-      for expected_wire_type in range(6):  # Highest-numbered wiretype is 5.
-        field_number, wire_type = wire_format.UnpackTag(
-            wire_format.PackTag(expected_field_number, expected_wire_type))
-        self.assertEqual(expected_field_number, field_number)
-        self.assertEqual(expected_wire_type, wire_type)
-
-    self.assertRaises(TypeError, wire_format.UnpackTag, None)
-    self.assertRaises(TypeError, wire_format.UnpackTag, 'abc')
-    self.assertRaises(TypeError, wire_format.UnpackTag, 0.0)
-    self.assertRaises(TypeError, wire_format.UnpackTag, object())
-
-  def testZigZagEncode(self):
-    Z = wire_format.ZigZagEncode
-    self.assertEqual(0, Z(0))
-    self.assertEqual(1, Z(-1))
-    self.assertEqual(2, Z(1))
-    self.assertEqual(3, Z(-2))
-    self.assertEqual(4, Z(2))
-    self.assertEqual(0xfffffffe, Z(0x7fffffff))
-    self.assertEqual(0xffffffff, Z(-0x80000000))
-    self.assertEqual(0xfffffffffffffffe, Z(0x7fffffffffffffff))
-    self.assertEqual(0xffffffffffffffff, Z(-0x8000000000000000))
-
-    self.assertRaises(TypeError, Z, None)
-    self.assertRaises(TypeError, Z, 'abcd')
-    self.assertRaises(TypeError, Z, 0.0)
-    self.assertRaises(TypeError, Z, object())
-
-  def testZigZagDecode(self):
-    Z = wire_format.ZigZagDecode
-    self.assertEqual(0, Z(0))
-    self.assertEqual(-1, Z(1))
-    self.assertEqual(1, Z(2))
-    self.assertEqual(-2, Z(3))
-    self.assertEqual(2, Z(4))
-    self.assertEqual(0x7fffffff, Z(0xfffffffe))
-    self.assertEqual(-0x80000000, Z(0xffffffff))
-    self.assertEqual(0x7fffffffffffffff, Z(0xfffffffffffffffe))
-    self.assertEqual(-0x8000000000000000, Z(0xffffffffffffffff))
-
-    self.assertRaises(TypeError, Z, None)
-    self.assertRaises(TypeError, Z, 'abcd')
-    self.assertRaises(TypeError, Z, 0.0)
-    self.assertRaises(TypeError, Z, object())
-
-  def NumericByteSizeTestHelper(self, byte_size_fn, value, expected_value_size):
-    # Use field numbers that cause various byte sizes for the tag information.
-    for field_number, tag_bytes in ((15, 1), (16, 2), (2047, 2), (2048, 3)):
-      expected_size = expected_value_size + tag_bytes
-      actual_size = byte_size_fn(field_number, value)
-      self.assertEqual(expected_size, actual_size,
-                       'byte_size_fn: %s, field_number: %d, value: %r\n'
-                       'Expected: %d, Actual: %d'% (
-          byte_size_fn, field_number, value, expected_size, actual_size))
-
-  def testByteSizeFunctions(self):
-    # Test all numeric *ByteSize() functions.
-    NUMERIC_ARGS = [
-        # Int32ByteSize().
-        [wire_format.Int32ByteSize, 0, 1],
-        [wire_format.Int32ByteSize, 127, 1],
-        [wire_format.Int32ByteSize, 128, 2],
-        [wire_format.Int32ByteSize, -1, 10],
-        # Int64ByteSize().
-        [wire_format.Int64ByteSize, 0, 1],
-        [wire_format.Int64ByteSize, 127, 1],
-        [wire_format.Int64ByteSize, 128, 2],
-        [wire_format.Int64ByteSize, -1, 10],
-        # UInt32ByteSize().
-        [wire_format.UInt32ByteSize, 0, 1],
-        [wire_format.UInt32ByteSize, 127, 1],
-        [wire_format.UInt32ByteSize, 128, 2],
-        [wire_format.UInt32ByteSize, wire_format.UINT32_MAX, 5],
-        # UInt64ByteSize().
-        [wire_format.UInt64ByteSize, 0, 1],
-        [wire_format.UInt64ByteSize, 127, 1],
-        [wire_format.UInt64ByteSize, 128, 2],
-        [wire_format.UInt64ByteSize, wire_format.UINT64_MAX, 10],
-        # SInt32ByteSize().
-        [wire_format.SInt32ByteSize, 0, 1],
-        [wire_format.SInt32ByteSize, -1, 1],
-        [wire_format.SInt32ByteSize, 1, 1],
-        [wire_format.SInt32ByteSize, -63, 1],
-        [wire_format.SInt32ByteSize, 63, 1],
-        [wire_format.SInt32ByteSize, -64, 1],
-        [wire_format.SInt32ByteSize, 64, 2],
-        # SInt64ByteSize().
-        [wire_format.SInt64ByteSize, 0, 1],
-        [wire_format.SInt64ByteSize, -1, 1],
-        [wire_format.SInt64ByteSize, 1, 1],
-        [wire_format.SInt64ByteSize, -63, 1],
-        [wire_format.SInt64ByteSize, 63, 1],
-        [wire_format.SInt64ByteSize, -64, 1],
-        [wire_format.SInt64ByteSize, 64, 2],
-        # Fixed32ByteSize().
-        [wire_format.Fixed32ByteSize, 0, 4],
-        [wire_format.Fixed32ByteSize, wire_format.UINT32_MAX, 4],
-        # Fixed64ByteSize().
-        [wire_format.Fixed64ByteSize, 0, 8],
-        [wire_format.Fixed64ByteSize, wire_format.UINT64_MAX, 8],
-        # SFixed32ByteSize().
-        [wire_format.SFixed32ByteSize, 0, 4],
-        [wire_format.SFixed32ByteSize, wire_format.INT32_MIN, 4],
-        [wire_format.SFixed32ByteSize, wire_format.INT32_MAX, 4],
-        # SFixed64ByteSize().
-        [wire_format.SFixed64ByteSize, 0, 8],
-        [wire_format.SFixed64ByteSize, wire_format.INT64_MIN, 8],
-        [wire_format.SFixed64ByteSize, wire_format.INT64_MAX, 8],
-        # FloatByteSize().
-        [wire_format.FloatByteSize, 0.0, 4],
-        [wire_format.FloatByteSize, 1000000000.0, 4],
-        [wire_format.FloatByteSize, -1000000000.0, 4],
-        # DoubleByteSize().
-        [wire_format.DoubleByteSize, 0.0, 8],
-        [wire_format.DoubleByteSize, 1000000000.0, 8],
-        [wire_format.DoubleByteSize, -1000000000.0, 8],
-        # BoolByteSize().
-        [wire_format.BoolByteSize, False, 1],
-        [wire_format.BoolByteSize, True, 1],
-        # EnumByteSize().
-        [wire_format.EnumByteSize, 0, 1],
-        [wire_format.EnumByteSize, 127, 1],
-        [wire_format.EnumByteSize, 128, 2],
-        [wire_format.EnumByteSize, wire_format.UINT32_MAX, 5],
-        ]
-    for args in NUMERIC_ARGS:
-      self.NumericByteSizeTestHelper(*args)
-
-    # Test strings and bytes.
-    for byte_size_fn in (wire_format.StringByteSize, wire_format.BytesByteSize):
-      # 1 byte for tag, 1 byte for length, 3 bytes for contents.
-      self.assertEqual(5, byte_size_fn(10, 'abc'))
-      # 2 bytes for tag, 1 byte for length, 3 bytes for contents.
-      self.assertEqual(6, byte_size_fn(16, 'abc'))
-      # 2 bytes for tag, 2 bytes for length, 128 bytes for contents.
-      self.assertEqual(132, byte_size_fn(16, 'a' * 128))
-
-    # Test UTF-8 string byte size calculation.
-    # 1 byte for tag, 1 byte for length, 8 bytes for content.
-    self.assertEqual(10, wire_format.StringByteSize(
-        5, unicode('\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', 'utf-8')))
-
-    class MockMessage(object):
-      def __init__(self, byte_size):
-        self.byte_size = byte_size
-      def ByteSize(self):
-        return self.byte_size
-
-    message_byte_size = 10
-    mock_message = MockMessage(byte_size=message_byte_size)
-    # Test groups.
-    # (2 * 1) bytes for begin and end tags, plus message_byte_size.
-    self.assertEqual(2 + message_byte_size,
-                     wire_format.GroupByteSize(1, mock_message))
-    # (2 * 2) bytes for begin and end tags, plus message_byte_size.
-    self.assertEqual(4 + message_byte_size,
-                     wire_format.GroupByteSize(16, mock_message))
-
-    # Test messages.
-    # 1 byte for tag, plus 1 byte for length, plus contents.
-    self.assertEqual(2 + mock_message.byte_size,
-                     wire_format.MessageByteSize(1, mock_message))
-    # 2 bytes for tag, plus 1 byte for length, plus contents.
-    self.assertEqual(3 + mock_message.byte_size,
-                     wire_format.MessageByteSize(16, mock_message))
-    # 2 bytes for tag, plus 2 bytes for length, plus contents.
-    mock_message.byte_size = 128
-    self.assertEqual(4 + mock_message.byte_size,
-                     wire_format.MessageByteSize(16, mock_message))
-
-
-    # Test message set item byte size.
-    # 4 bytes for tags, plus 1 byte for length, plus 1 byte for type_id,
-    # plus contents.
-    mock_message.byte_size = 10
-    self.assertEqual(mock_message.byte_size + 6,
-                     wire_format.MessageSetItemByteSize(1, mock_message))
-
-    # 4 bytes for tags, plus 2 bytes for length, plus 1 byte for type_id,
-    # plus contents.
-    mock_message.byte_size = 128
-    self.assertEqual(mock_message.byte_size + 7,
-                     wire_format.MessageSetItemByteSize(1, mock_message))
-
-    # 4 bytes for tags, plus 2 bytes for length, plus 2 byte for type_id,
-    # plus contents.
-    self.assertEqual(mock_message.byte_size + 8,
-                     wire_format.MessageSetItemByteSize(128, mock_message))
-
-    # Too-long varint.
-    self.assertRaises(message.EncodeError,
-                      wire_format.UInt64ByteSize, 1, 1 << 128)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/python/google/protobuf/__init__.py b/python/google/protobuf/__init__.py
index d436072..2a3c677 100755
--- a/python/google/protobuf/__init__.py
+++ b/python/google/protobuf/__init__.py
@@ -30,7 +30,7 @@
 
 # Copyright 2007 Google Inc. All Rights Reserved.
 
-__version__ = '3.5.2'
+__version__ = '3.0.0b3'
 
 if __name__ != '__main__':
   try:
diff --git a/python/google/protobuf/descriptor.py b/python/google/protobuf/descriptor.py
index b1f3ca3..3209b34 100755
--- a/python/google/protobuf/descriptor.py
+++ b/python/google/protobuf/descriptor.py
@@ -171,6 +171,13 @@
     self._serialized_start = serialized_start
     self._serialized_end = serialized_end
 
+  def GetTopLevelContainingType(self):
+    """Returns the root if this is a nested type, or itself if its the root."""
+    desc = self
+    while desc.containing_type is not None:
+      desc = desc.containing_type
+    return desc
+
   def CopyToProto(self, proto):
     """Copies this to the matching proto in descriptor_pb2.
 
@@ -251,7 +258,7 @@
     def __new__(cls, name, full_name, filename, containing_type, fields,
                 nested_types, enum_types, extensions, options=None,
                 is_extendable=True, extension_ranges=None, oneofs=None,
-                file=None, serialized_start=None, serialized_end=None,  # pylint: disable=redefined-builtin
+                file=None, serialized_start=None, serialized_end=None,
                 syntax=None):
       _message.Message._CheckCalledFromGeneratedFile()
       return _message.default_pool.FindMessageTypeByName(full_name)
@@ -262,8 +269,8 @@
   def __init__(self, name, full_name, filename, containing_type, fields,
                nested_types, enum_types, extensions, options=None,
                is_extendable=True, extension_ranges=None, oneofs=None,
-               file=None, serialized_start=None, serialized_end=None,  # pylint: disable=redefined-builtin
-               syntax=None):
+               file=None, serialized_start=None, serialized_end=None,
+               syntax=None):  # pylint:disable=redefined-builtin
     """Arguments to __init__() are as described in the description
     of Descriptor fields above.
 
@@ -342,7 +349,7 @@
     Args:
       proto: An empty descriptor_pb2.DescriptorProto.
     """
-    # This function is overridden to give a better doc comment.
+    # This function is overriden to give a better doc comment.
     super(Descriptor, self).CopyToProto(proto)
 
 
@@ -406,8 +413,6 @@
 
     containing_oneof: (OneofDescriptor) If the field is a member of a oneof
       union, contains its descriptor. Otherwise, None.
-
-    file: (FileDescriptor) Reference to file descriptor.
   """
 
   # Must be consistent with C++ FieldDescriptor::Type enum in
@@ -492,8 +497,7 @@
     def __new__(cls, name, full_name, index, number, type, cpp_type, label,
                 default_value, message_type, enum_type, containing_type,
                 is_extension, extension_scope, options=None,
-                has_default_value=True, containing_oneof=None, json_name=None,
-                file=None):
+                has_default_value=True, containing_oneof=None):
       _message.Message._CheckCalledFromGeneratedFile()
       if is_extension:
         return _message.default_pool.FindExtensionByName(full_name)
@@ -503,8 +507,7 @@
   def __init__(self, name, full_name, index, number, type, cpp_type, label,
                default_value, message_type, enum_type, containing_type,
                is_extension, extension_scope, options=None,
-               has_default_value=True, containing_oneof=None, json_name=None,
-               file=None):
+               has_default_value=True, containing_oneof=None):
     """The arguments are as described in the description of FieldDescriptor
     attributes above.
 
@@ -515,12 +518,7 @@
     super(FieldDescriptor, self).__init__(options, 'FieldOptions')
     self.name = name
     self.full_name = full_name
-    self.file = file
     self._camelcase_name = None
-    if json_name is None:
-      self.json_name = _ToJsonName(name)
-    else:
-      self.json_name = json_name
     self.index = index
     self.number = number
     self.type = type
@@ -628,7 +626,7 @@
     Args:
       proto: An empty descriptor_pb2.EnumDescriptorProto.
     """
-    # This function is overridden to give a better doc comment.
+    # This function is overriden to give a better doc comment.
     super(EnumDescriptor, self).CopyToProto(proto)
 
 
@@ -667,7 +665,7 @@
     self.type = type
 
 
-class OneofDescriptor(DescriptorBase):
+class OneofDescriptor(object):
   """Descriptor for a oneof field.
 
     name: (str) Name of the oneof field.
@@ -684,15 +682,12 @@
   if _USE_C_DESCRIPTORS:
     _C_DESCRIPTOR_CLASS = _message.OneofDescriptor
 
-    def __new__(
-        cls, name, full_name, index, containing_type, fields, options=None):
+    def __new__(cls, name, full_name, index, containing_type, fields):
       _message.Message._CheckCalledFromGeneratedFile()
       return _message.default_pool.FindOneofByName(full_name)
 
-  def __init__(
-      self, name, full_name, index, containing_type, fields, options=None):
+  def __init__(self, name, full_name, index, containing_type, fields):
     """Arguments are as described in the attribute description above."""
-    super(OneofDescriptor, self).__init__(options, 'OneofOptions')
     self.name = name
     self.full_name = full_name
     self.index = index
@@ -710,22 +705,11 @@
       definition appears withing the .proto file.
     methods: (list of MethodDescriptor) List of methods provided by this
       service.
-    methods_by_name: (dict str -> MethodDescriptor) Same MethodDescriptor
-      objects as in |methods_by_name|, but indexed by "name" attribute in each
-      MethodDescriptor.
     options: (descriptor_pb2.ServiceOptions) Service options message or
       None to use default service options.
     file: (FileDescriptor) Reference to file info.
   """
 
-  if _USE_C_DESCRIPTORS:
-    _C_DESCRIPTOR_CLASS = _message.ServiceDescriptor
-
-    def __new__(cls, name, full_name, index, methods, options=None, file=None,  # pylint: disable=redefined-builtin
-                serialized_start=None, serialized_end=None):
-      _message.Message._CheckCalledFromGeneratedFile()  # pylint: disable=protected-access
-      return _message.default_pool.FindServiceByName(full_name)
-
   def __init__(self, name, full_name, index, methods, options=None, file=None,
                serialized_start=None, serialized_end=None):
     super(ServiceDescriptor, self).__init__(
@@ -734,14 +718,16 @@
         serialized_end=serialized_end)
     self.index = index
     self.methods = methods
-    self.methods_by_name = dict((m.name, m) for m in methods)
     # Set the containing service for each method in this service.
     for method in self.methods:
       method.containing_service = self
 
   def FindMethodByName(self, name):
     """Searches for the specified method, and returns its descriptor."""
-    return self.methods_by_name.get(name, None)
+    for method in self.methods:
+      if name == method.name:
+        return method
+    return None
 
   def CopyToProto(self, proto):
     """Copies this to a descriptor_pb2.ServiceDescriptorProto.
@@ -749,7 +735,7 @@
     Args:
       proto: An empty descriptor_pb2.ServiceDescriptorProto.
     """
-    # This function is overridden to give a better doc comment.
+    # This function is overriden to give a better doc comment.
     super(ServiceDescriptor, self).CopyToProto(proto)
 
 
@@ -768,14 +754,6 @@
     None to use default method options.
   """
 
-  if _USE_C_DESCRIPTORS:
-    _C_DESCRIPTOR_CLASS = _message.MethodDescriptor
-
-    def __new__(cls, name, full_name, index, containing_service,
-                input_type, output_type, options=None):
-      _message.Message._CheckCalledFromGeneratedFile()  # pylint: disable=protected-access
-      return _message.default_pool.FindMethodByName(full_name)
-
   def __init__(self, name, full_name, index, containing_service,
                input_type, output_type, options=None):
     """The arguments are as described in the description of MethodDescriptor
@@ -810,7 +788,6 @@
   message_types_by_name: Dict of message names of their descriptors.
   enum_types_by_name: Dict of enum names and their descriptors.
   extensions_by_name: Dict of extension names and their descriptors.
-  services_by_name: Dict of services names and their descriptors.
   pool: the DescriptorPool this descriptor belongs to.  When not passed to the
     constructor, the global default pool is used.
   """
@@ -848,7 +825,6 @@
 
     self.enum_types_by_name = {}
     self.extensions_by_name = {}
-    self.services_by_name = {}
     self.dependencies = (dependencies or [])
     self.public_dependencies = (public_dependencies or [])
 
@@ -896,31 +872,6 @@
   return ''.join(result)
 
 
-def _OptionsOrNone(descriptor_proto):
-  """Returns the value of the field `options`, or None if it is not set."""
-  if descriptor_proto.HasField('options'):
-    return descriptor_proto.options
-  else:
-    return None
-
-
-def _ToJsonName(name):
-  """Converts name to Json name and returns it."""
-  capitalize_next = False
-  result = []
-
-  for c in name:
-    if c == '_':
-      capitalize_next = True
-    elif capitalize_next:
-      result.append(c.upper())
-      capitalize_next = False
-    else:
-      result += c
-
-  return ''.join(result)
-
-
 def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True,
                    syntax=None):
   """Make a protobuf Descriptor given a DescriptorProto protobuf.
@@ -997,10 +948,6 @@
     full_name = '.'.join(full_message_name + [field_proto.name])
     enum_desc = None
     nested_desc = None
-    if field_proto.json_name:
-      json_name = field_proto.json_name
-    else:
-      json_name = None
     if field_proto.HasField('type_name'):
       type_name = field_proto.type_name
       full_type_name = '.'.join(full_message_name +
@@ -1015,11 +962,10 @@
         field_proto.number, field_proto.type,
         FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type),
         field_proto.label, None, nested_desc, enum_desc, None, False, None,
-        options=_OptionsOrNone(field_proto), has_default_value=False,
-        json_name=json_name)
+        options=field_proto.options, has_default_value=False)
     fields.append(field)
 
   desc_name = '.'.join(full_message_name)
   return Descriptor(desc_proto.name, desc_name, None, None, fields,
                     list(nested_types.values()), list(enum_types.values()), [],
-                    options=_OptionsOrNone(desc_proto))
+                    options=desc_proto.options)
diff --git a/python/google/protobuf/descriptor_database.py b/python/google/protobuf/descriptor_database.py
index b8f5140..1333f99 100644
--- a/python/google/protobuf/descriptor_database.py
+++ b/python/google/protobuf/descriptor_database.py
@@ -54,9 +54,9 @@
     Args:
       file_desc_proto: The FileDescriptorProto to add.
     Raises:
-      DescriptorDatabaseConflictingDefinitionError: if an attempt is made to
-        add a proto with the same name but different definition than an
-        exisiting proto in the database.
+      DescriptorDatabaseException: if an attempt is made to add a proto
+        with the same name but different definition than an exisiting
+        proto in the database.
     """
     proto_name = file_desc_proto.name
     if proto_name not in self._file_desc_protos_by_file:
@@ -65,7 +65,7 @@
       raise DescriptorDatabaseConflictingDefinitionError(
           '%s already added, but with different descriptor.' % proto_name)
 
-    # Add all the top-level descriptors to the index.
+    # Add the top-level Message, Enum and Extension descriptors to the index.
     package = file_desc_proto.package
     for message in file_desc_proto.message_type:
       self._file_desc_protos_by_symbol.update(
@@ -76,9 +76,6 @@
     for extension in file_desc_proto.extension:
       self._file_desc_protos_by_symbol[
           '.'.join((package, extension.name))] = file_desc_proto
-    for service in file_desc_proto.service:
-      self._file_desc_protos_by_symbol[
-          '.'.join((package, service.name))] = file_desc_proto
 
   def FindFileByName(self, name):
     """Finds the file descriptor proto by file name.
@@ -107,7 +104,6 @@
 
     'some.package.name.Message'
     'some.package.name.Message.NestedEnum'
-    'some.package.name.Message.some_field'
 
     The file descriptor proto containing the specified symbol must be added to
     this database using the Add method or else an error will be raised.
@@ -121,16 +117,8 @@
     Raises:
       KeyError if no file contains the specified symbol.
     """
-    try:
-      return self._file_desc_protos_by_symbol[symbol]
-    except KeyError:
-      # Fields, enum values, and nested extensions are not in
-      # _file_desc_protos_by_symbol. Try to find the top level
-      # descriptor. Non-existent nested symbol under a valid top level
-      # descriptor can also be found. The behavior is the same with
-      # protobuf C++.
-      top_level, _, _ = symbol.rpartition('.')
-      return self._file_desc_protos_by_symbol[top_level]
+
+    return self._file_desc_protos_by_symbol[symbol]
 
 
 def _ExtractSymbols(desc_proto, package):
@@ -143,7 +131,8 @@
   Yields:
     The fully qualified name found in the descriptor.
   """
-  message_name = package + '.' + desc_proto.name if package else desc_proto.name
+
+  message_name = '.'.join((package, desc_proto.name))
   yield message_name
   for nested_type in desc_proto.nested_type:
     for symbol in _ExtractSymbols(nested_type, message_name):
diff --git a/python/google/protobuf/descriptor_pool.py b/python/google/protobuf/descriptor_pool.py
index f4c533a..20a3370 100644
--- a/python/google/protobuf/descriptor_pool.py
+++ b/python/google/protobuf/descriptor_pool.py
@@ -57,14 +57,12 @@
 
 __author__ = 'matthewtoia@google.com (Matt Toia)'
 
-import collections
-
 from google.protobuf import descriptor
 from google.protobuf import descriptor_database
 from google.protobuf import text_encoding
 
 
-_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS  # pylint: disable=protected-access
+_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS
 
 
 def _NormalizeFullyQualifiedName(name):
@@ -82,22 +80,6 @@
   return name.lstrip('.')
 
 
-def _OptionsOrNone(descriptor_proto):
-  """Returns the value of the field `options`, or None if it is not set."""
-  if descriptor_proto.HasField('options'):
-    return descriptor_proto.options
-  else:
-    return None
-
-
-def _IsMessageSetExtension(field):
-  return (field.is_extension and
-          field.containing_type.has_options and
-          field.containing_type.GetOptions().message_set_wire_format and
-          field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and
-          field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL)
-
-
 class DescriptorPool(object):
   """A collection of protobufs dynamically constructed by descriptor protos."""
 
@@ -124,17 +106,7 @@
     self._descriptor_db = descriptor_db
     self._descriptors = {}
     self._enum_descriptors = {}
-    self._service_descriptors = {}
     self._file_descriptors = {}
-    self._toplevel_extensions = {}
-    # TODO(jieluo): Remove _file_desc_by_toplevel_extension after
-    # maybe year 2020 for compatibility issue (with 3.4.1 only).
-    self._file_desc_by_toplevel_extension = {}
-    # We store extensions in two two-level mappings: The first key is the
-    # descriptor of the message being extended, the second key is the extension
-    # full name or its tag number.
-    self._extensions_by_name = collections.defaultdict(dict)
-    self._extensions_by_number = collections.defaultdict(dict)
 
   def Add(self, file_desc_proto):
     """Adds the FileDescriptorProto and its types to this pool.
@@ -173,12 +145,12 @@
       raise TypeError('Expected instance of descriptor.Descriptor.')
 
     self._descriptors[desc.full_name] = desc
-    self._AddFileDescriptor(desc.file)
+    self.AddFileDescriptor(desc.file)
 
   def AddEnumDescriptor(self, enum_desc):
     """Adds an EnumDescriptor to the pool.
 
-    This method also registers the FileDescriptor associated with the enum.
+    This method also registers the FileDescriptor associated with the message.
 
     Args:
       enum_desc: An EnumDescriptor.
@@ -188,61 +160,7 @@
       raise TypeError('Expected instance of descriptor.EnumDescriptor.')
 
     self._enum_descriptors[enum_desc.full_name] = enum_desc
-    self._AddFileDescriptor(enum_desc.file)
-
-  def AddServiceDescriptor(self, service_desc):
-    """Adds a ServiceDescriptor to the pool.
-
-    Args:
-      service_desc: A ServiceDescriptor.
-    """
-
-    if not isinstance(service_desc, descriptor.ServiceDescriptor):
-      raise TypeError('Expected instance of descriptor.ServiceDescriptor.')
-
-    self._service_descriptors[service_desc.full_name] = service_desc
-
-  def AddExtensionDescriptor(self, extension):
-    """Adds a FieldDescriptor describing an extension to the pool.
-
-    Args:
-      extension: A FieldDescriptor.
-
-    Raises:
-      AssertionError: when another extension with the same number extends the
-        same message.
-      TypeError: when the specified extension is not a
-        descriptor.FieldDescriptor.
-    """
-    if not (isinstance(extension, descriptor.FieldDescriptor) and
-            extension.is_extension):
-      raise TypeError('Expected an extension descriptor.')
-
-    if extension.extension_scope is None:
-      self._toplevel_extensions[extension.full_name] = extension
-
-    try:
-      existing_desc = self._extensions_by_number[
-          extension.containing_type][extension.number]
-    except KeyError:
-      pass
-    else:
-      if extension is not existing_desc:
-        raise AssertionError(
-            'Extensions "%s" and "%s" both try to extend message type "%s" '
-            'with field number %d.' %
-            (extension.full_name, existing_desc.full_name,
-             extension.containing_type.full_name, extension.number))
-
-    self._extensions_by_number[extension.containing_type][
-        extension.number] = extension
-    self._extensions_by_name[extension.containing_type][
-        extension.full_name] = extension
-
-    # Also register MessageSet extensions with the type name.
-    if _IsMessageSetExtension(extension):
-      self._extensions_by_name[extension.containing_type][
-          extension.message_type.full_name] = extension
+    self.AddFileDescriptor(enum_desc.file)
 
   def AddFileDescriptor(self, file_desc):
     """Adds a FileDescriptor to the pool, non-recursively.
@@ -254,24 +172,6 @@
       file_desc: A FileDescriptor.
     """
 
-    self._AddFileDescriptor(file_desc)
-    # TODO(jieluo): This is a temporary solution for FieldDescriptor.file.
-    # FieldDescriptor.file is added in code gen. Remove this solution after
-    # maybe 2020 for compatibility reason (with 3.4.1 only).
-    for extension in file_desc.extensions_by_name.values():
-      self._file_desc_by_toplevel_extension[
-          extension.full_name] = file_desc
-
-  def _AddFileDescriptor(self, file_desc):
-    """Adds a FileDescriptor to the pool, non-recursively.
-
-    If the FileDescriptor contains messages or enums, the caller must explicitly
-    register them.
-
-    Args:
-      file_desc: A FileDescriptor.
-    """
-
     if not isinstance(file_desc, descriptor.FileDescriptor):
       raise TypeError('Expected instance of descriptor.FileDescriptor.')
     self._file_descriptors[file_desc.name] = file_desc
@@ -286,7 +186,7 @@
       A FileDescriptor for the named file.
 
     Raises:
-      KeyError: if the file cannot be found in the pool.
+      KeyError: if the file can not be found in the pool.
     """
 
     try:
@@ -315,7 +215,7 @@
       A FileDescriptor that contains the specified symbol.
 
     Raises:
-      KeyError: if the file cannot be found in the pool.
+      KeyError: if the file can not be found in the pool.
     """
 
     symbol = _NormalizeFullyQualifiedName(symbol)
@@ -330,28 +230,15 @@
       pass
 
     try:
-      return self._service_descriptors[symbol].file
-    except KeyError:
-      pass
-
-    try:
-      return self._FindFileContainingSymbolInDb(symbol)
-    except KeyError:
-      pass
-
-    try:
-      return self._file_desc_by_toplevel_extension[symbol]
-    except KeyError:
-      pass
-
-    # Try nested extensions inside a message.
-    message_name, _, extension_name = symbol.rpartition('.')
-    try:
-      message = self.FindMessageTypeByName(message_name)
-      assert message.extensions_by_name[extension_name]
-      return message.file
-    except KeyError:
+      file_proto = self._internal_db.FindFileContainingSymbol(symbol)
+    except KeyError as error:
+      if self._descriptor_db:
+        file_proto = self._descriptor_db.FindFileContainingSymbol(symbol)
+      else:
+        raise error
+    if not file_proto:
       raise KeyError('Cannot find a file containing %s' % symbol)
+    return self._ConvertFileProtoToFileDescriptor(file_proto)
 
   def FindMessageTypeByName(self, full_name):
     """Loads the named descriptor from the pool.
@@ -361,14 +248,11 @@
 
     Returns:
       The descriptor for the named type.
-
-    Raises:
-      KeyError: if the message cannot be found in the pool.
     """
 
     full_name = _NormalizeFullyQualifiedName(full_name)
     if full_name not in self._descriptors:
-      self._FindFileContainingSymbolInDb(full_name)
+      self.FindFileContainingSymbol(full_name)
     return self._descriptors[full_name]
 
   def FindEnumTypeByName(self, full_name):
@@ -379,14 +263,11 @@
 
     Returns:
       The enum descriptor for the named type.
-
-    Raises:
-      KeyError: if the enum cannot be found in the pool.
     """
 
     full_name = _NormalizeFullyQualifiedName(full_name)
     if full_name not in self._enum_descriptors:
-      self._FindFileContainingSymbolInDb(full_name)
+      self.FindFileContainingSymbol(full_name)
     return self._enum_descriptors[full_name]
 
   def FindFieldByName(self, full_name):
@@ -397,32 +278,12 @@
 
     Returns:
       The field descriptor for the named field.
-
-    Raises:
-      KeyError: if the field cannot be found in the pool.
     """
     full_name = _NormalizeFullyQualifiedName(full_name)
     message_name, _, field_name = full_name.rpartition('.')
     message_descriptor = self.FindMessageTypeByName(message_name)
     return message_descriptor.fields_by_name[field_name]
 
-  def FindOneofByName(self, full_name):
-    """Loads the named oneof descriptor from the pool.
-
-    Args:
-      full_name: The full name of the oneof descriptor to load.
-
-    Returns:
-      The oneof descriptor for the named oneof.
-
-    Raises:
-      KeyError: if the oneof cannot be found in the pool.
-    """
-    full_name = _NormalizeFullyQualifiedName(full_name)
-    message_name, _, oneof_name = full_name.rpartition('.')
-    message_descriptor = self.FindMessageTypeByName(message_name)
-    return message_descriptor.oneofs_by_name[oneof_name]
-
   def FindExtensionByName(self, full_name):
     """Loads the named extension descriptor from the pool.
 
@@ -431,101 +292,17 @@
 
     Returns:
       A FieldDescriptor, describing the named extension.
-
-    Raises:
-      KeyError: if the extension cannot be found in the pool.
     """
     full_name = _NormalizeFullyQualifiedName(full_name)
-    try:
-      # The proto compiler does not give any link between the FileDescriptor
-      # and top-level extensions unless the FileDescriptorProto is added to
-      # the DescriptorDatabase, but this can impact memory usage.
-      # So we registered these extensions by name explicitly.
-      return self._toplevel_extensions[full_name]
-    except KeyError:
-      pass
     message_name, _, extension_name = full_name.rpartition('.')
     try:
       # Most extensions are nested inside a message.
       scope = self.FindMessageTypeByName(message_name)
     except KeyError:
       # Some extensions are defined at file scope.
-      scope = self._FindFileContainingSymbolInDb(full_name)
+      scope = self.FindFileContainingSymbol(full_name)
     return scope.extensions_by_name[extension_name]
 
-  def FindExtensionByNumber(self, message_descriptor, number):
-    """Gets the extension of the specified message with the specified number.
-
-    Extensions have to be registered to this pool by calling
-    AddExtensionDescriptor.
-
-    Args:
-      message_descriptor: descriptor of the extended message.
-      number: integer, number of the extension field.
-
-    Returns:
-      A FieldDescriptor describing the extension.
-
-    Raises:
-      KeyError: when no extension with the given number is known for the
-        specified message.
-    """
-    return self._extensions_by_number[message_descriptor][number]
-
-  def FindAllExtensions(self, message_descriptor):
-    """Gets all the known extension of a given message.
-
-    Extensions have to be registered to this pool by calling
-    AddExtensionDescriptor.
-
-    Args:
-      message_descriptor: descriptor of the extended message.
-
-    Returns:
-      A list of FieldDescriptor describing the extensions.
-    """
-    return list(self._extensions_by_number[message_descriptor].values())
-
-  def FindServiceByName(self, full_name):
-    """Loads the named service descriptor from the pool.
-
-    Args:
-      full_name: The full name of the service descriptor to load.
-
-    Returns:
-      The service descriptor for the named service.
-
-    Raises:
-      KeyError: if the service cannot be found in the pool.
-    """
-    full_name = _NormalizeFullyQualifiedName(full_name)
-    if full_name not in self._service_descriptors:
-      self._FindFileContainingSymbolInDb(full_name)
-    return self._service_descriptors[full_name]
-
-  def _FindFileContainingSymbolInDb(self, symbol):
-    """Finds the file in descriptor DB containing the specified symbol.
-
-    Args:
-      symbol: The name of the symbol to search for.
-
-    Returns:
-      A FileDescriptor that contains the specified symbol.
-
-    Raises:
-      KeyError: if the file cannot be found in the descriptor database.
-    """
-    try:
-      file_proto = self._internal_db.FindFileContainingSymbol(symbol)
-    except KeyError as error:
-      if self._descriptor_db:
-        file_proto = self._descriptor_db.FindFileContainingSymbol(symbol)
-      else:
-        raise error
-    if not file_proto:
-      raise KeyError('Cannot find a file containing %s' % symbol)
-    return self._ConvertFileProtoToFileDescriptor(file_proto)
-
   def _ConvertFileProtoToFileDescriptor(self, file_proto):
     """Creates a FileDescriptor from a proto or returns a cached copy.
 
@@ -549,62 +326,73 @@
           name=file_proto.name,
           package=file_proto.package,
           syntax=file_proto.syntax,
-          options=_OptionsOrNone(file_proto),
+          options=file_proto.options,
           serialized_pb=file_proto.SerializeToString(),
           dependencies=direct_deps,
           public_dependencies=public_deps)
-      scope = {}
-
-      # This loop extracts all the message and enum types from all the
-      # dependencies of the file_proto. This is necessary to create the
-      # scope of available message types when defining the passed in
-      # file proto.
-      for dependency in built_deps:
-        scope.update(self._ExtractSymbols(
-            dependency.message_types_by_name.values()))
-        scope.update((_PrefixWithDot(enum.full_name), enum)
-                     for enum in dependency.enum_types_by_name.values())
-
-      for message_type in file_proto.message_type:
-        message_desc = self._ConvertMessageDescriptor(
-            message_type, file_proto.package, file_descriptor, scope,
-            file_proto.syntax)
-        file_descriptor.message_types_by_name[message_desc.name] = (
-            message_desc)
-
-      for enum_type in file_proto.enum_type:
-        file_descriptor.enum_types_by_name[enum_type.name] = (
-            self._ConvertEnumDescriptor(enum_type, file_proto.package,
-                                        file_descriptor, None, scope))
-
-      for index, extension_proto in enumerate(file_proto.extension):
-        extension_desc = self._MakeFieldDescriptor(
-            extension_proto, file_proto.package, index, file_descriptor,
-            is_extension=True)
-        extension_desc.containing_type = self._GetTypeFromScope(
-            file_descriptor.package, extension_proto.extendee, scope)
-        self._SetFieldType(extension_proto, extension_desc,
-                           file_descriptor.package, scope)
-        file_descriptor.extensions_by_name[extension_desc.name] = (
-            extension_desc)
-
-      for desc_proto in file_proto.message_type:
-        self._SetAllFieldTypes(file_proto.package, desc_proto, scope)
-
-      if file_proto.package:
-        desc_proto_prefix = _PrefixWithDot(file_proto.package)
+      if _USE_C_DESCRIPTORS:
+        # When using C++ descriptors, all objects defined in the file were added
+        # to the C++ database when the FileDescriptor was built above.
+        # Just add them to this descriptor pool.
+        def _AddMessageDescriptor(message_desc):
+          self._descriptors[message_desc.full_name] = message_desc
+          for nested in message_desc.nested_types:
+            _AddMessageDescriptor(nested)
+          for enum_type in message_desc.enum_types:
+            _AddEnumDescriptor(enum_type)
+        def _AddEnumDescriptor(enum_desc):
+          self._enum_descriptors[enum_desc.full_name] = enum_desc
+        for message_type in file_descriptor.message_types_by_name.values():
+          _AddMessageDescriptor(message_type)
+        for enum_type in file_descriptor.enum_types_by_name.values():
+          _AddEnumDescriptor(enum_type)
       else:
-        desc_proto_prefix = ''
+        scope = {}
 
-      for desc_proto in file_proto.message_type:
-        desc = self._GetTypeFromScope(
-            desc_proto_prefix, desc_proto.name, scope)
-        file_descriptor.message_types_by_name[desc_proto.name] = desc
+        # This loop extracts all the message and enum types from all the
+        # dependencies of the file_proto. This is necessary to create the
+        # scope of available message types when defining the passed in
+        # file proto.
+        for dependency in built_deps:
+          scope.update(self._ExtractSymbols(
+              dependency.message_types_by_name.values()))
+          scope.update((_PrefixWithDot(enum.full_name), enum)
+                       for enum in dependency.enum_types_by_name.values())
 
-      for index, service_proto in enumerate(file_proto.service):
-        file_descriptor.services_by_name[service_proto.name] = (
-            self._MakeServiceDescriptor(service_proto, index, scope,
-                                        file_proto.package, file_descriptor))
+        for message_type in file_proto.message_type:
+          message_desc = self._ConvertMessageDescriptor(
+              message_type, file_proto.package, file_descriptor, scope,
+              file_proto.syntax)
+          file_descriptor.message_types_by_name[message_desc.name] = (
+              message_desc)
+
+        for enum_type in file_proto.enum_type:
+          file_descriptor.enum_types_by_name[enum_type.name] = (
+              self._ConvertEnumDescriptor(enum_type, file_proto.package,
+                                          file_descriptor, None, scope))
+
+        for index, extension_proto in enumerate(file_proto.extension):
+          extension_desc = self._MakeFieldDescriptor(
+              extension_proto, file_proto.package, index, is_extension=True)
+          extension_desc.containing_type = self._GetTypeFromScope(
+              file_descriptor.package, extension_proto.extendee, scope)
+          self._SetFieldType(extension_proto, extension_desc,
+                            file_descriptor.package, scope)
+          file_descriptor.extensions_by_name[extension_desc.name] = (
+              extension_desc)
+
+        for desc_proto in file_proto.message_type:
+          self._SetAllFieldTypes(file_proto.package, desc_proto, scope)
+
+        if file_proto.package:
+          desc_proto_prefix = _PrefixWithDot(file_proto.package)
+        else:
+          desc_proto_prefix = ''
+
+        for desc_proto in file_proto.message_type:
+          desc = self._GetTypeFromScope(
+              desc_proto_prefix, desc_proto.name, scope)
+          file_descriptor.message_types_by_name[desc_proto.name] = desc
 
       self.Add(file_proto)
       self._file_descriptors[file_proto.name] = file_descriptor
@@ -620,7 +408,6 @@
       package: The package the proto should be located in.
       file_desc: The file containing this message.
       scope: Dict mapping short and full symbols to message and enum types.
-      syntax: string indicating syntax of the file ("proto2" or "proto3")
 
     Returns:
       The added descriptor.
@@ -646,15 +433,15 @@
     enums = [
         self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, scope)
         for enum in desc_proto.enum_type]
-    fields = [self._MakeFieldDescriptor(field, desc_name, index, file_desc)
+    fields = [self._MakeFieldDescriptor(field, desc_name, index)
               for index, field in enumerate(desc_proto.field)]
     extensions = [
-        self._MakeFieldDescriptor(extension, desc_name, index, file_desc,
+        self._MakeFieldDescriptor(extension, desc_name, index,
                                   is_extension=True)
         for index, extension in enumerate(desc_proto.extension)]
     oneofs = [
         descriptor.OneofDescriptor(desc.name, '.'.join((desc_name, desc.name)),
-                                   index, None, [], desc.options)
+                                   index, None, [])
         for index, desc in enumerate(desc_proto.oneof_decl)]
     extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range]
     if extension_ranges:
@@ -671,7 +458,7 @@
         nested_types=nested,
         enum_types=enums,
         extensions=extensions,
-        options=_OptionsOrNone(desc_proto),
+        options=desc_proto.options,
         is_extendable=is_extendable,
         extension_ranges=extension_ranges,
         file=file_desc,
@@ -725,13 +512,13 @@
                                      file=file_desc,
                                      values=values,
                                      containing_type=containing_type,
-                                     options=_OptionsOrNone(enum_proto))
+                                     options=enum_proto.options)
     scope['.%s' % enum_name] = desc
     self._enum_descriptors[enum_name] = desc
     return desc
 
   def _MakeFieldDescriptor(self, field_proto, message_name, index,
-                           file_desc, is_extension=False):
+                           is_extension=False):
     """Creates a field descriptor from a FieldDescriptorProto.
 
     For message and enum type fields, this method will do a look up
@@ -744,7 +531,6 @@
       field_proto: The proto describing the field.
       message_name: The name of the containing message.
       index: Index of the field
-      file_desc: The file containing the field descriptor.
       is_extension: Indication that this field is for an extension.
 
     Returns:
@@ -771,8 +557,7 @@
         default_value=None,
         is_extension=is_extension,
         extension_scope=None,
-        options=_OptionsOrNone(field_proto),
-        file=file_desc)
+        options=field_proto.options)
 
   def _SetAllFieldTypes(self, package, desc_proto, scope):
     """Sets all the descriptor's fields's types.
@@ -891,68 +676,9 @@
         name=value_proto.name,
         index=index,
         number=value_proto.number,
-        options=_OptionsOrNone(value_proto),
+        options=value_proto.options,
         type=None)
 
-  def _MakeServiceDescriptor(self, service_proto, service_index, scope,
-                             package, file_desc):
-    """Make a protobuf ServiceDescriptor given a ServiceDescriptorProto.
-
-    Args:
-      service_proto: The descriptor_pb2.ServiceDescriptorProto protobuf message.
-      service_index: The index of the service in the File.
-      scope: Dict mapping short and full symbols to message and enum types.
-      package: Optional package name for the new message EnumDescriptor.
-      file_desc: The file containing the service descriptor.
-
-    Returns:
-      The added descriptor.
-    """
-
-    if package:
-      service_name = '.'.join((package, service_proto.name))
-    else:
-      service_name = service_proto.name
-
-    methods = [self._MakeMethodDescriptor(method_proto, service_name, package,
-                                          scope, index)
-               for index, method_proto in enumerate(service_proto.method)]
-    desc = descriptor.ServiceDescriptor(name=service_proto.name,
-                                        full_name=service_name,
-                                        index=service_index,
-                                        methods=methods,
-                                        options=_OptionsOrNone(service_proto),
-                                        file=file_desc)
-    self._service_descriptors[service_name] = desc
-    return desc
-
-  def _MakeMethodDescriptor(self, method_proto, service_name, package, scope,
-                            index):
-    """Creates a method descriptor from a MethodDescriptorProto.
-
-    Args:
-      method_proto: The proto describing the method.
-      service_name: The name of the containing service.
-      package: Optional package name to look up for types.
-      scope: Scope containing available types.
-      index: Index of the method in the service.
-
-    Returns:
-      An initialized MethodDescriptor object.
-    """
-    full_name = '.'.join((service_name, method_proto.name))
-    input_type = self._GetTypeFromScope(
-        package, method_proto.input_type, scope)
-    output_type = self._GetTypeFromScope(
-        package, method_proto.output_type, scope)
-    return descriptor.MethodDescriptor(name=method_proto.name,
-                                       full_name=full_name,
-                                       index=index,
-                                       containing_service=None,
-                                       input_type=input_type,
-                                       output_type=output_type,
-                                       options=_OptionsOrNone(method_proto))
-
   def _ExtractSymbols(self, descriptors):
     """Pulls out all the symbols from descriptor protos.
 
diff --git a/python/google/protobuf/internal/_parameterized.py b/python/google/protobuf/internal/_parameterized.py
index 23a78f0..dea3f19 100755
--- a/python/google/protobuf/internal/_parameterized.py
+++ b/python/google/protobuf/internal/_parameterized.py
@@ -347,7 +347,7 @@
   iterable conforms to the test pattern, the injected methods will be picked
   up as tests by the unittest framework.
 
-  In general, it is supposed to be used in conjunction with the
+  In general, it is supposed to be used in conjuction with the
   Parameters decorator.
   """
 
diff --git a/python/google/protobuf/internal/any_test.proto b/python/google/protobuf/internal/any_test.proto
index 1a563fd..cd641ca 100644
--- a/python/google/protobuf/internal/any_test.proto
+++ b/python/google/protobuf/internal/any_test.proto
@@ -30,22 +30,13 @@
 
 // Author: jieluo@google.com (Jie Luo)
 
-syntax = "proto2";
+syntax = "proto3";
 
 package google.protobuf.internal;
 
 import "google/protobuf/any.proto";
 
 message TestAny {
-  optional google.protobuf.Any value = 1;
-  optional int32 int_value = 2;
-  map<string,int32> map_value = 3;
-  extensions 10 to max;
-}
-
-message TestAnyExtension1 {
-  extend TestAny {
-    optional TestAnyExtension1 extension1 = 98418603;
-  }
-  optional int32 i = 15;
+  google.protobuf.Any value = 1;
+  int32 int_value = 2;
 }
diff --git a/python/google/protobuf/internal/api_implementation.py b/python/google/protobuf/internal/api_implementation.py
index 553fcdb..460a4a6 100755
--- a/python/google/protobuf/internal/api_implementation.py
+++ b/python/google/protobuf/internal/api_implementation.py
@@ -61,15 +61,10 @@
     del _use_fast_cpp_protos
     _api_version = 2
   except ImportError:
-    try:
-      # pylint: disable=g-import-not-at-top
-      from google.protobuf.internal import use_pure_python
-      del use_pure_python  # Avoids a pylint error and namespace pollution.
-    except ImportError:
-      if _proto_extension_modules_exist_in_build:
-        if sys.version_info[0] >= 3:  # Python 3 defaults to C++ impl v2.
-          _api_version = 2
-          # TODO(b/17427486): Make Python 2 default to C++ impl v2.
+    if _proto_extension_modules_exist_in_build:
+      if sys.version_info[0] >= 3:  # Python 3 defaults to C++ impl v2.
+        _api_version = 2
+      # TODO(b/17427486): Make Python 2 default to C++ impl v2.
 
 _default_implementation_type = (
     'python' if _api_version <= 0 else 'cpp')
@@ -105,27 +100,6 @@
 _implementation_version = int(_implementation_version_str)
 
 
-# Detect if serialization should be deterministic by default
-try:
-  # The presence of this module in a build allows the proto implementation to
-  # be upgraded merely via build deps.
-  #
-  # NOTE: Merely importing this automatically enables deterministic proto
-  # serialization for C++ code, but we still need to export it as a boolean so
-  # that we can do the same for `_implementation_type == 'python'`.
-  #
-  # NOTE2: It is possible for C++ code to enable deterministic serialization by
-  # default _without_ affecting Python code, if the C++ implementation is not in
-  # use by this module.  That is intended behavior, so we don't actually expose
-  # this boolean outside of this module.
-  #
-  # pylint: disable=g-import-not-at-top,unused-import
-  from google.protobuf import enable_deterministic_proto_serialization
-  _python_deterministic_proto_serialization = True
-except ImportError:
-  _python_deterministic_proto_serialization = False
-
-
 # Usage of this function is discouraged. Clients shouldn't care which
 # implementation of the API is in use. Note that there is no guarantee
 # that differences between APIs will be maintained.
@@ -137,34 +111,3 @@
 # See comment on 'Type' above.
 def Version():
   return _implementation_version
-
-
-# For internal use only
-def IsPythonDefaultSerializationDeterministic():
-  return _python_deterministic_proto_serialization
-
-# DO NOT USE: For migration and testing only. Will be removed when Proto3
-# defaults to preserve unknowns.
-if _implementation_type == 'cpp':
-  try:
-    # pylint: disable=g-import-not-at-top
-    from google.protobuf.pyext import _message
-
-    def GetPythonProto3PreserveUnknownsDefault():
-      return _message.GetPythonProto3PreserveUnknownsDefault()
-
-    def SetPythonProto3PreserveUnknownsDefault(preserve):
-      _message.SetPythonProto3PreserveUnknownsDefault(preserve)
-  except ImportError:
-    # Unrecognized cpp implementation. Skipping the unknown fields APIs.
-    pass
-else:
-  _python_proto3_preserve_unknowns_default = True
-
-  def GetPythonProto3PreserveUnknownsDefault():
-    return _python_proto3_preserve_unknowns_default
-
-  def SetPythonProto3PreserveUnknownsDefault(preserve):
-    global _python_proto3_preserve_unknowns_default
-    _python_proto3_preserve_unknowns_default = preserve
-
diff --git a/python/google/protobuf/internal/containers.py b/python/google/protobuf/internal/containers.py
index 68be9e5..97cdd84 100755
--- a/python/google/protobuf/internal/containers.py
+++ b/python/google/protobuf/internal/containers.py
@@ -275,7 +275,7 @@
     new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter]
     if new_values:
       self._values.extend(new_values)
-    self._message_listener.Modified()
+      self._message_listener.Modified()
 
   def MergeFrom(self, other):
     """Appends the contents of another repeated field of the same type to this
@@ -436,11 +436,9 @@
   """Simple, type-checked, dict-like container for holding repeated scalars."""
 
   # Disallows assignment to other attributes.
-  __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener',
-               '_entry_descriptor']
+  __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener']
 
-  def __init__(self, message_listener, key_checker, value_checker,
-               entry_descriptor):
+  def __init__(self, message_listener, key_checker, value_checker):
     """
     Args:
       message_listener: A MessageListener implementation.
@@ -450,12 +448,10 @@
         inserted into this container.
       value_checker: A type_checkers.ValueChecker instance to run on values
         inserted into this container.
-      entry_descriptor: The MessageDescriptor of a map entry: key and value.
     """
     self._message_listener = message_listener
     self._key_checker = key_checker
     self._value_checker = value_checker
-    self._entry_descriptor = entry_descriptor
     self._values = {}
 
   def __getitem__(self, key):
@@ -517,9 +513,6 @@
     self._values.clear()
     self._message_listener.Modified()
 
-  def GetEntryClass(self):
-    return self._entry_descriptor._concrete_class
-
 
 class MessageMap(MutableMapping):
 
@@ -527,10 +520,9 @@
 
   # Disallows assignment to other attributes.
   __slots__ = ['_key_checker', '_values', '_message_listener',
-               '_message_descriptor', '_entry_descriptor']
+               '_message_descriptor']
 
-  def __init__(self, message_listener, message_descriptor, key_checker,
-               entry_descriptor):
+  def __init__(self, message_listener, message_descriptor, key_checker):
     """
     Args:
       message_listener: A MessageListener implementation.
@@ -540,12 +532,10 @@
         inserted into this container.
       value_checker: A type_checkers.ValueChecker instance to run on values
         inserted into this container.
-      entry_descriptor: The MessageDescriptor of a map entry: key and value.
     """
     self._message_listener = message_listener
     self._message_descriptor = message_descriptor
     self._key_checker = key_checker
-    self._entry_descriptor = entry_descriptor
     self._values = {}
 
   def __getitem__(self, key):
@@ -604,11 +594,7 @@
 
   def MergeFrom(self, other):
     for key in other:
-      # According to documentation: "When parsing from the wire or when merging,
-      # if there are duplicate map keys the last key seen is used".
-      if key in self:
-        del self[key]
-      self[key].CopyFrom(other[key])
+      self[key].MergeFrom(other[key])
     # self._message_listener.Modified() not required here, because
     # mutations to submessages already propagate.
 
@@ -623,6 +609,3 @@
   def clear(self):
     self._values.clear()
     self._message_listener.Modified()
-
-  def GetEntryClass(self):
-    return self._entry_descriptor._concrete_class
diff --git a/python/google/protobuf/internal/decoder.py b/python/google/protobuf/internal/decoder.py
index 52b6491..31869e4 100755
--- a/python/google/protobuf/internal/decoder.py
+++ b/python/google/protobuf/internal/decoder.py
@@ -131,12 +131,9 @@
   return DecodeVarint
 
 
-def _SignedVarintDecoder(bits, result_type):
+def _SignedVarintDecoder(mask, result_type):
   """Like _VarintDecoder() but decodes signed values."""
 
-  signbit = 1 << (bits - 1)
-  mask = (1 << bits) - 1
-
   def DecodeVarint(buffer, pos):
     result = 0
     shift = 0
@@ -145,8 +142,11 @@
       result |= ((b & 0x7f) << shift)
       pos += 1
       if not (b & 0x80):
-        result &= mask
-        result = (result ^ signbit) - signbit
+        if result > 0x7fffffffffffffff:
+          result -= (1 << 64)
+          result |= ~mask
+        else:
+          result &= mask
         result = result_type(result)
         return (result, pos)
       shift += 7
@@ -159,11 +159,11 @@
 # (e.g. the C++ implementation) simpler.
 
 _DecodeVarint = _VarintDecoder((1 << 64) - 1, long)
-_DecodeSignedVarint = _SignedVarintDecoder(64, long)
+_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1, long)
 
 # Use these versions for values which must be limited to 32 bits.
 _DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int)
-_DecodeSignedVarint32 = _SignedVarintDecoder(32, int)
+_DecodeSignedVarint32 = _SignedVarintDecoder((1 << 32) - 1, int)
 
 
 def ReadTag(buffer, pos):
@@ -181,7 +181,7 @@
   while six.indexbytes(buffer, pos) & 0x80:
     pos += 1
   pos += 1
-  return (six.binary_type(buffer[start:pos]), pos)
+  return (buffer[start:pos], pos)
 
 
 # --------------------------------------------------------------------
@@ -642,10 +642,10 @@
 
 MESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP)
 
-def MessageSetItemDecoder(descriptor):
+def MessageSetItemDecoder(extensions_by_number):
   """Returns a decoder for a MessageSet item.
 
-  The parameter is the message Descriptor.
+  The parameter is the _extensions_by_number map for the message class.
 
   The message set message looks like this:
     message MessageSet {
@@ -694,7 +694,7 @@
     if message_start == -1:
       raise _DecodeError('MessageSet item missing message.')
 
-    extension = message.Extensions._FindExtensionByNumber(type_id)
+    extension = extensions_by_number.get(type_id)
     if extension is not None:
       value = field_dict.get(extension)
       if value is None:
diff --git a/python/google/protobuf/internal/descriptor_database_test.py b/python/google/protobuf/internal/descriptor_database_test.py
index 1f1a3db..5225a45 100644
--- a/python/google/protobuf/internal/descriptor_database_test.py
+++ b/python/google/protobuf/internal/descriptor_database_test.py
@@ -39,7 +39,6 @@
 except ImportError:
   import unittest
 
-from google.protobuf import unittest_pb2
 from google.protobuf import descriptor_pb2
 from google.protobuf.internal import factory_test2_pb2
 from google.protobuf import descriptor_database
@@ -55,49 +54,16 @@
 
     self.assertEqual(file_desc_proto, db.FindFileByName(
         'google/protobuf/internal/factory_test2.proto'))
-    # Can find message type.
     self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
         'google.protobuf.python.internal.Factory2Message'))
-    # Can find nested message type.
     self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
         'google.protobuf.python.internal.Factory2Message.NestedFactory2Message'))
-    # Can find enum type.
     self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
         'google.protobuf.python.internal.Factory2Enum'))
-    # Can find nested enum type.
     self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
         'google.protobuf.python.internal.Factory2Message.NestedFactory2Enum'))
     self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
         'google.protobuf.python.internal.MessageWithNestedEnumOnly.NestedEnum'))
-    # Can find field.
-    self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
-        'google.protobuf.python.internal.Factory2Message.list_field'))
-    # Can find enum value.
-    self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
-        'google.protobuf.python.internal.Factory2Enum.FACTORY_2_VALUE_0'))
-    # Can find top level extension.
-    self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
-        'google.protobuf.python.internal.another_field'))
-    # Can find nested extension inside a message.
-    self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
-        'google.protobuf.python.internal.Factory2Message.one_more_field'))
-
-    # Can find service.
-    file_desc_proto2 = descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_pb2.DESCRIPTOR.serialized_pb)
-    db.Add(file_desc_proto2)
-    self.assertEqual(file_desc_proto2, db.FindFileContainingSymbol(
-        'protobuf_unittest.TestService'))
-
-    # Non-existent field under a valid top level symbol can also be
-    # found. The behavior is the same with protobuf C++.
-    self.assertEqual(file_desc_proto2, db.FindFileContainingSymbol(
-        'protobuf_unittest.TestAllTypes.none_field'))
-
-    self.assertRaises(KeyError,
-                      db.FindFileContainingSymbol,
-                      'protobuf_unittest.NoneMessage')
-
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/python/google/protobuf/internal/descriptor_pool_test.py b/python/google/protobuf/internal/descriptor_pool_test.py
index 15c857b..6a13e0b 100644
--- a/python/google/protobuf/internal/descriptor_pool_test.py
+++ b/python/google/protobuf/internal/descriptor_pool_test.py
@@ -51,7 +51,6 @@
 from google.protobuf.internal import descriptor_pool_test2_pb2
 from google.protobuf.internal import factory_test1_pb2
 from google.protobuf.internal import factory_test2_pb2
-from google.protobuf.internal import file_options_test_pb2
 from google.protobuf.internal import more_messages_pb2
 from google.protobuf import descriptor
 from google.protobuf import descriptor_database
@@ -60,8 +59,16 @@
 from google.protobuf import symbol_database
 
 
+class DescriptorPoolTest(unittest.TestCase):
 
-class DescriptorPoolTestBase(object):
+  def setUp(self):
+    self.pool = descriptor_pool.DescriptorPool()
+    self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
+        factory_test1_pb2.DESCRIPTOR.serialized_pb)
+    self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
+        factory_test2_pb2.DESCRIPTOR.serialized_pb)
+    self.pool.Add(self.factory_test1_fd)
+    self.pool.Add(self.factory_test2_fd)
 
   def testFindFileByName(self):
     name1 = 'google/protobuf/internal/factory_test1.proto'
@@ -99,26 +106,6 @@
     self.assertEqual('google.protobuf.python.internal', file_desc2.package)
     self.assertIn('Factory2Message', file_desc2.message_types_by_name)
 
-    # Tests top level extension.
-    file_desc3 = self.pool.FindFileContainingSymbol(
-        'google.protobuf.python.internal.another_field')
-    self.assertIsInstance(file_desc3, descriptor.FileDescriptor)
-    self.assertEqual('google/protobuf/internal/factory_test2.proto',
-                     file_desc3.name)
-
-    # Tests nested extension inside a message.
-    file_desc4 = self.pool.FindFileContainingSymbol(
-        'google.protobuf.python.internal.Factory2Message.one_more_field')
-    self.assertIsInstance(file_desc4, descriptor.FileDescriptor)
-    self.assertEqual('google/protobuf/internal/factory_test2.proto',
-                     file_desc4.name)
-
-    file_desc5 = self.pool.FindFileContainingSymbol(
-        'protobuf_unittest.TestService')
-    self.assertIsInstance(file_desc5, descriptor.FileDescriptor)
-    self.assertEqual('google/protobuf/unittest.proto',
-                     file_desc5.name)
-
   def testFindFileContainingSymbolFailure(self):
     with self.assertRaises(KeyError):
       self.pool.FindFileContainingSymbol('Does not exist')
@@ -131,7 +118,6 @@
     self.assertEqual('google.protobuf.python.internal.Factory1Message',
                      msg1.full_name)
     self.assertEqual(None, msg1.containing_type)
-    self.assertFalse(msg1.has_options)
 
     nested_msg1 = msg1.nested_types[0]
     self.assertEqual('NestedFactory1Message', nested_msg1.name)
@@ -205,27 +191,6 @@
                        msg2.fields_by_name[name].containing_oneof)
       self.assertIn(msg2.fields_by_name[name], msg2.oneofs[0].fields)
 
-  def testFindTypeErrors(self):
-    self.assertRaises(TypeError, self.pool.FindExtensionByNumber, '')
-
-    # TODO(jieluo): Fix python to raise correct errors.
-    if api_implementation.Type() == 'cpp':
-      self.assertRaises(TypeError, self.pool.FindMethodByName, 0)
-      self.assertRaises(KeyError, self.pool.FindMethodByName, '')
-      error_type = TypeError
-    else:
-      error_type = AttributeError
-    self.assertRaises(error_type, self.pool.FindMessageTypeByName, 0)
-    self.assertRaises(error_type, self.pool.FindFieldByName, 0)
-    self.assertRaises(error_type, self.pool.FindExtensionByName, 0)
-    self.assertRaises(error_type, self.pool.FindEnumTypeByName, 0)
-    self.assertRaises(error_type, self.pool.FindOneofByName, 0)
-    self.assertRaises(error_type, self.pool.FindServiceByName, 0)
-    self.assertRaises(error_type, self.pool.FindFileContainingSymbol, 0)
-    if api_implementation.Type() == 'python':
-      error_type = KeyError
-    self.assertRaises(error_type, self.pool.FindFileByName, 0)
-
   def testFindMessageTypeByNameFailure(self):
     with self.assertRaises(KeyError):
       self.pool.FindMessageTypeByName('Does not exist')
@@ -236,7 +201,6 @@
     self.assertIsInstance(enum1, descriptor.EnumDescriptor)
     self.assertEqual(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number)
     self.assertEqual(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number)
-    self.assertFalse(enum1.has_options)
 
     nested_enum1 = self.pool.FindEnumTypeByName(
         'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum')
@@ -265,38 +229,14 @@
       self.pool.FindEnumTypeByName('Does not exist')
 
   def testFindFieldByName(self):
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # TODO(jieluo): Fix cpp extension to find field correctly
-        # when descriptor pool is using an underlying database.
-        return
     field = self.pool.FindFieldByName(
         'google.protobuf.python.internal.Factory1Message.list_value')
     self.assertEqual(field.name, 'list_value')
     self.assertEqual(field.label, field.LABEL_REPEATED)
-    self.assertFalse(field.has_options)
-
     with self.assertRaises(KeyError):
       self.pool.FindFieldByName('Does not exist')
 
-  def testFindOneofByName(self):
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # TODO(jieluo): Fix cpp extension to find oneof correctly
-        # when descriptor pool is using an underlying database.
-        return
-    oneof = self.pool.FindOneofByName(
-        'google.protobuf.python.internal.Factory2Message.oneof_field')
-    self.assertEqual(oneof.name, 'oneof_field')
-    with self.assertRaises(KeyError):
-      self.pool.FindOneofByName('Does not exist')
-
   def testFindExtensionByName(self):
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # TODO(jieluo): Fix cpp extension to find extension correctly
-        # when descriptor pool is using an underlying database.
-        return
     # An extension defined in a message.
     extension = self.pool.FindExtensionByName(
         'google.protobuf.python.internal.Factory2Message.one_more_field')
@@ -309,53 +249,6 @@
     with self.assertRaises(KeyError):
       self.pool.FindFieldByName('Does not exist')
 
-  def testFindAllExtensions(self):
-    factory1_message = self.pool.FindMessageTypeByName(
-        'google.protobuf.python.internal.Factory1Message')
-    factory2_message = self.pool.FindMessageTypeByName(
-        'google.protobuf.python.internal.Factory2Message')
-    # An extension defined in a message.
-    one_more_field = factory2_message.extensions_by_name['one_more_field']
-    self.pool.AddExtensionDescriptor(one_more_field)
-    # An extension defined at file scope.
-    factory_test2 = self.pool.FindFileByName(
-        'google/protobuf/internal/factory_test2.proto')
-    another_field = factory_test2.extensions_by_name['another_field']
-    self.pool.AddExtensionDescriptor(another_field)
-
-    extensions = self.pool.FindAllExtensions(factory1_message)
-    expected_extension_numbers = set([one_more_field, another_field])
-    self.assertEqual(expected_extension_numbers, set(extensions))
-    # Verify that mutating the returned list does not affect the pool.
-    extensions.append('unexpected_element')
-    # Get the extensions again, the returned value does not contain the
-    # 'unexpected_element'.
-    extensions = self.pool.FindAllExtensions(factory1_message)
-    self.assertEqual(expected_extension_numbers, set(extensions))
-
-  def testFindExtensionByNumber(self):
-    factory1_message = self.pool.FindMessageTypeByName(
-        'google.protobuf.python.internal.Factory1Message')
-    factory2_message = self.pool.FindMessageTypeByName(
-        'google.protobuf.python.internal.Factory2Message')
-    # An extension defined in a message.
-    one_more_field = factory2_message.extensions_by_name['one_more_field']
-    self.pool.AddExtensionDescriptor(one_more_field)
-    # An extension defined at file scope.
-    factory_test2 = self.pool.FindFileByName(
-        'google/protobuf/internal/factory_test2.proto')
-    another_field = factory_test2.extensions_by_name['another_field']
-    self.pool.AddExtensionDescriptor(another_field)
-
-    # An extension defined in a message.
-    extension = self.pool.FindExtensionByNumber(factory1_message, 1001)
-    self.assertEqual(extension.name, 'one_more_field')
-    # An extension defined at file scope.
-    extension = self.pool.FindExtensionByNumber(factory1_message, 1002)
-    self.assertEqual(extension.name, 'another_field')
-    with self.assertRaises(KeyError):
-      extension = self.pool.FindExtensionByNumber(factory1_message, 1234567)
-
   def testExtensionsAreNotFields(self):
     with self.assertRaises(KeyError):
       self.pool.FindFieldByName('google.protobuf.python.internal.another_field')
@@ -366,12 +259,6 @@
       self.pool.FindExtensionByName(
           'google.protobuf.python.internal.Factory1Message.list_value')
 
-  def testFindService(self):
-    service = self.pool.FindServiceByName('protobuf_unittest.TestService')
-    self.assertEqual(service.full_name, 'protobuf_unittest.TestService')
-    with self.assertRaises(KeyError):
-      self.pool.FindServiceByName('Does not exist')
-
   def testUserDefinedDB(self):
     db = descriptor_database.DescriptorDatabase()
     self.pool = descriptor_pool.DescriptorPool(db)
@@ -380,17 +267,24 @@
     self.testFindMessageTypeByName()
 
   def testAddSerializedFile(self):
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # Cpp extension cannot call Add on a DescriptorPool
-        # that uses a DescriptorDatabase.
-        # TODO(jieluo): Fix python and cpp extension diff.
-        return
     self.pool = descriptor_pool.DescriptorPool()
     self.pool.AddSerializedFile(self.factory_test1_fd.SerializeToString())
     self.pool.AddSerializedFile(self.factory_test2_fd.SerializeToString())
     self.testFindMessageTypeByName()
 
+  def testComplexNesting(self):
+    more_messages_desc = descriptor_pb2.FileDescriptorProto.FromString(
+        more_messages_pb2.DESCRIPTOR.serialized_pb)
+    test1_desc = descriptor_pb2.FileDescriptorProto.FromString(
+        descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
+    test2_desc = descriptor_pb2.FileDescriptorProto.FromString(
+        descriptor_pool_test2_pb2.DESCRIPTOR.serialized_pb)
+    self.pool.Add(more_messages_desc)
+    self.pool.Add(test1_desc)
+    self.pool.Add(test2_desc)
+    TEST1_FILE.CheckFile(self, self.pool)
+    TEST2_FILE.CheckFile(self, self.pool)
+
 
   def testEnumDefaultValue(self):
     """Test the default value of enums which don't start at zero."""
@@ -409,12 +303,6 @@
     self.assertIs(file_descriptor, descriptor_pool_test1_pb2.DESCRIPTOR)
     _CheckDefaultValue(file_descriptor)
 
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # Cpp extension cannot call Add on a DescriptorPool
-        # that uses a DescriptorDatabase.
-        # TODO(jieluo): Fix python and cpp extension diff.
-        return
     # Then check the dynamic pool and its internal DescriptorDatabase.
     descriptor_proto = descriptor_pb2.FileDescriptorProto.FromString(
         descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
@@ -462,110 +350,6 @@
             unittest_pb2.TestAllTypes.DESCRIPTOR.full_name))
     _CheckDefaultValues(message_class())
 
-  def testAddFileDescriptor(self):
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # Cpp extension cannot call Add on a DescriptorPool
-        # that uses a DescriptorDatabase.
-        # TODO(jieluo): Fix python and cpp extension diff.
-        return
-    file_desc = descriptor_pb2.FileDescriptorProto(name='some/file.proto')
-    self.pool.Add(file_desc)
-    self.pool.AddSerializedFile(file_desc.SerializeToString())
-
-  def testComplexNesting(self):
-    if isinstance(self, SecondaryDescriptorFromDescriptorDB):
-      if api_implementation.Type() == 'cpp':
-        # Cpp extension cannot call Add on a DescriptorPool
-        # that uses a DescriptorDatabase.
-        # TODO(jieluo): Fix python and cpp extension diff.
-        return
-    more_messages_desc = descriptor_pb2.FileDescriptorProto.FromString(
-        more_messages_pb2.DESCRIPTOR.serialized_pb)
-    test1_desc = descriptor_pb2.FileDescriptorProto.FromString(
-        descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
-    test2_desc = descriptor_pb2.FileDescriptorProto.FromString(
-        descriptor_pool_test2_pb2.DESCRIPTOR.serialized_pb)
-    self.pool.Add(more_messages_desc)
-    self.pool.Add(test1_desc)
-    self.pool.Add(test2_desc)
-    TEST1_FILE.CheckFile(self, self.pool)
-    TEST2_FILE.CheckFile(self, self.pool)
-
-
-class DefaultDescriptorPoolTest(DescriptorPoolTestBase, unittest.TestCase):
-
-  def setUp(self):
-    self.pool = descriptor_pool.Default()
-    self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
-        factory_test1_pb2.DESCRIPTOR.serialized_pb)
-    self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
-        factory_test2_pb2.DESCRIPTOR.serialized_pb)
-
-  def testFindMethods(self):
-    self.assertIs(
-        self.pool.FindFileByName('google/protobuf/unittest.proto'),
-        unittest_pb2.DESCRIPTOR)
-    self.assertIs(
-        self.pool.FindMessageTypeByName('protobuf_unittest.TestAllTypes'),
-        unittest_pb2.TestAllTypes.DESCRIPTOR)
-    self.assertIs(
-        self.pool.FindFieldByName(
-            'protobuf_unittest.TestAllTypes.optional_int32'),
-        unittest_pb2.TestAllTypes.DESCRIPTOR.fields_by_name['optional_int32'])
-    self.assertIs(
-        self.pool.FindEnumTypeByName('protobuf_unittest.ForeignEnum'),
-        unittest_pb2.ForeignEnum.DESCRIPTOR)
-    self.assertIs(
-        self.pool.FindExtensionByName(
-            'protobuf_unittest.optional_int32_extension'),
-        unittest_pb2.DESCRIPTOR.extensions_by_name['optional_int32_extension'])
-    self.assertIs(
-        self.pool.FindOneofByName('protobuf_unittest.TestAllTypes.oneof_field'),
-        unittest_pb2.TestAllTypes.DESCRIPTOR.oneofs_by_name['oneof_field'])
-    self.assertIs(
-        self.pool.FindServiceByName('protobuf_unittest.TestService'),
-        unittest_pb2.DESCRIPTOR.services_by_name['TestService'])
-
-
-class CreateDescriptorPoolTest(DescriptorPoolTestBase, unittest.TestCase):
-
-  def setUp(self):
-    self.pool = descriptor_pool.DescriptorPool()
-    self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
-        factory_test1_pb2.DESCRIPTOR.serialized_pb)
-    self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
-        factory_test2_pb2.DESCRIPTOR.serialized_pb)
-    self.pool.Add(self.factory_test1_fd)
-    self.pool.Add(self.factory_test2_fd)
-
-    self.pool.Add(descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_import_public_pb2.DESCRIPTOR.serialized_pb))
-    self.pool.Add(descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_import_pb2.DESCRIPTOR.serialized_pb))
-    self.pool.Add(descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_pb2.DESCRIPTOR.serialized_pb))
-
-
-class SecondaryDescriptorFromDescriptorDB(DescriptorPoolTestBase,
-                                          unittest.TestCase):
-
-  def setUp(self):
-    self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
-        factory_test1_pb2.DESCRIPTOR.serialized_pb)
-    self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
-        factory_test2_pb2.DESCRIPTOR.serialized_pb)
-    db = descriptor_database.DescriptorDatabase()
-    db.Add(self.factory_test1_fd)
-    db.Add(self.factory_test2_fd)
-    db.Add(descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_import_public_pb2.DESCRIPTOR.serialized_pb))
-    db.Add(descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_import_pb2.DESCRIPTOR.serialized_pb))
-    db.Add(descriptor_pb2.FileDescriptorProto.FromString(
-        unittest_pb2.DESCRIPTOR.serialized_pb))
-    self.pool = descriptor_pool.DescriptorPool(descriptor_db=db)
-
 
 class ProtoFile(object):
 
@@ -636,10 +420,10 @@
       subtype.CheckType(test, desc, name, file_desc)
 
     for index, (name, field) in enumerate(self.field_list):
-      field.CheckField(test, desc, name, index, file_desc)
+      field.CheckField(test, desc, name, index)
 
     for index, (name, field) in enumerate(self.extensions):
-      field.CheckField(test, desc, name, index, file_desc)
+      field.CheckField(test, desc, name, index)
 
 
 class EnumField(object):
@@ -649,7 +433,7 @@
     self.type_name = type_name
     self.default_value = default_value
 
-  def CheckField(self, test, msg_desc, name, index, file_desc):
+  def CheckField(self, test, msg_desc, name, index):
     field_desc = msg_desc.fields_by_name[name]
     enum_desc = msg_desc.enum_types_by_name[self.type_name]
     test.assertEqual(name, field_desc.name)
@@ -663,10 +447,8 @@
     test.assertTrue(field_desc.has_default_value)
     test.assertEqual(enum_desc.values_by_name[self.default_value].number,
                      field_desc.default_value)
-    test.assertFalse(enum_desc.values_by_name[self.default_value].has_options)
     test.assertEqual(msg_desc, field_desc.containing_type)
     test.assertEqual(enum_desc, field_desc.enum_type)
-    test.assertEqual(file_desc, enum_desc.file)
 
 
 class MessageField(object):
@@ -675,7 +457,7 @@
     self.number = number
     self.type_name = type_name
 
-  def CheckField(self, test, msg_desc, name, index, file_desc):
+  def CheckField(self, test, msg_desc, name, index):
     field_desc = msg_desc.fields_by_name[name]
     field_type_desc = msg_desc.nested_types_by_name[self.type_name]
     test.assertEqual(name, field_desc.name)
@@ -689,12 +471,6 @@
     test.assertFalse(field_desc.has_default_value)
     test.assertEqual(msg_desc, field_desc.containing_type)
     test.assertEqual(field_type_desc, field_desc.message_type)
-    test.assertEqual(file_desc, field_desc.file)
-    # TODO(jieluo): Fix python and cpp extension diff for message field
-    # default value.
-    if api_implementation.Type() == 'cpp':
-      test.assertRaises(
-          NotImplementedError, getattr, field_desc, 'default_value')
 
 
 class StringField(object):
@@ -703,7 +479,7 @@
     self.number = number
     self.default_value = default_value
 
-  def CheckField(self, test, msg_desc, name, index, file_desc):
+  def CheckField(self, test, msg_desc, name, index):
     field_desc = msg_desc.fields_by_name[name]
     test.assertEqual(name, field_desc.name)
     expected_field_full_name = '.'.join([msg_desc.full_name, name])
@@ -715,7 +491,6 @@
                      field_desc.cpp_type)
     test.assertTrue(field_desc.has_default_value)
     test.assertEqual(self.default_value, field_desc.default_value)
-    test.assertEqual(file_desc, field_desc.file)
 
 
 class ExtensionField(object):
@@ -724,7 +499,7 @@
     self.number = number
     self.extended_type = extended_type
 
-  def CheckField(self, test, msg_desc, name, index, file_desc):
+  def CheckField(self, test, msg_desc, name, index):
     field_desc = msg_desc.extensions_by_name[name]
     test.assertEqual(name, field_desc.name)
     expected_field_full_name = '.'.join([msg_desc.full_name, name])
@@ -739,7 +514,6 @@
     test.assertEqual(msg_desc, field_desc.extension_scope)
     test.assertEqual(msg_desc, field_desc.message_type)
     test.assertEqual(self.extended_type, field_desc.containing_type.name)
-    test.assertEqual(file_desc, field_desc.file)
 
 
 class AddDescriptorTest(unittest.TestCase):
@@ -818,17 +592,6 @@
 
   @unittest.skipIf(api_implementation.Type() == 'cpp',
                    'With the cpp implementation, Add() must be called first')
-  def testService(self):
-    pool = descriptor_pool.DescriptorPool()
-    with self.assertRaises(KeyError):
-      pool.FindServiceByName('protobuf_unittest.TestService')
-    pool.AddServiceDescriptor(unittest_pb2._TESTSERVICE)
-    self.assertEqual(
-        'protobuf_unittest.TestService',
-        pool.FindServiceByName('protobuf_unittest.TestService').full_name)
-
-  @unittest.skipIf(api_implementation.Type() == 'cpp',
-                   'With the cpp implementation, Add() must be called first')
   def testFile(self):
     pool = descriptor_pool.DescriptorPool()
     pool.AddFileDescriptor(unittest_pb2.DESCRIPTOR)
@@ -866,55 +629,43 @@
                      'some/file.proto')
     self.assertEqual(pool.FindMessageTypeByName('package.Message').name,
                      'Message')
-    # Test no package
-    file_proto = descriptor_pb2.FileDescriptorProto(
-        name='some/filename/container.proto')
-    message_proto = file_proto.message_type.add(
-        name='TopMessage')
-    message_proto.field.add(
-        name='bb',
-        number=1,
-        type=descriptor_pb2.FieldDescriptorProto.TYPE_INT32,
-        label=descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL)
-    enum_proto = file_proto.enum_type.add(name='TopEnum')
-    enum_proto.value.add(name='FOREIGN_FOO', number=4)
-    file_proto.service.add(name='TopService')
-    pool = descriptor_pool.DescriptorPool()
-    pool.Add(file_proto)
-    self.assertEqual('TopMessage',
-                     pool.FindMessageTypeByName('TopMessage').name)
-    self.assertEqual('TopEnum', pool.FindEnumTypeByName('TopEnum').name)
-    self.assertEqual('TopService', pool.FindServiceByName('TopService').name)
 
-  def testFileDescriptorOptionsWithCustomDescriptorPool(self):
-    # Create a descriptor pool, and add a new FileDescriptorProto to it.
-    pool = descriptor_pool.DescriptorPool()
-    file_name = 'file_descriptor_options_with_custom_descriptor_pool.proto'
-    file_descriptor_proto = descriptor_pb2.FileDescriptorProto(name=file_name)
-    extension_id = file_options_test_pb2.foo_options
-    file_descriptor_proto.options.Extensions[extension_id].foo_name = 'foo'
-    pool.Add(file_descriptor_proto)
-    # The options set on the FileDescriptorProto should be available in the
-    # descriptor even if they contain extensions that cannot be deserialized
-    # using the pool.
-    file_descriptor = pool.FindFileByName(file_name)
-    options = file_descriptor.GetOptions()
-    self.assertEqual('foo', options.Extensions[extension_id].foo_name)
-    # The object returned by GetOptions() is cached.
-    self.assertIs(options, file_descriptor.GetOptions())
 
-  def testAddTypeError(self):
-    pool = descriptor_pool.DescriptorPool()
-    with self.assertRaises(TypeError):
-      pool.AddDescriptor(0)
-    with self.assertRaises(TypeError):
-      pool.AddEnumDescriptor(0)
-    with self.assertRaises(TypeError):
-      pool.AddServiceDescriptor(0)
-    with self.assertRaises(TypeError):
-      pool.AddExtensionDescriptor(0)
-    with self.assertRaises(TypeError):
-      pool.AddFileDescriptor(0)
+@unittest.skipIf(
+    api_implementation.Type() != 'cpp',
+    'default_pool is only supported by the C++ implementation')
+class DefaultPoolTest(unittest.TestCase):
+
+  def testFindMethods(self):
+    # pylint: disable=g-import-not-at-top
+    from google.protobuf.pyext import _message
+    pool = _message.default_pool
+    self.assertIs(
+        pool.FindFileByName('google/protobuf/unittest.proto'),
+        unittest_pb2.DESCRIPTOR)
+    self.assertIs(
+        pool.FindMessageTypeByName('protobuf_unittest.TestAllTypes'),
+        unittest_pb2.TestAllTypes.DESCRIPTOR)
+    self.assertIs(
+        pool.FindFieldByName('protobuf_unittest.TestAllTypes.optional_int32'),
+        unittest_pb2.TestAllTypes.DESCRIPTOR.fields_by_name['optional_int32'])
+    self.assertIs(
+        pool.FindExtensionByName('protobuf_unittest.optional_int32_extension'),
+        unittest_pb2.DESCRIPTOR.extensions_by_name['optional_int32_extension'])
+    self.assertIs(
+        pool.FindEnumTypeByName('protobuf_unittest.ForeignEnum'),
+        unittest_pb2.ForeignEnum.DESCRIPTOR)
+    self.assertIs(
+        pool.FindOneofByName('protobuf_unittest.TestAllTypes.oneof_field'),
+        unittest_pb2.TestAllTypes.DESCRIPTOR.oneofs_by_name['oneof_field'])
+
+  def testAddFileDescriptor(self):
+    # pylint: disable=g-import-not-at-top
+    from google.protobuf.pyext import _message
+    pool = _message.default_pool
+    file_desc = descriptor_pb2.FileDescriptorProto(name='some/file.proto')
+    pool.Add(file_desc)
+    pool.AddSerializedFile(file_desc.SerializeToString())
 
 
 TEST1_FILE = ProtoFile(
diff --git a/python/google/protobuf/internal/descriptor_test.py b/python/google/protobuf/internal/descriptor_test.py
index f1d5934..b8e7555 100755
--- a/python/google/protobuf/internal/descriptor_test.py
+++ b/python/google/protobuf/internal/descriptor_test.py
@@ -77,24 +77,27 @@
     enum_proto.value.add(name='FOREIGN_BAR', number=5)
     enum_proto.value.add(name='FOREIGN_BAZ', number=6)
 
-    file_proto.message_type.add(name='ResponseMessage')
-    service_proto = file_proto.service.add(
-        name='Service')
-    method_proto = service_proto.method.add(
-        name='CallMethod',
-        input_type='.protobuf_unittest.NestedMessage',
-        output_type='.protobuf_unittest.ResponseMessage')
-
-    # Note: Calling DescriptorPool.Add() multiple times with the same file only
-    # works if the input is canonical; in particular, all type names must be
-    # fully qualified.
     self.pool = self.GetDescriptorPool()
     self.pool.Add(file_proto)
     self.my_file = self.pool.FindFileByName(file_proto.name)
     self.my_message = self.my_file.message_types_by_name[message_proto.name]
     self.my_enum = self.my_message.enum_types_by_name[enum_proto.name]
-    self.my_service = self.my_file.services_by_name[service_proto.name]
-    self.my_method = self.my_service.methods_by_name[method_proto.name]
+
+    self.my_method = descriptor.MethodDescriptor(
+        name='Bar',
+        full_name='protobuf_unittest.TestService.Bar',
+        index=0,
+        containing_service=None,
+        input_type=None,
+        output_type=None)
+    self.my_service = descriptor.ServiceDescriptor(
+        name='TestServiceWithOptions',
+        full_name='protobuf_unittest.TestServiceWithOptions',
+        file=self.my_file,
+        index=0,
+        methods=[
+            self.my_method
+        ])
 
   def GetDescriptorPool(self):
     return symbol_database.Default().pool
@@ -107,12 +110,6 @@
         self.my_message.enum_types_by_name[
             'ForeignEnum'].values_by_number[4].name,
         self.my_message.EnumValueName('ForeignEnum', 4))
-    with self.assertRaises(KeyError):
-      self.my_message.EnumValueName('ForeignEnum', 999)
-    with self.assertRaises(KeyError):
-      self.my_message.EnumValueName('NoneEnum', 999)
-    with self.assertRaises(TypeError):
-      self.my_message.EnumValueName()
 
   def testEnumFixups(self):
     self.assertEqual(self.my_enum, self.my_enum.values[0].type)
@@ -140,18 +137,15 @@
 
   def testSimpleCustomOptions(self):
     file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
-    message_descriptor = (unittest_custom_options_pb2.
-                          TestMessageWithCustomOptions.DESCRIPTOR)
-    field_descriptor = message_descriptor.fields_by_name['field1']
-    oneof_descriptor = message_descriptor.oneofs_by_name['AnOneof']
-    enum_descriptor = message_descriptor.enum_types_by_name['AnEnum']
-    enum_value_descriptor = (message_descriptor.
-                             enum_values_by_name['ANENUM_VAL2'])
-    other_enum_value_descriptor = (message_descriptor.
-                                   enum_values_by_name['ANENUM_VAL1'])
-    service_descriptor = (unittest_custom_options_pb2.
-                          TestServiceWithCustomOptions.DESCRIPTOR)
-    method_descriptor = service_descriptor.FindMethodByName('Foo')
+    message_descriptor =\
+        unittest_custom_options_pb2.TestMessageWithCustomOptions.DESCRIPTOR
+    field_descriptor = message_descriptor.fields_by_name["field1"]
+    enum_descriptor = message_descriptor.enum_types_by_name["AnEnum"]
+    enum_value_descriptor =\
+        message_descriptor.enum_values_by_name["ANENUM_VAL2"]
+    service_descriptor =\
+        unittest_custom_options_pb2.TestServiceWithCustomOptions.DESCRIPTOR
+    method_descriptor = service_descriptor.FindMethodByName("Foo")
 
     file_options = file_descriptor.GetOptions()
     file_opt1 = unittest_custom_options_pb2.file_opt1
@@ -164,9 +158,6 @@
     self.assertEqual(8765432109, field_options.Extensions[field_opt1])
     field_opt2 = unittest_custom_options_pb2.field_opt2
     self.assertEqual(42, field_options.Extensions[field_opt2])
-    oneof_options = oneof_descriptor.GetOptions()
-    oneof_opt1 = unittest_custom_options_pb2.oneof_opt1
-    self.assertEqual(-99, oneof_options.Extensions[oneof_opt1])
     enum_options = enum_descriptor.GetOptions()
     enum_opt1 = unittest_custom_options_pb2.enum_opt1
     self.assertEqual(-789, enum_options.Extensions[enum_opt1])
@@ -186,11 +177,6 @@
         unittest_custom_options_pb2.DummyMessageContainingEnum.DESCRIPTOR)
     self.assertTrue(file_descriptor.has_options)
     self.assertFalse(message_descriptor.has_options)
-    self.assertTrue(field_descriptor.has_options)
-    self.assertTrue(oneof_descriptor.has_options)
-    self.assertTrue(enum_descriptor.has_options)
-    self.assertTrue(enum_value_descriptor.has_options)
-    self.assertFalse(other_enum_value_descriptor.has_options)
 
   def testDifferentCustomOptionTypes(self):
     kint32min = -2**31
@@ -413,12 +399,6 @@
     self.assertEqual(self.my_file.name, 'some/filename/some.proto')
     self.assertEqual(self.my_file.package, 'protobuf_unittest')
     self.assertEqual(self.my_file.pool, self.pool)
-    self.assertFalse(self.my_file.has_options)
-    self.assertEqual('proto2', self.my_file.syntax)
-    file_proto = descriptor_pb2.FileDescriptorProto()
-    self.my_file.CopyToProto(file_proto)
-    self.assertEqual(self.my_file.serialized_pb,
-                     file_proto.SerializeToString())
     # Generated modules also belong to the default pool.
     self.assertEqual(unittest_pb2.DESCRIPTOR.pool, descriptor_pool.Default())
 
@@ -426,31 +406,13 @@
       api_implementation.Type() != 'cpp' or api_implementation.Version() != 2,
       'Immutability of descriptors is only enforced in v2 implementation')
   def testImmutableCppDescriptor(self):
-    file_descriptor = unittest_pb2.DESCRIPTOR
     message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
-    field_descriptor = message_descriptor.fields_by_name['optional_int32']
-    enum_descriptor = message_descriptor.enum_types_by_name['NestedEnum']
-    oneof_descriptor = message_descriptor.oneofs_by_name['oneof_field']
     with self.assertRaises(AttributeError):
       message_descriptor.fields_by_name = None
     with self.assertRaises(TypeError):
       message_descriptor.fields_by_name['Another'] = None
     with self.assertRaises(TypeError):
       message_descriptor.fields.append(None)
-    with self.assertRaises(AttributeError):
-      field_descriptor.containing_type = message_descriptor
-    with self.assertRaises(AttributeError):
-      file_descriptor.has_options = False
-    with self.assertRaises(AttributeError):
-      field_descriptor.has_options = False
-    with self.assertRaises(AttributeError):
-      oneof_descriptor.has_options = False
-    with self.assertRaises(AttributeError):
-      enum_descriptor.has_options = False
-    with self.assertRaises(AttributeError) as e:
-      message_descriptor.has_options = True
-    self.assertEqual('attribute is not writable: has_options',
-                     str(e.exception))
 
 
 class NewDescriptorTest(DescriptorTest):
@@ -479,12 +441,6 @@
     self.CheckDescriptorMapping(message_descriptor.fields_by_name)
     self.CheckDescriptorMapping(message_descriptor.fields_by_number)
     self.CheckDescriptorMapping(message_descriptor.fields_by_camelcase_name)
-    self.CheckDescriptorMapping(message_descriptor.enum_types_by_name)
-    self.CheckDescriptorMapping(message_descriptor.enum_values_by_name)
-    self.CheckDescriptorMapping(message_descriptor.oneofs_by_name)
-    self.CheckDescriptorMapping(message_descriptor.enum_types[0].values_by_name)
-    # Test extension range
-    self.assertEqual(message_descriptor.extension_ranges, [])
 
   def CheckFieldDescriptor(self, field_descriptor):
     # Basic properties
@@ -493,7 +449,6 @@
     self.assertEqual(field_descriptor.full_name,
                      'protobuf_unittest.TestAllTypes.optional_int32')
     self.assertEqual(field_descriptor.containing_type.name, 'TestAllTypes')
-    self.assertEqual(field_descriptor.file, unittest_pb2.DESCRIPTOR)
     # Test equality and hashability
     self.assertEqual(field_descriptor, field_descriptor)
     self.assertEqual(
@@ -505,73 +460,32 @@
         field_descriptor)
     self.assertIn(field_descriptor, [field_descriptor])
     self.assertIn(field_descriptor, {field_descriptor: None})
-    self.assertEqual(None, field_descriptor.extension_scope)
-    self.assertEqual(None, field_descriptor.enum_type)
-    if api_implementation.Type() == 'cpp':
-      # For test coverage only
-      self.assertEqual(field_descriptor.id, field_descriptor.id)
 
   def CheckDescriptorSequence(self, sequence):
     # Verifies that a property like 'messageDescriptor.fields' has all the
     # properties of an immutable abc.Sequence.
-    self.assertNotEqual(sequence,
-                        unittest_pb2.TestAllExtensions.DESCRIPTOR.fields)
-    self.assertNotEqual(sequence, [])
-    self.assertNotEqual(sequence, 1)
-    self.assertFalse(sequence == 1)  # Only for cpp test coverage
-    self.assertEqual(sequence, sequence)
-    expected_list = list(sequence)
-    self.assertEqual(expected_list, sequence)
     self.assertGreater(len(sequence), 0)  # Sized
-    self.assertEqual(len(sequence), len(expected_list))  # Iterable
-    self.assertEqual(sequence[len(sequence) -1], sequence[-1])
+    self.assertEqual(len(sequence), len(list(sequence)))  # Iterable
     item = sequence[0]
     self.assertEqual(item, sequence[0])
     self.assertIn(item, sequence)  # Container
     self.assertEqual(sequence.index(item), 0)
     self.assertEqual(sequence.count(item), 1)
-    other_item = unittest_pb2.NestedTestAllTypes.DESCRIPTOR.fields[0]
-    self.assertNotIn(other_item, sequence)
-    self.assertEqual(sequence.count(other_item), 0)
-    self.assertRaises(ValueError, sequence.index, other_item)
-    self.assertRaises(ValueError, sequence.index, [])
     reversed_iterator = reversed(sequence)
     self.assertEqual(list(reversed_iterator), list(sequence)[::-1])
     self.assertRaises(StopIteration, next, reversed_iterator)
-    expected_list[0] = 'change value'
-    self.assertNotEqual(expected_list, sequence)
-    # TODO(jieluo): Change __repr__ support for DescriptorSequence.
-    if api_implementation.Type() == 'python':
-      self.assertEqual(str(list(sequence)), str(sequence))
-    else:
-      self.assertEqual(str(sequence)[0], '<')
 
   def CheckDescriptorMapping(self, mapping):
     # Verifies that a property like 'messageDescriptor.fields' has all the
     # properties of an immutable abc.Mapping.
-    self.assertNotEqual(
-        mapping, unittest_pb2.TestAllExtensions.DESCRIPTOR.fields_by_name)
-    self.assertNotEqual(mapping, {})
-    self.assertNotEqual(mapping, 1)
-    self.assertFalse(mapping == 1)  # Only for cpp test coverage
-    excepted_dict = dict(mapping.items())
-    self.assertEqual(mapping, excepted_dict)
-    self.assertEqual(mapping, mapping)
     self.assertGreater(len(mapping), 0)  # Sized
-    self.assertEqual(len(mapping), len(excepted_dict))  # Iterable
+    self.assertEqual(len(mapping), len(list(mapping)))  # Iterable
     if sys.version_info >= (3,):
       key, item = next(iter(mapping.items()))
     else:
       key, item = mapping.items()[0]
     self.assertIn(key, mapping)  # Container
     self.assertEqual(mapping.get(key), item)
-    with self.assertRaises(TypeError):
-      mapping.get()
-    # TODO(jieluo): Fix python and cpp extension diff.
-    if api_implementation.Type() == 'python':
-      self.assertRaises(TypeError, mapping.get, [])
-    else:
-      self.assertEqual(None, mapping.get([]))
     # keys(), iterkeys() &co
     item = (next(iter(mapping.keys())), next(iter(mapping.values())))
     self.assertEqual(item, next(iter(mapping.items())))
@@ -582,18 +496,6 @@
       CheckItems(mapping.keys(), mapping.iterkeys())
       CheckItems(mapping.values(), mapping.itervalues())
       CheckItems(mapping.items(), mapping.iteritems())
-    excepted_dict[key] = 'change value'
-    self.assertNotEqual(mapping, excepted_dict)
-    del excepted_dict[key]
-    excepted_dict['new_key'] = 'new'
-    self.assertNotEqual(mapping, excepted_dict)
-    self.assertRaises(KeyError, mapping.__getitem__, 'key_error')
-    self.assertRaises(KeyError, mapping.__getitem__, len(mapping) + 1)
-    # TODO(jieluo): Add __repr__ support for DescriptorMapping.
-    if api_implementation.Type() == 'python':
-      self.assertEqual(len(str(dict(mapping.items()))), len(str(mapping)))
-    else:
-      self.assertEqual(str(mapping)[0], '<')
 
   def testDescriptor(self):
     message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
@@ -603,26 +505,13 @@
     field_descriptor = message_descriptor.fields_by_camelcase_name[
         'optionalInt32']
     self.CheckFieldDescriptor(field_descriptor)
-    enum_descriptor = unittest_pb2.DESCRIPTOR.enum_types_by_name[
-        'ForeignEnum']
-    self.assertEqual(None, enum_descriptor.containing_type)
-    # Test extension range
-    self.assertEqual(
-        unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges,
-        [(1, 536870912)])
-    self.assertEqual(
-        unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges,
-        [(42, 43), (4143, 4244), (65536, 536870912)])
 
   def testCppDescriptorContainer(self):
-    containing_file = unittest_pb2.DESCRIPTOR
-    self.CheckDescriptorSequence(containing_file.dependencies)
-    self.CheckDescriptorMapping(containing_file.message_types_by_name)
-    self.CheckDescriptorMapping(containing_file.enum_types_by_name)
-    self.CheckDescriptorMapping(containing_file.services_by_name)
-    self.CheckDescriptorMapping(containing_file.extensions_by_name)
-    self.CheckDescriptorMapping(
-        unittest_pb2.TestNestedExtension.DESCRIPTOR.extensions_by_name)
+    # Check that the collection is still valid even if the parent disappeared.
+    enum = unittest_pb2.TestAllTypes.DESCRIPTOR.enum_types_by_name['NestedEnum']
+    values = enum.values
+    del enum
+    self.assertEqual('FOO', values[0].name)
 
   def testCppDescriptorContainer_Iterator(self):
     # Same test with the iterator
@@ -631,24 +520,6 @@
     del enum
     self.assertEqual('FOO', next(values_iter).name)
 
-  def testServiceDescriptor(self):
-    service_descriptor = unittest_pb2.DESCRIPTOR.services_by_name['TestService']
-    self.assertEqual(service_descriptor.name, 'TestService')
-    self.assertEqual(service_descriptor.methods[0].name, 'Foo')
-    self.assertIs(service_descriptor.file, unittest_pb2.DESCRIPTOR)
-    self.assertEqual(service_descriptor.index, 0)
-    self.CheckDescriptorMapping(service_descriptor.methods_by_name)
-
-  def testOneofDescriptor(self):
-    message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
-    oneof_descriptor = message_descriptor.oneofs_by_name['oneof_field']
-    self.assertFalse(oneof_descriptor.has_options)
-    self.assertEqual(message_descriptor, oneof_descriptor.containing_type)
-    self.assertEqual('oneof_field', oneof_descriptor.name)
-    self.assertEqual('protobuf_unittest.TestAllTypes.oneof_field',
-                     oneof_descriptor.full_name)
-    self.assertEqual(0, oneof_descriptor.index)
-
 
 class DescriptorCopyToProtoTest(unittest.TestCase):
   """Tests for CopyTo functions of Descriptor."""
@@ -785,64 +656,49 @@
         descriptor_pb2.DescriptorProto,
         TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII)
 
-  def testCopyToProto_FileDescriptor(self):
-    UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = ("""
-      name: 'google/protobuf/unittest_import.proto'
-      package: 'protobuf_unittest_import'
-      dependency: 'google/protobuf/unittest_import_public.proto'
-      message_type: <
-        name: 'ImportMessage'
-        field: <
-          name: 'd'
-          number: 1
-          label: 1  # Optional
-          type: 5  # TYPE_INT32
-        >
-      >
-      """ +
-      """enum_type: <
-        name: 'ImportEnum'
-        value: <
-          name: 'IMPORT_FOO'
-          number: 7
-        >
-        value: <
-          name: 'IMPORT_BAR'
-          number: 8
-        >
-        value: <
-          name: 'IMPORT_BAZ'
-          number: 9
-        >
-      >
-      enum_type: <
-        name: 'ImportEnumForMap'
-        value: <
-          name: 'UNKNOWN'
-          number: 0
-        >
-        value: <
-          name: 'FOO'
-          number: 1
-        >
-        value: <
-          name: 'BAR'
-          number: 2
-        >
-      >
-      options: <
-        java_package: 'com.google.protobuf.test'
-        optimize_for: 1  # SPEED
-      """ +
-      """
-        cc_enable_arenas: true
-      >
-      public_dependency: 0
-    """)
-    self._InternalTestCopyToProto(
-        unittest_import_pb2.DESCRIPTOR,
-        descriptor_pb2.FileDescriptorProto,
-        UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII)
+  # Disable this test so we can make changes to the proto file.
+  # TODO(xiaofeng): Enable this test after cl/55530659 is submitted.
+  #
+  # def testCopyToProto_FileDescriptor(self):
+  #   UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = ("""
+  #     name: 'google/protobuf/unittest_import.proto'
+  #     package: 'protobuf_unittest_import'
+  #     dependency: 'google/protobuf/unittest_import_public.proto'
+  #     message_type: <
+  #       name: 'ImportMessage'
+  #       field: <
+  #         name: 'd'
+  #         number: 1
+  #         label: 1  # Optional
+  #         type: 5  # TYPE_INT32
+  #       >
+  #     >
+  #     """ +
+  #     """enum_type: <
+  #       name: 'ImportEnum'
+  #       value: <
+  #         name: 'IMPORT_FOO'
+  #         number: 7
+  #       >
+  #       value: <
+  #         name: 'IMPORT_BAR'
+  #         number: 8
+  #       >
+  #       value: <
+  #         name: 'IMPORT_BAZ'
+  #         number: 9
+  #       >
+  #     >
+  #     options: <
+  #       java_package: 'com.google.protobuf.test'
+  #       optimize_for: 1  # SPEED
+  #     >
+  #     public_dependency: 0
+  #  """)
+  #  self._InternalTestCopyToProto(
+  #      unittest_import_pb2.DESCRIPTOR,
+  #      descriptor_pb2.FileDescriptorProto,
+  #      UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII)
 
   def testCopyToProto_ServiceDescriptor(self):
     TEST_SERVICE_ASCII = """
@@ -858,47 +714,12 @@
         output_type: '.protobuf_unittest.BarResponse'
       >
       """
-    self._InternalTestCopyToProto(
-        unittest_pb2.TestService.DESCRIPTOR,
-        descriptor_pb2.ServiceDescriptorProto,
-        TEST_SERVICE_ASCII)
-
-  @unittest.skipIf(
-      api_implementation.Type() == 'python',
-      'It is not implemented in python.')
-  # TODO(jieluo): Add support for pure python or remove in c extension.
-  def testCopyToProto_MethodDescriptor(self):
-    expected_ascii = """
-      name: 'Foo'
-      input_type: '.protobuf_unittest.FooRequest'
-      output_type: '.protobuf_unittest.FooResponse'
-    """
-    method_descriptor = unittest_pb2.TestService.DESCRIPTOR.FindMethodByName(
-        'Foo')
-    self._InternalTestCopyToProto(
-        method_descriptor,
-        descriptor_pb2.MethodDescriptorProto,
-        expected_ascii)
-
-  @unittest.skipIf(
-      api_implementation.Type() == 'python',
-      'Pure python does not raise error.')
-  # TODO(jieluo): Fix pure python to check with the proto type.
-  def testCopyToProto_TypeError(self):
-    file_proto = descriptor_pb2.FileDescriptorProto()
-    self.assertRaises(TypeError,
-                      unittest_pb2.TestEmptyMessage.DESCRIPTOR.CopyToProto,
-                      file_proto)
-    self.assertRaises(TypeError,
-                      unittest_pb2.ForeignEnum.DESCRIPTOR.CopyToProto,
-                      file_proto)
-    self.assertRaises(TypeError,
-                      unittest_pb2.TestService.DESCRIPTOR.CopyToProto,
-                      file_proto)
-    proto = descriptor_pb2.DescriptorProto()
-    self.assertRaises(TypeError,
-                      unittest_import_pb2.DESCRIPTOR.CopyToProto,
-                      proto)
+    # TODO(rocking): enable this test after the proto descriptor change is
+    # checked in.
+    #self._InternalTestCopyToProto(
+    #    unittest_pb2.TestService.DESCRIPTOR,
+    #    descriptor_pb2.ServiceDescriptorProto,
+    #    TEST_SERVICE_ASCII)
 
 
 class MakeDescriptorTest(unittest.TestCase):
@@ -944,11 +765,6 @@
                      'Foo2.Sub.bar_field')
     self.assertEqual(result.nested_types[0].fields[0].enum_type,
                      result.nested_types[0].enum_types[0])
-    self.assertFalse(result.has_options)
-    self.assertFalse(result.fields[0].has_options)
-    if api_implementation.Type() == 'cpp':
-      with self.assertRaises(AttributeError):
-        result.fields[0].has_options = False
 
   def testMakeDescriptorWithUnsignedIntField(self):
     file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
@@ -1001,23 +817,6 @@
       self.assertEqual(result.fields[index].camelcase_name,
                        camelcase_names[index])
 
-  def testJsonName(self):
-    descriptor_proto = descriptor_pb2.DescriptorProto()
-    descriptor_proto.name = 'TestJsonName'
-    names = ['field_name', 'fieldName', 'FieldName',
-             '_field_name', 'FIELD_NAME', 'json_name']
-    json_names = ['fieldName', 'fieldName', 'FieldName',
-                  'FieldName', 'FIELDNAME', '@type']
-    for index in range(len(names)):
-      field = descriptor_proto.field.add()
-      field.number = index + 1
-      field.name = names[index]
-    field.json_name = '@type'
-    result = descriptor.MakeDescriptor(descriptor_proto)
-    for index in range(len(json_names)):
-      self.assertEqual(result.fields[index].json_name,
-                       json_names[index])
-
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/python/google/protobuf/internal/encoder.py b/python/google/protobuf/internal/encoder.py
index 40c62d6..48ef2df 100755
--- a/python/google/protobuf/internal/encoder.py
+++ b/python/google/protobuf/internal/encoder.py
@@ -340,7 +340,7 @@
 # Map is special: it needs custom logic to compute its size properly.
 
 
-def MapSizer(field_descriptor, is_message_map):
+def MapSizer(field_descriptor):
   """Returns a sizer for a map field."""
 
   # Can't look at field_descriptor.message_type._concrete_class because it may
@@ -355,12 +355,9 @@
       # It's wasteful to create the messages and throw them away one second
       # later since we'll do the same for the actual encode.  But there's not an
       # obvious way to avoid this within the current design without tons of code
-      # duplication. For message map, value.ByteSize() should be called to
-      # update the status.
+      # duplication.
       entry_msg = message_type._concrete_class(key=key, value=value)
       total += message_sizer(entry_msg)
-      if is_message_map:
-        value.ByteSize()
     return total
 
   return FieldSize
@@ -372,7 +369,7 @@
 def _VarintEncoder():
   """Return an encoder for a basic varint value (does not include tag)."""
 
-  def EncodeVarint(write, value, unused_deterministic):
+  def EncodeVarint(write, value):
     bits = value & 0x7f
     value >>= 7
     while value:
@@ -388,7 +385,7 @@
   """Return an encoder for a basic signed varint value (does not include
   tag)."""
 
-  def EncodeSignedVarint(write, value, unused_deterministic):
+  def EncodeSignedVarint(write, value):
     if value < 0:
       value += (1 << 64)
     bits = value & 0x7f
@@ -411,14 +408,14 @@
   called at startup time so it doesn't need to be fast."""
 
   pieces = []
-  _EncodeVarint(pieces.append, value, True)
+  _EncodeVarint(pieces.append, value)
   return b"".join(pieces)
 
 
 def TagBytes(field_number, wire_type):
   """Encode the given tag and return the bytes.  Only called at startup."""
 
-  return six.binary_type( _VarintBytes(wire_format.PackTag(field_number, wire_type)) )
+  return _VarintBytes(wire_format.PackTag(field_number, wire_type))
 
 # --------------------------------------------------------------------
 # As with sizers (see above), we have a number of common encoder
@@ -440,27 +437,27 @@
     if is_packed:
       tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
       local_EncodeVarint = _EncodeVarint
-      def EncodePackedField(write, value, deterministic):
+      def EncodePackedField(write, value):
         write(tag_bytes)
         size = 0
         for element in value:
           size += compute_value_size(element)
-        local_EncodeVarint(write, size, deterministic)
+        local_EncodeVarint(write, size)
         for element in value:
-          encode_value(write, element, deterministic)
+          encode_value(write, element)
       return EncodePackedField
     elif is_repeated:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeRepeatedField(write, value, deterministic):
+      def EncodeRepeatedField(write, value):
         for element in value:
           write(tag_bytes)
-          encode_value(write, element, deterministic)
+          encode_value(write, element)
       return EncodeRepeatedField
     else:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeField(write, value, deterministic):
+      def EncodeField(write, value):
         write(tag_bytes)
-        return encode_value(write, value, deterministic)
+        return encode_value(write, value)
       return EncodeField
 
   return SpecificEncoder
@@ -474,27 +471,27 @@
     if is_packed:
       tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
       local_EncodeVarint = _EncodeVarint
-      def EncodePackedField(write, value, deterministic):
+      def EncodePackedField(write, value):
         write(tag_bytes)
         size = 0
         for element in value:
           size += compute_value_size(modify_value(element))
-        local_EncodeVarint(write, size, deterministic)
+        local_EncodeVarint(write, size)
         for element in value:
-          encode_value(write, modify_value(element), deterministic)
+          encode_value(write, modify_value(element))
       return EncodePackedField
     elif is_repeated:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeRepeatedField(write, value, deterministic):
+      def EncodeRepeatedField(write, value):
         for element in value:
           write(tag_bytes)
-          encode_value(write, modify_value(element), deterministic)
+          encode_value(write, modify_value(element))
       return EncodeRepeatedField
     else:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeField(write, value, deterministic):
+      def EncodeField(write, value):
         write(tag_bytes)
-        return encode_value(write, modify_value(value), deterministic)
+        return encode_value(write, modify_value(value))
       return EncodeField
 
   return SpecificEncoder
@@ -515,22 +512,22 @@
     if is_packed:
       tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
       local_EncodeVarint = _EncodeVarint
-      def EncodePackedField(write, value, deterministic):
+      def EncodePackedField(write, value):
         write(tag_bytes)
-        local_EncodeVarint(write, len(value) * value_size, deterministic)
+        local_EncodeVarint(write, len(value) * value_size)
         for element in value:
           write(local_struct_pack(format, element))
       return EncodePackedField
     elif is_repeated:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeRepeatedField(write, value, unused_deterministic):
+      def EncodeRepeatedField(write, value):
         for element in value:
           write(tag_bytes)
           write(local_struct_pack(format, element))
       return EncodeRepeatedField
     else:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeField(write, value, unused_deterministic):
+      def EncodeField(write, value):
         write(tag_bytes)
         return write(local_struct_pack(format, value))
       return EncodeField
@@ -581,9 +578,9 @@
     if is_packed:
       tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
       local_EncodeVarint = _EncodeVarint
-      def EncodePackedField(write, value, deterministic):
+      def EncodePackedField(write, value):
         write(tag_bytes)
-        local_EncodeVarint(write, len(value) * value_size, deterministic)
+        local_EncodeVarint(write, len(value) * value_size)
         for element in value:
           # This try/except block is going to be faster than any code that
           # we could write to check whether element is finite.
@@ -594,7 +591,7 @@
       return EncodePackedField
     elif is_repeated:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeRepeatedField(write, value, unused_deterministic):
+      def EncodeRepeatedField(write, value):
         for element in value:
           write(tag_bytes)
           try:
@@ -604,7 +601,7 @@
       return EncodeRepeatedField
     else:
       tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeField(write, value, unused_deterministic):
+      def EncodeField(write, value):
         write(tag_bytes)
         try:
           write(local_struct_pack(format, value))
@@ -650,9 +647,9 @@
   if is_packed:
     tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
     local_EncodeVarint = _EncodeVarint
-    def EncodePackedField(write, value, deterministic):
+    def EncodePackedField(write, value):
       write(tag_bytes)
-      local_EncodeVarint(write, len(value), deterministic)
+      local_EncodeVarint(write, len(value))
       for element in value:
         if element:
           write(true_byte)
@@ -661,7 +658,7 @@
     return EncodePackedField
   elif is_repeated:
     tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)
-    def EncodeRepeatedField(write, value, unused_deterministic):
+    def EncodeRepeatedField(write, value):
       for element in value:
         write(tag_bytes)
         if element:
@@ -671,7 +668,7 @@
     return EncodeRepeatedField
   else:
     tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)
-    def EncodeField(write, value, unused_deterministic):
+    def EncodeField(write, value):
       write(tag_bytes)
       if value:
         return write(true_byte)
@@ -687,18 +684,18 @@
   local_len = len
   assert not is_packed
   if is_repeated:
-    def EncodeRepeatedField(write, value, deterministic):
+    def EncodeRepeatedField(write, value):
       for element in value:
         encoded = element.encode('utf-8')
         write(tag)
-        local_EncodeVarint(write, local_len(encoded), deterministic)
+        local_EncodeVarint(write, local_len(encoded))
         write(encoded)
     return EncodeRepeatedField
   else:
-    def EncodeField(write, value, deterministic):
+    def EncodeField(write, value):
       encoded = value.encode('utf-8')
       write(tag)
-      local_EncodeVarint(write, local_len(encoded), deterministic)
+      local_EncodeVarint(write, local_len(encoded))
       return write(encoded)
     return EncodeField
 
@@ -711,16 +708,16 @@
   local_len = len
   assert not is_packed
   if is_repeated:
-    def EncodeRepeatedField(write, value, deterministic):
+    def EncodeRepeatedField(write, value):
       for element in value:
         write(tag)
-        local_EncodeVarint(write, local_len(element), deterministic)
+        local_EncodeVarint(write, local_len(element))
         write(element)
     return EncodeRepeatedField
   else:
-    def EncodeField(write, value, deterministic):
+    def EncodeField(write, value):
       write(tag)
-      local_EncodeVarint(write, local_len(value), deterministic)
+      local_EncodeVarint(write, local_len(value))
       return write(value)
     return EncodeField
 
@@ -732,16 +729,16 @@
   end_tag = TagBytes(field_number, wire_format.WIRETYPE_END_GROUP)
   assert not is_packed
   if is_repeated:
-    def EncodeRepeatedField(write, value, deterministic):
+    def EncodeRepeatedField(write, value):
       for element in value:
         write(start_tag)
-        element._InternalSerialize(write, deterministic)
+        element._InternalSerialize(write)
         write(end_tag)
     return EncodeRepeatedField
   else:
-    def EncodeField(write, value, deterministic):
+    def EncodeField(write, value):
       write(start_tag)
-      value._InternalSerialize(write, deterministic)
+      value._InternalSerialize(write)
       return write(end_tag)
     return EncodeField
 
@@ -753,17 +750,17 @@
   local_EncodeVarint = _EncodeVarint
   assert not is_packed
   if is_repeated:
-    def EncodeRepeatedField(write, value, deterministic):
+    def EncodeRepeatedField(write, value):
       for element in value:
         write(tag)
-        local_EncodeVarint(write, element.ByteSize(), deterministic)
-        element._InternalSerialize(write, deterministic)
+        local_EncodeVarint(write, element.ByteSize())
+        element._InternalSerialize(write)
     return EncodeRepeatedField
   else:
-    def EncodeField(write, value, deterministic):
+    def EncodeField(write, value):
       write(tag)
-      local_EncodeVarint(write, value.ByteSize(), deterministic)
-      return value._InternalSerialize(write, deterministic)
+      local_EncodeVarint(write, value.ByteSize())
+      return value._InternalSerialize(write)
     return EncodeField
 
 
@@ -790,10 +787,10 @@
   end_bytes = TagBytes(1, wire_format.WIRETYPE_END_GROUP)
   local_EncodeVarint = _EncodeVarint
 
-  def EncodeField(write, value, deterministic):
+  def EncodeField(write, value):
     write(start_bytes)
-    local_EncodeVarint(write, value.ByteSize(), deterministic)
-    value._InternalSerialize(write, deterministic)
+    local_EncodeVarint(write, value.ByteSize())
+    value._InternalSerialize(write)
     return write(end_bytes)
 
   return EncodeField
@@ -818,10 +815,9 @@
   message_type = field_descriptor.message_type
   encode_message = MessageEncoder(field_descriptor.number, False, False)
 
-  def EncodeField(write, value, deterministic):
-    value_keys = sorted(value.keys()) if deterministic else value
-    for key in value_keys:
+  def EncodeField(write, value):
+    for key in value:
       entry_msg = message_type._concrete_class(key=key, value=value[key])
-      encode_message(write, entry_msg, deterministic)
+      encode_message(write, entry_msg)
 
   return EncodeField
diff --git a/python/google/protobuf/internal/factory_test2.proto b/python/google/protobuf/internal/factory_test2.proto
index 5fcbc5a..bb1b54a 100644
--- a/python/google/protobuf/internal/factory_test2.proto
+++ b/python/google/protobuf/internal/factory_test2.proto
@@ -97,8 +97,3 @@
 extend Factory1Message {
   optional string another_field = 1002;
 }
-
-message MessageWithOption {
-  option no_standard_descriptor_accessor = true;
-  optional int32 field1 = 1;
-}
diff --git a/python/google/protobuf/internal/file_options_test.proto b/python/google/protobuf/internal/file_options_test.proto
deleted file mode 100644
index 4eceeb0..0000000
--- a/python/google/protobuf/internal/file_options_test.proto
+++ /dev/null
@@ -1,43 +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.
-
-syntax = "proto2";
-
-import "google/protobuf/descriptor.proto";
-
-package google.protobuf.python.internal;
-
-message FooOptions {
-  optional string foo_name = 1;
-}
-
-extend .google.protobuf.FileOptions {
-  optional FooOptions foo_options = 120436268;
-}
diff --git a/python/google/protobuf/internal/generator_test.py b/python/google/protobuf/internal/generator_test.py
index 7f13f9d..83ea5f5 100755
--- a/python/google/protobuf/internal/generator_test.py
+++ b/python/google/protobuf/internal/generator_test.py
@@ -227,8 +227,7 @@
                      [unittest_import_pb2.DESCRIPTOR])
     self.assertEqual(unittest_import_pb2.DESCRIPTOR.dependencies,
                      [unittest_import_public_pb2.DESCRIPTOR])
-    self.assertEqual(unittest_import_pb2.DESCRIPTOR.public_dependencies,
-                     [unittest_import_public_pb2.DESCRIPTOR])
+
   def testNoGenericServices(self):
     self.assertTrue(hasattr(unittest_no_generic_services_pb2, "TestMessage"))
     self.assertTrue(hasattr(unittest_no_generic_services_pb2, "FOO"))
diff --git a/python/google/protobuf/internal/json_format_test.py b/python/google/protobuf/internal/json_format_test.py
index 19182b7..bdc9f49 100644
--- a/python/google/protobuf/internal/json_format_test.py
+++ b/python/google/protobuf/internal/json_format_test.py
@@ -49,8 +49,6 @@
 from google.protobuf import struct_pb2
 from google.protobuf import timestamp_pb2
 from google.protobuf import wrappers_pb2
-from google.protobuf import unittest_mset_pb2
-from google.protobuf import unittest_pb2
 from google.protobuf.internal import well_known_types
 from google.protobuf import json_format
 from google.protobuf.util import json_format_proto3_pb2
@@ -160,98 +158,6 @@
     json_format.Parse(text, parsed_message)
     self.assertEqual(message, parsed_message)
 
-  def testUnknownEnumToJsonAndBack(self):
-    text = '{\n  "enumValue": 999\n}'
-    message = json_format_proto3_pb2.TestMessage()
-    message.enum_value = 999
-    self.assertEqual(json_format.MessageToJson(message),
-                     text)
-    parsed_message = json_format_proto3_pb2.TestMessage()
-    json_format.Parse(text, parsed_message)
-    self.assertEqual(message, parsed_message)
-
-  def testExtensionToJsonAndBack(self):
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    message.message_set.Extensions[ext1].i = 23
-    message.message_set.Extensions[ext2].str = 'foo'
-    message_text = json_format.MessageToJson(
-        message
-    )
-    parsed_message = unittest_mset_pb2.TestMessageSetContainer()
-    json_format.Parse(message_text, parsed_message)
-    self.assertEqual(message, parsed_message)
-
-  def testExtensionErrors(self):
-    self.CheckError('{"[extensionField]": {}}',
-                    'Message type proto3.TestMessage does not have extensions')
-
-  def testExtensionToDictAndBack(self):
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    message.message_set.Extensions[ext1].i = 23
-    message.message_set.Extensions[ext2].str = 'foo'
-    message_dict = json_format.MessageToDict(
-        message
-    )
-    parsed_message = unittest_mset_pb2.TestMessageSetContainer()
-    json_format.ParseDict(message_dict, parsed_message)
-    self.assertEqual(message, parsed_message)
-
-  def testExtensionSerializationDictMatchesProto3Spec(self):
-    """See go/proto3-json-spec for spec.
-    """
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    message.message_set.Extensions[ext1].i = 23
-    message.message_set.Extensions[ext2].str = 'foo'
-    message_dict = json_format.MessageToDict(
-        message
-    )
-    golden_dict = {
-        'messageSet': {
-            '[protobuf_unittest.'
-            'TestMessageSetExtension1.messageSetExtension]': {
-                'i': 23,
-            },
-            '[protobuf_unittest.'
-            'TestMessageSetExtension2.messageSetExtension]': {
-                'str': u'foo',
-            },
-        },
-    }
-    self.assertEqual(golden_dict, message_dict)
-
-
-  def testExtensionSerializationJsonMatchesProto3Spec(self):
-    """See go/proto3-json-spec for spec.
-    """
-    message = unittest_mset_pb2.TestMessageSetContainer()
-    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension
-    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension
-    message.message_set.Extensions[ext1].i = 23
-    message.message_set.Extensions[ext2].str = 'foo'
-    message_text = json_format.MessageToJson(
-        message
-    )
-    ext1_text = ('protobuf_unittest.TestMessageSetExtension1.'
-                 'messageSetExtension')
-    ext2_text = ('protobuf_unittest.TestMessageSetExtension2.'
-                 'messageSetExtension')
-    golden_text = ('{"messageSet": {'
-                   '    "[%s]": {'
-                   '        "i": 23'
-                   '    },'
-                   '    "[%s]": {'
-                   '        "str": "foo"'
-                   '    }'
-                   '}}') % (ext1_text, ext2_text)
-    self.assertEqual(json.loads(golden_text), json.loads(message_text))
-
-
   def testJsonEscapeString(self):
     message = json_format_proto3_pb2.TestMessage()
     if sys.version_info[0] < 3:
@@ -299,28 +205,8 @@
     parsed_message = json_format_proto3_pb2.TestMessage()
     self.CheckParseBack(message, parsed_message)
 
-  def testIntegersRepresentedAsFloat(self):
-    message = json_format_proto3_pb2.TestMessage()
-    json_format.Parse('{"int32Value": -2.147483648e9}', message)
-    self.assertEqual(message.int32_value, -2147483648)
-    json_format.Parse('{"int32Value": 1e5}', message)
-    self.assertEqual(message.int32_value, 100000)
-    json_format.Parse('{"int32Value": 1.0}', message)
-    self.assertEqual(message.int32_value, 1)
-
   def testMapFields(self):
-    message = json_format_proto3_pb2.TestNestedMap()
-    self.assertEqual(
-        json.loads(json_format.MessageToJson(message, True)),
-        json.loads('{'
-                   '"boolMap": {},'
-                   '"int32Map": {},'
-                   '"int64Map": {},'
-                   '"uint32Map": {},'
-                   '"uint64Map": {},'
-                   '"stringMap": {},'
-                   '"mapMap": {}'
-                   '}'))
+    message = json_format_proto3_pb2.TestMap()
     message.bool_map[True] = 1
     message.bool_map[False] = 2
     message.int32_map[1] = 2
@@ -333,19 +219,17 @@
     message.uint64_map[2] = 3
     message.string_map['1'] = 2
     message.string_map['null'] = 3
-    message.map_map['1'].bool_map[True] = 3
     self.assertEqual(
-        json.loads(json_format.MessageToJson(message, False)),
+        json.loads(json_format.MessageToJson(message, True)),
         json.loads('{'
                    '"boolMap": {"false": 2, "true": 1},'
                    '"int32Map": {"1": 2, "2": 3},'
                    '"int64Map": {"1": 2, "2": 3},'
                    '"uint32Map": {"1": 2, "2": 3},'
                    '"uint64Map": {"1": 2, "2": 3},'
-                   '"stringMap": {"1": 2, "null": 3},'
-                   '"mapMap": {"1": {"boolMap": {"true": 3}}}'
+                   '"stringMap": {"1": 2, "null": 3}'
                    '}'))
-    parsed_message = json_format_proto3_pb2.TestNestedMap()
+    parsed_message = json_format_proto3_pb2.TestMap()
     self.CheckParseBack(message, parsed_message)
 
   def testOneofFields(self):
@@ -363,23 +247,6 @@
     parsed_message = json_format_proto3_pb2.TestOneof()
     self.CheckParseBack(message, parsed_message)
 
-  def testSurrogates(self):
-    # Test correct surrogate handling.
-    message = json_format_proto3_pb2.TestMessage()
-    json_format.Parse('{"stringValue": "\\uD83D\\uDE01"}', message)
-    self.assertEqual(message.string_value,
-                     b'\xF0\x9F\x98\x81'.decode('utf-8', 'strict'))
-
-    # Error case: unpaired high surrogate.
-    self.CheckError(
-        '{"stringValue": "\\uD83D"}',
-        r'Invalid \\uXXXX escape|Unpaired.*surrogate')
-
-    # Unpaired low surrogate.
-    self.CheckError(
-        '{"stringValue": "\\uDE01"}',
-        r'Invalid \\uXXXX escape|Unpaired.*surrogate')
-
   def testTimestampMessage(self):
     message = json_format_proto3_pb2.TestTimestamp()
     message.value.seconds = 0
@@ -544,9 +411,6 @@
             '  "value": "hello",'
             '  "repeatedValue": [11.1, false, null, null]'
             '}'))
-    message.Clear()
-    json_format.Parse('{"value": null}', message)
-    self.assertEqual(message.value.WhichOneof('kind'), 'null_value')
 
   def testListValueMessage(self):
     message = json_format_proto3_pb2.TestListValue()
@@ -594,22 +458,6 @@
             '}\n'))
     parsed_message = json_format_proto3_pb2.TestAny()
     self.CheckParseBack(message, parsed_message)
-    # Must print @type first
-    test_message = json_format_proto3_pb2.TestMessage(
-        bool_value=True,
-        int32_value=20,
-        int64_value=-20,
-        uint32_value=20,
-        uint64_value=20,
-        double_value=3.14,
-        string_value='foo')
-    message.Clear()
-    message.value.Pack(test_message)
-    self.assertEqual(
-        json_format.MessageToJson(message, False)[0:68],
-        '{\n'
-        '  "value": {\n'
-        '    "@type": "type.googleapis.com/proto3.TestMessage"')
 
   def testWellKnownInAnyMessage(self):
     message = any_pb2.Any()
@@ -719,11 +567,6 @@
                       '}',
                       parsed_message)
     self.assertEqual(message, parsed_message)
-    # Null and {} should have different behavior for sub message.
-    self.assertFalse(parsed_message.HasField('message_value'))
-    json_format.Parse('{"messageValue": {}}', parsed_message)
-    self.assertTrue(parsed_message.HasField('message_value'))
-    # Null is not allowed to be used as an element in repeated field.
     self.assertRaisesRegexp(
         json_format.ParseError,
         'Failed to parse repeatedInt32Value field: '
@@ -731,9 +574,6 @@
         json_format.Parse,
         '{"repeatedInt32Value":[1, null]}',
         parsed_message)
-    self.CheckError('{"repeatedMessageValue":[null]}',
-                    'Failed to parse repeatedMessageValue field: null is not'
-                    ' allowed to be used as an element in a repeated field.')
 
   def testNanFloat(self):
     message = json_format_proto3_pb2.TestMessage()
@@ -748,26 +588,15 @@
     self.CheckError('',
                     r'Failed to load JSON: (Expecting value)|(No JSON).')
 
-  def testParseEnumValue(self):
-    message = json_format_proto3_pb2.TestMessage()
-    text = '{"enumValue": 0}'
-    json_format.Parse(text, message)
-    text = '{"enumValue": 1}'
-    json_format.Parse(text, message)
+  def testParseBadEnumValue(self):
+    self.CheckError(
+        '{"enumValue": 1}',
+        'Enum value must be a string literal with double quotes. '
+        'Type "proto3.EnumType" has no value named 1.')
     self.CheckError(
         '{"enumValue": "baz"}',
-        'Failed to parse enumValue field: Invalid enum value baz '
-        'for enum type proto3.EnumType.')
-    # Proto3 accepts numeric unknown enums.
-    text = '{"enumValue": 12345}'
-    json_format.Parse(text, message)
-    # Proto2 does not accept unknown enums.
-    message = unittest_pb2.TestAllTypes()
-    self.assertRaisesRegexp(
-        json_format.ParseError,
-        'Failed to parse optionalNestedEnum field: Invalid enum value 12345 '
-        'for enum type protobuf_unittest.TestAllTypes.NestedEnum.',
-        json_format.Parse, '{"optionalNestedEnum": 12345}', message)
+        'Enum value must be a string literal with double quotes. '
+        'Type "proto3.EnumType" has no value named baz.')
 
   def testParseBadIdentifer(self):
     self.CheckError('{int32Value: 1}',
@@ -777,19 +606,6 @@
                     'Message type "proto3.TestMessage" has no field named '
                     '"unknownName".')
 
-  def testIgnoreUnknownField(self):
-    text = '{"unknownName": 1}'
-    parsed_message = json_format_proto3_pb2.TestMessage()
-    json_format.Parse(text, parsed_message, ignore_unknown_fields=True)
-    text = ('{\n'
-            '  "repeatedValue": [ {\n'
-            '    "@type": "type.googleapis.com/proto3.MessageType",\n'
-            '    "unknownName": 1\n'
-            '  }]\n'
-            '}\n')
-    parsed_message = json_format_proto3_pb2.TestAny()
-    json_format.Parse(text, parsed_message, ignore_unknown_fields=True)
-
   def testDuplicateField(self):
     # Duplicate key check is not supported for python2.6
     if sys.version_info < (2, 7):
@@ -810,12 +626,12 @@
     text = '{"int32Value": 0x12345}'
     self.assertRaises(json_format.ParseError,
                       json_format.Parse, text, message)
-    self.CheckError('{"int32Value": 1.5}',
-                    'Failed to parse int32Value field: '
-                    'Couldn\'t parse integer: 1.5.')
     self.CheckError('{"int32Value": 012345}',
                     (r'Failed to load JSON: Expecting \'?,\'? delimiter: '
                      r'line 1.'))
+    self.CheckError('{"int32Value": 1.0}',
+                    'Failed to parse int32Value field: '
+                    'Couldn\'t parse integer: 1.0.')
     self.CheckError('{"int32Value": " 1 "}',
                     'Failed to parse int32Value field: '
                     'Couldn\'t parse integer: " 1 ".')
@@ -825,6 +641,9 @@
     self.CheckError('{"int32Value": 12345678901234567890}',
                     'Failed to parse int32Value field: Value out of range: '
                     '12345678901234567890.')
+    self.CheckError('{"int32Value": 1e5}',
+                    'Failed to parse int32Value field: '
+                    'Couldn\'t parse integer: 100000.0.')
     self.CheckError('{"uint32Value": -1}',
                     'Failed to parse uint32Value field: '
                     'Value out of range: -1.')
@@ -840,11 +659,6 @@
     self.CheckError('{"bytesValue": "AQI*"}',
                     'Failed to parse bytesValue field: Incorrect padding.')
 
-  def testInvalidRepeated(self):
-    self.CheckError('{"repeatedInt32Value": 12345}',
-                    (r'Failed to parse repeatedInt32Value field: repeated field'
-                     r' repeatedInt32Value must be in \[\] which is 12345.'))
-
   def testInvalidMap(self):
     message = json_format_proto3_pb2.TestMap()
     text = '{"int32Map": {"null": 2, "2": 3}}'
@@ -870,12 +684,6 @@
         json_format.ParseError,
         'Failed to load JSON: duplicate key a',
         json_format.Parse, text, message)
-    text = r'{"stringMap": 0}'
-    self.assertRaisesRegexp(
-        json_format.ParseError,
-        'Failed to parse stringMap field: Map field string_map must be '
-        'in a dict which is 0.',
-        json_format.Parse, text, message)
 
   def testInvalidTimestamp(self):
     message = json_format_proto3_pb2.TestTimestamp()
@@ -899,7 +707,7 @@
     text = '{"value": "0000-01-01T00:00:00Z"}'
     self.assertRaisesRegexp(
         json_format.ParseError,
-        'Failed to parse value field: year (0 )?is out of range.',
+        'Failed to parse value field: year is out of range.',
         json_format.Parse, text, message)
     # Time bigger than maxinum time.
     message.value.seconds = 253402300800
@@ -956,71 +764,6 @@
             r'"value": 1234}')
     json_format.Parse(text, message)
 
-  def testPreservingProtoFieldNames(self):
-    message = json_format_proto3_pb2.TestMessage()
-    message.int32_value = 12345
-    self.assertEqual('{\n  "int32Value": 12345\n}',
-                     json_format.MessageToJson(message))
-    self.assertEqual('{\n  "int32_value": 12345\n}',
-                     json_format.MessageToJson(message, False, True))
-    # When including_default_value_fields is True.
-    message = json_format_proto3_pb2.TestTimestamp()
-    self.assertEqual('{\n  "repeatedValue": []\n}',
-                     json_format.MessageToJson(message, True, False))
-    self.assertEqual('{\n  "repeated_value": []\n}',
-                     json_format.MessageToJson(message, True, True))
-
-    # Parsers accept both original proto field names and lowerCamelCase names.
-    message = json_format_proto3_pb2.TestMessage()
-    json_format.Parse('{"int32Value": 54321}', message)
-    self.assertEqual(54321, message.int32_value)
-    json_format.Parse('{"int32_value": 12345}', message)
-    self.assertEqual(12345, message.int32_value)
-
-  def testIndent(self):
-    message = json_format_proto3_pb2.TestMessage()
-    message.int32_value = 12345
-    self.assertEqual('{\n"int32Value": 12345\n}',
-                     json_format.MessageToJson(message, indent=0))
-
-  def testParseDict(self):
-    expected = 12345
-    js_dict = {'int32Value': expected}
-    message = json_format_proto3_pb2.TestMessage()
-    json_format.ParseDict(js_dict, message)
-    self.assertEqual(expected, message.int32_value)
-
-  def testMessageToDict(self):
-    message = json_format_proto3_pb2.TestMessage()
-    message.int32_value = 12345
-    expected = {'int32Value': 12345}
-    self.assertEqual(expected,
-                     json_format.MessageToDict(message))
-
-  def testJsonName(self):
-    message = json_format_proto3_pb2.TestCustomJsonName()
-    message.value = 12345
-    self.assertEqual('{\n  "@value": 12345\n}',
-                     json_format.MessageToJson(message))
-    parsed_message = json_format_proto3_pb2.TestCustomJsonName()
-    self.CheckParseBack(message, parsed_message)
-
-  def testSortKeys(self):
-    # Testing sort_keys is not perfectly working, as by random luck we could
-    # get the output sorted. We just use a selection of names.
-    message = json_format_proto3_pb2.TestMessage(bool_value=True,
-                                                 int32_value=1,
-                                                 int64_value=3,
-                                                 uint32_value=4,
-                                                 string_value='bla')
-    self.assertEqual(
-        json_format.MessageToJson(message, sort_keys=True),
-        # We use json.dumps() instead of a hardcoded string due to differences
-        # between Python 2 and Python 3.
-        json.dumps({'boolValue': True, 'int32Value': 1, 'int64Value': '3',
-                    'uint32Value': 4, 'stringValue': 'bla'},
-                   indent=2, sort_keys=True))
-
 
 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 6df52ed..7bb7d1a 100644
--- a/python/google/protobuf/internal/message_factory_test.py
+++ b/python/google/protobuf/internal/message_factory_test.py
@@ -40,7 +40,6 @@
   import unittest
 
 from google.protobuf import descriptor_pb2
-from google.protobuf.internal import api_implementation
 from google.protobuf.internal import factory_test1_pb2
 from google.protobuf.internal import factory_test2_pb2
 from google.protobuf import descriptor_database
@@ -107,54 +106,30 @@
   def testGetMessages(self):
     # performed twice because multiple calls with the same input must be allowed
     for _ in range(2):
-      # GetMessage should work regardless of the order the FileDescriptorProto
-      # are provided. In particular, the function should succeed when the files
-      # are not in the topological order of dependencies.
-
-      # Assuming factory_test2_fd depends on factory_test1_fd.
-      self.assertIn(self.factory_test1_fd.name,
-                    self.factory_test2_fd.dependency)
-      # Get messages should work when a file comes before its dependencies:
-      # factory_test2_fd comes before factory_test1_fd.
-      messages = message_factory.GetMessages([self.factory_test2_fd,
-                                              self.factory_test1_fd])
+      messages = message_factory.GetMessages([self.factory_test1_fd,
+                                              self.factory_test2_fd])
       self.assertTrue(
           set(['google.protobuf.python.internal.Factory2Message',
                'google.protobuf.python.internal.Factory1Message'],
              ).issubset(set(messages.keys())))
       self._ExerciseDynamicClass(
           messages['google.protobuf.python.internal.Factory2Message'])
+      self.assertTrue(
+          set(['google.protobuf.python.internal.Factory2Message.one_more_field',
+               'google.protobuf.python.internal.another_field'],
+             ).issubset(
+                 set(messages['google.protobuf.python.internal.Factory1Message']
+                     ._extensions_by_name.keys())))
       factory_msg1 = messages['google.protobuf.python.internal.Factory1Message']
-      self.assertTrue(set(
-          ['google.protobuf.python.internal.Factory2Message.one_more_field',
-           'google.protobuf.python.internal.another_field'],).issubset(set(
-               ext.full_name
-               for ext in factory_msg1.DESCRIPTOR.file.pool.FindAllExtensions(
-                   factory_msg1.DESCRIPTOR))))
       msg1 = messages['google.protobuf.python.internal.Factory1Message']()
-      ext1 = msg1.Extensions._FindExtensionByName(
-          'google.protobuf.python.internal.Factory2Message.one_more_field')
-      ext2 = msg1.Extensions._FindExtensionByName(
-          'google.protobuf.python.internal.another_field')
+      ext1 = factory_msg1._extensions_by_name[
+          'google.protobuf.python.internal.Factory2Message.one_more_field']
+      ext2 = factory_msg1._extensions_by_name[
+          'google.protobuf.python.internal.another_field']
       msg1.Extensions[ext1] = 'test1'
       msg1.Extensions[ext2] = 'test2'
       self.assertEqual('test1', msg1.Extensions[ext1])
       self.assertEqual('test2', msg1.Extensions[ext2])
-      self.assertEqual(None,
-                       msg1.Extensions._FindExtensionByNumber(12321))
-      if api_implementation.Type() == 'cpp':
-        # TODO(jieluo): Fix len to return the correct value.
-        # self.assertEqual(2, len(msg1.Extensions))
-        self.assertEqual(len(msg1.Extensions), len(msg1.Extensions))
-        self.assertRaises(TypeError,
-                          msg1.Extensions._FindExtensionByName, 0)
-        self.assertRaises(TypeError,
-                          msg1.Extensions._FindExtensionByNumber, '')
-      else:
-        self.assertEqual(None,
-                         msg1.Extensions._FindExtensionByName(0))
-        self.assertEqual(None,
-                         msg1.Extensions._FindExtensionByNumber(''))
 
   def testDuplicateExtensionNumber(self):
     pool = descriptor_pool.DescriptorPool()
@@ -208,14 +183,7 @@
     with self.assertRaises(Exception) as cm:
       factory.GetMessages([f.name])
 
-    self.assertIn(str(cm.exception),
-                  ['Extensions '
-                   '"google.protobuf.python.internal.Duplicate.extension_field" and'
-                   ' "google.protobuf.python.internal.Extension.extension_field"'
-                   ' both try to extend message type'
-                   ' "google.protobuf.python.internal.Container"'
-                   ' with field number 2.',
-                   'Double registration of Extensions'])
+    self.assertIsInstance(cm.exception, (AssertionError, ValueError))
 
 
 if __name__ == '__main__':
diff --git a/python/google/protobuf/internal/message_test.py b/python/google/protobuf/internal/message_test.py
index a303b1a..4ee31d8 100755
--- a/python/google/protobuf/internal/message_test.py
+++ b/python/google/protobuf/internal/message_test.py
@@ -51,18 +51,12 @@
 import pickle
 import six
 import sys
-import warnings
 
 try:
-  import unittest2 as unittest  # PY26
+  import unittest2 as unittest  #PY26
 except ImportError:
   import unittest
-try:
-  cmp                                   # Python 2
-except NameError:
-  cmp = lambda x, y: (x > y) - (x < y)  # Python 3
 
-from google.protobuf import map_proto2_unittest_pb2
 from google.protobuf import map_unittest_pb2
 from google.protobuf import unittest_pb2
 from google.protobuf import unittest_proto3_arena_pb2
@@ -71,10 +65,8 @@
 from google.protobuf import message_factory
 from google.protobuf import text_format
 from google.protobuf.internal import api_implementation
-from google.protobuf.internal import encoder
 from google.protobuf.internal import packed_field_test_pb2
 from google.protobuf.internal import test_util
-from google.protobuf.internal import testing_refleaks
 from google.protobuf import message
 from google.protobuf.internal import _parameterized
 
@@ -96,13 +88,10 @@
   return isinf(val) and (val < 0)
 
 
-BaseTestCase = testing_refleaks.BaseTestCase
-
-
-@_parameterized.NamedParameters(
-    ('_proto2', unittest_pb2),
-    ('_proto3', unittest_proto3_arena_pb2))
-class MessageTest(BaseTestCase):
+@_parameterized.Parameters(
+    (unittest_pb2),
+    (unittest_proto3_arena_pb2))
+class MessageTest(unittest.TestCase):
 
   def testBadUtf8String(self, message_module):
     if api_implementation.Type() != 'python':
@@ -143,63 +132,6 @@
     golden_copy = copy.deepcopy(golden_message)
     self.assertEqual(golden_data, golden_copy.SerializeToString())
 
-  def testParseErrors(self, message_module):
-    msg = message_module.TestAllTypes()
-    self.assertRaises(TypeError, msg.FromString, 0)
-    self.assertRaises(Exception, msg.FromString, '0')
-    # TODO(jieluo): Fix cpp extension to raise error instead of warning.
-    # b/27494216
-    end_tag = encoder.TagBytes(1, 4)
-    if api_implementation.Type() == 'python':
-      with self.assertRaises(message.DecodeError) as context:
-        msg.FromString(end_tag)
-      self.assertEqual('Unexpected end-group tag.', str(context.exception))
-    else:
-      with warnings.catch_warnings(record=True) as w:
-        # Cause all warnings to always be triggered.
-        warnings.simplefilter('always')
-        msg.FromString(end_tag)
-        assert len(w) == 1
-        assert issubclass(w[-1].category, RuntimeWarning)
-        self.assertEqual('Unexpected end-group tag: Not all data was converted',
-                         str(w[-1].message))
-
-  def testDeterminismParameters(self, message_module):
-    # This message is always deterministically serialized, even if determinism
-    # is disabled, so we can use it to verify that all the determinism
-    # parameters work correctly.
-    golden_data = (b'\xe2\x02\nOne string'
-                   b'\xe2\x02\nTwo string'
-                   b'\xe2\x02\nRed string'
-                   b'\xe2\x02\x0bBlue string')
-    golden_message = message_module.TestAllTypes()
-    golden_message.repeated_string.extend([
-        'One string',
-        'Two string',
-        'Red string',
-        'Blue string',
-    ])
-    self.assertEqual(golden_data,
-                     golden_message.SerializeToString(deterministic=None))
-    self.assertEqual(golden_data,
-                     golden_message.SerializeToString(deterministic=False))
-    self.assertEqual(golden_data,
-                     golden_message.SerializeToString(deterministic=True))
-
-    class BadArgError(Exception):
-      pass
-
-    class BadArg(object):
-
-      def __nonzero__(self):
-        raise BadArgError()
-
-      def __bool__(self):
-        raise BadArgError()
-
-    with self.assertRaises(BadArgError):
-      golden_message.SerializeToString(deterministic=BadArg())
-
   def testPickleSupport(self, message_module):
     golden_data = test_util.GoldenFileData('golden_message')
     golden_message = message_module.TestAllTypes()
@@ -441,7 +373,6 @@
     self.assertEqual(message.repeated_int32[0], 1)
     self.assertEqual(message.repeated_int32[1], 2)
     self.assertEqual(message.repeated_int32[2], 3)
-    self.assertEqual(str(message.repeated_int32), str([1, 2, 3]))
 
     message.repeated_float.append(1.1)
     message.repeated_float.append(1.3)
@@ -458,7 +389,6 @@
     self.assertEqual(message.repeated_string[0], 'a')
     self.assertEqual(message.repeated_string[1], 'b')
     self.assertEqual(message.repeated_string[2], 'c')
-    self.assertEqual(str(message.repeated_string), str([u'a', u'b', u'c']))
 
     message.repeated_bytes.append(b'a')
     message.repeated_bytes.append(b'c')
@@ -467,7 +397,6 @@
     self.assertEqual(message.repeated_bytes[0], b'a')
     self.assertEqual(message.repeated_bytes[1], b'b')
     self.assertEqual(message.repeated_bytes[2], b'c')
-    self.assertEqual(str(message.repeated_bytes), str([b'a', b'b', b'c']))
 
   def testSortingRepeatedScalarFieldsCustomComparator(self, message_module):
     """Check some different types with custom comparator."""
@@ -506,8 +435,6 @@
     self.assertEqual(message.repeated_nested_message[3].bb, 4)
     self.assertEqual(message.repeated_nested_message[4].bb, 5)
     self.assertEqual(message.repeated_nested_message[5].bb, 6)
-    self.assertEqual(str(message.repeated_nested_message),
-                     '[bb: 1\n, bb: 2\n, bb: 3\n, bb: 4\n, bb: 5\n, bb: 6\n]')
 
   def testSortingRepeatedCompositeFieldsStable(self, message_module):
     """Check passing a custom comparator to sort a repeated composite field."""
@@ -633,18 +560,6 @@
     self.assertIsInstance(m.repeated_nested_message,
                           collections.MutableSequence)
 
-  def testRepeatedFieldsNotHashable(self, message_module):
-    m = message_module.TestAllTypes()
-    with self.assertRaises(TypeError):
-      hash(m.repeated_int32)
-    with self.assertRaises(TypeError):
-      hash(m.repeated_nested_message)
-
-  def testRepeatedFieldInsideNestedMessage(self, message_module):
-    m = message_module.NestedTestAllTypes()
-    m.payload.repeated_int32.extend([])
-    self.assertTrue(m.HasField('payload'))
-
   def ensureNestedMessageExists(self, msg, attribute):
     """Make sure that a nested message object exists.
 
@@ -657,7 +572,6 @@
   def testOneofGetCaseNonexistingField(self, message_module):
     m = message_module.TestAllTypes()
     self.assertRaises(ValueError, m.WhichOneof, 'no_such_oneof_field')
-    self.assertRaises(Exception, m.WhichOneof, 0)
 
   def testOneofDefaultValues(self, message_module):
     m = message_module.TestAllTypes()
@@ -1033,8 +947,6 @@
     m = message_module.TestAllTypes()
     with self.assertRaises(IndexError) as _:
       m.repeated_nested_message.pop()
-    with self.assertRaises(TypeError) as _:
-      m.repeated_nested_message.pop('0')
     for i in range(5):
       n = m.repeated_nested_message.add()
       n.bb = i
@@ -1043,42 +955,9 @@
     self.assertEqual(2, m.repeated_nested_message.pop(1).bb)
     self.assertEqual([1, 3], [n.bb for n in m.repeated_nested_message])
 
-  def testRepeatedCompareWithSelf(self, message_module):
-    m = message_module.TestAllTypes()
-    for i in range(5):
-      m.repeated_int32.insert(i, i)
-      n = m.repeated_nested_message.add()
-      n.bb = i
-    self.assertSequenceEqual(m.repeated_int32, m.repeated_int32)
-    self.assertEqual(m.repeated_nested_message, m.repeated_nested_message)
-
-  def testReleasedNestedMessages(self, message_module):
-    """A case that lead to a segfault when a message detached from its parent
-    container has itself a child container.
-    """
-    m = message_module.NestedTestAllTypes()
-    m = m.repeated_child.add()
-    m = m.child
-    m = m.repeated_child.add()
-    self.assertEqual(m.payload.optional_int32, 0)
-
-  def testSetRepeatedComposite(self, message_module):
-    m = message_module.TestAllTypes()
-    with self.assertRaises(AttributeError):
-      m.repeated_int32 = []
-    m.repeated_int32.append(1)
-    if api_implementation.Type() == 'cpp':
-      # For test coverage: cpp has a different path if composite
-      # field is in cache
-      with self.assertRaises(TypeError):
-        m.repeated_int32 = []
-    else:
-      with self.assertRaises(AttributeError):
-        m.repeated_int32 = []
-
 
 # Class to test proto2-only features (required, extensions, etc.)
-class Proto2Test(BaseTestCase):
+class Proto2Test(unittest.TestCase):
 
   def testFieldPresence(self):
     message = unittest_pb2.TestAllTypes()
@@ -1128,46 +1007,18 @@
     self.assertEqual(False, message.optional_bool)
     self.assertEqual(0, message.optional_nested_message.bb)
 
+  # TODO(tibell): The C++ implementations actually allows assignment
+  # of unknown enum values to *scalar* fields (but not repeated
+  # fields). Once checked enum fields becomes the default in the
+  # Python implementation, the C++ implementation should follow suit.
   def testAssignInvalidEnum(self):
-    """Assigning an invalid enum number is not allowed in proto2."""
+    """It should not be possible to assign an invalid enum number to an
+    enum field."""
     m = unittest_pb2.TestAllTypes()
 
-    # Proto2 can not assign unknown enum.
     with self.assertRaises(ValueError) as _:
       m.optional_nested_enum = 1234567
     self.assertRaises(ValueError, m.repeated_nested_enum.append, 1234567)
-    # Assignment is a different code path than append for the C++ impl.
-    m.repeated_nested_enum.append(2)
-    m.repeated_nested_enum[0] = 2
-    with self.assertRaises(ValueError):
-      m.repeated_nested_enum[0] = 123456
-
-    # Unknown enum value can be parsed but is ignored.
-    m2 = unittest_proto3_arena_pb2.TestAllTypes()
-    m2.optional_nested_enum = 1234567
-    m2.repeated_nested_enum.append(7654321)
-    serialized = m2.SerializeToString()
-
-    m3 = unittest_pb2.TestAllTypes()
-    m3.ParseFromString(serialized)
-    self.assertFalse(m3.HasField('optional_nested_enum'))
-    # 1 is the default value for optional_nested_enum.
-    self.assertEqual(1, m3.optional_nested_enum)
-    self.assertEqual(0, len(m3.repeated_nested_enum))
-    m2.Clear()
-    m2.ParseFromString(m3.SerializeToString())
-    self.assertEqual(1234567, m2.optional_nested_enum)
-    self.assertEqual(7654321, m2.repeated_nested_enum[0])
-
-  def testUnknownEnumMap(self):
-    m = map_proto2_unittest_pb2.TestEnumMap()
-    m.known_map_field[123] = 0
-    with self.assertRaises(ValueError):
-      m.unknown_map_field[1] = 123
-
-  def testExtensionsErrors(self):
-    msg = unittest_pb2.TestAllTypes()
-    self.assertRaises(AttributeError, getattr, msg, 'Extensions')
 
   def testGoldenExtensions(self):
     golden_data = test_util.GoldenFileData('golden_message')
@@ -1262,7 +1113,6 @@
         optional_bytes=b'x',
         optionalgroup={'a': 400},
         optional_nested_message={'bb': 500},
-        optional_foreign_message={},
         optional_nested_enum='BAZ',
         repeatedgroup=[{'a': 600},
                        {'a': 700}],
@@ -1275,12 +1125,8 @@
     self.assertEqual(300.5, message.optional_float)
     self.assertEqual(b'x', message.optional_bytes)
     self.assertEqual(400, message.optionalgroup.a)
-    self.assertIsInstance(message.optional_nested_message,
-                          unittest_pb2.TestAllTypes.NestedMessage)
+    self.assertIsInstance(message.optional_nested_message, unittest_pb2.TestAllTypes.NestedMessage)
     self.assertEqual(500, message.optional_nested_message.bb)
-    self.assertTrue(message.HasField('optional_foreign_message'))
-    self.assertEqual(message.optional_foreign_message,
-                     unittest_pb2.ForeignMessage())
     self.assertEqual(unittest_pb2.TestAllTypes.BAZ,
                      message.optional_nested_enum)
     self.assertEqual(2, len(message.repeatedgroup))
@@ -1318,7 +1164,7 @@
 
 
 # Class to test proto3-only features/behavior (updated field presence & enums)
-class Proto3Test(BaseTestCase):
+class Proto3Test(unittest.TestCase):
 
   # Utility method for comparing equality with a map.
   def assertMapIterEquals(self, map_iter, dict_value):
@@ -1392,7 +1238,6 @@
     """Assigning an unknown enum value is allowed and preserves the value."""
     m = unittest_proto3_arena_pb2.TestAllTypes()
 
-    # Proto3 can assign unknown enums.
     m.optional_nested_enum = 1234567
     self.assertEqual(1234567, m.optional_nested_enum)
     m.repeated_nested_enum.append(22334455)
@@ -1410,7 +1255,7 @@
   # Map isn't really a proto3-only feature. But there is no proto2 equivalent
   # of google/protobuf/map_unittest.proto right now, so it's not easy to
   # test both with the same test like we do for the other proto2/proto3 tests.
-  # (google/protobuf/map_proto2_unittest.proto is very different in the set
+  # (google/protobuf/map_protobuf_unittest.proto is very different in the set
   # of messages and fields it contains).
   def testScalarMapDefaults(self):
     msg = map_unittest_pb2.TestMap()
@@ -1471,21 +1316,12 @@
 
     msg.map_int32_int32[5] = 15
     self.assertEqual(15, msg.map_int32_int32.get(5))
-    self.assertEqual(15, msg.map_int32_int32.get(5))
-    with self.assertRaises(TypeError):
-      msg.map_int32_int32.get('')
 
     self.assertIsNone(msg.map_int32_foreign_message.get(5))
     self.assertEqual(10, msg.map_int32_foreign_message.get(5, 10))
 
     submsg = msg.map_int32_foreign_message[5]
     self.assertIs(submsg, msg.map_int32_foreign_message.get(5))
-    # TODO(jieluo): Fix python and cpp extension diff.
-    if api_implementation.Type() == 'cpp':
-      with self.assertRaises(TypeError):
-        msg.map_int32_foreign_message.get('')
-    else:
-      self.assertEqual(None, msg.map_int32_foreign_message.get(''))
 
   def testScalarMap(self):
     msg = map_unittest_pb2.TestMap()
@@ -1497,13 +1333,8 @@
     msg.map_int64_int64[-2**33] = -2**34
     msg.map_uint32_uint32[123] = 456
     msg.map_uint64_uint64[2**33] = 2**34
-    msg.map_int32_float[2] = 1.2
-    msg.map_int32_double[1] = 3.3
     msg.map_string_string['abc'] = '123'
-    msg.map_bool_bool[True] = True
     msg.map_int32_enum[888] = 2
-    # Unknown numeric enum is supported in proto3.
-    msg.map_int32_enum[123] = 456
 
     self.assertEqual([], msg.FindInitializationErrors())
 
@@ -1537,24 +1368,8 @@
     self.assertEqual(-2**34, msg2.map_int64_int64[-2**33])
     self.assertEqual(456, msg2.map_uint32_uint32[123])
     self.assertEqual(2**34, msg2.map_uint64_uint64[2**33])
-    self.assertAlmostEqual(1.2, msg.map_int32_float[2])
-    self.assertEqual(3.3, msg.map_int32_double[1])
     self.assertEqual('123', msg2.map_string_string['abc'])
-    self.assertEqual(True, msg2.map_bool_bool[True])
     self.assertEqual(2, msg2.map_int32_enum[888])
-    self.assertEqual(456, msg2.map_int32_enum[123])
-    # TODO(jieluo): Add cpp extension support.
-    if api_implementation.Type() == 'python':
-      self.assertEqual('{-123: -456}',
-                       str(msg2.map_int32_int32))
-
-  def testMapEntryAlwaysSerialized(self):
-    msg = map_unittest_pb2.TestMap()
-    msg.map_int32_int32[0] = 0
-    msg.map_string_string[''] = ''
-    self.assertEqual(msg.ByteSize(), 12)
-    self.assertEqual(b'\n\x04\x08\x00\x10\x00r\x04\n\x00\x12\x00',
-                     msg.SerializeToString())
 
   def testStringUnicodeConversionInMap(self):
     msg = map_unittest_pb2.TestMap()
@@ -1607,40 +1422,6 @@
     self.assertIn(123, msg2.map_int32_foreign_message)
     self.assertIn(-456, msg2.map_int32_foreign_message)
     self.assertEqual(2, len(msg2.map_int32_foreign_message))
-    # TODO(jieluo): Fix text format for message map.
-    # TODO(jieluo): Add cpp extension support.
-    if api_implementation.Type() == 'python':
-      self.assertEqual(15,
-                       len(str(msg2.map_int32_foreign_message)))
-
-  def testNestedMessageMapItemDelete(self):
-    msg = map_unittest_pb2.TestMap()
-    msg.map_int32_all_types[1].optional_nested_message.bb = 1
-    del msg.map_int32_all_types[1]
-    msg.map_int32_all_types[2].optional_nested_message.bb = 2
-    self.assertEqual(1, len(msg.map_int32_all_types))
-    msg.map_int32_all_types[1].optional_nested_message.bb = 1
-    self.assertEqual(2, len(msg.map_int32_all_types))
-
-    serialized = msg.SerializeToString()
-    msg2 = map_unittest_pb2.TestMap()
-    msg2.ParseFromString(serialized)
-    keys = [1, 2]
-    # The loop triggers PyErr_Occurred() in c extension.
-    for key in keys:
-      del msg2.map_int32_all_types[key]
-
-  def testMapByteSize(self):
-    msg = map_unittest_pb2.TestMap()
-    msg.map_int32_int32[1] = 1
-    size = msg.ByteSize()
-    msg.map_int32_int32[1] = 128
-    self.assertEqual(msg.ByteSize(), size + 1)
-
-    msg.map_int32_foreign_message[19].c = 1
-    size = msg.ByteSize()
-    msg.map_int32_foreign_message[19].c = 128
-    self.assertEqual(msg.ByteSize(), size + 1)
 
   def testMergeFrom(self):
     msg = map_unittest_pb2.TestMap()
@@ -1654,8 +1435,6 @@
     msg2.map_int32_int32[12] = 55
     msg2.map_int64_int64[88] = 99
     msg2.map_int32_foreign_message[222].c = 15
-    msg2.map_int32_foreign_message[222].d = 20
-    old_map_value = msg2.map_int32_foreign_message[222]
 
     msg2.MergeFrom(msg)
 
@@ -1665,16 +1444,6 @@
     self.assertEqual(99, msg2.map_int64_int64[88])
     self.assertEqual(5, msg2.map_int32_foreign_message[111].c)
     self.assertEqual(10, msg2.map_int32_foreign_message[222].c)
-    self.assertFalse(msg2.map_int32_foreign_message[222].HasField('d'))
-    if api_implementation.Type() != 'cpp':
-      # During the call to MergeFrom(), the C++ implementation will have
-      # deallocated the underlying message, but this is very difficult to detect
-      # properly. The line below is likely to cause a segmentation fault.
-      # With the Python implementation, old_map_value is just 'detached' from
-      # the main message. Using it will not crash of course, but since it still
-      # have a reference to the parent message I'm sure we can find interesting
-      # ways to cause inconsistencies.
-      self.assertEqual(15, old_map_value.c)
 
     # Verify that there is only one entry per key, even though the MergeFrom
     # may have internally created multiple entries for a single key in the
@@ -1695,12 +1464,6 @@
 
     del msg2.map_int32_foreign_message[222]
     self.assertFalse(222 in msg2.map_int32_foreign_message)
-    if api_implementation.Type() == 'cpp':
-      with self.assertRaises(TypeError):
-        del msg2.map_int32_foreign_message['']
-    else:
-      with self.assertRaises(KeyError):
-        del msg2.map_int32_foreign_message['']
 
   def testMergeFromBadType(self):
     msg = map_unittest_pb2.TestMap()
@@ -1835,54 +1598,6 @@
     matching_dict = {2: 4, 3: 6, 4: 8}
     self.assertMapIterEquals(msg.map_int32_int32.items(), matching_dict)
 
-  def testPython2Map(self):
-    if sys.version_info < (3,):
-      msg = map_unittest_pb2.TestMap()
-      msg.map_int32_int32[2] = 4
-      msg.map_int32_int32[3] = 6
-      msg.map_int32_int32[4] = 8
-      msg.map_int32_int32[5] = 10
-      map_int32 = msg.map_int32_int32
-      self.assertEqual(4, len(map_int32))
-      msg2 = map_unittest_pb2.TestMap()
-      msg2.ParseFromString(msg.SerializeToString())
-
-      def CheckItems(seq, iterator):
-        self.assertEqual(next(iterator), seq[0])
-        self.assertEqual(list(iterator), seq[1:])
-
-      CheckItems(map_int32.items(), map_int32.iteritems())
-      CheckItems(map_int32.keys(), map_int32.iterkeys())
-      CheckItems(map_int32.values(), map_int32.itervalues())
-
-      self.assertEqual(6, map_int32.get(3))
-      self.assertEqual(None, map_int32.get(999))
-      self.assertEqual(6, map_int32.pop(3))
-      self.assertEqual(0, map_int32.pop(3))
-      self.assertEqual(3, len(map_int32))
-      key, value = map_int32.popitem()
-      self.assertEqual(2 * key, value)
-      self.assertEqual(2, len(map_int32))
-      map_int32.clear()
-      self.assertEqual(0, len(map_int32))
-
-      with self.assertRaises(KeyError):
-        map_int32.popitem()
-
-      self.assertEqual(0, map_int32.setdefault(2))
-      self.assertEqual(1, len(map_int32))
-
-      map_int32.update(msg2.map_int32_int32)
-      self.assertEqual(4, len(map_int32))
-
-      with self.assertRaises(TypeError):
-        map_int32.update(msg2.map_int32_int32,
-                         msg2.map_int32_int32)
-      with self.assertRaises(TypeError):
-        map_int32.update(0)
-      with self.assertRaises(TypeError):
-        map_int32.update(value=12)
-
   def testMapItems(self):
     # Map items used to have strange behaviors when use c extension. Because
     # [] may reorder the map and invalidate any exsting iterators.
@@ -1898,35 +1613,6 @@
     items2 = msg.map_string_string.items()
     self.assertEqual(items1, items2)
 
-  def testMapDeterministicSerialization(self):
-    golden_data = (b'r\x0c\n\x07init_op\x12\x01d'
-                   b'r\n\n\x05item1\x12\x01e'
-                   b'r\n\n\x05item2\x12\x01f'
-                   b'r\n\n\x05item3\x12\x01g'
-                   b'r\x0b\n\x05item4\x12\x02QQ'
-                   b'r\x12\n\rlocal_init_op\x12\x01a'
-                   b'r\x0e\n\tsummaries\x12\x01e'
-                   b'r\x18\n\x13trainable_variables\x12\x01b'
-                   b'r\x0e\n\tvariables\x12\x01c')
-    msg = map_unittest_pb2.TestMap()
-    msg.map_string_string['local_init_op'] = 'a'
-    msg.map_string_string['trainable_variables'] = 'b'
-    msg.map_string_string['variables'] = 'c'
-    msg.map_string_string['init_op'] = 'd'
-    msg.map_string_string['summaries'] = 'e'
-    msg.map_string_string['item1'] = 'e'
-    msg.map_string_string['item2'] = 'f'
-    msg.map_string_string['item3'] = 'g'
-    msg.map_string_string['item4'] = 'QQ'
-
-    # If deterministic serialization is not working correctly, this will be
-    # "flaky" depending on the exact python dict hash seed.
-    #
-    # Fortunately, there are enough items in this map that it is extremely
-    # unlikely to ever hit the "right" in-order combination, so the test
-    # itself should fail reliably.
-    self.assertEqual(golden_data, msg.SerializeToString(deterministic=True))
-
   def testMapIterationClearMessage(self):
     # Iterator needs to work even if message and map are deleted.
     msg = map_unittest_pb2.TestMap()
@@ -2013,9 +1699,6 @@
     del msg.map_int32_int32[4]
     self.assertEqual(0, len(msg.map_int32_int32))
 
-    with self.assertRaises(KeyError):
-      del msg.map_int32_all_types[32]
-
   def testMapsAreMapping(self):
     msg = map_unittest_pb2.TestMap()
     self.assertIsInstance(msg.map_int32_int32, collections.Mapping)
@@ -2024,14 +1707,6 @@
     self.assertIsInstance(msg.map_int32_foreign_message,
                           collections.MutableMapping)
 
-  def testMapsCompare(self):
-    msg = map_unittest_pb2.TestMap()
-    msg.map_int32_int32[-123] = -456
-    self.assertEqual(msg.map_int32_int32, msg.map_int32_int32)
-    self.assertEqual(msg.map_int32_foreign_message,
-                     msg.map_int32_foreign_message)
-    self.assertNotEqual(msg.map_int32_int32, 0)
-
   def testMapFindInitializationErrorsSmokeTest(self):
     msg = map_unittest_pb2.TestMap()
     msg.map_string_string['abc'] = '123'
@@ -2041,7 +1716,7 @@
 
 
 
-class ValidTypeNamesTest(BaseTestCase):
+class ValidTypeNamesTest(unittest.TestCase):
 
   def assertImportFromName(self, msg, base_name):
     # Parse <type 'module.class_name'> to extra 'some.name' as a string.
@@ -2062,7 +1737,7 @@
     self.assertImportFromName(pb.repeated_int32, 'Scalar')
     self.assertImportFromName(pb.repeated_nested_message, 'Composite')
 
-class PackedFieldTest(BaseTestCase):
+class PackedFieldTest(unittest.TestCase):
 
   def setMessage(self, message):
     message.repeated_int32.append(1)
@@ -2119,17 +1794,12 @@
     self.assertEqual(golden_data, message.SerializeToString())
 
 
-@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):
+@unittest.skipIf(api_implementation.Type() != 'cpp',
+                 'explicit tests of the C++ implementation')
+class OversizeProtosTest(unittest.TestCase):
 
-  @classmethod
-  def setUpClass(cls):
-    # At the moment, reference cycles between DescriptorPool and Message classes
-    # are not detected and these objects are never freed.
-    # To avoid errors with ReferenceLeakChecker, we create the class only once.
-    file_desc = """
+  def setUp(self):
+    self.file_desc = """
       name: "f/f.msg2"
       package: "f"
       message_type {
@@ -2154,12 +1824,10 @@
     """
     pool = descriptor_pool.DescriptorPool()
     desc = descriptor_pb2.FileDescriptorProto()
-    text_format.Parse(file_desc, desc)
+    text_format.Parse(self.file_desc, desc)
     pool.Add(desc)
-    cls.proto_cls = message_factory.MessageFactory(pool).GetPrototype(
+    self.proto_cls = message_factory.MessageFactory(pool).GetPrototype(
         pool.FindMessageTypeByName('f.msg2'))
-
-  def setUp(self):
     self.p = self.proto_cls()
     self.p.field.payload = 'c' * (1024 * 1024 * 64 + 1)
     self.p_serialized = self.p.SerializeToString()
diff --git a/python/google/protobuf/internal/more_extensions_dynamic.proto b/python/google/protobuf/internal/more_extensions_dynamic.proto
index 98fcbcb..11f85ef 100644
--- a/python/google/protobuf/internal/more_extensions_dynamic.proto
+++ b/python/google/protobuf/internal/more_extensions_dynamic.proto
@@ -47,5 +47,4 @@
 extend ExtendedMessage {
   optional int32 dynamic_int32_extension = 100;
   optional DynamicMessageType dynamic_message_extension = 101;
-  repeated DynamicMessageType repeated_dynamic_message_extension = 102;
 }
diff --git a/python/google/protobuf/internal/python_message.py b/python/google/protobuf/internal/python_message.py
index 975e3b4..f8f73dd 100755
--- a/python/google/protobuf/internal/python_message.py
+++ b/python/google/protobuf/internal/python_message.py
@@ -51,14 +51,21 @@
 __author__ = 'robinson@google.com (Will Robinson)'
 
 from io import BytesIO
-import struct
 import sys
+import struct
 import weakref
 
 import six
+try:
+  import six.moves.copyreg as copyreg
+except ImportError:
+  # On some platforms, for example gMac, we run native Python because there is
+  # nothing like hermetic Python. This means lesser control on the system and
+  # the six.moves package may be missing (is missing on 20150321 on gMac). Be
+  # extra conservative and try to load the old replacement if it fails.
+  import copy_reg as copyreg
 
 # We use "as" to avoid name collisions with variables.
-from google.protobuf.internal import api_implementation
 from google.protobuf.internal import containers
 from google.protobuf.internal import decoder
 from google.protobuf.internal import encoder
@@ -69,6 +76,7 @@
 from google.protobuf.internal import wire_format
 from google.protobuf import descriptor as descriptor_mod
 from google.protobuf import message as message_mod
+from google.protobuf import symbol_database
 from google.protobuf import text_format
 
 _FieldDescriptor = descriptor_mod.FieldDescriptor
@@ -90,12 +98,16 @@
   classes at runtime, as in this example:
 
   mydescriptor = Descriptor(.....)
-  factory = symbol_database.Default()
-  factory.pool.AddDescriptor(mydescriptor)
-  MyProtoClass = factory.GetPrototype(mydescriptor)
+  class MyProtoClass(Message):
+    __metaclass__ = GeneratedProtocolMessageType
+    DESCRIPTOR = mydescriptor
   myproto_instance = MyProtoClass()
   myproto.foo_field = 23
   ...
+
+  The above example will not work for nested types. If you wish to include them,
+  use reflection.MakeClass() instead of manually instantiating the class in
+  order to create the appropriate class structure.
   """
 
   # Must be consistent with the protocol-compiler code in
@@ -152,10 +164,12 @@
     """
     descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY]
     cls._decoders_by_tag = {}
+    cls._extensions_by_name = {}
+    cls._extensions_by_number = {}
     if (descriptor.has_options and
         descriptor.GetOptions().message_set_wire_format):
       cls._decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = (
-          decoder.MessageSetItemDecoder(descriptor), None)
+          decoder.MessageSetItemDecoder(cls._extensions_by_number), None)
 
     # Attach stuff to each FieldDescriptor for quick lookup later on.
     for field in descriptor.fields:
@@ -169,6 +183,7 @@
     _AddStaticMethods(cls)
     _AddMessageMethods(descriptor, cls)
     _AddPrivateHelperMethods(descriptor, cls)
+    copyreg.pickle(cls, lambda obj: (cls, (), obj.__getstate__()))
 
     superclass = super(GeneratedProtocolMessageType, cls)
     superclass.__init__(name, bases, dictionary)
@@ -289,8 +304,7 @@
 
   if is_map_entry:
     field_encoder = encoder.MapEncoder(field_descriptor)
-    sizer = encoder.MapSizer(field_descriptor,
-                             _IsMessageMapField(field_descriptor))
+    sizer = encoder.MapSizer(field_descriptor)
   elif _IsMessageSetExtension(field_descriptor):
     field_encoder = encoder.MessageSetItemEncoder(field_descriptor.number)
     sizer = encoder.MessageSetItemSizer(field_descriptor.number)
@@ -371,15 +385,13 @@
   if _IsMessageMapField(field):
     def MakeMessageMapDefault(message):
       return containers.MessageMap(
-          message._listener_for_children, value_field.message_type, key_checker,
-          field.message_type)
+          message._listener_for_children, value_field.message_type, key_checker)
     return MakeMessageMapDefault
   else:
     value_checker = type_checkers.GetTypeChecker(value_field)
     def MakePrimitiveMapDefault(message):
       return containers.ScalarMap(
-          message._listener_for_children, key_checker, value_checker,
-          field.message_type)
+          message._listener_for_children, key_checker, value_checker)
     return MakePrimitiveMapDefault
 
 def _DefaultValueConstructorForField(field):
@@ -735,21 +747,32 @@
     constant_name = extension_name.upper() + "_FIELD_NUMBER"
     setattr(cls, constant_name, extension_field.number)
 
-  # TODO(amauryfa): Migrate all users of these attributes to functions like
-  #   pool.FindExtensionByNumber(descriptor).
-  if descriptor.file is not None:
-    # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
-    pool = descriptor.file.pool
-    cls._extensions_by_number = pool._extensions_by_number[descriptor]
-    cls._extensions_by_name = pool._extensions_by_name[descriptor]
 
 def _AddStaticMethods(cls):
   # TODO(robinson): This probably needs to be thread-safe(?)
   def RegisterExtension(extension_handle):
     extension_handle.containing_type = cls.DESCRIPTOR
-    # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
-    cls.DESCRIPTOR.file.pool.AddExtensionDescriptor(extension_handle)
     _AttachFieldHelpers(cls, extension_handle)
+
+    # Try to insert our extension, failing if an extension with the same number
+    # already exists.
+    actual_handle = cls._extensions_by_number.setdefault(
+        extension_handle.number, extension_handle)
+    if actual_handle is not extension_handle:
+      raise AssertionError(
+          'Extensions "%s" and "%s" both try to extend message type "%s" with '
+          'field number %d.' %
+          (extension_handle.full_name, actual_handle.full_name,
+           cls.DESCRIPTOR.full_name, extension_handle.number))
+
+    cls._extensions_by_name[extension_handle.full_name] = extension_handle
+
+    handle = extension_handle  # avoid line wrapping
+    if _IsMessageSetExtension(handle):
+      # MessageSet extension.  Also register under type name.
+      cls._extensions_by_name[
+          extension_handle.message_type.full_name] = extension_handle
+
   cls.RegisterExtension = staticmethod(RegisterExtension)
 
   def FromString(s):
@@ -893,7 +916,7 @@
 def _InternalUnpackAny(msg):
   """Unpacks Any message and returns the unpacked message.
 
-  This internal method is different from public Any Unpack method which takes
+  This internal method is differnt from public Any Unpack method which takes
   the target message as argument. _InternalUnpackAny method does not have
   target message type and need to find the message type in descriptor pool.
 
@@ -903,33 +926,26 @@
   Returns:
     The unpacked message.
   """
-  # TODO(amauryfa): Don't use the factory of generated messages.
-  # To make Any work with custom factories, use the message factory of the
-  # parent message.
-  # pylint: disable=g-import-not-at-top
-  from google.protobuf import symbol_database
-  factory = symbol_database.Default()
-
   type_url = msg.type_url
+  db = symbol_database.Default()
 
   if not type_url:
     return None
 
   # TODO(haberman): For now we just strip the hostname.  Better logic will be
   # required.
-  type_name = type_url.split('/')[-1]
-  descriptor = factory.pool.FindMessageTypeByName(type_name)
+  type_name = type_url.split("/")[-1]
+  descriptor = db.pool.FindMessageTypeByName(type_name)
 
   if descriptor is None:
     return None
 
-  message_class = factory.GetPrototype(descriptor)
+  message_class = db.GetPrototype(descriptor)
   message = message_class()
 
   message.ParseFromString(msg.value)
   return message
 
-
 def _AddEqualsMethod(message_descriptor, cls):
   """Helper for _AddMessageMethods()."""
   def __eq__(self, other):
@@ -1010,16 +1026,11 @@
       return self._cached_byte_size
 
     size = 0
-    descriptor = self.DESCRIPTOR
-    if descriptor.GetOptions().map_entry:
-      # Fields of map entry should always be serialized.
-      size = descriptor.fields_by_name['key']._sizer(self.key)
-      size += descriptor.fields_by_name['value']._sizer(self.value)
-    else:
-      for field_descriptor, field_value in self.ListFields():
-        size += field_descriptor._sizer(field_value)
-      for tag_bytes, value_bytes in self._unknown_fields:
-        size += len(tag_bytes) + len(value_bytes)
+    for field_descriptor, field_value in self.ListFields():
+      size += field_descriptor._sizer(field_value)
+
+    for tag_bytes, value_bytes in self._unknown_fields:
+      size += len(tag_bytes) + len(value_bytes)
 
     self._cached_byte_size = size
     self._cached_byte_size_dirty = False
@@ -1032,46 +1043,32 @@
 def _AddSerializeToStringMethod(message_descriptor, cls):
   """Helper for _AddMessageMethods()."""
 
-  def SerializeToString(self, **kwargs):
+  def SerializeToString(self):
     # Check if the message has all of its required fields set.
     errors = []
     if not self.IsInitialized():
       raise message_mod.EncodeError(
           'Message %s is missing required fields: %s' % (
           self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
-    return self.SerializePartialToString(**kwargs)
+    return self.SerializePartialToString()
   cls.SerializeToString = SerializeToString
 
 
 def _AddSerializePartialToStringMethod(message_descriptor, cls):
   """Helper for _AddMessageMethods()."""
 
-  def SerializePartialToString(self, **kwargs):
+  def SerializePartialToString(self):
     out = BytesIO()
-    self._InternalSerialize(out.write, **kwargs)
+    self._InternalSerialize(out.write)
     return out.getvalue()
   cls.SerializePartialToString = SerializePartialToString
 
-  def InternalSerialize(self, write_bytes, deterministic=None):
-    if deterministic is None:
-      deterministic = (
-          api_implementation.IsPythonDefaultSerializationDeterministic())
-    else:
-      deterministic = bool(deterministic)
-
-    descriptor = self.DESCRIPTOR
-    if descriptor.GetOptions().map_entry:
-      # Fields of map entry should always be serialized.
-      descriptor.fields_by_name['key']._encoder(
-          write_bytes, self.key, deterministic)
-      descriptor.fields_by_name['value']._encoder(
-          write_bytes, self.value, deterministic)
-    else:
-      for field_descriptor, field_value in self.ListFields():
-        field_descriptor._encoder(write_bytes, field_value, deterministic)
-      for tag_bytes, value_bytes in self._unknown_fields:
-        write_bytes(tag_bytes)
-        write_bytes(value_bytes)
+  def InternalSerialize(self, write_bytes):
+    for field_descriptor, field_value in self.ListFields():
+      field_descriptor._encoder(write_bytes, field_value)
+    for tag_bytes, value_bytes in self._unknown_fields:
+      write_bytes(tag_bytes)
+      write_bytes(value_bytes)
   cls._InternalSerialize = InternalSerialize
 
 
@@ -1109,8 +1106,7 @@
         new_pos = local_SkipField(buffer, new_pos, end, tag_bytes)
         if new_pos == -1:
           return pos
-        if (not is_proto3 or
-            api_implementation.GetPythonProto3PreserveUnknownsDefault()):
+        if not is_proto3:
           if not unknown_field_list:
             unknown_field_list = self._unknown_fields = []
           unknown_field_list.append(
@@ -1227,7 +1223,7 @@
     if not isinstance(msg, cls):
       raise TypeError(
           "Parameter to MergeFrom() must be instance of same class: "
-          'expected %s got %s.' % (cls.__name__, msg.__class__.__name__))
+          "expected %s got %s." % (cls.__name__, type(msg).__name__))
 
     assert msg is not self
     self._Modified()
@@ -1281,12 +1277,6 @@
   cls.WhichOneof = WhichOneof
 
 
-def _AddReduceMethod(cls):
-  def __reduce__(self):  # pylint: disable=invalid-name
-    return (type(self), (), self.__getstate__())
-  cls.__reduce__ = __reduce__
-
-
 def _Clear(self):
   # Clear fields.
   self._fields = {}
@@ -1332,7 +1322,6 @@
   _AddIsInitializedMethod(message_descriptor, cls)
   _AddMergeFromMethod(cls)
   _AddWhichOneofMethod(message_descriptor, cls)
-  _AddReduceMethod(cls)
   # Adds methods which do not depend on cls.
   cls.Clear = _Clear
   cls.DiscardUnknownFields = _DiscardUnknownFields
diff --git a/python/google/protobuf/internal/python_protobuf.cc b/python/google/protobuf/internal/python_protobuf.cc
deleted file mode 100644
index f90cc43..0000000
--- a/python/google/protobuf/internal/python_protobuf.cc
+++ /dev/null
@@ -1,63 +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.
-
-// Author: qrczak@google.com (Marcin Kowalczyk)
-
-#include <google/protobuf/python/python_protobuf.h>
-
-namespace google {
-namespace protobuf {
-namespace python {
-
-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
-// with a full implementation.
-const Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg) =
-    GetCProtoInsidePyProtoStub;
-Message* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg) =
-    MutableCProtoInsidePyProtoStub;
-
-const Message* GetCProtoInsidePyProto(PyObject* msg) {
-  return GetCProtoInsidePyProtoPtr(msg);
-}
-Message* MutableCProtoInsidePyProto(PyObject* msg) {
-  return MutableCProtoInsidePyProtoPtr(msg);
-}
-
-}  // namespace python
-}  // namespace protobuf
-}  // namespace google
diff --git a/python/google/protobuf/internal/reflection_test.py b/python/google/protobuf/internal/reflection_test.py
index 0306ff4..6dc2fff 100755
--- a/python/google/protobuf/internal/reflection_test.py
+++ b/python/google/protobuf/internal/reflection_test.py
@@ -60,13 +60,9 @@
 from google.protobuf.internal import message_set_extensions_pb2
 from google.protobuf.internal import wire_format
 from google.protobuf.internal import test_util
-from google.protobuf.internal import testing_refleaks
 from google.protobuf.internal import decoder
 
 
-BaseTestCase = testing_refleaks.BaseTestCase
-
-
 class _MiniDecoder(object):
   """Decodes a stream of values from a string.
 
@@ -99,12 +95,12 @@
     return wire_format.UnpackTag(self.ReadVarint())
 
   def ReadFloat(self):
-    result = struct.unpack('<f', self._bytes[self._pos:self._pos+4])[0]
+    result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0]
     self._pos += 4
     return result
 
   def ReadDouble(self):
-    result = struct.unpack('<d', self._bytes[self._pos:self._pos+8])[0]
+    result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0]
     self._pos += 8
     return result
 
@@ -112,7 +108,7 @@
     return self._pos == len(self._bytes)
 
 
-class ReflectionTest(BaseTestCase):
+class ReflectionTest(unittest.TestCase):
 
   def assertListsEqual(self, values, others):
     self.assertEqual(len(values), len(others))
@@ -620,24 +616,10 @@
     self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo')
     self.assertRaises(TypeError, setattr, proto, 'optional_string', 10)
     self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10)
-    self.assertRaises(TypeError, setattr, proto, 'optional_bool', 'foo')
-    self.assertRaises(TypeError, setattr, proto, 'optional_float', 'foo')
-    self.assertRaises(TypeError, setattr, proto, 'optional_double', 'foo')
-    # TODO(jieluo): Fix type checking difference for python and c extension
-    if api_implementation.Type() == 'python':
-      self.assertRaises(TypeError, setattr, proto, 'optional_bool', 1.1)
-    else:
-      proto.optional_bool = 1.1
 
-  def assertIntegerTypes(self, integer_fn):
-    """Verifies setting of scalar integers.
-
-    Args:
-      integer_fn: A function to wrap the integers that will be assigned.
-    """
+  def testIntegerTypes(self):
     def TestGetAndDeserialize(field_name, value, expected_type):
       proto = unittest_pb2.TestAllTypes()
-      value = integer_fn(value)
       setattr(proto, field_name, value)
       self.assertIsInstance(getattr(proto, field_name), expected_type)
       proto2 = unittest_pb2.TestAllTypes()
@@ -649,12 +631,12 @@
     TestGetAndDeserialize('optional_uint32', 1 << 30, int)
     try:
       integer_64 = long
-    except NameError:  # Python3
+    except NameError: # Python3
       integer_64 = int
     if struct.calcsize('L') == 4:
       # Python only has signed ints, so 32-bit python can't fit an uint32
       # in an int.
-      TestGetAndDeserialize('optional_uint32', 1 << 31, integer_64)
+      TestGetAndDeserialize('optional_uint32', 1 << 31, long)
     else:
       # 64-bit python can fit uint32 inside an int
       TestGetAndDeserialize('optional_uint32', 1 << 31, int)
@@ -663,62 +645,25 @@
     TestGetAndDeserialize('optional_uint64', 1 << 30, integer_64)
     TestGetAndDeserialize('optional_uint64', 1 << 60, integer_64)
 
-  def testIntegerTypes(self):
-    self.assertIntegerTypes(lambda x: x)
-
-  def testNonStandardIntegerTypes(self):
-    self.assertIntegerTypes(test_util.NonStandardInteger)
-
-  def testIllegalValuesForIntegers(self):
-    pb = unittest_pb2.TestAllTypes()
-
-    # Strings are illegal, even when the represent an integer.
-    with self.assertRaises(TypeError):
-      pb.optional_uint64 = '2'
-
-    # The exact error should propagate with a poorly written custom integer.
-    with self.assertRaisesRegexp(RuntimeError, 'my_error'):
-      pb.optional_uint64 = test_util.NonStandardInteger(5, 'my_error')
-
-  def assetIntegerBoundsChecking(self, integer_fn):
-    """Verifies bounds checking for scalar integer fields.
-
-    Args:
-      integer_fn: A function to wrap the integers that will be assigned.
-    """
+  def testSingleScalarBoundsChecking(self):
     def TestMinAndMaxIntegers(field_name, expected_min, expected_max):
       pb = unittest_pb2.TestAllTypes()
-      expected_min = integer_fn(expected_min)
-      expected_max = integer_fn(expected_max)
       setattr(pb, field_name, expected_min)
       self.assertEqual(expected_min, getattr(pb, field_name))
       setattr(pb, field_name, expected_max)
       self.assertEqual(expected_max, getattr(pb, field_name))
-      self.assertRaises((ValueError, TypeError), setattr, pb, field_name,
-                        expected_min - 1)
-      self.assertRaises((ValueError, TypeError), setattr, pb, field_name,
-                        expected_max + 1)
+      self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1)
+      self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1)
 
     TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1)
     TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff)
     TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1)
     TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff)
-    # A bit of white-box testing since -1 is an int and not a long in C++ and
-    # so goes down a different path.
-    pb = unittest_pb2.TestAllTypes()
-    with self.assertRaises((ValueError, TypeError)):
-      pb.optional_uint64 = integer_fn(-(1 << 63))
 
     pb = unittest_pb2.TestAllTypes()
-    pb.optional_nested_enum = integer_fn(1)
+    pb.optional_nested_enum = 1
     self.assertEqual(1, pb.optional_nested_enum)
 
-  def testSingleScalarBoundsChecking(self):
-    self.assetIntegerBoundsChecking(lambda x: x)
-
-  def testNonStandardSingleScalarBoundsChecking(self):
-    self.assetIntegerBoundsChecking(test_util.NonStandardInteger)
-
   def testRepeatedScalarTypeSafety(self):
     proto = unittest_pb2.TestAllTypes()
     self.assertRaises(TypeError, proto.repeated_int32.append, 1.1)
@@ -730,12 +675,6 @@
     proto.repeated_int32[0] = 23
     self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23)
     self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc')
-    self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, [])
-    self.assertRaises(TypeError, proto.repeated_int32.__setitem__,
-                      'index', 23)
-
-    proto.repeated_string.append('2')
-    self.assertRaises(TypeError, proto.repeated_string.__setitem__, 0, 10)
 
     # Repeated enums tests.
     #proto.repeated_nested_enum.append(0)
@@ -1023,14 +962,6 @@
     self.assertEqual(4, len(proto.repeated_nested_message))
     self.assertEqual(n1, proto.repeated_nested_message[2])
     self.assertEqual(n2, proto.repeated_nested_message[3])
-    self.assertRaises(TypeError,
-                      proto.repeated_nested_message.extend, n1)
-    self.assertRaises(TypeError,
-                      proto.repeated_nested_message.extend, [0])
-    wrong_message_type = unittest_pb2.TestAllTypes()
-    self.assertRaises(TypeError,
-                      proto.repeated_nested_message.extend,
-                      [wrong_message_type])
 
     # Test clearing.
     proto.ClearField('repeated_nested_message')
@@ -1041,9 +972,6 @@
     proto.repeated_nested_message.add(bb=23)
     self.assertEqual(1, len(proto.repeated_nested_message))
     self.assertEqual(23, proto.repeated_nested_message[0].bb)
-    self.assertRaises(TypeError, proto.repeated_nested_message.add, 23)
-    with self.assertRaises(Exception):
-      proto.repeated_nested_message[0] = 23
 
   def testRepeatedCompositeRemove(self):
     proto = unittest_pb2.TestAllTypes()
@@ -1254,18 +1182,12 @@
     self.assertTrue(not extendee_proto.HasExtension(extension))
 
   def testRegisteredExtensions(self):
-    pool = unittest_pb2.DESCRIPTOR.pool
-    self.assertTrue(
-        pool.FindExtensionByNumber(
-            unittest_pb2.TestAllExtensions.DESCRIPTOR, 1))
-    self.assertIs(
-        pool.FindExtensionByName(
-            'protobuf_unittest.optional_int32_extension').containing_type,
-        unittest_pb2.TestAllExtensions.DESCRIPTOR)
+    self.assertTrue('protobuf_unittest.optional_int32_extension' in
+                    unittest_pb2.TestAllExtensions._extensions_by_name)
+    self.assertTrue(1 in unittest_pb2.TestAllExtensions._extensions_by_number)
     # Make sure extensions haven't been registered into types that shouldn't
     # have any.
-    self.assertEqual(0, len(
-        pool.FindAllExtensions(unittest_pb2.TestAllTypes.DESCRIPTOR)))
+    self.assertEqual(0, len(unittest_pb2.TestAllTypes._extensions_by_name))
 
   # If message A directly contains message B, and
   # a.HasField('b') is currently False, then mutating any
@@ -1577,14 +1499,7 @@
     container = copy.deepcopy(proto1.repeated_int32)
     self.assertEqual([2, 3], container)
 
-    message1 = proto1.repeated_nested_message.add()
-    message1.bb = 1
-    messages = copy.deepcopy(proto1.repeated_nested_message)
-    self.assertEqual(proto1.repeated_nested_message, messages)
-    message1.bb = 2
-    self.assertNotEqual(proto1.repeated_nested_message, messages)
-
-    # TODO(anuraag): Implement deepcopy for extension dict
+    # TODO(anuraag): Implement deepcopy for repeated composite / extension dict
 
   def testClear(self):
     proto = unittest_pb2.TestAllTypes()
@@ -1636,20 +1551,6 @@
     self.assertFalse(proto.HasField('optional_foreign_message'))
     self.assertEqual(0, proto.optional_foreign_message.c)
 
-  def testDisconnectingInOneof(self):
-    m = unittest_pb2.TestOneof2()  # This message has two messages in a oneof.
-    m.foo_message.qux_int = 5
-    sub_message = m.foo_message
-    # Accessing another message's field does not clear the first one
-    self.assertEqual(m.foo_lazy_message.qux_int, 0)
-    self.assertEqual(m.foo_message.qux_int, 5)
-    # But mutating another message in the oneof detaches the first one.
-    m.foo_lazy_message.qux_int = 6
-    self.assertEqual(m.foo_message.qux_int, 0)
-    # The reference we got above was detached and is still valid.
-    self.assertEqual(sub_message.qux_int, 5)
-    sub_message.qux_int = 7
-
   def testOneOf(self):
     proto = unittest_pb2.TestAllTypes()
     proto.oneof_uint32 = 10
@@ -1668,11 +1569,8 @@
     proto.SerializeToString()
     proto.SerializePartialToString()
 
-  def assertNotInitialized(self, proto, error_size=None):
-    errors = []
+  def assertNotInitialized(self, proto):
     self.assertFalse(proto.IsInitialized())
-    self.assertFalse(proto.IsInitialized(errors))
-    self.assertEqual(error_size, len(errors))
     self.assertRaises(message.EncodeError, proto.SerializeToString)
     # "Partial" serialization doesn't care if message is uninitialized.
     proto.SerializePartialToString()
@@ -1686,7 +1584,7 @@
 
     # The case of uninitialized required fields.
     proto = unittest_pb2.TestRequired()
-    self.assertNotInitialized(proto, 3)
+    self.assertNotInitialized(proto)
     proto.a = proto.b = proto.c = 2
     self.assertInitialized(proto)
 
@@ -1694,14 +1592,14 @@
     proto = unittest_pb2.TestRequiredForeign()
     self.assertInitialized(proto)
     proto.optional_message.a = 1
-    self.assertNotInitialized(proto, 2)
+    self.assertNotInitialized(proto)
     proto.optional_message.b = 0
     proto.optional_message.c = 0
     self.assertInitialized(proto)
 
     # Uninitialized repeated submessage.
     message1 = proto.repeated_message.add()
-    self.assertNotInitialized(proto, 3)
+    self.assertNotInitialized(proto)
     message1.a = message1.b = message1.c = 0
     self.assertInitialized(proto)
 
@@ -1710,11 +1608,11 @@
     extension = unittest_pb2.TestRequired.multi
     message1 = proto.Extensions[extension].add()
     message2 = proto.Extensions[extension].add()
-    self.assertNotInitialized(proto, 6)
+    self.assertNotInitialized(proto)
     message1.a = 1
     message1.b = 1
     message1.c = 1
-    self.assertNotInitialized(proto, 3)
+    self.assertNotInitialized(proto)
     message2.a = 2
     message2.b = 2
     message2.c = 2
@@ -1724,7 +1622,7 @@
     proto = unittest_pb2.TestAllExtensions()
     extension = unittest_pb2.TestRequired.single
     proto.Extensions[extension].a = 1
-    self.assertNotInitialized(proto, 2)
+    self.assertNotInitialized(proto)
     proto.Extensions[extension].b = 2
     proto.Extensions[extension].c = 3
     self.assertInitialized(proto)
@@ -1911,7 +1809,7 @@
 #  into separate TestCase classes.
 
 
-class TestAllTypesEqualityTest(BaseTestCase):
+class TestAllTypesEqualityTest(unittest.TestCase):
 
   def setUp(self):
     self.first_proto = unittest_pb2.TestAllTypes()
@@ -1927,7 +1825,7 @@
     self.assertEqual(self.first_proto, self.second_proto)
 
 
-class FullProtosEqualityTest(BaseTestCase):
+class FullProtosEqualityTest(unittest.TestCase):
 
   """Equality tests using completely-full protos as a starting point."""
 
@@ -2013,7 +1911,7 @@
     self.assertEqual(self.first_proto, self.second_proto)
 
 
-class ExtensionEqualityTest(BaseTestCase):
+class ExtensionEqualityTest(unittest.TestCase):
 
   def testExtensionEquality(self):
     first_proto = unittest_pb2.TestAllExtensions()
@@ -2046,7 +1944,7 @@
     self.assertEqual(first_proto, second_proto)
 
 
-class MutualRecursionEqualityTest(BaseTestCase):
+class MutualRecursionEqualityTest(unittest.TestCase):
 
   def testEqualityWithMutualRecursion(self):
     first_proto = unittest_pb2.TestMutualRecursionA()
@@ -2058,7 +1956,7 @@
     self.assertEqual(first_proto, second_proto)
 
 
-class ByteSizeTest(BaseTestCase):
+class ByteSizeTest(unittest.TestCase):
 
   def setUp(self):
     self.proto = unittest_pb2.TestAllTypes()
@@ -2183,8 +2081,6 @@
     foreign_message_1 = self.proto.repeated_nested_message.add()
     foreign_message_1.bb = 9
     self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
-    repeated_nested_message = copy.deepcopy(
-        self.proto.repeated_nested_message)
 
     # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
     del self.proto.repeated_nested_message[0]
@@ -2205,16 +2101,6 @@
     del self.proto.repeated_nested_message[0]
     self.assertEqual(0, self.Size())
 
-    self.assertEqual(2, len(repeated_nested_message))
-    del repeated_nested_message[0:1]
-    # TODO(jieluo): Fix cpp extension bug when delete repeated message.
-    if api_implementation.Type() == 'python':
-      self.assertEqual(1, len(repeated_nested_message))
-    del repeated_nested_message[-1]
-    # TODO(jieluo): Fix cpp extension bug when delete repeated message.
-    if api_implementation.Type() == 'python':
-      self.assertEqual(0, len(repeated_nested_message))
-
   def testRepeatedGroups(self):
     # 2-byte START_GROUP plus 2-byte END_GROUP.
     group_0 = self.proto.repeatedgroup.add()
@@ -2231,10 +2117,6 @@
     proto.Extensions[extension] = 23
     # 1 byte for tag, 1 byte for value.
     self.assertEqual(2, proto.ByteSize())
-    field = unittest_pb2.TestAllTypes.DESCRIPTOR.fields_by_name[
-        'optional_int32']
-    with self.assertRaises(KeyError):
-      proto.Extensions[field] = 23
 
   def testCacheInvalidationForNonrepeatedScalar(self):
     # Test non-extension.
@@ -2370,7 +2252,7 @@
 #   * Handling of empty submessages (with and without "has"
 #     bits set).
 
-class SerializationTest(BaseTestCase):
+class SerializationTest(unittest.TestCase):
 
   def testSerializeEmtpyMessage(self):
     first_proto = unittest_pb2.TestAllTypes()
@@ -2931,7 +2813,7 @@
     self.assertEqual(3, proto.repeated_int32[2])
 
 
-class OptionsTest(BaseTestCase):
+class OptionsTest(unittest.TestCase):
 
   def testMessageOptions(self):
     proto = message_set_extensions_pb2.TestMessageSet()
@@ -2958,7 +2840,7 @@
 
 
 
-class ClassAPITest(BaseTestCase):
+class ClassAPITest(unittest.TestCase):
 
   @unittest.skipIf(
       api_implementation.Type() == 'cpp' and api_implementation.Version() == 2,
@@ -3041,9 +2923,6 @@
     text_format.Merge(file_descriptor_str, file_descriptor)
     return file_descriptor.SerializeToString()
 
-  @testing_refleaks.SkipReferenceLeakChecker('MakeDescriptor is not repeatable')
-  # This test can only run once; the second time, it raises errors about
-  # conflicting message descriptors.
   def testParsingFlatClassWithExplicitClassDeclaration(self):
     """Test that the generated class can parse a flat message."""
     # TODO(xiaofeng): This test fails with cpp implemetnation in the call
@@ -3068,7 +2947,6 @@
     text_format.Merge(msg_str, msg)
     self.assertEqual(msg.flat, [0, 1, 2])
 
-  @testing_refleaks.SkipReferenceLeakChecker('MakeDescriptor is not repeatable')
   def testParsingFlatClass(self):
     """Test that the generated class can parse a flat message."""
     file_descriptor = descriptor_pb2.FileDescriptorProto()
@@ -3084,7 +2962,6 @@
     text_format.Merge(msg_str, msg)
     self.assertEqual(msg.flat, [0, 1, 2])
 
-  @testing_refleaks.SkipReferenceLeakChecker('MakeDescriptor is not repeatable')
   def testParsingNestedClass(self):
     """Test that the generated class can parse a nested message."""
     file_descriptor = descriptor_pb2.FileDescriptorProto()
diff --git a/python/google/protobuf/internal/service_reflection_test.py b/python/google/protobuf/internal/service_reflection_test.py
index 77239f4..62900b1 100755
--- a/python/google/protobuf/internal/service_reflection_test.py
+++ b/python/google/protobuf/internal/service_reflection_test.py
@@ -82,10 +82,6 @@
     service_descriptor = unittest_pb2.TestService.GetDescriptor()
     srvc.CallMethod(service_descriptor.methods[1], rpc_controller,
                     unittest_pb2.BarRequest(), MyCallback)
-    self.assertTrue(srvc.GetRequestClass(service_descriptor.methods[1]) is
-                    unittest_pb2.BarRequest)
-    self.assertTrue(srvc.GetResponseClass(service_descriptor.methods[1]) is
-                    unittest_pb2.BarResponse)
     self.assertEqual('Method Bar not implemented.',
                      rpc_controller.failure_message)
     self.assertEqual(None, self.callback_response)
diff --git a/python/google/protobuf/internal/symbol_database_test.py b/python/google/protobuf/internal/symbol_database_test.py
index af42681..c99b426 100644
--- a/python/google/protobuf/internal/symbol_database_test.py
+++ b/python/google/protobuf/internal/symbol_database_test.py
@@ -39,29 +39,26 @@
 
 from google.protobuf import unittest_pb2
 from google.protobuf import descriptor
-from google.protobuf import descriptor_pool
 from google.protobuf import symbol_database
 
-
 class SymbolDatabaseTest(unittest.TestCase):
 
   def _Database(self):
+    # TODO(b/17734095): Remove this difference when the C++ implementation
+    # supports multiple databases.
     if descriptor._USE_C_DESCRIPTORS:
-      # The C++ implementation does not allow mixing descriptors from
-      # different pools.
-      db = symbol_database.SymbolDatabase(pool=descriptor_pool.Default())
+      return symbol_database.Default()
     else:
       db = symbol_database.SymbolDatabase()
-    # Register representative types from unittest_pb2.
-    db.RegisterFileDescriptor(unittest_pb2.DESCRIPTOR)
-    db.RegisterMessage(unittest_pb2.TestAllTypes)
-    db.RegisterMessage(unittest_pb2.TestAllTypes.NestedMessage)
-    db.RegisterMessage(unittest_pb2.TestAllTypes.OptionalGroup)
-    db.RegisterMessage(unittest_pb2.TestAllTypes.RepeatedGroup)
-    db.RegisterEnumDescriptor(unittest_pb2.ForeignEnum.DESCRIPTOR)
-    db.RegisterEnumDescriptor(unittest_pb2.TestAllTypes.NestedEnum.DESCRIPTOR)
-    db.RegisterServiceDescriptor(unittest_pb2._TESTSERVICE)
-    return db
+      # Register representative types from unittest_pb2.
+      db.RegisterFileDescriptor(unittest_pb2.DESCRIPTOR)
+      db.RegisterMessage(unittest_pb2.TestAllTypes)
+      db.RegisterMessage(unittest_pb2.TestAllTypes.NestedMessage)
+      db.RegisterMessage(unittest_pb2.TestAllTypes.OptionalGroup)
+      db.RegisterMessage(unittest_pb2.TestAllTypes.RepeatedGroup)
+      db.RegisterEnumDescriptor(unittest_pb2.ForeignEnum.DESCRIPTOR)
+      db.RegisterEnumDescriptor(unittest_pb2.TestAllTypes.NestedEnum.DESCRIPTOR)
+      return db
 
   def testGetPrototype(self):
     instance = self._Database().GetPrototype(
@@ -110,13 +107,7 @@
         self._Database().pool.FindMessageTypeByName(
             'protobuf_unittest.TestAllTypes.NestedMessage').full_name)
 
-  def testFindServiceByName(self):
-    self.assertEqual(
-        'protobuf_unittest.TestService',
-        self._Database().pool.FindServiceByName(
-            'protobuf_unittest.TestService').full_name)
-
-  def testFindFileContainingSymbol(self):
+  def testFindFindContainingSymbol(self):
     # Lookup based on either enum or message.
     self.assertEqual(
         'google/protobuf/unittest.proto',
diff --git a/python/google/protobuf/internal/test_util.py b/python/google/protobuf/internal/test_util.py
index a6e34ef..2c80559 100755
--- a/python/google/protobuf/internal/test_util.py
+++ b/python/google/protobuf/internal/test_util.py
@@ -36,18 +36,13 @@
 
 __author__ = 'robinson@google.com (Will Robinson)'
 
-import numbers
-import operator
 import os.path
 
+import sys
+
 from google.protobuf import unittest_import_pb2
 from google.protobuf import unittest_pb2
-
-try:
-  long        # Python 2
-except NameError:
-  long = int  # Python 3
-
+from google.protobuf import descriptor_pb2
 
 # Tests whether the given TestAllTypes message is proto2 or not.
 # This is used to gate several fields/features that only exist
@@ -55,7 +50,6 @@
 def IsProto2(message):
   return message.DESCRIPTOR.syntax == "proto2"
 
-
 def SetAllNonLazyFields(message):
   """Sets every non-lazy field in the message to a unique value.
 
@@ -133,37 +127,22 @@
   message.repeated_string_piece.append(u'224')
   message.repeated_cord.append(u'225')
 
-  # Add a second one of each field and set value by index.
-  message.repeated_int32.append(0)
-  message.repeated_int64.append(0)
-  message.repeated_uint32.append(0)
-  message.repeated_uint64.append(0)
-  message.repeated_sint32.append(0)
-  message.repeated_sint64.append(0)
-  message.repeated_fixed32.append(0)
-  message.repeated_fixed64.append(0)
-  message.repeated_sfixed32.append(0)
-  message.repeated_sfixed64.append(0)
-  message.repeated_float.append(0)
-  message.repeated_double.append(0)
-  message.repeated_bool.append(True)
-  message.repeated_string.append(u'0')
-  message.repeated_bytes.append(b'0')
-  message.repeated_int32[1] = 301
-  message.repeated_int64[1] = 302
-  message.repeated_uint32[1] = 303
-  message.repeated_uint64[1] = 304
-  message.repeated_sint32[1] = 305
-  message.repeated_sint64[1] = 306
-  message.repeated_fixed32[1] = 307
-  message.repeated_fixed64[1] = 308
-  message.repeated_sfixed32[1] = 309
-  message.repeated_sfixed64[1] = 310
-  message.repeated_float[1] = 311
-  message.repeated_double[1] = 312
-  message.repeated_bool[1] = False
-  message.repeated_string[1] = u'315'
-  message.repeated_bytes[1] = b'316'
+  # Add a second one of each field.
+  message.repeated_int32.append(301)
+  message.repeated_int64.append(302)
+  message.repeated_uint32.append(303)
+  message.repeated_uint64.append(304)
+  message.repeated_sint32.append(305)
+  message.repeated_sint64.append(306)
+  message.repeated_fixed32.append(307)
+  message.repeated_fixed64.append(308)
+  message.repeated_sfixed32.append(309)
+  message.repeated_sfixed64.append(310)
+  message.repeated_float.append(311)
+  message.repeated_double.append(312)
+  message.repeated_bool.append(False)
+  message.repeated_string.append(u'315')
+  message.repeated_bytes.append(b'316')
 
   if IsProto2(message):
     message.repeatedgroup.add().a = 317
@@ -172,8 +151,7 @@
   message.repeated_import_message.add().d = 320
   message.repeated_lazy_message.add().bb = 327
 
-  message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAR)
-  message.repeated_nested_enum[1] = unittest_pb2.TestAllTypes.BAZ
+  message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAZ)
   message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAZ)
   if IsProto2(message):
     message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAZ)
@@ -716,153 +694,3 @@
   message.unpacked_bool.extend([True, False])
   message.unpacked_enum.extend([unittest_pb2.FOREIGN_BAR,
                                 unittest_pb2.FOREIGN_BAZ])
-
-
-class NonStandardInteger(numbers.Integral):
-  """An integer object that does not subclass int.
-
-  This is used to verify that both C++ and regular proto systems can handle
-  integer others than int and long and that they handle them in predictable
-  ways.
-
-  NonStandardInteger is the minimal legal specification for a custom Integral.
-  As such, it does not support 0 < x < 5 and it is not hashable.
-
-  Note: This is added here instead of relying on numpy or a similar library
-  with custom integers to limit dependencies.
-  """
-
-  def __init__(self, val, error_string_on_conversion=None):
-    assert isinstance(val, numbers.Integral)
-    if isinstance(val, NonStandardInteger):
-      val = val.val
-    self.val = val
-    self.error_string_on_conversion = error_string_on_conversion
-
-  def __long__(self):
-    if self.error_string_on_conversion:
-      raise RuntimeError(self.error_string_on_conversion)
-    return long(self.val)
-
-  def __abs__(self):
-    return NonStandardInteger(operator.abs(self.val))
-
-  def __add__(self, y):
-    return NonStandardInteger(operator.add(self.val, y))
-
-  def __div__(self, y):
-    return NonStandardInteger(operator.div(self.val, y))
-
-  def __eq__(self, y):
-    return operator.eq(self.val, y)
-
-  def __floordiv__(self, y):
-    return NonStandardInteger(operator.floordiv(self.val, y))
-
-  def __truediv__(self, y):
-    return NonStandardInteger(operator.truediv(self.val, y))
-
-  def __invert__(self):
-    return NonStandardInteger(operator.invert(self.val))
-
-  def __mod__(self, y):
-    return NonStandardInteger(operator.mod(self.val, y))
-
-  def __mul__(self, y):
-    return NonStandardInteger(operator.mul(self.val, y))
-
-  def __neg__(self):
-    return NonStandardInteger(operator.neg(self.val))
-
-  def __pos__(self):
-    return NonStandardInteger(operator.pos(self.val))
-
-  def __pow__(self, y):
-    return NonStandardInteger(operator.pow(self.val, y))
-
-  def __trunc__(self):
-    return int(self.val)
-
-  def __radd__(self, y):
-    return NonStandardInteger(operator.add(y, self.val))
-
-  def __rdiv__(self, y):
-    return NonStandardInteger(operator.div(y, self.val))
-
-  def __rmod__(self, y):
-    return NonStandardInteger(operator.mod(y, self.val))
-
-  def __rmul__(self, y):
-    return NonStandardInteger(operator.mul(y, self.val))
-
-  def __rpow__(self, y):
-    return NonStandardInteger(operator.pow(y, self.val))
-
-  def __rfloordiv__(self, y):
-    return NonStandardInteger(operator.floordiv(y, self.val))
-
-  def __rtruediv__(self, y):
-    return NonStandardInteger(operator.truediv(y, self.val))
-
-  def __lshift__(self, y):
-    return NonStandardInteger(operator.lshift(self.val, y))
-
-  def __rshift__(self, y):
-    return NonStandardInteger(operator.rshift(self.val, y))
-
-  def __rlshift__(self, y):
-    return NonStandardInteger(operator.lshift(y, self.val))
-
-  def __rrshift__(self, y):
-    return NonStandardInteger(operator.rshift(y, self.val))
-
-  def __le__(self, y):
-    if isinstance(y, NonStandardInteger):
-      y = y.val
-    return operator.le(self.val, y)
-
-  def __lt__(self, y):
-    if isinstance(y, NonStandardInteger):
-      y = y.val
-    return operator.lt(self.val, y)
-
-  def __and__(self, y):
-    return NonStandardInteger(operator.and_(self.val, y))
-
-  def __or__(self, y):
-    return NonStandardInteger(operator.or_(self.val, y))
-
-  def __xor__(self, y):
-    return NonStandardInteger(operator.xor(self.val, y))
-
-  def __rand__(self, y):
-    return NonStandardInteger(operator.and_(y, self.val))
-
-  def __ror__(self, y):
-    return NonStandardInteger(operator.or_(y, self.val))
-
-  def __rxor__(self, y):
-    return NonStandardInteger(operator.xor(y, self.val))
-
-  def __bool__(self):
-    return self.val
-
-  def __nonzero__(self):
-    return self.val
-
-  def __ceil__(self):
-    return self
-
-  def __floor__(self):
-    return self
-
-  def __int__(self):
-    if self.error_string_on_conversion:
-      raise RuntimeError(self.error_string_on_conversion)
-    return int(self.val)
-
-  def __round__(self):
-    return self
-
-  def __repr__(self):
-    return 'NonStandardInteger(%s)' % self.val
diff --git a/python/google/protobuf/internal/testing_refleaks.py b/python/google/protobuf/internal/testing_refleaks.py
deleted file mode 100644
index 8ce0651..0000000
--- a/python/google/protobuf/internal/testing_refleaks.py
+++ /dev/null
@@ -1,126 +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.
-
-"""A subclass of unittest.TestCase which checks for reference leaks.
-
-To use:
-- Use testing_refleak.BaseTestCase instead of unittest.TestCase
-- Configure and compile Python with --with-pydebug
-
-If sys.gettotalrefcount() is not available (because Python was built without
-the Py_DEBUG option), then this module is a no-op and tests will run normally.
-"""
-
-import gc
-import sys
-
-try:
-  import copy_reg as copyreg  #PY26
-except ImportError:
-  import copyreg
-
-try:
-  import unittest2 as unittest  #PY26
-except ImportError:
-  import unittest
-
-
-class LocalTestResult(unittest.TestResult):
-  """A TestResult which forwards events to a parent object, except for Skips."""
-
-  def __init__(self, parent_result):
-    unittest.TestResult.__init__(self)
-    self.parent_result = parent_result
-
-  def addError(self, test, error):
-    self.parent_result.addError(test, error)
-
-  def addFailure(self, test, error):
-    self.parent_result.addFailure(test, error)
-
-  def addSkip(self, test, reason):
-    pass
-
-
-class ReferenceLeakCheckerTestCase(unittest.TestCase):
-  """A TestCase which runs tests multiple times, collecting reference counts."""
-
-  NB_RUNS = 3
-
-  def run(self, result=None):
-    # python_message.py registers all Message classes to some pickle global
-    # registry, which makes the classes immortal.
-    # We save a copy of this registry, and reset it before we could references.
-    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)
-
-    oldrefcount = 0
-    local_result = LocalTestResult(result)
-
-    refcount_deltas = []
-    for _ in range(self.NB_RUNS):
-      oldrefcount = self._getRefcounts()
-      super(ReferenceLeakCheckerTestCase, self).run(result=local_result)
-      newrefcount = self._getRefcounts()
-      refcount_deltas.append(newrefcount - oldrefcount)
-    print(refcount_deltas, self)
-
-    try:
-      self.assertEqual(refcount_deltas, [0] * self.NB_RUNS)
-    except Exception:  # pylint: disable=broad-except
-      result.addError(self, sys.exc_info())
-
-  def _getRefcounts(self):
-    copyreg.dispatch_table.clear()
-    copyreg.dispatch_table.update(self._saved_pickle_registry)
-    # It is sometimes necessary to gc.collect() multiple times, to ensure
-    # that all objects can be collected.
-    gc.collect()
-    gc.collect()
-    gc.collect()
-    return sys.gettotalrefcount()
-
-
-if hasattr(sys, 'gettotalrefcount'):
-  BaseTestCase = ReferenceLeakCheckerTestCase
-  SkipReferenceLeakChecker = unittest.skip
-
-else:
-  # When PyDEBUG is not enabled, run the tests normally.
-  BaseTestCase = unittest.TestCase
-
-  def SkipReferenceLeakChecker(reason):
-    del reason  # Don't skip, so don't need a reason.
-    def Same(func):
-      return func
-    return Same
diff --git a/python/google/protobuf/internal/text_format_test.py b/python/google/protobuf/internal/text_format_test.py
index a52f133..ab2bf05 100755
--- a/python/google/protobuf/internal/text_format_test.py
+++ b/python/google/protobuf/internal/text_format_test.py
@@ -1,5 +1,4 @@
 #! /usr/bin/env python
-# -*- coding: utf-8 -*-
 #
 # Protocol Buffers - Google's data interchange format
 # Copyright 2008 Google Inc.  All rights reserved.
@@ -36,28 +35,24 @@
 __author__ = 'kenton@google.com (Kenton Varda)'
 
 
-import math
 import re
 import six
 import string
 
 try:
-  import unittest2 as unittest  # PY26, pylint: disable=g-import-not-at-top
+  import unittest2 as unittest  #PY26
 except ImportError:
-  import unittest  # pylint: disable=g-import-not-at-top
+  import unittest
 
 from google.protobuf.internal import _parameterized
 
-from google.protobuf import any_test_pb2
 from google.protobuf import map_unittest_pb2
 from google.protobuf import unittest_mset_pb2
 from google.protobuf import unittest_pb2
 from google.protobuf import unittest_proto3_arena_pb2
 from google.protobuf.internal import api_implementation
-from google.protobuf.internal import any_test_pb2 as test_extend_any
-from google.protobuf.internal import message_set_extensions_pb2
 from google.protobuf.internal import test_util
-from google.protobuf import descriptor_pool
+from google.protobuf.internal import message_set_extensions_pb2
 from google.protobuf import text_format
 
 
@@ -95,11 +90,13 @@
                .replace('e-0','e-').replace('e-0','e-')
     # Floating point fields are printed with .0 suffix even if they are
     # actualy integer numbers.
-    text = re.compile(r'\.0$', re.MULTILINE).sub('', text)
+    text = re.compile('\.0$', re.MULTILINE).sub('', text)
     return text
 
 
-@_parameterized.Parameters((unittest_pb2), (unittest_proto3_arena_pb2))
+@_parameterized.Parameters(
+    (unittest_pb2),
+    (unittest_proto3_arena_pb2))
 class TextFormatTest(TextFormatBase):
 
   def testPrintExotic(self, message_module):
@@ -123,10 +120,8 @@
         'repeated_string: "\\303\\274\\352\\234\\237"\n')
 
   def testPrintExoticUnicodeSubclass(self, message_module):
-
     class UnicodeSub(six.text_type):
       pass
-
     message = message_module.TestAllTypes()
     message.repeated_string.append(UnicodeSub(u'\u00fc\ua71f'))
     self.CompareToGoldenText(
@@ -170,8 +165,8 @@
     message.repeated_string.append('\000\001\a\b\f\n\r\t\v\\\'"')
     message.repeated_string.append(u'\u00fc\ua71f')
     self.CompareToGoldenText(
-        self.RemoveRedundantZeros(text_format.MessageToString(
-            message, as_one_line=True)),
+        self.RemoveRedundantZeros(
+            text_format.MessageToString(message, as_one_line=True)),
         'repeated_int64: -9223372036854775808'
         ' repeated_uint64: 18446744073709551615'
         ' repeated_double: 123.456'
@@ -192,23 +187,21 @@
     message.repeated_string.append(u'\u00fc\ua71f')
 
     # Test as_utf8 = False.
-    wire_text = text_format.MessageToString(message,
-                                            as_one_line=True,
-                                            as_utf8=False)
+    wire_text = text_format.MessageToString(
+        message, as_one_line=True, as_utf8=False)
     parsed_message = message_module.TestAllTypes()
     r = text_format.Parse(wire_text, parsed_message)
     self.assertIs(r, parsed_message)
     self.assertEqual(message, parsed_message)
 
     # Test as_utf8 = True.
-    wire_text = text_format.MessageToString(message,
-                                            as_one_line=True,
-                                            as_utf8=True)
+    wire_text = text_format.MessageToString(
+        message, as_one_line=True, as_utf8=True)
     parsed_message = message_module.TestAllTypes()
     r = text_format.Parse(wire_text, parsed_message)
     self.assertIs(r, parsed_message)
     self.assertEqual(message, parsed_message,
-                     '\n%s != %s' % (message, parsed_message))
+                      '\n%s != %s' % (message, parsed_message))
 
   def testPrintRawUtf8String(self, message_module):
     message = message_module.TestAllTypes()
@@ -218,7 +211,7 @@
     parsed_message = message_module.TestAllTypes()
     text_format.Parse(text, parsed_message)
     self.assertEqual(message, parsed_message,
-                     '\n%s != %s' % (message, parsed_message))
+                      '\n%s != %s' % (message, parsed_message))
 
   def testPrintFloatFormat(self, message_module):
     # Check that float_format argument is passed to sub-message formatting.
@@ -239,15 +232,14 @@
     message.payload.repeated_double.append(.000078900)
     formatted_fields = ['optional_float: 1.25',
                         'optional_double: -3.45678901234568e-6',
-                        'repeated_float: -5642', 'repeated_double: 7.89e-5']
+                        'repeated_float: -5642',
+                        'repeated_double: 7.89e-5']
     text_message = text_format.MessageToString(message, float_format='.15g')
     self.CompareToGoldenText(
         self.RemoveRedundantZeros(text_message),
-        'payload {{\n  {0}\n  {1}\n  {2}\n  {3}\n}}\n'.format(
-            *formatted_fields))
+        'payload {{\n  {0}\n  {1}\n  {2}\n  {3}\n}}\n'.format(*formatted_fields))
     # as_one_line=True is a separate code branch where float_format is passed.
-    text_message = text_format.MessageToString(message,
-                                               as_one_line=True,
+    text_message = text_format.MessageToString(message, as_one_line=True,
                                                float_format='.15g')
     self.CompareToGoldenText(
         self.RemoveRedundantZeros(text_message),
@@ -299,33 +291,6 @@
     if message_module is unittest_pb2:
       test_util.ExpectAllFieldsSet(self, message)
 
-  def testParseAndMergeUtf8(self, message_module):
-    message = message_module.TestAllTypes()
-    test_util.SetAllFields(message)
-    ascii_text = text_format.MessageToString(message)
-    ascii_text = ascii_text.encode('utf-8')
-
-    parsed_message = message_module.TestAllTypes()
-    text_format.Parse(ascii_text, parsed_message)
-    self.assertEqual(message, parsed_message)
-    if message_module is unittest_pb2:
-      test_util.ExpectAllFieldsSet(self, message)
-
-    parsed_message.Clear()
-    text_format.Merge(ascii_text, parsed_message)
-    self.assertEqual(message, parsed_message)
-    if message_module is unittest_pb2:
-      test_util.ExpectAllFieldsSet(self, message)
-
-    if six.PY2:
-      msg2 = message_module.TestAllTypes()
-      text = (u'optional_string: "café"')
-      text_format.Merge(text, msg2)
-      self.assertEqual(msg2.optional_string, u'café')
-      msg2.Clear()
-      text_format.Parse(text, msg2)
-      self.assertEqual(msg2.optional_string, u'café')
-
   def testParseExotic(self, message_module):
     message = message_module.TestAllTypes()
     text = ('repeated_int64: -9223372036854775808\n'
@@ -346,7 +311,8 @@
     self.assertEqual(123.456, message.repeated_double[0])
     self.assertEqual(1.23e22, message.repeated_double[1])
     self.assertEqual(1.23e-18, message.repeated_double[2])
-    self.assertEqual('\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0])
+    self.assertEqual(
+        '\000\001\a\b\f\n\r\t\v\\\'"', message.repeated_string[0])
     self.assertEqual('foocorgegrault', message.repeated_string[1])
     self.assertEqual(u'\u00fc\ua71f', message.repeated_string[2])
     self.assertEqual(u'\u00fc', message.repeated_string[3])
@@ -400,39 +366,50 @@
   def testParseInvalidUtf8(self, message_module):
     message = message_module.TestAllTypes()
     text = 'repeated_string: "\\xc3\\xc3"'
-    with self.assertRaises(text_format.ParseError) as e:
-      text_format.Parse(text, message)
-    self.assertEqual(e.exception.GetLine(), 1)
-    self.assertEqual(e.exception.GetColumn(), 28)
+    self.assertRaises(text_format.ParseError, text_format.Parse, text, message)
 
   def testParseSingleWord(self, message_module):
     message = message_module.TestAllTypes()
     text = 'foo'
-    six.assertRaisesRegex(self, text_format.ParseError, (
-        r'1:1 : Message type "\w+.TestAllTypes" has no field named '
-        r'"foo".'), text_format.Parse, text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        (r'1:1 : Message type "\w+.TestAllTypes" has no field named '
+         r'"foo".'),
+        text_format.Parse, text, message)
 
   def testParseUnknownField(self, message_module):
     message = message_module.TestAllTypes()
     text = 'unknown_field: 8\n'
-    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)
+    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)
 
   def testParseBadEnumValue(self, message_module):
     message = message_module.TestAllTypes()
     text = 'optional_nested_enum: BARR'
-    six.assertRaisesRegex(self, text_format.ParseError,
-                          (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" '
-                           r'has no value named BARR.'), text_format.Parse,
-                          text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" '
+         r'has no value named BARR.'),
+        text_format.Parse, text, message)
+
+    message = message_module.TestAllTypes()
+    text = 'optional_nested_enum: 100'
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" '
+         r'has no value with number 100.'),
+        text_format.Parse, text, message)
 
   def testParseBadIntValue(self, message_module):
     message = message_module.TestAllTypes()
     text = 'optional_int32: bork'
-    six.assertRaisesRegex(self, text_format.ParseError,
-                          ('1:17 : Couldn\'t parse integer: bork'),
-                          text_format.Parse, text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        ('1:17 : Couldn\'t parse integer: bork'),
+        text_format.Parse, text, message)
 
   def testParseStringFieldUnescape(self, message_module):
     message = message_module.TestAllTypes()
@@ -442,7 +419,6 @@
                repeated_string: "\\\\xf\\\\x62"
                repeated_string: "\\\\\xf\\\\\x62"
                repeated_string: "\x5cx20"'''
-
     text_format.Parse(text, message)
 
     SLASH = '\\'
@@ -457,7 +433,8 @@
 
   def testMergeDuplicateScalars(self, message_module):
     message = message_module.TestAllTypes()
-    text = ('optional_int32: 42 ' 'optional_int32: 67')
+    text = ('optional_int32: 42 '
+            'optional_int32: 67')
     r = text_format.Merge(text, message)
     self.assertIs(r, message)
     self.assertEqual(67, message.optional_int32)
@@ -477,18 +454,18 @@
     text_format.Parse(text_format.MessageToString(m), m2)
     self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field'))
 
-  def testMergeMultipleOneof(self, message_module):
-    m_string = '\n'.join(['oneof_uint32: 11', 'oneof_string: "foo"'])
-    m2 = message_module.TestAllTypes()
-    text_format.Merge(m_string, m2)
-    self.assertEqual('oneof_string', m2.WhichOneof('oneof_field'))
-
   def testParseMultipleOneof(self, message_module):
-    m_string = '\n'.join(['oneof_uint32: 11', 'oneof_string: "foo"'])
+    m_string = '\n'.join([
+        'oneof_uint32: 11',
+        'oneof_string: "foo"'])
     m2 = message_module.TestAllTypes()
-    with self.assertRaisesRegexp(text_format.ParseError,
-                                 ' is specified along with field '):
+    if message_module is unittest_pb2:
+      with self.assertRaisesRegexp(
+          text_format.ParseError, ' is specified along with field '):
+        text_format.Parse(m_string, m2)
+    else:
       text_format.Parse(m_string, m2)
+      self.assertEqual('oneof_string', m2.WhichOneof('oneof_field'))
 
 
 # These are tests that aren't fundamentally specific to proto2, but are at
@@ -500,8 +477,8 @@
     message = unittest_pb2.TestAllTypes()
     test_util.SetAllFields(message)
     self.CompareToGoldenFile(
-        self.RemoveRedundantZeros(text_format.MessageToString(
-            message, pointy_brackets=True)),
+        self.RemoveRedundantZeros(
+            text_format.MessageToString(message, pointy_brackets=True)),
         'text_format_unittest_data_pointy_oneof.txt')
 
   def testParseGolden(self):
@@ -522,6 +499,14 @@
         self.RemoveRedundantZeros(text_format.MessageToString(message)),
         'text_format_unittest_data_oneof_implemented.txt')
 
+  def testPrintAllFieldsPointy(self):
+    message = unittest_pb2.TestAllTypes()
+    test_util.SetAllFields(message)
+    self.CompareToGoldenFile(
+        self.RemoveRedundantZeros(
+            text_format.MessageToString(message, pointy_brackets=True)),
+        'text_format_unittest_data_pointy_oneof.txt')
+
   def testPrintInIndexOrder(self):
     message = unittest_pb2.TestFieldOrderings()
     message.my_string = '115'
@@ -535,7 +520,8 @@
         'my_string: \"115\"\nmy_int: 101\nmy_float: 111\n'
         'optional_nested_message {\n  oo: 0\n  bb: 1\n}\n')
     self.CompareToGoldenText(
-        self.RemoveRedundantZeros(text_format.MessageToString(message)),
+        self.RemoveRedundantZeros(text_format.MessageToString(
+            message)),
         'my_int: 101\nmy_string: \"115\"\nmy_float: 111\n'
         'optional_nested_message {\n  bb: 1\n  oo: 0\n}\n')
 
@@ -566,13 +552,14 @@
     message.map_int64_int64[-2**33] = -2**34
     message.map_uint32_uint32[123] = 456
     message.map_uint64_uint64[2**33] = 2**34
-    message.map_string_string['abc'] = '123'
+    message.map_string_string["abc"] = "123"
     message.map_int32_foreign_message[111].c = 5
 
     # Maps are serialized to text format using their underlying repeated
     # representation.
     self.CompareToGoldenText(
-        text_format.MessageToString(message), 'map_int32_int32 {\n'
+        text_format.MessageToString(message),
+        'map_int32_int32 {\n'
         '  key: -123\n'
         '  value: -456\n'
         '}\n'
@@ -605,24 +592,29 @@
       message.map_string_string[letter] = 'dummy'
     for letter in reversed(string.ascii_uppercase[0:13]):
       message.map_string_string[letter] = 'dummy'
-    golden = ''.join(('map_string_string {\n  key: "%c"\n  value: "dummy"\n}\n'
-                      % (letter,) for letter in string.ascii_uppercase))
+    golden = ''.join((
+        'map_string_string {\n  key: "%c"\n  value: "dummy"\n}\n' % (letter,)
+        for letter in string.ascii_uppercase))
     self.CompareToGoldenText(text_format.MessageToString(message), golden)
 
-  # TODO(teboring): In c/137553523, not serializing default value for map entry
-  # message has been fixed. This test needs to be disabled in order to submit
-  # that cl. Add this back when c/137553523 has been submitted.
-  # def testMapOrderSemantics(self):
-  #   golden_lines = self.ReadGolden('map_test_data.txt')
+  def testMapOrderSemantics(self):
+    golden_lines = self.ReadGolden('map_test_data.txt')
+    # The C++ implementation emits defaulted-value fields, while the Python
+    # implementation does not.  Adjusting for this is awkward, but it is
+    # valuable to test against a common golden file.
+    line_blacklist = ('  key: 0\n',
+                      '  value: 0\n',
+                      '  key: false\n',
+                      '  value: false\n')
+    golden_lines = [line for line in golden_lines if line not in line_blacklist]
 
-  #   message = map_unittest_pb2.TestMap()
-  #   text_format.ParseLines(golden_lines, message)
-  #   candidate = text_format.MessageToString(message)
-  #   # The Python implementation emits "1.0" for the double value that the C++
-  #   # implementation emits as "1".
-  #   candidate = candidate.replace('1.0', '1', 2)
-  #   candidate = candidate.replace('0.0', '0', 2)
-  #   self.assertMultiLineEqual(candidate, ''.join(golden_lines))
+    message = map_unittest_pb2.TestMap()
+    text_format.ParseLines(golden_lines, message)
+    candidate = text_format.MessageToString(message)
+    # The Python implementation emits "1.0" for the double value that the C++
+    # implementation emits as "1".
+    candidate = candidate.replace('1.0', '1', 2)
+    self.assertMultiLineEqual(candidate, ''.join(golden_lines))
 
 
 # Tests of proto2-only features (MessageSet, extensions, etc.).
@@ -635,7 +627,8 @@
     message.message_set.Extensions[ext1].i = 23
     message.message_set.Extensions[ext2].str = 'foo'
     self.CompareToGoldenText(
-        text_format.MessageToString(message), 'message_set {\n'
+        text_format.MessageToString(message),
+        'message_set {\n'
         '  [protobuf_unittest.TestMessageSetExtension1] {\n'
         '    i: 23\n'
         '  }\n'
@@ -661,14 +654,16 @@
     message.message_set.Extensions[ext1].i = 23
     message.message_set.Extensions[ext2].str = 'foo'
     text_format.PrintMessage(message, out, use_field_number=True)
-    self.CompareToGoldenText(out.getvalue(), '1 {\n'
-                             '  1545008 {\n'
-                             '    15: 23\n'
-                             '  }\n'
-                             '  1547769 {\n'
-                             '    25: \"foo\"\n'
-                             '  }\n'
-                             '}\n')
+    self.CompareToGoldenText(
+        out.getvalue(),
+        '1 {\n'
+        '  1545008 {\n'
+        '    15: 23\n'
+        '  }\n'
+        '  1547769 {\n'
+        '    25: \"foo\"\n'
+        '  }\n'
+        '}\n')
     out.close()
 
   def testPrintMessageSetAsOneLine(self):
@@ -690,7 +685,8 @@
 
   def testParseMessageSet(self):
     message = unittest_pb2.TestAllTypes()
-    text = ('repeated_uint64: 1\n' 'repeated_uint64: 2\n')
+    text = ('repeated_uint64: 1\n'
+            'repeated_uint64: 2\n')
     text_format.Parse(text, message)
     self.assertEqual(1, message.repeated_uint64[0])
     self.assertEqual(2, message.repeated_uint64[1])
@@ -710,24 +706,10 @@
     self.assertEqual(23, message.message_set.Extensions[ext1].i)
     self.assertEqual('foo', message.message_set.Extensions[ext2].str)
 
-  def testExtensionInsideAnyMessage(self):
-    message = test_extend_any.TestAny()
-    text = ('value {\n'
-            '  [type.googleapis.com/google.protobuf.internal.TestAny] {\n'
-            '    [google.protobuf.internal.TestAnyExtension1.extension1] {\n'
-            '      i: 10\n'
-            '    }\n'
-            '  }\n'
-            '}\n')
-    text_format.Merge(text, message, descriptor_pool=descriptor_pool.Default())
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, descriptor_pool=descriptor_pool.Default()),
-        text)
-
   def testParseMessageByFieldNumber(self):
     message = unittest_pb2.TestAllTypes()
-    text = ('34: 1\n' 'repeated_uint64: 2\n')
+    text = ('34: 1\n'
+            'repeated_uint64: 2\n')
     text_format.Parse(text, message, allow_field_number=True)
     self.assertEqual(1, message.repeated_uint64[0])
     self.assertEqual(2, message.repeated_uint64[1])
@@ -750,9 +732,12 @@
     # Can't parse field number without set allow_field_number=True.
     message = unittest_pb2.TestAllTypes()
     text = '34:1\n'
-    six.assertRaisesRegex(self, text_format.ParseError, (
-        r'1:1 : Message type "\w+.TestAllTypes" has no field named '
-        r'"34".'), text_format.Parse, text, message)
+    six.assertRaisesRegex(
+        self,
+        text_format.ParseError,
+        (r'1:1 : Message type "\w+.TestAllTypes" has no field named '
+         r'"34".'),
+        text_format.Parse, text, message)
 
     # Can't parse if field number is not found.
     text = '1234:1\n'
@@ -761,10 +746,7 @@
         text_format.ParseError,
         (r'1:1 : Message type "\w+.TestAllTypes" has no field named '
          r'"1234".'),
-        text_format.Parse,
-        text,
-        message,
-        allow_field_number=True)
+        text_format.Parse, text, message, allow_field_number=True)
 
   def testPrintAllExtensions(self):
     message = unittest_pb2.TestAllExtensions()
@@ -809,14 +791,13 @@
             '    bin: "\xe0"'
             '    [nested_unknown_ext]: {\n'
             '      i: 23\n'
-            '      x: x\n'
             '      test: "test_string"\n'
             '      floaty_float: -0.315\n'
             '      num: -inf\n'
             '      multiline_str: "abc"\n'
             '          "def"\n'
             '          "xyz."\n'
-            '      [nested_unknown_ext.ext]: <\n'
+            '      [nested_unknown_ext]: <\n'
             '        i: 23\n'
             '        i: 24\n'
             '        pointfloat: .3\n'
@@ -843,9 +824,7 @@
     six.assertRaisesRegex(self,
                           text_format.ParseError,
                           'Invalid field value: }',
-                          text_format.Parse,
-                          malformed,
-                          message,
+                          text_format.Parse, malformed, message,
                           allow_unknown_extension=True)
 
     message = unittest_mset_pb2.TestMessageSetContainer()
@@ -857,9 +836,7 @@
     six.assertRaisesRegex(self,
                           text_format.ParseError,
                           'Invalid field value: "',
-                          text_format.Parse,
-                          malformed,
-                          message,
+                          text_format.Parse, malformed, message,
                           allow_unknown_extension=True)
 
     message = unittest_mset_pb2.TestMessageSetContainer()
@@ -871,9 +848,7 @@
     six.assertRaisesRegex(self,
                           text_format.ParseError,
                           'Invalid field value: "',
-                          text_format.Parse,
-                          malformed,
-                          message,
+                          text_format.Parse, malformed, message,
                           allow_unknown_extension=True)
 
     message = unittest_mset_pb2.TestMessageSetContainer()
@@ -885,9 +860,7 @@
     six.assertRaisesRegex(self,
                           text_format.ParseError,
                           '5:1 : Expected ">".',
-                          text_format.Parse,
-                          malformed,
-                          message,
+                          text_format.Parse, malformed, message,
                           allow_unknown_extension=True)
 
     # Don't allow unknown fields with allow_unknown_extension=True.
@@ -901,9 +874,7 @@
                           ('2:3 : Message type '
                            '"proto2_wireformat_unittest.TestMessageSet" has no'
                            ' field named "unknown_field".'),
-                          text_format.Parse,
-                          malformed,
-                          message,
+                          text_format.Parse, malformed, message,
                           allow_unknown_extension=True)
 
     # Parse known extension correcty.
@@ -922,76 +893,70 @@
     self.assertEqual(23, message.message_set.Extensions[ext1].i)
     self.assertEqual('foo', message.message_set.Extensions[ext2].str)
 
-  def testParseBadIdentifier(self):
-    message = unittest_pb2.TestAllTypes()
-    text = ('optional_nested_message { "bb": 1 }')
-    with self.assertRaises(text_format.ParseError) as e:
-      text_format.Parse(text, message)
-    self.assertEqual(str(e.exception),
-                     '1:27 : Expected identifier or number, got "bb".')
-
   def testParseBadExtension(self):
     message = unittest_pb2.TestAllExtensions()
     text = '[unknown_extension]: 8\n'
-    six.assertRaisesRegex(self, text_format.ParseError,
-                          '1:2 : Extension "unknown_extension" not registered.',
-                          text_format.Parse, text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        '1:2 : Extension "unknown_extension" not registered.',
+        text_format.Parse, text, message)
     message = unittest_pb2.TestAllTypes()
-    six.assertRaisesRegex(self, text_format.ParseError, (
-        '1:2 : Message type "protobuf_unittest.TestAllTypes" does not have '
-        'extensions.'), text_format.Parse, text, message)
-
-  def testParseNumericUnknownEnum(self):
-    message = unittest_pb2.TestAllTypes()
-    text = 'optional_nested_enum: 100'
-    six.assertRaisesRegex(self, text_format.ParseError,
-                          (r'1:23 : Enum type "\w+.TestAllTypes.NestedEnum" '
-                           r'has no value with number 100.'), text_format.Parse,
-                          text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        ('1:2 : Message type "protobuf_unittest.TestAllTypes" does not have '
+         'extensions.'),
+        text_format.Parse, text, message)
 
   def testMergeDuplicateExtensionScalars(self):
     message = unittest_pb2.TestAllExtensions()
     text = ('[protobuf_unittest.optional_int32_extension]: 42 '
             '[protobuf_unittest.optional_int32_extension]: 67')
     text_format.Merge(text, message)
-    self.assertEqual(67,
-                     message.Extensions[unittest_pb2.optional_int32_extension])
+    self.assertEqual(
+        67,
+        message.Extensions[unittest_pb2.optional_int32_extension])
 
   def testParseDuplicateExtensionScalars(self):
     message = unittest_pb2.TestAllExtensions()
     text = ('[protobuf_unittest.optional_int32_extension]: 42 '
             '[protobuf_unittest.optional_int32_extension]: 67')
-    six.assertRaisesRegex(self, text_format.ParseError, (
-        '1:96 : Message type "protobuf_unittest.TestAllExtensions" '
-        'should not have multiple '
-        '"protobuf_unittest.optional_int32_extension" extensions.'),
-                          text_format.Parse, text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        ('1:96 : Message type "protobuf_unittest.TestAllExtensions" '
+         'should not have multiple '
+         '"protobuf_unittest.optional_int32_extension" extensions.'),
+        text_format.Parse, text, message)
 
   def testParseDuplicateNestedMessageScalars(self):
     message = unittest_pb2.TestAllTypes()
     text = ('optional_nested_message { bb: 1 } '
             'optional_nested_message { bb: 2 }')
-    six.assertRaisesRegex(self, text_format.ParseError, (
-        '1:65 : Message type "protobuf_unittest.TestAllTypes.NestedMessage" '
-        'should not have multiple "bb" fields.'), text_format.Parse, text,
-                          message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        ('1:65 : Message type "protobuf_unittest.TestAllTypes.NestedMessage" '
+         'should not have multiple "bb" fields.'),
+        text_format.Parse, text, message)
 
   def testParseDuplicateScalars(self):
     message = unittest_pb2.TestAllTypes()
-    text = ('optional_int32: 42 ' 'optional_int32: 67')
-    six.assertRaisesRegex(self, text_format.ParseError, (
-        '1:36 : Message type "protobuf_unittest.TestAllTypes" should not '
-        'have multiple "optional_int32" fields.'), text_format.Parse, text,
-                          message)
+    text = ('optional_int32: 42 '
+            'optional_int32: 67')
+    six.assertRaisesRegex(self,
+        text_format.ParseError,
+        ('1:36 : Message type "protobuf_unittest.TestAllTypes" should not '
+         'have multiple "optional_int32" fields.'),
+        text_format.Parse, text, message)
 
   def testParseGroupNotClosed(self):
     message = unittest_pb2.TestAllTypes()
     text = 'RepeatedGroup: <'
-    six.assertRaisesRegex(self, text_format.ParseError, '1:16 : Expected ">".',
-                          text_format.Parse, text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError, '1:16 : Expected ">".',
+        text_format.Parse, text, message)
     text = 'RepeatedGroup: {'
-    six.assertRaisesRegex(self, text_format.ParseError, '1:16 : Expected "}".',
-                          text_format.Parse, text, message)
+    six.assertRaisesRegex(self,
+        text_format.ParseError, '1:16 : Expected "}".',
+        text_format.Parse, text, message)
 
   def testParseEmptyGroup(self):
     message = unittest_pb2.TestAllTypes()
@@ -1042,204 +1007,10 @@
     self.assertEqual(-2**34, message.map_int64_int64[-2**33])
     self.assertEqual(456, message.map_uint32_uint32[123])
     self.assertEqual(2**34, message.map_uint64_uint64[2**33])
-    self.assertEqual('123', message.map_string_string['abc'])
+    self.assertEqual("123", message.map_string_string["abc"])
     self.assertEqual(5, message.map_int32_foreign_message[111].c)
 
 
-class Proto3Tests(unittest.TestCase):
-
-  def testPrintMessageExpandAny(self):
-    packed_message = unittest_pb2.OneString()
-    packed_message.data = 'string'
-    message = any_test_pb2.TestAny()
-    message.any_value.Pack(packed_message)
-    self.assertEqual(
-        text_format.MessageToString(message,
-                                    descriptor_pool=descriptor_pool.Default()),
-        'any_value {\n'
-        '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-        '    data: "string"\n'
-        '  }\n'
-        '}\n')
-
-  def testPrintMessageExpandAnyRepeated(self):
-    packed_message = unittest_pb2.OneString()
-    message = any_test_pb2.TestAny()
-    packed_message.data = 'string0'
-    message.repeated_any_value.add().Pack(packed_message)
-    packed_message.data = 'string1'
-    message.repeated_any_value.add().Pack(packed_message)
-    self.assertEqual(
-        text_format.MessageToString(message),
-        'repeated_any_value {\n'
-        '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-        '    data: "string0"\n'
-        '  }\n'
-        '}\n'
-        'repeated_any_value {\n'
-        '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-        '    data: "string1"\n'
-        '  }\n'
-        '}\n')
-
-  def testPrintMessageExpandAnyDescriptorPoolMissingType(self):
-    packed_message = unittest_pb2.OneString()
-    packed_message.data = 'string'
-    message = any_test_pb2.TestAny()
-    message.any_value.Pack(packed_message)
-    empty_pool = descriptor_pool.DescriptorPool()
-    self.assertEqual(
-        text_format.MessageToString(message, descriptor_pool=empty_pool),
-        'any_value {\n'
-        '  type_url: "type.googleapis.com/protobuf_unittest.OneString"\n'
-        '  value: "\\n\\006string"\n'
-        '}\n')
-
-  def testPrintMessageExpandAnyPointyBrackets(self):
-    packed_message = unittest_pb2.OneString()
-    packed_message.data = 'string'
-    message = any_test_pb2.TestAny()
-    message.any_value.Pack(packed_message)
-    self.assertEqual(
-        text_format.MessageToString(message,
-                                    pointy_brackets=True),
-        'any_value <\n'
-        '  [type.googleapis.com/protobuf_unittest.OneString] <\n'
-        '    data: "string"\n'
-        '  >\n'
-        '>\n')
-
-  def testPrintMessageExpandAnyAsOneLine(self):
-    packed_message = unittest_pb2.OneString()
-    packed_message.data = 'string'
-    message = any_test_pb2.TestAny()
-    message.any_value.Pack(packed_message)
-    self.assertEqual(
-        text_format.MessageToString(message,
-                                    as_one_line=True),
-        'any_value {'
-        ' [type.googleapis.com/protobuf_unittest.OneString]'
-        ' { data: "string" } '
-        '}')
-
-  def testPrintMessageExpandAnyAsOneLinePointyBrackets(self):
-    packed_message = unittest_pb2.OneString()
-    packed_message.data = 'string'
-    message = any_test_pb2.TestAny()
-    message.any_value.Pack(packed_message)
-    self.assertEqual(
-        text_format.MessageToString(message,
-                                    as_one_line=True,
-                                    pointy_brackets=True,
-                                    descriptor_pool=descriptor_pool.Default()),
-        'any_value <'
-        ' [type.googleapis.com/protobuf_unittest.OneString]'
-        ' < data: "string" > '
-        '>')
-
-  def testUnknownEnums(self):
-    message = unittest_proto3_arena_pb2.TestAllTypes()
-    message2 = unittest_proto3_arena_pb2.TestAllTypes()
-    message.optional_nested_enum = 999
-    text_string = text_format.MessageToString(message)
-    text_format.Parse(text_string, message2)
-    self.assertEqual(999, message2.optional_nested_enum)
-
-  def testMergeExpandedAny(self):
-    message = any_test_pb2.TestAny()
-    text = ('any_value {\n'
-            '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-            '    data: "string"\n'
-            '  }\n'
-            '}\n')
-    text_format.Merge(text, message)
-    packed_message = unittest_pb2.OneString()
-    message.any_value.Unpack(packed_message)
-    self.assertEqual('string', packed_message.data)
-    message.Clear()
-    text_format.Parse(text, message)
-    packed_message = unittest_pb2.OneString()
-    message.any_value.Unpack(packed_message)
-    self.assertEqual('string', packed_message.data)
-
-  def testMergeExpandedAnyRepeated(self):
-    message = any_test_pb2.TestAny()
-    text = ('repeated_any_value {\n'
-            '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-            '    data: "string0"\n'
-            '  }\n'
-            '}\n'
-            'repeated_any_value {\n'
-            '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-            '    data: "string1"\n'
-            '  }\n'
-            '}\n')
-    text_format.Merge(text, message)
-    packed_message = unittest_pb2.OneString()
-    message.repeated_any_value[0].Unpack(packed_message)
-    self.assertEqual('string0', packed_message.data)
-    message.repeated_any_value[1].Unpack(packed_message)
-    self.assertEqual('string1', packed_message.data)
-
-  def testMergeExpandedAnyPointyBrackets(self):
-    message = any_test_pb2.TestAny()
-    text = ('any_value {\n'
-            '  [type.googleapis.com/protobuf_unittest.OneString] <\n'
-            '    data: "string"\n'
-            '  >\n'
-            '}\n')
-    text_format.Merge(text, message)
-    packed_message = unittest_pb2.OneString()
-    message.any_value.Unpack(packed_message)
-    self.assertEqual('string', packed_message.data)
-
-  def testMergeAlternativeUrl(self):
-    message = any_test_pb2.TestAny()
-    text = ('any_value {\n'
-            '  [type.otherapi.com/protobuf_unittest.OneString] {\n'
-            '    data: "string"\n'
-            '  }\n'
-            '}\n')
-    text_format.Merge(text, message)
-    packed_message = unittest_pb2.OneString()
-    self.assertEqual('type.otherapi.com/protobuf_unittest.OneString',
-                     message.any_value.type_url)
-
-  def testMergeExpandedAnyDescriptorPoolMissingType(self):
-    message = any_test_pb2.TestAny()
-    text = ('any_value {\n'
-            '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-            '    data: "string"\n'
-            '  }\n'
-            '}\n')
-    with self.assertRaises(text_format.ParseError) as e:
-      empty_pool = descriptor_pool.DescriptorPool()
-      text_format.Merge(text, message, descriptor_pool=empty_pool)
-    self.assertEqual(
-        str(e.exception),
-        'Type protobuf_unittest.OneString not found in descriptor pool')
-
-  def testMergeUnexpandedAny(self):
-    text = ('any_value {\n'
-            '  type_url: "type.googleapis.com/protobuf_unittest.OneString"\n'
-            '  value: "\\n\\006string"\n'
-            '}\n')
-    message = any_test_pb2.TestAny()
-    text_format.Merge(text, message)
-    packed_message = unittest_pb2.OneString()
-    message.any_value.Unpack(packed_message)
-    self.assertEqual('string', packed_message.data)
-
-  def testMergeMissingAnyEndToken(self):
-    message = any_test_pb2.TestAny()
-    text = ('any_value {\n'
-            '  [type.googleapis.com/protobuf_unittest.OneString] {\n'
-            '    data: "string"\n')
-    with self.assertRaises(text_format.ParseError) as e:
-      text_format.Merge(text, message)
-    self.assertEqual(str(e.exception), '3:11 : Expected "}".')
-
-
 class TokenizerTest(unittest.TestCase):
 
   def testSimpleTokenCases(self):
@@ -1249,336 +1020,140 @@
             'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n'
             'ID9: 22 ID10: -111111111111111111 ID11: -22\n'
             'ID12: 2222222222222222222 ID13: 1.23456f ID14: 1.2e+2f '
-            'false_bool:  0 true_BOOL:t \n true_bool1:  1 false_BOOL1:f '
-            'False_bool: False True_bool: True X:iNf Y:-inF Z:nAN')
-    tokenizer = text_format.Tokenizer(text.splitlines())
-    methods = [(tokenizer.ConsumeIdentifier, 'identifier1'), ':',
+            'false_bool:  0 true_BOOL:t \n true_bool1:  1 false_BOOL1:f ')
+    tokenizer = text_format._Tokenizer(text.splitlines())
+    methods = [(tokenizer.ConsumeIdentifier, 'identifier1'),
+               ':',
                (tokenizer.ConsumeString, 'string1'),
-               (tokenizer.ConsumeIdentifier, 'identifier2'), ':',
-               (tokenizer.ConsumeInteger, 123),
-               (tokenizer.ConsumeIdentifier, 'identifier3'), ':',
+               (tokenizer.ConsumeIdentifier, 'identifier2'),
+               ':',
+               (tokenizer.ConsumeInt32, 123),
+               (tokenizer.ConsumeIdentifier, 'identifier3'),
+               ':',
                (tokenizer.ConsumeString, 'string'),
-               (tokenizer.ConsumeIdentifier, 'identifiER_4'), ':',
+               (tokenizer.ConsumeIdentifier, 'identifiER_4'),
+               ':',
                (tokenizer.ConsumeFloat, 1.1e+2),
-               (tokenizer.ConsumeIdentifier, 'ID5'), ':',
+               (tokenizer.ConsumeIdentifier, 'ID5'),
+               ':',
                (tokenizer.ConsumeFloat, -0.23),
-               (tokenizer.ConsumeIdentifier, 'ID6'), ':',
+               (tokenizer.ConsumeIdentifier, 'ID6'),
+               ':',
                (tokenizer.ConsumeString, 'aaaa\'bbbb'),
-               (tokenizer.ConsumeIdentifier, 'ID7'), ':',
+               (tokenizer.ConsumeIdentifier, 'ID7'),
+               ':',
                (tokenizer.ConsumeString, 'aa\"bb'),
-               (tokenizer.ConsumeIdentifier, 'ID8'), ':', '{',
-               (tokenizer.ConsumeIdentifier, 'A'), ':',
+               (tokenizer.ConsumeIdentifier, 'ID8'),
+               ':',
+               '{',
+               (tokenizer.ConsumeIdentifier, 'A'),
+               ':',
                (tokenizer.ConsumeFloat, float('inf')),
-               (tokenizer.ConsumeIdentifier, 'B'), ':',
+               (tokenizer.ConsumeIdentifier, 'B'),
+               ':',
                (tokenizer.ConsumeFloat, -float('inf')),
-               (tokenizer.ConsumeIdentifier, 'C'), ':',
+               (tokenizer.ConsumeIdentifier, 'C'),
+               ':',
                (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'D'), ':',
-               (tokenizer.ConsumeBool, False), '}',
-               (tokenizer.ConsumeIdentifier, 'ID9'), ':',
-               (tokenizer.ConsumeInteger, 22),
-               (tokenizer.ConsumeIdentifier, 'ID10'), ':',
-               (tokenizer.ConsumeInteger, -111111111111111111),
-               (tokenizer.ConsumeIdentifier, 'ID11'), ':',
-               (tokenizer.ConsumeInteger, -22),
-               (tokenizer.ConsumeIdentifier, 'ID12'), ':',
-               (tokenizer.ConsumeInteger, 2222222222222222222),
-               (tokenizer.ConsumeIdentifier, 'ID13'), ':',
+               (tokenizer.ConsumeIdentifier, 'D'),
+               ':',
+               (tokenizer.ConsumeBool, False),
+               '}',
+               (tokenizer.ConsumeIdentifier, 'ID9'),
+               ':',
+               (tokenizer.ConsumeUint32, 22),
+               (tokenizer.ConsumeIdentifier, 'ID10'),
+               ':',
+               (tokenizer.ConsumeInt64, -111111111111111111),
+               (tokenizer.ConsumeIdentifier, 'ID11'),
+               ':',
+               (tokenizer.ConsumeInt32, -22),
+               (tokenizer.ConsumeIdentifier, 'ID12'),
+               ':',
+               (tokenizer.ConsumeUint64, 2222222222222222222),
+               (tokenizer.ConsumeIdentifier, 'ID13'),
+               ':',
                (tokenizer.ConsumeFloat, 1.23456),
-               (tokenizer.ConsumeIdentifier, 'ID14'), ':',
+               (tokenizer.ConsumeIdentifier, 'ID14'),
+               ':',
                (tokenizer.ConsumeFloat, 1.2e+2),
-               (tokenizer.ConsumeIdentifier, 'false_bool'), ':',
+               (tokenizer.ConsumeIdentifier, 'false_bool'),
+               ':',
                (tokenizer.ConsumeBool, False),
-               (tokenizer.ConsumeIdentifier, 'true_BOOL'), ':',
+               (tokenizer.ConsumeIdentifier, 'true_BOOL'),
+               ':',
                (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'true_bool1'), ':',
+               (tokenizer.ConsumeIdentifier, 'true_bool1'),
+               ':',
                (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'false_BOOL1'), ':',
-               (tokenizer.ConsumeBool, False),
-               (tokenizer.ConsumeIdentifier, 'False_bool'), ':',
-               (tokenizer.ConsumeBool, False),
-               (tokenizer.ConsumeIdentifier, 'True_bool'), ':',
-               (tokenizer.ConsumeBool, True),
-               (tokenizer.ConsumeIdentifier, 'X'), ':',
-               (tokenizer.ConsumeFloat, float('inf')),
-               (tokenizer.ConsumeIdentifier, 'Y'), ':',
-               (tokenizer.ConsumeFloat, float('-inf')),
-               (tokenizer.ConsumeIdentifier, 'Z'), ':',
-               (tokenizer.ConsumeFloat, float('nan'))]
+               (tokenizer.ConsumeIdentifier, 'false_BOOL1'),
+               ':',
+               (tokenizer.ConsumeBool, False)]
 
     i = 0
     while not tokenizer.AtEnd():
       m = methods[i]
-      if isinstance(m, str):
+      if type(m) == str:
         token = tokenizer.token
         self.assertEqual(token, m)
         tokenizer.NextToken()
-      elif isinstance(m[1], float) and math.isnan(m[1]):
-        self.assertTrue(math.isnan(m[0]()))
       else:
         self.assertEqual(m[1], m[0]())
       i += 1
 
-  def testConsumeAbstractIntegers(self):
-    # This test only tests the failures in the integer parsing methods as well
-    # as the '0' special cases.
-    int64_max = (1 << 63) - 1
-    uint32_max = (1 << 32) - 1
-    text = '-1 %d %d' % (uint32_max + 1, int64_max + 1)
-    tokenizer = text_format.Tokenizer(text.splitlines())
-    self.assertEqual(-1, tokenizer.ConsumeInteger())
-
-    self.assertEqual(uint32_max + 1, tokenizer.ConsumeInteger())
-
-    self.assertEqual(int64_max + 1, tokenizer.ConsumeInteger())
-    self.assertTrue(tokenizer.AtEnd())
-
-    text = '-0 0 0 1.2'
-    tokenizer = text_format.Tokenizer(text.splitlines())
-    self.assertEqual(0, tokenizer.ConsumeInteger())
-    self.assertEqual(0, tokenizer.ConsumeInteger())
-    self.assertEqual(True, tokenizer.TryConsumeInteger())
-    self.assertEqual(False, tokenizer.TryConsumeInteger())
-    with self.assertRaises(text_format.ParseError):
-      tokenizer.ConsumeInteger()
-    self.assertEqual(1.2, tokenizer.ConsumeFloat())
-    self.assertTrue(tokenizer.AtEnd())
-
   def testConsumeIntegers(self):
     # This test only tests the failures in the integer parsing methods as well
     # as the '0' special cases.
     int64_max = (1 << 63) - 1
     uint32_max = (1 << 32) - 1
     text = '-1 %d %d' % (uint32_max + 1, int64_max + 1)
-    tokenizer = text_format.Tokenizer(text.splitlines())
-    self.assertRaises(text_format.ParseError,
-                      text_format._ConsumeUint32, tokenizer)
-    self.assertRaises(text_format.ParseError,
-                      text_format._ConsumeUint64, tokenizer)
-    self.assertEqual(-1, text_format._ConsumeInt32(tokenizer))
+    tokenizer = text_format._Tokenizer(text.splitlines())
+    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)
+    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64)
+    self.assertEqual(-1, tokenizer.ConsumeInt32())
 
-    self.assertRaises(text_format.ParseError,
-                      text_format._ConsumeUint32, tokenizer)
-    self.assertRaises(text_format.ParseError,
-                      text_format._ConsumeInt32, tokenizer)
-    self.assertEqual(uint32_max + 1, text_format._ConsumeInt64(tokenizer))
+    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)
+    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32)
+    self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64())
 
-    self.assertRaises(text_format.ParseError,
-                      text_format._ConsumeInt64, tokenizer)
-    self.assertEqual(int64_max + 1, text_format._ConsumeUint64(tokenizer))
+    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64)
+    self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64())
     self.assertTrue(tokenizer.AtEnd())
 
     text = '-0 -0 0 0'
-    tokenizer = text_format.Tokenizer(text.splitlines())
-    self.assertEqual(0, text_format._ConsumeUint32(tokenizer))
-    self.assertEqual(0, text_format._ConsumeUint64(tokenizer))
-    self.assertEqual(0, text_format._ConsumeUint32(tokenizer))
-    self.assertEqual(0, text_format._ConsumeUint64(tokenizer))
+    tokenizer = text_format._Tokenizer(text.splitlines())
+    self.assertEqual(0, tokenizer.ConsumeUint32())
+    self.assertEqual(0, tokenizer.ConsumeUint64())
+    self.assertEqual(0, tokenizer.ConsumeUint32())
+    self.assertEqual(0, tokenizer.ConsumeUint64())
     self.assertTrue(tokenizer.AtEnd())
 
   def testConsumeByteString(self):
     text = '"string1\''
-    tokenizer = text_format.Tokenizer(text.splitlines())
+    tokenizer = text_format._Tokenizer(text.splitlines())
     self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
 
     text = 'string1"'
-    tokenizer = text_format.Tokenizer(text.splitlines())
+    tokenizer = text_format._Tokenizer(text.splitlines())
     self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
 
     text = '\n"\\xt"'
-    tokenizer = text_format.Tokenizer(text.splitlines())
+    tokenizer = text_format._Tokenizer(text.splitlines())
     self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
 
     text = '\n"\\"'
-    tokenizer = text_format.Tokenizer(text.splitlines())
+    tokenizer = text_format._Tokenizer(text.splitlines())
     self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
 
     text = '\n"\\x"'
-    tokenizer = text_format.Tokenizer(text.splitlines())
+    tokenizer = text_format._Tokenizer(text.splitlines())
     self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)
 
   def testConsumeBool(self):
     text = 'not-a-bool'
-    tokenizer = text_format.Tokenizer(text.splitlines())
+    tokenizer = text_format._Tokenizer(text.splitlines())
     self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool)
 
-  def testSkipComment(self):
-    tokenizer = text_format.Tokenizer('# some comment'.splitlines())
-    self.assertTrue(tokenizer.AtEnd())
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeComment)
-
-  def testConsumeComment(self):
-    tokenizer = text_format.Tokenizer('# some comment'.splitlines(),
-                                      skip_comments=False)
-    self.assertFalse(tokenizer.AtEnd())
-    self.assertEqual('# some comment', tokenizer.ConsumeComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-  def testConsumeTwoComments(self):
-    text = '# some comment\n# another comment'
-    tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False)
-    self.assertEqual('# some comment', tokenizer.ConsumeComment())
-    self.assertFalse(tokenizer.AtEnd())
-    self.assertEqual('# another comment', tokenizer.ConsumeComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-  def testConsumeTrailingComment(self):
-    text = 'some_number: 4\n# some comment'
-    tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False)
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeComment)
-
-    self.assertEqual('some_number', tokenizer.ConsumeIdentifier())
-    self.assertEqual(tokenizer.token, ':')
-    tokenizer.NextToken()
-    self.assertRaises(text_format.ParseError, tokenizer.ConsumeComment)
-    self.assertEqual(4, tokenizer.ConsumeInteger())
-    self.assertFalse(tokenizer.AtEnd())
-
-    self.assertEqual('# some comment', tokenizer.ConsumeComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-  def testConsumeLineComment(self):
-    tokenizer = text_format.Tokenizer('# some comment'.splitlines(),
-                                      skip_comments=False)
-    self.assertFalse(tokenizer.AtEnd())
-    self.assertEqual((False, '# some comment'),
-                     tokenizer.ConsumeCommentOrTrailingComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-  def testConsumeTwoLineComments(self):
-    text = '# some comment\n# another comment'
-    tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False)
-    self.assertEqual((False, '# some comment'),
-                     tokenizer.ConsumeCommentOrTrailingComment())
-    self.assertFalse(tokenizer.AtEnd())
-    self.assertEqual((False, '# another comment'),
-                     tokenizer.ConsumeCommentOrTrailingComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-  def testConsumeAndCheckTrailingComment(self):
-    text = 'some_number: 4  # some comment'  # trailing comment on the same line
-    tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False)
-    self.assertRaises(text_format.ParseError,
-                      tokenizer.ConsumeCommentOrTrailingComment)
-
-    self.assertEqual('some_number', tokenizer.ConsumeIdentifier())
-    self.assertEqual(tokenizer.token, ':')
-    tokenizer.NextToken()
-    self.assertRaises(text_format.ParseError,
-                      tokenizer.ConsumeCommentOrTrailingComment)
-    self.assertEqual(4, tokenizer.ConsumeInteger())
-    self.assertFalse(tokenizer.AtEnd())
-
-    self.assertEqual((True, '# some comment'),
-                     tokenizer.ConsumeCommentOrTrailingComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-  def testHashinComment(self):
-    text = 'some_number: 4  # some comment # not a new comment'
-    tokenizer = text_format.Tokenizer(text.splitlines(), skip_comments=False)
-    self.assertEqual('some_number', tokenizer.ConsumeIdentifier())
-    self.assertEqual(tokenizer.token, ':')
-    tokenizer.NextToken()
-    self.assertEqual(4, tokenizer.ConsumeInteger())
-    self.assertEqual((True, '# some comment # not a new comment'),
-                     tokenizer.ConsumeCommentOrTrailingComment())
-    self.assertTrue(tokenizer.AtEnd())
-
-
-# Tests for pretty printer functionality.
-@_parameterized.Parameters((unittest_pb2), (unittest_proto3_arena_pb2))
-class PrettyPrinterTest(TextFormatBase):
-
-  def testPrettyPrintNoMatch(self, message_module):
-
-    def printer(message, indent, as_one_line):
-      del message, indent, as_one_line
-      return None
-
-    message = message_module.TestAllTypes()
-    msg = message.repeated_nested_message.add()
-    msg.bb = 42
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=True, message_formatter=printer),
-        'repeated_nested_message { bb: 42 }')
-
-  def testPrettyPrintOneLine(self, message_module):
-
-    def printer(m, indent, as_one_line):
-      del indent, as_one_line
-      if m.DESCRIPTOR == message_module.TestAllTypes.NestedMessage.DESCRIPTOR:
-        return 'My lucky number is %s' % m.bb
-
-    message = message_module.TestAllTypes()
-    msg = message.repeated_nested_message.add()
-    msg.bb = 42
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=True, message_formatter=printer),
-        'repeated_nested_message { My lucky number is 42 }')
-
-  def testPrettyPrintMultiLine(self, message_module):
-
-    def printer(m, indent, as_one_line):
-      if m.DESCRIPTOR == message_module.TestAllTypes.NestedMessage.DESCRIPTOR:
-        line_deliminator = (' ' if as_one_line else '\n') + ' ' * indent
-        return 'My lucky number is:%s%s' % (line_deliminator, m.bb)
-      return None
-
-    message = message_module.TestAllTypes()
-    msg = message.repeated_nested_message.add()
-    msg.bb = 42
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=True, message_formatter=printer),
-        'repeated_nested_message { My lucky number is: 42 }')
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=False, message_formatter=printer),
-        'repeated_nested_message {\n  My lucky number is:\n  42\n}\n')
-
-  def testPrettyPrintEntireMessage(self, message_module):
-
-    def printer(m, indent, as_one_line):
-      del indent, as_one_line
-      if m.DESCRIPTOR == message_module.TestAllTypes.DESCRIPTOR:
-        return 'The is the message!'
-      return None
-
-    message = message_module.TestAllTypes()
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=False, message_formatter=printer),
-        'The is the message!\n')
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=True, message_formatter=printer),
-        'The is the message!')
-
-  def testPrettyPrintMultipleParts(self, message_module):
-
-    def printer(m, indent, as_one_line):
-      del indent, as_one_line
-      if m.DESCRIPTOR == message_module.TestAllTypes.NestedMessage.DESCRIPTOR:
-        return 'My lucky number is %s' % m.bb
-      return None
-
-    message = message_module.TestAllTypes()
-    message.optional_int32 = 61
-    msg = message.repeated_nested_message.add()
-    msg.bb = 42
-    msg = message.repeated_nested_message.add()
-    msg.bb = 99
-    msg = message.optional_nested_message
-    msg.bb = 1
-    self.CompareToGoldenText(
-        text_format.MessageToString(
-            message, as_one_line=True, message_formatter=printer),
-        ('optional_int32: 61 '
-         'optional_nested_message { My lucky number is 1 } '
-         'repeated_nested_message { My lucky number is 42 } '
-         'repeated_nested_message { My lucky number is 99 }'))
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/python/google/protobuf/internal/type_checkers.py b/python/google/protobuf/internal/type_checkers.py
index 4a76cd4..1be3ad9 100755
--- a/python/google/protobuf/internal/type_checkers.py
+++ b/python/google/protobuf/internal/type_checkers.py
@@ -45,7 +45,6 @@
 
 __author__ = 'robinson@google.com (Will Robinson)'
 
-import numbers
 import six
 
 if six.PY3:
@@ -127,11 +126,11 @@
   """Checker used for integer fields.  Performs type-check and range check."""
 
   def CheckValue(self, proposed_value):
-    if not isinstance(proposed_value, numbers.Integral):
+    if not isinstance(proposed_value, six.integer_types):
       message = ('%.1024r has type %s, but expected one of: %s' %
                  (proposed_value, type(proposed_value), six.integer_types))
       raise TypeError(message)
-    if not self._MIN <= int(proposed_value) <= self._MAX:
+    if not self._MIN <= proposed_value <= self._MAX:
       raise ValueError('Value out of range: %d' % proposed_value)
     # We force 32-bit values to int and 64-bit values to long to make
     # alternate implementations where the distinction is more significant
@@ -151,11 +150,11 @@
     self._enum_type = enum_type
 
   def CheckValue(self, proposed_value):
-    if not isinstance(proposed_value, numbers.Integral):
+    if not isinstance(proposed_value, six.integer_types):
       message = ('%.1024r has type %s, but expected one of: %s' %
                  (proposed_value, type(proposed_value), six.integer_types))
       raise TypeError(message)
-    if int(proposed_value) not in self._enum_type.values_by_number:
+    if proposed_value not in self._enum_type.values_by_number:
       raise ValueError('Unknown enum value: %d' % proposed_value)
     return proposed_value
 
@@ -224,11 +223,11 @@
     _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(),
     _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(),
     _FieldDescriptor.CPPTYPE_DOUBLE: TypeCheckerWithDefault(
-        0.0, numbers.Real),
+        0.0, float, int, long),
     _FieldDescriptor.CPPTYPE_FLOAT: TypeCheckerWithDefault(
-        0.0, numbers.Real),
+        0.0, float, int, long),
     _FieldDescriptor.CPPTYPE_BOOL: TypeCheckerWithDefault(
-        False, bool, numbers.Integral),
+        False, bool, int),
     _FieldDescriptor.CPPTYPE_STRING: TypeCheckerWithDefault(b'', bytes),
     }
 
diff --git a/python/google/protobuf/internal/unknown_fields_test.py b/python/google/protobuf/internal/unknown_fields_test.py
index 8b7de2e..84073f1 100755
--- a/python/google/protobuf/internal/unknown_fields_test.py
+++ b/python/google/protobuf/internal/unknown_fields_test.py
@@ -47,23 +47,16 @@
 from google.protobuf.internal import message_set_extensions_pb2
 from google.protobuf.internal import missing_enum_values_pb2
 from google.protobuf.internal import test_util
-from google.protobuf.internal import testing_refleaks
 from google.protobuf.internal import type_checkers
 
 
-BaseTestCase = testing_refleaks.BaseTestCase
-
-
-# CheckUnknownField() cannot be used by the C++ implementation because
-# some protect members are called. It is not a behavior difference
-# for python and C++ implementation.
-def SkipCheckUnknownFieldIfCppImplementation(func):
+def SkipIfCppImplementation(func):
   return unittest.skipIf(
       api_implementation.Type() == 'cpp' and api_implementation.Version() == 2,
-      'Addtional test for pure python involved protect members')(func)
+      'C++ implementation does not expose unknown fields to Python')(func)
 
 
-class UnknownFieldsTest(BaseTestCase):
+class UnknownFieldsTest(unittest.TestCase):
 
   def setUp(self):
     self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
@@ -80,23 +73,11 @@
     # stdout.
     self.assertTrue(data == self.all_fields_data)
 
-  def expectSerializeProto3(self, preserve):
+  def testSerializeProto3(self):
+    # Verify that proto3 doesn't preserve unknown fields.
     message = unittest_proto3_arena_pb2.TestEmptyMessage()
     message.ParseFromString(self.all_fields_data)
-    if preserve:
-      self.assertEqual(self.all_fields_data, message.SerializeToString())
-    else:
-      self.assertEqual(0, len(message.SerializeToString()))
-
-  def testSerializeProto3(self):
-    # Verify that proto3 unknown fields behavior.
-    default_preserve = (api_implementation
-                        .GetPythonProto3PreserveUnknownsDefault())
-    self.expectSerializeProto3(default_preserve)
-    api_implementation.SetPythonProto3PreserveUnknownsDefault(
-        not default_preserve)
-    self.expectSerializeProto3(not default_preserve)
-    api_implementation.SetPythonProto3PreserveUnknownsDefault(default_preserve)
+    self.assertEqual(0, len(message.SerializeToString()))
 
   def testByteSize(self):
     self.assertEqual(self.all_fields.ByteSize(), self.empty_message.ByteSize())
@@ -159,7 +140,7 @@
         b'', message.repeated_nested_message[0].SerializeToString())
 
 
-class UnknownFieldsAccessorsTest(BaseTestCase):
+class UnknownFieldsAccessorsTest(unittest.TestCase):
 
   def setUp(self):
     self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
@@ -168,51 +149,60 @@
     self.all_fields_data = self.all_fields.SerializeToString()
     self.empty_message = unittest_pb2.TestEmptyMessage()
     self.empty_message.ParseFromString(self.all_fields_data)
+    if api_implementation.Type() != 'cpp':
+      # _unknown_fields is an implementation detail.
+      self.unknown_fields = self.empty_message._unknown_fields
 
-  # CheckUnknownField() is an additional Pure Python check which checks
-  # a detail of unknown fields. It cannot be used by the C++
-  # implementation because some protect members are called.
-  # The test is added for historical reasons. It is not necessary as
-  # serialized string is checked.
+  # All the tests that use GetField() check an implementation detail of the
+  # Python implementation, which stores unknown fields as serialized strings.
+  # These tests are skipped by the C++ implementation: it's enough to check that
+  # the message is correctly serialized.
 
-  def CheckUnknownField(self, name, expected_value):
+  def GetField(self, name):
     field_descriptor = self.descriptor.fields_by_name[name]
     wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type]
     field_tag = encoder.TagBytes(field_descriptor.number, wire_type)
     result_dict = {}
-    for tag_bytes, value in self.empty_message._unknown_fields:
+    for tag_bytes, value in self.unknown_fields:
       if tag_bytes == field_tag:
         decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes][0]
         decoder(value, 0, len(value), self.all_fields, result_dict)
-    self.assertEqual(expected_value, result_dict[field_descriptor])
+    return result_dict[field_descriptor]
 
-  @SkipCheckUnknownFieldIfCppImplementation
-  def testCheckUnknownFieldValue(self):
-    # Test enum.
-    self.CheckUnknownField('optional_nested_enum',
-                           self.all_fields.optional_nested_enum)
-    # Test repeated enum.
-    self.CheckUnknownField('repeated_nested_enum',
-                           self.all_fields.repeated_nested_enum)
+  @SkipIfCppImplementation
+  def testEnum(self):
+    value = self.GetField('optional_nested_enum')
+    self.assertEqual(self.all_fields.optional_nested_enum, value)
 
-    # Test varint.
-    self.CheckUnknownField('optional_int32',
-                           self.all_fields.optional_int32)
-    # Test fixed32.
-    self.CheckUnknownField('optional_fixed32',
-                           self.all_fields.optional_fixed32)
+  @SkipIfCppImplementation
+  def testRepeatedEnum(self):
+    value = self.GetField('repeated_nested_enum')
+    self.assertEqual(self.all_fields.repeated_nested_enum, value)
 
-    # Test fixed64.
-    self.CheckUnknownField('optional_fixed64',
-                           self.all_fields.optional_fixed64)
+  @SkipIfCppImplementation
+  def testVarint(self):
+    value = self.GetField('optional_int32')
+    self.assertEqual(self.all_fields.optional_int32, value)
 
-    # Test lengthd elimited.
-    self.CheckUnknownField('optional_string',
-                           self.all_fields.optional_string)
+  @SkipIfCppImplementation
+  def testFixed32(self):
+    value = self.GetField('optional_fixed32')
+    self.assertEqual(self.all_fields.optional_fixed32, value)
 
-    # Test group.
-    self.CheckUnknownField('optionalgroup',
-                           self.all_fields.optionalgroup)
+  @SkipIfCppImplementation
+  def testFixed64(self):
+    value = self.GetField('optional_fixed64')
+    self.assertEqual(self.all_fields.optional_fixed64, value)
+
+  @SkipIfCppImplementation
+  def testLengthDelimited(self):
+    value = self.GetField('optional_string')
+    self.assertEqual(self.all_fields.optional_string, value)
+
+  @SkipIfCppImplementation
+  def testGroup(self):
+    value = self.GetField('optionalgroup')
+    self.assertEqual(self.all_fields.optionalgroup, value)
 
   def testCopyFrom(self):
     message = unittest_pb2.TestEmptyMessage()
@@ -251,44 +241,45 @@
     self.assertEqual(message.SerializeToString(), self.all_fields_data)
 
 
-class UnknownEnumValuesTest(BaseTestCase):
+class UnknownEnumValuesTest(unittest.TestCase):
 
   def setUp(self):
     self.descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR
 
     self.message = missing_enum_values_pb2.TestEnumValues()
-    # TestEnumValues.ZERO = 0, but does not exist in the other NestedEnum.
     self.message.optional_nested_enum = (
-        missing_enum_values_pb2.TestEnumValues.ZERO)
+      missing_enum_values_pb2.TestEnumValues.ZERO)
     self.message.repeated_nested_enum.extend([
-        missing_enum_values_pb2.TestEnumValues.ZERO,
-        missing_enum_values_pb2.TestEnumValues.ONE,
-        ])
+      missing_enum_values_pb2.TestEnumValues.ZERO,
+      missing_enum_values_pb2.TestEnumValues.ONE,
+      ])
     self.message.packed_nested_enum.extend([
-        missing_enum_values_pb2.TestEnumValues.ZERO,
-        missing_enum_values_pb2.TestEnumValues.ONE,
-        ])
+      missing_enum_values_pb2.TestEnumValues.ZERO,
+      missing_enum_values_pb2.TestEnumValues.ONE,
+      ])
     self.message_data = self.message.SerializeToString()
     self.missing_message = missing_enum_values_pb2.TestMissingEnumValues()
     self.missing_message.ParseFromString(self.message_data)
+    if api_implementation.Type() != 'cpp':
+      # _unknown_fields is an implementation detail.
+      self.unknown_fields = self.missing_message._unknown_fields
 
-  # CheckUnknownField() is an additional Pure Python check which checks
-  # a detail of unknown fields. It cannot be used by the C++
-  # implementation because some protect members are called.
-  # The test is added for historical reasons. It is not necessary as
-  # serialized string is checked.
+  # All the tests that use GetField() check an implementation detail of the
+  # Python implementation, which stores unknown fields as serialized strings.
+  # These tests are skipped by the C++ implementation: it's enough to check that
+  # the message is correctly serialized.
 
-  def CheckUnknownField(self, name, expected_value):
+  def GetField(self, name):
     field_descriptor = self.descriptor.fields_by_name[name]
     wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type]
     field_tag = encoder.TagBytes(field_descriptor.number, wire_type)
     result_dict = {}
-    for tag_bytes, value in self.missing_message._unknown_fields:
+    for tag_bytes, value in self.unknown_fields:
       if tag_bytes == field_tag:
         decoder = missing_enum_values_pb2.TestEnumValues._decoders_by_tag[
-            tag_bytes][0]
+          tag_bytes][0]
         decoder(value, 0, len(value), self.message, result_dict)
-    self.assertEqual(expected_value, result_dict[field_descriptor])
+    return result_dict[field_descriptor]
 
   def testUnknownParseMismatchEnumValue(self):
     just_string = missing_enum_values_pb2.JustString()
@@ -303,28 +294,21 @@
     # default value.
     self.assertEqual(missing.optional_nested_enum, 0)
 
+  @SkipIfCppImplementation
   def testUnknownEnumValue(self):
     self.assertFalse(self.missing_message.HasField('optional_nested_enum'))
-    self.assertEqual(self.missing_message.optional_nested_enum, 2)
-    # Clear does not do anything.
-    serialized = self.missing_message.SerializeToString()
-    self.missing_message.ClearField('optional_nested_enum')
-    self.assertEqual(self.missing_message.SerializeToString(), serialized)
+    value = self.GetField('optional_nested_enum')
+    self.assertEqual(self.message.optional_nested_enum, value)
 
+  @SkipIfCppImplementation
   def testUnknownRepeatedEnumValue(self):
-    self.assertEqual([], self.missing_message.repeated_nested_enum)
+    value = self.GetField('repeated_nested_enum')
+    self.assertEqual(self.message.repeated_nested_enum, value)
 
+  @SkipIfCppImplementation
   def testUnknownPackedEnumValue(self):
-    self.assertEqual([], self.missing_message.packed_nested_enum)
-
-  @SkipCheckUnknownFieldIfCppImplementation
-  def testCheckUnknownFieldValueForEnum(self):
-    self.CheckUnknownField('optional_nested_enum',
-                           self.message.optional_nested_enum)
-    self.CheckUnknownField('repeated_nested_enum',
-                           self.message.repeated_nested_enum)
-    self.CheckUnknownField('packed_nested_enum',
-                           self.message.packed_nested_enum)
+    value = self.GetField('packed_nested_enum')
+    self.assertEqual(self.message.packed_nested_enum, value)
 
   def testRoundTrip(self):
     new_message = missing_enum_values_pb2.TestEnumValues()
diff --git a/python/google/protobuf/internal/well_known_types.py b/python/google/protobuf/internal/well_known_types.py
index 3573770..7c5dffd 100644
--- a/python/google/protobuf/internal/well_known_types.py
+++ b/python/google/protobuf/internal/well_known_types.py
@@ -40,7 +40,6 @@
 
 __author__ = 'jieluo@google.com (Jie Luo)'
 
-import collections
 from datetime import datetime
 from datetime import timedelta
 import six
@@ -54,7 +53,6 @@
 _MILLIS_PER_SECOND = 1000
 _MICROS_PER_SECOND = 1000000
 _SECONDS_PER_DAY = 24 * 3600
-_DURATION_SECONDS_MAX = 315576000000
 
 
 class Error(Exception):
@@ -68,14 +66,13 @@
 class Any(object):
   """Class for Any Message type."""
 
-  def Pack(self, msg, type_url_prefix='type.googleapis.com/',
-           deterministic=None):
+  def Pack(self, msg, type_url_prefix='type.googleapis.com/'):
     """Packs the specified message into current Any message."""
     if len(type_url_prefix) < 1 or type_url_prefix[-1] != '/':
       self.type_url = '%s/%s' % (type_url_prefix, msg.DESCRIPTOR.full_name)
     else:
       self.type_url = '%s%s' % (type_url_prefix, msg.DESCRIPTOR.full_name)
-    self.value = msg.SerializeToString(deterministic=deterministic)
+    self.value = msg.SerializeToString()
 
   def Unpack(self, msg):
     """Unpacks the current Any message into specified message."""
@@ -250,7 +247,6 @@
       represent the exact Duration value. For example: "1s", "1.010s",
       "1.000000100s", "-3.100s"
     """
-    _CheckDurationValid(self.seconds, self.nanos)
     if self.seconds < 0 or self.nanos < 0:
       result = '-'
       seconds = - self.seconds + int((0 - self.nanos) // 1e9)
@@ -290,17 +286,14 @@
     try:
       pos = value.find('.')
       if pos == -1:
-        seconds = int(value[:-1])
-        nanos = 0
+        self.seconds = int(value[:-1])
+        self.nanos = 0
       else:
-        seconds = int(value[:pos])
+        self.seconds = int(value[:pos])
         if value[0] == '-':
-          nanos = int(round(float('-0{0}'.format(value[pos: -1])) *1e9))
+          self.nanos = int(round(float('-0{0}'.format(value[pos: -1])) *1e9))
         else:
-          nanos = int(round(float('0{0}'.format(value[pos: -1])) *1e9))
-      _CheckDurationValid(seconds, nanos)
-      self.seconds = seconds
-      self.nanos = nanos
+          self.nanos = int(round(float('0{0}'.format(value[pos: -1])) *1e9))
     except ValueError:
       raise ParseError(
           'Couldn\'t parse duration: {0}.'.format(value))
@@ -352,12 +345,12 @@
             self.nanos, _NANOS_PER_MICROSECOND))
 
   def FromTimedelta(self, td):
-    """Converts timedelta to Duration."""
+    """Convertd timedelta to Duration."""
     self._NormalizeDuration(td.seconds + td.days * _SECONDS_PER_DAY,
                             td.microseconds * _NANOS_PER_MICROSECOND)
 
   def _NormalizeDuration(self, seconds, nanos):
-    """Set Duration by seconds and nanos."""
+    """Set Duration by seconds and nonas."""
     # Force nanos to be negative if the duration is negative.
     if seconds < 0 and nanos > 0:
       seconds += 1
@@ -366,17 +359,6 @@
     self.nanos = nanos
 
 
-def _CheckDurationValid(seconds, nanos):
-  if seconds < -_DURATION_SECONDS_MAX or seconds > _DURATION_SECONDS_MAX:
-    raise Error(
-        'Duration is not valid: Seconds {0} must be in range '
-        '[-315576000000, 315576000000].'.format(seconds))
-  if nanos <= -_NANOS_PER_SECOND or nanos >= _NANOS_PER_SECOND:
-    raise Error(
-        'Duration is not valid: Nanos {0} must be in range '
-        '[-999999999, 999999999].'.format(nanos))
-
-
 def _RoundTowardZero(value, divider):
   """Truncates the remainder part after division."""
   # For some languanges, the sign of the remainder is implementation
@@ -397,16 +379,13 @@
 
   def ToJsonString(self):
     """Converts FieldMask to string according to proto3 JSON spec."""
-    camelcase_paths = []
-    for path in self.paths:
-      camelcase_paths.append(_SnakeCaseToCamelCase(path))
-    return ','.join(camelcase_paths)
+    return ','.join(self.paths)
 
   def FromJsonString(self, value):
     """Converts string to FieldMask according to proto3 JSON spec."""
     self.Clear()
     for path in value.split(','):
-      self.paths.append(_CamelCaseToSnakeCase(path))
+      self.paths.append(path)
 
   def IsValidForDescriptor(self, message_descriptor):
     """Checks whether the FieldMask is valid for Message Descriptor."""
@@ -475,7 +454,7 @@
   parts = path.split('.')
   last = parts.pop()
   for name in parts:
-    field = message_descriptor.fields_by_name.get(name)
+    field = message_descriptor.fields_by_name[name]
     if (field is None or
         field.label == FieldDescriptor.LABEL_REPEATED or
         field.type != FieldDescriptor.TYPE_MESSAGE):
@@ -493,48 +472,6 @@
         message_descriptor.full_name))
 
 
-def _SnakeCaseToCamelCase(path_name):
-  """Converts a path name from snake_case to camelCase."""
-  result = []
-  after_underscore = False
-  for c in path_name:
-    if c.isupper():
-      raise Error('Fail to print FieldMask to Json string: Path name '
-                  '{0} must not contain uppercase letters.'.format(path_name))
-    if after_underscore:
-      if c.islower():
-        result.append(c.upper())
-        after_underscore = False
-      else:
-        raise Error('Fail to print FieldMask to Json string: The '
-                    'character after a "_" must be a lowercase letter '
-                    'in path name {0}.'.format(path_name))
-    elif c == '_':
-      after_underscore = True
-    else:
-      result += c
-
-  if after_underscore:
-    raise Error('Fail to print FieldMask to Json string: Trailing "_" '
-                'in path name {0}.'.format(path_name))
-  return ''.join(result)
-
-
-def _CamelCaseToSnakeCase(path_name):
-  """Converts a field name from camelCase to snake_case."""
-  result = []
-  for c in path_name:
-    if c == '_':
-      raise ParseError('Fail to parse FieldMask: Path name '
-                       '{0} must not contain "_"s.'.format(path_name))
-    if c.isupper():
-      result += '_'
-      result += c.lower()
-    else:
-      result += c
-  return ''.join(result)
-
-
 class _FieldMaskTree(object):
   """Represents a FieldMask in a tree structure.
 
@@ -700,12 +637,6 @@
     struct_value.string_value = value
   elif isinstance(value, _INT_OR_FLOAT):
     struct_value.number_value = value
-  elif isinstance(value, dict):
-    struct_value.struct_value.Clear()
-    struct_value.struct_value.update(value)
-  elif isinstance(value, list):
-    struct_value.list_value.Clear()
-    struct_value.list_value.extend(value)
   else:
     raise ValueError('Unexpected type')
 
@@ -736,49 +667,18 @@
   def __getitem__(self, key):
     return _GetStructValue(self.fields[key])
 
-  def __contains__(self, item):
-    return item in self.fields
-
   def __setitem__(self, key, value):
     _SetStructValue(self.fields[key], value)
 
-  def __delitem__(self, key):
-    del self.fields[key]
-
-  def __len__(self):
-    return len(self.fields)
-
-  def __iter__(self):
-    return iter(self.fields)
-
-  def keys(self):  # pylint: disable=invalid-name
-    return self.fields.keys()
-
-  def values(self):  # pylint: disable=invalid-name
-    return [self[key] for key in self]
-
-  def items(self):  # pylint: disable=invalid-name
-    return [(key, self[key]) for key in self]
-
   def get_or_create_list(self, key):
     """Returns a list for this key, creating if it didn't exist already."""
-    if not self.fields[key].HasField('list_value'):
-      # Clear will mark list_value modified which will indeed create a list.
-      self.fields[key].list_value.Clear()
     return self.fields[key].list_value
 
   def get_or_create_struct(self, key):
     """Returns a struct for this key, creating if it didn't exist already."""
-    if not self.fields[key].HasField('struct_value'):
-      # Clear will mark struct_value modified which will indeed create a struct.
-      self.fields[key].struct_value.Clear()
     return self.fields[key].struct_value
 
-  def update(self, dictionary):  # pylint: disable=invalid-name
-    for key, value in dictionary.items():
-      _SetStructValue(self.fields[key], value)
-
-collections.MutableMapping.register(Struct)
+  # TODO(haberman): allow constructing/merging from dict.
 
 
 class ListValue(object):
@@ -801,28 +701,17 @@
   def __setitem__(self, index, value):
     _SetStructValue(self.values.__getitem__(index), value)
 
-  def __delitem__(self, key):
-    del self.values[key]
-
   def items(self):
     for i in range(len(self)):
       yield self[i]
 
   def add_struct(self):
     """Appends and returns a struct value as the next value in the list."""
-    struct_value = self.values.add().struct_value
-    # Clear will mark struct_value modified which will indeed create a struct.
-    struct_value.Clear()
-    return struct_value
+    return self.values.add().struct_value
 
   def add_list(self):
     """Appends and returns a list value as the next value in the list."""
-    list_value = self.values.add().list_value
-    # Clear will mark list_value modified which will indeed create a list.
-    list_value.Clear()
-    return list_value
-
-collections.MutableSequence.register(ListValue)
+    return self.values.add().list_value
 
 
 WKTBASES = {
diff --git a/python/google/protobuf/internal/well_known_types_test.py b/python/google/protobuf/internal/well_known_types_test.py
index 291fe4e..2f32ac9 100644
--- a/python/google/protobuf/internal/well_known_types_test.py
+++ b/python/google/protobuf/internal/well_known_types_test.py
@@ -34,7 +34,6 @@
 
 __author__ = 'jieluo@google.com (Jie Luo)'
 
-import collections
 from datetime import datetime
 
 try:
@@ -106,10 +105,6 @@
     self.assertEqual(8 * 3600, message.seconds)
     self.assertEqual(0, message.nanos)
 
-    # It is not easy to check with current time. For test coverage only.
-    message.GetCurrentTime()
-    self.assertNotEqual(8 * 3600, message.seconds)
-
   def testDurationSerializeAndParse(self):
     message = duration_pb2.Duration()
     # Generated output should contain 3, 6, or 9 fractional digits.
@@ -273,17 +268,6 @@
   def testInvalidTimestamp(self):
     message = timestamp_pb2.Timestamp()
     self.assertRaisesRegexp(
-        well_known_types.ParseError,
-        'Failed to parse timestamp: missing valid timezone offset.',
-        message.FromJsonString,
-        '')
-    self.assertRaisesRegexp(
-        well_known_types.ParseError,
-        'Failed to parse timestamp: invalid trailing data '
-        '1970-01-01T00:00:01Ztrail.',
-        message.FromJsonString,
-        '1970-01-01T00:00:01Ztrail')
-    self.assertRaisesRegexp(
         ValueError,
         'time data \'10000-01-01T00:00:00\' does not match'
         ' format \'%Y-%m-%dT%H:%M:%S\'',
@@ -300,7 +284,7 @@
         '1972-01-01T01:00:00.01+08',)
     self.assertRaisesRegexp(
         ValueError,
-        'year (0 )?is out of range',
+        'year is out of range',
         message.FromJsonString,
         '0000-01-01T00:00:00Z')
     message.seconds = 253402300800
@@ -319,32 +303,6 @@
         well_known_types.ParseError,
         'Couldn\'t parse duration: 1...2s.',
         message.FromJsonString, '1...2s')
-    text = '-315576000001.000000000s'
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        r'Duration is not valid\: Seconds -315576000001 must be in range'
-        r' \[-315576000000\, 315576000000\].',
-        message.FromJsonString, text)
-    text = '315576000001.000000000s'
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        r'Duration is not valid\: Seconds 315576000001 must be in range'
-        r' \[-315576000000\, 315576000000\].',
-        message.FromJsonString, text)
-    message.seconds = -315576000001
-    message.nanos = 0
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        r'Duration is not valid\: Seconds -315576000001 must be in range'
-        r' \[-315576000000\, 315576000000\].',
-        message.ToJsonString)
-    message.seconds = 0
-    message.nanos = 999999999 + 1
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        r'Duration is not valid\: Nanos 1000000000 must be in range'
-        r' \[-999999999\, 999999999\].',
-        message.ToJsonString)
 
 
 class FieldMaskTest(unittest.TestCase):
@@ -364,20 +322,6 @@
     mask.FromJsonString('foo,bar')
     self.assertEqual(['foo', 'bar'], mask.paths)
 
-    # Test camel case
-    mask.Clear()
-    mask.paths.append('foo_bar')
-    self.assertEqual('fooBar', mask.ToJsonString())
-    mask.paths.append('bar_quz')
-    self.assertEqual('fooBar,barQuz', mask.ToJsonString())
-
-    mask.FromJsonString('')
-    self.assertEqual('', mask.ToJsonString())
-    mask.FromJsonString('fooBar')
-    self.assertEqual(['foo_bar'], mask.paths)
-    mask.FromJsonString('fooBar,barQuz')
-    self.assertEqual(['foo_bar', 'bar_quz'], mask.paths)
-
   def testDescriptorToFieldMask(self):
     mask = field_mask_pb2.FieldMask()
     msg_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
@@ -386,37 +330,10 @@
     self.assertTrue(mask.IsValidForDescriptor(msg_descriptor))
     for field in msg_descriptor.fields:
       self.assertTrue(field.name in mask.paths)
-
-  def testIsValidForDescriptor(self):
-    msg_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
-    # Empty mask
-    mask = field_mask_pb2.FieldMask()
-    self.assertTrue(mask.IsValidForDescriptor(msg_descriptor))
-    # All fields from descriptor
-    mask.AllFieldsFromDescriptor(msg_descriptor)
-    self.assertTrue(mask.IsValidForDescriptor(msg_descriptor))
-    # Child under optional message
     mask.paths.append('optional_nested_message.bb')
     self.assertTrue(mask.IsValidForDescriptor(msg_descriptor))
-    # Repeated field is only allowed in the last position of path
     mask.paths.append('repeated_nested_message.bb')
     self.assertFalse(mask.IsValidForDescriptor(msg_descriptor))
-    # Invalid top level field
-    mask = field_mask_pb2.FieldMask()
-    mask.paths.append('xxx')
-    self.assertFalse(mask.IsValidForDescriptor(msg_descriptor))
-    # Invalid field in root
-    mask = field_mask_pb2.FieldMask()
-    mask.paths.append('xxx.zzz')
-    self.assertFalse(mask.IsValidForDescriptor(msg_descriptor))
-    # Invalid field in internal node
-    mask = field_mask_pb2.FieldMask()
-    mask.paths.append('optional_nested_message.xxx.zzz')
-    self.assertFalse(mask.IsValidForDescriptor(msg_descriptor))
-    # Invalid field in leaf
-    mask = field_mask_pb2.FieldMask()
-    mask.paths.append('optional_nested_message.xxx')
-    self.assertFalse(mask.IsValidForDescriptor(msg_descriptor))
 
   def testCanonicalFrom(self):
     mask = field_mask_pb2.FieldMask()
@@ -472,9 +389,6 @@
     mask2.FromJsonString('foo.bar,bar')
     out_mask.Union(mask1, mask2)
     self.assertEqual('bar,foo.bar,quz', out_mask.ToJsonString())
-    src = unittest_pb2.TestAllTypes()
-    with self.assertRaises(ValueError):
-      out_mask.Union(src, mask2)
 
   def testIntersect(self):
     mask1 = field_mask_pb2.FieldMask()
@@ -588,88 +502,22 @@
     nested_src.payload.repeated_int32.append(1234)
     nested_dst.payload.repeated_int32.append(5678)
     # Repeated fields will be appended by default.
-    mask.FromJsonString('payload.repeatedInt32')
+    mask.FromJsonString('payload.repeated_int32')
     mask.MergeMessage(nested_src, nested_dst)
     self.assertEqual(2, len(nested_dst.payload.repeated_int32))
     self.assertEqual(5678, nested_dst.payload.repeated_int32[0])
     self.assertEqual(1234, nested_dst.payload.repeated_int32[1])
     # Change the behavior to replace repeated fields.
-    mask.FromJsonString('payload.repeatedInt32')
+    mask.FromJsonString('payload.repeated_int32')
     mask.MergeMessage(nested_src, nested_dst, False, True)
     self.assertEqual(1, len(nested_dst.payload.repeated_int32))
     self.assertEqual(1234, nested_dst.payload.repeated_int32[0])
 
-  def testMergeErrors(self):
-    src = unittest_pb2.TestAllTypes()
-    dst = unittest_pb2.TestAllTypes()
-    mask = field_mask_pb2.FieldMask()
-    test_util.SetAllFields(src)
-    mask.FromJsonString('optionalInt32.field')
-    with self.assertRaises(ValueError) as e:
-      mask.MergeMessage(src, dst)
-    self.assertEqual('Error: Field optional_int32 in message '
-                     'protobuf_unittest.TestAllTypes is not a singular '
-                     'message field and cannot have sub-fields.',
-                     str(e.exception))
-
-  def testSnakeCaseToCamelCase(self):
-    self.assertEqual('fooBar',
-                     well_known_types._SnakeCaseToCamelCase('foo_bar'))
-    self.assertEqual('FooBar',
-                     well_known_types._SnakeCaseToCamelCase('_foo_bar'))
-    self.assertEqual('foo3Bar',
-                     well_known_types._SnakeCaseToCamelCase('foo3_bar'))
-
-    # No uppercase letter is allowed.
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        'Fail to print FieldMask to Json string: Path name Foo must '
-        'not contain uppercase letters.',
-        well_known_types._SnakeCaseToCamelCase,
-        'Foo')
-    # Any character after a "_" must be a lowercase letter.
-    #   1. "_" cannot be followed by another "_".
-    #   2. "_" cannot be followed by a digit.
-    #   3. "_" cannot appear as the last character.
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        'Fail to print FieldMask to Json string: The character after a '
-        '"_" must be a lowercase letter in path name foo__bar.',
-        well_known_types._SnakeCaseToCamelCase,
-        'foo__bar')
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        'Fail to print FieldMask to Json string: The character after a '
-        '"_" must be a lowercase letter in path name foo_3bar.',
-        well_known_types._SnakeCaseToCamelCase,
-        'foo_3bar')
-    self.assertRaisesRegexp(
-        well_known_types.Error,
-        'Fail to print FieldMask to Json string: Trailing "_" in path '
-        'name foo_bar_.',
-        well_known_types._SnakeCaseToCamelCase,
-        'foo_bar_')
-
-  def testCamelCaseToSnakeCase(self):
-    self.assertEqual('foo_bar',
-                     well_known_types._CamelCaseToSnakeCase('fooBar'))
-    self.assertEqual('_foo_bar',
-                     well_known_types._CamelCaseToSnakeCase('FooBar'))
-    self.assertEqual('foo3_bar',
-                     well_known_types._CamelCaseToSnakeCase('foo3Bar'))
-    self.assertRaisesRegexp(
-        well_known_types.ParseError,
-        'Fail to parse FieldMask: Path name foo_bar must not contain "_"s.',
-        well_known_types._CamelCaseToSnakeCase,
-        'foo_bar')
-
 
 class StructTest(unittest.TestCase):
 
   def testStruct(self):
     struct = struct_pb2.Struct()
-    self.assertIsInstance(struct, collections.Mapping)
-    self.assertEqual(0, len(struct))
     struct_class = struct.__class__
 
     struct['key1'] = 5
@@ -677,157 +525,56 @@
     struct['key3'] = True
     struct.get_or_create_struct('key4')['subkey'] = 11.0
     struct_list = struct.get_or_create_list('key5')
-    self.assertIsInstance(struct_list, collections.Sequence)
     struct_list.extend([6, 'seven', True, False, None])
     struct_list.add_struct()['subkey2'] = 9
-    struct['key6'] = {'subkey': {}}
-    struct['key7'] = [2, False]
 
-    self.assertEqual(7, len(struct))
     self.assertTrue(isinstance(struct, well_known_types.Struct))
-    self.assertEqual(5, struct['key1'])
-    self.assertEqual('abc', struct['key2'])
+    self.assertEquals(5, struct['key1'])
+    self.assertEquals('abc', struct['key2'])
     self.assertIs(True, struct['key3'])
-    self.assertEqual(11, struct['key4']['subkey'])
+    self.assertEquals(11, struct['key4']['subkey'])
     inner_struct = struct_class()
     inner_struct['subkey2'] = 9
-    self.assertEqual([6, 'seven', True, False, None, inner_struct],
-                     list(struct['key5'].items()))
-    self.assertEqual({}, dict(struct['key6']['subkey'].fields))
-    self.assertEqual([2, False], list(struct['key7'].items()))
+    self.assertEquals([6, 'seven', True, False, None, inner_struct],
+                      list(struct['key5'].items()))
 
     serialized = struct.SerializeToString()
+
     struct2 = struct_pb2.Struct()
     struct2.ParseFromString(serialized)
 
-    self.assertEqual(struct, struct2)
-    for key, value in struct.items():
-      self.assertIn(key, struct)
-      self.assertIn(key, struct2)
-      self.assertEqual(value, struct2[key])
-
-    self.assertEqual(7, len(struct.keys()))
-    self.assertEqual(7, len(struct.values()))
-    for key in struct.keys():
-      self.assertIn(key, struct)
-      self.assertIn(key, struct2)
-      self.assertEqual(struct[key], struct2[key])
-
-    item = (next(iter(struct.keys())), next(iter(struct.values())))
-    self.assertEqual(item, next(iter(struct.items())))
+    self.assertEquals(struct, struct2)
 
     self.assertTrue(isinstance(struct2, well_known_types.Struct))
-    self.assertEqual(5, struct2['key1'])
-    self.assertEqual('abc', struct2['key2'])
+    self.assertEquals(5, struct2['key1'])
+    self.assertEquals('abc', struct2['key2'])
     self.assertIs(True, struct2['key3'])
-    self.assertEqual(11, struct2['key4']['subkey'])
-    self.assertEqual([6, 'seven', True, False, None, inner_struct],
-                     list(struct2['key5'].items()))
+    self.assertEquals(11, struct2['key4']['subkey'])
+    self.assertEquals([6, 'seven', True, False, None, inner_struct],
+                      list(struct2['key5'].items()))
 
     struct_list = struct2['key5']
-    self.assertEqual(6, struct_list[0])
-    self.assertEqual('seven', struct_list[1])
-    self.assertEqual(True, struct_list[2])
-    self.assertEqual(False, struct_list[3])
-    self.assertEqual(None, struct_list[4])
-    self.assertEqual(inner_struct, struct_list[5])
+    self.assertEquals(6, struct_list[0])
+    self.assertEquals('seven', struct_list[1])
+    self.assertEquals(True, struct_list[2])
+    self.assertEquals(False, struct_list[3])
+    self.assertEquals(None, struct_list[4])
+    self.assertEquals(inner_struct, struct_list[5])
 
     struct_list[1] = 7
-    self.assertEqual(7, struct_list[1])
+    self.assertEquals(7, struct_list[1])
 
     struct_list.add_list().extend([1, 'two', True, False, None])
-    self.assertEqual([1, 'two', True, False, None],
-                     list(struct_list[6].items()))
-    struct_list.extend([{'nested_struct': 30}, ['nested_list', 99], {}, []])
-    self.assertEqual(11, len(struct_list.values))
-    self.assertEqual(30, struct_list[7]['nested_struct'])
-    self.assertEqual('nested_list', struct_list[8][0])
-    self.assertEqual(99, struct_list[8][1])
-    self.assertEqual({}, dict(struct_list[9].fields))
-    self.assertEqual([], list(struct_list[10].items()))
-    struct_list[0] = {'replace': 'set'}
-    struct_list[1] = ['replace', 'set']
-    self.assertEqual('set', struct_list[0]['replace'])
-    self.assertEqual(['replace', 'set'], list(struct_list[1].items()))
+    self.assertEquals([1, 'two', True, False, None],
+                      list(struct_list[6].items()))
 
     text_serialized = str(struct)
     struct3 = struct_pb2.Struct()
     text_format.Merge(text_serialized, struct3)
-    self.assertEqual(struct, struct3)
+    self.assertEquals(struct, struct3)
 
     struct.get_or_create_struct('key3')['replace'] = 12
-    self.assertEqual(12, struct['key3']['replace'])
-
-    # Tests empty list.
-    struct.get_or_create_list('empty_list')
-    empty_list = struct['empty_list']
-    self.assertEqual([], list(empty_list.items()))
-    list2 = struct_pb2.ListValue()
-    list2.add_list()
-    empty_list = list2[0]
-    self.assertEqual([], list(empty_list.items()))
-
-    # Tests empty struct.
-    struct.get_or_create_struct('empty_struct')
-    empty_struct = struct['empty_struct']
-    self.assertEqual({}, dict(empty_struct.fields))
-    list2.add_struct()
-    empty_struct = list2[1]
-    self.assertEqual({}, dict(empty_struct.fields))
-
-    self.assertEqual(9, len(struct))
-    del struct['key3']
-    del struct['key4']
-    self.assertEqual(7, len(struct))
-    self.assertEqual(6, len(struct['key5']))
-    del struct['key5'][1]
-    self.assertEqual(5, len(struct['key5']))
-    self.assertEqual([6, True, False, None, inner_struct],
-                     list(struct['key5'].items()))
-
-  def testMergeFrom(self):
-    struct = struct_pb2.Struct()
-    struct_class = struct.__class__
-
-    dictionary = {
-        'key1': 5,
-        'key2': 'abc',
-        'key3': True,
-        'key4': {'subkey': 11.0},
-        'key5': [6, 'seven', True, False, None, {'subkey2': 9}],
-        'key6': [['nested_list', True]],
-        'empty_struct': {},
-        'empty_list': []
-    }
-    struct.update(dictionary)
-    self.assertEqual(5, struct['key1'])
-    self.assertEqual('abc', struct['key2'])
-    self.assertIs(True, struct['key3'])
-    self.assertEqual(11, struct['key4']['subkey'])
-    inner_struct = struct_class()
-    inner_struct['subkey2'] = 9
-    self.assertEqual([6, 'seven', True, False, None, inner_struct],
-                     list(struct['key5'].items()))
-    self.assertEqual(2, len(struct['key6'][0].values))
-    self.assertEqual('nested_list', struct['key6'][0][0])
-    self.assertEqual(True, struct['key6'][0][1])
-    empty_list = struct['empty_list']
-    self.assertEqual([], list(empty_list.items()))
-    empty_struct = struct['empty_struct']
-    self.assertEqual({}, dict(empty_struct.fields))
-
-    # According to documentation: "When parsing from the wire or when merging,
-    # if there are duplicate map keys the last key seen is used".
-    duplicate = {
-        'key4': {'replace': 20},
-        'key5': [[False, 5]]
-    }
-    struct.update(duplicate)
-    self.assertEqual(1, len(struct['key4'].fields))
-    self.assertEqual(20, struct['key4']['replace'])
-    self.assertEqual(1, len(struct['key5'].values))
-    self.assertEqual(False, struct['key5'][0][0])
-    self.assertEqual(5, struct['key5'][0][1])
+    self.assertEquals(12, struct['key3']['replace'])
 
 
 class AnyTest(unittest.TestCase):
@@ -892,20 +639,6 @@
     self.assertTrue(msg.Unpack(unpacked_message))
     self.assertEqual(submessage, unpacked_message)
 
-  def testPackDeterministic(self):
-    submessage = any_test_pb2.TestAny()
-    for i in range(10):
-      submessage.map_value[str(i)] = i * 2
-    msg = any_pb2.Any()
-    msg.Pack(submessage, deterministic=True)
-    serialized = msg.SerializeToString(deterministic=True)
-    golden = (b'\n4type.googleapis.com/google.protobuf.internal.TestAny\x12F'
-              b'\x1a\x05\n\x010\x10\x00\x1a\x05\n\x011\x10\x02\x1a\x05\n\x01'
-              b'2\x10\x04\x1a\x05\n\x013\x10\x06\x1a\x05\n\x014\x10\x08\x1a'
-              b'\x05\n\x015\x10\n\x1a\x05\n\x016\x10\x0c\x1a\x05\n\x017\x10'
-              b'\x0e\x1a\x05\n\x018\x10\x10\x1a\x05\n\x019\x10\x12')
-    self.assertEqual(golden, serialized)
-
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/python/google/protobuf/json_format.py b/python/google/protobuf/json_format.py
index 878291d..7921556 100644
--- a/python/google/protobuf/json_format.py
+++ b/python/google/protobuf/json_format.py
@@ -42,18 +42,12 @@
 
 __author__ = 'jieluo@google.com (Jie Luo)'
 
-try:
-  from collections import OrderedDict
-except ImportError:
-  from ordereddict import OrderedDict  #PY26
 import base64
 import json
 import math
-import re
 import six
 import sys
 
-from operator import methodcaller
 from google.protobuf import descriptor
 from google.protobuf import symbol_database
 
@@ -70,12 +64,6 @@
 _NEG_INFINITY = '-Infinity'
 _NAN = 'NaN'
 
-_UNPAIRED_SURROGATE_PATTERN = re.compile(six.u(
-    r'[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]'
-))
-
-_VALID_EXTENSION_NAME = re.compile(r'\[[a-zA-Z0-9\._]*\]$')
-
 
 class Error(Exception):
   """Top-level module error for json_format."""
@@ -89,11 +77,7 @@
   """Thrown in case of parsing error."""
 
 
-def MessageToJson(message,
-                  including_default_value_fields=False,
-                  preserving_proto_field_name=False,
-                  indent=2,
-                  sort_keys=False):
+def MessageToJson(message, including_default_value_fields=False):
   """Converts protobuf message to JSON format.
 
   Args:
@@ -102,45 +86,26 @@
         repeated fields, and map fields will always be serialized.  If
         False, only serialize non-empty fields.  Singular message fields
         and oneof fields are not affected by this option.
-    preserving_proto_field_name: If True, use the original proto field
-        names as defined in the .proto file. If False, convert the field
-        names to lowerCamelCase.
-    indent: The JSON object will be pretty-printed with this indent level.
-        An indent level of 0 or negative will only insert newlines.
-    sort_keys: If True, then the output will be sorted by field names.
 
   Returns:
     A string containing the JSON formatted protocol buffer message.
   """
-  printer = _Printer(including_default_value_fields,
-                     preserving_proto_field_name)
-  return printer.ToJsonString(message, indent, sort_keys)
+  js = _MessageToJsonObject(message, including_default_value_fields)
+  return json.dumps(js, indent=2)
 
 
-def MessageToDict(message,
-                  including_default_value_fields=False,
-                  preserving_proto_field_name=False):
-  """Converts protobuf message to a dictionary.
-
-  When the dictionary is encoded to JSON, it conforms to proto3 JSON spec.
-
-  Args:
-    message: The protocol buffers message instance to serialize.
-    including_default_value_fields: If True, singular primitive fields,
-        repeated fields, and map fields will always be serialized.  If
-        False, only serialize non-empty fields.  Singular message fields
-        and oneof fields are not affected by this option.
-    preserving_proto_field_name: If True, use the original proto field
-        names as defined in the .proto file. If False, convert the field
-        names to lowerCamelCase.
-
-  Returns:
-    A dict representation of the protocol buffer message.
-  """
-  printer = _Printer(including_default_value_fields,
-                     preserving_proto_field_name)
-  # pylint: disable=protected-access
-  return printer._MessageToJsonObject(message)
+def _MessageToJsonObject(message, including_default_value_fields):
+  """Converts message to an object according to Proto3 JSON Specification."""
+  message_descriptor = message.DESCRIPTOR
+  full_name = message_descriptor.full_name
+  if _IsWrapperMessage(message_descriptor):
+    return _WrapperMessageToJsonObject(message)
+  if full_name in _WKTJSONMETHODS:
+    return _WKTJSONMETHODS[full_name][0](
+        message, including_default_value_fields)
+  js = {}
+  return _RegularMessageToJsonObject(
+      message, js, including_default_value_fields)
 
 
 def _IsMapEntry(field):
@@ -149,204 +114,114 @@
           field.message_type.GetOptions().map_entry)
 
 
-class _Printer(object):
-  """JSON format printer for protocol message."""
+def _RegularMessageToJsonObject(message, js, including_default_value_fields):
+  """Converts normal message according to Proto3 JSON Specification."""
+  fields = message.ListFields()
+  include_default = including_default_value_fields
 
-  def __init__(self,
-               including_default_value_fields=False,
-               preserving_proto_field_name=False):
-    self.including_default_value_fields = including_default_value_fields
-    self.preserving_proto_field_name = preserving_proto_field_name
-
-  def ToJsonString(self, message, indent, sort_keys):
-    js = self._MessageToJsonObject(message)
-    return json.dumps(js, indent=indent, sort_keys=sort_keys)
-
-  def _MessageToJsonObject(self, message):
-    """Converts message to an object according to Proto3 JSON Specification."""
-    message_descriptor = message.DESCRIPTOR
-    full_name = message_descriptor.full_name
-    if _IsWrapperMessage(message_descriptor):
-      return self._WrapperMessageToJsonObject(message)
-    if full_name in _WKTJSONMETHODS:
-      return methodcaller(_WKTJSONMETHODS[full_name][0], message)(self)
-    js = {}
-    return self._RegularMessageToJsonObject(message, js)
-
-  def _RegularMessageToJsonObject(self, message, js):
-    """Converts normal message according to Proto3 JSON Specification."""
-    fields = message.ListFields()
-
-    try:
-      for field, value in fields:
-        if self.preserving_proto_field_name:
-          name = field.name
-        else:
-          name = field.json_name
-        if _IsMapEntry(field):
-          # Convert a map field.
-          v_field = field.message_type.fields_by_name['value']
-          js_map = {}
-          for key in value:
-            if isinstance(key, bool):
-              if key:
-                recorded_key = 'true'
-              else:
-                recorded_key = 'false'
+  try:
+    for field, value in fields:
+      name = field.camelcase_name
+      if _IsMapEntry(field):
+        # Convert a map field.
+        v_field = field.message_type.fields_by_name['value']
+        js_map = {}
+        for key in value:
+          if isinstance(key, bool):
+            if key:
+              recorded_key = 'true'
             else:
-              recorded_key = key
-            js_map[recorded_key] = self._FieldToJsonObject(
-                v_field, value[key])
-          js[name] = js_map
+              recorded_key = 'false'
+          else:
+            recorded_key = key
+          js_map[recorded_key] = _FieldToJsonObject(
+              v_field, value[key], including_default_value_fields)
+        js[name] = js_map
+      elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
+        # Convert a repeated field.
+        js[name] = [_FieldToJsonObject(field, k, include_default)
+                    for k in value]
+      else:
+        js[name] = _FieldToJsonObject(field, value, include_default)
+
+    # Serialize default value if including_default_value_fields is True.
+    if including_default_value_fields:
+      message_descriptor = message.DESCRIPTOR
+      for field in message_descriptor.fields:
+        # Singular message fields and oneof fields will not be affected.
+        if ((field.label != descriptor.FieldDescriptor.LABEL_REPEATED and
+             field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE) or
+            field.containing_oneof):
+          continue
+        name = field.camelcase_name
+        if name in js:
+          # Skip the field which has been serailized already.
+          continue
+        if _IsMapEntry(field):
+          js[name] = {}
         elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
-          # Convert a repeated field.
-          js[name] = [self._FieldToJsonObject(field, k)
-                      for k in value]
-        elif field.is_extension:
-          f = field
-          if (f.containing_type.GetOptions().message_set_wire_format and
-              f.type == descriptor.FieldDescriptor.TYPE_MESSAGE and
-              f.label == descriptor.FieldDescriptor.LABEL_OPTIONAL):
-            f = f.message_type
-          name = '[%s.%s]' % (f.full_name, name)
-          js[name] = self._FieldToJsonObject(field, value)
+          js[name] = []
         else:
-          js[name] = self._FieldToJsonObject(field, value)
+          js[name] = _FieldToJsonObject(field, field.default_value)
 
-      # Serialize default value if including_default_value_fields is True.
-      if self.including_default_value_fields:
-        message_descriptor = message.DESCRIPTOR
-        for field in message_descriptor.fields:
-          # Singular message fields and oneof fields will not be affected.
-          if ((field.label != descriptor.FieldDescriptor.LABEL_REPEATED and
-               field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE) or
-              field.containing_oneof):
-            continue
-          if self.preserving_proto_field_name:
-            name = field.name
-          else:
-            name = field.json_name
-          if name in js:
-            # Skip the field which has been serailized already.
-            continue
-          if _IsMapEntry(field):
-            js[name] = {}
-          elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
-            js[name] = []
-          else:
-            js[name] = self._FieldToJsonObject(field, field.default_value)
+  except ValueError as e:
+    raise SerializeToJsonError(
+        'Failed to serialize {0} field: {1}.'.format(field.name, e))
 
-    except ValueError as e:
-      raise SerializeToJsonError(
-          'Failed to serialize {0} field: {1}.'.format(field.name, e))
+  return js
 
-    return js
 
-  def _FieldToJsonObject(self, field, value):
-    """Converts field value according to Proto3 JSON Specification."""
-    if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-      return self._MessageToJsonObject(value)
-    elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:
-      enum_value = field.enum_type.values_by_number.get(value, None)
-      if enum_value is not None:
-        return enum_value.name
-      else:
-        if field.file.syntax == 'proto3':
-          return value
-        raise SerializeToJsonError('Enum field contains an integer value '
-                                   'which can not mapped to an enum value.')
-    elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING:
-      if field.type == descriptor.FieldDescriptor.TYPE_BYTES:
-        # Use base64 Data encoding for bytes
-        return base64.b64encode(value).decode('utf-8')
-      else:
-        return value
-    elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL:
-      return bool(value)
-    elif field.cpp_type in _INT64_TYPES:
-      return str(value)
-    elif field.cpp_type in _FLOAT_TYPES:
-      if math.isinf(value):
-        if value < 0.0:
-          return _NEG_INFINITY
-        else:
-          return _INFINITY
-      if math.isnan(value):
-        return _NAN
-    return value
-
-  def _AnyMessageToJsonObject(self, message):
-    """Converts Any message according to Proto3 JSON Specification."""
-    if not message.ListFields():
-      return {}
-    # Must print @type first, use OrderedDict instead of {}
-    js = OrderedDict()
-    type_url = message.type_url
-    js['@type'] = type_url
-    sub_message = _CreateMessageFromTypeUrl(type_url)
-    sub_message.ParseFromString(message.value)
-    message_descriptor = sub_message.DESCRIPTOR
-    full_name = message_descriptor.full_name
-    if _IsWrapperMessage(message_descriptor):
-      js['value'] = self._WrapperMessageToJsonObject(sub_message)
-      return js
-    if full_name in _WKTJSONMETHODS:
-      js['value'] = methodcaller(_WKTJSONMETHODS[full_name][0],
-                                 sub_message)(self)
-      return js
-    return self._RegularMessageToJsonObject(sub_message, js)
-
-  def _GenericMessageToJsonObject(self, message):
-    """Converts message according to Proto3 JSON Specification."""
-    # Duration, Timestamp and FieldMask have ToJsonString method to do the
-    # convert. Users can also call the method directly.
-    return message.ToJsonString()
-
-  def _ValueMessageToJsonObject(self, message):
-    """Converts Value message according to Proto3 JSON Specification."""
-    which = message.WhichOneof('kind')
-    # If the Value message is not set treat as null_value when serialize
-    # to JSON. The parse back result will be different from original message.
-    if which is None or which == 'null_value':
-      return None
-    if which == 'list_value':
-      return self._ListValueMessageToJsonObject(message.list_value)
-    if which == 'struct_value':
-      value = message.struct_value
+def _FieldToJsonObject(
+    field, value, including_default_value_fields=False):
+  """Converts field value according to Proto3 JSON Specification."""
+  if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
+    return _MessageToJsonObject(value, including_default_value_fields)
+  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:
+    enum_value = field.enum_type.values_by_number.get(value, None)
+    if enum_value is not None:
+      return enum_value.name
     else:
-      value = getattr(message, which)
-    oneof_descriptor = message.DESCRIPTOR.fields_by_name[which]
-    return self._FieldToJsonObject(oneof_descriptor, value)
-
-  def _ListValueMessageToJsonObject(self, message):
-    """Converts ListValue message according to Proto3 JSON Specification."""
-    return [self._ValueMessageToJsonObject(value)
-            for value in message.values]
-
-  def _StructMessageToJsonObject(self, message):
-    """Converts Struct message according to Proto3 JSON Specification."""
-    fields = message.fields
-    ret = {}
-    for key in fields:
-      ret[key] = self._ValueMessageToJsonObject(fields[key])
-    return ret
-
-  def _WrapperMessageToJsonObject(self, message):
-    return self._FieldToJsonObject(
-        message.DESCRIPTOR.fields_by_name['value'], message.value)
+      raise SerializeToJsonError('Enum field contains an integer value '
+                                 'which can not mapped to an enum value.')
+  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING:
+    if field.type == descriptor.FieldDescriptor.TYPE_BYTES:
+      # Use base64 Data encoding for bytes
+      return base64.b64encode(value).decode('utf-8')
+    else:
+      return value
+  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL:
+    return bool(value)
+  elif field.cpp_type in _INT64_TYPES:
+    return str(value)
+  elif field.cpp_type in _FLOAT_TYPES:
+    if math.isinf(value):
+      if value < 0.0:
+        return _NEG_INFINITY
+      else:
+        return _INFINITY
+    if math.isnan(value):
+      return _NAN
+  return value
 
 
-def _IsWrapperMessage(message_descriptor):
-  return message_descriptor.file.name == 'google/protobuf/wrappers.proto'
-
-
-def _DuplicateChecker(js):
-  result = {}
-  for name, value in js:
-    if name in result:
-      raise ParseError('Failed to load JSON: duplicate key {0}.'.format(name))
-    result[name] = value
-  return result
+def _AnyMessageToJsonObject(message, including_default):
+  """Converts Any message according to Proto3 JSON Specification."""
+  if not message.ListFields():
+    return {}
+  js = {}
+  type_url = message.type_url
+  js['@type'] = type_url
+  sub_message = _CreateMessageFromTypeUrl(type_url)
+  sub_message.ParseFromString(message.value)
+  message_descriptor = sub_message.DESCRIPTOR
+  full_name = message_descriptor.full_name
+  if _IsWrapperMessage(message_descriptor):
+    js['value'] = _WrapperMessageToJsonObject(sub_message)
+    return js
+  if full_name in _WKTJSONMETHODS:
+    js['value'] = _WKTJSONMETHODS[full_name][0](sub_message, including_default)
+    return js
+  return _RegularMessageToJsonObject(sub_message, js, including_default)
 
 
 def _CreateMessageFromTypeUrl(type_url):
@@ -363,13 +238,69 @@
   return message_class()
 
 
-def Parse(text, message, ignore_unknown_fields=False):
+def _GenericMessageToJsonObject(message, unused_including_default):
+  """Converts message by ToJsonString according to Proto3 JSON Specification."""
+  # Duration, Timestamp and FieldMask have ToJsonString method to do the
+  # convert. Users can also call the method directly.
+  return message.ToJsonString()
+
+
+def _ValueMessageToJsonObject(message, unused_including_default=False):
+  """Converts Value message according to Proto3 JSON Specification."""
+  which = message.WhichOneof('kind')
+  # If the Value message is not set treat as null_value when serialize
+  # to JSON. The parse back result will be different from original message.
+  if which is None or which == 'null_value':
+    return None
+  if which == 'list_value':
+    return _ListValueMessageToJsonObject(message.list_value)
+  if which == 'struct_value':
+    value = message.struct_value
+  else:
+    value = getattr(message, which)
+  oneof_descriptor = message.DESCRIPTOR.fields_by_name[which]
+  return _FieldToJsonObject(oneof_descriptor, value)
+
+
+def _ListValueMessageToJsonObject(message, unused_including_default=False):
+  """Converts ListValue message according to Proto3 JSON Specification."""
+  return [_ValueMessageToJsonObject(value)
+          for value in message.values]
+
+
+def _StructMessageToJsonObject(message, unused_including_default=False):
+  """Converts Struct message according to Proto3 JSON Specification."""
+  fields = message.fields
+  ret = {}
+  for key in fields:
+    ret[key] = _ValueMessageToJsonObject(fields[key])
+  return ret
+
+
+def _IsWrapperMessage(message_descriptor):
+  return message_descriptor.file.name == 'google/protobuf/wrappers.proto'
+
+
+def _WrapperMessageToJsonObject(message):
+  return _FieldToJsonObject(
+      message.DESCRIPTOR.fields_by_name['value'], message.value)
+
+
+def _DuplicateChecker(js):
+  result = {}
+  for name, value in js:
+    if name in result:
+      raise ParseError('Failed to load JSON: duplicate key {0}.'.format(name))
+    result[name] = value
+  return result
+
+
+def Parse(text, message):
   """Parses a JSON representation of a protocol message into a message.
 
   Args:
     text: Message JSON representation.
-    message: A protocol buffer message to merge into.
-    ignore_unknown_fields: If True, do not raise errors for unknown fields.
+    message: A protocol beffer message to merge into.
 
   Returns:
     The same message passed as argument.
@@ -386,255 +317,213 @@
       js = json.loads(text, object_pairs_hook=_DuplicateChecker)
   except ValueError as e:
     raise ParseError('Failed to load JSON: {0}.'.format(str(e)))
-  return ParseDict(js, message, ignore_unknown_fields)
+  _ConvertMessage(js, message)
+  return message
 
 
-def ParseDict(js_dict, message, ignore_unknown_fields=False):
-  """Parses a JSON dictionary representation into a message.
+def _ConvertFieldValuePair(js, message):
+  """Convert field value pairs into regular message.
 
   Args:
-    js_dict: Dict representation of a JSON message.
-    message: A protocol buffer message to merge into.
-    ignore_unknown_fields: If True, do not raise errors for unknown fields.
+    js: A JSON object to convert the field value pairs.
+    message: A regular protocol message to record the data.
 
-  Returns:
-    The same message passed as argument.
+  Raises:
+    ParseError: In case of problems converting.
   """
-  parser = _Parser(ignore_unknown_fields)
-  parser.ConvertMessage(js_dict, message)
-  return message
+  names = []
+  message_descriptor = message.DESCRIPTOR
+  for name in js:
+    try:
+      field = message_descriptor.fields_by_camelcase_name.get(name, None)
+      if not field:
+        raise ParseError(
+            'Message type "{0}" has no field named "{1}".'.format(
+                message_descriptor.full_name, name))
+      if name in names:
+        raise ParseError(
+            'Message type "{0}" should not have multiple "{1}" fields.'.format(
+                message.DESCRIPTOR.full_name, name))
+      names.append(name)
+      # Check no other oneof field is parsed.
+      if field.containing_oneof is not None:
+        oneof_name = field.containing_oneof.name
+        if oneof_name in names:
+          raise ParseError('Message type "{0}" should not have multiple "{1}" '
+                           'oneof fields.'.format(
+                               message.DESCRIPTOR.full_name, oneof_name))
+        names.append(oneof_name)
+
+      value = js[name]
+      if value is None:
+        message.ClearField(field.name)
+        continue
+
+      # Parse field value.
+      if _IsMapEntry(field):
+        message.ClearField(field.name)
+        _ConvertMapFieldValue(value, message, field)
+      elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
+        message.ClearField(field.name)
+        if not isinstance(value, list):
+          raise ParseError('repeated field {0} must be in [] which is '
+                           '{1}.'.format(name, value))
+        if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
+          # Repeated message field.
+          for item in value:
+            sub_message = getattr(message, field.name).add()
+            # None is a null_value in Value.
+            if (item is None and
+                sub_message.DESCRIPTOR.full_name != 'google.protobuf.Value'):
+              raise ParseError('null is not allowed to be used as an element'
+                               ' in a repeated field.')
+            _ConvertMessage(item, sub_message)
+        else:
+          # Repeated scalar field.
+          for item in value:
+            if item is None:
+              raise ParseError('null is not allowed to be used as an element'
+                               ' in a repeated field.')
+            getattr(message, field.name).append(
+                _ConvertScalarFieldValue(item, field))
+      elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
+        sub_message = getattr(message, field.name)
+        _ConvertMessage(value, sub_message)
+      else:
+        setattr(message, field.name, _ConvertScalarFieldValue(value, field))
+    except ParseError as e:
+      if field and field.containing_oneof is None:
+        raise ParseError('Failed to parse {0} field: {1}'.format(name, e))
+      else:
+        raise ParseError(str(e))
+    except ValueError as e:
+      raise ParseError('Failed to parse {0} field: {1}.'.format(name, e))
+    except TypeError as e:
+      raise ParseError('Failed to parse {0} field: {1}.'.format(name, e))
+
+
+def _ConvertMessage(value, message):
+  """Convert a JSON object into a message.
+
+  Args:
+    value: A JSON object.
+    message: A WKT or regular protocol message to record the data.
+
+  Raises:
+    ParseError: In case of convert problems.
+  """
+  message_descriptor = message.DESCRIPTOR
+  full_name = message_descriptor.full_name
+  if _IsWrapperMessage(message_descriptor):
+    _ConvertWrapperMessage(value, message)
+  elif full_name in _WKTJSONMETHODS:
+    _WKTJSONMETHODS[full_name][1](value, message)
+  else:
+    _ConvertFieldValuePair(value, message)
+
+
+def _ConvertAnyMessage(value, message):
+  """Convert a JSON representation into Any message."""
+  if isinstance(value, dict) and not value:
+    return
+  try:
+    type_url = value['@type']
+  except KeyError:
+    raise ParseError('@type is missing when parsing any message.')
+
+  sub_message = _CreateMessageFromTypeUrl(type_url)
+  message_descriptor = sub_message.DESCRIPTOR
+  full_name = message_descriptor.full_name
+  if _IsWrapperMessage(message_descriptor):
+    _ConvertWrapperMessage(value['value'], sub_message)
+  elif full_name in _WKTJSONMETHODS:
+    _WKTJSONMETHODS[full_name][1](value['value'], sub_message)
+  else:
+    del value['@type']
+    _ConvertFieldValuePair(value, sub_message)
+  # Sets Any message
+  message.value = sub_message.SerializeToString()
+  message.type_url = type_url
+
+
+def _ConvertGenericMessage(value, message):
+  """Convert a JSON representation into message with FromJsonString."""
+  # Durantion, Timestamp, FieldMask have FromJsonString method to do the
+  # convert. Users can also call the method directly.
+  message.FromJsonString(value)
 
 
 _INT_OR_FLOAT = six.integer_types + (float,)
 
 
-class _Parser(object):
-  """JSON format parser for protocol message."""
+def _ConvertValueMessage(value, message):
+  """Convert a JSON representation into Value message."""
+  if isinstance(value, dict):
+    _ConvertStructMessage(value, message.struct_value)
+  elif isinstance(value, list):
+    _ConvertListValueMessage(value, message.list_value)
+  elif value is None:
+    message.null_value = 0
+  elif isinstance(value, bool):
+    message.bool_value = value
+  elif isinstance(value, six.string_types):
+    message.string_value = value
+  elif isinstance(value, _INT_OR_FLOAT):
+    message.number_value = value
+  else:
+    raise ParseError('Unexpected type for Value message.')
 
-  def __init__(self,
-               ignore_unknown_fields):
-    self.ignore_unknown_fields = ignore_unknown_fields
 
-  def ConvertMessage(self, value, message):
-    """Convert a JSON object into a message.
+def _ConvertListValueMessage(value, message):
+  """Convert a JSON representation into ListValue message."""
+  if not isinstance(value, list):
+    raise ParseError(
+        'ListValue must be in [] which is {0}.'.format(value))
+  message.ClearField('values')
+  for item in value:
+    _ConvertValueMessage(item, message.values.add())
 
-    Args:
-      value: A JSON object.
-      message: A WKT or regular protocol message to record the data.
 
-    Raises:
-      ParseError: In case of convert problems.
-    """
-    message_descriptor = message.DESCRIPTOR
-    full_name = message_descriptor.full_name
-    if _IsWrapperMessage(message_descriptor):
-      self._ConvertWrapperMessage(value, message)
-    elif full_name in _WKTJSONMETHODS:
-      methodcaller(_WKTJSONMETHODS[full_name][1], value, message)(self)
+def _ConvertStructMessage(value, message):
+  """Convert a JSON representation into Struct message."""
+  if not isinstance(value, dict):
+    raise ParseError(
+        'Struct must be in a dict which is {0}.'.format(value))
+  for key in value:
+    _ConvertValueMessage(value[key], message.fields[key])
+  return
+
+
+def _ConvertWrapperMessage(value, message):
+  """Convert a JSON representation into Wrapper message."""
+  field = message.DESCRIPTOR.fields_by_name['value']
+  setattr(message, 'value', _ConvertScalarFieldValue(value, field))
+
+
+def _ConvertMapFieldValue(value, message, field):
+  """Convert map field value for a message map field.
+
+  Args:
+    value: A JSON object to convert the map field value.
+    message: A protocol message to record the converted data.
+    field: The descriptor of the map field to be converted.
+
+  Raises:
+    ParseError: In case of convert problems.
+  """
+  if not isinstance(value, dict):
+    raise ParseError(
+        'Map field {0} must be in a dict which is {1}.'.format(
+            field.name, value))
+  key_field = field.message_type.fields_by_name['key']
+  value_field = field.message_type.fields_by_name['value']
+  for key in value:
+    key_value = _ConvertScalarFieldValue(key, key_field, True)
+    if value_field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
+      _ConvertMessage(value[key], getattr(message, field.name)[key_value])
     else:
-      self._ConvertFieldValuePair(value, message)
-
-  def _ConvertFieldValuePair(self, js, message):
-    """Convert field value pairs into regular message.
-
-    Args:
-      js: A JSON object to convert the field value pairs.
-      message: A regular protocol message to record the data.
-
-    Raises:
-      ParseError: In case of problems converting.
-    """
-    names = []
-    message_descriptor = message.DESCRIPTOR
-    fields_by_json_name = dict((f.json_name, f)
-                               for f in message_descriptor.fields)
-    for name in js:
-      try:
-        field = fields_by_json_name.get(name, None)
-        if not field:
-          field = message_descriptor.fields_by_name.get(name, None)
-        if not field and _VALID_EXTENSION_NAME.match(name):
-          if not message_descriptor.is_extendable:
-            raise ParseError('Message type {0} does not have extensions'.format(
-                message_descriptor.full_name))
-          identifier = name[1:-1]  # strip [] brackets
-          identifier = '.'.join(identifier.split('.')[:-1])
-          # pylint: disable=protected-access
-          field = message.Extensions._FindExtensionByName(identifier)
-          # pylint: enable=protected-access
-        if not field:
-          if self.ignore_unknown_fields:
-            continue
-          raise ParseError(
-              ('Message type "{0}" has no field named "{1}".\n'
-               ' Available Fields(except extensions): {2}').format(
-                   message_descriptor.full_name, name,
-                   message_descriptor.fields))
-        if name in names:
-          raise ParseError('Message type "{0}" should not have multiple '
-                           '"{1}" fields.'.format(
-                               message.DESCRIPTOR.full_name, name))
-        names.append(name)
-        # Check no other oneof field is parsed.
-        if field.containing_oneof is not None:
-          oneof_name = field.containing_oneof.name
-          if oneof_name in names:
-            raise ParseError('Message type "{0}" should not have multiple '
-                             '"{1}" oneof fields.'.format(
-                                 message.DESCRIPTOR.full_name, oneof_name))
-          names.append(oneof_name)
-
-        value = js[name]
-        if value is None:
-          if (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE
-              and field.message_type.full_name == 'google.protobuf.Value'):
-            sub_message = getattr(message, field.name)
-            sub_message.null_value = 0
-          else:
-            message.ClearField(field.name)
-          continue
-
-        # Parse field value.
-        if _IsMapEntry(field):
-          message.ClearField(field.name)
-          self._ConvertMapFieldValue(value, message, field)
-        elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
-          message.ClearField(field.name)
-          if not isinstance(value, list):
-            raise ParseError('repeated field {0} must be in [] which is '
-                             '{1}.'.format(name, value))
-          if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-            # Repeated message field.
-            for item in value:
-              sub_message = getattr(message, field.name).add()
-              # None is a null_value in Value.
-              if (item is None and
-                  sub_message.DESCRIPTOR.full_name != 'google.protobuf.Value'):
-                raise ParseError('null is not allowed to be used as an element'
-                                 ' in a repeated field.')
-              self.ConvertMessage(item, sub_message)
-          else:
-            # Repeated scalar field.
-            for item in value:
-              if item is None:
-                raise ParseError('null is not allowed to be used as an element'
-                                 ' in a repeated field.')
-              getattr(message, field.name).append(
-                  _ConvertScalarFieldValue(item, field))
-        elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-          if field.is_extension:
-            sub_message = message.Extensions[field]
-          else:
-            sub_message = getattr(message, field.name)
-          sub_message.SetInParent()
-          self.ConvertMessage(value, sub_message)
-        else:
-          setattr(message, field.name, _ConvertScalarFieldValue(value, field))
-      except ParseError as e:
-        if field and field.containing_oneof is None:
-          raise ParseError('Failed to parse {0} field: {1}'.format(name, e))
-        else:
-          raise ParseError(str(e))
-      except ValueError as e:
-        raise ParseError('Failed to parse {0} field: {1}.'.format(name, e))
-      except TypeError as e:
-        raise ParseError('Failed to parse {0} field: {1}.'.format(name, e))
-
-  def _ConvertAnyMessage(self, value, message):
-    """Convert a JSON representation into Any message."""
-    if isinstance(value, dict) and not value:
-      return
-    try:
-      type_url = value['@type']
-    except KeyError:
-      raise ParseError('@type is missing when parsing any message.')
-
-    sub_message = _CreateMessageFromTypeUrl(type_url)
-    message_descriptor = sub_message.DESCRIPTOR
-    full_name = message_descriptor.full_name
-    if _IsWrapperMessage(message_descriptor):
-      self._ConvertWrapperMessage(value['value'], sub_message)
-    elif full_name in _WKTJSONMETHODS:
-      methodcaller(
-          _WKTJSONMETHODS[full_name][1], value['value'], sub_message)(self)
-    else:
-      del value['@type']
-      self._ConvertFieldValuePair(value, sub_message)
-    # Sets Any message
-    message.value = sub_message.SerializeToString()
-    message.type_url = type_url
-
-  def _ConvertGenericMessage(self, value, message):
-    """Convert a JSON representation into message with FromJsonString."""
-    # Duration, Timestamp, FieldMask have a FromJsonString method to do the
-    # conversion. Users can also call the method directly.
-    message.FromJsonString(value)
-
-  def _ConvertValueMessage(self, value, message):
-    """Convert a JSON representation into Value message."""
-    if isinstance(value, dict):
-      self._ConvertStructMessage(value, message.struct_value)
-    elif isinstance(value, list):
-      self. _ConvertListValueMessage(value, message.list_value)
-    elif value is None:
-      message.null_value = 0
-    elif isinstance(value, bool):
-      message.bool_value = value
-    elif isinstance(value, six.string_types):
-      message.string_value = value
-    elif isinstance(value, _INT_OR_FLOAT):
-      message.number_value = value
-    else:
-      raise ParseError('Unexpected type for Value message.')
-
-  def _ConvertListValueMessage(self, value, message):
-    """Convert a JSON representation into ListValue message."""
-    if not isinstance(value, list):
-      raise ParseError(
-          'ListValue must be in [] which is {0}.'.format(value))
-    message.ClearField('values')
-    for item in value:
-      self._ConvertValueMessage(item, message.values.add())
-
-  def _ConvertStructMessage(self, value, message):
-    """Convert a JSON representation into Struct message."""
-    if not isinstance(value, dict):
-      raise ParseError(
-          'Struct must be in a dict which is {0}.'.format(value))
-    for key in value:
-      self._ConvertValueMessage(value[key], message.fields[key])
-    return
-
-  def _ConvertWrapperMessage(self, value, message):
-    """Convert a JSON representation into Wrapper message."""
-    field = message.DESCRIPTOR.fields_by_name['value']
-    setattr(message, 'value', _ConvertScalarFieldValue(value, field))
-
-  def _ConvertMapFieldValue(self, value, message, field):
-    """Convert map field value for a message map field.
-
-    Args:
-      value: A JSON object to convert the map field value.
-      message: A protocol message to record the converted data.
-      field: The descriptor of the map field to be converted.
-
-    Raises:
-      ParseError: In case of convert problems.
-    """
-    if not isinstance(value, dict):
-      raise ParseError(
-          'Map field {0} must be in a dict which is {1}.'.format(
-              field.name, value))
-    key_field = field.message_type.fields_by_name['key']
-    value_field = field.message_type.fields_by_name['value']
-    for key in value:
-      key_value = _ConvertScalarFieldValue(key, key_field, True)
-      if value_field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-        self.ConvertMessage(value[key], getattr(
-            message, field.name)[key_value])
-      else:
-        getattr(message, field.name)[key_value] = _ConvertScalarFieldValue(
-            value[key], value_field)
+      getattr(message, field.name)[key_value] = _ConvertScalarFieldValue(
+          value[key], value_field)
 
 
 def _ConvertScalarFieldValue(value, field, require_str=False):
@@ -661,27 +550,15 @@
     if field.type == descriptor.FieldDescriptor.TYPE_BYTES:
       return base64.b64decode(value)
     else:
-      # Checking for unpaired surrogates appears to be unreliable,
-      # depending on the specific Python version, so we check manually.
-      if _UNPAIRED_SURROGATE_PATTERN.search(value):
-        raise ParseError('Unpaired surrogate')
       return value
   elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:
     # Convert an enum value.
     enum_value = field.enum_type.values_by_name.get(value, None)
     if enum_value is None:
-      try:
-        number = int(value)
-        enum_value = field.enum_type.values_by_number.get(number, None)
-      except ValueError:
-        raise ParseError('Invalid enum value {0} for enum type {1}.'.format(
-            value, field.enum_type.full_name))
-      if enum_value is None:
-        if field.file.syntax == 'proto3':
-          # Proto3 accepts unknown enums.
-          return number
-        raise ParseError('Invalid enum value {0} for enum type {1}.'.format(
-            value, field.enum_type.full_name))
+      raise ParseError(
+          'Enum value must be a string literal with double quotes. '
+          'Type "{0}" has no value named {1}.'.format(
+              field.enum_type.full_name, value))
     return enum_value.number
 
 
@@ -697,7 +574,7 @@
   Raises:
     ParseError: If an integer couldn't be consumed.
   """
-  if isinstance(value, float) and not value.is_integer():
+  if isinstance(value, float):
     raise ParseError('Couldn\'t parse integer: {0}.'.format(value))
 
   if isinstance(value, six.text_type) and value.find(' ') != -1:
@@ -751,18 +628,18 @@
   return value
 
 _WKTJSONMETHODS = {
-    'google.protobuf.Any': ['_AnyMessageToJsonObject',
-                            '_ConvertAnyMessage'],
-    'google.protobuf.Duration': ['_GenericMessageToJsonObject',
-                                 '_ConvertGenericMessage'],
-    'google.protobuf.FieldMask': ['_GenericMessageToJsonObject',
-                                  '_ConvertGenericMessage'],
-    'google.protobuf.ListValue': ['_ListValueMessageToJsonObject',
-                                  '_ConvertListValueMessage'],
-    'google.protobuf.Struct': ['_StructMessageToJsonObject',
-                               '_ConvertStructMessage'],
-    'google.protobuf.Timestamp': ['_GenericMessageToJsonObject',
-                                  '_ConvertGenericMessage'],
-    'google.protobuf.Value': ['_ValueMessageToJsonObject',
-                              '_ConvertValueMessage']
+    'google.protobuf.Any': [_AnyMessageToJsonObject,
+                            _ConvertAnyMessage],
+    'google.protobuf.Duration': [_GenericMessageToJsonObject,
+                                 _ConvertGenericMessage],
+    'google.protobuf.FieldMask': [_GenericMessageToJsonObject,
+                                  _ConvertGenericMessage],
+    'google.protobuf.ListValue': [_ListValueMessageToJsonObject,
+                                  _ConvertListValueMessage],
+    'google.protobuf.Struct': [_StructMessageToJsonObject,
+                               _ConvertStructMessage],
+    'google.protobuf.Timestamp': [_GenericMessageToJsonObject,
+                                  _ConvertGenericMessage],
+    'google.protobuf.Value': [_ValueMessageToJsonObject,
+                              _ConvertValueMessage]
 }
diff --git a/python/google/protobuf/message.py b/python/google/protobuf/message.py
index eeb0d57..606f735 100755
--- a/python/google/protobuf/message.py
+++ b/python/google/protobuf/message.py
@@ -184,15 +184,9 @@
     self.Clear()
     self.MergeFromString(serialized)
 
-  def SerializeToString(self, **kwargs):
+  def SerializeToString(self):
     """Serializes the protocol message to a binary string.
 
-    Arguments:
-      **kwargs: Keyword arguments to the serialize method, accepts
-        the following keyword args:
-        deterministic: If true, requests deterministic serialization of the
-          protobuf, with predictable ordering of map keys.
-
     Returns:
       A binary string representation of the message if all of the required
       fields in the message are set (i.e. the message is initialized).
@@ -202,18 +196,12 @@
     """
     raise NotImplementedError
 
-  def SerializePartialToString(self, **kwargs):
+  def SerializePartialToString(self):
     """Serializes the protocol message to a binary string.
 
     This method is similar to SerializeToString but doesn't check if the
     message is initialized.
 
-    Arguments:
-      **kwargs: Keyword arguments to the serialize method, accepts
-        the following keyword args:
-        deterministic: If true, requests deterministic serialization of the
-          protobuf, with predictable ordering of map keys.
-
     Returns:
       A string representation of the partial message.
     """
@@ -237,11 +225,10 @@
   # """
   def ListFields(self):
     """Returns a list of (FieldDescriptor, value) tuples for all
-    fields in the message which are not empty.  A message field is
-    non-empty if HasField() would return true. A singular primitive field
-    is non-empty if HasField() would return true in proto2 or it is non zero
-    in proto3. A repeated field is non-empty if it contains at least one
-    element.  The fields are ordered by field number"""
+    fields in the message which are not empty.  A singular field is non-empty
+    if HasField() would return true, and a repeated field is non-empty if
+    it contains at least one element.  The fields are ordered by field
+    number"""
     raise NotImplementedError
 
   def HasField(self, field_name):
diff --git a/python/google/protobuf/message_factory.py b/python/google/protobuf/message_factory.py
index e4fb065..1b059d1 100644
--- a/python/google/protobuf/message_factory.py
+++ b/python/google/protobuf/message_factory.py
@@ -66,7 +66,7 @@
     Returns:
       A class describing the passed in descriptor.
     """
-    if descriptor not in self._classes:
+    if descriptor.full_name not in self._classes:
       descriptor_name = descriptor.name
       if str is bytes:  # PY2
         descriptor_name = descriptor.name.encode('ascii', 'ignore')
@@ -75,16 +75,16 @@
           (message.Message,),
           {'DESCRIPTOR': descriptor, '__module__': None})
           # If module not set, it wrongly points to the reflection.py module.
-      self._classes[descriptor] = result_class
+      self._classes[descriptor.full_name] = result_class
       for field in descriptor.fields:
         if field.message_type:
           self.GetPrototype(field.message_type)
       for extension in result_class.DESCRIPTOR.extensions:
-        if extension.containing_type not in self._classes:
+        if extension.containing_type.full_name not in self._classes:
           self.GetPrototype(extension.containing_type)
-        extended_class = self._classes[extension.containing_type]
+        extended_class = self._classes[extension.containing_type.full_name]
         extended_class.RegisterExtension(extension)
-    return self._classes[descriptor]
+    return self._classes[descriptor.full_name]
 
   def GetMessages(self, files):
     """Gets all the messages from a specified file.
@@ -103,8 +103,13 @@
     result = {}
     for file_name in files:
       file_desc = self.pool.FindFileByName(file_name)
-      for desc in file_desc.message_types_by_name.values():
-        result[desc.full_name] = self.GetPrototype(desc)
+      for name, msg in file_desc.message_types_by_name.items():
+        if file_desc.package:
+          full_name = '.'.join([file_desc.package, name])
+        else:
+          full_name = msg.name
+        result[full_name] = self.GetPrototype(
+            self.pool.FindMessageTypeByName(full_name))
 
       # While the extension FieldDescriptors are created by the descriptor pool,
       # the python classes created in the factory need them to be registered
@@ -115,10 +120,10 @@
       # ignore the registration if the original was the same, or raise
       # an error if they were different.
 
-      for extension in file_desc.extensions_by_name.values():
-        if extension.containing_type not in self._classes:
+      for name, extension in file_desc.extensions_by_name.items():
+        if extension.containing_type.full_name not in self._classes:
           self.GetPrototype(extension.containing_type)
-        extended_class = self._classes[extension.containing_type]
+        extended_class = self._classes[extension.containing_type.full_name]
         extended_class.RegisterExtension(extension)
     return result
 
@@ -130,22 +135,13 @@
   """Builds a dictionary of all the messages available in a set of files.
 
   Args:
-    file_protos: Iterable of FileDescriptorProto to build messages out of.
+    file_protos: A sequence of file protos to build messages out of.
 
   Returns:
     A dictionary mapping proto names to the message classes. This will include
     any dependent messages as well as any messages defined in the same file as
     a specified message.
   """
-  # The cpp implementation of the protocol buffer library requires to add the
-  # message in topological order of the dependency graph.
-  file_by_name = {file_proto.name: file_proto for file_proto in file_protos}
-  def _AddFile(file_proto):
-    for dependency in file_proto.dependency:
-      if dependency in file_by_name:
-        # Remove from elements to be visited, in order to cut cycles.
-        _AddFile(file_by_name.pop(dependency))
+  for file_proto in file_protos:
     _FACTORY.pool.Add(file_proto)
-  while file_by_name:
-    _AddFile(file_by_name.popitem()[1])
   return _FACTORY.GetMessages([file_proto.name for file_proto in file_protos])
diff --git a/python/google/protobuf/pyext/cpp_message.py b/python/google/protobuf/pyext/cpp_message.py
index fc8eb32..b215211 100644
--- a/python/google/protobuf/pyext/cpp_message.py
+++ b/python/google/protobuf/pyext/cpp_message.py
@@ -48,9 +48,9 @@
   classes at runtime, as in this example:
 
   mydescriptor = Descriptor(.....)
-  factory = symbol_database.Default()
-  factory.pool.AddDescriptor(mydescriptor)
-  MyProtoClass = factory.GetPrototype(mydescriptor)
+  class MyProtoClass(Message):
+    __metaclass__ = GeneratedProtocolMessageType
+    DESCRIPTOR = mydescriptor
   myproto_instance = MyProtoClass()
   myproto.foo_field = 23
   ...
diff --git a/python/google/protobuf/pyext/descriptor.cc b/python/google/protobuf/pyext/descriptor.cc
index 9634ea0..2355753 100644
--- a/python/google/protobuf/pyext/descriptor.cc
+++ b/python/google/protobuf/pyext/descriptor.cc
@@ -32,7 +32,6 @@
 
 #include <Python.h>
 #include <frameobject.h>
-#include <google/protobuf/stubs/hash.h>
 #include <string>
 
 #include <google/protobuf/io/coded_stream.h>
@@ -42,7 +41,6 @@
 #include <google/protobuf/pyext/descriptor_containers.h>
 #include <google/protobuf/pyext/descriptor_pool.h>
 #include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
 
 #if PY_MAJOR_VERSION >= 3
@@ -174,16 +172,12 @@
 const FileDescriptor* GetFileDescriptor(const OneofDescriptor* descriptor) {
   return descriptor->containing_type()->file();
 }
-template<>
-const FileDescriptor* GetFileDescriptor(const MethodDescriptor* descriptor) {
-  return descriptor->service()->file();
-}
 
 // Converts options into a Python protobuf, and cache the result.
 //
 // This is a bit tricky because options can contain extension fields defined in
 // the same proto file. In this case the options parsed from the serialized_pb
-// have unknown fields, and we need to parse them again.
+// have unkown fields, and we need to parse them again.
 //
 // Always returns a new reference.
 template<class DescriptorClass>
@@ -206,19 +200,15 @@
   // read-only instance.
   const Message& options(descriptor->options());
   const Descriptor *message_type = options.GetDescriptor();
-  PyMessageFactory* message_factory = pool->py_message_factory;
-  CMessageClass* message_class = message_factory::GetMessageClass(
-      message_factory, message_type);
+  CMessageClass* message_class(
+      cdescriptor_pool::GetMessageClass(pool, message_type));
   if (message_class == NULL) {
     // The Options message was not found in the current DescriptorPool.
-    // This means that the pool cannot contain any extensions to the Options
-    // message either, so falling back to the basic pool we can only increase
-    // the chances of successfully parsing the options.
+    // In this case, there cannot be extensions to these options, and we can
+    // try to use the basic pool instead.
     PyErr_Clear();
-    pool = GetDefaultDescriptorPool();
-    message_factory = pool->py_message_factory;
-    message_class = message_factory::GetMessageClass(
-      message_factory, message_type);
+    message_class = cdescriptor_pool::GetMessageClass(
+      GetDefaultDescriptorPool(), message_type);
   }
   if (message_class == NULL) {
     PyErr_Format(PyExc_TypeError, "Could not retrieve class for Options: %s",
@@ -248,7 +238,7 @@
     options.SerializeToString(&serialized);
     io::CodedInputStream input(
         reinterpret_cast<const uint8*>(serialized.c_str()), serialized.size());
-    input.SetExtensionRegistry(pool->pool, message_factory->message_factory);
+    input.SetExtensionRegistry(pool->pool, pool->message_factory);
     bool success = cmsg->message->MergePartialFromCodedStream(&input);
     if (!success) {
       PyErr_Format(PyExc_ValueError, "Error parsing Options message");
@@ -258,7 +248,7 @@
 
   // Cache the result.
   Py_INCREF(value.get());
-  (*descriptor_options)[descriptor] = value.get();
+  (*pool->descriptor_options)[descriptor] = value.get();
 
   return value.release();
 }
@@ -444,9 +434,8 @@
   // which contains this descriptor.
   // This might not be the one you expect! For example the returned object does
   // not know about extensions defined in a custom pool.
-  CMessageClass* concrete_class(message_factory::GetMessageClass(
-      GetDescriptorPool_FromPool(
-          _GetDescriptor(self)->file()->pool())->py_message_factory,
+  CMessageClass* concrete_class(cdescriptor_pool::GetMessageClass(
+      GetDescriptorPool_FromPool(_GetDescriptor(self)->file()->pool()),
       _GetDescriptor(self)));
   Py_XINCREF(concrete_class);
   return concrete_class->AsPyObject();
@@ -705,14 +694,6 @@
   return PyString_FromCppString(_GetDescriptor(self)->camelcase_name());
 }
 
-static PyObject* GetJsonName(PyBaseDescriptor* self, void *closure) {
-  return PyString_FromCppString(_GetDescriptor(self)->json_name());
-}
-
-static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
-  return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
-}
-
 static PyObject* GetType(PyBaseDescriptor *self, void *closure) {
   return PyInt_FromLong(_GetDescriptor(self)->type());
 }
@@ -902,8 +883,6 @@
   { "full_name", (getter)GetFullName, NULL, "Full name"},
   { "name", (getter)GetName, NULL, "Unqualified name"},
   { "camelcase_name", (getter)GetCamelcaseName, NULL, "Camelcase name"},
-  { "json_name", (getter)GetJsonName, NULL, "Json name"},
-  { "file", (getter)GetFile, NULL, "File Descriptor"},
   { "type", (getter)GetType, NULL, "C++ Type"},
   { "cpp_type", (getter)GetCppType, NULL, "C++ Type"},
   { "label", (getter)GetLabel, NULL, "Label"},
@@ -1112,7 +1091,7 @@
   0,                                    // tp_weaklistoffset
   0,                                    // tp_iter
   0,                                    // tp_iternext
-  enum_descriptor::Methods,             // tp_methods
+  enum_descriptor::Methods,             // tp_getset
   0,                                    // tp_members
   enum_descriptor::Getters,             // tp_getset
   &descriptor::PyBaseDescriptor_Type,   // tp_base
@@ -1296,10 +1275,6 @@
   return NewFileExtensionsByName(_GetDescriptor(self));
 }
 
-static PyObject* GetServicesByName(PyFileDescriptor* self, void *closure) {
-  return NewFileServicesByName(_GetDescriptor(self));
-}
-
 static PyObject* GetDependencies(PyFileDescriptor* self, void *closure) {
   return NewFileDependencies(_GetDescriptor(self));
 }
@@ -1349,7 +1324,6 @@
   { "enum_types_by_name", (getter)GetEnumTypesByName, NULL, "Enums by name"},
   { "extensions_by_name", (getter)GetExtensionsByName, NULL,
     "Extensions by name"},
-  { "services_by_name", (getter)GetServicesByName, NULL, "Services by name"},
   { "dependencies", (getter)GetDependencies, NULL, "Dependencies"},
   { "public_dependencies", (getter)GetPublicDependencies, NULL, "Dependencies"},
 
@@ -1478,45 +1452,16 @@
   }
 }
 
-static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
-  const OneofOptions& options(_GetDescriptor(self)->options());
-  if (&options != &OneofOptions::default_instance()) {
-    Py_RETURN_TRUE;
-  } else {
-    Py_RETURN_FALSE;
-  }
-}
-static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
-                         void *closure) {
-  return CheckCalledFromGeneratedFile("has_options");
-}
-
-static PyObject* GetOptions(PyBaseDescriptor *self) {
-  return GetOrBuildOptions(_GetDescriptor(self));
-}
-
-static int SetOptions(PyBaseDescriptor *self, PyObject *value,
-                      void *closure) {
-  return CheckCalledFromGeneratedFile("_options");
-}
-
 static PyGetSetDef Getters[] = {
   { "name", (getter)GetName, NULL, "Name"},
   { "full_name", (getter)GetFullName, NULL, "Full name"},
   { "index", (getter)GetIndex, NULL, "Index"},
 
   { "containing_type", (getter)GetContainingType, NULL, "Containing type"},
-  { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
-  { "_options", (getter)NULL, (setter)SetOptions, "Options"},
   { "fields", (getter)GetFields, NULL, "Fields"},
   {NULL}
 };
 
-static PyMethodDef Methods[] = {
-  { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS },
-  {NULL}
-};
-
 }  // namespace oneof_descriptor
 
 PyTypeObject PyOneofDescriptor_Type = {
@@ -1547,7 +1492,7 @@
   0,                                    // tp_weaklistoffset
   0,                                    // tp_iter
   0,                                    // tp_iternext
-  oneof_descriptor::Methods,            // tp_methods
+  0,                                    // tp_methods
   0,                                    // tp_members
   oneof_descriptor::Getters,            // tp_getset
   &descriptor::PyBaseDescriptor_Type,   // tp_base
@@ -1559,245 +1504,6 @@
       &PyOneofDescriptor_Type, oneof_descriptor, NULL);
 }
 
-namespace service_descriptor {
-
-// Unchecked accessor to the C++ pointer.
-static const ServiceDescriptor* _GetDescriptor(
-    PyBaseDescriptor *self) {
-  return reinterpret_cast<const ServiceDescriptor*>(self->descriptor);
-}
-
-static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
-  return PyString_FromCppString(_GetDescriptor(self)->name());
-}
-
-static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
-  return PyString_FromCppString(_GetDescriptor(self)->full_name());
-}
-
-static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
-  return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
-}
-
-static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
-  return PyInt_FromLong(_GetDescriptor(self)->index());
-}
-
-static PyObject* GetMethods(PyBaseDescriptor* self, void *closure) {
-  return NewServiceMethodsSeq(_GetDescriptor(self));
-}
-
-static PyObject* GetMethodsByName(PyBaseDescriptor* self, void *closure) {
-  return NewServiceMethodsByName(_GetDescriptor(self));
-}
-
-static PyObject* FindMethodByName(PyBaseDescriptor *self, PyObject* arg) {
-  Py_ssize_t name_size;
-  char* name;
-  if (PyString_AsStringAndSize(arg, &name, &name_size) < 0) {
-    return NULL;
-  }
-
-  const MethodDescriptor* method_descriptor =
-      _GetDescriptor(self)->FindMethodByName(string(name, name_size));
-  if (method_descriptor == NULL) {
-    PyErr_Format(PyExc_KeyError, "Couldn't find method %.200s", name);
-    return NULL;
-  }
-
-  return PyMethodDescriptor_FromDescriptor(method_descriptor);
-}
-
-static PyObject* GetOptions(PyBaseDescriptor *self) {
-  return GetOrBuildOptions(_GetDescriptor(self));
-}
-
-static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
-  return CopyToPythonProto<ServiceDescriptorProto>(_GetDescriptor(self),
-                                                   target);
-}
-
-static PyGetSetDef Getters[] = {
-  { "name", (getter)GetName, NULL, "Name", NULL},
-  { "full_name", (getter)GetFullName, NULL, "Full name", NULL},
-  { "file", (getter)GetFile, NULL, "File descriptor"},
-  { "index", (getter)GetIndex, NULL, "Index", NULL},
-
-  { "methods", (getter)GetMethods, NULL, "Methods", NULL},
-  { "methods_by_name", (getter)GetMethodsByName, NULL, "Methods by name", NULL},
-  {NULL}
-};
-
-static PyMethodDef Methods[] = {
-  { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS },
-  { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
-  { "FindMethodByName", (PyCFunction)FindMethodByName, METH_O },
-  {NULL}
-};
-
-}  // namespace service_descriptor
-
-PyTypeObject PyServiceDescriptor_Type = {
-  PyVarObject_HEAD_INIT(&PyType_Type, 0)
-  FULL_MODULE_NAME ".ServiceDescriptor",  // tp_name
-  sizeof(PyBaseDescriptor),             // tp_basicsize
-  0,                                    // tp_itemsize
-  0,                                    // 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 Service Descriptor",               // tp_doc
-  0,                                    // tp_traverse
-  0,                                    // tp_clear
-  0,                                    // tp_richcompare
-  0,                                    // tp_weaklistoffset
-  0,                                    // tp_iter
-  0,                                    // tp_iternext
-  service_descriptor::Methods,          // tp_methods
-  0,                                    // tp_members
-  service_descriptor::Getters,          // tp_getset
-  &descriptor::PyBaseDescriptor_Type,   // tp_base
-};
-
-PyObject* PyServiceDescriptor_FromDescriptor(
-    const ServiceDescriptor* service_descriptor) {
-  return descriptor::NewInternedDescriptor(
-      &PyServiceDescriptor_Type, service_descriptor, NULL);
-}
-
-const ServiceDescriptor* PyServiceDescriptor_AsDescriptor(PyObject* obj) {
-  if (!PyObject_TypeCheck(obj, &PyServiceDescriptor_Type)) {
-    PyErr_SetString(PyExc_TypeError, "Not a ServiceDescriptor");
-    return NULL;
-  }
-  return reinterpret_cast<const ServiceDescriptor*>(
-      reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
-}
-
-namespace method_descriptor {
-
-// Unchecked accessor to the C++ pointer.
-static const MethodDescriptor* _GetDescriptor(
-    PyBaseDescriptor *self) {
-  return reinterpret_cast<const MethodDescriptor*>(self->descriptor);
-}
-
-static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
-  return PyString_FromCppString(_GetDescriptor(self)->name());
-}
-
-static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
-  return PyString_FromCppString(_GetDescriptor(self)->full_name());
-}
-
-static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
-  return PyInt_FromLong(_GetDescriptor(self)->index());
-}
-
-static PyObject* GetContainingService(PyBaseDescriptor *self, void *closure) {
-  const ServiceDescriptor* containing_service =
-      _GetDescriptor(self)->service();
-  return PyServiceDescriptor_FromDescriptor(containing_service);
-}
-
-static PyObject* GetInputType(PyBaseDescriptor *self, void *closure) {
-  const Descriptor* input_type = _GetDescriptor(self)->input_type();
-  return PyMessageDescriptor_FromDescriptor(input_type);
-}
-
-static PyObject* GetOutputType(PyBaseDescriptor *self, void *closure) {
-  const Descriptor* output_type = _GetDescriptor(self)->output_type();
-  return PyMessageDescriptor_FromDescriptor(output_type);
-}
-
-static PyObject* GetOptions(PyBaseDescriptor *self) {
-  return GetOrBuildOptions(_GetDescriptor(self));
-}
-
-static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
-  return CopyToPythonProto<MethodDescriptorProto>(_GetDescriptor(self), target);
-}
-
-static PyGetSetDef Getters[] = {
-  { "name", (getter)GetName, NULL, "Name", NULL},
-  { "full_name", (getter)GetFullName, NULL, "Full name", NULL},
-  { "index", (getter)GetIndex, NULL, "Index", NULL},
-  { "containing_service", (getter)GetContainingService, NULL,
-    "Containing service", NULL},
-  { "input_type", (getter)GetInputType, NULL, "Input type", NULL},
-  { "output_type", (getter)GetOutputType, NULL, "Output type", NULL},
-  {NULL}
-};
-
-static PyMethodDef Methods[] = {
-  { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
-  { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
-  {NULL}
-};
-
-}  // namespace method_descriptor
-
-PyTypeObject PyMethodDescriptor_Type = {
-  PyVarObject_HEAD_INIT(&PyType_Type, 0)
-  FULL_MODULE_NAME ".MethodDescriptor",  // tp_name
-  sizeof(PyBaseDescriptor),             // tp_basicsize
-  0,                                    // tp_itemsize
-  0,                                    // 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 Method Descriptor",                // tp_doc
-  0,                                    // tp_traverse
-  0,                                    // tp_clear
-  0,                                    // tp_richcompare
-  0,                                    // tp_weaklistoffset
-  0,                                    // tp_iter
-  0,                                    // tp_iternext
-  method_descriptor::Methods,           // tp_methods
-  0,                                    // tp_members
-  method_descriptor::Getters,           // tp_getset
-  &descriptor::PyBaseDescriptor_Type,   // tp_base
-};
-
-PyObject* PyMethodDescriptor_FromDescriptor(
-    const MethodDescriptor* method_descriptor) {
-  return descriptor::NewInternedDescriptor(
-      &PyMethodDescriptor_Type, method_descriptor, NULL);
-}
-
-const MethodDescriptor* PyMethodDescriptor_AsDescriptor(PyObject* obj) {
-  if (!PyObject_TypeCheck(obj, &PyMethodDescriptor_Type)) {
-    PyErr_SetString(PyExc_TypeError, "Not a MethodDescriptor");
-    return NULL;
-  }
-  return reinterpret_cast<const MethodDescriptor*>(
-      reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
-}
-
 // Add a enum values to a type dictionary.
 static bool AddEnumValues(PyTypeObject *type,
                           const EnumDescriptor* enum_descriptor) {
@@ -1867,12 +1573,6 @@
   if (PyType_Ready(&PyOneofDescriptor_Type) < 0)
     return false;
 
-  if (PyType_Ready(&PyServiceDescriptor_Type) < 0)
-    return false;
-
-  if (PyType_Ready(&PyMethodDescriptor_Type) < 0)
-    return false;
-
   if (!InitDescriptorMappingTypes())
     return false;
 
diff --git a/python/google/protobuf/pyext/descriptor.h b/python/google/protobuf/pyext/descriptor.h
index f081df8..eb99df1 100644
--- a/python/google/protobuf/pyext/descriptor.h
+++ b/python/google/protobuf/pyext/descriptor.h
@@ -47,8 +47,6 @@
 extern PyTypeObject PyEnumValueDescriptor_Type;
 extern PyTypeObject PyFileDescriptor_Type;
 extern PyTypeObject PyOneofDescriptor_Type;
-extern PyTypeObject PyServiceDescriptor_Type;
-extern PyTypeObject PyMethodDescriptor_Type;
 
 // Wraps a Descriptor in a Python object.
 // The C++ pointer is usually borrowed from the global DescriptorPool.
@@ -62,10 +60,6 @@
 PyObject* PyOneofDescriptor_FromDescriptor(const OneofDescriptor* descriptor);
 PyObject* PyFileDescriptor_FromDescriptor(
     const FileDescriptor* file_descriptor);
-PyObject* PyServiceDescriptor_FromDescriptor(
-    const ServiceDescriptor* descriptor);
-PyObject* PyMethodDescriptor_FromDescriptor(
-    const MethodDescriptor* descriptor);
 
 // Alternate constructor of PyFileDescriptor, used when we already have a
 // serialized FileDescriptorProto that can be cached.
@@ -80,8 +74,6 @@
 const FieldDescriptor* PyFieldDescriptor_AsDescriptor(PyObject* obj);
 const EnumDescriptor* PyEnumDescriptor_AsDescriptor(PyObject* obj);
 const FileDescriptor* PyFileDescriptor_AsDescriptor(PyObject* obj);
-const ServiceDescriptor* PyServiceDescriptor_AsDescriptor(PyObject* obj);
-const MethodDescriptor* PyMethodDescriptor_AsDescriptor(PyObject* obj);
 
 // Returns the raw C++ pointer.
 const void* PyDescriptor_AsVoidPtr(PyObject* obj);
diff --git a/python/google/protobuf/pyext/descriptor_containers.cc b/python/google/protobuf/pyext/descriptor_containers.cc
index d0aae9c..e505d81 100644
--- a/python/google/protobuf/pyext/descriptor_containers.cc
+++ b/python/google/protobuf/pyext/descriptor_containers.cc
@@ -608,24 +608,6 @@
   return _NewObj_ByIndex(self, index);
 }
 
-static PyObject *
-SeqSubscript(PyContainer* self, PyObject* item) {
-  if (PyIndex_Check(item)) {
-      Py_ssize_t index;
-      index = PyNumber_AsSsize_t(item, PyExc_IndexError);
-      if (index == -1 && PyErr_Occurred())
-          return NULL;
-      return GetItem(self, index);
-  }
-  // Materialize the list and delegate the operation to it.
-  ScopedPyObjectPtr list(PyObject_CallFunctionObjArgs(
-      reinterpret_cast<PyObject*>(&PyList_Type), self, NULL));
-  if (list == NULL) {
-    return NULL;
-  }
-  return Py_TYPE(list.get())->tp_as_mapping->mp_subscript(list.get(), item);
-}
-
 // Returns the position of the item in the sequence, of -1 if not found.
 // This function never fails.
 int Find(PyContainer* self, PyObject* item) {
@@ -721,20 +703,14 @@
 };
 
 static PySequenceMethods SeqSequenceMethods = {
-  (lenfunc)Length,          // sq_length
-  0,                        // sq_concat
-  0,                        // sq_repeat
-  (ssizeargfunc)GetItem,    // sq_item
-  0,                        // sq_slice
-  0,                        // sq_ass_item
-  0,                        // sq_ass_slice
-  (objobjproc)SeqContains,  // sq_contains
-};
-
-static PyMappingMethods SeqMappingMethods = {
-  (lenfunc)Length,           // mp_length
-  (binaryfunc)SeqSubscript,  // mp_subscript
-  0,                         // mp_ass_subscript
+    (lenfunc)Length,          // sq_length
+    0,                        // sq_concat
+    0,                        // sq_repeat
+    (ssizeargfunc)GetItem,    // sq_item
+    0,                        // sq_slice
+    0,                        // sq_ass_item
+    0,                        // sq_ass_slice
+    (objobjproc)SeqContains,  // sq_contains
 };
 
 PyTypeObject DescriptorSequence_Type = {
@@ -750,7 +726,7 @@
   (reprfunc)ContainerRepr,              // tp_repr
   0,                                    // tp_as_number
   &SeqSequenceMethods,                  // tp_as_sequence
-  &SeqMappingMethods,                   // tp_as_mapping
+  0,                                    // tp_as_mapping
   0,                                    // tp_hash
   0,                                    // tp_call
   0,                                    // tp_str
@@ -1431,68 +1407,6 @@
 
 }  // namespace oneof_descriptor
 
-namespace service_descriptor {
-
-typedef const ServiceDescriptor* ParentDescriptor;
-
-static ParentDescriptor GetDescriptor(PyContainer* self) {
-  return reinterpret_cast<ParentDescriptor>(self->descriptor);
-}
-
-namespace methods {
-
-typedef const MethodDescriptor* ItemDescriptor;
-
-static int Count(PyContainer* self) {
-  return GetDescriptor(self)->method_count();
-}
-
-static ItemDescriptor GetByName(PyContainer* self, const string& name) {
-  return GetDescriptor(self)->FindMethodByName(name);
-}
-
-static ItemDescriptor GetByIndex(PyContainer* self, int index) {
-  return GetDescriptor(self)->method(index);
-}
-
-static PyObject* NewObjectFromItem(ItemDescriptor item) {
-  return PyMethodDescriptor_FromDescriptor(item);
-}
-
-static const string& GetItemName(ItemDescriptor item) {
-  return item->name();
-}
-
-static int GetItemIndex(ItemDescriptor item) {
-  return item->index();
-}
-
-static DescriptorContainerDef ContainerDef = {
-  "ServiceMethods",
-  (CountMethod)Count,
-  (GetByIndexMethod)GetByIndex,
-  (GetByNameMethod)GetByName,
-  (GetByCamelcaseNameMethod)NULL,
-  (GetByNumberMethod)NULL,
-  (NewObjectFromItemMethod)NewObjectFromItem,
-  (GetItemNameMethod)GetItemName,
-  (GetItemCamelcaseNameMethod)NULL,
-  (GetItemNumberMethod)NULL,
-  (GetItemIndexMethod)GetItemIndex,
-};
-
-}  // namespace methods
-
-PyObject* NewServiceMethodsSeq(ParentDescriptor descriptor) {
-  return descriptor::NewSequence(&methods::ContainerDef, descriptor);
-}
-
-PyObject* NewServiceMethodsByName(ParentDescriptor descriptor) {
-  return descriptor::NewMappingByName(&methods::ContainerDef, descriptor);
-}
-
-}  // namespace service_descriptor
-
 namespace file_descriptor {
 
 typedef const FileDescriptor* ParentDescriptor;
@@ -1545,7 +1459,7 @@
 
 }  // namespace messages
 
-PyObject* NewFileMessageTypesByName(ParentDescriptor descriptor) {
+PyObject* NewFileMessageTypesByName(const FileDescriptor* descriptor) {
   return descriptor::NewMappingByName(&messages::ContainerDef, descriptor);
 }
 
@@ -1593,7 +1507,7 @@
 
 }  // namespace enums
 
-PyObject* NewFileEnumTypesByName(ParentDescriptor descriptor) {
+PyObject* NewFileEnumTypesByName(const FileDescriptor* descriptor) {
   return descriptor::NewMappingByName(&enums::ContainerDef, descriptor);
 }
 
@@ -1641,58 +1555,10 @@
 
 }  // namespace extensions
 
-PyObject* NewFileExtensionsByName(ParentDescriptor descriptor) {
+PyObject* NewFileExtensionsByName(const FileDescriptor* descriptor) {
   return descriptor::NewMappingByName(&extensions::ContainerDef, descriptor);
 }
 
-namespace services {
-
-typedef const ServiceDescriptor* ItemDescriptor;
-
-static int Count(PyContainer* self) {
-  return GetDescriptor(self)->service_count();
-}
-
-static ItemDescriptor GetByName(PyContainer* self, const string& name) {
-  return GetDescriptor(self)->FindServiceByName(name);
-}
-
-static ItemDescriptor GetByIndex(PyContainer* self, int index) {
-  return GetDescriptor(self)->service(index);
-}
-
-static PyObject* NewObjectFromItem(ItemDescriptor item) {
-  return PyServiceDescriptor_FromDescriptor(item);
-}
-
-static const string& GetItemName(ItemDescriptor item) {
-  return item->name();
-}
-
-static int GetItemIndex(ItemDescriptor item) {
-  return item->index();
-}
-
-static DescriptorContainerDef ContainerDef = {
-  "FileServices",
-  (CountMethod)Count,
-  (GetByIndexMethod)GetByIndex,
-  (GetByNameMethod)GetByName,
-  (GetByCamelcaseNameMethod)NULL,
-  (GetByNumberMethod)NULL,
-  (NewObjectFromItemMethod)NewObjectFromItem,
-  (GetItemNameMethod)GetItemName,
-  (GetItemCamelcaseNameMethod)NULL,
-  (GetItemNumberMethod)NULL,
-  (GetItemIndexMethod)GetItemIndex,
-};
-
-}  // namespace services
-
-PyObject* NewFileServicesByName(const FileDescriptor* descriptor) {
-  return descriptor::NewMappingByName(&services::ContainerDef, descriptor);
-}
-
 namespace dependencies {
 
 typedef const FileDescriptor* ItemDescriptor;
diff --git a/python/google/protobuf/pyext/descriptor_containers.h b/python/google/protobuf/pyext/descriptor_containers.h
index 83de07b..ce40747 100644
--- a/python/google/protobuf/pyext/descriptor_containers.h
+++ b/python/google/protobuf/pyext/descriptor_containers.h
@@ -43,7 +43,6 @@
 class FileDescriptor;
 class EnumDescriptor;
 class OneofDescriptor;
-class ServiceDescriptor;
 
 namespace python {
 
@@ -90,17 +89,10 @@
 
 PyObject* NewFileExtensionsByName(const FileDescriptor* descriptor);
 
-PyObject* NewFileServicesByName(const FileDescriptor* descriptor);
-
 PyObject* NewFileDependencies(const FileDescriptor* descriptor);
 PyObject* NewFilePublicDependencies(const FileDescriptor* descriptor);
 }  // namespace file_descriptor
 
-namespace service_descriptor {
-PyObject* NewServiceMethodsSeq(const ServiceDescriptor* descriptor);
-PyObject* NewServiceMethodsByName(const ServiceDescriptor* descriptor);
-}  // namespace service_descriptor
-
 
 }  // namespace python
 }  // namespace protobuf
diff --git a/python/google/protobuf/pyext/descriptor_pool.cc b/python/google/protobuf/pyext/descriptor_pool.cc
index 16f4d49..1faff96 100644
--- a/python/google/protobuf/pyext/descriptor_pool.cc
+++ b/python/google/protobuf/pyext/descriptor_pool.cc
@@ -33,13 +33,12 @@
 #include <Python.h>
 
 #include <google/protobuf/descriptor.pb.h>
+#include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/pyext/descriptor.h>
 #include <google/protobuf/pyext/descriptor_database.h>
 #include <google/protobuf/pyext/descriptor_pool.h>
 #include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/stubs/hash.h>
 
 #if PY_MAJOR_VERSION >= 3
   #define PyString_FromStringAndSize PyUnicode_FromStringAndSize
@@ -74,16 +73,18 @@
   cpool->underlay = NULL;
   cpool->database = NULL;
 
+  DynamicMessageFactory* message_factory = new DynamicMessageFactory();
+  // This option might be the default some day.
+  message_factory->SetDelegateToGeneratedFactory(true);
+  cpool->message_factory = message_factory;
+
+  // TODO(amauryfa): Rewrite the SymbolDatabase in C so that it uses the same
+  // storage.
+  cpool->classes_by_descriptor =
+      new PyDescriptorPool::ClassesByMessageMap();
   cpool->descriptor_options =
       new hash_map<const void*, PyObject *>();
 
-  cpool->py_message_factory = message_factory::NewMessageFactory(
-      &PyMessageFactory_Type, cpool);
-  if (cpool->py_message_factory == NULL) {
-    Py_DECREF(cpool);
-    return NULL;
-  }
-
   return cpool;
 }
 
@@ -150,14 +151,20 @@
 }
 
 static void Dealloc(PyDescriptorPool* self) {
+  typedef PyDescriptorPool::ClassesByMessageMap::iterator iterator;
   descriptor_pool_map.erase(self->pool);
-  Py_CLEAR(self->py_message_factory);
+  for (iterator it = self->classes_by_descriptor->begin();
+       it != self->classes_by_descriptor->end(); ++it) {
+    Py_DECREF(it->second);
+  }
+  delete self->classes_by_descriptor;
   for (hash_map<const void*, PyObject*>::iterator it =
            self->descriptor_options->begin();
        it != self->descriptor_options->end(); ++it) {
     Py_DECREF(it->second);
   }
   delete self->descriptor_options;
+  delete self->message_factory;
   delete self->database;
   delete self->pool;
   Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
@@ -181,8 +188,35 @@
   return PyMessageDescriptor_FromDescriptor(message_descriptor);
 }
 
+// Add a message class to our database.
+int RegisterMessageClass(PyDescriptorPool* self,
+                         const Descriptor* message_descriptor,
+                         CMessageClass* message_class) {
+  Py_INCREF(message_class);
+  typedef PyDescriptorPool::ClassesByMessageMap::iterator iterator;
+  std::pair<iterator, bool> ret = self->classes_by_descriptor->insert(
+      std::make_pair(message_descriptor, message_class));
+  if (!ret.second) {
+    // Update case: DECREF the previous value.
+    Py_DECREF(ret.first->second);
+    ret.first->second = message_class;
+  }
+  return 0;
+}
 
-
+// Retrieve the message class added to our database.
+CMessageClass* GetMessageClass(PyDescriptorPool* self,
+                               const Descriptor* message_descriptor) {
+  typedef PyDescriptorPool::ClassesByMessageMap::iterator iterator;
+  iterator ret = self->classes_by_descriptor->find(message_descriptor);
+  if (ret == self->classes_by_descriptor->end()) {
+    PyErr_Format(PyExc_TypeError, "No message class registered for '%s'",
+                 message_descriptor->full_name().c_str());
+    return NULL;
+  } else {
+    return ret->second;
+  }
+}
 
 PyObject* FindFileByName(PyDescriptorPool* self, PyObject* arg) {
   Py_ssize_t name_size;
@@ -194,9 +228,11 @@
   const FileDescriptor* file_descriptor =
       self->pool->FindFileByName(string(name, name_size));
   if (file_descriptor == NULL) {
-    PyErr_Format(PyExc_KeyError, "Couldn't find file %.200s", name);
+    PyErr_Format(PyExc_KeyError, "Couldn't find file %.200s",
+                 name);
     return NULL;
   }
+
   return PyFileDescriptor_FromDescriptor(file_descriptor);
 }
 
@@ -269,40 +305,6 @@
   return PyOneofDescriptor_FromDescriptor(oneof_descriptor);
 }
 
-PyObject* FindServiceByName(PyDescriptorPool* self, PyObject* arg) {
-  Py_ssize_t name_size;
-  char* name;
-  if (PyString_AsStringAndSize(arg, &name, &name_size) < 0) {
-    return NULL;
-  }
-
-  const ServiceDescriptor* service_descriptor =
-      self->pool->FindServiceByName(string(name, name_size));
-  if (service_descriptor == NULL) {
-    PyErr_Format(PyExc_KeyError, "Couldn't find service %.200s", name);
-    return NULL;
-  }
-
-  return PyServiceDescriptor_FromDescriptor(service_descriptor);
-}
-
-PyObject* FindMethodByName(PyDescriptorPool* self, PyObject* arg) {
-  Py_ssize_t name_size;
-  char* name;
-  if (PyString_AsStringAndSize(arg, &name, &name_size) < 0) {
-    return NULL;
-  }
-
-  const MethodDescriptor* method_descriptor =
-      self->pool->FindMethodByName(string(name, name_size));
-  if (method_descriptor == NULL) {
-    PyErr_Format(PyExc_KeyError, "Couldn't find method %.200s", name);
-    return NULL;
-  }
-
-  return PyMethodDescriptor_FromDescriptor(method_descriptor);
-}
-
 PyObject* FindFileContainingSymbol(PyDescriptorPool* self, PyObject* arg) {
   Py_ssize_t name_size;
   char* name;
@@ -320,51 +322,6 @@
   return PyFileDescriptor_FromDescriptor(file_descriptor);
 }
 
-PyObject* FindExtensionByNumber(PyDescriptorPool* self, PyObject* args) {
-  PyObject* message_descriptor;
-  int number;
-  if (!PyArg_ParseTuple(args, "Oi", &message_descriptor, &number)) {
-    return NULL;
-  }
-  const Descriptor* descriptor = PyMessageDescriptor_AsDescriptor(
-      message_descriptor);
-  if (descriptor == NULL) {
-    return NULL;
-  }
-
-  const FieldDescriptor* extension_descriptor =
-      self->pool->FindExtensionByNumber(descriptor, number);
-  if (extension_descriptor == NULL) {
-    PyErr_Format(PyExc_KeyError, "Couldn't find extension %d", number);
-    return NULL;
-  }
-
-  return PyFieldDescriptor_FromDescriptor(extension_descriptor);
-}
-
-PyObject* FindAllExtensions(PyDescriptorPool* self, PyObject* arg) {
-  const Descriptor* descriptor = PyMessageDescriptor_AsDescriptor(arg);
-  if (descriptor == NULL) {
-    return NULL;
-  }
-
-  std::vector<const FieldDescriptor*> extensions;
-  self->pool->FindAllExtensions(descriptor, &extensions);
-
-  ScopedPyObjectPtr result(PyList_New(extensions.size()));
-  if (result == NULL) {
-    return NULL;
-  }
-  for (int i = 0; i < extensions.size(); i++) {
-    PyObject* extension = PyFieldDescriptor_FromDescriptor(extensions[i]);
-    if (extension == NULL) {
-      return NULL;
-    }
-    PyList_SET_ITEM(result.get(), i, extension);  // Steals the reference.
-  }
-  return result.release();
-}
-
 // These functions should not exist -- the only valid way to create
 // descriptors is to call Add() or AddSerializedFile().
 // But these AddDescriptor() functions were created in Python and some people
@@ -422,40 +379,9 @@
   Py_RETURN_NONE;
 }
 
-PyObject* AddExtensionDescriptor(PyDescriptorPool* self, PyObject* descriptor) {
-  const FieldDescriptor* extension_descriptor =
-      PyFieldDescriptor_AsDescriptor(descriptor);
-  if (!extension_descriptor) {
-    return NULL;
-  }
-  if (extension_descriptor !=
-      self->pool->FindExtensionByName(extension_descriptor->full_name())) {
-    PyErr_Format(PyExc_ValueError,
-                 "The extension descriptor %s does not belong to this pool",
-                 extension_descriptor->full_name().c_str());
-    return NULL;
-  }
-  Py_RETURN_NONE;
-}
-
-PyObject* AddServiceDescriptor(PyDescriptorPool* self, PyObject* descriptor) {
-  const ServiceDescriptor* service_descriptor =
-      PyServiceDescriptor_AsDescriptor(descriptor);
-  if (!service_descriptor) {
-    return NULL;
-  }
-  if (service_descriptor !=
-      self->pool->FindServiceByName(service_descriptor->full_name())) {
-    PyErr_Format(PyExc_ValueError,
-                 "The service descriptor %s does not belong to this pool",
-                 service_descriptor->full_name().c_str());
-    return NULL;
-  }
-  Py_RETURN_NONE;
-}
-
 // The code below loads new Descriptors from a serialized FileDescriptorProto.
 
+
 // Collects errors that occur during proto file building to allow them to be
 // propagated in the python exception instead of only living in ERROR logs.
 class BuildFileErrorCollector : public DescriptorPool::ErrorCollector {
@@ -552,10 +478,6 @@
     "No-op. Add() must have been called before." },
   { "AddEnumDescriptor", (PyCFunction)AddEnumDescriptor, METH_O,
     "No-op. Add() must have been called before." },
-  { "AddExtensionDescriptor", (PyCFunction)AddExtensionDescriptor, METH_O,
-    "No-op. Add() must have been called before." },
-  { "AddServiceDescriptor", (PyCFunction)AddServiceDescriptor, METH_O,
-    "No-op. Add() must have been called before." },
 
   { "FindFileByName", (PyCFunction)FindFileByName, METH_O,
     "Searches for a file descriptor by its .proto name." },
@@ -569,17 +491,9 @@
     "Searches for enum type descriptor by full name." },
   { "FindOneofByName", (PyCFunction)FindOneofByName, METH_O,
     "Searches for oneof descriptor by full name." },
-  { "FindServiceByName", (PyCFunction)FindServiceByName, METH_O,
-    "Searches for service descriptor by full name." },
-  { "FindMethodByName", (PyCFunction)FindMethodByName, METH_O,
-    "Searches for method descriptor by full name." },
 
   { "FindFileContainingSymbol", (PyCFunction)FindFileContainingSymbol, METH_O,
     "Gets the FileDescriptor containing the specified symbol." },
-  { "FindExtensionByNumber", (PyCFunction)FindExtensionByNumber, METH_VARARGS,
-    "Gets the extension descriptor for the given number." },
-  { "FindAllExtensions", (PyCFunction)FindAllExtensions, METH_O,
-    "Gets all known extensions of the given message descriptor." },
   {NULL}
 };
 
diff --git a/python/google/protobuf/pyext/descriptor_pool.h b/python/google/protobuf/pyext/descriptor_pool.h
index 53ee53d..2a42c11 100644
--- a/python/google/protobuf/pyext/descriptor_pool.h
+++ b/python/google/protobuf/pyext/descriptor_pool.h
@@ -38,9 +38,9 @@
 
 namespace google {
 namespace protobuf {
-namespace python {
+class MessageFactory;
 
-struct PyMessageFactory;
+namespace python {
 
 // The (meta) type of all Messages classes.
 struct CMessageClass;
@@ -69,10 +69,20 @@
   // This pointer is owned.
   const DescriptorDatabase* database;
 
-  // The preferred MessageFactory to be used by descriptors.
-  // TODO(amauryfa): Don't create the Factory from the DescriptorPool, but
-  // use the one passed while creating message classes. And remove this member.
-  PyMessageFactory* py_message_factory;
+  // DynamicMessageFactory used to create C++ instances of messages.
+  // This object cache the descriptors that were used, so the DescriptorPool
+  // needs to get rid of it before it can delete itself.
+  //
+  // Note: A C++ MessageFactory is different from the Python MessageFactory.
+  // The C++ one creates messages, when the Python one creates classes.
+  MessageFactory* message_factory;
+
+  // Make our own mapping to retrieve Python classes from C++ descriptors.
+  //
+  // Descriptor pointers stored here are owned by the DescriptorPool above.
+  // Python references to classes are owned by this PyDescriptorPool.
+  typedef hash_map<const Descriptor*, CMessageClass*> ClassesByMessageMap;
+  ClassesByMessageMap* classes_by_descriptor;
 
   // Cache the options for any kind of descriptor.
   // Descriptor pointers are owned by the DescriptorPool above.
@@ -85,12 +95,24 @@
 
 namespace cdescriptor_pool {
 
-
 // Looks up a message by name.
 // Returns a message Descriptor, or NULL if not found.
 const Descriptor* FindMessageTypeByName(PyDescriptorPool* self,
                                         const string& name);
 
+// Registers a new Python class for the given message descriptor.
+// On error, returns -1 with a Python exception set.
+int RegisterMessageClass(PyDescriptorPool* self,
+                         const Descriptor* message_descriptor,
+                         CMessageClass* message_class);
+
+// Retrieves the Python class registered with the given message descriptor.
+//
+// Returns a *borrowed* reference if found, otherwise returns NULL with an
+// exception set.
+CMessageClass* GetMessageClass(PyDescriptorPool* self,
+                               const Descriptor* message_descriptor);
+
 // The functions below are also exposed as methods of the DescriptorPool type.
 
 // Looks up a message by name. Returns a PyMessageDescriptor corresponding to
diff --git a/python/google/protobuf/pyext/extension_dict.cc b/python/google/protobuf/pyext/extension_dict.cc
index 6830b10..21bbb8c 100644
--- a/python/google/protobuf/pyext/extension_dict.cc
+++ b/python/google/protobuf/pyext/extension_dict.cc
@@ -32,33 +32,19 @@
 // Author: tibell@google.com (Johan Tibell)
 
 #include <google/protobuf/pyext/extension_dict.h>
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/pyext/descriptor.h>
+#include <google/protobuf/pyext/descriptor_pool.h>
 #include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
 #include <google/protobuf/pyext/repeated_composite_container.h>
 #include <google/protobuf/pyext/repeated_scalar_container.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-
-#if PY_MAJOR_VERSION >= 3
-  #if PY_VERSION_HEX < 0x03030000
-    #error "Python 3.0 - 3.2 are not supported."
-  #endif
-  #define PyString_AsStringAndSize(ob, charpp, sizep) \
-    (PyUnicode_Check(ob)? \
-       ((*(charpp) = PyUnicode_AsUTF8AndSize(ob, (sizep))) == NULL? -1: 0): \
-       PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
-#endif
+#include <google/protobuf/stubs/shared_ptr.h>
 
 namespace google {
 namespace protobuf {
@@ -74,6 +60,35 @@
 #endif
 }
 
+// TODO(tibell): Use VisitCompositeField.
+int ReleaseExtension(ExtensionDict* self,
+                     PyObject* extension,
+                     const FieldDescriptor* descriptor) {
+  if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
+    if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+      if (repeated_composite_container::Release(
+              reinterpret_cast<RepeatedCompositeContainer*>(
+                  extension)) < 0) {
+        return -1;
+      }
+    } else {
+      if (repeated_scalar_container::Release(
+              reinterpret_cast<RepeatedScalarContainer*>(
+                  extension)) < 0) {
+        return -1;
+      }
+    }
+  } else if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+    if (cmessage::ReleaseSubMessage(
+            self->parent, descriptor,
+            reinterpret_cast<CMessage*>(extension)) < 0) {
+      return -1;
+    }
+  }
+
+  return 0;
+}
+
 PyObject* subscript(ExtensionDict* self, PyObject* key) {
   const FieldDescriptor* descriptor = cmessage::GetExtensionDescriptor(key);
   if (descriptor == NULL) {
@@ -104,7 +119,6 @@
 
   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(
         self->parent, descriptor);
     if (sub_message == NULL) {
@@ -116,21 +130,9 @@
 
   if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
     if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      // On the fly message class creation is needed to support the following
-      // situation:
-      // 1- add FileDescriptor to the pool that contains extensions of a message
-      //    defined by another proto file. Do not create any message classes.
-      // 2- instantiate an extended message, and access the extension using
-      //    the field descriptor.
-      // 3- the extension submessage fails to be returned, because no class has
-      //    been created.
-      // It happens when deserializing text proto format, or when enumerating
-      // fields of a deserialized message.
-      CMessageClass* message_class = message_factory::GetOrCreateMessageClass(
-          cmessage::GetFactoryForMessage(self->parent),
+      CMessageClass* message_class = cdescriptor_pool::GetMessageClass(
+          cmessage::GetDescriptorPoolForMessage(self->parent),
           descriptor->message_type());
-      ScopedPyObjectPtr message_class_handler(
-        reinterpret_cast<PyObject*>(message_class));
       if (message_class == NULL) {
         return NULL;
       }
@@ -181,51 +183,75 @@
   return 0;
 }
 
-PyObject* _FindExtensionByName(ExtensionDict* self, PyObject* arg) {
-  char* name;
-  Py_ssize_t name_size;
-  if (PyString_AsStringAndSize(arg, &name, &name_size) < 0) {
+PyObject* ClearExtension(ExtensionDict* self, PyObject* extension) {
+  const FieldDescriptor* descriptor =
+      cmessage::GetExtensionDescriptor(extension);
+  if (descriptor == NULL) {
     return NULL;
   }
-
-  PyDescriptorPool* pool = cmessage::GetFactoryForMessage(self->parent)->pool;
-  const FieldDescriptor* message_extension =
-      pool->pool->FindExtensionByName(string(name, name_size));
-  if (message_extension == NULL) {
-    // Is is the name of a message set extension?
-    const Descriptor* message_descriptor = pool->pool->FindMessageTypeByName(
-        string(name, name_size));
-    if (message_descriptor && message_descriptor->extension_count() > 0) {
-      const FieldDescriptor* extension = message_descriptor->extension(0);
-      if (extension->is_extension() &&
-          extension->containing_type()->options().message_set_wire_format() &&
-          extension->type() == FieldDescriptor::TYPE_MESSAGE &&
-          extension->label() == FieldDescriptor::LABEL_OPTIONAL) {
-        message_extension = extension;
+  PyObject* value = PyDict_GetItem(self->values, extension);
+  if (self->parent) {
+    if (value != NULL) {
+      if (ReleaseExtension(self, value, descriptor) < 0) {
+        return NULL;
       }
     }
+    if (ScopedPyObjectPtr(cmessage::ClearFieldByDescriptor(
+            self->parent, descriptor)) == NULL) {
+      return NULL;
+    }
   }
-  if (message_extension == NULL) {
-    Py_RETURN_NONE;
+  if (PyDict_DelItem(self->values, extension) < 0) {
+    PyErr_Clear();
   }
-
-  return PyFieldDescriptor_FromDescriptor(message_extension);
+  Py_RETURN_NONE;
 }
 
-PyObject* _FindExtensionByNumber(ExtensionDict* self, PyObject* arg) {
-  int64 number = PyLong_AsLong(arg);
-  if (number == -1 && PyErr_Occurred()) {
+PyObject* HasExtension(ExtensionDict* self, PyObject* extension) {
+  const FieldDescriptor* descriptor =
+      cmessage::GetExtensionDescriptor(extension);
+  if (descriptor == NULL) {
     return NULL;
   }
-
-  PyDescriptorPool* pool = cmessage::GetFactoryForMessage(self->parent)->pool;
-  const FieldDescriptor* message_extension = pool->pool->FindExtensionByNumber(
-      self->parent->message->GetDescriptor(), number);
-  if (message_extension == NULL) {
-    Py_RETURN_NONE;
+  if (self->parent) {
+    return cmessage::HasFieldByDescriptor(self->parent, descriptor);
+  } else {
+    int exists = PyDict_Contains(self->values, extension);
+    if (exists < 0) {
+      return NULL;
+    }
+    return PyBool_FromLong(exists);
   }
+}
 
-  return PyFieldDescriptor_FromDescriptor(message_extension);
+PyObject* _FindExtensionByName(ExtensionDict* self, PyObject* name) {
+  ScopedPyObjectPtr extensions_by_name(PyObject_GetAttrString(
+      reinterpret_cast<PyObject*>(self->parent), "_extensions_by_name"));
+  if (extensions_by_name == NULL) {
+    return NULL;
+  }
+  PyObject* result = PyDict_GetItem(extensions_by_name.get(), name);
+  if (result == NULL) {
+    Py_RETURN_NONE;
+  } else {
+    Py_INCREF(result);
+    return result;
+  }
+}
+
+PyObject* _FindExtensionByNumber(ExtensionDict* self, PyObject* number) {
+  ScopedPyObjectPtr extensions_by_number(PyObject_GetAttrString(
+      reinterpret_cast<PyObject*>(self->parent), "_extensions_by_number"));
+  if (extensions_by_number == NULL) {
+    return NULL;
+  }
+  PyObject* result = PyDict_GetItem(extensions_by_number.get(), number);
+  if (result == NULL) {
+    Py_RETURN_NONE;
+  } else {
+    Py_INCREF(result);
+    return result;
+  }
 }
 
 ExtensionDict* NewExtensionDict(CMessage *parent) {
@@ -256,6 +282,8 @@
 
 #define EDMETHOD(name, args, doc) { #name, (PyCFunction)name, args, doc }
 static PyMethodDef Methods[] = {
+  EDMETHOD(ClearExtension, METH_O, "Clears an extension from the object."),
+  EDMETHOD(HasExtension, METH_O, "Checks if the object has an extension."),
   EDMETHOD(_FindExtensionByName, METH_O,
            "Finds an extension by name."),
   EDMETHOD(_FindExtensionByNumber, METH_O,
diff --git a/python/google/protobuf/pyext/extension_dict.h b/python/google/protobuf/pyext/extension_dict.h
index 65b8786..2456eda 100644
--- a/python/google/protobuf/pyext/extension_dict.h
+++ b/python/google/protobuf/pyext/extension_dict.h
@@ -86,6 +86,49 @@
 // Builds an Extensions dict for a specific message.
 ExtensionDict* NewExtensionDict(CMessage *parent);
 
+// Gets the number of extension values in this ExtensionDict as a python object.
+//
+// Returns a new reference.
+PyObject* len(ExtensionDict* self);
+
+// Releases extensions referenced outside this dictionary to keep outside
+// references alive.
+//
+// Returns 0 on success, -1 on failure.
+int ReleaseExtension(ExtensionDict* self,
+                     PyObject* extension,
+                     const FieldDescriptor* descriptor);
+
+// Gets an extension from the dict for the given extension descriptor.
+//
+// Returns a new reference.
+PyObject* subscript(ExtensionDict* self, PyObject* key);
+
+// Assigns a value to an extension in the dict. Can only be used for singular
+// simple types.
+//
+// Returns 0 on success, -1 on failure.
+int ass_subscript(ExtensionDict* self, PyObject* key, PyObject* value);
+
+// Clears an extension from the dict. Will release the extension if there
+// is still an external reference left to it.
+//
+// Returns None on success.
+PyObject* ClearExtension(ExtensionDict* self,
+                                       PyObject* extension);
+
+// Gets an extension from the dict given the extension name as opposed to
+// descriptor.
+//
+// Returns a new reference.
+PyObject* _FindExtensionByName(ExtensionDict* self, PyObject* name);
+
+// Gets an extension from the dict given the extension field number as
+// opposed to descriptor.
+//
+// Returns a new reference.
+PyObject* _FindExtensionByNumber(ExtensionDict* self, PyObject* number);
+
 }  // namespace extension_dict
 }  // namespace python
 }  // namespace protobuf
diff --git a/python/google/protobuf/pyext/map_container.cc b/python/google/protobuf/pyext/map_container.cc
index abd15b7..e022406 100644
--- a/python/google/protobuf/pyext/map_container.cc
+++ b/python/google/protobuf/pyext/map_container.cc
@@ -39,12 +39,11 @@
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 #include <google/protobuf/map_field.h>
 #include <google/protobuf/map.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/pyext/message_factory.h>
 #include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/repeated_composite_container.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
 
 #if PY_MAJOR_VERSION >= 3
@@ -330,15 +329,6 @@
   Py_RETURN_NONE;
 }
 
-PyObject* GetEntryClass(PyObject* _self) {
-  MapContainer* self = GetMap(_self);
-  CMessageClass* message_class = message_factory::GetMessageClass(
-      cmessage::GetFactoryForMessage(self->parent),
-      self->parent_field_descriptor->message_type());
-  Py_XINCREF(message_class);
-  return reinterpret_cast<PyObject*>(message_class);
-}
-
 PyObject* MapReflectionFriend::Contains(PyObject* _self, PyObject* key) {
   MapContainer* self = GetMap(_self);
 
@@ -359,10 +349,9 @@
 }
 
 // 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
+// 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).
-// 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
@@ -374,7 +363,7 @@
     // 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;
+    vector<const FieldDescriptor*> fields;
     fields.push_back(from->parent_field_descriptor);
 
     // Move the map field into the new message.
@@ -411,7 +400,12 @@
     return NULL;
   }
 
-  ScopedPyObjectPtr obj(PyType_GenericAlloc(ScalarMapContainer_Type, 0));
+#if PY_MAJOR_VERSION >= 3
+  ScopedPyObjectPtr obj(PyType_GenericAlloc(
+        reinterpret_cast<PyTypeObject *>(ScalarMapContainer_Type), 0));
+#else
+  ScopedPyObjectPtr obj(PyType_GenericAlloc(&ScalarMapContainer_Type, 0));
+#endif
   if (obj.get() == NULL) {
     return PyErr_Format(PyExc_RuntimeError,
                         "Could not allocate new container.");
@@ -533,8 +527,6 @@
     "Removes all elements from the map." },
   { "get", ScalarMapGet, METH_VARARGS,
     "Gets the value for the given key if present, or otherwise a default" },
-  { "GetEntryClass", (PyCFunction)GetEntryClass, METH_NOARGS,
-    "Return the class used to build Entries of (key, value) pairs." },
   /*
   { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS,
     "Makes a deep copy of the class." },
@@ -544,7 +536,6 @@
   {NULL, NULL},
 };
 
-PyTypeObject *ScalarMapContainer_Type;
 #if PY_MAJOR_VERSION >= 3
   static PyType_Slot ScalarMapContainer_Type_slots[] = {
       {Py_tp_dealloc, (void *)ScalarMapDealloc},
@@ -563,6 +554,7 @@
       Py_TPFLAGS_DEFAULT,
       ScalarMapContainer_Type_slots
   };
+  PyObject *ScalarMapContainer_Type;
 #else
   static PyMappingMethods ScalarMapMappingMethods = {
     MapReflectionFriend::Length,             // mp_length
@@ -570,7 +562,7 @@
     MapReflectionFriend::ScalarMapSetItem,   // mp_ass_subscript
   };
 
-  PyTypeObject _ScalarMapContainer_Type = {
+  PyTypeObject ScalarMapContainer_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     FULL_MODULE_NAME ".ScalarMapContainer",  //  tp_name
     sizeof(MapContainer),                //  tp_basicsize
@@ -651,7 +643,12 @@
     return NULL;
   }
 
-  PyObject* obj = PyType_GenericAlloc(MessageMapContainer_Type, 0);
+#if PY_MAJOR_VERSION >= 3
+  PyObject* obj = PyType_GenericAlloc(
+        reinterpret_cast<PyTypeObject *>(MessageMapContainer_Type), 0);
+#else
+  PyObject* obj = PyType_GenericAlloc(&MessageMapContainer_Type, 0);
+#endif
   if (obj == NULL) {
     return PyErr_Format(PyExc_RuntimeError,
                         "Could not allocate new container.");
@@ -712,33 +709,8 @@
   }
 
   // Delete key from map.
-  if (reflection->ContainsMapKey(*message, self->parent_field_descriptor,
+  if (reflection->DeleteMapValue(message, self->parent_field_descriptor,
                                  map_key)) {
-    // Delete key from CMessage dict.
-    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;
-      }
-    }
-
-    // Delete key from map.
-    reflection->DeleteMapValue(message, self->parent_field_descriptor,
-                               map_key);
     return 0;
   } else {
     PyErr_Format(PyExc_KeyError, "Key not present in map");
@@ -808,8 +780,6 @@
     "Gets the value for the given key if present, or otherwise a default" },
   { "get_or_create", MapReflectionFriend::MessageMapGetItem, METH_O,
     "Alias for getitem, useful to make explicit that the map is mutated." },
-  { "GetEntryClass", (PyCFunction)GetEntryClass, METH_NOARGS,
-    "Return the class used to build Entries of (key, value) pairs." },
   /*
   { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS,
     "Makes a deep copy of the class." },
@@ -819,7 +789,6 @@
   {NULL, NULL},
 };
 
-PyTypeObject *MessageMapContainer_Type;
 #if PY_MAJOR_VERSION >= 3
   static PyType_Slot MessageMapContainer_Type_slots[] = {
       {Py_tp_dealloc, (void *)MessageMapDealloc},
@@ -838,6 +807,8 @@
       Py_TPFLAGS_DEFAULT,
       MessageMapContainer_Type_slots
   };
+
+  PyObject *MessageMapContainer_Type;
 #else
   static PyMappingMethods MessageMapMappingMethods = {
     MapReflectionFriend::Length,              // mp_length
@@ -845,7 +816,7 @@
     MapReflectionFriend::MessageMapSetItem,   // mp_ass_subscript
   };
 
-  PyTypeObject _MessageMapContainer_Type = {
+  PyTypeObject MessageMapContainer_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     FULL_MODULE_NAME ".MessageMapContainer",  //  tp_name
     sizeof(MessageMapContainer),         //  tp_basicsize
@@ -994,63 +965,6 @@
   0,                                   //  tp_init
 };
 
-bool InitMapContainers() {
-  // ScalarMapContainer_Type derives from our MutableMapping type.
-  ScopedPyObjectPtr containers(PyImport_ImportModule(
-      "google.protobuf.internal.containers"));
-  if (containers == NULL) {
-    return false;
-  }
-
-  ScopedPyObjectPtr mutable_mapping(
-      PyObject_GetAttrString(containers.get(), "MutableMapping"));
-  if (mutable_mapping == NULL) {
-    return false;
-  }
-
-  if (!PyObject_TypeCheck(mutable_mapping.get(), &PyType_Type)) {
-    return false;
-  }
-
-  Py_INCREF(mutable_mapping.get());
-#if PY_MAJOR_VERSION >= 3
-  PyObject* bases = PyTuple_New(1);
-  PyTuple_SET_ITEM(bases, 0, mutable_mapping.get());
-
-  ScalarMapContainer_Type = reinterpret_cast<PyTypeObject*>(
-      PyType_FromSpecWithBases(&ScalarMapContainer_Type_spec, bases));
-#else
-  _ScalarMapContainer_Type.tp_base =
-      reinterpret_cast<PyTypeObject*>(mutable_mapping.get());
-
-  if (PyType_Ready(&_ScalarMapContainer_Type) < 0) {
-    return false;
-  }
-
-  ScalarMapContainer_Type = &_ScalarMapContainer_Type;
-#endif
-
-  if (PyType_Ready(&MapIterator_Type) < 0) {
-    return false;
-  }
-
-#if PY_MAJOR_VERSION >= 3
-  MessageMapContainer_Type = reinterpret_cast<PyTypeObject*>(
-      PyType_FromSpecWithBases(&MessageMapContainer_Type_spec, bases));
-#else
-  Py_INCREF(mutable_mapping.get());
-  _MessageMapContainer_Type.tp_base =
-      reinterpret_cast<PyTypeObject*>(mutable_mapping.get());
-
-  if (PyType_Ready(&_MessageMapContainer_Type) < 0) {
-    return false;
-  }
-
-  MessageMapContainer_Type = &_MessageMapContainer_Type;
-#endif
-  return true;
-}
-
 }  // namespace python
 }  // namespace protobuf
 }  // namespace google
diff --git a/python/google/protobuf/pyext/map_container.h b/python/google/protobuf/pyext/map_container.h
index 615657b..fbd6713 100644
--- a/python/google/protobuf/pyext/map_container.h
+++ b/python/google/protobuf/pyext/map_container.h
@@ -112,10 +112,16 @@
   PyObject* message_dict;
 };
 
-bool InitMapContainers();
+#if PY_MAJOR_VERSION >= 3
+  extern PyObject *MessageMapContainer_Type;
+  extern PyType_Spec MessageMapContainer_Type_spec;
+  extern PyObject *ScalarMapContainer_Type;
+  extern PyType_Spec ScalarMapContainer_Type_spec;
+#else
+  extern PyTypeObject MessageMapContainer_Type;
+  extern PyTypeObject ScalarMapContainer_Type;
+#endif
 
-extern PyTypeObject* MessageMapContainer_Type;
-extern PyTypeObject* ScalarMapContainer_Type;
 extern PyTypeObject MapIterator_Type;  // Both map types use the same iterator.
 
 // Builds a MapContainer object, from a parent message and a
diff --git a/python/google/protobuf/pyext/message.cc b/python/google/protobuf/pyext/message.cc
index ef75aca..83c151f 100644
--- a/python/google/protobuf/pyext/message.cc
+++ b/python/google/protobuf/pyext/message.cc
@@ -52,7 +52,6 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 #include <google/protobuf/util/message_differencer.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/message.h>
@@ -64,11 +63,11 @@
 #include <google/protobuf/pyext/repeated_composite_container.h>
 #include <google/protobuf/pyext/repeated_scalar_container.h>
 #include <google/protobuf/pyext/map_container.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/safe_numerics.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include <google/protobuf/stubs/strutil.h>
 
 #if PY_MAJOR_VERSION >= 3
+  #define PyInt_Check PyLong_Check
   #define PyInt_AsLong PyLong_AsLong
   #define PyInt_FromLong PyLong_FromLong
   #define PyInt_FromSize_t PyLong_FromSize_t
@@ -92,6 +91,8 @@
 namespace python {
 
 static PyObject* kDESCRIPTOR;
+static PyObject* k_extensions_by_name;
+static PyObject* k_extensions_by_number;
 PyObject* EnumTypeWrapper_class;
 static PyObject* PythonMessage_class;
 static PyObject* kEmptyWeakref;
@@ -101,17 +102,6 @@
 
 static int InsertEmptyWeakref(PyTypeObject* base);
 
-namespace {
-// Copied oveer from internal 'google/protobuf/stubs/strutil.h'.
-inline void UpperString(string * s) {
-  string::iterator end = s->end();
-  for (string::iterator i = s->begin(); i != end; ++i) {
-    // toupper() changes based on locale.  We don't want this!
-    if ('a' <= *i && *i <= 'z') *i += 'A' - 'a';
-  }
-}
-}
-
 // Add the number of a field descriptor to the containing message class.
 // Equivalent to:
 //   _cls.<field>_FIELD_NUMBER = <number>
@@ -137,6 +127,19 @@
 
 // Finalize the creation of the Message class.
 static int AddDescriptors(PyObject* cls, const Descriptor* descriptor) {
+  // If there are extension_ranges, the message is "extendable", and extension
+  // classes will register themselves in this class.
+  if (descriptor->extension_range_count() > 0) {
+    ScopedPyObjectPtr by_name(PyDict_New());
+    if (PyObject_SetAttr(cls, k_extensions_by_name, by_name.get()) < 0) {
+      return -1;
+    }
+    ScopedPyObjectPtr by_number(PyDict_New());
+    if (PyObject_SetAttr(cls, k_extensions_by_number, by_number.get()) < 0) {
+      return -1;
+    }
+  }
+
   // For each field set: cls.<field>_FIELD_NUMBER = <number>
   for (int i = 0; i < descriptor->field_count(); ++i) {
     if (!AddFieldNumberToClass(cls, descriptor->field(i))) {
@@ -241,12 +244,6 @@
     return NULL;
   }
 
-  // Messages have no __dict__
-  ScopedPyObjectPtr slots(PyTuple_New(0));
-  if (PyDict_SetItemString(dict, "__slots__", slots.get()) < 0) {
-    return NULL;
-  }
-
   // Build the arguments to the base metaclass.
   // We change the __bases__ classes.
   ScopedPyObjectPtr new_args;
@@ -303,19 +300,16 @@
   newtype->message_descriptor = descriptor;
   // TODO(amauryfa): Don't always use the canonical pool of the descriptor,
   // use the MessageFactory optionally passed in the class dict.
-  PyDescriptorPool* py_descriptor_pool =
-      GetDescriptorPool_FromPool(descriptor->file()->pool());
-  if (py_descriptor_pool == NULL) {
+  newtype->py_descriptor_pool = GetDescriptorPool_FromPool(
+      descriptor->file()->pool());
+  if (newtype->py_descriptor_pool == NULL) {
     return NULL;
   }
-  newtype->py_message_factory = py_descriptor_pool->py_message_factory;
-  Py_INCREF(newtype->py_message_factory);
+  Py_INCREF(newtype->py_descriptor_pool);
 
-  // Register the message in the MessageFactory.
-  // TODO(amauryfa): Move this call to MessageFactory.GetPrototype() when the
-  // MessageFactory is fully implemented in C++.
-  if (message_factory::RegisterMessageClass(newtype->py_message_factory,
-                                            descriptor, newtype) < 0) {
+  // Add the message to the DescriptorPool.
+  if (cdescriptor_pool::RegisterMessageClass(newtype->py_descriptor_pool,
+                                             descriptor, newtype) < 0) {
     return NULL;
   }
 
@@ -327,8 +321,8 @@
 }
 
 static void Dealloc(CMessageClass *self) {
-  Py_XDECREF(self->py_message_descriptor);
-  Py_XDECREF(self->py_message_factory);
+  Py_DECREF(self->py_message_descriptor);
+  Py_DECREF(self->py_descriptor_pool);
   Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
 }
 
@@ -353,61 +347,6 @@
 #endif  // PY_MAJOR_VERSION >= 3
 }
 
-// The _extensions_by_name dictionary is built on every access.
-// TODO(amauryfa): Migrate all users to pool.FindAllExtensions()
-static PyObject* GetExtensionsByName(CMessageClass *self, void *closure) {
-  const PyDescriptorPool* pool = self->py_message_factory->pool;
-
-  std::vector<const FieldDescriptor*> extensions;
-  pool->pool->FindAllExtensions(self->message_descriptor, &extensions);
-
-  ScopedPyObjectPtr result(PyDict_New());
-  for (int i = 0; i < extensions.size(); i++) {
-    ScopedPyObjectPtr extension(
-        PyFieldDescriptor_FromDescriptor(extensions[i]));
-    if (extension == NULL) {
-      return NULL;
-    }
-    if (PyDict_SetItemString(result.get(), extensions[i]->full_name().c_str(),
-                             extension.get()) < 0) {
-      return NULL;
-    }
-  }
-  return result.release();
-}
-
-// The _extensions_by_number dictionary is built on every access.
-// TODO(amauryfa): Migrate all users to pool.FindExtensionByNumber()
-static PyObject* GetExtensionsByNumber(CMessageClass *self, void *closure) {
-  const PyDescriptorPool* pool = self->py_message_factory->pool;
-
-  std::vector<const FieldDescriptor*> extensions;
-  pool->pool->FindAllExtensions(self->message_descriptor, &extensions);
-
-  ScopedPyObjectPtr result(PyDict_New());
-  for (int i = 0; i < extensions.size(); i++) {
-    ScopedPyObjectPtr extension(
-        PyFieldDescriptor_FromDescriptor(extensions[i]));
-    if (extension == NULL) {
-      return NULL;
-    }
-    ScopedPyObjectPtr number(PyInt_FromLong(extensions[i]->number()));
-    if (number == NULL) {
-      return NULL;
-    }
-    if (PyDict_SetItem(result.get(), number.get(), extension.get()) < 0) {
-      return NULL;
-    }
-  }
-  return result.release();
-}
-
-static PyGetSetDef Getters[] = {
-  {"_extensions_by_name", (getter)GetExtensionsByName, NULL},
-  {"_extensions_by_number", (getter)GetExtensionsByNumber, NULL},
-  {NULL}
-};
-
 }  // namespace message_meta
 
 PyTypeObject CMessageClass_Type = {
@@ -440,7 +379,7 @@
   0,                                   // tp_iternext
   0,                                   // tp_methods
   0,                                   // tp_members
-  message_meta::Getters,               // tp_getset
+  0,                                   // tp_getset
   0,                                   // tp_base
   0,                                   // tp_dict
   0,                                   // tp_descr_get
@@ -576,10 +515,23 @@
 
 // ---------------------------------------------------------------------
 
+// Constants used for integer type range checking.
+PyObject* kPythonZero;
+PyObject* kint32min_py;
+PyObject* kint32max_py;
+PyObject* kuint32max_py;
+PyObject* kint64min_py;
+PyObject* kint64max_py;
+PyObject* kuint64max_py;
+
 PyObject* EncodeError_class;
 PyObject* DecodeError_class;
 PyObject* PickleError_class;
 
+// Constant PyString values used for GetAttr/GetItem.
+static PyObject* k_cdescriptor;
+static PyObject* kfull_name;
+
 /* Is 64bit */
 void FormatTypeError(PyObject* arg, char* expected_types) {
   PyObject* repr = PyObject_Repr(arg);
@@ -593,135 +545,68 @@
   }
 }
 
-void OutOfRangeError(PyObject* arg) {
-  PyObject *s = PyObject_Str(arg);
-  if (s) {
-    PyErr_Format(PyExc_ValueError,
-                 "Value out of range: %s",
-                 PyString_AsString(s));
-    Py_DECREF(s);
-  }
-}
-
-template<class RangeType, class ValueType>
-bool VerifyIntegerCastAndRange(PyObject* arg, ValueType value) {
-  if
-    GOOGLE_PREDICT_FALSE(value == -1 && PyErr_Occurred()) {
-      if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
-        // Replace it with the same ValueError as pure python protos instead of
-        // the default one.
-        PyErr_Clear();
-        OutOfRangeError(arg);
-      }  // Otherwise propagate existing error.
-      return false;
-    }
-  if
-    GOOGLE_PREDICT_FALSE(!IsValidNumericCast<RangeType>(value)) {
-      OutOfRangeError(arg);
-      return false;
-    }
-  return true;
-}
-
 template<class T>
-bool CheckAndGetInteger(PyObject* arg, T* value) {
-  // The fast path.
+bool CheckAndGetInteger(
+    PyObject* arg, T* value, PyObject* min, PyObject* max) {
+  bool is_long = PyLong_Check(arg);
 #if PY_MAJOR_VERSION < 3
-  // For the typical case, offer a fast path.
-  if
-    GOOGLE_PREDICT_TRUE(PyInt_Check(arg)) {
-      long int_result = PyInt_AsLong(arg);
-      if
-        GOOGLE_PREDICT_TRUE(IsValidNumericCast<T>(int_result)) {
-          *value = static_cast<T>(int_result);
-          return true;
-        }
-      else {
-        OutOfRangeError(arg);
-        return false;
+  if (!PyInt_Check(arg) && !is_long) {
+    FormatTypeError(arg, "int, long");
+    return false;
+  }
+  if (PyObject_Compare(min, arg) > 0 || PyObject_Compare(max, arg) < 0) {
+#else
+  if (!is_long) {
+    FormatTypeError(arg, "int");
+    return false;
+  }
+  if (PyObject_RichCompareBool(min, arg, Py_LE) != 1 ||
+      PyObject_RichCompareBool(max, arg, Py_GE) != 1) {
+#endif
+    if (!PyErr_Occurred()) {
+      PyObject *s = PyObject_Str(arg);
+      if (s) {
+        PyErr_Format(PyExc_ValueError,
+                     "Value out of range: %s",
+                     PyString_AsString(s));
+        Py_DECREF(s);
       }
     }
+    return false;
+  }
+#if PY_MAJOR_VERSION < 3
+  if (!is_long) {
+    *value = static_cast<T>(PyInt_AsLong(arg));
+  } else  // NOLINT
 #endif
-  // This effectively defines an integer as "an object that can be cast as
-  // an integer and can be used as an ordinal number".
-  // This definition includes everything that implements numbers.Integral
-  // and shouldn't cast the net too wide.
-  if
-    GOOGLE_PREDICT_FALSE(!PyIndex_Check(arg)) {
-      FormatTypeError(arg, "int, long");
-      return false;
-    }
-
-  // Now we have an integral number so we can safely use PyLong_ functions.
-  // We need to treat the signed and unsigned cases differently in case arg is
-  // holding a value above the maximum for signed longs.
-  if (std::numeric_limits<T>::min() == 0) {
-    // Unsigned case.
-    unsigned PY_LONG_LONG ulong_result;
-    if (PyLong_Check(arg)) {
-      ulong_result = PyLong_AsUnsignedLongLong(arg);
+  {
+    if (min == kPythonZero) {
+      *value = static_cast<T>(PyLong_AsUnsignedLongLong(arg));
     } else {
-      // Unlike PyLong_AsLongLong, PyLong_AsUnsignedLongLong is very
-      // picky about the exact type.
-      PyObject* casted = PyNumber_Long(arg);
-      if
-        GOOGLE_PREDICT_FALSE(casted == NULL) {
-          // Propagate existing error.
-          return false;
-        }
-      ulong_result = PyLong_AsUnsignedLongLong(casted);
-      Py_DECREF(casted);
-    }
-    if (VerifyIntegerCastAndRange<T, unsigned PY_LONG_LONG>(arg,
-                                                            ulong_result)) {
-      *value = static_cast<T>(ulong_result);
-    } else {
-      return false;
-    }
-  } else {
-    // Signed case.
-    PY_LONG_LONG long_result;
-    PyNumberMethods *nb;
-    if ((nb = arg->ob_type->tp_as_number) != NULL && nb->nb_int != NULL) {
-      // PyLong_AsLongLong requires it to be a long or to have an __int__()
-      // method.
-      long_result = PyLong_AsLongLong(arg);
-    } else {
-      // Valid subclasses of numbers.Integral should have a __long__() method
-      // so fall back to that.
-      PyObject* casted = PyNumber_Long(arg);
-      if
-        GOOGLE_PREDICT_FALSE(casted == NULL) {
-          // Propagate existing error.
-          return false;
-        }
-      long_result = PyLong_AsLongLong(casted);
-      Py_DECREF(casted);
-    }
-    if (VerifyIntegerCastAndRange<T, PY_LONG_LONG>(arg, long_result)) {
-      *value = static_cast<T>(long_result);
-    } else {
-      return false;
+      *value = static_cast<T>(PyLong_AsLongLong(arg));
     }
   }
-
   return true;
 }
 
 // These are referenced by repeated_scalar_container, and must
 // be explicitly instantiated.
-template bool CheckAndGetInteger<int32>(PyObject*, int32*);
-template bool CheckAndGetInteger<int64>(PyObject*, int64*);
-template bool CheckAndGetInteger<uint32>(PyObject*, uint32*);
-template bool CheckAndGetInteger<uint64>(PyObject*, uint64*);
+template bool CheckAndGetInteger<int32>(
+    PyObject*, int32*, PyObject*, PyObject*);
+template bool CheckAndGetInteger<int64>(
+    PyObject*, int64*, PyObject*, PyObject*);
+template bool CheckAndGetInteger<uint32>(
+    PyObject*, uint32*, PyObject*, PyObject*);
+template bool CheckAndGetInteger<uint64>(
+    PyObject*, uint64*, PyObject*, PyObject*);
 
 bool CheckAndGetDouble(PyObject* arg, double* value) {
+  if (!PyInt_Check(arg) && !PyLong_Check(arg) &&
+      !PyFloat_Check(arg)) {
+    FormatTypeError(arg, "int, long, float");
+    return false;
+  }
   *value = PyFloat_AsDouble(arg);
-  if
-    GOOGLE_PREDICT_FALSE(*value == -1 && PyErr_Occurred()) {
-      FormatTypeError(arg, "int, long, float");
-      return false;
-    }
   return true;
 }
 
@@ -735,13 +620,11 @@
 }
 
 bool CheckAndGetBool(PyObject* arg, bool* value) {
-  long long_value = PyInt_AsLong(arg);
-  if (long_value == -1 && PyErr_Occurred()) {
+  if (!PyInt_Check(arg) && !PyBool_Check(arg) && !PyLong_Check(arg)) {
     FormatTypeError(arg, "int, long, bool");
     return false;
   }
-  *value = static_cast<bool>(long_value);
-
+  *value = static_cast<bool>(PyInt_AsLong(arg));
   return true;
 }
 
@@ -799,7 +682,7 @@
       encoded_string = arg;  // Already encoded.
       Py_INCREF(encoded_string);
     } else {
-      encoded_string = PyUnicode_AsEncodedString(arg, "utf-8", NULL);
+      encoded_string = PyUnicode_AsEncodedObject(arg, "utf-8", NULL);
     }
   } else {
     // In this case field type is "bytes".
@@ -869,9 +752,15 @@
 
 namespace cmessage {
 
-PyMessageFactory* GetFactoryForMessage(CMessage* message) {
+PyDescriptorPool* GetDescriptorPoolForMessage(CMessage* message) {
+  // No need to check the type: the type of instances of CMessage is always
+  // an instance of CMessageClass. Let's prove it with a debug-only check.
   GOOGLE_DCHECK(PyObject_TypeCheck(message, &CMessage_Type));
-  return reinterpret_cast<CMessageClass*>(Py_TYPE(message))->py_message_factory;
+  return reinterpret_cast<CMessageClass*>(Py_TYPE(message))->py_descriptor_pool;
+}
+
+MessageFactory* GetFactoryForMessage(CMessage* message) {
+  return GetDescriptorPoolForMessage(message)->message_factory;
 }
 
 static int MaybeReleaseOverlappingOneofField(
@@ -924,8 +813,7 @@
     return NULL;
   }
   return reflection->MutableMessage(
-      parent_message, parent_field,
-      GetFactoryForMessage(parent)->message_factory);
+      parent_message, parent_field, GetFactoryForMessage(parent));
 }
 
 struct FixupMessageReference : public ChildVisitor {
@@ -1073,31 +961,8 @@
   int min, max;
   length = reflection->FieldSize(*message, field_descriptor);
 
-  if (PySlice_Check(slice)) {
-    from = to = step = slice_length = 0;
-#if PY_MAJOR_VERSION < 3
-    PySlice_GetIndicesEx(
-        reinterpret_cast<PySliceObject*>(slice),
-        length, &from, &to, &step, &slice_length);
-#else
-    PySlice_GetIndicesEx(
-        slice,
-        length, &from, &to, &step, &slice_length);
-#endif
-    if (from < to) {
-      min = from;
-      max = to - 1;
-    } else {
-      min = to + 1;
-      max = from;
-    }
-  } else {
+  if (PyInt_Check(slice) || PyLong_Check(slice)) {
     from = to = PyLong_AsLong(slice);
-    if (from == -1 && PyErr_Occurred()) {
-      PyErr_SetString(PyExc_TypeError, "list indices must be integers");
-      return -1;
-    }
-
     if (from < 0) {
       from = to = length + from;
     }
@@ -1109,6 +974,25 @@
       PyErr_Format(PyExc_IndexError, "list assignment index out of range");
       return -1;
     }
+  } else if (PySlice_Check(slice)) {
+    from = to = step = slice_length = 0;
+    PySlice_GetIndicesEx(
+#if PY_MAJOR_VERSION < 3
+        reinterpret_cast<PySliceObject*>(slice),
+#else
+        slice,
+#endif
+        length, &from, &to, &step, &slice_length);
+    if (from < to) {
+      min = from;
+      max = to - 1;
+    } else {
+      min = to + 1;
+      max = from;
+    }
+  } else {
+    PyErr_SetString(PyExc_TypeError, "list indices must be integers");
+    return -1;
   }
 
   Py_ssize_t i = from;
@@ -1157,12 +1041,7 @@
 }
 
 // Initializes fields of a message. Used in constructors.
-int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs) {
-  if (args != NULL && PyTuple_Size(args) != 0) {
-    PyErr_SetString(PyExc_TypeError, "No positional arguments allowed");
-    return -1;
-  }
-
+int InitAttributes(CMessage* self, PyObject* kwargs) {
   if (kwargs == NULL) {
     return 0;
   }
@@ -1288,9 +1167,7 @@
       }
       CMessage* cmessage = reinterpret_cast<CMessage*>(message.get());
       if (PyDict_Check(value)) {
-        // Make the message exist even if the dict is empty.
-        AssureWritable(cmessage);
-        if (InitAttributes(cmessage, NULL, value) < 0) {
+        if (InitAttributes(cmessage, value) < 0) {
           return -1;
         }
       } else {
@@ -1349,7 +1226,7 @@
   if (message_descriptor == NULL) {
     return NULL;
   }
-  const Message* default_message = type->py_message_factory->message_factory
+  const Message* default_message = type->py_descriptor_pool->message_factory
                                    ->GetPrototype(message_descriptor);
   if (default_message == NULL) {
     PyErr_SetString(PyExc_TypeError, message_descriptor->full_name().c_str());
@@ -1368,7 +1245,12 @@
 // The __init__ method of Message classes.
 // It initializes fields from keywords passed to the constructor.
 static int Init(CMessage* self, PyObject* args, PyObject* kwargs) {
-  return InitAttributes(self, args, kwargs);
+  if (PyTuple_Size(args) != 0) {
+    PyErr_SetString(PyExc_TypeError, "No positional arguments allowed");
+    return -1;
+  }
+
+  return InitAttributes(self, kwargs);
 }
 
 // ---------------------------------------------------------------------
@@ -1410,9 +1292,6 @@
 };
 
 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->extensions) {
@@ -1562,25 +1441,36 @@
   if (message->GetReflection()->HasField(*message, field_descriptor)) {
     Py_RETURN_TRUE;
   }
-
+  if (!message->GetReflection()->SupportsUnknownEnumValues() &&
+      field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
+    // Special case: Python HasField() differs in semantics from C++
+    // slightly: we return HasField('enum_field') == true if there is
+    // an unknown enum value present. To implement this we have to
+    // look in the UnknownFieldSet.
+    const UnknownFieldSet& unknown_field_set =
+        message->GetReflection()->GetUnknownFields(*message);
+    for (int i = 0; i < unknown_field_set.field_count(); ++i) {
+      if (unknown_field_set.field(i).number() == field_descriptor->number()) {
+        Py_RETURN_TRUE;
+      }
+    }
+  }
   Py_RETURN_FALSE;
 }
 
 PyObject* ClearExtension(CMessage* self, PyObject* extension) {
-  const FieldDescriptor* descriptor = GetExtensionDescriptor(extension);
-  if (descriptor == NULL) {
-    return NULL;
-  }
   if (self->extensions != NULL) {
-    PyObject* value = PyDict_GetItem(self->extensions->values, extension);
-    if (value != NULL) {
-      if (InternalReleaseFieldByDescriptor(self, descriptor, value) < 0) {
-        return NULL;
-      }
-      PyDict_DelItem(self->extensions->values, extension);
+    return extension_dict::ClearExtension(self->extensions, extension);
+  } else {
+    const FieldDescriptor* descriptor = GetExtensionDescriptor(extension);
+    if (descriptor == NULL) {
+      return NULL;
+    }
+    if (ScopedPyObjectPtr(ClearFieldByDescriptor(self, descriptor)) == NULL) {
+      return NULL;
     }
   }
-  return ClearFieldByDescriptor(self, descriptor);
+  Py_RETURN_NONE;
 }
 
 PyObject* HasExtension(CMessage* self, PyObject* extension) {
@@ -1666,7 +1556,7 @@
 Message* ReleaseMessage(CMessage* self,
                         const Descriptor* descriptor,
                         const FieldDescriptor* field_descriptor) {
-  MessageFactory* message_factory = GetFactoryForMessage(self)->message_factory;
+  MessageFactory* message_factory = GetFactoryForMessage(self);
   Message* released_message = self->message->GetReflection()->ReleaseMessage(
       self->message, field_descriptor, message_factory);
   // ReleaseMessage will return NULL which differs from
@@ -1703,20 +1593,23 @@
       parent_(parent) {}
 
   int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
-    return repeated_composite_container::Release(container);
+    return repeated_composite_container::Release(
+        reinterpret_cast<RepeatedCompositeContainer*>(container));
   }
 
   int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
-    return repeated_scalar_container::Release(container);
+    return repeated_scalar_container::Release(
+        reinterpret_cast<RepeatedScalarContainer*>(container));
   }
 
   int VisitMapContainer(MapContainer* container) {
-    return container->Release();
+    return reinterpret_cast<MapContainer*>(container)->Release();
   }
 
   int VisitCMessage(CMessage* cmessage,
                     const FieldDescriptor* field_descriptor) {
-    return ReleaseSubMessage(parent_, field_descriptor, cmessage);
+    return ReleaseSubMessage(parent_, field_descriptor,
+        reinterpret_cast<CMessage*>(cmessage));
   }
 
   CMessage* parent_;
@@ -1734,13 +1627,12 @@
 
 PyObject* ClearFieldByDescriptor(
     CMessage* self,
-    const FieldDescriptor* field_descriptor) {
-  if (!CheckFieldBelongsToMessage(field_descriptor, self->message)) {
+    const FieldDescriptor* descriptor) {
+  if (!CheckFieldBelongsToMessage(descriptor, self->message)) {
     return NULL;
   }
   AssureWritable(self);
-  Message* message = self->message;
-  message->GetReflection()->ClearField(message, field_descriptor);
+  self->message->GetReflection()->ClearField(self->message, descriptor);
   Py_RETURN_NONE;
 }
 
@@ -1776,17 +1668,27 @@
     arg = arg_in_oneof.get();
   }
 
-  // Release the field if it exists in the dict of composite fields.
-  if (self->composite_fields) {
-    PyObject* value = PyDict_GetItem(self->composite_fields, arg);
-    if (value != NULL) {
-      if (InternalReleaseFieldByDescriptor(self, field_descriptor, value) < 0) {
-        return NULL;
-      }
-      PyDict_DelItem(self->composite_fields, arg);
+  PyObject* composite_field = self->composite_fields ?
+      PyDict_GetItem(self->composite_fields, arg) : NULL;
+
+  // Only release the field if there's a possibility that there are
+  // references to it.
+  if (composite_field != NULL) {
+    if (InternalReleaseFieldByDescriptor(self, field_descriptor,
+                                         composite_field) < 0) {
+      return NULL;
     }
+    PyDict_DelItem(self->composite_fields, arg);
   }
-  return ClearFieldByDescriptor(self, field_descriptor);
+  message->GetReflection()->ClearField(message, field_descriptor);
+  if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_ENUM &&
+      !message->GetReflection()->SupportsUnknownEnumValues()) {
+    UnknownFieldSet* unknown_field_set =
+        message->GetReflection()->MutableUnknownFields(message);
+    unknown_field_set->DeleteByNumber(field_descriptor->number());
+  }
+
+  Py_RETURN_NONE;
 }
 
 PyObject* Clear(CMessage* self) {
@@ -1811,25 +1713,8 @@
   }
 }
 
-static PyObject* InternalSerializeToString(
-    CMessage* self, PyObject* args, PyObject* kwargs,
-    bool require_initialized) {
-  // Parse the "deterministic" kwarg; defaults to False.
-  static char* kwlist[] = { "deterministic", 0 };
-  PyObject* deterministic_obj = Py_None;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist,
-                                   &deterministic_obj)) {
-    return NULL;
-  }
-  // Preemptively convert to a bool first, so we don't need to back out of
-  // allocating memory if this raises an exception.
-  // NOTE: This is unused later if deterministic == Py_None, but that's fine.
-  int deterministic = PyObject_IsTrue(deterministic_obj);
-  if (deterministic < 0) {
-    return NULL;
-  }
-
-  if (require_initialized && !self->message->IsInitialized()) {
+static PyObject* SerializeToString(CMessage* self, PyObject* args) {
+  if (!self->message->IsInitialized()) {
     ScopedPyObjectPtr errors(FindInitializationErrors(self));
     if (errors == NULL) {
       return NULL;
@@ -1867,36 +1752,24 @@
                  GetMessageName(self).c_str(), PyString_AsString(joined.get()));
     return NULL;
   }
-
-  // Ok, arguments parsed and errors checked, now encode to a string
-  const size_t size = self->message->ByteSizeLong();
-  if (size == 0) {
+  int size = self->message->ByteSize();
+  if (size <= 0) {
     return PyBytes_FromString("");
   }
   PyObject* result = PyBytes_FromStringAndSize(NULL, size);
   if (result == NULL) {
     return NULL;
   }
-  io::ArrayOutputStream out(PyBytes_AS_STRING(result), size);
-  io::CodedOutputStream coded_out(&out);
-  if (deterministic_obj != Py_None) {
-    coded_out.SetSerializationDeterministic(deterministic);
-  }
-  self->message->SerializeWithCachedSizes(&coded_out);
-  GOOGLE_CHECK(!coded_out.HadError());
+  char* buffer = PyBytes_AS_STRING(result);
+  self->message->SerializeWithCachedSizesToArray(
+      reinterpret_cast<uint8*>(buffer));
   return result;
 }
 
-static PyObject* SerializeToString(
-    CMessage* self, PyObject* args, PyObject* kwargs) {
-  return InternalSerializeToString(self, args, kwargs,
-                                   /*require_initialized=*/true);
-}
-
-static PyObject* SerializePartialToString(
-    CMessage* self, PyObject* args, PyObject* kwargs) {
-  return InternalSerializeToString(self, args, kwargs,
-                                   /*require_initialized=*/false);
+static PyObject* SerializePartialToString(CMessage* self) {
+  string contents;
+  self->message->SerializePartialToString(&contents);
+  return PyBytes_FromStringAndSize(contents.c_str(), contents.size());
 }
 
 // Formats proto fields for ascii dumps using python formatting functions where
@@ -2026,15 +1899,11 @@
 // get OOM errors. The protobuf APIs do not provide any tools for processing
 // protobufs in chunks.  If you have protos this big you should break them up if
 // it is at all convenient to do so.
-#ifdef PROTOBUF_PYTHON_ALLOW_OVERSIZE_PROTOS
-static bool allow_oversize_protos = true;
-#else
 static bool allow_oversize_protos = false;
-#endif
 
 // Provide a method in the module to set allow_oversize_protos to a boolean
 // value. This method returns the newly value of allow_oversize_protos.
-PyObject* SetAllowOversizeProtos(PyObject* m, PyObject* arg) {
+static PyObject* SetAllowOversizeProtos(PyObject* m, PyObject* arg) {
   if (!arg || !PyBool_Check(arg)) {
     PyErr_SetString(PyExc_TypeError,
                     "Argument to SetAllowOversizeProtos must be boolean");
@@ -2061,15 +1930,10 @@
   if (allow_oversize_protos) {
     input.SetTotalBytesLimit(INT_MAX, INT_MAX);
   }
-  PyMessageFactory* factory = GetFactoryForMessage(self);
-  input.SetExtensionRegistry(factory->pool->pool, factory->message_factory);
+  PyDescriptorPool* pool = GetDescriptorPoolForMessage(self);
+  input.SetExtensionRegistry(pool->pool, pool->message_factory);
   bool success = self->message->MergePartialFromCodedStream(&input);
   if (success) {
-    if (!input.ConsumedEntireMessage()) {
-      // TODO(jieluo): Raise error and return NULL instead.
-      // b/27494216
-      PyErr_Warn(NULL, "Unexpected end-group tag: Not all data was converted");
-    }
     return PyInt_FromLong(input.CurrentPosition());
   } else {
     PyErr_Format(DecodeError_class, "Error parsing message");
@@ -2088,29 +1952,99 @@
   return PyLong_FromLong(self->message->ByteSize());
 }
 
-PyObject* RegisterExtension(PyObject* cls, PyObject* extension_handle) {
+static PyObject* RegisterExtension(PyObject* cls,
+                                   PyObject* extension_handle) {
   const FieldDescriptor* descriptor =
       GetExtensionDescriptor(extension_handle);
   if (descriptor == NULL) {
     return NULL;
   }
-  if (!PyObject_TypeCheck(cls, &CMessageClass_Type)) {
-    PyErr_Format(PyExc_TypeError, "Expected a message class, got %s",
-                 cls->ob_type->tp_name);
+
+  ScopedPyObjectPtr extensions_by_name(
+      PyObject_GetAttr(cls, k_extensions_by_name));
+  if (extensions_by_name == NULL) {
+    PyErr_SetString(PyExc_TypeError, "no extensions_by_name on class");
     return NULL;
   }
-  CMessageClass *message_class = reinterpret_cast<CMessageClass*>(cls);
-  if (message_class == NULL) {
+  ScopedPyObjectPtr full_name(PyObject_GetAttr(extension_handle, kfull_name));
+  if (full_name == NULL) {
     return NULL;
   }
+
   // If the extension was already registered, check that it is the same.
-  const FieldDescriptor* existing_extension =
-      message_class->py_message_factory->pool->pool->FindExtensionByNumber(
-          descriptor->containing_type(), descriptor->number());
-  if (existing_extension != NULL && existing_extension != descriptor) {
-    PyErr_SetString(PyExc_ValueError, "Double registration of Extensions");
+  PyObject* existing_extension =
+      PyDict_GetItem(extensions_by_name.get(), full_name.get());
+  if (existing_extension != NULL) {
+    const FieldDescriptor* existing_extension_descriptor =
+        GetExtensionDescriptor(existing_extension);
+    if (existing_extension_descriptor != descriptor) {
+      PyErr_SetString(PyExc_ValueError, "Double registration of Extensions");
+      return NULL;
+    }
+    // Nothing else to do.
+    Py_RETURN_NONE;
+  }
+
+  if (PyDict_SetItem(extensions_by_name.get(), full_name.get(),
+                     extension_handle) < 0) {
     return NULL;
   }
+
+  // Also store a mapping from extension number to implementing class.
+  ScopedPyObjectPtr extensions_by_number(
+      PyObject_GetAttr(cls, k_extensions_by_number));
+  if (extensions_by_number == NULL) {
+    PyErr_SetString(PyExc_TypeError, "no extensions_by_number on class");
+    return NULL;
+  }
+
+  ScopedPyObjectPtr number(PyObject_GetAttrString(extension_handle, "number"));
+  if (number == NULL) {
+    return NULL;
+  }
+
+  // If the extension was already registered by number, check that it is the
+  // same.
+  existing_extension = PyDict_GetItem(extensions_by_number.get(), number.get());
+  if (existing_extension != NULL) {
+    const FieldDescriptor* existing_extension_descriptor =
+        GetExtensionDescriptor(existing_extension);
+    if (existing_extension_descriptor != descriptor) {
+      const Descriptor* msg_desc = GetMessageDescriptor(
+          reinterpret_cast<PyTypeObject*>(cls));
+      PyErr_Format(
+          PyExc_ValueError,
+          "Extensions \"%s\" and \"%s\" both try to extend message type "
+          "\"%s\" with field number %ld.",
+          existing_extension_descriptor->full_name().c_str(),
+          descriptor->full_name().c_str(),
+          msg_desc->full_name().c_str(),
+          PyInt_AsLong(number.get()));
+      return NULL;
+    }
+    // Nothing else to do.
+    Py_RETURN_NONE;
+  }
+  if (PyDict_SetItem(extensions_by_number.get(), number.get(),
+                     extension_handle) < 0) {
+    return NULL;
+  }
+
+  // Check if it's a message set
+  if (descriptor->is_extension() &&
+      descriptor->containing_type()->options().message_set_wire_format() &&
+      descriptor->type() == FieldDescriptor::TYPE_MESSAGE &&
+      descriptor->label() == FieldDescriptor::LABEL_OPTIONAL) {
+    ScopedPyObjectPtr message_name(PyString_FromStringAndSize(
+        descriptor->message_type()->full_name().c_str(),
+        descriptor->message_type()->full_name().size()));
+    if (message_name == NULL) {
+      return NULL;
+    }
+    PyDict_SetItem(extensions_by_name.get(), message_name.get(),
+                   extension_handle);
+  }
+
   Py_RETURN_NONE;
 }
 
@@ -2147,7 +2081,7 @@
 static PyObject* GetExtensionDict(CMessage* self, void *closure);
 
 static PyObject* ListFields(CMessage* self) {
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   self->message->GetReflection()->ListFields(*self->message, &fields);
 
   // Normally, the list will be exactly the size of the fields.
@@ -2177,8 +2111,8 @@
       // is no message class and we cannot retrieve the value.
       // TODO(amauryfa): consider building the class on the fly!
       if (fields[i]->message_type() != NULL &&
-          message_factory::GetMessageClass(
-              GetFactoryForMessage(self),
+          cdescriptor_pool::GetMessageClass(
+              GetDescriptorPoolForMessage(self),
               fields[i]->message_type()) == NULL) {
         PyErr_Clear();
         continue;
@@ -2238,7 +2172,7 @@
 
 PyObject* FindInitializationErrors(CMessage* self) {
   Message* message = self->message;
-  std::vector<string> errors;
+  vector<string> errors;
   message->FindInitializationErrors(&errors);
 
   PyObject* error_list = PyList_New(errors.size());
@@ -2340,9 +2274,27 @@
       break;
     }
     case FieldDescriptor::CPPTYPE_ENUM: {
-      const EnumValueDescriptor* enum_value =
-          message->GetReflection()->GetEnum(*message, field_descriptor);
-      result = PyInt_FromLong(enum_value->number());
+      if (!message->GetReflection()->SupportsUnknownEnumValues() &&
+          !message->GetReflection()->HasField(*message, field_descriptor)) {
+        // Look for the value in the unknown fields.
+        const UnknownFieldSet& unknown_field_set =
+            message->GetReflection()->GetUnknownFields(*message);
+        for (int i = 0; i < unknown_field_set.field_count(); ++i) {
+          if (unknown_field_set.field(i).number() ==
+              field_descriptor->number() &&
+              unknown_field_set.field(i).type() ==
+              google::protobuf::UnknownField::TYPE_VARINT) {
+            result = PyInt_FromLong(unknown_field_set.field(i).varint());
+            break;
+          }
+        }
+      }
+
+      if (result == NULL) {
+        const EnumValueDescriptor* enum_value =
+            message->GetReflection()->GetEnum(*message, field_descriptor);
+        result = PyInt_FromLong(enum_value->number());
+      }
       break;
     }
     default:
@@ -2357,14 +2309,12 @@
 PyObject* InternalGetSubMessage(
     CMessage* self, const FieldDescriptor* field_descriptor) {
   const Reflection* reflection = self->message->GetReflection();
-  PyMessageFactory* factory = GetFactoryForMessage(self);
+  PyDescriptorPool* pool = GetDescriptorPoolForMessage(self);
   const Message& sub_message = reflection->GetMessage(
-      *self->message, field_descriptor, factory->message_factory);
+      *self->message, field_descriptor, pool->message_factory);
 
-  CMessageClass* message_class = message_factory::GetOrCreateMessageClass(
-      factory, field_descriptor->message_type());
-  ScopedPyObjectPtr message_class_handler(
-      reinterpret_cast<PyObject*>(message_class));
+  CMessageClass* message_class = cdescriptor_pool::GetMessageClass(
+      pool, field_descriptor->message_type());
   if (message_class == NULL) {
     return NULL;
   }
@@ -2554,10 +2504,7 @@
   if (state == NULL) {
     return  NULL;
   }
-  string contents;
-  self->message->SerializePartialToString(&contents);
-  ScopedPyObjectPtr serialized(
-      PyBytes_FromStringAndSize(contents.c_str(), contents.size()));
+  ScopedPyObjectPtr serialized(SerializePartialToString(self));
   if (serialized == NULL) {
     return NULL;
   }
@@ -2617,24 +2564,11 @@
   return NULL;
 }
 
-static PyObject* GetExtensionsByName(CMessage *self, void *closure) {
-  return message_meta::GetExtensionsByName(
-      reinterpret_cast<CMessageClass*>(Py_TYPE(self)), closure);
-}
-
-static PyObject* GetExtensionsByNumber(CMessage *self, void *closure) {
-  return message_meta::GetExtensionsByNumber(
-      reinterpret_cast<CMessageClass*>(Py_TYPE(self)), closure);
-}
-
 static PyGetSetDef Getters[] = {
   {"Extensions", (getter)GetExtensionDict, NULL, "Extension dict"},
-  {"_extensions_by_name", (getter)GetExtensionsByName, NULL},
-  {"_extensions_by_number", (getter)GetExtensionsByNumber, NULL},
   {NULL}
 };
 
-
 static PyMethodDef Methods[] = {
   { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS,
     "Makes a deep copy of the class." },
@@ -2678,10 +2612,9 @@
   { "RegisterExtension", (PyCFunction)RegisterExtension, METH_O | METH_CLASS,
     "Registers an extension with the current message." },
   { "SerializePartialToString", (PyCFunction)SerializePartialToString,
-    METH_VARARGS | METH_KEYWORDS,
+    METH_NOARGS,
     "Serializes the message to a string, even if it isn't initialized." },
-  { "SerializeToString", (PyCFunction)SerializeToString,
-    METH_VARARGS | METH_KEYWORDS,
+  { "SerializeToString", (PyCFunction)SerializeToString, METH_NOARGS,
     "Serializes the message to a string, only for initialized messages." },
   { "SetInParent", (PyCFunction)SetInParent, METH_NOARGS,
     "Sets the has bit of the given field in its parent message." },
@@ -2726,8 +2659,8 @@
     const Descriptor* entry_type = field_descriptor->message_type();
     const FieldDescriptor* value_type = entry_type->FindFieldByName("value");
     if (value_type->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      CMessageClass* value_class = message_factory::GetMessageClass(
-          GetFactoryForMessage(self), value_type->message_type());
+      CMessageClass* value_class = cdescriptor_pool::GetMessageClass(
+          GetDescriptorPoolForMessage(self), value_type->message_type());
       if (value_class == NULL) {
         return NULL;
       }
@@ -2749,8 +2682,8 @@
   if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
     PyObject* py_container = NULL;
     if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      CMessageClass* message_class = message_factory::GetMessageClass(
-          GetFactoryForMessage(self), field_descriptor->message_type());
+      CMessageClass* message_class = cdescriptor_pool::GetMessageClass(
+          GetDescriptorPoolForMessage(self), field_descriptor->message_type());
       if (message_class == NULL) {
         return NULL;
       }
@@ -2845,7 +2778,7 @@
   0,                                   //  tp_traverse
   0,                                   //  tp_clear
   (richcmpfunc)cmessage::RichCompare,  //  tp_richcompare
-  offsetof(CMessage, weakreflist),     //  tp_weaklistoffset
+  0,                                   //  tp_weaklistoffset
   0,                                   //  tp_iter
   0,                                   //  tp_iternext
   cmessage::Methods,                   //  tp_methods
@@ -2892,11 +2825,30 @@
   return cmsg->message;
 }
 
+static const char module_docstring[] =
+"python-proto2 is a module that can be used to enhance proto2 Python API\n"
+"performance.\n"
+"\n"
+"It provides access to the protocol buffers C++ reflection API that\n"
+"implements the basic protocol buffer functions.";
+
 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
   // also be freed and reset to NULL during finalization.
+  kPythonZero = PyInt_FromLong(0);
+  kint32min_py = PyInt_FromLong(kint32min);
+  kint32max_py = PyInt_FromLong(kint32max);
+  kuint32max_py = PyLong_FromLongLong(kuint32max);
+  kint64min_py = PyLong_FromLongLong(kint64min);
+  kint64max_py = PyLong_FromLongLong(kint64max);
+  kuint64max_py = PyLong_FromUnsignedLongLong(kuint64max);
+
   kDESCRIPTOR = PyString_FromString("DESCRIPTOR");
+  k_cdescriptor = PyString_FromString("_cdescriptor");
+  kfull_name = PyString_FromString("full_name");
+  k_extensions_by_name = PyString_FromString("_extensions_by_name");
+  k_extensions_by_number = PyString_FromString("_extensions_by_number");
 
   PyObject *dummy_obj = PySet_New(NULL);
   kEmptyWeakref = PyWeakref_NewRef(dummy_obj, NULL);
@@ -2914,11 +2866,6 @@
     return false;
   }
 
-  // Initialize types and globals in message_factory.cc
-  if (!InitMessageFactory()) {
-    return false;
-  }
-
   // Initialize constants defined in this file.
   InitGlobals();
 
@@ -2936,6 +2883,25 @@
   // DESCRIPTOR is set on each protocol buffer message class elsewhere, but set
   // it here as well to document that subclasses need to set it.
   PyDict_SetItem(CMessage_Type.tp_dict, kDESCRIPTOR, Py_None);
+  // Subclasses with message extensions will override _extensions_by_name and
+  // _extensions_by_number with fresh mutable dictionaries in AddDescriptors.
+  // All other classes can share this same immutable mapping.
+  ScopedPyObjectPtr empty_dict(PyDict_New());
+  if (empty_dict == NULL) {
+    return false;
+  }
+  ScopedPyObjectPtr immutable_dict(PyDictProxy_New(empty_dict.get()));
+  if (immutable_dict == NULL) {
+    return false;
+  }
+  if (PyDict_SetItem(CMessage_Type.tp_dict,
+                     k_extensions_by_name, immutable_dict.get()) < 0) {
+    return false;
+  }
+  if (PyDict_SetItem(CMessage_Type.tp_dict,
+                     k_extensions_by_number, immutable_dict.get()) < 0) {
+    return false;
+  }
 
   PyModule_AddObject(m, "Message", reinterpret_cast<PyObject*>(&CMessage_Type));
 
@@ -2981,15 +2947,69 @@
   }
 
   // Initialize Map container types.
-  if (!InitMapContainers()) {
-    return false;
+  {
+    // ScalarMapContainer_Type derives from our MutableMapping type.
+    ScopedPyObjectPtr containers(PyImport_ImportModule(
+        "google.protobuf.internal.containers"));
+    if (containers == NULL) {
+      return false;
+    }
+
+    ScopedPyObjectPtr mutable_mapping(
+        PyObject_GetAttrString(containers.get(), "MutableMapping"));
+    if (mutable_mapping == NULL) {
+      return false;
+    }
+
+    if (!PyObject_TypeCheck(mutable_mapping.get(), &PyType_Type)) {
+      return false;
+    }
+
+    Py_INCREF(mutable_mapping.get());
+#if PY_MAJOR_VERSION >= 3
+    PyObject* bases = PyTuple_New(1);
+    PyTuple_SET_ITEM(bases, 0, mutable_mapping.get());
+
+    ScalarMapContainer_Type = 
+        PyType_FromSpecWithBases(&ScalarMapContainer_Type_spec, bases);
+    PyModule_AddObject(m, "ScalarMapContainer", ScalarMapContainer_Type);
+#else
+    ScalarMapContainer_Type.tp_base =
+        reinterpret_cast<PyTypeObject*>(mutable_mapping.get());
+
+    if (PyType_Ready(&ScalarMapContainer_Type) < 0) {
+      return false;
+    }
+
+    PyModule_AddObject(m, "ScalarMapContainer",
+                       reinterpret_cast<PyObject*>(&ScalarMapContainer_Type));
+#endif
+
+    if (PyType_Ready(&MapIterator_Type) < 0) {
+      return false;
+    }
+
+    PyModule_AddObject(m, "MapIterator",
+                       reinterpret_cast<PyObject*>(&MapIterator_Type));
+
+
+#if PY_MAJOR_VERSION >= 3
+    MessageMapContainer_Type = 
+        PyType_FromSpecWithBases(&MessageMapContainer_Type_spec, bases);
+    PyModule_AddObject(m, "MessageMapContainer", MessageMapContainer_Type);
+#else
+    Py_INCREF(mutable_mapping.get());
+    MessageMapContainer_Type.tp_base =
+        reinterpret_cast<PyTypeObject*>(mutable_mapping.get());
+
+    if (PyType_Ready(&MessageMapContainer_Type) < 0) {
+      return false;
+    }
+
+    PyModule_AddObject(m, "MessageMapContainer",
+                       reinterpret_cast<PyObject*>(&MessageMapContainer_Type));
+#endif
   }
-  PyModule_AddObject(m, "ScalarMapContainer",
-                     reinterpret_cast<PyObject*>(ScalarMapContainer_Type));
-  PyModule_AddObject(m, "MessageMapContainer",
-                     reinterpret_cast<PyObject*>(MessageMapContainer_Type));
-  PyModule_AddObject(m, "MapIterator",
-                     reinterpret_cast<PyObject*>(&MapIterator_Type));
 
   if (PyType_Ready(&ExtensionDict_Type) < 0) {
     return false;
@@ -3024,10 +3044,6 @@
       &PyFileDescriptor_Type));
   PyModule_AddObject(m, "OneofDescriptor", reinterpret_cast<PyObject*>(
       &PyOneofDescriptor_Type));
-  PyModule_AddObject(m, "ServiceDescriptor", reinterpret_cast<PyObject*>(
-      &PyServiceDescriptor_Type));
-  PyModule_AddObject(m, "MethodDescriptor", reinterpret_cast<PyObject*>(
-      &PyMethodDescriptor_Type));
 
   PyObject* enum_type_wrapper = PyImport_ImportModule(
       "google.protobuf.internal.enum_type_wrapper");
@@ -3064,4 +3080,54 @@
 
 }  // namespace python
 }  // namespace protobuf
+
+static PyMethodDef ModuleMethods[] = {
+  {"SetAllowOversizeProtos",
+    (PyCFunction)google::protobuf::python::cmessage::SetAllowOversizeProtos,
+    METH_O, "Enable/disable oversize proto parsing."},
+  { NULL, NULL}
+};
+
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef _module = {
+  PyModuleDef_HEAD_INIT,
+  "_message",
+  google::protobuf::python::module_docstring,
+  -1,
+  ModuleMethods,  /* m_methods */
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+#define INITFUNC PyInit__message
+#define INITFUNC_ERRORVAL NULL
+#else  // Python 2
+#define INITFUNC init_message
+#define INITFUNC_ERRORVAL
+#endif
+
+extern "C" {
+  PyMODINIT_FUNC INITFUNC(void) {
+    PyObject* m;
+#if PY_MAJOR_VERSION >= 3
+    m = PyModule_Create(&_module);
+#else
+    m = Py_InitModule3("_message", ModuleMethods,
+                       google::protobuf::python::module_docstring);
+#endif
+    if (m == NULL) {
+      return INITFUNC_ERRORVAL;
+    }
+
+    if (!google::protobuf::python::InitProto2MessageModule(m)) {
+      Py_DECREF(m);
+      return INITFUNC_ERRORVAL;
+    }
+
+#if PY_MAJOR_VERSION >= 3
+    return m;
+#endif
+  }
+}
 }  // namespace google
diff --git a/python/google/protobuf/pyext/message.h b/python/google/protobuf/pyext/message.h
index ce80497..3a4bec8 100644
--- a/python/google/protobuf/pyext/message.h
+++ b/python/google/protobuf/pyext/message.h
@@ -54,7 +54,7 @@
 
 #ifdef _SHARED_PTR_H
 using std::shared_ptr;
-using std::string;
+using ::std::string;
 #else
 using internal::shared_ptr;
 #endif
@@ -62,7 +62,7 @@
 namespace python {
 
 struct ExtensionDict;
-struct PyMessageFactory;
+struct PyDescriptorPool;
 
 typedef struct CMessage {
   PyObject_HEAD;
@@ -112,12 +112,8 @@
   // Similar to composite_fields, acting as a cache, but also contains the
   // required extension dict logic.
   ExtensionDict* extensions;
-
-  // Implements the "weakref" protocol for this object.
-  PyObject* weakreflist;
 } CMessage;
 
-extern PyTypeObject CMessageClass_Type;
 extern PyTypeObject CMessage_Type;
 
 
@@ -136,11 +132,14 @@
   // Owned reference, used to keep the pointer above alive.
   PyObject* py_message_descriptor;
 
-  // The Python MessageFactory used to create the class. It is needed to resolve
+  // The Python DescriptorPool used to create the class. It is needed to resolve
   // fields descriptors, including extensions fields; its C++ MessageFactory is
   // used to instantiate submessages.
-  // We own the reference, because it's important to keep the factory alive.
-  PyMessageFactory* py_message_factory;
+  // This can be different from DESCRIPTOR.file.pool, in the case of a custom
+  // DescriptorPool which defines new extensions.
+  // We own the reference, because it's important to keep the descriptors and
+  // factory alive.
+  PyDescriptorPool* py_descriptor_pool;
 
   PyObject* AsPyObject() {
     return reinterpret_cast<PyObject*>(this);
@@ -155,6 +154,14 @@
 // The caller must fill self->message, self->owner and eventually self->parent.
 CMessage* NewEmptyMessage(CMessageClass* type);
 
+// Release a submessage from its proto tree, making it a new top-level messgae.
+// A new message will be created if this is a read-only default instance.
+//
+// Corresponds to reflection api method ReleaseMessage.
+int ReleaseSubMessage(CMessage* self,
+                      const FieldDescriptor* field_descriptor,
+                      CMessage* child_cmessage);
+
 // Retrieves the C++ descriptor of a Python Extension descriptor.
 // On error, return NULL with an exception set.
 const FieldDescriptor* GetExtensionDescriptor(PyObject* extension);
@@ -230,16 +237,10 @@
 PyObject* HasField(CMessage* self, PyObject* arg);
 
 // Initializes values of fields on a newly constructed message.
-// Note that positional arguments are disallowed: 'args' must be NULL or the
-// empty tuple.
-int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs);
+int InitAttributes(CMessage* self, PyObject* kwargs);
 
 PyObject* MergeFrom(CMessage* self, PyObject* arg);
 
-// This method does not do anything beyond checking that no other extension
-// has been registered with the same field number on this class.
-PyObject* RegisterExtension(PyObject* cls, PyObject* extension_handle);
-
 // Retrieves an attribute named 'name' from CMessage 'self'. Returns
 // the attribute value on success, or NULL on failure.
 //
@@ -259,15 +260,14 @@
 
 int AssureWritable(CMessage* self);
 
-// Returns the message factory for the given message.
-// This is equivalent to message.MESSAGE_FACTORY
+// Returns the "best" DescriptorPool for the given message.
+// This is often equivalent to message.DESCRIPTOR.pool, but not always, when
+// the message class was created from a MessageFactory using a custom pool which
+// uses the generated pool as an underlay.
 //
-// The returned factory is suitable for finding fields and building submessages,
+// The returned pool is suitable for finding fields and building submessages,
 // even in the case of extensions.
-// Returns a *borrowed* reference, and never fails because we pass a CMessage.
-PyMessageFactory* GetFactoryForMessage(CMessage* message);
-
-PyObject* SetAllowOversizeProtos(PyObject* m, PyObject* arg);
+PyDescriptorPool* GetDescriptorPoolForMessage(CMessage* message);
 
 }  // namespace cmessage
 
@@ -280,25 +280,25 @@
 
 #define GOOGLE_CHECK_GET_INT32(arg, value, err)                        \
     int32 value;                                            \
-    if (!CheckAndGetInteger(arg, &value)) { \
+    if (!CheckAndGetInteger(arg, &value, kint32min_py, kint32max_py)) { \
       return err;                                          \
     }
 
 #define GOOGLE_CHECK_GET_INT64(arg, value, err)                        \
     int64 value;                                            \
-    if (!CheckAndGetInteger(arg, &value)) { \
+    if (!CheckAndGetInteger(arg, &value, kint64min_py, kint64max_py)) { \
       return err;                                          \
     }
 
 #define GOOGLE_CHECK_GET_UINT32(arg, value, err)                       \
     uint32 value;                                           \
-    if (!CheckAndGetInteger(arg, &value)) { \
+    if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint32max_py)) { \
       return err;                                          \
     }
 
 #define GOOGLE_CHECK_GET_UINT64(arg, value, err)                       \
     uint64 value;                                           \
-    if (!CheckAndGetInteger(arg, &value)) { \
+    if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint64max_py)) { \
       return err;                                          \
     }
 
@@ -321,11 +321,20 @@
     }
 
 
+extern PyObject* kPythonZero;
+extern PyObject* kint32min_py;
+extern PyObject* kint32max_py;
+extern PyObject* kuint32max_py;
+extern PyObject* kint64min_py;
+extern PyObject* kint64max_py;
+extern PyObject* kuint64max_py;
+
 #define FULL_MODULE_NAME "google.protobuf.pyext._message"
 
 void FormatTypeError(PyObject* arg, char* expected_types);
 template<class T>
-bool CheckAndGetInteger(PyObject* arg, T* value);
+bool CheckAndGetInteger(
+    PyObject* arg, T* value, PyObject* min, PyObject* max);
 bool CheckAndGetDouble(PyObject* arg, double* value);
 bool CheckAndGetFloat(PyObject* arg, float* value);
 bool CheckAndGetBool(PyObject* arg, bool* value);
@@ -345,8 +354,6 @@
 
 extern PyObject* PickleError_class;
 
-bool InitProto2MessageModule(PyObject *m);
-
 }  // namespace python
 }  // namespace protobuf
 
diff --git a/python/google/protobuf/pyext/message_factory.cc b/python/google/protobuf/pyext/message_factory.cc
deleted file mode 100644
index 571bae2..0000000
--- a/python/google/protobuf/pyext/message_factory.cc
+++ /dev/null
@@ -1,281 +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.
-
-#include <Python.h>
-
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-
-#if PY_MAJOR_VERSION >= 3
-  #if PY_VERSION_HEX < 0x03030000
-    #error "Python 3.0 - 3.2 are not supported."
-  #endif
-  #define PyString_AsStringAndSize(ob, charpp, sizep) \
-    (PyUnicode_Check(ob)? \
-       ((*(charpp) = PyUnicode_AsUTF8AndSize(ob, (sizep))) == NULL? -1: 0): \
-       PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
-#endif
-
-namespace google {
-namespace protobuf {
-namespace python {
-
-namespace message_factory {
-
-PyMessageFactory* NewMessageFactory(PyTypeObject* type, PyDescriptorPool* pool) {
-  PyMessageFactory* factory = reinterpret_cast<PyMessageFactory*>(
-      PyType_GenericAlloc(type, 0));
-  if (factory == NULL) {
-    return NULL;
-  }
-
-  DynamicMessageFactory* message_factory = new DynamicMessageFactory();
-  // This option might be the default some day.
-  message_factory->SetDelegateToGeneratedFactory(true);
-  factory->message_factory = message_factory;
-
-  factory->pool = pool;
-  // TODO(amauryfa): When the MessageFactory is not created from the
-  // DescriptorPool this reference should be owned, not borrowed.
-  // Py_INCREF(pool);
-
-  factory->classes_by_descriptor = new PyMessageFactory::ClassesByMessageMap();
-
-  return factory;
-}
-
-PyObject* New(PyTypeObject* type, PyObject* args, PyObject* kwargs) {
-  static char* kwlist[] = {"pool", 0};
-  PyObject* pool = NULL;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist, &pool)) {
-    return NULL;
-  }
-  ScopedPyObjectPtr owned_pool;
-  if (pool == NULL || pool == Py_None) {
-    owned_pool.reset(PyObject_CallFunction(
-        reinterpret_cast<PyObject*>(&PyDescriptorPool_Type), NULL));
-    if (owned_pool == NULL) {
-      return NULL;
-    }
-    pool = owned_pool.get();
-  } else {
-    if (!PyObject_TypeCheck(pool, &PyDescriptorPool_Type)) {
-      PyErr_Format(PyExc_TypeError, "Expected a DescriptorPool, got %s",
-                   pool->ob_type->tp_name);
-      return NULL;
-    }
-  }
-
-  return reinterpret_cast<PyObject*>(
-      NewMessageFactory(type, reinterpret_cast<PyDescriptorPool*>(pool)));
-}
-
-static void Dealloc(PyMessageFactory* self) {
-  // TODO(amauryfa): When the MessageFactory is not created from the
-  // DescriptorPool this reference should be owned, not borrowed.
-  // Py_CLEAR(self->pool);
-  typedef PyMessageFactory::ClassesByMessageMap::iterator iterator;
-  for (iterator it = self->classes_by_descriptor->begin();
-       it != self->classes_by_descriptor->end(); ++it) {
-    Py_DECREF(it->second);
-  }
-  delete self->classes_by_descriptor;
-  delete self->message_factory;
-  Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
-}
-
-// Add a message class to our database.
-int RegisterMessageClass(PyMessageFactory* self,
-                         const Descriptor* message_descriptor,
-                         CMessageClass* message_class) {
-  Py_INCREF(message_class);
-  typedef PyMessageFactory::ClassesByMessageMap::iterator iterator;
-  std::pair<iterator, bool> ret = self->classes_by_descriptor->insert(
-      std::make_pair(message_descriptor, message_class));
-  if (!ret.second) {
-    // Update case: DECREF the previous value.
-    Py_DECREF(ret.first->second);
-    ret.first->second = message_class;
-  }
-  return 0;
-}
-
-CMessageClass* GetOrCreateMessageClass(PyMessageFactory* self,
-                                       const Descriptor* descriptor) {
-  // This is the same implementation as MessageFactory.GetPrototype().
-
-  // Do not create a MessageClass that already exists.
-  hash_map<const Descriptor*, CMessageClass*>::iterator it =
-      self->classes_by_descriptor->find(descriptor);
-  if (it != self->classes_by_descriptor->end()) {
-    Py_INCREF(it->second);
-    return it->second;
-  }
-  ScopedPyObjectPtr py_descriptor(
-      PyMessageDescriptor_FromDescriptor(descriptor));
-  if (py_descriptor == NULL) {
-    return NULL;
-  }
-  // Create a new message class.
-  ScopedPyObjectPtr args(Py_BuildValue(
-      "s(){sOsOsO}", descriptor->name().c_str(),
-      "DESCRIPTOR", py_descriptor.get(),
-      "__module__", Py_None,
-      "message_factory", self));
-  if (args == NULL) {
-    return NULL;
-  }
-  ScopedPyObjectPtr message_class(PyObject_CallObject(
-      reinterpret_cast<PyObject*>(&CMessageClass_Type), args.get()));
-  if (message_class == NULL) {
-    return NULL;
-  }
-  // Create messages class for the messages used by the fields, and registers
-  // all extensions for these messages during the recursion.
-  for (int field_idx = 0; field_idx < descriptor->field_count(); field_idx++) {
-    const Descriptor* sub_descriptor =
-        descriptor->field(field_idx)->message_type();
-    // It is NULL if the field type is not a message.
-    if (sub_descriptor != NULL) {
-      CMessageClass* result = GetOrCreateMessageClass(self, sub_descriptor);
-      if (result == NULL) {
-        return NULL;
-      }
-      Py_DECREF(result);
-    }
-  }
-
-  // Register extensions defined in this message.
-  for (int ext_idx = 0 ; ext_idx < descriptor->extension_count() ; ext_idx++) {
-    const FieldDescriptor* extension = descriptor->extension(ext_idx);
-    ScopedPyObjectPtr py_extended_class(
-        GetOrCreateMessageClass(self, extension->containing_type())
-            ->AsPyObject());
-    if (py_extended_class == NULL) {
-      return NULL;
-    }
-    ScopedPyObjectPtr py_extension(PyFieldDescriptor_FromDescriptor(extension));
-    if (py_extension == NULL) {
-      return NULL;
-    }
-    ScopedPyObjectPtr result(cmessage::RegisterExtension(
-        py_extended_class.get(), py_extension.get()));
-    if (result == NULL) {
-      return NULL;
-    }
-  }
-  return reinterpret_cast<CMessageClass*>(message_class.release());
-}
-
-// Retrieve the message class added to our database.
-CMessageClass* GetMessageClass(PyMessageFactory* self,
-                               const Descriptor* message_descriptor) {
-  typedef PyMessageFactory::ClassesByMessageMap::iterator iterator;
-  iterator ret = self->classes_by_descriptor->find(message_descriptor);
-  if (ret == self->classes_by_descriptor->end()) {
-    PyErr_Format(PyExc_TypeError, "No message class registered for '%s'",
-                 message_descriptor->full_name().c_str());
-    return NULL;
-  } else {
-    return ret->second;
-  }
-}
-
-static PyMethodDef Methods[] = {
-    {NULL}};
-
-static PyObject* GetPool(PyMessageFactory* self, void* closure) {
-  Py_INCREF(self->pool);
-  return reinterpret_cast<PyObject*>(self->pool);
-}
-
-static PyGetSetDef Getters[] = {
-    {"pool", (getter)GetPool, NULL, "DescriptorPool"},
-    {NULL}
-};
-
-}  // namespace message_factory
-
-PyTypeObject PyMessageFactory_Type = {
-    PyVarObject_HEAD_INIT(&PyType_Type, 0) FULL_MODULE_NAME
-    ".MessageFactory",                        // tp_name
-    sizeof(PyMessageFactory),                 // tp_basicsize
-    0,                                        // tp_itemsize
-    (destructor)message_factory::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
-    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 | Py_TPFLAGS_BASETYPE,  // tp_flags
-    "A static Message Factory",               // tp_doc
-    0,                                        // tp_traverse
-    0,                                        // tp_clear
-    0,                                        // tp_richcompare
-    0,                                        // tp_weaklistoffset
-    0,                                        // tp_iter
-    0,                                        // tp_iternext
-    message_factory::Methods,                 // tp_methods
-    0,                                        // tp_members
-    message_factory::Getters,                 // tp_getset
-    0,                                        // tp_base
-    0,                                        // tp_dict
-    0,                                        // tp_descr_get
-    0,                                        // tp_descr_set
-    0,                                        // tp_dictoffset
-    0,                                        // tp_init
-    0,                                        // tp_alloc
-    message_factory::New,                     // tp_new
-    PyObject_Del,                             // tp_free
-};
-
-bool InitMessageFactory() {
-  if (PyType_Ready(&PyMessageFactory_Type) < 0) {
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace python
-}  // namespace protobuf
-}  // namespace google
diff --git a/python/google/protobuf/pyext/message_factory.h b/python/google/protobuf/pyext/message_factory.h
deleted file mode 100644
index 36092f7..0000000
--- a/python/google/protobuf/pyext/message_factory.h
+++ /dev/null
@@ -1,103 +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.
-
-#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_MESSAGE_FACTORY_H__
-#define GOOGLE_PROTOBUF_PYTHON_CPP_MESSAGE_FACTORY_H__
-
-#include <Python.h>
-
-#include <google/protobuf/stubs/hash.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-
-namespace google {
-namespace protobuf {
-class MessageFactory;
-
-namespace python {
-
-// The (meta) type of all Messages classes.
-struct CMessageClass;
-
-struct PyMessageFactory {
-  PyObject_HEAD
-
-  // DynamicMessageFactory used to create C++ instances of messages.
-  // This object cache the descriptors that were used, so the DescriptorPool
-  // needs to get rid of it before it can delete itself.
-  //
-  // Note: A C++ MessageFactory is different from the PyMessageFactory.
-  // The C++ one creates messages, when the Python one creates classes.
-  MessageFactory* message_factory;
-
-  // borrowed reference to a Python DescriptorPool.
-  // TODO(amauryfa): invert the dependency: the MessageFactory owns the
-  // DescriptorPool, not the opposite.
-  PyDescriptorPool* pool;
-
-  // Make our own mapping to retrieve Python classes from C++ descriptors.
-  //
-  // Descriptor pointers stored here are owned by the DescriptorPool above.
-  // Python references to classes are owned by this PyDescriptorPool.
-  typedef hash_map<const Descriptor*, CMessageClass*> ClassesByMessageMap;
-  ClassesByMessageMap* classes_by_descriptor;
-};
-
-extern PyTypeObject PyMessageFactory_Type;
-
-namespace message_factory {
-
-// Creates a new MessageFactory instance.
-PyMessageFactory* NewMessageFactory(PyTypeObject* type, PyDescriptorPool* pool);
-
-// Registers a new Python class for the given message descriptor.
-// On error, returns -1 with a Python exception set.
-int RegisterMessageClass(PyMessageFactory* self,
-                         const Descriptor* message_descriptor,
-                         CMessageClass* message_class);
-// Retrieves the Python class registered with the given message descriptor, or
-// fail with a TypeError. Returns a *borrowed* reference.
-CMessageClass* GetMessageClass(PyMessageFactory* self,
-                               const Descriptor* message_descriptor);
-// Retrieves the Python class registered with the given message descriptor.
-// The class is created if not done yet. Returns a *new* reference.
-CMessageClass* GetOrCreateMessageClass(PyMessageFactory* self,
-                                       const Descriptor* message_descriptor);
-}  // namespace message_factory
-
-// Initialize objects used by this module.
-// On error, returns false with a Python exception set.
-bool InitMessageFactory();
-
-}  // namespace python
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_PYTHON_CPP_MESSAGE_FACTORY_H__
diff --git a/python/google/protobuf/pyext/message_module.cc b/python/google/protobuf/pyext/message_module.cc
deleted file mode 100644
index 7c4df47..0000000
--- a/python/google/protobuf/pyext/message_module.cc
+++ /dev/null
@@ -1,121 +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.
-
-#include <Python.h>
-
-#include <google/protobuf/pyext/message.h>
-
-#include <google/protobuf/message_lite.h>
-
-static PyObject* GetPythonProto3PreserveUnknownsDefault(
-    PyObject* /*m*/, PyObject* /*args*/) {
-  if (google::protobuf::internal::GetProto3PreserveUnknownsDefault()) {
-    Py_RETURN_TRUE;
-  } else {
-    Py_RETURN_FALSE;
-  }
-}
-
-static PyObject* SetPythonProto3PreserveUnknownsDefault(
-    PyObject* /*m*/, PyObject* arg) {
-  if (!arg || !PyBool_Check(arg)) {
-    PyErr_SetString(
-        PyExc_TypeError,
-        "Argument to SetPythonProto3PreserveUnknownsDefault must be boolean");
-    return NULL;
-  }
-  google::protobuf::internal::SetProto3PreserveUnknownsDefault(PyObject_IsTrue(arg));
-  Py_RETURN_NONE;
-}
-
-static const char module_docstring[] =
-"python-proto2 is a module that can be used to enhance proto2 Python API\n"
-"performance.\n"
-"\n"
-"It provides access to the protocol buffers C++ reflection API that\n"
-"implements the basic protocol buffer functions.";
-
-static PyMethodDef ModuleMethods[] = {
-  {"SetAllowOversizeProtos",
-    (PyCFunction)google::protobuf::python::cmessage::SetAllowOversizeProtos,
-    METH_O, "Enable/disable oversize proto parsing."},
-  // DO NOT USE: For migration and testing only.
-  {"GetPythonProto3PreserveUnknownsDefault",
-    (PyCFunction)GetPythonProto3PreserveUnknownsDefault,
-    METH_NOARGS, "Get Proto3 preserve unknowns default."},
-  // DO NOT USE: For migration and testing only.
-  {"SetPythonProto3PreserveUnknownsDefault",
-    (PyCFunction)SetPythonProto3PreserveUnknownsDefault,
-    METH_O, "Enable/disable proto3 unknowns preservation."},
-  { NULL, NULL}
-};
-
-#if PY_MAJOR_VERSION >= 3
-static struct PyModuleDef _module = {
-  PyModuleDef_HEAD_INIT,
-  "_message",
-  module_docstring,
-  -1,
-  ModuleMethods,  /* m_methods */
-  NULL,
-  NULL,
-  NULL,
-  NULL
-};
-#define INITFUNC PyInit__message
-#define INITFUNC_ERRORVAL NULL
-#else  // Python 2
-#define INITFUNC init_message
-#define INITFUNC_ERRORVAL
-#endif
-
-extern "C" {
-  PyMODINIT_FUNC INITFUNC(void) {
-    PyObject* m;
-#if PY_MAJOR_VERSION >= 3
-    m = PyModule_Create(&_module);
-#else
-    m = Py_InitModule3("_message", ModuleMethods,
-                       module_docstring);
-#endif
-    if (m == NULL) {
-      return INITFUNC_ERRORVAL;
-    }
-
-    if (!google::protobuf::python::InitProto2MessageModule(m)) {
-      Py_DECREF(m);
-      return INITFUNC_ERRORVAL;
-    }
-
-#if PY_MAJOR_VERSION >= 3
-    return m;
-#endif
-  }
-}
diff --git a/python/google/protobuf/pyext/python.proto b/python/google/protobuf/pyext/python.proto
index 2e50df7..cce645d 100644
--- a/python/google/protobuf/pyext/python.proto
+++ b/python/google/protobuf/pyext/python.proto
@@ -58,11 +58,11 @@
   repeated int32 d = 2;
 }
 
-message TestAllExtensions {  // extension begin
+message TestAllExtensions {
   extensions 1 to max;
-}  // extension end
+}
 
-extend TestAllExtensions {  // extension begin
+extend TestAllExtensions {
   optional TestAllTypes.NestedMessage optional_nested_message_extension = 1;
   repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 2;
-}  // extension end
+}
diff --git a/python/google/protobuf/python_protobuf.h b/python/google/protobuf/pyext/python_protobuf.h
similarity index 100%
rename from python/google/protobuf/python_protobuf.h
rename to python/google/protobuf/pyext/python_protobuf.h
diff --git a/python/google/protobuf/pyext/repeated_composite_container.cc b/python/google/protobuf/pyext/repeated_composite_container.cc
index 5ad71db..4f339e7 100644
--- a/python/google/protobuf/pyext/repeated_composite_container.cc
+++ b/python/google/protobuf/pyext/repeated_composite_container.cc
@@ -46,9 +46,7 @@
 #include <google/protobuf/pyext/descriptor.h>
 #include <google/protobuf/pyext/descriptor_pool.h>
 #include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/reflection.h>
 
 #if PY_MAJOR_VERSION >= 3
   #define PyInt_Check PyLong_Check
@@ -138,12 +136,9 @@
   if (cmessage::AssureWritable(self->parent) == -1)
     return NULL;
   Message* message = self->message;
-
   Message* sub_message =
-      message->GetReflection()->AddMessage(
-          message,
-          self->parent_field_descriptor,
-          self->child_message_class->py_message_factory->message_factory);
+      message->GetReflection()->AddMessage(message,
+                                           self->parent_field_descriptor);
   CMessage* cmsg = cmessage::NewEmptyMessage(self->child_message_class);
   if (cmsg == NULL)
     return NULL;
@@ -151,7 +146,7 @@
   cmsg->owner = self->owner;
   cmsg->message = sub_message;
   cmsg->parent = self->parent;
-  if (cmessage::InitAttributes(cmsg, args, kwargs) < 0) {
+  if (cmessage::InitAttributes(cmsg, kwargs) < 0) {
     Py_DECREF(cmsg);
     return NULL;
   }
@@ -171,7 +166,7 @@
 
   // Create a new Message detached from the rest.
   PyObject* py_cmsg = PyEval_CallObjectWithKeywords(
-      self->child_message_class->AsPyObject(), args, kwargs);
+      self->child_message_class->AsPyObject(), NULL, kwargs);
   if (py_cmsg == NULL)
     return NULL;
 
@@ -270,11 +265,10 @@
     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
+                               length, &from, &to, &step, &slicelength) == -1) {
         return -1;
       }
       return PySequence_DelSlice(self->child_messages, from, to);
@@ -340,18 +334,6 @@
   }
 }
 
-static PyObject* ToStr(RepeatedCompositeContainer* self) {
-  ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL));
-  if (full_slice == NULL) {
-    return NULL;
-  }
-  ScopedPyObjectPtr list(Subscript(self, full_slice.get()));
-  if (list == NULL) {
-    return NULL;
-  }
-  return PyObject_Repr(list.get());
-}
-
 // ---------------------------------------------------------------------
 // sort()
 
@@ -382,7 +364,7 @@
   ScopedPyObjectPtr m(PyObject_GetAttrString(self->child_messages, "sort"));
   if (m == NULL)
     return -1;
-  if (ScopedPyObjectPtr(PyObject_Call(m.get(), args, kwds)) == NULL)
+  if (PyObject_Call(m.get(), args, kwds) == NULL)
     return -1;
   if (self->message != NULL) {
     ReorderAttached(self);
@@ -503,32 +485,6 @@
   return 0;
 }
 
-PyObject* DeepCopy(RepeatedCompositeContainer* self, PyObject* arg) {
-  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 shared_ptr<Message>& new_owner) {
   GOOGLE_CHECK_ATTACHED(self);
@@ -595,8 +551,6 @@
 };
 
 static PyMethodDef Methods[] = {
-  { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS,
-    "Makes a deep copy of the class." },
   { "add", (PyCFunction) Add, METH_VARARGS | METH_KEYWORDS,
     "Adds an object to the repeated container." },
   { "extend", (PyCFunction) Extend, METH_O,
@@ -624,7 +578,7 @@
   0,                                   //  tp_getattr
   0,                                   //  tp_setattr
   0,                                   //  tp_compare
-  (reprfunc)repeated_composite_container::ToStr,      //  tp_repr
+  0,                                   //  tp_repr
   0,                                   //  tp_as_number
   &repeated_composite_container::SqMethods,   //  tp_as_sequence
   &repeated_composite_container::MpMethods,   //  tp_as_mapping
diff --git a/python/google/protobuf/pyext/repeated_scalar_container.cc b/python/google/protobuf/pyext/repeated_scalar_container.cc
index 5a7832c..95da85f 100644
--- a/python/google/protobuf/pyext/repeated_scalar_container.cc
+++ b/python/google/protobuf/pyext/repeated_scalar_container.cc
@@ -261,6 +261,22 @@
       result = ToStringObject(field_descriptor, value);
       break;
     }
+    case FieldDescriptor::CPPTYPE_MESSAGE: {
+      PyObject* py_cmsg = PyObject_CallObject(reinterpret_cast<PyObject*>(
+          &CMessage_Type), NULL);
+      if (py_cmsg == NULL) {
+        return NULL;
+      }
+      CMessage* cmsg = reinterpret_cast<CMessage*>(py_cmsg);
+      const Message& msg = reflection->GetRepeatedMessage(
+          *message, field_descriptor, index);
+      cmsg->owner = self->owner;
+      cmsg->parent = self->parent;
+      cmsg->message = const_cast<Message*>(&msg);
+      cmsg->read_only = false;
+      result = reinterpret_cast<PyObject*>(py_cmsg);
+      break;
+    }
     default:
       PyErr_Format(
           PyExc_SystemError,
@@ -289,12 +305,10 @@
     length = Len(self);
 #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
+                             length, &from, &to, &step, &slicelength) == -1) {
       return NULL;
     }
     return_list = true;
@@ -444,11 +458,10 @@
     length = reflection->FieldSize(*message, field_descriptor);
 #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
+                             length, &from, &to, &step, &slicelength) == -1) {
       return -1;
     }
     create_list = true;
@@ -643,18 +656,6 @@
   return item;
 }
 
-static PyObject* ToStr(RepeatedScalarContainer* self) {
-  ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL));
-  if (full_slice == NULL) {
-    return NULL;
-  }
-  ScopedPyObjectPtr list(Subscript(self, full_slice.get()));
-  if (list == NULL) {
-    return NULL;
-  }
-  return PyObject_Repr(list.get());
-}
-
 // The private constructor of RepeatedScalarContainer objects.
 PyObject *NewContainer(
     CMessage* parent, const FieldDescriptor* parent_field_descriptor) {
@@ -777,7 +778,7 @@
   0,                                   //  tp_getattr
   0,                                   //  tp_setattr
   0,                                   //  tp_compare
-  (reprfunc)repeated_scalar_container::ToStr,      //  tp_repr
+  0,                                   //  tp_repr
   0,                                   //  tp_as_number
   &repeated_scalar_container::SqMethods,   //  tp_as_sequence
   &repeated_scalar_container::MpMethods,   //  tp_as_mapping
diff --git a/python/google/protobuf/pyext/safe_numerics.h b/python/google/protobuf/pyext/safe_numerics.h
deleted file mode 100644
index 639ba2c..0000000
--- a/python/google/protobuf/pyext/safe_numerics.h
+++ /dev/null
@@ -1,164 +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.
-
-#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_SAFE_NUMERICS_H__
-#define GOOGLE_PROTOBUF_PYTHON_CPP_SAFE_NUMERICS_H__
-// Copied from chromium with only changes to the namespace.
-
-#include <limits>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-
-namespace google {
-namespace protobuf {
-namespace python {
-
-template <bool SameSize, bool DestLarger,
-          bool DestIsSigned, bool SourceIsSigned>
-struct IsValidNumericCastImpl;
-
-#define BASE_NUMERIC_CAST_CASE_SPECIALIZATION(A, B, C, D, Code) \
-template <> struct IsValidNumericCastImpl<A, B, C, D> { \
-  template <class Source, class DestBounds> static inline bool Test( \
-      Source source, DestBounds min, DestBounds max) { \
-    return Code; \
-  } \
-}
-
-#define BASE_NUMERIC_CAST_CASE_SAME_SIZE(DestSigned, SourceSigned, Code) \
-  BASE_NUMERIC_CAST_CASE_SPECIALIZATION( \
-      true, true, DestSigned, SourceSigned, Code); \
-  BASE_NUMERIC_CAST_CASE_SPECIALIZATION( \
-      true, false, DestSigned, SourceSigned, Code)
-
-#define BASE_NUMERIC_CAST_CASE_SOURCE_LARGER(DestSigned, SourceSigned, Code) \
-  BASE_NUMERIC_CAST_CASE_SPECIALIZATION( \
-      false, false, DestSigned, SourceSigned, Code); \
-
-#define BASE_NUMERIC_CAST_CASE_DEST_LARGER(DestSigned, SourceSigned, Code) \
-  BASE_NUMERIC_CAST_CASE_SPECIALIZATION( \
-      false, true, DestSigned, SourceSigned, Code); \
-
-// The three top level cases are:
-// - Same size
-// - Source larger
-// - Dest larger
-// And for each of those three cases, we handle the 4 different possibilities
-// of signed and unsigned. This gives 12 cases to handle, which we enumerate
-// below.
-//
-// The last argument in each of the macros is the actual comparison code. It
-// has three arguments available, source (the value), and min/max which are
-// the ranges of the destination.
-
-
-// These are the cases where both types have the same size.
-
-// Both signed.
-BASE_NUMERIC_CAST_CASE_SAME_SIZE(true, true, true);
-// Both unsigned.
-BASE_NUMERIC_CAST_CASE_SAME_SIZE(false, false, true);
-// Dest unsigned, Source signed.
-BASE_NUMERIC_CAST_CASE_SAME_SIZE(false, true, source >= 0);
-// Dest signed, Source unsigned.
-// This cast is OK because Dest's max must be less than Source's.
-BASE_NUMERIC_CAST_CASE_SAME_SIZE(true, false,
-                                 source <= static_cast<Source>(max));
-
-
-// These are the cases where Source is larger.
-
-// Both unsigned.
-BASE_NUMERIC_CAST_CASE_SOURCE_LARGER(false, false, source <= max);
-// Both signed.
-BASE_NUMERIC_CAST_CASE_SOURCE_LARGER(true, true,
-                                     source >= min && source <= max);
-// Dest is unsigned, Source is signed.
-BASE_NUMERIC_CAST_CASE_SOURCE_LARGER(false, true,
-                                     source >= 0 && source <= max);
-// Dest is signed, Source is unsigned.
-// This cast is OK because Dest's max must be less than Source's.
-BASE_NUMERIC_CAST_CASE_SOURCE_LARGER(true, false,
-                                     source <= static_cast<Source>(max));
-
-
-// These are the cases where Dest is larger.
-
-// Both unsigned.
-BASE_NUMERIC_CAST_CASE_DEST_LARGER(false, false, true);
-// Both signed.
-BASE_NUMERIC_CAST_CASE_DEST_LARGER(true, true, true);
-// Dest is unsigned, Source is signed.
-BASE_NUMERIC_CAST_CASE_DEST_LARGER(false, true, source >= 0);
-// Dest is signed, Source is unsigned.
-BASE_NUMERIC_CAST_CASE_DEST_LARGER(true, false, true);
-
-#undef BASE_NUMERIC_CAST_CASE_SPECIALIZATION
-#undef BASE_NUMERIC_CAST_CASE_SAME_SIZE
-#undef BASE_NUMERIC_CAST_CASE_SOURCE_LARGER
-#undef BASE_NUMERIC_CAST_CASE_DEST_LARGER
-
-
-// The main test for whether the conversion will under or overflow.
-template <class Dest, class Source>
-inline bool IsValidNumericCast(Source source) {
-  typedef std::numeric_limits<Source> SourceLimits;
-  typedef std::numeric_limits<Dest> DestLimits;
-  GOOGLE_COMPILE_ASSERT(SourceLimits::is_specialized, argument_must_be_numeric);
-  GOOGLE_COMPILE_ASSERT(SourceLimits::is_integer, argument_must_be_integral);
-  GOOGLE_COMPILE_ASSERT(DestLimits::is_specialized, result_must_be_numeric);
-  GOOGLE_COMPILE_ASSERT(DestLimits::is_integer, result_must_be_integral);
-
-  return IsValidNumericCastImpl<
-      sizeof(Dest) == sizeof(Source),
-      (sizeof(Dest) > sizeof(Source)),
-      DestLimits::is_signed,
-      SourceLimits::is_signed>::Test(
-          source,
-          DestLimits::min(),
-          DestLimits::max());
-}
-
-// checked_numeric_cast<> is analogous to static_cast<> for numeric types,
-// except that it CHECKs that the specified numeric conversion will not
-// overflow or underflow. Floating point arguments are not currently allowed
-// (this is COMPILE_ASSERTd), though this could be supported if necessary.
-template <class Dest, class Source>
-inline Dest checked_numeric_cast(Source source) {
-  GOOGLE_CHECK(IsValidNumericCast<Dest>(source));
-  return static_cast<Dest>(source);
-}
-
-}  // namespace python
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_PYTHON_CPP_SAFE_NUMERICS_H__
diff --git a/python/google/protobuf/pyext/scoped_pyobject_ptr.h b/python/google/protobuf/pyext/scoped_pyobject_ptr.h
index a2afa7f..a128cd4 100644
--- a/python/google/protobuf/pyext/scoped_pyobject_ptr.h
+++ b/python/google/protobuf/pyext/scoped_pyobject_ptr.h
@@ -36,70 +36,61 @@
 #include <google/protobuf/stubs/common.h>
 
 #include <Python.h>
+
 namespace google {
-namespace protobuf {
-namespace python {
-
-// Owns a python object and decrements the reference count on destruction.
-// This class is not threadsafe.
-template <typename PyObjectStruct>
-class ScopedPythonPtr {
+class ScopedPyObjectPtr {
  public:
-  // Takes the ownership of the specified object to ScopedPythonPtr.
-  // The reference count of the specified py_object is not incremented.
-  explicit ScopedPythonPtr(PyObjectStruct* py_object = NULL)
-      : ptr_(py_object) {}
+  // Constructor.  Defaults to initializing with NULL.
+  // There is no way to create an uninitialized ScopedPyObjectPtr.
+  explicit ScopedPyObjectPtr(PyObject* p = NULL) : ptr_(p) { }
 
-  // If a PyObject is owned, decrement its reference count.
-  ~ScopedPythonPtr() { Py_XDECREF(ptr_); }
+  // Destructor.  If there is a PyObject object, delete it.
+  ~ScopedPyObjectPtr() {
+    Py_XDECREF(ptr_);
+  }
 
-  // Deletes the current owned object, if any.
-  // Then takes ownership of a new object without incrementing the reference
-  // count.
+  // Reset.  Deletes the current owned object, if any.
+  // Then takes ownership of a new object, if given.
   // This function must be called with a reference that you own.
   //   this->reset(this->get()) is wrong!
   //   this->reset(this->release()) is OK.
-  PyObjectStruct* reset(PyObjectStruct* p = NULL) {
+  PyObject* reset(PyObject* p = NULL) {
     Py_XDECREF(ptr_);
     ptr_ = p;
     return ptr_;
   }
 
-  // Releases ownership of the object without decrementing the reference count.
+  // Releases ownership of the object.
   // The caller now owns the returned reference.
-  PyObjectStruct* release() {
+  PyObject* release() {
     PyObject* p = ptr_;
     ptr_ = NULL;
     return p;
   }
 
-  PyObjectStruct* operator->() const {
+  PyObject* operator->() const  {
     assert(ptr_ != NULL);
     return ptr_;
   }
 
-  PyObjectStruct* get() const { return ptr_; }
+  PyObject* get() const { return ptr_; }
 
-  PyObject* as_pyobject() const { return reinterpret_cast<PyObject*>(ptr_); }
+  Py_ssize_t refcnt() const { return Py_REFCNT(ptr_); }
 
-  // Increments the reference count fo the current object.
-  // Should not be called when no object is held.
   void inc() const { Py_INCREF(ptr_); }
 
-  // True when a ScopedPyObjectPtr and a raw pointer refer to the same object.
-  // Comparison operators are non reflexive.
-  bool operator==(const PyObjectStruct* p) const { return ptr_ == p; }
-  bool operator!=(const PyObjectStruct* p) const { return ptr_ != p; }
+  // Comparison operators.
+  // These return whether a ScopedPyObjectPtr and a raw pointer
+  // refer to the same object, not just to two different but equal
+  // objects.
+  bool operator==(const PyObject* p) const { return ptr_ == p; }
+  bool operator!=(const PyObject* p) const { return ptr_ != p; }
 
  private:
-  PyObjectStruct* ptr_;
+  PyObject* ptr_;
 
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedPythonPtr);
+  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedPyObjectPtr);
 };
 
-typedef ScopedPythonPtr<PyObject> ScopedPyObjectPtr;
-
-}  // namespace python
-}  // namespace protobuf
 }  // namespace google
 #endif  // GOOGLE_PROTOBUF_PYTHON_CPP_SCOPED_PYOBJECT_PTR_H__
diff --git a/python/google/protobuf/reflection.py b/python/google/protobuf/reflection.py
index f4ce8ca..0c75726 100755
--- a/python/google/protobuf/reflection.py
+++ b/python/google/protobuf/reflection.py
@@ -58,11 +58,15 @@
   from google.protobuf.internal import python_message as message_impl
 
 # The type of all Message classes.
-# Part of the public interface, but normally only used by message factories.
+# Part of the public interface.
+#
+# Used by generated files, but clients can also use it at runtime:
+#   mydescriptor = pool.FindDescriptor(.....)
+#   class MyProtoClass(Message):
+#     __metaclass__ = GeneratedProtocolMessageType
+#     DESCRIPTOR = mydescriptor
 GeneratedProtocolMessageType = message_impl.GeneratedProtocolMessageType
 
-MESSAGE_CLASS_CACHE = {}
-
 
 def ParseMessage(descriptor, byte_str):
   """Generate a new Message instance from this Descriptor and a byte string.
@@ -106,16 +110,11 @@
   Returns:
     The Message class object described by the descriptor.
   """
-  if descriptor in MESSAGE_CLASS_CACHE:
-    return MESSAGE_CLASS_CACHE[descriptor]
-
   attributes = {}
   for name, nested_type in descriptor.nested_types_by_name.items():
     attributes[name] = MakeClass(nested_type)
 
   attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor
 
-  result = GeneratedProtocolMessageType(
-      str(descriptor.name), (message.Message,), attributes)
-  MESSAGE_CLASS_CACHE[descriptor] = result
-  return result
+  return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,),
+                                      attributes)
diff --git a/python/google/protobuf/symbol_database.py b/python/google/protobuf/symbol_database.py
index 5ad869f..87760f2 100644
--- a/python/google/protobuf/symbol_database.py
+++ b/python/google/protobuf/symbol_database.py
@@ -30,9 +30,11 @@
 
 """A database of Python protocol buffer generated symbols.
 
-SymbolDatabase is the MessageFactory for messages generated at compile time,
-and makes it easy to create new instances of a registered type, given only the
-type's protocol buffer symbol name.
+SymbolDatabase makes it easy to create new instances of a registered type, given
+only the type's protocol buffer symbol name. Once all symbols are registered,
+they can be accessed using either the MessageFactory interface which
+SymbolDatabase exposes, or the DescriptorPool interface of the underlying
+pool.
 
 Example usage:
 
@@ -59,17 +61,27 @@
 
 
 from google.protobuf import descriptor_pool
-from google.protobuf import message_factory
 
 
-class SymbolDatabase(message_factory.MessageFactory):
-  """A database of Python generated symbols."""
+class SymbolDatabase(object):
+  """A database of Python generated symbols.
+
+  SymbolDatabase also models message_factory.MessageFactory.
+
+  The symbol database can be used to keep a global registry of all protocol
+  buffer types used within a program.
+  """
+
+  def __init__(self, pool=None):
+    """Constructor."""
+
+    self._symbols = {}
+    self._symbols_by_file = {}
+    self.pool = pool or descriptor_pool.Default()
 
   def RegisterMessage(self, message):
     """Registers the given message type in the local database.
 
-    Calls to GetSymbol() and GetMessages() will return messages registered here.
-
     Args:
       message: a message.Message, to be registered.
 
@@ -78,18 +90,13 @@
     """
 
     desc = message.DESCRIPTOR
-    self._classes[desc] = message
-    self.RegisterMessageDescriptor(desc)
+    self._symbols[desc.full_name] = message
+    if desc.file.name not in self._symbols_by_file:
+      self._symbols_by_file[desc.file.name] = {}
+    self._symbols_by_file[desc.file.name][desc.full_name] = message
+    self.pool.AddDescriptor(desc)
     return message
 
-  def RegisterMessageDescriptor(self, message_descriptor):
-    """Registers the given message descriptor in the local database.
-
-    Args:
-      message_descriptor: a descriptor.MessageDescriptor.
-    """
-    self.pool.AddDescriptor(message_descriptor)
-
   def RegisterEnumDescriptor(self, enum_descriptor):
     """Registers the given enum descriptor in the local database.
 
@@ -102,17 +109,6 @@
     self.pool.AddEnumDescriptor(enum_descriptor)
     return enum_descriptor
 
-  def RegisterServiceDescriptor(self, service_descriptor):
-    """Registers the given service descriptor in the local database.
-
-    Args:
-      service_descriptor: a descriptor.ServiceDescriptor.
-
-    Returns:
-      The provided descriptor.
-    """
-    self.pool.AddServiceDescriptor(service_descriptor)
-
   def RegisterFileDescriptor(self, file_descriptor):
     """Registers the given file descriptor in the local database.
 
@@ -140,47 +136,47 @@
       KeyError: if the symbol could not be found.
     """
 
-    return self._classes[self.pool.FindMessageTypeByName(symbol)]
+    return self._symbols[symbol]
+
+  def GetPrototype(self, descriptor):
+    """Builds a proto2 message class based on the passed in descriptor.
+
+    Passing a descriptor with a fully qualified name matching a previous
+    invocation will cause the same class to be returned.
+
+    Args:
+      descriptor: The descriptor to build from.
+
+    Returns:
+      A class describing the passed in descriptor.
+    """
+
+    return self.GetSymbol(descriptor.full_name)
 
   def GetMessages(self, files):
-    # TODO(amauryfa): Fix the differences with MessageFactory.
-    """Gets all registered messages from a specified file.
+    """Gets all the messages from a specified file.
 
-    Only messages already created and registered will be returned; (this is the
-    case for imported _pb2 modules)
-    But unlike MessageFactory, this version also returns already defined nested
-    messages, but does not register any message extensions.
+    This will find and resolve dependencies, failing if they are not registered
+    in the symbol database.
+
 
     Args:
       files: The file names to extract messages from.
 
     Returns:
-      A dictionary mapping proto names to the message classes.
+      A dictionary mapping proto names to the message classes. This will include
+      any dependent messages as well as any messages defined in the same file as
+      a specified message.
 
     Raises:
       KeyError: if a file could not be found.
     """
 
-    def _GetAllMessages(desc):
-      """Walk a message Descriptor and recursively yields all message names."""
-      yield desc
-      for msg_desc in desc.nested_types:
-        for nested_desc in _GetAllMessages(msg_desc):
-          yield nested_desc
-
     result = {}
-    for file_name in files:
-      file_desc = self.pool.FindFileByName(file_name)
-      for msg_desc in file_desc.message_types_by_name.values():
-        for desc in _GetAllMessages(msg_desc):
-          try:
-            result[desc.full_name] = self._classes[desc]
-          except KeyError:
-            # This descriptor has no registered class, skip it.
-            pass
+    for f in files:
+      result.update(self._symbols_by_file[f])
     return result
 
-
 _DEFAULT = SymbolDatabase(pool=descriptor_pool.Default())
 
 
diff --git a/python/google/protobuf/text_format.py b/python/google/protobuf/text_format.py
index 6b12632..6f1e3c8 100755
--- a/python/google/protobuf/text_format.py
+++ b/python/google/protobuf/text_format.py
@@ -48,15 +48,15 @@
 import six
 
 if six.PY3:
-  long = int  # pylint: disable=redefined-builtin,invalid-name
+  long = int
 
-# pylint: disable=g-import-not-at-top
 from google.protobuf.internal import type_checkers
 from google.protobuf import descriptor
 from google.protobuf import text_encoding
 
-__all__ = ['MessageToString', 'PrintMessage', 'PrintField', 'PrintFieldValue',
-           'Merge']
+__all__ = ['MessageToString', 'PrintMessage', 'PrintField',
+           'PrintFieldValue', 'Merge']
+
 
 _INTEGER_CHECKERS = (type_checkers.Uint32ValueChecker(),
                      type_checkers.Int32ValueChecker(),
@@ -67,7 +67,6 @@
 _FLOAT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_FLOAT,
                           descriptor.FieldDescriptor.CPPTYPE_DOUBLE])
 _QUOTES = frozenset(("'", '"'))
-_ANY_FULL_TYPE_NAME = 'google.protobuf.Any'
 
 
 class Error(Exception):
@@ -75,30 +74,10 @@
 
 
 class ParseError(Error):
-  """Thrown in case of text parsing or tokenizing error."""
-
-  def __init__(self, message=None, line=None, column=None):
-    if message is not None and line is not None:
-      loc = str(line)
-      if column is not None:
-        loc += ':{0}'.format(column)
-      message = '{0} : {1}'.format(loc, message)
-    if message is not None:
-      super(ParseError, self).__init__(message)
-    else:
-      super(ParseError, self).__init__()
-    self._line = line
-    self._column = column
-
-  def GetLine(self):
-    return self._line
-
-  def GetColumn(self):
-    return self._column
+  """Thrown in case of text parsing error."""
 
 
 class TextWriter(object):
-
   def __init__(self, as_utf8):
     if six.PY2:
       self._writer = io.BytesIO()
@@ -118,16 +97,9 @@
     return self._writer.getvalue()
 
 
-def MessageToString(message,
-                    as_utf8=False,
-                    as_one_line=False,
-                    pointy_brackets=False,
-                    use_index_order=False,
-                    float_format=None,
-                    use_field_number=False,
-                    descriptor_pool=None,
-                    indent=0,
-                    message_formatter=None):
+def MessageToString(message, as_utf8=False, as_one_line=False,
+                    pointy_brackets=False, use_index_order=False,
+                    float_format=None, use_field_number=False):
   """Convert protobuf message to text format.
 
   Floating point values can be formatted compactly with 15 digits of
@@ -147,19 +119,14 @@
     float_format: If set, use this to specify floating point number formatting
       (per the "Format Specification Mini-Language"); otherwise, str() is used.
     use_field_number: If True, print field numbers instead of names.
-    descriptor_pool: A DescriptorPool used to resolve Any types.
-    indent: The indent level, in terms of spaces, for pretty print.
-    message_formatter: A function(message, indent, as_one_line): unicode|None
-      to custom format selected sub-messages (usually based on message type).
-      Use to pretty print parts of the protobuf for easier diffing.
 
   Returns:
     A string of the text formatted protocol buffer message.
   """
   out = TextWriter(as_utf8)
-  printer = _Printer(out, indent, as_utf8, as_one_line, pointy_brackets,
-                     use_index_order, float_format, use_field_number,
-                     descriptor_pool, message_formatter)
+  printer = _Printer(out, 0, as_utf8, as_one_line,
+                     pointy_brackets, use_index_order, float_format,
+                     use_field_number)
   printer.PrintMessage(message)
   result = out.getvalue()
   out.close()
@@ -174,94 +141,39 @@
           field.message_type.GetOptions().map_entry)
 
 
-def PrintMessage(message,
-                 out,
-                 indent=0,
-                 as_utf8=False,
-                 as_one_line=False,
-                 pointy_brackets=False,
-                 use_index_order=False,
-                 float_format=None,
-                 use_field_number=False,
-                 descriptor_pool=None,
-                 message_formatter=None):
-  printer = _Printer(out, indent, as_utf8, as_one_line, pointy_brackets,
-                     use_index_order, float_format, use_field_number,
-                     descriptor_pool, message_formatter)
+def PrintMessage(message, out, indent=0, as_utf8=False, as_one_line=False,
+                 pointy_brackets=False, use_index_order=False,
+                 float_format=None, use_field_number=False):
+  printer = _Printer(out, indent, as_utf8, as_one_line,
+                     pointy_brackets, use_index_order, float_format,
+                     use_field_number)
   printer.PrintMessage(message)
 
 
-def PrintField(field,
-               value,
-               out,
-               indent=0,
-               as_utf8=False,
-               as_one_line=False,
-               pointy_brackets=False,
-               use_index_order=False,
-               float_format=None,
-               message_formatter=None):
+def PrintField(field, value, out, indent=0, as_utf8=False, as_one_line=False,
+               pointy_brackets=False, use_index_order=False, float_format=None):
   """Print a single field name/value pair."""
-  printer = _Printer(out, indent, as_utf8, as_one_line, pointy_brackets,
-                     use_index_order, float_format, message_formatter)
+  printer = _Printer(out, indent, as_utf8, as_one_line,
+                     pointy_brackets, use_index_order, float_format)
   printer.PrintField(field, value)
 
 
-def PrintFieldValue(field,
-                    value,
-                    out,
-                    indent=0,
-                    as_utf8=False,
-                    as_one_line=False,
-                    pointy_brackets=False,
+def PrintFieldValue(field, value, out, indent=0, as_utf8=False,
+                    as_one_line=False, pointy_brackets=False,
                     use_index_order=False,
-                    float_format=None,
-                    message_formatter=None):
+                    float_format=None):
   """Print a single field value (not including name)."""
-  printer = _Printer(out, indent, as_utf8, as_one_line, pointy_brackets,
-                     use_index_order, float_format, message_formatter)
+  printer = _Printer(out, indent, as_utf8, as_one_line,
+                     pointy_brackets, use_index_order, float_format)
   printer.PrintFieldValue(field, value)
 
 
-def _BuildMessageFromTypeName(type_name, descriptor_pool):
-  """Returns a protobuf message instance.
-
-  Args:
-    type_name: Fully-qualified protobuf  message type name string.
-    descriptor_pool: DescriptorPool instance.
-
-  Returns:
-    A Message instance of type matching type_name, or None if the a Descriptor
-    wasn't found matching type_name.
-  """
-  # pylint: disable=g-import-not-at-top
-  if descriptor_pool is None:
-    from google.protobuf import descriptor_pool as pool_mod
-    descriptor_pool = pool_mod.Default()
-  from google.protobuf import symbol_database
-  database = symbol_database.Default()
-  try:
-    message_descriptor = descriptor_pool.FindMessageTypeByName(type_name)
-  except KeyError:
-    return None
-  message_type = database.GetPrototype(message_descriptor)
-  return message_type()
-
-
 class _Printer(object):
   """Text format printer for protocol message."""
 
-  def __init__(self,
-               out,
-               indent=0,
-               as_utf8=False,
-               as_one_line=False,
-               pointy_brackets=False,
-               use_index_order=False,
-               float_format=None,
-               use_field_number=False,
-               descriptor_pool=None,
-               message_formatter=None):
+  def __init__(self, out, indent=0, as_utf8=False, as_one_line=False,
+               pointy_brackets=False, use_index_order=False, float_format=None,
+               use_field_number=False):
     """Initialize the Printer.
 
     Floating point values can be formatted compactly with 15 digits of
@@ -283,10 +195,6 @@
         (per the "Format Specification Mini-Language"); otherwise, str() is
         used.
       use_field_number: If True, print field numbers instead of names.
-      descriptor_pool: A DescriptorPool used to resolve Any types.
-      message_formatter: A function(message, indent, as_one_line): unicode|None
-        to custom format selected sub-messages (usually based on message type).
-        Use to pretty print parts of the protobuf for easier diffing.
     """
     self.out = out
     self.indent = indent
@@ -296,32 +204,6 @@
     self.use_index_order = use_index_order
     self.float_format = float_format
     self.use_field_number = use_field_number
-    self.descriptor_pool = descriptor_pool
-    self.message_formatter = message_formatter
-
-  def _TryPrintAsAnyMessage(self, message):
-    """Serializes if message is a google.protobuf.Any field."""
-    packed_message = _BuildMessageFromTypeName(message.TypeName(),
-                                               self.descriptor_pool)
-    if packed_message:
-      packed_message.MergeFromString(message.value)
-      self.out.write('%s[%s]' % (self.indent * ' ', message.type_url))
-      self._PrintMessageFieldValue(packed_message)
-      self.out.write(' ' if self.as_one_line else '\n')
-      return True
-    else:
-      return False
-
-  def _TryCustomFormatMessage(self, message):
-    formatted = self.message_formatter(message, self.indent, self.as_one_line)
-    if formatted is None:
-      return False
-
-    out = self.out
-    out.write(' ' * self.indent)
-    out.write(formatted)
-    out.write(' ' if self.as_one_line else '\n')
-    return True
 
   def PrintMessage(self, message):
     """Convert protobuf message to text format.
@@ -329,11 +211,6 @@
     Args:
       message: The protocol buffers message.
     """
-    if self.message_formatter and self._TryCustomFormatMessage(message):
-      return
-    if (message.DESCRIPTOR.full_name == _ANY_FULL_TYPE_NAME and
-        self._TryPrintAsAnyMessage(message)):
-      return
     fields = message.ListFields()
     if self.use_index_order:
       fields.sort(key=lambda x: x[0].index)
@@ -345,7 +222,8 @@
           # of this file to work around.
           #
           # TODO(haberman): refactor and optimize if this becomes an issue.
-          entry_submsg = value.GetEntryClass()(key=key, value=value[key])
+          entry_submsg = field.message_type._concrete_class(
+              key=key, value=value[key])
           self.PrintField(field, entry_submsg)
       elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
         for element in value:
@@ -386,25 +264,6 @@
     else:
       out.write('\n')
 
-  def _PrintMessageFieldValue(self, value):
-    if self.pointy_brackets:
-      openb = '<'
-      closeb = '>'
-    else:
-      openb = '{'
-      closeb = '}'
-
-    if self.as_one_line:
-      self.out.write(' %s ' % openb)
-      self.PrintMessage(value)
-      self.out.write(closeb)
-    else:
-      self.out.write(' %s\n' % openb)
-      self.indent += 2
-      self.PrintMessage(value)
-      self.indent -= 2
-      self.out.write(' ' * self.indent + closeb)
-
   def PrintFieldValue(self, field, value):
     """Print a single field value (not including name).
 
@@ -415,8 +274,24 @@
       value: The value of the field.
     """
     out = self.out
+    if self.pointy_brackets:
+      openb = '<'
+      closeb = '>'
+    else:
+      openb = '{'
+      closeb = '}'
+
     if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
-      self._PrintMessageFieldValue(value)
+      if self.as_one_line:
+        out.write(' %s ' % openb)
+        self.PrintMessage(value)
+        out.write(closeb)
+      else:
+        out.write(' %s\n' % openb)
+        self.indent += 2
+        self.PrintMessage(value)
+        self.indent -= 2
+        out.write(' ' * self.indent + closeb)
     elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:
       enum_value = field.enum_type.values_by_number.get(value, None)
       if enum_value is not None:
@@ -447,28 +322,9 @@
       out.write(str(value))
 
 
-def Parse(text,
-          message,
-          allow_unknown_extension=False,
-          allow_field_number=False,
-          descriptor_pool=None):
-  """Parses a text representation of a protocol message into a message.
-
-  NOTE: for historical reasons this function does not clear the input
-  message. This is different from what the binary msg.ParseFrom(...) does.
-
-  Example
-    a = MyProto()
-    a.repeated_field.append('test')
-    b = MyProto()
-
-    text_format.Parse(repr(a), b)
-    text_format.Parse(repr(a), b) # repeated_field contains ["test", "test"]
-
-    # Binary version:
-    b.ParseFromString(a.SerializeToString()) # repeated_field is now "test"
-
-  Caller is responsible for clearing the message as needed.
+def Parse(text, message,
+          allow_unknown_extension=False, allow_field_number=False):
+  """Parses an text representation of a protocol message into a message.
 
   Args:
     text: Message text representation.
@@ -476,7 +332,6 @@
     allow_unknown_extension: if True, skip over missing extensions and keep
       parsing
     allow_field_number: if True, both field number and field name are allowed.
-    descriptor_pool: A DescriptorPool used to resolve Any types.
 
   Returns:
     The same message passed as argument.
@@ -485,23 +340,14 @@
     ParseError: On text parsing problems.
   """
   if not isinstance(text, str):
-    if six.PY3:
-      text = text.decode('utf-8')
-    else:
-      text = text.encode('utf-8')
-  return ParseLines(text.split('\n'),
-                    message,
-                    allow_unknown_extension,
-                    allow_field_number,
-                    descriptor_pool=descriptor_pool)
+    text = text.decode('utf-8')
+  return ParseLines(text.split('\n'), message, allow_unknown_extension,
+                    allow_field_number)
 
 
-def Merge(text,
-          message,
-          allow_unknown_extension=False,
-          allow_field_number=False,
-          descriptor_pool=None):
-  """Parses a text representation of a protocol message into a message.
+def Merge(text, message, allow_unknown_extension=False,
+          allow_field_number=False):
+  """Parses an text representation of a protocol message into a message.
 
   Like Parse(), but allows repeated values for a non-repeated field, and uses
   the last one.
@@ -512,7 +358,6 @@
     allow_unknown_extension: if True, skip over missing extensions and keep
       parsing
     allow_field_number: if True, both field number and field name are allowed.
-    descriptor_pool: A DescriptorPool used to resolve Any types.
 
   Returns:
     The same message passed as argument.
@@ -520,25 +365,13 @@
   Raises:
     ParseError: On text parsing problems.
   """
-  if not isinstance(text, str):
-    if six.PY3:
-      text = text.decode('utf-8')
-    else:
-      text = text.encode('utf-8')
-  return MergeLines(
-      text.split('\n'),
-      message,
-      allow_unknown_extension,
-      allow_field_number,
-      descriptor_pool=descriptor_pool)
+  return MergeLines(text.split('\n'), message, allow_unknown_extension,
+                    allow_field_number)
 
 
-def ParseLines(lines,
-               message,
-               allow_unknown_extension=False,
-               allow_field_number=False,
-               descriptor_pool=None):
-  """Parses a text representation of a protocol message into a message.
+def ParseLines(lines, message, allow_unknown_extension=False,
+               allow_field_number=False):
+  """Parses an text representation of a protocol message into a message.
 
   Args:
     lines: An iterable of lines of a message's text representation.
@@ -546,7 +379,6 @@
     allow_unknown_extension: if True, skip over missing extensions and keep
       parsing
     allow_field_number: if True, both field number and field name are allowed.
-    descriptor_pool: A DescriptorPool used to resolve Any types.
 
   Returns:
     The same message passed as argument.
@@ -554,18 +386,13 @@
   Raises:
     ParseError: On text parsing problems.
   """
-  parser = _Parser(allow_unknown_extension,
-                   allow_field_number,
-                   descriptor_pool=descriptor_pool)
+  parser = _Parser(allow_unknown_extension, allow_field_number)
   return parser.ParseLines(lines, message)
 
 
-def MergeLines(lines,
-               message,
-               allow_unknown_extension=False,
-               allow_field_number=False,
-               descriptor_pool=None):
-  """Parses a text representation of a protocol message into a message.
+def MergeLines(lines, message, allow_unknown_extension=False,
+               allow_field_number=False):
+  """Parses an text representation of a protocol message into a message.
 
   Args:
     lines: An iterable of lines of a message's text representation.
@@ -573,7 +400,6 @@
     allow_unknown_extension: if True, skip over missing extensions and keep
       parsing
     allow_field_number: if True, both field number and field name are allowed.
-    descriptor_pool: A DescriptorPool used to resolve Any types.
 
   Returns:
     The same message passed as argument.
@@ -581,47 +407,41 @@
   Raises:
     ParseError: On text parsing problems.
   """
-  parser = _Parser(allow_unknown_extension,
-                   allow_field_number,
-                   descriptor_pool=descriptor_pool)
+  parser = _Parser(allow_unknown_extension, allow_field_number)
   return parser.MergeLines(lines, message)
 
 
 class _Parser(object):
   """Text format parser for protocol message."""
 
-  def __init__(self,
-               allow_unknown_extension=False,
-               allow_field_number=False,
-               descriptor_pool=None):
+  def __init__(self, allow_unknown_extension=False, allow_field_number=False):
     self.allow_unknown_extension = allow_unknown_extension
     self.allow_field_number = allow_field_number
-    self.descriptor_pool = descriptor_pool
 
   def ParseFromString(self, text, message):
-    """Parses a text representation of a protocol message into a message."""
+    """Parses an text representation of a protocol message into a message."""
     if not isinstance(text, str):
       text = text.decode('utf-8')
     return self.ParseLines(text.split('\n'), message)
 
   def ParseLines(self, lines, message):
-    """Parses a text representation of a protocol message into a message."""
+    """Parses an text representation of a protocol message into a message."""
     self._allow_multiple_scalars = False
     self._ParseOrMerge(lines, message)
     return message
 
   def MergeFromString(self, text, message):
-    """Merges a text representation of a protocol message into a message."""
+    """Merges an text representation of a protocol message into a message."""
     return self._MergeLines(text.split('\n'), message)
 
   def MergeLines(self, lines, message):
-    """Merges a text representation of a protocol message into a message."""
+    """Merges an text representation of a protocol message into a message."""
     self._allow_multiple_scalars = True
     self._ParseOrMerge(lines, message)
     return message
 
   def _ParseOrMerge(self, lines, message):
-    """Converts a text representation of a protocol message into a message.
+    """Converts an text representation of a protocol message into a message.
 
     Args:
       lines: Lines of a message's text representation.
@@ -630,7 +450,7 @@
     Raises:
       ParseError: On text parsing problems.
     """
-    tokenizer = Tokenizer(lines)
+    tokenizer = _Tokenizer(lines)
     while not tokenizer.AtEnd():
       self._MergeField(tokenizer, message)
 
@@ -645,6 +465,11 @@
       ParseError: In case of text parsing problems.
     """
     message_descriptor = message.DESCRIPTOR
+    if (hasattr(message_descriptor, 'syntax') and
+        message_descriptor.syntax == 'proto3'):
+      # Proto3 doesn't represent presence so we can't test if multiple
+      # scalars have occurred.  We have to allow them.
+      self._allow_multiple_scalars = True
     if tokenizer.TryConsume('['):
       name = [tokenizer.ConsumeIdentifier()]
       while tokenizer.TryConsume('.'):
@@ -663,20 +488,16 @@
           field = None
         else:
           raise tokenizer.ParseErrorPreviousToken(
-              'Extension "%s" not registered. '
-              'Did you import the _pb2 module which defines it? '
-              'If you are trying to place the extension in the MessageSet '
-              'field of another message that is in an Any or MessageSet field, '
-              'that message\'s _pb2 module must be imported as well' % name)
+              'Extension "%s" not registered.' % name)
       elif message_descriptor != field.containing_type:
         raise tokenizer.ParseErrorPreviousToken(
-            'Extension "%s" does not extend message type "%s".' %
-            (name, message_descriptor.full_name))
+            'Extension "%s" does not extend message type "%s".' % (
+                name, message_descriptor.full_name))
 
       tokenizer.Consume(']')
 
     else:
-      name = tokenizer.ConsumeIdentifierOrNumber()
+      name = tokenizer.ConsumeIdentifier()
       if self.allow_field_number and name.isdigit():
         number = ParseInteger(name, True, True)
         field = message_descriptor.fields_by_number.get(number, None)
@@ -699,8 +520,8 @@
 
       if not field:
         raise tokenizer.ParseErrorPreviousToken(
-            'Message type "%s" has no field named "%s".' %
-            (message_descriptor.full_name, name))
+            'Message type "%s" has no field named "%s".' % (
+                message_descriptor.full_name, name))
 
     if field:
       if not self._allow_multiple_scalars and field.containing_oneof:
@@ -711,9 +532,9 @@
         if which_oneof is not None and which_oneof != field.name:
           raise tokenizer.ParseErrorPreviousToken(
               'Field "%s" is specified along with field "%s", another member '
-              'of oneof "%s" for message type "%s".' %
-              (field.name, which_oneof, field.containing_oneof.name,
-               message_descriptor.full_name))
+              'of oneof "%s" for message type "%s".' % (
+                  field.name, which_oneof, field.containing_oneof.name,
+                  message_descriptor.full_name))
 
       if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
         tokenizer.TryConsume(':')
@@ -722,13 +543,12 @@
         tokenizer.Consume(':')
         merger = self._MergeScalarField
 
-      if (field.label == descriptor.FieldDescriptor.LABEL_REPEATED and
-          tokenizer.TryConsume('[')):
+      if (field.label == descriptor.FieldDescriptor.LABEL_REPEATED
+          and tokenizer.TryConsume('[')):
         # Short repeated format, e.g. "foo: [1, 2, 3]"
         while True:
           merger(tokenizer, message, field)
-          if tokenizer.TryConsume(']'):
-            break
+          if tokenizer.TryConsume(']'): break
           tokenizer.Consume(',')
 
       else:
@@ -743,21 +563,6 @@
     if not tokenizer.TryConsume(','):
       tokenizer.TryConsume(';')
 
-  def _ConsumeAnyTypeUrl(self, tokenizer):
-    """Consumes a google.protobuf.Any type URL and returns the type name."""
-    # Consume "type.googleapis.com/".
-    prefix = [tokenizer.ConsumeIdentifier()]
-    tokenizer.Consume('.')
-    prefix.append(tokenizer.ConsumeIdentifier())
-    tokenizer.Consume('.')
-    prefix.append(tokenizer.ConsumeIdentifier())
-    tokenizer.Consume('/')
-    # Consume the fully-qualified type name.
-    name = [tokenizer.ConsumeIdentifier()]
-    while tokenizer.TryConsume('.'):
-      name.append(tokenizer.ConsumeIdentifier())
-    return '.'.join(prefix), '.'.join(name)
-
   def _MergeMessageField(self, tokenizer, message, field):
     """Merges a single scalar field into a message.
 
@@ -777,37 +582,12 @@
       tokenizer.Consume('{')
       end_token = '}'
 
-    if (field.message_type.full_name == _ANY_FULL_TYPE_NAME and
-        tokenizer.TryConsume('[')):
-      type_url_prefix, packed_type_name = self._ConsumeAnyTypeUrl(tokenizer)
-      tokenizer.Consume(']')
-      tokenizer.TryConsume(':')
-      if tokenizer.TryConsume('<'):
-        expanded_any_end_token = '>'
-      else:
-        tokenizer.Consume('{')
-        expanded_any_end_token = '}'
-      expanded_any_sub_message = _BuildMessageFromTypeName(packed_type_name,
-                                                           self.descriptor_pool)
-      if not expanded_any_sub_message:
-        raise ParseError('Type %s not found in descriptor pool' %
-                         packed_type_name)
-      while not tokenizer.TryConsume(expanded_any_end_token):
-        if tokenizer.AtEnd():
-          raise tokenizer.ParseErrorPreviousToken('Expected "%s".' %
-                                                  (expanded_any_end_token,))
-        self._MergeField(tokenizer, expanded_any_sub_message)
-      if field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
-        any_message = getattr(message, field.name).add()
-      else:
-        any_message = getattr(message, field.name)
-      any_message.Pack(expanded_any_sub_message,
-                       type_url_prefix=type_url_prefix)
-    elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
+    if field.label == descriptor.FieldDescriptor.LABEL_REPEATED:
       if field.is_extension:
         sub_message = message.Extensions[field].add()
       elif is_map_entry:
-        sub_message = getattr(message, field.name).GetEntryClass()()
+        # pylint: disable=protected-access
+        sub_message = field.message_type._concrete_class()
       else:
         sub_message = getattr(message, field.name).add()
     else:
@@ -830,12 +610,6 @@
       else:
         getattr(message, field.name)[sub_message.key] = sub_message.value
 
-  @staticmethod
-  def _IsProto3Syntax(message):
-    message_descriptor = message.DESCRIPTOR
-    return (hasattr(message_descriptor, 'syntax') and
-            message_descriptor.syntax == 'proto3')
-
   def _MergeScalarField(self, tokenizer, message, field):
     """Merges a single scalar field into a message.
 
@@ -854,17 +628,17 @@
     if field.type in (descriptor.FieldDescriptor.TYPE_INT32,
                       descriptor.FieldDescriptor.TYPE_SINT32,
                       descriptor.FieldDescriptor.TYPE_SFIXED32):
-      value = _ConsumeInt32(tokenizer)
+      value = tokenizer.ConsumeInt32()
     elif field.type in (descriptor.FieldDescriptor.TYPE_INT64,
                         descriptor.FieldDescriptor.TYPE_SINT64,
                         descriptor.FieldDescriptor.TYPE_SFIXED64):
-      value = _ConsumeInt64(tokenizer)
+      value = tokenizer.ConsumeInt64()
     elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32,
                         descriptor.FieldDescriptor.TYPE_FIXED32):
-      value = _ConsumeUint32(tokenizer)
+      value = tokenizer.ConsumeUint32()
     elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64,
                         descriptor.FieldDescriptor.TYPE_FIXED64):
-      value = _ConsumeUint64(tokenizer)
+      value = tokenizer.ConsumeUint64()
     elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT,
                         descriptor.FieldDescriptor.TYPE_DOUBLE):
       value = tokenizer.ConsumeFloat()
@@ -885,20 +659,15 @@
       else:
         getattr(message, field.name).append(value)
     else:
-      # Proto3 doesn't represent presence so we can't test if multiple scalars
-      # have occurred. We have to allow them.
-      can_check_presence = not self._IsProto3Syntax(message)
       if field.is_extension:
-        if (not self._allow_multiple_scalars and can_check_presence and
-            message.HasExtension(field)):
+        if not self._allow_multiple_scalars and message.HasExtension(field):
           raise tokenizer.ParseErrorPreviousToken(
               'Message type "%s" should not have multiple "%s" extensions.' %
               (message.DESCRIPTOR.full_name, field.full_name))
         else:
           message.Extensions[field] = value
       else:
-        if (not self._allow_multiple_scalars and can_check_presence and
-            message.HasField(field.name)):
+        if not self._allow_multiple_scalars and message.HasField(field.name):
           raise tokenizer.ParseErrorPreviousToken(
               'Message type "%s" should not have multiple "%s" fields.' %
               (message.DESCRIPTOR.full_name, field.name))
@@ -984,12 +753,13 @@
     return
 
   if (not tokenizer.TryConsumeIdentifier() and
-      not _TryConsumeInt64(tokenizer) and not _TryConsumeUint64(tokenizer) and
+      not tokenizer.TryConsumeInt64() and
+      not tokenizer.TryConsumeUint64() and
       not tokenizer.TryConsumeFloat()):
     raise ParseError('Invalid field value: ' + tokenizer.token)
 
 
-class Tokenizer(object):
+class _Tokenizer(object):
   """Protocol buffer text representation tokenizer.
 
   This class handles the lower level string parsing by splitting it into
@@ -998,20 +768,17 @@
   It was directly ported from the Java protocol buffer API.
   """
 
-  _WHITESPACE = re.compile(r'\s+')
-  _COMMENT = re.compile(r'(\s*#.*$)', re.MULTILINE)
-  _WHITESPACE_OR_COMMENT = re.compile(r'(\s|(#.*$))+', re.MULTILINE)
+  _WHITESPACE = re.compile('(\\s|(#.*$))+', re.MULTILINE)
   _TOKEN = re.compile('|'.join([
-      r'[a-zA-Z_][0-9a-zA-Z_+-]*',  # an identifier
+      r'[a-zA-Z_][0-9a-zA-Z_+-]*',             # an identifier
       r'([0-9+-]|(\.[0-9]))[0-9a-zA-Z_.+-]*',  # a number
-  ] + [  # quoted str for each quote mark
+  ] + [                                        # quoted str for each quote mark
       r'{qt}([^{qt}\n\\]|\\.)*({qt}|\\?$)'.format(qt=mark) for mark in _QUOTES
   ]))
 
-  _IDENTIFIER = re.compile(r'[^\d\W]\w*')
-  _IDENTIFIER_OR_NUMBER = re.compile(r'\w+')
+  _IDENTIFIER = re.compile(r'\w+')
 
-  def __init__(self, lines, skip_comments=True):
+  def __init__(self, lines):
     self._position = 0
     self._line = -1
     self._column = 0
@@ -1022,9 +789,6 @@
     self._previous_line = 0
     self._previous_column = 0
     self._more_lines = True
-    self._skip_comments = skip_comments
-    self._whitespace_pattern = (skip_comments and self._WHITESPACE_OR_COMMENT
-                                or self._WHITESPACE)
     self._SkipWhitespace()
     self.NextToken()
 
@@ -1054,7 +818,7 @@
   def _SkipWhitespace(self):
     while True:
       self._PopLine()
-      match = self._whitespace_pattern.match(self._current_line, self._column)
+      match = self._WHITESPACE.match(self._current_line, self._column)
       if not match:
         break
       length = len(match.group(0))
@@ -1084,30 +848,7 @@
       ParseError: If the text couldn't be consumed.
     """
     if not self.TryConsume(token):
-      raise self.ParseError('Expected "%s".' % token)
-
-  def ConsumeComment(self):
-    result = self.token
-    if not self._COMMENT.match(result):
-      raise self.ParseError('Expected comment.')
-    self.NextToken()
-    return result
-
-  def ConsumeCommentOrTrailingComment(self):
-    """Consumes a comment, returns a 2-tuple (trailing bool, comment str)."""
-
-    # Tokenizer initializes _previous_line and _previous_column to 0. As the
-    # tokenizer starts, it looks like there is a previous token on the line.
-    just_started = self._line == 0 and self._column == 0
-
-    before_parsing = self._previous_line
-    comment = self.ConsumeComment()
-
-    # A trailing comment is a comment on the same line than the previous token.
-    trailing = (self._previous_line == before_parsing
-                and not just_started)
-
-    return trailing, comment
+      raise self._ParseError('Expected "%s".' % token)
 
   def TryConsumeIdentifier(self):
     try:
@@ -1127,55 +868,85 @@
     """
     result = self.token
     if not self._IDENTIFIER.match(result):
-      raise self.ParseError('Expected identifier.')
+      raise self._ParseError('Expected identifier.')
     self.NextToken()
     return result
 
-  def TryConsumeIdentifierOrNumber(self):
-    try:
-      self.ConsumeIdentifierOrNumber()
-      return True
-    except ParseError:
-      return False
+  def ConsumeInt32(self):
+    """Consumes a signed 32bit integer number.
 
-  def ConsumeIdentifierOrNumber(self):
-    """Consumes protocol message field identifier.
-
-    Returns:
-      Identifier string.
-
-    Raises:
-      ParseError: If an identifier couldn't be consumed.
-    """
-    result = self.token
-    if not self._IDENTIFIER_OR_NUMBER.match(result):
-      raise self.ParseError('Expected identifier or number, got %s.' % result)
-    self.NextToken()
-    return result
-
-  def TryConsumeInteger(self):
-    try:
-      # Note: is_long only affects value type, not whether an error is raised.
-      self.ConsumeInteger()
-      return True
-    except ParseError:
-      return False
-
-  def ConsumeInteger(self, is_long=False):
-    """Consumes an integer number.
-
-    Args:
-      is_long: True if the value should be returned as a long integer.
     Returns:
       The integer parsed.
 
     Raises:
-      ParseError: If an integer couldn't be consumed.
+      ParseError: If a signed 32bit integer couldn't be consumed.
     """
     try:
-      result = _ParseAbstractInteger(self.token, is_long=is_long)
+      result = ParseInteger(self.token, is_signed=True, is_long=False)
     except ValueError as e:
-      raise self.ParseError(str(e))
+      raise self._ParseError(str(e))
+    self.NextToken()
+    return result
+
+  def ConsumeUint32(self):
+    """Consumes an unsigned 32bit integer number.
+
+    Returns:
+      The integer parsed.
+
+    Raises:
+      ParseError: If an unsigned 32bit integer couldn't be consumed.
+    """
+    try:
+      result = ParseInteger(self.token, is_signed=False, is_long=False)
+    except ValueError as e:
+      raise self._ParseError(str(e))
+    self.NextToken()
+    return result
+
+  def TryConsumeInt64(self):
+    try:
+      self.ConsumeInt64()
+      return True
+    except ParseError:
+      return False
+
+  def ConsumeInt64(self):
+    """Consumes a signed 64bit integer number.
+
+    Returns:
+      The integer parsed.
+
+    Raises:
+      ParseError: If a signed 64bit integer couldn't be consumed.
+    """
+    try:
+      result = ParseInteger(self.token, is_signed=True, is_long=True)
+    except ValueError as e:
+      raise self._ParseError(str(e))
+    self.NextToken()
+    return result
+
+  def TryConsumeUint64(self):
+    try:
+      self.ConsumeUint64()
+      return True
+    except ParseError:
+      return False
+
+  def ConsumeUint64(self):
+    """Consumes an unsigned 64bit integer number.
+
+    Returns:
+      The integer parsed.
+
+    Raises:
+      ParseError: If an unsigned 64bit integer couldn't be consumed.
+    """
+    try:
+      result = ParseInteger(self.token, is_signed=False, is_long=True)
+    except ValueError as e:
+      raise self._ParseError(str(e))
     self.NextToken()
     return result
 
@@ -1198,7 +969,7 @@
     try:
       result = ParseFloat(self.token)
     except ValueError as e:
-      raise self.ParseError(str(e))
+      raise self._ParseError(str(e))
     self.NextToken()
     return result
 
@@ -1214,7 +985,7 @@
     try:
       result = ParseBool(self.token)
     except ValueError as e:
-      raise self.ParseError(str(e))
+      raise self._ParseError(str(e))
     self.NextToken()
     return result
 
@@ -1268,15 +1039,15 @@
     """
     text = self.token
     if len(text) < 1 or text[0] not in _QUOTES:
-      raise self.ParseError('Expected string but found: %r' % (text,))
+      raise self._ParseError('Expected string but found: %r' % (text,))
 
     if len(text) < 2 or text[-1] != text[0]:
-      raise self.ParseError('String missing ending quote: %r' % (text,))
+      raise self._ParseError('String missing ending quote: %r' % (text,))
 
     try:
       result = text_encoding.CUnescape(text[1:-1])
     except ValueError as e:
-      raise self.ParseError(str(e))
+      raise self._ParseError(str(e))
     self.NextToken()
     return result
 
@@ -1284,7 +1055,7 @@
     try:
       result = ParseEnum(field, self.token)
     except ValueError as e:
-      raise self.ParseError(str(e))
+      raise self._ParseError(str(e))
     self.NextToken()
     return result
 
@@ -1297,15 +1068,16 @@
     Returns:
       A ParseError instance.
     """
-    return ParseError(message, self._previous_line + 1,
-                      self._previous_column + 1)
+    return ParseError('%d:%d : %s' % (
+        self._previous_line + 1, self._previous_column + 1, message))
 
-  def ParseError(self, message):
+  def _ParseError(self, message):
     """Creates and *returns* a ParseError for the current token."""
-    return ParseError(message, self._line + 1, self._column + 1)
+    return ParseError('%d:%d : %s' % (
+        self._line + 1, self._column + 1, message))
 
   def _StringParseError(self, e):
-    return self.ParseError('Couldn\'t parse string: ' + str(e))
+    return self._ParseError('Couldn\'t parse string: ' + str(e))
 
   def NextToken(self):
     """Reads the next meaningful token."""
@@ -1320,124 +1092,12 @@
       return
 
     match = self._TOKEN.match(self._current_line, self._column)
-    if not match and not self._skip_comments:
-      match = self._COMMENT.match(self._current_line, self._column)
     if match:
       token = match.group(0)
       self.token = token
     else:
       self.token = self._current_line[self._column]
 
-# Aliased so it can still be accessed by current visibility violators.
-# TODO(dbarnett): Migrate violators to textformat_tokenizer.
-_Tokenizer = Tokenizer  # pylint: disable=invalid-name
-
-
-def _ConsumeInt32(tokenizer):
-  """Consumes a signed 32bit integer number from tokenizer.
-
-  Args:
-    tokenizer: A tokenizer used to parse the number.
-
-  Returns:
-    The integer parsed.
-
-  Raises:
-    ParseError: If a signed 32bit integer couldn't be consumed.
-  """
-  return _ConsumeInteger(tokenizer, is_signed=True, is_long=False)
-
-
-def _ConsumeUint32(tokenizer):
-  """Consumes an unsigned 32bit integer number from tokenizer.
-
-  Args:
-    tokenizer: A tokenizer used to parse the number.
-
-  Returns:
-    The integer parsed.
-
-  Raises:
-    ParseError: If an unsigned 32bit integer couldn't be consumed.
-  """
-  return _ConsumeInteger(tokenizer, is_signed=False, is_long=False)
-
-
-def _TryConsumeInt64(tokenizer):
-  try:
-    _ConsumeInt64(tokenizer)
-    return True
-  except ParseError:
-    return False
-
-
-def _ConsumeInt64(tokenizer):
-  """Consumes a signed 32bit integer number from tokenizer.
-
-  Args:
-    tokenizer: A tokenizer used to parse the number.
-
-  Returns:
-    The integer parsed.
-
-  Raises:
-    ParseError: If a signed 32bit integer couldn't be consumed.
-  """
-  return _ConsumeInteger(tokenizer, is_signed=True, is_long=True)
-
-
-def _TryConsumeUint64(tokenizer):
-  try:
-    _ConsumeUint64(tokenizer)
-    return True
-  except ParseError:
-    return False
-
-
-def _ConsumeUint64(tokenizer):
-  """Consumes an unsigned 64bit integer number from tokenizer.
-
-  Args:
-    tokenizer: A tokenizer used to parse the number.
-
-  Returns:
-    The integer parsed.
-
-  Raises:
-    ParseError: If an unsigned 64bit integer couldn't be consumed.
-  """
-  return _ConsumeInteger(tokenizer, is_signed=False, is_long=True)
-
-
-def _TryConsumeInteger(tokenizer, is_signed=False, is_long=False):
-  try:
-    _ConsumeInteger(tokenizer, is_signed=is_signed, is_long=is_long)
-    return True
-  except ParseError:
-    return False
-
-
-def _ConsumeInteger(tokenizer, is_signed=False, is_long=False):
-  """Consumes an integer number from tokenizer.
-
-  Args:
-    tokenizer: A tokenizer used to parse the number.
-    is_signed: True if a signed integer must be parsed.
-    is_long: True if a long integer must be parsed.
-
-  Returns:
-    The integer parsed.
-
-  Raises:
-    ParseError: If an integer with given characteristics couldn't be consumed.
-  """
-  try:
-    result = ParseInteger(tokenizer.token, is_signed=is_signed, is_long=is_long)
-  except ValueError as e:
-    raise tokenizer.ParseError(str(e))
-  tokenizer.NextToken()
-  return result
-
 
 def ParseInteger(text, is_signed=False, is_long=False):
   """Parses an integer.
@@ -1454,39 +1114,22 @@
     ValueError: Thrown Iff the text is not a valid integer.
   """
   # Do the actual parsing. Exception handling is propagated to caller.
-  result = _ParseAbstractInteger(text, is_long=is_long)
-
-  # Check if the integer is sane. Exceptions handled by callers.
-  checker = _INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)]
-  checker.CheckValue(result)
-  return result
-
-
-def _ParseAbstractInteger(text, is_long=False):
-  """Parses an integer without checking size/signedness.
-
-  Args:
-    text: The text to parse.
-    is_long: True if the value should be returned as a long integer.
-
-  Returns:
-    The integer value.
-
-  Raises:
-    ValueError: Thrown Iff the text is not a valid integer.
-  """
-  # Do the actual parsing. Exception handling is propagated to caller.
   try:
     # We force 32-bit values to int and 64-bit values to long to make
     # alternate implementations where the distinction is more significant
     # (e.g. the C++ implementation) simpler.
     if is_long:
-      return long(text, 0)
+      result = long(text, 0)
     else:
-      return int(text, 0)
+      result = int(text, 0)
   except ValueError:
     raise ValueError('Couldn\'t parse integer: %s' % text)
 
+  # Check if the integer is sane. Exceptions handled by callers.
+  checker = _INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)]
+  checker.CheckValue(result)
+  return result
+
 
 def ParseFloat(text):
   """Parse a floating point number.
@@ -1532,9 +1175,9 @@
   Raises:
     ValueError: If text is not a valid boolean.
   """
-  if text in ('true', 't', '1', 'True'):
+  if text in ('true', 't', '1'):
     return True
-  elif text in ('false', 'f', '0', 'False'):
+  elif text in ('false', 'f', '0'):
     return False
   else:
     raise ValueError('Expected "true" or "false".')
@@ -1563,17 +1206,14 @@
     # Identifier.
     enum_value = enum_descriptor.values_by_name.get(value, None)
     if enum_value is None:
-      raise ValueError('Enum type "%s" has no value named %s.' %
-                       (enum_descriptor.full_name, value))
+      raise ValueError(
+          'Enum type "%s" has no value named %s.' % (
+              enum_descriptor.full_name, value))
   else:
     # Numeric value.
-    if hasattr(field.file, 'syntax'):
-      # Attribute is checked for compatibility.
-      if field.file.syntax == 'proto3':
-        # Proto3 accept numeric unknown enums.
-        return number
     enum_value = enum_descriptor.values_by_number.get(number, None)
     if enum_value is None:
-      raise ValueError('Enum type "%s" has no value with number %d.' %
-                       (enum_descriptor.full_name, number))
+      raise ValueError(
+          'Enum type "%s" has no value with number %d.' % (
+              enum_descriptor.full_name, number))
   return enum_value.number
diff --git a/python/mox.py b/python/mox.py
index 43db021..257468e 100755
--- a/python/mox.py
+++ b/python/mox.py
@@ -778,7 +778,7 @@
       rhs: any python object
     """
 
-    raise NotImplementedError('method must be implemented by a subclass.')
+    raise NotImplementedError, 'method must be implemented by a subclass.'
 
   def __eq__(self, rhs):
     return self.equals(rhs)
diff --git a/python/release.sh b/python/release.sh
deleted file mode 100755
index a71cc7f..0000000
--- a/python/release.sh
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-function get_source_version() {
-  grep "__version__ = '.*'" python/google/protobuf/__init__.py | sed -r "s/__version__ = '(.*)'/\1/"
-}
-
-function run_install_test() {
-  local VERSION=$1
-  local PYTHON=$2
-  local PYPI=$3
-
-  virtualenv --no-site-packages -p `which $PYTHON` test-venv
-
-  # Intentionally put a broken protoc in the path to make sure installation
-  # doesn't require protoc installed.
-  touch test-venv/bin/protoc
-  chmod +x test-venv/bin/protoc
-
-  source test-venv/bin/activate
-  pip install -i ${PYPI} protobuf==${VERSION} --no-cache-dir
-  deactivate
-  rm -fr test-venv
-}
-
-
-[ $# -lt 1 ] && {
-  echo "Usage: $0 VERSION ["
-  echo ""
-  echo "Examples:"
-  echo "  Test 3.3.0 release using version number 3.3.0.dev1:"
-  echo "    $0 3.0.0 dev1"
-  echo "  Actually release 3.3.0 to PyPI:"
-  echo "    $0 3.3.0"
-  exit 1
-}
-VERSION=$1
-DEV=$2
-
-# Make sure we are in a protobuf source tree.
-[ -f "python/google/protobuf/__init__.py" ] || {
-  echo "This script must be ran under root of protobuf source tree."
-  exit 1
-}
-
-# Make sure all files are world-readable.
-find python -type d -exec chmod a+r,a+x {} +
-find python -type f -exec chmod a+r {} +
-umask 0022
-
-# Check that the supplied version number matches what's inside the source code.
-SOURCE_VERSION=`get_source_version`
-
-[ "${VERSION}" == "${SOURCE_VERSION}" -o "${VERSION}.${DEV}" == "${SOURCE_VERSION}" ] || {
-  echo "Version number specified on the command line ${VERSION} doesn't match"
-  echo "the actual version number in the source code: ${SOURCE_VERSION}"
-  exit 1
-}
-
-TESTING_ONLY=1
-TESTING_VERSION=${VERSION}.${DEV}
-if [ -z "${DEV}" ]; then
-  read -p "You are releasing ${VERSION} to PyPI. Are you sure? [y/n]" -r
-  echo
-  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
-    exit 1
-  fi
-  TESTING_ONLY=0
-  TESTING_VERSION=${VERSION}
-else
-  # Use dev version number for testing.
-  sed -i -r "s/__version__ = '.*'/__version__ = '${VERSION}.${DEV}'/" python/google/protobuf/__init__.py
-fi
-
-cd python
-
-# Run tests locally.
-python setup.py build
-python setup.py test
-
-# Deploy source package to testing PyPI
-python setup.py sdist upload -r https://test.pypi.org/legacy/
-
-# Test locally with different python versions.
-run_install_test ${TESTING_VERSION} python2.7 https://test.pypi.org/simple
-run_install_test ${TESTING_VERSION} python3.4 https://test.pypi.org/simple
-
-# Deploy egg/wheel packages to testing PyPI and test again.
-python setup.py bdist_egg bdist_wheel upload -r https://test.pypi.org/legacy/
-
-run_install_test ${TESTING_VERSION} python2.7 https://test.pypi.org/simple
-run_install_test ${TESTING_VERSION} python3.4 https://test.pypi.org/simple
-
-echo "All install tests have passed using testing PyPI."
-
-if [ $TESTING_ONLY -eq 0 ]; then
-  read -p "Publish to PyPI? [y/n]" -r
-  echo
-  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
-    exit 1
-  fi
-  echo "Publishing to PyPI..."
-  # Be sure to run build before sdist, because otherwise sdist will not include
-  # well-known types.
-  python setup.py clean build sdist upload
-  # Be sure to run clean before bdist_xxx, because otherwise bdist_xxx will
-  # include files you may not want in the package. E.g., if you have built
-  # and tested with --cpp_implemenation, bdist_xxx will include the _message.so
-  # file even when you no longer pass the --cpp_implemenation flag. See:
-  #   https://github.com/google/protobuf/issues/3042
-  python setup.py clean build bdist_egg bdist_wheel upload
-else
-  # Set the version number back (i.e., remove dev suffix).
-  sed -i -r "s/__version__ = '.*'/__version__ = '${VERSION}'/" google/protobuf/__init__.py
-fi
diff --git a/python/release/wheel/Dockerfile b/python/release/wheel/Dockerfile
deleted file mode 100644
index f38ec2f..0000000
--- a/python/release/wheel/Dockerfile
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM quay.io/pypa/manylinux1_x86_64
-
-RUN yum install -y libtool
-RUN /opt/python/cp27-cp27mu/bin/pip install twine
-
-COPY protobuf_optimized_pip.sh /
diff --git a/python/release/wheel/README.md b/python/release/wheel/README.md
deleted file mode 100644
index edda2cd..0000000
--- a/python/release/wheel/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-Description
-------------------------------
-This directory is used to build released wheels according to PEP513 and upload
-them to pypi.
-
-Usage
-------------------------------
-For example, to release 3.3.0:
-    ./protobuf_optimized_pip.sh 3.3.0 PYPI_USERNAME PYPI_PASSWORD
-
-Structure
-------------------------------
-| Source                    | Source                                                       |
-|--------------------------------------|---------------------------------------------------|
-| protobuf_optimized_pip.sh | Entry point. Calling Dockerfile and build_wheel_manylinux.sh |
-| Dockerfile                | Build docker image according to PEP513.                      |
-| build_wheel_manylinux.sh  | Build wheel packages in the docker container.                |
diff --git a/python/release/wheel/build_wheel_manylinux.sh b/python/release/wheel/build_wheel_manylinux.sh
deleted file mode 100755
index 39fd8c1..0000000
--- a/python/release/wheel/build_wheel_manylinux.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-
-# Print usage and fail.
-function usage() {
-  echo "Usage: protobuf_optimized_pip.sh PROTOBUF_VERSION PYPI_USERNAME PYPI_PASSWORD" >&2
-  exit 1   # Causes caller to exit because we use -e.
-}
-
-# Validate arguments.
-if [ $0 != ./build_wheel_manylinux.sh ]; then
-  echo "Please run this script from the directory in which it is located." >&2
-  exit 1
-fi
-
-if [ $# -lt 3 ]; then
-  usage
-  exit 1
-fi
-
-PROTOBUF_VERSION=$1
-PYPI_USERNAME=$2
-PYPI_PASSWORD=$3
-
-docker rmi protobuf-python-wheel
-docker build . -t protobuf-python-wheel
-docker run --rm protobuf-python-wheel ./protobuf_optimized_pip.sh $PROTOBUF_VERSION $PYPI_USERNAME $PYPI_PASSWORD
-docker rmi protobuf-python-wheel
diff --git a/python/release/wheel/protobuf_optimized_pip.sh b/python/release/wheel/protobuf_optimized_pip.sh
deleted file mode 100755
index 98306f4..0000000
--- a/python/release/wheel/protobuf_optimized_pip.sh
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/env bash
-
-# DO NOT use this script manually! Called by docker.
-
-set -ex
-
-# Print usage and fail.
-function usage() {
-  echo "Usage: protobuf_optimized_pip.sh PROTOBUF_VERSION" >&2
-  exit 1   # Causes caller to exit because we use -e.
-}
-
-# Build wheel
-function build_wheel() {
-  PYTHON_VERSION=$1
-  PYTHON_BIN=/opt/python/${PYTHON_VERSION}/bin/python
-
-  $PYTHON_BIN setup.py bdist_wheel --cpp_implementation --compile_static_extension
-  auditwheel repair dist/protobuf-${PROTOBUF_VERSION}-${PYTHON_VERSION}-linux_x86_64.whl
-}
-
-# Validate arguments.
-if [ $0 != ./protobuf_optimized_pip.sh ]; then
-  echo "Please run this script from the directory in which it is located." >&2
-  exit 1
-fi
-
-if [ $# -lt 1 ]; then
-  usage
-  exit 1
-fi
-
-PROTOBUF_VERSION=$1
-PYPI_USERNAME=$2
-PYPI_PASSWORD=$3
-
-DIR=${PWD}/'protobuf-python-build'
-PYTHON_VERSIONS=('cp27-cp27mu' 'cp33-cp33m' 'cp34-cp34m' 'cp35-cp35m' 'cp36-cp36m')
-
-mkdir -p ${DIR}
-cd ${DIR}
-curl -SsL -O https://github.com/google/protobuf/archive/v${PROTOBUF_VERSION}.tar.gz
-tar xzf v${PROTOBUF_VERSION}.tar.gz
-cd $DIR/protobuf-${PROTOBUF_VERSION}
-
-# Autoconf on centos 5.11 cannot recognize AC_PROG_OBJC.
-sed -i '/AC_PROG_OBJC/d' configure.ac
-sed -i 's/conformance\/Makefile//g' configure.ac
-
-# Use the /usr/bin/autoconf and related tools to pick the correct aclocal macros
-export PATH="/usr/bin:$PATH"
-
-# Build protoc
-./autogen.sh
-CXXFLAGS="-fPIC -g -O2" ./configure
-make -j8
-export PROTOC=$DIR/src/protoc
-
-cd python
-
-for PYTHON_VERSION in "${PYTHON_VERSIONS[@]}"
-do
-  build_wheel $PYTHON_VERSION
-done
-
-/opt/python/cp27-cp27mu/bin/twine upload wheelhouse/*
diff --git a/python/setup.cfg b/python/setup.cfg
deleted file mode 100644
index 2a9acf1..0000000
--- a/python/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff --git a/python/setup.py b/python/setup.py
index 3d47079..0f4b53c 100755
--- a/python/setup.py
+++ b/python/setup.py
@@ -5,7 +5,6 @@
 import os
 import subprocess
 import sys
-import platform
 
 # We must use setuptools, not distutils, because we need to use the
 # namespace_packages option for the "google" package.
@@ -77,11 +76,7 @@
       sys.exit(-1)
 
 def GenerateUnittestProtos():
-  generate_proto("../src/google/protobuf/any_test.proto", False)
-  generate_proto("../src/google/protobuf/map_proto2_unittest.proto", False)
   generate_proto("../src/google/protobuf/map_unittest.proto", False)
-  generate_proto("../src/google/protobuf/test_messages_proto3.proto", False)
-  generate_proto("../src/google/protobuf/test_messages_proto2.proto", False)
   generate_proto("../src/google/protobuf/unittest_arena.proto", False)
   generate_proto("../src/google/protobuf/unittest_no_arena.proto", False)
   generate_proto("../src/google/protobuf/unittest_no_arena_import.proto", False)
@@ -99,7 +94,6 @@
   generate_proto("google/protobuf/internal/descriptor_pool_test2.proto", False)
   generate_proto("google/protobuf/internal/factory_test1.proto", False)
   generate_proto("google/protobuf/internal/factory_test2.proto", False)
-  generate_proto("google/protobuf/internal/file_options_test.proto", False)
   generate_proto("google/protobuf/internal/import_test_package/inner.proto", False)
   generate_proto("google/protobuf/internal/import_test_package/outer.proto", False)
   generate_proto("google/protobuf/internal/missing_enum_values.proto", False)
@@ -178,6 +172,9 @@
     # extension. Note that those libraries have to be compiled with
     # -fPIC for this to work.
     compile_static_ext = get_option_from_sys_argv('--compile_static_extension')
+    extra_compile_args = ['-Wno-write-strings',
+                          '-Wno-invalid-offsetof',
+                          '-Wno-sign-compare']
     libraries = ['protobuf']
     extra_objects = None
     if compile_static_ext:
@@ -186,36 +183,9 @@
                        '../src/.libs/libprotobuf-lite.a']
     test_conformance.target = 'test_python_cpp'
 
-    extra_compile_args = []
-
-    if sys.platform != 'win32':
-        extra_compile_args.append('-Wno-write-strings')
-        extra_compile_args.append('-Wno-invalid-offsetof')
-        extra_compile_args.append('-Wno-sign-compare')
-
-    # https://github.com/Theano/Theano/issues/4926
-    if sys.platform == 'win32':
-      extra_compile_args.append('-D_hypot=hypot')
-
-    # https://github.com/tpaviot/pythonocc-core/issues/48
-    if sys.platform == 'win32' and  '64 bit' in sys.version:
-      extra_compile_args.append('-DMS_WIN64')
-
-    # MSVS default is dymanic
-    if (sys.platform == 'win32' and
-        ((sys.version_info[0] == 3 and sys.version_info[1] == 5) or
-         (sys.version_info[0] == 3 and sys.version_info[1] == 6))):
-      extra_compile_args.append('/MT')
-
     if "clang" in os.popen('$CC --version 2> /dev/null').read():
       extra_compile_args.append('-Wno-shorten-64-to-32')
 
-    v, _, _ = platform.mac_ver()
-    if v:
-      v = float('.'.join(v.split('.')[:2]))
-      if v >= 10.12:
-        extra_compile_args.append('-std=c++11')
-
     if warnings_as_errors in sys.argv:
       extra_compile_args.append('-Werror')
       sys.argv.remove(warnings_as_errors)
@@ -234,7 +204,7 @@
         Extension(
             "google.protobuf.internal._api_implementation",
             glob.glob('google/protobuf/internal/api_implementation.cc'),
-            extra_compile_args=extra_compile_args + ['-DPYTHON_PROTO2_CPP_IMPL_V2'],
+            extra_compile_args=['-DPYTHON_PROTO2_CPP_IMPL_V2'],
         ),
     ])
     os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'cpp'
@@ -249,15 +219,15 @@
       name='protobuf',
       version=GetVersion(),
       description='Protocol Buffers',
-      download_url='https://github.com/google/protobuf/releases',
       long_description="Protocol Buffers are Google's data interchange format",
       url='https://developers.google.com/protocol-buffers/',
       maintainer='protobuf@googlegroups.com',
       maintainer_email='protobuf@googlegroups.com',
-      license='3-Clause BSD License',
+      license='New BSD License',
       classifiers=[
         "Programming Language :: Python",
         "Programming Language :: Python :: 2",
+        "Programming Language :: Python :: 2.6",
         "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
         "Programming Language :: Python :: 3.3",
diff --git a/python/tox.ini b/python/tox.ini
index 38a81b4..cf8d540 100644
--- a/python/tox.ini
+++ b/python/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 envlist =
-    py{27,33,34,35,36}-{cpp,python}
+    py{26,27,33,34}-{cpp,python}
 
 [testenv]
 usedevelop=true
@@ -9,11 +9,10 @@
     cpp: LD_LIBRARY_PATH={toxinidir}/../src/.libs
     cpp: DYLD_LIBRARY_PATH={toxinidir}/../src/.libs
     cpp: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
-    python: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
 commands =
     python setup.py -q build_py
     python: python setup.py -q build
-    cpp: python setup.py -q build --cpp_implementation --warnings_as_errors --compile_static_extension
+    cpp: python setup.py -q build --cpp_implementation --warnings_as_errors
     python: python setup.py -q test -q
     cpp: python setup.py -q test -q --cpp_implementation
     python: python setup.py -q test_conformance
diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock
new file mode 100644
index 0000000..d0eb9cc
--- /dev/null
+++ b/ruby/Gemfile.lock
@@ -0,0 +1,30 @@
+PATH
+  remote: .
+  specs:
+    google-protobuf (3.0.0.alpha.5.0.5)
+
+GEM
+  remote: https://rubygems.org/
+  specs:
+    power_assert (0.2.2)
+    rake (10.4.2)
+    rake-compiler (0.9.5)
+      rake
+    rake-compiler-dock (0.5.1)
+    rubygems-tasks (0.2.4)
+    test-unit (3.0.9)
+      power_assert
+
+PLATFORMS
+  java
+  ruby
+
+DEPENDENCIES
+  google-protobuf!
+  rake-compiler
+  rake-compiler-dock
+  rubygems-tasks
+  test-unit
+
+BUNDLED WITH
+   1.11.2
diff --git a/ruby/Rakefile b/ruby/Rakefile
index 7aecfe8..fa29c31 100644
--- a/ruby/Rakefile
+++ b/ruby/Rakefile
@@ -31,7 +31,7 @@
 unless ENV['IN_DOCKER'] == 'true'
   well_known_protos.each do |proto_file|
     input_file = "../src/" + proto_file
-    output_file = "lib/" + proto_file.sub(/\.proto$/, "_pb.rb")
+    output_file = "lib/" + proto_file.sub(/\.proto$/, ".rb")
     genproto_output << output_file
     file output_file => input_file do |file_task|
       sh "../src/protoc -I../src --ruby_out=lib #{input_file}"
@@ -44,11 +44,11 @@
     raise ArgumentError, "maven needs to be installed"
   end
   task :clean do
-    system("mvn --batch-mode clean")
+    system("mvn clean")
   end
 
   task :compile do
-    system("mvn --batch-mode package")
+    system("mvn package")
   end
 else
   Rake::ExtensionTask.new("protobuf_c", spec) do |ext|
@@ -64,13 +64,13 @@
 
   task 'gem:windows' do
     require 'rake_compiler_dock'
-    RakeCompilerDock.sh "bundle && IN_DOCKER=true rake cross native gem RUBY_CC_VERSION=2.5.0:2.4.0:2.3.0:2.2.2:2.1.6:2.0.0"
+    RakeCompilerDock.sh "bundle && IN_DOCKER=true rake cross native gem RUBY_CC_VERSION=2.3.0:2.2.2:2.1.5:2.0.0"
   end
 
   if RUBY_PLATFORM =~ /darwin/
     task 'gem:native' do
       system "rake genproto"
-      system "rake cross native gem RUBY_CC_VERSION=2.5.0:2.4.0:2.3.0:2.2.2:2.1.6:2.0.0"
+      system "rake cross native gem RUBY_CC_VERSION=2.3.0:2.2.2:2.1.5:2.0.0"
     end
   else
     task 'gem:native' => [:genproto, 'gem:windows']
@@ -80,15 +80,10 @@
 
 # Proto for tests.
 genproto_output << "tests/generated_code.rb"
-genproto_output << "tests/test_import.rb"
 file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
   sh "../src/protoc --ruby_out=. tests/generated_code.proto"
 end
 
-file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
-  sh "../src/protoc --ruby_out=. tests/test_import.proto"
-end
-
 task :genproto => genproto_output
 
 task :clean do
@@ -99,13 +94,7 @@
 end
 
 Rake::TestTask.new(:test => :build) do |t|
-  t.test_files = FileList["tests/*.rb"].exclude("tests/gc_test.rb")
-end
-
-# gc_test needs to be split out to ensure the generated file hasn't been
-# imported by other tests.
-Rake::TestTask.new(:gc_test => :build) do |t|
-  t.test_files = FileList["tests/gc_test.rb"]
+  t.test_files = FileList["tests/*.rb"]
 end
 
 task :build => [:clean, :compile, :genproto]
diff --git a/ruby/compatibility_tests/v3.0.0/README.md b/ruby/compatibility_tests/v3.0.0/README.md
deleted file mode 100644
index eb34122..0000000
--- a/ruby/compatibility_tests/v3.0.0/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Protobuf Ruby Compatibility Tests
-
-This drectory contains a snapshot of protobuf ruby 3.0.0 unittest code and
-test scripts used to verifies whether the latest version of protobuf is
-still compatible with 3.0.0 generated code.
diff --git a/ruby/compatibility_tests/v3.0.0/Rakefile b/ruby/compatibility_tests/v3.0.0/Rakefile
deleted file mode 100644
index 19a4ba1..0000000
--- a/ruby/compatibility_tests/v3.0.0/Rakefile
+++ /dev/null
@@ -1,25 +0,0 @@
-require "rake/testtask"
-
-# Proto for tests.
-genproto_output = []
-genproto_output << "tests/generated_code.rb"
-genproto_output << "tests/test_import.rb"
-file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
-  sh "./protoc --ruby_out=. tests/generated_code.proto"
-end
-
-file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
-  sh "./protoc --ruby_out=. tests/test_import.proto"
-end
-
-task :genproto => genproto_output
-
-task :clean do
-  sh "rm -f #{genproto_output.join(' ')}"
-end
-
-Rake::TestTask.new(:test => :genproto) do |t|
-  t.test_files = FileList["tests/*.rb"]
-end
-
-task :default => [:test]
diff --git a/ruby/compatibility_tests/v3.0.0/test.sh b/ruby/compatibility_tests/v3.0.0/test.sh
deleted file mode 100755
index 996dc02..0000000
--- a/ruby/compatibility_tests/v3.0.0/test.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-# Change to the script's directory
-cd $(dirname $0)
-
-# Download 3.0.0 version of protoc
-PROTOC_BINARY_NAME="protoc-3.0.0-linux-x86_64.exe"
-if [ `uname` = "Darwin" ]; then
-  PROTOC_BINARY_NAME="protoc-3.0.0-osx-x86_64.exe"
-fi
-wget http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0/${PROTOC_BINARY_NAME} -O protoc
-chmod +x protoc
-
-# Run tests
-rake test
diff --git a/ruby/compatibility_tests/v3.0.0/tests/basic.rb b/ruby/compatibility_tests/v3.0.0/tests/basic.rb
deleted file mode 100644
index 05fe027..0000000
--- a/ruby/compatibility_tests/v3.0.0/tests/basic.rb
+++ /dev/null
@@ -1,1182 +0,0 @@
-#!/usr/bin/ruby
-
-require 'google/protobuf'
-require 'test/unit'
-
-# ------------- generated code --------------
-
-module BasicTest
-  pool = Google::Protobuf::DescriptorPool.new
-  pool.build do
-    add_message "Foo" do
-      optional :bar, :message, 1, "Bar"
-      repeated :baz, :message, 2, "Baz"
-    end
-
-    add_message "Bar" do
-      optional :msg, :string, 1
-    end
-
-    add_message "Baz" do
-      optional :msg, :string, 1
-    end
-
-    add_message "TestMessage" do
-      optional :optional_int32,  :int32,        1
-      optional :optional_int64,  :int64,        2
-      optional :optional_uint32, :uint32,       3
-      optional :optional_uint64, :uint64,       4
-      optional :optional_bool,   :bool,         5
-      optional :optional_float,  :float,        6
-      optional :optional_double, :double,       7
-      optional :optional_string, :string,       8
-      optional :optional_bytes,  :bytes,        9
-      optional :optional_msg,    :message,      10, "TestMessage2"
-      optional :optional_enum,   :enum,         11, "TestEnum"
-
-      repeated :repeated_int32,  :int32,        12
-      repeated :repeated_int64,  :int64,        13
-      repeated :repeated_uint32, :uint32,       14
-      repeated :repeated_uint64, :uint64,       15
-      repeated :repeated_bool,   :bool,         16
-      repeated :repeated_float,  :float,        17
-      repeated :repeated_double, :double,       18
-      repeated :repeated_string, :string,       19
-      repeated :repeated_bytes,  :bytes,        20
-      repeated :repeated_msg,    :message,      21, "TestMessage2"
-      repeated :repeated_enum,   :enum,         22, "TestEnum"
-    end
-    add_message "TestMessage2" do
-      optional :foo, :int32, 1
-    end
-
-    add_message "Recursive1" do
-      optional :foo, :message, 1, "Recursive2"
-    end
-    add_message "Recursive2" do
-      optional :foo, :message, 1, "Recursive1"
-    end
-
-    add_enum "TestEnum" do
-      value :Default, 0
-      value :A, 1
-      value :B, 2
-      value :C, 3
-    end
-
-    add_message "BadFieldNames" do
-      optional :dup, :int32, 1
-      optional :class, :int32, 2
-      optional :"a.b", :int32, 3
-    end
-
-    add_message "MapMessage" do
-      map :map_string_int32, :string, :int32, 1
-      map :map_string_msg, :string, :message, 2, "TestMessage2"
-    end
-    add_message "MapMessageWireEquiv" do
-      repeated :map_string_int32, :message, 1, "MapMessageWireEquiv_entry1"
-      repeated :map_string_msg, :message, 2, "MapMessageWireEquiv_entry2"
-    end
-    add_message "MapMessageWireEquiv_entry1" do
-      optional :key, :string, 1
-      optional :value, :int32, 2
-    end
-    add_message "MapMessageWireEquiv_entry2" do
-      optional :key, :string, 1
-      optional :value, :message, 2, "TestMessage2"
-    end
-
-    add_message "OneofMessage" do
-      oneof :my_oneof do
-        optional :a, :string, 1
-        optional :b, :int32, 2
-        optional :c, :message, 3, "TestMessage2"
-        optional :d, :enum, 4, "TestEnum"
-      end
-    end
-  end
-
-  Foo = pool.lookup("Foo").msgclass
-  Bar = pool.lookup("Bar").msgclass
-  Baz = pool.lookup("Baz").msgclass
-  TestMessage = pool.lookup("TestMessage").msgclass
-  TestMessage2 = pool.lookup("TestMessage2").msgclass
-  Recursive1 = pool.lookup("Recursive1").msgclass
-  Recursive2 = pool.lookup("Recursive2").msgclass
-  TestEnum = pool.lookup("TestEnum").enummodule
-  BadFieldNames = pool.lookup("BadFieldNames").msgclass
-  MapMessage = pool.lookup("MapMessage").msgclass
-  MapMessageWireEquiv = pool.lookup("MapMessageWireEquiv").msgclass
-  MapMessageWireEquiv_entry1 =
-    pool.lookup("MapMessageWireEquiv_entry1").msgclass
-  MapMessageWireEquiv_entry2 =
-    pool.lookup("MapMessageWireEquiv_entry2").msgclass
-  OneofMessage = pool.lookup("OneofMessage").msgclass
-
-# ------------ test cases ---------------
-
-  class MessageContainerTest < Test::Unit::TestCase
-
-    def test_defaults
-      m = TestMessage.new
-      assert m.optional_int32 == 0
-      assert m.optional_int64 == 0
-      assert m.optional_uint32 == 0
-      assert m.optional_uint64 == 0
-      assert m.optional_bool == false
-      assert m.optional_float == 0.0
-      assert m.optional_double == 0.0
-      assert m.optional_string == ""
-      assert m.optional_bytes == ""
-      assert m.optional_msg == nil
-      assert m.optional_enum == :Default
-    end
-
-    def test_setters
-      m = TestMessage.new
-      m.optional_int32 = -42
-      assert m.optional_int32 == -42
-      m.optional_int64 = -0x1_0000_0000
-      assert m.optional_int64 == -0x1_0000_0000
-      m.optional_uint32 = 0x9000_0000
-      assert m.optional_uint32 == 0x9000_0000
-      m.optional_uint64 = 0x9000_0000_0000_0000
-      assert m.optional_uint64 == 0x9000_0000_0000_0000
-      m.optional_bool = true
-      assert m.optional_bool == true
-      m.optional_float = 0.5
-      assert m.optional_float == 0.5
-      m.optional_double = 0.5
-      m.optional_string = "hello"
-      assert m.optional_string == "hello"
-      m.optional_bytes = "world".encode!('ASCII-8BIT')
-      assert m.optional_bytes == "world"
-      m.optional_msg = TestMessage2.new(:foo => 42)
-      assert m.optional_msg == TestMessage2.new(:foo => 42)
-      m.optional_msg = nil
-      assert m.optional_msg == nil
-    end
-
-    def test_ctor_args
-      m = TestMessage.new(:optional_int32 => -42,
-                          :optional_msg => TestMessage2.new,
-                          :optional_enum => :C,
-                          :repeated_string => ["hello", "there", "world"])
-      assert m.optional_int32 == -42
-      assert m.optional_msg.class == TestMessage2
-      assert m.repeated_string.length == 3
-      assert m.optional_enum == :C
-      assert m.repeated_string[0] == "hello"
-      assert m.repeated_string[1] == "there"
-      assert m.repeated_string[2] == "world"
-    end
-
-    def test_inspect
-      m = TestMessage.new(:optional_int32 => -42,
-                          :optional_enum => :A,
-                          :optional_msg => TestMessage2.new,
-                          :repeated_string => ["hello", "there", "world"])
-      expected = '<BasicTest::TestMessage: optional_int32: -42, optional_int64: 0, optional_uint32: 0, optional_uint64: 0, optional_bool: false, optional_float: 0.0, optional_double: 0.0, optional_string: "", optional_bytes: "", optional_msg: <BasicTest::TestMessage2: foo: 0>, optional_enum: :A, repeated_int32: [], repeated_int64: [], repeated_uint32: [], repeated_uint64: [], repeated_bool: [], repeated_float: [], repeated_double: [], repeated_string: ["hello", "there", "world"], repeated_bytes: [], repeated_msg: [], repeated_enum: []>'
-      assert_equal expected, m.inspect
-    end
-
-    def test_hash
-      m1 = TestMessage.new(:optional_int32 => 42)
-      m2 = TestMessage.new(:optional_int32 => 102)
-      assert m1.hash != 0
-      assert m2.hash != 0
-      # relying on the randomness here -- if hash function changes and we are
-      # unlucky enough to get a collision, then change the values above.
-      assert m1.hash != m2.hash
-    end
-
-    def test_unknown_field_errors
-      e = assert_raise NoMethodError do
-        TestMessage.new.hello
-      end
-      assert_match(/hello/, e.message)
-
-      e = assert_raise NoMethodError do
-        TestMessage.new.hello = "world"
-      end
-      assert_match(/hello/, e.message)
-    end
-
-    def test_initialization_map_errors
-      e = assert_raise ArgumentError do
-        TestMessage.new(:hello => "world")
-      end
-      assert_match(/hello/, e.message)
-
-      e = assert_raise ArgumentError do
-        MapMessage.new(:map_string_int32 => "hello")
-      end
-      assert_equal e.message, "Expected Hash object as initializer value for map field 'map_string_int32'."
-
-      e = assert_raise ArgumentError do
-        TestMessage.new(:repeated_uint32 => "hello")
-      end
-      assert_equal e.message, "Expected array as initializer value for repeated field 'repeated_uint32'."
-    end
-
-    def test_type_errors
-      m = TestMessage.new
-      assert_raise TypeError do
-        m.optional_int32 = "hello"
-      end
-      assert_raise TypeError do
-        m.optional_string = 42
-      end
-      assert_raise TypeError do
-        m.optional_string = nil
-      end
-      assert_raise TypeError do
-        m.optional_bool = 42
-      end
-      assert_raise TypeError do
-        m.optional_msg = TestMessage.new  # expects TestMessage2
-      end
-
-      assert_raise TypeError do
-        m.repeated_int32 = []  # needs RepeatedField
-      end
-
-      assert_raise TypeError do
-        m.repeated_int32.push "hello"
-      end
-
-      assert_raise TypeError do
-        m.repeated_msg.push TestMessage.new
-      end
-    end
-
-    def test_string_encoding
-      m = TestMessage.new
-
-      # Assigning a normal (ASCII or UTF8) string to a bytes field, or
-      # ASCII-8BIT to a string field will convert to the proper encoding.
-      m.optional_bytes = "Test string ASCII".encode!('ASCII')
-      assert m.optional_bytes.frozen?
-      assert_equal Encoding::ASCII_8BIT, m.optional_bytes.encoding
-      assert_equal "Test string ASCII", m.optional_bytes
-
-      assert_raise Encoding::UndefinedConversionError do
-        m.optional_bytes = "Test string UTF-8 \u0100".encode!('UTF-8')
-      end
-
-      assert_raise Encoding::UndefinedConversionError do
-        m.optional_string = ["FFFF"].pack('H*')
-      end
-
-      # "Ordinary" use case.
-      m.optional_bytes = ["FFFF"].pack('H*')
-      m.optional_string = "\u0100"
-
-      # strings are immutable so we can't do this, but serialize should catch it.
-      m.optional_string = "asdf".encode!('UTF-8')
-      assert_raise RuntimeError do
-        m.optional_string.encode!('ASCII-8BIT')
-      end
-    end
-
-    def test_rptfield_int32
-      l = Google::Protobuf::RepeatedField.new(:int32)
-      assert l.count == 0
-      l = Google::Protobuf::RepeatedField.new(:int32, [1, 2, 3])
-      assert l.count == 3
-      assert_equal [1, 2, 3], l
-      assert_equal l, [1, 2, 3]
-      l.push 4
-      assert l == [1, 2, 3, 4]
-      dst_list = []
-      l.each { |val| dst_list.push val }
-      assert dst_list == [1, 2, 3, 4]
-      assert l.to_a == [1, 2, 3, 4]
-      assert l[0] == 1
-      assert l[3] == 4
-      l[0] = 5
-      assert l == [5, 2, 3, 4]
-
-      l2 = l.dup
-      assert l == l2
-      assert l.object_id != l2.object_id
-      l2.push 6
-      assert l.count == 4
-      assert l2.count == 5
-
-      assert l.inspect == '[5, 2, 3, 4]'
-
-      l.concat([7, 8, 9])
-      assert l == [5, 2, 3, 4, 7, 8, 9]
-      assert l.pop == 9
-      assert l == [5, 2, 3, 4, 7, 8]
-
-      assert_raise TypeError do
-        m = TestMessage.new
-        l.push m
-      end
-
-      m = TestMessage.new
-      m.repeated_int32 = l
-      assert m.repeated_int32 == [5, 2, 3, 4, 7, 8]
-      assert m.repeated_int32.object_id == l.object_id
-      l.push 42
-      assert m.repeated_int32.pop == 42
-
-      l3 = l + l.dup
-      assert l3.count == l.count * 2
-      l.count.times do |i|
-        assert l3[i] == l[i]
-        assert l3[l.count + i] == l[i]
-      end
-
-      l.clear
-      assert l.count == 0
-      l += [1, 2, 3, 4]
-      l.replace([5, 6, 7, 8])
-      assert l == [5, 6, 7, 8]
-
-      l4 = Google::Protobuf::RepeatedField.new(:int32)
-      l4[5] = 42
-      assert l4 == [0, 0, 0, 0, 0, 42]
-
-      l4 << 100
-      assert l4 == [0, 0, 0, 0, 0, 42, 100]
-      l4 << 101 << 102
-      assert l4 == [0, 0, 0, 0, 0, 42, 100, 101, 102]
-    end
-
-    def test_parent_rptfield
-      #make sure we set the RepeatedField and can add to it
-      m = TestMessage.new
-      assert m.repeated_string == []
-      m.repeated_string << 'ok'
-      m.repeated_string.push('ok2')
-      assert m.repeated_string == ['ok', 'ok2']
-      m.repeated_string += ['ok3']
-      assert m.repeated_string == ['ok', 'ok2', 'ok3']
-    end
-
-    def test_rptfield_msg
-      l = Google::Protobuf::RepeatedField.new(:message, TestMessage)
-      l.push TestMessage.new
-      assert l.count == 1
-      assert_raise TypeError do
-        l.push TestMessage2.new
-      end
-      assert_raise TypeError do
-        l.push 42
-      end
-
-      l2 = l.dup
-      assert l2[0] == l[0]
-      assert l2[0].object_id == l[0].object_id
-
-      l2 = Google::Protobuf.deep_copy(l)
-      assert l2[0] == l[0]
-      assert l2[0].object_id != l[0].object_id
-
-      l3 = l + l2
-      assert l3.count == 2
-      assert l3[0] == l[0]
-      assert l3[1] == l2[0]
-      l3[0].optional_int32 = 1000
-      assert l[0].optional_int32 == 1000
-
-      new_msg = TestMessage.new(:optional_int32 => 200)
-      l4 = l + [new_msg]
-      assert l4.count == 2
-      new_msg.optional_int32 = 1000
-      assert l4[1].optional_int32 == 1000
-    end
-
-    def test_rptfield_enum
-      l = Google::Protobuf::RepeatedField.new(:enum, TestEnum)
-      l.push :A
-      l.push :B
-      l.push :C
-      assert l.count == 3
-      assert_raise RangeError do
-        l.push :D
-      end
-      assert l[0] == :A
-
-      l.push 4
-      assert l[3] == 4
-    end
-
-    def test_rptfield_initialize
-      assert_raise ArgumentError do
-        l = Google::Protobuf::RepeatedField.new
-      end
-      assert_raise ArgumentError do
-        l = Google::Protobuf::RepeatedField.new(:message)
-      end
-      assert_raise ArgumentError do
-        l = Google::Protobuf::RepeatedField.new([1, 2, 3])
-      end
-      assert_raise ArgumentError do
-        l = Google::Protobuf::RepeatedField.new(:message, [TestMessage2.new])
-      end
-    end
-
-    def test_rptfield_array_ducktyping
-      l = Google::Protobuf::RepeatedField.new(:int32)
-      length_methods = %w(count length size)
-      length_methods.each do |lm|
-        assert l.send(lm)  == 0
-      end
-      # out of bounds returns a nil
-      assert l[0] == nil
-      assert l[1] == nil
-      assert l[-1] == nil
-      l.push 4
-      length_methods.each do |lm|
-        assert l.send(lm) == 1
-      end
-      assert l[0] == 4
-      assert l[1] == nil
-      assert l[-1] == 4
-      assert l[-2] == nil
-
-      l.push 2
-      length_methods.each do |lm|
-        assert l.send(lm) == 2
-      end
-      assert l[0] == 4
-      assert l[1] == 2
-      assert l[2] == nil
-      assert l[-1] == 2
-      assert l[-2] == 4
-      assert l[-3] == nil
-
-      #adding out of scope will backfill with empty objects
-    end
-
-    def test_map_basic
-      # allowed key types:
-      # :int32, :int64, :uint32, :uint64, :bool, :string, :bytes.
-
-      m = Google::Protobuf::Map.new(:string, :int32)
-      m["asdf"] = 1
-      assert m["asdf"] == 1
-      m["jkl;"] = 42
-      assert m == { "jkl;" => 42, "asdf" => 1 }
-      assert m.has_key?("asdf")
-      assert !m.has_key?("qwerty")
-      assert m.length == 2
-
-      m2 = m.dup
-      assert m == m2
-      assert m.hash != 0
-      assert m.hash == m2.hash
-
-      collected = {}
-      m.each { |k,v| collected[v] = k }
-      assert collected == { 42 => "jkl;", 1 => "asdf" }
-
-      assert m.delete("asdf") == 1
-      assert !m.has_key?("asdf")
-      assert m["asdf"] == nil
-      assert !m.has_key?("asdf")
-
-      # We only assert on inspect value when there is one map entry because the
-      # order in which elements appear is unspecified (depends on the internal
-      # hash function). We don't want a brittle test.
-      assert m.inspect == "{\"jkl;\"=>42}"
-
-      assert m.keys == ["jkl;"]
-      assert m.values == [42]
-
-      m.clear
-      assert m.length == 0
-      assert m == {}
-
-      assert_raise TypeError do
-        m[1] = 1
-      end
-      assert_raise RangeError do
-        m["asdf"] = 0x1_0000_0000
-      end
-    end
-
-    def test_map_ctor
-      m = Google::Protobuf::Map.new(:string, :int32,
-                                    {"a" => 1, "b" => 2, "c" => 3})
-      assert m == {"a" => 1, "c" => 3, "b" => 2}
-    end
-
-    def test_map_keytypes
-      m = Google::Protobuf::Map.new(:int32, :int32)
-      m[1] = 42
-      m[-1] = 42
-      assert_raise RangeError do
-        m[0x8000_0000] = 1
-      end
-      assert_raise TypeError do
-        m["asdf"] = 1
-      end
-
-      m = Google::Protobuf::Map.new(:int64, :int32)
-      m[0x1000_0000_0000_0000] = 1
-      assert_raise RangeError do
-        m[0x1_0000_0000_0000_0000] = 1
-      end
-      assert_raise TypeError do
-        m["asdf"] = 1
-      end
-
-      m = Google::Protobuf::Map.new(:uint32, :int32)
-      m[0x8000_0000] = 1
-      assert_raise RangeError do
-        m[0x1_0000_0000] = 1
-      end
-      assert_raise RangeError do
-        m[-1] = 1
-      end
-
-      m = Google::Protobuf::Map.new(:uint64, :int32)
-      m[0x8000_0000_0000_0000] = 1
-      assert_raise RangeError do
-        m[0x1_0000_0000_0000_0000] = 1
-      end
-      assert_raise RangeError do
-        m[-1] = 1
-      end
-
-      m = Google::Protobuf::Map.new(:bool, :int32)
-      m[true] = 1
-      m[false] = 2
-      assert_raise TypeError do
-        m[1] = 1
-      end
-      assert_raise TypeError do
-        m["asdf"] = 1
-      end
-
-      m = Google::Protobuf::Map.new(:string, :int32)
-      m["asdf"] = 1
-      assert_raise TypeError do
-        m[1] = 1
-      end
-      assert_raise Encoding::UndefinedConversionError do
-        bytestring = ["FFFF"].pack("H*")
-        m[bytestring] = 1
-      end
-
-      m = Google::Protobuf::Map.new(:bytes, :int32)
-      bytestring = ["FFFF"].pack("H*")
-      m[bytestring] = 1
-      # Allowed -- we will automatically convert to ASCII-8BIT.
-      m["asdf"] = 1
-      assert_raise TypeError do
-        m[1] = 1
-      end
-    end
-
-    def test_map_msg_enum_valuetypes
-      m = Google::Protobuf::Map.new(:string, :message, TestMessage)
-      m["asdf"] = TestMessage.new
-      assert_raise TypeError do
-        m["jkl;"] = TestMessage2.new
-      end
-
-      m = Google::Protobuf::Map.new(
-        :string, :message, TestMessage,
-        { "a" => TestMessage.new(:optional_int32 => 42),
-          "b" => TestMessage.new(:optional_int32 => 84) })
-      assert m.length == 2
-      assert m.values.map{|msg| msg.optional_int32}.sort == [42, 84]
-
-      m = Google::Protobuf::Map.new(:string, :enum, TestEnum,
-                                    { "x" => :A, "y" => :B, "z" => :C })
-      assert m.length == 3
-      assert m["z"] == :C
-      m["z"] = 2
-      assert m["z"] == :B
-      m["z"] = 4
-      assert m["z"] == 4
-      assert_raise RangeError do
-        m["z"] = :Z
-      end
-      assert_raise RangeError do
-        m["z"] = "z"
-      end
-    end
-
-    def test_map_dup_deep_copy
-      m = Google::Protobuf::Map.new(
-        :string, :message, TestMessage,
-        { "a" => TestMessage.new(:optional_int32 => 42),
-          "b" => TestMessage.new(:optional_int32 => 84) })
-
-      m2 = m.dup
-      assert m == m2
-      assert m.object_id != m2.object_id
-      assert m["a"].object_id == m2["a"].object_id
-      assert m["b"].object_id == m2["b"].object_id
-
-      m2 = Google::Protobuf.deep_copy(m)
-      assert m == m2
-      assert m.object_id != m2.object_id
-      assert m["a"].object_id != m2["a"].object_id
-      assert m["b"].object_id != m2["b"].object_id
-    end
-
-    def test_map_field
-      m = MapMessage.new
-      assert m.map_string_int32 == {}
-      assert m.map_string_msg == {}
-
-      m = MapMessage.new(
-        :map_string_int32 => {"a" => 1, "b" => 2},
-        :map_string_msg => {"a" => TestMessage2.new(:foo => 1),
-                            "b" => TestMessage2.new(:foo => 2)})
-      assert m.map_string_int32.keys.sort == ["a", "b"]
-      assert m.map_string_int32["a"] == 1
-      assert m.map_string_msg["b"].foo == 2
-
-      m.map_string_int32["c"] = 3
-      assert m.map_string_int32["c"] == 3
-      m.map_string_msg["c"] = TestMessage2.new(:foo => 3)
-      assert m.map_string_msg["c"] == TestMessage2.new(:foo => 3)
-      m.map_string_msg.delete("b")
-      m.map_string_msg.delete("c")
-      assert m.map_string_msg == { "a" => TestMessage2.new(:foo => 1) }
-
-      assert_raise TypeError do
-        m.map_string_msg["e"] = TestMessage.new # wrong value type
-      end
-      # ensure nothing was added by the above
-      assert m.map_string_msg == { "a" => TestMessage2.new(:foo => 1) }
-
-      m.map_string_int32 = Google::Protobuf::Map.new(:string, :int32)
-      assert_raise TypeError do
-        m.map_string_int32 = Google::Protobuf::Map.new(:string, :int64)
-      end
-      assert_raise TypeError do
-        m.map_string_int32 = {}
-      end
-
-      assert_raise TypeError do
-        m = MapMessage.new(:map_string_int32 => { 1 => "I am not a number" })
-      end
-    end
-
-    def test_map_encode_decode
-      m = MapMessage.new(
-        :map_string_int32 => {"a" => 1, "b" => 2},
-        :map_string_msg => {"a" => TestMessage2.new(:foo => 1),
-                            "b" => TestMessage2.new(:foo => 2)})
-      m2 = MapMessage.decode(MapMessage.encode(m))
-      assert m == m2
-
-      m3 = MapMessageWireEquiv.decode(MapMessage.encode(m))
-      assert m3.map_string_int32.length == 2
-
-      kv = {}
-      m3.map_string_int32.map { |msg| kv[msg.key] = msg.value }
-      assert kv == {"a" => 1, "b" => 2}
-
-      kv = {}
-      m3.map_string_msg.map { |msg| kv[msg.key] = msg.value }
-      assert kv == {"a" => TestMessage2.new(:foo => 1),
-                    "b" => TestMessage2.new(:foo => 2)}
-    end
-
-    def test_oneof_descriptors
-      d = OneofMessage.descriptor
-      o = d.lookup_oneof("my_oneof")
-      assert o != nil
-      assert o.class == Google::Protobuf::OneofDescriptor
-      assert o.name == "my_oneof"
-      oneof_count = 0
-      d.each_oneof{ |oneof|
-        oneof_count += 1
-        assert oneof == o
-      }
-      assert oneof_count == 1
-      assert o.count == 4
-      field_names = o.map{|f| f.name}.sort
-      assert field_names == ["a", "b", "c", "d"]
-    end
-
-    def test_oneof
-      d = OneofMessage.new
-      assert d.a == ""
-      assert d.b == 0
-      assert d.c == nil
-      assert d.d == :Default
-      assert d.my_oneof == nil
-
-      d.a = "hi"
-      assert d.a == "hi"
-      assert d.b == 0
-      assert d.c == nil
-      assert d.d == :Default
-      assert d.my_oneof == :a
-
-      d.b = 42
-      assert d.a == ""
-      assert d.b == 42
-      assert d.c == nil
-      assert d.d == :Default
-      assert d.my_oneof == :b
-
-      d.c = TestMessage2.new(:foo => 100)
-      assert d.a == ""
-      assert d.b == 0
-      assert d.c.foo == 100
-      assert d.d == :Default
-      assert d.my_oneof == :c
-
-      d.d = :C
-      assert d.a == ""
-      assert d.b == 0
-      assert d.c == nil
-      assert d.d == :C
-      assert d.my_oneof == :d
-
-      d2 = OneofMessage.decode(OneofMessage.encode(d))
-      assert d2 == d
-
-      encoded_field_a = OneofMessage.encode(OneofMessage.new(:a => "string"))
-      encoded_field_b = OneofMessage.encode(OneofMessage.new(:b => 1000))
-      encoded_field_c = OneofMessage.encode(
-        OneofMessage.new(:c => TestMessage2.new(:foo => 1)))
-      encoded_field_d = OneofMessage.encode(OneofMessage.new(:d => :B))
-
-      d3 = OneofMessage.decode(
-        encoded_field_c + encoded_field_a + encoded_field_d)
-      assert d3.a == ""
-      assert d3.b == 0
-      assert d3.c == nil
-      assert d3.d == :B
-
-      d4 = OneofMessage.decode(
-        encoded_field_c + encoded_field_a + encoded_field_d +
-        encoded_field_c)
-      assert d4.a == ""
-      assert d4.b == 0
-      assert d4.c.foo == 1
-      assert d4.d == :Default
-
-      d5 = OneofMessage.new(:a => "hello")
-      assert d5.a == "hello"
-      d5.a = nil
-      assert d5.a == ""
-      assert OneofMessage.encode(d5) == ''
-      assert d5.my_oneof == nil
-    end
-
-    def test_enum_field
-      m = TestMessage.new
-      assert m.optional_enum == :Default
-      m.optional_enum = :A
-      assert m.optional_enum == :A
-      assert_raise RangeError do
-        m.optional_enum = :ASDF
-      end
-      m.optional_enum = 1
-      assert m.optional_enum == :A
-      m.optional_enum = 100
-      assert m.optional_enum == 100
-    end
-
-    def test_dup
-      m = TestMessage.new
-      m.optional_string = "hello"
-      m.optional_int32 = 42
-      tm1 = TestMessage2.new(:foo => 100)
-      tm2 = TestMessage2.new(:foo => 200)
-      m.repeated_msg.push tm1
-      assert m.repeated_msg[-1] == tm1
-      m.repeated_msg.push tm2
-      assert m.repeated_msg[-1] == tm2
-      m2 = m.dup
-      assert m == m2
-      m.optional_int32 += 1
-      assert m != m2
-      assert m.repeated_msg[0] == m2.repeated_msg[0]
-      assert m.repeated_msg[0].object_id == m2.repeated_msg[0].object_id
-    end
-
-    def test_deep_copy
-      m = TestMessage.new(:optional_int32 => 42,
-                          :repeated_msg => [TestMessage2.new(:foo => 100)])
-      m2 = Google::Protobuf.deep_copy(m)
-      assert m == m2
-      assert m.repeated_msg == m2.repeated_msg
-      assert m.repeated_msg.object_id != m2.repeated_msg.object_id
-      assert m.repeated_msg[0].object_id != m2.repeated_msg[0].object_id
-    end
-
-    def test_eq
-      m = TestMessage.new(:optional_int32 => 42,
-                          :repeated_int32 => [1, 2, 3])
-      m2 = TestMessage.new(:optional_int32 => 43,
-                           :repeated_int32 => [1, 2, 3])
-      assert m != m2
-    end
-
-    def test_enum_lookup
-      assert TestEnum::A == 1
-      assert TestEnum::B == 2
-      assert TestEnum::C == 3
-
-      assert TestEnum::lookup(1) == :A
-      assert TestEnum::lookup(2) == :B
-      assert TestEnum::lookup(3) == :C
-
-      assert TestEnum::resolve(:A) == 1
-      assert TestEnum::resolve(:B) == 2
-      assert TestEnum::resolve(:C) == 3
-    end
-
-    def test_parse_serialize
-      m = TestMessage.new(:optional_int32 => 42,
-                          :optional_string => "hello world",
-                          :optional_enum => :B,
-                          :repeated_string => ["a", "b", "c"],
-                          :repeated_int32 => [42, 43, 44],
-                          :repeated_enum => [:A, :B, :C, 100],
-                          :repeated_msg => [TestMessage2.new(:foo => 1),
-                                            TestMessage2.new(:foo => 2)])
-      data = TestMessage.encode m
-      m2 = TestMessage.decode data
-      assert m == m2
-
-      data = Google::Protobuf.encode m
-      m2 = Google::Protobuf.decode(TestMessage, data)
-      assert m == m2
-    end
-
-    def test_encode_decode_helpers
-      m = TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
-      assert_equal 'foo', m.optional_string
-      assert_equal ['bar1', 'bar2'], m.repeated_string
-
-      json = m.to_json
-      m2 = TestMessage.decode_json(json)
-      assert_equal 'foo', m2.optional_string
-      assert_equal ['bar1', 'bar2'], m2.repeated_string
-      if RUBY_PLATFORM != "java"
-        assert m2.optional_string.frozen?
-        assert m2.repeated_string[0].frozen?
-      end
-
-      proto = m.to_proto
-      m2 = TestMessage.decode(proto)
-      assert_equal 'foo', m2.optional_string
-      assert_equal ['bar1', 'bar2'], m2.repeated_string
-    end
-
-    def test_protobuf_encode_decode_helpers
-      m = TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
-      encoded_msg = Google::Protobuf.encode(m)
-      assert_equal m.to_proto, encoded_msg
-
-      decoded_msg = Google::Protobuf.decode(TestMessage, encoded_msg)
-      assert_equal TestMessage.decode(m.to_proto), decoded_msg
-    end
-
-    def test_protobuf_encode_decode_json_helpers
-      m = TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
-      encoded_msg = Google::Protobuf.encode_json(m)
-      assert_equal m.to_json, encoded_msg
-
-      decoded_msg = Google::Protobuf.decode_json(TestMessage, encoded_msg)
-      assert_equal TestMessage.decode_json(m.to_json), decoded_msg
-    end
-
-    def test_to_h
-      m = TestMessage.new(:optional_bool => true, :optional_double => -10.100001, :optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
-      expected_result = {
-        :optional_bool=>true,
-        :optional_bytes=>"",
-        :optional_double=>-10.100001,
-        :optional_enum=>:Default,
-        :optional_float=>0.0,
-        :optional_int32=>0,
-        :optional_int64=>0,
-        :optional_msg=>nil,
-        :optional_string=>"foo",
-        :optional_uint32=>0,
-        :optional_uint64=>0,
-        :repeated_bool=>[],
-        :repeated_bytes=>[],
-        :repeated_double=>[],
-        :repeated_enum=>[],
-        :repeated_float=>[],
-        :repeated_int32=>[],
-        :repeated_int64=>[],
-        :repeated_msg=>[],
-        :repeated_string=>["bar1", "bar2"],
-        :repeated_uint32=>[],
-        :repeated_uint64=>[]
-      }
-      assert_equal expected_result, m.to_h
-    end
-
-
-    def test_def_errors
-      s = Google::Protobuf::DescriptorPool.new
-      assert_raise TypeError do
-        s.build do
-          # enum with no default (integer value 0)
-          add_enum "MyEnum" do
-            value :A, 1
-          end
-        end
-      end
-      assert_raise TypeError do
-        s.build do
-          # message with required field (unsupported in proto3)
-          add_message "MyMessage" do
-            required :foo, :int32, 1
-          end
-        end
-      end
-    end
-
-    def test_corecursive
-      # just be sure that we can instantiate types with corecursive field-type
-      # references.
-      m = Recursive1.new(:foo => Recursive2.new(:foo => Recursive1.new))
-      assert Recursive1.descriptor.lookup("foo").subtype ==
-        Recursive2.descriptor
-      assert Recursive2.descriptor.lookup("foo").subtype ==
-        Recursive1.descriptor
-
-      serialized = Recursive1.encode(m)
-      m2 = Recursive1.decode(serialized)
-      assert m == m2
-    end
-
-    def test_serialize_cycle
-      m = Recursive1.new(:foo => Recursive2.new)
-      m.foo.foo = m
-      assert_raise RuntimeError do
-        serialized = Recursive1.encode(m)
-      end
-    end
-
-    def test_bad_field_names
-      m = BadFieldNames.new(:dup => 1, :class => 2)
-      m2 = m.dup
-      assert m == m2
-      assert m['dup'] == 1
-      assert m['class'] == 2
-      m['dup'] = 3
-      assert m['dup'] == 3
-      m['a.b'] = 4
-      assert m['a.b'] == 4
-    end
-
-    def test_int_ranges
-      m = TestMessage.new
-
-      m.optional_int32 = 0
-      m.optional_int32 = -0x8000_0000
-      m.optional_int32 = +0x7fff_ffff
-      m.optional_int32 = 1.0
-      m.optional_int32 = -1.0
-      m.optional_int32 = 2e9
-      assert_raise RangeError do
-        m.optional_int32 = -0x8000_0001
-      end
-      assert_raise RangeError do
-        m.optional_int32 = +0x8000_0000
-      end
-      assert_raise RangeError do
-        m.optional_int32 = +0x1000_0000_0000_0000_0000_0000 # force Bignum
-      end
-      assert_raise RangeError do
-        m.optional_int32 = 1e12
-      end
-      assert_raise RangeError do
-        m.optional_int32 = 1.5
-      end
-
-      m.optional_uint32 = 0
-      m.optional_uint32 = +0xffff_ffff
-      m.optional_uint32 = 1.0
-      m.optional_uint32 = 4e9
-      assert_raise RangeError do
-        m.optional_uint32 = -1
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = -1.5
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = -1.5e12
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = -0x1000_0000_0000_0000
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = +0x1_0000_0000
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = +0x1000_0000_0000_0000_0000_0000 # force Bignum
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = 1e12
-      end
-      assert_raise RangeError do
-        m.optional_uint32 = 1.5
-      end
-
-      m.optional_int64 = 0
-      m.optional_int64 = -0x8000_0000_0000_0000
-      m.optional_int64 = +0x7fff_ffff_ffff_ffff
-      m.optional_int64 = 1.0
-      m.optional_int64 = -1.0
-      m.optional_int64 = 8e18
-      m.optional_int64 = -8e18
-      assert_raise RangeError do
-        m.optional_int64 = -0x8000_0000_0000_0001
-      end
-      assert_raise RangeError do
-        m.optional_int64 = +0x8000_0000_0000_0000
-      end
-      assert_raise RangeError do
-        m.optional_int64 = +0x1000_0000_0000_0000_0000_0000 # force Bignum
-      end
-      assert_raise RangeError do
-        m.optional_int64 = 1e50
-      end
-      assert_raise RangeError do
-        m.optional_int64 = 1.5
-      end
-
-      m.optional_uint64 = 0
-      m.optional_uint64 = +0xffff_ffff_ffff_ffff
-      m.optional_uint64 = 1.0
-      m.optional_uint64 = 16e18
-      assert_raise RangeError do
-        m.optional_uint64 = -1
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = -1.5
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = -1.5e12
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = -0x1_0000_0000_0000_0000
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = +0x1_0000_0000_0000_0000
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = +0x1000_0000_0000_0000_0000_0000 # force Bignum
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = 1e50
-      end
-      assert_raise RangeError do
-        m.optional_uint64 = 1.5
-      end
-    end
-
-    def test_stress_test
-      m = TestMessage.new
-      m.optional_int32 = 42
-      m.optional_int64 = 0x100000000
-      m.optional_string = "hello world"
-      10.times do m.repeated_msg.push TestMessage2.new(:foo => 42) end
-      10.times do m.repeated_string.push "hello world" end
-
-      data = TestMessage.encode(m)
-
-      l = 0
-      10_000.times do
-        m = TestMessage.decode(data)
-        data_new = TestMessage.encode(m)
-        assert data_new == data
-        data = data_new
-      end
-    end
-
-    def test_reflection
-      m = TestMessage.new(:optional_int32 => 1234)
-      msgdef = m.class.descriptor
-      assert msgdef.class == Google::Protobuf::Descriptor
-      assert msgdef.any? {|field| field.name == "optional_int32"}
-      optional_int32 = msgdef.lookup "optional_int32"
-      assert optional_int32.class == Google::Protobuf::FieldDescriptor
-      assert optional_int32 != nil
-      assert optional_int32.name == "optional_int32"
-      assert optional_int32.type == :int32
-      optional_int32.set(m, 5678)
-      assert m.optional_int32 == 5678
-      m.optional_int32 = 1000
-      assert optional_int32.get(m) == 1000
-
-      optional_msg = msgdef.lookup "optional_msg"
-      assert optional_msg.subtype == TestMessage2.descriptor
-
-      optional_msg.set(m, optional_msg.subtype.msgclass.new)
-
-      assert msgdef.msgclass == TestMessage
-
-      optional_enum = msgdef.lookup "optional_enum"
-      assert optional_enum.subtype == TestEnum.descriptor
-      assert optional_enum.subtype.class == Google::Protobuf::EnumDescriptor
-      optional_enum.subtype.each do |k, v|
-        # set with integer, check resolution to symbolic name
-        optional_enum.set(m, v)
-        assert optional_enum.get(m) == k
-      end
-    end
-
-    def test_json
-      # TODO: Fix JSON in JRuby version.
-      return if RUBY_PLATFORM == "java"
-      m = TestMessage.new(:optional_int32 => 1234,
-                          :optional_int64 => -0x1_0000_0000,
-                          :optional_uint32 => 0x8000_0000,
-                          :optional_uint64 => 0xffff_ffff_ffff_ffff,
-                          :optional_bool => true,
-                          :optional_float => 1.0,
-                          :optional_double => -1e100,
-                          :optional_string => "Test string",
-                          :optional_bytes => ["FFFFFFFF"].pack('H*'),
-                          :optional_msg => TestMessage2.new(:foo => 42),
-                          :repeated_int32 => [1, 2, 3, 4],
-                          :repeated_string => ["a", "b", "c"],
-                          :repeated_bool => [true, false, true, false],
-                          :repeated_msg => [TestMessage2.new(:foo => 1),
-                                            TestMessage2.new(:foo => 2)])
-
-      json_text = TestMessage.encode_json(m)
-      m2 = TestMessage.decode_json(json_text)
-      assert m == m2
-
-      # Crash case from GitHub issue 283.
-      bar = Bar.new(msg: "bar")
-      baz1 = Baz.new(msg: "baz")
-      baz2 = Baz.new(msg: "quux")
-      Foo.encode_json(Foo.new)
-      Foo.encode_json(Foo.new(bar: bar))
-      Foo.encode_json(Foo.new(bar: bar, baz: [baz1, baz2]))
-    end
-
-    def test_json_maps
-      # TODO: Fix JSON in JRuby version.
-      return if RUBY_PLATFORM == "java"
-      m = MapMessage.new(:map_string_int32 => {"a" => 1})
-      expected = '{"mapStringInt32":{"a":1},"mapStringMsg":{}}'
-      expected_preserve = '{"map_string_int32":{"a":1},"map_string_msg":{}}'
-      assert MapMessage.encode_json(m) == expected
-
-      json = MapMessage.encode_json(m, :preserve_proto_fieldnames => true)
-      assert json == expected_preserve
-
-      m2 = MapMessage.decode_json(MapMessage.encode_json(m))
-      assert m == m2
-    end
-  end
-end
diff --git a/ruby/compatibility_tests/v3.0.0/tests/generated_code.proto b/ruby/compatibility_tests/v3.0.0/tests/generated_code.proto
deleted file mode 100644
index 62fd83e..0000000
--- a/ruby/compatibility_tests/v3.0.0/tests/generated_code.proto
+++ /dev/null
@@ -1,67 +0,0 @@
-syntax = "proto3";
-
-package a.b.c;
-
-message TestMessage {
-  int32 optional_int32 = 1;
-  int64 optional_int64 = 2;
-  uint32 optional_uint32 = 3;
-  uint64 optional_uint64 = 4;
-  bool optional_bool = 5;
-  double optional_double = 6;
-  float optional_float = 7;
-  string optional_string = 8;
-  bytes optional_bytes = 9;
-  TestEnum optional_enum = 10;
-  TestMessage optional_msg = 11;
-
-  repeated int32 repeated_int32 = 21;
-  repeated int64 repeated_int64 = 22;
-  repeated uint32 repeated_uint32 = 23;
-  repeated uint64 repeated_uint64 = 24;
-  repeated bool repeated_bool = 25;
-  repeated double repeated_double = 26;
-  repeated float repeated_float = 27;
-  repeated string repeated_string = 28;
-  repeated bytes repeated_bytes = 29;
-  repeated TestEnum repeated_enum = 30;
-  repeated TestMessage repeated_msg = 31;
-
-  oneof my_oneof {
-    int32 oneof_int32 = 41;
-    int64 oneof_int64 = 42;
-    uint32 oneof_uint32 = 43;
-    uint64 oneof_uint64 = 44;
-    bool oneof_bool = 45;
-    double oneof_double = 46;
-    float oneof_float = 47;
-    string oneof_string = 48;
-    bytes oneof_bytes = 49;
-    TestEnum oneof_enum = 50;
-    TestMessage oneof_msg = 51;
-  }
-
-  map<int32, string> map_int32_string = 61;
-  map<int64, string> map_int64_string = 62;
-  map<uint32, string> map_uint32_string = 63;
-  map<uint64, string> map_uint64_string = 64;
-  map<bool, string> map_bool_string = 65;
-  map<string, string> map_string_string = 66;
-  map<string, TestMessage> map_string_msg = 67;
-  map<string, TestEnum> map_string_enum = 68;
-  map<string, int32> map_string_int32 = 69;
-  map<string, bool> map_string_bool = 70;
-
-  message NestedMessage {
-    int32 foo = 1;
-  }
-
-  NestedMessage nested_message = 80;
-}
-
-enum TestEnum {
-  Default = 0;
-  A = 1;
-  B = 2;
-  C = 3;
-}
diff --git a/ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb b/ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb
deleted file mode 100644
index b92b046..0000000
--- a/ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/ruby
-
-# generated_code.rb is in the same directory as this test.
-$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
-
-require 'generated_code_pb'
-require 'test_import_pb'
-require 'test/unit'
-
-class GeneratedCodeTest < Test::Unit::TestCase
-  def test_generated_msg
-    # just test that we can instantiate the message. The purpose of this test
-    # is to ensure that the output of the code generator is valid Ruby and
-    # successfully creates message definitions and classes, not to test every
-    # aspect of the extension (basic.rb is for that).
-    m = A::B::C::TestMessage.new()
-    m2 = FooBar::TestImportedMessage.new()
-  end
-end
diff --git a/ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb b/ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb
deleted file mode 100644
index 25727b7..0000000
--- a/ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb
+++ /dev/null
@@ -1,640 +0,0 @@
-#!/usr/bin/ruby
-
-require 'google/protobuf'
-require 'test/unit'
-
-class RepeatedFieldTest < Test::Unit::TestCase
-
-  def test_acts_like_enumerator
-    m = TestMessage.new
-    (Enumerable.instance_methods - TestMessage.new.repeated_string.methods).each do |method_name|
-      assert m.repeated_string.respond_to?(method_name) == true, "does not respond to #{method_name}"
-    end
-  end
-
-  def test_acts_like_an_array
-    m = TestMessage.new
-    arr_methods = ([].methods - TestMessage.new.repeated_string.methods)
-    # jRuby additions to the Array class that we can ignore
-    arr_methods -= [ :indices, :iter_for_each, :iter_for_each_index,
-      :iter_for_each_with_index, :dimensions, :copy_data, :copy_data_simple,
-      :nitems, :iter_for_reverse_each, :indexes]
-    arr_methods.each do |method_name|
-      assert m.repeated_string.respond_to?(method_name) == true, "does not respond to #{method_name}"
-    end
-  end
-
-  def test_first
-    m = TestMessage.new
-    repeated_field_names(TestMessage).each do |field_name|
-      assert_nil m.send(field_name).first
-    end
-    fill_test_msg(m)
-    assert_equal -10, m.repeated_int32.first
-    assert_equal -1_000_000, m.repeated_int64.first
-    assert_equal 10, m.repeated_uint32.first
-    assert_equal 1_000_000, m.repeated_uint64.first
-    assert_equal true, m.repeated_bool.first
-    assert_equal -1.01,  m.repeated_float.first.round(2)
-    assert_equal -1.0000000000001, m.repeated_double.first
-    assert_equal 'foo', m.repeated_string.first
-    assert_equal "bar".encode!('ASCII-8BIT'), m.repeated_bytes.first
-    assert_equal TestMessage2.new(:foo => 1), m.repeated_msg.first
-    assert_equal :A, m.repeated_enum.first
-  end
-
-
-  def test_last
-    m = TestMessage.new
-    repeated_field_names(TestMessage).each do |field_name|
-      assert_nil m.send(field_name).first
-    end
-    fill_test_msg(m)
-    assert_equal -11, m.repeated_int32.last
-    assert_equal -1_000_001, m.repeated_int64.last
-    assert_equal 11, m.repeated_uint32.last
-    assert_equal 1_000_001, m.repeated_uint64.last
-    assert_equal false, m.repeated_bool.last
-    assert_equal -1.02, m.repeated_float.last.round(2)
-    assert_equal -1.0000000000002, m.repeated_double.last
-    assert_equal 'bar', m.repeated_string.last
-    assert_equal "foo".encode!('ASCII-8BIT'), m.repeated_bytes.last
-    assert_equal TestMessage2.new(:foo => 2), m.repeated_msg.last
-    assert_equal :B, m.repeated_enum.last
-  end
-
-
-  def test_pop
-    m = TestMessage.new
-    repeated_field_names(TestMessage).each do |field_name|
-      assert_nil m.send(field_name).pop
-    end
-    fill_test_msg(m)
-
-    assert_equal -11, m.repeated_int32.pop
-    assert_equal -10, m.repeated_int32.pop
-    assert_equal -1_000_001, m.repeated_int64.pop
-    assert_equal -1_000_000, m.repeated_int64.pop
-    assert_equal 11, m.repeated_uint32.pop
-    assert_equal 10, m.repeated_uint32.pop
-    assert_equal 1_000_001, m.repeated_uint64.pop
-    assert_equal 1_000_000, m.repeated_uint64.pop
-    assert_equal false, m.repeated_bool.pop
-    assert_equal true, m.repeated_bool.pop
-    assert_equal -1.02,  m.repeated_float.pop.round(2)
-    assert_equal -1.01,  m.repeated_float.pop.round(2)
-    assert_equal -1.0000000000002, m.repeated_double.pop
-    assert_equal -1.0000000000001, m.repeated_double.pop
-    assert_equal 'bar', m.repeated_string.pop
-    assert_equal 'foo', m.repeated_string.pop
-    assert_equal "foo".encode!('ASCII-8BIT'), m.repeated_bytes.pop
-    assert_equal "bar".encode!('ASCII-8BIT'), m.repeated_bytes.pop
-    assert_equal TestMessage2.new(:foo => 2), m.repeated_msg.pop
-    assert_equal TestMessage2.new(:foo => 1), m.repeated_msg.pop
-    assert_equal :B, m.repeated_enum.pop
-    assert_equal :A, m.repeated_enum.pop
-    repeated_field_names(TestMessage).each do |field_name|
-      assert_nil m.send(field_name).pop
-    end
-
-    fill_test_msg(m)
-    assert_equal ['bar', 'foo'], m.repeated_string.pop(2)
-    assert_nil m.repeated_string.pop
-  end
-
-
-  def test_each
-    m = TestMessage.new
-    5.times{|i| m.repeated_string << 'string' }
-    count = 0
-    m.repeated_string.each do |val|
-      assert_equal 'string', val
-      count += 1
-    end
-    assert_equal 5, count
-    result = m.repeated_string.each{|val| val + '_junk'}
-    assert_equal ['string'] * 5, result
-  end
-
-
-  def test_empty?
-    m = TestMessage.new
-    assert_equal true, m.repeated_string.empty?
-    m.repeated_string << 'foo'
-    assert_equal false, m.repeated_string.empty?
-    m.repeated_string << 'bar'
-    assert_equal false, m.repeated_string.empty?
-  end
-
-  def test_array_accessor
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[1]
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[-2]
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[20]
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[1, 2]
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[0..2]
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[-1, 1]
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[10, 12]
-    end
-  end
-
-  def test_array_settor
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[1] = 'junk'
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[-2] = 'snappy'
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr[3] = ''
-    end
-    # slight deviation; we are strongly typed, and nil is not allowed
-    # for string types;
-    m.repeated_string[5] = 'spacious'
-    assert_equal ["foo", "snappy", "baz", "", "", "spacious"], m.repeated_string
-
-    #make sure it sests the default types for other fields besides strings
-    %w(repeated_int32 repeated_int64 repeated_uint32 repeated_uint64).each do |field_name|
-      m.send(field_name)[3] = 10
-      assert_equal [0,0,0,10], m.send(field_name)
-    end
-    m.repeated_float[3] = 10.1
-    #wonky mri float handling
-    assert_equal [0,0,0], m.repeated_float.to_a[0..2]
-    assert_equal 10.1, m.repeated_float[3].round(1)
-    m.repeated_double[3] = 10.1
-    assert_equal [0,0,0,10.1], m.repeated_double
-    m.repeated_bool[3] = true
-    assert_equal [false, false, false, true], m.repeated_bool
-    m.repeated_bytes[3] = "bar".encode!('ASCII-8BIT')
-    assert_equal ['', '', '', "bar".encode!('ASCII-8BIT')], m.repeated_bytes
-    m.repeated_msg[3] = TestMessage2.new(:foo => 1)
-    assert_equal [nil, nil, nil, TestMessage2.new(:foo => 1)], m.repeated_msg
-    m.repeated_enum[3] = :A
-    assert_equal [:Default, :Default, :Default, :A], m.repeated_enum
-
-    # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-    #   arr[20] = 'spacious'
-    # end
-    # TODO: accessor doesn't allow other ruby-like methods
-    # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-    #   arr[1, 2] = 'fizz'
-    # end
-    # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-    #   arr[0..2] = 'buzz'
-    # end
-  end
-
-  def test_push
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.push('fizz')
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr << 'fizz'
-    end
-    #TODO: push should support multiple
-    # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-    #   arr.push('fizz', 'buzz')
-    # end
-  end
-
-  def test_clear
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.clear
-    end
-  end
-
-  def test_concat
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    m.repeated_string.concat(['fizz', 'buzz'])
-    assert_equal %w(foo bar baz fizz buzz), m.repeated_string
-    #TODO: concat should return the orig array
-    # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-    #   arr.concat(['fizz', 'buzz'])
-    # end
-  end
-
-  def test_equal
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    assert_equal reference_arr, m.repeated_string
-    reference_arr << 'fizz'
-    assert_not_equal reference_arr, m.repeated_string
-    m.repeated_string << 'fizz'
-    assert_equal reference_arr, m.repeated_string
-  end
-
-  def test_hash
-    # just a sanity check
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    assert m.repeated_string.hash.is_a?(Integer)
-    hash = m.repeated_string.hash
-    assert_equal hash, m.repeated_string.hash
-    m.repeated_string << 'j'
-    assert_not_equal hash, m.repeated_string.hash
-  end
-
-  def test_plus
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr + ['fizz', 'buzz']
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr += ['fizz', 'buzz']
-    end
-  end
-
-  def test_replace
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.replace(['fizz', 'buzz'])
-    end
-  end
-
-  def test_to_a
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.to_a
-    end
-  end
-
-  def test_to_ary
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.to_ary
-    end
-  end
-
-  # emulate Array behavior
-  ##########################
-
-  def test_collect!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.collect!{|x| x + "!" }
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.collect!.with_index{|x, i| x[0...i] }
-    end
-  end
-
-  def test_compact!
-    m = TestMessage.new
-    m.repeated_msg << TestMessage2.new(:foo => 1)
-    m.repeated_msg << nil
-    m.repeated_msg << TestMessage2.new(:foo => 2)
-    reference_arr = m.repeated_string.to_a
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.compact!
-    end
-  end
-
-  def test_delete
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.delete('bar')
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.delete('nope')
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.delete('nope'){'within'}
-    end
-  end
-
-  def test_delete_at
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.delete_at(2)
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.delete_at(10)
-    end
-  end
-
-  def test_fill
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.fill("x")
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.fill("z", 2, 2)
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.fill("y", 0..1)
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.fill { |i| (i*i).to_s }
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.fill(-2) { |i| (i*i*i).to_s }
-    end
-  end
-
-  def test_flatten!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.flatten!
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.flatten!(1)
-    end
-  end
-
-  def test_insert
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.insert(2, 'fizz')
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.insert(3, 'fizz', 'buzz', 'bazz')
-    end
-  end
-
-  def test_inspect
-    m = TestMessage.new
-    assert_equal '[]', m.repeated_string.inspect
-    m.repeated_string << 'foo'
-    assert_equal m.repeated_string.to_a.inspect, m.repeated_string.inspect
-    m.repeated_string << 'bar'
-    assert_equal m.repeated_string.to_a.inspect, m.repeated_string.inspect
-  end
-
-  def test_reverse!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.reverse!
-    end
-  end
-
-  def test_rotate!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.rotate!
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.rotate!(2)
-    end
-  end
-
-  def test_select!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.select! { |v| v =~ /[aeiou]/ }
-    end
-  end
-
-  def test_shift
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    # should return an element
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.shift
-    end
-    # should return an array
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.shift(2)
-    end
-    # should return nil
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.shift
-    end
-  end
-
-  def test_shuffle!
-    m = TestMessage.new
-    m.repeated_string += %w(foo bar baz)
-    orig_repeated_string = m.repeated_string.clone
-    result = m.repeated_string.shuffle!
-    assert_equal m.repeated_string, result
-    # NOTE: sometimes it doesn't change the order...
-    # assert_not_equal m.repeated_string.to_a, orig_repeated_string.to_a
-  end
-
-  def test_slice!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz bar fizz buzz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.slice!(2)
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.slice!(1,2)
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.slice!(0..1)
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.slice!(10)
-    end
-  end
-
-  def test_sort!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.sort!
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.sort! { |x,y| y <=> x }
-    end
-  end
-
-  def test_sort_by!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.sort_by!
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.sort_by!(&:hash)
-    end
-  end
-
-  def test_uniq!
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.uniq!
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.uniq!{|s| s[0] }
-    end
-  end
-
-  def test_unshift
-    m = TestMessage.new
-    reference_arr = %w(foo bar baz)
-    m.repeated_string += reference_arr.clone
-
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.unshift('1')
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.unshift('a', 'b')
-    end
-    check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
-      arr.unshift('')
-    end
-  end
-
-
-  ##### HELPER METHODS
-
-  def check_self_modifying_method(repeated_field, ref_array)
-    expected_result = yield(ref_array)
-    actual_result = yield(repeated_field)
-    if expected_result.is_a?(Enumerator)
-      assert_equal expected_result.to_a, actual_result.to_a
-    else
-      assert_equal expected_result, actual_result
-    end
-    assert_equal ref_array, repeated_field
-  end
-
-
-  def repeated_field_names(klass)
-    klass.descriptor.find_all{|f| f.label == :repeated}.map(&:name)
-  end
-
-
-  def fill_test_msg(test_msg)
-    test_msg.repeated_int32  += [-10, -11]
-    test_msg.repeated_int64  += [-1_000_000, -1_000_001]
-    test_msg.repeated_uint32 += [10, 11]
-    test_msg.repeated_uint64 += [1_000_000, 1_000_001]
-    test_msg.repeated_bool   += [true, false]
-    test_msg.repeated_float  += [-1.01, -1.02]
-    test_msg.repeated_double += [-1.0000000000001, -1.0000000000002]
-    test_msg.repeated_string += %w(foo bar)
-    test_msg.repeated_bytes  += ["bar".encode!('ASCII-8BIT'), "foo".encode!('ASCII-8BIT')]
-    test_msg.repeated_msg    << TestMessage2.new(:foo => 1)
-    test_msg.repeated_msg    << TestMessage2.new(:foo => 2)
-    test_msg.repeated_enum   << :A
-    test_msg.repeated_enum   << :B
-  end
-
-
-  pool = Google::Protobuf::DescriptorPool.new
-  pool.build do
-
-    add_message "TestMessage" do
-      optional :optional_int32,  :int32,        1
-      optional :optional_int64,  :int64,        2
-      optional :optional_uint32, :uint32,       3
-      optional :optional_uint64, :uint64,       4
-      optional :optional_bool,   :bool,         5
-      optional :optional_float,  :float,        6
-      optional :optional_double, :double,       7
-      optional :optional_string, :string,       8
-      optional :optional_bytes,  :bytes,        9
-      optional :optional_msg,    :message,      10, "TestMessage2"
-      optional :optional_enum,   :enum,         11, "TestEnum"
-
-      repeated :repeated_int32,  :int32,        12
-      repeated :repeated_int64,  :int64,        13
-      repeated :repeated_uint32, :uint32,       14
-      repeated :repeated_uint64, :uint64,       15
-      repeated :repeated_bool,   :bool,         16
-      repeated :repeated_float,  :float,        17
-      repeated :repeated_double, :double,       18
-      repeated :repeated_string, :string,       19
-      repeated :repeated_bytes,  :bytes,        20
-      repeated :repeated_msg,    :message,      21, "TestMessage2"
-      repeated :repeated_enum,   :enum,         22, "TestEnum"
-    end
-    add_message "TestMessage2" do
-      optional :foo, :int32, 1
-    end
-
-    add_enum "TestEnum" do
-      value :Default, 0
-      value :A, 1
-      value :B, 2
-      value :C, 3
-    end
-  end
-
-  TestMessage = pool.lookup("TestMessage").msgclass
-  TestMessage2 = pool.lookup("TestMessage2").msgclass
-  TestEnum = pool.lookup("TestEnum").enummodule
-
-
-end
diff --git a/ruby/compatibility_tests/v3.0.0/tests/stress.rb b/ruby/compatibility_tests/v3.0.0/tests/stress.rb
deleted file mode 100644
index 082d5e2..0000000
--- a/ruby/compatibility_tests/v3.0.0/tests/stress.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/ruby
-
-require 'google/protobuf'
-require 'test/unit'
-
-module StressTest
-  pool = Google::Protobuf::DescriptorPool.new
-  pool.build do
-    add_message "TestMessage" do
-      optional :a,  :int32,        1
-      repeated :b,  :message,      2, "M"
-    end
-    add_message "M" do
-      optional :foo, :string, 1
-    end
-  end
-
-  TestMessage = pool.lookup("TestMessage").msgclass
-  M = pool.lookup("M").msgclass
-
-  class StressTest < Test::Unit::TestCase
-    def get_msg
-      TestMessage.new(:a => 1000,
-                      :b => [M.new(:foo => "hello"),
-                             M.new(:foo => "world")])
-    end
-    def test_stress
-      m = get_msg
-      data = TestMessage.encode(m)
-      100_000.times do
-        mnew = TestMessage.decode(data)
-        mnew = mnew.dup
-        assert_equal mnew.inspect, m.inspect
-        assert TestMessage.encode(mnew) == data
-      end
-    end
-  end
-end
diff --git a/ruby/compatibility_tests/v3.0.0/tests/test_import.proto b/ruby/compatibility_tests/v3.0.0/tests/test_import.proto
deleted file mode 100644
index 230484e..0000000
--- a/ruby/compatibility_tests/v3.0.0/tests/test_import.proto
+++ /dev/null
@@ -1,5 +0,0 @@
-syntax = "proto3";
-
-package foo_bar;
-
-message TestImportedMessage {}
diff --git a/ruby/ext/google/protobuf_c/defs.c b/ruby/ext/google/protobuf_c/defs.c
index d9d2eba..7e93baf 100644
--- a/ruby/ext/google/protobuf_c/defs.c
+++ b/ruby/ext/google/protobuf_c/defs.c
@@ -76,7 +76,7 @@
 // -----------------------------------------------------------------------------
 
 #define DEFINE_CLASS(name, string_name)                             \
-    VALUE c ## name = Qnil;                                         \
+    VALUE c ## name;                                                \
     const rb_data_type_t _ ## name ## _type = {                     \
       string_name,                                                  \
       { name ## _mark, name ## _free, NULL },                       \
@@ -101,7 +101,7 @@
 
 void DescriptorPool_free(void* _self) {
   DescriptorPool* self = _self;
-  upb_symtab_free(self->symtab);
+  upb_symtab_unref(self->symtab, &self->symtab);
   xfree(self);
 }
 
@@ -113,7 +113,7 @@
  */
 VALUE DescriptorPool_alloc(VALUE klass) {
   DescriptorPool* self = ALLOC(DescriptorPool);
-  self->symtab = upb_symtab_new();
+  self->symtab = upb_symtab_new(&self->symtab);
   return TypedData_Wrap_Struct(klass, &_DescriptorPool_type, self);
 }
 
@@ -126,11 +126,11 @@
   rb_define_method(klass, "lookup", DescriptorPool_lookup, 1);
   rb_define_singleton_method(klass, "generated_pool",
                              DescriptorPool_generated_pool, 0);
-  rb_gc_register_address(&cDescriptorPool);
   cDescriptorPool = klass;
+  rb_gc_register_address(&cDescriptorPool);
 
-  rb_gc_register_address(&generated_pool);
   generated_pool = rb_class_new_instance(0, NULL, klass);
+  rb_gc_register_address(&generated_pool);
 }
 
 static void add_descriptor_to_pool(DescriptorPool* self,
@@ -228,6 +228,7 @@
 void Descriptor_mark(void* _self) {
   Descriptor* self = _self;
   rb_gc_mark(self->klass);
+  rb_gc_mark(self->typeclass_references);
 }
 
 void Descriptor_free(void* _self) {
@@ -282,6 +283,7 @@
   self->pb_serialize_handlers = NULL;
   self->json_serialize_handlers = NULL;
   self->json_serialize_handlers_preserve = NULL;
+  self->typeclass_references = rb_ary_new();
   return ret;
 }
 
@@ -299,8 +301,8 @@
   rb_define_method(klass, "name", Descriptor_name, 0);
   rb_define_method(klass, "name=", Descriptor_name_set, 1);
   rb_include_module(klass, rb_mEnumerable);
-  rb_gc_register_address(&cDescriptor);
   cDescriptor = klass;
+  rb_gc_register_address(&cDescriptor);
 }
 
 /*
@@ -518,8 +520,8 @@
   rb_define_method(klass, "subtype", FieldDescriptor_subtype, 0);
   rb_define_method(klass, "get", FieldDescriptor_get, 1);
   rb_define_method(klass, "set", FieldDescriptor_set, 2);
-  rb_gc_register_address(&cFieldDescriptor);
   cFieldDescriptor = klass;
+  rb_gc_register_address(&cFieldDescriptor);
 }
 
 /*
@@ -916,8 +918,8 @@
   rb_define_method(klass, "add_field", OneofDescriptor_add_field, 1);
   rb_define_method(klass, "each", OneofDescriptor_each, 0);
   rb_include_module(klass, rb_mEnumerable);
-  rb_gc_register_address(&cOneofDescriptor);
   cOneofDescriptor = klass;
+  rb_gc_register_address(&cOneofDescriptor);
 }
 
 /*
@@ -1037,8 +1039,8 @@
   rb_define_method(klass, "each", EnumDescriptor_each, 0);
   rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
   rb_include_module(klass, rb_mEnumerable);
-  rb_gc_register_address(&cEnumDescriptor);
   cEnumDescriptor = klass;
+  rb_gc_register_address(&cEnumDescriptor);
 }
 
 /*
@@ -1202,8 +1204,8 @@
   rb_define_method(klass, "repeated", MessageBuilderContext_repeated, -1);
   rb_define_method(klass, "map", MessageBuilderContext_map, -1);
   rb_define_method(klass, "oneof", MessageBuilderContext_oneof, 1);
-  rb_gc_register_address(&cMessageBuilderContext);
   cMessageBuilderContext = klass;
+  rb_gc_register_address(&cMessageBuilderContext);
 }
 
 /*
@@ -1491,8 +1493,8 @@
   rb_define_method(klass, "initialize",
                    OneofBuilderContext_initialize, 2);
   rb_define_method(klass, "optional", OneofBuilderContext_optional, -1);
-  rb_gc_register_address(&cOneofBuilderContext);
   cOneofBuilderContext = klass;
+  rb_gc_register_address(&cOneofBuilderContext);
 }
 
 /*
@@ -1569,8 +1571,8 @@
   rb_define_method(klass, "initialize",
                    EnumBuilderContext_initialize, 1);
   rb_define_method(klass, "value", EnumBuilderContext_value, 2);
-  rb_gc_register_address(&cEnumBuilderContext);
   cEnumBuilderContext = klass;
+  rb_gc_register_address(&cEnumBuilderContext);
 }
 
 /*
@@ -1633,7 +1635,7 @@
   Builder* self = ALLOC(Builder);
   VALUE ret = TypedData_Wrap_Struct(
       klass, &_Builder_type, self);
-  self->pending_list = Qnil;
+  self->pending_list = rb_ary_new();
   self->defs = NULL;
   return ret;
 }
@@ -1643,22 +1645,9 @@
   rb_define_alloc_func(klass, Builder_alloc);
   rb_define_method(klass, "add_message", Builder_add_message, 1);
   rb_define_method(klass, "add_enum", Builder_add_enum, 1);
-  rb_define_method(klass, "initialize", Builder_initialize, 0);
   rb_define_method(klass, "finalize_to_pool", Builder_finalize_to_pool, 1);
-  rb_gc_register_address(&cBuilder);
   cBuilder = klass;
-}
-
-/*
- * call-seq:
- *     Builder.new(d) => builder
- *
- * Create a new message builder.
- */
-VALUE Builder_initialize(VALUE _self) {
-  DEFINE_SELF(Builder, self, _self);
-  self->pending_list = rb_ary_new();
-  return Qnil;
+  rb_gc_register_address(&cBuilder);
 }
 
 /*
diff --git a/ruby/ext/google/protobuf_c/encode_decode.c b/ruby/ext/google/protobuf_c/encode_decode.c
index 12080d0..f6bea50 100644
--- a/ruby/ext/google/protobuf_c/encode_decode.c
+++ b/ruby/ext/google/protobuf_c/encode_decode.c
@@ -44,56 +44,6 @@
   return rb_str;
 }
 
-// The code below also comes from upb's prototype Ruby binding, developed by
-// haberman@.
-
-/* stringsink *****************************************************************/
-
-static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
-  stringsink *sink = _sink;
-  sink->len = 0;
-  return sink;
-}
-
-static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
-                                size_t len, const upb_bufhandle *handle) {
-  stringsink *sink = _sink;
-  size_t new_size = sink->size;
-
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  while (sink->len + len > new_size) {
-    new_size *= 2;
-  }
-
-  if (new_size != sink->size) {
-    sink->ptr = realloc(sink->ptr, new_size);
-    sink->size = new_size;
-  }
-
-  memcpy(sink->ptr + sink->len, ptr, len);
-  sink->len += len;
-
-  return len;
-}
-
-void stringsink_init(stringsink *sink) {
-  upb_byteshandler_init(&sink->handler);
-  upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
-  upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
-
-  upb_bytessink_reset(&sink->sink, &sink->handler, sink);
-
-  sink->size = 32;
-  sink->ptr = malloc(sink->size);
-  sink->len = 0;
-}
-
-void stringsink_uninit(stringsink *sink) {
-  free(sink->ptr);
-}
-
 // -----------------------------------------------------------------------------
 // Parsing.
 // -----------------------------------------------------------------------------
@@ -104,7 +54,7 @@
 static const void* newhandlerdata(upb_handlers* h, uint32_t ofs) {
   size_t* hd_ofs = ALLOC(size_t);
   *hd_ofs = ofs;
-  upb_handlers_addcleanup(h, hd_ofs, xfree);
+  upb_handlers_addcleanup(h, hd_ofs, free);
   return hd_ofs;
 }
 
@@ -119,7 +69,7 @@
   submsg_handlerdata_t *hd = ALLOC(submsg_handlerdata_t);
   hd->ofs = ofs;
   hd->md = upb_fielddef_msgsubdef(f);
-  upb_handlers_addcleanup(h, hd, xfree);
+  upb_handlers_addcleanup(h, hd, free);
   return hd;
 }
 
@@ -149,7 +99,7 @@
   } else {
     hd->md = NULL;
   }
-  upb_handlers_addcleanup(h, hd, xfree);
+  upb_handlers_addcleanup(h, hd, free);
   return hd;
 }
 
@@ -185,7 +135,7 @@
   VALUE ary = (VALUE)closure;
   VALUE str = rb_str_new2("");
   rb_enc_associate(str, kRubyStringUtf8Encoding);
-  RepeatedField_push_native(ary, &str);
+  RepeatedField_push(ary, str);
   return (void*)str;
 }
 
@@ -196,7 +146,7 @@
   VALUE ary = (VALUE)closure;
   VALUE str = rb_str_new2("");
   rb_enc_associate(str, kRubyString8bitEncoding);
-  RepeatedField_push_native(ary, &str);
+  RepeatedField_push(ary, str);
   return (void*)str;
 }
 
@@ -232,23 +182,6 @@
   return len;
 }
 
-static bool stringdata_end_handler(void* closure, const void* hd) {
-  MessageHeader* msg = closure;
-  const size_t *ofs = hd;
-  VALUE rb_str = DEREF(msg, *ofs, VALUE);
-  rb_obj_freeze(rb_str);
-  return true;
-}
-
-static bool appendstring_end_handler(void* closure, const void* hd) {
-  VALUE ary = (VALUE)closure;
-  int size = RepeatedField_size(ary);
-  VALUE* last = RepeatedField_index_native(ary, size - 1);
-  VALUE rb_str = *last;
-  rb_obj_freeze(rb_str);
-  return true;
-}
-
 // Appends a submessage to a repeated field (a regular Ruby array for now).
 static void *appendsubmsg_handler(void *closure, const void *hd) {
   VALUE ary = (VALUE)closure;
@@ -305,45 +238,10 @@
 // value into the map.
 typedef struct {
   VALUE map;
-  const map_handlerdata_t* handlerdata;
   char key_storage[NATIVE_SLOT_MAX_SIZE];
   char value_storage[NATIVE_SLOT_MAX_SIZE];
 } map_parse_frame_t;
 
-static void MapParseFrame_mark(void* _self) {
-  map_parse_frame_t* frame = _self;
-
-  // This shouldn't strictly be necessary since this should be rooted by the
-  // message itself, but it can't hurt.
-  rb_gc_mark(frame->map);
-
-  native_slot_mark(frame->handlerdata->key_field_type, &frame->key_storage);
-  native_slot_mark(frame->handlerdata->value_field_type, &frame->value_storage);
-}
-
-void MapParseFrame_free(void* self) {
-  xfree(self);
-}
-
-rb_data_type_t MapParseFrame_type = {
-  "MapParseFrame",
-  { MapParseFrame_mark, MapParseFrame_free, NULL },
-};
-
-static map_parse_frame_t* map_push_frame(VALUE map,
-                                         const map_handlerdata_t* handlerdata) {
-  map_parse_frame_t* frame = ALLOC(map_parse_frame_t);
-  frame->handlerdata = handlerdata;
-  frame->map = map;
-  native_slot_init(handlerdata->key_field_type, &frame->key_storage);
-  native_slot_init(handlerdata->value_field_type, &frame->value_storage);
-
-  Map_set_frame(map,
-              TypedData_Wrap_Struct(rb_cObject, &MapParseFrame_type, frame));
-
-  return frame;
-}
-
 // Handler to begin a map entry: allocates a temporary frame. This is the
 // 'startsubmsg' handler on the msgdef that contains the map field.
 static void *startmapentry_handler(void *closure, const void *hd) {
@@ -351,7 +249,13 @@
   const map_handlerdata_t* mapdata = hd;
   VALUE map_rb = DEREF(msg, mapdata->ofs, VALUE);
 
-  return map_push_frame(map_rb, mapdata);
+  map_parse_frame_t* frame = ALLOC(map_parse_frame_t);
+  frame->map = map_rb;
+
+  native_slot_init(mapdata->key_field_type, &frame->key_storage);
+  native_slot_init(mapdata->value_field_type, &frame->value_storage);
+
+  return frame;
 }
 
 // Handler to end a map entry: inserts the value defined during the message into
@@ -377,7 +281,7 @@
       &frame->value_storage);
 
   Map_index_set(frame->map, key, value);
-  Map_set_frame(frame->map, Qnil);
+  free(frame);
 
   return true;
 }
@@ -456,13 +360,6 @@
   return (void*)str;
 }
 
-static bool oneofstring_end_handler(void* closure, const void* hd) {
-  MessageHeader* msg = closure;
-  const oneof_handlerdata_t *oneofdata = hd;
-  rb_obj_freeze(DEREF(msg, oneofdata->ofs, VALUE));
-  return true;
-}
-
 // Handler for a submessage field in a oneof.
 static void *oneofsubmsg_handler(void *closure,
                                  const void *hd) {
@@ -529,7 +426,6 @@
                                appendbytes_handler : appendstr_handler,
                                NULL);
       upb_handlers_setstring(h, f, stringdata_handler, NULL);
-      upb_handlers_setendstr(h, f, appendstring_end_handler, NULL);
       break;
     }
     case UPB_TYPE_MESSAGE: {
@@ -555,7 +451,7 @@
     case UPB_TYPE_INT64:
     case UPB_TYPE_UINT64:
     case UPB_TYPE_DOUBLE:
-      upb_msg_setscalarhandler(h, f, offset, -1);
+      upb_shim_set(h, f, offset, -1);
       break;
     case UPB_TYPE_STRING:
     case UPB_TYPE_BYTES: {
@@ -566,7 +462,6 @@
                                is_bytes ? bytes_handler : str_handler,
                                &attr);
       upb_handlers_setstring(h, f, stringdata_handler, &attr);
-      upb_handlers_setendstr(h, f, stringdata_end_handler, &attr);
       upb_handlerattr_uninit(&attr);
       break;
     }
@@ -589,7 +484,7 @@
   map_handlerdata_t* hd = new_map_handlerdata(offset, map_msgdef, desc);
   upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
 
-  upb_handlers_addcleanup(h, hd, xfree);
+  upb_handlers_addcleanup(h, hd, free);
   upb_handlerattr_sethandlerdata(&attr, hd);
   upb_handlers_setstartsubmsg(h, fielddef, startmapentry_handler, &attr);
   upb_handlerattr_uninit(&attr);
@@ -604,7 +499,7 @@
   map_handlerdata_t* hd = new_map_handlerdata(0, msgdef, desc);
   upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
 
-  upb_handlers_addcleanup(h, hd, xfree);
+  upb_handlers_addcleanup(h, hd, free);
   upb_handlerattr_sethandlerdata(&attr, hd);
   upb_handlers_setendmsg(h, endmap_handler, &attr);
 
@@ -651,7 +546,6 @@
                                oneofbytes_handler : oneofstr_handler,
                                &attr);
       upb_handlers_setstring(h, f, stringdata_handler, NULL);
-      upb_handlers_setendstr(h, f, oneofstring_end_handler, &attr);
       break;
     }
     case UPB_TYPE_MESSAGE: {
@@ -663,20 +557,6 @@
   upb_handlerattr_uninit(&attr);
 }
 
-static bool unknown_field_handler(void* closure, const void* hd,
-                                  const char* buf, size_t size) {
-  UPB_UNUSED(hd);
-
-  MessageHeader* msg = (MessageHeader*)closure;
-  if (msg->unknown_fields == NULL) {
-    msg->unknown_fields = malloc(sizeof(stringsink));
-    stringsink_init(msg->unknown_fields);
-  }
-
-  stringsink_string(msg->unknown_fields, NULL, buf, size, NULL);
-
-  return true;
-}
 
 static void add_handlers_for_message(const void *closure, upb_handlers *h) {
   const upb_msgdef* msgdef = upb_handlers_msgdef(h);
@@ -698,9 +578,6 @@
     desc->layout = create_layout(desc->msgdef);
   }
 
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-  upb_handlers_setunknown(h, unknown_field_handler, &attr);
-
   for (upb_msg_field_begin(&i, desc->msgdef);
        !upb_msg_field_done(&i);
        upb_msg_field_next(&i)) {
@@ -898,6 +775,65 @@
 // -----------------------------------------------------------------------------
 // Serializing.
 // -----------------------------------------------------------------------------
+//
+// The code below also comes from upb's prototype Ruby binding, developed by
+// haberman@.
+
+/* stringsink *****************************************************************/
+
+// This should probably be factored into a common upb component.
+
+typedef struct {
+  upb_byteshandler handler;
+  upb_bytessink sink;
+  char *ptr;
+  size_t len, size;
+} stringsink;
+
+static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
+  stringsink *sink = _sink;
+  sink->len = 0;
+  return sink;
+}
+
+static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
+                                size_t len, const upb_bufhandle *handle) {
+  stringsink *sink = _sink;
+  size_t new_size = sink->size;
+
+  UPB_UNUSED(hd);
+  UPB_UNUSED(handle);
+
+  while (sink->len + len > new_size) {
+    new_size *= 2;
+  }
+
+  if (new_size != sink->size) {
+    sink->ptr = realloc(sink->ptr, new_size);
+    sink->size = new_size;
+  }
+
+  memcpy(sink->ptr + sink->len, ptr, len);
+  sink->len += len;
+
+  return len;
+}
+
+void stringsink_init(stringsink *sink) {
+  upb_byteshandler_init(&sink->handler);
+  upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
+  upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
+
+  upb_bytessink_reset(&sink->sink, &sink->handler, sink);
+
+  sink->size = 32;
+  sink->ptr = malloc(sink->size);
+  sink->len = 0;
+}
+
+void stringsink_uninit(stringsink *sink) {
+  free(sink->ptr);
+}
 
 /* msgvisitor *****************************************************************/
 
@@ -905,14 +841,18 @@
 // semantics, which means that we have true field presence, we will want to
 // modify msgvisitor so that it emits all present fields rather than all
 // non-default-value fields.
+//
+// Likewise, when implementing JSON serialization, we may need to have a
+// 'verbose' mode that outputs all fields and a 'concise' mode that outputs only
+// those with non-default values.
 
 static void putmsg(VALUE msg, const Descriptor* desc,
-                   upb_sink *sink, int depth, bool emit_defaults);
+                   upb_sink *sink, int depth);
 
 static upb_selector_t getsel(const upb_fielddef *f, upb_handlertype_t type) {
   upb_selector_t ret;
   bool ok = upb_handlers_getselector(f, type, &ret);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return ret;
 }
 
@@ -923,13 +863,9 @@
 
   assert(BUILTIN_TYPE(str) == RUBY_T_STRING);
 
-  // We should be guaranteed that the string has the correct encoding because
-  // we ensured this at assignment time and then froze the string.
-  if (upb_fielddef_type(f) == UPB_TYPE_STRING) {
-    assert(rb_enc_from_index(ENCODING_GET(str)) == kRubyStringUtf8Encoding);
-  } else {
-    assert(rb_enc_from_index(ENCODING_GET(str)) == kRubyString8bitEncoding);
-  }
+  // Ensure that the string has the correct encoding. We also check at field-set
+  // time, but the user may have mutated the string object since then.
+  native_slot_validate_string_encoding(upb_fielddef_type(f), str);
 
   upb_sink_startstr(sink, getsel(f, UPB_HANDLER_STARTSTR), RSTRING_LEN(str),
                     &subsink);
@@ -939,7 +875,7 @@
 }
 
 static void putsubmsg(VALUE submsg, const upb_fielddef *f, upb_sink *sink,
-                      int depth, bool emit_defaults) {
+                      int depth) {
   upb_sink subsink;
   VALUE descriptor;
   Descriptor* subdesc;
@@ -950,12 +886,12 @@
   subdesc = ruby_to_Descriptor(descriptor);
 
   upb_sink_startsubmsg(sink, getsel(f, UPB_HANDLER_STARTSUBMSG), &subsink);
-  putmsg(submsg, subdesc, &subsink, depth + 1, emit_defaults);
+  putmsg(submsg, subdesc, &subsink, depth + 1);
   upb_sink_endsubmsg(sink, getsel(f, UPB_HANDLER_ENDSUBMSG));
 }
 
 static void putary(VALUE ary, const upb_fielddef *f, upb_sink *sink,
-                   int depth, bool emit_defaults) {
+                   int depth) {
   upb_sink subsink;
   upb_fieldtype_t type = upb_fielddef_type(f);
   upb_selector_t sel = 0;
@@ -992,7 +928,7 @@
         putstr(*((VALUE *)memory), f, &subsink);
         break;
       case UPB_TYPE_MESSAGE:
-        putsubmsg(*((VALUE *)memory), f, &subsink, depth, emit_defaults);
+        putsubmsg(*((VALUE *)memory), f, &subsink, depth);
         break;
 
 #undef T
@@ -1006,8 +942,7 @@
                            const upb_fielddef *f,
                            VALUE type_class,
                            int depth,
-                           upb_sink *sink,
-                           bool emit_defaults) {
+                           upb_sink *sink) {
   upb_selector_t sel = 0;
   if (upb_fielddef_isprimitive(f)) {
     sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
@@ -1047,12 +982,12 @@
       putstr(value, f, sink);
       break;
     case UPB_TYPE_MESSAGE:
-      putsubmsg(value, f, sink, depth, emit_defaults);
+      putsubmsg(value, f, sink, depth);
   }
 }
 
 static void putmap(VALUE map, const upb_fielddef *f, upb_sink *sink,
-                   int depth, bool emit_defaults) {
+                   int depth) {
   Map* self;
   upb_sink subsink;
   const upb_fielddef* key_field;
@@ -1078,9 +1013,9 @@
                          &entry_sink);
     upb_sink_startmsg(&entry_sink);
 
-    put_ruby_value(key, key_field, Qnil, depth + 1, &entry_sink, emit_defaults);
+    put_ruby_value(key, key_field, Qnil, depth + 1, &entry_sink);
     put_ruby_value(value, value_field, self->value_type_class, depth + 1,
-                   &entry_sink, emit_defaults);
+                   &entry_sink);
 
     upb_sink_endmsg(&entry_sink, &status);
     upb_sink_endsubmsg(&subsink, getsel(f, UPB_HANDLER_ENDSUBMSG));
@@ -1090,7 +1025,7 @@
 }
 
 static void putmsg(VALUE msg_rb, const Descriptor* desc,
-                   upb_sink *sink, int depth, bool emit_defaults) {
+                   upb_sink *sink, int depth) {
   MessageHeader* msg;
   upb_msg_field_iter i;
   upb_status status;
@@ -1132,31 +1067,31 @@
 
     if (is_map_field(f)) {
       VALUE map = DEREF(msg, offset, VALUE);
-      if (map != Qnil || emit_defaults) {
-        putmap(map, f, sink, depth, emit_defaults);
+      if (map != Qnil) {
+        putmap(map, f, sink, depth);
       }
     } else if (upb_fielddef_isseq(f)) {
       VALUE ary = DEREF(msg, offset, VALUE);
       if (ary != Qnil) {
-        putary(ary, f, sink, depth, emit_defaults);
+        putary(ary, f, sink, depth);
       }
     } else if (upb_fielddef_isstring(f)) {
       VALUE str = DEREF(msg, offset, VALUE);
-      if (is_matching_oneof || emit_defaults || RSTRING_LEN(str) > 0) {
+      if (is_matching_oneof || RSTRING_LEN(str) > 0) {
         putstr(str, f, sink);
       }
     } else if (upb_fielddef_issubmsg(f)) {
-      putsubmsg(DEREF(msg, offset, VALUE), f, sink, depth, emit_defaults);
+      putsubmsg(DEREF(msg, offset, VALUE), f, sink, depth);
     } else {
       upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
 
-#define T(upbtypeconst, upbtype, ctype, default_value)                    \
-  case upbtypeconst: {                                                    \
-      ctype value = DEREF(msg, offset, ctype);                            \
-      if (is_matching_oneof || emit_defaults || value != default_value) { \
-        upb_sink_put##upbtype(sink, sel, value);                          \
-      }                                                                   \
-    }                                                                     \
+#define T(upbtypeconst, upbtype, ctype, default_value)                \
+  case upbtypeconst: {                                                \
+      ctype value = DEREF(msg, offset, ctype);                        \
+      if (is_matching_oneof || value != default_value) {              \
+        upb_sink_put##upbtype(sink, sel, value);                      \
+      }                                                               \
+    }                                                                 \
     break;
 
       switch (upb_fielddef_type(f)) {
@@ -1179,11 +1114,6 @@
     }
   }
 
-  stringsink* unknown = msg->unknown_fields;
-  if (unknown != NULL) {
-    upb_sink_putunknown(sink, unknown->ptr, unknown->len);
-  }
-
   upb_sink_endmsg(sink, &status);
 }
 
@@ -1239,7 +1169,7 @@
     stackenv_init(&se, "Error occurred during encoding: %s");
     encoder = upb_pb_encoder_create(&se.env, serialize_handlers, &sink.sink);
 
-    putmsg(msg_rb, desc, upb_pb_encoder_input(encoder), 0, false);
+    putmsg(msg_rb, desc, upb_pb_encoder_input(encoder), 0);
 
     ret = rb_str_new(sink.ptr, sink.len);
 
@@ -1261,7 +1191,6 @@
   Descriptor* desc = ruby_to_Descriptor(descriptor);
   VALUE msg_rb;
   VALUE preserve_proto_fieldnames = Qfalse;
-  VALUE emit_defaults = Qfalse;
   stringsink sink;
 
   if (argc < 1 || argc > 2) {
@@ -1277,9 +1206,6 @@
     }
     preserve_proto_fieldnames = rb_hash_lookup2(
         hash_args, ID2SYM(rb_intern("preserve_proto_fieldnames")), Qfalse);
-
-    emit_defaults = rb_hash_lookup2(
-        hash_args, ID2SYM(rb_intern("emit_defaults")), Qfalse);
   }
 
   stringsink_init(&sink);
@@ -1294,7 +1220,7 @@
     stackenv_init(&se, "Error occurred during encoding: %s");
     printer = upb_json_printer_create(&se.env, serialize_handlers, &sink.sink);
 
-    putmsg(msg_rb, desc, upb_json_printer_input(printer), 0, RTEST(emit_defaults));
+    putmsg(msg_rb, desc, upb_json_printer_input(printer), 0);
 
     ret = rb_enc_str_new(sink.ptr, sink.len, rb_utf8_encoding());
 
@@ -1305,91 +1231,3 @@
   }
 }
 
-static void discard_unknown(VALUE msg_rb, const Descriptor* desc) {
-  MessageHeader* msg;
-  upb_msg_field_iter it;
-
-  TypedData_Get_Struct(msg_rb, MessageHeader, &Message_type, msg);
-
-  stringsink* unknown = msg->unknown_fields;
-  if (unknown != NULL) {
-    stringsink_uninit(unknown);
-    msg->unknown_fields = NULL;
-  }
-
-  for (upb_msg_field_begin(&it, desc->msgdef);
-       !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    upb_fielddef *f = upb_msg_iter_field(&it);
-    uint32_t offset =
-        desc->layout->fields[upb_fielddef_index(f)].offset +
-        sizeof(MessageHeader);
-
-    if (upb_fielddef_containingoneof(f)) {
-      uint32_t oneof_case_offset =
-          desc->layout->fields[upb_fielddef_index(f)].case_offset +
-          sizeof(MessageHeader);
-      // For a oneof, check that this field is actually present -- skip all the
-      // below if not.
-      if (DEREF(msg, oneof_case_offset, uint32_t) !=
-          upb_fielddef_number(f)) {
-        continue;
-      }
-      // Otherwise, fall through to the appropriate singular-field handler
-      // below.
-    }
-
-    if (!upb_fielddef_issubmsg(f)) {
-      continue;
-    }
-
-    if (is_map_field(f)) {
-      if (!upb_fielddef_issubmsg(map_field_value(f))) continue;
-      VALUE map = DEREF(msg, offset, VALUE);
-      if (map == Qnil) continue;
-      Map_iter map_it;
-      for (Map_begin(map, &map_it); !Map_done(&map_it); Map_next(&map_it)) {
-        VALUE submsg = Map_iter_value(&map_it);
-        VALUE descriptor = rb_ivar_get(submsg, descriptor_instancevar_interned);
-        const Descriptor* subdesc = ruby_to_Descriptor(descriptor);
-        discard_unknown(submsg, subdesc);
-      }
-    } else if (upb_fielddef_isseq(f)) {
-      VALUE ary = DEREF(msg, offset, VALUE);
-      if (ary == Qnil) continue;
-      int size = NUM2INT(RepeatedField_length(ary));
-      for (int i = 0; i < size; i++) {
-        void* memory = RepeatedField_index_native(ary, i);
-        VALUE submsg = *((VALUE *)memory);
-        VALUE descriptor = rb_ivar_get(submsg, descriptor_instancevar_interned);
-        const Descriptor* subdesc = ruby_to_Descriptor(descriptor);
-        discard_unknown(submsg, subdesc);
-      }
-    } else {
-      VALUE submsg = DEREF(msg, offset, VALUE);
-      if (submsg == Qnil) continue;
-      VALUE descriptor = rb_ivar_get(submsg, descriptor_instancevar_interned);
-      const Descriptor* subdesc = ruby_to_Descriptor(descriptor);
-      discard_unknown(submsg, subdesc);
-    }
-  }
-}
-
-/*
- * call-seq:
- *     Google::Protobuf.discard_unknown(msg)
- *
- * Discard unknown fields in the given message object and recursively discard
- * unknown fields in submessages.
- */
-VALUE Google_Protobuf_discard_unknown(VALUE self, VALUE msg_rb) {
-  VALUE klass = CLASS_OF(msg_rb);
-  VALUE descriptor = rb_ivar_get(klass, descriptor_instancevar_interned);
-  Descriptor* desc = ruby_to_Descriptor(descriptor);
-  if (klass == cRepeatedField || klass == cMap) {
-    rb_raise(rb_eArgError, "Expected proto msg for discard unknown.");
-  } else {
-    discard_unknown(msg_rb, desc);
-  }
-  return Qnil;
-}
diff --git a/ruby/ext/google/protobuf_c/extconf.rb b/ruby/ext/google/protobuf_c/extconf.rb
index 0886e60..b368dcc 100644
--- a/ruby/ext/google/protobuf_c/extconf.rb
+++ b/ruby/ext/google/protobuf_c/extconf.rb
@@ -4,14 +4,7 @@
 
 $CFLAGS += " -std=c99 -O3 -DNDEBUG"
 
-
-if RUBY_PLATFORM =~ /linux/
-  # Instruct the linker to point memcpy calls at our __wrap_memcpy wrapper.
-  $LDFLAGS += " -Wl,-wrap,memcpy"
-end
-
 $objs = ["protobuf.o", "defs.o", "storage.o", "message.o",
-         "repeated_field.o", "map.o", "encode_decode.o", "upb.o",
-         "wrap_memcpy.o"]
+         "repeated_field.o", "map.o", "encode_decode.o", "upb.o"]
 
 create_makefile("google/protobuf_c")
diff --git a/ruby/ext/google/protobuf_c/map.c b/ruby/ext/google/protobuf_c/map.c
index 8c2f642..92fc728 100644
--- a/ruby/ext/google/protobuf_c/map.c
+++ b/ruby/ext/google/protobuf_c/map.c
@@ -63,16 +63,16 @@
 // construct a key byte sequence if needed. |out_key| and |out_length| provide
 // the resulting key data/length.
 #define TABLE_KEY_BUF_LENGTH 8  // sizeof(uint64_t)
-static VALUE table_key(Map* self, VALUE key,
-                       char* buf,
-                       const char** out_key,
-                       size_t* out_length) {
+static void table_key(Map* self, VALUE key,
+                      char* buf,
+                      const char** out_key,
+                      size_t* out_length) {
   switch (self->key_type) {
     case UPB_TYPE_BYTES:
     case UPB_TYPE_STRING:
       // Strings: use string content directly.
       Check_Type(key, T_STRING);
-      key = native_slot_encode_and_freeze_string(self->key_type, key);
+      native_slot_validate_string_encoding(self->key_type, key);
       *out_key = RSTRING_PTR(key);
       *out_length = RSTRING_LEN(key);
       break;
@@ -93,8 +93,6 @@
       assert(false);
       break;
   }
-
-  return key;
 }
 
 static VALUE table_key_to_ruby(Map* self, const char* buf, size_t length) {
@@ -146,7 +144,6 @@
   Map* self = _self;
 
   rb_gc_mark(self->value_type_class);
-  rb_gc_mark(self->parse_frame);
 
   if (self->value_type == UPB_TYPE_STRING ||
       self->value_type == UPB_TYPE_BYTES ||
@@ -175,12 +172,6 @@
   return TypedData_Wrap_Struct(klass, &Map_type, self);
 }
 
-VALUE Map_set_frame(VALUE map, VALUE val) {
-  Map* self = ruby_to_Map(map);
-  self->parse_frame = val;
-  return val;
-}
-
 static bool needs_typeclass(upb_fieldtype_t type) {
   switch (type) {
     case UPB_TYPE_MESSAGE:
@@ -234,7 +225,6 @@
 
   self->key_type = ruby_to_fieldtype(argv[0]);
   self->value_type = ruby_to_fieldtype(argv[1]);
-  self->parse_frame = Qnil;
 
   // Check that the key type is an allowed type.
   switch (self->key_type) {
@@ -367,7 +357,7 @@
   const char* keyval = NULL;
   size_t length = 0;
   upb_value v;
-  key = table_key(self, key, keybuf, &keyval, &length);
+  table_key(self, key, keybuf, &keyval, &length);
 
   if (upb_strtable_lookup2(&self->table, keyval, length, &v)) {
     void* mem = value_memory(&v);
@@ -393,7 +383,7 @@
   size_t length = 0;
   upb_value v;
   void* mem;
-  key = table_key(self, key, keybuf, &keyval, &length);
+  table_key(self, key, keybuf, &keyval, &length);
 
   mem = value_memory(&v);
   native_slot_set(self->value_type, self->value_type_class, mem, value);
@@ -421,7 +411,7 @@
   char keybuf[TABLE_KEY_BUF_LENGTH];
   const char* keyval = NULL;
   size_t length = 0;
-  key = table_key(self, key, keybuf, &keyval, &length);
+  table_key(self, key, keybuf, &keyval, &length);
 
   if (upb_strtable_lookup2(&self->table, keyval, length, NULL)) {
     return Qtrue;
@@ -444,7 +434,7 @@
   const char* keyval = NULL;
   size_t length = 0;
   upb_value v;
-  key = table_key(self, key, keybuf, &keyval, &length);
+  table_key(self, key, keybuf, &keyval, &length);
 
   if (upb_strtable_remove2(&self->table, keyval, length, &v)) {
     void* mem = value_memory(&v);
@@ -662,35 +652,6 @@
 
 /*
  * call-seq:
- *     Map.to_h => {}
- *
- * Returns a Ruby Hash object containing all the values within the map
- */
-VALUE Map_to_h(VALUE _self) {
-  Map* self = ruby_to_Map(_self);
-  VALUE hash = rb_hash_new();
-  upb_strtable_iter it;
-  for (upb_strtable_begin(&it, &self->table);
-       !upb_strtable_done(&it);
-       upb_strtable_next(&it)) {
-    VALUE key = table_key_to_ruby(
-        self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it));
-    upb_value v = upb_strtable_iter_value(&it);
-    void* mem = value_memory(&v);
-    VALUE value = native_slot_get(self->value_type,
-                                  self->value_type_class,
-                                  mem);
-
-    if (self->value_type == UPB_TYPE_MESSAGE) {
-      value = Message_to_h(value);
-    }
-    rb_hash_aset(hash, key, value);
-  }
-  return hash;
-}
-
-/*
- * call-seq:
  *     Map.inspect => string
  *
  * Returns a string representing this map's elements. It will be formatted as
@@ -825,8 +786,8 @@
 void Map_register(VALUE module) {
   VALUE klass = rb_define_class_under(module, "Map", rb_cObject);
   rb_define_alloc_func(klass, Map_alloc);
-  rb_gc_register_address(&cMap);
   cMap = klass;
+  rb_gc_register_address(&cMap);
 
   rb_define_method(klass, "initialize", Map_init, -1);
   rb_define_method(klass, "each", Map_each, 0);
@@ -841,8 +802,6 @@
   rb_define_method(klass, "dup", Map_dup, 0);
   rb_define_method(klass, "==", Map_eq, 1);
   rb_define_method(klass, "hash", Map_hash, 0);
-  rb_define_method(klass, "to_hash", Map_to_h, 0);
-  rb_define_method(klass, "to_h", Map_to_h, 0);
   rb_define_method(klass, "inspect", Map_inspect, 0);
   rb_define_method(klass, "merge", Map_merge, 1);
   rb_include_module(klass, rb_mEnumerable);
diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c
index bc73d48..e16250f 100644
--- a/ruby/ext/google/protobuf_c/message.c
+++ b/ruby/ext/google/protobuf_c/message.c
@@ -44,11 +44,6 @@
 }
 
 void Message_free(void* self) {
-  stringsink* unknown = ((MessageHeader *)self)->unknown_fields;
-  if (unknown != NULL) {
-    stringsink_uninit(unknown);
-    free(unknown);
-  }
   xfree(self);
 }
 
@@ -72,8 +67,6 @@
   msg->descriptor = desc;
   rb_ivar_set(ret, descriptor_instancevar_interned, descriptor);
 
-  msg->unknown_fields = NULL;
-
   layout_init(desc->layout, Message_data(msg));
 
   return ret;
@@ -185,71 +178,20 @@
   }
 }
 
-VALUE Message_respond_to_missing(int argc, VALUE* argv, VALUE _self) {
-  MessageHeader* self;
-  VALUE method_name, method_str;
-  char* name;
-  size_t name_len;
-  bool setter;
-  const upb_oneofdef* o;
-  const upb_fielddef* f;
-
-  TypedData_Get_Struct(_self, MessageHeader, &Message_type, self);
-  if (argc < 1) {
-    rb_raise(rb_eArgError, "Expected method name as first argument.");
-  }
-  method_name = argv[0];
-  if (!SYMBOL_P(method_name)) {
-    rb_raise(rb_eArgError, "Expected symbol as method name.");
-  }
-  method_str = rb_id2str(SYM2ID(method_name));
-  name = RSTRING_PTR(method_str);
-  name_len = RSTRING_LEN(method_str);
-  setter = false;
-
-  // Setters have names that end in '='.
-  if (name[name_len - 1] == '=') {
-    setter = true;
-    name_len--;
-  }
-
-  // See if this name corresponds to either a oneof or field in this message.
-  if (!upb_msgdef_lookupname(self->descriptor->msgdef, name, name_len, &f,
-                             &o)) {
-    return rb_call_super(argc, argv);
-  }
-  if (o != NULL) {
-    return setter ? Qfalse : Qtrue;
-  }
-  return Qtrue;
-}
-
-VALUE create_submsg_from_hash(const upb_fielddef *f, VALUE hash) {
-  const upb_def *d = upb_fielddef_subdef(f);
-  assert(d != NULL);
-
-  VALUE descriptor = get_def_obj(d);
-  VALUE msgclass = rb_funcall(descriptor, rb_intern("msgclass"), 0, NULL);
-
-  VALUE args[1] = { hash };
-  return rb_class_new_instance(1, args, msgclass);
-}
-
 int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
   MessageHeader* self;
-  char *name;
+  VALUE method_str;
+  char* name;
   const upb_fielddef* f;
   TypedData_Get_Struct(_self, MessageHeader, &Message_type, self);
 
-  if (TYPE(key) == T_STRING) {
-    name = RSTRING_PTR(key);
-  } else if (TYPE(key) == T_SYMBOL) {
-    name = RSTRING_PTR(rb_id2str(SYM2ID(key)));
-  } else {
+  if (!SYMBOL_P(key)) {
     rb_raise(rb_eArgError,
-             "Expected string or symbols as hash keys when initializing proto from hash.");
+             "Expected symbols as hash keys in initialization map.");
   }
 
+  method_str = rb_id2str(SYM2ID(key));
+  name = RSTRING_PTR(method_str);
   f = upb_msgdef_ntofz(self->descriptor->msgdef, name);
   if (f == NULL) {
     rb_raise(rb_eArgError,
@@ -274,18 +216,9 @@
     }
     ary = layout_get(self->descriptor->layout, Message_data(self), f);
     for (int i = 0; i < RARRAY_LEN(val); i++) {
-      VALUE entry = rb_ary_entry(val, i);
-      if (TYPE(entry) == T_HASH && upb_fielddef_issubmsg(f)) {
-        entry = create_submsg_from_hash(f, entry);
-      }
-
-      RepeatedField_push(ary, entry);
+      RepeatedField_push(ary, rb_ary_entry(val, i));
     }
   } else {
-    if (TYPE(val) == T_HASH && upb_fielddef_issubmsg(f)) {
-      val = create_submsg_from_hash(f, val);
-    }
-
     layout_set(self->descriptor->layout, Message_data(self), f, val);
   }
   return 0;
@@ -372,9 +305,6 @@
 VALUE Message_eq(VALUE _self, VALUE _other) {
   MessageHeader* self;
   MessageHeader* other;
-  if (TYPE(_self) != TYPE(_other)) {
-    return Qfalse;
-  }
   TypedData_Get_Struct(_self, MessageHeader, &Message_type, self);
   TypedData_Get_Struct(_other, MessageHeader, &Message_type, other);
 
@@ -422,12 +352,7 @@
   return str;
 }
 
-/*
- * call-seq:
- *     Message.to_h => {}
- *
- * Returns the message as a Ruby Hash object, with keys as symbols.
- */
+
 VALUE Message_to_h(VALUE _self) {
   MessageHeader* self;
   VALUE hash;
@@ -443,20 +368,8 @@
     VALUE msg_value = layout_get(self->descriptor->layout, Message_data(self),
                                  field);
     VALUE msg_key   = ID2SYM(rb_intern(upb_fielddef_name(field)));
-    if (upb_fielddef_ismap(field)) {
-      msg_value = Map_to_h(msg_value);
-    } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
+    if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
       msg_value = RepeatedField_to_ary(msg_value);
-
-      if (upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
-        for (int i = 0; i < RARRAY_LEN(msg_value); i++) {
-          VALUE elem = rb_ary_entry(msg_value, i);
-          rb_ary_store(msg_value, i, Message_to_h(elem));
-        }
-      }
-    } else if (msg_value != Qnil &&
-               upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
-      msg_value = Message_to_h(msg_value);
     }
     rb_hash_aset(hash, msg_key, msg_value);
   }
@@ -546,8 +459,6 @@
 
   rb_define_method(klass, "method_missing",
                    Message_method_missing, -1);
-  rb_define_method(klass, "respond_to_missing?",
-                   Message_respond_to_missing, -1);
   rb_define_method(klass, "initialize", Message_initialize, -1);
   rb_define_method(klass, "dup", Message_dup, 0);
   // Also define #clone so that we don't inherit Object#clone.
diff --git a/ruby/ext/google/protobuf_c/protobuf.c b/ruby/ext/google/protobuf_c/protobuf.c
index db69642..7cde4ae 100644
--- a/ruby/ext/google/protobuf_c/protobuf.c
+++ b/ruby/ext/google/protobuf_c/protobuf.c
@@ -103,8 +103,6 @@
   cError = rb_const_get(protobuf, rb_intern("Error"));
   cParseError = rb_const_get(protobuf, rb_intern("ParseError"));
 
-  rb_define_singleton_method(protobuf, "discard_unknown",
-                             Google_Protobuf_discard_unknown, 1);
   rb_define_singleton_method(protobuf, "deep_copy",
                              Google_Protobuf_deep_copy, 1);
 
@@ -112,6 +110,6 @@
   kRubyStringASCIIEncoding = rb_usascii_encoding();
   kRubyString8bitEncoding = rb_ascii8bit_encoding();
 
-  rb_gc_register_address(&upb_def_to_ruby_obj_map);
   upb_def_to_ruby_obj_map = rb_hash_new();
+  rb_gc_register_address(&upb_def_to_ruby_obj_map);
 }
diff --git a/ruby/ext/google/protobuf_c/protobuf.h b/ruby/ext/google/protobuf_c/protobuf.h
index 5266aa8..2834c89 100644
--- a/ruby/ext/google/protobuf_c/protobuf.h
+++ b/ruby/ext/google/protobuf_c/protobuf.h
@@ -116,6 +116,10 @@
   const upb_handlers* pb_serialize_handlers;
   const upb_handlers* json_serialize_handlers;
   const upb_handlers* json_serialize_handlers_preserve;
+  // Handlers hold type class references for sub-message fields directly in some
+  // cases. We need to keep these rooted because they might otherwise be
+  // collected.
+  VALUE typeclass_references;
 };
 
 struct FieldDescriptor {
@@ -276,7 +280,6 @@
 VALUE Builder_alloc(VALUE klass);
 void Builder_register(VALUE module);
 Builder* ruby_to_Builder(VALUE value);
-VALUE Builder_initialize(VALUE _self);
 VALUE Builder_add_message(VALUE _self, VALUE name);
 VALUE Builder_add_enum(VALUE _self, VALUE name);
 VALUE Builder_finalize_to_pool(VALUE _self, VALUE pool_rb);
@@ -310,7 +313,7 @@
 void native_slot_deep_copy(upb_fieldtype_t type, void* to, void* from);
 bool native_slot_eq(upb_fieldtype_t type, void* mem1, void* mem2);
 
-VALUE native_slot_encode_and_freeze_string(upb_fieldtype_t type, VALUE value);
+void native_slot_validate_string_encoding(upb_fieldtype_t type, VALUE value);
 void native_slot_check_int_range_precision(upb_fieldtype_t type, VALUE value);
 
 extern rb_encoding* kRubyStringUtf8Encoding;
@@ -363,7 +366,6 @@
 VALUE RepeatedField_each(VALUE _self);
 VALUE RepeatedField_index(int argc, VALUE* argv, VALUE _self);
 void* RepeatedField_index_native(VALUE _self, int index);
-int RepeatedField_size(VALUE _self);
 VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val);
 void RepeatedField_reserve(RepeatedField* self, int new_size);
 VALUE RepeatedField_push(VALUE _self, VALUE val);
@@ -392,7 +394,6 @@
   upb_fieldtype_t key_type;
   upb_fieldtype_t value_type;
   VALUE value_type_class;
-  VALUE parse_frame;
   upb_strtable table;
 } Map;
 
@@ -401,7 +402,6 @@
 VALUE Map_alloc(VALUE klass);
 VALUE Map_init(int argc, VALUE* argv, VALUE self);
 void Map_register(VALUE module);
-VALUE Map_set_frame(VALUE self, VALUE val);
 
 extern const rb_data_type_t Map_type;
 extern VALUE cMap;
@@ -421,7 +421,6 @@
 VALUE Map_deep_copy(VALUE _self);
 VALUE Map_eq(VALUE _self, VALUE _other);
 VALUE Map_hash(VALUE _self);
-VALUE Map_to_h(VALUE _self);
 VALUE Map_inspect(VALUE _self);
 VALUE Map_merge(VALUE _self, VALUE hashmap);
 VALUE Map_merge_into_self(VALUE _self, VALUE hashmap);
@@ -475,20 +474,8 @@
 // Message class creation.
 // -----------------------------------------------------------------------------
 
-// This should probably be factored into a common upb component.
-
-typedef struct {
-  upb_byteshandler handler;
-  upb_bytessink sink;
-  char *ptr;
-  size_t len, size;
-} stringsink;
-
-void stringsink_uninit(stringsink *sink);
-
 struct MessageHeader {
-  Descriptor* descriptor;      // kept alive by self.class.descriptor reference.
-  stringsink* unknown_fields;  // store unknown fields in decoding.
+  Descriptor* descriptor;  // kept alive by self.class.descriptor reference.
   // Data comes after this.
 };
 
@@ -506,7 +493,6 @@
 VALUE Message_eq(VALUE _self, VALUE _other);
 VALUE Message_hash(VALUE _self);
 VALUE Message_inspect(VALUE _self);
-VALUE Message_to_h(VALUE _self);
 VALUE Message_index(VALUE _self, VALUE field_name);
 VALUE Message_index_set(VALUE _self, VALUE field_name, VALUE value);
 VALUE Message_descriptor(VALUE klass);
@@ -515,7 +501,6 @@
 VALUE Message_decode_json(VALUE klass, VALUE data);
 VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass);
 
-VALUE Google_Protobuf_discard_unknown(VALUE self, VALUE msg_rb);
 VALUE Google_Protobuf_deep_copy(VALUE self, VALUE obj);
 
 VALUE build_module_from_enumdesc(EnumDescriptor* enumdef);
diff --git a/ruby/ext/google/protobuf_c/repeated_field.c b/ruby/ext/google/protobuf_c/repeated_field.c
index c6620ee..83afbc9 100644
--- a/ruby/ext/google/protobuf_c/repeated_field.c
+++ b/ruby/ext/google/protobuf_c/repeated_field.c
@@ -244,11 +244,6 @@
   return RepeatedField_memoryat(self, index, element_size);
 }
 
-int RepeatedField_size(VALUE _self) {
-  RepeatedField* self = ruby_to_RepeatedField(_self);
-  return self->size;
-}
-
 /*
  * Private ruby method, used by RepeatedField.pop
  */
@@ -447,8 +442,9 @@
  */
 VALUE RepeatedField_hash(VALUE _self) {
   RepeatedField* self = ruby_to_RepeatedField(_self);
-  st_index_t h = rb_hash_start(0);
-  VALUE hash_sym = rb_intern("hash");
+
+  VALUE hash = LL2NUM(0);
+
   upb_fieldtype_t field_type = self->field_type;
   VALUE field_type_class = self->field_type_class;
   size_t elem_size = native_slot_size(field_type);
@@ -456,11 +452,12 @@
   for (int i = 0; i < self->size; i++, off += elem_size) {
     void* mem = ((uint8_t *)self->elements) + off;
     VALUE elem = native_slot_get(field_type, field_type_class, mem);
-    h = rb_hash_uint(h, NUM2LONG(rb_funcall(elem, hash_sym, 0)));
+    hash = rb_funcall(hash, rb_intern("<<"), 1, INT2NUM(2));
+    hash = rb_funcall(hash, rb_intern("^"), 1,
+                      rb_funcall(elem, rb_intern("hash"), 0));
   }
-  h = rb_hash_end(h);
 
-  return INT2FIX(h);
+  return hash;
 }
 
 /*
@@ -626,8 +623,8 @@
   VALUE klass = rb_define_class_under(
       module, "RepeatedField", rb_cObject);
   rb_define_alloc_func(klass, RepeatedField_alloc);
-  rb_gc_register_address(&cRepeatedField);
   cRepeatedField = klass;
+  rb_gc_register_address(&cRepeatedField);
 
   rb_define_method(klass, "initialize",
                    RepeatedField_init, -1);
diff --git a/ruby/ext/google/protobuf_c/storage.c b/ruby/ext/google/protobuf_c/storage.c
index 24064df..b1f65f4 100644
--- a/ruby/ext/google/protobuf_c/storage.c
+++ b/ruby/ext/google/protobuf_c/storage.c
@@ -57,37 +57,6 @@
   }
 }
 
-static VALUE value_from_default(const upb_fielddef *field) {
-  switch (upb_fielddef_type(field)) {
-    case UPB_TYPE_FLOAT:   return DBL2NUM(upb_fielddef_defaultfloat(field));
-    case UPB_TYPE_DOUBLE:  return DBL2NUM(upb_fielddef_defaultdouble(field));
-    case UPB_TYPE_BOOL:
-      return upb_fielddef_defaultbool(field) ? Qtrue : Qfalse;
-    case UPB_TYPE_MESSAGE: return Qnil;
-    case UPB_TYPE_ENUM: {
-      const upb_enumdef *enumdef = upb_fielddef_enumsubdef(field);
-      int32_t num = upb_fielddef_defaultint32(field);
-      const char *label = upb_enumdef_iton(enumdef, num);
-      if (label) {
-        return ID2SYM(rb_intern(label));
-      } else {
-        return INT2NUM(num);
-      }
-    }
-    case UPB_TYPE_INT32:   return INT2NUM(upb_fielddef_defaultint32(field));
-    case UPB_TYPE_INT64:   return LL2NUM(upb_fielddef_defaultint64(field));;
-    case UPB_TYPE_UINT32:  return UINT2NUM(upb_fielddef_defaultuint32(field));
-    case UPB_TYPE_UINT64:  return ULL2NUM(upb_fielddef_defaultuint64(field));
-    case UPB_TYPE_STRING:
-    case UPB_TYPE_BYTES: {
-      size_t size;
-      const char *str = upb_fielddef_defaultstr(field, &size);
-      return rb_str_new(str, size);
-    }
-    default: return Qnil;
-  }
-}
-
 static bool is_ruby_num(VALUE value) {
   return (TYPE(value) == T_FLOAT ||
           TYPE(value) == T_FIXNUM ||
@@ -117,24 +86,25 @@
   }
 }
 
-VALUE native_slot_encode_and_freeze_string(upb_fieldtype_t type, VALUE value) {
-  rb_encoding* desired_encoding = (type == UPB_TYPE_STRING) ?
-      kRubyStringUtf8Encoding : kRubyString8bitEncoding;
-  VALUE desired_encoding_value = rb_enc_from_encoding(desired_encoding);
-
-  // Note: this will not duplicate underlying string data unless necessary.
-  value = rb_str_encode(value, desired_encoding_value, 0, Qnil);
-
-  if (type == UPB_TYPE_STRING &&
-      rb_enc_str_coderange(value) == ENC_CODERANGE_BROKEN) {
-    rb_raise(rb_eEncodingError, "String is invalid UTF-8");
+void native_slot_validate_string_encoding(upb_fieldtype_t type, VALUE value) {
+  bool bad_encoding = false;
+  rb_encoding* string_encoding = rb_enc_from_index(ENCODING_GET(value));
+  if (type == UPB_TYPE_STRING) {
+    bad_encoding =
+        string_encoding != kRubyStringUtf8Encoding &&
+        string_encoding != kRubyStringASCIIEncoding;
+  } else {
+    bad_encoding =
+        string_encoding != kRubyString8bitEncoding;
   }
-
-  // Ensure the data remains valid.  Since we called #encode a moment ago,
-  // this does not freeze the string the user assigned.
-  rb_obj_freeze(value);
-
-  return value;
+  // Check that encoding is UTF-8 or ASCII (for string fields) or ASCII-8BIT
+  // (for bytes fields).
+  if (bad_encoding) {
+    rb_raise(rb_eTypeError, "Encoding for '%s' fields must be %s (was %s)",
+             (type == UPB_TYPE_STRING) ? "string" : "bytes",
+             (type == UPB_TYPE_STRING) ? "UTF-8 or ASCII" : "ASCII-8BIT",
+             rb_enc_name(string_encoding));
+  }
 }
 
 void native_slot_set(upb_fieldtype_t type, VALUE type_class,
@@ -176,21 +146,12 @@
       break;
     }
     case UPB_TYPE_STRING:
-      if (CLASS_OF(value) == rb_cSymbol) {
-        value = rb_funcall(value, rb_intern("to_s"), 0, NULL);
-      } else if (CLASS_OF(value) != rb_cString) {
-        rb_raise(rb_eTypeError, "Invalid argument for string field.");
-      }
-
-      DEREF(memory, VALUE) = native_slot_encode_and_freeze_string(type, value);
-      break;
-
     case UPB_TYPE_BYTES: {
       if (CLASS_OF(value) != rb_cString) {
         rb_raise(rb_eTypeError, "Invalid argument for string field.");
       }
-
-      DEREF(memory, VALUE) = native_slot_encode_and_freeze_string(type, value);
+      native_slot_validate_string_encoding(type, value);
+      DEREF(memory, VALUE) = value;
       break;
     }
     case UPB_TYPE_MESSAGE: {
@@ -206,9 +167,7 @@
     }
     case UPB_TYPE_ENUM: {
       int32_t int_val = 0;
-      if (TYPE(value) == T_STRING) {
-        value = rb_funcall(value, rb_intern("to_sym"), 0, NULL);
-      } else if (!is_ruby_num(value) && TYPE(value) != T_SYMBOL) {
+      if (!is_ruby_num(value) && TYPE(value) != T_SYMBOL) {
         rb_raise(rb_eTypeError,
                  "Expected number or symbol type for enum field.");
       }
@@ -578,7 +537,7 @@
 
   if (upb_fielddef_containingoneof(field)) {
     if (*oneof_case != upb_fielddef_number(field)) {
-      return value_from_default(field);
+      return Qnil;
     }
     return native_slot_get(upb_fielddef_type(field),
                            field_type_class(field),
diff --git a/ruby/ext/google/protobuf_c/upb.c b/ruby/ext/google/protobuf_c/upb.c
index c02a5ce..74a2a1d 100644
--- a/ruby/ext/google/protobuf_c/upb.c
+++ b/ruby/ext/google/protobuf_c/upb.c
@@ -2,585 +2,6 @@
 #include "upb.h"
 
 
-/* Maps descriptor type -> upb field type.  */
-static const uint8_t upb_desctype_to_fieldtype[] = {
-  UPB_WIRE_TYPE_END_GROUP,  /* ENDGROUP */
-  UPB_TYPE_DOUBLE,          /* DOUBLE */
-  UPB_TYPE_FLOAT,           /* FLOAT */
-  UPB_TYPE_INT64,           /* INT64 */
-  UPB_TYPE_UINT64,          /* UINT64 */
-  UPB_TYPE_INT32,           /* INT32 */
-  UPB_TYPE_UINT64,          /* FIXED64 */
-  UPB_TYPE_UINT32,          /* FIXED32 */
-  UPB_TYPE_BOOL,            /* BOOL */
-  UPB_TYPE_STRING,          /* STRING */
-  UPB_TYPE_MESSAGE,         /* GROUP */
-  UPB_TYPE_MESSAGE,         /* MESSAGE */
-  UPB_TYPE_BYTES,           /* BYTES */
-  UPB_TYPE_UINT32,          /* UINT32 */
-  UPB_TYPE_ENUM,            /* ENUM */
-  UPB_TYPE_INT32,           /* SFIXED32 */
-  UPB_TYPE_INT64,           /* SFIXED64 */
-  UPB_TYPE_INT32,           /* SINT32 */
-  UPB_TYPE_INT64,           /* SINT64 */
-};
-
-/* Data pertaining to the parse. */
-typedef struct {
-  upb_env *env;
-  /* Current decoding pointer.  Points to the beginning of a field until we
-   * have finished decoding the whole field. */
-  const char *ptr;
-} upb_decstate;
-
-/* Data pertaining to a single message frame. */
-typedef struct {
-  const char *limit;
-  int32_t group_number;  /* 0 if we are not parsing a group. */
-
-  /* These members are unset for an unknown group frame. */
-  char *msg;
-  const upb_msglayout_msginit_v1 *m;
-} upb_decframe;
-
-#define CHK(x) if (!(x)) { return false; }
-
-static bool upb_skip_unknowngroup(upb_decstate *d, int field_number,
-                                  const char *limit);
-static bool upb_decode_message(upb_decstate *d, const char *limit,
-                               int group_number, char *msg,
-                               const upb_msglayout_msginit_v1 *l);
-
-static bool upb_decode_varint(const char **ptr, const char *limit,
-                              uint64_t *val) {
-  uint8_t byte;
-  int bitpos = 0;
-  const char *p = *ptr;
-  *val = 0;
-
-  do {
-    CHK(bitpos < 70 && p < limit);
-    byte = *p;
-    *val |= (uint64_t)(byte & 0x7F) << bitpos;
-    p++;
-    bitpos += 7;
-  } while (byte & 0x80);
-
-  *ptr = p;
-  return true;
-}
-
-static bool upb_decode_varint32(const char **ptr, const char *limit,
-                                uint32_t *val) {
-  uint64_t u64;
-  CHK(upb_decode_varint(ptr, limit, &u64) && u64 <= UINT32_MAX);
-  *val = u64;
-  return true;
-}
-
-static bool upb_decode_64bit(const char **ptr, const char *limit,
-                             uint64_t *val) {
-  CHK(limit - *ptr >= 8);
-  memcpy(val, *ptr, 8);
-  *ptr += 8;
-  return true;
-}
-
-static bool upb_decode_32bit(const char **ptr, const char *limit,
-                             uint32_t *val) {
-  CHK(limit - *ptr >= 4);
-  memcpy(val, *ptr, 4);
-  *ptr += 4;
-  return true;
-}
-
-static bool upb_decode_tag(const char **ptr, const char *limit,
-                           int *field_number, int *wire_type) {
-  uint32_t tag = 0;
-  CHK(upb_decode_varint32(ptr, limit, &tag));
-  *field_number = tag >> 3;
-  *wire_type = tag & 7;
-  return true;
-}
-
-static int32_t upb_zzdecode_32(uint32_t n) {
-  return (n >> 1) ^ -(int32_t)(n & 1);
-}
-
-static int64_t upb_zzdecode_64(uint64_t n) {
-  return (n >> 1) ^ -(int64_t)(n & 1);
-}
-
-static bool upb_decode_string(const char **ptr, const char *limit,
-                              upb_stringview *val) {
-  uint32_t len;
-
-  CHK(upb_decode_varint32(ptr, limit, &len) &&
-      len < INT32_MAX &&
-      limit - *ptr >= (int32_t)len);
-
-  *val = upb_stringview_make(*ptr, len);
-  *ptr += len;
-  return true;
-}
-
-static void upb_set32(void *msg, size_t ofs, uint32_t val) {
-  memcpy((char*)msg + ofs, &val, sizeof(val));
-}
-
-static bool upb_append_unknown(upb_decstate *d, upb_decframe *frame,
-                               const char *start) {
-  UPB_UNUSED(d);
-  UPB_UNUSED(frame);
-  UPB_UNUSED(start);
-  return true;
-}
-
-static bool upb_skip_unknownfielddata(upb_decstate *d, upb_decframe *frame,
-                                      int field_number, int wire_type) {
-  switch (wire_type) {
-    case UPB_WIRE_TYPE_VARINT: {
-      uint64_t val;
-      return upb_decode_varint(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_32BIT: {
-      uint32_t val;
-      return upb_decode_32bit(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_64BIT: {
-      uint64_t val;
-      return upb_decode_64bit(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_DELIMITED: {
-      upb_stringview val;
-      return upb_decode_string(&d->ptr, frame->limit, &val);
-    }
-    case UPB_WIRE_TYPE_START_GROUP:
-      return upb_skip_unknowngroup(d, field_number, frame->limit);
-    case UPB_WIRE_TYPE_END_GROUP:
-      CHK(field_number == frame->group_number);
-      frame->limit = d->ptr;
-      return true;
-  }
-  return false;
-}
-
-static bool upb_array_grow(upb_array *arr, size_t elements) {
-  size_t needed = arr->len + elements;
-  size_t new_size = UPB_MAX(arr->size, 8);
-  size_t new_bytes;
-  size_t old_bytes;
-  void *new_data;
-
-  while (new_size < needed) {
-    new_size *= 2;
-  }
-
-  old_bytes = arr->len * arr->element_size;
-  new_bytes = new_size * arr->element_size;
-  new_data = upb_realloc(arr->alloc, arr->data, old_bytes, new_bytes);
-  CHK(new_data);
-
-  arr->data = new_data;
-  arr->size = new_size;
-  return true;
-}
-
-static void *upb_array_reserve(upb_array *arr, size_t elements) {
-  if (arr->size - arr->len < elements) {
-    CHK(upb_array_grow(arr, elements));
-  }
-  return (char*)arr->data + (arr->len * arr->element_size);
-}
-
-static void *upb_array_add(upb_array *arr, size_t elements) {
-  void *ret = upb_array_reserve(arr, elements);
-  arr->len += elements;
-  return ret;
-}
-
-static upb_array *upb_getarr(upb_decframe *frame,
-                             const upb_msglayout_fieldinit_v1 *field) {
-  UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
-  return *(upb_array**)&frame->msg[field->offset];
-}
-
-static upb_array *upb_getorcreatearr(upb_decstate *d,
-                                     upb_decframe *frame,
-                                     const upb_msglayout_fieldinit_v1 *field) {
-  upb_array *arr = upb_getarr(frame, field);
-
-  if (!arr) {
-    arr = upb_env_malloc(d->env, sizeof(*arr));
-    if (!arr) {
-      return NULL;
-    }
-    upb_array_init(arr, upb_desctype_to_fieldtype[field->type],
-                   upb_arena_alloc(upb_env_arena(d->env)));
-    *(upb_array**)&frame->msg[field->offset] = arr;
-  }
-
-  return arr;
-}
-
-static void upb_sethasbit(upb_decframe *frame,
-                          const upb_msglayout_fieldinit_v1 *field) {
-  UPB_ASSERT(field->hasbit != UPB_NO_HASBIT);
-  frame->msg[field->hasbit / 8] |= (1 << (field->hasbit % 8));
-}
-
-static void upb_setoneofcase(upb_decframe *frame,
-                             const upb_msglayout_fieldinit_v1 *field) {
-  UPB_ASSERT(field->oneof_index != UPB_NOT_IN_ONEOF);
-  upb_set32(frame->msg, frame->m->oneofs[field->oneof_index].case_offset,
-            field->number);
-}
-
-static char *upb_decode_prepareslot(upb_decstate *d,
-                                    upb_decframe *frame,
-                                    const upb_msglayout_fieldinit_v1 *field) {
-  char *field_mem = frame->msg + field->offset;
-  upb_array *arr;
-
-  if (field->label == UPB_LABEL_REPEATED) {
-    arr = upb_getorcreatearr(d, frame, field);
-    field_mem = upb_array_reserve(arr, 1);
-  }
-
-  return field_mem;
-}
-
-static void upb_decode_setpresent(upb_decframe *frame,
-                                  const upb_msglayout_fieldinit_v1 *field) {
-  if (field->label == UPB_LABEL_REPEATED) {
-   upb_array *arr = upb_getarr(frame, field);
-   UPB_ASSERT(arr->len < arr->size);
-   arr->len++;
-  } else if (field->oneof_index != UPB_NOT_IN_ONEOF) {
-    upb_setoneofcase(frame, field);
-  } else if (field->hasbit != UPB_NO_HASBIT) {
-    upb_sethasbit(frame, field);
-  }
-}
-
-static bool upb_decode_submsg(upb_decstate *d,
-                              upb_decframe *frame,
-                              const char *limit,
-                              const upb_msglayout_fieldinit_v1 *field,
-                              int group_number) {
-  char *submsg = *(void**)&frame->msg[field->offset];
-  const upb_msglayout_msginit_v1 *subm;
-
-  UPB_ASSERT(field->submsg_index != UPB_NO_SUBMSG);
-  subm = frame->m->submsgs[field->submsg_index];
-  UPB_ASSERT(subm);
-
-  if (!submsg) {
-    submsg = upb_env_malloc(d->env, upb_msg_sizeof((upb_msglayout *)subm));
-    CHK(submsg);
-    submsg = upb_msg_init(
-        submsg, (upb_msglayout*)subm, upb_arena_alloc(upb_env_arena(d->env)));
-    *(void**)&frame->msg[field->offset] = submsg;
-  }
-
-  upb_decode_message(d, limit, group_number, submsg, subm);
-
-  return true;
-}
-
-static bool upb_decode_varintfield(upb_decstate *d, upb_decframe *frame,
-                                   const char *field_start,
-                                   const upb_msglayout_fieldinit_v1 *field) {
-  uint64_t val;
-  void *field_mem;
-
-  field_mem = upb_decode_prepareslot(d, frame, field);
-  CHK(field_mem);
-  CHK(upb_decode_varint(&d->ptr, frame->limit, &val));
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      memcpy(field_mem, &val, sizeof(val));
-      break;
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM: {
-      uint32_t val32 = val;
-      memcpy(field_mem, &val32, sizeof(val32));
-      break;
-    }
-    case UPB_DESCRIPTOR_TYPE_BOOL: {
-      bool valbool = val != 0;
-      memcpy(field_mem, &valbool, sizeof(valbool));
-      break;
-    }
-    case UPB_DESCRIPTOR_TYPE_SINT32: {
-      int32_t decoded = upb_zzdecode_32(val);
-      memcpy(field_mem, &decoded, sizeof(decoded));
-      break;
-    }
-    case UPB_DESCRIPTOR_TYPE_SINT64: {
-      int64_t decoded = upb_zzdecode_64(val);
-      memcpy(field_mem, &decoded, sizeof(decoded));
-      break;
-    }
-    default:
-      return upb_append_unknown(d, frame, field_start);
-  }
-
-  upb_decode_setpresent(frame, field);
-  return true;
-}
-
-static bool upb_decode_64bitfield(upb_decstate *d, upb_decframe *frame,
-                                  const char *field_start,
-                                  const upb_msglayout_fieldinit_v1 *field) {
-  void *field_mem;
-  uint64_t val;
-
-  field_mem = upb_decode_prepareslot(d, frame, field);
-  CHK(field_mem);
-  CHK(upb_decode_64bit(&d->ptr, frame->limit, &val));
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-      memcpy(field_mem, &val, sizeof(val));
-      break;
-    default:
-      return upb_append_unknown(d, frame, field_start);
-  }
-
-  upb_decode_setpresent(frame, field);
-  return true;
-}
-
-static bool upb_decode_32bitfield(upb_decstate *d, upb_decframe *frame,
-                                  const char *field_start,
-                                  const upb_msglayout_fieldinit_v1 *field) {
-  void *field_mem;
-  uint32_t val;
-
-  field_mem = upb_decode_prepareslot(d, frame, field);
-  CHK(field_mem);
-  CHK(upb_decode_32bit(&d->ptr, frame->limit, &val));
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      memcpy(field_mem, &val, sizeof(val));
-      break;
-    default:
-      return upb_append_unknown(d, frame, field_start);
-  }
-
-  upb_decode_setpresent(frame, field);
-  return true;
-}
-
-static bool upb_decode_fixedpacked(upb_array *arr, upb_stringview data,
-                                   int elem_size) {
-  int elements = data.size / elem_size;
-  void *field_mem;
-
-  CHK((size_t)(elements * elem_size) == data.size);
-  field_mem = upb_array_add(arr, elements);
-  CHK(field_mem);
-  memcpy(field_mem, data.data, data.size);
-  return true;
-}
-
-static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
-                               const char *field_start,
-                               const upb_msglayout_fieldinit_v1 *field,
-                               upb_stringview val) {
-  upb_array *arr = upb_getorcreatearr(d, frame, field);
-
-#define VARINT_CASE(ctype, decode) { \
-  const char *ptr = val.data; \
-  const char *limit = ptr + val.size; \
-  while (ptr < limit) { \
-    uint64_t val; \
-    void *field_mem; \
-    ctype decoded; \
-    CHK(upb_decode_varint(&ptr, limit, &val)); \
-    decoded = (decode)(val); \
-    field_mem = upb_array_add(arr, 1); \
-    CHK(field_mem); \
-    memcpy(field_mem, &decoded, sizeof(ctype)); \
-  } \
-  return true; \
-}
-
-  switch ((upb_descriptortype_t)field->type) {
-    case UPB_DESCRIPTOR_TYPE_STRING:
-    case UPB_DESCRIPTOR_TYPE_BYTES: {
-      void *field_mem = upb_array_add(arr, 1);
-      CHK(field_mem);
-      memcpy(field_mem, &val, sizeof(val));
-      return true;
-    }
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      return upb_decode_fixedpacked(arr, val, sizeof(int32_t));
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-      return upb_decode_fixedpacked(arr, val, sizeof(int64_t));
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM:
-      /* TODO: proto2 enum field that isn't in the enum. */
-      VARINT_CASE(uint32_t, uint32_t);
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      VARINT_CASE(uint64_t, uint64_t);
-    case UPB_DESCRIPTOR_TYPE_BOOL:
-      VARINT_CASE(bool, bool);
-    case UPB_DESCRIPTOR_TYPE_SINT32:
-      VARINT_CASE(int32_t, upb_zzdecode_32);
-    case UPB_DESCRIPTOR_TYPE_SINT64:
-      VARINT_CASE(int64_t, upb_zzdecode_64);
-    case UPB_DESCRIPTOR_TYPE_MESSAGE:
-      CHK(val.size <= (size_t)(frame->limit - val.data));
-      return upb_decode_submsg(d, frame, val.data + val.size, field, 0);
-    case UPB_DESCRIPTOR_TYPE_GROUP:
-      return upb_append_unknown(d, frame, field_start);
-  }
-#undef VARINT_CASE
-  UPB_UNREACHABLE();
-}
-
-static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
-                                      const char *field_start,
-                                      const upb_msglayout_fieldinit_v1 *field) {
-  upb_stringview val;
-
-  CHK(upb_decode_string(&d->ptr, frame->limit, &val));
-
-  if (field->label == UPB_LABEL_REPEATED) {
-    return upb_decode_toarray(d, frame, field_start, field, val);
-  } else {
-    switch ((upb_descriptortype_t)field->type) {
-      case UPB_DESCRIPTOR_TYPE_STRING:
-      case UPB_DESCRIPTOR_TYPE_BYTES: {
-        void *field_mem = upb_decode_prepareslot(d, frame, field);
-        CHK(field_mem);
-        memcpy(field_mem, &val, sizeof(val));
-        break;
-      }
-      case UPB_DESCRIPTOR_TYPE_MESSAGE:
-        CHK(val.size <= (size_t)(frame->limit - val.data));
-        CHK(upb_decode_submsg(d, frame, val.data + val.size, field, 0));
-        break;
-      default:
-        /* TODO(haberman): should we accept the last element of a packed? */
-        return upb_append_unknown(d, frame, field_start);
-    }
-    upb_decode_setpresent(frame, field);
-    return true;
-  }
-}
-
-static const upb_msglayout_fieldinit_v1 *upb_find_field(
-    const upb_msglayout_msginit_v1 *l, uint32_t field_number) {
-  /* Lots of optimization opportunities here. */
-  int i;
-  for (i = 0; i < l->field_count; i++) {
-    if (l->fields[i].number == field_number) {
-      return &l->fields[i];
-    }
-  }
-
-  return NULL;  /* Unknown field. */
-}
-
-static bool upb_decode_field(upb_decstate *d, upb_decframe *frame) {
-  int field_number;
-  int wire_type;
-  const char *field_start = d->ptr;
-  const upb_msglayout_fieldinit_v1 *field;
-
-  CHK(upb_decode_tag(&d->ptr, frame->limit, &field_number, &wire_type));
-  field = upb_find_field(frame->m, field_number);
-
-  if (field) {
-    switch (wire_type) {
-      case UPB_WIRE_TYPE_VARINT:
-        return upb_decode_varintfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_32BIT:
-        return upb_decode_32bitfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_64BIT:
-        return upb_decode_64bitfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_DELIMITED:
-        return upb_decode_delimitedfield(d, frame, field_start, field);
-      case UPB_WIRE_TYPE_START_GROUP:
-        CHK(field->type == UPB_DESCRIPTOR_TYPE_GROUP);
-        return upb_decode_submsg(d, frame, frame->limit, field, field_number);
-      case UPB_WIRE_TYPE_END_GROUP:
-        CHK(frame->group_number == field_number)
-        frame->limit = d->ptr;
-        return true;
-      default:
-        return false;
-    }
-  } else {
-    CHK(field_number != 0);
-    return upb_skip_unknownfielddata(d, frame, field_number, wire_type);
-  }
-}
-
-static bool upb_skip_unknowngroup(upb_decstate *d, int field_number,
-                                  const char *limit) {
-  upb_decframe frame;
-  frame.msg = NULL;
-  frame.m = NULL;
-  frame.group_number = field_number;
-  frame.limit = limit;
-
-  while (d->ptr < frame.limit) {
-    int wire_type;
-    int field_number;
-
-    CHK(upb_decode_tag(&d->ptr, frame.limit, &field_number, &wire_type));
-    CHK(upb_skip_unknownfielddata(d, &frame, field_number, wire_type));
-  }
-
-  return true;
-}
-
-static bool upb_decode_message(upb_decstate *d, const char *limit,
-                               int group_number, char *msg,
-                               const upb_msglayout_msginit_v1 *l) {
-  upb_decframe frame;
-  frame.group_number = group_number;
-  frame.limit = limit;
-  frame.msg = msg;
-  frame.m = l;
-
-  while (d->ptr < frame.limit) {
-    CHK(upb_decode_field(d, &frame));
-  }
-
-  return true;
-}
-
-bool upb_decode(upb_stringview buf, void *msg,
-                const upb_msglayout_msginit_v1 *l, upb_env *env) {
-  upb_decstate state;
-  state.ptr = buf.data;
-  state.env = env;
-
-  return upb_decode_message(&state, buf.data + buf.size, 0, msg, l);
-}
-
-#undef CHK
-
-
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
@@ -682,7 +103,7 @@
 }
 
 bool upb_def_setfullname(upb_def *def, const char *fullname, upb_status *s) {
-  UPB_ASSERT(!upb_def_isfrozen(def));
+  assert(!upb_def_isfrozen(def));
   if (!upb_isident(fullname, strlen(fullname), true, s)) {
     return false;
   }
@@ -700,6 +121,21 @@
 
 const upb_filedef *upb_def_file(const upb_def *d) { return d->file; }
 
+upb_def *upb_def_dup(const upb_def *def, const void *o) {
+  switch (def->type) {
+    case UPB_DEF_MSG:
+      return upb_msgdef_upcast_mutable(
+          upb_msgdef_dup(upb_downcast_msgdef(def), o));
+    case UPB_DEF_FIELD:
+      return upb_fielddef_upcast_mutable(
+          upb_fielddef_dup(upb_downcast_fielddef(def), o));
+    case UPB_DEF_ENUM:
+      return upb_enumdef_upcast_mutable(
+          upb_enumdef_dup(upb_downcast_enumdef(def), o));
+    default: assert(false); return NULL;
+  }
+}
+
 static bool upb_def_init(upb_def *def, upb_deftype_t type,
                          const struct upb_refcounted_vtbl *vtbl,
                          const void *owner) {
@@ -767,14 +203,14 @@
     bool has_default_number = upb_fielddef_enumhasdefaultint32(f);
 
     /* Previously verified by upb_validate_enumdef(). */
-    UPB_ASSERT(upb_enumdef_numvals(upb_fielddef_enumsubdef(f)) > 0);
+    assert(upb_enumdef_numvals(upb_fielddef_enumsubdef(f)) > 0);
 
     /* We've already validated that we have an associated enumdef and that it
      * has at least one member, so at least one of these should be true.
      * Because if the user didn't set anything, we'll pick up the enum's
      * default, but if the user *did* set something we should at least pick up
      * the one they set (int32 or string). */
-    UPB_ASSERT(has_default_name || has_default_number);
+    assert(has_default_name || has_default_number);
 
     if (!has_default_name) {
       upb_status_seterrf(s,
@@ -830,7 +266,7 @@
 uint32_t field_rank(const upb_fielddef *f) {
   uint32_t ret = upb_fielddef_number(f);
   const uint32_t high_bit = 1 << 30;
-  UPB_ASSERT(ret < high_bit);
+  assert(ret < high_bit);
   if (!upb_fielddef_issubmsg(f))
     ret |= high_bit;
   return ret;
@@ -846,7 +282,6 @@
   /* Sort fields.  upb internally relies on UPB_TYPE_MESSAGE fields having the
    * lowest indexes, but we do not publicly guarantee this. */
   upb_msg_field_iter j;
-  upb_msg_oneof_iter k;
   int i;
   uint32_t selector;
   int n = upb_msgdef_numfields(m);
@@ -869,7 +304,7 @@
       !upb_msg_field_done(&j);
       upb_msg_field_next(&j), i++) {
     upb_fielddef *f = upb_msg_iter_field(&j);
-    UPB_ASSERT(f->msg.def == m);
+    assert(f->msg.def == m);
     if (!upb_validate_field(f, s)) {
       upb_gfree(fields);
       return false;
@@ -905,7 +340,6 @@
     v = upb_value_bool(true);
     upb_inttable_insert(&t, UPB_STARTMSG_SELECTOR, v);
     upb_inttable_insert(&t, UPB_ENDMSG_SELECTOR, v);
-    upb_inttable_insert(&t, UPB_UNKNOWN_SELECTOR, v);
     for(upb_msg_field_begin(&j, m);
         !upb_msg_field_done(&j);
         upb_msg_field_next(&j)) {
@@ -932,13 +366,6 @@
 #undef TRY
 #endif
 
-  for(upb_msg_oneof_begin(&k, m), i = 0;
-      !upb_msg_oneof_done(&k);
-      upb_msg_oneof_next(&k), i++) {
-    upb_oneofdef *o = upb_msg_iter_oneof(&k);
-    o->index = i;
-  }
-
   upb_gfree(fields);
   return true;
 }
@@ -957,14 +384,13 @@
     } else if (def->type == UPB_DEF_FIELD) {
       upb_status_seterrmsg(s, "standalone fielddefs can not be frozen");
       goto err;
+    } else if (def->type == UPB_DEF_ENUM) {
+      if (!upb_validate_enumdef(upb_dyncast_enumdef(def), s)) {
+        goto err;
+      }
     } else {
       /* Set now to detect transitive closure in the second pass. */
       def->came_from_user = true;
-
-      if (def->type == UPB_DEF_ENUM &&
-          !upb_validate_enumdef(upb_dyncast_enumdef(def), s)) {
-        goto err;
-      }
     }
   }
 
@@ -991,7 +417,7 @@
     upb_def *def = defs[i];
     def->came_from_user = false;
   }
-  UPB_ASSERT(!(s && upb_ok(s)));
+  assert(!(s && upb_ok(s)));
   return false;
 }
 
@@ -1012,16 +438,7 @@
 
 /* upb_enumdef ****************************************************************/
 
-static void visitenum(const upb_refcounted *r, upb_refcounted_visit *visit,
-                      void *closure) {
-  const upb_enumdef *e = (const upb_enumdef*)r;
-  const upb_def *def = upb_enumdef_upcast(e);
-  if (upb_def_file(def)) {
-    visit(r, upb_filedef_upcast(upb_def_file(def)), closure);
-  }
-}
-
-static void freeenum(upb_refcounted *r) {
+static void upb_enumdef_free(upb_refcounted *r) {
   upb_enumdef *e = (upb_enumdef*)r;
   upb_inttable_iter i;
   upb_inttable_begin(&i, &e->iton);
@@ -1035,7 +452,7 @@
   upb_gfree(e);
 }
 
-const struct upb_refcounted_vtbl upb_enumdef_vtbl = {&visitenum, &freeenum};
+const struct upb_refcounted_vtbl upb_enumdef_vtbl = {NULL, &upb_enumdef_free};
 
 upb_enumdef *upb_enumdef_new(const void *owner) {
   upb_enumdef *e = upb_gmalloc(sizeof(*e));
@@ -1057,6 +474,21 @@
   return NULL;
 }
 
+upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner) {
+  upb_enum_iter i;
+  upb_enumdef *new_e = upb_enumdef_new(owner);
+  if (!new_e) return NULL;
+  for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) {
+    bool success = upb_enumdef_addval(
+        new_e, upb_enum_iter_name(&i),upb_enum_iter_number(&i), NULL);
+    if (!success) {
+      upb_enumdef_unref(new_e, owner);
+      return NULL;
+    }
+  }
+  return new_e;
+}
+
 bool upb_enumdef_freeze(upb_enumdef *e, upb_status *status) {
   upb_def *d = upb_enumdef_upcast_mutable(e);
   return upb_def_freeze(&d, 1, status);
@@ -1104,19 +536,19 @@
 
   if (upb_enumdef_numvals(e) == 1) {
     bool ok = upb_enumdef_setdefault(e, num, NULL);
-    UPB_ASSERT(ok);
+    UPB_ASSERT_VAR(ok, ok);
   }
 
   return true;
 }
 
 int32_t upb_enumdef_default(const upb_enumdef *e) {
-  UPB_ASSERT(upb_enumdef_iton(e, e->defaultval));
+  assert(upb_enumdef_iton(e, e->defaultval));
   return e->defaultval;
 }
 
 bool upb_enumdef_setdefault(upb_enumdef *e, int32_t val, upb_status *s) {
-  UPB_ASSERT(!upb_enumdef_isfrozen(e));
+  assert(!upb_enumdef_isfrozen(e));
   if (!upb_enumdef_iton(e, val)) {
     upb_status_seterrf(s, "number '%d' is not in the enum.", val);
     return false;
@@ -1178,7 +610,6 @@
 static void visitfield(const upb_refcounted *r, upb_refcounted_visit *visit,
                        void *closure) {
   const upb_fielddef *f = (const upb_fielddef*)r;
-  const upb_def *def = upb_fielddef_upcast(f);
   if (upb_fielddef_containingtype(f)) {
     visit(r, upb_msgdef_upcast2(upb_fielddef_containingtype(f)), closure);
   }
@@ -1188,9 +619,6 @@
   if (upb_fielddef_subdef(f)) {
     visit(r, upb_def_upcast(upb_fielddef_subdef(f)), closure);
   }
-  if (upb_def_file(def)) {
-    visit(r, upb_filedef_upcast(upb_def_file(def)), closure);
-  }
 }
 
 static void freefield(upb_refcounted *r) {
@@ -1204,7 +632,7 @@
 
 static const char *enumdefaultstr(const upb_fielddef *f) {
   const upb_enumdef *e;
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   e = upb_fielddef_enumsubdef(f);
   if (f->default_is_string && f->defaultval.bytes) {
     /* Default was explicitly set as a string. */
@@ -1221,7 +649,7 @@
       /* Default is completely unset; pull enumdef default. */
       if (upb_enumdef_numvals(e) > 0) {
         const char *name = upb_enumdef_iton(e, upb_enumdef_default(e));
-        UPB_ASSERT(name);
+        assert(name);
         return name;
       }
     }
@@ -1231,7 +659,7 @@
 
 static bool enumdefaultint32(const upb_fielddef *f, int32_t *val) {
   const upb_enumdef *e;
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   e = upb_fielddef_enumsubdef(f);
   if (!f->default_is_string) {
     /* Default was explicitly set as an integer. */
@@ -1291,12 +719,48 @@
   return f;
 }
 
+upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner) {
+  const char *srcname;
+  upb_fielddef *newf = upb_fielddef_new(owner);
+  if (!newf) return NULL;
+  upb_fielddef_settype(newf, upb_fielddef_type(f));
+  upb_fielddef_setlabel(newf, upb_fielddef_label(f));
+  upb_fielddef_setnumber(newf, upb_fielddef_number(f), NULL);
+  upb_fielddef_setname(newf, upb_fielddef_name(f), NULL);
+  if (f->default_is_string && f->defaultval.bytes) {
+    str_t *s = f->defaultval.bytes;
+    upb_fielddef_setdefaultstr(newf, s->str, s->len, NULL);
+  } else {
+    newf->default_is_string = f->default_is_string;
+    newf->defaultval = f->defaultval;
+  }
+
+  if (f->subdef_is_symbolic) {
+    srcname = f->sub.name;  /* Might be NULL. */
+  } else {
+    srcname = f->sub.def ? upb_def_fullname(f->sub.def) : NULL;
+  }
+  if (srcname) {
+    char *newname = upb_gmalloc(strlen(f->sub.def->fullname) + 2);
+    if (!newname) {
+      upb_fielddef_unref(newf, owner);
+      return NULL;
+    }
+    strcpy(newname, ".");
+    strcat(newname, f->sub.def->fullname);
+    upb_fielddef_setsubdefname(newf, newname, NULL);
+    upb_gfree(newname);
+  }
+
+  return newf;
+}
+
 bool upb_fielddef_typeisset(const upb_fielddef *f) {
   return f->type_is_set_;
 }
 
 upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f) {
-  UPB_ASSERT(f->type_is_set_);
+  assert(f->type_is_set_);
   return f->type_;
 }
 
@@ -1398,7 +862,7 @@
 bool upb_fielddef_setcontainingtypename(upb_fielddef *f, const char *name,
                                         upb_status *s) {
   char *name_copy;
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   if (upb_fielddef_containingtype(f)) {
     upb_status_seterrmsg(s, "field has already been added to a message.");
     return false;
@@ -1429,7 +893,7 @@
 static void chkdefaulttype(const upb_fielddef *f, upb_fieldtype_t type) {
   UPB_UNUSED(f);
   UPB_UNUSED(type);
-  UPB_ASSERT(f->type_is_set_ && upb_fielddef_type(f) == type);
+  assert(f->type_is_set_ && upb_fielddef_type(f) == type);
 }
 
 int64_t upb_fielddef_defaultint64(const upb_fielddef *f) {
@@ -1441,7 +905,7 @@
   if (f->type_is_set_ && upb_fielddef_type(f) == UPB_TYPE_ENUM) {
     int32_t val;
     bool ok = enumdefaultint32(f, &val);
-    UPB_ASSERT(ok);
+    UPB_ASSERT_VAR(ok, ok);
     return val;
   } else {
     chkdefaulttype(f, UPB_TYPE_INT32);
@@ -1475,14 +939,14 @@
 }
 
 const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len) {
-  UPB_ASSERT(f->type_is_set_);
-  UPB_ASSERT(upb_fielddef_type(f) == UPB_TYPE_STRING ||
+  assert(f->type_is_set_);
+  assert(upb_fielddef_type(f) == UPB_TYPE_STRING ||
          upb_fielddef_type(f) == UPB_TYPE_BYTES ||
          upb_fielddef_type(f) == UPB_TYPE_ENUM);
 
   if (upb_fielddef_type(f) == UPB_TYPE_ENUM) {
     const char *ret = enumdefaultstr(f);
-    UPB_ASSERT(ret);
+    assert(ret);
     /* Enum defaults can't have embedded NULLs. */
     if (len) *len = strlen(ret);
     return ret;
@@ -1564,8 +1028,8 @@
 }
 
 void upb_fielddef_settype(upb_fielddef *f, upb_fieldtype_t type) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_checktype(type));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_checktype(type));
   upb_fielddef_uninit_default(f);
   f->type_ = type;
   f->type_is_set_ = true;
@@ -1573,7 +1037,7 @@
 }
 
 void upb_fielddef_setdescriptortype(upb_fielddef *f, int type) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   switch (type) {
     case UPB_DESCRIPTOR_TYPE_DOUBLE:
       upb_fielddef_settype(f, UPB_TYPE_DOUBLE);
@@ -1615,7 +1079,7 @@
     case UPB_DESCRIPTOR_TYPE_ENUM:
       upb_fielddef_settype(f, UPB_TYPE_ENUM);
       break;
-    default: UPB_ASSERT(false);
+    default: assert(false);
   }
 
   if (type == UPB_DESCRIPTOR_TYPE_FIXED64 ||
@@ -1673,34 +1137,34 @@
 }
 
 void upb_fielddef_setisextension(upb_fielddef *f, bool is_extension) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->is_extension_ = is_extension;
 }
 
 void upb_fielddef_setlazy(upb_fielddef *f, bool lazy) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->lazy_ = lazy;
 }
 
 void upb_fielddef_setpacked(upb_fielddef *f, bool packed) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->packed_ = packed;
 }
 
 void upb_fielddef_setlabel(upb_fielddef *f, upb_label_t label) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_checklabel(label));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_checklabel(label));
   f->label_ = label;
 }
 
 void upb_fielddef_setintfmt(upb_fielddef *f, upb_intfmt_t fmt) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_checkintfmt(fmt));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_checkintfmt(fmt));
   f->intfmt = fmt;
 }
 
 void upb_fielddef_settagdelim(upb_fielddef *f, bool tag_delim) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   f->tagdelim = tag_delim;
   f->tagdelim = tag_delim;
 }
@@ -1708,12 +1172,12 @@
 static bool checksetdefault(upb_fielddef *f, upb_fieldtype_t type) {
   if (!f->type_is_set_ || upb_fielddef_isfrozen(f) ||
       upb_fielddef_type(f) != type) {
-    UPB_ASSERT(false);
+    assert(false);
     return false;
   }
   if (f->default_is_string) {
     str_t *s = f->defaultval.bytes;
-    UPB_ASSERT(s || type == UPB_TYPE_ENUM);
+    assert(s || type == UPB_TYPE_ENUM);
     if (s) freestr(s);
   }
   f->default_is_string = false;
@@ -1761,16 +1225,16 @@
 bool upb_fielddef_setdefaultstr(upb_fielddef *f, const void *str, size_t len,
                                 upb_status *s) {
   str_t *str2;
-  UPB_ASSERT(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE_ENUM);
+  assert(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE_ENUM);
   if (f->type_ == UPB_TYPE_ENUM && !upb_isident(str, len, false, s))
     return false;
 
   if (f->default_is_string) {
     str_t *s = f->defaultval.bytes;
-    UPB_ASSERT(s || f->type_ == UPB_TYPE_ENUM);
+    assert(s || f->type_ == UPB_TYPE_ENUM);
     if (s) freestr(s);
   } else {
-    UPB_ASSERT(f->type_ == UPB_TYPE_ENUM);
+    assert(f->type_ == UPB_TYPE_ENUM);
   }
 
   str2 = newstr(str, len);
@@ -1781,18 +1245,18 @@
 
 void upb_fielddef_setdefaultcstr(upb_fielddef *f, const char *str,
                                  upb_status *s) {
-  UPB_ASSERT(f->type_is_set_);
+  assert(f->type_is_set_);
   upb_fielddef_setdefaultstr(f, str, str ? strlen(str) : 0, s);
 }
 
 bool upb_fielddef_enumhasdefaultint32(const upb_fielddef *f) {
   int32_t val;
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   return enumdefaultint32(f, &val);
 }
 
 bool upb_fielddef_enumhasdefaultstr(const upb_fielddef *f) {
-  UPB_ASSERT(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   return enumdefaultstr(f) != NULL;
 }
 
@@ -1822,8 +1286,8 @@
 
 bool upb_fielddef_setsubdef(upb_fielddef *f, const upb_def *subdef,
                             upb_status *s) {
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
-  UPB_ASSERT(upb_fielddef_hassubdef(f));
+  assert(!upb_fielddef_isfrozen(f));
+  assert(upb_fielddef_hassubdef(f));
   if (subdef && !upb_subdef_typecheck(f, subdef, s)) return false;
   release_subdef(f);
   f->sub.def = subdef;
@@ -1845,7 +1309,7 @@
 bool upb_fielddef_setsubdefname(upb_fielddef *f, const char *name,
                                 upb_status *s) {
   char *name_copy;
-  UPB_ASSERT(!upb_fielddef_isfrozen(f));
+  assert(!upb_fielddef_isfrozen(f));
   if (!upb_fielddef_hassubdef(f)) {
     upb_status_seterrmsg(s, "field type does not accept a subdef");
     return false;
@@ -1919,7 +1383,6 @@
                      void *closure) {
   upb_msg_oneof_iter o;
   const upb_msgdef *m = (const upb_msgdef*)r;
-  const upb_def *def = upb_msgdef_upcast(m);
   upb_msg_field_iter i;
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
@@ -1933,9 +1396,6 @@
     upb_oneofdef *f = upb_msg_iter_oneof(&o);
     visit(r, upb_oneofdef_upcast(f), closure);
   }
-  if (upb_def_file(def)) {
-    visit(r, upb_filedef_upcast(upb_def_file(def)), closure);
-  }
 }
 
 static void freemsg(upb_refcounted *r) {
@@ -1970,6 +1430,42 @@
   return NULL;
 }
 
+upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner) {
+  bool ok;
+  upb_msg_field_iter i;
+  upb_msg_oneof_iter o;
+
+  upb_msgdef *newm = upb_msgdef_new(owner);
+  if (!newm) return NULL;
+  ok = upb_def_setfullname(upb_msgdef_upcast_mutable(newm),
+                           upb_def_fullname(upb_msgdef_upcast(m)),
+                           NULL);
+  newm->map_entry = m->map_entry;
+  newm->syntax = m->syntax;
+  UPB_ASSERT_VAR(ok, ok);
+  for(upb_msg_field_begin(&i, m);
+      !upb_msg_field_done(&i);
+      upb_msg_field_next(&i)) {
+    upb_fielddef *f = upb_fielddef_dup(upb_msg_iter_field(&i), &f);
+    /* Fields in oneofs are dup'd below. */
+    if (upb_fielddef_containingoneof(f)) continue;
+    if (!f || !upb_msgdef_addfield(newm, f, &f, NULL)) {
+      upb_msgdef_unref(newm, owner);
+      return NULL;
+    }
+  }
+  for(upb_msg_oneof_begin(&o, m);
+      !upb_msg_oneof_done(&o);
+      upb_msg_oneof_next(&o)) {
+    upb_oneofdef *f = upb_oneofdef_dup(upb_msg_iter_oneof(&o), &f);
+    if (!f || !upb_msgdef_addoneof(newm, f, &f, NULL)) {
+      upb_msgdef_unref(newm, owner);
+      return NULL;
+    }
+  }
+  return newm;
+}
+
 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status) {
   upb_def *d = upb_msgdef_upcast_mutable(m);
   return upb_def_freeze(&d, 1, status);
@@ -2048,7 +1544,6 @@
    * This method is idempotent. Check if |f| is already part of this msgdef and
    * return immediately if so. */
   if (upb_fielddef_containingtype(f) == m) {
-    if (ref_donor) upb_fielddef_unref(f, ref_donor);
     return true;
   }
 
@@ -2148,7 +1643,7 @@
 
   *o = upb_trygetoneof(upb_value_getptr(val));
   *f = upb_trygetfield(upb_value_getptr(val));
-  UPB_ASSERT((*o != NULL) ^ (*f != NULL));  /* Exactly one of the two should be set. */
+  assert((*o != NULL) ^ (*f != NULL));  /* Exactly one of the two should be set. */
   return true;
 }
 
@@ -2163,7 +1658,7 @@
 }
 
 void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry) {
-  UPB_ASSERT(!upb_msgdef_isfrozen(m));
+  assert(!upb_msgdef_isfrozen(m));
   m->map_entry = map_entry;
 }
 
@@ -2270,10 +1765,27 @@
   return NULL;
 }
 
+upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner) {
+  bool ok;
+  upb_oneof_iter i;
+  upb_oneofdef *newo = upb_oneofdef_new(owner);
+  if (!newo) return NULL;
+  ok = upb_oneofdef_setname(newo, upb_oneofdef_name(o), NULL);
+  UPB_ASSERT_VAR(ok, ok);
+  for (upb_oneof_begin(&i, o); !upb_oneof_done(&i); upb_oneof_next(&i)) {
+    upb_fielddef *f = upb_fielddef_dup(upb_oneof_iter_field(&i), &f);
+    if (!f || !upb_oneofdef_addfield(newo, f, &f, NULL)) {
+      upb_oneofdef_unref(newo, owner);
+      return NULL;
+    }
+  }
+  return newo;
+}
+
 const char *upb_oneofdef_name(const upb_oneofdef *o) { return o->name; }
 
 bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s) {
-  UPB_ASSERT(!upb_oneofdef_isfrozen(o));
+  assert(!upb_oneofdef_isfrozen(o));
   if (upb_oneofdef_containingtype(o)) {
     upb_status_seterrmsg(s, "oneof already added to a message");
     return false;
@@ -2302,15 +1814,11 @@
   return upb_strtable_count(&o->ntof);
 }
 
-uint32_t upb_oneofdef_index(const upb_oneofdef *o) {
-  return o->index;
-}
-
 bool upb_oneofdef_addfield(upb_oneofdef *o, upb_fielddef *f,
                            const void *ref_donor,
                            upb_status *s) {
-  UPB_ASSERT(!upb_oneofdef_isfrozen(o));
-  UPB_ASSERT(!o->parent || !upb_msgdef_isfrozen(o->parent));
+  assert(!upb_oneofdef_isfrozen(o));
+  assert(!o->parent || !upb_msgdef_isfrozen(o->parent));
 
   /* This method is idempotent. Check if |f| is already part of this oneofdef
    * and return immediately if so. */
@@ -2438,8 +1946,6 @@
   upb_inttable_uninit(&f->deps);
   upb_gfree((void*)f->name);
   upb_gfree((void*)f->package);
-  upb_gfree((void*)f->phpprefix);
-  upb_gfree((void*)f->phpnamespace);
   upb_gfree(f);
 }
 
@@ -2454,8 +1960,6 @@
 
   f->package = NULL;
   f->name = NULL;
-  f->phpprefix = NULL;
-  f->phpnamespace = NULL;
   f->syntax = UPB_SYNTAX_PROTO2;
 
   if (!upb_refcounted_init(upb_filedef_upcast_mutable(f), &upb_filedef_vtbl,
@@ -2490,14 +1994,6 @@
   return f->package;
 }
 
-const char *upb_filedef_phpprefix(const upb_filedef *f) {
-  return f->phpprefix;
-}
-
-const char *upb_filedef_phpnamespace(const upb_filedef *f) {
-  return f->phpnamespace;
-}
-
 upb_syntax_t upb_filedef_syntax(const upb_filedef *f) {
   return f->syntax;
 }
@@ -2554,30 +2050,6 @@
   return true;
 }
 
-bool upb_filedef_setphpprefix(upb_filedef *f, const char *phpprefix,
-                              upb_status *s) {
-  phpprefix = upb_gstrdup(phpprefix);
-  if (!phpprefix) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-  upb_gfree((void*)f->phpprefix);
-  f->phpprefix = phpprefix;
-  return true;
-}
-
-bool upb_filedef_setphpnamespace(upb_filedef *f, const char *phpnamespace,
-                                 upb_status *s) {
-  phpnamespace = upb_gstrdup(phpnamespace);
-  if (!phpnamespace) {
-    upb_upberr_setoom(s);
-    return false;
-  }
-  upb_gfree((void*)f->phpnamespace);
-  f->phpnamespace = phpnamespace;
-  return true;
-}
-
 bool upb_filedef_setsyntax(upb_filedef *f, upb_syntax_t syntax,
                            upb_status *s) {
   UPB_UNUSED(s);
@@ -2616,7 +2088,6 @@
   if (upb_inttable_push(&f->defs, upb_value_constptr(def))) {
     def->file = f;
     upb_ref2(def, f);
-    upb_ref2(f, def);
     if (ref_donor) upb_def_unref(def, ref_donor);
     if (def->type == UPB_DEF_MSG) {
       upb_downcast_msgdef_mutable(def)->syntax = f->syntax;
@@ -2637,702 +2108,9 @@
     return false;
   }
 }
-
-void upb_symtab_free(upb_symtab *s) {
-  upb_strtable_iter i;
-  upb_strtable_begin(&i, &s->symtab);
-  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-    const upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
-    upb_def_unref(def, s);
-  }
-  upb_strtable_uninit(&s->symtab);
-  upb_gfree(s);
-}
-
-upb_symtab *upb_symtab_new() {
-  upb_symtab *s = upb_gmalloc(sizeof(*s));
-  if (!s) {
-    return NULL;
-  }
-
-  upb_strtable_init(&s->symtab, UPB_CTYPE_PTR);
-  return s;
-}
-
-const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym) {
-  upb_value v;
-  upb_def *ret = upb_strtable_lookup(&s->symtab, sym, &v) ?
-      upb_value_getptr(v) : NULL;
-  return ret;
-}
-
-const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
-  upb_value v;
-  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
-      upb_value_getptr(v) : NULL;
-  return def ? upb_dyncast_msgdef(def) : NULL;
-}
-
-const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
-  upb_value v;
-  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
-      upb_value_getptr(v) : NULL;
-  return def ? upb_dyncast_enumdef(def) : NULL;
-}
-
-/* Given a symbol and the base symbol inside which it is defined, find the
- * symbol's definition in t. */
-static upb_def *upb_resolvename(const upb_strtable *t,
-                                const char *base, const char *sym) {
-  if(strlen(sym) == 0) return NULL;
-  if(sym[0] == '.') {
-    /* Symbols starting with '.' are absolute, so we do a single lookup.
-     * Slice to omit the leading '.' */
-    upb_value v;
-    return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;
-  } else {
-    /* Remove components from base until we find an entry or run out.
-     * TODO: This branch is totally broken, but currently not used. */
-    (void)base;
-    UPB_ASSERT(false);
-    return NULL;
-  }
-}
-
-const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
-                                  const char *sym) {
-  upb_def *ret = upb_resolvename(&s->symtab, base, sym);
-  return ret;
-}
-
-/* TODO(haberman): we need a lot more testing of error conditions. */
-static bool symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
-                       void *ref_donor, upb_refcounted *freeze_also,
-                       upb_status *status) {
-  size_t i;
-  size_t add_n;
-  size_t freeze_n;
-  upb_strtable_iter iter;
-  upb_refcounted **add_objs = NULL;
-  upb_def **add_defs = NULL;
-  size_t add_objs_size;
-  upb_strtable addtab;
-
-  if (n == 0 && !freeze_also) {
-    return true;
-  }
-
-  if (!upb_strtable_init(&addtab, UPB_CTYPE_PTR)) {
-    upb_status_seterrmsg(status, "out of memory");
-    return false;
-  }
-
-  /* Add new defs to our "add" set. */
-  for (i = 0; i < n; i++) {
-    upb_def *def = defs[i];
-    const char *fullname;
-    upb_fielddef *f;
-
-    if (upb_def_isfrozen(def)) {
-      upb_status_seterrmsg(status, "added defs must be mutable");
-      goto err;
-    }
-    UPB_ASSERT(!upb_def_isfrozen(def));
-    fullname = upb_def_fullname(def);
-    if (!fullname) {
-      upb_status_seterrmsg(
-          status, "Anonymous defs cannot be added to a symtab");
-      goto err;
-    }
-
-    f = upb_dyncast_fielddef_mutable(def);
-
-    if (f) {
-      if (!upb_fielddef_containingtypename(f)) {
-        upb_status_seterrmsg(status,
-                             "Standalone fielddefs must have a containing type "
-                             "(extendee) name set");
-        goto err;
-      }
-    } else {
-      if (upb_strtable_lookup(&addtab, fullname, NULL)) {
-        upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);
-        goto err;
-      }
-      if (upb_strtable_lookup(&s->symtab, fullname, NULL)) {
-        upb_status_seterrf(status, "Symtab already has a def named '%s'",
-                           fullname);
-        goto err;
-      }
-      if (!upb_strtable_insert(&addtab, fullname, upb_value_ptr(def)))
-        goto oom_err;
-      upb_def_donateref(def, ref_donor, s);
-    }
-
-    if (upb_dyncast_fielddef_mutable(def)) {
-      /* TODO(haberman): allow adding extensions attached to files. */
-      upb_status_seterrf(status, "Can't add extensions to symtab.\n");
-      goto err;
-    }
-  }
-
-  /* Now using the table, resolve symbolic references for subdefs. */
-  upb_strtable_begin(&iter, &addtab);
-  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
-    const char *base;
-    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
-    upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
-    upb_msg_field_iter j;
-
-    if (!m) continue;
-    /* Type names are resolved relative to the message in which they appear. */
-    base = upb_msgdef_fullname(m);
-
-    for(upb_msg_field_begin(&j, m);
-        !upb_msg_field_done(&j);
-        upb_msg_field_next(&j)) {
-      upb_fielddef *f = upb_msg_iter_field(&j);
-      const char *name = upb_fielddef_subdefname(f);
-      if (name && !upb_fielddef_subdef(f)) {
-        /* Try the lookup in the current set of to-be-added defs first. If not
-         * there, try existing defs. */
-        upb_def *subdef = upb_resolvename(&addtab, base, name);
-        if (subdef == NULL) {
-          subdef = upb_resolvename(&s->symtab, base, name);
-        }
-        if (subdef == NULL) {
-          upb_status_seterrf(
-              status, "couldn't resolve name '%s' in message '%s'", name, base);
-          goto err;
-        } else if (!upb_fielddef_setsubdef(f, subdef, status)) {
-          goto err;
-        }
-      }
-    }
-  }
-
-  /* We need an array of the defs in addtab, for passing to
-   * upb_refcounted_freeze(). */
-  add_objs_size = upb_strtable_count(&addtab);
-  if (freeze_also) {
-    add_objs_size++;
-  }
-
-  add_defs = upb_gmalloc(sizeof(void*) * add_objs_size);
-  if (add_defs == NULL) goto oom_err;
-  upb_strtable_begin(&iter, &addtab);
-  for (add_n = 0; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
-    add_defs[add_n++] = upb_value_getptr(upb_strtable_iter_value(&iter));
-  }
-
-  /* Validate defs. */
-  if (!_upb_def_validate(add_defs, add_n, status)) {
-    goto err;
-  }
-
-  /* Cheat a little and give the array a new type.
-   * This is probably undefined behavior, but this code will be deleted soon. */
-  add_objs = (upb_refcounted**)add_defs;
-
-  freeze_n = add_n;
-  if (freeze_also) {
-    add_objs[freeze_n++] = freeze_also;
-  }
-
-  if (!upb_refcounted_freeze(add_objs, freeze_n, status,
-                             UPB_MAX_MESSAGE_DEPTH * 2)) {
-    goto err;
-  }
-
-  /* This must be delayed until all errors have been detected, since error
-   * recovery code uses this table to cleanup defs. */
-  upb_strtable_uninit(&addtab);
-
-  /* TODO(haberman) we don't properly handle errors after this point (like
-   * OOM in upb_strtable_insert() below). */
-  for (i = 0; i < add_n; i++) {
-    upb_def *def = (upb_def*)add_objs[i];
-    const char *name = upb_def_fullname(def);
-    bool success;
-    success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));
-    UPB_ASSERT(success);
-  }
-  upb_gfree(add_defs);
-  return true;
-
-oom_err:
-  upb_status_seterrmsg(status, "out of memory");
-err: {
-    /* We need to donate the refs back. */
-    upb_strtable_begin(&iter, &addtab);
-    for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
-      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
-      upb_def_donateref(def, s, ref_donor);
-    }
-  }
-  upb_strtable_uninit(&addtab);
-  upb_gfree(add_defs);
-  UPB_ASSERT(!upb_ok(status));
-  return false;
-}
-
-bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
-                    void *ref_donor, upb_status *status) {
-  return symtab_add(s, defs, n, ref_donor, NULL, status);
-}
-
-bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status *status) {
-  size_t n;
-  size_t i;
-  upb_def **defs;
-  bool ret;
-
-  n = upb_filedef_defcount(file);
-  if (n == 0) {
-    return true;
-  }
-  defs = upb_gmalloc(sizeof(*defs) * n);
-
-  if (defs == NULL) {
-    upb_status_seterrmsg(status, "Out of memory");
-    return false;
-  }
-
-  for (i = 0; i < n; i++) {
-    defs[i] = upb_filedef_mutabledef(file, i);
-  }
-
-  ret = symtab_add(s, defs, n, NULL, upb_filedef_upcast_mutable(file), status);
-
-  upb_gfree(defs);
-  return ret;
-}
-
-/* Iteration. */
-
-static void advance_to_matching(upb_symtab_iter *iter) {
-  if (iter->type == UPB_DEF_ANY)
-    return;
-
-  while (!upb_strtable_done(&iter->iter) &&
-         iter->type != upb_symtab_iter_def(iter)->type) {
-    upb_strtable_next(&iter->iter);
-  }
-}
-
-void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
-                      upb_deftype_t type) {
-  upb_strtable_begin(&iter->iter, &s->symtab);
-  iter->type = type;
-  advance_to_matching(iter);
-}
-
-void upb_symtab_next(upb_symtab_iter *iter) {
-  upb_strtable_next(&iter->iter);
-  advance_to_matching(iter);
-}
-
-bool upb_symtab_done(const upb_symtab_iter *iter) {
-  return upb_strtable_done(&iter->iter);
-}
-
-const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter) {
-  return upb_value_getptr(upb_strtable_iter_value(&iter->iter));
-}
-/* We encode backwards, to avoid pre-computing lengths (one-pass encode). */
-
-
-#define UPB_PB_VARINT_MAX_LEN 10
-#define CHK(x) do { if (!(x)) { return false; } } while(0)
-
-/* Maps descriptor type -> upb field type.  */
-static const uint8_t upb_desctype_to_fieldtype2[] = {
-  UPB_WIRE_TYPE_END_GROUP,  /* ENDGROUP */
-  UPB_TYPE_DOUBLE,          /* DOUBLE */
-  UPB_TYPE_FLOAT,           /* FLOAT */
-  UPB_TYPE_INT64,           /* INT64 */
-  UPB_TYPE_UINT64,          /* UINT64 */
-  UPB_TYPE_INT32,           /* INT32 */
-  UPB_TYPE_UINT64,          /* FIXED64 */
-  UPB_TYPE_UINT32,          /* FIXED32 */
-  UPB_TYPE_BOOL,            /* BOOL */
-  UPB_TYPE_STRING,          /* STRING */
-  UPB_TYPE_MESSAGE,         /* GROUP */
-  UPB_TYPE_MESSAGE,         /* MESSAGE */
-  UPB_TYPE_BYTES,           /* BYTES */
-  UPB_TYPE_UINT32,          /* UINT32 */
-  UPB_TYPE_ENUM,            /* ENUM */
-  UPB_TYPE_INT32,           /* SFIXED32 */
-  UPB_TYPE_INT64,           /* SFIXED64 */
-  UPB_TYPE_INT32,           /* SINT32 */
-  UPB_TYPE_INT64,           /* SINT64 */
-};
-
-static size_t upb_encode_varint(uint64_t val, char *buf) {
-  size_t i;
-  if (val < 128) { buf[0] = val; return 1; }
-  i = 0;
-  while (val) {
-    uint8_t byte = val & 0x7fU;
-    val >>= 7;
-    if (val) byte |= 0x80U;
-    buf[i++] = byte;
-  }
-  return i;
-}
-
-static uint32_t upb_zzencode_32(int32_t n) { return (n << 1) ^ (n >> 31); }
-static uint64_t upb_zzencode_64(int64_t n) { return (n << 1) ^ (n >> 63); }
-
-typedef struct {
-  upb_env *env;
-  char *buf, *ptr, *limit;
-} upb_encstate;
-
-static size_t upb_roundup_pow2(size_t bytes) {
-  size_t ret = 128;
-  while (ret < bytes) {
-    ret *= 2;
-  }
-  return ret;
-}
-
-static bool upb_encode_growbuffer(upb_encstate *e, size_t bytes) {
-  size_t old_size = e->limit - e->buf;
-  size_t new_size = upb_roundup_pow2(bytes + (e->limit - e->ptr));
-  char *new_buf = upb_env_realloc(e->env, e->buf, old_size, new_size);
-  CHK(new_buf);
-
-  /* We want previous data at the end, realloc() put it at the beginning. */
-  memmove(e->limit - old_size, e->buf, old_size);
-
-  e->ptr = new_buf + new_size - (e->limit - e->ptr);
-  e->limit = new_buf + new_size;
-  e->buf = new_buf;
-  return true;
-}
-
-/* Call to ensure that at least "bytes" bytes are available for writing at
- * e->ptr.  Returns false if the bytes could not be allocated. */
-static bool upb_encode_reserve(upb_encstate *e, size_t bytes) {
-  CHK(UPB_LIKELY((size_t)(e->ptr - e->buf) >= bytes) ||
-      upb_encode_growbuffer(e, bytes));
-
-  e->ptr -= bytes;
-  return true;
-}
-
-/* Writes the given bytes to the buffer, handling reserve/advance. */
-static bool upb_put_bytes(upb_encstate *e, const void *data, size_t len) {
-  CHK(upb_encode_reserve(e, len));
-  memcpy(e->ptr, data, len);
-  return true;
-}
-
-static bool upb_put_fixed64(upb_encstate *e, uint64_t val) {
-  /* TODO(haberman): byte-swap for big endian. */
-  return upb_put_bytes(e, &val, sizeof(uint64_t));
-}
-
-static bool upb_put_fixed32(upb_encstate *e, uint32_t val) {
-  /* TODO(haberman): byte-swap for big endian. */
-  return upb_put_bytes(e, &val, sizeof(uint32_t));
-}
-
-static bool upb_put_varint(upb_encstate *e, uint64_t val) {
-  size_t len;
-  char *start;
-  CHK(upb_encode_reserve(e, UPB_PB_VARINT_MAX_LEN));
-  len = upb_encode_varint(val, e->ptr);
-  start = e->ptr + UPB_PB_VARINT_MAX_LEN - len;
-  memmove(start, e->ptr, len);
-  e->ptr = start;
-  return true;
-}
-
-static bool upb_put_double(upb_encstate *e, double d) {
-  uint64_t u64;
-  UPB_ASSERT(sizeof(double) == sizeof(uint64_t));
-  memcpy(&u64, &d, sizeof(uint64_t));
-  return upb_put_fixed64(e, u64);
-}
-
-static bool upb_put_float(upb_encstate *e, float d) {
-  uint32_t u32;
-  UPB_ASSERT(sizeof(float) == sizeof(uint32_t));
-  memcpy(&u32, &d, sizeof(uint32_t));
-  return upb_put_fixed32(e, u32);
-}
-
-static uint32_t upb_readcase(const char *msg, const upb_msglayout_msginit_v1 *m,
-                             int oneof_index) {
-  uint32_t ret;
-  memcpy(&ret, msg + m->oneofs[oneof_index].case_offset, sizeof(ret));
-  return ret;
-}
-
-static bool upb_readhasbit(const char *msg,
-                           const upb_msglayout_fieldinit_v1 *f) {
-  UPB_ASSERT(f->hasbit != UPB_NO_HASBIT);
-  return msg[f->hasbit / 8] & (1 << (f->hasbit % 8));
-}
-
-static bool upb_put_tag(upb_encstate *e, int field_number, int wire_type) {
-  return upb_put_varint(e, (field_number << 3) | wire_type);
-}
-
-static bool upb_put_fixedarray(upb_encstate *e, const upb_array *arr,
-                               size_t size) {
-  size_t bytes = arr->len * size;
-  return upb_put_bytes(e, arr->data, bytes) && upb_put_varint(e, bytes);
-}
-
-bool upb_encode_message(upb_encstate *e, const char *msg,
-                        const upb_msglayout_msginit_v1 *m,
-                        size_t *size);
-
-static bool upb_encode_array(upb_encstate *e, const char *field_mem,
-                             const upb_msglayout_msginit_v1 *m,
-                             const upb_msglayout_fieldinit_v1 *f) {
-  const upb_array *arr = *(const upb_array**)field_mem;
-
-  if (arr == NULL || arr->len == 0) {
-    return true;
-  }
-
-  UPB_ASSERT(arr->type == upb_desctype_to_fieldtype2[f->type]);
-
-#define VARINT_CASE(ctype, encode) { \
-  ctype *start = arr->data; \
-  ctype *ptr = start + arr->len; \
-  size_t pre_len = e->limit - e->ptr; \
-  do { \
-    ptr--; \
-    CHK(upb_put_varint(e, encode)); \
-  } while (ptr != start); \
-  CHK(upb_put_varint(e, e->limit - e->ptr - pre_len)); \
-} \
-break; \
-do { ; } while(0)
-
-  switch (f->type) {
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-      CHK(upb_put_fixedarray(e, arr, sizeof(double)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-      CHK(upb_put_fixedarray(e, arr, sizeof(float)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-      CHK(upb_put_fixedarray(e, arr, sizeof(uint64_t)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      CHK(upb_put_fixedarray(e, arr, sizeof(uint32_t)));
-      break;
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      VARINT_CASE(uint64_t, *ptr);
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM:
-      VARINT_CASE(uint32_t, *ptr);
-    case UPB_DESCRIPTOR_TYPE_BOOL:
-      VARINT_CASE(bool, *ptr);
-    case UPB_DESCRIPTOR_TYPE_SINT32:
-      VARINT_CASE(int32_t, upb_zzencode_32(*ptr));
-    case UPB_DESCRIPTOR_TYPE_SINT64:
-      VARINT_CASE(int64_t, upb_zzencode_64(*ptr));
-    case UPB_DESCRIPTOR_TYPE_STRING:
-    case UPB_DESCRIPTOR_TYPE_BYTES: {
-      upb_stringview *start = arr->data;
-      upb_stringview *ptr = start + arr->len;
-      do {
-        ptr--;
-        CHK(upb_put_bytes(e, ptr->data, ptr->size) &&
-            upb_put_varint(e, ptr->size) &&
-            upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
-      } while (ptr != start);
-      return true;
-    }
-    case UPB_DESCRIPTOR_TYPE_GROUP: {
-      void **start = arr->data;
-      void **ptr = start + arr->len;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      do {
-        size_t size;
-        ptr--;
-        CHK(upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
-            upb_encode_message(e, *ptr, subm, &size) &&
-            upb_put_tag(e, f->number, UPB_WIRE_TYPE_START_GROUP));
-      } while (ptr != start);
-      return true;
-    }
-    case UPB_DESCRIPTOR_TYPE_MESSAGE: {
-      void **start = arr->data;
-      void **ptr = start + arr->len;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      do {
-        size_t size;
-        ptr--;
-        CHK(upb_encode_message(e, *ptr, subm, &size) &&
-            upb_put_varint(e, size) &&
-            upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
-      } while (ptr != start);
-      return true;
-    }
-  }
-#undef VARINT_CASE
-
-  /* We encode all primitive arrays as packed, regardless of what was specified
-   * in the .proto file.  Could special case 1-sized arrays. */
-  CHK(upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
-  return true;
-}
-
-static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
-                                   const upb_msglayout_msginit_v1 *m,
-                                   const upb_msglayout_fieldinit_v1 *f,
-                                   bool is_proto3) {
-  bool skip_zero_value = is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF;
-
-#define CASE(ctype, type, wire_type, encodeval) do { \
-  ctype val = *(ctype*)field_mem; \
-  if (skip_zero_value && val == 0) { \
-    return true; \
-  } \
-  return upb_put_ ## type(e, encodeval) && \
-      upb_put_tag(e, f->number, wire_type); \
-} while(0)
-
-  switch (f->type) {
-    case UPB_DESCRIPTOR_TYPE_DOUBLE:
-      CASE(double, double, UPB_WIRE_TYPE_64BIT, val);
-    case UPB_DESCRIPTOR_TYPE_FLOAT:
-      CASE(float, float, UPB_WIRE_TYPE_32BIT, val);
-    case UPB_DESCRIPTOR_TYPE_INT64:
-    case UPB_DESCRIPTOR_TYPE_UINT64:
-      CASE(uint64_t, varint, UPB_WIRE_TYPE_VARINT, val);
-    case UPB_DESCRIPTOR_TYPE_UINT32:
-    case UPB_DESCRIPTOR_TYPE_INT32:
-    case UPB_DESCRIPTOR_TYPE_ENUM:
-      CASE(uint32_t, varint, UPB_WIRE_TYPE_VARINT, val);
-    case UPB_DESCRIPTOR_TYPE_SFIXED64:
-    case UPB_DESCRIPTOR_TYPE_FIXED64:
-      CASE(uint64_t, fixed64, UPB_WIRE_TYPE_64BIT, val);
-    case UPB_DESCRIPTOR_TYPE_FIXED32:
-    case UPB_DESCRIPTOR_TYPE_SFIXED32:
-      CASE(uint32_t, fixed32, UPB_WIRE_TYPE_32BIT, val);
-    case UPB_DESCRIPTOR_TYPE_BOOL:
-      CASE(bool, varint, UPB_WIRE_TYPE_VARINT, val);
-    case UPB_DESCRIPTOR_TYPE_SINT32:
-      CASE(int32_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_32(val));
-    case UPB_DESCRIPTOR_TYPE_SINT64:
-      CASE(int64_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_64(val));
-    case UPB_DESCRIPTOR_TYPE_STRING:
-    case UPB_DESCRIPTOR_TYPE_BYTES: {
-      upb_stringview view = *(upb_stringview*)field_mem;
-      if (skip_zero_value && view.size == 0) {
-        return true;
-      }
-      return upb_put_bytes(e, view.data, view.size) &&
-          upb_put_varint(e, view.size) &&
-          upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED);
-    }
-    case UPB_DESCRIPTOR_TYPE_GROUP: {
-      size_t size;
-      void *submsg = *(void**)field_mem;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      if (skip_zero_value && submsg == NULL) {
-        return true;
-      }
-      return upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
-          upb_encode_message(e, submsg, subm, &size) &&
-          upb_put_tag(e, f->number, UPB_WIRE_TYPE_START_GROUP);
-    }
-    case UPB_DESCRIPTOR_TYPE_MESSAGE: {
-      size_t size;
-      void *submsg = *(void**)field_mem;
-      const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
-      if (skip_zero_value && submsg == NULL) {
-        return true;
-      }
-      return upb_encode_message(e, submsg, subm, &size) &&
-          upb_put_varint(e, size) &&
-          upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED);
-    }
-  }
-#undef CASE
-  UPB_UNREACHABLE();
-}
-
-bool upb_encode_hasscalarfield(const char *msg,
-                               const upb_msglayout_msginit_v1 *m,
-                               const upb_msglayout_fieldinit_v1 *f) {
-  if (f->oneof_index != UPB_NOT_IN_ONEOF) {
-    return upb_readcase(msg, m, f->oneof_index) == f->number;
-  } else if (m->is_proto2) {
-    return upb_readhasbit(msg, f);
-  } else {
-    /* For proto3, we'll test for the field being empty later. */
-    return true;
-  }
-}
-
-bool upb_encode_message(upb_encstate* e, const char *msg,
-                        const upb_msglayout_msginit_v1 *m,
-                        size_t *size) {
-  int i;
-  char *buf_end = e->ptr;
-
-  if (msg == NULL) {
-    return true;
-  }
-
-  for (i = m->field_count - 1; i >= 0; i--) {
-    const upb_msglayout_fieldinit_v1 *f = &m->fields[i];
-
-    if (f->label == UPB_LABEL_REPEATED) {
-      CHK(upb_encode_array(e, msg + f->offset, m, f));
-    } else {
-      if (upb_encode_hasscalarfield(msg, m, f)) {
-        CHK(upb_encode_scalarfield(e, msg + f->offset, m, f, !m->is_proto2));
-      }
-    }
-  }
-
-  *size = buf_end - e->ptr;
-  return true;
-}
-
-char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *m,
-                 upb_env *env, size_t *size) {
-  upb_encstate e;
-  e.env = env;
-  e.buf = NULL;
-  e.limit = NULL;
-  e.ptr = NULL;
-
-  if (!upb_encode_message(&e, msg, m, size)) {
-    *size = 0;
-    return NULL;
-  }
-
-  *size = e.limit - e.ptr;
-
-  if (*size == 0) {
-    static char ch;
-    return &ch;
-  } else {
-    UPB_ASSERT(e.ptr);
-    return e.ptr;
-  }
-}
-
-#undef CHK
 /*
 ** TODO(haberman): it's unclear whether a lot of the consistency checks should
-** UPB_ASSERT() or return false.
+** assert() or return false.
 */
 
 
@@ -3442,7 +2220,7 @@
 static int32_t trygetsel(upb_handlers *h, const upb_fielddef *f,
                          upb_handlertype_t type) {
   upb_selector_t sel;
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   if (upb_handlers_msgdef(h) != upb_fielddef_containingtype(f)) {
     upb_status_seterrf(
         &h->status_, "type mismatch: field %s does not belong to message %s",
@@ -3462,7 +2240,7 @@
 static upb_selector_t handlers_getsel(upb_handlers *h, const upb_fielddef *f,
                              upb_handlertype_t type) {
   int32_t sel = trygetsel(h, f, type);
-  UPB_ASSERT(sel >= 0);
+  assert(sel >= 0);
   return sel;
 }
 
@@ -3478,7 +2256,7 @@
   const void *closure_type;
   const void **context_closure_type;
 
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
 
   if (sel < 0) {
     upb_status_seterrmsg(&h->status_,
@@ -3558,7 +2336,7 @@
   const void *ret;
   upb_selector_t sel;
 
-  UPB_ASSERT(type != UPB_HANDLER_STRING);
+  assert(type != UPB_HANDLER_STRING);
   ret = h->top_closure_type;
 
   if (upb_fielddef_isseq(f) &&
@@ -3613,7 +2391,7 @@
   int extra;
   upb_handlers *h;
 
-  UPB_ASSERT(upb_msgdef_isfrozen(md));
+  assert(upb_msgdef_isfrozen(md));
 
   extra = sizeof(upb_handlers_tabent) * (md->selector_count - 1);
   h = upb_calloc(sizeof(*h) + extra);
@@ -3662,18 +2440,18 @@
 
   r = upb_handlers_upcast_mutable(ret);
   ok = upb_refcounted_freeze(&r, 1, NULL, UPB_MAX_HANDLER_DEPTH);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
 
   return ret;
 }
 
 const upb_status *upb_handlers_status(upb_handlers *h) {
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   return &h->status_;
 }
 
 void upb_handlers_clearerr(upb_handlers *h) {
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   upb_status_clear(&h->status_);
 }
 
@@ -3701,12 +2479,6 @@
 
 #undef SETTER
 
-bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func,
-                             upb_handlerattr *attr) {
-  return doset(h, UPB_UNKNOWN_SELECTOR, NULL, UPB_HANDLER_INT32,
-               (upb_func *)func, attr);
-}
-
 bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,
                               upb_handlerattr *attr) {
   return doset(h, UPB_STARTMSG_SELECTOR, NULL, UPB_HANDLER_INT32,
@@ -3715,16 +2487,16 @@
 
 bool upb_handlers_setendmsg(upb_handlers *h, upb_endmsg_handlerfunc *func,
                             upb_handlerattr *attr) {
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
+  assert(!upb_handlers_isfrozen(h));
   return doset(h, UPB_ENDMSG_SELECTOR, NULL, UPB_HANDLER_INT32,
                (upb_func *)func, attr);
 }
 
 bool upb_handlers_setsubhandlers(upb_handlers *h, const upb_fielddef *f,
                                  const upb_handlers *sub) {
-  UPB_ASSERT(sub);
-  UPB_ASSERT(!upb_handlers_isfrozen(h));
-  UPB_ASSERT(upb_fielddef_issubmsg(f));
+  assert(sub);
+  assert(!upb_handlers_isfrozen(h));
+  assert(upb_fielddef_issubmsg(f));
   if (SUBH_F(h, f)) return false;  /* Can't reset. */
   if (upb_msgdef_upcast(upb_handlers_msgdef(sub)) != upb_fielddef_subdef(f)) {
     return false;
@@ -3736,7 +2508,7 @@
 
 const upb_handlers *upb_handlers_getsubhandlers(const upb_handlers *h,
                                                 const upb_fielddef *f) {
-  UPB_ASSERT(upb_fielddef_issubmsg(f));
+  assert(upb_fielddef_issubmsg(f));
   return SUBH_F(h, f);
 }
 
@@ -3762,7 +2534,7 @@
     return false;
   }
   ok = upb_inttable_insertptr(&h->cleanup_, p, upb_value_fptr(func));
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return true;
 }
 
@@ -3863,7 +2635,7 @@
     case UPB_TYPE_FLOAT: return UPB_HANDLER_FLOAT;
     case UPB_TYPE_DOUBLE: return UPB_HANDLER_DOUBLE;
     case UPB_TYPE_BOOL: return UPB_HANDLER_BOOL;
-    default: UPB_ASSERT(false); return -1;  /* Invalid input. */
+    default: assert(false); return -1;  /* Invalid input. */
   }
 }
 
@@ -3926,7 +2698,7 @@
       *s = f->selector_base;
       break;
   }
-  UPB_ASSERT((size_t)*s < upb_fielddef_containingtype(f)->selector_count);
+  assert((size_t)*s < upb_fielddef_containingtype(f)->selector_count);
   return true;
 }
 
@@ -4031,1191 +2803,6 @@
   h->table[UPB_ENDSTR_SELECTOR].attr.handler_data_ = d;
   return true;
 }
-
-
-static bool is_power_of_two(size_t val) {
-  return (val & (val - 1)) == 0;
-}
-
-/* Align up to the given power of 2. */
-static size_t align_up(size_t val, size_t align) {
-  UPB_ASSERT(is_power_of_two(align));
-  return (val + align - 1) & ~(align - 1);
-}
-
-static size_t div_round_up(size_t n, size_t d) {
-  return (n + d - 1) / d;
-}
-
-bool upb_fieldtype_mapkeyok(upb_fieldtype_t type) {
-  return type == UPB_TYPE_BOOL || type == UPB_TYPE_INT32 ||
-         type == UPB_TYPE_UINT32 || type == UPB_TYPE_INT64 ||
-         type == UPB_TYPE_UINT64 || type == UPB_TYPE_STRING;
-}
-
-void *upb_array_pack(const upb_array *arr, void *p, size_t *ofs, size_t size);
-void *upb_map_pack(const upb_map *map, void *p, size_t *ofs, size_t size);
-
-#define PTR_AT(msg, ofs, type) (type*)((char*)msg + ofs)
-#define VOIDPTR_AT(msg, ofs) PTR_AT(msg, ofs, void)
-#define ENCODE_MAX_NESTING 64
-#define CHECK_TRUE(x) if (!(x)) { return false; }
-
-/** upb_msgval ****************************************************************/
-
-#define upb_alignof(t) offsetof(struct { char c; t x; }, x)
-
-/* These functions will generate real memcpy() calls on ARM sadly, because
- * the compiler assumes they might not be aligned. */
-
-static upb_msgval upb_msgval_read(const void *p, size_t ofs,
-                                  uint8_t size) {
-  upb_msgval val;
-  p = (char*)p + ofs;
-  memcpy(&val, p, size);
-  return val;
-}
-
-static void upb_msgval_write(void *p, size_t ofs, upb_msgval val,
-                             uint8_t size) {
-  p = (char*)p + ofs;
-  memcpy(p, &val, size);
-}
-
-static size_t upb_msgval_sizeof(upb_fieldtype_t type) {
-  switch (type) {
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT64:
-      return 8;
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_FLOAT:
-      return 4;
-    case UPB_TYPE_BOOL:
-      return 1;
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE:
-      return sizeof(void*);
-    case UPB_TYPE_STRING:
-      return sizeof(upb_stringview);
-  }
-  UPB_UNREACHABLE();
-}
-
-static uint8_t upb_msg_fieldsize(const upb_msglayout_fieldinit_v1 *field) {
-  if (field->label == UPB_LABEL_REPEATED) {
-    return sizeof(void*);
-  } else {
-    return upb_msgval_sizeof(field->type);
-  }
-}
-
-static uint8_t upb_msg_fielddefsize(const upb_fielddef *f) {
-  if (upb_fielddef_isseq(f)) {
-    return sizeof(void*);
-  } else {
-    return upb_msgval_sizeof(upb_fielddef_type(f));
-  }
-}
-
-/* TODO(haberman): this is broken right now because upb_msgval can contain
- * a char* / size_t pair, which is too big for a upb_value.  To fix this
- * we'll probably need to dynamically allocate a upb_msgval and store a
- * pointer to that in the tables for extensions/maps. */
-static upb_value upb_toval(upb_msgval val) {
-  upb_value ret;
-  UPB_UNUSED(val);
-  memset(&ret, 0, sizeof(upb_value));  /* XXX */
-  return ret;
-}
-
-static upb_msgval upb_msgval_fromval(upb_value val) {
-  upb_msgval ret;
-  UPB_UNUSED(val);
-  memset(&ret, 0, sizeof(upb_msgval));  /* XXX */
-  return ret;
-}
-
-static upb_ctype_t upb_fieldtotabtype(upb_fieldtype_t type) {
-  switch (type) {
-    case UPB_TYPE_FLOAT: return UPB_CTYPE_FLOAT;
-    case UPB_TYPE_DOUBLE: return UPB_CTYPE_DOUBLE;
-    case UPB_TYPE_BOOL: return UPB_CTYPE_BOOL;
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_MESSAGE:
-    case UPB_TYPE_STRING: return UPB_CTYPE_CONSTPTR;
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_INT32: return UPB_CTYPE_INT32;
-    case UPB_TYPE_UINT32: return UPB_CTYPE_UINT32;
-    case UPB_TYPE_INT64: return UPB_CTYPE_INT64;
-    case UPB_TYPE_UINT64: return UPB_CTYPE_UINT64;
-    default: UPB_ASSERT(false); return 0;
-  }
-}
-
-static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
-  switch (upb_fielddef_type(f)) {
-      case UPB_TYPE_FLOAT:
-        return upb_msgval_float(upb_fielddef_defaultfloat(f));
-      case UPB_TYPE_DOUBLE:
-        return upb_msgval_double(upb_fielddef_defaultdouble(f));
-      case UPB_TYPE_BOOL:
-        return upb_msgval_bool(upb_fielddef_defaultbool(f));
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES: {
-        size_t len;
-        const char *ptr = upb_fielddef_defaultstr(f, &len);
-        return upb_msgval_makestr(ptr, len);
-      }
-      case UPB_TYPE_MESSAGE:
-        return upb_msgval_msg(NULL);
-      case UPB_TYPE_ENUM:
-      case UPB_TYPE_INT32:
-        return upb_msgval_int32(upb_fielddef_defaultint32(f));
-      case UPB_TYPE_UINT32:
-        return upb_msgval_uint32(upb_fielddef_defaultuint32(f));
-      case UPB_TYPE_INT64:
-        return upb_msgval_int64(upb_fielddef_defaultint64(f));
-      case UPB_TYPE_UINT64:
-        return upb_msgval_uint64(upb_fielddef_defaultuint64(f));
-      default:
-        UPB_ASSERT(false);
-        return upb_msgval_msg(NULL);
-  }
-}
-
-
-/** upb_msglayout *************************************************************/
-
-struct upb_msglayout {
-  struct upb_msglayout_msginit_v1 data;
-};
-
-static void upb_msglayout_free(upb_msglayout *l) {
-  upb_gfree(l->data.default_msg);
-  upb_gfree(l);
-}
-
-static size_t upb_msglayout_place(upb_msglayout *l, size_t size) {
-  size_t ret;
-
-  l->data.size = align_up(l->data.size, size);
-  ret = l->data.size;
-  l->data.size += size;
-  return ret;
-}
-
-static uint32_t upb_msglayout_offset(const upb_msglayout *l,
-                                     const upb_fielddef *f) {
-  return l->data.fields[upb_fielddef_index(f)].offset;
-}
-
-static uint32_t upb_msglayout_hasbit(const upb_msglayout *l,
-                                     const upb_fielddef *f) {
-  return l->data.fields[upb_fielddef_index(f)].hasbit;
-}
-
-static bool upb_msglayout_initdefault(upb_msglayout *l, const upb_msgdef *m) {
-  upb_msg_field_iter it;
-
-  if (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2 && l->data.size) {
-    /* Allocate default message and set default values in it. */
-    l->data.default_msg = upb_gmalloc(l->data.size);
-    if (!l->data.default_msg) {
-      return false;
-    }
-
-    memset(l->data.default_msg, 0, l->data.size);
-
-    for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
-         upb_msg_field_next(&it)) {
-      const upb_fielddef* f = upb_msg_iter_field(&it);
-
-      if (upb_fielddef_containingoneof(f)) {
-        continue;
-      }
-
-      /* TODO(haberman): handle strings. */
-      if (!upb_fielddef_isstring(f) &&
-          !upb_fielddef_issubmsg(f) &&
-          !upb_fielddef_isseq(f)) {
-        upb_msg_set(l->data.default_msg,
-                    upb_fielddef_index(f),
-                    upb_msgval_fromdefault(f),
-                    l);
-      }
-    }
-  }
-
-  return true;
-}
-
-static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
-  upb_msg_field_iter it;
-  upb_msg_oneof_iter oit;
-  upb_msglayout *l;
-  size_t hasbit;
-  size_t submsg_count = 0;
-  const upb_msglayout_msginit_v1 **submsgs;
-  upb_msglayout_fieldinit_v1 *fields;
-  upb_msglayout_oneofinit_v1 *oneofs;
-
-  for (upb_msg_field_begin(&it, m);
-       !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    const upb_fielddef* f = upb_msg_iter_field(&it);
-    if (upb_fielddef_issubmsg(f)) {
-      submsg_count++;
-    }
-  }
-
-  l = upb_gmalloc(sizeof(*l));
-  if (!l) return NULL;
-
-  memset(l, 0, sizeof(*l));
-
-  fields = upb_gmalloc(upb_msgdef_numfields(m) * sizeof(*fields));
-  submsgs = upb_gmalloc(submsg_count * sizeof(*submsgs));
-  oneofs = upb_gmalloc(upb_msgdef_numoneofs(m) * sizeof(*oneofs));
-
-  if ((!fields && upb_msgdef_numfields(m)) ||
-      (!submsgs && submsg_count) ||
-      (!oneofs && upb_msgdef_numoneofs(m))) {
-    /* OOM. */
-    upb_gfree(l);
-    upb_gfree(fields);
-    upb_gfree(submsgs);
-    upb_gfree(oneofs);
-    return NULL;
-  }
-
-  l->data.field_count = upb_msgdef_numfields(m);
-  l->data.oneof_count = upb_msgdef_numoneofs(m);
-  l->data.fields = fields;
-  l->data.submsgs = submsgs;
-  l->data.oneofs = oneofs;
-  l->data.is_proto2 = (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2);
-
-  /* Allocate data offsets in three stages:
-   *
-   * 1. hasbits.
-   * 2. regular fields.
-   * 3. oneof fields.
-   *
-   * OPT: There is a lot of room for optimization here to minimize the size.
-   */
-
-  /* Allocate hasbits and set basic field attributes. */
-  for (upb_msg_field_begin(&it, m), hasbit = 0;
-       !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    const upb_fielddef* f = upb_msg_iter_field(&it);
-    upb_msglayout_fieldinit_v1 *field = &fields[upb_fielddef_index(f)];
-
-    field->number = upb_fielddef_number(f);
-    field->type = upb_fielddef_type(f);
-    field->label = upb_fielddef_label(f);
-
-    if (upb_fielddef_containingoneof(f)) {
-      field->oneof_index = upb_oneofdef_index(upb_fielddef_containingoneof(f));
-    } else {
-      field->oneof_index = UPB_NOT_IN_ONEOF;
-    }
-
-    if (upb_fielddef_haspresence(f) && !upb_fielddef_containingoneof(f)) {
-      field->hasbit = hasbit++;
-    }
-  }
-
-  /* Account for space used by hasbits. */
-  l->data.size = div_round_up(hasbit, 8);
-
-  /* Allocate non-oneof fields. */
-  for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
-       upb_msg_field_next(&it)) {
-    const upb_fielddef* f = upb_msg_iter_field(&it);
-    size_t field_size = upb_msg_fielddefsize(f);
-    size_t index = upb_fielddef_index(f);
-
-    if (upb_fielddef_containingoneof(f)) {
-      /* Oneofs are handled separately below. */
-      continue;
-    }
-
-    fields[index].offset = upb_msglayout_place(l, field_size);
-  }
-
-  /* Allocate oneof fields.  Each oneof field consists of a uint32 for the case
-   * and space for the actual data. */
-  for (upb_msg_oneof_begin(&oit, m); !upb_msg_oneof_done(&oit);
-       upb_msg_oneof_next(&oit)) {
-    const upb_oneofdef* o = upb_msg_iter_oneof(&oit);
-    upb_oneof_iter fit;
-
-    size_t case_size = sizeof(uint32_t);  /* Could potentially optimize this. */
-    upb_msglayout_oneofinit_v1 *oneof = &oneofs[upb_oneofdef_index(o)];
-    size_t field_size = 0;
-
-    /* Calculate field size: the max of all field sizes. */
-    for (upb_oneof_begin(&fit, o);
-         !upb_oneof_done(&fit);
-         upb_oneof_next(&fit)) {
-      const upb_fielddef* f = upb_oneof_iter_field(&fit);
-      field_size = UPB_MAX(field_size, upb_msg_fielddefsize(f));
-    }
-
-    /* Align and allocate case offset. */
-    oneof->case_offset = upb_msglayout_place(l, case_size);
-    oneof->data_offset = upb_msglayout_place(l, field_size);
-  }
-
-  /* Size of the entire structure should be a multiple of its greatest
-   * alignment.  TODO: track overall alignment for real? */
-  l->data.size = align_up(l->data.size, 8);
-
-  if (upb_msglayout_initdefault(l, m)) {
-    return l;
-  } else {
-    upb_msglayout_free(l);
-    return NULL;
-  }
-}
-
-
-/** upb_msgfactory ************************************************************/
-
-struct upb_msgfactory {
-  const upb_symtab *symtab;  /* We own a ref. */
-  upb_inttable layouts;
-  upb_inttable mergehandlers;
-};
-
-upb_msgfactory *upb_msgfactory_new(const upb_symtab *symtab) {
-  upb_msgfactory *ret = upb_gmalloc(sizeof(*ret));
-
-  ret->symtab = symtab;
-  upb_inttable_init(&ret->layouts, UPB_CTYPE_PTR);
-  upb_inttable_init(&ret->mergehandlers, UPB_CTYPE_CONSTPTR);
-
-  return ret;
-}
-
-void upb_msgfactory_free(upb_msgfactory *f) {
-  upb_inttable_iter i;
-  upb_inttable_begin(&i, &f->layouts);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    upb_msglayout *l = upb_value_getptr(upb_inttable_iter_value(&i));
-    upb_msglayout_free(l);
-  }
-
-  upb_inttable_begin(&i, &f->mergehandlers);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    const upb_handlers *h = upb_value_getconstptr(upb_inttable_iter_value(&i));
-    upb_handlers_unref(h, f);
-  }
-
-  upb_inttable_uninit(&f->layouts);
-  upb_inttable_uninit(&f->mergehandlers);
-  upb_gfree(f);
-}
-
-const upb_symtab *upb_msgfactory_symtab(const upb_msgfactory *f) {
-  return f->symtab;
-}
-
-const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
-                                              const upb_msgdef *m) {
-  upb_value v;
-  UPB_ASSERT(upb_symtab_lookupmsg(f->symtab, upb_msgdef_fullname(m)) == m);
-  UPB_ASSERT(!upb_msgdef_mapentry(m));
-
-  if (upb_inttable_lookupptr(&f->layouts, m, &v)) {
-    UPB_ASSERT(upb_value_getptr(v));
-    return upb_value_getptr(v);
-  } else {
-    upb_msgfactory *mutable_f = (void*)f;
-    upb_msglayout *l = upb_msglayout_new(m);
-    upb_inttable_insertptr(&mutable_f->layouts, m, upb_value_ptr(l));
-    UPB_ASSERT(l);
-    return l;
-  }
-}
-
-/* Our handlers that we don't expose externally. */
-
-void *upb_msg_startstr(void *msg, const void *hd, size_t size_hint) {
-  uint32_t ofs = (uintptr_t)hd;
-  upb_alloc *alloc = upb_msg_alloc(msg);
-  upb_msgval val;
-  UPB_UNUSED(size_hint);
-
-  val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
-
-  upb_free(alloc, (void*)val.str.data);
-  val.str.data = NULL;
-  val.str.size = 0;
-
-  upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
-  return msg;
-}
-
-size_t upb_msg_str(void *msg, const void *hd, const char *ptr, size_t size,
-                   const upb_bufhandle *handle) {
-  uint32_t ofs = (uintptr_t)hd;
-  upb_alloc *alloc = upb_msg_alloc(msg);
-  upb_msgval val;
-  size_t newsize;
-  UPB_UNUSED(handle);
-
-  val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
-
-  newsize = val.str.size + size;
-  val.str.data = upb_realloc(alloc, (void*)val.str.data, val.str.size, newsize);
-
-  if (!val.str.data) {
-    return false;
-  }
-
-  memcpy((char*)val.str.data + val.str.size, ptr, size);
-  val.str.size = newsize;
-  upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
-  return size;
-}
-
-static void callback(const void *closure, upb_handlers *h) {
-  upb_msgfactory *factory = (upb_msgfactory*)closure;
-  const upb_msgdef *md = upb_handlers_msgdef(h);
-  const upb_msglayout* layout = upb_msgfactory_getlayout(factory, md);
-  upb_msg_field_iter i;
-  UPB_UNUSED(factory);
-
-  for(upb_msg_field_begin(&i, md);
-      !upb_msg_field_done(&i);
-      upb_msg_field_next(&i)) {
-    const upb_fielddef *f = upb_msg_iter_field(&i);
-    size_t offset = upb_msglayout_offset(layout, f);
-    upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-    upb_handlerattr_sethandlerdata(&attr, (void*)offset);
-
-    if (upb_fielddef_isseq(f)) {
-    } else if (upb_fielddef_isstring(f)) {
-      upb_handlers_setstartstr(h, f, upb_msg_startstr, &attr);
-      upb_handlers_setstring(h, f, upb_msg_str, &attr);
-    } else {
-      upb_msg_setscalarhandler(
-          h, f, offset, upb_msglayout_hasbit(layout, f));
-    }
-  }
-}
-
-const upb_handlers *upb_msgfactory_getmergehandlers(upb_msgfactory *f,
-                                                    const upb_msgdef *m) {
-  upb_msgfactory *mutable_f = (void*)f;
-
-  /* TODO(haberman): properly cache these. */
-  const upb_handlers *ret = upb_handlers_newfrozen(m, f, callback, f);
-  upb_inttable_push(&mutable_f->mergehandlers, upb_value_constptr(ret));
-
-  return ret;
-}
-
-const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
-                                                     const upb_handlers *h) {
-  const upb_msgdef *md = upb_handlers_msgdef(h);
-  return (const upb_visitorplan*)upb_msgfactory_getlayout(f, md);
-}
-
-
-/** upb_visitor ***************************************************************/
-
-struct upb_visitor {
-  const upb_msglayout *layout;
-  upb_sink *sink;
-};
-
-static upb_selector_t getsel2(const upb_fielddef *f, upb_handlertype_t type) {
-  upb_selector_t ret;
-  bool ok = upb_handlers_getselector(f, type, &ret);
-  UPB_ASSERT(ok);
-  return ret;
-}
-
-static bool upb_visitor_hasfield(const upb_msg *msg, const upb_fielddef *f,
-                                 const upb_msglayout *layout) {
-  int field_index = upb_fielddef_index(f);
-  if (upb_fielddef_isseq(f)) {
-    return upb_msgval_getarr(upb_msg_get(msg, field_index, layout)) != NULL;
-  } else if (upb_msgdef_syntax(upb_fielddef_containingtype(f)) ==
-             UPB_SYNTAX_PROTO2) {
-    return upb_msg_has(msg, field_index, layout);
-  } else {
-    upb_msgval val = upb_msg_get(msg, field_index, layout);
-    switch (upb_fielddef_type(f)) {
-      case UPB_TYPE_FLOAT:
-        return upb_msgval_getfloat(val) != 0;
-      case UPB_TYPE_DOUBLE:
-        return upb_msgval_getdouble(val) != 0;
-      case UPB_TYPE_BOOL:
-        return upb_msgval_getbool(val);
-      case UPB_TYPE_ENUM:
-      case UPB_TYPE_INT32:
-        return upb_msgval_getint32(val) != 0;
-      case UPB_TYPE_UINT32:
-        return upb_msgval_getuint32(val) != 0;
-      case UPB_TYPE_INT64:
-        return upb_msgval_getint64(val) != 0;
-      case UPB_TYPE_UINT64:
-        return upb_msgval_getuint64(val) != 0;
-      case UPB_TYPE_STRING:
-      case UPB_TYPE_BYTES:
-        return upb_msgval_getstr(val).size > 0;
-      case UPB_TYPE_MESSAGE:
-        return upb_msgval_getmsg(val) != NULL;
-    }
-    UPB_UNREACHABLE();
-  }
-}
-
-static bool upb_visitor_visitmsg2(const upb_msg *msg,
-                                  const upb_msglayout *layout, upb_sink *sink,
-                                  int depth) {
-  const upb_msgdef *md = upb_handlers_msgdef(sink->handlers);
-  upb_msg_field_iter i;
-  upb_status status;
-
-  upb_sink_startmsg(sink);
-
-  /* Protect against cycles (possible because users may freely reassign message
-   * and repeated fields) by imposing a maximum recursion depth. */
-  if (depth > ENCODE_MAX_NESTING) {
-    return false;
-  }
-
-  for (upb_msg_field_begin(&i, md);
-       !upb_msg_field_done(&i);
-       upb_msg_field_next(&i)) {
-    upb_fielddef *f = upb_msg_iter_field(&i);
-    upb_msgval val;
-
-    if (!upb_visitor_hasfield(msg, f, layout)) {
-      continue;
-    }
-
-    val = upb_msg_get(msg, upb_fielddef_index(f), layout);
-
-    if (upb_fielddef_isseq(f)) {
-      const upb_array *arr = upb_msgval_getarr(val);
-      UPB_ASSERT(arr);
-      /* TODO: putary(ary, f, sink, depth);*/
-    } else if (upb_fielddef_issubmsg(f)) {
-      const upb_map *map = upb_msgval_getmap(val);
-      UPB_ASSERT(map);
-      /* TODO: putmap(map, f, sink, depth);*/
-    } else if (upb_fielddef_isstring(f)) {
-      /* TODO putstr(); */
-    } else {
-      upb_selector_t sel = getsel2(f, upb_handlers_getprimitivehandlertype(f));
-      UPB_ASSERT(upb_fielddef_isprimitive(f));
-
-      switch (upb_fielddef_type(f)) {
-        case UPB_TYPE_FLOAT:
-          CHECK_TRUE(upb_sink_putfloat(sink, sel, upb_msgval_getfloat(val)));
-          break;
-        case UPB_TYPE_DOUBLE:
-          CHECK_TRUE(upb_sink_putdouble(sink, sel, upb_msgval_getdouble(val)));
-          break;
-        case UPB_TYPE_BOOL:
-          CHECK_TRUE(upb_sink_putbool(sink, sel, upb_msgval_getbool(val)));
-          break;
-        case UPB_TYPE_ENUM:
-        case UPB_TYPE_INT32:
-          CHECK_TRUE(upb_sink_putint32(sink, sel, upb_msgval_getint32(val)));
-          break;
-        case UPB_TYPE_UINT32:
-          CHECK_TRUE(upb_sink_putuint32(sink, sel, upb_msgval_getuint32(val)));
-          break;
-        case UPB_TYPE_INT64:
-          CHECK_TRUE(upb_sink_putint64(sink, sel, upb_msgval_getint64(val)));
-          break;
-        case UPB_TYPE_UINT64:
-          CHECK_TRUE(upb_sink_putuint64(sink, sel, upb_msgval_getuint64(val)));
-          break;
-        case UPB_TYPE_STRING:
-        case UPB_TYPE_BYTES:
-        case UPB_TYPE_MESSAGE:
-          UPB_UNREACHABLE();
-      }
-    }
-  }
-
-  upb_sink_endmsg(sink, &status);
-  return true;
-}
-
-upb_visitor *upb_visitor_create(upb_env *e, const upb_visitorplan *vp,
-                                upb_sink *output) {
-  upb_visitor *visitor = upb_env_malloc(e, sizeof(*visitor));
-  visitor->layout = (const upb_msglayout*)vp;
-  visitor->sink = output;
-  return visitor;
-}
-
-bool upb_visitor_visitmsg(upb_visitor *visitor, const upb_msg *msg) {
-  return upb_visitor_visitmsg2(msg, visitor->layout, visitor->sink, 0);
-}
-
-
-/** upb_msg *******************************************************************/
-
-/* If we always read/write as a consistent type to each address, this shouldn't
- * violate aliasing.
- */
-#define DEREF(msg, ofs, type) *PTR_AT(msg, ofs, type)
-
-/* Internal members of a upb_msg.  We can change this without breaking binary
- * compatibility.  We put these before the user's data.  The user's upb_msg*
- * points after the upb_msg_internal. */
-
-/* Used when a message is not extendable. */
-typedef struct {
-  /* TODO(haberman): add unknown fields. */
-  upb_alloc *alloc;
-} upb_msg_internal;
-
-/* Used when a message is extendable. */
-typedef struct {
-  upb_inttable *extdict;
-  upb_msg_internal base;
-} upb_msg_internal_withext;
-
-static int upb_msg_internalsize(const upb_msglayout *l) {
-    return sizeof(upb_msg_internal) - l->data.extendable * sizeof(void*);
-}
-
-static upb_msg_internal *upb_msg_getinternal(upb_msg *msg) {
-  return VOIDPTR_AT(msg, -sizeof(upb_msg_internal));
-}
-
-static const upb_msg_internal *upb_msg_getinternal_const(const upb_msg *msg) {
-  return VOIDPTR_AT(msg, -sizeof(upb_msg_internal));
-}
-
-static upb_msg_internal_withext *upb_msg_getinternalwithext(
-    upb_msg *msg, const upb_msglayout *l) {
-  UPB_ASSERT(l->data.extendable);
-  return VOIDPTR_AT(msg, -sizeof(upb_msg_internal_withext));
-}
-
-static const upb_msglayout_fieldinit_v1 *upb_msg_checkfield(
-    int field_index, const upb_msglayout *l) {
-  UPB_ASSERT(field_index >= 0 && field_index < l->data.field_count);
-  return &l->data.fields[field_index];
-}
-
-static bool upb_msg_inoneof(const upb_msglayout_fieldinit_v1 *field) {
-  return field->oneof_index != UPB_NOT_IN_ONEOF;
-}
-
-static uint32_t *upb_msg_oneofcase(const upb_msg *msg, int field_index,
-                                   const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-  UPB_ASSERT(upb_msg_inoneof(field));
-  return PTR_AT(msg, l->data.oneofs[field->oneof_index].case_offset, uint32_t);
-}
-
-size_t upb_msg_sizeof(const upb_msglayout *l) {
-  return l->data.size + upb_msg_internalsize(l);
-}
-
-upb_msg *upb_msg_init(void *mem, const upb_msglayout *l, upb_alloc *a) {
-  upb_msg *msg = VOIDPTR_AT(mem, upb_msg_internalsize(l));
-
-  /* Initialize normal members. */
-  if (l->data.default_msg) {
-    memcpy(msg, l->data.default_msg, l->data.size);
-  } else {
-    memset(msg, 0, l->data.size);
-  }
-
-  /* Initialize internal members. */
-  upb_msg_getinternal(msg)->alloc = a;
-
-  if (l->data.extendable) {
-    upb_msg_getinternalwithext(msg, l)->extdict = NULL;
-  }
-
-  return msg;
-}
-
-void *upb_msg_uninit(upb_msg *msg, const upb_msglayout *l) {
-  if (l->data.extendable) {
-    upb_inttable *ext_dict = upb_msg_getinternalwithext(msg, l)->extdict;
-    if (ext_dict) {
-      upb_inttable_uninit2(ext_dict, upb_msg_alloc(msg));
-      upb_free(upb_msg_alloc(msg), ext_dict);
-    }
-  }
-
-  return VOIDPTR_AT(msg, -upb_msg_internalsize(l));
-}
-
-upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a) {
-  void *mem = upb_malloc(a, upb_msg_sizeof(l));
-  return mem ? upb_msg_init(mem, l, a) : NULL;
-}
-
-void upb_msg_free(upb_msg *msg, const upb_msglayout *l) {
-  upb_free(upb_msg_alloc(msg), upb_msg_uninit(msg, l));
-}
-
-upb_alloc *upb_msg_alloc(const upb_msg *msg) {
-  return upb_msg_getinternal_const(msg)->alloc;
-}
-
-bool upb_msg_has(const upb_msg *msg,
-                 int field_index,
-                 const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-
-  UPB_ASSERT(l->data.is_proto2);
-
-  if (upb_msg_inoneof(field)) {
-    /* Oneofs are set when the oneof number is set to this field. */
-    return *upb_msg_oneofcase(msg, field_index, l) == field->number;
-  } else {
-    /* Other fields are set when their hasbit is set. */
-    uint32_t hasbit = l->data.fields[field_index].hasbit;
-    return DEREF(msg, hasbit / 8, char) | (1 << (hasbit % 8));
-  }
-}
-
-upb_msgval upb_msg_get(const upb_msg *msg, int field_index,
-                       const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-  int size = upb_msg_fieldsize(field);
-
-  if (upb_msg_inoneof(field)) {
-    if (*upb_msg_oneofcase(msg, field_index, l) == field->number) {
-      size_t ofs = l->data.oneofs[field->oneof_index].data_offset;
-      return upb_msgval_read(msg, ofs, size);
-    } else {
-      /* Return default. */
-      return upb_msgval_read(l->data.default_msg, field->offset, size);
-    }
-  } else {
-    return upb_msgval_read(msg, field->offset, size);
-  }
-}
-
-void upb_msg_set(upb_msg *msg, int field_index, upb_msgval val,
-                 const upb_msglayout *l) {
-  const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
-  int size = upb_msg_fieldsize(field);
-
-  if (upb_msg_inoneof(field)) {
-    size_t ofs = l->data.oneofs[field->oneof_index].data_offset;
-    *upb_msg_oneofcase(msg, field_index, l) = field->number;
-    upb_msgval_write(msg, ofs, val, size);
-  } else {
-    upb_msgval_write(msg, field->offset, val, size);
-  }
-}
-
-
-/** upb_array *****************************************************************/
-
-#define DEREF_ARR(arr, i, type) ((type*)arr->data)[i]
-
-size_t upb_array_sizeof(upb_fieldtype_t type) {
-  UPB_UNUSED(type);
-  return sizeof(upb_array);
-}
-
-void upb_array_init(upb_array *arr, upb_fieldtype_t type, upb_alloc *alloc) {
-  arr->type = type;
-  arr->data = NULL;
-  arr->len = 0;
-  arr->size = 0;
-  arr->element_size = upb_msgval_sizeof(type);
-  arr->alloc = alloc;
-}
-
-void upb_array_uninit(upb_array *arr) {
-  upb_free(arr->alloc, arr->data);
-}
-
-upb_array *upb_array_new(upb_fieldtype_t type, upb_alloc *a) {
-  upb_array *ret = upb_malloc(a, upb_array_sizeof(type));
-
-  if (ret) {
-    upb_array_init(ret, type, a);
-  }
-
-  return ret;
-}
-
-void upb_array_free(upb_array *arr) {
-  upb_array_uninit(arr);
-  upb_free(arr->alloc, arr);
-}
-
-size_t upb_array_size(const upb_array *arr) {
-  return arr->len;
-}
-
-upb_fieldtype_t upb_array_type(const upb_array *arr) {
-  return arr->type;
-}
-
-upb_msgval upb_array_get(const upb_array *arr, size_t i) {
-  UPB_ASSERT(i < arr->len);
-  return upb_msgval_read(arr->data, i * arr->element_size, arr->element_size);
-}
-
-bool upb_array_set(upb_array *arr, size_t i, upb_msgval val) {
-  UPB_ASSERT(i <= arr->len);
-
-  if (i == arr->len) {
-    /* Extending the array. */
-
-    if (i == arr->size) {
-      /* Need to reallocate. */
-      size_t new_size = UPB_MAX(arr->size * 2, 8);
-      size_t new_bytes = new_size * arr->element_size;
-      size_t old_bytes = arr->size * arr->element_size;
-      upb_msgval *new_data =
-          upb_realloc(arr->alloc, arr->data, old_bytes, new_bytes);
-
-      if (!new_data) {
-        return false;
-      }
-
-      arr->data = new_data;
-      arr->size = new_size;
-    }
-
-    arr->len = i + 1;
-  }
-
-  upb_msgval_write(arr->data, i * arr->element_size, val, arr->element_size);
-  return true;
-}
-
-
-/** upb_map *******************************************************************/
-
-struct upb_map {
-  upb_fieldtype_t key_type;
-  upb_fieldtype_t val_type;
-  /* We may want to optimize this to use inttable where possible, for greater
-   * efficiency and lower memory footprint. */
-  upb_strtable strtab;
-  upb_alloc *alloc;
-};
-
-static void upb_map_tokey(upb_fieldtype_t type, upb_msgval *key,
-                          const char **out_key, size_t *out_len) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-      /* Point to string data of the input key. */
-      *out_key = key->str.data;
-      *out_len = key->str.size;
-      return;
-    case UPB_TYPE_BOOL:
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT64:
-      /* Point to the key itself.  XXX: big-endian. */
-      *out_key = (const char*)key;
-      *out_len = upb_msgval_sizeof(type);
-      return;
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_FLOAT:
-    case UPB_TYPE_MESSAGE:
-      break;  /* Cannot be a map key. */
-  }
-  UPB_UNREACHABLE();
-}
-
-static upb_msgval upb_map_fromkey(upb_fieldtype_t type, const char *key,
-                                  size_t len) {
-  switch (type) {
-    case UPB_TYPE_STRING:
-      return upb_msgval_makestr(key, len);
-    case UPB_TYPE_BOOL:
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT64:
-      return upb_msgval_read(key, 0, upb_msgval_sizeof(type));
-    case UPB_TYPE_BYTES:
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_FLOAT:
-    case UPB_TYPE_MESSAGE:
-      break;  /* Cannot be a map key. */
-  }
-  UPB_UNREACHABLE();
-}
-
-size_t upb_map_sizeof(upb_fieldtype_t ktype, upb_fieldtype_t vtype) {
-  /* Size does not currently depend on key/value type. */
-  UPB_UNUSED(ktype);
-  UPB_UNUSED(vtype);
-  return sizeof(upb_map);
-}
-
-bool upb_map_init(upb_map *map, upb_fieldtype_t ktype, upb_fieldtype_t vtype,
-                  upb_alloc *a) {
-  upb_ctype_t vtabtype = upb_fieldtotabtype(vtype);
-  UPB_ASSERT(upb_fieldtype_mapkeyok(ktype));
-  map->key_type = ktype;
-  map->val_type = vtype;
-  map->alloc = a;
-
-  if (!upb_strtable_init2(&map->strtab, vtabtype, a)) {
-    return false;
-  }
-
-  return true;
-}
-
-void upb_map_uninit(upb_map *map) {
-  upb_strtable_uninit2(&map->strtab, map->alloc);
-}
-
-upb_map *upb_map_new(upb_fieldtype_t ktype, upb_fieldtype_t vtype,
-                     upb_alloc *a) {
-  upb_map *map = upb_malloc(a, upb_map_sizeof(ktype, vtype));
-
-  if (!map) {
-    return NULL;
-  }
-
-  if (!upb_map_init(map, ktype, vtype, a)) {
-    return NULL;
-  }
-
-  return map;
-}
-
-void upb_map_free(upb_map *map) {
-  upb_map_uninit(map);
-  upb_free(map->alloc, map);
-}
-
-size_t upb_map_size(const upb_map *map) {
-  return upb_strtable_count(&map->strtab);
-}
-
-upb_fieldtype_t upb_map_keytype(const upb_map *map) {
-  return map->key_type;
-}
-
-upb_fieldtype_t upb_map_valuetype(const upb_map *map) {
-  return map->val_type;
-}
-
-bool upb_map_get(const upb_map *map, upb_msgval key, upb_msgval *val) {
-  upb_value tabval;
-  const char *key_str;
-  size_t key_len;
-  bool ret;
-
-  upb_map_tokey(map->key_type, &key, &key_str, &key_len);
-  ret = upb_strtable_lookup2(&map->strtab, key_str, key_len, &tabval);
-  if (ret) {
-    memcpy(val, &tabval, sizeof(tabval));
-  }
-
-  return ret;
-}
-
-bool upb_map_set(upb_map *map, upb_msgval key, upb_msgval val,
-                 upb_msgval *removed) {
-  const char *key_str;
-  size_t key_len;
-  upb_value tabval = upb_toval(val);
-  upb_value removedtabval;
-  upb_alloc *a = map->alloc;
-
-  upb_map_tokey(map->key_type, &key, &key_str, &key_len);
-
-  /* TODO(haberman): add overwrite operation to minimize number of lookups. */
-  if (upb_strtable_lookup2(&map->strtab, key_str, key_len, NULL)) {
-    upb_strtable_remove3(&map->strtab, key_str, key_len, &removedtabval, a);
-    memcpy(&removed, &removedtabval, sizeof(removed));
-  }
-
-  return upb_strtable_insert3(&map->strtab, key_str, key_len, tabval, a);
-}
-
-bool upb_map_del(upb_map *map, upb_msgval key) {
-  const char *key_str;
-  size_t key_len;
-  upb_alloc *a = map->alloc;
-
-  upb_map_tokey(map->key_type, &key, &key_str, &key_len);
-  return upb_strtable_remove3(&map->strtab, key_str, key_len, NULL, a);
-}
-
-
-/** upb_mapiter ***************************************************************/
-
-struct upb_mapiter {
-  upb_strtable_iter iter;
-  upb_fieldtype_t key_type;
-};
-
-size_t upb_mapiter_sizeof() {
-  return sizeof(upb_mapiter);
-}
-
-void upb_mapiter_begin(upb_mapiter *i, const upb_map *map) {
-  upb_strtable_begin(&i->iter, &map->strtab);
-  i->key_type = map->key_type;
-}
-
-upb_mapiter *upb_mapiter_new(const upb_map *t, upb_alloc *a) {
-  upb_mapiter *ret = upb_malloc(a, upb_mapiter_sizeof());
-
-  if (!ret) {
-    return NULL;
-  }
-
-  upb_mapiter_begin(ret, t);
-  return ret;
-}
-
-void upb_mapiter_free(upb_mapiter *i, upb_alloc *a) {
-  upb_free(a, i);
-}
-
-void upb_mapiter_next(upb_mapiter *i) {
-  upb_strtable_next(&i->iter);
-}
-
-bool upb_mapiter_done(const upb_mapiter *i) {
-  return upb_strtable_done(&i->iter);
-}
-
-upb_msgval upb_mapiter_key(const upb_mapiter *i) {
-  return upb_map_fromkey(i->key_type, upb_strtable_iter_key(&i->iter),
-                         upb_strtable_iter_keylength(&i->iter));
-}
-
-upb_msgval upb_mapiter_value(const upb_mapiter *i) {
-  return upb_msgval_fromval(upb_strtable_iter_value(&i->iter));
-}
-
-void upb_mapiter_setdone(upb_mapiter *i) {
-  upb_strtable_iter_setdone(&i->iter);
-}
-
-bool upb_mapiter_isequal(const upb_mapiter *i1, const upb_mapiter *i2) {
-  return upb_strtable_iter_isequal(&i1->iter, &i2->iter);
-}
-
-
-/** Handlers for upb_msg ******************************************************/
-
-typedef struct {
-  size_t offset;
-  int32_t hasbit;
-} upb_msg_handlerdata;
-
-/* Fallback implementation if the handler is not specialized by the producer. */
-#define MSG_WRITER(type, ctype)                                               \
-  bool upb_msg_set ## type (void *c, const void *hd, ctype val) {             \
-    uint8_t *m = c;                                                           \
-    const upb_msg_handlerdata *d = hd;                                        \
-    if (d->hasbit > 0)                                                        \
-      *(uint8_t*)&m[d->hasbit / 8] |= 1 << (d->hasbit % 8);                   \
-    *(ctype*)&m[d->offset] = val;                                             \
-    return true;                                                              \
-  }                                                                           \
-
-MSG_WRITER(double, double)
-MSG_WRITER(float,  float)
-MSG_WRITER(int32,  int32_t)
-MSG_WRITER(int64,  int64_t)
-MSG_WRITER(uint32, uint32_t)
-MSG_WRITER(uint64, uint64_t)
-MSG_WRITER(bool,   bool)
-
-bool upb_msg_setscalarhandler(upb_handlers *h, const upb_fielddef *f,
-                              size_t offset, int32_t hasbit) {
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
-  bool ok;
-
-  upb_msg_handlerdata *d = upb_gmalloc(sizeof(*d));
-  if (!d) return false;
-  d->offset = offset;
-  d->hasbit = hasbit;
-
-  upb_handlerattr_sethandlerdata(&attr, d);
-  upb_handlerattr_setalwaysok(&attr, true);
-  upb_handlers_addcleanup(h, d, upb_gfree);
-
-#define TYPE(u, l) \
-  case UPB_TYPE_##u: \
-    ok = upb_handlers_set##l(h, f, upb_msg_set##l, &attr); break;
-
-  ok = false;
-
-  switch (upb_fielddef_type(f)) {
-    TYPE(INT64,  int64);
-    TYPE(INT32,  int32);
-    TYPE(ENUM,   int32);
-    TYPE(UINT64, uint64);
-    TYPE(UINT32, uint32);
-    TYPE(DOUBLE, double);
-    TYPE(FLOAT,  float);
-    TYPE(BOOL,   bool);
-    default: UPB_ASSERT(false); break;
-  }
-#undef TYPE
-
-  upb_handlerattr_uninit(&attr);
-  return ok;
-}
-
-bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
-                                  upb_selector_t s,
-                                  upb_fieldtype_t *type,
-                                  size_t *offset,
-                                  int32_t *hasbit) {
-  const upb_msg_handlerdata *d;
-  upb_func *f = upb_handlers_gethandler(h, s);
-
-  if ((upb_int64_handlerfunc*)f == upb_msg_setint64) {
-    *type = UPB_TYPE_INT64;
-  } else if ((upb_int32_handlerfunc*)f == upb_msg_setint32) {
-    *type = UPB_TYPE_INT32;
-  } else if ((upb_uint64_handlerfunc*)f == upb_msg_setuint64) {
-    *type = UPB_TYPE_UINT64;
-  } else if ((upb_uint32_handlerfunc*)f == upb_msg_setuint32) {
-    *type = UPB_TYPE_UINT32;
-  } else if ((upb_double_handlerfunc*)f == upb_msg_setdouble) {
-    *type = UPB_TYPE_DOUBLE;
-  } else if ((upb_float_handlerfunc*)f == upb_msg_setfloat) {
-    *type = UPB_TYPE_FLOAT;
-  } else if ((upb_bool_handlerfunc*)f == upb_msg_setbool) {
-    *type = UPB_TYPE_BOOL;
-  } else {
-    return false;
-  }
-
-  d = upb_handlers_gethandlerdata(h, s);
-  *offset = d->offset;
-  *hasbit = d->hasbit;
-  return true;
-}
 /*
 ** upb::RefCounted Implementation
 **
@@ -5351,7 +2938,7 @@
 static void track(const upb_refcounted *r, const void *owner, bool ref2) {
   upb_value v;
 
-  UPB_ASSERT(owner);
+  assert(owner);
   if (owner == UPB_UNTRACKED_REF) return;
 
   upb_lock();
@@ -5362,8 +2949,8 @@
      * tracking behavior we get with regular refs.  Since ref2s only happen
      * inside upb, we'll accept this limitation until/unless there is a really
      * difficult upb-internal bug that can't be figured out without it. */
-    UPB_ASSERT(ref2);
-    UPB_ASSERT(ref->is_ref2);
+    assert(ref2);
+    assert(ref->is_ref2);
     ref->count++;
   } else {
     trackedref *ref = trackedref_new(ref2);
@@ -5373,7 +2960,7 @@
       /* We know this cast is safe when it is a ref2, because it's coming from
        * another refcounted object. */
       const upb_refcounted *from = owner;
-      UPB_ASSERT(!upb_inttable_lookupptr(from->ref2s, r, NULL));
+      assert(!upb_inttable_lookupptr(from->ref2s, r, NULL));
       upb_inttable_insertptr2(from->ref2s, r, upb_value_ptr(NULL),
                               &upb_alloc_debugrefs);
     }
@@ -5386,15 +2973,15 @@
   bool found;
   trackedref *ref;
 
-  UPB_ASSERT(owner);
+  assert(owner);
   if (owner == UPB_UNTRACKED_REF) return;
 
   upb_lock();
   found = upb_inttable_lookupptr(r->refs, owner, &v);
   /* This assert will fail if an owner attempts to release a ref it didn't have. */
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   ref = upb_value_getptr(v);
-  UPB_ASSERT(ref->is_ref2 == ref2);
+  assert(ref->is_ref2 == ref2);
   if (--ref->count == 0) {
     free(ref);
     upb_inttable_removeptr(r->refs, owner, NULL);
@@ -5403,7 +2990,7 @@
        * another refcounted object. */
       const upb_refcounted *from = owner;
       bool removed = upb_inttable_removeptr(from->ref2s, r, NULL);
-      UPB_ASSERT(removed);
+      assert(removed);
     }
   }
   upb_unlock();
@@ -5416,9 +3003,9 @@
 
   upb_lock();
   found = upb_inttable_lookupptr(r->refs, owner, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   ref = upb_value_getptr(v);
-  UPB_ASSERT(ref->is_ref2 == ref2);
+  assert(ref->is_ref2 == ref2);
   upb_unlock();
 }
 
@@ -5439,7 +3026,7 @@
 
     /* To get the count we need to look in the target's table. */
     found = upb_inttable_lookupptr(to->refs, owner, &v);
-    UPB_ASSERT(found);
+    assert(found);
     ref = upb_value_getptr(v);
     count = upb_value_int32(ref->count);
 
@@ -5461,12 +3048,12 @@
   bool removed;
   int32_t newcount;
 
-  UPB_ASSERT(obj == s->obj);
-  UPB_ASSERT(subobj);
+  assert(obj == s->obj);
+  assert(subobj);
   removed = upb_inttable_removeptr(ref2, subobj, &v);
   /* The following assertion will fail if the visit() function visits a subobj
    * that it did not have a ref2 on, or visits the same subobj too many times. */
-  UPB_ASSERT(removed);
+  assert(removed);
   newcount = upb_value_getint32(v) - 1;
   if (newcount > 0) {
     upb_inttable_insert2(ref2, (uintptr_t)subobj, upb_value_int32(newcount),
@@ -5488,7 +3075,7 @@
   if (r->vtbl->visit) r->vtbl->visit(r, visit_check, &state);
 
   /* This assertion will fail if the visit() function missed any children. */
-  UPB_ASSERT(upb_inttable_count(&state.ref2) == 0);
+  assert(upb_inttable_count(&state.ref2) == 0);
   upb_inttable_uninit2(&state.ref2, &upb_alloc_debugrefs);
   if (r->vtbl->visit) r->vtbl->visit(r, v, closure);
 }
@@ -5595,7 +3182,7 @@
 static uint64_t getattr(const tarjan *t, const upb_refcounted *r) {
   upb_value v;
   bool found = upb_inttable_lookupptr(&t->objattr, r, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   return upb_value_getuint64(v);
 }
 
@@ -5609,13 +3196,13 @@
 }
 
 static void set_gray(tarjan *t, const upb_refcounted *r) {
-  UPB_ASSERT(color(t, r) == BLACK);
+  assert(color(t, r) == BLACK);
   setattr(t, r, GRAY);
 }
 
 /* Pushes an obj onto the Tarjan stack and sets it to GREEN. */
 static void push(tarjan *t, const upb_refcounted *r) {
-  UPB_ASSERT(color(t, r) == BLACK || color(t, r) == GRAY);
+  assert(color(t, r) == BLACK || color(t, r) == GRAY);
   /* This defines the attr layout for the GREEN state.  "index" and "lowlink"
    * get 31 bits, which is plenty (limit of 2B objects frozen at a time). */
   setattr(t, r, GREEN | (t->index << 2) | (t->index << 33));
@@ -5630,7 +3217,7 @@
  * SCC group. */
 static upb_refcounted *pop(tarjan *t) {
   upb_refcounted *r = upb_value_getptr(upb_inttable_pop(&t->stack));
-  UPB_ASSERT(color(t, r) == GREEN);
+  assert(color(t, r) == GREEN);
   /* This defines the attr layout for nodes in the WHITE state.
    * Top of group stack is [group, NULL]; we point at group. */
   setattr(t, r, WHITE | (upb_inttable_count(&t->groups) - 2) << 8);
@@ -5650,7 +3237,7 @@
 }
 
 static uint32_t idx(tarjan *t, const upb_refcounted *r) {
-  UPB_ASSERT(color(t, r) == GREEN);
+  assert(color(t, r) == GREEN);
   return (getattr(t, r) >> 2) & 0x7FFFFFFF;
 }
 
@@ -5663,7 +3250,7 @@
 }
 
 static void set_lowlink(tarjan *t, const upb_refcounted *r, uint32_t lowlink) {
-  UPB_ASSERT(color(t, r) == GREEN);
+  assert(color(t, r) == GREEN);
   setattr(t, r, ((uint64_t)lowlink << 33) | (getattr(t, r) & 0x1FFFFFFFF));
 }
 
@@ -5672,10 +3259,10 @@
   upb_value v;
   bool found;
 
-  UPB_ASSERT(color(t, r) == WHITE);
+  assert(color(t, r) == WHITE);
   groupnum = getattr(t, r) >> 8;
   found = upb_inttable_lookup(&t->groups, groupnum, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   return upb_value_getptr(v);
 }
 
@@ -5686,10 +3273,10 @@
   upb_value v;
   bool found;
 
-  UPB_ASSERT(color(t, r) == WHITE);
+  assert(color(t, r) == WHITE);
   leader_slot = (getattr(t, r) >> 8) + 1;
   found = upb_inttable_lookup(&t->groups, leader_slot, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   if (upb_value_getptr(v)) {
     return upb_value_getptr(v);
   } else {
@@ -5749,7 +3336,7 @@
 static void crossref(const upb_refcounted *r, const upb_refcounted *subobj,
                      void *_t) {
   tarjan *t = _t;
-  UPB_ASSERT(color(t, r) > BLACK);
+  assert(color(t, r) > BLACK);
   if (color(t, subobj) > BLACK && r->group != subobj->group) {
     /* Previously this ref was not reflected in subobj->group because they
      * were in the same group; now that they are split a ref must be taken. */
@@ -5817,13 +3404,13 @@
       upb_refcounted *move = obj->next;
       if (obj == move) {
         /* Removing the last object from a group. */
-        UPB_ASSERT(*obj->group == obj->individual_count);
+        assert(*obj->group == obj->individual_count);
         upb_gfree(obj->group);
       } else {
         obj->next = move->next;
         /* This may decrease to zero; we'll collect GRAY objects (if any) that
          * remain in the group in the third pass. */
-        UPB_ASSERT(*move->group >= move->individual_count);
+        assert(*move->group >= move->individual_count);
         *move->group -= move->individual_count;
       }
 
@@ -5836,7 +3423,7 @@
         *move->group = move->individual_count;
       } else {
         /* Group already has at least one object in it. */
-        UPB_ASSERT(leader->group == group(&t, move));
+        assert(leader->group == group(&t, move));
         move->group = group(&t, move);
         move->next = leader->next;
         leader->next = move;
@@ -5926,7 +3513,7 @@
    * TODO(haberman): this linear algorithm can result in an overall O(n^2) bound
    * if the user continuously extends a group by one object.  Prevent this by
    * using one of the techniques in this paper:
-   *     http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/Union-Find-Tarjan.pdf */
+   *     ftp://www.ncedc.org/outgoing/geomorph/dino/orals/p245-tarjan.pdf */
   do { from->group = r->group; } while ((from = from->next) != base);
 
   /* Merge the two circularly linked lists by swapping their next pointers. */
@@ -5943,7 +3530,7 @@
   UPB_UNUSED(closure);
   untrack(subobj, obj, true);
   if (!merged(obj, subobj)) {
-    UPB_ASSERT(subobj->is_frozen);
+    assert(subobj->is_frozen);
     unref(subobj);
   }
 }
@@ -5962,7 +3549,7 @@
     o = r;
     do {
       const upb_refcounted *next = o->next;
-      UPB_ASSERT(o->is_frozen || o->individual_count == 0);
+      assert(o->is_frozen || o->individual_count == 0);
       freeobj((upb_refcounted*)o);
       o = next;
     } while(o != r);
@@ -5986,9 +3573,9 @@
    * basically every program using upb. */
   const int x = 1;
 #ifdef UPB_BIG_ENDIAN
-  UPB_ASSERT(*(char*)&x != 1);
+  assert(*(char*)&x != 1);
 #else
-  UPB_ASSERT(*(char*)&x == 1);
+  assert(*(char*)&x == 1);
 #endif
 #endif
 
@@ -6023,7 +3610,7 @@
 }
 
 void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from) {
-  UPB_ASSERT(!from->is_frozen);  /* Non-const pointer implies this. */
+  assert(!from->is_frozen);  /* Non-const pointer implies this. */
   track(r, from, true);
   if (r->is_frozen) {
     refgroup(r->group);
@@ -6033,18 +3620,18 @@
 }
 
 void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from) {
-  UPB_ASSERT(!from->is_frozen);  /* Non-const pointer implies this. */
+  assert(!from->is_frozen);  /* Non-const pointer implies this. */
   untrack(r, from, true);
   if (r->is_frozen) {
     unref(r);
   } else {
-    UPB_ASSERT(merged(r, from));
+    assert(merged(r, from));
   }
 }
 
 void upb_refcounted_donateref(
     const upb_refcounted *r, const void *from, const void *to) {
-  UPB_ASSERT(from != to);
+  assert(from != to);
   if (to != NULL)
     upb_refcounted_ref(r, to);
   if (from != NULL)
@@ -6060,99 +3647,587 @@
   int i;
   bool ret;
   for (i = 0; i < n; i++) {
-    UPB_ASSERT(!roots[i]->is_frozen);
+    assert(!roots[i]->is_frozen);
   }
   ret = freeze(roots, n, s, maxdepth);
-  UPB_ASSERT(!s || ret == upb_ok(s));
+  assert(!s || ret == upb_ok(s));
   return ret;
 }
 
 
-bool upb_bufsrc_putbuf(const char *buf, size_t len, upb_bytessink *sink) {
-  void *subc;
+/* Fallback implementation if the shim is not specialized by the JIT. */
+#define SHIM_WRITER(type, ctype)                                              \
+  bool upb_shim_set ## type (void *c, const void *hd, ctype val) {            \
+    uint8_t *m = c;                                                           \
+    const upb_shim_data *d = hd;                                              \
+    if (d->hasbit > 0)                                                        \
+      *(uint8_t*)&m[d->hasbit / 8] |= 1 << (d->hasbit % 8);                   \
+    *(ctype*)&m[d->offset] = val;                                             \
+    return true;                                                              \
+  }                                                                           \
+
+SHIM_WRITER(double, double)
+SHIM_WRITER(float,  float)
+SHIM_WRITER(int32,  int32_t)
+SHIM_WRITER(int64,  int64_t)
+SHIM_WRITER(uint32, uint32_t)
+SHIM_WRITER(uint64, uint64_t)
+SHIM_WRITER(bool,   bool)
+#undef SHIM_WRITER
+
+bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
+                  int32_t hasbit) {
+  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
+  bool ok;
+
+  upb_shim_data *d = upb_gmalloc(sizeof(*d));
+  if (!d) return false;
+  d->offset = offset;
+  d->hasbit = hasbit;
+
+  upb_handlerattr_sethandlerdata(&attr, d);
+  upb_handlerattr_setalwaysok(&attr, true);
+  upb_handlers_addcleanup(h, d, upb_gfree);
+
+#define TYPE(u, l) \
+  case UPB_TYPE_##u: \
+    ok = upb_handlers_set##l(h, f, upb_shim_set##l, &attr); break;
+
+  ok = false;
+
+  switch (upb_fielddef_type(f)) {
+    TYPE(INT64,  int64);
+    TYPE(INT32,  int32);
+    TYPE(ENUM,   int32);
+    TYPE(UINT64, uint64);
+    TYPE(UINT32, uint32);
+    TYPE(DOUBLE, double);
+    TYPE(FLOAT,  float);
+    TYPE(BOOL,   bool);
+    default: assert(false); break;
+  }
+#undef TYPE
+
+  upb_handlerattr_uninit(&attr);
+  return ok;
+}
+
+const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,
+                                      upb_fieldtype_t *type) {
+  upb_func *f = upb_handlers_gethandler(h, s);
+
+  if ((upb_int64_handlerfunc*)f == upb_shim_setint64) {
+    *type = UPB_TYPE_INT64;
+  } else if ((upb_int32_handlerfunc*)f == upb_shim_setint32) {
+    *type = UPB_TYPE_INT32;
+  } else if ((upb_uint64_handlerfunc*)f == upb_shim_setuint64) {
+    *type = UPB_TYPE_UINT64;
+  } else if ((upb_uint32_handlerfunc*)f == upb_shim_setuint32) {
+    *type = UPB_TYPE_UINT32;
+  } else if ((upb_double_handlerfunc*)f == upb_shim_setdouble) {
+    *type = UPB_TYPE_DOUBLE;
+  } else if ((upb_float_handlerfunc*)f == upb_shim_setfloat) {
+    *type = UPB_TYPE_FLOAT;
+  } else if ((upb_bool_handlerfunc*)f == upb_shim_setbool) {
+    *type = UPB_TYPE_BOOL;
+  } else {
+    return NULL;
+  }
+
+  return (const upb_shim_data*)upb_handlers_gethandlerdata(h, s);
+}
+
+
+#include <string.h>
+
+static void upb_symtab_free(upb_refcounted *r) {
+  upb_symtab *s = (upb_symtab*)r;
+  upb_strtable_iter i;
+  upb_strtable_begin(&i, &s->symtab);
+  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
+    const upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
+    upb_def_unref(def, s);
+  }
+  upb_strtable_uninit(&s->symtab);
+  upb_gfree(s);
+}
+
+upb_symtab *upb_symtab_new(const void *owner) {
+  static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_symtab_free};
+
+  upb_symtab *s = upb_gmalloc(sizeof(*s));
+  if (!s) {
+    return NULL;
+  }
+
+  upb_refcounted_init(upb_symtab_upcast_mutable(s), &vtbl, owner);
+  upb_strtable_init(&s->symtab, UPB_CTYPE_PTR);
+  return s;
+}
+
+void upb_symtab_freeze(upb_symtab *s) {
+  upb_refcounted *r;
+  bool ok;
+
+  assert(!upb_symtab_isfrozen(s));
+  r = upb_symtab_upcast_mutable(s);
+  /* The symtab does not take ref2's (see refcounted.h) on the defs, because
+   * defs cannot refer back to the table and therefore cannot create cycles.  So
+   * 0 will suffice for maxdepth here. */
+  ok = upb_refcounted_freeze(&r, 1, NULL, 0);
+  UPB_ASSERT_VAR(ok, ok);
+}
+
+const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym) {
+  upb_value v;
+  upb_def *ret = upb_strtable_lookup(&s->symtab, sym, &v) ?
+      upb_value_getptr(v) : NULL;
+  return ret;
+}
+
+const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
+  upb_value v;
+  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
+      upb_value_getptr(v) : NULL;
+  return def ? upb_dyncast_msgdef(def) : NULL;
+}
+
+const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
+  upb_value v;
+  upb_def *def = upb_strtable_lookup(&s->symtab, sym, &v) ?
+      upb_value_getptr(v) : NULL;
+  return def ? upb_dyncast_enumdef(def) : NULL;
+}
+
+/* Given a symbol and the base symbol inside which it is defined, find the
+ * symbol's definition in t. */
+static upb_def *upb_resolvename(const upb_strtable *t,
+                                const char *base, const char *sym) {
+  if(strlen(sym) == 0) return NULL;
+  if(sym[0] == '.') {
+    /* Symbols starting with '.' are absolute, so we do a single lookup.
+     * Slice to omit the leading '.' */
+    upb_value v;
+    return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;
+  } else {
+    /* Remove components from base until we find an entry or run out.
+     * TODO: This branch is totally broken, but currently not used. */
+    (void)base;
+    assert(false);
+    return NULL;
+  }
+}
+
+const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
+                                  const char *sym) {
+  upb_def *ret = upb_resolvename(&s->symtab, base, sym);
+  return ret;
+}
+
+/* Starts a depth-first traversal at "def", recursing into any subdefs
+ * (ie. submessage types).  Adds duplicates of existing defs to addtab
+ * wherever necessary, so that the resulting symtab will be consistent once
+ * addtab is added.
+ *
+ * More specifically, if any def D is found in the DFS that:
+ *
+ *   1. can reach a def that is being replaced by something in addtab, AND
+ *
+ *   2. is not itself being replaced already (ie. this name doesn't already
+ *      exist in addtab)
+ *
+ * ...then a duplicate (new copy) of D will be added to addtab.
+ *
+ * Returns true if this happened for any def reachable from "def."
+ *
+ * It is slightly tricky to do this correctly in the presence of cycles.  If we
+ * detect that our DFS has hit a cycle, we might not yet know if any SCCs on
+ * our stack can reach a def in addtab or not.  Once we figure this out, that
+ * answer needs to apply to *all* defs in these SCCs, even if we visited them
+ * already.  So a straight up one-pass cycle-detecting DFS won't work.
+ *
+ * To work around this problem, we traverse each SCC (which we already
+ * computed, since these defs are frozen) as a single node.  We first compute
+ * whether the SCC as a whole can reach any def in addtab, then we dup (or not)
+ * the entire SCC.  This requires breaking the encapsulation of upb_refcounted,
+ * since that is where we get the data about what SCC we are in. */
+static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,
+                            const void *new_owner, upb_inttable *seen,
+                            upb_status *s) {
+  upb_value v;
+  bool need_dup;
+  const upb_def *base;
+  const void* memoize_key;
+
+  /* Memoize results of this function for efficiency (since we're traversing a
+   * DAG this is not needed to limit the depth of the search).
+   *
+   * We memoize by SCC instead of by individual def. */
+  memoize_key = def->base.group;
+
+  if (upb_inttable_lookupptr(seen, memoize_key, &v))
+    return upb_value_getbool(v);
+
+  /* Visit submessages for all messages in the SCC. */
+  need_dup = false;
+  base = def;
+  do {
+    upb_value v;
+    const upb_msgdef *m;
+
+    assert(upb_def_isfrozen(def));
+    if (def->type == UPB_DEF_FIELD) continue;
+    if (upb_strtable_lookup(addtab, upb_def_fullname(def), &v)) {
+      need_dup = true;
+    }
+
+    /* For messages, continue the recursion by visiting all subdefs, but only
+     * ones in different SCCs. */
+    m = upb_dyncast_msgdef(def);
+    if (m) {
+      upb_msg_field_iter i;
+      for(upb_msg_field_begin(&i, m);
+          !upb_msg_field_done(&i);
+          upb_msg_field_next(&i)) {
+        upb_fielddef *f = upb_msg_iter_field(&i);
+        const upb_def *subdef;
+
+        if (!upb_fielddef_hassubdef(f)) continue;
+        subdef = upb_fielddef_subdef(f);
+
+        /* Skip subdefs in this SCC. */
+        if (def->base.group == subdef->base.group) continue;
+
+        /* |= to avoid short-circuit; we need its side-effects. */
+        need_dup |= upb_resolve_dfs(subdef, addtab, new_owner, seen, s);
+        if (!upb_ok(s)) return false;
+      }
+    }
+  } while ((def = (upb_def*)def->base.next) != base);
+
+  if (need_dup) {
+    /* Dup all defs in this SCC that don't already have entries in addtab. */
+    def = base;
+    do {
+      const char *name;
+
+      if (def->type == UPB_DEF_FIELD) continue;
+      name = upb_def_fullname(def);
+      if (!upb_strtable_lookup(addtab, name, NULL)) {
+        upb_def *newdef = upb_def_dup(def, new_owner);
+        if (!newdef) goto oom;
+        newdef->came_from_user = false;
+        if (!upb_strtable_insert(addtab, name, upb_value_ptr(newdef)))
+          goto oom;
+      }
+    } while ((def = (upb_def*)def->base.next) != base);
+  }
+
+  upb_inttable_insertptr(seen, memoize_key, upb_value_bool(need_dup));
+  return need_dup;
+
+oom:
+  upb_status_seterrmsg(s, "out of memory");
+  return false;
+}
+
+/* TODO(haberman): we need a lot more testing of error conditions.
+ * The came_from_user stuff in particular is not tested. */
+static bool symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
+                       void *ref_donor, upb_refcounted *freeze_also,
+                       upb_status *status) {
+  size_t i;
+  size_t add_n;
+  size_t freeze_n;
+  upb_strtable_iter iter;
+  upb_refcounted **add_objs = NULL;
+  upb_def **add_defs = NULL;
+  size_t add_objs_size;
+  upb_strtable addtab;
+  upb_inttable seen;
+
+  if (n == 0 && !freeze_also) {
+    return true;
+  }
+
+  assert(!upb_symtab_isfrozen(s));
+  if (!upb_strtable_init(&addtab, UPB_CTYPE_PTR)) {
+    upb_status_seterrmsg(status, "out of memory");
+    return false;
+  }
+
+  /* Add new defs to our "add" set. */
+  for (i = 0; i < n; i++) {
+    upb_def *def = defs[i];
+    const char *fullname;
+    upb_fielddef *f;
+
+    if (upb_def_isfrozen(def)) {
+      upb_status_seterrmsg(status, "added defs must be mutable");
+      goto err;
+    }
+    assert(!upb_def_isfrozen(def));
+    fullname = upb_def_fullname(def);
+    if (!fullname) {
+      upb_status_seterrmsg(
+          status, "Anonymous defs cannot be added to a symtab");
+      goto err;
+    }
+
+    f = upb_dyncast_fielddef_mutable(def);
+
+    if (f) {
+      if (!upb_fielddef_containingtypename(f)) {
+        upb_status_seterrmsg(status,
+                             "Standalone fielddefs must have a containing type "
+                             "(extendee) name set");
+        goto err;
+      }
+    } else {
+      if (upb_strtable_lookup(&addtab, fullname, NULL)) {
+        upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);
+        goto err;
+      }
+      /* We need this to back out properly, because if there is a failure we
+       * need to donate the ref back to the caller. */
+      def->came_from_user = true;
+      upb_def_donateref(def, ref_donor, s);
+      if (!upb_strtable_insert(&addtab, fullname, upb_value_ptr(def)))
+        goto oom_err;
+    }
+  }
+
+  /* Add standalone fielddefs (ie. extensions) to the appropriate messages.
+   * If the appropriate message only exists in the existing symtab, duplicate
+   * it so we have a mutable copy we can add the fields to. */
+  for (i = 0; i < n; i++) {
+    upb_def *def = defs[i];
+    upb_fielddef *f = upb_dyncast_fielddef_mutable(def);
+    const char *msgname;
+    upb_value v;
+    upb_msgdef *m;
+
+    if (!f) continue;
+    msgname = upb_fielddef_containingtypename(f);
+    /* We validated this earlier in this function. */
+    assert(msgname);
+
+    /* If the extendee name is absolutely qualified, move past the initial ".".
+     * TODO(haberman): it is not obvious what it would mean if this was not
+     * absolutely qualified. */
+    if (msgname[0] == '.') {
+      msgname++;
+    }
+
+    if (upb_strtable_lookup(&addtab, msgname, &v)) {
+      /* Extendee is in the set of defs the user asked us to add. */
+      m = upb_value_getptr(v);
+    } else {
+      /* Need to find and dup the extendee from the existing symtab. */
+      const upb_msgdef *frozen_m = upb_symtab_lookupmsg(s, msgname);
+      if (!frozen_m) {
+        upb_status_seterrf(status,
+                           "Tried to extend message %s that does not exist "
+                           "in this SymbolTable.",
+                           msgname);
+        goto err;
+      }
+      m = upb_msgdef_dup(frozen_m, s);
+      if (!m) goto oom_err;
+      if (!upb_strtable_insert(&addtab, msgname, upb_value_ptr(m))) {
+        upb_msgdef_unref(m, s);
+        goto oom_err;
+      }
+    }
+
+    if (!upb_msgdef_addfield(m, f, ref_donor, status)) {
+      goto err;
+    }
+  }
+
+  /* Add dups of any existing def that can reach a def with the same name as
+   * anything in our "add" set. */
+  if (!upb_inttable_init(&seen, UPB_CTYPE_BOOL)) goto oom_err;
+  upb_strtable_begin(&iter, &s->symtab);
+  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
+    upb_resolve_dfs(def, &addtab, s, &seen, status);
+    if (!upb_ok(status)) goto err;
+  }
+  upb_inttable_uninit(&seen);
+
+  /* Now using the table, resolve symbolic references for subdefs. */
+  upb_strtable_begin(&iter, &addtab);
+  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    const char *base;
+    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
+    upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
+    upb_msg_field_iter j;
+
+    if (!m) continue;
+    /* Type names are resolved relative to the message in which they appear. */
+    base = upb_msgdef_fullname(m);
+
+    for(upb_msg_field_begin(&j, m);
+        !upb_msg_field_done(&j);
+        upb_msg_field_next(&j)) {
+      upb_fielddef *f = upb_msg_iter_field(&j);
+      const char *name = upb_fielddef_subdefname(f);
+      if (name && !upb_fielddef_subdef(f)) {
+        /* Try the lookup in the current set of to-be-added defs first. If not
+         * there, try existing defs. */
+        upb_def *subdef = upb_resolvename(&addtab, base, name);
+        if (subdef == NULL) {
+          subdef = upb_resolvename(&s->symtab, base, name);
+        }
+        if (subdef == NULL) {
+          upb_status_seterrf(
+              status, "couldn't resolve name '%s' in message '%s'", name, base);
+          goto err;
+        } else if (!upb_fielddef_setsubdef(f, subdef, status)) {
+          goto err;
+        }
+      }
+    }
+  }
+
+  /* We need an array of the defs in addtab, for passing to
+   * upb_refcounted_freeze(). */
+  add_objs_size = upb_strtable_count(&addtab);
+  if (freeze_also) {
+    add_objs_size++;
+  }
+
+  add_defs = upb_gmalloc(sizeof(void*) * add_objs_size);
+  if (add_defs == NULL) goto oom_err;
+  upb_strtable_begin(&iter, &addtab);
+  for (add_n = 0; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    add_defs[add_n++] = upb_value_getptr(upb_strtable_iter_value(&iter));
+  }
+
+  /* Validate defs. */
+  if (!_upb_def_validate(add_defs, add_n, status)) {
+    goto err;
+  }
+
+  /* Cheat a little and give the array a new type.
+   * This is probably undefined behavior, but this code will be deleted soon. */
+  add_objs = (upb_refcounted**)add_defs;
+
+  freeze_n = add_n;
+  if (freeze_also) {
+    add_objs[freeze_n++] = freeze_also;
+  }
+
+  if (!upb_refcounted_freeze(add_objs, freeze_n, status,
+                             UPB_MAX_MESSAGE_DEPTH * 2)) {
+    goto err;
+  }
+
+  /* This must be delayed until all errors have been detected, since error
+   * recovery code uses this table to cleanup defs. */
+  upb_strtable_uninit(&addtab);
+
+  /* TODO(haberman) we don't properly handle errors after this point (like
+   * OOM in upb_strtable_insert() below). */
+  for (i = 0; i < add_n; i++) {
+    upb_def *def = (upb_def*)add_objs[i];
+    const char *name = upb_def_fullname(def);
+    upb_value v;
+    bool success;
+
+    if (upb_strtable_remove(&s->symtab, name, &v)) {
+      const upb_def *def = upb_value_getptr(v);
+      upb_def_unref(def, s);
+    }
+    success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));
+    UPB_ASSERT_VAR(success, success == true);
+  }
+  upb_gfree(add_defs);
+  return true;
+
+oom_err:
+  upb_status_seterrmsg(status, "out of memory");
+err: {
+    /* For defs the user passed in, we need to donate the refs back.  For defs
+     * we dup'd, we need to just unref them. */
+    upb_strtable_begin(&iter, &addtab);
+    for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
+      bool came_from_user = def->came_from_user;
+      def->came_from_user = false;
+      if (came_from_user) {
+        upb_def_donateref(def, s, ref_donor);
+      } else {
+        upb_def_unref(def, s);
+      }
+    }
+  }
+  upb_strtable_uninit(&addtab);
+  upb_gfree(add_defs);
+  assert(!upb_ok(status));
+  return false;
+}
+
+bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
+                    void *ref_donor, upb_status *status) {
+  return symtab_add(s, defs, n, ref_donor, NULL, status);
+}
+
+bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status *status) {
+  size_t n;
+  size_t i;
+  upb_def **defs;
   bool ret;
-  upb_bufhandle handle;
-  upb_bufhandle_init(&handle);
-  upb_bufhandle_setbuf(&handle, buf, 0);
-  ret = upb_bytessink_start(sink, len, &subc);
-  if (ret && len != 0) {
-    ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) >= len);
+
+  n = upb_filedef_defcount(file);
+  defs = upb_gmalloc(sizeof(*defs) * n);
+
+  if (defs == NULL) {
+    upb_status_seterrmsg(status, "Out of memory");
+    return false;
   }
-  if (ret) {
-    ret = upb_bytessink_end(sink);
+
+  for (i = 0; i < n; i++) {
+    defs[i] = upb_filedef_mutabledef(file, i);
   }
-  upb_bufhandle_uninit(&handle);
+
+  ret = symtab_add(s, defs, n, NULL, upb_filedef_upcast_mutable(file), status);
+
+  upb_gfree(defs);
   return ret;
 }
 
-struct upb_bufsink {
-  upb_byteshandler handler;
-  upb_bytessink sink;
-  upb_env *env;
-  char *ptr;
-  size_t len, size;
-};
+/* Iteration. */
 
-static void *upb_bufsink_start(void *_sink, const void *hd, size_t size_hint) {
-  upb_bufsink *sink = _sink;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(size_hint);
-  sink->len = 0;
-  return sink;
-}
+static void advance_to_matching(upb_symtab_iter *iter) {
+  if (iter->type == UPB_DEF_ANY)
+    return;
 
-static size_t upb_bufsink_string(void *_sink, const void *hd, const char *ptr,
-                                size_t len, const upb_bufhandle *handle) {
-  upb_bufsink *sink = _sink;
-  size_t new_size = sink->size;
-
-  UPB_ASSERT(new_size > 0);
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  while (sink->len + len > new_size) {
-    new_size *= 2;
+  while (!upb_strtable_done(&iter->iter) &&
+         iter->type != upb_symtab_iter_def(iter)->type) {
+    upb_strtable_next(&iter->iter);
   }
-
-  if (new_size != sink->size) {
-    sink->ptr = upb_env_realloc(sink->env, sink->ptr, sink->size, new_size);
-    sink->size = new_size;
-  }
-
-  memcpy(sink->ptr + sink->len, ptr, len);
-  sink->len += len;
-
-  return len;
 }
 
-upb_bufsink *upb_bufsink_new(upb_env *env) {
-  upb_bufsink *sink = upb_env_malloc(env, sizeof(upb_bufsink));
-  upb_byteshandler_init(&sink->handler);
-  upb_byteshandler_setstartstr(&sink->handler, upb_bufsink_start, NULL);
-  upb_byteshandler_setstring(&sink->handler, upb_bufsink_string, NULL);
-
-  upb_bytessink_reset(&sink->sink, &sink->handler, sink);
-
-  sink->env = env;
-  sink->size = 32;
-  sink->ptr = upb_env_malloc(env, sink->size);
-  sink->len = 0;
-
-  return sink;
+void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
+                      upb_deftype_t type) {
+  upb_strtable_begin(&iter->iter, &s->symtab);
+  iter->type = type;
+  advance_to_matching(iter);
 }
 
-void upb_bufsink_free(upb_bufsink *sink) {
-  upb_env_free(sink->env, sink->ptr);
-  upb_env_free(sink->env, sink);
+void upb_symtab_next(upb_symtab_iter *iter) {
+  upb_strtable_next(&iter->iter);
+  advance_to_matching(iter);
 }
 
-upb_bytessink *upb_bufsink_sink(upb_bufsink *sink) {
-  return &sink->sink;
+bool upb_symtab_done(const upb_symtab_iter *iter) {
+  return upb_strtable_done(&iter->iter);
 }
 
-const char *upb_bufsink_getdata(const upb_bufsink *sink, size_t *len) {
-  *len = sink->len;
-  return sink->ptr;
+const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter) {
+  return upb_value_getptr(upb_strtable_iter_value(&iter->iter));
 }
 /*
 ** upb_table Implementation
@@ -6169,11 +4244,16 @@
 #define ARRAY_SIZE(x) \
     ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
 
+#ifdef NDEBUG
 static void upb_check_alloc(upb_table *t, upb_alloc *a) {
   UPB_UNUSED(t);
   UPB_UNUSED(a);
-  UPB_ASSERT_DEBUGVAR(t->alloc == a);
 }
+#else
+static void upb_check_alloc(upb_table *t, upb_alloc *a) {
+  assert(t->alloc == a);
+}
+#endif
 
 static const double MAX_LOAD = 0.85;
 
@@ -6282,7 +4362,7 @@
 
 static upb_tabent *emptyent(upb_table *t) {
   upb_tabent *e = mutable_entries(t) + upb_table_size(t);
-  while (1) { if (upb_tabent_isempty(--e)) return e; UPB_ASSERT(e > t->entries); }
+  while (1) { if (upb_tabent_isempty(--e)) return e; assert(e > t->entries); }
 }
 
 static upb_tabent *getentry_mutable(upb_table *t, uint32_t hash) {
@@ -6327,8 +4407,10 @@
   upb_tabent *mainpos_e;
   upb_tabent *our_e;
 
-  UPB_ASSERT(findentry(t, key, hash, eql) == NULL);
-  UPB_ASSERT_DEBUGVAR(val.ctype == t->ctype);
+  UPB_UNUSED(eql);
+  UPB_UNUSED(key);
+  assert(findentry(t, key, hash, eql) == NULL);
+  assert(val.ctype == t->ctype);
 
   t->count++;
   mainpos_e = getentry_mutable(t, hash);
@@ -6355,7 +4437,7 @@
       *new_e = *mainpos_e;  /* copies next. */
       while (chain->next != mainpos_e) {
         chain = (upb_tabent*)chain->next;
-        UPB_ASSERT(chain);
+        assert(chain);
       }
       chain->next = new_e;
       our_e = mainpos_e;
@@ -6364,7 +4446,7 @@
   }
   our_e->key = tabkey;
   our_e->val.val = val.val;
-  UPB_ASSERT(findentry(t, key, hash, eql) == our_e);
+  assert(findentry(t, key, hash, eql) == our_e);
 }
 
 static bool rm(upb_table *t, lookupkey_t key, upb_value *val,
@@ -6374,33 +4456,38 @@
   if (eql(chain->key, key)) {
     /* Element to remove is at the head of its chain. */
     t->count--;
-    if (val) _upb_value_setval(val, chain->val.val, t->ctype);
-    if (removed) *removed = chain->key;
+    if (val) {
+      _upb_value_setval(val, chain->val.val, t->ctype);
+    }
     if (chain->next) {
       upb_tabent *move = (upb_tabent*)chain->next;
       *chain = *move;
+      if (removed) *removed = move->key;
       move->key = 0;  /* Make the slot empty. */
     } else {
+      if (removed) *removed = chain->key;
       chain->key = 0;  /* Make the slot empty. */
     }
     return true;
   } else {
     /* Element to remove is either in a non-head position or not in the
      * table. */
-    while (chain->next && !eql(chain->next->key, key)) {
+    while (chain->next && !eql(chain->next->key, key))
       chain = (upb_tabent*)chain->next;
-    }
     if (chain->next) {
       /* Found element to remove. */
-      upb_tabent *rm = (upb_tabent*)chain->next;
-      t->count--;
-      if (val) _upb_value_setval(val, chain->next->val.val, t->ctype);
+      upb_tabent *rm;
+
+      if (val) {
+        _upb_value_setval(val, chain->next->val.val, t->ctype);
+      }
+      rm = (upb_tabent*)chain->next;
       if (removed) *removed = rm->key;
-      rm->key = 0;  /* Make the slot empty. */
+      rm->key = 0;
       chain->next = rm->next;
+      t->count--;
       return true;
     } else {
-      /* Element to remove is not in the table. */
       return false;
     }
   }
@@ -6509,7 +4596,7 @@
 
 bool upb_strtable_remove3(upb_strtable *t, const char *key, size_t len,
                          upb_value *val, upb_alloc *alloc) {
-  uint32_t hash = MurmurHash2(key, len, 0);
+  uint32_t hash = MurmurHash2(key, strlen(key), 0);
   upb_tabkey tabkey;
   if (rm(&t->t, strkey2(key, len), val, &tabkey, hash, &streql)) {
     upb_free(alloc, (void*)tabkey);
@@ -6540,19 +4627,19 @@
 }
 
 const char *upb_strtable_iter_key(const upb_strtable_iter *i) {
-  UPB_ASSERT(!upb_strtable_done(i));
+  assert(!upb_strtable_done(i));
   return upb_tabstr(str_tabent(i)->key, NULL);
 }
 
 size_t upb_strtable_iter_keylength(const upb_strtable_iter *i) {
   uint32_t len;
-  UPB_ASSERT(!upb_strtable_done(i));
+  assert(!upb_strtable_done(i));
   upb_tabstr(str_tabent(i)->key, &len);
   return len;
 }
 
 upb_value upb_strtable_iter_value(const upb_strtable_iter *i) {
-  UPB_ASSERT(!upb_strtable_done(i));
+  assert(!upb_strtable_done(i));
   return _upb_value_val(str_tabent(i)->val.val, i->t->t.ctype);
 }
 
@@ -6611,9 +4698,9 @@
     upb_inttable_iter i;
     upb_inttable_begin(&i, t);
     for(; !upb_inttable_done(&i); upb_inttable_next(&i), count++) {
-      UPB_ASSERT(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));
+      assert(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));
     }
-    UPB_ASSERT(count == upb_inttable_count(t));
+    assert(count == upb_inttable_count(t));
   }
 #endif
 }
@@ -6651,12 +4738,13 @@
                           upb_alloc *a) {
   upb_tabval tabval;
   tabval.val = val.val;
-  UPB_ASSERT(upb_arrhas(tabval));  /* This will reject (uint64_t)-1.  Fix this. */
+  UPB_UNUSED(tabval);
+  assert(upb_arrhas(tabval));  /* This will reject (uint64_t)-1.  Fix this. */
 
   upb_check_alloc(&t->t, a);
 
   if (key < t->array_size) {
-    UPB_ASSERT(!upb_arrhas(t->array[key]));
+    assert(!upb_arrhas(t->array[key]));
     t->array_count++;
     mutable_array(t)[key].val = val.val;
   } else {
@@ -6679,7 +4767,7 @@
         insert(&new_table, intkey(e->key), e->key, v, hash, &inthash, &inteql);
       }
 
-      UPB_ASSERT(t->t.count == new_table.count);
+      assert(t->t.count == new_table.count);
 
       uninit(&t->t, a);
       t->t = new_table;
@@ -6719,7 +4807,9 @@
       success = false;
     }
   } else {
-    success = rm(&t->t, intkey(key), val, NULL, upb_inthash(key), &inteql);
+    upb_tabkey removed;
+    uint32_t hash = upb_inthash(key);
+    success = rm(&t->t, intkey(key), val, &removed, hash, &inteql);
   }
   check(t);
   return success;
@@ -6733,7 +4823,7 @@
 upb_value upb_inttable_pop(upb_inttable *t) {
   upb_value val;
   bool ok = upb_inttable_remove(t, upb_inttable_count(t) - 1, &val);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return val;
 }
 
@@ -6789,7 +4879,7 @@
     arr_count -= counts[size_lg2];
   }
 
-  UPB_ASSERT(arr_count <= upb_inttable_count(t));
+  assert(arr_count <= upb_inttable_count(t));
 
   {
     /* Insert all elements into new, perfectly-sized table. */
@@ -6804,8 +4894,8 @@
       uintptr_t k = upb_inttable_iter_key(&i);
       upb_inttable_insert2(&new_t, k, upb_inttable_iter_value(&i), a);
     }
-    UPB_ASSERT(new_t.array_size == arr_size);
-    UPB_ASSERT(new_t.t.size_lg2 == hashsize_lg2);
+    assert(new_t.array_size == arr_size);
+    assert(new_t.t.size_lg2 == hashsize_lg2);
   }
   upb_inttable_uninit2(t, a);
   *t = new_t;
@@ -6814,12 +4904,12 @@
 /* Iteration. */
 
 static const upb_tabent *int_tabent(const upb_inttable_iter *i) {
-  UPB_ASSERT(!i->array_part);
+  assert(!i->array_part);
   return &i->t->t.entries[i->index];
 }
 
 static upb_tabval int_arrent(const upb_inttable_iter *i) {
-  UPB_ASSERT(i->array_part);
+  assert(i->array_part);
   return i->t->array[i->index];
 }
 
@@ -6856,12 +4946,12 @@
 }
 
 uintptr_t upb_inttable_iter_key(const upb_inttable_iter *i) {
-  UPB_ASSERT(!upb_inttable_done(i));
+  assert(!upb_inttable_done(i));
   return i->array_part ? i->index : int_tabent(i)->key;
 }
 
 upb_value upb_inttable_iter_value(const upb_inttable_iter *i) {
-  UPB_ASSERT(!upb_inttable_done(i));
+  assert(!upb_inttable_done(i));
   return _upb_value_val(
       i->array_part ? i->t->array[i->index].val : int_tabent(i)->val.val,
       i->t->t.ctype);
@@ -7079,7 +5169,7 @@
 static void nullz(upb_status *status) {
   const char *ellipsis = "...";
   size_t len = strlen(ellipsis);
-  UPB_ASSERT(sizeof(status->msg) > len);
+  assert(sizeof(status->msg) > len);
   memcpy(status->msg + sizeof(status->msg) - len, ellipsis, len);
 }
 
@@ -7162,7 +5252,7 @@
 /* Be conservative and choose 16 in case anyone is using SSE. */
 static const size_t maxalign = 16;
 
-static size_t align_up_max(size_t size) {
+static size_t align_up(size_t size) {
   return ((size + maxalign - 1) / maxalign) * maxalign;
 }
 
@@ -7186,7 +5276,7 @@
 
   block->next = a->block_head;
   block->size = size;
-  block->used = align_up_max(sizeof(mem_block));
+  block->used = align_up(sizeof(mem_block));
   block->owned = owned;
 
   a->block_head = block;
@@ -7219,7 +5309,7 @@
     return NULL;  /* We are an arena, don't need individual frees. */
   }
 
-  size = align_up_max(size);
+  size = align_up(size);
 
   /* TODO(haberman): special-case if this is a realloc of the last alloc? */
 
@@ -7289,10 +5379,6 @@
 
     block = next;
   }
-
-  /* Protect against multiple-uninit. */
-  a->cleanup_head = NULL;
-  a->block_head = NULL;
 }
 
 bool upb_arena_addcleanup(upb_arena *a, upb_cleanup_func *func, void *ud) {
@@ -7393,166 +5479,166 @@
  * Do not edit -- your changes will be discarded when the file is
  * regenerated. */
 
+#include <assert.h>
+
 
 static const upb_msgdef msgs[22];
-static const upb_fielddef fields[107];
+static const upb_fielddef fields[105];
 static const upb_enumdef enums[5];
 static const upb_tabent strentries[236];
 static const upb_tabent intentries[18];
-static const upb_tabval arrays[187];
+static const upb_tabval arrays[184];
 
 #ifdef UPB_DEBUG_REFS
-static upb_inttable reftables[268];
+static upb_inttable reftables[264];
 #endif
 
 static const upb_msgdef msgs[22] = {
-  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 41, 8, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[0]), false, UPB_SYNTAX_PROTO2, &reftables[0], &reftables[1]),
-  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]), false, UPB_SYNTAX_PROTO2, &reftables[2], &reftables[3]),
-  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ReservedRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[14], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[20]), false, UPB_SYNTAX_PROTO2, &reftables[4], &reftables[5]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[17], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[24]), false, UPB_SYNTAX_PROTO2, &reftables[6], &reftables[7]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 9, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[21], 4, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]), false, UPB_SYNTAX_PROTO2, &reftables[8], &reftables[9]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 9, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[25], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[32]), false, UPB_SYNTAX_PROTO2, &reftables[10], &reftables[11]),
-  UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[29], 2, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[36]), false, UPB_SYNTAX_PROTO2, &reftables[12], &reftables[13]),
-  UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 24, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[40]), false, UPB_SYNTAX_PROTO2, &reftables[14], &reftables[15]),
-  UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 13, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[42], 11, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[56]), false, UPB_SYNTAX_PROTO2, &reftables[16], &reftables[17]),
-  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 43, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[53], 13, 12), UPB_STRTABLE_INIT(12, 15, UPB_CTYPE_PTR, 4, &strentries[72]), false, UPB_SYNTAX_PROTO2, &reftables[18], &reftables[19]),
-  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[66], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[88]), false, UPB_SYNTAX_PROTO2, &reftables[20], &reftables[21]),
-  UPB_MSGDEF_INIT("google.protobuf.FileOptions", 38, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 42, 17), UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, &reftables[22], &reftables[23]),
-  UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 11, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[110], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, &reftables[24], &reftables[25]),
-  UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 16, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[118], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, &reftables[26], &reftables[27]),
-  UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[125], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, &reftables[28], &reftables[29]),
-  UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[126], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, &reftables[30], &reftables[31]),
-  UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[128], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, &reftables[32], &reftables[33]),
-  UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[132], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, &reftables[34], &reftables[35]),
-  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[133], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, &reftables[36], &reftables[37]),
-  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 20, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[135], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, &reftables[38], &reftables[39]),
-  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 19, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[142], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, &reftables[40], &reftables[41]),
-  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 7, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[151], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, &reftables[42], &reftables[43]),
+  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 40, 8, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[0]), false, UPB_SYNTAX_PROTO2, &reftables[0], &reftables[1]),
+  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 4, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]), false, UPB_SYNTAX_PROTO2, &reftables[2], &reftables[3]),
+  UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ReservedRange", 4, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[14], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[20]), false, UPB_SYNTAX_PROTO2, &reftables[4], &reftables[5]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[17], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[24]), false, UPB_SYNTAX_PROTO2, &reftables[6], &reftables[7]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[21], 4, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]), false, UPB_SYNTAX_PROTO2, &reftables[8], &reftables[9]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 8, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[25], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[32]), false, UPB_SYNTAX_PROTO2, &reftables[10], &reftables[11]),
+  UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 7, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[29], 2, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[36]), false, UPB_SYNTAX_PROTO2, &reftables[12], &reftables[13]),
+  UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 23, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[40]), false, UPB_SYNTAX_PROTO2, &reftables[14], &reftables[15]),
+  UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 12, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[42], 11, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[56]), false, UPB_SYNTAX_PROTO2, &reftables[16], &reftables[17]),
+  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 42, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[53], 13, 12), UPB_STRTABLE_INIT(12, 15, UPB_CTYPE_PTR, 4, &strentries[72]), false, UPB_SYNTAX_PROTO2, &reftables[18], &reftables[19]),
+  UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[66], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[88]), false, UPB_SYNTAX_PROTO2, &reftables[20], &reftables[21]),
+  UPB_MSGDEF_INIT("google.protobuf.FileOptions", 31, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 39, 15), UPB_STRTABLE_INIT(16, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, &reftables[22], &reftables[23]),
+  UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 10, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[107], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, &reftables[24], &reftables[25]),
+  UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 15, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[115], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, &reftables[26], &reftables[27]),
+  UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 7, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[122], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, &reftables[28], &reftables[29]),
+  UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[123], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, &reftables[30], &reftables[31]),
+  UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 11, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[125], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, &reftables[32], &reftables[33]),
+  UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 7, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[129], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, &reftables[34], &reftables[35]),
+  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 6, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[130], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, &reftables[36], &reftables[37]),
+  UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 19, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[132], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, &reftables[38], &reftables[39]),
+  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 18, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[139], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, &reftables[40], &reftables[41]),
+  UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[148], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, &reftables[42], &reftables[43]),
 };
 
-static const upb_fielddef fields[107] = {
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL, 16, 6, {0},&reftables[44], &reftables[45]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL, 7, 1, {0},&reftables[46], &reftables[47]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL, 24, 12, {0},&reftables[48], &reftables[49]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[11], NULL, 18, 6, {0},&reftables[50], &reftables[51]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "client_streaming", 5, &msgs[13], NULL, 14, 4, {0},&reftables[52], &reftables[53]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "csharp_namespace", 37, &msgs[11], NULL, 28, 14, {0},&reftables[54], &reftables[55]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[8], (const upb_def*)(&enums[2]), 7, 1, {0},&reftables[56], &reftables[57]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[7], NULL, 17, 7, {0},&reftables[58], &reftables[59]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[9], NULL, 31, 8, {0},&reftables[60], &reftables[61]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[8], NULL, 9, 3, {0},&reftables[62], &reftables[63]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[14], NULL, 7, 1, {0},&reftables[64], &reftables[65]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[12], NULL, 9, 3, {0},&reftables[66], &reftables[67]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 23, &msgs[11], NULL, 22, 10, {0},&reftables[68], &reftables[69]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 1, &msgs[6], NULL, 7, 1, {0},&reftables[70], &reftables[71]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[4], NULL, 8, 2, {0},&reftables[72], &reftables[73]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[17], NULL, 7, 1, {0},&reftables[74], &reftables[75]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[20], NULL, 12, 4, {0},&reftables[76], &reftables[77]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[2], NULL, 4, 1, {0},&reftables[78], &reftables[79]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 4, 1, {0},&reftables[80], &reftables[81]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[9], (const upb_def*)(&msgs[3]), 14, 1, {0},&reftables[82], &reftables[83]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[3]), 19, 2, {0},&reftables[84], &reftables[85]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[7], NULL, 8, 2, {0},&reftables[86], &reftables[87]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[7]), 25, 4, {0},&reftables[88], &reftables[89]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[9], (const upb_def*)(&msgs[7]), 20, 3, {0},&reftables[90], &reftables[91]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 22, 3, {0},&reftables[92], &reftables[93]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[7]), 13, 0, {0},&reftables[94], &reftables[95]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[10], (const upb_def*)(&msgs[9]), 6, 0, {0},&reftables[96], &reftables[97]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[11], NULL, 15, 5, {0},&reftables[98], &reftables[99]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[20], NULL, 7, 1, {0},&reftables[100], &reftables[101]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[13], NULL, 8, 2, {0},&reftables[102], &reftables[103]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[21], NULL, 6, 1, {0},&reftables[104], &reftables[105]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[11], NULL, 21, 9, {0},&reftables[106], &reftables[107]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[11], NULL, 19, 7, {0},&reftables[108], &reftables[109]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[11], NULL, 14, 4, {0},&reftables[110], &reftables[111]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[11], NULL, 10, 2, {0},&reftables[112], &reftables[113]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[11], NULL, 7, 1, {0},&reftables[114], &reftables[115]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_string_check_utf8", 27, &msgs[11], NULL, 23, 11, {0},&reftables[116], &reftables[117]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "javanano_use_deprecated_package", 38, &msgs[11], NULL, 31, 15, {0},&reftables[118], &reftables[119]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "json_name", 10, &msgs[7], NULL, 21, 9, {0},&reftables[120], &reftables[121]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "jstype", 6, &msgs[8], (const upb_def*)(&enums[3]), 11, 5, {0},&reftables[122], &reftables[123]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[7], (const upb_def*)(&enums[0]), 12, 4, {0},&reftables[124], &reftables[125]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[8], NULL, 10, 4, {0},&reftables[126], &reftables[127]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[19], NULL, 9, 2, {0},&reftables[128], &reftables[129]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "leading_detached_comments", 6, &msgs[19], NULL, 17, 4, {0},&reftables[130], &reftables[131]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[18], (const upb_def*)(&msgs[19]), 6, 0, {0},&reftables[132], &reftables[133]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "map_entry", 7, &msgs[12], NULL, 10, 4, {0},&reftables[134], &reftables[135]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[12], NULL, 7, 1, {0},&reftables[136], &reftables[137]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]), 11, 0, {0},&reftables[138], &reftables[139]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]), 7, 0, {0},&reftables[140], &reftables[141]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]), 6, 0, {0},&reftables[142], &reftables[143]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 5, 1, {0},&reftables[144], &reftables[145]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 23, 6, {0},&reftables[146], &reftables[147]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 9, 2, {0},&reftables[148], &reftables[149]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL, 9, 2, {0},&reftables[150], &reftables[151]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 3, 0, {0},&reftables[152], &reftables[153]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 5, 1, {0},&reftables[154], &reftables[155]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL, 5, 1, {0},&reftables[156], &reftables[157]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 33, 8, {0},&reftables[158], &reftables[159]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL, 3, 0, {0},&reftables[160], &reftables[161]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL, 11, 3, {0},&reftables[162], &reftables[163]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 16, 1, {0},&reftables[164], &reftables[165]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL, 8, 2, {0},&reftables[166], &reftables[167]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 11, 3, {0},&reftables[168], &reftables[169]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 8, 2, {0},&reftables[170], &reftables[171]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL, 25, 13, {0},&reftables[172], &reftables[173]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]), 29, 6, {0},&reftables[174], &reftables[175]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL, 20, 8, {0},&reftables[176], &reftables[177]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]), 13, 3, {0},&reftables[178], &reftables[179]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 26, 5, {0},&reftables[180], &reftables[181]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 21, 4, {0},&reftables[182], &reftables[183]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 4, 0, {0},&reftables[184], &reftables[185]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 4, 0, {0},&reftables[186], &reftables[187]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 8, 1, {0},&reftables[188], &reftables[189]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 8, 1, {0},&reftables[190], &reftables[191]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 4, 0, {0},&reftables[192], &reftables[193]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL, 11, 3, {0},&reftables[194], &reftables[195]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL, 26, 7, {0},&reftables[196], &reftables[197]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL, 8, 2, {0},&reftables[198], &reftables[199]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL, 5, 0, {0},&reftables[200], &reftables[201]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_class_prefix", 40, &msgs[11], NULL, 32, 16, {0},&reftables[202], &reftables[203]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_namespace", 41, &msgs[11], NULL, 35, 17, {0},&reftables[204], &reftables[205]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 10, 2, {0},&reftables[206], &reftables[207]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 36, 9, {0},&reftables[208], &reftables[209]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 20, 8, {0},&reftables[210], &reftables[211]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 38, 9, {0},&reftables[212], &reftables[213]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 32, 7, {0},&reftables[214], &reftables[215]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 15, 5, {0},&reftables[216], &reftables[217]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 17, 2, {0},&reftables[218], &reftables[219]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 22, 5, {0},&reftables[220], &reftables[221]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 8, 1, {0},&reftables[222], &reftables[223]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 3, 0, {0},&reftables[224], &reftables[225]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 3, 0, {0},&reftables[226], &reftables[227]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 13, 5, {0},&reftables[228], &reftables[229]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 40, 11, {0},&reftables[230], &reftables[231]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 12, 3, {0},&reftables[232], &reftables[233]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 13, 5, {0},&reftables[234], &reftables[235]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 14, 6, {0},&reftables[236], &reftables[237]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[238], &reftables[239]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[240], &reftables[241]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[242], &reftables[243]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[244], &reftables[245]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[246], &reftables[247]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[248], &reftables[249]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[250], &reftables[251]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 7, 0, {0},&reftables[252], &reftables[253]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 12, 6, {0},&reftables[254], &reftables[255]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 39, 10, {0},&reftables[256], &reftables[257]),
+static const upb_fielddef fields[105] = {
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL, 15, 6, {0},&reftables[44], &reftables[45]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL, 6, 1, {0},&reftables[46], &reftables[47]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL, 23, 12, {0},&reftables[48], &reftables[49]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[11], NULL, 17, 6, {0},&reftables[50], &reftables[51]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "client_streaming", 5, &msgs[13], NULL, 13, 4, {0},&reftables[52], &reftables[53]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "csharp_namespace", 37, &msgs[11], NULL, 27, 14, {0},&reftables[54], &reftables[55]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[8], (const upb_def*)(&enums[2]), 6, 1, {0},&reftables[56], &reftables[57]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[7], NULL, 16, 7, {0},&reftables[58], &reftables[59]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[9], NULL, 30, 8, {0},&reftables[60], &reftables[61]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[12], NULL, 8, 3, {0},&reftables[62], &reftables[63]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[8], NULL, 8, 3, {0},&reftables[64], &reftables[65]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[14], NULL, 6, 1, {0},&reftables[66], &reftables[67]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 23, &msgs[11], NULL, 21, 10, {0},&reftables[68], &reftables[69]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[4], NULL, 7, 2, {0},&reftables[70], &reftables[71]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[17], NULL, 6, 1, {0},&reftables[72], &reftables[73]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 1, &msgs[6], NULL, 6, 1, {0},&reftables[74], &reftables[75]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[20], NULL, 11, 4, {0},&reftables[76], &reftables[77]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[2], NULL, 3, 1, {0},&reftables[78], &reftables[79]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 3, 1, {0},&reftables[80], &reftables[81]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[3]), 18, 2, {0},&reftables[82], &reftables[83]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[9], (const upb_def*)(&msgs[3]), 13, 1, {0},&reftables[84], &reftables[85]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[7], NULL, 7, 2, {0},&reftables[86], &reftables[87]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[7]), 24, 4, {0},&reftables[88], &reftables[89]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[9], (const upb_def*)(&msgs[7]), 19, 3, {0},&reftables[90], &reftables[91]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 21, 3, {0},&reftables[92], &reftables[93]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[7]), 12, 0, {0},&reftables[94], &reftables[95]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[10], (const upb_def*)(&msgs[9]), 5, 0, {0},&reftables[96], &reftables[97]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[11], NULL, 14, 5, {0},&reftables[98], &reftables[99]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[20], NULL, 6, 1, {0},&reftables[100], &reftables[101]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[13], NULL, 7, 2, {0},&reftables[102], &reftables[103]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[21], NULL, 5, 1, {0},&reftables[104], &reftables[105]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[11], NULL, 20, 9, {0},&reftables[106], &reftables[107]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[11], NULL, 18, 7, {0},&reftables[108], &reftables[109]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[11], NULL, 13, 4, {0},&reftables[110], &reftables[111]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[11], NULL, 9, 2, {0},&reftables[112], &reftables[113]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[11], NULL, 6, 1, {0},&reftables[114], &reftables[115]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_string_check_utf8", 27, &msgs[11], NULL, 22, 11, {0},&reftables[116], &reftables[117]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "javanano_use_deprecated_package", 38, &msgs[11], NULL, 30, 15, {0},&reftables[118], &reftables[119]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "json_name", 10, &msgs[7], NULL, 20, 9, {0},&reftables[120], &reftables[121]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "jstype", 6, &msgs[8], (const upb_def*)(&enums[3]), 10, 5, {0},&reftables[122], &reftables[123]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[7], (const upb_def*)(&enums[0]), 11, 4, {0},&reftables[124], &reftables[125]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[8], NULL, 9, 4, {0},&reftables[126], &reftables[127]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[19], NULL, 8, 2, {0},&reftables[128], &reftables[129]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "leading_detached_comments", 6, &msgs[19], NULL, 16, 4, {0},&reftables[130], &reftables[131]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[18], (const upb_def*)(&msgs[19]), 5, 0, {0},&reftables[132], &reftables[133]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "map_entry", 7, &msgs[12], NULL, 9, 4, {0},&reftables[134], &reftables[135]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[12], NULL, 6, 1, {0},&reftables[136], &reftables[137]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]), 10, 0, {0},&reftables[138], &reftables[139]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]), 6, 0, {0},&reftables[140], &reftables[141]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 8, 2, {0},&reftables[142], &reftables[143]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 2, 0, {0},&reftables[144], &reftables[145]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]), 5, 0, {0},&reftables[146], &reftables[147]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 32, 8, {0},&reftables[148], &reftables[149]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 4, 1, {0},&reftables[150], &reftables[151]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 22, 6, {0},&reftables[152], &reftables[153]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL, 4, 1, {0},&reftables[154], &reftables[155]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 4, 1, {0},&reftables[156], &reftables[157]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL, 8, 2, {0},&reftables[158], &reftables[159]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL, 2, 0, {0},&reftables[160], &reftables[161]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL, 10, 3, {0},&reftables[162], &reftables[163]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 15, 1, {0},&reftables[164], &reftables[165]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL, 7, 2, {0},&reftables[166], &reftables[167]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 7, 2, {0},&reftables[168], &reftables[169]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 10, 3, {0},&reftables[170], &reftables[171]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL, 24, 13, {0},&reftables[172], &reftables[173]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]), 28, 6, {0},&reftables[174], &reftables[175]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL, 19, 8, {0},&reftables[176], &reftables[177]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]), 12, 3, {0},&reftables[178], &reftables[179]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 25, 5, {0},&reftables[180], &reftables[181]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 20, 4, {0},&reftables[182], &reftables[183]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 3, 0, {0},&reftables[184], &reftables[185]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 3, 0, {0},&reftables[186], &reftables[187]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 7, 1, {0},&reftables[188], &reftables[189]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 3, 0, {0},&reftables[190], &reftables[191]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 7, 1, {0},&reftables[192], &reftables[193]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL, 10, 3, {0},&reftables[194], &reftables[195]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL, 25, 7, {0},&reftables[196], &reftables[197]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL, 7, 2, {0},&reftables[198], &reftables[199]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL, 4, 0, {0},&reftables[200], &reftables[201]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 9, 2, {0},&reftables[202], &reftables[203]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 35, 9, {0},&reftables[204], &reftables[205]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 19, 8, {0},&reftables[206], &reftables[207]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 37, 9, {0},&reftables[208], &reftables[209]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 31, 7, {0},&reftables[210], &reftables[211]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 14, 5, {0},&reftables[212], &reftables[213]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 16, 2, {0},&reftables[214], &reftables[215]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 21, 5, {0},&reftables[216], &reftables[217]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 7, 1, {0},&reftables[218], &reftables[219]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 2, 0, {0},&reftables[220], &reftables[221]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 2, 0, {0},&reftables[222], &reftables[223]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 12, 5, {0},&reftables[224], &reftables[225]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 39, 11, {0},&reftables[226], &reftables[227]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 11, 3, {0},&reftables[228], &reftables[229]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 12, 5, {0},&reftables[230], &reftables[231]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 13, 6, {0},&reftables[232], &reftables[233]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[234], &reftables[235]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[236], &reftables[237]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[238], &reftables[239]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[240], &reftables[241]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[242], &reftables[243]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[244], &reftables[245]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]), 5, 0, {0},&reftables[246], &reftables[247]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 6, 0, {0},&reftables[248], &reftables[249]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 11, 6, {0},&reftables[250], &reftables[251]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 38, 10, {0},&reftables[252], &reftables[253]),
 };
 
 static const upb_enumdef enums[5] = {
-  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[188]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[154], 4, 3), 0, &reftables[258], &reftables[259]),
-  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[192]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[158], 19, 18), 0, &reftables[260], &reftables[261]),
-  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[224]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[177], 3, 3), 0, &reftables[262], &reftables[263]),
-  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.JSType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[228]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[180], 3, 3), 0, &reftables[264], &reftables[265]),
-  UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[232]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[183], 4, 3), 0, &reftables[266], &reftables[267]),
+  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[188]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[151], 4, 3), 0, &reftables[254], &reftables[255]),
+  UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[192]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[155], 19, 18), 0, &reftables[256], &reftables[257]),
+  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[224]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[174], 3, 3), 0, &reftables[258], &reftables[259]),
+  UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.JSType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[228]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[177], 3, 3), 0, &reftables[260], &reftables[261]),
+  UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[232]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[180], 4, 3), 0, &reftables[262], &reftables[263]),
 };
 
 static const upb_tabent strentries[236] = {
   {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[22]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "reserved_name"), UPB_TABVALUE_PTR_INIT(&fields[84]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL},
+  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "reserved_name"), UPB_TABVALUE_PTR_INIT(&fields[82]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[52]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7561,53 +5647,53 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "nested_type"), UPB_TABVALUE_PTR_INIT(&fields[60]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "reserved_range"), UPB_TABVALUE_PTR_INIT(&fields[85]), NULL},
+  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "reserved_range"), UPB_TABVALUE_PTR_INIT(&fields[83]), NULL},
   {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[68]), NULL},
   {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "oneof_decl"), UPB_TABVALUE_PTR_INIT(&fields[65]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), &strentries[13]},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[91]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[19]), &strentries[13]},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[89]), NULL},
   {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[18]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[90]), NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[88]), NULL},
   {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[17]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[104]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[52]), &strentries[26]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[49]), &strentries[26]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "allow_alias"), UPB_TABVALUE_PTR_INIT(&fields[1]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[63]), NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[62]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[50]), &strentries[34]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[34]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "oneof_index"), UPB_TABVALUE_PTR_INIT(&fields[66]), NULL},
   {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "label"), UPB_TABVALUE_PTR_INIT(&fields[40]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[56]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[62]), &strentries[53]},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[63]), &strentries[53]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "extendee"), UPB_TABVALUE_PTR_INIT(&fields[21]), NULL},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[94]), NULL},
   {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "json_name"), UPB_TABVALUE_PTR_INIT(&fields[38]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[95]), &strentries[50]},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[93]), &strentries[50]},
   {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "default_value"), UPB_TABVALUE_PTR_INIT(&fields[7]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[105]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7618,25 +5704,25 @@
   {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "ctype"), UPB_TABVALUE_PTR_INIT(&fields[6]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "jstype"), UPB_TABVALUE_PTR_INIT(&fields[39]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[9]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[23]), NULL},
-  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[106]), NULL},
+  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[104]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[87]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[54]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[85]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[88]), NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[86]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "syntax"), UPB_TABVALUE_PTR_INIT(&fields[93]), NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "syntax"), UPB_TABVALUE_PTR_INIT(&fields[91]), NULL},
   {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "dependency"), UPB_TABVALUE_PTR_INIT(&fields[8]), NULL},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "message_type"), UPB_TABVALUE_PTR_INIT(&fields[47]), NULL},
   {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "package"), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL},
   {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[69]), &strentries[86]},
-  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[19]), NULL},
-  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[82]), &strentries[85]},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), NULL},
+  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[80]), &strentries[85]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "file"), UPB_TABVALUE_PTR_INIT(&fields[26]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7644,7 +5730,7 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "cc_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[3]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "csharp_namespace"), UPB_TABVALUE_PTR_INIT(&fields[5]), &strentries[116]},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "csharp_namespace"), UPB_TABVALUE_PTR_INIT(&fields[5]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7657,17 +5743,17 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "java_outer_classname"), UPB_TABVALUE_PTR_INIT(&fields[34]), NULL},
-  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "php_namespace"), UPB_TABVALUE_PTR_INIT(&fields[80]), &strentries[113]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[95]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "java_multiple_files"), UPB_TABVALUE_PTR_INIT(&fields[33]), &strentries[117]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\025", "\000", "\000", "\000", "java_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[32]), &strentries[118]},
   {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "java_generate_equals_and_hash"), UPB_TABVALUE_PTR_INIT(&fields[31]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "php_class_prefix"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "javanano_use_deprecated_package"), UPB_TABVALUE_PTR_INIT(&fields[37]), &strentries[123]},
-  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[83]), NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[81]), NULL},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "optimize_for"), UPB_TABVALUE_PTR_INIT(&fields[67]), NULL},
   {UPB_TABKEY_STR("\026", "\000", "\000", "\000", "java_string_check_utf8"), UPB_TABVALUE_PTR_INIT(&fields[36]), NULL},
   {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[12]), &strentries[119]},
@@ -7677,32 +5763,32 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[11]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[9]), NULL},
   {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "map_entry"), UPB_TABVALUE_PTR_INIT(&fields[45]), NULL},
   {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "no_standard_descriptor_accessor"), UPB_TABVALUE_PTR_INIT(&fields[61]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "client_streaming"), UPB_TABVALUE_PTR_INIT(&fields[4]), NULL},
-  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "server_streaming"), UPB_TABVALUE_PTR_INIT(&fields[86]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "server_streaming"), UPB_TABVALUE_PTR_INIT(&fields[84]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[56]), NULL},
   {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "input_type"), UPB_TABVALUE_PTR_INIT(&fields[29]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "output_type"), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL},
-  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL},
   {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[11]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[54]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[50]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[72]), &strentries[150]},
   {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "method"), UPB_TABVALUE_PTR_INIT(&fields[48]), NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[149]},
-  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL},
-  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[57]), &strentries[149]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7712,15 +5798,15 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[89]), &strentries[167]},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[87]), &strentries[167]},
   {UPB_TABKEY_STR("\031", "\000", "\000", "\000", "leading_detached_comments"), UPB_TABVALUE_PTR_INIT(&fields[43]), &strentries[165]},
-  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[94]), NULL},
+  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[92]), NULL},
   {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "leading_comments"), UPB_TABVALUE_PTR_INIT(&fields[42]), &strentries[164]},
   {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "path"), UPB_TABVALUE_PTR_INIT(&fields[78]), NULL},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "double_value"), UPB_TABVALUE_PTR_INIT(&fields[16]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[49]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
@@ -7730,9 +5816,9 @@
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[81]), NULL},
+  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL},
   {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "identifier_value"), UPB_TABVALUE_PTR_INIT(&fields[28]), NULL},
-  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[92]), &strentries[182]},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[90]), &strentries[182]},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "is_extension"), UPB_TABVALUE_PTR_INIT(&fields[30]), NULL},
@@ -7789,92 +5875,92 @@
 
 static const upb_tabent intentries[18] = {
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL},
-  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[95]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[11]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
   {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
+  {UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL},
   {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
-  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL},
 };
 
-static const upb_tabval arrays[187] = {
+static const upb_tabval arrays[184] = {
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[57]),
+  UPB_TABVALUE_PTR_INIT(&fields[52]),
   UPB_TABVALUE_PTR_INIT(&fields[25]),
   UPB_TABVALUE_PTR_INIT(&fields[60]),
-  UPB_TABVALUE_PTR_INIT(&fields[20]),
+  UPB_TABVALUE_PTR_INIT(&fields[19]),
   UPB_TABVALUE_PTR_INIT(&fields[24]),
   UPB_TABVALUE_PTR_INIT(&fields[22]),
   UPB_TABVALUE_PTR_INIT(&fields[68]),
   UPB_TABVALUE_PTR_INIT(&fields[65]),
-  UPB_TABVALUE_PTR_INIT(&fields[85]),
-  UPB_TABVALUE_PTR_INIT(&fields[84]),
+  UPB_TABVALUE_PTR_INIT(&fields[83]),
+  UPB_TABVALUE_PTR_INIT(&fields[82]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[91]),
+  UPB_TABVALUE_PTR_INIT(&fields[89]),
   UPB_TABVALUE_PTR_INIT(&fields[18]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[90]),
+  UPB_TABVALUE_PTR_INIT(&fields[88]),
   UPB_TABVALUE_PTR_INIT(&fields[17]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[52]),
-  UPB_TABVALUE_PTR_INIT(&fields[104]),
-  UPB_TABVALUE_PTR_INIT(&fields[73]),
+  UPB_TABVALUE_PTR_INIT(&fields[49]),
+  UPB_TABVALUE_PTR_INIT(&fields[102]),
+  UPB_TABVALUE_PTR_INIT(&fields[74]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[1]),
-  UPB_TABVALUE_PTR_INIT(&fields[14]),
-  UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[50]),
-  UPB_TABVALUE_PTR_INIT(&fields[63]),
-  UPB_TABVALUE_PTR_INIT(&fields[74]),
-  UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[13]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[56]),
-  UPB_TABVALUE_PTR_INIT(&fields[21]),
+  UPB_TABVALUE_PTR_INIT(&fields[53]),
   UPB_TABVALUE_PTR_INIT(&fields[62]),
+  UPB_TABVALUE_PTR_INIT(&fields[73]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[15]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[55]),
+  UPB_TABVALUE_PTR_INIT(&fields[21]),
+  UPB_TABVALUE_PTR_INIT(&fields[63]),
   UPB_TABVALUE_PTR_INIT(&fields[40]),
-  UPB_TABVALUE_PTR_INIT(&fields[95]),
-  UPB_TABVALUE_PTR_INIT(&fields[96]),
+  UPB_TABVALUE_PTR_INIT(&fields[93]),
+  UPB_TABVALUE_PTR_INIT(&fields[94]),
   UPB_TABVALUE_PTR_INIT(&fields[7]),
-  UPB_TABVALUE_PTR_INIT(&fields[70]),
+  UPB_TABVALUE_PTR_INIT(&fields[71]),
   UPB_TABVALUE_PTR_INIT(&fields[66]),
   UPB_TABVALUE_PTR_INIT(&fields[38]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[6]),
   UPB_TABVALUE_PTR_INIT(&fields[77]),
-  UPB_TABVALUE_PTR_INIT(&fields[9]),
+  UPB_TABVALUE_PTR_INIT(&fields[10]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[41]),
   UPB_TABVALUE_PTR_INIT(&fields[39]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[105]),
+  UPB_TABVALUE_PTR_INIT(&fields[103]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[51]),
+  UPB_TABVALUE_PTR_INIT(&fields[54]),
   UPB_TABVALUE_PTR_INIT(&fields[76]),
   UPB_TABVALUE_PTR_INIT(&fields[8]),
   UPB_TABVALUE_PTR_INIT(&fields[47]),
-  UPB_TABVALUE_PTR_INIT(&fields[19]),
-  UPB_TABVALUE_PTR_INIT(&fields[87]),
+  UPB_TABVALUE_PTR_INIT(&fields[20]),
+  UPB_TABVALUE_PTR_INIT(&fields[85]),
   UPB_TABVALUE_PTR_INIT(&fields[23]),
   UPB_TABVALUE_PTR_INIT(&fields[69]),
-  UPB_TABVALUE_PTR_INIT(&fields[88]),
-  UPB_TABVALUE_PTR_INIT(&fields[82]),
-  UPB_TABVALUE_PTR_INIT(&fields[106]),
-  UPB_TABVALUE_PTR_INIT(&fields[93]),
+  UPB_TABVALUE_PTR_INIT(&fields[86]),
+  UPB_TABVALUE_PTR_INIT(&fields[80]),
+  UPB_TABVALUE_PTR_INIT(&fields[104]),
+  UPB_TABVALUE_PTR_INIT(&fields[91]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[26]),
   UPB_TABVALUE_EMPTY_INIT,
@@ -7895,7 +5981,7 @@
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[3]),
   UPB_TABVALUE_PTR_INIT(&fields[32]),
-  UPB_TABVALUE_PTR_INIT(&fields[83]),
+  UPB_TABVALUE_PTR_INIT(&fields[81]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[31]),
   UPB_TABVALUE_EMPTY_INIT,
@@ -7917,28 +6003,25 @@
   UPB_TABVALUE_PTR_INIT(&fields[5]),
   UPB_TABVALUE_PTR_INIT(&fields[37]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[79]),
-  UPB_TABVALUE_PTR_INIT(&fields[80]),
-  UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[46]),
   UPB_TABVALUE_PTR_INIT(&fields[61]),
-  UPB_TABVALUE_PTR_INIT(&fields[11]),
+  UPB_TABVALUE_PTR_INIT(&fields[9]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[45]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[55]),
+  UPB_TABVALUE_PTR_INIT(&fields[56]),
   UPB_TABVALUE_PTR_INIT(&fields[29]),
   UPB_TABVALUE_PTR_INIT(&fields[75]),
-  UPB_TABVALUE_PTR_INIT(&fields[71]),
+  UPB_TABVALUE_PTR_INIT(&fields[70]),
   UPB_TABVALUE_PTR_INIT(&fields[4]),
-  UPB_TABVALUE_PTR_INIT(&fields[86]),
+  UPB_TABVALUE_PTR_INIT(&fields[84]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[54]),
+  UPB_TABVALUE_PTR_INIT(&fields[50]),
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[53]),
+  UPB_TABVALUE_PTR_INIT(&fields[57]),
   UPB_TABVALUE_PTR_INIT(&fields[48]),
   UPB_TABVALUE_PTR_INIT(&fields[72]),
   UPB_TABVALUE_EMPTY_INIT,
@@ -7946,19 +6029,19 @@
   UPB_TABVALUE_PTR_INIT(&fields[44]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[78]),
-  UPB_TABVALUE_PTR_INIT(&fields[89]),
+  UPB_TABVALUE_PTR_INIT(&fields[87]),
   UPB_TABVALUE_PTR_INIT(&fields[42]),
-  UPB_TABVALUE_PTR_INIT(&fields[94]),
+  UPB_TABVALUE_PTR_INIT(&fields[92]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[43]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_EMPTY_INIT,
-  UPB_TABVALUE_PTR_INIT(&fields[49]),
+  UPB_TABVALUE_PTR_INIT(&fields[51]),
   UPB_TABVALUE_PTR_INIT(&fields[28]),
-  UPB_TABVALUE_PTR_INIT(&fields[81]),
+  UPB_TABVALUE_PTR_INIT(&fields[79]),
   UPB_TABVALUE_PTR_INIT(&fields[59]),
   UPB_TABVALUE_PTR_INIT(&fields[16]),
-  UPB_TABVALUE_PTR_INIT(&fields[92]),
+  UPB_TABVALUE_PTR_INIT(&fields[90]),
   UPB_TABVALUE_PTR_INIT(&fields[0]),
   UPB_TABVALUE_EMPTY_INIT,
   UPB_TABVALUE_PTR_INIT(&fields[58]),
@@ -7999,11 +6082,7 @@
 };
 
 #ifdef UPB_DEBUG_REFS
-static upb_inttable reftables[268] = {
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
-  UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
+static upb_inttable reftables[264] = {
   UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
   UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
   UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR),
@@ -8337,8 +6416,6 @@
   /* Index of the first def that is under this scope.  For msgdefs, the
    * msgdef itself is at start-1. */
   int start;
-  uint32_t oneof_start;
-  uint32_t oneof_index;
 } upb_descreader_frame;
 
 /* The maximum number of nested declarations that are allowed, ie.
@@ -8356,11 +6433,9 @@
 struct upb_descreader {
   upb_sink sink;
   upb_inttable files;
-  upb_strtable files_by_name;
   upb_filedef *file;  /* The last file in files. */
   upb_descreader_frame stack[UPB_MAX_MESSAGE_NESTING];
   int stack_len;
-  upb_inttable oneofs;
 
   uint32_t number;
   char *name;
@@ -8372,7 +6447,7 @@
   upb_fielddef *f;
 };
 
-static char *upb_gstrndup(const char *buf, size_t n) {
+static char *upb_strndup(const char *buf, size_t n) {
   char *ret = upb_gmalloc(n + 1);
   if (!ret) return NULL;
   memcpy(ret, buf, n);
@@ -8423,9 +6498,9 @@
 
 static upb_msgdef *upb_descreader_top(upb_descreader *r) {
   int index;
-  UPB_ASSERT(r->stack_len > 1);
+  assert(r->stack_len > 1);
   index = r->stack[r->stack_len-1].start - 1;
-  UPB_ASSERT(index >= 0);
+  assert(index >= 0);
   return upb_downcast_msgdef_mutable(upb_filedef_mutabledef(r->file, index));
 }
 
@@ -8438,27 +6513,16 @@
 void upb_descreader_startcontainer(upb_descreader *r) {
   upb_descreader_frame *f = &r->stack[r->stack_len++];
   f->start = upb_filedef_defcount(r->file);
-  f->oneof_start = upb_inttable_count(&r->oneofs);
-  f->oneof_index = 0;
   f->name = NULL;
 }
 
 bool upb_descreader_endcontainer(upb_descreader *r) {
-  upb_descreader_frame *f = &r->stack[r->stack_len - 1];
-
-  while (upb_inttable_count(&r->oneofs) > f->oneof_start) {
-    upb_oneofdef *o = upb_value_getptr(upb_inttable_pop(&r->oneofs));
-    bool ok = upb_msgdef_addoneof(upb_descreader_top(r), o, &r->oneofs, NULL);
-    UPB_ASSERT(ok);
-  }
-
+  upb_descreader_frame *f = &r->stack[--r->stack_len];
   if (!upb_descreader_qualify(r->file, f->name, f->start)) {
     return false;
   }
   upb_gfree(f->name);
   f->name = NULL;
-
-  r->stack_len--;
   return true;
 }
 
@@ -8468,26 +6532,6 @@
   f->name = str;
 }
 
-static upb_oneofdef *upb_descreader_getoneof(upb_descreader *r,
-                                             uint32_t index) {
-  bool found;
-  upb_value val;
-  upb_descreader_frame *f = &r->stack[r->stack_len-1];
-
-  /* DescriptorProto messages can be nested, so we will see the nested messages
-   * between when we see the FieldDescriptorProto and the OneofDescriptorProto.
-   * We need to preserve the oneofs in between these two things. */
-  index += f->oneof_start;
-
-  while (upb_inttable_count(&r->oneofs) <= index) {
-    upb_inttable_push(&r->oneofs, upb_value_ptr(upb_oneofdef_new(&r->oneofs)));
-  }
-
-  found = upb_inttable_lookup(&r->oneofs, index, &val);
-  UPB_ASSERT(found);
-  return upb_value_getptr(val);
-}
-
 /** Handlers for google.protobuf.FileDescriptorSet. ***************************/
 
 static void *fileset_startfile(void *closure, const void *hd) {
@@ -8522,12 +6566,11 @@
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
-  name = upb_gstrndup(buf, n);
-  upb_strtable_insert(&r->files_by_name, name, upb_value_ptr(r->file));
+  name = upb_strndup(buf, n);
   /* XXX: see comment at the top of the file. */
   ok = upb_filedef_setname(r->file, name, NULL);
   upb_gfree(name);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return n;
 }
 
@@ -8539,54 +6582,11 @@
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
-  package = upb_gstrndup(buf, n);
+  package = upb_strndup(buf, n);
   /* XXX: see comment at the top of the file. */
   upb_descreader_setscopename(r, package);
   ok = upb_filedef_setpackage(r->file, package, NULL);
-  UPB_ASSERT(ok);
-  return n;
-}
-
-static void *file_startphpnamespace(void *closure, const void *hd,
-                                    size_t size_hint) {
-  upb_descreader *r = closure;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(size_hint);
-
-  ok = upb_filedef_setphpnamespace(r->file, "", NULL);
-  UPB_ASSERT(ok);
-  return closure;
-}
-
-static size_t file_onphpnamespace(void *closure, const void *hd,
-                                  const char *buf, size_t n,
-                                  const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  char *php_namespace;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  php_namespace = upb_gstrndup(buf, n);
-  ok = upb_filedef_setphpnamespace(r->file, php_namespace, NULL);
-  upb_gfree(php_namespace);
-  UPB_ASSERT(ok);
-  return n;
-}
-
-static size_t file_onphpprefix(void *closure, const void *hd, const char *buf,
-                             size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  char *prefix;
-  bool ok;
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  prefix = upb_gstrndup(buf, n);
-  ok = upb_filedef_setphpprefix(r->file, prefix, NULL);
-  upb_gfree(prefix);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return n;
 }
 
@@ -8605,7 +6605,7 @@
     ok = false;
   }
 
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return n;
 }
 
@@ -8614,7 +6614,7 @@
   upb_msgdef *m = upb_msgdef_new(&m);
   bool ok = upb_filedef_addmsg(r->file, m, &m, NULL);
   UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return r;
 }
 
@@ -8623,7 +6623,7 @@
   upb_enumdef *e = upb_enumdef_new(&e);
   bool ok = upb_filedef_addenum(r->file, e, &e, NULL);
   UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return r;
 }
 
@@ -8633,22 +6633,10 @@
   r->f = upb_fielddef_new(r);
   ok = upb_filedef_addext(r->file, r->f, r, NULL);
   UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return r;
 }
 
-static size_t file_ondep(void *closure, const void *hd, const char *buf,
-                         size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  upb_value val;
-  if (upb_strtable_lookup2(&r->files_by_name, buf, n, &val)) {
-    upb_filedef_adddep(r->file, upb_value_getptr(val));
-  }
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-  return n;
-}
-
 /** Handlers for google.protobuf.EnumValueDescriptorProto. *********************/
 
 static bool enumval_startmsg(void *closure, const void *hd) {
@@ -8666,7 +6654,7 @@
   UPB_UNUSED(handle);
   /* XXX: see comment at the top of the file. */
   upb_gfree(r->name);
-  r->name = upb_gstrndup(buf, n);
+  r->name = upb_strndup(buf, n);
   r->saw_name = true;
   return n;
 }
@@ -8717,7 +6705,7 @@
 static size_t enum_onname(void *closure, const void *hd, const char *buf,
                           size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *fullname = upb_gstrndup(buf, n);
+  char *fullname = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
   /* XXX: see comment at the top of the file. */
@@ -8731,7 +6719,7 @@
 static bool field_startmsg(void *closure, const void *hd) {
   upb_descreader *r = closure;
   UPB_UNUSED(hd);
-  UPB_ASSERT(r->f);
+  assert(r->f);
   upb_gfree(r->default_string);
   r->default_string = NULL;
 
@@ -8817,9 +6805,9 @@
   UPB_UNUSED(hd);
 
   /* TODO: verify that all required fields were present. */
-  UPB_ASSERT(upb_fielddef_number(f) != 0);
-  UPB_ASSERT(upb_fielddef_name(f) != NULL);
-  UPB_ASSERT((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f));
+  assert(upb_fielddef_number(f) != 0);
+  assert(upb_fielddef_name(f) != NULL);
+  assert((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f));
 
   if (r->default_string) {
     if (upb_fielddef_issubmsg(f)) {
@@ -8878,14 +6866,14 @@
   UPB_UNUSED(hd);
 
   ok = upb_fielddef_setnumber(r->f, val, NULL);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return true;
 }
 
 static size_t field_onname(void *closure, const void *hd, const char *buf,
                            size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
@@ -8898,7 +6886,7 @@
 static size_t field_ontypename(void *closure, const void *hd, const char *buf,
                                size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
@@ -8911,7 +6899,7 @@
 static size_t field_onextendee(void *closure, const void *hd, const char *buf,
                                size_t n, const upb_bufhandle *handle) {
   upb_descreader *r = closure;
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
@@ -8931,34 +6919,7 @@
    * type yet, so we save it as a string until the end of the field.
    * XXX: see comment at the top of the file. */
   upb_gfree(r->default_string);
-  r->default_string = upb_gstrndup(buf, n);
-  return n;
-}
-
-static bool field_ononeofindex(void *closure, const void *hd, int32_t index) {
-  upb_descreader *r = closure;
-  upb_oneofdef *o = upb_descreader_getoneof(r, index);
-  bool ok = upb_oneofdef_addfield(o, r->f, &r->f, NULL);
-  UPB_UNUSED(hd);
-
-  UPB_ASSERT(ok);
-  return true;
-}
-
-/** Handlers for google.protobuf.OneofDescriptorProto. ************************/
-
-static size_t oneof_name(void *closure, const void *hd, const char *buf,
-                         size_t n, const upb_bufhandle *handle) {
-  upb_descreader *r = closure;
-  upb_descreader_frame *f = &r->stack[r->stack_len-1];
-  upb_oneofdef *o = upb_descreader_getoneof(r, f->oneof_index++);
-  char *name_null_terminated = upb_gstrndup(buf, n);
-  bool ok = upb_oneofdef_setname(o, name_null_terminated, NULL);
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
-
-  UPB_ASSERT(ok);
-  free(name_null_terminated);
+  r->default_string = upb_strndup(buf, n);
   return n;
 }
 
@@ -8989,7 +6950,7 @@
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
   /* XXX: see comment at the top of the file. */
-  char *name = upb_gstrndup(buf, n);
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
 
@@ -9003,7 +6964,7 @@
   upb_msgdef *m = upb_msgdef_new(&m);
   bool ok = upb_filedef_addmsg(r->file, m, &m, NULL);
   UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return r;
 }
 
@@ -9012,7 +6973,7 @@
   upb_fielddef *f = upb_fielddef_new(&f);
   bool ok = upb_filedef_addext(r->file, f, &f, NULL);
   UPB_UNUSED(hd);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return r;
 }
 
@@ -9028,15 +6989,9 @@
 static bool msg_endfield(void *closure, const void *hd) {
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
-  bool ok;
   UPB_UNUSED(hd);
 
-  /* Oneof fields are added to the msgdef through their oneof, so don't need to
-   * be added here. */
-  if (upb_fielddef_containingoneof(r->f) == NULL) {
-    ok = upb_msgdef_addfield(m, r->f, &r->f, NULL);
-    UPB_ASSERT(ok);
-  }
+  upb_msgdef_addfield(m, r->f, &r->f, NULL);
   r->f = NULL;
   return true;
 }
@@ -9093,8 +7048,6 @@
                                 &file_startenum, NULL);
     upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, extension),
                                 &file_startext, NULL);
-    upb_handlers_setstring(h, F(FileDescriptorProto, dependency),
-                           &file_ondep, NULL);
   } else if (upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)) {
     upb_handlers_setstartmsg(h, &enumval_startmsg, NULL);
     upb_handlers_setendmsg(h, &enumval_endmsg, NULL);
@@ -9121,25 +7074,14 @@
                            &field_onextendee, NULL);
     upb_handlers_setstring(h, F(FieldDescriptorProto, default_value),
                            &field_ondefaultval, NULL);
-    upb_handlers_setint32(h, F(FieldDescriptorProto, oneof_index),
-                          &field_ononeofindex, NULL);
-  } else if (upbdefs_google_protobuf_OneofDescriptorProto_is(m)) {
-    upb_handlers_setstring(h, F(OneofDescriptorProto, name), &oneof_name, NULL);
   } else if (upbdefs_google_protobuf_FieldOptions_is(m)) {
     upb_handlers_setbool(h, F(FieldOptions, lazy), &field_onlazy, NULL);
     upb_handlers_setbool(h, F(FieldOptions, packed), &field_onpacked, NULL);
   } else if (upbdefs_google_protobuf_MessageOptions_is(m)) {
     upb_handlers_setbool(h, F(MessageOptions, map_entry), &msg_onmapentry, NULL);
-  } else if (upbdefs_google_protobuf_FileOptions_is(m)) {
-    upb_handlers_setstring(h, F(FileOptions, php_class_prefix),
-                           &file_onphpprefix, NULL);
-    upb_handlers_setstartstr(h, F(FileOptions, php_namespace),
-                             &file_startphpnamespace, NULL);
-    upb_handlers_setstring(h, F(FileOptions, php_namespace),
-                           &file_onphpnamespace, NULL);
   }
 
-  UPB_ASSERT(upb_ok(upb_handlers_status(h)));
+  assert(upb_ok(upb_handlers_status(h)));
 }
 
 #undef F
@@ -9154,8 +7096,6 @@
 
   upb_gfree(r->name);
   upb_inttable_uninit(&r->files);
-  upb_strtable_uninit(&r->files_by_name);
-  upb_inttable_uninit(&r->oneofs);
   upb_gfree(r->default_string);
   while (r->stack_len > 0) {
     upb_descreader_frame *f = &r->stack[--r->stack_len];
@@ -9173,8 +7113,6 @@
   }
 
   upb_inttable_init(&r->files, UPB_CTYPE_PTR);
-  upb_strtable_init(&r->files_by_name, UPB_CTYPE_PTR);
-  upb_inttable_init(&r->oneofs, UPB_CTYPE_PTR);
   upb_sink_reset(upb_descreader_input(r), h, r);
   r->stack_len = 0;
   r->name = NULL;
@@ -9389,7 +7327,7 @@
     case OP_TAGN:
       return false;
     default:
-      UPB_ASSERT(false);
+      assert(false);
       return false;
   }
 }
@@ -9408,7 +7346,7 @@
   } else {
     *instruction = (*instruction & ~0xff00) | ((ofs & 0xff) << 8);
   }
-  UPB_ASSERT(getofs(*instruction) == ofs);  /* Would fail in cases of overflow. */
+  assert(getofs(*instruction) == ofs);  /* Would fail in cases of overflow. */
 }
 
 static uint32_t pcofs(compiler *c) { return c->pc - c->group->bytecode; }
@@ -9420,7 +7358,7 @@
   int val;
   uint32_t *codep;
 
-  UPB_ASSERT(label < MAXLABEL);
+  assert(label < MAXLABEL);
   val = c->fwd_labels[label];
   codep = (val == EMPTYLABEL) ? NULL : c->group->bytecode + val;
   while (codep) {
@@ -9441,7 +7379,7 @@
  * The returned value is the offset that should be written into the instruction.
  */
 static int32_t labelref(compiler *c, int label) {
-  UPB_ASSERT(label < MAXLABEL);
+  assert(label < MAXLABEL);
   if (label == LABEL_DISPATCH) {
     /* No resolving required. */
     return 0;
@@ -9473,7 +7411,7 @@
   *c->pc++ = v;
 }
 
-static void putop(compiler *c, int op, ...) {
+static void putop(compiler *c, opcode op, ...) {
   va_list ap;
   va_start(ap, op);
 
@@ -9541,7 +7479,7 @@
       int label = va_arg(ap, int);
       uint64_t tag = va_arg(ap, uint64_t);
       uint32_t instruction = op | (tag << 16);
-      UPB_ASSERT(tag <= 0xffff);
+      assert(tag <= 0xffff);
       setofs(&instruction, labelref(c, label));
       put32(c, instruction);
       break;
@@ -9678,7 +7616,7 @@
   uint32_t tag = (upb_fielddef_number(f) << 3) | wire_type;
   uint64_t encoded_tag = upb_vencode32(tag);
   /* No tag should be greater than 5 bytes. */
-  UPB_ASSERT(encoded_tag <= 0xffffffffff);
+  assert(encoded_tag <= 0xffffffffff);
   return encoded_tag;
 }
 
@@ -9701,7 +7639,7 @@
 static upb_selector_t getsel(const upb_fielddef *f, upb_handlertype_t type) {
   upb_selector_t selector;
   bool ok = upb_handlers_getselector(f, type, &selector);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return selector;
 }
 
@@ -9713,7 +7651,7 @@
   uint8_t wt1;
   uint8_t old_wt2;
   upb_pbdecoder_unpackdispatch(dispatch, &ofs, &wt1, &old_wt2);
-  UPB_ASSERT(old_wt2 == NO_WIRE_TYPE);  /* wt2 should not be set yet. */
+  assert(old_wt2 == NO_WIRE_TYPE);  /* wt2 should not be set yet. */
   return upb_pbdecoder_packdispatch(ofs, wt1, new_wt2);
 }
 
@@ -9915,7 +7853,7 @@
    * setting in the fielddef.  This will favor (in speed) whichever was
    * specified. */
 
-  UPB_ASSERT((int)parse_type >= 0 && parse_type <= OP_MAX);
+  assert((int)parse_type >= 0 && parse_type <= OP_MAX);
   sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
   wire_type = upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];
   if (upb_fielddef_isseq(f)) {
@@ -9957,7 +7895,7 @@
   upb_msg_field_iter i;
   upb_value val;
 
-  UPB_ASSERT(method);
+  assert(method);
 
   /* Clear all entries in the dispatch table. */
   upb_inttable_uninit(&method->dispatch);
@@ -10105,7 +8043,7 @@
   compiler *c;
 
   UPB_UNUSED(allowjit);
-  UPB_ASSERT(upb_handlers_isfrozen(dest));
+  assert(upb_handlers_isfrozen(dest));
 
   g = newgroup(owner);
   c = newcompiler(g, lazy);
@@ -10126,13 +8064,13 @@
 #ifdef UPB_DUMP_BYTECODE
   {
     FILE *f = fopen("/tmp/upb-bytecode", "w");
-    UPB_ASSERT(f);
+    assert(f);
     dumpbc(g->bytecode, g->bytecode_end, stderr);
     dumpbc(g->bytecode, g->bytecode_end, f);
     fclose(f);
 
     f = fopen("/tmp/upb-bytecode.bin", "wb");
-    UPB_ASSERT(f);
+    assert(f);
     fwrite(g->bytecode, 1, g->bytecode_end - g->bytecode, f);
     fclose(f);
   }
@@ -10182,7 +8120,7 @@
   upb_inttable_push(&c->groups, upb_value_constptr(g));
 
   ok = upb_inttable_lookupptr(&g->methods, opts->handlers, &v);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return upb_value_getptr(v);
 }
 
@@ -10315,7 +8253,7 @@
 /* How many bytes can be safely read from d->ptr without reading past end-of-buf
  * or past the current delimited end. */
 static size_t curbufleft(const upb_pbdecoder *d) {
-  UPB_ASSERT(d->data_end >= d->ptr);
+  assert(d->data_end >= d->ptr);
   return d->data_end - d->ptr;
 }
 
@@ -10336,7 +8274,7 @@
 
 /* Advances d->ptr. */
 static void advance(upb_pbdecoder *d, size_t len) {
-  UPB_ASSERT(curbufleft(d) >= len);
+  assert(curbufleft(d) >= len);
   d->ptr += len;
 }
 
@@ -10369,7 +8307,7 @@
 }
 
 static void advancetobuf(upb_pbdecoder *d, const char *buf, size_t len) {
-  UPB_ASSERT(curbufleft(d) == 0);
+  assert(curbufleft(d) == 0);
   d->bufstart_ofs += (d->end - d->buf);
   switchtobuf(d, buf, buf + len);
 }
@@ -10378,7 +8316,7 @@
   /* The assertion here is in the interests of efficiency, not correctness.
    * We are trying to ensure that we don't checkpoint() more often than
    * necessary. */
-  UPB_ASSERT(d->checkpoint != d->ptr);
+  assert(d->checkpoint != d->ptr);
   d->checkpoint = d->ptr;
 }
 
@@ -10389,8 +8327,8 @@
  * won't actually be read.
  */
 static int32_t skip(upb_pbdecoder *d, size_t bytes) {
-  UPB_ASSERT(!in_residual_buf(d, d->ptr) || d->size_param == 0);
-  UPB_ASSERT(d->skip == 0);
+  assert(!in_residual_buf(d, d->ptr) || d->size_param == 0);
+  assert(d->skip == 0);
   if (bytes > delim_remaining(d)) {
     seterr(d, "Skipped value extended beyond enclosing submessage.");
     return upb_pbdecoder_suspend(d);
@@ -10418,7 +8356,7 @@
 
   /* d->skip and d->residual_end could probably elegantly be represented
    * as a single variable, to more easily represent this invariant. */
-  UPB_ASSERT(!(d->skip && d->residual_end > d->residual));
+  assert(!(d->skip && d->residual_end > d->residual));
 
   /* We need to remember the original size_param, so that the value we return
    * is relative to it, even if we do some skipping first. */
@@ -10451,7 +8389,7 @@
 
   if (d->residual_end > d->residual) {
     /* We have residual bytes from the last buffer. */
-    UPB_ASSERT(d->ptr == d->residual);
+    assert(d->ptr == d->residual);
   } else {
     switchtobuf(d, buf, buf + size);
   }
@@ -10485,8 +8423,8 @@
     return 0;
   } else {
     size_t ret = d->size_param - (d->end - d->checkpoint);
-    UPB_ASSERT(!in_residual_buf(d, d->checkpoint));
-    UPB_ASSERT(d->buf == d->buf_param || d->buf == &dummy_char);
+    assert(!in_residual_buf(d, d->checkpoint));
+    assert(d->buf == d->buf_param || d->buf == &dummy_char);
 
     d->bufstart_ofs += (d->checkpoint - d->buf);
     d->residual_end = d->residual;
@@ -10506,7 +8444,7 @@
 
   if (d->checkpoint == d->residual) {
     /* Checkpoint was in residual buf; append user byte(s) to residual buf. */
-    UPB_ASSERT((d->residual_end - d->residual) + d->size_param <=
+    assert((d->residual_end - d->residual) + d->size_param <=
            sizeof(d->residual));
     if (!in_residual_buf(d, d->ptr)) {
       d->bufstart_ofs -= (d->residual_end - d->residual);
@@ -10516,11 +8454,11 @@
   } else {
     /* Checkpoint was in user buf; old residual bytes not needed. */
     size_t save;
-    UPB_ASSERT(!in_residual_buf(d, d->checkpoint));
+    assert(!in_residual_buf(d, d->checkpoint));
 
     d->ptr = d->checkpoint;
     save = curbufleft(d);
-    UPB_ASSERT(save <= sizeof(d->residual));
+    assert(save <= sizeof(d->residual));
     memcpy(d->residual, d->ptr, save);
     d->residual_end = d->residual + save;
     d->bufstart_ofs = offset(d);
@@ -10534,7 +8472,7 @@
  * Requires that this many bytes are available in the current buffer. */
 UPB_FORCEINLINE static void consumebytes(upb_pbdecoder *d, void *buf,
                                          size_t bytes) {
-  UPB_ASSERT(bytes <= curbufleft(d));
+  assert(bytes <= curbufleft(d));
   memcpy(buf, d->ptr, bytes);
   advance(d, bytes);
 }
@@ -10547,7 +8485,7 @@
   const size_t avail = curbufleft(d);
   consumebytes(d, buf, avail);
   bytes -= avail;
-  UPB_ASSERT(bytes > 0);
+  assert(bytes > 0);
   if (in_residual_buf(d, d->ptr)) {
     advancetobuf(d, d->buf_param, d->size_param);
   }
@@ -10730,7 +8668,7 @@
   if (read == bytes && data == expected) {
     /* Advance past matched bytes. */
     int32_t ok = getbytes(d, &data, read);
-    UPB_ASSERT(ok < 0);
+    UPB_ASSERT_VAR(ok, ok < 0);
     return DECODE_OK;
   } else if (read < bytes && memcmp(&data, &expected, read) == 0) {
     return suspend_save(d);
@@ -10756,6 +8694,7 @@
       return upb_pbdecoder_suspend(d);
     }
 
+    /* TODO: deliver to unknown field callback. */
     switch (wire_type) {
       case UPB_WIRE_TYPE_32BIT:
         CHECK_RETURN(skip(d, 4));
@@ -10793,8 +8732,6 @@
     }
 
     if (d->top->groupnum >= 0) {
-      /* TODO: More code needed for handling unknown groups. */
-      upb_sink_putunknown(&d->top->sink, d->checkpoint, d->ptr - d->checkpoint);
       return DECODE_OK;
     }
 
@@ -10806,7 +8743,7 @@
 static void goto_endmsg(upb_pbdecoder *d) {
   upb_value v;
   bool found = upb_inttable_lookup32(d->top->dispatch, DISPATCH_ENDMSG, &v);
-  UPB_ASSERT(found);
+  UPB_ASSERT_VAR(found, found);
   d->pc = d->top->base + upb_value_getuint64(v);
 }
 
@@ -10840,7 +8777,7 @@
     } else if (wire_type == ((v >> 8) & 0xff)) {
       bool found =
           upb_inttable_lookup(dispatch, fieldnum + UPB_MAX_FIELDNUMBER, &val);
-      UPB_ASSERT(found);
+      UPB_ASSERT_VAR(found, found);
       d->pc = d->top->base + upb_value_getuint64(val);
       return DECODE_OK;
     }
@@ -10852,7 +8789,7 @@
    * can re-check the delimited end. */
   d->last--;  /* Necessary if we get suspended */
   d->pc = d->last;
-  UPB_ASSERT(getop(*d->last) == OP_CHECKDELIM);
+  assert(getop(*d->last) == OP_CHECKDELIM);
 
   /* Unknown field or ENDGROUP. */
   retval = upb_pbdecoder_skipunknown(d, fieldnum, wire_type);
@@ -10870,7 +8807,7 @@
 /* Callers know that the stack is more than one deep because the opcodes that
  * call this only occur after PUSH operations. */
 upb_pbdecoder_frame *outer_frame(upb_pbdecoder *d) {
-  UPB_ASSERT(d->top != d->stack);
+  assert(d->top != d->stack);
   return d->top - 1;
 }
 
@@ -10902,7 +8839,7 @@
     op = getop(instruction);
     arg = instruction >> 8;
     longofs = arg;
-    UPB_ASSERT(d->ptr != d->residual_end);
+    assert(d->ptr != d->residual_end);
     UPB_UNUSED(group);
 #ifdef UPB_DUMP_BYTECODE
     fprintf(stderr, "s_ofs=%d buf_ofs=%d data_rem=%d buf_rem=%d delim_rem=%d "
@@ -10977,7 +8914,7 @@
           } else {
             int32_t ret = skip(d, n);
             /* This shouldn't return DECODE_OK, because n > len. */
-            UPB_ASSERT(ret >= 0);
+            assert(ret >= 0);
             return ret;
           }
         }
@@ -10999,7 +8936,7 @@
         d->top->groupnum = *d->pc++;
       )
       VMCASE(OP_POP,
-        UPB_ASSERT(d->top > d->stack);
+        assert(d->top > d->stack);
         decoder_pop(d);
       )
       VMCASE(OP_PUSHLENDELIM,
@@ -11015,7 +8952,7 @@
         /* We are guaranteed of this assert because we never allow ourselves to
          * consume bytes beyond data_end, which covers delim_end when non-NULL.
          */
-        UPB_ASSERT(!(d->delim_end && d->ptr > d->delim_end));
+        assert(!(d->delim_end && d->ptr > d->delim_end));
         if (d->ptr == d->delim_end)
           d->pc += longofs;
       )
@@ -11024,7 +8961,7 @@
         d->pc += longofs;
       )
       VMCASE(OP_RET,
-        UPB_ASSERT(d->call_len > 0);
+        assert(d->call_len > 0);
         d->pc = d->callstack[--d->call_len];
       )
       VMCASE(OP_BRANCH,
@@ -11151,7 +9088,7 @@
     if (p != method->code_base.ptr) p--;
     if (getop(*p) == OP_CHECKDELIM) {
       /* Rewind from OP_TAG* to OP_CHECKDELIM. */
-      UPB_ASSERT(getop(*d->pc) == OP_TAG1 ||
+      assert(getop(*d->pc) == OP_TAG1 ||
              getop(*d->pc) == OP_TAG2 ||
              getop(*d->pc) == OP_TAGN ||
              getop(*d->pc) == OP_DISPATCH);
@@ -11215,7 +9152,7 @@
   upb_pbdecoder_reset(d);
   upb_bytessink_reset(&d->input_, &m->input_handler_, d);
 
-  UPB_ASSERT(sink);
+  assert(sink);
   if (d->method_->dest_handlers_) {
     if (sink->handlers != d->method_->dest_handlers_)
       return NULL;
@@ -11223,8 +9160,7 @@
   upb_sink_reset(&d->top->sink, sink->handlers, sink->closure);
 
   /* If this fails, increase the value in decoder.h. */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(e) - size_before <=
-                      UPB_PB_DECODER_SIZE);
+  assert(upb_env_bytesallocated(e) - size_before <= UPB_PB_DECODER_SIZE);
   return d;
 }
 
@@ -11245,7 +9181,7 @@
 }
 
 bool upb_pbdecoder_setmaxnesting(upb_pbdecoder *d, size_t max) {
-  UPB_ASSERT(d->top >= d->stack);
+  assert(d->top >= d->stack);
 
   if (max < (size_t)(d->top - d->stack)) {
     /* Can't set a limit smaller than what we are currently at. */
@@ -11404,7 +9340,7 @@
 /* TODO(haberman): handle pushback */
 static void putbuf(upb_pb_encoder *e, const char *buf, size_t len) {
   size_t n = upb_bytessink_putbuf(e->output_, e->subc, buf, len, NULL);
-  UPB_ASSERT(n == len);
+  UPB_ASSERT_VAR(n, n == len);
 }
 
 static upb_pb_encoder_segment *top(upb_pb_encoder *e) {
@@ -11444,7 +9380,7 @@
 /* Call when "bytes" bytes have been writte at e->ptr.  The caller *must* have
  * previously called reserve() with at least this many bytes. */
 static void encoder_advance(upb_pb_encoder *e, size_t bytes) {
-  UPB_ASSERT((size_t)(e->limit - e->ptr) >= bytes);
+  assert((size_t)(e->limit - e->ptr) >= bytes);
   e->ptr += bytes;
 }
 
@@ -11479,7 +9415,7 @@
  * length. */
 static void accumulate(upb_pb_encoder *e) {
   size_t run_len;
-  UPB_ASSERT(e->ptr >= e->runbegin);
+  assert(e->ptr >= e->runbegin);
   run_len = e->ptr - e->runbegin;
   e->segptr->seglen += run_len;
   top(e)->msglen += run_len;
@@ -11650,12 +9586,6 @@
   return ok ? c : UPB_BREAK;
 }
 
-static bool encode_unknown(void *c, const void *hd, const char *buf,
-                           size_t len) {
-  UPB_UNUSED(hd);
-  return encode_bytes(c, buf, len) && commit(c);
-}
-
 static bool encode_enddelimfield(void *c, const void *hd) {
   UPB_UNUSED(hd);
   return end_delim(c);
@@ -11693,7 +9623,7 @@
 T(double,   double,   dbl2uint64,   encode_fixed64)
 T(float,    float,    flt2uint32,   encode_fixed32)
 T(int64,    int64_t,  uint64_t,     encode_varint)
-T(int32,    int32_t,  int64_t,      encode_varint)
+T(int32,    int32_t,  uint32_t,     encode_varint)
 T(fixed64,  uint64_t, uint64_t,     encode_fixed64)
 T(fixed32,  uint32_t, uint32_t,     encode_fixed32)
 T(bool,     bool,     bool,         encode_varint)
@@ -11718,7 +9648,6 @@
 
   upb_handlers_setstartmsg(h, startmsg, NULL);
   upb_handlers_setendmsg(h, endmsg, NULL);
-  upb_handlers_setunknown(h, encode_unknown, NULL);
 
   m = upb_handlers_msgdef(h);
   for(upb_msg_field_begin(&i, m);
@@ -11841,8 +9770,7 @@
   e->ptr = e->buf;
 
   /* If this fails, increase the value in encoder.h. */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(env) - size_before <=
-                      UPB_PB_ENCODER_SIZE);
+  assert(upb_env_bytesallocated(env) - size_before <= UPB_PB_ENCODER_SIZE);
   return e;
 }
 
@@ -12010,7 +9938,7 @@
   if (!str) return false;
   written = vsprintf(str, fmt, args);
   va_end(args);
-  UPB_ASSERT(written == len);
+  UPB_ASSERT_VAR(written, written == len);
 
   ok = upb_bytessink_putbuf(p->output_, p->subc, str, len, NULL);
   upb_gfree(str);
@@ -12309,6 +10237,57 @@
   return r;
 }
 
+/* Given an encoded varint v, returns an integer with a single bit set that
+ * indicates the end of the varint.  Subtracting one from this value will
+ * yield a mask that leaves only bits that are part of the varint.  Returns
+ * 0 if the varint is unterminated. */
+static uint64_t upb_get_vstopbit(uint64_t v) {
+  uint64_t cbits = v | 0x7f7f7f7f7f7f7f7fULL;
+  return ~cbits & (cbits+1);
+}
+
+/* A branchless decoder.  Credit to Pascal Massimino for the bit-twiddling. */
+upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r) {
+  uint64_t b;
+  uint64_t stop_bit;
+  upb_decoderet my_r;
+  memcpy(&b, r.p, sizeof(b));
+  stop_bit = upb_get_vstopbit(b);
+  b =  (b & 0x7f7f7f7f7f7f7f7fULL) & (stop_bit - 1);
+  b +=       b & 0x007f007f007f007fULL;
+  b +=  3 * (b & 0x0000ffff0000ffffULL);
+  b += 15 * (b & 0x00000000ffffffffULL);
+  if (stop_bit == 0) {
+    /* Error: unterminated varint. */
+    upb_decoderet err_r = {(void*)0, 0};
+    return err_r;
+  }
+  my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
+                            r.val | (b << 7));
+  return my_r;
+}
+
+/* A branchless decoder.  Credit to Daniel Wright for the bit-twiddling. */
+upb_decoderet upb_vdecode_max8_wright(upb_decoderet r) {
+  uint64_t b;
+  uint64_t stop_bit;
+  upb_decoderet my_r;
+  memcpy(&b, r.p, sizeof(b));
+  stop_bit = upb_get_vstopbit(b);
+  b &= (stop_bit - 1);
+  b = ((b & 0x7f007f007f007f00ULL) >> 1) | (b & 0x007f007f007f007fULL);
+  b = ((b & 0xffff0000ffff0000ULL) >> 2) | (b & 0x0000ffff0000ffffULL);
+  b = ((b & 0xffffffff00000000ULL) >> 4) | (b & 0x00000000ffffffffULL);
+  if (stop_bit == 0) {
+    /* Error: unterminated varint. */
+    upb_decoderet err_r = {(void*)0, 0};
+    return err_r;
+  }
+  my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
+                            r.val | (b << 14));
+  return my_r;
+}
+
 #line 1 "upb/json/parser.rl"
 /*
 ** upb::json::Parser (upb_json_parser)
@@ -12331,9 +10310,8 @@
 ** - handling of keys/escape-sequences/etc that span input buffers.
 */
 
+#include <assert.h>
 #include <errno.h>
-#include <float.h>
-#include <math.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
@@ -12429,7 +10407,7 @@
                                              upb_handlertype_t type) {
   upb_selector_t sel;
   bool ok = upb_handlers_getselector(p->top->f, type, &sel);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   return sel;
 }
 
@@ -12451,7 +10429,7 @@
 static void set_name_table(upb_json_parser *p, upb_jsonparser_frame *frame) {
   upb_value v;
   bool ok = upb_inttable_lookupptr(&p->method->name_tables, frame->m, &v);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
   frame->name_table = upb_value_getptr(v);
 }
 
@@ -12574,7 +10552,7 @@
     val = b64lookup(ptr[0]) << 18 |
           b64lookup(ptr[1]) << 12;
 
-    UPB_ASSERT(!(val & 0x80000000));
+    assert(!(val & 0x80000000));
     output = val >> 16;
     upb_sink_putstring(&p->top->sink, sel, &output, 1, NULL);
     return true;
@@ -12628,8 +10606,9 @@
  *      the true value in a contiguous buffer. */
 
 static void assert_accumulate_empty(upb_json_parser *p) {
-  UPB_ASSERT(p->accumulated == NULL);
-  UPB_ASSERT(p->accumulated_len == 0);
+  UPB_UNUSED(p);
+  assert(p->accumulated == NULL);
+  assert(p->accumulated_len == 0);
 }
 
 static void accumulate_clear(upb_json_parser *p) {
@@ -12695,7 +10674,7 @@
  * call, and writes the length to *len.  This with point either to the input
  * buffer or a temporary accumulate buffer. */
 static const char *accumulate_getptr(upb_json_parser *p, size_t *len) {
-  UPB_ASSERT(p->accumulated);
+  assert(p->accumulated);
   *len = p->accumulated_len;
   return p->accumulated;
 }
@@ -12733,7 +10712,7 @@
  * the end. */
 static void multipart_startaccum(upb_json_parser *p) {
   assert_accumulate_empty(p);
-  UPB_ASSERT(p->multipart_state == MULTIPART_INACTIVE);
+  assert(p->multipart_state == MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_ACCUMULATE;
 }
 
@@ -12741,7 +10720,7 @@
  * value with the given selector. */
 static void multipart_start(upb_json_parser *p, upb_selector_t sel) {
   assert_accumulate_empty(p);
-  UPB_ASSERT(p->multipart_state == MULTIPART_INACTIVE);
+  assert(p->multipart_state == MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_PUSHEAGERLY;
   p->string_selector = sel;
 }
@@ -12774,7 +10753,7 @@
 /* Note: this invalidates the accumulate buffer!  Call only after reading its
  * contents. */
 static void multipart_end(upb_json_parser *p) {
-  UPB_ASSERT(p->multipart_state != MULTIPART_INACTIVE);
+  assert(p->multipart_state != MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_INACTIVE;
   accumulate_clear(p);
 }
@@ -12787,13 +10766,13 @@
  * region. */
 
 static void capture_begin(upb_json_parser *p, const char *ptr) {
-  UPB_ASSERT(p->multipart_state != MULTIPART_INACTIVE);
-  UPB_ASSERT(p->capture == NULL);
+  assert(p->multipart_state != MULTIPART_INACTIVE);
+  assert(p->capture == NULL);
   p->capture = ptr;
 }
 
 static bool capture_end(upb_json_parser *p, const char *ptr) {
-  UPB_ASSERT(p->capture);
+  assert(p->capture);
   if (multipart_text(p, p->capture, ptr - p->capture, true)) {
     p->capture = NULL;
     return true;
@@ -12826,7 +10805,7 @@
 
 static void capture_resume(upb_json_parser *p, const char *ptr) {
   if (p->capture) {
-    UPB_ASSERT(p->capture == &suspend_capture);
+    assert(p->capture == &suspend_capture);
     p->capture = ptr;
   }
 }
@@ -12848,7 +10827,7 @@
     case '"': return '"';
     case '\\': return '\\';
     default:
-      UPB_ASSERT(0);
+      assert(0);
       return 'x';
   }
 }
@@ -12872,7 +10851,7 @@
   } else if (ch >= 'a' && ch <= 'f') {
     p->digit += ((ch - 'a') + 10);
   } else {
-    UPB_ASSERT(ch >= 'A' && ch <= 'F');
+    assert(ch >= 'A' && ch <= 'F');
     p->digit += ((ch - 'A') + 10);
   }
 }
@@ -12918,142 +10897,21 @@
   capture_begin(p, ptr);
 }
 
-static bool parse_number(upb_json_parser *p, bool is_quoted);
+static bool parse_number(upb_json_parser *p);
 
 static bool end_number(upb_json_parser *p, const char *ptr) {
   if (!capture_end(p, ptr)) {
     return false;
   }
 
-  return parse_number(p, false);
+  return parse_number(p);
 }
 
-/* |buf| is NULL-terminated. |buf| itself will never include quotes;
- * |is_quoted| tells us whether this text originally appeared inside quotes. */
-static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,
-                                     bool is_quoted) {
-  size_t len = strlen(buf);
-  const char *bufend = buf + len;
-  char *end;
-  upb_fieldtype_t type = upb_fielddef_type(p->top->f);
-  double val;
-  double dummy;
-  double inf = 1.0 / 0.0;  /* C89 does not have an INFINITY macro. */
-
-  errno = 0;
-
-  if (len == 0 || buf[0] == ' ') {
-    return false;
-  }
-
-  /* For integer types, first try parsing with integer-specific routines.
-   * If these succeed, they will be more accurate for int64/uint64 than
-   * strtod().
-   */
-  switch (type) {
-    case UPB_TYPE_ENUM:
-    case UPB_TYPE_INT32: {
-      long val = strtol(buf, &end, 0);
-      if (errno == ERANGE || end != bufend) {
-        break;
-      } else if (val > INT32_MAX || val < INT32_MIN) {
-        return false;
-      } else {
-        upb_sink_putint32(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    case UPB_TYPE_UINT32: {
-      unsigned long val = strtoul(buf, &end, 0);
-      if (end != bufend) {
-        break;
-      } else if (val > UINT32_MAX || errno == ERANGE) {
-        return false;
-      } else {
-        upb_sink_putuint32(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    /* XXX: We can't handle [u]int64 properly on 32-bit machines because
-     * strto[u]ll isn't in C89. */
-    case UPB_TYPE_INT64: {
-      long val = strtol(buf, &end, 0);
-      if (errno == ERANGE || end != bufend) {
-        break;
-      } else {
-        upb_sink_putint64(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    case UPB_TYPE_UINT64: {
-      unsigned long val = strtoul(p->accumulated, &end, 0);
-      if (end != bufend) {
-        break;
-      } else if (errno == ERANGE) {
-        return false;
-      } else {
-        upb_sink_putuint64(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    }
-    default:
-      break;
-  }
-
-  if (type != UPB_TYPE_DOUBLE && type != UPB_TYPE_FLOAT && is_quoted) {
-    /* Quoted numbers for integer types are not allowed to be in double form. */
-    return false;
-  }
-
-  if (len == strlen("Infinity") && strcmp(buf, "Infinity") == 0) {
-    /* C89 does not have an INFINITY macro. */
-    val = inf;
-  } else if (len == strlen("-Infinity") && strcmp(buf, "-Infinity") == 0) {
-    val = -inf;
-  } else {
-    val = strtod(buf, &end);
-    if (errno == ERANGE || end != bufend) {
-      return false;
-    }
-  }
-
-  switch (type) {
-#define CASE(capitaltype, smalltype, ctype, min, max)                     \
-    case UPB_TYPE_ ## capitaltype: {                                      \
-      if (modf(val, &dummy) != 0 || val > max || val < min) {             \
-        return false;                                                     \
-      } else {                                                            \
-        upb_sink_put ## smalltype(&p->top->sink, parser_getsel(p),        \
-                                  (ctype)val);                            \
-        return true;                                                      \
-      }                                                                   \
-      break;                                                              \
-    }
-    case UPB_TYPE_ENUM:
-    CASE(INT32, int32, int32_t, INT32_MIN, INT32_MAX);
-    CASE(INT64, int64, int64_t, INT64_MIN, INT64_MAX);
-    CASE(UINT32, uint32, uint32_t, 0, UINT32_MAX);
-    CASE(UINT64, uint64, uint64_t, 0, UINT64_MAX);
-#undef CASE
-
-    case UPB_TYPE_DOUBLE:
-      upb_sink_putdouble(&p->top->sink, parser_getsel(p), val);
-      return true;
-    case UPB_TYPE_FLOAT:
-      if ((val > FLT_MAX || val < -FLT_MAX) && val != inf && val != -inf) {
-        return false;
-      } else {
-        upb_sink_putfloat(&p->top->sink, parser_getsel(p), val);
-        return true;
-      }
-    default:
-      return false;
-  }
-}
-
-static bool parse_number(upb_json_parser *p, bool is_quoted) {
+static bool parse_number(upb_json_parser *p) {
   size_t len;
   const char *buf;
+  const char *myend;
+  char *end;
 
   /* strtol() and friends unfortunately do not support specifying the length of
    * the input string, so we need to force a copy into a NULL-terminated buffer. */
@@ -13062,16 +10920,80 @@
   }
 
   buf = accumulate_getptr(p, &len);
+  myend = buf + len - 1;  /* One for NULL. */
 
-  if (parse_number_from_buffer(p, buf, is_quoted)) {
-    multipart_end(p);
-    return true;
-  } else {
-    upb_status_seterrf(&p->status, "error parsing number: %s", buf);
-    upb_env_reporterror(p->env, &p->status);
-    multipart_end(p);
-    return false;
+  /* XXX: We are using strtol to parse integers, but this is wrong as even
+   * integers can be represented as 1e6 (for example), which strtol can't
+   * handle correctly.
+   *
+   * XXX: Also, we can't handle large integers properly because strto[u]ll
+   * isn't in C89.
+   *
+   * XXX: Also, we don't properly check floats for overflow, since strtof
+   * isn't in C89. */
+  switch (upb_fielddef_type(p->top->f)) {
+    case UPB_TYPE_ENUM:
+    case UPB_TYPE_INT32: {
+      long val = strtol(p->accumulated, &end, 0);
+      if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putint32(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_INT64: {
+      long long val = strtol(p->accumulated, &end, 0);
+      if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putint64(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_UINT32: {
+      unsigned long val = strtoul(p->accumulated, &end, 0);
+      if (val > UINT32_MAX || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putuint32(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_UINT64: {
+      unsigned long long val = strtoul(p->accumulated, &end, 0);
+      if (val > UINT64_MAX || errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putuint64(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_DOUBLE: {
+      double val = strtod(p->accumulated, &end);
+      if (errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putdouble(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    case UPB_TYPE_FLOAT: {
+      float val = strtod(p->accumulated, &end);
+      if (errno == ERANGE || end != myend)
+        goto err;
+      else
+        upb_sink_putfloat(&p->top->sink, parser_getsel(p), val);
+      break;
+    }
+    default:
+      assert(false);
   }
+
+  multipart_end(p);
+
+  return true;
+
+err:
+  upb_status_seterrf(&p->status, "error parsing number: %s", buf);
+  upb_env_reporterror(p->env, &p->status);
+  multipart_end(p);
+  return false;
 }
 
 static bool parser_putbool(upb_json_parser *p, bool val) {
@@ -13086,13 +11008,13 @@
   }
 
   ok = upb_sink_putbool(&p->top->sink, parser_getsel(p), val);
-  UPB_ASSERT(ok);
+  UPB_ASSERT_VAR(ok, ok);
 
   return true;
 }
 
 static bool start_stringval(upb_json_parser *p) {
-  UPB_ASSERT(p->top->f);
+  assert(p->top->f);
 
   if (upb_fielddef_isstring(p->top->f)) {
     upb_jsonparser_frame *inner;
@@ -13124,16 +11046,17 @@
       multipart_startaccum(p);
       return true;
     }
-  } else if (upb_fielddef_type(p->top->f) != UPB_TYPE_BOOL &&
-             upb_fielddef_type(p->top->f) != UPB_TYPE_MESSAGE) {
-    /* No need to push a frame -- numeric values in quotes remain in the
-     * current parser frame.  These values must accmulate so we can convert
-     * them all at once at the end. */
+  } else if (upb_fielddef_type(p->top->f) == UPB_TYPE_ENUM) {
+    /* No need to push a frame -- symbolic enum names in quotes remain in the
+     * current parser frame.
+     *
+     * Enum string values must accumulate so we can look up the value in a table
+     * once it is complete. */
     multipart_startaccum(p);
     return true;
   } else {
     upb_status_seterrf(&p->status,
-                       "String specified for bool or submessage field: %s",
+                       "String specified for non-string/non-enum field: %s",
                        upb_fielddef_name(p->top->f));
     upb_env_reporterror(p->env, &p->status);
     return false;
@@ -13153,8 +11076,8 @@
 
     case UPB_TYPE_STRING: {
       upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);
-      p->top--;
       upb_sink_endstr(&p->top->sink, sel);
+      p->top--;
       break;
     }
 
@@ -13180,17 +11103,8 @@
       break;
     }
 
-    case UPB_TYPE_INT32:
-    case UPB_TYPE_INT64:
-    case UPB_TYPE_UINT32:
-    case UPB_TYPE_UINT64:
-    case UPB_TYPE_DOUBLE:
-    case UPB_TYPE_FLOAT:
-      ok = parse_number(p, true);
-      break;
-
     default:
-      UPB_ASSERT(false);
+      assert(false);
       upb_status_seterrmsg(&p->status, "Internal error in JSON decoder");
       upb_env_reporterror(p->env, &p->status);
       ok = false;
@@ -13203,7 +11117,7 @@
 }
 
 static void start_member(upb_json_parser *p) {
-  UPB_ASSERT(!p->top->f);
+  assert(!p->top->f);
   multipart_startaccum(p);
 }
 
@@ -13232,7 +11146,7 @@
     case UPB_TYPE_UINT32:
     case UPB_TYPE_UINT64:
       /* Invoke end_number. The accum buffer has the number's text already. */
-      if (!parse_number(p, true)) {
+      if (!parse_number(p)) {
         return false;
       }
       break;
@@ -13261,7 +11175,7 @@
       sel = getsel_for_handlertype(p, UPB_HANDLER_STRING);
       upb_sink_putstring(&subsink, sel, buf, len, NULL);
       sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);
-      upb_sink_endstr(&p->top->sink, sel);
+      upb_sink_endstr(&subsink, sel);
       multipart_end(p);
       break;
     }
@@ -13332,7 +11246,7 @@
 }
 
 static bool end_membername(upb_json_parser *p) {
-  UPB_ASSERT(!p->top->f);
+  assert(!p->top->f);
 
   if (p->top->is_map) {
     return handle_mapentry(p);
@@ -13364,7 +11278,7 @@
     bool ok;
     const upb_fielddef *mapfield;
 
-    UPB_ASSERT(p->top > p->stack);
+    assert(p->top > p->stack);
     /* send ENDMSG on submsg. */
     upb_sink_endmsg(&p->top->sink, &s);
     mapfield = p->top->mapfield;
@@ -13372,7 +11286,7 @@
     /* send ENDSUBMSG in repeated-field-of-mapentries frame. */
     p->top--;
     ok = upb_handlers_getselector(mapfield, UPB_HANDLER_ENDSUBMSG, &sel);
-    UPB_ASSERT(ok);
+    UPB_ASSERT_VAR(ok, ok);
     upb_sink_endsubmsg(&p->top->sink, sel);
   }
 
@@ -13380,7 +11294,7 @@
 }
 
 static bool start_subobject(upb_json_parser *p) {
-  UPB_ASSERT(p->top->f);
+  assert(p->top->f);
 
   if (upb_fielddef_ismap(p->top->f)) {
     upb_jsonparser_frame *inner;
@@ -13449,7 +11363,7 @@
   upb_jsonparser_frame *inner;
   upb_selector_t sel;
 
-  UPB_ASSERT(p->top->f);
+  assert(p->top->f);
 
   if (!upb_fielddef_isseq(p->top->f)) {
     upb_status_seterrf(&p->status,
@@ -13477,7 +11391,7 @@
 static void end_array(upb_json_parser *p) {
   upb_selector_t sel;
 
-  UPB_ASSERT(p->top > p->stack);
+  assert(p->top > p->stack);
 
   p->top--;
   sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
@@ -13523,11 +11437,11 @@
  * final state once, when the closing '"' is seen. */
 
 
-#line 1310 "upb/json/parser.rl"
+#line 1245 "upb/json/parser.rl"
 
 
 
-#line 1222 "upb/json/parser.c"
+#line 1157 "upb/json/parser.c"
 static const char _json_actions[] = {
 	0, 1, 0, 1, 2, 1, 3, 1, 
 	5, 1, 6, 1, 7, 1, 8, 1, 
@@ -13676,7 +11590,7 @@
 static const int json_en_main = 1;
 
 
-#line 1313 "upb/json/parser.rl"
+#line 1248 "upb/json/parser.rl"
 
 size_t parse(void *closure, const void *hd, const char *buf, size_t size,
              const upb_bufhandle *handle) {
@@ -13698,7 +11612,7 @@
   capture_resume(parser, buf);
 
   
-#line 1393 "upb/json/parser.c"
+#line 1328 "upb/json/parser.c"
 	{
 	int _klen;
 	unsigned int _trans;
@@ -13773,118 +11687,118 @@
 		switch ( *_acts++ )
 		{
 	case 0:
-#line 1225 "upb/json/parser.rl"
+#line 1160 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
 	case 1:
-#line 1226 "upb/json/parser.rl"
+#line 1161 "upb/json/parser.rl"
 	{ p--; {stack[top++] = cs; cs = 10; goto _again;} }
 	break;
 	case 2:
-#line 1230 "upb/json/parser.rl"
+#line 1165 "upb/json/parser.rl"
 	{ start_text(parser, p); }
 	break;
 	case 3:
-#line 1231 "upb/json/parser.rl"
+#line 1166 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_text(parser, p)); }
 	break;
 	case 4:
-#line 1237 "upb/json/parser.rl"
+#line 1172 "upb/json/parser.rl"
 	{ start_hex(parser); }
 	break;
 	case 5:
-#line 1238 "upb/json/parser.rl"
+#line 1173 "upb/json/parser.rl"
 	{ hexdigit(parser, p); }
 	break;
 	case 6:
-#line 1239 "upb/json/parser.rl"
+#line 1174 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_hex(parser)); }
 	break;
 	case 7:
-#line 1245 "upb/json/parser.rl"
+#line 1180 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(escape(parser, p)); }
 	break;
 	case 8:
-#line 1251 "upb/json/parser.rl"
+#line 1186 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
 	case 9:
-#line 1254 "upb/json/parser.rl"
+#line 1189 "upb/json/parser.rl"
 	{ {stack[top++] = cs; cs = 19; goto _again;} }
 	break;
 	case 10:
-#line 1256 "upb/json/parser.rl"
+#line 1191 "upb/json/parser.rl"
 	{ p--; {stack[top++] = cs; cs = 27; goto _again;} }
 	break;
 	case 11:
-#line 1261 "upb/json/parser.rl"
+#line 1196 "upb/json/parser.rl"
 	{ start_member(parser); }
 	break;
 	case 12:
-#line 1262 "upb/json/parser.rl"
+#line 1197 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_membername(parser)); }
 	break;
 	case 13:
-#line 1265 "upb/json/parser.rl"
+#line 1200 "upb/json/parser.rl"
 	{ end_member(parser); }
 	break;
 	case 14:
-#line 1271 "upb/json/parser.rl"
+#line 1206 "upb/json/parser.rl"
 	{ start_object(parser); }
 	break;
 	case 15:
-#line 1274 "upb/json/parser.rl"
+#line 1209 "upb/json/parser.rl"
 	{ end_object(parser); }
 	break;
 	case 16:
-#line 1280 "upb/json/parser.rl"
+#line 1215 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_array(parser)); }
 	break;
 	case 17:
-#line 1284 "upb/json/parser.rl"
+#line 1219 "upb/json/parser.rl"
 	{ end_array(parser); }
 	break;
 	case 18:
-#line 1289 "upb/json/parser.rl"
+#line 1224 "upb/json/parser.rl"
 	{ start_number(parser, p); }
 	break;
 	case 19:
-#line 1290 "upb/json/parser.rl"
+#line 1225 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_number(parser, p)); }
 	break;
 	case 20:
-#line 1292 "upb/json/parser.rl"
+#line 1227 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_stringval(parser)); }
 	break;
 	case 21:
-#line 1293 "upb/json/parser.rl"
+#line 1228 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_stringval(parser)); }
 	break;
 	case 22:
-#line 1295 "upb/json/parser.rl"
+#line 1230 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(parser_putbool(parser, true)); }
 	break;
 	case 23:
-#line 1297 "upb/json/parser.rl"
+#line 1232 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(parser_putbool(parser, false)); }
 	break;
 	case 24:
-#line 1299 "upb/json/parser.rl"
+#line 1234 "upb/json/parser.rl"
 	{ /* null value */ }
 	break;
 	case 25:
-#line 1301 "upb/json/parser.rl"
+#line 1236 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_subobject(parser)); }
 	break;
 	case 26:
-#line 1302 "upb/json/parser.rl"
+#line 1237 "upb/json/parser.rl"
 	{ end_subobject(parser); }
 	break;
 	case 27:
-#line 1307 "upb/json/parser.rl"
+#line 1242 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
-#line 1579 "upb/json/parser.c"
+#line 1514 "upb/json/parser.c"
 		}
 	}
 
@@ -13897,7 +11811,7 @@
 	_out: {}
 	}
 
-#line 1334 "upb/json/parser.rl"
+#line 1269 "upb/json/parser.rl"
 
   if (p != pe) {
     upb_status_seterrf(&parser->status, "Parse error at '%.*s'\n", pe - p, p);
@@ -13938,13 +11852,13 @@
 
   /* Emit Ragel initialization of the parser. */
   
-#line 1633 "upb/json/parser.c"
+#line 1568 "upb/json/parser.c"
 	{
 	cs = json_start;
 	top = 0;
 	}
 
-#line 1374 "upb/json/parser.rl"
+#line 1309 "upb/json/parser.rl"
   p->current_state = cs;
   p->parser_top = top;
   accumulate_clear(p);
@@ -14008,7 +11922,7 @@
       buf = upb_grealloc(buf, 0, field_len);
       len = field_len;
       len2 = upb_fielddef_getjsonname(f, buf, len);
-      UPB_ASSERT(len == len2);
+      UPB_ASSERT_VAR(len2, len == len2);
     }
     upb_strtable_insert(t, buf, upb_value_constptr(f));
 
@@ -14052,8 +11966,7 @@
 
   /* If this fails, uncomment and increase the value in parser.h. */
   /* fprintf(stderr, "%zd\n", upb_env_bytesallocated(env) - size_before); */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(env) - size_before <=
-                      UPB_JSON_PARSER_SIZE);
+  assert(upb_env_bytesallocated(env) - size_before <= UPB_JSON_PARSER_SIZE);
   return p;
 }
 
@@ -14141,7 +12054,7 @@
     ret->len = upb_fielddef_getjsonname(f, NULL, 0);
     ret->ptr = upb_gmalloc(ret->len);
     len = upb_fielddef_getjsonname(f, ret->ptr, ret->len);
-    UPB_ASSERT(len == ret->len);
+    UPB_ASSERT_VAR(len, len == ret->len);
     ret->len--;  /* NULL */
   }
 
@@ -14155,7 +12068,7 @@
     upb_json_printer *p, const char *buf, unsigned int len) {
   /* TODO: Will need to change if we support pushback from the sink. */
   size_t n = upb_bytessink_putbuf(p->output_, p->subc_, buf, len, NULL);
-  UPB_ASSERT(n == len);
+  UPB_ASSERT_VAR(n, n == len);
 }
 
 static void print_comma(upb_json_printer *p) {
@@ -14241,23 +12154,10 @@
  * Right now we use %.8g and %.17g for float/double, respectively, to match
  * proto2::util::JsonFormat's defaults.  May want to change this later. */
 
-const char neginf[] = "\"-Infinity\"";
-const char inf[] = "\"Infinity\"";
-
 static size_t fmt_double(double val, char* buf, size_t length) {
-  if (val == (1.0 / 0.0)) {
-    CHKLENGTH(length >= strlen(inf));
-    strcpy(buf, inf);
-    return strlen(inf);
-  } else if (val == (-1.0 / 0.0)) {
-    CHKLENGTH(length >= strlen(neginf));
-    strcpy(buf, neginf);
-    return strlen(neginf);
-  } else {
-    size_t n = _upb_snprintf(buf, length, "%.17g", val);
-    CHKLENGTH(n > 0 && n < length);
-    return n;
-  }
+  size_t n = _upb_snprintf(buf, length, "%.17g", val);
+  CHKLENGTH(n > 0 && n < length);
+  return n;
 }
 
 static size_t fmt_float(float val, char* buf, size_t length) {
@@ -14518,7 +12418,7 @@
 
   while (remaining > 2) {
     /* TODO(haberman): handle encoded lengths > sizeof(data) */
-    UPB_ASSERT((limit - to) >= 4);
+    UPB_ASSERT_VAR(limit, (limit - to) >= 4);
 
     to[0] = base64[from[0] >> 2];
     to[1] = base64[((from[0] & 0x3) << 4) | (from[1] >> 4)];
@@ -14722,7 +12622,7 @@
       upb_handlers_setstring(h, key_field, mapkey_bytes, &empty_attr);
       break;
     default:
-      UPB_ASSERT(false);
+      assert(false);
       break;
   }
 
@@ -14896,8 +12796,7 @@
   upb_sink_reset(&p->input_, h, p);
 
   /* If this fails, increase the value in printer.h. */
-  UPB_ASSERT_DEBUGVAR(upb_env_bytesallocated(e) - size_before <=
-                      UPB_JSON_PRINTER_SIZE);
+  assert(upb_env_bytesallocated(e) - size_before <= UPB_JSON_PRINTER_SIZE);
   return p;
 }
 
diff --git a/ruby/ext/google/protobuf_c/upb.h b/ruby/ext/google/protobuf_c/upb.h
index f441c89..2faf74e 100644
--- a/ruby/ext/google/protobuf_c/upb.h
+++ b/ruby/ext/google/protobuf_c/upb.h
@@ -1,5 +1,71 @@
 // Amalgamated source file
 /*
+** Defs are upb's internal representation of the constructs that can appear
+** in a .proto file:
+**
+** - upb::MessageDef (upb_msgdef): describes a "message" construct.
+** - upb::FieldDef (upb_fielddef): describes a message field.
+** - upb::FileDef (upb_filedef): describes a .proto file and its defs.
+** - upb::EnumDef (upb_enumdef): describes an enum.
+** - upb::OneofDef (upb_oneofdef): describes a oneof.
+** - upb::Def (upb_def): base class of all the others.
+**
+** TODO: definitions of services.
+**
+** Like upb_refcounted objects, defs are mutable only until frozen, and are
+** only thread-safe once frozen.
+**
+** This is a mixed C/C++ interface that offers a full API to both languages.
+** See the top-level README for more information.
+*/
+
+#ifndef UPB_DEF_H_
+#define UPB_DEF_H_
+
+/*
+** upb::RefCounted (upb_refcounted)
+**
+** A refcounting scheme that supports circular refs.  It accomplishes this by
+** partitioning the set of objects into groups such that no cycle spans groups;
+** we can then reference-count the group as a whole and ignore refs within the
+** group.  When objects are mutable, these groups are computed very
+** conservatively; we group any objects that have ever had a link between them.
+** When objects are frozen, we compute strongly-connected components which
+** allows us to be precise and only group objects that are actually cyclic.
+**
+** This is a mixed C/C++ interface that offers a full API to both languages.
+** See the top-level README for more information.
+*/
+
+#ifndef UPB_REFCOUNTED_H_
+#define UPB_REFCOUNTED_H_
+
+/*
+** upb_table
+**
+** This header is INTERNAL-ONLY!  Its interfaces are not public or stable!
+** This file defines very fast int->upb_value (inttable) and string->upb_value
+** (strtable) hash tables.
+**
+** The table uses chained scatter with Brent's variation (inspired by the Lua
+** implementation of hash tables).  The hash function for strings is Austin
+** Appleby's "MurmurHash."
+**
+** The inttable uses uintptr_t as its key, which guarantees it can be used to
+** store pointers or integers of at least 32 bits (upb isn't really useful on
+** systems where sizeof(void*) < 4).
+**
+** The table must be homogenous (all values of the same type).  In debug
+** mode, we check this on insert and lookup.
+*/
+
+#ifndef UPB_TABLE_H_
+#define UPB_TABLE_H_
+
+#include <assert.h>
+#include <stdint.h>
+#include <string.h>
+/*
 ** This file contains shared definitions that are widely used across upb.
 **
 ** This is a mixed C/C++ interface that offers a full API to both languages.
@@ -35,9 +101,6 @@
 #define UPB_INLINE static
 #endif
 
-/* Hints to the compiler about likely/unlikely branches. */
-#define UPB_LIKELY(x) __builtin_expect((x),1)
-
 /* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler
  * doesn't provide these preprocessor symbols. */
 #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
@@ -55,21 +118,20 @@
 #define UPB_NORETURN
 #endif
 
-#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L
-/* C99/C++11 versions. */
-#include <stdio.h>
-#define _upb_snprintf snprintf
-#define _upb_vsnprintf vsnprintf
-#define _upb_va_copy(a, b) va_copy(a, b)
-#elif defined __GNUC__
 /* A few hacky workarounds for functions not in C89.
  * For internal use only!
  * TODO(haberman): fix these by including our own implementations, or finding
  * another workaround.
  */
+#ifdef __GNUC__
 #define _upb_snprintf __builtin_snprintf
 #define _upb_vsnprintf __builtin_vsnprintf
 #define _upb_va_copy(a, b) __va_copy(a, b)
+#elif __STDC_VERSION__ >= 199901L
+/* C99 versions. */
+#define _upb_snprintf snprintf
+#define _upb_vsnprintf vsnprintf
+#define _upb_va_copy(a, b) va_copy(a, b)
 #else
 #error Need implementations of [v]snprintf and va_copy
 #endif
@@ -201,23 +263,10 @@
 
 #define UPB_UNUSED(var) (void)var
 
-/* UPB_ASSERT(): in release mode, we use the expression without letting it be
- * evaluated.  This prevents "unused variable" warnings. */
-#ifdef NDEBUG
-#define UPB_ASSERT(expr) do {} while (false && (expr))
-#else
-#define UPB_ASSERT(expr) assert(expr)
-#endif
-
-/* UPB_ASSERT_DEBUGVAR(): assert that uses functions or variables that only
- * exist in debug mode.  This turns into regular assert. */
-#define UPB_ASSERT_DEBUGVAR(expr) assert(expr)
-
-#ifdef __GNUC__
-#define UPB_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while(0)
-#else
-#define UPB_UNREACHABLE() do { assert(0); } while(0)
-#endif
+/* For asserting something about a variable when the variable is not used for
+ * anything else.  This prevents "unused variable" warnings when compiling in
+ * debug mode. */
+#define UPB_ASSERT_VAR(var, predicate) UPB_UNUSED(var); assert(predicate)
 
 /* Generic function type. */
 typedef void upb_func();
@@ -299,16 +348,6 @@
 
 #endif
 
-/* A list of types as they are encoded on-the-wire. */
-typedef enum {
-  UPB_WIRE_TYPE_VARINT      = 0,
-  UPB_WIRE_TYPE_64BIT       = 1,
-  UPB_WIRE_TYPE_DELIMITED   = 2,
-  UPB_WIRE_TYPE_START_GROUP = 3,
-  UPB_WIRE_TYPE_END_GROUP   = 4,
-  UPB_WIRE_TYPE_32BIT       = 5
-} upb_wiretype_t;
-
 
 /* upb::ErrorSpace ************************************************************/
 
@@ -462,18 +501,17 @@
 };
 
 UPB_INLINE void *upb_malloc(upb_alloc *alloc, size_t size) {
-  UPB_ASSERT(alloc);
+  assert(size > 0);
   return alloc->func(alloc, NULL, 0, size);
 }
 
 UPB_INLINE void *upb_realloc(upb_alloc *alloc, void *ptr, size_t oldsize,
                              size_t size) {
-  UPB_ASSERT(alloc);
+  assert(size > 0);
   return alloc->func(alloc, ptr, oldsize, size);
 }
 
 UPB_INLINE void upb_free(upb_alloc *alloc, void *ptr) {
-  assert(alloc);
   alloc->func(alloc, ptr, 0, 0);
 }
 
@@ -522,11 +560,11 @@
 void upb_arena_init(upb_arena *a);
 void upb_arena_init2(upb_arena *a, void *mem, size_t n, upb_alloc *alloc);
 void upb_arena_uninit(upb_arena *a);
+upb_alloc *upb_arena_alloc(upb_arena *a);
 bool upb_arena_addcleanup(upb_arena *a, upb_cleanup_func *func, void *ud);
 size_t upb_arena_bytesallocated(const upb_arena *a);
 void upb_arena_setnextblocksize(upb_arena *a, size_t size);
 void upb_arena_setmaxblocksize(upb_arena *a, size_t size);
-UPB_INLINE upb_alloc *upb_arena_alloc(upb_arena *a) { return (upb_alloc*)a; }
 
 UPB_END_EXTERN_C
 
@@ -637,7 +675,7 @@
 
 void upb_env_initonly(upb_env *e);
 
-UPB_INLINE upb_arena *upb_env_arena(upb_env *e) { return (upb_arena*)e; }
+upb_arena *upb_env_arena(upb_env *e);
 bool upb_env_ok(const upb_env *e);
 void upb_env_seterrorfunc(upb_env *e, upb_error_func *func, void *ud);
 
@@ -737,106 +775,6 @@
 
 
 #endif  /* UPB_H_ */
-/*
-** upb_decode: parsing into a upb_msg using a upb_msglayout.
-*/
-
-#ifndef UPB_DECODE_H_
-#define UPB_DECODE_H_
-
-/*
-** upb::Message is a representation for protobuf messages.
-**
-** However it differs from other common representations like
-** google::protobuf::Message in one key way: it does not prescribe any
-** ownership between messages and submessages, and it relies on the
-** client to delete each message/submessage/array/map at the appropriate
-** time.
-**
-** A client can access a upb::Message without knowing anything about
-** ownership semantics, but to create or mutate a message a user needs
-** to implement the memory management themselves.
-**
-** Currently all messages, arrays, and maps store a upb_alloc* internally.
-** Mutating operations use this when they require dynamically-allocated
-** memory.  We could potentially eliminate this size overhead later by
-** letting the user flip a bit on the factory that prevents this from
-** being stored.  The user would then need to use separate functions where
-** the upb_alloc* is passed explicitly.  However for handlers to populate
-** such structures, they would need a place to store this upb_alloc* during
-** parsing; upb_handlers don't currently have a good way to accommodate this.
-**
-** TODO: UTF-8 checking?
-**/
-
-#ifndef UPB_MSG_H_
-#define UPB_MSG_H_
-
-/*
-** Defs are upb's internal representation of the constructs that can appear
-** in a .proto file:
-**
-** - upb::MessageDef (upb_msgdef): describes a "message" construct.
-** - upb::FieldDef (upb_fielddef): describes a message field.
-** - upb::FileDef (upb_filedef): describes a .proto file and its defs.
-** - upb::EnumDef (upb_enumdef): describes an enum.
-** - upb::OneofDef (upb_oneofdef): describes a oneof.
-** - upb::Def (upb_def): base class of all the others.
-**
-** TODO: definitions of services.
-**
-** Like upb_refcounted objects, defs are mutable only until frozen, and are
-** only thread-safe once frozen.
-**
-** This is a mixed C/C++ interface that offers a full API to both languages.
-** See the top-level README for more information.
-*/
-
-#ifndef UPB_DEF_H_
-#define UPB_DEF_H_
-
-/*
-** upb::RefCounted (upb_refcounted)
-**
-** A refcounting scheme that supports circular refs.  It accomplishes this by
-** partitioning the set of objects into groups such that no cycle spans groups;
-** we can then reference-count the group as a whole and ignore refs within the
-** group.  When objects are mutable, these groups are computed very
-** conservatively; we group any objects that have ever had a link between them.
-** When objects are frozen, we compute strongly-connected components which
-** allows us to be precise and only group objects that are actually cyclic.
-**
-** This is a mixed C/C++ interface that offers a full API to both languages.
-** See the top-level README for more information.
-*/
-
-#ifndef UPB_REFCOUNTED_H_
-#define UPB_REFCOUNTED_H_
-
-/*
-** upb_table
-**
-** This header is INTERNAL-ONLY!  Its interfaces are not public or stable!
-** This file defines very fast int->upb_value (inttable) and string->upb_value
-** (strtable) hash tables.
-**
-** The table uses chained scatter with Brent's variation (inspired by the Lua
-** implementation of hash tables).  The hash function for strings is Austin
-** Appleby's "MurmurHash."
-**
-** The inttable uses uintptr_t as its key, which guarantees it can be used to
-** store pointers or integers of at least 32 bits (upb isn't really useful on
-** systems where sizeof(void*) < 4).
-**
-** The table must be homogenous (all values of the same type).  In debug
-** mode, we check this on insert and lookup.
-*/
-
-#ifndef UPB_TABLE_H_
-#define UPB_TABLE_H_
-
-#include <stdint.h>
-#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -857,9 +795,7 @@
   UPB_CTYPE_CSTR     = 6,
   UPB_CTYPE_PTR      = 7,
   UPB_CTYPE_CONSTPTR = 8,
-  UPB_CTYPE_FPTR     = 9,
-  UPB_CTYPE_FLOAT    = 10,
-  UPB_CTYPE_DOUBLE   = 11
+  UPB_CTYPE_FPTR     = 9
 } upb_ctype_t;
 
 typedef struct {
@@ -918,7 +854,7 @@
     return ret; \
   } \
   UPB_INLINE type_t upb_value_get ## name(upb_value val) { \
-    UPB_ASSERT_DEBUGVAR(val.ctype == proto_type); \
+    assert(val.ctype == proto_type); \
     return (type_t)(converter)val.val; \
   }
 
@@ -933,29 +869,6 @@
 FUNCS(fptr,     fptr,         upb_func*,    uintptr_t,  UPB_CTYPE_FPTR)
 
 #undef FUNCS
-
-UPB_INLINE void upb_value_setfloat(upb_value *val, float cval) {
-  memcpy(&val->val, &cval, sizeof(cval));
-  SET_TYPE(val->ctype, UPB_CTYPE_FLOAT);
-}
-
-UPB_INLINE void upb_value_setdouble(upb_value *val, double cval) {
-  memcpy(&val->val, &cval, sizeof(cval));
-  SET_TYPE(val->ctype, UPB_CTYPE_DOUBLE);
-}
-
-UPB_INLINE upb_value upb_value_float(float cval) {
-  upb_value ret;
-  upb_value_setfloat(&ret, cval);
-  return ret;
-}
-
-UPB_INLINE upb_value upb_value_double(double cval) {
-  upb_value ret;
-  upb_value_setdouble(&ret, cval);
-  return ret;
-}
-
 #undef SET_TYPE
 
 
@@ -1198,13 +1111,6 @@
   return t->t.count;
 }
 
-void upb_inttable_packedsize(const upb_inttable *t, size_t *size);
-void upb_strtable_packedsize(const upb_strtable *t, size_t *size);
-upb_inttable *upb_inttable_pack(const upb_inttable *t, void *p, size_t *ofs,
-                                size_t size);
-upb_strtable *upb_strtable_pack(const upb_strtable *t, void *p, size_t *ofs,
-                                size_t size);
-
 /* Inserts the given key into the hashtable with the given value.  The key must
  * not already exist in the hash table.  For string tables, the key must be
  * NULL-terminated, and the table will make an internal copy of the key.
@@ -1650,7 +1556,7 @@
   reffed_ptr(U* val, const void* ref_donor = NULL)
       : ptr_(upb::upcast(val)) {
     if (ref_donor) {
-      UPB_ASSERT(ptr_);
+      assert(ptr_);
       ptr_->DonateRef(ref_donor, this);
     } else if (ptr_) {
       ptr_->Ref(this);
@@ -1695,12 +1601,12 @@
   }
 
   T& operator*() const {
-    UPB_ASSERT(ptr_);
+    assert(ptr_);
     return *ptr_;
   }
 
   T* operator->() const {
-    UPB_ASSERT(ptr_);
+    assert(ptr_);
     return ptr_;
   }
 
@@ -1751,7 +1657,6 @@
 class FileDef;
 class MessageDef;
 class OneofDef;
-class SymbolTable;
 }
 #endif
 
@@ -1760,8 +1665,6 @@
                          upb_refcounted)
 UPB_DECLARE_DERIVED_TYPE(upb::FileDef, upb::RefCounted, upb_filedef,
                          upb_refcounted)
-UPB_DECLARE_TYPE(upb::SymbolTable, upb_symtab)
-
 
 /* The maximum message depth that the type graph can have.  This is a resource
  * limit for the C stack since we sometimes need to recursively traverse the
@@ -1795,6 +1698,8 @@
  public:
   typedef upb_deftype_t Type;
 
+  Def* Dup(const void *owner) const;
+
   /* upb::RefCounted methods like Ref()/Unref(). */
   UPB_REFCOUNTED_CPPMETHODS
 
@@ -1840,6 +1745,9 @@
 
 UPB_BEGIN_EXTERN_C
 
+/* Native C API. */
+upb_def *upb_def_dup(const upb_def *def, const void *owner);
+
 /* Include upb_refcounted methods like upb_def_ref()/upb_def_unref(). */
 UPB_REFCOUNTED_CMETHODS(upb_def, upb_def_upcast)
 
@@ -1900,7 +1808,7 @@
     return (upb_##lower *)def;                                             \
   }                                                                        \
   UPB_INLINE const upb_##lower *upb_downcast_##lower(const upb_def *def) { \
-    UPB_ASSERT(upb_def_type(def) == UPB_DEF_##upper);                          \
+    assert(upb_def_type(def) == UPB_DEF_##upper);                          \
     return (const upb_##lower *)def;                                       \
   }                                                                        \
   UPB_INLINE upb_##lower *upb_dyncast_##lower##_mutable(upb_def *def) {    \
@@ -1936,19 +1844,15 @@
  * types defined in descriptor.proto, which gives INT32 and SINT32 separate
  * types (we distinguish the two with the "integer encoding" enum below). */
 typedef enum {
-  /* Types stored in 1 byte. */
-  UPB_TYPE_BOOL     = 1,
-  /* Types stored in 4 bytes. */
-  UPB_TYPE_FLOAT    = 2,
-  UPB_TYPE_INT32    = 3,
-  UPB_TYPE_UINT32   = 4,
-  UPB_TYPE_ENUM     = 5,  /* Enum values are int32. */
-  /* Types stored as pointers (probably 4 or 8 bytes). */
-  UPB_TYPE_STRING   = 6,
-  UPB_TYPE_BYTES    = 7,
-  UPB_TYPE_MESSAGE  = 8,
-  /* Types stored as 8 bytes. */
-  UPB_TYPE_DOUBLE   = 9,
+  UPB_TYPE_FLOAT    = 1,
+  UPB_TYPE_DOUBLE   = 2,
+  UPB_TYPE_BOOL     = 3,
+  UPB_TYPE_STRING   = 4,
+  UPB_TYPE_BYTES    = 5,
+  UPB_TYPE_MESSAGE  = 6,
+  UPB_TYPE_ENUM     = 7,  /* Enum values are int32. */
+  UPB_TYPE_INT32    = 8,
+  UPB_TYPE_UINT32   = 9,
   UPB_TYPE_INT64    = 10,
   UPB_TYPE_UINT64   = 11
 } upb_fieldtype_t;
@@ -2029,6 +1933,13 @@
   /* Returns NULL if memory allocation failed. */
   static reffed_ptr<FieldDef> New();
 
+  /* Duplicates the given field, returning NULL if memory allocation failed.
+   * When a fielddef is duplicated, the subdef (if any) is made symbolic if it
+   * wasn't already.  If the subdef is set but has no name (which is possible
+   * since msgdefs are not required to have a name) the new fielddef's subdef
+   * will be unset. */
+  FieldDef* Dup(const void* owner) const;
+
   /* upb::RefCounted methods like Ref()/Unref(). */
   UPB_REFCOUNTED_CPPMETHODS
 
@@ -2115,10 +2026,16 @@
   bool IsPrimitive() const;
   bool IsMap() const;
 
-  /* Returns whether this field explicitly represents presence.
+  /* Whether this field must be able to explicitly represent presence:
    *
-   * For proto2 messages: Returns true for any scalar (non-repeated) field.
-   * For proto3 messages: Returns true for scalar submessage or oneof fields. */
+   * * This is always false for repeated fields (an empty repeated field is
+   *   equivalent to a repeated field with zero entries).
+   *
+   * * This is always true for submessages.
+   *
+   * * For other fields, it depends on the message (see
+   *   MessageDef::SetPrimitivesHavePresence())
+   */
   bool HasPresence() const;
 
   /* How integers are encoded.  Only meaningful for integer types.
@@ -2277,6 +2194,7 @@
 
 /* Native C API. */
 upb_fielddef *upb_fielddef_new(const void *owner);
+upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner);
 
 /* Include upb_refcounted methods like upb_fielddef_ref(). */
 UPB_REFCOUNTED_CMETHODS(upb_fielddef, upb_fielddef_upcast2)
@@ -2486,6 +2404,16 @@
     return FindOneofByName(str.c_str(), str.size());
   }
 
+  /* Returns a new msgdef that is a copy of the given msgdef (and a copy of all
+   * the fields) but with any references to submessages broken and replaced
+   * with just the name of the submessage.  Returns NULL if memory allocation
+   * failed.
+   *
+   * TODO(haberman): which is more useful, keeping fields resolved or
+   * unresolving them?  If there's no obvious answer, Should this functionality
+   * just be moved into symtab.c? */
+  MessageDef* Dup(const void* owner) const;
+
   /* Is this message a map entry? */
   void setmapentry(bool map_entry);
   bool mapentry() const;
@@ -2619,6 +2547,7 @@
 
 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status);
 
+upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner);
 const char *upb_msgdef_fullname(const upb_msgdef *m);
 const char *upb_msgdef_name(const upb_msgdef *m);
 int upb_msgdef_numoneofs(const upb_msgdef *m);
@@ -2768,6 +2697,10 @@
    * first one that was added. */
   const char* FindValueByNumber(int32_t num) const;
 
+  /* Returns a new EnumDef with all the same values.  The new EnumDef will be
+   * owned by the given owner. */
+  EnumDef* Dup(const void* owner) const;
+
   /* Iteration over name/value pairs.  The order is undefined.
    * Adding an enum val invalidates any iterators.
    *
@@ -2795,6 +2728,7 @@
 
 /* Native C API. */
 upb_enumdef *upb_enumdef_new(const void *owner);
+upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner);
 
 /* Include upb_refcounted methods like upb_enumdef_ref(). */
 UPB_REFCOUNTED_CMETHODS(upb_enumdef, upb_enumdef_upcast2)
@@ -2839,7 +2773,6 @@
 
 UPB_END_EXTERN_C
 
-
 /* upb::OneofDef **************************************************************/
 
 typedef upb_inttable_iter upb_oneof_iter;
@@ -2904,6 +2837,10 @@
   /* Looks up by tag number. */
   const FieldDef* FindFieldByNumber(uint32_t num) const;
 
+  /* Returns a new OneofDef with all the same fields. The OneofDef will be owned
+   * by the given owner. */
+  OneofDef* Dup(const void* owner) const;
+
   /* Iteration over fields.  The order is undefined. */
   class iterator : public std::iterator<std::forward_iterator_tag, FieldDef*> {
    public:
@@ -2949,16 +2886,16 @@
 
 /* Native C API. */
 upb_oneofdef *upb_oneofdef_new(const void *owner);
+upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner);
 
 /* Include upb_refcounted methods like upb_oneofdef_ref(). */
 UPB_REFCOUNTED_CMETHODS(upb_oneofdef, upb_oneofdef_upcast)
 
 const char *upb_oneofdef_name(const upb_oneofdef *o);
+bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
+
 const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o);
 int upb_oneofdef_numfields(const upb_oneofdef *o);
-uint32_t upb_oneofdef_index(const upb_oneofdef *o);
-
-bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
 bool upb_oneofdef_addfield(upb_oneofdef *o, upb_fielddef *f,
                            const void *ref_donor,
                            upb_status *s);
@@ -3014,17 +2951,6 @@
   const char* package() const;
   bool set_package(const char* package, Status* s);
 
-  /* Sets the php class prefix which is prepended to all php generated classes
-   * from this .proto. Default is empty. */
-  const char* phpprefix() const;
-  bool set_phpprefix(const char* phpprefix, Status* s);
-
-  /* Use this option to change the namespace of php generated classes. Default
-   * is empty. When this option is empty, the package name will be used for
-   * determining the namespace. */
-  const char* phpnamespace() const;
-  bool set_phpnamespace(const char* phpnamespace, Status* s);
-
   /* Syntax for the file.  Defaults to proto2. */
   upb_syntax_t syntax() const;
   void set_syntax(upb_syntax_t syntax);
@@ -3078,8 +3004,6 @@
 
 const char *upb_filedef_name(const upb_filedef *f);
 const char *upb_filedef_package(const upb_filedef *f);
-const char *upb_filedef_phpprefix(const upb_filedef *f);
-const char *upb_filedef_phpnamespace(const upb_filedef *f);
 upb_syntax_t upb_filedef_syntax(const upb_filedef *f);
 size_t upb_filedef_defcount(const upb_filedef *f);
 size_t upb_filedef_depcount(const upb_filedef *f);
@@ -3089,10 +3013,6 @@
 bool upb_filedef_freeze(upb_filedef *f, upb_status *s);
 bool upb_filedef_setname(upb_filedef *f, const char *name, upb_status *s);
 bool upb_filedef_setpackage(upb_filedef *f, const char *package, upb_status *s);
-bool upb_filedef_setphpprefix(upb_filedef *f, const char *phpprefix,
-                              upb_status *s);
-bool upb_filedef_setphpnamespace(upb_filedef *f, const char *phpnamespace,
-                                 upb_status *s);
 bool upb_filedef_setsyntax(upb_filedef *f, upb_syntax_t syntax, upb_status *s);
 
 bool upb_filedef_adddef(upb_filedef *f, upb_def *def, const void *ref_donor,
@@ -3119,163 +3039,19 @@
 
 UPB_END_EXTERN_C
 
-typedef struct {
- UPB_PRIVATE_FOR_CPP
-  upb_strtable_iter iter;
-  upb_deftype_t type;
-} upb_symtab_iter;
-
-#ifdef __cplusplus
-
-/* Non-const methods in upb::SymbolTable are NOT thread-safe. */
-class upb::SymbolTable {
- public:
-  /* Returns a new symbol table with a single ref owned by "owner."
-   * Returns NULL if memory allocation failed. */
-  static SymbolTable* New();
-  static void Free(upb::SymbolTable* table);
-
-  /* For all lookup functions, the returned pointer is not owned by the
-   * caller; it may be invalidated by any non-const call or unref of the
-   * SymbolTable!  To protect against this, take a ref if desired. */
-
-  /* Freezes the symbol table: prevents further modification of it.
-   * After the Freeze() operation is successful, the SymbolTable must only be
-   * accessed via a const pointer.
-   *
-   * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
-   * a necessary step in using a SymbolTable.  If you have no need for it to be
-   * immutable, there is no need to freeze it ever.  However sometimes it is
-   * useful, and SymbolTables that are statically compiled into the binary are
-   * always frozen by nature. */
-  void Freeze();
-
-  /* Resolves the given symbol using the rules described in descriptor.proto,
-   * namely:
-   *
-   *    If the name starts with a '.', it is fully-qualified.  Otherwise,
-   *    C++-like scoping rules are used to find the type (i.e. first the nested
-   *    types within this message are searched, then within the parent, on up
-   *    to the root namespace).
-   *
-   * If not found, returns NULL. */
-  const Def* Resolve(const char* base, const char* sym) const;
-
-  /* Finds an entry in the symbol table with this exact name.  If not found,
-   * returns NULL. */
-  const Def* Lookup(const char *sym) const;
-  const MessageDef* LookupMessage(const char *sym) const;
-  const EnumDef* LookupEnum(const char *sym) const;
-
-  /* TODO: introduce a C++ iterator, but make it nice and templated so that if
-   * you ask for an iterator of MessageDef the iterated elements are strongly
-   * typed as MessageDef*. */
-
-  /* Adds the given mutable defs to the symtab, resolving all symbols (including
-   * enum default values) and finalizing the defs.  Only one def per name may be
-   * in the list, and the defs may not duplicate any name already in the symtab.
-   * All defs must have a name -- anonymous defs are not allowed.  Anonymous
-   * defs can still be frozen by calling upb_def_freeze() directly.
-   *
-   * The entire operation either succeeds or fails.  If the operation fails,
-   * the symtab is unchanged, false is returned, and status indicates the
-   * error.  The caller passes a ref on all defs to the symtab (even if the
-   * operation fails).
-   *
-   * TODO(haberman): currently failure will leave the symtab unchanged, but may
-   * leave the defs themselves partially resolved.  Does this matter?  If so we
-   * could do a prepass that ensures that all symbols are resolvable and bail
-   * if not, so we don't mutate anything until we know the operation will
-   * succeed. */
-  bool Add(Def*const* defs, size_t n, void* ref_donor, Status* status);
-
-  bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
-    return Add((Def*const*)&defs[0], defs.size(), owner, status);
-  }
-
-  /* Resolves all subdefs for messages in this file and attempts to freeze the
-   * file.  If this succeeds, adds all the symbols to this SymbolTable
-   * (replacing any existing ones with the same names). */
-  bool AddFile(FileDef* file, Status* s);
-
- private:
-  UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable)
-};
-
-#endif  /* __cplusplus */
-
-UPB_BEGIN_EXTERN_C
-
-/* Native C API. */
-
-upb_symtab *upb_symtab_new();
-void upb_symtab_free(upb_symtab* s);
-const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
-                                  const char *sym);
-const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
-const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
-const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
-bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
-                    void *ref_donor, upb_status *status);
-bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status* status);
-
-/* upb_symtab_iter i;
- * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
- *     upb_symtab_next(&i)) {
- *   const upb_def *def = upb_symtab_iter_def(&i);
- *    // ...
- * }
- *
- * For C we don't have separate iterators for const and non-const.
- * It is the caller's responsibility to cast the upb_fielddef* to
- * const if the upb_msgdef* is const. */
-void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
-                      upb_deftype_t type);
-void upb_symtab_next(upb_symtab_iter *iter);
-bool upb_symtab_done(const upb_symtab_iter *iter);
-const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
-
-UPB_END_EXTERN_C
-
-#ifdef __cplusplus
-/* C++ inline wrappers. */
-namespace upb {
-inline SymbolTable* SymbolTable::New() {
-  return upb_symtab_new();
-}
-inline void SymbolTable::Free(SymbolTable* s) {
-  upb_symtab_free(s);
-}
-inline const Def *SymbolTable::Resolve(const char *base,
-                                       const char *sym) const {
-  return upb_symtab_resolve(this, base, sym);
-}
-inline const Def* SymbolTable::Lookup(const char *sym) const {
-  return upb_symtab_lookup(this, sym);
-}
-inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
-  return upb_symtab_lookupmsg(this, sym);
-}
-inline bool SymbolTable::Add(
-    Def*const* defs, size_t n, void* ref_donor, Status* status) {
-  return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
-}
-inline bool SymbolTable::AddFile(FileDef* file, Status* s) {
-  return upb_symtab_addfile(this, file, s);
-}
-}  /* namespace upb */
-#endif
-
 #ifdef __cplusplus
 
 UPB_INLINE const char* upb_safecstr(const std::string& str) {
-  UPB_ASSERT(str.size() == std::strlen(str.c_str()));
+  assert(str.size() == std::strlen(str.c_str()));
   return str.c_str();
 }
 
 /* Inline C++ wrappers. */
 namespace upb {
 
+inline Def* Def::Dup(const void* owner) const {
+  return upb_def_dup(this, owner);
+}
 inline Def::Type Def::def_type() const { return upb_def_type(this); }
 inline const char* Def::full_name() const { return upb_def_fullname(this); }
 inline const char* Def::name() const { return upb_def_name(this); }
@@ -3305,19 +3081,19 @@
   return upb_fielddef_checkintfmt(val);
 }
 inline FieldDef::Type FieldDef::ConvertType(int32_t val) {
-  UPB_ASSERT(CheckType(val));
+  assert(CheckType(val));
   return static_cast<FieldDef::Type>(val);
 }
 inline FieldDef::Label FieldDef::ConvertLabel(int32_t val) {
-  UPB_ASSERT(CheckLabel(val));
+  assert(CheckLabel(val));
   return static_cast<FieldDef::Label>(val);
 }
 inline FieldDef::DescriptorType FieldDef::ConvertDescriptorType(int32_t val) {
-  UPB_ASSERT(CheckDescriptorType(val));
+  assert(CheckDescriptorType(val));
   return static_cast<FieldDef::DescriptorType>(val);
 }
 inline FieldDef::IntegerFormat FieldDef::ConvertIntegerFormat(int32_t val) {
-  UPB_ASSERT(CheckIntegerFormat(val));
+  assert(CheckIntegerFormat(val));
   return static_cast<FieldDef::IntegerFormat>(val);
 }
 
@@ -3325,6 +3101,9 @@
   upb_fielddef *f = upb_fielddef_new(&f);
   return reffed_ptr<FieldDef>(f, &f);
 }
+inline FieldDef* FieldDef::Dup(const void* owner) const {
+  return upb_fielddef_dup(this, owner);
+}
 inline const char* FieldDef::full_name() const {
   return upb_fielddef_fullname(this);
 }
@@ -3564,6 +3343,9 @@
                                                    size_t len) const {
   return upb_msgdef_ntoo(this, name, len);
 }
+inline MessageDef* MessageDef::Dup(const void *owner) const {
+  return upb_msgdef_dup(this, owner);
+}
 inline void MessageDef::setmapentry(bool map_entry) {
   upb_msgdef_setmapentry(this, map_entry);
 }
@@ -3733,6 +3515,9 @@
 inline const char* EnumDef::FindValueByNumber(int32_t num) const {
   return upb_enumdef_iton(this, num);
 }
+inline EnumDef* EnumDef::Dup(const void* owner) const {
+  return upb_enumdef_dup(this, owner);
+}
 
 inline EnumDef::Iterator::Iterator(const EnumDef* e) {
   upb_enum_begin(&iter_, e);
@@ -3851,18 +3636,6 @@
 inline bool FileDef::set_package(const char* package, Status* s) {
   return upb_filedef_setpackage(this, package, s);
 }
-inline const char* FileDef::phpprefix() const {
-  return upb_filedef_phpprefix(this);
-}
-inline bool FileDef::set_phpprefix(const char* phpprefix, Status* s) {
-  return upb_filedef_setphpprefix(this, phpprefix, s);
-}
-inline const char* FileDef::phpnamespace() const {
-  return upb_filedef_phpnamespace(this);
-}
-inline bool FileDef::set_phpnamespace(const char* phpnamespace, Status* s) {
-  return upb_filedef_setphpnamespace(this, phpnamespace, s);
-}
 inline int FileDef::def_count() const {
   return upb_filedef_defcount(this);
 }
@@ -3899,6 +3672,193 @@
 
 #endif /* UPB_DEF_H_ */
 /*
+** This file contains definitions of structs that should be considered private
+** and NOT stable across versions of upb.
+**
+** The only reason they are declared here and not in .c files is to allow upb
+** and the application (if desired) to embed statically-initialized instances
+** of structures like defs.
+**
+** If you include this file, all guarantees of ABI compatibility go out the
+** window!  Any code that includes this file needs to recompile against the
+** exact same version of upb that they are linking against.
+**
+** You also need to recompile if you change the value of the UPB_DEBUG_REFS
+** flag.
+*/
+
+
+#ifndef UPB_STATICINIT_H_
+#define UPB_STATICINIT_H_
+
+#ifdef __cplusplus
+/* Because of how we do our typedefs, this header can't be included from C++. */
+#error This file cannot be included from C++
+#endif
+
+/* upb_refcounted *************************************************************/
+
+
+/* upb_def ********************************************************************/
+
+struct upb_def {
+  upb_refcounted base;
+
+  const char *fullname;
+  const upb_filedef* file;
+  char type;  /* A upb_deftype_t (char to save space) */
+
+  /* Used as a flag during the def's mutable stage.  Must be false unless
+   * it is currently being used by a function on the stack.  This allows
+   * us to easily determine which defs were passed into the function's
+   * current invocation. */
+  bool came_from_user;
+};
+
+#define UPB_DEF_INIT(name, type, vtbl, refs, ref2s) \
+    { UPB_REFCOUNT_INIT(vtbl, refs, ref2s), name, NULL, type, false }
+
+
+/* upb_fielddef ***************************************************************/
+
+struct upb_fielddef {
+  upb_def base;
+
+  union {
+    int64_t sint;
+    uint64_t uint;
+    double dbl;
+    float flt;
+    void *bytes;
+  } defaultval;
+  union {
+    const upb_msgdef *def;  /* If !msg_is_symbolic. */
+    char *name;             /* If msg_is_symbolic. */
+  } msg;
+  union {
+    const upb_def *def;  /* If !subdef_is_symbolic. */
+    char *name;          /* If subdef_is_symbolic. */
+  } sub;  /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
+  bool subdef_is_symbolic;
+  bool msg_is_symbolic;
+  const upb_oneofdef *oneof;
+  bool default_is_string;
+  bool type_is_set_;     /* False until type is explicitly set. */
+  bool is_extension_;
+  bool lazy_;
+  bool packed_;
+  upb_intfmt_t intfmt;
+  bool tagdelim;
+  upb_fieldtype_t type_;
+  upb_label_t label_;
+  uint32_t number_;
+  uint32_t selector_base;  /* Used to index into a upb::Handlers table. */
+  uint32_t index_;
+};
+
+extern const struct upb_refcounted_vtbl upb_fielddef_vtbl;
+
+#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy,   \
+                          packed, name, num, msgdef, subdef, selector_base,    \
+                          index, defaultval, refs, ref2s)                      \
+  {                                                                            \
+    UPB_DEF_INIT(name, UPB_DEF_FIELD, &upb_fielddef_vtbl, refs, ref2s),        \
+        defaultval, {msgdef}, {subdef}, NULL, false, false,                    \
+        type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
+        lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
+  }
+
+
+/* upb_msgdef *****************************************************************/
+
+struct upb_msgdef {
+  upb_def base;
+
+  size_t selector_count;
+  uint32_t submsg_field_count;
+
+  /* Tables for looking up fields by number and name. */
+  upb_inttable itof;  /* int to field */
+  upb_strtable ntof;  /* name to field/oneof */
+
+  /* Is this a map-entry message? */
+  bool map_entry;
+
+  /* Whether this message has proto2 or proto3 semantics. */
+  upb_syntax_t syntax;
+
+  /* TODO(haberman): proper extension ranges (there can be multiple). */
+};
+
+extern const struct upb_refcounted_vtbl upb_msgdef_vtbl;
+
+/* TODO: also support static initialization of the oneofs table. This will be
+ * needed if we compile in descriptors that contain oneofs. */
+#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
+                        map_entry, syntax, refs, ref2s)                       \
+  {                                                                           \
+    UPB_DEF_INIT(name, UPB_DEF_MSG, &upb_fielddef_vtbl, refs, ref2s),         \
+        selector_count, submsg_field_count, itof, ntof, map_entry, syntax     \
+  }
+
+
+/* upb_enumdef ****************************************************************/
+
+struct upb_enumdef {
+  upb_def base;
+
+  upb_strtable ntoi;
+  upb_inttable iton;
+  int32_t defaultval;
+};
+
+extern const struct upb_refcounted_vtbl upb_enumdef_vtbl;
+
+#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
+  { UPB_DEF_INIT(name, UPB_DEF_ENUM, &upb_enumdef_vtbl, refs, ref2s), ntoi,    \
+    iton, defaultval }
+
+
+/* upb_oneofdef ***************************************************************/
+
+struct upb_oneofdef {
+  upb_refcounted base;
+
+  const char *name;
+  upb_strtable ntof;
+  upb_inttable itof;
+  const upb_msgdef *parent;
+};
+
+extern const struct upb_refcounted_vtbl upb_oneofdef_vtbl;
+
+#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
+  { UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), name, ntof, itof }
+
+
+/* upb_symtab *****************************************************************/
+
+struct upb_symtab {
+  upb_refcounted base;
+
+  upb_strtable symtab;
+};
+
+struct upb_filedef {
+  upb_refcounted base;
+
+  const char *name;
+  const char *package;
+  upb_syntax_t syntax;
+
+  upb_inttable defs;
+  upb_inttable deps;
+};
+
+extern const struct upb_refcounted_vtbl upb_filedef_vtbl;
+
+#endif  /* UPB_STATICINIT_H_ */
+/*
 ** upb::Handlers (upb_handlers)
 **
 ** A upb_handlers is like a virtual table for a upb_msgdef.  Each field of the
@@ -4002,8 +3962,7 @@
 /* Static selectors for upb::Handlers. */
 #define UPB_STARTMSG_SELECTOR 0
 #define UPB_ENDMSG_SELECTOR 1
-#define UPB_UNKNOWN_SELECTOR 2
-#define UPB_STATIC_SELECTOR_COUNT 3
+#define UPB_STATIC_SELECTOR_COUNT 2
 
 /* Static selectors for upb::BytesHandler. */
 #define UPB_STARTSTR_SELECTOR 0
@@ -4510,7 +4469,7 @@
   void AddCleanup(Handlers* h) const {
     if (cleanup_func_) {
       bool ok = h->AddCleanup(cleanup_data_, cleanup_func_);
-      UPB_ASSERT(ok);
+      UPB_ASSERT_VAR(ok, ok);
     }
   }
 
@@ -4532,8 +4491,6 @@
 /* Native C API. */
 
 /* Handler function typedefs. */
-typedef bool upb_unknown_handlerfunc(void *c, const void *hd, const char *buf,
-                                     size_t n);
 typedef bool upb_startmsg_handlerfunc(void *c, const void*);
 typedef bool upb_endmsg_handlerfunc(void *c, const void *, upb_status *status);
 typedef void* upb_startfield_handlerfunc(void *c, const void *hd);
@@ -4587,8 +4544,6 @@
 void upb_handlers_clearerr(upb_handlers *h);
 const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h);
 bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *hfree);
-bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func,
-                             upb_handlerattr *attr);
 
 bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,
                               upb_handlerattr *attr);
@@ -5534,7 +5489,7 @@
   inline bool Handlers::SetValueHandler<vtype>(                                \
       const FieldDef *f,                                                       \
       const Handlers::utype ## Handler& handler) {                             \
-    UPB_ASSERT(!handler.registered_);                                              \
+    assert(!handler.registered_);                                              \
     handler.AddCleanup(this);                                                  \
     handler.registered_ = true;                                                \
     return upb_handlers_set##ltype(this, f, handler.handler_, &handler.attr_); \
@@ -5646,7 +5601,7 @@
 
 template <class T>
 inline Handler<T>::~Handler() {
-  UPB_ASSERT(registered_);
+  assert(registered_);
 }
 
 inline HandlerAttributes::HandlerAttributes() { upb_handlerattr_init(this); }
@@ -5732,63 +5687,63 @@
 }
 inline bool Handlers::SetStartMessageHandler(
     const Handlers::StartMessageHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartmsg(this, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndMessageHandler(
     const Handlers::EndMessageHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendmsg(this, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStartStringHandler(const FieldDef *f,
                                             const StartStringHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartstr(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndStringHandler(const FieldDef *f,
                                           const EndFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendstr(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStringHandler(const FieldDef *f,
                                        const StringHandler& handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstring(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStartSequenceHandler(
     const FieldDef *f, const StartFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartseq(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetStartSubMessageHandler(
     const FieldDef *f, const StartFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setstartsubmsg(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndSubMessageHandler(const FieldDef *f,
                                               const EndFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendsubmsg(this, f, handler.handler_, &handler.attr_);
 }
 inline bool Handlers::SetEndSequenceHandler(const FieldDef *f,
                                             const EndFieldHandler &handler) {
-  UPB_ASSERT(!handler.registered_);
+  assert(!handler.registered_);
   handler.registered_ = true;
   handler.AddCleanup(this);
   return upb_handlers_setendseq(this, f, handler.handler_, &handler.attr_);
@@ -5865,14 +5820,12 @@
 
 #ifdef __cplusplus
 namespace upb {
-class BufferSink;
 class BufferSource;
 class BytesSink;
 class Sink;
 }
 #endif
 
-UPB_DECLARE_TYPE(upb::BufferSink, upb_bufsink)
 UPB_DECLARE_TYPE(upb::BufferSource, upb_bufsrc)
 UPB_DECLARE_TYPE(upb::BytesSink, upb_bytessink)
 UPB_DECLARE_TYPE(upb::Sink, upb_sink)
@@ -6059,13 +6012,6 @@
 
 UPB_BEGIN_EXTERN_C
 
-/* A class for accumulating output string data in a flat buffer. */
-
-upb_bufsink *upb_bufsink_new(upb_env *env);
-void upb_bufsink_free(upb_bufsink *sink);
-upb_bytessink *upb_bufsink_sink(upb_bufsink *sink);
-const char *upb_bufsink_getdata(const upb_bufsink *sink, size_t *len);
-
 /* Inline definitions. */
 
 UPB_INLINE void upb_bytessink_reset(upb_bytessink *s, const upb_byteshandler *h,
@@ -6115,7 +6061,23 @@
                  &s->handler->table[UPB_ENDSTR_SELECTOR].attr));
 }
 
-bool upb_bufsrc_putbuf(const char *buf, size_t len, upb_bytessink *sink);
+UPB_INLINE bool upb_bufsrc_putbuf(const char *buf, size_t len,
+                                  upb_bytessink *sink) {
+  void *subc;
+  bool ret;
+  upb_bufhandle handle;
+  upb_bufhandle_init(&handle);
+  upb_bufhandle_setbuf(&handle, buf, 0);
+  ret = upb_bytessink_start(sink, len, &subc);
+  if (ret && len != 0) {
+    ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) >= len);
+  }
+  if (ret) {
+    ret = upb_bytessink_end(sink);
+  }
+  upb_bufhandle_uninit(&handle);
+  return ret;
+}
 
 #define PUTVAL(type, ctype)                                                    \
   UPB_INLINE bool upb_sink_put##type(upb_sink *s, upb_selector_t sel,          \
@@ -6158,18 +6120,6 @@
   return handler(s->closure, hd, buf, n, handle);
 }
 
-UPB_INLINE bool upb_sink_putunknown(upb_sink *s, const char *buf, size_t n) {
-  typedef upb_unknown_handlerfunc func;
-  func *handler;
-  const void *hd;
-  if (!s->handlers) return true;
-  handler = (func *)upb_handlers_gethandler(s->handlers, UPB_UNKNOWN_SELECTOR);
-
-  if (!handler) return n;
-  hd = upb_handlers_gethandlerdata(s->handlers, UPB_UNKNOWN_SELECTOR);
-  return handler(s->closure, hd, buf, n);
-}
-
 UPB_INLINE bool upb_sink_startmsg(upb_sink *s) {
   typedef upb_startmsg_handlerfunc func;
   func *startmsg;
@@ -6374,642 +6324,268 @@
 #endif
 
 #endif
+/*
+** For handlers that do very tiny, very simple operations, the function call
+** overhead of calling a handler can be significant.  This file allows the
+** user to define handlers that do something very simple like store the value
+** to memory and/or set a hasbit.  JIT compilers can then special-case these
+** handlers and emit specialized code for them instead of actually calling the
+** handler.
+**
+** The functionality is very simple/limited right now but may expand to be able
+** to call another function.
+*/
+
+#ifndef UPB_SHIM_H
+#define UPB_SHIM_H
+
+
+typedef struct {
+  size_t offset;
+  int32_t hasbit;
+} upb_shim_data;
 
 #ifdef __cplusplus
 
 namespace upb {
-class Array;
-class Map;
-class MapIterator;
-class MessageFactory;
-class MessageLayout;
-class Visitor;
-class VisitorPlan;
-}
+
+struct Shim {
+  typedef upb_shim_data Data;
+
+  /* Sets a handler for the given field that writes the value to the given
+   * offset and, if hasbit >= 0, sets a bit at the given bit offset.  Returns
+   * true if the handler was set successfully. */
+  static bool Set(Handlers *h, const FieldDef *f, size_t ofs, int32_t hasbit);
+
+  /* If this handler is a shim, returns the corresponding upb::Shim::Data and
+   * stores the type in "type".  Otherwise returns NULL. */
+  static const Data* GetData(const Handlers* h, Handlers::Selector s,
+                             FieldDef::Type* type);
+};
+
+}  /* namespace upb */
 
 #endif
 
-UPB_DECLARE_TYPE(upb::MessageFactory, upb_msgfactory)
-UPB_DECLARE_TYPE(upb::MessageLayout, upb_msglayout)
-UPB_DECLARE_TYPE(upb::Array, upb_array)
-UPB_DECLARE_TYPE(upb::Map, upb_map)
-UPB_DECLARE_TYPE(upb::MapIterator, upb_mapiter)
-UPB_DECLARE_TYPE(upb::Visitor, upb_visitor)
-UPB_DECLARE_TYPE(upb::VisitorPlan, upb_visitorplan)
-
-/* TODO(haberman): C++ accessors */
-
 UPB_BEGIN_EXTERN_C
 
-typedef void upb_msg;
-
-
-/** upb_msglayout *************************************************************/
-
-/* upb_msglayout represents the memory layout of a given upb_msgdef.  You get
- * instances of this from a upb_msgfactory, and the factory always owns the
- * msglayout. */
-
-
-/** upb_visitor ***************************************************************/
-
-/* upb_visitor will visit all the fields of a message and its submessages.  It
- * uses a upb_visitorplan which you can obtain from a upb_msgfactory. */
-
-upb_visitor *upb_visitor_create(upb_env *e, const upb_visitorplan *vp,
-                                upb_sink *output);
-bool upb_visitor_visitmsg(upb_visitor *v, const upb_msg *msg);
-
-
-/** upb_msgfactory ************************************************************/
-
-/* A upb_msgfactory contains a cache of upb_msglayout, upb_handlers, and
- * upb_visitorplan objects.  These are the objects necessary to represent,
- * populate, and and visit upb_msg objects.
- *
- * These caches are all populated by upb_msgdef, and lazily created on demand.
- */
-
-/* Creates and destroys a msgfactory, respectively.  The messages for this
- * msgfactory must come from |symtab| (which should outlive the msgfactory). */
-upb_msgfactory *upb_msgfactory_new(const upb_symtab *symtab);
-void upb_msgfactory_free(upb_msgfactory *f);
-
-const upb_symtab *upb_msgfactory_symtab(const upb_msgfactory *f);
-
-/* The functions to get cached objects, lazily creating them on demand.  These
- * all require:
- *
- * - m is in upb_msgfactory_symtab(f)
- * - upb_msgdef_mapentry(m) == false (since map messages can't have layouts).
- *
- * The returned objects will live for as long as the msgfactory does.
- *
- * TODO(haberman): consider making this thread-safe and take a const
- * upb_msgfactory. */
-const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
-                                              const upb_msgdef *m);
-const upb_handlers *upb_msgfactory_getmergehandlers(upb_msgfactory *f,
-                                                    const upb_msgdef *m);
-const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
-                                                     const upb_handlers *h);
-
-
-/** upb_stringview ************************************************************/
-
-typedef struct {
-  const char *data;
-  size_t size;
-} upb_stringview;
-
-UPB_INLINE upb_stringview upb_stringview_make(const char *data, size_t size) {
-  upb_stringview ret;
-  ret.data = data;
-  ret.size = size;
-  return ret;
-}
-
-#define UPB_STRINGVIEW_INIT(ptr, len) {ptr, len}
-
-
-/** upb_msgval ****************************************************************/
-
-/* A union representing all possible protobuf values.  Used for generic get/set
- * operations. */
-
-typedef union {
-  bool b;
-  float flt;
-  double dbl;
-  int32_t i32;
-  int64_t i64;
-  uint32_t u32;
-  uint64_t u64;
-  const upb_map* map;
-  const upb_msg* msg;
-  const upb_array* arr;
-  const void* ptr;
-  upb_stringview str;
-} upb_msgval;
-
-#define ACCESSORS(name, membername, ctype) \
-  UPB_INLINE ctype upb_msgval_get ## name(upb_msgval v) { \
-    return v.membername; \
-  } \
-  UPB_INLINE void upb_msgval_set ## name(upb_msgval *v, ctype cval) { \
-    v->membername = cval; \
-  } \
-  UPB_INLINE upb_msgval upb_msgval_ ## name(ctype v) { \
-    upb_msgval ret; \
-    ret.membername = v; \
-    return ret; \
-  }
-
-ACCESSORS(bool,   b,   bool)
-ACCESSORS(float,  flt, float)
-ACCESSORS(double, dbl, double)
-ACCESSORS(int32,  i32, int32_t)
-ACCESSORS(int64,  i64, int64_t)
-ACCESSORS(uint32, u32, uint32_t)
-ACCESSORS(uint64, u64, uint64_t)
-ACCESSORS(map,    map, const upb_map*)
-ACCESSORS(msg,    msg, const upb_msg*)
-ACCESSORS(ptr,    ptr, const void*)
-ACCESSORS(arr,    arr, const upb_array*)
-ACCESSORS(str,    str, upb_stringview)
-
-#undef ACCESSORS
-
-UPB_INLINE upb_msgval upb_msgval_makestr(const char *data, size_t size) {
-  return upb_msgval_str(upb_stringview_make(data, size));
-}
-
-
-/** upb_msg *******************************************************************/
-
-/* A upb_msg represents a protobuf message.  It always corresponds to a specific
- * upb_msglayout, which describes how it is laid out in memory.
- *
- * The message will have a fixed size, as returned by upb_msg_sizeof(), which
- * will be used to store fixed-length fields.  The upb_msg may also allocate
- * dynamic memory internally to store data such as:
- *
- * - extensions
- * - unknown fields
- */
-
-/* Returns the size of a message given this layout. */
-size_t upb_msg_sizeof(const upb_msglayout *l);
-
-/* upb_msg_init() / upb_msg_uninit() allow the user to use a pre-allocated
- * block of memory as a message.  The block's size should be upb_msg_sizeof().
- * upb_msg_uninit() must be called to release internally-allocated memory
- * unless the allocator is an arena that does not require freeing.
- *
- * Please note that upb_msg_init() may return a value that is different than
- * |msg|, so you must assign the return value and not cast your memory block
- * to upb_msg* directly!
- *
- * Please note that upb_msg_uninit() does *not* free any submessages, maps,
- * or arrays referred to by this message's fields.  You must free them manually
- * yourself.
- *
- * upb_msg_uninit returns the original memory block, which may be useful if
- * you dynamically allocated it (though upb_msg_new() would normally be more
- * appropriate in this case). */
-upb_msg *upb_msg_init(void *msg, const upb_msglayout *l, upb_alloc *a);
-void *upb_msg_uninit(upb_msg *msg, const upb_msglayout *l);
-
-/* Like upb_msg_init() / upb_msg_uninit(), except the message's memory is
- * allocated / freed from the given upb_alloc. */
-upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a);
-void upb_msg_free(upb_msg *msg, const upb_msglayout *l);
-
-/* Returns the upb_alloc for the given message.
- * TODO(haberman): get rid of this?  Not sure we want to be storing this
- * for every message. */
-upb_alloc *upb_msg_alloc(const upb_msg *msg);
-
-/* Packs the tree of messages rooted at "msg" into a single hunk of memory,
- * allocated from the given allocator. */
-void *upb_msg_pack(const upb_msg *msg, const upb_msglayout *l,
-                   void *p, size_t *ofs, size_t size);
-
-/* Read-only message API.  Can be safely called by anyone. */
-
-/* Returns the value associated with this field:
- *   - for scalar fields (including strings), the value directly.
- *   - return upb_msg*, or upb_map* for msg/map.
- *     If the field is unset for these field types, returns NULL.
- *
- * TODO(haberman): should we let users store cached array/map/msg
- * pointers here for fields that are unset?  Could be useful for the
- * strongly-owned submessage model (ie. generated C API that doesn't use
- * arenas).
- */
-upb_msgval upb_msg_get(const upb_msg *msg,
-                       int field_index,
-                       const upb_msglayout *l);
-
-/* May only be called for fields where upb_fielddef_haspresence(f) == true. */
-bool upb_msg_has(const upb_msg *msg,
-                 int field_index,
-                 const upb_msglayout *l);
-
-/* Mutable message API.  May only be called by the owner of the message who
- * knows its ownership scheme and how to keep it consistent. */
-
-/* Sets the given field to the given value.  Does not perform any memory
- * management: if you overwrite a pointer to a msg/array/map/string without
- * cleaning it up (or using an arena) it will leak.
- */
-void upb_msg_set(upb_msg *msg,
-                 int field_index,
-                 upb_msgval val,
-                 const upb_msglayout *l);
-
-/* For a primitive field, set it back to its default. For repeated, string, and
- * submessage fields set it back to NULL.  This could involve releasing some
- * internal memory (for example, from an extension dictionary), but it is not
- * recursive in any way and will not recover any memory that may be used by
- * arrays/maps/strings/msgs that this field may have pointed to.
- */
-bool upb_msg_clearfield(upb_msg *msg,
-                        int field_index,
-                        const upb_msglayout *l);
-
-/* TODO(haberman): copyfrom()/mergefrom()? */
-
-
-/** upb_array *****************************************************************/
-
-/* A upb_array stores data for a repeated field.  The memory management
- * semantics are the same as upb_msg.  A upb_array allocates dynamic
- * memory internally for the array elements. */
-
-size_t upb_array_sizeof(upb_fieldtype_t type);
-void upb_array_init(upb_array *arr, upb_fieldtype_t type, upb_alloc *a);
-void upb_array_uninit(upb_array *arr);
-upb_array *upb_array_new(upb_fieldtype_t type, upb_alloc *a);
-void upb_array_free(upb_array *arr);
-
-/* Read-only interface.  Safe for anyone to call. */
-
-size_t upb_array_size(const upb_array *arr);
-upb_fieldtype_t upb_array_type(const upb_array *arr);
-upb_msgval upb_array_get(const upb_array *arr, size_t i);
-
-/* Write interface.  May only be called by the message's owner who can enforce
- * its memory management invariants. */
-
-bool upb_array_set(upb_array *arr, size_t i, upb_msgval val);
-
-
-/** upb_map *******************************************************************/
-
-/* A upb_map stores data for a map field.  The memory management semantics are
- * the same as upb_msg, with one notable exception.  upb_map will internally
- * store a copy of all string keys, but *not* any string values or submessages.
- * So you must ensure that any string or message values outlive the map, and you
- * must delete them manually when they are no longer required. */
-
-size_t upb_map_sizeof(upb_fieldtype_t ktype, upb_fieldtype_t vtype);
-bool upb_map_init(upb_map *map, upb_fieldtype_t ktype, upb_fieldtype_t vtype,
-                  upb_alloc *a);
-void upb_map_uninit(upb_map *map);
-upb_map *upb_map_new(upb_fieldtype_t ktype, upb_fieldtype_t vtype, upb_alloc *a);
-void upb_map_free(upb_map *map);
-
-/* Read-only interface.  Safe for anyone to call. */
-
-size_t upb_map_size(const upb_map *map);
-upb_fieldtype_t upb_map_keytype(const upb_map *map);
-upb_fieldtype_t upb_map_valuetype(const upb_map *map);
-bool upb_map_get(const upb_map *map, upb_msgval key, upb_msgval *val);
-
-/* Write interface.  May only be called by the message's owner who can enforce
- * its memory management invariants. */
-
-/* Sets or overwrites an entry in the map.  Return value indicates whether
- * the operation succeeded or failed with OOM, and also whether an existing
- * key was replaced or not. */
-bool upb_map_set(upb_map *map,
-                 upb_msgval key, upb_msgval val,
-                 upb_msgval *valremoved);
-
-/* Deletes an entry in the map.  Returns true if the key was present. */
-bool upb_map_del(upb_map *map, upb_msgval key);
-
-
-/** upb_mapiter ***************************************************************/
-
-/* For iterating over a map.  Map iterators are invalidated by mutations to the
- * map, but an invalidated iterator will never return junk or crash the process.
- * An invalidated iterator may return entries that were already returned though,
- * and if you keep invalidating the iterator during iteration, the program may
- * enter an infinite loop. */
-
-size_t upb_mapiter_sizeof();
-
-void upb_mapiter_begin(upb_mapiter *i, const upb_map *t);
-upb_mapiter *upb_mapiter_new(const upb_map *t, upb_alloc *a);
-void upb_mapiter_free(upb_mapiter *i, upb_alloc *a);
-void upb_mapiter_next(upb_mapiter *i);
-bool upb_mapiter_done(const upb_mapiter *i);
-
-upb_msgval upb_mapiter_key(const upb_mapiter *i);
-upb_msgval upb_mapiter_value(const upb_mapiter *i);
-void upb_mapiter_setdone(upb_mapiter *i);
-bool upb_mapiter_isequal(const upb_mapiter *i1, const upb_mapiter *i2);
-
-
-/** Handlers ******************************************************************/
-
-/* These are the handlers used internally by upb_msgfactory_getmergehandlers().
- * They write scalar data to a known offset from the message pointer.
- *
- * These would be trivial for anyone to implement themselves, but it's better
- * to use these because some JITs will recognize and specialize these instead
- * of actually calling the function. */
-
-/* Sets a handler for the given primitive field that will write the data at the
- * given offset.  If hasbit > 0, also sets a hasbit at the given bit offset
- * (addressing each byte low to high). */
-bool upb_msg_setscalarhandler(upb_handlers *h,
-                              const upb_fielddef *f,
-                              size_t offset,
-                              int32_t hasbit);
-
-/* If the given handler is a msghandlers_primitive field, returns true and sets
- * *type, *offset and *hasbit.  Otherwise returns false. */
-bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
-                                  upb_selector_t s,
-                                  upb_fieldtype_t *type,
-                                  size_t *offset,
-                                  int32_t *hasbit);
-
-
-/** Interfaces for generated code *********************************************/
-
-#define UPB_NOT_IN_ONEOF UINT16_MAX
-#define UPB_NO_HASBIT UINT16_MAX
-#define UPB_NO_SUBMSG UINT16_MAX
-
-typedef struct {
-  uint32_t number;
-  uint32_t offset;  /* If in a oneof, offset of default in default_msg below. */
-  uint16_t hasbit;        /* UPB_NO_HASBIT if no hasbit. */
-  uint16_t oneof_index;   /* UPB_NOT_IN_ONEOF if not in a oneof. */
-  uint16_t submsg_index;  /* UPB_NO_SUBMSG if no submsg. */
-  uint8_t type;
-  uint8_t label;
-} upb_msglayout_fieldinit_v1;
-
-typedef struct {
-  uint32_t data_offset;
-  uint32_t case_offset;
-} upb_msglayout_oneofinit_v1;
-
-typedef struct upb_msglayout_msginit_v1 {
-  const struct upb_msglayout_msginit_v1 *const* submsgs;
-  const upb_msglayout_fieldinit_v1 *fields;
-  const upb_msglayout_oneofinit_v1 *oneofs;
-  void *default_msg;
-  /* Must be aligned to sizeof(void*).  Doesn't include internal members like
-   * unknown fields, extension dict, pointer to msglayout, etc. */
-  uint32_t size;
-  uint16_t field_count;
-  uint16_t oneof_count;
-  bool extendable;
-  bool is_proto2;
-} upb_msglayout_msginit_v1;
-
-#define UPB_ALIGN_UP_TO(val, align) ((val + (align - 1)) & -align)
-#define UPB_ALIGNED_SIZEOF(type) UPB_ALIGN_UP_TO(sizeof(type), sizeof(void*))
-
-/* Initialize/uninitialize a msglayout from a msginit.  If upb uses v1
- * internally, this will not allocate any memory.  Should only be used by
- * generated code. */
-upb_msglayout *upb_msglayout_frominit_v1(
-    const upb_msglayout_msginit_v1 *init, upb_alloc *a);
-void upb_msglayout_uninit_v1(upb_msglayout *layout, upb_alloc *a);
+/* C API. */
+bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
+                  int32_t hasbit);
+const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,
+                                      upb_fieldtype_t *type);
 
 UPB_END_EXTERN_C
 
-#endif /* UPB_MSG_H_ */
-
-UPB_BEGIN_EXTERN_C
-
-bool upb_decode(upb_stringview buf, void *msg,
-                const upb_msglayout_msginit_v1 *l, upb_env *env);
-
-UPB_END_EXTERN_C
-
-#endif  /* UPB_DECODE_H_ */
-/*
-** structs.int.h: structures definitions that are internal to upb.
-*/
-
-#ifndef UPB_STRUCTS_H_
-#define UPB_STRUCTS_H_
-
-struct upb_array {
-  upb_fieldtype_t type;
-  uint8_t element_size;
-  void *data;   /* Each element is element_size. */
-  size_t len;   /* Measured in elements. */
-  size_t size;  /* Measured in elements. */
-  upb_alloc *alloc;
-};
-
-#endif  /* UPB_STRUCTS_H_ */
-
-/*
-** This file contains definitions of structs that should be considered private
-** and NOT stable across versions of upb.
-**
-** The only reason they are declared here and not in .c files is to allow upb
-** and the application (if desired) to embed statically-initialized instances
-** of structures like defs.
-**
-** If you include this file, all guarantees of ABI compatibility go out the
-** window!  Any code that includes this file needs to recompile against the
-** exact same version of upb that they are linking against.
-**
-** You also need to recompile if you change the value of the UPB_DEBUG_REFS
-** flag.
-*/
-
-
-#ifndef UPB_STATICINIT_H_
-#define UPB_STATICINIT_H_
-
 #ifdef __cplusplus
-/* Because of how we do our typedefs, this header can't be included from C++. */
-#error This file cannot be included from C++
+/* C++ Wrappers. */
+namespace upb {
+inline bool Shim::Set(Handlers* h, const FieldDef* f, size_t ofs,
+                      int32_t hasbit) {
+  return upb_shim_set(h, f, ofs, hasbit);
+}
+inline const Shim::Data* Shim::GetData(const Handlers* h, Handlers::Selector s,
+                                       FieldDef::Type* type) {
+  return upb_shim_getdata(h, s, type);
+}
+}  /* namespace upb */
 #endif
 
-/* upb_refcounted *************************************************************/
-
-
-/* upb_def ********************************************************************/
-
-struct upb_def {
-  upb_refcounted base;
-
-  const char *fullname;
-  const upb_filedef* file;
-  char type;  /* A upb_deftype_t (char to save space) */
-
-  /* Used as a flag during the def's mutable stage.  Must be false unless
-   * it is currently being used by a function on the stack.  This allows
-   * us to easily determine which defs were passed into the function's
-   * current invocation. */
-  bool came_from_user;
-};
-
-#define UPB_DEF_INIT(name, type, vtbl, refs, ref2s) \
-    { UPB_REFCOUNT_INIT(vtbl, refs, ref2s), name, NULL, type, false }
-
-
-/* upb_fielddef ***************************************************************/
-
-struct upb_fielddef {
-  upb_def base;
-
-  union {
-    int64_t sint;
-    uint64_t uint;
-    double dbl;
-    float flt;
-    void *bytes;
-  } defaultval;
-  union {
-    const upb_msgdef *def;  /* If !msg_is_symbolic. */
-    char *name;             /* If msg_is_symbolic. */
-  } msg;
-  union {
-    const upb_def *def;  /* If !subdef_is_symbolic. */
-    char *name;          /* If subdef_is_symbolic. */
-  } sub;  /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
-  bool subdef_is_symbolic;
-  bool msg_is_symbolic;
-  const upb_oneofdef *oneof;
-  bool default_is_string;
-  bool type_is_set_;     /* False until type is explicitly set. */
-  bool is_extension_;
-  bool lazy_;
-  bool packed_;
-  upb_intfmt_t intfmt;
-  bool tagdelim;
-  upb_fieldtype_t type_;
-  upb_label_t label_;
-  uint32_t number_;
-  uint32_t selector_base;  /* Used to index into a upb::Handlers table. */
-  uint32_t index_;
-};
-
-extern const struct upb_refcounted_vtbl upb_fielddef_vtbl;
-
-#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy,   \
-                          packed, name, num, msgdef, subdef, selector_base,    \
-                          index, defaultval, refs, ref2s)                      \
-  {                                                                            \
-    UPB_DEF_INIT(name, UPB_DEF_FIELD, &upb_fielddef_vtbl, refs, ref2s),        \
-        defaultval, {msgdef}, {subdef}, NULL, false, false,                    \
-        type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
-        lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
-  }
-
-
-/* upb_msgdef *****************************************************************/
-
-struct upb_msgdef {
-  upb_def base;
-
-  size_t selector_count;
-  uint32_t submsg_field_count;
-
-  /* Tables for looking up fields by number and name. */
-  upb_inttable itof;  /* int to field */
-  upb_strtable ntof;  /* name to field/oneof */
-
-  /* Is this a map-entry message? */
-  bool map_entry;
-
-  /* Whether this message has proto2 or proto3 semantics. */
-  upb_syntax_t syntax;
-
-  /* TODO(haberman): proper extension ranges (there can be multiple). */
-};
-
-extern const struct upb_refcounted_vtbl upb_msgdef_vtbl;
-
-/* TODO: also support static initialization of the oneofs table. This will be
- * needed if we compile in descriptors that contain oneofs. */
-#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
-                        map_entry, syntax, refs, ref2s)                       \
-  {                                                                           \
-    UPB_DEF_INIT(name, UPB_DEF_MSG, &upb_fielddef_vtbl, refs, ref2s),         \
-        selector_count, submsg_field_count, itof, ntof, map_entry, syntax     \
-  }
-
-
-/* upb_enumdef ****************************************************************/
-
-struct upb_enumdef {
-  upb_def base;
-
-  upb_strtable ntoi;
-  upb_inttable iton;
-  int32_t defaultval;
-};
-
-extern const struct upb_refcounted_vtbl upb_enumdef_vtbl;
-
-#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
-  { UPB_DEF_INIT(name, UPB_DEF_ENUM, &upb_enumdef_vtbl, refs, ref2s), ntoi,    \
-    iton, defaultval }
-
-
-/* upb_oneofdef ***************************************************************/
-
-struct upb_oneofdef {
-  upb_refcounted base;
-
-  uint32_t index;  /* Index within oneofs. */
-  const char *name;
-  upb_strtable ntof;
-  upb_inttable itof;
-  const upb_msgdef *parent;
-};
-
-extern const struct upb_refcounted_vtbl upb_oneofdef_vtbl;
-
-#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
-  { UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), 0, name, ntof, itof }
-
-
-/* upb_symtab *****************************************************************/
-
-struct upb_symtab {
-  upb_refcounted base;
-
-  upb_strtable symtab;
-};
-
-struct upb_filedef {
-  upb_refcounted base;
-
-  const char *name;
-  const char *package;
-  const char *phpprefix;
-  const char *phpnamespace;
-  upb_syntax_t syntax;
-
-  upb_inttable defs;
-  upb_inttable deps;
-};
-
-extern const struct upb_refcounted_vtbl upb_filedef_vtbl;
-
-#endif  /* UPB_STATICINIT_H_ */
+#endif  /* UPB_SHIM_H */
 /*
-** upb_encode: parsing into a upb_msg using a upb_msglayout.
+** upb::SymbolTable (upb_symtab)
+**
+** A symtab (symbol table) stores a name->def map of upb_defs.  Clients could
+** always create such tables themselves, but upb_symtab has logic for resolving
+** symbolic references, and in particular, for keeping a whole set of consistent
+** defs when replacing some subset of those defs.  This logic is nontrivial.
+**
+** This is a mixed C/C++ interface that offers a full API to both languages.
+** See the top-level README for more information.
 */
 
-#ifndef UPB_ENCODE_H_
-#define UPB_ENCODE_H_
+#ifndef UPB_SYMTAB_H_
+#define UPB_SYMTAB_H_
 
 
+#ifdef __cplusplus
+#include <vector>
+namespace upb { class SymbolTable; }
+#endif
+
+UPB_DECLARE_DERIVED_TYPE(upb::SymbolTable, upb::RefCounted,
+                         upb_symtab, upb_refcounted)
+
+typedef struct {
+ UPB_PRIVATE_FOR_CPP
+  upb_strtable_iter iter;
+  upb_deftype_t type;
+} upb_symtab_iter;
+
+#ifdef __cplusplus
+
+/* Non-const methods in upb::SymbolTable are NOT thread-safe. */
+class upb::SymbolTable {
+ public:
+  /* Returns a new symbol table with a single ref owned by "owner."
+   * Returns NULL if memory allocation failed. */
+  static reffed_ptr<SymbolTable> New();
+
+  /* Include RefCounted base methods. */
+  UPB_REFCOUNTED_CPPMETHODS
+
+  /* For all lookup functions, the returned pointer is not owned by the
+   * caller; it may be invalidated by any non-const call or unref of the
+   * SymbolTable!  To protect against this, take a ref if desired. */
+
+  /* Freezes the symbol table: prevents further modification of it.
+   * After the Freeze() operation is successful, the SymbolTable must only be
+   * accessed via a const pointer.
+   *
+   * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
+   * a necessary step in using a SymbolTable.  If you have no need for it to be
+   * immutable, there is no need to freeze it ever.  However sometimes it is
+   * useful, and SymbolTables that are statically compiled into the binary are
+   * always frozen by nature. */
+  void Freeze();
+
+  /* Resolves the given symbol using the rules described in descriptor.proto,
+   * namely:
+   *
+   *    If the name starts with a '.', it is fully-qualified.  Otherwise,
+   *    C++-like scoping rules are used to find the type (i.e. first the nested
+   *    types within this message are searched, then within the parent, on up
+   *    to the root namespace).
+   *
+   * If not found, returns NULL. */
+  const Def* Resolve(const char* base, const char* sym) const;
+
+  /* Finds an entry in the symbol table with this exact name.  If not found,
+   * returns NULL. */
+  const Def* Lookup(const char *sym) const;
+  const MessageDef* LookupMessage(const char *sym) const;
+  const EnumDef* LookupEnum(const char *sym) const;
+
+  /* TODO: introduce a C++ iterator, but make it nice and templated so that if
+   * you ask for an iterator of MessageDef the iterated elements are strongly
+   * typed as MessageDef*. */
+
+  /* Adds the given mutable defs to the symtab, resolving all symbols
+   * (including enum default values) and finalizing the defs.  Only one def per
+   * name may be in the list, but defs can replace existing defs in the symtab.
+   * All defs must have a name -- anonymous defs are not allowed.  Anonymous
+   * defs can still be frozen by calling upb_def_freeze() directly.
+   *
+   * Any existing defs that can reach defs that are being replaced will
+   * themselves be replaced also, so that the resulting set of defs is fully
+   * consistent.
+   *
+   * This logic implemented in this method is a convenience; ultimately it
+   * calls some combination of upb_fielddef_setsubdef(), upb_def_dup(), and
+   * upb_freeze(), any of which the client could call themself.  However, since
+   * the logic for doing so is nontrivial, we provide it here.
+   *
+   * The entire operation either succeeds or fails.  If the operation fails,
+   * the symtab is unchanged, false is returned, and status indicates the
+   * error.  The caller passes a ref on all defs to the symtab (even if the
+   * operation fails).
+   *
+   * TODO(haberman): currently failure will leave the symtab unchanged, but may
+   * leave the defs themselves partially resolved.  Does this matter?  If so we
+   * could do a prepass that ensures that all symbols are resolvable and bail
+   * if not, so we don't mutate anything until we know the operation will
+   * succeed.
+   *
+   * TODO(haberman): since the defs must be mutable, refining a frozen def
+   * requires making mutable copies of the entire tree.  This is wasteful if
+   * only a few messages are changing.  We may want to add a way of adding a
+   * tree of frozen defs to the symtab (perhaps an alternate constructor where
+   * you pass the root of the tree?) */
+  bool Add(Def*const* defs, size_t n, void* ref_donor, Status* status);
+
+  bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
+    return Add((Def*const*)&defs[0], defs.size(), owner, status);
+  }
+
+  /* Resolves all subdefs for messages in this file and attempts to freeze the
+   * file.  If this succeeds, adds all the symbols to this SymbolTable
+   * (replacing any existing ones with the same names). */
+  bool AddFile(FileDef* file, Status* s);
+
+ private:
+  UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable)
+};
+
+#endif  /* __cplusplus */
+
 UPB_BEGIN_EXTERN_C
 
-char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *l,
-                 upb_env *env, size_t *size);
+/* Native C API. */
+
+/* Include refcounted methods like upb_symtab_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_symtab, upb_symtab_upcast)
+
+upb_symtab *upb_symtab_new(const void *owner);
+void upb_symtab_freeze(upb_symtab *s);
+const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
+                                  const char *sym);
+const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
+const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
+const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
+bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
+                    void *ref_donor, upb_status *status);
+bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status* status);
+
+/* upb_symtab_iter i;
+ * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
+ *     upb_symtab_next(&i)) {
+ *   const upb_def *def = upb_symtab_iter_def(&i);
+ *    // ...
+ * }
+ *
+ * For C we don't have separate iterators for const and non-const.
+ * It is the caller's responsibility to cast the upb_fielddef* to
+ * const if the upb_msgdef* is const. */
+void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
+                      upb_deftype_t type);
+void upb_symtab_next(upb_symtab_iter *iter);
+bool upb_symtab_done(const upb_symtab_iter *iter);
+const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
 
 UPB_END_EXTERN_C
 
-#endif  /* UPB_ENCODE_H_ */
+#ifdef __cplusplus
+/* C++ inline wrappers. */
+namespace upb {
+inline reffed_ptr<SymbolTable> SymbolTable::New() {
+  upb_symtab *s = upb_symtab_new(&s);
+  return reffed_ptr<SymbolTable>(s, &s);
+}
+
+inline void SymbolTable::Freeze() {
+  return upb_symtab_freeze(this);
+}
+inline const Def *SymbolTable::Resolve(const char *base,
+                                       const char *sym) const {
+  return upb_symtab_resolve(this, base, sym);
+}
+inline const Def* SymbolTable::Lookup(const char *sym) const {
+  return upb_symtab_lookup(this, sym);
+}
+inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
+  return upb_symtab_lookupmsg(this, sym);
+}
+inline bool SymbolTable::Add(
+    Def*const* defs, size_t n, void* ref_donor, Status* status) {
+  return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
+}
+inline bool SymbolTable::AddFile(FileDef* file, Status* s) {
+  return upb_symtab_addfile(this, file, s);
+}
+}  /* namespace upb */
+#endif
+
+#endif  /* UPB_SYMTAB_H_ */
 /*
 ** upb::descriptor::Reader (upb_descreader)
 **
@@ -7277,113 +6853,111 @@
 
 
 /* Functions to get a fielddef from a msgdef reference. */
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_end(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_start(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_end(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_start(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_enum_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension_range(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_field(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_nested_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_oneof_decl(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_range(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_allow_alias(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_number(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_default_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_extendee(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_json_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_label(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_number(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_oneof_index(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_ctype(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_jstype(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_lazy(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_packed(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_weak(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_enum_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_message_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_public_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_service(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_source_code_info(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_syntax(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 12); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_weak_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 11); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_f_file(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorSet_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_enable_arenas(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 31); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 16); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_csharp_namespace(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 37); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 23); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_go_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 11); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generate_equals_and_hash(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 20); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 17); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_multiple_files(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_outer_classname(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_string_check_utf8(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 27); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_javanano_use_deprecated_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 38); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_objc_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 36); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_optimize_for(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_php_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 40); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_php_namespace(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 41); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_py_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 18); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_map_entry(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_message_set_wire_format(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_no_standard_descriptor_accessor(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_client_streaming(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_input_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_output_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_server_streaming(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 33); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_OneofDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_OneofDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_method(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 33); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_detached_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_path(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_span(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_trailing_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_f_location(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_is_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_name_part(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_aggregate_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_double_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_identifier_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_negative_int_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_positive_int_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_string_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_end(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_start(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_end(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_start(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_enum_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension_range(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_field(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_nested_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_oneof_decl(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_range(const upb_msgdef *m) { assert(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_allow_alias(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_number(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_default_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_extendee(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_json_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_label(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_number(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_oneof_index(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_ctype(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_jstype(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_lazy(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_packed(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_weak(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_dependency(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_enum_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_extension(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_message_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_package(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_public_dependency(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_service(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_source_code_info(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_syntax(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 12); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_weak_dependency(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 11); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_f_file(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileDescriptorSet_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_enable_arenas(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 31); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_generic_services(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 16); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_csharp_namespace(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 37); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 23); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_go_package(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 11); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generate_equals_and_hash(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 20); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generic_services(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 17); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_multiple_files(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_outer_classname(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_package(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_string_check_utf8(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 27); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_javanano_use_deprecated_package(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 38); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_objc_class_prefix(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 36); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_optimize_for(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_py_generic_services(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 18); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_map_entry(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_message_set_wire_format(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_no_standard_descriptor_accessor(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_client_streaming(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_input_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_output_type(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_server_streaming(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 33); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_OneofDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_OneofDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_method(const upb_msgdef *m) { assert(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_options(const upb_msgdef *m) { assert(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_deprecated(const upb_msgdef *m) { assert(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 33); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_uninterpreted_option(const upb_msgdef *m) { assert(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_comments(const upb_msgdef *m) { assert(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_detached_comments(const upb_msgdef *m) { assert(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_path(const upb_msgdef *m) { assert(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_span(const upb_msgdef *m) { assert(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_trailing_comments(const upb_msgdef *m) { assert(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_f_location(const upb_msgdef *m) { assert(upbdefs_google_protobuf_SourceCodeInfo_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_is_extension(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_name_part(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_aggregate_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_double_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_identifier_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_name(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_negative_int_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_positive_int_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_string_value(const upb_msgdef *m) { assert(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 7); }
 
 UPB_END_EXTERN_C
 
@@ -7397,7 +6971,7 @@
  public:
   DescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_DescriptorProto_is(m));
   }
 
   static DescriptorProto get() {
@@ -7409,7 +6983,7 @@
    public:
     ExtensionRange(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m));
+      assert(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m));
     }
 
     static ExtensionRange get() {
@@ -7422,7 +6996,7 @@
    public:
     ReservedRange(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m));
+      assert(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m));
     }
 
     static ReservedRange get() {
@@ -7436,7 +7010,7 @@
  public:
   EnumDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_EnumDescriptorProto_is(m));
   }
 
   static EnumDescriptorProto get() {
@@ -7449,7 +7023,7 @@
  public:
   EnumOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m));
+    assert(upbdefs_google_protobuf_EnumOptions_is(m));
   }
 
   static EnumOptions get() {
@@ -7462,7 +7036,7 @@
  public:
   EnumValueDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m));
   }
 
   static EnumValueDescriptorProto get() {
@@ -7475,7 +7049,7 @@
  public:
   EnumValueOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m));
+    assert(upbdefs_google_protobuf_EnumValueOptions_is(m));
   }
 
   static EnumValueOptions get() {
@@ -7488,7 +7062,7 @@
  public:
   FieldDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_FieldDescriptorProto_is(m));
   }
 
   static FieldDescriptorProto get() {
@@ -7500,7 +7074,7 @@
    public:
     Label(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_Label_is(e));
+      assert(upbdefs_google_protobuf_FieldDescriptorProto_Label_is(e));
     }
     static Label get() {
       const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldDescriptorProto_Label_get(&e);
@@ -7512,7 +7086,7 @@
    public:
     Type(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_Type_is(e));
+      assert(upbdefs_google_protobuf_FieldDescriptorProto_Type_is(e));
     }
     static Type get() {
       const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldDescriptorProto_Type_get(&e);
@@ -7525,7 +7099,7 @@
  public:
   FieldOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m));
+    assert(upbdefs_google_protobuf_FieldOptions_is(m));
   }
 
   static FieldOptions get() {
@@ -7537,7 +7111,7 @@
    public:
     CType(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_CType_is(e));
+      assert(upbdefs_google_protobuf_FieldOptions_CType_is(e));
     }
     static CType get() {
       const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldOptions_CType_get(&e);
@@ -7549,7 +7123,7 @@
    public:
     JSType(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_JSType_is(e));
+      assert(upbdefs_google_protobuf_FieldOptions_JSType_is(e));
     }
     static JSType get() {
       const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldOptions_JSType_get(&e);
@@ -7562,7 +7136,7 @@
  public:
   FileDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_FileDescriptorProto_is(m));
   }
 
   static FileDescriptorProto get() {
@@ -7575,7 +7149,7 @@
  public:
   FileDescriptorSet(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorSet_is(m));
+    assert(upbdefs_google_protobuf_FileDescriptorSet_is(m));
   }
 
   static FileDescriptorSet get() {
@@ -7588,7 +7162,7 @@
  public:
   FileOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m));
+    assert(upbdefs_google_protobuf_FileOptions_is(m));
   }
 
   static FileOptions get() {
@@ -7600,7 +7174,7 @@
    public:
     OptimizeMode(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         : reffed_ptr(e, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_FileOptions_OptimizeMode_is(e));
+      assert(upbdefs_google_protobuf_FileOptions_OptimizeMode_is(e));
     }
     static OptimizeMode get() {
       const ::upb::EnumDef* e = upbdefs_google_protobuf_FileOptions_OptimizeMode_get(&e);
@@ -7613,7 +7187,7 @@
  public:
   MessageOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m));
+    assert(upbdefs_google_protobuf_MessageOptions_is(m));
   }
 
   static MessageOptions get() {
@@ -7626,7 +7200,7 @@
  public:
   MethodDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_MethodDescriptorProto_is(m));
   }
 
   static MethodDescriptorProto get() {
@@ -7639,7 +7213,7 @@
  public:
   MethodOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m));
+    assert(upbdefs_google_protobuf_MethodOptions_is(m));
   }
 
   static MethodOptions get() {
@@ -7652,7 +7226,7 @@
  public:
   OneofDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_OneofDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_OneofDescriptorProto_is(m));
   }
 
   static OneofDescriptorProto get() {
@@ -7665,7 +7239,7 @@
  public:
   ServiceDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m));
+    assert(upbdefs_google_protobuf_ServiceDescriptorProto_is(m));
   }
 
   static ServiceDescriptorProto get() {
@@ -7678,7 +7252,7 @@
  public:
   ServiceOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m));
+    assert(upbdefs_google_protobuf_ServiceOptions_is(m));
   }
 
   static ServiceOptions get() {
@@ -7691,7 +7265,7 @@
  public:
   SourceCodeInfo(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_is(m));
+    assert(upbdefs_google_protobuf_SourceCodeInfo_is(m));
   }
 
   static SourceCodeInfo get() {
@@ -7703,7 +7277,7 @@
    public:
     Location(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m));
+      assert(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m));
     }
 
     static Location get() {
@@ -7717,7 +7291,7 @@
  public:
   UninterpretedOption(const ::upb::MessageDef* m, const void *ref_donor = NULL)
       : reffed_ptr(m, ref_donor) {
-    UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m));
+    assert(upbdefs_google_protobuf_UninterpretedOption_is(m));
   }
 
   static UninterpretedOption get() {
@@ -7729,7 +7303,7 @@
    public:
     NamePart(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         : reffed_ptr(m, ref_donor) {
-      UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m));
+      assert(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m));
     }
 
     static NamePart get() {
@@ -8399,9 +7973,21 @@
 extern "C" {
 #endif
 
+/* A list of types as they are encoded on-the-wire. */
+typedef enum {
+  UPB_WIRE_TYPE_VARINT      = 0,
+  UPB_WIRE_TYPE_64BIT       = 1,
+  UPB_WIRE_TYPE_DELIMITED   = 2,
+  UPB_WIRE_TYPE_START_GROUP = 3,
+  UPB_WIRE_TYPE_END_GROUP   = 4,
+  UPB_WIRE_TYPE_32BIT       = 5
+} upb_wiretype_t;
+
 #define UPB_MAX_WIRE_TYPE 5
 
-/* The maximum number of bytes that it takes to encode a 64-bit varint. */
+/* The maximum number of bytes that it takes to encode a 64-bit varint.
+ * Note that with a better encoding this could be 9 (TODO: write up a
+ * wiki document about this). */
 #define UPB_PB_VARINT_MAX_LEN 10
 
 /* Array of the "native" (ie. non-packed-repeated) wire type for the given a
@@ -8434,8 +8020,16 @@
   return ret;
 }
 
+/* Four functions for decoding a varint of at most eight bytes.  They are all
+ * functionally identical, but are implemented in different ways and likely have
+ * different performance profiles.  We keep them around for performance testing.
+ *
+ * Note that these functions may not read byte-by-byte, so they must not be used
+ * unless there are at least eight bytes left in the buffer! */
 upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r);
 upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r);
+upb_decoderet upb_vdecode_max8_wright(upb_decoderet r);
+upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r);
 
 /* Template for a function that checks the first two bytes with branching
  * and dispatches 2-10 bytes with a separate function.  Note that this may read
@@ -8460,6 +8054,8 @@
 
 UPB_VARINT_DECODER_CHECK2(branch32, upb_vdecode_max8_branch32)
 UPB_VARINT_DECODER_CHECK2(branch64, upb_vdecode_max8_branch64)
+UPB_VARINT_DECODER_CHECK2(wright, upb_vdecode_max8_wright)
+UPB_VARINT_DECODER_CHECK2(massimino, upb_vdecode_max8_massimino)
 #undef UPB_VARINT_DECODER_CHECK2
 
 /* Our canonical functions for decoding varints, based on the currently
@@ -8471,6 +8067,10 @@
     return upb_vdecode_check2_branch32(p);
 }
 
+UPB_INLINE upb_decoderet upb_vdecode_max8_fast(upb_decoderet r) {
+  return upb_vdecode_max8_massimino(r);
+}
+
 
 /* Encoding *******************************************************************/
 
@@ -8512,9 +8112,9 @@
   char buf[UPB_PB_VARINT_MAX_LEN];
   size_t bytes = upb_vencode64(val, buf);
   uint64_t ret = 0;
-  UPB_ASSERT(bytes <= 5);
+  assert(bytes <= 5);
   memcpy(&ret, buf, bytes);
-  UPB_ASSERT(ret <= 0xffffffffffU);
+  assert(ret <= 0xffffffffffU);
   return ret;
 }
 
diff --git a/ruby/ext/google/protobuf_c/wrap_memcpy.c b/ruby/ext/google/protobuf_c/wrap_memcpy.c
deleted file mode 100644
index 394a52f..0000000
--- a/ruby/ext/google/protobuf_c/wrap_memcpy.c
+++ /dev/null
@@ -1,51 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2017 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.
-
-#include <string.h>
-
-// On x86-64 Linux with glibc, we link against the 2.2.5 version of memcpy so
-// that we avoid depending on the 2.14 version of the symbol. This way,
-// distributions that are using pre-2.14 versions of glibc can successfully use
-// the gem we distribute (https://github.com/google/protobuf/issues/2783).
-//
-// This wrapper is enabled by passing the linker flags -Wl,-wrap,memcpy in
-// extconf.rb.
-#ifdef __linux__
-#if defined(__x86_64__) && defined(__GNU_LIBRARY__)
-__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
-void *__wrap_memcpy(void *dest, const void *src, size_t n) {
-    return memcpy(dest, src, n);
-}
-#else
-void *__wrap_memcpy(void *dest, const void *src, size_t n) {
-    return memmove(dest, src, n);
-}
-#endif
-#endif
diff --git a/ruby/google-protobuf.gemspec b/ruby/google-protobuf.gemspec
index c09a7f2..c542abf 100644
--- a/ruby/google-protobuf.gemspec
+++ b/ruby/google-protobuf.gemspec
@@ -1,7 +1,7 @@
 Gem::Specification.new do |s|
   s.name        = "google-protobuf"
-  s.version     = "3.5.2"
-  s.licenses    = ["BSD-3-Clause"]
+  s.version     = "3.0.0.alpha.6.0.0"
+  s.licenses    = ["BSD"]
   s.summary     = "Protocol Buffers"
   s.description = "Protocol Buffers are Google's data interchange format."
   s.homepage    = "https://developers.google.com/protocol-buffers"
@@ -10,17 +10,16 @@
   s.require_paths = ["lib"]
   s.files       = Dir.glob('lib/**/*.rb')
   if RUBY_PLATFORM == "java"
-    s.platform  = "java"
     s.files     += ["lib/google/protobuf_java.jar"]
   else
     s.files     += Dir.glob('ext/**/*')
     s.extensions= ["ext/google/protobuf_c/extconf.rb"]
-    s.add_development_dependency "rake-compiler-dock", "~> 0.6.0"
+    s.add_development_dependency "rake-compiler-dock"
   end
   s.test_files  = ["tests/basic.rb",
                   "tests/stress.rb",
                   "tests/generated_code_test.rb"]
-  s.add_development_dependency "rake-compiler", "~> 0.9.5"
-  s.add_development_dependency "test-unit", '~> 3.0', '>= 3.0.9'
-  s.add_development_dependency "rubygems-tasks", "~> 0.2.4"
+  s.add_development_dependency "rake-compiler"
+  s.add_development_dependency "test-unit"
+  s.add_development_dependency "rubygems-tasks"
 end
diff --git a/ruby/lib/google/protobuf.rb b/ruby/lib/google/protobuf.rb
index 9b8d823..62bdd1b 100644
--- a/ruby/lib/google/protobuf.rb
+++ b/ruby/lib/google/protobuf.rb
@@ -45,7 +45,7 @@
   require 'google/protobuf_java'
 else
   begin
-    require "google/#{RUBY_VERSION.sub(/\.\d+$/, '')}/protobuf_c"
+    require "google/#{RUBY_VERSION.sub(/\.\d$/, '')}/protobuf_c"
   rescue LoadError
     require 'google/protobuf_c'
   end
diff --git a/ruby/lib/google/protobuf/repeated_field.rb b/ruby/lib/google/protobuf/repeated_field.rb
index 11d6c2e..0ad2060 100644
--- a/ruby/lib/google/protobuf/repeated_field.rb
+++ b/ruby/lib/google/protobuf/repeated_field.rb
@@ -74,7 +74,7 @@
         :include?, :index, :inspect, :join,
         :pack, :permutation, :product, :pretty_print, :pretty_print_cycle,
         :rassoc, :repeated_combination, :repeated_permutation, :reverse,
-        :rindex, :rotate, :sample, :shuffle, :shelljoin,
+        :rindex, :rotate, :sample, :shuffle, :shelljoin, :slice,
         :to_s, :transpose, :uniq, :|
 
 
@@ -173,7 +173,7 @@
           external_enumerator.each_with_index do |val, i|
             result = yield(val)
             results << result
-            #nil means no change occurred from yield; usually occurs when #to_a is called
+            #nil means no change occured from yield; usually occurs when #to_a is called
             if result
               repeated_field[i] = result if result != val
             end
diff --git a/ruby/lib/google/protobuf/well_known_types.rb b/ruby/lib/google/protobuf/well_known_types.rb
deleted file mode 100644
index 921ddbc..0000000
--- a/ruby/lib/google/protobuf/well_known_types.rb
+++ /dev/null
@@ -1,212 +0,0 @@
-#!/usr/bin/ruby
-# 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.
-
-require 'google/protobuf/any_pb'
-require 'google/protobuf/duration_pb'
-require 'google/protobuf/field_mask_pb'
-require 'google/protobuf/struct_pb'
-require 'google/protobuf/timestamp_pb'
-
-module Google
-  module Protobuf
-
-    Any.class_eval do
-      def pack(msg, type_url_prefix='type.googleapis.com/')
-        if type_url_prefix.empty? or type_url_prefix[-1] != '/' then
-          self.type_url = "#{type_url_prefix}/#{msg.class.descriptor.name}"
-        else
-          self.type_url = "#{type_url_prefix}#{msg.class.descriptor.name}"
-        end
-        self.value = msg.to_proto
-      end
-
-      def unpack(klass)
-        if self.is(klass) then
-          klass.decode(self.value)
-        else
-          nil
-        end
-      end
-
-      def type_name
-        return self.type_url.split("/")[-1]
-      end
-
-      def is(klass)
-        return self.type_name == klass.descriptor.name
-      end
-    end
-
-    Timestamp.class_eval do
-      def to_time
-        Time.at(self.to_f)
-      end
-
-      def from_time(time)
-        self.seconds = time.to_i
-        self.nanos = time.nsec
-      end
-
-      def to_i
-        self.seconds
-      end
-
-      def to_f
-        self.seconds + (self.nanos.quo(1_000_000_000))
-      end
-    end
-
-    Duration.class_eval do
-      def to_f
-        self.seconds + (self.nanos.to_f / 1_000_000_000)
-      end
-    end
-
-    class UnexpectedStructType < Google::Protobuf::Error; end
-
-    Value.class_eval do
-      def to_ruby(recursive = false)
-        case self.kind
-        when :struct_value
-          if recursive
-            self.struct_value.to_h
-          else
-            self.struct_value
-          end
-        when :list_value
-          if recursive
-            self.list_value.to_a
-          else
-            self.list_value
-          end
-        when :null_value
-          nil
-        when :number_value
-          self.number_value
-        when :string_value
-          self.string_value
-        when :bool_value
-          self.bool_value
-        else
-          raise UnexpectedStructType
-        end
-      end
-
-      def from_ruby(value)
-        case value
-        when NilClass
-          self.null_value = 0
-        when Numeric
-          self.number_value = value
-        when String
-          self.string_value = value
-        when TrueClass
-          self.bool_value = true
-        when FalseClass
-          self.bool_value = false
-        when Struct
-          self.struct_value = value
-        when Hash
-          self.struct_value = Struct.from_hash(value)
-        when ListValue
-          self.list_value = value
-        when Array
-          self.list_value = ListValue.from_a(value)
-        else
-          raise UnexpectedStructType
-        end
-      end
-    end
-
-    Struct.class_eval do
-      def [](key)
-        self.fields[key].to_ruby
-      end
-
-      def []=(key, value)
-        unless key.is_a?(String)
-          raise UnexpectedStructType, "Struct keys must be strings."
-        end
-        self.fields[key] ||= Google::Protobuf::Value.new
-        self.fields[key].from_ruby(value)
-      end
-
-      def to_h
-        ret = {}
-        self.fields.each { |key, val| ret[key] = val.to_ruby(true) }
-        ret
-      end
-
-      def self.from_hash(hash)
-        ret = Struct.new
-        hash.each { |key, val| ret[key] = val }
-        ret
-      end
-    end
-
-    ListValue.class_eval do
-      include Enumerable
-
-      def length
-        self.values.length
-      end
-
-      def [](index)
-        self.values[index].to_ruby
-      end
-
-      def []=(index, value)
-        self.values[index].from_ruby(value)
-      end
-
-      def <<(value)
-        wrapper = Google::Protobuf::Value.new
-        wrapper.from_ruby(value)
-        self.values << wrapper
-      end
-
-      def each
-        self.values.each { |x| yield(x.to_ruby) }
-      end
-
-      def to_a
-        self.values.map { |x| x.to_ruby(true) }
-      end
-
-      def self.from_a(arr)
-        ret = ListValue.new
-        arr.each { |val| ret << val }
-        ret
-      end
-    end
-
-  end
-end
diff --git a/ruby/pom.xml b/ruby/pom.xml
index adf6ff2..4cbd6d3 100644
--- a/ruby/pom.xml
+++ b/ruby/pom.xml
@@ -21,8 +21,8 @@
     <url>https://developers.google.com/protocol-buffers/</url>
     <licenses>
       <license>
-        <name>3-Clause BSD License</name>
-        <url>https://opensource.org/licenses/BSD-3-Clause</url>
+        <name>New BSD license</name>
+        <url>http://www.opensource.org/licenses/bsd-license.php</url>
         <distribution>repo</distribution>
       </license>
     </licenses>
@@ -86,7 +86,7 @@
         <dependency>
             <groupId>com.google.protobuf</groupId>
             <artifactId>protobuf-java</artifactId>
-            <version>3.0.0</version>
+            <version>3.0.0-alpha-3</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java
index 3adaa2a..2d4c03b 100644
--- a/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java
+++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java
@@ -148,8 +148,8 @@
      */
     @JRubyMethod(name = "[]=")
     public IRubyObject indexSet(ThreadContext context, IRubyObject key, IRubyObject value) {
-        key = Utils.checkType(context, keyType, key, (RubyModule) valueTypeClass);
-        value = Utils.checkType(context, valueType, value, (RubyModule) valueTypeClass);
+        Utils.checkType(context, keyType, key, (RubyModule) valueTypeClass);
+        Utils.checkType(context, valueType, value, (RubyModule) valueTypeClass);
         IRubyObject symbol;
         if (valueType == Descriptors.FieldDescriptor.Type.ENUM &&
                 Utils.isRubyNum(value) &&
diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
index 07558fb..39213c4 100644
--- a/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
+++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
@@ -41,8 +41,6 @@
 import org.jruby.runtime.builtin.IRubyObject;
 import org.jruby.util.ByteList;
 
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -82,8 +80,8 @@
             hash.visitAll(new RubyHash.Visitor() {
                 @Override
                 public void visit(IRubyObject key, IRubyObject value) {
-                    if (!(key instanceof RubySymbol) && !(key instanceof RubyString))
-                        throw runtime.newTypeError("Expected string or symbols as hash keys in initialization map.");
+                    if (!(key instanceof RubySymbol))
+                        throw runtime.newTypeError("Expected symbols as hash keys in initialization map.");
                     final Descriptors.FieldDescriptor fieldDescriptor = findField(context, key);
 
                     if (Utils.isMapEntry(fieldDescriptor)) {
@@ -103,15 +101,9 @@
                         if (oneof != null) {
                             oneofCases.put(oneof, fieldDescriptor);
                         }
-
-                        if (value instanceof RubyHash && fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.MESSAGE) {
-                            RubyDescriptor descriptor = (RubyDescriptor) getDescriptorForField(context, fieldDescriptor);
-                            RubyClass typeClass = (RubyClass) descriptor.msgclass(context);
-                            value = (IRubyObject) typeClass.newInstance(context, value, Block.NULL_BLOCK);
-                        }
-
                         fields.put(fieldDescriptor, value);
                     }
+
                 }
             });
         }
@@ -172,21 +164,8 @@
      */
     @JRubyMethod
     public IRubyObject hash(ThreadContext context) {
-        try {
-            MessageDigest digest = MessageDigest.getInstance("SHA-256");
-            for (RubyMap map : maps.values()) {
-                digest.update((byte) map.hashCode());
-            }
-            for (RubyRepeatedField repeatedField : repeatedFields.values()) {
-                digest.update((byte) repeatedFields.hashCode());
-            }
-            for (IRubyObject field : fields.values()) {
-                digest.update((byte) field.hashCode());
-            }
-            return context.runtime.newString(new ByteList(digest.digest()));
-        } catch (NoSuchAlgorithmException ignore) {
-            return context.runtime.newFixnum(System.identityHashCode(this));
-        }
+        int hashCode = System.identityHashCode(this);
+        return context.runtime.newFixnum(hashCode);
     }
 
     /*
@@ -373,19 +352,7 @@
         for (Descriptors.FieldDescriptor fdef : this.descriptor.getFields()) {
             IRubyObject value = getField(context, fdef);
             if (!value.isNil()) {
-                if (fdef.isRepeated() && !fdef.isMapField()) {
-                    if (fdef.getType() != Descriptors.FieldDescriptor.Type.MESSAGE) {
-                        value = Helpers.invoke(context, value, "to_a");
-                    } else {
-                        RubyArray ary = value.convertToArray();
-                        for (int i = 0; i < ary.size(); i++) {
-                            IRubyObject submsg = Helpers.invoke(context, ary.eltInternal(i), "to_h");
-                            ary.eltInternalSet(i, submsg);
-                        }
-
-                        value = ary.to_ary();
-                    }
-                } else if (value.respondsTo("to_h")) {
+                if (value.respondsTo("to_h")) {
                     value = Helpers.invoke(context, value, "to_h");
                 } else if (value.respondsTo("to_a")) {
                     value = Helpers.invoke(context, value, "to_a");
@@ -536,12 +503,19 @@
                 val = value.isTrue();
                 break;
             case BYTES:
-                Utils.validateStringEncoding(context, fieldDescriptor.getType(), value);
-                val = ByteString.copyFrom(((RubyString) value).getBytes());
-                break;
             case STRING:
-                Utils.validateStringEncoding(context, fieldDescriptor.getType(), value);
-                val = ((RubyString) value).asJavaString();
+                Utils.validateStringEncoding(context.runtime, fieldDescriptor.getType(), value);
+                RubyString str = (RubyString) value;
+                switch (fieldDescriptor.getType()) {
+                    case BYTES:
+                        val = ByteString.copyFrom(str.getBytes());
+                        break;
+                    case STRING:
+                        val = str.asJavaString();
+                        break;
+                    default:
+                        break;
+                }
                 break;
             case MESSAGE:
                 RubyClass typeClass = (RubyClass) ((RubyDescriptor) getDescriptorForField(context, fieldDescriptor)).msgclass(context);
@@ -554,7 +528,7 @@
 
                 if (Utils.isRubyNum(value)) {
                     val = enumDescriptor.findValueByNumberCreatingIfUnknown(RubyNumeric.num2int(value));
-                } else if (value instanceof RubySymbol || value instanceof RubyString) {
+                } else if (value instanceof RubySymbol) {
                     val = enumDescriptor.findValueByName(value.asJavaString());
                 } else {
                     throw runtime.newTypeError("Expected number or symbol type for enum field.");
@@ -618,17 +592,13 @@
     protected IRubyObject getField(ThreadContext context, Descriptors.FieldDescriptor fieldDescriptor) {
         Descriptors.OneofDescriptor oneofDescriptor = fieldDescriptor.getContainingOneof();
         if (oneofDescriptor != null) {
-            if (oneofCases.get(oneofDescriptor) == fieldDescriptor) {
+            if (oneofCases.containsKey(oneofDescriptor)) {
+                if (oneofCases.get(oneofDescriptor) != fieldDescriptor)
+                    return context.runtime.getNil();
                 return fields.get(fieldDescriptor);
             } else {
                 Descriptors.FieldDescriptor oneofCase = builder.getOneofFieldDescriptor(oneofDescriptor);
-                if (oneofCase != fieldDescriptor) {
-                  if (fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.MESSAGE) {
-                    return context.runtime.getNil();
-                  } else {
-                    return wrapField(context, fieldDescriptor, fieldDescriptor.getDefaultValue());
-                  }
-                }
+                if (oneofCase != fieldDescriptor) return context.runtime.getNil();
                 IRubyObject value = wrapField(context, oneofCase, builder.getField(oneofCase));
                 fields.put(fieldDescriptor, value);
                 return value;
@@ -721,7 +691,7 @@
                     }
                 }
                 if (addValue) {
-                    value = Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
+                    Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
                     this.fields.put(fieldDescriptor, value);
                 } else {
                     this.fields.remove(fieldDescriptor);
@@ -752,20 +722,8 @@
                                                   Descriptors.FieldDescriptor fieldDescriptor, IRubyObject value) {
         RubyArray arr = value.convertToArray();
         RubyRepeatedField repeatedField = repeatedFieldForFieldDescriptor(context, fieldDescriptor);
-
-        RubyClass typeClass = null;
-        if (fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.MESSAGE) {
-            RubyDescriptor descriptor = (RubyDescriptor) getDescriptorForField(context, fieldDescriptor);
-            typeClass = (RubyClass) descriptor.msgclass(context);
-        }
-
         for (int i = 0; i < arr.size(); i++) {
-            IRubyObject row = arr.eltInternal(i);
-            if (row instanceof RubyHash && typeClass != null) {
-                row = (IRubyObject) typeClass.newInstance(context, row, Block.NULL_BLOCK);
-            }
-
-            repeatedField.push(context, row);
+            repeatedField.push(context, arr.eltInternal(i));
         }
         return repeatedField;
     }
diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java
index ae2907a..946f9e7 100644
--- a/ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java
+++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java
@@ -110,7 +110,7 @@
     @JRubyMethod(name = "[]=")
     public IRubyObject indexSet(ThreadContext context, IRubyObject index, IRubyObject value) {
         int arrIndex = normalizeArrayIndex(index);
-        value = Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
+        Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
         IRubyObject defaultValue = defaultValue(context);
         for (int i = this.storage.size(); i < arrIndex; i++) {
             this.storage.set(i, defaultValue);
@@ -166,7 +166,7 @@
     public IRubyObject push(ThreadContext context, IRubyObject value) {
         if (!(fieldType == Descriptors.FieldDescriptor.Type.MESSAGE &&
             value == context.runtime.getNil())) {
-            value = Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
+            Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
         }
         this.storage.add(value);
         return this.storage;
diff --git a/ruby/src/main/java/com/google/protobuf/jruby/Utils.java b/ruby/src/main/java/com/google/protobuf/jruby/Utils.java
index f199feb..596a097 100644
--- a/ruby/src/main/java/com/google/protobuf/jruby/Utils.java
+++ b/ruby/src/main/java/com/google/protobuf/jruby/Utils.java
@@ -64,8 +64,8 @@
         return context.runtime.newSymbol(typeName.replace("TYPE_", "").toLowerCase());
     }
 
-    public static IRubyObject checkType(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType,
-                                        IRubyObject value, RubyModule typeClass) {
+    public static void checkType(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType,
+                            IRubyObject value, RubyModule typeClass) {
         Ruby runtime = context.runtime;
         Object val;
         switch(fieldType) {
@@ -106,7 +106,7 @@
                 break;
             case BYTES:
             case STRING:
-                value = validateStringEncoding(context, fieldType, value);
+                validateStringEncoding(context.runtime, fieldType, value);
                 break;
             case MESSAGE:
                 if (value.getMetaClass() != typeClass) {
@@ -127,7 +127,6 @@
             default:
                 break;
         }
-        return value;
     }
 
     public static IRubyObject wrapPrimaryValue(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType, Object value) {
@@ -149,16 +148,10 @@
                 return runtime.newFloat((Double) value);
             case BOOL:
                 return (Boolean) value ? runtime.getTrue() : runtime.getFalse();
-            case BYTES: {
-                IRubyObject wrapped = runtime.newString(((ByteString) value).toStringUtf8());
-                wrapped.setFrozen(true);
-                return wrapped;
-            }
-            case STRING: {
-                IRubyObject wrapped = runtime.newString(value.toString());
-                wrapped.setFrozen(true);
-                return wrapped;
-            }
+            case BYTES:
+                return runtime.newString(((ByteString) value).toStringUtf8());
+            case STRING:
+                return runtime.newString(value.toString());
             default:
                 return runtime.getNil();
         }
@@ -187,21 +180,25 @@
         }
     }
 
-    public static IRubyObject validateStringEncoding(ThreadContext context, Descriptors.FieldDescriptor.Type type, IRubyObject value) {
+    public static void validateStringEncoding(Ruby runtime, Descriptors.FieldDescriptor.Type type, IRubyObject value) {
         if (!(value instanceof RubyString))
-            throw context.runtime.newTypeError("Invalid argument for string field.");
+            throw runtime.newTypeError("Invalid argument for string field.");
+        Encoding encoding = ((RubyString) value).getEncoding();
         switch(type) {
             case BYTES:
-                value = ((RubyString)value).encode(context, context.runtime.evalScriptlet("Encoding::ASCII_8BIT"));
+                if (encoding != ASCIIEncoding.INSTANCE)
+                    throw runtime.newTypeError("Encoding for bytes fields" +
+                            " must be \"ASCII-8BIT\", but was " + encoding);
                 break;
             case STRING:
-                value = ((RubyString)value).encode(context, context.runtime.evalScriptlet("Encoding::UTF_8"));
+                if (encoding != UTF8Encoding.INSTANCE
+                        && encoding != USASCIIEncoding.INSTANCE)
+                    throw runtime.newTypeError("Encoding for string fields" +
+                            " must be \"UTF-8\" or \"ASCII\", but was " + encoding);
                 break;
             default:
                 break;
         }
-        value.setFrozen(true);
-        return value;
     }
 
     public static void checkNameAvailability(ThreadContext context, String name) {
diff --git a/ruby/tests/basic.rb b/ruby/tests/basic.rb
index ad34d53..77c186e 100644
--- a/ruby/tests/basic.rb
+++ b/ruby/tests/basic.rb
@@ -1,7 +1,6 @@
 #!/usr/bin/ruby
 
 require 'google/protobuf'
-require 'json'
 require 'test/unit'
 
 # ------------- generated code --------------
@@ -51,17 +50,6 @@
       optional :foo, :int32, 1
     end
 
-    add_message "TestEmbeddedMessageParent" do
-      optional :child_msg, :message, 1, "TestEmbeddedMessageChild"
-      optional :number, :int32, 2
-
-      repeated :repeated_msg, :message, 3, "TestEmbeddedMessageChild"
-      repeated :repeated_number, :int32, 4
-    end
-    add_message "TestEmbeddedMessageChild" do
-      optional :sub_child, :message, 1, "TestMessage"
-    end
-
     add_message "Recursive1" do
       optional :foo, :message, 1, "Recursive2"
     end
@@ -107,25 +95,13 @@
         optional :d, :enum, 4, "TestEnum"
       end
     end
-
-    add_message "repro.Outer" do
-      map :items, :int32, :message, 1, "repro.Inner"
-    end
-
-    add_message "repro.Inner" do
-    end
   end
 
-
-  Outer = pool.lookup("repro.Outer").msgclass
-  Inner = pool.lookup("repro.Inner").msgclass
   Foo = pool.lookup("Foo").msgclass
   Bar = pool.lookup("Bar").msgclass
   Baz = pool.lookup("Baz").msgclass
   TestMessage = pool.lookup("TestMessage").msgclass
   TestMessage2 = pool.lookup("TestMessage2").msgclass
-  TestEmbeddedMessageParent = pool.lookup("TestEmbeddedMessageParent").msgclass
-  TestEmbeddedMessageChild = pool.lookup("TestEmbeddedMessageChild").msgclass
   Recursive1 = pool.lookup("Recursive1").msgclass
   Recursive2 = pool.lookup("Recursive2").msgclass
   TestEnum = pool.lookup("TestEnum").enummodule
@@ -174,18 +150,12 @@
       m.optional_double = 0.5
       m.optional_string = "hello"
       assert m.optional_string == "hello"
-      m.optional_string = :hello
-      assert m.optional_string == "hello"
       m.optional_bytes = "world".encode!('ASCII-8BIT')
       assert m.optional_bytes == "world"
       m.optional_msg = TestMessage2.new(:foo => 42)
       assert m.optional_msg == TestMessage2.new(:foo => 42)
       m.optional_msg = nil
       assert m.optional_msg == nil
-      m.optional_enum = :C
-      assert m.optional_enum == :C
-      m.optional_enum = 'C'
-      assert m.optional_enum == :C
     end
 
     def test_ctor_args
@@ -202,34 +172,6 @@
       assert m.repeated_string[2] == "world"
     end
 
-    def test_ctor_string_symbol_args
-      m = TestMessage.new(:optional_enum => 'C', :repeated_enum => ['A', 'B'])
-      assert_equal :C, m.optional_enum
-      assert_equal [:A, :B], m.repeated_enum
-
-      m = TestMessage.new(:optional_string => :foo, :repeated_string => [:foo, :bar])
-      assert_equal 'foo', m.optional_string
-      assert_equal ['foo', 'bar'], m.repeated_string
-    end
-
-    def test_embeddedmsg_hash_init
-      m = TestEmbeddedMessageParent.new(:child_msg => {sub_child: {optional_int32: 1}},
-                                        :number => 2,
-                                        :repeated_msg => [{sub_child: {optional_int32: 3}}],
-                                        :repeated_number => [10, 20, 30])
-
-      assert_equal 2, m.number
-      assert_equal [10, 20, 30], m.repeated_number
-
-      assert_not_nil m.child_msg
-      assert_not_nil m.child_msg.sub_child
-      assert_equal m.child_msg.sub_child.optional_int32, 1
-
-      assert_not_nil m.repeated_msg
-      assert_equal 1, m.repeated_msg.length
-      assert_equal 3, m.repeated_msg.first.sub_child.optional_int32
-    end
-
     def test_inspect
       m = TestMessage.new(:optional_int32 => -42,
                           :optional_enum => :A,
@@ -241,15 +183,12 @@
 
     def test_hash
       m1 = TestMessage.new(:optional_int32 => 42)
-      m2 = TestMessage.new(:optional_int32 => 102, repeated_string: ['please', 'work', 'ok?'])
-      m3 = TestMessage.new(:optional_int32 => 102, repeated_string: ['please', 'work', 'ok?'])
+      m2 = TestMessage.new(:optional_int32 => 102)
       assert m1.hash != 0
       assert m2.hash != 0
-      assert m3.hash != 0
       # relying on the randomness here -- if hash function changes and we are
       # unlucky enough to get a collision, then change the values above.
       assert m1.hash != m2.hash
-      assert_equal m2.hash, m3.hash
     end
 
     def test_unknown_field_errors
@@ -316,17 +255,14 @@
       m = TestMessage.new
 
       # Assigning a normal (ASCII or UTF8) string to a bytes field, or
-      # ASCII-8BIT to a string field will convert to the proper encoding.
-      m.optional_bytes = "Test string ASCII".encode!('ASCII')
-      assert m.optional_bytes.frozen?
-      assert_equal Encoding::ASCII_8BIT, m.optional_bytes.encoding
-      assert_equal "Test string ASCII", m.optional_bytes
-
-      assert_raise Encoding::UndefinedConversionError do
+      # ASCII-8BIT to a string field, raises an error.
+      assert_raise TypeError do
+        m.optional_bytes = "Test string ASCII".encode!('ASCII')
+      end
+      assert_raise TypeError do
         m.optional_bytes = "Test string UTF-8 \u0100".encode!('UTF-8')
       end
-
-      assert_raise Encoding::UndefinedConversionError do
+      assert_raise TypeError do
         m.optional_string = ["FFFF"].pack('H*')
       end
 
@@ -334,10 +270,11 @@
       m.optional_bytes = ["FFFF"].pack('H*')
       m.optional_string = "\u0100"
 
-      # strings are immutable so we can't do this, but serialize should catch it.
+      # strings are mutable so we can do this, but serialize should catch it.
       m.optional_string = "asdf".encode!('UTF-8')
-      assert_raise RuntimeError do
-        m.optional_string.encode!('ASCII-8BIT')
+      m.optional_string.encode!('ASCII-8BIT')
+      assert_raise TypeError do
+        data = TestMessage.encode(m)
       end
     end
 
@@ -529,9 +466,9 @@
       assert m.length == 2
 
       m2 = m.dup
-      assert_equal m, m2
+      assert m == m2
       assert m.hash != 0
-      assert_equal m.hash, m2.hash
+      assert m.hash == m2.hash
 
       collected = {}
       m.each { |k,v| collected[v] = k }
@@ -621,7 +558,7 @@
       assert_raise TypeError do
         m[1] = 1
       end
-      assert_raise Encoding::UndefinedConversionError do
+      assert_raise TypeError do
         bytestring = ["FFFF"].pack("H*")
         m[bytestring] = 1
       end
@@ -629,8 +566,9 @@
       m = Google::Protobuf::Map.new(:bytes, :int32)
       bytestring = ["FFFF"].pack("H*")
       m[bytestring] = 1
-      # Allowed -- we will automatically convert to ASCII-8BIT.
-      m["asdf"] = 1
+      assert_raise TypeError do
+        m["asdf"] = 1
+      end
       assert_raise TypeError do
         m[1] = 1
       end
@@ -661,7 +599,7 @@
       assert_raise RangeError do
         m["z"] = :Z
       end
-      assert_raise RangeError do
+      assert_raise TypeError do
         m["z"] = "z"
       end
     end
@@ -725,28 +663,6 @@
       end
     end
 
-    def test_map_corruption
-      # This pattern led to a crash in a previous version of upb/protobuf.
-      m = MapMessage.new(map_string_int32: { "aaa" => 1 })
-      m.map_string_int32['podid'] = 2
-      m.map_string_int32['aaa'] = 3
-    end
-
-    def test_concurrent_decoding
-      o = Outer.new
-      o.items[0] = Inner.new
-      raw = Outer.encode(o)
-
-      thds = 2.times.map do
-        Thread.new do
-          100000.times do
-            assert_equal o, Outer.decode(raw)
-          end
-        end
-      end
-      thds.map(&:join)
-    end
-
     def test_map_encode_decode
       m = MapMessage.new(
         :map_string_int32 => {"a" => 1, "b" => 2},
@@ -787,36 +703,36 @@
 
     def test_oneof
       d = OneofMessage.new
-      assert d.a == ""
-      assert d.b == 0
+      assert d.a == nil
+      assert d.b == nil
       assert d.c == nil
-      assert d.d == :Default
+      assert d.d == nil
       assert d.my_oneof == nil
 
       d.a = "hi"
       assert d.a == "hi"
-      assert d.b == 0
+      assert d.b == nil
       assert d.c == nil
-      assert d.d == :Default
+      assert d.d == nil
       assert d.my_oneof == :a
 
       d.b = 42
-      assert d.a == ""
+      assert d.a == nil
       assert d.b == 42
       assert d.c == nil
-      assert d.d == :Default
+      assert d.d == nil
       assert d.my_oneof == :b
 
       d.c = TestMessage2.new(:foo => 100)
-      assert d.a == ""
-      assert d.b == 0
+      assert d.a == nil
+      assert d.b == nil
       assert d.c.foo == 100
-      assert d.d == :Default
+      assert d.d == nil
       assert d.my_oneof == :c
 
       d.d = :C
-      assert d.a == ""
-      assert d.b == 0
+      assert d.a == nil
+      assert d.b == nil
       assert d.c == nil
       assert d.d == :C
       assert d.my_oneof == :d
@@ -832,23 +748,23 @@
 
       d3 = OneofMessage.decode(
         encoded_field_c + encoded_field_a + encoded_field_d)
-      assert d3.a == ""
-      assert d3.b == 0
+      assert d3.a == nil
+      assert d3.b == nil
       assert d3.c == nil
       assert d3.d == :B
 
       d4 = OneofMessage.decode(
         encoded_field_c + encoded_field_a + encoded_field_d +
         encoded_field_c)
-      assert d4.a == ""
-      assert d4.b == 0
+      assert d4.a == nil
+      assert d4.b == nil
       assert d4.c.foo == 1
-      assert d4.d == :Default
+      assert d4.d == nil
 
       d5 = OneofMessage.new(:a => "hello")
-      assert d5.a == "hello"
+      assert d5.a != nil
       d5.a = nil
-      assert d5.a == ""
+      assert d5.a == nil
       assert OneofMessage.encode(d5) == ''
       assert d5.my_oneof == nil
     end
@@ -937,22 +853,15 @@
 
     def test_encode_decode_helpers
       m = TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
-      assert_equal 'foo', m.optional_string
-      assert_equal ['bar1', 'bar2'], m.repeated_string
-
       json = m.to_json
       m2 = TestMessage.decode_json(json)
-      assert_equal 'foo', m2.optional_string
-      assert_equal ['bar1', 'bar2'], m2.repeated_string
-      if RUBY_PLATFORM != "java"
-        assert m2.optional_string.frozen?
-        assert m2.repeated_string[0].frozen?
-      end
+      assert m2.optional_string == 'foo'
+      assert m2.repeated_string == ['bar1', 'bar2']
 
       proto = m.to_proto
       m2 = TestMessage.decode(proto)
-      assert_equal 'foo', m2.optional_string
-      assert_equal ['bar1', 'bar2'], m2.repeated_string
+      assert m2.optional_string == 'foo'
+      assert m2.repeated_string == ['bar1', 'bar2']
     end
 
     def test_protobuf_encode_decode_helpers
@@ -974,7 +883,7 @@
     end
 
     def test_to_h
-      m = TestMessage.new(:optional_bool => true, :optional_double => -10.100001, :optional_string => 'foo', :repeated_string => ['bar1', 'bar2'], :repeated_msg => [TestMessage2.new(:foo => 100)])
+      m = TestMessage.new(:optional_bool => true, :optional_double => -10.100001, :optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
       expected_result = {
         :optional_bool=>true,
         :optional_bytes=>"",
@@ -994,22 +903,12 @@
         :repeated_float=>[],
         :repeated_int32=>[],
         :repeated_int64=>[],
-        :repeated_msg=>[{:foo => 100}],
+        :repeated_msg=>[],
         :repeated_string=>["bar1", "bar2"],
         :repeated_uint32=>[],
         :repeated_uint64=>[]
       }
       assert_equal expected_result, m.to_h
-
-      m = MapMessage.new(
-        :map_string_int32 => {"a" => 1, "b" => 2},
-        :map_string_msg => {"a" => TestMessage2.new(:foo => 1),
-                            "b" => TestMessage2.new(:foo => 2)})
-      expected_result = {
-        :map_string_int32 => {"a" => 1, "b" => 2},
-        :map_string_msg => {"a" => {:foo => 1}, "b" => {:foo => 2}}
-      }
-      assert_equal expected_result, m.to_h
     end
 
 
@@ -1246,8 +1145,6 @@
 
       json_text = TestMessage.encode_json(m)
       m2 = TestMessage.decode_json(json_text)
-      puts m.inspect
-      puts m2.inspect
       assert m == m2
 
       # Crash case from GitHub issue 283.
@@ -1259,145 +1156,19 @@
       Foo.encode_json(Foo.new(bar: bar, baz: [baz1, baz2]))
     end
 
-    def test_json_emit_defaults
-      # TODO: Fix JSON in JRuby version.
-      return if RUBY_PLATFORM == "java"
-      m = TestMessage.new
-
-      expected = {
-        optionalInt32: 0,
-        optionalInt64: 0,
-        optionalUint32: 0,
-        optionalUint64: 0,
-        optionalBool: false,
-        optionalFloat: 0,
-        optionalDouble: 0,
-        optionalString: "",
-        optionalBytes: "",
-        optionalEnum: "Default",
-        repeatedInt32: [],
-        repeatedInt64: [],
-        repeatedUint32: [],
-        repeatedUint64: [],
-        repeatedBool: [],
-        repeatedFloat: [],
-        repeatedDouble: [],
-        repeatedString: [],
-        repeatedBytes: [],
-        repeatedMsg: [],
-        repeatedEnum: []
-      }
-
-      actual = TestMessage.encode_json(m, :emit_defaults => true)
-
-      assert JSON.parse(actual, :symbolize_names => true) == expected
-    end
-
-    def test_json_emit_defaults_submsg
-      # TODO: Fix JSON in JRuby version.
-      return if RUBY_PLATFORM == "java"
-      m = TestMessage.new(optional_msg: TestMessage2.new)
-
-      expected = {
-        optionalInt32: 0,
-        optionalInt64: 0,
-        optionalUint32: 0,
-        optionalUint64: 0,
-        optionalBool: false,
-        optionalFloat: 0,
-        optionalDouble: 0,
-        optionalString: "",
-        optionalBytes: "",
-        optionalMsg: {foo: 0},
-        optionalEnum: "Default",
-        repeatedInt32: [],
-        repeatedInt64: [],
-        repeatedUint32: [],
-        repeatedUint64: [],
-        repeatedBool: [],
-        repeatedFloat: [],
-        repeatedDouble: [],
-        repeatedString: [],
-        repeatedBytes: [],
-        repeatedMsg: [],
-        repeatedEnum: []
-      }
-
-      actual = TestMessage.encode_json(m, :emit_defaults => true)
-
-      assert JSON.parse(actual, :symbolize_names => true) == expected
-    end
-
-    def test_json_emit_defaults_repeated_submsg
-      # TODO: Fix JSON in JRuby version.
-      return if RUBY_PLATFORM == "java"
-      m = TestMessage.new(repeated_msg: [TestMessage2.new])
-
-      expected = {
-        optionalInt32: 0,
-        optionalInt64: 0,
-        optionalUint32: 0,
-        optionalUint64: 0,
-        optionalBool: false,
-        optionalFloat: 0,
-        optionalDouble: 0,
-        optionalString: "",
-        optionalBytes: "",
-        optionalEnum: "Default",
-        repeatedInt32: [],
-        repeatedInt64: [],
-        repeatedUint32: [],
-        repeatedUint64: [],
-        repeatedBool: [],
-        repeatedFloat: [],
-        repeatedDouble: [],
-        repeatedString: [],
-        repeatedBytes: [],
-        repeatedMsg: [{foo: 0}],
-        repeatedEnum: []
-      }
-
-      actual = TestMessage.encode_json(m, :emit_defaults => true)
-
-      assert JSON.parse(actual, :symbolize_names => true) == expected
-    end
-
     def test_json_maps
       # TODO: Fix JSON in JRuby version.
       return if RUBY_PLATFORM == "java"
       m = MapMessage.new(:map_string_int32 => {"a" => 1})
-      expected = {mapStringInt32: {a: 1}, mapStringMsg: {}}
-      expected_preserve = {map_string_int32: {a: 1}, map_string_msg: {}}
-      assert JSON.parse(MapMessage.encode_json(m), :symbolize_names => true) == expected
+      expected = '{"mapStringInt32":{"a":1},"mapStringMsg":{}}'
+      expected_preserve = '{"map_string_int32":{"a":1},"map_string_msg":{}}'
+      assert MapMessage.encode_json(m) == expected
 
       json = MapMessage.encode_json(m, :preserve_proto_fieldnames => true)
-      assert JSON.parse(json, :symbolize_names => true) == expected_preserve
+      assert json == expected_preserve
 
       m2 = MapMessage.decode_json(MapMessage.encode_json(m))
       assert m == m2
     end
-
-    def test_json_maps_emit_defaults_submsg
-      # TODO: Fix JSON in JRuby version.
-      return if RUBY_PLATFORM == "java"
-      m = MapMessage.new(:map_string_msg => {"a" => TestMessage2.new})
-      expected = {mapStringInt32: {}, mapStringMsg: {a: {foo: 0}}}
-
-      actual = MapMessage.encode_json(m, :emit_defaults => true)
-
-      assert JSON.parse(actual, :symbolize_names => true) == expected
-    end
-
-    def test_comparison_with_arbitrary_object
-      assert MapMessage.new != nil
-    end
-
-    def test_respond_to
-      # This test fails with JRuby 1.7.23, likely because of an old JRuby bug.
-      return if RUBY_PLATFORM == "java"
-      msg = MapMessage.new
-      assert msg.respond_to?(:map_string_int32)
-      assert !msg.respond_to?(:bacon)
-    end
   end
 end
diff --git a/ruby/tests/encode_decode_test.rb b/ruby/tests/encode_decode_test.rb
deleted file mode 100644
index 09581ab..0000000
--- a/ruby/tests/encode_decode_test.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/ruby
-
-# generated_code.rb is in the same directory as this test.
-$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
-
-require 'generated_code_pb'
-require 'test/unit'
-
-def hex2bin(s)
-  s.scan(/../).map { |x| x.hex.chr }.join
-end
-
-class EncodeDecodeTest < Test::Unit::TestCase
-  def test_discard_unknown
-    # Test discard unknown in message.
-    unknown_msg = A::B::C::TestUnknown.new(:unknown_field => 1)
-    from = A::B::C::TestUnknown.encode(unknown_msg)
-    m = A::B::C::TestMessage.decode(from)
-    Google::Protobuf.discard_unknown(m)
-    to = A::B::C::TestMessage.encode(m)
-    assert_equal '', to
-
-    # Test discard unknown for singular message field.
-    unknown_msg = A::B::C::TestUnknown.new(
-	    :optional_unknown =>
-	    A::B::C::TestUnknown.new(:unknown_field => 1))
-    from = A::B::C::TestUnknown.encode(unknown_msg)
-    m = A::B::C::TestMessage.decode(from)
-    Google::Protobuf.discard_unknown(m)
-    to = A::B::C::TestMessage.encode(m.optional_msg)
-    assert_equal '', to
-
-    # Test discard unknown for repeated message field.
-    unknown_msg = A::B::C::TestUnknown.new(
-	    :repeated_unknown =>
-	    [A::B::C::TestUnknown.new(:unknown_field => 1)])
-    from = A::B::C::TestUnknown.encode(unknown_msg)
-    m = A::B::C::TestMessage.decode(from)
-    Google::Protobuf.discard_unknown(m)
-    to = A::B::C::TestMessage.encode(m.repeated_msg[0])
-    assert_equal '', to
-
-    # Test discard unknown for map value message field.
-    unknown_msg = A::B::C::TestUnknown.new(
-	    :map_unknown =>
-	    {"" => A::B::C::TestUnknown.new(:unknown_field => 1)})
-    from = A::B::C::TestUnknown.encode(unknown_msg)
-    m = A::B::C::TestMessage.decode(from)
-    Google::Protobuf.discard_unknown(m)
-    to = A::B::C::TestMessage.encode(m.map_string_msg[''])
-    assert_equal '', to
-
-    # Test discard unknown for oneof message field.
-    unknown_msg = A::B::C::TestUnknown.new(
-	    :oneof_unknown =>
-	    A::B::C::TestUnknown.new(:unknown_field => 1))
-    from = A::B::C::TestUnknown.encode(unknown_msg)
-    m = A::B::C::TestMessage.decode(from)
-    Google::Protobuf.discard_unknown(m)
-    to = A::B::C::TestMessage.encode(m.oneof_msg)
-    assert_equal '', to
-  end
-end
diff --git a/ruby/tests/gc_test.rb b/ruby/tests/gc_test.rb
deleted file mode 100644
index f3470cc..0000000
--- a/ruby/tests/gc_test.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/ruby
-#
-# generated_code.rb is in the same directory as this test.
-$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
-
-old_gc = GC.stress
-GC.stress = 0x01 | 0x04
-require 'generated_code_pb'
-GC.stress = old_gc
-
-require 'test/unit'
-
-class GCTest < Test::Unit::TestCase
-  def get_msg
-    A::B::C::TestMessage.new(
-        :optional_int32 => 1,
-        :optional_int64 => 1,
-        :optional_uint32 => 1,
-        :optional_uint64 => 1,
-        :optional_bool => true,
-        :optional_double => 1.0,
-        :optional_float => 1.0,
-        :optional_string => "a",
-        :optional_bytes => "b",
-        :optional_enum => A::B::C::TestEnum::A,
-        :optional_msg => A::B::C::TestMessage.new(),
-        :repeated_int32 => [1],
-        :repeated_int64 => [1],
-        :repeated_uint32 => [1],
-        :repeated_uint64 => [1],
-        :repeated_bool => [true],
-        :repeated_double => [1.0],
-        :repeated_float => [1.0],
-        :repeated_string => ["a"],
-        :repeated_bytes => ["b"],
-        :repeated_enum => [A::B::C::TestEnum::A],
-        :repeated_msg => [A::B::C::TestMessage.new()],
-        :map_int32_string => {1 => "a"},
-        :map_int64_string => {1 => "a"},
-        :map_uint32_string => {1 => "a"},
-        :map_uint64_string => {1 => "a"},
-        :map_bool_string => {true => "a"},
-        :map_string_string => {"a" => "a"},
-        :map_string_msg => {"a" => A::B::C::TestMessage.new()},
-        :map_string_int32 => {"a" => 1},
-        :map_string_bool => {"a" => true},
-    )
-  end
-  def test_generated_msg
-    old_gc = GC.stress
-    GC.stress = 0x01 | 0x04
-    from = get_msg
-    data = A::B::C::TestMessage.encode(from)
-    to = A::B::C::TestMessage.decode(data)
-    GC.stress = old_gc
-    puts "passed"
-  end
-end
diff --git a/ruby/tests/generated_code.proto b/ruby/tests/generated_code.proto
index 3b934bd..42d82a6 100644
--- a/ruby/tests/generated_code.proto
+++ b/ruby/tests/generated_code.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
 
-package a.b.c;
+package A.B.C;
 
 message TestMessage {
   int32 optional_int32 = 1;
@@ -57,9 +57,6 @@
   }
 
   NestedMessage nested_message = 80;
-
-  // Reserved for non-existing field test.
-  // int32 non_exist = 89;
 }
 
 enum TestEnum {
@@ -68,13 +65,3 @@
   B = 2;
   C = 3;
 }
-
-message TestUnknown {
-  TestUnknown optional_unknown = 11;
-  repeated TestUnknown repeated_unknown = 31;
-  oneof my_oneof {
-    TestUnknown oneof_unknown = 51;
-  }
-  map<string, TestUnknown> map_unknown = 67;
-  int32 unknown_field = 89;
-}
diff --git a/ruby/tests/generated_code_test.rb b/ruby/tests/generated_code_test.rb
index b92b046..daef357 100644
--- a/ruby/tests/generated_code_test.rb
+++ b/ruby/tests/generated_code_test.rb
@@ -3,8 +3,7 @@
 # generated_code.rb is in the same directory as this test.
 $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
 
-require 'generated_code_pb'
-require 'test_import_pb'
+require 'generated_code'
 require 'test/unit'
 
 class GeneratedCodeTest < Test::Unit::TestCase
@@ -14,6 +13,5 @@
     # successfully creates message definitions and classes, not to test every
     # aspect of the extension (basic.rb is for that).
     m = A::B::C::TestMessage.new()
-    m2 = FooBar::TestImportedMessage.new()
   end
 end
diff --git a/ruby/tests/test_import.proto b/ruby/tests/test_import.proto
deleted file mode 100644
index 230484e..0000000
--- a/ruby/tests/test_import.proto
+++ /dev/null
@@ -1,5 +0,0 @@
-syntax = "proto3";
-
-package foo_bar;
-
-message TestImportedMessage {}
diff --git a/ruby/tests/well_known_types_test.rb b/ruby/tests/well_known_types_test.rb
deleted file mode 100644
index bd24c32..0000000
--- a/ruby/tests/well_known_types_test.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/ruby
-
-require 'test/unit'
-require 'google/protobuf/well_known_types'
-
-class TestWellKnownTypes < Test::Unit::TestCase
-  def test_timestamp
-    ts = Google::Protobuf::Timestamp.new
-
-    assert_equal Time.at(0), ts.to_time
-
-    ts.seconds = 12345
-    assert_equal Time.at(12345), ts.to_time
-    assert_equal 12345, ts.to_i
-
-    # millisecond accuracy
-    time = Time.at(123456, 654321)
-    ts.from_time(time)
-    assert_equal 123456, ts.seconds
-    assert_equal 654321000, ts.nanos
-    assert_equal time, ts.to_time
-
-    # nanosecond accuracy
-    time = Time.at(123456, Rational(654321321, 1000))
-    ts.from_time(time)
-    assert_equal 654321321, ts.nanos
-    assert_equal time, ts.to_time
-  end
-
-  def test_duration
-    duration = Google::Protobuf::Duration.new(seconds: 123, nanos: 456)
-    assert_equal 123.000000456, duration.to_f
-  end
-
-  def test_struct
-    struct = Google::Protobuf::Struct.new
-
-    substruct = {
-      "subkey" => 999,
-      "subkey2" => false
-    }
-
-    sublist = ["abc", 123, {"deepkey" => "deepval"}]
-
-    struct["number"] = 12345
-    struct["boolean-true"] = true
-    struct["boolean-false"] = false
-    struct["null"] = nil
-    struct["string"] = "abcdef"
-    struct["substruct"] = substruct
-    struct["sublist"] = sublist
-
-    assert_equal 12345, struct["number"]
-    assert_equal true, struct["boolean-true"]
-    assert_equal false, struct["boolean-false"]
-    assert_equal nil, struct["null"]
-    assert_equal "abcdef", struct["string"]
-    assert_equal(Google::Protobuf::Struct.from_hash(substruct),
-                 struct["substruct"])
-    assert_equal(Google::Protobuf::ListValue.from_a(sublist),
-                 struct["sublist"])
-
-    should_equal = {
-      "number" => 12345,
-      "boolean-true" => true,
-      "boolean-false" => false,
-      "null" => nil,
-      "string" => "abcdef",
-      "substruct" => {
-        "subkey" => 999,
-        "subkey2" => false
-      },
-      "sublist" => ["abc", 123, {"deepkey" => "deepval"}]
-    }
-
-    list = struct["sublist"]
-    list.is_a?(Google::Protobuf::ListValue)
-    assert_equal "abc", list[0]
-    assert_equal 123, list[1]
-    assert_equal({"deepkey" => "deepval"}, list[2].to_h)
-
-    # to_h returns a fully-flattened Ruby structure (Hash and Array).
-    assert_equal(should_equal, struct.to_h)
-
-    # Test that we can assign Struct and ListValue directly.
-    struct["substruct"] = Google::Protobuf::Struct.from_hash(substruct)
-    struct["sublist"] = Google::Protobuf::ListValue.from_a(sublist)
-
-    assert_equal(should_equal, struct.to_h)
-
-    struct["sublist"] << nil
-    should_equal["sublist"] << nil
-
-    assert_equal(should_equal, struct.to_h)
-    assert_equal(should_equal["sublist"].length, struct["sublist"].length)
-
-    assert_raise Google::Protobuf::UnexpectedStructType do
-      struct[123] = 5
-    end
-
-    assert_raise Google::Protobuf::UnexpectedStructType do
-      struct[5] = Time.new
-    end
-
-    assert_raise Google::Protobuf::UnexpectedStructType do
-      struct[5] = [Time.new]
-    end
-
-    assert_raise Google::Protobuf::UnexpectedStructType do
-      struct[5] = {123 => 456}
-    end
-
-    assert_raise Google::Protobuf::UnexpectedStructType do
-      struct = Google::Protobuf::Struct.new
-      struct.fields["foo"] = Google::Protobuf::Value.new
-      # Tries to return a Ruby value for a Value class whose type
-      # hasn't been filled in.
-      struct["foo"]
-    end
-  end
-
-  def test_any
-    any = Google::Protobuf::Any.new
-    ts = Google::Protobuf::Timestamp.new(seconds: 12345, nanos: 6789)
-    any.pack(ts)
-
-    assert any.is(Google::Protobuf::Timestamp)
-    assert_equal ts, any.unpack(Google::Protobuf::Timestamp)
-  end
-end
diff --git a/ruby/travis-test.sh b/ruby/travis-test.sh
index cbe7cd9..75db7d9 100755
--- a/ruby/travis-test.sh
+++ b/ruby/travis-test.sh
@@ -5,24 +5,20 @@
 
 test_version() {
   version=$1
-  if [ "$version" == "jruby-1.7" ] ; then
+  if [ "$version" == "jruby" ] ; then
     # No conformance tests yet -- JRuby is too broken to run them.
     bash --login -c \
-      "rvm install $version && rvm use $version && rvm get head && \
+      "rvm install $version && rvm use $version && \
        which ruby && \
-       git clean -f && \
        gem install bundler && bundle && \
        rake test"
   else
     bash --login -c \
       "rvm install $version && rvm use $version && \
        which ruby && \
-       git clean -f && \
        gem install bundler && bundle && \
        rake test &&
-       rake gc_test &&
-       cd ../conformance && make test_ruby &&
-       cd ../ruby/compatibility_tests/v3.0.0 && ./test.sh"
+       cd ../conformance && make test_ruby"
   fi
 }
 
diff --git a/src/Makefile.am b/src/Makefile.am
index cdc2298..8006550 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,9 +19,8 @@
 endif
 
 if GCC
-# Turn on all warnings except for sign comparison (we ignore sign comparison
-# in Google so our code base have tons of such warnings).
-NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) -Wall -Wno-sign-compare
+# These are good warnings to turn on by default
+NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
 else
 NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF)
 endif
@@ -33,21 +32,17 @@
 # If I say "dist_include_DATA", automake complains that $(includedir) is not
 # a "legitimate" directory for DATA.  Screw you, automake.
 protodir = $(includedir)
-
-# If you are adding new files here, also remember to change the build files for
-# all other languages, //protoc-artifacts/build-zip.sh and run
-# //update_file_list.sh for bazel.
-nobase_dist_proto_DATA = google/protobuf/descriptor.proto      \
-                         google/protobuf/any.proto             \
-                         google/protobuf/api.proto             \
-                         google/protobuf/duration.proto        \
-                         google/protobuf/empty.proto           \
-                         google/protobuf/field_mask.proto      \
-                         google/protobuf/source_context.proto  \
-                         google/protobuf/struct.proto          \
-                         google/protobuf/timestamp.proto       \
-                         google/protobuf/type.proto            \
-                         google/protobuf/wrappers.proto        \
+nobase_dist_proto_DATA = google/protobuf/descriptor.proto     \
+                         google/protobuf/any.proto            \
+                         google/protobuf/api.proto            \
+                         google/protobuf/duration.proto       \
+                         google/protobuf/empty.proto          \
+                         google/protobuf/field_mask.proto     \
+                         google/protobuf/source_context.proto \
+                         google/protobuf/struct.proto         \
+                         google/protobuf/timestamp.proto      \
+                         google/protobuf/type.proto           \
+                         google/protobuf/wrappers.proto       \
                          google/protobuf/compiler/plugin.proto
 
 # Not sure why these don't get cleaned automatically.
@@ -55,138 +50,126 @@
 	rm -f *.loT
 
 CLEANFILES = $(protoc_outputs) unittest_proto_middleman \
-             testzip.jar testzip.list testzip.proto testzip.zip \
-             no_warning_test.cc \
-             google/protobuf/compiler/js/well_known_types_embed.cc \
-             js_embed$(EXEEXT)
+             testzip.jar testzip.list testzip.proto testzip.zip
 
 MAINTAINERCLEANFILES =   \
   Makefile.in
 
-nobase_include_HEADERS =                                         \
-  google/protobuf/stubs/atomic_sequence_num.h                    \
-  google/protobuf/stubs/atomicops.h                              \
-  google/protobuf/stubs/atomicops_internals_power.h              \
-  google/protobuf/stubs/atomicops_internals_ppc_gcc.h            \
-  google/protobuf/stubs/atomicops_internals_arm64_gcc.h          \
-  google/protobuf/stubs/atomicops_internals_arm_gcc.h            \
-  google/protobuf/stubs/atomicops_internals_arm_qnx.h            \
-  google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h \
-  google/protobuf/stubs/atomicops_internals_generic_gcc.h        \
-  google/protobuf/stubs/atomicops_internals_mips_gcc.h           \
-  google/protobuf/stubs/atomicops_internals_solaris.h            \
-  google/protobuf/stubs/atomicops_internals_tsan.h               \
-  google/protobuf/stubs/atomicops_internals_x86_gcc.h            \
-  google/protobuf/stubs/atomicops_internals_x86_msvc.h           \
-  google/protobuf/stubs/callback.h                               \
-  google/protobuf/stubs/bytestream.h                             \
-  google/protobuf/stubs/casts.h                                  \
-  google/protobuf/stubs/common.h                                 \
-  google/protobuf/stubs/fastmem.h                                \
-  google/protobuf/stubs/hash.h                                   \
-  google/protobuf/stubs/logging.h                                \
-  google/protobuf/stubs/macros.h                                 \
-  google/protobuf/stubs/mutex.h                                  \
-  google/protobuf/stubs/once.h                                   \
-  google/protobuf/stubs/platform_macros.h                        \
-  google/protobuf/stubs/port.h                                   \
-  google/protobuf/stubs/scoped_ptr.h                             \
-  google/protobuf/stubs/shared_ptr.h                             \
-  google/protobuf/stubs/singleton.h                              \
-  google/protobuf/stubs/status.h                                 \
-  google/protobuf/stubs/stl_util.h                               \
-  google/protobuf/stubs/stringpiece.h                            \
-  google/protobuf/stubs/template_util.h                          \
-  google/protobuf/stubs/type_traits.h                            \
-  google/protobuf/any.pb.h                                       \
-  google/protobuf/api.pb.h                                       \
-  google/protobuf/any.h                                          \
-  google/protobuf/arena.h                                        \
-  google/protobuf/arena_impl.h                                   \
-  google/protobuf/arenastring.h                                  \
-  google/protobuf/descriptor_database.h                          \
-  google/protobuf/descriptor.h                                   \
-  google/protobuf/descriptor.pb.h                                \
-  google/protobuf/duration.pb.h                                  \
-  google/protobuf/dynamic_message.h                              \
-  google/protobuf/empty.pb.h                                     \
-  google/protobuf/extension_set.h                                \
-  google/protobuf/field_mask.pb.h                                \
-  google/protobuf/generated_enum_reflection.h                    \
-  google/protobuf/generated_enum_util.h                          \
-  google/protobuf/generated_message_reflection.h                 \
-  google/protobuf/generated_message_table_driven.h               \
-  google/protobuf/generated_message_util.h                       \
-  google/protobuf/has_bits.h                                     \
-  google/protobuf/map_entry.h                                    \
-  google/protobuf/map_entry_lite.h                               \
-  google/protobuf/map_field.h                                    \
-  google/protobuf/map_field_inl.h                                \
-  google/protobuf/map_field_lite.h                               \
-  google/protobuf/map.h                                          \
-  google/protobuf/map_type_handler.h                             \
-  google/protobuf/message.h                                      \
-  google/protobuf/message_lite.h                                 \
-  google/protobuf/metadata.h                                     \
-  google/protobuf/metadata_lite.h                                \
-  google/protobuf/reflection.h                                   \
-  google/protobuf/reflection_ops.h                               \
-  google/protobuf/repeated_field.h                               \
-  google/protobuf/service.h                                      \
-  google/protobuf/source_context.pb.h                            \
-  google/protobuf/struct.pb.h                                    \
-  google/protobuf/text_format.h                                  \
-  google/protobuf/timestamp.pb.h                                 \
-  google/protobuf/type.pb.h                                      \
-  google/protobuf/unknown_field_set.h                            \
-  google/protobuf/wire_format.h                                  \
-  google/protobuf/wire_format_lite.h                             \
-  google/protobuf/wire_format_lite_inl.h                         \
-  google/protobuf/wrappers.pb.h                                  \
-  google/protobuf/io/coded_stream.h                              \
-  $(GZHEADERS)                                                   \
-  google/protobuf/io/printer.h                                   \
-  google/protobuf/io/strtod.h                                    \
-  google/protobuf/io/tokenizer.h                                 \
-  google/protobuf/io/zero_copy_stream.h                          \
-  google/protobuf/io/zero_copy_stream_impl.h                     \
-  google/protobuf/io/zero_copy_stream_impl_lite.h                \
-  google/protobuf/compiler/code_generator.h                      \
-  google/protobuf/compiler/command_line_interface.h              \
-  google/protobuf/compiler/importer.h                            \
-  google/protobuf/compiler/parser.h                              \
-  google/protobuf/compiler/plugin.h                              \
-  google/protobuf/compiler/plugin.pb.h                           \
-  google/protobuf/compiler/cpp/cpp_generator.h                   \
-  google/protobuf/compiler/csharp/csharp_generator.h             \
-  google/protobuf/compiler/csharp/csharp_names.h                 \
-  google/protobuf/compiler/java/java_generator.h                 \
-  google/protobuf/compiler/java/java_names.h                     \
-  google/protobuf/compiler/javanano/javanano_generator.h         \
-  google/protobuf/compiler/js/js_generator.h                     \
-  google/protobuf/compiler/js/well_known_types_embed.h           \
-  google/protobuf/compiler/objectivec/objectivec_generator.h     \
-  google/protobuf/compiler/objectivec/objectivec_helpers.h       \
-  google/protobuf/compiler/php/php_generator.h                   \
-  google/protobuf/compiler/python/python_generator.h             \
-  google/protobuf/compiler/ruby/ruby_generator.h                 \
-  google/protobuf/util/type_resolver.h                           \
-  google/protobuf/util/delimited_message_util.h                  \
-  google/protobuf/util/field_comparator.h                        \
-  google/protobuf/util/field_mask_util.h                         \
-  google/protobuf/util/json_util.h                               \
-  google/protobuf/util/time_util.h                               \
-  google/protobuf/util/type_resolver_util.h                      \
+nobase_include_HEADERS =                                        \
+  google/protobuf/stubs/atomic_sequence_num.h                   \
+  google/protobuf/stubs/atomicops.h                             \
+  google/protobuf/stubs/atomicops_internals_power.h             \
+  google/protobuf/stubs/atomicops_internals_arm64_gcc.h         \
+  google/protobuf/stubs/atomicops_internals_arm_gcc.h           \
+  google/protobuf/stubs/atomicops_internals_arm_qnx.h           \
+  google/protobuf/stubs/atomicops_internals_atomicword_compat.h \
+  google/protobuf/stubs/atomicops_internals_generic_gcc.h       \
+  google/protobuf/stubs/atomicops_internals_macosx.h            \
+  google/protobuf/stubs/atomicops_internals_mips_gcc.h          \
+  google/protobuf/stubs/atomicops_internals_pnacl.h             \
+  google/protobuf/stubs/atomicops_internals_solaris.h           \
+  google/protobuf/stubs/atomicops_internals_tsan.h              \
+  google/protobuf/stubs/atomicops_internals_x86_gcc.h           \
+  google/protobuf/stubs/atomicops_internals_x86_msvc.h          \
+  google/protobuf/stubs/callback.h                              \
+  google/protobuf/stubs/bytestream.h                            \
+  google/protobuf/stubs/casts.h                                 \
+  google/protobuf/stubs/common.h                                \
+  google/protobuf/stubs/fastmem.h                               \
+  google/protobuf/stubs/hash.h                                  \
+  google/protobuf/stubs/logging.h                               \
+  google/protobuf/stubs/macros.h                                \
+  google/protobuf/stubs/mutex.h                                 \
+  google/protobuf/stubs/once.h                                  \
+  google/protobuf/stubs/platform_macros.h                       \
+  google/protobuf/stubs/port.h                                  \
+  google/protobuf/stubs/scoped_ptr.h                            \
+  google/protobuf/stubs/shared_ptr.h                            \
+  google/protobuf/stubs/singleton.h                             \
+  google/protobuf/stubs/status.h                                \
+  google/protobuf/stubs/stl_util.h                              \
+  google/protobuf/stubs/stringpiece.h                           \
+  google/protobuf/stubs/template_util.h                         \
+  google/protobuf/stubs/type_traits.h                           \
+  google/protobuf/any.pb.h                                      \
+  google/protobuf/api.pb.h                                      \
+  google/protobuf/any.h                                         \
+  google/protobuf/arena.h                                       \
+  google/protobuf/arenastring.h                                 \
+  google/protobuf/descriptor_database.h                         \
+  google/protobuf/descriptor.h                                  \
+  google/protobuf/descriptor.pb.h                               \
+  google/protobuf/duration.pb.h                                 \
+  google/protobuf/dynamic_message.h                             \
+  google/protobuf/empty.pb.h                                    \
+  google/protobuf/extension_set.h                               \
+  google/protobuf/field_mask.pb.h                               \
+  google/protobuf/generated_enum_reflection.h                   \
+  google/protobuf/generated_enum_util.h                         \
+  google/protobuf/generated_message_reflection.h                \
+  google/protobuf/generated_message_util.h                      \
+  google/protobuf/map_entry.h                                   \
+  google/protobuf/map_entry_lite.h                              \
+  google/protobuf/map_field.h                                   \
+  google/protobuf/map_field_inl.h                               \
+  google/protobuf/map_field_lite.h                              \
+  google/protobuf/map.h                                         \
+  google/protobuf/map_type_handler.h                            \
+  google/protobuf/message.h                                     \
+  google/protobuf/message_lite.h                                \
+  google/protobuf/metadata.h                                    \
+  google/protobuf/reflection.h                                  \
+  google/protobuf/reflection_ops.h                              \
+  google/protobuf/repeated_field.h                              \
+  google/protobuf/repeated_field_reflection.h                   \
+  google/protobuf/service.h                                     \
+  google/protobuf/source_context.pb.h                           \
+  google/protobuf/struct.pb.h                                   \
+  google/protobuf/text_format.h                                 \
+  google/protobuf/timestamp.pb.h                                \
+  google/protobuf/type.pb.h                                     \
+  google/protobuf/unknown_field_set.h                           \
+  google/protobuf/wire_format.h                                 \
+  google/protobuf/wire_format_lite.h                            \
+  google/protobuf/wire_format_lite_inl.h                        \
+  google/protobuf/wrappers.pb.h                                 \
+  google/protobuf/io/coded_stream.h                             \
+  $(GZHEADERS)                                                  \
+  google/protobuf/io/printer.h                                  \
+  google/protobuf/io/strtod.h                                   \
+  google/protobuf/io/tokenizer.h                                \
+  google/protobuf/io/zero_copy_stream.h                         \
+  google/protobuf/io/zero_copy_stream_impl.h                    \
+  google/protobuf/io/zero_copy_stream_impl_lite.h               \
+  google/protobuf/compiler/code_generator.h                     \
+  google/protobuf/compiler/command_line_interface.h             \
+  google/protobuf/compiler/importer.h                           \
+  google/protobuf/compiler/parser.h                             \
+  google/protobuf/compiler/plugin.h                             \
+  google/protobuf/compiler/plugin.pb.h                          \
+  google/protobuf/compiler/cpp/cpp_generator.h                  \
+  google/protobuf/compiler/csharp/csharp_generator.h            \
+  google/protobuf/compiler/csharp/csharp_names.h                \
+  google/protobuf/compiler/java/java_generator.h                \
+  google/protobuf/compiler/java/java_names.h                    \
+  google/protobuf/compiler/javanano/javanano_generator.h        \
+  google/protobuf/compiler/js/js_generator.h                    \
+  google/protobuf/compiler/objectivec/objectivec_generator.h    \
+  google/protobuf/compiler/objectivec/objectivec_helpers.h      \
+  google/protobuf/compiler/python/python_generator.h            \
+  google/protobuf/compiler/ruby/ruby_generator.h                \
+  google/protobuf/util/type_resolver.h                          \
+  google/protobuf/util/field_comparator.h                       \
+  google/protobuf/util/field_mask_util.h                        \
+  google/protobuf/util/json_util.h                              \
+  google/protobuf/util/time_util.h                              \
+  google/protobuf/util/type_resolver_util.h                     \
   google/protobuf/util/message_differencer.h
 
 lib_LTLIBRARIES = libprotobuf-lite.la libprotobuf.la libprotoc.la
 
 libprotobuf_lite_la_LIBADD = $(PTHREAD_LIBS)
-libprotobuf_lite_la_LDFLAGS = -version-info 15:1:0 -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotobuf_lite_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotobuf-lite.map
-EXTRA_libprotobuf_lite_la_DEPENDENCIES = libprotobuf-lite.map
-endif
+libprotobuf_lite_la_LDFLAGS = -version-info 10:0:0 -export-dynamic -no-undefined
 libprotobuf_lite_la_SOURCES =                                  \
   google/protobuf/stubs/atomicops_internals_x86_gcc.cc         \
   google/protobuf/stubs/atomicops_internals_x86_msvc.cc        \
@@ -196,8 +179,6 @@
   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/stubs/map_util.h                             \
   google/protobuf/stubs/mathutil.h                             \
   google/protobuf/stubs/once.cc                                \
@@ -220,8 +201,6 @@
   google/protobuf/arenastring.cc                               \
   google/protobuf/extension_set.cc                             \
   google/protobuf/generated_message_util.cc                    \
-  google/protobuf/generated_message_table_driven_lite.h        \
-  google/protobuf/generated_message_table_driven_lite.cc       \
   google/protobuf/message_lite.cc                              \
   google/protobuf/repeated_field.cc                            \
   google/protobuf/wire_format_lite.cc                          \
@@ -231,11 +210,7 @@
   google/protobuf/io/zero_copy_stream_impl_lite.cc
 
 libprotobuf_la_LIBADD = $(PTHREAD_LIBS)
-libprotobuf_la_LDFLAGS = -version-info 15:1:0 -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotobuf_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotobuf.map
-EXTRA_libprotobuf_la_DEPENDENCIES = libprotobuf.map
-endif
+libprotobuf_la_LDFLAGS = -version-info 10:0:0 -export-dynamic -no-undefined
 libprotobuf_la_SOURCES =                                       \
   $(libprotobuf_lite_la_SOURCES)                               \
   google/protobuf/any.pb.cc                                    \
@@ -252,8 +227,6 @@
   google/protobuf/extension_set_heavy.cc                       \
   google/protobuf/field_mask.pb.cc                             \
   google/protobuf/generated_message_reflection.cc              \
-  google/protobuf/generated_message_table_driven_lite.h        \
-  google/protobuf/generated_message_table_driven.cc            \
   google/protobuf/map_field.cc                                 \
   google/protobuf/message.cc                                   \
   google/protobuf/reflection_internal.h                        \
@@ -276,7 +249,6 @@
   google/protobuf/io/zero_copy_stream_impl.cc                  \
   google/protobuf/compiler/importer.cc                         \
   google/protobuf/compiler/parser.cc                           \
-  google/protobuf/util/delimited_message_util.cc               \
   google/protobuf/util/field_comparator.cc                     \
   google/protobuf/util/field_mask_util.cc                      \
   google/protobuf/util/internal/constants.h                    \
@@ -322,11 +294,7 @@
 nodist_libprotobuf_la_SOURCES = $(nodist_libprotobuf_lite_la_SOURCES)
 
 libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la
-libprotoc_la_LDFLAGS = -version-info 15:1:0 -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotoc_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotoc.map
-EXTRA_libprotoc_la_DEPENDENCIES = libprotoc.map
-endif
+libprotoc_la_LDFLAGS = -version-info 10:0:0 -export-dynamic -no-undefined
 libprotoc_la_SOURCES =                                         \
   google/protobuf/compiler/code_generator.cc                   \
   google/protobuf/compiler/command_line_interface.cc           \
@@ -355,10 +323,7 @@
   google/protobuf/compiler/cpp/cpp_message.h                   \
   google/protobuf/compiler/cpp/cpp_message_field.cc            \
   google/protobuf/compiler/cpp/cpp_message_field.h             \
-  google/protobuf/compiler/cpp/cpp_message_layout_helper.h     \
   google/protobuf/compiler/cpp/cpp_options.h                   \
-  google/protobuf/compiler/cpp/cpp_padding_optimizer.cc        \
-  google/protobuf/compiler/cpp/cpp_padding_optimizer.h         \
   google/protobuf/compiler/cpp/cpp_primitive_field.cc          \
   google/protobuf/compiler/cpp/cpp_primitive_field.h           \
   google/protobuf/compiler/cpp/cpp_service.cc                  \
@@ -410,7 +375,6 @@
   google/protobuf/compiler/java/java_message_builder_lite.h    \
   google/protobuf/compiler/java/java_name_resolver.cc          \
   google/protobuf/compiler/java/java_name_resolver.h           \
-  google/protobuf/compiler/java/java_options.h                 \
   google/protobuf/compiler/java/java_primitive_field.cc        \
   google/protobuf/compiler/java/java_primitive_field.h         \
   google/protobuf/compiler/java/java_primitive_field_lite.cc   \
@@ -426,7 +390,6 @@
   google/protobuf/compiler/java/java_doc_comment.cc            \
   google/protobuf/compiler/java/java_doc_comment.h             \
   google/protobuf/compiler/js/js_generator.cc                  \
-  google/protobuf/compiler/js/well_known_types_embed.cc        \
   google/protobuf/compiler/javanano/javanano_enum.cc           \
   google/protobuf/compiler/javanano/javanano_enum.h            \
   google/protobuf/compiler/javanano/javanano_enum_field.cc     \
@@ -473,7 +436,6 @@
   google/protobuf/compiler/objectivec/objectivec_oneof.h       \
   google/protobuf/compiler/objectivec/objectivec_primitive_field.cc \
   google/protobuf/compiler/objectivec/objectivec_primitive_field.h \
-  google/protobuf/compiler/php/php_generator.cc                \
   google/protobuf/compiler/python/python_generator.cc          \
   google/protobuf/compiler/ruby/ruby_generator.cc              \
   google/protobuf/compiler/csharp/csharp_doc_comment.cc        \
@@ -513,22 +475,6 @@
 protoc_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
 protoc_SOURCES = google/protobuf/compiler/main.cc
 
-# The special JS code for the well-known types is linked into the compiler via
-# well_known_types_embed.cc, which is generated from .js source files. We have
-# to build the js_embed binary using $(CXX_FOR_BUILD) so that it is executable
-# on the build machine in a cross-compilation setup.
-js_embed$(EXEEXT): $(srcdir)/google/protobuf/compiler/js/embed.cc
-	$(CXX_FOR_BUILD) -o $@ $<
-js_well_known_types_sources =                                  \
-	google/protobuf/compiler/js/well_known_types/any.js          \
-	google/protobuf/compiler/js/well_known_types/struct.js       \
-	google/protobuf/compiler/js/well_known_types/timestamp.js
-# We have to cd to $(srcdir) so that out-of-tree builds work properly.
-google/protobuf/compiler/js/well_known_types_embed.cc: js_embed$(EXEEXT) $(js_well_known_types_sources)
-	mkdir -p `dirname $@` && \
-	oldpwd=`pwd` && cd $(srcdir) && \
-	$$oldpwd/js_embed$(EXEEXT) $(js_well_known_types_sources) > $$oldpwd/$@
-
 # Tests ==============================================================
 
 protoc_inputs =                                                   \
@@ -547,9 +493,6 @@
   google/protobuf/unittest_import.proto                           \
   google/protobuf/unittest_import_public_lite.proto               \
   google/protobuf/unittest_import_public.proto                    \
-  google/protobuf/unittest_lazy_dependencies.proto                \
-  google/protobuf/unittest_lazy_dependencies_custom_option.proto  \
-  google/protobuf/unittest_lazy_dependencies_enum.proto           \
   google/protobuf/unittest_lite_imports_nonlite.proto             \
   google/protobuf/unittest_lite.proto                             \
   google/protobuf/unittest_mset.proto                             \
@@ -564,8 +507,8 @@
   google/protobuf/unittest_preserve_unknown_enum.proto            \
   google/protobuf/unittest.proto                                  \
   google/protobuf/unittest_proto3_arena.proto                     \
-  google/protobuf/unittest_proto3_arena_lite.proto                \
-  google/protobuf/unittest_proto3_lite.proto                      \
+  google/protobuf/unittest_proto3_arena_lite.proto                     \
+  google/protobuf/unittest_proto3_lite.proto                     \
   google/protobuf/unittest_well_known_types.proto                 \
   google/protobuf/util/internal/testdata/anys.proto               \
   google/protobuf/util/internal/testdata/books.proto              \
@@ -574,28 +517,18 @@
   google/protobuf/util/internal/testdata/field_mask.proto         \
   google/protobuf/util/internal/testdata/maps.proto               \
   google/protobuf/util/internal/testdata/oneofs.proto             \
-  google/protobuf/util/internal/testdata/proto3.proto             \
   google/protobuf/util/internal/testdata/struct.proto             \
   google/protobuf/util/internal/testdata/timestamp_duration.proto \
-  google/protobuf/util/internal/testdata/wrappers.proto           \
   google/protobuf/util/json_format_proto3.proto                   \
   google/protobuf/util/message_differencer_unittest.proto         \
   google/protobuf/compiler/cpp/cpp_test_large_enum_value.proto
 
 EXTRA_DIST =                                                   \
   $(protoc_inputs)                                             \
-  $(js_well_known_types_sources)                               \
   solaris/libstdc++.la                                         \
-  google/protobuf/unittest_proto3.proto                        \
-  google/protobuf/unittest_import_public_proto3.proto          \
-  google/protobuf/unittest_import_proto3.proto                 \
-  google/protobuf/test_messages_proto3.proto                   \
-  google/protobuf/test_messages_proto2.proto                   \
-  google/protobuf/map_unittest_proto3.proto                    \
   google/protobuf/io/gzip_stream.h                             \
   google/protobuf/io/gzip_stream_unittest.sh                   \
   google/protobuf/testdata/golden_message                      \
-  google/protobuf/testdata/golden_message_maps                 \
   google/protobuf/testdata/golden_message_oneof_implemented    \
   google/protobuf/testdata/golden_message_proto3               \
   google/protobuf/testdata/golden_packed_fields_message        \
@@ -609,16 +542,10 @@
   google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt  \
   google/protobuf/package_info.h                               \
   google/protobuf/io/package_info.h                            \
-  google/protobuf/util/package_info.h                          \
-  google/protobuf/compiler/js/embed.cc                         \
   google/protobuf/compiler/ruby/ruby_generated_code.proto      \
-  google/protobuf/compiler/ruby/ruby_generated_code_pb.rb      \
+  google/protobuf/compiler/ruby/ruby_generated_code.rb         \
   google/protobuf/compiler/package_info.h                      \
-  google/protobuf/compiler/zip_output_unittest.sh              \
-  libprotobuf-lite.map                                         \
-  libprotobuf.map                                              \
-  libprotoc.map                                                \
-  README.md
+  google/protobuf/compiler/zip_output_unittest.sh
 
 protoc_lite_outputs =                                          \
   google/protobuf/map_lite_unittest.pb.cc                      \
@@ -660,12 +587,6 @@
   google/protobuf/unittest_import.pb.h                            \
   google/protobuf/unittest_import_public.pb.cc                    \
   google/protobuf/unittest_import_public.pb.h                     \
-  google/protobuf/unittest_lazy_dependencies.pb.cc                \
-  google/protobuf/unittest_lazy_dependencies.pb.h                 \
-  google/protobuf/unittest_lazy_dependencies_custom_option.pb.cc  \
-  google/protobuf/unittest_lazy_dependencies_custom_option.pb.h   \
-  google/protobuf/unittest_lazy_dependencies_enum.pb.cc           \
-  google/protobuf/unittest_lazy_dependencies_enum.pb.h            \
   google/protobuf/unittest_lite_imports_nonlite.pb.cc             \
   google/protobuf/unittest_lite_imports_nonlite.pb.h              \
   google/protobuf/unittest_mset.pb.cc                             \
@@ -690,10 +611,10 @@
   google/protobuf/unittest_preserve_unknown_enum.pb.h             \
   google/protobuf/unittest_proto3_arena.pb.cc                     \
   google/protobuf/unittest_proto3_arena.pb.h                      \
-  google/protobuf/unittest_proto3_arena_lite.pb.cc                \
-  google/protobuf/unittest_proto3_arena_lite.pb.h                 \
-  google/protobuf/unittest_proto3_lite.pb.cc                      \
-  google/protobuf/unittest_proto3_lite.pb.h                       \
+  google/protobuf/unittest_proto3_arena_lite.pb.cc                     \
+  google/protobuf/unittest_proto3_arena_lite.pb.h                      \
+  google/protobuf/unittest_proto3_lite.pb.cc                     \
+  google/protobuf/unittest_proto3_lite.pb.h                      \
   google/protobuf/unittest_well_known_types.pb.cc                 \
   google/protobuf/unittest_well_known_types.pb.h                  \
   google/protobuf/util/internal/testdata/anys.pb.cc               \
@@ -710,20 +631,16 @@
   google/protobuf/util/internal/testdata/maps.pb.h                \
   google/protobuf/util/internal/testdata/oneofs.pb.cc             \
   google/protobuf/util/internal/testdata/oneofs.pb.h              \
-  google/protobuf/util/internal/testdata/proto3.pb.cc             \
-  google/protobuf/util/internal/testdata/proto3.pb.h              \
   google/protobuf/util/internal/testdata/struct.pb.cc             \
   google/protobuf/util/internal/testdata/struct.pb.h              \
   google/protobuf/util/internal/testdata/timestamp_duration.pb.cc \
   google/protobuf/util/internal/testdata/timestamp_duration.pb.h  \
-  google/protobuf/util/internal/testdata/wrappers.pb.cc           \
-  google/protobuf/util/internal/testdata/wrappers.pb.h            \
   google/protobuf/util/json_format_proto3.pb.cc                   \
   google/protobuf/util/json_format_proto3.pb.h                    \
   google/protobuf/util/message_differencer_unittest.pb.cc         \
   google/protobuf/util/message_differencer_unittest.pb.h
 
-BUILT_SOURCES = $(protoc_outputs) google/protobuf/compiler/js/well_known_types_embed.cc
+BUILT_SOURCES = $(protoc_outputs)
 
 if USE_EXTERNAL_PROTOC
 
@@ -759,7 +676,7 @@
 
 check_PROGRAMS = protoc protobuf-test protobuf-lazy-descriptor-test \
                  protobuf-lite-test test_plugin protobuf-lite-arena-test \
-                 no-warning-test $(GZCHECKPROGRAMS)
+                 $(GZCHECKPROGRAMS)
 protobuf_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
                       ../gmock/gtest/lib/libgtest.la              \
                       ../gmock/lib/libgmock.la                    \
@@ -774,7 +691,6 @@
   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/stubs/once_unittest.cc                       \
   google/protobuf/stubs/statusor_test.cc                       \
   google/protobuf/stubs/status_test.cc                         \
@@ -800,8 +716,8 @@
   google/protobuf/no_field_presence_test.cc                    \
   google/protobuf/preserve_unknown_enum_test.cc                \
   google/protobuf/proto3_arena_unittest.cc                     \
-  google/protobuf/proto3_arena_lite_unittest.cc                \
-  google/protobuf/proto3_lite_unittest.cc                      \
+  google/protobuf/proto3_arena_lite_unittest.cc                     \
+  google/protobuf/proto3_lite_unittest.cc                     \
   google/protobuf/reflection_ops_unittest.cc                   \
   google/protobuf/repeated_field_reflection_unittest.cc        \
   google/protobuf/repeated_field_unittest.cc                   \
@@ -813,15 +729,12 @@
   google/protobuf/io/printer_unittest.cc                       \
   google/protobuf/io/tokenizer_unittest.cc                     \
   google/protobuf/io/zero_copy_stream_unittest.cc              \
-  google/protobuf/compiler/annotation_test_util.h              \
-  google/protobuf/compiler/annotation_test_util.cc             \
   google/protobuf/compiler/command_line_interface_unittest.cc  \
   google/protobuf/compiler/importer_unittest.cc                \
   google/protobuf/compiler/mock_code_generator.cc              \
   google/protobuf/compiler/mock_code_generator.h               \
   google/protobuf/compiler/parser_unittest.cc                  \
   google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc       \
-  google/protobuf/compiler/cpp/cpp_move_unittest.cc            \
   google/protobuf/compiler/cpp/cpp_unittest.h                  \
   google/protobuf/compiler/cpp/cpp_unittest.cc                 \
   google/protobuf/compiler/cpp/cpp_plugin_unittest.cc          \
@@ -831,9 +744,7 @@
   google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc \
   google/protobuf/compiler/python/python_plugin_unittest.cc    \
   google/protobuf/compiler/ruby/ruby_generator_unittest.cc     \
-  google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc \
   google/protobuf/compiler/csharp/csharp_generator_unittest.cc \
-  google/protobuf/util/delimited_message_util_test.cc          \
   google/protobuf/util/field_comparator_test.cc                \
   google/protobuf/util/field_mask_util_test.cc                 \
   google/protobuf/util/internal/default_value_objectwriter_test.cc \
@@ -878,12 +789,7 @@
 # depend on gtest because our internal version of gtest depend on proto
 # full runtime and we want to make sure this test builds without full
 # runtime.
-protobuf_lite_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la \
-                           ../gmock/gtest/lib/libgtest.la      \
-                           ../gmock/lib/libgmock.la            \
-                           ../gmock/lib/libgmock_main.la
-protobuf_lite_test_CPPFLAGS= -I$(srcdir)/../gmock/include \
-                             -I$(srcdir)/../gmock/gtest/include
+protobuf_lite_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la
 protobuf_lite_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
 protobuf_lite_test_SOURCES =                                           \
   google/protobuf/lite_unittest.cc                                     \
@@ -923,23 +829,6 @@
 zcgunzip_SOURCES = google/protobuf/testing/zcgunzip.cc
 endif
 
-# This test target is to ensure all our public header files and generated
-# code is free from warnings. We have to be more pedantic about these
-# files because they are compiled by users with different compiler flags.
-no_warning_test.cc:
-	echo "// Generated from Makefile.am" > no_warning_test.cc
-	for FILE in $(nobase_include_HEADERS); do \
-	  if ! echo $${FILE} | grep "atomicops"; then \
-	    echo "#include <$${FILE}>" >> no_warning_test.cc; \
-	  fi \
-	done
-	echo "int main(int, char**) { return 0; }" >> no_warning_test.cc
-
-no_warning_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
-no_warning_test_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) \
-                           -Wall -Wextra -Werror -Wno-unused-parameter
-nodist_no_warning_test_SOURCES = no_warning_test.cc $(protoc_outputs)
-
 TESTS = protobuf-test protobuf-lazy-descriptor-test protobuf-lite-test \
         google/protobuf/compiler/zip_output_unittest.sh $(GZTESTS)     \
-        protobuf-lite-arena-test no-warning-test
+        protobuf-lite-arena-test
diff --git a/src/README.md b/src/README.md
index c9362ee..63d6e24 100644
--- a/src/README.md
+++ b/src/README.md
@@ -22,7 +22,7 @@
 
 On Ubuntu, you can install them with:
 
-    $ sudo apt-get install autoconf automake libtool curl make g++ unzip
+  $ sudo apt-get install autoconf automake libtool curl make g++ unzip
 
 On other platforms, please use the corresponding package managing tool to
 install them before proceeding.
diff --git a/src/google/protobuf/any.cc b/src/google/protobuf/any.cc
index 83edba5..f7b1d31 100644
--- a/src/google/protobuf/any.cc
+++ b/src/google/protobuf/any.cc
@@ -30,8 +30,6 @@
 
 #include <google/protobuf/any.h>
 
-#include <google/protobuf/generated_message_util.h>
-
 namespace google {
 namespace protobuf {
 namespace internal {
@@ -72,11 +70,13 @@
   if (!InternalIs(message->GetDescriptor())) {
     return false;
   }
-  return message->ParseFromString(value_->GetNoArena());
+  return message->ParseFromString(
+      value_->GetNoArena(&::google::protobuf::internal::GetEmptyString()));
 }
 
 bool AnyMetadata::InternalIs(const Descriptor* descriptor) const {
-  const string type_url = type_url_->GetNoArena();
+  const string type_url = type_url_->GetNoArena(
+             &::google::protobuf::internal::GetEmptyString());
   string full_name;
   if (!ParseAnyTypeUrl(type_url, &full_name)) {
     return false;
diff --git a/src/google/protobuf/any.h b/src/google/protobuf/any.h
index c2c27ec..04e5416 100644
--- a/src/google/protobuf/any.h
+++ b/src/google/protobuf/any.h
@@ -63,7 +63,7 @@
 
   // Unpacks the payload into the given message. Returns false if the message's
   // type doesn't match the type specified in the type URL (i.e., the full
-  // name after the last "/" of the type URL doesn't match the message's actual
+  // name after the last "/" of the type URL doesn't match the message's actaul
   // full name) or parsing the payload has failed.
   bool UnpackTo(Message* message) const;
 
@@ -90,8 +90,8 @@
 
 // Get the proto type name from Any::type_url value. For example, passing
 // "type.googleapis.com/rpc.QueryOrigin" will return "rpc.QueryOrigin" in
-// *full_type_name. Returns false if the type_url does not have a "/"
-// in the type url separating the full type name.
+// *full_type_name. Returns false if type_url does not start with
+// "type.googleapis.com" or "type.googleprod.com".
 bool ParseAnyTypeUrl(const string& type_url, string* full_type_name);
 
 // See if message is of type google.protobuf.Any, if so, return the descriptors
diff --git a/src/google/protobuf/any.pb.cc b/src/google/protobuf/any.pb.cc
index 2968747..fbde4a6 100644
--- a/src/google/protobuf/any.pb.cc
+++ b/src/google/protobuf/any.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/any.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/any.pb.h>
 
 #include <algorithm>
@@ -14,114 +15,104 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class AnyDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Any>
-      _instance;
-} _Any_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fany_2eproto {
-void InitDefaultsAnyImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Any_default_instance_;
-    new (ptr) ::google::protobuf::Any();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Any::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* Any_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Any_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fany_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fany_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/any.proto");
+  GOOGLE_CHECK(file != NULL);
+  Any_descriptor_ = file->message_type(0);
+  static const int Any_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Any, type_url_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Any, value_),
+  };
+  Any_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Any_descriptor_,
+      Any::default_instance_,
+      Any_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Any),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Any, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Any, _is_default_instance_));
 }
 
-void InitDefaultsAny() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsAnyImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fany_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Any, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Any, type_url_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Any, value_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::Any)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Any_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/any.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Any_descriptor_, &Any::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\031google/protobuf/any.proto\022\017google.prot"
-      "obuf\"&\n\003Any\022\020\n\010type_url\030\001 \001(\t\022\r\n\005value\030\002"
-      " \001(\014Bo\n\023com.google.protobufB\010AnyProtoP\001Z"
-      "%github.com/golang/protobuf/ptypes/any\242\002"
-      "\003GPB\252\002\036Google.Protobuf.WellKnownTypesb\006p"
-      "roto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fany_2eproto() {
+  delete Any::default_instance_;
+  delete Any_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fany_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 205);
+    "\n\031google/protobuf/any.proto\022\017google.prot"
+    "obuf\"&\n\003Any\022\020\n\010type_url\030\001 \001(\t\022\r\n\005value\030\002"
+    " \001(\014Br\n\023com.google.protobufB\010AnyProtoP\001Z"
+    "%github.com/golang/protobuf/ptypes/any\240\001"
+    "\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes"
+    "b\006proto3", 208);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/any.proto", &protobuf_RegisterTypes);
+  Any::default_instance_ = new Any();
+  Any::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fany_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fany_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fany_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fany_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fany_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fany_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void Any::InitAsDefaultInstance() {
-}
 void Any::PackFrom(const ::google::protobuf::Message& message) {
   _any_metadata_.PackFrom(message);
 }
@@ -142,33 +133,29 @@
 
 Any::Any()
   : ::google::protobuf::Message(), _internal_metadata_(NULL), _any_metadata_(&type_url_, &value_) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAny();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Any)
 }
+
+void Any::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Any::Any(const Any& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0),
-      _any_metadata_(&type_url_, &value_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.type_url().size() > 0) {
-    type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_url_);
-  }
-  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.value().size() > 0) {
-    value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.value_);
-  }
+    _internal_metadata_(NULL),
+    _any_metadata_(&type_url_, &value_) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Any)
 }
 
 void Any::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
   type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  _cached_size_ = 0;
 }
 
 Any::~Any() {
@@ -179,6 +166,8 @@
 void Any::SharedDtor() {
   type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
 void Any::SetCachedSize(int size) const {
@@ -187,15 +176,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Any::descriptor() {
-  ::protobuf_google_2fprotobuf_2fany_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fany_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Any_descriptor_;
 }
 
 const Any& Any::default_instance() {
-  ::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAny();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fany_2eproto();
+  return *default_instance_;
 }
 
+Any* Any::default_instance_ = NULL;
+
 Any* Any::New(::google::protobuf::Arena* arena) const {
   Any* n = new Any;
   if (arena != NULL) {
@@ -206,13 +197,8 @@
 
 void Any::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Any)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  _internal_metadata_.Clear();
 }
 
 bool Any::MergePartialFromCodedStream(
@@ -221,45 +207,47 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Any)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string type_url = 1;
+      // optional string type_url = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_type_url()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->type_url().data(), static_cast<int>(this->type_url().length()),
+            this->type_url().data(), this->type_url().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Any.type_url"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_value;
         break;
       }
 
-      // bytes value = 2;
+      // optional bytes value = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -276,43 +264,32 @@
 void Any::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Any)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string type_url = 1;
+  // optional string type_url = 1;
   if (this->type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->type_url().data(), static_cast<int>(this->type_url().length()),
+      this->type_url().data(), this->type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Any.type_url");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->type_url(), output);
   }
 
-  // bytes value = 2;
+  // optional bytes value = 2;
   if (this->value().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
       2, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Any)
 }
 
-::google::protobuf::uint8* Any::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Any::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Any)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string type_url = 1;
+  // optional string type_url = 1;
   if (this->type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->type_url().data(), static_cast<int>(this->type_url().length()),
+      this->type_url().data(), this->type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Any.type_url");
     target =
@@ -320,55 +297,45 @@
         1, this->type_url(), target);
   }
 
-  // bytes value = 2;
+  // optional bytes value = 2;
   if (this->value().size() > 0) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
         2, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Any)
   return target;
 }
 
-size_t Any::ByteSizeLong() const {
+int Any::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Any)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // string type_url = 1;
+  // optional string type_url = 1;
   if (this->type_url().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->type_url());
   }
 
-  // bytes value = 2;
+  // optional bytes value = 2;
   if (this->value().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::BytesSize(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Any::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Any)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Any* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Any* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Any>(
           &from);
   if (source == NULL) {
@@ -382,11 +349,7 @@
 
 void Any::MergeFrom(const Any& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Any)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.type_url().size() > 0) {
 
     type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_url_);
@@ -412,6 +375,7 @@
 }
 
 bool Any::IsInitialized() const {
+
   return true;
 }
 
@@ -420,20 +384,115 @@
   InternalSwap(other);
 }
 void Any::InternalSwap(Any* other) {
-  using std::swap;
   type_url_.Swap(&other->type_url_);
   value_.Swap(&other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Any::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fany_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fany_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Any_descriptor_;
+  metadata.reflection = Any_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Any
+
+// optional string type_url = 1;
+void Any::clear_type_url() {
+  type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Any::type_url() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Any.type_url)
+  return type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Any::set_type_url(const ::std::string& value) {
+  
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Any.type_url)
+}
+ void Any::set_type_url(const char* value) {
+  
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Any.type_url)
+}
+ void Any::set_type_url(const char* value, size_t size) {
+  
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Any.type_url)
+}
+ ::std::string* Any::mutable_type_url() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Any.type_url)
+  return type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Any::release_type_url() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Any.type_url)
+  
+  return type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Any::set_allocated_type_url(::std::string* type_url) {
+  if (type_url != NULL) {
+    
+  } else {
+    
+  }
+  type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_url);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Any.type_url)
+}
+
+// optional bytes value = 2;
+void Any::clear_value() {
+  value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Any::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Any.value)
+  return value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Any::set_value(const ::std::string& value) {
+  
+  value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Any.value)
+}
+ void Any::set_value(const char* value) {
+  
+  value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Any.value)
+}
+ void Any::set_value(const void* value, size_t size) {
+  
+  value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Any.value)
+}
+ ::std::string* Any::mutable_value() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Any.value)
+  return value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Any::release_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Any.value)
+  
+  return value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Any::set_allocated_value(::std::string* value) {
+  if (value != NULL) {
+    
+  } else {
+    
+  }
+  value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Any.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/any.pb.h b/src/google/protobuf/any.pb.h
index 3284723..100a67f 100644
--- a/src/google/protobuf/any.pb.h
+++ b/src/google/protobuf/any.pb.h
@@ -8,60 +8,41 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/any.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fany_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[1];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsAnyImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsAny();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsAny();
-}
-}  // namespace protobuf_google_2fprotobuf_2fany_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fany_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fany_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fany_2eproto();
+
 class Any;
-class AnyDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern AnyDefaultTypeInternal _Any_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT Any : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Any) */ {
+class LIBPROTOBUF_EXPORT Any : public ::google::protobuf::Message {
  public:
   Any();
   virtual ~Any();
@@ -72,32 +53,10 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Any(Any&& from) noexcept
-    : Any() {
-    *this = ::std::move(from);
-  }
 
-  inline Any& operator=(Any&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   static const ::google::protobuf::Descriptor* descriptor();
   static const Any& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Any* internal_default_instance() {
-    return reinterpret_cast<const Any*>(
-               &_Any_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   // implements Any -----------------------------------------------
 
   void PackFrom(const ::google::protobuf::Message& message);
@@ -109,72 +68,62 @@
   }
 
   void Swap(Any* other);
-  friend void swap(Any& a, Any& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Any* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Any* New() const { return New(NULL); }
 
-  Any* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Any* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Any& from);
   void MergeFrom(const Any& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Any* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // string type_url = 1;
+  // optional string type_url = 1;
   void clear_type_url();
   static const int kTypeUrlFieldNumber = 1;
   const ::std::string& type_url() const;
   void set_type_url(const ::std::string& value);
-  #if LANG_CXX11
-  void set_type_url(::std::string&& value);
-  #endif
   void set_type_url(const char* value);
   void set_type_url(const char* value, size_t size);
   ::std::string* mutable_type_url();
   ::std::string* release_type_url();
   void set_allocated_type_url(::std::string* type_url);
 
-  // bytes value = 2;
+  // optional bytes value = 2;
   void clear_value();
   static const int kValueFieldNumber = 2;
   const ::std::string& value() const;
   void set_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_value(::std::string&& value);
-  #endif
   void set_value(const char* value);
   void set_value(const void* value, size_t size);
   ::std::string* mutable_value();
@@ -185,47 +134,40 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr type_url_;
   ::google::protobuf::internal::ArenaStringPtr value_;
   mutable int _cached_size_;
   ::google::protobuf::internal::AnyMetadata _any_metadata_;
-  friend struct ::protobuf_google_2fprotobuf_2fany_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAnyImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fany_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fany_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fany_2eproto();
+
+  void InitAsDefaultInstance();
+  static Any* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Any
 
-// string type_url = 1;
+// optional string type_url = 1;
 inline void Any::clear_type_url() {
   type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Any::type_url() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Any.type_url)
-  return type_url_.GetNoArena();
+  return type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Any::set_type_url(const ::std::string& value) {
   
   type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Any.type_url)
 }
-#if LANG_CXX11
-inline void Any::set_type_url(::std::string&& value) {
-  
-  type_url_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Any.type_url)
-}
-#endif
 inline void Any::set_type_url(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Any.type_url)
@@ -256,29 +198,20 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Any.type_url)
 }
 
-// bytes value = 2;
+// optional bytes value = 2;
 inline void Any::clear_value() {
   value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Any::value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Any.value)
-  return value_.GetNoArena();
+  return value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Any::set_value(const ::std::string& value) {
   
   value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Any.value)
 }
-#if LANG_CXX11
-inline void Any::set_value(::std::string&& value) {
-  
-  value_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Any.value)
-}
-#endif
 inline void Any::set_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Any.value)
@@ -309,9 +242,7 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Any.value)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/src/google/protobuf/any.proto b/src/google/protobuf/any.proto
index c748667..45db6ed 100644
--- a/src/google/protobuf/any.proto
+++ b/src/google/protobuf/any.proto
@@ -37,6 +37,7 @@
 option java_package = "com.google.protobuf";
 option java_outer_classname = "AnyProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
 
 // `Any` contains an arbitrary serialized protocol buffer message along with a
@@ -64,26 +65,6 @@
 //       foo = any.unpack(Foo.class);
 //     }
 //
-//  Example 3: Pack and unpack a message in Python.
-//
-//     foo = Foo(...)
-//     any = Any()
-//     any.Pack(foo)
-//     ...
-//     if any.Is(Foo.DESCRIPTOR):
-//       any.Unpack(foo)
-//       ...
-//
-//  Example 4: Pack and unpack a message in Go
-//
-//      foo := &pb.Foo{...}
-//      any, err := ptypes.MarshalAny(foo)
-//      ...
-//      foo := &pb.Foo{}
-//      if err := ptypes.UnmarshalAny(any, foo); err != nil {
-//        ...
-//      }
-//
 // The pack methods provided by protobuf library will by default use
 // 'type.googleapis.com/full.type.name' as the type URL and the unpack
 // methods only use the fully qualified type name after the last '/'
@@ -123,10 +104,10 @@
   // A URL/resource name whose content describes the type of the
   // serialized protocol buffer message.
   //
-  // For URLs which use the scheme `http`, `https`, or no scheme, the
+  // For URLs which use the schema `http`, `https`, or no schema, the
   // following restrictions and interpretations apply:
   //
-  // * If no scheme is provided, `https` is assumed.
+  // * If no schema is provided, `https` is assumed.
   // * The last segment of the URL's path must represent the fully
   //   qualified name of the type (as in `path/google.protobuf.Duration`).
   //   The name should be in a canonical form (e.g., leading "." is
@@ -139,7 +120,7 @@
   //   on changes to types. (Use versioned type names to manage
   //   breaking changes.)
   //
-  // Schemes other than `http`, `https` (or the empty scheme) might be
+  // Schemas other than `http`, `https` (or the empty schema) might be
   // used with implementation specific semantics.
   //
   string type_url = 1;
diff --git a/src/google/protobuf/api.pb.cc b/src/google/protobuf/api.pb.cc
index 439a47c..cbeba30 100644
--- a/src/google/protobuf/api.pb.cc
+++ b/src/google/protobuf/api.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/api.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/api.pb.h>
 
 #include <algorithm>
@@ -14,225 +15,178 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class ApiDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Api>
-      _instance;
-} _Api_default_instance_;
-class MethodDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Method>
-      _instance;
-} _Method_default_instance_;
-class MixinDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Mixin>
-      _instance;
-} _Mixin_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fapi_2eproto {
-void InitDefaultsApiImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethod();
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext();
-  protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixin();
-  {
-    void* ptr = &::google::protobuf::_Api_default_instance_;
-    new (ptr) ::google::protobuf::Api();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Api::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* Api_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Api_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Method_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Method_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Mixin_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Mixin_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fapi_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/api.proto");
+  GOOGLE_CHECK(file != NULL);
+  Api_descriptor_ = file->message_type(0);
+  static const int Api_offsets_[7] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, methods_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, version_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, source_context_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, mixins_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, syntax_),
+  };
+  Api_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Api_descriptor_,
+      Api::default_instance_,
+      Api_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Api),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Api, _is_default_instance_));
+  Method_descriptor_ = file->message_type(1);
+  static const int Method_offsets_[7] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, request_type_url_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, request_streaming_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, response_type_url_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, response_streaming_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, syntax_),
+  };
+  Method_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Method_descriptor_,
+      Method::default_instance_,
+      Method_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Method),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Method, _is_default_instance_));
+  Mixin_descriptor_ = file->message_type(2);
+  static const int Mixin_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Mixin, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Mixin, root_),
+  };
+  Mixin_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Mixin_descriptor_,
+      Mixin::default_instance_,
+      Mixin_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Mixin),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Mixin, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Mixin, _is_default_instance_));
 }
 
-void InitDefaultsApi() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsApiImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fapi_2eproto);
 }
 
-void InitDefaultsMethodImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  {
-    void* ptr = &::google::protobuf::_Method_default_instance_;
-    new (ptr) ::google::protobuf::Method();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Method::InitAsDefaultInstance();
-}
-
-void InitDefaultsMethod() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMethodImpl);
-}
-
-void InitDefaultsMixinImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Mixin_default_instance_;
-    new (ptr) ::google::protobuf::Mixin();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Mixin::InitAsDefaultInstance();
-}
-
-void InitDefaultsMixin() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMixinImpl);
-}
-
-::google::protobuf::Metadata file_level_metadata[3];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, methods_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, version_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, source_context_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, mixins_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, syntax_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, request_type_url_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, request_streaming_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, response_type_url_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, response_streaming_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, syntax_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Mixin, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Mixin, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Mixin, root_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::Api)},
-  { 12, -1, sizeof(::google::protobuf::Method)},
-  { 24, -1, sizeof(::google::protobuf::Mixin)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Api_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Method_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Mixin_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/api.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 3);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Api_descriptor_, &Api::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Method_descriptor_, &Method::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Mixin_descriptor_, &Mixin::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\031google/protobuf/api.proto\022\017google.prot"
-      "obuf\032$google/protobuf/source_context.pro"
-      "to\032\032google/protobuf/type.proto\"\201\002\n\003Api\022\014"
-      "\n\004name\030\001 \001(\t\022(\n\007methods\030\002 \003(\0132\027.google.p"
-      "rotobuf.Method\022(\n\007options\030\003 \003(\0132\027.google"
-      ".protobuf.Option\022\017\n\007version\030\004 \001(\t\0226\n\016sou"
-      "rce_context\030\005 \001(\0132\036.google.protobuf.Sour"
-      "ceContext\022&\n\006mixins\030\006 \003(\0132\026.google.proto"
-      "buf.Mixin\022\'\n\006syntax\030\007 \001(\0162\027.google.proto"
-      "buf.Syntax\"\325\001\n\006Method\022\014\n\004name\030\001 \001(\t\022\030\n\020r"
-      "equest_type_url\030\002 \001(\t\022\031\n\021request_streami"
-      "ng\030\003 \001(\010\022\031\n\021response_type_url\030\004 \001(\t\022\032\n\022r"
-      "esponse_streaming\030\005 \001(\010\022(\n\007options\030\006 \003(\013"
-      "2\027.google.protobuf.Option\022\'\n\006syntax\030\007 \001("
-      "\0162\027.google.protobuf.Syntax\"#\n\005Mixin\022\014\n\004n"
-      "ame\030\001 \001(\t\022\014\n\004root\030\002 \001(\tBu\n\023com.google.pr"
-      "otobufB\010ApiProtoP\001Z+google.golang.org/ge"
-      "nproto/protobuf/api;api\242\002\003GPB\252\002\036Google.P"
-      "rotobuf.WellKnownTypesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto() {
+  delete Api::default_instance_;
+  delete Api_reflection_;
+  delete Method::default_instance_;
+  delete Method_reflection_;
+  delete Mixin::default_instance_;
+  delete Mixin_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+  ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 750);
+    "\n\031google/protobuf/api.proto\022\017google.prot"
+    "obuf\032$google/protobuf/source_context.pro"
+    "to\032\032google/protobuf/type.proto\"\201\002\n\003Api\022\014"
+    "\n\004name\030\001 \001(\t\022(\n\007methods\030\002 \003(\0132\027.google.p"
+    "rotobuf.Method\022(\n\007options\030\003 \003(\0132\027.google"
+    ".protobuf.Option\022\017\n\007version\030\004 \001(\t\0226\n\016sou"
+    "rce_context\030\005 \001(\0132\036.google.protobuf.Sour"
+    "ceContext\022&\n\006mixins\030\006 \003(\0132\026.google.proto"
+    "buf.Mixin\022\'\n\006syntax\030\007 \001(\0162\027.google.proto"
+    "buf.Syntax\"\325\001\n\006Method\022\014\n\004name\030\001 \001(\t\022\030\n\020r"
+    "equest_type_url\030\002 \001(\t\022\031\n\021request_streami"
+    "ng\030\003 \001(\010\022\031\n\021response_type_url\030\004 \001(\t\022\032\n\022r"
+    "esponse_streaming\030\005 \001(\010\022(\n\007options\030\006 \003(\013"
+    "2\027.google.protobuf.Option\022\'\n\006syntax\030\007 \001("
+    "\0162\027.google.protobuf.Syntax\"#\n\005Mixin\022\014\n\004n"
+    "ame\030\001 \001(\t\022\014\n\004root\030\002 \001(\tBK\n\023com.google.pr"
+    "otobufB\010ApiProtoP\001\240\001\001\242\002\003GPB\252\002\036Google.Pro"
+    "tobuf.WellKnownTypesb\006proto3", 708);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/api.proto", &protobuf_RegisterTypes);
-  ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::AddDescriptors();
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::AddDescriptors();
+  Api::default_instance_ = new Api();
+  Method::default_instance_ = new Method();
+  Mixin::default_instance_ = new Mixin();
+  Api::default_instance_->InitAsDefaultInstance();
+  Method::default_instance_->InitAsDefaultInstance();
+  Mixin::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fapi_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fapi_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fapi_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fapi_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void Api::InitAsDefaultInstance() {
-  ::google::protobuf::_Api_default_instance_._instance.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>(
-      ::google::protobuf::SourceContext::internal_default_instance());
-}
-void Api::clear_options() {
-  options_.Clear();
-}
-void Api::clear_source_context() {
-  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) {
-    delete source_context_;
-  }
-  source_context_ = NULL;
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Api::kNameFieldNumber;
 const int Api::kMethodsFieldNumber;
@@ -245,44 +199,31 @@
 
 Api::Api()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsApi();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Api)
 }
+
+void Api::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+  source_context_ = const_cast< ::google::protobuf::SourceContext*>(&::google::protobuf::SourceContext::default_instance());
+}
+
 Api::Api(const Api& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      methods_(from.methods_),
-      options_(from.options_),
-      mixins_(from.mixins_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
-  }
-  version_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.version().size() > 0) {
-    version_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.version_);
-  }
-  if (from.has_source_context()) {
-    source_context_ = new ::google::protobuf::SourceContext(*from.source_context_);
-  } else {
-    source_context_ = NULL;
-  }
-  syntax_ = from.syntax_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Api)
 }
 
 void Api::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   version_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&source_context_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&syntax_) -
-      reinterpret_cast<char*>(&source_context_)) + sizeof(syntax_));
-  _cached_size_ = 0;
+  source_context_ = NULL;
+  syntax_ = 0;
 }
 
 Api::~Api() {
@@ -293,7 +234,9 @@
 void Api::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   version_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete source_context_;
+  if (this != default_instance_) {
+    delete source_context_;
+  }
 }
 
 void Api::SetCachedSize(int size) const {
@@ -302,15 +245,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Api::descriptor() {
-  ::protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Api_descriptor_;
 }
 
 const Api& Api::default_instance() {
-  ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsApi();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  return *default_instance_;
 }
 
+Api* Api::default_instance_ = NULL;
+
 Api* Api::New(::google::protobuf::Arena* arena) const {
   Api* n = new Api;
   if (arena != NULL) {
@@ -321,21 +266,14 @@
 
 void Api::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Api)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  version_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
+  syntax_ = 0;
   methods_.Clear();
   options_.Clear();
   mixins_.Clear();
-  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  version_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) {
-    delete source_context_;
-  }
-  source_context_ = NULL;
-  syntax_ = 0;
-  _internal_metadata_.Clear();
 }
 
 bool Api::MergePartialFromCodedStream(
@@ -344,91 +282,110 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Api)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
+      // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Api.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_methods;
         break;
       }
 
       // repeated .google.protobuf.Method methods = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_methods()));
+        if (tag == 18) {
+         parse_methods:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_methods:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_methods()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_loop_methods;
+        if (input->ExpectTag(26)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
         break;
       }
 
       // repeated .google.protobuf.Option options = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options()));
+        if (tag == 26) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(34)) goto parse_version;
         break;
       }
 
-      // string version = 4;
+      // optional string version = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
+        if (tag == 34) {
+         parse_version:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_version()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->version().data(), static_cast<int>(this->version().length()),
+            this->version().data(), this->version().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Api.version"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(42)) goto parse_source_context;
         break;
       }
 
-      // .google.protobuf.SourceContext source_context = 5;
+      // optional .google.protobuf.SourceContext source_context = 5;
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 42) {
+         parse_source_context:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_source_context()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_mixins;
         break;
       }
 
       // repeated .google.protobuf.Mixin mixins = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_mixins()));
+        if (tag == 50) {
+         parse_mixins:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_mixins:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_mixins()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_loop_mixins;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(56)) goto parse_syntax;
         break;
       }
 
-      // .google.protobuf.Syntax syntax = 7;
+      // optional .google.protobuf.Syntax syntax = 7;
       case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) {
+        if (tag == 56) {
+         parse_syntax:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -437,16 +394,18 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -463,13 +422,10 @@
 void Api::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Api)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Api.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -477,66 +433,55 @@
   }
 
   // repeated .google.protobuf.Method methods = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->methods_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->methods_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->methods(static_cast<int>(i)), output);
+      2, this->methods(i), output);
   }
 
   // repeated .google.protobuf.Option options = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      3, this->options(static_cast<int>(i)), output);
+      3, this->options(i), output);
   }
 
-  // string version = 4;
+  // optional string version = 4;
   if (this->version().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->version().data(), static_cast<int>(this->version().length()),
+      this->version().data(), this->version().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Api.version");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       4, this->version(), output);
   }
 
-  // .google.protobuf.SourceContext source_context = 5;
+  // optional .google.protobuf.SourceContext source_context = 5;
   if (this->has_source_context()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       5, *this->source_context_, output);
   }
 
   // repeated .google.protobuf.Mixin mixins = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->mixins_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->mixins_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      6, this->mixins(static_cast<int>(i)), output);
+      6, this->mixins(i), output);
   }
 
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   if (this->syntax() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       7, this->syntax(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Api)
 }
 
-::google::protobuf::uint8* Api::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Api::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Api)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Api.name");
     target =
@@ -545,25 +490,23 @@
   }
 
   // repeated .google.protobuf.Method methods = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->methods_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->methods_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->methods(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        2, this->methods(i), target);
   }
 
   // repeated .google.protobuf.Option options = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, this->options(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        3, this->options(i), target);
   }
 
-  // string version = 4;
+  // optional string version = 4;
   if (this->version().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->version().data(), static_cast<int>(this->version().length()),
+      this->version().data(), this->version().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Api.version");
     target =
@@ -571,115 +514,95 @@
         4, this->version(), target);
   }
 
-  // .google.protobuf.SourceContext source_context = 5;
+  // optional .google.protobuf.SourceContext source_context = 5;
   if (this->has_source_context()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        5, *this->source_context_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        5, *this->source_context_, target);
   }
 
   // repeated .google.protobuf.Mixin mixins = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->mixins_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->mixins_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        6, this->mixins(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        6, this->mixins(i), target);
   }
 
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   if (this->syntax() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       7, this->syntax(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Api)
   return target;
 }
 
-size_t Api::ByteSizeLong() const {
+int Api::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Api)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // repeated .google.protobuf.Method methods = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->methods_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->methods(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.Option options = 3;
-  {
-    unsigned int count = static_cast<unsigned int>(this->options_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->options(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.Mixin mixins = 6;
-  {
-    unsigned int count = static_cast<unsigned int>(this->mixins_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->mixins(static_cast<int>(i)));
-    }
-  }
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->name());
   }
 
-  // string version = 4;
+  // optional string version = 4;
   if (this->version().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->version());
   }
 
-  // .google.protobuf.SourceContext source_context = 5;
+  // optional .google.protobuf.SourceContext source_context = 5;
   if (this->has_source_context()) {
     total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::MessageSize(
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
         *this->source_context_);
   }
 
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   if (this->syntax() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.Method methods = 2;
+  total_size += 1 * this->methods_size();
+  for (int i = 0; i < this->methods_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->methods(i));
+  }
+
+  // repeated .google.protobuf.Option options = 3;
+  total_size += 1 * this->options_size();
+  for (int i = 0; i < this->options_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->options(i));
+  }
+
+  // repeated .google.protobuf.Mixin mixins = 6;
+  total_size += 1 * this->mixins_size();
+  for (int i = 0; i < this->mixins_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->mixins(i));
+  }
+
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Api::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Api)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Api* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Api* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Api>(
           &from);
   if (source == NULL) {
@@ -693,11 +616,7 @@
 
 void Api::MergeFrom(const Api& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Api)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   methods_.MergeFrom(from.methods_);
   options_.MergeFrom(from.options_);
   mixins_.MergeFrom(from.mixins_);
@@ -732,6 +651,7 @@
 }
 
 bool Api::IsInitialized() const {
+
   return true;
 }
 
@@ -740,31 +660,262 @@
   InternalSwap(other);
 }
 void Api::InternalSwap(Api* other) {
-  using std::swap;
-  methods_.InternalSwap(&other->methods_);
-  options_.InternalSwap(&other->options_);
-  mixins_.InternalSwap(&other->mixins_);
   name_.Swap(&other->name_);
+  methods_.UnsafeArenaSwap(&other->methods_);
+  options_.UnsafeArenaSwap(&other->options_);
   version_.Swap(&other->version_);
-  swap(source_context_, other->source_context_);
-  swap(syntax_, other->syntax_);
+  std::swap(source_context_, other->source_context_);
+  mixins_.UnsafeArenaSwap(&other->mixins_);
+  std::swap(syntax_, other->syntax_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Api::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Api_descriptor_;
+  metadata.reflection = Api_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Api
+
+// optional string name = 1;
+void Api::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Api::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Api::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Api.name)
+}
+ void Api::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Api.name)
+}
+ void Api::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Api.name)
+}
+ ::std::string* Api::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Api.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Api::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Api.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Api::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    
+  } else {
+    
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.name)
+}
+
+// repeated .google.protobuf.Method methods = 2;
+int Api::methods_size() const {
+  return methods_.size();
+}
+void Api::clear_methods() {
+  methods_.Clear();
+}
+const ::google::protobuf::Method& Api::methods(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.methods)
+  return methods_.Get(index);
+}
+::google::protobuf::Method* Api::mutable_methods(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Api.methods)
+  return methods_.Mutable(index);
+}
+::google::protobuf::Method* Api::add_methods() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Api.methods)
+  return methods_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Method >*
+Api::mutable_methods() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Api.methods)
+  return &methods_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method >&
+Api::methods() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Api.methods)
+  return methods_;
+}
+
+// repeated .google.protobuf.Option options = 3;
+int Api::options_size() const {
+  return options_.size();
+}
+void Api::clear_options() {
+  options_.Clear();
+}
+const ::google::protobuf::Option& Api::options(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.options)
+  return options_.Get(index);
+}
+::google::protobuf::Option* Api::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Api.options)
+  return options_.Mutable(index);
+}
+::google::protobuf::Option* Api::add_options() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Api.options)
+  return options_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >*
+Api::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Api.options)
+  return &options_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
+Api::options() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Api.options)
+  return options_;
+}
+
+// optional string version = 4;
+void Api::clear_version() {
+  version_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Api::version() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.version)
+  return version_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Api::set_version(const ::std::string& value) {
+  
+  version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Api.version)
+}
+ void Api::set_version(const char* value) {
+  
+  version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Api.version)
+}
+ void Api::set_version(const char* value, size_t size) {
+  
+  version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Api.version)
+}
+ ::std::string* Api::mutable_version() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Api.version)
+  return version_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Api::release_version() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Api.version)
+  
+  return version_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Api::set_allocated_version(::std::string* version) {
+  if (version != NULL) {
+    
+  } else {
+    
+  }
+  version_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), version);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.version)
+}
+
+// optional .google.protobuf.SourceContext source_context = 5;
+bool Api::has_source_context() const {
+  return !_is_default_instance_ && source_context_ != NULL;
+}
+void Api::clear_source_context() {
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
+}
+const ::google::protobuf::SourceContext& Api::source_context() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.source_context)
+  return source_context_ != NULL ? *source_context_ : *default_instance_->source_context_;
+}
+::google::protobuf::SourceContext* Api::mutable_source_context() {
+  
+  if (source_context_ == NULL) {
+    source_context_ = new ::google::protobuf::SourceContext;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Api.source_context)
+  return source_context_;
+}
+::google::protobuf::SourceContext* Api::release_source_context() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Api.source_context)
+  
+  ::google::protobuf::SourceContext* temp = source_context_;
+  source_context_ = NULL;
+  return temp;
+}
+void Api::set_allocated_source_context(::google::protobuf::SourceContext* source_context) {
+  delete source_context_;
+  source_context_ = source_context;
+  if (source_context) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.source_context)
+}
+
+// repeated .google.protobuf.Mixin mixins = 6;
+int Api::mixins_size() const {
+  return mixins_.size();
+}
+void Api::clear_mixins() {
+  mixins_.Clear();
+}
+const ::google::protobuf::Mixin& Api::mixins(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.mixins)
+  return mixins_.Get(index);
+}
+::google::protobuf::Mixin* Api::mutable_mixins(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Api.mixins)
+  return mixins_.Mutable(index);
+}
+::google::protobuf::Mixin* Api::add_mixins() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Api.mixins)
+  return mixins_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >*
+Api::mutable_mixins() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Api.mixins)
+  return &mixins_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >&
+Api::mixins() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Api.mixins)
+  return mixins_;
+}
+
+// optional .google.protobuf.Syntax syntax = 7;
+void Api::clear_syntax() {
+  syntax_ = 0;
+}
+ ::google::protobuf::Syntax Api::syntax() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Api.syntax)
+  return static_cast< ::google::protobuf::Syntax >(syntax_);
+}
+ void Api::set_syntax(::google::protobuf::Syntax value) {
+  
+  syntax_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Api.syntax)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void Method::InitAsDefaultInstance() {
-}
-void Method::clear_options() {
-  options_.Clear();
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Method::kNameFieldNumber;
 const int Method::kRequestTypeUrlFieldNumber;
@@ -777,44 +928,32 @@
 
 Method::Method()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethod();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Method)
 }
+
+void Method::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Method::Method(const Method& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      options_(from.options_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
-  }
-  request_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.request_type_url().size() > 0) {
-    request_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.request_type_url_);
-  }
-  response_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.response_type_url().size() > 0) {
-    response_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.response_type_url_);
-  }
-  ::memcpy(&request_streaming_, &from.request_streaming_,
-    static_cast<size_t>(reinterpret_cast<char*>(&syntax_) -
-    reinterpret_cast<char*>(&request_streaming_)) + sizeof(syntax_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Method)
 }
 
 void Method::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   request_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  request_streaming_ = false;
   response_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&request_streaming_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&syntax_) -
-      reinterpret_cast<char*>(&request_streaming_)) + sizeof(syntax_));
-  _cached_size_ = 0;
+  response_streaming_ = false;
+  syntax_ = 0;
 }
 
 Method::~Method() {
@@ -826,6 +965,8 @@
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   request_type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   response_type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
 void Method::SetCachedSize(int size) const {
@@ -834,15 +975,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Method::descriptor() {
-  ::protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Method_descriptor_;
 }
 
 const Method& Method::default_instance() {
-  ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethod();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  return *default_instance_;
 }
 
+Method* Method::default_instance_ = NULL;
+
 Method* Method::New(::google::protobuf::Arena* arena) const {
   Method* n = new Method;
   if (arena != NULL) {
@@ -853,18 +996,31 @@
 
 void Method::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Method)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(Method, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<Method*>(16)->f)
+#endif
 
-  options_.Clear();
+#define ZR_(first, last) do {\
+  ::memset(&first, 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(request_streaming_, syntax_);
   name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   request_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   response_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&request_streaming_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&syntax_) -
-      reinterpret_cast<char*>(&request_streaming_)) + sizeof(syntax_));
-  _internal_metadata_.Clear();
+
+#undef ZR_HELPER_
+#undef ZR_
+
+  options_.Clear();
 }
 
 bool Method::MergePartialFromCodedStream(
@@ -873,101 +1029,111 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Method)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
+      // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Method.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_request_type_url;
         break;
       }
 
-      // string request_type_url = 2;
+      // optional string request_type_url = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_request_type_url:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_request_type_url()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->request_type_url().data(), static_cast<int>(this->request_type_url().length()),
+            this->request_type_url().data(), this->request_type_url().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Method.request_type_url"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_request_streaming;
         break;
       }
 
-      // bool request_streaming = 3;
+      // optional bool request_streaming = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-
+        if (tag == 24) {
+         parse_request_streaming:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &request_streaming_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(34)) goto parse_response_type_url;
         break;
       }
 
-      // string response_type_url = 4;
+      // optional string response_type_url = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
+        if (tag == 34) {
+         parse_response_type_url:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_response_type_url()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->response_type_url().data(), static_cast<int>(this->response_type_url().length()),
+            this->response_type_url().data(), this->response_type_url().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Method.response_type_url"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(40)) goto parse_response_streaming;
         break;
       }
 
-      // bool response_streaming = 5;
+      // optional bool response_streaming = 5;
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) {
-
+        if (tag == 40) {
+         parse_response_streaming:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &response_streaming_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_options;
         break;
       }
 
       // repeated .google.protobuf.Option options = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options()));
+        if (tag == 50) {
+         parse_options:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(56)) goto parse_syntax;
         break;
       }
 
-      // .google.protobuf.Syntax syntax = 7;
+      // optional .google.protobuf.Syntax syntax = 7;
       case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) {
+        if (tag == 56) {
+         parse_syntax:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -976,16 +1142,18 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1002,80 +1170,68 @@
 void Method::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Method)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Method.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->name(), output);
   }
 
-  // string request_type_url = 2;
+  // optional string request_type_url = 2;
   if (this->request_type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->request_type_url().data(), static_cast<int>(this->request_type_url().length()),
+      this->request_type_url().data(), this->request_type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Method.request_type_url");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       2, this->request_type_url(), output);
   }
 
-  // bool request_streaming = 3;
+  // optional bool request_streaming = 3;
   if (this->request_streaming() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->request_streaming(), output);
   }
 
-  // string response_type_url = 4;
+  // optional string response_type_url = 4;
   if (this->response_type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->response_type_url().data(), static_cast<int>(this->response_type_url().length()),
+      this->response_type_url().data(), this->response_type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Method.response_type_url");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       4, this->response_type_url(), output);
   }
 
-  // bool response_streaming = 5;
+  // optional bool response_streaming = 5;
   if (this->response_streaming() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->response_streaming(), output);
   }
 
   // repeated .google.protobuf.Option options = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      6, this->options(static_cast<int>(i)), output);
+      6, this->options(i), output);
   }
 
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   if (this->syntax() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       7, this->syntax(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Method)
 }
 
-::google::protobuf::uint8* Method::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Method::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Method)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Method.name");
     target =
@@ -1083,10 +1239,10 @@
         1, this->name(), target);
   }
 
-  // string request_type_url = 2;
+  // optional string request_type_url = 2;
   if (this->request_type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->request_type_url().data(), static_cast<int>(this->request_type_url().length()),
+      this->request_type_url().data(), this->request_type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Method.request_type_url");
     target =
@@ -1094,15 +1250,15 @@
         2, this->request_type_url(), target);
   }
 
-  // bool request_streaming = 3;
+  // optional bool request_streaming = 3;
   if (this->request_streaming() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->request_streaming(), target);
   }
 
-  // string response_type_url = 4;
+  // optional string response_type_url = 4;
   if (this->response_type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->response_type_url().data(), static_cast<int>(this->response_type_url().length()),
+      this->response_type_url().data(), this->response_type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Method.response_type_url");
     target =
@@ -1110,101 +1266,87 @@
         4, this->response_type_url(), target);
   }
 
-  // bool response_streaming = 5;
+  // optional bool response_streaming = 5;
   if (this->response_streaming() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->response_streaming(), target);
   }
 
   // repeated .google.protobuf.Option options = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        6, this->options(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        6, this->options(i), target);
   }
 
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   if (this->syntax() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       7, this->syntax(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Method)
   return target;
 }
 
-size_t Method::ByteSizeLong() const {
+int Method::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Method)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // repeated .google.protobuf.Option options = 6;
-  {
-    unsigned int count = static_cast<unsigned int>(this->options_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->options(static_cast<int>(i)));
-    }
-  }
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->name());
   }
 
-  // string request_type_url = 2;
+  // optional string request_type_url = 2;
   if (this->request_type_url().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->request_type_url());
   }
 
-  // string response_type_url = 4;
+  // optional bool request_streaming = 3;
+  if (this->request_streaming() != 0) {
+    total_size += 1 + 1;
+  }
+
+  // optional string response_type_url = 4;
   if (this->response_type_url().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->response_type_url());
   }
 
-  // bool request_streaming = 3;
-  if (this->request_streaming() != 0) {
-    total_size += 1 + 1;
-  }
-
-  // bool response_streaming = 5;
+  // optional bool response_streaming = 5;
   if (this->response_streaming() != 0) {
     total_size += 1 + 1;
   }
 
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   if (this->syntax() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.Option options = 6;
+  total_size += 1 * this->options_size();
+  for (int i = 0; i < this->options_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->options(i));
+  }
+
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Method::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Method)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Method* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Method* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Method>(
           &from);
   if (source == NULL) {
@@ -1218,11 +1360,7 @@
 
 void Method::MergeFrom(const Method& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Method)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   options_.MergeFrom(from.options_);
   if (from.name().size() > 0) {
 
@@ -1232,13 +1370,13 @@
 
     request_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.request_type_url_);
   }
+  if (from.request_streaming() != 0) {
+    set_request_streaming(from.request_streaming());
+  }
   if (from.response_type_url().size() > 0) {
 
     response_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.response_type_url_);
   }
-  if (from.request_streaming() != 0) {
-    set_request_streaming(from.request_streaming());
-  }
   if (from.response_streaming() != 0) {
     set_response_streaming(from.response_streaming());
   }
@@ -1262,6 +1400,7 @@
 }
 
 bool Method::IsInitialized() const {
+
   return true;
 }
 
@@ -1270,28 +1409,236 @@
   InternalSwap(other);
 }
 void Method::InternalSwap(Method* other) {
-  using std::swap;
-  options_.InternalSwap(&other->options_);
   name_.Swap(&other->name_);
   request_type_url_.Swap(&other->request_type_url_);
+  std::swap(request_streaming_, other->request_streaming_);
   response_type_url_.Swap(&other->response_type_url_);
-  swap(request_streaming_, other->request_streaming_);
-  swap(response_streaming_, other->response_streaming_);
-  swap(syntax_, other->syntax_);
+  std::swap(response_streaming_, other->response_streaming_);
+  options_.UnsafeArenaSwap(&other->options_);
+  std::swap(syntax_, other->syntax_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Method::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Method_descriptor_;
+  metadata.reflection = Method_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Method
+
+// optional string name = 1;
+void Method::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Method::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Method::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Method.name)
+}
+ void Method::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Method.name)
+}
+ void Method::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Method.name)
+}
+ ::std::string* Method::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Method.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Method::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Method.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Method::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    
+  } else {
+    
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.name)
+}
+
+// optional string request_type_url = 2;
+void Method::clear_request_type_url() {
+  request_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Method::request_type_url() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.request_type_url)
+  return request_type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Method::set_request_type_url(const ::std::string& value) {
+  
+  request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Method.request_type_url)
+}
+ void Method::set_request_type_url(const char* value) {
+  
+  request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Method.request_type_url)
+}
+ void Method::set_request_type_url(const char* value, size_t size) {
+  
+  request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Method.request_type_url)
+}
+ ::std::string* Method::mutable_request_type_url() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Method.request_type_url)
+  return request_type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Method::release_request_type_url() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Method.request_type_url)
+  
+  return request_type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Method::set_allocated_request_type_url(::std::string* request_type_url) {
+  if (request_type_url != NULL) {
+    
+  } else {
+    
+  }
+  request_type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), request_type_url);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.request_type_url)
+}
+
+// optional bool request_streaming = 3;
+void Method::clear_request_streaming() {
+  request_streaming_ = false;
+}
+ bool Method::request_streaming() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.request_streaming)
+  return request_streaming_;
+}
+ void Method::set_request_streaming(bool value) {
+  
+  request_streaming_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Method.request_streaming)
+}
+
+// optional string response_type_url = 4;
+void Method::clear_response_type_url() {
+  response_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Method::response_type_url() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.response_type_url)
+  return response_type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Method::set_response_type_url(const ::std::string& value) {
+  
+  response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Method.response_type_url)
+}
+ void Method::set_response_type_url(const char* value) {
+  
+  response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Method.response_type_url)
+}
+ void Method::set_response_type_url(const char* value, size_t size) {
+  
+  response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Method.response_type_url)
+}
+ ::std::string* Method::mutable_response_type_url() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Method.response_type_url)
+  return response_type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Method::release_response_type_url() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Method.response_type_url)
+  
+  return response_type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Method::set_allocated_response_type_url(::std::string* response_type_url) {
+  if (response_type_url != NULL) {
+    
+  } else {
+    
+  }
+  response_type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), response_type_url);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.response_type_url)
+}
+
+// optional bool response_streaming = 5;
+void Method::clear_response_streaming() {
+  response_streaming_ = false;
+}
+ bool Method::response_streaming() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.response_streaming)
+  return response_streaming_;
+}
+ void Method::set_response_streaming(bool value) {
+  
+  response_streaming_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Method.response_streaming)
+}
+
+// repeated .google.protobuf.Option options = 6;
+int Method::options_size() const {
+  return options_.size();
+}
+void Method::clear_options() {
+  options_.Clear();
+}
+const ::google::protobuf::Option& Method::options(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.options)
+  return options_.Get(index);
+}
+::google::protobuf::Option* Method::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Method.options)
+  return options_.Mutable(index);
+}
+::google::protobuf::Option* Method::add_options() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Method.options)
+  return options_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >*
+Method::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Method.options)
+  return &options_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
+Method::options() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Method.options)
+  return options_;
+}
+
+// optional .google.protobuf.Syntax syntax = 7;
+void Method::clear_syntax() {
+  syntax_ = 0;
+}
+ ::google::protobuf::Syntax Method::syntax() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Method.syntax)
+  return static_cast< ::google::protobuf::Syntax >(syntax_);
+}
+ void Method::set_syntax(::google::protobuf::Syntax value) {
+  
+  syntax_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Method.syntax)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void Mixin::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Mixin::kNameFieldNumber;
 const int Mixin::kRootFieldNumber;
@@ -1299,32 +1646,28 @@
 
 Mixin::Mixin()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixin();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Mixin)
 }
+
+void Mixin::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Mixin::Mixin(const Mixin& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
-  }
-  root_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.root().size() > 0) {
-    root_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.root_);
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Mixin)
 }
 
 void Mixin::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   root_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  _cached_size_ = 0;
 }
 
 Mixin::~Mixin() {
@@ -1335,6 +1678,8 @@
 void Mixin::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   root_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
 void Mixin::SetCachedSize(int size) const {
@@ -1343,15 +1688,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Mixin::descriptor() {
-  ::protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Mixin_descriptor_;
 }
 
 const Mixin& Mixin::default_instance() {
-  ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixin();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  return *default_instance_;
 }
 
+Mixin* Mixin::default_instance_ = NULL;
+
 Mixin* Mixin::New(::google::protobuf::Arena* arena) const {
   Mixin* n = new Mixin;
   if (arena != NULL) {
@@ -1362,13 +1709,8 @@
 
 void Mixin::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Mixin)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   root_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  _internal_metadata_.Clear();
 }
 
 bool Mixin::MergePartialFromCodedStream(
@@ -1377,49 +1719,51 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Mixin)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
+      // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Mixin.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_root;
         break;
       }
 
-      // string root = 2;
+      // optional string root = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_root:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_root()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->root().data(), static_cast<int>(this->root().length()),
+            this->root().data(), this->root().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Mixin.root"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1436,47 +1780,36 @@
 void Mixin::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Mixin)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Mixin.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->name(), output);
   }
 
-  // string root = 2;
+  // optional string root = 2;
   if (this->root().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->root().data(), static_cast<int>(this->root().length()),
+      this->root().data(), this->root().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Mixin.root");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       2, this->root(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Mixin)
 }
 
-::google::protobuf::uint8* Mixin::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Mixin::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Mixin)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Mixin.name");
     target =
@@ -1484,10 +1817,10 @@
         1, this->name(), target);
   }
 
-  // string root = 2;
+  // optional string root = 2;
   if (this->root().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->root().data(), static_cast<int>(this->root().length()),
+      this->root().data(), this->root().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Mixin.root");
     target =
@@ -1495,48 +1828,38 @@
         2, this->root(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Mixin)
   return target;
 }
 
-size_t Mixin::ByteSizeLong() const {
+int Mixin::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Mixin)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->name());
   }
 
-  // string root = 2;
+  // optional string root = 2;
   if (this->root().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->root());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Mixin::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Mixin)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Mixin* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Mixin* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Mixin>(
           &from);
   if (source == NULL) {
@@ -1550,11 +1873,7 @@
 
 void Mixin::MergeFrom(const Mixin& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Mixin)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.name().size() > 0) {
 
     name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
@@ -1580,6 +1899,7 @@
 }
 
 bool Mixin::IsInitialized() const {
+
   return true;
 }
 
@@ -1588,20 +1908,115 @@
   InternalSwap(other);
 }
 void Mixin::InternalSwap(Mixin* other) {
-  using std::swap;
   name_.Swap(&other->name_);
   root_.Swap(&other->root_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Mixin::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Mixin_descriptor_;
+  metadata.reflection = Mixin_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Mixin
+
+// optional string name = 1;
+void Mixin::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Mixin::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Mixin.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Mixin::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Mixin.name)
+}
+ void Mixin::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Mixin.name)
+}
+ void Mixin::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Mixin.name)
+}
+ ::std::string* Mixin::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Mixin.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Mixin::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Mixin.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Mixin::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    
+  } else {
+    
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Mixin.name)
+}
+
+// optional string root = 2;
+void Mixin::clear_root() {
+  root_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Mixin::root() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Mixin.root)
+  return root_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Mixin::set_root(const ::std::string& value) {
+  
+  root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Mixin.root)
+}
+ void Mixin::set_root(const char* value) {
+  
+  root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Mixin.root)
+}
+ void Mixin::set_root(const char* value, size_t size) {
+  
+  root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Mixin.root)
+}
+ ::std::string* Mixin::mutable_root() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Mixin.root)
+  return root_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Mixin::release_root() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Mixin.root)
+  
+  return root_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Mixin::set_allocated_root(::std::string* root) {
+  if (root != NULL) {
+    
+  } else {
+    
+  }
+  root_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), root);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Mixin.root)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/api.pb.h b/src/google/protobuf/api.pb.h
index 96ff3f1..bb35e47 100644
--- a/src/google/protobuf/api.pb.h
+++ b/src/google/protobuf/api.pb.h
@@ -8,73 +8,44 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/source_context.pb.h>
 #include <google/protobuf/type.pb.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fapi_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[3];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsApiImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsApi();
-void LIBPROTOBUF_EXPORT InitDefaultsMethodImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsMethod();
-void LIBPROTOBUF_EXPORT InitDefaultsMixinImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsMixin();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsApi();
-  InitDefaultsMethod();
-  InitDefaultsMixin();
-}
-}  // namespace protobuf_google_2fprotobuf_2fapi_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fapi_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto();
+
 class Api;
-class ApiDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern ApiDefaultTypeInternal _Api_default_instance_;
 class Method;
-class MethodDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern MethodDefaultTypeInternal _Method_default_instance_;
 class Mixin;
-class MixinDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern MixinDefaultTypeInternal _Mixin_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT Api : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Api) */ {
+class LIBPROTOBUF_EXPORT Api : public ::google::protobuf::Message {
  public:
   Api();
   virtual ~Api();
@@ -85,77 +56,62 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Api(Api&& from) noexcept
-    : Api() {
-    *this = ::std::move(from);
-  }
 
-  inline Api& operator=(Api&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   static const ::google::protobuf::Descriptor* descriptor();
   static const Api& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Api* internal_default_instance() {
-    return reinterpret_cast<const Api*>(
-               &_Api_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   void Swap(Api* other);
-  friend void swap(Api& a, Api& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Api* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Api* New() const { return New(NULL); }
 
-  Api* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Api* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Api& from);
   void MergeFrom(const Api& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Api* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
   // repeated .google.protobuf.Method methods = 2;
   int methods_size() const;
   void clear_methods();
@@ -180,6 +136,26 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
       options() const;
 
+  // optional string version = 4;
+  void clear_version();
+  static const int kVersionFieldNumber = 4;
+  const ::std::string& version() const;
+  void set_version(const ::std::string& value);
+  void set_version(const char* value);
+  void set_version(const char* value, size_t size);
+  ::std::string* mutable_version();
+  ::std::string* release_version();
+  void set_allocated_version(::std::string* version);
+
+  // optional .google.protobuf.SourceContext source_context = 5;
+  bool has_source_context() const;
+  void clear_source_context();
+  static const int kSourceContextFieldNumber = 5;
+  const ::google::protobuf::SourceContext& source_context() const;
+  ::google::protobuf::SourceContext* mutable_source_context();
+  ::google::protobuf::SourceContext* release_source_context();
+  void set_allocated_source_context(::google::protobuf::SourceContext* source_context);
+
   // repeated .google.protobuf.Mixin mixins = 6;
   int mixins_size() const;
   void clear_mixins();
@@ -192,44 +168,7 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >&
       mixins() const;
 
-  // string name = 1;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-
-  // string version = 4;
-  void clear_version();
-  static const int kVersionFieldNumber = 4;
-  const ::std::string& version() const;
-  void set_version(const ::std::string& value);
-  #if LANG_CXX11
-  void set_version(::std::string&& value);
-  #endif
-  void set_version(const char* value);
-  void set_version(const char* value, size_t size);
-  ::std::string* mutable_version();
-  ::std::string* release_version();
-  void set_allocated_version(::std::string* version);
-
-  // .google.protobuf.SourceContext source_context = 5;
-  bool has_source_context() const;
-  void clear_source_context();
-  static const int kSourceContextFieldNumber = 5;
-  const ::google::protobuf::SourceContext& source_context() const;
-  ::google::protobuf::SourceContext* release_source_context();
-  ::google::protobuf::SourceContext* mutable_source_context();
-  void set_allocated_source_context(::google::protobuf::SourceContext* source_context);
-
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   void clear_syntax();
   static const int kSyntaxFieldNumber = 7;
   ::google::protobuf::Syntax syntax() const;
@@ -239,20 +178,25 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  bool _is_default_instance_;
+  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method > methods_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin > mixins_;
-  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::internal::ArenaStringPtr version_;
   ::google::protobuf::SourceContext* source_context_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin > mixins_;
   int syntax_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fapi_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsApiImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fapi_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto();
+
+  void InitAsDefaultInstance();
+  static Api* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Method : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Method) */ {
+class LIBPROTOBUF_EXPORT Method : public ::google::protobuf::Message {
  public:
   Method();
   virtual ~Method();
@@ -263,77 +207,96 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Method(Method&& from) noexcept
-    : Method() {
-    *this = ::std::move(from);
-  }
 
-  inline Method& operator=(Method&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   static const ::google::protobuf::Descriptor* descriptor();
   static const Method& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Method* internal_default_instance() {
-    return reinterpret_cast<const Method*>(
-               &_Method_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    1;
-
   void Swap(Method* other);
-  friend void swap(Method& a, Method& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Method* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Method* New() const { return New(NULL); }
 
-  Method* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Method* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Method& from);
   void MergeFrom(const Method& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Method* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
+  // optional string request_type_url = 2;
+  void clear_request_type_url();
+  static const int kRequestTypeUrlFieldNumber = 2;
+  const ::std::string& request_type_url() const;
+  void set_request_type_url(const ::std::string& value);
+  void set_request_type_url(const char* value);
+  void set_request_type_url(const char* value, size_t size);
+  ::std::string* mutable_request_type_url();
+  ::std::string* release_request_type_url();
+  void set_allocated_request_type_url(::std::string* request_type_url);
+
+  // optional bool request_streaming = 3;
+  void clear_request_streaming();
+  static const int kRequestStreamingFieldNumber = 3;
+  bool request_streaming() const;
+  void set_request_streaming(bool value);
+
+  // optional string response_type_url = 4;
+  void clear_response_type_url();
+  static const int kResponseTypeUrlFieldNumber = 4;
+  const ::std::string& response_type_url() const;
+  void set_response_type_url(const ::std::string& value);
+  void set_response_type_url(const char* value);
+  void set_response_type_url(const char* value, size_t size);
+  ::std::string* mutable_response_type_url();
+  ::std::string* release_response_type_url();
+  void set_allocated_response_type_url(::std::string* response_type_url);
+
+  // optional bool response_streaming = 5;
+  void clear_response_streaming();
+  static const int kResponseStreamingFieldNumber = 5;
+  bool response_streaming() const;
+  void set_response_streaming(bool value);
+
   // repeated .google.protobuf.Option options = 6;
   int options_size() const;
   void clear_options();
@@ -346,61 +309,7 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
       options() const;
 
-  // string name = 1;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-
-  // string request_type_url = 2;
-  void clear_request_type_url();
-  static const int kRequestTypeUrlFieldNumber = 2;
-  const ::std::string& request_type_url() const;
-  void set_request_type_url(const ::std::string& value);
-  #if LANG_CXX11
-  void set_request_type_url(::std::string&& value);
-  #endif
-  void set_request_type_url(const char* value);
-  void set_request_type_url(const char* value, size_t size);
-  ::std::string* mutable_request_type_url();
-  ::std::string* release_request_type_url();
-  void set_allocated_request_type_url(::std::string* request_type_url);
-
-  // string response_type_url = 4;
-  void clear_response_type_url();
-  static const int kResponseTypeUrlFieldNumber = 4;
-  const ::std::string& response_type_url() const;
-  void set_response_type_url(const ::std::string& value);
-  #if LANG_CXX11
-  void set_response_type_url(::std::string&& value);
-  #endif
-  void set_response_type_url(const char* value);
-  void set_response_type_url(const char* value, size_t size);
-  ::std::string* mutable_response_type_url();
-  ::std::string* release_response_type_url();
-  void set_allocated_response_type_url(::std::string* response_type_url);
-
-  // bool request_streaming = 3;
-  void clear_request_streaming();
-  static const int kRequestStreamingFieldNumber = 3;
-  bool request_streaming() const;
-  void set_request_streaming(bool value);
-
-  // bool response_streaming = 5;
-  void clear_response_streaming();
-  static const int kResponseStreamingFieldNumber = 5;
-  bool response_streaming() const;
-  void set_response_streaming(bool value);
-
-  // .google.protobuf.Syntax syntax = 7;
+  // optional .google.protobuf.Syntax syntax = 7;
   void clear_syntax();
   static const int kSyntaxFieldNumber = 7;
   ::google::protobuf::Syntax syntax() const;
@@ -410,20 +319,25 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::internal::ArenaStringPtr request_type_url_;
   ::google::protobuf::internal::ArenaStringPtr response_type_url_;
   bool request_streaming_;
   bool response_streaming_;
   int syntax_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fapi_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethodImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fapi_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto();
+
+  void InitAsDefaultInstance();
+  static Method* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Mixin : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Mixin) */ {
+class LIBPROTOBUF_EXPORT Mixin : public ::google::protobuf::Message {
  public:
   Mixin();
   virtual ~Mixin();
@@ -434,99 +348,67 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Mixin(Mixin&& from) noexcept
-    : Mixin() {
-    *this = ::std::move(from);
-  }
 
-  inline Mixin& operator=(Mixin&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   static const ::google::protobuf::Descriptor* descriptor();
   static const Mixin& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Mixin* internal_default_instance() {
-    return reinterpret_cast<const Mixin*>(
-               &_Mixin_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    2;
-
   void Swap(Mixin* other);
-  friend void swap(Mixin& a, Mixin& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Mixin* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Mixin* New() const { return New(NULL); }
 
-  Mixin* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Mixin* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Mixin& from);
   void MergeFrom(const Mixin& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Mixin* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // string name = 1;
+  // optional string name = 1;
   void clear_name();
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
   ::std::string* release_name();
   void set_allocated_name(::std::string* name);
 
-  // string root = 2;
+  // optional string root = 2;
   void clear_root();
   static const int kRootFieldNumber = 2;
   const ::std::string& root() const;
   void set_root(const ::std::string& value);
-  #if LANG_CXX11
-  void set_root(::std::string&& value);
-  #endif
   void set_root(const char* value);
   void set_root(const char* value, size_t size);
   ::std::string* mutable_root();
@@ -537,46 +419,39 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::internal::ArenaStringPtr root_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fapi_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixinImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fapi_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fapi_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto();
+
+  void InitAsDefaultInstance();
+  static Mixin* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Api
 
-// string name = 1;
+// optional string name = 1;
 inline void Api::clear_name() {
   name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Api::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Api.name)
-  return name_.GetNoArena();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Api::set_name(const ::std::string& value) {
   
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Api.name)
 }
-#if LANG_CXX11
-inline void Api::set_name(::std::string&& value) {
-  
-  name_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Api.name)
-}
-#endif
 inline void Api::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Api.name)
@@ -641,6 +516,9 @@
 inline int Api::options_size() const {
   return options_.size();
 }
+inline void Api::clear_options() {
+  options_.Clear();
+}
 inline const ::google::protobuf::Option& Api::options(int index) const {
   // @@protoc_insertion_point(field_get:google.protobuf.Api.options)
   return options_.Get(index);
@@ -664,29 +542,20 @@
   return options_;
 }
 
-// string version = 4;
+// optional string version = 4;
 inline void Api::clear_version() {
   version_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Api::version() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Api.version)
-  return version_.GetNoArena();
+  return version_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Api::set_version(const ::std::string& value) {
   
   version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Api.version)
 }
-#if LANG_CXX11
-inline void Api::set_version(::std::string&& value) {
-  
-  version_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Api.version)
-}
-#endif
 inline void Api::set_version(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Api.version)
@@ -717,22 +586,17 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.version)
 }
 
-// .google.protobuf.SourceContext source_context = 5;
+// optional .google.protobuf.SourceContext source_context = 5;
 inline bool Api::has_source_context() const {
-  return this != internal_default_instance() && source_context_ != NULL;
+  return !_is_default_instance_ && source_context_ != NULL;
+}
+inline void Api::clear_source_context() {
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
 }
 inline const ::google::protobuf::SourceContext& Api::source_context() const {
-  const ::google::protobuf::SourceContext* p = source_context_;
   // @@protoc_insertion_point(field_get:google.protobuf.Api.source_context)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::SourceContext*>(
-      &::google::protobuf::_SourceContext_default_instance_);
-}
-inline ::google::protobuf::SourceContext* Api::release_source_context() {
-  // @@protoc_insertion_point(field_release:google.protobuf.Api.source_context)
-  
-  ::google::protobuf::SourceContext* temp = source_context_;
-  source_context_ = NULL;
-  return temp;
+  return source_context_ != NULL ? *source_context_ : *default_instance_->source_context_;
 }
 inline ::google::protobuf::SourceContext* Api::mutable_source_context() {
   
@@ -742,22 +606,21 @@
   // @@protoc_insertion_point(field_mutable:google.protobuf.Api.source_context)
   return source_context_;
 }
+inline ::google::protobuf::SourceContext* Api::release_source_context() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Api.source_context)
+  
+  ::google::protobuf::SourceContext* temp = source_context_;
+  source_context_ = NULL;
+  return temp;
+}
 inline void Api::set_allocated_source_context(::google::protobuf::SourceContext* source_context) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete reinterpret_cast< ::google::protobuf::MessageLite*>(source_context_);
-  }
+  delete source_context_;
+  source_context_ = source_context;
   if (source_context) {
-    ::google::protobuf::Arena* submessage_arena = NULL;
-    if (message_arena != submessage_arena) {
-      source_context = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, source_context, submessage_arena);
-    }
     
   } else {
     
   }
-  source_context_ = source_context;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.source_context)
 }
 
@@ -791,7 +654,7 @@
   return mixins_;
 }
 
-// .google.protobuf.Syntax syntax = 7;
+// optional .google.protobuf.Syntax syntax = 7;
 inline void Api::clear_syntax() {
   syntax_ = 0;
 }
@@ -809,29 +672,20 @@
 
 // Method
 
-// string name = 1;
+// optional string name = 1;
 inline void Method::clear_name() {
   name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Method::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Method.name)
-  return name_.GetNoArena();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Method::set_name(const ::std::string& value) {
   
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Method.name)
 }
-#if LANG_CXX11
-inline void Method::set_name(::std::string&& value) {
-  
-  name_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Method.name)
-}
-#endif
 inline void Method::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Method.name)
@@ -862,29 +716,20 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.name)
 }
 
-// string request_type_url = 2;
+// optional string request_type_url = 2;
 inline void Method::clear_request_type_url() {
   request_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Method::request_type_url() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Method.request_type_url)
-  return request_type_url_.GetNoArena();
+  return request_type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Method::set_request_type_url(const ::std::string& value) {
   
   request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Method.request_type_url)
 }
-#if LANG_CXX11
-inline void Method::set_request_type_url(::std::string&& value) {
-  
-  request_type_url_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Method.request_type_url)
-}
-#endif
 inline void Method::set_request_type_url(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Method.request_type_url)
@@ -915,7 +760,7 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.request_type_url)
 }
 
-// bool request_streaming = 3;
+// optional bool request_streaming = 3;
 inline void Method::clear_request_streaming() {
   request_streaming_ = false;
 }
@@ -929,29 +774,20 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Method.request_streaming)
 }
 
-// string response_type_url = 4;
+// optional string response_type_url = 4;
 inline void Method::clear_response_type_url() {
   response_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Method::response_type_url() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Method.response_type_url)
-  return response_type_url_.GetNoArena();
+  return response_type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Method::set_response_type_url(const ::std::string& value) {
   
   response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Method.response_type_url)
 }
-#if LANG_CXX11
-inline void Method::set_response_type_url(::std::string&& value) {
-  
-  response_type_url_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Method.response_type_url)
-}
-#endif
 inline void Method::set_response_type_url(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Method.response_type_url)
@@ -982,7 +818,7 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.response_type_url)
 }
 
-// bool response_streaming = 5;
+// optional bool response_streaming = 5;
 inline void Method::clear_response_streaming() {
   response_streaming_ = false;
 }
@@ -1000,6 +836,9 @@
 inline int Method::options_size() const {
   return options_.size();
 }
+inline void Method::clear_options() {
+  options_.Clear();
+}
 inline const ::google::protobuf::Option& Method::options(int index) const {
   // @@protoc_insertion_point(field_get:google.protobuf.Method.options)
   return options_.Get(index);
@@ -1023,7 +862,7 @@
   return options_;
 }
 
-// .google.protobuf.Syntax syntax = 7;
+// optional .google.protobuf.Syntax syntax = 7;
 inline void Method::clear_syntax() {
   syntax_ = 0;
 }
@@ -1041,29 +880,20 @@
 
 // Mixin
 
-// string name = 1;
+// optional string name = 1;
 inline void Mixin::clear_name() {
   name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Mixin::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Mixin.name)
-  return name_.GetNoArena();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Mixin::set_name(const ::std::string& value) {
   
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Mixin.name)
 }
-#if LANG_CXX11
-inline void Mixin::set_name(::std::string&& value) {
-  
-  name_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Mixin.name)
-}
-#endif
 inline void Mixin::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Mixin.name)
@@ -1094,29 +924,20 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Mixin.name)
 }
 
-// string root = 2;
+// optional string root = 2;
 inline void Mixin::clear_root() {
   root_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Mixin::root() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Mixin.root)
-  return root_.GetNoArena();
+  return root_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Mixin::set_root(const ::std::string& value) {
   
   root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Mixin.root)
 }
-#if LANG_CXX11
-inline void Mixin::set_root(::std::string&& value) {
-  
-  root_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Mixin.root)
-}
-#endif
 inline void Mixin::set_root(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Mixin.root)
@@ -1147,9 +968,7 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Mixin.root)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 // -------------------------------------------------------------------
 
 // -------------------------------------------------------------------
diff --git a/src/google/protobuf/api.proto b/src/google/protobuf/api.proto
index f37ee2f..dbe87b8 100644
--- a/src/google/protobuf/api.proto
+++ b/src/google/protobuf/api.proto
@@ -39,36 +39,29 @@
 option java_package = "com.google.protobuf";
 option java_outer_classname = "ApiProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
-option go_package = "google.golang.org/genproto/protobuf/api;api";
 
-// Api is a light-weight descriptor for an API Interface.
-//
-// Interfaces are also described as "protocol buffer services" in some contexts,
-// such as by the "service" keyword in a .proto file, but they are different
-// from API Services, which represent a concrete implementation of an interface
-// as opposed to simply a description of methods and bindings. They are also
-// sometimes simply referred to as "APIs" in other contexts, such as the name of
-// this message itself. See https://cloud.google.com/apis/design/glossary for
-// detailed terminology.
+// Api is a light-weight descriptor for a protocol buffer service.
 message Api {
 
-  // The fully qualified name of this interface, including package name
-  // followed by the interface's simple name.
+  // The fully qualified name of this api, including package name
+  // followed by the api's simple name.
   string name = 1;
 
-  // The methods of this interface, in unspecified order.
+  // The methods of this api, in unspecified order.
   repeated Method methods = 2;
 
-  // Any metadata attached to the interface.
+  // Any metadata attached to the API.
   repeated Option options = 3;
 
-  // A version string for this interface. If specified, must have the form
-  // `major-version.minor-version`, as in `1.10`. If the minor version is
-  // omitted, it defaults to zero. If the entire version field is empty, the
-  // major version is derived from the package name, as outlined below. If the
-  // field is not empty, the version in the package name will be verified to be
-  // consistent with what is provided here.
+  // A version string for this api. If specified, must have the form
+  // `major-version.minor-version`, as in `1.10`. If the minor version
+  // is omitted, it defaults to zero. If the entire version field is
+  // empty, the major version is derived from the package name, as
+  // outlined below. If the field is not empty, the version in the
+  // package name will be verified to be consistent with what is
+  // provided here.
   //
   // The versioning schema uses [semantic
   // versioning](http://semver.org) where the major version number
@@ -78,10 +71,10 @@
   // chosen based on the product plan.
   //
   // The major version is also reflected in the package name of the
-  // interface, which must end in `v<major-version>`, as in
+  // API, which must end in `v<major-version>`, as in
   // `google.feature.v1`. For major versions 0 and 1, the suffix can
   // be omitted. Zero major versions must only be used for
-  // experimental, non-GA interfaces.
+  // experimental, none-GA apis.
   //
   //
   string version = 4;
@@ -90,14 +83,14 @@
   // message.
   SourceContext source_context = 5;
 
-  // Included interfaces. See [Mixin][].
+  // Included APIs. See [Mixin][].
   repeated Mixin mixins = 6;
 
   // The source syntax of the service.
   Syntax syntax = 7;
 }
 
-// Method represents a method of an API interface.
+// Method represents a method of an api.
 message Method {
 
   // The simple name of this method.
@@ -122,9 +115,9 @@
   Syntax syntax = 7;
 }
 
-// Declares an API Interface to be included in this interface. The including
-// interface must redeclare all the methods from the included interface, but
-// documentation and options are inherited as follows:
+// Declares an API to be included in this API. The including API must
+// redeclare all the methods from the included API, but documentation
+// and options are inherited as follows:
 //
 // - If after comment and whitespace stripping, the documentation
 //   string of the redeclared method is empty, it will be inherited
@@ -136,8 +129,7 @@
 //
 // - If an http annotation is inherited, the path pattern will be
 //   modified as follows. Any version prefix will be replaced by the
-//   version of the including interface plus the [root][] path if
-//   specified.
+//   version of the including API plus the [root][] path if specified.
 //
 // Example of a simple mixin:
 //
@@ -201,7 +193,7 @@
 //       ...
 //     }
 message Mixin {
-  // The fully qualified name of the interface which is included.
+  // The fully qualified name of the API which is included.
   string name = 1;
 
   // If non-empty specifies a path under which inherited HTTP paths
diff --git a/src/google/protobuf/arena.cc b/src/google/protobuf/arena.cc
index e928998..613e589 100755
--- a/src/google/protobuf/arena.cc
+++ b/src/google/protobuf/arena.cc
@@ -30,355 +30,291 @@
 
 #include <google/protobuf/arena.h>
 
-#include <algorithm>
-#include <limits>
-
 
 #ifdef ADDRESS_SANITIZER
 #include <sanitizer/asan_interface.h>
-#endif  // ADDRESS_SANITIZER
-
-#include <google/protobuf/stubs/port.h>
+#endif
 
 namespace google {
-static const size_t kMinCleanupListElements = 8;
-static const size_t kMaxCleanupListElements = 64;  // 1kB on 64-bit.
-
 namespace protobuf {
-namespace internal {
 
 
-google::protobuf::internal::SequenceNumber ArenaImpl::lifecycle_id_generator_;
+google::protobuf::internal::SequenceNumber Arena::lifecycle_id_generator_;
 #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
-ArenaImpl::ThreadCache& ArenaImpl::thread_cache() {
+Arena::ThreadCache& Arena::thread_cache() {
   static internal::ThreadLocalStorage<ThreadCache>* thread_cache_ =
       new internal::ThreadLocalStorage<ThreadCache>();
   return *thread_cache_->Get();
 }
 #elif defined(PROTOBUF_USE_DLLS)
-ArenaImpl::ThreadCache& ArenaImpl::thread_cache() {
+Arena::ThreadCache& Arena::thread_cache() {
   static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_ = { -1, NULL };
   return thread_cache_;
 }
 #else
-GOOGLE_THREAD_LOCAL ArenaImpl::ThreadCache ArenaImpl::thread_cache_ = {-1, NULL};
+GOOGLE_THREAD_LOCAL Arena::ThreadCache Arena::thread_cache_ = { -1, NULL };
 #endif
 
-void ArenaImpl::Init() {
+void Arena::Init() {
   lifecycle_id_ = lifecycle_id_generator_.GetNext();
-  google::protobuf::internal::NoBarrier_Store(&hint_, 0);
-  google::protobuf::internal::NoBarrier_Store(&threads_, 0);
+  blocks_ = 0;
+  hint_ = 0;
+  owns_first_block_ = true;
+  cleanup_list_ = 0;
 
-  if (initial_block_) {
+  if (options_.initial_block != NULL && options_.initial_block_size > 0) {
+    GOOGLE_CHECK_GE(options_.initial_block_size, sizeof(Block))
+        << ": Initial block size too small for header.";
+
+    // Add first unowned block to list.
+    Block* first_block = reinterpret_cast<Block*>(options_.initial_block);
+    first_block->size = options_.initial_block_size;
+    first_block->pos = kHeaderSize;
+    first_block->next = NULL;
     // Thread which calls Init() owns the first block. This allows the
-    // single-threaded case to allocate on the first block without having to
-    // perform atomic operations.
-    InitBlock(initial_block_, &thread_cache(), options_.initial_block_size);
-    ThreadInfo* info = NewThreadInfo(initial_block_);
-    info->next = NULL;
-    google::protobuf::internal::NoBarrier_Store(&threads_,
-                                  reinterpret_cast<google::protobuf::internal::AtomicWord>(info));
-    google::protobuf::internal::NoBarrier_Store(&space_allocated_,
-                                  options_.initial_block_size);
-    CacheBlock(initial_block_);
+    // single-threaded case to allocate on the first block without taking any
+    // locks.
+    first_block->owner = &thread_cache();
+    SetThreadCacheBlock(first_block);
+    AddBlockInternal(first_block);
+    owns_first_block_ = false;
+  }
+
+  // Call the initialization hook
+  if (options_.on_arena_init != NULL) {
+    hooks_cookie_ = options_.on_arena_init(this);
   } else {
-    google::protobuf::internal::NoBarrier_Store(&space_allocated_, 0);
+    hooks_cookie_ = NULL;
   }
 }
 
-ArenaImpl::~ArenaImpl() {
-  // Have to do this in a first pass, because some of the destructors might
-  // refer to memory in other blocks.
-  CleanupList();
-  FreeBlocks();
+Arena::~Arena() {
+  uint64 space_allocated = ResetInternal();
+
+  // Call the destruction hook
+  if (options_.on_arena_destruction != NULL) {
+    options_.on_arena_destruction(this, hooks_cookie_, space_allocated);
+  }
 }
 
-uint64 ArenaImpl::Reset() {
-  // Have to do this in a first pass, because some of the destructors might
-  // refer to memory in other blocks.
+uint64 Arena::Reset() {
+  // Invalidate any ThreadCaches pointing to any blocks we just destroyed.
+  lifecycle_id_ = lifecycle_id_generator_.GetNext();
+  return ResetInternal();
+}
+
+uint64 Arena::ResetInternal() {
   CleanupList();
   uint64 space_allocated = FreeBlocks();
-  Init();
+
+  // Call the reset hook
+  if (options_.on_arena_reset != NULL) {
+    options_.on_arena_reset(this, hooks_cookie_, space_allocated);
+  }
 
   return space_allocated;
 }
 
-ArenaImpl::Block* ArenaImpl::NewBlock(void* me, Block* my_last_block,
-                                      size_t min_bytes) {
+Arena::Block* Arena::NewBlock(void* me, Block* my_last_block, size_t n,
+                              size_t start_block_size, size_t max_block_size) {
   size_t size;
   if (my_last_block != NULL) {
     // Double the current block size, up to a limit.
-    size = std::min(2 * my_last_block->size, options_.max_block_size);
+    size = 2 * (my_last_block->size);
+    if (size > max_block_size) size = max_block_size;
   } else {
-    size = options_.start_block_size;
+    size = start_block_size;
   }
-  // Verify that min_bytes + kHeaderSize won't overflow.
-  GOOGLE_CHECK_LE(min_bytes, std::numeric_limits<size_t>::max() - kHeaderSize);
-  size = std::max(size, kHeaderSize + min_bytes);
+  if (n > size - kHeaderSize) {
+    // TODO(sanjay): Check if n + kHeaderSize would overflow
+    size = kHeaderSize + n;
+  }
 
   Block* b = reinterpret_cast<Block*>(options_.block_alloc(size));
-  InitBlock(b, me, size);
-  google::protobuf::internal::NoBarrier_AtomicIncrement(&space_allocated_, size);
-  return b;
-}
-
-void ArenaImpl::InitBlock(Block* b, void *me, size_t size) {
-  b->pos = kHeaderSize;
+  b->pos = kHeaderSize + n;
   b->size = size;
-  b->owner = me;
-  b->next = NULL;
+  if (b->avail() == 0) {
+    // Do not attempt to reuse this block.
+    b->owner = NULL;
+  } else {
+    b->owner = me;
+  }
 #ifdef ADDRESS_SANITIZER
   // Poison the rest of the block for ASAN. It was unpoisoned by the underlying
   // malloc but it's not yet usable until we return it as part of an allocation.
   ASAN_POISON_MEMORY_REGION(
       reinterpret_cast<char*>(b) + b->pos, b->size - b->pos);
-#endif  // ADDRESS_SANITIZER
+#endif
+  return b;
 }
 
-ArenaImpl::CleanupChunk* ArenaImpl::ExpandCleanupList(CleanupChunk* cleanup,
-                                                      Block* b) {
-  size_t size = cleanup ? cleanup->size * 2 : kMinCleanupListElements;
-  size = std::min(size, kMaxCleanupListElements);
-  size_t bytes = internal::AlignUpTo8(CleanupChunk::SizeOf(size));
-  if (b->avail() < bytes) {
-    b = GetBlock(bytes);
-  }
-  CleanupChunk* list =
-      reinterpret_cast<CleanupChunk*>(AllocFromBlock(b, bytes));
-  list->next = b->thread_info->cleanup;
-  list->size = size;
-  list->len = 0;
-  b->thread_info->cleanup = list;
-  return list;
+void Arena::AddBlock(Block* b) {
+  MutexLock l(&blocks_lock_);
+  AddBlockInternal(b);
 }
 
-inline GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-void ArenaImpl::AddCleanupInBlock(
-    Block* b, void* elem, void (*func)(void*)) {
-  CleanupChunk* cleanup = b->thread_info->cleanup;
-  if (cleanup == NULL || cleanup->len == cleanup->size) {
-    cleanup = ExpandCleanupList(cleanup, b);
+void Arena::AddBlockInternal(Block* b) {
+  b->next = reinterpret_cast<Block*>(google::protobuf::internal::NoBarrier_Load(&blocks_));
+  google::protobuf::internal::Release_Store(&blocks_, reinterpret_cast<google::protobuf::internal::AtomicWord>(b));
+  if (b->avail() != 0) {
+    // Direct future allocations to this block.
+    google::protobuf::internal::Release_Store(&hint_, reinterpret_cast<google::protobuf::internal::AtomicWord>(b));
   }
+}
 
-  CleanupNode* node = &cleanup->nodes[cleanup->len++];
-
+void Arena::AddListNode(void* elem, void (*cleanup)(void*)) {
+  Node* node = reinterpret_cast<Node*>(AllocateAligned(sizeof(Node)));
   node->elem = elem;
-  node->cleanup = func;
+  node->cleanup = cleanup;
+  node->next = reinterpret_cast<Node*>(
+      google::protobuf::internal::NoBarrier_AtomicExchange(&cleanup_list_,
+            reinterpret_cast<google::protobuf::internal::AtomicWord>(node)));
 }
 
-void ArenaImpl::AddCleanup(void* elem, void (*cleanup)(void*)) {
-  return AddCleanupInBlock(GetBlock(0), elem, cleanup);
-}
+void* Arena::AllocateAligned(const std::type_info* allocated, size_t n) {
+  // Align n to next multiple of 8 (from Hacker's Delight, Chapter 3.)
+  n = (n + 7) & -8;
 
-void* ArenaImpl::AllocateAligned(size_t n) {
-  GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n);  // Must be already aligned.
-
-  return AllocFromBlock(GetBlock(n), n);
-}
-
-void* ArenaImpl::AllocateAlignedAndAddCleanup(size_t n,
-                                              void (*cleanup)(void*)) {
-  GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n);  // Must be already aligned.
-
-  Block* b = GetBlock(n);
-  void* mem = AllocFromBlock(b, n);
-  AddCleanupInBlock(b, mem, cleanup);
-  return mem;
-}
-
-inline GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-ArenaImpl::Block* ArenaImpl::GetBlock(size_t n) {
-  Block* my_block = NULL;
+  // Monitor allocation if needed.
+  if (GOOGLE_PREDICT_FALSE(hooks_cookie_ != NULL) &&
+      options_.on_arena_allocation != NULL) {
+    options_.on_arena_allocation(allocated, n, hooks_cookie_);
+  }
 
   // If this thread already owns a block in this arena then try to use that.
   // This fast path optimizes the case where multiple threads allocate from the
   // same arena.
-  ThreadCache* tc = &thread_cache();
-  if (tc->last_lifecycle_id_seen == lifecycle_id_) {
-    my_block = tc->last_block_used_;
-    if (my_block->avail() >= n) {
-      return my_block;
+  if (thread_cache().last_lifecycle_id_seen == lifecycle_id_ &&
+      thread_cache().last_block_used_ != NULL) {
+    if (thread_cache().last_block_used_->avail() < n) {
+      return SlowAlloc(n);
     }
+    return AllocFromBlock(thread_cache().last_block_used_, n);
   }
 
   // Check whether we own the last accessed block on this arena.
   // This fast path optimizes the case where a single thread uses multiple
   // arenas.
+  void* me = &thread_cache();
   Block* b = reinterpret_cast<Block*>(google::protobuf::internal::Acquire_Load(&hint_));
-  if (b != NULL && b->owner == tc) {
-    my_block = b;
-    if (my_block->avail() >= n) {
-      return my_block;
-    }
+  if (!b || b->owner != me || b->avail() < n) {
+    return SlowAlloc(n);
   }
-  return GetBlockSlow(tc, my_block, n);
+  return AllocFromBlock(b, n);
 }
 
-inline GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-void* ArenaImpl::AllocFromBlock(Block* b, size_t n) {
-  GOOGLE_DCHECK_EQ(internal::AlignUpTo8(b->pos), b->pos);  // Must be already aligned.
-  GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n);  // Must be already aligned.
-  GOOGLE_DCHECK_GE(b->avail(), n);
+void* Arena::AllocFromBlock(Block* b, size_t n) {
   size_t p = b->pos;
   b->pos = p + n;
 #ifdef ADDRESS_SANITIZER
   ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast<char*>(b) + p, n);
-#endif  // ADDRESS_SANITIZER
+#endif
   return reinterpret_cast<char*>(b) + p;
 }
 
-ArenaImpl::Block* ArenaImpl::GetBlockSlow(void* me, Block* my_full_block,
-                                          size_t n) {
-  ThreadInfo* info =
-      my_full_block ? my_full_block->thread_info : GetThreadInfo(me, n);
-  GOOGLE_DCHECK(info != NULL);
-  Block* b = info->head;
-  if (b->avail() < n) {
-    Block* new_b = NewBlock(me, b, n);
-    new_b->thread_info = info;
-    new_b->next = b;
-    info->head = new_b;
-    b = new_b;
+void* Arena::SlowAlloc(size_t n) {
+  void* me = &thread_cache();
+  Block* b = FindBlock(me);  // Find block owned by me.
+  // See if allocation fits in my latest block.
+  if (b != NULL && b->avail() >= n) {
+    SetThreadCacheBlock(b);
+    google::protobuf::internal::NoBarrier_Store(&hint_, reinterpret_cast<google::protobuf::internal::AtomicWord>(b));
+    return AllocFromBlock(b, n);
   }
-  CacheBlock(b);
-  return b;
-}
-
-uint64 ArenaImpl::SpaceAllocated() const {
-  return google::protobuf::internal::NoBarrier_Load(&space_allocated_);
-}
-
-uint64 ArenaImpl::SpaceUsed() const {
-  ThreadInfo* info =
-      reinterpret_cast<ThreadInfo*>(google::protobuf::internal::Acquire_Load(&threads_));
-  uint64 space_used = 0;
-
-  for ( ; info; info = info->next) {
-    // Remove the overhead of the ThreadInfo itself.
-    space_used -= sizeof(ThreadInfo);
-    for (Block* b = info->head; b; b = b->next) {
-      space_used += (b->pos - kHeaderSize);
-    }
+  b = NewBlock(me, b, n, options_.start_block_size, options_.max_block_size);
+  AddBlock(b);
+  if (b->owner == me) {  // If this block can be reused (see NewBlock()).
+    SetThreadCacheBlock(b);
   }
-
-  return space_used;
+  return reinterpret_cast<char*>(b) + kHeaderSize;
 }
 
-uint64 ArenaImpl::FreeBlocks() {
+uint64 Arena::SpaceAllocated() const {
   uint64 space_allocated = 0;
-  // By omitting an Acquire barrier we ensure that any user code that doesn't
-  // properly synchronize Reset() or the destructor will throw a TSAN warning.
-  ThreadInfo* info =
-      reinterpret_cast<ThreadInfo*>(google::protobuf::internal::NoBarrier_Load(&threads_));
-
-  while (info) {
-    // This is inside the block we are freeing, so we need to read it now.
-    ThreadInfo* next_info = info->next;
-    for (Block* b = info->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);
-
-#ifdef ADDRESS_SANITIZER
-      // This memory was provided by the underlying allocator as unpoisoned, so
-      // return it in an unpoisoned state.
-      ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast<char*>(b), b->size);
-#endif  // ADDRESS_SANITIZER
-
-      if (b != initial_block_) {
-        options_.block_dealloc(b, b->size);
-      }
-
-      b = next_block;
-    }
-    info = next_info;
+  Block* b = reinterpret_cast<Block*>(google::protobuf::internal::NoBarrier_Load(&blocks_));
+  while (b != NULL) {
+    space_allocated += (b->size);
+    b = b->next;
   }
-
   return space_allocated;
 }
 
-void ArenaImpl::CleanupList() {
-  // By omitting an Acquire barrier we ensure that any user code that doesn't
-  // properly synchronize Reset() or the destructor will throw a TSAN warning.
-  ThreadInfo* info =
-      reinterpret_cast<ThreadInfo*>(google::protobuf::internal::NoBarrier_Load(&threads_));
+uint64 Arena::SpaceUsed() const {
+  uint64 space_used = 0;
+  Block* b = reinterpret_cast<Block*>(google::protobuf::internal::NoBarrier_Load(&blocks_));
+  while (b != NULL) {
+    space_used += (b->pos - kHeaderSize);
+    b = b->next;
+  }
+  return space_used;
+}
 
-  for ( ; info; info = info->next) {
-    CleanupChunk* list = info->cleanup;
-    while (list) {
-      size_t n = list->len;
-      CleanupNode* node = &list->nodes[list->len - 1];
-      for (size_t i = 0; i < n; i++, node--) {
-        node->cleanup(node->elem);
+pair<uint64, uint64> Arena::SpaceAllocatedAndUsed() const {
+  uint64 allocated = 0;
+  uint64 used = 0;
+
+  Block* b = reinterpret_cast<Block*>(google::protobuf::internal::NoBarrier_Load(&blocks_));
+  while (b != NULL) {
+    allocated += b->size;
+    used += (b->pos - kHeaderSize);
+    b = b->next;
+  }
+  return std::make_pair(allocated, used);
+}
+
+uint64 Arena::FreeBlocks() {
+  uint64 space_allocated = 0;
+  Block* b = reinterpret_cast<Block*>(google::protobuf::internal::NoBarrier_Load(&blocks_));
+  Block* first_block = NULL;
+  while (b != NULL) {
+    space_allocated += (b->size);
+    Block* next = b->next;
+    if (next != NULL) {
+      options_.block_dealloc(b, b->size);
+    } else {
+      if (owns_first_block_) {
+        options_.block_dealloc(b, b->size);
+      } else {
+        // User passed in the first block, skip free'ing the memory.
+        first_block = b;
       }
-      list = list->next;
     }
+    b = next;
   }
+  blocks_ = 0;
+  hint_ = 0;
+  if (!owns_first_block_) {
+    // Make the first block that was passed in through ArenaOptions
+    // available for reuse.
+    first_block->pos = kHeaderSize;
+    // Thread which calls Reset() owns the first block. This allows the
+    // single-threaded case to allocate on the first block without taking any
+    // locks.
+    first_block->owner = &thread_cache();
+    SetThreadCacheBlock(first_block);
+    AddBlockInternal(first_block);
+  }
+  return space_allocated;
 }
 
-ArenaImpl::ThreadInfo* ArenaImpl::NewThreadInfo(Block* b) {
-  GOOGLE_DCHECK(FindThreadInfo(b->owner) == NULL);
-  ThreadInfo* info =
-      reinterpret_cast<ThreadInfo*>(AllocFromBlock(b, sizeof(ThreadInfo)));
-  b->thread_info = info;
-  info->owner = b->owner;
-  info->head = b;
-  info->cleanup = NULL;
-  return info;
+void Arena::CleanupList() {
+  Node* head =
+      reinterpret_cast<Node*>(google::protobuf::internal::NoBarrier_Load(&cleanup_list_));
+  while (head != NULL) {
+    head->cleanup(head->elem);
+    head = head->next;
+  }
+  cleanup_list_ = 0;
 }
 
-ArenaImpl::ThreadInfo* ArenaImpl::FindThreadInfo(void* me) {
-  ThreadInfo* info =
-      reinterpret_cast<ThreadInfo*>(google::protobuf::internal::Acquire_Load(&threads_));
-  for ( ; info; info = info->next) {
-    if (info->owner == me) {
-      return info;
-    }
+Arena::Block* Arena::FindBlock(void* me) {
+  // TODO(sanjay): We might want to keep a separate list with one
+  // entry per thread.
+  Block* b = reinterpret_cast<Block*>(google::protobuf::internal::Acquire_Load(&blocks_));
+  while (b != NULL && b->owner != me) {
+    b = b->next;
   }
-
-  return NULL;
-}
-
-ArenaImpl::ThreadInfo* ArenaImpl::GetThreadInfo(void* me, size_t n) {
-  ThreadInfo* info = FindThreadInfo(me);
-
-  if (!info) {
-    // This thread doesn't have any ThreadInfo, which also means it doesn't have
-    // any blocks yet.  So we'll allocate its first block now.
-    Block* b = NewBlock(me, NULL, sizeof(ThreadInfo) + n);
-    info = NewThreadInfo(b);
-
-    google::protobuf::internal::AtomicWord head;
-    do {
-      head = google::protobuf::internal::NoBarrier_Load(&threads_);
-      info->next = reinterpret_cast<ThreadInfo*>(head);
-    } while (google::protobuf::internal::Release_CompareAndSwap(
-                 &threads_, head, reinterpret_cast<google::protobuf::internal::AtomicWord>(info)) != head);
-  }
-
-  return info;
-}
-
-}  // namespace internal
-
-void Arena::CallDestructorHooks() {
-  uint64 space_allocated = impl_.SpaceAllocated();
-  // Call the reset hook
-  if (on_arena_reset_ != NULL) {
-    on_arena_reset_(this, hooks_cookie_, space_allocated);
-  }
-
-  // Call the destruction hook
-  if (on_arena_destruction_ != NULL) {
-    on_arena_destruction_(this, hooks_cookie_, space_allocated);
-  }
-}
-
-void Arena::OnArenaAllocation(const std::type_info* allocated_type,
-                              size_t n) const {
-  if (on_arena_allocation_ != NULL) {
-    on_arena_allocation_(allocated_type, n, hooks_cookie_);
-  }
+  return b;
 }
 
 }  // namespace protobuf
diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h
index b92d2b4..b4344da 100644
--- a/src/google/protobuf/arena.h
+++ b/src/google/protobuf/arena.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// This file defines an Arena allocator for better allocation performance.
-
 #ifndef GOOGLE_PROTOBUF_ARENA_H__
 #define GOOGLE_PROTOBUF_ARENA_H__
 
@@ -37,7 +35,7 @@
 #ifdef max
 #undef max  // Visual Studio defines this macro
 #endif
-#if LANG_CXX11
+#if __cplusplus >= 201103L
 #include <google/protobuf/stubs/type_traits.h>
 #endif
 #if defined(_MSC_VER) && !_HAS_EXCEPTIONS
@@ -51,8 +49,13 @@
 #include <typeinfo>
 #endif
 
-#include <google/protobuf/arena_impl.h>
-#include <google/protobuf/stubs/port.h>
+#include <google/protobuf/stubs/atomic_sequence_num.h>
+#include <google/protobuf/stubs/atomicops.h>
+#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/logging.h>
+#include <google/protobuf/stubs/mutex.h>
+#include <google/protobuf/stubs/type_traits.h>
+
 
 namespace google {
 namespace protobuf {
@@ -61,7 +64,7 @@
 class Message;     // message.h
 
 namespace internal {
-struct ArenaStringPtr;  // arenastring.h
+class ArenaString; // arenastring.h
 class LazyField;   // lazy_field.h
 
 template<typename Type>
@@ -74,13 +77,8 @@
 template<typename T> void arena_delete_object(void* object) {
   delete reinterpret_cast<T*>(object);
 }
-inline void arena_free(void* object, size_t size) {
-#if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
-  ::operator delete(object, size);
-#else
-  (void)size;
-  ::operator delete(object);
-#endif
+inline void arena_free(void* object, size_t /* size */) {
+  free(object);
 }
 
 }  // namespace internal
@@ -117,6 +115,7 @@
   // from the arena. By default, it contains a ptr to a wrapper function that
   // calls free.
   void (*block_dealloc)(void*, size_t);
+
   // Hooks for adding external functionality such as user-specific metrics
   // collection, specific debugging abilities, etc.
   // Init hook may return a pointer to a cookie to be stored in the arena.
@@ -143,7 +142,7 @@
         max_block_size(kDefaultMaxBlockSize),
         initial_block(NULL),
         initial_block_size(0),
-        block_alloc(&::operator new),
+        block_alloc(&malloc),
         block_dealloc(&internal::arena_free),
         on_arena_init(NULL),
         on_arena_reset(NULL),
@@ -212,46 +211,30 @@
 //
 // This protocol is implemented by all arena-enabled proto2 message classes as
 // well as RepeatedPtrField.
-//
-// Do NOT subclass Arena. This class will be marked as final when C++11 is
-// enabled.
+
+#if __cplusplus >= 201103L
+class Arena final {
+#else
 class LIBPROTOBUF_EXPORT Arena {
+#endif
  public:
   // Arena constructor taking custom options. See ArenaOptions below for
   // descriptions of the options available.
-  explicit Arena(const ArenaOptions& options) : impl_(options) {
-    Init(options);
+  explicit Arena(const ArenaOptions& options) : options_(options) {
+    Init();
   }
 
-  // Block overhead.  Use this as a guide for how much to over-allocate the
-  // initial block if you want an allocation of size N to fit inside it.
-  //
-  // WARNING: if you allocate multiple objects, it is difficult to guarantee
-  // that a series of allocations will fit in the initial block, especially if
-  // Arena changes its alignment guarantees in the future!
-  static const size_t kBlockOverhead = internal::ArenaImpl::kHeaderSize;
-
   // Default constructor with sensible default options, tuned for average
   // use-cases.
-  Arena() : impl_(ArenaOptions()) { Init(ArenaOptions()); }
-
-  ~Arena() {
-    if (on_arena_reset_ != NULL || on_arena_destruction_ != NULL) {
-      CallDestructorHooks();
-    }
+  Arena() {
+    Init();
   }
 
-  void Init(const ArenaOptions& options) {
-    on_arena_allocation_ = options.on_arena_allocation;
-    on_arena_reset_ = options.on_arena_reset;
-    on_arena_destruction_ = options.on_arena_destruction;
-    // Call the initialization hook
-    if (options.on_arena_init != NULL) {
-      hooks_cookie_ = options.on_arena_init(this);
-    } else {
-      hooks_cookie_ = NULL;
-    }
-  }
+  // Destructor deletes all owned heap allocated objects, and destructs objects
+  // that have non-trivial destructors, except for proto2 message objects whose
+  // destructors can be skipped. Also, frees all blocks except the initial block
+  // if it was passed in.
+  ~Arena();
 
   // API to create proto2 message objects on the arena. If the arena passed in
   // is NULL, then a heap allocated object is returned. Type T must be a message
@@ -263,68 +246,40 @@
   //
   // This function also accepts any type T that satisfies the arena message
   // allocation protocol, documented above.
-#if LANG_CXX11
-  template <typename T, typename... Args>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessage(
-      ::google::protobuf::Arena* arena, Args&&... args) {
-    static_assert(
-        InternalHelper<T>::is_arena_constructable::value,
-        "CreateMessage can only construct types that are ArenaConstructable");
-    if (arena == NULL) {
-      return new T(NULL, std::forward<Args>(args)...);
-    } else {
-      return arena->CreateMessageInternal<T>(std::forward<Args>(args)...);
-    }
-  }
-#endif
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* CreateMessage(::google::protobuf::Arena* arena) {
-#if LANG_CXX11
-    static_assert(
-        InternalHelper<T>::is_arena_constructable::value,
-        "CreateMessage can only construct types that are ArenaConstructable");
-#endif
     if (arena == NULL) {
       return new T;
     } else {
-      return arena->CreateMessageInternal<T>();
+      return arena->CreateMessageInternal<T>(static_cast<T*>(0));
     }
   }
 
   // One-argument form of CreateMessage. This is useful for constructing objects
   // that implement the arena message construction protocol described above but
   // take additional constructor arguments.
-  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T, typename Arg> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* CreateMessage(::google::protobuf::Arena* arena, const Arg& arg) {
-#if LANG_CXX11
-    static_assert(
-        InternalHelper<T>::is_arena_constructable::value,
-        "CreateMessage can only construct types that are ArenaConstructable");
-#endif
     if (arena == NULL) {
       return new T(NULL, arg);
     } else {
-      return arena->CreateMessageInternal<T>(arg);
+      return arena->CreateMessageInternal<T>(static_cast<T*>(0),
+                                             arg);
     }
   }
 
   // Two-argument form of CreateMessage. This is useful for constructing objects
   // that implement the arena message construction protocol described above but
   // take additional constructor arguments.
-  template <typename T, typename Arg1, typename Arg2>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T, typename Arg1, typename Arg2> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* CreateMessage(::google::protobuf::Arena* arena,
                           const Arg1& arg1,
                           const Arg2& arg2) {
-#if LANG_CXX11
-    static_assert(
-        InternalHelper<T>::is_arena_constructable::value,
-        "CreateMessage can only construct types that are ArenaConstructable");
-#endif
     if (arena == NULL) {
       return new T(NULL, arg1, arg2);
     } else {
-      return arena->CreateMessageInternal<T>(arg1, arg2);
+      return arena->CreateMessageInternal<T>(static_cast<T*>(0),
+                                             arg1, arg2);
     }
   }
 
@@ -343,19 +298,7 @@
   // (unless the destructor is trivial). Hence, from T's point of view, it is as
   // if the object were allocated on the heap (except that the underlying memory
   // is obtained from the arena).
-#if LANG_CXX11
-  template <typename T, typename... Args>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena, Args&&... args) {
-    if (arena == NULL) {
-      return new T(std::forward<Args>(args)...);
-    } else {
-      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
-                                      std::forward<Args>(args)...);
-    }
-  }
-#endif
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* Create(::google::protobuf::Arena* arena) {
     if (arena == NULL) {
       return new T();
@@ -365,7 +308,7 @@
   }
 
   // Version of the above with one constructor argument for the created object.
-  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T, typename Arg> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* Create(::google::protobuf::Arena* arena, const Arg& arg) {
     if (arena == NULL) {
       return new T(arg);
@@ -376,8 +319,7 @@
   }
 
   // Version of the above with two constructor arguments for the created object.
-  template <typename T, typename Arg1, typename Arg2>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T, typename Arg1, typename Arg2> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2) {
     if (arena == NULL) {
       return new T(arg1, arg2);
@@ -390,11 +332,9 @@
   // Version of the above with three constructor arguments for the created
   // object.
   template <typename T, typename Arg1, typename Arg2, typename Arg3>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena,
-                   const Arg1& arg1,
-                   const Arg2& arg2,
-                   const Arg3& arg3) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena,
+                                           const Arg1& arg1, const Arg2& arg2,
+                                           const Arg3& arg3) {
     if (arena == NULL) {
       return new T(arg1, arg2, arg3);
     } else {
@@ -407,10 +347,9 @@
   // object.
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena,
-                   const Arg1& arg1, const Arg2& arg2,
-                   const Arg3& arg3, const Arg4& arg4) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena,
+                                           const Arg1& arg1, const Arg2& arg2,
+                                           const Arg3& arg3, const Arg4& arg4) {
     if (arena == NULL) {
       return new T(arg1, arg2, arg3, arg4);
     } else {
@@ -423,11 +362,10 @@
   // object.
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena,
-                   const Arg1& arg1, const Arg2& arg2,
-                   const Arg3& arg3, const Arg4& arg4,
-                   const Arg5& arg5) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena,
+                                           const Arg1& arg1, const Arg2& arg2,
+                                           const Arg3& arg3, const Arg4& arg4,
+                                           const Arg5& arg5) {
     if (arena == NULL) {
       return new T(arg1, arg2, arg3, arg4, arg5);
     } else {
@@ -440,11 +378,10 @@
   // object.
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5, typename Arg6>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena,
-                   const Arg1& arg1, const Arg2& arg2,
-                   const Arg3& arg3, const Arg4& arg4,
-                   const Arg5& arg5, const Arg6& arg6) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena,
+                                           const Arg1& arg1, const Arg2& arg2,
+                                           const Arg3& arg3, const Arg4& arg4,
+                                           const Arg5& arg5, const Arg6& arg6) {
     if (arena == NULL) {
       return new T(arg1, arg2, arg3, arg4, arg5, arg6);
     } else {
@@ -457,12 +394,11 @@
   // object.
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5, typename Arg6, typename Arg7>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena,
-                   const Arg1& arg1, const Arg2& arg2,
-                   const Arg3& arg3, const Arg4& arg4,
-                   const Arg5& arg5, const Arg6& arg6,
-                   const Arg7& arg7) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena,
+                                           const Arg1& arg1, const Arg2& arg2,
+                                           const Arg3& arg3, const Arg4& arg4,
+                                           const Arg5& arg5, const Arg6& arg6,
+                                           const Arg7& arg7) {
     if (arena == NULL) {
       return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
     } else {
@@ -476,12 +412,11 @@
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5, typename Arg6, typename Arg7,
             typename Arg8>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* Create(::google::protobuf::Arena* arena,
-                   const Arg1& arg1, const Arg2& arg2,
-                   const Arg3& arg3, const Arg4& arg4,
-                   const Arg5& arg5, const Arg6& arg6,
-                   const Arg7& arg7, const Arg8& arg8) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena,
+                                           const Arg1& arg1, const Arg2& arg2,
+                                           const Arg3& arg3, const Arg4& arg4,
+                                           const Arg5& arg5, const Arg6& arg6,
+                                           const Arg7& arg7, const Arg8& arg8) {
     if (arena == NULL) {
       return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
     } else {
@@ -497,7 +432,7 @@
   // To ensure safe uses, this function checks at compile time
   // (when compiled as C++11) that T is trivially default-constructible and
   // trivially destructible.
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static T* CreateArray(::google::protobuf::Arena* arena, size_t num_elements) {
     GOOGLE_CHECK_LE(num_elements,
              std::numeric_limits<size_t>::max() / sizeof(T))
@@ -509,39 +444,28 @@
     }
   }
 
-  // Returns the total space allocated by the arena, which is the sum of the
-  // sizes of the underlying blocks. This method is relatively fast; a counter
-  // is kept as blocks are allocated.
-  uint64 SpaceAllocated() const { return impl_.SpaceAllocated(); }
-  // Returns the total space used by the arena. Similar to SpaceAllocated but
-  // does not include free space and block overhead. The total space returned
-  // may not include space used by other threads executing concurrently with
-  // the call to this method.
-  uint64 SpaceUsed() const { return impl_.SpaceUsed(); }
-  // DEPRECATED. Please use SpaceAllocated() and SpaceUsed().
-  //
+  // Returns the total space used by the arena, which is the sums of the sizes
+  // of the underlying blocks. The total space used may not include the new
+  // blocks that are allocated by this arena from other threads concurrently
+  // with the call to this method.
+  GOOGLE_ATTRIBUTE_NOINLINE uint64 SpaceAllocated() const;
+  // As above, but does not include any free space in underlying blocks.
+  GOOGLE_ATTRIBUTE_NOINLINE uint64 SpaceUsed() const;
+
   // Combines SpaceAllocated and SpaceUsed. Returns a pair of
   // <space_allocated, space_used>.
-  std::pair<uint64, uint64> SpaceAllocatedAndUsed() const {
-    return std::make_pair(SpaceAllocated(), SpaceUsed());
-  }
+  GOOGLE_ATTRIBUTE_NOINLINE pair<uint64, uint64> SpaceAllocatedAndUsed() const;
 
   // Frees all storage allocated by this arena after calling destructors
   // registered with OwnDestructor() and freeing objects registered with Own().
   // Any objects allocated on this arena are unusable after this call. It also
   // returns the total space used by the arena which is the sums of the sizes
   // of the allocated blocks. This method is not thread-safe.
-  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE uint64 Reset() {
-    // Call the reset hook
-    if (on_arena_reset_ != NULL) {
-      on_arena_reset_(this, hooks_cookie_, impl_.SpaceAllocated());
-    }
-    return impl_.Reset();
-  }
+  GOOGLE_ATTRIBUTE_NOINLINE uint64 Reset();
 
   // Adds |object| to a list of heap-allocated objects to be freed with |delete|
   // when the arena is destroyed or reset.
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+  template <typename T> GOOGLE_ATTRIBUTE_NOINLINE
   void Own(T* object) {
     OwnInternal(object, google::protobuf::internal::is_convertible<T*, ::google::protobuf::Message*>());
   }
@@ -551,10 +475,10 @@
   // that it does not free the underlying memory with |delete|; hence, it is
   // normally only used for objects that are placement-newed into
   // arena-allocated memory.
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+  template <typename T> GOOGLE_ATTRIBUTE_NOINLINE
   void OwnDestructor(T* object) {
     if (object != NULL) {
-      impl_.AddCleanup(object, &internal::arena_destruct_object<T>);
+      AddListNode(object, &internal::arena_destruct_object<T>);
     }
   }
 
@@ -562,70 +486,30 @@
   // 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.
-  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void OwnCustomDestructor(
-      void* object, void (*destruct)(void*)) {
-    impl_.AddCleanup(object, destruct);
+  GOOGLE_ATTRIBUTE_NOINLINE void OwnCustomDestructor(void* object,
+                                              void (*destruct)(void*)) {
+    AddListNode(object, destruct);
   }
 
   // Retrieves the arena associated with |value| if |value| is an arena-capable
   // message, or NULL otherwise. This differs from value->GetArena() in that the
   // latter is a virtual call, while this method is a templated call that
   // resolves at compile-time.
-  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static ::google::protobuf::Arena* GetArena(const T* value) {
-    return GetArenaInternal(value, is_arena_constructable<T>());
+    return GetArenaInternal(value, static_cast<T*>(0));
   }
 
-  template <typename T>
-  class InternalHelper {
-    template <typename U>
-    static char DestructorSkippable(const typename U::DestructorSkippable_*);
-    template <typename U>
-    static double DestructorSkippable(...);
-
-    typedef google::protobuf::internal::integral_constant<
-        bool, sizeof(DestructorSkippable<T>(static_cast<const T*>(0))) ==
-                      sizeof(char) ||
-                  google::protobuf::internal::has_trivial_destructor<T>::value>
-        is_destructor_skippable;
-
+ private:
+  struct InternalIsArenaConstructableHelper {
     template<typename U>
     static char ArenaConstructable(
         const typename U::InternalArenaConstructable_*);
     template<typename U>
     static double ArenaConstructable(...);
-
-    typedef google::protobuf::internal::integral_constant<bool, sizeof(ArenaConstructable<T>(
-                                              static_cast<const T*>(0))) ==
-                                              sizeof(char)>
-        is_arena_constructable;
-
-#if LANG_CXX11
-    template <typename... Args>
-    static T* Construct(void* ptr, Args&&... args) {
-      return new (ptr) T(std::forward<Args>(args)...);
-    }
-#else
-    template <typename Arg1>
-    static T* Construct(void* ptr, const Arg1& arg1) {
-      return new (ptr) T(arg1);
-    }
-    template <typename Arg1, typename Arg2>
-    static T* Construct(void* ptr, const Arg1& arg1, const Arg2& arg2) {
-      return new (ptr) T(arg1, arg2);
-    }
-    template <typename Arg1, typename Arg2, typename Arg3>
-    static T* Construct(void* ptr, const Arg1& arg1,
-                        const Arg2& arg2, const Arg3& arg3) {
-      return new (ptr) T(arg1, arg2, arg3);
-    }
-#endif  // LANG_CXX11
-
-    static Arena* GetArena(const T* p) { return p->GetArenaNoVirtual(); }
-
-    friend class Arena;
   };
 
+ public:
   // Helper typetrait that indicates support for arenas in a type T at compile
   // time. This is public only to allow construction of higher-level templated
   // utilities. is_arena_constructable<T>::value is true if the message type T
@@ -634,202 +518,268 @@
   // This is inside Arena because only Arena has the friend relationships
   // necessary to see the underlying generated code traits.
   template <typename T>
-  struct is_arena_constructable : InternalHelper<T>::is_arena_constructable {};
+  struct is_arena_constructable
+      : public google::protobuf::internal::integral_constant<
+            bool, sizeof(InternalIsArenaConstructableHelper::ArenaConstructable<
+                         const T>(static_cast<const T*>(0))) == sizeof(char)> {
+  };
 
  private:
-  void CallDestructorHooks();
-  void OnArenaAllocation(const std::type_info* allocated_type, size_t n) const;
-  inline void AllocHook(const std::type_info* allocated_type, size_t n) const {
-    if (GOOGLE_PREDICT_FALSE(hooks_cookie_ != NULL)) {
-      OnArenaAllocation(allocated_type, n);
-    }
+  // Blocks are variable length malloc-ed objects.  The following structure
+  // describes the common header for all blocks.
+  struct Block {
+    void* owner;   // &ThreadCache of thread that owns this block, or
+                   // &this->owner if not yet owned by a thread.
+    Block* next;   // Next block in arena (may have different owner)
+    // ((char*) &block) + pos is next available byte. It is always
+    // aligned at a multiple of 8 bytes.
+    size_t pos;
+    size_t size;  // total size of the block.
+    GOOGLE_ATTRIBUTE_ALWAYS_INLINE size_t avail() const { return size - pos; }
+    // data follows
+  };
+
+  template<typename Type> friend class ::google::protobuf::internal::GenericTypeHandler;
+  friend class MockArena;              // For unit-testing.
+  friend class internal::ArenaString;  // For AllocateAligned.
+  friend class internal::LazyField;    // For CreateMaybeMessage.
+
+  struct ThreadCache {
+    // The ThreadCache is considered valid as long as this matches the
+    // lifecycle_id of the arena being used.
+    int64 last_lifecycle_id_seen;
+    Block* last_block_used_;
+  };
+
+  static const size_t kHeaderSize = sizeof(Block);
+  static google::protobuf::internal::SequenceNumber 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.
+  // iOS also does not support the GOOGLE_THREAD_LOCAL keyword.
+  static ThreadCache& thread_cache();
+#elif defined(PROTOBUF_USE_DLLS)
+  // Thread local variables cannot be exposed through DLL interface but we can
+  // wrap them in static functions.
+  static ThreadCache& thread_cache();
+#else
+  static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_;
+  static ThreadCache& thread_cache() { return thread_cache_; }
+#endif
+
+  // SFINAE for skipping addition to delete list for a message type when created
+  // with CreateMessage. This is mainly to skip proto2/proto1 message objects
+  // with cc_enable_arenas=true from being part of the delete list. Also, note,
+  // compiler will optimize out the branch in CreateInternal<T>.
+  template<typename T>
+  static inline bool SkipDeleteList(typename T::DestructorSkippable_*) {
+    return true;
   }
 
-  // Allocate and also optionally call on_arena_allocation callback with the
-  // allocated type info when the hooks are in place in ArenaOptions and
-  // the cookie is not null.
-  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  void* AllocateInternal(bool skip_explicit_ownership) {
-    const size_t n = internal::AlignUpTo8(sizeof(T));
-    AllocHook(RTTI_TYPE_ID(T), n);
-    // Monitor allocation if needed.
-    if (skip_explicit_ownership) {
-      return impl_.AllocateAligned(n);
-    } else {
-      return impl_.AllocateAlignedAndAddCleanup(
-          n, &internal::arena_destruct_object<T>);
-    }
+  // For message objects that don't have the DestructorSkippable_ trait, we
+  // always add to the delete list.
+  template<typename T>
+  static inline bool SkipDeleteList(...) {
+    return google::protobuf::internal::has_trivial_destructor<T>::value;
   }
 
+ private:
+  struct InternalIsDestructorSkippableHelper {
+    template<typename U>
+    static char DestructorSkippable(
+        const typename U::DestructorSkippable_*);
+    template<typename U>
+    static double DestructorSkippable(...);
+  };
+
+ public:
+  // Helper typetrait that indicates whether the desctructor of type T should be
+  // called when arena is destroyed at compile time. This is only to allow
+  // construction of higher-level templated utilities.
+  // is_destructor_skippable<T>::value is true if the destructor of the message
+  // type T should not be called when arena is destroyed or false otherwise.
+  // This is inside Arena because only Arena has the friend relationships
+  // necessary to see the underlying generated code traits.
+  template<typename T>
+  struct is_destructor_skippable
+      : public google::protobuf::internal::integral_constant<
+            bool,
+            sizeof(InternalIsDestructorSkippableHelper::DestructorSkippable<
+                   const T>(static_cast<const T*>(0))) == sizeof(char) ||
+                google::protobuf::internal::has_trivial_destructor<T>::value> {};
+
   // CreateMessage<T> requires that T supports arenas, but this private method
   // works whether or not T supports arenas. These are not exposed to user code
   // as it can cause confusing API usages, and end up having double free in
   // user code. These are used only internally from LazyField and Repeated
   // fields, since they are designed to work in all mode combinations.
-  template <typename Msg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static Msg* CreateMaybeMessage(Arena* arena, google::protobuf::internal::true_type) {
+  template<typename Msg> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  static Msg* CreateMaybeMessage(
+      Arena* arena, typename Msg::InternalArenaConstructable_*) {
     return CreateMessage<Msg>(arena);
   }
 
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* CreateMaybeMessage(Arena* arena, google::protobuf::internal::false_type) {
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  static T* CreateMaybeMessage(Arena* arena, ...) {
     return Create<T>(arena);
   }
 
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static T* CreateMaybeMessage(Arena* arena) {
-    return CreateMaybeMessage<T>(arena, is_arena_constructable<T>());
-  }
-
   // Just allocate the required size for the given type assuming the
   // type has a trivial constructor.
-  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   T* CreateInternalRawArray(size_t num_elements) {
     GOOGLE_CHECK_LE(num_elements,
              std::numeric_limits<size_t>::max() / sizeof(T))
         << "Requested size is too large to fit into size_t.";
-    const size_t n = internal::AlignUpTo8(sizeof(T) * num_elements);
-    // Monitor allocation if needed.
-    AllocHook(RTTI_TYPE_ID(T), n);
-    return static_cast<T*>(impl_.AllocateAligned(n));
+    return static_cast<T*>(
+        AllocateAligned(RTTI_TYPE_ID(T), sizeof(T) * num_elements));
   }
 
-#if LANG_CXX11
-  template <typename T, typename... Args>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership, Args&&... args) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
-        T(std::forward<Args>(args)...);
-  }
-#else
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   T* CreateInternal(bool skip_explicit_ownership) {
-    return new (AllocateInternal<T>(skip_explicit_ownership)) T();
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T))) T();
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
-  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename T, typename Arg> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   T* CreateInternal(bool skip_explicit_ownership, const Arg& arg) {
-    return new (AllocateInternal<T>(skip_explicit_ownership)) T(arg);
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T))) T(arg);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
-  template <typename T, typename Arg1, typename Arg2>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2) {
-    return new (AllocateInternal<T>(skip_explicit_ownership)) T(arg1, arg2);
+  template <typename T, typename Arg1, typename Arg2> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  T* CreateInternal(
+      bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T))) T(arg1, arg2);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
   template <typename T, typename Arg1, typename Arg2, typename Arg3>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2,
-                    const Arg3& arg3) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership,
+                                            const Arg1& arg1,
+                                            const Arg2& arg2,
+                                            const Arg3& arg3) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T)))
         T(arg1, arg2, arg3);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2,
-                    const Arg3& arg3,
-                    const Arg4& arg4) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership,
+                                            const Arg1& arg1,
+                                            const Arg2& arg2,
+                                            const Arg3& arg3,
+                                            const Arg4& arg4) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T)))
         T(arg1, arg2, arg3, arg4);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2,
-                    const Arg3& arg3,
-                    const Arg4& arg4,
-                    const Arg5& arg5) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership,
+                                            const Arg1& arg1,
+                                            const Arg2& arg2,
+                                            const Arg3& arg3,
+                                            const Arg4& arg4,
+                                            const Arg5& arg5) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T)))
         T(arg1, arg2, arg3, arg4, arg5);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5, typename Arg6>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2,
-                    const Arg3& arg3,
-                    const Arg4& arg4,
-                    const Arg5& arg5,
-                    const Arg6& arg6) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership,
+                                            const Arg1& arg1,
+                                            const Arg2& arg2,
+                                            const Arg3& arg3,
+                                            const Arg4& arg4,
+                                            const Arg5& arg5,
+                                            const Arg6& arg6) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T)))
         T(arg1, arg2, arg3, arg4, arg5, arg6);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5, typename Arg6, typename Arg7>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2,
-                    const Arg3& arg3,
-                    const Arg4& arg4,
-                    const Arg5& arg5,
-                    const Arg6& arg6,
-                    const Arg7& arg7) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership,
+                                            const Arg1& arg1,
+                                            const Arg2& arg2,
+                                            const Arg3& arg3,
+                                            const Arg4& arg4,
+                                            const Arg5& arg5,
+                                            const Arg6& arg6,
+                                            const Arg7& arg7) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T)))
         T(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
   template <typename T, typename Arg1, typename Arg2, typename Arg3,
             typename Arg4, typename Arg5, typename Arg6, typename Arg7,
             typename Arg8>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateInternal(bool skip_explicit_ownership,
-                    const Arg1& arg1,
-                    const Arg2& arg2,
-                    const Arg3& arg3,
-                    const Arg4& arg4,
-                    const Arg5& arg5,
-                    const Arg6& arg6,
-                    const Arg7& arg7,
-                    const Arg8& arg8) {
-    return new (AllocateInternal<T>(skip_explicit_ownership))
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership,
+                                            const Arg1& arg1,
+                                            const Arg2& arg2,
+                                            const Arg3& arg3,
+                                            const Arg4& arg4,
+                                            const Arg5& arg5,
+                                            const Arg6& arg6,
+                                            const Arg7& arg7,
+                                            const Arg8& arg8) {
+    T* t = new (AllocateAligned(RTTI_TYPE_ID(T), sizeof(T)))
         T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
-  }
-#endif
-#if LANG_CXX11
-  template <typename T, typename... Args>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal(
-      Args&&... args) {
-    return InternalHelper<T>::Construct(
-        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
-        this, std::forward<Args>(args)...);
-  }
-#endif
-  template <typename T>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal() {
-    return InternalHelper<T>::Construct(
-        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
-        this);
+    if (!skip_explicit_ownership) {
+      AddListNode(t, &internal::arena_destruct_object<T>);
+    }
+    return t;
   }
 
-  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateMessageInternal(const Arg& arg) {
-    return InternalHelper<T>::Construct(
-        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
-        this, arg);
+  template <typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  T* CreateMessageInternal(typename T::InternalArenaConstructable_*) {
+    return CreateInternal<T, Arena*>(SkipDeleteList<T>(static_cast<T*>(0)),
+                                     this);
   }
 
-  template <typename T, typename Arg1, typename Arg2>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  T* CreateMessageInternal(const Arg1& arg1, const Arg2& arg2) {
-    return InternalHelper<T>::Construct(
-        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
-        this, arg1, arg2);
+  template <typename T, typename Arg> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  T* CreateMessageInternal(typename T::InternalArenaConstructable_*,
+                           const Arg& arg) {
+    return CreateInternal<T, Arena*>(SkipDeleteList<T>(static_cast<T*>(0)),
+                                     this, arg);
+  }
+
+  template <typename T, typename Arg1, typename Arg2> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  T* CreateMessageInternal(typename T::InternalArenaConstructable_*,
+                           const Arg1& arg1, const Arg2& arg2) {
+    return CreateInternal<T, Arena*>(SkipDeleteList<T>(static_cast<T*>(0)),
+                                     this, arg1, arg2);
   }
 
   // CreateInArenaStorage is used to implement map field. Without it,
@@ -839,25 +789,24 @@
   static void CreateInArenaStorage(T* ptr, Arena* arena) {
     CreateInArenaStorageInternal(ptr, arena,
                                  typename is_arena_constructable<T>::type());
-    RegisterDestructorInternal(
-        ptr, arena,
-        typename InternalHelper<T>::is_destructor_skippable::type());
+    RegisterDestructorInternal(ptr, arena,
+                               typename is_destructor_skippable<T>::type());
   }
 
   template <typename T>
   static void CreateInArenaStorageInternal(
       T* ptr, Arena* arena, google::protobuf::internal::true_type) {
-    InternalHelper<T>::Construct(ptr, arena);
+    new (ptr) T(arena);
   }
   template <typename T>
   static void CreateInArenaStorageInternal(
-      T* ptr, Arena* /* arena */, google::protobuf::internal::false_type) {
-    new (ptr) T();
+      T* ptr, Arena*, google::protobuf::internal::false_type) {
+    new (ptr) T;
   }
 
   template <typename T>
   static void RegisterDestructorInternal(
-      T* /* ptr */, Arena* /* arena */, google::protobuf::internal::true_type) {}
+      T*, Arena*, google::protobuf::internal::true_type) {}
   template <typename T>
   static void RegisterDestructorInternal(
       T* ptr, Arena* arena, google::protobuf::internal::false_type) {
@@ -869,60 +818,102 @@
   // is a subtype of ::google::protobuf::Message and 'false_type' otherwise. Collapsing
   // all template instantiations to one for generic Message reduces code size,
   // using the virtual destructor instead.
-  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   void OwnInternal(T* object, google::protobuf::internal::true_type) {
     if (object != NULL) {
-      impl_.AddCleanup(object,
-                       &internal::arena_delete_object< ::google::protobuf::Message>);
+      AddListNode(object, &internal::arena_delete_object< ::google::protobuf::Message >);
     }
   }
-  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   void OwnInternal(T* object, google::protobuf::internal::false_type) {
     if (object != NULL) {
-      impl_.AddCleanup(object, &internal::arena_delete_object<T>);
+      AddListNode(object, &internal::arena_delete_object<T>);
     }
   }
 
   // Implementation for GetArena(). Only message objects with
   // InternalArenaConstructable_ tags can be associated with an arena, and such
   // objects must implement a GetArenaNoVirtual() method.
-  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static ::google::protobuf::Arena* GetArenaInternal(
-      const T* value, google::protobuf::internal::true_type) {
-    return InternalHelper<T>::GetArena(value);
+      const T* value, typename T::InternalArenaConstructable_*) {
+    return value->GetArenaNoVirtual();
   }
 
-  template <typename T>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static ::google::protobuf::Arena* GetArenaInternal(
-      const T* /* value */, google::protobuf::internal::false_type) {
+  template<typename T> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  static ::google::protobuf::Arena* GetArenaInternal(const T*, ...) {
     return NULL;
   }
 
-  // For friends of arena.
-  void* AllocateAligned(size_t n) {
-    AllocHook(NULL, n);
-    return impl_.AllocateAligned(internal::AlignUpTo8(n));
+  // Allocate and also optionally call on_arena_allocation callback with the
+  // allocated type info when the hooks are in place in ArenaOptions and
+  // the cookie is not null.
+  void* AllocateAligned(const std::type_info* allocated, size_t n);
+
+  // Allocate an internal allocation, avoiding optional typed monitoring.
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE void* AllocateAligned(size_t n) {
+    return AllocateAligned(NULL, n);
   }
 
-  internal::ArenaImpl impl_;
+  void Init();
 
-  void* (*on_arena_init_)(Arena* arena);
-  void (*on_arena_allocation_)(const std::type_info* allocated_type,
-                               uint64 alloc_size, void* cookie);
-  void (*on_arena_reset_)(Arena* arena, void* cookie, uint64 space_used);
-  void (*on_arena_destruction_)(Arena* arena, void* cookie, uint64 space_used);
+  // Free all blocks and return the total space used which is the sums of sizes
+  // of the all the allocated blocks.
+  uint64 FreeBlocks();
+
+  // Add object pointer and cleanup function pointer to the list.
+  // TODO(rohananil, cfallin): We could pass in a sub-arena into this method
+  // to avoid polluting blocks of this arena with list nodes. This would help in
+  // mixed mode (where many protobufs have cc_enable_arenas=false), and is an
+  // alternative to a chunked linked-list, but with extra overhead of *next.
+  void AddListNode(void* elem, void (*cleanup)(void*));
+  // Delete or Destruct all objects owned by the arena.
+  void CleanupList();
+  uint64 ResetInternal();
+
+  inline void SetThreadCacheBlock(Block* block) {
+    thread_cache().last_block_used_ = block;
+    thread_cache().last_lifecycle_id_seen = lifecycle_id_;
+  }
+
+  int64 lifecycle_id_;  // Unique for each arena. Changes on Reset().
+
+  google::protobuf::internal::AtomicWord blocks_;  // Head of linked list of all allocated blocks
+  google::protobuf::internal::AtomicWord hint_;    // Fast thread-local block access
+
+  // Node contains the ptr of the object to be cleaned up and the associated
+  // cleanup function ptr.
+  struct Node {
+    void* elem;              // Pointer to the object to be cleaned up.
+    void (*cleanup)(void*);  // Function pointer to the destructor or deleter.
+    Node* next;              // Next node in the list.
+  };
+
+  google::protobuf::internal::AtomicWord cleanup_list_;  // Head of a linked list of nodes containing object
+                             // ptrs and cleanup methods.
+
+  bool owns_first_block_;    // Indicates that arena owns the first block
+  Mutex blocks_lock_;
+
+  void AddBlock(Block* b);
+  // Access must be synchronized, either by blocks_lock_ or by being called from
+  // Init()/Reset().
+  void AddBlockInternal(Block* b);
+  void* SlowAlloc(size_t n);
+  Block* FindBlock(void* me);
+  Block* NewBlock(void* me, Block* my_last_block, size_t n,
+                  size_t start_block_size, size_t max_block_size);
+  static void* AllocFromBlock(Block* b, size_t n);
+  template <typename Key, typename T>
+  friend class Map;
 
   // The arena may save a cookie it receives from the external on_init hook
   // and then use it when calling the on_reset and on_destruction hooks.
   void* hooks_cookie_;
 
-  template <typename Type>
-  friend class ::google::protobuf::internal::GenericTypeHandler;
-  friend struct internal::ArenaStringPtr;  // For AllocateAligned.
-  friend class internal::LazyField;    // For CreateMaybeMessage.
-  template <typename Key, typename T>
-  friend class Map;
+  ArenaOptions options_;
+
+  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Arena);
 };
 
 // Defined above for supporting environments without RTTI.
diff --git a/src/google/protobuf/arena_impl.h b/src/google/protobuf/arena_impl.h
deleted file mode 100644
index 6cc7096..0000000
--- a/src/google/protobuf/arena_impl.h
+++ /dev/null
@@ -1,242 +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.
-
-// This file defines an Arena allocator for better allocation performance.
-
-#ifndef GOOGLE_PROTOBUF_ARENA_IMPL_H__
-#define GOOGLE_PROTOBUF_ARENA_IMPL_H__
-
-#include <limits>
-
-#include <google/protobuf/stubs/atomic_sequence_num.h>
-#include <google/protobuf/stubs/atomicops.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/stubs/type_traits.h>
-
-#include <google/protobuf/stubs/port.h>
-
-namespace google {
-
-namespace protobuf {
-namespace internal {
-
-inline size_t AlignUpTo8(size_t n) {
-  // Align n to next multiple of 8 (from Hacker's Delight, Chapter 3.)
-  return (n + 7) & -8;
-}
-
-// 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
-// in turn would be templates, which will/cannot happen. However separating
-// the memory allocation part from the cruft of the API users expect we can
-// use #ifdef the select the best implementation based on hardware / OS.
-class LIBPROTOBUF_EXPORT ArenaImpl {
- public:
-  struct Options {
-    size_t start_block_size;
-    size_t max_block_size;
-    char* initial_block;
-    size_t initial_block_size;
-    void* (*block_alloc)(size_t);
-    void (*block_dealloc)(void*, size_t);
-
-    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) {}
-  };
-
-  template <typename O>
-  explicit ArenaImpl(const O& options) : options_(options) {
-    if (options_.initial_block != NULL && options_.initial_block_size > 0) {
-      GOOGLE_CHECK_GE(options_.initial_block_size, sizeof(Block))
-          << ": Initial block size too small for header.";
-      initial_block_ = reinterpret_cast<Block*>(options_.initial_block);
-    } else {
-      initial_block_ = NULL;
-    }
-
-    Init();
-  }
-
-  // Destructor deletes all owned heap allocated objects, and destructs objects
-  // that have non-trivial destructors, except for proto2 message objects whose
-  // destructors can be skipped. Also, frees all blocks except the initial block
-  // if it was passed in.
-  ~ArenaImpl();
-
-  uint64 Reset();
-
-  uint64 SpaceAllocated() const;
-  uint64 SpaceUsed() const;
-
-  void* AllocateAligned(size_t n);
-
-  void* AllocateAlignedAndAddCleanup(size_t n, void (*cleanup)(void*));
-
-  // Add object pointer and cleanup function pointer to the list.
-  void AddCleanup(void* elem, void (*cleanup)(void*));
-
- private:
-  // Node contains the ptr of the object to be cleaned up and the associated
-  // cleanup function ptr.
-  struct CleanupNode {
-    void* elem;              // Pointer to the object to be cleaned up.
-    void (*cleanup)(void*);  // Function pointer to the destructor or deleter.
-  };
-
-  // Cleanup uses a chunked linked list, to reduce pointer chasing.
-  struct CleanupChunk {
-    static size_t SizeOf(size_t i) {
-      return sizeof(CleanupChunk) + (sizeof(CleanupNode) * (i - 1));
-    }
-    size_t len;            // Number of elements currently present.
-    size_t size;           // Total elements in the list.
-    CleanupChunk* next;    // Next node in the list.
-    CleanupNode nodes[1];  // True length is |size|.
-  };
-
-  struct Block;
-
-  // Tracks per-thread info.  ThreadInfos are kept in a linked list.
-  struct ThreadInfo {
-    void *owner;             // &ThreadCache of this thread;
-    Block* head;             // Head of linked list of blocks.
-    CleanupChunk* cleanup;   // Head of cleanup list.
-    ThreadInfo* next;        // Next ThreadInfo in this linked list.
-  };
-
-  // Blocks are variable length malloc-ed objects.  The following structure
-  // describes the common header for all blocks.
-  struct Block {
-    void* owner;              // &ThreadCache of thread that owns this block.
-    ThreadInfo* thread_info;  // ThreadInfo of thread that owns this block.
-    Block* next;              // Next block in arena (may have different owner)
-    // ((char*) &block) + pos is next available byte. It is always
-    // aligned at a multiple of 8 bytes.
-    size_t pos;
-    size_t size;  // total size of the block.
-    GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-    size_t avail() const { return size - pos; }
-    // data follows
-  };
-
-  struct ThreadCache {
-#if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
-    // If we are using the ThreadLocalStorage class to store the ThreadCache,
-    // then the ThreadCache's default constructor has to be responsible for
-    // initializing it.
-    ThreadCache() : last_lifecycle_id_seen(-1), last_block_used_(NULL) {}
-#endif
-
-    // The ThreadCache is considered valid as long as this matches the
-    // lifecycle_id of the arena being used.
-    int64 last_lifecycle_id_seen;
-    Block* last_block_used_;
-  };
-  static google::protobuf::internal::SequenceNumber 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.
-  // iOS also does not support the GOOGLE_THREAD_LOCAL keyword.
-  static ThreadCache& thread_cache();
-#elif defined(PROTOBUF_USE_DLLS)
-  // Thread local variables cannot be exposed through DLL interface but we can
-  // wrap them in static functions.
-  static ThreadCache& thread_cache();
-#else
-  static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_;
-  static ThreadCache& thread_cache() { return thread_cache_; }
-#endif
-
-  void Init();
-
-  // Free all blocks and return the total space used which is the sums of sizes
-  // of the all the allocated blocks.
-  uint64 FreeBlocks();
-
-  void AddCleanupInBlock(Block* b, void* elem, void (*func)(void*));
-  CleanupChunk* ExpandCleanupList(CleanupChunk* cleanup, Block* b);
-  // Delete or Destruct all objects owned by the arena.
-  void CleanupList();
-
-  inline void CacheBlock(Block* block) {
-    thread_cache().last_block_used_ = block;
-    thread_cache().last_lifecycle_id_seen = lifecycle_id_;
-    // TODO(haberman): evaluate whether we would gain efficiency by getting rid
-    // of hint_.  It's the only write we do to ArenaImpl in the allocation path,
-    // which will dirty the cache line.
-    google::protobuf::internal::Release_Store(&hint_, reinterpret_cast<google::protobuf::internal::AtomicWord>(block));
-  }
-
-  google::protobuf::internal::AtomicWord threads_;          // Pointer to a linked list of ThreadInfo.
-  google::protobuf::internal::AtomicWord hint_;             // Fast thread-local block access
-  google::protobuf::internal::AtomicWord space_allocated_;  // Sum of sizes of all allocated blocks.
-
-  Block *initial_block_;     // If non-NULL, points to the block that came from
-                             // user data.
-
-  // Returns a block owned by this thread.
-  Block* GetBlock(size_t n);
-  Block* GetBlockSlow(void* me, Block* my_full_block, size_t n);
-  Block* NewBlock(void* me, Block* my_last_block, size_t min_bytes);
-  void InitBlock(Block* b, void *me, size_t size);
-  static void* AllocFromBlock(Block* b, size_t n);
-  ThreadInfo* NewThreadInfo(Block* b);
-  ThreadInfo* FindThreadInfo(void* me);
-  ThreadInfo* GetThreadInfo(void* me, size_t n);
-
-  int64 lifecycle_id_;  // Unique for each arena. Changes on Reset().
-
-  Options options_;
-
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArenaImpl);
-
- public:
-  // kHeaderSize is sizeof(Block), aligned up to the nearest multiple of 8 to
-  // protect the invariant that pos is always at a multiple of 8.
-  static const size_t kHeaderSize = (sizeof(Block) + 7) & -8;
-#if LANG_CXX11
-  static_assert(kHeaderSize % 8 == 0, "kHeaderSize must be a multiple of 8.");
-#endif
-};
-
-}  // namespace internal
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_ARENA_IMPL_H__
diff --git a/src/google/protobuf/arena_nc.cc b/src/google/protobuf/arena_nc.cc
new file mode 100644
index 0000000..f2f0842
--- /dev/null
+++ b/src/google/protobuf/arena_nc.cc
@@ -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.
+
+// Negative compilation test for arena usage.
+
+#include <google/protobuf/arena.h>
+#include <google/protobuf/unittest.pb.h>
+
+#ifdef TEST_ARENA_PRIVATE_CONSTRUCTOR
+
+namespace google {
+void ArenaPrivateConstructor() {
+  google::protobuf::Arena arena;
+  protobuf_unittest::TestAllTypes message(&arena);
+}
+
+#endif
+}  // namespace google
diff --git a/src/google/protobuf/arena_nc_test.py b/src/google/protobuf/arena_nc_test.py
new file mode 100644
index 0000000..56a7dd0
--- /dev/null
+++ b/src/google/protobuf/arena_nc_test.py
@@ -0,0 +1,61 @@
+#! /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.
+
+"""Negative compilation unit tests for arena API."""
+
+import unittest
+
+from google3.testing.pybase import fake_target_util
+from google3.testing.pybase import unittest
+
+
+class ArenaNcTest(unittest.TestCase):
+
+  def testCompilerErrors(self):
+    """Runs a list of tests to verify compiler error messages."""
+
+    # Defines a list of test specs, where each element is a tuple
+    # (test name, list of regexes for matching the compiler errors).
+    test_specs = [
+        ('ARENA_PRIVATE_CONSTRUCTOR',
+         [r'calling a protected constructor']),
+        ('SANITY', None)]
+
+    fake_target_util.AssertCcCompilerErrors(
+        self,                         # The current test case.
+        'google3/google/protobuf/arena_nc',  # The fake target file.
+        'arena_nc.o',                 # The sub-target to build.
+        test_specs                    # List of test specifications.
+        )
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/src/google/protobuf/arena_test_util.h b/src/google/protobuf/arena_test_util.h
index 8c9f769..690cc70 100644
--- a/src/google/protobuf/arena_test_util.h
+++ b/src/google/protobuf/arena_test_util.h
@@ -31,40 +31,9 @@
 #ifndef GOOGLE_PROTOBUF_ARENA_TEST_UTIL_H__
 #define GOOGLE_PROTOBUF_ARENA_TEST_UTIL_H__
 
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
 
 namespace google {
 namespace protobuf {
-
-template <typename T, bool use_arena>
-void TestParseCorruptedString(const T& message) {
-  int success_count = 0;
-  string s = message.SerializeAsString();
-  const int kMaxIters = 900;
-  const int stride = s.size() <= kMaxIters ? 1 : s.size() / kMaxIters;
-  const int start = stride == 1 || use_arena ? 0 : (stride + 1) / 2;
-  for (int i = start; i < s.size(); i += stride) {
-    for (int c = 1 + (i % 17); c < 256; c += 2 * c + (i & 3)) {
-      s[i] ^= c;
-      google::protobuf::Arena arena;
-      T* message =
-          google::protobuf::Arena::CreateMessage<T>(use_arena ? &arena : NULL);
-      if (message->ParseFromString(s)) {
-        ++success_count;
-      }
-      if (!use_arena) {
-        delete message;
-      }
-      s[i] ^= c;  // Restore s to its original state.
-    }
-  }
-  // This next line is a low bar.  But getting through the test without crashing
-  // due to use-after-free or other bugs is a big part of what we're checking.
-  GOOGLE_CHECK_GT(success_count, 0);
-}
-
 namespace internal {
 
 class NoHeapChecker {
diff --git a/src/google/protobuf/arena_unittest.cc b/src/google/protobuf/arena_unittest.cc
index c6ff25e..ab25ffe 100644
--- a/src/google/protobuf/arena_unittest.cc
+++ b/src/google/protobuf/arena_unittest.cc
@@ -42,6 +42,7 @@
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 #include <google/protobuf/arena_test_util.h>
 #include <google/protobuf/test_util.h>
 #include <google/protobuf/unittest.pb.h>
@@ -151,6 +152,8 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughEight);
 };
 
+}  // namespace
+
 TEST(ArenaTest, ArenaConstructable) {
   EXPECT_TRUE(Arena::is_arena_constructable<TestAllTypes>::type::value);
   EXPECT_TRUE(Arena::is_arena_constructable<const TestAllTypes>::type::value);
@@ -180,35 +183,6 @@
   EXPECT_EQ(2, notifier.GetCount());
 }
 
-TEST(ArenaTest, CreateAndConstCopy) {
-  Arena arena;
-  const string s("foo");
-  const string* s_copy = Arena::Create<string>(&arena, s);
-  EXPECT_TRUE(s_copy != NULL);
-  EXPECT_EQ("foo", s);
-  EXPECT_EQ("foo", *s_copy);
-}
-
-TEST(ArenaTest, CreateAndNonConstCopy) {
-  Arena arena;
-  string s("foo");
-  const string* s_copy = Arena::Create<string>(&arena, s);
-  EXPECT_TRUE(s_copy != NULL);
-  EXPECT_EQ("foo", s);
-  EXPECT_EQ("foo", *s_copy);
-}
-
-#if LANG_CXX11
-TEST(ArenaTest, CreateAndMove) {
-  Arena arena;
-  string s("foo");
-  const string* s_move = Arena::Create<string>(&arena, std::move(s));
-  EXPECT_TRUE(s_move != NULL);
-  EXPECT_TRUE(s.empty());  // NOLINT
-  EXPECT_EQ("foo", *s_move);
-}
-#endif
-
 TEST(ArenaTest, CreateWithFourConstructorArguments) {
   Arena arena;
   const string three("3");
@@ -243,34 +217,11 @@
   ASSERT_EQ("8", new_object->eight_);
 }
 
-#if LANG_CXX11
-class PleaseMoveMe {
- public:
-  explicit PleaseMoveMe(const string& value) : value_(value) {}
-  PleaseMoveMe(PleaseMoveMe&&) = default;
-  PleaseMoveMe(const PleaseMoveMe&) = delete;
-
-  const string& value() const { return value_; }
-
- private:
-  string value_;
-};
-
-TEST(ArenaTest, CreateWithMoveArguments) {
-  Arena arena;
-  PleaseMoveMe one("1");
-  const PleaseMoveMe* new_object =
-      Arena::Create<PleaseMoveMe>(&arena, std::move(one));
-  EXPECT_TRUE(new_object);
-  ASSERT_EQ("1", new_object->value());
-}
-#endif
-
 TEST(ArenaTest, InitialBlockTooSmall) {
   // Construct a small (64 byte) initial block of memory to be used by the
   // arena allocator; then, allocate an object which will not fit in the
   // initial block.
-  std::vector<char> arena_block(72);
+  std::vector<char> arena_block(64);
   ArenaOptions options;
   options.initial_block = &arena_block[0];
   options.initial_block_size = arena_block.size();
@@ -301,7 +252,7 @@
   arena_message->ParseFromString(original.SerializeAsString());
   TestUtil::ExpectAllFieldsSet(*arena_message);
 
-  // Test that string fields have nul terminator bytes (earlier bug).
+  // Test that string fields have null terminator bytes (earlier bug).
   EXPECT_EQ(strlen(original.optional_string().c_str()),
             strlen(arena_message->optional_string().c_str()));
 }
@@ -943,24 +894,6 @@
   delete s;
 }
 
-TEST(ArenaTest, OneofMerge) {
-  Arena arena;
-  TestAllTypes* message0 = Arena::CreateMessage<TestAllTypes>(&arena);
-  TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&arena);
-
-  message0->unsafe_arena_set_allocated_oneof_string(new string("x"));
-  ASSERT_TRUE(message0->has_oneof_string());
-  message1->unsafe_arena_set_allocated_oneof_string(new string("y"));
-  ASSERT_TRUE(message1->has_oneof_string());
-  EXPECT_EQ("x", message0->oneof_string());
-  EXPECT_EQ("y", message1->oneof_string());
-  message0->MergeFrom(*message1);
-  EXPECT_EQ("y", message0->oneof_string());
-  EXPECT_EQ("y", message1->oneof_string());
-  delete message0->unsafe_arena_release_oneof_string();
-  delete message1->unsafe_arena_release_oneof_string();
-}
-
 TEST(ArenaTest, ArenaOneofReflection) {
   Arena arena;
   TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
@@ -991,6 +924,7 @@
   delete submsg;
 }
 
+namespace {
 void TestSwapRepeatedField(Arena* arena1, Arena* arena2) {
   // Test "safe" (copying) semantics for direct Swap() on RepeatedPtrField
   // between arenas.
@@ -1029,6 +963,7 @@
     EXPECT_EQ(i, field2.Get(i).optional_int32());
   }
 }
+}  // namespace
 
 TEST(ArenaTest, SwapRepeatedField) {
   Arena arena;
@@ -1170,6 +1105,8 @@
 #endif  // !GOOGLE_PROTOBUF_NO_RTTI
 
 
+namespace {
+
 void FillArenaAwareFields(TestAllTypes* message) {
   string test_string = "hello world";
   message->set_optional_int32(42);
@@ -1188,6 +1125,8 @@
   message->mutable_optional_lazy_message()->set_bb(42);
 }
 
+}
+
 // Test: no allocations occur on heap while touching all supported field types.
 TEST(ArenaTest, NoHeapAllocationsTest) {
   // Allocate a large initial block to avoid mallocs during hooked test.
@@ -1206,13 +1145,6 @@
   arena.Reset();
 }
 
-TEST(ArenaTest, ParseCorruptedString) {
-  TestAllTypes message;
-  TestUtil::SetAllFields(&message);
-  TestParseCorruptedString<TestAllTypes, true>(message);
-  TestParseCorruptedString<TestAllTypes, false>(message);
-}
-
 #ifndef GOOGLE_PROTOBUF_NO_RTTI
 // Test construction on an arena via generic MessageLite interface. We should be
 // able to successfully deserialize on the arena without incurring heap
@@ -1265,7 +1197,9 @@
 }
 
 // Align n to next multiple of 8
+namespace {
 uint64 Align8(uint64 n) { return (n + 7) & -8; }
+}  // namespace
 
 TEST(ArenaTest, SpaceAllocated_and_Used) {
   ArenaOptions options;
@@ -1299,12 +1233,12 @@
   options.initial_block_size = 0;
   Arena arena_3(options);
   EXPECT_EQ(0, arena_3.SpaceUsed());
-  ::google::protobuf::Arena::CreateArray<char>(&arena_3, 182);
+  ::google::protobuf::Arena::CreateArray<char>(&arena_3, 190);
   EXPECT_EQ(256, arena_3.SpaceAllocated());
-  EXPECT_EQ(Align8(182), arena_3.SpaceUsed());
+  EXPECT_EQ(Align8(190), arena_3.SpaceUsed());
   ::google::protobuf::Arena::CreateArray<char>(&arena_3, 70);
   EXPECT_EQ(256 + 512, arena_3.SpaceAllocated());
-  EXPECT_EQ(Align8(182) + Align8(70), arena_3.SpaceUsed());
+  EXPECT_EQ(Align8(190) + Align8(70), arena_3.SpaceUsed());
   EXPECT_EQ(256 + 512, arena_3.Reset());
 }
 
@@ -1316,22 +1250,6 @@
   }
 }
 
-TEST(ArenaTest, BlockSizeSmallerThanAllocation) {
-  for (size_t i = 0; i <= 8; ++i) {
-    ::google::protobuf::ArenaOptions opt;
-    opt.start_block_size = opt.max_block_size = i;
-    ::google::protobuf::Arena arena(opt);
-
-    *::google::protobuf::Arena::Create<int64>(&arena) = 42;
-    EXPECT_GE(arena.SpaceAllocated(), 8);
-    EXPECT_EQ(8, arena.SpaceUsed());
-
-    *::google::protobuf::Arena::Create<int64>(&arena) = 42;
-    EXPECT_GE(arena.SpaceAllocated(), 16);
-    EXPECT_EQ(16, arena.SpaceUsed());
-  }
-}
-
 TEST(ArenaTest, GetArenaShouldReturnTheArenaForArenaAllocatedMessages) {
   ::google::protobuf::Arena arena;
   ArenaMessage* message = Arena::CreateMessage<ArenaMessage>(&arena);
@@ -1432,7 +1350,5 @@
   EXPECT_EQ(1, ArenaHooksTestUtil::num_destruct);
 }
 
-
-}  // namespace
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/arenastring.cc b/src/google/protobuf/arenastring.cc
index 7f33a0c..cce61d7 100644
--- a/src/google/protobuf/arenastring.cc
+++ b/src/google/protobuf/arenastring.cc
@@ -38,6 +38,16 @@
 namespace internal {
 
 
+void ArenaStringPtr::AssignWithDefault(const ::std::string* default_value,
+                                       ArenaStringPtr value) {
+  const ::std::string* me = *UnsafeRawStringPointer();
+  const ::std::string* other = *value.UnsafeRawStringPointer();
+  // If the pointers are the same then do nothing.
+  if (me != other) {
+    SetNoArena(default_value, value.GetNoArena(default_value));
+  }
+}
+
 }  // namespace internal
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/arenastring.h b/src/google/protobuf/arenastring.h
index c9d045a..590ffce 100755
--- a/src/google/protobuf/arenastring.h
+++ b/src/google/protobuf/arenastring.h
@@ -33,11 +33,13 @@
 
 #include <string>
 
-#include <google/protobuf/arena.h>
+#include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/fastmem.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/port.h>
+#include <google/protobuf/arena.h>
+#include <google/protobuf/generated_message_util.h>
+
+
 
 // This is the implementation of arena string fields written for the open-source
 // release. The ArenaStringPtr struct below is an internal implementation class
@@ -61,14 +63,10 @@
     }
   }
 
-  inline void SetLite(const ::std::string* default_value,
-                      const ::std::string& value,
-                      ::google::protobuf::Arena* arena) {
-    Set(default_value, value, arena);
-  }
-
   // Basic accessors.
-  inline const ::std::string& Get() const { return *ptr_; }
+  inline const ::std::string& Get(const ::std::string* /* default_value */) const {
+    return *ptr_;
+  }
 
   inline ::std::string* Mutable(const ::std::string* default_value,
                            ::google::protobuf::Arena* arena) {
@@ -89,9 +87,8 @@
     }
     ::std::string* released = NULL;
     if (arena != NULL) {
-      // ptr_ is owned by the arena.
-      released = new ::std::string;
-      released->swap(*ptr_);
+      // ptr_ is owned by the arena -- we need to return a copy.
+      released = new ::std::string(*ptr_);
     } else {
       released = ptr_;
     }
@@ -149,16 +146,17 @@
   // Swaps internal pointers. Arena-safety semantics: this is guarded by the
   // logic in Swap()/UnsafeArenaSwap() at the message level, so this method is
   // 'unsafe' if called directly.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Swap(ArenaStringPtr* other) {
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Swap(ArenaStringPtr* other) {
     std::swap(ptr_, other->ptr_);
   }
 
-  // Frees storage (if not on an arena).
+  // Frees storage (if not on an arena) and sets field to default value.
   inline void Destroy(const ::std::string* default_value,
                       ::google::protobuf::Arena* arena) {
     if (arena == NULL && ptr_ != default_value) {
       delete ptr_;
     }
+    ptr_ = const_cast< ::std::string* >(default_value);
   }
 
   // Clears content, but keeps allocated string if arena != NULL, to avoid the
@@ -216,19 +214,11 @@
     }
   }
 
-#if LANG_CXX11
-  void SetNoArena(const ::std::string* default_value, ::std::string&& value) {
-    if (IsDefault(default_value)) {
-      ptr_ = new ::std::string(std::move(value));
-    } else {
-      *ptr_ = std::move(value);
-    }
-  }
-#endif
-
   void AssignWithDefault(const ::std::string* default_value, ArenaStringPtr value);
 
-  inline const ::std::string& GetNoArena() const { return *ptr_; }
+  inline const ::std::string& GetNoArena(const ::std::string* /* default_value */) const {
+    return *ptr_;
+  }
 
   inline ::std::string* MutableNoArena(const ::std::string* default_value) {
     if (ptr_ == default_value) {
@@ -263,6 +253,7 @@
     if (ptr_ != default_value) {
       delete ptr_;
     }
+    ptr_ = NULL;
   }
 
   inline void ClearToEmptyNoArena(const ::std::string* default_value) {
@@ -290,26 +281,27 @@
     return &ptr_;
   }
 
-  inline bool IsDefault(const ::std::string* default_value) const {
-    return ptr_ == default_value;
-  }
-
  private:
   ::std::string* ptr_;
 
-  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
-  void CreateInstance(::google::protobuf::Arena* arena,
-                      const ::std::string* initial_value) {
-    GOOGLE_DCHECK(initial_value != NULL);
-    ptr_ = new ::std::string(*initial_value);
+  GOOGLE_ATTRIBUTE_NOINLINE void CreateInstance(::google::protobuf::Arena* arena,
+                                         const ::std::string* initial_value) {
+    // Assumes ptr_ is not NULL.
+    if (initial_value != NULL) {
+      ptr_ = new ::std::string(*initial_value);
+    } else {
+      ptr_ = new ::std::string();
+    }
     if (arena != NULL) {
       arena->Own(ptr_);
     }
   }
-  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
-  void CreateInstanceNoArena(const ::std::string* initial_value) {
-    GOOGLE_DCHECK(initial_value != NULL);
-    ptr_ = new ::std::string(*initial_value);
+  GOOGLE_ATTRIBUTE_NOINLINE void CreateInstanceNoArena(const ::std::string* initial_value) {
+    if (initial_value != NULL) {
+      ptr_ = new ::std::string(*initial_value);
+    } else {
+      ptr_ = new ::std::string();
+    }
   }
 };
 
@@ -318,21 +310,5 @@
 
 
 
-namespace protobuf {
-namespace internal {
-
-inline void ArenaStringPtr::AssignWithDefault(const ::std::string* default_value,
-                                       ArenaStringPtr value) {
-  const ::std::string* me = *UnsafeRawStringPointer();
-  const ::std::string* other = *value.UnsafeRawStringPointer();
-  // If the pointers are the same then do nothing.
-  if (me != other) {
-    SetNoArena(default_value, value.GetNoArena());
-  }
-}
-
-}  // namespace internal
-}  // namespace protobuf
-
 }  // namespace google
 #endif  // GOOGLE_PROTOBUF_ARENASTRING_H__
diff --git a/src/google/protobuf/arenastring_unittest.cc b/src/google/protobuf/arenastring_unittest.cc
index d5d995a..ea405d7 100644
--- a/src/google/protobuf/arenastring_unittest.cc
+++ b/src/google/protobuf/arenastring_unittest.cc
@@ -32,23 +32,19 @@
 
 #include <google/protobuf/arenastring.h>
 
-#include <algorithm>
-#include <cstdlib>
+#include <string>
 #include <memory>
 #ifndef _SHARED_PTR_H
 #include <google/protobuf/stubs/shared_ptr.h>
 #endif
-#include <string>
-#include <vector>
+#include <cstdlib>
 
 #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>
-
 
 namespace google {
+using google::protobuf::internal::ArenaString;
 using google::protobuf::internal::ArenaStringPtr;
 
 namespace protobuf {
@@ -63,11 +59,11 @@
   ArenaStringPtr field;
   ::std::string default_value = "default";
   field.UnsafeSetDefault(&default_value);
-  EXPECT_EQ(string("default"), field.Get());
+  EXPECT_EQ(string("default"), field.Get(&default_value));
   field.Set(&default_value, WrapString("Test short"), NULL);
-  EXPECT_EQ(string("Test short"), field.Get());
+  EXPECT_EQ(string("Test short"), field.Get(&default_value));
   field.Set(&default_value, WrapString("Test long long long long value"), NULL);
-  EXPECT_EQ(string("Test long long long long value"), field.Get());
+  EXPECT_EQ(string("Test long long long long value"), field.Get(&default_value));
   field.Set(&default_value, string(""), NULL);
   field.Destroy(&default_value, NULL);
 
@@ -75,11 +71,11 @@
   field2.UnsafeSetDefault(&default_value);
   ::std::string* mut = field2.Mutable(&default_value, NULL);
   EXPECT_EQ(mut, field2.Mutable(&default_value, NULL));
-  EXPECT_EQ(mut, &field2.Get());
+  EXPECT_EQ(mut, &field2.Get(&default_value));
   EXPECT_NE(&default_value, mut);
   EXPECT_EQ(string("default"), *mut);
   *mut = "Test long long long long value";  // ensure string allocates storage
-  EXPECT_EQ(string("Test long long long long value"), field2.Get());
+  EXPECT_EQ(string("Test long long long long value"), field2.Get(&default_value));
   field2.Destroy(&default_value, NULL);
 }
 
@@ -88,12 +84,12 @@
   ArenaStringPtr field;
   ::std::string default_value = "default";
   field.UnsafeSetDefault(&default_value);
-  EXPECT_EQ(string("default"), field.Get());
+  EXPECT_EQ(string("default"), field.Get(&default_value));
   field.Set(&default_value, WrapString("Test short"), &arena);
-  EXPECT_EQ(string("Test short"), field.Get());
-  field.Set(&default_value, WrapString("Test long long long long value"),
-            &arena);
-  EXPECT_EQ(string("Test long long long long value"), field.Get());
+  EXPECT_EQ(string("Test short"), field.Get(&default_value));
+  field.Set(&default_value, WrapString("Test long long long long value"), &arena);
+  EXPECT_EQ(string("Test long long long long value"),
+            field.Get(&default_value));
   field.Set(&default_value, string(""), &arena);
   field.Destroy(&default_value, &arena);
 
@@ -101,41 +97,14 @@
   field2.UnsafeSetDefault(&default_value);
   ::std::string* mut = field2.Mutable(&default_value, &arena);
   EXPECT_EQ(mut, field2.Mutable(&default_value, &arena));
-  EXPECT_EQ(mut, &field2.Get());
+  EXPECT_EQ(mut, &field2.Get(&default_value));
   EXPECT_NE(&default_value, mut);
   EXPECT_EQ(string("default"), *mut);
   *mut = "Test long long long long value";  // ensure string allocates storage
-  EXPECT_EQ(string("Test long long long long value"), field2.Get());
+  EXPECT_EQ(string("Test long long long long value"),
+            field2.Get(&default_value));
   field2.Destroy(&default_value, &arena);
 }
 
-TEST(ArenaStringPtrTest, ArenaStringPtrOnArenaNoSSO) {
-  google::protobuf::Arena arena;
-  ArenaStringPtr field;
-  ::std::string default_value = "default";
-  field.UnsafeSetDefault(&default_value);
-  EXPECT_EQ(string("default"), field.Get());
-
-  // Avoid triggering the SSO optimization by setting the string to something
-  // larger than the internal buffer.
-  field.Set(&default_value, WrapString("Test long long long long value"),
-            &arena);
-  EXPECT_EQ(string("Test long long long long value"), field.Get());
-  field.Set(&default_value, string(""), &arena);
-  field.Destroy(&default_value, &arena);
-
-  ArenaStringPtr field2;
-  field2.UnsafeSetDefault(&default_value);
-  ::std::string* mut = field2.Mutable(&default_value, &arena);
-  EXPECT_EQ(mut, field2.Mutable(&default_value, &arena));
-  EXPECT_EQ(mut, &field2.Get());
-  EXPECT_NE(&default_value, mut);
-  EXPECT_EQ(string("default"), *mut);
-  *mut = "Test long long long long value";  // ensure string allocates storage
-  EXPECT_EQ(string("Test long long long long value"), field2.Get());
-  field2.Destroy(&default_value, &arena);
-}
-
-
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/compiler/annotation_test_util.cc b/src/google/protobuf/compiler/annotation_test_util.cc
deleted file mode 100644
index aa14faf..0000000
--- a/src/google/protobuf/compiler/annotation_test_util.cc
+++ /dev/null
@@ -1,187 +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.
-
-#include <google/protobuf/compiler/annotation_test_util.h>
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.pb.h>
-
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace annotation_test_util {
-namespace {
-
-// A CodeGenerator that captures the FileDescriptor it's passed as a
-// FileDescriptorProto.
-class DescriptorCapturingGenerator : public CodeGenerator {
- public:
-  // Does not own file; file must outlive the Generator.
-  explicit DescriptorCapturingGenerator(FileDescriptorProto* file)
-      : file_(file) {}
-
-  virtual bool Generate(const FileDescriptor* file, const string& parameter,
-                        GeneratorContext* context, string* error) const {
-    file->CopyTo(file_);
-    return true;
-  }
-
- private:
-  FileDescriptorProto* file_;
-};
-}  // namespace
-
-void AddFile(const string& filename, const string& data) {
-  GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/" + filename, data,
-                             true));
-}
-
-bool CaptureMetadata(const string& filename, const string& plugin_specific_args,
-                     const string& meta_file_suffix, CommandLineInterface* cli,
-                     FileDescriptorProto* file,
-                     std::vector<ExpectedOutput>* outputs) {
-  cli->SetInputsAreProtoPathRelative(true);
-
-  DescriptorCapturingGenerator capturing_generator(file);
-  cli->RegisterGenerator("--capture_out", &capturing_generator, "");
-
-  string proto_path = "-I" + TestTempDir();
-  string capture_out = "--capture_out=" + TestTempDir();
-
-  const char* argv[] = {"protoc", proto_path.c_str(),
-                        plugin_specific_args.c_str(), capture_out.c_str(),
-                        filename.c_str()};
-
-  if (cli->Run(5, argv) != 0) {
-    return false;
-  }
-
-  if (outputs != NULL) {
-    for (std::vector<ExpectedOutput>::iterator i = outputs->begin();
-         i != outputs->end(); ++i) {
-      GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/" + i->file_path,
-                                 &i->file_content, true));
-      if (!DecodeMetadata(
-              TestTempDir() + "/" + i->file_path + meta_file_suffix,
-              &i->file_info)) {
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-bool DecodeMetadata(const string& path, GeneratedCodeInfo* info) {
-  string data;
-  GOOGLE_CHECK_OK(File::GetContents(path, &data, true));
-  io::ArrayInputStream input(data.data(), data.size());
-  return info->ParseFromZeroCopyStream(&input);
-}
-
-void FindAnnotationsOnPath(
-    const GeneratedCodeInfo& info, const string& source_file,
-    const std::vector<int>& path,
-    std::vector<const GeneratedCodeInfo::Annotation*>* annotations) {
-  for (int i = 0; i < info.annotation_size(); ++i) {
-    const GeneratedCodeInfo::Annotation* annotation = &info.annotation(i);
-    if (annotation->source_file() != source_file ||
-        annotation->path_size() != path.size()) {
-      continue;
-    }
-    int node = 0;
-    for (; node < path.size(); ++node) {
-      if (annotation->path(node) != path[node]) {
-        break;
-      }
-    }
-    if (node == path.size()) {
-      annotations->push_back(annotation);
-    }
-  }
-}
-
-const GeneratedCodeInfo::Annotation* FindAnnotationOnPath(
-    const GeneratedCodeInfo& info, const string& source_file,
-    const std::vector<int>& path) {
-  std::vector<const GeneratedCodeInfo::Annotation*> annotations;
-  FindAnnotationsOnPath(info, source_file, path, &annotations);
-  if (annotations.empty()) {
-    return NULL;
-  }
-  return annotations[0];
-}
-
-bool AtLeastOneAnnotationMatchesSubstring(
-    const string& file_content,
-    const std::vector<const GeneratedCodeInfo::Annotation*>& annotations,
-    const string& expected_text) {
-  for (std::vector<const GeneratedCodeInfo::Annotation*>::const_iterator
-           i = annotations.begin(),
-           e = annotations.end();
-       i != e; ++i) {
-    const GeneratedCodeInfo::Annotation* annotation = *i;
-    uint32 begin = annotation->begin();
-    uint32 end = annotation->end();
-    if (end < begin || end > file_content.size()) {
-      return false;
-    }
-    if (file_content.substr(begin, end - begin) == expected_text) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool AnnotationMatchesSubstring(const string& file_content,
-                                const GeneratedCodeInfo::Annotation* annotation,
-                                const string& expected_text) {
-  std::vector<const GeneratedCodeInfo::Annotation*> annotations;
-  annotations.push_back(annotation);
-  return AtLeastOneAnnotationMatchesSubstring(file_content, annotations,
-                                              expected_text);
-}
-}  // namespace annotation_test_util
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/compiler/annotation_test_util.h b/src/google/protobuf/compiler/annotation_test_util.h
deleted file mode 100644
index 4598a45..0000000
--- a/src/google/protobuf/compiler/annotation_test_util.h
+++ /dev/null
@@ -1,119 +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.
-
-#ifndef GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__
-#define GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__
-
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-// Utilities that assist in writing tests for generator annotations.
-// See java/internal/annotation_unittest.cc for an example.
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace annotation_test_util {
-
-// Struct that contains the file generated from a .proto file and its
-// GeneratedCodeInfo. For example, the Java generator will fill this struct
-// (for some 'foo.proto') with:
-//   file_path = "Foo.java"
-//   file_content = content of Foo.java
-//   file_info = parsed content of Foo.java.pb.meta
-struct ExpectedOutput {
-  string file_path;
-  string file_content;
-  GeneratedCodeInfo file_info;
-  explicit ExpectedOutput(const string& file_path) : file_path(file_path) {}
-};
-
-// Creates a file with name `filename` and content `data` in temp test
-// directory.
-void AddFile(const string& filename, const string& data);
-
-// Tries to capture a FileDescriptorProto, GeneratedCodeInfo, and output
-// code from the previously added file with name `filename`.
-//
-// filename: source .proto file used to generate code.
-// plugin_specific_args: command line arguments specific to current generator.
-//     For Java, this value might be "--java_out=annotate_code:test_temp_dir"
-// meta_file_suffix: suffix of meta files that contain annotations. For Java
-//     it is ".pb.meta" because for file Foo.java meta file is Foo.java.pb.meta
-// cli: instance of command line interface to run generator. See Java's
-//     annotation_unittest.cc for an example of how to initialize it.
-// file: output parameter, will be set to the descriptor of the proto file
-//     specified in filename.
-// outputs: output parameter. If not NULL, each ExpectedOutput in the vector
-//     should have its file_path set; CaptureMetadata will fill the rest of
-//     the fields appropriately.
-bool CaptureMetadata(const string& filename, const string& plugin_specific_args,
-                     const string& meta_file_suffix, CommandLineInterface* cli,
-                     FileDescriptorProto* file,
-                     std::vector<ExpectedOutput>* outputs);
-
-bool DecodeMetadata(const string& path, GeneratedCodeInfo* info);
-
-// Finds all of the Annotations for a given source file and path.
-// See Location.path in http://google/protobuf/descriptor.proto for
-// explanation of what path vector is.
-void FindAnnotationsOnPath(
-    const GeneratedCodeInfo& info, const string& source_file,
-    const std::vector<int>& path,
-    std::vector<const GeneratedCodeInfo::Annotation*>* annotations);
-
-// Finds the Annotation for a given source file and path (or returns null if it
-// couldn't). If there are several annotations for given path, returns the first
-// one. See Location.path in
-// http://google/protobuf/descriptor.proto for explanation of what path
-// vector is.
-const GeneratedCodeInfo::Annotation* FindAnnotationOnPath(
-    const GeneratedCodeInfo& info, const string& source_file,
-    const std::vector<int>& path);
-
-// Returns true if at least one of the provided annotations covers a given
-// substring in file_content.
-bool AtLeastOneAnnotationMatchesSubstring(
-    const string& file_content,
-    const std::vector<const GeneratedCodeInfo::Annotation*>& annotations,
-    const string& expected_text);
-
-// Returns true if the provided annotation covers a given substring in
-// file_content.
-bool AnnotationMatchesSubstring(const string& file_content,
-                                const GeneratedCodeInfo::Annotation* annotation,
-                                const string& expected_text);
-
-}  // namespace annotation_test_util
-}  // namespace compiler
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__
diff --git a/src/google/protobuf/compiler/code_generator.cc b/src/google/protobuf/compiler/code_generator.cc
index 11d0f33..473eb4e 100644
--- a/src/google/protobuf/compiler/code_generator.cc
+++ b/src/google/protobuf/compiler/code_generator.cc
@@ -34,10 +34,8 @@
 
 #include <google/protobuf/compiler/code_generator.h>
 
-#include <google/protobuf/compiler/plugin.pb.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
 #include <google/protobuf/stubs/strutil.h>
 
 namespace google {
@@ -45,33 +43,6 @@
 namespace compiler {
 
 CodeGenerator::~CodeGenerator() {}
-
-bool CodeGenerator::GenerateAll(
-    const std::vector<const FileDescriptor*>& files,
-    const string& parameter,
-    GeneratorContext* generator_context,
-    string* error) const {
-  // Default implemenation is just to call the per file method, and prefix any
-  // error string with the file to provide context.
-  bool succeeded = true;
-  for (int i = 0; i < files.size(); i++) {
-    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.";
-    }
-    if (error && !error->empty()) {
-      *error = file->name() + ": " + *error;
-      break;
-    }
-    if (!succeeded) {
-      break;
-    }
-  }
-  return succeeded;
-}
-
 GeneratorContext::~GeneratorContext() {}
 
 io::ZeroCopyOutputStream*
@@ -86,25 +57,18 @@
 }
 
 void GeneratorContext::ListParsedFiles(
-    std::vector<const FileDescriptor*>* output) {
+    vector<const FileDescriptor*>* output) {
   GOOGLE_LOG(FATAL) << "This GeneratorContext does not support ListParsedFiles";
 }
 
-void GeneratorContext::GetCompilerVersion(Version* version) const {
-  version->set_major(GOOGLE_PROTOBUF_VERSION / 1000000);
-  version->set_minor(GOOGLE_PROTOBUF_VERSION / 1000 % 1000);
-  version->set_patch(GOOGLE_PROTOBUF_VERSION % 1000);
-  version->set_suffix(GOOGLE_PROTOBUF_VERSION_SUFFIX);
-}
-
 // Parses a set of comma-delimited name/value pairs.
 void ParseGeneratorParameter(const string& text,
-                             std::vector<std::pair<string, string> >* output) {
-  std::vector<string> parts = Split(text, ",", true);
+                             vector<pair<string, string> >* output) {
+  vector<string> parts = Split(text, ",", true);
 
   for (int i = 0; i < parts.size(); i++) {
     string::size_type equals_pos = parts[i].find_first_of('=');
-    std::pair<string, string> value;
+    pair<string, string> value;
     if (equals_pos == string::npos) {
       value.first = parts[i];
       value.second = "";
diff --git a/src/google/protobuf/compiler/code_generator.h b/src/google/protobuf/compiler/code_generator.h
index 4b1d90b..b989f15 100644
--- a/src/google/protobuf/compiler/code_generator.h
+++ b/src/google/protobuf/compiler/code_generator.h
@@ -50,9 +50,6 @@
 class FileDescriptor;
 
 namespace compiler {
-class AccessInfoMap;
-
-class Version;
 
 // Defined in this file.
 class CodeGenerator;
@@ -69,11 +66,11 @@
   // Generates code for the given proto file, generating one or more files in
   // the given output directory.
   //
-  // A parameter to be passed to the generator can be specified on the command
-  // line. This is intended to be used to pass generator specific parameters.
-  // It is empty if no parameter was given. ParseGeneratorParameter (below),
-  // can be used to accept multiple parameters within the single parameter
-  // command line flag.
+  // A parameter to be passed to the generator can be specified on the
+  // command line.  This is intended to be used by Java and similar languages
+  // to specify which specific class from the proto file is to be generated,
+  // though it could have other uses as well.  It is empty if no parameter was
+  // given.
   //
   // Returns true if successful.  Otherwise, sets *error to a description of
   // the problem (e.g. "invalid parameter") and returns false.
@@ -82,27 +79,36 @@
                         GeneratorContext* generator_context,
                         string* error) const = 0;
 
-  // Generates code for all given proto files.
+  // Generates code for all given proto files, generating one or more files in
+  // the given output directory.
   //
-  // WARNING: The canonical code generator design produces one or two output
-  // files per input .proto file, and we do not wish to encourage alternate
-  // designs.
+  // This method should be called instead of |Generate()| when
+  // |HasGenerateAll()| returns |true|. It is used to emulate legacy semantics
+  // when more than one `.proto` file is specified on one compiler invocation.
+  //
+  // WARNING: Please do not use unless legacy semantics force the code generator
+  // to produce a single output file for all input files, or otherwise require
+  // an examination of all input files first. The canonical code generator
+  // design produces one output file per input .proto file, and we do not wish
+  // to encourage alternate designs.
   //
   // A parameter is given as passed on the command line, as in |Generate()|
   // above.
   //
   // Returns true if successful.  Otherwise, sets *error to a description of
   // the problem (e.g. "invalid parameter") and returns false.
-  virtual bool GenerateAll(const std::vector<const FileDescriptor*>& files,
+  virtual bool GenerateAll(const vector<const FileDescriptor*>& files,
                            const string& parameter,
                            GeneratorContext* generator_context,
-                           string* error) const;
+                           string* error) const {
+    *error = "Unimplemented GenerateAll() method.";
+    return false;
+  }
 
-  // This is no longer used, but this class is part of the opensource protobuf
-  // library, so it has to remain to keep vtables the same for the current
-  // version of the library. When protobufs does a api breaking change, the
-  // method can be removed.
-  virtual bool HasGenerateAll() const { return true; }
+  // Returns true if the code generator expects to receive all FileDescriptors
+  // at once (via |GenerateAll()|), rather than one at a time (via
+  // |Generate()|). This is required to implement legacy semantics.
+  virtual bool HasGenerateAll() const { return false; }
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodeGenerator);
@@ -114,8 +120,7 @@
 // runs.
 class LIBPROTOC_EXPORT GeneratorContext {
  public:
-  inline GeneratorContext() {
-  }
+  inline GeneratorContext() {}
   virtual ~GeneratorContext();
 
   // Opens the given file, truncating it if it exists, and returns a
@@ -145,12 +150,7 @@
   // Returns a vector of FileDescriptors for all the files being compiled
   // in this run.  Useful for languages, such as Go, that treat files
   // differently when compiled as a set rather than individually.
-  virtual void ListParsedFiles(std::vector<const FileDescriptor*>* output);
-
-  // Retrieves the version number of the protocol compiler associated with
-  // this GeneratorContext.
-  virtual void GetCompilerVersion(Version* version) const;
-
+  virtual void ListParsedFiles(vector<const FileDescriptor*>* output);
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratorContext);
@@ -166,8 +166,8 @@
 //   "foo=bar,baz,qux=corge"
 // parses to the pairs:
 //   ("foo", "bar"), ("baz", ""), ("qux", "corge")
-void ParseGeneratorParameter(
-    const string&, std::vector<std::pair<string, string> >*);
+extern void ParseGeneratorParameter(const string&,
+            vector<pair<string, string> >*);
 
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc
index 1f6d748..fcad6b6 100644
--- a/src/google/protobuf/compiler/command_line_interface.cc
+++ b/src/google/protobuf/compiler/command_line_interface.cc
@@ -33,21 +33,16 @@
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
 #include <google/protobuf/compiler/command_line_interface.h>
-
-
 #include <google/protobuf/stubs/platform_macros.h>
 
 #include <stdio.h>
 #include <sys/types.h>
-#ifdef major
-#undef major
-#endif
-#ifdef minor
-#undef minor
-#endif
 #include <sys/stat.h>
 #include <fcntl.h>
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#include <io.h>
+#include <direct.h>
+#else
 #include <unistd.h>
 #endif
 #include <errno.h>
@@ -55,7 +50,9 @@
 #include <iostream>
 #include <ctype.h>
 
+#ifdef GOOGLE_PROTOBUF_ARCH_SPARC
 #include <limits.h> //For PATH_MAX
+#endif
 
 #include <memory>
 #ifndef _SHARED_PTR_H
@@ -67,30 +64,45 @@
 #endif
 
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/stringprintf.h>
+#include <google/protobuf/compiler/importer.h>
+#include <google/protobuf/compiler/code_generator.h>
+#include <google/protobuf/compiler/plugin.pb.h>
 #include <google/protobuf/compiler/subprocess.h>
 #include <google/protobuf/compiler/zip_writer.h>
-#include <google/protobuf/compiler/plugin.pb.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/importer.h>
-#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/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/text_format.h>
+#include <google/protobuf/dynamic_message.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/io/printer.h>
+#include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/strutil.h>
 #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>
 
 
 namespace google {
 namespace protobuf {
 namespace compiler {
 
+#if defined(_WIN32)
+#define mkdir(name, mode) mkdir(name)
+#ifndef W_OK
+#define W_OK 02  // not defined by MSVC for whatever reason
+#endif
+#ifndef F_OK
+#define F_OK 00  // not defined by MSVC for whatever reason
+#endif
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+#endif
+
 #ifndef O_BINARY
 #ifdef _O_BINARY
 #define O_BINARY _O_BINARY
@@ -100,20 +112,12 @@
 #endif
 
 namespace {
-#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;
+#if defined(_WIN32) && !defined(__CYGWIN__)
+static const char* kPathSeparator = ";";
+#else
+static const char* kPathSeparator = ":";
 #endif
 
-static const char* kDefaultDirectDependenciesViolationMsg =
-    "File is imported but not declared in --direct_dependencies: %s";
-
 // Returns true if the text looks like a Windows-style absolute path, starting
 // with a drive letter.  Example:  "C:\foo".  TODO(kenton):  Share this with
 // copy in importer.cc?
@@ -130,9 +134,9 @@
 
 void SetFdToTextMode(int fd) {
 #ifdef _WIN32
-  if (setmode(fd, _O_TEXT) == -1) {
+  if (_setmode(fd, _O_TEXT) == -1) {
     // This should never happen, I think.
-    GOOGLE_LOG(WARNING) << "setmode(" << fd << ", _O_TEXT): " << strerror(errno);
+    GOOGLE_LOG(WARNING) << "_setmode(" << fd << ", _O_TEXT): " << strerror(errno);
   }
 #endif
   // (Text and binary are the same on non-Windows platforms.)
@@ -140,9 +144,9 @@
 
 void SetFdToBinaryMode(int fd) {
 #ifdef _WIN32
-  if (setmode(fd, _O_BINARY) == -1) {
+  if (_setmode(fd, _O_BINARY) == -1) {
     // This should never happen, I think.
-    GOOGLE_LOG(WARNING) << "setmode(" << fd << ", _O_BINARY): " << strerror(errno);
+    GOOGLE_LOG(WARNING) << "_setmode(" << fd << ", _O_BINARY): " << strerror(errno);
   }
 #endif
   // (Text and binary are the same on non-Windows platforms.)
@@ -171,8 +175,7 @@
 // directories listed in |filename|.
 bool TryCreateParentDirectory(const string& prefix, const string& filename) {
   // Recursively create parent directories to the output file.
-  std::vector<string> parts =
-      Split(filename, "/", true);
+  vector<string> parts = Split(filename, "/", true);
   string path_so_far = prefix;
   for (int i = 0; i < parts.size() - 1; i++) {
     path_so_far += parts[i];
@@ -224,7 +227,7 @@
   return access(file_path.c_str(), F_OK) != -1;
 }
 
-// Add the paths where google/protobuf/descriptor.proto and other well-known
+// Add the paths where google/protobuf/descritor.proto and other well-known
 // type protos are installed.
 void AddDefaultProtoPaths(vector<pair<string, string> >* paths) {
   // TODO(xiaofeng): The code currently only checks relative paths of where
@@ -261,29 +264,19 @@
     return;
   }
 }
-
-string PluginName(const string& plugin_prefix, const string& directive) {
-  // Assuming the directive starts with "--" and ends with "_out" or "_opt",
-  // strip the "--" and "_out/_opt" and add the plugin prefix.
-  return plugin_prefix + "gen-" + directive.substr(2, directive.size() - 6);
-}
-
 }  // namespace
 
 // A MultiFileErrorCollector that prints errors to stderr.
-class CommandLineInterface::ErrorPrinter
-    : public MultiFileErrorCollector,
-      public io::ErrorCollector,
-      public DescriptorPool::ErrorCollector {
+class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector,
+                                           public io::ErrorCollector {
  public:
   ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL)
-    : format_(format), tree_(tree), found_errors_(false) {}
+    : format_(format), tree_(tree) {}
   ~ErrorPrinter() {}
 
   // implements MultiFileErrorCollector ------------------------------
   void AddError(const string& filename, int line, int column,
                 const string& message) {
-    found_errors_ = true;
     AddErrorOrWarning(filename, line, column, message, "error", std::cerr);
   }
 
@@ -301,31 +294,10 @@
     AddErrorOrWarning("input", line, column, message, "warning", std::clog);
   }
 
-  // implements DescriptorPool::ErrorCollector-------------------------
-  void AddError(
-      const string& filename,
-      const string& element_name,
-      const Message* descriptor,
-      ErrorLocation location,
-      const string& message) {
-    AddErrorOrWarning(filename, -1, -1, message, "error", std::cerr);
-  }
-
-  void AddWarning(
-      const string& filename,
-      const string& element_name,
-      const Message* descriptor,
-      ErrorLocation location,
-      const string& message) {
-    AddErrorOrWarning(filename, -1, -1, message, "warning", std::clog);
-  }
-
-  bool FoundErrors() const { return found_errors_; }
-
  private:
-  void AddErrorOrWarning(const string& filename, int line, int column,
-                         const string& message, const string& type,
-                         std::ostream& out) {
+  void AddErrorOrWarning(
+      const string& filename, int line, int column,
+      const string& message, const string& type, ostream& out) {
     // Print full path when running under MSVS
     string dfile;
     if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS &&
@@ -360,7 +332,6 @@
 
   const ErrorFormat format_;
   DiskSourceTree *tree_;
-  bool found_errors_;
 };
 
 // -------------------------------------------------------------------
@@ -369,7 +340,7 @@
 // them all to disk on demand.
 class CommandLineInterface::GeneratorContextImpl : public GeneratorContext {
  public:
-  GeneratorContextImpl(const std::vector<const FileDescriptor*>& parsed_files);
+  GeneratorContextImpl(const vector<const FileDescriptor*>& parsed_files);
   ~GeneratorContextImpl();
 
   // Write all files in the directory to disk at the given output location,
@@ -385,14 +356,14 @@
   void AddJarManifest();
 
   // Get name of all output files.
-  void GetOutputFilenames(std::vector<string>* output_filenames);
+  void GetOutputFilenames(vector<string>* output_filenames);
 
   // implements GeneratorContext --------------------------------------
   io::ZeroCopyOutputStream* Open(const string& filename);
   io::ZeroCopyOutputStream* OpenForAppend(const string& filename);
   io::ZeroCopyOutputStream* OpenForInsert(
       const string& filename, const string& insertion_point);
-  void ListParsedFiles(std::vector<const FileDescriptor*>* output) {
+  void ListParsedFiles(vector<const FileDescriptor*>* output) {
     *output = parsed_files_;
   }
 
@@ -401,8 +372,8 @@
 
   // map instead of hash_map so that files are written in order (good when
   // writing zips).
-  std::map<string, string*> files_;
-  const std::vector<const FileDescriptor*>& parsed_files_;
+  map<string, string*> files_;
+  const vector<const FileDescriptor*>& parsed_files_;
   bool had_error_;
 };
 
@@ -421,13 +392,6 @@
   virtual int64 ByteCount() const           { return inner_->ByteCount();      }
 
  private:
-  // Checks to see if "filename_.meta" exists in directory_; if so, fixes the
-  // offsets in that GeneratedCodeInfo record to reflect bytes inserted in
-  // filename_ at original offset insertion_offset with length insertion_length.
-  // We assume that insertions will not occur within any given annotated span
-  // of text.
-  void UpdateMetadata(size_t insertion_offset, size_t insertion_length);
-
   // Where to insert the string when it's done.
   GeneratorContextImpl* directory_;
   string filename_;
@@ -446,9 +410,10 @@
 // -------------------------------------------------------------------
 
 CommandLineInterface::GeneratorContextImpl::GeneratorContextImpl(
-    const std::vector<const FileDescriptor*>& parsed_files)
+    const vector<const FileDescriptor*>& parsed_files)
     : parsed_files_(parsed_files),
-      had_error_(false) {}
+      had_error_(false) {
+}
 
 CommandLineInterface::GeneratorContextImpl::~GeneratorContextImpl() {
   STLDeleteValues(&files_);
@@ -464,7 +429,7 @@
     return false;
   }
 
-  for (std::map<string, string*>::const_iterator iter = files_.begin();
+  for (map<string, string*>::const_iterator iter = files_.begin();
        iter != files_.end(); ++iter) {
     const string& relative_filename = iter->first;
     const char* data = iter->second->data();
@@ -552,7 +517,7 @@
   io::FileOutputStream stream(file_descriptor);
   ZipWriter zip_writer(&stream);
 
-  for (std::map<string, string*>::const_iterator iter = files_.begin();
+  for (map<string, string*>::const_iterator iter = files_.begin();
        iter != files_.end(); ++iter) {
     zip_writer.Write(iter->first, *iter->second);
   }
@@ -581,8 +546,8 @@
 }
 
 void CommandLineInterface::GeneratorContextImpl::GetOutputFilenames(
-    std::vector<string>* output_filenames) {
-  for (std::map<string, string*>::iterator iter = files_.begin();
+    vector<string>* output_filenames) {
+  for (map<string, string*>::iterator iter = files_.begin();
        iter != files_.end(); ++iter) {
     output_filenames->push_back(iter->first);
   }
@@ -624,44 +589,6 @@
       inner_(new io::StringOutputStream(&data_)) {
 }
 
-void CommandLineInterface::MemoryOutputStream::UpdateMetadata(
-    size_t insertion_offset, size_t insertion_length) {
-  std::map<string, string*>::iterator meta_file =
-      directory_->files_.find(filename_ + ".meta");
-  if (meta_file == directory_->files_.end() || !meta_file->second) {
-    // No metadata was recorded for this file.
-    return;
-  }
-  string* encoded_data = meta_file->second;
-  GeneratedCodeInfo metadata;
-  bool is_text_format = false;
-  if (!metadata.ParseFromString(*encoded_data)) {
-    if (!TextFormat::ParseFromString(*encoded_data, &metadata)) {
-      // The metadata is invalid.
-      std::cerr << filename_
-                << ".meta: Could not parse metadata as wire or text format."
-                << std::endl;
-      return;
-    }
-    // Generators that use the public plugin interface emit text-format
-    // metadata (because in the public plugin protocol, file content must be
-    // UTF8-encoded strings).
-    is_text_format = true;
-  }
-  for (int i = 0; i < metadata.annotation_size(); ++i) {
-    GeneratedCodeInfo::Annotation* annotation = metadata.mutable_annotation(i);
-    if (annotation->begin() >= insertion_offset) {
-      annotation->set_begin(annotation->begin() + insertion_length);
-      annotation->set_end(annotation->end() + insertion_length);
-    }
-  }
-  if (is_text_format) {
-    TextFormat::PrintToString(metadata, encoded_data);
-  } else {
-    metadata.SerializeToString(encoded_data);
-  }
-}
-
 CommandLineInterface::MemoryOutputStream::~MemoryOutputStream() {
   // Make sure all data has been written.
   inner_.reset();
@@ -687,7 +614,7 @@
   } else {
     // This was an OpenForInsert().
 
-    // If the data doesn't end with a clean line break, add one.
+    // If the data doens't end with a clean line break, add one.
     if (!data_.empty() && data_[data_.size() - 1] != '\n') {
       data_.push_back('\n');
     }
@@ -714,23 +641,18 @@
       return;
     }
 
-    if ((pos > 3) && (target->substr(pos - 3, 2) == "/*")) {
-      // Support for inline "/* @@protoc_insertion_point() */"
-      pos = pos - 3;
+    // Seek backwards to the beginning of the line, which is where we will
+    // insert the data.  Note that this has the effect of pushing the insertion
+    // point down, so the data is inserted before it.  This is intentional
+    // because it means that multiple insertions at the same point will end
+    // up in the expected order in the final output.
+    pos = target->find_last_of('\n', pos);
+    if (pos == string::npos) {
+      // Insertion point is on the first line.
+      pos = 0;
     } else {
-      // Seek backwards to the beginning of the line, which is where we will
-      // insert the data.  Note that this has the effect of pushing the
-      // insertion point down, so the data is inserted before it.  This is
-      // intentional because it means that multiple insertions at the same point
-      // will end up in the expected order in the final output.
-      pos = target->find_last_of('\n', pos);
-      if (pos == string::npos) {
-        // Insertion point is on the first line.
-        pos = 0;
-      } else {
-        // Advance to character after '\n'.
-        ++pos;
-      }
+      // Advance to character after '\n'.
+      ++pos;
     }
 
     // Extract indent.
@@ -739,7 +661,6 @@
     if (indent_.empty()) {
       // No indent.  This makes things easier.
       target->insert(pos, data_);
-      UpdateMetadata(pos, data_.size());
     } else {
       // Calculate how much space we need.
       int indent_size = 0;
@@ -749,7 +670,6 @@
 
       // Make a hole for it.
       target->insert(pos, data_.size() + indent_size, '\0');
-      UpdateMetadata(pos, data_.size() + indent_size);
 
       // Now copy in the data.
       string::size_type data_pos = 0;
@@ -777,22 +697,14 @@
 
 // ===================================================================
 
-#if defined(_WIN32) && !defined(__CYGWIN__)
-const char* const CommandLineInterface::kPathSeparator = ";";
-#else
-const char* const CommandLineInterface::kPathSeparator = ":";
-#endif
-
 CommandLineInterface::CommandLineInterface()
-    : mode_(MODE_COMPILE),
-      print_mode_(PRINT_NONE),
-      error_format_(ERROR_FORMAT_GCC),
-      direct_dependencies_explicitly_set_(false),
-      direct_dependencies_violation_msg_(
-          kDefaultDirectDependenciesViolationMsg),
-      imports_in_descriptor_set_(false),
-      source_info_in_descriptor_set_(false),
-      disallow_services_(false) {}
+  : mode_(MODE_COMPILE),
+    print_mode_(PRINT_NONE),
+    error_format_(ERROR_FORMAT_GCC),
+    imports_in_descriptor_set_(false),
+    source_info_in_descriptor_set_(false),
+    disallow_services_(false),
+    inputs_are_proto_path_relative_(false) {}
 CommandLineInterface::~CommandLineInterface() {}
 
 void CommandLineInterface::RegisterGenerator(const string& flag_name,
@@ -833,41 +745,43 @@
       break;
   }
 
-  std::vector<const FileDescriptor*> parsed_files;
-  // null unless descriptor_set_in_names_.empty()
-  google::protobuf::scoped_ptr<DiskSourceTree> disk_source_tree;
-  google::protobuf::scoped_ptr<ErrorPrinter> error_collector;
-  google::protobuf::scoped_ptr<DescriptorPool> descriptor_pool;
-  google::protobuf::scoped_ptr<DescriptorDatabase> descriptor_database;
-  if (descriptor_set_in_names_.empty()) {
-    disk_source_tree.reset(new DiskSourceTree());
-    if (!InitializeDiskSourceTree(disk_source_tree.get())) {
-      return 1;
-    }
-    error_collector.reset(
-        new ErrorPrinter(error_format_, disk_source_tree.get()));
+  AddDefaultProtoPaths(&proto_path_);
 
-    SourceTreeDescriptorDatabase* database =
-        new SourceTreeDescriptorDatabase(disk_source_tree.get());
-    database->RecordErrorsTo(error_collector.get());
-    descriptor_database.reset(database);
-    descriptor_pool.reset(new DescriptorPool(
-        descriptor_database.get(), database->GetValidationErrorCollector()));
-  } else {
-    error_collector.reset(new ErrorPrinter(error_format_));
-
-    SimpleDescriptorDatabase* database = new SimpleDescriptorDatabase();
-    descriptor_database.reset(database);
-    if (!PopulateSimpleDescriptorDatabase(database)) {
-      return 1;
-    }
-    descriptor_pool.reset(new DescriptorPool(database, error_collector.get()));
-  }
-  descriptor_pool->EnforceWeakDependencies(true);
-  if (!ParseInputFiles(descriptor_pool.get(), &parsed_files)) {
-    return 1;
+  // Set up the source tree.
+  DiskSourceTree source_tree;
+  for (int i = 0; i < proto_path_.size(); i++) {
+    source_tree.MapPath(proto_path_[i].first, proto_path_[i].second);
   }
 
+  // Map input files to virtual paths if necessary.
+  if (!inputs_are_proto_path_relative_) {
+    if (!MakeInputsBeProtoPathRelative(&source_tree)) {
+      return 1;
+    }
+  }
+
+  // Allocate the Importer.
+  ErrorPrinter error_collector(error_format_, &source_tree);
+  Importer importer(&source_tree, &error_collector);
+
+  vector<const FileDescriptor*> parsed_files;
+
+  // Parse each file.
+  for (int i = 0; i < input_files_.size(); i++) {
+    // Import the file.
+    importer.AddUnusedImportTrackFile(input_files_[i]);
+    const FileDescriptor* parsed_file = importer.Import(input_files_[i]);
+    importer.ClearUnusedImportTrackFiles();
+    if (parsed_file == NULL) return 1;
+    parsed_files.push_back(parsed_file);
+
+    // Enforce --disallow_services.
+    if (disallow_services_ && parsed_file->service_count() > 0) {
+      cerr << parsed_file->name() << ": This file contains services, but "
+              "--disallow_services was used." << endl;
+      return 1;
+    }
+  }
 
   // We construct a separate GeneratorContext for each output location.  Note
   // that two code generators may output to the same location, in which case
@@ -919,16 +833,15 @@
   }
 
   if (!dependency_out_name_.empty()) {
-    GOOGLE_DCHECK(disk_source_tree.get());
     if (!GenerateDependencyManifestFile(parsed_files, output_directories,
-                                        disk_source_tree.get())) {
+                                        &source_tree)) {
       return 1;
     }
   }
 
   STLDeleteValues(&output_directories);
 
-  if (!descriptor_set_out_name_.empty()) {
+  if (!descriptor_set_name_.empty()) {
     if (!WriteDescriptorSet(parsed_files)) {
       return 1;
     }
@@ -947,16 +860,12 @@
         return 1;
       }
     } else {
-      if (!EncodeOrDecode(descriptor_pool.get())) {
+      if (!EncodeOrDecode(importer.pool())) {
         return 1;
       }
     }
   }
 
-  if (error_collector->FoundErrors()) {
-    return 1;
-  }
-
   if (mode_ == MODE_PRINT) {
     switch (print_mode_) {
       case PRINT_FREE_FIELDS:
@@ -969,7 +878,7 @@
         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 CommonadLineInterface.";
         return 1;
 
       // Do not add a default case.
@@ -979,125 +888,15 @@
   return 0;
 }
 
-bool CommandLineInterface::InitializeDiskSourceTree(
-    DiskSourceTree* source_tree) {
-  AddDefaultProtoPaths(&proto_path_);
-
-  // Set up the source tree.
-  for (int i = 0; i < proto_path_.size(); i++) {
-    source_tree->MapPath(proto_path_[i].first, proto_path_[i].second);
-  }
-
-  // Map input files to virtual paths if possible.
-  if (!MakeInputsBeProtoPathRelative(source_tree)) {
-    return false;
-  }
-  return true;
-}
-
-bool CommandLineInterface::PopulateSimpleDescriptorDatabase(
-    SimpleDescriptorDatabase* database) {
-  for (int i = 0; i < descriptor_set_in_names_.size(); i++) {
-    int fd;
-    do {
-      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;
-      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::endl;
-      return false;
-    }
-
-    if (!parsed) {
-      std::cerr << descriptor_set_in_names_[i] << ": Unable to parse."
-                << std::endl;
-      return false;
-    }
-
-    for (int j = 0; j < file_descriptor_set.file_size(); j++) {
-      FileDescriptorProto previously_added_file_descriptor_proto;
-      if (database->FindFileByName(file_descriptor_set.file(j).name(),
-                                   &previously_added_file_descriptor_proto)) {
-        // already present - skip
-        continue;
-      }
-      if (!database->Add(file_descriptor_set.file(j))) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-bool CommandLineInterface::ParseInputFiles(
-    DescriptorPool* descriptor_pool,
-    std::vector<const FileDescriptor*>* parsed_files) {
-
-  // Parse each file.
-  for (int i = 0; i < input_files_.size(); i++) {
-    // Import the file.
-    descriptor_pool->AddUnusedImportTrackFile(input_files_[i]);
-    const FileDescriptor* parsed_file =
-        descriptor_pool->FindFileByName(input_files_[i]);
-    descriptor_pool->ClearUnusedImportTrackFiles();
-    if (parsed_file == NULL) {
-      if (!descriptor_set_in_names_.empty()) {
-        std::cerr << input_files_[i] << ": " << strerror(ENOENT) << std::endl;
-      }
-      return false;
-    }
-    parsed_files->push_back(parsed_file);
-
-    // 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;
-      return false;
-    }
-
-    // Enforce --direct_dependencies
-    if (direct_dependencies_explicitly_set_) {
-      bool indirect_imports = false;
-      for (int i = 0; i < parsed_file->dependency_count(); i++) {
-        if (direct_dependencies_.find(parsed_file->dependency(i)->name()) ==
-            direct_dependencies_.end()) {
-          indirect_imports = true;
-          std::cerr << parsed_file->name() << ": "
-                    << StringReplace(direct_dependencies_violation_msg_, "%s",
-                                     parsed_file->dependency(i)->name(),
-                                     true /* replace_all */)
-                    << std::endl;
-        }
-      }
-      if (indirect_imports) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
 void CommandLineInterface::Clear() {
   // Clear all members that are set by Run().  Note that we must not clear
   // members which are set by other methods before Run() is called.
   executable_name_.clear();
   proto_path_.clear();
   input_files_.clear();
-  direct_dependencies_.clear();
-  direct_dependencies_violation_msg_ = kDefaultDirectDependenciesViolationMsg;
   output_directives_.clear();
   codec_type_.clear();
-  descriptor_set_in_names_.clear();
-  descriptor_set_out_name_.clear();
+  descriptor_set_name_.clear();
   dependency_out_name_.clear();
 
   mode_ = MODE_COMPILE;
@@ -1105,23 +904,11 @@
   imports_in_descriptor_set_ = false;
   source_info_in_descriptor_set_ = false;
   disallow_services_ = false;
-  direct_dependencies_explicitly_set_ = false;
 }
 
 bool CommandLineInterface::MakeInputsBeProtoPathRelative(
     DiskSourceTree* source_tree) {
   for (int i = 0; i < input_files_.size(); i++) {
-    // If the input file path is not a physical file path, it must be a virtual
-    // path.
-    if (access(input_files_[i].c_str(), F_OK) < 0) {
-      string disk_file;
-      if (source_tree->VirtualFileToDiskFile(input_files_[i], &disk_file)) {
-        return true;
-      } else {
-        std::cerr << input_files_[i] << ": " << strerror(ENOENT) << std::endl;
-        return false;
-      }
-    }
     string virtual_file, shadowing_disk_file;
     switch (source_tree->DiskFileToVirtualFile(
         input_files_[i], &virtual_file, &shadowing_disk_file)) {
@@ -1139,14 +926,12 @@
       case DiskSourceTree::CANNOT_OPEN:
         std::cerr << input_files_[i] << ": " << strerror(errno) << std::endl;
         return false;
-      case DiskSourceTree::NO_MAPPING: {
-        // Try to interpret the path as a virtual path.
-        string disk_file;
-        if (source_tree->VirtualFileToDiskFile(input_files_[i], &disk_file)) {
-          return true;
+      case DiskSourceTree::NO_MAPPING:
+        // First check if the file exists at all.
+        if (access(input_files_[i].c_str(), F_OK) < 0) {
+          // File does not even exist.
+          std::cerr << input_files_[i] << ": " << strerror(ENOENT) << std::endl;
         } else {
-          // The input file path can't be mapped to any --proto_path and it also
-          // can't be interpreted as a virtual path.
           std::cerr
               << input_files_[i]
               << ": File does not reside within any path "
@@ -1155,56 +940,25 @@
                  "proto_path must be an exact prefix of the .proto file "
                  "names -- protoc is too dumb to figure out when two paths "
                  "(e.g. absolute and relative) are equivalent (it's harder "
-                 "than you think)."
-              << std::endl;
-          return false;
+                 "than you think)." << std::endl;
         }
-      }
+        return false;
     }
   }
 
   return true;
 }
 
-bool CommandLineInterface::ExpandArgumentFile(const string& file,
-                                              std::vector<string>* arguments) {
-  // The argument file is searched in the working directory only. We don't
-  // use the proto import path here.
-  std::ifstream file_stream(file.c_str());
-  if (!file_stream.is_open()) {
-    return false;
-  }
-  string argument;
-  // We don't support any kind of shell expansion right now.
-  while (std::getline(file_stream, argument)) {
-    arguments->push_back(argument);
-  }
-  return true;
-}
 
 CommandLineInterface::ParseArgumentStatus
 CommandLineInterface::ParseArguments(int argc, const char* const argv[]) {
   executable_name_ = argv[0];
 
-  std::vector<string> arguments;
+  vector<string> arguments;
   for (int i = 1; i < argc; ++i) {
-    if (argv[i][0] == '@') {
-      if (!ExpandArgumentFile(argv[i] + 1, &arguments)) {
-        std::cerr << "Failed to open argument file: " << (argv[i] + 1)
-                  << std::endl;
-        return PARSE_ARGUMENT_FAIL;
-      }
-      continue;
-    }
     arguments.push_back(argv[i]);
   }
 
-  // if no arguments are given, show help
-  if (arguments.empty()) {
-    PrintHelpText();
-    return PARSE_ARGUMENT_DONE_AND_EXIT;  // Exit without running compiler.
-  }
-
   // Iterate through all arguments and parse them.
   for (int i = 0; i < arguments.size(); ++i) {
     string name, value;
@@ -1229,42 +983,12 @@
       return status;
   }
 
-  // Make sure each plugin option has a matching plugin output.
-  bool foundUnknownPluginOption = false;
-  for (std::map<string, string>::const_iterator i = plugin_parameters_.begin();
-       i != plugin_parameters_.end(); ++i) {
-    if (plugins_.find(i->first) != plugins_.end()) {
-      continue;
-    }
-    bool foundImplicitPlugin = false;
-    for (std::vector<OutputDirective>::const_iterator j = output_directives_.begin();
-         j != output_directives_.end(); ++j) {
-      if (j->generator == NULL) {
-        string plugin_name = PluginName(plugin_prefix_ , j->name);
-        if (plugin_name == i->first) {
-          foundImplicitPlugin = true;
-          break;
-        }
-      }
-    }
-    if (!foundImplicitPlugin) {
-      std::cerr << "Unknown flag: "
-                // strip prefix + "gen-" and add back "_opt"
-                << "--" + i->first.substr(plugin_prefix_.size() + 4) + "_opt"
-                << std::endl;
-      foundUnknownPluginOption = true;
-    }
-  }
-  if (foundUnknownPluginOption) {
-    return PARSE_ARGUMENT_FAIL;
-  }
-
   // If no --proto_path was given, use the current working directory.
   if (proto_path_.empty()) {
     // Don't use make_pair as the old/default standard library on Solaris
     // doesn't support it without explicit template parameters, which are
     // incompatible with C++0x's make_pair.
-    proto_path_.push_back(std::pair<string, string>("", "."));
+    proto_path_.push_back(pair<string, string>("", "."));
   }
 
   // Check some errror cases.
@@ -1278,7 +1002,7 @@
     return PARSE_ARGUMENT_FAIL;
   }
   if (mode_ == MODE_COMPILE && output_directives_.empty() &&
-      descriptor_set_out_name_.empty()) {
+      descriptor_set_name_.empty()) {
     std::cerr << "Missing output directives." << std::endl;
     return PARSE_ARGUMENT_FAIL;
   }
@@ -1293,11 +1017,11 @@
         << std::endl;
     return PARSE_ARGUMENT_FAIL;
   }
-  if (imports_in_descriptor_set_ && descriptor_set_out_name_.empty()) {
+  if (imports_in_descriptor_set_ && descriptor_set_name_.empty()) {
     std::cerr << "--include_imports only makes sense when combined with "
                  "--descriptor_set_out." << std::endl;
   }
-  if (source_info_in_descriptor_set_ && descriptor_set_out_name_.empty()) {
+  if (source_info_in_descriptor_set_ && descriptor_set_name_.empty()) {
     std::cerr << "--include_source_info only makes sense when combined with "
                  "--descriptor_set_out." << std::endl;
   }
@@ -1384,20 +1108,11 @@
     input_files_.push_back(value);
 
   } else if (name == "-I" || name == "--proto_path") {
-    if (!descriptor_set_in_names_.empty()) {
-      std::cerr << "Only one of " << name
-                << " and --descriptor_set_in can be specified."
-                << std::endl;
-      return PARSE_ARGUMENT_FAIL;
-    }
-
     // Java's -classpath (and some other languages) delimits path components
     // with colons.  Let's accept that syntax too just to make things more
     // intuitive.
-    std::vector<string> parts = Split(
-        value,
-        CommandLineInterface::kPathSeparator,
-        true);
+    vector<string> parts = Split(
+        value, kPathSeparator, true);
 
     for (int i = 0; i < parts.size(); i++) {
       string virtual_path;
@@ -1421,72 +1136,18 @@
 
       // Make sure disk path exists, warn otherwise.
       if (access(disk_path.c_str(), F_OK) < 0) {
-        // Try the original path; it may have just happed to have a '=' in it.
-        if (access(parts[i].c_str(), F_OK) < 0) {
-          std::cerr << disk_path << ": warning: directory does not exist."
-                    << std::endl;
-        } else {
-          virtual_path = "";
-          disk_path = parts[i];
-        }
+        std::cerr << disk_path << ": warning: directory does not exist."
+                  << std::endl;
       }
 
       // Don't use make_pair as the old/default standard library on Solaris
       // doesn't support it without explicit template parameters, which are
       // incompatible with C++0x's make_pair.
-      proto_path_.push_back(std::pair<string, string>(virtual_path, disk_path));
+      proto_path_.push_back(pair<string, string>(virtual_path, disk_path));
     }
 
-  } 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::endl;
-      return PARSE_ARGUMENT_FAIL;
-    }
-
-    direct_dependencies_explicitly_set_ = true;
-    std::vector<string> direct = Split(
-        value, ":", true);
-    GOOGLE_DCHECK(direct_dependencies_.empty());
-    direct_dependencies_.insert(direct.begin(), direct.end());
-
-  } else if (name == "--direct_dependencies_violation_msg") {
-    direct_dependencies_violation_msg_ = value;
-
-  } 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;
-      return PARSE_ARGUMENT_FAIL;
-    }
-    if (value.empty()) {
-      std::cerr << name << " requires a non-empty value." << std::endl;
-      return PARSE_ARGUMENT_FAIL;
-    }
-    if (!proto_path_.empty()) {
-      std::cerr << "Only one of " << name
-                << " and --proto_path can be specified."
-                << std::endl;
-      return PARSE_ARGUMENT_FAIL;
-    }
-    if (!dependency_out_name_.empty()) {
-      std::cerr << name << " cannot be used with --dependency_out."
-                << std::endl;
-      return PARSE_ARGUMENT_FAIL;
-    }
-
-    descriptor_set_in_names_ = Split(
-      value,
-      CommandLineInterface::kPathSeparator,
-      true);
-
   } else if (name == "-o" || name == "--descriptor_set_out") {
-    if (!descriptor_set_out_name_.empty()) {
+    if (!descriptor_set_name_.empty()) {
       std::cerr << name << " may only be passed once." << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
@@ -1500,7 +1161,7 @@
              "same time." << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
-    descriptor_set_out_name_ = value;
+    descriptor_set_name_ = value;
 
   } else if (name == "--dependency_out") {
     if (!dependency_out_name_.empty()) {
@@ -1511,11 +1172,6 @@
       std::cerr << name << " requires a non-empty value." << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
-    if (!descriptor_set_in_names_.empty()) {
-      std::cerr << name << " cannot be used with --descriptor_set_in."
-                << std::endl;
-      return PARSE_ARGUMENT_FAIL;
-    }
     dependency_out_name_ = value;
 
   } else if (name == "--include_imports") {
@@ -1540,9 +1196,9 @@
     if (!version_info_.empty()) {
       std::cout << version_info_ << std::endl;
     }
-    std::cout << "libprotoc "
+    cout << "libprotoc "
          << protobuf::internal::VersionString(GOOGLE_PROTOBUF_VERSION)
-         << std::endl;
+         << endl;
     return PARSE_ARGUMENT_DONE_AND_EXIT;  // Exit without running compiler.
 
   } else if (name == "--disallow_services") {
@@ -1555,7 +1211,7 @@
                 << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
-    if (!output_directives_.empty() || !descriptor_set_out_name_.empty()) {
+    if (!output_directives_.empty() || !descriptor_set_name_.empty()) {
       std::cerr << "Cannot use " << name
                 << " and generate code or descriptors at the same time."
                 << std::endl;
@@ -1621,7 +1277,7 @@
                 << "other info at the same time." << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
-    if (!output_directives_.empty() || !descriptor_set_out_name_.empty()) {
+    if (!output_directives_.empty() || !descriptor_set_name_.empty()) {
       std::cerr << "Cannot use " << name
                 << " and generate code or descriptors at the same time."
                 << std::endl;
@@ -1629,7 +1285,6 @@
     }
     mode_ = MODE_PRINT;
     print_mode_ = PRINT_FREE_FIELDS;
-  } else if (name == "--profile_path") {
   } else {
     // Some other flag.  Look it up in the generators list.
     const GeneratorInfo* generator_info =
@@ -1638,22 +1293,15 @@
         (plugin_prefix_.empty() || !HasSuffixString(name, "_out"))) {
       // Check if it's a generator option flag.
       generator_info = FindOrNull(generators_by_option_name_, name);
-      if (generator_info != NULL) {
+      if (generator_info == NULL) {
+        std::cerr << "Unknown flag: " << name << std::endl;
+        return PARSE_ARGUMENT_FAIL;
+      } else {
         string* parameters = &generator_parameters_[generator_info->flag_name];
         if (!parameters->empty()) {
           parameters->append(",");
         }
         parameters->append(value);
-      } else if (HasPrefixString(name, "--") && HasSuffixString(name, "_opt")) {
-        string* parameters =
-            &plugin_parameters_[PluginName(plugin_prefix_, name)];
-        if (!parameters->empty()) {
-          parameters->append(",");
-        }
-        parameters->append(value);
-      } else {
-        std::cerr << "Unknown flag: " << name << std::endl;
-        return PARSE_ARGUMENT_FAIL;
       }
     } else {
       // It's an output flag.  Add it to the output directives.
@@ -1691,7 +1339,7 @@
 
 void CommandLineInterface::PrintHelpText() {
   // Sorry for indentation here; line wrapping would be uglier.
-  std::cout <<
+  std::cerr <<
 "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"
@@ -1713,14 +1361,6 @@
 "                              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"
@@ -1746,7 +1386,7 @@
 "                              occupied fields numbers.\n"
       << std::endl;
   if (!plugin_prefix_.empty()) {
-    std::cout <<
+    std::cerr <<
 "  --plugin=EXECUTABLE         Specifies a plugin executable to use.\n"
 "                              Normally, protoc searches the PATH for\n"
 "                              plugins, but you may specify additional\n"
@@ -1762,28 +1402,14 @@
     // FIXME(kenton):  If the text is long enough it will wrap, which is ugly,
     //   but fixing this nicely (e.g. splitting on spaces) is probably more
     //   trouble than it's worth.
-    std::cout << "  " << iter->first << "=OUT_DIR "
+    std::cerr << "  " << iter->first << "=OUT_DIR "
               << string(19 - iter->first.size(), ' ')  // Spaces for alignment.
               << iter->second.help_text << std::endl;
   }
-  std::cerr <<
-"  @<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(
-    const std::vector<const FileDescriptor*>& parsed_files,
+    const vector<const FileDescriptor*>& parsed_files,
     const OutputDirective& output_directive,
     GeneratorContext* generator_context) {
   // Call the generator.
@@ -1794,16 +1420,12 @@
           HasSuffixString(output_directive.name, "_out"))
         << "Bad name for plugin generator: " << output_directive.name;
 
-    string plugin_name = PluginName(plugin_prefix_ , output_directive.name);
-    string parameters = output_directive.parameter;
-    if (!plugin_parameters_[plugin_name].empty()) {
-      if (!parameters.empty()) {
-        parameters.append(",");
-      }
-      parameters.append(plugin_parameters_[plugin_name]);
-    }
+    // Strip the "--" and "_out" and add the plugin prefix.
+    string plugin_name = plugin_prefix_ + "gen-" +
+        output_directive.name.substr(2, output_directive.name.size() - 6);
+
     if (!GeneratePluginOutput(parsed_files, plugin_name,
-                              parameters,
+                              output_directive.parameter,
                               generator_context, &error)) {
       std::cerr << output_directive.name << ": " << error << std::endl;
       return false;
@@ -1817,11 +1439,24 @@
       }
       parameters.append(generator_parameters_[output_directive.name]);
     }
-    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;
+    if (output_directive.generator->HasGenerateAll()) {
+      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;
+      }
+    } else {
+      for (int i = 0; i < parsed_files.size(); i++) {
+        if (!output_directive.generator->Generate(parsed_files[i], parameters,
+                                                  generator_context, &error)) {
+          // Generator returned an error.
+          std::cerr << output_directive.name << ": " << parsed_files[i]->name()
+                    << ": " << error << std::endl;
+          return false;
+        }
+      }
     }
   }
 
@@ -1829,12 +1464,12 @@
 }
 
 bool CommandLineInterface::GenerateDependencyManifestFile(
-    const std::vector<const FileDescriptor*>& parsed_files,
+    const vector<const FileDescriptor*>& parsed_files,
     const GeneratorContextMap& output_directories,
     DiskSourceTree* source_tree) {
   FileDescriptorSet file_set;
 
-  std::set<const FileDescriptor*> already_seen;
+  set<const FileDescriptor*> already_seen;
   for (int i = 0; i < parsed_files.size(); i++) {
     GetTransitiveDependencies(parsed_files[i],
                               false,
@@ -1843,12 +1478,12 @@
                               file_set.mutable_file());
   }
 
-  std::vector<string> output_filenames;
+  vector<string> output_filenames;
   for (GeneratorContextMap::const_iterator iter = output_directories.begin();
        iter != output_directories.end(); ++iter) {
     const string& location = iter->first;
     GeneratorContextImpl* directory = iter->second;
-    std::vector<string> relative_output_filenames;
+    vector<string> relative_output_filenames;
     directory->GetOutputFilenames(&relative_output_filenames);
     for (int i = 0; i < relative_output_filenames.size(); i++) {
       string output_filename = location + relative_output_filenames[i];
@@ -1901,7 +1536,7 @@
 }
 
 bool CommandLineInterface::GeneratePluginOutput(
-    const std::vector<const FileDescriptor*>& parsed_files,
+    const vector<const FileDescriptor*>& parsed_files,
     const string& plugin_name,
     const string& parameter,
     GeneratorContext* generator_context,
@@ -1914,8 +1549,7 @@
     request.set_parameter(parameter);
   }
 
-
-  std::set<const FileDescriptor*> already_seen;
+  set<const FileDescriptor*> already_seen;
   for (int i = 0; i < parsed_files.size(); i++) {
     request.add_file_to_generate(parsed_files[i]->name());
     GetTransitiveDependencies(parsed_files[i],
@@ -1924,13 +1558,6 @@
                               &already_seen, request.mutable_proto_file());
   }
 
-  google::protobuf::compiler::Version* version =
-      request.mutable_compiler_version();
-  version->set_major(GOOGLE_PROTOBUF_VERSION / 1000000);
-  version->set_minor(GOOGLE_PROTOBUF_VERSION / 1000 % 1000);
-  version->set_patch(GOOGLE_PROTOBUF_VERSION % 1000);
-  version->set_suffix(GOOGLE_PROTOBUF_VERSION_SUFFIX);
-
   // Invoke the plugin.
   Subprocess subprocess;
 
@@ -2052,55 +1679,52 @@
 }
 
 bool CommandLineInterface::WriteDescriptorSet(
-    const std::vector<const FileDescriptor*>& parsed_files) {
+    const vector<const FileDescriptor*> parsed_files) {
   FileDescriptorSet file_set;
 
-  std::set<const FileDescriptor*> already_seen;
-  if (!imports_in_descriptor_set_) {
-    // Since we don't want to output transitive dependencies, but we do want
-    // things to be in dependency order, add all dependencies that aren't in
-    // parsed_files to already_seen.  This will short circuit the recursion
-    // in GetTransitiveDependencies.
-    std::set<const FileDescriptor*> to_output;
-    to_output.insert(parsed_files.begin(), parsed_files.end());
+  if (imports_in_descriptor_set_) {
+    set<const FileDescriptor*> already_seen;
     for (int i = 0; i < parsed_files.size(); i++) {
-      const FileDescriptor* file = parsed_files[i];
-      for (int i = 0; i < file->dependency_count(); i++) {
-        const FileDescriptor* dependency = file->dependency(i);
-        // if the dependency isn't in parsed files, mark it as already seen
-        if (to_output.find(dependency) == to_output.end()) {
-          already_seen.insert(dependency);
-        }
+      GetTransitiveDependencies(parsed_files[i],
+                                true,  // Include json_name
+                                source_info_in_descriptor_set_,
+                                &already_seen, file_set.mutable_file());
+    }
+  } else {
+    set<const FileDescriptor*> already_seen;
+    for (int i = 0; i < parsed_files.size(); i++) {
+      if (!already_seen.insert(parsed_files[i]).second) {
+        continue;
+      }
+      FileDescriptorProto* file_proto = file_set.add_file();
+      parsed_files[i]->CopyTo(file_proto);
+      parsed_files[i]->CopyJsonNameTo(file_proto);
+      if (source_info_in_descriptor_set_) {
+        parsed_files[i]->CopySourceCodeInfoTo(file_proto);
       }
     }
   }
-  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());
-  }
 
   int fd;
   do {
-    fd = open(descriptor_set_out_name_.c_str(),
+    fd = open(descriptor_set_name_.c_str(),
               O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
   } while (fd < 0 && errno == EINTR);
 
   if (fd < 0) {
-    perror(descriptor_set_out_name_.c_str());
+    perror(descriptor_set_name_.c_str());
     return false;
   }
 
   io::FileOutputStream out(fd);
   if (!file_set.SerializeToZeroCopyStream(&out)) {
-    std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno())
+    std::cerr << descriptor_set_name_ << ": " << strerror(out.GetErrno())
               << std::endl;
     out.Close();
     return false;
   }
   if (!out.Close()) {
-    std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno())
+    std::cerr << descriptor_set_name_ << ": " << strerror(out.GetErrno())
               << std::endl;
     return false;
   }
@@ -2112,7 +1736,7 @@
     const FileDescriptor* file,
     bool include_json_name,
     bool include_source_code_info,
-    std::set<const FileDescriptor*>* already_seen,
+    set<const FileDescriptor*>* already_seen,
     RepeatedPtrField<FileDescriptorProto>* output) {
   if (!already_seen->insert(file).second) {
     // Already saw this file.  Skip.
@@ -2171,11 +1795,11 @@
 // parameter will contain the direct children (when groups are ignored in the
 // tree) of the given descriptor for the caller to traverse. The declaration
 // order of the nested messages is also preserved.
-typedef std::pair<int, int> FieldRange;
-void GatherOccupiedFieldRanges(
-    const Descriptor* descriptor, std::set<FieldRange>* ranges,
-    std::vector<const Descriptor*>* nested_messages) {
-  std::set<const Descriptor*> groups;
+typedef pair<int, int> FieldRange;
+void GatherOccupiedFieldRanges(const Descriptor* descriptor,
+                               set<FieldRange>* ranges,
+                               vector<const Descriptor*>* nested_messages) {
+  set<const Descriptor*> groups;
   for (int i = 0; i < descriptor->field_count(); ++i) {
     const FieldDescriptor* fd = descriptor->field(i);
     ranges->insert(FieldRange(fd->number(), fd->number() + 1));
@@ -2207,11 +1831,11 @@
 // Actually prints the formatted free field numbers for given message name and
 // occupied ranges.
 void FormatFreeFieldNumbers(const string& name,
-                            const std::set<FieldRange>& ranges) {
+                            const set<FieldRange>& ranges) {
   string output;
   StringAppendF(&output, "%-35s free:", name.c_str());
   int next_free_number = 1;
-  for (std::set<FieldRange>::const_iterator i = ranges.begin();
+  for (set<FieldRange>::const_iterator i = ranges.begin();
        i != ranges.end(); ++i) {
     // This happens when groups re-use parent field numbers, in which
     // case we skip the FieldRange entirely.
@@ -2238,8 +1862,8 @@
 
 void CommandLineInterface::PrintFreeFieldNumbers(
     const Descriptor* descriptor) {
-  std::set<FieldRange> ranges;
-  std::vector<const Descriptor*> nested_messages;
+  set<FieldRange> ranges;
+  vector<const Descriptor*> nested_messages;
   GatherOccupiedFieldRanges(descriptor, &ranges, &nested_messages);
 
   for (int i = 0; i < nested_messages.size(); ++i) {
diff --git a/src/google/protobuf/compiler/command_line_interface.h b/src/google/protobuf/compiler/command_line_interface.h
index d5d85f2..d137766 100644
--- a/src/google/protobuf/compiler/command_line_interface.h
+++ b/src/google/protobuf/compiler/command_line_interface.h
@@ -52,16 +52,14 @@
 class Descriptor;            // descriptor.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 {
 
-class CodeGenerator;     // code_generator.h
-class GeneratorContext;  // code_generator.h
-class DiskSourceTree;    // importer.h
+class CodeGenerator;        // code_generator.h
+class GeneratorContext;      // code_generator.h
+class DiskSourceTree;       // importer.h
 
 // This class implements the command-line interface to the protocol compiler.
 // It is designed to make it very easy to create a custom protocol compiler
@@ -90,21 +88,9 @@
 // The compiler is invoked with syntax like:
 //   protoc --cpp_out=outdir --foo_out=outdir --proto_path=src src/foo.proto
 //
-// The .proto file to compile can be specified on the command line using either
-// its physical file path, or a virtual path relative to a diretory specified
-// in --proto_path. For example, for src/foo.proto, the following two protoc
-// invocations work the same way:
-//   1. protoc --proto_path=src src/foo.proto (physical file path)
-//   2. protoc --proto_path=src foo.proto (virtual path relative to src)
-//
-// If a file path can be interpreted both as a physical file path and as a
-// relative virtual path, the physical file path takes precendence.
-//
 // For a full description of the command-line syntax, invoke it with --help.
 class LIBPROTOC_EXPORT CommandLineInterface {
  public:
-  static const char* const kPathSeparator;
-
   CommandLineInterface();
   ~CommandLineInterface();
 
@@ -155,14 +141,14 @@
   //   plugin [--out=OUTDIR] [--parameter=PARAMETER] PROTO_FILES < DESCRIPTORS
   // --out indicates the output directory (as passed to the --foo_out
   // parameter); if omitted, the current directory should be used.  --parameter
-  // gives the generator parameter, if any was provided (see below).  The
-  // PROTO_FILES list the .proto files which were given on the compiler
-  // command-line; these are the files for which the plugin is expected to
-  // generate output code.  Finally, DESCRIPTORS is an encoded FileDescriptorSet
-  // (as defined in descriptor.proto).  This is piped to the plugin's stdin.
-  // The set will include descriptors for all the files listed in PROTO_FILES as
-  // well as all files that they import.  The plugin MUST NOT attempt to read
-  // the PROTO_FILES directly -- it must use the FileDescriptorSet.
+  // gives the generator parameter, if any was provided.  The PROTO_FILES list
+  // the .proto files which were given on the compiler command-line; these are
+  // the files for which the plugin is expected to generate output code.
+  // Finally, DESCRIPTORS is an encoded FileDescriptorSet (as defined in
+  // descriptor.proto).  This is piped to the plugin's stdin.  The set will
+  // include descriptors for all the files listed in PROTO_FILES as well as
+  // all files that they import.  The plugin MUST NOT attempt to read the
+  // PROTO_FILES directly -- it must use the FileDescriptorSet.
   //
   // The plugin should generate whatever files are necessary, as code generators
   // normally do.  It should write the names of all files it generates to
@@ -170,13 +156,6 @@
   // names or relative to the current directory.  If any errors occur, error
   // messages should be written to stderr.  If an error is fatal, the plugin
   // should exit with a non-zero exit code.
-  //
-  // Plugins can have generator parameters similar to normal built-in
-  // generators. Extra generator parameters can be passed in via a matching
-  // "_opt" parameter. For example:
-  //   protoc --plug_out=enable_bar:outdir --plug_opt=enable_baz
-  // This will pass "enable_bar,enable_baz" as the parameter to the plugin.
-  //
   void AllowPlugins(const string& exe_name_prefix);
 
   // Run the Protocol Compiler with the given command-line parameters.
@@ -186,11 +165,17 @@
   // it calls strerror().  I'm not sure why you'd want to do this anyway.
   int Run(int argc, const char* const argv[]);
 
-  // DEPRECATED. Calling this method has no effect. Protocol compiler now
-  // always try to find the .proto file relative to the current directory
-  // first and if the file is not found, it will then treat the input path
-  // as a virutal path.
-  void SetInputsAreProtoPathRelative(bool /* enable */) {}
+  // Call SetInputsAreCwdRelative(true) if the input files given on the command
+  // line should be interpreted relative to the proto import path specified
+  // using --proto_path or -I flags.  Otherwise, input file names will be
+  // interpreted relative to the current working directory (or as absolute
+  // paths if they start with '/'), though they must still reside inside
+  // a directory given by --proto_path or the compiler will fail.  The latter
+  // mode is generally more intuitive and easier to use, especially e.g. when
+  // defining implicit rules in Makefiles.
+  void SetInputsAreProtoPathRelative(bool enable) {
+    inputs_are_proto_path_relative_ = enable;
+  }
 
   // Provides some text which will be printed when the --version flag is
   // used.  The version of libprotoc will also be printed on the next line
@@ -227,9 +212,6 @@
   // Parse all command-line arguments.
   ParseArgumentStatus ParseArguments(int argc, const char* const argv[]);
 
-  // Read an argument file and append the file's content to the list of
-  // arguments. Return false if the file cannot be read.
-  bool ExpandArgumentFile(const string& file, std::vector<string>* arguments);
 
   // Parses a command-line argument into a name/value pair.  Returns
   // true if the next argument in the argv should be used as the value,
@@ -251,36 +233,26 @@
   // Print the --help text to stderr.
   void PrintHelpText();
 
-  // Loads proto_path_ into the provided source_tree.
-  bool InitializeDiskSourceTree(DiskSourceTree* source_tree);
-
-  // Loads descriptor_set_in into the provided database
-  bool PopulateSimpleDescriptorDatabase(SimpleDescriptorDatabase* database);
-
-  // Parses input_files_ into parsed_files
-  bool ParseInputFiles(DescriptorPool* descriptor_pool,
-                       std::vector<const FileDescriptor*>* parsed_files);
-
   // Generate the given output file from the given input.
   struct OutputDirective;  // see below
-  bool GenerateOutput(const std::vector<const FileDescriptor*>& parsed_files,
+  bool GenerateOutput(const vector<const FileDescriptor*>& parsed_files,
                       const OutputDirective& output_directive,
                       GeneratorContext* generator_context);
-  bool GeneratePluginOutput(
-      const std::vector<const FileDescriptor*>& parsed_files,
-      const string& plugin_name, const string& parameter,
-      GeneratorContext* generator_context, string* error);
+  bool GeneratePluginOutput(const vector<const FileDescriptor*>& parsed_files,
+                            const string& plugin_name,
+                            const string& parameter,
+                            GeneratorContext* generator_context,
+                            string* error);
 
   // Implements --encode and --decode.
   bool EncodeOrDecode(const DescriptorPool* pool);
 
   // Implements the --descriptor_set_out option.
-  bool WriteDescriptorSet(
-      const std::vector<const FileDescriptor*>& parsed_files);
+  bool WriteDescriptorSet(const vector<const FileDescriptor*> parsed_files);
 
   // Implements the --dependency_out option
   bool GenerateDependencyManifestFile(
-      const std::vector<const FileDescriptor*>& parsed_files,
+      const vector<const FileDescriptor*>& parsed_files,
       const GeneratorContextMap& output_directories,
       DiskSourceTree* source_tree);
 
@@ -297,7 +269,7 @@
       const FileDescriptor* file,
       bool include_json_name,
       bool include_source_code_info,
-      std::set<const FileDescriptor*>* already_seen,
+      set<const FileDescriptor*>* already_seen,
       RepeatedPtrField<FileDescriptorProto>* output);
 
   // Implements the --print_free_field_numbers. This function prints free field
@@ -331,16 +303,14 @@
     CodeGenerator* generator;
     string help_text;
   };
-  typedef std::map<string, GeneratorInfo> GeneratorMap;
+  typedef map<string, GeneratorInfo> GeneratorMap;
   GeneratorMap generators_by_flag_name_;
   GeneratorMap generators_by_option_name_;
   // A map from generator names to the parameters specified using the option
   // flag. For example, if the user invokes the compiler with:
   //   protoc --foo_out=outputdir --foo_opt=enable_bar ...
   // Then there will be an entry ("--foo_out", "enable_bar") in this map.
-  std::map<string, string> generator_parameters_;
-  // Similar to generator_parameters_, but stores the parameters for plugins.
-  std::map<string, string> plugin_parameters_;
+  map<string, string> generator_parameters_;
 
   // See AllowPlugins().  If this is empty, plugins aren't allowed.
   string plugin_prefix_;
@@ -348,7 +318,7 @@
   // Maps specific plugin names to files.  When executing a plugin, this map
   // is searched first to find the plugin executable.  If not found here, the
   // PATH (or other OS-specific search strategy) is searched.
-  std::map<string, string> plugins_;
+  map<string, string> plugins_;
 
   // Stuff parsed from command line.
   enum Mode {
@@ -374,18 +344,8 @@
 
   ErrorFormat error_format_;
 
-  std::vector<std::pair<string, string> >
-      proto_path_;                   // Search path for proto files.
-  std::vector<string> input_files_;  // Names of the input proto files.
-
-  // Names of proto files which are allowed to be imported. Used by build
-  // systems to enforce depend-on-what-you-import.
-  std::set<string> direct_dependencies_;
-  bool direct_dependencies_explicitly_set_;
-
-  // If there's a violation of depend-on-what-you-import, this string will be
-  // presented to the user. "%s" will be replaced with the violating import.
-  string direct_dependencies_violation_msg_;
+  vector<pair<string, string> > proto_path_;  // Search path for proto files.
+  vector<string> input_files_;                // Names of the input proto files.
 
   // output_directives_ lists all the files we are supposed to output and what
   // generator to use for each.
@@ -395,29 +355,20 @@
     string parameter;
     string output_location;
   };
-  std::vector<OutputDirective> output_directives_;
+  vector<OutputDirective> output_directives_;
 
   // When using --encode or --decode, this names the type we are encoding or
   // decoding.  (Empty string indicates --decode_raw.)
   string codec_type_;
 
-  // If --descriptor_set_in was given, these are filenames containing
-  // parsed FileDescriptorSets to be used for loading protos.  Otherwise, empty.
-  std::vector<string> descriptor_set_in_names_;
-
   // If --descriptor_set_out was given, this is the filename to which the
   // FileDescriptorSet should be written.  Otherwise, empty.
-  string descriptor_set_out_name_;
+  string descriptor_set_name_;
 
   // If --dependency_out was given, this is the path to the file where the
   // dependency file will be written. Otherwise, empty.
   string dependency_out_name_;
 
-  // Path to a file that contains serialized AccessInfo which provides
-  // relative hotness of fields per message. This helps protoc to generate
-  // better code.
-  string profile_path_;
-
   // True if --include_imports was given, meaning that we should
   // write all transitive dependencies to the DescriptorSet.  Otherwise, only
   // the .proto files listed on the command-line are added.
@@ -430,6 +381,9 @@
   // Was the --disallow_services flag used?
   bool disallow_services_;
 
+  // See SetInputsAreProtoPathRelative().
+  bool inputs_are_proto_path_relative_;
+
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CommandLineInterface);
 };
 
diff --git a/src/google/protobuf/compiler/command_line_interface_unittest.cc b/src/google/protobuf/compiler/command_line_interface_unittest.cc
index ef7579a..9b504d2 100644
--- a/src/google/protobuf/compiler/command_line_interface_unittest.cc
+++ b/src/google/protobuf/compiler/command_line_interface_unittest.cc
@@ -32,11 +32,12 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-#include <fcntl.h>
-#include <sys/stat.h>
 #include <sys/types.h>
-
-#ifndef _MSC_VER
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef _MSC_VER
+#include <io.h>
+#else
 #include <unistd.h>
 #endif
 #include <memory>
@@ -45,46 +46,44 @@
 #endif
 #include <vector>
 
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/testing/file.h>
+#include <google/protobuf/descriptor.pb.h>
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/compiler/command_line_interface.h>
+#include <google/protobuf/compiler/code_generator.h>
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/compiler/mock_code_generator.h>
 #include <google/protobuf/compiler/subprocess.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
+#include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/testing/file.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 namespace google {
 namespace protobuf {
 namespace compiler {
 
-#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;
-#endif
-
 // Disable the whole test when we use tcmalloc for "draconian" heap checks, in
 // which case tcmalloc will print warnings that fail the plugin tests.
 #if !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN
 
+#if defined(_WIN32)
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+#ifndef F_OK
+#define F_OK 00  // not defined by MSVC for whatever reason
+#endif
+#endif
 
 namespace {
 
@@ -101,7 +100,6 @@
   // command is automatically split on spaces, and the string "$tmpdir"
   // is replaced with TestTempDir().
   void Run(const string& command);
-  void RunWithArgs(std::vector<string> args);
 
   // -----------------------------------------------------------------
   // Methods to set up the test (called before Run()).
@@ -129,6 +127,10 @@
   // google3.
 #endif  // !PROTOBUF_OPENSOURCE
 
+  void SetInputsAreProtoPathRelative(bool enable) {
+    cli_.SetInputsAreProtoPathRelative(enable);
+  }
+
   // -----------------------------------------------------------------
   // Methods to check the test results (called after Run()).
 
@@ -152,11 +154,6 @@
   // Checks that the captured stdout is the same as the expected_text.
   void ExpectCapturedStdout(const string& expected_text);
 
-  // Checks that Run() returned zero and the stdout contains the given
-  // substring.
-  void ExpectCapturedStdoutSubstringWithZeroReturnCode(
-      const string& expected_substring);
-
   // Returns true if ExpectErrorSubstring(expected_substring) would pass, but
   // does not fail otherwise.
   bool HasAlternateErrorSubstring(const string& expected_substring);
@@ -188,17 +185,12 @@
                                      const string& insertions,
                                      const string& proto_name,
                                      const string& message_name);
-  void CheckGeneratedAnnotations(const string& name, const string& file);
 
   void ExpectNullCodeGeneratorCalled(const string& parameter);
 
-
   void ReadDescriptorSet(const string& filename,
                          FileDescriptorSet* descriptor_set);
 
-  void WriteDescriptorSet(const string& filename,
-                          const FileDescriptorSet* descriptor_set);
-
   void ExpectFileContent(const string& filename,
                          const string& content);
 
@@ -225,7 +217,7 @@
   string captured_stdout_;
 
   // Pointers which need to be deleted later.
-  std::vector<CodeGenerator*> mock_generators_to_delete_;
+  vector<CodeGenerator*> mock_generators_to_delete_;
 
   NullCodeGenerator* null_generator_;
 };
@@ -252,6 +244,11 @@
 // ===================================================================
 
 void CommandLineInterfaceTest::SetUp() {
+  // Most of these tests were written before this option was added, so we
+  // run with the option on (which used to be the only way) except in certain
+  // tests where we turn it off.
+  cli_.SetInputsAreProtoPathRelative(true);
+
   temp_directory_ = TestTempDir() + "/proto2_cli_test_temp";
 
   // If the temp directory already exists, it must be left over from a
@@ -277,7 +274,6 @@
   mock_generators_to_delete_.push_back(generator);
   cli_.RegisterGenerator("--null_out", generator, "Null output.");
 
-
   disallow_plugins_ = false;
 }
 
@@ -295,10 +291,8 @@
 }
 
 void CommandLineInterfaceTest::Run(const string& command) {
-  RunWithArgs(Split(command, " ", true));
-}
+  vector<string> args = Split(command, " ", true);
 
-void CommandLineInterfaceTest::RunWithArgs(std::vector<string> args) {
   if (!disallow_plugins_) {
     cli_.AllowPlugins("prefix-");
 #ifndef GOOGLE_THIRD_PARTY_PROTOBUF
@@ -468,18 +462,12 @@
       proto_name, temp_directory_);
 }
 
-void CommandLineInterfaceTest::CheckGeneratedAnnotations(const string& name,
-                                                         const string& file) {
-  MockCodeGenerator::CheckGeneratedAnnotations(name, file, temp_directory_);
-}
-
 void CommandLineInterfaceTest::ExpectNullCodeGeneratorCalled(
     const string& parameter) {
   EXPECT_TRUE(null_generator_->called_);
   EXPECT_EQ(parameter, null_generator_->parameter_);
 }
 
-
 void CommandLineInterfaceTest::ReadDescriptorSet(
     const string& filename, FileDescriptorSet* descriptor_set) {
   string path = temp_directory_ + "/" + filename;
@@ -491,24 +479,11 @@
   }
 }
 
-void CommandLineInterfaceTest::WriteDescriptorSet(
-    const string& filename, const FileDescriptorSet* descriptor_set) {
-  string binary_proto;
-  GOOGLE_CHECK(descriptor_set->SerializeToString(&binary_proto));
-  CreateTempFile(filename, binary_proto);
-}
-
 void CommandLineInterfaceTest::ExpectCapturedStdout(
     const string& expected_text) {
   EXPECT_EQ(expected_text, captured_stdout_);
 }
 
-void CommandLineInterfaceTest::ExpectCapturedStdoutSubstringWithZeroReturnCode(
-    const string& expected_substring) {
-  EXPECT_EQ(0, return_code_);
-  EXPECT_PRED_FORMAT2(
-      testing::IsSubstring, expected_substring, captured_stdout_);
-}
 
 void CommandLineInterfaceTest::ExpectFileContent(
     const string& filename, const string& content) {
@@ -536,22 +511,6 @@
   ExpectGenerated("test_generator", "", "foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, BasicOutput_DescriptorSetIn) {
-  // Test that the common case works.
-  FileDescriptorSet file_descriptor_set;
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("foo.proto");
-  file_descriptor_proto->add_message_type()->set_name("Foo");
-
-  WriteDescriptorSet("foo.bin", &file_descriptor_set);
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
-
-  ExpectNoErrors();
-  ExpectGenerated("test_generator", "", "foo.proto", "Foo");
-}
-
 TEST_F(CommandLineInterfaceTest, BasicPlugin) {
   // Test that basic plugins work.
 
@@ -566,23 +525,6 @@
   ExpectGenerated("test_plugin", "", "foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, BasicPlugin_DescriptorSetIn) {
-  // Test that basic plugins work.
-
-  FileDescriptorSet file_descriptor_set;
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("foo.proto");
-  file_descriptor_proto->add_message_type()->set_name("Foo");
-
-  WriteDescriptorSet("foo.bin", &file_descriptor_set);
-
-  Run("protocol_compiler --plug_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
-
-  ExpectNoErrors();
-  ExpectGenerated("test_plugin", "", "foo.proto", "Foo");
-}
-
 TEST_F(CommandLineInterfaceTest, GeneratorAndPlugin) {
   // Invoke a generator and a plugin at the same time.
 
@@ -598,24 +540,6 @@
   ExpectGenerated("test_plugin", "", "foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, GeneratorAndPlugin_DescriptorSetIn) {
-  // Invoke a generator and a plugin at the same time.
-
-  FileDescriptorSet file_descriptor_set;
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("foo.proto");
-  file_descriptor_proto->add_message_type()->set_name("Foo");
-
-  WriteDescriptorSet("foo.bin", &file_descriptor_set);
-
-  Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
-
-  ExpectNoErrors();
-  ExpectGenerated("test_generator", "", "foo.proto", "Foo");
-  ExpectGenerated("test_plugin", "", "foo.proto", "Foo");
-}
-
 TEST_F(CommandLineInterfaceTest, MultipleInputs) {
   // Test parsing multiple input files.
 
@@ -640,34 +564,6 @@
                                     "bar.proto", "Bar");
 }
 
-TEST_F(CommandLineInterfaceTest, MultipleInputs_DescriptorSetIn) {
-  // Test parsing multiple input files.
-  FileDescriptorSet file_descriptor_set;
-
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("foo.proto");
-  file_descriptor_proto->add_message_type()->set_name("Foo");
-
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("bar.proto");
-  file_descriptor_proto->add_message_type()->set_name("Bar");
-
-  WriteDescriptorSet("foo.bin", &file_descriptor_set);
-
-  Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto bar.proto");
-
-  ExpectNoErrors();
-  ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto",
-                                    "foo.proto", "Foo");
-  ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto",
-                                    "bar.proto", "Bar");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
-                                    "foo.proto", "Foo");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
-                                    "bar.proto", "Bar");
-}
-
 TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport) {
   // Test parsing multiple input files with an import of a separate file.
 
@@ -698,165 +594,6 @@
                                     "bar.proto", "Bar");
 }
 
-TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport_DescriptorSetIn) {
-  // Test parsing multiple input files with an import of a separate file.
-  FileDescriptorSet file_descriptor_set;
-
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("foo.proto");
-  file_descriptor_proto->add_message_type()->set_name("Foo");
-
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("bar.proto");
-  file_descriptor_proto->add_dependency("baz.proto");
-  DescriptorProto* message = file_descriptor_proto->add_message_type();
-  message->set_name("Bar");
-  FieldDescriptorProto* field = message->add_field();
-  field->set_type_name("Baz");
-  field->set_name("a");
-  field->set_number(1);
-
-  WriteDescriptorSet("foo_and_bar.bin", &file_descriptor_set);
-
-  file_descriptor_set.clear_file();
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("baz.proto");
-  file_descriptor_proto->add_message_type()->set_name("Baz");
-
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("bat.proto");
-  file_descriptor_proto->add_dependency("baz.proto");
-  message = file_descriptor_proto->add_message_type();
-  message->set_name("Bat");
-  field = message->add_field();
-  field->set_type_name("Baz");
-  field->set_name("a");
-  field->set_number(1);
-
-  WriteDescriptorSet("baz_and_bat.bin", &file_descriptor_set);
-  Run(strings::Substitute(
-      "protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir "
-      "--descriptor_set_in=$0 foo.proto bar.proto",
-      string("$tmpdir/foo_and_bar.bin") +
-      CommandLineInterface::kPathSeparator +
-      "$tmpdir/baz_and_bat.bin"));
-
-  ExpectNoErrors();
-  ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto",
-                                    "foo.proto", "Foo");
-  ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto",
-                                    "bar.proto", "Bar");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
-                                    "foo.proto", "Foo");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
-                                    "bar.proto", "Bar");
-
-  Run(strings::Substitute(
-      "protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir "
-      "--descriptor_set_in=$0 baz.proto bat.proto",
-      string("$tmpdir/foo_and_bar.bin") +
-      CommandLineInterface::kPathSeparator +
-      "$tmpdir/baz_and_bat.bin"));
-
-  ExpectNoErrors();
-  ExpectGeneratedWithMultipleInputs("test_generator", "baz.proto,bat.proto",
-                                    "baz.proto", "Baz");
-  ExpectGeneratedWithMultipleInputs("test_generator", "baz.proto,bat.proto",
-                                    "bat.proto", "Bat");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "baz.proto,bat.proto",
-                                    "baz.proto", "Baz");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "baz.proto,bat.proto",
-                                    "bat.proto", "Bat");
-}
-
-TEST_F(CommandLineInterfaceTest,
-       MultipleInputsWithImport_DescriptorSetIn_DuplicateFileDescriptor) {
-  // Test parsing multiple input files with an import of a separate file.
-  FileDescriptorSet file_descriptor_set;
-
-  FileDescriptorProto foo_file_descriptor_proto;
-  foo_file_descriptor_proto.set_name("foo.proto");
-  foo_file_descriptor_proto.add_message_type()->set_name("Foo");
-
-  file_descriptor_set.add_file()->CopyFrom(foo_file_descriptor_proto);
-
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("bar.proto");
-  file_descriptor_proto->add_dependency("baz.proto");
-  file_descriptor_proto->add_dependency("foo.proto");
-  DescriptorProto* message = file_descriptor_proto->add_message_type();
-  message->set_name("Bar");
-  FieldDescriptorProto* field = message->add_field();
-  field->set_type_name("Baz");
-  field->set_name("a");
-  field->set_number(1);
-  field = message->add_field();
-  field->set_type_name("Foo");
-  field->set_name("f");
-  field->set_number(2);
-  WriteDescriptorSet("foo_and_bar.bin", &file_descriptor_set);
-
-  file_descriptor_set.clear_file();
-  file_descriptor_set.add_file()->CopyFrom(foo_file_descriptor_proto);
-
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("baz.proto");
-  file_descriptor_proto->add_dependency("foo.proto");
-  message = file_descriptor_proto->add_message_type();
-  message->set_name("Baz");
-  field = message->add_field();
-  field->set_type_name("Foo");
-  field->set_name("f");
-  field->set_number(1);
-  WriteDescriptorSet("foo_and_baz.bin", &file_descriptor_set);
-
-  Run(strings::Substitute(
-      "protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir "
-      "--descriptor_set_in=$0 bar.proto",
-      string("$tmpdir/foo_and_bar.bin") +
-      CommandLineInterface::kPathSeparator +
-      "$tmpdir/foo_and_baz.bin"));
-
-  ExpectNoErrors();
-  ExpectGenerated("test_generator", "", "bar.proto", "Bar");
-  ExpectGenerated("test_plugin", "", "bar.proto", "Bar");
-}
-
-TEST_F(CommandLineInterfaceTest,
-       MultipleInputsWithImport_DescriptorSetIn_MissingImport) {
-  // Test parsing multiple input files with an import of a separate file.
-  FileDescriptorSet file_descriptor_set;
-
-  FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("foo.proto");
-  file_descriptor_proto->add_message_type()->set_name("Foo");
-
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("bar.proto");
-  file_descriptor_proto->add_dependency("baz.proto");
-  DescriptorProto* message = file_descriptor_proto->add_message_type();
-  message->set_name("Bar");
-  FieldDescriptorProto* field = message->add_field();
-  field->set_type_name("Baz");
-  field->set_name("a");
-  field->set_number(1);
-
-  WriteDescriptorSet("foo_and_bar.bin", &file_descriptor_set);
-
-  file_descriptor_set.clear_file();
-  file_descriptor_proto = file_descriptor_set.add_file();
-  file_descriptor_proto->set_name("baz.proto");
-  file_descriptor_proto->add_message_type()->set_name("Baz");
-
-  WriteDescriptorSet("baz.bin", &file_descriptor_set);
-  Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo_and_bar.bin "
-      "foo.proto bar.proto");
-  ExpectErrorSubstring(
-      "bar.proto: Import \"baz.proto\" was not found or had errors.");
-  ExpectErrorSubstring("bar.proto: \"Baz\" is not defined.");
-}
-
 TEST_F(CommandLineInterfaceTest, CreateDirectory) {
   // Test that when we output to a sub-directory, it is created.
 
@@ -916,70 +653,6 @@
       "test_generator", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b");
 }
 
-TEST_F(CommandLineInterfaceTest, ExtraPluginParameters) {
-  // Test that generator parameters specified with the option flag are
-  // correctly passed to the code generator.
-
-  CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
-  // Create the "a" and "b" sub-directories.
-  CreateTempDir("a");
-  CreateTempDir("b");
-
-  Run("protocol_compiler "
-      "--plug_opt=foo1 "
-      "--plug_out=bar:$tmpdir/a "
-      "--plug_opt=foo2 "
-      "--plug_out=baz:$tmpdir/b "
-      "--plug_opt=foo3 "
-      "--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");
-}
-
-TEST_F(CommandLineInterfaceTest, UnrecognizedExtraParameters) {
-  CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
-
-  Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
-      "--unknown_plug_a_opt=Foo "
-      "--unknown_plug_b_opt=Bar "
-      "--proto_path=$tmpdir foo.proto");
-
-  ExpectErrorSubstring("Unknown flag: --unknown_plug_a_opt");
-  ExpectErrorSubstring("Unknown flag: --unknown_plug_b_opt");
-}
-
-TEST_F(CommandLineInterfaceTest, ExtraPluginParametersForOutParameters) {
-  // This doesn't rely on the plugin having been registred and instead that
-  // the existence of --[name]_out is enough to make the --[name]_opt valid.
-  // However, running out of process plugins found via the search path (i.e. -
-  // not pre registered with --plugin) isn't support in this test suite, so we
-  // list the options pre/post the _out directive, and then include _opt that
-  // will be unknown, and confirm the failure output is about the expected
-  // unknown directive, which means the other were accepted.
-  // NOTE: UnrecognizedExtraParameters confirms that if two unknown _opt
-  // directives appear, they both are reported.
-
-  CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
-
-  Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
-      "--xyz_opt=foo=bar --xyz_out=$tmpdir "
-      "--abc_out=$tmpdir --abc_opt=foo=bar "
-      "--unknown_plug_opt=Foo "
-      "--proto_path=$tmpdir foo.proto");
-
-  ExpectErrorText("Unknown flag: --unknown_plug_opt\n");
-}
-
 TEST_F(CommandLineInterfaceTest, Insert) {
   // Test running a generator that inserts code into another's output.
 
@@ -1003,25 +676,6 @@
       "foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, InsertWithAnnotationFixup) {
-  // Check that annotation spans are updated after insertions.
-
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n"
-                 "message MockCodeGenerator_Annotate {}\n");
-
-  Run("protocol_compiler "
-      "--test_out=TestParameter:$tmpdir "
-      "--plug_out=TestPluginParameter:$tmpdir "
-      "--test_out=insert=test_generator,test_plugin:$tmpdir "
-      "--plug_out=insert=test_generator,test_plugin:$tmpdir "
-      "--proto_path=$tmpdir foo.proto");
-
-  ExpectNoErrors();
-  CheckGeneratedAnnotations("test_generator", "foo.proto");
-  CheckGeneratedAnnotations("test_plugin", "foo.proto");
-}
-
 #if defined(_WIN32)
 
 TEST_F(CommandLineInterfaceTest, WindowsOutputPath) {
@@ -1065,11 +719,6 @@
   ExpectGenerated("test_generator", "", "foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, Win32ErrorMessage) {
-  EXPECT_EQ("The system cannot find the file specified.\r\n",
-            Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND));
-}
-
 #endif  // defined(_WIN32) || defined(__CYGWIN__)
 
 TEST_F(CommandLineInterfaceTest, PathLookup) {
@@ -1107,11 +756,17 @@
     "}\n");
   CreateTempFile("b/foo.proto", "this should not be parsed\n");
 
-  Run(strings::Substitute(
-      "protocol_compiler --test_out=$$tmpdir --proto_path=$0 foo.proto",
-      string("$tmpdir/a") +
-      CommandLineInterface::kPathSeparator +
-      "$tmpdir/b"));
+#undef PATH_SEPARATOR
+#if defined(_WIN32)
+#define PATH_SEPARATOR ";"
+#else
+#define PATH_SEPARATOR ":"
+#endif
+
+  Run("protocol_compiler --test_out=$tmpdir "
+      "--proto_path=$tmpdir/a" PATH_SEPARATOR "$tmpdir/b foo.proto");
+
+#undef PATH_SEPARATOR
 
   ExpectNoErrors();
   ExpectGenerated("test_generator", "", "foo.proto", "Foo");
@@ -1131,21 +786,6 @@
   ExpectGenerated("test_generator", "", "bar/foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, PathWithEqualsSign) {
-  // Test setting up a search path which happens to have '=' in it.
-
-  CreateTempDir("with=sign");
-  CreateTempFile("with=sign/foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--proto_path=$tmpdir/with=sign foo.proto");
-
-  ExpectNoErrors();
-  ExpectGenerated("test_generator", "", "foo.proto", "Foo");
-}
-
 TEST_F(CommandLineInterfaceTest, MultipleGenerators) {
   // Test that we can have multiple generators and use both in one invocation,
   // each with a different output directory.
@@ -1211,116 +851,11 @@
   ExpectGenerated("test_generator", "", "foo.proto", "Foo");
 }
 
-TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing_EmptyList) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n"
-                 "import \"bar.proto\";\n"
-                 "message Foo { optional Bar bar = 1; }");
-  CreateTempFile("bar.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bar { optional string text = 1; }");
-
-  Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir "
-      "--direct_dependencies= foo.proto");
-
-  ExpectErrorText(
-      "foo.proto: File is imported but not declared in --direct_dependencies: "
-      "bar.proto\n");
-}
-
-TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n"
-                 "import \"bar.proto\";\n"
-                 "import \"bla.proto\";\n"
-                 "message Foo { optional Bar bar = 1; optional Bla bla = 2; }");
-  CreateTempFile("bar.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bar { optional string text = 1; }");
-  CreateTempFile("bla.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bla { optional int64 number = 1; }");
-
-  Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir "
-      "--direct_dependencies=bla.proto foo.proto");
-
-  ExpectErrorText(
-      "foo.proto: File is imported but not declared in --direct_dependencies: "
-      "bar.proto\n");
-}
-
-TEST_F(CommandLineInterfaceTest, DirectDependencies_NoViolation) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n"
-                 "import \"bar.proto\";\n"
-                 "message Foo { optional Bar bar = 1; }");
-  CreateTempFile("bar.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bar { optional string text = 1; }");
-
-  Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir "
-      "--direct_dependencies=bar.proto foo.proto");
-
-  ExpectNoErrors();
-}
-
-TEST_F(CommandLineInterfaceTest, DirectDependencies_NoViolation_MultiImports) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n"
-                 "import \"bar.proto\";\n"
-                 "import \"bla.proto\";\n"
-                 "message Foo { optional Bar bar = 1; optional Bla bla = 2; }");
-  CreateTempFile("bar.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bar { optional string text = 1; }");
-  CreateTempFile("bla.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bla { optional int64 number = 1; }");
-
-  Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir "
-      "--direct_dependencies=bar.proto:bla.proto foo.proto");
-
-  ExpectNoErrors();
-}
-
-TEST_F(CommandLineInterfaceTest, DirectDependencies_ProvidedMultipleTimes) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n");
-
-  Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir "
-      "--direct_dependencies=bar.proto --direct_dependencies=bla.proto "
-      "foo.proto");
-
-  ExpectErrorText(
-      "--direct_dependencies may only be passed once. To specify multiple "
-      "direct dependencies, pass them all as a single parameter separated by "
-      "':'.\n");
-}
-
-TEST_F(CommandLineInterfaceTest, DirectDependencies_CustomErrorMessage) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n"
-                 "import \"bar.proto\";\n"
-                 "message Foo { optional Bar bar = 1; }");
-  CreateTempFile("bar.proto",
-                 "syntax = \"proto2\";\n"
-                 "message Bar { optional string text = 1; }");
-
-  std::vector<string> commands;
-  commands.push_back("protocol_compiler");
-  commands.push_back("--test_out=$tmpdir");
-  commands.push_back("--proto_path=$tmpdir");
-  commands.push_back("--direct_dependencies=");
-  commands.push_back("--direct_dependencies_violation_msg=Bla \"%s\" Bla");
-  commands.push_back("foo.proto");
-  RunWithArgs(commands);
-
-  ExpectErrorText("foo.proto: Bla \"bar.proto\" Bla\n");
-}
-
 TEST_F(CommandLineInterfaceTest, CwdRelativeInputs) {
   // Test that we can accept working-directory-relative input files.
 
+  SetInputsAreProtoPathRelative(false);
+
   CreateTempFile("foo.proto",
     "syntax = \"proto2\";\n"
     "message Foo {}\n");
@@ -1387,17 +922,15 @@
   ReadDescriptorSet("descriptor_set", &descriptor_set);
   if (HasFatalFailure()) return;
   EXPECT_EQ(3, descriptor_set.file_size());
-  // foo should come first since the output is in dependency order.
-  // since bar and baz are unordered, they should be in command line order.
-  EXPECT_EQ("foo.proto", descriptor_set.file(0).name());
-  EXPECT_EQ("bar.proto", descriptor_set.file(1).name());
+  EXPECT_EQ("bar.proto", descriptor_set.file(0).name());
+  EXPECT_EQ("foo.proto", descriptor_set.file(1).name());
   EXPECT_EQ("baz.proto", descriptor_set.file(2).name());
   // Descriptor set should not have source code info.
   EXPECT_FALSE(descriptor_set.file(0).has_source_code_info());
   // Descriptor set should have json_name.
-  EXPECT_EQ("Bar", descriptor_set.file(1).message_type(0).name());
-  EXPECT_EQ("foo", descriptor_set.file(1).message_type(0).field(0).name());
-  EXPECT_TRUE(descriptor_set.file(1).message_type(0).field(0).has_json_name());
+  EXPECT_EQ("Bar", descriptor_set.file(0).message_type(0).name());
+  EXPECT_EQ("foo", descriptor_set.file(0).message_type(0).field(0).name());
+  EXPECT_TRUE(descriptor_set.file(0).message_type(0).field(0).has_json_name());
 }
 
 TEST_F(CommandLineInterfaceTest, WriteDescriptorSetWithSourceInfo) {
@@ -1561,36 +1094,6 @@
 }
 #endif  // !_WIN32
 
-TEST_F(CommandLineInterfaceTest, TestArgumentFile) {
-  // Test parsing multiple input files using an argument file.
-
-  CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
-  CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
-  CreateTempFile("arguments.txt",
-                 "--test_out=$tmpdir\n"
-                 "--plug_out=$tmpdir\n"
-                 "--proto_path=$tmpdir\n"
-                 "--direct_dependencies_violation_msg=%s is not imported\n"
-                 "foo.proto\n"
-                 "bar.proto");
-
-  Run("protocol_compiler @$tmpdir/arguments.txt");
-
-  ExpectNoErrors();
-  ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto",
-                                    "foo.proto", "Foo");
-  ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto",
-                                    "bar.proto", "Bar");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
-                                    "foo.proto", "Foo");
-  ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
-                                    "bar.proto", "Bar");
-}
-
 
 // -------------------------------------------------------------------
 
@@ -1608,17 +1111,6 @@
     "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n");
 }
 
-TEST_F(CommandLineInterfaceTest, ParseErrors_DescriptorSetIn) {
-  // Test that parse errors are reported.
-  CreateTempFile("foo.bin", "not a FileDescriptorSet");
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
-
-  ExpectErrorText(
-    "$tmpdir/foo.bin: Unable to parse.\n");
-}
-
 TEST_F(CommandLineInterfaceTest, ParseErrorsMultipleFiles) {
   // Test that parse errors are reported from multiple files.
 
@@ -1646,42 +1138,22 @@
     "foo.proto: 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");
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--proto_path=$tmpdir foo.proto");
-
-  ExpectErrorSubstring(
-    "foo.proto: File recursively imports itself: foo.proto -> foo.proto\n");
-}
-
 TEST_F(CommandLineInterfaceTest, InputNotFoundError) {
   // Test what happens if the input file is not found.
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
 
-  ExpectErrorText("foo.proto: No such file or directory\n");
-}
-
-TEST_F(CommandLineInterfaceTest, InputNotFoundError_DescriptorSetIn) {
-  // Test what happens if the input file is not found.
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
-
   ExpectErrorText(
-    "$tmpdir/foo.bin: No such file or directory\n");
+    "foo.proto: File not found.\n");
 }
 
 TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundError) {
   // Test what happens when a working-directory-relative input file is not
   // found.
 
+  SetInputsAreProtoPathRelative(false);
+
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir $tmpdir/foo.proto");
 
@@ -1693,6 +1165,8 @@
   // Test what happens when a working-directory-relative input file is not
   // mapped to a virtual path.
 
+  SetInputsAreProtoPathRelative(false);
+
   CreateTempFile("foo.proto",
     "syntax = \"proto2\";\n"
     "message Foo {}\n");
@@ -1717,6 +1191,8 @@
   // Check what happens if the input file is not found *and* is not mapped
   // in the proto_path.
 
+  SetInputsAreProtoPathRelative(false);
+
   // Create a directory called "bar" so that we can point --proto_path at it.
   CreateTempFile("bar/dummy", "");
 
@@ -1731,6 +1207,8 @@
   // Test what happens when a working-directory-relative input file is shadowed
   // by another file in the virtual path.
 
+  SetInputsAreProtoPathRelative(false);
+
   CreateTempFile("foo/foo.proto",
     "syntax = \"proto2\";\n"
     "message Foo {}\n");
@@ -1756,34 +1234,8 @@
       "--proto_path=$tmpdir/foo foo.proto");
 
   ExpectErrorText(
-      "$tmpdir/foo: warning: directory does not exist.\n"
-      "foo.proto: No such file or directory\n");
-}
-
-TEST_F(CommandLineInterfaceTest, ProtoPathAndDescriptorSetIn) {
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--proto_path=$tmpdir --descriptor_set_in=$tmpdir/foo.bin foo.proto");
-  ExpectErrorText(
-      "Only one of --descriptor_set_in and --proto_path can be specified.\n");
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin --proto_path=$tmpdir foo.proto");
-  ExpectErrorText(
-      "Only one of --proto_path and --descriptor_set_in can be specified.\n");
-}
-
-TEST_F(CommandLineInterfaceTest, ProtoPathAndDependencyOut) {
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--dependency_out=$tmpdir/manifest "
-      "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
-  ExpectErrorText(
-      "--descriptor_set_in cannot be used with --dependency_out.\n");
-
-  Run("protocol_compiler --test_out=$tmpdir "
-      "--descriptor_set_in=$tmpdir/foo.bin "
-      "--dependency_out=$tmpdir/manifest foo.proto");
-  ExpectErrorText(
-      "--dependency_out cannot be used with --descriptor_set_in.\n");
+    "$tmpdir/foo: warning: directory does not exist.\n"
+    "foo.proto: File not found.\n");
 }
 
 TEST_F(CommandLineInterfaceTest, MissingInputError) {
@@ -1986,21 +1438,6 @@
   ExpectErrorSubstring("Saw json_name: 1");
 }
 
-TEST_F(CommandLineInterfaceTest, PluginReceivesCompilerVersion) {
-  CreateTempFile("foo.proto",
-    "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));
-}
-
 TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) {
   // Test what happens if the plugin isn't found.
 
@@ -2043,11 +1480,11 @@
 TEST_F(CommandLineInterfaceTest, HelpText) {
   Run("test_exec_name --help");
 
-  ExpectCapturedStdoutSubstringWithZeroReturnCode("Usage: test_exec_name ");
-  ExpectCapturedStdoutSubstringWithZeroReturnCode("--test_out=OUT_DIR");
-  ExpectCapturedStdoutSubstringWithZeroReturnCode("Test output.");
-  ExpectCapturedStdoutSubstringWithZeroReturnCode("--alt_out=OUT_DIR");
-  ExpectCapturedStdoutSubstringWithZeroReturnCode("Alt output.");
+  ExpectErrorSubstringWithZeroReturnCode("Usage: test_exec_name ");
+  ExpectErrorSubstringWithZeroReturnCode("--test_out=OUT_DIR");
+  ExpectErrorSubstringWithZeroReturnCode("Test output.");
+  ExpectErrorSubstringWithZeroReturnCode("--alt_out=OUT_DIR");
+  ExpectErrorSubstringWithZeroReturnCode("Alt output.");
 }
 
 TEST_F(CommandLineInterfaceTest, GccFormatErrors) {
@@ -2233,16 +1670,9 @@
 // test as a shell script, but we'd like to be able to run the test on
 // platforms that don't have a Bourne-compatible shell available (especially
 // Windows/MSVC).
-
-enum EncodeDecodeTestMode {
-  PROTO_PATH,
-  DESCRIPTOR_SET_IN
-};
-
-class EncodeDecodeTest : public testing::TestWithParam<EncodeDecodeTestMode> {
+class EncodeDecodeTest : public testing::Test {
  protected:
   virtual void SetUp() {
-    WriteUnittestProtoDescriptorSet();
     duped_stdin_ = dup(STDIN_FILENO);
   }
 
@@ -2282,21 +1712,10 @@
   enum ReturnCode { SUCCESS, ERROR };
 
   bool Run(const string& command) {
-    std::vector<string> args;
+    vector<string> args;
     args.push_back("protoc");
     SplitStringUsing(command, " ", &args);
-    switch (GetParam()) {
-      case PROTO_PATH:
-        args.push_back("--proto_path=" + TestSourceDir());
-        break;
-      case DESCRIPTOR_SET_IN:
-        args.push_back(StrCat(
-            "--descriptor_set_in=",
-            unittest_proto_descriptor_set_filename_));
-        break;
-      default:
-        ADD_FAILURE() << "unexpected EncodeDecodeTestMode: " << GetParam();
-    }
+    args.push_back("--proto_path=" + TestSourceDir());
 
     google::protobuf::scoped_array<const char * > argv(new const char* [args.size()]);
     for (int i = 0; i < args.size(); i++) {
@@ -2304,6 +1723,7 @@
     }
 
     CommandLineInterface cli;
+    cli.SetInputsAreProtoPathRelative(true);
 
     CaptureTestStdout();
     CaptureTestStderr();
@@ -2341,37 +1761,12 @@
   }
 
  private:
-  void WriteUnittestProtoDescriptorSet() {
-    unittest_proto_descriptor_set_filename_ =
-        TestTempDir() + "/unittest_proto_descriptor_set.bin";
-    FileDescriptorSet file_descriptor_set;
-    protobuf_unittest::TestAllTypes test_all_types;
-    test_all_types.descriptor()->file()->CopyTo(file_descriptor_set.add_file());
-
-    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());
-    GOOGLE_DCHECK(file_descriptor_set.IsInitialized());
-
-    string binary_proto;
-    GOOGLE_CHECK(file_descriptor_set.SerializeToString(&binary_proto));
-    GOOGLE_CHECK_OK(File::SetContents(
-        unittest_proto_descriptor_set_filename_,
-        binary_proto,
-        true));
-  }
-
   int duped_stdin_;
   string captured_stdout_;
   string captured_stderr_;
-  string unittest_proto_descriptor_set_filename_;
 };
 
-TEST_P(EncodeDecodeTest, Encode) {
+TEST_F(EncodeDecodeTest, Encode) {
   RedirectStdinFromFile(TestSourceDir() + "/google/protobuf/"
     "testdata/text_format_unittest_data_oneof_implemented.txt");
   EXPECT_TRUE(Run("google/protobuf/unittest.proto "
@@ -2381,7 +1776,7 @@
   ExpectStderrMatchesText("");
 }
 
-TEST_P(EncodeDecodeTest, Decode) {
+TEST_F(EncodeDecodeTest, Decode) {
   RedirectStdinFromFile(TestSourceDir() +
     "/google/protobuf/testdata/golden_message_oneof_implemented");
   EXPECT_TRUE(Run("google/protobuf/unittest.proto "
@@ -2392,7 +1787,7 @@
   ExpectStderrMatchesText("");
 }
 
-TEST_P(EncodeDecodeTest, Partial) {
+TEST_F(EncodeDecodeTest, Partial) {
   RedirectStdinFromText("");
   EXPECT_TRUE(Run("google/protobuf/unittest.proto "
                   "--encode=protobuf_unittest.TestRequired"));
@@ -2401,7 +1796,7 @@
     "warning:  Input message is missing required fields:  a, b, c\n");
 }
 
-TEST_P(EncodeDecodeTest, DecodeRaw) {
+TEST_F(EncodeDecodeTest, DecodeRaw) {
   protobuf_unittest::TestAllTypes message;
   message.set_optional_int32(123);
   message.set_optional_string("foo");
@@ -2415,24 +1810,21 @@
   ExpectStderrMatchesText("");
 }
 
-TEST_P(EncodeDecodeTest, UnknownType) {
+TEST_F(EncodeDecodeTest, UnknownType) {
   EXPECT_FALSE(Run("google/protobuf/unittest.proto "
                    "--encode=NoSuchType"));
   ExpectStdoutMatchesText("");
   ExpectStderrMatchesText("Type not defined: NoSuchType\n");
 }
 
-TEST_P(EncodeDecodeTest, ProtoParseError) {
+TEST_F(EncodeDecodeTest, ProtoParseError) {
   EXPECT_FALSE(Run("google/protobuf/no_such_file.proto "
                    "--encode=NoSuchType"));
   ExpectStdoutMatchesText("");
   ExpectStderrMatchesText(
-      "google/protobuf/no_such_file.proto: No such file or directory\n");
+    "google/protobuf/no_such_file.proto: File not found.\n");
 }
 
-INSTANTIATE_TEST_CASE_P(FileDescriptorSetSource,
-                        EncodeDecodeTest,
-                        testing::Values(PROTO_PATH, DESCRIPTOR_SET_IN));
 }  // anonymous namespace
 
 #endif  // !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN
diff --git a/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
index f99159f..77451ab 100644
--- a/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
@@ -46,11 +46,12 @@
 
 #include <google/protobuf/compiler/cpp/cpp_generator.h>
 #include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/substitute.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/map_util.h>
 #include <google/protobuf/stubs/stl_util.h>
+#include <google/protobuf/stubs/strutil.h>
+#include <google/protobuf/stubs/substitute.h>
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
@@ -98,6 +99,7 @@
                           &actual_contents, true));
     EXPECT_TRUE(actual_contents == *expected_contents)
       << physical_filename << " needs to be regenerated.  Please run "
+         "google/protobuf/compiler/release_compiler.sh and "
          "generate_descriptor_proto.sh. Then add this file "
          "to your CL.";
   }
@@ -113,7 +115,7 @@
   }
 
  private:
-  std::map<string, string*> files_;
+  map<string, string*> files_;
 };
 
 TEST(BootstrapTest, GeneratedDescriptorMatches) {
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum.cc b/src/google/protobuf/compiler/cpp/cpp_enum.cc
index 8adee0f..c81c598 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_enum.cc
@@ -70,7 +70,7 @@
 EnumGenerator::~EnumGenerator() {}
 
 void EnumGenerator::FillForwardDeclaration(
-    std::map<string, const EnumDescriptor*>* enum_names) {
+    map<string, const EnumDescriptor*>* enum_names) {
   if (!options_.proto_h) {
     return;
   }
@@ -78,19 +78,13 @@
 }
 
 void EnumGenerator::GenerateDefinition(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["classname"] = classname_;
   vars["short_name"] = descriptor_->name();
-  vars["enumbase"] = options_.proto_h ? " : int" : "";
-  // These variables are placeholders to pick out the beginning and ends of
-  // identifiers for annotations (when doing so with existing variables would
-  // be ambiguous or impossible). They should never be set to anything but the
-  // empty string.
-  vars["{"] = "";
-  vars["}"] = "";
+  vars["enumbase"] = classname_ + (options_.proto_h ? " : int" : "");
 
-  printer->Print(vars, "enum $classname$$enumbase$ {\n");
-  printer->Annotate("classname", descriptor_);
+  printer->Print(vars, "enum $enumbase$ {\n");
+  printer->Annotate("enumbase", descriptor_);
   printer->Indent();
 
   const EnumValueDescriptor* min_value = descriptor_->value(0);
@@ -108,8 +102,7 @@
         " PROTOBUF_DEPRECATED" : "";
 
     if (i > 0) printer->Print(",\n");
-    printer->Print(vars, "${$$prefix$$name$$}$$deprecation$ = $number$");
-    printer->Annotate("{", "}", descriptor_->value(i));
+    printer->Print(vars, "$prefix$$name$$deprecation$ = $number$");
 
     if (descriptor_->value(i)->number() < min_value->number()) {
       min_value = descriptor_->value(i);
@@ -141,20 +134,14 @@
   }
 
   printer->Print(vars,
-                 "$dllexport$bool $classname$_IsValid(int value);\n"
-                 "const $classname$ ${$$prefix$$short_name$_MIN$}$ = "
-                 "$prefix$$min_name$;\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(vars,
-                 "const $classname$ ${$$prefix$$short_name$_MAX$}$ = "
-                 "$prefix$$max_name$;\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$dllexport$bool $classname$_IsValid(int value);\n"
+    "const $classname$ $prefix$$short_name$_MIN = $prefix$$min_name$;\n"
+    "const $classname$ $prefix$$short_name$_MAX = $prefix$$max_name$;\n");
 
   if (generate_array_size_) {
     printer->Print(vars,
-                   "const int ${$$prefix$$short_name$_ARRAYSIZE$}$ = "
-                   "$prefix$$short_name$_MAX + 1;\n\n");
-    printer->Annotate("{", "}", descriptor_);
+      "const int $prefix$$short_name$_ARRAYSIZE = "
+      "$prefix$$short_name$_MAX + 1;\n\n");
   }
 
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
@@ -193,40 +180,33 @@
 }
 
 void EnumGenerator::GenerateSymbolImports(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["nested_name"] = descriptor_->name();
   vars["classname"] = classname_;
   vars["constexpr"] = options_.proto_h ? "constexpr " : "";
-  vars["{"] = "";
-  vars["}"] = "";
   printer->Print(vars, "typedef $classname$ $nested_name$;\n");
 
   for (int j = 0; j < descriptor_->value_count(); j++) {
     vars["tag"] = EnumValueName(descriptor_->value(j));
     vars["deprecated_attr"] = descriptor_->value(j)->options().deprecated() ?
-      "GOOGLE_PROTOBUF_DEPRECATED_ATTR " : "";
+      "PROTOBUF_DEPRECATED_ATTR " : "";
     printer->Print(vars,
-      "$deprecated_attr$static $constexpr$const $nested_name$ ${$$tag$$}$ =\n"
+      "$deprecated_attr$static $constexpr$const $nested_name$ $tag$ =\n"
       "  $classname$_$tag$;\n");
-    printer->Annotate("{", "}", descriptor_->value(j));
   }
 
   printer->Print(vars,
     "static inline bool $nested_name$_IsValid(int value) {\n"
     "  return $classname$_IsValid(value);\n"
     "}\n"
-    "static const $nested_name$ ${$$nested_name$_MIN$}$ =\n"
-    "  $classname$_$nested_name$_MIN;\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(vars,
-    "static const $nested_name$ ${$$nested_name$_MAX$}$ =\n"
+    "static const $nested_name$ $nested_name$_MIN =\n"
+    "  $classname$_$nested_name$_MIN;\n"
+    "static const $nested_name$ $nested_name$_MAX =\n"
     "  $classname$_$nested_name$_MAX;\n");
-  printer->Annotate("{", "}", descriptor_);
   if (generate_array_size_) {
     printer->Print(vars,
-      "static const int ${$$nested_name$_ARRAYSIZE$}$ =\n"
+      "static const int $nested_name$_ARRAYSIZE =\n"
       "  $classname$_$nested_name$_ARRAYSIZE;\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
@@ -249,38 +229,50 @@
   }
 }
 
-void EnumGenerator::GenerateMethods(int idx, io::Printer* printer) {
-  std::map<string, string> vars;
+void EnumGenerator::GenerateDescriptorInitializer(
+    io::Printer* printer, int index) {
+  map<string, string> vars;
   vars["classname"] = classname_;
-  vars["index_in_metadata"] = SimpleItoa(idx);
+  vars["index"] = SimpleItoa(index);
+
+  if (descriptor_->containing_type() == NULL) {
+    printer->Print(vars,
+      "$classname$_descriptor_ = file->enum_type($index$);\n");
+  } else {
+    vars["parent"] = ClassName(descriptor_->containing_type(), false);
+    printer->Print(vars,
+      "$classname$_descriptor_ = $parent$_descriptor_->enum_type($index$);\n");
+  }
+}
+
+void EnumGenerator::GenerateMethods(io::Printer* printer) {
+  map<string, string> vars;
+  vars["classname"] = classname_;
   vars["constexpr"] = options_.proto_h ? "constexpr " : "";
-  vars["file_namespace"] = FileLevelNamespace(descriptor_->file()->name());
 
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
-    printer->Print(
-        vars,
-        "const ::google::protobuf::EnumDescriptor* $classname$_descriptor() {\n"
-        "  $file_namespace$::protobuf_AssignDescriptorsOnce();\n"
-        "  return "
-        "$file_namespace$::file_level_enum_descriptors[$index_in_metadata$];\n"
-        "}\n");
+    printer->Print(vars,
+      "const ::google::protobuf::EnumDescriptor* $classname$_descriptor() {\n"
+      "  protobuf_AssignDescriptorsOnce();\n"
+      "  return $classname$_descriptor_;\n"
+      "}\n");
   }
 
   printer->Print(vars,
     "bool $classname$_IsValid(int value) {\n"
-    "  switch (value) {\n");
+    "  switch(value) {\n");
 
   // Multiple values may have the same number.  Make sure we only cover
   // each number once by first constructing a set containing all valid
   // numbers, then printing a case statement for each element.
 
-  std::set<int> numbers;
+  set<int> numbers;
   for (int j = 0; j < descriptor_->value_count(); j++) {
     const EnumValueDescriptor* value = descriptor_->value(j);
     numbers.insert(value->number());
   }
 
-  for (std::set<int>::iterator iter = numbers.begin();
+  for (set<int>::iterator iter = numbers.begin();
        iter != numbers.end(); ++iter) {
     printer->Print(
       "    case $number$:\n",
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum.h b/src/google/protobuf/compiler/cpp/cpp_enum.h
index 0d2488a..90edf00 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum.h
+++ b/src/google/protobuf/compiler/cpp/cpp_enum.h
@@ -66,8 +66,7 @@
   // enums. A given key in enum_names will map from an enum class name to the
   // EnumDescriptor that was responsible for its inclusion in the map. This can
   // be used to associate the descriptor with the code generated for it.
-  void FillForwardDeclaration(
-      std::map<string, const EnumDescriptor*>* enum_names);
+  void FillForwardDeclaration(map<string, const EnumDescriptor*>* enum_names);
 
   // Generate header code defining the enum.  This code should be placed
   // within the enum's package namespace, but NOT within any class, even for
@@ -86,10 +85,13 @@
 
   // Source file stuff.
 
+  // Generate code that initializes the global variable storing the enum's
+  // descriptor.
+  void GenerateDescriptorInitializer(io::Printer* printer, int index);
+
   // Generate non-inline methods related to the enum, such as IsValidValue().
-  // Goes in the .cc file. EnumDescriptors are stored in an array, idx is
-  // the index in this array that corresponds with this enum.
-  void GenerateMethods(int idx, io::Printer* printer);
+  // Goes in the .cc file.
+  void GenerateMethods(io::Printer* printer);
 
  private:
   const EnumDescriptor* descriptor_;
@@ -98,7 +100,6 @@
   // whether to generate the *_ARRAYSIZE constant.
   const bool generate_array_size_;
 
-  friend class FileGenerator;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator);
 };
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum_field.cc b/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
index 3d5b5b8..10252b3 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
@@ -35,8 +35,8 @@
 #include <google/protobuf/compiler/cpp/cpp_enum_field.h>
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
 #include <google/protobuf/stubs/strutil.h>
+#include <google/protobuf/wire_format.h>
 
 namespace google {
 namespace protobuf {
@@ -46,7 +46,7 @@
 namespace {
 
 void SetEnumVariables(const FieldDescriptor* descriptor,
-                      std::map<string, string>* variables,
+                      map<string, string>* variables,
                       const Options& options) {
   SetCommonFieldVariables(descriptor, variables, options);
   const EnumValueDescriptor* default_value = descriptor->default_value_enum();
@@ -74,26 +74,27 @@
 
 void EnumFieldGenerator::
 GenerateAccessorDeclarations(io::Printer* printer) const {
-  printer->Print(variables_, "$deprecated_attr$$type$ $name$() const;\n");
-  printer->Annotate("name", descriptor_);
   printer->Print(variables_,
-                 "$deprecated_attr$void ${$set_$name$$}$($type$ value);\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$$type$ $name$() const;\n"
+    "$deprecated_attr$void set_$name$($type$ value);\n");
 }
 
 void EnumFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline $type$ $classname$::$name$() const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ $type$ $classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  return static_cast< $type$ >($name$_);\n"
     "}\n"
-    "inline void $classname$::set_$name$($type$ value) {\n");
+    "$inline$ void $classname$::set_$name$($type$ value) {\n");
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
-    printer->Print(variables_,
+    printer->Print(variables,
     "  assert($type$_IsValid(value));\n");
   }
-  printer->Print(variables_,
+  printer->Print(variables,
     "  $set_hasbit$\n"
     "  $name$_ = value;\n"
     "  // @@protoc_insertion_point(field_set:$full_name$)\n"
@@ -112,7 +113,7 @@
 
 void EnumFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "swap($name$_, other->$name$_);\n");
+  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
 }
 
 void EnumFieldGenerator::
@@ -121,11 +122,6 @@
 }
 
 void EnumFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_ = from.$name$_;\n");
-}
-
-void EnumFieldGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) const {
   printer->Print(variables_,
     "int value;\n"
@@ -142,14 +138,12 @@
     if (UseUnknownFieldSet(descriptor_->file(), options_)) {
       printer->Print(variables_,
         "} else {\n"
-        "  mutable_unknown_fields()->AddVarint(\n"
-        "      $number$, static_cast< ::google::protobuf::uint64>(value));\n");
+        "  mutable_unknown_fields()->AddVarint($number$, value);\n");
     } else {
       printer->Print(
         "} else {\n"
-        "  unknown_fields_stream.WriteVarint32($tag$u);\n"
-        "  unknown_fields_stream.WriteVarint32(\n"
-        "      static_cast< ::google::protobuf::uint32>(value));\n",
+        "  unknown_fields_stream.WriteVarint32($tag$);\n"
+        "  unknown_fields_stream.WriteVarint32(value);\n",
         "tag", SimpleItoa(internal::WireFormat::MakeTag(descriptor_)));
     }
     printer->Print(variables_,
@@ -190,21 +184,24 @@
 EnumOneofFieldGenerator::~EnumOneofFieldGenerator() {}
 
 void EnumOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline $type$ $classname$::$name$() const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ $type$ $classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  if (has_$name$()) {\n"
     "    return static_cast< $type$ >($oneof_prefix$$name$_);\n"
     "  }\n"
     "  return static_cast< $type$ >($default$);\n"
     "}\n"
-    "inline void $classname$::set_$name$($type$ value) {\n");
+    "$inline$ void $classname$::set_$name$($type$ value) {\n");
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
-    printer->Print(variables_,
+    printer->Print(variables,
     "  assert($type$_IsValid(value));\n");
   }
-  printer->Print(variables_,
+  printer->Print(variables,
     "  if (!has_$name$()) {\n"
     "    clear_$oneof_name$();\n"
     "    set_has_$name$();\n"
@@ -227,7 +224,7 @@
 void EnumOneofFieldGenerator::
 GenerateConstructorCode(io::Printer* printer) const {
   printer->Print(variables_,
-                 "$ns$::_$classname$_default_instance_.$name$_ = $default$;\n");
+    "  $classname$_default_oneof_instance_->$name$_ = $default$;\n");
 }
 
 // ===================================================================
@@ -254,56 +251,49 @@
 void RepeatedEnumFieldGenerator::
 GenerateAccessorDeclarations(io::Printer* printer) const {
   printer->Print(variables_,
-                 "$deprecated_attr$$type$ $name$(int index) const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$set_$name$$}$(int index, $type$ value);\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$$type$ $name$(int index) const;\n"
+    "$deprecated_attr$void set_$name$(int index, $type$ value);\n"
+    "$deprecated_attr$void add_$name$($type$ value);\n");
   printer->Print(variables_,
-                 "$deprecated_attr$void ${$add_$name$$}$($type$ value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$const ::google::protobuf::RepeatedField<int>& $name$() const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$::google::protobuf::RepeatedField<int>* "
-                 "${$mutable_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$const ::google::protobuf::RepeatedField<int>& $name$() const;\n"
+    "$deprecated_attr$::google::protobuf::RepeatedField<int>* mutable_$name$();\n");
 }
 
 void RepeatedEnumFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline $type$ $classname$::$name$(int index) const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ $type$ $classname$::$name$(int index) const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  return static_cast< $type$ >($name$_.Get(index));\n"
     "}\n"
-    "inline void $classname$::set_$name$(int index, $type$ value) {\n");
+    "$inline$ void $classname$::set_$name$(int index, $type$ value) {\n");
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
-    printer->Print(variables_,
+    printer->Print(variables,
     "  assert($type$_IsValid(value));\n");
   }
-  printer->Print(variables_,
+  printer->Print(variables,
     "  $name$_.Set(index, value);\n"
     "  // @@protoc_insertion_point(field_set:$full_name$)\n"
     "}\n"
-    "inline void $classname$::add_$name$($type$ value) {\n");
+    "$inline$ void $classname$::add_$name$($type$ value) {\n");
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
-    printer->Print(variables_,
+    printer->Print(variables,
     "  assert($type$_IsValid(value));\n");
   }
-  printer->Print(variables_,
+  printer->Print(variables,
     "  $name$_.Add(value);\n"
     "  // @@protoc_insertion_point(field_add:$full_name$)\n"
-    "}\n"
-    "inline const ::google::protobuf::RepeatedField<int>&\n"
+    "}\n");
+  printer->Print(variables,
+    "$inline$ const ::google::protobuf::RepeatedField<int>&\n"
     "$classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_list:$full_name$)\n"
     "  return $name$_;\n"
     "}\n"
-    "inline ::google::protobuf::RepeatedField<int>*\n"
+    "$inline$ ::google::protobuf::RepeatedField<int>*\n"
     "$classname$::mutable_$name$() {\n"
     "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
     "  return &$name$_;\n"
@@ -322,7 +312,7 @@
 
 void RepeatedEnumFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n");
+  printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n");
 }
 
 void RepeatedEnumFieldGenerator::
@@ -348,14 +338,12 @@
     if (UseUnknownFieldSet(descriptor_->file(), options_)) {
       printer->Print(variables_,
         "} else {\n"
-        "  mutable_unknown_fields()->AddVarint(\n"
-        "      $number$, static_cast< ::google::protobuf::uint64>(value));\n");
+        "  mutable_unknown_fields()->AddVarint($number$, value);\n");
     } else {
       printer->Print(
         "} else {\n"
         "  unknown_fields_stream.WriteVarint32(tag);\n"
-        "  unknown_fields_stream.WriteVarint32(\n"
-        "      static_cast< ::google::protobuf::uint32>(value));\n");
+        "  unknown_fields_stream.WriteVarint32(value);\n");
     }
     printer->Print("}\n");
   }
@@ -397,7 +385,7 @@
       "::google::protobuf::uint32 length;\n"
       "DO_(input->ReadVarint32(&length));\n"
       "::google::protobuf::io::CodedInputStream::Limit limit = "
-          "input->PushLimit(static_cast<int>(length));\n"
+          "input->PushLimit(length);\n"
       "while (input->BytesUntilLimit() > 0) {\n"
       "  int value;\n"
       "  DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
@@ -413,13 +401,11 @@
       "  } else {\n");
       if (UseUnknownFieldSet(descriptor_->file(), options_)) {
         printer->Print(variables_,
-        "  mutable_unknown_fields()->AddVarint(\n"
-        "      $number$, static_cast< ::google::protobuf::uint64>(value));\n");
+        "    mutable_unknown_fields()->AddVarint($number$, value);\n");
       } else {
         printer->Print(variables_,
         "    unknown_fields_stream.WriteVarint32(tag);\n"
-        "    unknown_fields_stream.WriteVarint32(\n"
-        "        static_cast< ::google::protobuf::uint32>(value));\n");
+        "    unknown_fields_stream.WriteVarint32(value);\n");
       }
       printer->Print(
       "  }\n");
@@ -440,12 +426,11 @@
       "    $number$,\n"
       "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n"
       "    output);\n"
-      "  output->WriteVarint32(\n"
-      "      static_cast< ::google::protobuf::uint32>(_$name$_cached_byte_size_));\n"
+      "  output->WriteVarint32(_$name$_cached_byte_size_);\n"
       "}\n");
   }
   printer->Print(variables_,
-      "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n");
+      "for (int i = 0; i < this->$name$_size(); i++) {\n");
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
       "  ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag(\n"
@@ -469,46 +454,48 @@
       "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n"
       "    target);\n"
       "  target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray("
-      "      static_cast< ::google::protobuf::uint32>(\n"
-      "          _$name$_cached_byte_size_), target);\n"
-      "  target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\n"
-      "    this->$name$_, target);\n"
+      "    _$name$_cached_byte_size_, target);\n"
       "}\n");
+  }
+  printer->Print(variables_,
+      "for (int i = 0; i < this->$name$_size(); i++) {\n");
+  if (descriptor_->is_packed()) {
+    printer->Print(variables_,
+      "  target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\n"
+      "    this->$name$(i), target);\n");
   } else {
     printer->Print(variables_,
-      "target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n"
-      "  $number$, this->$name$_, target);\n");
+      "  target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n"
+      "    $number$, this->$name$(i), target);\n");
   }
+  printer->Print("}\n");
 }
 
 void RepeatedEnumFieldGenerator::
 GenerateByteSize(io::Printer* printer) const {
   printer->Print(variables_,
     "{\n"
-    "  size_t data_size = 0;\n"
-    "  unsigned int count = static_cast<unsigned int>(this->$name$_size());");
+    "  int data_size = 0;\n");
   printer->Indent();
   printer->Print(variables_,
-      "for (unsigned int i = 0; i < count; i++) {\n"
+      "for (int i = 0; i < this->$name$_size(); i++) {\n"
       "  data_size += ::google::protobuf::internal::WireFormatLite::EnumSize(\n"
-      "    this->$name$(static_cast<int>(i)));\n"
+      "    this->$name$(i));\n"
       "}\n");
 
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
       "if (data_size > 0) {\n"
       "  total_size += $tag_size$ +\n"
-      "    ::google::protobuf::internal::WireFormatLite::Int32Size(\n"
-      "        static_cast< ::google::protobuf::int32>(data_size));\n"
+      "    ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n"
       "}\n"
-      "int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);\n"
       "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
-      "_$name$_cached_byte_size_ = cached_size;\n"
+      "_$name$_cached_byte_size_ = data_size;\n"
       "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
       "total_size += data_size;\n");
   } else {
     printer->Print(variables_,
-      "total_size += ($tag_size$UL * count) + data_size;\n");
+      "total_size += $tag_size$ * this->$name$_size() + data_size;\n");
   }
   printer->Outdent();
   printer->Print("}\n");
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum_field.h b/src/google/protobuf/compiler/cpp/cpp_enum_field.h
index d0e87b7..fe21c57 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum_field.h
+++ b/src/google/protobuf/compiler/cpp/cpp_enum_field.h
@@ -52,12 +52,12 @@
   // implements FieldGenerator ---------------------------------------
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
@@ -65,7 +65,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator);
@@ -78,7 +78,8 @@
   ~EnumOneofFieldGenerator();
 
   // implements FieldGenerator ---------------------------------------
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
@@ -96,12 +97,12 @@
   // implements FieldGenerator ---------------------------------------
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const {}
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
@@ -110,7 +111,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/cpp/cpp_extension.cc b/src/google/protobuf/compiler/cpp/cpp_extension.cc
index 0a4e0bb..c42f162 100644
--- a/src/google/protobuf/compiler/cpp/cpp_extension.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_extension.cc
@@ -35,10 +35,9 @@
 #include <google/protobuf/compiler/cpp/cpp_extension.h>
 #include <map>
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/strutil.h>
-
 
 namespace google {
 namespace protobuf {
@@ -93,7 +92,7 @@
 ExtensionGenerator::~ExtensionGenerator() {}
 
 void ExtensionGenerator::GenerateDeclaration(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["extendee"     ] = ExtendeeClassName(descriptor_);
   vars["number"       ] = SimpleItoa(descriptor_->number());
   vars["type_traits"  ] = type_traits_;
@@ -129,7 +128,7 @@
     ClassName(descriptor_->extension_scope(), false) + "::";
   string name = scope + descriptor_->name();
 
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["extendee"     ] = ExtendeeClassName(descriptor_);
   vars["type_traits"  ] = type_traits_;
   vars["name"         ] = name;
@@ -167,6 +166,44 @@
     "  $name$($constant_name$, $default$);\n");
 }
 
+void ExtensionGenerator::GenerateRegistration(io::Printer* printer) {
+  map<string, string> vars;
+  vars["extendee"   ] = ExtendeeClassName(descriptor_);
+  vars["number"     ] = SimpleItoa(descriptor_->number());
+  vars["field_type" ] = SimpleItoa(static_cast<int>(descriptor_->type()));
+  vars["is_repeated"] = descriptor_->is_repeated() ? "true" : "false";
+  vars["is_packed"  ] = (descriptor_->is_repeated() &&
+                         descriptor_->options().packed())
+                        ? "true" : "false";
+
+  switch (descriptor_->cpp_type()) {
+    case FieldDescriptor::CPPTYPE_ENUM:
+      printer->Print(vars,
+        "::google::protobuf::internal::ExtensionSet::RegisterEnumExtension(\n"
+        "  &$extendee$::default_instance(),\n"
+        "  $number$, $field_type$, $is_repeated$, $is_packed$,\n");
+      printer->Print(
+        "  &$type$_IsValid);\n",
+        "type", ClassName(descriptor_->enum_type(), true));
+      break;
+    case FieldDescriptor::CPPTYPE_MESSAGE:
+      printer->Print(vars,
+        "::google::protobuf::internal::ExtensionSet::RegisterMessageExtension(\n"
+        "  &$extendee$::default_instance(),\n"
+        "  $number$, $field_type$, $is_repeated$, $is_packed$,\n");
+      printer->Print(
+        "  &$type$::default_instance());\n",
+        "type", ClassName(descriptor_->message_type(), true));
+      break;
+    default:
+      printer->Print(vars,
+        "::google::protobuf::internal::ExtensionSet::RegisterExtension(\n"
+        "  &$extendee$::default_instance(),\n"
+        "  $number$, $field_type$, $is_repeated$, $is_packed$);\n");
+      break;
+  }
+}
+
 }  // namespace cpp
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/cpp_extension.h b/src/google/protobuf/compiler/cpp/cpp_extension.h
index 30236d7..1c1caf1 100644
--- a/src/google/protobuf/compiler/cpp/cpp_extension.h
+++ b/src/google/protobuf/compiler/cpp/cpp_extension.h
@@ -67,6 +67,9 @@
   // Source file stuff.
   void GenerateDefinition(io::Printer* printer);
 
+  // Generate code to register the extension.
+  void GenerateRegistration(io::Printer* printer);
+
  private:
   const FieldDescriptor* descriptor_;
   string type_traits_;
diff --git a/src/google/protobuf/compiler/cpp/cpp_field.cc b/src/google/protobuf/compiler/cpp/cpp_field.cc
index f8e1185..b3ba3a2 100644
--- a/src/google/protobuf/compiler/cpp/cpp_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_field.cc
@@ -59,9 +59,8 @@
 using internal::WireFormat;
 
 void SetCommonFieldVariables(const FieldDescriptor* descriptor,
-                             std::map<string, string>* variables,
+                             map<string, string>* variables,
                              const Options& options) {
-  (*variables)["ns"] = Namespace(descriptor);
   (*variables)["name"] = FieldName(descriptor);
   (*variables)["index"] = SimpleItoa(descriptor->index());
   (*variables)["number"] = SimpleItoa(descriptor->number());
@@ -79,7 +78,7 @@
   (*variables)["deprecation"] = descriptor->options().deprecated()
       ? " PROTOBUF_DEPRECATED" : "";
   (*variables)["deprecated_attr"] = descriptor->options().deprecated()
-      ? "GOOGLE_PROTOBUF_DEPRECATED_ATTR " : "";
+      ? "PROTOBUF_DEPRECATED_ATTR " : "";
 
   (*variables)["cppget"] = "Get";
 
@@ -96,17 +95,10 @@
   // By default, empty string, so that generic code used for both oneofs and
   // singular fields can be written.
   (*variables)["oneof_prefix"] = "";
-
-  // These variables are placeholders to pick out the beginning and ends of
-  // identifiers for annotations (when doing so with existing variables would
-  // be ambiguous or impossible). They should never be set to anything but the
-  // empty string.
-  (*variables)["{"] = "";
-  (*variables)["}"] = "";
 }
 
 void SetCommonOneofFieldVariables(const FieldDescriptor* descriptor,
-                                  std::map<string, string>* variables) {
+                                  map<string, string>* variables) {
   const string prefix = descriptor->containing_oneof()->name() + "_.";
   (*variables)["oneof_prefix"] = prefix;
   (*variables)["oneof_name"] = descriptor->containing_oneof()->name();
@@ -202,6 +194,7 @@
   return *field_generators_[field->index()];
 }
 
+
 }  // namespace cpp
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/cpp_field.h b/src/google/protobuf/compiler/cpp/cpp_field.h
index 891e30f..3b01252 100644
--- a/src/google/protobuf/compiler/cpp/cpp_field.h
+++ b/src/google/protobuf/compiler/cpp/cpp_field.h
@@ -61,11 +61,11 @@
 // ['name', 'index', 'number', 'classname', 'declared_type', 'tag_size',
 // 'deprecation'].
 void SetCommonFieldVariables(const FieldDescriptor* descriptor,
-                             std::map<string, string>* variables,
+                             map<string, string>* variables,
                              const Options& options);
 
 void SetCommonOneofFieldVariables(const FieldDescriptor* descriptor,
-                                  std::map<string, string>* variables);
+                                  map<string, string>* variables);
 
 class FieldGenerator {
  public:
@@ -109,35 +109,25 @@
   // Generate inline definitions of depenent accessor functions for this field.
   // These are placed inside the header after all class definitions.
   virtual void GenerateDependentInlineAccessorDefinitions(
-      io::Printer* printer) const {}
+    io::Printer* printer) const {}
 
   // Generate inline definitions of accessor functions for this field.
   // These are placed inside the header after all class definitions.
   // In non-.proto.h mode, this generates dependent accessor functions as well.
   virtual void GenerateInlineAccessorDefinitions(
-      io::Printer* printer) const = 0;
+    io::Printer* printer, bool is_inline) const = 0;
 
   // Generate definitions of accessors that aren't inlined.  These are
   // placed somewhere in the .cc file.
   // Most field types don't need this, so the default implementation is empty.
   virtual void GenerateNonInlineAccessorDefinitions(
-      io::Printer* /*printer*/) const {}
+    io::Printer* /*printer*/) const {}
 
   // Generate lines of code (statements, not declarations) which clear the
-  // field.  This is used to define the clear_$name$() method
+  // field.  This is used to define the clear_$name$() method as well as
+  // the Clear() method for the whole message.
   virtual void GenerateClearingCode(io::Printer* printer) const = 0;
 
-  // Generate lines of code (statements, not declarations) which clear the field
-  // as part of the Clear() method for the whole message.  For message types
-  // which have field presence bits, MessageGenerator::GenerateClear will have
-  // already checked the presence bits.
-  //
-  // Since most field types can re-use GenerateClearingCode, this method is not
-  // pure virtual.
-  virtual void GenerateMessageClearingCode(io::Printer* printer) const {
-    GenerateClearingCode(printer);
-  }
-
   // Generate lines of code (statements, not declarations) which merges the
   // contents of the field from the current message to the target message,
   // which is stored in the generated code variable "from".
@@ -146,9 +136,6 @@
   // GenerateMergeFrom method.
   virtual void GenerateMergingCode(io::Printer* printer) const = 0;
 
-  // Generates a copy constructor
-  virtual void GenerateCopyConstructorCode(io::Printer* printer) const = 0;
-
   // Generate lines of code (statements, not declarations) which swaps
   // this field and the corresponding field of another message, which
   // is stored in the generated code variable "other". This is used to
@@ -180,6 +167,10 @@
   virtual void GenerateDefaultInstanceAllocator(io::Printer* /*printer*/)
       const {}
 
+  // Generate code that should be run when ShutdownProtobufLibrary() is called,
+  // to delete all dynamically-allocated objects.
+  virtual void GenerateShutdownCode(io::Printer* /*printer*/) const {}
+
   // Generate lines to decode this field, which will be placed inside the
   // message's MergeFromCodedStream() method.
   virtual void GenerateMergeFromCodedStream(io::Printer* printer) const = 0;
@@ -229,6 +220,7 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);
 };
 
+
 }  // namespace cpp
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/cpp_file.cc b/src/google/protobuf/compiler/cpp/cpp_file.cc
index 52a1683..385b973 100644
--- a/src/google/protobuf/compiler/cpp/cpp_file.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_file.cc
@@ -39,7 +39,6 @@
 #include <google/protobuf/stubs/shared_ptr.h>
 #endif
 #include <set>
-#include <vector>
 
 #include <google/protobuf/compiler/cpp/cpp_enum.h>
 #include <google/protobuf/compiler/cpp/cpp_service.h>
@@ -56,137 +55,44 @@
 namespace compiler {
 namespace cpp {
 
+// ===================================================================
+
 FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options)
     : file_(file),
       options_(options),
-      scc_analyzer_(options),
-      enum_generators_owner_(
+      message_generators_(
+          new google::protobuf::scoped_ptr<MessageGenerator>[file->message_type_count()]),
+      enum_generators_(
           new google::protobuf::scoped_ptr<EnumGenerator>[file->enum_type_count()]),
-      service_generators_owner_(
+      service_generators_(
           new google::protobuf::scoped_ptr<ServiceGenerator>[file->service_count()]),
-      extension_generators_owner_(
+      extension_generators_(
           new google::protobuf::scoped_ptr<ExtensionGenerator>[file->extension_count()]) {
-  std::vector<const Descriptor*> msgs = FlattenMessagesInFile(file);
-  for (int i = 0; i < msgs.size(); i++) {
-    // Deleted in destructor
-    MessageGenerator* msg_gen =
-        new MessageGenerator(msgs[i], i, options, &scc_analyzer_);
-    message_generators_.push_back(msg_gen);
-    msg_gen->AddGenerators(&enum_generators_, &extension_generators_);
+
+  for (int i = 0; i < file->message_type_count(); i++) {
+    message_generators_[i].reset(
+      new MessageGenerator(file->message_type(i), options));
   }
 
   for (int i = 0; i < file->enum_type_count(); i++) {
-    enum_generators_owner_[i].reset(
-        new EnumGenerator(file->enum_type(i), options));
-    enum_generators_.push_back(enum_generators_owner_[i].get());
+    enum_generators_[i].reset(
+      new EnumGenerator(file->enum_type(i), options));
   }
 
   for (int i = 0; i < file->service_count(); i++) {
-    service_generators_owner_[i].reset(
-        new ServiceGenerator(file->service(i), options));
-    service_generators_.push_back(service_generators_owner_[i].get());
-  }
-  if (HasGenericServices(file_, options_)) {
-    for (int i = 0; i < service_generators_.size(); i++) {
-      service_generators_[i]->index_in_metadata_ = i;
-    }
+    service_generators_[i].reset(
+      new ServiceGenerator(file->service(i), options));
   }
 
   for (int i = 0; i < file->extension_count(); i++) {
-    extension_generators_owner_[i].reset(
-        new ExtensionGenerator(file->extension(i), options));
-    extension_generators_.push_back(extension_generators_owner_[i].get());
+    extension_generators_[i].reset(
+      new ExtensionGenerator(file->extension(i), options));
   }
 
-
-  package_parts_ = Split(file_->package(), ".", true);
+  SplitStringUsing(file_->package(), ".", &package_parts_);
 }
 
-FileGenerator::~FileGenerator() {
-  for (int i = 0; i < message_generators_.size(); i++) {
-    delete message_generators_[i];
-  }
-}
-
-void FileGenerator::GenerateMacroUndefs(io::Printer* printer) {
-  // Only do this for protobuf's own types. There are some google3 protos using
-  // macros as field names and the generated code compiles after the macro
-  // expansion. Undefing these macros actually breaks such code.
-  if (file_->name() != "google/protobuf/compiler/plugin.proto") {
-    return;
-  }
-  std::vector<string> names_to_undef;
-  std::vector<const FieldDescriptor*> fields;
-  ListAllFields(file_, &fields);
-  for (int i = 0; i < fields.size(); i++) {
-    const string& name = fields[i]->name();
-    static const char* kMacroNames[] = {"major", "minor"};
-    for (int i = 0; i < GOOGLE_ARRAYSIZE(kMacroNames); ++i) {
-      if (name == kMacroNames[i]) {
-        names_to_undef.push_back(name);
-        break;
-      }
-    }
-  }
-  for (int i = 0; i < names_to_undef.size(); ++i) {
-    printer->Print(
-        "#ifdef $name$\n"
-        "#undef $name$\n"
-        "#endif\n",
-        "name", names_to_undef[i]);
-  }
-}
-
-void FileGenerator::GenerateHeader(io::Printer* printer) {
-  printer->Print(
-    "// @@protoc_insertion_point(includes)\n");
-
-  GenerateMacroUndefs(printer);
-
-  GenerateGlobalStateFunctionDeclarations(printer);
-
-  GenerateForwardDeclarations(printer);
-
-  {
-    NamespaceOpener ns(Namespace(file_), printer);
-
-    printer->Print("\n");
-
-    GenerateEnumDefinitions(printer);
-
-    printer->Print(kThickSeparator);
-    printer->Print("\n");
-
-    GenerateMessageDefinitions(printer);
-
-    printer->Print("\n");
-    printer->Print(kThickSeparator);
-    printer->Print("\n");
-
-    GenerateServiceDefinitions(printer);
-
-    GenerateExtensionIdentifiers(printer);
-
-    printer->Print("\n");
-    printer->Print(kThickSeparator);
-    printer->Print("\n");
-
-    GenerateInlineFunctionDefinitions(printer);
-
-    printer->Print(
-      "\n"
-      "// @@protoc_insertion_point(namespace_scope)\n"
-      "\n");
-  }
-
-  // We need to specialize some templates in the ::google::protobuf namespace:
-  GenerateProto2NamespaceEnumSpecializations(printer);
-
-  printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(global_scope)\n"
-    "\n");
-}
+FileGenerator::~FileGenerator() {}
 
 void FileGenerator::GenerateProtoHeader(io::Printer* printer,
                                         const string& info_path) {
@@ -211,7 +117,55 @@
 
   GenerateMetadataPragma(printer, info_path);
 
-  GenerateHeader(printer);
+  printer->Print(
+    "// @@protoc_insertion_point(includes)\n");
+
+
+  GenerateForwardDeclarations(printer);
+
+  // Open namespace.
+  GenerateNamespaceOpeners(printer);
+
+  GenerateGlobalStateFunctionDeclarations(printer);
+
+  printer->Print("\n");
+
+  GenerateEnumDefinitions(printer);
+
+  printer->Print(kThickSeparator);
+  printer->Print("\n");
+
+  GenerateMessageDefinitions(printer);
+
+  printer->Print("\n");
+  printer->Print(kThickSeparator);
+  printer->Print("\n");
+
+  GenerateServiceDefinitions(printer);
+
+  GenerateExtensionIdentifiers(printer);
+
+  printer->Print("\n");
+  printer->Print(kThickSeparator);
+  printer->Print("\n");
+
+  GenerateInlineFunctionDefinitions(printer);
+
+  printer->Print(
+    "\n"
+    "// @@protoc_insertion_point(namespace_scope)\n"
+    "\n");
+
+  // Close up namespace.
+  GenerateNamespaceClosers(printer);
+
+  // We need to specialize some templates in the ::google::protobuf namespace:
+  GenerateProto2NamespaceEnumSpecializations(printer);
+
+  printer->Print(
+    "\n"
+    "// @@protoc_insertion_point(global_scope)\n"
+    "\n");
 
   GenerateBottomHeaderGuard(printer, filename_identifier);
 }
@@ -228,34 +182,66 @@
   } else {
     GenerateLibraryIncludes(printer);
   }
-
   GenerateDependencyIncludes(printer);
   GenerateMetadataPragma(printer, info_path);
 
+  printer->Print(
+    "// @@protoc_insertion_point(includes)\n");
+
+
+
+  // Open namespace.
+  GenerateNamespaceOpeners(printer);
+
   if (!options_.proto_h) {
-    GenerateHeader(printer);
-  } else {
-    // This is unfortunately necessary for some plugins. I don't see why we
-    // need two of the same insertion points.
-    // TODO(gerbens) remove this.
-    printer->Print(
-      "// @@protoc_insertion_point(includes)\n");
-    {
-      NamespaceOpener ns(Namespace(file_), printer);
-      printer->Print(
-        "\n"
-        "// @@protoc_insertion_point(namespace_scope)\n");
-    }
-    printer->Print(
-      "\n"
-      "// @@protoc_insertion_point(global_scope)\n"
-      "\n");
+    GenerateGlobalStateFunctionDeclarations(printer);
+    GenerateMessageForwardDeclarations(printer);
+
+    printer->Print("\n");
+
+    GenerateEnumDefinitions(printer);
+
+    printer->Print(kThickSeparator);
+    printer->Print("\n");
+
+    GenerateMessageDefinitions(printer);
+
+    printer->Print("\n");
+    printer->Print(kThickSeparator);
+    printer->Print("\n");
+
+    GenerateServiceDefinitions(printer);
+
+    GenerateExtensionIdentifiers(printer);
+
+    printer->Print("\n");
+    printer->Print(kThickSeparator);
+    printer->Print("\n");
+
+    GenerateInlineFunctionDefinitions(printer);
   }
 
+  printer->Print(
+    "\n"
+    "// @@protoc_insertion_point(namespace_scope)\n");
+
+  // Close up namespace.
+  GenerateNamespaceClosers(printer);
+
+  if (!options_.proto_h) {
+    // We need to specialize some templates in the ::google::protobuf namespace:
+    GenerateProto2NamespaceEnumSpecializations(printer);
+  }
+
+  printer->Print(
+    "\n"
+    "// @@protoc_insertion_point(global_scope)\n"
+    "\n");
+
   GenerateBottomHeaderGuard(printer, filename_identifier);
 }
 
-void FileGenerator::GenerateSourceIncludes(io::Printer* printer) {
+void FileGenerator::GenerateSource(io::Printer* printer) {
   const bool use_system_include = IsWellKnownMessage(file_);
   string header =
       StripProto(file_->name()) + (options_.proto_h ? ".proto.h" : ".pb.h");
@@ -263,6 +249,9 @@
     "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
     "// source: $filename$\n"
     "\n"
+    // The generated code calls accessors that might be deprecated. We don't
+    // want the compiler to warn in generated code.
+    "#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\n"
     "#include $left$$header$$right$\n"
     "\n"
     "#include <algorithm>\n"    // for swap()
@@ -278,7 +267,7 @@
     "right", use_system_include ? ">" : "\"");
 
   // Unknown fields implementation in lite mode uses StringOutputStream
-  if (!UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) {
+  if (!UseUnknownFieldSet(file_, options_) && file_->message_type_count() > 0) {
     printer->Print(
       "#include <google/protobuf/io/zero_copy_stream_impl_lite.h>\n");
   }
@@ -303,228 +292,96 @@
     }
   }
 
-  // TODO(gerbens) Remove this when all code in google is using the same
-  // proto library. This is a temporary hack to force build errors if
-  // the proto library is compiled with GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  // and is also linking internal proto2. This is to prevent regressions while
-  // we work cleaning up the code base. After this is completed and we have
-  // one proto lib all code uses this should be removed.
-  printer->Print(
-    "// This is a temporary google only hack\n"
-    "#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS\n"
-    "#include \"third_party/protobuf/version.h\"\n"
-    "#endif\n");
-
   printer->Print(
     "// @@protoc_insertion_point(includes)\n");
-}
 
-void FileGenerator::GenerateSourceDefaultInstance(int idx,
-                                                  io::Printer* printer) {
-  printer->Print(
-      "class $classname$DefaultTypeInternal {\n"
-      " public:\n"
-      "  ::google::protobuf::internal::ExplicitlyConstructed<$classname$>\n"
-      "      _instance;\n",
-      "classname", message_generators_[idx]->classname_);
-  printer->Indent();
-  message_generators_[idx]->GenerateExtraDefaultFields(printer);
-  printer->Outdent();
-  printer->Print("} _$classname$_default_instance_;\n", "classname",
-                 message_generators_[idx]->classname_);
-}
+  GenerateNamespaceOpeners(printer);
 
-namespace {
-
-// Generates weak symbol declarations for types that are to be considered weakly
-// referenced.
-void GenerateWeakDeclarations(
-    const FileDescriptor* file, const Options& options,
-    SCCAnalyzer* scc_analyzer,
-    io::Printer* printer) {
-  std::vector<const FieldDescriptor*> fields;
-  ListAllFields(file, &fields);
-
-  // To ensure determinism and minimize the number of namespace statements,
-  // we output the forward declarations sorted on namespace and type / function
-  // name.
-  std::set<std::pair<string, string> > messages;
-  std::set<std::pair<string, string> > inits;
-  for (int i = 0; i < fields.size(); ++i) {
-    const FieldDescriptor* field = fields[i];
-    bool is_weak = IsImplicitWeakField(field, options);
-    if (is_weak) {
-      const Descriptor* msg = field->message_type();
-      string flns = FileLevelNamespace(msg);
-      string repr = ClassName(scc_analyzer->GetSCC(msg)->GetRepresentative());
-      inits.insert(std::make_pair(flns, "InitDefaults" + repr));
-      inits.insert(std::make_pair(flns, "AddDescriptors"));
-      messages.insert(std::make_pair(Namespace(msg), ClassName(msg)));
-    }
-  }
-
-  if (messages.empty()) {
-    return;
-  }
-
-  printer->Print("\n");
-  NamespaceOpener ns(printer);
-  for (std::set<std::pair<string, string> >::const_iterator it =
-           messages.begin();
-       it != messages.end(); ++it) {
-    ns.ChangeTo(it->first);
-    printer->Print(
-        "extern __attribute__((weak)) $classname$DefaultTypeInternal "
-        "_$classname$_default_instance_;\n",
-        "classname", it->second);
-  }
-  for (std::set<std::pair<string, string> >::const_iterator it = inits.begin();
-       it != inits.end(); ++it) {
-    ns.ChangeTo(it->first);
-    printer->Print("void $name$() __attribute__((weak));\n",
-                   "name", it->second);
-  }
-}
-
-}  // namespace
-
-void FileGenerator::GenerateSourceForMessage(int idx, io::Printer* printer) {
-  GenerateSourceIncludes(printer);
-  GenerateWeakDeclarations(file_, options_, &scc_analyzer_, printer);
-
-  {  // package namespace
-    NamespaceOpener ns(Namespace(file_), printer);
-
-    // Define default instances
-    GenerateSourceDefaultInstance(idx, printer);
-    if (UsingImplicitWeakFields(file_, options_)) {
-      printer->Print("void $classname$_ReferenceStrong() {}\n", "classname",
-                     message_generators_[idx]->classname_);
-    }
-
-    // Generate classes.
-    printer->Print("\n");
-    message_generators_[idx]->GenerateClassMethods(printer);
-
-    printer->Print(
-        "\n"
-        "// @@protoc_insertion_point(namespace_scope)\n");
-  }  // end package namespace
-
-  if (IsSCCRepresentative(message_generators_[idx]->descriptor_)) {
-    NamespaceOpener ns(FileLevelNamespace(file_), printer);
-    GenerateInitForSCC(GetSCC(message_generators_[idx]->descriptor_), printer);
-  }
-
-  printer->Print(
-      "\n"
-      "// @@protoc_insertion_point(global_scope)\n");
-}
-
-void FileGenerator::GenerateGlobalSource(io::Printer* printer) {
-  GenerateSourceIncludes(printer);
-  GenerateWeakDeclarations(file_, options_, &scc_analyzer_, printer);
-
-  // TODO(gerbens) Generate tables here
-
-  // Define the code to initialize reflection. This code uses a global
-  // constructor to register reflection data with the runtime pre-main.
   if (HasDescriptorMethods(file_, options_)) {
-    NamespaceOpener ns(FileLevelNamespace(file_), printer);
-    GenerateReflectionInitializationCode(printer);
+    printer->Print(
+      "\n"
+      "namespace {\n"
+      "\n");
+    for (int i = 0; i < file_->message_type_count(); i++) {
+      message_generators_[i]->GenerateDescriptorDeclarations(printer);
+    }
+    for (int i = 0; i < file_->enum_type_count(); i++) {
+      printer->Print(
+        "const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\n",
+        "name", ClassName(file_->enum_type(i), false));
+    }
+
+    if (HasGenericServices(file_, options_)) {
+      for (int i = 0; i < file_->service_count(); i++) {
+        printer->Print(
+          "const ::google::protobuf::ServiceDescriptor* $name$_descriptor_ = NULL;\n",
+          "name", file_->service(i)->name());
+      }
+    }
+
+    printer->Print(
+      "\n"
+      "}  // namespace\n"
+      "\n");
   }
 
-  NamespaceOpener ns(Namespace(file_), printer);
+  // Define our externally-visible BuildDescriptors() function.  (For the lite
+  // library, all this does is initialize default instances.)
+  GenerateBuildDescriptors(printer);
 
   // Generate enums.
-  for (int i = 0; i < enum_generators_.size(); i++) {
-    enum_generators_[i]->GenerateMethods(i, printer);
+  for (int i = 0; i < file_->enum_type_count(); i++) {
+    enum_generators_[i]->GenerateMethods(printer);
   }
 
-  // Define extensions.
-  for (int i = 0; i < extension_generators_.size(); i++) {
-    extension_generators_[i]->GenerateDefinition(printer);
+  // Generate classes.
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    if (i == 0 && HasGeneratedMethods(file_, options_)) {
+      printer->Print(
+          "\n"
+          "namespace {\n"
+          "\n"
+          "static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;\n"
+          "static void MergeFromFail(int line) {\n"
+          "  GOOGLE_CHECK(false) << __FILE__ << \":\" << line;\n"
+          "}\n"
+          "\n"
+          "}  // namespace\n"
+          "\n");
+    }
+    printer->Print("\n");
+    printer->Print(kThickSeparator);
+    printer->Print("\n");
+    message_generators_[i]->GenerateClassMethods(printer);
+
+    printer->Print("#if PROTOBUF_INLINE_NOT_IN_HEADERS\n");
+    // Generate class inline methods.
+    message_generators_[i]->GenerateInlineMethods(printer,
+                                                  /* is_inline = */ false);
+    printer->Print("#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS\n");
   }
 
   if (HasGenericServices(file_, options_)) {
     // Generate services.
-    for (int i = 0; i < service_generators_.size(); i++) {
+    for (int i = 0; i < file_->service_count(); i++) {
       if (i == 0) printer->Print("\n");
       printer->Print(kThickSeparator);
       printer->Print("\n");
       service_generators_[i]->GenerateImplementation(printer);
     }
   }
-}
 
-void FileGenerator::GenerateSource(io::Printer* printer) {
-  GenerateSourceIncludes(printer);
-  GenerateWeakDeclarations(file_, options_, &scc_analyzer_, printer);
-
-  {
-    NamespaceOpener ns(Namespace(file_), printer);
-
-    // Define default instances
-    for (int i = 0; i < message_generators_.size(); i++) {
-      GenerateSourceDefaultInstance(i, printer);
-      if (UsingImplicitWeakFields(file_, options_)) {
-        printer->Print("void $classname$_ReferenceStrong() {}\n", "classname",
-                       message_generators_[i]->classname_);
-      }
-    }
+  // Define extensions.
+  for (int i = 0; i < file_->extension_count(); i++) {
+    extension_generators_[i]->GenerateDefinition(printer);
   }
 
-  {
-    NamespaceOpener ns(FileLevelNamespace(file_), printer);
-    // Define the initialization code to initialize the default instances.
-    // This code doesn't use a global constructor.
-    GenerateInitializationCode(printer);
+  printer->Print(
+    "\n"
+    "// @@protoc_insertion_point(namespace_scope)\n");
 
-    // Define the code to initialize reflection. This code uses a global
-    // constructor to register reflection data with the runtime pre-main.
-    if (HasDescriptorMethods(file_, options_)) {
-      GenerateReflectionInitializationCode(printer);
-    }
-  }
+  GenerateNamespaceClosers(printer);
 
-
-  {
-    NamespaceOpener ns(Namespace(file_), printer);
-
-    // Actually implement the protos
-
-    // Generate enums.
-    for (int i = 0; i < enum_generators_.size(); i++) {
-      enum_generators_[i]->GenerateMethods(i, printer);
-    }
-
-    // Generate classes.
-    for (int i = 0; i < message_generators_.size(); i++) {
-      printer->Print("\n");
-      printer->Print(kThickSeparator);
-      printer->Print("\n");
-      message_generators_[i]->GenerateClassMethods(printer);
-    }
-
-    if (HasGenericServices(file_, options_)) {
-      // Generate services.
-      for (int i = 0; i < service_generators_.size(); i++) {
-        if (i == 0) printer->Print("\n");
-        printer->Print(kThickSeparator);
-        printer->Print("\n");
-        service_generators_[i]->GenerateImplementation(printer);
-      }
-    }
-
-    // Define extensions.
-    for (int i = 0; i < extension_generators_.size(); i++) {
-      extension_generators_[i]->GenerateDefinition(printer);
-    }
-
-    printer->Print(
-      "\n"
-      "// @@protoc_insertion_point(namespace_scope)\n");
-  }
   printer->Print(
     "\n"
     "// @@protoc_insertion_point(global_scope)\n");
@@ -533,9 +390,8 @@
 class FileGenerator::ForwardDeclarations {
  public:
   ~ForwardDeclarations() {
-    for (std::map<string, ForwardDeclarations*>::iterator
-             it = namespaces_.begin(),
-             end = namespaces_.end();
+    for (map<string, ForwardDeclarations *>::iterator it = namespaces_.begin(),
+                                                      end = namespaces_.end();
          it != end; ++it) {
       delete it->second;
     }
@@ -550,11 +406,11 @@
     return ns;
   }
 
-  std::map<string, const Descriptor*>& classes() { return classes_; }
-  std::map<string, const EnumDescriptor*>& enums() { return enums_; }
+  map<string, const Descriptor*>& classes() { return classes_; }
+  map<string, const EnumDescriptor*>& enums() { return enums_; }
 
-  void Print(io::Printer* printer, const Options& options) const {
-    for (std::map<string, const EnumDescriptor *>::const_iterator
+  void Print(io::Printer* printer) const {
+    for (map<string, const EnumDescriptor *>::const_iterator
              it = enums_.begin(),
              end = enums_.end();
          it != end; ++it) {
@@ -563,34 +419,19 @@
       printer->Print("bool $enumname$_IsValid(int value);\n", "enumname",
                      it->first);
     }
-    for (std::map<string, const Descriptor*>::const_iterator
-             it = classes_.begin(),
-             end = classes_.end();
+    for (map<string, const Descriptor *>::const_iterator it = classes_.begin(),
+                                                         end = classes_.end();
          it != end; ++it) {
       printer->Print("class $classname$;\n", "classname", it->first);
       printer->Annotate("classname", it->second);
-
-      printer->Print(
-          "class $classname$DefaultTypeInternal;\n"
-          "$dllexport_decl$"
-          "extern $classname$DefaultTypeInternal "
-          "_$classname$_default_instance_;\n",  // NOLINT
-          "dllexport_decl",
-          options.dllexport_decl.empty() ? "" : options.dllexport_decl + " ",
-          "classname",
-          it->first);
-      if (options.lite_implicit_weak_fields) {
-        printer->Print("void $classname$_ReferenceStrong();\n",
-                       "classname", it->first);
-      }
     }
-    for (std::map<string, ForwardDeclarations *>::const_iterator
+    for (map<string, ForwardDeclarations *>::const_iterator
              it = namespaces_.begin(),
              end = namespaces_.end();
          it != end; ++it) {
       printer->Print("namespace $nsname$ {\n",
                      "nsname", it->first);
-      it->second->Print(printer, options);
+      it->second->Print(printer);
       printer->Print("}  // namespace $nsname$\n",
                      "nsname", it->first);
     }
@@ -598,16 +439,19 @@
 
 
  private:
-  std::map<string, ForwardDeclarations*> namespaces_;
-  std::map<string, const Descriptor*> classes_;
-  std::map<string, const EnumDescriptor*> enums_;
+  map<string, ForwardDeclarations*> namespaces_;
+  map<string, const Descriptor*> classes_;
+  map<string, const EnumDescriptor*> enums_;
 };
 
-void FileGenerator::GenerateReflectionInitializationCode(io::Printer* printer) {
+void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) {
   // AddDescriptors() is a file-level procedure which adds the encoded
   // FileDescriptorProto for this .proto file to the global DescriptorPool for
-  // generated files (DescriptorPool::generated_pool()). It ordinarily runs at
-  // static initialization time, but is not used at all in LITE_RUNTIME mode.
+  // generated files (DescriptorPool::generated_pool()). It either runs at
+  // static initialization time (by default) or when default_instance() is
+  // called for the first time (in LITE_RUNTIME mode with
+  // GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER flag enabled). This procedure also
+  // constructs default instances and registers extensions.
   //
   // Its sibling, AssignDescriptors(), actually pulls the compiled
   // FileDescriptor from the DescriptorPool and uses it to populate all of
@@ -616,151 +460,142 @@
   // anyone calls descriptor() or GetReflection() on one of the types defined
   // in the file.
 
-  if (!message_generators_.empty()) {
-    printer->Print("::google::protobuf::Metadata file_level_metadata[$size$];\n", "size",
-                   SimpleItoa(message_generators_.size()));
-  }
-  if (!enum_generators_.empty()) {
+  // In optimize_for = LITE_RUNTIME mode, we don't generate AssignDescriptors()
+  // and we only use AddDescriptors() to allocate default instances.
+  if (HasDescriptorMethods(file_, options_)) {
     printer->Print(
-        "const ::google::protobuf::EnumDescriptor* "
-        "file_level_enum_descriptors[$size$];\n",
-        "size", SimpleItoa(enum_generators_.size()));
-  }
-  if (HasGenericServices(file_, options_) && file_->service_count() > 0) {
-    printer->Print(
-        "const ::google::protobuf::ServiceDescriptor* "
-        "file_level_service_descriptors[$size$];\n",
-        "size", SimpleItoa(file_->service_count()));
-  }
+      "\n"
+      "void $assigndescriptorsname$() {\n",
+      "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name()));
+    printer->Indent();
 
-  if (!message_generators_.empty()) {
+    // Make sure the file has found its way into the pool.  If a descriptor
+    // is requested *during* static init then AddDescriptors() may not have
+    // been called yet, so we call it manually.  Note that it's fine if
+    // AddDescriptors() is called multiple times.
     printer->Print(
-        "\n"
-        "const ::google::protobuf::uint32 TableStruct::offsets[] "
-        "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n");
-    printer->Indent();
-    std::vector<std::pair<size_t, size_t> > pairs;
-    pairs.reserve(message_generators_.size());
-    for (int i = 0; i < message_generators_.size(); i++) {
-      pairs.push_back(message_generators_[i]->GenerateOffsets(printer));
+      "$adddescriptorsname$();\n",
+      "adddescriptorsname", GlobalAddDescriptorsName(file_->name()));
+
+    // Get the file's descriptor from the pool.
+    printer->Print(
+      "const ::google::protobuf::FileDescriptor* file =\n"
+      "  ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n"
+      "    \"$filename$\");\n"
+      // Note that this GOOGLE_CHECK is necessary to prevent a warning about "file"
+      // being unused when compiling an empty .proto file.
+      "GOOGLE_CHECK(file != NULL);\n",
+      "filename", file_->name());
+
+    // Go through all the stuff defined in this file and generated code to
+    // assign the global descriptor pointers based on the file descriptor.
+    for (int i = 0; i < file_->message_type_count(); i++) {
+      message_generators_[i]->GenerateDescriptorInitializer(printer, i);
     }
-    printer->Outdent();
-    printer->Print(
-        "};\n"
-        "static const ::google::protobuf::internal::MigrationSchema schemas[] "
-        "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n");
-    printer->Indent();
-    {
-      int offset = 0;
-      for (int i = 0; i < message_generators_.size(); i++) {
-        message_generators_[i]->GenerateSchema(printer, offset,
-                                               pairs[i].second);
-        offset += pairs[i].first;
+    for (int i = 0; i < file_->enum_type_count(); i++) {
+      enum_generators_[i]->GenerateDescriptorInitializer(printer, i);
+    }
+    if (HasGenericServices(file_, options_)) {
+      for (int i = 0; i < file_->service_count(); i++) {
+        service_generators_[i]->GenerateDescriptorInitializer(printer, i);
       }
     }
+
     printer->Outdent();
     printer->Print(
-        "};\n"
-        "\nstatic "
-        "::google::protobuf::Message const * const file_default_instances[] = {\n");
+      "}\n"
+      "\n");
+
+    // ---------------------------------------------------------------
+
+    // protobuf_AssignDescriptorsOnce():  The first time it is called, calls
+    // AssignDescriptors().  All later times, waits for the first call to
+    // complete and then returns.
+    printer->Print(
+      "namespace {\n"
+      "\n"
+      "GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\n"
+      "inline void protobuf_AssignDescriptorsOnce() {\n"
+      "  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\n"
+      "                 &$assigndescriptorsname$);\n"
+      "}\n"
+      "\n",
+      "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name()));
+
+    // protobuf_RegisterTypes():  Calls
+    // MessageFactory::InternalRegisterGeneratedType() for each message type.
+    printer->Print(
+      "void protobuf_RegisterTypes(const ::std::string&) {\n"
+      "  protobuf_AssignDescriptorsOnce();\n");
     printer->Indent();
-    for (int i = 0; i < message_generators_.size(); i++) {
-      const Descriptor* descriptor = message_generators_[i]->descriptor_;
-      printer->Print(
-          "reinterpret_cast<const "
-          "::google::protobuf::Message*>(&$ns$::_$classname$_default_instance_),\n",
-          "classname", ClassName(descriptor), "ns", Namespace(descriptor));
+
+    for (int i = 0; i < file_->message_type_count(); i++) {
+      message_generators_[i]->GenerateTypeRegistrations(printer);
     }
+
     printer->Outdent();
     printer->Print(
-        "};\n"
-        "\n");
-  } else {
-    // we still need these symbols to exist
-    printer->Print(
-        // MSVC doesn't like empty arrays, so we add a dummy.
-        "const ::google::protobuf::uint32 TableStruct::offsets[1] = {};\n"
-        "static const ::google::protobuf::internal::MigrationSchema* schemas = NULL;\n"
-        "static const ::google::protobuf::Message* const* "
-        "file_default_instances = NULL;\n"
-        "\n");
+      "}\n"
+      "\n"
+      "}  // namespace\n");
   }
 
-  // ---------------------------------------------------------------
+  // -----------------------------------------------------------------
 
-  // protobuf_AssignDescriptorsOnce():  The first time it is called, calls
-  // AssignDescriptors().  All later times, waits for the first call to
-  // complete and then returns.
-  string message_factory = "NULL";
+  // ShutdownFile():  Deletes descriptors, default instances, etc. on shutdown.
+  printer->Print(
+    "\n"
+    "void $shutdownfilename$() {\n",
+    "shutdownfilename", GlobalShutdownFileName(file_->name()));
+  printer->Indent();
+
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    message_generators_[i]->GenerateShutdownCode(printer);
+  }
+
+  printer->Outdent();
+  printer->Print(
+    "}\n\n");
+
+  // -----------------------------------------------------------------
+
+  // Now generate the AddDescriptors() function.
+  PrintHandlingOptionalStaticInitializers(
+      file_, options_, printer,
+      // With static initializers.
+      // Note that we don't need any special synchronization in the following
+      // code
+      // because it is called at static init time before any threads exist.
+      "void $adddescriptorsname$() {\n"
+      "  static bool already_here = false;\n"
+      "  if (already_here) return;\n"
+      "  already_here = true;\n"
+      "  GOOGLE_PROTOBUF_VERIFY_VERSION;\n"
+      "\n",
+      // Without.
+      "void $adddescriptorsname$_impl() {\n"
+      "  GOOGLE_PROTOBUF_VERIFY_VERSION;\n"
+      "\n",
+      // Vars.
+      "adddescriptorsname", GlobalAddDescriptorsName(file_->name()));
+
+  printer->Indent();
+
+  // Call the AddDescriptors() methods for all of our dependencies, to make
+  // sure they get added first.
+  for (int i = 0; i < file_->dependency_count(); i++) {
+    const FileDescriptor* dependency = file_->dependency(i);
+    // Print the namespace prefix for the dependency.
+    string add_desc_name = QualifiedFileLevelSymbol(
+        dependency->package(), GlobalAddDescriptorsName(dependency->name()));
+    // Call its AddDescriptors function.
     printer->Print(
-        "void protobuf_AssignDescriptors() {\n"
-        // Make sure the file has found its way into the pool.  If a descriptor
-        // is requested *during* static init then AddDescriptors() may not have
-        // been called yet, so we call it manually.  Note that it's fine if
-        // AddDescriptors() is called multiple times.
-        "  AddDescriptors();\n"
-        "  ::google::protobuf::MessageFactory* factory = $factory$;\n"
-        "  AssignDescriptors(\n"
-        "      \"$filename$\", schemas, file_default_instances, "
-        "TableStruct::offsets, factory,\n"
-        "      $metadata$, $enum_descriptors$, $service_descriptors$);\n",
-        "filename", file_->name(), "metadata",
-        !message_generators_.empty() ? "file_level_metadata" : "NULL",
-        "enum_descriptors",
-        !enum_generators_.empty() ? "file_level_enum_descriptors" : "NULL",
-        "service_descriptors",
-        HasGenericServices(file_, options_) && file_->service_count() > 0
-            ? "file_level_service_descriptors"
-            : "NULL",
-        "factory", message_factory);
-    printer->Print(
-        "}\n"
-        "\n"
-        "void protobuf_AssignDescriptorsOnce() {\n"
-        "  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);\n"
-        "  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);\n"
-        "}\n"
-        "\n",
-        "filename", file_->name(), "metadata",
-        !message_generators_.empty() ? "file_level_metadata" : "NULL",
-        "enum_descriptors",
-        !enum_generators_.empty() ? "file_level_enum_descriptors" : "NULL",
-        "service_descriptors",
-        HasGenericServices(file_, options_) && file_->service_count() > 0
-            ? "file_level_service_descriptors"
-            : "NULL",
-        "factory", message_factory);
+      "$name$();\n",
+      "name", add_desc_name);
+  }
 
-    // Only here because of useless string reference that we don't want in
-    // protobuf_AssignDescriptorsOnce, because that is called from all the
-    // GetMetadata member methods.
-    printer->Print(
-        "void protobuf_RegisterTypes(const ::std::string&) "
-        "GOOGLE_PROTOBUF_ATTRIBUTE_COLD;\n"
-        "void protobuf_RegisterTypes(const ::std::string&) {\n"
-        "  protobuf_AssignDescriptorsOnce();\n");
-    printer->Indent();
-
-    // All normal messages can be done generically
-    if (!message_generators_.empty()) {
-      printer->Print(
-        "::google::protobuf::internal::RegisterAllTypes(file_level_metadata, $size$);\n",
-        "size", SimpleItoa(message_generators_.size()));
-    }
-
-    printer->Outdent();
-    printer->Print(
-        "}\n"
-        "\n");
-
-    // Now generate the AddDescriptors() function.
-    printer->Print(
-        "void AddDescriptorsImpl() {\n"
-        "  InitDefaults();\n");
-    printer->Indent();
-
-    // Embed the descriptor.  We simply serialize the entire
-    // FileDescriptorProto
+  if (HasDescriptorMethods(file_, options_)) {
+    // Embed the descriptor.  We simply serialize the entire FileDescriptorProto
     // and embed it as a string literal, which is parsed and built into real
     // descriptors at initialization time.
     FileDescriptorProto file_proto;
@@ -768,304 +603,155 @@
     string file_data;
     file_proto.SerializeToString(&file_data);
 
-    printer->Print("static const char descriptor[] "
-                   "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) "
-                   "= {\n");
-    printer->Indent();
+#ifdef _MSC_VER
+    bool breakdown_large_file = true;
+#else
+    bool breakdown_large_file = false;
+#endif
+    // Workaround for MSVC: "Error C1091: compiler limit: string exceeds 65535
+    // bytes in length". Declare a static array of characters rather than use a
+    // string literal.
+    if (breakdown_large_file && file_data.size() > 65535) {
+      // This has to be explicitly marked as a signed char because the generated
+      // code puts negative values in the array, and sometimes plain char is
+      // unsigned. That implicit narrowing conversion is not allowed in C++11.
+      // <http://stackoverflow.com/questions/4434140/narrowing-conversions-in-c0x-is-it-just-me-or-does-this-sound-like-a-breakin>
+      // has details on why.
+      printer->Print(
+          "static const signed char descriptor[] = {\n");
+      printer->Indent();
 
-    if (file_data.size() > 65535) {
-      // Workaround for MSVC: "Error C1091: compiler limit: string exceeds 65535
-      // bytes in length". Declare a static array of characters rather than use
-      // a string literal. Only write 25 bytes per line.
+      // Only write 25 bytes per line.
       static const int kBytesPerLine = 25;
       for (int i = 0; i < file_data.size();) {
-        for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) {
-          printer->Print("'$char$', ", "char",
-                         CEscape(file_data.substr(i, 1)));
-        }
-        printer->Print("\n");
+          for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) {
+            printer->Print(
+                "$char$, ",
+                "char", SimpleItoa(file_data[i]));
+          }
+          printer->Print(
+              "\n");
       }
+
+      printer->Outdent();
+      printer->Print(
+          "};\n");
+
+      printer->Print(
+          "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(descriptor, $size$);\n",
+          "size", SimpleItoa(file_data.size()));
+
     } else {
+      printer->Print(
+        "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(");
+
       // Only write 40 bytes per line.
       static const int kBytesPerLine = 40;
       for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
-        printer->Print("  \"$data$\"\n", "data",
-                       EscapeTrigraphs(CEscape(
-                           file_data.substr(i, kBytesPerLine))));
-      }
+        printer->Print("\n  \"$data$\"",
+                       "data",
+                       EscapeTrigraphs(
+                           CEscape(file_data.substr(i, kBytesPerLine))));
     }
-
-    printer->Outdent();
-    printer->Print("};\n");
     printer->Print(
-        "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\n"
-        "    descriptor, $size$);\n",
+        ", $size$);\n",
         "size", SimpleItoa(file_data.size()));
+    }
 
     // Call MessageFactory::InternalRegisterGeneratedFile().
     printer->Print(
       "::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n"
       "  \"$filename$\", &protobuf_RegisterTypes);\n",
       "filename", file_->name());
-
-  // Call the AddDescriptors() methods for all of our dependencies, to make
-  // sure they get added first.
-  for (int i = 0; i < file_->dependency_count(); i++) {
-    const FileDescriptor* dependency = file_->dependency(i);
-    // Print the namespace prefix for the dependency.
-    string file_namespace = FileLevelNamespace(dependency);
-    // Call its AddDescriptors function.
-    printer->Print("::$file_namespace$::AddDescriptors();\n", "file_namespace",
-                   file_namespace);
   }
 
+  // Allocate and initialize default instances.  This can't be done lazily
+  // since default instances are returned by simple accessors and are used with
+  // extensions.  Speaking of which, we also register extensions at this time.
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    message_generators_[i]->GenerateDefaultInstanceAllocator(printer);
+  }
+  for (int i = 0; i < file_->extension_count(); i++) {
+    extension_generators_[i]->GenerateRegistration(printer);
+  }
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    message_generators_[i]->GenerateDefaultInstanceInitializer(printer);
+  }
+
+  printer->Print(
+    "::google::protobuf::internal::OnShutdown(&$shutdownfilename$);\n",
+    "shutdownfilename", GlobalShutdownFileName(file_->name()));
+
   printer->Outdent();
   printer->Print(
-      "}\n"
-      "\n"
-      "void AddDescriptors() {\n"
-      "  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);\n"
-      "  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);\n"
-      "}\n");
+    "}\n"
+    "\n");
 
-    printer->Print(
-        "// Force AddDescriptors() to be called at dynamic initialization "
-        "time.\n"
-        "struct StaticDescriptorInitializer {\n"
-        "  StaticDescriptorInitializer() {\n"
-        "    AddDescriptors();\n"
-        "  }\n"
-        "} static_descriptor_initializer;\n");
+  PrintHandlingOptionalStaticInitializers(
+      file_, options_, printer,
+      // With static initializers.
+      "// Force AddDescriptors() to be called at static initialization time.\n"
+      "struct StaticDescriptorInitializer_$filename$ {\n"
+      "  StaticDescriptorInitializer_$filename$() {\n"
+      "    $adddescriptorsname$();\n"
+      "  }\n"
+      "} static_descriptor_initializer_$filename$_;\n",
+      // Without.
+      "GOOGLE_PROTOBUF_DECLARE_ONCE($adddescriptorsname$_once_);\n"
+      "void $adddescriptorsname$() {\n"
+      "  ::google::protobuf::GoogleOnceInit(&$adddescriptorsname$_once_,\n"
+      "                 &$adddescriptorsname$_impl);\n"
+      "}\n",
+      // Vars.
+      "adddescriptorsname", GlobalAddDescriptorsName(file_->name()), "filename",
+      FilenameIdentifier(file_->name()));
 }
 
-void FileGenerator::GenerateInitForSCC(const SCC* scc, io::Printer* printer) {
-  const string scc_name = ClassName(scc->GetRepresentative());
-  printer->Print(
-      "void InitDefaults$scc_name$Impl() {\n"
-      "  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n"
-      "#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS\n"
-      "  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();\n"
-      "#else\n"
-      "  ::google::protobuf::internal::InitProtobufDefaults();\n"
-      "#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS\n",
-        // Force initialization of primitive values we depend on.
-      "scc_name", scc_name);
+void FileGenerator::GenerateNamespaceOpeners(io::Printer* printer) {
+  if (package_parts_.size() > 0) printer->Print("\n");
 
-  printer->Indent();
-
-  // Call the InitDefaults() methods for all of our dependencies, to make
-  // sure they get added first.
-  for (int i = 0; i < scc->children.size(); i++) {
-    const SCC* child_scc = scc->children[i];
-    const FileDescriptor* dependency = child_scc->GetRepresentative()->file();
-    // Print the namespace prefix for the dependency.
-    string file_namespace = FileLevelNamespace(dependency);
-    std::map<string, string> variables;
-    variables["file_namespace"] = file_namespace;
-    variables["scc_name"] = ClassName(child_scc->GetRepresentative(), false);
-    bool using_weak_fields = UsingImplicitWeakFields(file_, options_);
-    if (using_weak_fields) {
-      // We're building for lite with implicit weak fields, so we need to handle
-      // the possibility that this InitDefaults function is not linked into the
-      // binary. Some of these might actually be guaranteed to be non-null since
-      // we might have a strong reference to the dependency (via a required
-      // field, for example), but it's simplest to just assume that any of them
-      // could be null.
-      printer->Print(
-          variables,
-          "if (&$file_namespace$::InitDefaults$scc_name$ != NULL) {\n"
-          "  $file_namespace$::InitDefaults$scc_name$();\n"
-          "}\n");
-    } else {
-      printer->Print(variables,
-                     "$file_namespace$::InitDefaults$scc_name$();\n");
-    }
+  for (int i = 0; i < package_parts_.size(); i++) {
+    printer->Print("namespace $part$ {\n",
+                   "part", package_parts_[i]);
   }
-
-  // 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) {
-      continue;
-    }
-    // TODO(gerbens) This requires this function to be friend. Remove
-    // the need for this.
-    message_generators_[i]->GenerateFieldDefaultInstances(printer);
-    printer->Print(
-        "{\n"
-        "  void* ptr = &$ns$::_$classname$_default_instance_;\n"
-        "  new (ptr) $ns$::$classname$();\n",
-        "ns", Namespace(message_generators_[i]->descriptor_),
-        "classname", ClassName(message_generators_[i]->descriptor_));
-    if (!IsMapEntryMessage(message_generators_[i]->descriptor_)) {
-      printer->Print(
-          "  ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);\n");
-    }
-    printer->Print("}\n");
-  }
-
-  // TODO(gerbens) make default instances be the same as normal instances.
-  // Default instances differ from normal instances because they have cross
-  // linked message fields.
-  for (int i = 0; i < message_generators_.size(); i++) {
-    if (scc_analyzer_.GetSCC(message_generators_[i]->descriptor_) != scc) {
-      continue;
-    }
-    printer->Print("$classname$::InitAsDefaultInstance();\n", "classname",
-                   QualifiedClassName(message_generators_[i]->descriptor_));
-  }
-  printer->Outdent();
-  printer->Print("}\n\n");
-  printer->Print(
-      "void InitDefaults$scc_name$() {\n"
-      "  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);\n"
-      "  ::google::protobuf::GoogleOnceInit(&once, "
-      "&InitDefaults$scc_name$Impl);\n"
-      "}\n\n",
-      "scc_name", scc_name);
 }
 
-void FileGenerator::GenerateInitializationCode(io::Printer* printer) {
-  // Messages depend on the existence of a default instance, which has to
-  // initialized properly. The default instances are allocated in the data
-  // segment, but we can't quite allocate the type directly. The destructors
-  // cannot run at program exit as this could lead to segfaults in a threaded
-  // environment. Hence these instances must be inplace constructed at first
-  // use.
+void FileGenerator::GenerateNamespaceClosers(io::Printer* printer) {
+  if (package_parts_.size() > 0) printer->Print("\n");
 
-  if (options_.table_driven_parsing) {
-    // TODO(ckennelly): Gate this with the same options flag to enable
-    // table-driven parsing.
-    printer->Print(
-        "PROTOBUF_CONSTEXPR_VAR ::google::protobuf::internal::ParseTableField\n"
-        "    const TableStruct::entries[] "
-        "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n");
-    printer->Indent();
-
-    std::vector<size_t> entries;
-    size_t count = 0;
-    for (int i = 0; i < message_generators_.size(); i++) {
-      size_t value = message_generators_[i]->GenerateParseOffsets(printer);
-      entries.push_back(value);
-      count += value;
-    }
-
-    // We need these arrays to exist, and MSVC does not like empty arrays.
-    if (count == 0) {
-      printer->Print("{0, 0, 0, ::google::protobuf::internal::kInvalidMask, 0, 0},\n");
-    }
-
-    printer->Outdent();
-    printer->Print(
-        "};\n"
-        "\n"
-        "PROTOBUF_CONSTEXPR_VAR ::google::protobuf::internal::AuxillaryParseTableField\n"
-        "    const TableStruct::aux[] "
-        "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n");
-    printer->Indent();
-
-    std::vector<size_t> aux_entries;
-    count = 0;
-    for (int i = 0; i < message_generators_.size(); i++) {
-      size_t value = message_generators_[i]->GenerateParseAuxTable(printer);
-      aux_entries.push_back(value);
-      count += value;
-    }
-
-    if (count == 0) {
-      printer->Print("::google::protobuf::internal::AuxillaryParseTableField(),\n");
-    }
-
-    printer->Outdent();
-    printer->Print(
-        "};\n"
-        "PROTOBUF_CONSTEXPR_VAR ::google::protobuf::internal::ParseTable const\n"
-        "    TableStruct::schema[] "
-        "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n");
-    printer->Indent();
-
-    size_t offset = 0;
-    size_t aux_offset = 0;
-    for (int i = 0; i < message_generators_.size(); i++) {
-      message_generators_[i]->GenerateParseTable(printer, offset, aux_offset);
-      offset += entries[i];
-      aux_offset += aux_entries[i];
-    }
-
-    if (message_generators_.empty()) {
-      printer->Print("{ NULL, NULL, 0, -1, -1, false },\n");
-    }
-
-    printer->Outdent();
-    printer->Print(
-        "};\n"
-        "\n");
-  }
-
-  if (!message_generators_.empty() && options_.table_driven_serialization) {
-    printer->Print(
-        "const ::google::protobuf::internal::FieldMetadata TableStruct::field_metadata[] "
-        "= {\n");
-    printer->Indent();
-    std::vector<int> field_metadata_offsets;
-    int idx = 0;
-    for (int i = 0; i < message_generators_.size(); i++) {
-      field_metadata_offsets.push_back(idx);
-      idx += message_generators_[i]->GenerateFieldMetadata(printer);
-    }
-    field_metadata_offsets.push_back(idx);
-    printer->Outdent();
-    printer->Print(
-        "};\n"
-        "const ::google::protobuf::internal::SerializationTable "
-        "TableStruct::serialization_table[] = {\n");
-    printer->Indent();
-    // We rely on the order we layout the tables to match the order we
-    // calculate them with FlattenMessagesInFile, so we check here that
-    // these match exactly.
-    std::vector<const Descriptor*> calculated_order =
-        FlattenMessagesInFile(file_);
-    GOOGLE_CHECK_EQ(calculated_order.size(), message_generators_.size());
-    for (int i = 0; i < message_generators_.size(); i++) {
-      GOOGLE_CHECK_EQ(calculated_order[i], message_generators_[i]->descriptor_);
-      printer->Print(
-          "{$num_fields$, TableStruct::field_metadata + $index$},\n",
-          "classname", message_generators_[i]->classname_, "num_fields",
-          SimpleItoa(field_metadata_offsets[i + 1] - field_metadata_offsets[i]),
-          "index", SimpleItoa(field_metadata_offsets[i]));
-    }
-    printer->Outdent();
-    printer->Print(
-        "};\n"
-        "\n");
-  }
-
-  // -----------------------------------------------------------------
-  // All functionality that need private access.
-
-  // Now generate the InitDefaults for each SCC.
-  for (int i = 0; i < message_generators_.size(); i++) {
-    if (IsSCCRepresentative(message_generators_[i]->descriptor_)) {
-      GenerateInitForSCC(GetSCC(message_generators_[i]->descriptor_), printer);
-    }
+  for (int i = package_parts_.size() - 1; i >= 0; i--) {
+    printer->Print("}  // namespace $part$\n",
+                   "part", package_parts_[i]);
   }
 }
 
 void FileGenerator::GenerateForwardDeclarations(io::Printer* printer) {
   ForwardDeclarations decls;
+  for (int i = 0; i < file_->dependency_count(); i++) {
+    FileGenerator dependency(file_->dependency(i), options_);
+    dependency.FillForwardDeclarations(&decls);
+  }
   FillForwardDeclarations(&decls);
-  decls.Print(printer, options_);
+  decls.Print(printer);
 }
 
 void FileGenerator::FillForwardDeclarations(ForwardDeclarations* decls) {
+  for (int i = 0; i < file_->public_dependency_count(); i++) {
+    FileGenerator dependency(file_->public_dependency(i), options_);
+    dependency.FillForwardDeclarations(decls);
+  }
   for (int i = 0; i < package_parts_.size(); i++) {
     decls = decls->AddOrGetNamespace(package_parts_[i]);
   }
   // Generate enum definitions.
-  for (int i = 0; i < enum_generators_.size(); i++) {
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    message_generators_[i]->FillEnumForwardDeclarations(&decls->enums());
+  }
+  for (int i = 0; i < file_->enum_type_count(); i++) {
     enum_generators_[i]->FillForwardDeclaration(&decls->enums());
   }
   // Generate forward declarations of classes.
-  for (int i = 0; i < message_generators_.size(); i++) {
+  for (int i = 0; i < file_->message_type_count(); i++) {
     message_generators_[i]->FillMessageForwardDeclarations(
         &decls->classes());
   }
@@ -1094,9 +780,6 @@
 }
 
 void FileGenerator::GenerateLibraryIncludes(io::Printer* printer) {
-  if (UsingImplicitWeakFields(file_, options_)) {
-    printer->Print("#include <google/protobuf/implicit_weak_message.h>\n");
-  }
 
   printer->Print(
     "#include <google/protobuf/stubs/common.h>\n"
@@ -1122,21 +805,14 @@
 
   // OK, it's now safe to #include other files.
   printer->Print(
-      "#include <google/protobuf/io/coded_stream.h>\n"
-      "#include <google/protobuf/arena.h>\n"
-      "#include <google/protobuf/arenastring.h>\n"
-      "#include <google/protobuf/generated_message_table_driven.h>\n"
-      "#include <google/protobuf/generated_message_util.h>\n");
-
-  if (HasDescriptorMethods(file_, options_)) {
+    "#include <google/protobuf/arena.h>\n"
+    "#include <google/protobuf/arenastring.h>\n"
+    "#include <google/protobuf/generated_message_util.h>\n");
+  if (UseUnknownFieldSet(file_, options_)) {
     printer->Print(
       "#include <google/protobuf/metadata.h>\n");
-  } else {
-    printer->Print(
-      "#include <google/protobuf/metadata_lite.h>\n");
   }
-
-  if (!message_generators_.empty()) {
+  if (file_->message_type_count() > 0) {
     if (HasDescriptorMethods(file_, options_)) {
       printer->Print(
         "#include <google/protobuf/message.h>\n");
@@ -1146,20 +822,17 @@
     }
   }
   printer->Print(
-    "#include <google/protobuf/repeated_field.h>"
-    "  // IWYU pragma: export\n"
-    "#include <google/protobuf/extension_set.h>"
-    "  // IWYU pragma: export\n");
+    "#include <google/protobuf/repeated_field.h>\n"
+    "#include <google/protobuf/extension_set.h>\n");
   if (HasMapFields(file_)) {
     printer->Print(
-        "#include <google/protobuf/map.h>"
-        "  // IWYU pragma: export\n");
+        "#include <google/protobuf/map.h>\n");
     if (HasDescriptorMethods(file_, options_)) {
-      printer->Print("#include <google/protobuf/map_entry.h>\n");
-      printer->Print("#include <google/protobuf/map_field_inl.h>\n");
+      printer->Print(
+          "#include <google/protobuf/map_field_inl.h>\n");
     } else {
-      printer->Print("#include <google/protobuf/map_entry_lite.h>\n");
-      printer->Print("#include <google/protobuf/map_field_lite.h>\n");
+      printer->Print(
+          "#include <google/protobuf/map_field_lite.h>\n");
     }
   }
 
@@ -1178,7 +851,7 @@
       "#include <google/protobuf/service.h>\n");
   }
 
-  if (UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) {
+  if (UseUnknownFieldSet(file_, options_) && file_->message_type_count() > 0) {
     printer->Print(
       "#include <google/protobuf/unknown_field_set.h>\n");
   }
@@ -1204,7 +877,7 @@
 }
 
 void FileGenerator::GenerateDependencyIncludes(io::Printer* printer) {
-  std::set<string> public_import_names;
+  set<string> public_import_names;
   for (int i = 0; i < file_->public_dependency_count(); i++) {
     public_import_names.insert(file_->public_dependency(i)->name());
   }
@@ -1226,61 +899,42 @@
 
 void FileGenerator::GenerateGlobalStateFunctionDeclarations(
     io::Printer* printer) {
-// Forward-declare the AddDescriptors, InitDefaults because these are called
-// by .pb.cc files depending on this file.
+  // Forward-declare the AddDescriptors, AssignDescriptors, and ShutdownFile
+  // functions, so that we can declare them to be friends of each class.
   printer->Print(
-      "\n"
-      "namespace $file_namespace$ {\n"
-      "// Internal implementation detail -- do not use these members.\n"
-      "struct $dllexport_decl$TableStruct {\n"
-      // These tables describe how to serialize and parse messages. Used
-      // for table driven code.
-      "  static const ::google::protobuf::internal::ParseTableField entries[];\n"
-      "  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];\n"
-      "  static const ::google::protobuf::internal::ParseTable schema[$num$];\n"
-      "  static const ::google::protobuf::internal::FieldMetadata field_metadata[];\n"
-      "  static const ::google::protobuf::internal::SerializationTable "
-      "serialization_table[];\n"
-      "  static const ::google::protobuf::uint32 offsets[];\n"
-      "};\n",
-      "file_namespace", FileLevelNamespace(file_), "dllexport_decl",
-      options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ",
-      "num", SimpleItoa(std::max(size_t(1), message_generators_.size())));
-  if (HasDescriptorMethods(file_, options_)) {
-    printer->Print(
-        "void $dllexport_decl$AddDescriptors();\n", "dllexport_decl",
-        options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ");
-  }
-  for (int i = 0; i < message_generators_.size(); i++) {
-    if (!IsSCCRepresentative(message_generators_[i]->descriptor_)) continue;
-    string scc_name = ClassName(message_generators_[i]->descriptor_);
-    // TODO(gerbens) Remove the Impl from header. This is solely because
-    // it currently still needs to be a friend of the protos.
-    printer->Print(
-        "void $dllexport_decl$InitDefaults$scc_name$Impl();\n"
-        "void $dllexport_decl$InitDefaults$scc_name$();\n",
-        "scc_name", scc_name, "dllexport_decl",
-        options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ");
-  }
-  // TODO(gerbens) This is for proto1 interoperability. Remove when proto1
-  // is gone.
+    "\n"
+    "// Internal implementation detail -- do not call these.\n"
+    "void $dllexport_decl$$adddescriptorsname$();\n",
+    "adddescriptorsname", GlobalAddDescriptorsName(file_->name()),
+    "dllexport_decl",
+    options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ");
+
   printer->Print(
-      "inline void $dllexport_decl$InitDefaults() {\n", "dllexport_decl",
-      options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ");
-  for (int i = 0; i < message_generators_.size(); i++) {
-    if (!IsSCCRepresentative(message_generators_[i]->descriptor_)) continue;
-    string scc_name = ClassName(message_generators_[i]->descriptor_);
-    printer->Print("  InitDefaults$scc_name$();\n", "scc_name", scc_name);
+    // Note that we don't put dllexport_decl on these because they are only
+    // called by the .pb.cc file in which they are defined.
+    "void $assigndescriptorsname$();\n"
+    "void $shutdownfilename$();\n"
+    "\n",
+    "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name()),
+    "shutdownfilename", GlobalShutdownFileName(file_->name()));
+}
+
+void FileGenerator::GenerateMessageForwardDeclarations(io::Printer* printer) {
+  map<string, const Descriptor*> classes;
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    message_generators_[i]->FillMessageForwardDeclarations(&classes);
   }
-  printer->Print("}\n");
-  printer->Print(
-      "}  // namespace $file_namespace$\n",
-      "file_namespace", FileLevelNamespace(file_));
+  for (map<string, const Descriptor *>::const_iterator it = classes.begin(),
+                                                       end = classes.end();
+       it != end; ++it) {
+    printer->Print("class $classname$;\n", "classname", it->first);
+    printer->Annotate("classname", it->second);
+  }
 }
 
 void FileGenerator::GenerateMessageDefinitions(io::Printer* printer) {
   // Generate class definitions.
-  for (int i = 0; i < message_generators_.size(); i++) {
+  for (int i = 0; i < file_->message_type_count(); i++) {
     if (i > 0) {
       printer->Print("\n");
       printer->Print(kThinSeparator);
@@ -1292,7 +946,10 @@
 
 void FileGenerator::GenerateEnumDefinitions(io::Printer* printer) {
   // Generate enum definitions.
-  for (int i = 0; i < enum_generators_.size(); i++) {
+  for (int i = 0; i < file_->message_type_count(); i++) {
+    message_generators_[i]->GenerateEnumDefinitions(printer);
+  }
+  for (int i = 0; i < file_->enum_type_count(); i++) {
     enum_generators_[i]->GenerateDefinition(printer);
   }
 }
@@ -1300,7 +957,7 @@
 void FileGenerator::GenerateServiceDefinitions(io::Printer* printer) {
   if (HasGenericServices(file_, options_)) {
     // Generate service definitions.
-    for (int i = 0; i < service_generators_.size(); i++) {
+    for (int i = 0; i < file_->service_count(); i++) {
       if (i > 0) {
         printer->Print("\n");
         printer->Print(kThinSeparator);
@@ -1316,35 +973,60 @@
 }
 
 void FileGenerator::GenerateExtensionIdentifiers(io::Printer* printer) {
-  // Declare extension identifiers. These are in global scope and so only
-  // the global scope extensions.
+  // Declare extension identifiers.
   for (int i = 0; i < file_->extension_count(); i++) {
-    extension_generators_owner_[i]->GenerateDeclaration(printer);
+    extension_generators_[i]->GenerateDeclaration(printer);
   }
 }
 
 void FileGenerator::GenerateInlineFunctionDefinitions(io::Printer* printer) {
-  // TODO(gerbens) remove pragmas when gcc is no longer used. Current version
-  // of gcc fires a bogus error when compiled with strict-aliasing.
-  printer->Print(
-    "#ifdef __GNUC__\n"
-    "  #pragma GCC diagnostic push\n"
-    "  #pragma GCC diagnostic ignored \"-Wstrict-aliasing\"\n"
-    "#endif  // __GNUC__\n");
+  // An aside about inline functions in .proto.h mode:
+  //
+  // The PROTOBUF_INLINE_NOT_IN_HEADERS symbol controls conditionally
+  // moving much of the inline functions to the .pb.cc file, which can be a
+  // significant performance benefit for compilation time, at the expense
+  // of non-inline function calls.
+  //
+  // However, in .proto.h mode, the definition of the internal dependent
+  // base class must remain in the header, and can never be out-lined. The
+  // dependent base class also needs access to has-bit manipuation
+  // functions, so the has-bit functions must be unconditionally inlined in
+  // proto_h mode.
+  //
+  // This gives us three flavors of functions:
+  //
+  //  1. Functions on the message not used by the internal dependent base
+  //     class: in .proto.h mode, only some functions are defined on the
+  //     message class; others are defined on the dependent base class.
+  //     These are guarded and can be out-lined. These are generated by
+  //     GenerateInlineMethods, and include has_* bit functions in
+  //     non-proto_h mode.
+  //
+  //  2. Functions on the internal dependent base class: these functions
+  //     are dependent on a template parameter, so they always need to
+  //     remain in the header.
+  //
+  //  3. Functions on the message that are used by the dependent base: the
+  //     dependent base class down casts itself to the message
+  //     implementation class to access these functions (the has_* bit
+  //     manipulation functions). Unlike #1, these functions must
+  //     unconditionally remain in the header. These are emitted by
+  //     GenerateDependentInlineMethods, even though they are not actually
+  //     dependent.
+
+  printer->Print("#if !PROTOBUF_INLINE_NOT_IN_HEADERS\n");
   // Generate class inline methods.
-  for (int i = 0; i < message_generators_.size(); i++) {
+  for (int i = 0; i < file_->message_type_count(); i++) {
     if (i > 0) {
       printer->Print(kThinSeparator);
       printer->Print("\n");
     }
-    message_generators_[i]->GenerateInlineMethods(printer);
+    message_generators_[i]->GenerateInlineMethods(printer,
+                                                  /* is_inline = */ true);
   }
-  printer->Print(
-    "#ifdef __GNUC__\n"
-    "  #pragma GCC diagnostic pop\n"
-    "#endif  // __GNUC__\n");
+  printer->Print("#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS\n");
 
-  for (int i = 0; i < message_generators_.size(); i++) {
+  for (int i = 0; i < file_->message_type_count(); i++) {
     if (i > 0) {
       printer->Print(kThinSeparator);
       printer->Print("\n");
@@ -1358,16 +1040,25 @@
     io::Printer* printer) {
   // Emit GetEnumDescriptor specializations into google::protobuf namespace:
   if (HasEnumDefinitions(file_)) {
+    // The SWIG conditional is to avoid a null-pointer dereference
+    // (bug 1984964) in swig-1.3.21 resulting from the following syntax:
+    //   namespace X { void Y<Z::W>(); }
+    // which appears in GetEnumDescriptor() specializations.
     printer->Print(
         "\n"
+        "#ifndef SWIG\n"
         "namespace google {\nnamespace protobuf {\n"
         "\n");
-    for (int i = 0; i < enum_generators_.size(); i++) {
+    for (int i = 0; i < file_->message_type_count(); i++) {
+      message_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
+    }
+    for (int i = 0; i < file_->enum_type_count(); i++) {
       enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
     }
     printer->Print(
         "\n"
-        "}  // namespace protobuf\n}  // namespace google\n");
+        "}  // namespace protobuf\n}  // namespace google\n"
+        "#endif  // SWIG\n");
   }
 }
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_file.h b/src/google/protobuf/compiler/cpp/cpp_file.h
index 7e61cba..5dcf692 100644
--- a/src/google/protobuf/compiler/cpp/cpp_file.h
+++ b/src/google/protobuf/compiler/cpp/cpp_file.h
@@ -35,17 +35,14 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__
 #define GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__
 
-#include <algorithm>
 #include <memory>
 #ifndef _SHARED_PTR_H
 #include <google/protobuf/stubs/shared_ptr.h>
 #endif
-#include <set>
 #include <string>
 #include <vector>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/compiler/cpp/cpp_field.h>
-#include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/compiler/cpp/cpp_options.h>
 
 namespace google {
@@ -71,9 +68,6 @@
   FileGenerator(const FileDescriptor* file, const Options& options);
   ~FileGenerator();
 
-  // Shared code between the two header generators below.
-  void GenerateHeader(io::Printer* printer);
-
   // info_path, if non-empty, should be the path (relative to printer's output)
   // to the metadata file describing this proto header.
   void GenerateProtoHeader(io::Printer* printer,
@@ -84,21 +78,16 @@
                         const string& info_path);
   void GenerateSource(io::Printer* printer);
 
-  int NumMessages() const { return message_generators_.size(); }
-  // Similar to GenerateSource but generates only one message
-  void GenerateSourceForMessage(int idx, io::Printer* printer);
-  void GenerateGlobalSource(io::Printer* printer);
-
  private:
   // Internal type used by GenerateForwardDeclarations (defined in file.cc).
   class ForwardDeclarations;
 
-  void GenerateSourceIncludes(io::Printer* printer);
-  void GenerateSourceDefaultInstance(int idx, io::Printer* printer);
+  // Generate the BuildDescriptors() procedure, which builds all descriptors
+  // for types defined in the file.
+  void GenerateBuildDescriptors(io::Printer* printer);
 
-  void GenerateInitForSCC(const SCC* scc, io::Printer* printer);
-  void GenerateInitializationCode(io::Printer* printer);
-  void GenerateReflectionInitializationCode(io::Printer* printer);
+  void GenerateNamespaceOpeners(io::Printer* printer);
+  void GenerateNamespaceClosers(io::Printer* printer);
 
   // For other imports, generates their forward-declarations.
   void GenerateForwardDeclarations(io::Printer* printer);
@@ -128,6 +117,18 @@
   // Generates types for classes.
   void GenerateMessageDefinitions(io::Printer* printer);
 
+  // Generates forward-declarations for just this file's classes. This is
+  // used for .pb.h headers, but not in proto_h mode.
+  void GenerateMessageForwardDeclarations(io::Printer* printer);
+
+  // Fills in types for forward declarations. This is used internally, and
+  // also by other FileGenerators to determine imports' declarations.
+  void FillMessageForwardDeclarations(ForwardDeclarations* decls);
+  void FillMessageDefinitions(ForwardDeclarations* decls);
+
+  // Generates enum definitions.
+  void GenerateEnumForwardDeclarations(io::Printer* printer);
+  void FillEnumForwardDeclarations(ForwardDeclarations* decls);
   void GenerateEnumDefinitions(io::Printer* printer);
 
   // Generates generic service definitions.
@@ -141,49 +142,16 @@
 
   void GenerateProto2NamespaceEnumSpecializations(io::Printer* printer);
 
-  // Sometimes the names we use in a .proto file happen to be defined as macros
-  // on some platforms (e.g., macro/minor used in plugin.proto are defined as
-  // macros in sys/types.h on FreeBSD and a few other platforms). To make the
-  // generated code compile on these platforms, we either have to undef the
-  // macro for these few platforms, or rename the field name for all platforms.
-  // Since these names are part of protobuf public API, renaming is generally
-  // a breaking change so we prefer the #undef approach.
-  void GenerateMacroUndefs(io::Printer* printer);
-
-  bool IsSCCRepresentative(const Descriptor* d) {
-    return GetSCCRepresentative(d) == d;
-  }
-  const Descriptor* GetSCCRepresentative(const Descriptor* d) {
-    return GetSCC(d)->GetRepresentative();
-  }
-  const SCC* GetSCC(const Descriptor* d) {
-    return scc_analyzer_.GetSCC(d);
-  }
-
-
   const FileDescriptor* file_;
   const Options options_;
 
-  SCCAnalyzer scc_analyzer_;
-
-
-  // Contains the post-order walk of all the messages (and child messages) in
-  // this file. If you need a pre-order walk just reverse iterate.
-  std::vector<MessageGenerator*> message_generators_;
-  std::vector<EnumGenerator*> enum_generators_;
-  std::vector<ServiceGenerator*> service_generators_;
-  std::vector<ExtensionGenerator*> extension_generators_;
-
-  // These members are just for owning (and thus proper deleting).
-  // Nested (enum/extension)_generators are owned by child messages.
-  google::protobuf::scoped_array<google::protobuf::scoped_ptr<EnumGenerator> > enum_generators_owner_;
-  google::protobuf::scoped_array<google::protobuf::scoped_ptr<ServiceGenerator> >
-      service_generators_owner_;
-  google::protobuf::scoped_array<google::protobuf::scoped_ptr<ExtensionGenerator> >
-      extension_generators_owner_;
+  google::protobuf::scoped_array<google::protobuf::scoped_ptr<MessageGenerator> > message_generators_;
+  google::protobuf::scoped_array<google::protobuf::scoped_ptr<EnumGenerator> > enum_generators_;
+  google::protobuf::scoped_array<google::protobuf::scoped_ptr<ServiceGenerator> > service_generators_;
+  google::protobuf::scoped_array<google::protobuf::scoped_ptr<ExtensionGenerator> > extension_generators_;
 
   // E.g. if the package is foo.bar, package_parts_ is {"foo", "bar"}.
-  std::vector<string> package_parts_;
+  vector<string> package_parts_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);
 };
diff --git a/src/google/protobuf/compiler/cpp/cpp_generator.cc b/src/google/protobuf/compiler/cpp/cpp_generator.cc
index e01e5dc..31d189c 100644
--- a/src/google/protobuf/compiler/cpp/cpp_generator.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_generator.cc
@@ -46,7 +46,6 @@
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/strutil.h>
 
 namespace google {
 namespace protobuf {
@@ -60,7 +59,7 @@
                             const string& parameter,
                             GeneratorContext* generator_context,
                             string* error) const {
-  std::vector<std::pair<string, string> > options;
+  vector<pair<string, string> > options;
   ParseGeneratorParameter(parameter, &options);
 
   // -----------------------------------------------------------------
@@ -85,7 +84,7 @@
   // __declspec(dllimport) depending on what is being compiled.
   //
   Options file_options;
-  bool split_source = false;
+
   for (int i = 0; i < options.size(); i++) {
     if (options[i].first == "dllexport_decl") {
       file_options.dllexport_decl = options[i].second;
@@ -99,14 +98,6 @@
       file_options.annotation_guard_name = options[i].second;
     } else if (options[i].first == "lite") {
       file_options.enforce_lite = true;
-    } else if (options[i].first == "lite_implicit_weak_fields") {
-      file_options.lite_implicit_weak_fields = true;
-    } else if (options[i].first == "table_driven_parsing") {
-      file_options.table_driven_parsing = true;
-    } else if (options[i].first == "table_driven_serialization") {
-      file_options.table_driven_serialization = true;
-    } else if (options[i].first == "split_source") {
-      split_source = true;
     } else {
       *error = "Unknown generator option: " + options[i].first;
       return false;
@@ -140,13 +131,14 @@
     }
   }
 
+  basename.append(".pb");
   {
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
-        generator_context->Open(basename + ".pb.h"));
+        generator_context->Open(basename + ".h"));
     GeneratedCodeInfo annotations;
     io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
         &annotations);
-    string info_path = basename + ".pb.h.meta";
+    string info_path = basename + ".h.meta";
     io::Printer printer(output.get(), '$', file_options.annotate_headers
                                                ? &annotation_collector
                                                : NULL);
@@ -160,24 +152,9 @@
   }
 
   // Generate cc file.
-  if (split_source) {
-    {
-      // This is the global .cc file, containing enum/services/tables/reflection
-      google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
-          generator_context->Open(basename + ".pb.cc"));
-      io::Printer printer(output.get(), '$');
-      file_generator.GenerateGlobalSource(&printer);
-    }
-    for (int i = 0; i < file_generator.NumMessages(); i++) {
-      // TODO(gerbens) Agree on naming scheme.
-      google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
-          generator_context->Open(basename + "." + SimpleItoa(i) + ".cc"));
-      io::Printer printer(output.get(), '$');
-      file_generator.GenerateSourceForMessage(i, &printer);
-    }
-  } else {
+  {
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
-        generator_context->Open(basename + ".pb.cc"));
+        generator_context->Open(basename + ".cc"));
     io::Printer printer(output.get(), '$');
     file_generator.GenerateSource(&printer);
   }
diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.cc b/src/google/protobuf/compiler/cpp/cpp_helpers.cc
index 96950e5..2ad4d36 100644
--- a/src/google/protobuf/compiler/cpp/cpp_helpers.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_helpers.cc
@@ -32,22 +32,19 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-#include <google/protobuf/stubs/hash.h>
 #include <limits>
 #include <map>
-#include <queue>
 #include <vector>
+#include <google/protobuf/stubs/hash.h>
 
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/io/printer.h>
+#include <google/protobuf/stubs/logging.h>
+#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 
 
-
-
 namespace google {
 namespace protobuf {
 namespace compiler {
@@ -106,30 +103,6 @@
   return false;
 }
 
-// Encode [0..63] as 'A'-'Z', 'a'-'z', '0'-'9', '_'
-char Base63Char(int value) {
-  GOOGLE_CHECK_GE(value, 0);
-  if (value < 26) return 'A' + value;
-  value -= 26;
-  if (value < 26) return 'a' + value;
-  value -= 26;
-  if (value < 10) return '0' + value;
-  GOOGLE_CHECK_EQ(value, 10);
-  return '_';
-}
-
-// Given a c identifier has 63 legal characters we can't implement base64
-// encoding. So we return the k least significant "digits" in base 63.
-template <typename I>
-string Base63(I n, int k) {
-  string res;
-  while (k-- > 0) {
-    res += Base63Char(static_cast<int>(n % 63));
-    n /= 63;
-  }
-  return res;
-}
-
 }  // namespace
 
 string UnderscoresToCamelCase(const string& input, bool cap_next_letter) {
@@ -162,62 +135,38 @@
 const char kThinSeparator[] =
   "// -------------------------------------------------------------------\n";
 
-bool CanInitializeByZeroing(const FieldDescriptor* field) {
-  if (field->is_repeated() || field->is_extension()) return false;
-  switch (field->cpp_type()) {
-    case FieldDescriptor::CPPTYPE_ENUM:
-      return field->default_value_enum()->number() == 0;
-    case FieldDescriptor::CPPTYPE_INT32:
-      return field->default_value_int32() == 0;
-    case FieldDescriptor::CPPTYPE_INT64:
-      return field->default_value_int64() == 0;
-    case FieldDescriptor::CPPTYPE_UINT32:
-      return field->default_value_uint32() == 0;
-    case FieldDescriptor::CPPTYPE_UINT64:
-      return field->default_value_uint64() == 0;
-    case FieldDescriptor::CPPTYPE_FLOAT:
-      return field->default_value_float() == 0;
-    case FieldDescriptor::CPPTYPE_DOUBLE:
-      return field->default_value_double() == 0;
-    case FieldDescriptor::CPPTYPE_BOOL:
-      return field->default_value_bool() == false;
-    default:
-      return false;
-  }
-}
+string ClassName(const Descriptor* descriptor, bool qualified) {
 
-string ClassName(const Descriptor* descriptor) {
-  const Descriptor* parent = descriptor->containing_type();
-  string res;
-  if (parent) res += ClassName(parent) + "_";
-  res += descriptor->name();
-  if (IsMapEntryMessage(descriptor)) res += "_DoNotUse";
-  return res;
-}
+  // Find "outer", the descriptor of the top-level message in which
+  // "descriptor" is embedded.
+  const Descriptor* outer = descriptor;
+  while (outer->containing_type() != NULL) outer = outer->containing_type();
 
-string ClassName(const EnumDescriptor* enum_descriptor) {
-  if (enum_descriptor->containing_type() == NULL) {
-    return enum_descriptor->name();
+  const string& outer_name = outer->full_name();
+  string inner_name = descriptor->full_name().substr(outer_name.size());
+
+  if (qualified) {
+    return "::" + DotsToColons(outer_name) + DotsToUnderscores(inner_name);
   } else {
-    return ClassName(enum_descriptor->containing_type()) + "_" +
-           enum_descriptor->name();
+    return outer->name() + DotsToUnderscores(inner_name);
   }
 }
 
-string Namespace(const string& package) {
-  if (package.empty()) return "";
-  return "::" + DotsToColons(package);
+string ClassName(const EnumDescriptor* enum_descriptor, bool qualified) {
+  if (enum_descriptor->containing_type() == NULL) {
+    if (qualified) {
+      return "::" + DotsToColons(enum_descriptor->full_name());
+    } else {
+      return enum_descriptor->name();
+    }
+  } else {
+    string result = ClassName(enum_descriptor->containing_type(), qualified);
+    result += '_';
+    result += enum_descriptor->name();
+    return result;
+  }
 }
 
-string DefaultInstanceName(const Descriptor* descriptor) {
-  string prefix = descriptor->file()->package().empty() ? "" : "::";
-  return prefix + DotsToColons(descriptor->file()->package()) + "::_" +
-      ClassName(descriptor, false) + "_default_instance_";
-}
-
-string ReferenceFunctionName(const Descriptor* descriptor) {
-  return QualifiedClassName(descriptor) + "_ReferenceStrong";
-}
 
 string DependentBaseClassTemplateName(const Descriptor* descriptor) {
   return ClassName(descriptor, false) + "_InternalBase";
@@ -254,30 +203,6 @@
   return result;
 }
 
-int EstimateAlignmentSize(const FieldDescriptor* field) {
-  if (field == NULL) return 0;
-  if (field->is_repeated()) return 8;
-  switch (field->cpp_type()) {
-    case FieldDescriptor::CPPTYPE_BOOL:
-      return 1;
-
-    case FieldDescriptor::CPPTYPE_INT32:
-    case FieldDescriptor::CPPTYPE_UINT32:
-    case FieldDescriptor::CPPTYPE_ENUM:
-    case FieldDescriptor::CPPTYPE_FLOAT:
-      return 4;
-
-    case FieldDescriptor::CPPTYPE_INT64:
-    case FieldDescriptor::CPPTYPE_UINT64:
-    case FieldDescriptor::CPPTYPE_DOUBLE:
-    case FieldDescriptor::CPPTYPE_STRING:
-    case FieldDescriptor::CPPTYPE_MESSAGE:
-      return 8;
-  }
-  GOOGLE_LOG(FATAL) << "Can't get here.";
-  return -1;  // Make compiler happy.
-}
-
 string FieldConstantName(const FieldDescriptor *field) {
   string field_name = UnderscoresToCamelCase(field->name(), true);
   string result = "k" + field_name + "FieldNumber";
@@ -446,9 +371,9 @@
       return "GOOGLE_ULONGLONG(" + SimpleItoa(field->default_value_uint64())+ ")";
     case FieldDescriptor::CPPTYPE_DOUBLE: {
       double value = field->default_value_double();
-      if (value == std::numeric_limits<double>::infinity()) {
+      if (value == numeric_limits<double>::infinity()) {
         return "::google::protobuf::internal::Infinity()";
-      } else if (value == -std::numeric_limits<double>::infinity()) {
+      } else if (value == -numeric_limits<double>::infinity()) {
         return "-::google::protobuf::internal::Infinity()";
       } else if (value != value) {
         return "::google::protobuf::internal::NaN()";
@@ -459,9 +384,9 @@
     case FieldDescriptor::CPPTYPE_FLOAT:
       {
         float value = field->default_value_float();
-        if (value == std::numeric_limits<float>::infinity()) {
+        if (value == numeric_limits<float>::infinity()) {
           return "static_cast<float>(::google::protobuf::internal::Infinity())";
-        } else if (value == -std::numeric_limits<float>::infinity()) {
+        } else if (value == -numeric_limits<float>::infinity()) {
           return "static_cast<float>(-::google::protobuf::internal::Infinity())";
         } else if (value != value) {
           return "static_cast<float>(::google::protobuf::internal::NaN())";
@@ -490,8 +415,7 @@
         CEscape(field->default_value_string())) +
         "\"";
     case FieldDescriptor::CPPTYPE_MESSAGE:
-      return "*" + FieldMessageTypeName(field) +
-             "::internal_default_instance()";
+      return FieldMessageTypeName(field) + "::default_instance()";
   }
   // Can't actually get here; make compiler happy.  (We could add a default
   // case above but then we wouldn't get the nice compiler warning when a
@@ -515,8 +439,19 @@
   return result;
 }
 
-string FileLevelNamespace(const string& filename) {
-  return "protobuf_" + FilenameIdentifier(filename);
+// Return the name of the AddDescriptors() function for a given file.
+string GlobalAddDescriptorsName(const string& filename) {
+  return "protobuf_AddDesc_" + FilenameIdentifier(filename);
+}
+
+// Return the name of the AssignDescriptors() function for a given file.
+string GlobalAssignDescriptorsName(const string& filename) {
+  return "protobuf_AssignDesc_" + FilenameIdentifier(filename);
+}
+
+// Return the name of the ShutdownFile() function for a given file.
+string GlobalShutdownFileName(const string& filename) {
+  return "protobuf_ShutdownFile_" + FilenameIdentifier(filename);
 }
 
 // Return the qualified C++ name for a file level symbol.
@@ -552,6 +487,53 @@
   return function_name;
 }
 
+bool StaticInitializersForced(const FileDescriptor* file,
+                              const Options& options) {
+  if (HasDescriptorMethods(file, options) || file->extension_count() > 0) {
+    return true;
+  }
+  for (int i = 0; i < file->message_type_count(); ++i) {
+    if (HasExtension(file->message_type(i))) {
+      return true;
+    }
+  }
+  return false;
+}
+
+void PrintHandlingOptionalStaticInitializers(
+    const FileDescriptor* file, const Options& options, io::Printer* printer,
+    const char* with_static_init, const char* without_static_init,
+    const char* var1, const string& val1, const char* var2,
+    const string& val2) {
+  map<string, string> vars;
+  if (var1) {
+    vars[var1] = val1;
+  }
+  if (var2) {
+    vars[var2] = val2;
+  }
+  PrintHandlingOptionalStaticInitializers(
+      vars, file, options, printer, with_static_init, without_static_init);
+}
+
+void PrintHandlingOptionalStaticInitializers(const map<string, string>& vars,
+                                             const FileDescriptor* file,
+                                             const Options& options,
+                                             io::Printer* printer,
+                                             const char* with_static_init,
+                                             const char* without_static_init) {
+  if (StaticInitializersForced(file, options)) {
+    printer->Print(vars, with_static_init);
+  } else {
+    printer->Print(vars, (string(
+      "#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER\n") +
+      without_static_init +
+      "#else\n" +
+      with_static_init +
+      "#endif\n").c_str());
+  }
+}
+
 
 static bool HasMapFields(const Descriptor* descriptor) {
   for (int i = 0; i < descriptor->field_count(); ++i) {
@@ -649,7 +631,7 @@
 
 static void GenerateUtf8CheckCode(const FieldDescriptor* field,
                                   const Options& options, bool for_parse,
-                                  const std::map<string, string>& variables,
+                                  const map<string, string>& variables,
                                   const char* parameters,
                                   const char* strict_function,
                                   const char* verify_function,
@@ -699,7 +681,7 @@
 
 void GenerateUtf8CheckCodeForString(const FieldDescriptor* field,
                                     const Options& options, bool for_parse,
-                                    const std::map<string, string>& variables,
+                                    const map<string, string>& variables,
                                     const char* parameters,
                                     io::Printer* printer) {
   GenerateUtf8CheckCode(field, options, for_parse, variables, parameters,
@@ -709,217 +691,13 @@
 
 void GenerateUtf8CheckCodeForCord(const FieldDescriptor* field,
                                   const Options& options, bool for_parse,
-                                  const std::map<string, string>& variables,
+                                  const map<string, string>& variables,
                                   const char* parameters,
                                   io::Printer* printer) {
   GenerateUtf8CheckCode(field, options, for_parse, variables, parameters,
                         "VerifyUtf8Cord", "VerifyUTF8CordNamedField", printer);
 }
 
-namespace {
-
-void Flatten(const Descriptor* descriptor,
-             std::vector<const Descriptor*>* flatten) {
-  for (int i = 0; i < descriptor->nested_type_count(); i++)
-    Flatten(descriptor->nested_type(i), flatten);
-  flatten->push_back(descriptor);
-}
-
-}  // namespace
-
-void FlattenMessagesInFile(const FileDescriptor* file,
-                           std::vector<const Descriptor*>* result) {
-  for (int i = 0; i < file->message_type_count(); i++) {
-    Flatten(file->message_type(i), result);
-  }
-}
-
-bool HasWeakFields(const Descriptor* descriptor) {
-  return false;
-}
-
-bool HasWeakFields(const FileDescriptor* file) {
-  return false;
-}
-
-bool UsingImplicitWeakFields(const FileDescriptor* file,
-                             const Options& options) {
-  return options.lite_implicit_weak_fields &&
-         GetOptimizeFor(file, options) == FileOptions::LITE_RUNTIME;
-}
-
-
-bool IsImplicitWeakField(const FieldDescriptor* field, const Options& options) {
-  return UsingImplicitWeakFields(field->file(), options) &&
-         field->type() == FieldDescriptor::TYPE_MESSAGE &&
-         !field->is_required() && !field->is_repeated() && !field->is_map() &&
-         field->containing_oneof() == NULL;
-}
-
-struct CompareDescriptors {
-  bool operator()(const Descriptor* a, const Descriptor* b) {
-    return a->full_name() < b->full_name();
-  }
-};
-
-SCCAnalyzer::NodeData SCCAnalyzer::DFS(const Descriptor* descriptor) {
-  // Must not have visited already.
-  GOOGLE_DCHECK_EQ(cache_.count(descriptor), 0);
-
-  // Mark visited by inserting in map.
-  NodeData& result = cache_[descriptor];
-  // Initialize data structures.
-  result.index = result.lowlink = index_++;
-  stack_.push_back(descriptor);
-
-  // Recurse the fields / nodes in graph
-  for (int i = 0; i < descriptor->field_count(); i++) {
-    const Descriptor* child = descriptor->field(i)->message_type();
-    if (child) {
-      if (cache_.count(child) == 0) {
-        // unexplored node
-        NodeData child_data = DFS(child);
-        result.lowlink = std::min(result.lowlink, child_data.lowlink);
-      } else {
-        NodeData child_data = cache_[child];
-        if (child_data.scc == NULL) {
-          // Still in the stack_ so we found a back edge
-          result.lowlink = std::min(result.lowlink, child_data.index);
-        }
-      }
-    }
-  }
-  if (result.index == result.lowlink) {
-    // This is the root of a strongly connected component
-    SCC* scc = CreateSCC();
-    while (true) {
-      const Descriptor* scc_desc = stack_.back();
-      scc->descriptors.push_back(scc_desc);
-      // Remove from stack
-      stack_.pop_back();
-      cache_[scc_desc].scc = scc;
-
-      if (scc_desc == descriptor) break;
-    }
-
-    // The order of descriptors is random and depends how this SCC was
-    // discovered. In-order to ensure maximum stability we sort it by name.
-    std::sort(scc->descriptors.begin(), scc->descriptors.end(),
-              CompareDescriptors());
-    AddChildren(scc);
-  }
-  return result;
-}
-
-void SCCAnalyzer::AddChildren(SCC* scc) {
-  std::set<const SCC*> seen;
-  for (int i = 0; i < scc->descriptors.size(); i++) {
-    const Descriptor* descriptor = scc->descriptors[i];
-    for (int j = 0; j < descriptor->field_count(); j++) {
-      const Descriptor* child_msg = descriptor->field(j)->message_type();
-      if (child_msg) {
-        const SCC* child = GetSCC(child_msg);
-        if (child == scc) continue;
-        if (seen.insert(child).second) {
-          scc->children.push_back(child);
-        }
-      }
-    }
-  }
-}
-
-MessageAnalysis SCCAnalyzer::GetSCCAnalysis(const SCC* scc) {
-  if (analysis_cache_.count(scc)) return analysis_cache_[scc];
-  MessageAnalysis result = MessageAnalysis();
-  for (int i = 0; i < scc->descriptors.size(); i++) {
-    const Descriptor* descriptor = scc->descriptors[i];
-    if (descriptor->extension_range_count() > 0) {
-      result.contains_extension = true;
-    }
-    for (int i = 0; i < descriptor->field_count(); i++) {
-      const FieldDescriptor* field = descriptor->field(i);
-      if (field->is_required()) {
-        result.contains_required = true;
-      }
-      switch (field->type()) {
-        case FieldDescriptor::TYPE_STRING:
-        case FieldDescriptor::TYPE_BYTES: {
-          if (field->options().ctype() == FieldOptions::CORD) {
-            result.contains_cord = true;
-          }
-          break;
-        }
-        case FieldDescriptor::TYPE_GROUP:
-        case FieldDescriptor::TYPE_MESSAGE: {
-          const SCC* child = GetSCC(field->message_type());
-          if (child != scc) {
-            MessageAnalysis analysis = GetSCCAnalysis(child);
-            result.contains_cord |= analysis.contains_cord;
-            result.contains_extension |= analysis.contains_extension;
-            if (!ShouldIgnoreRequiredFieldCheck(field, options_)) {
-              result.contains_required |= analysis.contains_required;
-            }
-          } else {
-            // This field points back into the same SCC hence the messages
-            // in the SCC are recursive. Note if SCC contains more than two
-            // nodes it has to be recursive, however this test also works for
-            // a single node that is recursive.
-            result.is_recursive = true;
-          }
-          break;
-        }
-        default:
-          break;
-      }
-    }
-  }
-  // We deliberately only insert the result here. After we contracted the SCC
-  // in the graph, the graph should be a DAG. Hence we shouldn't need to mark
-  // nodes visited as we can never return to them. By inserting them here
-  // we will go in an infinite loop if the SCC is not correct.
-  return analysis_cache_[scc] = result;
-}
-
-void ListAllFields(const Descriptor* d,
-                   std::vector<const FieldDescriptor*>* fields) {
-  // Collect sub messages
-  for (int i = 0; i < d->nested_type_count(); i++) {
-    ListAllFields(d->nested_type(i), fields);
-  }
-  // Collect message level extensions.
-  for (int i = 0; i < d->extension_count(); i++) {
-    fields->push_back(d->extension(i));
-  }
-  // Add types of fields necessary
-  for (int i = 0; i < d->field_count(); i++) {
-    fields->push_back(d->field(i));
-  }
-}
-
-void ListAllFields(const FileDescriptor* d,
-                   std::vector<const FieldDescriptor*>* fields) {
-  // Collect file level message.
-  for (int i = 0; i < d->message_type_count(); i++) {
-    ListAllFields(d->message_type(i), fields);
-  }
-  // Collect message level extensions.
-  for (int i = 0; i < d->extension_count(); i++) {
-    fields->push_back(d->extension(i));
-  }
-}
-
-void ListAllTypesForServices(const FileDescriptor* fd,
-                             std::vector<const Descriptor*>* types) {
-  for (int i = 0; i < fd->service_count(); i++) {
-    const ServiceDescriptor* sd = fd->service(i);
-    for (int j = 0; j < sd->method_count(); j++) {
-      const MethodDescriptor* method = sd->method(j);
-      types->push_back(method->input_type());
-      types->push_back(method->output_type());
-    }
-  }
-}
-
 }  // namespace cpp
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.h b/src/google/protobuf/compiler/cpp/cpp_helpers.h
index e0f809c..018acfc 100644
--- a/src/google/protobuf/compiler/cpp/cpp_helpers.h
+++ b/src/google/protobuf/compiler/cpp/cpp_helpers.h
@@ -38,13 +38,16 @@
 #include <map>
 #include <string>
 #include <google/protobuf/compiler/cpp/cpp_options.h>
-#include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
 
 namespace google {
 namespace protobuf {
+
+namespace io {
+class Printer;
+}
+
 namespace compiler {
 namespace cpp {
 
@@ -53,31 +56,6 @@
 extern const char kThickSeparator[];
 extern const char kThinSeparator[];
 
-// Name space of the proto file. This namespace is such that the string
-// "<namespace>::some_name" is the correct fully qualified namespace.
-// This means if the package is empty the namespace is "", and otherwise
-// the namespace is "::foo::bar::...::baz" without trailing semi-colons.
-string Namespace(const string& package);
-inline string Namespace(const FileDescriptor* d) {
-  return Namespace(d->package());
-}
-template <typename Desc>
-string Namespace(const Desc* d) {
-  return Namespace(d->file());
-}
-
-// Returns true if it's safe to reset "field" to zero.
-bool CanInitializeByZeroing(const FieldDescriptor* field);
-
-string ClassName(const Descriptor* descriptor);
-string ClassName(const EnumDescriptor* enum_descriptor);
-template <typename Desc>
-string QualifiedClassName(const Desc* d) {
-  return Namespace(d) + "::" + ClassName(d);
-}
-
-// DEPRECATED just use ClassName or QualifiedClassName, a boolean is very
-// unreadable at the callsite.
 // Returns the non-nested type name for the given type.  If "qualified" is
 // true, prefix the type with the full namespace.  For example, if you had:
 //   package foo.bar;
@@ -86,21 +64,8 @@
 //   ::foo::bar::Baz_Qux
 // While the non-qualified version would be:
 //   Baz_Qux
-inline string ClassName(const Descriptor* descriptor, bool qualified) {
-  return qualified ? QualifiedClassName(descriptor) : ClassName(descriptor);
-}
-
-inline string ClassName(const EnumDescriptor* descriptor, bool qualified) {
-  return qualified ? QualifiedClassName(descriptor) : ClassName(descriptor);
-}
-
-// Fully qualified name of the default_instance of this message.
-string DefaultInstanceName(const Descriptor* descriptor);
-
-// Returns the name of a no-op function that we can call to introduce a linker
-// dependency on the given message type. This is used to implement implicit weak
-// fields.
-string ReferenceFunctionName(const Descriptor* descriptor);
+string ClassName(const Descriptor* descriptor, bool qualified);
+string ClassName(const EnumDescriptor* enum_descriptor, bool qualified);
 
 // Name of the CRTP class template (for use with proto_h).
 // This is a class name, like "ProtoName_InternalBase".
@@ -124,12 +89,6 @@
 // Get the sanitized name that should be used for the given enum in C++ code.
 string EnumValueName(const EnumValueDescriptor* enum_value);
 
-// Returns an estimate of the compiler's alignment for the field.  This
-// can't guarantee to be correct because the generated code could be compiled on
-// different systems with different alignment rules.  The estimates below assume
-// 64-bit pointers.
-int EstimateAlignmentSize(const FieldDescriptor* field);
-
 // Get the unqualified name that should be used for a field's field
 // number constant.
 string FieldConstantName(const FieldDescriptor *field);
@@ -185,19 +144,18 @@
 // Convert a file name into a valid identifier.
 string FilenameIdentifier(const string& filename);
 
-// For each .proto file generates a unique namespace. In this namespace global
-// definitions are put to prevent collisions.
-string FileLevelNamespace(const string& filename);
-inline string FileLevelNamespace(const FileDescriptor* file) {
-  return FileLevelNamespace(file->name());
-}
-inline string FileLevelNamespace(const Descriptor* d) {
-  return FileLevelNamespace(d->file());
-}
+// Return the name of the AddDescriptors() function for a given file.
+string GlobalAddDescriptorsName(const string& filename);
+
+// Return the name of the AssignDescriptors() function for a given file.
+string GlobalAssignDescriptorsName(const string& filename);
 
 // Return the qualified C++ name for a file level symbol.
 string QualifiedFileLevelSymbol(const string& package, const string& name);
 
+// Return the name of the ShutdownFile() function for a given file.
+string GlobalShutdownFileName(const string& filename);
+
 // Escape C++ trigraphs by escaping question marks to \?
 string EscapeTrigraphs(const string& to_escape);
 
@@ -206,18 +164,8 @@
                         const FieldDescriptor* field,
                         const string& prefix);
 
-// Returns true if unknown fields are always preserved after parsing.
-inline bool AlwaysPreserveUnknownFields(const FileDescriptor* file) {
-  return file->syntax() != FileDescriptor::SYNTAX_PROTO3;
-}
-
-// Returns true if unknown fields are preserved after parsing.
-inline bool AlwaysPreserveUnknownFields(const Descriptor* message) {
-  return AlwaysPreserveUnknownFields(message->file());
-}
-
-// Returns true if generated messages have public unknown fields accessors
-inline bool PublicUnknownFieldsAccessors(const Descriptor* message) {
+// Returns true if unknown fields are preseved after parsing.
+inline bool PreserveUnknownFields(const Descriptor* message) {
   return message->file()->syntax() != FileDescriptor::SYNTAX_PROTO3;
 }
 
@@ -225,8 +173,10 @@
 ::google::protobuf::FileOptions_OptimizeMode GetOptimizeFor(
     const FileDescriptor* file, const Options& options);
 
-// Determines whether unknown fields will be stored in an UnknownFieldSet or
-// a string.
+// If PreserveUnknownFields() is true, determines whether unknown
+// fields will be stored in an UnknownFieldSet or a string.
+// If PreserveUnknownFields() is false, this method will not be
+// used.
 inline bool UseUnknownFieldSet(const FileDescriptor* file,
                                const Options& options) {
   return GetOptimizeFor(file, options) != FileOptions::LITE_RUNTIME;
@@ -269,6 +219,26 @@
   return GetOptimizeFor(file, options) == FileOptions::SPEED;
 }
 
+// Returns whether we have to generate code with static initializers.
+bool StaticInitializersForced(const FileDescriptor* file,
+                              const Options& options);
+
+// Prints 'with_static_init' if static initializers have to be used for the
+// provided file. Otherwise emits both 'with_static_init' and
+// 'without_static_init' using #ifdef.
+void PrintHandlingOptionalStaticInitializers(
+    const FileDescriptor* file, const Options& options, io::Printer* printer,
+    const char* with_static_init, const char* without_static_init,
+    const char* var1 = NULL, const string& val1 = "", const char* var2 = NULL,
+    const string& val2 = "");
+
+void PrintHandlingOptionalStaticInitializers(const map<string, string>& vars,
+                                             const FileDescriptor* file,
+                                             const Options& options,
+                                             io::Printer* printer,
+                                             const char* with_static_init,
+                                             const char* without_static_init);
+
 
 inline bool IsMapEntryMessage(const Descriptor* descriptor) {
   return descriptor->options().map_entry();
@@ -305,11 +275,6 @@
   return SupportsArenas(field->file());
 }
 
-inline bool IsCrossFileMessage(const FieldDescriptor* field) {
-  return field->type() == FieldDescriptor::TYPE_MESSAGE &&
-         field->message_type()->file() != field->file();
-}
-
 bool IsAnyMessage(const FileDescriptor* descriptor);
 bool IsAnyMessage(const Descriptor* descriptor);
 
@@ -317,13 +282,13 @@
 
 void GenerateUtf8CheckCodeForString(const FieldDescriptor* field,
                                     const Options& options, bool for_parse,
-                                    const std::map<string, string>& variables,
+                                    const map<string, string>& variables,
                                     const char* parameters,
                                     io::Printer* printer);
 
 void GenerateUtf8CheckCodeForCord(const FieldDescriptor* field,
                                   const Options& options, bool for_parse,
-                                  const std::map<string, string>& variables,
+                                  const map<string, string>& variables,
                                   const char* parameters, io::Printer* printer);
 
 inline ::google::protobuf::FileOptions_OptimizeMode GetOptimizeFor(
@@ -333,136 +298,6 @@
       : file->options().optimize_for();
 }
 
-// This orders the messages in a .pb.cc as it's outputted by file.cc
-void FlattenMessagesInFile(const FileDescriptor* file,
-                           std::vector<const Descriptor*>* result);
-inline std::vector<const Descriptor*> FlattenMessagesInFile(
-    const FileDescriptor* file) {
-  std::vector<const Descriptor*> result;
-  FlattenMessagesInFile(file, &result);
-  return result;
-}
-
-bool HasWeakFields(const Descriptor* desc);
-bool HasWeakFields(const FileDescriptor* desc);
-
-// Indicates whether we should use implicit weak fields for this file.
-bool UsingImplicitWeakFields(const FileDescriptor* file,
-                             const Options& options);
-
-// Indicates whether to treat this field as implicitly weak.
-bool IsImplicitWeakField(const FieldDescriptor* field, const Options& options);
-
-// Returns true if the "required" restriction check should be ignored for the
-// given field.
-inline static bool ShouldIgnoreRequiredFieldCheck(const FieldDescriptor* field,
-                                                  const Options& options) {
-  return false;
-}
-
-class LIBPROTOC_EXPORT NamespaceOpener {
- public:
-  explicit NamespaceOpener(io::Printer* printer) : printer_(printer) {}
-  NamespaceOpener(const string& name, io::Printer* printer)
-      : printer_(printer) {
-    ChangeTo(name);
-  }
-  ~NamespaceOpener() { ChangeTo(""); }
-
-  void ChangeTo(const string& name) {
-    std::vector<string> new_stack_ =
-        Split(name, "::", true);
-    int len = std::min(name_stack_.size(), new_stack_.size());
-    int common_idx = 0;
-    while (common_idx < len) {
-      if (name_stack_[common_idx] != new_stack_[common_idx]) break;
-      common_idx++;
-    }
-    for (int i = name_stack_.size() - 1; i >= common_idx; i--) {
-      printer_->Print("}  // namespace $ns$\n", "ns", name_stack_[i]);
-    }
-    name_stack_.swap(new_stack_);
-    for (int i = common_idx; i < name_stack_.size(); i++) {
-      printer_->Print("namespace $ns$ {\n", "ns", name_stack_[i]);
-    }
-  }
-
- private:
-  io::Printer* printer_;
-  std::vector<string> name_stack_;
-};
-
-// Description of each strongly connected component. Note that the order
-// of both the descriptors in this SCC and the order of children is
-// deterministic.
-struct SCC {
-  std::vector<const Descriptor*> descriptors;
-  std::vector<const SCC*> children;
-
-  const Descriptor* GetRepresentative() const { return descriptors[0]; }
-};
-
-struct MessageAnalysis {
-  bool is_recursive;
-  bool contains_cord;
-  bool contains_extension;
-  bool contains_required;
-};
-
-// This class is used in FileGenerator, to ensure linear instead of
-// quadratic performance, if we do this per message we would get O(V*(V+E)).
-// Logically this is just only used in message.cc, but in the header for
-// FileGenerator to help share it.
-class LIBPROTOC_EXPORT SCCAnalyzer {
- public:
-  explicit SCCAnalyzer(const Options& options) : options_(options), index_(0) {}
-  ~SCCAnalyzer() {
-    for (int i = 0; i < garbage_bin_.size(); i++) delete garbage_bin_[i];
-  }
-
-  const SCC* GetSCC(const Descriptor* descriptor) {
-    if (cache_.count(descriptor)) return cache_[descriptor].scc;
-    return DFS(descriptor).scc;
-  }
-
-  MessageAnalysis GetSCCAnalysis(const SCC* scc);
-
-  bool HasRequiredFields(const Descriptor* descriptor) {
-    MessageAnalysis result = GetSCCAnalysis(GetSCC(descriptor));
-    return result.contains_required || result.contains_extension;
-  }
-
- private:
-  struct NodeData {
-    const SCC* scc;  // if null it means its still on the stack
-    int index;
-    int lowlink;
-  };
-
-  Options options_;
-  std::map<const Descriptor*, NodeData> cache_;
-  std::map<const SCC*, MessageAnalysis> analysis_cache_;
-  std::vector<const Descriptor*> stack_;
-  int index_;
-  std::vector<SCC*> garbage_bin_;
-
-  SCC* CreateSCC() {
-    garbage_bin_.push_back(new SCC());
-    return garbage_bin_.back();
-  }
-
-  // Tarjan's Strongly Connected Components algo
-  NodeData DFS(const Descriptor* descriptor);
-
-  // Add the SCC's that are children of this SCC to its children.
-  void AddChildren(SCC* scc);
-};
-
-void ListAllFields(const FileDescriptor* d,
-                   std::vector<const FieldDescriptor*>* fields);
-void ListAllTypesForServices(const FileDescriptor* fd,
-                             std::vector<const Descriptor*>* types);
-
 }  // namespace cpp
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/cpp_map_field.cc b/src/google/protobuf/compiler/cpp/cpp_map_field.cc
index b22c075..f585c31 100644
--- a/src/google/protobuf/compiler/cpp/cpp_map_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_map_field.cc
@@ -32,7 +32,6 @@
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/wire_format.h>
-
 #include <google/protobuf/stubs/strutil.h>
 
 namespace google {
@@ -46,12 +45,10 @@
 }
 
 void SetMessageVariables(const FieldDescriptor* descriptor,
-                         std::map<string, string>* variables,
+                         map<string, string>* variables,
                          const Options& options) {
   SetCommonFieldVariables(descriptor, variables, options);
-  (*variables)["type"] = ClassName(descriptor->message_type(), false);
-  (*variables)["file_namespace"] =
-      FileLevelNamespace(descriptor->file()->name());
+  (*variables)["type"] = FieldMessageTypeName(descriptor);
   (*variables)["stream_writer"] =
       (*variables)["declared_type"] +
       (HasFastArraySerialization(descriptor->message_type()->file(), options)
@@ -115,36 +112,40 @@
 void MapFieldGenerator::
 GeneratePrivateMembers(io::Printer* printer) const {
   printer->Print(variables_,
-                 "::google::protobuf::internal::MapField$lite$<\n"
-                 "    $map_classname$,\n"
-                 "    $key_cpp$, $val_cpp$,\n"
-                 "    $key_wire_type$,\n"
-                 "    $val_wire_type$,\n"
-                 "    $default_enum_value$ > $name$_;\n");
+      "typedef ::google::protobuf::internal::MapEntryLite<\n"
+      "    $key_cpp$, $val_cpp$,\n"
+      "    $key_wire_type$,\n"
+      "    $val_wire_type$,\n"
+      "    $default_enum_value$ >\n"
+      "    $map_classname$;\n"
+      "::google::protobuf::internal::MapField$lite$<\n"
+      "    $key_cpp$, $val_cpp$,\n"
+      "    $key_wire_type$,\n"
+      "    $val_wire_type$,\n"
+      "    $default_enum_value$ > $name$_;\n");
 }
 
 void MapFieldGenerator::
 GenerateAccessorDeclarations(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "$deprecated_attr$const ::google::protobuf::Map< $key_cpp$, $val_cpp$ >&\n"
-      "    $name$() const;\n");
-  printer->Annotate("name", descriptor_);
   printer->Print(variables_,
-                 "$deprecated_attr$::google::protobuf::Map< $key_cpp$, $val_cpp$ >*\n"
-                 "    ${$mutable_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
+      "$deprecated_attr$const ::google::protobuf::Map< $key_cpp$, $val_cpp$ >&\n"
+      "    $name$() const;\n"
+      "$deprecated_attr$::google::protobuf::Map< $key_cpp$, $val_cpp$ >*\n"
+      "    mutable_$name$();\n");
 }
 
 void MapFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-      "inline const ::google::protobuf::Map< $key_cpp$, $val_cpp$ >&\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+      "$inline$ const ::google::protobuf::Map< $key_cpp$, $val_cpp$ >&\n"
       "$classname$::$name$() const {\n"
       "  // @@protoc_insertion_point(field_map:$full_name$)\n"
       "  return $name$_.GetMap();\n"
       "}\n"
-      "inline ::google::protobuf::Map< $key_cpp$, $val_cpp$ >*\n"
+      "$inline$ ::google::protobuf::Map< $key_cpp$, $val_cpp$ >*\n"
       "$classname$::mutable_$name$() {\n"
       "  // @@protoc_insertion_point(field_mutable_map:$full_name$)\n"
       "  return $name$_.MutableMap();\n"
@@ -153,7 +154,9 @@
 
 void MapFieldGenerator::
 GenerateClearingCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.Clear();\n");
+  map<string, string> variables(variables_);
+  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
+  printer->Print(variables, "$this_message$$name$_.Clear();\n");
 }
 
 void MapFieldGenerator::
@@ -167,42 +170,45 @@
 }
 
 void MapFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  GenerateConstructorCode(printer);
-  GenerateMergingCode(printer);
+GenerateConstructorCode(io::Printer* printer) const {
+  if (HasDescriptorMethods(descriptor_->file(), options_)) {
+    printer->Print(variables_,
+        "$name$_.SetAssignDescriptorCallback(\n"
+        "    protobuf_AssignDescriptorsOnce);\n"
+        "$name$_.SetEntryDescriptor(\n"
+        "    &$type$_descriptor_);\n");
+  }
 }
 
 void MapFieldGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) const {
-    const FieldDescriptor* key_field =
-        descriptor_->message_type()->FindFieldByName("key");
   const FieldDescriptor* value_field =
       descriptor_->message_type()->FindFieldByName("value");
-  bool using_entry = false;
-  string key;
-  string value;
+  printer->Print(variables_,
+      "::google::protobuf::scoped_ptr<$map_classname$> entry($name$_.NewEntry());\n");
+
   if (IsProto3Field(descriptor_) ||
       value_field->type() != FieldDescriptor::TYPE_ENUM) {
-    printer->Print(
-        variables_,
-        "$map_classname$::Parser< ::google::protobuf::internal::MapField$lite$<\n"
-        "    $map_classname$,\n"
-        "    $key_cpp$, $val_cpp$,\n"
-        "    $key_wire_type$,\n"
-        "    $val_wire_type$,\n"
-        "    $default_enum_value$ >,\n"
-        "  ::google::protobuf::Map< $key_cpp$, $val_cpp$ > >"
-        " parser(&$name$_);\n"
-        "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
-        "    input, &parser));\n");
-    key = "parser.key()";
-    value = "parser.value()";
-  } else {
-    using_entry = true;
-    key = "entry->key()";
-    value = "entry->value()";
     printer->Print(variables_,
-        "::google::protobuf::scoped_ptr<$map_classname$> entry($name$_.NewEntry());\n");
+        "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
+        "    input, entry.get()));\n");
+    switch (value_field->cpp_type()) {
+      case FieldDescriptor::CPPTYPE_MESSAGE:
+        printer->Print(variables_,
+            "(*mutable_$name$())[entry->key()].Swap("
+            "entry->mutable_value());\n");
+        break;
+      case FieldDescriptor::CPPTYPE_ENUM:
+        printer->Print(variables_,
+            "(*mutable_$name$())[entry->key()] =\n"
+            "    static_cast< $val_cpp$ >(*entry->mutable_value());\n");
+        break;
+      default:
+        printer->Print(variables_,
+            "(*mutable_$name$())[entry->key()] = *entry->mutable_value();\n");
+        break;
+    }
+  } else {
     printer->Print(variables_,
         "{\n"
         "  ::std::string data;\n"
@@ -218,189 +224,156 @@
           "->AddLengthDelimited($number$, data);\n");
     } else {
       printer->Print(variables_,
-          "    unknown_fields_stream.WriteVarint32($tag$u);\n"
-          "    unknown_fields_stream.WriteVarint32(\n"
-          "        static_cast< ::google::protobuf::uint32>(data.size()));\n"
+          "    unknown_fields_stream.WriteVarint32($tag$);\n"
+          "    unknown_fields_stream.WriteVarint32(data.size());\n"
           "    unknown_fields_stream.WriteString(data);\n");
     }
 
+
     printer->Print(variables_,
         "  }\n"
         "}\n");
   }
 
+  const FieldDescriptor* key_field =
+      descriptor_->message_type()->FindFieldByName("key");
   if (key_field->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         key_field, options_, true, variables_,
-        StrCat(key, ".data(), static_cast<int>(", key, ".length()),\n").data(),
-        printer);
+        "entry->key().data(), entry->key().length(),\n", printer);
   }
   if (value_field->type() == FieldDescriptor::TYPE_STRING) {
-    GenerateUtf8CheckCodeForString(
-        value_field, options_, true, variables_,
-        StrCat(value, ".data(), static_cast<int>(", value, ".length()),\n")
-            .data(),
-        printer);
+    GenerateUtf8CheckCodeForString(value_field, options_, true, variables_,
+                                   "entry->mutable_value()->data(),\n"
+                                   "entry->mutable_value()->length(),\n",
+                                   printer);
   }
 
   // If entry is allocated by arena, its desctructor should be avoided.
-  if (using_entry && SupportsArenas(descriptor_)) {
+  if (SupportsArenas(descriptor_)) {
     printer->Print(variables_,
         "if (entry->GetArena() != NULL) entry.release();\n");
   }
 }
 
-static void GenerateSerializationLoop(io::Printer* printer,
-                                      const std::map<string, string>& variables,
-                                      bool supports_arenas,
-                                      const string& utf8_check,
-                                      const string& loop_header,
-                                      const string& ptr,
-                                      bool loop_via_iterators) {
-  printer->Print(variables,
-      StrCat("::google::protobuf::scoped_ptr<$map_classname$> entry;\n",
-             loop_header, " {\n").c_str());
-  printer->Indent();
-
-  printer->Print(variables, StrCat(
-      "entry.reset($name$_.New$wrapper$(\n"
-      "    ", ptr, "->first, ", ptr, "->second));\n"
-      "$write_entry$;\n").c_str());
-
-  // If entry is allocated by arena, its desctructor should be avoided.
-  if (supports_arenas) {
-    printer->Print(
-        "if (entry->GetArena() != NULL) {\n"
-        "  entry.release();\n"
-        "}\n");
-  }
-
-  if (!utf8_check.empty()) {
-    // If loop_via_iterators is true then ptr is actually an iterator, and we
-    // create a pointer by prefixing it with "&*".
-    printer->Print(
-        StrCat(utf8_check, "(", (loop_via_iterators ? "&*" : ""), ptr, ");\n")
-            .c_str());
-  }
-
-  printer->Outdent();
-  printer->Print(
-      "}\n");
-}
-
 void MapFieldGenerator::
 GenerateSerializeWithCachedSizes(io::Printer* printer) const {
-  std::map<string, string> variables(variables_);
-  variables["write_entry"] = "::google::protobuf::internal::WireFormatLite::Write" +
-                             variables["stream_writer"] + "(\n            " +
-                             variables["number"] + ", *entry, output)";
-  variables["deterministic"] = "output->IsSerializationDeterministic()";
-  GenerateSerializeWithCachedSizes(printer, variables);
-}
+  printer->Print(variables_,
+      "{\n"
+      "  ::google::protobuf::scoped_ptr<$map_classname$> entry;\n"
+      "  for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n"
+      "      it = this->$name$().begin();\n"
+      "      it != this->$name$().end(); ++it) {\n");
 
-void MapFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
-  std::map<string, string> variables(variables_);
-  variables["write_entry"] =
-      "target = ::google::protobuf::internal::WireFormatLite::\n"
-      "                   InternalWrite" + variables["declared_type"] +
-      "NoVirtualToArray(\n                       " + variables["number"] +
-      ", *entry, deterministic, target);\n";
-  variables["deterministic"] = "deterministic";
-  GenerateSerializeWithCachedSizes(printer, variables);
-}
+  // If entry is allocated by arena, its desctructor should be avoided.
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+        "    if (entry.get() != NULL && entry->GetArena() != NULL) {\n"
+        "      entry.release();\n"
+        "    }\n");
+  }
 
-void MapFieldGenerator::GenerateSerializeWithCachedSizes(
-    io::Printer* printer, const std::map<string, string>& variables) const {
-  printer->Print(variables,
-      "if (!this->$name$().empty()) {\n");
+  printer->Print(variables_,
+      "    entry.reset($name$_.New$wrapper$(it->first, it->second));\n"
+      "    ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
+      "        $number$, *entry, output);\n");
+
   printer->Indent();
+  printer->Indent();
+
   const FieldDescriptor* key_field =
       descriptor_->message_type()->FindFieldByName("key");
   const FieldDescriptor* value_field =
       descriptor_->message_type()->FindFieldByName("value");
-  const bool string_key = key_field->type() == FieldDescriptor::TYPE_STRING;
-  const bool string_value = value_field->type() == FieldDescriptor::TYPE_STRING;
-
-  printer->Print(variables,
-      "typedef ::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_pointer\n"
-      "    ConstPtr;\n");
-  if (string_key) {
-    printer->Print(variables,
-        "typedef ConstPtr SortItem;\n"
-        "typedef ::google::protobuf::internal::"
-        "CompareByDerefFirst<SortItem> Less;\n");
-  } else {
-    printer->Print(variables,
-        "typedef ::google::protobuf::internal::SortItem< $key_cpp$, ConstPtr > "
-        "SortItem;\n"
-        "typedef ::google::protobuf::internal::CompareByFirstField<SortItem> Less;\n");
+  if (key_field->type() == FieldDescriptor::TYPE_STRING) {
+    GenerateUtf8CheckCodeForString(key_field, options_, false, variables_,
+                                   "it->first.data(), it->first.length(),\n",
+                                   printer);
   }
-  string utf8_check;
-  if (string_key || string_value) {
-    printer->Print(
-        "struct Utf8Check {\n"
-        "  static void Check(ConstPtr p) {\n");
-    printer->Indent();
-    printer->Indent();
-    if (string_key) {
-      GenerateUtf8CheckCodeForString(
-          key_field, options_, false, variables,
-          "p->first.data(), static_cast<int>(p->first.length()),\n", printer);
-    }
-    if (string_value) {
-      GenerateUtf8CheckCodeForString(
-          value_field, options_, false, variables,
-          "p->second.data(), static_cast<int>(p->second.length()),\n", printer);
-    }
-    printer->Outdent();
-    printer->Outdent();
-    printer->Print(
-        "  }\n"
-        "};\n");
-    utf8_check = "Utf8Check::Check";
+  if (value_field->type() == FieldDescriptor::TYPE_STRING) {
+    GenerateUtf8CheckCodeForString(value_field, options_, false, variables_,
+                                   "it->second.data(), it->second.length(),\n",
+                                   printer);
   }
 
-  printer->Print(variables,
-      "\n"
-      "if ($deterministic$ &&\n"
-      "    this->$name$().size() > 1) {\n"
-      "  ::google::protobuf::scoped_array<SortItem> items(\n"
-      "      new SortItem[this->$name$().size()]);\n"
-      "  typedef ::google::protobuf::Map< $key_cpp$, $val_cpp$ >::size_type size_type;\n"
-      "  size_type n = 0;\n"
+  printer->Outdent();
+  printer->Outdent();
+
+  printer->Print(
+      "  }\n");
+
+  // If entry is allocated by arena, its desctructor should be avoided.
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+        "  if (entry.get() != NULL && entry->GetArena() != NULL) {\n"
+        "    entry.release();\n"
+        "  }\n");
+  }
+
+  printer->Print("}\n");
+}
+
+void MapFieldGenerator::
+GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+  printer->Print(variables_,
+      "{\n"
+      "  ::google::protobuf::scoped_ptr<$map_classname$> entry;\n"
       "  for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n"
       "      it = this->$name$().begin();\n"
-      "      it != this->$name$().end(); ++it, ++n) {\n"
-      "    items[static_cast<ptrdiff_t>(n)] = SortItem(&*it);\n"
-      "  }\n"
-      "  ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less());\n");
+      "      it != this->$name$().end(); ++it) {\n");
+
+  // If entry is allocated by arena, its desctructor should be avoided.
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+        "    if (entry.get() != NULL && entry->GetArena() != NULL) {\n"
+        "      entry.release();\n"
+        "    }\n");
+  }
+
+  printer->Print(variables_,
+      "    entry.reset($name$_.New$wrapper$(it->first, it->second));\n"
+      "    target = ::google::protobuf::internal::WireFormatLite::\n"
+      "        Write$declared_type$NoVirtualToArray(\n"
+      "            $number$, *entry, target);\n");
+
   printer->Indent();
-  GenerateSerializationLoop(printer, variables, SupportsArenas(descriptor_),
-      utf8_check, "for (size_type i = 0; i < n; i++)",
-      string_key ? "items[static_cast<ptrdiff_t>(i)]" :
-                   "items[static_cast<ptrdiff_t>(i)].second", false);
+  printer->Indent();
+
+  const FieldDescriptor* key_field =
+      descriptor_->message_type()->FindFieldByName("key");
+  const FieldDescriptor* value_field =
+      descriptor_->message_type()->FindFieldByName("value");
+  if (key_field->type() == FieldDescriptor::TYPE_STRING) {
+    GenerateUtf8CheckCodeForString(key_field, options_, false, variables_,
+                                   "it->first.data(), it->first.length(),\n",
+                                   printer);
+  }
+  if (value_field->type() == FieldDescriptor::TYPE_STRING) {
+    GenerateUtf8CheckCodeForString(value_field, options_, false, variables_,
+                                   "it->second.data(), it->second.length(),\n",
+                                   printer);
+  }
+
+  printer->Outdent();
   printer->Outdent();
   printer->Print(
-      "} else {\n");
-  printer->Indent();
-  GenerateSerializationLoop(
-      printer, variables, SupportsArenas(descriptor_), utf8_check,
-      "for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n"
-      "    it = this->$name$().begin();\n"
-      "    it != this->$name$().end(); ++it)",
-      "it", true);
-  printer->Outdent();
-  printer->Print("}\n");
-  printer->Outdent();
+      "  }\n");
+
+  // If entry is allocated by arena, its desctructor should be avoided.
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+        "  if (entry.get() != NULL && entry->GetArena() != NULL) {\n"
+        "    entry.release();\n"
+        "  }\n");
+  }
+
   printer->Print("}\n");
 }
 
 void MapFieldGenerator::
 GenerateByteSize(io::Printer* printer) const {
   printer->Print(variables_,
-      "total_size += $tag_size$ *\n"
-      "    ::google::protobuf::internal::FromIntSize(this->$name$_size());\n"
+      "total_size += $tag_size$ * this->$name$_size();\n"
       "{\n"
       "  ::google::protobuf::scoped_ptr<$map_classname$> entry;\n"
       "  for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n"
diff --git a/src/google/protobuf/compiler/cpp/cpp_map_field.h b/src/google/protobuf/compiler/cpp/cpp_map_field.h
index 88e3b46..087dcde 100644
--- a/src/google/protobuf/compiler/cpp/cpp_map_field.h
+++ b/src/google/protobuf/compiler/cpp/cpp_map_field.h
@@ -49,25 +49,21 @@
   // implements FieldGenerator ---------------------------------------
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
-  void GenerateConstructorCode(io::Printer* printer) const {}
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
+  void GenerateConstructorCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
   void GenerateByteSize(io::Printer* printer) const;
 
  private:
-  // A helper for GenerateSerializeWithCachedSizes{,ToArray}.
-  void GenerateSerializeWithCachedSizes(
-      io::Printer* printer, const std::map<string, string>& variables) const;
-
   const FieldDescriptor* descriptor_;
   const bool dependent_field_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc
index 34a70b1..130e5b2 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message.cc
@@ -32,8 +32,6 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-#include <google/protobuf/compiler/cpp/cpp_message.h>
-
 #include <algorithm>
 #include <google/protobuf/stubs/hash.h>
 #include <map>
@@ -43,21 +41,16 @@
 #endif
 #include <utility>
 #include <vector>
-
+#include <google/protobuf/compiler/cpp/cpp_message.h>
+#include <google/protobuf/compiler/cpp/cpp_field.h>
 #include <google/protobuf/compiler/cpp/cpp_enum.h>
 #include <google/protobuf/compiler/cpp/cpp_extension.h>
-#include <google/protobuf/compiler/cpp/cpp_field.h>
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
-#include <google/protobuf/compiler/cpp/cpp_padding_optimizer.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/generated_message_table_driven.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/wire_format.h>
 #include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
+#include <google/protobuf/io/printer.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/wire_format.h>
+#include <google/protobuf/descriptor.pb.h>
 
 
 namespace google {
@@ -92,13 +85,14 @@
 
 // Sort the fields of the given Descriptor by number into a new[]'d array
 // and return it.
-std::vector<const FieldDescriptor*> SortFieldsByNumber(
-    const Descriptor* descriptor) {
-  std::vector<const FieldDescriptor*> fields(descriptor->field_count());
+const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) {
+  const FieldDescriptor** fields =
+    new const FieldDescriptor*[descriptor->field_count()];
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields[i] = descriptor->field(i);
   }
-  std::sort(fields.begin(), fields.end(), FieldOrderingByNumber());
+  std::sort(fields, fields + descriptor->field_count(),
+            FieldOrderingByNumber());
   return fields;
 }
 
@@ -110,37 +104,187 @@
   }
 };
 
-bool IsPOD(const FieldDescriptor* field) {
-  if (field->is_repeated() || field->is_extension()) return false;
-  switch (field->cpp_type()) {
-    case FieldDescriptor::CPPTYPE_ENUM:
-    case FieldDescriptor::CPPTYPE_INT32:
-    case FieldDescriptor::CPPTYPE_INT64:
-    case FieldDescriptor::CPPTYPE_UINT32:
-    case FieldDescriptor::CPPTYPE_UINT64:
-    case FieldDescriptor::CPPTYPE_FLOAT:
-    case FieldDescriptor::CPPTYPE_DOUBLE:
-    case FieldDescriptor::CPPTYPE_BOOL:
+// Returns true if the "required" restriction check should be ignored for the
+// given field.
+inline static bool ShouldIgnoreRequiredFieldCheck(const FieldDescriptor* field,
+                                                  const Options& options) {
+  return false;
+}
+
+// Returns true if the message type has any required fields.  If it doesn't,
+// we can optimize out calls to its IsInitialized() method.
+//
+// already_seen is used to avoid checking the same type multiple times
+// (and also to protect against recursion).
+static bool HasRequiredFields(const Descriptor* type, const Options& options,
+                              hash_set<const Descriptor*>* already_seen) {
+  if (already_seen->count(type) > 0) {
+    // Since the first occurrence of a required field causes the whole
+    // function to return true, we can assume that if the type is already
+    // in the cache it didn't have any required fields.
+    return false;
+  }
+  already_seen->insert(type);
+
+  // If the type has extensions, an extension with message type could contain
+  // required fields, so we have to be conservative and assume such an
+  // extension exists.
+  if (type->extension_range_count() > 0) return true;
+
+  for (int i = 0; i < type->field_count(); i++) {
+    const FieldDescriptor* field = type->field(i);
+    if (field->is_required()) {
       return true;
+    }
+    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
+        !ShouldIgnoreRequiredFieldCheck(field, options)) {
+      if (HasRequiredFields(field->message_type(), options, already_seen)) {
+        return true;
+      }
+    }
+  }
+
+  return false;
+}
+
+static bool HasRequiredFields(const Descriptor* type, const Options& options) {
+  hash_set<const Descriptor*> already_seen;
+  return HasRequiredFields(type, options, &already_seen);
+}
+
+// This returns an estimate of the compiler's alignment for the field.  This
+// can't guarantee to be correct because the generated code could be compiled on
+// different systems with different alignment rules.  The estimates below assume
+// 64-bit pointers.
+int EstimateAlignmentSize(const FieldDescriptor* field) {
+  if (field == NULL) return 0;
+  if (field->is_repeated()) return 8;
+  switch (field->cpp_type()) {
+    case FieldDescriptor::CPPTYPE_BOOL:
+      return 1;
+
+    case FieldDescriptor::CPPTYPE_INT32:
+    case FieldDescriptor::CPPTYPE_UINT32:
+    case FieldDescriptor::CPPTYPE_ENUM:
+    case FieldDescriptor::CPPTYPE_FLOAT:
+      return 4;
+
+    case FieldDescriptor::CPPTYPE_INT64:
+    case FieldDescriptor::CPPTYPE_UINT64:
+    case FieldDescriptor::CPPTYPE_DOUBLE:
     case FieldDescriptor::CPPTYPE_STRING:
-      return false;
-    default:
-      return false;
+    case FieldDescriptor::CPPTYPE_MESSAGE:
+      return 8;
+  }
+  GOOGLE_LOG(FATAL) << "Can't get here.";
+  return -1;  // Make compiler happy.
+}
+
+// FieldGroup is just a helper for OptimizePadding below.  It holds a vector of
+// fields that are grouped together because they have compatible alignment, and
+// a preferred location in the final field ordering.
+class FieldGroup {
+ public:
+  FieldGroup()
+      : preferred_location_(0) {}
+
+  // A group with a single field.
+  FieldGroup(float preferred_location, const FieldDescriptor* field)
+      : preferred_location_(preferred_location),
+        fields_(1, field) {}
+
+  // Append the fields in 'other' to this group.
+  void Append(const FieldGroup& other) {
+    if (other.fields_.empty()) {
+      return;
+    }
+    // Preferred location is the average among all the fields, so we weight by
+    // the number of fields on each FieldGroup object.
+    preferred_location_ =
+        (preferred_location_ * fields_.size() +
+         (other.preferred_location_ * other.fields_.size())) /
+        (fields_.size() + other.fields_.size());
+    fields_.insert(fields_.end(), other.fields_.begin(), other.fields_.end());
+  }
+
+  void SetPreferredLocation(float location) { preferred_location_ = location; }
+  const vector<const FieldDescriptor*>& fields() const { return fields_; }
+
+  // FieldGroup objects sort by their preferred location.
+  bool operator<(const FieldGroup& other) const {
+    return preferred_location_ < other.preferred_location_;
+  }
+
+ private:
+  // "preferred_location_" is an estimate of where this group should go in the
+  // final list of fields.  We compute this by taking the average index of each
+  // field in this group in the original ordering of fields.  This is very
+  // approximate, but should put this group close to where its member fields
+  // originally went.
+  float preferred_location_;
+  vector<const FieldDescriptor*> fields_;
+  // We rely on the default copy constructor and operator= so this type can be
+  // used in a vector.
+};
+
+// Reorder 'fields' so that if the fields are output into a c++ class in the new
+// order, the alignment padding is minimized.  We try to do this while keeping
+// each field as close as possible to its original position so that we don't
+// reduce cache locality much for function that access each field in order.
+void OptimizePadding(vector<const FieldDescriptor*>* fields) {
+  // First divide fields into those that align to 1 byte, 4 bytes or 8 bytes.
+  vector<FieldGroup> aligned_to_1, aligned_to_4, aligned_to_8;
+  for (int i = 0; i < fields->size(); ++i) {
+    switch (EstimateAlignmentSize((*fields)[i])) {
+      case 1: aligned_to_1.push_back(FieldGroup(i, (*fields)[i])); break;
+      case 4: aligned_to_4.push_back(FieldGroup(i, (*fields)[i])); break;
+      case 8: aligned_to_8.push_back(FieldGroup(i, (*fields)[i])); break;
+      default:
+        GOOGLE_LOG(FATAL) << "Unknown alignment size.";
+    }
+  }
+
+  // Now group fields aligned to 1 byte into sets of 4, and treat those like a
+  // single field aligned to 4 bytes.
+  for (int i = 0; i < aligned_to_1.size(); i += 4) {
+    FieldGroup field_group;
+    for (int j = i; j < aligned_to_1.size() && j < i + 4; ++j) {
+      field_group.Append(aligned_to_1[j]);
+    }
+    aligned_to_4.push_back(field_group);
+  }
+  // Sort by preferred location to keep fields as close to their original
+  // location as possible.  Using stable_sort ensures that the output is
+  // consistent across runs.
+  std::stable_sort(aligned_to_4.begin(), aligned_to_4.end());
+
+  // Now group fields aligned to 4 bytes (or the 4-field groups created above)
+  // into pairs, and treat those like a single field aligned to 8 bytes.
+  for (int i = 0; i < aligned_to_4.size(); i += 2) {
+    FieldGroup field_group;
+    for (int j = i; j < aligned_to_4.size() && j < i + 2; ++j) {
+      field_group.Append(aligned_to_4[j]);
+    }
+    if (i == aligned_to_4.size() - 1) {
+      // Move incomplete 4-byte block to the end.
+      field_group.SetPreferredLocation(fields->size() + 1);
+    }
+    aligned_to_8.push_back(field_group);
+  }
+  // Sort by preferred location.
+  std::stable_sort(aligned_to_8.begin(), aligned_to_8.end());
+
+  // Now pull out all the FieldDescriptors in order.
+  fields->clear();
+  for (int i = 0; i < aligned_to_8.size(); ++i) {
+    fields->insert(fields->end(),
+                   aligned_to_8[i].fields().begin(),
+                   aligned_to_8[i].fields().end());
   }
 }
 
-// Helper for the code that emits the SharedCtor() method.
-bool CanConstructByZeroing(const FieldDescriptor* field,
-                           const Options& options) {
-  bool ret = CanInitializeByZeroing(field);
-
-  // 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() &&
-       field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE);
-  return ret;
+string MessageTypeProtoName(const FieldDescriptor* field) {
+  return field->message_type()->full_name();
 }
 
 // Emits an if-statement with a condition that evaluates to true if |field| is
@@ -195,33 +339,27 @@
 
 // Collects map entry message type information.
 void CollectMapInfo(const Descriptor* descriptor,
-                    std::map<string, string>* variables) {
+                    map<string, string>* variables) {
   GOOGLE_CHECK(IsMapEntryMessage(descriptor));
-  std::map<string, string>& vars = *variables;
   const FieldDescriptor* key = descriptor->FindFieldByName("key");
   const FieldDescriptor* val = descriptor->FindFieldByName("value");
-  vars["key_cpp"] = PrimitiveTypeName(key->cpp_type());
+  (*variables)["key"] = PrimitiveTypeName(key->cpp_type());
   switch (val->cpp_type()) {
     case FieldDescriptor::CPPTYPE_MESSAGE:
-      vars["val_cpp"] = FieldMessageTypeName(val);
+      (*variables)["val"] = FieldMessageTypeName(val);
       break;
     case FieldDescriptor::CPPTYPE_ENUM:
-      vars["val_cpp"] = ClassName(val->enum_type(), true);
+      (*variables)["val"] = ClassName(val->enum_type(), true);
       break;
     default:
-      vars["val_cpp"] = PrimitiveTypeName(val->cpp_type());
+      (*variables)["val"] = PrimitiveTypeName(val->cpp_type());
   }
-  vars["key_wire_type"] = "::google::protobuf::internal::WireFormatLite::TYPE_" +
-                          ToUpper(DeclaredTypeMethodName(key->type()));
-  vars["val_wire_type"] = "::google::protobuf::internal::WireFormatLite::TYPE_" +
-                          ToUpper(DeclaredTypeMethodName(val->type()));
-  if (descriptor->file()->syntax() != FileDescriptor::SYNTAX_PROTO3 &&
-      val->type() == FieldDescriptor::TYPE_ENUM) {
-    const EnumValueDescriptor* default_value = val->default_value_enum();
-    vars["default_enum_value"] = Int32ToString(default_value->number());
-  } else {
-    vars["default_enum_value"] = "0";
-  }
+  (*variables)["key_wire_type"] =
+      "::google::protobuf::internal::WireFormatLite::TYPE_" +
+      ToUpper(DeclaredTypeMethodName(key->type()));
+  (*variables)["val_wire_type"] =
+      "::google::protobuf::internal::WireFormatLite::TYPE_" +
+      ToUpper(DeclaredTypeMethodName(val->type()));
 }
 
 // Does the given field have a private (internal helper only) has_$name$()
@@ -233,145 +371,27 @@
           field->containing_oneof() != NULL);
 }
 
-
-bool TableDrivenParsingEnabled(
-    const Descriptor* descriptor, const Options& options) {
-  if (!options.table_driven_parsing) {
-    return false;
-  }
-
-  // Consider table-driven parsing.  We only do this if:
-  // - We have has_bits for fields.  This avoids a check on every field we set
-  //   when are present (the common case).
-  if (!HasFieldPresence(descriptor->file())) {
-    return false;
-  }
-
-  const double table_sparseness = 0.5;
-  int max_field_number = 0;
-  for (int i = 0; i < descriptor->field_count(); i++) {
-    const FieldDescriptor* field = descriptor->field(i);
-    if (max_field_number < field->number()) {
-      max_field_number = field->number();
-    }
-
-    // - There are no weak fields.
-    if (field->options().weak()) {
-      return false;
-    }
-  }
-
-  // - There range of field numbers is "small"
-  if (max_field_number >= (2 << 14)) {
-    return false;
-  }
-
-  // - Field numbers are relatively dense within the actual number of fields.
-  //   We check for strictly greater than in the case where there are no fields
-  //   (only extensions) so max_field_number == descriptor->field_count() == 0.
-  if (max_field_number * table_sparseness > descriptor->field_count()) {
-    return false;
-  }
-
-  // - This is not a MapEntryMessage.
-  if (IsMapEntryMessage(descriptor)) {
-    return false;
-  }
-
-  return true;
-}
-
-void SetUnknkownFieldsVariable(const Descriptor* descriptor,
-                               const Options& options,
-                               std::map<string, string>* variables) {
-  if (UseUnknownFieldSet(descriptor->file(), options)) {
-    (*variables)["unknown_fields_type"] = "::google::protobuf::UnknownFieldSet";
-  } else {
-    (*variables)["unknown_fields_type"] = "::std::string";
-  }
-  if (AlwaysPreserveUnknownFields(descriptor)) {
-    (*variables)["have_unknown_fields"] =
-        "_internal_metadata_.have_unknown_fields()";
-    (*variables)["unknown_fields"] = "_internal_metadata_.unknown_fields()";
-  } else {
-    (*variables)["have_unknown_fields"] =
-        "(_internal_metadata_.have_unknown_fields() && "
-        " ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())";
-    (*variables)["unknown_fields"] =
-        "(::google::protobuf::internal::GetProto3PreserveUnknownsDefault()"
-        "   ? _internal_metadata_.unknown_fields()"
-        "   : _internal_metadata_.default_instance())";
-  }
-  (*variables)["mutable_unknown_fields"] =
-      "_internal_metadata_.mutable_unknown_fields()";
-}
-
-bool IsCrossFileMapField(const FieldDescriptor* field) {
-  if (!field->is_map()) {
-    return false;
-  }
-
-  const Descriptor* d = field->message_type();
-  const FieldDescriptor* value = d->FindFieldByNumber(2);
-
-  return IsCrossFileMessage(value);
-}
-
-bool IsCrossFileMaybeMap(const FieldDescriptor* field) {
-  if (IsCrossFileMapField(field)) {
-    return true;
-  }
-
-  return IsCrossFileMessage(field);
-}
-
 }  // anonymous namespace
 
 // ===================================================================
 
 MessageGenerator::MessageGenerator(const Descriptor* descriptor,
-                                   int index_in_file_messages,
-                                   const Options& options,
-                                   SCCAnalyzer* scc_analyzer)
+                                   const Options& options)
     : descriptor_(descriptor),
-      index_in_file_messages_(index_in_file_messages),
       classname_(ClassName(descriptor, false)),
       options_(options),
       field_generators_(descriptor, options),
-      max_has_bit_index_(0),
+      nested_generators_(new google::protobuf::scoped_ptr<
+          MessageGenerator>[descriptor->nested_type_count()]),
       enum_generators_(
           new google::protobuf::scoped_ptr<EnumGenerator>[descriptor->enum_type_count()]),
       extension_generators_(new google::protobuf::scoped_ptr<
-                            ExtensionGenerator>[descriptor->extension_count()]),
-      use_dependent_base_(false),
-      num_weak_fields_(0),
-      message_layout_helper_(new PaddingOptimizer()),
-      scc_analyzer_(scc_analyzer) {
-  // Compute optimized field order to be used for layout and initialization
-  // purposes.
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
-    if (field->options().weak()) {
-      num_weak_fields_++;
-    } else if (!field->containing_oneof()) {
-      optimized_order_.push_back(field);
-    }
-  }
+          ExtensionGenerator>[descriptor->extension_count()]),
+      use_dependent_base_(false) {
 
-  message_layout_helper_->OptimizeLayout(&optimized_order_, options_);
-
-  if (HasFieldPresence(descriptor_->file())) {
-    // We use -1 as a sentinel.
-    has_bit_indices_.resize(descriptor_->field_count(), -1);
-    for (int i = 0; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      // Skip fields that do not have has bits.
-      if (field->is_repeated()) {
-        continue;
-      }
-
-      has_bit_indices_[field->index()] = max_has_bit_index_++;
-    }
+  for (int i = 0; i < descriptor->nested_type_count(); i++) {
+    nested_generators_[i].reset(
+      new MessageGenerator(descriptor->nested_type(i), options));
   }
 
   for (int i = 0; i < descriptor->enum_type_count(); i++) {
@@ -397,42 +417,52 @@
     // Always make oneofs dependent.
     use_dependent_base_ = true;
   }
-
-  table_driven_ = TableDrivenParsingEnabled(descriptor_, options_);
-
-  scc_name_ =
-      ClassName(scc_analyzer_->GetSCC(descriptor_)->GetRepresentative(), false);
 }
 
 MessageGenerator::~MessageGenerator() {}
 
-size_t MessageGenerator::HasBitsSize() const {
-  size_t sizeof_has_bits = (max_has_bit_index_ + 31) / 32 * 4;
-  if (sizeof_has_bits == 0) {
-    // Zero-size arrays aren't technically allowed, and MSVC in particular
-    // doesn't like them.  We still need to declare these arrays to make
-    // other code compile.  Since this is an uncommon case, we'll just declare
-    // them with size 1 and waste some space.  Oh well.
-    sizeof_has_bits = 4;
-  }
-
-  return sizeof_has_bits;
-}
-
-void MessageGenerator::AddGenerators(
-    std::vector<EnumGenerator*>* enum_generators,
-    std::vector<ExtensionGenerator*>* extension_generators) {
-  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
-    enum_generators->push_back(enum_generators_[i].get());
-  }
-  for (int i = 0; i < descriptor_->extension_count(); i++) {
-    extension_generators->push_back(extension_generators_[i].get());
-  }
-}
-
-void MessageGenerator::FillMessageForwardDeclarations(
-    std::map<string, const Descriptor*>* class_names) {
+void MessageGenerator::
+FillMessageForwardDeclarations(map<string, const Descriptor*>* class_names) {
   (*class_names)[classname_] = descriptor_;
+
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    // map entry message doesn't need forward declaration. Since map entry
+    // message cannot be a top level class, we just need to avoid calling
+    // GenerateForwardDeclaration here.
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->FillMessageForwardDeclarations(class_names);
+  }
+}
+
+void MessageGenerator::
+FillEnumForwardDeclarations(map<string, const EnumDescriptor*>* enum_names) {
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->FillEnumForwardDeclarations(enum_names);
+  }
+  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
+    enum_generators_[i]->FillForwardDeclaration(enum_names);
+  }
+}
+
+void MessageGenerator::
+GenerateEnumDefinitions(io::Printer* printer) {
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->GenerateEnumDefinitions(printer);
+  }
+
+  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
+    enum_generators_[i]->GenerateDefinition(printer);
+  }
+}
+
+void MessageGenerator::
+GenerateGetEnumDescriptorSpecializations(io::Printer* printer) {
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
+  }
+  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
+    enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
+  }
 }
 
 void MessageGenerator::
@@ -442,9 +472,15 @@
 
     PrintFieldComment(printer, field);
 
-    std::map<string, string> vars;
+    map<string, string> vars;
     SetCommonFieldVariables(field, &vars, options_);
 
+    if (use_dependent_base_ && IsFieldDependent(field)) {
+      // If the message is dependent, the inline clear_*() method will need
+      // to delete the message type, so it must be in the dependent base
+      // class. (See also GenerateFieldAccessorDeclarations.)
+      printer->Print(vars, "$deprecated_attr$void clear_$name$();\n");
+    }
     // Generate type-specific accessor declarations.
     field_generators_.get(field).GenerateDependentAccessorDeclarations(printer);
     printer->Print("\n");
@@ -453,32 +489,12 @@
 
 void MessageGenerator::
 GenerateFieldAccessorDeclarations(io::Printer* printer) {
-  // optimized_fields_ does not contain fields where
-  //    field->containing_oneof() != NULL
-  // so we need to iterate over those as well.
-  //
-  // We place the non-oneof fields in optimized_order_, as that controls the
-  // order of the _has_bits_ entries and we want GDB's pretty printers to be
-  // able to infer these indices from the k[FIELDNAME]FieldNumber order.
-  std::vector<const FieldDescriptor*> ordered_fields;
-  ordered_fields.reserve(descriptor_->field_count());
-
-  ordered_fields.insert(
-      ordered_fields.begin(), optimized_order_.begin(), optimized_order_.end());
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
-    if (field->containing_oneof() == NULL && !field->options().weak()) {
-      continue;
-    }
-    ordered_fields.push_back(field);
-  }
-
-  for (int i = 0; i < ordered_fields.size(); i++) {
-    const FieldDescriptor* field = ordered_fields[i];
 
     PrintFieldComment(printer, field);
 
-    std::map<string, string> vars;
+    map<string, string> vars;
     SetCommonFieldVariables(field, &vars, options_);
     vars["constant_name"] = FieldConstantName(field);
 
@@ -498,25 +514,24 @@
     }
 
     if (field->is_repeated()) {
-      printer->Print(vars, "$deprecated_attr$int ${$$name$_size$}$() const;\n");
-      printer->Annotate("{", "}", field);
+      printer->Print(vars, "$deprecated_attr$int $name$_size() const;\n");
     } else if (HasHasMethod(field)) {
-      printer->Print(vars, "$deprecated_attr$bool ${$has_$name$$}$() const;\n");
-      printer->Annotate("{", "}", field);
+      printer->Print(vars, "$deprecated_attr$bool has_$name$() const;\n");
     } else if (HasPrivateHasMethod(field)) {
       printer->Print(vars,
-                     "private:\n"
-                     "bool ${$has_$name$$}$() const;\n"
-                     "public:\n");
-      printer->Annotate("{", "}", field);
+          "private:\n"
+          "bool has_$name$() const;\n"
+          "public:\n");
     }
 
-    printer->Print(vars, "$deprecated_attr$void ${$clear_$name$$}$();\n");
-    printer->Annotate("{", "}", field);
+    if (!dependent_field) {
+      // If this field is dependent, then its clear_() method is in the
+      // depenent base class. (See also GenerateDependentAccessorDeclarations.)
+      printer->Print(vars, "$deprecated_attr$void clear_$name$();\n");
+    }
     printer->Print(vars,
                    "$deprecated_attr$static const int $constant_name$ = "
                    "$number$;\n");
-    printer->Annotate("constant_name", field);
 
     // Generate type-specific accessor declarations.
     field_generators_.get(field).GenerateAccessorDeclarations(printer);
@@ -551,9 +566,37 @@
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
 
-    if (field->options().weak()) continue;
-
     PrintFieldComment(printer, field);
+
+    // These functions are not really dependent: they are part of the
+    // (non-dependent) derived class. However, they need to live outside
+    // any #ifdef guards, so we treat them as if they were dependent.
+    //
+    // See the comment in FileGenerator::GenerateInlineFunctionDefinitions
+    // for a more complete explanation.
+    if (use_dependent_base_ && IsFieldDependent(field)) {
+      map<string, string> vars;
+      SetCommonFieldVariables(field, &vars, options_);
+      vars["inline"] = "inline ";
+      if (field->containing_oneof()) {
+        vars["field_name"] = UnderscoresToCamelCase(field->name(), true);
+        vars["oneof_name"] = field->containing_oneof()->name();
+        vars["oneof_index"] = SimpleItoa(field->containing_oneof()->index());
+        GenerateOneofMemberHasBits(field, vars, printer);
+      } else if (!field->is_repeated()) {
+        // There will be no header guard, so this always has to be inline.
+        GenerateSingularFieldHasBits(field, vars, printer);
+      }
+      // vars needed for clear_(), which is in the dependent base:
+      // (See also GenerateDependentFieldAccessorDeclarations.)
+      vars["tmpl"] = "template<class T>\n";
+      vars["dependent_classname"] =
+          DependentBaseClassTemplateName(descriptor_) + "<T>";
+      vars["this_message"] = DependentBaseDownCast();
+      vars["this_const_message"] = DependentBaseConstDownCast();
+      GenerateFieldClear(field, vars, printer);
+    }
+
     // Generate type-specific accessors.
     field_generators_.get(field)
         .GenerateDependentInlineAccessorDefinitions(printer);
@@ -564,38 +607,30 @@
   // Generate has_$name$() and clear_has_$name$() functions for oneofs
   // Similar to other has-bits, these must always be in the header if we
   // are using a dependent base class.
-  GenerateOneofHasBits(printer);
+  GenerateOneofHasBits(printer, true /* is_inline */);
 }
 
 void MessageGenerator::
 GenerateSingularFieldHasBits(const FieldDescriptor* field,
-                             std::map<string, string> vars,
+                             map<string, string> vars,
                              io::Printer* printer) {
-  if (field->options().weak()) {
-    printer->Print(
-        vars,
-        "inline bool $classname$::has_$name$() const {\n"
-        "  return _weak_field_map_.Has($number$);\n"
-        "}\n");
-    return;
-  }
   if (HasFieldPresence(descriptor_->file())) {
     // N.B.: without field presence, we do not use has-bits or generate
     // has_$name$() methods.
-    int has_bit_index = has_bit_indices_[field->index()];
-    GOOGLE_CHECK_GE(has_bit_index, 0);
-
-    vars["has_array_index"] = SimpleItoa(has_bit_index / 32);
-    vars["has_mask"] = StrCat(strings::Hex(1u << (has_bit_index % 32),
+    vars["has_array_index"] = SimpleItoa(field->index() / 32);
+    vars["has_mask"] = StrCat(strings::Hex(1u << (field->index() % 32),
                                            strings::ZERO_PAD_8));
     printer->Print(vars,
-      "inline bool $classname$::has_$name$() const {\n"
+      "$inline$"
+      "bool $classname$::has_$name$() const {\n"
       "  return (_has_bits_[$has_array_index$] & 0x$has_mask$u) != 0;\n"
       "}\n"
-      "inline void $classname$::set_has_$name$() {\n"
+      "$inline$"
+      "void $classname$::set_has_$name$() {\n"
       "  _has_bits_[$has_array_index$] |= 0x$has_mask$u;\n"
       "}\n"
-      "inline void $classname$::clear_has_$name$() {\n"
+      "$inline$"
+      "void $classname$::clear_has_$name$() {\n"
       "  _has_bits_[$has_array_index$] &= ~0x$has_mask$u;\n"
       "}\n");
   } else {
@@ -604,35 +639,39 @@
       bool is_lazy = false;
       if (is_lazy) {
         printer->Print(vars,
-          "inline bool $classname$::has_$name$() const {\n"
+          "$inline$"
+          "bool $classname$::has_$name$() const {\n"
           "  return !$name$_.IsCleared();\n"
           "}\n");
       } else {
-        printer->Print(
-            vars,
-            "inline bool $classname$::has_$name$() const {\n"
-            "  return this != internal_default_instance() && $name$_ != NULL;\n"
-            "}\n");
+        printer->Print(vars,
+          "$inline$"
+          "bool $classname$::has_$name$() const {\n"
+          "  return !_is_default_instance_ && $name$_ != NULL;\n"
+          "}\n");
       }
     }
   }
 }
 
 void MessageGenerator::
-GenerateOneofHasBits(io::Printer* printer) {
+GenerateOneofHasBits(io::Printer* printer, bool is_inline) {
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["oneof_name"] = descriptor_->oneof_decl(i)->name();
     vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
     vars["cap_oneof_name"] =
         ToUpper(descriptor_->oneof_decl(i)->name());
     vars["classname"] = classname_;
+    vars["inline"] = (is_inline ? "inline " : "");
     printer->Print(
         vars,
-        "inline bool $classname$::has_$oneof_name$() const {\n"
+        "$inline$"
+        "bool $classname$::has_$oneof_name$() const {\n"
         "  return $oneof_name$_case() != $cap_oneof_name$_NOT_SET;\n"
         "}\n"
-        "inline void $classname$::clear_has_$oneof_name$() {\n"
+        "$inline$"
+        "void $classname$::clear_has_$oneof_name$() {\n"
         "  _oneof_case_[$oneof_index$] = $cap_oneof_name$_NOT_SET;\n"
         "}\n");
   }
@@ -640,7 +679,7 @@
 
 void MessageGenerator::
 GenerateOneofMemberHasBits(const FieldDescriptor* field,
-                           const std::map<string, string>& vars,
+                           const map<string, string>& vars,
                            io::Printer* printer) {
   // Singular field in a oneof
   // N.B.: Without field presence, we do not use has-bits or generate
@@ -649,26 +688,28 @@
   // method, so that generated code is slightly cleaner (vs.  comparing
   // _oneof_case_[index] against a constant everywhere).
   printer->Print(vars,
-    "inline bool $classname$::has_$name$() const {\n"
+    "$inline$"
+    "bool $classname$::has_$name$() const {\n"
     "  return $oneof_name$_case() == k$field_name$;\n"
     "}\n");
   printer->Print(vars,
-    "inline void $classname$::set_has_$name$() {\n"
+    "$inline$"
+    "void $classname$::set_has_$name$() {\n"
     "  _oneof_case_[$oneof_index$] = k$field_name$;\n"
     "}\n");
 }
 
 void MessageGenerator::
 GenerateFieldClear(const FieldDescriptor* field,
-                   const std::map<string, string>& vars,
-                   bool is_inline,
+                   const map<string, string>& vars,
                    io::Printer* printer) {
-  // Generate clear_$name$().
-  if (is_inline) {
-    printer->Print("inline ");
-  }
+  // Generate clear_$name$() (See GenerateFieldAccessorDeclarations and
+  // GenerateDependentFieldAccessorDeclarations, $dependent_classname$ is
+  // set by the Generate*Definitions functions.)
   printer->Print(vars,
-    "void $classname$::clear_$name$() {\n");
+    "$tmpl$"
+    "$inline$"
+    "void $dependent_classname$::clear_$name$() {\n");
 
   printer->Indent();
 
@@ -676,20 +717,21 @@
     // Clear this field only if it is the active field in this oneof,
     // otherwise ignore
     printer->Print(vars,
-      "if (has_$name$()) {\n");
+      "if ($this_message$has_$name$()) {\n");
     printer->Indent();
     field_generators_.get(field)
         .GenerateClearingCode(printer);
     printer->Print(vars,
-      "clear_has_$oneof_name$();\n");
+      "$this_message$clear_has_$oneof_name$();\n");
     printer->Outdent();
     printer->Print("}\n");
   } else {
     field_generators_.get(field)
         .GenerateClearingCode(printer);
     if (HasFieldPresence(descriptor_->file())) {
-      if (!field->is_repeated() && !field->options().weak()) {
-        printer->Print(vars, "clear_has_$name$();\n");
+      if (!field->is_repeated()) {
+        printer->Print(vars,
+                       "$this_message$clear_has_$name$();\n");
       }
     }
   }
@@ -699,7 +741,7 @@
 }
 
 void MessageGenerator::
-GenerateFieldAccessorDefinitions(io::Printer* printer) {
+GenerateFieldAccessorDefinitions(io::Printer* printer, bool is_inline) {
   printer->Print("// $classname$\n\n", "classname", classname_);
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -707,8 +749,9 @@
 
     PrintFieldComment(printer, field);
 
-    std::map<string, string> vars;
+    map<string, string> vars;
     SetCommonFieldVariables(field, &vars, options_);
+    vars["inline"] = is_inline ? "inline " : "";
     if (use_dependent_base_ && IsFieldDependent(field)) {
       vars["tmpl"] = "template<class T>\n";
       vars["dependent_classname"] =
@@ -725,25 +768,31 @@
     // Generate has_$name$() or $name$_size().
     if (field->is_repeated()) {
       printer->Print(vars,
-        "inline int $classname$::$name$_size() const {\n"
+        "$inline$"
+        "int $classname$::$name$_size() const {\n"
         "  return $name$_.size();\n"
         "}\n");
     } else if (field->containing_oneof()) {
       vars["field_name"] = UnderscoresToCamelCase(field->name(), true);
       vars["oneof_name"] = field->containing_oneof()->name();
       vars["oneof_index"] = SimpleItoa(field->containing_oneof()->index());
-      GenerateOneofMemberHasBits(field, vars, printer);
+      if (!use_dependent_base_ || !IsFieldDependent(field)) {
+        GenerateOneofMemberHasBits(field, vars, printer);
+      }
     } else {
       // Singular field.
-      GenerateSingularFieldHasBits(field, vars, printer);
+      if (!use_dependent_base_ || !IsFieldDependent(field)) {
+        GenerateSingularFieldHasBits(field, vars, printer);
+      }
     }
 
-    if (!IsCrossFileMaybeMap(field)) {
-      GenerateFieldClear(field, vars, true, printer);
+    if (!use_dependent_base_ || !IsFieldDependent(field)) {
+      GenerateFieldClear(field, vars, printer);
     }
 
     // Generate type-specific accessors.
-    field_generators_.get(field).GenerateInlineAccessorDefinitions(printer);
+    field_generators_.get(field).GenerateInlineAccessorDefinitions(printer,
+                                                                   is_inline);
 
     printer->Print("\n");
   }
@@ -752,7 +801,32 @@
     // Generate has_$name$() and clear_has_$name$() functions for oneofs
     // If we aren't using a dependent base, they can be with the other functions
     // that are #ifdef-guarded.
-    GenerateOneofHasBits(printer);
+    GenerateOneofHasBits(printer, is_inline);
+  }
+}
+
+// Helper for the code that emits the Clear() method.
+static bool CanClearByZeroing(const FieldDescriptor* field) {
+  if (field->is_repeated() || field->is_extension()) return false;
+  switch (field->cpp_type()) {
+    case internal::WireFormatLite::CPPTYPE_ENUM:
+      return field->default_value_enum()->number() == 0;
+    case internal::WireFormatLite::CPPTYPE_INT32:
+      return field->default_value_int32() == 0;
+    case internal::WireFormatLite::CPPTYPE_INT64:
+      return field->default_value_int64() == 0;
+    case internal::WireFormatLite::CPPTYPE_UINT32:
+      return field->default_value_uint32() == 0;
+    case internal::WireFormatLite::CPPTYPE_UINT64:
+      return field->default_value_uint64() == 0;
+    case internal::WireFormatLite::CPPTYPE_FLOAT:
+      return field->default_value_float() == 0;
+    case internal::WireFormatLite::CPPTYPE_DOUBLE:
+      return field->default_value_double() == 0;
+    case internal::WireFormatLite::CPPTYPE_BOOL:
+      return field->default_value_bool() == false;
+    default:
+      return false;
   }
 }
 
@@ -762,15 +836,13 @@
     return;
   }
 
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["classname"] = DependentBaseClassTemplateName(descriptor_);
-  vars["full_name"] = descriptor_->full_name();
   vars["superclass"] = SuperClassName(descriptor_, options_);
 
   printer->Print(vars,
     "template <class T>\n"
-    "class $classname$ : public $superclass$ "
-    "/* @@protoc_insertion_point(dep_base_class_definition:$full_name$) */ {\n"
+    "class $classname$ : public $superclass$ {\n"
     " public:\n");
   printer->Indent();
 
@@ -788,50 +860,24 @@
 
 void MessageGenerator::
 GenerateClassDefinition(io::Printer* printer) {
-  if (IsMapEntryMessage(descriptor_)) {
-    std::map<string, string> vars;
-    vars["classname"] = classname_;
-    CollectMapInfo(descriptor_, &vars);
-    vars["lite"] =
-        HasDescriptorMethods(descriptor_->file(), options_) ? "" : "Lite";
-    printer->Print(
-        vars,
-        "class $classname$ : public "
-        "::google::protobuf::internal::MapEntry$lite$<$classname$, \n"
-        "    $key_cpp$, $val_cpp$,\n"
-        "    $key_wire_type$,\n"
-        "    $val_wire_type$,\n"
-        "    $default_enum_value$ > {\n"
-        "public:\n"
-        "  typedef ::google::protobuf::internal::MapEntry$lite$<$classname$, \n"
-        "    $key_cpp$, $val_cpp$,\n"
-        "    $key_wire_type$,\n"
-        "    $val_wire_type$,\n"
-        "    $default_enum_value$ > SuperType;\n"
-        "  $classname$();\n"
-        "  $classname$(::google::protobuf::Arena* arena);\n"
-        "  void MergeFrom(const $classname$& other);\n"
-        "  static const $classname$* internal_default_instance() { return "
-        "reinterpret_cast<const "
-        "$classname$*>(&_$classname$_default_instance_); }\n");
-    if (HasDescriptorMethods(descriptor_->file(), options_)) {
-      printer->Print(
-          "  void MergeFrom(const ::google::protobuf::Message& other) PROTOBUF_FINAL;\n"
-          "  ::google::protobuf::Metadata GetMetadata() const;\n"
-          "};\n");
-    } else {
-      printer->Print("};\n");
-    }
-    return;
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    // map entry message doesn't need class definition. Since map entry message
+    // cannot be a top level class, we just need to avoid calling
+    // GenerateClassDefinition here.
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->GenerateClassDefinition(printer);
+    printer->Print("\n");
+    printer->Print(kThinSeparator);
+    printer->Print("\n");
   }
+
   if (use_dependent_base_) {
     GenerateDependentBaseClassDefinition(printer);
       printer->Print("\n");
   }
 
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["classname"] = classname_;
-  vars["full_name"] = descriptor_->full_name();
   vars["field_count"] = SimpleItoa(descriptor_->field_count());
   vars["oneof_decl_count"] = SimpleItoa(descriptor_->oneof_decl_count());
   if (options_.dllexport_decl.empty()) {
@@ -846,9 +892,7 @@
     vars["superclass"] = SuperClassName(descriptor_, options_);
   }
   printer->Print(vars,
-    "class $dllexport$$classname$ : public $superclass$ "
-    "/* @@protoc_insertion_point(class_definition:$full_name$) */ "
-    "{\n");
+    "class $dllexport$$classname$ : public $superclass$ {\n");
   printer->Annotate("classname", descriptor_);
   if (use_dependent_base_) {
     printer->Print(vars, "  friend class $superclass$;\n");
@@ -856,54 +900,57 @@
   printer->Print(" public:\n");
   printer->Indent();
 
-  printer->Print(
-      vars,
-      "$classname$();\n"
-      "virtual ~$classname$();\n"
-      "\n"
-      "$classname$(const $classname$& from);\n"
-      "\n"
-      "inline $classname$& operator=(const $classname$& from) {\n"
-      "  CopyFrom(from);\n"
-      "  return *this;\n"
-      "}\n");
-
-  if (options_.table_driven_serialization) {
-    printer->Print(
-      "private:\n"
-      "const void* InternalGetTable() const;\n"
-      "public:\n"
-      "\n");
-  }
-
-  // Generate move constructor and move assignment operator.
   printer->Print(vars,
-    "#if LANG_CXX11\n"
-    "$classname$($classname$&& from) noexcept\n"
-    "  : $classname$() {\n"
-    "  *this = ::std::move(from);\n"
-    "}\n"
+    "$classname$();\n"
+    "virtual ~$classname$();\n"
     "\n"
-    "inline $classname$& operator=($classname$&& from) noexcept {\n"
-    "  if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {\n"
-    "    if (this != &from) InternalSwap(&from);\n"
-    "  } else {\n"
-    "    CopyFrom(from);\n"
-    "  }\n"
+    "$classname$(const $classname$& from);\n"
+    "\n"
+    "inline $classname$& operator=(const $classname$& from) {\n"
+    "  CopyFrom(from);\n"
     "  return *this;\n"
     "}\n"
-    "#endif\n");
+    "\n");
 
-  SetUnknkownFieldsVariable(descriptor_, options_, &vars);
-  if (PublicUnknownFieldsAccessors(descriptor_)) {
-    printer->Print(vars,
-        "inline const $unknown_fields_type$& unknown_fields() const {\n"
-        "  return $unknown_fields$;\n"
+  if (PreserveUnknownFields(descriptor_)) {
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print(
+        "inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n"
+        "  return _internal_metadata_.unknown_fields();\n"
         "}\n"
-        "inline $unknown_fields_type$* mutable_unknown_fields() {\n"
-        "  return $mutable_unknown_fields$;\n"
+        "\n"
+        "inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n"
+        "  return _internal_metadata_.mutable_unknown_fields();\n"
         "}\n"
         "\n");
+    } else {
+      if (SupportsArenas(descriptor_)) {
+        printer->Print(
+          "inline const ::std::string& unknown_fields() const {\n"
+          "  return _unknown_fields_.Get(\n"
+          "      &::google::protobuf::internal::GetEmptyStringAlreadyInited());\n"
+          "}\n"
+          "\n"
+          "inline ::std::string* mutable_unknown_fields() {\n"
+          "  return _unknown_fields_.Mutable(\n"
+          "      &::google::protobuf::internal::GetEmptyStringAlreadyInited(),\n"
+          "      GetArenaNoVirtual());\n"
+          "}\n"
+          "\n");
+      } else {
+        printer->Print(
+          "inline const ::std::string& unknown_fields() const {\n"
+          "  return _unknown_fields_.GetNoArena(\n"
+          "      &::google::protobuf::internal::GetEmptyStringAlreadyInited());\n"
+          "}\n"
+          "\n"
+          "inline ::std::string* mutable_unknown_fields() {\n"
+          "  return _unknown_fields_.MutableNoArena(\n"
+          "      &::google::protobuf::internal::GetEmptyStringAlreadyInited());\n"
+          "}\n"
+          "\n");
+      }
+    }
   }
 
   // N.B.: We exclude GetArena() when arena support is disabled, falling back on
@@ -913,10 +960,8 @@
     // virtual method version of GetArenaNoVirtual(), required for generic dispatch given a
     // MessageLite* (e.g., in RepeatedField::AddAllocated()).
     printer->Print(
-        "inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {\n"
-        "  return GetArenaNoVirtual();\n"
-        "}\n"
-        "inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {\n"
+        "inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }\n"
+        "inline void* GetMaybeArenaPointer() const {\n"
         "  return MaybeArenaPtr();\n"
         "}\n");
   }
@@ -959,18 +1004,20 @@
         "\n");
   }
 
-  // TODO(gerbens) make this private, while still granting other protos access.
-  vars["message_index"] = SimpleItoa(index_in_file_messages_);
-  printer->Print(
-      vars,
-      "static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY\n"
+  if (!StaticInitializersForced(descriptor_->file(), options_)) {
+    printer->Print(vars,
+      "#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER\n"
+      "// Returns the internal default instance pointer. This function can\n"
+      "// return NULL thus should not be used by the user. This is intended\n"
+      "// for Protobuf internal code. Please use default_instance() declared\n"
+      "// above instead.\n"
       "static inline const $classname$* internal_default_instance() {\n"
-      "  return reinterpret_cast<const $classname$*>(\n"
-      "             &_$classname$_default_instance_);\n"
+      "  return default_instance_;\n"
       "}\n"
-      "static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =\n"
-      "  $message_index$;\n"
+      "#endif\n"
       "\n");
+  }
+
 
   if (SupportsArenas(descriptor_)) {
     printer->Print(vars,
@@ -991,85 +1038,87 @@
       "\n");
   }
 
-  vars["new_final"] = " PROTOBUF_FINAL";
-
   printer->Print(vars,
     "void Swap($classname$* other);\n"
-    "friend void swap($classname$& a, $classname$& b) {\n"
-    "  a.Swap(&b);\n"
-    "}\n"
     "\n"
     "// implements Message ----------------------------------------------\n"
     "\n"
-    "inline $classname$* New() const$new_final$ { return New(NULL); }\n"
+    "inline $classname$* New() const { return New(NULL); }\n"
     "\n"
-    "$classname$* New(::google::protobuf::Arena* arena) const$new_final$;\n");
-
-  // For instances that derive from Message (rather than MessageLite), some
-  // methods are virtual and should be marked as final.
-  string use_final = HasDescriptorMethods(descriptor_->file(), options_) ?
-      " PROTOBUF_FINAL" : "";
+    "$classname$* New(::google::protobuf::Arena* arena) const;\n");
 
   if (HasGeneratedMethods(descriptor_->file(), options_)) {
     if (HasDescriptorMethods(descriptor_->file(), options_)) {
       printer->Print(vars,
-        "void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;\n"
-        "void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;\n");
+        "void CopyFrom(const ::google::protobuf::Message& from);\n"
+        "void MergeFrom(const ::google::protobuf::Message& from);\n");
     } else {
       printer->Print(vars,
-        "void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from)\n"
-        "  PROTOBUF_FINAL;\n");
+        "void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);\n");
     }
 
-    vars["clear_final"] = " PROTOBUF_FINAL";
-    vars["is_initialized_final"] = " PROTOBUF_FINAL";
-    vars["merge_partial_final"] = " PROTOBUF_FINAL";
-
-    printer->Print(
-        vars,
-        "void CopyFrom(const $classname$& from);\n"
-        "void MergeFrom(const $classname$& from);\n"
-        "void Clear()$clear_final$;\n"
-        "bool IsInitialized() const$is_initialized_final$;\n"
-        "\n"
-        "size_t ByteSizeLong() const PROTOBUF_FINAL;\n"
-        "bool MergePartialFromCodedStream(\n"
-        "    ::google::protobuf::io::CodedInputStream* input)$merge_partial_final$;\n");
-    if (!options_.table_driven_serialization ||
-        descriptor_->options().message_set_wire_format()) {
-      printer->Print(
-          "void SerializeWithCachedSizes(\n"
-          "    ::google::protobuf::io::CodedOutputStream* output) const "
-          "PROTOBUF_FINAL;\n");
-    }
+    printer->Print(vars,
+      "void CopyFrom(const $classname$& from);\n"
+      "void MergeFrom(const $classname$& from);\n"
+      "void Clear();\n"
+      "bool IsInitialized() const;\n"
+      "\n"
+      "int ByteSize() const;\n"
+      "bool MergePartialFromCodedStream(\n"
+      "    ::google::protobuf::io::CodedInputStream* input);\n"
+      "void SerializeWithCachedSizes(\n"
+      "    ::google::protobuf::io::CodedOutputStream* output) const;\n");
     // DiscardUnknownFields() is implemented in message.cc using reflections. We
     // need to implement this function in generated code for messages.
     if (!UseUnknownFieldSet(descriptor_->file(), options_)) {
       printer->Print(
-        "void DiscardUnknownFields()$final$;\n",
-        "final", use_final);
+        "void DiscardUnknownFields();\n");
     }
     if (HasFastArraySerialization(descriptor_->file(), options_)) {
       printer->Print(
-        "::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(\n"
-        "    bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;\n");
+        "::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n");
+    }
+  }
+
+  // Check all FieldDescriptors including those in oneofs to estimate
+  // whether ::std::string is likely to be used, and depending on that
+  // estimate, set uses_string_ to true or false.  That contols
+  // whether to force initialization of empty_string_ in SharedCtor().
+  // It's often advantageous to do so to keep "is empty_string_
+  // inited?" code from appearing all over the place.
+  vector<const FieldDescriptor*> descriptors;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    descriptors.push_back(descriptor_->field(i));
+  }
+  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
+    for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
+      descriptors.push_back(descriptor_->oneof_decl(i)->field(j));
+    }
+  }
+  uses_string_ = false;
+  if (PreserveUnknownFields(descriptor_) &&
+      !UseUnknownFieldSet(descriptor_->file(), options_)) {
+    uses_string_ = true;
+  }
+  for (int i = 0; i < descriptors.size(); i++) {
+    const FieldDescriptor* field = descriptors[i];
+    if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
+      switch (field->options().ctype()) {
+        default: uses_string_ = true; break;
+      }
     }
   }
 
   printer->Print(
-    "int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }\n"
+    "int GetCachedSize() const { return _cached_size_; }\n"
     "private:\n"
     "void SharedCtor();\n"
     "void SharedDtor();\n"
-    "void SetCachedSize(int size) const$final$;\n"
+    "void SetCachedSize(int size) const;\n"
     "void InternalSwap($classname$* other);\n",
-    "classname", classname_,
-    "final", use_final);
+    "classname", classname_);
   if (SupportsArenas(descriptor_)) {
     printer->Print(
-      // TODO(gerbens) Make this private! Currently people are deriving from
-      // protos to give access to this constructor, breaking the invariants
-      // we rely on.
       "protected:\n"
       "explicit $classname$(::google::protobuf::Arena* arena);\n"
       "private:\n"
@@ -1078,7 +1127,7 @@
       "classname", classname_);
   }
 
-  if (SupportsArenas(descriptor_)) {
+  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
     printer->Print(
       "private:\n"
       "inline ::google::protobuf::Arena* GetArenaNoVirtual() const {\n"
@@ -1086,29 +1135,29 @@
       "}\n"
       "inline void* MaybeArenaPtr() const {\n"
       "  return _internal_metadata_.raw_arena_ptr();\n"
-      "}\n");
+      "}\n"
+      "public:\n"
+      "\n");
   } else {
     printer->Print(
       "private:\n"
       "inline ::google::protobuf::Arena* GetArenaNoVirtual() const {\n"
-      "  return NULL;\n"
+      "  return _arena_ptr_;\n"
       "}\n"
-      "inline void* MaybeArenaPtr() const {\n"
-      "  return NULL;\n"
-      "}\n");
-  }
-
-  printer->Print(
+      "inline ::google::protobuf::Arena* MaybeArenaPtr() const {\n"
+      "  return _arena_ptr_;\n"
+      "}\n"
       "public:\n"
       "\n");
+  }
 
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
     printer->Print(
-      "::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;\n"
+      "::google::protobuf::Metadata GetMetadata() const;\n"
       "\n");
   } else {
     printer->Print(
-      "::std::string GetTypeName() const PROTOBUF_FINAL;\n"
+      "::std::string GetTypeName() const;\n"
       "\n");
   }
 
@@ -1123,8 +1172,6 @@
       printer->Print("typedef $nested_full_name$ $nested_name$;\n",
                      "nested_name", nested_type->name(),
                      "nested_full_name", ClassName(nested_type, false));
-      printer->Annotate("nested_full_name", nested_type);
-      printer->Annotate("nested_name", nested_type);
     }
   }
 
@@ -1163,21 +1210,22 @@
 
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
-    if (!descriptor_->field(i)->is_repeated() &&
-        !descriptor_->field(i)->options().weak()) {
+    if (!descriptor_->field(i)->is_repeated()) {
       // set_has_***() generated in all proto1/2 code and in oneofs (only) for
       // messages without true field presence.
       if (HasFieldPresence(descriptor_->file()) ||
           descriptor_->field(i)->containing_oneof()) {
-        printer->Print("void set_has_$name$();\n", "name",
-                       FieldName(descriptor_->field(i)));
+        printer->Print(
+          "inline void set_has_$name$();\n",
+          "name", FieldName(descriptor_->field(i)));
       }
       // clear_has_***() generated only for non-oneof fields
       // in proto1/2.
       if (!descriptor_->field(i)->containing_oneof() &&
           HasFieldPresence(descriptor_->file())) {
-        printer->Print("void clear_has_$name$();\n", "name",
-                       FieldName(descriptor_->field(i)));
+        printer->Print(
+          "inline void clear_has_$name$();\n",
+          "name", FieldName(descriptor_->field(i)));
       }
     }
   }
@@ -1196,8 +1244,8 @@
       !descriptor_->options().message_set_wire_format() &&
       num_required_fields_ > 1) {
     printer->Print(
-        "// helper for ByteSizeLong()\n"
-        "size_t RequiredFieldsByteSizeFallback() const;\n\n");
+        "// helper for ByteSize()\n"
+        "int RequiredFieldsByteSizeFallback() const;\n\n");
   }
 
   // Prepare decls for _cached_size_ and _has_bits_.  Their position in the
@@ -1207,10 +1255,18 @@
   // TODO(kenton):  Make _cached_size_ an atomic<int> when C++ supports it.
   const string cached_size_decl = "mutable int _cached_size_;\n";
 
-  const size_t sizeof_has_bits = HasBitsSize();
+  // TODO(jieluo) - Optimize _has_bits_ for repeated and oneof fields.
+  size_t sizeof_has_bits = (descriptor_->field_count() + 31) / 32 * 4;
+  if (descriptor_->field_count() == 0) {
+    // Zero-size arrays aren't technically allowed, and MSVC in particular
+    // doesn't like them.  We still need to declare these arrays to make
+    // other code compile.  Since this is an uncommon case, we'll just declare
+    // them with size 1 and waste some space.  Oh well.
+    sizeof_has_bits = 4;
+  }
   const string has_bits_decl = sizeof_has_bits == 0 ? "" :
-      "::google::protobuf::internal::HasBits<" + SimpleItoa(sizeof_has_bits / 4) +
-      "> _has_bits_;\n";
+      "::google::protobuf::uint32 _has_bits_[" + SimpleItoa(sizeof_has_bits / 4) + "];\n";
+
 
   // To minimize padding, data members are divided into three sections:
   // (1) members assumed to align to 8 bytes
@@ -1231,13 +1287,14 @@
       "::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;\n");
   } else {
     printer->Print(
-        "::google::protobuf::internal::InternalMetadataWithArenaLite "
-        "_internal_metadata_;\n");
+      "::google::protobuf::internal::ArenaStringPtr _unknown_fields_;\n"
+      "::google::protobuf::Arena* _arena_ptr_;\n"
+      "\n");
   }
 
   if (SupportsArenas(descriptor_)) {
     printer->Print(
-      "template <typename T> friend class ::google::protobuf::Arena::InternalHelper;\n"
+      "friend class ::google::protobuf::Arena;\n"
       "typedef void InternalArenaConstructable_;\n"
       "typedef void DestructorSkippable_;\n");
   }
@@ -1253,16 +1310,55 @@
       printer->Print(cached_size_decl.c_str());
       need_to_emit_cached_size = false;
     }
+  } else {
+    // Without field presence, we need another way to disambiguate the default
+    // instance, because the default instance's submessage fields (if any) store
+    // pointers to the default instances of the submessages even when they
+    // aren't present. Alternatives to this approach might be to (i) use a
+    // tagged pointer on all message fields, setting a tag bit for "not really
+    // present, just default instance"; or (ii) comparing |this| against the
+    // return value from GeneratedMessageFactory::GetPrototype() in all
+    // has_$field$() calls. However, both of these options are much more
+    // expensive (in code size and CPU overhead) than just checking a field in
+    // the message. Long-term, the best solution would be to rearchitect the
+    // default instance design not to store pointers to submessage default
+    // instances, and have reflection get those some other way; but that change
+    // would have too much impact on proto2.
+    printer->Print(
+      "bool _is_default_instance_;\n");
   }
 
   // Field members:
 
+  // List fields which doesn't belong to any oneof
+  vector<const FieldDescriptor*> fields;
+  hash_map<string, int> fieldname_to_chunk;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (!descriptor_->field(i)->containing_oneof()) {
+      const FieldDescriptor* field = descriptor_->field(i);
+      fields.push_back(field);
+      fieldname_to_chunk[FieldName(field)] = i / 8;
+    }
+  }
+  OptimizePadding(&fields);
   // Emit some private and static members
-  for (int i = 0; i < optimized_order_.size(); ++i) {
-    const FieldDescriptor* field = optimized_order_[i];
+  runs_of_fields_ = vector< vector<string> >(1);
+  for (int i = 0; i < fields.size(); ++i) {
+    const FieldDescriptor* field = fields[i];
     const FieldGenerator& generator = field_generators_.get(field);
     generator.GenerateStaticMembers(printer);
     generator.GeneratePrivateMembers(printer);
+    if (CanClearByZeroing(field)) {
+      const string& fieldname = FieldName(field);
+      if (!runs_of_fields_.back().empty() &&
+          (fieldname_to_chunk[runs_of_fields_.back().back()] !=
+           fieldname_to_chunk[fieldname])) {
+        runs_of_fields_.push_back(vector<string>());
+      }
+      runs_of_fields_.back().push_back(fieldname);
+    } else if (!runs_of_fields_.back().empty()) {
+      runs_of_fields_.push_back(vector<string>());
+    }
   }
 
   // For each oneof generate a union
@@ -1303,59 +1399,85 @@
       "\n");
   }
 
-  if (num_weak_fields_) {
-    printer->Print(
-        "::google::protobuf::internal::WeakFieldMap _weak_field_map_;\n");
-  }
   // Generate _any_metadata_ for the Any type.
   if (IsAnyMessage(descriptor_)) {
     printer->Print(vars,
       "::google::protobuf::internal::AnyMetadata _any_metadata_;\n");
   }
 
-  // The TableStruct struct needs access to the private parts, in order to
-  // construct the offsets of all members.
-  // TODO(gerbens) Remove the friend for InitDefaults.
-  printer->Print(
-      "friend struct ::$file_namespace$::TableStruct;\n"
-      "friend void ::$file_namespace$::InitDefaults$scc_name$Impl();\n",
+  // Declare AddDescriptors(), BuildDescriptors(), and ShutdownFile() as
+  // friends so that they can access private static variables like
+  // default_instance_ and reflection_.
+  PrintHandlingOptionalStaticInitializers(
+      descriptor_->file(), options_, printer,
+      // With static initializers.
+      "friend void $dllexport_decl$ $adddescriptorsname$();\n",
+      // Without.
+      "friend void $dllexport_decl$ $adddescriptorsname$_impl();\n",
       // Vars.
-      "scc_name", scc_name_, "file_namespace",
-      FileLevelNamespace(descriptor_));
+      "dllexport_decl", options_.dllexport_decl, "adddescriptorsname",
+      GlobalAddDescriptorsName(descriptor_->file()->name()));
+
+  printer->Print(
+    "friend void $assigndescriptorsname$();\n"
+    "friend void $shutdownfilename$();\n"
+    "\n",
+    "assigndescriptorsname",
+      GlobalAssignDescriptorsName(descriptor_->file()->name()),
+    "shutdownfilename", GlobalShutdownFileName(descriptor_->file()->name()));
+
+  printer->Print(
+    "void InitAsDefaultInstance();\n"
+    "static $classname$* default_instance_;\n",
+    "classname", classname_);
 
   printer->Outdent();
-  printer->Print("};");
+  printer->Print(vars, "};");
   GOOGLE_DCHECK(!need_to_emit_cached_size);
 }
 
 void MessageGenerator::
 GenerateDependentInlineMethods(io::Printer* printer) {
-  if (IsMapEntryMessage(descriptor_)) return;
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    if (descriptor_->field(i)->options().weak()) {
-      field_generators_.get(descriptor_->field(i))
-          .GenerateDependentInlineAccessorDefinitions(printer);
-    }
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    // map entry message doesn't need inline methods. Since map entry message
+    // cannot be a top level class, we just need to avoid calling
+    // GenerateInlineMethods here.
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->GenerateDependentInlineMethods(printer);
+    printer->Print(kThinSeparator);
+    printer->Print("\n");
   }
+
   GenerateDependentFieldAccessorDefinitions(printer);
 }
 
 void MessageGenerator::
-GenerateInlineMethods(io::Printer* printer) {
-  if (IsMapEntryMessage(descriptor_)) return;
-  GenerateFieldAccessorDefinitions(printer);
+GenerateInlineMethods(io::Printer* printer, bool is_inline) {
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    // map entry message doesn't need inline methods. Since map entry message
+    // cannot be a top level class, we just need to avoid calling
+    // GenerateInlineMethods here.
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->GenerateInlineMethods(printer, is_inline);
+    printer->Print(kThinSeparator);
+    printer->Print("\n");
+  }
+
+  GenerateFieldAccessorDefinitions(printer, is_inline);
 
   // Generate oneof_case() functions.
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["class_name"] = classname_;
     vars["camel_oneof_name"] = UnderscoresToCamelCase(
         descriptor_->oneof_decl(i)->name(), true);
     vars["oneof_name"] = descriptor_->oneof_decl(i)->name();
     vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
+    vars["inline"] = is_inline ? "inline " : "";
     printer->Print(
         vars,
-        "inline $class_name$::$camel_oneof_name$Case $class_name$::"
+        "$inline$"
+        "$class_name$::$camel_oneof_name$Case $class_name$::"
         "$oneof_name$_case() const {\n"
         "  return $class_name$::$camel_oneof_name$Case("
         "_oneof_case_[$oneof_index$]);\n"
@@ -1364,13 +1486,27 @@
 }
 
 void MessageGenerator::
-GenerateExtraDefaultFields(io::Printer* printer) {
-  // Generate oneof default instance and weak field instances for reflection
-  // usage.
-  if (descriptor_->oneof_decl_count() > 0 || num_weak_fields_ > 0) {
+GenerateDescriptorDeclarations(io::Printer* printer) {
+  if (!IsMapEntryMessage(descriptor_)) {
+    printer->Print(
+      "const ::google::protobuf::Descriptor* $name$_descriptor_ = NULL;\n"
+      "const ::google::protobuf::internal::GeneratedMessageReflection*\n"
+      "  $name$_reflection_ = NULL;\n",
+      "name", classname_);
+  } else {
+    printer->Print(
+      "const ::google::protobuf::Descriptor* $name$_descriptor_ = NULL;\n",
+      "name", classname_);
+  }
+
+  // Generate oneof default instance for reflection usage.
+  if (descriptor_->oneof_decl_count() > 0) {
+    printer->Print("struct $name$OneofInstance {\n",
+                   "name", classname_);
     for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
       for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
         const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
+        printer->Print("  ");
         if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||
             (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING &&
              EffectiveStringCType(field) != FieldOptions::STRING)) {
@@ -1379,417 +1515,278 @@
         field_generators_.get(field).GeneratePrivateMembers(printer);
       }
     }
-    for (int i = 0; i < descriptor_->field_count(); i++) {
-      const FieldDescriptor* field = descriptor_->field(i);
-      if (field->options().weak()) {
-        printer->Print(
-            "  const ::google::protobuf::Message* $name$_;\n", "name", FieldName(field));
-      }
-    }
-  }
-}
 
-bool MessageGenerator::GenerateParseTable(io::Printer* printer, size_t offset,
-                                          size_t aux_offset) {
-  if (!table_driven_) {
-    printer->Print("{ NULL, NULL, 0, -1, -1, -1, -1, NULL, false },\n");
-    return false;
+    printer->Print("}* $name$_default_oneof_instance_ = NULL;\n",
+                   "name", classname_);
   }
 
-  std::map<string, string> vars;
-
-  vars["classname"] = ClassName(descriptor_);
-  vars["classtype"] = QualifiedClassName(descriptor_);
-  vars["offset"] = SimpleItoa(offset);
-  vars["aux_offset"] = SimpleItoa(aux_offset);
-
-  int max_field_number = 0;
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
-    if (max_field_number < field->number()) {
-      max_field_number = field->number();
-    }
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->GenerateDescriptorDeclarations(printer);
   }
 
-  vars["max_field_number"] = SimpleItoa(max_field_number);
-
-  printer->Print("{\n");
-  printer->Indent();
-
-  printer->Print(vars,
-      "TableStruct::entries + $offset$,\n"
-      "TableStruct::aux + $aux_offset$,\n"
-      "$max_field_number$,\n");
-
-  if (!HasFieldPresence(descriptor_->file())) {
-    // If we don't have field presence, then _has_bits_ does not exist.
-    printer->Print(vars, "-1,\n");
-  } else {
-    printer->Print(vars,
-                   "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n"
-                   "  $classtype$, _has_bits_),\n");
-  }
-
-  if (descriptor_->oneof_decl_count() > 0) {
-    printer->Print(vars,
-                   "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n"
-                   "  $classtype$, _oneof_case_),\n");
-  } else {
-    printer->Print("-1,  // no _oneof_case_\n");
-  }
-
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print(vars,
-                   "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classtype$, "
-                   "_extensions_),\n");
-  } else {
-    printer->Print("-1,  // no _extensions_\n");
-  }
-
-  // TODO(ckennelly): Consolidate this with the calculation for
-  // AuxillaryParseTableField.
-  vars["ns"] = Namespace(descriptor_);
-
-  printer->Print(vars,
-                 "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n"
-                 "  $classtype$, _internal_metadata_),\n"
-                 "&$ns$::_$classname$_default_instance_,\n");
-
-  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
-    printer->Print(vars, "true,\n");
-  } else {
-    printer->Print(vars, "false,\n");
-  }
-
-  printer->Outdent();
-  printer->Print("},\n");
-  return true;
-}
-
-void MessageGenerator::GenerateSchema(io::Printer* printer, int offset,
-                                      int has_offset) {
-  std::map<string, string> vars;
-
-  vars["classname"] = QualifiedClassName(descriptor_);
-  vars["offset"] = SimpleItoa(offset);
-  vars["has_bits_offsets"] =
-      HasFieldPresence(descriptor_->file()) || IsMapEntryMessage(descriptor_)
-          ? SimpleItoa(offset + has_offset)
-          : "-1";
-
-  printer->Print(vars,
-                 "{ $offset$, $has_bits_offsets$, sizeof($classname$)},\n");
-}
-
-namespace {
-
-// TODO(gerbens) remove this after the next sync with GitHub code base.
-// Then the opensource testing has gained the functionality to compile
-// the CalcFieldNum given the symbols defined in generated-message-util.
-#ifdef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
-// We need a clean version of CalcFieldNum that doesn't use new functionality
-// in the runtime, because this functionality is not yet in the opensource
-// runtime
-
-uint32 CalculateType(uint32 type, uint32 type_class) {
-  return (type - 1) + type_class * 20;
-}
-
-uint32 CalcFieldNum(const FieldDescriptor* field, const Options& options) {
-  bool is_a_map = IsMapEntryMessage(field->containing_type());
-  int type = field->type();
-  if (field->containing_oneof()) {
-    return CalculateType(type, 4);
-  }
-  if (field->is_packed()) {
-    return CalculateType(type, 3);
-  } else if (field->is_repeated()) {
-    return CalculateType(type, 2);
-  } else if (!HasFieldPresence(field->file()) &&
-             field->containing_oneof() == NULL && !is_a_map) {
-    return CalculateType(type, 1);
-  } else {
-    return CalculateType(type, 0);
-  }
-}
-
-#else
-// We need to calculate for each field what function the table driven code
-// should use to serialize it. This returns the index in a lookup table.
-uint32 CalcFieldNum(const FieldDescriptor* field, const Options& options) {
-  bool is_a_map = IsMapEntryMessage(field->containing_type());
-  int type = field->type();
-  if (field->containing_oneof()) {
-    return internal::FieldMetadata::CalculateType(
-        type, internal::FieldMetadata::kOneOf);
-  }
-  if (field->is_packed()) {
-    return internal::FieldMetadata::CalculateType(
-        type, internal::FieldMetadata::kPacked);
-  } else if (field->is_repeated()) {
-    return internal::FieldMetadata::CalculateType(
-        type, internal::FieldMetadata::kRepeated);
-  } else if (!HasFieldPresence(field->file()) &&
-             field->containing_oneof() == NULL && !is_a_map) {
-    return internal::FieldMetadata::CalculateType(
-        type, internal::FieldMetadata::kNoPresence);
-  } else {
-    return internal::FieldMetadata::CalculateType(
-        type, internal::FieldMetadata::kPresence);
-  }
-}
-#endif
-
-int FindMessageIndexInFile(const Descriptor* descriptor) {
-  std::vector<const Descriptor*> flatten =
-      FlattenMessagesInFile(descriptor->file());
-  return std::find(flatten.begin(), flatten.end(), descriptor) -
-         flatten.begin();
-}
-
-}  // namespace
-
-int MessageGenerator::GenerateFieldMetadata(io::Printer* printer) {
-  if (!options_.table_driven_serialization) {
-    return 0;
-  }
-
-  string full_classname = QualifiedClassName(descriptor_);
-
-  std::vector<const FieldDescriptor*> sorted = SortFieldsByNumber(descriptor_);
-  if (IsMapEntryMessage(descriptor_)) {
-    for (int i = 0; i < 2; i++) {
-      const FieldDescriptor* field = sorted[i];
-      uint32 tag = internal::WireFormatLite::MakeTag(
-          field->number(), WireFormat::WireTypeForFieldType(field->type()));
-
-      std::map<string, string> vars;
-      vars["classname"] = QualifiedClassName(descriptor_);
-      vars["field_name"] = FieldName(field);
-      vars["tag"] = SimpleItoa(tag);
-      vars["hasbit"] = SimpleItoa(i);
-      vars["type"] = SimpleItoa(CalcFieldNum(field, options_));
-      vars["ptr"] = "NULL";
-      if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-        GOOGLE_CHECK(!IsMapEntryMessage(field->message_type()));
-        {
-          vars["ptr"] =
-              "::" + FileLevelNamespace(field->message_type()) +
-              "::TableStruct::serialization_table + " +
-              SimpleItoa(FindMessageIndexInFile(field->message_type()));
-        }
-      }
-      printer->Print(vars,
-                     "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
-                     "::google::protobuf::internal::MapEntryHelper<$classname$::"
-                     "SuperType>, $field_name$_), $tag$,"
-                     "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
-                     "::google::protobuf::internal::MapEntryHelper<$classname$::"
-                     "SuperType>, _has_bits_) * 8 + $hasbit$, $type$, "
-                     "$ptr$},\n");
-    }
-    return 2;
-  }
-  printer->Print(
-      "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-      "_cached_size_), 0, 0, 0, NULL},\n",
-      "classname", full_classname);
-  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(),
-            ExtensionRangeSorter());
-  for (int i = 0, extension_idx = 0; /* no range */; i++) {
-    for (; extension_idx < sorted_extensions.size() &&
-           (i == sorted.size() ||
-            sorted_extensions[extension_idx]->start < sorted[i]->number());
-         extension_idx++) {
-      const Descriptor::ExtensionRange* range =
-          sorted_extensions[extension_idx];
-      printer->Print(
-          "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-          "_extensions_), $start$, $end$, "
-          "::google::protobuf::internal::FieldMetadata::kSpecial, "
-          "reinterpret_cast<const "
-          "void*>(::google::protobuf::internal::ExtensionSerializer)},\n",
-          "classname", full_classname, "start", SimpleItoa(range->start), "end",
-          SimpleItoa(range->end));
-    }
-    if (i == sorted.size()) break;
-    const FieldDescriptor* field = sorted[i];
-
-    uint32 tag = internal::WireFormatLite::MakeTag(
-        field->number(), WireFormat::WireTypeForFieldType(field->type()));
-    if (field->is_packed()) {
-      tag = internal::WireFormatLite::MakeTag(
-          field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
-    }
-
-    string classfieldname = FieldName(field);
-    if (field->containing_oneof()) {
-      classfieldname = field->containing_oneof()->name();
-    }
-    std::map<string, string> vars;
-    vars["classname"] = full_classname;
-    vars["field_name"] = classfieldname;
-    vars["tag"] = SimpleItoa(tag);
-    vars["ptr"] = "NULL";
-    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      if (IsMapEntryMessage(field->message_type())) {
-        vars["idx"] = SimpleItoa(FindMessageIndexInFile(field->message_type()));
-        vars["fieldclassname"] = QualifiedClassName(field->message_type());
-        printer->Print(vars,
-                       "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                       "classname$, $field_name$_), $tag$, $idx$, "
-                       "::google::protobuf::internal::FieldMetadata::kSpecial, "
-                       "reinterpret_cast<const void*>(static_cast< "
-                       "::google::protobuf::internal::SpecialSerializer>("
-                       "::google::protobuf::internal::MapFieldSerializer< "
-                       "::google::protobuf::internal::MapEntryToMapField<"
-                       "$fieldclassname$>::MapFieldType, "
-                       "TableStruct::serialization_table>))},\n");
-        continue;
-      } else {
-        vars["ptr"] =
-            "::" + FileLevelNamespace(field->message_type()) +
-            "::TableStruct::serialization_table + " +
-            SimpleItoa(FindMessageIndexInFile(field->message_type()));
-      }
-    }
-    vars["type"] = SimpleItoa(CalcFieldNum(field, options_));
-
-
-    if (field->options().weak()) {
-      // TODO(gerbens) merge weak fields into ranges
-      printer->Print(vars,
-                     "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                     "classname$, _weak_field_map_), $tag$, $tag$, "
-                     "::google::protobuf::internal::FieldMetadata::kSpecial, "
-                     "reinterpret_cast<const "
-                     "void*>(::google::protobuf::internal::WeakFieldSerializer)},\n");
-    } else if (field->containing_oneof()) {
-      vars["oneofoffset"] =
-          SimpleItoa(sizeof(uint32) * field->containing_oneof()->index());
-      printer->Print(vars,
-                     "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                     "classname$, $field_name$_), $tag$, "
-                     "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                     "classname$, _oneof_case_) + $oneofoffset$, "
-                     "$type$, $ptr$},\n");
-    } else if (HasFieldPresence(descriptor_->file()) &&
-               has_bit_indices_[field->index()] != -1) {
-      vars["hasbitsoffset"] = SimpleItoa(has_bit_indices_[field->index()]);
-      printer->Print(vars,
-                     "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                     "classname$, $field_name$_), $tag$, "
-                     "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                     "classname$, _has_bits_) * 8 + $hasbitsoffset$, $type$, "
-                     "$ptr$},\n");
-    } else {
-      printer->Print(vars,
-                     "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($"
-                     "classname$, $field_name$_), $tag$, ~0u, $type$, "
-                     "$ptr$},\n");
-    }
-  }
-  int num_field_metadata = 1 + sorted.size() + sorted_extensions.size();
-  num_field_metadata++;
-  string serializer = UseUnknownFieldSet(descriptor_->file(), options_)
-                          ? "::google::protobuf::internal::UnknownFieldSetSerializer"
-                          : "::google::protobuf::internal::UnknownFieldSerializerLite";
-  printer->Print(
-      "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-      "_internal_metadata_), 0, ~0u, "
-      "::google::protobuf::internal::FieldMetadata::kSpecial, reinterpret_cast<const "
-      "void*>($serializer$)},\n",
-      "classname", full_classname, "serializer", serializer);
-  return num_field_metadata;
-}
-
-void MessageGenerator::GenerateFieldDefaultInstances(io::Printer* printer) {
-  // Construct the default instances for all fields that need one.
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    field_generators_.get(descriptor_->field(i))
-                     .GenerateDefaultInstanceAllocator(printer);
+  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
+    printer->Print(
+      "const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\n",
+      "name", ClassName(descriptor_->enum_type(i), false));
   }
 }
 
 void MessageGenerator::
-GenerateDefaultInstanceInitializer(io::Printer* printer) {
-  // The default instance needs all of its embedded message pointers
-  // cross-linked to other default instances.  We can't do this initialization
-  // in the constructor because some other default instances may not have been
-  // constructed yet at that time.
-  // TODO(kenton):  Maybe all message fields (even for non-default messages)
-  //   should be initialized to point at default instances rather than NULL?
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
+GenerateDescriptorInitializer(io::Printer* printer, int index) {
+  // TODO(kenton):  Passing the index to this method is redundant; just use
+  //   descriptor_->index() instead.
+  map<string, string> vars;
+  vars["classname"] = classname_;
+  vars["index"] = SimpleItoa(index);
 
-    if (!field->is_repeated() &&
-        field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
-        (field->containing_oneof() == NULL ||
-         HasDescriptorMethods(descriptor_->file(), options_))) {
-      string name;
-      if (field->containing_oneof() || field->options().weak()) {
-        name = "_" + classname_ + "_default_instance_.";
-      } else {
-        name =
-            "_" + classname_ + "_default_instance_._instance.get_mutable()->";
-      }
-      name += FieldName(field);
-      printer->Print(
-          "$ns$::$name$_ = const_cast< $type$*>(\n"
-          "    $type$::internal_default_instance());\n",
-          // Vars.
-          "name", name, "type", FieldMessageTypeName(field), "ns",
-          Namespace(descriptor_));
-    } else if (field->containing_oneof() &&
-               HasDescriptorMethods(descriptor_->file(), options_)) {
-      field_generators_.get(descriptor_->field(i))
-          .GenerateConstructorCode(printer);
+  // Obtain the descriptor from the parent's descriptor.
+  if (descriptor_->containing_type() == NULL) {
+    printer->Print(vars,
+      "$classname$_descriptor_ = file->message_type($index$);\n");
+  } else {
+    vars["parent"] = ClassName(descriptor_->containing_type(), false);
+    printer->Print(vars,
+      "$classname$_descriptor_ = "
+        "$parent$_descriptor_->nested_type($index$);\n");
+  }
+
+  if (IsMapEntryMessage(descriptor_)) return;
+
+  // Generate the offsets.
+  GenerateOffsets(printer);
+
+  const bool pass_pool_and_factory = false;
+  vars["fn"] = pass_pool_and_factory ?
+      "new ::google::protobuf::internal::GeneratedMessageReflection" :
+      "::google::protobuf::internal::GeneratedMessageReflection"
+      "::NewGeneratedMessageReflection";
+  // Construct the reflection object.
+  printer->Print(vars,
+    "$classname$_reflection_ =\n"
+    "  $fn$(\n"
+    "    $classname$_descriptor_,\n"
+    "    $classname$::default_instance_,\n"
+    "    $classname$_offsets_,\n");
+  if (!HasFieldPresence(descriptor_->file())) {
+    // If we don't have field presence, then _has_bits_ does not exist.
+    printer->Print(vars,
+    "    -1,\n");
+  } else {
+    printer->Print(vars,
+    "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, _has_bits_[0]),\n");
+  }
+
+  // Unknown field offset: either points to the unknown field set if embedded
+  // directly, or indicates that the unknown field set is stored as part of the
+  // internal metadata if not.
+  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+    printer->Print(vars,
+    "    -1,\n");
+  } else {
+    printer->Print(vars,
+    "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
+      "$classname$, _unknown_fields_),\n");
+  }
+
+  if (descriptor_->extension_range_count() > 0) {
+    printer->Print(vars,
+      "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
+        "$classname$, _extensions_),\n");
+  } else {
+    // No extensions.
+    printer->Print(vars,
+      "    -1,\n");
+  }
+
+  if (descriptor_->oneof_decl_count() > 0) {
+    printer->Print(vars,
+    "    $classname$_default_oneof_instance_,\n"
+    "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
+      "$classname$, _oneof_case_[0]),\n");
+  }
+
+  if (pass_pool_and_factory) {
+    printer->Print(
+        "    ::google::protobuf::DescriptorPool::generated_pool(),\n");
+      printer->Print(vars,
+                     "    ::google::protobuf::MessageFactory::generated_factory(),\n");
+  }
+
+  printer->Print(vars,
+    "    sizeof($classname$),\n");
+
+  // Arena offset: either an offset to the metadata struct that contains the
+  // arena pointer and unknown field set (in a space-efficient way) if we use
+  // that implementation strategy, or an offset directly to the arena pointer if
+  // not (because e.g. we don't have an unknown field set).
+  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+    printer->Print(vars,
+    "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
+    "$classname$, _internal_metadata_),\n");
+  } else {
+    printer->Print(vars,
+    "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
+    "$classname$, _arena_),\n");
+  }
+
+  // is_default_instance_ offset.
+  if (HasFieldPresence(descriptor_->file())) {
+    printer->Print(vars,
+    "    -1);\n");
+  } else {
+    printer->Print(vars,
+    "    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
+    "$classname$, _is_default_instance_));\n");
+  }
+
+  // Handle nested types.
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->GenerateDescriptorInitializer(printer, i);
+  }
+
+  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
+    enum_generators_[i]->GenerateDescriptorInitializer(printer, i);
+  }
+}
+
+void MessageGenerator::
+GenerateTypeRegistrations(io::Printer* printer) {
+  // Register this message type with the message factory.
+  if (!IsMapEntryMessage(descriptor_)) {
+    printer->Print(
+      "::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n"
+      "    $classname$_descriptor_, &$classname$::default_instance());\n",
+      "classname", classname_);
+  }
+  else {
+    map<string, string> vars;
+    CollectMapInfo(descriptor_, &vars);
+    vars["classname"] = classname_;
+
+    const FieldDescriptor* val = descriptor_->FindFieldByName("value");
+    if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO2 &&
+        val->type() == FieldDescriptor::TYPE_ENUM) {
+      const EnumValueDescriptor* default_value = val->default_value_enum();
+      vars["default_enum_value"] = Int32ToString(default_value->number());
+    } else {
+      vars["default_enum_value"] = "0";
     }
+
+    printer->Print(vars,
+      "::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n"
+      "      $classname$_descriptor_,\n"
+      "      ::google::protobuf::internal::MapEntry<\n"
+      "          $key$,\n"
+      "          $val$,\n"
+      "          $key_wire_type$,\n"
+      "          $val_wire_type$,\n"
+      "          $default_enum_value$>::CreateDefaultInstance(\n"
+      "              $classname$_descriptor_));\n");
+  }
+
+  // Handle nested types.
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->GenerateTypeRegistrations(printer);
+  }
+}
+
+void MessageGenerator::
+GenerateDefaultInstanceAllocator(io::Printer* printer) {
+  // Construct the default instances of all fields, as they will be used
+  // when creating the default instance of the entire message.
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    field_generators_.get(descriptor_->field(i))
+                     .GenerateDefaultInstanceAllocator(printer);
+  }
+
+  if (IsMapEntryMessage(descriptor_)) return;
+
+  // Construct the default instance.  We can't call InitAsDefaultInstance() yet
+  // because we need to make sure all default instances that this one might
+  // depend on are constructed first.
+  printer->Print(
+    "$classname$::default_instance_ = new $classname$();\n",
+    "classname", classname_);
+
+  if ((descriptor_->oneof_decl_count() > 0) &&
+      HasDescriptorMethods(descriptor_->file(), options_)) {
+    printer->Print(
+    "$classname$_default_oneof_instance_ = new $classname$OneofInstance();\n",
+    "classname", classname_);
+  }
+
+  // Handle nested types.
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    nested_generators_[i]->GenerateDefaultInstanceAllocator(printer);
+  }
+
+}
+
+void MessageGenerator::
+GenerateDefaultInstanceInitializer(io::Printer* printer) {
+  printer->Print(
+    "$classname$::default_instance_->InitAsDefaultInstance();\n",
+    "classname", classname_);
+
+  // Register extensions.
+  for (int i = 0; i < descriptor_->extension_count(); i++) {
+    extension_generators_[i]->GenerateRegistration(printer);
+  }
+
+  // Handle nested types.
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    // map entry message doesn't need to initialize default instance manually.
+    // Since map entry message cannot be a top level class, we just need to
+    // avoid calling DefaultInstanceInitializer here.
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->GenerateDefaultInstanceInitializer(printer);
+  }
+}
+
+void MessageGenerator::
+GenerateShutdownCode(io::Printer* printer) {
+  printer->Print(
+    "delete $classname$::default_instance_;\n",
+    "classname", classname_);
+
+  if (HasDescriptorMethods(descriptor_->file(), options_)) {
+    if (descriptor_->oneof_decl_count() > 0) {
+      printer->Print(
+        "delete $classname$_default_oneof_instance_;\n",
+        "classname", classname_);
+    }
+    printer->Print(
+      "delete $classname$_reflection_;\n",
+      "classname", classname_);
+  }
+
+  // Handle default instances of fields.
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    field_generators_.get(descriptor_->field(i))
+                     .GenerateShutdownCode(printer);
+  }
+
+  // Handle nested types.
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->GenerateShutdownCode(printer);
   }
 }
 
 void MessageGenerator::
 GenerateClassMethods(io::Printer* printer) {
-  if (IsMapEntryMessage(descriptor_)) {
+  // mutable_unknown_fields wrapper function for LazyStringOutputStream
+  // callback.
+  if (PreserveUnknownFields(descriptor_) &&
+      !UseUnknownFieldSet(descriptor_->file(), options_)) {
     printer->Print(
-        "$classname$::$classname$() {}\n"
-        "$classname$::$classname$(::google::protobuf::Arena* arena) : "
-        "SuperType(arena) {}\n"
-        "void $classname$::MergeFrom(const $classname$& other) {\n"
-        "  MergeFromInternal(other);\n"
-        "}\n",
+        "static ::std::string* MutableUnknownFieldsFor$classname$(\n"
+        "    $classname$* ptr) {\n"
+        "  return ptr->mutable_unknown_fields();\n"
+        "}\n"
+        "\n",
         "classname", classname_);
-    if (HasDescriptorMethods(descriptor_->file(), options_)) {
-      printer->Print(
-          "::google::protobuf::Metadata $classname$::GetMetadata() const {\n"
-          "  ::$file_namespace$::protobuf_AssignDescriptorsOnce();\n"
-          "  return ::$file_namespace$::file_level_metadata[$index$];\n"
-          "}\n"
-          "void $classname$::MergeFrom(\n"
-          "    const ::google::protobuf::Message& other) {\n"
-          "  ::google::protobuf::Message::MergeFrom(other);\n"
-          "}\n"
-          "\n",
-          "file_namespace", FileLevelNamespace(descriptor_),
-          "classname", classname_, "index",
-          SimpleItoa(index_in_file_messages_));
-    }
-    return;
   }
-
-  // TODO(gerbens) Remove this function. With a little bit of cleanup and
-  // refactoring this is superfluous.
-  printer->Print("void $classname$::InitAsDefaultInstance() {\n", "classname",
-                 classname_);
-  printer->Indent();
-  GenerateDefaultInstanceInitializer(printer);
-  printer->Outdent();
-  printer->Print("}\n");
-
   if (IsAnyMessage(descriptor_)) {
     printer->Print(
       "void $classname$::PackFrom(const ::google::protobuf::Message& message) {\n"
@@ -1808,19 +1805,25 @@
       "classname", classname_);
   }
 
+  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
+    enum_generators_[i]->GenerateMethods(printer);
+  }
+
+  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
+    // map entry message doesn't need class methods. Since map entry message
+    // cannot be a top level class, we just need to avoid calling
+    // GenerateClassMethods here.
+    if (IsMapEntryMessage(descriptor_->nested_type(i))) continue;
+    nested_generators_[i]->GenerateClassMethods(printer);
+    printer->Print("\n");
+    printer->Print(kThinSeparator);
+    printer->Print("\n");
+  }
+
   // Generate non-inline field definitions.
   for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
-    field_generators_.get(field)
+    field_generators_.get(descriptor_->field(i))
                      .GenerateNonInlineAccessorDefinitions(printer);
-    if (IsCrossFileMaybeMap(field)) {
-      std::map<string, string> vars;
-      SetCommonFieldVariables(field, &vars, options_);
-      if (field->containing_oneof()) {
-        SetCommonOneofFieldVariables(field, &vars);
-      }
-      GenerateFieldClear(field, vars, false, printer);
-    }
   }
 
   // Generate field number constants.
@@ -1836,6 +1839,11 @@
     "#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900\n"
     "\n");
 
+  // Define extension identifiers.
+  for (int i = 0; i < descriptor_->extension_count(); i++) {
+    extension_generators_[i]->GenerateDefinition(printer);
+  }
+
   GenerateStructors(printer);
   printer->Print("\n");
 
@@ -1875,26 +1883,17 @@
   GenerateSwap(printer);
   printer->Print("\n");
 
-  if (options_.table_driven_serialization) {
-    printer->Print(
-        "const void* $classname$::InternalGetTable() const {\n"
-        "  return ::$file_namespace$::TableStruct::serialization_table + "
-        "$index$;\n"
-        "}\n"
-        "\n",
-        "classname", classname_, "index", SimpleItoa(index_in_file_messages_),
-        "file_namespace", FileLevelNamespace(descriptor_));
-  }
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
     printer->Print(
-        "::google::protobuf::Metadata $classname$::GetMetadata() const {\n"
-        "  $file_namespace$::protobuf_AssignDescriptorsOnce();\n"
-        "  return ::"
-        "$file_namespace$::file_level_metadata[kIndexInFileMessages];\n"
-        "}\n"
-        "\n",
-        "classname", classname_, "file_namespace",
-        FileLevelNamespace(descriptor_));
+      "::google::protobuf::Metadata $classname$::GetMetadata() const {\n"
+      "  protobuf_AssignDescriptorsOnce();\n"
+      "  ::google::protobuf::Metadata metadata;\n"
+      "  metadata.descriptor = $classname$_descriptor_;\n"
+      "  metadata.reflection = $classname$_reflection_;\n"
+      "  return metadata;\n"
+      "}\n"
+      "\n",
+      "classname", classname_);
   } else {
     printer->Print(
       "::std::string $classname$::GetTypeName() const {\n"
@@ -1907,268 +1906,41 @@
 
 }
 
-size_t MessageGenerator::GenerateParseOffsets(io::Printer* printer) {
-  if (!table_driven_) {
-    return 0;
-  }
+void MessageGenerator::
+GenerateOffsets(io::Printer* printer) {
+  printer->Print("static const int $classname$_offsets_[$field_count$] = {\n",
+                 "classname", classname_, "field_count",
+                 SimpleItoa(std::max(1, descriptor_->field_count() +
+                                            descriptor_->oneof_decl_count())));
+  printer->Indent();
 
-  // Field "0" is special:  We use it in our switch statement of processing
-  // types to handle the successful end tag case.
-  printer->Print("{0, 0, 0, ::google::protobuf::internal::kInvalidMask, 0, 0},\n");
-  int last_field_number = 1;
-
-  std::vector<const FieldDescriptor*> ordered_fields =
-      SortFieldsByNumber(descriptor_);
-
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = ordered_fields[i];
-    GOOGLE_CHECK_GE(field->number(), last_field_number);
-
-    for (; last_field_number < field->number(); last_field_number++) {
-      printer->Print(
-          "{ 0, 0, ::google::protobuf::internal::kInvalidMask,\n"
-          "  ::google::protobuf::internal::kInvalidMask, 0, 0 },\n");
-    }
-    last_field_number++;
-
-    unsigned char normal_wiretype, packed_wiretype, processing_type;
-    normal_wiretype = WireFormat::WireTypeForFieldType(field->type());
-
-    if (field->is_packable()) {
-      packed_wiretype = WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
-    } else {
-      packed_wiretype = internal::kNotPackedMask;
-    }
-
-    processing_type = static_cast<unsigned>(field->type());
-    if (field->type() == FieldDescriptor::TYPE_STRING) {
-      switch (EffectiveStringCType(field)) {
-        case FieldOptions::STRING:
-        default:
-          break;
-      }
-    } else if (field->type() == FieldDescriptor::TYPE_BYTES) {
-      switch (EffectiveStringCType(field)) {
-        case FieldOptions::STRING:
-        default:
-          break;
-      }
-    }
-
-    processing_type |= static_cast<unsigned>(
-        field->is_repeated() ?  internal::kRepeatedMask : 0);
-    processing_type |= static_cast<unsigned>(
-        field->containing_oneof() ? internal::kOneofMask : 0);
-
-    if (field->is_map()) {
-      processing_type = internal::TYPE_MAP;
-    }
-
-    const unsigned char tag_size =
-      WireFormat::TagSize(field->number(), field->type());
-
-    std::map<string, string> vars;
-    vars["classname"] = QualifiedClassName(descriptor_);
-    if (field->containing_oneof() != NULL) {
-      vars["name"] = field->containing_oneof()->name();
-      vars["presence"] = SimpleItoa(field->containing_oneof()->index());
-    } else {
-      vars["name"] = FieldName(field);
-      vars["presence"] = SimpleItoa(has_bit_indices_[field->index()]);
-    }
-    vars["nwtype"] = SimpleItoa(normal_wiretype);
-    vars["pwtype"] = SimpleItoa(packed_wiretype);
-    vars["ptype"] = SimpleItoa(processing_type);
-    vars["tag_size"] = SimpleItoa(tag_size);
-
-    printer->Print(vars,
-      "{\n"
-      "  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n"
-      "    $classname$, $name$_),\n"
-      "  static_cast< ::google::protobuf::uint32>($presence$),\n"
-      "  $nwtype$, $pwtype$, $ptype$, $tag_size$\n"
-      "},\n");
-  }
-
-  return last_field_number;
-}
-
-size_t MessageGenerator::GenerateParseAuxTable(io::Printer* printer) {
-  if (!table_driven_) {
-    return 0;
-  }
-
-  std::vector<const FieldDescriptor*> ordered_fields =
-      SortFieldsByNumber(descriptor_);
-
-  printer->Print("::google::protobuf::internal::AuxillaryParseTableField(),\n");
-  int last_field_number = 1;
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = ordered_fields[i];
-
-    GOOGLE_CHECK_GE(field->number(), last_field_number);
-    for (; last_field_number < field->number(); last_field_number++) {
-      printer->Print("::google::protobuf::internal::AuxillaryParseTableField(),\n");
-    }
-
-    std::map<string, string> vars;
-    SetCommonFieldVariables(field, &vars, options_);
-
-    switch (field->cpp_type()) {
-      case FieldDescriptor::CPPTYPE_ENUM:
-        vars["type"] = ClassName(field->enum_type(), true);
-        printer->Print(
-            vars,
-            "{::google::protobuf::internal::AuxillaryParseTableField::enum_aux{"
-            "$type$_IsValid}},\n");
-        last_field_number++;
-        break;
-      case FieldDescriptor::CPPTYPE_MESSAGE: {
-        if (field->is_map()) {
-          vars["classname"] = QualifiedClassName(field->message_type());
-          printer->Print(vars,
-                         "{::google::protobuf::internal::AuxillaryParseTableField::map_"
-                         "aux{&::google::protobuf::internal::ParseMap<$classname$>}},\n");
-          last_field_number++;
-          break;
-        } else {
-          vars["classname"] = ClassName(field->message_type(), false);
-        }
-        vars["ns"] = Namespace(field->message_type());
-        vars["type"] = FieldMessageTypeName(field);
-        vars["file_namespace"] =
-            FileLevelNamespace(field->message_type());
-
-        printer->Print(
-            vars,
-            "{::google::protobuf::internal::AuxillaryParseTableField::message_aux{\n"
-            "  &$ns$::_$classname$_default_instance_,\n");
-
-        bool dont_emit_table =
-            !TableDrivenParsingEnabled(field->message_type(), options_);
-
-        if (dont_emit_table) {
-          printer->Print("  NULL,\n");
-        } else {
-          printer->Print(vars,
-                         "  ::$file_namespace$::TableStruct::schema +\n"
-                         "    $ns$::$classname$::kIndexInFileMessages,\n");
-        }
-
-        printer->Print("}},\n");
-        last_field_number++;
-        break;
-      }
-      case FieldDescriptor::CPPTYPE_STRING:
-        switch (EffectiveStringCType(field)) {
-          case FieldOptions::STRING:
-            vars["default"] =
-                field->default_value_string().empty()
-                    ? "&::google::protobuf::internal::fixed_address_empty_string"
-                    : "&" + Namespace(field) + " ::" + classname_ +
-                          "::_default_" + FieldName(field) + "_";
-            break;
-          case FieldOptions::CORD:
-          case FieldOptions::STRING_PIECE:
-            vars["default"] =
-                "\"" + CEscape(field->default_value_string()) + "\"";
-            break;
-        }
-        vars["full_name"] = field->full_name();
-        printer->Print(vars,
-            "{::google::protobuf::internal::AuxillaryParseTableField::string_aux{\n"
-            "  $default$,\n"
-            "  \"$full_name$\"\n"
-            "}},\n");
-        last_field_number++;
-        break;
-      default:
-        break;
-    }
-  }
-
-  return last_field_number;
-}
-
-std::pair<size_t, size_t> MessageGenerator::GenerateOffsets(
-    io::Printer* printer) {
-  std::map<string, string> variables;
-  string full_classname = QualifiedClassName(descriptor_);
-  variables["classname"] = full_classname;
-
-  if (HasFieldPresence(descriptor_->file()) || IsMapEntryMessage(descriptor_)) {
-    printer->Print(
-        variables,
-        "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-        "_has_bits_),\n");
-  } else {
-    printer->Print("~0u,  // no _has_bits_\n");
-  }
-  printer->Print(variables,
-                 "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-                 "_internal_metadata_),\n");
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-        variables,
-        "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-        "_extensions_),\n");
-  } else {
-    printer->Print("~0u,  // no _extensions_\n");
-  }
-  if (descriptor_->oneof_decl_count() > 0) {
-    printer->Print(variables,
-                   "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
-                   "$classname$, _oneof_case_[0]),\n");
-  } else {
-    printer->Print("~0u,  // no _oneof_case_\n");
-  }
-  if (num_weak_fields_ > 0) {
-    printer->Print(variables,
-                   "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$,"
-                   " _weak_field_map_),\n");
-  } else {
-    printer->Print("~0u,  // no _weak_field_map_\n");
-  }
-  const int kNumGenericOffsets = 5;  // the number of fixed offsets above
-  const size_t offsets = kNumGenericOffsets +
-                         descriptor_->field_count() +
-                         descriptor_->oneof_decl_count();
-  size_t entries = offsets;
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
-    if (field->containing_oneof() || field->options().weak()) {
-      printer->Print("offsetof($classname$DefaultTypeInternal, $name$_),\n",
-                     "classname", full_classname, "name", FieldName(field));
+    if (field->containing_oneof()) {
+      printer->Print(
+          "PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET("
+          "$classname$_default_oneof_instance_, $name$_),\n",
+          "classname", classname_,
+          "name", FieldName(field));
     } else {
       printer->Print(
           "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
-          "$name$_),\n",
-          "classname", full_classname, "name", FieldName(field));
+                                                 "$name$_),\n",
+          "classname", classname_,
+          "name", FieldName(field));
     }
   }
 
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
     printer->Print(
-        "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, $name$_),\n",
-        "classname", full_classname, "name", oneof->name());
+      "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, $name$_),\n",
+      "classname", classname_,
+      "name", oneof->name());
   }
 
-  if (IsMapEntryMessage(descriptor_)) {
-    entries += 2;
-    printer->Print(
-        "0,\n"
-        "1,\n");
-  } else if (HasFieldPresence(descriptor_->file())) {
-    entries += has_bit_indices_.size();
-    for (int i = 0; i < has_bit_indices_.size(); i++) {
-      const string index = has_bit_indices_[i] >= 0 ?
-        SimpleItoa(has_bit_indices_[i]) : "~0u";
-      printer->Print("$index$,\n", "index", index);
-    }
-  }
-
-  return std::make_pair(entries, offsets);
+  printer->Outdent();
+  printer->Print("};\n");
 }
 
 void MessageGenerator::
@@ -2178,17 +1950,33 @@
     "classname", classname_);
   printer->Indent();
 
-  bool need_to_clear_cached_size = true;
-  // We reproduce the logic used for laying out _cached_sized_ in the class
-  // definition, as to initialize it in-order.
-  if (HasFieldPresence(descriptor_->file()) &&
-      (HasBitsSize() % 8) != 0) {
-    printer->Print("_cached_size_ = 0;\n");
-    need_to_clear_cached_size = false;
+  if (!HasFieldPresence(descriptor_->file())) {
+    printer->Print(
+      "  _is_default_instance_ = false;\n");
   }
 
-  std::vector<bool> processed(optimized_order_.size(), false);
-  GenerateConstructorBody(printer, processed, false);
+  printer->Print(StrCat(
+      uses_string_ ? "::google::protobuf::internal::GetEmptyString();\n" : "",
+      "_cached_size_ = 0;\n").c_str());
+
+  if (PreserveUnknownFields(descriptor_) &&
+      !UseUnknownFieldSet(descriptor_->file(), options_)) {
+    printer->Print(
+        "_unknown_fields_.UnsafeSetDefault(\n"
+        "    &::google::protobuf::internal::GetEmptyStringAlreadyInited());\n");
+  }
+
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (!descriptor_->field(i)->containing_oneof()) {
+      field_generators_.get(descriptor_->field(i))
+          .GenerateConstructorCode(printer);
+    }
+  }
+
+  if (HasFieldPresence(descriptor_->file())) {
+    printer->Print(
+      "::memset(_has_bits_, 0, sizeof(_has_bits_));\n");
+  }
 
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     printer->Print(
@@ -2196,10 +1984,6 @@
         "oneof_name", descriptor_->oneof_decl(i)->name());
   }
 
-  if (need_to_clear_cached_size) {
-    printer->Print("_cached_size_ = 0;\n");
-  }
-
   printer->Outdent();
   printer->Print("}\n\n");
 }
@@ -2211,14 +1995,35 @@
     "classname", classname_);
   printer->Indent();
   if (SupportsArenas(descriptor_)) {
+    // Do nothing when the message is allocated in an arena.
     printer->Print(
-      "GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);\n");
+      "if (GetArenaNoVirtual() != NULL) {\n"
+      "  return;\n"
+      "}\n"
+      "\n");
   }
+
+  // Write the desctructor for _unknown_fields_ in lite runtime.
+  if (PreserveUnknownFields(descriptor_) &&
+      !UseUnknownFieldSet(descriptor_->file(), options_)) {
+    if (SupportsArenas(descriptor_)) {
+      printer->Print(
+          "_unknown_fields_.Destroy(\n"
+          "    &::google::protobuf::internal::GetEmptyStringAlreadyInited(),\n"
+          "    GetArenaNoVirtual());\n");
+    } else {
+      printer->Print(
+          "_unknown_fields_.DestroyNoArena(\n"
+          "    &::google::protobuf::internal::GetEmptyStringAlreadyInited());\n");
+    }
+  }
+
   // Write the destructors for each field except oneof members.
-  // optimized_order_ does not contain oneof fields.
-  for (int i = 0; i < optimized_order_.size(); i++) {
-    const FieldDescriptor* field = optimized_order_[i];
-    field_generators_.get(field).GenerateDestructorCode(printer);
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (!descriptor_->field(i)->containing_oneof()) {
+      field_generators_.get(descriptor_->field(i))
+                       .GenerateDestructorCode(printer);
+    }
   }
 
   // Generate code to destruct oneofs. Clearing should do the work.
@@ -2230,11 +2035,34 @@
         "oneof_name", descriptor_->oneof_decl(i)->name());
   }
 
-  if (num_weak_fields_) {
-    printer->Print("_weak_field_map_.ClearAll();\n");
+  PrintHandlingOptionalStaticInitializers(
+      descriptor_->file(), options_, printer,
+      // With static initializers.
+      "if (this != default_instance_) {\n",
+      // Without.
+      "if (this != &default_instance()) {\n");
+
+  // We need to delete all embedded messages.
+  // TODO(kenton):  If we make unset messages point at default instances
+  //   instead of NULL, then it would make sense to move this code into
+  //   MessageFieldGenerator::GenerateDestructorCode().
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+
+    if (!field->is_repeated() &&
+        field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+      // Skip oneof members
+      if (!field->containing_oneof()) {
+        printer->Print(
+            "  delete $name$_;\n",
+            "name", FieldName(field));
+      }
+    }
   }
+
   printer->Outdent();
   printer->Print(
+    "  }\n"
     "}\n"
     "\n");
 }
@@ -2259,37 +2087,12 @@
       "classname", classname_);
 
   bool need_registration = false;
-  // Process non-oneof fields first.
-  for (int i = 0; i < optimized_order_.size(); i++) {
-    const FieldDescriptor* field = optimized_order_[i];
-    if (field_generators_.get(field)
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (field_generators_.get(descriptor_->field(i))
                          .GenerateArenaDestructorCode(printer)) {
       need_registration = true;
     }
   }
-
-  // Process oneof fields.
-  //
-  // Note:  As of 10/5/2016, GenerateArenaDestructorCode does not emit anything
-  // and returns false for oneof fields.
-  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
-
-    for (int j = 0; j < oneof->field_count(); j++) {
-      const FieldDescriptor* field = oneof->field(j);
-      if (field_generators_.get(field)
-                           .GenerateArenaDestructorCode(printer)) {
-        need_registration = true;
-      }
-    }
-  }
-  if (num_weak_fields_) {
-    // _this is the object being destructed (we are inside a static method
-    // here).
-    printer->Print("_this->_weak_field_map_.ClearAll();\n");
-    need_registration = true;
-  }
-
   printer->Outdent();
   printer->Print(
       "}\n");
@@ -2310,76 +2113,6 @@
   }
 }
 
-void MessageGenerator::GenerateConstructorBody(io::Printer* printer,
-                                               std::vector<bool> processed,
-                                               bool copy_constructor) const {
-  const FieldDescriptor* last_start = NULL;
-  // RunMap maps from fields that start each run to the number of fields in that
-  // run.  This is optimized for the common case that there are very few runs in
-  // a message and that most of the eligible fields appear together.
-  typedef hash_map<const FieldDescriptor*, size_t> RunMap;
-  RunMap runs;
-
-  for (int i = 0; i < optimized_order_.size(); ++i) {
-    const FieldDescriptor* field = optimized_order_[i];
-    if ((copy_constructor && IsPOD(field)) ||
-        (!copy_constructor && CanConstructByZeroing(field, options_))) {
-      if (last_start == NULL) {
-        last_start = field;
-      }
-
-      runs[last_start]++;
-    } else {
-      last_start = NULL;
-    }
-  }
-
-  string pod_template;
-  if (copy_constructor) {
-    pod_template =
-        "::memcpy(&$first$_, &from.$first$_,\n"
-        "  static_cast<size_t>(reinterpret_cast<char*>(&$last$_) -\n"
-        "  reinterpret_cast<char*>(&$first$_)) + sizeof($last$_));\n";
-  } else {
-    pod_template =
-        "::memset(&$first$_, 0, static_cast<size_t>(\n"
-        "    reinterpret_cast<char*>(&$last$_) -\n"
-        "    reinterpret_cast<char*>(&$first$_)) + sizeof($last$_));\n";
-  }
-
-  for (int i = 0; i < optimized_order_.size(); ++i) {
-    if (processed[i]) {
-      continue;
-    }
-
-    const FieldDescriptor* field = optimized_order_[i];
-    RunMap::const_iterator it = runs.find(field);
-
-    // We only apply the memset technique to runs of more than one field, as
-    // assignment is better than memset for generated code clarity.
-    if (it != runs.end() && it->second > 1) {
-      // Use a memset, then skip run_length fields.
-      const size_t run_length = it->second;
-      const string first_field_name = FieldName(field);
-      const string last_field_name =
-          FieldName(optimized_order_[i + run_length - 1]);
-
-      printer->Print(pod_template.c_str(),
-        "first", first_field_name,
-        "last", last_field_name);
-
-      i += run_length - 1;
-      // ++i at the top of the loop.
-    } else {
-      if (copy_constructor) {
-        field_generators_.get(field).GenerateCopyConstructorCode(printer);
-      } else {
-        field_generators_.get(field).GenerateConstructorCode(printer);
-      }
-    }
-  }
-}
-
 void MessageGenerator::
 GenerateStructors(io::Printer* printer) {
   string superclass;
@@ -2395,62 +2128,105 @@
     initializer_with_arena += ",\n  _extensions_(arena)";
   }
 
-  initializer_with_arena += ",\n  _internal_metadata_(arena)";
+  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+    initializer_with_arena += ",\n  _internal_metadata_(arena)";
+  } else {
+    initializer_with_arena += ",\n  _arena_ptr_(arena)";
+  }
 
   // Initialize member variables with arena constructor.
-  for (int i = 0; i < optimized_order_.size(); i++) {
-    const FieldDescriptor* field = optimized_order_[i];
-
-    bool has_arena_constructor = field->is_repeated();
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    bool has_arena_constructor = descriptor_->field(i)->is_repeated();
     if (has_arena_constructor) {
       initializer_with_arena += string(",\n  ") +
-          FieldName(field) + string("_(arena)");
+          FieldName(descriptor_->field(i)) + string("_(arena)");
     }
   }
 
   if (IsAnyMessage(descriptor_)) {
-    initializer_with_arena += ",\n  _any_metadata_(&type_url_, &value_)";
-  }
-  if (num_weak_fields_ > 0) {
-    initializer_with_arena += ", _weak_field_map_(arena)";
+    initializer_with_arena += ",\n  _any_metadata_(&type_url, &value_)";
   }
 
-  string initializer_null = superclass + "(), _internal_metadata_(NULL)";
+  string initializer_null;
+  initializer_null = (UseUnknownFieldSet(descriptor_->file(), options_) ?
+    ", _internal_metadata_(NULL)" : ", _arena_ptr_(NULL)");
   if (IsAnyMessage(descriptor_)) {
     initializer_null += ", _any_metadata_(&type_url_, &value_)";
   }
-  if (num_weak_fields_ > 0) {
-    initializer_null += ", _weak_field_map_(NULL)";
-  }
 
   printer->Print(
       "$classname$::$classname$()\n"
-      "  : $initializer$ {\n"
-      "  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {\n"
-      "    ::$file_namespace$::InitDefaults$scc_name$();\n"
-      "  }\n"
+      "  : $superclass$()$initializer$ {\n"
       "  SharedCtor();\n"
       "  // @@protoc_insertion_point(constructor:$full_name$)\n"
       "}\n",
-      "classname", classname_, "full_name", descriptor_->full_name(),
-      "scc_name", scc_name_, "initializer", initializer_null, "file_namespace",
-      FileLevelNamespace(descriptor_));
+      "classname", classname_,
+      "superclass", superclass,
+      "full_name", descriptor_->full_name(),
+      "initializer", initializer_null);
 
   if (SupportsArenas(descriptor_)) {
     printer->Print(
+        "\n"
         "$classname$::$classname$(::google::protobuf::Arena* arena)\n"
         "  : $initializer$ {\n"
-        "  ::$file_namespace$::InitDefaults$scc_name$();\n"
         "  SharedCtor();\n"
         "  RegisterArenaDtor(arena);\n"
         "  // @@protoc_insertion_point(arena_constructor:$full_name$)\n"
         "}\n",
-        "initializer", initializer_with_arena, "classname", classname_,
-        "superclass", superclass, "full_name", descriptor_->full_name(),
-        "scc_name", scc_name_, "file_namespace",
-        FileLevelNamespace(descriptor_));
+        "initializer", initializer_with_arena,
+        "classname", classname_,
+        "superclass", superclass,
+        "full_name", descriptor_->full_name());
   }
 
+  printer->Print(
+    "\n"
+    "void $classname$::InitAsDefaultInstance() {\n",
+    "classname", classname_);
+
+  if (!HasFieldPresence(descriptor_->file())) {
+    printer->Print(
+      "  _is_default_instance_ = true;\n");
+  }
+
+  // The default instance needs all of its embedded message pointers
+  // cross-linked to other default instances.  We can't do this initialization
+  // in the constructor because some other default instances may not have been
+  // constructed yet at that time.
+  // TODO(kenton):  Maybe all message fields (even for non-default messages)
+  //   should be initialized to point at default instances rather than NULL?
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+
+    if (!field->is_repeated() &&
+        field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
+        (field->containing_oneof() == NULL ||
+         HasDescriptorMethods(descriptor_->file(), options_))) {
+      string name;
+      if (field->containing_oneof()) {
+        name = classname_ + "_default_oneof_instance_->";
+      }
+      name += FieldName(field);
+      PrintHandlingOptionalStaticInitializers(
+          descriptor_->file(), options_, printer,
+          // With static initializers.
+          "  $name$_ = const_cast< $type$*>(&$type$::default_instance());\n",
+          // Without.
+          "  $name$_ = const_cast< $type$*>(\n"
+          "      $type$::internal_default_instance());\n",
+          // Vars.
+          "name", name, "type", FieldMessageTypeName(field));
+    } else if (field->containing_oneof() &&
+               HasDescriptorMethods(descriptor_->file(), options_)) {
+      field_generators_.get(descriptor_->field(i))
+          .GenerateConstructorCode(printer);
+    }
+  }
+  printer->Print(
+    "}\n"
+    "\n");
+
   // Generate the copy constructor.
   printer->Print(
     "$classname$::$classname$(const $classname$& from)\n"
@@ -2458,104 +2234,24 @@
     "classname", classname_,
     "superclass", superclass,
     "full_name", descriptor_->full_name());
-  printer->Indent();
-  printer->Indent();
-  printer->Indent();
-
-  printer->Print(
-      ",\n_internal_metadata_(NULL)");
-
-  if (HasFieldPresence(descriptor_->file())) {
-      printer->Print(",\n_has_bits_(from._has_bits_)");
+  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+    printer->Print(
+        ",\n    _internal_metadata_(NULL)");
+  } else if (!UseUnknownFieldSet(descriptor_->file(), options_)) {
+    printer->Print(",\n    _arena_ptr_(NULL)");
   }
-
-  bool need_to_emit_cached_size = true;
-  const string cached_size_decl = ",\n_cached_size_(0)";
-  // We reproduce the logic used for laying out _cached_sized_ in the class
-  // definition, as to initialize it in-order.
-  if (HasFieldPresence(descriptor_->file()) &&
-      (HasBitsSize() % 8) != 0) {
-    printer->Print(cached_size_decl.c_str());
-    need_to_emit_cached_size = false;
-  }
-
-  std::vector<bool> processed(optimized_order_.size(), false);
-  for (int i = 0; i < optimized_order_.size(); ++i) {
-    const FieldDescriptor* field = optimized_order_[i];
-
-    if (!(field->is_repeated() && !(field->is_map()))
-        ) {
-      continue;
-    }
-
-    processed[i] = true;
-    printer->Print(",\n$name$_(from.$name$_)",
-                   "name", FieldName(field));
-  }
-
-  if (need_to_emit_cached_size) {
-    printer->Print(cached_size_decl.c_str());
-    need_to_emit_cached_size = false;
-  }
-
   if (IsAnyMessage(descriptor_)) {
-    printer->Print(",\n_any_metadata_(&type_url_, &value_)");
+    printer->Print(",\n    _any_metadata_(&type_url_, &value_)");
   }
-  if (num_weak_fields_ > 0) {
-    printer->Print(",\n_weak_field_map_(from._weak_field_map_)");
-  }
-
-  printer->Outdent();
-  printer->Outdent();
   printer->Print(" {\n");
-
   printer->Print(
-      "_internal_metadata_.MergeFrom(from._internal_metadata_);\n");
-
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print("_extensions_.MergeFrom(from._extensions_);\n");
-  }
-
-  GenerateConstructorBody(printer, processed, true);
-
-  // Copy oneof fields. Oneof field requires oneof case check.
-  for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
-    printer->Print(
-        "clear_has_$oneofname$();\n"
-        "switch (from.$oneofname$_case()) {\n",
-        "oneofname", 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);
-      printer->Print(
-          "case k$field_name$: {\n",
-          "field_name", UnderscoresToCamelCase(field->name(), true));
-      printer->Indent();
-      field_generators_.get(field).GenerateMergingCode(printer);
-      printer->Print(
-          "break;\n");
-      printer->Outdent();
-      printer->Print(
-          "}\n");
-    }
-    printer->Print(
-        "case $cap_oneof_name$_NOT_SET: {\n"
-        "  break;\n"
-        "}\n",
-        "oneof_index",
-        SimpleItoa(descriptor_->oneof_decl(i)->index()),
-        "cap_oneof_name",
-        ToUpper(descriptor_->oneof_decl(i)->name()));
-    printer->Outdent();
-    printer->Print(
-        "}\n");
-  }
-
-  printer->Outdent();
-  printer->Print(
+    "  SharedCtor();\n"
+    "  MergeFrom(from);\n"
     "  // @@protoc_insertion_point(copy_constructor:$full_name$)\n"
     "}\n"
     "\n",
+    "classname", classname_,
+    "superclass", superclass,
     "full_name", descriptor_->full_name());
 
   // Generate the shared constructor code.
@@ -2592,24 +2288,37 @@
   if (HasDescriptorMethods(descriptor_->file(), options_) &&
       !descriptor_->options().no_standard_descriptor_accessor()) {
     printer->Print(
-        "const ::google::protobuf::Descriptor* $classname$::descriptor() {\n"
-        "  ::$file_namespace$::protobuf_AssignDescriptorsOnce();\n"
-        "  return ::"
-        "$file_namespace$::file_level_metadata[kIndexInFileMessages]."
-        "descriptor;\n"
-        "}\n"
-        "\n",
-        "classname", classname_, "file_namespace",
-        FileLevelNamespace(descriptor_));
+      "const ::google::protobuf::Descriptor* $classname$::descriptor() {\n"
+      "  protobuf_AssignDescriptorsOnce();\n"
+      "  return $classname$_descriptor_;\n"
+      "}\n"
+      "\n",
+      "classname", classname_,
+      "adddescriptorsname",
+      GlobalAddDescriptorsName(descriptor_->file()->name()));
   }
 
   printer->Print(
-      "const $classname$& $classname$::default_instance() {\n"
-      "  ::$file_namespace$::InitDefaults$scc_name$();\n"
-      "  return *internal_default_instance();\n"
-      "}\n\n",
-      "classname", classname_, "scc_name", scc_name_, "file_namespace",
-      FileLevelNamespace(descriptor_));
+    "const $classname$& $classname$::default_instance() {\n",
+    "classname", classname_);
+
+  PrintHandlingOptionalStaticInitializers(
+      descriptor_->file(), options_, printer,
+      // With static initializers.
+      "  if (default_instance_ == NULL) $adddescriptorsname$();\n",
+      // Without.
+      "  $adddescriptorsname$();\n",
+      // Vars.
+      "adddescriptorsname",
+      GlobalAddDescriptorsName(descriptor_->file()->name()));
+
+  printer->Print(
+    "  return *default_instance_; /* NOLINT */\n"
+    "}\n"
+    "\n"
+    "$classname$* $classname$::default_instance_ = NULL;\n"
+    "\n",
+    "classname", classname_);
 
   if (SupportsArenas(descriptor_)) {
     printer->Print(
@@ -2628,6 +2337,7 @@
       "}\n",
       "classname", classname_);
   }
+
 }
 
 // Return the number of bits set in n, a non-negative integer.
@@ -2640,248 +2350,167 @@
   return result;
 }
 
-bool MessageGenerator::MaybeGenerateOptionalFieldCondition(
-    io::Printer* printer, const FieldDescriptor* field,
-    int expected_has_bits_index) {
-  int has_bit_index = has_bit_indices_[field->index()];
-  if (!field->options().weak() &&
-      expected_has_bits_index == has_bit_index / 32) {
-    const string mask =
-        StrCat(strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
-    printer->Print(
-        "if (cached_has_bits & 0x$mask$u) {\n",
-        "mask", mask);
-    return true;
-  }
-  return false;
-}
-
 void MessageGenerator::
 GenerateClear(io::Printer* printer) {
-  // Performance tuning parameters
-  const int kMaxUnconditionalPrimitiveBytesClear = 4;
-
   printer->Print(
       "void $classname$::Clear() {\n"
       "// @@protoc_insertion_point(message_clear_start:$full_name$)\n",
       "classname", classname_, "full_name", descriptor_->full_name());
   printer->Indent();
 
-  printer->Print(
-      // TODO(jwb): It would be better to avoid emitting this if it is not used,
-      // rather than emitting a workaround for the resulting warning.
-      "::google::protobuf::uint32 cached_has_bits = 0;\n"
-      "// Prevent compiler warnings about cached_has_bits being unused\n"
-      "(void) cached_has_bits;\n\n");
-
-  int cached_has_bit_index = -1;
-
   // Step 1: Extensions
   if (descriptor_->extension_range_count() > 0) {
     printer->Print("_extensions_.Clear();\n");
   }
 
-  int last_i = -1;
-  int unconditional_budget = kMaxUnconditionalPrimitiveBytesClear;
-  for (int i = 0; i < optimized_order_.size(); i++) {
-    const FieldDescriptor* field = optimized_order_[i];
-
-    if (!CanInitializeByZeroing(field)) {
-      continue;
+  // Step 2: Everything but extensions, repeateds, unions.
+  // These are handled in chunks of 8.  The first chunk is
+  // the non-extensions-non-repeateds-non-unions in
+  //  descriptor_->field(0), descriptor_->field(1), ... descriptor_->field(7),
+  // and the second chunk is the same for
+  //  descriptor_->field(8), descriptor_->field(9), ... descriptor_->field(15),
+  // etc.
+  set<int> step2_indices;
+  hash_map<string, int> fieldname_to_chunk;
+  hash_map<int, string> memsets_for_chunk;
+  hash_map<int, int> memset_field_count_for_chunk;
+  hash_set<string> handled;  // fields that appear anywhere in memsets_for_chunk
+  hash_map<int, uint32> fields_mask_for_chunk;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+    if (!field->is_repeated() && !field->containing_oneof()) {
+      step2_indices.insert(i);
+      int chunk = i / 8;
+      fieldname_to_chunk[FieldName(field)] = chunk;
+      fields_mask_for_chunk[chunk] |= static_cast<uint32>(1) << (i % 32);
     }
-
-    unconditional_budget -= EstimateAlignmentSize(field);
   }
 
-  for (int i = 0; i < optimized_order_.size(); ) {
-    // Detect infinite loops.
-    GOOGLE_CHECK_NE(i, last_i);
-    last_i = i;
-
-    // Step 2: Repeated fields don't use _has_bits_; emit code to clear them
-    // here.
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      const FieldGenerator& generator = field_generators_.get(field);
-
-      if (!field->is_repeated()) {
-        break;
-      }
-
-      generator.GenerateMessageClearingCode(printer);
+  // Step 2a: Greedily seek runs of fields that can be cleared by memset-to-0.
+  // The generated code uses two macros to help it clear runs of fields:
+  // ZR_HELPER_(f1) - ZR_HELPER_(f0) computes the difference, in bytes, of the
+  // positions of two fields in the Message.
+  // ZR_ zeroes a non-empty range of fields via memset.
+  const char* macros =
+      "#if defined(__clang__)\n"
+      "#define ZR_HELPER_(f) \\\n"
+      "  _Pragma(\"clang diagnostic push\") \\\n"
+      "  _Pragma(\"clang diagnostic ignored \\\"-Winvalid-offsetof\\\"\") \\\n"
+      "  __builtin_offsetof($classname$, f) \\\n"
+      "  _Pragma(\"clang diagnostic pop\")\n"
+      "#else\n"
+      "#define ZR_HELPER_(f) reinterpret_cast<char*>(\\\n"
+      "  &reinterpret_cast<$classname$*>(16)->f)\n"
+      "#endif\n\n"
+      "#define ZR_(first, last) do {\\\n"
+      "  ::memset(&(first), 0,\\\n"
+      "           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\\\n"
+      "} while (0)\n\n";
+  for (int i = 0; i < runs_of_fields_.size(); i++) {
+    const vector<string>& run = runs_of_fields_[i];
+    if (run.size() < 2) continue;
+    const string& first_field_name = run[0];
+    const string& last_field_name = run.back();
+    int chunk = fieldname_to_chunk[run[0]];
+    memsets_for_chunk[chunk].append(
+      "ZR_(" + first_field_name + "_, " + last_field_name + "_);\n");
+    for (int j = 0; j < run.size(); j++) {
+      GOOGLE_DCHECK_EQ(chunk, fieldname_to_chunk[run[j]]);
+      handled.insert(run[j]);
     }
-
-    // Step 3: Greedily seek runs of fields that can be cleared by
-    // memset-to-0.
-    int last_chunk = -1;
-    int last_chunk_start = -1;
-    int last_chunk_end = -1;
-    uint32 last_chunk_mask = 0;
-
-    int memset_run_start = -1;
-    int memset_run_end = -1;
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-
-      if (!CanInitializeByZeroing(field)) {
-        break;
-      }
-
-      // "index" defines where in the _has_bits_ the field appears.
-      // "i" is our loop counter within optimized_order_.
-      int index = HasFieldPresence(descriptor_->file()) ?
-          has_bit_indices_[field->index()] : 0;
-      int chunk = index / 8;
-
-      if (last_chunk == -1) {
-        last_chunk = chunk;
-        last_chunk_start = i;
-      } else if (chunk != last_chunk) {
-        // Emit the fields for this chunk so far.
-        break;
-      }
-
-      if (memset_run_start == -1) {
-        memset_run_start = i;
-      }
-
-      memset_run_end = i;
-      last_chunk_end = i;
-      last_chunk_mask |= static_cast<uint32>(1) << (index % 32);
-    }
-
-    if (memset_run_start != memset_run_end && unconditional_budget >= 0) {
-      // Flush the memset fields.
-      goto flush;
-    }
-
-    // Step 4: Non-repeated, non-zero initializable fields.
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      if (field->is_repeated() || CanInitializeByZeroing(field)) {
-        break;
-      }
-
-      // "index" defines where in the _has_bits_ the field appears.
-      // "i" is our loop counter within optimized_order_.
-      int index = HasFieldPresence(descriptor_->file()) ?
-          has_bit_indices_[field->index()] : 0;
-      int chunk = index / 8;
-
-      if (last_chunk == -1) {
-        last_chunk = chunk;
-        last_chunk_start = i;
-      } else if (chunk != last_chunk) {
-        // Emit the fields for this chunk so far.
-        break;
-      }
-
-      last_chunk_end = i;
-      last_chunk_mask |= static_cast<uint32>(1) << (index % 32);
-    }
-
-flush:
-
-    if (last_chunk != -1) {
-      GOOGLE_DCHECK_NE(-1, last_chunk_start);
-      GOOGLE_DCHECK_NE(-1, last_chunk_end);
-      GOOGLE_DCHECK_NE(0, last_chunk_mask);
-
-      const int count = popcnt(last_chunk_mask);
-      const bool have_outer_if = HasFieldPresence(descriptor_->file()) &&
-          (last_chunk_start != last_chunk_end) &&
-          (memset_run_start != last_chunk_start ||
-           memset_run_end != last_chunk_end ||
-           unconditional_budget < 0);
-
-      if (have_outer_if) {
-        // Check (up to) 8 has_bits at a time if we have more than one field in
-        // this chunk.  Due to field layout ordering, we may check
-        // _has_bits_[last_chunk * 8 / 32] multiple times.
-        GOOGLE_DCHECK_LE(2, count);
-        GOOGLE_DCHECK_GE(8, count);
-
-        if (cached_has_bit_index != last_chunk / 4) {
-          cached_has_bit_index = last_chunk / 4;
-          printer->Print(
-              "cached_has_bits = _has_bits_[$idx$];\n",
-              "idx", SimpleItoa(cached_has_bit_index));
-        }
-        printer->Print(
-          "if (cached_has_bits & $mask$u) {\n",
-          "mask", SimpleItoa(last_chunk_mask));
-        printer->Indent();
-      }
-
-      if (memset_run_start != -1) {
-        if (memset_run_start == memset_run_end) {
-          // For clarity, do not memset a single field.
-          const FieldGenerator& generator =
-              field_generators_.get(optimized_order_[memset_run_start]);
-          generator.GenerateMessageClearingCode(printer);
-        } else {
-          const string first_field_name =
-              FieldName(optimized_order_[memset_run_start]);
-          const string last_field_name =
-              FieldName(optimized_order_[memset_run_end]);
-
-          printer->Print(
-            "::memset(&$first$_, 0, static_cast<size_t>(\n"
-            "    reinterpret_cast<char*>(&$last$_) -\n"
-            "    reinterpret_cast<char*>(&$first$_)) + sizeof($last$_));\n",
-            "first", first_field_name,
-            "last", last_field_name);
-        }
-
-        // Advance last_chunk_start to skip over the fields we zeroed/memset.
-        last_chunk_start = memset_run_end + 1;
-      }
-
-      // Go back and emit clears for each of the fields we processed.
-      for (int j = last_chunk_start; j <= last_chunk_end; j++) {
-        const FieldDescriptor* field = optimized_order_[j];
-        const string fieldname = FieldName(field);
-        const FieldGenerator& generator = field_generators_.get(field);
-
-        // It's faster to just overwrite primitive types, but we should only
-        // clear strings and messages if they were set.
-        //
-        // TODO(kenton):  Let the CppFieldGenerator decide this somehow.
-        bool should_check_bit =
-          field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||
-          field->cpp_type() == FieldDescriptor::CPPTYPE_STRING;
-
-        bool have_enclosing_if = false;
-        if (should_check_bit &&
-            // If no field presence, then always clear strings/messages as well.
-            HasFieldPresence(descriptor_->file())) {
-          if (!field->options().weak() &&
-              cached_has_bit_index != (has_bit_indices_[field->index()] / 32)) {
-            cached_has_bit_index = (has_bit_indices_[field->index()] / 32);
-            printer->Print("cached_has_bits = _has_bits_[$new_index$];\n",
-                           "new_index", SimpleItoa(cached_has_bit_index));
-          }
-          if (!MaybeGenerateOptionalFieldCondition(printer, field,
-                                                   cached_has_bit_index)) {
-            printer->Print(
-                "if (has_$name$()) {\n",
-                "name", fieldname);
-          }
-          printer->Indent();
-          have_enclosing_if = true;
-        }
-
-        generator.GenerateMessageClearingCode(printer);
-
-        if (have_enclosing_if) {
-          printer->Outdent();
-          printer->Print("}\n");
-        }
-      }
-
-      if (have_outer_if) {
+    memset_field_count_for_chunk[chunk] += run.size();
+  }
+  const bool macros_are_needed = handled.size() > 0;
+  if (macros_are_needed) {
+    printer->Outdent();
+    printer->Print(macros,
+                   "classname", classname_);
+    printer->Indent();
+  }
+  // Step 2b: Finish step 2, ignoring fields handled in step 2a.
+  int last_index = -1;
+  bool chunk_block_in_progress = false;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (step2_indices.count(i) == 0) continue;
+    const FieldDescriptor* field = descriptor_->field(i);
+    const string fieldname = FieldName(field);
+    if (i / 8 != last_index / 8 || last_index < 0) {
+      // End previous chunk, if there was one.
+      if (chunk_block_in_progress) {
         printer->Outdent();
         printer->Print("}\n");
+        chunk_block_in_progress = false;
+      }
+      // Start chunk.
+      const string& memsets = memsets_for_chunk[i / 8];
+      uint32 mask = fields_mask_for_chunk[i / 8];
+      int count = popcnt(mask);
+      GOOGLE_DCHECK_GE(count, 1);
+      if (count == 1 ||
+          (count <= 4 && count == memset_field_count_for_chunk[i / 8])) {
+        // No "if" here because the chunk is trivial.
+      } else {
+        if (HasFieldPresence(descriptor_->file())) {
+          printer->Print(
+            "if (_has_bits_[$index$ / 32] & $mask$u) {\n",
+            "index", SimpleItoa(i / 8 * 8),
+            "mask", SimpleItoa(mask));
+          printer->Indent();
+          chunk_block_in_progress = true;
+        }
+      }
+      printer->Print(memsets.c_str());
+    }
+    last_index = i;
+    if (handled.count(fieldname) > 0) continue;
+
+    // It's faster to just overwrite primitive types, but we should
+    // only clear strings and messages if they were set.
+    // TODO(kenton):  Let the CppFieldGenerator decide this somehow.
+    bool should_check_bit =
+      field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||
+      field->cpp_type() == FieldDescriptor::CPPTYPE_STRING;
+
+    bool have_enclosing_if = false;
+    if (should_check_bit &&
+        // If no field presence, then always clear strings/messages as well.
+        HasFieldPresence(descriptor_->file())) {
+      printer->Print("if (has_$name$()) {\n", "name", fieldname);
+      printer->Indent();
+      have_enclosing_if = true;
+    }
+
+    if (use_dependent_base_ && IsFieldDependent(field)) {
+      printer->Print("clear_$name$();\n", "name", fieldname);
+    } else {
+      field_generators_.get(field).GenerateClearingCode(printer);
+    }
+
+    if (have_enclosing_if) {
+      printer->Outdent();
+      printer->Print("}\n");
+    }
+  }
+
+  if (chunk_block_in_progress) {
+    printer->Outdent();
+    printer->Print("}\n");
+  }
+  if (macros_are_needed) {
+    printer->Outdent();
+    printer->Print("\n#undef ZR_HELPER_\n#undef ZR_\n\n");
+    printer->Indent();
+  }
+
+  // Step 3: Repeated fields don't use _has_bits_; emit code to clear them here.
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+
+    if (field->is_repeated()) {
+      if (use_dependent_base_ && IsFieldDependent(field)) {
+        printer->Print("clear_$name$();\n", "name", FieldName(field));
+      } else {
+        field_generators_.get(field).GenerateClearingCode(printer);
       }
     }
   }
@@ -2893,16 +2522,31 @@
         "oneof_name", descriptor_->oneof_decl(i)->name());
   }
 
-  if (num_weak_fields_) {
-    printer->Print("_weak_field_map_.ClearAll();\n");
-  }
-
   if (HasFieldPresence(descriptor_->file())) {
     // Step 5: Everything else.
-    printer->Print("_has_bits_.Clear();\n");
+    printer->Print(
+      "::memset(_has_bits_, 0, sizeof(_has_bits_));\n");
   }
 
-  printer->Print("_internal_metadata_.Clear();\n");
+  if (PreserveUnknownFields(descriptor_)) {
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print(
+        "if (_internal_metadata_.have_unknown_fields()) {\n"
+        "  mutable_unknown_fields()->Clear();\n"
+        "}\n");
+    } else {
+      if (SupportsArenas(descriptor_)) {
+        printer->Print(
+          "_unknown_fields_.ClearToEmpty(\n"
+          "    &::google::protobuf::internal::GetEmptyStringAlreadyInited(),\n"
+          "    GetArenaNoVirtual());\n");
+      } else {
+        printer->Print(
+          "_unknown_fields_.ClearToEmptyNoArena(\n"
+          "    &::google::protobuf::internal::GetEmptyStringAlreadyInited());\n");
+      }
+    }
+  }
 
   printer->Outdent();
   printer->Print("}\n");
@@ -2912,7 +2556,7 @@
 GenerateOneofClear(io::Printer* printer) {
   // Generated function clears the active field and union case (e.g. foo_case_).
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    std::map<string, string> oneof_vars;
+    map<string, string> oneof_vars;
     oneof_vars["classname"] = classname_;
     oneof_vars["oneofname"] = descriptor_->oneof_decl(i)->name();
     oneof_vars["full_name"] = descriptor_->full_name();
@@ -2924,7 +2568,7 @@
                    "$full_name$)\n");
     printer->Indent();
     printer->Print(oneof_vars,
-        "switch ($oneofname$_case()) {\n");
+        "switch($oneofname$_case()) {\n");
     printer->Indent();
     for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
       const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
@@ -2978,13 +2622,10 @@
         "  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {\n"
         "    InternalSwap(other);\n"
         "  } else {\n"
-        "    $classname$* temp = New(GetArenaNoVirtual());\n"
-        "    temp->MergeFrom(*other);\n"
-        "    other->CopyFrom(*this);\n"
-        "    InternalSwap(temp);\n"
-        "    if (GetArenaNoVirtual() == NULL) {\n"
-        "      delete temp;\n"
-        "    }\n"
+        "    $classname$ temp;\n"
+        "    temp.MergeFrom(*this);\n"
+        "    CopyFrom(*other);\n"
+        "    other->CopyFrom(temp);\n"
         "  }\n"
         "}\n"
         "void $classname$::UnsafeArenaSwap($classname$* other) {\n"
@@ -3006,41 +2647,41 @@
   printer->Print("void $classname$::InternalSwap($classname$* other) {\n",
                  "classname", classname_);
   printer->Indent();
-  printer->Print("using std::swap;\n");
 
   if (HasGeneratedMethods(descriptor_->file(), options_)) {
-    for (int i = 0; i < optimized_order_.size(); i++) {
-      // optimized_order_ does not contain oneof fields, but the field
-      // generators for these fields do not emit swapping code on their own.
-      const FieldDescriptor* field = optimized_order_[i];
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = descriptor_->field(i);
       field_generators_.get(field).GenerateSwappingCode(printer);
     }
 
     for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
       printer->Print(
-        "swap($oneof_name$_, other->$oneof_name$_);\n"
-        "swap(_oneof_case_[$i$], other->_oneof_case_[$i$]);\n",
+        "std::swap($oneof_name$_, other->$oneof_name$_);\n"
+        "std::swap(_oneof_case_[$i$], other->_oneof_case_[$i$]);\n",
         "oneof_name", descriptor_->oneof_decl(i)->name(),
         "i", SimpleItoa(i));
     }
 
     if (HasFieldPresence(descriptor_->file())) {
-      for (int i = 0; i < HasBitsSize() / 4; ++i) {
-        printer->Print("swap(_has_bits_[$i$], other->_has_bits_[$i$]);\n",
+      for (int i = 0; i < (descriptor_->field_count() + 31) / 32; ++i) {
+        printer->Print("std::swap(_has_bits_[$i$], other->_has_bits_[$i$]);\n",
                        "i", SimpleItoa(i));
       }
     }
 
-    printer->Print("_internal_metadata_.Swap(&other->_internal_metadata_);\n");
+    // Ignore PreserveUnknownFields here - always swap internal_metadata as it
+    // may contain more than just unknown fields.
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print(
+          "_internal_metadata_.Swap(&other->_internal_metadata_);\n");
+    } else {
+      printer->Print("_unknown_fields_.Swap(&other->_unknown_fields_);\n");
+    }
 
-    printer->Print("swap(_cached_size_, other->_cached_size_);\n");
+    printer->Print("std::swap(_cached_size_, other->_cached_size_);\n");
     if (descriptor_->extension_range_count() > 0) {
       printer->Print("_extensions_.Swap(&other->_extensions_);\n");
     }
-    if (num_weak_fields_) {
-      printer->Print(
-          "_weak_field_map_.UnsafeArenaSwap(&other->_weak_field_map_);\n");
-    }
   } else {
     printer->Print("GetReflection()->Swap(this, other);");
   }
@@ -3058,7 +2699,7 @@
         "void $classname$::MergeFrom(const ::google::protobuf::Message& from) {\n"
         "// @@protoc_insertion_point(generalized_merge_from_start:"
         "$full_name$)\n"
-        "  GOOGLE_DCHECK_NE(&from, this);\n",
+        "  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);\n",
         "classname", classname_, "full_name", descriptor_->full_name());
     printer->Indent();
 
@@ -3067,7 +2708,7 @@
     // system, as the GOOGLE_CHECK above ensured that we have the same descriptor
     // for each message.
     printer->Print(
-      "const $classname$* source =\n"
+      "const $classname$* source = \n"
       "    ::google::protobuf::internal::DynamicCastToGenerated<const $classname$>(\n"
       "        &from);\n"
       "if (source == NULL) {\n"
@@ -3099,163 +2740,17 @@
       "void $classname$::MergeFrom(const $classname$& from) {\n"
       "// @@protoc_insertion_point(class_specific_merge_from_start:"
       "$full_name$)\n"
-      "  GOOGLE_DCHECK_NE(&from, this);\n",
+      "  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);\n",
       "classname", classname_, "full_name", descriptor_->full_name());
   printer->Indent();
 
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print("_extensions_.MergeFrom(from._extensions_);\n");
-  }
+  // Merge Repeated fields. These fields do not require a
+  // check as we can simply iterate over them.
+  for (int i = 0; i < descriptor_->field_count(); ++i) {
+    const FieldDescriptor* field = descriptor_->field(i);
 
-  printer->Print(
-    "_internal_metadata_.MergeFrom(from._internal_metadata_);\n"
-    "::google::protobuf::uint32 cached_has_bits = 0;\n"
-    "(void) cached_has_bits;\n\n");
-
-  // cached_has_bit_index maintains that:
-  //   cached_has_bits = from._has_bits_[cached_has_bit_index]
-  // for cached_has_bit_index >= 0
-  int cached_has_bit_index = -1;
-
-  int last_i = -1;
-  for (int i = 0; i < optimized_order_.size(); ) {
-    // Detect infinite loops.
-    GOOGLE_CHECK_NE(i, last_i);
-    last_i = i;
-
-    // Merge Repeated fields. These fields do not require a
-    // check as we can simply iterate over them.
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      if (!field->is_repeated()) {
-        break;
-      }
-
-      const FieldGenerator& generator = field_generators_.get(field);
-      generator.GenerateMergingCode(printer);
-    }
-
-    // Merge Optional and Required fields (after a _has_bit_ check).
-    int last_chunk = -1;
-    int last_chunk_start = -1;
-    int last_chunk_end = -1;
-    uint32 last_chunk_mask = 0;
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      if (field->is_repeated()) {
-        break;
-      }
-
-      // "index" defines where in the _has_bits_ the field appears.
-      // "i" is our loop counter within optimized_order_.
-      int index = HasFieldPresence(descriptor_->file()) ?
-          has_bit_indices_[field->index()] : 0;
-      int chunk = index / 8;
-
-      if (last_chunk == -1) {
-        last_chunk = chunk;
-        last_chunk_start = i;
-      } else if (chunk != last_chunk) {
-        // Emit the fields for this chunk so far.
-        break;
-      }
-
-      last_chunk_end = i;
-      last_chunk_mask |= static_cast<uint32>(1) << (index % 32);
-    }
-
-    if (last_chunk != -1) {
-      GOOGLE_DCHECK_NE(-1, last_chunk_start);
-      GOOGLE_DCHECK_NE(-1, last_chunk_end);
-      GOOGLE_DCHECK_NE(0, last_chunk_mask);
-
-      const int count = popcnt(last_chunk_mask);
-      const bool have_outer_if = HasFieldPresence(descriptor_->file()) &&
-          (last_chunk_start != last_chunk_end);
-
-      if (have_outer_if) {
-        // Check (up to) 8 has_bits at a time if we have more than one field in
-        // this chunk.  Due to field layout ordering, we may check
-        // _has_bits_[last_chunk * 8 / 32] multiple times.
-        GOOGLE_DCHECK_LE(2, count);
-        GOOGLE_DCHECK_GE(8, count);
-
-        if (cached_has_bit_index != last_chunk / 4) {
-          int new_index = last_chunk / 4;
-          printer->Print("cached_has_bits = from._has_bits_[$new_index$];\n",
-                         "new_index", SimpleItoa(new_index));
-          cached_has_bit_index = new_index;
-        }
-
-        printer->Print(
-          "if (cached_has_bits & $mask$u) {\n",
-          "mask", SimpleItoa(last_chunk_mask));
-        printer->Indent();
-      }
-
-      // Go back and emit clears for each of the fields we processed.
-      bool deferred_has_bit_changes = false;
-      for (int j = last_chunk_start; j <= last_chunk_end; j++) {
-        const FieldDescriptor* field = optimized_order_[j];
-        const FieldGenerator& generator = field_generators_.get(field);
-
-        bool have_enclosing_if = false;
-        if (HasFieldPresence(descriptor_->file())) {
-          // Attempt to use the state of cached_has_bits, if possible.
-          int has_bit_index = has_bit_indices_[field->index()];
-          if (!field->options().weak() &&
-              cached_has_bit_index == has_bit_index / 32) {
-            const string mask = StrCat(
-                strings::Hex(1u << (has_bit_index % 32),
-                strings::ZERO_PAD_8));
-
-            printer->Print(
-                "if (cached_has_bits & 0x$mask$u) {\n", "mask", mask);
-          } else {
-            printer->Print(
-              "if (from.has_$name$()) {\n",
-              "name", FieldName(field));
-          }
-
-          printer->Indent();
-          have_enclosing_if = true;
-        } else {
-          // Merge semantics without true field presence: primitive fields are
-          // merged only if non-zero (numeric) or non-empty (string).
-          have_enclosing_if = EmitFieldNonDefaultCondition(
-              printer, "from.", field);
-        }
-
-        if (have_outer_if && IsPOD(field)) {
-          // GenerateCopyConstructorCode for enum and primitive scalar fields
-          // does not do _has_bits_ modifications.  We defer _has_bits_
-          // manipulation until the end of the outer if.
-          //
-          // This can reduce the number of loads/stores by up to 7 per 8 fields.
-          deferred_has_bit_changes = true;
-          generator.GenerateCopyConstructorCode(printer);
-        } else {
-          generator.GenerateMergingCode(printer);
-        }
-
-        if (have_enclosing_if) {
-          printer->Outdent();
-          printer->Print("}\n");
-        }
-      }
-
-      if (have_outer_if) {
-        if (deferred_has_bit_changes) {
-          // Flush the has bits for the primitives we deferred.
-          GOOGLE_CHECK_LE(0, cached_has_bit_index);
-          printer->Print(
-              "_has_bits_[$index$] |= cached_has_bits;\n",
-              "index", SimpleItoa(cached_has_bit_index));
-        }
-
-        printer->Outdent();
-        printer->Print("}\n");
-      }
+    if (field->is_repeated()) {
+      field_generators_.get(field).GenerateMergingCode(printer);
     }
   }
 
@@ -3288,8 +2783,76 @@
     printer->Print(
         "}\n");
   }
-  if (num_weak_fields_) {
-    printer->Print("_weak_field_map_.MergeFrom(from._weak_field_map_);\n");
+
+  // Merge Optional and Required fields (after a _has_bit check).
+  int last_index = -1;
+
+  for (int i = 0; i < descriptor_->field_count(); ++i) {
+    const FieldDescriptor* field = descriptor_->field(i);
+
+    if (!field->is_repeated() && !field->containing_oneof()) {
+      if (HasFieldPresence(descriptor_->file())) {
+        // See above in GenerateClear for an explanation of this.
+        if (i / 8 != last_index / 8 || last_index < 0) {
+          if (last_index >= 0) {
+            printer->Outdent();
+            printer->Print("}\n");
+          }
+          printer->Print(
+            "if (from._has_bits_[$index$ / 32] & "
+            "(0xffu << ($index$ % 32))) {\n",
+            "index", SimpleItoa(field->index()));
+          printer->Indent();
+        }
+      }
+
+      last_index = i;
+
+      bool have_enclosing_if = false;
+      if (HasFieldPresence(descriptor_->file())) {
+        printer->Print(
+          "if (from.has_$name$()) {\n",
+          "name", FieldName(field));
+        printer->Indent();
+        have_enclosing_if = true;
+      } else {
+        // Merge semantics without true field presence: primitive fields are
+        // merged only if non-zero (numeric) or non-empty (string).
+        have_enclosing_if = EmitFieldNonDefaultCondition(
+            printer, "from.", field);
+      }
+
+      field_generators_.get(field).GenerateMergingCode(printer);
+
+      if (have_enclosing_if) {
+        printer->Outdent();
+        printer->Print("}\n");
+      }
+    }
+  }
+
+  if (HasFieldPresence(descriptor_->file()) &&
+      last_index >= 0) {
+    printer->Outdent();
+    printer->Print("}\n");
+  }
+
+  if (descriptor_->extension_range_count() > 0) {
+    printer->Print("_extensions_.MergeFrom(from._extensions_);\n");
+  }
+
+  if (PreserveUnknownFields(descriptor_)) {
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print(
+        "if (from._internal_metadata_.have_unknown_fields()) {\n"
+        "  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n"
+        "}\n");
+    } else {
+      printer->Print(
+        "if (!from.unknown_fields().empty()) {\n"
+        "  mutable_unknown_fields()->append(from.unknown_fields());\n"
+        "}\n");
+    }
   }
 
   printer->Outdent();
@@ -3336,62 +2899,48 @@
 
 void MessageGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) {
-  std::map<string, string> vars;
-  SetUnknkownFieldsVariable(descriptor_, options_, &vars);
   if (descriptor_->options().message_set_wire_format()) {
     // Special-case MessageSet.
-    vars["classname"] = classname_;
-    printer->Print(vars,
+    printer->Print(
       "bool $classname$::MergePartialFromCodedStream(\n"
-      "    ::google::protobuf::io::CodedInputStream* input) {\n"
-      "  return _extensions_.ParseMessageSet(input,\n"
-      "      internal_default_instance(), $mutable_unknown_fields$);\n"
+      "    ::google::protobuf::io::CodedInputStream* input) {\n",
+      "classname", classname_);
+
+    PrintHandlingOptionalStaticInitializers(
+        descriptor_->file(), options_, printer,
+        // With static initializers.
+        "  return _extensions_.ParseMessageSet(input, default_instance_,\n"
+        "                                      mutable_unknown_fields());\n",
+        // Without.
+        "  return _extensions_.ParseMessageSet(input, &default_instance(),\n"
+        "                                      mutable_unknown_fields());\n",
+        // Vars.
+        "classname", classname_);
+
+    printer->Print(
       "}\n");
     return;
   }
 
-  std::vector<const FieldDescriptor*> ordered_fields =
-      SortFieldsByNumber(descriptor_);
-
   printer->Print(
     "bool $classname$::MergePartialFromCodedStream(\n"
-    "    ::google::protobuf::io::CodedInputStream* input) {\n",
+    "    ::google::protobuf::io::CodedInputStream* input) {\n"
+    "#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure\n"
+    "  ::google::protobuf::uint32 tag;\n",
     "classname", classname_);
 
-  if (table_driven_) {
-    printer->Indent();
-
-    const string lite = UseUnknownFieldSet(descriptor_->file(), options_) ?
-        "" : "Lite";
-
+  if (PreserveUnknownFields(descriptor_) &&
+      !UseUnknownFieldSet(descriptor_->file(), options_)) {
+    // Use LazyStringOutputString to avoid initializing unknown fields string
+    // unless it is actually needed. For the same reason, disable eager refresh
+    // on the CodedOutputStream.
     printer->Print(
-        "return ::google::protobuf::internal::MergePartialFromCodedStream$lite$(\n"
-        "    this,\n"
-        "    ::$file_namespace$::TableStruct::schema[\n"
-        "      $classname$::kIndexInFileMessages],\n"
-        "    input);\n",
-        "classname", classname_, "file_namespace",
-        FileLevelNamespace(descriptor_), "lite", lite);
-
-    printer->Outdent();
-
-    printer->Print("}\n");
-    return;
-  }
-
-  printer->Print(
-    "#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure\n"
-    "  ::google::protobuf::uint32 tag;\n");
-
-  if (!UseUnknownFieldSet(descriptor_->file(), options_)) {
-    printer->Print(
-        "  ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter(\n"
-        "      &_internal_metadata_);\n"
-        "  ::google::protobuf::io::StringOutputStream unknown_fields_output(\n"
-        "      unknown_fields_setter.buffer());\n"
-        "  ::google::protobuf::io::CodedOutputStream unknown_fields_stream(\n"
-        "      &unknown_fields_output, false);\n",
-        "classname", classname_);
+      "  ::google::protobuf::io::LazyStringOutputStream unknown_fields_string(\n"
+      "      ::google::protobuf::internal::NewPermanentCallback(\n"
+      "          &MutableUnknownFieldsFor$classname$, this));\n"
+      "  ::google::protobuf::io::CodedOutputStream unknown_fields_stream(\n"
+      "      &unknown_fields_string, false);\n",
+      "classname", classname_);
   }
 
   printer->Print(
@@ -3402,44 +2951,19 @@
   printer->Print("for (;;) {\n");
   printer->Indent();
 
+  google::protobuf::scoped_array<const FieldDescriptor * > ordered_fields(
+      SortFieldsByNumber(descriptor_));
   uint32 maxtag = descriptor_->field_count() == 0 ? 0 :
       WireFormat::MakeTag(ordered_fields[descriptor_->field_count() - 1]);
   const int kCutoff0 = 127;               // fits in 1-byte varint
   const int kCutoff1 = (127 << 7) + 127;  // fits in 2-byte varint
-
-  // We need to capture the last tag when parsing if this is a Group type, as
-  // our caller will verify (via CodedInputStream::LastTagWas) that the correct
-  // closing tag was received.
-  bool capture_last_tag = false;
-  const Descriptor* parent = descriptor_->containing_type();
-  if (parent) {
-    for (int i = 0; i < parent->field_count(); i++) {
-      const FieldDescriptor* field = parent->field(i);
-      if (field->type() == FieldDescriptor::TYPE_GROUP &&
-          field->message_type() == descriptor_) {
-        capture_last_tag = true;
-        break;
-      }
-    }
-  }
-
-  for (int i = 0; i < descriptor_->file()->extension_count(); i++) {
-    const FieldDescriptor* field = descriptor_->file()->extension(i);
-    if (field->type() == FieldDescriptor::TYPE_GROUP &&
-        field->message_type() == descriptor_) {
-      capture_last_tag = true;
-      break;
-    }
-  }
-
   printer->Print("::std::pair< ::google::protobuf::uint32, bool> p = "
-                 "input->ReadTagWithCutoffNoLastTag($max$u);\n"
+                 "input->ReadTagWithCutoff($max$);\n"
                  "tag = p.first;\n"
                  "if (!p.second) goto handle_unusual;\n",
                  "max", SimpleItoa(maxtag <= kCutoff0 ? kCutoff0 :
                                    (maxtag <= kCutoff1 ? kCutoff1 :
                                     maxtag)));
-
   if (descriptor_->field_count() > 0) {
     // We don't even want to print the switch() if we have no fields because
     // MSVC dislikes switch() statements that contain only a default value.
@@ -3449,20 +2973,29 @@
     // of each case.  However, this is actually a bit slower in practice as it
     // creates a jump table that is 8x larger and sparser, and meanwhile the
     // if()s are highly predictable.
-    //
-    // Historically, we inserted checks to peek at the next tag on the wire and
-    // jump directly to the next case statement.  While this avoids the jump
-    // table that the switch uses, it greatly increases code size (20-60%) and
-    // inserts branches that may fail (especially for real world protos that
-    // interleave--in field number order--hot and cold fields).  Loadtests
-    // confirmed that removing this optimization is performance neutral.
     printer->Print("switch (::google::protobuf::internal::WireFormatLite::"
                    "GetTagFieldNumber(tag)) {\n");
 
     printer->Indent();
 
-    for (int i = 0; i < ordered_fields.size(); i++) {
+    // Find repeated messages and groups now, to simplify what follows.
+    hash_set<int> fields_with_parse_loop;
+    for (int i = 0; i < descriptor_->field_count(); i++) {
       const FieldDescriptor* field = ordered_fields[i];
+      if (field->is_repeated() &&
+          (field->type() == FieldDescriptor::TYPE_MESSAGE ||
+           field->type() == FieldDescriptor::TYPE_GROUP)) {
+        fields_with_parse_loop.insert(i);
+      }
+    }
+
+    // need_label is true if we generated "goto parse_$name$" while handling the
+    // previous field.
+    bool need_label = false;
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = ordered_fields[i];
+      const bool loops = fields_with_parse_loop.count(i) > 0;
+      const bool next_field_loops = fields_with_parse_loop.count(i + 1) > 0;
 
       PrintFieldComment(printer, field);
 
@@ -3473,11 +3006,21 @@
       const FieldGenerator& field_generator = field_generators_.get(field);
 
       // Emit code to parse the common, expected case.
-      printer->Print(
-        "if (static_cast< ::google::protobuf::uint8>(tag) ==\n"
-        "    static_cast< ::google::protobuf::uint8>($truncated$u /* $full$ & 0xFF */)) {\n",
-        "truncated", SimpleItoa(WireFormat::MakeTag(field) & 0xFF),
-        "full", SimpleItoa(WireFormat::MakeTag(field)));
+      printer->Print("if (tag == $commontag$) {\n",
+                     "commontag", SimpleItoa(WireFormat::MakeTag(field)));
+
+      if (need_label ||
+          (field->is_repeated() && !field->is_packed() && !loops)) {
+        printer->Print(
+            " parse_$name$:\n",
+            "name", field->name());
+      }
+      if (loops) {
+        printer->Print(
+          "  DO_(input->IncrementRecursionDepth());\n"
+          " parse_loop_$name$:\n",
+          "name", field->name());
+      }
 
       printer->Indent();
       if (field->is_packed()) {
@@ -3491,30 +3034,20 @@
       if (field->is_packed()) {
         internal::WireFormatLite::WireType wiretype =
             WireFormat::WireTypeForFieldType(field->type());
-        const uint32 tag = internal::WireFormatLite::MakeTag(
-            field->number(), wiretype);
-        printer->Print(
-            "} else if (\n"
-            "    static_cast< ::google::protobuf::uint8>(tag) ==\n"
-            "    static_cast< ::google::protobuf::uint8>($truncated$u /* $full$ & 0xFF */)) {\n",
-            "truncated", SimpleItoa(tag & 0xFF),
-            "full", SimpleItoa(tag));
-
+        printer->Print("} else if (tag == $uncommontag$) {\n",
+                       "uncommontag", SimpleItoa(
+                           internal::WireFormatLite::MakeTag(
+                               field->number(), wiretype)));
         printer->Indent();
         field_generator.GenerateMergeFromCodedStream(printer);
         printer->Outdent();
       } else if (field->is_packable() && !field->is_packed()) {
         internal::WireFormatLite::WireType wiretype =
             internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
-         const uint32 tag = internal::WireFormatLite::MakeTag(
-            field->number(), wiretype);
-
-        printer->Print(
-            "} else if (\n"
-            "    static_cast< ::google::protobuf::uint8>(tag) ==\n"
-            "    static_cast< ::google::protobuf::uint8>($truncated$u /* $full$ & 0xFF */)) {\n",
-            "truncated", SimpleItoa(tag & 0xFF),
-            "full", SimpleItoa(tag));
+        printer->Print("} else if (tag == $uncommontag$) {\n",
+                       "uncommontag", SimpleItoa(
+                           internal::WireFormatLite::MakeTag(
+                               field->number(), wiretype)));
         printer->Indent();
         field_generator.GenerateMergeFromCodedStreamWithPacking(printer);
         printer->Outdent();
@@ -3525,6 +3058,57 @@
         "  goto handle_unusual;\n"
         "}\n");
 
+      // switch() is slow since it can't be predicted well.  Insert some if()s
+      // here that attempt to predict the next tag.
+      // For non-packed repeated fields, expect the same tag again.
+      if (loops) {
+        printer->Print(
+          "if (input->ExpectTag($tag$)) goto parse_loop_$name$;\n",
+          "tag", SimpleItoa(WireFormat::MakeTag(field)),
+          "name", field->name());
+      } else if (field->is_repeated() && !field->is_packed()) {
+        printer->Print(
+          "if (input->ExpectTag($tag$)) goto parse_$name$;\n",
+          "tag", SimpleItoa(WireFormat::MakeTag(field)),
+          "name", field->name());
+      }
+
+      // Have we emitted "if (input->ExpectTag($next_tag$)) ..." yet?
+      bool emitted_goto_next_tag = false;
+
+      // For repeated messages/groups, we need to decrement recursion depth,
+      // unless the next tag is also for a repeated message/group.
+      if (loops) {
+        if (next_field_loops) {
+          const FieldDescriptor* next_field = ordered_fields[i + 1];
+          printer->Print(
+            "if (input->ExpectTag($next_tag$)) goto parse_loop_$next_name$;\n",
+            "next_tag", SimpleItoa(WireFormat::MakeTag(next_field)),
+            "next_name", next_field->name());
+          emitted_goto_next_tag = true;
+        }
+        printer->Print(
+          "input->UnsafeDecrementRecursionDepth();\n");
+      }
+
+      // If there are more fields, expect the next one.
+      need_label = false;
+      if (!emitted_goto_next_tag) {
+        if (i + 1 == descriptor_->field_count()) {
+          // Expect EOF.
+          // TODO(kenton):  Expect group end-tag?
+          printer->Print(
+            "if (input->ExpectAtEnd()) goto success;\n");
+        } else {
+          const FieldDescriptor* next_field = ordered_fields[i + 1];
+          printer->Print(
+            "if (input->ExpectTag($next_tag$)) goto parse_$next_name$;\n",
+            "next_tag", SimpleItoa(WireFormat::MakeTag(next_field)),
+            "next_name", next_field->name());
+          need_label = true;
+        }
+      }
+
       printer->Print(
         "break;\n");
 
@@ -3540,20 +3124,12 @@
   printer->Print("handle_unusual:\n");
   printer->Indent();
   // If tag is 0 or an end-group tag then this must be the end of the message.
-  if (capture_last_tag) {
-    printer->Print(
-      "if (tag == 0 ||\n"
-      "    ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n"
-      "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n"
-      "  input->SetLastTag(tag);\n"
-      "  goto success;\n"
-      "}\n");
-  } else {
-    printer->Print(
-      "if (tag == 0) {\n"
-      "  goto success;\n"
-      "}\n");
-  }
+  printer->Print(
+    "if (tag == 0 ||\n"
+    "    ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n"
+    "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n"
+    "  goto success;\n"
+    "}\n");
 
   // Handle extension ranges.
   if (descriptor_->extension_range_count() > 0) {
@@ -3581,16 +3157,33 @@
       }
     }
     printer->Print(") {\n");
-    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
-      printer->Print(vars,
-        "  DO_(_extensions_.ParseField(tag, input,\n"
-        "      internal_default_instance(),\n"
-        "      $mutable_unknown_fields$));\n");
+    if (PreserveUnknownFields(descriptor_)) {
+      if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+        PrintHandlingOptionalStaticInitializers(
+            descriptor_->file(), options_, printer,
+            // With static initializers.
+            "  DO_(_extensions_.ParseField(tag, input, default_instance_,\n"
+            "                              mutable_unknown_fields()));\n",
+            // Without.
+            "  DO_(_extensions_.ParseField(tag, input, &default_instance(),\n"
+            "                              mutable_unknown_fields()));\n");
+      } else {
+        PrintHandlingOptionalStaticInitializers(
+            descriptor_->file(), options_, printer,
+            // With static initializers.
+            "  DO_(_extensions_.ParseField(tag, input, default_instance_,\n"
+            "                              &unknown_fields_stream));\n",
+            // Without.
+            "  DO_(_extensions_.ParseField(tag, input, &default_instance(),\n"
+            "                              &unknown_fields_stream));\n");
+      }
     } else {
-      printer->Print(
-        "  DO_(_extensions_.ParseField(tag, input,\n"
-        "      internal_default_instance(),\n"
-        "      &unknown_fields_stream));\n");
+      PrintHandlingOptionalStaticInitializers(
+          descriptor_->file(), options_, printer,
+          // With static initializers.
+          "  DO_(_extensions_.ParseField(tag, input, default_instance_);\n",
+          // Without.
+          "  DO_(_extensions_.ParseField(tag, input, &default_instance());\n");
     }
     printer->Print(
       "  continue;\n"
@@ -3598,14 +3191,19 @@
   }
 
   // We really don't recognize this tag.  Skip it.
-  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
-    printer->Print(vars,
+  if (PreserveUnknownFields(descriptor_)) {
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print(
         "DO_(::google::protobuf::internal::WireFormat::SkipField(\n"
-        "      input, tag, $mutable_unknown_fields$));\n");
-  } else {
-    printer->Print(
+        "      input, tag, mutable_unknown_fields()));\n");
+    } else {
+      printer->Print(
         "DO_(::google::protobuf::internal::WireFormatLite::SkipField(\n"
         "    input, tag, &unknown_fields_stream));\n");
+    }
+  } else {
+    printer->Print(
+      "DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));\n");
   }
 
   if (descriptor_->field_count() > 0) {
@@ -3630,69 +3228,15 @@
     "}\n", "full_name", descriptor_->full_name());
 }
 
-void MessageGenerator::GenerateSerializeOneofFields(
-    io::Printer* printer, const std::vector<const FieldDescriptor*>& fields,
-    bool to_array) {
-  GOOGLE_CHECK(!fields.empty());
-  if (fields.size() == 1) {
-    GenerateSerializeOneField(printer, fields[0], to_array, -1);
-    return;
-  }
-  // We have multiple mutually exclusive choices.  Emit a switch statement.
-  const OneofDescriptor* oneof = fields[0]->containing_oneof();
-  printer->Print(
-    "switch ($oneofname$_case()) {\n",
-    "oneofname", oneof->name());
-  printer->Indent();
-  for (int i = 0; i < fields.size(); i++) {
-    const FieldDescriptor* field = fields[i];
-    printer->Print(
-      "case k$field_name$:\n",
-      "field_name", UnderscoresToCamelCase(field->name(), true));
-    printer->Indent();
-    if (to_array) {
-      field_generators_.get(field).GenerateSerializeWithCachedSizesToArray(
-          printer);
-    } else {
-      field_generators_.get(field).GenerateSerializeWithCachedSizes(printer);
-    }
-    printer->Print(
-      "break;\n");
-    printer->Outdent();
-  }
-  printer->Outdent();
-  // Doing nothing is an option.
-  printer->Print(
-    "  default: ;\n"
-    "}\n");
-}
-
 void MessageGenerator::GenerateSerializeOneField(
-    io::Printer* printer, const FieldDescriptor* field, bool to_array,
-    int cached_has_bits_index) {
-  if (!field->options().weak()) {
-    // For weakfields, PrintFieldComment is called during iteration.
-    PrintFieldComment(printer, field);
-  }
+    io::Printer* printer, const FieldDescriptor* field, bool to_array) {
+  PrintFieldComment(printer, field);
 
   bool have_enclosing_if = false;
-  if (field->options().weak()) {
-  } else if (!field->is_repeated() && HasFieldPresence(descriptor_->file())) {
-    // Attempt to use the state of cached_has_bits, if possible.
-    int has_bit_index = has_bit_indices_[field->index()];
-    if (cached_has_bits_index == has_bit_index / 32) {
-      const string mask = StrCat(
-          strings::Hex(1u << (has_bit_index % 32),
-          strings::ZERO_PAD_8));
-
-      printer->Print(
-          "if (cached_has_bits & 0x$mask$u) {\n", "mask", mask);
-    } else {
-      printer->Print(
-        "if (has_$name$()) {\n",
-        "name", FieldName(field));
-    }
-
+  if (!field->is_repeated() && HasFieldPresence(descriptor_->file())) {
+    printer->Print(
+      "if (has_$name$()) {\n",
+      "name", FieldName(field));
     printer->Indent();
     have_enclosing_if = true;
   } else if (!HasFieldPresence(descriptor_->file())) {
@@ -3716,15 +3260,15 @@
 void MessageGenerator::GenerateSerializeOneExtensionRange(
     io::Printer* printer, const Descriptor::ExtensionRange* range,
     bool to_array) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["start"] = SimpleItoa(range->start);
   vars["end"] = SimpleItoa(range->end);
   printer->Print(vars,
     "// Extension range [$start$, $end$)\n");
   if (to_array) {
     printer->Print(vars,
-      "target = _extensions_.InternalSerializeWithCachedSizesToArray(\n"
-      "    $start$, $end$, deterministic, target);\n\n");
+      "target = _extensions_.SerializeWithCachedSizesToArray(\n"
+      "    $start$, $end$, target);\n\n");
   } else {
     printer->Print(vars,
       "_extensions_.SerializeWithCachedSizes(\n"
@@ -3742,16 +3286,13 @@
       "  _extensions_.SerializeMessageSetWithCachedSizes(output);\n",
       "classname", classname_);
     GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file(), options_));
-    std::map<string, string> vars;
-    SetUnknkownFieldsVariable(descriptor_, options_, &vars);
-    printer->Print(vars,
+    printer->Print(
       "  ::google::protobuf::internal::WireFormat::SerializeUnknownMessageSetItems(\n"
-      "      $unknown_fields$, output);\n");
+      "      unknown_fields(), output);\n");
     printer->Print(
       "}\n");
     return;
   }
-  if (options_.table_driven_serialization) return;
 
   printer->Print(
     "void $classname$::SerializeWithCachedSizes(\n"
@@ -3779,19 +3320,16 @@
   if (descriptor_->options().message_set_wire_format()) {
     // Special-case MessageSet.
     printer->Print(
-      "::google::protobuf::uint8* $classname$::InternalSerializeWithCachedSizesToArray(\n"
-      "    bool deterministic, ::google::protobuf::uint8* target) const {\n"
-      "  target = _extensions_."
-      "InternalSerializeMessageSetWithCachedSizesToArray(\n"
-      "               deterministic, target);\n",
+      "::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\n"
+      "    ::google::protobuf::uint8* target) const {\n"
+      "  target =\n"
+      "      _extensions_.SerializeMessageSetWithCachedSizesToArray(target);\n",
       "classname", classname_);
     GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file(), options_));
-    std::map<string, string> vars;
-    SetUnknkownFieldsVariable(descriptor_, options_, &vars);
-    printer->Print(vars,
+    printer->Print(
       "  target = ::google::protobuf::internal::WireFormat::\n"
       "             SerializeUnknownMessageSetItemsToArray(\n"
-      "               $unknown_fields$, target);\n");
+      "               unknown_fields(), target);\n");
     printer->Print(
       "  return target;\n"
       "}\n");
@@ -3799,12 +3337,11 @@
   }
 
   printer->Print(
-    "::google::protobuf::uint8* $classname$::InternalSerializeWithCachedSizesToArray(\n"
-    "    bool deterministic, ::google::protobuf::uint8* target) const {\n",
+    "::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\n"
+    "    ::google::protobuf::uint8* target) const {\n",
     "classname", classname_);
   printer->Indent();
 
-  printer->Print("(void)deterministic; // Unused\n");
   printer->Print(
     "// @@protoc_insertion_point(serialize_to_array_start:$full_name$)\n",
     "full_name", descriptor_->full_name());
@@ -3823,188 +3360,86 @@
 
 void MessageGenerator::
 GenerateSerializeWithCachedSizesBody(io::Printer* printer, bool to_array) {
-  // If there are multiple fields in a row from the same oneof then we
-  // coalesce them and emit a switch statement.  This is more efficient
-  // because it lets the C++ compiler know this is a "at most one can happen"
-  // situation. If we emitted "if (has_x()) ...; if (has_y()) ..." the C++
-  // compiler's emitted code might check has_y() even when has_x() is true.
-  class LazySerializerEmitter {
-   public:
-    LazySerializerEmitter(MessageGenerator* mg, io::Printer* printer,
-                          bool to_array)
-        : mg_(mg),
-          printer_(printer),
-          to_array_(to_array),
-          eager_(!HasFieldPresence(mg->descriptor_->file())),
-          cached_has_bit_index_(-1) {}
+  google::protobuf::scoped_array<const FieldDescriptor * > ordered_fields(
+      SortFieldsByNumber(descriptor_));
 
-    ~LazySerializerEmitter() { Flush(); }
-
-    // If conditions allow, try to accumulate a run of fields from the same
-    // oneof, and handle them at the next Flush().
-    void Emit(const FieldDescriptor* field) {
-      if (eager_ || MustFlush(field)) {
-        Flush();
-      }
-      if (field->containing_oneof() == NULL) {
-        // TODO(ckennelly): Defer non-oneof fields similarly to oneof fields.
-
-        if (!field->options().weak() && !field->is_repeated() && !eager_) {
-          // We speculatively load the entire _has_bits_[index] contents, even
-          // if it is for only one field.  Deferring non-oneof emitting would
-          // allow us to determine whether this is going to be useful.
-          int has_bit_index = mg_->has_bit_indices_[field->index()];
-          if (cached_has_bit_index_ != has_bit_index / 32) {
-            // Reload.
-            int new_index = has_bit_index / 32;
-
-            printer_->Print(
-                "cached_has_bits = _has_bits_[$new_index$];\n",
-                "new_index", SimpleItoa(new_index));
-
-            cached_has_bit_index_ = new_index;
-          }
-        }
-
-        mg_->GenerateSerializeOneField(
-            printer_, field, to_array_, cached_has_bit_index_);
-      } else {
-        v_.push_back(field);
-      }
-    }
-
-    void Flush() {
-      if (!v_.empty()) {
-        mg_->GenerateSerializeOneofFields(printer_, v_, to_array_);
-        v_.clear();
-      }
-    }
-
-   private:
-    // If we have multiple fields in v_ then they all must be from the same
-    // oneof.  Would adding field to v_ break that invariant?
-    bool MustFlush(const FieldDescriptor* field) {
-      return !v_.empty() &&
-             v_[0]->containing_oneof() != field->containing_oneof();
-    }
-
-    MessageGenerator* mg_;
-    io::Printer* printer_;
-    const bool to_array_;
-    const bool eager_;
-    std::vector<const FieldDescriptor*> v_;
-
-    // cached_has_bit_index_ maintains that:
-    //   cached_has_bits = from._has_bits_[cached_has_bit_index_]
-    // for cached_has_bit_index_ >= 0
-    int cached_has_bit_index_;
-  };
-
-  std::vector<const FieldDescriptor*> ordered_fields =
-      SortFieldsByNumber(descriptor_);
-
-  std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
+  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(),
             ExtensionRangeSorter());
-  if (num_weak_fields_) {
-    printer->Print(
-        "::google::protobuf::internal::WeakFieldMap::FieldWriter field_writer("
-        "_weak_field_map_);\n");
-  }
-
-  printer->Print(
-      "::google::protobuf::uint32 cached_has_bits = 0;\n"
-      "(void) cached_has_bits;\n\n");
 
   // Merge the fields and the extension ranges, both sorted by field number.
-  {
-    LazySerializerEmitter e(this, printer, to_array);
-    const FieldDescriptor* last_weak_field = NULL;
-    int i, j;
-    for (i = 0, j = 0;
-         i < ordered_fields.size() || j < sorted_extensions.size();) {
-      if ((j == sorted_extensions.size()) ||
-          (i < descriptor_->field_count() &&
-           ordered_fields[i]->number() < sorted_extensions[j]->start)) {
-        const FieldDescriptor* field = ordered_fields[i++];
-        if (field->options().weak()) {
-          last_weak_field = field;
-          PrintFieldComment(printer, field);
-        } else {
-          if (last_weak_field != NULL) {
-            e.Emit(last_weak_field);
-            last_weak_field = NULL;
-          }
-          e.Emit(field);
-        }
-      } else  {
-        if (last_weak_field != NULL) {
-          e.Emit(last_weak_field);
-          last_weak_field = NULL;
-        }
-        e.Flush();
-        GenerateSerializeOneExtensionRange(printer,
-                                           sorted_extensions[j++],
-                                           to_array);
-      }
-    }
-    if (last_weak_field != NULL) {
-      e.Emit(last_weak_field);
+  int i, j;
+  for (i = 0, j = 0;
+       i < descriptor_->field_count() || j < sorted_extensions.size();
+       ) {
+    if (i == descriptor_->field_count()) {
+      GenerateSerializeOneExtensionRange(printer,
+                                         sorted_extensions[j++],
+                                         to_array);
+    } else if (j == sorted_extensions.size()) {
+      GenerateSerializeOneField(printer, ordered_fields[i++], to_array);
+    } else if (ordered_fields[i]->number() < sorted_extensions[j]->start) {
+      GenerateSerializeOneField(printer, ordered_fields[i++], to_array);
+    } else {
+      GenerateSerializeOneExtensionRange(printer,
+                                         sorted_extensions[j++],
+                                         to_array);
     }
   }
 
-  std::map<string, string> vars;
-  SetUnknkownFieldsVariable(descriptor_, options_, &vars);
-  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
-    printer->Print(vars,
-      "if ($have_unknown_fields$) {\n");
-    printer->Indent();
-    if (to_array) {
-      printer->Print(vars,
-        "target = "
-        "::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n"
-        "    $unknown_fields$, target);\n");
-    } else {
-      printer->Print(vars,
-        "::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n"
-        "    $unknown_fields$, output);\n");
-    }
-    printer->Outdent();
+  if (PreserveUnknownFields(descriptor_)) {
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print("if (_internal_metadata_.have_unknown_fields()) {\n");
+      printer->Indent();
+      if (to_array) {
+        printer->Print(
+          "target = "
+              "::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n"
+          "    unknown_fields(), target);\n");
+      } else {
+        printer->Print(
+          "::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n"
+          "    unknown_fields(), output);\n");
+      }
+      printer->Outdent();
 
-    printer->Print("}\n");
-  } else {
-    printer->Print(vars,
-      "output->WriteRaw($unknown_fields$.data(),\n"
-      "                 static_cast<int>($unknown_fields$.size()));\n");
+      printer->Print(
+        "}\n");
+    } else {
+      printer->Print(
+        "output->WriteRaw(unknown_fields().data(),\n"
+        "                 static_cast<int>(unknown_fields().size()));\n");
+    }
   }
 }
 
-std::vector<uint32> MessageGenerator::RequiredFieldsBitMask() const {
-  const int array_size = HasBitsSize();
-  std::vector<uint32> masks(array_size, 0);
-
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
-    if (!field->is_required()) {
-      continue;
+static vector<uint32> RequiredFieldsBitMask(const Descriptor* desc) {
+  vector<uint32> result;
+  uint32 mask = 0;
+  for (int i = 0; i < desc->field_count(); i++) {
+    if (i > 0 && i % 32 == 0) {
+      result.push_back(mask);
+      mask = 0;
     }
-
-    const int has_bit_index = has_bit_indices_[field->index()];
-    masks[has_bit_index / 32] |=
-        static_cast<uint32>(1) << (has_bit_index % 32);
+    if (desc->field(i)->is_required()) {
+      mask |= (1 << (i & 31));
+    }
   }
-  return masks;
+  if (mask != 0) {
+    result.push_back(mask);
+  }
+  return result;
 }
 
 // Create an expression that evaluates to
 //  "for all i, (_has_bits_[i] & masks[i]) == masks[i]"
 // masks is allowed to be shorter than _has_bits_, but at least one element of
 // masks must be non-zero.
-static string ConditionalToCheckBitmasks(const std::vector<uint32>& masks) {
-  std::vector<string> parts;
+static string ConditionalToCheckBitmasks(const vector<uint32>& masks) {
+  vector<string> parts;
   for (int i = 0; i < masks.size(); i++) {
     if (masks[i] == 0) continue;
     string m = StrCat("0x", strings::Hex(masks[i], strings::ZERO_PAD_8));
@@ -4022,22 +3457,20 @@
 GenerateByteSize(io::Printer* printer) {
   if (descriptor_->options().message_set_wire_format()) {
     // Special-case MessageSet.
+    printer->Print(
+        "int $classname$::ByteSize() const {\n"
+        "// @@protoc_insertion_point(message_set_byte_size_start:$full_name$)\n"
+        "  int total_size = _extensions_.MessageSetByteSize();\n",
+        "classname", classname_, "full_name", descriptor_->full_name());
     GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file(), options_));
-    std::map<string, string> vars;
-    SetUnknkownFieldsVariable(descriptor_, options_, &vars);
-    vars["classname"] = classname_;
-    vars["full_name"] = descriptor_->full_name();
-    printer->Print(vars,
-      "size_t $classname$::ByteSizeLong() const {\n"
-      "// @@protoc_insertion_point(message_set_byte_size_start:$full_name$)\n"
-      "  size_t total_size = _extensions_.MessageSetByteSize();\n"
-      "  if ($have_unknown_fields$) {\n"
-      "    total_size += ::google::protobuf::internal::WireFormat::\n"
-      "        ComputeUnknownMessageSetItemsSize($unknown_fields$);\n"
-      "  }\n"
-      "  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);\n"
+    printer->Print(
+      "if (_internal_metadata_.have_unknown_fields()) {\n"
+      "  total_size += ::google::protobuf::internal::WireFormat::\n"
+      "      ComputeUnknownMessageSetItemsSize(unknown_fields());\n"
+      "}\n");
+    printer->Print(
       "  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
-      "  _cached_size_ = cached_size;\n"
+      "  _cached_size_ = total_size;\n"
       "  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
       "  return total_size;\n"
       "}\n");
@@ -4048,14 +3481,14 @@
     // Emit a function (rarely used, we hope) that handles the required fields
     // by checking for each one individually.
     printer->Print(
-        "size_t $classname$::RequiredFieldsByteSizeFallback() const {\n"
+        "int $classname$::RequiredFieldsByteSizeFallback() const {\n"
         "// @@protoc_insertion_point(required_fields_byte_size_fallback_start:"
         "$full_name$)\n",
         "classname", classname_, "full_name", descriptor_->full_name());
     printer->Indent();
-    printer->Print("size_t total_size = 0;\n");
-    for (int i = 0; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
+    printer->Print("int total_size = 0;\n");
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = descriptor_->field(i);
       if (field->is_required()) {
         printer->Print("\n"
                        "if (has_$name$()) {\n",
@@ -4074,49 +3507,26 @@
   }
 
   printer->Print(
-      "size_t $classname$::ByteSizeLong() const {\n"
+      "int $classname$::ByteSize() const {\n"
       "// @@protoc_insertion_point(message_byte_size_start:$full_name$)\n",
       "classname", classname_, "full_name", descriptor_->full_name());
   printer->Indent();
   printer->Print(
-    "size_t total_size = 0;\n"
+    "int total_size = 0;\n"
     "\n");
 
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-      "total_size += _extensions_.ByteSize();\n"
-      "\n");
-  }
-
-  std::map<string, string> vars;
-  SetUnknkownFieldsVariable(descriptor_, options_, &vars);
-  if (UseUnknownFieldSet(descriptor_->file(), options_)) {
-    printer->Print(vars,
-      "if ($have_unknown_fields$) {\n"
-      "  total_size +=\n"
-      "    ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n"
-      "      $unknown_fields$);\n"
-      "}\n");
-  } else {
-    printer->Print(vars,
-      "total_size += $unknown_fields$.size();\n"
-      "\n");
-  }
-
   // Handle required fields (if any).  We expect all of them to be
   // present, so emit one conditional that checks for that.  If they are all
   // present then the fast path executes; otherwise the slow path executes.
   if (num_required_fields_ > 1 && HasFieldPresence(descriptor_->file())) {
     // The fast path works if all required fields are present.
-    const std::vector<uint32> masks_for_has_bits = RequiredFieldsBitMask();
+    vector<uint32> masks_for_has_bits = RequiredFieldsBitMask(descriptor_);
     printer->Print((string("if (") +
                     ConditionalToCheckBitmasks(masks_for_has_bits) +
                     ") {  // All required fields are present.\n").c_str());
     printer->Indent();
-    // Oneof fields cannot be required, so optimized_order_ contains all of the
-    // fields that we need to potentially emit.
-    for (int i = 0; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = descriptor_->field(i);
       if (!field->is_required()) continue;
       PrintFieldComment(printer, field);
       field_generators_.get(field).GenerateByteSize(printer);
@@ -4128,8 +3538,8 @@
                    "}\n");
   } else {
     // num_required_fields_ <= 1: no need to be tricky
-    for (int i = 0; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = descriptor_->field(i);
       if (!field->is_required()) continue;
       PrintFieldComment(printer, field);
       printer->Print("if (has_$name$()) {\n",
@@ -4141,128 +3551,101 @@
     }
   }
 
-  int last_i = -1;
-  for (int i = 0; i < optimized_order_.size(); ) {
-    // Detect infinite loops.
-    GOOGLE_CHECK_NE(i, last_i);
-    last_i = i;
-
-    // Skip required fields.
-    for (; i < optimized_order_.size() &&
-         optimized_order_[i]->is_required(); i++) {
+  // Handle optional fields (worry below about repeateds, oneofs, etc.).
+  // These are handled in chunks of 8.  The first chunk is
+  // the non-requireds-non-repeateds-non-unions-non-extensions in
+  //  descriptor_->field(0), descriptor_->field(1), ... descriptor_->field(7),
+  // and the second chunk is the same for
+  //  descriptor_->field(8), descriptor_->field(9), ... descriptor_->field(15),
+  // etc.
+  hash_map<int, uint32> fields_mask_for_chunk;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+    if (!field->is_required() && !field->is_repeated() &&
+        !field->containing_oneof()) {
+      fields_mask_for_chunk[i / 8] |= static_cast<uint32>(1) << (i % 32);
     }
+  }
 
-    // Handle repeated fields.
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      if (!field->is_repeated()) {
-        break;
+  int last_index = -1;
+  bool chunk_block_in_progress = false;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+    if (!field->is_required() && !field->is_repeated() &&
+        !field->containing_oneof()) {
+      // See above in GenerateClear for an explanation of this.
+      // TODO(kenton):  Share code?  Unclear how to do so without
+      //   over-engineering.
+      if (i / 8 != last_index / 8 || last_index < 0) {
+        // End previous chunk, if there was one.
+        if (chunk_block_in_progress) {
+          printer->Outdent();
+          printer->Print("}\n");
+          chunk_block_in_progress = false;
+        }
+        // Start chunk.
+        uint32 mask = fields_mask_for_chunk[i / 8];
+        int count = popcnt(mask);
+        GOOGLE_DCHECK_GE(count, 1);
+        if (count == 1) {
+          // No "if" here because the chunk is trivial.
+        } else {
+          if (HasFieldPresence(descriptor_->file())) {
+            printer->Print(
+              "if (_has_bits_[$index$ / 32] & $mask$u) {\n",
+              "index", SimpleItoa(i),
+              "mask", SimpleItoa(mask));
+            printer->Indent();
+            chunk_block_in_progress = true;
+          }
+        }
       }
+      last_index = i;
 
       PrintFieldComment(printer, field);
-      const FieldGenerator& generator = field_generators_.get(field);
-      generator.GenerateByteSize(printer);
-      printer->Print("\n");
-    }
 
-    // Handle optional (non-repeated/oneof) fields.
-    //
-    // These are handled in chunks of 8.  The first chunk is
-    // the non-requireds-non-repeateds-non-unions-non-extensions in
-    //  descriptor_->field(0), descriptor_->field(1), ... descriptor_->field(7),
-    // and the second chunk is the same for
-    //  descriptor_->field(8), descriptor_->field(9), ...
-    //  descriptor_->field(15),
-    // etc.
-    int last_chunk = -1;
-    int last_chunk_start = -1;
-    int last_chunk_end = -1;
-    uint32 last_chunk_mask = 0;
-    for (; i < optimized_order_.size(); i++) {
-      const FieldDescriptor* field = optimized_order_[i];
-      if (field->is_repeated() || field->is_required()) {
-        break;
-      }
-
-      // "index" defines where in the _has_bits_ the field appears.
-      // "i" is our loop counter within optimized_order_.
-      int index = HasFieldPresence(descriptor_->file()) ?
-          has_bit_indices_[field->index()] : 0;
-      int chunk = index / 8;
-
-      if (last_chunk == -1) {
-        last_chunk = chunk;
-        last_chunk_start = i;
-      } else if (chunk != last_chunk) {
-        // Emit the fields for this chunk so far.
-        break;
-      }
-
-      last_chunk_end = i;
-      last_chunk_mask |= static_cast<uint32>(1) << (index % 32);
-    }
-
-    if (last_chunk != -1) {
-      GOOGLE_DCHECK_NE(-1, last_chunk_start);
-      GOOGLE_DCHECK_NE(-1, last_chunk_end);
-      GOOGLE_DCHECK_NE(0, last_chunk_mask);
-
-      const int count = popcnt(last_chunk_mask);
-      const bool have_outer_if = HasFieldPresence(descriptor_->file()) &&
-          (last_chunk_start != last_chunk_end);
-
-      if (have_outer_if) {
-        // Check (up to) 8 has_bits at a time if we have more than one field in
-        // this chunk.  Due to field layout ordering, we may check
-        // _has_bits_[last_chunk * 8 / 32] multiple times.
-        GOOGLE_DCHECK_LE(2, count);
-        GOOGLE_DCHECK_GE(8, count);
-
+      bool have_enclosing_if = false;
+      if (HasFieldPresence(descriptor_->file())) {
         printer->Print(
-          "if (_has_bits_[$index$ / 32] & $mask$u) {\n",
-          "index", SimpleItoa(last_chunk * 8),
-          "mask", SimpleItoa(last_chunk_mask));
+          "if (has_$name$()) {\n",
+          "name", FieldName(field));
         printer->Indent();
+        have_enclosing_if = true;
+      } else {
+        // Without field presence: field is serialized only if it has a
+        // non-default value.
+        have_enclosing_if = EmitFieldNonDefaultCondition(
+            printer, "this->", field);
       }
 
-      // Go back and emit checks for each of the fields we processed.
-      for (int j = last_chunk_start; j <= last_chunk_end; j++) {
-        const FieldDescriptor* field = optimized_order_[j];
-        const FieldGenerator& generator = field_generators_.get(field);
+      field_generators_.get(field).GenerateByteSize(printer);
 
-        PrintFieldComment(printer, field);
-
-        bool have_enclosing_if = false;
-        if (HasFieldPresence(descriptor_->file())) {
-          printer->Print(
-            "if (has_$name$()) {\n",
-            "name", FieldName(field));
-          printer->Indent();
-          have_enclosing_if = true;
-        } else {
-          // Without field presence: field is serialized only if it has a
-          // non-default value.
-          have_enclosing_if = EmitFieldNonDefaultCondition(
-              printer, "this->", field);
-        }
-
-        generator.GenerateByteSize(printer);
-
-        if (have_enclosing_if) {
-          printer->Outdent();
-          printer->Print(
-            "}\n"
-            "\n");
-        }
-      }
-
-      if (have_outer_if) {
+      if (have_enclosing_if) {
         printer->Outdent();
-        printer->Print("}\n");
+        printer->Print(
+          "}\n"
+          "\n");
       }
     }
   }
 
+  if (chunk_block_in_progress) {
+    printer->Outdent();
+    printer->Print("}\n");
+  }
+
+  // Repeated fields don't use _has_bits_ so we count them in a separate
+  // pass.
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
+
+    if (field->is_repeated()) {
+      PrintFieldComment(printer, field);
+      field_generators_.get(field).GenerateByteSize(printer);
+      printer->Print("\n");
+    }
+  }
+
   // Fields inside a oneof don't use _has_bits_ so we count them in a separate
   // pass.
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
@@ -4295,9 +3678,25 @@
         "}\n");
   }
 
-  if (num_weak_fields_) {
-    // TagSize + MessageSize
-    printer->Print("total_size += _weak_field_map_.ByteSizeLong();\n");
+  if (descriptor_->extension_range_count() > 0) {
+    printer->Print(
+      "total_size += _extensions_.ByteSize();\n"
+      "\n");
+  }
+
+  if (PreserveUnknownFields(descriptor_)) {
+    if (UseUnknownFieldSet(descriptor_->file(), options_)) {
+      printer->Print(
+        "if (_internal_metadata_.have_unknown_fields()) {\n"
+        "  total_size +=\n"
+        "    ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n"
+        "      unknown_fields());\n"
+        "}\n");
+    } else {
+      printer->Print(
+        "total_size += unknown_fields().size();\n"
+        "\n");
+    }
   }
 
   // We update _cached_size_ even though this is a const method.  In theory,
@@ -4306,9 +3705,8 @@
   // exact same value, it works on all common processors.  In a future version
   // of C++, _cached_size_ should be made into an atomic<int>.
   printer->Print(
-    "int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);\n"
     "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
-    "_cached_size_ = cached_size;\n"
+    "_cached_size_ = total_size;\n"
     "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
     "return total_size;\n");
 
@@ -4323,100 +3721,53 @@
     "classname", classname_);
   printer->Indent();
 
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-      "if (!_extensions_.IsInitialized()) {\n"
-      "  return false;\n"
-      "}\n\n");
-  }
-
   if (HasFieldPresence(descriptor_->file())) {
     // Check that all required fields in this message are set.  We can do this
     // most efficiently by checking 32 "has bits" at a time.
-    const std::vector<uint32> masks = RequiredFieldsBitMask();
+    int has_bits_array_size = (descriptor_->field_count() + 31) / 32;
+    for (int i = 0; i < has_bits_array_size; i++) {
+      uint32 mask = 0;
+      for (int bit = 0; bit < 32; bit++) {
+        int index = i * 32 + bit;
+        if (index >= descriptor_->field_count()) break;
+        const FieldDescriptor* field = descriptor_->field(index);
 
-    for (int i = 0; i < masks.size(); i++) {
-      uint32 mask = masks[i];
-      if (mask == 0) {
-        continue;
+        if (field->is_required()) {
+          mask |= 1 << bit;
+        }
       }
 
-      // TODO(ckennelly): Consider doing something similar to ByteSizeLong(),
-      // where we check all of the required fields in a single branch (assuming
-      // that we aren't going to benefit from early termination).
-      printer->Print(
-        "if ((_has_bits_[$i$] & 0x$mask$) != 0x$mask$) return false;\n",
-        "i", SimpleItoa(i),
-        "mask", StrCat(strings::Hex(mask, strings::ZERO_PAD_8)));
+      if (mask != 0) {
+        printer->Print(
+          "if ((_has_bits_[$i$] & 0x$mask$) != 0x$mask$) return false;\n",
+          "i", SimpleItoa(i),
+          "mask", StrCat(strings::Hex(mask, strings::ZERO_PAD_8)));
+      }
     }
   }
 
-  // Now check that all non-oneof embedded messages are initialized.
-  for (int i = 0; i < optimized_order_.size(); i++) {
-    const FieldDescriptor* field = optimized_order_[i];
-    // TODO(ckennelly): Push this down into a generator?
+  // Now check that all embedded messages are initialized.
+  printer->Print("\n");
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    const FieldDescriptor* field = descriptor_->field(i);
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
         !ShouldIgnoreRequiredFieldCheck(field, options_) &&
-        scc_analyzer_->HasRequiredFields(field->message_type())) {
+        HasRequiredFields(field->message_type(), options_)) {
       if (field->is_repeated()) {
         printer->Print(
           "if (!::google::protobuf::internal::AllAreInitialized(this->$name$()))"
           " return false;\n",
           "name", FieldName(field));
-      } else if (field->options().weak()) {
-        continue;
       } else {
-        GOOGLE_CHECK(!field->containing_oneof());
-        printer->Print(
-            "if (has_$name$()) {\n"
-            "  if (!this->$name$_->IsInitialized()) return false;\n"
-            "}\n",
+        if (field->options().weak() || !field->containing_oneof()) {
+          // For weak fields, use the data member (::google::protobuf::Message*) instead
+          // of the getter to avoid a link dependency on the weak message type
+          // which is only forward declared.
+          printer->Print(
+              "if (has_$name$()) {\n"
+              "  if (!this->$name$_->IsInitialized()) return false;\n"
+              "}\n",
             "name", FieldName(field));
-      }
-    }
-  }
-  if (num_weak_fields_) {
-    // For Weak fields.
-    printer->Print("if (!_weak_field_map_.IsInitialized()) return false;\n");
-  }
-  // Go through the oneof fields, emitting a switch if any might have required
-  // fields.
-  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
-
-    bool has_required_fields = false;
-    for (int j = 0; j < oneof->field_count(); j++) {
-      const FieldDescriptor* field = oneof->field(j);
-
-      if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
-          !ShouldIgnoreRequiredFieldCheck(field, options_) &&
-          scc_analyzer_->HasRequiredFields(field->message_type())) {
-        has_required_fields = true;
-        break;
-      }
-    }
-
-    if (!has_required_fields) {
-      continue;
-    }
-
-    printer->Print(
-        "switch ($oneofname$_case()) {\n",
-        "oneofname", oneof->name());
-    printer->Indent();
-    for (int j = 0; j < oneof->field_count(); j++) {
-      const FieldDescriptor* field = oneof->field(j);
-      printer->Print(
-          "case k$field_name$: {\n",
-          "field_name", UnderscoresToCamelCase(field->name(), true));
-      printer->Indent();
-
-      if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
-          !ShouldIgnoreRequiredFieldCheck(field, options_) &&
-          scc_analyzer_->HasRequiredFields(field->message_type())) {
-        GOOGLE_CHECK(!(field->options().weak() || !field->containing_oneof()));
-        if (field->options().weak()) {
-          // Just skip.
         } else {
           printer->Print(
             "if (has_$name$()) {\n"
@@ -4425,22 +3776,13 @@
             "name", FieldName(field));
         }
       }
-
-      printer->Print(
-          "break;\n");
-      printer->Outdent();
-      printer->Print(
-          "}\n");
     }
+  }
+
+  if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-        "case $cap_oneof_name$_NOT_SET: {\n"
-        "  break;\n"
-        "}\n",
-        "cap_oneof_name",
-        ToUpper(oneof->name()));
-    printer->Outdent();
-    printer->Print(
-        "}\n");
+      "\n"
+      "if (!_extensions_.IsInitialized()) return false;");
   }
 
   printer->Outdent();
@@ -4449,6 +3791,7 @@
     "}\n");
 }
 
+
 }  // namespace cpp
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/cpp_message.h b/src/google/protobuf/compiler/cpp/cpp_message.h
index 0387f0c..31223e1 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message.h
+++ b/src/google/protobuf/compiler/cpp/cpp_message.h
@@ -42,8 +42,6 @@
 #include <set>
 #include <string>
 #include <google/protobuf/compiler/cpp/cpp_field.h>
-#include <google/protobuf/compiler/cpp/cpp_helpers.h>
-#include <google/protobuf/compiler/cpp/cpp_message_layout_helper.h>
 #include <google/protobuf/compiler/cpp/cpp_options.h>
 
 namespace google {
@@ -63,46 +61,64 @@
 class MessageGenerator {
  public:
   // See generator.cc for the meaning of dllexport_decl.
-  MessageGenerator(const Descriptor* descriptor, int index_in_file_messages,
-                   const Options& options, SCCAnalyzer* scc_analyzer);
+  MessageGenerator(const Descriptor* descriptor, const Options& options);
   ~MessageGenerator();
 
-  // Append the two types of nested generators to the corresponding vector.
-  void AddGenerators(std::vector<EnumGenerator*>* enum_generators,
-                     std::vector<ExtensionGenerator*>* extension_generators);
-
   // Header stuff.
 
-  // Return names for forward declarations of this class and all its nested
+  // Return names for foward declarations of this class and all its nested
   // types. A given key in {class,enum}_names will map from a class name to the
   // descriptor that was responsible for its inclusion in the map. This can be
   // used to associate the descriptor with the code generated for it.
   void FillMessageForwardDeclarations(
-      std::map<string, const Descriptor*>* class_names);
+      map<string, const Descriptor*>* class_names);
+  void FillEnumForwardDeclarations(
+      map<string, const EnumDescriptor*>* enum_names);
+
+  // Generate definitions of all nested enums (must come before class
+  // definitions because those classes use the enums definitions).
+  void GenerateEnumDefinitions(io::Printer* printer);
+
+  // Generate specializations of GetEnumDescriptor<MyEnum>().
+  // Precondition: in ::google::protobuf namespace.
+  void GenerateGetEnumDescriptorSpecializations(io::Printer* printer);
 
   // Generate definitions for this class and all its nested types.
   void GenerateClassDefinition(io::Printer* printer);
 
   // Generate definitions of inline methods (placed at the end of the header
   // file).
-  void GenerateInlineMethods(io::Printer* printer);
+  void GenerateInlineMethods(io::Printer* printer, bool is_inline);
 
   // Dependent methods are always inline.
   void GenerateDependentInlineMethods(io::Printer* printer);
 
   // Source file stuff.
 
-  // Generate extra fields
-  void GenerateExtraDefaultFields(io::Printer* printer);
+  // Generate code which declares all the global descriptor pointers which
+  // will be initialized by the methods below.
+  void GenerateDescriptorDeclarations(io::Printer* printer);
 
-  // Generates code that creates default instances for fields.
-  void GenerateFieldDefaultInstances(io::Printer* printer);
+  // Generate code that initializes the global variable storing the message's
+  // descriptor.
+  void GenerateDescriptorInitializer(io::Printer* printer, int index);
+
+  // Generate code that calls MessageFactory::InternalRegisterGeneratedMessage()
+  // for all types.
+  void GenerateTypeRegistrations(io::Printer* printer);
+
+  // Generates code that allocates the message's default instance.
+  void GenerateDefaultInstanceAllocator(io::Printer* printer);
 
   // Generates code that initializes the message's default instance.  This
   // is separate from allocating because all default instances must be
   // allocated before any can be initialized.
   void GenerateDefaultInstanceInitializer(io::Printer* printer);
 
+  // Generates code that should be run when ShutdownProtobufLibrary() is called,
+  // to delete all dynamically-allocated objects.
+  void GenerateShutdownCode(io::Printer* printer);
+
   // Generate all non-inline methods for this class.
   void GenerateClassMethods(io::Printer* printer);
 
@@ -112,24 +128,10 @@
   void GenerateDependentFieldAccessorDeclarations(io::Printer* printer);
   void GenerateFieldAccessorDeclarations(io::Printer* printer);
   void GenerateDependentFieldAccessorDefinitions(io::Printer* printer);
-  void GenerateFieldAccessorDefinitions(io::Printer* printer);
+  void GenerateFieldAccessorDefinitions(io::Printer* printer, bool is_inline);
 
-  // Generate the table-driven parsing array.  Returns the number of entries
-  // generated.
-  size_t GenerateParseOffsets(io::Printer* printer);
-  size_t GenerateParseAuxTable(io::Printer* printer);
-  // Generates a ParseTable entry.  Returns whether the proto uses table-driven
-  // parsing.
-  bool GenerateParseTable(io::Printer* printer, size_t offset,
-                          size_t aux_offset);
-
-  // Generate the field offsets array.  Returns the a pair of the total numer
-  // of entries generated and the index of the first has_bit entry.
-  std::pair<size_t, size_t> GenerateOffsets(io::Printer* printer);
-  void GenerateSchema(io::Printer* printer, int offset, int has_offset);
-  // For each field generates a table entry describing the field for the
-  // table driven serializer.
-  int GenerateFieldMetadata(io::Printer* printer);
+  // Generate the field offsets array.
+  void GenerateOffsets(io::Printer* printer);
 
   // Generate constructors and destructor.
   void GenerateStructors(io::Printer* printer);
@@ -145,13 +147,6 @@
   // Generate the arena-specific destructor code.
   void GenerateArenaDestructorCode(io::Printer* printer);
 
-  // Helper for GenerateClear and others.  Optionally emits a condition that
-  // assumes the existence of the cached_has_bits variable, and returns true if
-  // the condition was printed.
-  bool MaybeGenerateOptionalFieldCondition(io::Printer* printer,
-                                           const FieldDescriptor* field,
-                                           int expected_has_bits_index);
-
   // Generate standard Message methods.
   void GenerateClear(io::Printer* printer);
   void GenerateOneofClear(io::Printer* printer);
@@ -167,72 +162,41 @@
   void GenerateIsInitialized(io::Printer* printer);
 
   // Helpers for GenerateSerializeWithCachedSizes().
-  //
-  // cached_has_bit_index maintains that:
-  //   cached_has_bits = _has_bits_[cached_has_bit_index]
-  // for cached_has_bit_index >= 0
   void GenerateSerializeOneField(io::Printer* printer,
                                  const FieldDescriptor* field,
-                                 bool unbounded,
-                                 int cached_has_bits_index);
-  // Generate a switch statement to serialize 2+ fields from the same oneof.
-  // Or, if fields.size() == 1, just call GenerateSerializeOneField().
-  void GenerateSerializeOneofFields(
-      io::Printer* printer, const std::vector<const FieldDescriptor*>& fields,
-      bool to_array);
+                                 bool unbounded);
   void GenerateSerializeOneExtensionRange(
       io::Printer* printer, const Descriptor::ExtensionRange* range,
       bool unbounded);
 
+
   // Generates has_foo() functions and variables for singular field has-bits.
   void GenerateSingularFieldHasBits(const FieldDescriptor* field,
-                                    std::map<string, string> vars,
+                                    map<string, string> vars,
                                     io::Printer* printer);
   // Generates has_foo() functions and variables for oneof field has-bits.
-  void GenerateOneofHasBits(io::Printer* printer);
+  void GenerateOneofHasBits(io::Printer* printer, bool is_inline);
   // Generates has_foo_bar() functions for oneof members.
   void GenerateOneofMemberHasBits(const FieldDescriptor* field,
-                                  const std::map<string, string>& vars,
+                                  const map<string, string>& vars,
                                   io::Printer* printer);
   // Generates the clear_foo() method for a field.
   void GenerateFieldClear(const FieldDescriptor* field,
-                          const std::map<string, string>& vars,
-                          bool is_inline,
+                          const map<string, string>& vars,
                           io::Printer* printer);
 
-  void GenerateConstructorBody(io::Printer* printer,
-                               std::vector<bool> already_processed,
-                               bool copy_constructor) const;
-
-  size_t HasBitsSize() const;
-  std::vector<uint32> RequiredFieldsBitMask() const;
-
   const Descriptor* descriptor_;
-  int index_in_file_messages_;
   string classname_;
   Options options_;
   FieldGeneratorMap field_generators_;
-  // optimized_order_ is the order we layout the message's fields in the class.
-  // This is reused to initialize the fields in-order for cache efficiency.
-  //
-  // optimized_order_ excludes oneof fields and weak fields.
-  std::vector<const FieldDescriptor *> optimized_order_;
-  std::vector<int> has_bit_indices_;
-  int max_has_bit_index_;
+  vector< vector<string> > runs_of_fields_;  // that might be trivially cleared
+  google::protobuf::scoped_array<google::protobuf::scoped_ptr<MessageGenerator> > nested_generators_;
   google::protobuf::scoped_array<google::protobuf::scoped_ptr<EnumGenerator> > enum_generators_;
   google::protobuf::scoped_array<google::protobuf::scoped_ptr<ExtensionGenerator> > extension_generators_;
   int num_required_fields_;
+  bool uses_string_;
   bool use_dependent_base_;
-  int num_weak_fields_;
-  // table_driven_ indicates the generated message uses table-driven parsing.
-  bool table_driven_;
 
-  google::protobuf::scoped_ptr<MessageLayoutHelper> message_layout_helper_;
-
-  SCCAnalyzer* scc_analyzer_;
-  string scc_name_;
-
-  friend class FileGenerator;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator);
 };
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/src/google/protobuf/compiler/cpp/cpp_message_field.cc
index fe60a28..332c026 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message_field.cc
@@ -35,7 +35,6 @@
 #include <google/protobuf/compiler/cpp/cpp_message_field.h>
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/io/printer.h>
-
 #include <google/protobuf/stubs/strutil.h>
 
 namespace google {
@@ -45,42 +44,11 @@
 
 namespace {
 
-// When we are generating code for implicit weak fields, we need to insert some
-// additional casts. These functions return the casted expression if
-// implicit_weak_field is true but otherwise return the original expression.
-// Ordinarily a static_cast is enough to cast google::protobuf::MessageLite* to a class
-// deriving from it, but we need a reinterpret_cast in cases where the generated
-// message is forward-declared but its full definition is not visible.
-string StaticCast(const string& type, const string& expression,
-                  bool implicit_weak_field) {
-  if (implicit_weak_field) {
-    return "static_cast< " + type + " >(" + expression + ")";
-  } else {
-    return expression;
-  }
-}
-
-string ReinterpretCast(const string& type, const string& expression,
-                       bool implicit_weak_field) {
-  if (implicit_weak_field) {
-    return "reinterpret_cast< " + type + " >(" + expression + ")";
-  } else {
-    return expression;
-  }
-}
-
 void SetMessageVariables(const FieldDescriptor* descriptor,
-                         std::map<string, string>* variables,
+                         map<string, string>* variables,
                          const Options& options) {
   SetCommonFieldVariables(descriptor, variables, options);
   (*variables)["type"] = FieldMessageTypeName(descriptor);
-  (*variables)["casted_member"] =
-      ReinterpretCast((*variables)["type"] + "*", (*variables)["name"] + "_",
-                      IsImplicitWeakField(descriptor, options));
-  (*variables)["type_default_instance"] =
-      DefaultInstanceName(descriptor->message_type());
-  (*variables)["type_reference_function"] =
-      ReferenceFunctionName(descriptor->message_type());
   if (descriptor->options().weak() || !descriptor->containing_oneof()) {
     (*variables)["non_null_ptr_to_name"] =
         StrCat("this->", (*variables)["name"], "_");
@@ -114,8 +82,7 @@
                                              const Options& options)
     : FieldGenerator(options),
       descriptor_(descriptor),
-      dependent_field_(options.proto_h && IsFieldDependent(descriptor)),
-      implicit_weak_field_(IsImplicitWeakField(descriptor, options)) {
+      dependent_field_(options.proto_h && IsFieldDependent(descriptor)) {
   SetMessageVariables(descriptor, &variables_, options);
 }
 
@@ -123,11 +90,13 @@
 
 void MessageFieldGenerator::
 GeneratePrivateMembers(io::Printer* printer) const {
-  if (implicit_weak_field_) {
-    printer->Print(variables_, "google::protobuf::MessageLite* $name$_;\n");
-  } else {
-    printer->Print(variables_, "$type$* $name$_;\n");
-  }
+  printer->Print(variables_, "$type$* $name$_;\n");
+}
+
+void MessageFieldGenerator::
+GenerateGetterDeclaration(io::Printer* printer) const {
+  printer->Print(variables_,
+      "$deprecated_attr$const $type$& $name$() const;\n");
 }
 
 void MessageFieldGenerator::
@@ -135,91 +104,48 @@
   if (!dependent_field_) {
     return;
   }
+  // Arena manipulation code is out-of-line in the derived message class.
   printer->Print(variables_,
-                 "$deprecated_attr$$type$* ${$mutable_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$$type$* mutable_$name$();\n"
+    "$deprecated_attr$$type$* $release_name$();\n"
+    "$deprecated_attr$void set_allocated_$name$($type$* $name$);\n");
 }
 
 void MessageFieldGenerator::
 GenerateAccessorDeclarations(io::Printer* printer) const {
-  if (SupportsArenas(descriptor_) && !implicit_weak_field_) {
-    printer->Print(variables_,
-       "private:\n"
-       "void _slow_mutable_$name$();\n"
-       "public:\n");
-  }
-  if (implicit_weak_field_) {
-    // These private accessors are used by MergeFrom and
-    // MergePartialFromCodedStream, and their purpose is to provide access to
-    // the field without creating a strong dependency on the message type.
-    printer->Print(variables_,
-       "private:\n"
-       "const google::protobuf::MessageLite& _internal_$name$() const;\n"
-       "google::protobuf::MessageLite* _internal_mutable_$name$();\n"
-       "public:\n");
-  }
-  printer->Print(variables_,
-      "$deprecated_attr$const $type$& $name$() const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(variables_, "$deprecated_attr$$type$* $release_name$();\n");
-  printer->Annotate("release_name", descriptor_);
-  if (!dependent_field_) {
-    printer->Print(variables_,
-                   "$deprecated_attr$$type$* ${$mutable_$name$$}$();\n");
-    printer->Annotate("{", "}", descriptor_);
-  }
-  printer->Print(variables_,
-                 "$deprecated_attr$void ${$set_allocated_$name$$}$"
-                 "($type$* $name$);\n");
-  printer->Annotate("{", "}", descriptor_);
   if (SupportsArenas(descriptor_)) {
     printer->Print(variables_,
-                   "$deprecated_attr$void "
-                   "${$unsafe_arena_set_allocated_$name$$}$(\n"
-                   "    $type$* $name$);\n");
-    printer->Annotate("{", "}", descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecated_attr$$type$* ${$unsafe_arena_release_$name$$}$();\n");
-    printer->Annotate("{", "}", descriptor_);
+       "private:\n"
+       "void _slow_mutable_$name$();\n");
+    if (SupportsArenas(descriptor_->message_type())) {
+      printer->Print(variables_,
+       "void _slow_set_allocated_$name$(\n"
+       "    ::google::protobuf::Arena* message_arena, $type$** $name$);\n");
+    }
+    printer->Print(variables_,
+       "$type$* _slow_$release_name$();\n"
+       "public:\n");
+  }
+  GenerateGetterDeclaration(printer);
+  if (!dependent_field_) {
+    printer->Print(variables_,
+      "$deprecated_attr$$type$* mutable_$name$();\n"
+      "$deprecated_attr$$type$* $release_name$();\n"
+      "$deprecated_attr$void set_allocated_$name$($type$* $name$);\n");
+  }
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+      "$deprecated_attr$$type$* unsafe_arena_release_$name$();\n"
+      "$deprecated_attr$void unsafe_arena_set_allocated_$name$(\n"
+      "    $type$* $name$);\n");
   }
 }
 
 void MessageFieldGenerator::GenerateNonInlineAccessorDefinitions(
     io::Printer* printer) const {
-  if (implicit_weak_field_) {
-    printer->Print(variables_,
-      "const google::protobuf::MessageLite& $classname$::_internal_$name$() const {\n"
-      "  if ($name$_ != NULL) {\n"
-      "    return *$name$_;\n"
-      "  } else if (&$type_default_instance$ != NULL) {\n"
-      "    return *reinterpret_cast<const google::protobuf::MessageLite*>(\n"
-      "        &$type_default_instance$);\n"
-      "  } else {\n"
-      "    return *reinterpret_cast<const google::protobuf::MessageLite*>(\n"
-      "        &::google::protobuf::internal::implicit_weak_message_default_instance);\n"
-      "  }\n"
-      "}\n");
-  }
   if (SupportsArenas(descriptor_)) {
-    if (implicit_weak_field_) {
-      printer->Print(variables_,
-        "google::protobuf::MessageLite* $classname$::_internal_mutable_$name$() {\n"
-        "  $set_hasbit$\n"
-        "  if ($name$_ == NULL) {\n"
-        "    if (&$type_default_instance$ == NULL) {\n"
-        "      $name$_ = ::google::protobuf::Arena::CreateMessage<\n"
-        "          ::google::protobuf::internal::ImplicitWeakMessage>(\n"
-        "              GetArenaNoVirtual());\n"
-        "    } else {\n"
-        "      $name$_ = reinterpret_cast<const google::protobuf::MessageLite*>(\n"
-        "          &$type_default_instance$)->New(GetArenaNoVirtual());\n"
-        "    }\n"
-        "  }\n"
-        "  return $name$_;\n");
-    } else {
-      printer->Print(variables_,
-        "void $classname$::_slow_mutable_$name$() {\n");
+    printer->Print(variables_,
+      "void $classname$::_slow_mutable_$name$() {\n");
       if (SupportsArenas(descriptor_->message_type())) {
         printer->Print(variables_,
           "  $name$_ = ::google::protobuf::Arena::CreateMessage< $type$ >(\n"
@@ -229,10 +155,44 @@
           "  $name$_ = ::google::protobuf::Arena::Create< $type$ >(\n"
           "      GetArenaNoVirtual());\n");
       }
-    }
     printer->Print(variables_,
+      "}\n"
+      "$type$* $classname$::_slow_$release_name$() {\n"
+      "  if ($name$_ == NULL) {\n"
+      "    return NULL;\n"
+      "  } else {\n"
+      "    $type$* temp = new $type$;\n"
+      "    temp->MergeFrom(*$name$_);\n"
+      "    $name$_ = NULL;\n"
+      "    return temp;\n"
+      "  }\n"
+      "}\n"
+      "$type$* $classname$::unsafe_arena_release_$name$() {\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n"
+      "  $clear_hasbit$\n"
+      "  $type$* temp = $name$_;\n"
+      "  $name$_ = NULL;\n"
+      "  return temp;\n"
       "}\n");
-
+    if (SupportsArenas(descriptor_->message_type())) {
+      // NOTE: the same logic is mirrored in weak_message_field.cc. Any
+      // arena-related semantics changes should be made in both places.
+      printer->Print(variables_,
+          "void $classname$::_slow_set_allocated_$name$(\n"
+          "    ::google::protobuf::Arena* message_arena, $type$** $name$) {\n"
+          "    if (message_arena != NULL && \n"
+          "        ::google::protobuf::Arena::GetArena(*$name$) == NULL) {\n"
+          "      message_arena->Own(*$name$);\n"
+          "    } else if (message_arena !=\n"
+          "               ::google::protobuf::Arena::GetArena(*$name$)) {\n"
+          "      $type$* new_$name$ = \n"
+          "            ::google::protobuf::Arena::CreateMessage< $type$ >(\n"
+          "            message_arena);\n"
+          "      new_$name$->CopyFrom(**$name$);\n"
+          "      *$name$ = new_$name$;\n"
+          "    }\n"
+          "}\n");
+    }
     printer->Print(variables_,
       "void $classname$::unsafe_arena_set_allocated_$name$(\n"
       "    $type$* $name$) {\n"
@@ -250,20 +210,6 @@
       "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated"
       ":$full_name$)\n"
       "}\n");
-  } else if (implicit_weak_field_) {
-    printer->Print(variables_,
-        "google::protobuf::MessageLite* $classname$::_internal_mutable_$name$() {\n"
-        "  $set_hasbit$\n"
-        "  if ($name$_ == NULL) {\n"
-        "    if (&$type_default_instance$ == NULL) {\n"
-        "      $name$_ = new ::google::protobuf::internal::ImplicitWeakMessage;\n"
-        "    } else {\n"
-        "      $name$_ = reinterpret_cast<const google::protobuf::MessageLite*>(\n"
-        "          &$type_default_instance$)->New();\n"
-        "    }\n"
-        "  }\n"
-        "  return $name$_;\n"
-        "}\n");
   }
 }
 
@@ -273,16 +219,12 @@
     return;
   }
 
-  std::map<string, string> variables(variables_);
+  map<string, string> variables(variables_);
   // For the CRTP base class, all mutation methods are dependent, and so
   // they must be in the header.
   variables["dependent_classname"] =
       DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>";
   variables["this_message"] = DependentBaseDownCast();
-  variables["casted_reference"] =
-      ReinterpretCast(variables["dependent_typename"] + "*&",
-                      variables["this_message"] + variables["name"] + "_",
-                      implicit_weak_field_);
   if (!variables["set_hasbit"].empty()) {
     variables["set_hasbit"] =
         variables["this_message"] + variables["set_hasbit"];
@@ -295,242 +237,258 @@
   if (SupportsArenas(descriptor_)) {
     printer->Print(variables,
       "template <class T>\n"
-      "inline $type$* $dependent_classname$::mutable_$name$() {\n");
-    if (implicit_weak_field_) {
-      printer->Print(variables, "  $type_reference_function$();\n");
-    }
-    printer->Print(variables,
+      "inline $type$* $dependent_classname$::mutable_$name$() {\n"
       "  $set_hasbit$\n"
-      "  $dependent_typename$*& $name$_ = $casted_reference$;\n"
-      "  if ($name$_ == NULL) {\n");
-    if (implicit_weak_field_) {
-      printer->Print(variables,
-          "    $name$_ = reinterpret_cast<$dependent_typename$*>(\n"
-          "        reinterpret_cast<const google::protobuf::MessageLite*>(\n"
-          "        &$type_default_instance$)->New(\n"
-          "        $this_message$GetArenaNoVirtual()));\n");
-    } else {
-      printer->Print(variables,
-        "    $this_message$_slow_mutable_$name$();\n");
-    }
-    printer->Print(variables,
+      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
+      "  if ($name$_ == NULL) {\n"
+      "    $this_message$_slow_mutable_$name$();\n"
       "  }\n"
       "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
       "  return $name$_;\n"
+      "}\n"
+      "template <class T>\n"
+      "inline $type$* $dependent_classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
+      "  $clear_hasbit$\n"
+      "  if ($this_message$GetArenaNoVirtual() != NULL) {\n"
+      "    return $this_message$_slow_$release_name$();\n"
+      "  } else {\n"
+      "    $dependent_typename$* temp = $name$_;\n"
+      "    $name$_ = NULL;\n"
+      "    return temp;\n"
+      "  }\n"
+      "}\n"
+      "template <class T>\n"
+      "inline void $dependent_classname$::"
+      "set_allocated_$name$($type$* $name$) {\n"
+      "  ::google::protobuf::Arena* message_arena = $this_message$GetArenaNoVirtual();\n"
+      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
+      "  if (message_arena == NULL) {\n"
+      "    delete $name$_;\n"
+      "  }\n"
+      "  if ($name$ != NULL) {\n");
+    if (SupportsArenas(descriptor_->message_type())) {
+      // If we're on an arena and the incoming message is not, simply Own() it
+      // rather than copy to the arena -- either way we need a heap dealloc,
+      // so we might as well defer it. Otherwise, if incoming message is on a
+      // different ownership domain (specific arena, or the heap) than we are,
+      // copy to our arena (or heap, as the case may be).
+      printer->Print(variables,
+        "    $this_message$_slow_set_allocated_$name$(message_arena, "
+        "&$name$);\n");
+    } else {
+      printer->Print(variables,
+        "    if (message_arena != NULL) {\n"
+        "      message_arena->Own($name$);\n"
+        "    }\n");
+    }
+    printer->Print(variables,
+      "  }\n"
+      "  $name$_ = $name$;\n"
+      "  if ($name$) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      // TODO(dlj): move insertion points to message class.
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
       "}\n");
   } else {
     printer->Print(variables,
       "template <class T>\n"
       "inline $type$* $dependent_classname$::mutable_$name$() {\n"
       "  $set_hasbit$\n"
-      "  $dependent_typename$*& $name$_ = $casted_reference$;\n"
+      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
       "  if ($name$_ == NULL) {\n"
       "    $name$_ = new $dependent_typename$;\n"
       "  }\n"
       "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
       "  return $name$_;\n"
+      "}\n"
+      "template <class T>\n"
+      "inline $type$* $dependent_classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  $clear_hasbit$\n"
+      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
+      "  $dependent_typename$* temp = $name$_;\n"
+      "  $name$_ = NULL;\n"
+      "  return temp;\n"
+      "}\n"
+      "template <class T>\n"
+      "inline void $dependent_classname$::"
+      "set_allocated_$name$($type$* $name$) {\n"
+      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
+      "  delete $name$_;\n");
+
+    if (SupportsArenas(descriptor_->message_type())) {
+      printer->Print(variables,
+      "  if ($name$ != NULL && static_cast< $dependent_typename$* >($name$)"
+      "->GetArena() != NULL) {\n"
+      "    $dependent_typename$* new_$name$ = new $dependent_typename$;\n"
+      "    new_$name$->CopyFrom(*$name$);\n"
+      "    $name$ = new_$name$;\n"
+      "  }\n");
+    }
+
+    printer->Print(variables,
+      "  $name$_ = $name$;\n"
+      "  if ($name$) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
       "}\n");
   }
 }
 
 void MessageFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  std::map<string, string> variables(variables_);
-  variables["const_member"] = ReinterpretCast(
-      "const " + variables["type"] + "*", variables["name"] + "_",
-      implicit_weak_field_);
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline " : "";
   printer->Print(variables,
-    "inline const $type$& $classname$::$name$() const {\n");
-  if (implicit_weak_field_) {
-    printer->Print(variables, "  $type_reference_function$();\n");
-  }
-  printer->Print(variables,
-    "  const $type$* p = $const_member$;\n"
-    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
-    "  return p != NULL ? *p : *reinterpret_cast<const $type$*>(\n"
-    "      &$type_default_instance$);\n"
-    "}\n");
+    "$inline$const $type$& $classname$::$name$() const {\n"
+    "  // @@protoc_insertion_point(field_get:$full_name$)\n");
 
-  printer->Print(variables,
-    "inline $type$* $classname$::$release_name$() {\n"
-    "  // @@protoc_insertion_point(field_release:$full_name$)\n");
-  if (implicit_weak_field_) {
-    printer->Print(variables, "  $type_reference_function$();\n");
+  PrintHandlingOptionalStaticInitializers(
+      variables, descriptor_->file(), options_, printer,
+      // With static initializers.
+      "  return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n",
+      // Without.
+      "  return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n");
+  printer->Print(variables, "}\n");
+
+  if (dependent_field_) {
+    return;
   }
-  printer->Print(variables,
-    "  $clear_hasbit$\n"
-    "  $type$* temp = $casted_member$;\n");
-  if (SupportsArenas(descriptor_)) {
-    printer->Print(variables,
-      "  if (GetArenaNoVirtual() != NULL) {\n"
-      "    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);\n"
-      "  }\n");
-  }
-  printer->Print(variables,
-    "  $name$_ = NULL;\n"
-    "  return temp;\n"
-    "}\n");
 
   if (SupportsArenas(descriptor_)) {
     printer->Print(variables,
-      "inline $type$* $classname$::unsafe_arena_release_$name$() {\n"
-      "  // @@protoc_insertion_point("
-      "field_unsafe_arena_release:$full_name$)\n");
-    if (implicit_weak_field_) {
-      printer->Print(variables, "  $type_reference_function$();\n");
-    }
-    printer->Print(variables,
+      "$inline$"
+      "$type$* $classname$::mutable_$name$() {\n"
+      "  $set_hasbit$\n"
+      "  if ($name$_ == NULL) {\n"
+      "    _slow_mutable_$name$();\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
+      "  return $name$_;\n"
+      "}\n"
+      "$inline$"
+      "$type$* $classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
       "  $clear_hasbit$\n"
-      "  $type$* temp = $casted_member$;\n"
-      "  $name$_ = NULL;\n"
-      "  return temp;\n"
-      "}\n");
-  }
-
-  if (!dependent_field_) {
-    if (SupportsArenas(descriptor_)) {
+      "  if (GetArenaNoVirtual() != NULL) {\n"
+      "    return _slow_$release_name$();\n"
+      "  } else {\n"
+      "    $type$* temp = $name$_;\n"
+      "    $name$_ = NULL;\n"
+      "    return temp;\n"
+      "  }\n"
+      "}\n"
+      "$inline$ "
+      "void $classname$::set_allocated_$name$($type$* $name$) {\n"
+      "  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();\n"
+      "  if (message_arena == NULL) {\n"
+      "    delete $name$_;\n"
+      "  }\n"
+      "  if ($name$ != NULL) {\n");
+    if (SupportsArenas(descriptor_->message_type())) {
+      // If we're on an arena and the incoming message is not, simply Own() it
+      // rather than copy to the arena -- either way we need a heap dealloc,
+      // so we might as well defer it. Otherwise, if incoming message is on a
+      // different ownership domain (specific arena, or the heap) than we are,
+      // copy to our arena (or heap, as the case may be).
       printer->Print(variables,
-        "inline $type$* $classname$::mutable_$name$() {\n"
-        "  $set_hasbit$\n"
-        "  if ($name$_ == NULL) {\n");
-      if (implicit_weak_field_) {
-        printer->Print(variables,
-          "    _internal_mutable_$name$();\n");
-      } else {
-        printer->Print(variables,
-          "    _slow_mutable_$name$();\n");
-      }
-      printer->Print(variables,
-        "  }\n"
-        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
-        "  return $casted_member$;\n"
-        "}\n");
+        "    _slow_set_allocated_$name$(message_arena, &$name$);\n");
     } else {
       printer->Print(variables,
-        "inline $type$* $classname$::mutable_$name$() {\n"
-        "  $set_hasbit$\n"
-        "  if ($name$_ == NULL) {\n"
-        "    $name$_ = new $type$;\n"
-        "  }\n"
-        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
-        "  return $casted_member$;\n"
-        "}\n");
+        "    if (message_arena != NULL) {\n"
+        "      message_arena->Own($name$);\n"
+        "    }\n");
     }
-  }
+    printer->Print(variables,
+      "  }\n"
+      "  $name$_ = $name$;\n"
+      "  if ($name$) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n");
+  } else {
+    printer->Print(variables,
+      "$inline$"
+      "$type$* $classname$::mutable_$name$() {\n"
+      "  $set_hasbit$\n"
+      "  if ($name$_ == NULL) {\n"
+      "    $name$_ = new $type$;\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
+      "  return $name$_;\n"
+      "}\n"
+      "$inline$"
+      "$type$* $classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  $clear_hasbit$\n"
+      "  $type$* temp = $name$_;\n"
+      "  $name$_ = NULL;\n"
+      "  return temp;\n"
+      "}\n"
+      "$inline$"
+      "void $classname$::set_allocated_$name$($type$* $name$) {\n"
+      "  delete $name$_;\n");
 
+    if (SupportsArenas(descriptor_->message_type())) {
+      printer->Print(variables,
+      "  if ($name$ != NULL && $name$->GetArena() != NULL) {\n"
+      "    $type$* new_$name$ = new $type$;\n"
+      "    new_$name$->CopyFrom(*$name$);\n"
+      "    $name$ = new_$name$;\n"
+      "  }\n");
+    }
 
-  // We handle the most common case inline, and delegate less common cases to
-  // the slow fallback function.
-  printer->Print(variables,
-    "inline void $classname$::set_allocated_$name$($type$* $name$) {\n"
-    "  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();\n");
-  printer->Print(variables,
-    "  if (message_arena == NULL) {\n");
-  if (IsCrossFileMessage(descriptor_)) {
     printer->Print(variables,
-      "    delete reinterpret_cast< ::google::protobuf::MessageLite*>($name$_);\n");
-  } else {
-    printer->Print(variables,
-      "    delete $name$_;\n");
+      "  $name$_ = $name$;\n"
+      "  if ($name$) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n");
   }
-  printer->Print(variables,
-    "  }\n"
-    "  if ($name$) {\n");
-  if (SupportsArenas(descriptor_->message_type()) &&
-      IsCrossFileMessage(descriptor_)) {
-    // We have to read the arena through the virtual method, because the type
-    // isn't defined in this file.
-    printer->Print(variables,
-      "    ::google::protobuf::Arena* submessage_arena =\n"
-      "      reinterpret_cast< ::google::protobuf::MessageLite*>($name$)->GetArena();\n");
-  } else if (!SupportsArenas(descriptor_->message_type())) {
-    printer->Print(variables,
-      "    ::google::protobuf::Arena* submessage_arena = NULL;\n");
-  } else {
-    printer->Print(variables,
-      "    ::google::protobuf::Arena* submessage_arena =\n"
-      "      ::google::protobuf::Arena::GetArena($name$);\n");
-  }
-  printer->Print(variables,
-    "    if (message_arena != submessage_arena) {\n"
-    "      $name$ = ::google::protobuf::internal::GetOwnedMessage(\n"
-    "          message_arena, $name$, submessage_arena);\n"
-    "    }\n"
-    "    $set_hasbit$\n"
-    "  } else {\n"
-    "    $clear_hasbit$\n"
-    "  }\n");
-  if (implicit_weak_field_) {
-    printer->Print(variables,
-      "  $name$_ = reinterpret_cast<MessageLite*>($name$);\n");
-  } else {
-    printer->Print(variables,
-      "  $name$_ = $name$;\n");
-  }
-  printer->Print(variables,
-    "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
-    "}\n");
 }
 
 void MessageFieldGenerator::
 GenerateClearingCode(io::Printer* printer) const {
+  map<string, string> variables(variables_);
+  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
   if (!HasFieldPresence(descriptor_->file())) {
     // If we don't have has-bits, message presence is indicated only by ptr !=
     // NULL. Thus on clear, we need to delete the object.
-    printer->Print(variables_,
-      "if (GetArenaNoVirtual() == NULL && $name$_ != NULL) {\n"
-      "  delete $name$_;\n"
-      "}\n"
-      "$name$_ = NULL;\n");
+    printer->Print(variables,
+      "if ($this_message$GetArenaNoVirtual() == NULL && "
+      "$this_message$$name$_ != NULL) delete $this_message$$name$_;\n"
+      "$this_message$$name$_ = NULL;\n");
   } else {
-    printer->Print(variables_,
-      "if ($name$_ != NULL) $name$_->Clear();\n");
-  }
-}
-
-void MessageFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
-  if (!HasFieldPresence(descriptor_->file())) {
-    // If we don't have has-bits, message presence is indicated only by ptr !=
-    // NULL. Thus on clear, we need to delete the object.
-    printer->Print(variables_,
-      "if (GetArenaNoVirtual() == NULL && $name$_ != NULL) {\n"
-      "  delete $name$_;\n"
-      "}\n"
-      "$name$_ = NULL;\n");
-  } else {
-    printer->Print(variables_,
-      "GOOGLE_DCHECK($name$_ != NULL);\n"
-      "$name$_->Clear();\n");
+    printer->Print(variables,
+      "if ($this_message$$name$_ != NULL) $this_message$$name$_->"
+      "$dependent_type$::Clear();\n");
   }
 }
 
 void MessageFieldGenerator::
 GenerateMergingCode(io::Printer* printer) const {
-  if (implicit_weak_field_) {
-    printer->Print(variables_,
-      "_internal_mutable_$name$()->CheckTypeAndMergeFrom(\n"
-      "    from._internal_$name$());\n");
-  } else {
-    printer->Print(variables_,
-      "mutable_$name$()->$type$::MergeFrom(from.$name$());\n");
-  }
+  printer->Print(variables_,
+    "mutable_$name$()->$type$::MergeFrom(from.$name$());\n");
 }
 
 void MessageFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "swap($name$_, other->$name$_);\n");
-}
-
-void MessageFieldGenerator::
-GenerateDestructorCode(io::Printer* printer) const {
-  // TODO(gerbens) Remove this when we don't need to destruct default instances.
-  // In google3 a default instance will never get deleted so we don't need to
-  // worry about that but in opensource protobuf default instances are deleted
-  // in shutdown process and we need to take special care when handling them.
-  printer->Print(variables_,
-    "if (this != internal_default_instance()) ");
-  printer->Print(variables_, "delete $name$_;\n");
+  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
 }
 
 void MessageFieldGenerator::
@@ -539,50 +497,14 @@
 }
 
 void MessageFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  // For non-Arena enabled messages, everything always goes on the heap.
-  //
-  // For Arena enabled messages, the logic is a bit more convoluted.
-  //
-  // In the copy constructor, we call InternalMetadataWithArena::MergeFrom,
-  // which does *not* copy the Arena pointer.  In the generated MergeFrom
-  // (see MessageFieldGenerator::GenerateMergingCode), we:
-  // -> copy the has bits (but this is done in bulk by a memcpy in the copy
-  //    constructor)
-  // -> check whether the destination field pointer is NULL (it will be, since
-  //    we're initializing it and would have called SharedCtor) and if so:
-  // -> call _slow_mutable_$name$(), which calls either
-  //    ::google::protobuf::Arena::CreateMessage<>(GetArenaNoVirtual()), or
-  //    ::google::protobuf::Arena::Create<>(GetArenaNoVirtual())
-  //
-  // At this point, GetArenaNoVirtual returns NULL since the Arena pointer
-  // wasn't copied, so both of these methods allocate the submessage on the
-  // heap.
-
-  string new_expression = (implicit_weak_field_ ? "from.$name$_->New()"
-                                                : "new $type$(*from.$name$_)");
-  string output =
-      "if (from.has_$name$()) {\n"
-      "  $name$_ = " + new_expression + ";\n"
-      "} else {\n"
-      "  $name$_ = NULL;\n"
-      "}\n";
-  printer->Print(variables_, output.c_str());
-}
-
-void MessageFieldGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) const {
-  if (implicit_weak_field_) {
+  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
     printer->Print(variables_,
-      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(\n"
-      "     input, _internal_mutable_$name$()));\n");
-  } else if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
-    printer->Print(variables_,
-      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(\n"
+      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
       "     input, mutable_$name$()));\n");
   } else {
     printer->Print(variables_,
-      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroup(\n"
+      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n"
       "      $number$, input, mutable_$name$()));\n");
   }
 }
@@ -598,15 +520,15 @@
 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
   printer->Print(variables_,
     "target = ::google::protobuf::internal::WireFormatLite::\n"
-    "  InternalWrite$declared_type$ToArray(\n"
-    "    $number$, *$non_null_ptr_to_name$, deterministic, target);\n");
+    "  Write$declared_type$NoVirtualToArray(\n"
+    "    $number$, *$non_null_ptr_to_name$, target);\n");
 }
 
 void MessageFieldGenerator::
 GenerateByteSize(io::Printer* printer) const {
   printer->Print(variables_,
     "total_size += $tag_size$ +\n"
-    "  ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
+    "  ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
     "    *$non_null_ptr_to_name$);\n");
 }
 
@@ -622,38 +544,29 @@
 
 MessageOneofFieldGenerator::~MessageOneofFieldGenerator() {}
 
-void MessageOneofFieldGenerator::GenerateNonInlineAccessorDefinitions(
-    io::Printer* printer) const {
-  printer->Print(variables_,
-    "void $classname$::set_allocated_$name$($type$* $name$) {\n"
-    "  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();\n"
-    "  clear_$oneof_name$();\n"
-    "  if ($name$) {\n");
-  if (SupportsArenas(descriptor_->message_type()) &&
-      descriptor_->file() != descriptor_->message_type()->file()) {
-    // We have to read the arena through the virtual method, because the type
-    // isn't defined in this file.
-    printer->Print(variables_,
-      "    ::google::protobuf::Arena* submessage_arena =\n"
-      "      reinterpret_cast< ::google::protobuf::MessageLite*>($name$)->GetArena();\n");
-  } else if (!SupportsArenas(descriptor_->message_type())) {
-    printer->Print(variables_,
-      "    ::google::protobuf::Arena* submessage_arena = NULL;\n");
-  } else {
-    printer->Print(variables_,
-      "    ::google::protobuf::Arena* submessage_arena =\n"
-      "      ::google::protobuf::Arena::GetArena($name$);\n");
+
+void MessageOneofFieldGenerator::
+GenerateDependentAccessorDeclarations(io::Printer* printer) const {
+  // Oneof field getters must be dependent as they call default_instance().
+  // Otherwise, the logic is the same as MessageFields.
+  if (!dependent_field_) {
+    return;
   }
   printer->Print(variables_,
-    "    if (message_arena != submessage_arena) {\n"
-    "      $name$ = ::google::protobuf::internal::GetOwnedMessage(\n"
-    "          message_arena, $name$, submessage_arena);\n"
-    "    }\n"
-    "    set_has_$name$();\n"
-    "    $oneof_prefix$$name$_ = $name$;\n"
-    "  }\n"
-    "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
-    "}\n");
+      "$deprecated_attr$const $type$& $name$() const;\n");
+  MessageFieldGenerator::GenerateDependentAccessorDeclarations(printer);
+}
+
+void MessageOneofFieldGenerator::
+GenerateGetterDeclaration(io::Printer* printer) const {
+  // Oneof field getters must be dependent as they call default_instance().
+  // Unlike MessageField, this means there is no (non-dependent) getter to
+  // generate.
+  if (dependent_field_) {
+    return;
+  }
+  printer->Print(variables_,
+      "$deprecated_attr$const $type$& $name$() const;\n");
 }
 
 void MessageOneofFieldGenerator::
@@ -663,7 +576,8 @@
   if (!dependent_base_) {
     return;
   }
-  std::map<string, string> variables(variables_);
+  map<string, string> variables(variables_);
+  variables["inline"] = "inline ";
   variables["dependent_classname"] =
       DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>";
   variables["this_message"] = "reinterpret_cast<T*>(this)->";
@@ -677,9 +591,13 @@
 }
 
 void MessageOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-
-  std::map<string, string> variables(variables_);
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  if (dependent_base_) {
+    return;
+  }
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline " : "";
   variables["dependent_classname"] = variables["classname"];
   variables["this_message"] = "";
   variables["this_const_message"] = "";
@@ -687,77 +605,36 @@
   variables["field_member"] =
       variables["oneof_prefix"] + variables["name"] + "_";
   variables["dependent_type"] = variables["type"];
-
-  printer->Print(variables,
-    "inline $type$* $classname$::$release_name$() {\n"
-    "  // @@protoc_insertion_point(field_release:$full_name$)\n"
-    "  if ($this_message$has_$name$()) {\n"
-    "    $this_message$clear_has_$oneof_name$();\n"
-    "      $type$* temp = $field_member$;\n");
-  if (SupportsArenas(descriptor_)) {
-    printer->Print(variables,
-      "    if ($this_message$GetArenaNoVirtual() != NULL) {\n"
-      "      temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);\n"
-      "    }\n");
-  }
-  printer->Print(variables,
-    "    $field_member$ = NULL;\n"
-    "    return temp;\n"
-    "  } else {\n"
-    "    return NULL;\n"
-    "  }\n"
-    "}\n");
-
-  printer->Print(variables,
-    "inline const $type$& $classname$::$name$() const {\n"
-    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
-    "  return $this_const_message$has_$name$()\n"
-    "      ? *$this_const_message$$oneof_prefix$$name$_\n"
-    "      : *reinterpret_cast< $type$*>(&$type_default_instance$);\n"
-    "}\n");
-
-  if (SupportsArenas(descriptor_)) {
-    printer->Print(variables,
-      "inline $type$* $dependent_classname$::unsafe_arena_release_$name$() {\n"
-      "  // @@protoc_insertion_point(field_unsafe_arena_release"
-      ":$full_name$)\n"
-      "  if ($this_message$has_$name$()) {\n"
-      "    $this_message$clear_has_$oneof_name$();\n"
-      "    $type$* temp = $this_message$$oneof_prefix$$name$_;\n"
-      "    $this_message$$oneof_prefix$$name$_ = NULL;\n"
-      "    return temp;\n"
-      "  } else {\n"
-      "    return NULL;\n"
-      "  }\n"
-      "}\n"
-      "inline void $classname$::unsafe_arena_set_allocated_$name$"
-      "($type$* $name$) {\n"
-      // We rely on the oneof clear method to free the earlier contents of this
-      // oneof. We can directly use the pointer we're given to set the new
-      // value.
-      "  clear_$oneof_name$();\n"
-      "  if ($name$) {\n"
-      "    set_has_$name$();\n"
-      "    $oneof_prefix$$name$_ = $name$;\n"
-      "  }\n"
-      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
-      "$full_name$)\n"
-      "}\n");
-  }
-
-  if (dependent_base_) {
-    return;
-  }
-
   InternalGenerateInlineAccessorDefinitions(variables, printer);
 }
 
-void MessageOneofFieldGenerator::InternalGenerateInlineAccessorDefinitions(
-    const std::map<string, string>& variables, io::Printer* printer) const {
+void MessageOneofFieldGenerator::
+GenerateNonInlineAccessorDefinitions(io::Printer* printer) const {
+  map<string, string> variables(variables_);
+  variables["field_member"] =
+      variables["oneof_prefix"] + variables["name"] + "_";
+
+  //printer->Print(variables,
+}
+
+void MessageOneofFieldGenerator::
+InternalGenerateInlineAccessorDefinitions(const map<string, string>& variables,
+                                          io::Printer* printer) const {
+  printer->Print(variables,
+    "$tmpl$"
+    "$inline$ "
+    "const $type$& $dependent_classname$::$name$() const {\n"
+    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
+    "  return $this_const_message$has_$name$()\n"
+    "      ? *$this_const_message$$oneof_prefix$$name$_\n"
+    "      : $dependent_type$::default_instance();\n"
+    "}\n");
+
   if (SupportsArenas(descriptor_)) {
     printer->Print(variables,
       "$tmpl$"
-      "inline $type$* $dependent_classname$::mutable_$name$() {\n"
+      "$inline$"
+      "$type$* $dependent_classname$::mutable_$name$() {\n"
       "  if (!$this_message$has_$name$()) {\n"
       "    $this_message$clear_$oneof_name$();\n"
       "    $this_message$set_has_$name$();\n");
@@ -776,11 +653,95 @@
       "  }\n"
       "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
       "  return $field_member$;\n"
+      "}\n"
+      "$tmpl$"
+      "$inline$"
+      "$type$* $dependent_classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  if ($this_message$has_$name$()) {\n"
+      "    $this_message$clear_has_$oneof_name$();\n"
+      "    if ($this_message$GetArenaNoVirtual() != NULL) {\n"
+      // N.B.: safe to use the underlying field pointer here because we are sure
+      // that it is non-NULL (because has_$name$() returned true).
+      "      $dependent_typename$* temp = new $dependent_typename$;\n"
+      "      temp->MergeFrom(*$field_member$);\n"
+      "      $field_member$ = NULL;\n"
+      "      return temp;\n"
+      "    } else {\n"
+      "      $dependent_typename$* temp = $field_member$;\n"
+      "      $field_member$ = NULL;\n"
+      "      return temp;\n"
+      "    }\n"
+      "  } else {\n"
+      "    return NULL;\n"
+      "  }\n"
+      "}\n"
+      "$tmpl$"
+      "$inline$"
+      "void $dependent_classname$::"
+      "set_allocated_$name$($type$* $name$) {\n"
+      "  $this_message$clear_$oneof_name$();\n"
+      "  if ($name$) {\n");
+
+    if (SupportsArenas(descriptor_->message_type())) {
+      printer->Print(variables,
+        // If incoming message is on the heap and we are on an arena, just Own()
+        // it (see above). If it's on a different arena than we are or one of us
+        // is on the heap, we make a copy to our arena/heap.
+        "    if ($this_message$GetArenaNoVirtual() != NULL &&\n"
+        "        ::google::protobuf::Arena::GetArena($name$) == NULL) {\n"
+        "      $this_message$GetArenaNoVirtual()->Own($name$);\n"
+        "    } else if ($this_message$GetArenaNoVirtual() !=\n"
+        "               ::google::protobuf::Arena::GetArena($name$)) {\n"
+        "      $dependent_typename$* new_$name$ = \n"
+        "          ::google::protobuf::Arena::CreateMessage< $dependent_typename$ >(\n"
+        "          $this_message$GetArenaNoVirtual());\n"
+        "      new_$name$->CopyFrom(*$name$);\n"
+        "      $name$ = new_$name$;\n"
+        "    }\n");
+    } else {
+      printer->Print(variables,
+        "    if ($this_message$GetArenaNoVirtual() != NULL) {\n"
+        "      $this_message$GetArenaNoVirtual()->Own($name$);\n"
+        "    }\n");
+    }
+
+    printer->Print(variables,
+      "    $this_message$set_has_$name$();\n"
+      "    $field_member$ = $name$;\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n"
+      "$inline$ $type$* $classname$::unsafe_arena_release_$name$() {\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_release"
+      ":$full_name$)\n"
+      "  if (has_$name$()) {\n"
+      "    clear_has_$oneof_name$();\n"
+      "    $type$* temp = $oneof_prefix$$name$_;\n"
+      "    $oneof_prefix$$name$_ = NULL;\n"
+      "    return temp;\n"
+      "  } else {\n"
+      "    return NULL;\n"
+      "  }\n"
+      "}\n"
+      "$inline$ void $classname$::unsafe_arena_set_allocated_$name$"
+      "($type$* $name$) {\n"
+      // We rely on the oneof clear method to free the earlier contents of this
+      // oneof. We can directly use the pointer we're given to set the new
+      // value.
+      "  clear_$oneof_name$();\n"
+      "  if ($name$) {\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_ = $name$;\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
+      "$full_name$)\n"
       "}\n");
   } else {
     printer->Print(variables,
       "$tmpl$"
-      "inline $type$* $dependent_classname$::mutable_$name$() {\n"
+      "$inline$"
+      "$type$* $dependent_classname$::mutable_$name$() {\n"
       "  if (!$this_message$has_$name$()) {\n"
       "    $this_message$clear_$oneof_name$();\n"
       "    $this_message$set_has_$name$();\n"
@@ -788,40 +749,65 @@
       "  }\n"
       "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
       "  return $field_member$;\n"
+      "}\n"
+      "$tmpl$"
+      "$inline$"
+      "$type$* $dependent_classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  if ($this_message$has_$name$()) {\n"
+      "    $this_message$clear_has_$oneof_name$();\n"
+      "    $dependent_typename$* temp = $field_member$;\n"
+      "    $field_member$ = NULL;\n"
+      "    return temp;\n"
+      "  } else {\n"
+      "    return NULL;\n"
+      "  }\n"
+      "}\n"
+      "$tmpl$"
+      "$inline$"
+      "void $dependent_classname$::"
+      "set_allocated_$name$($type$* $name$) {\n"
+      "  $this_message$clear_$oneof_name$();\n"
+      "  if ($name$) {\n");
+    if (SupportsArenas(descriptor_->message_type())) {
+      printer->Print(variables,
+        "    if (static_cast< $dependent_typename$*>($name$)->"
+        "GetArena() != NULL) {\n"
+        "      $dependent_typename$* new_$name$ = new $dependent_typename$;\n"
+        "      new_$name$->CopyFrom(*$name$);\n"
+        "      $name$ = new_$name$;\n"
+        "    }\n");
+    }
+    printer->Print(variables,
+      "    $this_message$set_has_$name$();\n"
+      "    $field_member$ = $name$;\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
       "}\n");
   }
 }
 
 void MessageOneofFieldGenerator::
 GenerateClearingCode(io::Printer* printer) const {
+  map<string, string> variables(variables_);
+  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
   if (SupportsArenas(descriptor_)) {
-    printer->Print(variables_,
-      "if (GetArenaNoVirtual() == NULL) {\n"
-      "  delete $oneof_prefix$$name$_;\n"
+    printer->Print(variables,
+      "if ($this_message$GetArenaNoVirtual() == NULL) {\n"
+      "  delete $this_message$$oneof_prefix$$name$_;\n"
       "}\n");
   } else {
-    printer->Print(variables_,
-      "delete $oneof_prefix$$name$_;\n");
+    printer->Print(variables,
+      "delete $this_message$$oneof_prefix$$name$_;\n");
   }
 }
 
 void MessageOneofFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
-  GenerateClearingCode(printer);
-}
-
-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 {
-  // We inherit from MessageFieldGenerator, so we need to override the default
-  // behavior.
-}
-
-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.
@@ -849,20 +835,16 @@
 void RepeatedMessageFieldGenerator::
 InternalGenerateTypeDependentAccessorDeclarations(io::Printer* printer) const {
   printer->Print(variables_,
-                 "$deprecated_attr$$type$* ${$mutable_$name$$}$(int index);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_, "$deprecated_attr$$type$* ${$add_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$$type$* mutable_$name$(int index);\n"
+    "$deprecated_attr$$type$* add_$name$();\n");
   if (dependent_getter_) {
     printer->Print(variables_,
       "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
       "    $name$() const;\n");
-    printer->Annotate("name", descriptor_);
   }
   printer->Print(variables_,
-                 "$deprecated_attr$::google::protobuf::RepeatedPtrField< $type$ >*\n"
-                 "    ${$mutable_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$::google::protobuf::RepeatedPtrField< $type$ >*\n"
+    "    mutable_$name$();\n");
 }
 
 void RepeatedMessageFieldGenerator::
@@ -870,7 +852,6 @@
   if (dependent_getter_) {
     printer->Print(variables_,
       "$deprecated_attr$const $type$& $name$(int index) const;\n");
-    printer->Annotate("name", descriptor_);
   }
   if (dependent_field_) {
     InternalGenerateTypeDependentAccessorDeclarations(printer);
@@ -882,7 +863,6 @@
   if (!dependent_getter_) {
     printer->Print(variables_,
       "$deprecated_attr$const $type$& $name$(int index) const;\n");
-    printer->Annotate("name", descriptor_);
   }
   if (!dependent_field_) {
     InternalGenerateTypeDependentAccessorDeclarations(printer);
@@ -891,7 +871,6 @@
     printer->Print(variables_,
       "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
       "    $name$() const;\n");
-    printer->Annotate("name", descriptor_);
   }
 }
 
@@ -900,7 +879,7 @@
   if (!dependent_field_) {
     return;
   }
-  std::map<string, string> variables(variables_);
+  map<string, string> variables(variables_);
   // For the CRTP base class, all mutation methods are dependent, and so
   // they must be in the header.
   variables["dependent_classname"] =
@@ -931,6 +910,7 @@
     "  return $this_message$$name$_.Add();\n"
     "}\n");
 
+
   if (dependent_getter_) {
     printer->Print(variables,
       "template <class T>\n"
@@ -952,39 +932,49 @@
 }
 
 void RepeatedMessageFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline " : "";
+
   if (!dependent_getter_) {
-    printer->Print(variables_,
-      "inline const $type$& $classname$::$name$(int index) const {\n"
+    printer->Print(variables,
+      "$inline$"
+      "const $type$& $classname$::$name$(int index) const {\n"
       "  // @@protoc_insertion_point(field_get:$full_name$)\n"
       "  return $name$_.$cppget$(index);\n"
       "}\n");
   }
 
   if (!dependent_field_) {
-    printer->Print(variables_,
-      "inline $type$* $classname$::mutable_$name$(int index) {\n"
+    printer->Print(variables,
+      "$inline$"
+      "$type$* $classname$::mutable_$name$(int index) {\n"
       // TODO(dlj): move insertion points
       "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
       "  return $name$_.Mutable(index);\n"
       "}\n"
-      "inline $type$* $classname$::add_$name$() {\n"
+      "$inline$"
+      "$type$* $classname$::add_$name$() {\n"
       "  // @@protoc_insertion_point(field_add:$full_name$)\n"
       "  return $name$_.Add();\n"
       "}\n");
   }
 
+
   if (!dependent_field_) {
-    printer->Print(variables_,
-      "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n"
+    printer->Print(variables,
+      "$inline$"
+      "::google::protobuf::RepeatedPtrField< $type$ >*\n"
       "$classname$::mutable_$name$() {\n"
       "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
       "  return &$name$_;\n"
       "}\n");
   }
   if (!dependent_getter_) {
-    printer->Print(variables_,
-      "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
+    printer->Print(variables,
+      "$inline$"
+      "const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
       "$classname$::$name$() const {\n"
       "  // @@protoc_insertion_point(field_list:$full_name$)\n"
       "  return $name$_;\n"
@@ -994,7 +984,9 @@
 
 void RepeatedMessageFieldGenerator::
 GenerateClearingCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.Clear();\n");
+  map<string, string> variables(variables_);
+  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
+  printer->Print(variables, "$this_message$$name$_.Clear();\n");
 }
 
 void RepeatedMessageFieldGenerator::
@@ -1004,7 +996,7 @@
 
 void RepeatedMessageFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n");
+  printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n");
 }
 
 void RepeatedMessageFieldGenerator::
@@ -1017,50 +1009,44 @@
   if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
     printer->Print(variables_,
       "DO_(::google::protobuf::internal::WireFormatLite::"
-      "ReadMessage(input, add_$name$()));\n");
+      "ReadMessageNoVirtualNoRecursionDepth(\n"
+      "      input, add_$name$()));\n");
   } else {
     printer->Print(variables_,
       "DO_(::google::protobuf::internal::WireFormatLite::"
-      "ReadGroup($number$, input, add_$name$()));\n");
+      "ReadGroupNoVirtualNoRecursionDepth(\n"
+      "      $number$, input, add_$name$()));\n");
   }
 }
 
 void RepeatedMessageFieldGenerator::
 GenerateSerializeWithCachedSizes(io::Printer* printer) const {
   printer->Print(variables_,
-    "for (unsigned int i = 0,\n"
-    "    n = static_cast<unsigned int>(this->$name$_size()); i < n; i++) {\n"
+    "for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n"
     "  ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
-    "    $number$, this->$name$(static_cast<int>(i)), output);\n"
+    "    $number$, this->$name$(i), output);\n"
     "}\n");
 }
 
 void RepeatedMessageFieldGenerator::
 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
   printer->Print(variables_,
-    "for (unsigned int i = 0,\n"
-    "    n = static_cast<unsigned int>(this->$name$_size()); i < n; i++) {\n"
+    "for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n"
     "  target = ::google::protobuf::internal::WireFormatLite::\n"
-    "    InternalWrite$declared_type$ToArray(\n"
-    "      $number$, this->$name$(static_cast<int>(i)), deterministic, target);\n"
+    "    Write$declared_type$NoVirtualToArray(\n"
+    "      $number$, this->$name$(i), target);\n"
     "}\n");
 }
 
 void RepeatedMessageFieldGenerator::
 GenerateByteSize(io::Printer* printer) const {
   printer->Print(variables_,
-    "{\n"
-    "  unsigned int count = static_cast<unsigned int>(this->$name$_size());\n");
-  printer->Indent();
-  printer->Print(variables_,
-    "total_size += $tag_size$UL * count;\n"
-    "for (unsigned int i = 0; i < count; i++) {\n"
+    "total_size += $tag_size$ * this->$name$_size();\n"
+    "for (int i = 0; i < this->$name$_size(); i++) {\n"
     "  total_size +=\n"
-    "    ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
-    "      this->$name$(static_cast<int>(i)));\n"
+    "    ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
+    "      this->$name$(i));\n"
     "}\n");
-  printer->Outdent();
-  printer->Print("}\n");
 }
 
 }  // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/cpp_message_field.h b/src/google/protobuf/compiler/cpp/cpp_message_field.h
index 3be505e..d8d9279 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message_field.h
+++ b/src/google/protobuf/compiler/cpp/cpp_message_field.h
@@ -44,8 +44,6 @@
 namespace compiler {
 namespace cpp {
 
-bool IsImplicitWeakField(const FieldDescriptor* field, const Options& options);
-
 class MessageFieldGenerator : public FieldGenerator {
  public:
   MessageFieldGenerator(const FieldDescriptor* descriptor,
@@ -57,25 +55,27 @@
   void GenerateDependentAccessorDeclarations(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
   void GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const;
   void GenerateClearingCode(io::Printer* printer) const;
-  void GenerateMessageClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
-  void GenerateDestructorCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
   void GenerateByteSize(io::Printer* printer) const;
 
  protected:
+  void GenerateArenaManipulationCode(const map<string, string>& variables,
+                                     io::Printer* printer) const;
+
+  virtual void GenerateGetterDeclaration(io::Printer* printer) const;
+
   const FieldDescriptor* descriptor_;
   const bool dependent_field_;
-  const bool implicit_weak_field_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);
@@ -88,21 +88,21 @@
   ~MessageOneofFieldGenerator();
 
   // implements FieldGenerator ---------------------------------------
+  void GenerateDependentAccessorDeclarations(io::Printer* printer) const;
   void GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const;
   void GenerateClearingCode(io::Printer* printer) const;
-
-  // MessageFieldGenerator, from which we inherit, overrides this so we need to
-  // override it as well.
-  void GenerateMessageClearingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
-  void GenerateDestructorCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
 
+ protected:
+  void GenerateGetterDeclaration(io::Printer* printer) const;
+
  private:
   void InternalGenerateInlineAccessorDefinitions(
-      const std::map<string, string>& variables, io::Printer* printer) const;
+      const map<string, string>& variables, io::Printer* printer) const;
 
   const bool dependent_base_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator);
@@ -119,12 +119,12 @@
   void GenerateDependentAccessorDeclarations(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
   void GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const {}
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
@@ -137,7 +137,7 @@
   const FieldDescriptor* descriptor_;
   const bool dependent_field_;
   const bool dependent_getter_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/cpp/cpp_message_layout_helper.h b/src/google/protobuf/compiler/cpp/cpp_message_layout_helper.h
deleted file mode 100644
index d502a6f..0000000
--- a/src/google/protobuf/compiler/cpp/cpp_message_layout_helper.h
+++ /dev/null
@@ -1,61 +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.
-
-// Author: seongkim@google.com (Seong Beom Kim)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-
-#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__
-#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__
-
-#include <google/protobuf/compiler/cpp/cpp_options.h>
-#include <google/protobuf/descriptor.h>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace cpp {
-
-// Provides an abstract interface to optimize message layout
-// by rearranging the fields of a message.
-class MessageLayoutHelper {
- public:
-  virtual ~MessageLayoutHelper() {}
-
-  virtual void OptimizeLayout(std::vector<const FieldDescriptor*>* fields,
-                              const Options& options) = 0;
-};
-
-}  // namespace cpp
-}  // namespace compiler
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__
diff --git a/src/google/protobuf/compiler/cpp/cpp_move_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_move_unittest.cc
deleted file mode 100644
index f72a7d6..0000000
--- a/src/google/protobuf/compiler/cpp/cpp_move_unittest.cc
+++ /dev/null
@@ -1,169 +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.
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
-#include <gtest/gtest.h>
-
-#if LANG_CXX11
-#include <google/protobuf/stubs/type_traits.h>
-#endif
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace cpp {
-
-// Can't use an anonymous namespace here due to brokenness of Tru64 compiler.
-namespace cpp_unittest {
-
-// Moves are enabled only when compiling with a C++11 compiler or newer.
-#if LANG_CXX11
-
-TEST(MovableMessageTest, MoveConstructor) {
-  protobuf_unittest::TestAllTypes message1;
-  TestUtil::SetAllFields(&message1);
-  const auto* nested = &message1.optional_nested_message();
-
-  protobuf_unittest::TestAllTypes message2(std::move(message1));
-  TestUtil::ExpectAllFieldsSet(message2);
-
-  // Check if the optional_nested_message was actually moved (and not just
-  // copied).
-  EXPECT_EQ(nested, &message2.optional_nested_message());
-  EXPECT_NE(nested, &message1.optional_nested_message());
-}
-
-TEST(MovableMessageTest, MoveAssignmentOperator) {
-  protobuf_unittest::TestAllTypes message1;
-  TestUtil::SetAllFields(&message1);
-  const auto* nested = &message1.optional_nested_message();
-
-  protobuf_unittest::TestAllTypes message2;
-  message2 = std::move(message1);
-  TestUtil::ExpectAllFieldsSet(message2);
-
-  // Check if the optional_nested_message was actually moved (and not just
-  // copied).
-  EXPECT_EQ(nested, &message2.optional_nested_message());
-  EXPECT_NE(nested, &message1.optional_nested_message());
-}
-
-TEST(MovableMessageTest, SelfMoveAssignment) {
-  // The `self` reference is necessary to defeat -Wself-move.
-  protobuf_unittest::TestAllTypes message, &self = message;
-  TestUtil::SetAllFields(&message);
-  message = std::move(self);
-  TestUtil::ExpectAllFieldsSet(message);
-}
-
-TEST(MovableMessageTest, MoveSameArena) {
-  Arena arena;
-
-  auto* message1_on_arena =
-      Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
-  TestUtil::SetAllFields(message1_on_arena);
-  const auto* nested = &message1_on_arena->optional_nested_message();
-
-  auto* message2_on_arena =
-      Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
-
-  // Moving messages on the same arena should lead to swapped pointers.
-  *message2_on_arena = std::move(*message1_on_arena);
-  EXPECT_EQ(nested, &message2_on_arena->optional_nested_message());
-}
-
-TEST(MovableMessageTest, MoveDifferentArenas) {
-  Arena arena1, arena2;
-
-  auto* message1_on_arena =
-      Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena1);
-  TestUtil::SetAllFields(message1_on_arena);
-  const auto* nested = &message1_on_arena->optional_nested_message();
-
-  auto* message2_on_arena =
-      Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena2);
-
-  // Moving messages on two different arenas should lead to a copy.
-  *message2_on_arena = std::move(*message1_on_arena);
-  EXPECT_NE(nested, &message2_on_arena->optional_nested_message());
-  TestUtil::ExpectAllFieldsSet(*message1_on_arena);
-  TestUtil::ExpectAllFieldsSet(*message2_on_arena);
-}
-
-TEST(MovableMessageTest, MoveFromArena) {
-  Arena arena;
-
-  auto* message1_on_arena =
-      Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
-  TestUtil::SetAllFields(message1_on_arena);
-  const auto* nested = &message1_on_arena->optional_nested_message();
-
-  protobuf_unittest::TestAllTypes message2;
-
-  // Moving from a message on the arena should lead to a copy.
-  message2 = std::move(*message1_on_arena);
-  EXPECT_NE(nested, &message2.optional_nested_message());
-  TestUtil::ExpectAllFieldsSet(*message1_on_arena);
-  TestUtil::ExpectAllFieldsSet(message2);
-}
-
-TEST(MovableMessageTest, MoveToArena) {
-  Arena arena;
-
-  protobuf_unittest::TestAllTypes message1;
-  TestUtil::SetAllFields(&message1);
-  const auto* nested = &message1.optional_nested_message();
-
-  auto* message2_on_arena =
-      Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
-
-  // Moving to a message on the arena should lead to a copy.
-  *message2_on_arena = std::move(message1);
-  EXPECT_NE(nested, &message2_on_arena->optional_nested_message());
-  TestUtil::ExpectAllFieldsSet(message1);
-  TestUtil::ExpectAllFieldsSet(*message2_on_arena);
-}
-
-TEST(MovableMessageTest, Noexcept) {
-  EXPECT_TRUE(
-      std::is_nothrow_move_constructible<protobuf_unittest::TestAllTypes>());
-  EXPECT_TRUE(std::is_nothrow_move_assignable<protobuf_unittest::TestAllTypes>());
-}
-
-#endif  // LANG_CXX11
-
-}  // namespace cpp_unittest
-
-}  // namespace cpp
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/compiler/cpp/cpp_options.h b/src/google/protobuf/compiler/cpp/cpp_options.h
index 4a29ad0..ab1d2ed 100644
--- a/src/google/protobuf/compiler/cpp/cpp_options.h
+++ b/src/google/protobuf/compiler/cpp/cpp_options.h
@@ -39,8 +39,6 @@
 namespace google {
 namespace protobuf {
 namespace compiler {
-class AccessInfoMap;
-
 namespace cpp {
 
 // Generator options (see generator.cc for a description of each):
@@ -48,26 +46,16 @@
   Options()
       : safe_boundary_check(false),
         proto_h(false),
-        transitive_pb_h(true),
         annotate_headers(false),
-        enforce_lite(false),
-        table_driven_parsing(false),
-        table_driven_serialization(false),
-        lite_implicit_weak_fields(false),
-        access_info_map(NULL) {}
+        enforce_lite(false) {}
 
   string dllexport_decl;
   bool safe_boundary_check;
   bool proto_h;
-  bool transitive_pb_h;
   bool annotate_headers;
   bool enforce_lite;
-  bool table_driven_parsing;
-  bool table_driven_serialization;
-  bool lite_implicit_weak_fields;
   string annotation_pragma_name;
   string annotation_guard_name;
-  const AccessInfoMap* access_info_map;
 };
 
 }  // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc b/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc
deleted file mode 100644
index e930386..0000000
--- a/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc
+++ /dev/null
@@ -1,220 +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.
-
-#include <google/protobuf/compiler/cpp/cpp_padding_optimizer.h>
-
-#include <google/protobuf/compiler/cpp/cpp_helpers.h>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace cpp {
-
-namespace {
-
-// FieldGroup is just a helper for PaddingOptimizer below. It holds a vector of
-// fields that are grouped together because they have compatible alignment, and
-// a preferred location in the final field ordering.
-class FieldGroup {
- public:
-  FieldGroup() : preferred_location_(0) {}
-
-  // A group with a single field.
-  FieldGroup(float preferred_location, const FieldDescriptor* field)
-      : preferred_location_(preferred_location), fields_(1, field) {}
-
-  // Append the fields in 'other' to this group.
-  void Append(const FieldGroup& other) {
-    if (other.fields_.empty()) {
-      return;
-    }
-    // Preferred location is the average among all the fields, so we weight by
-    // the number of fields on each FieldGroup object.
-    preferred_location_ = (preferred_location_ * fields_.size() +
-                           (other.preferred_location_ * other.fields_.size())) /
-                          (fields_.size() + other.fields_.size());
-    fields_.insert(fields_.end(), other.fields_.begin(), other.fields_.end());
-  }
-
-  void SetPreferredLocation(float location) { preferred_location_ = location; }
-  const std::vector<const FieldDescriptor*>& fields() const { return fields_; }
-
-  // FieldGroup objects sort by their preferred location.
-  bool operator<(const FieldGroup& other) const {
-    return preferred_location_ < other.preferred_location_;
-  }
-
- private:
-  // "preferred_location_" is an estimate of where this group should go in the
-  // final list of fields.  We compute this by taking the average index of each
-  // field in this group in the original ordering of fields.  This is very
-  // approximate, but should put this group close to where its member fields
-  // originally went.
-  float preferred_location_;
-  std::vector<const FieldDescriptor*> fields_;
-  // We rely on the default copy constructor and operator= so this type can be
-  // used in a vector.
-};
-
-}  // namespace
-
-// Reorder 'fields' so that if the fields are output into a c++ class in the new
-// order, fields of similar family (see below) are together and within each
-// family, alignment padding is minimized.
-//
-// We try to do this while keeping each field as close as possible to its field
-// number order so that we don't reduce cache locality much for function that
-// access each field in order.  Originally, OptimizePadding used declaration
-// order for its decisions, but generated code minus the serializer/parsers uses
-// the output of OptimizePadding as well (stored in
-// MessageGenerator::optimized_order_).  Since the serializers use field number
-// order, we use that as a tie-breaker.
-//
-// We classify each field into a particular "family" of fields, that we perform
-// the same operation on in our generated functions.
-//
-// REPEATED is placed first, as the C++ compiler automatically initializes
-// these fields in layout order.
-//
-// STRING is grouped next, as our Clear/SharedCtor/SharedDtor walks it and
-// calls ArenaStringPtr::Destroy on each.
-//
-//
-// MESSAGE is grouped next, as our Clear/SharedDtor code walks it and calls
-// delete on each.  We initialize these fields with a NULL pointer (see
-// MessageFieldGenerator::GenerateConstructorCode), which allows them to be
-// memset.
-//
-// ZERO_INITIALIZABLE is memset in Clear/SharedCtor
-//
-// OTHER these fields are initialized one-by-one.
-void PaddingOptimizer::OptimizeLayout(
-    std::vector<const FieldDescriptor*>* fields, const Options& options) {
-  // The sorted numeric order of Family determines the declaration order in the
-  // memory layout.
-  enum Family {
-    REPEATED = 0,
-    STRING = 1,
-    MESSAGE = 3,
-    ZERO_INITIALIZABLE = 4,
-    OTHER = 5,
-    kMaxFamily
-  };
-
-  // First divide fields into those that align to 1 byte, 4 bytes or 8 bytes.
-  std::vector<FieldGroup> aligned_to_1[kMaxFamily];
-  std::vector<FieldGroup> aligned_to_4[kMaxFamily];
-  std::vector<FieldGroup> aligned_to_8[kMaxFamily];
-  for (int i = 0; i < fields->size(); ++i) {
-    const FieldDescriptor* field = (*fields)[i];
-
-    Family f = OTHER;
-    if (field->is_repeated()) {
-      f = REPEATED;
-    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
-      f = STRING;
-    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      f = MESSAGE;
-
-    } else if (CanInitializeByZeroing(field)) {
-      f = ZERO_INITIALIZABLE;
-    }
-
-    const int j = field->number();
-    switch (EstimateAlignmentSize(field)) {
-      case 1:
-        aligned_to_1[f].push_back(FieldGroup(j, field));
-        break;
-      case 4:
-        aligned_to_4[f].push_back(FieldGroup(j, field));
-        break;
-      case 8:
-        aligned_to_8[f].push_back(FieldGroup(j, field));
-        break;
-      default:
-        GOOGLE_LOG(FATAL) << "Unknown alignment size " << EstimateAlignmentSize(field)
-                   << "for a field " << field->full_name() << ".";
-    }
-  }
-
-  // For each family, group fields to optimize padding.
-  for (int f = 0; f < kMaxFamily; f++) {
-    // Now group fields aligned to 1 byte into sets of 4, and treat those like a
-    // single field aligned to 4 bytes.
-    for (int i = 0; i < aligned_to_1[f].size(); i += 4) {
-      FieldGroup field_group;
-      for (int j = i; j < aligned_to_1[f].size() && j < i + 4; ++j) {
-        field_group.Append(aligned_to_1[f][j]);
-      }
-      aligned_to_4[f].push_back(field_group);
-    }
-    // Sort by preferred location to keep fields as close to their field number
-    // order as possible.  Using stable_sort ensures that the output is
-    // consistent across runs.
-    std::stable_sort(aligned_to_4[f].begin(), aligned_to_4[f].end());
-
-    // Now group fields aligned to 4 bytes (or the 4-field groups created above)
-    // into pairs, and treat those like a single field aligned to 8 bytes.
-    for (int i = 0; i < aligned_to_4[f].size(); i += 2) {
-      FieldGroup field_group;
-      for (int j = i; j < aligned_to_4[f].size() && j < i + 2; ++j) {
-        field_group.Append(aligned_to_4[f][j]);
-      }
-      if (i == aligned_to_4[f].size() - 1) {
-        if (f == OTHER) {
-          // Move incomplete 4-byte block to the beginning.  This is done to
-          // pair with the (possible) leftover blocks from the
-          // ZERO_INITIALIZABLE family.
-          field_group.SetPreferredLocation(-1);
-        } else {
-          // Move incomplete 4-byte block to the end.
-          field_group.SetPreferredLocation(fields->size() + 1);
-        }
-      }
-      aligned_to_8[f].push_back(field_group);
-    }
-    // Sort by preferred location.
-    std::stable_sort(aligned_to_8[f].begin(), aligned_to_8[f].end());
-  }
-
-  // Now pull out all the FieldDescriptors in order.
-  fields->clear();
-  for (int f = 0; f < kMaxFamily; ++f) {
-    for (int i = 0; i < aligned_to_8[f].size(); ++i) {
-      fields->insert(fields->end(), aligned_to_8[f][i].fields().begin(),
-                     aligned_to_8[f][i].fields().end());
-    }
-  }
-}
-
-}  // namespace cpp
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.h b/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.h
deleted file mode 100644
index 9641ba4..0000000
--- a/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.h
+++ /dev/null
@@ -1,64 +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.
-
-// Author: seongkim@google.com (Seong Beom Kim)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-
-#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__
-#define GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__
-
-#include <google/protobuf/compiler/cpp/cpp_message_layout_helper.h>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace cpp {
-
-// Rearranges the fields of a message to minimize padding.
-// Fields are grouped by the type and the size.
-// For example, grouping four boolean fields and one int32
-// field results in zero padding overhead. See OptimizeLayout's
-// comment for details.
-class PaddingOptimizer : public MessageLayoutHelper {
- public:
-  PaddingOptimizer() {}
-  ~PaddingOptimizer() {}
-
-  void OptimizeLayout(std::vector<const FieldDescriptor*>* fields,
-                      const Options& options);
-};
-
-}  // namespace cpp
-}  // namespace compiler
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__
diff --git a/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
index ceb2270..34a41d8 100644
--- a/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
@@ -132,7 +132,7 @@
     // 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.h", "field_set_allocated:foo.Bar.oneOfMessage", context);
 
     // Check field accessors for an optional enum:
     TryInsert("test.pb.h", "field_get:foo.Bar.optEnum", context);
diff --git a/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc b/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
index bc2d02e..650f038 100644
--- a/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
@@ -80,7 +80,7 @@
 }
 
 void SetPrimitiveVariables(const FieldDescriptor* descriptor,
-                           std::map<string, string>* variables,
+                           map<string, string>* variables,
                            const Options& options) {
   SetCommonFieldVariables(descriptor, variables, options);
   (*variables)["type"] = PrimitiveTypeName(descriptor->cpp_type());
@@ -115,21 +115,21 @@
 
 void PrimitiveFieldGenerator::
 GenerateAccessorDeclarations(io::Printer* printer) const {
-  printer->Print(variables_, "$deprecated_attr$$type$ $name$() const;\n");
-  printer->Annotate("name", descriptor_);
   printer->Print(variables_,
-                 "$deprecated_attr$void ${$set_$name$$}$($type$ value);\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$$type$ $name$() const;\n"
+    "$deprecated_attr$void set_$name$($type$ value);\n");
 }
 
 void PrimitiveFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline $type$ $classname$::$name$() const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer, bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ $type$ $classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  return $name$_;\n"
     "}\n"
-    "inline void $classname$::set_$name$($type$ value) {\n"
+    "$inline$ void $classname$::set_$name$($type$ value) {\n"
     "  $set_hasbit$\n"
     "  $name$_ = value;\n"
     "  // @@protoc_insertion_point(field_set:$full_name$)\n"
@@ -148,7 +148,7 @@
 
 void PrimitiveFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "swap($name$_, other->$name$_);\n");
+  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
 }
 
 void PrimitiveFieldGenerator::
@@ -157,17 +157,12 @@
 }
 
 void PrimitiveFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_ = from.$name$_;\n");
-}
-
-void PrimitiveFieldGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) const {
   printer->Print(variables_,
-    "$set_hasbit$\n"
     "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
     "         $type$, $wire_format_field_type$>(\n"
-    "       input, &$name$_)));\n");
+    "       input, &$name$_)));\n"
+    "$set_hasbit$\n");
 }
 
 void PrimitiveFieldGenerator::
@@ -210,16 +205,18 @@
 PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() {}
 
 void PrimitiveOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline $type$ $classname$::$name$() const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer, bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ $type$ $classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  if (has_$name$()) {\n"
     "    return $oneof_prefix$$name$_;\n"
     "  }\n"
     "  return $default$;\n"
     "}\n"
-    "inline void $classname$::set_$name$($type$ value) {\n"
+    "$inline$ void $classname$::set_$name$($type$ value) {\n"
     "  if (!has_$name$()) {\n"
     "    clear_$oneof_name$();\n"
     "    set_has_$name$();\n"
@@ -241,8 +238,9 @@
 
 void PrimitiveOneofFieldGenerator::
 GenerateConstructorCode(io::Printer* printer) const {
-  printer->Print(variables_,
-                 "$ns$::_$classname$_default_instance_.$name$_ = $default$;\n");
+  printer->Print(
+      variables_,
+      "  $classname$_default_oneof_instance_->$name$_ = $default$;\n");
 }
 
 void PrimitiveOneofFieldGenerator::
@@ -287,46 +285,40 @@
 void RepeatedPrimitiveFieldGenerator::
 GenerateAccessorDeclarations(io::Printer* printer) const {
   printer->Print(variables_,
-                 "$deprecated_attr$$type$ $name$(int index) const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$set_$name$$}$(int index, $type$ value);\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$$type$ $name$(int index) const;\n"
+    "$deprecated_attr$void set_$name$(int index, $type$ value);\n"
+    "$deprecated_attr$void add_$name$($type$ value);\n");
   printer->Print(variables_,
-                 "$deprecated_attr$void ${$add_$name$$}$($type$ value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$const ::google::protobuf::RepeatedField< $type$ >&\n"
-                 "    $name$() const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$::google::protobuf::RepeatedField< $type$ >*\n"
-                 "    ${$mutable_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$const ::google::protobuf::RepeatedField< $type$ >&\n"
+    "    $name$() const;\n"
+    "$deprecated_attr$::google::protobuf::RepeatedField< $type$ >*\n"
+    "    mutable_$name$();\n");
 }
 
 void RepeatedPrimitiveFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline $type$ $classname$::$name$(int index) const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer, bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ $type$ $classname$::$name$(int index) const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  return $name$_.Get(index);\n"
     "}\n"
-    "inline void $classname$::set_$name$(int index, $type$ value) {\n"
+    "$inline$ void $classname$::set_$name$(int index, $type$ value) {\n"
     "  $name$_.Set(index, value);\n"
     "  // @@protoc_insertion_point(field_set:$full_name$)\n"
     "}\n"
-    "inline void $classname$::add_$name$($type$ value) {\n"
+    "$inline$ void $classname$::add_$name$($type$ value) {\n"
     "  $name$_.Add(value);\n"
     "  // @@protoc_insertion_point(field_add:$full_name$)\n"
-    "}\n"
-    "inline const ::google::protobuf::RepeatedField< $type$ >&\n"
+    "}\n");
+  printer->Print(variables,
+    "$inline$ const ::google::protobuf::RepeatedField< $type$ >&\n"
     "$classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_list:$full_name$)\n"
     "  return $name$_;\n"
     "}\n"
-    "inline ::google::protobuf::RepeatedField< $type$ >*\n"
+    "$inline$ ::google::protobuf::RepeatedField< $type$ >*\n"
     "$classname$::mutable_$name$() {\n"
     "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
     "  return &$name$_;\n"
@@ -345,7 +337,7 @@
 
 void RepeatedPrimitiveFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n");
+  printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n");
 }
 
 void RepeatedPrimitiveFieldGenerator::
@@ -354,16 +346,11 @@
 }
 
 void RepeatedPrimitiveFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.CopyFrom(from.$name$_);\n");
-}
-
-void RepeatedPrimitiveFieldGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) const {
   printer->Print(variables_,
     "DO_((::google::protobuf::internal::WireFormatLite::$repeated_reader$<\n"
     "         $type$, $wire_format_field_type$>(\n"
-    "       $tag_size$, $tag$u, input, this->mutable_$name$())));\n");
+    "       $tag_size$, $tag$, input, this->mutable_$name$())));\n");
 }
 
 void RepeatedPrimitiveFieldGenerator::
@@ -376,7 +363,6 @@
 
 void RepeatedPrimitiveFieldGenerator::
 GenerateSerializeWithCachedSizes(io::Printer* printer) const {
-  bool array_written = false;
   if (descriptor_->is_packed()) {
     // Write the tag and the size.
     printer->Print(variables_,
@@ -385,34 +371,21 @@
           "$number$, "
           "::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, "
           "output);\n"
-      "  output->WriteVarint32(static_cast< ::google::protobuf::uint32>(\n"
-      "      _$name$_cached_byte_size_));\n");
-
-    if (FixedSize(descriptor_->type()) > 0) {
-      // TODO(ckennelly): Use RepeatedField<T>::unsafe_data() via
-      // WireFormatLite to access the contents of this->$name$_ to save a branch
-      // here.
-      printer->Print(variables_,
-        "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$Array(\n"
-        "    this->$name$().data(), this->$name$_size(), output);\n");
-      array_written = true;  // Wrote array all at once
-    }
-    printer->Print(variables_, "}\n");
+      "  output->WriteVarint32(_$name$_cached_byte_size_);\n"
+      "}\n");
   }
-  if (!array_written) {
+  printer->Print(variables_,
+      "for (int i = 0; i < this->$name$_size(); i++) {\n");
+  if (descriptor_->is_packed()) {
     printer->Print(variables_,
-        "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n");
-    if (descriptor_->is_packed()) {
-      printer->Print(variables_,
-        "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\n"
-        "    this->$name$(i), output);\n");
-    } else {
-      printer->Print(variables_,
-        "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n"
-        "    $number$, this->$name$(i), output);\n");
-    }
-    printer->Print("}\n");
+      "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\n"
+      "    this->$name$(i), output);\n");
+  } else {
+    printer->Print(variables_,
+      "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n"
+      "    $number$, this->$name$(i), output);\n");
   }
+  printer->Print("}\n");
 }
 
 void RepeatedPrimitiveFieldGenerator::
@@ -426,50 +399,54 @@
       "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n"
       "    target);\n"
       "  target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n"
-      "      static_cast< ::google::protobuf::int32>(\n"
-      "          _$name$_cached_byte_size_), target);\n"
-      "  target = ::google::protobuf::internal::WireFormatLite::\n"
-      "    Write$declared_type$NoTagToArray(this->$name$_, target);\n"
+      "    _$name$_cached_byte_size_, target);\n"
       "}\n");
+  }
+  printer->Print(variables_,
+      "for (int i = 0; i < this->$name$_size(); i++) {\n");
+  if (descriptor_->is_packed()) {
+    printer->Print(variables_,
+      "  target = ::google::protobuf::internal::WireFormatLite::\n"
+      "    Write$declared_type$NoTagToArray(this->$name$(i), target);\n");
   } else {
     printer->Print(variables_,
-      "target = ::google::protobuf::internal::WireFormatLite::\n"
-      "  Write$declared_type$ToArray($number$, this->$name$_, target);\n");
+      "  target = ::google::protobuf::internal::WireFormatLite::\n"
+      "    Write$declared_type$ToArray($number$, this->$name$(i), target);\n");
   }
+  printer->Print("}\n");
 }
 
 void RepeatedPrimitiveFieldGenerator::
 GenerateByteSize(io::Printer* printer) const {
-  printer->Print(variables_, "{\n");
+  printer->Print(variables_,
+    "{\n"
+    "  int data_size = 0;\n");
   printer->Indent();
   int fixed_size = FixedSize(descriptor_->type());
   if (fixed_size == -1) {
     printer->Print(variables_,
-      "size_t data_size = ::google::protobuf::internal::WireFormatLite::\n"
-      "  $declared_type$Size(this->$name$_);\n");
+      "for (int i = 0; i < this->$name$_size(); i++) {\n"
+      "  data_size += ::google::protobuf::internal::WireFormatLite::\n"
+      "    $declared_type$Size(this->$name$(i));\n"
+      "}\n");
   } else {
     printer->Print(variables_,
-      "unsigned int count = static_cast<unsigned int>(this->$name$_size());\n"
-      "size_t data_size = $fixed_size$UL * count;\n");
+      "data_size = $fixed_size$ * this->$name$_size();\n");
   }
 
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
       "if (data_size > 0) {\n"
       "  total_size += $tag_size$ +\n"
-      "    ::google::protobuf::internal::WireFormatLite::Int32Size(\n"
-      "        static_cast< ::google::protobuf::int32>(data_size));\n"
+      "    ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n"
       "}\n"
-      "int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);\n"
       "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
-      "_$name$_cached_byte_size_ = cached_size;\n"
+      "_$name$_cached_byte_size_ = data_size;\n"
       "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
       "total_size += data_size;\n");
   } else {
     printer->Print(variables_,
-      "total_size += $tag_size$ *\n"
-      "              ::google::protobuf::internal::FromIntSize(this->$name$_size());\n"
-      "total_size += data_size;\n");
+      "total_size += $tag_size$ * this->$name$_size() + data_size;\n");
   }
   printer->Outdent();
   printer->Print("}\n");
diff --git a/src/google/protobuf/compiler/cpp/cpp_primitive_field.h b/src/google/protobuf/compiler/cpp/cpp_primitive_field.h
index d52228e..655ebde 100644
--- a/src/google/protobuf/compiler/cpp/cpp_primitive_field.h
+++ b/src/google/protobuf/compiler/cpp/cpp_primitive_field.h
@@ -53,12 +53,12 @@
   // implements FieldGenerator ---------------------------------------
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
@@ -66,7 +66,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);
@@ -79,7 +79,8 @@
   ~PrimitiveOneofFieldGenerator();
 
   // implements FieldGenerator ---------------------------------------
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
@@ -98,12 +99,12 @@
   // implements FieldGenerator ---------------------------------------
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
@@ -112,7 +113,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/cpp/cpp_service.cc b/src/google/protobuf/compiler/cpp/cpp_service.cc
index 95357d9..226c2aa 100644
--- a/src/google/protobuf/compiler/cpp/cpp_service.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_service.cc
@@ -46,7 +46,6 @@
                                    const Options& options)
   : descriptor_(descriptor) {
   vars_["classname"] = descriptor_->name();
-  vars_["file_namespace"] = FileLevelNamespace(descriptor_->file()->name());
   vars_["full_name"] = descriptor_->full_name();
   if (options.dllexport_decl.empty()) {
     vars_["dllexport"] = "";
@@ -144,7 +143,7 @@
     VirtualOrNon virtual_or_non, io::Printer* printer) {
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> sub_vars;
+    map<string, string> sub_vars;
     sub_vars["name"] = method->name();
     sub_vars["input_type"] = ClassName(method->input_type(), true);
     sub_vars["output_type"] = ClassName(method->output_type(), true);
@@ -162,7 +161,7 @@
 
 void ServiceGenerator::GenerateDescriptorInitializer(
     io::Printer* printer, int index) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["classname"] = descriptor_->name();
   vars["index"] = SimpleItoa(index);
 
@@ -173,20 +172,19 @@
 // ===================================================================
 
 void ServiceGenerator::GenerateImplementation(io::Printer* printer) {
-  vars_["index"] = SimpleItoa(index_in_metadata_);
-  printer->Print(
-      vars_,
-      "$classname$::~$classname$() {}\n"
-      "\n"
-      "const ::google::protobuf::ServiceDescriptor* $classname$::descriptor() {\n"
-      "  $file_namespace$::protobuf_AssignDescriptorsOnce();\n"
-      "  return $file_namespace$::file_level_service_descriptors[$index$];\n"
-      "}\n"
-      "\n"
-      "const ::google::protobuf::ServiceDescriptor* $classname$::GetDescriptor() {\n"
-      "  return descriptor();\n"
-      "}\n"
-      "\n");
+  printer->Print(vars_,
+    "$classname$::~$classname$() {}\n"
+    "\n"
+    "const ::google::protobuf::ServiceDescriptor* $classname$::descriptor() {\n"
+    "  protobuf_AssignDescriptorsOnce();\n"
+    "  return $classname$_descriptor_;\n"
+    "}\n"
+    "\n"
+    "const ::google::protobuf::ServiceDescriptor* $classname$::GetDescriptor() {\n"
+    "  protobuf_AssignDescriptorsOnce();\n"
+    "  return $classname$_descriptor_;\n"
+    "}\n"
+    "\n");
 
   // Generate methods of the interface.
   GenerateNotImplementedMethods(printer);
@@ -214,7 +212,7 @@
 void ServiceGenerator::GenerateNotImplementedMethods(io::Printer* printer) {
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> sub_vars;
+    map<string, string> sub_vars;
     sub_vars["classname"] = descriptor_->name();
     sub_vars["name"] = method->name();
     sub_vars["index"] = SimpleItoa(i);
@@ -234,20 +232,18 @@
 }
 
 void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
-  printer->Print(
-      vars_,
-      "void $classname$::CallMethod(const ::google::protobuf::MethodDescriptor* method,\n"
-      "                             ::google::protobuf::RpcController* controller,\n"
-      "                             const ::google::protobuf::Message* request,\n"
-      "                             ::google::protobuf::Message* response,\n"
-      "                             ::google::protobuf::Closure* done) {\n"
-      "  GOOGLE_DCHECK_EQ(method->service(), "
-      "$file_namespace$::file_level_service_descriptors[$index$]);\n"
-      "  switch(method->index()) {\n");
+  printer->Print(vars_,
+    "void $classname$::CallMethod(const ::google::protobuf::MethodDescriptor* method,\n"
+    "                             ::google::protobuf::RpcController* controller,\n"
+    "                             const ::google::protobuf::Message* request,\n"
+    "                             ::google::protobuf::Message* response,\n"
+    "                             ::google::protobuf::Closure* done) {\n"
+    "  GOOGLE_DCHECK_EQ(method->service(), $classname$_descriptor_);\n"
+    "  switch(method->index()) {\n");
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> sub_vars;
+    map<string, string> sub_vars;
     sub_vars["name"] = method->name();
     sub_vars["index"] = SimpleItoa(i);
     sub_vars["input_type"] = ClassName(method->input_type(), true);
@@ -293,7 +289,7 @@
     const Descriptor* type =
       (which == REQUEST) ? method->input_type() : method->output_type();
 
-    std::map<string, string> sub_vars;
+    map<string, string> sub_vars;
     sub_vars["index"] = SimpleItoa(i);
     sub_vars["type"] = ClassName(type, true);
 
@@ -302,21 +298,19 @@
       "      return $type$::default_instance();\n");
   }
 
-  printer->Print(
+  printer->Print(vars_,
     "    default:\n"
     "      GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n"
-    "      return *::google::protobuf::MessageFactory::generated_factory()\n"
-    "          ->GetPrototype(method->$input_or_output$_type());\n"
+    "      return *static_cast< ::google::protobuf::Message*>(NULL);\n"
     "  }\n"
     "}\n"
-    "\n",
-    "input_or_output", which == REQUEST ? "input" : "output");
+    "\n");
 }
 
 void ServiceGenerator::GenerateStubMethods(io::Printer* printer) {
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> sub_vars;
+    map<string, string> sub_vars;
     sub_vars["classname"] = descriptor_->name();
     sub_vars["name"] = method->name();
     sub_vars["index"] = SimpleItoa(i);
diff --git a/src/google/protobuf/compiler/cpp/cpp_service.h b/src/google/protobuf/compiler/cpp/cpp_service.h
index 33c0254..ede2fd8 100644
--- a/src/google/protobuf/compiler/cpp/cpp_service.h
+++ b/src/google/protobuf/compiler/cpp/cpp_service.h
@@ -105,11 +105,8 @@
   void GenerateStubMethods(io::Printer* printer);
 
   const ServiceDescriptor* descriptor_;
-  std::map<string, string> vars_;
+  map<string, string> vars_;
 
-  int index_in_metadata_;
-
-  friend class FileGenerator;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator);
 };
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
index 264f612..1d74345 100644
--- a/src/google/protobuf/compiler/cpp/cpp_string_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
@@ -36,7 +36,6 @@
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
-
 #include <google/protobuf/stubs/strutil.h>
 
 namespace google {
@@ -47,22 +46,22 @@
 namespace {
 
 void SetStringVariables(const FieldDescriptor* descriptor,
-                        std::map<string, string>* variables,
+                        map<string, string>* variables,
                         const Options& options) {
   SetCommonFieldVariables(descriptor, variables, options);
   (*variables)["default"] = DefaultValue(descriptor);
   (*variables)["default_length"] =
       SimpleItoa(descriptor->default_value_string().length());
-  string default_variable_string = "_default_" + FieldName(descriptor) + "_";
-  (*variables)["default_variable_name"] = default_variable_string;
-  (*variables)["default_variable"] =
+  string default_variable_string =
       descriptor->default_value_string().empty()
           ? "&::google::protobuf::internal::GetEmptyStringAlreadyInited()"
-          : "&" + Namespace(descriptor) + "::" + (*variables)["classname"] +
-                "::" + default_variable_string + ".get()";
+          : "_default_" + FieldName(descriptor) + "_";
+  (*variables)["default_variable"] = default_variable_string;
+  (*variables)["default_value_init"] =
+      descriptor->default_value_string().empty()
+      ? "" : "*" + default_variable_string;
   (*variables)["pointer_type"] =
       descriptor->type() == FieldDescriptor::TYPE_BYTES ? "void" : "char";
-  (*variables)["null_check"] = "GOOGLE_DCHECK(value != NULL);\n";
   // NOTE: Escaped here to unblock proto1->proto2 migration.
   // TODO(liujisi): Extend this to apply for other conflicting methods.
   (*variables)["release_name"] =
@@ -71,9 +70,6 @@
   (*variables)["full_name"] = descriptor->full_name();
 
   (*variables)["string_piece"] = "::std::string";
-
-  (*variables)["lite"] =
-      HasDescriptorMethods(descriptor->file(), options) ? "" : "Lite";
 }
 
 }  // namespace
@@ -82,8 +78,7 @@
 
 StringFieldGenerator::StringFieldGenerator(const FieldDescriptor* descriptor,
                                            const Options& options)
-    : FieldGenerator(options), descriptor_(descriptor),
-    lite_(!HasDescriptorMethods(descriptor->file(), options)) {
+    : FieldGenerator(options), descriptor_(descriptor) {
   SetStringVariables(descriptor, &variables_, options);
 }
 
@@ -109,9 +104,7 @@
 void StringFieldGenerator::
 GenerateStaticMembers(io::Printer* printer) const {
   if (!descriptor_->default_value_string().empty()) {
-    printer->Print(variables_,
-                   "static ::google::protobuf::internal::ExplicitlyConstructed< ::std::string>"
-                   " $default_variable_name$;\n");
+    printer->Print(variables_, "static ::std::string* $default_variable$;\n");
   }
 }
 
@@ -146,55 +139,22 @@
   }
 
   printer->Print(variables_,
-                 "$deprecated_attr$const ::std::string& $name$() const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$set_$name$$}$(const ::std::string& value);\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  printer->Print(variables_,
-                 "#if LANG_CXX11\n"
-                 "$deprecated_attr$void ${$set_$name$$}$(::std::string&& value);\n"
-                 "#endif\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$set_$name$$}$(const char* value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$void ${$set_$name$$}$(const $pointer_type$* "
-                 "value, size_t size)"
-                 ";\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$::std::string* ${$mutable_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_, "$deprecated_attr$::std::string* $release_name$();\n");
-  printer->Annotate("release_name", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$set_allocated_$name$$}$(::std::string* $name$);\n");
-  printer->Annotate("{", "}", descriptor_);
+    "$deprecated_attr$const ::std::string& $name$() const;\n"
+    "$deprecated_attr$void set_$name$(const ::std::string& value);\n"
+    "$deprecated_attr$void set_$name$(const char* value);\n"
+    "$deprecated_attr$void set_$name$(const $pointer_type$* value, size_t size)"
+                 ";\n"
+    "$deprecated_attr$::std::string* mutable_$name$();\n"
+    "$deprecated_attr$::std::string* $release_name$();\n"
+    "$deprecated_attr$void set_allocated_$name$(::std::string* $name$);\n");
   if (SupportsArenas(descriptor_)) {
-    printer->Print(
-        variables_,
-        "PROTOBUF_RUNTIME_DEPRECATED(\"The unsafe_arena_ accessors for\"\n"
-        "\"    string fields are deprecated and will be removed in a\"\n"
-        "\"    future release.\")\n"
-        "::std::string* ${$unsafe_arena_release_$name$$}$();\n");
-    printer->Annotate("{", "}", descriptor_);
-    printer->Print(
-        variables_,
-        "PROTOBUF_RUNTIME_DEPRECATED(\"The unsafe_arena_ accessors for\"\n"
-        "\"    string fields are deprecated and will be removed in a\"\n"
-        "\"    future release.\")\n"
-        "void ${$unsafe_arena_set_allocated_$name$$}$(\n"
-        "    ::std::string* $name$);\n");
-    printer->Annotate("{", "}", descriptor_);
+    printer->Print(variables_,
+      "$deprecated_attr$::std::string* unsafe_arena_release_$name$();\n"
+      "$deprecated_attr$void unsafe_arena_set_allocated_$name$(\n"
+      "    ::std::string* $name$);\n");
   }
 
+
   if (unknown_ctype) {
     printer->Outdent();
     printer->Print(" public:\n");
@@ -203,138 +163,119 @@
 }
 
 void StringFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
   if (SupportsArenas(descriptor_)) {
-    printer->Print(
-        variables_,
-        "inline const ::std::string& $classname$::$name$() const {\n"
-        "  // @@protoc_insertion_point(field_get:$full_name$)\n"
-        "  return $name$_.Get();\n"
-        "}\n"
-        "inline void $classname$::set_$name$(const ::std::string& value) {\n"
-        "  $set_hasbit$\n"
-        "  $name$_.Set$lite$($default_variable$, value, GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "}\n"
-        "#if LANG_CXX11\n"
-        "inline void $classname$::set_$name$(::std::string&& value) {\n"
-        "  $set_hasbit$\n"
-        "  $name$_.Set$lite$(\n"
-        "    $default_variable$, ::std::move(value), GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n"
-        "}\n"
-        "#endif\n"
-        "inline void $classname$::set_$name$(const char* value) {\n"
-        "  $null_check$"
-        "  $set_hasbit$\n"
-        "  $name$_.Set$lite$($default_variable$, $string_piece$(value),\n"
-        "              GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
-        "}\n"
-        "inline "
-        "void $classname$::set_$name$(const $pointer_type$* value,\n"
-        "    size_t size) {\n"
-        "  $set_hasbit$\n"
-        "  $name$_.Set$lite$($default_variable$, $string_piece$(\n"
-        "      reinterpret_cast<const char*>(value), size), "
-        "GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::mutable_$name$() {\n"
-        "  $set_hasbit$\n"
-        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
-        "  return $name$_.Mutable($default_variable$, GetArenaNoVirtual());\n"
-        "}\n"
-        "inline ::std::string* $classname$::$release_name$() {\n"
-        "  // @@protoc_insertion_point(field_release:$full_name$)\n"
-        "  $clear_hasbit$\n"
-        "  return $name$_.Release($default_variable$, GetArenaNoVirtual());\n"
-        "}\n"
-        "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
-        "  if ($name$ != NULL) {\n"
-        "    $set_hasbit$\n"
-        "  } else {\n"
-        "    $clear_hasbit$\n"
-        "  }\n"
-        "  $name$_.SetAllocated($default_variable$, $name$,\n"
-        "      GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::unsafe_arena_release_$name$() {\n"
-        "  // "
-        "@@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n"
-        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
-        "  $clear_hasbit$\n"
-        "  return $name$_.UnsafeArenaRelease($default_variable$,\n"
-        "      GetArenaNoVirtual());\n"
-        "}\n"
-        "inline void $classname$::unsafe_arena_set_allocated_$name$(\n"
-        "    ::std::string* $name$) {\n"
-        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
-        "  if ($name$ != NULL) {\n"
-        "    $set_hasbit$\n"
-        "  } else {\n"
-        "    $clear_hasbit$\n"
-        "  }\n"
-        "  $name$_.UnsafeArenaSetAllocated($default_variable$,\n"
-        "      $name$, GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
-        "$full_name$)\n"
-        "}\n");
+    printer->Print(variables,
+      "$inline$ const ::std::string& $classname$::$name$() const {\n"
+      "  // @@protoc_insertion_point(field_get:$full_name$)\n"
+      "  return $name$_.Get($default_variable$);\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n"
+      "  $set_hasbit$\n"
+      "  $name$_.Set($default_variable$, value, GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set:$full_name$)\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const char* value) {\n"
+      "  $set_hasbit$\n"
+      "  $name$_.Set($default_variable$, $string_piece$(value),\n"
+      "              GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
+      "}\n"
+      "$inline$ "
+      "void $classname$::set_$name$(const $pointer_type$* value,\n"
+      "    size_t size) {\n"
+      "  $set_hasbit$\n"
+      "  $name$_.Set($default_variable$, $string_piece$(\n"
+      "      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::mutable_$name$() {\n"
+      "  $set_hasbit$\n"
+      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
+      "  return $name$_.Mutable($default_variable$, GetArenaNoVirtual());\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  $clear_hasbit$\n"
+      "  return $name$_.Release($default_variable$, GetArenaNoVirtual());\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::unsafe_arena_release_$name$() {\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n"
+      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
+      "  $clear_hasbit$\n"
+      "  return $name$_.UnsafeArenaRelease($default_variable$,\n"
+      "      GetArenaNoVirtual());\n"
+      "}\n"
+      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
+      "  if ($name$ != NULL) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      "  $name$_.SetAllocated($default_variable$, $name$,\n"
+      "      GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n"
+      "$inline$ void $classname$::unsafe_arena_set_allocated_$name$(\n"
+      "    ::std::string* $name$) {\n"
+      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
+      "  if ($name$ != NULL) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      "  $name$_.UnsafeArenaSetAllocated($default_variable$,\n"
+      "      $name$, GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
+      "$full_name$)\n"
+      "}\n");
   } else {
     // No-arena case.
-    printer->Print(
-        variables_,
-        "inline const ::std::string& $classname$::$name$() const {\n"
-        "  // @@protoc_insertion_point(field_get:$full_name$)\n"
-        "  return $name$_.GetNoArena();\n"
-        "}\n"
-        "inline void $classname$::set_$name$(const ::std::string& value) {\n"
-        "  $set_hasbit$\n"
-        "  $name$_.SetNoArena($default_variable$, value);\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "}\n"
-        "#if LANG_CXX11\n"
-        "inline void $classname$::set_$name$(::std::string&& value) {\n"
-        "  $set_hasbit$\n"
-        "  $name$_.SetNoArena(\n"
-        "    $default_variable$, ::std::move(value));\n"
-        "  // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n"
-        "}\n"
-        "#endif\n"
-        "inline void $classname$::set_$name$(const char* value) {\n"
-        "  $null_check$"
-        "  $set_hasbit$\n"
-        "  $name$_.SetNoArena($default_variable$, $string_piece$(value));\n"
-        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
-        "}\n"
-        "inline "
-        "void $classname$::set_$name$(const $pointer_type$* value, "
-        "size_t size) {\n"
-        "  $set_hasbit$\n"
-        "  $name$_.SetNoArena($default_variable$,\n"
-        "      $string_piece$(reinterpret_cast<const char*>(value), size));\n"
-        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::mutable_$name$() {\n"
-        "  $set_hasbit$\n"
-        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
-        "  return $name$_.MutableNoArena($default_variable$);\n"
-        "}\n"
-        "inline ::std::string* $classname$::$release_name$() {\n"
-        "  // @@protoc_insertion_point(field_release:$full_name$)\n"
-        "  $clear_hasbit$\n"
-        "  return $name$_.ReleaseNoArena($default_variable$);\n"
-        "}\n"
-        "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
-        "  if ($name$ != NULL) {\n"
-        "    $set_hasbit$\n"
-        "  } else {\n"
-        "    $clear_hasbit$\n"
-        "  }\n"
-        "  $name$_.SetAllocatedNoArena($default_variable$, $name$);\n"
-        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
-        "}\n");
+    printer->Print(variables,
+      "$inline$ const ::std::string& $classname$::$name$() const {\n"
+      "  // @@protoc_insertion_point(field_get:$full_name$)\n"
+      "  return $name$_.GetNoArena($default_variable$);\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n"
+      "  $set_hasbit$\n"
+      "  $name$_.SetNoArena($default_variable$, value);\n"
+      "  // @@protoc_insertion_point(field_set:$full_name$)\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const char* value) {\n"
+      "  $set_hasbit$\n"
+      "  $name$_.SetNoArena($default_variable$, $string_piece$(value));\n"
+      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
+      "}\n"
+      "$inline$ "
+      "void $classname$::set_$name$(const $pointer_type$* value, "
+      "size_t size) {\n"
+      "  $set_hasbit$\n"
+      "  $name$_.SetNoArena($default_variable$,\n"
+      "      $string_piece$(reinterpret_cast<const char*>(value), size));\n"
+      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::mutable_$name$() {\n"
+      "  $set_hasbit$\n"
+      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
+      "  return $name$_.MutableNoArena($default_variable$);\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  $clear_hasbit$\n"
+      "  return $name$_.ReleaseNoArena($default_variable$);\n"
+      "}\n"
+      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
+      "  if ($name$ != NULL) {\n"
+      "    $set_hasbit$\n"
+      "  } else {\n"
+      "    $clear_hasbit$\n"
+      "  }\n"
+      "  $name$_.SetAllocatedNoArena($default_variable$, $name$);\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n");
   }
 }
 
@@ -343,8 +284,7 @@
   if (!descriptor_->default_value_string().empty()) {
     // Initialized in GenerateDefaultInstanceAllocator.
     printer->Print(variables_,
-                   "::google::protobuf::internal::ExplicitlyConstructed< ::std::string> "
-                   "$classname$::$default_variable_name$;\n");
+      "::std::string* $classname$::$default_variable$ = NULL;\n");
   }
 }
 
@@ -374,52 +314,6 @@
 }
 
 void StringFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
-  // Two-dimension specialization here: supporting arenas, field presence, or
-  // not, and default value is the empty string or not. Complexity here ensures
-  // the minimal number of branches / amount of extraneous code at runtime
-  // (given that the below methods are inlined one-liners)!
-
-  // 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());
-
-  if (must_be_present) {
-    printer->Print(variables_,
-      "GOOGLE_DCHECK(!$name$_.IsDefault($default_variable$));\n");
-  }
-
-  if (SupportsArenas(descriptor_)) {
-    if (descriptor_->default_value_string().empty()) {
-      printer->Print(variables_,
-        "$name$_.ClearToEmpty($default_variable$, GetArenaNoVirtual());\n");
-    } else {
-      printer->Print(variables_,
-        "$name$_.ClearToDefault($default_variable$, GetArenaNoVirtual());\n");
-    }
-  } else if (must_be_present) {
-    // When Arenas are disabled and field presence has been checked, we can
-    // safely treat the ArenaStringPtr as a string*.
-    if (descriptor_->default_value_string().empty()) {
-      printer->Print(variables_,
-        "(*$name$_.UnsafeRawStringPointer())->clear();\n");
-    } else {
-      printer->Print(variables_,
-        "(*$name$_.UnsafeRawStringPointer())->assign(*$default_variable$);\n");
-    }
-  } else {
-    if (descriptor_->default_value_string().empty()) {
-      printer->Print(variables_,
-        "$name$_.ClearToEmptyNoArena($default_variable$);\n");
-    } else {
-      printer->Print(variables_,
-        "$name$_.ClearToDefaultNoArena($default_variable$);\n");
-    }
-  }
-}
-
-void StringFieldGenerator::
 GenerateMergingCode(io::Printer* printer) const {
   if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) {
     // TODO(gpike): improve this
@@ -443,50 +337,30 @@
 }
 
 void StringFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  GenerateConstructorCode(printer);
-
-  if (HasFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-        "if (from.has_$name$()) {\n");
-  } else {
-    printer->Print(variables_,
-        "if (from.$name$().size() > 0) {\n");
-  }
-
-  printer->Indent();
-
-  if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) {
-    // TODO(gpike): improve this
-    printer->Print(variables_,
-      "$name$_.Set$lite$($default_variable$, from.$name$(),\n"
-      "  GetArenaNoVirtual());\n");
-  } else {
-    printer->Print(variables_,
-      "$name$_.AssignWithDefault($default_variable$, from.$name$_);\n");
-  }
-
-  printer->Outdent();
-  printer->Print("}\n");
-}
-
-void StringFieldGenerator::
 GenerateDestructorCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_.DestroyNoArena($default_variable$);\n");
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+      "$name$_.Destroy($default_variable$, GetArenaNoVirtual());\n");
+  } else {
+    printer->Print(variables_,
+      "$name$_.DestroyNoArena($default_variable$);\n");
+  }
 }
 
 void StringFieldGenerator::
 GenerateDefaultInstanceAllocator(io::Printer* printer) const {
   if (!descriptor_->default_value_string().empty()) {
-    printer->Print(
-        variables_,
-        "$ns$::$classname$::$default_variable_name$.DefaultConstruct();\n"
-        "*$ns$::$classname$::$default_variable_name$.get_mutable() = "
-        "::std::string($default$, $default_length$);\n"
-        "::google::protobuf::internal::OnShutdownDestroyString(\n"
-        "    $ns$::$classname$::$default_variable_name$.get_mutable());\n"
-    );
+    printer->Print(variables_,
+      "$classname$::$default_variable$ =\n"
+      "    new ::std::string($default$, $default_length$);\n");
+  }
+}
+
+void StringFieldGenerator::
+GenerateShutdownCode(io::Printer* printer) const {
+  if (!descriptor_->default_value_string().empty()) {
+    printer->Print(variables_,
+      "delete $classname$::$default_variable$;\n");
   }
 }
 
@@ -499,8 +373,7 @@
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, true, variables_,
-        "this->$name$().data(), static_cast<int>(this->$name$().length()),\n",
-        printer);
+        "this->$name$().data(), this->$name$().length(),\n", printer);
   }
 }
 
@@ -509,8 +382,7 @@
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, false, variables_,
-        "this->$name$().data(), static_cast<int>(this->$name$().length()),\n",
-        printer);
+        "this->$name$().data(), this->$name$().length(),\n", printer);
   }
   printer->Print(variables_,
     "::google::protobuf::internal::WireFormatLite::Write$declared_type$MaybeAliased(\n"
@@ -522,8 +394,7 @@
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, false, variables_,
-        "this->$name$().data(), static_cast<int>(this->$name$().length()),\n",
-        printer);
+        "this->$name$().data(), this->$name$().length(),\n", printer);
   }
   printer->Print(variables_,
     "target =\n"
@@ -552,252 +423,238 @@
 StringOneofFieldGenerator::~StringOneofFieldGenerator() {}
 
 void StringOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
   if (SupportsArenas(descriptor_)) {
-    printer->Print(
-        variables_,
-        "inline const ::std::string& $classname$::$name$() const {\n"
-        "  // @@protoc_insertion_point(field_get:$full_name$)\n"
-        "  if (has_$name$()) {\n"
-        "    return $oneof_prefix$$name$_.Get();\n"
-        "  }\n"
-        "  return *$default_variable$;\n"
-        "}\n"
-        "inline void $classname$::set_$name$(const ::std::string& value) {\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.Set$lite$($default_variable$, value,\n"
-        "      GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "}\n"
-        "#if LANG_CXX11\n"
-        "inline void $classname$::set_$name$(::std::string&& value) {\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.Set$lite$(\n"
-        "    $default_variable$, ::std::move(value), GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n"
-        "}\n"
-        "#endif\n"
-        "inline void $classname$::set_$name$(const char* value) {\n"
-        "  $null_check$"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.Set$lite$($default_variable$,\n"
-        "      $string_piece$(value), GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
-        "}\n"
-        "inline "
-        "void $classname$::set_$name$(const $pointer_type$* value,\n"
-        "                             size_t size) {\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.Set$lite$(\n"
-        "      $default_variable$, $string_piece$(\n"
-        "      reinterpret_cast<const char*>(value), size),\n"
-        "      GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::mutable_$name$() {\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  return $oneof_prefix$$name$_.Mutable($default_variable$,\n"
-        "      GetArenaNoVirtual());\n"
-        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::$release_name$() {\n"
-        "  // @@protoc_insertion_point(field_release:$full_name$)\n"
-        "  if (has_$name$()) {\n"
-        "    clear_has_$oneof_name$();\n"
-        "    return $oneof_prefix$$name$_.Release($default_variable$,\n"
-        "        GetArenaNoVirtual());\n"
-        "  } else {\n"
-        "    return NULL;\n"
-        "  }\n"
-        "}\n"
-        "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
-        "  if (!has_$name$()) {\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  clear_$oneof_name$();\n"
-        "  if ($name$ != NULL) {\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.SetAllocated($default_variable$, $name$,\n"
-        "        GetArenaNoVirtual());\n"
-        "  }\n"
-        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::unsafe_arena_release_$name$() {\n"
-        "  // "
-        "@@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n"
-        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
-        "  if (has_$name$()) {\n"
-        "    clear_has_$oneof_name$();\n"
-        "    return $oneof_prefix$$name$_.UnsafeArenaRelease(\n"
-        "        $default_variable$, GetArenaNoVirtual());\n"
-        "  } else {\n"
-        "    return NULL;\n"
-        "  }\n"
-        "}\n"
-        "inline void $classname$::unsafe_arena_set_allocated_$name$("
-        "::std::string* $name$) {\n"
-        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
-        "  if (!has_$name$()) {\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  clear_$oneof_name$();\n"
-        "  if ($name$) {\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeArenaSetAllocated($default_variable$, "
-        "$name$, GetArenaNoVirtual());\n"
-        "  }\n"
-        "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
-        "$full_name$)\n"
-        "}\n");
+    printer->Print(variables,
+      "$inline$ const ::std::string& $classname$::$name$() const {\n"
+      "  // @@protoc_insertion_point(field_get:$full_name$)\n"
+      "  if (has_$name$()) {\n"
+      "    return $oneof_prefix$$name$_.Get($default_variable$);\n"
+      "  }\n"
+      "  return *$default_variable$;\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  $oneof_prefix$$name$_.Set($default_variable$, value,\n"
+      "      GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set:$full_name$)\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const char* value) {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  $oneof_prefix$$name$_.Set($default_variable$,\n"
+      "      $string_piece$(value), GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
+      "}\n"
+      "$inline$ "
+      "void $classname$::set_$name$(const $pointer_type$* value,\n"
+      "                             size_t size) {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  $oneof_prefix$$name$_.Set($default_variable$, $string_piece$(\n"
+      "      reinterpret_cast<const char*>(value), size),\n"
+      "      GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::mutable_$name$() {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  return $oneof_prefix$$name$_.Mutable($default_variable$,\n"
+      "      GetArenaNoVirtual());\n"
+      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  if (has_$name$()) {\n"
+      "    clear_has_$oneof_name$();\n"
+      "    return $oneof_prefix$$name$_.Release($default_variable$,\n"
+      "        GetArenaNoVirtual());\n"
+      "  } else {\n"
+      "    return NULL;\n"
+      "  }\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::unsafe_arena_release_$name$() {\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n"
+      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
+      "  if (has_$name$()) {\n"
+      "    clear_has_$oneof_name$();\n"
+      "    return $oneof_prefix$$name$_.UnsafeArenaRelease(\n"
+      "        $default_variable$, GetArenaNoVirtual());\n"
+      "  } else {\n"
+      "    return NULL;\n"
+      "  }\n"
+      "}\n"
+      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
+      "  if (!has_$name$()) {\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  clear_$oneof_name$();\n"
+      "  if ($name$ != NULL) {\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.SetAllocated($default_variable$, $name$,\n"
+      "        GetArenaNoVirtual());\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n"
+      "$inline$ void $classname$::unsafe_arena_set_allocated_$name$("
+      "::std::string* $name$) {\n"
+      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n"
+      "  if (!has_$name$()) {\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  clear_$oneof_name$();\n"
+      "  if ($name$) {\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeArenaSetAllocated($default_variable$, "
+      "$name$, GetArenaNoVirtual());\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
+      "$full_name$)\n"
+      "}\n");
   } else {
     // No-arena case.
-    printer->Print(
-        variables_,
-        "inline const ::std::string& $classname$::$name$() const {\n"
-        "  // @@protoc_insertion_point(field_get:$full_name$)\n"
-        "  if (has_$name$()) {\n"
-        "    return $oneof_prefix$$name$_.GetNoArena();\n"
-        "  }\n"
-        "  return *$default_variable$;\n"
-        "}\n"
-        "inline void $classname$::set_$name$(const ::std::string& value) {\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.SetNoArena($default_variable$, value);\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "}\n"
-        "#if LANG_CXX11\n"
-        "inline void $classname$::set_$name$(::std::string&& value) {\n"
-        "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.SetNoArena(\n"
-        "    $default_variable$, ::std::move(value));\n"
-        "  // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n"
-        "}\n"
-        "#endif\n"
-        "inline void $classname$::set_$name$(const char* value) {\n"
-        "  $null_check$"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.SetNoArena($default_variable$,\n"
-        "      $string_piece$(value));\n"
-        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
-        "}\n"
-        "inline "
-        "void $classname$::set_$name$(const $pointer_type$* value, size_t "
-        "size) {\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  $oneof_prefix$$name$_.SetNoArena($default_variable$, "
-        "$string_piece$(\n"
-        "      reinterpret_cast<const char*>(value), size));\n"
-        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
-        "}\n"
-        "inline ::std::string* $classname$::mutable_$name$() {\n"
-        "  if (!has_$name$()) {\n"
-        "    clear_$oneof_name$();\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
-        "  return $oneof_prefix$$name$_.MutableNoArena($default_variable$);\n"
-        "}\n"
-        "inline ::std::string* $classname$::$release_name$() {\n"
-        "  // @@protoc_insertion_point(field_release:$full_name$)\n"
-        "  if (has_$name$()) {\n"
-        "    clear_has_$oneof_name$();\n"
-        "    return $oneof_prefix$$name$_.ReleaseNoArena($default_variable$);\n"
-        "  } else {\n"
-        "    return NULL;\n"
-        "  }\n"
-        "}\n"
-        "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
-        "  if (!has_$name$()) {\n"
-        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
-        "  }\n"
-        "  clear_$oneof_name$();\n"
-        "  if ($name$ != NULL) {\n"
-        "    set_has_$name$();\n"
-        "    $oneof_prefix$$name$_.SetAllocatedNoArena($default_variable$,\n"
-        "        $name$);\n"
-        "  }\n"
-        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
-        "}\n");
+    printer->Print(variables,
+      "$inline$ const ::std::string& $classname$::$name$() const {\n"
+      "  // @@protoc_insertion_point(field_get:$full_name$)\n"
+      "  if (has_$name$()) {\n"
+      "    return $oneof_prefix$$name$_.GetNoArena($default_variable$);\n"
+      "  }\n"
+      "  return *$default_variable$;\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n"
+      "  // @@protoc_insertion_point(field_set:$full_name$)\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  $oneof_prefix$$name$_.SetNoArena($default_variable$, value);\n"
+      "  // @@protoc_insertion_point(field_set:$full_name$)\n"
+      "}\n"
+      "$inline$ void $classname$::set_$name$(const char* value) {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  $oneof_prefix$$name$_.SetNoArena($default_variable$,\n"
+      "      $string_piece$(value));\n"
+      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
+      "}\n"
+      "$inline$ "
+      "void $classname$::set_$name$(const $pointer_type$* value, size_t size) {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  $oneof_prefix$$name$_.SetNoArena($default_variable$, $string_piece$(\n"
+      "      reinterpret_cast<const char*>(value), size));\n"
+      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::mutable_$name$() {\n"
+      "  if (!has_$name$()) {\n"
+      "    clear_$oneof_name$();\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
+      "  return $oneof_prefix$$name$_.MutableNoArena($default_variable$);\n"
+      "}\n"
+      "$inline$ ::std::string* $classname$::$release_name$() {\n"
+      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
+      "  if (has_$name$()) {\n"
+      "    clear_has_$oneof_name$();\n"
+      "    return $oneof_prefix$$name$_.ReleaseNoArena($default_variable$);\n"
+      "  } else {\n"
+      "    return NULL;\n"
+      "  }\n"
+      "}\n"
+      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n"
+      "  if (!has_$name$()) {\n"
+      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n"
+      "  }\n"
+      "  clear_$oneof_name$();\n"
+      "  if ($name$ != NULL) {\n"
+      "    set_has_$name$();\n"
+      "    $oneof_prefix$$name$_.SetAllocatedNoArena($default_variable$,\n"
+      "        $name$);\n"
+      "  }\n"
+      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
+      "}\n");
   }
 }
 
 void StringOneofFieldGenerator::
 GenerateClearingCode(io::Printer* printer) const {
-  if (SupportsArenas(descriptor_)) {
-    printer->Print(variables_,
-      "$oneof_prefix$$name$_.Destroy($default_variable$,\n"
-      "    GetArenaNoVirtual());\n");
+  map<string, string> variables(variables_);
+  if (dependent_field_) {
+    variables["this_message"] = DependentBaseDownCast();
+    // This clearing code may be in the dependent base class. If the default
+    // value is an empty string, then the $default_variable$ is a global
+    // singleton. If the default is not empty, we need to down-cast to get the
+    // default value's global singleton instance. See SetStringVariables() for
+    // possible values of default_variable.
+    if (!descriptor_->default_value_string().empty()) {
+      variables["default_variable"] =
+          DependentBaseDownCast() + variables["default_variable"];
+    }
   } else {
-    printer->Print(variables_,
-      "$oneof_prefix$$name$_."
+    variables["this_message"] = "";
+  }
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables,
+      "$this_message$$oneof_prefix$$name$_.Destroy($default_variable$,\n"
+      "    $this_message$GetArenaNoVirtual());\n");
+  } else {
+    printer->Print(variables,
+      "$this_message$$oneof_prefix$$name$_."
       "DestroyNoArena($default_variable$);\n");
   }
 }
 
 void StringOneofFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
-  return GenerateClearingCode(printer);
-}
-
-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 {
-  printer->Print(
-      variables_,
-      "$ns$::_$classname$_default_instance_.$name$_.UnsafeSetDefault(\n"
-      "    $default_variable$);\n");
+  printer->Print(variables_,
+    "  $classname$_default_oneof_instance_->$name$_.UnsafeSetDefault("
+    "$default_variable$);\n");
 }
 
 void StringOneofFieldGenerator::
 GenerateDestructorCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (has_$name$()) {\n"
-    "  $oneof_prefix$$name$_.DestroyNoArena($default_variable$);\n"
-    "}\n");
+  if (SupportsArenas(descriptor_)) {
+    printer->Print(variables_,
+      "if (has_$name$()) {\n"
+      "  $oneof_prefix$$name$_.Destroy($default_variable$,\n"
+      "      GetArenaNoVirtual());\n"
+      "}\n");
+  } else {
+    printer->Print(variables_,
+      "if (has_$name$()) {\n"
+      "  $oneof_prefix$$name$_.DestroyNoArena($default_variable$);\n"
+      "}\n");
+  }
 }
 
 void StringOneofFieldGenerator::
@@ -809,8 +666,7 @@
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, true, variables_,
-        "this->$name$().data(), static_cast<int>(this->$name$().length()),\n",
-        printer);
+        "this->$name$().data(), this->$name$().length(),\n", printer);
   }
 }
 
@@ -846,62 +702,24 @@
   }
 
   printer->Print(variables_,
-                 "$deprecated_attr$const ::std::string& $name$(int index) const;\n");
-  printer->Annotate("name", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$::std::string* ${$mutable_$name$$}$(int index);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$void ${$set_$name$$}$(int index, const "
-                 "::std::string& value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(
-      variables_,
-      "#if LANG_CXX11\n"
-      "$deprecated_attr$void ${$set_$name$$}$(int index, ::std::string&& value);\n"
-      "#endif\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$void ${$set_$name$$}$(int index, const "
-                 "char* value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 ""
-                 "$deprecated_attr$void ${$set_$name$$}$("
-                 "int index, const $pointer_type$* value, size_t size);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$::std::string* ${$add_$name$$}$();\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$add_$name$$}$(const ::std::string& value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "#if LANG_CXX11\n"
-                 "$deprecated_attr$void ${$add_$name$$}$(::std::string&& value);\n"
-                 "#endif\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$void ${$add_$name$$}$(const char* value);\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(variables_,
-                 "$deprecated_attr$void ${$add_$name$$}$(const $pointer_type$* "
-                 "value, size_t size)"
+    "$deprecated_attr$const ::std::string& $name$(int index) const;\n"
+    "$deprecated_attr$::std::string* mutable_$name$(int index);\n"
+    "$deprecated_attr$void set_$name$(int index, const ::std::string& value);\n"
+    "$deprecated_attr$void set_$name$(int index, const char* value);\n"
+    ""
+    "$deprecated_attr$void set_$name$("
+                 "int index, const $pointer_type$* value, size_t size);\n"
+    "$deprecated_attr$::std::string* add_$name$();\n"
+    "$deprecated_attr$void add_$name$(const ::std::string& value);\n"
+    "$deprecated_attr$void add_$name$(const char* value);\n"
+    "$deprecated_attr$void add_$name$(const $pointer_type$* value, size_t size)"
                  ";\n");
-  printer->Annotate("{", "}", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< ::std::string>& $name$() "
-      "const;\n");
-  printer->Annotate("name", descriptor_);
+
   printer->Print(variables_,
-                 "$deprecated_attr$::google::protobuf::RepeatedPtrField< ::std::string>* "
-                 "${$mutable_$name$$}$()"
+    "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< ::std::string>& $name$() "
+                 "const;\n"
+    "$deprecated_attr$::google::protobuf::RepeatedPtrField< ::std::string>* mutable_$name$()"
                  ";\n");
-  printer->Annotate("{", "}", descriptor_);
 
   if (unknown_ctype) {
     printer->Outdent();
@@ -911,68 +729,58 @@
 }
 
 void RepeatedStringFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
-  printer->Print(variables_,
-    "inline const ::std::string& $classname$::$name$(int index) const {\n"
+GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                  bool is_inline) const {
+  map<string, string> variables(variables_);
+  variables["inline"] = is_inline ? "inline" : "";
+  printer->Print(variables,
+    "$inline$ const ::std::string& $classname$::$name$(int index) const {\n"
     "  // @@protoc_insertion_point(field_get:$full_name$)\n"
     "  return $name$_.$cppget$(index);\n"
     "}\n"
-    "inline ::std::string* $classname$::mutable_$name$(int index) {\n"
+    "$inline$ ::std::string* $classname$::mutable_$name$(int index) {\n"
     "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
     "  return $name$_.Mutable(index);\n"
     "}\n"
-    "inline void $classname$::set_$name$(int index, const ::std::string& value) {\n"
+    "$inline$ void $classname$::set_$name$(int index, const ::std::string& value) {\n"
     "  // @@protoc_insertion_point(field_set:$full_name$)\n"
     "  $name$_.Mutable(index)->assign(value);\n"
     "}\n"
-    "#if LANG_CXX11\n"
-    "inline void $classname$::set_$name$(int index, ::std::string&& value) {\n"
-    "  // @@protoc_insertion_point(field_set:$full_name$)\n"
-    "  $name$_.Mutable(index)->assign(std::move(value));\n"
-    "}\n"
-    "#endif\n"
-    "inline void $classname$::set_$name$(int index, const char* value) {\n"
-    "  $null_check$"
+    "$inline$ void $classname$::set_$name$(int index, const char* value) {\n"
     "  $name$_.Mutable(index)->assign(value);\n"
     "  // @@protoc_insertion_point(field_set_char:$full_name$)\n"
     "}\n"
-    "inline void "
+    "$inline$ void "
     "$classname$::set_$name$"
     "(int index, const $pointer_type$* value, size_t size) {\n"
     "  $name$_.Mutable(index)->assign(\n"
     "    reinterpret_cast<const char*>(value), size);\n"
     "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n"
     "}\n"
-    "inline ::std::string* $classname$::add_$name$() {\n"
+    "$inline$ ::std::string* $classname$::add_$name$() {\n"
     "  // @@protoc_insertion_point(field_add_mutable:$full_name$)\n"
     "  return $name$_.Add();\n"
     "}\n"
-    "inline void $classname$::add_$name$(const ::std::string& value) {\n"
+    "$inline$ void $classname$::add_$name$(const ::std::string& value) {\n"
     "  $name$_.Add()->assign(value);\n"
     "  // @@protoc_insertion_point(field_add:$full_name$)\n"
     "}\n"
-    "#if LANG_CXX11\n"
-    "inline void $classname$::add_$name$(::std::string&& value) {\n"
-    "  $name$_.Add(std::move(value));\n"
-    "  // @@protoc_insertion_point(field_add:$full_name$)\n"
-    "}\n"
-    "#endif\n"
-    "inline void $classname$::add_$name$(const char* value) {\n"
-    "  $null_check$"
+    "$inline$ void $classname$::add_$name$(const char* value) {\n"
     "  $name$_.Add()->assign(value);\n"
     "  // @@protoc_insertion_point(field_add_char:$full_name$)\n"
     "}\n"
-    "inline void "
+    "$inline$ void "
     "$classname$::add_$name$(const $pointer_type$* value, size_t size) {\n"
     "  $name$_.Add()->assign(reinterpret_cast<const char*>(value), size);\n"
     "  // @@protoc_insertion_point(field_add_pointer:$full_name$)\n"
-    "}\n"
-    "inline const ::google::protobuf::RepeatedPtrField< ::std::string>&\n"
+    "}\n");
+  printer->Print(variables,
+    "$inline$ const ::google::protobuf::RepeatedPtrField< ::std::string>&\n"
     "$classname$::$name$() const {\n"
     "  // @@protoc_insertion_point(field_list:$full_name$)\n"
     "  return $name$_;\n"
     "}\n"
-    "inline ::google::protobuf::RepeatedPtrField< ::std::string>*\n"
+    "$inline$ ::google::protobuf::RepeatedPtrField< ::std::string>*\n"
     "$classname$::mutable_$name$() {\n"
     "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
     "  return &$name$_;\n"
@@ -991,7 +799,7 @@
 
 void RepeatedStringFieldGenerator::
 GenerateSwappingCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n");
+  printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n");
 }
 
 void RepeatedStringFieldGenerator::
@@ -1000,11 +808,6 @@
 }
 
 void RepeatedStringFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_.CopyFrom(from.$name$_);");
-}
-
-void RepeatedStringFieldGenerator::
 GenerateMergeFromCodedStream(io::Printer* printer) const {
   printer->Print(variables_,
     "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n"
@@ -1013,7 +816,7 @@
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, true, variables_,
         "this->$name$(this->$name$_size() - 1).data(),\n"
-        "static_cast<int>(this->$name$(this->$name$_size() - 1).length()),\n",
+        "this->$name$(this->$name$_size() - 1).length(),\n",
         printer);
   }
 }
@@ -1021,13 +824,12 @@
 void RepeatedStringFieldGenerator::
 GenerateSerializeWithCachedSizes(io::Printer* printer) const {
   printer->Print(variables_,
-        "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n");
+    "for (int i = 0; i < this->$name$_size(); i++) {\n");
   printer->Indent();
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, false, variables_,
-        "this->$name$(i).data(), static_cast<int>(this->$name$(i).length()),\n",
-        printer);
+        "this->$name$(i).data(), this->$name$(i).length(),\n", printer);
   }
   printer->Outdent();
   printer->Print(variables_,
@@ -1039,13 +841,12 @@
 void RepeatedStringFieldGenerator::
 GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
   printer->Print(variables_,
-    "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n");
+    "for (int i = 0; i < this->$name$_size(); i++) {\n");
   printer->Indent();
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
         descriptor_, options_, false, variables_,
-        "this->$name$(i).data(), static_cast<int>(this->$name$(i).length()),\n",
-        printer);
+        "this->$name$(i).data(), this->$name$(i).length(),\n", printer);
   }
   printer->Outdent();
   printer->Print(variables_,
@@ -1057,9 +858,8 @@
 void RepeatedStringFieldGenerator::
 GenerateByteSize(io::Printer* printer) const {
   printer->Print(variables_,
-    "total_size += $tag_size$ *\n"
-    "    ::google::protobuf::internal::FromIntSize(this->$name$_size());\n"
-    "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n"
+    "total_size += $tag_size$ * this->$name$_size();\n"
+    "for (int i = 0; i < this->$name$_size(); i++) {\n"
     "  total_size += ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
     "    this->$name$(i));\n"
     "}\n");
diff --git a/src/google/protobuf/compiler/cpp/cpp_string_field.h b/src/google/protobuf/compiler/cpp/cpp_string_field.h
index f56f072..cb4e877 100644
--- a/src/google/protobuf/compiler/cpp/cpp_string_field.h
+++ b/src/google/protobuf/compiler/cpp/cpp_string_field.h
@@ -54,16 +54,16 @@
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateStaticMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const;
   void GenerateClearingCode(io::Printer* printer) const;
-  void GenerateMessageClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
   void GenerateDestructorCode(io::Printer* printer) const;
   void GenerateDefaultInstanceAllocator(io::Printer* printer) const;
+  void GenerateShutdownCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
@@ -71,8 +71,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
-  const bool lite_;
+  map<string, string> variables_;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator);
@@ -85,12 +84,9 @@
   ~StringOneofFieldGenerator();
 
   // implements FieldGenerator ---------------------------------------
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
-
-  // StringFieldGenerator, from which we inherit, overrides this so we need to
-  // override it as well.
-  void GenerateMessageClearingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
   void GenerateDestructorCode(io::Printer* printer) const;
@@ -110,12 +106,12 @@
   // implements FieldGenerator ---------------------------------------
   void GeneratePrivateMembers(io::Printer* printer) const;
   void GenerateAccessorDeclarations(io::Printer* printer) const;
-  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;
+  void GenerateInlineAccessorDefinitions(io::Printer* printer,
+                                         bool is_inline) const;
   void GenerateClearingCode(io::Printer* printer) const;
   void GenerateMergingCode(io::Printer* printer) const;
   void GenerateSwappingCode(io::Printer* printer) const;
   void GenerateConstructorCode(io::Printer* printer) const;
-  void GenerateCopyConstructorCode(io::Printer* printer) const;
   void GenerateMergeFromCodedStream(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizes(io::Printer* printer) const;
   void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;
@@ -123,7 +119,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto b/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto
index 7fe9875..4e25b2e 100644
--- a/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto
+++ b/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto
@@ -151,10 +151,6 @@
 
 message DummyMessage {}
 
-// Message names that could conflict.
-message Shutdown {}
-message TableStruct {}
-
 service TestConflictingMethodNames {
   rpc Closure(DummyMessage) returns (DummyMessage);
 }
diff --git a/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_unittest.cc
index 61cc32a..5d82946 100644
--- a/src/google/protobuf/compiler/cpp/cpp_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_unittest.cc
@@ -53,7 +53,6 @@
 #include <vector>
 
 #include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_no_arena.pb.h>
 #include <google/protobuf/unittest_optimize_for.pb.h>
 #include <google/protobuf/unittest_embed_optimize_for.pb.h>
 #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER)
@@ -68,7 +67,6 @@
 #include <google/protobuf/compiler/importer.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/arena.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/dynamic_message.h>
@@ -76,6 +74,7 @@
 #include <google/protobuf/stubs/callback.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
@@ -130,12 +129,12 @@
 
   // Test that descriptors are generated correctly by converting them to
   // FileDescriptorProtos and comparing.
-  FileDescriptorProto generated_descriptor_proto, parsed_descriptor_proto;
-  generated_descriptor->CopyTo(&generated_descriptor_proto);
+  FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto;
+  generated_descriptor->CopyTo(&generated_decsriptor_proto);
   parsed_descriptor->CopyTo(&parsed_descriptor_proto);
 
   EXPECT_EQ(parsed_descriptor_proto.DebugString(),
-            generated_descriptor_proto.DebugString());
+            generated_decsriptor_proto.DebugString());
 }
 
 #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER)
@@ -200,14 +199,14 @@
   EXPECT_EQ(-1.5f, extreme_default.negative_float());
   EXPECT_EQ(2.0e8f, extreme_default.large_float());
   EXPECT_EQ(-8e-28f, extreme_default.small_negative_float());
-  EXPECT_EQ(std::numeric_limits<double>::infinity(),
+  EXPECT_EQ(numeric_limits<double>::infinity(),
             extreme_default.inf_double());
-  EXPECT_EQ(-std::numeric_limits<double>::infinity(),
+  EXPECT_EQ(-numeric_limits<double>::infinity(),
             extreme_default.neg_inf_double());
   EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double());
-  EXPECT_EQ(std::numeric_limits<float>::infinity(),
+  EXPECT_EQ(numeric_limits<float>::infinity(),
             extreme_default.inf_float());
-  EXPECT_EQ(-std::numeric_limits<float>::infinity(),
+  EXPECT_EQ(-numeric_limits<float>::infinity(),
             extreme_default.neg_inf_float());
   EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float());
 }
@@ -420,71 +419,6 @@
   EXPECT_EQ("wx", message.repeated_string(0));
 }
 
-#if LANG_CXX11
-TEST(GeneratedMessageTest, StringMove) {
-  // Verify that we trigger the move behavior on a scalar setter.
-  protobuf_unittest_no_arena::TestAllTypes message;
-  {
-    string tmp(32, 'a');
-
-    const char* old_data = tmp.data();
-    message.set_optional_string(std::move(tmp));
-    const char* new_data = message.optional_string().data();
-
-    EXPECT_EQ(old_data, new_data);
-    EXPECT_EQ(string(32, 'a'), message.optional_string());
-
-    string tmp2(32, 'b');
-    old_data = tmp2.data();
-    message.set_optional_string(std::move(tmp2));
-    new_data = message.optional_string().data();
-
-    EXPECT_EQ(old_data, new_data);
-    EXPECT_EQ(string(32, 'b'), message.optional_string());
-  }
-
-  // Verify that we trigger the move behavior on a oneof setter.
-  {
-    string tmp(32, 'a');
-
-    const char* old_data = tmp.data();
-    message.set_oneof_string(std::move(tmp));
-    const char* new_data = message.oneof_string().data();
-
-    EXPECT_EQ(old_data, new_data);
-    EXPECT_EQ(string(32, 'a'), message.oneof_string());
-
-    string tmp2(32, 'b');
-    old_data = tmp2.data();
-    message.set_oneof_string(std::move(tmp2));
-    new_data = message.oneof_string().data();
-
-    EXPECT_EQ(old_data, new_data);
-    EXPECT_EQ(string(32, 'b'), message.oneof_string());
-  }
-
-  // Verify that we trigger the move behavior on a repeated setter.
-  {
-    string tmp(32, 'a');
-
-    const char* old_data = tmp.data();
-    message.add_repeated_string(std::move(tmp));
-    const char* new_data = message.repeated_string(0).data();
-
-    EXPECT_EQ(old_data, new_data);
-    EXPECT_EQ(string(32, 'a'), message.repeated_string(0));
-
-    string tmp2(32, 'b');
-    old_data = tmp2.data();
-    message.set_repeated_string(0, std::move(tmp2));
-    new_data = message.repeated_string(0).data();
-
-    EXPECT_EQ(old_data, new_data);
-    EXPECT_EQ(string(32, 'b'), message.repeated_string(0));
-  }
-}
-#endif
-
 
 TEST(GeneratedMessageTest, CopyFrom) {
   unittest::TestAllTypes message1, message2;
@@ -576,93 +510,12 @@
   EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1));
 }
 
-TEST(GeneratedMessageTest, ADLSwap) {
-  unittest::TestAllTypes message1, message2;
+TEST(GeneratedMessageTest, CopyConstructor) {
+  unittest::TestAllTypes message1;
   TestUtil::SetAllFields(&message1);
 
-  // Note the address of one of the repeated fields, to verify it was swapped
-  // rather than copied.
-  const int32* addr = &message1.repeated_int32().Get(0);
-
-  using std::swap;
-  swap(message1, message2);
-
+  unittest::TestAllTypes message2(message1);
   TestUtil::ExpectAllFieldsSet(message2);
-  TestUtil::ExpectClear(message1);
-
-  EXPECT_EQ(addr, &message2.repeated_int32().Get(0));
-}
-
-TEST(GeneratedMessageTest, CopyConstructor) {
-  // All set.
-  {
-    unittest::TestAllTypes message1;
-    TestUtil::SetAllFields(&message1);
-
-    unittest::TestAllTypes message2(message1);
-    TestUtil::ExpectAllFieldsSet(message2);
-  }
-
-  // None set.
-  {
-    unittest::TestAllTypes message1;
-    unittest::TestAllTypes message2(message1);
-
-    EXPECT_FALSE(message1.has_optional_string());
-    EXPECT_FALSE(message2.has_optional_string());
-    EXPECT_EQ(&message1.optional_string(),
-              &message2.optional_string());
-
-    EXPECT_FALSE(message1.has_optional_bytes());
-    EXPECT_FALSE(message2.has_optional_bytes());
-    EXPECT_EQ(&message1.optional_bytes(),
-              &message2.optional_bytes());
-
-    EXPECT_FALSE(message1.has_optional_nested_message());
-    EXPECT_FALSE(message2.has_optional_nested_message());
-    EXPECT_EQ(&message1.optional_nested_message(),
-              &message2.optional_nested_message());
-
-    EXPECT_FALSE(message1.has_optional_foreign_message());
-    EXPECT_FALSE(message2.has_optional_foreign_message());
-    EXPECT_EQ(&message1.optional_foreign_message(),
-              &message2.optional_foreign_message());
-
-    EXPECT_FALSE(message1.has_optional_import_message());
-    EXPECT_FALSE(message2.has_optional_import_message());
-    EXPECT_EQ(&message1.optional_import_message(),
-              &message2.optional_import_message());
-
-    EXPECT_FALSE(message1.has_optional_public_import_message());
-    EXPECT_FALSE(message2.has_optional_public_import_message());
-    EXPECT_EQ(&message1.optional_public_import_message(),
-              &message2.optional_public_import_message());
-
-    EXPECT_FALSE(message1.has_optional_lazy_message());
-    EXPECT_FALSE(message2.has_optional_lazy_message());
-    EXPECT_EQ(&message1.optional_lazy_message(),
-              &message2.optional_lazy_message());
-  }
-}
-
-TEST(GeneratedMessageTest, CopyConstructorWithArenas) {
-  Arena arena;
-  unittest::TestAllTypes* message1 =
-      Arena::CreateMessage<unittest::TestAllTypes>(&arena);
-  TestUtil::SetAllFields(message1);
-
-  unittest::TestAllTypes message2_stack(*message1);
-  TestUtil::ExpectAllFieldsSet(message2_stack);
-
-  google::protobuf::scoped_ptr<unittest::TestAllTypes> message2_heap(
-      new unittest::TestAllTypes(*message1));
-  TestUtil::ExpectAllFieldsSet(*message2_heap);
-
-  arena.Reset();
-
-  // Verify that the copies are still intact.
-  TestUtil::ExpectAllFieldsSet(message2_stack);
-  TestUtil::ExpectAllFieldsSet(*message2_heap);
 }
 
 TEST(GeneratedMessageTest, CopyAssignmentOperator) {
@@ -744,6 +597,19 @@
   TestUtil::ExpectAllFieldsSet(message1);
 }
 
+#if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \
+    !defined(GOOGLE_PROTOBUF_NO_RTTI)
+#ifdef PROTOBUF_HAS_DEATH_TEST
+
+TEST(GeneratedMessageTest, MergeFromSelf) {
+  unittest::TestAllTypes message;
+  EXPECT_DEATH(message.MergeFrom(message), "Check failed:.*pb[.]cc");
+  EXPECT_DEATH(message.MergeFrom(implicit_cast<const Message&>(message)),
+               "Check failed:.*pb[.]cc");
+}
+
+#endif  // PROTOBUF_HAS_DEATH_TEST
+#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS || !GOOGLE_PROTOBUF_NO_RTTI
 
 // Test the generated SerializeWithCachedSizesToArray(),
 TEST(GeneratedMessageTest, SerializationToArray) {
@@ -1386,7 +1252,7 @@
       foo_(descriptor_->FindMethodByName("Foo")),
       bar_(descriptor_->FindMethodByName("Bar")),
       stub_(&mock_channel_),
-      done_(::google::protobuf::NewPermanentCallback(&DoNothing)) {}
+      done_(::google::protobuf::internal::NewPermanentCallback(&DoNothing)) {}
 
   virtual void SetUp() {
     ASSERT_TRUE(foo_ != NULL);
@@ -2207,61 +2073,6 @@
 
 }
 
-TEST(HelpersTest, TestSCC) {
-  protobuf_unittest::TestMutualRecursionA a;
-  SCCAnalyzer scc_analyzer((Options()));
-  const SCC* scc = scc_analyzer.GetSCC(a.GetDescriptor());
-  std::vector<string> names;
-  for (int i = 0; i < scc->descriptors.size(); i++) {
-    names.push_back(scc->descriptors[i]->full_name());
-  }
-  ASSERT_EQ(names.size(), 4);
-  std::sort(names.begin(), names.end());
-  EXPECT_EQ(names[0], "protobuf_unittest.TestMutualRecursionA");
-  EXPECT_EQ(names[1], "protobuf_unittest.TestMutualRecursionA.SubGroup");
-  EXPECT_EQ(names[2], "protobuf_unittest.TestMutualRecursionA.SubMessage");
-  EXPECT_EQ(names[3], "protobuf_unittest.TestMutualRecursionB");
-
-  MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc);
-  EXPECT_EQ(result.is_recursive, true);
-  EXPECT_EQ(result.contains_required, false);
-  EXPECT_EQ(result.contains_cord, true);  // TestAllTypes
-  EXPECT_EQ(result.contains_extension, false);  // TestAllTypes
-}
-
-TEST(HelpersTest, TestSCCAnalysis) {
-  {
-    protobuf_unittest::TestRecursiveMessage msg;
-    SCCAnalyzer scc_analyzer((Options()));
-    const SCC* scc = scc_analyzer.GetSCC(msg.GetDescriptor());
-    MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc);
-    EXPECT_EQ(result.is_recursive, true);
-    EXPECT_EQ(result.contains_required, false);
-    EXPECT_EQ(result.contains_cord, false);
-    EXPECT_EQ(result.contains_extension, false);
-  }
-  {
-    protobuf_unittest::TestAllExtensions msg;
-    SCCAnalyzer scc_analyzer((Options()));
-    const SCC* scc = scc_analyzer.GetSCC(msg.GetDescriptor());
-    MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc);
-    EXPECT_EQ(result.is_recursive, false);
-    EXPECT_EQ(result.contains_required, false);
-    EXPECT_EQ(result.contains_cord, false);
-    EXPECT_EQ(result.contains_extension, true);
-  }
-  {
-    protobuf_unittest::TestRequired msg;
-    SCCAnalyzer scc_analyzer((Options()));
-    const SCC* scc = scc_analyzer.GetSCC(msg.GetDescriptor());
-    MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc);
-    EXPECT_EQ(result.is_recursive, false);
-    EXPECT_EQ(result.contains_required, true);
-    EXPECT_EQ(result.contains_cord, false);
-    EXPECT_EQ(result.contains_extension, false);
-  }
-}
-
 }  // 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 d1bb319..edd3078 100644
--- a/src/google/protobuf/compiler/cpp/metadata_test.cc
+++ b/src/google/protobuf/compiler/cpp/metadata_test.cc
@@ -35,8 +35,10 @@
 
 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
 #include <google/protobuf/compiler/cpp/cpp_generator.h>
-#include <google/protobuf/compiler/annotation_test_util.h>
 #include <google/protobuf/compiler/command_line_interface.h>
+#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
 
 #include <google/protobuf/testing/file.h>
@@ -45,15 +47,37 @@
 #include <gtest/gtest.h>
 
 namespace google {
-namespace atu = ::google::protobuf::compiler::annotation_test_util;
-
 namespace protobuf {
 namespace compiler {
 namespace cpp {
 namespace {
 
+// A CodeGenerator that captures the FileDescriptor it's passed as a
+// FileDescriptorProto.
+class DescriptorCapturingGenerator : public CodeGenerator {
+ public:
+  // Does not own file; file must outlive the Generator.
+  explicit DescriptorCapturingGenerator(FileDescriptorProto* file)
+      : file_(file) {}
+
+  virtual bool Generate(const FileDescriptor* file, const string& parameter,
+                        GeneratorContext* context, string* error) const {
+    file->CopyTo(file_);
+    return true;
+  }
+
+ private:
+  FileDescriptorProto* file_;
+};
+
 class CppMetadataTest : public ::testing::Test {
  public:
+  // Adds a file with name `filename` and content `data`.
+  void AddFile(const string& filename, const string& data) {
+    GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/" + filename, data,
+                               true));
+  }
+
   // Tries to capture a FileDescriptorProto, GeneratedCodeInfo, and output
   // code from the previously added file with name `filename`. Returns true on
   // success. If pb_h is non-null, expects a .pb.h and a .pb.h.meta (copied to
@@ -63,21 +87,26 @@
                        string* proto_h, GeneratedCodeInfo* proto_h_info,
                        string* pb_cc) {
     google::protobuf::compiler::CommandLineInterface cli;
+    cli.SetInputsAreProtoPathRelative(true);
+
     CppGenerator cpp_generator;
+    DescriptorCapturingGenerator capturing_generator(file);
     cli.RegisterGenerator("--cpp_out", &cpp_generator, "");
+    cli.RegisterGenerator("--capture_out", &capturing_generator, "");
+
+    string proto_path = "-I" + TestTempDir();
     string cpp_out =
         "--cpp_out=annotate_headers=true,"
         "annotation_pragma_name=pragma_name,"
         "annotation_guard_name=guard_name:" +
         TestTempDir();
+    string capture_out = "--capture_out=" + TestTempDir();
 
-    const bool result =
-        atu::CaptureMetadata(filename, cpp_out,
-                             /* meta_file_suffix */ "", &cli, file,
-                             /* outputs */ NULL);
+    const char* argv[] = {"protoc", proto_path.c_str(), cpp_out.c_str(),
+                          capture_out.c_str(), filename.c_str()};
 
-    if (!result) {
-      return result;
+    if (cli.Run(5, argv) != 0) {
+      return false;
     }
 
     string output_base = TestTempDir() + "/" + StripProto(filename);
@@ -90,7 +119,7 @@
     if (pb_h != NULL && pb_h_info != NULL) {
       GOOGLE_CHECK_OK(
           File::GetContents(output_base + ".pb.h", pb_h, true));
-      if (!atu::DecodeMetadata(output_base + ".pb.h.meta", pb_h_info)) {
+      if (!DecodeMetadata(output_base + ".pb.h.meta", pb_h_info)) {
         return false;
       }
     }
@@ -98,13 +127,23 @@
     if (proto_h != NULL && proto_h_info != NULL) {
       GOOGLE_CHECK_OK(File::GetContents(output_base + ".proto.h", proto_h,
                                  true));
-      if (!atu::DecodeMetadata(output_base + ".proto.h.meta", proto_h_info)) {
+      if (!DecodeMetadata(output_base + ".proto.h.meta", proto_h_info)) {
         return false;
       }
     }
 
     return true;
   }
+
+ private:
+  // Decodes GeneratedCodeInfo stored in path and copies it to info.
+  // Returns true on success.
+  bool DecodeMetadata(const string& path, GeneratedCodeInfo* info) {
+    string data;
+    GOOGLE_CHECK_OK(File::GetContents(path, &data, true));
+    io::ArrayInputStream input(data.data(), data.size());
+    return info->ParseFromZeroCopyStream(&input);
+  }
 };
 
 const char kSmallTestFile[] =
@@ -113,28 +152,65 @@
     "enum Enum { VALUE = 0; }\n"
     "message Message { }\n";
 
+// Finds the Annotation for a given source file and path (or returns null if it
+// couldn't).
+const GeneratedCodeInfo::Annotation* FindAnnotationOnPath(
+    const GeneratedCodeInfo& info, const string& source_file,
+    const vector<int>& path) {
+  for (int i = 0; i < info.annotation_size(); ++i) {
+    const GeneratedCodeInfo::Annotation* annotation = &info.annotation(i);
+    if (annotation->source_file() != source_file ||
+        annotation->path_size() != path.size()) {
+      continue;
+    }
+    int node = 0;
+    for (; node < path.size(); ++node) {
+      if (annotation->path(node) != path[node]) {
+        break;
+      }
+    }
+    if (node == path.size()) {
+      return annotation;
+    }
+  }
+  return NULL;
+}
+
+// Returns true if the provided annotation covers a given substring in
+// file_content.
+bool AnnotationMatchesSubstring(const string& file_content,
+                                const GeneratedCodeInfo::Annotation* annotation,
+                                const string& expected_text) {
+  uint32 begin = annotation->begin();
+  uint32 end = annotation->end();
+  if (end < begin || end > file_content.size()) {
+    return false;
+  }
+  return file_content.substr(begin, end - begin) == expected_text;
+}
+
 TEST_F(CppMetadataTest, CapturesEnumNames) {
   FileDescriptorProto file;
   GeneratedCodeInfo info;
   string pb_h;
-  atu::AddFile("test.proto", kSmallTestFile);
+  AddFile("test.proto", kSmallTestFile);
   EXPECT_TRUE(
       CaptureMetadata("test.proto", &file, &pb_h, &info, NULL, NULL, NULL));
   EXPECT_EQ("Enum", file.enum_type(0).name());
-  std::vector<int> enum_path;
+  vector<int> enum_path;
   enum_path.push_back(FileDescriptorProto::kEnumTypeFieldNumber);
   enum_path.push_back(0);
   const GeneratedCodeInfo::Annotation* enum_annotation =
-      atu::FindAnnotationOnPath(info, "test.proto", enum_path);
+      FindAnnotationOnPath(info, "test.proto", enum_path);
   EXPECT_TRUE(NULL != enum_annotation);
-  EXPECT_TRUE(atu::AnnotationMatchesSubstring(pb_h, enum_annotation, "Enum"));
+  EXPECT_TRUE(AnnotationMatchesSubstring(pb_h, enum_annotation, "Enum"));
 }
 
 TEST_F(CppMetadataTest, AddsPragma) {
   FileDescriptorProto file;
   GeneratedCodeInfo info;
   string pb_h;
-  atu::AddFile("test.proto", kSmallTestFile);
+  AddFile("test.proto", kSmallTestFile);
   EXPECT_TRUE(
       CaptureMetadata("test.proto", &file, &pb_h, &info, NULL, NULL, NULL));
   EXPECT_TRUE(pb_h.find("#ifdef guard_name") != string::npos);
@@ -146,18 +222,17 @@
   FileDescriptorProto file;
   GeneratedCodeInfo info;
   string pb_h;
-  atu::AddFile("test.proto", kSmallTestFile);
+  AddFile("test.proto", kSmallTestFile);
   EXPECT_TRUE(
       CaptureMetadata("test.proto", &file, &pb_h, &info, NULL, NULL, NULL));
   EXPECT_EQ("Message", file.message_type(0).name());
-  std::vector<int> message_path;
+  vector<int> message_path;
   message_path.push_back(FileDescriptorProto::kMessageTypeFieldNumber);
   message_path.push_back(0);
   const GeneratedCodeInfo::Annotation* message_annotation =
-      atu::FindAnnotationOnPath(info, "test.proto", message_path);
+      FindAnnotationOnPath(info, "test.proto", message_path);
   EXPECT_TRUE(NULL != message_annotation);
-  EXPECT_TRUE(
-      atu::AnnotationMatchesSubstring(pb_h, message_annotation, "Message"));
+  EXPECT_TRUE(AnnotationMatchesSubstring(pb_h, message_annotation, "Message"));
 }
 
 }  // namespace
diff --git a/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc b/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
deleted file mode 100644
index 8c38e52..0000000
--- a/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
+++ /dev/null
@@ -1,200 +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.
-
-// This test insures that
-// csharp/src/Google.Protobuf/Reflection/Descriptor.cs  match exactly
-// what would be generated by the protocol compiler.  The file is not
-// generated automatically at build time.
-//
-// If this test fails, run the script
-// "generate_descriptor_proto.sh" and add the changed files under
-// csharp/src/ to your changelist.
-
-#include <map>
-
-#include <google/protobuf/compiler/csharp/csharp_generator.h>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace csharp {
-
-namespace {
-
-class MockErrorCollector : public MultiFileErrorCollector {
- public:
-  MockErrorCollector() {}
-  ~MockErrorCollector() {}
-
-  string text_;
-
-  // implements ErrorCollector ---------------------------------------
-  void AddError(const string& filename, int line, int column,
-                const string& message) {
-    strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n",
-                                 filename, line, column, message);
-  }
-};
-
-class MockGeneratorContext : public GeneratorContext {
- public:
-  MockGeneratorContext() {}
-  ~MockGeneratorContext() {
-    STLDeleteValues(&files_);
-  }
-
-  void ExpectFileMatches(const string& virtual_filename,
-                         const string& physical_filename) {
-    string* expected_contents = FindPtrOrNull(files_, virtual_filename);
-    ASSERT_TRUE(expected_contents != NULL)
-      << "Generator failed to generate file: " << virtual_filename;
-
-    string actual_contents;
-    GOOGLE_CHECK_OK(
-        File::GetContents(TestSourceDir() + "/" + physical_filename,
-                          &actual_contents, true))
-        << "Unable to get " << physical_filename;
-    EXPECT_TRUE(actual_contents == *expected_contents)
-      << physical_filename << " needs to be regenerated.  Please run "
-         "generate_descriptor_proto.sh. Then add this file "
-         "to your CL.";
-  }
-
-  // implements GeneratorContext --------------------------------------
-
-  virtual io::ZeroCopyOutputStream* Open(const string& filename) {
-    string** map_slot = &files_[filename];
-    delete *map_slot;
-    *map_slot = new string;
-
-    return new io::StringOutputStream(*map_slot);
-  }
-
- private:
-  std::map<string, string*> files_;
-};
-
-class GenerateAndTest {
- public:
-  GenerateAndTest() {}
-  void Run(const FileDescriptor* proto_file, string file1, string file2) {
-    ASSERT_TRUE(proto_file != NULL) << TestSourceDir();
-    ASSERT_TRUE(generator_.Generate(proto_file, parameter_,
-                                    &context_, &error_));
-    context_.ExpectFileMatches(file1, file2);
-  }
-  void SetParameter(string parameter) {
-    parameter_ = parameter;
-  }
-
- private:
-  Generator generator_;
-  MockGeneratorContext context_;
-  string error_;
-  string parameter_;
-};
-
-TEST(CsharpBootstrapTest, GeneratedCsharpDescriptorMatches) {
-  // Skip this whole test if the csharp directory doesn't exist (i.e., a C++11
-  // only distribution).
-  string descriptor_file_name =
-      "../csharp/src/Google.Protobuf/Reflection/Descriptor.cs";
-  if (!File::Exists(TestSourceDir() + "/" + descriptor_file_name)) {
-    return;
-  }
-
-  MockErrorCollector error_collector;
-  DiskSourceTree source_tree;
-  Importer importer(&source_tree, &error_collector);
-  GenerateAndTest generate_test;
-
-  generate_test.SetParameter("base_namespace=Google.Protobuf");
-  source_tree.MapPath("", TestSourceDir());
-  generate_test.Run(importer.Import("google/protobuf/descriptor.proto"),
-                    "Reflection/Descriptor.cs",
-                    "../csharp/src/Google.Protobuf/Reflection/Descriptor.cs");
-  generate_test.Run(importer.Import("google/protobuf/any.proto"),
-                    "WellKnownTypes/Any.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Any.cs");
-  generate_test.Run(importer.Import("google/protobuf/api.proto"),
-                    "WellKnownTypes/Api.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Api.cs");
-  generate_test.Run(importer.Import("google/protobuf/duration.proto"),
-                    "WellKnownTypes/Duration.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs");
-  generate_test.Run(importer.Import("google/protobuf/empty.proto"),
-                    "WellKnownTypes/Empty.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs");
-  generate_test.Run(importer.Import("google/protobuf/field_mask.proto"),
-                    "WellKnownTypes/FieldMask.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs");
-  generate_test.Run(importer.Import("google/protobuf/source_context.proto"),
-                    "WellKnownTypes/SourceContext.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs");
-  generate_test.Run(importer.Import("google/protobuf/struct.proto"),
-                    "WellKnownTypes/Struct.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs");
-  generate_test.Run(importer.Import("google/protobuf/timestamp.proto"),
-                    "WellKnownTypes/Timestamp.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs");
-  generate_test.Run(importer.Import("google/protobuf/type.proto"),
-                    "WellKnownTypes/Type.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Type.cs");
-  generate_test.Run(importer.Import("google/protobuf/wrappers.proto"),
-                    "WellKnownTypes/Wrappers.cs",
-                    "../csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs");
-
-  generate_test.SetParameter("");
-  source_tree.MapPath("", TestSourceDir() + "/../conformance");
-  generate_test.Run(importer.Import("conformance.proto"),
-                    "Conformance.cs",
-                    "../csharp/src/Google.Protobuf.Conformance/Conformance.cs");
-
-  EXPECT_EQ("", error_collector.text_);
-}
-
-}  // namespace
-
-}  // namespace csharp
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc b/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
index 636a76a..587e022 100644
--- a/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
@@ -74,7 +74,7 @@
                 printer->Print("///\n");
             }
             last_was_empty = false;
-            printer->Print("///$line$\n", "line", *it);
+            printer->Print("/// $line$\n", "line", *it);
         }
     }
     printer->Print("/// </summary>\n");
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.cc b/src/google/protobuf/compiler/csharp/csharp_enum.cc
index 9759e3e..bdfcc2b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_enum.cc
@@ -60,16 +60,18 @@
 
 void EnumGenerator::Generate(io::Printer* printer) {
   WriteEnumDocComment(printer, descriptor_);
+  WriteGeneratedCodeAttributes(printer);
   printer->Print("$access_level$ enum $name$ {\n",
                  "access_level", class_access_level(),
                  "name", descriptor_->name());
   printer->Indent();
   std::set<string> used_names;
-  std::set<int> used_number;
   for (int i = 0; i < descriptor_->value_count(); i++) {
       WriteEnumValueDocComment(printer, descriptor_->value(i));
       string original_name = descriptor_->value(i)->name();
-      string name = GetEnumValueName(descriptor_->name(), descriptor_->value(i)->name());
+      string name = options()->legacy_enum_values
+          ? descriptor_->value(i)->name()
+          : GetEnumValueName(descriptor_->name(), descriptor_->value(i)->name());
       // Make sure we don't get any duplicate names due to prefix removal.
       while (!used_names.insert(name).second) {
         // It's possible we'll end up giving this warning multiple times, but that's better than not at all.
@@ -77,18 +79,10 @@
           << ") in " << descriptor_->name() << "; adding underscore to distinguish";
         name += "_";
       }
-      int number = descriptor_->value(i)->number();
-      if (!used_number.insert(number).second) {
-          printer->Print("[pbr::OriginalName(\"$original_name$\", PreferredAlias = false)] $name$ = $number$,\n",
-             "original_name", original_name,
-             "name", name,
-             "number", SimpleItoa(number));
-      } else {
-          printer->Print("[pbr::OriginalName(\"$original_name$\")] $name$ = $number$,\n",
-             "original_name", original_name,
-             "name", name,
-             "number", SimpleItoa(number));
-      }
+      printer->Print("[pbr::OriginalName(\"$original_name$\")] $name$ = $number$,\n",
+         "original_name", original_name,
+         "name", name,
+         "number", SimpleItoa(descriptor_->value(i)->number()));         
   }
   printer->Outdent();
   printer->Print("}\n");
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
index 9ceffa8..67c0b59 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
@@ -89,10 +89,6 @@
 EnumOneofFieldGenerator::~EnumOneofFieldGenerator() {
 }
 
-void EnumOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) {
-  printer->Print(variables_, "$property_name$ = other.$property_name$;\n");
-}
-
 void EnumOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) {
   // TODO(jonskeet): What about if we read the default value?
   printer->Print(
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.h b/src/google/protobuf/compiler/csharp/csharp_enum_field.h
index 631632b..9b7669b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.h
@@ -64,7 +64,6 @@
                           const Options *options);
   ~EnumOneofFieldGenerator();
 
-  virtual void GenerateMergingCode(io::Printer* printer);
   virtual void GenerateParsingCode(io::Printer* printer);
   virtual void GenerateSerializationCode(io::Printer* printer);
   virtual void GenerateSerializedSizeCode(io::Printer* printer);
diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.cc b/src/google/protobuf/compiler/csharp/csharp_field_base.cc
index ecf29ec..e3c3404 100644
--- a/src/google/protobuf/compiler/csharp/csharp_field_base.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_field_base.cc
@@ -54,7 +54,7 @@
 namespace csharp {
 
 void FieldGeneratorBase::SetCommonFieldVariables(
-    std::map<string, string>* variables) {
+    map<string, string>* variables) {
   // Note: this will be valid even though the tag emitted for packed and unpacked versions of
   // repeated fields varies by wire format. The wire format is encoded in the bottom 3 bits, which
   // never effects the tag size.
@@ -92,7 +92,7 @@
 }
 
 void FieldGeneratorBase::SetCommonOneofFieldVariables(
-    std::map<string, string>* variables) {
+    map<string, string>* variables) {
   (*variables)["oneof_name"] = oneof_name();
   (*variables)["has_property_check"] =
     oneof_name() + "Case_ == " + oneof_property_name() +
@@ -122,17 +122,14 @@
 }
 
 void FieldGeneratorBase::AddDeprecatedFlag(io::Printer* printer) {
-  if (descriptor_->options().deprecated()) {
-    printer->Print("[global::System.ObsoleteAttribute]\n");
-  } else if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE &&
-           descriptor_->message_type()->options().deprecated()) {
-    printer->Print("[global::System.ObsoleteAttribute]\n");
+  if (descriptor_->options().deprecated())
+  {
+    printer->Print("[global::System.ObsoleteAttribute()]\n");
   }
 }
 
 void FieldGeneratorBase::AddPublicMemberAttributes(io::Printer* printer) {
   AddDeprecatedFlag(printer);
-  WriteGeneratedCodeAttributes(printer);
 }
 
 std::string FieldGeneratorBase::oneof_property_name() {
@@ -322,9 +319,9 @@
       }
     case FieldDescriptor::TYPE_DOUBLE: {
       double value = descriptor->default_value_double();
-      if (value == std::numeric_limits<double>::infinity()) {
+      if (value == numeric_limits<double>::infinity()) {
         return "double.PositiveInfinity";
-      } else if (value == -std::numeric_limits<double>::infinity()) {
+      } else if (value == -numeric_limits<double>::infinity()) {
         return "double.NegativeInfinity";
       } else if (MathLimits<double>::IsNaN(value)) {
         return "double.NaN";
@@ -333,9 +330,9 @@
     }
     case FieldDescriptor::TYPE_FLOAT: {
       float value = descriptor->default_value_float();
-      if (value == std::numeric_limits<float>::infinity()) {
+      if (value == numeric_limits<float>::infinity()) {
         return "float.PositiveInfinity";
-      } else if (value == -std::numeric_limits<float>::infinity()) {
+      } else if (value == -numeric_limits<float>::infinity()) {
         return "float.NegativeInfinity";
       } else if (MathLimits<float>::IsNaN(value)) {
         return "float.NaN";
diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.h b/src/google/protobuf/compiler/csharp/csharp_field_base.h
index df26853..4109f3c 100644
--- a/src/google/protobuf/compiler/csharp/csharp_field_base.h
+++ b/src/google/protobuf/compiler/csharp/csharp_field_base.h
@@ -66,14 +66,14 @@
  protected:
   const FieldDescriptor* descriptor_;
   const int fieldOrdinal_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   void AddDeprecatedFlag(io::Printer* printer);
   void AddNullCheck(io::Printer* printer);
   void AddNullCheck(io::Printer* printer, const std::string& name);
 
   void AddPublicMemberAttributes(io::Printer* printer);
-  void SetCommonOneofFieldVariables(std::map<string, string>* variables);
+  void SetCommonOneofFieldVariables(map<string, string>* variables);
 
   std::string oneof_property_name();
   std::string oneof_name();
@@ -89,7 +89,7 @@
   std::string capitalized_type_name();
 
  private:
-  void SetCommonFieldVariables(std::map<string, string>* variables);
+  void SetCommonFieldVariables(map<string, string>* variables);
   std::string GetStringDefaultValueInternal();
   std::string GetBytesDefaultValueInternal();
 
diff --git a/src/google/protobuf/compiler/csharp/csharp_generator.cc b/src/google/protobuf/compiler/csharp/csharp_generator.cc
index c13ed65..d74e8c8 100644
--- a/src/google/protobuf/compiler/csharp/csharp_generator.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_generator.cc
@@ -83,6 +83,9 @@
       cli_options.base_namespace_specified = true;
     } else if (options[i].first == "internal_access") {
       cli_options.internal_access = true;
+    } else if (options[i].first == "legacy_enum_values") {
+      // TODO: Remove this before final release
+      cli_options.legacy_enum_values = true;
     } else {
       *error = "Unknown generator option: " + options[i].first;
       return false;
diff --git a/src/google/protobuf/compiler/csharp/csharp_generator.h b/src/google/protobuf/compiler/csharp/csharp_generator.h
index c8b1952..9b54e91 100644
--- a/src/google/protobuf/compiler/csharp/csharp_generator.h
+++ b/src/google/protobuf/compiler/csharp/csharp_generator.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Generates C# code for a given .proto file.
-
 #ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__
 #define GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__
 
@@ -42,13 +40,8 @@
 namespace compiler {
 namespace csharp {
 
-// CodeGenerator implementation which generates a C# source file and
-// header.  If you create your own protocol compiler binary and you want
-// it to support C# output, you can do so by registering an instance of this
-// CodeGenerator with the CommandLineInterface in your main() function.
 class LIBPROTOC_EXPORT Generator
     : public google::protobuf::compiler::CodeGenerator {
-public:
   virtual bool Generate(
       const FileDescriptor* file,
       const string& parameter,
@@ -62,3 +55,4 @@
 }  // namespace google
 
 #endif  // GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__
+
diff --git a/src/google/protobuf/compiler/csharp/csharp_helpers.cc b/src/google/protobuf/compiler/csharp/csharp_helpers.cc
index 5bca1ff..6c154c5 100644
--- a/src/google/protobuf/compiler/csharp/csharp_helpers.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_helpers.cc
@@ -38,7 +38,6 @@
 #include <vector>
 
 #include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/wire_format.h>
diff --git a/src/google/protobuf/compiler/csharp/csharp_helpers.h b/src/google/protobuf/compiler/csharp/csharp_helpers.h
index c317ad0..1563ca7 100644
--- a/src/google/protobuf/compiler/csharp/csharp_helpers.h
+++ b/src/google/protobuf/compiler/csharp/csharp_helpers.h
@@ -120,22 +120,6 @@
   return descriptor->name() == "google/protobuf/descriptor.proto";
 }
 
-// Determines whether the given message is an options message within descriptor.proto.
-inline bool IsDescriptorOptionMessage(const Descriptor* descriptor) {
-  if (!IsDescriptorProto(descriptor->file())) {
-    return false;
-  }
-  const string name = descriptor->full_name();
-  return name == "google.protobuf.FileOptions" ||
-      name == "google.protobuf.MessageOptions" ||
-      name == "google.protobuf.FieldOptions" ||
-      name == "google.protobuf.OneofOptions" ||
-      name == "google.protobuf.EnumOptions" ||
-      name == "google.protobuf.EnumValueOptions" ||
-      name == "google.protobuf.ServiceOptions" ||
-      name == "google.protobuf.MethodOptions";
-}
-
 inline bool IsWrapperType(const FieldDescriptor* descriptor) {
   return descriptor->type() == FieldDescriptor::TYPE_MESSAGE &&
       descriptor->message_type()->file()->name() == "google/protobuf/wrappers.proto";
diff --git a/src/google/protobuf/compiler/csharp/csharp_map_field.cc b/src/google/protobuf/compiler/csharp/csharp_map_field.cc
index e6eac6e..565d122 100644
--- a/src/google/protobuf/compiler/csharp/csharp_map_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_map_field.cc
@@ -80,7 +80,7 @@
     ", $tag$);\n"
     "private readonly pbc::MapField<$key_type_name$, $value_type_name$> $name$_ = new pbc::MapField<$key_type_name$, $value_type_name$>();\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ pbc::MapField<$key_type_name$, $value_type_name$> $property_name$ {\n"
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc
index 17b4a07..532da6b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message.cc
@@ -98,20 +98,15 @@
   return fields_by_number_;
 }
 
-void MessageGenerator::AddDeprecatedFlag(io::Printer* printer) {
-  if (descriptor_->options().deprecated()) {
-    printer->Print("[global::System.ObsoleteAttribute]\n");
-  }
-}
-
 void MessageGenerator::Generate(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["class_name"] = class_name();
   vars["access_level"] = class_access_level();
 
   WriteMessageDocComment(printer, descriptor_);
-  AddDeprecatedFlag(printer);
-
+  printer->Print(
+    "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n");
+  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "$access_level$ sealed partial class $class_name$ : pb::IMessage<$class_name$> {\n");
@@ -120,15 +115,7 @@
   // All static fields and properties
   printer->Print(
       vars,
-      "private static readonly pb::MessageParser<$class_name$> _parser = new pb::MessageParser<$class_name$>(() => new $class_name$());\n");
-
-  printer->Print(
-      "private pb::UnknownFieldSet _unknownFields;\n");
-
-  WriteGeneratedCodeAttributes(printer);
-
-  printer->Print(
-      vars,
+      "private static readonly pb::MessageParser<$class_name$> _parser = new pb::MessageParser<$class_name$>(() => new $class_name$());\n"
       "public static pb::MessageParser<$class_name$> Parser { get { return _parser; } }\n\n");
 
   // Access the message descriptor via the relevant file descriptor or containing message descriptor.
@@ -140,29 +127,18 @@
         + ".Descriptor.NestedTypes[" + SimpleItoa(descriptor_->index()) + "]";
   }
 
-  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "public static pbr::MessageDescriptor Descriptor {\n"
     "  get { return $descriptor_accessor$; }\n"
     "}\n"
-    "\n");
-  WriteGeneratedCodeAttributes(printer);
-  printer->Print(
-    vars,
+    "\n"
     "pbr::MessageDescriptor pb::IMessage.Descriptor {\n"
     "  get { return Descriptor; }\n"
     "}\n"
     "\n");
-  // CustomOptions property, only for options messages
-  if (IsDescriptorOptionMessage(descriptor_)) {
-    printer->Print(
-      "internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;\n"
-       "\n");
-  }
 
   // Parameterless constructor and partial OnConstruction method.
-  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "public $class_name$() {\n"
@@ -214,16 +190,10 @@
     // It's unclear exactly where they should go.
     printer->Print(
       vars,
-      "private $property_name$OneofCase $name$Case_ = $property_name$OneofCase.None;\n");
-    WriteGeneratedCodeAttributes(printer);
-    printer->Print(
-      vars,
+      "private $property_name$OneofCase $name$Case_ = $property_name$OneofCase.None;\n"
       "public $property_name$OneofCase $property_name$Case {\n"
       "  get { return $name$Case_; }\n"
-      "}\n\n");
-    WriteGeneratedCodeAttributes(printer);
-    printer->Print(
-      vars,
+      "}\n\n"
       "public void Clear$property_name$() {\n"
       "  $name$Case_ = $property_name$OneofCase.None;\n"
       "  $name$_ = null;\n"
@@ -240,7 +210,8 @@
     printer->Print(
       vars,
       "#region Nested types\n"
-      "/// <summary>Container for nested types declared in the $class_name$ message type.</summary>\n");
+      "/// <summary>Container for nested types declared in the $class_name$ message type.</summary>\n"
+      "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n");
     WriteGeneratedCodeAttributes(printer);
     printer->Print("public static partial class Types {\n");
     printer->Indent();
@@ -283,8 +254,7 @@
 }
 
 void MessageGenerator::GenerateCloningCode(io::Printer* printer) {
-  std::map<string, string> vars;
-  WriteGeneratedCodeAttributes(printer);
+  map<string, string> vars;
   vars["class_name"] = class_name();
     printer->Print(
     vars,
@@ -320,14 +290,10 @@
     printer->Outdent();
     printer->Print("}\n\n");
   }
-  // Clone unknown fields
-  printer->Print(
-      "_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);\n");
 
   printer->Outdent();
   printer->Print("}\n\n");
 
-  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "public $class_name$ Clone() {\n"
@@ -339,19 +305,15 @@
 }
 
 void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["class_name"] = class_name();
 
     // Equality
-    WriteGeneratedCodeAttributes(printer);
     printer->Print(
         vars,
         "public override bool Equals(object other) {\n"
         "  return Equals(other as $class_name$);\n"
-        "}\n\n");
-    WriteGeneratedCodeAttributes(printer);
-    printer->Print(
-        vars,
+        "}\n\n"
         "public bool Equals($class_name$ other) {\n"
         "  if (ReferenceEquals(other, null)) {\n"
         "    return false;\n"
@@ -371,12 +333,11 @@
     }
     printer->Outdent();
     printer->Print(
-        "  return Equals(_unknownFields, other._unknownFields);\n"
+        "  return true;\n"
         "}\n\n");
 
     // GetHashCode
     // Start with a non-zero value to easily distinguish between null and "empty" messages.
-    WriteGeneratedCodeAttributes(printer);
     printer->Print(
         "public override int GetHashCode() {\n"
         "  int hash = 1;\n");
@@ -390,15 +351,10 @@
         printer->Print("hash ^= (int) $name$Case_;\n",
             "name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false));
     }
-    printer->Print(
-        "if (_unknownFields != null) {\n"
-        "  hash ^= _unknownFields.GetHashCode();\n"
-        "}\n"
-        "return hash;\n");
+    printer->Print("return hash;\n");
     printer->Outdent();
     printer->Print("}\n\n");
 
-    WriteGeneratedCodeAttributes(printer);
     printer->Print(
         "public override string ToString() {\n"
         "  return pb::JsonFormatter.ToDiagnosticString(this);\n"
@@ -406,7 +362,6 @@
 }
 
 void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer) {
-  WriteGeneratedCodeAttributes(printer);
   printer->Print(
       "public void WriteTo(pb::CodedOutputStream output) {\n");
   printer->Indent();
@@ -418,19 +373,11 @@
     generator->GenerateSerializationCode(printer);
   }
 
-  // Serialize unknown fields
-  printer->Print(
-    "if (_unknownFields != null) {\n"
-    "  _unknownFields.WriteTo(output);\n"
-    "}\n");
-
   // TODO(jonskeet): Memoize size of frozen messages?
   printer->Outdent();
   printer->Print(
     "}\n"
-    "\n");
-  WriteGeneratedCodeAttributes(printer);
-  printer->Print(
+    "\n"
     "public int CalculateSize() {\n");
   printer->Indent();
   printer->Print("int size = 0;\n");
@@ -439,12 +386,6 @@
         CreateFieldGeneratorInternal(descriptor_->field(i)));
     generator->GenerateSerializedSizeCode(printer);
   }
-
-  printer->Print(
-    "if (_unknownFields != null) {\n"
-    "  size += _unknownFields.CalculateSize();\n"
-    "}\n");
-
   printer->Print("return size;\n");
   printer->Outdent();
   printer->Print("}\n\n");
@@ -454,10 +395,9 @@
   // Note:  These are separate from GenerateMessageSerializationMethods()
   //   because they need to be generated even for messages that are optimized
   //   for code size.
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["class_name"] = class_name();
 
-  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "public void MergeFrom($class_name$ other) {\n");
@@ -485,25 +425,15 @@
       vars["field_property_name"] = GetPropertyName(field);
       printer->Print(
         vars,
-        "case $property_name$OneofCase.$field_property_name$:\n");
-      printer->Indent();
-      scoped_ptr<FieldGeneratorBase> generator(CreateFieldGeneratorInternal(field));
-      generator->GenerateMergingCode(printer);
-      printer->Print("break;\n");
-      printer->Outdent();
+        "case $property_name$OneofCase.$field_property_name$:\n"
+        "  $field_property_name$ = other.$field_property_name$;\n"
+        "  break;\n");
     }
     printer->Outdent();
     printer->Print("}\n\n");
   }
-  // Merge unknown fields.
-  printer->Print(
-      "_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);\n");
-
   printer->Outdent();
   printer->Print("}\n\n");
-
-
-  WriteGeneratedCodeAttributes(printer);
   printer->Print("public void MergeFrom(pb::CodedInputStream input) {\n");
   printer->Indent();
   printer->Print(
@@ -512,18 +442,10 @@
     "  switch(tag) {\n");
   printer->Indent();
   printer->Indent();
-  // Option messages need to store unknown fields so that options can be parsed later.
-  if (IsDescriptorOptionMessage(descriptor_)) {
-    printer->Print(
-      "default:\n"
-      "  CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);\n"
-      "  break;\n");
-  } else {
-    printer->Print(
-      "default:\n"
-      "  _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);\n"
-      "  break;\n");
-  }
+  printer->Print(
+    "default:\n"
+    "  input.SkipLastField();\n" // We're not storing the data, but we still need to consume it.
+    "  break;\n");
   for (int i = 0; i < fields_by_number().size(); i++) {
     const FieldDescriptor* field = fields_by_number()[i];
     internal::WireFormatLite::WireType wt =
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.h b/src/google/protobuf/compiler/csharp/csharp_message.h
index e7f3b4d..f794d68 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.h
+++ b/src/google/protobuf/compiler/csharp/csharp_message.h
@@ -69,8 +69,6 @@
 
   bool HasNestedGeneratedTypes();
 
-  void AddDeprecatedFlag(io::Printer* printer);
-  
   std::string class_name();
   std::string full_class_name();
 
diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_message_field.cc
index 59b7edf..338692f 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message_field.cc
@@ -65,7 +65,7 @@
     variables_,
     "private $type_name$ $name$_;\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
@@ -159,7 +159,7 @@
 
 void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
@@ -171,14 +171,6 @@
     "}\n");
 }
 
-void MessageOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) {
-  printer->Print(variables_, 
-    "if ($property_name$ == null) {\n"
-    "  $property_name$ = new $type_name$();\n"
-    "}\n"
-    "$property_name$.MergeFrom(other.$property_name$);\n");
-}
-
 void MessageOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) {
   // TODO(jonskeet): We may be able to do better than this
   printer->Print(
diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.h b/src/google/protobuf/compiler/csharp/csharp_message_field.h
index c41ee88..7d61475 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_message_field.h
@@ -74,7 +74,6 @@
 
   virtual void GenerateCloningCode(io::Printer* printer);
   virtual void GenerateMembers(io::Printer* printer);
-  virtual void GenerateMergingCode(io::Printer* printer);
   virtual void WriteToString(io::Printer* printer);
   virtual void GenerateParsingCode(io::Printer* printer);
 
diff --git a/src/google/protobuf/compiler/csharp/csharp_names.h b/src/google/protobuf/compiler/csharp/csharp_names.h
index 21758f2..3080518 100644
--- a/src/google/protobuf/compiler/csharp/csharp_names.h
+++ b/src/google/protobuf/compiler/csharp/csharp_names.h
@@ -39,7 +39,6 @@
 #define GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__
 
 #include <string>
-#include <google/protobuf/stubs/port.h>
 
 namespace google {
 namespace protobuf {
@@ -57,14 +56,14 @@
 //
 // Returns:
 //   The namespace to use for given file descriptor.
-string LIBPROTOC_EXPORT GetFileNamespace(const FileDescriptor* descriptor);
+string GetFileNamespace(const FileDescriptor* descriptor);
 
 // Requires:
 //   descriptor != NULL
 //
 // Returns:
 //   The fully-qualified C# class name.
-string LIBPROTOC_EXPORT GetClassName(const Descriptor* descriptor);
+string GetClassName(const Descriptor* descriptor);
 
 // Requires:
 //   descriptor != NULL
@@ -73,7 +72,7 @@
 //   The fully-qualified name of the C# class that provides
 //   access to the file descriptor. Proto compiler generates
 //   such class for each .proto file processed.
-string LIBPROTOC_EXPORT GetReflectionClassName(const FileDescriptor* descriptor);
+string GetReflectionClassName(const FileDescriptor* descriptor);
 
 // Generates output file name for given file descriptor. If generate_directories
 // is true, the output file will be put under directory corresponding to file's
@@ -89,7 +88,7 @@
 //    The file name to use as output file for given file descriptor. In case
 //    of failure, this function will return empty string and error parameter
 //    will contain the error message.
-string LIBPROTOC_EXPORT GetOutputFile(
+string GetOutputFile(
     const google::protobuf::FileDescriptor* descriptor,
     const string file_extension,
     const bool generate_directories,
diff --git a/src/google/protobuf/compiler/csharp/csharp_options.h b/src/google/protobuf/compiler/csharp/csharp_options.h
index 426fb3b..4079bf7 100644
--- a/src/google/protobuf/compiler/csharp/csharp_options.h
+++ b/src/google/protobuf/compiler/csharp/csharp_options.h
@@ -45,7 +45,8 @@
       file_extension(".cs"),
       base_namespace(""),
       base_namespace_specified(false),
-      internal_access(false) {
+      internal_access(false),
+      legacy_enum_values(false) {
   }
   // Extension of the generated file. Defaults to ".cs"
   string file_extension;
@@ -68,6 +69,12 @@
   // Whether the generated classes should have accessibility level of "internal".
   // Defaults to false that generates "public" classes.
   bool internal_access;
+  // By default, C# codegen now uses PascalCased enum values names, after
+  // removing the enum type name as a prefix (if it *is* a prefix of the value).
+  // Setting this option reverts to the previous behavior of just copying the
+  // value name specified in the .proto file, allowing gradual migration.
+  // This option will be removed before final release.
+  bool legacy_enum_values;
 };
 
 }  // namespace csharp
diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
index c3003e3..3b7ca75 100644
--- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
@@ -71,7 +71,7 @@
     variables_,
     "private $type_name$ $name_def_message$;\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
@@ -137,22 +137,14 @@
 }
 
 void PrimitiveFieldGenerator::WriteHash(io::Printer* printer) {
-  const char *text = "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n";
-  if (descriptor_->type() == FieldDescriptor::TYPE_FLOAT) {
-    text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode($property_name$);\n";
-  } else if (descriptor_->type() == FieldDescriptor::TYPE_DOUBLE) {
-    text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode($property_name$);\n";
-  }
-	printer->Print(variables_, text);
+  printer->Print(
+    variables_,
+    "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n");
 }
 void PrimitiveFieldGenerator::WriteEquals(io::Printer* printer) {
-  const char *text = "if ($property_name$ != other.$property_name$) return false;\n";
-  if (descriptor_->type() == FieldDescriptor::TYPE_FLOAT) {
-    text = "if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n";
-  } else if (descriptor_->type() == FieldDescriptor::TYPE_DOUBLE) {
-    text = "if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n";
-  }
-  printer->Print(variables_, text);
+  printer->Print(
+    variables_,
+    "if ($property_name$ != other.$property_name$) return false;\n");
 }
 void PrimitiveFieldGenerator::WriteToString(io::Printer* printer) {
   printer->Print(
@@ -182,7 +174,7 @@
 
 void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
@@ -204,10 +196,6 @@
       "}\n");
 }
 
-void PrimitiveOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) {
-  printer->Print(variables_, "$property_name$ = other.$property_name$;\n");
-}
-
 void PrimitiveOneofFieldGenerator::WriteToString(io::Printer* printer) {
   printer->Print(variables_,
     "PrintField(\"$descriptor_name$\", $has_property_check$, $oneof_name$_, writer);\n");
diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.h b/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
index ca7b8b3..5f466fc 100644
--- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
@@ -78,7 +78,6 @@
 
   virtual void GenerateCloningCode(io::Printer* printer);
   virtual void GenerateMembers(io::Printer* printer);
-  virtual void GenerateMergingCode(io::Printer* printer);
   virtual void WriteToString(io::Printer* printer);
   virtual void GenerateParsingCode(io::Printer* printer);
 
diff --git a/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc b/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
index 5ddd616..f7397c0 100644
--- a/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
@@ -104,10 +104,8 @@
 
 void ReflectionClassGenerator::WriteIntroduction(io::Printer* printer) {
   printer->Print(
-    "// <auto-generated>\n"
-    "//     Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
-    "//     source: $file_name$\n"
-    "// </auto-generated>\n"
+    "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
+    "// source: $file_name$\n"
     "#pragma warning disable 1591, 0612, 3021\n"
     "#region Designer generated code\n"
     "\n"
@@ -125,9 +123,12 @@
 
   printer->Print(
     "/// <summary>Holder for reflection information generated from $file_name$</summary>\n"
+    "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n",
+    "file_name", file_->name());
+  WriteGeneratedCodeAttributes(printer);
+  printer->Print(
     "$access_level$ static partial class $reflection_class_name$ {\n"
     "\n",
-    "file_name", file_->name(),
     "access_level", class_access_level(),
     "reflection_class_name", reflectionClassname_);
   printer->Indent();
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
index 683c4b0..1befdc1 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
@@ -64,7 +64,7 @@
   printer->Print(variables_,
     "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n"
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
index 8fa0b05..d51e638 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
@@ -79,7 +79,7 @@
     variables_,
     "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n"
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
index cd91506..bee3f36 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
@@ -64,7 +64,7 @@
   printer->Print(variables_,
     "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n"
diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
index 1fda7dd..16411e4 100644
--- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
@@ -56,7 +56,7 @@
 }
 
 void SourceGeneratorBase::WriteGeneratedCodeAttributes(io::Printer* printer) {
-  printer->Print("[global::System.Diagnostics.DebuggerNonUserCodeAttribute]\n");
+  // This hook can be used to reintroduce generated code attributes in the future.
 }
 
 std::string SourceGeneratorBase::class_access_level() {
diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
index c741080..2e73458 100644
--- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
+++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
@@ -50,8 +50,6 @@
   std::string class_access_level();
   const Options* options();
 
-  // Write any attributes used to decorate generated function members (methods and properties).
-  // Should not be used to decorate types.
   void WriteGeneratedCodeAttributes(io::Printer* printer);
 
  private:
diff --git a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
index 047edf7..5cb86b6 100644
--- a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
@@ -73,7 +73,7 @@
     ";\n"
     "private $type_name$ $name$_;\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
@@ -120,25 +120,15 @@
 }
 
 void WrapperFieldGenerator::WriteHash(io::Printer* printer) {
-  const char *text = "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n";
-  if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_FLOAT) {
-    text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode($property_name$);\n";
-  }
-  else if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_DOUBLE) {
-    text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode($property_name$);\n";
-  }
-  printer->Print(variables_, text);
+  printer->Print(
+    variables_,
+    "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n");
 }
 
 void WrapperFieldGenerator::WriteEquals(io::Printer* printer) {
-  const char *text = "if ($property_name$ != other.$property_name$) return false;\n";
-  if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_FLOAT) {
-    text = "if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n";
-  }
-  else if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_DOUBLE) {
-    text = "if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n";
-  }
-  printer->Print(variables_, text);
+  printer->Print(
+    variables_,
+    "if ($property_name$ != other.$property_name$) return false;\n");
 }
 
 void WrapperFieldGenerator::WriteToString(io::Printer* printer) {
@@ -179,7 +169,7 @@
   GenerateCodecCode(printer);
   printer->Print(";\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddPublicMemberAttributes(printer);
+  AddDeprecatedFlag(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"
@@ -191,10 +181,6 @@
     "}\n");
 }
 
-void WrapperOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) {
-  printer->Print(variables_, "$property_name$ = other.$property_name$;\n");
-}
-
 void WrapperOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) {
   printer->Print(
     variables_,
diff --git a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
index 452531f..250dfd2 100644
--- a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
@@ -75,7 +75,6 @@
   ~WrapperOneofFieldGenerator();
 
   virtual void GenerateMembers(io::Printer* printer);
-  virtual void GenerateMergingCode(io::Printer* printer);
   virtual void GenerateParsingCode(io::Printer* printer);
   virtual void GenerateSerializationCode(io::Printer* printer);
   virtual void GenerateSerializedSizeCode(io::Printer* printer);
diff --git a/src/google/protobuf/compiler/importer.cc b/src/google/protobuf/compiler/importer.cc
index a5341e0..0d9093c 100644
--- a/src/google/protobuf/compiler/importer.cc
+++ b/src/google/protobuf/compiler/importer.cc
@@ -32,9 +32,8 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-
 #ifdef _MSC_VER
-#include <direct.h>
+#include <io.h>
 #else
 #include <unistd.h>
 #endif
@@ -55,21 +54,16 @@
 #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>
-#endif
 
 namespace google {
 namespace protobuf {
 namespace compiler {
 
 #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;
+#ifndef F_OK
+#define F_OK 00  // not defined by MSVC for whatever reason
+#endif
+#include <ctype.h>
 #endif
 
 // Returns true if the text looks like a Windows-style absolute path, starting
@@ -228,7 +222,6 @@
   pool_.ClearUnusedImportTrackFiles();
 }
 
-
 // ===================================================================
 
 SourceTree::~SourceTree() {}
@@ -277,8 +270,8 @@
   }
 #endif
 
-  std::vector<string> canonical_parts;
-  std::vector<string> parts = Split(
+  vector<string> canonical_parts;
+  vector<string> parts = Split(
       path, "/", true);  // Note:  Removes empty parts.
   for (int i = 0; i < parts.size(); i++) {
     if (parts[i] == ".") {
@@ -301,8 +294,10 @@
 }
 
 static inline bool ContainsParentReference(const string& path) {
-  return path == ".." || HasPrefixString(path, "../") ||
-         HasSuffixString(path, "/..") || path.find("/../") != string::npos;
+  return path == ".." ||
+         HasPrefixString(path, "../") ||
+         HasSuffixString(path, "/..") ||
+         path.find("/../") != string::npos;
 }
 
 // Maps a file from an old location to a new one.  Typically, old_prefix is
@@ -332,7 +327,8 @@
       // We do not allow the file name to use "..".
       return false;
     }
-    if (HasPrefixString(filename, "/") || IsWindowsAbsolutePath(filename)) {
+    if (HasPrefixString(filename, "/") ||
+        IsWindowsAbsolutePath(filename)) {
       // This is an absolute path, so it isn't matched by the empty string.
       return false;
     }
diff --git a/src/google/protobuf/compiler/importer.h b/src/google/protobuf/compiler/importer.h
index a4ffcf8..cc8fcc3 100644
--- a/src/google/protobuf/compiler/importer.h
+++ b/src/google/protobuf/compiler/importer.h
@@ -175,7 +175,6 @@
   void AddUnusedImportTrackFile(const string& file_name);
   void ClearUnusedImportTrackFiles();
 
-
  private:
   SourceTreeDescriptorDatabase database_;
   DescriptorPool pool_;
@@ -306,7 +305,7 @@
                    const string& disk_path_param)
       : virtual_path(virtual_path_param), disk_path(disk_path_param) {}
   };
-  std::vector<Mapping> mappings_;
+  vector<Mapping> mappings_;
   string last_error_message_;
 
   // Like Open(), but returns the on-disk path in disk_file if disk_file is
diff --git a/src/google/protobuf/compiler/importer_unittest.cc b/src/google/protobuf/compiler/importer_unittest.cc
index a96ac85..1b6e970 100644
--- a/src/google/protobuf/compiler/importer_unittest.cc
+++ b/src/google/protobuf/compiler/importer_unittest.cc
@@ -47,11 +47,11 @@
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 #include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/strutil.h>
 
 namespace google {
 namespace protobuf {
@@ -293,7 +293,7 @@
   DiskSourceTree source_tree_;
 
   // Paths of two on-disk directories to use during the test.
-  std::vector<string> dirnames_;
+  vector<string> dirnames_;
 };
 
 TEST_F(DiskSourceTreeTest, MapRoot) {
diff --git a/src/google/protobuf/compiler/java/java_context.cc b/src/google/protobuf/compiler/java/java_context.cc
index 0771d5e..0a11288 100644
--- a/src/google/protobuf/compiler/java/java_context.cc
+++ b/src/google/protobuf/compiler/java/java_context.cc
@@ -42,15 +42,15 @@
 namespace compiler {
 namespace java {
 
-Context::Context(const FileDescriptor* file, const Options& options)
-    : name_resolver_(new ClassNameResolver), options_(options) {
+Context::Context(const FileDescriptor* file)
+    : name_resolver_(new ClassNameResolver), enforce_lite_(false) {
   InitializeFieldGeneratorInfo(file);
 }
 
 Context::~Context() {
 }
 
-ClassNameResolver* Context::GetNameResolver() const {
+ClassNameResolver* Context::GetNameResolver() {
   return name_resolver_.get();
 }
 
@@ -108,7 +108,7 @@
   for (int i = 0; i < message->nested_type_count(); ++i) {
     InitializeFieldGeneratorInfoForMessage(message->nested_type(i));
   }
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   for (int i = 0; i < message->field_count(); ++i) {
     fields.push_back(message->field(i));
   }
@@ -124,11 +124,11 @@
 }
 
 void Context::InitializeFieldGeneratorInfoForFields(
-    const std::vector<const FieldDescriptor*>& fields) {
+    const vector<const FieldDescriptor*>& fields) {
   // Find out all fields that conflict with some other field in the same
   // message.
-  std::vector<bool> is_conflict(fields.size());
-  std::vector<string> conflict_reason(fields.size());
+  vector<bool> is_conflict(fields.size());
+  vector<string> conflict_reason(fields.size());
   for (int i = 0; i < fields.size(); ++i) {
     const FieldDescriptor* field = fields[i];
     const string& name = UnderscoresToCapitalizedCamelCase(field);
@@ -154,7 +154,7 @@
   for (int i = 0; i < fields.size(); ++i) {
     const FieldDescriptor* field = fields[i];
     FieldGeneratorInfo info;
-    info.name = CamelCaseFieldName(field);
+    info.name = UnderscoresToCamelCase(field);
     info.capitalized_name = UnderscoresToCapitalizedCamelCase(field);
     // For fields conflicting with some other fields, we append the field
     // number to their field names in generated code to avoid conflicts.
@@ -192,8 +192,8 @@
 // Does this message class have generated parsing, serialization, and other
 // standard methods for which reflection-based fallback implementations exist?
 bool Context::HasGeneratedMethods(const Descriptor* descriptor) const {
-  return options_.enforce_lite ||
-         descriptor->file()->options().optimize_for() != FileOptions::CODE_SIZE;
+  return enforce_lite_ || descriptor->file()->options().optimize_for() !=
+           FileOptions::CODE_SIZE;
 }
 
 }  // namespace java
diff --git a/src/google/protobuf/compiler/java/java_context.h b/src/google/protobuf/compiler/java/java_context.h
index 9a74c43..a480e45 100644
--- a/src/google/protobuf/compiler/java/java_context.h
+++ b/src/google/protobuf/compiler/java/java_context.h
@@ -39,7 +39,6 @@
 #include <vector>
 
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/java_options.h>
 
 namespace google {
 namespace protobuf {
@@ -65,12 +64,12 @@
 // generators.
 class Context {
  public:
-  Context(const FileDescriptor* file, const Options& options);
+  explicit Context(const FileDescriptor* file);
   ~Context();
 
   // Get the name resolver associated with this context. The resolver
   // can be used to map descriptors to Java class names.
-  ClassNameResolver* GetNameResolver() const;
+  ClassNameResolver* GetNameResolver();
 
   // Get the FieldGeneratorInfo for a given field.
   const FieldGeneratorInfo* GetFieldGeneratorInfo(
@@ -80,12 +79,15 @@
   const OneofGeneratorInfo* GetOneofGeneratorInfo(
       const OneofDescriptor* oneof) const;
 
-  const Options& options() const { return options_; }
-
   // Enforces all the files (including transitive dependencies) to use
   // LiteRuntime.
+  void SetEnforceLite(bool enforce_lite) {
+    enforce_lite_ = enforce_lite;
+  }
 
-  bool EnforceLite() const { return options_.enforce_lite; }
+  bool EnforceLite() const {
+    return enforce_lite_;
+  }
 
   // Does this message class have generated parsing, serialization, and other
   // standard methods for which reflection-based fallback implementations exist?
@@ -95,14 +97,12 @@
   void InitializeFieldGeneratorInfo(const FileDescriptor* file);
   void InitializeFieldGeneratorInfoForMessage(const Descriptor* message);
   void InitializeFieldGeneratorInfoForFields(
-      const std::vector<const FieldDescriptor*>& fields);
+      const vector<const FieldDescriptor*>& fields);
 
   google::protobuf::scoped_ptr<ClassNameResolver> name_resolver_;
-  std::map<const FieldDescriptor*, FieldGeneratorInfo>
-      field_generator_info_map_;
-  std::map<const OneofDescriptor*, OneofGeneratorInfo>
-      oneof_generator_info_map_;
-  Options options_;
+  map<const FieldDescriptor*, FieldGeneratorInfo> field_generator_info_map_;
+  map<const OneofDescriptor*, OneofGeneratorInfo> oneof_generator_info_map_;
+  bool enforce_lite_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Context);
 };
 
diff --git a/src/google/protobuf/compiler/java/java_doc_comment.cc b/src/google/protobuf/compiler/java/java_doc_comment.cc
index 59c04ad..0b5caba 100644
--- a/src/google/protobuf/compiler/java/java_doc_comment.cc
+++ b/src/google/protobuf/compiler/java/java_doc_comment.cc
@@ -115,7 +115,7 @@
     // HTML-escape them so that they don't accidentally close the doc comment.
     comments = EscapeJavadoc(comments);
 
-    std::vector<string> lines = Split(comments, "\n");
+    vector<string> lines = Split(comments, "\n");
     while (!lines.empty() && lines.back().empty()) {
       lines.pop_back();
     }
diff --git a/src/google/protobuf/compiler/java/java_enum.cc b/src/google/protobuf/compiler/java/java_enum.cc
index d125ebe..947b80e 100644
--- a/src/google/protobuf/compiler/java/java_enum.cc
+++ b/src/google/protobuf/compiler/java/java_enum.cc
@@ -49,6 +49,17 @@
 namespace compiler {
 namespace java {
 
+namespace {
+bool EnumHasCustomOptions(const EnumDescriptor* descriptor) {
+  if (descriptor->options().unknown_fields().field_count() > 0) return true;
+  for (int i = 0; i < descriptor->value_count(); ++i) {
+    const EnumValueDescriptor* value = descriptor->value(i);
+    if (value->options().unknown_fields().field_count() > 0) return true;
+  }
+  return false;
+}
+}  // namespace
+
 EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor,
                              bool immutable_api,
                              Context* context)
@@ -75,12 +86,10 @@
 
 void EnumGenerator::Generate(io::Printer* printer) {
   WriteEnumDocComment(printer, descriptor_);
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_, immutable_api_);
   printer->Print(
-      "public enum $classname$\n"
-      "    implements com.google.protobuf.ProtocolMessageEnum {\n",
-      "classname", descriptor_->name());
-  printer->Annotate("classname", descriptor_);
+    "public enum $classname$\n"
+    "    implements com.google.protobuf.ProtocolMessageEnum {\n",
+    "classname", descriptor_->name());
   printer->Indent();
 
   bool ordinal_is_index = true;
@@ -94,7 +103,7 @@
   }
 
   for (int i = 0; i < canonical_values_.size(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["name"] = canonical_values_[i]->name();
     vars["index"] = SimpleItoa(canonical_values_[i]->index());
     vars["number"] = SimpleItoa(canonical_values_[i]->number());
@@ -109,16 +118,14 @@
       printer->Print(vars,
         "$name$($index$, $number$),\n");
     }
-    printer->Annotate("name", canonical_values_[i]);
   }
 
   if (SupportUnknownEnumValue(descriptor_->file())) {
     if (ordinal_is_index) {
-      printer->Print("${$UNRECOGNIZED$}$(-1),\n", "{", "", "}", "");
+      printer->Print("UNRECOGNIZED(-1),\n");
     } else {
-      printer->Print("${$UNRECOGNIZED$}$(-1, -1),\n", "{", "", "}", "");
+      printer->Print("UNRECOGNIZED(-1, -1),\n");
     }
-    printer->Annotate("{", "}", descriptor_);
   }
 
   printer->Print(
@@ -128,26 +135,22 @@
   // -----------------------------------------------------------------
 
   for (int i = 0; i < aliases_.size(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["classname"] = descriptor_->name();
     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->Annotate("name", aliases_[i].value);
   }
 
   for (int i = 0; i < descriptor_->value_count(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["name"] = descriptor_->value(i)->name();
     vars["number"] = SimpleItoa(descriptor_->value(i)->number());
-    vars["{"] = "";
-    vars["}"] = "";
     WriteEnumValueDocComment(printer, descriptor_->value(i));
     printer->Print(vars,
-      "public static final int ${$$name$_VALUE$}$ = $number$;\n");
-    printer->Annotate("{", "}", descriptor_->value(i));
+      "public static final int $name$_VALUE = $number$;\n");
   }
   printer->Print("\n");
 
@@ -238,14 +241,49 @@
     //   at module init time because it wouldn't work with descriptor.proto, but
     //   we can cache the value the first time getDescriptor() is called.
     if (descriptor_->containing_type() == NULL) {
-      // The class generated for the File fully populates the descriptor with
-      // extensions in both the mutable and immutable cases. (In the mutable api
-      // this is accomplished by attempting to load the immutable outer class).
-      printer->Print(
-        "  return $file$.getDescriptor().getEnumTypes().get($index$);\n",
-        "file", name_resolver_->GetClassName(descriptor_->file(),
-                                             immutable_api_),
-        "index", SimpleItoa(descriptor_->index()));
+      if (!MultipleJavaFiles(descriptor_->file(), immutable_api_)) {
+        printer->Print(
+          "  return $file$.getDescriptor().getEnumTypes().get($index$);\n",
+          "file", name_resolver_->GetClassName(descriptor_->file(),
+                                               immutable_api_),
+          "index", SimpleItoa(descriptor_->index()));
+      } else {
+        printer->Indent();
+        if (EnumHasCustomOptions(descriptor_)) {
+          // We need to load the immutable classes in order to parse custom
+          // options. However, since file level enums (no outer class) are
+          // shared by immutable code and mutable code, the immutable classes
+          // may not exist. So we try to use Java reflection to retrieve the
+          // descriptor from immutable classes.
+          printer->Print(
+            "try {\n"
+            "  java.lang.Class immutableFileClass =\n"
+            "      java.lang.Class.forName(\"$immutable_file_class_name$\");\n"
+            "  @java.lang.SuppressWarnings(\"unchecked\")\n"
+            "  java.lang.reflect.Method m =\n"
+            "      immutableFileClass.getMethod(\"getDescriptor\");\n"
+            "  com.google.protobuf.Descriptors.FileDescriptor file =\n"
+            "      (com.google.protobuf.Descriptors.FileDescriptor)\n"
+            "          m.invoke(immutableFileClass);\n"
+            "  return file.getEnumTypes().get($index$);\n"
+            "} catch (java.lang.Exception e) {\n"
+            // Immutable classes cannot be found. Proceed as if custom options
+            // don't exist.
+            "}\n",
+            "immutable_file_class_name",
+            name_resolver_->GetImmutableClassName(descriptor_->file()),
+            "index", SimpleItoa(descriptor_->index()));
+        }
+        printer->Print(
+          "return $immutable_package$.$descriptor_class$.$descriptor$\n"
+          "    .getEnumTypes().get($index$);\n",
+          "immutable_package", FileJavaPackage(descriptor_->file(), true),
+          "descriptor_class",
+          name_resolver_->GetDescriptorClassName(descriptor_->file()),
+          "descriptor", "getDescriptor()",
+          "index", SimpleItoa(descriptor_->index()));
+        printer->Outdent();
+      }
     } else {
       printer->Print(
           "  return $parent$.$descriptor$.getEnumTypes().get($index$);\n",
diff --git a/src/google/protobuf/compiler/java/java_enum.h b/src/google/protobuf/compiler/java/java_enum.h
index 13dfc32..a0d91f5 100644
--- a/src/google/protobuf/compiler/java/java_enum.h
+++ b/src/google/protobuf/compiler/java/java_enum.h
@@ -58,8 +58,9 @@
 
 class EnumGenerator {
  public:
-  EnumGenerator(const EnumDescriptor* descriptor, bool immutable_api,
-                Context* context);
+  explicit EnumGenerator(const EnumDescriptor* descriptor,
+                         bool immutable_api,
+                         Context* context);
   ~EnumGenerator();
 
   void Generate(io::Printer* printer);
@@ -72,13 +73,13 @@
   // considered equivalent.  We treat the first defined constant for any
   // given numeric value as "canonical" and the rest as aliases of that
   // canonical value.
-  std::vector<const EnumValueDescriptor*> canonical_values_;
+  vector<const EnumValueDescriptor*> canonical_values_;
 
   struct Alias {
     const EnumValueDescriptor* value;
     const EnumValueDescriptor* canonical_value;
   };
-  std::vector<Alias> aliases_;
+  vector<Alias> aliases_;
 
   bool immutable_api_;
 
diff --git a/src/google/protobuf/compiler/java/java_enum_field.cc b/src/google/protobuf/compiler/java/java_enum_field.cc
index 9f7bb34..3e54be3 100644
--- a/src/google/protobuf/compiler/java/java_enum_field.cc
+++ b/src/google/protobuf/compiler/java/java_enum_field.cc
@@ -58,7 +58,7 @@
                       int builderBitIndex,
                       const FieldGeneratorInfo* info,
                       ClassNameResolver* name_resolver,
-                      std::map<string, string>* variables) {
+                      map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["type"] =
@@ -68,8 +68,7 @@
   (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
   (*variables)["default_number"] = SimpleItoa(
       descriptor->default_value_enum()->number());
-  (*variables)["tag"] =
-      SimpleItoa(static_cast<int32>(internal::WireFormat::MakeTag(descriptor)));
+  (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor));
   (*variables)["tag_size"] = SimpleItoa(
       internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
@@ -77,11 +76,6 @@
   (*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.
-  // TODO(xiaofeng): Use "forNumber" when we no longer support compatibility
-  // with v2.5.0/v2.6.1.
-  (*variables)["for_number"] = "valueOf";
 
   if (SupportFieldPresence(descriptor->file())) {
     // For singular messages and builders, one bit is used for the hasField bit.
@@ -183,26 +177,23 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+      "$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"
-    "  $type$ result = $type$.$for_number$($name$_);\n"
+    "$deprecation$public $type$ get$capitalized_name$() {\n"
+    "  $type$ result = $type$.forNumber($name$_);\n"
     "  return result == null ? $unknown$ : result;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableEnumFieldGenerator::
@@ -212,38 +203,33 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$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"
+      "$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"
+      "$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"
-    "  $type$ result = $type$.$for_number$($name$_);\n"
+    "$deprecation$public $type$ get$capitalized_name$() {\n"
+    "  $type$ result = $type$.forNumber($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"
+    "$deprecation$public Builder set$capitalized_name$($type$ value) {\n"
     "  if (value == null) {\n"
     "    throw new NullPointerException();\n"
     "  }\n"
@@ -252,16 +238,14 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-    printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$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::
@@ -320,9 +304,13 @@
   } else {
     printer->Print(variables_,
       "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.$for_number$(rawValue);\n"
-      "if (value == null) {\n"
-      "  unknownFields.mergeVarintField($number$, rawValue);\n"
+      "$type$ value = $type$.forNumber(rawValue);\n"
+      "if (value == null) {\n");
+    if (PreserveUnknownFields(descriptor_->containing_type())) {
+      printer->Print(variables_,
+        "  unknownFields.mergeVarintField($number$, rawValue);\n");
+    }
+    printer->Print(variables_,
       "} else {\n"
       "  $set_has_field_bit_message$\n"
       "  $name$_ = rawValue;\n"
@@ -392,33 +380,29 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+    "$deprecation$public $type$ get$capitalized_name$() {\n"
     "  if ($has_oneof_case_message$) {\n"
-    "    $type$ result = $type$.$for_number$(\n"
-    "        (java.lang.Integer) $oneof_name$_);\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_);
 }
 
 void ImmutableEnumOneofFieldGenerator::
@@ -426,46 +410,40 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+      "$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"
+      "$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"
+    "$deprecation$public $type$ get$capitalized_name$() {\n"
     "  if ($has_oneof_case_message$) {\n"
-    "    $type$ result = $type$.$for_number$(\n"
-    "        (java.lang.Integer) $oneof_name$_);\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_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
+    "$deprecation$public Builder set$capitalized_name$($type$ value) {\n"
     "  if (value == null) {\n"
     "    throw new NullPointerException();\n"
     "  }\n"
@@ -474,10 +452,9 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  if ($has_oneof_case_message$) {\n"
     "    $clear_oneof_case_message$;\n"
     "    $oneof_name$_ = null;\n"
@@ -485,7 +462,6 @@
     "  }\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableEnumOneofFieldGenerator::
@@ -517,9 +493,13 @@
   } else {
     printer->Print(variables_,
       "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.$for_number$(rawValue);\n"
-      "if (value == null) {\n"
-      "  unknownFields.mergeVarintField($number$, rawValue);\n"
+      "$type$ value = $type$.forNumber(rawValue);\n"
+      "if (value == null) {\n");
+    if (PreserveUnknownFields(descriptor_->containing_type())) {
+      printer->Print(variables_,
+        "  unknownFields.mergeVarintField($number$, rawValue);\n");
+    }
+    printer->Print(variables_,
       "} else {\n"
       "  $set_oneof_case_message$;\n"
       "  $oneof_name$_ = rawValue;\n"
@@ -626,45 +606,39 @@
     "        new com.google.protobuf.Internal.ListAdapter.Converter<\n"
     "            java.lang.Integer, $type$>() {\n"
     "          public $type$ convert(java.lang.Integer from) {\n"
-    "            $type$ result = $type$.$for_number$(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_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\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_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+    "$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"
+    "$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"
+      "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"
+      "$deprecation$public int get$capitalized_name$Value(int index) {\n"
       "  return $name$_.get(index);\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   if (descriptor_->is_packed() &&
@@ -702,27 +676,23 @@
     //   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"
+    "$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"
+    "$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"
+    "$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 Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    int index, $type$ value) {\n"
     "  if (value == null) {\n"
     "    throw new NullPointerException();\n"
@@ -732,10 +702,9 @@
     "  $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"
+    "$deprecation$public Builder add$capitalized_name$($type$ value) {\n"
     "  if (value == null) {\n"
     "    throw new NullPointerException();\n"
     "  }\n"
@@ -744,10 +713,9 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\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"
@@ -756,54 +724,47 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$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"
+      "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"
+      "$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"
+      "$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 "
-      "${$add$capitalized_name$Value$}$(int value) {\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 ${$addAll$capitalized_name$Value$}$(\n"
+      "$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"
@@ -812,7 +773,6 @@
       "  $on_changed$\n"
       "  return this;\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 }
 
@@ -879,9 +839,13 @@
   } else {
     printer->Print(variables_,
       "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.$for_number$(rawValue);\n"
-      "if (value == null) {\n"
-      "  unknownFields.mergeVarintField($number$, rawValue);\n"
+      "$type$ value = $type$.forNumber(rawValue);\n"
+        "if (value == null) {\n");
+    if (PreserveUnknownFields(descriptor_->containing_type())) {
+      printer->Print(variables_,
+        "  unknownFields.mergeVarintField($number$, rawValue);\n");
+    }
+    printer->Print(variables_,
       "} else {\n"
       "  if (!$get_mutable_bit_parser$) {\n"
       "    $name$_ = new java.util.ArrayList<java.lang.Integer>();\n"
@@ -923,8 +887,8 @@
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
       "if (get$capitalized_name$List().size() > 0) {\n"
-      "  output.writeUInt32NoTag($tag$);\n"
-      "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
+      "  output.writeRawVarint32($tag$);\n"
+      "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
       "}\n"
       "for (int i = 0; i < $name$_.size(); i++) {\n"
       "  output.writeEnumNoTag($name$_.get(i));\n"
@@ -956,7 +920,7 @@
       "if (!get$capitalized_name$List().isEmpty()) {"
       "  size += $tag_size$;\n"
       "  size += com.google.protobuf.CodedOutputStream\n"
-      "    .computeUInt32SizeNoTag(dataSize);\n"
+      "    .computeRawVarint32Size(dataSize);\n"
       "}");
   } else {
     printer->Print(variables_,
diff --git a/src/google/protobuf/compiler/java/java_enum_field.h b/src/google/protobuf/compiler/java/java_enum_field.h
index 924ff28..b8ff734 100644
--- a/src/google/protobuf/compiler/java/java_enum_field.h
+++ b/src/google/protobuf/compiler/java/java_enum_field.h
@@ -82,7 +82,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -143,7 +143,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
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 a4de1e2..908d6db 100644
--- a/src/google/protobuf/compiler/java/java_enum_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_enum_field_lite.cc
@@ -58,7 +58,7 @@
                       int builderBitIndex,
                       const FieldGeneratorInfo* info,
                       ClassNameResolver* name_resolver,
-                      std::map<string, string>* variables) {
+                      map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["type"] =
@@ -68,15 +68,13 @@
   (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
   (*variables)["default_number"] = SimpleItoa(
       descriptor->default_value_enum()->number());
-  (*variables)["tag"] =
-      SimpleItoa(static_cast<int32>(internal::WireFormat::MakeTag(descriptor)));
+  (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor));
   (*variables)["tag_size"] = SimpleItoa(
       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)["required"] = descriptor->is_required() ? "true" : "false";
 
   if (SupportFieldPresence(descriptor->file())) {
     // For singular messages and builders, one bit is used for the hasField bit.
@@ -165,26 +163,23 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+      "$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"
+    "$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())) {
@@ -217,50 +212,43 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableEnumFieldLiteGenerator::
@@ -270,9 +258,7 @@
 
 void ImmutableEnumFieldLiteGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
-  if (!IsDefaultValueJavaDefault(descriptor_)) {
-    printer->Print(variables_, "$name$_ = $default_number$;\n");
-  }
+  printer->Print(variables_, "$name$_ = $default_number$;\n");
 }
 
 void ImmutableEnumFieldLiteGenerator::
@@ -306,8 +292,12 @@
     printer->Print(variables_,
       "int rawValue = input.readEnum();\n"
       "$type$ value = $type$.forNumber(rawValue);\n"
-      "if (value == null) {\n"
-      "  super.mergeVarintField($number$, rawValue);\n"
+      "if (value == null) {\n");
+    if (PreserveUnknownFields(descriptor_->containing_type())) {
+      printer->Print(variables_,
+        "  super.mergeVarintField($number$, rawValue);\n");
+    }
+    printer->Print(variables_,
       "} else {\n"
       "  $set_has_field_bit_message$\n"
       "  $name$_ = rawValue;\n"
@@ -320,7 +310,6 @@
   // noop for enums
 }
 
-
 void ImmutableEnumFieldLiteGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
   printer->Print(variables_,
@@ -378,32 +367,29 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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())) {
@@ -433,56 +419,48 @@
     "}\n");
 }
 
-
 void ImmutableEnumOneofFieldLiteGenerator::
 GenerateBuilderMembers(io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableEnumOneofFieldLiteGenerator::
@@ -503,8 +481,12 @@
     printer->Print(variables_,
       "int rawValue = input.readEnum();\n"
       "$type$ value = $type$.forNumber(rawValue);\n"
-      "if (value == null) {\n"
-      "  super.mergeVarintField($number$, rawValue);\n"
+      "if (value == null) {\n");
+    if (PreserveUnknownFields(descriptor_->containing_type())) {
+      printer->Print(variables_,
+        "  super.mergeVarintField($number$, rawValue);\n");
+    }
+    printer->Print(variables_,
       "} else {\n"
       "  $set_oneof_case_message$;\n"
       "  $oneof_name$_ = rawValue;\n"
@@ -619,41 +601,35 @@
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\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_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+    "$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"
+    "$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_,
       "$deprecation$public java.util.List<java.lang.Integer>\n"
-      "${$get$capitalized_name$ValueList$}$() {\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"
+      "$deprecation$public int get$capitalized_name$Value(int index) {\n"
       "  return $name$_.getInt(index);\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
-  if (descriptor_->is_packed() &&
+  if (descriptor_->options().packed() &&
       context_->HasGeneratedMethods(descriptor_->containing_type())) {
     printer->Print(variables_,
       "private int $name$MemoizedSerializedSize;\n");
@@ -727,104 +703,89 @@
   }
 }
 
-
 void RepeatedImmutableEnumFieldLiteGenerator::
 GenerateBuilderMembers(io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\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(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\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"
+    "$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"
+    "$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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\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"
+      "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_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\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"
+      "$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"
+      "$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"
+      "$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_);
   }
 }
 
@@ -921,11 +882,11 @@
 
 void RepeatedImmutableEnumFieldLiteGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
-  if (descriptor_->is_packed()) {
+  if (descriptor_->options().packed()) {
     printer->Print(variables_,
       "if (get$capitalized_name$List().size() > 0) {\n"
-      "  output.writeUInt32NoTag($tag$);\n"
-      "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
+      "  output.writeRawVarint32($tag$);\n"
+      "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
       "}\n"
       "for (int i = 0; i < $name$_.size(); i++) {\n"
       "  output.writeEnumNoTag($name$_.getInt(i));\n"
@@ -952,12 +913,12 @@
     "}\n");
   printer->Print(
     "size += dataSize;\n");
-  if (descriptor_->is_packed()) {
+  if (descriptor_->options().packed()) {
     printer->Print(variables_,
       "if (!get$capitalized_name$List().isEmpty()) {"
       "  size += $tag_size$;\n"
       "  size += com.google.protobuf.CodedOutputStream\n"
-      "    .computeUInt32SizeNoTag(dataSize);\n"
+      "    .computeRawVarint32Size(dataSize);\n"
       "}");
   } else {
     printer->Print(variables_,
@@ -965,7 +926,7 @@
   }
 
   // cache the data size for packed fields.
-  if (descriptor_->is_packed()) {
+  if (descriptor_->options().packed()) {
     printer->Print(variables_,
       "$name$MemoizedSerializedSize = dataSize;\n");
   }
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 fa00472..9201b8d 100644
--- a/src/google/protobuf/compiler/java/java_enum_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_enum_field_lite.h
@@ -81,7 +81,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -142,7 +142,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
diff --git a/src/google/protobuf/compiler/java/java_enum_lite.cc b/src/google/protobuf/compiler/java/java_enum_lite.cc
index ab3b332..c22da8d 100644
--- a/src/google/protobuf/compiler/java/java_enum_lite.cc
+++ b/src/google/protobuf/compiler/java/java_enum_lite.cc
@@ -49,12 +49,22 @@
 namespace compiler {
 namespace java {
 
+namespace {
+bool EnumHasCustomOptions(const EnumDescriptor* descriptor) {
+  if (descriptor->options().unknown_fields().field_count() > 0) return true;
+  for (int i = 0; i < descriptor->value_count(); ++i) {
+    const EnumValueDescriptor* value = descriptor->value(i);
+    if (value->options().unknown_fields().field_count() > 0) return true;
+  }
+  return false;
+}
+}  // namespace
+
 EnumLiteGenerator::EnumLiteGenerator(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),
+    name_resolver_(context->GetNameResolver())  {
   for (int i = 0; i < descriptor_->value_count(); i++) {
     const EnumValueDescriptor* value = descriptor_->value(i);
     const EnumValueDescriptor* canonical_value =
@@ -75,16 +85,14 @@
 
 void EnumLiteGenerator::Generate(io::Printer* printer) {
   WriteEnumDocComment(printer, descriptor_);
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_, immutable_api_);
   printer->Print(
-      "public enum $classname$\n"
-      "    implements com.google.protobuf.Internal.EnumLite {\n",
-      "classname", descriptor_->name());
-  printer->Annotate("classname", descriptor_);
+    "public enum $classname$\n"
+    "    implements com.google.protobuf.Internal.EnumLite {\n",
+    "classname", descriptor_->name());
   printer->Indent();
 
   for (int i = 0; i < canonical_values_.size(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["name"] = canonical_values_[i]->name();
     vars["number"] = SimpleItoa(canonical_values_[i]->number());
     WriteEnumValueDocComment(printer, canonical_values_[i]);
@@ -93,12 +101,10 @@
     }
     printer->Print(vars,
       "$name$($number$),\n");
-    printer->Annotate("name", canonical_values_[i]);
   }
 
   if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print("${$UNRECOGNIZED$}$(-1),\n", "{", "", "}", "");
-    printer->Annotate("{", "}", descriptor_);
+    printer->Print("UNRECOGNIZED(-1),\n");
   }
 
   printer->Print(
@@ -108,56 +114,44 @@
   // -----------------------------------------------------------------
 
   for (int i = 0; i < aliases_.size(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["classname"] = descriptor_->name();
     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->Annotate("name", aliases_[i].value);
   }
 
   for (int i = 0; i < descriptor_->value_count(); i++) {
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["name"] = descriptor_->value(i)->name();
     vars["number"] = SimpleItoa(descriptor_->value(i)->number());
-    vars["{"] = "";
-    vars["}"] = "";
     WriteEnumValueDocComment(printer, descriptor_->value(i));
     printer->Print(vars,
-      "public static final int ${$$name$_VALUE$}$ = $number$;\n");
-    printer->Annotate("{", "}", descriptor_->value(i));
+      "public static final int $name$_VALUE = $number$;\n");
   }
   printer->Print("\n");
 
   // -----------------------------------------------------------------
 
   printer->Print(
-      "\n"
-      "public final int getNumber() {\n");
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(
-        "  if (this == UNRECOGNIZED) {\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());
+    "\n"
+    "public final int getNumber() {\n"
+    "  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();
 
diff --git a/src/google/protobuf/compiler/java/java_enum_lite.h b/src/google/protobuf/compiler/java/java_enum_lite.h
index b7be912..ee2f5f7 100644
--- a/src/google/protobuf/compiler/java/java_enum_lite.h
+++ b/src/google/protobuf/compiler/java/java_enum_lite.h
@@ -58,8 +58,9 @@
 
 class EnumLiteGenerator {
  public:
-  EnumLiteGenerator(const EnumDescriptor* descriptor, bool immutable_api,
-                    Context* context);
+  explicit EnumLiteGenerator(const EnumDescriptor* descriptor,
+                         bool immutable_api,
+                         Context* context);
   ~EnumLiteGenerator();
 
   void Generate(io::Printer* printer);
@@ -72,13 +73,13 @@
   // considered equivalent.  We treat the first defined constant for any
   // given numeric value as "canonical" and the rest as aliases of that
   // canonical value.
-  std::vector<const EnumValueDescriptor*> canonical_values_;
+  vector<const EnumValueDescriptor*> canonical_values_;
 
   struct Alias {
     const EnumValueDescriptor* value;
     const EnumValueDescriptor* canonical_value;
   };
-  std::vector<Alias> aliases_;
+  vector<Alias> aliases_;
 
   bool immutable_api_;
 
diff --git a/src/google/protobuf/compiler/java/java_extension.cc b/src/google/protobuf/compiler/java/java_extension.cc
index 9b9be55..46b5faa 100644
--- a/src/google/protobuf/compiler/java/java_extension.cc
+++ b/src/google/protobuf/compiler/java/java_extension.cc
@@ -61,10 +61,12 @@
 ImmutableExtensionGenerator::~ImmutableExtensionGenerator() {}
 
 // Initializes the vars referenced in the generated code templates.
-void ExtensionGenerator::InitTemplateVars(
-    const FieldDescriptor* descriptor, const string& scope, bool immutable,
-    ClassNameResolver* name_resolver, std::map<string, string>* vars_pointer) {
-  std::map<string, string> &vars = *vars_pointer;
+void ExtensionGenerator::InitTemplateVars(const FieldDescriptor* descriptor,
+                                          const string& scope,
+                                          bool immutable,
+                                          ClassNameResolver* name_resolver,
+                                          map<string, string>* vars_pointer) {
+  map<string, string> &vars = *vars_pointer;
   vars["scope"] = scope;
   vars["name"] = UnderscoresToCamelCase(descriptor);
   vars["containing_type"] =
@@ -75,7 +77,7 @@
   vars["default"] = descriptor->is_repeated() ?
       "" : DefaultValue(descriptor, immutable, name_resolver);
   vars["type_constant"] = FieldTypeName(GetType(descriptor));
-  vars["packed"] = descriptor->is_packed() ? "true" : "false";
+  vars["packed"] = descriptor->options().packed() ? "true" : "false";
   vars["enum_map"] = "null";
   vars["prototype"] = "null";
 
@@ -108,7 +110,7 @@
 }
 
 void ImmutableExtensionGenerator::Generate(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   const bool kUseImmutableNames = true;
   InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_,
                    &vars);
diff --git a/src/google/protobuf/compiler/java/java_extension.h b/src/google/protobuf/compiler/java/java_extension.h
index fb8d520..bdd4226 100644
--- a/src/google/protobuf/compiler/java/java_extension.h
+++ b/src/google/protobuf/compiler/java/java_extension.h
@@ -79,7 +79,7 @@
                                const string& scope,
                                bool immutable,
                                ClassNameResolver* name_resolver,
-                               std::map<string, string>* vars_pointer);
+                               map<string, string>* vars_pointer);
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator);
diff --git a/src/google/protobuf/compiler/java/java_extension_lite.cc b/src/google/protobuf/compiler/java/java_extension_lite.cc
index c48c92e..23261ba 100644
--- a/src/google/protobuf/compiler/java/java_extension_lite.cc
+++ b/src/google/protobuf/compiler/java/java_extension_lite.cc
@@ -57,7 +57,7 @@
 ImmutableExtensionLiteGenerator::~ImmutableExtensionLiteGenerator() {}
 
 void ImmutableExtensionLiteGenerator::Generate(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   const bool kUseImmutableNames = true;
   InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_,
                    &vars);
diff --git a/src/google/protobuf/compiler/java/java_field.cc b/src/google/protobuf/compiler/java/java_field.cc
index 1ab1862..3c7bc5c 100644
--- a/src/google/protobuf/compiler/java/java_field.cc
+++ b/src/google/protobuf/compiler/java/java_field.cc
@@ -45,6 +45,8 @@
 #include <google/protobuf/compiler/java/java_enum_field.h>
 #include <google/protobuf/compiler/java/java_enum_field_lite.h>
 #include <google/protobuf/compiler/java/java_helpers.h>
+#include <google/protobuf/compiler/java/java_lazy_message_field.h>
+#include <google/protobuf/compiler/java/java_lazy_message_field_lite.h>
 #include <google/protobuf/compiler/java/java_map_field.h>
 #include <google/protobuf/compiler/java/java_map_field_lite.h>
 #include <google/protobuf/compiler/java/java_message_field.h>
@@ -75,8 +77,13 @@
           return new ImmutableMapFieldGenerator(
               field, messageBitIndex, builderBitIndex, context);
         } else {
-          return new RepeatedImmutableMessageFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          if (IsLazy(field, context->EnforceLite())) {
+            return new RepeatedImmutableLazyMessageFieldGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          } else {
+            return new RepeatedImmutableMessageFieldGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          }
         }
       case JAVATYPE_ENUM:
         return new RepeatedImmutableEnumFieldGenerator(
@@ -92,8 +99,13 @@
     if (field->containing_oneof()) {
       switch (GetJavaType(field)) {
         case JAVATYPE_MESSAGE:
-          return new ImmutableMessageOneofFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          if (IsLazy(field, context->EnforceLite())) {
+            return new ImmutableLazyMessageOneofFieldGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          } else {
+            return new ImmutableMessageOneofFieldGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          }
         case JAVATYPE_ENUM:
           return new ImmutableEnumOneofFieldGenerator(
               field, messageBitIndex, builderBitIndex, context);
@@ -107,8 +119,13 @@
     } else {
       switch (GetJavaType(field)) {
         case JAVATYPE_MESSAGE:
-          return new ImmutableMessageFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          if (IsLazy(field, context->EnforceLite())) {
+            return new ImmutableLazyMessageFieldGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          } else {
+            return new ImmutableMessageFieldGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          }
         case JAVATYPE_ENUM:
           return new ImmutableEnumFieldGenerator(
               field, messageBitIndex, builderBitIndex, context);
@@ -133,8 +150,13 @@
           return new ImmutableMapFieldLiteGenerator(
               field, messageBitIndex, builderBitIndex, context);
         } else {
-          return new RepeatedImmutableMessageFieldLiteGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          if (IsLazy(field, context->EnforceLite())) {
+            return new RepeatedImmutableLazyMessageFieldLiteGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          } else {
+            return new RepeatedImmutableMessageFieldLiteGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          }
         }
       case JAVATYPE_ENUM:
         return new RepeatedImmutableEnumFieldLiteGenerator(
@@ -150,8 +172,13 @@
     if (field->containing_oneof()) {
       switch (GetJavaType(field)) {
         case JAVATYPE_MESSAGE:
-          return new ImmutableMessageOneofFieldLiteGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          if (IsLazy(field, context->EnforceLite())) {
+            return new ImmutableLazyMessageOneofFieldLiteGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          } else {
+            return new ImmutableMessageOneofFieldLiteGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          }
         case JAVATYPE_ENUM:
           return new ImmutableEnumOneofFieldLiteGenerator(
               field, messageBitIndex, builderBitIndex, context);
@@ -165,8 +192,13 @@
     } else {
       switch (GetJavaType(field)) {
         case JAVATYPE_MESSAGE:
-          return new ImmutableMessageFieldLiteGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          if (IsLazy(field, context->EnforceLite())) {
+            return new ImmutableLazyMessageFieldLiteGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          } else {
+            return new ImmutableMessageFieldLiteGenerator(
+                field, messageBitIndex, builderBitIndex, context);
+          }
         case JAVATYPE_ENUM:
           return new ImmutableEnumFieldLiteGenerator(
               field, messageBitIndex, builderBitIndex, context);
@@ -258,25 +290,18 @@
 
 void SetCommonFieldVariables(const FieldDescriptor* descriptor,
                              const FieldGeneratorInfo* info,
-                             std::map<string, string>* variables) {
+                             map<string, string>* variables) {
   (*variables)["field_name"] = descriptor->name();
   (*variables)["name"] = info->name;
-  (*variables)["classname"] = descriptor->containing_type()->name();
   (*variables)["capitalized_name"] = info->capitalized_name;
   (*variables)["disambiguated_reason"] = info->disambiguated_reason;
   (*variables)["constant_name"] = FieldConstantName(descriptor);
   (*variables)["number"] = SimpleItoa(descriptor->number());
-  // These variables are placeholders to pick out the beginning and ends of
-  // identifiers for annotations (when doing so with existing variables would
-  // be ambiguous or impossible). They should never be set to anything but the
-  // empty string.
-  (*variables)["{"] = "";
-  (*variables)["}"] = "";
 }
 
 void SetCommonOneofVariables(const FieldDescriptor* descriptor,
                              const OneofGeneratorInfo* info,
-                             std::map<string, string>* variables) {
+                             map<string, string>* variables) {
   (*variables)["oneof_name"] = info->name;
   (*variables)["oneof_capitalized_name"] = info->capitalized_name;
   (*variables)["oneof_index"] =
@@ -289,9 +314,9 @@
       "Case_ == " + SimpleItoa(descriptor->number());
 }
 
-void PrintExtraFieldInfo(const std::map<string, string>& variables,
+void PrintExtraFieldInfo(const map<string, string>& variables,
                          io::Printer* printer) {
-  const std::map<string, string>::const_iterator it =
+  const map<string, string>::const_iterator it =
       variables.find("disambiguated_reason");
   if (it != variables.end() && !it->second.empty()) {
     printer->Print(
diff --git a/src/google/protobuf/compiler/java/java_field.h b/src/google/protobuf/compiler/java/java_field.h
index cc1d83d..4dd4f57 100644
--- a/src/google/protobuf/compiler/java/java_field.h
+++ b/src/google/protobuf/compiler/java/java_field.h
@@ -119,7 +119,6 @@
   virtual void GenerateEqualsCode(io::Printer* printer) const = 0;
   virtual void GenerateHashCode(io::Printer* printer) const = 0;
 
-
   virtual string GetBoxedType() const = 0;
 
  private:
@@ -170,7 +169,7 @@
   string disambiguated_reason;
 };
 
-// Oneof information used in OneofFieldGenerators.
+// Oneof information used in OneofFieldGeneartors.
 struct OneofGeneratorInfo {
   string name;
   string capitalized_name;
@@ -179,15 +178,15 @@
 // Set some common variables used in variable FieldGenerators.
 void SetCommonFieldVariables(const FieldDescriptor* descriptor,
                              const FieldGeneratorInfo* info,
-                             std::map<string, string>* variables);
+                             map<string, string>* variables);
 
 // Set some common oneof variables used in OneofFieldGenerators.
 void SetCommonOneofVariables(const FieldDescriptor* descriptor,
                              const OneofGeneratorInfo* info,
-                             std::map<string, string>* variables);
+                             map<string, string>* variables);
 
 // Print useful comments before a field's accessors.
-void PrintExtraFieldInfo(const std::map<string, string>& variables,
+void PrintExtraFieldInfo(const map<string, string>& variables,
                          io::Printer* printer);
 
 }  // namespace java
diff --git a/src/google/protobuf/compiler/java/java_file.cc b/src/google/protobuf/compiler/java/java_file.cc
index 21133a1..a9cc1d0 100644
--- a/src/google/protobuf/compiler/java/java_file.cc
+++ b/src/google/protobuf/compiler/java/java_file.cc
@@ -90,7 +90,7 @@
   // There are unknown fields that could be extensions, thus this call fails.
   if (reflection->GetUnknownFields(message).field_count() > 0) return false;
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message, &fields);
 
   for (int i = 0; i < fields.size(); i++) {
@@ -154,6 +154,12 @@
   }
 }
 
+// Compare two field descriptors, returning true if the first should come
+// before the second.
+bool CompareFieldsByName(const FieldDescriptor *a, const FieldDescriptor *b) {
+  return a->full_name() < b->full_name();
+}
+
 // Our static initialization methods can become very, very large.
 // So large that if we aren't careful we end up blowing the JVM's
 // 64K bytes of bytecode/method. Fortunately, since these static
@@ -183,21 +189,23 @@
     *bytecode_estimate = 0;
   }
 }
+
+
 }  // namespace
 
-FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options,
-                             bool immutable_api)
+FileGenerator::FileGenerator(const FileDescriptor* file, bool immutable_api,
+                             bool enforce_lite)
     : file_(file),
       java_package_(FileJavaPackage(file, immutable_api)),
       message_generators_(
           new google::protobuf::scoped_ptr<MessageGenerator>[file->message_type_count()]),
       extension_generators_(
           new google::protobuf::scoped_ptr<ExtensionGenerator>[file->extension_count()]),
-      context_(new Context(file, options)),
+      context_(new Context(file)),
       name_resolver_(context_->GetNameResolver()),
-      options_(options),
       immutable_api_(immutable_api) {
   classname_ = name_resolver_->GetFileClassName(file, immutable_api);
+  context_->SetEnforceLite(enforce_lite);
   generator_factory_.reset(
       new ImmutableGeneratorFactory(context_.get()));
   for (int i = 0; i < file_->message_type_count(); ++i) {
@@ -245,23 +253,19 @@
       "\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_);
-  printer->Annotate("classname", file_->name());
+    "public final class $classname$ {\n"
+    "  private $classname$() {}\n",
+    "classname", classname_);
   printer->Indent();
 
   // -----------------------------------------------------------------
 
   printer->Print(
     "public static void registerAllExtensions(\n"
-    "    com.google.protobuf.ExtensionRegistryLite registry) {\n");
+    "    com.google.protobuf.ExtensionRegistry$lite$ registry) {\n",
+    "lite",
+    HasDescriptorMethods(file_, context_->EnforceLite()) ? "" : "Lite");
 
   printer->Indent();
 
@@ -276,20 +280,6 @@
   printer->Outdent();
   printer->Print(
     "}\n");
-  if (HasDescriptorMethods(file_, context_->EnforceLite())) {
-    // Overload registerAllExtensions for the non-lite usage to
-    // redundantly maintain the original signature (this is
-    // redundant because ExtensionRegistryLite now invokes
-    // 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");
-  }
 
   // -----------------------------------------------------------------
 
@@ -382,7 +372,7 @@
     "final", "");
   printer->Indent();
 
-  SharedCodeGenerator shared_code_generator(file_, options_);
+  SharedCodeGenerator shared_code_generator(file_);
   shared_code_generator.GenerateDescriptors(printer);
 
   int bytecode_estimate = 0;
@@ -502,57 +492,19 @@
     // Try to load immutable messages' outer class. Its initialization code
     // will take care of interpreting custom options.
     printer->Print(
-        "try {\n"
-        // Note that we have to load the immutable class dynamically here as
-        // we want the mutable code to be independent from the immutable code
-        // at compile time. It is required to implement dual-compile for
-        // mutable and immutable API in blaze.
-        "  java.lang.Class immutableClass = java.lang.Class.forName(\n"
-        "      \"$immutable_classname$\");\n"
-        "} catch (java.lang.ClassNotFoundException e) {\n",
-        "immutable_classname", name_resolver_->GetImmutableClassName(file_));
-    printer->Indent();
-
-    // The immutable class can not be found. We try our best to collect all
-    // custom option extensions to interpret the custom options.
-    printer->Print(
-        "com.google.protobuf.ExtensionRegistry registry =\n"
-        "    com.google.protobuf.ExtensionRegistry.newInstance();\n"
-        "com.google.protobuf.MessageLite defaultExtensionInstance = null;\n");
-    FieldDescriptorSet::iterator it;
-    for (it = extensions.begin(); it != extensions.end(); it++) {
-      const FieldDescriptor* field = *it;
-      string scope;
-      if (field->extension_scope() != NULL) {
-        scope = name_resolver_->GetMutableClassName(field->extension_scope()) +
-                ".getDescriptor()";
-      } else {
-        scope = FileJavaPackage(field->file(), true) + "." +
-                name_resolver_->GetDescriptorClassName(field->file()) +
-                ".descriptor";
-      }
-      if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-        printer->Print(
-            "defaultExtensionInstance = com.google.protobuf.Internal\n"
-            "    .getDefaultInstance(\"$class$\");\n"
-            "if (defaultExtensionInstance != null) {\n"
-            "  registry.add(\n"
-            "      $scope$.getExtensions().get($index$),\n"
-            "      (com.google.protobuf.Message) defaultExtensionInstance);\n"
-            "}\n",
-            "scope", scope, "index", SimpleItoa(field->index()), "class",
-            name_resolver_->GetImmutableClassName(field->message_type()));
-      } else {
-        printer->Print("registry.add($scope$.getExtensions().get($index$));\n",
-                       "scope", scope, "index", SimpleItoa(field->index()));
-      }
-    }
-    printer->Print(
-        "com.google.protobuf.Descriptors.FileDescriptor\n"
-        "    .internalUpdateFileDescriptor(descriptor, registry);\n");
-
-    printer->Outdent();
-    printer->Print("}\n");
+      "try {\n"
+      // Note that we have to load the immutable class dynamically here as
+      // we want the mutable code to be independent from the immutable code
+      // at compile time. It is required to implement dual-compile for
+      // mutable and immutable API in blaze.
+      "  java.lang.Class immutableClass = java.lang.Class.forName(\n"
+      "      \"$immutable_classname$\");\n"
+      "} catch (java.lang.ClassNotFoundException e) {\n"
+      // The immutable class can not be found. Custom options are left
+      // as unknown fields.
+      // TODO(xiaofeng): inform the user with a warning?
+      "}\n",
+      "immutable_classname", name_resolver_->GetImmutableClassName(file_));
   }
 
   // Force descriptor initialization of all dependencies.
@@ -571,26 +523,20 @@
     "}\n");
 }
 
-template <typename GeneratorClass, typename DescriptorClass>
+template<typename GeneratorClass, typename DescriptorClass>
 static void GenerateSibling(const string& package_dir,
                             const string& java_package,
                             const DescriptorClass* descriptor,
                             GeneratorContext* context,
-                            std::vector<string>* file_list, bool annotate_code,
-                            std::vector<string>* annotation_list,
+                            vector<string>* file_list,
                             const string& name_suffix,
                             GeneratorClass* generator,
                             void (GeneratorClass::*pfn)(io::Printer* printer)) {
   string filename = package_dir + descriptor->name() + name_suffix + ".java";
   file_list->push_back(filename);
-  string info_full_path = filename + ".pb.meta";
-  GeneratedCodeInfo annotations;
-  io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
-      &annotations);
 
   google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
-  io::Printer printer(output.get(), '$',
-                      annotate_code ? &annotation_collector : NULL);
+  io::Printer printer(output.get(), '$');
 
   printer.Print(
     "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
@@ -605,57 +551,55 @@
   }
 
   (generator->*pfn)(&printer);
-
-  if (annotate_code) {
-    google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> info_output(
-        context->Open(info_full_path));
-    annotations.SerializeToZeroCopyStream(info_output.get());
-    annotation_list->push_back(info_full_path);
-  }
 }
 
 void FileGenerator::GenerateSiblings(const string& package_dir,
                                      GeneratorContext* context,
-                                     std::vector<string>* file_list,
-                                     std::vector<string>* annotation_list) {
+                                     vector<string>* file_list) {
   if (MultipleJavaFiles(file_, immutable_api_)) {
     for (int i = 0; i < file_->enum_type_count(); i++) {
       if (HasDescriptorMethods(file_, context_->EnforceLite())) {
         EnumGenerator generator(file_->enum_type(i), immutable_api_,
                                 context_.get());
-        GenerateSibling<EnumGenerator>(
-            package_dir, java_package_, file_->enum_type(i), context, file_list,
-            options_.annotate_code, annotation_list, "", &generator,
-            &EnumGenerator::Generate);
+        GenerateSibling<EnumGenerator>(package_dir, java_package_,
+                                       file_->enum_type(i),
+                                       context, file_list, "",
+                                       &generator,
+                                       &EnumGenerator::Generate);
       } else {
         EnumLiteGenerator generator(file_->enum_type(i), immutable_api_,
                                     context_.get());
-        GenerateSibling<EnumLiteGenerator>(
-            package_dir, java_package_, file_->enum_type(i), context, file_list,
-            options_.annotate_code, annotation_list, "", &generator,
-            &EnumLiteGenerator::Generate);
+        GenerateSibling<EnumLiteGenerator>(package_dir, java_package_,
+                                           file_->enum_type(i),
+                                           context, file_list, "",
+                                           &generator,
+                                           &EnumLiteGenerator::Generate);
       }
     }
     for (int i = 0; i < file_->message_type_count(); i++) {
       if (immutable_api_) {
-        GenerateSibling<MessageGenerator>(
-            package_dir, java_package_, file_->message_type(i), context,
-            file_list, options_.annotate_code, annotation_list, "OrBuilder",
-            message_generators_[i].get(), &MessageGenerator::GenerateInterface);
+        GenerateSibling<MessageGenerator>(package_dir, java_package_,
+                                          file_->message_type(i),
+                                          context, file_list,
+                                          "OrBuilder",
+                                          message_generators_[i].get(),
+                                          &MessageGenerator::GenerateInterface);
       }
-      GenerateSibling<MessageGenerator>(
-          package_dir, java_package_, file_->message_type(i), context,
-          file_list, options_.annotate_code, annotation_list, "",
-          message_generators_[i].get(), &MessageGenerator::Generate);
+      GenerateSibling<MessageGenerator>(package_dir, java_package_,
+                                        file_->message_type(i),
+                                        context, file_list, "",
+                                        message_generators_[i].get(),
+                                        &MessageGenerator::Generate);
     }
     if (HasGenericServices(file_, context_->EnforceLite())) {
       for (int i = 0; i < file_->service_count(); i++) {
         google::protobuf::scoped_ptr<ServiceGenerator> generator(
             generator_factory_->NewServiceGenerator(file_->service(i)));
-        GenerateSibling<ServiceGenerator>(
-            package_dir, java_package_, file_->service(i), context, file_list,
-            options_.annotate_code, annotation_list, "", generator.get(),
-            &ServiceGenerator::Generate);
+        GenerateSibling<ServiceGenerator>(package_dir, java_package_,
+                                          file_->service(i),
+                                          context, file_list, "",
+                                          generator.get(),
+                                          &ServiceGenerator::Generate);
       }
     }
   }
diff --git a/src/google/protobuf/compiler/java/java_file.h b/src/google/protobuf/compiler/java/java_file.h
index e95aef0..7dbeb94 100644
--- a/src/google/protobuf/compiler/java/java_file.h
+++ b/src/google/protobuf/compiler/java/java_file.h
@@ -42,7 +42,6 @@
 #include <string>
 #include <vector>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/java_options.h>
 
 namespace google {
 namespace protobuf {
@@ -68,8 +67,8 @@
 
 class FileGenerator {
  public:
-  FileGenerator(const FileDescriptor* file, const Options& options,
-                bool immutable_api = true);
+  FileGenerator(const FileDescriptor* file, bool immutable_api = true,
+                bool enforce_lite = false);
   ~FileGenerator();
 
   // Checks for problems that would otherwise lead to cryptic compile errors.
@@ -84,12 +83,12 @@
   // service type).
   void GenerateSiblings(const string& package_dir,
                         GeneratorContext* generator_context,
-                        std::vector<string>* file_list,
-                        std::vector<string>* annotation_list);
+                        vector<string>* file_list);
 
   const string& java_package() { return java_package_; }
   const string& classname()    { return classname_;    }
 
+
  private:
   void GenerateDescriptorInitializationCodeForImmutable(io::Printer* printer);
   void GenerateDescriptorInitializationCodeForMutable(io::Printer* printer);
@@ -106,9 +105,9 @@
   google::protobuf::scoped_ptr<GeneratorFactory> generator_factory_;
   google::protobuf::scoped_ptr<Context> context_;
   ClassNameResolver* name_resolver_;
-  const Options options_;
   bool immutable_api_;
 
+
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);
 };
 
diff --git a/src/google/protobuf/compiler/java/java_generator.cc b/src/google/protobuf/compiler/java/java_generator.cc
index 84a3b90..a46c7fc 100644
--- a/src/google/protobuf/compiler/java/java_generator.cc
+++ b/src/google/protobuf/compiler/java/java_generator.cc
@@ -42,13 +42,10 @@
 #include <google/protobuf/compiler/java/java_file.h>
 #include <google/protobuf/compiler/java/java_generator_factory.h>
 #include <google/protobuf/compiler/java/java_helpers.h>
-#include <google/protobuf/compiler/java/java_name_resolver.h>
-#include <google/protobuf/compiler/java/java_options.h>
 #include <google/protobuf/compiler/java/java_shared_code_generator.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.pb.h>
-
 #include <google/protobuf/stubs/strutil.h>
 
 namespace google {
@@ -67,58 +64,63 @@
   // -----------------------------------------------------------------
   // parse generator options
 
+  // Name a file where we will write a list of generated file names, one
+  // per line.
+  string output_list_file;
 
-  std::vector<std::pair<string, string> > options;
+
+  vector<pair<string, string> > options;
   ParseGeneratorParameter(parameter, &options);
-  Options file_options;
 
+  bool generate_immutable_code = false;
+  bool generate_mutable_code = false;
+  bool generate_shared_code = false;
+  bool enforce_lite = false;
   for (int i = 0; i < options.size(); i++) {
     if (options[i].first == "output_list_file") {
-      file_options.output_list_file = options[i].second;
+      output_list_file = options[i].second;
     } else if (options[i].first == "immutable") {
-      file_options.generate_immutable_code = true;
+      generate_immutable_code = true;
     } else if (options[i].first == "mutable") {
-      file_options.generate_mutable_code = true;
+      generate_mutable_code = true;
     } else if (options[i].first == "shared") {
-      file_options.generate_shared_code = true;
-    } else if (options[i].first == "annotate_code") {
-      file_options.annotate_code = true;
-    } else if (options[i].first == "annotation_list_file") {
-      file_options.annotation_list_file = options[i].second;
+      generate_shared_code = true;
+    } else if (options[i].first == "lite") {
+      // When set, the protoc will generate the current files and all the
+      // transitive dependencies as lite runtime.
+      enforce_lite = true;
     } else {
       *error = "Unknown generator option: " + options[i].first;
       return false;
     }
   }
 
-  if (file_options.enforce_lite && file_options.generate_mutable_code) {
+  if (enforce_lite && generate_mutable_code) {
     *error = "lite runtime generator option cannot be used with mutable API.";
     return false;
   }
 
   // By default we generate immutable code and shared code for immutable API.
-  if (!file_options.generate_immutable_code &&
-      !file_options.generate_mutable_code &&
-      !file_options.generate_shared_code) {
-    file_options.generate_immutable_code = true;
-    file_options.generate_shared_code = true;
+  if (!generate_immutable_code && !generate_mutable_code &&
+      !generate_shared_code) {
+    generate_immutable_code = true;
+    generate_shared_code = true;
   }
 
   // -----------------------------------------------------------------
 
 
-  std::vector<string> all_files;
-  std::vector<string> all_annotations;
+  vector<string> all_files;
 
 
-  std::vector<FileGenerator*> file_generators;
-  if (file_options.generate_immutable_code) {
-    file_generators.push_back(new FileGenerator(file, file_options,
-                                                /* immutable = */ true));
+  vector<FileGenerator*> file_generators;
+  if (generate_immutable_code) {
+    file_generators.push_back(
+        new FileGenerator(file, /* immutable = */ true, enforce_lite));
   }
-  if (file_options.generate_mutable_code) {
-    file_generators.push_back(new FileGenerator(file, file_options,
-                                                /* mutable = */ false));
+  if (generate_mutable_code) {
+    file_generators.push_back(
+        new FileGenerator(file, /* mutable = */ false, enforce_lite));
   }
   for (int i = 0; i < file_generators.size(); ++i) {
     if (!file_generators[i]->Validate(error)) {
@@ -138,32 +140,15 @@
     java_filename += file_generator->classname();
     java_filename += ".java";
     all_files.push_back(java_filename);
-    string info_full_path = java_filename + ".pb.meta";
-    if (file_options.annotate_code) {
-      all_annotations.push_back(info_full_path);
-    }
 
     // Generate main java file.
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
         context->Open(java_filename));
-    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_generator->Generate(&printer);
 
     // Generate sibling files.
-    file_generator->GenerateSiblings(package_dir, context, &all_files,
-                                     &all_annotations);
-
-    if (file_options.annotate_code) {
-      google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> info_output(
-          context->Open(info_full_path));
-      annotations.SerializeToZeroCopyStream(info_output.get());
-    }
+    file_generator->GenerateSiblings(package_dir, context, &all_files);
   }
 
   for (int i = 0; i < file_generators.size(); ++i) {
@@ -172,29 +157,17 @@
   file_generators.clear();
 
   // Generate output list if requested.
-  if (!file_options.output_list_file.empty()) {
+  if (!output_list_file.empty()) {
     // Generate output list.  This is just a simple text file placed in a
     // deterministic location which lists the .java files being generated.
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> srclist_raw_output(
-        context->Open(file_options.output_list_file));
+        context->Open(output_list_file));
     io::Printer srclist_printer(srclist_raw_output.get(), '$');
     for (int i = 0; i < all_files.size(); i++) {
       srclist_printer.Print("$filename$\n", "filename", all_files[i]);
     }
   }
 
-  if (!file_options.annotation_list_file.empty()) {
-    // Generate output list.  This is just a simple text file placed in a
-    // deterministic location which lists the .java files being generated.
-    google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> annotation_list_raw_output(
-        context->Open(file_options.annotation_list_file));
-    io::Printer annotation_list_printer(annotation_list_raw_output.get(), '$');
-    for (int i = 0; i < all_annotations.size(); i++) {
-      annotation_list_printer.Print("$filename$\n", "filename",
-                                    all_annotations[i]);
-    }
-  }
-
   return true;
 }
 
diff --git a/src/google/protobuf/compiler/java/java_helpers.cc b/src/google/protobuf/compiler/java/java_helpers.cc
index dbb86b8..e24894b 100644
--- a/src/google/protobuf/compiler/java/java_helpers.cc
+++ b/src/google/protobuf/compiler/java/java_helpers.cc
@@ -37,7 +37,6 @@
 #include <limits>
 #include <vector>
 
-#include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/compiler/java/java_helpers.h>
 #include <google/protobuf/compiler/java/java_name_resolver.h>
 #include <google/protobuf/descriptor.pb.h>
@@ -45,9 +44,6 @@
 #include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 
-
-#include <google/protobuf/stubs/hash.h>  // for hash<T *>
-
 namespace google {
 namespace protobuf {
 namespace compiler {
@@ -105,20 +101,6 @@
 
 }  // namespace
 
-void PrintGeneratedAnnotation(io::Printer* printer, char delimiter,
-                              const string& annotation_file) {
-  if (annotation_file.empty()) {
-    return;
-  }
-  string ptemplate =
-      "@javax.annotation.Generated(value=\"protoc\", comments=\"annotations:";
-  ptemplate.push_back(delimiter);
-  ptemplate.append("annotation_file");
-  ptemplate.push_back(delimiter);
-  ptemplate.append("\")\n");
-  printer->Print(ptemplate.c_str(), "annotation_file", annotation_file);
-}
-
 string UnderscoresToCamelCase(const string& input, bool cap_next_letter) {
   string result;
   // Note:  I distrust ctype.h due to locales.
@@ -170,14 +152,6 @@
   return "static_" + StringReplace(descriptor->full_name(), ".", "_", true);
 }
 
-string CamelCaseFieldName(const FieldDescriptor* field) {
-  string fieldName = UnderscoresToCamelCase(field);
-  if ('0' <= fieldName[0] && fieldName[0] <= '9') {
-    return '_' + fieldName;
-  }
-  return fieldName;
-}
-
 string StripProto(const string& filename) {
   if (HasSuffixString(filename, ".protodevel")) {
     return StripSuffixString(filename, ".protodevel");
@@ -257,7 +231,6 @@
   return name_resolver.GetClassName(descriptor, true);
 }
 
-
 string ExtraMessageInterfaces(const Descriptor* descriptor) {
   string interfaces = "// @@protoc_insertion_point(message_implements:"
       + descriptor->full_name() + ")";
@@ -373,7 +346,6 @@
   return NULL;
 }
 
-
 const char* FieldTypeName(FieldDescriptor::Type field_type) {
   switch (field_type) {
     case FieldDescriptor::TYPE_INT32   : return "INT32";
@@ -429,9 +401,9 @@
              "L";
     case FieldDescriptor::CPPTYPE_DOUBLE: {
       double value = field->default_value_double();
-      if (value == std::numeric_limits<double>::infinity()) {
+      if (value == numeric_limits<double>::infinity()) {
         return "Double.POSITIVE_INFINITY";
-      } else if (value == -std::numeric_limits<double>::infinity()) {
+      } else if (value == -numeric_limits<double>::infinity()) {
         return "Double.NEGATIVE_INFINITY";
       } else if (value != value) {
         return "Double.NaN";
@@ -441,9 +413,9 @@
     }
     case FieldDescriptor::CPPTYPE_FLOAT: {
       float value = field->default_value_float();
-      if (value == std::numeric_limits<float>::infinity()) {
+      if (value == numeric_limits<float>::infinity()) {
         return "Float.POSITIVE_INFINITY";
-      } else if (value == -std::numeric_limits<float>::infinity()) {
+      } else if (value == -numeric_limits<float>::infinity()) {
         return "Float.NEGATIVE_INFINITY";
       } else if (value != value) {
         return "Float.NaN";
@@ -509,9 +481,9 @@
       return field->default_value_float() == 0.0;
     case FieldDescriptor::CPPTYPE_BOOL:
       return field->default_value_bool() == false;
-    case FieldDescriptor::CPPTYPE_ENUM:
-      return field->default_value_enum()->number() == 0;
+
     case FieldDescriptor::CPPTYPE_STRING:
+    case FieldDescriptor::CPPTYPE_ENUM:
     case FieldDescriptor::CPPTYPE_MESSAGE:
       return false;
 
@@ -523,11 +495,6 @@
   return false;
 }
 
-bool IsByteStringWithCustomDefaultValue(const FieldDescriptor* field) {
-  return GetJavaType(field) == JAVATYPE_BYTES &&
-         field->default_value_string() != "";
-}
-
 const char* bit_masks[] = {
   "0x00000001",
   "0x00000002",
@@ -784,137 +751,6 @@
   return false;
 }
 
-// Encode an unsigned 32-bit value into a sequence of UTF-16 characters.
-//
-// If the value is in [0x0000, 0xD7FF], we encode it with a single character
-// with the same numeric value.
-//
-// If the value is larger than 0xD7FF, we encode its lowest 13 bits into a
-// character in the range [0xE000, 0xFFFF] by combining these 13 bits with
-// 0xE000 using logic-or. Then we shift the value to the right by 13 bits, and
-// encode the remaining value by repeating this same process until we get to
-// a value in [0x0000, 0xD7FF] where we will encode it using a character with
-// the same numeric value.
-//
-// Note that we only use code points in [0x0000, 0xD7FF] and [0xE000, 0xFFFF].
-// There will be no surrogate pairs in the encoded character sequence.
-void WriteUInt32ToUtf16CharSequence(uint32 number,
-                                    std::vector<uint16>* output) {
-  // For values in [0x0000, 0xD7FF], only use one char to encode it.
-  if (number < 0xD800) {
-    output->push_back(static_cast<uint16>(number));
-    return;
-  }
-  // Encode into multiple chars. All except the last char will be in the range
-  // [0xE000, 0xFFFF], and the last char will be in the range [0x0000, 0xD7FF].
-  // Note that we don't use any value in range [0xD800, 0xDFFF] because they
-  // have to come in pairs and the encoding is just more space-efficient w/o
-  // them.
-  while (number >= 0xD800) {
-    // [0xE000, 0xFFFF] can represent 13 bits of info.
-    output->push_back(static_cast<uint16>(0xE000 | (number & 0x1FFF)));
-    number >>= 13;
-  }
-  output->push_back(static_cast<uint16>(number));
-}
-
-int GetExperimentalJavaFieldTypeForSingular(const FieldDescriptor* field) {
-  // j/c/g/protobuf/FieldType.java lists field types in a slightly different
-  // order from FieldDescriptor::Type so we can't do a simple cast.
-  //
-  // TODO(xiaofeng): Make j/c/g/protobuf/FieldType.java follow the same order.
-  int result = field->type();
-  if (result == FieldDescriptor::TYPE_GROUP) {
-    return 17;
-  } else if (result < FieldDescriptor::TYPE_GROUP) {
-    return result - 1;
-  } else {
-    return result - 2;
-  }
-}
-
-int GetExperimentalJavaFieldTypeForRepeated(const FieldDescriptor* field) {
-  if (field->type() == FieldDescriptor::TYPE_GROUP) {
-    return 49;
-  } else {
-    return GetExperimentalJavaFieldTypeForSingular(field) + 18;
-  }
-}
-
-int GetExperimentalJavaFieldTypeForPacked(const FieldDescriptor* field) {
-  int result = field->type();
-  if (result < FieldDescriptor::TYPE_STRING) {
-    return result + 34;
-  } else if (result > FieldDescriptor::TYPE_BYTES) {
-    return result + 30;
-  } else {
-    GOOGLE_LOG(FATAL) << field->full_name() << " can't be packed.";
-    return 0;
-  }
-}
-
-int GetExperimentalJavaFieldType(const FieldDescriptor* field) {
-  static const int kMapFieldType = 50;
-  static const int kOneofFieldTypeOffset = 51;
-  static const int kRequiredBit = 0x100;
-  static const int kUtf8CheckBit = 0x200;
-  static const int kCheckInitialized = 0x400;
-  static const int kMapWithProto2EnumValue = 0x800;
-  int extra_bits = field->is_required() ? kRequiredBit : 0;
-  if (field->type() == FieldDescriptor::TYPE_STRING && CheckUtf8(field)) {
-    extra_bits |= kUtf8CheckBit;
-  }
-  if (field->is_required() || (GetJavaType(field) == JAVATYPE_MESSAGE &&
-                               HasRequiredFields(field->message_type()))) {
-    extra_bits |= kCheckInitialized;
-  }
-
-  if (field->is_map()) {
-    if (SupportFieldPresence(field->file())) {
-      const FieldDescriptor* value =
-          field->message_type()->FindFieldByName("value");
-      if (GetJavaType(value) == JAVATYPE_ENUM) {
-        extra_bits |= kMapWithProto2EnumValue;
-      }
-    }
-    return kMapFieldType | extra_bits;
-  } else if (field->is_packed()) {
-    return GetExperimentalJavaFieldTypeForPacked(field);
-  } else if (field->is_repeated()) {
-    return GetExperimentalJavaFieldTypeForRepeated(field) | extra_bits;
-  } else if (field->containing_oneof() != NULL) {
-    return (GetExperimentalJavaFieldTypeForSingular(field) +
-            kOneofFieldTypeOffset) |
-           extra_bits;
-  } else {
-    return GetExperimentalJavaFieldTypeForSingular(field) | extra_bits;
-  }
-}
-
-// Escape a UTF-16 character to be embedded in a Java string.
-void EscapeUtf16ToString(uint16 code, string* output) {
-  if (code == '\t') {
-    output->append("\\t");
-  } else if (code == '\b') {
-    output->append("\\b");
-  } else if (code == '\n') {
-    output->append("\\n");
-  } else if (code == '\r') {
-    output->append("\\r");
-  } else if (code == '\f') {
-    output->append("\\f");
-  } else if (code == '\'') {
-    output->append("\\'");
-  } else if (code == '\"') {
-    output->append("\\\"");
-  } else if (code == '\\') {
-    output->append("\\\\");
-  } else if (code >= 0x20 && code <= 0x7f) {
-    output->push_back(static_cast<char>(code));
-  } else {
-    output->append(StringPrintf("\\u%04x", code));
-  }
-}
 }  // namespace java
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/java/java_helpers.h b/src/google/protobuf/compiler/java/java_helpers.h
index 00d683d..c850423 100644
--- a/src/google/protobuf/compiler/java/java_helpers.h
+++ b/src/google/protobuf/compiler/java/java_helpers.h
@@ -36,8 +36,6 @@
 #define GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__
 
 #include <string>
-#include <google/protobuf/compiler/java/java_context.h>
-#include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 
@@ -51,17 +49,6 @@
 extern const char kThickSeparator[];
 extern const char kThinSeparator[];
 
-// If annotation_file is non-empty, prints a javax.annotation.Generated
-// annotation to the given Printer. annotation_file will be referenced in the
-// annotation's comments field. delimiter should be the Printer's delimiter
-// character. annotation_file will be included verbatim into a Java literal
-// string, so it should not contain quotes or invalid Java escape sequences;
-// however, these are unlikely to appear in practice, as the value of
-// annotation_file should be generated from the filename of the source file
-// being annotated (which in turn must be a Java identifier plus ".java").
-void PrintGeneratedAnnotation(io::Printer* printer, char delimiter = '$',
-                              const string& annotation_file = "");
-
 // Converts a name to camel-case. If cap_first_letter is true, capitalize the
 // first letter.
 string UnderscoresToCamelCase(const string& name, bool cap_first_letter);
@@ -74,10 +61,6 @@
 // of lower-casing the first letter of the name.)
 string UnderscoresToCamelCase(const MethodDescriptor* method);
 
-// Similar to UnderscoresToCamelCase, but guarentees that the result is a
-// complete Java identifier by adding a _ if needed.
-string CamelCaseFieldName(const FieldDescriptor* field);
-
 // Get an identifier that uniquely identifies this type within the file.
 // This is used to declare static variables related to this type at the
 // outermost file scope.
@@ -136,13 +119,6 @@
   return descriptor->name();
 }
 
-// Whether the given descriptor is for one of the core descriptor protos. We
-// cannot currently use the new runtime with core protos since there is a
-// bootstrapping problem with obtaining their descriptors.
-inline bool IsDescriptorProto(const Descriptor* descriptor) {
-  return descriptor->file()->name() == "google/protobuf/descriptor.proto";
-}
-
 
 // Whether we should generate multiple java files for messages.
 inline bool MultipleJavaFiles(
@@ -150,38 +126,6 @@
   return descriptor->options().java_multiple_files();
 }
 
-// Returns true if `descriptor` will be written to its own .java file.
-// `immutable` should be set to true if we're generating for the immutable API.
-template <typename Descriptor>
-bool IsOwnFile(const Descriptor* descriptor, bool immutable) {
-  return descriptor->containing_type() == NULL &&
-         MultipleJavaFiles(descriptor->file(), immutable);
-}
-
-template <>
-inline bool IsOwnFile(const ServiceDescriptor* descriptor, bool immutable) {
-  return MultipleJavaFiles(descriptor->file(), immutable);
-}
-
-// If `descriptor` describes an object with its own .java file,
-// returns the name (relative to that .java file) of the file that stores
-// annotation data for that descriptor. `suffix` is usually empty, but may
-// (e.g.) be "OrBuilder" for some generated interfaces.
-template <typename Descriptor>
-string AnnotationFileName(const Descriptor* descriptor, const string& suffix) {
-  return descriptor->name() + suffix + ".java.pb.meta";
-}
-
-template <typename Descriptor>
-void MaybePrintGeneratedAnnotation(Context* context, io::Printer* printer,
-                                   Descriptor* descriptor, bool immutable,
-                                   const string& suffix = "") {
-  if (context->options().annotate_code && IsOwnFile(descriptor, immutable)) {
-    PrintGeneratedAnnotation(printer, '$',
-                             AnnotationFileName(descriptor, suffix));
-  }
-}
-
 // Get the unqualified name that should be used for a field's field
 // number constant.
 string FieldConstantName(const FieldDescriptor *field);
@@ -225,7 +169,11 @@
   return DefaultValue(field, true, name_resolver);
 }
 bool IsDefaultValueJavaDefault(const FieldDescriptor* field);
-bool IsByteStringWithCustomDefaultValue(const FieldDescriptor* field);
+
+// Does this message have specialized equals() and hashCode() methods?
+inline bool HasEqualsAndHashCode(const Descriptor* descriptor) {
+  return descriptor->file()->options().java_generate_equals_and_hash();
+}
 
 // Does this message class have descriptor and reflection methods?
 inline bool HasDescriptorMethods(const Descriptor* descriptor,
@@ -253,6 +201,15 @@
          file->options().java_generic_services();
 }
 
+inline bool IsLazy(const FieldDescriptor* descriptor, bool enforce_lite) {
+  // Currently, the proto-lite version suports lazy field.
+  // TODO(niwasaki): Support lazy fields also for other proto runtimes.
+  if (HasDescriptorMethods(descriptor->file(), enforce_lite)) {
+    return false;
+  }
+  return descriptor->options().lazy();
+}
+
 // Methods for shared bitfields.
 
 // Gets the name of the shared bitfield for the given index.
@@ -374,12 +331,12 @@
   return descriptor->is_map();
 }
 
-inline bool IsAnyMessage(const Descriptor* descriptor) {
-  return descriptor->full_name() == "google.protobuf.Any";
+inline bool PreserveUnknownFields(const Descriptor* descriptor) {
+  return descriptor->file()->syntax() != FileDescriptor::SYNTAX_PROTO3;
 }
 
-inline bool IsWrappersProtoFile(const FileDescriptor* descriptor) {
-  return descriptor->name() == "google/protobuf/wrappers.proto";
+inline bool IsAnyMessage(const Descriptor* descriptor) {
+  return descriptor->full_name() == "google.protobuf.Any";
 }
 
 inline bool CheckUtf8(const FieldDescriptor* descriptor) {
@@ -387,33 +344,6 @@
       descriptor->file()->options().java_string_check_utf8();
 }
 
-inline string GeneratedCodeVersionSuffix() {
-  return "V3";
-}
-
-inline bool EnableExperimentalRuntime(Context* context) {
-  return false;
-}
-
-void WriteUInt32ToUtf16CharSequence(uint32 number, std::vector<uint16>* output);
-
-inline void WriteIntToUtf16CharSequence(int value,
-                                        std::vector<uint16>* output) {
-  WriteUInt32ToUtf16CharSequence(static_cast<uint32>(value), output);
-}
-
-// Escape a UTF-16 character so it can be embedded in a Java string literal.
-void EscapeUtf16ToString(uint16 code, string* output);
-
-// Only the lowest two bytes of the return value are used. The lowest byte
-// is the integer value of a j/c/g/protobuf/FieldType enum. For the other
-// byte:
-//    bit 0: whether the field is required.
-//    bit 1: whether the field requires UTF-8 validation.
-//    bit 2: whether the field needs isInitialized check.
-//    bit 3: whether the field is a map field with proto2 enum value.
-//    bits 4-7: unused
-int GetExperimentalJavaFieldType(const FieldDescriptor* field);
 }  // namespace java
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/java/java_lazy_message_field.cc b/src/google/protobuf/compiler/java/java_lazy_message_field.cc
index abf8e55..0de8cbe 100644
--- a/src/google/protobuf/compiler/java/java_lazy_message_field.cc
+++ b/src/google/protobuf/compiler/java/java_lazy_message_field.cc
@@ -93,7 +93,7 @@
   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"
+    "private com.google.protobuf.SingleFieldBuilder<\n"
     "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
     "\n");
 
@@ -193,11 +193,11 @@
     "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+    "private com.google.protobuf.SingleFieldBuilder<\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"
+    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     "            $name$_,\n"
     "            getParentForChildren(),\n"
@@ -535,7 +535,7 @@
   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"
+    "private com.google.protobuf.RepeatedFieldBuilder<\n"
     "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
     "\n");
 
@@ -763,11 +763,11 @@
     "     get$capitalized_name$BuilderList() {\n"
     "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
     "}\n"
-    "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
+    "private com.google.protobuf.RepeatedFieldBuilder<\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"
+    "    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n"
     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     "            $name$_,\n"
     "            $get_mutable_bit_builder$,\n"
diff --git a/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc b/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc
index 51bb11f..62f3930 100644
--- a/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc
@@ -59,28 +59,19 @@
 void ImmutableLazyMessageFieldLiteGenerator::
 GenerateMembers(io::Printer* printer) const {
   printer->Print(variables_,
-    "private com.google.protobuf.LazyFieldLite $name$_;");
+    "private com.google.protobuf.LazyFieldLite $name$_ =\n"
+    "    new com.google.protobuf.LazyFieldLite();\n");
 
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
-  if (SupportFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-      "$deprecation$public boolean has$capitalized_name$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
-  } else {
-    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 $get_has_field_bit_message$;\n"
+    "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public $type$ get$capitalized_name$() {\n"
-    "  if ($name$_ == null) {\n"
-    "    return $type$.getDefaultInstance();\n"
-    "  }\n"
     "  return ($type$) $name$_.getValue($type$.getDefaultInstance());\n"
    "}\n");
 
@@ -91,11 +82,8 @@
     "  if (value == null) {\n"
     "    throw new NullPointerException();\n"
     "  }\n"
-    "  if ($name$_ == null) {\n"
-    "    $name$_ = new com.google.protobuf.LazyFieldLite();\n"
-    "  }\n"
     "  $name$_.setValue(value);\n"
-    "  $set_has_field_bit_message$\n"
+    "  $set_has_field_bit_message$;\n"
     "}\n");
 
   // Field.Builder setField(Field.Builder builderForValue)
@@ -103,36 +91,30 @@
   printer->Print(variables_,
     "private void set$capitalized_name$(\n"
     "    $type$.Builder builderForValue) {\n"
-    "  if ($name$_ == null) {\n"
-    "    $name$_ = new com.google.protobuf.LazyFieldLite();\n"
-    "  }\n"
     "  $name$_.setValue(builderForValue.build());\n"
-    "  $set_has_field_bit_message$\n"
+    "  $set_has_field_bit_message$;\n"
     "}\n");
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "private void merge$capitalized_name$($type$ value) {\n"
-    "  if (has$capitalized_name$() &&\n"
+    "  if ($get_has_field_bit_message$ &&\n"
     "      !$name$_.containsDefaultInstance()) {\n"
     "    $name$_.setValue(\n"
     "      $type$.newBuilder(\n"
     "          get$capitalized_name$()).mergeFrom(value).buildPartial());\n"
     "  } else {\n"
-    "    if ($name$_ == null) {\n"
-    "      $name$_ = new com.google.protobuf.LazyFieldLite();\n"
-    "    }\n"
     "    $name$_.setValue(value);\n"
-    "    $set_has_field_bit_message$\n"
     "  }\n"
+    "  $set_has_field_bit_message$;\n"
     "}\n");
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "private void clear$capitalized_name$() {\n"
-    "  $name$_ = null;\n"
+    "  $name$_.clear();\n"
     "  $clear_has_field_bit_message$;\n"
     "}\n");
 }
@@ -195,30 +177,31 @@
 
 
 void ImmutableLazyMessageFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {}
+GenerateInitializationCode(io::Printer* printer) const {
+  printer->Print(variables_, "$name$_.clear();\n");
+}
 
 void ImmutableLazyMessageFieldLiteGenerator::
 GenerateVisitCode(io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = visitor.visitLazyMessage($name$_, other.$name$_);\n");
+    "$name$_ = visitor.visitLazyMessage(\n"
+    "    has$capitalized_name$(), $name$_,\n"
+    "    other.has$capitalized_name$(), other.$name$_);\n");
 }
 
 void ImmutableLazyMessageFieldLiteGenerator::
 GenerateParsingCode(io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($name$_ == null) {\n"
-    "  $name$_ = new com.google.protobuf.LazyFieldLite();\n"
-    "}\n"
     "$name$_.mergeFrom(input, extensionRegistry);\n");
   printer->Print(variables_,
-    "$set_has_field_bit_message$\n");
+    "$set_has_field_bit_message$;\n");
 }
 
 void ImmutableLazyMessageFieldLiteGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
   // Do not de-serialize lazy fields.
   printer->Print(variables_,
-    "if (has$capitalized_name$()) {\n"
+    "if ($get_has_field_bit_message$) {\n"
     "  output.writeBytes($number$, $name$_.toByteString());\n"
     "}\n");
 }
@@ -226,13 +209,12 @@
 void ImmutableLazyMessageFieldLiteGenerator::
 GenerateSerializedSizeCode(io::Printer* printer) const {
   printer->Print(variables_,
-    "if (has$capitalized_name$()) {\n"
+    "if ($get_has_field_bit_message$) {\n"
     "  size += com.google.protobuf.CodedOutputStream\n"
     "    .computeLazyFieldSize($number$, $name$_);\n"
     "}\n");
 }
 
-
 // ===================================================================
 
 ImmutableLazyMessageOneofFieldLiteGenerator::
@@ -416,7 +398,6 @@
     "}\n");
 }
 
-
 // ===================================================================
 
 RepeatedImmutableLazyMessageFieldLiteGenerator::
@@ -448,7 +429,8 @@
     "  for (com.google.protobuf.LazyFieldLite lf : $name$_) {\n"
     "    list.add(($type$) lf.getValue($type$.getDefaultInstance()));\n"
     "  }\n"
-    "  return java.util.Collections.unmodifiableList(list);\n"
+    // TODO(dweis): Make this list immutable?
+    "  return list;\n"
     "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
@@ -718,7 +700,6 @@
     "}\n");
 }
 
-
 }  // namespace java
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/java/java_lazy_message_field_lite.h b/src/google/protobuf/compiler/java/java_lazy_message_field_lite.h
index 65b84fb..47ebeb4 100644
--- a/src/google/protobuf/compiler/java/java_lazy_message_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_lazy_message_field_lite.h
@@ -68,7 +68,6 @@
   void GenerateSerializationCode(io::Printer* printer) const;
   void GenerateSerializedSizeCode(io::Printer* printer) const;
 
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableLazyMessageFieldLiteGenerator);
 };
@@ -88,7 +87,6 @@
   void GenerateSerializationCode(io::Printer* printer) const;
   void GenerateSerializedSizeCode(io::Printer* printer) const;
 
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableLazyMessageOneofFieldLiteGenerator);
 };
@@ -108,7 +106,6 @@
   void GenerateSerializationCode(io::Printer* printer) const;
   void GenerateSerializedSizeCode(io::Printer* printer) const;
 
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableLazyMessageFieldLiteGenerator);
 };
diff --git a/src/google/protobuf/compiler/java/java_map_field.cc b/src/google/protobuf/compiler/java/java_map_field.cc
index b22a219..2a551ca 100644
--- a/src/google/protobuf/compiler/java/java_map_field.cc
+++ b/src/google/protobuf/compiler/java/java_map_field.cc
@@ -80,7 +80,7 @@
                          int builderBitIndex,
                          const FieldGeneratorInfo* info,
                          Context* context,
-                         std::map<string, string>* variables) {
+                         map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
   ClassNameResolver* name_resolver = context->GetNameResolver();
 
@@ -88,22 +88,11 @@
       name_resolver->GetImmutableClassName(descriptor->message_type());
   const FieldDescriptor* key = KeyField(descriptor);
   const FieldDescriptor* value = ValueField(descriptor);
-  const JavaType keyJavaType = GetJavaType(key);
-  const JavaType valueJavaType = GetJavaType(value);
-
   (*variables)["key_type"] = TypeName(key, name_resolver, false);
-  string boxed_key_type = TypeName(key, name_resolver, true);
-  (*variables)["boxed_key_type"] = boxed_key_type;
-  // Used for calling the serialization function.
-  (*variables)["short_key_type"] =
-      boxed_key_type.substr(boxed_key_type.rfind('.') + 1);
+  (*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(); }" : "";
-  if (valueJavaType == JAVATYPE_ENUM) {
+  if (GetJavaType(value) == JAVATYPE_ENUM) {
     // We store enums as Integers internally.
     (*variables)["value_type"] = "int";
     (*variables)["boxed_value_type"] = "java.lang.Integer";
@@ -146,12 +135,12 @@
 
   (*variables)["default_entry"] = (*variables)["capitalized_name"] +
       "DefaultEntryHolder.defaultEntry";
+  (*variables)["lite"] = "";
   (*variables)["map_field_parameter"] = (*variables)["default_entry"];
   (*variables)["descriptor"] =
       name_resolver->GetImmutableClassName(descriptor->file()) +
       ".internal_" + UniqueFileScopeIdentifier(descriptor->message_type()) +
       "_descriptor, ";
-  (*variables)["ver"] = GeneratedCodeVersionSuffix();
 }
 
 }  // namespace
@@ -180,109 +169,25 @@
 
 void ImmutableMapFieldGenerator::
 GenerateInterfaceMembers(io::Printer* printer) const {
-  WriteFieldDocComment(printer, descriptor_);
-  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->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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
         "$deprecation$java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$Map$}$();\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_enum_type$ defaultValue);\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key);\n");
-    printer->Annotate("{", "}", descriptor_);
+        "get$capitalized_name$();\n");
     if (SupportUnknownEnumValue(descriptor_->file())) {
-      printer->Print(
-          variables_,
-          "/**\n"
-          " * Use {@link #get$capitalized_name$ValueMap()} instead.\n"
-          " */\n"
-          "@java.lang.Deprecated\n"
-          "java.util.Map<$type_parameters$>\n"
-          "${$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->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->Annotate("{", "}", descriptor_);
-      WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key);\n");
-      printer->Annotate("{", "}", descriptor_);
+          "get$capitalized_name$Value();\n");
     }
   } 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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     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->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key);\n");
-    printer->Annotate("{", "}", descriptor_);
+        "get$capitalized_name$();\n");
   }
 }
 
@@ -291,9 +196,9 @@
   printer->Print(
       variables_,
       "private static final class $capitalized_name$DefaultEntryHolder {\n"
-      "  static final com.google.protobuf.MapEntry<\n"
+      "  static final com.google.protobuf.MapEntry$lite$<\n"
       "      $type_parameters$> defaultEntry =\n"
-      "          com.google.protobuf.MapEntry\n"
+      "          com.google.protobuf.MapEntry$lite$\n"
       "          .<$type_parameters$>newDefaultInstance(\n"
       "              $descriptor$\n"
       "              $key_wire_type$,\n"
@@ -303,12 +208,12 @@
       "}\n");
   printer->Print(
       variables_,
-      "private com.google.protobuf.MapField<\n"
+      "private com.google.protobuf.MapField$lite$<\n"
       "    $type_parameters$> $name$_;\n"
-      "private com.google.protobuf.MapField<$type_parameters$>\n"
+      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
       "internalGet$capitalized_name$() {\n"
       "  if ($name$_ == null) {\n"
-      "    return com.google.protobuf.MapField.emptyMapField(\n"
+      "    return com.google.protobuf.MapField$lite$.emptyMapField(\n"
       "        $map_field_parameter$);\n"
       "  }\n"
       "  return $name$_;\n"
@@ -322,39 +227,57 @@
         "        com.google.protobuf.Internal.MapAdapter.newEnumConverter(\n"
         "            $value_enum_type$.internalGetValueMap(),\n"
         "            $unrecognized_value$);\n");
+    if (SupportUnknownEnumValue(descriptor_->file())) {
+      WriteFieldDocComment(printer, descriptor_);
+      printer->Print(
+          variables_,
+          "$deprecation$\n"
+          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
+          "get$capitalized_name$Value() {\n"
+          "  return internalGet$capitalized_name$().getMap();\n"
+          "}\n");
+    }
+    WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "private static final java.util.Map<$boxed_key_type$, "
-        "$value_enum_type$>\n"
-        "internalGetAdapted$capitalized_name$Map(\n"
-        "    java.util.Map<$boxed_key_type$, $boxed_value_type$> map) {\n"
+        "$deprecation$\n"
+        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+        "get$capitalized_name$() {\n"
         "  return new com.google.protobuf.Internal.MapAdapter<\n"
         "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
-        "          map, $name$ValueConverter);\n"
+        "          internalGet$capitalized_name$().getMap(),\n"
+        "          $name$ValueConverter);\n"
+        "}\n");
+  } else {
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$\n"
+        "public java.util.Map<$type_parameters$> get$capitalized_name$() {\n"
+        "  return internalGet$capitalized_name$().getMap();\n"
         "}\n");
   }
-  GenerateMapGetters(printer);
 }
 
 void ImmutableMapFieldGenerator::
 GenerateBuilderMembers(io::Printer* printer) const {
   printer->Print(
       variables_,
-      "private com.google.protobuf.MapField<\n"
+      "private com.google.protobuf.MapField$lite$<\n"
       "    $type_parameters$> $name$_;\n"
-      "private com.google.protobuf.MapField<$type_parameters$>\n"
+      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
       "internalGet$capitalized_name$() {\n"
       "  if ($name$_ == null) {\n"
-      "    return com.google.protobuf.MapField.emptyMapField(\n"
+      "    return com.google.protobuf.MapField$lite$.emptyMapField(\n"
       "        $map_field_parameter$);\n"
       "  }\n"
       "  return $name$_;\n"
       "}\n"
-      "private com.google.protobuf.MapField<$type_parameters$>\n"
+      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
       "internalGetMutable$capitalized_name$() {\n"
       "  $on_changed$;\n"
       "  if ($name$_ == null) {\n"
-      "    $name$_ = com.google.protobuf.MapField.newMapField(\n"
+      "    $name$_ = com.google.protobuf.MapField$lite$.newMapField(\n"
       "        $map_field_parameter$);\n"
       "  }\n"
       "  if (!$name$_.isMutable()) {\n"
@@ -362,309 +285,85 @@
       "  }\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->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->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
+    WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "/**\n"
-        " * Use alternate mutation accessors instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
+        "$deprecation$\n"
         "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$getMutable$capitalized_name$$}$() {\n"
-        "  return internalGetAdapted$capitalized_name$Map(\n"
-        "       internalGetMutable$capitalized_name$().getMutableMap());\n"
+        "get$capitalized_name$() {\n"
+        "  return new com.google.protobuf.Internal.MapAdapter<\n"
+        "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
+        "          internalGet$capitalized_name$().getMap(),\n"
+        "          $name$ValueConverter);\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-                   "$deprecation$public Builder ${$put$capitalized_name$$}$(\n"
-                   "    $key_type$ key,\n"
-                   "    $value_enum_type$ value) {\n"
-                   "  $key_null_check$\n"
-                   "  $value_null_check$\n"
-                   "  internalGetMutable$capitalized_name$().getMutableMap()\n"
-                   "      .put(key, $name$ValueConverter.doBackward(value));\n"
-                   "  return this;\n"
-                   "}\n");
-    printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$public Builder ${$putAll$capitalized_name$$}$(\n"
+        "$deprecation$\n"
+        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+        "getMutable$capitalized_name$() {\n"
+        "  return new com.google.protobuf.Internal.MapAdapter<\n"
+        "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
+        "          internalGetMutable$capitalized_name$().getMutableMap(),\n"
+        "          $name$ValueConverter);\n"
+        "}\n");
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$public Builder putAll$capitalized_name$(\n"
         "    java.util.Map<$boxed_key_type$, $value_enum_type$> values) {\n"
-        "  internalGetAdapted$capitalized_name$Map(\n"
-        "      internalGetMutable$capitalized_name$().getMutableMap())\n"
-        "          .putAll(values);\n"
+        "  getMutable$capitalized_name$().putAll(values);\n"
         "  return this;\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     if (SupportUnknownEnumValue(descriptor_->file())) {
-      printer->Print(
-          variables_,
-          "/**\n"
-          " * Use alternate mutation accessors instead.\n"
-          " */\n"
-          "@java.lang.Deprecated\n"
-          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$getMutable$capitalized_name$Value$}$() {\n"
-          "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
-      WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$public Builder ${$put$capitalized_name$Value$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ value) {\n"
-          "  $key_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$public Builder ${$putAll$capitalized_name$Value$}$(\n"
-          "    java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n"
-          "  internalGetMutable$capitalized_name$().getMutableMap()\n"
-          "      .putAll(values);\n"
-          "  return this;\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
-    }
-  } else {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use alternate mutation accessors instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$type_parameters$>\n"
-        "${$getMutable$capitalized_name$$}$() {\n"
-        "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
-        "}\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->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->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");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$\n"
-      "public boolean ${$contains$capitalized_name$$}$(\n"
-      "    $key_type$ key) {\n"
-      "  $key_null_check$\n"
-      "  return internalGet$capitalized_name$().getMap().containsKey(key);\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->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->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_enum_type$ defaultValue) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-        "      internalGet$capitalized_name$().getMap();\n"
-        "  return map.containsKey(key)\n"
-        "         ? $name$ValueConverter.doForward(map.get(key))\n"
-        "         : defaultValue;\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-        "      internalGet$capitalized_name$().getMap();\n"
-        "  if (!map.containsKey(key)) {\n"
-        "    throw new java.lang.IllegalArgumentException();\n"
-        "  }\n"
-        "  return $name$ValueConverter.doForward(map.get(key));\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    if (SupportUnknownEnumValue(descriptor_->file())) {
-      printer->Print(
-          variables_,
-          "/**\n"
-          " * Use {@link #get$capitalized_name$ValueMap()} instead.\n"
-          " */\n"
-          "@java.lang.Deprecated\n"
-          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$get$capitalized_name$Value$}$() {\n"
-          "  return get$capitalized_name$ValueMap();\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
           "$deprecation$\n"
           "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$get$capitalized_name$ValueMap$}$() {\n"
+          "get$capitalized_name$Value() {\n"
           "  return internalGet$capitalized_name$().getMap();\n"
           "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
           "$deprecation$\n"
-          "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ defaultValue) {\n"
-          "  $key_null_check$\n"
-          "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-          "      internalGet$capitalized_name$().getMap();\n"
-          "  return map.containsKey(key) ? map.get(key) : defaultValue;\n"
+          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
+          "getMutable$capitalized_name$Value() {\n"
+          "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
           "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
-          "$deprecation$\n"
-          "public $value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key) {\n"
-          "  $key_null_check$\n"
-          "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-          "      internalGet$capitalized_name$().getMap();\n"
-          "  if (!map.containsKey(key)) {\n"
-          "    throw new java.lang.IllegalArgumentException();\n"
-          "  }\n"
-          "  return map.get(key);\n"
+          "$deprecation$public Builder putAll$capitalized_name$Value(\n"
+          "    java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n"
+          "  getMutable$capitalized_name$Value().putAll(values);\n"
+          "  return this;\n"
           "}\n");
-      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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$Map$}$() {\n"
+        "public java.util.Map<$type_parameters$> get$capitalized_name$() {\n"
         "  return internalGet$capitalized_name$().getMap();\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$\n"
-        "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ defaultValue) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$type_parameters$> map =\n"
-        "      internalGet$capitalized_name$().getMap();\n"
-        "  return map.containsKey(key) ? map.get(key) : defaultValue;\n"
+        "public java.util.Map<$type_parameters$>\n"
+        "getMutable$capitalized_name$() {\n"
+        "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
         "}\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"
+        "$deprecation$public Builder putAll$capitalized_name$(\n"
+        "    java.util.Map<$type_parameters$> values) {\n"
+        "  getMutable$capitalized_name$().putAll(values);\n"
+        "  return this;\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 }
 
@@ -706,7 +405,7 @@
   printer->Print(
       variables_,
       "if (!$get_mutable_bit_parser$) {\n"
-      "  $name$_ = com.google.protobuf.MapField.newMapField(\n"
+      "  $name$_ = com.google.protobuf.MapField$lite$.newMapField(\n"
       "      $map_field_parameter$);\n"
       "  $set_mutable_bit_parser$;\n"
       "}\n");
@@ -715,24 +414,22 @@
     printer->Print(
         variables_,
         "com.google.protobuf.ByteString bytes = input.readBytes();\n"
-        "com.google.protobuf.MapEntry<$type_parameters$>\n"
-        "$name$__ = $default_entry$.getParserForType().parseFrom(bytes);\n");
+        "com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+        "$name$ = $default_entry$.getParserForType().parseFrom(bytes);\n");
     printer->Print(
         variables_,
-        "if ($value_enum_type$.forNumber($name$__.getValue()) == null) {\n"
+        "if ($value_enum_type$.forNumber($name$.getValue()) == null) {\n"
         "  unknownFields.mergeLengthDelimitedField($number$, bytes);\n"
         "} else {\n"
-        "  $name$_.getMutableMap().put(\n"
-        "      $name$__.getKey(), $name$__.getValue());\n"
+        "  $name$_.getMutableMap().put($name$.getKey(), $name$.getValue());\n"
         "}\n");
   } else {
     printer->Print(
         variables_,
-        "com.google.protobuf.MapEntry<$type_parameters$>\n"
-        "$name$__ = input.readMessage(\n"
+        "com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+        "$name$ = input.readMessage(\n"
         "    $default_entry$.getParserForType(), extensionRegistry);\n"
-        "$name$_.getMutableMap().put(\n"
-        "    $name$__.getKey(), $name$__.getValue());\n");
+        "$name$_.getMutableMap().put($name$.getKey(), $name$.getValue());\n");
   }
 }
 
@@ -745,12 +442,15 @@
 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");
+      "for (java.util.Map.Entry<$type_parameters$> entry\n"
+      "     : internalGet$capitalized_name$().getMap().entrySet()) {\n"
+      "  com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+      "  $name$ = $default_entry$.newBuilderForType()\n"
+      "      .setKey(entry.getKey())\n"
+      "      .setValue(entry.getValue())\n"
+      "      .build();\n"
+      "  output.writeMessage($number$, $name$);\n"
+      "}\n");
 }
 
 void ImmutableMapFieldGenerator::
@@ -759,13 +459,13 @@
       variables_,
       "for (java.util.Map.Entry<$type_parameters$> entry\n"
       "     : internalGet$capitalized_name$().getMap().entrySet()) {\n"
-      "  com.google.protobuf.MapEntry<$type_parameters$>\n"
-      "  $name$__ = $default_entry$.newBuilderForType()\n"
+      "  com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+      "  $name$ = $default_entry$.newBuilderForType()\n"
       "      .setKey(entry.getKey())\n"
       "      .setValue(entry.getValue())\n"
       "      .build();\n"
       "  size += com.google.protobuf.CodedOutputStream\n"
-      "      .computeMessageSize($number$, $name$__);\n"
+      "      .computeMessageSize($number$, $name$);\n"
       "}\n");
 }
 
diff --git a/src/google/protobuf/compiler/java/java_map_field.h b/src/google/protobuf/compiler/java/java_map_field.h
index 4702174..f2768f3 100644
--- a/src/google/protobuf/compiler/java/java_map_field.h
+++ b/src/google/protobuf/compiler/java/java_map_field.h
@@ -67,9 +67,8 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   ClassNameResolver* name_resolver_;
-  void GenerateMapGetters(io::Printer* printer) const;
 };
 
 }  // namespace java
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 f19ec27..b80d413 100644
--- a/src/google/protobuf/compiler/java/java_map_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_map_field_lite.cc
@@ -80,7 +80,7 @@
                          int builderBitIndex,
                          const FieldGeneratorInfo* info,
                          Context* context,
-                         std::map<string, string>* variables) {
+                         map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   ClassNameResolver* name_resolver = context->GetNameResolver();
@@ -88,18 +88,10 @@
       name_resolver->GetImmutableClassName(descriptor->message_type());
   const FieldDescriptor* key = KeyField(descriptor);
   const FieldDescriptor* value = ValueField(descriptor);
-  const JavaType keyJavaType = GetJavaType(key);
-  const JavaType valueJavaType = GetJavaType(value);
-
   (*variables)["key_type"] = TypeName(key, name_resolver, false);
   (*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(); }" : "";
-
   if (GetJavaType(value) == JAVATYPE_ENUM) {
     // We store enums as Integers internally.
     (*variables)["value_type"] = "int";
@@ -135,6 +127,8 @@
 
   (*variables)["default_entry"] = (*variables)["capitalized_name"] +
       "DefaultEntryHolder.defaultEntry";
+  (*variables)["lite"] = "Lite";
+  (*variables)["descriptor"] = "";
 }
 
 }  // namespace
@@ -163,109 +157,25 @@
 
 void ImmutableMapFieldLiteGenerator::
 GenerateInterfaceMembers(io::Printer* printer) const {
-  WriteFieldDocComment(printer, descriptor_);
-  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->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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
         "$deprecation$java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$Map$}$();\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_enum_type$ defaultValue);\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key);\n");
-    printer->Annotate("{", "}", descriptor_);
+        "get$capitalized_name$();\n");
     if (SupportUnknownEnumValue(descriptor_->file())) {
-      printer->Print(
-          variables_,
-          "/**\n"
-          " * Use {@link #get$capitalized_name$ValueMap()} instead.\n"
-          " */\n"
-          "@java.lang.Deprecated\n"
-          "java.util.Map<$type_parameters$>\n"
-          "${$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->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->Annotate("{", "}", descriptor_);
-      WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key);\n");
-      printer->Annotate("{", "}", descriptor_);
+          "get$capitalized_name$Value();\n");
     }
   } 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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     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->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key);\n");
-    printer->Annotate("{", "}", descriptor_);
+        "get$capitalized_name$();\n");
   }
 }
 
@@ -274,10 +184,11 @@
   printer->Print(
       variables_,
       "private static final class $capitalized_name$DefaultEntryHolder {\n"
-      "  static final com.google.protobuf.MapEntryLite<\n"
+      "  static final com.google.protobuf.MapEntry$lite$<\n"
       "      $type_parameters$> defaultEntry =\n"
-      "          com.google.protobuf.MapEntryLite\n"
+      "          com.google.protobuf.MapEntry$lite$\n"
       "          .<$type_parameters$>newDefaultInstance(\n"
+      "              $descriptor$\n"
       "              $key_wire_type$,\n"
       "              $key_default_value$,\n"
       "              $value_wire_type$,\n"
@@ -285,37 +196,20 @@
       "}\n");
   printer->Print(
       variables_,
-      "private com.google.protobuf.MapFieldLite<\n"
+      "private com.google.protobuf.MapField$lite$<\n"
       "    $type_parameters$> $name$_ =\n"
-      "        com.google.protobuf.MapFieldLite.emptyMapField();\n"
-      "private com.google.protobuf.MapFieldLite<$type_parameters$>\n"
+      "        com.google.protobuf.MapField$lite$.emptyMapField();\n"
+      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
       "internalGet$capitalized_name$() {\n"
       "  return $name$_;\n"
       "}\n"
-      "private com.google.protobuf.MapFieldLite<$type_parameters$>\n"
+      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
       "internalGetMutable$capitalized_name$() {\n"
       "  if (!$name$_.isMutable()) {\n"
-      "    $name$_ = $name$_.mutableCopy();\n"
+      "    $name$_ = $name$_.copy();\n"
       "  }\n"
       "  return $name$_;\n"
       "}\n");
-  printer->Print(
-      variables_,
-      "$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_,
-      "$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(
         variables_,
@@ -325,161 +219,35 @@
         "        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->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 java.util.Collections.unmodifiableMap(\n"
-        "      new com.google.protobuf.Internal.MapAdapter<\n"
-        "        $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
-        "            internalGet$capitalized_name$(),\n"
-        "            $name$ValueConverter));\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_enum_type$ defaultValue) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-        "      internalGet$capitalized_name$();\n"
-        "  return map.containsKey(key)\n"
-        "         ? $name$ValueConverter.doForward(map.get(key))\n"
-        "         : defaultValue;\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-        "      internalGet$capitalized_name$();\n"
-        "  if (!map.containsKey(key)) {\n"
-        "    throw new java.lang.IllegalArgumentException();\n"
-        "  }\n"
-        "  return $name$ValueConverter.doForward(map.get(key));\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
     if (SupportUnknownEnumValue(descriptor_->file())) {
-      printer->Print(
-          variables_,
-          "/**\n"
-          " * Use {@link #get$capitalized_name$ValueMap()} instead.\n"
-          " */\n"
-          "@java.lang.Deprecated\n"
-          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$get$capitalized_name$Value$}$() {\n"
-          "  return get$capitalized_name$ValueMap();\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
           "$deprecation$\n"
           "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$get$capitalized_name$ValueMap$}$() {\n"
-          "  return java.util.Collections.unmodifiableMap(\n"
-          "      internalGet$capitalized_name$());\n"
+          "get$capitalized_name$Value() {\n"
+          "  return internalGet$capitalized_name$().getMap();\n"
           "}\n");
-      printer->Annotate("{", "}", descriptor_);
-      WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ defaultValue) {\n"
-          "  $key_null_check$\n"
-          "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-          "      internalGet$capitalized_name$();\n"
-          "  return map.containsKey(key) ? map.get(key) : defaultValue;\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
-      WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "public $value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key) {\n"
-          "  $key_null_check$\n"
-          "  java.util.Map<$boxed_key_type$, $boxed_value_type$> 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_);
     }
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$\n"
+        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+        "get$capitalized_name$() {\n"
+        "  return new com.google.protobuf.Internal.MapAdapter<\n"
+        "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
+        "          internalGet$capitalized_name$().getMap(),\n"
+        "          $name$ValueConverter);\n"
+        "}\n");
   } 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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
         "$deprecation$\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return java.util.Collections.unmodifiableMap(\n"
-        "      internalGet$capitalized_name$());\n"
+        "public java.util.Map<$type_parameters$> get$capitalized_name$() {\n"
+        "  return internalGet$capitalized_name$().getMap();\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ defaultValue) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$type_parameters$> map =\n"
-        "      internalGet$capitalized_name$();\n"
-        "  return map.containsKey(key) ? map.get(key) : defaultValue;\n"
-        "}\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$();\n"
-        "  if (!map.containsKey(key)) {\n"
-        "    throw new java.lang.IllegalArgumentException();\n"
-        "  }\n"
-        "  return map.get(key);\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   // Generate private setters for the builder to proxy into.
@@ -488,10 +256,10 @@
     printer->Print(
         variables_,
         "private java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "getMutable$capitalized_name$Map() {\n"
+        "getMutable$capitalized_name$() {\n"
         "  return new com.google.protobuf.Internal.MapAdapter<\n"
         "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
-        "          internalGetMutable$capitalized_name$(),\n"
+        "          internalGetMutable$capitalized_name$().getMutableMap(),\n"
         "          $name$ValueConverter);\n"
         "}\n");
     if (SupportUnknownEnumValue(descriptor_->file())) {
@@ -499,8 +267,8 @@
       printer->Print(
           variables_,
           "private java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "getMutable$capitalized_name$ValueMap() {\n"
-          "  return internalGetMutable$capitalized_name$();\n"
+          "getMutable$capitalized_name$Value() {\n"
+          "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
           "}\n");
     }
   } else {
@@ -508,276 +276,90 @@
     printer->Print(
         variables_,
         "private java.util.Map<$type_parameters$>\n"
-        "getMutable$capitalized_name$Map() {\n"
-        "  return internalGetMutable$capitalized_name$();\n"
+        "getMutable$capitalized_name$() {\n"
+        "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
         "}\n");
   }
 }
 
-
 void ImmutableMapFieldLiteGenerator::
 GenerateBuilderMembers(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "$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(
-      variables_,
-      "$deprecation$\n"
-      "public boolean ${$contains$capitalized_name$$}$(\n"
-      "    $key_type$ key) {\n"
-      "  $key_null_check$\n"
-      "  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->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->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->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 java.util.Collections.unmodifiableMap(\n"
-        "      instance.get$capitalized_name$Map());\n"
+        "get$capitalized_name$() {\n"
+        "  return instance.get$capitalized_name$();\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
         "$deprecation$\n"
-        "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_enum_type$ defaultValue) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$boxed_key_type$, $value_enum_type$> map =\n"
-        "      instance.get$capitalized_name$Map();\n"
-        "  return map.containsKey(key)\n"
-        "         ? map.get(key)\n"
-        "         : defaultValue;\n"
-        "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$boxed_key_type$, $value_enum_type$> 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(
-        variables_,
-        "$deprecation$public Builder ${$put$capitalized_name$$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_enum_type$ value) {\n"
-        "  $key_null_check$\n"
-        "  $value_null_check$\n"
+        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+        "getMutable$capitalized_name$() {\n"
         "  copyOnWrite();\n"
-        "  instance.getMutable$capitalized_name$Map().put(key, value);\n"
-        "  return this;\n"
+        "  return instance.getMutable$capitalized_name$();\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$public Builder ${$putAll$capitalized_name$$}$(\n"
+        "$deprecation$public Builder putAll$capitalized_name$(\n"
         "    java.util.Map<$boxed_key_type$, $value_enum_type$> values) {\n"
-        "  copyOnWrite();\n"
-        "  instance.getMutable$capitalized_name$Map().putAll(values);\n"
+        "  getMutable$capitalized_name$().putAll(values);\n"
         "  return this;\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     if (SupportUnknownEnumValue(descriptor_->file())) {
-      printer->Print(
-          variables_,
-          "/**\n"
-          " * Use {@link #get$capitalized_name$ValueMap()} instead.\n"
-          " */\n"
-          "@java.lang.Deprecated\n"
-          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$get$capitalized_name$Value$}$() {\n"
-          "  return get$capitalized_name$ValueMap();\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
           "$deprecation$\n"
           "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
-          "${$get$capitalized_name$ValueMap$}$() {\n"
-          "  return java.util.Collections.unmodifiableMap(\n"
-          "      instance.get$capitalized_name$ValueMap());\n"
+          "get$capitalized_name$Value() {\n"
+          "  return instance.get$capitalized_name$Value();\n"
           "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
           "$deprecation$\n"
-          "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ defaultValue) {\n"
-          "  $key_null_check$\n"
-          "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-          "      instance.get$capitalized_name$ValueMap();\n"
-          "  return map.containsKey(key) ? map.get(key) : defaultValue;\n"
-          "}\n");
-      printer->Annotate("{", "}", descriptor_);
-      WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "public $value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key) {\n"
-          "  $key_null_check$\n"
-          "  java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
-          "      instance.get$capitalized_name$ValueMap();\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(
-          variables_,
-          "$deprecation$public Builder ${$put$capitalized_name$Value$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ value) {\n"
-          "  $key_null_check$\n"
+          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
+          "getMutable$capitalized_name$Value() {\n"
           "  copyOnWrite();\n"
-          "  instance.getMutable$capitalized_name$ValueMap().put(key, value);\n"
-          "  return this;\n"
+          "  return instance.getMutable$capitalized_name$Value();\n"
           "}\n");
-      printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
       printer->Print(
           variables_,
-          "$deprecation$public Builder ${$putAll$capitalized_name$Value$}$(\n"
+          "$deprecation$public Builder putAll$capitalized_name$Value(\n"
           "    java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n"
-          "  copyOnWrite();\n"
-          "  instance.getMutable$capitalized_name$ValueMap().putAll(values);\n"
+          "  getMutable$capitalized_name$Value().putAll(values);\n"
           "  return this;\n"
           "}\n");
-      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->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return java.util.Collections.unmodifiableMap(\n"
-        "      instance.get$capitalized_name$Map());\n"
+        "public java.util.Map<$type_parameters$> get$capitalized_name$() {\n"
+        "  return instance.get$capitalized_name$();\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$\n"
-        "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ defaultValue) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$type_parameters$> map =\n"
-        "      instance.get$capitalized_name$Map();\n"
-        "  return map.containsKey(key) ? map.get(key) : defaultValue;\n"
-        "}\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"
-        "      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(
-        variables_,
-        "$deprecation$"
-        "public Builder ${$put$capitalized_name$$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ value) {\n"
-        "  $key_null_check$\n"
-        "  $value_null_check$\n"
+        "public java.util.Map<$type_parameters$>\n"
+        "getMutable$capitalized_name$() {\n"
         "  copyOnWrite();\n"
-        "  instance.getMutable$capitalized_name$Map().put(key, value);\n"
-        "  return this;\n"
+        "  return instance.getMutable$capitalized_name$();\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
         variables_,
-        "$deprecation$"
-        "public Builder ${$putAll$capitalized_name$$}$(\n"
+        "public Builder putAll$capitalized_name$(\n"
         "    java.util.Map<$type_parameters$> values) {\n"
-        "  copyOnWrite();\n"
-        "  instance.getMutable$capitalized_name$Map().putAll(values);\n"
+        "  getMutable$capitalized_name$().putAll(values);\n"
         "  return this;\n"
         "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 }
 
@@ -795,8 +377,8 @@
 GenerateVisitCode(io::Printer* printer) const {
   printer->Print(
       variables_,
-      "$name$_ = visitor.visitMap(\n"
-      "    $name$_, other.internalGet$capitalized_name$());\n");
+      "$name$_ = visitor.visitMap(internalGetMutable$capitalized_name$(),\n"
+      "    other.internalGet$capitalized_name$());\n");
 }
 
 void ImmutableMapFieldLiteGenerator::
@@ -810,26 +392,29 @@
   printer->Print(
       variables_,
       "if (!$name$_.isMutable()) {\n"
-      "  $name$_ = $name$_.mutableCopy();\n"
+      "  $name$_ = $name$_.copy();\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");
+        "com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+        "$name$ = $default_entry$.getParserForType().parseFrom(bytes);\n");
     printer->Print(
         variables_,
-        "if ($value_enum_type$.forNumber($name$__.getValue()) == null) {\n"
+        "if ($value_enum_type$.forNumber($name$.getValue()) == null) {\n"
         "  super.mergeLengthDelimitedField($number$, bytes);\n"
         "} else {\n"
-        "  $name$_.put($name$__);\n"
+        "  $name$_.getMutableMap().put($name$.getKey(), $name$.getValue());\n"
         "}\n");
   } else {
     printer->Print(
         variables_,
-        "$default_entry$.parseInto($name$_, input, extensionRegistry);");
+        "com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+        "$name$ = input.readMessage(\n"
+        "    $default_entry$.getParserForType(), extensionRegistry);\n"
+        "$name$_.getMutableMap().put($name$.getKey(), $name$.getValue());\n");
   }
 }
 
@@ -843,9 +428,13 @@
   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"
+      "     : internalGet$capitalized_name$().getMap().entrySet()) {\n"
+      "  com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+      "  $name$ = $default_entry$.newBuilderForType()\n"
+      "      .setKey(entry.getKey())\n"
+      "      .setValue(entry.getValue())\n"
+      "      .build();\n"
+      "  output.writeMessage($number$, $name$);\n"
       "}\n");
 }
 
@@ -854,9 +443,14 @@
   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"
+      "     : internalGet$capitalized_name$().getMap().entrySet()) {\n"
+      "  com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
+      "  $name$ = $default_entry$.newBuilderForType()\n"
+      "      .setKey(entry.getKey())\n"
+      "      .setValue(entry.getValue())\n"
+      "      .build();\n"
+      "  size += com.google.protobuf.CodedOutputStream\n"
+      "      .computeMessageSize($number$, $name$);\n"
       "}\n");
 }
 
@@ -872,7 +466,7 @@
 GenerateHashCode(io::Printer* printer) const {
   printer->Print(
       variables_,
-      "if (!internalGet$capitalized_name$().isEmpty()) {\n"
+      "if (!internalGet$capitalized_name$().getMap().isEmpty()) {\n"
       "  hash = (37 * hash) + $constant_name$;\n"
       "  hash = (53 * hash) + internalGet$capitalized_name$().hashCode();\n"
       "}\n");
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 94aa481..555b5c5 100644
--- a/src/google/protobuf/compiler/java/java_map_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_map_field_lite.h
@@ -62,12 +62,11 @@
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
 
-
   string GetBoxedType() const;
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   ClassNameResolver* name_resolver_;
 };
 
diff --git a/src/google/protobuf/compiler/java/java_message.cc b/src/google/protobuf/compiler/java/java_message.cc
index 2486b73..4c474a4 100644
--- a/src/google/protobuf/compiler/java/java_message.cc
+++ b/src/google/protobuf/compiler/java/java_message.cc
@@ -56,9 +56,8 @@
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/stubs/strutil.h>
-
+#include <google/protobuf/stubs/substitute.h>
 
 namespace google {
 namespace protobuf {
@@ -111,7 +110,7 @@
   // the outermost class in the file.  This way, they will be initialized in
   // a deterministic order.
 
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
   vars["index"] = SimpleItoa(descriptor_->index());
   vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
@@ -155,7 +154,7 @@
 int ImmutableMessageGenerator::GenerateStaticVariableInitializers(
     io::Printer* printer) {
   int bytecode_estimate = 0;
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
   vars["index"] = SimpleItoa(descriptor_->index());
   vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
@@ -192,7 +191,7 @@
 
 void ImmutableMessageGenerator::
 GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
   if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) {
     // We can only make these package-private since the classes that use them
@@ -206,10 +205,9 @@
   } else {
     vars["final"] = "";
   }
-  vars["ver"] = GeneratedCodeVersionSuffix();
   printer->Print(vars,
     "$private$static $final$\n"
-    "  com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
+    "  com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
     "    internal_$identifier$_fieldAccessorTable;\n");
 
   // 6 bytes per field and oneof
@@ -222,11 +220,11 @@
   int bytecode_estimate = 10;
   printer->Print(
     "internal_$identifier$_fieldAccessorTable = new\n"
-    "  com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable(\n"
+    "  com.google.protobuf.GeneratedMessage.FieldAccessorTable(\n"
     "    internal_$identifier$_descriptor,\n"
     "    new java.lang.String[] { ",
-    "identifier", UniqueFileScopeIdentifier(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+    "identifier",
+    UniqueFileScopeIdentifier(descriptor_));
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
     const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
@@ -250,31 +248,22 @@
 // ===================================================================
 
 void ImmutableMessageGenerator::GenerateInterface(io::Printer* printer) {
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
-                                /* immutable = */ true, "OrBuilder");
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-        "$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n"
-        "    $extra_interfaces$\n"
-        "    com.google.protobuf.GeneratedMessage$ver$.\n"
-        "        ExtendableMessageOrBuilder<$classname$> {\n",
-        "deprecation", descriptor_->options().deprecated() ?
-            "@java.lang.Deprecated " : "",
-        "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "", "ver", GeneratedCodeVersionSuffix());
+      "public interface $classname$OrBuilder extends\n"
+      "    $extra_interfaces$\n"
+      "    com.google.protobuf.GeneratedMessage.\n"
+      "        ExtendableMessageOrBuilder<$classname$> {\n",
+      "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
+      "classname", descriptor_->name());
   } 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 " : "",
-        "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "");
+      "public interface $classname$OrBuilder extends\n"
+      "    $extra_interfaces$\n"
+      "    com.google.protobuf.MessageOrBuilder {\n",
+      "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
+      "classname", descriptor_->name());
   }
-  printer->Annotate("{", "}", descriptor_);
 
   printer->Indent();
     for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -302,53 +291,37 @@
 // ===================================================================
 
 void ImmutableMessageGenerator::Generate(io::Printer* printer) {
-  bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true);
+  bool is_own_file =
+    descriptor_->containing_type() == NULL &&
+    MultipleJavaFiles(descriptor_->file(), /* immutable = */ true);
 
-  std::map<string, string> variables;
+  map<string, string> variables;
   variables["static"] = is_own_file ? " " : " static ";
   variables["classname"] = descriptor_->name();
   variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
-  variables["ver"] = GeneratedCodeVersionSuffix();
-  variables["deprecation"] = descriptor_->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
 
   WriteMessageDocComment(printer, descriptor_);
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
-                                /* immutable = */ true);
 
   // The builder_type stores the super type name of the nested Builder class.
   string builder_type;
   if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-        variables,
-        "$deprecation$public $static$final class $classname$ extends\n");
-    printer->Annotate("classname", descriptor_);
-    printer->Print(
-        variables,
-        "    com.google.protobuf.GeneratedMessage$ver$.ExtendableMessage<\n"
-        "      $classname$> implements\n"
-        "    $extra_interfaces$\n"
-        "    $classname$OrBuilder {\n");
-    builder_type = strings::Substitute(
-        "com.google.protobuf.GeneratedMessage$1.ExtendableBuilder<$0, ?>",
-        name_resolver_->GetImmutableClassName(descriptor_),
-        GeneratedCodeVersionSuffix());
-  } else {
-    printer->Print(
-        variables,
-        "$deprecation$public $static$final class $classname$ extends\n");
-    printer->Annotate("classname", descriptor_);
     printer->Print(variables,
-      "    com.google.protobuf.GeneratedMessage$ver$ implements\n"
+      "public $static$final class $classname$ extends\n"
+      "    com.google.protobuf.GeneratedMessage.ExtendableMessage<\n"
+      "      $classname$> implements\n"
       "    $extra_interfaces$\n"
       "    $classname$OrBuilder {\n");
     builder_type = strings::Substitute(
-        "com.google.protobuf.GeneratedMessage$0.Builder<?>",
-        GeneratedCodeVersionSuffix());
+             "com.google.protobuf.GeneratedMessage.ExtendableBuilder<$0, ?>",
+             name_resolver_->GetImmutableClassName(descriptor_));
+  } else {
+    printer->Print(variables,
+      "public $static$final class $classname$ extends\n"
+      "    com.google.protobuf.GeneratedMessage implements\n"
+      "    $extra_interfaces$\n"
+      "    $classname$OrBuilder {\n");
+    builder_type = "com.google.protobuf.GeneratedMessage.Builder<?>";
   }
-  printer->Print(
-    "private static final long serialVersionUID = 0L;\n");
-
   printer->Indent();
   // Using builder_type, instead of Builder, prevents the Builder class from
   // being loaded into PermGen space when the default instance is created.
@@ -371,19 +344,22 @@
     "}\n"
     "\n");
 
-
   printer->Print(
     "@java.lang.Override\n"
     "public final com.google.protobuf.UnknownFieldSet\n"
-    "getUnknownFields() {\n"
-    "  return this.unknownFields;\n"
+    "getUnknownFields() {\n");
+  if (PreserveUnknownFields(descriptor_)) {
+    printer->Print(
+      "  return this.unknownFields;\n");
+  } else {
+    printer->Print(
+      "  return com.google.protobuf.UnknownFieldSet.getDefaultInstance();\n");
+  }
+  printer->Print(
     "}\n");
 
   if (context_->HasGeneratedMethods(descriptor_)) {
-    if (!EnableExperimentalRuntime(context_) ||
-        IsDescriptorProto(descriptor_)) {
-      GenerateParsingConstructor(printer);
-    }
+    GenerateParsingConstructor(printer);
   }
 
   GenerateDescriptorMethods(printer);
@@ -418,7 +394,7 @@
   }
 
   // oneof
-  std::map<string, string> vars;
+  map<string, string> vars;
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     vars["oneof_name"] = context_->GetOneofGeneratorInfo(
         descriptor_->oneof_decl(i))->name;
@@ -509,6 +485,9 @@
   if (context_->HasGeneratedMethods(descriptor_)) {
     GenerateIsInitialized(printer);
     GenerateMessageSerializationMethods(printer);
+  }
+
+  if (HasEqualsAndHashCode(descriptor_)) {
     GenerateEqualsAndHashCode(printer);
   }
 
@@ -541,17 +520,6 @@
       "\n",
       "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
-  // 'of' method for Wrappers
-  if (IsWrappersProtoFile(descriptor_->file())) {
-    printer->Print(
-        "public static $classname$ of($field_type$ value) {\n"
-        "  return newBuilder().setValue(value).build();\n"
-        "}\n"
-        "\n",
-        "classname", name_resolver_->GetImmutableClassName(descriptor_),
-        "field_type", PrimitiveTypeName(GetJavaType(descriptor_->field(0))));
-  }
-
   GenerateParser(printer);
 
   printer->Print(
@@ -581,115 +549,113 @@
   google::protobuf::scoped_array<const FieldDescriptor * > sorted_fields(
       SortFieldsByNumber(descriptor_));
 
-  std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
+  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());
+
   printer->Print(
     "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 (EnableExperimentalRuntime(context_) && !IsDescriptorProto(descriptor_)) {
-    printer->Print("writeToInternal(output);\n");
-  } else {
-    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.GeneratedMessage$ver$\n"
-            "  .ExtendableMessage<$classname$>.ExtensionWriter\n"
-            "    extensionWriter = newMessageSetExtensionWriter();\n",
-            "classname", name_resolver_->GetImmutableClassName(descriptor_),
-            "ver", GeneratedCodeVersionSuffix());
-      } else {
-        printer->Print(
-            "com.google.protobuf.GeneratedMessage$ver$\n"
-            "  .ExtendableMessage<$classname$>.ExtensionWriter\n"
-            "    extensionWriter = newExtensionWriter();\n",
-            "classname", name_resolver_->GetImmutableClassName(descriptor_),
-            "ver", GeneratedCodeVersionSuffix());
-      }
-    }
-
-    // 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_->extension_range_count() > 0) {
     if (descriptor_->options().message_set_wire_format()) {
-      printer->Print("unknownFields.writeAsMessageSetTo(output);\n");
+      printer->Print(
+        "com.google.protobuf.GeneratedMessage\n"
+        "  .ExtendableMessage<$classname$>.ExtensionWriter\n"
+        "    extensionWriter = newMessageSetExtensionWriter();\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_));
     } else {
-      printer->Print("unknownFields.writeTo(output);\n");
+      printer->Print(
+        "com.google.protobuf.GeneratedMessage\n"
+        "  .ExtendableMessage<$classname$>.ExtensionWriter\n"
+        "    extensionWriter = newExtensionWriter();\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_));
     }
   }
 
-  printer->Outdent();
-  printer->Print(
-      "}\n"
-      "\n"
-      "public int getSerializedSize() {\n"
-      "  int size = memoizedSize;\n"
-      "  if (size != -1) return size;\n"
-      "\n");
-  printer->Indent();
-  if (EnableExperimentalRuntime(context_) && !IsDescriptorProto(descriptor_)) {
-    printer->Print(
-        "memoizedSize = getSerializedSizeInternal();\n"
-        "return memoizedSize;\n");
-  } else {
-
-    printer->Print("size = 0;\n");
-
-    for (int i = 0; i < descriptor_->field_count(); i++) {
-      field_generators_.get(sorted_fields[i])
-          .GenerateSerializedSizeCode(printer);
+  // 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_->extension_range_count() > 0) {
-      if (descriptor_->options().message_set_wire_format()) {
-        printer->Print("size += extensionsSerializedSizeAsMessageSet();\n");
-      } else {
-        printer->Print("size += extensionsSerializedSize();\n");
-      }
-    }
-
+  if (PreserveUnknownFields(descriptor_)) {
     if (descriptor_->options().message_set_wire_format()) {
       printer->Print(
-          "size += unknownFields.getSerializedSizeAsMessageSet();\n");
+        "unknownFields.writeAsMessageSetTo(output);\n");
     } else {
-      printer->Print("size += unknownFields.getSerializedSize();\n");
+      printer->Print(
+        "unknownFields.writeTo(output);\n");
     }
-
-    printer->Print(
-        "memoizedSize = size;\n"
-        "return size;\n");
   }
 
   printer->Outdent();
   printer->Print(
     "}\n"
+    "\n"
+    "public int getSerializedSize() {\n"
+    "  int size = memoizedSize;\n"
+    "  if (size != -1) return size;\n"
+    "\n"
+    "  size = 0;\n");
+  printer->Indent();
+
+  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 (PreserveUnknownFields(descriptor_)) {
+    if (descriptor_->options().message_set_wire_format()) {
+      printer->Print(
+        "size += unknownFields.getSerializedSizeAsMessageSet();\n");
+    } else {
+      printer->Print(
+        "size += unknownFields.getSerializedSize();\n");
+    }
+  }
+
+  printer->Outdent();
+  printer->Print(
+    "  memoizedSize = size;\n"
+    "  return size;\n"
+    "}\n"
     "\n");
+
+  printer->Print(
+    "private static final long serialVersionUID = 0L;\n");
 }
 
 void ImmutableMessageGenerator::
@@ -699,17 +665,6 @@
   //   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"
@@ -732,44 +687,43 @@
     "}\n"
     "public static $classname$ parseFrom(java.io.InputStream input)\n"
     "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
+    "  return com.google.protobuf.GeneratedMessage\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"
+    "  return com.google.protobuf.GeneratedMessage\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"
+    "  return com.google.protobuf.GeneratedMessage\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"
+    "  return com.google.protobuf.GeneratedMessage\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"
+    "  return com.google.protobuf.GeneratedMessage\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"
+    "  return com.google.protobuf.GeneratedMessage\n"
     "      .parseWithIOException(PARSER, input, extensionRegistry);\n"
     "}\n"
     "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+    "classname", name_resolver_->GetImmutableClassName(descriptor_));
 }
 
 void ImmutableMessageGenerator::GenerateSerializeOneField(
@@ -808,11 +762,10 @@
   printer->Print(
     "@java.lang.Override\n"
     "protected Builder newBuilderForType(\n"
-    "    com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n"
+    "    com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n"
     "  Builder builder = new Builder(parent);\n"
     "  return builder;\n"
-    "}\n",
-    "ver", GeneratedCodeVersionSuffix());
+    "}\n");
 
   MessageBuilderGenerator builderGenerator(descriptor_, context_);
   builderGenerator.Generate(printer);
@@ -830,7 +783,7 @@
       "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
       "identifier", UniqueFileScopeIdentifier(descriptor_));
   }
-  std::vector<const FieldDescriptor*> map_fields;
+  vector<const FieldDescriptor*> map_fields;
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
     if (GetJavaType(field) == JAVATYPE_MESSAGE &&
@@ -866,7 +819,7 @@
         "}\n");
   }
   printer->Print(
-    "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
+    "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
     "    internalGetFieldAccessorTable() {\n"
     "  return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
     "      .ensureFieldAccessorsInitialized(\n"
@@ -875,8 +828,7 @@
     "\n",
     "classname", name_resolver_->GetImmutableClassName(descriptor_),
     "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-    "identifier", UniqueFileScopeIdentifier(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+    "identifier", UniqueFileScopeIdentifier(descriptor_));
 }
 
 // ===================================================================
@@ -959,7 +911,7 @@
         case FieldDescriptor::LABEL_REPEATED:
           if (IsMapEntry(field->message_type())) {
             printer->Print(
-              "for ($type$ item : get$name$Map().values()) {\n"
+              "for ($type$ item : get$name$().values()) {\n"
               "  if (!item.isInitialized()) {\n"
               "    memoizedIsInitialized = 0;\n"
               "    return false;\n"
@@ -1091,11 +1043,13 @@
     printer->Print("}\n");
   }
 
-  // Always consider unknown fields for equality. This will sometimes return
-  // false for non-canonical ordering when running in LITE_RUNTIME but it's
-  // the best we can do.
-  printer->Print(
+  if (PreserveUnknownFields(descriptor_)) {
+    // Always consider unknown fields for equality. This will sometimes return
+    // false for non-canonical ordering when running in LITE_RUNTIME but it's
+    // the best we can do.
+    printer->Print(
       "result = result && unknownFields.equals(other.unknownFields);\n");
+  }
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
       "result = result &&\n"
@@ -1122,12 +1076,7 @@
     "}\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()) {
-    printer->Print("hash = (19 * hash) + getDescriptorForType().hashCode();\n");
-  } else {
-    printer->Print("hash = (19 * hash) + getDescriptor().hashCode();\n");
-  }
+  printer->Print("hash = (19 * hash) + getDescriptorForType().hashCode();\n");
 
   // hashCode non-oneofs.
   for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -1222,10 +1171,7 @@
 
   // Initialize all fields to default.
   printer->Print(
-      "this();\n"
-      "if (extensionRegistry == null) {\n"
-      "  throw new java.lang.NullPointerException();\n"
-      "}\n");
+      "this();\n");
 
   // Use builder bits to track mutable repeated fields.
   int totalBuilderBits = 0;
@@ -1240,9 +1186,11 @@
       "bit_field_name", GetBitFieldName(i));
   }
 
-  printer->Print(
+  if (PreserveUnknownFields(descriptor_)) {
+    printer->Print(
       "com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n"
       "    com.google.protobuf.UnknownFieldSet.newBuilder();\n");
+  }
 
   printer->Print(
       "try {\n");
@@ -1259,19 +1207,29 @@
   printer->Indent();
 
   printer->Print(
-    "case 0:\n"  // zero signals EOF / limit reached
+    "case 0:\n"          // zero signals EOF / limit reached
     "  done = true;\n"
-    "  break;\n"
-    "default: {\n"
-    "  if (!parseUnknownField$suffix$(\n"
-    "      input, unknownFields, extensionRegistry, tag)) {\n"
-    "    done = true;\n"  // it's an endgroup tag
-    "  }\n"
-    "  break;\n"
-    "}\n",
-    "suffix",
-    descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 ? "Proto3"
-                                                                   : "");
+    "  break;\n");
+
+  if (PreserveUnknownFields(descriptor_)) {
+    printer->Print(
+      "default: {\n"
+      "  if (!parseUnknownField(input, unknownFields,\n"
+      "                         extensionRegistry, tag)) {\n"
+      "    done = true;\n"  // it's an endgroup tag
+      "  }\n"
+      "  break;\n"
+      "}\n");
+  } else {
+    printer->Print(
+      "default: {\n"
+      "  if (!input.skipField(tag)) {\n"
+      "    done = true;\n"  // it's an endgroup tag
+      "  }\n");
+    printer->Print(
+      "  break;\n"
+      "}\n");
+  }
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = sorted_fields[i];
@@ -1280,7 +1238,7 @@
 
     printer->Print(
       "case $tag$: {\n",
-      "tag", SimpleItoa(static_cast<int32>(tag)));
+      "tag", SimpleItoa(tag));
     printer->Indent();
 
     field_generators_.get(field).GenerateParsingCode(printer);
@@ -1297,7 +1255,7 @@
         WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
       printer->Print(
         "case $tag$: {\n",
-        "tag", SimpleItoa(static_cast<int32>(packed_tag)));
+        "tag", SimpleItoa(packed_tag));
       printer->Indent();
 
       field_generators_.get(field).GenerateParsingCodeFromPacked(printer);
@@ -1331,8 +1289,10 @@
     field_generators_.get(field).GenerateParsingDoneCode(printer);
   }
 
-  // Make unknown fields immutable.
-  printer->Print("this.unknownFields = unknownFields.build();\n");
+  if (PreserveUnknownFields(descriptor_)) {
+    // Make unknown fields immutable.
+    printer->Print("this.unknownFields = unknownFields.build();\n");
+  }
 
   // Make extensions immutable.
   printer->Print(
@@ -1361,18 +1321,10 @@
       "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
       "    throws com.google.protobuf.InvalidProtocolBufferException {\n",
       "classname", descriptor_->name());
-  if (EnableExperimentalRuntime(context_) && !IsDescriptorProto(descriptor_)) {
-    printer->Indent();
+  if (context_->HasGeneratedMethods(descriptor_)) {
     printer->Print(
-        "$classname$ msg = new $classname$();\n"
-        "msg.mergeFromInternal(input, extensionRegistry);\n"
-        "msg.makeImmutableInternal();\n"
-        "return msg;\n",
+        "    return new $classname$(input, extensionRegistry);\n",
         "classname", descriptor_->name());
-    printer->Outdent();
-  } else if (context_->HasGeneratedMethods(descriptor_)) {
-    printer->Print("  return new $classname$(input, extensionRegistry);\n",
-                   "classname", descriptor_->name());
   } else {
     // When parsing constructor isn't generated, use builder to parse
     // messages. Note, will fallback to use reflection based mergeFieldFrom()
@@ -1449,7 +1401,7 @@
     "}\n"
     "\n"
     "/**\n"
-    " * Packs a message using the given type URL prefix. The type URL will\n"
+    " * Packs a message uisng 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"
@@ -1473,7 +1425,6 @@
     "\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"
diff --git a/src/google/protobuf/compiler/java/java_message.h b/src/google/protobuf/compiler/java/java_message.h
index da1447c..e9fc57c 100644
--- a/src/google/protobuf/compiler/java/java_message.h
+++ b/src/google/protobuf/compiler/java/java_message.h
@@ -92,7 +92,8 @@
 
 class ImmutableMessageGenerator : public MessageGenerator {
  public:
-  ImmutableMessageGenerator(const Descriptor* descriptor, Context* context);
+  explicit ImmutableMessageGenerator(const Descriptor* descriptor,
+                                     Context* context);
   virtual ~ImmutableMessageGenerator();
 
   virtual void Generate(io::Printer* printer);
diff --git a/src/google/protobuf/compiler/java/java_message_builder.cc b/src/google/protobuf/compiler/java/java_message_builder.cc
index f9bbfbf..b3e9e98 100644
--- a/src/google/protobuf/compiler/java/java_message_builder.cc
+++ b/src/google/protobuf/compiler/java/java_message_builder.cc
@@ -54,9 +54,8 @@
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/stubs/strutil.h>
-
+#include <google/protobuf/stubs/substitute.h>
 
 namespace google {
 namespace protobuf {
@@ -95,22 +94,20 @@
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
       "public static final class Builder extends\n"
-      "    com.google.protobuf.GeneratedMessage$ver$.ExtendableBuilder<\n"
+      "    com.google.protobuf.GeneratedMessage.ExtendableBuilder<\n"
       "      $classname$, Builder> implements\n"
       "    $extra_interfaces$\n"
       "    $classname$OrBuilder {\n",
       "classname", name_resolver_->GetImmutableClassName(descriptor_),
-      "extra_interfaces", ExtraBuilderInterfaces(descriptor_),
-      "ver", GeneratedCodeVersionSuffix());
+      "extra_interfaces", ExtraBuilderInterfaces(descriptor_));
   } else {
     printer->Print(
       "public static final class Builder extends\n"
-      "    com.google.protobuf.GeneratedMessage$ver$.Builder<Builder> implements\n"
+      "    com.google.protobuf.GeneratedMessage.Builder<Builder> implements\n"
       "    $extra_interfaces$\n"
       "    $classname$OrBuilder {\n",
       "classname", name_resolver_->GetImmutableClassName(descriptor_),
-      "extra_interfaces", ExtraBuilderInterfaces(descriptor_),
-      "ver", GeneratedCodeVersionSuffix());
+      "extra_interfaces", ExtraBuilderInterfaces(descriptor_));
   }
   printer->Indent();
 
@@ -123,7 +120,7 @@
   }
 
   // oneof
-  std::map<string, string> vars;
+  map<string, string> vars;
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     vars["oneof_name"] = context_->GetOneofGeneratorInfo(
         descriptor_->oneof_decl(i))->name;
@@ -172,25 +169,19 @@
                      .GenerateBuilderMembers(printer);
   }
 
-  bool is_proto3 =
-      descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3;
-    // 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(
-    "public final Builder setUnknownFields(\n"
-    "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
-    "  return super.setUnknownFields$suffix$(unknownFields);\n"
-    "}\n"
-    "\n"
-    "public final Builder mergeUnknownFields(\n"
-    "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
-    "  return super.mergeUnknownFields(unknownFields);\n"
-    "}\n"
-    "\n",
-    "suffix", is_proto3 ? "Proto3" : "");
+  if (!PreserveUnknownFields(descriptor_)) {
+    printer->Print(
+      "public final Builder setUnknownFields(\n"
+      "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
+      "  return this;\n"
+      "}\n"
+      "\n"
+      "public final Builder mergeUnknownFields(\n"
+      "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
+      "  return this;\n"
+      "}\n"
+      "\n");
+  }
 
   printer->Print(
     "\n"
@@ -215,7 +206,7 @@
       "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
       "identifier", UniqueFileScopeIdentifier(descriptor_));
   }
-  std::vector<const FieldDescriptor*> map_fields;
+  vector<const FieldDescriptor*> map_fields;
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
     if (GetJavaType(field) == JAVATYPE_MESSAGE &&
@@ -277,7 +268,7 @@
         "}\n");
   }
   printer->Print(
-    "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
+    "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
     "    internalGetFieldAccessorTable() {\n"
     "  return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
     "      .ensureFieldAccessorsInitialized(\n"
@@ -286,8 +277,7 @@
     "\n",
     "classname", name_resolver_->GetImmutableClassName(descriptor_),
     "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-    "identifier", UniqueFileScopeIdentifier(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+    "identifier", UniqueFileScopeIdentifier(descriptor_));
 }
 
 // ===================================================================
@@ -304,18 +294,15 @@
 
   printer->Print(
     "private Builder(\n"
-    "    com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n"
+    "    com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n"
     "  super(parent);\n"
     "  maybeForceBuilderInitialization();\n"
     "}\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+    "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
     "private void maybeForceBuilderInitialization() {\n"
-    "  if (com.google.protobuf.GeneratedMessage$ver$\n"
-    "          .alwaysUseFieldBuilders) {\n",
-    "ver", GeneratedCodeVersionSuffix());
+    "  if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\n");
 
   printer->Indent();
   printer->Indent();
@@ -451,67 +438,6 @@
     "\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
-  // 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(
-    "public Builder clone() {\n"
-    "  return (Builder) super.clone();\n"
-    "}\n"
-    "public Builder setField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
-    "    java.lang.Object value) {\n"
-    "  return (Builder) super.setField(field, value);\n"
-    "}\n"
-    "public Builder clearField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field) {\n"
-    "  return (Builder) super.clearField(field);\n"
-    "}\n"
-    "public Builder clearOneof(\n"
-    "    com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n"
-    "  return (Builder) super.clearOneof(oneof);\n"
-    "}\n"
-    "public Builder setRepeatedField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
-    "    int index, java.lang.Object value) {\n"
-    "  return (Builder) super.setRepeatedField(field, index, value);\n"
-    "}\n"
-    "public Builder addRepeatedField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
-    "    java.lang.Object value) {\n"
-    "  return (Builder) super.addRepeatedField(field, value);\n"
-    "}\n");
-
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-      "public <Type> Builder setExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, Type> extension,\n"
-      "    Type value) {\n"
-      "  return (Builder) super.setExtension(extension, value);\n"
-      "}\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 (Builder) super.setExtension(extension, index, value);\n"
-      "}\n"
-      "public <Type> Builder addExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, java.util.List<Type>> extension,\n"
-      "    Type value) {\n"
-      "  return (Builder) super.addExtension(extension, value);\n"
-      "}\n"
-      "public <Type> Builder clearExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, ?> extension) {\n"
-      "  return (Builder) super.clearExtension(extension);\n"
-      "}\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_));
-  }
-
   // -----------------------------------------------------------------
 
   if (context_->HasGeneratedMethods(descriptor_)) {
@@ -584,8 +510,10 @@
         "  this.mergeExtensionFields(other);\n");
     }
 
-    printer->Print(
-      "  this.mergeUnknownFields(other.unknownFields);\n");
+    if (PreserveUnknownFields(descriptor_)) {
+      printer->Print(
+        "  this.mergeUnknownFields(other.unknownFields);\n");
+    }
 
     printer->Print(
       "  onChanged();\n");
@@ -687,7 +615,7 @@
         case FieldDescriptor::LABEL_REPEATED:
           if (IsMapEntry(field->message_type())) {
             printer->Print(
-              "for ($type$ item : get$name$Map().values()) {\n"
+              "for ($type$ item : get$name$().values()) {\n"
               "  if (!item.isInitialized()) {\n"
               "    return false;\n"
               "  }\n"
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 1ad58c0..dd429dc 100644
--- a/src/google/protobuf/compiler/java/java_message_builder_lite.cc
+++ b/src/google/protobuf/compiler/java/java_message_builder_lite.cc
@@ -67,6 +67,13 @@
   return SupportFieldPresence(descriptor->file()) ||
       HasRepeatedFields(descriptor);
 }
+
+string MapValueImmutableClassdName(const Descriptor* descriptor,
+                                   ClassNameResolver* name_resolver) {
+  const FieldDescriptor* value_field = descriptor->FindFieldByName("value");
+  GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, value_field->type());
+  return name_resolver->GetImmutableClassName(value_field->message_type());
+}
 }  // namespace
 
 MessageBuilderLiteGenerator::MessageBuilderLiteGenerator(
@@ -99,7 +106,7 @@
   GenerateCommonBuilderMethods(printer);
 
   // oneof
-  std::map<string, string> vars;
+  map<string, string> vars;
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     vars["oneof_name"] = context_->GetOneofGeneratorInfo(
         descriptor_->oneof_decl(i))->name;
diff --git a/src/google/protobuf/compiler/java/java_message_field.cc b/src/google/protobuf/compiler/java/java_message_field.cc
index baa7f87..455516f 100644
--- a/src/google/protobuf/compiler/java/java_message_field.cc
+++ b/src/google/protobuf/compiler/java/java_message_field.cc
@@ -56,7 +56,7 @@
                          int builderBitIndex,
                          const FieldGeneratorInfo* info,
                          ClassNameResolver* name_resolver,
-                         std::map<string, string>* variables) {
+                         map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["type"] =
@@ -71,10 +71,6 @@
   (*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()";
 
   if (SupportFieldPresence(descriptor->file())) {
     // For singular messages and builders, one bit is used for the hasField bit.
@@ -150,9 +146,12 @@
   // 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");
+  if (SupportFieldPresence(descriptor_->file()) ||
+      descriptor_->containing_oneof() == NULL) {
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(variables_,
+      "$deprecation$boolean has$capitalized_name$();\n");
+  }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$$type$ get$capitalized_name$();\n");
@@ -171,45 +170,39 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+      "$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"
+      "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"
+      "$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"
+      "$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"
+      "get$capitalized_name$OrBuilder() {\n"
       "  return get$capitalized_name$();\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 }
 
@@ -235,7 +228,6 @@
     const char* nested_builder_case,
     const char* trailing_code) const {
   printer->Print(variables_, method_prototype);
-  printer->Annotate("{", "}", descriptor_);
   printer->Print(" {\n");
   printer->Indent();
   PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
@@ -260,7 +252,7 @@
   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"
+      "private com.google.protobuf.SingleFieldBuilder<\n"
       "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
       "\n");
 
@@ -271,22 +263,20 @@
   WriteFieldDocComment(printer, descriptor_);
   if (support_field_presence) {
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$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"
+      "$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$$}$()",
+    "$deprecation$public $type$ get$capitalized_name$()",
     "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n",
     "return $name$Builder_.getMessage();\n",
     NULL);
@@ -294,7 +284,7 @@
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
+    "$deprecation$public Builder set$capitalized_name$($type$ value)",
 
     "if (value == null) {\n"
     "  throw new NullPointerException();\n"
@@ -310,7 +300,7 @@
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    $type$.Builder builderForValue)",
 
     "$name$_ = builderForValue.build();\n"
@@ -324,7 +314,7 @@
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
+    "$deprecation$public Builder merge$capitalized_name$($type$ value)",
 
     support_field_presence
         ? "if ($get_has_field_bit_builder$ &&\n"
@@ -352,7 +342,7 @@
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
+    "$deprecation$public Builder clear$capitalized_name$()",
 
     "$name$_ = null;\n"
     "$on_changed$\n",
@@ -367,17 +357,14 @@
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$.Builder "
-    "${$get$capitalized_name$Builder$}$() {\n"
+    "$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"
+    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
     "  if ($name$Builder_ != null) {\n"
     "    return $name$Builder_.getMessageOrBuilder();\n"
     "  } else {\n"
@@ -385,14 +372,13 @@
     "        $type$.getDefaultInstance() : $name$_;\n"
     "  }\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+    "private com.google.protobuf.SingleFieldBuilder<\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"
+    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     "            get$capitalized_name$(),\n"
     "            getParentForChildren(),\n"
@@ -465,11 +451,11 @@
 
   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
     printer->Print(variables_,
-      "$name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
+      "$name$_ = input.readGroup($number$, $type$.parser(),\n"
       "    extensionRegistry);\n");
   } else {
     printer->Print(variables_,
-      "$name$_ = input.readMessage($type$.$get_parser$, extensionRegistry);\n");
+      "$name$_ = input.readMessage($type$.parser(), extensionRegistry);\n");
   }
 
   printer->Print(variables_,
@@ -540,32 +526,30 @@
 void ImmutableMessageOneofFieldGenerator::
 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");
+  }
   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 $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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::
@@ -576,25 +560,26 @@
   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"
+    "private com.google.protobuf.SingleFieldBuilder<\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".
 
-  // boolean hasField()
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return $has_oneof_case_message$;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
+  if (SupportFieldPresence(descriptor_->file())) {
+    // boolean hasField()
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(variables_,
+      "$deprecation$public boolean has$capitalized_name$() {\n"
+      "  return $has_oneof_case_message$;\n"
+      "}\n");
+  }
 
   // Field getField()
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
+    "$deprecation$public $type$ get$capitalized_name$()",
 
     "if ($has_oneof_case_message$) {\n"
     "  return ($type$) $oneof_name$_;\n"
@@ -611,7 +596,7 @@
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
+    "$deprecation$public Builder set$capitalized_name$($type$ value)",
 
     "if (value == null) {\n"
     "  throw new NullPointerException();\n"
@@ -627,7 +612,7 @@
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    $type$.Builder builderForValue)",
 
     "$oneof_name$_ = builderForValue.build();\n"
@@ -641,7 +626,7 @@
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
+    "$deprecation$public Builder merge$capitalized_name$($type$ value)",
 
     "if ($has_oneof_case_message$ &&\n"
     "    $oneof_name$_ != $type$.getDefaultInstance()) {\n"
@@ -663,7 +648,7 @@
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
+    "$deprecation$public Builder clear$capitalized_name$()",
 
     "if ($has_oneof_case_message$) {\n"
     "  $clear_oneof_case_message$;\n"
@@ -681,15 +666,12 @@
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$.Builder "
-    "${$get$capitalized_name$Builder$}$() {\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"
+    "$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"
@@ -699,17 +681,16 @@
     "    return $type$.getDefaultInstance();\n"
     "  }\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+    "private com.google.protobuf.SingleFieldBuilder<\n"
     "    $type$, $type$.Builder, $type$OrBuilder> \n"
-    "    ${$get$capitalized_name$FieldBuilder$}$() {\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"
+    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     "            ($type$) $oneof_name$_,\n"
     "            getParentForChildren(),\n"
@@ -720,7 +701,6 @@
     "  $on_changed$;\n"
     "  return $name$Builder_;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableMessageOneofFieldGenerator::
@@ -755,12 +735,12 @@
 
   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
     printer->Print(variables_,
-      "$oneof_name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
+      "$oneof_name$_ = input.readGroup($number$, $type$.parser(),\n"
       "    extensionRegistry);\n");
   } else {
     printer->Print(variables_,
       "$oneof_name$_ =\n"
-      "    input.readMessage($type$.$get_parser$, extensionRegistry);\n");
+      "    input.readMessage($type$.parser(), extensionRegistry);\n");
   }
 
   printer->Print(variables_,
@@ -849,38 +829,31 @@
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$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"
+    "    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"
+    "$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"
+    "$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"
+    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
     "    int index) {\n"
     "  return $name$_.get(index);\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 
 }
 
@@ -906,7 +879,6 @@
     const char* nested_builder_case,
     const char* trailing_code) const {
   printer->Print(variables_, method_prototype);
-  printer->Annotate("{", "}", descriptor_);
   printer->Print(" {\n");
   printer->Indent();
   PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
@@ -948,7 +920,7 @@
   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"
+    "private com.google.protobuf.RepeatedFieldBuilder<\n"
     "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
     "\n");
 
@@ -958,8 +930,7 @@
   // List<Field> getRepeatedFieldList()
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$()",
+    "$deprecation$public java.util.List<$type$> get$capitalized_name$List()",
 
     "return java.util.Collections.unmodifiableList($name$_);\n",
     "return $name$Builder_.getMessageList();\n",
@@ -969,7 +940,7 @@
   // int getRepeatedFieldCount()
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$()",
+    "$deprecation$public int get$capitalized_name$Count()",
 
     "return $name$_.size();\n",
     "return $name$Builder_.getCount();\n",
@@ -979,7 +950,7 @@
   // Field getRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index)",
+    "$deprecation$public $type$ get$capitalized_name$(int index)",
 
     "return $name$_.get(index);\n",
 
@@ -990,7 +961,7 @@
   // Builder setRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    int index, $type$ value)",
     "if (value == null) {\n"
     "  throw new NullPointerException();\n"
@@ -1004,7 +975,7 @@
   // Builder setRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    int index, $type$.Builder builderForValue)",
 
     "ensure$capitalized_name$IsMutable();\n"
@@ -1018,7 +989,7 @@
   // Builder addRepeatedField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value)",
+    "$deprecation$public Builder add$capitalized_name$($type$ value)",
 
     "if (value == null) {\n"
     "  throw new NullPointerException();\n"
@@ -1035,7 +1006,7 @@
   // Builder addRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+    "$deprecation$public Builder add$capitalized_name$(\n"
     "    int index, $type$ value)",
 
     "if (value == null) {\n"
@@ -1052,7 +1023,7 @@
   // Builder addRepeatedField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+    "$deprecation$public Builder add$capitalized_name$(\n"
     "    $type$.Builder builderForValue)",
 
     "ensure$capitalized_name$IsMutable();\n"
@@ -1066,7 +1037,7 @@
   // Builder addRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+    "$deprecation$public Builder add$capitalized_name$(\n"
     "    int index, $type$.Builder builderForValue)",
 
     "ensure$capitalized_name$IsMutable();\n"
@@ -1080,7 +1051,7 @@
   // Builder addAllRepeatedField(Iterable<Field> values)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+    "$deprecation$public Builder addAll$capitalized_name$(\n"
     "    java.lang.Iterable<? extends $type$> values)",
 
     "ensure$capitalized_name$IsMutable();\n"
@@ -1095,7 +1066,7 @@
   // Builder clearAllRepeatedField()
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
+    "$deprecation$public Builder clear$capitalized_name$()",
 
     "$name$_ = java.util.Collections.emptyList();\n"
     "$clear_mutable_bit_builder$;\n"
@@ -1108,7 +1079,7 @@
   // Builder removeRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
   PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index)",
+    "$deprecation$public Builder remove$capitalized_name$(int index)",
 
     "ensure$capitalized_name$IsMutable();\n"
     "$name$_.remove(index);\n"
@@ -1120,16 +1091,14 @@
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$.Builder ${$get$capitalized_name$Builder$}$(\n"
+    "$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$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$(\n"
+    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
     "    int index) {\n"
     "  if ($name$Builder_ == null) {\n"
     "    return $name$_.get(index);"
@@ -1137,47 +1106,42 @@
     "    return $name$Builder_.getMessageOrBuilder(index);\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"
+    "     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"
+    "$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"
+    "$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"
+    "     get$capitalized_name$BuilderList() {\n"
     "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
     "}\n"
-    "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
+    "private com.google.protobuf.RepeatedFieldBuilder<\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"
+    "    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n"
     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     "            $name$_,\n"
     "            $get_mutable_bit_builder$,\n"
@@ -1187,7 +1151,6 @@
     "  }\n"
     "  return $name$Builder_;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void RepeatedImmutableMessageFieldGenerator::
@@ -1236,7 +1199,7 @@
     "    $name$_ = other.$name$_;\n"
     "    $clear_mutable_bit_builder$;\n"
     "    $name$Builder_ = \n"
-    "      com.google.protobuf.GeneratedMessage$ver$.alwaysUseFieldBuilders ?\n"
+    "      com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\n"
     "         get$capitalized_name$FieldBuilder() : null;\n"
     "  } else {\n"
     "    $name$Builder_.addAllMessages(other.$name$_);\n"
@@ -1269,12 +1232,11 @@
 
   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
     printer->Print(variables_,
-      "$name$_.add(input.readGroup($number$, $type$.$get_parser$,\n"
+      "$name$_.add(input.readGroup($number$, $type$.parser(),\n"
       "    extensionRegistry));\n");
   } else {
     printer->Print(variables_,
-      "$name$_.add(\n"
-      "    input.readMessage($type$.$get_parser$, extensionRegistry));\n");
+      "$name$_.add(input.readMessage($type$.parser(), extensionRegistry));\n");
   }
 }
 
diff --git a/src/google/protobuf/compiler/java/java_message_field.h b/src/google/protobuf/compiler/java/java_message_field.h
index 7ee0edb..ea8225a 100644
--- a/src/google/protobuf/compiler/java/java_message_field.h
+++ b/src/google/protobuf/compiler/java/java_message_field.h
@@ -82,7 +82,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -148,7 +148,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
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 df3e80d..1428181 100644
--- a/src/google/protobuf/compiler/java/java_message_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_message_field_lite.cc
@@ -56,7 +56,7 @@
                          int builderBitIndex,
                          const FieldGeneratorInfo* info,
                          ClassNameResolver* name_resolver,
-                         std::map<string, string>* variables) {
+                         map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["type"] =
@@ -70,7 +70,6 @@
   // by the proto compiler
   (*variables)["deprecation"] = descriptor->options().deprecated()
       ? "@java.lang.Deprecated " : "";
-  (*variables)["required"] = descriptor->is_required() ? "true" : "false";
 
   if (SupportFieldPresence(descriptor->file())) {
     // For singular messages and builders, one bit is used for the hasField bit.
@@ -129,9 +128,16 @@
 
 void ImmutableMessageFieldLiteGenerator::
 GenerateInterfaceMembers(io::Printer* printer) const {
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$boolean has$capitalized_name$();\n");
+  // 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.
+  if (SupportFieldPresence(descriptor_->file()) ||
+      descriptor_->containing_oneof() == NULL) {
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(variables_,
+      "$deprecation$boolean has$capitalized_name$();\n");
+  }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$$type$ get$capitalized_name$();\n");
@@ -139,7 +145,6 @@
 
 void ImmutableMessageFieldLiteGenerator::
 GenerateMembers(io::Printer* printer) const {
-
   printer->Print(variables_,
     "private $type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
@@ -147,29 +152,25 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-      "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$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"
+      "$deprecation$public $type$ get$capitalized_name$() {\n"
       "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   // Field.Builder setField(Field value)
@@ -223,60 +224,53 @@
   // boolean hasField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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"
+    "$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"
+    "$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$$}$() {"
+    "$deprecation$public Builder clear$capitalized_name$() {"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableMessageFieldLiteGenerator::
@@ -394,21 +388,21 @@
 void ImmutableMessageOneofFieldLiteGenerator::
 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");
+  }
   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 $type$ ${$get$capitalized_name$$}$() {\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_);
@@ -455,69 +449,63 @@
     "}\n");
 }
 
-
 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_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return instance.has$capitalized_name$();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
+  if (SupportFieldPresence(descriptor_->file())) {
+    // boolean hasField()
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(variables_,
+      "$deprecation$public boolean has$capitalized_name$() {\n"
+      "  return instance.has$capitalized_name$();\n"
+      "}\n");
+  }
 
   // Field getField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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"
+    "$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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableMessageOneofFieldLiteGenerator::
@@ -624,38 +612,31 @@
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$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"
+    "    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"
+    "$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"
+    "$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"
+    "$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"
@@ -761,123 +742,110 @@
   // List<Field> getRepeatedFieldList()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\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_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\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"
+    "$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"
+    "$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"
+    "$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"
+    "$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"
+    "$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"
+    "$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"
+    "$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"
+    "$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"
+    "$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::
@@ -886,7 +854,6 @@
     "get$capitalized_name$FieldBuilder();\n");
 }
 
-
 void RepeatedImmutableMessageFieldLiteGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = emptyProtobufList();\n");
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 7c814c6..6132154 100644
--- a/src/google/protobuf/compiler/java/java_message_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_message_field_lite.h
@@ -81,7 +81,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -106,7 +106,6 @@
   void GenerateSerializationCode(io::Printer* printer) const;
   void GenerateSerializedSizeCode(io::Printer* printer) const;
 
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageOneofFieldLiteGenerator);
 };
@@ -136,12 +135,11 @@
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
 
-
   string GetBoxedType() const;
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
diff --git a/src/google/protobuf/compiler/java/java_message_lite.cc b/src/google/protobuf/compiler/java/java_message_lite.cc
index d828be4..d4d2593 100644
--- a/src/google/protobuf/compiler/java/java_message_lite.cc
+++ b/src/google/protobuf/compiler/java/java_message_lite.cc
@@ -56,9 +56,8 @@
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/stubs/strutil.h>
-
+#include <google/protobuf/stubs/substitute.h>
 
 namespace google {
 namespace protobuf {
@@ -69,14 +68,6 @@
 using internal::WireFormatLite;
 
 namespace {
-bool EnableExperimentalRuntimeForLite() {
-#ifdef PROTOBUF_EXPERIMENT
-  return PROTOBUF_EXPERIMENT;
-#else   // PROTOBUF_EXPERIMENT
-  return false;
-#endif  // !PROTOBUF_EXPERIMENT
-}
-
 bool GenerateHasBits(const Descriptor* descriptor) {
   return SupportFieldPresence(descriptor->file()) ||
       HasRepeatedFields(descriptor);
@@ -129,32 +120,23 @@
 // ===================================================================
 
 void ImmutableMessageLiteGenerator::GenerateInterface(io::Printer* printer) {
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
-                                /* immutable = */ true, "OrBuilder");
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-        "$deprecation$public interface ${$$classname$OrBuilder$}$ extends \n"
-        "    $extra_interfaces$\n"
-        "     com.google.protobuf.GeneratedMessageLite.\n"
-        "          ExtendableMessageOrBuilder<\n"
-        "              $classname$, $classname$.Builder> {\n",
-        "deprecation", descriptor_->options().deprecated() ?
-            "@java.lang.Deprecated " : "",
-        "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "");
+      "public interface $classname$OrBuilder extends \n"
+      "    $extra_interfaces$\n"
+      "     com.google.protobuf.GeneratedMessageLite.\n"
+      "          ExtendableMessageOrBuilder<\n"
+      "              $classname$, $classname$.Builder> {\n",
+      "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
+      "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 " : "",
-        "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "");
+      "public interface $classname$OrBuilder extends\n"
+      "    $extra_interfaces$\n"
+      "    com.google.protobuf.MessageLiteOrBuilder {\n",
+      "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
+      "classname", descriptor_->name());
   }
-  printer->Annotate("{", "}", descriptor_);
 
   printer->Indent();
     for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -181,25 +163,22 @@
 // ===================================================================
 
 void ImmutableMessageLiteGenerator::Generate(io::Printer* printer) {
-  bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true);
+  bool is_own_file =
+    descriptor_->containing_type() == NULL &&
+    MultipleJavaFiles(descriptor_->file(), /* immutable = */ true);
 
-  std::map<string, string> variables;
+  map<string, string> variables;
   variables["static"] = is_own_file ? " " : " static ";
   variables["classname"] = descriptor_->name();
   variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
-  variables["deprecation"] = descriptor_->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
 
   WriteMessageDocComment(printer, descriptor_);
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
-                                /* immutable = */ true);
-
 
   // The builder_type stores the super type name of the nested Builder class.
   string builder_type;
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(variables,
-      "$deprecation$public $static$final class $classname$ extends\n"
+      "public $static$final class $classname$ extends\n"
       "    com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n"
       "      $classname$, $classname$.Builder> implements\n"
       "    $extra_interfaces$\n"
@@ -209,7 +188,7 @@
         name_resolver_->GetImmutableClassName(descriptor_));
   } else {
     printer->Print(variables,
-        "$deprecation$public $static$final class $classname$ extends\n"
+        "public $static$final class $classname$ extends\n"
         "    com.google.protobuf.GeneratedMessageLite<\n"
         "        $classname$, $classname$.Builder> implements\n"
         "    $extra_interfaces$\n"
@@ -219,6 +198,7 @@
   }
   printer->Indent();
 
+
   GenerateConstructor(printer);
 
   // Nested types
@@ -251,13 +231,13 @@
   }
 
   // oneof
-  std::map<string, string> vars;
+  map<string, string> vars;
   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_name"] = context_->GetOneofGeneratorInfo(
+        descriptor_->oneof_decl(i))->name;
     vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
-        oneof)->capitalized_name;
-    vars["oneof_index"] = SimpleItoa(oneof->index());
+        descriptor_->oneof_decl(i))->capitalized_name;
+    vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
     // oneofCase_ and oneof_
     printer->Print(vars,
       "private int $oneof_name$Case_ = 0;\n"
@@ -267,8 +247,8 @@
       "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);
+    for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
+      const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
       printer->Print(
         "$field_name$($field_number$),\n",
         "field_name",
@@ -296,8 +276,8 @@
       "\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);
+    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",
         "field_number",
@@ -340,43 +320,40 @@
     printer->Print("\n");
   }
 
-  if (!EnableExperimentalRuntime(context_)) {
-    GenerateMessageSerializationMethods(printer);
-  }
+  GenerateMessageSerializationMethods(printer);
 
   GenerateParseFromMethods(printer);
   GenerateBuilder(printer);
 
   if (HasRequiredFields(descriptor_)) {
     // 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.
+    // required fields). -1 means not yet computed. 0 means false and 1 means
+    // true.
     printer->Print(
-      "private byte memoizedIsInitialized = 2;\n");
+      "private byte memoizedIsInitialized = -1;\n");
   }
 
   printer->Print(
-      "@java.lang.SuppressWarnings({\"unchecked\", \"fallthrough\"})\n"
-      "protected final java.lang.Object dynamicMethod(\n"
-      "    com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,\n"
-      "    java.lang.Object arg0, java.lang.Object arg1) {\n"
-      "  switch (method) {\n"
-      "    case NEW_MUTABLE_INSTANCE: {\n"
-      "      return new $classname$();\n"
-      "    }\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_));
+    "protected final Object dynamicMethod(\n"
+    "    com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,\n"
+    "    Object arg0, Object arg1) {\n"
+    "  switch (method) {\n"
+    "    case NEW_MUTABLE_INSTANCE: {\n"
+    "      return new $classname$();\n"
+    "    }\n",
+    "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Indent();
   printer->Indent();
 
-  printer->Print("case IS_INITIALIZED: {\n");
+  printer->Print(
+    "case IS_INITIALIZED: {\n");
   printer->Indent();
   GenerateDynamicMethodIsInitialized(printer);
   printer->Outdent();
 
-  printer->Print("}\n");
-
   printer->Print(
+    "}\n"
     "case MAKE_IMMUTABLE: {\n");
 
   printer->Indent();
@@ -391,15 +368,13 @@
   GenerateDynamicMethodNewBuilder(printer);
   printer->Outdent();
 
-  if (!EnableExperimentalRuntimeForLite()) {
-    printer->Print(
-        "}\n"
-        "case VISIT: {\n");
+  printer->Print(
+    "}\n"
+    "case VISIT: {\n");
 
-    printer->Indent();
-    GenerateDynamicMethodVisit(printer);
-    printer->Outdent();
-  }
+  printer->Indent();
+  GenerateDynamicMethodVisit(printer);
+  printer->Outdent();
 
   printer->Print(
     "}\n"
@@ -411,7 +386,6 @@
 
   printer->Print(
     "}\n"
-    "// fall through\n"
     "case GET_DEFAULT_INSTANCE: {\n"
     "  return DEFAULT_INSTANCE;\n"
     "}\n"
@@ -427,33 +401,13 @@
     "      }\n"
     "    }\n"
     "  }\n"
-    "  return PARSER;\n",
+    "  return PARSER;\n"
+    "}\n",
     "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Outdent();
-
-  if (HasRequiredFields(descriptor_)) {
-    printer->Print(
-        "}\n"
-        "case GET_MEMOIZED_IS_INITIALIZED: {\n"
-        "  return memoizedIsInitialized;\n"
-        "}\n"
-        "case SET_MEMOIZED_IS_INITIALIZED: {\n"
-        "  memoizedIsInitialized = (byte) (arg0 == null ? 0 : 1);\n"
-        "  return null;\n"
-        "}\n");
-  } else {
-    printer->Print(
-        "}\n"
-        "case GET_MEMOIZED_IS_INITIALIZED: {\n"
-        "  return (byte) 1;\n"
-        "}\n"
-        "case SET_MEMOIZED_IS_INITIALIZED: {\n"
-        "  return null;\n"
-        "}\n");
-  }
-
   printer->Outdent();
+
   printer->Print(
     "  }\n"
     "  throw new UnsupportedOperationException();\n"
@@ -480,17 +434,6 @@
     "}\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());
-  }
   printer->Print(
       "public static $classname$ getDefaultInstance() {\n"
       "  return DEFAULT_INSTANCE;\n"
@@ -498,17 +441,6 @@
       "\n",
       "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
-  // 'of' method for Wrappers
-  if (IsWrappersProtoFile(descriptor_->file())) {
-    printer->Print(
-        "public static $classname$ of($field_type$ value) {\n"
-        "  return newBuilder().setValue(value).build();\n"
-        "}\n"
-        "\n",
-        "classname", name_resolver_->GetImmutableClassName(descriptor_),
-        "field_type", PrimitiveTypeName(GetJavaType(descriptor_->field(0))));
-  }
-
   GenerateParser(printer);
 
   // Extensions must be declared after the DEFAULT_INSTANCE is initialized
@@ -523,7 +455,6 @@
   printer->Print("}\n\n");
 }
 
-
 // ===================================================================
 
 void ImmutableMessageLiteGenerator::
@@ -531,7 +462,7 @@
   google::protobuf::scoped_array<const FieldDescriptor * > sorted_fields(
       SortFieldsByNumber(descriptor_));
 
-  std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
+  vector<const Descriptor::ExtensionRange*> sorted_extensions;
   for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
     sorted_extensions.push_back(descriptor_->extension_range(i));
   }
@@ -545,34 +476,36 @@
   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");
+    // 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_));
+        "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_));
+        "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();) {
+       i < descriptor_->field_count() || j < sorted_extensions.size();
+       ) {
     if (i == descriptor_->field_count()) {
       GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
     } else if (j == sorted_extensions.size()) {
@@ -584,23 +517,21 @@
     }
   }
 
-  if (descriptor_->options().message_set_wire_format()) {
-    printer->Print("unknownFields.writeAsMessageSetTo(output);\n");
-  } else {
-    printer->Print("unknownFields.writeTo(output);\n");
+  if (PreserveUnknownFields(descriptor_)) {
+    printer->Print(
+      "unknownFields.writeTo(output);\n");
   }
 
   printer->Outdent();
   printer->Print(
-      "}\n"
-      "\n"
-      "public int getSerializedSize() {\n"
-      "  int size = memoizedSerializedSize;\n"
-      "  if (size != -1) return size;\n"
-      "\n");
+    "}\n"
+    "\n"
+    "public int getSerializedSize() {\n"
+    "  int size = memoizedSerializedSize;\n"
+    "  if (size != -1) return size;\n"
+    "\n"
+    "  size = 0;\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);
@@ -608,24 +539,23 @@
 
   if (descriptor_->extension_range_count() > 0) {
     if (descriptor_->options().message_set_wire_format()) {
-      printer->Print("size += extensionsSerializedSizeAsMessageSet();\n");
+      printer->Print(
+        "size += extensionsSerializedSizeAsMessageSet();\n");
     } else {
-      printer->Print("size += extensionsSerializedSize();\n");
+      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");
+  if (PreserveUnknownFields(descriptor_)) {
+    printer->Print(
+      "size += unknownFields.getSerializedSize();\n");
   }
 
-  printer->Print(
-      "memoizedSerializedSize = size;\n"
-      "return size;\n");
-
   printer->Outdent();
   printer->Print(
+    "  memoizedSerializedSize = size;\n"
+    "  return size;\n"
     "}\n"
     "\n");
 }
@@ -637,19 +567,6 @@
   //   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"
@@ -730,10 +647,10 @@
 void ImmutableMessageLiteGenerator::GenerateBuilder(io::Printer* printer) {
   printer->Print(
     "public static Builder newBuilder() {\n"
-    "  return (Builder) DEFAULT_INSTANCE.createBuilder();\n"
+    "  return DEFAULT_INSTANCE.toBuilder();\n"
     "}\n"
     "public static Builder newBuilder($classname$ prototype) {\n"
-    "  return (Builder) DEFAULT_INSTANCE.createBuilder(prototype);\n"
+    "  return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);\n"
     "}\n"
     "\n",
     "classname", name_resolver_->GetImmutableClassName(descriptor_));
@@ -752,10 +669,7 @@
     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.
+  // Don't directly compare to -1 to avoid an Android x86 JIT bug.
   printer->Print(
     "byte isInitialized = memoizedIsInitialized;\n"
     "if (isInitialized == 1) return DEFAULT_INSTANCE;\n"
@@ -773,6 +687,9 @@
     if (field->is_required()) {
       printer->Print(
         "if (!has$name$()) {\n"
+        "  if (shouldMemoize) {\n"
+        "    memoizedIsInitialized = 0;\n"
+        "  }\n"
         "  return null;\n"
         "}\n",
         "name", info->capitalized_name);
@@ -789,6 +706,9 @@
         case FieldDescriptor::LABEL_REQUIRED:
           printer->Print(
             "if (!get$name$().isInitialized()) {\n"
+            "  if (shouldMemoize) {\n"
+            "    memoizedIsInitialized = 0;\n"
+            "  }\n"
             "  return null;\n"
             "}\n",
             "type", name_resolver_->GetImmutableClassName(
@@ -812,6 +732,9 @@
           }
           printer->Print(
             "  if (!get$name$().isInitialized()) {\n"
+            "    if (shouldMemoize) {\n"
+            "      memoizedIsInitialized = 0;\n"
+            "    }\n"
             "    return null;\n"
             "  }\n"
             "}\n",
@@ -820,8 +743,11 @@
         case FieldDescriptor::LABEL_REPEATED:
           if (IsMapEntry(field->message_type())) {
             printer->Print(
-              "for ($type$ item : get$name$Map().values()) {\n"
+              "for ($type$ item : get$name$().values()) {\n"
               "  if (!item.isInitialized()) {\n"
+              "    if (shouldMemoize) {\n"
+              "      memoizedIsInitialized = 0;\n"
+              "    }\n"
               "    return null;\n"
               "  }\n"
               "}\n",
@@ -832,6 +758,9 @@
             printer->Print(
               "for (int i = 0; i < get$name$Count(); i++) {\n"
               "  if (!get$name$(i).isInitialized()) {\n"
+              "    if (shouldMemoize) {\n"
+              "      memoizedIsInitialized = 0;\n"
+              "    }\n"
               "    return null;\n"
               "  }\n"
               "}\n",
@@ -847,11 +776,17 @@
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
       "if (!extensionsAreInitialized()) {\n"
+      "  if (shouldMemoize) {\n"
+      "    memoizedIsInitialized = 0;\n"
+      "  }\n"
       "  return null;\n"
       "}\n");
   }
 
   printer->Print(
+    "if (shouldMemoize) memoizedIsInitialized = 1;\n");
+
+  printer->Print(
     "return DEFAULT_INSTANCE;\n"
     "\n");
 }
@@ -979,108 +914,98 @@
       "    (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();
-  if (EnableExperimentalRuntime(context_)) {
-    printer->Print(
-        "mergeFromInternal(input, extensionRegistry);\n"
-        "return DEFAULT_INSTANCE;\n");
-  } else {
-    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(
+    "boolean done = false;\n"
+    "while (!done) {\n");
+  printer->Indent();
 
-    printer->Print(
-        "case 0:\n"  // zero signals EOF / limit reached
-        "  done = true;\n"
-        "  break;\n");
+  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");
+
+  if (PreserveUnknownFields(descriptor_)) {
     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");
-      }
+      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");
+        "default: {\n"
+        "  if (!parseUnknownField(tag, input)) {\n"
+        "    done = true;\n"  // it's an endgroup tag
+        "  }\n"
+        "  break;\n"
+        "}\n");
     }
+  } else {
+    printer->Print(
+      "default: {\n"
+      "  if (!input.skipField(tag)) {\n"
+      "    done = true;\n"  // it's an endgroup tag
+      "  }\n"
+      "  break;\n"
+      "}\n");
+  }
 
-    google::protobuf::scoped_array<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()));
+  google::protobuf::scoped_array<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",
-                     SimpleItoa(static_cast<int32>(tag)));
+    printer->Print(
+      "case $tag$: {\n",
+      "tag", SimpleItoa(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", SimpleItoa(packed_tag));
       printer->Indent();
 
-      field_generators_.get(field).GenerateParsingCode(printer);
+      field_generators_.get(field).GenerateParsingCodeFromPacked(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",
-                       SimpleItoa(static_cast<int32>(packed_tag)));
-        printer->Indent();
-
-        field_generators_.get(field).GenerateParsingCodeFromPacked(printer);
-
-        printer->Outdent();
-        printer->Print(
-            "  break;\n"
-            "}\n");
-      }
     }
-
-    printer->Outdent();
-    printer->Outdent();
-    printer->Print(
-        "  }\n"  // switch (tag)
-        "}\n");  // while (!done)
   }
 
   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"
@@ -1098,6 +1023,21 @@
 
 // ===================================================================
 
+namespace {
+bool CheckHasBitsForEqualsAndHashCode(const FieldDescriptor* field) {
+  if (field->is_repeated()) {
+    return false;
+  }
+  if (SupportFieldPresence(field->file())) {
+    return true;
+  }
+  return GetJavaType(field) == JAVATYPE_MESSAGE &&
+      field->containing_oneof() == NULL;
+}
+}  // namespace
+
+// ===================================================================
+
 void ImmutableMessageLiteGenerator::
 GenerateExtensionRegistrationCode(io::Printer* printer) {
   for (int i = 0; i < descriptor_->extension_count(); i++) {
diff --git a/src/google/protobuf/compiler/java/java_message_lite.h b/src/google/protobuf/compiler/java/java_message_lite.h
index 1e319c6..292c1c5 100644
--- a/src/google/protobuf/compiler/java/java_message_lite.h
+++ b/src/google/protobuf/compiler/java/java_message_lite.h
@@ -47,7 +47,8 @@
 
 class ImmutableMessageLiteGenerator : public MessageGenerator {
  public:
-  ImmutableMessageLiteGenerator(const Descriptor* descriptor, Context* context);
+  explicit ImmutableMessageLiteGenerator(const Descriptor* descriptor,
+                                     Context* context);
   virtual ~ImmutableMessageLiteGenerator();
 
   virtual void Generate(io::Printer* printer);
diff --git a/src/google/protobuf/compiler/java/java_name_resolver.cc b/src/google/protobuf/compiler/java/java_name_resolver.cc
index 1673b4e..bffe4f1 100644
--- a/src/google/protobuf/compiler/java/java_name_resolver.cc
+++ b/src/google/protobuf/compiler/java/java_name_resolver.cc
@@ -33,7 +33,6 @@
 #include <map>
 #include <string>
 
-
 #include <google/protobuf/compiler/java/java_helpers.h>
 #include <google/protobuf/stubs/substitute.h>
 
diff --git a/src/google/protobuf/compiler/java/java_name_resolver.h b/src/google/protobuf/compiler/java/java_name_resolver.h
index 28b049d..570d8d8 100644
--- a/src/google/protobuf/compiler/java/java_name_resolver.h
+++ b/src/google/protobuf/compiler/java/java_name_resolver.h
@@ -112,7 +112,7 @@
       const FileDescriptor* file,
       bool immutable);
   // Caches the result to provide better performance.
-  std::map<const FileDescriptor*, string> file_immutable_outer_class_names_;
+  map<const FileDescriptor*, string> file_immutable_outer_class_names_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ClassNameResolver);
 };
diff --git a/src/google/protobuf/compiler/java/java_options.h b/src/google/protobuf/compiler/java/java_options.h
deleted file mode 100644
index e4e7d5e..0000000
--- a/src/google/protobuf/compiler/java/java_options.h
+++ /dev/null
@@ -1,73 +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.
-
-#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_OPTIONS_H__
-#define GOOGLE_PROTOBUF_COMPILER_JAVA_OPTIONS_H__
-
-#include <string>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace java {
-
-// Generator options
-struct Options {
-  Options()
-      : generate_immutable_code(false),
-        generate_mutable_code(false),
-        generate_shared_code(false),
-        enforce_lite(false),
-        annotate_code(false) {
-  }
-
-  bool generate_immutable_code;
-  bool generate_mutable_code;
-  bool generate_shared_code;
-  // When set, the protoc will generate the current files and all the transitive
-  // dependencies as lite runtime.
-  bool enforce_lite;
-  // If true, we should build .meta files and emit @Generated annotations into
-  // generated code.
-  bool annotate_code;
-  // Name of a file where we will write a list of generated .meta file names,
-  // one per line.
-  std::string annotation_list_file;
-  // Name of a file where we will write a list of generated file names, one
-  // per line.
-  std::string output_list_file;
-};
-
-}  // namespace java
-}  // namespace compiler
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_OPTIONS_H__
diff --git a/src/google/protobuf/compiler/java/java_primitive_field.cc b/src/google/protobuf/compiler/java/java_primitive_field.cc
index 074a6be..e42ec28 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field.cc
+++ b/src/google/protobuf/compiler/java/java_primitive_field.cc
@@ -61,7 +61,7 @@
                            int builderBitIndex,
                            const FieldGeneratorInfo* info,
                            ClassNameResolver* name_resolver,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor));
@@ -75,8 +75,7 @@
       "" : ("= " + ImmutableDefaultValue(descriptor, name_resolver));
   (*variables)["capitalized_type"] =
       GetCapitalizedType(descriptor, /* immutable = */ true);
-  (*variables)["tag"] =
-      SimpleItoa(static_cast<int32>(WireFormat::MakeTag(descriptor)));
+  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
   (*variables)["tag_size"] = SimpleItoa(
       WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
   if (IsReferenceType(GetJavaType(descriptor))) {
@@ -190,18 +189,16 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+    "$deprecation$public $type$ get$capitalized_name$() {\n"
     "  return $name$_;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutablePrimitiveFieldGenerator::
@@ -212,35 +209,31 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$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"
+    "$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"
+    "$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"
+    "$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
@@ -447,21 +440,19 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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"
+    "$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_);
 }
 
 
@@ -470,36 +461,33 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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"
+    "$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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  if ($has_oneof_case_message$) {\n"
     "    $clear_oneof_case_message$;\n"
     "    $oneof_name$_ = null;\n"
@@ -507,7 +495,6 @@
     "  }\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutablePrimitiveOneofFieldGenerator::
@@ -535,17 +522,8 @@
 GenerateSerializationCode(io::Printer* printer) const {
   printer->Print(variables_,
     "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");
-  } else {
-    printer->Print(variables_,
-      "      $number$, ($type$)(($boxed_type$) $oneof_name$_));\n");
-  }
-  printer->Print(
+    "  output.write$capitalized_type$(\n"
+    "      $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"
     "}\n");
 }
 
@@ -554,17 +532,8 @@
   printer->Print(variables_,
     "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");
-  } else {
-    printer->Print(variables_,
-      "        $number$, ($type$)(($boxed_type$) $oneof_name$_));\n");
-  }
-  printer->Print(
+    "    .compute$capitalized_type$Size(\n"
+    "        $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"
     "}\n");
 }
 
@@ -616,22 +585,19 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\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"
+    "$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"
+    "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
     "  return $name$_.get(index);\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 
   if (descriptor_->is_packed() &&
       context_->HasGeneratedMethods(descriptor_->containing_type())) {
@@ -669,25 +635,22 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
+    "    get$capitalized_name$List() {\n"
     "  return java.util.Collections.unmodifiableList($name$_);\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+    "$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"
+    "$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 Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    int index, $type$ value) {\n"
     "$null_check$"
     "  ensure$capitalized_name$IsMutable();\n"
@@ -695,20 +658,18 @@
     "  $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"
+    "$deprecation$public Builder add$capitalized_name$($type$ 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 ${$addAll$capitalized_name$$}$(\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"
@@ -716,16 +677,14 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$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::
@@ -818,8 +777,8 @@
     // 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"
+      "  output.writeRawVarint32($tag$);\n"
+      "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
       "}\n"
       "for (int i = 0; i < $name$_.size(); i++) {\n"
       "  output.write$capitalized_type$NoTag($name$_.get(i));\n"
diff --git a/src/google/protobuf/compiler/java/java_primitive_field.h b/src/google/protobuf/compiler/java/java_primitive_field.h
index 7ac9bbf..d0cd12d 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field.h
+++ b/src/google/protobuf/compiler/java/java_primitive_field.h
@@ -82,7 +82,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -143,7 +143,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
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 f929317..690dad1 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_primitive_field_lite.cc
@@ -61,24 +61,24 @@
                            int builderBitIndex,
                            const FieldGeneratorInfo* info,
                            ClassNameResolver* name_resolver,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
-  JavaType javaType = GetJavaType(descriptor);
-  (*variables)["type"] = PrimitiveTypeName(javaType);
-  (*variables)["boxed_type"] = BoxedPrimitiveTypeName(javaType);
+
+  (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor));
+  (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor));
   (*variables)["field_type"] = (*variables)["type"];
   (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
+  (*variables)["default_init"] = IsDefaultValueJavaDefault(descriptor) ?
+      "" : ("= " + ImmutableDefaultValue(descriptor, name_resolver));
   (*variables)["capitalized_type"] =
       GetCapitalizedType(descriptor, /* immutable = */ true);
-  (*variables)["tag"] =
-      SimpleItoa(static_cast<int32>(WireFormat::MakeTag(descriptor)));
+  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
   (*variables)["tag_size"] = SimpleItoa(
       WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
-  (*variables)["required"] = descriptor->is_required() ? "true" : "false";
 
-  string capitalized_type = UnderscoresToCamelCase(PrimitiveTypeName(javaType),
-                                                   true /* cap_next_letter */);
-  switch (javaType) {
+  string capitalized_type = UnderscoresToCamelCase(PrimitiveTypeName(
+        GetJavaType(descriptor)), true /* cap_next_letter */);
+  switch (GetJavaType(descriptor)) {
     case JAVATYPE_INT:
     case JAVATYPE_LONG:
     case JAVATYPE_FLOAT:
@@ -112,12 +112,7 @@
       (*variables)["visit_type_list"] = "visitList";
   }
 
-  if (javaType == JAVATYPE_BYTES) {
-    (*variables)["bytes_default"] =
-        ToUpper((*variables)["name"]) + "_DEFAULT_VALUE";
-  }
-
-  if (IsReferenceType(javaType)) {
+  if (IsReferenceType(GetJavaType(descriptor))) {
     (*variables)["null_check"] =
         "  if (value == null) {\n"
         "    throw new NullPointerException();\n"
@@ -209,31 +204,22 @@
 
 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.
-    printer->Print(
-        variables_,
-        "private static final $field_type$ $bytes_default$ = $default$;\n");
-  }
   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"
+      "$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"
+    "$deprecation$public $type$ get$capitalized_name$() {\n"
     "  return $name$_;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
@@ -266,36 +252,32 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$deprecation$public boolean has$capitalized_name$() {\n"
       "  return instance.has$capitalized_name$();\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutablePrimitiveFieldLiteGenerator::
@@ -303,14 +285,9 @@
   // noop for primitives
 }
 
-
 void ImmutablePrimitiveFieldLiteGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
-  if (IsByteStringWithCustomDefaultValue(descriptor_)) {
-    printer->Print(variables_, "$name$_ = $bytes_default$;\n");
-  } else if (!IsDefaultValueJavaDefault(descriptor_)) {
-    printer->Print(variables_, "$name$_ = $default$;\n");
-  }
+  printer->Print(variables_, "$name$_ = $default$;\n");
 }
 
 void ImmutablePrimitiveFieldLiteGenerator::
@@ -488,21 +465,19 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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"
+    "$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_,
@@ -528,36 +503,32 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$deprecation$public boolean has$capitalized_name$() {\n"
       "  return instance.has$capitalized_name$();\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutablePrimitiveOneofFieldLiteGenerator::
@@ -646,24 +617,21 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\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"
+    "$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"
+    "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
     "  return $repeated_get$(index);\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 
-  if (descriptor_->is_packed() &&
+  if (descriptor_->options().packed() &&
       context_->HasGeneratedMethods(descriptor_->containing_type())) {
     printer->Print(variables_,
       "private int $name$MemoizedSerializedSize = -1;\n");
@@ -712,57 +680,50 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\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_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\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_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\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"
+    "$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"
+    "$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"
+    "$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"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  copyOnWrite();\n"
     "  instance.clear$capitalized_name$();\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void RepeatedImmutablePrimitiveFieldLiteGenerator::
@@ -770,7 +731,6 @@
   // noop for primitives
 }
 
-
 void RepeatedImmutablePrimitiveFieldLiteGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $empty_list$;\n");
@@ -851,14 +811,14 @@
 
 void RepeatedImmutablePrimitiveFieldLiteGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
-  if (descriptor_->is_packed()) {
+  if (descriptor_->options().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"
+      "  output.writeRawVarint32($tag$);\n"
+      "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
       "}\n"
       "for (int i = 0; i < $name$_.size(); i++) {\n"
       "  output.write$capitalized_type$NoTag($repeated_get$(i));\n"
@@ -892,7 +852,7 @@
   printer->Print(
       "size += dataSize;\n");
 
-  if (descriptor_->is_packed()) {
+  if (descriptor_->options().packed()) {
     printer->Print(variables_,
       "if (!get$capitalized_name$List().isEmpty()) {\n"
       "  size += $tag_size$;\n"
@@ -905,7 +865,7 @@
   }
 
   // cache the data size for packed fields.
-  if (descriptor_->is_packed()) {
+  if (descriptor_->options().packed()) {
     printer->Print(variables_,
       "$name$MemoizedSerializedSize = dataSize;\n");
   }
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 93416f0..6cfbbb9 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_primitive_field_lite.h
@@ -80,12 +80,11 @@
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
 
-
   string GetBoxedType() const;
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -111,7 +110,6 @@
   void GenerateSerializationCode(io::Printer* printer) const;
   void GenerateSerializedSizeCode(io::Printer* printer) const;
 
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveOneofFieldLiteGenerator);
 };
@@ -144,12 +142,11 @@
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
 
-
   string GetBoxedType() const;
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
diff --git a/src/google/protobuf/compiler/java/java_service.cc b/src/google/protobuf/compiler/java/java_service.cc
index 988e194..11bfc12 100644
--- a/src/google/protobuf/compiler/java/java_service.cc
+++ b/src/google/protobuf/compiler/java/java_service.cc
@@ -60,10 +60,9 @@
 ImmutableServiceGenerator::~ImmutableServiceGenerator() {}
 
 void ImmutableServiceGenerator::Generate(io::Printer* printer) {
-  bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true);
+  bool is_own_file =
+    MultipleJavaFiles(descriptor_->file(), /* immutable = */ true);
   WriteServiceDocComment(printer, descriptor_);
-  MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
-                                /* immutable = */ true);
   printer->Print(
     "public $static$ abstract class $classname$\n"
     "    implements com.google.protobuf.Service {\n",
@@ -184,10 +183,6 @@
   }
 }
 
-string ImmutableServiceGenerator::GetOutput(const MethodDescriptor* method) {
-  return name_resolver_->GetImmutableClassName(method->output_type());
-}
-
 void ImmutableServiceGenerator::GenerateCallMethod(io::Printer* printer) {
   printer->Print(
     "\n"
@@ -208,12 +203,13 @@
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["index"] = SimpleItoa(i);
     vars["method"] = UnderscoresToCamelCase(method);
     vars["input"] = name_resolver_->GetImmutableClassName(
         method->input_type());
-    vars["output"] = GetOutput(method);
+    vars["output"] = name_resolver_->GetImmutableClassName(
+        method->output_type());
     printer->Print(vars,
       "case $index$:\n"
       "  this.$method$(controller, ($input$)request,\n"
@@ -255,12 +251,13 @@
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["index"] = SimpleItoa(i);
     vars["method"] = UnderscoresToCamelCase(method);
     vars["input"] = name_resolver_->GetImmutableClassName(
         method->input_type());
-    vars["output"] = GetOutput(method);
+    vars["output"] = name_resolver_->GetImmutableClassName(
+        method->output_type());
     printer->Print(vars,
       "case $index$:\n"
       "  return impl.$method$(controller, ($input$)request);\n");
@@ -301,7 +298,7 @@
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["index"] = SimpleItoa(i);
     vars["type"] = name_resolver_->GetImmutableClassName(
       (which == REQUEST) ? method->input_type() : method->output_type());
@@ -353,9 +350,10 @@
     printer->Print(" {\n");
     printer->Indent();
 
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["index"] = SimpleItoa(i);
-    vars["output"] = GetOutput(method);
+    vars["output"] = name_resolver_->GetImmutableClassName(
+        method->output_type());
     printer->Print(vars,
       "channel.callMethod(\n"
       "  getDescriptor().getMethods().get($index$),\n"
@@ -417,9 +415,10 @@
     printer->Print(" {\n");
     printer->Indent();
 
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["index"] = SimpleItoa(i);
-    vars["output"] = GetOutput(method);
+    vars["output"] = name_resolver_->GetImmutableClassName(
+        method->output_type());
     printer->Print(vars,
       "return ($output$) channel.callBlockingMethod(\n"
       "  getDescriptor().getMethods().get($index$),\n"
@@ -440,10 +439,10 @@
 void ImmutableServiceGenerator::GenerateMethodSignature(io::Printer* printer,
                                                const MethodDescriptor* method,
                                                IsAbstract is_abstract) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["name"] = UnderscoresToCamelCase(method);
   vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
-  vars["output"] = GetOutput(method);
+  vars["output"] = name_resolver_->GetImmutableClassName(method->output_type());
   vars["abstract"] = (is_abstract == IS_ABSTRACT) ? "abstract" : "";
   printer->Print(vars,
     "public $abstract$ void $name$(\n"
@@ -455,10 +454,10 @@
 void ImmutableServiceGenerator::GenerateBlockingMethodSignature(
     io::Printer* printer,
     const MethodDescriptor* method) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["method"] = UnderscoresToCamelCase(method);
   vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
-  vars["output"] = GetOutput(method);
+  vars["output"] = name_resolver_->GetImmutableClassName(method->output_type());
   printer->Print(vars,
     "\n"
     "public $output$ $method$(\n"
diff --git a/src/google/protobuf/compiler/java/java_service.h b/src/google/protobuf/compiler/java/java_service.h
index 12b3f94..6707e82 100644
--- a/src/google/protobuf/compiler/java/java_service.h
+++ b/src/google/protobuf/compiler/java/java_service.h
@@ -74,8 +74,8 @@
 
 class ImmutableServiceGenerator : public ServiceGenerator {
  public:
-  ImmutableServiceGenerator(const ServiceDescriptor* descriptor,
-                            Context* context);
+  explicit ImmutableServiceGenerator(const ServiceDescriptor* descriptor,
+                                     Context* context);
   virtual ~ImmutableServiceGenerator();
 
   virtual void Generate(io::Printer* printer);
@@ -122,9 +122,6 @@
   void GenerateBlockingMethodSignature(io::Printer* printer,
                                        const MethodDescriptor* method);
 
-  // Return the output type of the method.
-  string GetOutput(const MethodDescriptor* method);
-
   Context* context_;
   ClassNameResolver* name_resolver_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableServiceGenerator);
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 9a42aba..b5b503a 100644
--- a/src/google/protobuf/compiler/java/java_shared_code_generator.cc
+++ b/src/google/protobuf/compiler/java/java_shared_code_generator.cc
@@ -51,53 +51,44 @@
 namespace compiler {
 namespace java {
 
-SharedCodeGenerator::SharedCodeGenerator(const FileDescriptor* file,
-                                         const Options& options)
-    : name_resolver_(new ClassNameResolver), file_(file), options_(options) {}
+SharedCodeGenerator::SharedCodeGenerator(const FileDescriptor* file)
+    : name_resolver_(new ClassNameResolver),
+      enforce_lite_(false),
+      file_(file) {}
 
 SharedCodeGenerator::~SharedCodeGenerator() {
 }
 
 void SharedCodeGenerator::Generate(GeneratorContext* context,
-                                   std::vector<string>* file_list,
-                                   std::vector<string>* annotation_file_list) {
+                                   vector<string>* file_list) {
   string java_package = FileJavaPackage(file_);
   string package_dir = JavaPackageToDir(java_package);
 
-  if (HasDescriptorMethods(file_, options_.enforce_lite)) {
+  if (HasDescriptorMethods(file_, enforce_lite_)) {
     // Generate descriptors.
     string classname = name_resolver_->GetDescriptorClassName(file_);
     string filename = package_dir + classname + ".java";
     file_list->push_back(filename);
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
-    GeneratedCodeInfo annotations;
-    io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
-        &annotations);
-    google::protobuf::scoped_ptr<io::Printer> printer(
-        new io::Printer(output.get(), '$',
-                        options_.annotate_code ? &annotation_collector : NULL));
-    string info_relative_path = classname + ".java.pb.meta";
-    string info_full_path = filename + ".pb.meta";
+    google::protobuf::scoped_ptr<io::Printer> printer(new io::Printer(output.get(), '$'));
+
     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);
     }
-    PrintGeneratedAnnotation(printer.get(), '$',
-                             options_.annotate_code ? info_relative_path : "");
     printer->Print(
-        "public final class $classname$ {\n"
-        "  public static com.google.protobuf.Descriptors.FileDescriptor\n"
-        "      descriptor;\n"
-        "  static {\n",
-        "classname", classname);
-    printer->Annotate("classname", file_->name());
+      "public final class $classname$ {\n"
+      "  public static com.google.protobuf.Descriptors.FileDescriptor\n"
+      "      descriptor;\n"
+      "  static {\n",
+      "classname", classname);
     printer->Indent();
     printer->Indent();
     GenerateDescriptors(printer.get());
@@ -107,18 +98,12 @@
       "  }\n"
       "}\n");
 
-    if (options_.annotate_code) {
-      google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> info_output(
-          context->Open(info_full_path));
-      annotations.SerializeToZeroCopyStream(info_output.get());
-      annotation_file_list->push_back(info_full_path);
-    }
-
     printer.reset();
     output.reset();
   }
 }
 
+
 void SharedCodeGenerator::GenerateDescriptors(io::Printer* printer) {
   // Embed the descriptor.  We simply serialize the entire FileDescriptorProto
   // and embed it as a string literal, which is parsed and built into real
@@ -133,6 +118,7 @@
   FileDescriptorProto file_proto;
   file_->CopyTo(&file_proto);
 
+
   string file_data;
   file_proto.SerializeToString(&file_data);
 
@@ -140,16 +126,13 @@
     "java.lang.String[] descriptorData = {\n");
   printer->Indent();
 
-  // Limit the number of bytes per line.
+  // Only write 40 bytes per line.
   static const int kBytesPerLine = 40;
-  // Limit the number of lines per string part.
-  static const int kLinesPerPart = 400;
-  // Every block of bytes, start a new string literal, in order to avoid the
-  // 64k length limit. Note that this value needs to be <64k.
-  static const int kBytesPerPart = kBytesPerLine * kLinesPerPart;
   for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
     if (i > 0) {
-      if (i % kBytesPerPart == 0) {
+      // Every 400 lines, start a new string literal, in order to avoid the
+      // 64k length limit.
+      if (i % 400 == 0) {
         printer->Print(",\n");
       } else {
         printer->Print(" +\n");
@@ -182,19 +165,17 @@
 
   // -----------------------------------------------------------------
   // Find out all dependencies.
-  std::vector<std::pair<string, string> > dependencies;
+  vector<pair<string, string> > dependencies;
   for (int i = 0; i < file_->dependency_count(); i++) {
-    string filename = file_->dependency(i)->name();
-    string package = FileJavaPackage(file_->dependency(i));
-    string classname = name_resolver_->GetDescriptorClassName(
-        file_->dependency(i));
-    string full_name;
-    if (package.empty()) {
-      full_name = classname;
-    } else {
-      full_name = package + "." + classname;
+    if (ShouldIncludeDependency(file_->dependency(i))) {
+      string filename = file_->dependency(i)->name();
+      string classname = FileJavaPackage(file_->dependency(i));
+      if (!classname.empty()) {
+        classname += ".";
+      }
+      classname += name_resolver_->GetDescriptorClassName(file_->dependency(i));
+      dependencies.push_back(std::make_pair(filename, classname));
     }
-    dependencies.push_back(std::make_pair(filename, full_name));
   }
 
   // -----------------------------------------------------------------
@@ -216,6 +197,11 @@
     "    }, assigner);\n");
 }
 
+bool SharedCodeGenerator::ShouldIncludeDependency(
+    const FileDescriptor* descriptor) {
+  return true;
+}
+
 }  // namespace java
 }  // namespace compiler
 }  // namespace protobuf
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 4050227..3b573c0 100644
--- a/src/google/protobuf/compiler/java/java_shared_code_generator.h
+++ b/src/google/protobuf/compiler/java/java_shared_code_generator.h
@@ -43,7 +43,6 @@
 #include <vector>
 
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/java_options.h>
 
 namespace google {
 namespace protobuf {
@@ -67,19 +66,27 @@
 // and mutable API. Currently only descriptors are shared.
 class SharedCodeGenerator {
  public:
-  SharedCodeGenerator(const FileDescriptor* file, const Options& options);
+  explicit SharedCodeGenerator(const FileDescriptor* file);
   ~SharedCodeGenerator();
 
   void Generate(GeneratorContext* generator_context,
-                std::vector<string>* file_list,
-                std::vector<string>* annotation_file_list);
+                vector<string>* file_list);
+
+  void SetEnforceLite(bool value) {
+    enforce_lite_ = value;
+  }
 
   void GenerateDescriptors(io::Printer* printer);
 
  private:
+  // Returns whether the dependency should be included in the output file.
+  // Always returns true for opensource, but used internally at Google to help
+  // improve compatibility with version 1 of protocol buffers.
+  bool ShouldIncludeDependency(const FileDescriptor* descriptor);
+
   google::protobuf::scoped_ptr<ClassNameResolver> name_resolver_;
+  bool enforce_lite_;
   const FileDescriptor* file_;
-  const Options options_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SharedCodeGenerator);
 };
 
diff --git a/src/google/protobuf/compiler/java/java_string_field.cc b/src/google/protobuf/compiler/java/java_string_field.cc
index 2b6e938..b67eeb5 100644
--- a/src/google/protobuf/compiler/java/java_string_field.cc
+++ b/src/google/protobuf/compiler/java/java_string_field.cc
@@ -62,7 +62,7 @@
                            int builderBitIndex,
                            const FieldGeneratorInfo* info,
                            ClassNameResolver* name_resolver,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["empty_list"] = "com.google.protobuf.LazyStringArrayList.EMPTY";
@@ -71,8 +71,7 @@
   (*variables)["default_init"] =
       "= " + ImmutableDefaultValue(descriptor, name_resolver);
   (*variables)["capitalized_type"] = "String";
-  (*variables)["tag"] =
-      SimpleItoa(static_cast<int32>(WireFormat::MakeTag(descriptor)));
+  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
   (*variables)["tag_size"] = SimpleItoa(
       WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
   (*variables)["null_check"] =
@@ -80,11 +79,9 @@
       "    throw new NullPointerException();\n"
       "  }\n";
   (*variables)["writeString"] =
-      "com.google.protobuf.GeneratedMessage" + GeneratedCodeVersionSuffix() +
-      ".writeString";
+      "com.google.protobuf.GeneratedMessage.writeString";
   (*variables)["computeStringSize"] =
-      "com.google.protobuf.GeneratedMessage" + GeneratedCodeVersionSuffix() +
-      ".computeStringSize";
+      "com.google.protobuf.GeneratedMessage.computeStringSize";
 
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
@@ -217,15 +214,14 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+    "$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"
@@ -233,7 +229,6 @@
     "    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");
@@ -250,7 +245,7 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\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"
@@ -262,7 +257,6 @@
     "    return (com.google.protobuf.ByteString) ref;\n"
     "  }\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableStringFieldGenerator::
@@ -272,21 +266,19 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$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"
+    "$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");
@@ -306,7 +298,7 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
+    "    get$capitalized_name$Bytes() {\n"
     "  java.lang.Object ref = $name$_;\n"
     "  if (ref instanceof String) {\n"
     "    com.google.protobuf.ByteString b = \n"
@@ -318,11 +310,10 @@
     "    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"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    java.lang.String value) {\n"
     "$null_check$"
     "  $set_has_field_bit_builder$\n"
@@ -330,12 +321,10 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$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_,
@@ -347,10 +336,9 @@
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
+    "$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");
@@ -491,15 +479,14 @@
   if (SupportFieldPresence(descriptor_->file())) {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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 java.lang.String ${$get$capitalized_name$$}$() {\n"
+    "$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"
@@ -510,7 +497,6 @@
     "    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"
@@ -530,7 +516,7 @@
 
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
+    "    get$capitalized_name$Bytes() {\n"
     "  java.lang.Object ref $default_init$;\n"
     "  if ($has_oneof_case_message$) {\n"
     "    ref = $oneof_name$_;\n"
@@ -547,7 +533,6 @@
     "    return (com.google.protobuf.ByteString) ref;\n"
     "  }\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void ImmutableStringOneofFieldGenerator::
@@ -555,15 +540,14 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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 java.lang.String ${$get$capitalized_name$$}$() {\n"
+    "$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"
@@ -573,7 +557,6 @@
     "        (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");
@@ -594,7 +577,7 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
+    "    get$capitalized_name$Bytes() {\n"
     "  java.lang.Object ref $default_init$;\n"
     "  if ($has_oneof_case_message$) {\n"
     "    ref = $oneof_name$_;\n"
@@ -611,11 +594,10 @@
     "    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"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    java.lang.String value) {\n"
     "$null_check$"
     "  $set_oneof_case_message$;\n"
@@ -623,10 +605,9 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$deprecation$public Builder clear$capitalized_name$() {\n"
     "  if ($has_oneof_case_message$) {\n"
     "    $clear_oneof_case_message$;\n"
     "    $oneof_name$_ = null;\n"
@@ -634,14 +615,12 @@
     "  }\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
+    "$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");
@@ -733,13 +712,7 @@
 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"
+    "$deprecation$com.google.protobuf.ProtocolStringList\n"
     "    get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
@@ -762,30 +735,25 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ProtocolStringList\n"
-    "    ${$get$capitalized_name$List$}$() {\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"
+    "$deprecation$public int get$capitalized_name$Count() {\n"
     "  return $name$_.size();\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\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 com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
+    "    get$capitalized_name$Bytes(int index) {\n"
     "  return $name$_.getByteString(index);\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 }
 
 void RepeatedImmutableStringFieldGenerator::
@@ -817,33 +785,28 @@
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ProtocolStringList\n"
-    "    ${$get$capitalized_name$List$}$() {\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"
+    "$deprecation$public int get$capitalized_name$Count() {\n"
     "  return $name$_.size();\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\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 com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\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 Builder ${$set$capitalized_name$$}$(\n"
+    "$deprecation$public Builder set$capitalized_name$(\n"
     "    int index, java.lang.String value) {\n"
     "$null_check$"
     "  ensure$capitalized_name$IsMutable();\n"
@@ -851,10 +814,9 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+    "$deprecation$public Builder add$capitalized_name$(\n"
     "    java.lang.String value) {\n"
     "$null_check$"
     "  ensure$capitalized_name$IsMutable();\n"
@@ -862,10 +824,9 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\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"
@@ -873,23 +834,20 @@
     "  $on_changed$\n"
     "  return this;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+    "$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"
+    "$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");
diff --git a/src/google/protobuf/compiler/java/java_string_field.h b/src/google/protobuf/compiler/java/java_string_field.h
index 0f7c705..a3b5735 100644
--- a/src/google/protobuf/compiler/java/java_string_field.h
+++ b/src/google/protobuf/compiler/java/java_string_field.h
@@ -83,7 +83,7 @@
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -142,7 +142,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
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 adda307..0b92c02 100644
--- a/src/google/protobuf/compiler/java/java_string_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_string_field_lite.cc
@@ -62,7 +62,7 @@
                            int builderBitIndex,
                            const FieldGeneratorInfo* info,
                            ClassNameResolver* name_resolver,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   SetCommonFieldVariables(descriptor, info, variables);
 
   (*variables)["empty_list"] =
@@ -71,9 +71,8 @@
   (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
   (*variables)["default_init"] =
       "= " + ImmutableDefaultValue(descriptor, name_resolver);
-  (*variables)["capitalized_type"] = "java.lang.String";
-  (*variables)["tag"] =
-      SimpleItoa(static_cast<int32>(WireFormat::MakeTag(descriptor)));
+  (*variables)["capitalized_type"] = "String";
+  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
   (*variables)["tag_size"] = SimpleItoa(
       WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
   (*variables)["null_check"] =
@@ -85,7 +84,6 @@
   // by the proto compiler
   (*variables)["deprecation"] = descriptor->options().deprecated()
       ? "@java.lang.Deprecated " : "";
-  (*variables)["required"] = descriptor->is_required() ? "true" : "false";
 
   if (SupportFieldPresence(descriptor->file())) {
     // For singular messages and builders, one bit is used for the hasField bit.
@@ -192,25 +190,22 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+    "$deprecation$public java.lang.String get$capitalized_name$() {\n"
     "  return $name$_;\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
+    "    get$capitalized_name$Bytes() {\n"
     "  return com.google.protobuf.ByteString.copyFromUtf8($name$_);\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
@@ -249,54 +244,48 @@
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$deprecation$public boolean has$capitalized_name$() {\n"
       "  return instance.has$capitalized_name$();\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\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_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\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"
+    "$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"
+    "$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"
+    "$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::
@@ -304,7 +293,6 @@
   // noop for strings
 }
 
-
 void ImmutableStringFieldLiteGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $default$;\n");
@@ -333,7 +321,7 @@
 GenerateParsingCode(io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n"
+      "String s = input.readStringRequireUtf8();\n"
       "$set_has_field_bit_message$\n"
       "$name$_ = s;\n");
   } else {
@@ -342,7 +330,7 @@
     // spurious intermediary ByteString allocations, cutting overall allocations
     // in half.
     printer->Print(variables_,
-      "java.lang.String s = input.readString();\n"
+      "String s = input.readString();\n"
       "$set_has_field_bit_message$\n"
       "$name$_ = s;\n");
   }
@@ -419,60 +407,54 @@
   if (SupportFieldPresence(descriptor_->file())) {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\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 java.lang.String ${$get$capitalized_name$$}$() {\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_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\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"
+    "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"
+    "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"
+    "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");
@@ -483,60 +465,53 @@
     "}\n");
 }
 
-
 void ImmutableStringOneofFieldLiteGenerator::
 GenerateBuilderMembers(io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+      "$deprecation$public boolean has$capitalized_name$() {\n"
       "  return instance.has$capitalized_name$();\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\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_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\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"
+    "$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"
+    "$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"
+    "$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::
@@ -550,7 +525,7 @@
 GenerateParsingCode(io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n"
+      "String s = input.readStringRequireUtf8();\n"
       "$set_oneof_case_message$;\n"
       "$oneof_name$_ = s;\n");
   } else {
@@ -559,7 +534,7 @@
     // spurious intermediary ByteString allocations, cutting overall allocations
     // in half.
     printer->Print(variables_,
-      "java.lang.String s = input.readString();\n"
+      "String s = input.readString();\n"
       "$set_oneof_case_message$;\n"
       "$oneof_name$_ = s;\n");
   }
@@ -618,7 +593,7 @@
 GenerateInterfaceMembers(io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<java.lang.String>\n"
+    "$deprecation$java.util.List<String>\n"
     "    get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
@@ -636,37 +611,30 @@
 void RepeatedImmutableStringFieldLiteGenerator::
 GenerateMembers(io::Printer* printer) const {
   printer->Print(variables_,
-    "private com.google.protobuf.Internal.ProtobufList<java.lang.String> "
-    "$name$_;\n");
+    "private com.google.protobuf.Internal.ProtobufList<String> $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<java.lang.String> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"  // note:  unmodifiable list
+    "$deprecation$public java.util.List<String> 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"
+    "$deprecation$public int get$capitalized_name$Count() {\n"
     "  return $name$_.size();\n"
     "}\n");
-  printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\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 com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\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"
@@ -725,77 +693,67 @@
 GenerateBuilderMembers(io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<java.lang.String>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
+    "$deprecation$public java.util.List<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_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\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_,
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\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_,
     "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\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_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\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 ${$add$capitalized_name$$}$(\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 ${$addAll$capitalized_name$$}$(\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 ${$clear$capitalized_name$$}$() {\n"
+    "$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"
+    "$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::
@@ -803,7 +761,6 @@
   // noop for strings
 }
 
-
 void RepeatedImmutableStringFieldLiteGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $empty_list$;\n");
@@ -825,14 +782,14 @@
 GenerateParsingCode(io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n");
+    "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");
+    "String s = input.readString();\n");
   }
   printer->Print(variables_,
     "if (!$is_mutable$) {\n"
@@ -906,7 +863,7 @@
 }
 
 string RepeatedImmutableStringFieldLiteGenerator::GetBoxedType() const {
-  return "java.lang.String";
+  return "String";
 }
 
 }  // namespace java
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 b7fb640..4148aa4 100644
--- a/src/google/protobuf/compiler/java/java_string_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_string_field_lite.h
@@ -78,12 +78,11 @@
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
 
-
   string GetBoxedType() const;
 
  protected:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
@@ -109,7 +108,6 @@
   void GenerateSerializationCode(io::Printer* printer) const;
   void GenerateSerializedSizeCode(io::Printer* printer) const;
 
-
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringOneofFieldLiteGenerator);
 };
 
@@ -138,12 +136,11 @@
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
 
-
   string GetBoxedType() const;
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   const int messageBitIndex_;
   const int builderBitIndex_;
   Context* context_;
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_enum.cc b/src/google/protobuf/compiler/javamicro/javamicro_enum.cc
index eb37af7..d74a149 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_enum.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_enum.cc
@@ -32,6 +32,7 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
+#include <map>
 #include <string>
 
 #include <google/protobuf/compiler/javamicro/javamicro_params.h>
@@ -69,17 +70,21 @@
 void EnumGenerator::Generate(io::Printer* printer) {
   printer->Print("// enum $classname$\n", "classname", descriptor_->name());
   for (int i = 0; i < canonical_values_.size(); i++) {
-    printer->Print("public static final int $name$ = $canonical_value$;\n",
-      "name", canonical_values_[i]->name(),
-      "canonical_value", SimpleItoa(canonical_values_[i]->number()));
+    map<string, string> vars;
+    vars["name"] = canonical_values_[i]->name();
+    vars["canonical_value"] = SimpleItoa(canonical_values_[i]->number());
+    printer->Print(vars,
+      "public static final int $name$ = $canonical_value$;\n");
   }
 
   // -----------------------------------------------------------------
 
   for (int i = 0; i < aliases_.size(); i++) {
-    printer->Print("public static final int $name$ = $canonical_name$;\n",
-      "name", aliases_[i].value->name(),
-      "canonical_name", aliases_[i].canonical_value->name());
+    map<string, string> vars;
+    vars["name"] = aliases_[i].value->name();
+    vars["canonical_name"] = aliases_[i].canonical_value->name();
+    printer->Print(vars,
+      "public static final int $name$ = $canonical_name$;\n");
   }
 
   printer->Print("\n");
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_enum.h b/src/google/protobuf/compiler/javamicro/javamicro_enum.h
index 3f8532a..9cf226f 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_enum.h
+++ b/src/google/protobuf/compiler/javamicro/javamicro_enum.h
@@ -68,13 +68,13 @@
   // considered equivalent.  We treat the first defined constant for any
   // given numeric value as "canonical" and the rest as aliases of that
   // canonical value.
-  std::vector<const EnumValueDescriptor*> canonical_values_;
+  vector<const EnumValueDescriptor*> canonical_values_;
 
   struct Alias {
     const EnumValueDescriptor* value;
     const EnumValueDescriptor* canonical_value;
   };
-  std::vector<Alias> aliases_;
+  vector<Alias> aliases_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator);
 };
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_enum_field.cc b/src/google/protobuf/compiler/javamicro/javamicro_enum_field.cc
index e3bf485..0ff49a3 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_enum_field.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_enum_field.cc
@@ -52,7 +52,7 @@
 // TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
 //   repeat code between this and the other field types.
 void SetEnumVariables(const Params& params,
-    const FieldDescriptor* descriptor, std::map<string, string>* variables) {
+    const FieldDescriptor* descriptor, map<string, string>* variables) {
   (*variables)["name"] =
     UnderscoresToCamelCase(descriptor);
   (*variables)["capitalized_name"] =
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_enum_field.h b/src/google/protobuf/compiler/javamicro/javamicro_enum_field.h
index 8e7b906..ab671c1 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_enum_field.h
+++ b/src/google/protobuf/compiler/javamicro/javamicro_enum_field.h
@@ -60,7 +60,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator);
 };
@@ -81,7 +81,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_file.cc b/src/google/protobuf/compiler/javamicro/javamicro_file.cc
index 6b5a631..43bf012 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_file.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_file.cc
@@ -58,7 +58,7 @@
   // We conservatively assume that unknown fields are extensions.
   if (reflection->GetUnknownFields(message).field_count() > 0) return true;
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message, &fields);
 
   for (int i = 0; i < fields.size(); i++) {
@@ -118,12 +118,12 @@
   if (!params_.has_java_outer_classname(file_->name())
       && file_->message_type_count() == 1
       && file_->enum_type_count() == 0 && file_->extension_count() == 0) {
-    std::cout << "INFO: " << file_->name() << ":" << std::endl;
-    std::cout << "Javamicro generator has changed to align with java generator. "
+    cout << "INFO: " << file_->name() << ":" << endl;
+    cout << "Javamicro generator has changed to align with java generator. "
         "An outer class will be created for this file and the single message "
         "in the file will become a nested class. Use java_multiple_files to "
         "skip generating the outer class, or set an explicit "
-        "java_outer_classname to suppress this message." << std::endl;
+        "java_outer_classname to suppress this message." << endl;
   }
 
   // Check that no class name matches the file's class name.  This is a common
@@ -197,7 +197,7 @@
                             const string& java_package,
                             const DescriptorClass* descriptor,
                             OutputDirectory* output_directory,
-                            std::vector<string>* file_list,
+                            vector<string>* file_list,
                             const Params& params) {
   string filename = package_dir + descriptor->name() + ".java";
   file_list->push_back(filename);
@@ -221,7 +221,7 @@
 
 void FileGenerator::GenerateSiblings(const string& package_dir,
                                      OutputDirectory* output_directory,
-                                     std::vector<string>* file_list) {
+                                     vector<string>* file_list) {
   if (params_.java_multiple_files(file_->name())) {
     for (int i = 0; i < file_->message_type_count(); i++) {
       GenerateSibling<MessageGenerator>(package_dir, java_package_,
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_file.h b/src/google/protobuf/compiler/javamicro/javamicro_file.h
index 3aa0010..1804abf 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_file.h
+++ b/src/google/protobuf/compiler/javamicro/javamicro_file.h
@@ -70,7 +70,7 @@
   // service type).
   void GenerateSiblings(const string& package_dir,
                         OutputDirectory* output_directory,
-                        std::vector<string>* file_list);
+                        vector<string>* file_list);
 
   const string& java_package() { return java_package_; }
   const string& classname()    { return classname_;    }
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_generator.cc b/src/google/protobuf/compiler/javamicro/javamicro_generator.cc
index b7331fb..1b74509 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_generator.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_generator.cc
@@ -76,7 +76,7 @@
                              const string& parameter,
                              OutputDirectory* output_directory,
                              string* error) const {
-  std::vector<std::pair<string, string> > options;
+  vector<pair<string, string> > options;
 
 //  GOOGLE_LOG(INFO) << "wink: JavaMicroGenerator::Generate INFO";
 //  GOOGLE_LOG(WARNING) << "wink: JavaMicroGenerator::Generate WARNING";
@@ -113,7 +113,7 @@
         return false;
       }
     } else if (options[i].first == "java_package") {
-        std::vector<string> parts;
+        vector<string> parts;
         SplitStringUsing(options[i].second, "|", &parts);
         if (parts.size() != 2) {
           *error = "Bad java_package, expecting filename|PackageName found '"
@@ -122,7 +122,7 @@
         }
         params.set_java_package(parts[0], parts[1]);
     } else if (options[i].first == "java_outer_classname") {
-        std::vector<string> parts;
+        vector<string> parts;
         SplitStringUsing(options[i].second, "|", &parts);
         if (parts.size() != 2) {
           *error = "Bad java_outer_classname, "
@@ -171,7 +171,7 @@
     StringReplace(file_generator.java_package(), ".", "/", true);
   if (!package_dir.empty()) package_dir += "/";
 
-  std::vector<string> all_files;
+  vector<string> all_files;
 
   if (IsOuterClassNeeded(params, file)) {
     string java_filename = package_dir;
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_helpers.cc b/src/google/protobuf/compiler/javamicro/javamicro_helpers.cc
index 07a5ae0..f6ce653 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_helpers.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_helpers.cc
@@ -287,10 +287,10 @@
       return SimpleItoa(static_cast<int64>(field->default_value_uint64())) +
              "L";
     case FieldDescriptor::CPPTYPE_DOUBLE: {
-      double value = field->default_value_double();
-      if (value == std::numeric_limits<double>::infinity()) {
+     double value = field->default_value_double();
+      if (value == numeric_limits<double>::infinity()) {
         return "Double.POSITIVE_INFINITY";
-      } else if (value == -std::numeric_limits<double>::infinity()) {
+      } else if (value == -numeric_limits<double>::infinity()) {
         return "Double.NEGATIVE_INFINITY";
       } else if (value != value) {
         return "Double.NaN";
@@ -300,9 +300,9 @@
     }
     case FieldDescriptor::CPPTYPE_FLOAT: {
       float value = field->default_value_float();
-      if (value == std::numeric_limits<float>::infinity()) {
+      if (value == numeric_limits<float>::infinity()) {
         return "Float.POSITIVE_INFINITY";
-      } else if (value == -std::numeric_limits<float>::infinity()) {
+      } else if (value == -numeric_limits<float>::infinity()) {
         return "Float.NEGATIVE_INFINITY";
       } else if (value != value) {
         return "Float.NaN";
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_message.cc b/src/google/protobuf/compiler/javamicro/javamicro_message.cc
index ea5bd99..cf48b3c 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_message.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_message.cc
@@ -76,7 +76,7 @@
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields[i] = descriptor->field(i);
   }
-  std::sort(fields, fields + descriptor->field_count(),
+  sort(fields, fields + descriptor->field_count(),
        FieldOrderingByNumber());
   return fields;
 }
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_message_field.cc b/src/google/protobuf/compiler/javamicro/javamicro_message_field.cc
index dbfdba5..103c302 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_message_field.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_message_field.cc
@@ -51,7 +51,7 @@
 // TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
 //   repeat code between this and the other field types.
 void SetMessageVariables(const Params& params,
-    const FieldDescriptor* descriptor, std::map<string, string>* variables) {
+    const FieldDescriptor* descriptor, map<string, string>* variables) {
   (*variables)["name"] =
     UnderscoresToCamelCase(descriptor);
   (*variables)["capitalized_name"] =
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_message_field.h b/src/google/protobuf/compiler/javamicro/javamicro_message_field.h
index 1c73a27..a32aa4e 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_message_field.h
+++ b/src/google/protobuf/compiler/javamicro/javamicro_message_field.h
@@ -60,7 +60,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);
 };
@@ -82,7 +82,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_params.h b/src/google/protobuf/compiler/javamicro/javamicro_params.h
index 16c4864..7e47a00 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_params.h
+++ b/src/google/protobuf/compiler/javamicro/javamicro_params.h
@@ -48,8 +48,8 @@
 // Parameters for used by the generators
 class Params {
  public:
-  typedef std::map<string, string> NameMap;
-  typedef std::set<string> NameSet;
+  typedef map<string, string> NameMap;
+  typedef set<string> NameSet;
  private:
   string empty_;
   string base_name_;
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc b/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc
index b5f95ac..70f5ac8 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc
+++ b/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc
@@ -182,7 +182,7 @@
 }
 
 void SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params params,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   (*variables)["name"] =
     UnderscoresToCamelCase(descriptor);
   (*variables)["capitalized_name"] =
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.h b/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.h
index cc9d9b4..88d8eec 100644
--- a/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.h
+++ b/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.h
@@ -60,7 +60,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);
 };
@@ -81,7 +81,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc
index eeecceb..39a4eeb 100644
--- a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc
@@ -52,7 +52,7 @@
 // TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
 //   repeat code between this and the other field types.
 void SetEnumVariables(const Params& params,
-    const FieldDescriptor* descriptor, std::map<string, string>* variables) {
+    const FieldDescriptor* descriptor, map<string, string>* variables) {
   (*variables)["name"] =
     RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
   (*variables)["capitalized_name"] =
diff --git a/src/google/protobuf/compiler/javanano/javanano_enum_field.h b/src/google/protobuf/compiler/javanano/javanano_enum_field.h
index 1be25d1..b94790d 100644
--- a/src/google/protobuf/compiler/javanano/javanano_enum_field.h
+++ b/src/google/protobuf/compiler/javanano/javanano_enum_field.h
@@ -62,7 +62,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   vector<string> canonical_values_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator);
@@ -85,7 +85,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   vector<string> canonical_values_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AccessorEnumFieldGenerator);
@@ -112,7 +112,7 @@
   void GenerateRepeatedDataSizeCode(io::Printer* printer) const;
 
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
   vector<string> canonical_values_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator);
diff --git a/src/google/protobuf/compiler/javanano/javanano_extension.cc b/src/google/protobuf/compiler/javanano/javanano_extension.cc
index 4c61f91..0b9d1d8 100644
--- a/src/google/protobuf/compiler/javanano/javanano_extension.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_extension.cc
@@ -78,7 +78,7 @@
 }  // namespace
 
 void SetVariables(const FieldDescriptor* descriptor, const Params params,
-                  std::map<string, string>* variables) {
+                  map<string, string>* variables) {
   (*variables)["extends"] = ClassName(params, descriptor->containing_type());
   (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
   bool repeated = descriptor->is_repeated();
diff --git a/src/google/protobuf/compiler/javanano/javanano_extension.h b/src/google/protobuf/compiler/javanano/javanano_extension.h
index f4e9eb2..4843e29 100644
--- a/src/google/protobuf/compiler/javanano/javanano_extension.h
+++ b/src/google/protobuf/compiler/javanano/javanano_extension.h
@@ -61,7 +61,7 @@
  private:
   const Params& params_;
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator);
 };
diff --git a/src/google/protobuf/compiler/javanano/javanano_field.cc b/src/google/protobuf/compiler/javanano/javanano_field.cc
index e31d117..85257f3 100644
--- a/src/google/protobuf/compiler/javanano/javanano_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_field.cc
@@ -151,7 +151,7 @@
 }
 
 void SetCommonOneofVariables(const FieldDescriptor* descriptor,
-                             std::map<string, string>* variables) {
+                             map<string, string>* variables) {
   (*variables)["oneof_name"] =
       UnderscoresToCamelCase(descriptor->containing_oneof());
   (*variables)["oneof_capitalized_name"] =
@@ -169,7 +169,7 @@
 }
 
 void GenerateOneofFieldEquals(const FieldDescriptor* descriptor,
-                              const std::map<string, string>& variables,
+                              const map<string, string>& variables,
                               io::Printer* printer) {
   if (GetJavaType(descriptor) == JAVATYPE_BYTES) {
     printer->Print(variables,
@@ -190,7 +190,7 @@
 }
 
 void GenerateOneofFieldHashCode(const FieldDescriptor* descriptor,
-                                const std::map<string, string>& variables,
+                                const map<string, string>& variables,
                                 io::Printer* printer) {
   if (GetJavaType(descriptor) == JAVATYPE_BYTES) {
     printer->Print(variables,
diff --git a/src/google/protobuf/compiler/javanano/javanano_field.h b/src/google/protobuf/compiler/javanano/javanano_field.h
index 347c888..57c221f 100644
--- a/src/google/protobuf/compiler/javanano/javanano_field.h
+++ b/src/google/protobuf/compiler/javanano/javanano_field.h
@@ -114,12 +114,12 @@
 };
 
 void SetCommonOneofVariables(const FieldDescriptor* descriptor,
-                             std::map<string, string>* variables);
+                             map<string, string>* variables);
 void GenerateOneofFieldEquals(const FieldDescriptor* descriptor,
-                              const std::map<string, string>& variables,
+                              const map<string, string>& variables,
                               io::Printer* printer);
 void GenerateOneofFieldHashCode(const FieldDescriptor* descriptor,
-                                const std::map<string, string>& variables,
+                                const map<string, string>& variables,
                                 io::Printer* printer);
 
 }  // namespace javanano
diff --git a/src/google/protobuf/compiler/javanano/javanano_file.cc b/src/google/protobuf/compiler/javanano/javanano_file.cc
index 17f7386..3676ab9 100644
--- a/src/google/protobuf/compiler/javanano/javanano_file.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_file.cc
@@ -120,12 +120,12 @@
   if (!params_.has_java_outer_classname(file_->name())
       && file_->message_type_count() == 1
       && file_->enum_type_count() == 0 && file_->extension_count() == 0) {
-    std::cout << "INFO: " << file_->name() << ":" << std::endl;
-    std::cout << "Javanano generator has changed to align with java generator. "
+    cout << "INFO: " << file_->name() << ":" << endl;
+    cout << "Javanano generator has changed to align with java generator. "
         "An outer class will be created for this file and the single message "
         "in the file will become a nested class. Use java_multiple_files to "
         "skip generating the outer class, or set an explicit "
-        "java_outer_classname to suppress this message." << std::endl;
+        "java_outer_classname to suppress this message." << endl;
   }
 
   // Check that no class name matches the file's class name.  This is a common
diff --git a/src/google/protobuf/compiler/javanano/javanano_helpers.cc b/src/google/protobuf/compiler/javanano/javanano_helpers.cc
index 1927ba1..02811a2 100644
--- a/src/google/protobuf/compiler/javanano/javanano_helpers.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_helpers.cc
@@ -428,9 +428,9 @@
              "L";
     case FieldDescriptor::CPPTYPE_DOUBLE: {
       double value = field->default_value_double();
-      if (value == std::numeric_limits<double>::infinity()) {
+      if (value == numeric_limits<double>::infinity()) {
         return "Double.POSITIVE_INFINITY";
-      } else if (value == -std::numeric_limits<double>::infinity()) {
+      } else if (value == -numeric_limits<double>::infinity()) {
         return "Double.NEGATIVE_INFINITY";
       } else if (value != value) {
         return "Double.NaN";
@@ -440,9 +440,9 @@
     }
     case FieldDescriptor::CPPTYPE_FLOAT: {
       float value = field->default_value_float();
-      if (value == std::numeric_limits<float>::infinity()) {
+      if (value == numeric_limits<float>::infinity()) {
         return "Float.POSITIVE_INFINITY";
-      } else if (value == -std::numeric_limits<float>::infinity()) {
+      } else if (value == -numeric_limits<float>::infinity()) {
         return "Float.NEGATIVE_INFINITY";
       } else if (value != value) {
         return "Float.NaN";
@@ -567,7 +567,7 @@
 }
 
 void SetBitOperationVariables(const string name,
-    int bitIndex, std::map<string, string>* variables) {
+    int bitIndex, map<string, string>* variables) {
   (*variables)["get_" + name] = GenerateGetBit(bitIndex);
   (*variables)["set_" + name] = GenerateSetBit(bitIndex);
   (*variables)["clear_" + name] = GenerateClearBit(bitIndex);
diff --git a/src/google/protobuf/compiler/javanano/javanano_helpers.h b/src/google/protobuf/compiler/javanano/javanano_helpers.h
index 04b2d63..014c85a 100644
--- a/src/google/protobuf/compiler/javanano/javanano_helpers.h
+++ b/src/google/protobuf/compiler/javanano/javanano_helpers.h
@@ -181,7 +181,7 @@
 // the given name of the bit, to the appropriate Java expressions for the given
 // bit index.
 void SetBitOperationVariables(const string name,
-    int bitIndex, std::map<string, string>* variables);
+    int bitIndex, map<string, string>* variables);
 
 inline bool IsMapEntry(const Descriptor* descriptor) {
   // TODO(liujisi): Add an option to turn on maps for proto2 syntax as well.
diff --git a/src/google/protobuf/compiler/javanano/javanano_map_field.cc b/src/google/protobuf/compiler/javanano/javanano_map_field.cc
index a4ab885..83b2b0c 100644
--- a/src/google/protobuf/compiler/javanano/javanano_map_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_map_field.cc
@@ -84,7 +84,7 @@
 }
 
 void SetMapVariables(const Params& params,
-    const FieldDescriptor* descriptor, std::map<string, string>* variables) {
+    const FieldDescriptor* descriptor, map<string, string>* variables) {
   const FieldDescriptor* key = KeyField(descriptor);
   const FieldDescriptor* value = ValueField(descriptor);
   (*variables)["name"] =
diff --git a/src/google/protobuf/compiler/javanano/javanano_map_field.h b/src/google/protobuf/compiler/javanano/javanano_map_field.h
index 81e5915..c01bde3 100644
--- a/src/google/protobuf/compiler/javanano/javanano_map_field.h
+++ b/src/google/protobuf/compiler/javanano/javanano_map_field.h
@@ -58,7 +58,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/javanano/javanano_message.cc b/src/google/protobuf/compiler/javanano/javanano_message.cc
index 7842188..a41da5a 100644
--- a/src/google/protobuf/compiler/javanano/javanano_message.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_message.cc
@@ -69,7 +69,7 @@
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields[i] = descriptor->field(i);
   }
-  std::sort(fields, fields + descriptor->field_count(),
+  sort(fields, fields + descriptor->field_count(),
        FieldOrderingByNumber());
   return fields;
 }
@@ -182,7 +182,7 @@
   }
 
   // oneof
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["message_name"] = descriptor_->name();
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     const OneofDescriptor* oneof_desc = descriptor_->oneof_decl(i);
diff --git a/src/google/protobuf/compiler/javanano/javanano_message_field.cc b/src/google/protobuf/compiler/javanano/javanano_message_field.cc
index 2ed8a3a..d1d04b5 100644
--- a/src/google/protobuf/compiler/javanano/javanano_message_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_message_field.cc
@@ -54,7 +54,7 @@
 // TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
 //   repeat code between this and the other field types.
 void SetMessageVariables(const Params& params,
-    const FieldDescriptor* descriptor, std::map<string, string>* variables) {
+    const FieldDescriptor* descriptor, map<string, string>* variables) {
   (*variables)["name"] =
     RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
   (*variables)["capitalized_name"] =
diff --git a/src/google/protobuf/compiler/javanano/javanano_message_field.h b/src/google/protobuf/compiler/javanano/javanano_message_field.h
index 0ae8879..e074735 100644
--- a/src/google/protobuf/compiler/javanano/javanano_message_field.h
+++ b/src/google/protobuf/compiler/javanano/javanano_message_field.h
@@ -62,7 +62,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);
 };
@@ -85,7 +85,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator);
 };
@@ -108,7 +108,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/javanano/javanano_params.h b/src/google/protobuf/compiler/javanano/javanano_params.h
index 8006470..482c6c2 100644
--- a/src/google/protobuf/compiler/javanano/javanano_params.h
+++ b/src/google/protobuf/compiler/javanano/javanano_params.h
@@ -47,8 +47,8 @@
 // Parameters for used by the generators
 class Params {
  public:
-  typedef std::map<string, string> NameMap;
-  typedef std::set<string> NameSet;
+  typedef map<string, string> NameMap;
+  typedef set<string> NameSet;
  private:
   string empty_;
   string base_name_;
diff --git a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
index 496f8b2..0935945 100644
--- a/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
@@ -166,7 +166,7 @@
 
 
 void SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params params,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   (*variables)["name"] =
     RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
   (*variables)["capitalized_name"] =
diff --git a/src/google/protobuf/compiler/javanano/javanano_primitive_field.h b/src/google/protobuf/compiler/javanano/javanano_primitive_field.h
index 3cc80a0..394cb10 100644
--- a/src/google/protobuf/compiler/javanano/javanano_primitive_field.h
+++ b/src/google/protobuf/compiler/javanano/javanano_primitive_field.h
@@ -67,7 +67,7 @@
   void GenerateComputeSizeCode(io::Printer* printer) const;
 
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);
 };
@@ -91,7 +91,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AccessorPrimitiveFieldGenerator);
 };
@@ -113,7 +113,7 @@
 
  private:
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveOneofFieldGenerator);
 };
@@ -139,7 +139,7 @@
   void GenerateRepeatedDataSizeCode(io::Printer* printer) const;
 
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator);
 };
diff --git a/src/google/protobuf/compiler/js/embed.cc b/src/google/protobuf/compiler/js/embed.cc
deleted file mode 100644
index a725b62..0000000
--- a/src/google/protobuf/compiler/js/embed.cc
+++ /dev/null
@@ -1,112 +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.
-
-#include <cassert>
-#include <cstdlib>
-#include <fstream>
-#include <iostream>
-#include <string>
-
-const char output_file[] = "well_known_types_embed.cc";
-
-static bool AsciiIsPrint(unsigned char c) {
-  return c >= 32 && c < 127;
-}
-
-static char ToDecimalDigit(int num) {
-  assert(num < 10);
-  return '0' + num;
-}
-
-static std::string CEscape(const std::string& str) {
-  std::string dest;
-
-  for (size_t i = 0; i < str.size(); ++i) {
-    unsigned char ch = str[i];
-    switch (ch) {
-      case '\n': dest += "\\n"; break;
-      case '\r': dest += "\\r"; break;
-      case '\t': dest += "\\t"; break;
-      case '\"': dest += "\\\""; break;
-      case '\\': dest += "\\\\"; break;
-      default:
-        if (AsciiIsPrint(ch)) {
-          dest += ch;
-        } else {
-          dest += "\\";
-          dest += ToDecimalDigit(ch / 64);
-          dest += ToDecimalDigit((ch % 64) / 8);
-          dest += ToDecimalDigit(ch % 8);
-        }
-        break;
-    }
-  }
-
-  return dest;
-}
-
-static void AddFile(const char* name, std::basic_ostream<char>* out) {
-  std::ifstream in(name);
-
-  if (!in.is_open()) {
-    std::cerr << "Couldn't open input file: " << name << "\n";
-    std::exit(EXIT_FAILURE);
-  }
-
-  // Make canonical name only include the final element.
-  for (const char *p = name; *p; p++) {
-    if (*p == '/') {
-      name = p + 1;
-    }
-  }
-
-  *out << "{\"" << CEscape(name) << "\",\n";
-
-  for (std::string line; std::getline(in, line); ) {
-    *out << "  \"" << CEscape(line) << "\\n\"\n";
-  }
-
-  *out << "},\n";
-}
-
-int main(int argc, char *argv[]) {
-  std::cout << "#include "
-               "\"google/protobuf/compiler/js/well_known_types_embed.h\"\n";
-  std::cout << "struct FileToc well_known_types_js[] = {\n";
-
-  for (int i = 1; i < argc; i++) {
-    AddFile(argv[i], &std::cout);
-  }
-
-  std::cout << "  {NULL, NULL}  // Terminate the list.\n";
-  std::cout << "};\n";
-
-  return EXIT_SUCCESS;
-}
diff --git a/src/google/protobuf/compiler/js/js_generator.cc b/src/google/protobuf/compiler/js/js_generator.cc
index 16fe19a..3de61e8 100755
--- a/src/google/protobuf/compiler/js/js_generator.cc
+++ b/src/google/protobuf/compiler/js/js_generator.cc
@@ -28,7 +28,7 @@
 // (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/compiler/js/js_generator.h>
+#include "google/protobuf/compiler/js/js_generator.h"
 
 #include <assert.h>
 #include <algorithm>
@@ -45,7 +45,6 @@
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/compiler/js/well_known_types_embed.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.pb.h>
@@ -143,37 +142,25 @@
   return false;
 }
 
-bool StrEndsWith(StringPiece sp, StringPiece x) {
-  return sp.size() >= x.size() && sp.substr(sp.size() - x.size()) == x;
-}
-
 // Returns a copy of |filename| with any trailing ".protodevel" or ".proto
 // suffix stripped.
 // TODO(haberman): Unify with copy in compiler/cpp/internal/helpers.cc.
 string StripProto(const string& filename) {
-  const char* suffix =
-      StrEndsWith(filename, ".protodevel") ? ".protodevel" : ".proto";
+  const char* suffix = HasSuffixString(filename, ".protodevel")
+      ? ".protodevel" : ".proto";
   return StripSuffixString(filename, suffix);
 }
 
-// Given a filename like foo/bar/baz.proto, returns the corresponding JavaScript
+// Given a filename like foo/bar/baz.proto, returns the correspoding JavaScript
 // file foo/bar/baz.js.
-string GetJSFilename(const GeneratorOptions& options, const string& filename) {
-  return StripProto(filename) + options.GetFileNameExtension();
+string GetJSFilename(const string& filename) {
+  return StripProto(filename) + "_pb.js";
 }
 
 // Given a filename like foo/bar/baz.proto, returns the root directory
 // path ../../
-string GetRootPath(const string& from_filename, const string& to_filename) {
-  if (to_filename.find("google/protobuf") == 0) {
-    // Well-known types (.proto files in the google/protobuf directory) are
-    // assumed to come from the 'google-protobuf' npm package.  We may want to
-    // generalize this exception later by letting others put generated code in
-    // their own npm packages.
-    return "google-protobuf/";
-  }
-
-  size_t slashes = std::count(from_filename.begin(), from_filename.end(), '/');
+string GetRootPath(const string& filename) {
+  size_t slashes = std::count(filename.begin(), filename.end(), '/');
   if (slashes == 0) {
     return "./";
   }
@@ -197,14 +184,13 @@
   string basename = StripProto(filename);
   StripString(&basename, "-", '$');
   StripString(&basename, "/", '_');
-  StripString(&basename, ".", '_');
   return basename + "_pb";
 }
 
 // Returns the fully normalized JavaScript path for the given
 // file descriptor's package.
-string GetFilePath(const GeneratorOptions& options,
-                   const FileDescriptor* file) {
+string GetPath(const GeneratorOptions& options,
+               const FileDescriptor* file) {
   if (!options.namespace_prefix.empty()) {
     return options.namespace_prefix;
   } else if (!file->package().empty()) {
@@ -214,80 +200,79 @@
   }
 }
 
-// Returns the name of the message with a leading dot and taking into account
-// nesting, for example ".OuterMessage.InnerMessage", or returns empty if
-// descriptor is null. This function does not handle namespacing, only message
-// nesting.
-string GetNestedMessageName(const Descriptor* descriptor) {
-  if (descriptor == NULL) {
-    return "";
-  }
-  string result =
-      StripPrefixString(descriptor->full_name(), descriptor->file()->package());
-  // Add a leading dot if one is not already present.
-  if (!result.empty() && result[0] != '.') {
-    result = "." + result;
-  }
-  return result;
-}
+// Forward declare, so that GetPrefix can call this method,
+// which in turn, calls GetPrefix.
+string GetPath(const GeneratorOptions& options,
+               const Descriptor* descriptor);
 
 // Returns the path prefix for a message or enumeration that
 // lives under the given file and containing type.
 string GetPrefix(const GeneratorOptions& options,
                  const FileDescriptor* file_descriptor,
                  const Descriptor* containing_type) {
-  string prefix = GetFilePath(options, file_descriptor) +
-                  GetNestedMessageName(containing_type);
+  string prefix = "";
+
+  if (containing_type == NULL) {
+    prefix = GetPath(options, file_descriptor);
+  } else {
+    prefix = GetPath(options, containing_type);
+  }
+
   if (!prefix.empty()) {
     prefix += ".";
   }
+
   return prefix;
 }
 
-// Returns the fully normalized JavaScript path prefix for the given
+
+// Returns the fully normalized JavaScript path for the given
 // message descriptor.
-string GetMessagePathPrefix(const GeneratorOptions& options,
-                            const Descriptor* descriptor) {
+string GetPath(const GeneratorOptions& options,
+               const Descriptor* descriptor) {
   return GetPrefix(
       options, descriptor->file(),
-      descriptor->containing_type());
+      descriptor->containing_type()) + descriptor->name();
 }
 
+
 // Returns the fully normalized JavaScript path for the given
-// message descriptor.
-string GetMessagePath(const GeneratorOptions& options,
-                      const Descriptor* descriptor) {
-  return GetMessagePathPrefix(options, descriptor) + descriptor->name();
-}
-
-// Returns the fully normalized JavaScript path prefix for the given
-// enumeration descriptor.
-string GetEnumPathPrefix(const GeneratorOptions& options,
-                   const EnumDescriptor* enum_descriptor) {
-  return GetPrefix(options, enum_descriptor->file(),
-      enum_descriptor->containing_type());
+// field's containing message descriptor.
+string GetPath(const GeneratorOptions& options,
+               const FieldDescriptor* descriptor) {
+  return GetPath(options, descriptor->containing_type());
 }
 
 // Returns the fully normalized JavaScript path for the given
 // enumeration descriptor.
-string GetEnumPath(const GeneratorOptions& options,
-                   const EnumDescriptor* enum_descriptor) {
-  return GetEnumPathPrefix(options, enum_descriptor) + enum_descriptor->name();
+string GetPath(const GeneratorOptions& options,
+               const EnumDescriptor* enum_descriptor) {
+  return GetPrefix(
+      options, enum_descriptor->file(),
+      enum_descriptor->containing_type()) + enum_descriptor->name();
+}
+
+
+// Returns the fully normalized JavaScript path for the given
+// enumeration value descriptor.
+string GetPath(const GeneratorOptions& options,
+               const EnumValueDescriptor* value_descriptor) {
+  return GetPath(
+      options,
+      value_descriptor->type()) + "." + value_descriptor->name();
 }
 
 string MaybeCrossFileRef(const GeneratorOptions& options,
                          const FileDescriptor* from_file,
                          const Descriptor* to_message) {
-  if (options.import_style == GeneratorOptions::kImportCommonJs &&
+  if (options.import_style == GeneratorOptions::IMPORT_COMMONJS &&
       from_file != to_message->file()) {
     // Cross-file ref in CommonJS needs to use the module alias instead of
     // the global name.
-    return ModuleAlias(to_message->file()->name()) +
-           GetNestedMessageName(to_message->containing_type()) + "." +
-           to_message->name();
+    return ModuleAlias(to_message->file()->name()) + "." + to_message->name();
   } else {
     // Within a single file we use a full name.
-    return GetMessagePath(options, to_message);
+    return GetPath(options, to_message);
   }
 }
 
@@ -314,8 +299,8 @@
   }
 }
 
-std::vector<string> ParseLowerUnderscore(const string& input) {
-  std::vector<string> words;
+vector<string> ParseLowerUnderscore(const string& input) {
+  vector<string> words;
   string running = "";
   for (int i = 0; i < input.size(); i++) {
     if (input[i] == '_') {
@@ -333,8 +318,8 @@
   return words;
 }
 
-std::vector<string> ParseUpperCamel(const string& input) {
-  std::vector<string> words;
+vector<string> ParseUpperCamel(const string& input) {
+  vector<string> words;
   string running = "";
   for (int i = 0; i < input.size(); i++) {
     if (input[i] >= 'A' && input[i] <= 'Z' && !running.empty()) {
@@ -349,7 +334,7 @@
   return words;
 }
 
-string ToLowerCamel(const std::vector<string>& words) {
+string ToLowerCamel(const vector<string>& words) {
   string result;
   for (int i = 0; i < words.size(); i++) {
     string word = words[i];
@@ -363,7 +348,7 @@
   return result;
 }
 
-string ToUpperCamel(const std::vector<string>& words) {
+string ToUpperCamel(const vector<string>& words) {
   string result;
   for (int i = 0; i < words.size(); i++) {
     string word = words[i];
@@ -412,24 +397,21 @@
 // that top-level extensions should go in.
 string GetExtensionFileName(const GeneratorOptions& options,
                             const FileDescriptor* file) {
-  return options.output_dir + "/" + ToFileName(GetFilePath(options, file)) +
-         options.GetFileNameExtension();
+  return options.output_dir + "/" + ToFileName(GetPath(options, file)) + ".js";
 }
 
 // When we're generating one output file per type name, this is the filename
 // that a top-level message should go in.
 string GetMessageFileName(const GeneratorOptions& options,
                           const Descriptor* desc) {
-  return options.output_dir + "/" + ToFileName(desc->name()) +
-         options.GetFileNameExtension();
+  return options.output_dir + "/" + ToFileName(desc->name()) + ".js";
 }
 
 // When we're generating one output file per type name, this is the filename
 // that a top-level message should go in.
 string GetEnumFileName(const GeneratorOptions& options,
                        const EnumDescriptor* desc) {
-  return options.output_dir + "/" + ToFileName(desc->name()) +
-         options.GetFileNameExtension();
+  return options.output_dir + "/" + ToFileName(desc->name()) + ".js";
 }
 
 // Returns the message/response ID, if set.
@@ -454,21 +436,6 @@
 }
 
 
-// Used inside Google only -- do not remove.
-bool ShouldTreatMapsAsRepeatedFields(const FileDescriptor& descriptor) {
-  return false;
-}
-
-// Do we ignore this message type?
-bool IgnoreMessage(const GeneratorOptions& options, const Descriptor* d) {
-  return d->options().map_entry() &&
-         !ShouldTreatMapsAsRepeatedFields(*d->file());
-}
-
-bool IsMap(const GeneratorOptions& options, const FieldDescriptor* field) {
-  return field->is_map() && !ShouldTreatMapsAsRepeatedFields(*field->file());
-}
-
 // Does JSPB ignore this entire oneof? True only if all fields are ignored.
 bool IgnoreOneof(const OneofDescriptor* oneof) {
   for (int i = 0; i < oneof->field_count(); i++) {
@@ -479,8 +446,9 @@
   return true;
 }
 
-string JSIdent(const GeneratorOptions& options, const FieldDescriptor* field,
-               bool is_upper_camel, bool is_map, bool drop_list) {
+string JSIdent(const FieldDescriptor* field,
+               bool is_upper_camel,
+               bool is_map) {
   string result;
   if (field->type() == FieldDescriptor::TYPE_GROUP) {
     result = is_upper_camel ?
@@ -491,22 +459,19 @@
         ToUpperCamel(ParseLowerUnderscore(field->name())) :
         ToLowerCamel(ParseLowerUnderscore(field->name()));
   }
-  if (is_map || IsMap(options, field)) {
-    // JSPB-style or proto3-style map.
+  if (is_map) {
     result += "Map";
-  } else if (!drop_list && field->is_repeated()) {
-    // Repeated field.
+  } else if (field->is_repeated()) {
     result += "List";
   }
   return result;
 }
 
-string JSObjectFieldName(const GeneratorOptions& options,
-                         const FieldDescriptor* field) {
-  string name = JSIdent(options, field,
-                        /* is_upper_camel = */ false,
-                        /* is_map = */ false,
-                        /* drop_list = */ false);
+string JSObjectFieldName(const FieldDescriptor* field) {
+  string name = JSIdent(
+      field,
+      /* is_upper_camel = */ false,
+      /* is_map = */ false);
   if (IsReserved(name)) {
     name = "pb_" + name;
   }
@@ -524,18 +489,15 @@
     default:
       assert(false);
   }
-  return "";
 }
 
 // Returns the field name as a capitalized portion of a getter/setter method
 // name, e.g. MyField for .getMyField().
-string JSGetterName(const GeneratorOptions& options,
-                    const FieldDescriptor* field,
-                    BytesMode bytes_mode = BYTES_DEFAULT,
-                    bool drop_list = false) {
-  string name = JSIdent(options, field,
+string JSGetterName(const FieldDescriptor* field,
+                    BytesMode bytes_mode = BYTES_DEFAULT) {
+  string name = JSIdent(field,
                         /* is_upper_camel = */ true,
-                        /* is_map = */ false, drop_list);
+                        /* is_map = */ false);
   if (field->type() == FieldDescriptor::TYPE_BYTES) {
     string suffix = JSByteGetterSuffix(bytes_mode);
     if (!suffix.empty()) {
@@ -549,6 +511,12 @@
   return name;
 }
 
+string JSMapGetterName(const FieldDescriptor* field) {
+  return JSIdent(field,
+                 /* is_upper_camel = */ true,
+                 /* is_map = */ true);
+}
+
 
 
 string JSOneofName(const OneofDescriptor* oneof) {
@@ -774,29 +742,12 @@
   return PostProcessFloat(result);
 }
 
-// Return true if this is an integral field that should be represented as string
-// in JS.
-bool IsIntegralFieldWithStringJSType(const FieldDescriptor* field) {
-  switch (field->cpp_type()) {
-    case FieldDescriptor::CPPTYPE_INT64:
-    case FieldDescriptor::CPPTYPE_UINT64:
-      // The default value of JSType is JS_NORMAL, which behaves the same as
-      // JS_NUMBER.
-      return field->options().jstype() == google::protobuf::FieldOptions::JS_STRING;
-    default:
-      return false;
-  }
-}
-
 string MaybeNumberString(const FieldDescriptor* field, const string& orig) {
-  return IsIntegralFieldWithStringJSType(field) ? ("\"" + orig + "\"") : orig;
+  return orig;
 }
 
 string JSFieldDefault(const FieldDescriptor* field) {
-  if (field->is_repeated()) {
-    return "[]";
-  }
-
+  assert(field->has_default_value());
   switch (field->cpp_type()) {
     case FieldDescriptor::CPPTYPE_INT32:
       return MaybeNumberString(
@@ -877,18 +828,18 @@
     case FieldDescriptor::TYPE_BYTES:
       return "bytes";
     case FieldDescriptor::TYPE_GROUP:
-      return GetMessagePath(options, field->message_type());
+      return GetPath(options, field->message_type());
     case FieldDescriptor::TYPE_ENUM:
-      return GetEnumPath(options, field->enum_type());
+      return GetPath(options, field->enum_type());
     case FieldDescriptor::TYPE_MESSAGE:
-      return GetMessagePath(options, field->message_type());
+      return GetPath(options, field->message_type());
     default:
       return "";
   }
 }
 
 string JSIntegerTypeName(const FieldDescriptor* field) {
-  return IsIntegralFieldWithStringJSType(field) ? "string" : "number";
+  return "number";
 }
 
 string JSStringTypeName(const GeneratorOptions& options,
@@ -930,93 +881,28 @@
     case FieldDescriptor::CPPTYPE_STRING:
       return JSStringTypeName(options, field, bytes_mode);
     case FieldDescriptor::CPPTYPE_ENUM:
-      return GetEnumPath(options, field->enum_type());
+      return GetPath(options, field->enum_type());
     case FieldDescriptor::CPPTYPE_MESSAGE:
-      return GetMessagePath(options, field->message_type());
+      return GetPath(options, field->message_type());
     default:
       return "";
   }
 }
 
-// Used inside Google only -- do not remove.
-bool UseBrokenPresenceSemantics(const GeneratorOptions& options,
-                                const FieldDescriptor* field) {
-  return false;
-}
-
-// Returns true for fields that return "null" from accessors when they are
-// unset.  This should normally only be true for non-repeated submessages, but
-// we have legacy users who relied on old behavior where accessors behaved this
-// way.
-bool ReturnsNullWhenUnset(const GeneratorOptions& options,
-                          const FieldDescriptor* field) {
-  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
-      field->is_optional()) {
-    return true;
-  }
-
-  // TODO(haberman): remove this case and unconditionally return false.
-  return UseBrokenPresenceSemantics(options, field) && !field->is_repeated() &&
-         !field->has_default_value();
-}
-
-// In a sane world, this would be the same as ReturnsNullWhenUnset().  But in
-// the status quo, some fields declare that they never return null/undefined
-// even though they actually do:
-//   * required fields
-//   * optional enum fields
-//   * proto3 primitive fields.
-bool DeclaredReturnTypeIsNullable(const GeneratorOptions& options,
-                                  const FieldDescriptor* field) {
-  if (field->is_required() || field->type() == FieldDescriptor::TYPE_ENUM) {
-    return false;
-  }
-
-  if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
-      field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
-    return false;
-  }
-
-  return ReturnsNullWhenUnset(options, field);
-}
-
-bool SetterAcceptsUndefined(const GeneratorOptions& options,
-                            const FieldDescriptor* field) {
-  if (ReturnsNullWhenUnset(options, field)) {
-    return true;
-  }
-
-  // Broken presence semantics always accepts undefined for setters.
-  return UseBrokenPresenceSemantics(options, field);
-}
-
-bool SetterAcceptsNull(const GeneratorOptions& options,
-                       const FieldDescriptor* field) {
-  if (ReturnsNullWhenUnset(options, field)) {
-    return true;
-  }
-
-  // With broken presence semantics, fields with defaults accept "null" for
-  // setters, but other fields do not.  This is a strange quirk of the old
-  // codegen.
-  return UseBrokenPresenceSemantics(options, field) &&
-         field->has_default_value();
-}
-
-// Returns types which are known to by non-nullable by default.
-// The style guide requires that we omit "!" in this case.
-bool IsPrimitive(const string& type) {
-  return type == "undefined" || type == "string" || type == "number" ||
-         type == "boolean";
-}
+bool HasFieldPresence(const FieldDescriptor* field);
 
 string JSFieldTypeAnnotation(const GeneratorOptions& options,
                              const FieldDescriptor* field,
-                             bool is_setter_argument,
+                             bool force_optional,
                              bool force_present,
                              bool singular_if_not_packed,
                              BytesMode bytes_mode = BYTES_DEFAULT) {
-  GOOGLE_CHECK(!(is_setter_argument && force_present));
+  bool is_primitive =
+      (field->cpp_type() != FieldDescriptor::CPPTYPE_ENUM &&
+       field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE &&
+        (field->type() != FieldDescriptor::TYPE_BYTES ||
+            bytes_mode == BYTES_B64));
+
   string jstype = JSTypeName(options, field, bytes_mode);
 
   if (field->is_repeated() &&
@@ -1025,35 +911,27 @@
         bytes_mode == BYTES_DEFAULT) {
       jstype = "(Array<!Uint8Array>|Array<string>)";
     } else {
-      if (!IsPrimitive(jstype)) {
+      if (!is_primitive) {
         jstype = "!" + jstype;
       }
       jstype = "Array.<" + jstype + ">";
     }
-  }
-
-  bool is_null_or_undefined = false;
-
-  if (is_setter_argument) {
-    if (SetterAcceptsNull(options, field)) {
-      jstype = "?" + jstype;
-      is_null_or_undefined = true;
-    }
-
-    if (SetterAcceptsUndefined(options, field)) {
-      jstype += "|undefined";
-      is_null_or_undefined = true;
-    }
-  } else if (force_present) {
-    // Don't add null or undefined.
-  } else {
-    if (DeclaredReturnTypeIsNullable(options, field)) {
-      jstype = "?" + jstype;
-      is_null_or_undefined = true;
+    if (!force_optional) {
+      jstype = "!" + jstype;
     }
   }
 
-  if (!is_null_or_undefined && !IsPrimitive(jstype)) {
+  if (field->is_optional() && is_primitive &&
+      (!field->has_default_value() || force_optional) && !force_present) {
+    jstype += "?";
+  } else if (field->is_required() && !is_primitive && !force_optional) {
+    jstype = "!" + jstype;
+  }
+
+  if (force_optional && HasFieldPresence(field)) {
+    jstype += "|undefined";
+  }
+  if (force_present && jstype[0] != '!' && !is_primitive) {
     jstype = "!" + jstype;
   }
 
@@ -1065,7 +943,8 @@
   if (name[0] >= 'a' && name[0] <= 'z') {
     name[0] = (name[0] - 'a') + 'A';
   }
-  return IsIntegralFieldWithStringJSType(field) ? (name + "String") : name;
+
+  return name;
 }
 
 string JSBinaryReadWriteMethodName(const FieldDescriptor* field,
@@ -1079,65 +958,26 @@
   return name;
 }
 
-string JSBinaryReaderMethodName(const GeneratorOptions& options,
-                                const FieldDescriptor* field) {
-  return "jspb.BinaryReader.prototype.read" +
-         JSBinaryReadWriteMethodName(field, /* is_writer = */ false);
+string JSBinaryReaderMethodName(const FieldDescriptor* field) {
+  return "read" + JSBinaryReadWriteMethodName(field, /* is_writer = */ false);
 }
 
-string JSBinaryWriterMethodName(const GeneratorOptions& options,
-                                const FieldDescriptor* field) {
-  return "jspb.BinaryWriter.prototype.write" +
-         JSBinaryReadWriteMethodName(field, /* is_writer = */ true);
+string JSBinaryWriterMethodName(const FieldDescriptor* field) {
+  return "write" + JSBinaryReadWriteMethodName(field, /* is_writer = */ true);
 }
 
 string JSReturnClause(const FieldDescriptor* desc) {
   return "";
 }
 
-string JSTypeTag(const FieldDescriptor* desc) {
-  switch (desc->type()) {
-    case FieldDescriptor::TYPE_DOUBLE:
-    case FieldDescriptor::TYPE_FLOAT:
-      return "Float";
-    case FieldDescriptor::TYPE_INT32:
-    case FieldDescriptor::TYPE_UINT32:
-    case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_UINT64:
-    case FieldDescriptor::TYPE_FIXED32:
-    case FieldDescriptor::TYPE_FIXED64:
-    case FieldDescriptor::TYPE_SINT32:
-    case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_SFIXED32:
-    case FieldDescriptor::TYPE_SFIXED64:
-      if (IsIntegralFieldWithStringJSType(desc)) {
-        return "StringInt";
-      } else {
-        return "Int";
-      }
-    case FieldDescriptor::TYPE_BOOL:
-      return "Boolean";
-    case FieldDescriptor::TYPE_STRING:
-      return "String";
-    case FieldDescriptor::TYPE_BYTES:
-      return "Bytes";
-    case FieldDescriptor::TYPE_ENUM:
-      return "Enum";
-    default:
-      assert(false);
-  }
-  return "";
-}
-
 string JSReturnDoc(const GeneratorOptions& options,
                    const FieldDescriptor* desc) {
   return "";
 }
 
-bool HasRepeatedFields(const GeneratorOptions& options,
-                       const Descriptor* desc) {
+bool HasRepeatedFields(const Descriptor* desc) {
   for (int i = 0; i < desc->field_count(); i++) {
-    if (desc->field(i)->is_repeated() && !IsMap(options, desc->field(i))) {
+    if (desc->field(i)->is_repeated()) {
       return true;
     }
   }
@@ -1148,9 +988,8 @@
 
 string RepeatedFieldsArrayName(const GeneratorOptions& options,
                                const Descriptor* desc) {
-  return HasRepeatedFields(options, desc)
-             ? (GetMessagePath(options, desc) + kRepeatedFieldArrayName)
-             : "null";
+  return HasRepeatedFields(desc) ?
+      (GetPath(options, desc) + kRepeatedFieldArrayName) : "null";
 }
 
 bool HasOneofFields(const Descriptor* desc) {
@@ -1166,16 +1005,14 @@
 
 string OneofFieldsArrayName(const GeneratorOptions& options,
                             const Descriptor* desc) {
-  return HasOneofFields(desc)
-             ? (GetMessagePath(options, desc) + kOneofGroupArrayName)
-             : "null";
+  return HasOneofFields(desc) ?
+      (GetPath(options, desc) + kOneofGroupArrayName) : "null";
 }
 
-string RepeatedFieldNumberList(const GeneratorOptions& options,
-                               const Descriptor* desc) {
+string RepeatedFieldNumberList(const Descriptor* desc) {
   std::vector<string> numbers;
   for (int i = 0; i < desc->field_count(); i++) {
-    if (desc->field(i)->is_repeated() && !IsMap(options, desc->field(i))) {
+    if (desc->field(i)->is_repeated()) {
       numbers.push_back(JSFieldIndex(desc->field(i)));
     }
   }
@@ -1239,65 +1076,34 @@
                               const FileDescriptor* from_file,
                               const Descriptor* desc) {
   if (desc->full_name() == "google.protobuf.bridge.MessageSet") {
-    // TODO(haberman): fix this for the kImportCommonJs case.
+    // TODO(haberman): fix this for the IMPORT_COMMONJS case.
     return "jspb.Message.messageSetExtensions";
   } else {
     return MaybeCrossFileRef(options, from_file, desc) + ".extensions";
   }
 }
 
-static const int kMapKeyField = 1;
-static const int kMapValueField = 2;
-
-const FieldDescriptor* MapFieldKey(const FieldDescriptor* field) {
-  assert(field->is_map());
-  return field->message_type()->FindFieldByNumber(kMapKeyField);
-}
-
-const FieldDescriptor* MapFieldValue(const FieldDescriptor* field) {
-  assert(field->is_map());
-  return field->message_type()->FindFieldByNumber(kMapValueField);
-}
-
 string FieldDefinition(const GeneratorOptions& options,
                        const FieldDescriptor* field) {
-  if (IsMap(options, field)) {
-    const FieldDescriptor* key_field = MapFieldKey(field);
-    const FieldDescriptor* value_field = MapFieldValue(field);
-    string key_type = ProtoTypeName(options, key_field);
-    string value_type;
-    if (value_field->type() == FieldDescriptor::TYPE_ENUM ||
-        value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      value_type = RelativeTypeName(value_field);
-    } 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(),
-                        field->number());
+  string qualifier = field->is_repeated() ? "repeated" :
+      (field->is_optional() ? "optional" : "required");
+  string type, name;
+  if (field->type() == FieldDescriptor::TYPE_ENUM ||
+      field->type() == FieldDescriptor::TYPE_MESSAGE) {
+    type = RelativeTypeName(field);
+    name = field->name();
+  } else if (field->type() == FieldDescriptor::TYPE_GROUP) {
+    type = "group";
+    name = field->message_type()->name();
   } else {
-    string qualifier = field->is_repeated() ? "repeated" :
-        (field->is_optional() ? "optional" : "required");
-    string type, name;
-    if (field->type() == FieldDescriptor::TYPE_ENUM ||
-        field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      type = RelativeTypeName(field);
-      name = field->name();
-    } else if (field->type() == FieldDescriptor::TYPE_GROUP) {
-      type = "group";
-      name = field->message_type()->name();
-    } else {
-      type = ProtoTypeName(options, field);
-      name = field->name();
-    }
-    return StringPrintf("%s %s %s = %d;",
-                        qualifier.c_str(),
-                        type.c_str(),
-                        name.c_str(),
-                        field->number());
+    type = ProtoTypeName(options, field);
+    name = field->name();
   }
+  return StringPrintf("%s %s %s = %d;",
+                      qualifier.c_str(),
+                      type.c_str(),
+                      name.c_str(),
+                      field->number());
 }
 
 string FieldComments(const FieldDescriptor* field, BytesMode bytes_mode) {
@@ -1309,6 +1115,13 @@
         " * You should avoid comparisons like {@code val === true/false} in "
         "those cases.\n";
   }
+  if (field->is_repeated()) {
+    comments +=
+        " * If you change this array by adding, removing or replacing "
+        "elements, or if you\n"
+        " * replace the array itself, then you must call the setter to "
+        "update it.\n";
+  }
   if (field->type() == FieldDescriptor::TYPE_BYTES && bytes_mode == BYTES_U8) {
     comments +=
         " * Note that Uint8Array is not supported on all browsers.\n"
@@ -1351,29 +1164,6 @@
   return false;
 }
 
-bool HasMap(const GeneratorOptions& options, const Descriptor* desc) {
-  for (int i = 0; i < desc->field_count(); i++) {
-    if (IsMap(options, desc->field(i))) {
-      return true;
-    }
-  }
-  for (int i = 0; i < desc->nested_type_count(); i++) {
-    if (HasMap(options, desc->nested_type(i))) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool FileHasMap(const GeneratorOptions& options, const FileDescriptor* desc) {
-  for (int i = 0; i < desc->message_type_count(); i++) {
-    if (HasMap(options, desc->message_type(i))) {
-      return true;
-    }
-  }
-  return false;
-}
-
 bool IsExtendable(const Descriptor* desc) {
   return desc->extension_range_count() > 0;
 }
@@ -1381,7 +1171,7 @@
 // Returns the max index in the underlying data storage array beyond which the
 // extension object is used.
 string GetPivot(const Descriptor* desc) {
-  static const int kDefaultPivot = 500;
+  static const int kDefaultPivot = (1 << 29);  // max field number (29 bits)
 
   // Find the max field number
   int max_field_number = 0;
@@ -1393,7 +1183,7 @@
   }
 
   int pivot = -1;
-  if (IsExtendable(desc) || (max_field_number >= kDefaultPivot)) {
+  if (IsExtendable(desc)) {
     pivot = ((max_field_number + 1) < kDefaultPivot) ?
         (max_field_number + 1) : kDefaultPivot;
   }
@@ -1401,24 +1191,43 @@
   return SimpleItoa(pivot);
 }
 
-// Whether this field represents presence.  For fields with presence, we
-// generate extra methods (clearFoo() and hasFoo()) for this field.
-bool HasFieldPresence(const GeneratorOptions& options,
-                      const FieldDescriptor* field) {
-  if (field->is_repeated() || field->is_map()) {
-    // We say repeated fields and maps don't have presence, but we still do
-    // generate clearFoo() methods for them through a special case elsewhere.
-    return false;
-  }
+// Returns true for fields that represent "null" as distinct from the default
+// value. See http://go/proto3#heading=h.kozewqqcqhuz for more information.
+bool HasFieldPresence(const FieldDescriptor* field) {
+  return
+      (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ||
+      (field->containing_oneof() != NULL) ||
+      (field->file()->syntax() != FileDescriptor::SYNTAX_PROTO3);
+}
 
-  if (UseBrokenPresenceSemantics(options, field)) {
-    // Proto3 files with broken presence semantics have field presence.
-    return true;
-  }
+// For proto3 fields without presence, returns a string representing the default
+// value in JavaScript. See http://go/proto3#heading=h.kozewqqcqhuz for more
+// information.
+string Proto3PrimitiveFieldDefault(const FieldDescriptor* field) {
+  switch (field->cpp_type()) {
+    case FieldDescriptor::CPPTYPE_INT32:
+    case FieldDescriptor::CPPTYPE_INT64:
+    case FieldDescriptor::CPPTYPE_UINT32:
+    case FieldDescriptor::CPPTYPE_UINT64: {
+      return "0";
+    }
 
-  return field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||
-         field->containing_oneof() != NULL ||
-         field->file()->syntax() == FileDescriptor::SYNTAX_PROTO2;
+    case FieldDescriptor::CPPTYPE_ENUM:
+    case FieldDescriptor::CPPTYPE_FLOAT:
+    case FieldDescriptor::CPPTYPE_DOUBLE:
+      return "0";
+
+    case FieldDescriptor::CPPTYPE_BOOL:
+      return "false";
+
+    case FieldDescriptor::CPPTYPE_STRING:  // includes BYTES
+      return "\"\"";
+
+    default:
+      // MESSAGE is handled separately.
+      assert(false);
+      return "";
+  }
 }
 
 // We use this to implement the semantics that same file can be generated
@@ -1445,19 +1254,19 @@
     return true;
   }
 
-  void GetAllowedSet(std::set<const void*>* allowed_set) {
+  void GetAllowedSet(set<const void*>* allowed_set) {
     *allowed_set = allowed_descs_;
   }
 
  private:
   bool error_on_conflict_;
-  std::map<string, const void*> descs_by_filename_;
-  std::set<const void*> allowed_descs_;
+  map<string, const void*> descs_by_filename_;
+  set<const void*> allowed_descs_;
 };
 
 void DepthFirstSearch(const FileDescriptor* file,
-                      std::vector<const FileDescriptor*>* list,
-                      std::set<const FileDescriptor*>* seen) {
+                      vector<const FileDescriptor*>* list,
+                      set<const FileDescriptor*>* seen) {
   if (!seen->insert(file).second) {
     return;
   }
@@ -1475,7 +1284,7 @@
 // FileDescriptor is not in the given set.
 class NotInSet {
  public:
-  explicit NotInSet(const std::set<const FileDescriptor*>& file_set)
+  explicit NotInSet(const set<const FileDescriptor*>& file_set)
       : file_set_(file_set) {}
 
   bool operator()(const FileDescriptor* file) {
@@ -1483,21 +1292,21 @@
   }
 
  private:
-  const std::set<const FileDescriptor*>& file_set_;
+  const set<const FileDescriptor*>& file_set_;
 };
 
 // This function generates an ordering of the input FileDescriptors that matches
 // the logic of the old code generator.  The order is significant because two
 // different input files can generate the same output file, and the last one
 // needs to win.
-void GenerateJspbFileOrder(const std::vector<const FileDescriptor*>& input,
-                           std::vector<const FileDescriptor*>* ordered) {
+void GenerateJspbFileOrder(const vector<const FileDescriptor*>& input,
+                           vector<const FileDescriptor*>* ordered) {
   // First generate an ordering of all reachable files (including dependencies)
   // with depth-first search.  This mimics the behavior of --include_imports,
   // which is what the old codegen used.
   ordered->clear();
-  std::set<const FileDescriptor*> seen;
-  std::set<const FileDescriptor*> input_set;
+  set<const FileDescriptor*> seen;
+  set<const FileDescriptor*> input_set;
   for (int i = 0; i < input.size(); i++) {
     DepthFirstSearch(input[i], ordered, &seen);
     input_set.insert(input[i]);
@@ -1514,10 +1323,10 @@
 // only those to generate code.
 
 bool GenerateJspbAllowedSet(const GeneratorOptions& options,
-                            const std::vector<const FileDescriptor*>& files,
-                            std::set<const void*>* allowed_set,
+                            const vector<const FileDescriptor*>& files,
+                            set<const void*>* allowed_set,
                             string* error) {
-  std::vector<const FileDescriptor*> files_ordered;
+  vector<const FileDescriptor*> files_ordered;
   GenerateJspbFileOrder(files, &files_ordered);
 
   // Choose the last descriptor for each filename.
@@ -1565,10 +1374,6 @@
   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"
@@ -1589,7 +1394,7 @@
 
 void Generator::FindProvides(const GeneratorOptions& options,
                              io::Printer* printer,
-                             const std::vector<const FileDescriptor*>& files,
+                             const vector<const FileDescriptor*>& files,
                              std::set<string>* provided) const {
   for (int i = 0; i < files.size(); i++) {
     FindProvidesForFile(options, printer, files[i], provided);
@@ -1603,11 +1408,7 @@
     io::Printer* printer,
     const Descriptor* desc,
     std::set<string>* provided) const {
-  if (IgnoreMessage(options, desc)) {
-    return;
-  }
-
-  string name = GetMessagePath(options, desc);
+  string name = GetPath(options, desc);
   provided->insert(name);
 
   for (int i = 0; i < desc->enum_type_count(); i++) {
@@ -1624,14 +1425,14 @@
                                     io::Printer* printer,
                                     const EnumDescriptor* enumdesc,
                                     std::set<string>* provided) const {
-  string name = GetEnumPath(options, enumdesc);
+  string name = GetPath(options, enumdesc);
   provided->insert(name);
 }
 
 void Generator::FindProvidesForFields(
     const GeneratorOptions& options,
     io::Printer* printer,
-    const std::vector<const FieldDescriptor*>& fields,
+    const vector<const FieldDescriptor*>& fields,
     std::set<string>* provided) const {
   for (int i = 0; i < fields.size(); i++) {
     const FieldDescriptor* field = fields[i];
@@ -1640,8 +1441,8 @@
       continue;
     }
 
-    string name = GetFilePath(options, field->file()) + "." +
-                  JSObjectFieldName(options, field);
+    string name =
+        GetPath(options, field->file()) + "." + JSObjectFieldName(field);
     provided->insert(name);
   }
 }
@@ -1651,19 +1452,8 @@
                                  std::set<string>* provided) const {
   for (std::set<string>::iterator it = provided->begin();
        it != provided->end(); ++it) {
-    if (options.import_style == GeneratorOptions::kImportClosure) {
-      printer->Print("goog.provide('$name$');\n", "name", *it);
-    } else {
-      // We aren't using Closure's import system, but we use goog.exportSymbol()
-      // to construct the expected tree of objects, eg.
-      //
-      //   goog.exportSymbol('foo.bar.Baz', null, this);
-      //
-      //   // Later generated code expects foo.bar = {} to exist:
-      //   foo.bar.Baz = function() { /* ... */ }
-      printer->Print("goog.exportSymbol('$name$', null, global);\n", "name",
-                     *it);
-    }
+    printer->Print("goog.provide('$name$');\n",
+                   "name", *it);
   }
 }
 
@@ -1679,39 +1469,30 @@
 
   GenerateRequiresImpl(options, printer, &required, &forwards, provided,
                        /* require_jspb = */ have_message,
-                       /* require_extension = */ HasExtensions(desc),
-                       /* require_map = */ HasMap(options, desc));
+                       /* require_extension = */ HasExtensions(desc));
 }
 
 void Generator::GenerateRequiresForLibrary(
     const GeneratorOptions& options, io::Printer* printer,
-    const std::vector<const FileDescriptor*>& files,
+    const vector<const FileDescriptor*>& files,
     std::set<string>* provided) const {
-  GOOGLE_CHECK_EQ(options.import_style, GeneratorOptions::kImportClosure);
+  GOOGLE_CHECK_EQ(options.import_style, GeneratorOptions::IMPORT_CLOSURE);
   // For Closure imports we need to import every message type individually.
   std::set<string> required;
   std::set<string> forwards;
   bool have_extensions = false;
-  bool have_map = false;
   bool have_message = false;
 
   for (int i = 0; i < files.size(); i++) {
     for (int j = 0; j < files[i]->message_type_count(); j++) {
-      const Descriptor* desc = files[i]->message_type(j);
-      if (!IgnoreMessage(options, desc)) {
-        FindRequiresForMessage(options, desc, &required, &forwards,
-                               &have_message);
-      }
+      FindRequiresForMessage(options,
+                             files[i]->message_type(j),
+                             &required, &forwards, &have_message);
     }
-
     if (!have_extensions && HasExtensions(files[i])) {
       have_extensions = true;
     }
 
-    if (!have_map && FileHasMap(options, files[i])) {
-      have_map = true;
-    }
-
     for (int j = 0; j < files[i]->extension_count(); j++) {
       const FieldDescriptor* extension = files[i]->extension(j);
       if (IgnoreField(extension)) {
@@ -1719,7 +1500,7 @@
       }
       if (extension->containing_type()->full_name() !=
         "google.protobuf.bridge.MessageSet") {
-        required.insert(GetMessagePath(options, extension->containing_type()));
+        required.insert(GetPath(options, extension->containing_type()));
       }
       FindRequiresForField(options, extension, &required, &forwards);
       have_extensions = true;
@@ -1728,13 +1509,12 @@
 
   GenerateRequiresImpl(options, printer, &required, &forwards, provided,
                        /* require_jspb = */ have_message,
-                       /* require_extension = */ have_extensions,
-                       /* require_map = */ have_map);
+                       /* require_extension = */ have_extensions);
 }
 
 void Generator::GenerateRequiresForExtensions(
     const GeneratorOptions& options, io::Printer* printer,
-    const std::vector<const FieldDescriptor*>& fields,
+    const vector<const FieldDescriptor*>& fields,
     std::set<string>* provided) const {
   std::set<string> required;
   std::set<string> forwards;
@@ -1748,8 +1528,7 @@
 
   GenerateRequiresImpl(options, printer, &required, &forwards, provided,
                        /* require_jspb = */ false,
-                       /* require_extension = */ fields.size() > 0,
-                       /* require_map = */ false);
+                       /* require_extension = */ fields.size() > 0);
 }
 
 void Generator::GenerateRequiresImpl(const GeneratorOptions& options,
@@ -1757,19 +1536,20 @@
                                      std::set<string>* required,
                                      std::set<string>* forwards,
                                      std::set<string>* provided,
-                                     bool require_jspb, bool require_extension,
-                                     bool require_map) const {
+                                     bool require_jspb,
+                                     bool require_extension) const {
   if (require_jspb) {
-    required->insert("jspb.Message");
-    required->insert("jspb.BinaryReader");
-    required->insert("jspb.BinaryWriter");
+    printer->Print(
+        "goog.require('jspb.Message');\n");
+    if (options.binary) {
+      printer->Print(
+          "goog.require('jspb.BinaryReader');\n"
+          "goog.require('jspb.BinaryWriter');\n");
+    }
   }
   if (require_extension) {
-    required->insert("jspb.ExtensionFieldBinaryInfo");
-    required->insert("jspb.ExtensionFieldInfo");
-  }
-  if (require_map) {
-    required->insert("jspb.Map");
+    printer->Print(
+        "goog.require('jspb.ExtensionFieldInfo');\n");
   }
 
   std::set<string>::iterator it;
@@ -1838,14 +1618,12 @@
         // dependencies, as per original codegen.
         !(field->is_extension() && field->extension_scope() == NULL)) {
       if (options.add_require_for_enums) {
-        required->insert(GetEnumPath(options, field->enum_type()));
+        required->insert(GetPath(options, field->enum_type()));
       } else {
-        forwards->insert(GetEnumPath(options, field->enum_type()));
+        forwards->insert(GetPath(options, field->enum_type()));
       }
     } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      if (!IgnoreMessage(options, field->message_type())) {
-        required->insert(GetMessagePath(options, field->message_type()));
-      }
+      required->insert(GetPath(options, field->message_type()));
     }
 }
 
@@ -1854,7 +1632,7 @@
                                          std::set<string>* required,
                                          std::set<string>* forwards) const {
     if (field->containing_type()->full_name() != "google.protobuf.bridge.MessageSet") {
-      required->insert(GetMessagePath(options, field->containing_type()));
+      required->insert(GetPath(options, field->containing_type()));
     }
     FindRequiresForField(options, field, required, forwards);
 }
@@ -1881,10 +1659,6 @@
 void Generator::GenerateClass(const GeneratorOptions& options,
                               io::Printer* printer,
                               const Descriptor* desc) const {
-  if (IgnoreMessage(options, desc)) {
-    return;
-  }
-
   if (!NamespaceOnly(desc)) {
     printer->Print("\n");
     GenerateClassConstructor(options, printer, desc);
@@ -1892,37 +1666,35 @@
 
 
     GenerateClassToObject(options, printer, desc);
-    // These must come *before* the extension-field info generation in
-    // GenerateClassRegistration so that references to the binary
-    // serialization/deserialization functions may be placed in the extension
-    // objects.
-    GenerateClassDeserializeBinary(options, printer, desc);
-    GenerateClassSerializeBinary(options, printer, desc);
-  }
-
-  // Recurse on nested types. These must come *before* the extension-field
-  // info generation in GenerateClassRegistration so that extensions that
-  // reference nested types proceed the definitions of the nested types.
-  for (int i = 0; i < desc->enum_type_count(); i++) {
-    GenerateEnum(options, printer, desc->enum_type(i));
-  }
-  for (int i = 0; i < desc->nested_type_count(); i++) {
-    GenerateClass(options, printer, desc->nested_type(i));
-  }
-
-  if (!NamespaceOnly(desc)) {
+    if (options.binary) {
+      // These must come *before* the extension-field info generation in
+      // GenerateClassRegistration so that references to the binary
+      // serialization/deserialization functions may be placed in the extension
+      // objects.
+      GenerateClassDeserializeBinary(options, printer, desc);
+      GenerateClassSerializeBinary(options, printer, desc);
+    }
+    GenerateClassClone(options, printer, desc);
     GenerateClassRegistration(options, printer, desc);
     GenerateClassFields(options, printer, desc);
     if (IsExtendable(desc) && desc->full_name() != "google.protobuf.bridge.MessageSet") {
       GenerateClassExtensionFieldInfo(options, printer, desc);
     }
 
-    if (options.import_style != GeneratorOptions::kImportClosure) {
+    if (options.import_style != GeneratorOptions:: IMPORT_CLOSURE) {
       for (int i = 0; i < desc->extension_count(); i++) {
         GenerateExtension(options, printer, desc->extension(i));
       }
     }
   }
+
+  // Recurse on nested types.
+  for (int i = 0; i < desc->enum_type_count(); i++) {
+    GenerateEnum(options, printer, desc->enum_type(i));
+  }
+  for (int i = 0; i < desc->nested_type_count(); i++) {
+    GenerateClass(options, printer, desc->nested_type(i));
+  }
 }
 
 void Generator::GenerateClassConstructor(const GeneratorOptions& options,
@@ -1943,10 +1715,8 @@
       " * @extends {jspb.Message}\n"
       " * @constructor\n"
       " */\n"
-      "$classprefix$$classname$ = function(opt_data) {\n",
-      "classprefix", GetMessagePathPrefix(options, desc),
-      "classname", desc->name());
-  printer->Annotate("classname", desc);
+      "$classname$ = function(opt_data) {\n",
+      "classname", GetPath(options, desc));
   string message_id = GetMessageId(desc);
   printer->Print(
       "  jspb.Message.initialize(this, opt_data, $messageId$, $pivot$, "
@@ -1963,13 +1733,13 @@
       "if (goog.DEBUG && !COMPILED) {\n"
       "  $classname$.displayName = '$classname$';\n"
       "}\n",
-      "classname", GetMessagePath(options, desc));
+      "classname", GetPath(options, desc));
 }
 
 void Generator::GenerateClassFieldInfo(const GeneratorOptions& options,
                                        io::Printer* printer,
                                        const Descriptor* desc) const {
-  if (HasRepeatedFields(options, desc)) {
+  if (HasRepeatedFields(desc)) {
     printer->Print(
         "/**\n"
         " * List of repeated fields within this message type.\n"
@@ -1978,9 +1748,9 @@
         " */\n"
         "$classname$$rptfieldarray$ = $rptfields$;\n"
         "\n",
-        "classname", GetMessagePath(options, desc),
+        "classname", GetPath(options, desc),
         "rptfieldarray", kRepeatedFieldArrayName,
-        "rptfields", RepeatedFieldNumberList(options, desc));
+        "rptfields", RepeatedFieldNumberList(desc));
   }
 
   if (HasOneofFields(desc)) {
@@ -1999,7 +1769,7 @@
         " */\n"
         "$classname$$oneofgrouparray$ = $oneofgroups$;\n"
         "\n",
-        "classname", GetMessagePath(options, desc),
+        "classname", GetPath(options, desc),
         "oneofgrouparray", kOneofGroupArrayName,
         "oneofgroups", OneofGroupList(desc));
 
@@ -2019,7 +1789,7 @@
       "\n"
       "\n"
       "$class$.prototype.messageXid = xid('$class$');\n",
-      "class", GetMessagePath(options, desc));
+      "class", GetPath(options, desc));
 }
 
 void Generator::GenerateOneofCaseDefinition(
@@ -2032,7 +1802,7 @@
       " */\n"
       "$classname$.$oneof$Case = {\n"
       "  $upcase$_NOT_SET: 0",
-      "classname", GetMessagePath(options, oneof->containing_type()),
+      "classname", GetPath(options, oneof->containing_type()),
       "oneof", JSOneofName(oneof),
       "upcase", ToEnumCase(oneof->name()));
 
@@ -2060,7 +1830,7 @@
       "computeOneofCase(this, $class$.oneofGroups_[$oneofindex$]));\n"
       "};\n"
       "\n",
-      "class", GetMessagePath(options, oneof->containing_type()),
+      "class", GetPath(options, oneof->containing_type()),
       "oneof", JSOneofName(oneof),
       "oneofindex", JSOneofIndex(oneof));
 }
@@ -2099,11 +1869,10 @@
       " *     http://goto/soy-param-migration\n"
       " * @param {!$classname$} msg The msg instance to transform.\n"
       " * @return {!Object}\n"
-      " * @suppress {unusedLocalVariables} f is only used for nested messages\n"
       " */\n"
       "$classname$.toObject = function(includeInstance, msg) {\n"
       "  var f, obj = {",
-      "classname", GetMessagePath(options, desc));
+      "classname", GetPath(options, desc));
 
   bool first = true;
   for (int i = 0; i < desc->field_count(); i++) {
@@ -2135,7 +1904,7 @@
         "      $extObject$, $class$.prototype.getExtension,\n"
         "      includeInstance);\n",
         "extObject", JSExtensionsObjectName(options, desc->file(), desc),
-        "class", GetMessagePath(options, desc));
+        "class", GetPath(options, desc));
   }
 
   printer->Print(
@@ -2147,114 +1916,65 @@
       "}\n"
       "\n"
       "\n",
-      "classname", GetMessagePath(options, desc));
-}
-
-void Generator::GenerateFieldValueExpression(io::Printer* printer,
-                                             const char *obj_reference,
-                                             const FieldDescriptor* field,
-                                             bool use_default) const {
-  bool is_float_or_double =
-      field->cpp_type() == FieldDescriptor::CPPTYPE_FLOAT ||
-      field->cpp_type() == FieldDescriptor::CPPTYPE_DOUBLE;
-  if (use_default) {
-    if (is_float_or_double) {
-      // Coerce "Nan" and "Infinity" to actual float values.
-      //
-      // This will change null to 0, but that doesn't matter since we're getting
-      // with a default.
-      printer->Print("+");
-    }
-
-    printer->Print(
-        "jspb.Message.getFieldWithDefault($obj$, $index$, $default$)",
-        "obj", obj_reference,
-        "index", JSFieldIndex(field),
-        "default", JSFieldDefault(field));
-  } else {
-    if (is_float_or_double) {
-      if (field->is_required()) {
-        // Use "+" to convert all fields to numeric (including null).
-        printer->Print(
-            "+jspb.Message.getField($obj$, $index$)",
-            "index", JSFieldIndex(field),
-            "obj", obj_reference);
-      } else {
-        // Converts "NaN" and "Infinity" while preserving null.
-        printer->Print(
-            "jspb.Message.get$cardinality$FloatingPointField($obj$, $index$)",
-            "cardinality", field->is_repeated() ? "Repeated" : "Optional",
-            "index", JSFieldIndex(field),
-            "obj", obj_reference);
-      }
-    } else {
-      printer->Print("jspb.Message.get$cardinality$Field($obj$, $index$)",
-                     "cardinality", field->is_repeated() ? "Repeated" : "",
-                     "index", JSFieldIndex(field),
-                     "obj", obj_reference);
-    }
-  }
+      "classname", GetPath(options, desc));
 }
 
 void Generator::GenerateClassFieldToObject(const GeneratorOptions& options,
                                            io::Printer* printer,
                                            const FieldDescriptor* field) const {
   printer->Print("$fieldname$: ",
-                 "fieldname", JSObjectFieldName(options, field));
+                 "fieldname", JSObjectFieldName(field));
 
-  if (IsMap(options, field)) {
-    const FieldDescriptor* value_field = MapFieldValue(field);
-    // If the map values are of a message type, we must provide their static
-    // toObject() method; otherwise we pass undefined for that argument.
-    string value_to_object;
-    if (value_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      value_to_object =
-          GetMessagePath(options, value_field->message_type()) + ".toObject";
-    } else {
-      value_to_object = "undefined";
-    }
-    printer->Print(
-        "(f = msg.get$name$()) ? f.toObject(includeInstance, $valuetoobject$) "
-        ": []",
-        "name", JSGetterName(options, field), "valuetoobject", value_to_object);
-  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     // Message field.
     if (field->is_repeated()) {
       {
         printer->Print("jspb.Message.toObjectList(msg.get$getter$(),\n"
                        "    $type$.toObject, includeInstance)",
-                       "getter", JSGetterName(options, field),
+                       "getter", JSGetterName(field),
                        "type", SubmessageTypeRef(options, field));
       }
     } else {
       printer->Print("(f = msg.get$getter$()) && "
                      "$type$.toObject(includeInstance, f)",
-                     "getter", JSGetterName(options, field),
+                     "getter", JSGetterName(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));
   } else {
-    bool use_default = field->has_default_value();
-
-    if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
-        // Repeated fields get initialized to their default in the constructor
-        // (why?), so we emit a plain getField() call for them.
-        !field->is_repeated() && !UseBrokenPresenceSemantics(options, field)) {
-      // Proto3 puts all defaults (including implicit defaults) in toObject().
-      // But for proto2 we leave the existing semantics unchanged: unset fields
-      // without default are unset.
-      use_default = true;
+    // Simple field (singular or repeated).
+    if ((!HasFieldPresence(field) && !field->is_repeated()) ||
+        field->type() == FieldDescriptor::TYPE_BYTES) {
+      // Delegate to the generated get<field>() method in order not to duplicate
+      // the proto3-field-default-value or byte-coercion logic here.
+      printer->Print("msg.get$getter$()",
+                     "getter", JSGetterName(field, BYTES_B64));
+    } else {
+      if (field->has_default_value()) {
+        printer->Print("jspb.Message.getField(msg, $index$) == null ? "
+                       "$defaultValue$ : ",
+                       "index", JSFieldIndex(field),
+                       "defaultValue", JSFieldDefault(field));
+      }
+      if (field->cpp_type() == FieldDescriptor::CPPTYPE_FLOAT ||
+          field->cpp_type() == FieldDescriptor::CPPTYPE_DOUBLE) {
+        if (field->is_repeated()) {
+          printer->Print("jspb.Message.getRepeatedFloatingPointField("
+                         "msg, $index$)",
+                         "index", JSFieldIndex(field));
+        } else if (field->is_optional() && !field->has_default_value()) {
+          printer->Print("jspb.Message.getOptionalFloatingPointField("
+                         "msg, $index$)",
+                         "index", JSFieldIndex(field));
+        } else {
+          // Convert "NaN" to NaN.
+          printer->Print("+jspb.Message.getField(msg, $index$)",
+                         "index", JSFieldIndex(field));
+        }
+      } else {
+        printer->Print("jspb.Message.getField(msg, $index$)",
+                       "index", JSFieldIndex(field));
+      }
     }
-
-    // We don't implement this by calling the accessors, because the semantics
-    // of the accessors are changing independently of the toObject() semantics.
-    // We are migrating the accessors to return defaults instead of null, but
-    // it may take longer to migrate toObject (or we might not want to do it at
-    // all).  So we want to generate independent code.
-    GenerateFieldValueExpression(printer, "msg", field, use_default);
   }
 }
 
@@ -2271,7 +1991,7 @@
       " */\n"
       "$classname$.fromObject = function(obj) {\n"
       "  var f, msg = new $classname$();\n",
-      "classname", GetMessagePath(options, desc));
+      "classname", GetPath(options, desc));
 
   for (int i = 0; i < desc->field_count(); i++) {
     const FieldDescriptor* field = desc->field(i);
@@ -2288,29 +2008,7 @@
     const GeneratorOptions& options,
     io::Printer* printer,
     const FieldDescriptor* field) const {
-  if (IsMap(options, field)) {
-    const FieldDescriptor* value_field = MapFieldValue(field);
-    if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      // Since the map values are of message type, we have to do some extra work
-      // to recursively call fromObject() on them before setting the map field.
-      printer->Print(
-          "  goog.isDef(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()));
-    } else {
-      // `msg` is a newly-constructed message object that has not yet built any
-      // map containers wrapping underlying arrays, so we can simply directly
-      // set the array here without fear of a stale wrapper.
-      printer->Print(
-          "  goog.isDef(obj.$name$) && "
-          "jspb.Message.setField(msg, $index$, obj.$name$);\n",
-          "name", JSObjectFieldName(options, field),
-          "index", JSFieldIndex(field));
-    }
-  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     // Message field (singular or repeated)
     if (field->is_repeated()) {
       {
@@ -2320,7 +2018,7 @@
             "      msg, $index$, goog.array.map(obj.$name$, function(i) {\n"
             "        return $fieldclass$.fromObject(i);\n"
             "      }));\n",
-            "name", JSObjectFieldName(options, field),
+            "name", JSObjectFieldName(field),
             "index", JSFieldIndex(field),
             "fieldclass", SubmessageTypeRef(options, field));
       }
@@ -2328,7 +2026,7 @@
       printer->Print(
           "  goog.isDef(obj.$name$) && jspb.Message.setWrapperField(\n"
           "      msg, $index$, $fieldclass$.fromObject(obj.$name$));\n",
-          "name", JSObjectFieldName(options, field),
+          "name", JSObjectFieldName(field),
           "index", JSFieldIndex(field),
           "fieldclass", SubmessageTypeRef(options, field));
     }
@@ -2337,11 +2035,26 @@
     printer->Print(
         "  goog.isDef(obj.$name$) && jspb.Message.setField(msg, $index$, "
         "obj.$name$);\n",
-        "name", JSObjectFieldName(options, field),
+        "name", JSObjectFieldName(field),
         "index", JSFieldIndex(field));
   }
 }
 
+void Generator::GenerateClassClone(const GeneratorOptions& options,
+                                   io::Printer* printer,
+                                   const Descriptor* desc) const {
+  printer->Print(
+      "/**\n"
+      " * Creates a deep clone of this proto. No data is shared with the "
+      "original.\n"
+      " * @return {!$name$} The clone.\n"
+      " */\n"
+      "$name$.prototype.cloneMessage = function() {\n"
+      "  return /** @type {!$name$} */ (jspb.Message.cloneMessage(this));\n"
+      "};\n\n\n",
+      "name", GetPath(options, desc));
+}
+
 void Generator::GenerateClassRegistration(const GeneratorOptions& options,
                                           io::Printer* printer,
                                           const Descriptor* desc) const {
@@ -2369,11 +2082,12 @@
                           io::Printer* printer,
                           const FieldDescriptor* field,
                           BytesMode bytes_mode) {
-  string type = JSFieldTypeAnnotation(
-      options, field,
-      /* is_setter_argument = */ false,
-      /* force_present = */ false,
-      /* singular_if_not_packed = */ false, bytes_mode);
+  string type =
+      JSFieldTypeAnnotation(options, field,
+                            /* force_optional = */ false,
+                            /* force_present = */ !HasFieldPresence(field),
+                            /* singular_if_not_packed = */ false,
+                            bytes_mode);
   printer->Print(
       "/**\n"
       " * $fielddef$\n"
@@ -2390,76 +2104,18 @@
       "fielddef", FieldDefinition(options, field),
       "comment", FieldComments(field, bytes_mode),
       "type", type,
-      "class", GetMessagePath(options, field->containing_type()),
-      "name", JSGetterName(options, field, bytes_mode),
+      "class", GetPath(options, field->containing_type()),
+      "name", JSGetterName(field, bytes_mode),
       "list", field->is_repeated() ? "List" : "",
       "suffix", JSByteGetterSuffix(bytes_mode),
-      "defname", JSGetterName(options, field, BYTES_DEFAULT));
+      "defname", JSGetterName(field, BYTES_DEFAULT));
 }
 
+
 void Generator::GenerateClassField(const GeneratorOptions& options,
                                    io::Printer* printer,
                                    const FieldDescriptor* field) const {
-  if (IsMap(options, field)) {
-    const FieldDescriptor* key_field = MapFieldKey(field);
-    const FieldDescriptor* value_field = MapFieldValue(field);
-    // Map field: special handling to instantiate the map object on demand.
-    string key_type =
-        JSFieldTypeAnnotation(
-            options, key_field,
-            /* is_setter_argument = */ false,
-            /* force_present = */ true,
-            /* singular_if_not_packed = */ false);
-    string value_type =
-        JSFieldTypeAnnotation(
-            options, value_field,
-            /* is_setter_argument = */ false,
-            /* force_present = */ true,
-            /* singular_if_not_packed = */ false);
-
-    printer->Print(
-        "/**\n"
-        " * $fielddef$\n"
-        " * @param {boolean=} opt_noLazyCreate Do not create the map if\n"
-        " * empty, instead returning `undefined`\n"
-        " * @return {!jspb.Map<$keytype$,$valuetype$>}\n"
-        " */\n",
-        "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,
-        "valuetype", value_type);
-    printer->Annotate("gettername", field);
-    printer->Print(
-        "      jspb.Message.getMapField(this, $index$, opt_noLazyCreate",
-        "index", JSFieldIndex(field));
-
-    if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      printer->Print(
-          ",\n"
-          "      $messageType$",
-          "messageType", GetMessagePath(options, value_field->message_type()));
-    } else {
-      printer->Print(",\n"
-          "      null");
-    }
-
-    printer->Print(
-        "));\n");
-
-    printer->Print(
-        "};\n"
-        "\n"
-        "\n");
-  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-    // Message field: special handling in order to wrap the underlying data
-    // array with a message object.
-
+  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     printer->Print(
         "/**\n"
         " * $fielddef$\n"
@@ -2469,21 +2125,21 @@
         "fielddef", FieldDefinition(options, field),
         "comment", FieldComments(field, BYTES_DEFAULT),
         "type", JSFieldTypeAnnotation(options, field,
-                                      /* is_setter_argument = */ false,
+                                      /* force_optional = */ false,
                                       /* force_present = */ false,
                                       /* singular_if_not_packed = */ false));
     printer->Print(
-        "$class$.prototype.$gettername$ = function() {\n"
+        "$class$.prototype.get$name$ = function() {\n"
         "  return /** @type{$type$} */ (\n"
         "    jspb.Message.get$rpt$WrapperField(this, $wrapperclass$, "
         "$index$$required$));\n"
         "};\n"
         "\n"
         "\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "gettername", "get" + JSGetterName(options, field),
+        "class", GetPath(options, field->containing_type()),
+        "name", JSGetterName(field),
         "type", JSFieldTypeAnnotation(options, field,
-                                      /* is_setter_argument = */ false,
+                                      /* force_optional = */ false,
                                       /* force_present = */ false,
                                       /* singular_if_not_packed = */ false),
         "rpt", (field->is_repeated() ? "Repeated" : ""),
@@ -2491,22 +2147,20 @@
         "wrapperclass", SubmessageTypeRef(options, field),
         "required", (field->label() == FieldDescriptor::LABEL_REQUIRED ?
                      ", 1" : ""));
-    printer->Annotate("gettername", field);
     printer->Print(
-        "/** @param {$optionaltype$} value$returndoc$ */\n"
-        "$class$.prototype.$settername$ = function(value) {\n"
+        "/** @param {$optionaltype$} value $returndoc$ */\n"
+        "$class$.prototype.set$name$ = function(value) {\n"
         "  jspb.Message.set$oneoftag$$repeatedtag$WrapperField(",
         "optionaltype",
         JSFieldTypeAnnotation(options, field,
-                              /* is_setter_argument = */ true,
+                              /* force_optional = */ true,
                               /* force_present = */ false,
                               /* singular_if_not_packed = */ false),
         "returndoc", JSReturnDoc(options, field),
-        "class", GetMessagePath(options, field->containing_type()),
-        "settername", "set" + JSGetterName(options, field),
+        "class", GetPath(options, field->containing_type()),
+        "name", JSGetterName(field),
         "oneoftag", (field->containing_oneof() ? "Oneof" : ""),
         "repeatedtag", (field->is_repeated() ? "Repeated" : ""));
-    printer->Annotate("settername", field);
 
     printer->Print(
         "this, $index$$oneofgroup$, value);$returnvalue$\n"
@@ -2518,9 +2172,16 @@
                        (", " + JSOneofArray(options, field)) : ""),
         "returnvalue", JSReturnClause(field));
 
-    if (field->is_repeated()) {
-      GenerateRepeatedMessageHelperMethods(options, printer, field);
-    }
+    printer->Print(
+        "$class$.prototype.clear$name$ = function() {\n"
+        "  this.set$name$($clearedvalue$);$returnvalue$\n"
+        "};\n"
+        "\n"
+        "\n",
+        "class", GetPath(options, field->containing_type()),
+        "name", JSGetterName(field),
+        "clearedvalue", (field->is_repeated() ? "[]" : "undefined"),
+        "returnvalue", JSReturnClause(field));
 
   } else {
     bool untyped =
@@ -2529,17 +2190,17 @@
     // Simple (primitive) field, either singular or repeated.
 
     // TODO(b/26173701): Always use BYTES_DEFAULT for the getter return type;
-    // at this point we "lie" to non-binary users and tell the return
+    // at this point we "lie" to non-binary users and tell the 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;
-    string typed_annotation = JSFieldTypeAnnotation(
-        options, field,
-        /* is_setter_argument = */ false,
-        /* force_present = */ false,
-        /* singular_if_not_packed = */ false,
-        /* bytes_mode = */ bytes_mode);
+    string typed_annotation =
+        JSFieldTypeAnnotation(options, field,
+                              /* force_optional = */ false,
+                              /* force_present = */ !HasFieldPresence(field),
+                              /* singular_if_not_packed = */ false,
+                              /* bytes_mode = */ bytes_mode);
     if (untyped) {
       printer->Print(
           "/**\n"
@@ -2558,10 +2219,9 @@
     }
 
     printer->Print(
-        "$class$.prototype.$gettername$ = function() {\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "gettername", "get" + JSGetterName(options, field));
-    printer->Annotate("gettername", field);
+        "$class$.prototype.get$name$ = function() {\n",
+        "class", GetPath(options, field->containing_type()),
+        "name", JSGetterName(field));
 
     if (untyped) {
       printer->Print(
@@ -2572,21 +2232,41 @@
           "type", typed_annotation);
     }
 
-    bool use_default = !ReturnsNullWhenUnset(options, field);
-
-    // Raw fields with no default set should just return undefined.
-    if (untyped && !field->has_default_value()) {
-      use_default = false;
+    // For proto3 fields without presence, use special getters that will return
+    // defaults when the field is unset, possibly constructing a value if
+    // required.
+    if (!HasFieldPresence(field) && !field->is_repeated()) {
+      printer->Print("jspb.Message.getFieldProto3(this, $index$, $default$)",
+                     "index", JSFieldIndex(field),
+                     "default", Proto3PrimitiveFieldDefault(field));
+    } else {
+      if (field->has_default_value()) {
+        printer->Print("jspb.Message.getField(this, $index$) == null ? "
+                       "$defaultValue$ : ",
+                       "index", JSFieldIndex(field),
+                       "defaultValue", JSFieldDefault(field));
+      }
+      if (field->cpp_type() == FieldDescriptor::CPPTYPE_FLOAT ||
+          field->cpp_type() == FieldDescriptor::CPPTYPE_DOUBLE) {
+        if (field->is_repeated()) {
+          printer->Print("jspb.Message.getRepeatedFloatingPointField("
+                         "this, $index$)",
+                         "index", JSFieldIndex(field));
+        } else if (field->is_optional() && !field->has_default_value()) {
+          printer->Print("jspb.Message.getOptionalFloatingPointField("
+                         "this, $index$)",
+                         "index", JSFieldIndex(field));
+        } else {
+          // Convert "NaN" to NaN.
+          printer->Print("+jspb.Message.getField(this, $index$)",
+                         "index", JSFieldIndex(field));
+        }
+      } else {
+        printer->Print("jspb.Message.getField(this, $index$)",
+                       "index", JSFieldIndex(field));
+      }
     }
 
-    // Repeated fields get initialized to their default in the constructor
-    // (why?), so we emit a plain getField() call for them.
-    if (field->is_repeated()) {
-      use_default = false;
-    }
-
-    GenerateFieldValueExpression(printer, "this", field, use_default);
-
     if (untyped) {
       printer->Print(
           ";\n"
@@ -2609,198 +2289,67 @@
     if (untyped) {
       printer->Print(
           "/**\n"
-          " * @param {*} value$returndoc$\n"
+          " * @param {*} value $returndoc$\n"
           " */\n",
           "returndoc", JSReturnDoc(options, field));
     } else {
       printer->Print(
-          "/** @param {$optionaltype$} value$returndoc$ */\n", "optionaltype",
-          JSFieldTypeAnnotation(
-              options, field,
-              /* is_setter_argument = */ true,
-              /* force_present = */ false,
-              /* singular_if_not_packed = */ false),
+          "/** @param {$optionaltype$} value $returndoc$ */\n",
+          "optionaltype",
+          JSFieldTypeAnnotation(options, field,
+                                /* force_optional = */ true,
+                                /* force_present = */ !HasFieldPresence(field),
+                                /* singular_if_not_packed = */ false),
           "returndoc", JSReturnDoc(options, field));
     }
-
-    if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
-        !field->is_repeated() && !field->is_map() &&
-        !HasFieldPresence(options, field)) {
-      // Proto3 non-repeated and non-map fields without presence use the
-      // setProto3*Field function.
-      printer->Print(
-          "$class$.prototype.$settername$ = function(value) {\n"
-          "  jspb.Message.setProto3$typetag$Field(this, $index$, "
-          "value);$returnvalue$\n"
-          "};\n"
-          "\n"
-          "\n",
-          "class", GetMessagePath(options, field->containing_type()),
-          "settername", "set" + JSGetterName(options, field), "typetag",
-          JSTypeTag(field), "index", JSFieldIndex(field), "returnvalue",
-          JSReturnClause(field));
-      printer->Annotate("settername", field);
-    } else {
-      // Otherwise, use the regular setField function.
-      printer->Print(
-          "$class$.prototype.$settername$ = function(value) {\n"
-          "  jspb.Message.set$oneoftag$Field(this, $index$",
-          "class", GetMessagePath(options, field->containing_type()),
-          "settername", "set" + JSGetterName(options, field), "oneoftag",
-          (field->containing_oneof() ? "Oneof" : ""), "index",
-          JSFieldIndex(field));
-      printer->Annotate("settername", field);
-      printer->Print(
-          "$oneofgroup$, $type$value$rptvalueinit$$typeclose$);$returnvalue$\n"
-          "};\n"
-          "\n"
-          "\n",
-          "type",
-          untyped ? "/** @type{string|number|boolean|Array|undefined} */(" : "",
-          "typeclose", untyped ? ")" : "", "oneofgroup",
-          (field->containing_oneof() ? (", " + JSOneofArray(options, field))
-                                     : ""),
-          "returnvalue", JSReturnClause(field), "rptvalueinit",
-          (field->is_repeated() ? " || []" : ""));
-    }
+    printer->Print(
+        "$class$.prototype.set$name$ = function(value) {\n"
+        "  jspb.Message.set$oneoftag$Field(this, $index$",
+        "class", GetPath(options, field->containing_type()),
+        "name", JSGetterName(field),
+        "oneoftag", (field->containing_oneof() ? "Oneof" : ""),
+        "index", JSFieldIndex(field));
+    printer->Print(
+        "$oneofgroup$, $type$value$rptvalueinit$$typeclose$);$returnvalue$\n"
+        "};\n"
+        "\n"
+        "\n",
+        "type",
+        untyped ? "/** @type{string|number|boolean|Array|undefined} */(" : "",
+        "typeclose", untyped ? ")" : "",
+        "oneofgroup",
+        (field->containing_oneof() ? (", " + JSOneofArray(options, field))
+                                   : ""),
+        "returnvalue", JSReturnClause(field), "rptvalueinit",
+        (field->is_repeated() ? " || []" : ""));
 
     if (untyped) {
       printer->Print(
           "/**\n"
-          " * Clears the value.$returndoc$\n"
+          " * Clears the value. $returndoc$\n"
           " */\n",
           "returndoc", JSReturnDoc(options, field));
     }
 
-
-    if (field->is_repeated()) {
-      GenerateRepeatedPrimitiveHelperMethods(options, printer, field, untyped);
+    if (HasFieldPresence(field)) {
+      printer->Print(
+          "$class$.prototype.clear$name$ = function() {\n"
+          "  jspb.Message.set$oneoftag$Field(this, $index$$oneofgroup$, ",
+          "class", GetPath(options, field->containing_type()),
+          "name", JSGetterName(field),
+          "oneoftag", (field->containing_oneof() ? "Oneof" : ""),
+          "oneofgroup", (field->containing_oneof() ?
+                         (", " + JSOneofArray(options, field)) : ""),
+          "index", JSFieldIndex(field));
+      printer->Print(
+          "$clearedvalue$);$returnvalue$\n"
+          "};\n"
+          "\n"
+          "\n",
+          "clearedvalue", (field->is_repeated() ? "[]" : "undefined"),
+          "returnvalue", JSReturnClause(field));
     }
   }
-
-  // Generate clearFoo() method for map fields, repeated fields, and other
-  // fields with presence.
-  if (IsMap(options, field)) {
-    printer->Print(
-        "$class$.prototype.$clearername$ = function() {\n"
-        "  this.$gettername$().clear();$returnvalue$\n"
-        "};\n"
-        "\n"
-        "\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "clearername", "clear" + JSGetterName(options, field),
-        "gettername", "get" + JSGetterName(options, field),
-        "returnvalue", JSReturnClause(field));
-    printer->Annotate("clearername", field);
-  } else if (field->is_repeated() ||
-             (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
-              !field->is_required())) {
-    // Fields where we can delegate to the regular setter.
-    printer->Print(
-        "$class$.prototype.$clearername$ = function() {\n"
-        "  this.$settername$($clearedvalue$);$returnvalue$\n"
-        "};\n"
-        "\n"
-        "\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "clearername", "clear" + JSGetterName(options, field),
-        "settername", "set" + JSGetterName(options, field),
-        "clearedvalue", (field->is_repeated() ? "[]" : "undefined"),
-        "returnvalue", JSReturnClause(field));
-    printer->Annotate("clearername", field);
-  } else if (HasFieldPresence(options, field)) {
-    // Fields where we can't delegate to the regular setter because it doesn't
-    // accept "undefined" as an argument.
-    printer->Print(
-        "$class$.prototype.$clearername$ = function() {\n"
-        "  jspb.Message.set$maybeoneof$Field(this, "
-        "$index$$maybeoneofgroup$, ",
-        "class", GetMessagePath(options, field->containing_type()),
-        "clearername", "clear" + JSGetterName(options, field),
-        "maybeoneof", (field->containing_oneof() ? "Oneof" : ""),
-        "maybeoneofgroup", (field->containing_oneof() ?
-                           (", " + JSOneofArray(options, field)) : ""),
-        "index", JSFieldIndex(field));
-    printer->Annotate("clearername", field);
-    printer->Print(
-        "$clearedvalue$);$returnvalue$\n"
-        "};\n"
-        "\n"
-        "\n",
-        "clearedvalue", (field->is_repeated() ? "[]" : "undefined"),
-        "returnvalue", JSReturnClause(field));
-  }
-
-  if (HasFieldPresence(options, field)) {
-    printer->Print(
-        "/**\n"
-        " * Returns whether this field is set.\n"
-        " * @return {!boolean}\n"
-        " */\n"
-        "$class$.prototype.$hasername$ = function() {\n"
-        "  return jspb.Message.getField(this, $index$) != null;\n"
-        "};\n"
-        "\n"
-        "\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "hasername", "has" + JSGetterName(options, field),
-        "index", JSFieldIndex(field));
-    printer->Annotate("hasername", field);
-  }
-}
-
-void Generator::GenerateRepeatedPrimitiveHelperMethods(
-    const GeneratorOptions& options, io::Printer* printer,
-    const FieldDescriptor* field, bool untyped) const {
-  printer->Print(
-      "/**\n"
-      " * @param {!$optionaltype$} value\n"
-      " * @param {number=} opt_index\n"
-      " */\n"
-      "$class$.prototype.$addername$ = function(value, opt_index) {\n"
-      "  jspb.Message.addToRepeatedField(this, $index$",
-      "class", GetMessagePath(options, field->containing_type()), "addername",
-      "add" + JSGetterName(options, field, BYTES_DEFAULT,
-                           /* drop_list = */ true),
-      "optionaltype", JSTypeName(options, field, BYTES_DEFAULT), "index",
-      JSFieldIndex(field));
-  printer->Annotate("addername", field);
-  printer->Print(
-      "$oneofgroup$, $type$value$rptvalueinit$$typeclose$, opt_index);\n"
-      "};\n"
-      "\n"
-      "\n",
-      "type", untyped ? "/** @type{string|number|boolean|!Uint8Array} */(" : "",
-      "typeclose", untyped ? ")" : "", "oneofgroup",
-      (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""),
-      "rptvalueinit", "");
-}
-
-void Generator::GenerateRepeatedMessageHelperMethods(
-    const GeneratorOptions& options, io::Printer* printer,
-    const FieldDescriptor* field) const {
-  printer->Print(
-      "/**\n"
-      " * @param {!$optionaltype$=} opt_value\n"
-      " * @param {number=} opt_index\n"
-      " * @return {!$optionaltype$}\n"
-      " */\n"
-      "$class$.prototype.add$name$ = function(opt_value, opt_index) {\n"
-      "  return jspb.Message.addTo$repeatedtag$WrapperField(",
-      "optionaltype", JSTypeName(options, field, BYTES_DEFAULT),
-      "class", GetMessagePath(options, field->containing_type()),
-      "name", JSGetterName(options, field, BYTES_DEFAULT,
-                   /* drop_list = */ true),
-      "repeatedtag", (field->is_repeated() ? "Repeated" : ""));
-
-  printer->Print(
-      "this, $index$$oneofgroup$, opt_value, $ctor$, opt_index);\n"
-      "};\n"
-      "\n"
-      "\n",
-      "index", JSFieldIndex(field), "oneofgroup",
-      (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""),
-      "ctor", GetMessagePath(options, field->message_type()));
 }
 
 void Generator::GenerateClassExtensionFieldInfo(const GeneratorOptions& options,
@@ -2826,28 +2375,7 @@
         " */\n"
         "$class$.extensions = {};\n"
         "\n",
-        "class", GetMessagePath(options, desc));
-
-    printer->Print(
-        "\n"
-        "/**\n"
-        " * The extensions registered with this message class. This is a "
-        "map of\n"
-        " * extension field number to fieldInfo object.\n"
-        " *\n"
-        " * For example:\n"
-        " *     { 123: {fieldIndex: 123, fieldName: {my_field_name: 0}, "
-        "ctor: proto.example.MyMessage} }\n"
-        " *\n"
-        " * fieldName contains the JsCompiler renamed field name property "
-        "so that it\n"
-        " * works in OPTIMIZED mode.\n"
-        " *\n"
-        " * @type {!Object.<number, jspb.ExtensionFieldBinaryInfo>}\n"
-        " */\n"
-        "$class$.extensionsBinary = {};\n"
-        "\n",
-        "class", GetMessagePath(options, desc));
+        "class", GetPath(options, desc));
   }
 }
 
@@ -2885,24 +2413,22 @@
       "    }\n"
       "    var field = reader.getFieldNumber();\n"
       "    switch (field) {\n",
-      "class", GetMessagePath(options, desc));
+      "class", GetPath(options, desc));
 
   for (int i = 0; i < desc->field_count(); i++) {
-    if (!IgnoreField(desc->field(i))) {
-      GenerateClassDeserializeBinaryField(options, printer, desc->field(i));
-    }
+    GenerateClassDeserializeBinaryField(options, printer, desc->field(i));
   }
 
   printer->Print(
       "    default:\n");
   if (IsExtendable(desc)) {
     printer->Print(
-        "      jspb.Message.readBinaryExtension(msg, reader, $extobj$Binary,\n"
+        "      jspb.Message.readBinaryExtension(msg, reader, $extobj$,\n"
         "        $class$.prototype.getExtension,\n"
         "        $class$.prototype.setExtension);\n"
         "      break;\n",
         "extobj", JSExtensionsObjectName(options, desc->file(), desc),
-        "class", GetMessagePath(options, desc));
+        "class", GetPath(options, desc));
   } else {
     printer->Print(
         "      reader.skipField();\n"
@@ -2926,60 +2452,40 @@
   printer->Print("    case $num$:\n",
                  "num", SimpleItoa(field->number()));
 
-  if (IsMap(options, field)) {
-    const FieldDescriptor* key_field = MapFieldKey(field);
-    const FieldDescriptor* value_field = MapFieldValue(field);
+  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     printer->Print(
-        "      var value = msg.get$name$();\n"
-        "      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));
-
-    if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      printer->Print(", $messageType$.deserializeBinaryFromReader",
-          "messageType", GetMessagePath(options, value_field->message_type()));
-    }
-
-    printer->Print(");\n");
-    printer->Print("         });\n");
-  } else {
-    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      printer->Print(
-          "      var value = new $fieldclass$;\n"
-          "      reader.read$msgOrGroup$($grpfield$value,"
-          "$fieldclass$.deserializeBinaryFromReader);\n",
+        "      var value = new $fieldclass$;\n"
+        "      reader.read$msgOrGroup$($grpfield$value,"
+        "$fieldclass$.deserializeBinaryFromReader);\n",
         "fieldclass", SubmessageTypeRef(options, field),
-          "msgOrGroup", (field->type() == FieldDescriptor::TYPE_GROUP) ?
-                        "Group" : "Message",
-          "grpfield", (field->type() == FieldDescriptor::TYPE_GROUP) ?
-                      (SimpleItoa(field->number()) + ", ") : "");
-    } else {
-      printer->Print(
-          "      var value = /** @type {$fieldtype$} */ "
-          "(reader.read$reader$());\n",
-          "fieldtype", JSFieldTypeAnnotation(options, field, false, true,
-                                             /* singular_if_not_packed */ true,
-                                             BYTES_U8),
-          "reader",
-          JSBinaryReadWriteMethodName(field, /* is_writer = */ false));
-    }
+        "msgOrGroup", (field->type() == FieldDescriptor::TYPE_GROUP) ?
+                      "Group" : "Message",
+        "grpfield", (field->type() == FieldDescriptor::TYPE_GROUP) ?
+                    (SimpleItoa(field->number()) + ", ") : "");
+  } else {
+    printer->Print(
+        "      var value = /** @type {$fieldtype$} */ (reader.$reader$());\n",
+        "fieldtype", JSFieldTypeAnnotation(options, field, false, true,
+                                           /* singular_if_not_packed = */ true,
+                                           BYTES_U8),
+        "reader", JSBinaryReaderMethodName(field));
+  }
 
-    if (field->is_repeated() && !field->is_packed()) {
-      printer->Print(
-          "      msg.add$name$(value);\n", "name",
-          JSGetterName(options, field, BYTES_DEFAULT, /* drop_list = */ true));
-    } else {
-      // 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));
-    }
+  if (field->is_repeated() && !field->is_packed()) {
+    // Repeated fields receive a |value| one at at a time; append to array
+    // returned by get$name$(). Annoyingly, we have to call 'set' after
+    // changing the array.
+    printer->Print("      msg.get$name$().push(value);\n", "name",
+                   JSGetterName(field));
+    printer->Print("      msg.set$name$(msg.get$name$());\n", "name",
+                   JSGetterName(field));
+  } else {
+    // 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(field));
   }
 
   printer->Print("      break;\n");
@@ -2990,40 +2496,47 @@
                                              const Descriptor* desc) const {
   printer->Print(
       "/**\n"
+      " * Class method variant: serializes the given message to binary data\n"
+      " * (in protobuf wire format), writing to the given BinaryWriter.\n"
+      " * @param {!$class$} message\n"
+      " * @param {!jspb.BinaryWriter} writer\n"
+      " */\n"
+      "$class$.serializeBinaryToWriter = function(message, "
+      "writer) {\n"
+      "  message.serializeBinaryToWriter(writer);\n"
+      "};\n"
+      "\n"
+      "\n"
+      "/**\n"
       " * Serializes the message to binary data (in protobuf wire format).\n"
       " * @return {!Uint8Array}\n"
       " */\n"
       "$class$.prototype.serializeBinary = function() {\n"
       "  var writer = new jspb.BinaryWriter();\n"
-      "  $class$.serializeBinaryToWriter(this, writer);\n"
+      "  this.serializeBinaryToWriter(writer);\n"
       "  return writer.getResultBuffer();\n"
       "};\n"
       "\n"
       "\n"
       "/**\n"
-      " * Serializes the given message to binary data (in protobuf wire\n"
-      " * format), writing to the given BinaryWriter.\n"
-      " * @param {!$class$} message\n"
+      " * Serializes the message to binary data (in protobuf wire format),\n"
+      " * writing to the given BinaryWriter.\n"
       " * @param {!jspb.BinaryWriter} writer\n"
-      " * @suppress {unusedLocalVariables} f is only used for nested messages\n"
       " */\n"
-      "$class$.serializeBinaryToWriter = function(message, "
-      "writer) {\n"
+      "$class$.prototype.serializeBinaryToWriter = function (writer) {\n"
       "  var f = undefined;\n",
-      "class", GetMessagePath(options, desc));
+      "class", GetPath(options, desc));
 
   for (int i = 0; i < desc->field_count(); i++) {
-    if (!IgnoreField(desc->field(i))) {
-      GenerateClassSerializeBinaryField(options, printer, desc->field(i));
-    }
+    GenerateClassSerializeBinaryField(options, printer, desc->field(i));
   }
 
   if (IsExtendable(desc)) {
     printer->Print(
-        "  jspb.Message.serializeBinaryExtensions(message, writer,\n"
-        "    $extobj$Binary, $class$.prototype.getExtension);\n",
+        "  jspb.Message.serializeBinaryExtensions(this, writer, $extobj$,\n"
+        "    $class$.prototype.getExtension);\n",
         "extobj", JSExtensionsObjectName(options, desc->file(), desc),
-        "class", GetMessagePath(options, desc));
+        "class", GetPath(options, desc));
   }
 
   printer->Print(
@@ -3036,37 +2549,15 @@
     const GeneratorOptions& options,
     io::Printer* printer,
     const FieldDescriptor* field) const {
-  if (HasFieldPresence(options, field) &&
-      field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
-    string typed_annotation = JSFieldTypeAnnotation(
-        options, field,
-        /* is_setter_argument = */ false,
-        /* force_present = */ false,
-        /* singular_if_not_packed = */ false,
-        /* bytes_mode = */ BYTES_DEFAULT);
-    printer->Print(
-        "  f = /** @type {$type$} */ "
-        "(jspb.Message.getField(message, $index$));\n",
-        "index", JSFieldIndex(field),
-        "type", typed_annotation);
-  } else {
-    printer->Print(
-        "  f = message.get$name$($nolazy$);\n",
-        "name", JSGetterName(options, field, BYTES_U8),
-        // No lazy creation for maps containers -- fastpath the empty case.
-        "nolazy", IsMap(options, field) ? "true" : "");
-  }
+  printer->Print(
+      "  f = this.get$name$();\n",
+      "name", JSGetterName(field, BYTES_U8));
 
-  // Print an `if (condition)` statement that evaluates to true if the field
-  // goes on the wire.
-  if (IsMap(options, field)) {
-    printer->Print(
-        "  if (f && f.getLength() > 0) {\n");
-  } else if (field->is_repeated()) {
+  if (field->is_repeated()) {
     printer->Print(
         "  if (f.length > 0) {\n");
   } else {
-    if (HasFieldPresence(options, field)) {
+    if (HasFieldPresence(field)) {
       printer->Print(
           "  if (f != null) {\n");
     } else {
@@ -3078,13 +2569,7 @@
         case FieldDescriptor::CPPTYPE_INT64:
         case FieldDescriptor::CPPTYPE_UINT32:
         case FieldDescriptor::CPPTYPE_UINT64: {
-          if (IsIntegralFieldWithStringJSType(field)) {
-            // We can use `parseInt` here even though it will not be precise for
-            // 64-bit quantities because we are only testing for zero/nonzero,
-            // and JS numbers (64-bit floating point values, i.e., doubles) are
-            // integer-precise in the range that includes zero.
-            printer->Print("  if (parseInt(f, 10) !== 0) {\n");
-          } else {
+          {
             printer->Print("  if (f !== 0) {\n");
           }
           break;
@@ -3111,47 +2596,23 @@
     }
   }
 
-  // Write the field on the wire.
-  if (IsMap(options, field)) {
-    const FieldDescriptor* key_field = MapFieldKey(field);
-    const FieldDescriptor* value_field = MapFieldValue(field);
-    printer->Print(
-        "    f.serializeBinary($index$, writer, "
-                              "$keyWriterFn$, $valueWriterFn$",
-        "index", SimpleItoa(field->number()),
-        "keyWriterFn", JSBinaryWriterMethodName(options, key_field),
-        "valueWriterFn", JSBinaryWriterMethodName(options, value_field));
-
-    if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      printer->Print(", $messageType$.serializeBinaryToWriter",
-          "messageType", GetMessagePath(options, value_field->message_type()));
-    }
-
-    printer->Print(");\n");
-  } else {
-    printer->Print(
-        "    writer.write$method$(\n"
-        "      $index$,\n"
-        "      f",
-        "method", JSBinaryReadWriteMethodName(field, /* is_writer = */ true),
-        "index", SimpleItoa(field->number()));
-
-    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
-        !IsMap(options, field)) {
-      printer->Print(
-          ",\n"
-          "      $submsg$.serializeBinaryToWriter\n",
-        "submsg", SubmessageTypeRef(options, field));
-    } else {
-      printer->Print("\n");
-    }
-
-    printer->Print(
-        "    );\n");
-  }
-
-  // Close the `if`.
   printer->Print(
+      "    writer.$writer$(\n"
+      "      $index$,\n"
+      "      f",
+      "writer", JSBinaryWriterMethodName(field),
+      "index", SimpleItoa(field->number()));
+
+  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+    printer->Print(
+        ",\n"
+        "      $submsg$.serializeBinaryToWriter\n",
+        "submsg", SubmessageTypeRef(options, field));
+  } else {
+    printer->Print("\n");
+  }
+  printer->Print(
+      "    );\n"
       "  }\n");
 }
 
@@ -3162,10 +2623,8 @@
       "/**\n"
       " * @enum {number}\n"
       " */\n"
-      "$enumprefix$$name$ = {\n",
-      "enumprefix", GetEnumPathPrefix(options, enumdesc),
-      "name", enumdesc->name());
-  printer->Annotate("name", enumdesc);
+      "$name$ = {\n",
+      "name", GetPath(options, enumdesc));
 
   for (int i = 0; i < enumdesc->value_count(); i++) {
     const EnumValueDescriptor* value = enumdesc->value(i);
@@ -3174,7 +2633,6 @@
         "name", ToEnumCase(value->name()),
         "value", SimpleItoa(value->number()),
         "comma", (i == enumdesc->value_count() - 1) ? "" : ",");
-    printer->Annotate("name", value);
   }
 
   printer->Print(
@@ -3186,9 +2644,9 @@
                                   io::Printer* printer,
                                   const FieldDescriptor* field) const {
   string extension_scope =
-      (field->extension_scope()
-           ? GetMessagePath(options, field->extension_scope())
-           : GetFilePath(options, field->file()));
+      (field->extension_scope() ?
+       GetPath(options, field->extension_scope()) :
+       GetPath(options, field->file()));
 
   printer->Print(
       "\n"
@@ -3198,11 +2656,11 @@
       " * @type {!jspb.ExtensionFieldInfo.<$extensionType$>}\n"
       " */\n"
       "$class$.$name$ = new jspb.ExtensionFieldInfo(\n",
-      "name", JSObjectFieldName(options, field),
+      "name", JSObjectFieldName(field),
       "class", extension_scope,
       "extensionType", JSFieldTypeAnnotation(
           options, field,
-          /* is_setter_argument = */ false,
+          /* force_optional = */ false,
           /* force_present = */ true,
           /* singular_if_not_packed = */ false));
   printer->Print(
@@ -3212,9 +2670,9 @@
       "     /** @type {?function((boolean|undefined),!jspb.Message=): "
       "!Object} */ (\n"
       "         $toObject$),\n"
-      "    $repeated$);\n",
+      "    $repeated$",
       "index", SimpleItoa(field->number()),
-      "name", JSObjectFieldName(options, field),
+      "name", JSObjectFieldName(field),
       "ctor", (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ?
                SubmessageTypeRef(options, field) : string("null")),
       "toObject", (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ?
@@ -3222,30 +2680,28 @@
                    string("null")),
       "repeated", (field->is_repeated() ? "1" : "0"));
 
-  printer->Print(
-      "\n"
-      "$extendName$Binary[$index$] = new jspb.ExtensionFieldBinaryInfo(\n"
-      "    $class$.$name$,\n"
-      "    $binaryReaderFn$,\n"
-      "    $binaryWriterFn$,\n"
-      "    $binaryMessageSerializeFn$,\n"
-      "    $binaryMessageDeserializeFn$,\n",
-      "extendName",
-      JSExtensionsObjectName(options, field->file(), field->containing_type()),
-      "index", SimpleItoa(field->number()), "class", extension_scope, "name",
-      JSObjectFieldName(options, field), "binaryReaderFn",
-      JSBinaryReaderMethodName(options, field), "binaryWriterFn",
-      JSBinaryWriterMethodName(options, field), "binaryMessageSerializeFn",
-      (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE)
-          ? (SubmessageTypeRef(options, field) + ".serializeBinaryToWriter")
-          : "undefined",
-      "binaryMessageDeserializeFn",
-      (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE)
-          ? (SubmessageTypeRef(options, field) + ".deserializeBinaryFromReader")
-          : "undefined");
-
-  printer->Print("    $isPacked$);\n", "isPacked",
-                 (field->is_packed() ? "true" : "false"));
+  if (options.binary) {
+    printer->Print(
+        ",\n"
+        "    jspb.BinaryReader.prototype.$binaryReaderFn$,\n"
+        "    jspb.BinaryWriter.prototype.$binaryWriterFn$,\n"
+        "    $binaryMessageSerializeFn$,\n"
+        "    $binaryMessageDeserializeFn$,\n"
+        "    $isPacked$);\n",
+        "binaryReaderFn", JSBinaryReaderMethodName(field),
+        "binaryWriterFn", JSBinaryWriterMethodName(field),
+        "binaryMessageSerializeFn",
+        (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ?
+        (SubmessageTypeRef(options, field) +
+         ".serializeBinaryToWriter") : "null",
+        "binaryMessageDeserializeFn",
+        (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ?
+        (SubmessageTypeRef(options, field) +
+         ".deserializeBinaryFromReader") : "null",
+        "isPacked", (field->is_packed() ? "true" : "false"));
+  } else {
+    printer->Print(");\n");
+  }
 
   printer->Print(
       "// This registers the extension field with the extended class, so that\n"
@@ -3256,11 +2712,11 @@
                                            field->containing_type()),
       "index", SimpleItoa(field->number()),
       "class", extension_scope,
-      "name", JSObjectFieldName(options, field));
+      "name", JSObjectFieldName(field));
 }
 
 bool GeneratorOptions::ParseFromOptions(
-    const std::vector< std::pair< string, string > >& options,
+    const vector< pair< string, string > >& options,
     string* error) {
   for (int i = 0; i < options.size(); i++) {
     if (options[i].first == "add_require_for_enums") {
@@ -3295,31 +2751,17 @@
       library = options[i].second;
     } else if (options[i].first == "import_style") {
       if (options[i].second == "closure") {
-        import_style = kImportClosure;
+        import_style = IMPORT_CLOSURE;
       } else if (options[i].second == "commonjs") {
-        import_style = kImportCommonJs;
+        import_style = IMPORT_COMMONJS;
       } else if (options[i].second == "browser") {
-        import_style = kImportBrowser;
+        import_style = IMPORT_BROWSER;
       } else if (options[i].second == "es6") {
-        import_style = kImportEs6;
+        import_style = IMPORT_ES6;
       } else {
         *error = "Unknown import style " + options[i].second + ", expected " +
                  "one of: closure, commonjs, browser, es6.";
       }
-    } else if (options[i].first == "extension") {
-      extension = options[i].second;
-    } else if (options[i].first == "one_output_file_per_input_file") {
-      if (!options[i].second.empty()) {
-        *error = "Unexpected option value for one_output_file_per_input_file";
-        return false;
-      }
-      one_output_file_per_input_file = true;
-    } else if (options[i].first == "annotate_code") {
-      if (!options[i].second.empty()) {
-        *error = "Unexpected option value for annotate_code";
-        return false;
-      }
-      annotate_code = true;
     } else {
       // Assume any other option is an output directory, as long as it is a bare
       // `key` rather than a `key=value` option.
@@ -3331,40 +2773,18 @@
     }
   }
 
-  if (import_style != kImportClosure &&
-      (add_require_for_enums || testonly || !library.empty() ||
-       error_on_name_conflict || extension != ".js" ||
-       one_output_file_per_input_file)) {
-    *error =
-        "The add_require_for_enums, testonly, library, error_on_name_conflict, "
-        "extension, and one_output_file_per_input_file options should only be "
-        "used for import_style=closure";
-    return false;
+  if (!library.empty() && import_style != IMPORT_CLOSURE) {
+    *error = "The library option should only be used for "
+             "import_style=closure";
   }
 
   return true;
 }
 
-GeneratorOptions::OutputMode GeneratorOptions::output_mode() const {
-  // We use one output file per input file if we are not using Closure or if
-  // this is explicitly requested.
-  if (import_style != kImportClosure || one_output_file_per_input_file) {
-    return kOneOutputFilePerInputFile;
-  }
-
-  // If a library name is provided, we put everything in that one file.
-  if (!library.empty()) {
-    return kEverythingInOneFile;
-  }
-
-  // Otherwise, we create one output file per type.
-  return kOneOutputFilePerType;
-}
-
 void Generator::GenerateFilesInDepOrder(
     const GeneratorOptions& options,
     io::Printer* printer,
-    const std::vector<const FileDescriptor*>& files) const {
+    const 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.
   std::set<const FileDescriptor*> all_files(files.begin(), files.end());
@@ -3407,7 +2827,7 @@
   GenerateHeader(options, printer);
 
   // Generate "require" statements.
-  if (options.import_style == GeneratorOptions::kImportCommonJs) {
+  if (options.import_style == GeneratorOptions::IMPORT_COMMONJS) {
     printer->Print("var jspb = require('google-protobuf');\n");
     printer->Print("var goog = jspb;\n");
     printer->Print("var global = Function('return this')();\n\n");
@@ -3417,62 +2837,52 @@
       printer->Print(
           "var $alias$ = require('$file$');\n",
           "alias", ModuleAlias(name),
-          "file",
-          GetRootPath(file->name(), name) + GetJSFilename(options, name));
+          "file", GetRootPath(file->name()) + GetJSFilename(name));
     }
   }
 
-  std::set<string> provided;
-  std::set<const FieldDescriptor*> extensions;
+  // We aren't using Closure's import system, but we use goog.exportSymbol()
+  // to construct the expected tree of objects, eg.
+  //
+  //   goog.exportSymbol('foo.bar.Baz', null, this);
+  //
+  //   // Later generated code expects foo.bar = {} to exist:
+  //   foo.bar.Baz = function() { /* ... */ }
+  set<string> provided;
+
+  // Cover the case where this file declares extensions but no messages.
+  // This will ensure that the file-level object will be declared to hold
+  // the extensions.
   for (int i = 0; i < file->extension_count(); i++) {
-    // We honor the jspb::ignore option here only when working with
-    // Closure-style imports. Use of this option is discouraged and so we want
-    // to avoid adding new support for it.
-    if (options.import_style == GeneratorOptions::kImportClosure &&
-        IgnoreField(file->extension(i))) {
-      continue;
-    }
-    provided.insert(GetFilePath(options, file) + "." +
-                    JSObjectFieldName(options, file->extension(i)));
-    extensions.insert(file->extension(i));
+    provided.insert(file->extension(i)->full_name());
   }
 
   FindProvidesForFile(options, printer, file, &provided);
-  GenerateProvides(options, printer, &provided);
-  std::vector<const FileDescriptor*> files;
-  files.push_back(file);
-  if (options.import_style == GeneratorOptions::kImportClosure) {
-    GenerateRequiresForLibrary(options, printer, files, &provided);
+  for (std::set<string>::iterator it = provided.begin();
+       it != provided.end(); ++it) {
+    printer->Print("goog.exportSymbol('$name$', null, global);\n",
+                   "name", *it);
   }
 
   GenerateClassesAndEnums(options, printer, file);
 
-  // Generate code for top-level extensions. Extensions nested inside messages
-  // are emitted inside GenerateClassesAndEnums().
-  for (std::set<const FieldDescriptor*>::const_iterator it = extensions.begin();
-       it != extensions.end(); ++it) {
-    GenerateExtension(options, printer, *it);
+  // Extensions nested inside messages are emitted inside
+  // GenerateClassesAndEnums().
+  for (int i = 0; i < file->extension_count(); i++) {
+    GenerateExtension(options, printer, file->extension(i));
   }
 
-  if (options.import_style == GeneratorOptions::kImportCommonJs) {
+  if (options.import_style == GeneratorOptions::IMPORT_COMMONJS) {
     printer->Print("goog.object.extend(exports, $package$);\n",
-                   "package", GetFilePath(options, file));
-  }
-
-  // Emit well-known type methods.
-  for (FileToc* toc = well_known_types_js; toc->name != NULL; toc++) {
-    string name = string("google/protobuf/") + toc->name;
-    if (name == StripProto(file->name()) + ".js") {
-      printer->Print(toc->data);
-    }
+                   "package", GetPath(options, file));
   }
 }
 
-bool Generator::GenerateAll(const std::vector<const FileDescriptor*>& files,
+bool Generator::GenerateAll(const vector<const FileDescriptor*>& files,
                             const string& parameter,
                             GeneratorContext* context,
                             string* error) const {
-  std::vector< std::pair< string, string > > option_pairs;
+  vector< pair< string, string > > option_pairs;
   ParseGeneratorParameter(parameter, &option_pairs);
   GeneratorOptions options;
   if (!options.ParseFromOptions(option_pairs, error)) {
@@ -3480,17 +2890,22 @@
   }
 
 
-  if (options.output_mode() == GeneratorOptions::kEverythingInOneFile) {
+  // There are three schemes for where output files go:
+  //
+  // - import_style = IMPORT_CLOSURE, library non-empty: all output in one file
+  // - import_style = IMPORT_CLOSURE, library empty: one output file per type
+  // - import_style != IMPORT_CLOSURE: one output file per .proto file
+  if (options.import_style == GeneratorOptions::IMPORT_CLOSURE &&
+      options.library != "") {
     // All output should go in a single file.
-    string filename = options.output_dir + "/" + options.library +
-                      options.GetFileNameExtension();
+    string filename = options.output_dir + "/" + options.library + ".js";
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
     GOOGLE_CHECK(output.get());
     io::Printer printer(output.get(), '$');
 
     // Pull out all extensions -- we need these to generate all
     // provides/requires.
-    std::vector<const FieldDescriptor*> extensions;
+    vector<const FieldDescriptor*> extensions;
     for (int i = 0; i < files.size(); i++) {
       for (int j = 0; j < files[i]->extension_count(); j++) {
         const FieldDescriptor* extension = files[i]->extension(j);
@@ -3518,8 +2933,8 @@
     if (printer.failed()) {
       return false;
     }
-  } else if (options.output_mode() == GeneratorOptions::kOneOutputFilePerType) {
-    std::set<const void*> allowed_set;
+  } else if (options.import_style == GeneratorOptions::IMPORT_CLOSURE) {
+    set<const void*> allowed_set;
     if (!GenerateJspbAllowedSet(options, files, &allowed_set, error)) {
       return false;
     }
@@ -3590,7 +3005,7 @@
         GenerateHeader(options, &printer);
 
         std::set<string> provided;
-        std::vector<const FieldDescriptor*> fields;
+        vector<const FieldDescriptor*> fields;
 
         for (int j = 0; j < files[i]->extension_count(); j++) {
           if (ShouldGenerateExtension(files[i]->extension(j))) {
@@ -3610,37 +3025,25 @@
         }
       }
     }
-  } else /* options.output_mode() == kOneOutputFilePerInputFile */ {
+  } else {
     // Generate one output file per input (.proto) file.
 
     for (int i = 0; i < files.size(); i++) {
       const google::protobuf::FileDescriptor* file = files[i];
 
-      string filename =
-          options.output_dir + "/" + GetJSFilename(options, file->name());
+      string filename = options.output_dir + "/" + GetJSFilename(file->name());
       google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
       GOOGLE_CHECK(output.get());
-      GeneratedCodeInfo annotations;
-      io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
-          &annotations);
-      io::Printer printer(output.get(), '$',
-                          options.annotate_code ? &annotation_collector : NULL);
-
+      io::Printer printer(output.get(), '$');
 
       GenerateFile(options, &printer, file);
 
       if (printer.failed()) {
         return false;
       }
-
-      if (options.annotate_code) {
-        const string meta_file = filename + ".meta";
-        google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> info_output(
-          context->Open(meta_file));
-        annotations.SerializeToZeroCopyStream(info_output.get());
-      }
     }
   }
+
   return true;
 }
 
diff --git a/src/google/protobuf/compiler/js/js_generator.h b/src/google/protobuf/compiler/js/js_generator.h
index 3cc60e2..6fd7ca5 100755
--- a/src/google/protobuf/compiler/js/js_generator.h
+++ b/src/google/protobuf/compiler/js/js_generator.h
@@ -28,16 +28,12 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Generates JavaScript code for a given .proto file.
-//
 #ifndef GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
 #define GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
 
 #include <string>
 #include <set>
 
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/compiler/code_generator.h>
 
 namespace google {
@@ -55,79 +51,45 @@
 namespace js {
 
 struct GeneratorOptions {
+  // Add a `goog.requires()` call for each enum type used. If not set, a forward
+  // declaration with `goog.forwardDeclare` is produced instead.
+  bool add_require_for_enums;
+  // Set this as a test-only module via `goog.setTestOnly();`.
+  bool testonly;
   // Output path.
   string output_dir;
   // Namespace prefix.
   string namespace_prefix;
-  // Enable binary-format support?
-  bool binary;
-  // What style of imports should be used.
-  enum ImportStyle {
-    kImportClosure,   // goog.require()
-    kImportCommonJs,  // require()
-    kImportBrowser,   // no import statements
-    kImportEs6,       // import { member } from ''
-  } import_style;
-
-  GeneratorOptions()
-      : output_dir("."),
-        namespace_prefix(""),
-        binary(false),
-        import_style(kImportClosure),
-        add_require_for_enums(false),
-        testonly(false),
-        library(""),
-        error_on_name_conflict(false),
-        extension(".js"),
-        one_output_file_per_input_file(false),
-        annotate_code(false) {}
-
-  bool ParseFromOptions(
-      const std::vector< std::pair< string, string > >& options,
-      string* error);
-
-  // Returns the file name extension to use for generated code.
-  string GetFileNameExtension() const {
-    return import_style == kImportClosure ? extension : "_pb.js";
-  }
-
-  enum OutputMode {
-    // Create an output file for each input .proto file.
-    kOneOutputFilePerInputFile,
-    // Create an output file for each type.
-    kOneOutputFilePerType,
-    // Put everything in a single file named by the library option.
-    kEverythingInOneFile,
-  };
-
-  // Indicates how to output the generated code based on the provided options.
-  OutputMode output_mode() const;
-
-  // The remaining options are only relevant when we are using kImportClosure.
-
-  // Add a `goog.requires()` call for each enum type used. If not set, a
-  // forward declaration with `goog.forwardDeclare` is produced instead.
-  bool add_require_for_enums;
-  // Set this as a test-only module via `goog.setTestOnly();`.
-  bool testonly;
   // Create a library with name <name>_lib.js rather than a separate .js file
   // per type?
   string library;
   // Error if there are two types that would generate the same output file?
   bool error_on_name_conflict;
-  // The extension to use for output file names.
-  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.
-  bool annotate_code;
+  // Enable binary-format support?
+  bool binary;
+  // What style of imports should be used.
+  enum ImportStyle {
+    IMPORT_CLOSURE,    // goog.require()
+    IMPORT_COMMONJS,   // require()
+    IMPORT_BROWSER,    // no import statements
+    IMPORT_ES6,        // import { member } from ''
+  } import_style;
+
+  GeneratorOptions()
+      : add_require_for_enums(false),
+        testonly(false),
+        output_dir("."),
+        namespace_prefix(""),
+        library(""),
+        error_on_name_conflict(false),
+        binary(false),
+        import_style(IMPORT_CLOSURE) {}
+
+  bool ParseFromOptions(
+      const vector< pair< string, string > >& options,
+      string* error);
 };
 
-// CodeGenerator implementation which generates a JavaScript source file and
-// header.  If you create your own protocol compiler binary and you want it to
-// support JavaScript output, you can do so by registering an instance of this
-// CodeGenerator with the CommandLineInterface in your main() function.
 class LIBPROTOC_EXPORT Generator : public CodeGenerator {
  public:
   Generator() {}
@@ -143,7 +105,7 @@
 
   virtual bool HasGenerateAll() const { return true; }
 
-  virtual bool GenerateAll(const std::vector<const FileDescriptor*>& files,
+  virtual bool GenerateAll(const vector<const FileDescriptor*>& files,
                            const string& parameter,
                            GeneratorContext* context,
                            string* error) const;
@@ -155,7 +117,7 @@
   // Generate goog.provides() calls.
   void FindProvides(const GeneratorOptions& options,
                     io::Printer* printer,
-                    const std::vector<const FileDescriptor*>& file,
+                    const vector<const FileDescriptor*>& file,
                     std::set<string>* provided) const;
   void FindProvidesForFile(const GeneratorOptions& options,
                            io::Printer* printer,
@@ -172,7 +134,7 @@
   // For extension fields at file scope.
   void FindProvidesForFields(const GeneratorOptions& options,
                              io::Printer* printer,
-                             const std::vector<const FieldDescriptor*>& fields,
+                             const vector<const FieldDescriptor*>& fields,
                              std::set<string>* provided) const;
   // Print the goog.provides() found by the methods above.
   void GenerateProvides(const GeneratorOptions& options,
@@ -184,10 +146,10 @@
                         io::Printer* printer) const;
 
   // Generate goog.requires() calls.
-  void GenerateRequiresForLibrary(
-      const GeneratorOptions& options, io::Printer* printer,
-      const std::vector<const FileDescriptor*>& files,
-      std::set<string>* provided) const;
+  void GenerateRequiresForLibrary(const GeneratorOptions& options,
+                                  io::Printer* printer,
+                                  const vector<const FileDescriptor*>& files,
+                                  std::set<string>* provided) const;
   void GenerateRequiresForMessage(const GeneratorOptions& options,
                         io::Printer* printer,
                         const Descriptor* desc,
@@ -195,13 +157,15 @@
   // For extension fields at file scope.
   void GenerateRequiresForExtensions(
       const GeneratorOptions& options, io::Printer* printer,
-      const std::vector<const FieldDescriptor*>& fields,
+      const vector<const FieldDescriptor*>& fields,
       std::set<string>* provided) const;
   void GenerateRequiresImpl(const GeneratorOptions& options,
-                            io::Printer* printer, std::set<string>* required,
+                            io::Printer* printer,
+                            std::set<string>* required,
                             std::set<string>* forwards,
-                            std::set<string>* provided, bool require_jspb,
-                            bool require_extension, bool require_map) const;
+                            std::set<string>* provided,
+                            bool require_jspb,
+                            bool require_extension) const;
   void FindRequiresForMessage(const GeneratorOptions& options,
                               const Descriptor* desc,
                               std::set<string>* required,
@@ -222,9 +186,9 @@
 
   // Generate definitions for all message classes and enums in all files,
   // processing the files in dependence order.
-  void GenerateFilesInDepOrder(
-      const GeneratorOptions& options, io::Printer* printer,
-      const std::vector<const FileDescriptor*>& file) const;
+  void GenerateFilesInDepOrder(const GeneratorOptions& options,
+                               io::Printer* printer,
+                               const vector<const FileDescriptor*>& file) const;
   // Helper for above.
   void GenerateFileAndDeps(const GeneratorOptions& options,
                            io::Printer* printer,
@@ -237,11 +201,6 @@
                                io::Printer* printer,
                                const FileDescriptor* file) const;
 
-  void GenerateFieldValueExpression(io::Printer* printer,
-                                    const char* obj_reference,
-                                    const FieldDescriptor* field,
-                                    bool use_default) const;
-
   // Generate definition for one class.
   void GenerateClass(const GeneratorOptions& options,
                      io::Printer* printer,
@@ -311,17 +270,6 @@
                          io::Printer* printer,
                          const FieldDescriptor* field) const;
 
-  // Generate addFoo() method for repeated primitive fields.
-  void GenerateRepeatedPrimitiveHelperMethods(const GeneratorOptions& options,
-                                              io::Printer* printer,
-                                              const FieldDescriptor* field,
-                                              bool untyped) const;
-
-  // Generate addFoo() method for repeated message fields.
-  void GenerateRepeatedMessageHelperMethods(const GeneratorOptions& options,
-                                            io::Printer* printer,
-                                            const FieldDescriptor* field) const;
-
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator);
 };
 
diff --git a/src/google/protobuf/compiler/js/well_known_types/any.js b/src/google/protobuf/compiler/js/well_known_types/any.js
deleted file mode 100644
index d7ca6e3..0000000
--- a/src/google/protobuf/compiler/js/well_known_types/any.js
+++ /dev/null
@@ -1,80 +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.
-
-/* This code will be inserted into generated code for
- * google/protobuf/any.proto. */
-
-/**
- * Returns the type name contained in this instance, if any.
- * @return {string|undefined}
- */
-proto.google.protobuf.Any.prototype.getTypeName = function() {
-  return this.getTypeUrl().split('/').pop();
-};
-
-
-/**
- * Packs the given message instance into this Any.
- * @param {!Uint8Array} serialized The serialized data to pack.
- * @param {string} name The type name of this message object.
- * @param {string=} opt_typeUrlPrefix the type URL prefix.
- */
-proto.google.protobuf.Any.prototype.pack = function(serialized, name,
-                                                    opt_typeUrlPrefix) {
-  if (!opt_typeUrlPrefix) {
-    opt_typeUrlPrefix = 'type.googleapis.com/';
-  }
-
-  if (opt_typeUrlPrefix.substr(-1) != '/') {
-    this.setTypeUrl(opt_typeUrlPrefix + '/' + name);
-  } else {
-    this.setTypeUrl(opt_typeUrlPrefix + name);
-  }
-
-  this.setValue(serialized);
-};
-
-
-/**
- * @template T
- * Unpacks this Any into the given message object.
- * @param {function(Uint8Array):T} deserialize Function that will deserialize
- *     the binary data properly.
- * @param {string} name The expected type name of this message object.
- * @return {?T} If the name matched the expected name, returns the deserialized
- *     object, otherwise returns null.
- */
-proto.google.protobuf.Any.prototype.unpack = function(deserialize, name) {
-  if (this.getTypeName() == name) {
-    return deserialize(this.getValue_asU8());
-  } else {
-    return null;
-  }
-};
diff --git a/src/google/protobuf/compiler/js/well_known_types/struct.js b/src/google/protobuf/compiler/js/well_known_types/struct.js
deleted file mode 100644
index 30e3d02..0000000
--- a/src/google/protobuf/compiler/js/well_known_types/struct.js
+++ /dev/null
@@ -1,168 +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.
-
-/* This code will be inserted into generated code for
- * google/protobuf/struct.proto. */
-
-/**
- * Typedef representing plain JavaScript values that can go into a
- *     Struct.
- * @typedef {null|number|string|boolean|Array|Object}
- */
-proto.google.protobuf.JavaScriptValue;
-
-
-/**
- * Converts this Value object to a plain JavaScript value.
- * @return {?proto.google.protobuf.JavaScriptValue} a plain JavaScript
- *     value representing this Struct.
- */
-proto.google.protobuf.Value.prototype.toJavaScript = function() {
-  var kindCase = proto.google.protobuf.Value.KindCase;
-  switch (this.getKindCase()) {
-    case kindCase.NULL_VALUE:
-      return null;
-    case kindCase.NUMBER_VALUE:
-      return this.getNumberValue();
-    case kindCase.STRING_VALUE:
-      return this.getStringValue();
-    case kindCase.BOOL_VALUE:
-      return this.getBoolValue();
-    case kindCase.STRUCT_VALUE:
-      return this.getStructValue().toJavaScript();
-    case kindCase.LIST_VALUE:
-      return this.getListValue().toJavaScript();
-    default:
-      throw new Error('Unexpected struct type');
-  }
-};
-
-
-/**
- * Converts this JavaScript value to a new Value proto.
- * @param {!proto.google.protobuf.JavaScriptValue} value The value to
- *     convert.
- * @return {!proto.google.protobuf.Value} The newly constructed value.
- */
-proto.google.protobuf.Value.fromJavaScript = function(value) {
-  var ret = new proto.google.protobuf.Value();
-  switch (goog.typeOf(value)) {
-    case 'string':
-      ret.setStringValue(/** @type {string} */ (value));
-      break;
-    case 'number':
-      ret.setNumberValue(/** @type {number} */ (value));
-      break;
-    case 'boolean':
-      ret.setBoolValue(/** @type {boolean} */ (value));
-      break;
-    case 'null':
-      ret.setNullValue(proto.google.protobuf.NullValue.NULL_VALUE);
-      break;
-    case 'array':
-      ret.setListValue(proto.google.protobuf.ListValue.fromJavaScript(
-          /** @type{!Array} */ (value)));
-      break;
-    case 'object':
-      ret.setStructValue(proto.google.protobuf.Struct.fromJavaScript(
-          /** @type{!Object} */ (value)));
-      break;
-    default:
-      throw new Error('Unexpected struct type.');
-  }
-
-  return ret;
-};
-
-
-/**
- * Converts this ListValue object to a plain JavaScript array.
- * @return {!Array} a plain JavaScript array representing this List.
- */
-proto.google.protobuf.ListValue.prototype.toJavaScript = function() {
-  var ret = [];
-  var values = this.getValuesList();
-
-  for (var i = 0; i < values.length; i++) {
-    ret[i] = values[i].toJavaScript();
-  }
-
-  return ret;
-};
-
-
-/**
- * Constructs a ListValue protobuf from this plain JavaScript array.
- * @param {!Array} array a plain JavaScript array
- * @return {proto.google.protobuf.ListValue} a new ListValue object
- */
-proto.google.protobuf.ListValue.fromJavaScript = function(array) {
-  var ret = new proto.google.protobuf.ListValue();
-
-  for (var i = 0; i < array.length; i++) {
-    ret.addValues(proto.google.protobuf.Value.fromJavaScript(array[i]));
-  }
-
-  return ret;
-};
-
-
-/**
- * Converts this Struct object to a plain JavaScript object.
- * @return {!Object<string, !proto.google.protobuf.JavaScriptValue>} a plain
- *     JavaScript object representing this Struct.
- */
-proto.google.protobuf.Struct.prototype.toJavaScript = function() {
-  var ret = {};
-
-  this.getFieldsMap().forEach(function(value, key) {
-    ret[key] = value.toJavaScript();
-  });
-
-  return ret;
-};
-
-
-/**
- * Constructs a Struct protobuf from this plain JavaScript object.
- * @param {!Object} obj a plain JavaScript object
- * @return {proto.google.protobuf.Struct} a new Struct object
- */
-proto.google.protobuf.Struct.fromJavaScript = function(obj) {
-  var ret = new proto.google.protobuf.Struct();
-  var map = ret.getFieldsMap();
-
-  for (var property in obj) {
-    var val = obj[property];
-    map.set(property, proto.google.protobuf.Value.fromJavaScript(val));
-  }
-
-  return ret;
-};
diff --git a/src/google/protobuf/compiler/js/well_known_types/timestamp.js b/src/google/protobuf/compiler/js/well_known_types/timestamp.js
deleted file mode 100644
index b7e43f1..0000000
--- a/src/google/protobuf/compiler/js/well_known_types/timestamp.js
+++ /dev/null
@@ -1,53 +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.
-
-/* This code will be inserted into generated code for
- * google/protobuf/timestamp.proto. */
-
-/**
- * Returns a JavaScript 'Date' object corresponding to this Timestamp.
- * @return {!Date}
- */
-proto.google.protobuf.Timestamp.prototype.toDate = function() {
-  var seconds = this.getSeconds();
-  var nanos = this.getNanos();
-
-  return new Date((seconds * 1000) + (nanos / 1000000));
-};
-
-
-/**
- * Sets the value of this Timestamp object to be the given Date.
- * @param {!Date} value The value to set.
- */
-proto.google.protobuf.Timestamp.prototype.fromDate = function(value) {
-  this.setSeconds(Math.floor(value.getTime() / 1000));
-  this.setNanos(value.getMilliseconds() * 1000000);
-};
diff --git a/src/google/protobuf/compiler/js/well_known_types_embed.h b/src/google/protobuf/compiler/js/well_known_types_embed.h
deleted file mode 100644
index 174c665..0000000
--- a/src/google/protobuf/compiler/js/well_known_types_embed.h
+++ /dev/null
@@ -1,43 +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.
-
-#ifndef GOOGLE_PROTOBUF_COMPILER_JS_WELL_KNOWN_TYPES_EMBED_H__
-#define GOOGLE_PROTOBUF_COMPILER_JS_WELL_KNOWN_TYPES_EMBED_H__
-
-#include <stddef.h>
-
-struct FileToc {
-  const char* name;
-  const char* data;
-};
-
-extern struct FileToc well_known_types_js[];
-
-#endif  // GOOGLE_PROTOBUF_COMPILER_JS_WELL_KNOWN_TYPES_EMBED_H__
diff --git a/src/google/protobuf/compiler/main.cc b/src/google/protobuf/compiler/main.cc
index 8960582..400c556 100644
--- a/src/google/protobuf/compiler/main.cc
+++ b/src/google/protobuf/compiler/main.cc
@@ -32,21 +32,14 @@
 
 #include <google/protobuf/compiler/command_line_interface.h>
 #include <google/protobuf/compiler/cpp/cpp_generator.h>
-
-#ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
 #include <google/protobuf/compiler/python/python_generator.h>
 #include <google/protobuf/compiler/java/java_generator.h>
-#endif  // ! OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
-
-#ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
-#include <google/protobuf/compiler/csharp/csharp_generator.h>
 #include <google/protobuf/compiler/javamicro/javamicro_generator.h>
 #include <google/protobuf/compiler/javanano/javanano_generator.h>
-#include <google/protobuf/compiler/js/js_generator.h>
-#include <google/protobuf/compiler/objectivec/objectivec_generator.h>
-#include <google/protobuf/compiler/php/php_generator.h>
 #include <google/protobuf/compiler/ruby/ruby_generator.h>
-#endif  // ! OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
+#include <google/protobuf/compiler/csharp/csharp_generator.h>
+#include <google/protobuf/compiler/objectivec/objectivec_generator.h>
+#include <google/protobuf/compiler/js/js_generator.h>
 
 int main(int argc, char* argv[]) {
 
@@ -58,15 +51,12 @@
   cli.RegisterGenerator("--cpp_out", "--cpp_opt", &cpp_generator,
                         "Generate C++ header and source.");
 
-#ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
   // Proto2 Java
   google::protobuf::compiler::java::JavaGenerator java_generator;
-  cli.RegisterGenerator("--java_out", "--java_opt", &java_generator,
+  cli.RegisterGenerator("--java_out", &java_generator,
                         "Generate Java source file.");
-#endif  // !OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
 
 
-#ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
   // Proto2 Python
   google::protobuf::compiler::python::Generator py_generator;
   cli.RegisterGenerator("--python_out", &py_generator,
@@ -82,11 +72,6 @@
   cli.RegisterGenerator("--javamicro_out", &javamicro_generator,
                         "Generate Java Micro source file.");
 
-  // PHP
-  google::protobuf::compiler::php::Generator php_generator;
-  cli.RegisterGenerator("--php_out", &php_generator,
-                        "Generate PHP source file.");
-
   // Ruby
   google::protobuf::compiler::ruby::Generator rb_generator;
   cli.RegisterGenerator("--ruby_out", &rb_generator,
@@ -106,7 +91,6 @@
   google::protobuf::compiler::js::Generator js_generator;
   cli.RegisterGenerator("--js_out", &js_generator,
                         "Generate JavaScript source.");
-#endif  // !OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP
 
   return cli.Run(argc, argv);
 }
diff --git a/src/google/protobuf/compiler/mock_code_generator.cc b/src/google/protobuf/compiler/mock_code_generator.cc
index bfcb83d..82bb342 100644
--- a/src/google/protobuf/compiler/mock_code_generator.cc
+++ b/src/google/protobuf/compiler/mock_code_generator.cc
@@ -40,39 +40,28 @@
 #endif
 #include <vector>
 
-
-#include <google/protobuf/stubs/strutil.h>
-
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/plugin.pb.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
-#include <google/protobuf/text_format.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 #include <gtest/gtest.h>
 
-#ifdef major
-#undef major
-#endif
-#ifdef minor
-#undef minor
-#endif
-
 namespace google {
 namespace protobuf {
 namespace compiler {
 
 // Returns the list of the names of files in all_files in the form of a
 // comma-separated string.
-string CommaSeparatedList(const std::vector<const FileDescriptor*> all_files) {
-  std::vector<string> names;
-  for (size_t i = 0; i < all_files.size(); i++) {
+string CommaSeparatedList(const vector<const FileDescriptor*> all_files) {
+  vector<string> names;
+  for (int i = 0; i < all_files.size(); i++) {
     names.push_back(all_files[i]->name());
   }
   return Join(names, ",");
@@ -103,17 +92,16 @@
       File::GetContents(output_directory + "/" + GetOutputFileName(name, file),
                         &content, true));
 
-  std::vector<string> lines =
-      Split(content, "\n", true);
+  vector<string> lines = Split(content, "\n", true);
 
   while (!lines.empty() && lines.back().empty()) {
     lines.pop_back();
   }
-  for (size_t i = 0; i < lines.size(); i++) {
+  for (int i = 0; i < lines.size(); i++) {
     lines[i] += "\n";
   }
 
-  std::vector<string> insertion_list;
+  vector<string> insertion_list;
   if (!insertions.empty()) {
     SplitStringUsing(insertions, ",", &insertion_list);
   }
@@ -126,7 +114,7 @@
   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++) {
+  for (int i = 0; i < insertion_list.size(); i++) {
     EXPECT_EQ(GetOutputFileContent(insertion_list[i], "first_insert",
                                    file, file, first_message_name),
               lines[1 + i]);
@@ -138,48 +126,11 @@
   }
 }
 
-namespace {
-void CheckSingleAnnotation(const string& expected_file,
-                           const string& expected_text,
-                           const string& file_content,
-                           const GeneratedCodeInfo::Annotation& annotation) {
-  EXPECT_EQ(expected_file, annotation.source_file());
-  ASSERT_GE(file_content.size(), annotation.begin());
-  ASSERT_GE(file_content.size(), annotation.end());
-  ASSERT_LE(annotation.begin(), annotation.end());
-  EXPECT_EQ(expected_text.size(), annotation.end() - annotation.begin());
-  EXPECT_EQ(expected_text,
-            file_content.substr(annotation.begin(), expected_text.size()));
-}
-}  // anonymous namespace
-
-void MockCodeGenerator::CheckGeneratedAnnotations(
-    const string& name, const string& file, const string& output_directory) {
-  string file_content;
-  GOOGLE_CHECK_OK(
-      File::GetContents(output_directory + "/" + GetOutputFileName(name, file),
-                        &file_content, true));
-  string meta_content;
-  GOOGLE_CHECK_OK(File::GetContents(
-      output_directory + "/" + GetOutputFileName(name, file) + ".meta",
-      &meta_content, true));
-  GeneratedCodeInfo annotations;
-  GOOGLE_CHECK(TextFormat::ParseFromString(meta_content, &annotations));
-  ASSERT_EQ(3, annotations.annotation_size());
-  CheckSingleAnnotation("first_annotation", "first", file_content,
-                        annotations.annotation(0));
-  CheckSingleAnnotation("second_annotation", "second", file_content,
-                        annotations.annotation(1));
-  CheckSingleAnnotation("third_annotation", "third", file_content,
-                        annotations.annotation(2));
-}
-
 bool MockCodeGenerator::Generate(
     const FileDescriptor* file,
     const string& parameter,
     GeneratorContext* context,
     string* error) const {
-  bool annotate = false;
   for (int i = 0; i < file->message_type_count(); i++) {
     if (HasPrefixString(file->message_type(i)->name(), "MockCodeGenerator_")) {
       string command = StripPrefixString(file->message_type(i)->name(),
@@ -208,17 +159,6 @@
         std::cerr << "Saw json_name: "
                   << field_descriptor_proto.has_json_name() << std::endl;
         abort();
-      } else if (command == "Annotate") {
-        annotate = true;
-      } else if (command == "ShowVersionNumber") {
-        Version compiler_version;
-        context->GetCompilerVersion(&compiler_version);
-        std::cerr << "Saw compiler_version: "
-                  << compiler_version.major() * 1000000 +
-                     compiler_version.minor() * 1000 +
-                     compiler_version.patch()
-                  << " " << compiler_version.suffix() << std::endl;
-        abort();
       } else {
         GOOGLE_LOG(FATAL) << "Unknown MockCodeGenerator command: " << command;
       }
@@ -226,11 +166,11 @@
   }
 
   if (HasPrefixString(parameter, "insert=")) {
-    std::vector<string> insert_into;
+    vector<string> insert_into;
     SplitStringUsing(StripPrefixString(parameter, "insert="),
                      ",", &insert_into);
 
-    for (size_t i = 0; i < insert_into.size(); i++) {
+    for (int i = 0; i < insert_into.size(); i++) {
       {
         google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->OpenForInsert(
             GetOutputFileName(insert_into[i], file), kFirstInsertionPointName));
@@ -260,40 +200,16 @@
     google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
         context->Open(GetOutputFileName(name_, file)));
 
-    GeneratedCodeInfo annotations;
-    io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
-        &annotations);
-    io::Printer printer(output.get(), '$',
-                        annotate ? &annotation_collector : NULL);
-    printer.PrintRaw(GetOutputFileContent(name_, parameter, file, context));
-    string annotate_suffix = "_annotation";
-    if (annotate) {
-      printer.Print("$p$", "p", "first");
-      printer.Annotate("p", "first" + annotate_suffix);
-    }
+    io::Printer printer(output.get(), '$');
+    printer.PrintRaw(GetOutputFileContent(name_, parameter,
+                                          file, context));
     printer.PrintRaw(kFirstInsertionPoint);
-    if (annotate) {
-      printer.Print("$p$", "p", "second");
-      printer.Annotate("p", "second" + annotate_suffix);
-    }
     printer.PrintRaw(kSecondInsertionPoint);
-    if (annotate) {
-      printer.Print("$p$", "p", "third");
-      printer.Annotate("p", "third" + annotate_suffix);
-    }
 
     if (printer.failed()) {
       *error = "MockCodeGenerator detected write error.";
       return false;
     }
-    if (annotate) {
-      google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> meta_output(
-          context->Open(GetOutputFileName(name_, file) + ".meta"));
-      if (!TextFormat::Print(annotations, meta_output.get())) {
-        *error = "MockCodeGenerator couldn't write .meta";
-        return false;
-      }
-    }
   }
 
   return true;
@@ -314,7 +230,7 @@
     const string& parameter,
     const FileDescriptor* file,
     GeneratorContext *context) {
-  std::vector<const FileDescriptor*> all_files;
+  vector<const FileDescriptor*> all_files;
   context->ListParsedFiles(&all_files);
   return GetOutputFileContent(
       generator_name, parameter, file->name(),
diff --git a/src/google/protobuf/compiler/mock_code_generator.h b/src/google/protobuf/compiler/mock_code_generator.h
index cdd9138..e1665f8 100644
--- a/src/google/protobuf/compiler/mock_code_generator.h
+++ b/src/google/protobuf/compiler/mock_code_generator.h
@@ -68,8 +68,6 @@
 //     printing "Saw message type MockCodeGenerator_HasSourceCodeInfo: FOO." to
 //     stderr, where FOO is "1" if the supplied FileDescriptorProto has source
 //     code info, and "0" otherwise.
-//   MockCodeGenerator_Annotate:  Generate() will add annotations to its output
-//     that can later be verified with CheckGeneratedAnnotations.
 class MockCodeGenerator : public CodeGenerator {
  public:
   MockCodeGenerator(const string& name);
@@ -90,12 +88,6 @@
                               const string& parsed_file_list,
                               const string& output_directory);
 
-  // Checks that the correct text ranges were annotated by the
-  // MockCodeGenerator_Annotate directive.
-  static void CheckGeneratedAnnotations(const string& name,
-                                        const string& file,
-                                        const string& output_directory);
-
   // Get the name of the file which would be written by the given generator.
   static string GetOutputFileName(const string& generator_name,
                                   const FileDescriptor* file);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum.cc b/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
index 02d60b3..e76f8e9 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
@@ -62,7 +62,7 @@
   string enum_comments;
   SourceLocation location;
   if (descriptor_->GetSourceLocation(&location)) {
-    enum_comments = BuildCommentsString(location, true);
+    enum_comments = BuildCommentsString(location);
   } else {
     enum_comments = "";
   }
@@ -74,25 +74,23 @@
 
   printer->Print("$comments$typedef$deprecated_attribute$ GPB_ENUM($name$) {\n",
                  "comments", enum_comments,
-                 "deprecated_attribute", GetOptionalDeprecatedAttribute(descriptor_, descriptor_->file()),
+                 "deprecated_attribute", GetOptionalDeprecatedAttribute(descriptor_),
                  "name", name_);
   printer->Indent();
 
   if (HasPreservingUnknownEnumSemantics(descriptor_->file())) {
     // Include the unknown value.
     printer->Print(
-      "/**\n"
-      " * Value used if any message's field encounters a value that is not defined\n"
-      " * by this enum. The message will also have C functions to get/set the rawValue\n"
-      " * of the field.\n"
-      " **/\n"
+      "/// Value used if any message's field encounters a value that is not defined\n"
+      "/// by this enum. The message will also have C functions to get/set the rawValue\n"
+      "/// of the field.\n"
       "$name$_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n",
       "name", name_);
   }
   for (int i = 0; i < all_values_.size(); i++) {
     SourceLocation location;
     if (all_values_[i]->GetSourceLocation(&location)) {
-      string comments = BuildCommentsString(location, true).c_str();
+      string comments = BuildCommentsString(location).c_str();
       if (comments.length() > 0) {
         if (i > 0) {
           printer->Print("\n");
@@ -113,10 +111,8 @@
       "\n"
       "GPBEnumDescriptor *$name$_EnumDescriptor(void);\n"
       "\n"
-      "/**\n"
-      " * Checks to see if the given value is defined by the enum or was not known at\n"
-      " * the time this source was generated.\n"
-      " **/\n"
+      "/// Checks to see if the given value is defined by the enum or was not known at\n"
+      "/// the time this source was generated.\n"
       "BOOL $name$_IsValidValue(int32_t value);\n"
       "\n",
       "name", name_);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
index 8899a13..b63bc0d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
@@ -46,7 +46,7 @@
 namespace {
 
 void SetEnumVariables(const FieldDescriptor* descriptor,
-                      std::map<string, string>* variables) {
+                      map<string, string>* variables) {
   string type = EnumName(descriptor->enum_type());
   (*variables)["storage_type"] = type;
   // For non repeated fields, if it was defined in a different file, the
@@ -83,16 +83,12 @@
 
   printer->Print(
       variables_,
-      "/**\n"
-      " * Fetches the raw value of a @c $owning_message_class$'s @c $name$ property, even\n"
-      " * if the value was not defined by the enum at the time the code was generated.\n"
-      " **/\n"
+      "/// Fetches the raw value of a @c $owning_message_class$'s @c $name$ property, even\n"
+      "/// if the value was not defined by the enum at the time the code was generated.\n"
       "int32_t $owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message);\n"
-      "/**\n"
-      " * Sets the raw value of an @c $owning_message_class$'s @c $name$ property, allowing\n"
-      " * it to be set to a value that was not defined by the enum at the time the code\n"
-      " * was generated.\n"
-      " **/\n"
+      "/// Sets the raw value of an @c $owning_message_class$'s @c $name$ property, allowing\n"
+      "/// it to be set to a value that was not defined by the enum at the time the code\n"
+      "/// was generated.\n"
       "void Set$owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message, int32_t value);\n"
       "\n");
 }
@@ -118,7 +114,7 @@
 }
 
 void EnumFieldGenerator::DetermineForwardDeclarations(
-    std::set<string>* fwd_decls) const {
+    set<string>* fwd_decls) const {
   SingleFieldGenerator::DetermineForwardDeclarations(fwd_decls);
   // If it is an enum defined in a different file, then we'll need a forward
   // declaration for it.  When it is in our file, all the enums are output
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
index ae56c06..946faa8 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
@@ -47,7 +47,7 @@
  public:
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
   virtual void GenerateCFunctionImplementations(io::Printer* printer) const;
-  virtual void DetermineForwardDeclarations(std::set<string>* fwd_decls) const;
+  virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
  protected:
   EnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_extension.cc b/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
index b788d0a..3f7ab9d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
@@ -49,9 +49,9 @@
   if (descriptor->is_map()) {
     // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
     // error cases, so it seems to be ok to use as a back door for errors.
-    std::cerr << "error: Extension is a map<>!"
-         << " That used to be blocked by the compiler." << std::endl;
-    std::cerr.flush();
+    cerr << "error: Extension is a map<>!"
+         << " That used to be blocked by the compiler." << endl;
+    cerr.flush();
     abort();
   }
 }
@@ -59,25 +59,22 @@
 ExtensionGenerator::~ExtensionGenerator() {}
 
 void ExtensionGenerator::GenerateMembersHeader(io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["method_name"] = method_name_;
   SourceLocation location;
   if (descriptor_->GetSourceLocation(&location)) {
-    vars["comments"] = BuildCommentsString(location, true);
+    vars["comments"] = BuildCommentsString(location);
   } else {
     vars["comments"] = "";
   }
-  // Unlike normal message fields, check if the file for the extension was
-  // deprecated.
-  vars["deprecated_attribute"] = GetOptionalDeprecatedAttribute(descriptor_, descriptor_->file());
   printer->Print(vars,
                  "$comments$"
-                 "+ (GPBExtensionDescriptor *)$method_name$$deprecated_attribute$;\n");
+                 "+ (GPBExtensionDescriptor *)$method_name$;\n");
 }
 
 void ExtensionGenerator::GenerateStaticVariablesInitialization(
     io::Printer* printer) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars["root_class_and_method_name"] = root_class_and_method_name_;
   vars["extended_type"] = ClassName(descriptor_->containing_type());
   vars["number"] = SimpleItoa(descriptor_->number());
@@ -88,7 +85,7 @@
   if (descriptor_->containing_type()->options().message_set_wire_format())
     options.push_back("GPBExtensionSetWireFormat");
 
-  vars["options"] = BuildFlagsString(FLAGTYPE_EXTENSION, options);
+  vars["options"] = BuildFlagsString(options);
 
   ObjectiveCType objc_type = GetObjectiveCType(descriptor_);
   string singular_type;
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_field.cc
index b6123fa..66cb4a1 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_field.cc
@@ -49,7 +49,7 @@
 namespace {
 
 void SetCommonFieldVariables(const FieldDescriptor* descriptor,
-                             std::map<string, string>* variables) {
+                             map<string, string>* variables) {
   string camel_case_name = FieldName(descriptor);
   string raw_field_name;
   if (descriptor->type() == FieldDescriptor::TYPE_GROUP) {
@@ -64,7 +64,7 @@
 
   SourceLocation location;
   if (descriptor->GetSourceLocation(&location)) {
-    (*variables)["comments"] = BuildCommentsString(location, true);
+    (*variables)["comments"] = BuildCommentsString(location);
   } else {
     (*variables)["comments"] = "\n";
   }
@@ -93,7 +93,7 @@
     field_flags.push_back("GPBFieldHasEnumDescriptor");
   }
 
-  (*variables)["fieldflags"] = BuildFlagsString(FLAGTYPE_FIELD, field_flags);
+  (*variables)["fieldflags"] = BuildFlagsString(field_flags);
 
   (*variables)["default"] = DefaultValue(descriptor);
   (*variables)["default_name"] = GPBGenericValueFieldName(descriptor);
@@ -178,7 +178,7 @@
 }
 
 void FieldGenerator::DetermineForwardDeclarations(
-    std::set<string>* fwd_decls) const {
+    set<string>* fwd_decls) const {
   // Nothing
 }
 
@@ -228,8 +228,8 @@
 void FieldGenerator::SetExtraRuntimeHasBitsBase(int index_base) {
   // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
   // error cases, so it seems to be ok to use as a back door for errors.
-  std::cerr << "Error: should have overridden SetExtraRuntimeHasBitsBase()." << std::endl;
-  std::cerr.flush();
+  cerr << "Error: should have overriden SetExtraRuntimeHasBitsBase()." << endl;
+  cerr.flush();
   abort();
 }
 
@@ -335,7 +335,7 @@
   if (WantsHasProperty()) {
     printer->Print(
         variables_,
-        "/** Test to see if @c $name$ has been set. */\n"
+        "/// Test to see if @c $name$ has been set.\n"
         "@property(nonatomic, readwrite) BOOL has$capitalized_name$$deprecated_attribute$;\n");
   }
   if (IsInitName(variables_.find("name")->second)) {
@@ -387,7 +387,7 @@
       "$comments$"
       "$array_comment$"
       "@property(nonatomic, readwrite, strong, null_resettable) $array_property_type$ *$name$$storage_attribute$$deprecated_attribute$;\n"
-      "/** The number of items in @c $name$ without causing the array to be created. */\n"
+      "/// The number of items in @c $name$ without causing the array to be created.\n"
       "@property(nonatomic, readonly) NSUInteger $name$_Count$deprecated_attribute$;\n");
   if (IsInitName(variables_.find("name")->second)) {
     // If property name starts with init we need to annotate it to get past ARC.
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_field.h b/src/google/protobuf/compiler/objectivec/objectivec_field.h
index 6bd5db2..a3a4b1b 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_field.h
@@ -67,7 +67,7 @@
   virtual void GenerateCFunctionImplementations(io::Printer* printer) const;
 
   // Exposed for subclasses, should always call it on the parent class also.
-  virtual void DetermineForwardDeclarations(std::set<string>* fwd_decls) const;
+  virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
   // Used during generation, not intended to be extended by subclasses.
   void GenerateFieldDescription(
@@ -100,7 +100,7 @@
   virtual bool WantsHasProperty(void) const = 0;
 
   const FieldDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.cc b/src/google/protobuf/compiler/objectivec/objectivec_file.cc
index 954b268..ed4fc6a 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_file.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_file.cc
@@ -37,129 +37,23 @@
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/stl_util.h>
 #include <google/protobuf/stubs/strutil.h>
-#include <algorithm> // std::find()
-#include <iostream>
 #include <sstream>
 
-// NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
-// error cases, so it seems to be ok to use as a back door for errors.
-
 namespace google {
 namespace protobuf {
+
+// This is also found in GPBBootstrap.h, and needs to be kept in sync.  It
+// is the version check done to ensure generated code works with the current
+// runtime being used.
+const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30001;
+
 namespace compiler {
 namespace objectivec {
 
-namespace {
-
-// This is also found in GPBBootstrap.h, and needs to be kept in sync.
-const int32 GOOGLE_PROTOBUF_OBJC_VERSION = 30002;
-
-const char* kHeaderExtension = ".pbobjc.h";
-
-// Checks if a message contains any extension definitions (on the message or
-// a nested message under it).
-bool MessageContainsExtensions(const Descriptor* message) {
-  if (message->extension_count() > 0) {
-    return true;
-  }
-  for (int i = 0; i < message->nested_type_count(); i++) {
-    if (MessageContainsExtensions(message->nested_type(i))) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Checks if the file contains any extensions definitions (at the root or
-// nested under a message).
-bool FileContainsExtensions(const FileDescriptor* file) {
-  if (file->extension_count() > 0) {
-    return true;
-  }
-  for (int i = 0; i < file->message_type_count(); i++) {
-    if (MessageContainsExtensions(file->message_type(i))) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Helper for CollectMinimalFileDepsContainingExtensionsWorker that marks all
-// deps as visited and prunes them from the needed files list.
-void PruneFileAndDepsMarkingAsVisited(
-    const FileDescriptor* file,
-    vector<const FileDescriptor*>* files,
-    std::set<const FileDescriptor*>* files_visited) {
-  vector<const FileDescriptor*>::iterator iter =
-      std::find(files->begin(), files->end(), file);
-  if (iter != files->end()) {
-    files->erase(iter);
-  }
-  files_visited->insert(file);
-  for (int i = 0; i < file->dependency_count(); i++) {
-    PruneFileAndDepsMarkingAsVisited(file->dependency(i), files, files_visited);
-  }
-}
-
-// Helper for CollectMinimalFileDepsContainingExtensions.
-void CollectMinimalFileDepsContainingExtensionsWorker(
-    const FileDescriptor* file,
-    vector<const FileDescriptor*>* files,
-    std::set<const FileDescriptor*>* files_visited) {
-  if (files_visited->find(file) != files_visited->end()) {
-    return;
-  }
-  files_visited->insert(file);
-
-  if (FileContainsExtensions(file)) {
-    files->push_back(file);
-    for (int i = 0; i < file->dependency_count(); i++) {
-      const FileDescriptor* dep = file->dependency(i);
-      PruneFileAndDepsMarkingAsVisited(dep, files, files_visited);
-    }
-  } else {
-    for (int i = 0; i < file->dependency_count(); i++) {
-      const FileDescriptor* dep = file->dependency(i);
-      CollectMinimalFileDepsContainingExtensionsWorker(dep, files,
-                                                       files_visited);
-    }
-  }
-}
-
-// Collect the deps of the given file that contain extensions. This can be used to
-// create the chain of roots that need to be wired together.
-//
-// NOTE: If any changes are made to this and the supporting functions, you will
-// need to manually validate what the generated code is for the test files:
-//   objectivec/Tests/unittest_extension_chain_*.proto
-// There are comments about what the expected code should be line and limited
-// testing objectivec/Tests/GPBUnittestProtos2.m around compilation (#imports
-// specifically).
-void CollectMinimalFileDepsContainingExtensions(
-    const FileDescriptor* file,
-    vector<const FileDescriptor*>* files) {
-  std::set<const FileDescriptor*> files_visited;
-  for (int i = 0; i < file->dependency_count(); i++) {
-    const FileDescriptor* dep = file->dependency(i);
-    CollectMinimalFileDepsContainingExtensionsWorker(dep, files,
-                                                     &files_visited);
-  }
-}
-
-bool IsDirectDependency(const FileDescriptor* dep, const FileDescriptor* file) {
-  for (int i = 0; i < file->dependency_count(); i++) {
-    if (dep == file->dependency(i)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-}  // namespace
-
 FileGenerator::FileGenerator(const FileDescriptor *file, const Options& options)
     : file_(file),
       root_class_name_(FileClassName(file)),
+      is_public_dep_(false),
       options_(options) {
   for (int i = 0; i < file_->enum_type_count(); i++) {
     EnumGenerator *generator = new EnumGenerator(file_->enum_type(i));
@@ -178,6 +72,8 @@
 }
 
 FileGenerator::~FileGenerator() {
+  STLDeleteContainerPointers(dependency_generators_.begin(),
+                             dependency_generators_.end());
   STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end());
   STLDeleteContainerPointers(message_generators_.begin(),
                              message_generators_.end());
@@ -186,40 +82,36 @@
 }
 
 void FileGenerator::GenerateHeader(io::Printer *printer) {
-  PrintFileRuntimePreamble(printer, "GPBProtocolBuffers.h");
+  printer->Print(
+      "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
+      "// source: $filename$\n"
+      "\n",
+      "filename", file_->name());
+
+  printer->Print(
+      "#import \"GPBProtocolBuffers.h\"\n"
+      "\n");
 
   // Add some verification that the generated code matches the source the
   // code is being compiled with.
-  // NOTE: This captures the raw numeric values at the time the generator was
-  // compiled, since that will be the versions for the ObjC runtime at that
-  // time.  The constants in the generated code will then get their values at
-  // at compile time (so checking against the headers being used to compile).
   printer->Print(
-      "#if GOOGLE_PROTOBUF_OBJC_VERSION < $google_protobuf_objc_version$\n"
-      "#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.\n"
-      "#endif\n"
-      "#if $google_protobuf_objc_version$ < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION\n"
-      "#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.\n"
+      "#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != $protoc_gen_objc_version$\n"
+      "#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.\n"
       "#endif\n"
       "\n",
-      "google_protobuf_objc_version", SimpleItoa(GOOGLE_PROTOBUF_OBJC_VERSION));
+      "protoc_gen_objc_version",
+      SimpleItoa(GOOGLE_PROTOBUF_OBJC_GEN_VERSION));
 
-  // #import any headers for "public imports" in the proto file.
-  {
-    ImportWriter import_writer(
-        options_.generate_for_named_framework,
-        options_.named_framework_to_proto_path_mappings_path);
-    const string header_extension(kHeaderExtension);
-    for (int i = 0; i < file_->public_dependency_count(); i++) {
-      import_writer.AddFile(file_->public_dependency(i), header_extension);
+  const vector<FileGenerator *> &dependency_generators = DependencyGenerators();
+  for (vector<FileGenerator *>::const_iterator iter =
+           dependency_generators.begin();
+       iter != dependency_generators.end(); ++iter) {
+    if ((*iter)->IsPublicDependency()) {
+      printer->Print("#import \"$header$.pbobjc.h\"\n",
+                     "header", (*iter)->Path());
     }
-    import_writer.Print(printer);
   }
 
-  // Note:
-  //  deprecated-declarations suppression is only needed if some place in this
-  //    proto file is something deprecated or if it references something from
-  //    another file that is deprecated.
   printer->Print(
       "// @@protoc_insertion_point(imports)\n"
       "\n"
@@ -229,12 +121,12 @@
       "CF_EXTERN_C_BEGIN\n"
       "\n");
 
-  std::set<string> fwd_decls;
+  set<string> fwd_decls;
   for (vector<MessageGenerator *>::iterator iter = message_generators_.begin();
        iter != message_generators_.end(); ++iter) {
     (*iter)->DetermineForwardDeclarations(&fwd_decls);
   }
-  for (std::set<string>::const_iterator i(fwd_decls.begin());
+  for (set<string>::const_iterator i(fwd_decls.begin());
        i != fwd_decls.end(); ++i) {
     printer->Print("$value$;\n", "value", *i);
   }
@@ -262,16 +154,14 @@
   printer->Print(
       "#pragma mark - $root_class_name$\n"
       "\n"
-      "/**\n"
-      " * Exposes the extension registry for this file.\n"
-      " *\n"
-      " * The base class provides:\n"
-      " * @code\n"
-      " *   + (GPBExtensionRegistry *)extensionRegistry;\n"
-      " * @endcode\n"
-      " * which is a @c GPBExtensionRegistry that includes all the extensions defined by\n"
-      " * this file and all files that it depends on.\n"
-      " **/\n"
+      "/// Exposes the extension registry for this file.\n"
+      "///\n"
+      "/// The base class provides:\n"
+      "/// @code\n"
+      "///   + (GPBExtensionRegistry *)extensionRegistry;\n"
+      "/// @endcode\n"
+      "/// which is a @c GPBExtensionRegistry that includes all the extensions defined by\n"
+      "/// this file and all files that it depends on.\n"
       "@interface $root_class_name$ : GPBRootObject\n"
       "@end\n"
       "\n",
@@ -308,114 +198,80 @@
 }
 
 void FileGenerator::GenerateSource(io::Printer *printer) {
-  // #import the runtime support.
-  PrintFileRuntimePreamble(printer, "GPBProtocolBuffers_RuntimeSupport.h");
+  printer->Print(
+      "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
+      "// source: $filename$\n"
+      "\n",
+      "filename", file_->name());
 
-  vector<const FileDescriptor*> deps_with_extensions;
-  CollectMinimalFileDepsContainingExtensions(file_, &deps_with_extensions);
-
-  {
-    ImportWriter import_writer(
-        options_.generate_for_named_framework,
-        options_.named_framework_to_proto_path_mappings_path);
-    const string header_extension(kHeaderExtension);
-
-    // #import the header for this proto file.
-    import_writer.AddFile(file_, header_extension);
-
-    // #import the headers for anything that a plain dependency of this proto
-    // file (that means they were just an include, not a "public" include).
-    std::set<string> public_import_names;
-    for (int i = 0; i < file_->public_dependency_count(); i++) {
-      public_import_names.insert(file_->public_dependency(i)->name());
-    }
-    for (int i = 0; i < file_->dependency_count(); i++) {
-      const FileDescriptor *dep = file_->dependency(i);
-      bool public_import = (public_import_names.count(dep->name()) != 0);
-      if (!public_import) {
-        import_writer.AddFile(dep, header_extension);
-      }
-    }
-
-    // If any indirect dependency provided extensions, it needs to be directly
-    // imported so it can get merged into the root's extensions registry.
-    // See the Note by CollectMinimalFileDepsContainingExtensions before
-    // changing this.
-    for (vector<const FileDescriptor *>::iterator iter =
-             deps_with_extensions.begin();
-         iter != deps_with_extensions.end(); ++iter) {
-      if (!IsDirectDependency(*iter, file_)) {
-        import_writer.AddFile(*iter, header_extension);
-      }
-    }
-
-    import_writer.Print(printer);
-  }
-
-  bool includes_oneof = false;
-  for (vector<MessageGenerator *>::iterator iter = message_generators_.begin();
-       iter != message_generators_.end(); ++iter) {
-    if ((*iter)->IncludesOneOfDefinition()) {
-      includes_oneof = true;
-      break;
+  string header_file = Path() + ".pbobjc.h";
+  printer->Print(
+      "#import \"GPBProtocolBuffers_RuntimeSupport.h\"\n"
+      "#import \"$header_file$\"\n",
+      "header_file", header_file);
+  const vector<FileGenerator *> &dependency_generators =
+      DependencyGenerators();
+  for (vector<FileGenerator *>::const_iterator iter =
+           dependency_generators.begin();
+       iter != dependency_generators.end(); ++iter) {
+    if (!(*iter)->IsPublicDependency()) {
+      printer->Print("#import \"$header$.pbobjc.h\"\n",
+                     "header", (*iter)->Path());
     }
   }
-
-  // Note:
-  //  deprecated-declarations suppression is only needed if some place in this
-  //    proto file is something deprecated or if it references something from
-  //    another file that is deprecated.
   printer->Print(
       "// @@protoc_insertion_point(imports)\n"
       "\n"
       "#pragma clang diagnostic push\n"
-      "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n");
-  if (includes_oneof) {
-    // The generated code for oneof's uses direct ivar access, suppress the
-    // warning incase developer turn that on in the context they compile the
-    // generated code.
-    printer->Print(
-        "#pragma clang diagnostic ignored \"-Wdirect-ivar-access\"\n");
-  }
+      "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n"
+      "\n");
 
   printer->Print(
-      "\n"
       "#pragma mark - $root_class_name$\n"
       "\n"
       "@implementation $root_class_name$\n\n",
       "root_class_name", root_class_name_);
 
-  const bool file_contains_extensions = FileContainsExtensions(file_);
+  // Generate the extension initialization structures for the top level and
+  // any nested messages.
+  ostringstream extensions_stringstream;
+  if (file_->extension_count() + file_->message_type_count() > 0) {
+    io::OstreamOutputStream extensions_outputstream(&extensions_stringstream);
+    io::Printer extensions_printer(&extensions_outputstream, '$');
+    for (vector<ExtensionGenerator *>::iterator iter =
+             extension_generators_.begin();
+         iter != extension_generators_.end(); ++iter) {
+      (*iter)->GenerateStaticVariablesInitialization(&extensions_printer);
+    }
+    for (vector<MessageGenerator *>::iterator iter =
+             message_generators_.begin();
+         iter != message_generators_.end(); ++iter) {
+      (*iter)->GenerateStaticVariablesInitialization(&extensions_printer);
+    }
+    extensions_stringstream.flush();
+  }
 
   // If there were any extensions or this file has any dependencies, output
   // a registry to override to create the file specific registry.
-  if (file_contains_extensions || !deps_with_extensions.empty()) {
+  const string& extensions_str = extensions_stringstream.str();
+  if (extensions_str.length() > 0 || file_->dependency_count() > 0) {
     printer->Print(
         "+ (GPBExtensionRegistry*)extensionRegistry {\n"
         "  // This is called by +initialize so there is no need to worry\n"
         "  // about thread safety and initialization of registry.\n"
         "  static GPBExtensionRegistry* registry = nil;\n"
         "  if (!registry) {\n"
-        "    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n"
+        "    GPBDebugCheckRuntimeVersion();\n"
         "    registry = [[GPBExtensionRegistry alloc] init];\n");
 
     printer->Indent();
     printer->Indent();
 
-    if (file_contains_extensions) {
+    if (extensions_str.length() > 0) {
       printer->Print(
           "static GPBExtensionDescription descriptions[] = {\n");
       printer->Indent();
-      for (vector<ExtensionGenerator *>::iterator iter =
-               extension_generators_.begin();
-           iter != extension_generators_.end(); ++iter) {
-        (*iter)->GenerateStaticVariablesInitialization(printer);
-      }
-      for (vector<MessageGenerator *>::iterator iter =
-               message_generators_.begin();
-           iter != message_generators_.end(); ++iter) {
-        (*iter)->GenerateStaticVariablesInitialization(printer);
-      }
+      printer->Print(extensions_str.c_str());
       printer->Outdent();
       printer->Print(
           "};\n"
@@ -428,21 +284,14 @@
           "}\n");
     }
 
-    if (deps_with_extensions.empty()) {
+    const vector<FileGenerator *> &dependency_generators =
+        DependencyGenerators();
+    for (vector<FileGenerator *>::const_iterator iter =
+             dependency_generators.begin();
+         iter != dependency_generators.end(); ++iter) {
       printer->Print(
-          "// None of the imports (direct or indirect) defined extensions, so no need to add\n"
-          "// them to this registry.\n");
-    } else {
-      printer->Print(
-          "// Merge in the imports (direct or indirect) that defined extensions.\n");
-      for (vector<const FileDescriptor *>::iterator iter =
-               deps_with_extensions.begin();
-           iter != deps_with_extensions.end(); ++iter) {
-        const string root_class_name(FileClassName((*iter)));
-        printer->Print(
-            "[registry addExtensions:[$dependency$ extensionRegistry]];\n",
-            "dependency", root_class_name);
-      }
+          "[registry addExtensions:[$dependency$ extensionRegistry]];\n",
+          "dependency", (*iter)->RootClassName());
     }
 
     printer->Outdent();
@@ -451,39 +300,27 @@
     printer->Print(
         "  }\n"
         "  return registry;\n"
-        "}\n");
-  } else {
-    if (file_->dependency_count() > 0) {
-      printer->Print(
-          "// No extensions in the file and none of the imports (direct or indirect)\n"
-          "// defined extensions, so no need to generate +extensionRegistry.\n");
-    } else {
-      printer->Print(
-          "// No extensions in the file and no imports, so no need to generate\n"
-          "// +extensionRegistry.\n");
-    }
+        "}\n"
+        "\n");
   }
 
-  printer->Print("\n@end\n\n");
+  printer->Print("@end\n\n");
 
   // File descriptor only needed if there are messages to use it.
   if (message_generators_.size() > 0) {
-    std::map<string, string> vars;
-    vars["root_class_name"] = root_class_name_;
-    vars["package"] = file_->package();
-    vars["objc_prefix"] = FileClassPrefix(file_);
+    string syntax;
     switch (file_->syntax()) {
       case FileDescriptor::SYNTAX_UNKNOWN:
-        vars["syntax"] = "GPBFileSyntaxUnknown";
+        syntax = "GPBFileSyntaxUnknown";
         break;
       case FileDescriptor::SYNTAX_PROTO2:
-        vars["syntax"] = "GPBFileSyntaxProto2";
+        syntax = "GPBFileSyntaxProto2";
         break;
       case FileDescriptor::SYNTAX_PROTO3:
-        vars["syntax"] = "GPBFileSyntaxProto3";
+        syntax = "GPBFileSyntaxProto3";
         break;
     }
-    printer->Print(vars,
+    printer->Print(
         "#pragma mark - $root_class_name$_FileDescriptor\n"
         "\n"
         "static GPBFileDescriptor *$root_class_name$_FileDescriptor(void) {\n"
@@ -491,24 +328,16 @@
         "  // about thread safety of the singleton.\n"
         "  static GPBFileDescriptor *descriptor = NULL;\n"
         "  if (!descriptor) {\n"
-        "    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n");
-    if (vars["objc_prefix"].size() > 0) {
-      printer->Print(
-          vars,
-          "    descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"$package$\"\n"
-          "                                                 objcPrefix:@\"$objc_prefix$\"\n"
-          "                                                     syntax:$syntax$];\n");
-    } else {
-      printer->Print(
-          vars,
-          "    descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"$package$\"\n"
-          "                                                     syntax:$syntax$];\n");
-    }
-    printer->Print(
+        "    GPBDebugCheckRuntimeVersion();\n"
+        "    descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"$package$\"\n"
+        "                                                     syntax:$syntax$];\n"
         "  }\n"
         "  return descriptor;\n"
         "}\n"
-        "\n");
+        "\n",
+        "root_class_name", root_class_name_,
+        "package", file_->package(),
+        "syntax", syntax);
   }
 
   for (vector<EnumGenerator *>::iterator iter = enum_generators_.begin();
@@ -527,35 +356,24 @@
     "// @@protoc_insertion_point(global_scope)\n");
 }
 
-// Helper to print the import of the runtime support at the top of generated
-// files. This currently only supports the runtime coming from a framework
-// as defined by the official CocoaPod.
-void FileGenerator::PrintFileRuntimePreamble(
-    io::Printer* printer, const string& header_to_import) const {
-  printer->Print(
-      "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
-      "// source: $filename$\n"
-      "\n",
-      "filename", file_->name());
+const string FileGenerator::Path() const { return FilePath(file_); }
 
-  const string framework_name(ProtobufLibraryFrameworkName);
-  const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name));
-  printer->Print(
-      "// This CPP symbol can be defined to use imports that match up to the framework\n"
-      "// imports needed when using CocoaPods.\n"
-      "#if !defined($cpp_symbol$)\n"
-      " #define $cpp_symbol$ 0\n"
-      "#endif\n"
-      "\n"
-      "#if $cpp_symbol$\n"
-      " #import <$framework_name$/$header$>\n"
-      "#else\n"
-      " #import \"$header$\"\n"
-      "#endif\n"
-      "\n",
-      "cpp_symbol", cpp_symbol,
-      "header", header_to_import,
-      "framework_name", framework_name);
+const vector<FileGenerator *> &FileGenerator::DependencyGenerators() {
+  if (file_->dependency_count() != dependency_generators_.size()) {
+    set<string> public_import_names;
+    for (int i = 0; i < file_->public_dependency_count(); i++) {
+      public_import_names.insert(file_->public_dependency(i)->name());
+    }
+    for (int i = 0; i < file_->dependency_count(); i++) {
+      FileGenerator *generator =
+          new FileGenerator(file_->dependency(i), options_);
+      const string& name = file_->dependency(i)->name();
+      bool public_import = (public_import_names.count(name) != 0);
+      generator->SetIsPublicDependency(public_import);
+      dependency_generators_.push_back(generator);
+    }
+  }
+  return dependency_generators_;
 }
 
 }  // namespace objectivec
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.h b/src/google/protobuf/compiler/objectivec/objectivec_file.h
index a60a688..4c0fcd3 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_file.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_file.h
@@ -62,19 +62,31 @@
   void GenerateHeader(io::Printer* printer);
 
   const string& RootClassName() const { return root_class_name_; }
+  const string Path() const;
+
+  bool IsPublicDependency() const { return is_public_dep_; }
+
+ protected:
+  void SetIsPublicDependency(bool is_public_dep) {
+    is_public_dep_ = is_public_dep;
+  }
 
  private:
   const FileDescriptor* file_;
   string root_class_name_;
 
+  // Access this field through the DependencyGenerators accessor call below.
+  // Do not reference it directly.
+  vector<FileGenerator*> dependency_generators_;
+
   vector<EnumGenerator*> enum_generators_;
   vector<MessageGenerator*> message_generators_;
   vector<ExtensionGenerator*> extension_generators_;
+  bool is_public_dep_;
 
   const Options options_;
 
-  void PrintFileRuntimePreamble(
-      io::Printer* printer, const string& header_to_import) const;
+  const vector<FileGenerator*>& DependencyGenerators();
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);
 };
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_generator.cc b/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
index 3640746..72e295d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
@@ -45,29 +45,12 @@
 
 ObjectiveCGenerator::~ObjectiveCGenerator() {}
 
-bool ObjectiveCGenerator::HasGenerateAll() const {
-  return true;
-}
-
 bool ObjectiveCGenerator::Generate(const FileDescriptor* file,
                                    const string& parameter,
-                                   GeneratorContext* context,
+                                   OutputDirectory* output_directory,
                                    string* error) const {
-  *error = "Unimplemented Generate() method. Call GenerateAll() instead.";
-  return false;
-}
-
-bool ObjectiveCGenerator::GenerateAll(const vector<const FileDescriptor*>& files,
-                                      const string& parameter,
-                                      GeneratorContext* context,
-                                      string* error) const {
   // -----------------------------------------------------------------
-  // Parse generator options. These options are passed to the compiler using the
-  // --objc_opt flag. The options are passed as a comma separated list of
-  // options along with their values. If the option appears multiple times, only
-  // the last value will be considered.
-  //
-  // e.g. protoc ... --objc_opt=expected_prefixes=file.txt,generate_for_named_framework=MyFramework
+  // Parse generator options.
 
   Options generation_options;
 
@@ -75,52 +58,7 @@
   ParseGeneratorParameter(parameter, &options);
   for (int i = 0; i < options.size(); i++) {
     if (options[i].first == "expected_prefixes_path") {
-      // Path to find a file containing the expected prefixes
-      // (objc_class_prefix "PREFIX") for proto packages (package NAME). The
-      // generator will then issue warnings/errors if in the proto files being
-      // generated the option is not listed/wrong/etc in the file.
-      //
-      // The format of the file is:
-      //   - An entry is a line of "package=prefix".
-      //   - Comments start with "#".
-      //   - A comment can go on a line after a expected package/prefix pair.
-      //     (i.e. - "package=prefix # comment")
-      //
-      // There is no validation that the prefixes are good prefixes, it is
-      // assumed that they are when you create the file.
       generation_options.expected_prefixes_path = options[i].second;
-    } else if (options[i].first == "generate_for_named_framework") {
-      // The name of the framework that protos are being generated for. This
-      // will cause the #import statements to be framework based using this
-      // name (i.e. - "#import <NAME/proto.pbobjc.h>).
-      //
-      // NOTE: If this option is used with
-      // named_framework_to_proto_path_mappings_path, then this is effectively
-      // the "default" framework name used for everything that wasn't mapped by
-      // the mapping file.
-      generation_options.generate_for_named_framework = options[i].second;
-    } else if (options[i].first == "named_framework_to_proto_path_mappings_path") {
-      // Path to find a file containing the list of framework names and proto
-      // files. The generator uses this to decide if a proto file
-      // referenced should use a framework style import vs. a user level import
-      // (#import <FRAMEWORK/file.pbobjc.h> vs #import "dir/file.pbobjc.h").
-      //
-      // The format of the file is:
-      //   - An entry is a line of "frameworkName: file.proto, dir/file2.proto".
-      //   - Comments start with "#".
-      //   - A comment can go on a line after a expected package/prefix pair.
-      //     (i.e. - "frameworkName: file.proto # comment")
-      //
-      // Any number of files can be listed for a framework, just separate them
-      // with commas.
-      //
-      // There can be multiple lines listing the same frameworkName incase it
-      // has a lot of proto files included in it; having multiple lines makes
-      // things easier to read. If a proto file is not configured in the
-      // mappings file, it will use the default framework name if one was passed
-      // with generate_for_named_framework, or the relative path to it's include
-      // path otherwise.
-      generation_options.named_framework_to_proto_path_mappings_path = options[i].second;
     } else {
       *error = "error: Unknown generator option: " + options[i].first;
       return false;
@@ -129,32 +67,29 @@
 
   // -----------------------------------------------------------------
 
-  // Validate the objc prefix/package pairings.
-  if (!ValidateObjCClassPrefixes(files, generation_options, error)) {
+  // Validate the objc prefix/package pairing.
+  if (!ValidateObjCClassPrefix(file, generation_options, error)) {
     // *error will have been filled in.
     return false;
   }
 
-  for (int i = 0; i < files.size(); i++) {
-    const FileDescriptor* file = files[i];
-    FileGenerator file_generator(file, generation_options);
-    string filepath = FilePath(file);
+  FileGenerator file_generator(file, generation_options);
+  string filepath = FilePath(file);
 
-    // Generate header.
-    {
-      scoped_ptr<io::ZeroCopyOutputStream> output(
-          context->Open(filepath + ".pbobjc.h"));
-      io::Printer printer(output.get(), '$');
-      file_generator.GenerateHeader(&printer);
-    }
+  // Generate header.
+  {
+    scoped_ptr<io::ZeroCopyOutputStream> output(
+        output_directory->Open(filepath + ".pbobjc.h"));
+    io::Printer printer(output.get(), '$');
+    file_generator.GenerateHeader(&printer);
+  }
 
-    // Generate m file.
-    {
-      scoped_ptr<io::ZeroCopyOutputStream> output(
-          context->Open(filepath + ".pbobjc.m"));
-      io::Printer printer(output.get(), '$');
-      file_generator.GenerateSource(&printer);
-    }
+  // Generate m file.
+  {
+    scoped_ptr<io::ZeroCopyOutputStream> output(
+        output_directory->Open(filepath + ".pbobjc.m"));
+    io::Printer printer(output.get(), '$');
+    file_generator.GenerateSource(&printer);
   }
 
   return true;
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_generator.h b/src/google/protobuf/compiler/objectivec/objectivec_generator.h
index b172331..09266b0 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_generator.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_generator.h
@@ -41,25 +41,14 @@
 namespace compiler {
 namespace objectivec {
 
-// CodeGenerator implementation which generates a ObjectiveC source file and
-// header.  If you create your own protocol compiler binary and you want it to
-// support ObjectiveC output, you can do so by registering an instance of this
-// CodeGenerator with the CommandLineInterface in your main() function.
 class LIBPROTOC_EXPORT ObjectiveCGenerator : public CodeGenerator {
  public:
   ObjectiveCGenerator();
   ~ObjectiveCGenerator();
 
   // implements CodeGenerator ----------------------------------------
-  bool HasGenerateAll() const;
-  bool Generate(const FileDescriptor* file,
-                const string& parameter,
-                GeneratorContext* context,
-                string* error) const;
-  bool GenerateAll(const vector<const FileDescriptor*>& files,
-                   const string& parameter,
-                   GeneratorContext* context,
-                   string* error) const;
+  bool Generate(const FileDescriptor* file, const string& parameter,
+                OutputDirectory* output_directory, string* error) const;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectiveCGenerator);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
index 14715ef..196b39d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
@@ -28,7 +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.
 
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#include <io.h>
+#else
 #include <unistd.h>
 #endif
 #include <climits>
@@ -42,15 +44,12 @@
 
 #include <google/protobuf/stubs/hash.h>
 #include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/descriptor.pb.h>
 #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/descriptor.pb.h>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/io_win32.h>
 #include <google/protobuf/stubs/strutil.h>
 
-
 // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
 // error cases, so it seems to be ok to use as a back door for errors.
 
@@ -59,16 +58,6 @@
 namespace compiler {
 namespace objectivec {
 
-// <io.h> is transitively included in this file. Import the functions explicitly
-// in this port namespace to avoid ambiguous definition.
-namespace posix {
-#ifdef _WIN32
-using ::google::protobuf::internal::win32::open;
-#else
-using ::open;
-#endif
-}  // namespace port
-
 Options::Options() {
   // Default is the value of the env for the package prefixes.
   const char* file_path = getenv("GPB_OBJC_EXPECTED_PACKAGE_PREFIXES");
@@ -92,10 +81,6 @@
 hash_set<string> kUpperSegments =
     MakeWordsMap(kUpperSegmentsList, GOOGLE_ARRAYSIZE(kUpperSegmentsList));
 
-bool ascii_isnewline(char c) {
-  return c == '\n' || c == '\r';
-}
-
 // Internal helper for name handing.
 // Do not expose this outside of helpers, stick to having functions for specific
 // cases (ClassName(), FieldName()), so there is always consistent suffix rules.
@@ -206,7 +191,7 @@
     // method declared in protos. The main cases are methods
     // that take no arguments, or setFoo:/hasFoo: type methods.
     "clear", "data", "delimitedData", "descriptor", "extensionRegistry",
-    "extensionsCurrentlySet", "initialized", "isInitialized", "serializedSize",
+    "extensionsCurrentlySet", "isInitialized", "serializedSize",
     "sortedExtensionsInUse", "unknownFields",
 
     // MacTypes.h names
@@ -220,14 +205,10 @@
 hash_set<string> kReservedWords =
     MakeWordsMap(kReservedWordList, GOOGLE_ARRAYSIZE(kReservedWordList));
 
-string SanitizeNameForObjC(const string& input,
-                           const string& extension,
-                           string* out_suffix_added) {
+string SanitizeNameForObjC(const string& input, const string& extension) {
   if (kReservedWords.count(input) > 0) {
-    if (out_suffix_added) *out_suffix_added = extension;
     return input + extension;
   }
-  if (out_suffix_added) out_suffix_added->clear();
   return input;
 }
 
@@ -276,34 +257,6 @@
   return false;
 }
 
-string GetZeroEnumNameForFlagType(const FlagType flag_type) {
-  switch(flag_type) {
-    case FLAGTYPE_DESCRIPTOR_INITIALIZATION:
-      return "GPBDescriptorInitializationFlag_None";
-    case FLAGTYPE_EXTENSION:
-      return "GPBExtensionNone";
-    case FLAGTYPE_FIELD:
-      return "GPBFieldNone";
-    default:
-      GOOGLE_LOG(FATAL) << "Can't get here.";
-      return "0";
-  }
-}
-
-string GetEnumNameForFlagType(const FlagType flag_type) {
-  switch(flag_type) {
-    case FLAGTYPE_DESCRIPTOR_INITIALIZATION:
-      return "GPBDescriptorInitializationFlags";
-    case FLAGTYPE_EXTENSION:
-      return "GPBExtensionOptions";
-    case FLAGTYPE_FIELD:
-      return "GPBFieldFlags";
-    default:
-      GOOGLE_LOG(FATAL) << "Can't get here.";
-      return string();
-  }
-}
-
 }  // namespace
 
 // Escape C++ trigraphs by escaping question marks to \?
@@ -319,16 +272,6 @@
   }
 }
 
-void StringPieceTrimWhitespace(StringPiece* input) {
-  while (!input->empty() && ascii_isspace(*input->data())) {
-    input->remove_prefix(1);
-  }
-  while (!input->empty() && ascii_isspace((*input)[input->length() - 1])) {
-    input->remove_suffix(1);
-  }
-}
-
-
 bool IsRetainedName(const string& name) {
   // List of prefixes from
   // http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html
@@ -350,10 +293,11 @@
   return basename;
 }
 
-string FileClassPrefix(const FileDescriptor* file) {
-  // Default is empty string, no need to check has_objc_class_prefix.
-  string result = file->options().objc_class_prefix();
-  return result;
+string FileName(const FileDescriptor* file) {
+  string path = FilePath(file);
+  string basename;
+  PathSplit(path, NULL, &basename);
+  return basename;
 }
 
 string FilePath(const FileDescriptor* file) {
@@ -373,17 +317,10 @@
   return output;
 }
 
-string FilePathBasename(const FileDescriptor* file) {
-  string output;
-  string basename;
-  string directory;
-  PathSplit(file->name(), &directory, &basename);
-  basename = StripProto(basename);
-
-  // CamelCase to be more ObjC friendly.
-  output = UnderscoresToCamelCase(basename, true);
-
-  return output;
+string FileClassPrefix(const FileDescriptor* file) {
+  // Default is empty string, no need to check has_objc_class_prefix.
+  string result = file->options().objc_class_prefix();
+  return result;
 }
 
 string FileClassName(const FileDescriptor* file) {
@@ -392,7 +329,7 @@
   name += "Root";
   // There aren't really any reserved words that end in "Root", but playing
   // it safe and checking.
-  return SanitizeNameForObjC(name, "_RootClass", NULL);
+  return SanitizeNameForObjC(name, "_RootClass");
 }
 
 string ClassNameWorker(const Descriptor* descriptor) {
@@ -414,15 +351,11 @@
 }
 
 string ClassName(const Descriptor* descriptor) {
-  return ClassName(descriptor, NULL);
-}
-
-string ClassName(const Descriptor* descriptor, string* out_suffix_added) {
   // 1. Message names are used as is (style calls for CamelCase, trust it).
   // 2. Check for reserved word at the very end and then suffix things.
   string prefix = FileClassPrefix(descriptor->file());
   string name = ClassNameWorker(descriptor);
-  return SanitizeNameForObjC(prefix + name, "_Class", out_suffix_added);
+  return SanitizeNameForObjC(prefix + name, "_Class");
 }
 
 string EnumName(const EnumDescriptor* descriptor) {
@@ -436,7 +369,7 @@
   //    yields Fixed_Class, Fixed_Size.
   string name = FileClassPrefix(descriptor->file());
   name += ClassNameWorker(descriptor);
-  return SanitizeNameForObjC(name, "_Enum", NULL);
+  return SanitizeNameForObjC(name, "_Enum");
 }
 
 string EnumValueName(const EnumValueDescriptor* descriptor) {
@@ -451,7 +384,7 @@
   const string& name = class_name + "_" + value_str;
   // There aren't really any reserved words with an underscore and a leading
   // capital letter, but playing it safe and checking.
-  return SanitizeNameForObjC(name, "_Value", NULL);
+  return SanitizeNameForObjC(name, "_Value");
 }
 
 string EnumValueShortName(const EnumValueDescriptor* descriptor) {
@@ -488,7 +421,7 @@
 string ExtensionMethodName(const FieldDescriptor* descriptor) {
   const string& name = NameFromFieldDescriptor(descriptor);
   const string& result = UnderscoresToCamelCase(name, false);
-  return SanitizeNameForObjC(result, "_Extension", NULL);
+  return SanitizeNameForObjC(result, "_Extension");
 }
 
 string FieldName(const FieldDescriptor* field) {
@@ -503,7 +436,7 @@
       result += "_p";
     }
   }
-  return SanitizeNameForObjC(result, "_p", NULL);
+  return SanitizeNameForObjC(result, "_p");
 }
 
 string FieldNameCapitalized(const FieldDescriptor* field) {
@@ -863,26 +796,21 @@
   return false;
 }
 
-string BuildFlagsString(const FlagType flag_type,
-                        const vector<string>& strings) {
+string BuildFlagsString(const vector<string>& strings) {
   if (strings.size() == 0) {
-    return GetZeroEnumNameForFlagType(flag_type);
-  } else if (strings.size() == 1) {
-    return strings[0];
+    return "0";
   }
-  string string("(" + GetEnumNameForFlagType(flag_type) + ")(");
+  string string;
   for (size_t i = 0; i != strings.size(); ++i) {
     if (i > 0) {
       string.append(" | ");
     }
     string.append(strings[i]);
   }
-  string.append(")");
   return string;
 }
 
-string BuildCommentsString(const SourceLocation& location,
-                           bool prefer_single_line) {
+string BuildCommentsString(const SourceLocation& location) {
   const string& comments = location.leading_comments.empty()
                                ? location.trailing_comments
                                : location.leading_comments;
@@ -891,82 +819,77 @@
   while (!lines.empty() && lines.back().empty()) {
     lines.pop_back();
   }
-  // If there are no comments, just return an empty string.
-  if (lines.size() == 0) {
-    return "";
-  }
-
-  string prefix;
-  string suffix;
+  string prefix("///");
+  string suffix("\n");
   string final_comments;
-  string epilogue;
-
-  bool add_leading_space = false;
-
-  if (prefer_single_line && lines.size() == 1) {
-    prefix = "/** ";
-    suffix = " */\n";
-  } else {
-    prefix = "* ";
-    suffix = "\n";
-    final_comments += "/**\n";
-    epilogue = " **/\n";
-    add_leading_space = true;
-  }
-
   for (int i = 0; i < lines.size(); i++) {
-    string line = StripPrefixString(lines[i], " ");
-    // HeaderDoc and appledoc use '\' and '@' for markers; escape them.
-    line = StringReplace(line, "\\", "\\\\", true);
-    line = StringReplace(line, "@", "\\@", true);
-    // Decouple / from * to not have inline comments inside comments.
-    line = StringReplace(line, "/*", "/\\*", true);
-    line = StringReplace(line, "*/", "*\\/", true);
-    line = prefix + line;
-    StripWhitespace(&line);
-    // If not a one line, need to add the first space before *, as
-    // StripWhitespace would have removed it.
-    line = (add_leading_space ? " " : "") + line;
-    final_comments += line + suffix;
+    // HeaderDoc uses '\' and '@' for markers; escape them.
+    const string line = StringReplace(lines[i], "\\", "\\\\", true);
+    final_comments +=
+        prefix + StringReplace(line, "@", "\\@", true) + suffix;
   }
-  final_comments += epilogue;
   return final_comments;
 }
 
-// Making these a generator option for folks that don't use CocoaPods, but do
-// want to put the library in a framework is an interesting question. The
-// problem is it means changing sources shipped with the library to actually
-// use a different value; so it isn't as simple as a option.
-const char* const ProtobufLibraryFrameworkName = "Protobuf";
+namespace {
 
-string ProtobufFrameworkImportSymbol(const string& framework_name) {
-  // GPB_USE_[framework_name]_FRAMEWORK_IMPORTS
-  string result = string("GPB_USE_");
-  result += ToUpper(framework_name);
-  result += "_FRAMEWORK_IMPORTS";
+// Internal helper class that parses the expected package to prefix mappings
+// file.
+class Parser {
+ public:
+  Parser(map<string, string>* inout_package_to_prefix_map)
+      : prefix_map_(inout_package_to_prefix_map), line_(0) {}
+
+  // Parses a check of input, returning success/failure.
+  bool ParseChunk(StringPiece chunk);
+
+  // Should be called to finish parsing (after all input has been provided via
+  // ParseChunk()).  Returns success/failure.
+  bool Finish();
+
+  int last_line() const { return line_; }
+  string error_str() const { return error_str_; }
+
+ private:
+  bool ParseLoop();
+
+  map<string, string>* prefix_map_;
+  int line_;
+  string error_str_;
+  StringPiece p_;
+  string leftover_;
+};
+
+bool Parser::ParseChunk(StringPiece chunk) {
+  if (!leftover_.empty()) {
+    chunk.AppendToString(&leftover_);
+    p_ = StringPiece(leftover_);
+  } else {
+    p_ = chunk;
+  }
+  bool result = ParseLoop();
+  if (p_.empty()) {
+    leftover_.clear();
+  } else {
+    leftover_ = p_.ToString();
+  }
   return result;
 }
 
-bool IsProtobufLibraryBundledProtoFile(const FileDescriptor* file) {
-  // We don't check the name prefix or proto package because some files
-  // (descriptor.proto), aren't shipped generated by the library, so this
-  // seems to be the safest way to only catch the ones shipped.
-  const string name = file->name();
-  if (name == "google/protobuf/any.proto" ||
-      name == "google/protobuf/api.proto" ||
-      name == "google/protobuf/duration.proto" ||
-      name == "google/protobuf/empty.proto" ||
-      name == "google/protobuf/field_mask.proto" ||
-      name == "google/protobuf/source_context.proto" ||
-      name == "google/protobuf/struct.proto" ||
-      name == "google/protobuf/timestamp.proto" ||
-      name == "google/protobuf/type.proto" ||
-      name == "google/protobuf/wrappers.proto") {
+bool Parser::Finish() {
+  if (leftover_.empty()) {
     return true;
   }
-  return false;
+  // Force a newline onto the end to finish parsing.
+  p_ = StringPiece(leftover_ + "\n");
+  if (!ParseLoop()) {
+    return false;
+  }
+  return p_.empty();  // Everything used?
 }
 
+static bool ascii_isnewline(char c) { return c == '\n' || c == '\r'; }
+
 bool ReadLine(StringPiece* input, StringPiece* line) {
   for (int len = 0; len < input->size(); ++len) {
     if (ascii_isnewline((*input)[len])) {
@@ -979,6 +902,15 @@
   return false;  // Ran out of input with no newline.
 }
 
+void TrimWhitespace(StringPiece* input) {
+  while (!input->empty() && ascii_isspace(*input->data())) {
+    input->remove_prefix(1);
+  }
+  while (!input->empty() && ascii_isspace((*input)[input->length() - 1])) {
+    input->remove_suffix(1);
+  }
+}
+
 void RemoveComment(StringPiece* input) {
   int offset = input->find('#');
   if (offset != StringPiece::npos) {
@@ -986,64 +918,93 @@
   }
 }
 
-namespace {
-
-class ExpectedPrefixesCollector : public LineConsumer {
- public:
-  ExpectedPrefixesCollector(std::map<string, string>* inout_package_to_prefix_map)
-      : prefix_map_(inout_package_to_prefix_map) {}
-
-  virtual bool ConsumeLine(const StringPiece& line, string* out_error);
-
- private:
-  std::map<string, string>* prefix_map_;
-};
-
-bool ExpectedPrefixesCollector::ConsumeLine(
-    const StringPiece& line, string* out_error) {
-  int offset = line.find('=');
-  if (offset == StringPiece::npos) {
-    *out_error =
-        string("Expected prefixes file line without equal sign: '") +
-        line.ToString() + "'.";
-    return false;
+bool Parser::ParseLoop() {
+  StringPiece line;
+  while (ReadLine(&p_, &line)) {
+    ++line_;
+    RemoveComment(&line);
+    TrimWhitespace(&line);
+    if (line.size() == 0) {
+      continue;  // Blank line.
+    }
+    int offset = line.find('=');
+    if (offset == StringPiece::npos) {
+      error_str_ =
+          string("Line without equal sign: '") + line.ToString() + "'.";
+      return false;
+    }
+    StringPiece package(line, 0, offset);
+    StringPiece prefix(line, offset + 1, line.length() - offset - 1);
+    TrimWhitespace(&package);
+    TrimWhitespace(&prefix);
+    // Don't really worry about error checking the package/prefix for
+    // being valid.  Assume the file is validated when it is created/edited.
+    (*prefix_map_)[package.ToString()] = prefix.ToString();
   }
-  StringPiece package(line, 0, offset);
-  StringPiece prefix(line, offset + 1, line.length() - offset - 1);
-  StringPieceTrimWhitespace(&package);
-  StringPieceTrimWhitespace(&prefix);
-  // Don't really worry about error checking the package/prefix for
-  // being valid.  Assume the file is validated when it is created/edited.
-  (*prefix_map_)[package.ToString()] = prefix.ToString();
   return true;
 }
 
 bool LoadExpectedPackagePrefixes(const Options &generation_options,
-                                 std::map<string, string>* prefix_map,
+                                 map<string, string>* prefix_map,
                                  string* out_error) {
   if (generation_options.expected_prefixes_path.empty()) {
     return true;
   }
 
-  ExpectedPrefixesCollector collector(prefix_map);
-  return ParseSimpleFile(
-      generation_options.expected_prefixes_path, &collector, out_error);
+  int fd;
+  do {
+    fd = open(generation_options.expected_prefixes_path.c_str(), O_RDONLY);
+  } while (fd < 0 && errno == EINTR);
+  if (fd < 0) {
+    *out_error =
+        string("error: Unable to open \"") +
+        generation_options.expected_prefixes_path +
+        "\", " + strerror(errno);
+    return false;
+  }
+  io::FileInputStream file_stream(fd);
+  file_stream.SetCloseOnDelete(true);
+
+  Parser parser(prefix_map);
+  const void* buf;
+  int buf_len;
+  while (file_stream.Next(&buf, &buf_len)) {
+    if (buf_len == 0) {
+      continue;
+    }
+
+    if (!parser.ParseChunk(StringPiece(static_cast<const char*>(buf), buf_len))) {
+      *out_error =
+          string("error: ") + generation_options.expected_prefixes_path +
+          " Line " + SimpleItoa(parser.last_line()) + ", " + parser.error_str();
+      return false;
+    }
+  }
+  return parser.Finish();
 }
 
-bool ValidateObjCClassPrefix(
-    const FileDescriptor* file,
-    const string& expected_prefixes_path,
-    const std::map<string, string>& expected_package_prefixes,
-    string* out_error) {
+}  // namespace
+
+bool ValidateObjCClassPrefix(const FileDescriptor* file,
+                             const Options& generation_options,
+                             string* out_error) {
   const string prefix = file->options().objc_class_prefix();
   const string package = file->package();
 
   // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
   // error cases, so it seems to be ok to use as a back door for warnings.
 
+  // Load any expected package prefixes to validate against those.
+  map<string, string> expected_package_prefixes;
+  if (!LoadExpectedPackagePrefixes(generation_options,
+                                   &expected_package_prefixes,
+                                   out_error)) {
+    return false;
+  }
+
   // Check: Error - See if there was an expected prefix for the package and
   // report if it doesn't match (wrong or missing).
-  std::map<string, string>::const_iterator package_match =
+  map<string, string>::iterator package_match =
       expected_package_prefixes.find(package);
   if (package_match != expected_package_prefixes.end()) {
     // There was an entry, and...
@@ -1064,136 +1025,72 @@
   }
 
   // If there was no prefix option, we're done at this point.
-  if (prefix.empty()) {
+  if (prefix.length() == 0) {
     // No prefix, nothing left to check.
     return true;
   }
 
-  // Check: Warning - Make sure the prefix is is a reasonable value according
-  // to Apple's rules (the checks above implicitly whitelist anything that
-  // doesn't meet these rules).
-  if (!ascii_isupper(prefix[0])) {
-    std::cerr << std::endl
-         << "protoc:0: warning: Invalid 'option objc_class_prefix = \""
-         << prefix << "\";' in '" << file->name() << "';"
-         << " it should start with a capital letter." << std::endl;
-    std::cerr.flush();
-  }
-  if (prefix.length() < 3) {
-    // Apple reserves 2 character prefixes for themselves. They do use some
-    // 3 character prefixes, but they haven't updated the rules/docs.
-    std::cerr << std::endl
-         << "protoc:0: warning: Invalid 'option objc_class_prefix = \""
-         << prefix << "\";' in '" << file->name() << "';"
-         << " Apple recommends they should be at least 3 characters long."
-         << std::endl;
-    std::cerr.flush();
-  }
-
-  // Look for any other package that uses the same prefix.
-  string other_package_for_prefix;
-  for (std::map<string, string>::const_iterator i = expected_package_prefixes.begin();
-       i != expected_package_prefixes.end(); ++i) {
-    if (i->second == prefix) {
-      other_package_for_prefix = i->first;
-      break;
-    }
-  }
-
-  // Check: Warning - If the file does not have a package, check whether
-  // the prefix declared is being used by another package or not.
-  if (package.empty()) {
-    // The file does not have a package and ...
-    if (other_package_for_prefix.empty()) {
-      // ... no other package has declared that prefix.
-      std::cerr << std::endl
-           << "protoc:0: warning: File '" << file->name() << "' has no "
-           << "package. Consider adding a new package to the proto and adding '"
-           << "new.package = " << prefix << "' to the expected prefixes file ("
-           << expected_prefixes_path << ")." << std::endl;
-      std::cerr.flush();
-    } else {
-      // ... another package has declared the same prefix.
-      std::cerr << std::endl
-           << "protoc:0: warning: File '" << file->name() << "' has no package "
-           << "and package '" << other_package_for_prefix << "' already uses '"
-           << prefix << "' as its prefix. Consider either adding a new package "
-           << "to the proto, or reusing one of the packages already using this "
-           << "prefix in the expected prefixes file ("
-           << expected_prefixes_path << ")." << std::endl;
-      std::cerr.flush();
-    }
-    return true;
-  }
-
   // Check: Error - Make sure the prefix wasn't expected for a different
   // package (overlap is allowed, but it has to be listed as an expected
   // overlap).
-  if (!other_package_for_prefix.empty()) {
-    *out_error =
-        "error: Found 'option objc_class_prefix = \"" + prefix +
-        "\";' in '" + file->name() +
-        "'; that prefix is already used for 'package " +
-        other_package_for_prefix + ";'. It can only be reused by listing " +
-        "it in the expected file (" +
-        expected_prefixes_path + ").";
-    return false;  // Only report first usage of the prefix.
+  for (map<string, string>::iterator i = expected_package_prefixes.begin();
+       i != expected_package_prefixes.end(); ++i) {
+    if (i->second == prefix) {
+      *out_error =
+          "error: Found 'option objc_class_prefix = \"" + prefix +
+          "\";' in '" + file->name() +
+          "'; that prefix is already used for 'package " + i->first +
+          ";'. It can only be reused by listing it in the expected file (" +
+          generation_options.expected_prefixes_path + ").";
+      return false;  // Only report first usage of the prefix.
+    }
+  }
+
+  // Check: Warning - Make sure the prefix is is a reasonable value according
+  // to Apple's rules (the checks above implicitly whitelist anything that
+  // doesn't meet these rules).
+  if (!ascii_isupper(prefix[0])) {
+    cerr << endl
+         << "protoc:0: warning: Invalid 'option objc_class_prefix = \""
+         << prefix << "\";' in '" << file->name() << "';"
+         << " it should start with a capital letter." << endl;
+    cerr.flush();
+  }
+  if (prefix.length() < 3) {
+    // Apple reserves 2 character prefixes for themselves. They do use some
+    // 3 character prefixes, but they haven't updated the rules/docs.
+    cerr << endl
+         << "protoc:0: warning: Invalid 'option objc_class_prefix = \""
+         << prefix << "\";' in '" << file->name() << "';"
+         << " Apple recommends they should be at least 3 characters long."
+         << endl;
+    cerr.flush();
   }
 
   // Check: Warning - If the given package/prefix pair wasn't expected, issue a
   // warning issue a warning suggesting it gets added to the file.
   if (!expected_package_prefixes.empty()) {
-    std::cerr << std::endl
+    cerr << endl
          << "protoc:0: warning: Found unexpected 'option objc_class_prefix = \""
          << prefix << "\";' in '" << file->name() << "';"
          << " consider adding it to the expected prefixes file ("
-         << expected_prefixes_path << ")." << std::endl;
-    std::cerr.flush();
+         << generation_options.expected_prefixes_path << ")." << endl;
+    cerr.flush();
   }
 
   return true;
 }
 
-}  // namespace
-
-bool ValidateObjCClassPrefixes(const vector<const FileDescriptor*>& files,
-                               const Options& generation_options,
-                               string* out_error) {
-  // Load the expected package prefixes, if available, to validate against.
-  std::map<string, string> expected_package_prefixes;
-  if (!LoadExpectedPackagePrefixes(generation_options,
-                                   &expected_package_prefixes,
-                                   out_error)) {
-    return false;
-  }
-
-  for (int i = 0; i < files.size(); i++) {
-    bool is_valid =
-        ValidateObjCClassPrefix(files[i],
-                                generation_options.expected_prefixes_path,
-                                expected_package_prefixes,
-                                out_error);
-    if (!is_valid) {
-      return false;
-    }
-  }
-  return true;
-}
-
-TextFormatDecodeData::TextFormatDecodeData() { }
-
-TextFormatDecodeData::~TextFormatDecodeData() { }
-
 void TextFormatDecodeData::AddString(int32 key,
                                      const string& input_for_decode,
                                      const string& desired_output) {
   for (vector<DataEntry>::const_iterator i = entries_.begin();
        i != entries_.end(); ++i) {
     if (i->first == key) {
-      std::cerr << "error: duplicate key (" << key
+      cerr << "error: duplicate key (" << key
            << ") making TextFormat data, input: \"" << input_for_decode
-           << "\", desired: \"" << desired_output << "\"." << std::endl;
-      std::cerr.flush();
+           << "\", desired: \"" << desired_output << "\"." << endl;
+      cerr.flush();
       abort();
     }
   }
@@ -1204,7 +1101,7 @@
 }
 
 string TextFormatDecodeData::Data() const {
-  std::ostringstream data_stringstream;
+  ostringstream data_stringstream;
 
   if (num_entries() > 0) {
     io::OstreamOutputStream data_outputstream(&data_stringstream);
@@ -1345,18 +1242,18 @@
 string TextFormatDecodeData::DecodeDataForString(const string& input_for_decode,
                                                  const string& desired_output) {
   if ((input_for_decode.size() == 0) || (desired_output.size() == 0)) {
-    std::cerr << "error: got empty string for making TextFormat data, input: \""
+    cerr << "error: got empty string for making TextFormat data, input: \""
          << input_for_decode << "\", desired: \"" << desired_output << "\"."
-         << std::endl;
-    std::cerr.flush();
+         << endl;
+    cerr.flush();
     abort();
   }
   if ((input_for_decode.find('\0') != string::npos) ||
       (desired_output.find('\0') != string::npos)) {
-    std::cerr << "error: got a null char in a string for making TextFormat data,"
+    cerr << "error: got a null char in a string for making TextFormat data,"
          << " input: \"" << CEscape(input_for_decode) << "\", desired: \""
-         << CEscape(desired_output) << "\"." << std::endl;
-    std::cerr.flush();
+         << CEscape(desired_output) << "\"." << endl;
+    cerr.flush();
     abort();
   }
 
@@ -1392,289 +1289,6 @@
   return builder.Finish() + (char)'\0';
 }
 
-namespace {
-
-class Parser {
- public:
-  Parser(LineConsumer* line_consumer)
-      : line_consumer_(line_consumer), line_(0) {}
-
-  // Parses a check of input, returning success/failure.
-  bool ParseChunk(StringPiece chunk);
-
-  // Should be called to finish parsing (after all input has been provided via
-  // ParseChunk()).  Returns success/failure.
-  bool Finish();
-
-  int last_line() const { return line_; }
-  string error_str() const { return error_str_; }
-
- private:
-  bool ParseLoop();
-
-  LineConsumer* line_consumer_;
-  int line_;
-  string error_str_;
-  StringPiece p_;
-  string leftover_;
-};
-
-bool Parser::ParseChunk(StringPiece chunk) {
-  if (!leftover_.empty()) {
-    chunk.AppendToString(&leftover_);
-    p_ = StringPiece(leftover_);
-  } else {
-    p_ = chunk;
-  }
-  bool result = ParseLoop();
-  if (p_.empty()) {
-    leftover_.clear();
-  } else {
-    leftover_ = p_.ToString();
-  }
-  return result;
-}
-
-bool Parser::Finish() {
-  if (leftover_.empty()) {
-    return true;
-  }
-  // Force a newline onto the end to finish parsing.
-  leftover_ += "\n";
-  p_ = StringPiece(leftover_);
-  if (!ParseLoop()) {
-    return false;
-  }
-  return p_.empty();  // Everything used?
-}
-
-bool Parser::ParseLoop() {
-  StringPiece line;
-  while (ReadLine(&p_, &line)) {
-    ++line_;
-    RemoveComment(&line);
-    StringPieceTrimWhitespace(&line);
-    if (line.size() == 0) {
-      continue;  // Blank line.
-    }
-    if (!line_consumer_->ConsumeLine(line, &error_str_)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-}  // namespace
-
-LineConsumer::LineConsumer() {}
-
-LineConsumer::~LineConsumer() {}
-
-bool ParseSimpleFile(
-    const string& path, LineConsumer* line_consumer, string* out_error) {
-  int fd;
-  do {
-    fd = posix::open(path.c_str(), O_RDONLY);
-  } while (fd < 0 && errno == EINTR);
-  if (fd < 0) {
-    *out_error =
-        string("error: Unable to open \"") + path + "\", " + strerror(errno);
-    return false;
-  }
-  io::FileInputStream file_stream(fd);
-  file_stream.SetCloseOnDelete(true);
-
-  Parser parser(line_consumer);
-  const void* buf;
-  int buf_len;
-  while (file_stream.Next(&buf, &buf_len)) {
-    if (buf_len == 0) {
-      continue;
-    }
-
-    if (!parser.ParseChunk(StringPiece(static_cast<const char*>(buf), buf_len))) {
-      *out_error =
-          string("error: ") + path +
-          " Line " + SimpleItoa(parser.last_line()) + ", " + parser.error_str();
-      return false;
-    }
-  }
-  return parser.Finish();
-}
-
-ImportWriter::ImportWriter(
-  const string& generate_for_named_framework,
-  const string& named_framework_to_proto_path_mappings_path)
-    : generate_for_named_framework_(generate_for_named_framework),
-      named_framework_to_proto_path_mappings_path_(
-          named_framework_to_proto_path_mappings_path),
-      need_to_parse_mapping_file_(true) {
-}
-
-ImportWriter::~ImportWriter() {}
-
-void ImportWriter::AddFile(const FileDescriptor* file,
-                           const string& header_extension) {
-  const string file_path(FilePath(file));
-
-  if (IsProtobufLibraryBundledProtoFile(file)) {
-    protobuf_framework_imports_.push_back(
-        FilePathBasename(file) + header_extension);
-    protobuf_non_framework_imports_.push_back(file_path + header_extension);
-    return;
-  }
-
-  // Lazy parse any mappings.
-  if (need_to_parse_mapping_file_) {
-    ParseFrameworkMappings();
-  }
-
-  std::map<string, string>::iterator proto_lookup =
-      proto_file_to_framework_name_.find(file->name());
-  if (proto_lookup != proto_file_to_framework_name_.end()) {
-    other_framework_imports_.push_back(
-        proto_lookup->second + "/" +
-        FilePathBasename(file) + header_extension);
-    return;
-  }
-
-  if (!generate_for_named_framework_.empty()) {
-    other_framework_imports_.push_back(
-        generate_for_named_framework_ + "/" +
-        FilePathBasename(file) + header_extension);
-    return;
-  }
-
-  other_imports_.push_back(file_path + header_extension);
-}
-
-void ImportWriter::Print(io::Printer* printer) const {
-  assert(protobuf_non_framework_imports_.size() ==
-         protobuf_framework_imports_.size());
-
-  bool add_blank_line = false;
-
-  if (protobuf_framework_imports_.size() > 0) {
-    const string framework_name(ProtobufLibraryFrameworkName);
-    const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name));
-
-    printer->Print(
-        "#if $cpp_symbol$\n",
-        "cpp_symbol", cpp_symbol);
-    for (vector<string>::const_iterator iter = protobuf_framework_imports_.begin();
-         iter != protobuf_framework_imports_.end(); ++iter) {
-      printer->Print(
-          " #import <$framework_name$/$header$>\n",
-          "framework_name", framework_name,
-          "header", *iter);
-    }
-    printer->Print(
-        "#else\n");
-    for (vector<string>::const_iterator iter = protobuf_non_framework_imports_.begin();
-         iter != protobuf_non_framework_imports_.end(); ++iter) {
-      printer->Print(
-          " #import \"$header$\"\n",
-          "header", *iter);
-    }
-    printer->Print(
-        "#endif\n");
-
-    add_blank_line = true;
-  }
-
-  if (other_framework_imports_.size() > 0) {
-    if (add_blank_line) {
-      printer->Print("\n");
-    }
-
-    for (vector<string>::const_iterator iter = other_framework_imports_.begin();
-         iter != other_framework_imports_.end(); ++iter) {
-      printer->Print(
-          " #import <$header$>\n",
-          "header", *iter);
-    }
-
-    add_blank_line = true;
-  }
-
-  if (other_imports_.size() > 0) {
-    if (add_blank_line) {
-      printer->Print("\n");
-    }
-
-    for (vector<string>::const_iterator iter = other_imports_.begin();
-         iter != other_imports_.end(); ++iter) {
-      printer->Print(
-          " #import \"$header$\"\n",
-          "header", *iter);
-    }
-  }
-}
-
-void ImportWriter::ParseFrameworkMappings() {
-  need_to_parse_mapping_file_ = false;
-  if (named_framework_to_proto_path_mappings_path_.empty()) {
-    return;  // Nothing to do.
-  }
-
-  ProtoFrameworkCollector collector(&proto_file_to_framework_name_);
-  string parse_error;
-  if (!ParseSimpleFile(named_framework_to_proto_path_mappings_path_,
-                       &collector, &parse_error)) {
-    std::cerr << "error parsing " << named_framework_to_proto_path_mappings_path_
-         << " : " << parse_error << std::endl;
-    std::cerr.flush();
-  }
-}
-
-bool ImportWriter::ProtoFrameworkCollector::ConsumeLine(
-    const StringPiece& line, string* out_error) {
-  int offset = line.find(':');
-  if (offset == StringPiece::npos) {
-    *out_error =
-        string("Framework/proto file mapping line without colon sign: '") +
-        line.ToString() + "'.";
-    return false;
-  }
-  StringPiece framework_name(line, 0, offset);
-  StringPiece proto_file_list(line, offset + 1, line.length() - offset - 1);
-  StringPieceTrimWhitespace(&framework_name);
-
-  int start = 0;
-  while (start < proto_file_list.length()) {
-    offset = proto_file_list.find(',', start);
-    if (offset == StringPiece::npos) {
-      offset = proto_file_list.length();
-    }
-
-    StringPiece proto_file(proto_file_list, start, offset - start);
-    StringPieceTrimWhitespace(&proto_file);
-    if (proto_file.size() != 0) {
-      std::map<string, string>::iterator existing_entry =
-          map_->find(proto_file.ToString());
-      if (existing_entry != map_->end()) {
-        std::cerr << "warning: duplicate proto file reference, replacing framework entry for '"
-             << proto_file.ToString() << "' with '" << framework_name.ToString()
-             << "' (was '" << existing_entry->second << "')." << std::endl;
-        std::cerr.flush();
-      }
-
-      if (proto_file.find(' ') != StringPiece::npos) {
-        std::cerr << "note: framework mapping file had a proto file with a space in, hopefully that isn't a missing comma: '"
-             << proto_file.ToString() << "'" << std::endl;
-        std::cerr.flush();
-      }
-
-      (*map_)[proto_file.ToString()] = framework_name.ToString();
-    }
-
-    start = offset + 1;
-  }
-
-  return true;
-}
-
-
 }  // namespace objectivec
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.h b/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
index daea760..3f56d94 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Helper functions for generating ObjectiveC code.
-
 #ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__
 #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__
 
@@ -48,71 +46,63 @@
 struct Options {
   Options();
   string expected_prefixes_path;
-  string generate_for_named_framework;
-  string named_framework_to_proto_path_mappings_path;
 };
 
 // Escape C++ trigraphs by escaping question marks to "\?".
-string LIBPROTOC_EXPORT EscapeTrigraphs(const string& to_escape);
+string EscapeTrigraphs(const string& to_escape);
 
 // Strips ".proto" or ".protodevel" from the end of a filename.
-string LIBPROTOC_EXPORT StripProto(const string& filename);
-
-// Remove white space from either end of a StringPiece.
-void LIBPROTOC_EXPORT StringPieceTrimWhitespace(StringPiece* input);
+string StripProto(const string& filename);
 
 // Returns true if the name requires a ns_returns_not_retained attribute applied
 // to it.
-bool LIBPROTOC_EXPORT IsRetainedName(const string& name);
+bool IsRetainedName(const string& name);
 
 // Returns true if the name starts with "init" and will need to have special
 // handling under ARC.
-bool LIBPROTOC_EXPORT IsInitName(const string& name);
+bool IsInitName(const string& name);
 
-// Gets the objc_class_prefix.
-string LIBPROTOC_EXPORT FileClassPrefix(const FileDescriptor* file);
+// Gets the name of the file we're going to generate (sans the .pb.h
+// extension).  This does not include the path to that file.
+string FileName(const FileDescriptor* file);
 
 // Gets the path of the file we're going to generate (sans the .pb.h
 // extension).  The path will be dependent on the objectivec package
 // declared in the proto package.
-string LIBPROTOC_EXPORT FilePath(const FileDescriptor* file);
-
-// Just like FilePath(), but without the directory part.
-string LIBPROTOC_EXPORT FilePathBasename(const FileDescriptor* file);
+string FilePath(const FileDescriptor* file);
 
 // Gets the name of the root class we'll generate in the file.  This class
 // is not meant for external consumption, but instead contains helpers that
 // the rest of the classes need
-string LIBPROTOC_EXPORT FileClassName(const FileDescriptor* file);
+string FileClassName(const FileDescriptor* file);
 
 // These return the fully-qualified class name corresponding to the given
 // descriptor.
-string LIBPROTOC_EXPORT ClassName(const Descriptor* descriptor);
-string LIBPROTOC_EXPORT ClassName(const Descriptor* descriptor, string* out_suffix_added);
-string LIBPROTOC_EXPORT EnumName(const EnumDescriptor* descriptor);
+string ClassName(const Descriptor* descriptor);
+string EnumName(const EnumDescriptor* descriptor);
 
 // Returns the fully-qualified name of the enum value corresponding to the
 // the descriptor.
-string LIBPROTOC_EXPORT EnumValueName(const EnumValueDescriptor* descriptor);
+string EnumValueName(const EnumValueDescriptor* descriptor);
 
 // Returns the name of the enum value corresponding to the descriptor.
-string LIBPROTOC_EXPORT EnumValueShortName(const EnumValueDescriptor* descriptor);
+string EnumValueShortName(const EnumValueDescriptor* descriptor);
 
 // Reverse what an enum does.
-string LIBPROTOC_EXPORT UnCamelCaseEnumShortName(const string& name);
+string UnCamelCaseEnumShortName(const string& name);
 
 // Returns the name to use for the extension (used as the method off the file's
 // Root class).
-string LIBPROTOC_EXPORT ExtensionMethodName(const FieldDescriptor* descriptor);
+string ExtensionMethodName(const FieldDescriptor* descriptor);
 
 // Returns the transformed field name.
-string LIBPROTOC_EXPORT FieldName(const FieldDescriptor* field);
-string LIBPROTOC_EXPORT FieldNameCapitalized(const FieldDescriptor* field);
+string FieldName(const FieldDescriptor* field);
+string FieldNameCapitalized(const FieldDescriptor* field);
 
 // Returns the transformed oneof name.
-string LIBPROTOC_EXPORT OneofEnumName(const OneofDescriptor* descriptor);
-string LIBPROTOC_EXPORT OneofName(const OneofDescriptor* descriptor);
-string LIBPROTOC_EXPORT OneofNameCapitalized(const OneofDescriptor* descriptor);
+string OneofEnumName(const OneofDescriptor* descriptor);
+string OneofName(const OneofDescriptor* descriptor);
+string OneofNameCapitalized(const OneofDescriptor* descriptor);
 
 inline bool HasFieldPresence(const FileDescriptor* file) {
   return file->syntax() != FileDescriptor::SYNTAX_PROTO3;
@@ -127,7 +117,7 @@
 }
 
 // Reverse of the above.
-string LIBPROTOC_EXPORT UnCamelCaseFieldName(const string& name, const FieldDescriptor* field);
+string UnCamelCaseFieldName(const string& name, const FieldDescriptor* field);
 
 enum ObjectiveCType {
   OBJECTIVECTYPE_INT32,
@@ -143,25 +133,9 @@
   OBJECTIVECTYPE_MESSAGE
 };
 
-enum FlagType {
-  FLAGTYPE_DESCRIPTOR_INITIALIZATION,
-  FLAGTYPE_EXTENSION,
-  FLAGTYPE_FIELD
-};
-
 template<class TDescriptor>
-string GetOptionalDeprecatedAttribute(
-    const TDescriptor* descriptor,
-    const FileDescriptor* file = NULL,
-    bool preSpace = true, bool postNewline = false) {
-  bool isDeprecated = descriptor->options().deprecated();
-  // The file is only passed when checking Messages & Enums, so those types
-  // get tagged. At the moment, it doesn't seem to make sense to tag every
-  // field or enum value with when the file is deprecated.
-  if (!isDeprecated && file) {
-    isDeprecated = file->options().deprecated();
-  }
-  if (isDeprecated) {
+string GetOptionalDeprecatedAttribute(const TDescriptor* descriptor, bool preSpace = true, bool postNewline = false) {
+  if (descriptor->options().deprecated()) {
     string result = "DEPRECATED_ATTRIBUTE";
     if (preSpace) {
       result.insert(0, " ");
@@ -175,51 +149,38 @@
   }
 }
 
-string LIBPROTOC_EXPORT GetCapitalizedType(const FieldDescriptor* field);
+string GetCapitalizedType(const FieldDescriptor* field);
 
-ObjectiveCType LIBPROTOC_EXPORT GetObjectiveCType(FieldDescriptor::Type field_type);
+ObjectiveCType GetObjectiveCType(FieldDescriptor::Type field_type);
 
 inline ObjectiveCType GetObjectiveCType(const FieldDescriptor* field) {
   return GetObjectiveCType(field->type());
 }
 
-bool LIBPROTOC_EXPORT IsPrimitiveType(const FieldDescriptor* field);
-bool LIBPROTOC_EXPORT IsReferenceType(const FieldDescriptor* field);
+bool IsPrimitiveType(const FieldDescriptor* field);
+bool IsReferenceType(const FieldDescriptor* field);
 
-string LIBPROTOC_EXPORT GPBGenericValueFieldName(const FieldDescriptor* field);
-string LIBPROTOC_EXPORT DefaultValue(const FieldDescriptor* field);
-bool LIBPROTOC_EXPORT HasNonZeroDefaultValue(const FieldDescriptor* field);
+string GPBGenericValueFieldName(const FieldDescriptor* field);
+string DefaultValue(const FieldDescriptor* field);
+bool HasNonZeroDefaultValue(const FieldDescriptor* field);
 
-string LIBPROTOC_EXPORT BuildFlagsString(const FlagType type, const vector<string>& strings);
+string BuildFlagsString(const vector<string>& strings);
 
-// Builds HeaderDoc/appledoc style comments out of the comments in the .proto
-// file.
-string LIBPROTOC_EXPORT BuildCommentsString(const SourceLocation& location,
-                           bool prefer_single_line);
+// Builds a HeaderDoc style comment out of the comments in the .proto file.
+string BuildCommentsString(const SourceLocation& location);
 
-// The name the commonly used by the library when built as a framework.
-// This lines up to the name used in the CocoaPod.
-extern LIBPROTOC_EXPORT const char* const ProtobufLibraryFrameworkName;
-// Returns the CPP symbol name to use as the gate for framework style imports
-// for the given framework name to use.
-string LIBPROTOC_EXPORT ProtobufFrameworkImportSymbol(const string& framework_name);
-
-// Checks if the file is one of the proto's bundled with the library.
-bool LIBPROTOC_EXPORT IsProtobufLibraryBundledProtoFile(const FileDescriptor* file);
-
-// Checks the prefix for the given files and outputs any warnings as needed. If
-// there are flat out errors, then out_error is filled in with the first error
-// and the result is false.
-bool LIBPROTOC_EXPORT ValidateObjCClassPrefixes(const vector<const FileDescriptor*>& files,
-                               const Options& generation_options,
-                               string* out_error);
+// Checks the prefix for a given file and outputs any warnings needed, if
+// there are flat out errors, then out_error is filled in and the result is
+// false.
+bool ValidateObjCClassPrefix(const FileDescriptor* file,
+                             const Options& generation_options,
+                             string* out_error);
 
 // Generate decode data needed for ObjC's GPBDecodeTextFormatName() to transform
 // the input into the expected output.
 class LIBPROTOC_EXPORT TextFormatDecodeData {
  public:
-  TextFormatDecodeData();
-  ~TextFormatDecodeData();
+  TextFormatDecodeData() {}
 
   void AddString(int32 key, const string& input_for_decode,
                  const string& desired_output);
@@ -236,54 +197,6 @@
   vector<DataEntry> entries_;
 };
 
-// Helper for parsing simple files.
-class LIBPROTOC_EXPORT LineConsumer {
- public:
-  LineConsumer();
-  virtual ~LineConsumer();
-  virtual bool ConsumeLine(const StringPiece& line, string* out_error) = 0;
-};
-
-bool LIBPROTOC_EXPORT ParseSimpleFile(
-    const string& path, LineConsumer* line_consumer, string* out_error);
-
-
-// Helper class for parsing framework import mappings and generating
-// import statements.
-class LIBPROTOC_EXPORT ImportWriter {
- public:
-  ImportWriter(const string& generate_for_named_framework,
-               const string& named_framework_to_proto_path_mappings_path);
-  ~ImportWriter();
-
-  void AddFile(const FileDescriptor* file, const string& header_extension);
-  void Print(io::Printer *printer) const;
-
- private:
-  class ProtoFrameworkCollector : public LineConsumer {
-   public:
-    ProtoFrameworkCollector(std::map<string, string>* inout_proto_file_to_framework_name)
-        : map_(inout_proto_file_to_framework_name) {}
-
-    virtual bool ConsumeLine(const StringPiece& line, string* out_error);
-
-   private:
-    std::map<string, string>* map_;
-  };
-
-  void ParseFrameworkMappings();
-
-  const string generate_for_named_framework_;
-  const string named_framework_to_proto_path_mappings_path_;
-  std::map<string, string> proto_file_to_framework_name_;
-  bool need_to_parse_mapping_file_;
-
-  vector<string> protobuf_framework_imports_;
-  vector<string> protobuf_non_framework_imports_;
-  vector<string> other_framework_imports_;
-  vector<string> other_imports_;
-};
-
 }  // namespace objectivec
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
index bcaf570..ac5d8ae 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
@@ -115,7 +115,7 @@
   if (value_field_flags.find("GPBFieldHasEnumDescriptor") != string::npos) {
     field_flags.push_back("GPBFieldHasEnumDescriptor");
   }
-  variables_["fieldflags"] = BuildFlagsString(FLAGTYPE_FIELD, field_flags);
+  variables_["fieldflags"] = BuildFlagsString(field_flags);
 
   ObjectiveCType value_objc_type = GetObjectiveCType(value_descriptor);
   const bool value_is_object_type =
@@ -162,7 +162,7 @@
 }
 
 void MapFieldGenerator::DetermineForwardDeclarations(
-    std::set<string>* fwd_decls) const {
+    set<string>* fwd_decls) const {
   RepeatedFieldGenerator::DetermineForwardDeclarations(fwd_decls);
   const FieldDescriptor* value_descriptor =
       descriptor_->message_type()->FindFieldByName("value");
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_map_field.h b/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
index 6664d84..bc68a68 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
@@ -51,7 +51,7 @@
   MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options);
   virtual ~MapFieldGenerator();
 
-  virtual void DetermineForwardDeclarations(std::set<string>* fwd_decls) const;
+  virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
  private:
   scoped_ptr<FieldGenerator> value_field_generator_;
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message.cc b/src/google/protobuf/compiler/objectivec/objectivec_message.cc
index 4f22e29..bf27259 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message.cc
@@ -156,7 +156,7 @@
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields[i] = descriptor->field(i);
   }
-  std::sort(fields, fields + descriptor->field_count(), FieldOrderingByNumber());
+  sort(fields, fields + descriptor->field_count(), FieldOrderingByNumber());
   return fields;
 }
 
@@ -168,7 +168,7 @@
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields[i] = descriptor->field(i);
   }
-  std::sort(fields, fields + descriptor->field_count(),
+  sort(fields, fields + descriptor->field_count(),
        FieldOrderingByStorageSize());
   return fields;
 }
@@ -180,10 +180,7 @@
     : root_classname_(root_classname),
       descriptor_(descriptor),
       field_generators_(descriptor, options),
-      class_name_(ClassName(descriptor_)),
-      deprecated_attribute_(
-          GetOptionalDeprecatedAttribute(descriptor, descriptor->file(), false, true)) {
-
+      class_name_(ClassName(descriptor_)) {
   for (int i = 0; i < descriptor_->extension_count(); i++) {
     extension_generators_.push_back(
         new ExtensionGenerator(class_name_, descriptor_->extension(i)));
@@ -233,7 +230,7 @@
   }
 }
 
-void MessageGenerator::DetermineForwardDeclarations(std::set<string>* fwd_decls) {
+void MessageGenerator::DetermineForwardDeclarations(set<string>* fwd_decls) {
   if (!IsMapEntryMessage(descriptor_)) {
     for (int i = 0; i < descriptor_->field_count(); i++) {
       const FieldDescriptor* fieldDescriptor = descriptor_->field(i);
@@ -249,22 +246,6 @@
   }
 }
 
-bool MessageGenerator::IncludesOneOfDefinition() const {
-  if (!oneof_generators_.empty()) {
-    return true;
-  }
-
-  for (vector<MessageGenerator*>::const_iterator iter =
-           nested_message_generators_.begin();
-       iter != nested_message_generators_.end(); ++iter) {
-    if ((*iter)->IncludesOneOfDefinition()) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
 void MessageGenerator::GenerateEnumHeader(io::Printer* printer) {
   for (vector<EnumGenerator*>::iterator iter = enum_generators_.begin();
        iter != enum_generators_.end(); ++iter) {
@@ -334,7 +315,7 @@
   string message_comments;
   SourceLocation location;
   if (descriptor_->GetSourceLocation(&location)) {
-    message_comments = BuildCommentsString(location, false);
+    message_comments = BuildCommentsString(location);
   } else {
     message_comments = "";
   }
@@ -342,7 +323,7 @@
   printer->Print(
       "$comments$$deprecated_attribute$@interface $classname$ : GPBMessage\n\n",
       "classname", class_name_,
-      "deprecated_attribute", deprecated_attribute_,
+      "deprecated_attribute", GetOptionalDeprecatedAttribute(descriptor_, false, true),
       "comments", message_comments);
 
   vector<char> seen_oneofs(descriptor_->oneof_decl_count(), 0);
@@ -399,14 +380,6 @@
         "\n",
         "classname", class_name_);
 
-    if (!deprecated_attribute_.empty()) {
-      // No warnings when compiling the impl of this deprecated class.
-      printer->Print(
-          "#pragma clang diagnostic push\n"
-          "#pragma clang diagnostic ignored \"-Wdeprecated-implementations\"\n"
-          "\n");
-    }
-
     printer->Print("@implementation $classname$\n\n",
                    "classname", class_name_);
 
@@ -430,7 +403,7 @@
       sorted_extensions.push_back(descriptor_->extension_range(i));
     }
 
-    std::sort(sorted_extensions.begin(), sorted_extensions.end(),
+    sort(sorted_extensions.begin(), sorted_extensions.end(),
          ExtensionRangeOrdering());
 
     // Assign has bits:
@@ -514,7 +487,7 @@
           "    };\n");
     }
 
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["classname"] = class_name_;
     vars["rootclassname"] = root_classname_;
     vars["fields"] = has_fields ? "fields" : "NULL";
@@ -532,8 +505,7 @@
     if (descriptor_->options().message_set_wire_format()) {
       init_flags.push_back("GPBDescriptorInitializationFlag_WireFormat");
     }
-    vars["init_flags"] = BuildFlagsString(FLAGTYPE_DESCRIPTOR_INITIALIZATION,
-                                          init_flags);
+    vars["init_flags"] = BuildFlagsString(init_flags);
 
     printer->Print(
         vars,
@@ -591,19 +563,6 @@
           "    [localDescriptor setupExtensionRanges:ranges\n"
           "                                    count:(uint32_t)(sizeof(ranges) / sizeof(GPBExtensionRange))];\n");
     }
-    if (descriptor_->containing_type() != NULL) {
-      string parent_class_name = ClassName(descriptor_->containing_type());
-      printer->Print(
-          "    [localDescriptor setupContainingMessageClassName:GPBStringifySymbol($parent_name$)];\n",
-          "parent_name", parent_class_name);
-    }
-    string suffix_added;
-    ClassName(descriptor_, &suffix_added);
-    if (suffix_added.size() > 0) {
-      printer->Print(
-          "    [localDescriptor setupMessageClassNameSuffix:@\"$suffix$\"];\n",
-          "suffix", suffix_added);
-    }
     printer->Print(
         "    NSAssert(descriptor == nil, @\"Startup recursed!\");\n"
         "    descriptor = localDescriptor;\n"
@@ -612,12 +571,6 @@
         "}\n\n"
         "@end\n\n");
 
-    if (!deprecated_attribute_.empty()) {
-      printer->Print(
-          "#pragma clang diagnostic pop\n"
-          "\n");
-    }
-
     for (int i = 0; i < descriptor_->field_count(); i++) {
       field_generators_.get(descriptor_->field(i))
           .GenerateCFunctionImplementations(printer);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message.h b/src/google/protobuf/compiler/objectivec/objectivec_message.h
index 8f317ac..8565e76 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message.h
@@ -64,10 +64,7 @@
   void GenerateMessageHeader(io::Printer* printer);
   void GenerateSource(io::Printer* printer);
   void GenerateExtensionRegistrationSource(io::Printer* printer);
-  void DetermineForwardDeclarations(std::set<string>* fwd_decls);
-
-  // Checks if the message or a nested message includes a oneof definition.
-  bool IncludesOneOfDefinition() const;
+  void DetermineForwardDeclarations(set<string>* fwd_decls);
 
  private:
   void GenerateParseFromMethodsHeader(io::Printer* printer);
@@ -85,7 +82,6 @@
   const Descriptor* descriptor_;
   FieldGeneratorMap field_generators_;
   const string class_name_;
-  const string deprecated_attribute_;
   vector<ExtensionGenerator*> extension_generators_;
   vector<EnumGenerator*> enum_generators_;
   vector<MessageGenerator*> nested_message_generators_;
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
index 699d25b..d6ccd6d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
@@ -45,7 +45,7 @@
 namespace {
 
 void SetMessageVariables(const FieldDescriptor* descriptor,
-                         std::map<string, string>* variables) {
+                         map<string, string>* variables) {
   const string& message_type = ClassName(descriptor->message_type());
   (*variables)["type"] = message_type;
   (*variables)["containing_class"] = ClassName(descriptor->containing_type());
@@ -67,7 +67,7 @@
 MessageFieldGenerator::~MessageFieldGenerator() {}
 
 void MessageFieldGenerator::DetermineForwardDeclarations(
-    std::set<string>* fwd_decls) const {
+    set<string>* fwd_decls) const {
   ObjCObjFieldGenerator::DetermineForwardDeclarations(fwd_decls);
   // Class name is already in "storage_type".
   fwd_decls->insert("@class " + variable("storage_type"));
@@ -95,7 +95,7 @@
 RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
 
 void RepeatedMessageFieldGenerator::DetermineForwardDeclarations(
-    std::set<string>* fwd_decls) const {
+    set<string>* fwd_decls) const {
   RepeatedFieldGenerator::DetermineForwardDeclarations(fwd_decls);
   // Class name is already in "storage_type".
   fwd_decls->insert("@class " + variable("storage_type"));
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message_field.h b/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
index 50f4b6d..d2dba15 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
@@ -51,7 +51,7 @@
   virtual bool WantsHasProperty(void) const;
 
  public:
-  virtual void DetermineForwardDeclarations(std::set<string>* fwd_decls) const;
+  virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);
@@ -67,7 +67,7 @@
   virtual ~RepeatedMessageFieldGenerator();
 
  public:
-  virtual void DetermineForwardDeclarations(std::set<string>* fwd_decls) const;
+  virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc b/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
index 5531ae2..44bafd7 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
@@ -53,7 +53,7 @@
   string comments;
   SourceLocation location;
   if (descriptor_->GetSourceLocation(&location)) {
-    comments = BuildCommentsString(location, true);
+    comments = BuildCommentsString(location);
   } else {
     comments = "";
   }
@@ -104,9 +104,7 @@
 void OneofGenerator::GenerateClearFunctionDeclaration(io::Printer* printer) {
   printer->Print(
       variables_,
-      "/**\n"
-      " * Clears whatever value was set for the oneof '$name$'.\n"
-      " **/\n"
+      "/// Clears whatever value was set for the oneof '$name$'.\n"
       "void $owning_message_class$_Clear$capitalized_name$OneOfCase($owning_message_class$ *message);\n");
 }
 
@@ -121,7 +119,7 @@
       variables_,
       "void $owning_message_class$_Clear$capitalized_name$OneOfCase($owning_message_class$ *message) {\n"
       "  GPBDescriptor *descriptor = [message descriptor];\n"
-      "  GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:$raw_index$];\n"
+      "  GPBOneofDescriptor *oneof = descriptor->oneofs_[$raw_index$];\n"
       "  GPBMaybeClearOneof(message, oneof, $index$, 0);\n"
       "}\n");
 }
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_oneof.h b/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
index ff353a6..3d9df4d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
@@ -67,7 +67,7 @@
 
  private:
   const OneofDescriptor* descriptor_;
-  std::map<string, string> variables_;
+  map<string, string> variables_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofGenerator);
 };
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
index aa8ac32..d49350f 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
@@ -118,7 +118,7 @@
 }
 
 void SetPrimitiveVariables(const FieldDescriptor* descriptor,
-                           std::map<string, string>* variables) {
+                           map<string, string>* variables) {
   std::string primitive_name = PrimitiveTypeName(descriptor);
   (*variables)["type"] = primitive_name;
   (*variables)["storage_type"] = primitive_name;
diff --git a/src/google/protobuf/compiler/parser.cc b/src/google/protobuf/compiler/parser.cc
index 03d05ad..90ded4d 100644
--- a/src/google/protobuf/compiler/parser.cc
+++ b/src/google/protobuf/compiler/parser.cc
@@ -249,11 +249,11 @@
     input_->Next();
     return true;
   } else if (LookingAt("inf")) {
-    *output = std::numeric_limits<double>::infinity();
+    *output = numeric_limits<double>::infinity();
     input_->Next();
     return true;
   } else if (LookingAt("nan")) {
-    *output = std::numeric_limits<double>::quiet_NaN();
+    *output = numeric_limits<double>::quiet_NaN();
     input_->Next();
     return true;
   } else {
@@ -282,7 +282,7 @@
     const char* text, const LocationRecorder* location) {
   if (LookingAt(text)) {
     string leading, trailing;
-    std::vector<string> detached;
+    vector<string> detached;
     input_->NextWithComments(&trailing, &detached, &leading);
 
     // Save the leading comments for next time, and recall the leading comments
@@ -404,7 +404,7 @@
 
 void Parser::LocationRecorder::AttachComments(
     string* leading, string* trailing,
-    std::vector<string>* detached_comments) const {
+    vector<string>* detached_comments) const {
   GOOGLE_CHECK(!location_->has_leading_comments());
   GOOGLE_CHECK(!location_->has_trailing_comments());
 
@@ -487,7 +487,7 @@
     return false;
   }
 
-  std::set<int> used_values;
+  set<int> used_values;
   bool has_duplicates = false;
   for (int i = 0; i < proto->value_size(); ++i) {
     const EnumValueDescriptorProto enum_value = proto->value(i);
@@ -525,6 +525,7 @@
   SourceCodeInfo source_code_info;
   source_code_info_ = &source_code_info;
 
+  vector<string> top_doc_comments;
   if (LookingAtType(io::Tokenizer::TYPE_START)) {
     // Advance to first token.
     input_->NextWithComments(NULL, &upcoming_detached_comments_,
@@ -570,7 +571,6 @@
 
   input_ = NULL;
   source_code_info_ = NULL;
-  assert(file != NULL);
   source_code_info.Swap(file->mutable_source_code_info());
   return !had_errors_;
 }
@@ -664,7 +664,7 @@
 
 namespace {
 
-const int kMaxRangeSentinel = -1;
+const int kMaxExtensionRangeSentinel = -1;
 
 bool IsMessageSetWireFormatMessage(const DescriptorProto& message) {
   const MessageOptions& options = message.options();
@@ -688,27 +688,12 @@
       kint32max :
       FieldDescriptor::kMaxNumber + 1;
   for (int i = 0; i < message->extension_range_size(); ++i) {
-    if (message->extension_range(i).end() == kMaxRangeSentinel) {
+    if (message->extension_range(i).end() == kMaxExtensionRangeSentinel) {
       message->mutable_extension_range(i)->set_end(max_extension_number);
     }
   }
 }
 
-// Modifies any reserved ranges that specified 'max' as the end of the
-// reserved range, and sets them to the type-specific maximum. The actual max
-// 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;
-  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);
-    }
-  }
-}
-
 }  // namespace
 
 bool Parser::ParseMessageBlock(DescriptorProto* message,
@@ -732,9 +717,6 @@
   if (message->extension_range_size() > 0) {
     AdjustExtensionRangesWithMaxEndNumber(message);
   }
-  if (message->reserved_range_size() > 0) {
-    AdjustReservedRangesWithMaxEndNumber(message);
-  }
   return true;
 }
 
@@ -1391,7 +1373,7 @@
           value_location.AddPath(
               UninterpretedOption::kNegativeIntValueFieldNumber);
           uninterpreted_option->set_negative_int_value(
-              static_cast<int64>(-value));
+              -static_cast<int64>(value));
         } else {
           value_location.AddPath(
               UninterpretedOption::kPositiveIntValueFieldNumber);
@@ -1447,8 +1429,6 @@
   // Parse the declaration.
   DO(Consume("extensions"));
 
-  int old_range_size = message->extension_range_size();
-
   do {
     // Note that kExtensionRangeFieldNumber was already pushed by the parent.
     LocationRecorder location(extensions_location,
@@ -1475,7 +1455,7 @@
         // Set to the sentinel value - 1 since we increment the value below.
         // The actual value of the end of the range should be set with
         // AdjustExtensionRangesWithMaxEndNumber.
-        end = kMaxRangeSentinel - 1;
+        end = kMaxExtensionRangeSentinel - 1;
       } else {
         DO(ConsumeInteger(&end, "Expected integer."));
       }
@@ -1495,36 +1475,12 @@
     range->set_end(end);
   } while (TryConsume(","));
 
-  if (LookingAt("[")) {
-    LocationRecorder location(
-        extensions_location,
-        DescriptorProto::ExtensionRange::kOptionsFieldNumber);
-
-    DO(Consume("["));
-
-    // Parse extension range options in the first range.
-    ExtensionRangeOptions* options =
-        message->mutable_extension_range(old_range_size)->mutable_options();
-    do {
-      DO(ParseOption(options, location, containing_file, OPTION_ASSIGNMENT));
-    } while (TryConsume(","));
-
-    DO(Consume("]"));
-
-    // 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);
-    }
-  }
-
   DO(ConsumeEndOfDeclaration(";", &extensions_location));
   return true;
 }
 
-// This is similar to extension range parsing, except that it accepts field
-// name literals.
+// This is similar to extension range parsing, except that "max" is not
+// supported, and accepts field name literals.
 bool Parser::ParseReserved(DescriptorProto* message,
                            const LocationRecorder& message_location) {
   // Parse the declaration.
@@ -1540,6 +1496,7 @@
   }
 }
 
+
 bool Parser::ParseReservedNames(DescriptorProto* message,
                                 const LocationRecorder& parent_location) {
   do {
@@ -1571,14 +1528,7 @@
     if (TryConsume("to")) {
       LocationRecorder end_location(
           location, DescriptorProto::ReservedRange::kEndFieldNumber);
-      if (TryConsume("max")) {
-        // Set to the sentinel value - 1 since we increment the value below.
-        // The actual value of the end of the range should be set with
-        // AdjustExtensionRangesWithMaxEndNumber.
-        end = kMaxRangeSentinel - 1;
-      } else {
-        DO(ConsumeInteger(&end, "Expected integer."));
-      }
+      DO(ConsumeInteger(&end, "Expected integer."));
     } else {
       LocationRecorder end_location(
           location, DescriptorProto::ReservedRange::kEndFieldNumber);
@@ -1600,81 +1550,6 @@
   return true;
 }
 
-bool Parser::ParseReserved(EnumDescriptorProto* message,
-                          const LocationRecorder& message_location) {
-  // Parse the declaration.
-  DO(Consume("reserved"));
-  if (LookingAtType(io::Tokenizer::TYPE_STRING)) {
-    LocationRecorder location(message_location,
-                              DescriptorProto::kReservedNameFieldNumber);
-    return ParseReservedNames(message, location);
-  } else {
-    LocationRecorder location(message_location,
-                              DescriptorProto::kReservedRangeFieldNumber);
-    return ParseReservedNumbers(message, location);
-  }
-}
-
-bool Parser::ParseReservedNames(EnumDescriptorProto* message,
-                                const LocationRecorder& parent_location) {
-  do {
-    LocationRecorder location(parent_location, message->reserved_name_size());
-    DO(ConsumeString(message->add_reserved_name(), "Expected enum value."));
-  } while (TryConsume(","));
-  DO(ConsumeEndOfDeclaration(";", &parent_location));
-  return true;
-}
-
-bool Parser::ParseReservedNumbers(EnumDescriptorProto* message,
-                                  const LocationRecorder& parent_location) {
-  bool first = true;
-  do {
-    LocationRecorder location(parent_location, message->reserved_range_size());
-
-    EnumDescriptorProto::EnumReservedRange* range =
-        message->add_reserved_range();
-    int start, end;
-    io::Tokenizer::Token start_token;
-    {
-      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.")));
-    }
-
-    if (TryConsume("to")) {
-      LocationRecorder end_location(
-          location, EnumDescriptorProto::EnumReservedRange::kEndFieldNumber);
-      if (TryConsume("max")) {
-        // This is in the enum descriptor path, which doesn't have the message
-        // set duality to fix up, so it doesn't integrate with the sentinel.
-
-        // Evaluate 'max' to INT_MAX - 1 so that incrementing to create the
-        // exclusive range end doesn't cause an overflow.
-        // Note, this prevents reserving the actual INT_MAX enum value.
-        end = INT_MAX;
-      } else {
-        DO(ConsumeSignedInteger(&end, "Expected integer."));
-      }
-    } else {
-      LocationRecorder end_location(
-          location, EnumDescriptorProto::EnumReservedRange::kEndFieldNumber);
-      end_location.StartAt(start_token);
-      end_location.EndAt(start_token);
-      end = start;
-    }
-
-    range->set_start(start);
-    range->set_end(end);
-    first = false;
-  } while (TryConsume(","));
-
-  DO(ConsumeEndOfDeclaration(";", &parent_location));
-  return true;
-}
-
 bool Parser::ParseExtend(RepeatedPtrField<FieldDescriptorProto>* extensions,
                          RepeatedPtrField<DescriptorProto>* messages,
                          const LocationRecorder& parent_location,
@@ -1755,16 +1630,6 @@
       return false;
     }
 
-    if (LookingAt("option")) {
-      LocationRecorder option_location(
-          oneof_location, OneofDescriptorProto::kOptionsFieldNumber);
-      if (!ParseOption(oneof_decl->mutable_options(), option_location,
-                       containing_file, OPTION_STATEMENT)) {
-        return false;
-      }
-      continue;
-    }
-
     // Print a nice error if the user accidentally tries to place a label
     // on an individual member of a oneof.
     if (LookingAt("required") ||
@@ -1855,8 +1720,6 @@
                               EnumDescriptorProto::kOptionsFieldNumber);
     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());
@@ -2216,7 +2079,7 @@
     const Message* descriptor,
     DescriptorPool::ErrorCollector::ErrorLocation location,
     int* line, int* column) const {
-  const std::pair<int, int>* result =
+  const pair<int, int>* result =
       FindOrNull(location_map_, std::make_pair(descriptor, location));
   if (result == NULL) {
     *line   = -1;
@@ -2243,5 +2106,4 @@
 
 }  // namespace compiler
 }  // namespace protobuf
-
 }  // namespace google
diff --git a/src/google/protobuf/compiler/parser.h b/src/google/protobuf/compiler/parser.h
index 33b4c70..2c561c2 100644
--- a/src/google/protobuf/compiler/parser.h
+++ b/src/google/protobuf/compiler/parser.h
@@ -71,7 +71,7 @@
   // it.  Returns true if no errors occurred, false otherwise.
   bool Parse(io::Tokenizer* input, FileDescriptorProto* file);
 
-  // Optional features:
+  // Optional fetaures:
 
   // DEPRECATED:  New code should use the SourceCodeInfo embedded in the
   //   FileDescriptorProto.
@@ -257,7 +257,7 @@
     // TODO(kenton):  See comment on TryConsumeEndOfDeclaration(), above, for
     //   why this is const.
     void AttachComments(string* leading, string* trailing,
-                        std::vector<string>* detached_comments) const;
+                        vector<string>* detached_comments) const;
 
    private:
     // Indexes of parent and current location in the parent
@@ -371,12 +371,6 @@
                           const LocationRecorder& parent_location);
   bool ParseReservedNumbers(DescriptorProto* message,
                             const LocationRecorder& parent_location);
-  bool ParseReserved(EnumDescriptorProto* message,
-                     const LocationRecorder& message_location);
-  bool ParseReservedNames(EnumDescriptorProto* message,
-                          const LocationRecorder& parent_location);
-  bool ParseReservedNumbers(EnumDescriptorProto* message,
-                            const LocationRecorder& parent_location);
 
   // Parse an "extend" declaration.  (See also comments for
   // ParseMessageField().)
@@ -526,7 +520,7 @@
   // detached comments will be put into the leading_detached_comments field for
   // the next element (See SourceCodeInfo.Location in descriptor.proto), when
   // ConsumeEndOfDeclaration() is called.
-  std::vector<string> upcoming_detached_comments_;
+  vector<string> upcoming_detached_comments_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser);
 };
@@ -562,9 +556,9 @@
   void Clear();
 
  private:
-  typedef std::map<
-    std::pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>,
-    std::pair<int, int> > LocationMap;
+  typedef map<
+    pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>,
+    pair<int, int> > LocationMap;
   LocationMap location_map_;
 };
 
diff --git a/src/google/protobuf/compiler/parser_unittest.cc b/src/google/protobuf/compiler/parser_unittest.cc
index 9b59842..1d623dd 100644
--- a/src/google/protobuf/compiler/parser_unittest.cc
+++ b/src/google/protobuf/compiler/parser_unittest.cc
@@ -42,13 +42,14 @@
 
 #include <google/protobuf/compiler/parser.h>
 
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_custom_options.pb.h>
 #include <google/protobuf/io/tokenizer.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/text_format.h>
 #include <google/protobuf/wire_format.h>
+#include <google/protobuf/text_format.h>
+#include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/unittest_custom_options.pb.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/stubs/map_util.h>
 
@@ -663,7 +664,7 @@
   ExpectParsesTo(
     "message TestMessage {\n"
     "  required int32 foo = 1;\n"
-    "  reserved 2, 15, 9 to 11, 3, 20 to max;\n"
+    "  reserved 2, 15, 9 to 11, 3;\n"
     "}\n",
 
     "message_type {"
@@ -673,29 +674,6 @@
     "  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_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 }"
     "}");
 }
 
@@ -726,30 +704,6 @@
     "}");
 }
 
-TEST_F(ParseMessageTest, ExtensionRangeWithOptions) {
-  ExpectParsesTo(
-    "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"
-    "      }"
-    "    }"
-    "  }"
-    "}");
-}
-
 TEST_F(ParseMessageTest, CompoundExtensionRange) {
   ExpectParsesTo(
     "message TestMessage {\n"
@@ -766,82 +720,6 @@
     "}");
 }
 
-TEST_F(ParseMessageTest, CompoundExtensionRangeWithOptions) {
-  ExpectParsesTo(
-    "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"
-    "      }"
-    "    }"
-    "  }"
-    "}");
-}
-
 TEST_F(ParseMessageTest, LargerMaxForMessageSetWireFormatMessages) {
   // Messages using the message_set_wire_format option can accept larger
   // extension numbers, as the numbers are not encoded as int32 field values
@@ -994,42 +872,6 @@
     "}");
 }
 
-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_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_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"FOO\" number:0 }"
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"bar\""
-    "}");
-}
-
 // ===================================================================
 
 typedef ParserTest ParseServiceTest;
@@ -1524,60 +1366,15 @@
     "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");
-}
-
-TEST_F(ParseErrorTest, EnumReservedMixNameAndNumber) {
-  ExpectHasErrors(
-    "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");
-}
-
-TEST_F(ParseErrorTest, EnumReservedNegativeNumberOutOfRange) {
-  ExpectHasErrors(
-    "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");
-}
-
 // -------------------------------------------------------------------
 // Reserved field number errors
 
-TEST_F(ParseErrorTest, ReservedStandaloneMaxNotAllowed) {
+TEST_F(ParseErrorTest, ReservedMaxNotAllowed) {
   ExpectHasErrors(
     "message Foo {\n"
-    "  reserved max;\n"
+    "  reserved 10 to max;\n"
     "}\n",
-    "1:11: Expected field name or number range.\n");
+    "1:17: Expected integer.\n");
 }
 
 TEST_F(ParseErrorTest, ReservedMixNameAndNumber) {
@@ -1596,23 +1393,6 @@
     "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");
-}
-
-TEST_F(ParseErrorTest, ReservedNumberOutOfRange) {
-  ExpectHasErrors(
-    "message Foo {\n"
-    "  reserved 2147483648;\n"
-    "}\n",
-    "1:11: Integer out of range.\n");
-}
-
-
 // -------------------------------------------------------------------
 // Service errors
 
@@ -2438,7 +2218,7 @@
       const char* expected_leading_comments,
       const char* expected_trailing_comments,
       const char* expected_leading_detached_comments) {
-    std::pair<SpanMap::iterator, SpanMap::iterator> range =
+    pair<SpanMap::iterator, SpanMap::iterator> range =
         spans_.equal_range(SpanKey(descriptor_proto, field, index));
 
     if (start_marker == '\0') {
@@ -2449,8 +2229,8 @@
         return true;
       }
     } else {
-      std::pair<int, int> start_pos = FindOrDie(markers_, start_marker);
-      std::pair<int, int> end_pos = FindOrDie(markers_, end_marker);
+      pair<int, int> start_pos = FindOrDie(markers_, start_marker);
+      pair<int, int> end_pos = FindOrDie(markers_, end_marker);
 
       RepeatedField<int> expected_span;
       expected_span.Add(start_pos.first);
@@ -2515,9 +2295,9 @@
     }
   };
 
-  typedef std::multimap<SpanKey, const SourceCodeInfo::Location*> SpanMap;
+  typedef multimap<SpanKey, const SourceCodeInfo::Location*> SpanMap;
   SpanMap spans_;
-  std::map<char, std::pair<int, int> > markers_;
+  map<char, pair<int, int> > markers_;
   string text_without_markers_;
 
   void ExtractMarkers(const char* text) {
diff --git a/src/google/protobuf/compiler/php/php_generator.cc b/src/google/protobuf/compiler/php/php_generator.cc
deleted file mode 100644
index dd4392c..0000000
--- a/src/google/protobuf/compiler/php/php_generator.cc
+++ /dev/null
@@ -1,1443 +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.
-
-#include <google/protobuf/compiler/php/php_generator.h>
-
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/plugin.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <sstream>
-
-using google::protobuf::internal::scoped_ptr;
-
-const std::string kDescriptorFile = "google/protobuf/descriptor.proto";
-const std::string kEmptyFile = "google/protobuf/empty.proto";
-const std::string kEmptyMetadataFile = "GPBMetadata/Google/Protobuf/GPBEmpty.php";
-const std::string kDescriptorMetadataFile =
-    "GPBMetadata/Google/Protobuf/Internal/Descriptor.php";
-const std::string kDescriptorDirName = "Google/Protobuf/Internal";
-const std::string kDescriptorPackageName = "Google\\Protobuf\\Internal";
-const char* const kReservedNames[] = {
-    "abstract",   "and",        "array",        "as",           "break",
-    "callable",   "case",       "catch",        "class",        "clone",
-    "const",      "continue",   "declare",      "default",      "die",
-    "do",         "echo",       "else",         "elseif",       "empty",
-    "enddeclare", "endfor",     "endforeach",   "endif",        "endswitch",
-    "endwhile",   "eval",       "exit",         "extends",      "final",
-    "for",        "foreach",    "function",     "global",       "goto",
-    "if",         "implements", "include",      "include_once", "instanceof",
-    "insteadof",  "interface",  "isset",        "list",         "namespace",
-    "new",        "or",         "print",        "private",      "protected",
-    "public",     "require",    "require_once", "return",       "static",
-    "switch",     "throw",      "trait",        "try",          "unset",
-    "use",        "var",        "while",        "xor",          "int",
-    "float",      "bool",       "string",       "true",         "false",
-    "null",       "void",       "iterable"};
-const char* const kValidConstantNames[] = {
-    "int",   "float", "bool", "string",   "true",
-    "false", "null",  "void", "iterable",
-};
-const int kReservedNamesSize = 73;
-const int kValidConstantNamesSize = 9;
-const int kFieldSetter = 1;
-const int kFieldGetter = 2;
-const int kFieldProperty = 3;
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace php {
-
-// Forward decls.
-std::string PhpName(const std::string& full_name, bool is_descriptor);
-std::string DefaultForField(FieldDescriptor* field);
-std::string IntToString(int32 value);
-std::string FilenameToClassname(const string& filename);
-std::string GeneratedMetadataFileName(const std::string& proto_file,
-                                      bool is_descriptor);
-std::string LabelForField(FieldDescriptor* field);
-std::string TypeName(FieldDescriptor* field);
-std::string UnderscoresToCamelCase(const string& name, bool cap_first_letter);
-std::string EscapeDollor(const string& to_escape);
-std::string BinaryToHex(const string& binary);
-void Indent(io::Printer* printer);
-void Outdent(io::Printer* printer);
-void GenerateMessageDocComment(io::Printer* printer, const Descriptor* message,
-                               int is_descriptor);
-void GenerateFieldDocComment(io::Printer* printer, const FieldDescriptor* field,
-                             int is_descriptor, int function_type);
-void GenerateEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_,
-                            int is_descriptor);
-void GenerateEnumValueDocComment(io::Printer* printer,
-                                 const EnumValueDescriptor* value);
-void GenerateServiceDocComment(io::Printer* printer,
-                               const ServiceDescriptor* service);
-void GenerateServiceMethodDocComment(io::Printer* printer,
-                              const MethodDescriptor* method);
-
-std::string RenameEmpty(const std::string& name) {
-  if (name == "Empty") {
-    return "GPBEmpty";
-  } else {
-    return name;
-  }
-}
-
-std::string MessageFullName(const Descriptor* message, bool is_descriptor) {
-  if (is_descriptor) {
-    return StringReplace(message->full_name(),
-                         "google.protobuf",
-                         "google.protobuf.internal", false);
-  } else {
-    return message->full_name();
-  }
-}
-
-std::string EnumFullName(const EnumDescriptor* envm, bool is_descriptor) {
-  if (is_descriptor) {
-    return StringReplace(envm->full_name(),
-                         "google.protobuf",
-                         "google.protobuf.internal", false);
-  } else {
-    return envm->full_name();
-  }
-}
-
-template <typename DescriptorType>
-std::string ClassNamePrefix(const string& classname,
-                            const DescriptorType* desc) {
-  const string& prefix = (desc->file()->options()).php_class_prefix();
-  if (prefix != "") {
-    return prefix;
-  }
-
-  bool is_reserved = false;
-
-  string lower = classname;
-  transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
-
-  for (int i = 0; i < kReservedNamesSize; i++) {
-    if (lower == kReservedNames[i]) {
-      is_reserved = true;
-      break;
-    }
-  }
-
-  if (is_reserved) {
-    if (desc->file()->package() == "google.protobuf") {
-      return "GPB";
-    } else {
-      return "PB";
-    }
-  }
-
-  return "";
-}
-
-std::string ConstantNamePrefix(const string& classname) {
-  bool is_reserved = false;
-
-  string lower = classname;
-  transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
-
-  for (int i = 0; i < kReservedNamesSize; i++) {
-    if (lower == kReservedNames[i]) {
-      is_reserved = true;
-      break;
-    }
-  }
-
-  for (int i = 0; i < kValidConstantNamesSize; i++) {
-    if (lower == kValidConstantNames[i]) {
-      is_reserved = false;
-      break;
-    }
-  }
-
-  if (is_reserved) {
-    return "PB";
-  }
-
-  return "";
-}
-
-template <typename DescriptorType>
-std::string NamespacedName(const string& classname,
-                            const DescriptorType* desc, bool is_descriptor) {
-  if (desc->file()->options().has_php_namespace()) {
-    const string& php_namespace = desc->file()->options().php_namespace();
-    if (php_namespace != "") {
-      return php_namespace + '\\' + classname;
-    } else {
-      return classname;
-    }
-  }
-
-  if (desc->file()->package() == "") {
-    return classname;
-  } else {
-    return PhpName(desc->file()->package(), is_descriptor) + '\\' +
-           classname;
-  }
-}
-
-template <typename DescriptorType>
-std::string FullClassName(const DescriptorType* desc, bool is_descriptor) {
-  string classname = GeneratedClassName(desc);
-  return NamespacedName(classname, desc, is_descriptor);
-}
-
-std::string FullClassName(const ServiceDescriptor* desc, bool is_descriptor) {
-  string classname = GeneratedClassName(desc);
-  return NamespacedName(classname, desc, is_descriptor);
-}
-
-std::string PhpName(const std::string& full_name, bool is_descriptor) {
-  if (is_descriptor) {
-    return kDescriptorPackageName;
-  }
-
-  std::string result;
-  bool cap_next_letter = true;
-  for (int i = 0; i < full_name.size(); i++) {
-    if ('a' <= full_name[i] && full_name[i] <= 'z' && cap_next_letter) {
-      result += full_name[i] + ('A' - 'a');
-      cap_next_letter = false;
-    } else if (full_name[i] == '.') {
-      result += '\\';
-      cap_next_letter = true;
-    } else {
-      result += full_name[i];
-      cap_next_letter = false;
-    }
-  }
-  return result;
-}
-
-std::string DefaultForField(const FieldDescriptor* field) {
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_INT32:
-    case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_UINT32:
-    case FieldDescriptor::TYPE_UINT64:
-    case FieldDescriptor::TYPE_SINT32:
-    case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_FIXED32:
-    case FieldDescriptor::TYPE_FIXED64:
-    case FieldDescriptor::TYPE_SFIXED32:
-    case FieldDescriptor::TYPE_SFIXED64:
-    case FieldDescriptor::TYPE_ENUM: return "0";
-    case FieldDescriptor::TYPE_DOUBLE:
-    case FieldDescriptor::TYPE_FLOAT: return "0.0";
-    case FieldDescriptor::TYPE_BOOL: return "false";
-    case FieldDescriptor::TYPE_STRING:
-    case FieldDescriptor::TYPE_BYTES: return "''";
-    case FieldDescriptor::TYPE_MESSAGE:
-    case FieldDescriptor::TYPE_GROUP: return "null";
-    default: assert(false); return "";
-  }
-}
-
-std::string GeneratedMetadataFileName(const std::string& proto_file,
-                                      bool is_descriptor) {
-  int start_index = 0;
-  int first_index = proto_file.find_first_of("/", start_index);
-  std::string result = "GPBMetadata/";
-
-  if (proto_file == kEmptyFile) {
-    return kEmptyMetadataFile;
-  }
-  if (is_descriptor) {
-    return kDescriptorMetadataFile;
-  }
-
-  // Append directory name.
-  std::string file_no_suffix;
-  int lastindex = proto_file.find_last_of(".");
-  if (proto_file == kEmptyFile) {
-    return kEmptyMetadataFile;
-  } else {
-    file_no_suffix = proto_file.substr(0, lastindex);
-  }
-
-  while (first_index != string::npos) {
-    result += UnderscoresToCamelCase(
-        file_no_suffix.substr(start_index, first_index - start_index), true);
-    result += "/";
-    start_index = first_index + 1;
-    first_index = file_no_suffix.find_first_of("/", start_index);
-  }
-
-  // Append file name.
-  result += RenameEmpty(UnderscoresToCamelCase(
-      file_no_suffix.substr(start_index, first_index - start_index), true));
-
-  return result += ".php";
-}
-
-std::string GeneratedMessageFileName(const Descriptor* message,
-                                     bool is_descriptor) {
-  std::string result = FullClassName(message, is_descriptor);
-  for (int i = 0; i < result.size(); i++) {
-    if (result[i] == '\\') {
-      result[i] = '/';
-    }
-  }
-  return result + ".php";
-}
-
-std::string GeneratedEnumFileName(const EnumDescriptor* en,
-                                  bool is_descriptor) {
-  std::string result = FullClassName(en, is_descriptor);
-  for (int i = 0; i < result.size(); i++) {
-    if (result[i] == '\\') {
-      result[i] = '/';
-    }
-  }
-  return result + ".php";
-}
-
-std::string GeneratedServiceFileName(const ServiceDescriptor* service,
-                                    bool is_descriptor) {
-  std::string result = FullClassName(service, is_descriptor) + "Interface";
-  for (int i = 0; i < result.size(); i++) {
-    if (result[i] == '\\') {
-      result[i] = '/';
-    }
-  }
-  return result + ".php";
-}
-
-std::string IntToString(int32 value) {
-  std::ostringstream os;
-  os << value;
-  return os.str();
-}
-
-std::string LabelForField(const FieldDescriptor* field) {
-  switch (field->label()) {
-    case FieldDescriptor::LABEL_OPTIONAL: return "optional";
-    case FieldDescriptor::LABEL_REQUIRED: return "required";
-    case FieldDescriptor::LABEL_REPEATED: return "repeated";
-    default: assert(false); return "";
-  }
-}
-
-std::string TypeName(const FieldDescriptor* field) {
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_INT32: return "int32";
-    case FieldDescriptor::TYPE_INT64: return "int64";
-    case FieldDescriptor::TYPE_UINT32: return "uint32";
-    case FieldDescriptor::TYPE_UINT64: return "uint64";
-    case FieldDescriptor::TYPE_SINT32: return "sint32";
-    case FieldDescriptor::TYPE_SINT64: return "sint64";
-    case FieldDescriptor::TYPE_FIXED32: return "fixed32";
-    case FieldDescriptor::TYPE_FIXED64: return "fixed64";
-    case FieldDescriptor::TYPE_SFIXED32: return "sfixed32";
-    case FieldDescriptor::TYPE_SFIXED64: return "sfixed64";
-    case FieldDescriptor::TYPE_DOUBLE: return "double";
-    case FieldDescriptor::TYPE_FLOAT: return "float";
-    case FieldDescriptor::TYPE_BOOL: return "bool";
-    case FieldDescriptor::TYPE_ENUM: return "enum";
-    case FieldDescriptor::TYPE_STRING: return "string";
-    case FieldDescriptor::TYPE_BYTES: return "bytes";
-    case FieldDescriptor::TYPE_MESSAGE: return "message";
-    case FieldDescriptor::TYPE_GROUP: return "group";
-    default: assert(false); return "";
-  }
-}
-
-std::string PhpSetterTypeName(const FieldDescriptor* field, bool is_descriptor) {
-  if (field->is_map()) {
-    return "array|\\Google\\Protobuf\\Internal\\MapField";
-  }
-  string type;
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_INT32:
-    case FieldDescriptor::TYPE_UINT32:
-    case FieldDescriptor::TYPE_SINT32:
-    case FieldDescriptor::TYPE_FIXED32:
-    case FieldDescriptor::TYPE_SFIXED32:
-    case FieldDescriptor::TYPE_ENUM:
-      type = "int";
-      break;
-    case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_UINT64:
-    case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_FIXED64:
-    case FieldDescriptor::TYPE_SFIXED64:
-      type = "int|string";
-      break;
-    case FieldDescriptor::TYPE_DOUBLE:
-    case FieldDescriptor::TYPE_FLOAT:
-      type = "float";
-      break;
-    case FieldDescriptor::TYPE_BOOL:
-      type = "bool";
-      break;
-    case FieldDescriptor::TYPE_STRING:
-    case FieldDescriptor::TYPE_BYTES:
-      type = "string";
-      break;
-    case FieldDescriptor::TYPE_MESSAGE:
-      type = "\\" + FullClassName(field->message_type(), is_descriptor);
-      break;
-    case FieldDescriptor::TYPE_GROUP:
-      return "null";
-    default: assert(false); return "";
-  }
-  if (field->is_repeated()) {
-    // accommodate for edge case with multiple types.
-    size_t start_pos = type.find("|");
-    if (start_pos != std::string::npos) {
-      type.replace(start_pos, 1, "[]|");
-    }
-    type += "[]|\\Google\\Protobuf\\Internal\\RepeatedField";
-  }
-  return type;
-}
-
-std::string PhpGetterTypeName(const FieldDescriptor* field, bool is_descriptor) {
-  if (field->is_map()) {
-    return "\\Google\\Protobuf\\Internal\\MapField";
-  }
-  if (field->is_repeated()) {
-    return "\\Google\\Protobuf\\Internal\\RepeatedField";
-  }
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_INT32:
-    case FieldDescriptor::TYPE_UINT32:
-    case FieldDescriptor::TYPE_SINT32:
-    case FieldDescriptor::TYPE_FIXED32:
-    case FieldDescriptor::TYPE_SFIXED32:
-    case FieldDescriptor::TYPE_ENUM: return "int";
-    case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_UINT64:
-    case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_FIXED64:
-    case FieldDescriptor::TYPE_SFIXED64: return "int|string";
-    case FieldDescriptor::TYPE_DOUBLE:
-    case FieldDescriptor::TYPE_FLOAT: return "float";
-    case FieldDescriptor::TYPE_BOOL: return "bool";
-    case FieldDescriptor::TYPE_STRING:
-    case FieldDescriptor::TYPE_BYTES: return "string";
-    case FieldDescriptor::TYPE_MESSAGE:
-      return "\\" + FullClassName(field->message_type(), is_descriptor);
-    case FieldDescriptor::TYPE_GROUP: return "null";
-    default: assert(false); return "";
-  }
-}
-
-std::string EnumOrMessageSuffix(
-    const FieldDescriptor* field, bool is_descriptor) {
-  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-    return ", '" + MessageFullName(field->message_type(), is_descriptor) + "'";
-  }
-  if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
-    return ", '" + EnumFullName(field->enum_type(), is_descriptor) + "'";
-  }
-  return "";
-}
-
-// Converts a name to camel-case. If cap_first_letter is true, capitalize the
-// first letter.
-std::string UnderscoresToCamelCase(const string& input, bool cap_first_letter) {
-  std::string result;
-  for (int i = 0; i < input.size(); i++) {
-    if ('a' <= input[i] && input[i] <= 'z') {
-      if (cap_first_letter) {
-        result += input[i] + ('A' - 'a');
-      } else {
-        result += input[i];
-      }
-      cap_first_letter = false;
-    } else if ('A' <= input[i] && input[i] <= 'Z') {
-      if (i == 0 && !cap_first_letter) {
-        // Force first letter to lower-case unless explicitly told to
-        // capitalize it.
-        result += input[i] + ('a' - 'A');
-      } else {
-        // Capital letters after the first are left as-is.
-        result += input[i];
-      }
-      cap_first_letter = false;
-    } else if ('0' <= input[i] && input[i] <= '9') {
-      result += input[i];
-      cap_first_letter = true;
-    } else {
-      cap_first_letter = true;
-    }
-  }
-  // Add a trailing "_" if the name should be altered.
-  if (input[input.size() - 1] == '#') {
-    result += '_';
-  }
-  return result;
-}
-
-std::string EscapeDollor(const string& to_escape) {
-  return StringReplace(to_escape, "$", "\\$", true);
-}
-
-std::string BinaryToHex(const string& src) {
-  string dest;
-  size_t i;
-  unsigned char symbol[16] = {
-    '0', '1', '2', '3',
-    '4', '5', '6', '7',
-    '8', '9', 'a', 'b',
-    'c', 'd', 'e', 'f',
-  };
-
-  dest.resize(src.size() * 2);
-  char* append_ptr = &dest[0];
-
-  for (i = 0; i < src.size(); i++) {
-    *append_ptr++ = symbol[(src[i] & 0xf0) >> 4];
-    *append_ptr++ = symbol[src[i] & 0x0f];
-  }
-
-  return dest;
-}
-
-void Indent(io::Printer* printer) {
-  printer->Indent();
-  printer->Indent();
-}
-void Outdent(io::Printer* printer) {
-  printer->Outdent();
-  printer->Outdent();
-}
-
-void GenerateField(const FieldDescriptor* field, io::Printer* printer,
-                   bool is_descriptor) {
-  if (field->is_repeated()) {
-    GenerateFieldDocComment(printer, field, is_descriptor, kFieldProperty);
-    printer->Print(
-        "private $^name^;\n",
-        "name", field->name());
-  } else if (field->containing_oneof()) {
-    // Oneof fields are handled by GenerateOneofField.
-    return;
-  } else {
-    GenerateFieldDocComment(printer, field, is_descriptor, kFieldProperty);
-    printer->Print(
-        "private $^name^ = ^default^;\n",
-        "name", field->name(),
-        "default", DefaultForField(field));
-  }
-
-  if (is_descriptor) {
-    printer->Print(
-        "private $has_^name^ = false;\n",
-        "name", field->name());
-  }
-}
-
-void GenerateOneofField(const OneofDescriptor* oneof, io::Printer* printer) {
-  // Oneof property needs to be protected in order to be accessed by parent
-  // class in implementation.
-  printer->Print(
-      "protected $^name^;\n",
-      "name", oneof->name());
-}
-
-void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor,
-                           io::Printer* printer) {
-  const OneofDescriptor* oneof = field->containing_oneof();
-
-  // Generate getter.
-  if (oneof != NULL) {
-    GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter);
-    printer->Print(
-        "public function get^camel_name^()\n"
-        "{\n"
-        "    return $this->readOneof(^number^);\n"
-        "}\n\n",
-        "camel_name", UnderscoresToCamelCase(field->name(), true),
-        "number", IntToString(field->number()));
-  } else {
-    GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter);
-    printer->Print(
-        "public function get^camel_name^()\n"
-        "{\n"
-        "    return $this->^name^;\n"
-        "}\n\n",
-        "camel_name", UnderscoresToCamelCase(field->name(), true), "name",
-        field->name());
-  }
-
-  // Generate setter.
-  GenerateFieldDocComment(printer, field, is_descriptor, kFieldSetter);
-  printer->Print(
-      "public function set^camel_name^($var)\n"
-      "{\n",
-      "camel_name", UnderscoresToCamelCase(field->name(), true));
-
-  Indent(printer);
-
-  // Type check.
-  if (field->is_map()) {
-    const Descriptor* map_entry = field->message_type();
-    const FieldDescriptor* key = map_entry->FindFieldByName("key");
-    const FieldDescriptor* value = map_entry->FindFieldByName("value");
-    printer->Print(
-        "$arr = GPBUtil::checkMapField($var, "
-        "\\Google\\Protobuf\\Internal\\GPBType::^key_type^, "
-        "\\Google\\Protobuf\\Internal\\GPBType::^value_type^",
-        "key_type", ToUpper(key->type_name()),
-        "value_type", ToUpper(value->type_name()));
-    if (value->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      printer->Print(
-          ", \\^class_name^);\n",
-          "class_name",
-          FullClassName(value->message_type(), is_descriptor) + "::class");
-    } else if (value->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
-      printer->Print(
-          ", \\^class_name^);\n",
-          "class_name",
-          FullClassName(value->enum_type(), is_descriptor) + "::class");
-    } else {
-      printer->Print(");\n");
-    }
-  } else if (field->is_repeated()) {
-    printer->Print(
-        "$arr = GPBUtil::checkRepeatedField($var, "
-        "\\Google\\Protobuf\\Internal\\GPBType::^type^",
-        "type", ToUpper(field->type_name()));
-    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      printer->Print(
-          ", \\^class_name^);\n",
-          "class_name",
-          FullClassName(field->message_type(), is_descriptor) + "::class");
-    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
-      printer->Print(
-          ", \\^class_name^);\n",
-          "class_name",
-          FullClassName(field->enum_type(), is_descriptor) + "::class");
-    } else {
-      printer->Print(");\n");
-    }
-  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-    printer->Print(
-        "GPBUtil::checkMessage($var, \\^class_name^::class);\n",
-        "class_name", FullClassName(field->message_type(), is_descriptor));
-  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
-    printer->Print(
-        "GPBUtil::checkEnum($var, \\^class_name^::class);\n",
-        "class_name", FullClassName(field->enum_type(), is_descriptor));
-  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
-    printer->Print(
-        "GPBUtil::checkString($var, ^utf8^);\n",
-        "utf8",
-        field->type() == FieldDescriptor::TYPE_STRING ? "True": "False");
-  } else {
-    printer->Print(
-        "GPBUtil::check^type^($var);\n",
-        "type", UnderscoresToCamelCase(field->cpp_type_name(), true));
-  }
-
-  if (oneof != NULL) {
-    printer->Print(
-        "$this->writeOneof(^number^, $var);\n",
-        "number", IntToString(field->number()));
-  } else if (field->is_repeated()) {
-    printer->Print(
-        "$this->^name^ = $arr;\n",
-        "name", field->name());
-  } else {
-    printer->Print(
-        "$this->^name^ = $var;\n",
-        "name", field->name());
-  }
-
-  // Set has bit for proto2 only.
-  if (is_descriptor) {
-    printer->Print(
-        "$this->has_^field_name^ = true;\n",
-        "field_name", field->name());
-  }
-
-  printer->Print("\nreturn $this;\n");
-
-  Outdent(printer);
-
-  printer->Print(
-      "}\n\n");
-
-  // Generate has method for proto2 only.
-  if (is_descriptor) {
-    printer->Print(
-        "public function has^camel_name^()\n"
-        "{\n"
-        "    return $this->has_^field_name^;\n"
-        "}\n\n",
-        "camel_name", UnderscoresToCamelCase(field->name(), true),
-        "field_name", field->name());
-  }
-}
-
-void GenerateEnumToPool(const EnumDescriptor* en, io::Printer* printer) {
-  printer->Print(
-      "$pool->addEnum('^name^', "
-      "\\Google\\Protobuf\\Internal\\^class_name^::class)\n",
-      "name", EnumFullName(en, true),
-      "class_name", en->name());
-  Indent(printer);
-
-  for (int i = 0; i < en->value_count(); i++) {
-    const EnumValueDescriptor* value = en->value(i);
-    printer->Print(
-        "->value(\"^name^\", ^number^)\n",
-        "name", ConstantNamePrefix(value->name()) + value->name(),
-        "number", IntToString(value->number()));
-  }
-  printer->Print("->finalizeToPool();\n\n");
-  Outdent(printer);
-}
-
-void GenerateServiceMethod(const MethodDescriptor* method,
-                           io::Printer* printer) {
-  printer->Print(
-        "public function ^camel_name^(\\^request_name^ $request);\n\n",
-        "camel_name", UnderscoresToCamelCase(method->name(), false),
-        "request_name", FullClassName(
-          method->input_type(), false)
-  );
-}
-
-void GenerateMessageToPool(const string& name_prefix, const Descriptor* message,
-                           io::Printer* printer) {
-  // Don't generate MapEntry messages -- we use the PHP extension's native
-  // support for map fields instead.
-  if (message->options().map_entry()) {
-    return;
-  }
-  string class_name = name_prefix.empty()?
-      message->name() : name_prefix + "_" + message->name();
-
-  printer->Print(
-      "$pool->addMessage('^message^', "
-      "\\Google\\Protobuf\\Internal\\^class_name^::class)\n",
-      "message", MessageFullName(message, true),
-      "class_name", class_name);
-
-  Indent(printer);
-
-  for (int i = 0; i < message->field_count(); i++) {
-    const FieldDescriptor* field = message->field(i);
-    if (field->is_map()) {
-      const FieldDescriptor* key =
-          field->message_type()->FindFieldByName("key");
-      const FieldDescriptor* val =
-          field->message_type()->FindFieldByName("value");
-      printer->Print(
-          "->map('^field^', \\Google\\Protobuf\\Internal\\GPBType::^key^, "
-          "\\Google\\Protobuf\\Internal\\GPBType::^value^, ^number^^other^)\n",
-          "field", field->name(),
-          "key", ToUpper(key->type_name()),
-          "value", ToUpper(val->type_name()),
-          "number", SimpleItoa(field->number()),
-          "other", EnumOrMessageSuffix(val, true));
-    } else if (!field->containing_oneof()) {
-      printer->Print(
-          "->^label^('^field^', "
-          "\\Google\\Protobuf\\Internal\\GPBType::^type^, ^number^^other^)\n",
-          "field", field->name(),
-          "label", LabelForField(field),
-          "type", ToUpper(field->type_name()),
-          "number", SimpleItoa(field->number()),
-          "other", EnumOrMessageSuffix(field, true));
-    }
-  }
-
-  // oneofs.
-  for (int i = 0; i < message->oneof_decl_count(); i++) {
-    const OneofDescriptor* oneof = message->oneof_decl(i);
-    printer->Print("->oneof(^name^)\n",
-                   "name", oneof->name());
-    Indent(printer);
-    for (int index = 0; index < oneof->field_count(); index++) {
-      const FieldDescriptor* field = oneof->field(index);
-      printer->Print(
-          "->value('^field^', "
-          "\\Google\\Protobuf\\Internal\\GPBType::^type^, ^number^^other^)\n",
-          "field", field->name(),
-          "type", ToUpper(field->type_name()),
-          "number", SimpleItoa(field->number()),
-          "other", EnumOrMessageSuffix(field, true));
-    }
-    printer->Print("->finish()\n");
-    Outdent(printer);
-  }
-
-  printer->Print(
-      "->finalizeToPool();\n");
-
-  Outdent(printer);
-
-  printer->Print(
-      "\n");
-
-  for (int i = 0; i < message->nested_type_count(); i++) {
-    GenerateMessageToPool(class_name, message->nested_type(i), printer);
-  }
-  for (int i = 0; i < message->enum_type_count(); i++) {
-    GenerateEnumToPool(message->enum_type(i), printer);
-  }
-}
-
-void GenerateAddFileToPool(const FileDescriptor* file, bool is_descriptor,
-                           io::Printer* printer) {
-    printer->Print(
-        "public static $is_initialized = false;\n\n"
-        "public static function initOnce() {\n");
-    Indent(printer);
-
-    printer->Print(
-        "$pool = \\Google\\Protobuf\\Internal\\"
-        "DescriptorPool::getGeneratedPool();\n\n"
-        "if (static::$is_initialized == true) {\n"
-        "  return;\n"
-        "}\n");
-
-  if (is_descriptor) {
-    for (int i = 0; i < file->message_type_count(); i++) {
-      GenerateMessageToPool("", file->message_type(i), printer);
-    }
-    for (int i = 0; i < file->enum_type_count(); i++) {
-      GenerateEnumToPool(file->enum_type(i), printer);
-    }
-
-    printer->Print(
-        "$pool->finish();\n");
-  } else {
-    for (int i = 0; i < file->dependency_count(); i++) {
-      const std::string& name = file->dependency(i)->name();
-      // Currently, descriptor.proto is not ready for external usage. Skip to
-      // import it for now, so that its dependencies can still work as long as
-      // they don't use protos defined in descriptor.proto.
-      if (name == kDescriptorFile) {
-        continue;
-      }
-      std::string dependency_filename =
-          GeneratedMetadataFileName(name, is_descriptor);
-      printer->Print(
-          "\\^name^::initOnce();\n",
-          "name", FilenameToClassname(dependency_filename));
-    }
-
-    // Add messages and enums to descriptor pool.
-    FileDescriptorSet files;
-    FileDescriptorProto* file_proto = files.add_file();
-    file->CopyTo(file_proto);
-
-    // Filter out descriptor.proto as it cannot be depended on for now.
-    RepeatedPtrField<string>* dependency = file_proto->mutable_dependency();
-    for (RepeatedPtrField<string>::iterator it = dependency->begin();
-         it != dependency->end(); ++it) {
-      if (*it != kDescriptorFile) {
-        dependency->erase(it);
-        break;
-      }
-    }
-
-    // Filter out all extensions, since we do not support extension yet.
-    file_proto->clear_extension();
-    RepeatedPtrField<DescriptorProto>* message_type =
-        file_proto->mutable_message_type();
-    for (RepeatedPtrField<DescriptorProto>::iterator it = message_type->begin();
-         it != message_type->end(); ++it) {
-      it->clear_extension();
-    }
-
-    string files_data;
-    files.SerializeToString(&files_data);
-
-    printer->Print("$pool->internalAddGeneratedFile(hex2bin(\n");
-    Indent(printer);
-
-    // Only write 30 bytes per line.
-    static const int kBytesPerLine = 30;
-    for (int i = 0; i < files_data.size(); i += kBytesPerLine) {
-      printer->Print(
-          "\"^data^\"^dot^\n",
-          "data", BinaryToHex(files_data.substr(i, kBytesPerLine)),
-          "dot", i + kBytesPerLine < files_data.size() ? " ." : "");
-    }
-
-    Outdent(printer);
-    printer->Print(
-        "));\n\n");
-  }
-  printer->Print(
-      "static::$is_initialized = true;\n");
-  Outdent(printer);
-  printer->Print("}\n");
-}
-
-void GenerateUseDeclaration(bool is_descriptor, io::Printer* printer) {
-  if (!is_descriptor) {
-    printer->Print(
-        "use Google\\Protobuf\\Internal\\GPBType;\n"
-        "use Google\\Protobuf\\Internal\\RepeatedField;\n"
-        "use Google\\Protobuf\\Internal\\GPBUtil;\n\n");
-  } else {
-    printer->Print(
-        "use Google\\Protobuf\\Internal\\GPBType;\n"
-        "use Google\\Protobuf\\Internal\\GPBWire;\n"
-        "use Google\\Protobuf\\Internal\\RepeatedField;\n"
-        "use Google\\Protobuf\\Internal\\InputStream;\n"
-        "use Google\\Protobuf\\Internal\\GPBUtil;\n\n");
-  }
-}
-
-void GenerateHead(const FileDescriptor* file, io::Printer* printer) {
-  printer->Print(
-    "<?php\n"
-    "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
-    "# source: ^filename^\n"
-    "\n",
-    "filename", file->name());
-}
-
-std::string FilenameToClassname(const string& filename) {
-  int lastindex = filename.find_last_of(".");
-  std::string result = filename.substr(0, lastindex);
-  for (int i = 0; i < result.size(); i++) {
-    if (result[i] == '/') {
-      result[i] = '\\';
-    }
-  }
-  return result;
-}
-
-void GenerateMetadataFile(const FileDescriptor* file,
-                          bool is_descriptor,
-                          GeneratorContext* generator_context) {
-  std::string filename = GeneratedMetadataFileName(file->name(), is_descriptor);
-  scoped_ptr<io::ZeroCopyOutputStream> output(
-      generator_context->Open(filename));
-  io::Printer printer(output.get(), '^');
-
-  GenerateHead(file, &printer);
-
-  std::string fullname = FilenameToClassname(filename);
-  int lastindex = fullname.find_last_of("\\");
-
-  printer.Print(
-      "namespace ^name^;\n\n",
-      "name", fullname.substr(0, lastindex));
-
-  if (lastindex != string::npos) {
-    printer.Print(
-        "class ^name^\n"
-        "{\n",
-        "name", fullname.substr(lastindex + 1));
-  } else {
-    printer.Print(
-        "class ^name^\n"
-        "{\n",
-        "name", fullname);
-  }
-  Indent(&printer);
-
-  GenerateAddFileToPool(file, is_descriptor, &printer);
-
-  Outdent(&printer);
-  printer.Print("}\n\n");
-}
-
-void GenerateEnumFile(const FileDescriptor* file, const EnumDescriptor* en,
-                      bool is_descriptor, GeneratorContext* generator_context) {
-  std::string filename = GeneratedEnumFileName(en, is_descriptor);
-  scoped_ptr<io::ZeroCopyOutputStream> output(
-      generator_context->Open(filename));
-  io::Printer printer(output.get(), '^');
-
-  GenerateHead(file, &printer);
-
-  std::string fullname = FilenameToClassname(filename);
-  int lastindex = fullname.find_last_of("\\");
-
-  if (file->options().has_php_namespace()) {
-    const string& php_namespace = file->options().php_namespace();
-    if (!php_namespace.empty()) {
-      printer.Print(
-          "namespace ^name^;\n\n",
-          "name", php_namespace);
-    }
-  } else if (!file->package().empty()) {
-    printer.Print(
-        "namespace ^name^;\n\n",
-        "name", fullname.substr(0, lastindex));
-  }
-
-  GenerateEnumDocComment(&printer, en, is_descriptor);
-
-  if (lastindex != string::npos) {
-    printer.Print(
-        "class ^name^\n"
-        "{\n",
-        "name", fullname.substr(lastindex + 1));
-  } else {
-    printer.Print(
-        "class ^name^\n"
-        "{\n",
-        "name", fullname);
-  }
-  Indent(&printer);
-
-  for (int i = 0; i < en->value_count(); i++) {
-    const EnumValueDescriptor* value = en->value(i);
-    GenerateEnumValueDocComment(&printer, value);
-    printer.Print("const ^name^ = ^number^;\n",
-                  "name", ConstantNamePrefix(value->name()) + value->name(),
-                  "number", IntToString(value->number()));
-  }
-
-  Outdent(&printer);
-  printer.Print("}\n\n");
-}
-
-void GenerateMessageFile(const FileDescriptor* file, const Descriptor* message,
-                         bool is_descriptor,
-                         GeneratorContext* generator_context) {
-  // Don't generate MapEntry messages -- we use the PHP extension's native
-  // support for map fields instead.
-  if (message->options().map_entry()) {
-    return;
-  }
-
-  std::string filename = GeneratedMessageFileName(message, is_descriptor);
-  scoped_ptr<io::ZeroCopyOutputStream> output(
-      generator_context->Open(filename));
-  io::Printer printer(output.get(), '^');
-
-  GenerateHead(file, &printer);
-
-  std::string fullname = FilenameToClassname(filename);
-  int lastindex = fullname.find_last_of("\\");
-
-  if (file->options().has_php_namespace()) {
-    const string& php_namespace = file->options().php_namespace();
-    if (!php_namespace.empty()) {
-      printer.Print(
-          "namespace ^name^;\n\n",
-          "name", php_namespace);
-    }
-  } else if (!file->package().empty()) {
-    printer.Print(
-        "namespace ^name^;\n\n",
-        "name", fullname.substr(0, lastindex));
-  }
-
-  GenerateUseDeclaration(is_descriptor, &printer);
-
-  GenerateMessageDocComment(&printer, message, is_descriptor);
-  if (lastindex != string::npos) {
-    printer.Print(
-        "class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n"
-        "{\n",
-        "name", fullname.substr(lastindex + 1));
-  } else {
-    printer.Print(
-        "class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n"
-        "{\n",
-        "name", fullname);
-  }
-  Indent(&printer);
-
-  // Field and oneof definitions.
-  for (int i = 0; i < message->field_count(); i++) {
-    const FieldDescriptor* field = message->field(i);
-    GenerateField(field, &printer, is_descriptor);
-  }
-  for (int i = 0; i < message->oneof_decl_count(); i++) {
-    const OneofDescriptor* oneof = message->oneof_decl(i);
-    GenerateOneofField(oneof, &printer);
-  }
-  printer.Print("\n");
-
-  printer.Print(
-      "public function __construct() {\n");
-  Indent(&printer);
-
-  std::string metadata_filename =
-      GeneratedMetadataFileName(file->name(), is_descriptor);
-  std::string metadata_fullname = FilenameToClassname(metadata_filename);
-  printer.Print(
-      "\\^fullname^::initOnce();\n"
-      "parent::__construct();\n",
-      "fullname", metadata_fullname);
-
-  Outdent(&printer);
-  printer.Print("}\n\n");
-
-  // Field and oneof accessors.
-  for (int i = 0; i < message->field_count(); i++) {
-    const FieldDescriptor* field = message->field(i);
-    GenerateFieldAccessor(field, is_descriptor, &printer);
-  }
-  for (int i = 0; i < message->oneof_decl_count(); i++) {
-    const OneofDescriptor* oneof = message->oneof_decl(i);
-    printer.Print(
-      "/**\n"
-      " * @return string\n"
-      " */\n"
-      "public function get^camel_name^()\n"
-      "{\n"
-      "    return $this->whichOneof(\"^name^\");\n"
-      "}\n\n",
-      "camel_name", UnderscoresToCamelCase(oneof->name(), true), "name",
-      oneof->name());
-  }
-
-  Outdent(&printer);
-  printer.Print("}\n\n");
-
-  // Nested messages and enums.
-  for (int i = 0; i < message->nested_type_count(); i++) {
-    GenerateMessageFile(file, message->nested_type(i), is_descriptor,
-                        generator_context);
-  }
-  for (int i = 0; i < message->enum_type_count(); i++) {
-    GenerateEnumFile(file, message->enum_type(i), is_descriptor,
-                     generator_context);
-  }
-}
-
-void GenerateServiceFile(const FileDescriptor* file,
-  const ServiceDescriptor* service, bool is_descriptor,
-  GeneratorContext* generator_context) {
-  std::string filename = GeneratedServiceFileName(service, is_descriptor);
-  scoped_ptr<io::ZeroCopyOutputStream> output(
-      generator_context->Open(filename));
-  io::Printer printer(output.get(), '^');
-
-  GenerateHead(file, &printer);
-
-  std::string fullname = FilenameToClassname(filename);
-  int lastindex = fullname.find_last_of("\\");
-
-  if (file->options().has_php_namespace()) {
-    const string& php_namespace = file->options().php_namespace();
-    if (!php_namespace.empty()) {
-      printer.Print(
-          "namespace ^name^;\n\n",
-          "name", php_namespace);
-    }
-  } else if (!file->package().empty()) {
-    printer.Print(
-        "namespace ^name^;\n\n",
-        "name", fullname.substr(0, lastindex));
-  }
-
-  GenerateServiceDocComment(&printer, service);
-
-  if (lastindex != string::npos) {
-      printer.Print(
-        "interface ^name^\n"
-        "{\n",
-        "name", fullname.substr(lastindex + 1));
-  } else {
-      printer.Print(
-        "interface ^name^\n"
-        "{\n",
-        "name", fullname);
-  }
-
-  Indent(&printer);
-
-  for (int i = 0; i < service->method_count(); i++) {
-    const MethodDescriptor* method = service->method(i);
-    GenerateServiceMethodDocComment(&printer, method);
-    GenerateServiceMethod(method, &printer);
-  }
-
-  Outdent(&printer);
-  printer.Print("}\n\n");
-}
-
-void GenerateFile(const FileDescriptor* file, bool is_descriptor,
-                  GeneratorContext* generator_context) {
-  GenerateMetadataFile(file, is_descriptor, generator_context);
-  for (int i = 0; i < file->message_type_count(); i++) {
-    GenerateMessageFile(file, file->message_type(i), is_descriptor,
-                        generator_context);
-  }
-  for (int i = 0; i < file->enum_type_count(); i++) {
-    GenerateEnumFile(file, file->enum_type(i), is_descriptor,
-                     generator_context);
-  }
-  if (file->options().php_generic_services()) {
-    for (int i = 0; i < file->service_count(); i++) {
-      GenerateServiceFile(file, file->service(i), is_descriptor,
-                       generator_context);
-    }
-  }
-}
-
-static string EscapePhpdoc(const string& input) {
-  string result;
-  result.reserve(input.size() * 2);
-
-  char prev = '*';
-
-  for (string::size_type i = 0; i < input.size(); i++) {
-    char c = input[i];
-    switch (c) {
-      case '*':
-        // Avoid "/*".
-        if (prev == '/') {
-          result.append("&#42;");
-        } else {
-          result.push_back(c);
-        }
-        break;
-      case '/':
-        // Avoid "*/".
-        if (prev == '*') {
-          result.append("&#47;");
-        } else {
-          result.push_back(c);
-        }
-        break;
-      case '@':
-        // '@' starts phpdoc tags including the @deprecated tag, which will
-        // cause a compile-time error if inserted before a declaration that
-        // does not have a corresponding @Deprecated annotation.
-        result.append("&#64;");
-        break;
-      default:
-        result.push_back(c);
-        break;
-    }
-
-    prev = c;
-  }
-
-  return result;
-}
-
-static void GenerateDocCommentBodyForLocation(
-    io::Printer* printer, const SourceLocation& location) {
-  string comments = location.leading_comments.empty() ?
-      location.trailing_comments : location.leading_comments;
-  if (!comments.empty()) {
-    // TODO(teboring):  Ideally we should parse the comment text as Markdown and
-    //   write it back as HTML, but this requires a Markdown parser.  For now
-    //   we just use the proto comments unchanged.
-
-    // If the comment itself contains block comment start or end markers,
-    // HTML-escape them so that they don't accidentally close the doc comment.
-    comments = EscapePhpdoc(comments);
-
-    vector<string> lines = Split(comments, "\n");
-    while (!lines.empty() && lines.back().empty()) {
-      lines.pop_back();
-    }
-
-    for (int i = 0; i < lines.size(); i++) {
-      // Most lines should start with a space.  Watch out for lines that start
-      // with a /, since putting that right after the leading asterisk will
-      // close the comment.
-      if (!lines[i].empty() && lines[i][0] == '/') {
-        printer->Print(" * ^line^\n", "line", lines[i]);
-      } else {
-        printer->Print(" *^line^\n", "line", lines[i]);
-      }
-    }
-    printer->Print(
-        " *\n");
-  }
-}
-
-template <typename DescriptorType>
-static void GenerateDocCommentBody(
-    io::Printer* printer, const DescriptorType* descriptor) {
-  SourceLocation location;
-  if (descriptor->GetSourceLocation(&location)) {
-    GenerateDocCommentBodyForLocation(printer, location);
-  }
-}
-
-static string FirstLineOf(const string& value) {
-  string result = value;
-
-  string::size_type pos = result.find_first_of('\n');
-  if (pos != string::npos) {
-    result.erase(pos);
-  }
-
-  return result;
-}
-
-void GenerateMessageDocComment(io::Printer* printer,
-                               const Descriptor* message, int is_descriptor) {
-  printer->Print("/**\n");
-  GenerateDocCommentBody(printer, message);
-  printer->Print(
-    " * Generated from protobuf message <code>^messagename^</code>\n"
-    " */\n",
-    "fullname", EscapePhpdoc(PhpName(message->full_name(), is_descriptor)),
-    "messagename", EscapePhpdoc(message->full_name()));
-}
-
-void GenerateServiceDocComment(io::Printer* printer,
-                               const ServiceDescriptor* service) {
-  printer->Print("/**\n");
-  GenerateDocCommentBody(printer, service);
-  printer->Print(
-    " * Protobuf type <code>^fullname^</code>\n"
-    " */\n",
-    "fullname", EscapePhpdoc(service->full_name()));
-}
-
-void GenerateFieldDocComment(io::Printer* printer, const FieldDescriptor* field,
-                             int is_descriptor, int function_type) {
-  // In theory we should have slightly different comments for setters, getters,
-  // etc., but in practice everyone already knows the difference between these
-  // so it's redundant information.
-
-  // We start the comment with the main body based on the comments from the
-  // .proto file (if present). We then end with the field declaration, e.g.:
-  //   optional string foo = 5;
-  // If the field is a group, the debug string might end with {.
-  printer->Print("/**\n");
-  GenerateDocCommentBody(printer, field);
-  printer->Print(
-    " * Generated from protobuf field <code>^def^</code>\n",
-    "def", EscapePhpdoc(FirstLineOf(field->DebugString())));
-  if (function_type == kFieldSetter) {
-    printer->Print(" * @param ^php_type^ $var\n",
-      "php_type", PhpSetterTypeName(field, is_descriptor));
-    printer->Print(" * @return $this\n");
-  } else if (function_type == kFieldGetter) {
-    printer->Print(" * @return ^php_type^\n",
-      "php_type", PhpGetterTypeName(field, is_descriptor));
-  }
-  printer->Print(" */\n");
-}
-
-void GenerateEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_,
-                            int is_descriptor) {
-  printer->Print("/**\n");
-  GenerateDocCommentBody(printer, enum_);
-  printer->Print(
-    " * Protobuf enum <code>^fullname^</code>\n"
-    " */\n",
-    "fullname", EscapePhpdoc(PhpName(enum_->full_name(), is_descriptor)));
-}
-
-void GenerateEnumValueDocComment(io::Printer* printer,
-                                 const EnumValueDescriptor* value) {
-  printer->Print("/**\n");
-  GenerateDocCommentBody(printer, value);
-  printer->Print(
-    " * Generated from protobuf enum <code>^def^</code>\n"
-    " */\n",
-    "def", EscapePhpdoc(FirstLineOf(value->DebugString())));
-}
-
-void GenerateServiceMethodDocComment(io::Printer* printer,
-                              const MethodDescriptor* method) {
-  printer->Print("/**\n");
-  GenerateDocCommentBody(printer, method);
-  printer->Print(
-    " * Method <code>^method_name^</code>\n"
-    " *\n",
-    "method_name", EscapePhpdoc(UnderscoresToCamelCase(method->name(), false)));
-  printer->Print(
-    " * @param \\^input_type^ $request\n",
-    "input_type", EscapePhpdoc(FullClassName(method->input_type(), false)));
-  printer->Print(
-    " * @return \\^return_type^\n"
-    " */\n",
-    "return_type", EscapePhpdoc(FullClassName(method->output_type(), false)));
-}
-
-bool Generator::Generate(const FileDescriptor* file, const string& parameter,
-                         GeneratorContext* generator_context,
-                         string* error) const {
-  bool is_descriptor = parameter == "internal";
-
-  if (is_descriptor && file->name() != kDescriptorFile) {
-    *error =
-        "Can only generate PHP code for google/protobuf/descriptor.proto.\n";
-    return false;
-  }
-
-  if (!is_descriptor && file->syntax() != FileDescriptor::SYNTAX_PROTO3) {
-    *error =
-        "Can only generate PHP code for proto3 .proto files.\n"
-        "Please add 'syntax = \"proto3\";' to the top of your .proto file.\n";
-    return false;
-  }
-
-  GenerateFile(file, is_descriptor, generator_context);
-
-  return true;
-}
-
-std::string GeneratedClassName(const Descriptor* desc) {
-  std::string classname = desc->name();
-  const Descriptor* containing = desc->containing_type();
-  while (containing != NULL) {
-    classname = containing->name() + '_' + classname;
-    containing = containing->containing_type();
-  }
-  return ClassNamePrefix(classname, desc) + classname;
-}
-
-std::string GeneratedClassName(const EnumDescriptor* desc) {
-  std::string classname = desc->name();
-  const Descriptor* containing = desc->containing_type();
-  while (containing != NULL) {
-    classname = containing->name() + '_' + classname;
-    containing = containing->containing_type();
-  }
-  return ClassNamePrefix(classname, desc) + classname;
-}
-
-std::string GeneratedClassName(const ServiceDescriptor* desc) {
-  std::string classname = desc->name();
-  return ClassNamePrefix(classname, desc) + classname;
-}
-
-}  // namespace php
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/compiler/php/php_generator.h b/src/google/protobuf/compiler/php/php_generator.h
deleted file mode 100644
index 67e70bc..0000000
--- a/src/google/protobuf/compiler/php/php_generator.h
+++ /dev/null
@@ -1,66 +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.
-
-#ifndef GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__
-#define GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__
-
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-
-#include <string>
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-namespace php {
-
-class LIBPROTOC_EXPORT Generator
-    : public google::protobuf::compiler::CodeGenerator {
-  virtual bool Generate(
-      const FileDescriptor* file,
-      const string& parameter,
-      GeneratorContext* generator_context,
-      string* error) const;
-
-};
-
-// To skip reserved keywords in php, some generated classname are prefixed.
-// Other code generators may need following API to figure out the actual
-// classname.
-std::string GeneratedClassName(const google::protobuf::Descriptor* desc);
-std::string GeneratedClassName(const google::protobuf::EnumDescriptor* desc);
-std::string GeneratedClassName(const google::protobuf::ServiceDescriptor* desc);
-
-}  // namespace php
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
-
-#endif  // GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/plugin.cc b/src/google/protobuf/compiler/plugin.cc
index bde3d79..2ff50f6 100644
--- a/src/google/protobuf/compiler/plugin.cc
+++ b/src/google/protobuf/compiler/plugin.cc
@@ -36,7 +36,14 @@
 #include <set>
 
 #ifdef _WIN32
+#include <io.h>
 #include <fcntl.h>
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
 #else
 #include <unistd.h>
 #endif
@@ -47,27 +54,17 @@
 #include <google/protobuf/compiler/code_generator.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 
 namespace google {
 namespace protobuf {
 namespace compiler {
 
-#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;
-#endif
-
 class GeneratorResponseContext : public GeneratorContext {
  public:
-  GeneratorResponseContext(
-      const Version& compiler_version,
-      CodeGeneratorResponse* response,
-      const std::vector<const FileDescriptor*>& parsed_files)
-      : compiler_version_(compiler_version),
-        response_(response),
+  GeneratorResponseContext(CodeGeneratorResponse* response,
+                           const vector<const FileDescriptor*>& parsed_files)
+      : response_(response),
         parsed_files_(parsed_files) {}
   virtual ~GeneratorResponseContext() {}
 
@@ -87,18 +84,13 @@
     return new io::StringOutputStream(file->mutable_content());
   }
 
-  void ListParsedFiles(std::vector<const FileDescriptor*>* output) {
+  void ListParsedFiles(vector<const FileDescriptor*>* output) {
     *output = parsed_files_;
   }
 
-  void GetCompilerVersion(Version* version) const {
-    *version = compiler_version_;
-  }
-
  private:
-  Version compiler_version_;
   CodeGeneratorResponse* response_;
-  const std::vector<const FileDescriptor*>& parsed_files_;
+  const vector<const FileDescriptor*>& parsed_files_;
 };
 
 bool GenerateCode(const CodeGeneratorRequest& request,
@@ -113,7 +105,7 @@
     }
   }
 
-  std::vector<const FileDescriptor*> parsed_files;
+  vector<const FileDescriptor*> parsed_files;
   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) {
@@ -124,20 +116,37 @@
     }
   }
 
-  GeneratorResponseContext context(
-      request.compiler_version(), response, parsed_files);
+  GeneratorResponseContext context(response, parsed_files);
 
+  if (generator.HasGenerateAll()) {
+    string error;
+    bool succeeded = generator.GenerateAll(
+        parsed_files, request.parameter(), &context, &error);
 
-  string 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.";
+    }
+    if (!error.empty()) {
+      response->set_error(error);
+    }
+  } else {
+    for (int i = 0; i < parsed_files.size(); i++) {
+      const FileDescriptor* file = parsed_files[i];
 
-  if (!succeeded && error.empty()) {
-    error = "Code generator returned false but provided no error "
-            "description.";
-  }
-  if (!error.empty()) {
-    response->set_error(error);
+      string error;
+      bool succeeded = generator.Generate(
+          file, request.parameter(), &context, &error);
+
+      if (!succeeded && error.empty()) {
+        error = "Code generator returned false but provided no error "
+                "description.";
+      }
+      if (!error.empty()) {
+        response->set_error(file->name() + ": " + error);
+        break;
+      }
+    }
   }
 
   return true;
@@ -151,8 +160,8 @@
   }
 
 #ifdef _WIN32
-  setmode(STDIN_FILENO, _O_BINARY);
-  setmode(STDOUT_FILENO, _O_BINARY);
+  _setmode(STDIN_FILENO, _O_BINARY);
+  _setmode(STDOUT_FILENO, _O_BINARY);
 #endif
 
   CodeGeneratorRequest request;
diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc
index 80c8c62..e9d50a1 100644
--- a/src/google/protobuf/compiler/plugin.pb.cc
+++ b/src/google/protobuf/compiler/plugin.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/compiler/plugin.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/compiler/plugin.pb.h>
 
 #include <algorithm>
@@ -14,688 +15,192 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
 namespace compiler {
-class VersionDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Version>
-      _instance;
-} _Version_default_instance_;
-class CodeGeneratorRequestDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<CodeGeneratorRequest>
-      _instance;
-} _CodeGeneratorRequest_default_instance_;
-class CodeGeneratorResponse_FileDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<CodeGeneratorResponse_File>
-      _instance;
-} _CodeGeneratorResponse_File_default_instance_;
-class CodeGeneratorResponseDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<CodeGeneratorResponse>
-      _instance;
-} _CodeGeneratorResponse_default_instance_;
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto {
-void InitDefaultsVersionImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::compiler::_Version_default_instance_;
-    new (ptr) ::google::protobuf::compiler::Version();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::compiler::Version::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* CodeGeneratorRequest_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  CodeGeneratorRequest_reflection_ = NULL;
+const ::google::protobuf::Descriptor* CodeGeneratorResponse_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  CodeGeneratorResponse_reflection_ = NULL;
+const ::google::protobuf::Descriptor* CodeGeneratorResponse_File_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  CodeGeneratorResponse_File_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/compiler/plugin.proto");
+  GOOGLE_CHECK(file != NULL);
+  CodeGeneratorRequest_descriptor_ = file->message_type(0);
+  static const int CodeGeneratorRequest_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, file_to_generate_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, parameter_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, proto_file_),
+  };
+  CodeGeneratorRequest_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      CodeGeneratorRequest_descriptor_,
+      CodeGeneratorRequest::default_instance_,
+      CodeGeneratorRequest_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(CodeGeneratorRequest),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, _internal_metadata_),
+      -1);
+  CodeGeneratorResponse_descriptor_ = file->message_type(1);
+  static const int CodeGeneratorResponse_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, error_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, file_),
+  };
+  CodeGeneratorResponse_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      CodeGeneratorResponse_descriptor_,
+      CodeGeneratorResponse::default_instance_,
+      CodeGeneratorResponse_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(CodeGeneratorResponse),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, _internal_metadata_),
+      -1);
+  CodeGeneratorResponse_File_descriptor_ = CodeGeneratorResponse_descriptor_->nested_type(0);
+  static const int CodeGeneratorResponse_File_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, insertion_point_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, content_),
+  };
+  CodeGeneratorResponse_File_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      CodeGeneratorResponse_File_descriptor_,
+      CodeGeneratorResponse_File::default_instance_,
+      CodeGeneratorResponse_File_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(CodeGeneratorResponse_File),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, _internal_metadata_),
+      -1);
 }
 
-void InitDefaultsVersion() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsVersionImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto);
 }
 
-void InitDefaultsCodeGeneratorRequestImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto();
-  protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersion();
-  {
-    void* ptr = &::google::protobuf::compiler::_CodeGeneratorRequest_default_instance_;
-    new (ptr) ::google::protobuf::compiler::CodeGeneratorRequest();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::compiler::CodeGeneratorRequest::InitAsDefaultInstance();
-}
-
-void InitDefaultsCodeGeneratorRequest() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsCodeGeneratorRequestImpl);
-}
-
-void InitDefaultsCodeGeneratorResponse_FileImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::compiler::_CodeGeneratorResponse_File_default_instance_;
-    new (ptr) ::google::protobuf::compiler::CodeGeneratorResponse_File();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::compiler::CodeGeneratorResponse_File::InitAsDefaultInstance();
-}
-
-void InitDefaultsCodeGeneratorResponse_File() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsCodeGeneratorResponse_FileImpl);
-}
-
-void InitDefaultsCodeGeneratorResponseImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_File();
-  {
-    void* ptr = &::google::protobuf::compiler::_CodeGeneratorResponse_default_instance_;
-    new (ptr) ::google::protobuf::compiler::CodeGeneratorResponse();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::compiler::CodeGeneratorResponse::InitAsDefaultInstance();
-}
-
-void InitDefaultsCodeGeneratorResponse() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsCodeGeneratorResponseImpl);
-}
-
-::google::protobuf::Metadata file_level_metadata[4];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, major_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, minor_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, patch_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, suffix_),
-  1,
-  2,
-  3,
-  0,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, file_to_generate_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, parameter_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, proto_file_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, compiler_version_),
-  ~0u,
-  0,
-  ~0u,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, insertion_point_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, content_),
-  0,
-  1,
-  2,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, error_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, file_),
-  0,
-  ~0u,
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, 9, sizeof(::google::protobuf::compiler::Version)},
-  { 13, 22, sizeof(::google::protobuf::compiler::CodeGeneratorRequest)},
-  { 26, 34, sizeof(::google::protobuf::compiler::CodeGeneratorResponse_File)},
-  { 37, 44, sizeof(::google::protobuf::compiler::CodeGeneratorResponse)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::compiler::_Version_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::compiler::_CodeGeneratorRequest_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::compiler::_CodeGeneratorResponse_File_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::compiler::_CodeGeneratorResponse_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/compiler/plugin.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 4);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      CodeGeneratorRequest_descriptor_, &CodeGeneratorRequest::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      CodeGeneratorResponse_descriptor_, &CodeGeneratorResponse::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      CodeGeneratorResponse_File_descriptor_, &CodeGeneratorResponse_File::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n%google/protobuf/compiler/plugin.proto\022"
-      "\030google.protobuf.compiler\032 google/protob"
-      "uf/descriptor.proto\"F\n\007Version\022\r\n\005major\030"
-      "\001 \001(\005\022\r\n\005minor\030\002 \001(\005\022\r\n\005patch\030\003 \001(\005\022\016\n\006s"
-      "uffix\030\004 \001(\t\"\272\001\n\024CodeGeneratorRequest\022\030\n\020"
-      "file_to_generate\030\001 \003(\t\022\021\n\tparameter\030\002 \001("
-      "\t\0228\n\nproto_file\030\017 \003(\0132$.google.protobuf."
-      "FileDescriptorProto\022;\n\020compiler_version\030"
-      "\003 \001(\0132!.google.protobuf.compiler.Version"
-      "\"\252\001\n\025CodeGeneratorResponse\022\r\n\005error\030\001 \001("
-      "\t\022B\n\004file\030\017 \003(\01324.google.protobuf.compil"
-      "er.CodeGeneratorResponse.File\032>\n\004File\022\014\n"
-      "\004name\030\001 \001(\t\022\027\n\017insertion_point\030\002 \001(\t\022\017\n\007"
-      "content\030\017 \001(\tBg\n\034com.google.protobuf.com"
-      "pilerB\014PluginProtosZ9github.com/golang/p"
-      "rotobuf/protoc-gen-go/plugin;plugin_go"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
+  delete CodeGeneratorRequest::default_instance_;
+  delete CodeGeneratorRequest_reflection_;
+  delete CodeGeneratorResponse::default_instance_;
+  delete CodeGeneratorResponse_reflection_;
+  delete CodeGeneratorResponse_File::default_instance_;
+  delete CodeGeneratorResponse_File_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 638);
+    "\n%google/protobuf/compiler/plugin.proto\022"
+    "\030google.protobuf.compiler\032 google/protob"
+    "uf/descriptor.proto\"}\n\024CodeGeneratorRequ"
+    "est\022\030\n\020file_to_generate\030\001 \003(\t\022\021\n\tparamet"
+    "er\030\002 \001(\t\0228\n\nproto_file\030\017 \003(\0132$.google.pr"
+    "otobuf.FileDescriptorProto\"\252\001\n\025CodeGener"
+    "atorResponse\022\r\n\005error\030\001 \001(\t\022B\n\004file\030\017 \003("
+    "\01324.google.protobuf.compiler.CodeGenerat"
+    "orResponse.File\032>\n\004File\022\014\n\004name\030\001 \001(\t\022\027\n"
+    "\017insertion_point\030\002 \001(\t\022\017\n\007content\030\017 \001(\tB"
+    "7\n\034com.google.protobuf.compilerB\014PluginP"
+    "rotosZ\tplugin_go", 456);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/compiler/plugin.proto", &protobuf_RegisterTypes);
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::AddDescriptors();
+  CodeGeneratorRequest::default_instance_ = new CodeGeneratorRequest();
+  CodeGeneratorResponse::default_instance_ = new CodeGeneratorResponse();
+  CodeGeneratorResponse_File::default_instance_ = new CodeGeneratorResponse_File();
+  CodeGeneratorRequest::default_instance_->InitAsDefaultInstance();
+  CodeGeneratorResponse::default_instance_->InitAsDefaultInstance();
+  CodeGeneratorResponse_File::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto
-namespace google {
-namespace protobuf {
-namespace compiler {
+} static_descriptor_initializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto_;
 
-// ===================================================================
+namespace {
 
-void Version::InitAsDefaultInstance() {
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int Version::kMajorFieldNumber;
-const int Version::kMinorFieldNumber;
-const int Version::kPatchFieldNumber;
-const int Version::kSuffixFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-Version::Version()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersion();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.compiler.Version)
-}
-Version::Version(const Version& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  suffix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_suffix()) {
-    suffix_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.suffix_);
-  }
-  ::memcpy(&major_, &from.major_,
-    static_cast<size_t>(reinterpret_cast<char*>(&patch_) -
-    reinterpret_cast<char*>(&major_)) + sizeof(patch_));
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.Version)
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
 }
 
-void Version::SharedCtor() {
-  _cached_size_ = 0;
-  suffix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&major_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&patch_) -
-      reinterpret_cast<char*>(&major_)) + sizeof(patch_));
-}
-
-Version::~Version() {
-  // @@protoc_insertion_point(destructor:google.protobuf.compiler.Version)
-  SharedDtor();
-}
-
-void Version::SharedDtor() {
-  suffix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-}
-
-void Version::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* Version::descriptor() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const Version& Version::default_instance() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersion();
-  return *internal_default_instance();
-}
-
-Version* Version::New(::google::protobuf::Arena* arena) const {
-  Version* n = new Version;
-  if (arena != NULL) {
-    arena->Own(n);
-  }
-  return n;
-}
-
-void Version::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.Version)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x00000001u) {
-    GOOGLE_DCHECK(!suffix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-    (*suffix_.UnsafeRawStringPointer())->clear();
-  }
-  if (cached_has_bits & 14u) {
-    ::memset(&major_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&patch_) -
-        reinterpret_cast<char*>(&major_)) + sizeof(patch_));
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool Version::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.compiler.Version)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // optional int32 major = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-          set_has_major();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &major_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional int32 minor = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_minor();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &minor_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional int32 patch = 3;
-      case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-          set_has_patch();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &patch_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional string suffix = 4;
-      case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_suffix()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->suffix().data(), static_cast<int>(this->suffix().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.compiler.Version.suffix");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.compiler.Version)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.compiler.Version)
-  return false;
-#undef DO_
-}
-
-void Version::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.Version)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 major = 1;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->major(), output);
-  }
-
-  // optional int32 minor = 2;
-  if (cached_has_bits & 0x00000004u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->minor(), output);
-  }
-
-  // optional int32 patch = 3;
-  if (cached_has_bits & 0x00000008u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->patch(), output);
-  }
-
-  // optional string suffix = 4;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->suffix().data(), static_cast<int>(this->suffix().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.compiler.Version.suffix");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      4, this->suffix(), output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.Version)
-}
-
-::google::protobuf::uint8* Version::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.Version)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 major = 1;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->major(), target);
-  }
-
-  // optional int32 minor = 2;
-  if (cached_has_bits & 0x00000004u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->minor(), target);
-  }
-
-  // optional int32 patch = 3;
-  if (cached_has_bits & 0x00000008u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->patch(), target);
-  }
-
-  // optional string suffix = 4;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->suffix().data(), static_cast<int>(this->suffix().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.compiler.Version.suffix");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        4, this->suffix(), target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.Version)
-  return target;
-}
-
-size_t Version::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.Version)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  if (_has_bits_[0 / 32] & 15u) {
-    // optional string suffix = 4;
-    if (has_suffix()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->suffix());
-    }
-
-    // optional int32 major = 1;
-    if (has_major()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->major());
-    }
-
-    // optional int32 minor = 2;
-    if (has_minor()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->minor());
-    }
-
-    // optional int32 patch = 3;
-    if (has_patch()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->patch());
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void Version::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.Version)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Version* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const Version>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.compiler.Version)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.compiler.Version)
-    MergeFrom(*source);
-  }
-}
-
-void Version::MergeFrom(const Version& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.Version)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 15u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_has_suffix();
-      suffix_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.suffix_);
-    }
-    if (cached_has_bits & 0x00000002u) {
-      major_ = from.major_;
-    }
-    if (cached_has_bits & 0x00000004u) {
-      minor_ = from.minor_;
-    }
-    if (cached_has_bits & 0x00000008u) {
-      patch_ = from.patch_;
-    }
-    _has_bits_[0] |= cached_has_bits;
-  }
-}
-
-void Version::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.compiler.Version)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void Version::CopyFrom(const Version& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.compiler.Version)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool Version::IsInitialized() const {
-  return true;
-}
-
-void Version::Swap(Version* other) {
-  if (other == this) return;
-  InternalSwap(other);
-}
-void Version::InternalSwap(Version* other) {
-  using std::swap;
-  suffix_.Swap(&other->suffix_);
-  swap(major_, other->major_);
-  swap(minor_, other->minor_);
-  swap(patch_, other->patch_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata Version::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages];
-}
+}  // namespace
 
 
 // ===================================================================
 
-void CodeGeneratorRequest::InitAsDefaultInstance() {
-  ::google::protobuf::compiler::_CodeGeneratorRequest_default_instance_._instance.get_mutable()->compiler_version_ = const_cast< ::google::protobuf::compiler::Version*>(
-      ::google::protobuf::compiler::Version::internal_default_instance());
-}
-void CodeGeneratorRequest::clear_proto_file() {
-  proto_file_.Clear();
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int CodeGeneratorRequest::kFileToGenerateFieldNumber;
 const int CodeGeneratorRequest::kParameterFieldNumber;
 const int CodeGeneratorRequest::kProtoFileFieldNumber;
-const int CodeGeneratorRequest::kCompilerVersionFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 CodeGeneratorRequest::CodeGeneratorRequest()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorRequest();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.compiler.CodeGeneratorRequest)
 }
+
+void CodeGeneratorRequest::InitAsDefaultInstance() {
+}
+
 CodeGeneratorRequest::CodeGeneratorRequest(const CodeGeneratorRequest& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      file_to_generate_(from.file_to_generate_),
-      proto_file_(from.proto_file_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  parameter_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_parameter()) {
-    parameter_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.parameter_);
-  }
-  if (from.has_compiler_version()) {
-    compiler_version_ = new ::google::protobuf::compiler::Version(*from.compiler_version_);
-  } else {
-    compiler_version_ = NULL;
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.CodeGeneratorRequest)
 }
 
 void CodeGeneratorRequest::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   parameter_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  compiler_version_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 CodeGeneratorRequest::~CodeGeneratorRequest() {
@@ -705,7 +210,8 @@
 
 void CodeGeneratorRequest::SharedDtor() {
   parameter_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete compiler_version_;
+  if (this != default_instance_) {
+  }
 }
 
 void CodeGeneratorRequest::SetCachedSize(int size) const {
@@ -714,15 +220,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* CodeGeneratorRequest::descriptor() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return CodeGeneratorRequest_descriptor_;
 }
 
 const CodeGeneratorRequest& CodeGeneratorRequest::default_instance() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorRequest();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  return *default_instance_;
 }
 
+CodeGeneratorRequest* CodeGeneratorRequest::default_instance_ = NULL;
+
 CodeGeneratorRequest* CodeGeneratorRequest::New(::google::protobuf::Arena* arena) const {
   CodeGeneratorRequest* n = new CodeGeneratorRequest;
   if (arena != NULL) {
@@ -733,25 +241,15 @@
 
 void CodeGeneratorRequest::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.CodeGeneratorRequest)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
+  if (has_parameter()) {
+    parameter_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
   file_to_generate_.Clear();
   proto_file_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!parameter_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      (*parameter_.UnsafeRawStringPointer())->clear();
-    }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(compiler_version_ != NULL);
-      compiler_version_->Clear();
-    }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool CodeGeneratorRequest::MergePartialFromCodedStream(
@@ -760,73 +258,72 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.compiler.CodeGeneratorRequest)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated string file_to_generate = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
+         parse_file_to_generate:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->add_file_to_generate()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
             this->file_to_generate(this->file_to_generate_size() - 1).data(),
-            static_cast<int>(this->file_to_generate(this->file_to_generate_size() - 1).length()),
+            this->file_to_generate(this->file_to_generate_size() - 1).length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(10)) goto parse_file_to_generate;
+        if (input->ExpectTag(18)) goto parse_parameter;
         break;
       }
 
       // optional string parameter = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_parameter:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_parameter()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->parameter().data(), static_cast<int>(this->parameter().length()),
+            this->parameter().data(), this->parameter().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.compiler.CodeGeneratorRequest.parameter");
         } else {
           goto handle_unusual;
         }
-        break;
-      }
-
-      // optional .google.protobuf.compiler.Version compiler_version = 3;
-      case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_compiler_version()));
-        } else {
-          goto handle_unusual;
-        }
+        if (input->ExpectTag(122)) goto parse_proto_file;
         break;
       }
 
       // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
       case 15: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(122u /* 122 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_proto_file()));
+        if (tag == 122) {
+         parse_proto_file:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_proto_file:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_proto_file()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(122)) goto parse_loop_proto_file;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -843,72 +340,56 @@
 void CodeGeneratorRequest::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.CodeGeneratorRequest)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated string file_to_generate = 1;
-  for (int i = 0, n = this->file_to_generate_size(); i < n; i++) {
+  for (int i = 0; i < this->file_to_generate_size(); i++) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->file_to_generate(i).data(), static_cast<int>(this->file_to_generate(i).length()),
+      this->file_to_generate(i).data(), this->file_to_generate(i).length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate");
     ::google::protobuf::internal::WireFormatLite::WriteString(
       1, this->file_to_generate(i), output);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string parameter = 2;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_parameter()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->parameter().data(), static_cast<int>(this->parameter().length()),
+      this->parameter().data(), this->parameter().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorRequest.parameter");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       2, this->parameter(), output);
   }
 
-  // optional .google.protobuf.compiler.Version compiler_version = 3;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      3, *this->compiler_version_, output);
-  }
-
   // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->proto_file_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->proto_file_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      15, this->proto_file(static_cast<int>(i)), output);
+      15, this->proto_file(i), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.CodeGeneratorRequest)
 }
 
-::google::protobuf::uint8* CodeGeneratorRequest::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* CodeGeneratorRequest::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorRequest)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated string file_to_generate = 1;
-  for (int i = 0, n = this->file_to_generate_size(); i < n; i++) {
+  for (int i = 0; i < this->file_to_generate_size(); i++) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->file_to_generate(i).data(), static_cast<int>(this->file_to_generate(i).length()),
+      this->file_to_generate(i).data(), this->file_to_generate(i).length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate");
     target = ::google::protobuf::internal::WireFormatLite::
       WriteStringToArray(1, this->file_to_generate(i), target);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string parameter = 2;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_parameter()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->parameter().data(), static_cast<int>(this->parameter().length()),
+      this->parameter().data(), this->parameter().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorRequest.parameter");
     target =
@@ -916,84 +397,62 @@
         2, this->parameter(), target);
   }
 
-  // optional .google.protobuf.compiler.Version compiler_version = 3;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, *this->compiler_version_, deterministic, target);
-  }
-
   // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->proto_file_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->proto_file_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        15, this->proto_file(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        15, this->proto_file(i), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.CodeGeneratorRequest)
   return target;
 }
 
-size_t CodeGeneratorRequest::ByteSizeLong() const {
+int CodeGeneratorRequest::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.CodeGeneratorRequest)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
+  // optional string parameter = 2;
+  if (has_parameter()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->parameter());
   }
+
   // repeated string file_to_generate = 1;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->file_to_generate_size());
-  for (int i = 0, n = this->file_to_generate_size(); i < n; i++) {
+  total_size += 1 * this->file_to_generate_size();
+  for (int i = 0; i < this->file_to_generate_size(); i++) {
     total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
       this->file_to_generate(i));
   }
 
   // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
-  {
-    unsigned int count = static_cast<unsigned int>(this->proto_file_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->proto_file(static_cast<int>(i)));
-    }
+  total_size += 1 * this->proto_file_size();
+  for (int i = 0; i < this->proto_file_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->proto_file(i));
   }
 
-  if (_has_bits_[0 / 32] & 3u) {
-    // optional string parameter = 2;
-    if (has_parameter()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->parameter());
-    }
-
-    // optional .google.protobuf.compiler.Version compiler_version = 3;
-    if (has_compiler_version()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->compiler_version_);
-    }
-
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void CodeGeneratorRequest::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.CodeGeneratorRequest)
-  GOOGLE_DCHECK_NE(&from, this);
-  const CodeGeneratorRequest* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const CodeGeneratorRequest* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const CodeGeneratorRequest>(
           &from);
   if (source == NULL) {
@@ -1007,22 +466,17 @@
 
 void CodeGeneratorRequest::MergeFrom(const CodeGeneratorRequest& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.CodeGeneratorRequest)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   file_to_generate_.MergeFrom(from.file_to_generate_);
   proto_file_.MergeFrom(from.proto_file_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
+  if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) {
+    if (from.has_parameter()) {
       set_has_parameter();
       parameter_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.parameter_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      mutable_compiler_version()->::google::protobuf::compiler::Version::MergeFrom(from.compiler_version());
-    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -1041,6 +495,7 @@
 }
 
 bool CodeGeneratorRequest::IsInitialized() const {
+
   if (!::google::protobuf::internal::AllAreInitialized(this->proto_file())) return false;
   return true;
 }
@@ -1050,26 +505,168 @@
   InternalSwap(other);
 }
 void CodeGeneratorRequest::InternalSwap(CodeGeneratorRequest* other) {
-  using std::swap;
-  file_to_generate_.InternalSwap(&other->file_to_generate_);
-  proto_file_.InternalSwap(&other->proto_file_);
+  file_to_generate_.UnsafeArenaSwap(&other->file_to_generate_);
   parameter_.Swap(&other->parameter_);
-  swap(compiler_version_, other->compiler_version_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  proto_file_.UnsafeArenaSwap(&other->proto_file_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata CodeGeneratorRequest::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = CodeGeneratorRequest_descriptor_;
+  metadata.reflection = CodeGeneratorRequest_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// CodeGeneratorRequest
+
+// repeated string file_to_generate = 1;
+int CodeGeneratorRequest::file_to_generate_size() const {
+  return file_to_generate_.size();
+}
+void CodeGeneratorRequest::clear_file_to_generate() {
+  file_to_generate_.Clear();
+}
+ const ::std::string& CodeGeneratorRequest::file_to_generate(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+  return file_to_generate_.Get(index);
+}
+ ::std::string* CodeGeneratorRequest::mutable_file_to_generate(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+  return file_to_generate_.Mutable(index);
+}
+ void CodeGeneratorRequest::set_file_to_generate(int index, const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+  file_to_generate_.Mutable(index)->assign(value);
+}
+ void CodeGeneratorRequest::set_file_to_generate(int index, const char* value) {
+  file_to_generate_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+}
+ void CodeGeneratorRequest::set_file_to_generate(int index, const char* value, size_t size) {
+  file_to_generate_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+}
+ ::std::string* CodeGeneratorRequest::add_file_to_generate() {
+  // @@protoc_insertion_point(field_add_mutable:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+  return file_to_generate_.Add();
+}
+ void CodeGeneratorRequest::add_file_to_generate(const ::std::string& value) {
+  file_to_generate_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+}
+ void CodeGeneratorRequest::add_file_to_generate(const char* value) {
+  file_to_generate_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+}
+ void CodeGeneratorRequest::add_file_to_generate(const char* value, size_t size) {
+  file_to_generate_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+}
+ const ::google::protobuf::RepeatedPtrField< ::std::string>&
+CodeGeneratorRequest::file_to_generate() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+  return file_to_generate_;
+}
+ ::google::protobuf::RepeatedPtrField< ::std::string>*
+CodeGeneratorRequest::mutable_file_to_generate() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
+  return &file_to_generate_;
+}
+
+// optional string parameter = 2;
+bool CodeGeneratorRequest::has_parameter() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void CodeGeneratorRequest::set_has_parameter() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void CodeGeneratorRequest::clear_has_parameter() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void CodeGeneratorRequest::clear_parameter() {
+  parameter_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_parameter();
+}
+ const ::std::string& CodeGeneratorRequest::parameter() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+  return parameter_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorRequest::set_parameter(const ::std::string& value) {
+  set_has_parameter();
+  parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+}
+ void CodeGeneratorRequest::set_parameter(const char* value) {
+  set_has_parameter();
+  parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+}
+ void CodeGeneratorRequest::set_parameter(const char* value, size_t size) {
+  set_has_parameter();
+  parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+}
+ ::std::string* CodeGeneratorRequest::mutable_parameter() {
+  set_has_parameter();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+  return parameter_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* CodeGeneratorRequest::release_parameter() {
+  // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+  clear_has_parameter();
+  return parameter_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorRequest::set_allocated_parameter(::std::string* parameter) {
+  if (parameter != NULL) {
+    set_has_parameter();
+  } else {
+    clear_has_parameter();
+  }
+  parameter_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), parameter);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorRequest.parameter)
+}
+
+// repeated .google.protobuf.FileDescriptorProto proto_file = 15;
+int CodeGeneratorRequest::proto_file_size() const {
+  return proto_file_.size();
+}
+void CodeGeneratorRequest::clear_proto_file() {
+  proto_file_.Clear();
+}
+const ::google::protobuf::FileDescriptorProto& CodeGeneratorRequest::proto_file(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
+  return proto_file_.Get(index);
+}
+::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::mutable_proto_file(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
+  return proto_file_.Mutable(index);
+}
+::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::add_proto_file() {
+  // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
+  return proto_file_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >*
+CodeGeneratorRequest::mutable_proto_file() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
+  return &proto_file_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&
+CodeGeneratorRequest::proto_file() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
+  return proto_file_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void CodeGeneratorResponse_File::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int CodeGeneratorResponse_File::kNameFieldNumber;
 const int CodeGeneratorResponse_File::kInsertionPointFieldNumber;
@@ -1078,38 +675,28 @@
 
 CodeGeneratorResponse_File::CodeGeneratorResponse_File()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_File();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.compiler.CodeGeneratorResponse.File)
 }
+
+void CodeGeneratorResponse_File::InitAsDefaultInstance() {
+}
+
 CodeGeneratorResponse_File::CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
-  }
-  insertion_point_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_insertion_point()) {
-    insertion_point_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.insertion_point_);
-  }
-  content_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_content()) {
-    content_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.content_);
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.CodeGeneratorResponse.File)
 }
 
 void CodeGeneratorResponse_File::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   insertion_point_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   content_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 CodeGeneratorResponse_File::~CodeGeneratorResponse_File() {
@@ -1121,6 +708,8 @@
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   insertion_point_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   content_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
 void CodeGeneratorResponse_File::SetCachedSize(int size) const {
@@ -1129,15 +718,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* CodeGeneratorResponse_File::descriptor() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return CodeGeneratorResponse_File_descriptor_;
 }
 
 const CodeGeneratorResponse_File& CodeGeneratorResponse_File::default_instance() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_File();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  return *default_instance_;
 }
 
+CodeGeneratorResponse_File* CodeGeneratorResponse_File::default_instance_ = NULL;
+
 CodeGeneratorResponse_File* CodeGeneratorResponse_File::New(::google::protobuf::Arena* arena) const {
   CodeGeneratorResponse_File* n = new CodeGeneratorResponse_File;
   if (arena != NULL) {
@@ -1148,27 +739,21 @@
 
 void CodeGeneratorResponse_File::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.CodeGeneratorResponse.File)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 7u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      (*name_.UnsafeRawStringPointer())->clear();
+  if (_has_bits_[0 / 32] & 7u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!insertion_point_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      (*insertion_point_.UnsafeRawStringPointer())->clear();
+    if (has_insertion_point()) {
+      insertion_point_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000004u) {
-      GOOGLE_DCHECK(!content_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      (*content_.UnsafeRawStringPointer())->clear();
+    if (has_content()) {
+      content_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool CodeGeneratorResponse_File::MergePartialFromCodedStream(
@@ -1177,65 +762,69 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.compiler.CodeGeneratorResponse.File)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.compiler.CodeGeneratorResponse.File.name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_insertion_point;
         break;
       }
 
       // optional string insertion_point = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_insertion_point:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_insertion_point()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->insertion_point().data(), static_cast<int>(this->insertion_point().length()),
+            this->insertion_point().data(), this->insertion_point().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(122)) goto parse_content;
         break;
       }
 
       // optional string content = 15;
       case 15: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(122u /* 122 & 0xFF */)) {
+        if (tag == 122) {
+         parse_content:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_content()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->content().data(), static_cast<int>(this->content().length()),
+            this->content().data(), this->content().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.compiler.CodeGeneratorResponse.File.content");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -1252,14 +841,10 @@
 void CodeGeneratorResponse_File::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.CodeGeneratorResponse.File)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.File.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -1267,9 +852,9 @@
   }
 
   // optional string insertion_point = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_insertion_point()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->insertion_point().data(), static_cast<int>(this->insertion_point().length()),
+      this->insertion_point().data(), this->insertion_point().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -1277,9 +862,9 @@
   }
 
   // optional string content = 15;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_content()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->content().data(), static_cast<int>(this->content().length()),
+      this->content().data(), this->content().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.File.content");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -1288,23 +873,18 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.CodeGeneratorResponse.File)
 }
 
-::google::protobuf::uint8* CodeGeneratorResponse_File::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* CodeGeneratorResponse_File::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorResponse.File)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.File.name");
     target =
@@ -1313,9 +893,9 @@
   }
 
   // optional string insertion_point = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_insertion_point()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->insertion_point().data(), static_cast<int>(this->insertion_point().length()),
+      this->insertion_point().data(), this->insertion_point().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point");
     target =
@@ -1324,9 +904,9 @@
   }
 
   // optional string content = 15;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_content()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->content().data(), static_cast<int>(this->content().length()),
+      this->content().data(), this->content().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.File.content");
     target =
@@ -1336,21 +916,16 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.CodeGeneratorResponse.File)
   return target;
 }
 
-size_t CodeGeneratorResponse_File::ByteSizeLong() const {
+int CodeGeneratorResponse_File::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.CodeGeneratorResponse.File)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
   if (_has_bits_[0 / 32] & 7u) {
     // optional string name = 1;
     if (has_name()) {
@@ -1374,17 +949,21 @@
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void CodeGeneratorResponse_File::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse.File)
-  GOOGLE_DCHECK_NE(&from, this);
-  const CodeGeneratorResponse_File* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const CodeGeneratorResponse_File* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const CodeGeneratorResponse_File>(
           &from);
   if (source == NULL) {
@@ -1398,26 +977,24 @@
 
 void CodeGeneratorResponse_File::MergeFrom(const CodeGeneratorResponse_File& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse.File)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 7u) {
-    if (cached_has_bits & 0x00000001u) {
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
       set_has_name();
       name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
+    if (from.has_insertion_point()) {
       set_has_insertion_point();
       insertion_point_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.insertion_point_);
     }
-    if (cached_has_bits & 0x00000004u) {
+    if (from.has_content()) {
       set_has_content();
       content_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.content_);
     }
   }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
 }
 
 void CodeGeneratorResponse_File::CopyFrom(const ::google::protobuf::Message& from) {
@@ -1435,6 +1012,7 @@
 }
 
 bool CodeGeneratorResponse_File::IsInitialized() const {
+
   return true;
 }
 
@@ -1443,25 +1021,25 @@
   InternalSwap(other);
 }
 void CodeGeneratorResponse_File::InternalSwap(CodeGeneratorResponse_File* other) {
-  using std::swap;
   name_.Swap(&other->name_);
   insertion_point_.Swap(&other->insertion_point_);
   content_.Swap(&other->content_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata CodeGeneratorResponse_File::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = CodeGeneratorResponse_File_descriptor_;
+  metadata.reflection = CodeGeneratorResponse_File_reflection_;
+  return metadata;
 }
 
 
-// ===================================================================
+// -------------------------------------------------------------------
 
-void CodeGeneratorResponse::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int CodeGeneratorResponse::kErrorFieldNumber;
 const int CodeGeneratorResponse::kFileFieldNumber;
@@ -1469,29 +1047,26 @@
 
 CodeGeneratorResponse::CodeGeneratorResponse()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.compiler.CodeGeneratorResponse)
 }
+
+void CodeGeneratorResponse::InitAsDefaultInstance() {
+}
+
 CodeGeneratorResponse::CodeGeneratorResponse(const CodeGeneratorResponse& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      file_(from.file_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  error_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_error()) {
-    error_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.error_);
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.CodeGeneratorResponse)
 }
 
 void CodeGeneratorResponse::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   error_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 CodeGeneratorResponse::~CodeGeneratorResponse() {
@@ -1501,6 +1076,8 @@
 
 void CodeGeneratorResponse::SharedDtor() {
   error_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
 void CodeGeneratorResponse::SetCachedSize(int size) const {
@@ -1509,15 +1086,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* CodeGeneratorResponse::descriptor() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return CodeGeneratorResponse_descriptor_;
 }
 
 const CodeGeneratorResponse& CodeGeneratorResponse::default_instance() {
-  ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  return *default_instance_;
 }
 
+CodeGeneratorResponse* CodeGeneratorResponse::default_instance_ = NULL;
+
 CodeGeneratorResponse* CodeGeneratorResponse::New(::google::protobuf::Arena* arena) const {
   CodeGeneratorResponse* n = new CodeGeneratorResponse;
   if (arena != NULL) {
@@ -1528,18 +1107,14 @@
 
 void CodeGeneratorResponse::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.CodeGeneratorResponse)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  file_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x00000001u) {
-    GOOGLE_DCHECK(!error_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-    (*error_.UnsafeRawStringPointer())->clear();
+  if (has_error()) {
+    error_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  file_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool CodeGeneratorResponse::MergePartialFromCodedStream(
@@ -1548,44 +1123,52 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.compiler.CodeGeneratorResponse)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string error = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_error()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->error().data(), static_cast<int>(this->error().length()),
+            this->error().data(), this->error().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.compiler.CodeGeneratorResponse.error");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(122)) goto parse_file;
         break;
       }
 
       // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
       case 15: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(122u /* 122 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_file()));
+        if (tag == 122) {
+         parse_file:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_file:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_file()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(122)) goto parse_loop_file;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -1602,14 +1185,10 @@
 void CodeGeneratorResponse::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.CodeGeneratorResponse)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string error = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_error()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->error().data(), static_cast<int>(this->error().length()),
+      this->error().data(), this->error().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.error");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -1617,31 +1196,25 @@
   }
 
   // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->file_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->file_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      15, this->file(static_cast<int>(i)), output);
+      15, this->file(i), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.CodeGeneratorResponse)
 }
 
-::google::protobuf::uint8* CodeGeneratorResponse::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* CodeGeneratorResponse::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorResponse)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string error = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_error()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->error().data(), static_cast<int>(this->error().length()),
+      this->error().data(), this->error().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.compiler.CodeGeneratorResponse.error");
     target =
@@ -1650,40 +1223,23 @@
   }
 
   // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->file_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->file_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        15, this->file(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        15, this->file(i), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.CodeGeneratorResponse)
   return target;
 }
 
-size_t CodeGeneratorResponse::ByteSizeLong() const {
+int CodeGeneratorResponse::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.CodeGeneratorResponse)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
-  {
-    unsigned int count = static_cast<unsigned int>(this->file_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->file(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   // optional string error = 1;
   if (has_error()) {
@@ -1692,17 +1248,29 @@
         this->error());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
+  total_size += 1 * this->file_size();
+  for (int i = 0; i < this->file_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->file(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void CodeGeneratorResponse::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse)
-  GOOGLE_DCHECK_NE(&from, this);
-  const CodeGeneratorResponse* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const CodeGeneratorResponse* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const CodeGeneratorResponse>(
           &from);
   if (source == NULL) {
@@ -1716,15 +1284,16 @@
 
 void CodeGeneratorResponse::MergeFrom(const CodeGeneratorResponse& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   file_.MergeFrom(from.file_);
-  if (from.has_error()) {
-    set_has_error();
-    error_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.error_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_error()) {
+      set_has_error();
+      error_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.error_);
+    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -1743,6 +1312,7 @@
 }
 
 bool CodeGeneratorResponse::IsInitialized() const {
+
   return true;
 }
 
@@ -1751,21 +1321,278 @@
   InternalSwap(other);
 }
 void CodeGeneratorResponse::InternalSwap(CodeGeneratorResponse* other) {
-  using std::swap;
-  file_.InternalSwap(&other->file_);
   error_.Swap(&other->error_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  file_.UnsafeArenaSwap(&other->file_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata CodeGeneratorResponse::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = CodeGeneratorResponse_descriptor_;
+  metadata.reflection = CodeGeneratorResponse_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// CodeGeneratorResponse_File
+
+// optional string name = 1;
+bool CodeGeneratorResponse_File::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void CodeGeneratorResponse_File::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void CodeGeneratorResponse_File::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void CodeGeneratorResponse_File::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& CodeGeneratorResponse_File::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse_File::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+}
+ void CodeGeneratorResponse_File::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+}
+ void CodeGeneratorResponse_File::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+}
+ ::std::string* CodeGeneratorResponse_File::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* CodeGeneratorResponse_File::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse_File::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.File.name)
+}
+
+// optional string insertion_point = 2;
+bool CodeGeneratorResponse_File::has_insertion_point() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void CodeGeneratorResponse_File::set_has_insertion_point() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void CodeGeneratorResponse_File::clear_has_insertion_point() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void CodeGeneratorResponse_File::clear_insertion_point() {
+  insertion_point_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_insertion_point();
+}
+ const ::std::string& CodeGeneratorResponse_File::insertion_point() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+  return insertion_point_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse_File::set_insertion_point(const ::std::string& value) {
+  set_has_insertion_point();
+  insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+}
+ void CodeGeneratorResponse_File::set_insertion_point(const char* value) {
+  set_has_insertion_point();
+  insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+}
+ void CodeGeneratorResponse_File::set_insertion_point(const char* value, size_t size) {
+  set_has_insertion_point();
+  insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+}
+ ::std::string* CodeGeneratorResponse_File::mutable_insertion_point() {
+  set_has_insertion_point();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+  return insertion_point_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* CodeGeneratorResponse_File::release_insertion_point() {
+  // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+  clear_has_insertion_point();
+  return insertion_point_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse_File::set_allocated_insertion_point(::std::string* insertion_point) {
+  if (insertion_point != NULL) {
+    set_has_insertion_point();
+  } else {
+    clear_has_insertion_point();
+  }
+  insertion_point_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), insertion_point);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
+}
+
+// optional string content = 15;
+bool CodeGeneratorResponse_File::has_content() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void CodeGeneratorResponse_File::set_has_content() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void CodeGeneratorResponse_File::clear_has_content() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void CodeGeneratorResponse_File::clear_content() {
+  content_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_content();
+}
+ const ::std::string& CodeGeneratorResponse_File::content() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+  return content_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse_File::set_content(const ::std::string& value) {
+  set_has_content();
+  content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+}
+ void CodeGeneratorResponse_File::set_content(const char* value) {
+  set_has_content();
+  content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+}
+ void CodeGeneratorResponse_File::set_content(const char* value, size_t size) {
+  set_has_content();
+  content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+}
+ ::std::string* CodeGeneratorResponse_File::mutable_content() {
+  set_has_content();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+  return content_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* CodeGeneratorResponse_File::release_content() {
+  // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+  clear_has_content();
+  return content_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse_File::set_allocated_content(::std::string* content) {
+  if (content != NULL) {
+    set_has_content();
+  } else {
+    clear_has_content();
+  }
+  content_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), content);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.File.content)
+}
+
+// -------------------------------------------------------------------
+
+// CodeGeneratorResponse
+
+// optional string error = 1;
+bool CodeGeneratorResponse::has_error() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void CodeGeneratorResponse::set_has_error() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void CodeGeneratorResponse::clear_has_error() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void CodeGeneratorResponse::clear_error() {
+  error_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_error();
+}
+ const ::std::string& CodeGeneratorResponse::error() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.error)
+  return error_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse::set_error(const ::std::string& value) {
+  set_has_error();
+  error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.error)
+}
+ void CodeGeneratorResponse::set_error(const char* value) {
+  set_has_error();
+  error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.error)
+}
+ void CodeGeneratorResponse::set_error(const char* value, size_t size) {
+  set_has_error();
+  error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.error)
+}
+ ::std::string* CodeGeneratorResponse::mutable_error() {
+  set_has_error();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.error)
+  return error_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* CodeGeneratorResponse::release_error() {
+  // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.error)
+  clear_has_error();
+  return error_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void CodeGeneratorResponse::set_allocated_error(::std::string* error) {
+  if (error != NULL) {
+    set_has_error();
+  } else {
+    clear_has_error();
+  }
+  error_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), error);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.error)
+}
+
+// repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
+int CodeGeneratorResponse::file_size() const {
+  return file_.size();
+}
+void CodeGeneratorResponse::clear_file() {
+  file_.Clear();
+}
+const ::google::protobuf::compiler::CodeGeneratorResponse_File& CodeGeneratorResponse::file(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.file)
+  return file_.Get(index);
+}
+::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::mutable_file(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.file)
+  return file_.Mutable(index);
+}
+::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::add_file() {
+  // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorResponse.file)
+  return file_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >*
+CodeGeneratorResponse::mutable_file() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.compiler.CodeGeneratorResponse.file)
+  return &file_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >&
+CodeGeneratorResponse::file() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.compiler.CodeGeneratorResponse.file)
+  return file_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace compiler
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/compiler/plugin.pb.h b/src/google/protobuf/compiler/plugin.pb.h
index ef1cfb9..510202f 100644
--- a/src/google/protobuf/compiler/plugin.pb.h
+++ b/src/google/protobuf/compiler/plugin.pb.h
@@ -8,235 +8,44 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/descriptor.pb.h>
 // @@protoc_insertion_point(includes)
-#ifdef major
-#undef major
-#endif
-#ifdef minor
-#undef minor
-#endif
 
-namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOC_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[4];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOC_EXPORT AddDescriptors();
-void LIBPROTOC_EXPORT InitDefaultsVersionImpl();
-void LIBPROTOC_EXPORT InitDefaultsVersion();
-void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorRequestImpl();
-void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorRequest();
-void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponse_FileImpl();
-void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponse_File();
-void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponseImpl();
-void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponse();
-inline void LIBPROTOC_EXPORT InitDefaults() {
-  InitDefaultsVersion();
-  InitDefaultsCodeGeneratorRequest();
-  InitDefaultsCodeGeneratorResponse_File();
-  InitDefaultsCodeGeneratorResponse();
-}
-}  // namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto
 namespace google {
 namespace protobuf {
 namespace compiler {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+
 class CodeGeneratorRequest;
-class CodeGeneratorRequestDefaultTypeInternal;
-LIBPROTOC_EXPORT extern CodeGeneratorRequestDefaultTypeInternal _CodeGeneratorRequest_default_instance_;
 class CodeGeneratorResponse;
-class CodeGeneratorResponseDefaultTypeInternal;
-LIBPROTOC_EXPORT extern CodeGeneratorResponseDefaultTypeInternal _CodeGeneratorResponse_default_instance_;
 class CodeGeneratorResponse_File;
-class CodeGeneratorResponse_FileDefaultTypeInternal;
-LIBPROTOC_EXPORT extern CodeGeneratorResponse_FileDefaultTypeInternal _CodeGeneratorResponse_File_default_instance_;
-class Version;
-class VersionDefaultTypeInternal;
-LIBPROTOC_EXPORT extern VersionDefaultTypeInternal _Version_default_instance_;
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
-namespace compiler {
 
 // ===================================================================
 
-class LIBPROTOC_EXPORT Version : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.Version) */ {
- public:
-  Version();
-  virtual ~Version();
-
-  Version(const Version& from);
-
-  inline Version& operator=(const Version& from) {
-    CopyFrom(from);
-    return *this;
-  }
-  #if LANG_CXX11
-  Version(Version&& from) noexcept
-    : Version() {
-    *this = ::std::move(from);
-  }
-
-  inline Version& operator=(Version&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields();
-  }
-  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields();
-  }
-
-  static const ::google::protobuf::Descriptor* descriptor();
-  static const Version& default_instance();
-
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Version* internal_default_instance() {
-    return reinterpret_cast<const Version*>(
-               &_Version_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
-  void Swap(Version* other);
-  friend void swap(Version& a, Version& b) {
-    a.Swap(&b);
-  }
-
-  // implements Message ----------------------------------------------
-
-  inline Version* New() const PROTOBUF_FINAL { return New(NULL); }
-
-  Version* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void CopyFrom(const Version& from);
-  void MergeFrom(const Version& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
-
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
-  bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
-  void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
-  private:
-  void SharedCtor();
-  void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
-  void InternalSwap(Version* other);
-  private:
-  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
-  }
-  inline void* MaybeArenaPtr() const {
-    return NULL;
-  }
-  public:
-
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
-
-  // nested types ----------------------------------------------------
-
-  // accessors -------------------------------------------------------
-
-  // optional string suffix = 4;
-  bool has_suffix() const;
-  void clear_suffix();
-  static const int kSuffixFieldNumber = 4;
-  const ::std::string& suffix() const;
-  void set_suffix(const ::std::string& value);
-  #if LANG_CXX11
-  void set_suffix(::std::string&& value);
-  #endif
-  void set_suffix(const char* value);
-  void set_suffix(const char* value, size_t size);
-  ::std::string* mutable_suffix();
-  ::std::string* release_suffix();
-  void set_allocated_suffix(::std::string* suffix);
-
-  // optional int32 major = 1;
-  bool has_major() const;
-  void clear_major();
-  static const int kMajorFieldNumber = 1;
-  ::google::protobuf::int32 major() const;
-  void set_major(::google::protobuf::int32 value);
-
-  // optional int32 minor = 2;
-  bool has_minor() const;
-  void clear_minor();
-  static const int kMinorFieldNumber = 2;
-  ::google::protobuf::int32 minor() const;
-  void set_minor(::google::protobuf::int32 value);
-
-  // optional int32 patch = 3;
-  bool has_patch() const;
-  void clear_patch();
-  static const int kPatchFieldNumber = 3;
-  ::google::protobuf::int32 patch() const;
-  void set_patch(::google::protobuf::int32 value);
-
-  // @@protoc_insertion_point(class_scope:google.protobuf.compiler.Version)
- private:
-  void set_has_major();
-  void clear_has_major();
-  void set_has_minor();
-  void clear_has_minor();
-  void set_has_patch();
-  void clear_has_patch();
-  void set_has_suffix();
-  void clear_has_suffix();
-
-  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
-  mutable int _cached_size_;
-  ::google::protobuf::internal::ArenaStringPtr suffix_;
-  ::google::protobuf::int32 major_;
-  ::google::protobuf::int32 minor_;
-  ::google::protobuf::int32 patch_;
-  friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersionImpl();
-};
-// -------------------------------------------------------------------
-
-class LIBPROTOC_EXPORT CodeGeneratorRequest : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorRequest) */ {
+class LIBPROTOC_EXPORT CodeGeneratorRequest : public ::google::protobuf::Message {
  public:
   CodeGeneratorRequest();
   virtual ~CodeGeneratorRequest();
@@ -247,24 +56,11 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  CodeGeneratorRequest(CodeGeneratorRequest&& from) noexcept
-    : CodeGeneratorRequest() {
-    *this = ::std::move(from);
-  }
 
-  inline CodeGeneratorRequest& operator=(CodeGeneratorRequest&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
@@ -272,54 +68,42 @@
   static const ::google::protobuf::Descriptor* descriptor();
   static const CodeGeneratorRequest& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const CodeGeneratorRequest* internal_default_instance() {
-    return reinterpret_cast<const CodeGeneratorRequest*>(
-               &_CodeGeneratorRequest_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    1;
-
   void Swap(CodeGeneratorRequest* other);
-  friend void swap(CodeGeneratorRequest& a, CodeGeneratorRequest& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline CodeGeneratorRequest* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline CodeGeneratorRequest* New() const { return New(NULL); }
 
-  CodeGeneratorRequest* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  CodeGeneratorRequest* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const CodeGeneratorRequest& from);
   void MergeFrom(const CodeGeneratorRequest& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(CodeGeneratorRequest* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -332,21 +116,27 @@
   const ::std::string& file_to_generate(int index) const;
   ::std::string* mutable_file_to_generate(int index);
   void set_file_to_generate(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_file_to_generate(int index, ::std::string&& value);
-  #endif
   void set_file_to_generate(int index, const char* value);
   void set_file_to_generate(int index, const char* value, size_t size);
   ::std::string* add_file_to_generate();
   void add_file_to_generate(const ::std::string& value);
-  #if LANG_CXX11
-  void add_file_to_generate(::std::string&& value);
-  #endif
   void add_file_to_generate(const char* value);
   void add_file_to_generate(const char* value, size_t size);
   const ::google::protobuf::RepeatedPtrField< ::std::string>& file_to_generate() const;
   ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_file_to_generate();
 
+  // optional string parameter = 2;
+  bool has_parameter() const;
+  void clear_parameter();
+  static const int kParameterFieldNumber = 2;
+  const ::std::string& parameter() const;
+  void set_parameter(const ::std::string& value);
+  void set_parameter(const char* value);
+  void set_parameter(const char* value, size_t size);
+  ::std::string* mutable_parameter();
+  ::std::string* release_parameter();
+  void set_allocated_parameter(::std::string* parameter);
+
   // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
   int proto_file_size() const;
   void clear_proto_file();
@@ -359,50 +149,27 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&
       proto_file() const;
 
-  // optional string parameter = 2;
-  bool has_parameter() const;
-  void clear_parameter();
-  static const int kParameterFieldNumber = 2;
-  const ::std::string& parameter() const;
-  void set_parameter(const ::std::string& value);
-  #if LANG_CXX11
-  void set_parameter(::std::string&& value);
-  #endif
-  void set_parameter(const char* value);
-  void set_parameter(const char* value, size_t size);
-  ::std::string* mutable_parameter();
-  ::std::string* release_parameter();
-  void set_allocated_parameter(::std::string* parameter);
-
-  // optional .google.protobuf.compiler.Version compiler_version = 3;
-  bool has_compiler_version() const;
-  void clear_compiler_version();
-  static const int kCompilerVersionFieldNumber = 3;
-  const ::google::protobuf::compiler::Version& compiler_version() const;
-  ::google::protobuf::compiler::Version* release_compiler_version();
-  ::google::protobuf::compiler::Version* mutable_compiler_version();
-  void set_allocated_compiler_version(::google::protobuf::compiler::Version* compiler_version);
-
   // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest)
  private:
-  void set_has_parameter();
-  void clear_has_parameter();
-  void set_has_compiler_version();
-  void clear_has_compiler_version();
+  inline void set_has_parameter();
+  inline void clear_has_parameter();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::std::string> file_to_generate_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > proto_file_;
   ::google::protobuf::internal::ArenaStringPtr parameter_;
-  ::google::protobuf::compiler::Version* compiler_version_;
-  friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorRequestImpl();
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > proto_file_;
+  friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+
+  void InitAsDefaultInstance();
+  static CodeGeneratorRequest* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOC_EXPORT CodeGeneratorResponse_File : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorResponse.File) */ {
+class LIBPROTOC_EXPORT CodeGeneratorResponse_File : public ::google::protobuf::Message {
  public:
   CodeGeneratorResponse_File();
   virtual ~CodeGeneratorResponse_File();
@@ -413,24 +180,11 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  CodeGeneratorResponse_File(CodeGeneratorResponse_File&& from) noexcept
-    : CodeGeneratorResponse_File() {
-    *this = ::std::move(from);
-  }
 
-  inline CodeGeneratorResponse_File& operator=(CodeGeneratorResponse_File&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
@@ -438,54 +192,42 @@
   static const ::google::protobuf::Descriptor* descriptor();
   static const CodeGeneratorResponse_File& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const CodeGeneratorResponse_File* internal_default_instance() {
-    return reinterpret_cast<const CodeGeneratorResponse_File*>(
-               &_CodeGeneratorResponse_File_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    2;
-
   void Swap(CodeGeneratorResponse_File* other);
-  friend void swap(CodeGeneratorResponse_File& a, CodeGeneratorResponse_File& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline CodeGeneratorResponse_File* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline CodeGeneratorResponse_File* New() const { return New(NULL); }
 
-  CodeGeneratorResponse_File* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  CodeGeneratorResponse_File* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const CodeGeneratorResponse_File& from);
   void MergeFrom(const CodeGeneratorResponse_File& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(CodeGeneratorResponse_File* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -497,9 +239,6 @@
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
@@ -512,9 +251,6 @@
   static const int kInsertionPointFieldNumber = 2;
   const ::std::string& insertion_point() const;
   void set_insertion_point(const ::std::string& value);
-  #if LANG_CXX11
-  void set_insertion_point(::std::string&& value);
-  #endif
   void set_insertion_point(const char* value);
   void set_insertion_point(const char* value, size_t size);
   ::std::string* mutable_insertion_point();
@@ -527,9 +263,6 @@
   static const int kContentFieldNumber = 15;
   const ::std::string& content() const;
   void set_content(const ::std::string& value);
-  #if LANG_CXX11
-  void set_content(::std::string&& value);
-  #endif
   void set_content(const char* value);
   void set_content(const char* value, size_t size);
   ::std::string* mutable_content();
@@ -538,25 +271,29 @@
 
   // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_insertion_point();
-  void clear_has_insertion_point();
-  void set_has_content();
-  void clear_has_content();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_insertion_point();
+  inline void clear_has_insertion_point();
+  inline void set_has_content();
+  inline void clear_has_content();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::internal::ArenaStringPtr insertion_point_;
   ::google::protobuf::internal::ArenaStringPtr content_;
-  friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_FileImpl();
+  friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+
+  void InitAsDefaultInstance();
+  static CodeGeneratorResponse_File* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOC_EXPORT CodeGeneratorResponse : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorResponse) */ {
+class LIBPROTOC_EXPORT CodeGeneratorResponse : public ::google::protobuf::Message {
  public:
   CodeGeneratorResponse();
   virtual ~CodeGeneratorResponse();
@@ -567,24 +304,11 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  CodeGeneratorResponse(CodeGeneratorResponse&& from) noexcept
-    : CodeGeneratorResponse() {
-    *this = ::std::move(from);
-  }
 
-  inline CodeGeneratorResponse& operator=(CodeGeneratorResponse&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
@@ -592,54 +316,42 @@
   static const ::google::protobuf::Descriptor* descriptor();
   static const CodeGeneratorResponse& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const CodeGeneratorResponse* internal_default_instance() {
-    return reinterpret_cast<const CodeGeneratorResponse*>(
-               &_CodeGeneratorResponse_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    3;
-
   void Swap(CodeGeneratorResponse* other);
-  friend void swap(CodeGeneratorResponse& a, CodeGeneratorResponse& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline CodeGeneratorResponse* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline CodeGeneratorResponse* New() const { return New(NULL); }
 
-  CodeGeneratorResponse* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  CodeGeneratorResponse* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const CodeGeneratorResponse& from);
   void MergeFrom(const CodeGeneratorResponse& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(CodeGeneratorResponse* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -647,6 +359,18 @@
 
   // accessors -------------------------------------------------------
 
+  // optional string error = 1;
+  bool has_error() const;
+  void clear_error();
+  static const int kErrorFieldNumber = 1;
+  const ::std::string& error() const;
+  void set_error(const ::std::string& value);
+  void set_error(const char* value);
+  void set_error(const char* value, size_t size);
+  ::std::string* mutable_error();
+  ::std::string* release_error();
+  void set_allocated_error(::std::string* error);
+
   // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
   int file_size() const;
   void clear_file();
@@ -659,182 +383,29 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >&
       file() const;
 
-  // optional string error = 1;
-  bool has_error() const;
-  void clear_error();
-  static const int kErrorFieldNumber = 1;
-  const ::std::string& error() const;
-  void set_error(const ::std::string& value);
-  #if LANG_CXX11
-  void set_error(::std::string&& value);
-  #endif
-  void set_error(const char* value);
-  void set_error(const char* value, size_t size);
-  ::std::string* mutable_error();
-  ::std::string* release_error();
-  void set_allocated_error(::std::string* error);
-
   // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse)
  private:
-  void set_has_error();
-  void clear_has_error();
+  inline void set_has_error();
+  inline void clear_has_error();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File > file_;
   ::google::protobuf::internal::ArenaStringPtr error_;
-  friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponseImpl();
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File > file_;
+  friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();
+
+  void InitAsDefaultInstance();
+  static CodeGeneratorResponse* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
-// Version
-
-// optional int32 major = 1;
-inline bool Version::has_major() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void Version::set_has_major() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void Version::clear_has_major() {
-  _has_bits_[0] &= ~0x00000002u;
-}
-inline void Version::clear_major() {
-  major_ = 0;
-  clear_has_major();
-}
-inline ::google::protobuf::int32 Version::major() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.major)
-  return major_;
-}
-inline void Version::set_major(::google::protobuf::int32 value) {
-  set_has_major();
-  major_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.major)
-}
-
-// optional int32 minor = 2;
-inline bool Version::has_minor() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
-}
-inline void Version::set_has_minor() {
-  _has_bits_[0] |= 0x00000004u;
-}
-inline void Version::clear_has_minor() {
-  _has_bits_[0] &= ~0x00000004u;
-}
-inline void Version::clear_minor() {
-  minor_ = 0;
-  clear_has_minor();
-}
-inline ::google::protobuf::int32 Version::minor() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.minor)
-  return minor_;
-}
-inline void Version::set_minor(::google::protobuf::int32 value) {
-  set_has_minor();
-  minor_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.minor)
-}
-
-// optional int32 patch = 3;
-inline bool Version::has_patch() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
-}
-inline void Version::set_has_patch() {
-  _has_bits_[0] |= 0x00000008u;
-}
-inline void Version::clear_has_patch() {
-  _has_bits_[0] &= ~0x00000008u;
-}
-inline void Version::clear_patch() {
-  patch_ = 0;
-  clear_has_patch();
-}
-inline ::google::protobuf::int32 Version::patch() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.patch)
-  return patch_;
-}
-inline void Version::set_patch(::google::protobuf::int32 value) {
-  set_has_patch();
-  patch_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.patch)
-}
-
-// optional string suffix = 4;
-inline bool Version::has_suffix() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
-}
-inline void Version::set_has_suffix() {
-  _has_bits_[0] |= 0x00000001u;
-}
-inline void Version::clear_has_suffix() {
-  _has_bits_[0] &= ~0x00000001u;
-}
-inline void Version::clear_suffix() {
-  suffix_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  clear_has_suffix();
-}
-inline const ::std::string& Version::suffix() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.suffix)
-  return suffix_.GetNoArena();
-}
-inline void Version::set_suffix(const ::std::string& value) {
-  set_has_suffix();
-  suffix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
-  // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.suffix)
-}
-#if LANG_CXX11
-inline void Version::set_suffix(::std::string&& value) {
-  set_has_suffix();
-  suffix_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.Version.suffix)
-}
-#endif
-inline void Version::set_suffix(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
-  set_has_suffix();
-  suffix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
-  // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.Version.suffix)
-}
-inline void Version::set_suffix(const char* value, size_t size) {
-  set_has_suffix();
-  suffix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      ::std::string(reinterpret_cast<const char*>(value), size));
-  // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.Version.suffix)
-}
-inline ::std::string* Version::mutable_suffix() {
-  set_has_suffix();
-  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.Version.suffix)
-  return suffix_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-}
-inline ::std::string* Version::release_suffix() {
-  // @@protoc_insertion_point(field_release:google.protobuf.compiler.Version.suffix)
-  clear_has_suffix();
-  return suffix_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-}
-inline void Version::set_allocated_suffix(::std::string* suffix) {
-  if (suffix != NULL) {
-    set_has_suffix();
-  } else {
-    clear_has_suffix();
-  }
-  suffix_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), suffix);
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.Version.suffix)
-}
-
-// -------------------------------------------------------------------
-
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // CodeGeneratorRequest
 
 // repeated string file_to_generate = 1;
@@ -856,14 +427,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
   file_to_generate_.Mutable(index)->assign(value);
 }
-#if LANG_CXX11
-inline void CodeGeneratorRequest::set_file_to_generate(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
-  file_to_generate_.Mutable(index)->assign(std::move(value));
-}
-#endif
 inline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   file_to_generate_.Mutable(index)->assign(value);
   // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
 }
@@ -880,14 +444,7 @@
   file_to_generate_.Add()->assign(value);
   // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
 }
-#if LANG_CXX11
-inline void CodeGeneratorRequest::add_file_to_generate(::std::string&& value) {
-  file_to_generate_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
-}
-#endif
 inline void CodeGeneratorRequest::add_file_to_generate(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   file_to_generate_.Add()->assign(value);
   // @@protoc_insertion_point(field_add_char:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
 }
@@ -908,13 +465,13 @@
 
 // optional string parameter = 2;
 inline bool CodeGeneratorRequest::has_parameter() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
+  return (_has_bits_[0] & 0x00000002u) != 0;
 }
 inline void CodeGeneratorRequest::set_has_parameter() {
-  _has_bits_[0] |= 0x00000001u;
+  _has_bits_[0] |= 0x00000002u;
 }
 inline void CodeGeneratorRequest::clear_has_parameter() {
-  _has_bits_[0] &= ~0x00000001u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline void CodeGeneratorRequest::clear_parameter() {
   parameter_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
@@ -922,23 +479,14 @@
 }
 inline const ::std::string& CodeGeneratorRequest::parameter() const {
   // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.parameter)
-  return parameter_.GetNoArena();
+  return parameter_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void CodeGeneratorRequest::set_parameter(const ::std::string& value) {
   set_has_parameter();
   parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.parameter)
 }
-#if LANG_CXX11
-inline void CodeGeneratorRequest::set_parameter(::std::string&& value) {
-  set_has_parameter();
-  parameter_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorRequest.parameter)
-}
-#endif
 inline void CodeGeneratorRequest::set_parameter(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_parameter();
   parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorRequest.parameter)
@@ -973,6 +521,9 @@
 inline int CodeGeneratorRequest::proto_file_size() const {
   return proto_file_.size();
 }
+inline void CodeGeneratorRequest::clear_proto_file() {
+  proto_file_.Clear();
+}
 inline const ::google::protobuf::FileDescriptorProto& CodeGeneratorRequest::proto_file(int index) const {
   // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.proto_file)
   return proto_file_.Get(index);
@@ -996,60 +547,6 @@
   return proto_file_;
 }
 
-// optional .google.protobuf.compiler.Version compiler_version = 3;
-inline bool CodeGeneratorRequest::has_compiler_version() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void CodeGeneratorRequest::set_has_compiler_version() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void CodeGeneratorRequest::clear_has_compiler_version() {
-  _has_bits_[0] &= ~0x00000002u;
-}
-inline void CodeGeneratorRequest::clear_compiler_version() {
-  if (compiler_version_ != NULL) compiler_version_->Clear();
-  clear_has_compiler_version();
-}
-inline const ::google::protobuf::compiler::Version& CodeGeneratorRequest::compiler_version() const {
-  const ::google::protobuf::compiler::Version* p = compiler_version_;
-  // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.compiler_version)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::compiler::Version*>(
-      &::google::protobuf::compiler::_Version_default_instance_);
-}
-inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::release_compiler_version() {
-  // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorRequest.compiler_version)
-  clear_has_compiler_version();
-  ::google::protobuf::compiler::Version* temp = compiler_version_;
-  compiler_version_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::mutable_compiler_version() {
-  set_has_compiler_version();
-  if (compiler_version_ == NULL) {
-    compiler_version_ = new ::google::protobuf::compiler::Version;
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.compiler_version)
-  return compiler_version_;
-}
-inline void CodeGeneratorRequest::set_allocated_compiler_version(::google::protobuf::compiler::Version* compiler_version) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete compiler_version_;
-  }
-  if (compiler_version) {
-    ::google::protobuf::Arena* submessage_arena = NULL;
-    if (message_arena != submessage_arena) {
-      compiler_version = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, compiler_version, submessage_arena);
-    }
-    set_has_compiler_version();
-  } else {
-    clear_has_compiler_version();
-  }
-  compiler_version_ = compiler_version;
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorRequest.compiler_version)
-}
-
 // -------------------------------------------------------------------
 
 // CodeGeneratorResponse_File
@@ -1070,23 +567,14 @@
 }
 inline const ::std::string& CodeGeneratorResponse_File::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.name)
-  return name_.GetNoArena();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void CodeGeneratorResponse_File::set_name(const ::std::string& value) {
   set_has_name();
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.name)
 }
-#if LANG_CXX11
-inline void CodeGeneratorResponse_File::set_name(::std::string&& value) {
-  set_has_name();
-  name_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.File.name)
-}
-#endif
 inline void CodeGeneratorResponse_File::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
   name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.name)
@@ -1133,23 +621,14 @@
 }
 inline const ::std::string& CodeGeneratorResponse_File::insertion_point() const {
   // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
-  return insertion_point_.GetNoArena();
+  return insertion_point_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void CodeGeneratorResponse_File::set_insertion_point(const ::std::string& value) {
   set_has_insertion_point();
   insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
 }
-#if LANG_CXX11
-inline void CodeGeneratorResponse_File::set_insertion_point(::std::string&& value) {
-  set_has_insertion_point();
-  insertion_point_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
-}
-#endif
 inline void CodeGeneratorResponse_File::set_insertion_point(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_insertion_point();
   insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point)
@@ -1196,23 +675,14 @@
 }
 inline const ::std::string& CodeGeneratorResponse_File::content() const {
   // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.content)
-  return content_.GetNoArena();
+  return content_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void CodeGeneratorResponse_File::set_content(const ::std::string& value) {
   set_has_content();
   content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.content)
 }
-#if LANG_CXX11
-inline void CodeGeneratorResponse_File::set_content(::std::string&& value) {
-  set_has_content();
-  content_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.File.content)
-}
-#endif
 inline void CodeGeneratorResponse_File::set_content(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_content();
   content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.content)
@@ -1263,23 +733,14 @@
 }
 inline const ::std::string& CodeGeneratorResponse::error() const {
   // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.error)
-  return error_.GetNoArena();
+  return error_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void CodeGeneratorResponse::set_error(const ::std::string& value) {
   set_has_error();
   error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.error)
 }
-#if LANG_CXX11
-inline void CodeGeneratorResponse::set_error(::std::string&& value) {
-  set_has_error();
-  error_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.error)
-}
-#endif
 inline void CodeGeneratorResponse::set_error(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_error();
   error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.error)
@@ -1340,11 +801,7 @@
   return file_;
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
-// -------------------------------------------------------------------
-
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 // -------------------------------------------------------------------
 
 // -------------------------------------------------------------------
diff --git a/src/google/protobuf/compiler/plugin.proto b/src/google/protobuf/compiler/plugin.proto
index 5b55745..acaee1f 100644
--- a/src/google/protobuf/compiler/plugin.proto
+++ b/src/google/protobuf/compiler/plugin.proto
@@ -49,20 +49,10 @@
 option java_package = "com.google.protobuf.compiler";
 option java_outer_classname = "PluginProtos";
 
-option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go";
+option go_package = "plugin_go";
 
 import "google/protobuf/descriptor.proto";
 
-// The version number of protocol compiler.
-message Version {
-  optional int32 major = 1;
-  optional int32 minor = 2;
-  optional int32 patch = 3;
-  // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
-  // be empty for mainline stable releases.
-  optional string suffix = 4;
-}
-
 // An encoded CodeGeneratorRequest is written to the plugin's stdin.
 message CodeGeneratorRequest {
   // The .proto files that were explicitly listed on the command-line.  The
@@ -84,14 +74,7 @@
   // the entire set into memory at once.  However, as of this writing, this
   // is not similarly optimized on protoc's end -- it will store all fields in
   // memory at once before sending them to the plugin.
-  //
-  // Type names of fields and extensions in the FileDescriptorProto are always
-  // fully qualified.
   repeated FileDescriptorProto proto_file = 15;
-
-  // The version number of protocol compiler.
-  optional Version compiler_version = 3;
-
 }
 
 // The plugin writes an encoded CodeGeneratorResponse to stdout.
diff --git a/src/google/protobuf/compiler/python/python_generator.cc b/src/google/protobuf/compiler/python/python_generator.cc
index 5ca6b4e..0553dd0 100644
--- a/src/google/protobuf/compiler/python/python_generator.cc
+++ b/src/google/protobuf/compiler/python/python_generator.cc
@@ -44,7 +44,6 @@
 // performance-minded Python code leverage the fast C++ implementation
 // directly.
 
-#include <algorithm>
 #include <google/protobuf/stubs/hash.h>
 #include <limits>
 #include <map>
@@ -63,12 +62,11 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 
-
 namespace google {
 namespace protobuf {
 namespace compiler {
@@ -76,21 +74,12 @@
 
 namespace {
 
-// Reimplemented here because we can't bring in
-// absl/strings/string_view_utils.h because it needs C++11.
-bool StrStartsWith(StringPiece sp, StringPiece x) {
-  return sp.size() >= x.size() && sp.substr(0, x.size()) == x;
-}
-bool StrEndsWith(StringPiece sp, StringPiece x) {
-  return sp.size() >= x.size() && sp.substr(sp.size() - x.size()) == x;
-}
-
 // Returns a copy of |filename| with any trailing ".protodevel" or ".proto
 // suffix stripped.
 // TODO(robinson): Unify with copy in compiler/cpp/internal/helpers.cc.
 string StripProto(const string& filename) {
-  const char* suffix =
-      StrEndsWith(filename, ".protodevel") ? ".protodevel" : ".proto";
+  const char* suffix = HasSuffixString(filename, ".protodevel")
+      ? ".protodevel" : ".proto";
   return StripSuffixString(filename, suffix);
 }
 
@@ -98,8 +87,8 @@
 // Returns the Python module name expected for a given .proto filename.
 string ModuleName(const string& filename) {
   string basename = StripProto(filename);
-  ReplaceCharacters(&basename, "-", '_');
-  ReplaceCharacters(&basename, "/", '.');
+  StripString(&basename, "-", '_');
+  StripString(&basename, "/", '.');
   return basename + "_pb2";
 }
 
@@ -118,25 +107,20 @@
   return module_name;
 }
 
-// Keywords reserved by the Python language.
-const char* const kKeywords[] = {
-    "False",   "None",     "True",     "and",    "as",    "assert", "break",
-    "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",
-};
-const char* const* kKeywordsEnd =
-    kKeywords + (sizeof(kKeywords) / sizeof(kKeywords[0]));
 
-bool ContainsPythonKeyword(const string& module_name) {
-  std::vector<string> tokens = Split(module_name, ".");
-  for (int i = 0; i < tokens.size(); ++i) {
-    if (std::find(kKeywords, kKeywordsEnd, tokens[i]) != kKeywordsEnd) {
-      return true;
-    }
+// Returns an import statement of form "from X.Y.Z import T" for the given
+// .proto filename.
+string ModuleImportStatement(const string& filename) {
+  string module_name = ModuleName(filename);
+  int last_dot_pos = module_name.rfind('.');
+  if (last_dot_pos == string::npos) {
+    // NOTE(petya): this is not tested as it would require a protocol buffer
+    // outside of any package, and I don't think that is easily achievable.
+    return "import " + module_name;
+  } else {
+    return "from " + module_name.substr(0, last_dot_pos) + " import " +
+        module_name.substr(last_dot_pos + 1);
   }
-  return false;
 }
 
 
@@ -240,11 +224,11 @@
       return SimpleItoa(field.default_value_uint64());
     case FieldDescriptor::CPPTYPE_DOUBLE: {
       double value = field.default_value_double();
-      if (value == std::numeric_limits<double>::infinity()) {
+      if (value == numeric_limits<double>::infinity()) {
         // Python pre-2.6 on Windows does not parse "inf" correctly.  However,
         // a numeric literal that is too big for a double will become infinity.
         return "1e10000";
-      } else if (value == -std::numeric_limits<double>::infinity()) {
+      } else if (value == -numeric_limits<double>::infinity()) {
         // See above.
         return "-1e10000";
       } else if (value != value) {
@@ -256,11 +240,11 @@
     }
     case FieldDescriptor::CPPTYPE_FLOAT: {
       float value = field.default_value_float();
-      if (value == std::numeric_limits<float>::infinity()) {
+      if (value == numeric_limits<float>::infinity()) {
         // Python pre-2.6 on Windows does not parse "inf" correctly.  However,
         // a numeric literal that is too big for a double will become infinity.
         return "1e10000";
-      } else if (value == -std::numeric_limits<float>::infinity()) {
+      } else if (value == -numeric_limits<float>::infinity()) {
         // See above.
         return "-1e10000";
       } else if (value != value) {
@@ -330,7 +314,7 @@
   file_ = file;
   string module_name = ModuleName(file->name());
   string filename = module_name;
-  ReplaceCharacters(&filename, ".", '/');
+  StripString(&filename, ".", '/');
   filename += ".py";
 
   FileDescriptorProto fdp;
@@ -360,9 +344,7 @@
   // can only be successfully parsed after we register corresponding
   // extensions. Therefore we parse all options again here to recognize
   // custom options that may be unknown when we define the descriptors.
-  // This does not apply to services because they are not used by extensions.
   FixAllDescriptorOptions();
-  PrintServiceDescriptors();
   if (HasGenericServices(file)) {
     PrintServices();
   }
@@ -377,32 +359,10 @@
 void Generator::PrintImports() const {
   for (int i = 0; i < file_->dependency_count(); ++i) {
     const string& filename = file_->dependency(i)->name();
-
-    string module_name = ModuleName(filename);
+    string import_statement = ModuleImportStatement(filename);
     string module_alias = ModuleAlias(filename);
-    if (ContainsPythonKeyword(module_name)) {
-      // If the module path contains a Python keyword, we have to quote the
-      // module name and import it using importlib. Otherwise the usual kind of
-      // import statement would result in a syntax error from the presence of
-      // the keyword.
-      printer_->Print("import importlib\n");
-      printer_->Print("$alias$ = importlib.import_module('$name$')\n", "alias",
-                      module_alias, "name", module_name);
-    } else {
-      int last_dot_pos = module_name.rfind('.');
-      string import_statement;
-      if (last_dot_pos == string::npos) {
-        // NOTE(petya): this is not tested as it would require a protocol buffer
-        // outside of any package, and I don't think that is easily achievable.
-        import_statement = "import " + module_name;
-      } else {
-        import_statement = "from " + module_name.substr(0, last_dot_pos) +
-                           " import " + module_name.substr(last_dot_pos + 1);
-      }
-      printer_->Print("$statement$ as $alias$\n", "statement", import_statement,
-                      "alias", module_alias);
-    }
-
+    printer_->Print("$statement$ as $alias$\n", "statement",
+                    import_statement, "alias", module_alias);
     CopyPublicDependenciesAliases(module_alias, file_->dependency(i));
   }
   printer_->Print("\n");
@@ -417,7 +377,7 @@
 
 // Prints the single file descriptor for this file.
 void Generator::PrintFileDescriptor() const {
-  std::map<string, string> m;
+  map<string, string> m;
   m["descriptor_name"] = kDescriptorKey;
   m["name"] = file_->name();
   m["package"] = file_->package();
@@ -442,28 +402,21 @@
     }
     printer_->Print("]");
   }
-  if (file_->public_dependency_count() > 0) {
-    printer_->Print(",\npublic_dependencies=[");
-    for (int i = 0; i < file_->public_dependency_count(); ++i) {
-      string module_alias = ModuleAlias(file_->public_dependency(i)->name());
-      printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
-                      module_alias);
-    }
-    printer_->Print("]");
-  }
 
   // TODO(falk): Also print options and fix the message_type, enum_type,
   //             service and extension later in the generation.
 
   printer_->Outdent();
   printer_->Print(")\n");
+  printer_->Print("_sym_db.RegisterFileDescriptor($name$)\n", "name",
+                  kDescriptorKey);
   printer_->Print("\n");
 }
 
 // Prints descriptors and module-level constants for all top-level
 // enums defined in |file|.
 void Generator::PrintTopLevelEnums() const {
-  std::vector<std::pair<string, int> > top_level_enum_values;
+  vector<pair<string, int> > top_level_enum_values;
   for (int i = 0; i < file_->enum_type_count(); ++i) {
     const EnumDescriptor& enum_descriptor = *file_->enum_type(i);
     PrintEnum(enum_descriptor);
@@ -500,7 +453,7 @@
 // enum name to a Python EnumDescriptor object equivalent to
 // enum_descriptor.
 void Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const {
-  std::map<string, string> m;
+  map<string, string> m;
   string module_level_descriptor_name =
       ModuleLevelDescriptorName(enum_descriptor);
   m["descriptor_name"] = module_level_descriptor_name;
@@ -574,16 +527,9 @@
   }
 }
 
-void Generator::PrintServiceDescriptors() const {
-  for (int i = 0; i < file_->service_count(); ++i) {
-    PrintServiceDescriptor(*file_->service(i));
-    AddServiceToFileDescriptor(*file_->service(i));
-    printer_->Print("\n");
-  }
-}
-
 void Generator::PrintServices() const {
   for (int i = 0; i < file_->service_count(); ++i) {
+    PrintServiceDescriptor(*file_->service(i));
     PrintServiceClass(*file_->service(i));
     PrintServiceStub(*file_->service(i));
     printer_->Print("\n");
@@ -601,7 +547,7 @@
       "$service_name$ = _descriptor.ServiceDescriptor(\n",
       "service_name", service_name);
   printer_->Indent();
-  std::map<string, string> m;
+  map<string, string> m;
   m["name"] = descriptor.name();
   m["full_name"] = descriptor.full_name();
   m["file"] = kDescriptorKey;
@@ -647,10 +593,7 @@
   }
 
   printer_->Outdent();
-  printer_->Print("])\n");
-  printer_->Print("_sym_db.RegisterServiceDescriptor($name$)\n", "name",
-                  service_name);
-  printer_->Print("\n");
+  printer_->Print("])\n\n");
 }
 
 
@@ -700,7 +643,7 @@
                   "descriptor_name",
                   ModuleLevelDescriptorName(message_descriptor));
   printer_->Indent();
-  std::map<string, string> m;
+  map<string, string> m;
   m["name"] = message_descriptor.name();
   m["full_name"] = message_descriptor.full_name();
   m["file"] = kDescriptorKey;
@@ -760,22 +703,15 @@
   printer_->Indent();
   for (int i = 0; i < message_descriptor.oneof_decl_count(); ++i) {
     const OneofDescriptor* desc = message_descriptor.oneof_decl(i);
-    std::map<string, string> m;
+    map<string, string> m;
     m["name"] = desc->name();
     m["full_name"] = desc->full_name();
     m["index"] = SimpleItoa(desc->index());
-    string options_string =
-        OptionsValue("OneofOptions", desc->options().SerializeAsString());
-    if (options_string == "None") {
-      m["options"] = "";
-    } else {
-      m["options"] = ", options=" + options_string;
-    }
     printer_->Print(
         m,
         "_descriptor.OneofDescriptor(\n"
         "  name='$name$', full_name='$full_name$',\n"
-        "  index=$index$, containing_type=None, fields=[]$options$),\n");
+        "  index=$index$, containing_type=None, fields=[]),\n");
   }
   printer_->Outdent();
   printer_->Print("],\n");
@@ -801,7 +737,7 @@
 // Prints all messages in |file|.
 void Generator::PrintMessages() const {
   for (int i = 0; i < file_->message_type_count(); ++i) {
-    std::vector<string> to_register;
+    vector<string> to_register;
     PrintMessage(*file_->message_type(i), "", &to_register);
     for (int j = 0; j < to_register.size(); ++j) {
       printer_->Print("_sym_db.RegisterMessage($name$)\n", "name",
@@ -821,7 +757,7 @@
 // Collect nested message names to_register for the symbol_database.
 void Generator::PrintMessage(const Descriptor& message_descriptor,
                              const string& prefix,
-                             std::vector<string>* to_register) const {
+                             vector<string>* to_register) const {
   string qualified_name(prefix + message_descriptor.name());
   to_register->push_back(qualified_name);
   printer_->Print(
@@ -831,7 +767,7 @@
   printer_->Indent();
 
   PrintNestedMessages(message_descriptor, qualified_name + ".", to_register);
-  std::map<string, string> m;
+  map<string, string> m;
   m["descriptor_key"] = kDescriptorKey;
   m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor);
   printer_->Print(m, "$descriptor_key$ = $descriptor_name$,\n");
@@ -847,7 +783,7 @@
 // Mutually recursive with PrintMessage().
 void Generator::PrintNestedMessages(const Descriptor& containing_descriptor,
                                     const string& prefix,
-                                    std::vector<string>* to_register) const {
+                                    vector<string>* to_register) const {
   for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {
     printer_->Print("\n");
     PrintMessage(*containing_descriptor.nested_type(i), prefix, to_register);
@@ -880,7 +816,7 @@
     FixContainingTypeInDescriptor(enum_descriptor, &descriptor);
   }
   for (int i = 0; i < descriptor.oneof_decl_count(); ++i) {
-    std::map<string, string> m;
+    map<string, string> m;
     const OneofDescriptor* oneof = descriptor.oneof_decl(i);
     m["descriptor_name"] = ModuleLevelDescriptorName(descriptor);
     m["oneof_name"] = oneof->name();
@@ -899,7 +835,7 @@
 }
 
 void Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const {
-  std::map<string, string> m;
+  map<string, string> m;
   m["descriptor_name"] = kDescriptorKey;
   m["message_name"] = descriptor.name();
   m["message_descriptor_name"] = ModuleLevelDescriptorName(descriptor);
@@ -909,21 +845,9 @@
   printer_->Print(m, file_descriptor_template);
 }
 
-void Generator::AddServiceToFileDescriptor(
-    const ServiceDescriptor& descriptor) const {
-  std::map<string, string> m;
-  m["descriptor_name"] = kDescriptorKey;
-  m["service_name"] = descriptor.name();
-  m["service_descriptor_name"] = ModuleLevelServiceDescriptorName(descriptor);
-  const char file_descriptor_template[] =
-      "$descriptor_name$.services_by_name['$service_name$'] = "
-      "$service_descriptor_name$\n";
-  printer_->Print(m, file_descriptor_template);
-}
-
 void Generator::AddEnumToFileDescriptor(
     const EnumDescriptor& descriptor) const {
-  std::map<string, string> m;
+  map<string, string> m;
   m["descriptor_name"] = kDescriptorKey;
   m["enum_name"] = descriptor.name();
   m["enum_descriptor_name"] = ModuleLevelDescriptorName(descriptor);
@@ -935,7 +859,7 @@
 
 void Generator::AddExtensionToFileDescriptor(
     const FieldDescriptor& descriptor) const {
-  std::map<string, string> m;
+  map<string, string> m;
   m["descriptor_name"] = kDescriptorKey;
   m["field_name"] = descriptor.name();
   const char file_descriptor_template[] =
@@ -958,7 +882,7 @@
                                         const string& python_dict_name) const {
   const string field_referencing_expression = FieldReferencingExpression(
       containing_type, field, python_dict_name);
-  std::map<string, string> m;
+  map<string, string> m;
   m["field_ref"] = field_referencing_expression;
   const Descriptor* foreign_message_type = field.message_type();
   if (foreign_message_type) {
@@ -1031,10 +955,6 @@
   for (int i = 0; i < file_->extension_count(); ++i) {
     AddExtensionToFileDescriptor(*file_->extension(i));
   }
-  // TODO(jieluo): Move this register to PrintFileDescriptor() when
-  // FieldDescriptor.file is added in generated file.
-  printer_->Print("_sym_db.RegisterFileDescriptor($name$)\n", "name",
-                  kDescriptorKey);
   printer_->Print("\n");
 }
 
@@ -1061,7 +981,7 @@
   FixForeignFieldsInField(extension_field.extension_scope(), extension_field,
                           "extensions_by_name");
 
-  std::map<string, string> m;
+  map<string, string> m;
   // Confusingly, for FieldDescriptors that happen to be extensions,
   // containing_type() means "extended type."
   // On the other hand, extension_scope() will give us what we normally
@@ -1094,7 +1014,7 @@
   // More circular references.  ::sigh::
   string options_string;
   descriptor.options().SerializeToString(&options_string);
-  std::map<string, string> m;
+  map<string, string> m;
   m["name"] = descriptor.name();
   m["index"] = SimpleItoa(descriptor.index());
   m["number"] = SimpleItoa(descriptor.number());
@@ -1127,7 +1047,7 @@
     const FieldDescriptor& field, bool is_extension) const {
   string options_string;
   field.options().SerializeToString(&options_string);
-  std::map<string, string> m;
+  map<string, string> m;
   m["name"] = field.name();
   m["full_name"] = field.full_name();
   m["index"] = SimpleItoa(field.index());
@@ -1139,8 +1059,6 @@
   m["default_value"] = StringifyDefaultValue(field);
   m["is_extension"] = is_extension ? "True" : "False";
   m["options"] = OptionsValue("FieldOptions", options_string);
-  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()).
@@ -1151,7 +1069,7 @@
     "  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"
-    "  options=$options$$json_name$, file=DESCRIPTOR)";
+    "  options=$options$)";
   printer_->Print(m, field_descriptor_decl);
 }
 
@@ -1317,18 +1235,6 @@
   }
 }
 
-void Generator::FixOptionsForOneof(const OneofDescriptor& oneof) const {
-  string oneof_options = OptionsValue(
-      "OneofOptions", oneof.options().SerializeAsString());
-  if (oneof_options != "None") {
-    string oneof_name = strings::Substitute(
-        "$0.$1['$2']",
-        ModuleLevelDescriptorName(*oneof.containing_type()),
-        "oneofs_by_name", oneof.name());
-    PrintDescriptorOptionsFixingCode(oneof_name, oneof_options, printer_);
-  }
-}
-
 // Prints expressions that set the options for an enum descriptor and its
 // value descriptors.
 void Generator::FixOptionsForEnum(const EnumDescriptor& enum_descriptor) const {
@@ -1382,10 +1288,6 @@
   for (int i = 0; i < descriptor.nested_type_count(); ++i) {
     FixOptionsForMessage(*descriptor.nested_type(i));
   }
-  // Oneofs.
-  for (int i = 0; i < descriptor.oneof_decl_count(); ++i) {
-    FixOptionsForOneof(*descriptor.oneof_decl(i));
-  }
   // Enums.
   for (int i = 0; i < descriptor.enum_type_count(); ++i) {
     FixOptionsForEnum(*descriptor.enum_type(i));
@@ -1416,17 +1318,8 @@
 void Generator::CopyPublicDependenciesAliases(
     const string& copy_from, const FileDescriptor* file) const {
   for (int i = 0; i < file->public_dependency_count(); ++i) {
-    string module_name = ModuleName(file->public_dependency(i)->name());
     string module_alias = ModuleAlias(file->public_dependency(i)->name());
-    // 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,
+    printer_->Print("$alias$ = $copy_from$.$alias$\n", "alias", module_alias,
                     "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 2b5a028..aa0f5fc 100644
--- a/src/google/protobuf/compiler/python/python_generator.h
+++ b/src/google/protobuf/compiler/python/python_generator.h
@@ -48,7 +48,6 @@
 class EnumDescriptor;
 class EnumValueDescriptor;
 class FieldDescriptor;
-class OneofDescriptor;
 class ServiceDescriptor;
 
 namespace io { class Printer; }
@@ -97,10 +96,10 @@
 
   void PrintMessages() const;
   void PrintMessage(const Descriptor& message_descriptor, const string& prefix,
-                    std::vector<string>* to_register) const;
+                    vector<string>* to_register) const;
   void PrintNestedMessages(const Descriptor& containing_descriptor,
                            const string& prefix,
-                           std::vector<string>* to_register) const;
+                           vector<string>* to_register) const;
 
   void FixForeignFieldsInDescriptors() const;
   void FixForeignFieldsInDescriptor(
@@ -112,7 +111,6 @@
   void AddMessageToFileDescriptor(const Descriptor& descriptor) const;
   void AddEnumToFileDescriptor(const EnumDescriptor& descriptor) const;
   void AddExtensionToFileDescriptor(const FieldDescriptor& descriptor) const;
-  void AddServiceToFileDescriptor(const ServiceDescriptor& descriptor) const;
   string FieldReferencingExpression(const Descriptor* containing_type,
                                     const FieldDescriptor& field,
                                     const string& python_dict_name) const;
@@ -127,12 +125,11 @@
   void FixForeignFieldsInNestedExtensions(const Descriptor& descriptor) const;
 
   void PrintServices() const;
-  void PrintServiceDescriptors() const;
   void PrintServiceDescriptor(const ServiceDescriptor& descriptor) const;
   void PrintServiceClass(const ServiceDescriptor& descriptor) const;
   void PrintServiceStub(const ServiceDescriptor& descriptor) const;
   void PrintDescriptorKeyAndModuleName(
-      const ServiceDescriptor& descriptor) const;
+      const ServiceDescriptor& descriptor) const ;
 
   void PrintEnumValueDescriptor(const EnumValueDescriptor& descriptor) const;
   string OptionsValue(const string& class_name,
@@ -151,7 +148,6 @@
 
   void FixAllDescriptorOptions() const;
   void FixOptionsForField(const FieldDescriptor& field) const;
-  void FixOptionsForOneof(const OneofDescriptor& oneof) const;
   void FixOptionsForEnum(const EnumDescriptor& descriptor) const;
   void FixOptionsForMessage(const Descriptor& descriptor) const;
 
diff --git a/src/google/protobuf/compiler/python/python_plugin_unittest.cc b/src/google/protobuf/compiler/python/python_plugin_unittest.cc
index 34f857f..23f2449 100644
--- a/src/google/protobuf/compiler/python/python_plugin_unittest.cc
+++ b/src/google/protobuf/compiler/python/python_plugin_unittest.cc
@@ -46,7 +46,6 @@
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
-#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
@@ -116,53 +115,6 @@
   EXPECT_EQ(0, cli.Run(5, argv));
 }
 
-// This test verifies that the generated Python output uses regular imports (as
-// opposed to importlib) in the usual case where the .proto file paths do not
-// not contain any Python keywords.
-TEST(PythonPluginTest, ImportTest) {
-  // Create files test1.proto and test2.proto with the former importing the
-  // latter.
-  GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test1.proto",
-                             "syntax = \"proto3\";\n"
-                             "package foo;\n"
-                             "import \"test2.proto\";"
-                             "message Message1 {\n"
-                             "  Message2 message_2 = 1;\n"
-                             "}\n",
-                             true));
-  GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test2.proto",
-                             "syntax = \"proto3\";\n"
-                             "package foo;\n"
-                             "message Message2 {}\n",
-                             true));
-
-  google::protobuf::compiler::CommandLineInterface cli;
-  cli.SetInputsAreProtoPathRelative(true);
-  python::Generator python_generator;
-  cli.RegisterGenerator("--python_out", &python_generator, "");
-  string proto_path = "-I" + TestTempDir();
-  string python_out = "--python_out=" + TestTempDir();
-  const char* argv[] = {"protoc", proto_path.c_str(), "-I.", python_out.c_str(),
-                        "test1.proto"};
-  ASSERT_EQ(0, cli.Run(5, argv));
-
-  // Loop over the lines of the generated code and verify that we find an
-  // ordinary Python import but do not find the string "importlib".
-  string output;
-  GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/test1_pb2.py", &output,
-                             true));
-  std::vector<string> lines = Split(output, "\n");
-  string expected_import = "import test2_pb2";
-  bool found_expected_import = false;
-  for (int i = 0; i < lines.size(); ++i) {
-    if (lines[i].find(expected_import) != string::npos) {
-      found_expected_import = true;
-    }
-    EXPECT_EQ(string::npos, lines[i].find("importlib"));
-  }
-  EXPECT_TRUE(found_expected_import);
-}
-
 }  // namespace
 }  // namespace python
 }  // namespace compiler
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_code_pb.rb b/src/google/protobuf/compiler/ruby/ruby_generated_code.rb
similarity index 100%
rename from src/google/protobuf/compiler/ruby/ruby_generated_code_pb.rb
rename to src/google/protobuf/compiler/ruby/ruby_generated_code.rb
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator.cc b/src/google/protobuf/compiler/ruby/ruby_generator.cc
index fbe3b4c..92c76fb 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator.cc
+++ b/src/google/protobuf/compiler/ruby/ruby_generator.cc
@@ -48,7 +48,7 @@
 
 // Forward decls.
 std::string IntToString(int32 value);
-std::string GetRequireName(const std::string& proto_file);
+std::string StripDotProto(const std::string& proto_file);
 std::string LabelForField(google::protobuf::FieldDescriptor* field);
 std::string TypeName(google::protobuf::FieldDescriptor* field);
 void GenerateMessage(const google::protobuf::Descriptor* message,
@@ -70,13 +70,13 @@
   return os.str();
 }
 
-std::string GetRequireName(const std::string& proto_file) {
+std::string StripDotProto(const std::string& proto_file) {
   int lastindex = proto_file.find_last_of(".");
-  return proto_file.substr(0, lastindex) + "_pb";
+  return proto_file.substr(0, lastindex);
 }
 
 std::string GetOutputFilename(const std::string& proto_file) {
-  return GetRequireName(proto_file) + ".rb";
+  return StripDotProto(proto_file) + ".rb";
 }
 
 std::string LabelForField(const google::protobuf::FieldDescriptor* field) {
@@ -237,52 +237,15 @@
     "end\n");
 }
 
-// Locale-agnostic utility functions.
-bool IsLower(char ch) { return ch >= 'a' && ch <= 'z'; }
-
-bool IsUpper(char ch) { return ch >= 'A' && ch <= 'Z'; }
-
-bool IsAlpha(char ch) { return IsLower(ch) || IsUpper(ch); }
-
-char ToUpper(char ch) { return IsLower(ch) ? (ch - 'a' + 'A') : ch; }
-
-
-// Package names in protobuf are snake_case by convention, but Ruby module
-// names must be PascalCased.
-//
-//   foo_bar_baz -> FooBarBaz
-std::string PackageToModule(const std::string& name) {
-  bool next_upper = true;
-  std::string result;
-  result.reserve(name.size());
-
-  for (int i = 0; i < name.size(); i++) {
-    if (name[i] == '_') {
-      next_upper = true;
-    } else {
-      if (next_upper) {
-        result.push_back(ToUpper(name[i]));
-      } else {
-        result.push_back(name[i]);
-      }
-      next_upper = false;
-    }
-  }
-
-  return result;
-}
-
-// Class and enum names in protobuf should be PascalCased by convention, but
-// since there is nothing enforcing this we need to ensure that they are valid
-// Ruby constants.  That mainly means making sure that the first character is
-// an upper-case letter.
+// Module names, class names, and enum value names need to be Ruby constants,
+// which must start with a capital letter.
 std::string RubifyConstant(const std::string& name) {
   std::string ret = name;
   if (!ret.empty()) {
-    if (IsLower(ret[0])) {
+    if (ret[0] >= 'a' && ret[0] <= 'z') {
       // If it starts with a lowercase letter, capitalize it.
-      ret[0] = ToUpper(ret[0]);
-    } else if (!IsAlpha(ret[0])) {
+      ret[0] = ret[0] - 'a' + 'A';
+    } else if (ret[0] < 'A' || ret[0] > 'Z') {
       // Otherwise (e.g. if it begins with an underscore), we need to come up
       // with some prefix that starts with a capital letter. We could be smarter
       // here, e.g. try to strip leading underscores, but this may cause other
@@ -291,7 +254,6 @@
       ret = "PB_" + ret;
     }
   }
-
   return ret;
 }
 
@@ -352,7 +314,7 @@
       component = package_name.substr(0, dot_index);
       package_name = package_name.substr(dot_index + 1);
     }
-    component = PackageToModule(component);
+    component = RubifyConstant(component);
     printer->Print(
       "module $name$\n",
       "name", component);
@@ -429,7 +391,7 @@
     return true;
   } else {
     printer->Print(
-      "require '$name$'\n", "name", GetRequireName(import->name()));
+      "require '$name$'\n", "name", StripDotProto(import->name()));
     return true;
   }
 }
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator.h b/src/google/protobuf/compiler/ruby/ruby_generator.h
index 8c1dfa2..75555c3 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator.h
+++ b/src/google/protobuf/compiler/ruby/ruby_generator.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Generates Ruby code for a given .proto file.
-
 #ifndef GOOGLE_PROTOBUF_COMPILER_RUBY_GENERATOR_H__
 #define GOOGLE_PROTOBUF_COMPILER_RUBY_GENERATOR_H__
 
@@ -42,10 +40,6 @@
 namespace compiler {
 namespace ruby {
 
-// CodeGenerator implementation for generated Ruby protocol buffer classes.
-// If you create your own protocol compiler binary and you want it to support
-// Ruby output, you can do so by registering an instance of this
-// CodeGenerator with the CommandLineInterface in your main() function.
 class LIBPROTOC_EXPORT Generator
     : public google::protobuf::compiler::CodeGenerator {
   virtual bool Generate(
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc b/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
index 1aabe8a..1b04cb3 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
+++ b/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
@@ -45,8 +45,22 @@
 namespace ruby {
 namespace {
 
-string FindRubyTestDir() {
-  return TestSourceDir() + "/google/protobuf/compiler/ruby";
+string FindRubyTestDir(const string& file) {
+  // Inspired by TestSourceDir() in src/google/protobuf/testing/googletest.cc.
+#ifndef GOOGLE_THIRD_PARTY_PROTOBUF
+  string prefix = ".";
+  while (!File::Exists(prefix + "/src/google/protobuf/compiler/ruby" + file)) {
+    if (!File::Exists(prefix)) {
+      GOOGLE_LOG(FATAL)
+          << "Could not find Ruby test directory. Please run tests from "
+             "somewhere within the protobuf source package.";
+    }
+    prefix += "/..";
+  }
+  return prefix + "/src/google/protobuf/compiler/ruby";
+#else
+  return "third_party/protobuf/src/google/protobuf/compiler/ruby";
+#endif  // GOOGLE_THIRD_PARTY_PROTOBUF
 }
 
 // This test is a simple golden-file test over the output of the Ruby code
@@ -57,7 +71,7 @@
 // extensions to the point where we can do this test in a more automated way.
 
 TEST(RubyGeneratorTest, GeneratorTest) {
-  string ruby_tests = FindRubyTestDir();
+  string ruby_tests = FindRubyTestDir("/ruby_generated_code.proto");
 
   google::protobuf::compiler::CommandLineInterface cli;
   cli.SetInputsAreProtoPathRelative(true);
@@ -91,12 +105,12 @@
   // Load the generated output and compare to the expected result.
   string output;
   GOOGLE_CHECK_OK(File::GetContents(
-      TestTempDir() + "/ruby_generated_code_pb.rb",
+      TestTempDir() + "/ruby_generated_code.rb",
       &output,
       true));
   string expected_output;
   GOOGLE_CHECK_OK(File::GetContents(
-      ruby_tests + "/ruby_generated_code_pb.rb",
+      ruby_tests + "/ruby_generated_code.rb",
       &expected_output,
       true));
   EXPECT_EQ(expected_output, output);
diff --git a/src/google/protobuf/compiler/subprocess.cc b/src/google/protobuf/compiler/subprocess.cc
index 2e5a89a..6e25866 100644
--- a/src/google/protobuf/compiler/subprocess.cc
+++ b/src/google/protobuf/compiler/subprocess.cc
@@ -33,7 +33,6 @@
 #include <google/protobuf/compiler/subprocess.h>
 
 #include <algorithm>
-#include <cstring>
 #include <iostream>
 
 #ifndef _WIN32
@@ -48,20 +47,11 @@
 #include <google/protobuf/message.h>
 #include <google/protobuf/stubs/substitute.h>
 
+
 namespace google {
 namespace protobuf {
 namespace compiler {
 
-namespace {
-char* portable_strdup(const char* s) {
-  char* ns = (char*) malloc(strlen(s) + 1);
-  if (ns != NULL) {
-    strcpy(ns, s);
-  }
-  return ns;
-}
-}  // namespace
-
 #ifdef _WIN32
 
 static void CloseHandleOrDie(HANDLE handle) {
@@ -125,7 +115,7 @@
   }
 
   // CreateProcess() mutates its second parameter.  WTF?
-  char* name_copy = portable_strdup(program.c_str());
+  char* name_copy = strdup(program.c_str());
 
   // Create the process.
   PROCESS_INFORMATION process_info;
@@ -271,11 +261,12 @@
   char* message;
 
   // WTF?
-  FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
-                     FORMAT_MESSAGE_IGNORE_INSERTS,
-                 NULL, error_code, 0,
-                 (LPSTR)&message,  // NOT A BUG!
-                 0, NULL);
+  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                FORMAT_MESSAGE_FROM_SYSTEM |
+                FORMAT_MESSAGE_IGNORE_INSERTS,
+                NULL, error_code, 0,
+                (LPTSTR)&message,  // NOT A BUG!
+                0, NULL);
 
   string result = message;
   LocalFree(message);
@@ -309,7 +300,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] = { strdup(program.c_str()), NULL };
 
   child_pid_ = fork();
   if (child_pid_ == -1) {
@@ -357,6 +348,7 @@
 
 bool Subprocess::Communicate(const Message& input, Message* output,
                              string* error) {
+
   GOOGLE_CHECK_NE(child_stdin_, -1) << "Must call Start() first.";
 
   // The "sighandler_t" typedef is GNU-specific, so define our own.
diff --git a/src/google/protobuf/compiler/subprocess.h b/src/google/protobuf/compiler/subprocess.h
index 9d980b0..2513863 100644
--- a/src/google/protobuf/compiler/subprocess.h
+++ b/src/google/protobuf/compiler/subprocess.h
@@ -44,6 +44,7 @@
 
 #include <string>
 
+
 namespace google {
 namespace protobuf {
 
diff --git a/src/google/protobuf/compiler/test_plugin.cc b/src/google/protobuf/compiler/test_plugin.cc
index c676ce8..4830fd7 100644
--- a/src/google/protobuf/compiler/test_plugin.cc
+++ b/src/google/protobuf/compiler/test_plugin.cc
@@ -37,6 +37,7 @@
 #include <stdlib.h>
 #include <google/protobuf/compiler/plugin.h>
 #include <google/protobuf/compiler/mock_code_generator.h>
+#include <google/protobuf/stubs/strutil.h>
 
 int main(int argc, char* argv[]) {
 #ifdef _MSC_VER
diff --git a/src/google/protobuf/compiler/zip_output_unittest.sh b/src/google/protobuf/compiler/zip_output_unittest.sh
index f859791..6fc7136 100755
--- a/src/google/protobuf/compiler/zip_output_unittest.sh
+++ b/src/google/protobuf/compiler/zip_output_unittest.sh
@@ -41,8 +41,6 @@
 
 TEST_TMPDIR=.
 PROTOC=./protoc
-JAR=jar
-UNZIP=unzip
 
 echo '
   syntax = "proto2";
@@ -59,9 +57,8 @@
     || fail 'protoc failed.'
 
 echo "Testing output to zip..."
-if $UNZIP -h > /dev/null; then
-  $UNZIP -t $TEST_TMPDIR/testzip.zip > $TEST_TMPDIR/testzip.list \
-    || fail 'unzip failed.'
+if unzip -h > /dev/null; then
+  unzip -t $TEST_TMPDIR/testzip.zip > $TEST_TMPDIR/testzip.list || fail 'unzip failed.'
 
   grep 'testing: testzip\.pb\.cc *OK$' $TEST_TMPDIR/testzip.list > /dev/null \
     || fail 'testzip.pb.cc not found in output zip.'
@@ -76,14 +73,8 @@
 fi
 
 echo "Testing output to jar..."
-if $JAR c $TEST_TMPDIR/testzip.proto > /dev/null; then
-  $JAR tf $TEST_TMPDIR/testzip.jar > $TEST_TMPDIR/testzip.list \
-    || fail 'jar failed.'
-
-  # Check that -interface.jar timestamps are normalized:
-  if [[ "$(TZ=UTC $JAR tvf $TEST_TMPDIR/testzip.jar)" != *'Tue Jan 01 00:00:00 UTC 1980'* ]]; then
-    fail 'Zip did not contain normalized timestamps'
-  fi
+if jar c $TEST_TMPDIR/testzip.proto > /dev/null; then
+  jar tf $TEST_TMPDIR/testzip.jar > $TEST_TMPDIR/testzip.list || fail 'jar failed.'
 
   grep '^test/jar/Foo\.java$' $TEST_TMPDIR/testzip.list > /dev/null \
     || fail 'Foo.java not found in output jar.'
diff --git a/src/google/protobuf/compiler/zip_writer.cc b/src/google/protobuf/compiler/zip_writer.cc
index 1799af6..458cced 100644
--- a/src/google/protobuf/compiler/zip_writer.cc
+++ b/src/google/protobuf/compiler/zip_writer.cc
@@ -70,10 +70,6 @@
 namespace protobuf {
 namespace compiler {
 
-// January 1, 1980 as a DOS date.
-// see https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
-static const uint16 kDosEpoch = 1 << 5 | 1;
-
 static const uint32 kCRC32Table[256] = {
   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
   0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
@@ -158,7 +154,7 @@
   WriteShort(&output, 0);  // flags
   WriteShort(&output, 0);  // compression method: stored
   WriteShort(&output, 0);  // last modified time
-  WriteShort(&output, kDosEpoch);  // last modified date
+  WriteShort(&output, 0);  // last modified date
   output.WriteLittleEndian32(info.crc32);  // crc-32
   output.WriteLittleEndian32(info.size);  // compressed size
   output.WriteLittleEndian32(info.size);  // uncompressed size
@@ -189,7 +185,7 @@
     WriteShort(&output, 0);  // flags
     WriteShort(&output, 0);  // compression method: stored
     WriteShort(&output, 0);  // last modified time
-    WriteShort(&output, kDosEpoch);  // last modified date
+    WriteShort(&output, 0);  // last modified date
     output.WriteLittleEndian32(crc32);  // crc-32
     output.WriteLittleEndian32(size);  // compressed size
     output.WriteLittleEndian32(size);  // uncompressed size
diff --git a/src/google/protobuf/compiler/zip_writer.h b/src/google/protobuf/compiler/zip_writer.h
index 03db4d5..602e508 100644
--- a/src/google/protobuf/compiler/zip_writer.h
+++ b/src/google/protobuf/compiler/zip_writer.h
@@ -85,7 +85,7 @@
   };
 
   io::ZeroCopyOutputStream* raw_output_;
-  std::vector<FileInfo> files_;
+  vector<FileInfo> files_;
 };
 
 }  // namespace compiler
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index 3f54b84..56e11fa 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/src/google/protobuf/descriptor.cc
@@ -44,108 +44,33 @@
 #include <algorithm>
 #include <limits>
 
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/descriptor_database.h>
+#include <google/protobuf/descriptor.pb.h>
+#include <google/protobuf/dynamic_message.h>
+#include <google/protobuf/generated_message_util.h>
+#include <google/protobuf/text_format.h>
+#include <google/protobuf/unknown_field_set.h>
+#include <google/protobuf/wire_format.h>
+#include <google/protobuf/io/strtod.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/tokenizer.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/mutex.h>
 #include <google/protobuf/stubs/once.h>
 #include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/strtod.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format.h>
 #include <google/protobuf/stubs/substitute.h>
-
 #include <google/protobuf/stubs/map_util.h>
 #include <google/protobuf/stubs/stl_util.h>
 
 #undef PACKAGE  // autoheader #defines this.  :(
 
 namespace google {
-
 namespace protobuf {
 
-struct Symbol {
-  enum Type {
-    NULL_SYMBOL,
-    MESSAGE,
-    FIELD,
-    ONEOF,
-    ENUM,
-    ENUM_VALUE,
-    SERVICE,
-    METHOD,
-    PACKAGE
-  };
-  Type type;
-  union {
-    const Descriptor* descriptor;
-    const FieldDescriptor* field_descriptor;
-    const OneofDescriptor* oneof_descriptor;
-    const EnumDescriptor* enum_descriptor;
-    const EnumValueDescriptor* enum_value_descriptor;
-    const ServiceDescriptor* service_descriptor;
-    const MethodDescriptor* method_descriptor;
-    const FileDescriptor* package_file_descriptor;
-  };
-
-  inline Symbol() : type(NULL_SYMBOL) { descriptor = NULL; }
-  inline bool IsNull() const { return type == NULL_SYMBOL; }
-  inline bool IsType() const { return type == MESSAGE || type == ENUM; }
-  inline bool IsAggregate() const {
-    return type == MESSAGE || type == PACKAGE || type == ENUM ||
-           type == SERVICE;
-  }
-
-#define CONSTRUCTOR(TYPE, TYPE_CONSTANT, FIELD) \
-  inline explicit Symbol(const TYPE* value) {   \
-    type = TYPE_CONSTANT;                       \
-    this->FIELD = value;                        \
-  }
-
-  CONSTRUCTOR(Descriptor, MESSAGE, descriptor)
-  CONSTRUCTOR(FieldDescriptor, FIELD, field_descriptor)
-  CONSTRUCTOR(OneofDescriptor, ONEOF, oneof_descriptor)
-  CONSTRUCTOR(EnumDescriptor, ENUM, enum_descriptor)
-  CONSTRUCTOR(EnumValueDescriptor, ENUM_VALUE, enum_value_descriptor)
-  CONSTRUCTOR(ServiceDescriptor, SERVICE, service_descriptor)
-  CONSTRUCTOR(MethodDescriptor, METHOD, method_descriptor)
-  CONSTRUCTOR(FileDescriptor, PACKAGE, package_file_descriptor)
-#undef CONSTRUCTOR
-
-  const FileDescriptor* GetFile() const {
-    switch (type) {
-      case NULL_SYMBOL:
-        return NULL;
-      case MESSAGE:
-        return descriptor->file();
-      case FIELD:
-        return field_descriptor->file();
-      case ONEOF:
-        return oneof_descriptor->containing_type()->file();
-      case ENUM:
-        return enum_descriptor->file();
-      case ENUM_VALUE:
-        return enum_value_descriptor->type()->file();
-      case SERVICE:
-        return service_descriptor->file();
-      case METHOD:
-        return method_descriptor->service()->file();
-      case PACKAGE:
-        return package_file_descriptor;
-    }
-    return NULL;
-  }
-};
-
 const FieldDescriptor::CppType
 FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = {
   static_cast<CppType>(0),  // 0 is reserved for errors
@@ -239,15 +164,6 @@
 
 namespace {
 
-// Note:  I distrust ctype.h due to locales.
-char ToUpper(char ch) {
-  return (ch >= 'a' && ch <= 'z') ? (ch - 'a' + 'A') : ch;
-}
-
-char ToLower(char ch) {
-  return (ch >= 'A' && ch <= 'Z') ? (ch - 'A' + 'a') : ch;
-}
-
 string ToCamelCase(const string& input, bool lower_first) {
   bool capitalize_next = !lower_first;
   string result;
@@ -257,7 +173,12 @@
     if (input[i] == '_') {
       capitalize_next = true;
     } else if (capitalize_next) {
-      result.push_back(ToUpper(input[i]));
+      // Note:  I distrust ctype.h due to locales.
+      if ('a' <= input[i] && input[i] <= 'z') {
+        result.push_back(input[i] - 'a' + 'A');
+      } else {
+        result.push_back(input[i]);
+      }
       capitalize_next = false;
     } else {
       result.push_back(input[i]);
@@ -265,116 +186,13 @@
   }
 
   // Lower-case the first letter.
-  if (lower_first && !result.empty()) {
-    result[0] = ToLower(result[0]);
+  if (lower_first && !result.empty() && 'A' <= result[0] && result[0] <= 'Z') {
+      result[0] = result[0] - 'A' + 'a';
   }
 
   return result;
 }
 
-string ToJsonName(const string& input) {
-  bool capitalize_next = false;
-  string result;
-  result.reserve(input.size());
-
-  for (int i = 0; i < input.size(); i++) {
-    if (input[i] == '_') {
-      capitalize_next = true;
-    } else if (capitalize_next) {
-      result.push_back(ToUpper(input[i]));
-      capitalize_next = false;
-    } else {
-      result.push_back(input[i]);
-    }
-  }
-
-  return result;
-}
-
-string EnumValueToPascalCase(const string& input) {
-  bool next_upper = true;
-  string result;
-  result.reserve(input.size());
-
-  for (int i = 0; i < input.size(); i++) {
-    if (input[i] == '_') {
-      next_upper = true;
-    } else {
-      if (next_upper) {
-        result.push_back(ToUpper(input[i]));
-      } else {
-        result.push_back(ToLower(input[i]));
-      }
-      next_upper = false;
-    }
-  }
-
-  return result;
-}
-
-// Class to remove an enum prefix from enum values.
-class PrefixRemover {
- public:
-  PrefixRemover(StringPiece prefix) {
-    // Strip underscores and lower-case the prefix.
-    for (int i = 0; i < prefix.size(); i++) {
-      if (prefix[i] != '_') {
-        prefix_ += ascii_tolower(prefix[i]);
-      }
-    }
-  }
-
-  // Tries to remove the enum prefix from this enum value.
-  // If this is not possible, returns the input verbatim.
-  string MaybeRemove(StringPiece str) {
-    // We can't just lowercase and strip str and look for a prefix.
-    // We need to properly recognize the difference between:
-    //
-    //   enum Foo {
-    //     FOO_BAR_BAZ = 0;
-    //     FOO_BARBAZ = 1;
-    //   }
-    //
-    // This is acceptable (though perhaps not advisable) because even when
-    // we PascalCase, these two will still be distinct (BarBaz vs. Barbaz).
-    size_t i, j;
-
-    // Skip past prefix_ in str if we can.
-    for (i = 0, j = 0; i < str.size() && j < prefix_.size(); i++) {
-      if (str[i] == '_') {
-        continue;
-      }
-
-      if (ascii_tolower(str[i]) != prefix_[j++]) {
-        return str.as_string();
-      }
-    }
-
-    // If we didn't make it through the prefix, we've failed to strip the
-    // prefix.
-    if (j < prefix_.size()) {
-      return str.as_string();
-    }
-
-    // Skip underscores between prefix and further characters.
-    while (i < str.size() && str[i] == '_') {
-      i++;
-    }
-
-    // Enum label can't be the empty string.
-    if (i == str.size()) {
-      return str.as_string();
-    }
-
-    // We successfully stripped the prefix.
-    str.remove_prefix(i);
-    return str.as_string();
-  }
-
- private:
-  string prefix_;
-};
-
 // A DescriptorPool contains a bunch of hash_maps to implement the
 // various Find*By*() methods.  Since hashtable lookups are O(1), it's
 // most efficient to construct a fixed set of large hash_maps used by
@@ -389,7 +207,7 @@
 //   be a lot cleaner but we'd just have to convert it back to const char*
 //   for the open source release.
 
-typedef std::pair<const void*, const char*> PointerStringPair;
+typedef pair<const void*, const char*> PointerStringPair;
 
 struct PointerStringPairEqual {
   inline bool operator()(const PointerStringPair& a,
@@ -417,8 +235,8 @@
   }
 };
 
-typedef std::pair<const Descriptor*, int> DescriptorIntPair;
-typedef std::pair<const EnumDescriptor*, int> EnumIntPair;
+typedef pair<const Descriptor*, int> DescriptorIntPair;
+typedef pair<const EnumDescriptor*, int> EnumIntPair;
 
 struct PointerStringPairHash {
   size_t operator()(const PointerStringPair& p) const {
@@ -443,6 +261,65 @@
 };
 
 
+struct Symbol {
+  enum Type {
+    NULL_SYMBOL, MESSAGE, FIELD, ONEOF, ENUM, ENUM_VALUE, SERVICE, METHOD,
+    PACKAGE
+  };
+  Type type;
+  union {
+    const Descriptor* descriptor;
+    const FieldDescriptor* field_descriptor;
+    const OneofDescriptor* oneof_descriptor;
+    const EnumDescriptor* enum_descriptor;
+    const EnumValueDescriptor* enum_value_descriptor;
+    const ServiceDescriptor* service_descriptor;
+    const MethodDescriptor* method_descriptor;
+    const FileDescriptor* package_file_descriptor;
+  };
+
+  inline Symbol() : type(NULL_SYMBOL) { descriptor = NULL; }
+  inline bool IsNull() const { return type == NULL_SYMBOL; }
+  inline bool IsType() const {
+    return type == MESSAGE || type == ENUM;
+  }
+  inline bool IsAggregate() const {
+    return type == MESSAGE || type == PACKAGE
+        || type == ENUM || type == SERVICE;
+  }
+
+#define CONSTRUCTOR(TYPE, TYPE_CONSTANT, FIELD)  \
+  inline explicit Symbol(const TYPE* value) {    \
+    type = TYPE_CONSTANT;                        \
+    this->FIELD = value;                         \
+  }
+
+  CONSTRUCTOR(Descriptor         , MESSAGE   , descriptor             )
+  CONSTRUCTOR(FieldDescriptor    , FIELD     , field_descriptor       )
+  CONSTRUCTOR(OneofDescriptor    , ONEOF     , oneof_descriptor       )
+  CONSTRUCTOR(EnumDescriptor     , ENUM      , enum_descriptor        )
+  CONSTRUCTOR(EnumValueDescriptor, ENUM_VALUE, enum_value_descriptor  )
+  CONSTRUCTOR(ServiceDescriptor  , SERVICE   , service_descriptor     )
+  CONSTRUCTOR(MethodDescriptor   , METHOD    , method_descriptor      )
+  CONSTRUCTOR(FileDescriptor     , PACKAGE   , package_file_descriptor)
+#undef CONSTRUCTOR
+
+  const FileDescriptor* GetFile() const {
+    switch (type) {
+      case NULL_SYMBOL: return NULL;
+      case MESSAGE    : return descriptor           ->file();
+      case FIELD      : return field_descriptor     ->file();
+      case ONEOF      : return oneof_descriptor     ->containing_type()->file();
+      case ENUM       : return enum_descriptor      ->file();
+      case ENUM_VALUE : return enum_value_descriptor->type()->file();
+      case SERVICE    : return service_descriptor   ->file();
+      case METHOD     : return method_descriptor    ->service()->file();
+      case PACKAGE    : return package_file_descriptor;
+    }
+    return NULL;
+  }
+};
+
 const Symbol kNullSymbol;
 
 typedef hash_map<const char*, Symbol,
@@ -467,11 +344,11 @@
 // 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*>
+typedef map<DescriptorIntPair, const FieldDescriptor*>
   ExtensionsGroupedByDescriptorMap;
 typedef hash_map<string, const SourceCodeInfo_Location*> LocationsByPathMap;
 
-std::set<string>* allowed_proto3_extendees_ = NULL;
+set<string>* allowed_proto3_extendees_ = NULL;
 GOOGLE_PROTOBUF_DECLARE_ONCE(allowed_proto3_extendees_init_);
 
 void DeleteAllowedProto3Extendee() {
@@ -479,10 +356,10 @@
 }
 
 void InitAllowedProto3Extendee() {
-  allowed_proto3_extendees_ = new std::set<string>;
+  allowed_proto3_extendees_ = new set<string>;
   const char* kOptionNames[] = {
       "FileOptions",      "MessageOptions", "FieldOptions", "EnumOptions",
-      "EnumValueOptions", "ServiceOptions", "MethodOptions", "OneofOptions"};
+      "EnumValueOptions", "ServiceOptions", "MethodOptions"};
   for (int i = 0; i < GOOGLE_ARRAYSIZE(kOptionNames); ++i) {
     // descriptor.proto has a different package name in opensource. We allow
     // both so the opensource protocol compiler can also compile internal
@@ -557,7 +434,7 @@
   // The stack of files which are currently being built.  Used to detect
   // cyclic dependencies when loading files from a DescriptorDatabase.  Not
   // used when fallback_database_ == NULL.
-  std::vector<string> pending_files_;
+  vector<string> pending_files_;
 
   // A set of files which we have tried to load from the fallback database
   // and encountered errors.  We will not attempt to load them again during
@@ -593,9 +470,9 @@
   // These return NULL if not found.
   inline const FileDescriptor* FindFile(const string& key) const;
   inline const FieldDescriptor* FindExtension(const Descriptor* extendee,
-                                              int number) const;
+                                              int number);
   inline void FindAllExtensions(const Descriptor* extendee,
-                                std::vector<const FieldDescriptor*>* out) const;
+                                vector<const FieldDescriptor*>* out) const;
 
   // -----------------------------------------------------------------
   // Adding items.
@@ -625,10 +502,6 @@
   // The string is initialized to the given value for convenience.
   string* AllocateString(const string& value);
 
-  // Allocate a GoogleOnceDynamic which will be destroyed when the pool is
-  // destroyed.
-  GoogleOnceDynamic* AllocateOnceDynamic();
-
   // Allocate a protocol message object.  Some older versions of GCC have
   // 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
@@ -639,13 +512,10 @@
   FileDescriptorTables* AllocateFileTables();
 
  private:
-  std::vector<string*> strings_;    // All strings in the pool.
-  std::vector<Message*> messages_;  // All messages in the pool.
-  std::vector<GoogleOnceDynamic*>
-      once_dynamics_;  // All GoogleOnceDynamics 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.
+  vector<string*> strings_;    // All strings in the pool.
+  vector<Message*> messages_;  // All messages in the pool.
+  vector<FileDescriptorTables*> file_tables_;  // All file tables in the pool.
+  vector<void*> allocations_;  // All other memory allocated in the pool.
 
   SymbolsByNameMap      symbols_by_name_;
   FilesByNameMap        files_by_name_;
@@ -653,30 +523,29 @@
 
   struct CheckPoint {
     explicit CheckPoint(const Tables* tables)
-        : strings_before_checkpoint(tables->strings_.size()),
-          messages_before_checkpoint(tables->messages_.size()),
-          once_dynamics_before_checkpoint(tables->once_dynamics_.size()),
-          file_tables_before_checkpoint(tables->file_tables_.size()),
-          allocations_before_checkpoint(tables->allocations_.size()),
-          pending_symbols_before_checkpoint(
-              tables->symbols_after_checkpoint_.size()),
-          pending_files_before_checkpoint(
-              tables->files_after_checkpoint_.size()),
-          pending_extensions_before_checkpoint(
-              tables->extensions_after_checkpoint_.size()) {}
+      : strings_before_checkpoint(tables->strings_.size()),
+        messages_before_checkpoint(tables->messages_.size()),
+        file_tables_before_checkpoint(tables->file_tables_.size()),
+        allocations_before_checkpoint(tables->allocations_.size()),
+        pending_symbols_before_checkpoint(
+            tables->symbols_after_checkpoint_.size()),
+        pending_files_before_checkpoint(
+            tables->files_after_checkpoint_.size()),
+        pending_extensions_before_checkpoint(
+            tables->extensions_after_checkpoint_.size()) {
+    }
     int strings_before_checkpoint;
     int messages_before_checkpoint;
-    int once_dynamics_before_checkpoint;
     int file_tables_before_checkpoint;
     int allocations_before_checkpoint;
     int pending_symbols_before_checkpoint;
     int pending_files_before_checkpoint;
     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<DescriptorIntPair> extensions_after_checkpoint_;
+  vector<CheckPoint> checkpoints_;
+  vector<const char*      > symbols_after_checkpoint_;
+  vector<const char*      > files_after_checkpoint_;
+  vector<DescriptorIntPair> extensions_after_checkpoint_;
 
   // Allocate some bytes which will be reclaimed when the pool is
   // destroyed.
@@ -743,36 +612,20 @@
   // Populates p->first->locations_by_path_ from p->second.
   // Unusual signature dictated by GoogleOnceDynamic.
   static void BuildLocationsByPath(
-      std::pair<const FileDescriptorTables*, const SourceCodeInfo*>* p);
+      pair<const FileDescriptorTables*, const SourceCodeInfo*>* p);
 
   // Returns the location denoted by the specified path through info,
   // or NULL if not found.
   // The value of info must be that of the corresponding FileDescriptor.
   // (Conceptually a pure function, but stateful as an optimisation.)
   const SourceCodeInfo_Location* GetSourceLocation(
-      const std::vector<int>& path, const SourceCodeInfo* info) const;
-
-  // Must be called after BuildFileImpl(), even if the build failed and
-  // we are going to roll back to the last checkpoint.
-  void FinalizeTables();
+      const vector<int>& path, const SourceCodeInfo* info) const;
 
  private:
-  const void* FindParentForFieldsByMap(const FieldDescriptor* field) const;
-  static void FieldsByLowercaseNamesLazyInitStatic(
-      const FileDescriptorTables* tables);
-  void FieldsByLowercaseNamesLazyInitInternal() const;
-  static void FieldsByCamelcaseNamesLazyInitStatic(
-      const FileDescriptorTables* tables);
-  void FieldsByCamelcaseNamesLazyInitInternal() const;
-
-  SymbolsByParentMap symbols_by_parent_;
-  mutable FieldsByNameMap fields_by_lowercase_name_;
-  mutable FieldsByNameMap* fields_by_lowercase_name_tmp_;
-  mutable GoogleOnceDynamic fields_by_lowercase_name_once_;
-  mutable FieldsByNameMap fields_by_camelcase_name_;
-  mutable FieldsByNameMap* fields_by_camelcase_name_tmp_;
-  mutable GoogleOnceDynamic fields_by_camelcase_name_once_;
-  FieldsByNumberMap fields_by_number_;  // Not including extensions.
+  SymbolsByParentMap    symbols_by_parent_;
+  FieldsByNameMap       fields_by_lowercase_name_;
+  FieldsByNameMap       fields_by_camelcase_name_;
+  FieldsByNumberMap     fields_by_number_;       // Not including extensions.
   EnumValuesByNumberMap enum_values_by_number_;
   mutable EnumValuesByNumberMap unknown_enum_values_by_number_
       GOOGLE_GUARDED_BY(unknown_enum_values_mu_);
@@ -805,20 +658,17 @@
   }
   STLDeleteElements(&strings_);
   STLDeleteElements(&file_tables_);
-  STLDeleteElements(&once_dynamics_);
 }
 
 FileDescriptorTables::FileDescriptorTables()
-    // Initialize all the hash tables to start out with a small # of buckets.
+    // Initialize all the hash tables to start out with a small # of buckets
     : symbols_by_parent_(3),
       fields_by_lowercase_name_(3),
-      fields_by_lowercase_name_tmp_(new FieldsByNameMap()),
       fields_by_camelcase_name_(3),
-      fields_by_camelcase_name_tmp_(new FieldsByNameMap()),
       fields_by_number_(3),
       enum_values_by_number_(3),
-      unknown_enum_values_by_number_(3),
-      locations_by_path_(3) {}
+      unknown_enum_values_by_number_(3) {
+}
 
 FileDescriptorTables::~FileDescriptorTables() {}
 
@@ -897,9 +747,6 @@
       messages_.begin() + checkpoint.messages_before_checkpoint,
       messages_.end());
   STLDeleteContainerPointers(
-      once_dynamics_.begin() + checkpoint.once_dynamics_before_checkpoint,
-      once_dynamics_.end());
-  STLDeleteContainerPointers(
       file_tables_.begin() + checkpoint.file_tables_before_checkpoint,
       file_tables_.end());
   for (int i = checkpoint.allocations_before_checkpoint;
@@ -910,7 +757,6 @@
 
   strings_.resize(checkpoint.strings_before_checkpoint);
   messages_.resize(checkpoint.messages_before_checkpoint);
-  once_dynamics_.resize(checkpoint.once_dynamics_before_checkpoint);
   file_tables_.resize(checkpoint.file_tables_before_checkpoint);
   allocations_.resize(checkpoint.allocations_before_checkpoint);
   checkpoints_.pop_back();
@@ -978,59 +824,14 @@
   return FindPtrOrNull(fields_by_number_, std::make_pair(parent, number));
 }
 
-const void* FileDescriptorTables::FindParentForFieldsByMap(
-    const FieldDescriptor* field) const {
-  if (field->is_extension()) {
-    if (field->extension_scope() == NULL) {
-      return field->file();
-    } else {
-      return field->extension_scope();
-    }
-  } else {
-    return field->containing_type();
-  }
-}
-
-void FileDescriptorTables::FieldsByLowercaseNamesLazyInitStatic(
-    const FileDescriptorTables* tables) {
-  tables->FieldsByLowercaseNamesLazyInitInternal();
-}
-
-void FileDescriptorTables::FieldsByLowercaseNamesLazyInitInternal() const {
-  for (FieldsByNumberMap::const_iterator it = fields_by_number_.begin();
-       it != fields_by_number_.end(); it++) {
-    PointerStringPair lowercase_key(FindParentForFieldsByMap(it->second),
-                                    it->second->lowercase_name().c_str());
-    InsertIfNotPresent(&fields_by_lowercase_name_, lowercase_key, it->second);
-  }
-}
-
 inline const FieldDescriptor* FileDescriptorTables::FindFieldByLowercaseName(
     const void* parent, const string& lowercase_name) const {
-  fields_by_lowercase_name_once_.Init(
-      &FileDescriptorTables::FieldsByLowercaseNamesLazyInitStatic, this);
   return FindPtrOrNull(fields_by_lowercase_name_,
                        PointerStringPair(parent, lowercase_name.c_str()));
 }
 
-void FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic(
-    const FileDescriptorTables* tables) {
-  tables->FieldsByCamelcaseNamesLazyInitInternal();
-}
-
-void FileDescriptorTables::FieldsByCamelcaseNamesLazyInitInternal() const {
-  for (FieldsByNumberMap::const_iterator it = fields_by_number_.begin();
-       it != fields_by_number_.end(); it++) {
-    PointerStringPair camelcase_key(FindParentForFieldsByMap(it->second),
-                                    it->second->camelcase_name().c_str());
-    InsertIfNotPresent(&fields_by_camelcase_name_, camelcase_key, it->second);
-  }
-}
-
 inline const FieldDescriptor* FileDescriptorTables::FindFieldByCamelcaseName(
     const void* parent, const string& camelcase_name) const {
-  fields_by_camelcase_name_once_.Init(
-      &FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic, this);
   return FindPtrOrNull(fields_by_camelcase_name_,
                        PointerStringPair(parent, camelcase_name.c_str()));
 }
@@ -1094,13 +895,12 @@
 
 
 inline const FieldDescriptor* DescriptorPool::Tables::FindExtension(
-    const Descriptor* extendee, int number) const {
+    const Descriptor* extendee, int number) {
   return FindPtrOrNull(extensions_, std::make_pair(extendee, number));
 }
 
 inline void DescriptorPool::Tables::FindAllExtensions(
-    const Descriptor* extendee,
-    std::vector<const FieldDescriptor*>* out) const {
+    const Descriptor* extendee, vector<const FieldDescriptor*>* out) const {
   ExtensionsGroupedByDescriptorMap::const_iterator it =
       extensions_.lower_bound(std::make_pair(extendee, 0));
   for (; it != extensions_.end() && it->first.first == extendee; ++it) {
@@ -1135,40 +935,24 @@
   }
 }
 
-void FileDescriptorTables::FinalizeTables() {
-  // Clean up the temporary maps used by AddFieldByStylizedNames().
-  delete fields_by_lowercase_name_tmp_;
-  fields_by_lowercase_name_tmp_ = NULL;
-  delete fields_by_camelcase_name_tmp_;
-  fields_by_camelcase_name_tmp_ = NULL;
-}
-
 void FileDescriptorTables::AddFieldByStylizedNames(
     const FieldDescriptor* field) {
-  const void* parent = FindParentForFieldsByMap(field);
-
-  // We want fields_by_{lower,camel}case_name_ to be lazily built, but
-  // cross-link order determines which entry will be present in the case of a
-  // conflict. So we use the temporary maps that get destroyed after
-  // BuildFileImpl() to detect the conflicts, and only store the conflicts in
-  // the map that will persist. We will then lazily populate the rest of the
-  // entries from fields_by_number_.
+  const void* parent;
+  if (field->is_extension()) {
+    if (field->extension_scope() == NULL) {
+      parent = field->file();
+    } else {
+      parent = field->extension_scope();
+    }
+  } else {
+    parent = field->containing_type();
+  }
 
   PointerStringPair lowercase_key(parent, field->lowercase_name().c_str());
-  if (!InsertIfNotPresent(fields_by_lowercase_name_tmp_, lowercase_key,
-                          field)) {
-    InsertIfNotPresent(
-        &fields_by_lowercase_name_, lowercase_key,
-        FindPtrOrNull(*fields_by_lowercase_name_tmp_, lowercase_key));
-  }
+  InsertIfNotPresent(&fields_by_lowercase_name_, lowercase_key, field);
 
   PointerStringPair camelcase_key(parent, field->camelcase_name().c_str());
-  if (!InsertIfNotPresent(fields_by_camelcase_name_tmp_, camelcase_key,
-                          field)) {
-    InsertIfNotPresent(
-        &fields_by_camelcase_name_, camelcase_key,
-        FindPtrOrNull(*fields_by_camelcase_name_tmp_, camelcase_key));
-  }
+  InsertIfNotPresent(&fields_by_camelcase_name_, camelcase_key, field);
 }
 
 bool FileDescriptorTables::AddFieldByNumber(const FieldDescriptor* field) {
@@ -1210,12 +994,6 @@
   return result;
 }
 
-GoogleOnceDynamic* DescriptorPool::Tables::AllocateOnceDynamic() {
-  GoogleOnceDynamic* result = new GoogleOnceDynamic();
-  once_dynamics_.push_back(result);
-  return result;
-}
-
 template<typename Type>
 Type* DescriptorPool::Tables::AllocateMessage(Type* /* dummy */) {
   Type* result = new Type;
@@ -1242,7 +1020,7 @@
 }
 
 void FileDescriptorTables::BuildLocationsByPath(
-    std::pair<const FileDescriptorTables*, const SourceCodeInfo*>* p) {
+    pair<const FileDescriptorTables*, const SourceCodeInfo*>* p) {
   for (int i = 0, len = p->second->location_size(); i < len; ++i) {
     const SourceCodeInfo_Location* loc = &p->second->location().Get(i);
     p->first->locations_by_path_[Join(loc->path(), ",")] = loc;
@@ -1250,8 +1028,8 @@
 }
 
 const SourceCodeInfo_Location* FileDescriptorTables::GetSourceLocation(
-    const std::vector<int>& path, const SourceCodeInfo* info) const {
-  std::pair<const FileDescriptorTables*, const SourceCodeInfo*> p(
+    const vector<int>& path, const SourceCodeInfo* info) const {
+  pair<const FileDescriptorTables*, const SourceCodeInfo*> p(
       std::make_pair(this, info));
   locations_by_path_once_.Init(&FileDescriptorTables::BuildLocationsByPath, &p);
   return FindPtrOrNull(locations_by_path_, Join(path, ","));
@@ -1269,10 +1047,8 @@
     underlay_(NULL),
     tables_(new Tables),
     enforce_dependencies_(true),
-    lazily_build_dependencies_(false),
     allow_unknown_(false),
-    enforce_weak_(false),
-    disallow_enforce_utf8_(false) {}
+    enforce_weak_(false) {}
 
 DescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database,
                                ErrorCollector* error_collector)
@@ -1282,10 +1058,8 @@
     underlay_(NULL),
     tables_(new Tables),
     enforce_dependencies_(true),
-    lazily_build_dependencies_(false),
     allow_unknown_(false),
-    enforce_weak_(false),
-    disallow_enforce_utf8_(false) {
+    enforce_weak_(false) {
 }
 
 DescriptorPool::DescriptorPool(const DescriptorPool* underlay)
@@ -1295,10 +1069,8 @@
     underlay_(underlay),
     tables_(new Tables),
     enforce_dependencies_(true),
-    lazily_build_dependencies_(false),
     allow_unknown_(false),
-    enforce_weak_(false),
-    disallow_enforce_utf8_(false) {}
+    enforce_weak_(false) {}
 
 DescriptorPool::~DescriptorPool() {
   if (mutex_ != NULL) delete mutex_;
@@ -1343,7 +1115,6 @@
 static void InitGeneratedPool() {
   generated_database_ = new EncodedDescriptorDatabase;
   generated_pool_ = new DescriptorPool(generated_database_);
-  generated_pool_->InternalSetLazilyBuildDependencies();
 
   internal::OnShutdown(&DeleteGeneratedPool);
 }
@@ -1360,7 +1131,6 @@
 }
 
 
-
 DescriptorPool* DescriptorPool::internal_generated_pool() {
   InitGeneratedPoolOnce();
   return generated_pool_;
@@ -1498,15 +1268,6 @@
 
 const FieldDescriptor* DescriptorPool::FindExtensionByNumber(
     const Descriptor* extendee, int number) const {
-  // A faster path to reduce lock contention in finding extensions, assuming
-  // most extensions will be cache hit.
-  if (mutex_ != NULL) {
-    ReaderMutexLock lock(mutex_);
-    const FieldDescriptor* result = tables_->FindExtension(extendee, number);
-    if (result != NULL) {
-      return result;
-    }
-  }
   MutexLockMaybe lock(mutex_);
   tables_->known_bad_symbols_.clear();
   tables_->known_bad_files_.clear();
@@ -1528,8 +1289,7 @@
 }
 
 void DescriptorPool::FindAllExtensions(
-    const Descriptor* extendee,
-    std::vector<const FieldDescriptor*>* out) const {
+    const Descriptor* extendee, vector<const FieldDescriptor*>* out) const {
   MutexLockMaybe lock(mutex_);
   tables_->known_bad_symbols_.clear();
   tables_->known_bad_files_.clear();
@@ -1538,7 +1298,7 @@
   // (but do this only once per descriptor).
   if (fallback_database_ != NULL &&
       tables_->extensions_loaded_from_db_.count(extendee) == 0) {
-    std::vector<int> numbers;
+    vector<int> numbers;
     if (fallback_database_->FindAllExtensionNumbers(extendee->full_name(),
                                                     &numbers)) {
       for (int i = 0; i < numbers.size(); ++i) {
@@ -1809,18 +1569,6 @@
   return NULL;
 }
 
-const EnumDescriptor::ReservedRange*
-EnumDescriptor::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) {
-      return reserved_range(i);
-    }
-  }
-  return NULL;
-}
-
 // -------------------------------------------------------------------
 
 bool DescriptorPool::TryFindFileInFallbackDatabase(const string& name) const {
@@ -1926,8 +1674,8 @@
 
 // ===================================================================
 
-bool FieldDescriptor::is_map_message_type() const {
-  return message_type_->options().map_entry();
+bool FieldDescriptor::is_map() const {
+  return type() == TYPE_MESSAGE && message_type()->options().map_entry();
 }
 
 string FieldDescriptor::DefaultValueAsString(bool quote_string_type) const {
@@ -2054,10 +1802,6 @@
     DescriptorProto::ExtensionRange* range = proto->add_extension_range();
     range->set_start(extension_range(i)->start);
     range->set_end(extension_range(i)->end);
-    const ExtensionRangeOptions* options = extension_range(i)->options_;
-    if (options != &ExtensionRangeOptions::default_instance()) {
-      range->mutable_options()->CopyFrom(*options);
-    }
   }
   for (int i = 0; i < extension_count(); i++) {
     extension(i)->CopyTo(proto->add_extension());
@@ -2152,9 +1896,6 @@
 
 void OneofDescriptor::CopyTo(OneofDescriptorProto* proto) const {
   proto->set_name(name());
-  if (&options() != &OneofOptions::default_instance()) {
-    proto->mutable_options()->CopyFrom(options());
-  }
 }
 
 void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const {
@@ -2163,14 +1904,6 @@
   for (int i = 0; i < value_count(); i++) {
     value(i)->CopyTo(proto->add_value());
   }
-  for (int i = 0; i < reserved_range_count(); i++) {
-    EnumDescriptorProto::EnumReservedRange* range = proto->add_reserved_range();
-    range->set_start(reserved_range(i)->start);
-    range->set_end(reserved_range(i)->end);
-  }
-  for (int i = 0; i < reserved_name_count(); i++) {
-    proto->add_reserved_name(reserved_name(i));
-  }
 
   if (&options() != &EnumOptions::default_instance()) {
     proto->mutable_options()->CopyFrom(options());
@@ -2227,11 +1960,13 @@
 
 namespace {
 
-bool RetrieveOptionsAssumingRightPool(int depth, const Message& options,
-                                      std::vector<string>* option_entries) {
+// Used by each of the option formatters.
+bool RetrieveOptions(int depth,
+                     const Message &options,
+                     vector<string> *option_entries) {
   option_entries->clear();
   const Reflection* reflection = options.GetReflection();
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(options, &fields);
   for (int i = 0; i < fields.size(); i++) {
     int count = 1;
@@ -2268,56 +2003,21 @@
   return !option_entries->empty();
 }
 
-// Used by each of the option formatters.
-bool RetrieveOptions(int depth, const Message& options,
-                     const DescriptorPool* pool,
-                     std::vector<string>* option_entries) {
-  // When printing custom options for a descriptor, we must use an options
-  // message built on top of the same DescriptorPool where the descriptor
-  // is coming from. This is to ensure we are interpreting custom options
-  // against the right pool.
-  if (options.GetDescriptor()->file()->pool() == pool) {
-    return RetrieveOptionsAssumingRightPool(depth, options, option_entries);
-  } else {
-    const Descriptor* option_descriptor =
-        pool->FindMessageTypeByName(options.GetDescriptor()->full_name());
-    if (option_descriptor == NULL) {
-      // google/protobuf/descriptor.proto is not in the pool. This means no
-      // custom options are used so we are safe to proceed with the compiled
-      // options message type.
-      return RetrieveOptionsAssumingRightPool(depth, options, option_entries);
-    }
-    DynamicMessageFactory factory;
-    google::protobuf::scoped_ptr<Message> dynamic_options(
-        factory.GetPrototype(option_descriptor)->New());
-    if (dynamic_options->ParseFromString(options.SerializeAsString())) {
-      return RetrieveOptionsAssumingRightPool(depth, *dynamic_options,
-                                              option_entries);
-    } else {
-      GOOGLE_LOG(ERROR) << "Found invalid proto option data for: "
-                 << options.GetDescriptor()->full_name();
-      return RetrieveOptionsAssumingRightPool(depth, options, option_entries);
-    }
-  }
-}
-
 // Formats options that all appear together in brackets. Does not include
 // brackets.
-bool FormatBracketedOptions(int depth, const Message& options,
-                            const DescriptorPool* pool, string* output) {
-  std::vector<string> all_options;
-  if (RetrieveOptions(depth, options, pool, &all_options)) {
+bool FormatBracketedOptions(int depth, const Message &options, string *output) {
+  vector<string> all_options;
+  if (RetrieveOptions(depth, options, &all_options)) {
     output->append(Join(all_options, ", "));
   }
   return !all_options.empty();
 }
 
 // Formats options one per line
-bool FormatLineOptions(int depth, const Message& options,
-                       const DescriptorPool* pool, string* output) {
+bool FormatLineOptions(int depth, const Message &options, string *output) {
   string prefix(depth * 2, ' ');
-  std::vector<string> all_options;
-  if (RetrieveOptions(depth, options, pool, &all_options)) {
+  vector<string> all_options;
+  if (RetrieveOptions(depth, options, &all_options)) {
     for (int i = 0; i < all_options.size(); i++) {
       strings::SubstituteAndAppend(output, "$0option $1;\n",
                                    prefix, all_options[i]);
@@ -2339,7 +2039,7 @@
         desc->GetSourceLocation(&source_loc_);
   }
   SourceLocationCommentPrinter(const FileDescriptor* file,
-                               const std::vector<int>& path,
+                               const vector<int>& path,
                                const string& prefix,
                                const DebugStringOptions& options)
       : options_(options), prefix_(prefix) {
@@ -2372,7 +2072,7 @@
   string FormatComment(const string& comment_text) {
     string stripped_comment = comment_text;
     StripWhitespace(&stripped_comment);
-    std::vector<string> lines = Split(stripped_comment, "\n");
+    vector<string> lines = Split(stripped_comment, "\n");
     string output;
     for (int i = 0; i < lines.size(); ++i) {
       const string& line = lines[i];
@@ -2400,7 +2100,7 @@
     const DebugStringOptions& debug_string_options) const {
   string contents;
   {
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(FileDescriptorProto::kSyntaxFieldNumber);
     SourceLocationCommentPrinter syntax_comment(
         this, path, "", debug_string_options);
@@ -2414,8 +2114,8 @@
       comment_printer(this, "", debug_string_options);
   comment_printer.AddPreComment(&contents);
 
-  std::set<int> public_dependencies;
-  std::set<int> weak_dependencies;
+  set<int> public_dependencies;
+  set<int> weak_dependencies;
   public_dependencies.insert(public_dependencies_,
                              public_dependencies_ + public_dependency_count_);
   weak_dependencies.insert(weak_dependencies_,
@@ -2435,7 +2135,7 @@
   }
 
   if (!package().empty()) {
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(FileDescriptorProto::kPackageFieldNumber);
     SourceLocationCommentPrinter package_comment(
         this, path, "", debug_string_options);
@@ -2444,7 +2144,7 @@
     package_comment.AddPostComment(&contents);
   }
 
-  if (FormatLineOptions(0, options(), pool(), &contents)) {
+  if (FormatLineOptions(0, options(), &contents)) {
     contents.append("\n");  // add some space if we had options
   }
 
@@ -2455,7 +2155,7 @@
 
   // Find all the 'group' type extensions; we will not output their nested
   // definitions (those will be done with their group field descriptor).
-  std::set<const Descriptor*> groups;
+  set<const Descriptor*> groups;
   for (int i = 0; i < extension_count(); i++) {
     if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) {
       groups.insert(extension(i)->message_type());
@@ -2525,12 +2225,12 @@
   }
   contents->append(" {\n");
 
-  FormatLineOptions(depth, options(), file()->pool(), contents);
+  FormatLineOptions(depth, options(), contents);
 
   // Find all the 'group' types for fields and extensions; we will not output
   // their nested definitions (those will be done with their group field
   // descriptor).
-  std::set<const Descriptor*> groups;
+  set<const Descriptor*> groups;
   for (int i = 0; i < field_count(); i++) {
     if (field(i)->type() == FieldDescriptor::TYPE_GROUP) {
       groups.insert(field(i)->message_type());
@@ -2663,18 +2363,8 @@
     field_type = FieldTypeNameDebugString();
   }
 
-  bool print_label = true;
-  // Determine whether to omit label:
-  //   1. For an optional field, omit label if it's in oneof or in proto3.
-  //   2. For a repeated field, omit label if it's a map.
-  if (is_optional() && (print_label_flag == OMIT_LABEL ||
-                        file()->syntax() == FileDescriptor::SYNTAX_PROTO3)) {
-    print_label = false;
-  } else if (is_map()) {
-    print_label = false;
-  }
   string label;
-  if (print_label) {
+  if (print_label_flag == PRINT_LABEL && !is_map()) {
     label = kLabelToName[this->label()];
     label.push_back(' ');
   }
@@ -2697,21 +2387,9 @@
     strings::SubstituteAndAppend(contents, " [default = $0",
                                  DefaultValueAsString(true));
   }
-  if (has_json_name_) {
-    if (!bracketed) {
-      bracketed = true;
-      contents->append("[");
-    } else {
-      contents->append(", ");
-    }
-    contents->append("json_name = \"");
-    contents->append(CEscape(json_name()));
-    contents->append("\"");
-  }
 
   string formatted_options;
-  if (FormatBracketedOptions(depth, options(), file()->pool(),
-                             &formatted_options)) {
+  if (FormatBracketedOptions(depth, options(), &formatted_options)) {
     contents->append(bracketed ? ", " : " [");
     bracketed = true;
     contents->append(formatted_options);
@@ -2755,15 +2433,11 @@
   SourceLocationCommentPrinter
       comment_printer(this, prefix, debug_string_options);
   comment_printer.AddPreComment(contents);
-  strings::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name());
-
-  FormatLineOptions(depth, options(), containing_type()->file()->pool(),
-                    contents);
-
+  strings::SubstituteAndAppend(
+      contents, "$0 oneof $1 {", prefix, name());
   if (debug_string_options.elide_oneof_body) {
     contents->append(" ... }\n");
   } else {
-    contents->append("\n");
     for (int i = 0; i < field_count(); i++) {
       field(i)->DebugString(depth, FieldDescriptor::OMIT_LABEL, contents,
                             debug_string_options);
@@ -2798,35 +2472,11 @@
   strings::SubstituteAndAppend(contents, "$0enum $1 {\n",
                                prefix, name());
 
-  FormatLineOptions(depth, options(), file()->pool(), contents);
+  FormatLineOptions(depth, options(), contents);
 
   for (int i = 0; i < value_count(); i++) {
     value(i)->DebugString(depth, contents, debug_string_options);
   }
-
-  if (reserved_range_count() > 0) {
-    strings::SubstituteAndAppend(contents, "$0  reserved ", prefix);
-    for (int i = 0; i < reserved_range_count(); i++) {
-      const EnumDescriptor::ReservedRange* range = reserved_range(i);
-      if (range->end == range->start) {
-        strings::SubstituteAndAppend(contents, "$0, ", range->start);
-      } else {
-        strings::SubstituteAndAppend(contents, "$0 to $1, ",
-                                     range->start, range->end);
-      }
-    }
-    contents->replace(contents->size() - 2, 2, ";\n");
-  }
-
-  if (reserved_name_count() > 0) {
-    strings::SubstituteAndAppend(contents, "$0  reserved ", prefix);
-    for (int i = 0; i < reserved_name_count(); i++) {
-      strings::SubstituteAndAppend(contents, "\"$0\", ",
-                                   CEscape(reserved_name(i)));
-    }
-    contents->replace(contents->size() - 2, 2, ";\n");
-  }
-
   strings::SubstituteAndAppend(contents, "$0}\n", prefix);
 
   comment_printer.AddPostComment(contents);
@@ -2857,8 +2507,7 @@
                                prefix, name(), number());
 
   string formatted_options;
-  if (FormatBracketedOptions(depth, options(), type()->file()->pool(),
-                             &formatted_options)) {
+  if (FormatBracketedOptions(depth, options(), &formatted_options)) {
     strings::SubstituteAndAppend(contents, " [$0]", formatted_options);
   }
   contents->append(";\n");
@@ -2887,7 +2536,7 @@
 
   strings::SubstituteAndAppend(contents, "service $0 {\n", name());
 
-  FormatLineOptions(1, options(), file()->pool(), contents);
+  FormatLineOptions(1, options(), contents);
 
   for (int i = 0; i < method_count(); i++) {
     method(i)->DebugString(1, contents, debug_string_options);
@@ -2928,8 +2577,7 @@
                                server_streaming() ? "stream " : "");
 
   string formatted_options;
-  if (FormatLineOptions(depth, options(), service()->file()->pool(),
-                        &formatted_options)) {
+  if (FormatLineOptions(depth, options(), &formatted_options)) {
     strings::SubstituteAndAppend(contents, " {\n$0$1}\n",
                                  formatted_options, prefix);
   } else {
@@ -2942,7 +2590,7 @@
 
 // Location methods ===============================================
 
-bool FileDescriptor::GetSourceLocation(const std::vector<int>& path,
+bool FileDescriptor::GetSourceLocation(const vector<int>& path,
                                        SourceLocation* out_location) const {
   GOOGLE_CHECK_NOTNULL(out_location);
   if (source_code_info_) {
@@ -2968,7 +2616,7 @@
 }
 
 bool FileDescriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;  // empty path for root FileDescriptor
+  vector<int> path;  // empty path for root FileDescriptor
   return GetSourceLocation(path, out_location);
 }
 
@@ -2982,49 +2630,49 @@
 }
 
 bool Descriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return file()->GetSourceLocation(path, out_location);
 }
 
 bool FieldDescriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return file()->GetSourceLocation(path, out_location);
 }
 
 bool OneofDescriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return containing_type()->file()->GetSourceLocation(path, out_location);
 }
 
 bool EnumDescriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return file()->GetSourceLocation(path, out_location);
 }
 
 bool MethodDescriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return service()->file()->GetSourceLocation(path, out_location);
 }
 
 bool ServiceDescriptor::GetSourceLocation(SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return file()->GetSourceLocation(path, out_location);
 }
 
 bool EnumValueDescriptor::GetSourceLocation(
     SourceLocation* out_location) const {
-  std::vector<int> path;
+  vector<int> path;
   GetLocationPath(&path);
   return type()->file()->GetSourceLocation(path, out_location);
 }
 
-void Descriptor::GetLocationPath(std::vector<int>* output) const {
+void Descriptor::GetLocationPath(vector<int>* output) const {
   if (containing_type()) {
     containing_type()->GetLocationPath(output);
     output->push_back(DescriptorProto::kNestedTypeFieldNumber);
@@ -3035,7 +2683,7 @@
   }
 }
 
-void FieldDescriptor::GetLocationPath(std::vector<int>* output) const {
+void FieldDescriptor::GetLocationPath(vector<int>* output) const {
   if (is_extension()) {
     if (extension_scope() == NULL) {
       output->push_back(FileDescriptorProto::kExtensionFieldNumber);
@@ -3052,13 +2700,13 @@
   }
 }
 
-void OneofDescriptor::GetLocationPath(std::vector<int>* output) const {
+void OneofDescriptor::GetLocationPath(vector<int>* output) const {
   containing_type()->GetLocationPath(output);
   output->push_back(DescriptorProto::kOneofDeclFieldNumber);
   output->push_back(index());
 }
 
-void EnumDescriptor::GetLocationPath(std::vector<int>* output) const {
+void EnumDescriptor::GetLocationPath(vector<int>* output) const {
   if (containing_type()) {
     containing_type()->GetLocationPath(output);
     output->push_back(DescriptorProto::kEnumTypeFieldNumber);
@@ -3069,18 +2717,18 @@
   }
 }
 
-void EnumValueDescriptor::GetLocationPath(std::vector<int>* output) const {
+void EnumValueDescriptor::GetLocationPath(vector<int>* output) const {
   type()->GetLocationPath(output);
   output->push_back(EnumDescriptorProto::kValueFieldNumber);
   output->push_back(index());
 }
 
-void ServiceDescriptor::GetLocationPath(std::vector<int>* output) const {
+void ServiceDescriptor::GetLocationPath(vector<int>* output) const {
   output->push_back(FileDescriptorProto::kServiceFieldNumber);
   output->push_back(index());
 }
 
-void MethodDescriptor::GetLocationPath(std::vector<int>* output) const {
+void MethodDescriptor::GetLocationPath(vector<int>* output) const {
   service()->GetLocationPath(output);
   output->push_back(ServiceDescriptorProto::kMethodFieldNumber);
   output->push_back(index());
@@ -3126,7 +2774,7 @@
   friend class OptionInterpreter;
 
   // Non-recursive part of BuildFile functionality.
-  FileDescriptor* BuildFileImpl(const FileDescriptorProto& proto);
+  const FileDescriptor* BuildFileImpl(const FileDescriptorProto& proto);
 
   const DescriptorPool* pool_;
   DescriptorPool::Tables* tables_;  // for convenience
@@ -3135,17 +2783,17 @@
   // As we build descriptors we store copies of the options messages in
   // them. We put pointers to those copies in this vector, as we build, so we
   // can later (after cross-linking) interpret those options.
-  std::vector<OptionsToInterpret> options_to_interpret_;
+  vector<OptionsToInterpret> options_to_interpret_;
 
   bool had_errors_;
   string filename_;
   FileDescriptor* file_;
   FileDescriptorTables* file_tables_;
-  std::set<const FileDescriptor*> dependencies_;
+  set<const FileDescriptor*> dependencies_;
 
   // unused_dependency_ is used to record the unused imported files.
   // Note: public import is not considered.
-  std::set<const FileDescriptor*> unused_dependency_;
+  set<const FileDescriptor*> unused_dependency_;
 
   // If LookupSymbol() finds a symbol that is in a file which is not a declared
   // dependency of this file, it will fail, but will set
@@ -3199,16 +2847,15 @@
   // - Search the pool's underlay if not found in tables_.
   // - Insure that the resulting Symbol is from one of the file's declared
   //   dependencies.
-  Symbol FindSymbol(const string& name, bool build_it = true);
+  Symbol FindSymbol(const string& name);
 
   // Like FindSymbol() but does not require that the symbol is in one of the
   // file's declared dependencies.
-  Symbol FindSymbolNotEnforcingDeps(const string& name, bool build_it = true);
+  Symbol FindSymbolNotEnforcingDeps(const string& name);
 
   // This implements the body of FindSymbolNotEnforcingDeps().
   Symbol FindSymbolNotEnforcingDepsHelper(const DescriptorPool* pool,
-                                          const string& name,
-                                          bool build_it = true);
+                                          const string& name);
 
   // Like FindSymbol(), but looks up the name relative to some other symbol
   // name.  This first searches siblings of relative_to, then siblings of its
@@ -3224,21 +2871,31 @@
   // 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 PlaceholderType {
+    PLACEHOLDER_MESSAGE,
+    PLACEHOLDER_ENUM,
+    PLACEHOLDER_EXTENDABLE_MESSAGE
+  };
   enum ResolveMode {
     LOOKUP_ALL, LOOKUP_TYPES
   };
   Symbol LookupSymbol(const string& name, const string& relative_to,
-                      DescriptorPool::PlaceholderType placeholder_type =
-                          DescriptorPool::PLACEHOLDER_MESSAGE,
-                      ResolveMode resolve_mode = LOOKUP_ALL,
-                      bool build_it = true);
+                      PlaceholderType placeholder_type = PLACEHOLDER_MESSAGE,
+                      ResolveMode resolve_mode = LOOKUP_ALL);
 
   // Like LookupSymbol() but will not return a placeholder even if
   // AllowUnknownDependencies() has been used.
   Symbol LookupSymbolNoPlaceholder(const string& name,
                                    const string& relative_to,
-                                   ResolveMode resolve_mode = LOOKUP_ALL,
-                                   bool build_it = true);
+                                   ResolveMode resolve_mode = LOOKUP_ALL);
+
+  // Creates a placeholder type suitable for return from LookupSymbol().  May
+  // return kNullSymbol if the name is not a valid type name.
+  Symbol NewPlaceholder(const string& name, PlaceholderType placeholder_type);
+
+  // Creates a placeholder file.  Never returns NULL.  This is used when an
+  // import is not found and AllowUnknownDependencies() is enabled.
+  FileDescriptor* NewPlaceholderFile(const string& name);
 
   // Calls tables_->AddSymbol() and records an error if it fails.  Returns
   // true if successful or false if failed, though most callers can ignore
@@ -3260,6 +2917,10 @@
   void ValidateSymbolName(const string& name, const string& full_name,
                           const Message& proto);
 
+  // Like ValidateSymbolName(), but the name is allowed to contain periods and
+  // an error is indicated by returning false (not recording the error).
+  bool ValidateQualifiedName(const string& name);
+
   // Used by BUILD_ARRAY macro (below) to avoid having to have the type
   // specified as a macro parameter.
   template <typename Type>
@@ -3310,14 +2971,9 @@
   void BuildReservedRange(const DescriptorProto::ReservedRange& proto,
                            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,
                   OneofDescriptor* result);
-  void CheckEnumValueUniqueness(const EnumDescriptorProto& proto,
-                                const EnumDescriptor* result);
   void BuildEnum(const EnumDescriptorProto& proto,
                  const Descriptor* parent,
                  EnumDescriptor* result);
@@ -3343,8 +2999,6 @@
   void CrossLinkMessage(Descriptor* message, const DescriptorProto& proto);
   void CrossLinkField(FieldDescriptor* field,
                       const FieldDescriptorProto& proto);
-  void CrossLinkExtensionRange(Descriptor::ExtensionRange* range,
-                               const DescriptorProto::ExtensionRange& proto);
   void CrossLinkEnum(EnumDescriptor* enum_type,
                      const EnumDescriptorProto& proto);
   void CrossLinkEnumValue(EnumValueDescriptor* enum_value,
@@ -3390,10 +3044,8 @@
     // in unknown_fields to check if field innermost_field is set on the
     // innermost message. Returns false and sets an error if so.
     bool ExamineIfOptionIsSet(
-        std::vector<const FieldDescriptor*>::const_iterator
-            intermediate_fields_iter,
-        std::vector<const FieldDescriptor*>::const_iterator
-            intermediate_fields_end,
+        vector<const FieldDescriptor*>::const_iterator intermediate_fields_iter,
+        vector<const FieldDescriptor*>::const_iterator intermediate_fields_end,
         const FieldDescriptor* innermost_field, const string& debug_msg_name,
         const UnknownFieldSet& unknown_fields);
 
@@ -3524,8 +3176,6 @@
   void DetectMapConflicts(const Descriptor* message,
                           const DescriptorProto& proto);
 
-  void ValidateJSType(FieldDescriptor* field,
-                      const FieldDescriptorProto& proto);
 };
 
 const FileDescriptor* DescriptorPool::BuildFile(
@@ -3653,8 +3303,8 @@
 bool DescriptorBuilder::IsInPackage(const FileDescriptor* file,
                                     const string& package_name) {
   return HasPrefixString(file->package(), package_name) &&
-         (file->package().size() == package_name.size() ||
-          file->package()[package_name.size()] == '.');
+           (file->package().size() == package_name.size() ||
+            file->package()[package_name.size()] == '.');
 }
 
 void DescriptorBuilder::RecordPublicDependencies(const FileDescriptor* file) {
@@ -3665,7 +3315,7 @@
 }
 
 Symbol DescriptorBuilder::FindSymbolNotEnforcingDepsHelper(
-    const DescriptorPool* pool, const string& name, bool build_it) {
+    const DescriptorPool* pool, const string& name) {
   // If we are looking at an underlay, we must lock its mutex_, since we are
   // accessing the underlay's tables_ directly.
   MutexLockMaybe lock((pool == pool_) ? NULL : pool->mutex_);
@@ -3677,14 +3327,12 @@
   }
 
   if (result.IsNull()) {
-    // With lazily_build_dependencies_, a symbol lookup at cross link time is
-    // not guaranteed to be successful. In most cases, build_it will be false,
-    // which intentionally prevents us from building an import until it's
-    // actually needed. In some cases, like registering an extension, we want
-    // to build the file containing the symbol, and build_it will be set.
-    // Also, build_it will be true when !lazily_build_dependencies_, to provide
-    // better error reporting of missing dependencies.
-    if (build_it && pool->TryFindSymbolInFallbackDatabase(name)) {
+    // In theory, we shouldn't need to check fallback_database_ because the
+    // symbol should be in one of its file's direct dependencies, and we have
+    // already loaded those by the time we get here.  But we check anyway so
+    // that we can generate better error message when dependencies are missing
+    // (i.e., "missing dependency" rather than "type is not defined").
+    if (pool->TryFindSymbolInFallbackDatabase(name)) {
       result = pool->tables_->FindSymbol(name);
     }
   }
@@ -3692,18 +3340,17 @@
   return result;
 }
 
-Symbol DescriptorBuilder::FindSymbolNotEnforcingDeps(const string& name,
-                                                     bool build_it) {
-  return FindSymbolNotEnforcingDepsHelper(pool_, name, build_it);
+Symbol DescriptorBuilder::FindSymbolNotEnforcingDeps(const string& name) {
+  return FindSymbolNotEnforcingDepsHelper(pool_, name);
 }
 
-Symbol DescriptorBuilder::FindSymbol(const string& name, bool build_it) {
-  Symbol result = FindSymbolNotEnforcingDeps(name, build_it);
+Symbol DescriptorBuilder::FindSymbol(const string& name) {
+  Symbol result = FindSymbolNotEnforcingDeps(name);
 
   if (result.IsNull()) return result;
 
   if (!pool_->enforce_dependencies_) {
-    // Hack for CompilerUpgrader, and also used for lazily_build_dependencies_
+    // Hack for CompilerUpgrader.
     return result;
   }
 
@@ -3724,8 +3371,7 @@
     // dependency also defines the same package.  We can't really rule out this
     // symbol unless none of the dependencies define it.
     if (IsInPackage(file_, name)) return result;
-    for (std::set<const FileDescriptor*>::const_iterator it =
-             dependencies_.begin();
+    for (set<const FileDescriptor*>::const_iterator it = dependencies_.begin();
          it != dependencies_.end(); ++it) {
       // Note:  A dependency may be NULL if it was not found or had errors.
       if (*it != NULL && IsInPackage(*it, name)) return result;
@@ -3737,16 +3383,14 @@
   return kNullSymbol;
 }
 
-Symbol DescriptorBuilder::LookupSymbolNoPlaceholder(const string& name,
-                                                    const string& relative_to,
-                                                    ResolveMode resolve_mode,
-                                                    bool build_it) {
+Symbol DescriptorBuilder::LookupSymbolNoPlaceholder(
+    const string& name, const string& relative_to, ResolveMode resolve_mode) {
   possible_undeclared_dependency_ = NULL;
   undefine_resolved_name_.clear();
 
-  if (!name.empty() && name[0] == '.') {
+  if (name.size() > 0 && name[0] == '.') {
     // Fully-qualified name.
-    return FindSymbol(name.substr(1), build_it);
+    return FindSymbol(name.substr(1));
   }
 
   // If name is something like "Foo.Bar.baz", and symbols named "Foo" are
@@ -3774,7 +3418,7 @@
     // Chop off the last component of the scope.
     string::size_type dot_pos = scope_to_try.find_last_of('.');
     if (dot_pos == string::npos) {
-      return FindSymbol(name, build_it);
+      return FindSymbol(name);
     } else {
       scope_to_try.erase(dot_pos);
     }
@@ -3783,7 +3427,7 @@
     string::size_type old_size = scope_to_try.size();
     scope_to_try.append(1, '.');
     scope_to_try.append(first_part_of_name);
-    Symbol result = FindSymbol(scope_to_try, build_it);
+    Symbol result = FindSymbol(scope_to_try);
     if (!result.IsNull()) {
       if (first_part_of_name.size() < name.size()) {
         // name is a compound symbol, of which we only found the first part.
@@ -3791,7 +3435,7 @@
         if (result.IsAggregate()) {
           scope_to_try.append(name, first_part_of_name.size(),
                               name.size() - first_part_of_name.size());
-          result = FindSymbol(scope_to_try, build_it);
+          result = FindSymbol(scope_to_try);
           if (result.IsNull()) {
             undefine_resolved_name_ = scope_to_try;
           }
@@ -3815,49 +3459,19 @@
 
 Symbol DescriptorBuilder::LookupSymbol(
     const string& name, const string& relative_to,
-    DescriptorPool::PlaceholderType placeholder_type, ResolveMode resolve_mode,
-    bool build_it) {
-  Symbol result =
-      LookupSymbolNoPlaceholder(name, relative_to, resolve_mode, build_it);
+    PlaceholderType placeholder_type, ResolveMode resolve_mode) {
+  Symbol result = LookupSymbolNoPlaceholder(
+      name, relative_to, resolve_mode);
   if (result.IsNull() && pool_->allow_unknown_) {
     // Not found, but AllowUnknownDependencies() is enabled.  Return a
     // placeholder instead.
-    result = pool_->NewPlaceholderWithMutexHeld(name, placeholder_type);
+    result = NewPlaceholder(name, placeholder_type);
   }
   return result;
 }
 
-static bool ValidateQualifiedName(const string& name) {
-  bool last_was_period = false;
-
-  for (int i = 0; i < name.size(); i++) {
-    // I don't trust isalnum() due to locales.  :(
-    if (('a' <= name[i] && name[i] <= 'z') ||
-        ('A' <= name[i] && name[i] <= 'Z') ||
-        ('0' <= name[i] && name[i] <= '9') || (name[i] == '_')) {
-      last_was_period = false;
-    } else if (name[i] == '.') {
-      if (last_was_period) return false;
-      last_was_period = true;
-    } else {
-      return false;
-    }
-  }
-
-  return !name.empty() && !last_was_period;
-}
-
-Symbol DescriptorPool::NewPlaceholder(const string& name,
-                                      PlaceholderType placeholder_type) const {
-  MutexLockMaybe lock(mutex_);
-  return NewPlaceholderWithMutexHeld(name, placeholder_type);
-}
-
-Symbol DescriptorPool::NewPlaceholderWithMutexHeld(
-    const string& name, PlaceholderType placeholder_type) const {
-  if (mutex_) {
-    mutex_->AssertHeld();
-  }
+Symbol DescriptorBuilder::NewPlaceholder(const string& name,
+                                         PlaceholderType placeholder_type) {
   // Compute names.
   const string* placeholder_full_name;
   const string* placeholder_name;
@@ -3883,7 +3497,7 @@
   }
 
   // Create the placeholders.
-  FileDescriptor* placeholder_file = NewPlaceholderFileWithMutexHeld(
+  FileDescriptor* placeholder_file = NewPlaceholderFile(
       *placeholder_full_name + ".placeholder.proto");
   placeholder_file->package_ = placeholder_package;
 
@@ -3949,28 +3563,19 @@
   }
 }
 
-FileDescriptor* DescriptorPool::NewPlaceholderFile(const string& name) const {
-  MutexLockMaybe lock(mutex_);
-  return NewPlaceholderFileWithMutexHeld(name);
-}
-
-FileDescriptor* DescriptorPool::NewPlaceholderFileWithMutexHeld(
-    const string& name) const {
-  if (mutex_) {
-    mutex_->AssertHeld();
-  }
+FileDescriptor* DescriptorBuilder::NewPlaceholderFile(
+    const string& name) {
   FileDescriptor* placeholder = tables_->Allocate<FileDescriptor>();
   memset(placeholder, 0, sizeof(*placeholder));
 
   placeholder->name_ = tables_->AllocateString(name);
   placeholder->package_ = &internal::GetEmptyString();
-  placeholder->pool_ = this;
+  placeholder->pool_ = pool_;
   placeholder->options_ = &FileOptions::default_instance();
   placeholder->tables_ = &FileDescriptorTables::GetEmptyInstance();
   placeholder->source_code_info_ = &SourceCodeInfo::default_instance();
   placeholder->is_placeholder_ = true;
   placeholder->syntax_ = FileDescriptor::SYNTAX_PROTO2;
-  placeholder->finished_building_ = true;
   // All other fields are zero or NULL.
 
   return placeholder;
@@ -3985,13 +3590,9 @@
 
   if (tables_->AddSymbol(full_name, symbol)) {
     if (!file_tables_->AddAliasUnderParent(parent, name, symbol)) {
-      // 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 "
-                       "symbols_by_name_, but was defined in "
-                       "symbols_by_parent_; this shouldn't be possible.";
-      }
+      GOOGLE_LOG(DFATAL) << "\"" << full_name << "\" not previously defined in "
+                     "symbols_by_name_, but was defined in symbols_by_parent_; "
+                     "this shouldn't be possible.";
       return false;
     }
     return true;
@@ -4064,6 +3665,27 @@
   }
 }
 
+bool DescriptorBuilder::ValidateQualifiedName(const string& name) {
+  bool last_was_period = false;
+
+  for (int i = 0; i < name.size(); i++) {
+    // I don't trust isalnum() due to locales.  :(
+    if (('a' <= name[i] && name[i] <= 'z') ||
+        ('A' <= name[i] && name[i] <= 'Z') ||
+        ('0' <= name[i] && name[i] <= '9') ||
+        (name[i] == '_')) {
+      last_was_period = false;
+    } else if (name[i] == '.') {
+      if (last_was_period) return false;
+      last_was_period = true;
+    } else {
+      return false;
+    }
+  }
+
+  return !name.empty() && !last_was_period;
+}
+
 // -------------------------------------------------------------------
 
 // This generic implementation is good for all descriptors except
@@ -4207,47 +3829,33 @@
     }
   }
 
-  // If we have a fallback_database_, and we aren't doing lazy import building,
-  // attempt to load all dependencies now, before checkpointing tables_.  This
-  // avoids confusion with recursive checkpoints.
-  if (!pool_->lazily_build_dependencies_) {
-    if (pool_->fallback_database_ != NULL) {
-      tables_->pending_files_.push_back(proto.name());
-      for (int i = 0; i < proto.dependency_size(); i++) {
-        if (tables_->FindFile(proto.dependency(i)) == NULL &&
-            (pool_->underlay_ == NULL ||
-             pool_->underlay_->FindFileByName(proto.dependency(i)) == NULL)) {
-          // We don't care what this returns since we'll find out below anyway.
-          pool_->TryFindFileInFallbackDatabase(proto.dependency(i));
-        }
+  // If we have a fallback_database_, attempt to load all dependencies now,
+  // before checkpointing tables_.  This avoids confusion with recursive
+  // checkpoints.
+  if (pool_->fallback_database_ != NULL) {
+    tables_->pending_files_.push_back(proto.name());
+    for (int i = 0; i < proto.dependency_size(); i++) {
+      if (tables_->FindFile(proto.dependency(i)) == NULL &&
+          (pool_->underlay_ == NULL ||
+           pool_->underlay_->FindFileByName(proto.dependency(i)) == NULL)) {
+        // We don't care what this returns since we'll find out below anyway.
+        pool_->TryFindFileInFallbackDatabase(proto.dependency(i));
       }
-      tables_->pending_files_.pop_back();
     }
+    tables_->pending_files_.pop_back();
   }
+  return BuildFileImpl(proto);
+}
 
+const FileDescriptor* DescriptorBuilder::BuildFileImpl(
+    const FileDescriptorProto& proto) {
   // Checkpoint the tables so that we can roll back if something goes wrong.
   tables_->AddCheckpoint();
 
-  FileDescriptor* result = BuildFileImpl(proto);
-
-  file_tables_->FinalizeTables();
-  if (result) {
-    tables_->ClearLastCheckpoint();
-    result->finished_building_ = true;
-  } else {
-    tables_->RollbackToLastCheckpoint();
-  }
-
-  return result;
-}
-
-FileDescriptor* DescriptorBuilder::BuildFileImpl(
-    const FileDescriptorProto& proto) {
   FileDescriptor* result = tables_->Allocate<FileDescriptor>();
   file_ = result;
 
   result->is_placeholder_ = false;
-  result->finished_building_ = false;
   if (proto.has_source_code_info()) {
     SourceCodeInfo *info = tables_->AllocateMessage<SourceCodeInfo>();
     info->CopyFrom(proto.source_code_info());
@@ -4294,6 +3902,7 @@
              "A file with this name is already in the pool.");
     // Bail out early so that if this is actually the exact same file, we
     // don't end up reporting that every single symbol is already defined.
+    tables_->RollbackToLastCheckpoint();
     return NULL;
   }
   if (!result->package().empty()) {
@@ -4301,24 +3910,12 @@
   }
 
   // Make sure all dependencies are loaded.
-  std::set<string> seen_dependencies;
+  set<string> seen_dependencies;
   result->dependency_count_ = proto.dependency_size();
   result->dependencies_ =
-      tables_->AllocateArray<const FileDescriptor*>(proto.dependency_size());
-  if (pool_->lazily_build_dependencies_) {
-    result->dependencies_once_ = tables_->AllocateOnceDynamic();
-    result->dependencies_names_ =
-        tables_->AllocateArray<const string*>(proto.dependency_size());
-    if (proto.dependency_size() > 0) {
-      memset(result->dependencies_names_, 0,
-             sizeof(*result->dependencies_names_) * proto.dependency_size());
-    }
-  } else {
-    result->dependencies_once_ = NULL;
-    result->dependencies_names_ = NULL;
-  }
+    tables_->AllocateArray<const FileDescriptor*>(proto.dependency_size());
   unused_dependency_.clear();
-  std::set<int> weak_deps;
+  set<int> weak_deps;
   for (int i = 0; i < proto.weak_dependency_size(); ++i) {
     weak_deps.insert(proto.weak_dependency(i));
   }
@@ -4332,22 +3929,12 @@
       dependency = pool_->underlay_->FindFileByName(proto.dependency(i));
     }
 
-    if (dependency == result) {
-      // Recursive import.  dependency/result is not fully initialized, and it's
-      // dangerous to try to do anything with it.  The recursive import error
-      // will be detected and reported in DescriptorBuilder::BuildFile().
-      return NULL;
-    }
-
     if (dependency == NULL) {
-      if (!pool_->lazily_build_dependencies_) {
-        if (pool_->allow_unknown_ ||
-            (!pool_->enforce_weak_ && weak_deps.find(i) != weak_deps.end())) {
-          dependency =
-              pool_->NewPlaceholderFileWithMutexHeld(proto.dependency(i));
-        } else {
-          AddImportError(proto, i);
-        }
+      if (pool_->allow_unknown_ ||
+          (!pool_->enforce_weak_ && weak_deps.find(i) != weak_deps.end())) {
+        dependency = NewPlaceholderFile(proto.dependency(i));
+      } else {
+        AddImportError(proto, i);
       }
     } else {
       // Add to unused_dependency_ to track unused imported files.
@@ -4361,10 +3948,6 @@
     }
 
     result->dependencies_[i] = dependency;
-    if (pool_->lazily_build_dependencies_ && !dependency) {
-      result->dependencies_names_[i] =
-          tables_->AllocateString(proto.dependency(i));
-    }
   }
 
   // Check public dependencies.
@@ -4377,12 +3960,7 @@
     if (index >= 0 && index < proto.dependency_size()) {
       result->public_dependencies_[public_dependency_count++] = index;
       // Do not track unused imported files for public import.
-      // Calling dependency(i) builds that file when doing lazy imports,
-      // need to avoid doing this. Unused dependency detection isn't done
-      // when building lazily, anyways.
-      if (!pool_->lazily_build_dependencies_) {
-        unused_dependency_.erase(result->dependency(index));
-      }
+      unused_dependency_.erase(result->dependency(index));
     } else {
       AddError(proto.name(), proto,
                DescriptorPool::ErrorCollector::OTHER,
@@ -4393,13 +3971,8 @@
 
   // Build dependency set
   dependencies_.clear();
-  // We don't/can't do proper dependency error checking when
-  // lazily_build_dependencies_, and calling dependency(i) will force
-  // a dependency to be built, which we don't want.
-  if (!pool_->lazily_build_dependencies_) {
-    for (int i = 0; i < result->dependency_count(); i++) {
-      RecordPublicDependencies(result->dependency(i));
-    }
+  for (int i = 0; i < result->dependency_count(); i++) {
+    RecordPublicDependencies(result->dependency(i));
   }
 
   // Check weak dependencies.
@@ -4441,7 +4014,7 @@
   // extension options known, so all interpretations should now succeed.
   if (!had_errors_) {
     OptionInterpreter option_interpreter(this);
-    for (std::vector<OptionsToInterpret>::iterator iter =
+    for (vector<OptionsToInterpret>::iterator iter =
              options_to_interpret_.begin();
          iter != options_to_interpret_.end(); ++iter) {
       option_interpreter.InterpretOptions(&(*iter));
@@ -4449,9 +4022,8 @@
     options_to_interpret_.clear();
   }
 
-  // Validate options. See comments at InternalSetLazilyBuildDependencies about
-  // error checking and lazy import building.
-  if (!had_errors_ && !pool_->lazily_build_dependencies_) {
+  // Validate options.
+  if (!had_errors_) {
     ValidateFileOptions(result, proto);
   }
 
@@ -4464,15 +4036,15 @@
   }
 
 
-  // Again, see comments at InternalSetLazilyBuildDependencies about error
-  // checking.
-  if (!unused_dependency_.empty() && !pool_->lazily_build_dependencies_) {
+  if (!unused_dependency_.empty()) {
     LogUnusedDependency(proto, result);
   }
 
   if (had_errors_) {
+    tables_->RollbackToLastCheckpoint();
     return NULL;
   } else {
+    tables_->ClearLastCheckpoint();
     return result;
   }
 }
@@ -4590,7 +4162,7 @@
     for (int j = 0; j < result->reserved_range_count(); j++) {
       const Descriptor::ReservedRange* range2 = result->reserved_range(j);
       if (range1->end > range2->start && range2->end > range1->start) {
-        AddError(result->full_name(), proto.extension_range(i),
+        AddError(result->full_name(), proto.extension_range(j),
                  DescriptorPool::ErrorCollector::NUMBER,
                  strings::Substitute("Extension range $0 to $1 overlaps with "
                                      "reserved range $2 to $3.",
@@ -4601,7 +4173,7 @@
     for (int j = i + 1; j < result->extension_range_count(); j++) {
       const Descriptor::ExtensionRange* range2 = result->extension_range(j);
       if (range1->end > range2->start && range2->end > range1->start) {
-        AddError(result->full_name(), proto.extension_range(i),
+        AddError(result->full_name(), proto.extension_range(j),
                  DescriptorPool::ErrorCollector::NUMBER,
                  strings::Substitute("Extension range $0 to $1 overlaps with "
                                      "already-defined range $2 to $3.",
@@ -4654,7 +4226,7 @@
     result->json_name_ = tables_->AllocateString(proto.json_name());
   } else {
     result->has_json_name_ = false;
-    result->json_name_ = tables_->AllocateString(ToJsonName(proto.name()));
+    result->json_name_ = result->camelcase_name_;
   }
 
   // Some compilers do not allow static_cast directly between two enum types,
@@ -4682,10 +4254,6 @@
   result->extension_scope_ = NULL;
   result->message_type_ = NULL;
   result->enum_type_ = NULL;
-  result->type_name_ = NULL;
-  result->type_once_ = NULL;
-  result->default_value_enum_ = NULL;
-  result->default_value_enum_name_ = NULL;
 
   result->has_default_value_ = proto.has_default_value();
   if (proto.has_default_value() && result->is_repeated()) {
@@ -4716,14 +4284,11 @@
           break;
         case FieldDescriptor::CPPTYPE_FLOAT:
           if (proto.default_value() == "inf") {
-            result->default_value_float_ =
-                std::numeric_limits<float>::infinity();
+            result->default_value_float_ = numeric_limits<float>::infinity();
           } else if (proto.default_value() == "-inf") {
-            result->default_value_float_ =
-                -std::numeric_limits<float>::infinity();
+            result->default_value_float_ = -numeric_limits<float>::infinity();
           } else if (proto.default_value() == "nan") {
-            result->default_value_float_ =
-                std::numeric_limits<float>::quiet_NaN();
+            result->default_value_float_ = numeric_limits<float>::quiet_NaN();
           } else  {
             result->default_value_float_ = io::SafeDoubleToFloat(
                 io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos));
@@ -4731,14 +4296,11 @@
           break;
         case FieldDescriptor::CPPTYPE_DOUBLE:
           if (proto.default_value() == "inf") {
-            result->default_value_double_ =
-                std::numeric_limits<double>::infinity();
+            result->default_value_double_ = numeric_limits<double>::infinity();
           } else if (proto.default_value() == "-inf") {
-            result->default_value_double_ =
-                -std::numeric_limits<double>::infinity();
+            result->default_value_double_ = -numeric_limits<double>::infinity();
           } else if (proto.default_value() == "nan") {
-            result->default_value_double_ =
-                std::numeric_limits<double>::quiet_NaN();
+            result->default_value_double_ = numeric_limits<double>::quiet_NaN();
           } else  {
             result->default_value_double_ =
                 io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos);
@@ -4928,13 +4490,6 @@
              DescriptorPool::ErrorCollector::NUMBER,
              "Extension range end number must be greater than start number.");
   }
-
-  if (!proto.has_options()) {
-    result->options_ = NULL;  // Will set to default_instance later.
-  } else {
-    AllocateOptionsImpl(parent->full_name(), parent->full_name(),
-                        proto.options(), result);
-  }
 }
 
 void DescriptorBuilder::BuildReservedRange(
@@ -4950,19 +4505,6 @@
   }
 }
 
-void DescriptorBuilder::BuildReservedRange(
-    const EnumDescriptorProto::EnumReservedRange& proto,
-    const EnumDescriptor* parent, EnumDescriptor::ReservedRange* result) {
-  result->start = proto.start();
-  result->end = proto.end();
-
-  if (result->start > result->end) {
-    AddError(parent->full_name(), proto,
-             DescriptorPool::ErrorCollector::NUMBER,
-             "Reserved range end number must be greater than start number.");
-  }
-}
-
 void DescriptorBuilder::BuildOneof(const OneofDescriptorProto& proto,
                                    Descriptor* parent,
                                    OneofDescriptor* result) {
@@ -4981,82 +4523,10 @@
   result->field_count_ = 0;
   result->fields_ = NULL;
 
-  // Copy options.
-  if (!proto.has_options()) {
-    result->options_ = NULL;  // Will set to default_instance later.
-  } else {
-    AllocateOptions(proto.options(), result);
-  }
-
   AddSymbol(result->full_name(), parent, result->name(),
             proto, Symbol(result));
 }
 
-void DescriptorBuilder::CheckEnumValueUniqueness(
-    const EnumDescriptorProto& proto, const EnumDescriptor* result) {
-
-  // Check that enum labels are still unique when we remove the enum prefix from
-  // values that have it.
-  //
-  // This will fail for something like:
-  //
-  //   enum MyEnum {
-  //     MY_ENUM_FOO = 0;
-  //     FOO = 1;
-  //   }
-  //
-  // By enforcing this reasonable constraint, we allow code generators to strip
-  // the prefix and/or PascalCase it without creating conflicts.  This can lead
-  // to much nicer language-specific enums like:
-  //
-  //   enum NameType {
-  //     FirstName = 1,
-  //     LastName = 2,
-  //   }
-  //
-  // Instead of:
-  //
-  //   enum NameType {
-  //     NAME_TYPE_FIRST_NAME = 1,
-  //     NAME_TYPE_LAST_NAME = 2,
-  //   }
-  PrefixRemover remover(result->name());
-  std::map<string, const google::protobuf::EnumValueDescriptor*> values;
-  for (int i = 0; i < result->value_count(); i++) {
-    const google::protobuf::EnumValueDescriptor* value = result->value(i);
-    string stripped =
-        EnumValueToPascalCase(remover.MaybeRemove(value->name()));
-    std::pair<std::map<string, const google::protobuf::EnumValueDescriptor*>::iterator,
-              bool>
-        insert_result = values.insert(std::make_pair(stripped, value));
-    bool inserted = insert_result.second;
-
-    // We don't throw the error if the two conflicting symbols are identical, or
-    // if they map to the same number.  In the former case, the normal symbol
-    // duplication error will fire so we don't need to (and its error message
-    // will make more sense). We allow the latter case so users can create
-    // aliases which add or remove the prefix (code generators that do prefix
-    // stripping should de-dup the labels in this case).
-    if (!inserted && insert_result.first->second->name() != value->name() &&
-        insert_result.first->second->number() != value->number()) {
-      string error_message =
-          "When enum name is stripped and label is PascalCased (" + stripped +
-          "), this value label conflicts with " + values[stripped]->name() +
-          ". This will make the proto fail to compile for some languages, such "
-          "as C#.";
-      // There are proto2 enums out there with conflicting names, so to preserve
-      // compatibility we issue only a warning for proto2.
-      if (result->file()->syntax() == FileDescriptor::SYNTAX_PROTO2) {
-        AddWarning(value->full_name(), proto.value(i),
-                   DescriptorPool::ErrorCollector::NAME, error_message);
-      } else {
-        AddError(value->full_name(), proto.value(i),
-                 DescriptorPool::ErrorCollector::NAME, error_message);
-      }
-    }
-  }
-}
-
 void DescriptorBuilder::BuildEnum(const EnumDescriptorProto& proto,
                                   const Descriptor* parent,
                                   EnumDescriptor* result) {
@@ -5084,19 +4554,6 @@
   }
 
   BUILD_ARRAY(proto, result, value, BuildEnumValue, result);
-  BUILD_ARRAY(proto, result, reserved_range, BuildReservedRange, result);
-
-  // Copy reserved names.
-  int reserved_name_count = proto.reserved_name_size();
-  result->reserved_name_count_ = reserved_name_count;
-  result->reserved_names_ =
-      tables_->AllocateArray<const string*>(reserved_name_count);
-  for (int i = 0; i < reserved_name_count; ++i) {
-    result->reserved_names_[i] =
-        tables_->AllocateString(proto.reserved_name(i));
-  }
-
-  CheckEnumValueUniqueness(proto, result);
 
   // Copy options.
   if (!proto.has_options()) {
@@ -5107,56 +4564,6 @@
 
   AddSymbol(result->full_name(), parent, result->name(),
             proto, Symbol(result));
-
-  for (int i = 0; i < proto.reserved_range_size(); i++) {
-    const EnumDescriptorProto_EnumReservedRange& range1 =
-        proto.reserved_range(i);
-    for (int j = i + 1; j < proto.reserved_range_size(); j++) {
-      const EnumDescriptorProto_EnumReservedRange& range2 =
-          proto.reserved_range(j);
-      if (range1.end() > range2.start() && range2.end() > range1.start()) {
-        AddError(result->full_name(), proto.reserved_range(i),
-                 DescriptorPool::ErrorCollector::NUMBER,
-                 strings::Substitute("Reserved range $0 to $1 overlaps with "
-                                     "already-defined range $2 to $3.",
-                                     range2.start(), range2.end() - 1,
-                                     range1.start(), range1.end() - 1));
-      }
-    }
-  }
-
-  hash_set<string> reserved_name_set;
-  for (int i = 0; i < proto.reserved_name_size(); i++) {
-    const string& name = proto.reserved_name(i);
-    if (reserved_name_set.find(name) == reserved_name_set.end()) {
-      reserved_name_set.insert(name);
-    } else {
-      AddError(name, proto, DescriptorPool::ErrorCollector::NAME,
-               strings::Substitute(
-                 "Enum value \"$0\" is reserved multiple times.",
-                 name));
-    }
-  }
-
-  for (int i = 0; i < result->value_count(); i++) {
-    const EnumValueDescriptor* value = result->value(i);
-    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()));
-      }
-    }
-    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()));
-    }
-  }
 }
 
 void DescriptorBuilder::BuildEnumValue(const EnumValueDescriptorProto& proto,
@@ -5267,8 +4674,8 @@
   ValidateSymbolName(proto.name(), *full_name, proto);
 
   // These will be filled in when cross-linking.
-  result->input_type_.Init();
-  result->output_type_.Init();
+  result->input_type_ = NULL;
+  result->output_type_ = NULL;
 
   // Copy options.
   if (!proto.has_options()) {
@@ -5333,11 +4740,6 @@
     CrossLinkField(&message->extensions_[i], proto.extension(i));
   }
 
-  for (int i = 0; i < message->extension_range_count(); i++) {
-    CrossLinkExtensionRange(&message->extension_ranges_[i],
-                            proto.extension_range(i));
-  }
-
   // Set up field array for each oneof.
 
   // First count the number of fields per oneof.
@@ -5381,10 +4783,6 @@
     oneof_decl->fields_ =
       tables_->AllocateArray<const FieldDescriptor*>(oneof_decl->field_count_);
     oneof_decl->field_count_ = 0;
-
-    if (oneof_decl->options_ == NULL) {
-      oneof_decl->options_ = &OneofOptions::default_instance();
-    }
   }
 
   // Then fill them in.
@@ -5400,27 +4798,15 @@
   }
 }
 
-void DescriptorBuilder::CrossLinkExtensionRange(
-    Descriptor::ExtensionRange* range,
-    const DescriptorProto::ExtensionRange& proto) {
-  if (range->options_ == NULL) {
-    range->options_ = &ExtensionRangeOptions::default_instance();
-  }
-}
-
 void DescriptorBuilder::CrossLinkField(
     FieldDescriptor* field, const FieldDescriptorProto& proto) {
   if (field->options_ == NULL) {
     field->options_ = &FieldOptions::default_instance();
   }
 
-  // Add the field to the lowercase-name and camelcase-name tables.
-  file_tables_->AddFieldByStylizedNames(field);
-
   if (proto.has_extendee()) {
-    Symbol extendee =
-        LookupSymbol(proto.extendee(), field->full_name(),
-                     DescriptorPool::PLACEHOLDER_EXTENDABLE_MESSAGE);
+    Symbol extendee = LookupSymbol(proto.extendee(), field->full_name(),
+                                   PLACEHOLDER_EXTENDABLE_MESSAGE);
     if (extendee.IsNull()) {
       AddNotDefinedError(field->full_name(), proto,
                          DescriptorPool::ErrorCollector::EXTENDEE,
@@ -5465,56 +4851,21 @@
     bool expecting_enum = (proto.type() == FieldDescriptorProto::TYPE_ENUM) ||
                           proto.has_default_value();
 
-    // In case of weak fields we force building the dependency. We need to know
-    // if the type exist or not. If it doesnt exist we substitute Empty which
-    // should only be done if the type can't be found in the generated pool.
-    // TODO(gerbens) Ideally we should query the database directly to check
-    // if weak fields exist or not so that we don't need to force building
-    // weak dependencies. However the name lookup rules for symbols are
-    // somewhat complicated, so I defer it too another CL.
-    bool is_weak = !pool_->enforce_weak_ && proto.options().weak();
-    bool is_lazy = pool_->lazily_build_dependencies_ && !is_weak;
-
     Symbol type =
-        LookupSymbol(proto.type_name(), field->full_name(),
-                     expecting_enum ? DescriptorPool::PLACEHOLDER_ENUM
-                                    : DescriptorPool::PLACEHOLDER_MESSAGE,
-                     LOOKUP_TYPES, !is_lazy);
+      LookupSymbol(proto.type_name(), field->full_name(),
+                   expecting_enum ? PLACEHOLDER_ENUM : PLACEHOLDER_MESSAGE,
+                   LOOKUP_TYPES);
+
+    // If the type is a weak type, we change the type to a google.protobuf.Empty field.
+    if (type.IsNull() && !pool_->enforce_weak_ && proto.options().weak()) {
+      type = FindSymbol(kNonLinkedWeakMessageReplacementName);
+    }
 
     if (type.IsNull()) {
-      if (is_lazy) {
-        // Save the symbol names for later for lookup, and allocate the once
-        // object needed for the accessors.
-        string name = proto.type_name();
-        field->type_once_ = tables_->AllocateOnceDynamic();
-        field->type_name_ = tables_->AllocateString(name);
-        if (proto.has_default_value()) {
-          field->default_value_enum_name_ =
-              tables_->AllocateString(proto.default_value());
-        }
-        // AddFieldByNumber and AddExtension are done later in this function,
-        // and can/must be done if the field type was not found. The related
-        // error checking is not necessary when in lazily_build_dependencies_
-        // mode, and can't be done without building the type's descriptor,
-        // which we don't want to do.
-        file_tables_->AddFieldByNumber(field);
-        if (field->is_extension()) {
-          tables_->AddExtension(field);
-        }
-        return;
-      } else {
-        // If the type is a weak type, we change the type to a google.protobuf.Empty
-        // field.
-        if (is_weak) {
-          type = FindSymbol(kNonLinkedWeakMessageReplacementName);
-        }
-        if (type.IsNull()) {
-          AddNotDefinedError(field->full_name(), proto,
-                             DescriptorPool::ErrorCollector::TYPE,
-                             proto.type_name());
-          return;
-        }
-      }
+      AddNotDefinedError(field->full_name(), proto,
+                         DescriptorPool::ErrorCollector::TYPE,
+                         proto.type_name());
+      return;
     }
 
     if (!proto.has_type()) {
@@ -5610,24 +4961,18 @@
 
   // Add the field to the fields-by-number table.
   // Note:  We have to do this *after* cross-linking because extensions do not
-  // know their containing type until now. If we're in
-  // lazily_build_dependencies_ mode, we're guaranteed there's no errors, so no
-  // risk to calling containing_type() or other accessors that will build
-  // dependencies.
+  //   know their containing type until now.
   if (!file_tables_->AddFieldByNumber(field)) {
     const FieldDescriptor* conflicting_field =
       file_tables_->FindFieldByNumber(field->containing_type(),
                                       field->number());
-    string containing_type_name = field->containing_type() == NULL
-                                      ? "unknown"
-                                      : field->containing_type()->full_name();
     if (field->is_extension()) {
       AddError(field->full_name(), proto,
                DescriptorPool::ErrorCollector::NUMBER,
                strings::Substitute("Extension number $0 has already been used "
                                    "in \"$1\" by extension \"$2\".",
                                    field->number(),
-                                   containing_type_name,
+                                   field->containing_type()->full_name(),
                                    conflicting_field->full_name()));
     } else {
       AddError(field->full_name(), proto,
@@ -5635,7 +4980,7 @@
                strings::Substitute("Field number $0 has already been used in "
                                    "\"$1\" by field \"$2\".",
                                    field->number(),
-                                   containing_type_name,
+                                   field->containing_type()->full_name(),
                                    conflicting_field->name()));
     }
   } else {
@@ -5659,6 +5004,9 @@
       }
     }
   }
+
+  // Add the field to the lowercase-name and camelcase-name tables.
+  file_tables_->AddFieldByStylizedNames(field);
 }
 
 void DescriptorBuilder::CrossLinkEnum(
@@ -5697,44 +5045,30 @@
     method->options_ = &MethodOptions::default_instance();
   }
 
-  Symbol input_type =
-      LookupSymbol(proto.input_type(), method->full_name(),
-                   DescriptorPool::PLACEHOLDER_MESSAGE, LOOKUP_ALL,
-                   !pool_->lazily_build_dependencies_);
+  Symbol input_type = LookupSymbol(proto.input_type(), method->full_name());
   if (input_type.IsNull()) {
-    if (!pool_->lazily_build_dependencies_) {
-      AddNotDefinedError(method->full_name(), proto,
-                         DescriptorPool::ErrorCollector::INPUT_TYPE,
-                         proto.input_type());
-    } else {
-      method->input_type_.SetLazy(proto.input_type(), file_);
-    }
+    AddNotDefinedError(method->full_name(), proto,
+                       DescriptorPool::ErrorCollector::INPUT_TYPE,
+                       proto.input_type());
   } else if (input_type.type != Symbol::MESSAGE) {
     AddError(method->full_name(), proto,
              DescriptorPool::ErrorCollector::INPUT_TYPE,
              "\"" + proto.input_type() + "\" is not a message type.");
   } else {
-    method->input_type_.Set(input_type.descriptor);
+    method->input_type_ = input_type.descriptor;
   }
 
-  Symbol output_type =
-      LookupSymbol(proto.output_type(), method->full_name(),
-                   DescriptorPool::PLACEHOLDER_MESSAGE, LOOKUP_ALL,
-                   !pool_->lazily_build_dependencies_);
+  Symbol output_type = LookupSymbol(proto.output_type(), method->full_name());
   if (output_type.IsNull()) {
-    if (!pool_->lazily_build_dependencies_) {
-      AddNotDefinedError(method->full_name(), proto,
-                         DescriptorPool::ErrorCollector::OUTPUT_TYPE,
-                         proto.output_type());
-    } else {
-      method->output_type_.SetLazy(proto.output_type(), file_);
-    }
+    AddNotDefinedError(method->full_name(), proto,
+                       DescriptorPool::ErrorCollector::OUTPUT_TYPE,
+                       proto.output_type());
   } else if (output_type.type != Symbol::MESSAGE) {
     AddError(method->full_name(), proto,
              DescriptorPool::ErrorCollector::OUTPUT_TYPE,
              "\"" + proto.output_type() + "\" is not a message type.");
   } else {
-    method->output_type_.Set(output_type.descriptor);
+    method->output_type_ = output_type.descriptor;
   }
 }
 
@@ -5840,14 +5174,14 @@
   // In proto3, we reject field names if they conflict in camelCase.
   // Note that we currently enforce a stricter rule: Field names must be
   // unique after being converted to lowercase with underscores removed.
-  std::map<string, const FieldDescriptor*> name_to_field;
+  map<string, const FieldDescriptor*> name_to_field;
   for (int i = 0; i < message->field_count(); ++i) {
     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,
-               "The JSON camel-case name of field \"" +
+               "The JSON camcel-case name of field \"" +
                message->field(i)->name() + "\" conflicts with field \"" +
                name_to_field[lowercase_name]->name() + "\". This is not " +
                "allowed in proto3.");
@@ -5925,12 +5259,8 @@
   }
 }
 
-
 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) {
@@ -5989,15 +5319,13 @@
     }
   }
 
-  ValidateJSType(field, proto);
-
 }
 
 void DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm,
                                             const EnumDescriptorProto& proto) {
   VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue);
   if (!enm->options().has_allow_alias() || !enm->options().allow_alias()) {
-    std::map<int, string> used_values;
+    map<int, string> used_values;
     for (int i = 0; i < enm->value_count(); ++i) {
       const EnumValueDescriptor* enum_value = enm->value(i);
       if (used_values.find(enum_value->number()) != used_values.end()) {
@@ -6124,10 +5452,10 @@
 
 void DescriptorBuilder::DetectMapConflicts(const Descriptor* message,
                                            const DescriptorProto& proto) {
-  std::map<string, const Descriptor*> seen_types;
+  map<string, const Descriptor*> seen_types;
   for (int i = 0; i < message->nested_type_count(); ++i) {
     const Descriptor* nested = message->nested_type(i);
-    std::pair<std::map<string, const Descriptor*>::iterator, bool> result =
+    pair<map<string, const Descriptor*>::iterator, bool> result =
         seen_types.insert(std::make_pair(nested->name(), nested));
     if (!result.second) {
       if (result.first->second->options().map_entry() ||
@@ -6144,7 +5472,7 @@
   // Check for conflicted field names.
   for (int i = 0; i < message->field_count(); ++i) {
     const FieldDescriptor* field = message->field(i);
-    std::map<string, const Descriptor*>::iterator iter =
+    map<string, const Descriptor*>::iterator iter =
         seen_types.find(field->name());
     if (iter != seen_types.end() && iter->second->options().map_entry()) {
       AddError(message->full_name(), proto,
@@ -6156,7 +5484,7 @@
   // Check for conflicted enum names.
   for (int i = 0; i < message->enum_type_count(); ++i) {
     const EnumDescriptor* enum_desc = message->enum_type(i);
-    std::map<string, const Descriptor*>::iterator iter =
+    map<string, const Descriptor*>::iterator iter =
         seen_types.find(enum_desc->name());
     if (iter != seen_types.end() && iter->second->options().map_entry()) {
       AddError(message->full_name(), proto,
@@ -6168,7 +5496,7 @@
   // Check for conflicted oneof names.
   for (int i = 0; i < message->oneof_decl_count(); ++i) {
     const OneofDescriptor* oneof_desc = message->oneof_decl(i);
-    std::map<string, const Descriptor*>::iterator iter =
+    map<string, const Descriptor*>::iterator iter =
         seen_types.find(oneof_desc->name());
     if (iter != seen_types.end() && iter->second->options().map_entry()) {
       AddError(message->full_name(), proto,
@@ -6179,40 +5507,6 @@
   }
 }
 
-void DescriptorBuilder::ValidateJSType(FieldDescriptor* field,
-                                       const FieldDescriptorProto& proto) {
-  FieldOptions::JSType jstype = field->options().jstype();
-  // The default is always acceptable.
-  if (jstype == FieldOptions::JS_NORMAL) {
-    return;
-  }
-
-  switch (field->type()) {
-    // Integral 64-bit types may be represented as JavaScript numbers or
-    // strings.
-    case FieldDescriptor::TYPE_UINT64:
-    case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_FIXED64:
-    case FieldDescriptor::TYPE_SFIXED64:
-      if (jstype == FieldOptions::JS_STRING ||
-          jstype == FieldOptions::JS_NUMBER) {
-        return;
-      }
-      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
-               "Illegal jstype for int64, uint64, sint64, fixed64 "
-               "or sfixed64 field: " +
-               FieldOptions_JSType_descriptor()->value(jstype)->name());
-      break;
-
-    // No other types permit a jstype option.
-    default:
-      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
-               "jstype is only allowed on int64, uint64, sint64, fixed64 "
-               "or sfixed64 fields.");
-      break;
-  }
-}
 
 #undef VALIDATE_OPTIONS_FROM_ARRAY
 
@@ -6337,7 +5631,7 @@
   // name in |debug_msg_name|, for use in error messages.
   const Descriptor* descriptor = options_descriptor;
   const FieldDescriptor* field = NULL;
-  std::vector<const FieldDescriptor*> intermediate_fields;
+  vector<const FieldDescriptor*> intermediate_fields;
   string debug_msg_name = "";
 
   for (int i = 0; i < uninterpreted_option_->name_size(); ++i) {
@@ -6445,7 +5739,7 @@
 
   // Now wrap the UnknownFieldSet with UnknownFieldSets corresponding to all
   // the intermediate messages.
-  for (std::vector<const FieldDescriptor*>::reverse_iterator iter =
+  for (vector<const FieldDescriptor*>::reverse_iterator iter =
            intermediate_fields.rbegin();
        iter != intermediate_fields.rend(); ++iter) {
     google::protobuf::scoped_ptr<UnknownFieldSet> parent_unknown_fields(
@@ -6495,9 +5789,8 @@
 }
 
 bool DescriptorBuilder::OptionInterpreter::ExamineIfOptionIsSet(
-    std::vector<const FieldDescriptor*>::const_iterator
-        intermediate_fields_iter,
-    std::vector<const FieldDescriptor*>::const_iterator intermediate_fields_end,
+    vector<const FieldDescriptor*>::const_iterator intermediate_fields_iter,
+    vector<const FieldDescriptor*>::const_iterator intermediate_fields_end,
     const FieldDescriptor* innermost_field, const string& debug_msg_name,
     const UnknownFieldSet& unknown_fields) {
   // We do linear searches of the UnknownFieldSet and its sub-groups.  This
@@ -6954,11 +6247,10 @@
     annotation_extensions.insert("google.protobuf.FieldOptions");
     annotation_extensions.insert("google.protobuf.EnumOptions");
     annotation_extensions.insert("google.protobuf.EnumValueOptions");
-    annotation_extensions.insert("google.protobuf.EnumValueOptions");
     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
+    for (set<const FileDescriptor*>::const_iterator
              it = unused_dependency_.begin();
          it != unused_dependency_.end(); ++it) {
       // Do not log warnings for proto files which extend annotations.
@@ -6980,158 +6272,5 @@
   }
 }
 
-Symbol DescriptorPool::CrossLinkOnDemandHelper(const string& name,
-                                               bool expecting_enum) const {
-  string lookup_name = name;
-  if (!lookup_name.empty() && lookup_name[0] == '.') {
-    lookup_name = lookup_name.substr(1);
-  }
-  Symbol result = tables_->FindByNameHelper(this, lookup_name);
-  return result;
-}
-
-// Handle the lazy import building for a message field whose type wasn't built
-// at cross link time. If that was the case, we saved the name of the type to
-// be looked up when the accessor for the type was called. Set type_,
-// enum_type_, message_type_, and default_value_enum_ appropriately.
-void FieldDescriptor::InternalTypeOnceInit() const {
-  GOOGLE_CHECK(file()->finished_building_ == true);
-  if (type_name_) {
-    Symbol result = file()->pool()->CrossLinkOnDemandHelper(
-        *type_name_, type_ == FieldDescriptor::TYPE_ENUM);
-    if (result.type == Symbol::MESSAGE) {
-      type_ = FieldDescriptor::TYPE_MESSAGE;
-      message_type_ = result.descriptor;
-    } else if (result.type == Symbol::ENUM) {
-      type_ = FieldDescriptor::TYPE_ENUM;
-      enum_type_ = result.enum_descriptor;
-    }
-  }
-  if (enum_type_ && !default_value_enum_) {
-    if (default_value_enum_name_) {
-      // Have to build the full name now instead of at CrossLink time,
-      // because enum_type_ may not be known at the time.
-      string name = enum_type_->full_name();
-      // Enum values reside in the same scope as the enum type.
-      string::size_type last_dot = name.find_last_of('.');
-      if (last_dot != string::npos) {
-        name = name.substr(0, last_dot) + "." + *default_value_enum_name_;
-      } else {
-        name = *default_value_enum_name_;
-      }
-      Symbol result = file()->pool()->CrossLinkOnDemandHelper(name, true);
-      if (result.type == Symbol::ENUM_VALUE) {
-        default_value_enum_ = result.enum_value_descriptor;
-      }
-    }
-    if (!default_value_enum_) {
-      // We use the first defined value as the default
-      // if a default is not explicitly defined.
-      GOOGLE_CHECK(enum_type_->value_count());
-      default_value_enum_ = enum_type_->value(0);
-    }
-  }
-}
-
-void FieldDescriptor::TypeOnceInit(const FieldDescriptor* to_init) {
-  to_init->InternalTypeOnceInit();
-}
-
-// message_type(), enum_type(), default_value_enum(), and type()
-// all share the same GoogleOnceDynamic init path to do lazy
-// import building and cross linking of a field of a message.
-const Descriptor* FieldDescriptor::message_type() const {
-  if (type_once_) {
-    type_once_->Init(&FieldDescriptor::TypeOnceInit, this);
-  }
-  return message_type_;
-}
-
-const EnumDescriptor* FieldDescriptor::enum_type() const {
-  if (type_once_) {
-    type_once_->Init(&FieldDescriptor::TypeOnceInit, this);
-  }
-  return enum_type_;
-}
-
-const EnumValueDescriptor* FieldDescriptor::default_value_enum() const {
-  if (type_once_) {
-    type_once_->Init(&FieldDescriptor::TypeOnceInit, this);
-  }
-  return default_value_enum_;
-}
-
-void FileDescriptor::InternalDependenciesOnceInit() const {
-  GOOGLE_CHECK(finished_building_ == true);
-  for (int i = 0; i < dependency_count(); i++) {
-    if (dependencies_names_[i]) {
-      dependencies_[i] = pool_->FindFileByName(*dependencies_names_[i]);
-    }
-  }
-}
-
-void FileDescriptor::DependenciesOnceInit(const FileDescriptor* to_init) {
-  to_init->InternalDependenciesOnceInit();
-}
-
-const FileDescriptor* FileDescriptor::dependency(int index) const {
-  if (dependencies_once_) {
-    // Do once init for all indicies, as it's unlikely only a single index would
-    // be called, and saves on GoogleOnceDynamic allocations.
-    dependencies_once_->Init(&FileDescriptor::DependenciesOnceInit, this);
-  }
-  return dependencies_[index];
-}
-
-const Descriptor* MethodDescriptor::input_type() const {
-  return input_type_.Get();
-}
-
-const Descriptor* MethodDescriptor::output_type() const {
-  return output_type_.Get();
-}
-
-
-namespace internal {
-void LazyDescriptor::Set(const Descriptor* descriptor) {
-  GOOGLE_CHECK(!name_);
-  GOOGLE_CHECK(!once_);
-  GOOGLE_CHECK(!file_);
-  descriptor_ = descriptor;
-}
-
-void LazyDescriptor::SetLazy(const string& name, const FileDescriptor* file) {
-  // verify Init() has been called and Set hasn't been called yet.
-  GOOGLE_CHECK(!descriptor_);
-  GOOGLE_CHECK(!file_);
-  GOOGLE_CHECK(!name_);
-  GOOGLE_CHECK(!once_);
-  GOOGLE_CHECK(file && file->pool_);
-  GOOGLE_CHECK(file->pool_->lazily_build_dependencies_);
-  GOOGLE_CHECK(!file->finished_building_);
-  file_ = file;
-  name_ = file->pool_->tables_->AllocateString(name);
-  once_ = file->pool_->tables_->AllocateOnceDynamic();
-}
-
-void LazyDescriptor::Once() {
-  if (once_) {
-    once_->Init(&LazyDescriptor::OnceStatic, this);
-  }
-}
-
-void LazyDescriptor::OnceStatic(LazyDescriptor* lazy) { lazy->OnceInternal(); }
-
-void LazyDescriptor::OnceInternal() {
-  GOOGLE_CHECK(file_->finished_building_);
-  if (!descriptor_ && name_) {
-    Symbol result = file_->pool_->CrossLinkOnDemandHelper(*name_, false);
-    if (!result.IsNull() && result.type == Symbol::MESSAGE) {
-      descriptor_ = result.descriptor;
-    }
-  }
-}
-}  // namespace internal
-
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/descriptor.h b/src/google/protobuf/descriptor.h
index 5f5159a..3ecc0a9 100644
--- a/src/google/protobuf/descriptor.h
+++ b/src/google/protobuf/descriptor.h
@@ -62,8 +62,7 @@
 #include <string>
 #include <vector>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/stubs/once.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 
 // TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
 #ifdef TYPE_BOOL
@@ -96,10 +95,8 @@
 class FileDescriptorProto;
 class MessageOptions;
 class FieldOptions;
-class OneofOptions;
 class EnumOptions;
 class EnumValueOptions;
-class ExtensionRangeOptions;
 class ServiceOptions;
 class MethodOptions;
 class FileOptions;
@@ -112,7 +109,6 @@
 // Defined in descriptor.cc
 class DescriptorBuilder;
 class FileDescriptorTables;
-struct Symbol;
 
 // Defined in unknown_field_set.h.
 class UnknownField;
@@ -147,7 +143,7 @@
   // See the comments in SourceCodeInfo.Location (descriptor.proto) for details.
   string leading_comments;
   string trailing_comments;
-  std::vector<string> leading_detached_comments;
+  vector<string> leading_detached_comments;
 };
 
 // Options when generating machine-parsable output from a descriptor with
@@ -168,55 +164,6 @@
         elide_oneof_body(false) {}
 };
 
-// A class to handle the simplest cases of a lazily linked descriptor
-// for a message type that isn't built at the time of cross linking,
-// which is needed when a pool has lazily_build_dependencies_ set.
-// Must be instantiated as mutable in a descriptor.
-namespace internal {
-class LIBPROTOBUF_EXPORT LazyDescriptor {
- public:
-  // Init function to be called at init time of a descriptor containing
-  // a LazyDescriptor.
-  void Init() {
-    descriptor_ = NULL;
-    name_ = NULL;
-    once_ = NULL;
-    file_ = NULL;
-  }
-
-  // Sets the value of the descriptor if it is known during the descriptor
-  // building process. Not thread safe, should only be called during the
-  // descriptor build process. Should not be called after SetLazy has been
-  // called.
-  void Set(const Descriptor* descriptor);
-
-  // Sets the information needed to lazily cross link the descriptor at a later
-  // time, SetLazy is not thread safe, should be called only once at descriptor
-  // build time if the symbol wasn't found and building of the file containing
-  // that type is delayed because lazily_build_dependencies_ is set on the pool.
-  // Should not be called after Set() has been called.
-  void SetLazy(const string& name, const FileDescriptor* file);
-
-  // Returns the current value of the descriptor, thread-safe. If SetLazy(...)
-  // has been called, will do a one-time cross link of the type specified,
-  // building the descriptor file that contains the type if necessary.
-  inline const Descriptor* Get() {
-    Once();
-    return descriptor_;
-  }
-
- private:
-  static void OnceStatic(LazyDescriptor* lazy);
-  void OnceInternal();
-  void Once();
-
-  const Descriptor* descriptor_;
-  const string* name_;
-  GoogleOnceDynamic* once_;
-  const FileDescriptor* file_;
-};
-}  // namespace internal
-
 // Describes a type of protocol message, or a particular group within a
 // message.  To obtain the Descriptor for a given message object, call
 // Message::GetDescriptor().  Generated message classes also have a
@@ -338,12 +285,8 @@
   // A range of field numbers which are designated for third-party
   // extensions.
   struct ExtensionRange {
-    typedef ExtensionRangeOptions OptionsType;
-
     int start;  // inclusive
     int end;    // exclusive
-
-    const ExtensionRangeOptions* options_;
   };
 
   // The number of extension ranges in this message type.
@@ -445,30 +388,27 @@
   const Descriptor* containing_type_;
   const MessageOptions* options_;
 
-  // These arrays are separated from their sizes to minimize padding on 64-bit.
-  FieldDescriptor* fields_;
-  OneofDescriptor* oneof_decls_;
-  Descriptor* nested_types_;
-  EnumDescriptor* enum_types_;
-  ExtensionRange* extension_ranges_;
-  FieldDescriptor* extensions_;
-  ReservedRange* reserved_ranges_;
-  const string** reserved_names_;
-
-  int field_count_;
-  int oneof_decl_count_;
-  int nested_type_count_;
-  int enum_type_count_;
-  int extension_range_count_;
-  int extension_count_;
-  int reserved_range_count_;
-  int reserved_name_count_;
-
   // True if this is a placeholder for an unknown type.
   bool is_placeholder_;
   // True if this is a placeholder and the type name wasn't fully-qualified.
   bool is_unqualified_placeholder_;
 
+  int field_count_;
+  FieldDescriptor* fields_;
+  int oneof_decl_count_;
+  OneofDescriptor* oneof_decls_;
+  int nested_type_count_;
+  Descriptor* nested_types_;
+  int enum_type_count_;
+  EnumDescriptor* enum_types_;
+  int extension_range_count_;
+  ExtensionRange* extension_ranges_;
+  int extension_count_;
+  FieldDescriptor* extensions_;
+  int reserved_range_count_;
+  ReservedRange* reserved_ranges_;
+  int reserved_name_count_;
+  const string** reserved_names_;
   // IMPORTANT:  If you add a new field, make sure to search for all instances
   // of Allocate<Descriptor>() and AllocateArray<Descriptor>() in descriptor.cc
   // and update them to initialize the field.
@@ -476,7 +416,6 @@
   // Must be constructed using DescriptorPool.
   Descriptor() {}
   friend class DescriptorBuilder;
-  friend class DescriptorPool;
   friend class EnumDescriptor;
   friend class FieldDescriptor;
   friend class OneofDescriptor;
@@ -485,7 +424,6 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor);
 };
 
-
 // Describes a single field of a message.  To get the descriptor for a given
 // field, first get the Descriptor for the message in which it is defined,
 // then call Descriptor::FindFieldByName().  To get a FieldDescriptor for
@@ -620,10 +558,6 @@
   // Does this field have an explicitly-declared default value?
   bool has_default_value() const;
 
-  // Whether the user has specified the json_name field option in the .proto
-  // file.
-  bool has_json_name() const;
-
   // Get the field default value if cpp_type() == CPPTYPE_INT32.  If no
   // explicit default was defined, the default is 0.
   int32 default_value_int32() const;
@@ -741,41 +675,33 @@
   // to this descriptor from the file root.
   void GetLocationPath(std::vector<int>* output) const;
 
-  // Returns true if this is a map message type.
-  bool is_map_message_type() const;
-
   const string* name_;
   const string* full_name_;
   const string* lowercase_name_;
   const string* camelcase_name_;
-  // If has_json_name_ is true, it's the value specified by the user.
-  // Otherwise, it has the same value as camelcase_name_.
-  const string* json_name_;
-  const FileDescriptor* file_;
-  GoogleOnceDynamic* type_once_;
-  static void TypeOnceInit(const FieldDescriptor* to_init);
-  void InternalTypeOnceInit() const;
-  mutable Type type_;
-  Label label_;
-  bool has_default_value_;
   // Whether the user has specified the json_name field option in the .proto
   // file.
   bool has_json_name_;
-  bool is_extension_;
+  // If has_json_name_ is true, it's the value specified by the user.
+  // Otherwise, it has the same value as lowercase_name_.
+  const string* json_name_;
+  const FileDescriptor* file_;
   int number_;
+  Type type_;
+  Label label_;
+  bool is_extension_;
   int index_in_oneof_;
   const Descriptor* containing_type_;
   const OneofDescriptor* containing_oneof_;
   const Descriptor* extension_scope_;
-  mutable const Descriptor* message_type_;
-  mutable const EnumDescriptor* enum_type_;
+  const Descriptor* message_type_;
+  const EnumDescriptor* enum_type_;
   const FieldOptions* options_;
-  const string* type_name_;
-  const string* default_value_enum_name_;
   // IMPORTANT:  If you add a new field, make sure to search for all instances
   // of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in
   // descriptor.cc and update them to initialize the field.
 
+  bool has_default_value_;
   union {
     int32  default_value_int32_;
     int64  default_value_int64_;
@@ -785,7 +711,7 @@
     double default_value_double_;
     bool   default_value_bool_;
 
-    mutable const EnumValueDescriptor* default_value_enum_;
+    const EnumValueDescriptor* default_value_enum_;
     const string* default_value_string_;
   };
 
@@ -806,7 +732,6 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor);
 };
 
-
 // Describes a oneof defined in a message type.
 class LIBPROTOBUF_EXPORT OneofDescriptor {
  public:
@@ -816,8 +741,6 @@
   // Index of this oneof within the message's oneof array.
   int index() const;
 
-  // The .proto file in which this oneof was defined.  Never NULL.
-  const FileDescriptor* file() const;
   // The Descriptor for the message containing this oneof.
   const Descriptor* containing_type() const;
 
@@ -827,8 +750,6 @@
   // .proto file.  Does not include extensions.
   const FieldDescriptor* field(int index) const;
 
-  const OneofOptions& options() const;
-
   // See Descriptor::CopyTo().
   void CopyTo(OneofDescriptorProto* proto) const;
 
@@ -846,8 +767,6 @@
   bool GetSourceLocation(SourceLocation* out_location) const;
 
  private:
-  typedef OneofOptions OptionsType;
-
   // Allows access to GetLocationPath for annotations.
   friend class ::google::protobuf::io::Printer;
 
@@ -865,8 +784,6 @@
   bool is_extendable_;
   int field_count_;
   const FieldDescriptor** fields_;
-  const OneofOptions* options_;
-
   // IMPORTANT:  If you add a new field, make sure to search for all instances
   // of Allocate<OneofDescriptor>() and AllocateArray<OneofDescriptor>()
   // in descriptor.cc and update them to initialize the field.
@@ -927,42 +844,12 @@
   // See Descriptor::DebugStringWithOptions().
   string DebugStringWithOptions(const DebugStringOptions& options) const;
 
+
   // Returns true if this is a placeholder for an unknown enum. This will
   // only be the case if this descriptor comes from a DescriptorPool
   // with AllowUnknownDependencies() set.
   bool is_placeholder() const;
 
-  // Reserved fields -------------------------------------------------
-
-  // A range of reserved field numbers.
-  struct ReservedRange {
-    int start;  // inclusive
-    int end;    // inclusive
-  };
-
-  // The number of reserved ranges in this message type.
-  int reserved_range_count() const;
-  // Gets an reserved range by index, where 0 <= index <
-  // reserved_range_count(). These are returned in the order they were defined
-  // in the .proto file.
-  const EnumDescriptor::ReservedRange* reserved_range(int index) const;
-
-  // Returns true if the number is in one of the reserved ranges.
-  bool IsReservedNumber(int number) const;
-
-  // Returns NULL if no reserved range contains the given number.
-  const EnumDescriptor::ReservedRange*
-      FindReservedRangeContainingNumber(int number) const;
-
-  // The number of reserved field names in this message type.
-  int reserved_name_count() const;
-
-  // Gets a reserved name by index, where 0 <= index < reserved_name_count().
-  const string& reserved_name(int index) const;
-
-  // Returns true if the field name is reserved.
-  bool IsReservedName(const string& name) const;
-
   // Source Location ---------------------------------------------------
 
   // Updates |*out_location| to the source location of the complete
@@ -1009,12 +896,6 @@
 
   int value_count_;
   EnumValueDescriptor* values_;
-
-  int reserved_range_count_;
-  int reserved_name_count_;
-  EnumDescriptor::ReservedRange* reserved_ranges_;
-  const string** reserved_names_;
-
   // IMPORTANT:  If you add a new field, make sure to search for all instances
   // of Allocate<EnumDescriptor>() and AllocateArray<EnumDescriptor>() in
   // descriptor.cc and update them to initialize the field.
@@ -1026,7 +907,6 @@
   friend class FieldDescriptor;
   friend class EnumValueDescriptor;
   friend class FileDescriptor;
-  friend class DescriptorPool;
   friend class internal::GeneratedMessageReflection;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor);
 };
@@ -1049,8 +929,6 @@
   // with C++ scoping rules for enums.
   const string& full_name() const;
 
-  // The .proto file in which this value was defined.  Never NULL.
-  const FileDescriptor* file() const;
   // The type of this value.  Never NULL.
   const EnumDescriptor* type() const;
 
@@ -1105,7 +983,6 @@
   EnumValueDescriptor() {}
   friend class DescriptorBuilder;
   friend class EnumDescriptor;
-  friend class DescriptorPool;
   friend class FileDescriptorTables;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor);
 };
@@ -1175,8 +1052,8 @@
   const string* full_name_;
   const FileDescriptor* file_;
   const ServiceOptions* options_;
-  MethodDescriptor* methods_;
   int method_count_;
+  MethodDescriptor* methods_;
   // IMPORTANT:  If you add a new field, make sure to search for all instances
   // of Allocate<ServiceDescriptor>() and AllocateArray<ServiceDescriptor>() in
   // descriptor.cc and update them to initialize the field.
@@ -1189,7 +1066,6 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor);
 };
 
-
 // Describes an individual service method.  To obtain a MethodDescriptor given
 // a service, first get its ServiceDescriptor, then call
 // ServiceDescriptor::FindMethodByName().  Use DescriptorPool to construct your
@@ -1203,8 +1079,6 @@
   // Index within the service's Descriptor.
   int index() const;
 
-  // The .proto file in which this method was defined.  Never NULL.
-  const FileDescriptor* file() const;
   // Gets the service to which this method belongs.  Never NULL.
   const ServiceDescriptor* service() const;
 
@@ -1259,8 +1133,8 @@
   const string* name_;
   const string* full_name_;
   const ServiceDescriptor* service_;
-  mutable internal::LazyDescriptor input_type_;
-  mutable internal::LazyDescriptor output_type_;
+  const Descriptor* input_type_;
+  const Descriptor* output_type_;
   const MethodOptions* options_;
   bool client_streaming_;
   bool server_streaming_;
@@ -1416,49 +1290,34 @@
   const string* name_;
   const string* package_;
   const DescriptorPool* pool_;
-  GoogleOnceDynamic* dependencies_once_;
-  static void DependenciesOnceInit(const FileDescriptor* to_init);
-  void InternalDependenciesOnceInit() const;
-
-  // These are arranged to minimze padding on 64-bit.
   int dependency_count_;
+  const FileDescriptor** dependencies_;
   int public_dependency_count_;
+  int* public_dependencies_;
   int weak_dependency_count_;
+  int* weak_dependencies_;
   int message_type_count_;
+  Descriptor* message_types_;
   int enum_type_count_;
+  EnumDescriptor* enum_types_;
   int service_count_;
+  ServiceDescriptor* services_;
   int extension_count_;
   Syntax syntax_;
   bool is_placeholder_;
-
-  // Indicates the FileDescriptor is completed building. Used to verify
-  // that type accessor functions that can possibly build a dependent file
-  // aren't called during the process of building the file.
-  bool finished_building_;
-
-  mutable const FileDescriptor** dependencies_;
-  const string** dependencies_names_;
-  int* public_dependencies_;
-  int* weak_dependencies_;
-  Descriptor* message_types_;
-  EnumDescriptor* enum_types_;
-  ServiceDescriptor* services_;
   FieldDescriptor* extensions_;
   const FileOptions* options_;
 
   const FileDescriptorTables* tables_;
   const SourceCodeInfo* source_code_info_;
-
   // IMPORTANT:  If you add a new field, make sure to search for all instances
   // of Allocate<FileDescriptor>() and AllocateArray<FileDescriptor>() in
   // descriptor.cc and update them to initialize the field.
 
   FileDescriptor() {}
   friend class DescriptorBuilder;
-  friend class DescriptorPool;
   friend class Descriptor;
   friend class FieldDescriptor;
-  friend class internal::LazyDescriptor;
   friend class OneofDescriptor;
   friend class EnumDescriptor;
   friend class EnumValueDescriptor;
@@ -1467,7 +1326,6 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor);
 };
 
-
 // ===================================================================
 
 // Used to construct descriptors.
@@ -1690,9 +1548,6 @@
   static void InternalAddGeneratedFile(
       const void* encoded_file_descriptor, int size);
 
-  // Disallow [enforce_utf8 = false] in .proto files.
-  void DisallowEnforceUtf8() { disallow_enforce_utf8_ = true; }
-
 
   // For internal use only:  Gets a non-const pointer to the generated pool.
   // This is called at static-initialization time only, so thread-safety is
@@ -1705,21 +1560,6 @@
   // which it did not officially declare as dependencies.
   void InternalDontEnforceDependencies();
 
-  // For internal use only: Enables lazy building of dependencies of a file.
-  // Delay the building of dependencies of a file descriptor until absolutely
-  // necessary, like when message_type() is called on a field that is defined
-  // in that dependency's file. This will cause functional issues if a proto
-  // or one of it's dependencies has errors. Should only be enabled for the
-  // generated_pool_ (because no descriptor build errors are guaranteed by
-  // the compilation generation process), testing, or if a lack of descriptor
-  // build errors can be guaranteed for a pool.
-  void InternalSetLazilyBuildDependencies() {
-    lazily_build_dependencies_ = true;
-    // This needs to be set when lazily building dependencies, as it breaks
-    // dependency checking.
-    InternalDontEnforceDependencies();
-  }
-
   // For internal use only.
   void internal_set_underlay(const DescriptorPool* underlay) {
     underlay_ = underlay;
@@ -1738,13 +1578,10 @@
 
  private:
   friend class Descriptor;
-  friend class internal::LazyDescriptor;
   friend class FieldDescriptor;
   friend class EnumDescriptor;
   friend class ServiceDescriptor;
-  friend class MethodDescriptor;
   friend class FileDescriptor;
-  friend class StreamDescriptor;
   friend class DescriptorBuilder;
   friend class FileDescriptorTables;
 
@@ -1768,28 +1605,6 @@
   const FileDescriptor* BuildFileFromDatabase(
     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
-  // symbol is defined if necessary. Will create a placeholder if the type
-  // doesn't exist in the fallback database, or the file doesn't build
-  // successfully.
-  Symbol CrossLinkOnDemandHelper(const string& name, bool expecting_enum) const;
-
-  // Create a placeholder FileDescriptor of the specified name
-  FileDescriptor* NewPlaceholderFile(const string& name) const;
-  FileDescriptor* NewPlaceholderFileWithMutexHeld(const string& name) const;
-
-  enum PlaceholderType {
-    PLACEHOLDER_MESSAGE,
-    PLACEHOLDER_ENUM,
-    PLACEHOLDER_EXTENDABLE_MESSAGE
-  };
-  // Create a placeholder Descriptor of the specified name
-  Symbol NewPlaceholder(const string& name,
-                        PlaceholderType placeholder_type) const;
-  Symbol NewPlaceholderWithMutexHeld(const string& name,
-                                     PlaceholderType placeholder_type) const;
-
   // If fallback_database_ is NULL, this is NULL.  Otherwise, this is a mutex
   // which must be locked while accessing tables_.
   Mutex* mutex_;
@@ -1805,16 +1620,13 @@
   google::protobuf::scoped_ptr<Tables> tables_;
 
   bool enforce_dependencies_;
-  bool lazily_build_dependencies_;
   bool allow_unknown_;
   bool enforce_weak_;
-  bool disallow_enforce_utf8_;
   std::set<string> unused_import_track_files_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool);
 };
 
-
 // inline methods ====================================================
 
 // These macros makes this repetitive code more readable.
@@ -1870,15 +1682,17 @@
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool)
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_oneof,
                          const OneofDescriptor*)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, index_in_oneof, int)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*)
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*)
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*)
 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_uint32, uint32)
@@ -1886,13 +1700,14 @@
 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_enum,
+                         const EnumValueDescriptor*)
 PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string)
 
 PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name)
 PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, full_name)
 PROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, containing_type, const Descriptor*)
 PROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, field_count, int)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(OneofDescriptor, OneofOptions)
 
 PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name)
 PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name)
@@ -1903,10 +1718,6 @@
                                const EnumValueDescriptor*)
 PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions)
 PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, is_placeholder, bool)
-PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, reserved_range_count, int)
-PROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, reserved_range,
-                               const EnumDescriptor::ReservedRange*)
-PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, reserved_name_count, int)
 
 PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name)
 PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name)
@@ -1925,6 +1736,8 @@
 PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name)
 PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name)
 PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*)
+PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*)
+PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*)
 PROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions)
 PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, client_streaming, bool)
 PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, server_streaming, bool)
@@ -1978,32 +1791,6 @@
   return *reserved_names_[index];
 }
 
-inline bool EnumDescriptor::IsReservedNumber(int number) const {
-  return FindReservedRangeContainingNumber(number) != NULL;
-}
-
-inline bool EnumDescriptor::IsReservedName(const string& name) const {
-  for (int i = 0; i < reserved_name_count(); i++) {
-    if (name == reserved_name(i)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because reserved_names_ is actually
-// an array of pointers rather than the usual array of objects.
-inline const string& EnumDescriptor::reserved_name(int index) const {
-  return *reserved_names_[index];
-}
-
-inline FieldDescriptor::Type FieldDescriptor::type() const {
-  if (type_once_) {
-    type_once_->Init(&FieldDescriptor::TypeOnceInit, this);
-  }
-  return type_;
-}
-
 inline bool FieldDescriptor::is_required() const {
   return label() == LABEL_REQUIRED;
 }
@@ -2020,15 +1807,11 @@
   return is_repeated() && IsTypePackable(type());
 }
 
-inline bool FieldDescriptor::is_map() const {
-  return type() == TYPE_MESSAGE && is_map_message_type();
-}
-
 // To save space, index() is computed by looking at the descriptor's position
 // in the parent's array of children.
 inline int FieldDescriptor::index() const {
   if (!is_extension_) {
-    return static_cast<int>(this - containing_type()->fields_);
+    return static_cast<int>(this - containing_type_->fields_);
   } else if (extension_scope_ != NULL) {
     return static_cast<int>(this - extension_scope_->extensions_);
   } else {
@@ -2044,10 +1827,6 @@
   }
 }
 
-inline const FileDescriptor* OneofDescriptor::file() const {
-  return containing_type()->file();
-}
-
 inline int OneofDescriptor::index() const {
   return static_cast<int>(this - containing_type_->oneof_decls_);
 }
@@ -2060,10 +1839,6 @@
   }
 }
 
-inline const FileDescriptor* EnumValueDescriptor::file() const {
-  return type()->file();
-}
-
 inline int EnumValueDescriptor::index() const {
   return static_cast<int>(this - type_->values_);
 }
@@ -2072,24 +1847,20 @@
   return static_cast<int>(this - file_->services_);
 }
 
-inline const FileDescriptor* MethodDescriptor::file() const {
-  return service()->file();
-}
-
 inline int MethodDescriptor::index() const {
   return static_cast<int>(this - service_->methods_);
 }
 
 inline const char* FieldDescriptor::type_name() const {
-  return kTypeToName[type()];
+  return kTypeToName[type_];
 }
 
 inline FieldDescriptor::CppType FieldDescriptor::cpp_type() const {
-  return kTypeToCppTypeMap[type()];
+  return kTypeToCppTypeMap[type_];
 }
 
 inline const char* FieldDescriptor::cpp_type_name() const {
-  return kCppTypeToName[kTypeToCppTypeMap[type()]];
+  return kCppTypeToName[kTypeToCppTypeMap[type_]];
 }
 
 inline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) {
@@ -2111,14 +1882,18 @@
           field_type != FieldDescriptor::TYPE_BYTES);
 }
 
+inline const FileDescriptor* FileDescriptor::dependency(int index) const {
+  return dependencies_[index];
+}
+
 inline const FileDescriptor* FileDescriptor::public_dependency(
     int index) const {
-  return dependency(public_dependencies_[index]);
+  return dependencies_[public_dependencies_[index]];
 }
 
 inline const FileDescriptor* FileDescriptor::weak_dependency(
     int index) const {
-  return dependency(weak_dependencies_[index]);
+  return dependencies_[weak_dependencies_[index]];
 }
 
 inline FileDescriptor::Syntax FileDescriptor::syntax() const {
diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc
index ab1b499..0c9af58 100644
--- a/src/google/protobuf/descriptor.pb.cc
+++ b/src/google/protobuf/descriptor.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/descriptor.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/descriptor.pb.h>
 
 #include <algorithm>
@@ -14,1395 +15,4142 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class FileDescriptorSetDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FileDescriptorSet>
-      _instance;
-} _FileDescriptorSet_default_instance_;
-class FileDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FileDescriptorProto>
-      _instance;
-} _FileDescriptorProto_default_instance_;
-class DescriptorProto_ExtensionRangeDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<DescriptorProto_ExtensionRange>
-      _instance;
-} _DescriptorProto_ExtensionRange_default_instance_;
-class DescriptorProto_ReservedRangeDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<DescriptorProto_ReservedRange>
-      _instance;
-} _DescriptorProto_ReservedRange_default_instance_;
-class DescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<DescriptorProto>
-      _instance;
-} _DescriptorProto_default_instance_;
-class ExtensionRangeOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<ExtensionRangeOptions>
-      _instance;
-} _ExtensionRangeOptions_default_instance_;
-class FieldDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FieldDescriptorProto>
-      _instance;
-} _FieldDescriptorProto_default_instance_;
-class OneofDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<OneofDescriptorProto>
-      _instance;
-} _OneofDescriptorProto_default_instance_;
-class EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<EnumDescriptorProto_EnumReservedRange>
-      _instance;
-} _EnumDescriptorProto_EnumReservedRange_default_instance_;
-class EnumDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<EnumDescriptorProto>
-      _instance;
-} _EnumDescriptorProto_default_instance_;
-class EnumValueDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<EnumValueDescriptorProto>
-      _instance;
-} _EnumValueDescriptorProto_default_instance_;
-class ServiceDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<ServiceDescriptorProto>
-      _instance;
-} _ServiceDescriptorProto_default_instance_;
-class MethodDescriptorProtoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<MethodDescriptorProto>
-      _instance;
-} _MethodDescriptorProto_default_instance_;
-class FileOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FileOptions>
-      _instance;
-} _FileOptions_default_instance_;
-class MessageOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<MessageOptions>
-      _instance;
-} _MessageOptions_default_instance_;
-class FieldOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FieldOptions>
-      _instance;
-} _FieldOptions_default_instance_;
-class OneofOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<OneofOptions>
-      _instance;
-} _OneofOptions_default_instance_;
-class EnumOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<EnumOptions>
-      _instance;
-} _EnumOptions_default_instance_;
-class EnumValueOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<EnumValueOptions>
-      _instance;
-} _EnumValueOptions_default_instance_;
-class ServiceOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<ServiceOptions>
-      _instance;
-} _ServiceOptions_default_instance_;
-class MethodOptionsDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<MethodOptions>
-      _instance;
-} _MethodOptions_default_instance_;
-class UninterpretedOption_NamePartDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<UninterpretedOption_NamePart>
-      _instance;
-} _UninterpretedOption_NamePart_default_instance_;
-class UninterpretedOptionDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<UninterpretedOption>
-      _instance;
-} _UninterpretedOption_default_instance_;
-class SourceCodeInfo_LocationDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<SourceCodeInfo_Location>
-      _instance;
-} _SourceCodeInfo_Location_default_instance_;
-class SourceCodeInfoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<SourceCodeInfo>
-      _instance;
-} _SourceCodeInfo_default_instance_;
-class GeneratedCodeInfo_AnnotationDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<GeneratedCodeInfo_Annotation>
-      _instance;
-} _GeneratedCodeInfo_Annotation_default_instance_;
-class GeneratedCodeInfoDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<GeneratedCodeInfo>
-      _instance;
-} _GeneratedCodeInfo_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto {
-void InitDefaultsFileDescriptorSetImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto();
-  {
-    void* ptr = &::google::protobuf::_FileDescriptorSet_default_instance_;
-    new (ptr) ::google::protobuf::FileDescriptorSet();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FileDescriptorSet::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* FileDescriptorSet_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FileDescriptorSet_reflection_ = NULL;
+const ::google::protobuf::Descriptor* FileDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FileDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* DescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  DescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  DescriptorProto_ExtensionRange_reflection_ = NULL;
+const ::google::protobuf::Descriptor* DescriptorProto_ReservedRange_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  DescriptorProto_ReservedRange_reflection_ = NULL;
+const ::google::protobuf::Descriptor* FieldDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FieldDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor_ = NULL;
+const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor_ = NULL;
+const ::google::protobuf::Descriptor* OneofDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  OneofDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* EnumDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  EnumDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* EnumValueDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  EnumValueDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* ServiceDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  ServiceDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* MethodDescriptorProto_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  MethodDescriptorProto_reflection_ = NULL;
+const ::google::protobuf::Descriptor* FileOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FileOptions_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor_ = NULL;
+const ::google::protobuf::Descriptor* MessageOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  MessageOptions_reflection_ = NULL;
+const ::google::protobuf::Descriptor* FieldOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FieldOptions_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor_ = NULL;
+const ::google::protobuf::EnumDescriptor* FieldOptions_JSType_descriptor_ = NULL;
+const ::google::protobuf::Descriptor* EnumOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  EnumOptions_reflection_ = NULL;
+const ::google::protobuf::Descriptor* EnumValueOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  EnumValueOptions_reflection_ = NULL;
+const ::google::protobuf::Descriptor* ServiceOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  ServiceOptions_reflection_ = NULL;
+const ::google::protobuf::Descriptor* MethodOptions_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  MethodOptions_reflection_ = NULL;
+const ::google::protobuf::Descriptor* UninterpretedOption_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  UninterpretedOption_reflection_ = NULL;
+const ::google::protobuf::Descriptor* UninterpretedOption_NamePart_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  UninterpretedOption_NamePart_reflection_ = NULL;
+const ::google::protobuf::Descriptor* SourceCodeInfo_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  SourceCodeInfo_reflection_ = NULL;
+const ::google::protobuf::Descriptor* SourceCodeInfo_Location_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  SourceCodeInfo_Location_reflection_ = NULL;
+const ::google::protobuf::Descriptor* GeneratedCodeInfo_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  GeneratedCodeInfo_reflection_ = NULL;
+const ::google::protobuf::Descriptor* GeneratedCodeInfo_Annotation_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  GeneratedCodeInfo_Annotation_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/descriptor.proto");
+  GOOGLE_CHECK(file != NULL);
+  FileDescriptorSet_descriptor_ = file->message_type(0);
+  static const int FileDescriptorSet_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, file_),
+  };
+  FileDescriptorSet_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FileDescriptorSet_descriptor_,
+      FileDescriptorSet::default_instance_,
+      FileDescriptorSet_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(FileDescriptorSet),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _internal_metadata_),
+      -1);
+  FileDescriptorProto_descriptor_ = file->message_type(1);
+  static const int FileDescriptorProto_offsets_[12] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, package_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, dependency_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, public_dependency_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, weak_dependency_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, message_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, enum_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, service_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, extension_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, source_code_info_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, syntax_),
+  };
+  FileDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FileDescriptorProto_descriptor_,
+      FileDescriptorProto::default_instance_,
+      FileDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(FileDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _internal_metadata_),
+      -1);
+  DescriptorProto_descriptor_ = file->message_type(2);
+  static const int DescriptorProto_offsets_[10] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, field_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, nested_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, enum_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_range_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, oneof_decl_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, reserved_range_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, reserved_name_),
+  };
+  DescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      DescriptorProto_descriptor_,
+      DescriptorProto::default_instance_,
+      DescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(DescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _internal_metadata_),
+      -1);
+  DescriptorProto_ExtensionRange_descriptor_ = DescriptorProto_descriptor_->nested_type(0);
+  static const int DescriptorProto_ExtensionRange_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, start_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, end_),
+  };
+  DescriptorProto_ExtensionRange_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      DescriptorProto_ExtensionRange_descriptor_,
+      DescriptorProto_ExtensionRange::default_instance_,
+      DescriptorProto_ExtensionRange_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(DescriptorProto_ExtensionRange),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _internal_metadata_),
+      -1);
+  DescriptorProto_ReservedRange_descriptor_ = DescriptorProto_descriptor_->nested_type(1);
+  static const int DescriptorProto_ReservedRange_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ReservedRange, start_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ReservedRange, end_),
+  };
+  DescriptorProto_ReservedRange_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      DescriptorProto_ReservedRange_descriptor_,
+      DescriptorProto_ReservedRange::default_instance_,
+      DescriptorProto_ReservedRange_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ReservedRange, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(DescriptorProto_ReservedRange),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ReservedRange, _internal_metadata_),
+      -1);
+  FieldDescriptorProto_descriptor_ = file->message_type(3);
+  static const int FieldDescriptorProto_offsets_[10] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, number_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, label_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, extendee_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, default_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, oneof_index_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, json_name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, options_),
+  };
+  FieldDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FieldDescriptorProto_descriptor_,
+      FieldDescriptorProto::default_instance_,
+      FieldDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(FieldDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _internal_metadata_),
+      -1);
+  FieldDescriptorProto_Type_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(0);
+  FieldDescriptorProto_Label_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(1);
+  OneofDescriptorProto_descriptor_ = file->message_type(4);
+  static const int OneofDescriptorProto_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OneofDescriptorProto, name_),
+  };
+  OneofDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      OneofDescriptorProto_descriptor_,
+      OneofDescriptorProto::default_instance_,
+      OneofDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OneofDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(OneofDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OneofDescriptorProto, _internal_metadata_),
+      -1);
+  EnumDescriptorProto_descriptor_ = file->message_type(5);
+  static const int EnumDescriptorProto_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, options_),
+  };
+  EnumDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      EnumDescriptorProto_descriptor_,
+      EnumDescriptorProto::default_instance_,
+      EnumDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(EnumDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _internal_metadata_),
+      -1);
+  EnumValueDescriptorProto_descriptor_ = file->message_type(6);
+  static const int EnumValueDescriptorProto_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, number_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, options_),
+  };
+  EnumValueDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      EnumValueDescriptorProto_descriptor_,
+      EnumValueDescriptorProto::default_instance_,
+      EnumValueDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(EnumValueDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _internal_metadata_),
+      -1);
+  ServiceDescriptorProto_descriptor_ = file->message_type(7);
+  static const int ServiceDescriptorProto_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, method_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, options_),
+  };
+  ServiceDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      ServiceDescriptorProto_descriptor_,
+      ServiceDescriptorProto::default_instance_,
+      ServiceDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(ServiceDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _internal_metadata_),
+      -1);
+  MethodDescriptorProto_descriptor_ = file->message_type(8);
+  static const int MethodDescriptorProto_offsets_[6] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, input_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, output_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, client_streaming_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, server_streaming_),
+  };
+  MethodDescriptorProto_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      MethodDescriptorProto_descriptor_,
+      MethodDescriptorProto::default_instance_,
+      MethodDescriptorProto_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(MethodDescriptorProto),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _internal_metadata_),
+      -1);
+  FileOptions_descriptor_ = file->message_type(9);
+  static const int FileOptions_offsets_[15] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_package_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_outer_classname_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_multiple_files_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generate_equals_and_hash_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_string_check_utf8_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, optimize_for_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, go_package_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, cc_generic_services_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generic_services_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, py_generic_services_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, cc_enable_arenas_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, objc_class_prefix_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, csharp_namespace_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, uninterpreted_option_),
+  };
+  FileOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FileOptions_descriptor_,
+      FileOptions::default_instance_,
+      FileOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _extensions_),
+      sizeof(FileOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _internal_metadata_),
+      -1);
+  FileOptions_OptimizeMode_descriptor_ = FileOptions_descriptor_->enum_type(0);
+  MessageOptions_descriptor_ = file->message_type(10);
+  static const int MessageOptions_offsets_[5] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, message_set_wire_format_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, no_standard_descriptor_accessor_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, map_entry_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, uninterpreted_option_),
+  };
+  MessageOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      MessageOptions_descriptor_,
+      MessageOptions::default_instance_,
+      MessageOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _extensions_),
+      sizeof(MessageOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _internal_metadata_),
+      -1);
+  FieldOptions_descriptor_ = file->message_type(11);
+  static const int FieldOptions_offsets_[7] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, ctype_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, packed_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, jstype_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, lazy_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, weak_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, uninterpreted_option_),
+  };
+  FieldOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FieldOptions_descriptor_,
+      FieldOptions::default_instance_,
+      FieldOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _extensions_),
+      sizeof(FieldOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _internal_metadata_),
+      -1);
+  FieldOptions_CType_descriptor_ = FieldOptions_descriptor_->enum_type(0);
+  FieldOptions_JSType_descriptor_ = FieldOptions_descriptor_->enum_type(1);
+  EnumOptions_descriptor_ = file->message_type(12);
+  static const int EnumOptions_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, allow_alias_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, uninterpreted_option_),
+  };
+  EnumOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      EnumOptions_descriptor_,
+      EnumOptions::default_instance_,
+      EnumOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _extensions_),
+      sizeof(EnumOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _internal_metadata_),
+      -1);
+  EnumValueOptions_descriptor_ = file->message_type(13);
+  static const int EnumValueOptions_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, uninterpreted_option_),
+  };
+  EnumValueOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      EnumValueOptions_descriptor_,
+      EnumValueOptions::default_instance_,
+      EnumValueOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _extensions_),
+      sizeof(EnumValueOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _internal_metadata_),
+      -1);
+  ServiceOptions_descriptor_ = file->message_type(14);
+  static const int ServiceOptions_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, uninterpreted_option_),
+  };
+  ServiceOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      ServiceOptions_descriptor_,
+      ServiceOptions::default_instance_,
+      ServiceOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _extensions_),
+      sizeof(ServiceOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _internal_metadata_),
+      -1);
+  MethodOptions_descriptor_ = file->message_type(15);
+  static const int MethodOptions_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, deprecated_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, uninterpreted_option_),
+  };
+  MethodOptions_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      MethodOptions_descriptor_,
+      MethodOptions::default_instance_,
+      MethodOptions_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _has_bits_[0]),
+      -1,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _extensions_),
+      sizeof(MethodOptions),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _internal_metadata_),
+      -1);
+  UninterpretedOption_descriptor_ = file->message_type(16);
+  static const int UninterpretedOption_offsets_[7] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, identifier_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, positive_int_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, negative_int_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, double_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, string_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, aggregate_value_),
+  };
+  UninterpretedOption_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      UninterpretedOption_descriptor_,
+      UninterpretedOption::default_instance_,
+      UninterpretedOption_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(UninterpretedOption),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _internal_metadata_),
+      -1);
+  UninterpretedOption_NamePart_descriptor_ = UninterpretedOption_descriptor_->nested_type(0);
+  static const int UninterpretedOption_NamePart_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, name_part_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, is_extension_),
+  };
+  UninterpretedOption_NamePart_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      UninterpretedOption_NamePart_descriptor_,
+      UninterpretedOption_NamePart::default_instance_,
+      UninterpretedOption_NamePart_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(UninterpretedOption_NamePart),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _internal_metadata_),
+      -1);
+  SourceCodeInfo_descriptor_ = file->message_type(17);
+  static const int SourceCodeInfo_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, location_),
+  };
+  SourceCodeInfo_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      SourceCodeInfo_descriptor_,
+      SourceCodeInfo::default_instance_,
+      SourceCodeInfo_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(SourceCodeInfo),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _internal_metadata_),
+      -1);
+  SourceCodeInfo_Location_descriptor_ = SourceCodeInfo_descriptor_->nested_type(0);
+  static const int SourceCodeInfo_Location_offsets_[5] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, path_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, span_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, leading_comments_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, trailing_comments_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, leading_detached_comments_),
+  };
+  SourceCodeInfo_Location_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      SourceCodeInfo_Location_descriptor_,
+      SourceCodeInfo_Location::default_instance_,
+      SourceCodeInfo_Location_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(SourceCodeInfo_Location),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _internal_metadata_),
+      -1);
+  GeneratedCodeInfo_descriptor_ = file->message_type(18);
+  static const int GeneratedCodeInfo_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo, annotation_),
+  };
+  GeneratedCodeInfo_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      GeneratedCodeInfo_descriptor_,
+      GeneratedCodeInfo::default_instance_,
+      GeneratedCodeInfo_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(GeneratedCodeInfo),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo, _internal_metadata_),
+      -1);
+  GeneratedCodeInfo_Annotation_descriptor_ = GeneratedCodeInfo_descriptor_->nested_type(0);
+  static const int GeneratedCodeInfo_Annotation_offsets_[4] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo_Annotation, path_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo_Annotation, source_file_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo_Annotation, begin_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo_Annotation, end_),
+  };
+  GeneratedCodeInfo_Annotation_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      GeneratedCodeInfo_Annotation_descriptor_,
+      GeneratedCodeInfo_Annotation::default_instance_,
+      GeneratedCodeInfo_Annotation_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _has_bits_[0]),
+      -1,
+      -1,
+      sizeof(GeneratedCodeInfo_Annotation),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _internal_metadata_),
+      -1);
 }
 
-void InitDefaultsFileDescriptorSet() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFileDescriptorSetImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto);
 }
 
-void InitDefaultsFileDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo();
-  {
-    void* ptr = &::google::protobuf::_FileDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::FileDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FileDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsFileDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFileDescriptorProtoImpl);
-}
-
-void InitDefaultsDescriptorProto_ExtensionRangeImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions();
-  {
-    void* ptr = &::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_;
-    new (ptr) ::google::protobuf::DescriptorProto_ExtensionRange();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::DescriptorProto_ExtensionRange::InitAsDefaultInstance();
-}
-
-void InitDefaultsDescriptorProto_ExtensionRange() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDescriptorProto_ExtensionRangeImpl);
-}
-
-void InitDefaultsDescriptorProto_ReservedRangeImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_DescriptorProto_ReservedRange_default_instance_;
-    new (ptr) ::google::protobuf::DescriptorProto_ReservedRange();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::DescriptorProto_ReservedRange::InitAsDefaultInstance();
-}
-
-void InitDefaultsDescriptorProto_ReservedRange() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDescriptorProto_ReservedRangeImpl);
-}
-
-void InitDefaultsDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange();
-  {
-    void* ptr = &::google::protobuf::_DescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::DescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::DescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDescriptorProtoImpl);
-}
-
-void InitDefaultsExtensionRangeOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_ExtensionRangeOptions_default_instance_;
-    new (ptr) ::google::protobuf::ExtensionRangeOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::ExtensionRangeOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsExtensionRangeOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsExtensionRangeOptionsImpl);
-}
-
-void InitDefaultsFieldDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions();
-  {
-    void* ptr = &::google::protobuf::_FieldDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::FieldDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FieldDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsFieldDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldDescriptorProtoImpl);
-}
-
-void InitDefaultsOneofDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions();
-  {
-    void* ptr = &::google::protobuf::_OneofDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::OneofDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::OneofDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsOneofDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsOneofDescriptorProtoImpl);
-}
-
-void InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_EnumDescriptorProto_EnumReservedRange_default_instance_;
-    new (ptr) ::google::protobuf::EnumDescriptorProto_EnumReservedRange();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::EnumDescriptorProto_EnumReservedRange::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnumDescriptorProto_EnumReservedRange() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl);
-}
-
-void InitDefaultsEnumDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange();
-  {
-    void* ptr = &::google::protobuf::_EnumDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::EnumDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::EnumDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnumDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumDescriptorProtoImpl);
-}
-
-void InitDefaultsEnumValueDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions();
-  {
-    void* ptr = &::google::protobuf::_EnumValueDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::EnumValueDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::EnumValueDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnumValueDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumValueDescriptorProtoImpl);
-}
-
-void InitDefaultsServiceDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto();
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions();
-  {
-    void* ptr = &::google::protobuf::_ServiceDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::ServiceDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::ServiceDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsServiceDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsServiceDescriptorProtoImpl);
-}
-
-void InitDefaultsMethodDescriptorProtoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions();
-  {
-    void* ptr = &::google::protobuf::_MethodDescriptorProto_default_instance_;
-    new (ptr) ::google::protobuf::MethodDescriptorProto();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::MethodDescriptorProto::InitAsDefaultInstance();
-}
-
-void InitDefaultsMethodDescriptorProto() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMethodDescriptorProtoImpl);
-}
-
-void InitDefaultsFileOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_FileOptions_default_instance_;
-    new (ptr) ::google::protobuf::FileOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FileOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsFileOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFileOptionsImpl);
-}
-
-void InitDefaultsMessageOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_MessageOptions_default_instance_;
-    new (ptr) ::google::protobuf::MessageOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::MessageOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsMessageOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMessageOptionsImpl);
-}
-
-void InitDefaultsFieldOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_FieldOptions_default_instance_;
-    new (ptr) ::google::protobuf::FieldOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FieldOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsFieldOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldOptionsImpl);
-}
-
-void InitDefaultsOneofOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_OneofOptions_default_instance_;
-    new (ptr) ::google::protobuf::OneofOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::OneofOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsOneofOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsOneofOptionsImpl);
-}
-
-void InitDefaultsEnumOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_EnumOptions_default_instance_;
-    new (ptr) ::google::protobuf::EnumOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::EnumOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnumOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumOptionsImpl);
-}
-
-void InitDefaultsEnumValueOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_EnumValueOptions_default_instance_;
-    new (ptr) ::google::protobuf::EnumValueOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::EnumValueOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnumValueOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumValueOptionsImpl);
-}
-
-void InitDefaultsServiceOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_ServiceOptions_default_instance_;
-    new (ptr) ::google::protobuf::ServiceOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::ServiceOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsServiceOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsServiceOptionsImpl);
-}
-
-void InitDefaultsMethodOptionsImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  {
-    void* ptr = &::google::protobuf::_MethodOptions_default_instance_;
-    new (ptr) ::google::protobuf::MethodOptions();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::MethodOptions::InitAsDefaultInstance();
-}
-
-void InitDefaultsMethodOptions() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMethodOptionsImpl);
-}
-
-void InitDefaultsUninterpretedOption_NamePartImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_UninterpretedOption_NamePart_default_instance_;
-    new (ptr) ::google::protobuf::UninterpretedOption_NamePart();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::UninterpretedOption_NamePart::InitAsDefaultInstance();
-}
-
-void InitDefaultsUninterpretedOption_NamePart() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUninterpretedOption_NamePartImpl);
-}
-
-void InitDefaultsUninterpretedOptionImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart();
-  {
-    void* ptr = &::google::protobuf::_UninterpretedOption_default_instance_;
-    new (ptr) ::google::protobuf::UninterpretedOption();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::UninterpretedOption::InitAsDefaultInstance();
-}
-
-void InitDefaultsUninterpretedOption() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUninterpretedOptionImpl);
-}
-
-void InitDefaultsSourceCodeInfo_LocationImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_SourceCodeInfo_Location_default_instance_;
-    new (ptr) ::google::protobuf::SourceCodeInfo_Location();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::SourceCodeInfo_Location::InitAsDefaultInstance();
-}
-
-void InitDefaultsSourceCodeInfo_Location() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsSourceCodeInfo_LocationImpl);
-}
-
-void InitDefaultsSourceCodeInfoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location();
-  {
-    void* ptr = &::google::protobuf::_SourceCodeInfo_default_instance_;
-    new (ptr) ::google::protobuf::SourceCodeInfo();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::SourceCodeInfo::InitAsDefaultInstance();
-}
-
-void InitDefaultsSourceCodeInfo() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsSourceCodeInfoImpl);
-}
-
-void InitDefaultsGeneratedCodeInfo_AnnotationImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_GeneratedCodeInfo_Annotation_default_instance_;
-    new (ptr) ::google::protobuf::GeneratedCodeInfo_Annotation();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::GeneratedCodeInfo_Annotation::InitAsDefaultInstance();
-}
-
-void InitDefaultsGeneratedCodeInfo_Annotation() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsGeneratedCodeInfo_AnnotationImpl);
-}
-
-void InitDefaultsGeneratedCodeInfoImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation();
-  {
-    void* ptr = &::google::protobuf::_GeneratedCodeInfo_default_instance_;
-    new (ptr) ::google::protobuf::GeneratedCodeInfo();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::GeneratedCodeInfo::InitAsDefaultInstance();
-}
-
-void InitDefaultsGeneratedCodeInfo() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsGeneratedCodeInfoImpl);
-}
-
-::google::protobuf::Metadata file_level_metadata[27];
-const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors[6];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, file_),
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, package_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, dependency_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, public_dependency_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, weak_dependency_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, message_type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, enum_type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, service_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, extension_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, source_code_info_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, syntax_),
-  0,
-  1,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  3,
-  4,
-  2,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, start_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, end_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, options_),
-  1,
-  2,
-  0,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, start_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, end_),
-  0,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, field_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, extension_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, nested_type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, enum_type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, extension_range_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, oneof_decl_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, reserved_range_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, reserved_name_),
-  0,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  ~0u,
-  1,
-  ~0u,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, uninterpreted_option_),
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, number_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, label_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, type_name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, extendee_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, default_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, oneof_index_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, json_name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, options_),
-  0,
-  6,
-  8,
-  9,
-  2,
-  1,
-  3,
-  7,
-  4,
-  5,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, options_),
-  0,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, start_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, end_),
-  0,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, reserved_range_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, reserved_name_),
-  0,
-  ~0u,
-  1,
-  ~0u,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, number_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, options_),
-  0,
-  2,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, method_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, options_),
-  0,
-  ~0u,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, input_type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, output_type_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, client_streaming_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, server_streaming_),
-  0,
-  1,
-  2,
-  3,
-  4,
-  5,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_package_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_outer_classname_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_multiple_files_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_generate_equals_and_hash_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_string_check_utf8_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, optimize_for_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, go_package_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, cc_generic_services_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_generic_services_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, py_generic_services_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, php_generic_services_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, cc_enable_arenas_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, objc_class_prefix_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, csharp_namespace_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, swift_prefix_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, php_class_prefix_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, php_namespace_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, uninterpreted_option_),
-  0,
-  1,
-  9,
-  10,
-  11,
-  17,
-  2,
-  12,
-  13,
-  14,
-  15,
-  16,
-  8,
-  3,
-  4,
-  5,
-  6,
-  7,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, message_set_wire_format_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, no_standard_descriptor_accessor_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, map_entry_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, uninterpreted_option_),
-  0,
-  1,
-  2,
-  3,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, ctype_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, packed_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, jstype_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, lazy_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, weak_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, uninterpreted_option_),
-  0,
-  1,
-  5,
-  2,
-  3,
-  4,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, uninterpreted_option_),
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, allow_alias_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, uninterpreted_option_),
-  0,
-  1,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, uninterpreted_option_),
-  0,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, uninterpreted_option_),
-  0,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, _internal_metadata_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, _extensions_),
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, deprecated_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, idempotency_level_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, uninterpreted_option_),
-  0,
-  1,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, name_part_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, is_extension_),
-  0,
-  1,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, identifier_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, positive_int_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, negative_int_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, double_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, string_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, aggregate_value_),
-  ~0u,
-  0,
-  3,
-  4,
-  5,
-  1,
-  2,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, path_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, span_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, leading_comments_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, trailing_comments_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, leading_detached_comments_),
-  ~0u,
-  ~0u,
-  0,
-  1,
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, location_),
-  ~0u,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, path_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, source_file_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, begin_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, end_),
-  ~0u,
-  0,
-  1,
-  2,
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, annotation_),
-  ~0u,
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, 6, sizeof(::google::protobuf::FileDescriptorSet)},
-  { 7, 24, sizeof(::google::protobuf::FileDescriptorProto)},
-  { 36, 44, sizeof(::google::protobuf::DescriptorProto_ExtensionRange)},
-  { 47, 54, sizeof(::google::protobuf::DescriptorProto_ReservedRange)},
-  { 56, 71, sizeof(::google::protobuf::DescriptorProto)},
-  { 81, 87, sizeof(::google::protobuf::ExtensionRangeOptions)},
-  { 88, 103, sizeof(::google::protobuf::FieldDescriptorProto)},
-  { 113, 120, sizeof(::google::protobuf::OneofDescriptorProto)},
-  { 122, 129, sizeof(::google::protobuf::EnumDescriptorProto_EnumReservedRange)},
-  { 131, 141, sizeof(::google::protobuf::EnumDescriptorProto)},
-  { 146, 154, sizeof(::google::protobuf::EnumValueDescriptorProto)},
-  { 157, 165, sizeof(::google::protobuf::ServiceDescriptorProto)},
-  { 168, 179, sizeof(::google::protobuf::MethodDescriptorProto)},
-  { 185, 209, sizeof(::google::protobuf::FileOptions)},
-  { 228, 238, sizeof(::google::protobuf::MessageOptions)},
-  { 243, 255, sizeof(::google::protobuf::FieldOptions)},
-  { 262, 268, sizeof(::google::protobuf::OneofOptions)},
-  { 269, 277, sizeof(::google::protobuf::EnumOptions)},
-  { 280, 287, sizeof(::google::protobuf::EnumValueOptions)},
-  { 289, 296, sizeof(::google::protobuf::ServiceOptions)},
-  { 298, 306, sizeof(::google::protobuf::MethodOptions)},
-  { 309, 316, sizeof(::google::protobuf::UninterpretedOption_NamePart)},
-  { 318, 330, sizeof(::google::protobuf::UninterpretedOption)},
-  { 337, 347, sizeof(::google::protobuf::SourceCodeInfo_Location)},
-  { 352, 358, sizeof(::google::protobuf::SourceCodeInfo)},
-  { 359, 368, sizeof(::google::protobuf::GeneratedCodeInfo_Annotation)},
-  { 372, 378, sizeof(::google::protobuf::GeneratedCodeInfo)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FileDescriptorSet_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FileDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_DescriptorProto_ReservedRange_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_DescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_ExtensionRangeOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FieldDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_OneofDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_EnumDescriptorProto_EnumReservedRange_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_EnumDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_EnumValueDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_ServiceDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_MethodDescriptorProto_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FileOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_MessageOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FieldOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_OneofOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_EnumOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_EnumValueOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_ServiceOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_MethodOptions_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_UninterpretedOption_NamePart_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_UninterpretedOption_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_SourceCodeInfo_Location_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_SourceCodeInfo_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_GeneratedCodeInfo_Annotation_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_GeneratedCodeInfo_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/descriptor.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, file_level_enum_descriptors, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 27);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FileDescriptorSet_descriptor_, &FileDescriptorSet::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FileDescriptorProto_descriptor_, &FileDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      DescriptorProto_descriptor_, &DescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      DescriptorProto_ExtensionRange_descriptor_, &DescriptorProto_ExtensionRange::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      DescriptorProto_ReservedRange_descriptor_, &DescriptorProto_ReservedRange::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FieldDescriptorProto_descriptor_, &FieldDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      OneofDescriptorProto_descriptor_, &OneofDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      EnumDescriptorProto_descriptor_, &EnumDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      EnumValueDescriptorProto_descriptor_, &EnumValueDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      ServiceDescriptorProto_descriptor_, &ServiceDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      MethodDescriptorProto_descriptor_, &MethodDescriptorProto::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FileOptions_descriptor_, &FileOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      MessageOptions_descriptor_, &MessageOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FieldOptions_descriptor_, &FieldOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      EnumOptions_descriptor_, &EnumOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      EnumValueOptions_descriptor_, &EnumValueOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      ServiceOptions_descriptor_, &ServiceOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      MethodOptions_descriptor_, &MethodOptions::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      UninterpretedOption_descriptor_, &UninterpretedOption::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      UninterpretedOption_NamePart_descriptor_, &UninterpretedOption_NamePart::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      SourceCodeInfo_descriptor_, &SourceCodeInfo::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      SourceCodeInfo_Location_descriptor_, &SourceCodeInfo_Location::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      GeneratedCodeInfo_descriptor_, &GeneratedCodeInfo::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      GeneratedCodeInfo_Annotation_descriptor_, &GeneratedCodeInfo_Annotation::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n google/protobuf/descriptor.proto\022\017goog"
-      "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file"
-      "\030\001 \003(\0132$.google.protobuf.FileDescriptorP"
-      "roto\"\333\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001"
-      "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022"
-      "\031\n\021public_dependency\030\n \003(\005\022\027\n\017weak_depen"
-      "dency\030\013 \003(\005\0226\n\014message_type\030\004 \003(\0132 .goog"
-      "le.protobuf.DescriptorProto\0227\n\tenum_type"
-      "\030\005 \003(\0132$.google.protobuf.EnumDescriptorP"
-      "roto\0228\n\007service\030\006 \003(\0132\'.google.protobuf."
-      "ServiceDescriptorProto\0228\n\textension\030\007 \003("
-      "\0132%.google.protobuf.FieldDescriptorProto"
-      "\022-\n\007options\030\010 \001(\0132\034.google.protobuf.File"
-      "Options\0229\n\020source_code_info\030\t \001(\0132\037.goog"
-      "le.protobuf.SourceCodeInfo\022\016\n\006syntax\030\014 \001"
-      "(\t\"\251\005\n\017DescriptorProto\022\014\n\004name\030\001 \001(\t\0224\n\005"
-      "field\030\002 \003(\0132%.google.protobuf.FieldDescr"
-      "iptorProto\0228\n\textension\030\006 \003(\0132%.google.p"
-      "rotobuf.FieldDescriptorProto\0225\n\013nested_t"
-      "ype\030\003 \003(\0132 .google.protobuf.DescriptorPr"
-      "oto\0227\n\tenum_type\030\004 \003(\0132$.google.protobuf"
-      ".EnumDescriptorProto\022H\n\017extension_range\030"
-      "\005 \003(\0132/.google.protobuf.DescriptorProto."
-      "ExtensionRange\0229\n\noneof_decl\030\010 \003(\0132%.goo"
-      "gle.protobuf.OneofDescriptorProto\0220\n\007opt"
-      "ions\030\007 \001(\0132\037.google.protobuf.MessageOpti"
-      "ons\022F\n\016reserved_range\030\t \003(\0132..google.pro"
-      "tobuf.DescriptorProto.ReservedRange\022\025\n\rr"
-      "eserved_name\030\n \003(\t\032e\n\016ExtensionRange\022\r\n\005"
-      "start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\0227\n\007options\030\003 \001("
-      "\0132&.google.protobuf.ExtensionRangeOption"
-      "s\032+\n\rReservedRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end"
-      "\030\002 \001(\005\"g\n\025ExtensionRangeOptions\022C\n\024unint"
-      "erpreted_option\030\347\007 \003(\0132$.google.protobuf"
-      ".UninterpretedOption*\t\010\350\007\020\200\200\200\200\002\"\274\005\n\024Fiel"
-      "dDescriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n\006number"
-      "\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+.google.protobuf."
-      "FieldDescriptorProto.Label\0228\n\004type\030\005 \001(\016"
-      "2*.google.protobuf.FieldDescriptorProto."
-      "Type\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010extendee\030\002 \001("
-      "\t\022\025\n\rdefault_value\030\007 \001(\t\022\023\n\013oneof_index\030"
-      "\t \001(\005\022\021\n\tjson_name\030\n \001(\t\022.\n\007options\030\010 \001("
-      "\0132\035.google.protobuf.FieldOptions\"\266\002\n\004Typ"
-      "e\022\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTY"
-      "PE_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT3"
-      "2\020\005\022\020\n\014TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022"
-      "\r\n\tTYPE_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_"
-      "GROUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020"
-      "\014\022\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYP"
-      "E_SFIXED32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_"
-      "SINT32\020\021\022\017\n\013TYPE_SINT64\020\022\"C\n\005Label\022\022\n\016LA"
-      "BEL_OPTIONAL\020\001\022\022\n\016LABEL_REQUIRED\020\002\022\022\n\016LA"
-      "BEL_REPEATED\020\003\"T\n\024OneofDescriptorProto\022\014"
-      "\n\004name\030\001 \001(\t\022.\n\007options\030\002 \001(\0132\035.google.p"
-      "rotobuf.OneofOptions\"\244\002\n\023EnumDescriptorP"
-      "roto\022\014\n\004name\030\001 \001(\t\0228\n\005value\030\002 \003(\0132).goog"
-      "le.protobuf.EnumValueDescriptorProto\022-\n\007"
-      "options\030\003 \001(\0132\034.google.protobuf.EnumOpti"
-      "ons\022N\n\016reserved_range\030\004 \003(\01326.google.pro"
-      "tobuf.EnumDescriptorProto.EnumReservedRa"
-      "nge\022\025\n\rreserved_name\030\005 \003(\t\032/\n\021EnumReserv"
-      "edRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"l\n\030E"
-      "numValueDescriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n"
-      "\006number\030\002 \001(\005\0222\n\007options\030\003 \001(\0132!.google."
-      "protobuf.EnumValueOptions\"\220\001\n\026ServiceDes"
-      "criptorProto\022\014\n\004name\030\001 \001(\t\0226\n\006method\030\002 \003"
-      "(\0132&.google.protobuf.MethodDescriptorPro"
-      "to\0220\n\007options\030\003 \001(\0132\037.google.protobuf.Se"
-      "rviceOptions\"\301\001\n\025MethodDescriptorProto\022\014"
-      "\n\004name\030\001 \001(\t\022\022\n\ninput_type\030\002 \001(\t\022\023\n\013outp"
-      "ut_type\030\003 \001(\t\022/\n\007options\030\004 \001(\0132\036.google."
-      "protobuf.MethodOptions\022\037\n\020client_streami"
-      "ng\030\005 \001(\010:\005false\022\037\n\020server_streaming\030\006 \001("
-      "\010:\005false\"\360\005\n\013FileOptions\022\024\n\014java_package"
-      "\030\001 \001(\t\022\034\n\024java_outer_classname\030\010 \001(\t\022\"\n\023"
-      "java_multiple_files\030\n \001(\010:\005false\022)\n\035java"
-      "_generate_equals_and_hash\030\024 \001(\010B\002\030\001\022%\n\026j"
-      "ava_string_check_utf8\030\033 \001(\010:\005false\022F\n\014op"
-      "timize_for\030\t \001(\0162).google.protobuf.FileO"
-      "ptions.OptimizeMode:\005SPEED\022\022\n\ngo_package"
-      "\030\013 \001(\t\022\"\n\023cc_generic_services\030\020 \001(\010:\005fal"
-      "se\022$\n\025java_generic_services\030\021 \001(\010:\005false"
-      "\022\"\n\023py_generic_services\030\022 \001(\010:\005false\022#\n\024"
-      "php_generic_services\030* \001(\010:\005false\022\031\n\ndep"
-      "recated\030\027 \001(\010:\005false\022\037\n\020cc_enable_arenas"
-      "\030\037 \001(\010:\005false\022\031\n\021objc_class_prefix\030$ \001(\t"
-      "\022\030\n\020csharp_namespace\030% \001(\t\022\024\n\014swift_pref"
-      "ix\030\' \001(\t\022\030\n\020php_class_prefix\030( \001(\t\022\025\n\rph"
-      "p_namespace\030) \001(\t\022C\n\024uninterpreted_optio"
-      "n\030\347\007 \003(\0132$.google.protobuf.Uninterpreted"
-      "Option\":\n\014OptimizeMode\022\t\n\005SPEED\020\001\022\r\n\tCOD"
-      "E_SIZE\020\002\022\020\n\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200\200\002J\004\010"
-      "&\020\'\"\362\001\n\016MessageOptions\022&\n\027message_set_wi"
-      "re_format\030\001 \001(\010:\005false\022.\n\037no_standard_de"
-      "scriptor_accessor\030\002 \001(\010:\005false\022\031\n\ndeprec"
-      "ated\030\003 \001(\010:\005false\022\021\n\tmap_entry\030\007 \001(\010\022C\n\024"
-      "uninterpreted_option\030\347\007 \003(\0132$.google.pro"
-      "tobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\010"
-      "\020\tJ\004\010\t\020\n\"\236\003\n\014FieldOptions\022:\n\005ctype\030\001 \001(\016"
-      "2#.google.protobuf.FieldOptions.CType:\006S"
-      "TRING\022\016\n\006packed\030\002 \001(\010\022\?\n\006jstype\030\006 \001(\0162$."
-      "google.protobuf.FieldOptions.JSType:\tJS_"
-      "NORMAL\022\023\n\004lazy\030\005 \001(\010:\005false\022\031\n\ndeprecate"
-      "d\030\003 \001(\010:\005false\022\023\n\004weak\030\n \001(\010:\005false\022C\n\024u"
-      "ninterpreted_option\030\347\007 \003(\0132$.google.prot"
-      "obuf.UninterpretedOption\"/\n\005CType\022\n\n\006STR"
-      "ING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_PIECE\020\002\"5\n\006JST"
-      "ype\022\r\n\tJS_NORMAL\020\000\022\r\n\tJS_STRING\020\001\022\r\n\tJS_"
-      "NUMBER\020\002*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005\"^\n\014OneofOption"
-      "s\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.googl"
-      "e.protobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200"
-      "\002\"\223\001\n\013EnumOptions\022\023\n\013allow_alias\030\002 \001(\010\022\031"
-      "\n\ndeprecated\030\003 \001(\010:\005false\022C\n\024uninterpret"
-      "ed_option\030\347\007 \003(\0132$.google.protobuf.Unint"
-      "erpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\005\020\006\"}\n\020EnumV"
-      "alueOptions\022\031\n\ndeprecated\030\001 \001(\010:\005false\022C"
-      "\n\024uninterpreted_option\030\347\007 \003(\0132$.google.p"
-      "rotobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002\"{"
-      "\n\016ServiceOptions\022\031\n\ndeprecated\030! \001(\010:\005fa"
-      "lse\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goo"
-      "gle.protobuf.UninterpretedOption*\t\010\350\007\020\200\200"
-      "\200\200\002\"\255\002\n\rMethodOptions\022\031\n\ndeprecated\030! \001("
-      "\010:\005false\022_\n\021idempotency_level\030\" \001(\0162/.go"
-      "ogle.protobuf.MethodOptions.IdempotencyL"
-      "evel:\023IDEMPOTENCY_UNKNOWN\022C\n\024uninterpret"
-      "ed_option\030\347\007 \003(\0132$.google.protobuf.Unint"
-      "erpretedOption\"P\n\020IdempotencyLevel\022\027\n\023ID"
-      "EMPOTENCY_UNKNOWN\020\000\022\023\n\017NO_SIDE_EFFECTS\020\001"
-      "\022\016\n\nIDEMPOTENT\020\002*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023Uninterp"
-      "retedOption\022;\n\004name\030\002 \003(\0132-.google.proto"
-      "buf.UninterpretedOption.NamePart\022\030\n\020iden"
-      "tifier_value\030\003 \001(\t\022\032\n\022positive_int_value"
-      "\030\004 \001(\004\022\032\n\022negative_int_value\030\005 \001(\003\022\024\n\014do"
-      "uble_value\030\006 \001(\001\022\024\n\014string_value\030\007 \001(\014\022\027"
-      "\n\017aggregate_value\030\010 \001(\t\0323\n\010NamePart\022\021\n\tn"
-      "ame_part\030\001 \002(\t\022\024\n\014is_extension\030\002 \002(\010\"\325\001\n"
-      "\016SourceCodeInfo\022:\n\010location\030\001 \003(\0132(.goog"
-      "le.protobuf.SourceCodeInfo.Location\032\206\001\n\010"
-      "Location\022\020\n\004path\030\001 \003(\005B\002\020\001\022\020\n\004span\030\002 \003(\005"
-      "B\002\020\001\022\030\n\020leading_comments\030\003 \001(\t\022\031\n\021traili"
-      "ng_comments\030\004 \001(\t\022!\n\031leading_detached_co"
-      "mments\030\006 \003(\t\"\247\001\n\021GeneratedCodeInfo\022A\n\nan"
-      "notation\030\001 \003(\0132-.google.protobuf.Generat"
-      "edCodeInfo.Annotation\032O\n\nAnnotation\022\020\n\004p"
-      "ath\030\001 \003(\005B\002\020\001\022\023\n\013source_file\030\002 \001(\t\022\r\n\005be"
-      "gin\030\003 \001(\005\022\013\n\003end\030\004 \001(\005B\217\001\n\023com.google.pr"
-      "otobufB\020DescriptorProtosH\001Z>github.com/g"
-      "olang/protobuf/protoc-gen-go/descriptor;"
-      "descriptor\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Re"
-      "flection"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto() {
+  delete FileDescriptorSet::default_instance_;
+  delete FileDescriptorSet_reflection_;
+  delete FileDescriptorProto::default_instance_;
+  delete FileDescriptorProto_reflection_;
+  delete DescriptorProto::default_instance_;
+  delete DescriptorProto_reflection_;
+  delete DescriptorProto_ExtensionRange::default_instance_;
+  delete DescriptorProto_ExtensionRange_reflection_;
+  delete DescriptorProto_ReservedRange::default_instance_;
+  delete DescriptorProto_ReservedRange_reflection_;
+  delete FieldDescriptorProto::default_instance_;
+  delete FieldDescriptorProto_reflection_;
+  delete OneofDescriptorProto::default_instance_;
+  delete OneofDescriptorProto_reflection_;
+  delete EnumDescriptorProto::default_instance_;
+  delete EnumDescriptorProto_reflection_;
+  delete EnumValueDescriptorProto::default_instance_;
+  delete EnumValueDescriptorProto_reflection_;
+  delete ServiceDescriptorProto::default_instance_;
+  delete ServiceDescriptorProto_reflection_;
+  delete MethodDescriptorProto::default_instance_;
+  delete MethodDescriptorProto_reflection_;
+  delete FileOptions::default_instance_;
+  delete FileOptions_reflection_;
+  delete MessageOptions::default_instance_;
+  delete MessageOptions_reflection_;
+  delete FieldOptions::default_instance_;
+  delete FieldOptions_reflection_;
+  delete EnumOptions::default_instance_;
+  delete EnumOptions_reflection_;
+  delete EnumValueOptions::default_instance_;
+  delete EnumValueOptions_reflection_;
+  delete ServiceOptions::default_instance_;
+  delete ServiceOptions_reflection_;
+  delete MethodOptions::default_instance_;
+  delete MethodOptions_reflection_;
+  delete UninterpretedOption::default_instance_;
+  delete UninterpretedOption_reflection_;
+  delete UninterpretedOption_NamePart::default_instance_;
+  delete UninterpretedOption_NamePart_reflection_;
+  delete SourceCodeInfo::default_instance_;
+  delete SourceCodeInfo_reflection_;
+  delete SourceCodeInfo_Location::default_instance_;
+  delete SourceCodeInfo_Location_reflection_;
+  delete GeneratedCodeInfo::default_instance_;
+  delete GeneratedCodeInfo_reflection_;
+  delete GeneratedCodeInfo_Annotation::default_instance_;
+  delete GeneratedCodeInfo_Annotation_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 5968);
+    "\n google/protobuf/descriptor.proto\022\017goog"
+    "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file"
+    "\030\001 \003(\0132$.google.protobuf.FileDescriptorP"
+    "roto\"\333\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001"
+    "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022"
+    "\031\n\021public_dependency\030\n \003(\005\022\027\n\017weak_depen"
+    "dency\030\013 \003(\005\0226\n\014message_type\030\004 \003(\0132 .goog"
+    "le.protobuf.DescriptorProto\0227\n\tenum_type"
+    "\030\005 \003(\0132$.google.protobuf.EnumDescriptorP"
+    "roto\0228\n\007service\030\006 \003(\0132\'.google.protobuf."
+    "ServiceDescriptorProto\0228\n\textension\030\007 \003("
+    "\0132%.google.protobuf.FieldDescriptorProto"
+    "\022-\n\007options\030\010 \001(\0132\034.google.protobuf.File"
+    "Options\0229\n\020source_code_info\030\t \001(\0132\037.goog"
+    "le.protobuf.SourceCodeInfo\022\016\n\006syntax\030\014 \001"
+    "(\t\"\360\004\n\017DescriptorProto\022\014\n\004name\030\001 \001(\t\0224\n\005"
+    "field\030\002 \003(\0132%.google.protobuf.FieldDescr"
+    "iptorProto\0228\n\textension\030\006 \003(\0132%.google.p"
+    "rotobuf.FieldDescriptorProto\0225\n\013nested_t"
+    "ype\030\003 \003(\0132 .google.protobuf.DescriptorPr"
+    "oto\0227\n\tenum_type\030\004 \003(\0132$.google.protobuf"
+    ".EnumDescriptorProto\022H\n\017extension_range\030"
+    "\005 \003(\0132/.google.protobuf.DescriptorProto."
+    "ExtensionRange\0229\n\noneof_decl\030\010 \003(\0132%.goo"
+    "gle.protobuf.OneofDescriptorProto\0220\n\007opt"
+    "ions\030\007 \001(\0132\037.google.protobuf.MessageOpti"
+    "ons\022F\n\016reserved_range\030\t \003(\0132..google.pro"
+    "tobuf.DescriptorProto.ReservedRange\022\025\n\rr"
+    "eserved_name\030\n \003(\t\032,\n\016ExtensionRange\022\r\n\005"
+    "start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\032+\n\rReservedRang"
+    "e\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"\274\005\n\024FieldD"
+    "escriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n\006number\030\003"
+    " \001(\005\022:\n\005label\030\004 \001(\0162+.google.protobuf.Fi"
+    "eldDescriptorProto.Label\0228\n\004type\030\005 \001(\0162*"
+    ".google.protobuf.FieldDescriptorProto.Ty"
+    "pe\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010extendee\030\002 \001(\t\022"
+    "\025\n\rdefault_value\030\007 \001(\t\022\023\n\013oneof_index\030\t "
+    "\001(\005\022\021\n\tjson_name\030\n \001(\t\022.\n\007options\030\010 \001(\0132"
+    "\035.google.protobuf.FieldOptions\"\266\002\n\004Type\022"
+    "\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE"
+    "_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT32\020"
+    "\005\022\020\n\014TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n"
+    "\tTYPE_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GR"
+    "OUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022"
+    "\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_"
+    "SFIXED32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SI"
+    "NT32\020\021\022\017\n\013TYPE_SINT64\020\022\"C\n\005Label\022\022\n\016LABE"
+    "L_OPTIONAL\020\001\022\022\n\016LABEL_REQUIRED\020\002\022\022\n\016LABE"
+    "L_REPEATED\020\003\"$\n\024OneofDescriptorProto\022\014\n\004"
+    "name\030\001 \001(\t\"\214\001\n\023EnumDescriptorProto\022\014\n\004na"
+    "me\030\001 \001(\t\0228\n\005value\030\002 \003(\0132).google.protobu"
+    "f.EnumValueDescriptorProto\022-\n\007options\030\003 "
+    "\001(\0132\034.google.protobuf.EnumOptions\"l\n\030Enu"
+    "mValueDescriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n\006n"
+    "umber\030\002 \001(\005\0222\n\007options\030\003 \001(\0132!.google.pr"
+    "otobuf.EnumValueOptions\"\220\001\n\026ServiceDescr"
+    "iptorProto\022\014\n\004name\030\001 \001(\t\0226\n\006method\030\002 \003(\013"
+    "2&.google.protobuf.MethodDescriptorProto"
+    "\0220\n\007options\030\003 \001(\0132\037.google.protobuf.Serv"
+    "iceOptions\"\301\001\n\025MethodDescriptorProto\022\014\n\004"
+    "name\030\001 \001(\t\022\022\n\ninput_type\030\002 \001(\t\022\023\n\013output"
+    "_type\030\003 \001(\t\022/\n\007options\030\004 \001(\0132\036.google.pr"
+    "otobuf.MethodOptions\022\037\n\020client_streaming"
+    "\030\005 \001(\010:\005false\022\037\n\020server_streaming\030\006 \001(\010:"
+    "\005false\"\207\005\n\013FileOptions\022\024\n\014java_package\030\001"
+    " \001(\t\022\034\n\024java_outer_classname\030\010 \001(\t\022\"\n\023ja"
+    "va_multiple_files\030\n \001(\010:\005false\022,\n\035java_g"
+    "enerate_equals_and_hash\030\024 \001(\010:\005false\022%\n\026"
+    "java_string_check_utf8\030\033 \001(\010:\005false\022F\n\014o"
+    "ptimize_for\030\t \001(\0162).google.protobuf.File"
+    "Options.OptimizeMode:\005SPEED\022\022\n\ngo_packag"
+    "e\030\013 \001(\t\022\"\n\023cc_generic_services\030\020 \001(\010:\005fa"
+    "lse\022$\n\025java_generic_services\030\021 \001(\010:\005fals"
+    "e\022\"\n\023py_generic_services\030\022 \001(\010:\005false\022\031\n"
+    "\ndeprecated\030\027 \001(\010:\005false\022\037\n\020cc_enable_ar"
+    "enas\030\037 \001(\010:\005false\022\031\n\021objc_class_prefix\030$"
+    " \001(\t\022\030\n\020csharp_namespace\030% \001(\t\022C\n\024uninte"
+    "rpreted_option\030\347\007 \003(\0132$.google.protobuf."
+    "UninterpretedOption\":\n\014OptimizeMode\022\t\n\005S"
+    "PEED\020\001\022\r\n\tCODE_SIZE\020\002\022\020\n\014LITE_RUNTIME\020\003*"
+    "\t\010\350\007\020\200\200\200\200\002J\004\010&\020\'\"\346\001\n\016MessageOptions\022&\n\027m"
+    "essage_set_wire_format\030\001 \001(\010:\005false\022.\n\037n"
+    "o_standard_descriptor_accessor\030\002 \001(\010:\005fa"
+    "lse\022\031\n\ndeprecated\030\003 \001(\010:\005false\022\021\n\tmap_en"
+    "try\030\007 \001(\010\022C\n\024uninterpreted_option\030\347\007 \003(\013"
+    "2$.google.protobuf.UninterpretedOption*\t"
+    "\010\350\007\020\200\200\200\200\002\"\230\003\n\014FieldOptions\022:\n\005ctype\030\001 \001("
+    "\0162#.google.protobuf.FieldOptions.CType:\006"
+    "STRING\022\016\n\006packed\030\002 \001(\010\022\?\n\006jstype\030\006 \001(\0162$"
+    ".google.protobuf.FieldOptions.JSType:\tJS"
+    "_NORMAL\022\023\n\004lazy\030\005 \001(\010:\005false\022\031\n\ndeprecat"
+    "ed\030\003 \001(\010:\005false\022\023\n\004weak\030\n \001(\010:\005false\022C\n\024"
+    "uninterpreted_option\030\347\007 \003(\0132$.google.pro"
+    "tobuf.UninterpretedOption\"/\n\005CType\022\n\n\006ST"
+    "RING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_PIECE\020\002\"5\n\006JS"
+    "Type\022\r\n\tJS_NORMAL\020\000\022\r\n\tJS_STRING\020\001\022\r\n\tJS"
+    "_NUMBER\020\002*\t\010\350\007\020\200\200\200\200\002\"\215\001\n\013EnumOptions\022\023\n\013"
+    "allow_alias\030\002 \001(\010\022\031\n\ndeprecated\030\003 \001(\010:\005f"
+    "alse\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.go"
+    "ogle.protobuf.UninterpretedOption*\t\010\350\007\020\200"
+    "\200\200\200\002\"}\n\020EnumValueOptions\022\031\n\ndeprecated\030\001"
+    " \001(\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003"
+    "(\0132$.google.protobuf.UninterpretedOption"
+    "*\t\010\350\007\020\200\200\200\200\002\"{\n\016ServiceOptions\022\031\n\ndepreca"
+    "ted\030! \001(\010:\005false\022C\n\024uninterpreted_option"
+    "\030\347\007 \003(\0132$.google.protobuf.UninterpretedO"
+    "ption*\t\010\350\007\020\200\200\200\200\002\"z\n\rMethodOptions\022\031\n\ndep"
+    "recated\030! \001(\010:\005false\022C\n\024uninterpreted_op"
+    "tion\030\347\007 \003(\0132$.google.protobuf.Uninterpre"
+    "tedOption*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023UninterpretedOp"
+    "tion\022;\n\004name\030\002 \003(\0132-.google.protobuf.Uni"
+    "nterpretedOption.NamePart\022\030\n\020identifier_"
+    "value\030\003 \001(\t\022\032\n\022positive_int_value\030\004 \001(\004\022"
+    "\032\n\022negative_int_value\030\005 \001(\003\022\024\n\014double_va"
+    "lue\030\006 \001(\001\022\024\n\014string_value\030\007 \001(\014\022\027\n\017aggre"
+    "gate_value\030\010 \001(\t\0323\n\010NamePart\022\021\n\tname_par"
+    "t\030\001 \002(\t\022\024\n\014is_extension\030\002 \002(\010\"\325\001\n\016Source"
+    "CodeInfo\022:\n\010location\030\001 \003(\0132(.google.prot"
+    "obuf.SourceCodeInfo.Location\032\206\001\n\010Locatio"
+    "n\022\020\n\004path\030\001 \003(\005B\002\020\001\022\020\n\004span\030\002 \003(\005B\002\020\001\022\030\n"
+    "\020leading_comments\030\003 \001(\t\022\031\n\021trailing_comm"
+    "ents\030\004 \001(\t\022!\n\031leading_detached_comments\030"
+    "\006 \003(\t\"\247\001\n\021GeneratedCodeInfo\022A\n\nannotatio"
+    "n\030\001 \003(\0132-.google.protobuf.GeneratedCodeI"
+    "nfo.Annotation\032O\n\nAnnotation\022\020\n\004path\030\001 \003"
+    "(\005B\002\020\001\022\023\n\013source_file\030\002 \001(\t\022\r\n\005begin\030\003 \001"
+    "(\005\022\013\n\003end\030\004 \001(\005BX\n\023com.google.protobufB\020"
+    "DescriptorProtosH\001Z\ndescriptor\242\002\003GPB\252\002\032G"
+    "oogle.Protobuf.Reflection", 5145);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/descriptor.proto", &protobuf_RegisterTypes);
+  FileDescriptorSet::default_instance_ = new FileDescriptorSet();
+  FileDescriptorProto::default_instance_ = new FileDescriptorProto();
+  DescriptorProto::default_instance_ = new DescriptorProto();
+  DescriptorProto_ExtensionRange::default_instance_ = new DescriptorProto_ExtensionRange();
+  DescriptorProto_ReservedRange::default_instance_ = new DescriptorProto_ReservedRange();
+  FieldDescriptorProto::default_instance_ = new FieldDescriptorProto();
+  OneofDescriptorProto::default_instance_ = new OneofDescriptorProto();
+  EnumDescriptorProto::default_instance_ = new EnumDescriptorProto();
+  EnumValueDescriptorProto::default_instance_ = new EnumValueDescriptorProto();
+  ServiceDescriptorProto::default_instance_ = new ServiceDescriptorProto();
+  MethodDescriptorProto::default_instance_ = new MethodDescriptorProto();
+  FileOptions::default_instance_ = new FileOptions();
+  MessageOptions::default_instance_ = new MessageOptions();
+  FieldOptions::default_instance_ = new FieldOptions();
+  EnumOptions::default_instance_ = new EnumOptions();
+  EnumValueOptions::default_instance_ = new EnumValueOptions();
+  ServiceOptions::default_instance_ = new ServiceOptions();
+  MethodOptions::default_instance_ = new MethodOptions();
+  UninterpretedOption::default_instance_ = new UninterpretedOption();
+  UninterpretedOption_NamePart::default_instance_ = new UninterpretedOption_NamePart();
+  SourceCodeInfo::default_instance_ = new SourceCodeInfo();
+  SourceCodeInfo_Location::default_instance_ = new SourceCodeInfo_Location();
+  GeneratedCodeInfo::default_instance_ = new GeneratedCodeInfo();
+  GeneratedCodeInfo_Annotation::default_instance_ = new GeneratedCodeInfo_Annotation();
+  FileDescriptorSet::default_instance_->InitAsDefaultInstance();
+  FileDescriptorProto::default_instance_->InitAsDefaultInstance();
+  DescriptorProto::default_instance_->InitAsDefaultInstance();
+  DescriptorProto_ExtensionRange::default_instance_->InitAsDefaultInstance();
+  DescriptorProto_ReservedRange::default_instance_->InitAsDefaultInstance();
+  FieldDescriptorProto::default_instance_->InitAsDefaultInstance();
+  OneofDescriptorProto::default_instance_->InitAsDefaultInstance();
+  EnumDescriptorProto::default_instance_->InitAsDefaultInstance();
+  EnumValueDescriptorProto::default_instance_->InitAsDefaultInstance();
+  ServiceDescriptorProto::default_instance_->InitAsDefaultInstance();
+  MethodDescriptorProto::default_instance_->InitAsDefaultInstance();
+  FileOptions::default_instance_->InitAsDefaultInstance();
+  MessageOptions::default_instance_->InitAsDefaultInstance();
+  FieldOptions::default_instance_->InitAsDefaultInstance();
+  EnumOptions::default_instance_->InitAsDefaultInstance();
+  EnumValueOptions::default_instance_->InitAsDefaultInstance();
+  ServiceOptions::default_instance_->InitAsDefaultInstance();
+  MethodOptions::default_instance_->InitAsDefaultInstance();
+  UninterpretedOption::default_instance_->InitAsDefaultInstance();
+  UninterpretedOption_NamePart::default_instance_->InitAsDefaultInstance();
+  SourceCodeInfo::default_instance_->InitAsDefaultInstance();
+  SourceCodeInfo_Location::default_instance_->InitAsDefaultInstance();
+  GeneratedCodeInfo::default_instance_->InitAsDefaultInstance();
+  GeneratedCodeInfo_Annotation::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fdescriptor_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
+
+// ===================================================================
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int FileDescriptorSet::kFileFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+FileDescriptorSet::FileDescriptorSet()
+  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorSet)
+}
+
+void FileDescriptorSet::InitAsDefaultInstance() {
+}
+
+FileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from)
+  : ::google::protobuf::Message(),
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
+  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorSet)
+}
+
+void FileDescriptorSet::SharedCtor() {
+  _cached_size_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+FileDescriptorSet::~FileDescriptorSet() {
+  // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorSet)
+  SharedDtor();
+}
+
+void FileDescriptorSet::SharedDtor() {
+  if (this != default_instance_) {
+  }
+}
+
+void FileDescriptorSet::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* FileDescriptorSet::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return FileDescriptorSet_descriptor_;
+}
+
+const FileDescriptorSet& FileDescriptorSet::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
+}
+
+FileDescriptorSet* FileDescriptorSet::default_instance_ = NULL;
+
+FileDescriptorSet* FileDescriptorSet::New(::google::protobuf::Arena* arena) const {
+  FileDescriptorSet* n = new FileDescriptorSet;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
+}
+
+void FileDescriptorSet::Clear() {
+// @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorSet)
+  file_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
+}
+
+bool FileDescriptorSet::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorSet)
+  for (;;) {
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // repeated .google.protobuf.FileDescriptorProto file = 1;
+      case 1: {
+        if (tag == 10) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_file:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_file()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(10)) goto parse_loop_file;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorSet)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorSet)
+  return false;
+#undef DO_
+}
+
+void FileDescriptorSet::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorSet)
+  // repeated .google.protobuf.FileDescriptorProto file = 1;
+  for (unsigned int i = 0, n = this->file_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      1, this->file(i), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorSet)
+}
+
+::google::protobuf::uint8* FileDescriptorSet::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorSet)
+  // repeated .google.protobuf.FileDescriptorProto file = 1;
+  for (unsigned int i = 0, n = this->file_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        1, this->file(i), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorSet)
+  return target;
+}
+
+int FileDescriptorSet::ByteSize() const {
+// @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorSet)
+  int total_size = 0;
+
+  // repeated .google.protobuf.FileDescriptorProto file = 1;
+  total_size += 1 * this->file_size();
+  for (int i = 0; i < this->file_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->file(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void FileDescriptorSet::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileDescriptorSet)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FileDescriptorSet* source = 
+      ::google::protobuf::internal::DynamicCastToGenerated<const FileDescriptorSet>(
+          &from);
+  if (source == NULL) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileDescriptorSet)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileDescriptorSet)
+    MergeFrom(*source);
+  }
+}
+
+void FileDescriptorSet::MergeFrom(const FileDescriptorSet& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorSet)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  file_.MergeFrom(from.file_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
+}
+
+void FileDescriptorSet::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileDescriptorSet)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorSet)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool FileDescriptorSet::IsInitialized() const {
+
+  if (!::google::protobuf::internal::AllAreInitialized(this->file())) return false;
+  return true;
+}
+
+void FileDescriptorSet::Swap(FileDescriptorSet* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void FileDescriptorSet::InternalSwap(FileDescriptorSet* other) {
+  file_.UnsafeArenaSwap(&other->file_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  std::swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FileDescriptorSet_descriptor_;
+  metadata.reflection = FileDescriptorSet_reflection_;
+  return metadata;
+}
+
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FileDescriptorSet
+
+// repeated .google.protobuf.FileDescriptorProto file = 1;
+int FileDescriptorSet::file_size() const {
+  return file_.size();
+}
+void FileDescriptorSet::clear_file() {
+  file_.Clear();
+}
+const ::google::protobuf::FileDescriptorProto& FileDescriptorSet::file(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorSet.file)
+  return file_.Get(index);
+}
+::google::protobuf::FileDescriptorProto* FileDescriptorSet::mutable_file(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorSet.file)
+  return file_.Mutable(index);
+}
+::google::protobuf::FileDescriptorProto* FileDescriptorSet::add_file() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorSet.file)
+  return file_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >*
+FileDescriptorSet::mutable_file() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorSet.file)
+  return &file_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&
+FileDescriptorSet::file() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorSet.file)
+  return file_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int FileDescriptorProto::kNameFieldNumber;
+const int FileDescriptorProto::kPackageFieldNumber;
+const int FileDescriptorProto::kDependencyFieldNumber;
+const int FileDescriptorProto::kPublicDependencyFieldNumber;
+const int FileDescriptorProto::kWeakDependencyFieldNumber;
+const int FileDescriptorProto::kMessageTypeFieldNumber;
+const int FileDescriptorProto::kEnumTypeFieldNumber;
+const int FileDescriptorProto::kServiceFieldNumber;
+const int FileDescriptorProto::kExtensionFieldNumber;
+const int FileDescriptorProto::kOptionsFieldNumber;
+const int FileDescriptorProto::kSourceCodeInfoFieldNumber;
+const int FileDescriptorProto::kSyntaxFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+FileDescriptorProto::FileDescriptorProto()
+  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorProto)
+}
+
+void FileDescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::FileOptions*>(&::google::protobuf::FileOptions::default_instance());
+  source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>(&::google::protobuf::SourceCodeInfo::default_instance());
+}
+
+FileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from)
+  : ::google::protobuf::Message(),
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
+  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorProto)
+}
+
+void FileDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
+  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  options_ = NULL;
+  source_code_info_ = NULL;
+  syntax_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+FileDescriptorProto::~FileDescriptorProto() {
+  // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorProto)
+  SharedDtor();
+}
+
+void FileDescriptorProto::SharedDtor() {
+  name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  syntax_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+    delete options_;
+    delete source_code_info_;
+  }
+}
+
+void FileDescriptorProto::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* FileDescriptorProto::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return FileDescriptorProto_descriptor_;
+}
+
+const FileDescriptorProto& FileDescriptorProto::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
+}
+
+FileDescriptorProto* FileDescriptorProto::default_instance_ = NULL;
+
+FileDescriptorProto* FileDescriptorProto::New(::google::protobuf::Arena* arena) const {
+  FileDescriptorProto* n = new FileDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
+}
+
+void FileDescriptorProto::Clear() {
+// @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorProto)
+  if (_has_bits_[0 / 32] & 3u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_package()) {
+      package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+  }
+  if (_has_bits_[8 / 32] & 3584u) {
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear();
+    }
+    if (has_source_code_info()) {
+      if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear();
+    }
+    if (has_syntax()) {
+      syntax_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+  }
+  dependency_.Clear();
+  public_dependency_.Clear();
+  weak_dependency_.Clear();
+  message_type_.Clear();
+  enum_type_.Clear();
+  service_.Clear();
+  extension_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
+}
+
+bool FileDescriptorProto::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorProto)
+  for (;;) {
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // optional string name = 1;
+      case 1: {
+        if (tag == 10) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+            this->name().data(), this->name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE,
+            "google.protobuf.FileDescriptorProto.name");
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(18)) goto parse_package;
+        break;
+      }
+
+      // optional string package = 2;
+      case 2: {
+        if (tag == 18) {
+         parse_package:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_package()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+            this->package().data(), this->package().length(),
+            ::google::protobuf::internal::WireFormat::PARSE,
+            "google.protobuf.FileDescriptorProto.package");
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(26)) goto parse_dependency;
+        break;
+      }
+
+      // repeated string dependency = 3;
+      case 3: {
+        if (tag == 26) {
+         parse_dependency:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->add_dependency()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+            this->dependency(this->dependency_size() - 1).data(),
+            this->dependency(this->dependency_size() - 1).length(),
+            ::google::protobuf::internal::WireFormat::PARSE,
+            "google.protobuf.FileDescriptorProto.dependency");
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(26)) goto parse_dependency;
+        if (input->ExpectTag(34)) goto parse_message_type;
+        break;
+      }
+
+      // repeated .google.protobuf.DescriptorProto message_type = 4;
+      case 4: {
+        if (tag == 34) {
+         parse_message_type:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_message_type:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_message_type()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(34)) goto parse_loop_message_type;
+        if (input->ExpectTag(42)) goto parse_loop_enum_type;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+      case 5: {
+        if (tag == 42) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_enum_type:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_enum_type()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(42)) goto parse_loop_enum_type;
+        if (input->ExpectTag(50)) goto parse_loop_service;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+      case 6: {
+        if (tag == 50) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_service:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_service()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(50)) goto parse_loop_service;
+        if (input->ExpectTag(58)) goto parse_loop_extension;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+      case 7: {
+        if (tag == 58) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_extension:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_extension()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(58)) goto parse_loop_extension;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(66)) goto parse_options;
+        break;
+      }
+
+      // optional .google.protobuf.FileOptions options = 8;
+      case 8: {
+        if (tag == 66) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+               input, mutable_options()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(74)) goto parse_source_code_info;
+        break;
+      }
+
+      // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+      case 9: {
+        if (tag == 74) {
+         parse_source_code_info:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+               input, mutable_source_code_info()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(80)) goto parse_public_dependency;
+        break;
+      }
+
+      // repeated int32 public_dependency = 10;
+      case 10: {
+        if (tag == 80) {
+         parse_public_dependency:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 1, 80, input, this->mutable_public_dependency())));
+        } else if (tag == 82) {
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, this->mutable_public_dependency())));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(80)) goto parse_public_dependency;
+        if (input->ExpectTag(88)) goto parse_weak_dependency;
+        break;
+      }
+
+      // repeated int32 weak_dependency = 11;
+      case 11: {
+        if (tag == 88) {
+         parse_weak_dependency:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 1, 88, input, this->mutable_weak_dependency())));
+        } else if (tag == 90) {
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, this->mutable_weak_dependency())));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(88)) goto parse_weak_dependency;
+        if (input->ExpectTag(98)) goto parse_syntax;
+        break;
+      }
+
+      // optional string syntax = 12;
+      case 12: {
+        if (tag == 98) {
+         parse_syntax:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_syntax()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+            this->syntax().data(), this->syntax().length(),
+            ::google::protobuf::internal::WireFormat::PARSE,
+            "google.protobuf.FileDescriptorProto.syntax");
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectAtEnd()) goto success;
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorProto)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorProto)
+  return false;
+#undef DO_
+}
+
+void FileDescriptorProto::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorProto)
+  // optional string name = 1;
+  if (has_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->name().data(), this->name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.name");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      1, this->name(), output);
+  }
+
+  // optional string package = 2;
+  if (has_package()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->package().data(), this->package().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.package");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      2, this->package(), output);
+  }
+
+  // repeated string dependency = 3;
+  for (int i = 0; i < this->dependency_size(); i++) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->dependency(i).data(), this->dependency(i).length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.dependency");
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      3, this->dependency(i), output);
+  }
+
+  // repeated .google.protobuf.DescriptorProto message_type = 4;
+  for (unsigned int i = 0, n = this->message_type_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      4, this->message_type(i), output);
+  }
+
+  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+  for (unsigned int i = 0, n = this->enum_type_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      5, this->enum_type(i), output);
+  }
+
+  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+  for (unsigned int i = 0, n = this->service_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      6, this->service(i), output);
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+  for (unsigned int i = 0, n = this->extension_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      7, this->extension(i), output);
+  }
+
+  // optional .google.protobuf.FileOptions options = 8;
+  if (has_options()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      8, *this->options_, output);
+  }
+
+  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+  if (has_source_code_info()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      9, *this->source_code_info_, output);
+  }
+
+  // repeated int32 public_dependency = 10;
+  for (int i = 0; i < this->public_dependency_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(
+      10, this->public_dependency(i), output);
+  }
+
+  // repeated int32 weak_dependency = 11;
+  for (int i = 0; i < this->weak_dependency_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(
+      11, this->weak_dependency(i), output);
+  }
+
+  // optional string syntax = 12;
+  if (has_syntax()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->syntax().data(), this->syntax().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.syntax");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      12, this->syntax(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorProto)
+}
+
+::google::protobuf::uint8* FileDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorProto)
+  // optional string name = 1;
+  if (has_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->name().data(), this->name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.name");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->name(), target);
+  }
+
+  // optional string package = 2;
+  if (has_package()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->package().data(), this->package().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.package");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        2, this->package(), target);
+  }
+
+  // repeated string dependency = 3;
+  for (int i = 0; i < this->dependency_size(); i++) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->dependency(i).data(), this->dependency(i).length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.dependency");
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteStringToArray(3, this->dependency(i), target);
+  }
+
+  // repeated .google.protobuf.DescriptorProto message_type = 4;
+  for (unsigned int i = 0, n = this->message_type_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        4, this->message_type(i), target);
+  }
+
+  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+  for (unsigned int i = 0, n = this->enum_type_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        5, this->enum_type(i), target);
+  }
+
+  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+  for (unsigned int i = 0, n = this->service_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        6, this->service(i), target);
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+  for (unsigned int i = 0, n = this->extension_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        7, this->extension(i), target);
+  }
+
+  // optional .google.protobuf.FileOptions options = 8;
+  if (has_options()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        8, *this->options_, target);
+  }
+
+  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+  if (has_source_code_info()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        9, *this->source_code_info_, target);
+  }
+
+  // repeated int32 public_dependency = 10;
+  for (int i = 0; i < this->public_dependency_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteInt32ToArray(10, this->public_dependency(i), target);
+  }
+
+  // repeated int32 weak_dependency = 11;
+  for (int i = 0; i < this->weak_dependency_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteInt32ToArray(11, this->weak_dependency(i), target);
+  }
+
+  // optional string syntax = 12;
+  if (has_syntax()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->syntax().data(), this->syntax().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.FileDescriptorProto.syntax");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        12, this->syntax(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorProto)
+  return target;
+}
+
+int FileDescriptorProto::ByteSize() const {
+// @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorProto)
+  int total_size = 0;
+
+  if (_has_bits_[0 / 32] & 3u) {
+    // optional string name = 1;
+    if (has_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->name());
+    }
+
+    // optional string package = 2;
+    if (has_package()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->package());
+    }
+
+  }
+  if (_has_bits_[9 / 32] & 3584u) {
+    // optional .google.protobuf.FileOptions options = 8;
+    if (has_options()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+          *this->options_);
+    }
+
+    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+    if (has_source_code_info()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+          *this->source_code_info_);
+    }
+
+    // optional string syntax = 12;
+    if (has_syntax()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->syntax());
+    }
+
+  }
+  // repeated string dependency = 3;
+  total_size += 1 * this->dependency_size();
+  for (int i = 0; i < this->dependency_size(); i++) {
+    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
+      this->dependency(i));
+  }
+
+  // repeated int32 public_dependency = 10;
+  {
+    int data_size = 0;
+    for (int i = 0; i < this->public_dependency_size(); i++) {
+      data_size += ::google::protobuf::internal::WireFormatLite::
+        Int32Size(this->public_dependency(i));
+    }
+    total_size += 1 * this->public_dependency_size() + data_size;
+  }
+
+  // repeated int32 weak_dependency = 11;
+  {
+    int data_size = 0;
+    for (int i = 0; i < this->weak_dependency_size(); i++) {
+      data_size += ::google::protobuf::internal::WireFormatLite::
+        Int32Size(this->weak_dependency(i));
+    }
+    total_size += 1 * this->weak_dependency_size() + data_size;
+  }
+
+  // repeated .google.protobuf.DescriptorProto message_type = 4;
+  total_size += 1 * this->message_type_size();
+  for (int i = 0; i < this->message_type_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->message_type(i));
+  }
+
+  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+  total_size += 1 * this->enum_type_size();
+  for (int i = 0; i < this->enum_type_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->enum_type(i));
+  }
+
+  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+  total_size += 1 * this->service_size();
+  for (int i = 0; i < this->service_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->service(i));
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+  total_size += 1 * this->extension_size();
+  for (int i = 0; i < this->extension_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->extension(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void FileDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileDescriptorProto)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FileDescriptorProto* source = 
+      ::google::protobuf::internal::DynamicCastToGenerated<const FileDescriptorProto>(
+          &from);
+  if (source == NULL) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileDescriptorProto)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileDescriptorProto)
+    MergeFrom(*source);
+  }
+}
+
+void FileDescriptorProto::MergeFrom(const FileDescriptorProto& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorProto)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  dependency_.MergeFrom(from.dependency_);
+  public_dependency_.MergeFrom(from.public_dependency_);
+  weak_dependency_.MergeFrom(from.weak_dependency_);
+  message_type_.MergeFrom(from.message_type_);
+  enum_type_.MergeFrom(from.enum_type_);
+  service_.MergeFrom(from.service_);
+  extension_.MergeFrom(from.extension_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
+    }
+    if (from.has_package()) {
+      set_has_package();
+      package_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.package_);
+    }
+  }
+  if (from._has_bits_[9 / 32] & (0xffu << (9 % 32))) {
+    if (from.has_options()) {
+      mutable_options()->::google::protobuf::FileOptions::MergeFrom(from.options());
+    }
+    if (from.has_source_code_info()) {
+      mutable_source_code_info()->::google::protobuf::SourceCodeInfo::MergeFrom(from.source_code_info());
+    }
+    if (from.has_syntax()) {
+      set_has_syntax();
+      syntax_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.syntax_);
+    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
+}
+
+void FileDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileDescriptorProto)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorProto)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool FileDescriptorProto::IsInitialized() const {
+
+  if (!::google::protobuf::internal::AllAreInitialized(this->message_type())) return false;
+  if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false;
+  if (!::google::protobuf::internal::AllAreInitialized(this->service())) return false;
+  if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false;
+  if (has_options()) {
+    if (!this->options_->IsInitialized()) return false;
+  }
+  return true;
+}
+
+void FileDescriptorProto::Swap(FileDescriptorProto* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void FileDescriptorProto::InternalSwap(FileDescriptorProto* other) {
+  name_.Swap(&other->name_);
+  package_.Swap(&other->package_);
+  dependency_.UnsafeArenaSwap(&other->dependency_);
+  public_dependency_.UnsafeArenaSwap(&other->public_dependency_);
+  weak_dependency_.UnsafeArenaSwap(&other->weak_dependency_);
+  message_type_.UnsafeArenaSwap(&other->message_type_);
+  enum_type_.UnsafeArenaSwap(&other->enum_type_);
+  service_.UnsafeArenaSwap(&other->service_);
+  extension_.UnsafeArenaSwap(&other->extension_);
+  std::swap(options_, other->options_);
+  std::swap(source_code_info_, other->source_code_info_);
+  syntax_.Swap(&other->syntax_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  std::swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FileDescriptorProto_descriptor_;
+  metadata.reflection = FileDescriptorProto_reflection_;
+  return metadata;
+}
+
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FileDescriptorProto
+
+// optional string name = 1;
+bool FileDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void FileDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void FileDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void FileDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& FileDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.name)
+}
+ void FileDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.name)
+}
+ void FileDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.name)
+}
+ ::std::string* FileDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.name)
+}
+
+// optional string package = 2;
+bool FileDescriptorProto::has_package() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void FileDescriptorProto::set_has_package() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void FileDescriptorProto::clear_has_package() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void FileDescriptorProto::clear_package() {
+  package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_package();
+}
+ const ::std::string& FileDescriptorProto::package() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.package)
+  return package_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileDescriptorProto::set_package(const ::std::string& value) {
+  set_has_package();
+  package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.package)
+}
+ void FileDescriptorProto::set_package(const char* value) {
+  set_has_package();
+  package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.package)
+}
+ void FileDescriptorProto::set_package(const char* value, size_t size) {
+  set_has_package();
+  package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.package)
+}
+ ::std::string* FileDescriptorProto::mutable_package() {
+  set_has_package();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.package)
+  return package_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileDescriptorProto::release_package() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.package)
+  clear_has_package();
+  return package_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileDescriptorProto::set_allocated_package(::std::string* package) {
+  if (package != NULL) {
+    set_has_package();
+  } else {
+    clear_has_package();
+  }
+  package_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), package);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.package)
+}
+
+// repeated string dependency = 3;
+int FileDescriptorProto::dependency_size() const {
+  return dependency_.size();
+}
+void FileDescriptorProto::clear_dependency() {
+  dependency_.Clear();
+}
+ const ::std::string& FileDescriptorProto::dependency(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.dependency)
+  return dependency_.Get(index);
+}
+ ::std::string* FileDescriptorProto::mutable_dependency(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.dependency)
+  return dependency_.Mutable(index);
+}
+ void FileDescriptorProto::set_dependency(int index, const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency)
+  dependency_.Mutable(index)->assign(value);
+}
+ void FileDescriptorProto::set_dependency(int index, const char* value) {
+  dependency_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.dependency)
+}
+ void FileDescriptorProto::set_dependency(int index, const char* value, size_t size) {
+  dependency_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.dependency)
+}
+ ::std::string* FileDescriptorProto::add_dependency() {
+  // @@protoc_insertion_point(field_add_mutable:google.protobuf.FileDescriptorProto.dependency)
+  return dependency_.Add();
+}
+ void FileDescriptorProto::add_dependency(const ::std::string& value) {
+  dependency_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency)
+}
+ void FileDescriptorProto::add_dependency(const char* value) {
+  dependency_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:google.protobuf.FileDescriptorProto.dependency)
+}
+ void FileDescriptorProto::add_dependency(const char* value, size_t size) {
+  dependency_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:google.protobuf.FileDescriptorProto.dependency)
+}
+ const ::google::protobuf::RepeatedPtrField< ::std::string>&
+FileDescriptorProto::dependency() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.dependency)
+  return dependency_;
+}
+ ::google::protobuf::RepeatedPtrField< ::std::string>*
+FileDescriptorProto::mutable_dependency() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.dependency)
+  return &dependency_;
+}
+
+// repeated int32 public_dependency = 10;
+int FileDescriptorProto::public_dependency_size() const {
+  return public_dependency_.size();
+}
+void FileDescriptorProto::clear_public_dependency() {
+  public_dependency_.Clear();
+}
+ ::google::protobuf::int32 FileDescriptorProto::public_dependency(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.public_dependency)
+  return public_dependency_.Get(index);
+}
+ void FileDescriptorProto::set_public_dependency(int index, ::google::protobuf::int32 value) {
+  public_dependency_.Set(index, value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.public_dependency)
+}
+ void FileDescriptorProto::add_public_dependency(::google::protobuf::int32 value) {
+  public_dependency_.Add(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.public_dependency)
+}
+ const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+FileDescriptorProto::public_dependency() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.public_dependency)
+  return public_dependency_;
+}
+ ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+FileDescriptorProto::mutable_public_dependency() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.public_dependency)
+  return &public_dependency_;
+}
+
+// repeated int32 weak_dependency = 11;
+int FileDescriptorProto::weak_dependency_size() const {
+  return weak_dependency_.size();
+}
+void FileDescriptorProto::clear_weak_dependency() {
+  weak_dependency_.Clear();
+}
+ ::google::protobuf::int32 FileDescriptorProto::weak_dependency(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.weak_dependency)
+  return weak_dependency_.Get(index);
+}
+ void FileDescriptorProto::set_weak_dependency(int index, ::google::protobuf::int32 value) {
+  weak_dependency_.Set(index, value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.weak_dependency)
+}
+ void FileDescriptorProto::add_weak_dependency(::google::protobuf::int32 value) {
+  weak_dependency_.Add(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.weak_dependency)
+}
+ const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+FileDescriptorProto::weak_dependency() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.weak_dependency)
+  return weak_dependency_;
+}
+ ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+FileDescriptorProto::mutable_weak_dependency() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.weak_dependency)
+  return &weak_dependency_;
+}
+
+// repeated .google.protobuf.DescriptorProto message_type = 4;
+int FileDescriptorProto::message_type_size() const {
+  return message_type_.size();
+}
+void FileDescriptorProto::clear_message_type() {
+  message_type_.Clear();
+}
+const ::google::protobuf::DescriptorProto& FileDescriptorProto::message_type(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.message_type)
+  return message_type_.Get(index);
+}
+::google::protobuf::DescriptorProto* FileDescriptorProto::mutable_message_type(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.message_type)
+  return message_type_.Mutable(index);
+}
+::google::protobuf::DescriptorProto* FileDescriptorProto::add_message_type() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.message_type)
+  return message_type_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >*
+FileDescriptorProto::mutable_message_type() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.message_type)
+  return &message_type_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >&
+FileDescriptorProto::message_type() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.message_type)
+  return message_type_;
+}
+
+// repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+int FileDescriptorProto::enum_type_size() const {
+  return enum_type_.size();
+}
+void FileDescriptorProto::clear_enum_type() {
+  enum_type_.Clear();
+}
+const ::google::protobuf::EnumDescriptorProto& FileDescriptorProto::enum_type(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.enum_type)
+  return enum_type_.Get(index);
+}
+::google::protobuf::EnumDescriptorProto* FileDescriptorProto::mutable_enum_type(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.enum_type)
+  return enum_type_.Mutable(index);
+}
+::google::protobuf::EnumDescriptorProto* FileDescriptorProto::add_enum_type() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.enum_type)
+  return enum_type_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >*
+FileDescriptorProto::mutable_enum_type() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.enum_type)
+  return &enum_type_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >&
+FileDescriptorProto::enum_type() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.enum_type)
+  return enum_type_;
+}
+
+// repeated .google.protobuf.ServiceDescriptorProto service = 6;
+int FileDescriptorProto::service_size() const {
+  return service_.size();
+}
+void FileDescriptorProto::clear_service() {
+  service_.Clear();
+}
+const ::google::protobuf::ServiceDescriptorProto& FileDescriptorProto::service(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.service)
+  return service_.Get(index);
+}
+::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::mutable_service(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.service)
+  return service_.Mutable(index);
+}
+::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::add_service() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.service)
+  return service_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >*
+FileDescriptorProto::mutable_service() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.service)
+  return &service_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >&
+FileDescriptorProto::service() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.service)
+  return service_;
+}
+
+// repeated .google.protobuf.FieldDescriptorProto extension = 7;
+int FileDescriptorProto::extension_size() const {
+  return extension_.size();
+}
+void FileDescriptorProto::clear_extension() {
+  extension_.Clear();
+}
+const ::google::protobuf::FieldDescriptorProto& FileDescriptorProto::extension(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.extension)
+  return extension_.Get(index);
+}
+::google::protobuf::FieldDescriptorProto* FileDescriptorProto::mutable_extension(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.extension)
+  return extension_.Mutable(index);
+}
+::google::protobuf::FieldDescriptorProto* FileDescriptorProto::add_extension() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.extension)
+  return extension_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*
+FileDescriptorProto::mutable_extension() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.extension)
+  return &extension_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
+FileDescriptorProto::extension() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.extension)
+  return extension_;
+}
+
+// optional .google.protobuf.FileOptions options = 8;
+bool FileDescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000200u) != 0;
+}
+void FileDescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000200u;
+}
+void FileDescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000200u;
+}
+void FileDescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::FileOptions& FileDescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::FileOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.options)
+  return options_;
+}
+::google::protobuf::FileOptions* FileDescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::FileOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void FileDescriptorProto::set_allocated_options(::google::protobuf::FileOptions* options) {
+  delete options_;
+  options_ = options;
+  if (options) {
+    set_has_options();
+  } else {
+    clear_has_options();
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.options)
+}
+
+// optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+bool FileDescriptorProto::has_source_code_info() const {
+  return (_has_bits_[0] & 0x00000400u) != 0;
+}
+void FileDescriptorProto::set_has_source_code_info() {
+  _has_bits_[0] |= 0x00000400u;
+}
+void FileDescriptorProto::clear_has_source_code_info() {
+  _has_bits_[0] &= ~0x00000400u;
+}
+void FileDescriptorProto::clear_source_code_info() {
+  if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear();
+  clear_has_source_code_info();
+}
+const ::google::protobuf::SourceCodeInfo& FileDescriptorProto::source_code_info() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.source_code_info)
+  return source_code_info_ != NULL ? *source_code_info_ : *default_instance_->source_code_info_;
+}
+::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() {
+  set_has_source_code_info();
+  if (source_code_info_ == NULL) {
+    source_code_info_ = new ::google::protobuf::SourceCodeInfo;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.source_code_info)
+  return source_code_info_;
+}
+::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_code_info() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.source_code_info)
+  clear_has_source_code_info();
+  ::google::protobuf::SourceCodeInfo* temp = source_code_info_;
+  source_code_info_ = NULL;
+  return temp;
+}
+void FileDescriptorProto::set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info) {
+  delete source_code_info_;
+  source_code_info_ = source_code_info;
+  if (source_code_info) {
+    set_has_source_code_info();
+  } else {
+    clear_has_source_code_info();
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.source_code_info)
+}
+
+// optional string syntax = 12;
+bool FileDescriptorProto::has_syntax() const {
+  return (_has_bits_[0] & 0x00000800u) != 0;
+}
+void FileDescriptorProto::set_has_syntax() {
+  _has_bits_[0] |= 0x00000800u;
+}
+void FileDescriptorProto::clear_has_syntax() {
+  _has_bits_[0] &= ~0x00000800u;
+}
+void FileDescriptorProto::clear_syntax() {
+  syntax_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_syntax();
+}
+ const ::std::string& FileDescriptorProto::syntax() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.syntax)
+  return syntax_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileDescriptorProto::set_syntax(const ::std::string& value) {
+  set_has_syntax();
+  syntax_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.syntax)
+}
+ void FileDescriptorProto::set_syntax(const char* value) {
+  set_has_syntax();
+  syntax_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.syntax)
+}
+ void FileDescriptorProto::set_syntax(const char* value, size_t size) {
+  set_has_syntax();
+  syntax_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.syntax)
+}
+ ::std::string* FileDescriptorProto::mutable_syntax() {
+  set_has_syntax();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.syntax)
+  return syntax_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileDescriptorProto::release_syntax() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.syntax)
+  clear_has_syntax();
+  return syntax_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileDescriptorProto::set_allocated_syntax(::std::string* syntax) {
+  if (syntax != NULL) {
+    set_has_syntax();
+  } else {
+    clear_has_syntax();
+  }
+  syntax_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), syntax);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.syntax)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int DescriptorProto_ExtensionRange::kStartFieldNumber;
+const int DescriptorProto_ExtensionRange::kEndFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange()
+  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ExtensionRange)
+}
+
+void DescriptorProto_ExtensionRange::InitAsDefaultInstance() {
+}
+
+DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from)
+  : ::google::protobuf::Message(),
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
+  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ExtensionRange)
+}
+
+void DescriptorProto_ExtensionRange::SharedCtor() {
+  _cached_size_ = 0;
+  start_ = 0;
+  end_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() {
+  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ExtensionRange)
+  SharedDtor();
+}
+
+void DescriptorProto_ExtensionRange::SharedDtor() {
+  if (this != default_instance_) {
+  }
+}
+
+void DescriptorProto_ExtensionRange::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return DescriptorProto_ExtensionRange_descriptor_;
+}
+
+const DescriptorProto_ExtensionRange& DescriptorProto_ExtensionRange::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
+}
+
+DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::default_instance_ = NULL;
+
+DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::New(::google::protobuf::Arena* arena) const {
+  DescriptorProto_ExtensionRange* n = new DescriptorProto_ExtensionRange;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
+}
+
+void DescriptorProto_ExtensionRange::Clear() {
+// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ExtensionRange)
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(DescriptorProto_ExtensionRange, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<DescriptorProto_ExtensionRange*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(start_, end_);
+
+#undef ZR_HELPER_
+#undef ZR_
+
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
+}
+
+bool DescriptorProto_ExtensionRange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ExtensionRange)
+  for (;;) {
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // optional int32 start = 1;
+      case 1: {
+        if (tag == 8) {
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &start_)));
+          set_has_start();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(16)) goto parse_end;
+        break;
+      }
+
+      // optional int32 end = 2;
+      case 2: {
+        if (tag == 16) {
+         parse_end:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &end_)));
+          set_has_end();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectAtEnd()) goto success;
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ExtensionRange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ExtensionRange)
+  return false;
+#undef DO_
+}
+
+void DescriptorProto_ExtensionRange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ExtensionRange)
+  // optional int32 start = 1;
+  if (has_start()) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output);
+  }
+
+  // optional int32 end = 2;
+  if (has_end()) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ExtensionRange)
+}
+
+::google::protobuf::uint8* DescriptorProto_ExtensionRange::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ExtensionRange)
+  // optional int32 start = 1;
+  if (has_start()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target);
+  }
+
+  // optional int32 end = 2;
+  if (has_end()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ExtensionRange)
+  return target;
+}
+
+int DescriptorProto_ExtensionRange::ByteSize() const {
+// @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ExtensionRange)
+  int total_size = 0;
+
+  if (_has_bits_[0 / 32] & 3u) {
+    // optional int32 start = 1;
+    if (has_start()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->start());
+    }
+
+    // optional int32 end = 2;
+    if (has_end()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->end());
+    }
+
+  }
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void DescriptorProto_ExtensionRange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const DescriptorProto_ExtensionRange* source = 
+      ::google::protobuf::internal::DynamicCastToGenerated<const DescriptorProto_ExtensionRange>(
+          &from);
+  if (source == NULL) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto.ExtensionRange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto.ExtensionRange)
+    MergeFrom(*source);
+  }
+}
+
+void DescriptorProto_ExtensionRange::MergeFrom(const DescriptorProto_ExtensionRange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_start()) {
+      set_start(from.start());
+    }
+    if (from.has_end()) {
+      set_end(from.end());
+    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
+}
+
+void DescriptorProto_ExtensionRange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool DescriptorProto_ExtensionRange::IsInitialized() const {
+
+  return true;
+}
+
+void DescriptorProto_ExtensionRange::Swap(DescriptorProto_ExtensionRange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void DescriptorProto_ExtensionRange::InternalSwap(DescriptorProto_ExtensionRange* other) {
+  std::swap(start_, other->start_);
+  std::swap(end_, other->end_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  std::swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = DescriptorProto_ExtensionRange_descriptor_;
+  metadata.reflection = DescriptorProto_ExtensionRange_reflection_;
+  return metadata;
+}
+
+
+// -------------------------------------------------------------------
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int DescriptorProto_ReservedRange::kStartFieldNumber;
+const int DescriptorProto_ReservedRange::kEndFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+DescriptorProto_ReservedRange::DescriptorProto_ReservedRange()
+  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ReservedRange)
+}
+
+void DescriptorProto_ReservedRange::InitAsDefaultInstance() {
+}
+
+DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(const DescriptorProto_ReservedRange& from)
+  : ::google::protobuf::Message(),
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
+  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ReservedRange)
+}
+
+void DescriptorProto_ReservedRange::SharedCtor() {
+  _cached_size_ = 0;
+  start_ = 0;
+  end_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+DescriptorProto_ReservedRange::~DescriptorProto_ReservedRange() {
+  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ReservedRange)
+  SharedDtor();
+}
+
+void DescriptorProto_ReservedRange::SharedDtor() {
+  if (this != default_instance_) {
+  }
+}
+
+void DescriptorProto_ReservedRange::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* DescriptorProto_ReservedRange::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return DescriptorProto_ReservedRange_descriptor_;
+}
+
+const DescriptorProto_ReservedRange& DescriptorProto_ReservedRange::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
+}
+
+DescriptorProto_ReservedRange* DescriptorProto_ReservedRange::default_instance_ = NULL;
+
+DescriptorProto_ReservedRange* DescriptorProto_ReservedRange::New(::google::protobuf::Arena* arena) const {
+  DescriptorProto_ReservedRange* n = new DescriptorProto_ReservedRange;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
+}
+
+void DescriptorProto_ReservedRange::Clear() {
+// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ReservedRange)
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(DescriptorProto_ReservedRange, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<DescriptorProto_ReservedRange*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(start_, end_);
+
+#undef ZR_HELPER_
+#undef ZR_
+
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
+}
+
+bool DescriptorProto_ReservedRange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ReservedRange)
+  for (;;) {
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // optional int32 start = 1;
+      case 1: {
+        if (tag == 8) {
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &start_)));
+          set_has_start();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(16)) goto parse_end;
+        break;
+      }
+
+      // optional int32 end = 2;
+      case 2: {
+        if (tag == 16) {
+         parse_end:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &end_)));
+          set_has_end();
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectAtEnd()) goto success;
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ReservedRange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ReservedRange)
+  return false;
+#undef DO_
+}
+
+void DescriptorProto_ReservedRange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ReservedRange)
+  // optional int32 start = 1;
+  if (has_start()) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output);
+  }
+
+  // optional int32 end = 2;
+  if (has_end()) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ReservedRange)
+}
+
+::google::protobuf::uint8* DescriptorProto_ReservedRange::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ReservedRange)
+  // optional int32 start = 1;
+  if (has_start()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target);
+  }
+
+  // optional int32 end = 2;
+  if (has_end()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ReservedRange)
+  return target;
+}
+
+int DescriptorProto_ReservedRange::ByteSize() const {
+// @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ReservedRange)
+  int total_size = 0;
+
+  if (_has_bits_[0 / 32] & 3u) {
+    // optional int32 start = 1;
+    if (has_start()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->start());
+    }
+
+    // optional int32 end = 2;
+    if (has_end()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->end());
+    }
+
+  }
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void DescriptorProto_ReservedRange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto.ReservedRange)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const DescriptorProto_ReservedRange* source = 
+      ::google::protobuf::internal::DynamicCastToGenerated<const DescriptorProto_ReservedRange>(
+          &from);
+  if (source == NULL) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto.ReservedRange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto.ReservedRange)
+    MergeFrom(*source);
+  }
+}
+
+void DescriptorProto_ReservedRange::MergeFrom(const DescriptorProto_ReservedRange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ReservedRange)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_start()) {
+      set_start(from.start());
+    }
+    if (from.has_end()) {
+      set_end(from.end());
+    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
+}
+
+void DescriptorProto_ReservedRange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto.ReservedRange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void DescriptorProto_ReservedRange::CopyFrom(const DescriptorProto_ReservedRange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ReservedRange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool DescriptorProto_ReservedRange::IsInitialized() const {
+
+  return true;
+}
+
+void DescriptorProto_ReservedRange::Swap(DescriptorProto_ReservedRange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void DescriptorProto_ReservedRange::InternalSwap(DescriptorProto_ReservedRange* other) {
+  std::swap(start_, other->start_);
+  std::swap(end_, other->end_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  std::swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata DescriptorProto_ReservedRange::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = DescriptorProto_ReservedRange_descriptor_;
+  metadata.reflection = DescriptorProto_ReservedRange_reflection_;
+  return metadata;
+}
+
+
+// -------------------------------------------------------------------
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int DescriptorProto::kNameFieldNumber;
+const int DescriptorProto::kFieldFieldNumber;
+const int DescriptorProto::kExtensionFieldNumber;
+const int DescriptorProto::kNestedTypeFieldNumber;
+const int DescriptorProto::kEnumTypeFieldNumber;
+const int DescriptorProto::kExtensionRangeFieldNumber;
+const int DescriptorProto::kOneofDeclFieldNumber;
+const int DescriptorProto::kOptionsFieldNumber;
+const int DescriptorProto::kReservedRangeFieldNumber;
+const int DescriptorProto::kReservedNameFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+DescriptorProto::DescriptorProto()
+  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto)
+}
+
+void DescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::MessageOptions*>(&::google::protobuf::MessageOptions::default_instance());
+}
+
+DescriptorProto::DescriptorProto(const DescriptorProto& from)
+  : ::google::protobuf::Message(),
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
+  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto)
+}
+
+void DescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
+  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  options_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+DescriptorProto::~DescriptorProto() {
+  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto)
+  SharedDtor();
+}
+
+void DescriptorProto::SharedDtor() {
+  name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+    delete options_;
+  }
+}
+
+void DescriptorProto::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* DescriptorProto::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return DescriptorProto_descriptor_;
+}
+
+const DescriptorProto& DescriptorProto::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
+}
+
+DescriptorProto* DescriptorProto::default_instance_ = NULL;
+
+DescriptorProto* DescriptorProto::New(::google::protobuf::Arena* arena) const {
+  DescriptorProto* n = new DescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
+}
+
+void DescriptorProto::Clear() {
+// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto)
+  if (_has_bits_[0 / 32] & 129u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear();
+    }
+  }
+  field_.Clear();
+  extension_.Clear();
+  nested_type_.Clear();
+  enum_type_.Clear();
+  extension_range_.Clear();
+  oneof_decl_.Clear();
+  reserved_range_.Clear();
+  reserved_name_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
+}
+
+bool DescriptorProto::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto)
+  for (;;) {
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // optional string name = 1;
+      case 1: {
+        if (tag == 10) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+            this->name().data(), this->name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE,
+            "google.protobuf.DescriptorProto.name");
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(18)) goto parse_field;
+        break;
+      }
+
+      // repeated .google.protobuf.FieldDescriptorProto field = 2;
+      case 2: {
+        if (tag == 18) {
+         parse_field:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_field:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_field()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(18)) goto parse_loop_field;
+        if (input->ExpectTag(26)) goto parse_loop_nested_type;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.DescriptorProto nested_type = 3;
+      case 3: {
+        if (tag == 26) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_nested_type:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_nested_type()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(26)) goto parse_loop_nested_type;
+        if (input->ExpectTag(34)) goto parse_loop_enum_type;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+      case 4: {
+        if (tag == 34) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_enum_type:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_enum_type()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(34)) goto parse_loop_enum_type;
+        if (input->ExpectTag(42)) goto parse_loop_extension_range;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+      case 5: {
+        if (tag == 42) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_extension_range:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_extension_range()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(42)) goto parse_loop_extension_range;
+        if (input->ExpectTag(50)) goto parse_loop_extension;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+      case 6: {
+        if (tag == 50) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_extension:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_extension()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(50)) goto parse_loop_extension;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(58)) goto parse_options;
+        break;
+      }
+
+      // optional .google.protobuf.MessageOptions options = 7;
+      case 7: {
+        if (tag == 58) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+               input, mutable_options()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(66)) goto parse_oneof_decl;
+        break;
+      }
+
+      // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
+      case 8: {
+        if (tag == 66) {
+         parse_oneof_decl:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_oneof_decl:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_oneof_decl()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(66)) goto parse_loop_oneof_decl;
+        if (input->ExpectTag(74)) goto parse_loop_reserved_range;
+        input->UnsafeDecrementRecursionDepth();
+        break;
+      }
+
+      // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
+      case 9: {
+        if (tag == 74) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_reserved_range:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_reserved_range()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(74)) goto parse_loop_reserved_range;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(82)) goto parse_reserved_name;
+        break;
+      }
+
+      // repeated string reserved_name = 10;
+      case 10: {
+        if (tag == 82) {
+         parse_reserved_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->add_reserved_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+            this->reserved_name(this->reserved_name_size() - 1).data(),
+            this->reserved_name(this->reserved_name_size() - 1).length(),
+            ::google::protobuf::internal::WireFormat::PARSE,
+            "google.protobuf.DescriptorProto.reserved_name");
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(82)) goto parse_reserved_name;
+        if (input->ExpectAtEnd()) goto success;
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto)
+  return false;
+#undef DO_
+}
+
+void DescriptorProto::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto)
+  // optional string name = 1;
+  if (has_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->name().data(), this->name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.DescriptorProto.name");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      1, this->name(), output);
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto field = 2;
+  for (unsigned int i = 0, n = this->field_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      2, this->field(i), output);
+  }
+
+  // repeated .google.protobuf.DescriptorProto nested_type = 3;
+  for (unsigned int i = 0, n = this->nested_type_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      3, this->nested_type(i), output);
+  }
+
+  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+  for (unsigned int i = 0, n = this->enum_type_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      4, this->enum_type(i), output);
+  }
+
+  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+  for (unsigned int i = 0, n = this->extension_range_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      5, this->extension_range(i), output);
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+  for (unsigned int i = 0, n = this->extension_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      6, this->extension(i), output);
+  }
+
+  // optional .google.protobuf.MessageOptions options = 7;
+  if (has_options()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      7, *this->options_, output);
+  }
+
+  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
+  for (unsigned int i = 0, n = this->oneof_decl_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      8, this->oneof_decl(i), output);
+  }
+
+  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
+  for (unsigned int i = 0, n = this->reserved_range_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      9, this->reserved_range(i), output);
+  }
+
+  // repeated string reserved_name = 10;
+  for (int i = 0; i < this->reserved_name_size(); i++) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->reserved_name(i).data(), this->reserved_name(i).length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.DescriptorProto.reserved_name");
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      10, this->reserved_name(i), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto)
+}
+
+::google::protobuf::uint8* DescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto)
+  // optional string name = 1;
+  if (has_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->name().data(), this->name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.DescriptorProto.name");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->name(), target);
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto field = 2;
+  for (unsigned int i = 0, n = this->field_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        2, this->field(i), target);
+  }
+
+  // repeated .google.protobuf.DescriptorProto nested_type = 3;
+  for (unsigned int i = 0, n = this->nested_type_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        3, this->nested_type(i), target);
+  }
+
+  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+  for (unsigned int i = 0, n = this->enum_type_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        4, this->enum_type(i), target);
+  }
+
+  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+  for (unsigned int i = 0, n = this->extension_range_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        5, this->extension_range(i), target);
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+  for (unsigned int i = 0, n = this->extension_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        6, this->extension(i), target);
+  }
+
+  // optional .google.protobuf.MessageOptions options = 7;
+  if (has_options()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        7, *this->options_, target);
+  }
+
+  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
+  for (unsigned int i = 0, n = this->oneof_decl_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        8, this->oneof_decl(i), target);
+  }
+
+  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
+  for (unsigned int i = 0, n = this->reserved_range_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        9, this->reserved_range(i), target);
+  }
+
+  // repeated string reserved_name = 10;
+  for (int i = 0; i < this->reserved_name_size(); i++) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
+      this->reserved_name(i).data(), this->reserved_name(i).length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE,
+      "google.protobuf.DescriptorProto.reserved_name");
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteStringToArray(10, this->reserved_name(i), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto)
+  return target;
+}
+
+int DescriptorProto::ByteSize() const {
+// @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto)
+  int total_size = 0;
+
+  if (_has_bits_[0 / 32] & 129u) {
+    // optional string name = 1;
+    if (has_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->name());
+    }
+
+    // optional .google.protobuf.MessageOptions options = 7;
+    if (has_options()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+          *this->options_);
+    }
+
+  }
+  // repeated .google.protobuf.FieldDescriptorProto field = 2;
+  total_size += 1 * this->field_size();
+  for (int i = 0; i < this->field_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->field(i));
+  }
+
+  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+  total_size += 1 * this->extension_size();
+  for (int i = 0; i < this->extension_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->extension(i));
+  }
+
+  // repeated .google.protobuf.DescriptorProto nested_type = 3;
+  total_size += 1 * this->nested_type_size();
+  for (int i = 0; i < this->nested_type_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->nested_type(i));
+  }
+
+  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+  total_size += 1 * this->enum_type_size();
+  for (int i = 0; i < this->enum_type_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->enum_type(i));
+  }
+
+  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+  total_size += 1 * this->extension_range_size();
+  for (int i = 0; i < this->extension_range_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->extension_range(i));
+  }
+
+  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
+  total_size += 1 * this->oneof_decl_size();
+  for (int i = 0; i < this->oneof_decl_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->oneof_decl(i));
+  }
+
+  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
+  total_size += 1 * this->reserved_range_size();
+  for (int i = 0; i < this->reserved_range_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->reserved_range(i));
+  }
+
+  // repeated string reserved_name = 10;
+  total_size += 1 * this->reserved_name_size();
+  for (int i = 0; i < this->reserved_name_size(); i++) {
+    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
+      this->reserved_name(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void DescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const DescriptorProto* source = 
+      ::google::protobuf::internal::DynamicCastToGenerated<const DescriptorProto>(
+          &from);
+  if (source == NULL) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto)
+    MergeFrom(*source);
+  }
+}
+
+void DescriptorProto::MergeFrom(const DescriptorProto& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  field_.MergeFrom(from.field_);
+  extension_.MergeFrom(from.extension_);
+  nested_type_.MergeFrom(from.nested_type_);
+  enum_type_.MergeFrom(from.enum_type_);
+  extension_range_.MergeFrom(from.extension_range_);
+  oneof_decl_.MergeFrom(from.oneof_decl_);
+  reserved_range_.MergeFrom(from.reserved_range_);
+  reserved_name_.MergeFrom(from.reserved_name_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
+    }
+    if (from.has_options()) {
+      mutable_options()->::google::protobuf::MessageOptions::MergeFrom(from.options());
+    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
+}
+
+void DescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void DescriptorProto::CopyFrom(const DescriptorProto& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool DescriptorProto::IsInitialized() const {
+
+  if (!::google::protobuf::internal::AllAreInitialized(this->field())) return false;
+  if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false;
+  if (!::google::protobuf::internal::AllAreInitialized(this->nested_type())) return false;
+  if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false;
+  if (has_options()) {
+    if (!this->options_->IsInitialized()) return false;
+  }
+  return true;
+}
+
+void DescriptorProto::Swap(DescriptorProto* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void DescriptorProto::InternalSwap(DescriptorProto* other) {
+  name_.Swap(&other->name_);
+  field_.UnsafeArenaSwap(&other->field_);
+  extension_.UnsafeArenaSwap(&other->extension_);
+  nested_type_.UnsafeArenaSwap(&other->nested_type_);
+  enum_type_.UnsafeArenaSwap(&other->enum_type_);
+  extension_range_.UnsafeArenaSwap(&other->extension_range_);
+  oneof_decl_.UnsafeArenaSwap(&other->oneof_decl_);
+  std::swap(options_, other->options_);
+  reserved_range_.UnsafeArenaSwap(&other->reserved_range_);
+  reserved_name_.UnsafeArenaSwap(&other->reserved_name_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  std::swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata DescriptorProto::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = DescriptorProto_descriptor_;
+  metadata.reflection = DescriptorProto_reflection_;
+  return metadata;
+}
+
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// DescriptorProto_ExtensionRange
+
+// optional int32 start = 1;
+bool DescriptorProto_ExtensionRange::has_start() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void DescriptorProto_ExtensionRange::set_has_start() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void DescriptorProto_ExtensionRange::clear_has_start() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void DescriptorProto_ExtensionRange::clear_start() {
+  start_ = 0;
+  clear_has_start();
+}
+ ::google::protobuf::int32 DescriptorProto_ExtensionRange::start() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.start)
+  return start_;
+}
+ void DescriptorProto_ExtensionRange::set_start(::google::protobuf::int32 value) {
+  set_has_start();
+  start_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.start)
+}
+
+// optional int32 end = 2;
+bool DescriptorProto_ExtensionRange::has_end() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void DescriptorProto_ExtensionRange::set_has_end() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void DescriptorProto_ExtensionRange::clear_has_end() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void DescriptorProto_ExtensionRange::clear_end() {
+  end_ = 0;
+  clear_has_end();
+}
+ ::google::protobuf::int32 DescriptorProto_ExtensionRange::end() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.end)
+  return end_;
+}
+ void DescriptorProto_ExtensionRange::set_end(::google::protobuf::int32 value) {
+  set_has_end();
+  end_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.end)
+}
+
+// -------------------------------------------------------------------
+
+// DescriptorProto_ReservedRange
+
+// optional int32 start = 1;
+bool DescriptorProto_ReservedRange::has_start() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void DescriptorProto_ReservedRange::set_has_start() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void DescriptorProto_ReservedRange::clear_has_start() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void DescriptorProto_ReservedRange::clear_start() {
+  start_ = 0;
+  clear_has_start();
+}
+ ::google::protobuf::int32 DescriptorProto_ReservedRange::start() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ReservedRange.start)
+  return start_;
+}
+ void DescriptorProto_ReservedRange::set_start(::google::protobuf::int32 value) {
+  set_has_start();
+  start_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ReservedRange.start)
+}
+
+// optional int32 end = 2;
+bool DescriptorProto_ReservedRange::has_end() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void DescriptorProto_ReservedRange::set_has_end() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void DescriptorProto_ReservedRange::clear_has_end() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void DescriptorProto_ReservedRange::clear_end() {
+  end_ = 0;
+  clear_has_end();
+}
+ ::google::protobuf::int32 DescriptorProto_ReservedRange::end() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ReservedRange.end)
+  return end_;
+}
+ void DescriptorProto_ReservedRange::set_end(::google::protobuf::int32 value) {
+  set_has_end();
+  end_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ReservedRange.end)
+}
+
+// -------------------------------------------------------------------
+
+// DescriptorProto
+
+// optional string name = 1;
+bool DescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void DescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void DescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void DescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& DescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void DescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.name)
+}
+ void DescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.name)
+}
+ void DescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.DescriptorProto.name)
+}
+ ::std::string* DescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* DescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void DescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.name)
+}
+
+// repeated .google.protobuf.FieldDescriptorProto field = 2;
+int DescriptorProto::field_size() const {
+  return field_.size();
+}
+void DescriptorProto::clear_field() {
+  field_.Clear();
+}
+const ::google::protobuf::FieldDescriptorProto& DescriptorProto::field(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.field)
+  return field_.Get(index);
+}
+::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_field(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.field)
+  return field_.Mutable(index);
+}
+::google::protobuf::FieldDescriptorProto* DescriptorProto::add_field() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.field)
+  return field_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*
+DescriptorProto::mutable_field() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.field)
+  return &field_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
+DescriptorProto::field() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.field)
+  return field_;
+}
+
+// repeated .google.protobuf.FieldDescriptorProto extension = 6;
+int DescriptorProto::extension_size() const {
+  return extension_.size();
+}
+void DescriptorProto::clear_extension() {
+  extension_.Clear();
+}
+const ::google::protobuf::FieldDescriptorProto& DescriptorProto::extension(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.extension)
+  return extension_.Get(index);
+}
+::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_extension(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.extension)
+  return extension_.Mutable(index);
+}
+::google::protobuf::FieldDescriptorProto* DescriptorProto::add_extension() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.extension)
+  return extension_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*
+DescriptorProto::mutable_extension() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.extension)
+  return &extension_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
+DescriptorProto::extension() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.extension)
+  return extension_;
+}
+
+// repeated .google.protobuf.DescriptorProto nested_type = 3;
+int DescriptorProto::nested_type_size() const {
+  return nested_type_.size();
+}
+void DescriptorProto::clear_nested_type() {
+  nested_type_.Clear();
+}
+const ::google::protobuf::DescriptorProto& DescriptorProto::nested_type(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.nested_type)
+  return nested_type_.Get(index);
+}
+::google::protobuf::DescriptorProto* DescriptorProto::mutable_nested_type(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.nested_type)
+  return nested_type_.Mutable(index);
+}
+::google::protobuf::DescriptorProto* DescriptorProto::add_nested_type() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.nested_type)
+  return nested_type_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >*
+DescriptorProto::mutable_nested_type() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.nested_type)
+  return &nested_type_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >&
+DescriptorProto::nested_type() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.nested_type)
+  return nested_type_;
+}
+
+// repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+int DescriptorProto::enum_type_size() const {
+  return enum_type_.size();
+}
+void DescriptorProto::clear_enum_type() {
+  enum_type_.Clear();
+}
+const ::google::protobuf::EnumDescriptorProto& DescriptorProto::enum_type(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.enum_type)
+  return enum_type_.Get(index);
+}
+::google::protobuf::EnumDescriptorProto* DescriptorProto::mutable_enum_type(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.enum_type)
+  return enum_type_.Mutable(index);
+}
+::google::protobuf::EnumDescriptorProto* DescriptorProto::add_enum_type() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.enum_type)
+  return enum_type_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >*
+DescriptorProto::mutable_enum_type() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.enum_type)
+  return &enum_type_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >&
+DescriptorProto::enum_type() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.enum_type)
+  return enum_type_;
+}
+
+// repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+int DescriptorProto::extension_range_size() const {
+  return extension_range_.size();
+}
+void DescriptorProto::clear_extension_range() {
+  extension_range_.Clear();
+}
+const ::google::protobuf::DescriptorProto_ExtensionRange& DescriptorProto::extension_range(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.extension_range)
+  return extension_range_.Get(index);
+}
+::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::mutable_extension_range(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.extension_range)
+  return extension_range_.Mutable(index);
+}
+::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::add_extension_range() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.extension_range)
+  return extension_range_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >*
+DescriptorProto::mutable_extension_range() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.extension_range)
+  return &extension_range_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >&
+DescriptorProto::extension_range() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.extension_range)
+  return extension_range_;
+}
+
+// repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
+int DescriptorProto::oneof_decl_size() const {
+  return oneof_decl_.size();
+}
+void DescriptorProto::clear_oneof_decl() {
+  oneof_decl_.Clear();
+}
+const ::google::protobuf::OneofDescriptorProto& DescriptorProto::oneof_decl(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.oneof_decl)
+  return oneof_decl_.Get(index);
+}
+::google::protobuf::OneofDescriptorProto* DescriptorProto::mutable_oneof_decl(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.oneof_decl)
+  return oneof_decl_.Mutable(index);
+}
+::google::protobuf::OneofDescriptorProto* DescriptorProto::add_oneof_decl() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.oneof_decl)
+  return oneof_decl_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >*
+DescriptorProto::mutable_oneof_decl() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.oneof_decl)
+  return &oneof_decl_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >&
+DescriptorProto::oneof_decl() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.oneof_decl)
+  return oneof_decl_;
+}
+
+// optional .google.protobuf.MessageOptions options = 7;
+bool DescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000080u) != 0;
+}
+void DescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000080u;
+}
+void DescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000080u;
+}
+void DescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::MessageOptions& DescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::MessageOptions* DescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::MessageOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.options)
+  return options_;
+}
+::google::protobuf::MessageOptions* DescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::MessageOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void DescriptorProto::set_allocated_options(::google::protobuf::MessageOptions* options) {
+  delete options_;
+  options_ = options;
+  if (options) {
+    set_has_options();
+  } else {
+    clear_has_options();
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.options)
+}
+
+// repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
+int DescriptorProto::reserved_range_size() const {
+  return reserved_range_.size();
+}
+void DescriptorProto::clear_reserved_range() {
+  reserved_range_.Clear();
+}
+const ::google::protobuf::DescriptorProto_ReservedRange& DescriptorProto::reserved_range(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.reserved_range)
+  return reserved_range_.Get(index);
+}
+::google::protobuf::DescriptorProto_ReservedRange* DescriptorProto::mutable_reserved_range(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.reserved_range)
+  return reserved_range_.Mutable(index);
+}
+::google::protobuf::DescriptorProto_ReservedRange* DescriptorProto::add_reserved_range() {
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_range)
+  return reserved_range_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange >*
+DescriptorProto::mutable_reserved_range() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.reserved_range)
+  return &reserved_range_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange >&
+DescriptorProto::reserved_range() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.reserved_range)
+  return reserved_range_;
+}
+
+// repeated string reserved_name = 10;
+int DescriptorProto::reserved_name_size() const {
+  return reserved_name_.size();
+}
+void DescriptorProto::clear_reserved_name() {
+  reserved_name_.Clear();
+}
+ const ::std::string& DescriptorProto::reserved_name(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.reserved_name)
+  return reserved_name_.Get(index);
+}
+ ::std::string* DescriptorProto::mutable_reserved_name(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.reserved_name)
+  return reserved_name_.Mutable(index);
+}
+ void DescriptorProto::set_reserved_name(int index, const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.reserved_name)
+  reserved_name_.Mutable(index)->assign(value);
+}
+ void DescriptorProto::set_reserved_name(int index, const char* value) {
+  reserved_name_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.reserved_name)
+}
+ void DescriptorProto::set_reserved_name(int index, const char* value, size_t size) {
+  reserved_name_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.DescriptorProto.reserved_name)
+}
+ ::std::string* DescriptorProto::add_reserved_name() {
+  // @@protoc_insertion_point(field_add_mutable:google.protobuf.DescriptorProto.reserved_name)
+  return reserved_name_.Add();
+}
+ void DescriptorProto::add_reserved_name(const ::std::string& value) {
+  reserved_name_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_name)
+}
+ void DescriptorProto::add_reserved_name(const char* value) {
+  reserved_name_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:google.protobuf.DescriptorProto.reserved_name)
+}
+ void DescriptorProto::add_reserved_name(const char* value, size_t size) {
+  reserved_name_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:google.protobuf.DescriptorProto.reserved_name)
+}
+ const ::google::protobuf::RepeatedPtrField< ::std::string>&
+DescriptorProto::reserved_name() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.reserved_name)
+  return reserved_name_;
+}
+ ::google::protobuf::RepeatedPtrField< ::std::string>*
+DescriptorProto::mutable_reserved_name() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.reserved_name)
+  return &reserved_name_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor() {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[0];
+  protobuf_AssignDescriptorsOnce();
+  return FieldDescriptorProto_Type_descriptor_;
 }
 bool FieldDescriptorProto_Type_IsValid(int value) {
-  switch (value) {
+  switch(value) {
     case 1:
     case 2:
     case 3:
@@ -1451,11 +4199,11 @@
 const int FieldDescriptorProto::Type_ARRAYSIZE;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor() {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[1];
+  protobuf_AssignDescriptorsOnce();
+  return FieldDescriptorProto_Label_descriptor_;
 }
 bool FieldDescriptorProto_Label_IsValid(int value) {
-  switch (value) {
+  switch(value) {
     case 1:
     case 2:
     case 3:
@@ -1473,2997 +4221,6 @@
 const FieldDescriptorProto_Label FieldDescriptorProto::Label_MAX;
 const int FieldDescriptorProto::Label_ARRAYSIZE;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor() {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[2];
-}
-bool FileOptions_OptimizeMode_IsValid(int value) {
-  switch (value) {
-    case 1:
-    case 2:
-    case 3:
-      return true;
-    default:
-      return false;
-  }
-}
-
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const FileOptions_OptimizeMode FileOptions::SPEED;
-const FileOptions_OptimizeMode FileOptions::CODE_SIZE;
-const FileOptions_OptimizeMode FileOptions::LITE_RUNTIME;
-const FileOptions_OptimizeMode FileOptions::OptimizeMode_MIN;
-const FileOptions_OptimizeMode FileOptions::OptimizeMode_MAX;
-const int FileOptions::OptimizeMode_ARRAYSIZE;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor() {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[3];
-}
-bool FieldOptions_CType_IsValid(int value) {
-  switch (value) {
-    case 0:
-    case 1:
-    case 2:
-      return true;
-    default:
-      return false;
-  }
-}
-
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const FieldOptions_CType FieldOptions::STRING;
-const FieldOptions_CType FieldOptions::CORD;
-const FieldOptions_CType FieldOptions::STRING_PIECE;
-const FieldOptions_CType FieldOptions::CType_MIN;
-const FieldOptions_CType FieldOptions::CType_MAX;
-const int FieldOptions::CType_ARRAYSIZE;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-const ::google::protobuf::EnumDescriptor* FieldOptions_JSType_descriptor() {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[4];
-}
-bool FieldOptions_JSType_IsValid(int value) {
-  switch (value) {
-    case 0:
-    case 1:
-    case 2:
-      return true;
-    default:
-      return false;
-  }
-}
-
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const FieldOptions_JSType FieldOptions::JS_NORMAL;
-const FieldOptions_JSType FieldOptions::JS_STRING;
-const FieldOptions_JSType FieldOptions::JS_NUMBER;
-const FieldOptions_JSType FieldOptions::JSType_MIN;
-const FieldOptions_JSType FieldOptions::JSType_MAX;
-const int FieldOptions::JSType_ARRAYSIZE;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-const ::google::protobuf::EnumDescriptor* MethodOptions_IdempotencyLevel_descriptor() {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[5];
-}
-bool MethodOptions_IdempotencyLevel_IsValid(int value) {
-  switch (value) {
-    case 0:
-    case 1:
-    case 2:
-      return true;
-    default:
-      return false;
-  }
-}
-
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const MethodOptions_IdempotencyLevel MethodOptions::IDEMPOTENCY_UNKNOWN;
-const MethodOptions_IdempotencyLevel MethodOptions::NO_SIDE_EFFECTS;
-const MethodOptions_IdempotencyLevel MethodOptions::IDEMPOTENT;
-const MethodOptions_IdempotencyLevel MethodOptions::IdempotencyLevel_MIN;
-const MethodOptions_IdempotencyLevel MethodOptions::IdempotencyLevel_MAX;
-const int MethodOptions::IdempotencyLevel_ARRAYSIZE;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-// ===================================================================
-
-void FileDescriptorSet::InitAsDefaultInstance() {
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int FileDescriptorSet::kFileFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-FileDescriptorSet::FileDescriptorSet()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSet();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorSet)
-}
-FileDescriptorSet::FileDescriptorSet(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  file_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSet();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.FileDescriptorSet)
-}
-FileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      file_(from.file_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorSet)
-}
-
-void FileDescriptorSet::SharedCtor() {
-  _cached_size_ = 0;
-}
-
-FileDescriptorSet::~FileDescriptorSet() {
-  // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorSet)
-  SharedDtor();
-}
-
-void FileDescriptorSet::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-}
-
-void FileDescriptorSet::ArenaDtor(void* object) {
-  FileDescriptorSet* _this = reinterpret_cast< FileDescriptorSet* >(object);
-  (void)_this;
-}
-void FileDescriptorSet::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void FileDescriptorSet::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* FileDescriptorSet::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const FileDescriptorSet& FileDescriptorSet::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSet();
-  return *internal_default_instance();
-}
-
-FileDescriptorSet* FileDescriptorSet::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<FileDescriptorSet>(arena);
-}
-
-void FileDescriptorSet::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorSet)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  file_.Clear();
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool FileDescriptorSet::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorSet)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // repeated .google.protobuf.FileDescriptorProto file = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_file()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorSet)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorSet)
-  return false;
-#undef DO_
-}
-
-void FileDescriptorSet::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorSet)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // repeated .google.protobuf.FileDescriptorProto file = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->file_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      1, this->file(static_cast<int>(i)), output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorSet)
-}
-
-::google::protobuf::uint8* FileDescriptorSet::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorSet)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // repeated .google.protobuf.FileDescriptorProto file = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->file_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        1, this->file(static_cast<int>(i)), deterministic, target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorSet)
-  return target;
-}
-
-size_t FileDescriptorSet::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorSet)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.FileDescriptorProto file = 1;
-  {
-    unsigned int count = static_cast<unsigned int>(this->file_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->file(static_cast<int>(i)));
-    }
-  }
-
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void FileDescriptorSet::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileDescriptorSet)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FileDescriptorSet* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const FileDescriptorSet>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileDescriptorSet)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileDescriptorSet)
-    MergeFrom(*source);
-  }
-}
-
-void FileDescriptorSet::MergeFrom(const FileDescriptorSet& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorSet)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  file_.MergeFrom(from.file_);
-}
-
-void FileDescriptorSet::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileDescriptorSet)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorSet)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool FileDescriptorSet::IsInitialized() const {
-  if (!::google::protobuf::internal::AllAreInitialized(this->file())) return false;
-  return true;
-}
-
-void FileDescriptorSet::Swap(FileDescriptorSet* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    FileDescriptorSet* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void FileDescriptorSet::UnsafeArenaSwap(FileDescriptorSet* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void FileDescriptorSet::InternalSwap(FileDescriptorSet* other) {
-  using std::swap;
-  file_.InternalSwap(&other->file_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void FileDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_FileDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::FileOptions*>(
-      ::google::protobuf::FileOptions::internal_default_instance());
-  ::google::protobuf::_FileDescriptorProto_default_instance_._instance.get_mutable()->source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>(
-      ::google::protobuf::SourceCodeInfo::internal_default_instance());
-}
-void FileDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::FileOptions >(
-      GetArenaNoVirtual());
-}
-void FileDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::FileOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
-  }
-  options_ = options;
-  if (options) {
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.options)
-}
-void FileDescriptorProto::_slow_mutable_source_code_info() {
-  source_code_info_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::SourceCodeInfo >(
-      GetArenaNoVirtual());
-}
-void FileDescriptorProto::unsafe_arena_set_allocated_source_code_info(
-    ::google::protobuf::SourceCodeInfo* source_code_info) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete source_code_info_;
-  }
-  source_code_info_ = source_code_info;
-  if (source_code_info) {
-    set_has_source_code_info();
-  } else {
-    clear_has_source_code_info();
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.source_code_info)
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int FileDescriptorProto::kNameFieldNumber;
-const int FileDescriptorProto::kPackageFieldNumber;
-const int FileDescriptorProto::kDependencyFieldNumber;
-const int FileDescriptorProto::kPublicDependencyFieldNumber;
-const int FileDescriptorProto::kWeakDependencyFieldNumber;
-const int FileDescriptorProto::kMessageTypeFieldNumber;
-const int FileDescriptorProto::kEnumTypeFieldNumber;
-const int FileDescriptorProto::kServiceFieldNumber;
-const int FileDescriptorProto::kExtensionFieldNumber;
-const int FileDescriptorProto::kOptionsFieldNumber;
-const int FileDescriptorProto::kSourceCodeInfoFieldNumber;
-const int FileDescriptorProto::kSyntaxFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-FileDescriptorProto::FileDescriptorProto()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorProto)
-}
-FileDescriptorProto::FileDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  dependency_(arena),
-  message_type_(arena),
-  enum_type_(arena),
-  service_(arena),
-  extension_(arena),
-  public_dependency_(arena),
-  weak_dependency_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.FileDescriptorProto)
-}
-FileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      dependency_(from.dependency_),
-      message_type_(from.message_type_),
-      enum_type_(from.enum_type_),
-      service_(from.service_),
-      extension_(from.extension_),
-      public_dependency_(from.public_dependency_),
-      weak_dependency_(from.weak_dependency_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_package()) {
-    package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.package(),
-      GetArenaNoVirtual());
-  }
-  syntax_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_syntax()) {
-    syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.syntax(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::FileOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
-  if (from.has_source_code_info()) {
-    source_code_info_ = new ::google::protobuf::SourceCodeInfo(*from.source_code_info_);
-  } else {
-    source_code_info_ = NULL;
-  }
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorProto)
-}
-
-void FileDescriptorProto::SharedCtor() {
-  _cached_size_ = 0;
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  syntax_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&options_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&source_code_info_) -
-      reinterpret_cast<char*>(&options_)) + sizeof(source_code_info_));
-}
-
-FileDescriptorProto::~FileDescriptorProto() {
-  // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorProto)
-  SharedDtor();
-}
-
-void FileDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-  name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  syntax_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
-  if (this != internal_default_instance()) delete source_code_info_;
-}
-
-void FileDescriptorProto::ArenaDtor(void* object) {
-  FileDescriptorProto* _this = reinterpret_cast< FileDescriptorProto* >(object);
-  (void)_this;
-}
-void FileDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void FileDescriptorProto::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* FileDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const FileDescriptorProto& FileDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto();
-  return *internal_default_instance();
-}
-
-FileDescriptorProto* FileDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<FileDescriptorProto>(arena);
-}
-
-void FileDescriptorProto::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  dependency_.Clear();
-  message_type_.Clear();
-  enum_type_.Clear();
-  service_.Clear();
-  extension_.Clear();
-  public_dependency_.Clear();
-  weak_dependency_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 31u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!package_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000004u) {
-      GOOGLE_DCHECK(!syntax_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      syntax_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000008u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
-    }
-    if (cached_has_bits & 0x00000010u) {
-      GOOGLE_DCHECK(source_code_info_ != NULL);
-      source_code_info_->Clear();
-    }
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool FileDescriptorProto::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorProto)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // optional string name = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_name()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileDescriptorProto.name");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional string package = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_package()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->package().data(), static_cast<int>(this->package().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileDescriptorProto.package");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated string dependency = 3;
-      case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->add_dependency()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->dependency(this->dependency_size() - 1).data(),
-            static_cast<int>(this->dependency(this->dependency_size() - 1).length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileDescriptorProto.dependency");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.DescriptorProto message_type = 4;
-      case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_message_type()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
-      case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_enum_type()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.ServiceDescriptorProto service = 6;
-      case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_service()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.FieldDescriptorProto extension = 7;
-      case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_extension()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional .google.protobuf.FileOptions options = 8;
-      case 8: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_options()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
-      case 9: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(74u /* 74 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_source_code_info()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated int32 public_dependency = 10;
-      case 10: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(80u /* 80 & 0xFF */)) {
-          DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 1, 80u, input, this->mutable_public_dependency())));
-        } else if (
-            static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) {
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, this->mutable_public_dependency())));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated int32 weak_dependency = 11;
-      case 11: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(88u /* 88 & 0xFF */)) {
-          DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 1, 88u, input, this->mutable_weak_dependency())));
-        } else if (
-            static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(90u /* 90 & 0xFF */)) {
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, this->mutable_weak_dependency())));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional string syntax = 12;
-      case 12: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(98u /* 98 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_syntax()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->syntax().data(), static_cast<int>(this->syntax().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileDescriptorProto.syntax");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorProto)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorProto)
-  return false;
-#undef DO_
-}
-
-void FileDescriptorProto::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.name");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      1, this->name(), output);
-  }
-
-  // optional string package = 2;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->package().data(), static_cast<int>(this->package().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.package");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      2, this->package(), output);
-  }
-
-  // repeated string dependency = 3;
-  for (int i = 0, n = this->dependency_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->dependency(i).data(), static_cast<int>(this->dependency(i).length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.dependency");
-    ::google::protobuf::internal::WireFormatLite::WriteString(
-      3, this->dependency(i), output);
-  }
-
-  // repeated .google.protobuf.DescriptorProto message_type = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->message_type_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      4, this->message_type(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->enum_type_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      5, this->enum_type(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->service_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      6, this->service(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->extension_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      7, this->extension(static_cast<int>(i)), output);
-  }
-
-  // optional .google.protobuf.FileOptions options = 8;
-  if (cached_has_bits & 0x00000008u) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      8, *this->options_, output);
-  }
-
-  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
-  if (cached_has_bits & 0x00000010u) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      9, *this->source_code_info_, output);
-  }
-
-  // repeated int32 public_dependency = 10;
-  for (int i = 0, n = this->public_dependency_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(
-      10, this->public_dependency(i), output);
-  }
-
-  // repeated int32 weak_dependency = 11;
-  for (int i = 0, n = this->weak_dependency_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(
-      11, this->weak_dependency(i), output);
-  }
-
-  // optional string syntax = 12;
-  if (cached_has_bits & 0x00000004u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->syntax().data(), static_cast<int>(this->syntax().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.syntax");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      12, this->syntax(), output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorProto)
-}
-
-::google::protobuf::uint8* FileDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.name");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        1, this->name(), target);
-  }
-
-  // optional string package = 2;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->package().data(), static_cast<int>(this->package().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.package");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        2, this->package(), target);
-  }
-
-  // repeated string dependency = 3;
-  for (int i = 0, n = this->dependency_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->dependency(i).data(), static_cast<int>(this->dependency(i).length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.dependency");
-    target = ::google::protobuf::internal::WireFormatLite::
-      WriteStringToArray(3, this->dependency(i), target);
-  }
-
-  // repeated .google.protobuf.DescriptorProto message_type = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->message_type_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        4, this->message_type(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->enum_type_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        5, this->enum_type(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->service_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        6, this->service(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->extension_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        7, this->extension(static_cast<int>(i)), deterministic, target);
-  }
-
-  // optional .google.protobuf.FileOptions options = 8;
-  if (cached_has_bits & 0x00000008u) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        8, *this->options_, deterministic, target);
-  }
-
-  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
-  if (cached_has_bits & 0x00000010u) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        9, *this->source_code_info_, deterministic, target);
-  }
-
-  // repeated int32 public_dependency = 10;
-  target = ::google::protobuf::internal::WireFormatLite::
-    WriteInt32ToArray(10, this->public_dependency_, target);
-
-  // repeated int32 weak_dependency = 11;
-  target = ::google::protobuf::internal::WireFormatLite::
-    WriteInt32ToArray(11, this->weak_dependency_, target);
-
-  // optional string syntax = 12;
-  if (cached_has_bits & 0x00000004u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->syntax().data(), static_cast<int>(this->syntax().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileDescriptorProto.syntax");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        12, this->syntax(), target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorProto)
-  return target;
-}
-
-size_t FileDescriptorProto::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorProto)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated string dependency = 3;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->dependency_size());
-  for (int i = 0, n = this->dependency_size(); i < n; i++) {
-    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
-      this->dependency(i));
-  }
-
-  // repeated .google.protobuf.DescriptorProto message_type = 4;
-  {
-    unsigned int count = static_cast<unsigned int>(this->message_type_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->message_type(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
-  {
-    unsigned int count = static_cast<unsigned int>(this->enum_type_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->enum_type(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
-  {
-    unsigned int count = static_cast<unsigned int>(this->service_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->service(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
-  {
-    unsigned int count = static_cast<unsigned int>(this->extension_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->extension(static_cast<int>(i)));
-    }
-  }
-
-  // repeated int32 public_dependency = 10;
-  {
-    size_t data_size = ::google::protobuf::internal::WireFormatLite::
-      Int32Size(this->public_dependency_);
-    total_size += 1 *
-                  ::google::protobuf::internal::FromIntSize(this->public_dependency_size());
-    total_size += data_size;
-  }
-
-  // repeated int32 weak_dependency = 11;
-  {
-    size_t data_size = ::google::protobuf::internal::WireFormatLite::
-      Int32Size(this->weak_dependency_);
-    total_size += 1 *
-                  ::google::protobuf::internal::FromIntSize(this->weak_dependency_size());
-    total_size += data_size;
-  }
-
-  if (_has_bits_[0 / 32] & 31u) {
-    // optional string name = 1;
-    if (has_name()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->name());
-    }
-
-    // optional string package = 2;
-    if (has_package()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->package());
-    }
-
-    // optional string syntax = 12;
-    if (has_syntax()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->syntax());
-    }
-
-    // optional .google.protobuf.FileOptions options = 8;
-    if (has_options()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->options_);
-    }
-
-    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
-    if (has_source_code_info()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->source_code_info_);
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void FileDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FileDescriptorProto* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const FileDescriptorProto>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileDescriptorProto)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileDescriptorProto)
-    MergeFrom(*source);
-  }
-}
-
-void FileDescriptorProto::MergeFrom(const FileDescriptorProto& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  dependency_.MergeFrom(from.dependency_);
-  message_type_.MergeFrom(from.message_type_);
-  enum_type_.MergeFrom(from.enum_type_);
-  service_.MergeFrom(from.service_);
-  extension_.MergeFrom(from.extension_);
-  public_dependency_.MergeFrom(from.public_dependency_);
-  weak_dependency_.MergeFrom(from.weak_dependency_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 31u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      set_package(from.package());
-    }
-    if (cached_has_bits & 0x00000004u) {
-      set_syntax(from.syntax());
-    }
-    if (cached_has_bits & 0x00000008u) {
-      mutable_options()->::google::protobuf::FileOptions::MergeFrom(from.options());
-    }
-    if (cached_has_bits & 0x00000010u) {
-      mutable_source_code_info()->::google::protobuf::SourceCodeInfo::MergeFrom(from.source_code_info());
-    }
-  }
-}
-
-void FileDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileDescriptorProto)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorProto)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool FileDescriptorProto::IsInitialized() const {
-  if (!::google::protobuf::internal::AllAreInitialized(this->message_type())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->service())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false;
-  if (has_options()) {
-    if (!this->options_->IsInitialized()) return false;
-  }
-  return true;
-}
-
-void FileDescriptorProto::Swap(FileDescriptorProto* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    FileDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void FileDescriptorProto::UnsafeArenaSwap(FileDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void FileDescriptorProto::InternalSwap(FileDescriptorProto* other) {
-  using std::swap;
-  dependency_.InternalSwap(&other->dependency_);
-  message_type_.InternalSwap(&other->message_type_);
-  enum_type_.InternalSwap(&other->enum_type_);
-  service_.InternalSwap(&other->service_);
-  extension_.InternalSwap(&other->extension_);
-  public_dependency_.InternalSwap(&other->public_dependency_);
-  weak_dependency_.InternalSwap(&other->weak_dependency_);
-  name_.Swap(&other->name_);
-  package_.Swap(&other->package_);
-  syntax_.Swap(&other->syntax_);
-  swap(options_, other->options_);
-  swap(source_code_info_, other->source_code_info_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void DescriptorProto_ExtensionRange::InitAsDefaultInstance() {
-  ::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::ExtensionRangeOptions*>(
-      ::google::protobuf::ExtensionRangeOptions::internal_default_instance());
-}
-void DescriptorProto_ExtensionRange::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::ExtensionRangeOptions >(
-      GetArenaNoVirtual());
-}
-void DescriptorProto_ExtensionRange::unsafe_arena_set_allocated_options(
-    ::google::protobuf::ExtensionRangeOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
-  }
-  options_ = options;
-  if (options) {
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.DescriptorProto.ExtensionRange.options)
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int DescriptorProto_ExtensionRange::kStartFieldNumber;
-const int DescriptorProto_ExtensionRange::kEndFieldNumber;
-const int DescriptorProto_ExtensionRange::kOptionsFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ExtensionRange)
-}
-DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto.ExtensionRange)
-}
-DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::ExtensionRangeOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
-  ::memcpy(&start_, &from.start_,
-    static_cast<size_t>(reinterpret_cast<char*>(&end_) -
-    reinterpret_cast<char*>(&start_)) + sizeof(end_));
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ExtensionRange)
-}
-
-void DescriptorProto_ExtensionRange::SharedCtor() {
-  _cached_size_ = 0;
-  ::memset(&options_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&end_) -
-      reinterpret_cast<char*>(&options_)) + sizeof(end_));
-}
-
-DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() {
-  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ExtensionRange)
-  SharedDtor();
-}
-
-void DescriptorProto_ExtensionRange::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-  if (this != internal_default_instance()) delete options_;
-}
-
-void DescriptorProto_ExtensionRange::ArenaDtor(void* object) {
-  DescriptorProto_ExtensionRange* _this = reinterpret_cast< DescriptorProto_ExtensionRange* >(object);
-  (void)_this;
-}
-void DescriptorProto_ExtensionRange::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void DescriptorProto_ExtensionRange::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const DescriptorProto_ExtensionRange& DescriptorProto_ExtensionRange::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange();
-  return *internal_default_instance();
-}
-
-DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<DescriptorProto_ExtensionRange>(arena);
-}
-
-void DescriptorProto_ExtensionRange::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ExtensionRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x00000001u) {
-    GOOGLE_DCHECK(options_ != NULL);
-    options_->Clear();
-  }
-  if (cached_has_bits & 6u) {
-    ::memset(&start_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&end_) -
-        reinterpret_cast<char*>(&start_)) + sizeof(end_));
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool DescriptorProto_ExtensionRange::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ExtensionRange)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // optional int32 start = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-          set_has_start();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &start_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional int32 end = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_end();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &end_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional .google.protobuf.ExtensionRangeOptions options = 3;
-      case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_options()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ExtensionRange)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ExtensionRange)
-  return false;
-#undef DO_
-}
-
-void DescriptorProto_ExtensionRange::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ExtensionRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 start = 1;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output);
-  }
-
-  // optional int32 end = 2;
-  if (cached_has_bits & 0x00000004u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output);
-  }
-
-  // optional .google.protobuf.ExtensionRangeOptions options = 3;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      3, *this->options_, output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ExtensionRange)
-}
-
-::google::protobuf::uint8* DescriptorProto_ExtensionRange::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ExtensionRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 start = 1;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target);
-  }
-
-  // optional int32 end = 2;
-  if (cached_has_bits & 0x00000004u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target);
-  }
-
-  // optional .google.protobuf.ExtensionRangeOptions options = 3;
-  if (cached_has_bits & 0x00000001u) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, *this->options_, deterministic, target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ExtensionRange)
-  return target;
-}
-
-size_t DescriptorProto_ExtensionRange::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ExtensionRange)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  if (_has_bits_[0 / 32] & 7u) {
-    // optional .google.protobuf.ExtensionRangeOptions options = 3;
-    if (has_options()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->options_);
-    }
-
-    // optional int32 start = 1;
-    if (has_start()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->start());
-    }
-
-    // optional int32 end = 2;
-    if (has_end()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->end());
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void DescriptorProto_ExtensionRange::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange)
-  GOOGLE_DCHECK_NE(&from, this);
-  const DescriptorProto_ExtensionRange* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const DescriptorProto_ExtensionRange>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto.ExtensionRange)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto.ExtensionRange)
-    MergeFrom(*source);
-  }
-}
-
-void DescriptorProto_ExtensionRange::MergeFrom(const DescriptorProto_ExtensionRange& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 7u) {
-    if (cached_has_bits & 0x00000001u) {
-      mutable_options()->::google::protobuf::ExtensionRangeOptions::MergeFrom(from.options());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      start_ = from.start_;
-    }
-    if (cached_has_bits & 0x00000004u) {
-      end_ = from.end_;
-    }
-    _has_bits_[0] |= cached_has_bits;
-  }
-}
-
-void DescriptorProto_ExtensionRange::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool DescriptorProto_ExtensionRange::IsInitialized() const {
-  if (has_options()) {
-    if (!this->options_->IsInitialized()) return false;
-  }
-  return true;
-}
-
-void DescriptorProto_ExtensionRange::Swap(DescriptorProto_ExtensionRange* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    DescriptorProto_ExtensionRange* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void DescriptorProto_ExtensionRange::UnsafeArenaSwap(DescriptorProto_ExtensionRange* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void DescriptorProto_ExtensionRange::InternalSwap(DescriptorProto_ExtensionRange* other) {
-  using std::swap;
-  swap(options_, other->options_);
-  swap(start_, other->start_);
-  swap(end_, other->end_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void DescriptorProto_ReservedRange::InitAsDefaultInstance() {
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int DescriptorProto_ReservedRange::kStartFieldNumber;
-const int DescriptorProto_ReservedRange::kEndFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-DescriptorProto_ReservedRange::DescriptorProto_ReservedRange()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ReservedRange)
-}
-DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto.ReservedRange)
-}
-DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(const DescriptorProto_ReservedRange& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::memcpy(&start_, &from.start_,
-    static_cast<size_t>(reinterpret_cast<char*>(&end_) -
-    reinterpret_cast<char*>(&start_)) + sizeof(end_));
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ReservedRange)
-}
-
-void DescriptorProto_ReservedRange::SharedCtor() {
-  _cached_size_ = 0;
-  ::memset(&start_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&end_) -
-      reinterpret_cast<char*>(&start_)) + sizeof(end_));
-}
-
-DescriptorProto_ReservedRange::~DescriptorProto_ReservedRange() {
-  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ReservedRange)
-  SharedDtor();
-}
-
-void DescriptorProto_ReservedRange::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-}
-
-void DescriptorProto_ReservedRange::ArenaDtor(void* object) {
-  DescriptorProto_ReservedRange* _this = reinterpret_cast< DescriptorProto_ReservedRange* >(object);
-  (void)_this;
-}
-void DescriptorProto_ReservedRange::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void DescriptorProto_ReservedRange::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* DescriptorProto_ReservedRange::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const DescriptorProto_ReservedRange& DescriptorProto_ReservedRange::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange();
-  return *internal_default_instance();
-}
-
-DescriptorProto_ReservedRange* DescriptorProto_ReservedRange::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<DescriptorProto_ReservedRange>(arena);
-}
-
-void DescriptorProto_ReservedRange::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ReservedRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    ::memset(&start_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&end_) -
-        reinterpret_cast<char*>(&start_)) + sizeof(end_));
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool DescriptorProto_ReservedRange::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ReservedRange)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // optional int32 start = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-          set_has_start();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &start_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional int32 end = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_end();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &end_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ReservedRange)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ReservedRange)
-  return false;
-#undef DO_
-}
-
-void DescriptorProto_ReservedRange::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ReservedRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 start = 1;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output);
-  }
-
-  // optional int32 end = 2;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ReservedRange)
-}
-
-::google::protobuf::uint8* DescriptorProto_ReservedRange::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ReservedRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 start = 1;
-  if (cached_has_bits & 0x00000001u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target);
-  }
-
-  // optional int32 end = 2;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ReservedRange)
-  return target;
-}
-
-size_t DescriptorProto_ReservedRange::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ReservedRange)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  if (_has_bits_[0 / 32] & 3u) {
-    // optional int32 start = 1;
-    if (has_start()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->start());
-    }
-
-    // optional int32 end = 2;
-    if (has_end()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->end());
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void DescriptorProto_ReservedRange::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto.ReservedRange)
-  GOOGLE_DCHECK_NE(&from, this);
-  const DescriptorProto_ReservedRange* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const DescriptorProto_ReservedRange>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto.ReservedRange)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto.ReservedRange)
-    MergeFrom(*source);
-  }
-}
-
-void DescriptorProto_ReservedRange::MergeFrom(const DescriptorProto_ReservedRange& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ReservedRange)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      start_ = from.start_;
-    }
-    if (cached_has_bits & 0x00000002u) {
-      end_ = from.end_;
-    }
-    _has_bits_[0] |= cached_has_bits;
-  }
-}
-
-void DescriptorProto_ReservedRange::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto.ReservedRange)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void DescriptorProto_ReservedRange::CopyFrom(const DescriptorProto_ReservedRange& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ReservedRange)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool DescriptorProto_ReservedRange::IsInitialized() const {
-  return true;
-}
-
-void DescriptorProto_ReservedRange::Swap(DescriptorProto_ReservedRange* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    DescriptorProto_ReservedRange* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void DescriptorProto_ReservedRange::UnsafeArenaSwap(DescriptorProto_ReservedRange* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void DescriptorProto_ReservedRange::InternalSwap(DescriptorProto_ReservedRange* other) {
-  using std::swap;
-  swap(start_, other->start_);
-  swap(end_, other->end_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata DescriptorProto_ReservedRange::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void DescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_DescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::MessageOptions*>(
-      ::google::protobuf::MessageOptions::internal_default_instance());
-}
-void DescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::MessageOptions >(
-      GetArenaNoVirtual());
-}
-void DescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::MessageOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
-  }
-  options_ = options;
-  if (options) {
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.DescriptorProto.options)
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int DescriptorProto::kNameFieldNumber;
-const int DescriptorProto::kFieldFieldNumber;
-const int DescriptorProto::kExtensionFieldNumber;
-const int DescriptorProto::kNestedTypeFieldNumber;
-const int DescriptorProto::kEnumTypeFieldNumber;
-const int DescriptorProto::kExtensionRangeFieldNumber;
-const int DescriptorProto::kOneofDeclFieldNumber;
-const int DescriptorProto::kOptionsFieldNumber;
-const int DescriptorProto::kReservedRangeFieldNumber;
-const int DescriptorProto::kReservedNameFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-DescriptorProto::DescriptorProto()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto)
-}
-DescriptorProto::DescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  field_(arena),
-  nested_type_(arena),
-  enum_type_(arena),
-  extension_range_(arena),
-  extension_(arena),
-  oneof_decl_(arena),
-  reserved_range_(arena),
-  reserved_name_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto)
-}
-DescriptorProto::DescriptorProto(const DescriptorProto& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      field_(from.field_),
-      nested_type_(from.nested_type_),
-      enum_type_(from.enum_type_),
-      extension_range_(from.extension_range_),
-      extension_(from.extension_),
-      oneof_decl_(from.oneof_decl_),
-      reserved_range_(from.reserved_range_),
-      reserved_name_(from.reserved_name_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::MessageOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto)
-}
-
-void DescriptorProto::SharedCtor() {
-  _cached_size_ = 0;
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  options_ = NULL;
-}
-
-DescriptorProto::~DescriptorProto() {
-  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto)
-  SharedDtor();
-}
-
-void DescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-  name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
-}
-
-void DescriptorProto::ArenaDtor(void* object) {
-  DescriptorProto* _this = reinterpret_cast< DescriptorProto* >(object);
-  (void)_this;
-}
-void DescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void DescriptorProto::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* DescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const DescriptorProto& DescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto();
-  return *internal_default_instance();
-}
-
-DescriptorProto* DescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<DescriptorProto>(arena);
-}
-
-void DescriptorProto::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  field_.Clear();
-  nested_type_.Clear();
-  enum_type_.Clear();
-  extension_range_.Clear();
-  extension_.Clear();
-  oneof_decl_.Clear();
-  reserved_range_.Clear();
-  reserved_name_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
-    }
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool DescriptorProto::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // optional string name = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_name()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.DescriptorProto.name");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.FieldDescriptorProto field = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_field()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.DescriptorProto nested_type = 3;
-      case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_nested_type()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
-      case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_enum_type()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
-      case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_extension_range()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.FieldDescriptorProto extension = 6;
-      case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_extension()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional .google.protobuf.MessageOptions options = 7;
-      case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_options()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
-      case 8: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_oneof_decl()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
-      case 9: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(74u /* 74 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_reserved_range()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated string reserved_name = 10;
-      case 10: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->add_reserved_name()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->reserved_name(this->reserved_name_size() - 1).data(),
-            static_cast<int>(this->reserved_name(this->reserved_name_size() - 1).length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.DescriptorProto.reserved_name");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto)
-  return false;
-#undef DO_
-}
-
-void DescriptorProto::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.DescriptorProto.name");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      1, this->name(), output);
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto field = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->field_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->field(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.DescriptorProto nested_type = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->nested_type_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      3, this->nested_type(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->enum_type_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      4, this->enum_type(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->extension_range_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      5, this->extension_range(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->extension_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      6, this->extension(static_cast<int>(i)), output);
-  }
-
-  // optional .google.protobuf.MessageOptions options = 7;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      7, *this->options_, output);
-  }
-
-  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->oneof_decl_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      8, this->oneof_decl(static_cast<int>(i)), output);
-  }
-
-  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->reserved_range_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      9, this->reserved_range(static_cast<int>(i)), output);
-  }
-
-  // repeated string reserved_name = 10;
-  for (int i = 0, n = this->reserved_name_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->reserved_name(i).data(), static_cast<int>(this->reserved_name(i).length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.DescriptorProto.reserved_name");
-    ::google::protobuf::internal::WireFormatLite::WriteString(
-      10, this->reserved_name(i), output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto)
-}
-
-::google::protobuf::uint8* DescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.DescriptorProto.name");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        1, this->name(), target);
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto field = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->field_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->field(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.DescriptorProto nested_type = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->nested_type_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, this->nested_type(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->enum_type_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        4, this->enum_type(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->extension_range_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        5, this->extension_range(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->extension_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        6, this->extension(static_cast<int>(i)), deterministic, target);
-  }
-
-  // optional .google.protobuf.MessageOptions options = 7;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        7, *this->options_, deterministic, target);
-  }
-
-  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->oneof_decl_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        8, this->oneof_decl(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->reserved_range_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        9, this->reserved_range(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated string reserved_name = 10;
-  for (int i = 0, n = this->reserved_name_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->reserved_name(i).data(), static_cast<int>(this->reserved_name(i).length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.DescriptorProto.reserved_name");
-    target = ::google::protobuf::internal::WireFormatLite::
-      WriteStringToArray(10, this->reserved_name(i), target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto)
-  return target;
-}
-
-size_t DescriptorProto::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.FieldDescriptorProto field = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->field_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->field(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.DescriptorProto nested_type = 3;
-  {
-    unsigned int count = static_cast<unsigned int>(this->nested_type_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->nested_type(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
-  {
-    unsigned int count = static_cast<unsigned int>(this->enum_type_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->enum_type(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
-  {
-    unsigned int count = static_cast<unsigned int>(this->extension_range_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->extension_range(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
-  {
-    unsigned int count = static_cast<unsigned int>(this->extension_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->extension(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
-  {
-    unsigned int count = static_cast<unsigned int>(this->oneof_decl_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->oneof_decl(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
-  {
-    unsigned int count = static_cast<unsigned int>(this->reserved_range_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->reserved_range(static_cast<int>(i)));
-    }
-  }
-
-  // repeated string reserved_name = 10;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->reserved_name_size());
-  for (int i = 0, n = this->reserved_name_size(); i < n; i++) {
-    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
-      this->reserved_name(i));
-  }
-
-  if (_has_bits_[0 / 32] & 3u) {
-    // optional string name = 1;
-    if (has_name()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->name());
-    }
-
-    // optional .google.protobuf.MessageOptions options = 7;
-    if (has_options()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->options_);
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void DescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const DescriptorProto* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const DescriptorProto>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto)
-    MergeFrom(*source);
-  }
-}
-
-void DescriptorProto::MergeFrom(const DescriptorProto& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  field_.MergeFrom(from.field_);
-  nested_type_.MergeFrom(from.nested_type_);
-  enum_type_.MergeFrom(from.enum_type_);
-  extension_range_.MergeFrom(from.extension_range_);
-  extension_.MergeFrom(from.extension_);
-  oneof_decl_.MergeFrom(from.oneof_decl_);
-  reserved_range_.MergeFrom(from.reserved_range_);
-  reserved_name_.MergeFrom(from.reserved_name_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      mutable_options()->::google::protobuf::MessageOptions::MergeFrom(from.options());
-    }
-  }
-}
-
-void DescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void DescriptorProto::CopyFrom(const DescriptorProto& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool DescriptorProto::IsInitialized() const {
-  if (!::google::protobuf::internal::AllAreInitialized(this->field())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->nested_type())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->extension_range())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false;
-  if (!::google::protobuf::internal::AllAreInitialized(this->oneof_decl())) return false;
-  if (has_options()) {
-    if (!this->options_->IsInitialized()) return false;
-  }
-  return true;
-}
-
-void DescriptorProto::Swap(DescriptorProto* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    DescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void DescriptorProto::UnsafeArenaSwap(DescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void DescriptorProto::InternalSwap(DescriptorProto* other) {
-  using std::swap;
-  field_.InternalSwap(&other->field_);
-  nested_type_.InternalSwap(&other->nested_type_);
-  enum_type_.InternalSwap(&other->enum_type_);
-  extension_range_.InternalSwap(&other->extension_range_);
-  extension_.InternalSwap(&other->extension_);
-  oneof_decl_.InternalSwap(&other->oneof_decl_);
-  reserved_range_.InternalSwap(&other->reserved_range_);
-  reserved_name_.InternalSwap(&other->reserved_name_);
-  name_.Swap(&other->name_);
-  swap(options_, other->options_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata DescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void ExtensionRangeOptions::InitAsDefaultInstance() {
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int ExtensionRangeOptions::kUninterpretedOptionFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-ExtensionRangeOptions::ExtensionRangeOptions()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.ExtensionRangeOptions)
-}
-ExtensionRangeOptions::ExtensionRangeOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.ExtensionRangeOptions)
-}
-ExtensionRangeOptions::ExtensionRangeOptions(const ExtensionRangeOptions& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.ExtensionRangeOptions)
-}
-
-void ExtensionRangeOptions::SharedCtor() {
-  _cached_size_ = 0;
-}
-
-ExtensionRangeOptions::~ExtensionRangeOptions() {
-  // @@protoc_insertion_point(destructor:google.protobuf.ExtensionRangeOptions)
-  SharedDtor();
-}
-
-void ExtensionRangeOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-}
-
-void ExtensionRangeOptions::ArenaDtor(void* object) {
-  ExtensionRangeOptions* _this = reinterpret_cast< ExtensionRangeOptions* >(object);
-  (void)_this;
-}
-void ExtensionRangeOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void ExtensionRangeOptions::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* ExtensionRangeOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const ExtensionRangeOptions& ExtensionRangeOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions();
-  return *internal_default_instance();
-}
-
-ExtensionRangeOptions* ExtensionRangeOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<ExtensionRangeOptions>(arena);
-}
-
-void ExtensionRangeOptions::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.ExtensionRangeOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  _extensions_.Clear();
-  uninterpreted_option_.Clear();
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool ExtensionRangeOptions::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.ExtensionRangeOptions)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-      case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
-          continue;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.ExtensionRangeOptions)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.ExtensionRangeOptions)
-  return false;
-#undef DO_
-}
-
-void ExtensionRangeOptions::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.ExtensionRangeOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
-  }
-
-  // Extension range [1000, 536870912)
-  _extensions_.SerializeWithCachedSizes(
-      1000, 536870912, output);
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.ExtensionRangeOptions)
-}
-
-::google::protobuf::uint8* ExtensionRangeOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ExtensionRangeOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
-  }
-
-  // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ExtensionRangeOptions)
-  return target;
-}
-
-size_t ExtensionRangeOptions::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.ExtensionRangeOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
-
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void ExtensionRangeOptions::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ExtensionRangeOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const ExtensionRangeOptions* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const ExtensionRangeOptions>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.ExtensionRangeOptions)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.ExtensionRangeOptions)
-    MergeFrom(*source);
-  }
-}
-
-void ExtensionRangeOptions::MergeFrom(const ExtensionRangeOptions& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ExtensionRangeOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-}
-
-void ExtensionRangeOptions::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.ExtensionRangeOptions)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void ExtensionRangeOptions::CopyFrom(const ExtensionRangeOptions& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ExtensionRangeOptions)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool ExtensionRangeOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
-
-  if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
-}
-
-void ExtensionRangeOptions::Swap(ExtensionRangeOptions* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    ExtensionRangeOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void ExtensionRangeOptions::UnsafeArenaSwap(ExtensionRangeOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void ExtensionRangeOptions::InternalSwap(ExtensionRangeOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-  _extensions_.Swap(&other->_extensions_);
-}
-
-::google::protobuf::Metadata ExtensionRangeOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void FieldDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_FieldDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::FieldOptions*>(
-      ::google::protobuf::FieldOptions::internal_default_instance());
-}
-void FieldDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::FieldOptions >(
-      GetArenaNoVirtual());
-}
-void FieldDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::FieldOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
-  }
-  options_ = options;
-  if (options) {
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.options)
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int FieldDescriptorProto::kNameFieldNumber;
 const int FieldDescriptorProto::kNumberFieldNumber;
@@ -4479,74 +4236,36 @@
 
 FieldDescriptorProto::FieldDescriptorProto()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.FieldDescriptorProto)
 }
-FieldDescriptorProto::FieldDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldDescriptorProto)
+
+void FieldDescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::FieldOptions*>(&::google::protobuf::FieldOptions::default_instance());
 }
+
 FieldDescriptorProto::FieldDescriptorProto(const FieldDescriptorProto& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  extendee_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_extendee()) {
-    extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.extendee(),
-      GetArenaNoVirtual());
-  }
-  type_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_type_name()) {
-    type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_name(),
-      GetArenaNoVirtual());
-  }
-  default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_default_value()) {
-    default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.default_value(),
-      GetArenaNoVirtual());
-  }
-  json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_json_name()) {
-    json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.json_name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::FieldOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
-  ::memcpy(&number_, &from.number_,
-    static_cast<size_t>(reinterpret_cast<char*>(&type_) -
-    reinterpret_cast<char*>(&number_)) + sizeof(type_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldDescriptorProto)
 }
 
 void FieldDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  extendee_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  type_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&options_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&oneof_index_) -
-      reinterpret_cast<char*>(&options_)) + sizeof(oneof_index_));
+  number_ = 0;
   label_ = 1;
   type_ = 1;
+  type_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  extendee_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  oneof_index_ = 0;
+  json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  options_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 FieldDescriptorProto::~FieldDescriptorProto() {
@@ -4555,84 +4274,73 @@
 }
 
 void FieldDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  extendee_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   type_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  extendee_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   default_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   json_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
+  if (this != default_instance_) {
+    delete options_;
+  }
 }
 
-void FieldDescriptorProto::ArenaDtor(void* object) {
-  FieldDescriptorProto* _this = reinterpret_cast< FieldDescriptorProto* >(object);
-  (void)_this;
-}
-void FieldDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void FieldDescriptorProto::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* FieldDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return FieldDescriptorProto_descriptor_;
 }
 
 const FieldDescriptorProto& FieldDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+FieldDescriptorProto* FieldDescriptorProto::default_instance_ = NULL;
+
 FieldDescriptorProto* FieldDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<FieldDescriptorProto>(arena);
+  FieldDescriptorProto* n = new FieldDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void FieldDescriptorProto::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.FieldDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 63u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (_has_bits_[0 / 32] & 255u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!extendee_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      extendee_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000004u) {
-      GOOGLE_DCHECK(!type_name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      type_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000008u) {
-      GOOGLE_DCHECK(!default_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      default_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000010u) {
-      GOOGLE_DCHECK(!json_name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      json_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000020u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
-    }
-  }
-  if (cached_has_bits & 192u) {
-    ::memset(&number_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&oneof_index_) -
-        reinterpret_cast<char*>(&number_)) + sizeof(oneof_index_));
-  }
-  if (cached_has_bits & 768u) {
+    number_ = 0;
     label_ = 1;
     type_ = 1;
+    if (has_type_name()) {
+      type_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_extendee()) {
+      extendee_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_default_value()) {
+      default_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    oneof_index_ = 0;
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  if (_has_bits_[8 / 32] & 768u) {
+    if (has_json_name()) {
+      json_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear();
+    }
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool FieldDescriptorProto::MergePartialFromCodedStream(
@@ -4641,60 +4349,62 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.FieldDescriptorProto)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FieldDescriptorProto.name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_extendee;
         break;
       }
 
       // optional string extendee = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_extendee:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_extendee()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->extendee().data(), static_cast<int>(this->extendee().length()),
+            this->extendee().data(), this->extendee().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FieldDescriptorProto.extendee");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_number;
         break;
       }
 
       // optional int32 number = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-          set_has_number();
+        if (tag == 24) {
+         parse_number:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &number_)));
+          set_has_number();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(32)) goto parse_label;
         break;
       }
 
       // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) {
+        if (tag == 32) {
+         parse_label:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -4702,19 +4412,19 @@
           if (::google::protobuf::FieldDescriptorProto_Label_IsValid(value)) {
             set_label(static_cast< ::google::protobuf::FieldDescriptorProto_Label >(value));
           } else {
-            mutable_unknown_fields()->AddVarint(
-                4, static_cast< ::google::protobuf::uint64>(value));
+            mutable_unknown_fields()->AddVarint(4, value);
           }
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(40)) goto parse_type;
         break;
       }
 
       // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) {
+        if (tag == 40) {
+         parse_type:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -4722,96 +4432,103 @@
           if (::google::protobuf::FieldDescriptorProto_Type_IsValid(value)) {
             set_type(static_cast< ::google::protobuf::FieldDescriptorProto_Type >(value));
           } else {
-            mutable_unknown_fields()->AddVarint(
-                5, static_cast< ::google::protobuf::uint64>(value));
+            mutable_unknown_fields()->AddVarint(5, value);
           }
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_type_name;
         break;
       }
 
       // optional string type_name = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
+        if (tag == 50) {
+         parse_type_name:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_type_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->type_name().data(), static_cast<int>(this->type_name().length()),
+            this->type_name().data(), this->type_name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FieldDescriptorProto.type_name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(58)) goto parse_default_value;
         break;
       }
 
       // optional string default_value = 7;
       case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) {
+        if (tag == 58) {
+         parse_default_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_default_value()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->default_value().data(), static_cast<int>(this->default_value().length()),
+            this->default_value().data(), this->default_value().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FieldDescriptorProto.default_value");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(66)) goto parse_options;
         break;
       }
 
       // optional .google.protobuf.FieldOptions options = 8;
       case 8: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 66) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(72)) goto parse_oneof_index;
         break;
       }
 
       // optional int32 oneof_index = 9;
       case 9: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(72u /* 72 & 0xFF */)) {
-          set_has_oneof_index();
+        if (tag == 72) {
+         parse_oneof_index:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &oneof_index_)));
+          set_has_oneof_index();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(82)) goto parse_json_name;
         break;
       }
 
       // optional string json_name = 10;
       case 10: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) {
+        if (tag == 82) {
+         parse_json_name:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_json_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->json_name().data(), static_cast<int>(this->json_name().length()),
+            this->json_name().data(), this->json_name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FieldDescriptorProto.json_name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -4828,14 +4545,10 @@
 void FieldDescriptorProto::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.FieldDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -4843,9 +4556,9 @@
   }
 
   // optional string extendee = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_extendee()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->extendee().data(), static_cast<int>(this->extendee().length()),
+      this->extendee().data(), this->extendee().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.extendee");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -4853,26 +4566,26 @@
   }
 
   // optional int32 number = 3;
-  if (cached_has_bits & 0x00000040u) {
+  if (has_number()) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->number(), output);
   }
 
   // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
-  if (cached_has_bits & 0x00000100u) {
+  if (has_label()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       4, this->label(), output);
   }
 
   // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
-  if (cached_has_bits & 0x00000200u) {
+  if (has_type()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       5, this->type(), output);
   }
 
   // optional string type_name = 6;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_type_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->type_name().data(), static_cast<int>(this->type_name().length()),
+      this->type_name().data(), this->type_name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.type_name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -4880,9 +4593,9 @@
   }
 
   // optional string default_value = 7;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_default_value()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->default_value().data(), static_cast<int>(this->default_value().length()),
+      this->default_value().data(), this->default_value().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.default_value");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -4890,20 +4603,20 @@
   }
 
   // optional .google.protobuf.FieldOptions options = 8;
-  if (cached_has_bits & 0x00000020u) {
+  if (has_options()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       8, *this->options_, output);
   }
 
   // optional int32 oneof_index = 9;
-  if (cached_has_bits & 0x00000080u) {
+  if (has_oneof_index()) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(9, this->oneof_index(), output);
   }
 
   // optional string json_name = 10;
-  if (cached_has_bits & 0x00000010u) {
+  if (has_json_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->json_name().data(), static_cast<int>(this->json_name().length()),
+      this->json_name().data(), this->json_name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.json_name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -4912,23 +4625,18 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.FieldDescriptorProto)
 }
 
-::google::protobuf::uint8* FieldDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* FieldDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.name");
     target =
@@ -4937,9 +4645,9 @@
   }
 
   // optional string extendee = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_extendee()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->extendee().data(), static_cast<int>(this->extendee().length()),
+      this->extendee().data(), this->extendee().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.extendee");
     target =
@@ -4948,26 +4656,26 @@
   }
 
   // optional int32 number = 3;
-  if (cached_has_bits & 0x00000040u) {
+  if (has_number()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->number(), target);
   }
 
   // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
-  if (cached_has_bits & 0x00000100u) {
+  if (has_label()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       4, this->label(), target);
   }
 
   // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
-  if (cached_has_bits & 0x00000200u) {
+  if (has_type()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       5, this->type(), target);
   }
 
   // optional string type_name = 6;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_type_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->type_name().data(), static_cast<int>(this->type_name().length()),
+      this->type_name().data(), this->type_name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.type_name");
     target =
@@ -4976,9 +4684,9 @@
   }
 
   // optional string default_value = 7;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_default_value()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->default_value().data(), static_cast<int>(this->default_value().length()),
+      this->default_value().data(), this->default_value().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.default_value");
     target =
@@ -4987,21 +4695,21 @@
   }
 
   // optional .google.protobuf.FieldOptions options = 8;
-  if (cached_has_bits & 0x00000020u) {
+  if (has_options()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        8, *this->options_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        8, *this->options_, target);
   }
 
   // optional int32 oneof_index = 9;
-  if (cached_has_bits & 0x00000080u) {
+  if (has_oneof_index()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(9, this->oneof_index(), target);
   }
 
   // optional string json_name = 10;
-  if (cached_has_bits & 0x00000010u) {
+  if (has_json_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->json_name().data(), static_cast<int>(this->json_name().length()),
+      this->json_name().data(), this->json_name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FieldDescriptorProto.json_name");
     target =
@@ -5011,21 +4719,16 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldDescriptorProto)
   return target;
 }
 
-size_t FieldDescriptorProto::ByteSizeLong() const {
+int FieldDescriptorProto::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldDescriptorProto)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
   if (_has_bits_[0 / 32] & 255u) {
     // optional string name = 1;
     if (has_name()) {
@@ -5034,41 +4737,6 @@
           this->name());
     }
 
-    // optional string extendee = 2;
-    if (has_extendee()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->extendee());
-    }
-
-    // optional string type_name = 6;
-    if (has_type_name()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->type_name());
-    }
-
-    // optional string default_value = 7;
-    if (has_default_value()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->default_value());
-    }
-
-    // optional string json_name = 10;
-    if (has_json_name()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->json_name());
-    }
-
-    // optional .google.protobuf.FieldOptions options = 8;
-    if (has_options()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->options_);
-    }
-
     // optional int32 number = 3;
     if (has_number()) {
       total_size += 1 +
@@ -5076,15 +4744,6 @@
           this->number());
     }
 
-    // optional int32 oneof_index = 9;
-    if (has_oneof_index()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->oneof_index());
-    }
-
-  }
-  if (_has_bits_[8 / 32] & 768u) {
     // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
     if (has_label()) {
       total_size += 1 +
@@ -5097,18 +4756,66 @@
         ::google::protobuf::internal::WireFormatLite::EnumSize(this->type());
     }
 
+    // optional string type_name = 6;
+    if (has_type_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->type_name());
+    }
+
+    // optional string extendee = 2;
+    if (has_extendee()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->extendee());
+    }
+
+    // optional string default_value = 7;
+    if (has_default_value()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->default_value());
+    }
+
+    // optional int32 oneof_index = 9;
+    if (has_oneof_index()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->oneof_index());
+    }
+
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  if (_has_bits_[8 / 32] & 768u) {
+    // optional string json_name = 10;
+    if (has_json_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->json_name());
+    }
+
+    // optional .google.protobuf.FieldOptions options = 8;
+    if (has_options()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+          *this->options_);
+    }
+
+  }
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void FieldDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FieldDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FieldDescriptorProto* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FieldDescriptorProto* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const FieldDescriptorProto>(
           &from);
   if (source == NULL) {
@@ -5122,47 +4829,48 @@
 
 void FieldDescriptorProto::MergeFrom(const FieldDescriptorProto& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 255u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      set_extendee(from.extendee());
+    if (from.has_number()) {
+      set_number(from.number());
     }
-    if (cached_has_bits & 0x00000004u) {
-      set_type_name(from.type_name());
+    if (from.has_label()) {
+      set_label(from.label());
     }
-    if (cached_has_bits & 0x00000008u) {
-      set_default_value(from.default_value());
+    if (from.has_type()) {
+      set_type(from.type());
     }
-    if (cached_has_bits & 0x00000010u) {
-      set_json_name(from.json_name());
+    if (from.has_type_name()) {
+      set_has_type_name();
+      type_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_name_);
     }
-    if (cached_has_bits & 0x00000020u) {
+    if (from.has_extendee()) {
+      set_has_extendee();
+      extendee_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.extendee_);
+    }
+    if (from.has_default_value()) {
+      set_has_default_value();
+      default_value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.default_value_);
+    }
+    if (from.has_oneof_index()) {
+      set_oneof_index(from.oneof_index());
+    }
+  }
+  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    if (from.has_json_name()) {
+      set_has_json_name();
+      json_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.json_name_);
+    }
+    if (from.has_options()) {
       mutable_options()->::google::protobuf::FieldOptions::MergeFrom(from.options());
     }
-    if (cached_has_bits & 0x00000040u) {
-      number_ = from.number_;
-    }
-    if (cached_has_bits & 0x00000080u) {
-      oneof_index_ = from.oneof_index_;
-    }
-    _has_bits_[0] |= cached_has_bits;
   }
-  if (cached_has_bits & 768u) {
-    if (cached_has_bits & 0x00000100u) {
-      label_ = from.label_;
-    }
-    if (cached_has_bits & 0x00000200u) {
-      type_ = from.type_;
-    }
-    _has_bits_[0] |= cached_has_bits;
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -5181,6 +4889,7 @@
 }
 
 bool FieldDescriptorProto::IsInitialized() const {
+
   if (has_options()) {
     if (!this->options_->IsInitialized()) return false;
   }
@@ -5189,113 +4898,477 @@
 
 void FieldDescriptorProto::Swap(FieldDescriptorProto* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    FieldDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void FieldDescriptorProto::UnsafeArenaSwap(FieldDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void FieldDescriptorProto::InternalSwap(FieldDescriptorProto* other) {
-  using std::swap;
   name_.Swap(&other->name_);
-  extendee_.Swap(&other->extendee_);
+  std::swap(number_, other->number_);
+  std::swap(label_, other->label_);
+  std::swap(type_, other->type_);
   type_name_.Swap(&other->type_name_);
+  extendee_.Swap(&other->extendee_);
   default_value_.Swap(&other->default_value_);
+  std::swap(oneof_index_, other->oneof_index_);
   json_name_.Swap(&other->json_name_);
-  swap(options_, other->options_);
-  swap(number_, other->number_);
-  swap(oneof_index_, other->oneof_index_);
-  swap(label_, other->label_);
-  swap(type_, other->type_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(options_, other->options_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata FieldDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FieldDescriptorProto_descriptor_;
+  metadata.reflection = FieldDescriptorProto_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FieldDescriptorProto
 
-// ===================================================================
-
-void OneofDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_OneofDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::OneofOptions*>(
-      ::google::protobuf::OneofOptions::internal_default_instance());
+// optional string name = 1;
+bool FieldDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
 }
-void OneofDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::OneofOptions >(
-      GetArenaNoVirtual());
+void FieldDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
 }
-void OneofDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::OneofOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
+void FieldDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void FieldDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& FieldDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.name)
+}
+ void FieldDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.name)
+}
+ void FieldDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.name)
+}
+ ::std::string* FieldDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FieldDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
   }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.name)
+}
+
+// optional int32 number = 3;
+bool FieldDescriptorProto::has_number() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void FieldDescriptorProto::set_has_number() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void FieldDescriptorProto::clear_has_number() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void FieldDescriptorProto::clear_number() {
+  number_ = 0;
+  clear_has_number();
+}
+ ::google::protobuf::int32 FieldDescriptorProto::number() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.number)
+  return number_;
+}
+ void FieldDescriptorProto::set_number(::google::protobuf::int32 value) {
+  set_has_number();
+  number_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.number)
+}
+
+// optional .google.protobuf.FieldDescriptorProto.Label label = 4;
+bool FieldDescriptorProto::has_label() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void FieldDescriptorProto::set_has_label() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void FieldDescriptorProto::clear_has_label() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void FieldDescriptorProto::clear_label() {
+  label_ = 1;
+  clear_has_label();
+}
+ ::google::protobuf::FieldDescriptorProto_Label FieldDescriptorProto::label() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.label)
+  return static_cast< ::google::protobuf::FieldDescriptorProto_Label >(label_);
+}
+ void FieldDescriptorProto::set_label(::google::protobuf::FieldDescriptorProto_Label value) {
+  assert(::google::protobuf::FieldDescriptorProto_Label_IsValid(value));
+  set_has_label();
+  label_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.label)
+}
+
+// optional .google.protobuf.FieldDescriptorProto.Type type = 5;
+bool FieldDescriptorProto::has_type() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void FieldDescriptorProto::set_has_type() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void FieldDescriptorProto::clear_has_type() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void FieldDescriptorProto::clear_type() {
+  type_ = 1;
+  clear_has_type();
+}
+ ::google::protobuf::FieldDescriptorProto_Type FieldDescriptorProto::type() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type)
+  return static_cast< ::google::protobuf::FieldDescriptorProto_Type >(type_);
+}
+ void FieldDescriptorProto::set_type(::google::protobuf::FieldDescriptorProto_Type value) {
+  assert(::google::protobuf::FieldDescriptorProto_Type_IsValid(value));
+  set_has_type();
+  type_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type)
+}
+
+// optional string type_name = 6;
+bool FieldDescriptorProto::has_type_name() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+void FieldDescriptorProto::set_has_type_name() {
+  _has_bits_[0] |= 0x00000010u;
+}
+void FieldDescriptorProto::clear_has_type_name() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+void FieldDescriptorProto::clear_type_name() {
+  type_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_type_name();
+}
+ const ::std::string& FieldDescriptorProto::type_name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type_name)
+  return type_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_type_name(const ::std::string& value) {
+  set_has_type_name();
+  type_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type_name)
+}
+ void FieldDescriptorProto::set_type_name(const char* value) {
+  set_has_type_name();
+  type_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.type_name)
+}
+ void FieldDescriptorProto::set_type_name(const char* value, size_t size) {
+  set_has_type_name();
+  type_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.type_name)
+}
+ ::std::string* FieldDescriptorProto::mutable_type_name() {
+  set_has_type_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.type_name)
+  return type_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FieldDescriptorProto::release_type_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.type_name)
+  clear_has_type_name();
+  return type_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_allocated_type_name(::std::string* type_name) {
+  if (type_name != NULL) {
+    set_has_type_name();
+  } else {
+    clear_has_type_name();
+  }
+  type_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.type_name)
+}
+
+// optional string extendee = 2;
+bool FieldDescriptorProto::has_extendee() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+void FieldDescriptorProto::set_has_extendee() {
+  _has_bits_[0] |= 0x00000020u;
+}
+void FieldDescriptorProto::clear_has_extendee() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+void FieldDescriptorProto::clear_extendee() {
+  extendee_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_extendee();
+}
+ const ::std::string& FieldDescriptorProto::extendee() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.extendee)
+  return extendee_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_extendee(const ::std::string& value) {
+  set_has_extendee();
+  extendee_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.extendee)
+}
+ void FieldDescriptorProto::set_extendee(const char* value) {
+  set_has_extendee();
+  extendee_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.extendee)
+}
+ void FieldDescriptorProto::set_extendee(const char* value, size_t size) {
+  set_has_extendee();
+  extendee_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.extendee)
+}
+ ::std::string* FieldDescriptorProto::mutable_extendee() {
+  set_has_extendee();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.extendee)
+  return extendee_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FieldDescriptorProto::release_extendee() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.extendee)
+  clear_has_extendee();
+  return extendee_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_allocated_extendee(::std::string* extendee) {
+  if (extendee != NULL) {
+    set_has_extendee();
+  } else {
+    clear_has_extendee();
+  }
+  extendee_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), extendee);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.extendee)
+}
+
+// optional string default_value = 7;
+bool FieldDescriptorProto::has_default_value() const {
+  return (_has_bits_[0] & 0x00000040u) != 0;
+}
+void FieldDescriptorProto::set_has_default_value() {
+  _has_bits_[0] |= 0x00000040u;
+}
+void FieldDescriptorProto::clear_has_default_value() {
+  _has_bits_[0] &= ~0x00000040u;
+}
+void FieldDescriptorProto::clear_default_value() {
+  default_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_default_value();
+}
+ const ::std::string& FieldDescriptorProto::default_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.default_value)
+  return default_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_default_value(const ::std::string& value) {
+  set_has_default_value();
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.default_value)
+}
+ void FieldDescriptorProto::set_default_value(const char* value) {
+  set_has_default_value();
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.default_value)
+}
+ void FieldDescriptorProto::set_default_value(const char* value, size_t size) {
+  set_has_default_value();
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.default_value)
+}
+ ::std::string* FieldDescriptorProto::mutable_default_value() {
+  set_has_default_value();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.default_value)
+  return default_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FieldDescriptorProto::release_default_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.default_value)
+  clear_has_default_value();
+  return default_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_allocated_default_value(::std::string* default_value) {
+  if (default_value != NULL) {
+    set_has_default_value();
+  } else {
+    clear_has_default_value();
+  }
+  default_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.default_value)
+}
+
+// optional int32 oneof_index = 9;
+bool FieldDescriptorProto::has_oneof_index() const {
+  return (_has_bits_[0] & 0x00000080u) != 0;
+}
+void FieldDescriptorProto::set_has_oneof_index() {
+  _has_bits_[0] |= 0x00000080u;
+}
+void FieldDescriptorProto::clear_has_oneof_index() {
+  _has_bits_[0] &= ~0x00000080u;
+}
+void FieldDescriptorProto::clear_oneof_index() {
+  oneof_index_ = 0;
+  clear_has_oneof_index();
+}
+ ::google::protobuf::int32 FieldDescriptorProto::oneof_index() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.oneof_index)
+  return oneof_index_;
+}
+ void FieldDescriptorProto::set_oneof_index(::google::protobuf::int32 value) {
+  set_has_oneof_index();
+  oneof_index_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.oneof_index)
+}
+
+// optional string json_name = 10;
+bool FieldDescriptorProto::has_json_name() const {
+  return (_has_bits_[0] & 0x00000100u) != 0;
+}
+void FieldDescriptorProto::set_has_json_name() {
+  _has_bits_[0] |= 0x00000100u;
+}
+void FieldDescriptorProto::clear_has_json_name() {
+  _has_bits_[0] &= ~0x00000100u;
+}
+void FieldDescriptorProto::clear_json_name() {
+  json_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_json_name();
+}
+ const ::std::string& FieldDescriptorProto::json_name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.json_name)
+  return json_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_json_name(const ::std::string& value) {
+  set_has_json_name();
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.json_name)
+}
+ void FieldDescriptorProto::set_json_name(const char* value) {
+  set_has_json_name();
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.json_name)
+}
+ void FieldDescriptorProto::set_json_name(const char* value, size_t size) {
+  set_has_json_name();
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.json_name)
+}
+ ::std::string* FieldDescriptorProto::mutable_json_name() {
+  set_has_json_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.json_name)
+  return json_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FieldDescriptorProto::release_json_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.json_name)
+  clear_has_json_name();
+  return json_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FieldDescriptorProto::set_allocated_json_name(::std::string* json_name) {
+  if (json_name != NULL) {
+    set_has_json_name();
+  } else {
+    clear_has_json_name();
+  }
+  json_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.json_name)
+}
+
+// optional .google.protobuf.FieldOptions options = 8;
+bool FieldDescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000200u) != 0;
+}
+void FieldDescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000200u;
+}
+void FieldDescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000200u;
+}
+void FieldDescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::FieldOptions& FieldDescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::FieldOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.options)
+  return options_;
+}
+::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::FieldOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void FieldDescriptorProto::set_allocated_options(::google::protobuf::FieldOptions* options) {
+  delete options_;
   options_ = options;
   if (options) {
     set_has_options();
   } else {
     clear_has_options();
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.OneofDescriptorProto.options)
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.options)
 }
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int OneofDescriptorProto::kNameFieldNumber;
-const int OneofDescriptorProto::kOptionsFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 OneofDescriptorProto::OneofDescriptorProto()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.OneofDescriptorProto)
 }
-OneofDescriptorProto::OneofDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.OneofDescriptorProto)
+
+void OneofDescriptorProto::InitAsDefaultInstance() {
 }
+
 OneofDescriptorProto::OneofDescriptorProto(const OneofDescriptorProto& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::OneofOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofDescriptorProto)
 }
 
 void OneofDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  options_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 OneofDescriptorProto::~OneofDescriptorProto() {
@@ -5304,55 +5377,45 @@
 }
 
 void OneofDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
+  if (this != default_instance_) {
+  }
 }
 
-void OneofDescriptorProto::ArenaDtor(void* object) {
-  OneofDescriptorProto* _this = reinterpret_cast< OneofDescriptorProto* >(object);
-  (void)_this;
-}
-void OneofDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void OneofDescriptorProto::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* OneofDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return OneofDescriptorProto_descriptor_;
 }
 
 const OneofDescriptorProto& OneofDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+OneofDescriptorProto* OneofDescriptorProto::default_instance_ = NULL;
+
 OneofDescriptorProto* OneofDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<OneofDescriptorProto>(arena);
+  OneofDescriptorProto* n = new OneofDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void OneofDescriptorProto::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.OneofDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
-    }
+  if (has_name()) {
+    name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool OneofDescriptorProto::MergePartialFromCodedStream(
@@ -5361,45 +5424,35 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.OneofDescriptorProto)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.OneofDescriptorProto.name");
         } else {
           goto handle_unusual;
         }
-        break;
-      }
-
-      // optional .google.protobuf.OneofOptions options = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_options()));
-        } else {
-          goto handle_unusual;
-        }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -5416,45 +5469,30 @@
 void OneofDescriptorProto::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.OneofDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.OneofDescriptorProto.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->name(), output);
   }
 
-  // optional .google.protobuf.OneofOptions options = 2;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, *this->options_, output);
-  }
-
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.OneofDescriptorProto)
 }
 
-::google::protobuf::uint8* OneofDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* OneofDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.OneofDescriptorProto.name");
     target =
@@ -5462,57 +5500,40 @@
         1, this->name(), target);
   }
 
-  // optional .google.protobuf.OneofOptions options = 2;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, *this->options_, deterministic, target);
-  }
-
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofDescriptorProto)
   return target;
 }
 
-size_t OneofDescriptorProto::ByteSizeLong() const {
+int OneofDescriptorProto::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.OneofDescriptorProto)
-  size_t total_size = 0;
+  int total_size = 0;
+
+  // optional string name = 1;
+  if (has_name()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->name());
+  }
 
   if (_internal_metadata_.have_unknown_fields()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
+        unknown_fields());
   }
-  if (_has_bits_[0 / 32] & 3u) {
-    // optional string name = 1;
-    if (has_name()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->name());
-    }
-
-    // optional .google.protobuf.OneofOptions options = 2;
-    if (has_options()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->options_);
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void OneofDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.OneofDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const OneofDescriptorProto* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const OneofDescriptorProto* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const OneofDescriptorProto>(
           &from);
   if (source == NULL) {
@@ -5526,19 +5547,15 @@
 
 void OneofDescriptorProto::MergeFrom(const OneofDescriptorProto& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.OneofDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      mutable_options()->::google::protobuf::OneofOptions::MergeFrom(from.options());
-    }
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -5557,442 +5574,120 @@
 }
 
 bool OneofDescriptorProto::IsInitialized() const {
-  if (has_options()) {
-    if (!this->options_->IsInitialized()) return false;
-  }
+
   return true;
 }
 
 void OneofDescriptorProto::Swap(OneofDescriptorProto* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    OneofDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void OneofDescriptorProto::UnsafeArenaSwap(OneofDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void OneofDescriptorProto::InternalSwap(OneofDescriptorProto* other) {
-  using std::swap;
   name_.Swap(&other->name_);
-  swap(options_, other->options_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata OneofDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = OneofDescriptorProto_descriptor_;
+  metadata.reflection = OneofDescriptorProto_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// OneofDescriptorProto
+
+// optional string name = 1;
+bool OneofDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void OneofDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void OneofDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void OneofDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& OneofDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.OneofDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void OneofDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.OneofDescriptorProto.name)
+}
+ void OneofDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.OneofDescriptorProto.name)
+}
+ void OneofDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.OneofDescriptorProto.name)
+}
+ ::std::string* OneofDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.OneofDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* OneofDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.OneofDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void OneofDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.OneofDescriptorProto.name)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void EnumDescriptorProto_EnumReservedRange::InitAsDefaultInstance() {
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int EnumDescriptorProto_EnumReservedRange::kStartFieldNumber;
-const int EnumDescriptorProto_EnumReservedRange::kEndFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-}
-EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-}
-EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(const EnumDescriptorProto_EnumReservedRange& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::memcpy(&start_, &from.start_,
-    static_cast<size_t>(reinterpret_cast<char*>(&end_) -
-    reinterpret_cast<char*>(&start_)) + sizeof(end_));
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-}
-
-void EnumDescriptorProto_EnumReservedRange::SharedCtor() {
-  _cached_size_ = 0;
-  ::memset(&start_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&end_) -
-      reinterpret_cast<char*>(&start_)) + sizeof(end_));
-}
-
-EnumDescriptorProto_EnumReservedRange::~EnumDescriptorProto_EnumReservedRange() {
-  // @@protoc_insertion_point(destructor:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  SharedDtor();
-}
-
-void EnumDescriptorProto_EnumReservedRange::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-}
-
-void EnumDescriptorProto_EnumReservedRange::ArenaDtor(void* object) {
-  EnumDescriptorProto_EnumReservedRange* _this = reinterpret_cast< EnumDescriptorProto_EnumReservedRange* >(object);
-  (void)_this;
-}
-void EnumDescriptorProto_EnumReservedRange::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void EnumDescriptorProto_EnumReservedRange::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* EnumDescriptorProto_EnumReservedRange::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const EnumDescriptorProto_EnumReservedRange& EnumDescriptorProto_EnumReservedRange::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange();
-  return *internal_default_instance();
-}
-
-EnumDescriptorProto_EnumReservedRange* EnumDescriptorProto_EnumReservedRange::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<EnumDescriptorProto_EnumReservedRange>(arena);
-}
-
-void EnumDescriptorProto_EnumReservedRange::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    ::memset(&start_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&end_) -
-        reinterpret_cast<char*>(&start_)) + sizeof(end_));
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
-}
-
-bool EnumDescriptorProto_EnumReservedRange::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // optional int32 start = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-          set_has_start();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &start_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional int32 end = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_end();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 input, &end_)));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  return false;
-#undef DO_
-}
-
-void EnumDescriptorProto_EnumReservedRange::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 start = 1;
-  if (cached_has_bits & 0x00000001u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output);
-  }
-
-  // optional int32 end = 2;
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-}
-
-::google::protobuf::uint8* EnumDescriptorProto_EnumReservedRange::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  // optional int32 start = 1;
-  if (cached_has_bits & 0x00000001u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target);
-  }
-
-  // optional int32 end = 2;
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target);
-  }
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  return target;
-}
-
-size_t EnumDescriptorProto_EnumReservedRange::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  size_t total_size = 0;
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  if (_has_bits_[0 / 32] & 3u) {
-    // optional int32 start = 1;
-    if (has_start()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->start());
-    }
-
-    // optional int32 end = 2;
-    if (has_end()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-          this->end());
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void EnumDescriptorProto_EnumReservedRange::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  GOOGLE_DCHECK_NE(&from, this);
-  const EnumDescriptorProto_EnumReservedRange* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const EnumDescriptorProto_EnumReservedRange>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-    MergeFrom(*source);
-  }
-}
-
-void EnumDescriptorProto_EnumReservedRange::MergeFrom(const EnumDescriptorProto_EnumReservedRange& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      start_ = from.start_;
-    }
-    if (cached_has_bits & 0x00000002u) {
-      end_ = from.end_;
-    }
-    _has_bits_[0] |= cached_has_bits;
-  }
-}
-
-void EnumDescriptorProto_EnumReservedRange::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void EnumDescriptorProto_EnumReservedRange::CopyFrom(const EnumDescriptorProto_EnumReservedRange& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool EnumDescriptorProto_EnumReservedRange::IsInitialized() const {
-  return true;
-}
-
-void EnumDescriptorProto_EnumReservedRange::Swap(EnumDescriptorProto_EnumReservedRange* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    EnumDescriptorProto_EnumReservedRange* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void EnumDescriptorProto_EnumReservedRange::UnsafeArenaSwap(EnumDescriptorProto_EnumReservedRange* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void EnumDescriptorProto_EnumReservedRange::InternalSwap(EnumDescriptorProto_EnumReservedRange* other) {
-  using std::swap;
-  swap(start_, other->start_);
-  swap(end_, other->end_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata EnumDescriptorProto_EnumReservedRange::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void EnumDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_EnumDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::EnumOptions*>(
-      ::google::protobuf::EnumOptions::internal_default_instance());
-}
-void EnumDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::EnumOptions >(
-      GetArenaNoVirtual());
-}
-void EnumDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::EnumOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
-  }
-  options_ = options;
-  if (options) {
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumDescriptorProto.options)
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int EnumDescriptorProto::kNameFieldNumber;
 const int EnumDescriptorProto::kValueFieldNumber;
 const int EnumDescriptorProto::kOptionsFieldNumber;
-const int EnumDescriptorProto::kReservedRangeFieldNumber;
-const int EnumDescriptorProto::kReservedNameFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 EnumDescriptorProto::EnumDescriptorProto()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.EnumDescriptorProto)
 }
-EnumDescriptorProto::EnumDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  value_(arena),
-  reserved_range_(arena),
-  reserved_name_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumDescriptorProto)
+
+void EnumDescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::EnumOptions*>(&::google::protobuf::EnumOptions::default_instance());
 }
+
 EnumDescriptorProto::EnumDescriptorProto(const EnumDescriptorProto& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      value_(from.value_),
-      reserved_range_(from.reserved_range_),
-      reserved_name_(from.reserved_name_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::EnumOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumDescriptorProto)
 }
 
 void EnumDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   options_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 EnumDescriptorProto::~EnumDescriptorProto() {
@@ -6001,58 +5696,52 @@
 }
 
 void EnumDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
+  if (this != default_instance_) {
+    delete options_;
+  }
 }
 
-void EnumDescriptorProto::ArenaDtor(void* object) {
-  EnumDescriptorProto* _this = reinterpret_cast< EnumDescriptorProto* >(object);
-  (void)_this;
-}
-void EnumDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void EnumDescriptorProto::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* EnumDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return EnumDescriptorProto_descriptor_;
 }
 
 const EnumDescriptorProto& EnumDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+EnumDescriptorProto* EnumDescriptorProto::default_instance_ = NULL;
+
 EnumDescriptorProto* EnumDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<EnumDescriptorProto>(arena);
+  EnumDescriptorProto* n = new EnumDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void EnumDescriptorProto::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  value_.Clear();
-  reserved_range_.Clear();
-  reserved_name_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (_has_bits_[0 / 32] & 5u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear();
     }
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  value_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool EnumDescriptorProto::MergePartialFromCodedStream(
@@ -6061,84 +5750,65 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.EnumDescriptorProto)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.EnumDescriptorProto.name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_value;
         break;
       }
 
       // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_value()));
+        if (tag == 18) {
+         parse_value:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_value:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_loop_value;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(26)) goto parse_options;
         break;
       }
 
       // optional .google.protobuf.EnumOptions options = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 26) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_options()));
         } else {
           goto handle_unusual;
         }
-        break;
-      }
-
-      // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-      case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_reserved_range()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated string reserved_name = 5;
-      case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->add_reserved_name()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->reserved_name(this->reserved_name_size() - 1).data(),
-            static_cast<int>(this->reserved_name(this->reserved_name_size() - 1).length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.EnumDescriptorProto.reserved_name");
-        } else {
-          goto handle_unusual;
-        }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -6155,14 +5825,10 @@
 void EnumDescriptorProto::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.EnumDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.EnumDescriptorProto.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -6170,54 +5836,31 @@
   }
 
   // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->value_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->value_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->value(static_cast<int>(i)), output);
+      2, this->value(i), output);
   }
 
   // optional .google.protobuf.EnumOptions options = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_options()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       3, *this->options_, output);
   }
 
-  // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->reserved_range_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      4, this->reserved_range(static_cast<int>(i)), output);
-  }
-
-  // repeated string reserved_name = 5;
-  for (int i = 0, n = this->reserved_name_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->reserved_name(i).data(), static_cast<int>(this->reserved_name(i).length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.EnumDescriptorProto.reserved_name");
-    ::google::protobuf::internal::WireFormatLite::WriteString(
-      5, this->reserved_name(i), output);
-  }
-
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.EnumDescriptorProto)
 }
 
-::google::protobuf::uint8* EnumDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* EnumDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.EnumDescriptorProto.name");
     target =
@@ -6226,86 +5869,32 @@
   }
 
   // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->value_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->value_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->value(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        2, this->value(i), target);
   }
 
   // optional .google.protobuf.EnumOptions options = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_options()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, *this->options_, deterministic, target);
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->reserved_range_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        4, this->reserved_range(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated string reserved_name = 5;
-  for (int i = 0, n = this->reserved_name_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->reserved_name(i).data(), static_cast<int>(this->reserved_name(i).length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.EnumDescriptorProto.reserved_name");
-    target = ::google::protobuf::internal::WireFormatLite::
-      WriteStringToArray(5, this->reserved_name(i), target);
+      WriteMessageNoVirtualToArray(
+        3, *this->options_, target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto)
   return target;
 }
 
-size_t EnumDescriptorProto::ByteSizeLong() const {
+int EnumDescriptorProto::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumDescriptorProto)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->value_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->value(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-  {
-    unsigned int count = static_cast<unsigned int>(this->reserved_range_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->reserved_range(static_cast<int>(i)));
-    }
-  }
-
-  // repeated string reserved_name = 5;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->reserved_name_size());
-  for (int i = 0, n = this->reserved_name_size(); i < n; i++) {
-    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
-      this->reserved_name(i));
-  }
-
-  if (_has_bits_[0 / 32] & 3u) {
+  if (_has_bits_[0 / 32] & 5u) {
     // optional string name = 1;
     if (has_name()) {
       total_size += 1 +
@@ -6316,22 +5905,34 @@
     // optional .google.protobuf.EnumOptions options = 3;
     if (has_options()) {
       total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           *this->options_);
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
+  total_size += 1 * this->value_size();
+  for (int i = 0; i < this->value_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->value(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void EnumDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const EnumDescriptorProto* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const EnumDescriptorProto* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const EnumDescriptorProto>(
           &from);
   if (source == NULL) {
@@ -6345,23 +5946,20 @@
 
 void EnumDescriptorProto::MergeFrom(const EnumDescriptorProto& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   value_.MergeFrom(from.value_);
-  reserved_range_.MergeFrom(from.reserved_range_);
-  reserved_name_.MergeFrom(from.reserved_name_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
+    if (from.has_options()) {
       mutable_options()->::google::protobuf::EnumOptions::MergeFrom(from.options());
     }
   }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
 }
 
 void EnumDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {
@@ -6379,6 +5977,7 @@
 }
 
 bool EnumDescriptorProto::IsInitialized() const {
+
   if (!::google::protobuf::internal::AllAreInitialized(this->value())) return false;
   if (has_options()) {
     if (!this->options_->IsInitialized()) return false;
@@ -6388,64 +5987,160 @@
 
 void EnumDescriptorProto::Swap(EnumDescriptorProto* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    EnumDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void EnumDescriptorProto::UnsafeArenaSwap(EnumDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void EnumDescriptorProto::InternalSwap(EnumDescriptorProto* other) {
-  using std::swap;
-  value_.InternalSwap(&other->value_);
-  reserved_range_.InternalSwap(&other->reserved_range_);
-  reserved_name_.InternalSwap(&other->reserved_name_);
   name_.Swap(&other->name_);
-  swap(options_, other->options_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  value_.UnsafeArenaSwap(&other->value_);
+  std::swap(options_, other->options_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata EnumDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = EnumDescriptorProto_descriptor_;
+  metadata.reflection = EnumDescriptorProto_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// EnumDescriptorProto
 
-// ===================================================================
-
-void EnumValueDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_EnumValueDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::EnumValueOptions*>(
-      ::google::protobuf::EnumValueOptions::internal_default_instance());
+// optional string name = 1;
+bool EnumDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
 }
-void EnumValueDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::EnumValueOptions >(
-      GetArenaNoVirtual());
+void EnumDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
 }
-void EnumValueDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::EnumValueOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
+void EnumDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void EnumDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& EnumDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void EnumDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.name)
+}
+ void EnumDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.EnumDescriptorProto.name)
+}
+ void EnumDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumDescriptorProto.name)
+}
+ ::std::string* EnumDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* EnumDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void EnumDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
   }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.name)
+}
+
+// repeated .google.protobuf.EnumValueDescriptorProto value = 2;
+int EnumDescriptorProto::value_size() const {
+  return value_.size();
+}
+void EnumDescriptorProto::clear_value() {
+  value_.Clear();
+}
+const ::google::protobuf::EnumValueDescriptorProto& EnumDescriptorProto::value(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.value)
+  return value_.Get(index);
+}
+::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::mutable_value(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.value)
+  return value_.Mutable(index);
+}
+::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::add_value() {
+  // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.value)
+  return value_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >*
+EnumDescriptorProto::mutable_value() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.value)
+  return &value_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >&
+EnumDescriptorProto::value() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.value)
+  return value_;
+}
+
+// optional .google.protobuf.EnumOptions options = 3;
+bool EnumDescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void EnumDescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void EnumDescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void EnumDescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::EnumOptions& EnumDescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::EnumOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.options)
+  return options_;
+}
+::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::EnumOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void EnumDescriptorProto::set_allocated_options(::google::protobuf::EnumOptions* options) {
+  delete options_;
   options_ = options;
   if (options) {
     set_has_options();
   } else {
     clear_has_options();
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumValueDescriptorProto.options)
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.options)
 }
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int EnumValueDescriptorProto::kNameFieldNumber;
 const int EnumValueDescriptorProto::kNumberFieldNumber;
@@ -6454,46 +6149,29 @@
 
 EnumValueDescriptorProto::EnumValueDescriptorProto()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.EnumValueDescriptorProto)
 }
-EnumValueDescriptorProto::EnumValueDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValueDescriptorProto)
+
+void EnumValueDescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::EnumValueOptions*>(&::google::protobuf::EnumValueOptions::default_instance());
 }
+
 EnumValueDescriptorProto::EnumValueDescriptorProto(const EnumValueDescriptorProto& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::EnumValueOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
-  number_ = from.number_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueDescriptorProto)
 }
 
 void EnumValueDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&options_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&number_) -
-      reinterpret_cast<char*>(&options_)) + sizeof(number_));
+  number_ = 0;
+  options_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 EnumValueDescriptorProto::~EnumValueDescriptorProto() {
@@ -6502,56 +6180,52 @@
 }
 
 void EnumValueDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
+  if (this != default_instance_) {
+    delete options_;
+  }
 }
 
-void EnumValueDescriptorProto::ArenaDtor(void* object) {
-  EnumValueDescriptorProto* _this = reinterpret_cast< EnumValueDescriptorProto* >(object);
-  (void)_this;
-}
-void EnumValueDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void EnumValueDescriptorProto::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* EnumValueDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return EnumValueDescriptorProto_descriptor_;
 }
 
 const EnumValueDescriptorProto& EnumValueDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+EnumValueDescriptorProto* EnumValueDescriptorProto::default_instance_ = NULL;
+
 EnumValueDescriptorProto* EnumValueDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<EnumValueDescriptorProto>(arena);
+  EnumValueDescriptorProto* n = new EnumValueDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void EnumValueDescriptorProto::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValueDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (_has_bits_[0 / 32] & 7u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
+    number_ = 0;
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear();
     }
   }
-  number_ = 0;
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool EnumValueDescriptorProto::MergePartialFromCodedStream(
@@ -6560,59 +6234,63 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.EnumValueDescriptorProto)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.EnumValueDescriptorProto.name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_number;
         break;
       }
 
       // optional int32 number = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_number();
+        if (tag == 16) {
+         parse_number:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &number_)));
+          set_has_number();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_options;
         break;
       }
 
       // optional .google.protobuf.EnumValueOptions options = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 26) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -6629,14 +6307,10 @@
 void EnumValueDescriptorProto::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValueDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.EnumValueDescriptorProto.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -6644,35 +6318,30 @@
   }
 
   // optional int32 number = 2;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_number()) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->number(), output);
   }
 
   // optional .google.protobuf.EnumValueOptions options = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_options()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       3, *this->options_, output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValueDescriptorProto)
 }
 
-::google::protobuf::uint8* EnumValueDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* EnumValueDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.EnumValueDescriptorProto.name");
     target =
@@ -6681,34 +6350,29 @@
   }
 
   // optional int32 number = 2;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_number()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->number(), target);
   }
 
   // optional .google.protobuf.EnumValueOptions options = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_options()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, *this->options_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        3, *this->options_, target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueDescriptorProto)
   return target;
 }
 
-size_t EnumValueDescriptorProto::ByteSizeLong() const {
+int EnumValueDescriptorProto::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValueDescriptorProto)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
   if (_has_bits_[0 / 32] & 7u) {
     // optional string name = 1;
     if (has_name()) {
@@ -6717,13 +6381,6 @@
           this->name());
     }
 
-    // optional .google.protobuf.EnumValueOptions options = 3;
-    if (has_options()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          *this->options_);
-    }
-
     // optional int32 number = 2;
     if (has_number()) {
       total_size += 1 +
@@ -6731,18 +6388,29 @@
           this->number());
     }
 
+    // optional .google.protobuf.EnumValueOptions options = 3;
+    if (has_options()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+          *this->options_);
+    }
+
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void EnumValueDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumValueDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const EnumValueDescriptorProto* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const EnumValueDescriptorProto* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const EnumValueDescriptorProto>(
           &from);
   if (source == NULL) {
@@ -6756,23 +6424,21 @@
 
 void EnumValueDescriptorProto::MergeFrom(const EnumValueDescriptorProto& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValueDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 7u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
+    if (from.has_number()) {
+      set_number(from.number());
+    }
+    if (from.has_options()) {
       mutable_options()->::google::protobuf::EnumValueOptions::MergeFrom(from.options());
     }
-    if (cached_has_bits & 0x00000004u) {
-      number_ = from.number_;
-    }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -6791,6 +6457,7 @@
 }
 
 bool EnumValueDescriptorProto::IsInitialized() const {
+
   if (has_options()) {
     if (!this->options_->IsInitialized()) return false;
   }
@@ -6799,62 +6466,154 @@
 
 void EnumValueDescriptorProto::Swap(EnumValueDescriptorProto* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    EnumValueDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void EnumValueDescriptorProto::UnsafeArenaSwap(EnumValueDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void EnumValueDescriptorProto::InternalSwap(EnumValueDescriptorProto* other) {
-  using std::swap;
   name_.Swap(&other->name_);
-  swap(options_, other->options_);
-  swap(number_, other->number_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(number_, other->number_);
+  std::swap(options_, other->options_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata EnumValueDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = EnumValueDescriptorProto_descriptor_;
+  metadata.reflection = EnumValueDescriptorProto_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// EnumValueDescriptorProto
 
-// ===================================================================
-
-void ServiceDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_ServiceDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::ServiceOptions*>(
-      ::google::protobuf::ServiceOptions::internal_default_instance());
+// optional string name = 1;
+bool EnumValueDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
 }
-void ServiceDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::ServiceOptions >(
-      GetArenaNoVirtual());
+void EnumValueDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
 }
-void ServiceDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::ServiceOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
+void EnumValueDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void EnumValueDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& EnumValueDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void EnumValueDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.name)
+}
+ void EnumValueDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.EnumValueDescriptorProto.name)
+}
+ void EnumValueDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumValueDescriptorProto.name)
+}
+ ::std::string* EnumValueDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* EnumValueDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void EnumValueDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
   }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.name)
+}
+
+// optional int32 number = 2;
+bool EnumValueDescriptorProto::has_number() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void EnumValueDescriptorProto::set_has_number() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void EnumValueDescriptorProto::clear_has_number() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void EnumValueDescriptorProto::clear_number() {
+  number_ = 0;
+  clear_has_number();
+}
+ ::google::protobuf::int32 EnumValueDescriptorProto::number() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.number)
+  return number_;
+}
+ void EnumValueDescriptorProto::set_number(::google::protobuf::int32 value) {
+  set_has_number();
+  number_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.number)
+}
+
+// optional .google.protobuf.EnumValueOptions options = 3;
+bool EnumValueDescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void EnumValueDescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void EnumValueDescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void EnumValueDescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::EnumValueOptions& EnumValueDescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::EnumValueOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.options)
+  return options_;
+}
+::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::EnumValueOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void EnumValueDescriptorProto::set_allocated_options(::google::protobuf::EnumValueOptions* options) {
+  delete options_;
   options_ = options;
   if (options) {
     set_has_options();
   } else {
     clear_has_options();
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.ServiceDescriptorProto.options)
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.options)
 }
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int ServiceDescriptorProto::kNameFieldNumber;
 const int ServiceDescriptorProto::kMethodFieldNumber;
@@ -6863,45 +6622,28 @@
 
 ServiceDescriptorProto::ServiceDescriptorProto()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.ServiceDescriptorProto)
 }
-ServiceDescriptorProto::ServiceDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  method_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.ServiceDescriptorProto)
+
+void ServiceDescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::ServiceOptions*>(&::google::protobuf::ServiceOptions::default_instance());
 }
+
 ServiceDescriptorProto::ServiceDescriptorProto(const ServiceDescriptorProto& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      method_(from.method_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::ServiceOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceDescriptorProto)
 }
 
 void ServiceDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   options_ = NULL;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 ServiceDescriptorProto::~ServiceDescriptorProto() {
@@ -6910,56 +6652,52 @@
 }
 
 void ServiceDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
+  if (this != default_instance_) {
+    delete options_;
+  }
 }
 
-void ServiceDescriptorProto::ArenaDtor(void* object) {
-  ServiceDescriptorProto* _this = reinterpret_cast< ServiceDescriptorProto* >(object);
-  (void)_this;
-}
-void ServiceDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void ServiceDescriptorProto::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* ServiceDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return ServiceDescriptorProto_descriptor_;
 }
 
 const ServiceDescriptorProto& ServiceDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+ServiceDescriptorProto* ServiceDescriptorProto::default_instance_ = NULL;
+
 ServiceDescriptorProto* ServiceDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<ServiceDescriptorProto>(arena);
+  ServiceDescriptorProto* n = new ServiceDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void ServiceDescriptorProto::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.ServiceDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  method_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (_has_bits_[0 / 32] & 5u) {
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear();
     }
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  method_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool ServiceDescriptorProto::MergePartialFromCodedStream(
@@ -6968,56 +6706,65 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.ServiceDescriptorProto)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.ServiceDescriptorProto.name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_method;
         break;
       }
 
       // repeated .google.protobuf.MethodDescriptorProto method = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_method()));
+        if (tag == 18) {
+         parse_method:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_method:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_method()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_loop_method;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(26)) goto parse_options;
         break;
       }
 
       // optional .google.protobuf.ServiceOptions options = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 26) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -7034,14 +6781,10 @@
 void ServiceDescriptorProto::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.ServiceDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.ServiceDescriptorProto.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -7049,37 +6792,31 @@
   }
 
   // repeated .google.protobuf.MethodDescriptorProto method = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->method_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->method_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->method(static_cast<int>(i)), output);
+      2, this->method(i), output);
   }
 
   // optional .google.protobuf.ServiceOptions options = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_options()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       3, *this->options_, output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.ServiceDescriptorProto)
 }
 
-::google::protobuf::uint8* ServiceDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* ServiceDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.ServiceDescriptorProto.name");
     target =
@@ -7088,49 +6825,32 @@
   }
 
   // repeated .google.protobuf.MethodDescriptorProto method = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->method_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->method_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->method(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        2, this->method(i), target);
   }
 
   // optional .google.protobuf.ServiceOptions options = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_options()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, *this->options_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        3, *this->options_, target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceDescriptorProto)
   return target;
 }
 
-size_t ServiceDescriptorProto::ByteSizeLong() const {
+int ServiceDescriptorProto::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ServiceDescriptorProto)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.MethodDescriptorProto method = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->method_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->method(static_cast<int>(i)));
-    }
-  }
-
-  if (_has_bits_[0 / 32] & 3u) {
+  if (_has_bits_[0 / 32] & 5u) {
     // optional string name = 1;
     if (has_name()) {
       total_size += 1 +
@@ -7141,22 +6861,34 @@
     // optional .google.protobuf.ServiceOptions options = 3;
     if (has_options()) {
       total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           *this->options_);
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.MethodDescriptorProto method = 2;
+  total_size += 1 * this->method_size();
+  for (int i = 0; i < this->method_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->method(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void ServiceDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ServiceDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const ServiceDescriptorProto* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const ServiceDescriptorProto* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const ServiceDescriptorProto>(
           &from);
   if (source == NULL) {
@@ -7170,21 +6902,20 @@
 
 void ServiceDescriptorProto::MergeFrom(const ServiceDescriptorProto& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ServiceDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   method_.MergeFrom(from.method_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
+    if (from.has_options()) {
       mutable_options()->::google::protobuf::ServiceOptions::MergeFrom(from.options());
     }
   }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
 }
 
 void ServiceDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {
@@ -7202,6 +6933,7 @@
 }
 
 bool ServiceDescriptorProto::IsInitialized() const {
+
   if (!::google::protobuf::internal::AllAreInitialized(this->method())) return false;
   if (has_options()) {
     if (!this->options_->IsInitialized()) return false;
@@ -7211,62 +6943,160 @@
 
 void ServiceDescriptorProto::Swap(ServiceDescriptorProto* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    ServiceDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void ServiceDescriptorProto::UnsafeArenaSwap(ServiceDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void ServiceDescriptorProto::InternalSwap(ServiceDescriptorProto* other) {
-  using std::swap;
-  method_.InternalSwap(&other->method_);
   name_.Swap(&other->name_);
-  swap(options_, other->options_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  method_.UnsafeArenaSwap(&other->method_);
+  std::swap(options_, other->options_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata ServiceDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = ServiceDescriptorProto_descriptor_;
+  metadata.reflection = ServiceDescriptorProto_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// ServiceDescriptorProto
 
-// ===================================================================
-
-void MethodDescriptorProto::InitAsDefaultInstance() {
-  ::google::protobuf::_MethodDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::MethodOptions*>(
-      ::google::protobuf::MethodOptions::internal_default_instance());
+// optional string name = 1;
+bool ServiceDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
 }
-void MethodDescriptorProto::_slow_mutable_options() {
-  options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::MethodOptions >(
-      GetArenaNoVirtual());
+void ServiceDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
 }
-void MethodDescriptorProto::unsafe_arena_set_allocated_options(
-    ::google::protobuf::MethodOptions* options) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete options_;
+void ServiceDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void ServiceDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& ServiceDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void ServiceDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.ServiceDescriptorProto.name)
+}
+ void ServiceDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.ServiceDescriptorProto.name)
+}
+ void ServiceDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.ServiceDescriptorProto.name)
+}
+ ::std::string* ServiceDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* ServiceDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void ServiceDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
   }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.name)
+}
+
+// repeated .google.protobuf.MethodDescriptorProto method = 2;
+int ServiceDescriptorProto::method_size() const {
+  return method_.size();
+}
+void ServiceDescriptorProto::clear_method() {
+  method_.Clear();
+}
+const ::google::protobuf::MethodDescriptorProto& ServiceDescriptorProto::method(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.method)
+  return method_.Get(index);
+}
+::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::mutable_method(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.method)
+  return method_.Mutable(index);
+}
+::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::add_method() {
+  // @@protoc_insertion_point(field_add:google.protobuf.ServiceDescriptorProto.method)
+  return method_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >*
+ServiceDescriptorProto::mutable_method() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.ServiceDescriptorProto.method)
+  return &method_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >&
+ServiceDescriptorProto::method() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.ServiceDescriptorProto.method)
+  return method_;
+}
+
+// optional .google.protobuf.ServiceOptions options = 3;
+bool ServiceDescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void ServiceDescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void ServiceDescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void ServiceDescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::ServiceOptions& ServiceDescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::ServiceOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.options)
+  return options_;
+}
+::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::ServiceOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void ServiceDescriptorProto::set_allocated_options(::google::protobuf::ServiceOptions* options) {
+  delete options_;
   options_ = options;
   if (options) {
     set_has_options();
   } else {
     clear_has_options();
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.options)
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.options)
 }
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int MethodDescriptorProto::kNameFieldNumber;
 const int MethodDescriptorProto::kInputTypeFieldNumber;
@@ -7278,60 +7108,32 @@
 
 MethodDescriptorProto::MethodDescriptorProto()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.MethodDescriptorProto)
 }
-MethodDescriptorProto::MethodDescriptorProto(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.MethodDescriptorProto)
+
+void MethodDescriptorProto::InitAsDefaultInstance() {
+  options_ = const_cast< ::google::protobuf::MethodOptions*>(&::google::protobuf::MethodOptions::default_instance());
 }
+
 MethodDescriptorProto::MethodDescriptorProto(const MethodDescriptorProto& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name()) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  input_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_input_type()) {
-    input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.input_type(),
-      GetArenaNoVirtual());
-  }
-  output_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_output_type()) {
-    output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.output_type(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_options()) {
-    options_ = new ::google::protobuf::MethodOptions(*from.options_);
-  } else {
-    options_ = NULL;
-  }
-  ::memcpy(&client_streaming_, &from.client_streaming_,
-    static_cast<size_t>(reinterpret_cast<char*>(&server_streaming_) -
-    reinterpret_cast<char*>(&client_streaming_)) + sizeof(server_streaming_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodDescriptorProto)
 }
 
 void MethodDescriptorProto::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   input_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   output_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&options_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&server_streaming_) -
-      reinterpret_cast<char*>(&options_)) + sizeof(server_streaming_));
+  options_ = NULL;
+  client_streaming_ = false;
+  server_streaming_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 MethodDescriptorProto::~MethodDescriptorProto() {
@@ -7340,68 +7142,80 @@
 }
 
 void MethodDescriptorProto::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   input_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   output_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete options_;
+  if (this != default_instance_) {
+    delete options_;
+  }
 }
 
-void MethodDescriptorProto::ArenaDtor(void* object) {
-  MethodDescriptorProto* _this = reinterpret_cast< MethodDescriptorProto* >(object);
-  (void)_this;
-}
-void MethodDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void MethodDescriptorProto::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* MethodDescriptorProto::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return MethodDescriptorProto_descriptor_;
 }
 
 const MethodDescriptorProto& MethodDescriptorProto::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+MethodDescriptorProto* MethodDescriptorProto::default_instance_ = NULL;
+
 MethodDescriptorProto* MethodDescriptorProto::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<MethodDescriptorProto>(arena);
+  MethodDescriptorProto* n = new MethodDescriptorProto;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void MethodDescriptorProto::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.MethodDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(MethodDescriptorProto, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<MethodDescriptorProto*>(16)->f)
+#endif
 
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 15u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  if (_has_bits_[0 / 32] & 63u) {
+    ZR_(client_streaming_, server_streaming_);
+    if (has_name()) {
+      name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!input_type_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      input_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+    if (has_input_type()) {
+      input_type_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000004u) {
-      GOOGLE_DCHECK(!output_type_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      output_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+    if (has_output_type()) {
+      output_type_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000008u) {
-      GOOGLE_DCHECK(options_ != NULL);
-      options_->Clear();
+    if (has_options()) {
+      if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear();
     }
   }
-  ::memset(&client_streaming_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&server_streaming_) -
-      reinterpret_cast<char*>(&client_streaming_)) + sizeof(server_streaming_));
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+
+#undef ZR_HELPER_
+#undef ZR_
+
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool MethodDescriptorProto::MergePartialFromCodedStream(
@@ -7410,105 +7224,112 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.MethodDescriptorProto)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.MethodDescriptorProto.name");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_input_type;
         break;
       }
 
       // optional string input_type = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_input_type:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_input_type()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->input_type().data(), static_cast<int>(this->input_type().length()),
+            this->input_type().data(), this->input_type().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.MethodDescriptorProto.input_type");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_output_type;
         break;
       }
 
       // optional string output_type = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
+        if (tag == 26) {
+         parse_output_type:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_output_type()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->output_type().data(), static_cast<int>(this->output_type().length()),
+            this->output_type().data(), this->output_type().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.MethodDescriptorProto.output_type");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(34)) goto parse_options;
         break;
       }
 
       // optional .google.protobuf.MethodOptions options = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 34) {
+         parse_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(40)) goto parse_client_streaming;
         break;
       }
 
       // optional bool client_streaming = 5 [default = false];
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) {
-          set_has_client_streaming();
+        if (tag == 40) {
+         parse_client_streaming:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &client_streaming_)));
+          set_has_client_streaming();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(48)) goto parse_server_streaming;
         break;
       }
 
       // optional bool server_streaming = 6 [default = false];
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(48u /* 48 & 0xFF */)) {
-          set_has_server_streaming();
+        if (tag == 48) {
+         parse_server_streaming:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &server_streaming_)));
+          set_has_server_streaming();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -7525,14 +7346,10 @@
 void MethodDescriptorProto::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.MethodDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.MethodDescriptorProto.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -7540,9 +7357,9 @@
   }
 
   // optional string input_type = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_input_type()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->input_type().data(), static_cast<int>(this->input_type().length()),
+      this->input_type().data(), this->input_type().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.MethodDescriptorProto.input_type");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -7550,9 +7367,9 @@
   }
 
   // optional string output_type = 3;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_output_type()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->output_type().data(), static_cast<int>(this->output_type().length()),
+      this->output_type().data(), this->output_type().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.MethodDescriptorProto.output_type");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -7560,40 +7377,35 @@
   }
 
   // optional .google.protobuf.MethodOptions options = 4;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_options()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       4, *this->options_, output);
   }
 
   // optional bool client_streaming = 5 [default = false];
-  if (cached_has_bits & 0x00000010u) {
+  if (has_client_streaming()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->client_streaming(), output);
   }
 
   // optional bool server_streaming = 6 [default = false];
-  if (cached_has_bits & 0x00000020u) {
+  if (has_server_streaming()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(6, this->server_streaming(), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.MethodDescriptorProto)
 }
 
-::google::protobuf::uint8* MethodDescriptorProto::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* MethodDescriptorProto::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodDescriptorProto)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string name = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.MethodDescriptorProto.name");
     target =
@@ -7602,9 +7414,9 @@
   }
 
   // optional string input_type = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_input_type()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->input_type().data(), static_cast<int>(this->input_type().length()),
+      this->input_type().data(), this->input_type().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.MethodDescriptorProto.input_type");
     target =
@@ -7613,9 +7425,9 @@
   }
 
   // optional string output_type = 3;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_output_type()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->output_type().data(), static_cast<int>(this->output_type().length()),
+      this->output_type().data(), this->output_type().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.MethodDescriptorProto.output_type");
     target =
@@ -7624,39 +7436,34 @@
   }
 
   // optional .google.protobuf.MethodOptions options = 4;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_options()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        4, *this->options_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        4, *this->options_, target);
   }
 
   // optional bool client_streaming = 5 [default = false];
-  if (cached_has_bits & 0x00000010u) {
+  if (has_client_streaming()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->client_streaming(), target);
   }
 
   // optional bool server_streaming = 6 [default = false];
-  if (cached_has_bits & 0x00000020u) {
+  if (has_server_streaming()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(6, this->server_streaming(), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodDescriptorProto)
   return target;
 }
 
-size_t MethodDescriptorProto::ByteSizeLong() const {
+int MethodDescriptorProto::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MethodDescriptorProto)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
   if (_has_bits_[0 / 32] & 63u) {
     // optional string name = 1;
     if (has_name()) {
@@ -7682,7 +7489,7 @@
     // optional .google.protobuf.MethodOptions options = 4;
     if (has_options()) {
       total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           *this->options_);
     }
 
@@ -7697,17 +7504,21 @@
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void MethodDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.MethodDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  const MethodDescriptorProto* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const MethodDescriptorProto* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const MethodDescriptorProto>(
           &from);
   if (source == NULL) {
@@ -7721,32 +7532,32 @@
 
 void MethodDescriptorProto::MergeFrom(const MethodDescriptorProto& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MethodDescriptorProto)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 63u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name(from.name());
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name()) {
+      set_has_name();
+      name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      set_input_type(from.input_type());
+    if (from.has_input_type()) {
+      set_has_input_type();
+      input_type_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.input_type_);
     }
-    if (cached_has_bits & 0x00000004u) {
-      set_output_type(from.output_type());
+    if (from.has_output_type()) {
+      set_has_output_type();
+      output_type_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.output_type_);
     }
-    if (cached_has_bits & 0x00000008u) {
+    if (from.has_options()) {
       mutable_options()->::google::protobuf::MethodOptions::MergeFrom(from.options());
     }
-    if (cached_has_bits & 0x00000010u) {
-      client_streaming_ = from.client_streaming_;
+    if (from.has_client_streaming()) {
+      set_client_streaming(from.client_streaming());
     }
-    if (cached_has_bits & 0x00000020u) {
-      server_streaming_ = from.server_streaming_;
+    if (from.has_server_streaming()) {
+      set_server_streaming(from.server_streaming());
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -7765,6 +7576,7 @@
 }
 
 bool MethodDescriptorProto::IsInitialized() const {
+
   if (has_options()) {
     if (!this->options_->IsInitialized()) return false;
   }
@@ -7773,46 +7585,312 @@
 
 void MethodDescriptorProto::Swap(MethodDescriptorProto* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    MethodDescriptorProto* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void MethodDescriptorProto::UnsafeArenaSwap(MethodDescriptorProto* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void MethodDescriptorProto::InternalSwap(MethodDescriptorProto* other) {
-  using std::swap;
   name_.Swap(&other->name_);
   input_type_.Swap(&other->input_type_);
   output_type_.Swap(&other->output_type_);
-  swap(options_, other->options_);
-  swap(client_streaming_, other->client_streaming_);
-  swap(server_streaming_, other->server_streaming_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(options_, other->options_);
+  std::swap(client_streaming_, other->client_streaming_);
+  std::swap(server_streaming_, other->server_streaming_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata MethodDescriptorProto::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = MethodDescriptorProto_descriptor_;
+  metadata.reflection = MethodDescriptorProto_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// MethodDescriptorProto
+
+// optional string name = 1;
+bool MethodDescriptorProto::has_name() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void MethodDescriptorProto::set_has_name() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void MethodDescriptorProto::clear_has_name() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void MethodDescriptorProto::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name();
+}
+ const ::std::string& MethodDescriptorProto::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void MethodDescriptorProto::set_name(const ::std::string& value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.name)
+}
+ void MethodDescriptorProto::set_name(const char* value) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.name)
+}
+ void MethodDescriptorProto::set_name(const char* value, size_t size) {
+  set_has_name();
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.name)
+}
+ ::std::string* MethodDescriptorProto::mutable_name() {
+  set_has_name();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* MethodDescriptorProto::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.name)
+  clear_has_name();
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void MethodDescriptorProto::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    set_has_name();
+  } else {
+    clear_has_name();
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.name)
+}
+
+// optional string input_type = 2;
+bool MethodDescriptorProto::has_input_type() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void MethodDescriptorProto::set_has_input_type() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void MethodDescriptorProto::clear_has_input_type() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void MethodDescriptorProto::clear_input_type() {
+  input_type_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_input_type();
+}
+ const ::std::string& MethodDescriptorProto::input_type() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.input_type)
+  return input_type_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void MethodDescriptorProto::set_input_type(const ::std::string& value) {
+  set_has_input_type();
+  input_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.input_type)
+}
+ void MethodDescriptorProto::set_input_type(const char* value) {
+  set_has_input_type();
+  input_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.input_type)
+}
+ void MethodDescriptorProto::set_input_type(const char* value, size_t size) {
+  set_has_input_type();
+  input_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.input_type)
+}
+ ::std::string* MethodDescriptorProto::mutable_input_type() {
+  set_has_input_type();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.input_type)
+  return input_type_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* MethodDescriptorProto::release_input_type() {
+  // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.input_type)
+  clear_has_input_type();
+  return input_type_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void MethodDescriptorProto::set_allocated_input_type(::std::string* input_type) {
+  if (input_type != NULL) {
+    set_has_input_type();
+  } else {
+    clear_has_input_type();
+  }
+  input_type_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), input_type);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.input_type)
+}
+
+// optional string output_type = 3;
+bool MethodDescriptorProto::has_output_type() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void MethodDescriptorProto::set_has_output_type() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void MethodDescriptorProto::clear_has_output_type() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void MethodDescriptorProto::clear_output_type() {
+  output_type_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_output_type();
+}
+ const ::std::string& MethodDescriptorProto::output_type() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.output_type)
+  return output_type_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void MethodDescriptorProto::set_output_type(const ::std::string& value) {
+  set_has_output_type();
+  output_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.output_type)
+}
+ void MethodDescriptorProto::set_output_type(const char* value) {
+  set_has_output_type();
+  output_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.output_type)
+}
+ void MethodDescriptorProto::set_output_type(const char* value, size_t size) {
+  set_has_output_type();
+  output_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.output_type)
+}
+ ::std::string* MethodDescriptorProto::mutable_output_type() {
+  set_has_output_type();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.output_type)
+  return output_type_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* MethodDescriptorProto::release_output_type() {
+  // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.output_type)
+  clear_has_output_type();
+  return output_type_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void MethodDescriptorProto::set_allocated_output_type(::std::string* output_type) {
+  if (output_type != NULL) {
+    set_has_output_type();
+  } else {
+    clear_has_output_type();
+  }
+  output_type_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), output_type);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.output_type)
+}
+
+// optional .google.protobuf.MethodOptions options = 4;
+bool MethodDescriptorProto::has_options() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void MethodDescriptorProto::set_has_options() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void MethodDescriptorProto::clear_has_options() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void MethodDescriptorProto::clear_options() {
+  if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear();
+  clear_has_options();
+}
+const ::google::protobuf::MethodOptions& MethodDescriptorProto::options() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.options)
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::MethodOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.options)
+  return options_;
+}
+::google::protobuf::MethodOptions* MethodDescriptorProto::release_options() {
+  // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.options)
+  clear_has_options();
+  ::google::protobuf::MethodOptions* temp = options_;
+  options_ = NULL;
+  return temp;
+}
+void MethodDescriptorProto::set_allocated_options(::google::protobuf::MethodOptions* options) {
+  delete options_;
+  options_ = options;
+  if (options) {
+    set_has_options();
+  } else {
+    clear_has_options();
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.options)
+}
+
+// optional bool client_streaming = 5 [default = false];
+bool MethodDescriptorProto::has_client_streaming() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+void MethodDescriptorProto::set_has_client_streaming() {
+  _has_bits_[0] |= 0x00000010u;
+}
+void MethodDescriptorProto::clear_has_client_streaming() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+void MethodDescriptorProto::clear_client_streaming() {
+  client_streaming_ = false;
+  clear_has_client_streaming();
+}
+ bool MethodDescriptorProto::client_streaming() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.client_streaming)
+  return client_streaming_;
+}
+ void MethodDescriptorProto::set_client_streaming(bool value) {
+  set_has_client_streaming();
+  client_streaming_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.client_streaming)
+}
+
+// optional bool server_streaming = 6 [default = false];
+bool MethodDescriptorProto::has_server_streaming() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+void MethodDescriptorProto::set_has_server_streaming() {
+  _has_bits_[0] |= 0x00000020u;
+}
+void MethodDescriptorProto::clear_has_server_streaming() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+void MethodDescriptorProto::clear_server_streaming() {
+  server_streaming_ = false;
+  clear_has_server_streaming();
+}
+ bool MethodDescriptorProto::server_streaming() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.server_streaming)
+  return server_streaming_;
+}
+ void MethodDescriptorProto::set_server_streaming(bool value) {
+  set_has_server_streaming();
+  server_streaming_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.server_streaming)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void FileOptions::InitAsDefaultInstance() {
+const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return FileOptions_OptimizeMode_descriptor_;
 }
+bool FileOptions_OptimizeMode_IsValid(int value) {
+  switch(value) {
+    case 1:
+    case 2:
+    case 3:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const FileOptions_OptimizeMode FileOptions::SPEED;
+const FileOptions_OptimizeMode FileOptions::CODE_SIZE;
+const FileOptions_OptimizeMode FileOptions::LITE_RUNTIME;
+const FileOptions_OptimizeMode FileOptions::OptimizeMode_MIN;
+const FileOptions_OptimizeMode FileOptions::OptimizeMode_MAX;
+const int FileOptions::OptimizeMode_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int FileOptions::kJavaPackageFieldNumber;
 const int FileOptions::kJavaOuterClassnameFieldNumber;
@@ -7824,103 +7902,48 @@
 const int FileOptions::kCcGenericServicesFieldNumber;
 const int FileOptions::kJavaGenericServicesFieldNumber;
 const int FileOptions::kPyGenericServicesFieldNumber;
-const int FileOptions::kPhpGenericServicesFieldNumber;
 const int FileOptions::kDeprecatedFieldNumber;
 const int FileOptions::kCcEnableArenasFieldNumber;
 const int FileOptions::kObjcClassPrefixFieldNumber;
 const int FileOptions::kCsharpNamespaceFieldNumber;
-const int FileOptions::kSwiftPrefixFieldNumber;
-const int FileOptions::kPhpClassPrefixFieldNumber;
-const int FileOptions::kPhpNamespaceFieldNumber;
 const int FileOptions::kUninterpretedOptionFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 FileOptions::FileOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.FileOptions)
 }
-FileOptions::FileOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.FileOptions)
+
+void FileOptions::InitAsDefaultInstance() {
 }
+
 FileOptions::FileOptions(const FileOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  java_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_java_package()) {
-    java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.java_package(),
-      GetArenaNoVirtual());
-  }
-  java_outer_classname_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_java_outer_classname()) {
-    java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.java_outer_classname(),
-      GetArenaNoVirtual());
-  }
-  go_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_go_package()) {
-    go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.go_package(),
-      GetArenaNoVirtual());
-  }
-  objc_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_objc_class_prefix()) {
-    objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.objc_class_prefix(),
-      GetArenaNoVirtual());
-  }
-  csharp_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_csharp_namespace()) {
-    csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.csharp_namespace(),
-      GetArenaNoVirtual());
-  }
-  swift_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_swift_prefix()) {
-    swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.swift_prefix(),
-      GetArenaNoVirtual());
-  }
-  php_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_php_class_prefix()) {
-    php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.php_class_prefix(),
-      GetArenaNoVirtual());
-  }
-  php_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_php_namespace()) {
-    php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.php_namespace(),
-      GetArenaNoVirtual());
-  }
-  ::memcpy(&cc_enable_arenas_, &from.cc_enable_arenas_,
-    static_cast<size_t>(reinterpret_cast<char*>(&optimize_for_) -
-    reinterpret_cast<char*>(&cc_enable_arenas_)) + sizeof(optimize_for_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.FileOptions)
 }
 
 void FileOptions::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   java_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   java_outer_classname_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  java_multiple_files_ = false;
+  java_generate_equals_and_hash_ = false;
+  java_string_check_utf8_ = false;
+  optimize_for_ = 1;
   go_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  cc_generic_services_ = false;
+  java_generic_services_ = false;
+  py_generic_services_ = false;
+  deprecated_ = false;
+  cc_enable_arenas_ = false;
   objc_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   csharp_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  swift_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  php_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  php_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&cc_enable_arenas_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&deprecated_) -
-      reinterpret_cast<char*>(&cc_enable_arenas_)) + sizeof(deprecated_));
-  optimize_for_ = 1;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 FileOptions::~FileOptions() {
@@ -7929,96 +7952,90 @@
 }
 
 void FileOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   java_package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   java_outer_classname_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   go_package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   objc_class_prefix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   csharp_namespace_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  swift_prefix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  php_class_prefix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  php_namespace_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void FileOptions::ArenaDtor(void* object) {
-  FileOptions* _this = reinterpret_cast< FileOptions* >(object);
-  (void)_this;
-}
-void FileOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void FileOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* FileOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return FileOptions_descriptor_;
 }
 
 const FileOptions& FileOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+FileOptions* FileOptions::default_instance_ = NULL;
+
 FileOptions* FileOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<FileOptions>(arena);
+  FileOptions* n = new FileOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void FileOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.FileOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
-  uninterpreted_option_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 255u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!java_package_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      java_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(FileOptions, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<FileOptions*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  if (_has_bits_[0 / 32] & 255u) {
+    ZR_(java_multiple_files_, cc_generic_services_);
+    if (has_java_package()) {
+      java_package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!java_outer_classname_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      java_outer_classname_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+    if (has_java_outer_classname()) {
+      java_outer_classname_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     }
-    if (cached_has_bits & 0x00000004u) {
-      GOOGLE_DCHECK(!go_package_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      go_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000008u) {
-      GOOGLE_DCHECK(!objc_class_prefix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      objc_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000010u) {
-      GOOGLE_DCHECK(!csharp_namespace_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      csharp_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000020u) {
-      GOOGLE_DCHECK(!swift_prefix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      swift_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000040u) {
-      GOOGLE_DCHECK(!php_class_prefix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      php_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000080u) {
-      GOOGLE_DCHECK(!php_namespace_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      php_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-  }
-  if (cached_has_bits & 65280u) {
-    ::memset(&cc_enable_arenas_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&php_generic_services_) -
-        reinterpret_cast<char*>(&cc_enable_arenas_)) + sizeof(php_generic_services_));
-  }
-  if (cached_has_bits & 196608u) {
-    deprecated_ = false;
     optimize_for_ = 1;
+    if (has_go_package()) {
+      go_package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  if (_has_bits_[8 / 32] & 16128u) {
+    ZR_(java_generic_services_, cc_enable_arenas_);
+    if (has_objc_class_prefix()) {
+      objc_class_prefix_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_csharp_namespace()) {
+      csharp_namespace_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+  }
+
+#undef ZR_HELPER_
+#undef ZR_
+
+  uninterpreted_option_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool FileOptions::MergePartialFromCodedStream(
@@ -8027,46 +8044,47 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.FileOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional string java_package = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_java_package()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->java_package().data(), static_cast<int>(this->java_package().length()),
+            this->java_package().data(), this->java_package().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FileOptions.java_package");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(66)) goto parse_java_outer_classname;
         break;
       }
 
       // optional string java_outer_classname = 8;
       case 8: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) {
+        if (tag == 66) {
+         parse_java_outer_classname:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_java_outer_classname()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->java_outer_classname().data(), static_cast<int>(this->java_outer_classname().length()),
+            this->java_outer_classname().data(), this->java_outer_classname().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FileOptions.java_outer_classname");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(72)) goto parse_optimize_for;
         break;
       }
 
       // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
       case 9: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(72u /* 72 & 0xFF */)) {
+        if (tag == 72) {
+         parse_optimize_for:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -8074,261 +8092,217 @@
           if (::google::protobuf::FileOptions_OptimizeMode_IsValid(value)) {
             set_optimize_for(static_cast< ::google::protobuf::FileOptions_OptimizeMode >(value));
           } else {
-            mutable_unknown_fields()->AddVarint(
-                9, static_cast< ::google::protobuf::uint64>(value));
+            mutable_unknown_fields()->AddVarint(9, value);
           }
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(80)) goto parse_java_multiple_files;
         break;
       }
 
       // optional bool java_multiple_files = 10 [default = false];
       case 10: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(80u /* 80 & 0xFF */)) {
-          set_has_java_multiple_files();
+        if (tag == 80) {
+         parse_java_multiple_files:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_multiple_files_)));
+          set_has_java_multiple_files();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(90)) goto parse_go_package;
         break;
       }
 
       // optional string go_package = 11;
       case 11: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(90u /* 90 & 0xFF */)) {
+        if (tag == 90) {
+         parse_go_package:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_go_package()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->go_package().data(), static_cast<int>(this->go_package().length()),
+            this->go_package().data(), this->go_package().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FileOptions.go_package");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(128)) goto parse_cc_generic_services;
         break;
       }
 
       // optional bool cc_generic_services = 16 [default = false];
       case 16: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(128u /* 128 & 0xFF */)) {
-          set_has_cc_generic_services();
+        if (tag == 128) {
+         parse_cc_generic_services:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &cc_generic_services_)));
+          set_has_cc_generic_services();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(136)) goto parse_java_generic_services;
         break;
       }
 
       // optional bool java_generic_services = 17 [default = false];
       case 17: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(136u /* 136 & 0xFF */)) {
-          set_has_java_generic_services();
+        if (tag == 136) {
+         parse_java_generic_services:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_generic_services_)));
+          set_has_java_generic_services();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(144)) goto parse_py_generic_services;
         break;
       }
 
       // optional bool py_generic_services = 18 [default = false];
       case 18: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(144u /* 144 & 0xFF */)) {
-          set_has_py_generic_services();
+        if (tag == 144) {
+         parse_py_generic_services:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &py_generic_services_)));
+          set_has_py_generic_services();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(160)) goto parse_java_generate_equals_and_hash;
         break;
       }
 
-      // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
+      // optional bool java_generate_equals_and_hash = 20 [default = false];
       case 20: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(160u /* 160 & 0xFF */)) {
-          set_has_java_generate_equals_and_hash();
+        if (tag == 160) {
+         parse_java_generate_equals_and_hash:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_generate_equals_and_hash_)));
+          set_has_java_generate_equals_and_hash();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(184)) goto parse_deprecated;
         break;
       }
 
       // optional bool deprecated = 23 [default = false];
       case 23: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(184u /* 184 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 184) {
+         parse_deprecated:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(216)) goto parse_java_string_check_utf8;
         break;
       }
 
       // optional bool java_string_check_utf8 = 27 [default = false];
       case 27: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(216u /* 216 & 0xFF */)) {
-          set_has_java_string_check_utf8();
+        if (tag == 216) {
+         parse_java_string_check_utf8:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_string_check_utf8_)));
+          set_has_java_string_check_utf8();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(248)) goto parse_cc_enable_arenas;
         break;
       }
 
       // optional bool cc_enable_arenas = 31 [default = false];
       case 31: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(248u /* 248 & 0xFF */)) {
-          set_has_cc_enable_arenas();
+        if (tag == 248) {
+         parse_cc_enable_arenas:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &cc_enable_arenas_)));
+          set_has_cc_enable_arenas();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(290)) goto parse_objc_class_prefix;
         break;
       }
 
       // optional string objc_class_prefix = 36;
       case 36: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 290 & 0xFF */)) {
+        if (tag == 290) {
+         parse_objc_class_prefix:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_objc_class_prefix()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->objc_class_prefix().data(), static_cast<int>(this->objc_class_prefix().length()),
+            this->objc_class_prefix().data(), this->objc_class_prefix().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FileOptions.objc_class_prefix");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(298)) goto parse_csharp_namespace;
         break;
       }
 
       // optional string csharp_namespace = 37;
       case 37: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 298 & 0xFF */)) {
+        if (tag == 298) {
+         parse_csharp_namespace:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_csharp_namespace()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->csharp_namespace().data(), static_cast<int>(this->csharp_namespace().length()),
+            this->csharp_namespace().data(), this->csharp_namespace().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.FileOptions.csharp_namespace");
         } else {
           goto handle_unusual;
         }
-        break;
-      }
-
-      // optional string swift_prefix = 39;
-      case 39: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 314 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_swift_prefix()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->swift_prefix().data(), static_cast<int>(this->swift_prefix().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileOptions.swift_prefix");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional string php_class_prefix = 40;
-      case 40: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u /* 322 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_php_class_prefix()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->php_class_prefix().data(), static_cast<int>(this->php_class_prefix().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileOptions.php_class_prefix");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional string php_namespace = 41;
-      case 41: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(74u /* 330 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_php_namespace()));
-          ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->php_namespace().data(), static_cast<int>(this->php_namespace().length()),
-            ::google::protobuf::internal::WireFormat::PARSE,
-            "google.protobuf.FileOptions.php_namespace");
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // optional bool php_generic_services = 42 [default = false];
-      case 42: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(80u /* 336 & 0xFF */)) {
-          set_has_php_generic_services();
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
-                 input, &php_generic_services_)));
-        } else {
-          goto handle_unusual;
-        }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -8345,14 +8319,10 @@
 void FileOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.FileOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string java_package = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_java_package()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->java_package().data(), static_cast<int>(this->java_package().length()),
+      this->java_package().data(), this->java_package().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.java_package");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -8360,9 +8330,9 @@
   }
 
   // optional string java_outer_classname = 8;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_java_outer_classname()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->java_outer_classname().data(), static_cast<int>(this->java_outer_classname().length()),
+      this->java_outer_classname().data(), this->java_outer_classname().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.java_outer_classname");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -8370,20 +8340,20 @@
   }
 
   // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
-  if (cached_has_bits & 0x00020000u) {
+  if (has_optimize_for()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       9, this->optimize_for(), output);
   }
 
   // optional bool java_multiple_files = 10 [default = false];
-  if (cached_has_bits & 0x00000200u) {
+  if (has_java_multiple_files()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->java_multiple_files(), output);
   }
 
   // optional string go_package = 11;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_go_package()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->go_package().data(), static_cast<int>(this->go_package().length()),
+      this->go_package().data(), this->go_package().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.go_package");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -8391,44 +8361,44 @@
   }
 
   // optional bool cc_generic_services = 16 [default = false];
-  if (cached_has_bits & 0x00001000u) {
+  if (has_cc_generic_services()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(16, this->cc_generic_services(), output);
   }
 
   // optional bool java_generic_services = 17 [default = false];
-  if (cached_has_bits & 0x00002000u) {
+  if (has_java_generic_services()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(17, this->java_generic_services(), output);
   }
 
   // optional bool py_generic_services = 18 [default = false];
-  if (cached_has_bits & 0x00004000u) {
+  if (has_py_generic_services()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(18, this->py_generic_services(), output);
   }
 
-  // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
-  if (cached_has_bits & 0x00000400u) {
+  // optional bool java_generate_equals_and_hash = 20 [default = false];
+  if (has_java_generate_equals_and_hash()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(20, this->java_generate_equals_and_hash(), output);
   }
 
   // optional bool deprecated = 23 [default = false];
-  if (cached_has_bits & 0x00010000u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(23, this->deprecated(), output);
   }
 
   // optional bool java_string_check_utf8 = 27 [default = false];
-  if (cached_has_bits & 0x00000800u) {
+  if (has_java_string_check_utf8()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(27, this->java_string_check_utf8(), output);
   }
 
   // optional bool cc_enable_arenas = 31 [default = false];
-  if (cached_has_bits & 0x00000100u) {
+  if (has_cc_enable_arenas()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(31, this->cc_enable_arenas(), output);
   }
 
   // optional string objc_class_prefix = 36;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_objc_class_prefix()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->objc_class_prefix().data(), static_cast<int>(this->objc_class_prefix().length()),
+      this->objc_class_prefix().data(), this->objc_class_prefix().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.objc_class_prefix");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -8436,55 +8406,19 @@
   }
 
   // optional string csharp_namespace = 37;
-  if (cached_has_bits & 0x00000010u) {
+  if (has_csharp_namespace()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->csharp_namespace().data(), static_cast<int>(this->csharp_namespace().length()),
+      this->csharp_namespace().data(), this->csharp_namespace().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.csharp_namespace");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       37, this->csharp_namespace(), output);
   }
 
-  // optional string swift_prefix = 39;
-  if (cached_has_bits & 0x00000020u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->swift_prefix().data(), static_cast<int>(this->swift_prefix().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileOptions.swift_prefix");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      39, this->swift_prefix(), output);
-  }
-
-  // optional string php_class_prefix = 40;
-  if (cached_has_bits & 0x00000040u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->php_class_prefix().data(), static_cast<int>(this->php_class_prefix().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileOptions.php_class_prefix");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      40, this->php_class_prefix(), output);
-  }
-
-  // optional string php_namespace = 41;
-  if (cached_has_bits & 0x00000080u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->php_namespace().data(), static_cast<int>(this->php_namespace().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileOptions.php_namespace");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      41, this->php_namespace(), output);
-  }
-
-  // optional bool php_generic_services = 42 [default = false];
-  if (cached_has_bits & 0x00008000u) {
-    ::google::protobuf::internal::WireFormatLite::WriteBool(42, this->php_generic_services(), output);
-  }
-
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -8493,23 +8427,18 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.FileOptions)
 }
 
-::google::protobuf::uint8* FileOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* FileOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional string java_package = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_java_package()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->java_package().data(), static_cast<int>(this->java_package().length()),
+      this->java_package().data(), this->java_package().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.java_package");
     target =
@@ -8518,9 +8447,9 @@
   }
 
   // optional string java_outer_classname = 8;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_java_outer_classname()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->java_outer_classname().data(), static_cast<int>(this->java_outer_classname().length()),
+      this->java_outer_classname().data(), this->java_outer_classname().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.java_outer_classname");
     target =
@@ -8529,20 +8458,20 @@
   }
 
   // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
-  if (cached_has_bits & 0x00020000u) {
+  if (has_optimize_for()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       9, this->optimize_for(), target);
   }
 
   // optional bool java_multiple_files = 10 [default = false];
-  if (cached_has_bits & 0x00000200u) {
+  if (has_java_multiple_files()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->java_multiple_files(), target);
   }
 
   // optional string go_package = 11;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_go_package()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->go_package().data(), static_cast<int>(this->go_package().length()),
+      this->go_package().data(), this->go_package().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.go_package");
     target =
@@ -8551,44 +8480,44 @@
   }
 
   // optional bool cc_generic_services = 16 [default = false];
-  if (cached_has_bits & 0x00001000u) {
+  if (has_cc_generic_services()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(16, this->cc_generic_services(), target);
   }
 
   // optional bool java_generic_services = 17 [default = false];
-  if (cached_has_bits & 0x00002000u) {
+  if (has_java_generic_services()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(17, this->java_generic_services(), target);
   }
 
   // optional bool py_generic_services = 18 [default = false];
-  if (cached_has_bits & 0x00004000u) {
+  if (has_py_generic_services()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(18, this->py_generic_services(), target);
   }
 
-  // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
-  if (cached_has_bits & 0x00000400u) {
+  // optional bool java_generate_equals_and_hash = 20 [default = false];
+  if (has_java_generate_equals_and_hash()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(20, this->java_generate_equals_and_hash(), target);
   }
 
   // optional bool deprecated = 23 [default = false];
-  if (cached_has_bits & 0x00010000u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(23, this->deprecated(), target);
   }
 
   // optional bool java_string_check_utf8 = 27 [default = false];
-  if (cached_has_bits & 0x00000800u) {
+  if (has_java_string_check_utf8()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(27, this->java_string_check_utf8(), target);
   }
 
   // optional bool cc_enable_arenas = 31 [default = false];
-  if (cached_has_bits & 0x00000100u) {
+  if (has_cc_enable_arenas()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(31, this->cc_enable_arenas(), target);
   }
 
   // optional string objc_class_prefix = 36;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_objc_class_prefix()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->objc_class_prefix().data(), static_cast<int>(this->objc_class_prefix().length()),
+      this->objc_class_prefix().data(), this->objc_class_prefix().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.objc_class_prefix");
     target =
@@ -8597,9 +8526,9 @@
   }
 
   // optional string csharp_namespace = 37;
-  if (cached_has_bits & 0x00000010u) {
+  if (has_csharp_namespace()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->csharp_namespace().data(), static_cast<int>(this->csharp_namespace().length()),
+      this->csharp_namespace().data(), this->csharp_namespace().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.FileOptions.csharp_namespace");
     target =
@@ -8607,85 +8536,28 @@
         37, this->csharp_namespace(), target);
   }
 
-  // optional string swift_prefix = 39;
-  if (cached_has_bits & 0x00000020u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->swift_prefix().data(), static_cast<int>(this->swift_prefix().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileOptions.swift_prefix");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        39, this->swift_prefix(), target);
-  }
-
-  // optional string php_class_prefix = 40;
-  if (cached_has_bits & 0x00000040u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->php_class_prefix().data(), static_cast<int>(this->php_class_prefix().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileOptions.php_class_prefix");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        40, this->php_class_prefix(), target);
-  }
-
-  // optional string php_namespace = 41;
-  if (cached_has_bits & 0x00000080u) {
-    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->php_namespace().data(), static_cast<int>(this->php_namespace().length()),
-      ::google::protobuf::internal::WireFormat::SERIALIZE,
-      "google.protobuf.FileOptions.php_namespace");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        41, this->php_namespace(), target);
-  }
-
-  // optional bool php_generic_services = 42 [default = false];
-  if (cached_has_bits & 0x00008000u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(42, this->php_generic_services(), target);
-  }
-
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileOptions)
   return target;
 }
 
-size_t FileOptions::ByteSizeLong() const {
+int FileOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   if (_has_bits_[0 / 32] & 255u) {
     // optional string java_package = 1;
@@ -8702,6 +8574,27 @@
           this->java_outer_classname());
     }
 
+    // optional bool java_multiple_files = 10 [default = false];
+    if (has_java_multiple_files()) {
+      total_size += 1 + 1;
+    }
+
+    // optional bool java_generate_equals_and_hash = 20 [default = false];
+    if (has_java_generate_equals_and_hash()) {
+      total_size += 2 + 1;
+    }
+
+    // optional bool java_string_check_utf8 = 27 [default = false];
+    if (has_java_string_check_utf8()) {
+      total_size += 2 + 1;
+    }
+
+    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
+    if (has_optimize_for()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::EnumSize(this->optimize_for());
+    }
+
     // optional string go_package = 11;
     if (has_go_package()) {
       total_size += 1 +
@@ -8709,6 +8602,33 @@
           this->go_package());
     }
 
+    // optional bool cc_generic_services = 16 [default = false];
+    if (has_cc_generic_services()) {
+      total_size += 2 + 1;
+    }
+
+  }
+  if (_has_bits_[8 / 32] & 16128u) {
+    // optional bool java_generic_services = 17 [default = false];
+    if (has_java_generic_services()) {
+      total_size += 2 + 1;
+    }
+
+    // optional bool py_generic_services = 18 [default = false];
+    if (has_py_generic_services()) {
+      total_size += 2 + 1;
+    }
+
+    // optional bool deprecated = 23 [default = false];
+    if (has_deprecated()) {
+      total_size += 2 + 1;
+    }
+
+    // optional bool cc_enable_arenas = 31 [default = false];
+    if (has_cc_enable_arenas()) {
+      total_size += 2 + 1;
+    }
+
     // optional string objc_class_prefix = 36;
     if (has_objc_class_prefix()) {
       total_size += 2 +
@@ -8723,94 +8643,32 @@
           this->csharp_namespace());
     }
 
-    // optional string swift_prefix = 39;
-    if (has_swift_prefix()) {
-      total_size += 2 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->swift_prefix());
-    }
-
-    // optional string php_class_prefix = 40;
-    if (has_php_class_prefix()) {
-      total_size += 2 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->php_class_prefix());
-    }
-
-    // optional string php_namespace = 41;
-    if (has_php_namespace()) {
-      total_size += 2 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->php_namespace());
-    }
-
   }
-  if (_has_bits_[8 / 32] & 65280u) {
-    // optional bool cc_enable_arenas = 31 [default = false];
-    if (has_cc_enable_arenas()) {
-      total_size += 2 + 1;
-    }
-
-    // optional bool java_multiple_files = 10 [default = false];
-    if (has_java_multiple_files()) {
-      total_size += 1 + 1;
-    }
-
-    // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
-    if (has_java_generate_equals_and_hash()) {
-      total_size += 2 + 1;
-    }
-
-    // optional bool java_string_check_utf8 = 27 [default = false];
-    if (has_java_string_check_utf8()) {
-      total_size += 2 + 1;
-    }
-
-    // optional bool cc_generic_services = 16 [default = false];
-    if (has_cc_generic_services()) {
-      total_size += 2 + 1;
-    }
-
-    // optional bool java_generic_services = 17 [default = false];
-    if (has_java_generic_services()) {
-      total_size += 2 + 1;
-    }
-
-    // optional bool py_generic_services = 18 [default = false];
-    if (has_py_generic_services()) {
-      total_size += 2 + 1;
-    }
-
-    // optional bool php_generic_services = 42 [default = false];
-    if (has_php_generic_services()) {
-      total_size += 2 + 1;
-    }
-
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
   }
-  if (_has_bits_[16 / 32] & 196608u) {
-    // optional bool deprecated = 23 [default = false];
-    if (has_deprecated()) {
-      total_size += 2 + 1;
-    }
 
-    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
-    if (has_optimize_for()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::EnumSize(this->optimize_for());
-    }
+  total_size += _extensions_.ByteSize();
 
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void FileOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FileOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FileOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const FileOptions>(
           &from);
   if (source == NULL) {
@@ -8824,75 +8682,62 @@
 
 void FileOptions::MergeFrom(const FileOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 255u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_java_package(from.java_package());
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_java_package()) {
+      set_has_java_package();
+      java_package_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.java_package_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      set_java_outer_classname(from.java_outer_classname());
+    if (from.has_java_outer_classname()) {
+      set_has_java_outer_classname();
+      java_outer_classname_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.java_outer_classname_);
     }
-    if (cached_has_bits & 0x00000004u) {
-      set_go_package(from.go_package());
+    if (from.has_java_multiple_files()) {
+      set_java_multiple_files(from.java_multiple_files());
     }
-    if (cached_has_bits & 0x00000008u) {
-      set_objc_class_prefix(from.objc_class_prefix());
+    if (from.has_java_generate_equals_and_hash()) {
+      set_java_generate_equals_and_hash(from.java_generate_equals_and_hash());
     }
-    if (cached_has_bits & 0x00000010u) {
-      set_csharp_namespace(from.csharp_namespace());
+    if (from.has_java_string_check_utf8()) {
+      set_java_string_check_utf8(from.java_string_check_utf8());
     }
-    if (cached_has_bits & 0x00000020u) {
-      set_swift_prefix(from.swift_prefix());
+    if (from.has_optimize_for()) {
+      set_optimize_for(from.optimize_for());
     }
-    if (cached_has_bits & 0x00000040u) {
-      set_php_class_prefix(from.php_class_prefix());
+    if (from.has_go_package()) {
+      set_has_go_package();
+      go_package_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.go_package_);
     }
-    if (cached_has_bits & 0x00000080u) {
-      set_php_namespace(from.php_namespace());
+    if (from.has_cc_generic_services()) {
+      set_cc_generic_services(from.cc_generic_services());
     }
   }
-  if (cached_has_bits & 65280u) {
-    if (cached_has_bits & 0x00000100u) {
-      cc_enable_arenas_ = from.cc_enable_arenas_;
+  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    if (from.has_java_generic_services()) {
+      set_java_generic_services(from.java_generic_services());
     }
-    if (cached_has_bits & 0x00000200u) {
-      java_multiple_files_ = from.java_multiple_files_;
+    if (from.has_py_generic_services()) {
+      set_py_generic_services(from.py_generic_services());
     }
-    if (cached_has_bits & 0x00000400u) {
-      java_generate_equals_and_hash_ = from.java_generate_equals_and_hash_;
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
     }
-    if (cached_has_bits & 0x00000800u) {
-      java_string_check_utf8_ = from.java_string_check_utf8_;
+    if (from.has_cc_enable_arenas()) {
+      set_cc_enable_arenas(from.cc_enable_arenas());
     }
-    if (cached_has_bits & 0x00001000u) {
-      cc_generic_services_ = from.cc_generic_services_;
+    if (from.has_objc_class_prefix()) {
+      set_has_objc_class_prefix();
+      objc_class_prefix_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.objc_class_prefix_);
     }
-    if (cached_has_bits & 0x00002000u) {
-      java_generic_services_ = from.java_generic_services_;
+    if (from.has_csharp_namespace()) {
+      set_has_csharp_namespace();
+      csharp_namespace_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.csharp_namespace_);
     }
-    if (cached_has_bits & 0x00004000u) {
-      py_generic_services_ = from.py_generic_services_;
-    }
-    if (cached_has_bits & 0x00008000u) {
-      php_generic_services_ = from.php_generic_services_;
-    }
-    _has_bits_[0] |= cached_has_bits;
   }
-  if (cached_has_bits & 196608u) {
-    if (cached_has_bits & 0x00010000u) {
-      deprecated_ = from.deprecated_;
-    }
-    if (cached_has_bits & 0x00020000u) {
-      optimize_for_ = from.optimize_for_;
-    }
-    _has_bits_[0] |= cached_has_bits;
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -8911,70 +8756,570 @@
 }
 
 bool FileOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void FileOptions::Swap(FileOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    FileOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void FileOptions::UnsafeArenaSwap(FileOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void FileOptions::InternalSwap(FileOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
   java_package_.Swap(&other->java_package_);
   java_outer_classname_.Swap(&other->java_outer_classname_);
+  std::swap(java_multiple_files_, other->java_multiple_files_);
+  std::swap(java_generate_equals_and_hash_, other->java_generate_equals_and_hash_);
+  std::swap(java_string_check_utf8_, other->java_string_check_utf8_);
+  std::swap(optimize_for_, other->optimize_for_);
   go_package_.Swap(&other->go_package_);
+  std::swap(cc_generic_services_, other->cc_generic_services_);
+  std::swap(java_generic_services_, other->java_generic_services_);
+  std::swap(py_generic_services_, other->py_generic_services_);
+  std::swap(deprecated_, other->deprecated_);
+  std::swap(cc_enable_arenas_, other->cc_enable_arenas_);
   objc_class_prefix_.Swap(&other->objc_class_prefix_);
   csharp_namespace_.Swap(&other->csharp_namespace_);
-  swift_prefix_.Swap(&other->swift_prefix_);
-  php_class_prefix_.Swap(&other->php_class_prefix_);
-  php_namespace_.Swap(&other->php_namespace_);
-  swap(cc_enable_arenas_, other->cc_enable_arenas_);
-  swap(java_multiple_files_, other->java_multiple_files_);
-  swap(java_generate_equals_and_hash_, other->java_generate_equals_and_hash_);
-  swap(java_string_check_utf8_, other->java_string_check_utf8_);
-  swap(cc_generic_services_, other->cc_generic_services_);
-  swap(java_generic_services_, other->java_generic_services_);
-  swap(py_generic_services_, other->py_generic_services_);
-  swap(php_generic_services_, other->php_generic_services_);
-  swap(deprecated_, other->deprecated_);
-  swap(optimize_for_, other->optimize_for_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata FileOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FileOptions_descriptor_;
+  metadata.reflection = FileOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FileOptions
+
+// optional string java_package = 1;
+bool FileOptions::has_java_package() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void FileOptions::set_has_java_package() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void FileOptions::clear_has_java_package() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void FileOptions::clear_java_package() {
+  java_package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_java_package();
+}
+ const ::std::string& FileOptions::java_package() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_package)
+  return java_package_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_java_package(const ::std::string& value) {
+  set_has_java_package();
+  java_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_package)
+}
+ void FileOptions::set_java_package(const char* value) {
+  set_has_java_package();
+  java_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_package)
+}
+ void FileOptions::set_java_package(const char* value, size_t size) {
+  set_has_java_package();
+  java_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_package)
+}
+ ::std::string* FileOptions::mutable_java_package() {
+  set_has_java_package();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_package)
+  return java_package_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileOptions::release_java_package() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_package)
+  clear_has_java_package();
+  return java_package_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_allocated_java_package(::std::string* java_package) {
+  if (java_package != NULL) {
+    set_has_java_package();
+  } else {
+    clear_has_java_package();
+  }
+  java_package_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_package);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_package)
+}
+
+// optional string java_outer_classname = 8;
+bool FileOptions::has_java_outer_classname() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void FileOptions::set_has_java_outer_classname() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void FileOptions::clear_has_java_outer_classname() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void FileOptions::clear_java_outer_classname() {
+  java_outer_classname_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_java_outer_classname();
+}
+ const ::std::string& FileOptions::java_outer_classname() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_outer_classname)
+  return java_outer_classname_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_java_outer_classname(const ::std::string& value) {
+  set_has_java_outer_classname();
+  java_outer_classname_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_outer_classname)
+}
+ void FileOptions::set_java_outer_classname(const char* value) {
+  set_has_java_outer_classname();
+  java_outer_classname_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_outer_classname)
+}
+ void FileOptions::set_java_outer_classname(const char* value, size_t size) {
+  set_has_java_outer_classname();
+  java_outer_classname_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_outer_classname)
+}
+ ::std::string* FileOptions::mutable_java_outer_classname() {
+  set_has_java_outer_classname();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_outer_classname)
+  return java_outer_classname_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileOptions::release_java_outer_classname() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_outer_classname)
+  clear_has_java_outer_classname();
+  return java_outer_classname_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_allocated_java_outer_classname(::std::string* java_outer_classname) {
+  if (java_outer_classname != NULL) {
+    set_has_java_outer_classname();
+  } else {
+    clear_has_java_outer_classname();
+  }
+  java_outer_classname_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_outer_classname);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_outer_classname)
+}
+
+// optional bool java_multiple_files = 10 [default = false];
+bool FileOptions::has_java_multiple_files() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void FileOptions::set_has_java_multiple_files() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void FileOptions::clear_has_java_multiple_files() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void FileOptions::clear_java_multiple_files() {
+  java_multiple_files_ = false;
+  clear_has_java_multiple_files();
+}
+ bool FileOptions::java_multiple_files() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_multiple_files)
+  return java_multiple_files_;
+}
+ void FileOptions::set_java_multiple_files(bool value) {
+  set_has_java_multiple_files();
+  java_multiple_files_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_multiple_files)
+}
+
+// optional bool java_generate_equals_and_hash = 20 [default = false];
+bool FileOptions::has_java_generate_equals_and_hash() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void FileOptions::set_has_java_generate_equals_and_hash() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void FileOptions::clear_has_java_generate_equals_and_hash() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void FileOptions::clear_java_generate_equals_and_hash() {
+  java_generate_equals_and_hash_ = false;
+  clear_has_java_generate_equals_and_hash();
+}
+ bool FileOptions::java_generate_equals_and_hash() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_generate_equals_and_hash)
+  return java_generate_equals_and_hash_;
+}
+ void FileOptions::set_java_generate_equals_and_hash(bool value) {
+  set_has_java_generate_equals_and_hash();
+  java_generate_equals_and_hash_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_generate_equals_and_hash)
+}
+
+// optional bool java_string_check_utf8 = 27 [default = false];
+bool FileOptions::has_java_string_check_utf8() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+void FileOptions::set_has_java_string_check_utf8() {
+  _has_bits_[0] |= 0x00000010u;
+}
+void FileOptions::clear_has_java_string_check_utf8() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+void FileOptions::clear_java_string_check_utf8() {
+  java_string_check_utf8_ = false;
+  clear_has_java_string_check_utf8();
+}
+ bool FileOptions::java_string_check_utf8() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_string_check_utf8)
+  return java_string_check_utf8_;
+}
+ void FileOptions::set_java_string_check_utf8(bool value) {
+  set_has_java_string_check_utf8();
+  java_string_check_utf8_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_string_check_utf8)
+}
+
+// optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
+bool FileOptions::has_optimize_for() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+void FileOptions::set_has_optimize_for() {
+  _has_bits_[0] |= 0x00000020u;
+}
+void FileOptions::clear_has_optimize_for() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+void FileOptions::clear_optimize_for() {
+  optimize_for_ = 1;
+  clear_has_optimize_for();
+}
+ ::google::protobuf::FileOptions_OptimizeMode FileOptions::optimize_for() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.optimize_for)
+  return static_cast< ::google::protobuf::FileOptions_OptimizeMode >(optimize_for_);
+}
+ void FileOptions::set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value) {
+  assert(::google::protobuf::FileOptions_OptimizeMode_IsValid(value));
+  set_has_optimize_for();
+  optimize_for_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.optimize_for)
+}
+
+// optional string go_package = 11;
+bool FileOptions::has_go_package() const {
+  return (_has_bits_[0] & 0x00000040u) != 0;
+}
+void FileOptions::set_has_go_package() {
+  _has_bits_[0] |= 0x00000040u;
+}
+void FileOptions::clear_has_go_package() {
+  _has_bits_[0] &= ~0x00000040u;
+}
+void FileOptions::clear_go_package() {
+  go_package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_go_package();
+}
+ const ::std::string& FileOptions::go_package() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.go_package)
+  return go_package_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_go_package(const ::std::string& value) {
+  set_has_go_package();
+  go_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.go_package)
+}
+ void FileOptions::set_go_package(const char* value) {
+  set_has_go_package();
+  go_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.go_package)
+}
+ void FileOptions::set_go_package(const char* value, size_t size) {
+  set_has_go_package();
+  go_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.go_package)
+}
+ ::std::string* FileOptions::mutable_go_package() {
+  set_has_go_package();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.go_package)
+  return go_package_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileOptions::release_go_package() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.go_package)
+  clear_has_go_package();
+  return go_package_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_allocated_go_package(::std::string* go_package) {
+  if (go_package != NULL) {
+    set_has_go_package();
+  } else {
+    clear_has_go_package();
+  }
+  go_package_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), go_package);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.go_package)
+}
+
+// optional bool cc_generic_services = 16 [default = false];
+bool FileOptions::has_cc_generic_services() const {
+  return (_has_bits_[0] & 0x00000080u) != 0;
+}
+void FileOptions::set_has_cc_generic_services() {
+  _has_bits_[0] |= 0x00000080u;
+}
+void FileOptions::clear_has_cc_generic_services() {
+  _has_bits_[0] &= ~0x00000080u;
+}
+void FileOptions::clear_cc_generic_services() {
+  cc_generic_services_ = false;
+  clear_has_cc_generic_services();
+}
+ bool FileOptions::cc_generic_services() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.cc_generic_services)
+  return cc_generic_services_;
+}
+ void FileOptions::set_cc_generic_services(bool value) {
+  set_has_cc_generic_services();
+  cc_generic_services_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.cc_generic_services)
+}
+
+// optional bool java_generic_services = 17 [default = false];
+bool FileOptions::has_java_generic_services() const {
+  return (_has_bits_[0] & 0x00000100u) != 0;
+}
+void FileOptions::set_has_java_generic_services() {
+  _has_bits_[0] |= 0x00000100u;
+}
+void FileOptions::clear_has_java_generic_services() {
+  _has_bits_[0] &= ~0x00000100u;
+}
+void FileOptions::clear_java_generic_services() {
+  java_generic_services_ = false;
+  clear_has_java_generic_services();
+}
+ bool FileOptions::java_generic_services() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_generic_services)
+  return java_generic_services_;
+}
+ void FileOptions::set_java_generic_services(bool value) {
+  set_has_java_generic_services();
+  java_generic_services_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_generic_services)
+}
+
+// optional bool py_generic_services = 18 [default = false];
+bool FileOptions::has_py_generic_services() const {
+  return (_has_bits_[0] & 0x00000200u) != 0;
+}
+void FileOptions::set_has_py_generic_services() {
+  _has_bits_[0] |= 0x00000200u;
+}
+void FileOptions::clear_has_py_generic_services() {
+  _has_bits_[0] &= ~0x00000200u;
+}
+void FileOptions::clear_py_generic_services() {
+  py_generic_services_ = false;
+  clear_has_py_generic_services();
+}
+ bool FileOptions::py_generic_services() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.py_generic_services)
+  return py_generic_services_;
+}
+ void FileOptions::set_py_generic_services(bool value) {
+  set_has_py_generic_services();
+  py_generic_services_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.py_generic_services)
+}
+
+// optional bool deprecated = 23 [default = false];
+bool FileOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000400u) != 0;
+}
+void FileOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000400u;
+}
+void FileOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000400u;
+}
+void FileOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool FileOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.deprecated)
+  return deprecated_;
+}
+ void FileOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.deprecated)
+}
+
+// optional bool cc_enable_arenas = 31 [default = false];
+bool FileOptions::has_cc_enable_arenas() const {
+  return (_has_bits_[0] & 0x00000800u) != 0;
+}
+void FileOptions::set_has_cc_enable_arenas() {
+  _has_bits_[0] |= 0x00000800u;
+}
+void FileOptions::clear_has_cc_enable_arenas() {
+  _has_bits_[0] &= ~0x00000800u;
+}
+void FileOptions::clear_cc_enable_arenas() {
+  cc_enable_arenas_ = false;
+  clear_has_cc_enable_arenas();
+}
+ bool FileOptions::cc_enable_arenas() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.cc_enable_arenas)
+  return cc_enable_arenas_;
+}
+ void FileOptions::set_cc_enable_arenas(bool value) {
+  set_has_cc_enable_arenas();
+  cc_enable_arenas_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.cc_enable_arenas)
+}
+
+// optional string objc_class_prefix = 36;
+bool FileOptions::has_objc_class_prefix() const {
+  return (_has_bits_[0] & 0x00001000u) != 0;
+}
+void FileOptions::set_has_objc_class_prefix() {
+  _has_bits_[0] |= 0x00001000u;
+}
+void FileOptions::clear_has_objc_class_prefix() {
+  _has_bits_[0] &= ~0x00001000u;
+}
+void FileOptions::clear_objc_class_prefix() {
+  objc_class_prefix_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_objc_class_prefix();
+}
+ const ::std::string& FileOptions::objc_class_prefix() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.objc_class_prefix)
+  return objc_class_prefix_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_objc_class_prefix(const ::std::string& value) {
+  set_has_objc_class_prefix();
+  objc_class_prefix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.objc_class_prefix)
+}
+ void FileOptions::set_objc_class_prefix(const char* value) {
+  set_has_objc_class_prefix();
+  objc_class_prefix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.objc_class_prefix)
+}
+ void FileOptions::set_objc_class_prefix(const char* value, size_t size) {
+  set_has_objc_class_prefix();
+  objc_class_prefix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.objc_class_prefix)
+}
+ ::std::string* FileOptions::mutable_objc_class_prefix() {
+  set_has_objc_class_prefix();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.objc_class_prefix)
+  return objc_class_prefix_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileOptions::release_objc_class_prefix() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.objc_class_prefix)
+  clear_has_objc_class_prefix();
+  return objc_class_prefix_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_allocated_objc_class_prefix(::std::string* objc_class_prefix) {
+  if (objc_class_prefix != NULL) {
+    set_has_objc_class_prefix();
+  } else {
+    clear_has_objc_class_prefix();
+  }
+  objc_class_prefix_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), objc_class_prefix);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.objc_class_prefix)
+}
+
+// optional string csharp_namespace = 37;
+bool FileOptions::has_csharp_namespace() const {
+  return (_has_bits_[0] & 0x00002000u) != 0;
+}
+void FileOptions::set_has_csharp_namespace() {
+  _has_bits_[0] |= 0x00002000u;
+}
+void FileOptions::clear_has_csharp_namespace() {
+  _has_bits_[0] &= ~0x00002000u;
+}
+void FileOptions::clear_csharp_namespace() {
+  csharp_namespace_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_csharp_namespace();
+}
+ const ::std::string& FileOptions::csharp_namespace() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.csharp_namespace)
+  return csharp_namespace_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_csharp_namespace(const ::std::string& value) {
+  set_has_csharp_namespace();
+  csharp_namespace_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.csharp_namespace)
+}
+ void FileOptions::set_csharp_namespace(const char* value) {
+  set_has_csharp_namespace();
+  csharp_namespace_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.csharp_namespace)
+}
+ void FileOptions::set_csharp_namespace(const char* value, size_t size) {
+  set_has_csharp_namespace();
+  csharp_namespace_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.csharp_namespace)
+}
+ ::std::string* FileOptions::mutable_csharp_namespace() {
+  set_has_csharp_namespace();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.csharp_namespace)
+  return csharp_namespace_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* FileOptions::release_csharp_namespace() {
+  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.csharp_namespace)
+  clear_has_csharp_namespace();
+  return csharp_namespace_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void FileOptions::set_allocated_csharp_namespace(::std::string* csharp_namespace) {
+  if (csharp_namespace != NULL) {
+    set_has_csharp_namespace();
+  } else {
+    clear_has_csharp_namespace();
+  }
+  csharp_namespace_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), csharp_namespace);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.csharp_namespace)
+}
+
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int FileOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
+}
+void FileOptions::clear_uninterpreted_option() {
+  uninterpreted_option_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& FileOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* FileOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* FileOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FileOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+FileOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+FileOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FileOptions.uninterpreted_option)
+  return uninterpreted_option_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void MessageOptions::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int MessageOptions::kMessageSetWireFormatFieldNumber;
 const int MessageOptions::kNoStandardDescriptorAccessorFieldNumber;
@@ -8985,41 +9330,28 @@
 
 MessageOptions::MessageOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.MessageOptions)
 }
-MessageOptions::MessageOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.MessageOptions)
+
+void MessageOptions::InitAsDefaultInstance() {
 }
+
 MessageOptions::MessageOptions(const MessageOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  ::memcpy(&message_set_wire_format_, &from.message_set_wire_format_,
-    static_cast<size_t>(reinterpret_cast<char*>(&map_entry_) -
-    reinterpret_cast<char*>(&message_set_wire_format_)) + sizeof(map_entry_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.MessageOptions)
 }
 
 void MessageOptions::SharedCtor() {
   _cached_size_ = 0;
-  ::memset(&message_set_wire_format_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&map_entry_) -
-      reinterpret_cast<char*>(&message_set_wire_format_)) + sizeof(map_entry_));
+  message_set_wire_format_ = false;
+  no_standard_descriptor_accessor_ = false;
+  deprecated_ = false;
+  map_entry_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 MessageOptions::~MessageOptions() {
@@ -9028,47 +9360,64 @@
 }
 
 void MessageOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void MessageOptions::ArenaDtor(void* object) {
-  MessageOptions* _this = reinterpret_cast< MessageOptions* >(object);
-  (void)_this;
-}
-void MessageOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void MessageOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* MessageOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return MessageOptions_descriptor_;
 }
 
 const MessageOptions& MessageOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+MessageOptions* MessageOptions::default_instance_ = NULL;
+
 MessageOptions* MessageOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<MessageOptions>(arena);
+  MessageOptions* n = new MessageOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void MessageOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.MessageOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(MessageOptions, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<MessageOptions*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(message_set_wire_format_, map_entry_);
+
+#undef ZR_HELPER_
+#undef ZR_
+
   uninterpreted_option_.Clear();
-  ::memset(&message_set_wire_format_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&map_entry_) -
-      reinterpret_cast<char*>(&message_set_wire_format_)) + sizeof(map_entry_));
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool MessageOptions::MergePartialFromCodedStream(
@@ -9077,90 +9426,100 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.MessageOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional bool message_set_wire_format = 1 [default = false];
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-          set_has_message_set_wire_format();
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &message_set_wire_format_)));
+          set_has_message_set_wire_format();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_no_standard_descriptor_accessor;
         break;
       }
 
       // optional bool no_standard_descriptor_accessor = 2 [default = false];
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_no_standard_descriptor_accessor();
+        if (tag == 16) {
+         parse_no_standard_descriptor_accessor:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &no_standard_descriptor_accessor_)));
+          set_has_no_standard_descriptor_accessor();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_deprecated;
         break;
       }
 
       // optional bool deprecated = 3 [default = false];
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 24) {
+         parse_deprecated:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(56)) goto parse_map_entry;
         break;
       }
 
       // optional bool map_entry = 7;
       case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) {
-          set_has_map_entry();
+        if (tag == 56) {
+         parse_map_entry:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &map_entry_)));
+          set_has_map_entry();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -9177,35 +9536,30 @@
 void MessageOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.MessageOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool message_set_wire_format = 1 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_message_set_wire_format()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->message_set_wire_format(), output);
   }
 
   // optional bool no_standard_descriptor_accessor = 2 [default = false];
-  if (cached_has_bits & 0x00000002u) {
+  if (has_no_standard_descriptor_accessor()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->no_standard_descriptor_accessor(), output);
   }
 
   // optional bool deprecated = 3 [default = false];
-  if (cached_has_bits & 0x00000004u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output);
   }
 
   // optional bool map_entry = 7;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_map_entry()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(7, this->map_entry(), output);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -9214,80 +9568,56 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.MessageOptions)
 }
 
-::google::protobuf::uint8* MessageOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* MessageOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MessageOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool message_set_wire_format = 1 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_message_set_wire_format()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->message_set_wire_format(), target);
   }
 
   // optional bool no_standard_descriptor_accessor = 2 [default = false];
-  if (cached_has_bits & 0x00000002u) {
+  if (has_no_standard_descriptor_accessor()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->no_standard_descriptor_accessor(), target);
   }
 
   // optional bool deprecated = 3 [default = false];
-  if (cached_has_bits & 0x00000004u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target);
   }
 
   // optional bool map_entry = 7;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_map_entry()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(7, this->map_entry(), target);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MessageOptions)
   return target;
 }
 
-size_t MessageOptions::ByteSizeLong() const {
+int MessageOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MessageOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   if (_has_bits_[0 / 32] & 15u) {
     // optional bool message_set_wire_format = 1 [default = false];
@@ -9311,17 +9641,31 @@
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
+  }
+
+  total_size += _extensions_.ByteSize();
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void MessageOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.MessageOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const MessageOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const MessageOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const MessageOptions>(
           &from);
   if (source == NULL) {
@@ -9335,28 +9679,25 @@
 
 void MessageOptions::MergeFrom(const MessageOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MessageOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 15u) {
-    if (cached_has_bits & 0x00000001u) {
-      message_set_wire_format_ = from.message_set_wire_format_;
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_message_set_wire_format()) {
+      set_message_set_wire_format(from.message_set_wire_format());
     }
-    if (cached_has_bits & 0x00000002u) {
-      no_standard_descriptor_accessor_ = from.no_standard_descriptor_accessor_;
+    if (from.has_no_standard_descriptor_accessor()) {
+      set_no_standard_descriptor_accessor(from.no_standard_descriptor_accessor());
     }
-    if (cached_has_bits & 0x00000004u) {
-      deprecated_ = from.deprecated_;
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
     }
-    if (cached_has_bits & 0x00000008u) {
-      map_entry_ = from.map_entry_;
+    if (from.has_map_entry()) {
+      set_map_entry(from.map_entry());
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -9375,56 +9716,215 @@
 }
 
 bool MessageOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void MessageOptions::Swap(MessageOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    MessageOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void MessageOptions::UnsafeArenaSwap(MessageOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void MessageOptions::InternalSwap(MessageOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(message_set_wire_format_, other->message_set_wire_format_);
-  swap(no_standard_descriptor_accessor_, other->no_standard_descriptor_accessor_);
-  swap(deprecated_, other->deprecated_);
-  swap(map_entry_, other->map_entry_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(message_set_wire_format_, other->message_set_wire_format_);
+  std::swap(no_standard_descriptor_accessor_, other->no_standard_descriptor_accessor_);
+  std::swap(deprecated_, other->deprecated_);
+  std::swap(map_entry_, other->map_entry_);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata MessageOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = MessageOptions_descriptor_;
+  metadata.reflection = MessageOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// MessageOptions
+
+// optional bool message_set_wire_format = 1 [default = false];
+bool MessageOptions::has_message_set_wire_format() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void MessageOptions::set_has_message_set_wire_format() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void MessageOptions::clear_has_message_set_wire_format() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void MessageOptions::clear_message_set_wire_format() {
+  message_set_wire_format_ = false;
+  clear_has_message_set_wire_format();
+}
+ bool MessageOptions::message_set_wire_format() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.message_set_wire_format)
+  return message_set_wire_format_;
+}
+ void MessageOptions::set_message_set_wire_format(bool value) {
+  set_has_message_set_wire_format();
+  message_set_wire_format_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.message_set_wire_format)
+}
+
+// optional bool no_standard_descriptor_accessor = 2 [default = false];
+bool MessageOptions::has_no_standard_descriptor_accessor() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void MessageOptions::set_has_no_standard_descriptor_accessor() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void MessageOptions::clear_has_no_standard_descriptor_accessor() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void MessageOptions::clear_no_standard_descriptor_accessor() {
+  no_standard_descriptor_accessor_ = false;
+  clear_has_no_standard_descriptor_accessor();
+}
+ bool MessageOptions::no_standard_descriptor_accessor() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.no_standard_descriptor_accessor)
+  return no_standard_descriptor_accessor_;
+}
+ void MessageOptions::set_no_standard_descriptor_accessor(bool value) {
+  set_has_no_standard_descriptor_accessor();
+  no_standard_descriptor_accessor_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.no_standard_descriptor_accessor)
+}
+
+// optional bool deprecated = 3 [default = false];
+bool MessageOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void MessageOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void MessageOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void MessageOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool MessageOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.deprecated)
+  return deprecated_;
+}
+ void MessageOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.deprecated)
+}
+
+// optional bool map_entry = 7;
+bool MessageOptions::has_map_entry() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void MessageOptions::set_has_map_entry() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void MessageOptions::clear_has_map_entry() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void MessageOptions::clear_map_entry() {
+  map_entry_ = false;
+  clear_has_map_entry();
+}
+ bool MessageOptions::map_entry() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.map_entry)
+  return map_entry_;
+}
+ void MessageOptions::set_map_entry(bool value) {
+  set_has_map_entry();
+  map_entry_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.map_entry)
+}
+
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int MessageOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
+}
+void MessageOptions::clear_uninterpreted_option() {
+  uninterpreted_option_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& MessageOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* MessageOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MessageOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* MessageOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.MessageOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+MessageOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.MessageOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+MessageOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.MessageOptions.uninterpreted_option)
+  return uninterpreted_option_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void FieldOptions::InitAsDefaultInstance() {
+const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return FieldOptions_CType_descriptor_;
 }
+bool FieldOptions_CType_IsValid(int value) {
+  switch(value) {
+    case 0:
+    case 1:
+    case 2:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const FieldOptions_CType FieldOptions::STRING;
+const FieldOptions_CType FieldOptions::CORD;
+const FieldOptions_CType FieldOptions::STRING_PIECE;
+const FieldOptions_CType FieldOptions::CType_MIN;
+const FieldOptions_CType FieldOptions::CType_MAX;
+const int FieldOptions::CType_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+const ::google::protobuf::EnumDescriptor* FieldOptions_JSType_descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return FieldOptions_JSType_descriptor_;
+}
+bool FieldOptions_JSType_IsValid(int value) {
+  switch(value) {
+    case 0:
+    case 1:
+    case 2:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const FieldOptions_JSType FieldOptions::JS_NORMAL;
+const FieldOptions_JSType FieldOptions::JS_STRING;
+const FieldOptions_JSType FieldOptions::JS_NUMBER;
+const FieldOptions_JSType FieldOptions::JSType_MIN;
+const FieldOptions_JSType FieldOptions::JSType_MAX;
+const int FieldOptions::JSType_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int FieldOptions::kCtypeFieldNumber;
 const int FieldOptions::kPackedFieldNumber;
@@ -9437,41 +9937,30 @@
 
 FieldOptions::FieldOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.FieldOptions)
 }
-FieldOptions::FieldOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldOptions)
+
+void FieldOptions::InitAsDefaultInstance() {
 }
+
 FieldOptions::FieldOptions(const FieldOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  ::memcpy(&ctype_, &from.ctype_,
-    static_cast<size_t>(reinterpret_cast<char*>(&jstype_) -
-    reinterpret_cast<char*>(&ctype_)) + sizeof(jstype_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions)
 }
 
 void FieldOptions::SharedCtor() {
   _cached_size_ = 0;
-  ::memset(&ctype_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&jstype_) -
-      reinterpret_cast<char*>(&ctype_)) + sizeof(jstype_));
+  ctype_ = 0;
+  packed_ = false;
+  jstype_ = 0;
+  lazy_ = false;
+  deprecated_ = false;
+  weak_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 FieldOptions::~FieldOptions() {
@@ -9480,50 +9969,67 @@
 }
 
 void FieldOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void FieldOptions::ArenaDtor(void* object) {
-  FieldOptions* _this = reinterpret_cast< FieldOptions* >(object);
-  (void)_this;
-}
-void FieldOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void FieldOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* FieldOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return FieldOptions_descriptor_;
 }
 
 const FieldOptions& FieldOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+FieldOptions* FieldOptions::default_instance_ = NULL;
+
 FieldOptions* FieldOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<FieldOptions>(arena);
+  FieldOptions* n = new FieldOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void FieldOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.FieldOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
-  uninterpreted_option_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 63u) {
-    ::memset(&ctype_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&jstype_) -
-        reinterpret_cast<char*>(&ctype_)) + sizeof(jstype_));
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(FieldOptions, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<FieldOptions*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  if (_has_bits_[0 / 32] & 63u) {
+    ZR_(ctype_, jstype_);
+    ZR_(packed_, weak_);
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+
+#undef ZR_HELPER_
+#undef ZR_
+
+  uninterpreted_option_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool FieldOptions::MergePartialFromCodedStream(
@@ -9532,14 +10038,13 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.FieldOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
+        if (tag == 8) {
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -9547,61 +10052,64 @@
           if (::google::protobuf::FieldOptions_CType_IsValid(value)) {
             set_ctype(static_cast< ::google::protobuf::FieldOptions_CType >(value));
           } else {
-            mutable_unknown_fields()->AddVarint(
-                1, static_cast< ::google::protobuf::uint64>(value));
+            mutable_unknown_fields()->AddVarint(1, value);
           }
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_packed;
         break;
       }
 
       // optional bool packed = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_packed();
+        if (tag == 16) {
+         parse_packed:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &packed_)));
+          set_has_packed();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_deprecated;
         break;
       }
 
       // optional bool deprecated = 3 [default = false];
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 24) {
+         parse_deprecated:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(40)) goto parse_lazy;
         break;
       }
 
       // optional bool lazy = 5 [default = false];
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) {
-          set_has_lazy();
+        if (tag == 40) {
+         parse_lazy:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &lazy_)));
+          set_has_lazy();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(48)) goto parse_jstype;
         break;
       }
 
       // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(48u /* 48 & 0xFF */)) {
+        if (tag == 48) {
+         parse_jstype:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -9609,53 +10117,61 @@
           if (::google::protobuf::FieldOptions_JSType_IsValid(value)) {
             set_jstype(static_cast< ::google::protobuf::FieldOptions_JSType >(value));
           } else {
-            mutable_unknown_fields()->AddVarint(
-                6, static_cast< ::google::protobuf::uint64>(value));
+            mutable_unknown_fields()->AddVarint(6, value);
           }
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(80)) goto parse_weak;
         break;
       }
 
       // optional bool weak = 10 [default = false];
       case 10: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(80u /* 80 & 0xFF */)) {
-          set_has_weak();
+        if (tag == 80) {
+         parse_weak:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &weak_)));
+          set_has_weak();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -9672,47 +10188,42 @@
 void FieldOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.FieldOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_ctype()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       1, this->ctype(), output);
   }
 
   // optional bool packed = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_packed()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->packed(), output);
   }
 
   // optional bool deprecated = 3 [default = false];
-  if (cached_has_bits & 0x00000008u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output);
   }
 
   // optional bool lazy = 5 [default = false];
-  if (cached_has_bits & 0x00000004u) {
+  if (has_lazy()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->lazy(), output);
   }
 
   // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
-  if (cached_has_bits & 0x00000020u) {
+  if (has_jstype()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       6, this->jstype(), output);
   }
 
   // optional bool weak = 10 [default = false];
-  if (cached_has_bits & 0x00000010u) {
+  if (has_weak()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->weak(), output);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -9721,92 +10232,68 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.FieldOptions)
 }
 
-::google::protobuf::uint8* FieldOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* FieldOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_ctype()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       1, this->ctype(), target);
   }
 
   // optional bool packed = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_packed()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->packed(), target);
   }
 
   // optional bool deprecated = 3 [default = false];
-  if (cached_has_bits & 0x00000008u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target);
   }
 
   // optional bool lazy = 5 [default = false];
-  if (cached_has_bits & 0x00000004u) {
+  if (has_lazy()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->lazy(), target);
   }
 
   // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
-  if (cached_has_bits & 0x00000020u) {
+  if (has_jstype()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       6, this->jstype(), target);
   }
 
   // optional bool weak = 10 [default = false];
-  if (cached_has_bits & 0x00000010u) {
+  if (has_weak()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->weak(), target);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldOptions)
   return target;
 }
 
-size_t FieldOptions::ByteSizeLong() const {
+int FieldOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   if (_has_bits_[0 / 32] & 63u) {
     // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
@@ -9820,6 +10307,12 @@
       total_size += 1 + 1;
     }
 
+    // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
+    if (has_jstype()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::EnumSize(this->jstype());
+    }
+
     // optional bool lazy = 5 [default = false];
     if (has_lazy()) {
       total_size += 1 + 1;
@@ -9835,24 +10328,32 @@
       total_size += 1 + 1;
     }
 
-    // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
-    if (has_jstype()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::EnumSize(this->jstype());
-    }
-
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
+  }
+
+  total_size += _extensions_.ByteSize();
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void FieldOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FieldOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FieldOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FieldOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const FieldOptions>(
           &from);
   if (source == NULL) {
@@ -9866,34 +10367,31 @@
 
 void FieldOptions::MergeFrom(const FieldOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 63u) {
-    if (cached_has_bits & 0x00000001u) {
-      ctype_ = from.ctype_;
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_ctype()) {
+      set_ctype(from.ctype());
     }
-    if (cached_has_bits & 0x00000002u) {
-      packed_ = from.packed_;
+    if (from.has_packed()) {
+      set_packed(from.packed());
     }
-    if (cached_has_bits & 0x00000004u) {
-      lazy_ = from.lazy_;
+    if (from.has_jstype()) {
+      set_jstype(from.jstype());
     }
-    if (cached_has_bits & 0x00000008u) {
-      deprecated_ = from.deprecated_;
+    if (from.has_lazy()) {
+      set_lazy(from.lazy());
     }
-    if (cached_has_bits & 0x00000010u) {
-      weak_ = from.weak_;
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
     }
-    if (cached_has_bits & 0x00000020u) {
-      jstype_ = from.jstype_;
+    if (from.has_weak()) {
+      set_weak(from.weak());
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -9912,355 +10410,221 @@
 }
 
 bool FieldOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void FieldOptions::Swap(FieldOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    FieldOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void FieldOptions::UnsafeArenaSwap(FieldOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void FieldOptions::InternalSwap(FieldOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(ctype_, other->ctype_);
-  swap(packed_, other->packed_);
-  swap(lazy_, other->lazy_);
-  swap(deprecated_, other->deprecated_);
-  swap(weak_, other->weak_);
-  swap(jstype_, other->jstype_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(ctype_, other->ctype_);
+  std::swap(packed_, other->packed_);
+  std::swap(jstype_, other->jstype_);
+  std::swap(lazy_, other->lazy_);
+  std::swap(deprecated_, other->deprecated_);
+  std::swap(weak_, other->weak_);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata FieldOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FieldOptions_descriptor_;
+  metadata.reflection = FieldOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FieldOptions
 
-// ===================================================================
-
-void OneofOptions::InitAsDefaultInstance() {
+// optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
+bool FieldOptions::has_ctype() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
 }
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int OneofOptions::kUninterpretedOptionFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-OneofOptions::OneofOptions()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.OneofOptions)
+void FieldOptions::set_has_ctype() {
+  _has_bits_[0] |= 0x00000001u;
 }
-OneofOptions::OneofOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.OneofOptions)
+void FieldOptions::clear_has_ctype() {
+  _has_bits_[0] &= ~0x00000001u;
 }
-OneofOptions::OneofOptions(const OneofOptions& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofOptions)
+void FieldOptions::clear_ctype() {
+  ctype_ = 0;
+  clear_has_ctype();
+}
+ ::google::protobuf::FieldOptions_CType FieldOptions::ctype() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.ctype)
+  return static_cast< ::google::protobuf::FieldOptions_CType >(ctype_);
+}
+ void FieldOptions::set_ctype(::google::protobuf::FieldOptions_CType value) {
+  assert(::google::protobuf::FieldOptions_CType_IsValid(value));
+  set_has_ctype();
+  ctype_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.ctype)
 }
 
-void OneofOptions::SharedCtor() {
-  _cached_size_ = 0;
+// optional bool packed = 2;
+bool FieldOptions::has_packed() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void FieldOptions::set_has_packed() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void FieldOptions::clear_has_packed() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void FieldOptions::clear_packed() {
+  packed_ = false;
+  clear_has_packed();
+}
+ bool FieldOptions::packed() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.packed)
+  return packed_;
+}
+ void FieldOptions::set_packed(bool value) {
+  set_has_packed();
+  packed_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.packed)
 }
 
-OneofOptions::~OneofOptions() {
-  // @@protoc_insertion_point(destructor:google.protobuf.OneofOptions)
-  SharedDtor();
+// optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
+bool FieldOptions::has_jstype() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void FieldOptions::set_has_jstype() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void FieldOptions::clear_has_jstype() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void FieldOptions::clear_jstype() {
+  jstype_ = 0;
+  clear_has_jstype();
+}
+ ::google::protobuf::FieldOptions_JSType FieldOptions::jstype() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.jstype)
+  return static_cast< ::google::protobuf::FieldOptions_JSType >(jstype_);
+}
+ void FieldOptions::set_jstype(::google::protobuf::FieldOptions_JSType value) {
+  assert(::google::protobuf::FieldOptions_JSType_IsValid(value));
+  set_has_jstype();
+  jstype_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.jstype)
 }
 
-void OneofOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+// optional bool lazy = 5 [default = false];
+bool FieldOptions::has_lazy() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void FieldOptions::set_has_lazy() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void FieldOptions::clear_has_lazy() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void FieldOptions::clear_lazy() {
+  lazy_ = false;
+  clear_has_lazy();
+}
+ bool FieldOptions::lazy() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.lazy)
+  return lazy_;
+}
+ void FieldOptions::set_lazy(bool value) {
+  set_has_lazy();
+  lazy_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.lazy)
 }
 
-void OneofOptions::ArenaDtor(void* object) {
-  OneofOptions* _this = reinterpret_cast< OneofOptions* >(object);
-  (void)_this;
+// optional bool deprecated = 3 [default = false];
+bool FieldOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
-void OneofOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
+void FieldOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000010u;
 }
-void OneofOptions::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+void FieldOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000010u;
 }
-const ::google::protobuf::Descriptor* OneofOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+void FieldOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool FieldOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.deprecated)
+  return deprecated_;
+}
+ void FieldOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.deprecated)
 }
 
-const OneofOptions& OneofOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions();
-  return *internal_default_instance();
+// optional bool weak = 10 [default = false];
+bool FieldOptions::has_weak() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+void FieldOptions::set_has_weak() {
+  _has_bits_[0] |= 0x00000020u;
+}
+void FieldOptions::clear_has_weak() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+void FieldOptions::clear_weak() {
+  weak_ = false;
+  clear_has_weak();
+}
+ bool FieldOptions::weak() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.weak)
+  return weak_;
+}
+ void FieldOptions::set_weak(bool value) {
+  set_has_weak();
+  weak_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.weak)
 }
 
-OneofOptions* OneofOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<OneofOptions>(arena);
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int FieldOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
 }
-
-void OneofOptions::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.OneofOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  _extensions_.Clear();
+void FieldOptions::clear_uninterpreted_option() {
   uninterpreted_option_.Clear();
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& FieldOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* FieldOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* FieldOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.FieldOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+FieldOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FieldOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+FieldOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FieldOptions.uninterpreted_option)
+  return uninterpreted_option_;
 }
 
-bool OneofOptions::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.OneofOptions)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-      case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
-          continue;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.OneofOptions)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.OneofOptions)
-  return false;
-#undef DO_
-}
-
-void OneofOptions::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.OneofOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
-  }
-
-  // Extension range [1000, 536870912)
-  _extensions_.SerializeWithCachedSizes(
-      1000, 536870912, output);
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.OneofOptions)
-}
-
-::google::protobuf::uint8* OneofOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
-  }
-
-  // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofOptions)
-  return target;
-}
-
-size_t OneofOptions::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.OneofOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
-
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void OneofOptions::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.OneofOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const OneofOptions* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const OneofOptions>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.OneofOptions)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.OneofOptions)
-    MergeFrom(*source);
-  }
-}
-
-void OneofOptions::MergeFrom(const OneofOptions& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.OneofOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-}
-
-void OneofOptions::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.OneofOptions)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void OneofOptions::CopyFrom(const OneofOptions& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.OneofOptions)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool OneofOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
-
-  if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
-}
-
-void OneofOptions::Swap(OneofOptions* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    OneofOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void OneofOptions::UnsafeArenaSwap(OneofOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void OneofOptions::InternalSwap(OneofOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-  _extensions_.Swap(&other->_extensions_);
-}
-
-::google::protobuf::Metadata OneofOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void EnumOptions::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int EnumOptions::kAllowAliasFieldNumber;
 const int EnumOptions::kDeprecatedFieldNumber;
@@ -10269,41 +10633,26 @@
 
 EnumOptions::EnumOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.EnumOptions)
 }
-EnumOptions::EnumOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumOptions)
+
+void EnumOptions::InitAsDefaultInstance() {
 }
+
 EnumOptions::EnumOptions(const EnumOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  ::memcpy(&allow_alias_, &from.allow_alias_,
-    static_cast<size_t>(reinterpret_cast<char*>(&deprecated_) -
-    reinterpret_cast<char*>(&allow_alias_)) + sizeof(deprecated_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumOptions)
 }
 
 void EnumOptions::SharedCtor() {
   _cached_size_ = 0;
-  ::memset(&allow_alias_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&deprecated_) -
-      reinterpret_cast<char*>(&allow_alias_)) + sizeof(deprecated_));
+  allow_alias_ = false;
+  deprecated_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 EnumOptions::~EnumOptions() {
@@ -10312,47 +10661,64 @@
 }
 
 void EnumOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void EnumOptions::ArenaDtor(void* object) {
-  EnumOptions* _this = reinterpret_cast< EnumOptions* >(object);
-  (void)_this;
-}
-void EnumOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void EnumOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* EnumOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return EnumOptions_descriptor_;
 }
 
 const EnumOptions& EnumOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+EnumOptions* EnumOptions::default_instance_ = NULL;
+
 EnumOptions* EnumOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<EnumOptions>(arena);
+  EnumOptions* n = new EnumOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void EnumOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(EnumOptions, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<EnumOptions*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(allow_alias_, deprecated_);
+
+#undef ZR_HELPER_
+#undef ZR_
+
   uninterpreted_option_.Clear();
-  ::memset(&allow_alias_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&deprecated_) -
-      reinterpret_cast<char*>(&allow_alias_)) + sizeof(deprecated_));
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool EnumOptions::MergePartialFromCodedStream(
@@ -10361,62 +10727,70 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.EnumOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional bool allow_alias = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_allow_alias();
+        if (tag == 16) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &allow_alias_)));
+          set_has_allow_alias();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_deprecated;
         break;
       }
 
       // optional bool deprecated = 3 [default = false];
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 24) {
+         parse_deprecated:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -10433,25 +10807,20 @@
 void EnumOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.EnumOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool allow_alias = 2;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_allow_alias()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->allow_alias(), output);
   }
 
   // optional bool deprecated = 3 [default = false];
-  if (cached_has_bits & 0x00000002u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -10460,70 +10829,46 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.EnumOptions)
 }
 
-::google::protobuf::uint8* EnumOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* EnumOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool allow_alias = 2;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_allow_alias()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->allow_alias(), target);
   }
 
   // optional bool deprecated = 3 [default = false];
-  if (cached_has_bits & 0x00000002u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumOptions)
   return target;
 }
 
-size_t EnumOptions::ByteSizeLong() const {
+int EnumOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   if (_has_bits_[0 / 32] & 3u) {
     // optional bool allow_alias = 2;
@@ -10537,17 +10882,31 @@
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
+  }
+
+  total_size += _extensions_.ByteSize();
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void EnumOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const EnumOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const EnumOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const EnumOptions>(
           &from);
   if (source == NULL) {
@@ -10561,22 +10920,19 @@
 
 void EnumOptions::MergeFrom(const EnumOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      allow_alias_ = from.allow_alias_;
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_allow_alias()) {
+      set_allow_alias(from.allow_alias());
     }
-    if (cached_has_bits & 0x00000002u) {
-      deprecated_ = from.deprecated_;
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -10595,54 +10951,119 @@
 }
 
 bool EnumOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void EnumOptions::Swap(EnumOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    EnumOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void EnumOptions::UnsafeArenaSwap(EnumOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void EnumOptions::InternalSwap(EnumOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(allow_alias_, other->allow_alias_);
-  swap(deprecated_, other->deprecated_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(allow_alias_, other->allow_alias_);
+  std::swap(deprecated_, other->deprecated_);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata EnumOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = EnumOptions_descriptor_;
+  metadata.reflection = EnumOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// EnumOptions
+
+// optional bool allow_alias = 2;
+bool EnumOptions::has_allow_alias() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void EnumOptions::set_has_allow_alias() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void EnumOptions::clear_has_allow_alias() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void EnumOptions::clear_allow_alias() {
+  allow_alias_ = false;
+  clear_has_allow_alias();
+}
+ bool EnumOptions::allow_alias() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.allow_alias)
+  return allow_alias_;
+}
+ void EnumOptions::set_allow_alias(bool value) {
+  set_has_allow_alias();
+  allow_alias_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumOptions.allow_alias)
+}
+
+// optional bool deprecated = 3 [default = false];
+bool EnumOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void EnumOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void EnumOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void EnumOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool EnumOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.deprecated)
+  return deprecated_;
+}
+ void EnumOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumOptions.deprecated)
+}
+
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int EnumOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
+}
+void EnumOptions::clear_uninterpreted_option() {
+  uninterpreted_option_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& EnumOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* EnumOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* EnumOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.EnumOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+EnumOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+EnumOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.EnumOptions.uninterpreted_option)
+  return uninterpreted_option_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void EnumValueOptions::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int EnumValueOptions::kDeprecatedFieldNumber;
 const int EnumValueOptions::kUninterpretedOptionFieldNumber;
@@ -10650,37 +11071,25 @@
 
 EnumValueOptions::EnumValueOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.EnumValueOptions)
 }
-EnumValueOptions::EnumValueOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValueOptions)
+
+void EnumValueOptions::InitAsDefaultInstance() {
 }
+
 EnumValueOptions::EnumValueOptions(const EnumValueOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  deprecated_ = from.deprecated_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueOptions)
 }
 
 void EnumValueOptions::SharedCtor() {
   _cached_size_ = 0;
   deprecated_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 EnumValueOptions::~EnumValueOptions() {
@@ -10689,45 +11098,44 @@
 }
 
 void EnumValueOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void EnumValueOptions::ArenaDtor(void* object) {
-  EnumValueOptions* _this = reinterpret_cast< EnumValueOptions* >(object);
-  (void)_this;
-}
-void EnumValueOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void EnumValueOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* EnumValueOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return EnumValueOptions_descriptor_;
 }
 
 const EnumValueOptions& EnumValueOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+EnumValueOptions* EnumValueOptions::default_instance_ = NULL;
+
 EnumValueOptions* EnumValueOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<EnumValueOptions>(arena);
+  EnumValueOptions* n = new EnumValueOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void EnumValueOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValueOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
-  uninterpreted_option_.Clear();
   deprecated_ = false;
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  uninterpreted_option_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool EnumValueOptions::MergePartialFromCodedStream(
@@ -10736,48 +11144,55 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.EnumValueOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional bool deprecated = 1 [default = false];
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -10794,20 +11209,15 @@
 void EnumValueOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValueOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool deprecated = 1 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->deprecated(), output);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -10816,82 +11226,72 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValueOptions)
 }
 
-::google::protobuf::uint8* EnumValueOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* EnumValueOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool deprecated = 1 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->deprecated(), target);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueOptions)
   return target;
 }
 
-size_t EnumValueOptions::ByteSizeLong() const {
+int EnumValueOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValueOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   // optional bool deprecated = 1 [default = false];
   if (has_deprecated()) {
     total_size += 1 + 1;
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
+  }
+
+  total_size += _extensions_.ByteSize();
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void EnumValueOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumValueOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const EnumValueOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const EnumValueOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const EnumValueOptions>(
           &from);
   if (source == NULL) {
@@ -10905,15 +11305,16 @@
 
 void EnumValueOptions::MergeFrom(const EnumValueOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValueOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  if (from.has_deprecated()) {
-    set_deprecated(from.deprecated());
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
+    }
+  }
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -10932,53 +11333,94 @@
 }
 
 bool EnumValueOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void EnumValueOptions::Swap(EnumValueOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    EnumValueOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void EnumValueOptions::UnsafeArenaSwap(EnumValueOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void EnumValueOptions::InternalSwap(EnumValueOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(deprecated_, other->deprecated_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(deprecated_, other->deprecated_);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata EnumValueOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = EnumValueOptions_descriptor_;
+  metadata.reflection = EnumValueOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// EnumValueOptions
+
+// optional bool deprecated = 1 [default = false];
+bool EnumValueOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void EnumValueOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void EnumValueOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void EnumValueOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool EnumValueOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValueOptions.deprecated)
+  return deprecated_;
+}
+ void EnumValueOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumValueOptions.deprecated)
+}
+
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int EnumValueOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
+}
+void EnumValueOptions::clear_uninterpreted_option() {
+  uninterpreted_option_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& EnumValueOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValueOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* EnumValueOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* EnumValueOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.EnumValueOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+EnumValueOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumValueOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+EnumValueOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.EnumValueOptions.uninterpreted_option)
+  return uninterpreted_option_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void ServiceOptions::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int ServiceOptions::kDeprecatedFieldNumber;
 const int ServiceOptions::kUninterpretedOptionFieldNumber;
@@ -10986,37 +11428,25 @@
 
 ServiceOptions::ServiceOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.ServiceOptions)
 }
-ServiceOptions::ServiceOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.ServiceOptions)
+
+void ServiceOptions::InitAsDefaultInstance() {
 }
+
 ServiceOptions::ServiceOptions(const ServiceOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  deprecated_ = from.deprecated_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceOptions)
 }
 
 void ServiceOptions::SharedCtor() {
   _cached_size_ = 0;
   deprecated_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 ServiceOptions::~ServiceOptions() {
@@ -11025,45 +11455,44 @@
 }
 
 void ServiceOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void ServiceOptions::ArenaDtor(void* object) {
-  ServiceOptions* _this = reinterpret_cast< ServiceOptions* >(object);
-  (void)_this;
-}
-void ServiceOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void ServiceOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* ServiceOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return ServiceOptions_descriptor_;
 }
 
 const ServiceOptions& ServiceOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+ServiceOptions* ServiceOptions::default_instance_ = NULL;
+
 ServiceOptions* ServiceOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<ServiceOptions>(arena);
+  ServiceOptions* n = new ServiceOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void ServiceOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.ServiceOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
-  uninterpreted_option_.Clear();
   deprecated_ = false;
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  uninterpreted_option_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool ServiceOptions::MergePartialFromCodedStream(
@@ -11072,48 +11501,55 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.ServiceOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional bool deprecated = 33 [default = false];
       case 33: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 264 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 264) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -11130,20 +11566,15 @@
 void ServiceOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.ServiceOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool deprecated = 33 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(33, this->deprecated(), output);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -11152,82 +11583,72 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.ServiceOptions)
 }
 
-::google::protobuf::uint8* ServiceOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* ServiceOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool deprecated = 33 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(33, this->deprecated(), target);
   }
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceOptions)
   return target;
 }
 
-size_t ServiceOptions::ByteSizeLong() const {
+int ServiceOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ServiceOptions)
-  size_t total_size = 0;
-
-  total_size += _extensions_.ByteSize();
-
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
+  int total_size = 0;
 
   // optional bool deprecated = 33 [default = false];
   if (has_deprecated()) {
     total_size += 2 + 1;
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
+  }
+
+  total_size += _extensions_.ByteSize();
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void ServiceOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ServiceOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const ServiceOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const ServiceOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const ServiceOptions>(
           &from);
   if (source == NULL) {
@@ -11241,15 +11662,16 @@
 
 void ServiceOptions::MergeFrom(const ServiceOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ServiceOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  if (from.has_deprecated()) {
-    set_deprecated(from.deprecated());
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
+    }
+  }
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -11268,96 +11690,120 @@
 }
 
 bool ServiceOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void ServiceOptions::Swap(ServiceOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    ServiceOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void ServiceOptions::UnsafeArenaSwap(ServiceOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void ServiceOptions::InternalSwap(ServiceOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(deprecated_, other->deprecated_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(deprecated_, other->deprecated_);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata ServiceOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = ServiceOptions_descriptor_;
+  metadata.reflection = ServiceOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// ServiceOptions
+
+// optional bool deprecated = 33 [default = false];
+bool ServiceOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void ServiceOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void ServiceOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void ServiceOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool ServiceOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.ServiceOptions.deprecated)
+  return deprecated_;
+}
+ void ServiceOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.ServiceOptions.deprecated)
+}
+
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int ServiceOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
+}
+void ServiceOptions::clear_uninterpreted_option() {
+  uninterpreted_option_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& ServiceOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.ServiceOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* ServiceOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* ServiceOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.ServiceOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+ServiceOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.ServiceOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+ServiceOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.ServiceOptions.uninterpreted_option)
+  return uninterpreted_option_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void MethodOptions::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int MethodOptions::kDeprecatedFieldNumber;
-const int MethodOptions::kIdempotencyLevelFieldNumber;
 const int MethodOptions::kUninterpretedOptionFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 MethodOptions::MethodOptions()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.MethodOptions)
 }
-MethodOptions::MethodOptions(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _extensions_(arena),
-  _internal_metadata_(arena),
-  uninterpreted_option_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.MethodOptions)
+
+void MethodOptions::InitAsDefaultInstance() {
 }
+
 MethodOptions::MethodOptions(const MethodOptions& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      uninterpreted_option_(from.uninterpreted_option_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  _extensions_.MergeFrom(from._extensions_);
-  ::memcpy(&deprecated_, &from.deprecated_,
-    static_cast<size_t>(reinterpret_cast<char*>(&idempotency_level_) -
-    reinterpret_cast<char*>(&deprecated_)) + sizeof(idempotency_level_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodOptions)
 }
 
 void MethodOptions::SharedCtor() {
   _cached_size_ = 0;
-  ::memset(&deprecated_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&idempotency_level_) -
-      reinterpret_cast<char*>(&deprecated_)) + sizeof(idempotency_level_));
+  deprecated_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 MethodOptions::~MethodOptions() {
@@ -11366,50 +11812,44 @@
 }
 
 void MethodOptions::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void MethodOptions::ArenaDtor(void* object) {
-  MethodOptions* _this = reinterpret_cast< MethodOptions* >(object);
-  (void)_this;
-}
-void MethodOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void MethodOptions::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* MethodOptions::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return MethodOptions_descriptor_;
 }
 
 const MethodOptions& MethodOptions::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+MethodOptions* MethodOptions::default_instance_ = NULL;
+
 MethodOptions* MethodOptions::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<MethodOptions>(arena);
+  MethodOptions* n = new MethodOptions;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void MethodOptions::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.MethodOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   _extensions_.Clear();
+  deprecated_ = false;
   uninterpreted_option_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    ::memset(&deprecated_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&idempotency_level_) -
-        reinterpret_cast<char*>(&deprecated_)) + sizeof(idempotency_level_));
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool MethodOptions::MergePartialFromCodedStream(
@@ -11418,68 +11858,55 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.MethodOptions)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // optional bool deprecated = 33 [default = false];
       case 33: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 264 & 0xFF */)) {
-          set_has_deprecated();
+        if (tag == 264) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
+          set_has_deprecated();
         } else {
           goto handle_unusual;
         }
-        break;
-      }
-
-      // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
-      case 34: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 272 & 0xFF */)) {
-          int value;
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
-                 input, &value)));
-          if (::google::protobuf::MethodOptions_IdempotencyLevel_IsValid(value)) {
-            set_idempotency_level(static_cast< ::google::protobuf::MethodOptions_IdempotencyLevel >(value));
-          } else {
-            mutable_unknown_fields()->AddVarint(
-                34, static_cast< ::google::protobuf::uint64>(value));
-          }
-        } else {
-          goto handle_unusual;
-        }
+        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;
         break;
       }
 
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option()));
+        if (tag == 7994) {
+         parse_uninterpreted_option:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_uninterpreted_option:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_uninterpreted_option()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(7994)) goto parse_loop_uninterpreted_option;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         if ((8000u <= tag)) {
-          DO_(_extensions_.ParseField(tag, input,
-              internal_default_instance(),
-              _internal_metadata_.mutable_unknown_fields()));
+          DO_(_extensions_.ParseField(tag, input, default_instance_,
+                                      mutable_unknown_fields()));
           continue;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -11496,26 +11923,15 @@
 void MethodOptions::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.MethodOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool deprecated = 33 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_deprecated()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(33, this->deprecated(), output);
   }
 
-  // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
-  if (cached_has_bits & 0x00000002u) {
-    ::google::protobuf::internal::WireFormatLite::WriteEnum(
-      34, this->idempotency_level(), output);
-  }
-
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      999, this->uninterpreted_option(static_cast<int>(i)), output);
+      999, this->uninterpreted_option(i), output);
   }
 
   // Extension range [1000, 536870912)
@@ -11524,96 +11940,72 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.MethodOptions)
 }
 
-::google::protobuf::uint8* MethodOptions::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* MethodOptions::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodOptions)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // optional bool deprecated = 33 [default = false];
-  if (cached_has_bits & 0x00000001u) {
+  if (has_deprecated()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(33, this->deprecated(), target);
   }
 
-  // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
-  if (cached_has_bits & 0x00000002u) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
-      34, this->idempotency_level(), target);
-  }
-
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->uninterpreted_option_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->uninterpreted_option_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        999, this->uninterpreted_option(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        999, this->uninterpreted_option(i), target);
   }
 
   // Extension range [1000, 536870912)
-  target = _extensions_.InternalSerializeWithCachedSizesToArray(
-      1000, 536870912, deterministic, target);
+  target = _extensions_.SerializeWithCachedSizesToArray(
+      1000, 536870912, target);
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodOptions)
   return target;
 }
 
-size_t MethodOptions::ByteSizeLong() const {
+int MethodOptions::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MethodOptions)
-  size_t total_size = 0;
+  int total_size = 0;
+
+  // optional bool deprecated = 33 [default = false];
+  if (has_deprecated()) {
+    total_size += 2 + 1;
+  }
+
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  total_size += 2 * this->uninterpreted_option_size();
+  for (int i = 0; i < this->uninterpreted_option_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->uninterpreted_option(i));
+  }
 
   total_size += _extensions_.ByteSize();
 
   if (_internal_metadata_.have_unknown_fields()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
+        unknown_fields());
   }
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  {
-    unsigned int count = static_cast<unsigned int>(this->uninterpreted_option_size());
-    total_size += 2UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->uninterpreted_option(static_cast<int>(i)));
-    }
-  }
-
-  if (_has_bits_[0 / 32] & 3u) {
-    // optional bool deprecated = 33 [default = false];
-    if (has_deprecated()) {
-      total_size += 2 + 1;
-    }
-
-    // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
-    if (has_idempotency_level()) {
-      total_size += 2 +
-        ::google::protobuf::internal::WireFormatLite::EnumSize(this->idempotency_level());
-    }
-
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void MethodOptions::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.MethodOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  const MethodOptions* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const MethodOptions* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const MethodOptions>(
           &from);
   if (source == NULL) {
@@ -11627,22 +12019,16 @@
 
 void MethodOptions::MergeFrom(const MethodOptions& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MethodOptions)
-  GOOGLE_DCHECK_NE(&from, this);
-  _extensions_.MergeFrom(from._extensions_);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   uninterpreted_option_.MergeFrom(from.uninterpreted_option_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      deprecated_ = from.deprecated_;
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_deprecated()) {
+      set_deprecated(from.deprecated());
     }
-    if (cached_has_bits & 0x00000002u) {
-      idempotency_level_ = from.idempotency_level_;
-    }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  _extensions_.MergeFrom(from._extensions_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -11661,54 +12047,94 @@
 }
 
 bool MethodOptions::IsInitialized() const {
-  if (!_extensions_.IsInitialized()) {
-    return false;
-  }
 
   if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false;
-  return true;
+
+  if (!_extensions_.IsInitialized()) return false;  return true;
 }
 
 void MethodOptions::Swap(MethodOptions* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    MethodOptions* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void MethodOptions::UnsafeArenaSwap(MethodOptions* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void MethodOptions::InternalSwap(MethodOptions* other) {
-  using std::swap;
-  uninterpreted_option_.InternalSwap(&other->uninterpreted_option_);
-  swap(deprecated_, other->deprecated_);
-  swap(idempotency_level_, other->idempotency_level_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(deprecated_, other->deprecated_);
+  uninterpreted_option_.UnsafeArenaSwap(&other->uninterpreted_option_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
   _extensions_.Swap(&other->_extensions_);
 }
 
 ::google::protobuf::Metadata MethodOptions::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = MethodOptions_descriptor_;
+  metadata.reflection = MethodOptions_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// MethodOptions
+
+// optional bool deprecated = 33 [default = false];
+bool MethodOptions::has_deprecated() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void MethodOptions::set_has_deprecated() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void MethodOptions::clear_has_deprecated() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void MethodOptions::clear_deprecated() {
+  deprecated_ = false;
+  clear_has_deprecated();
+}
+ bool MethodOptions::deprecated() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.deprecated)
+  return deprecated_;
+}
+ void MethodOptions::set_deprecated(bool value) {
+  set_has_deprecated();
+  deprecated_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.MethodOptions.deprecated)
+}
+
+// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+int MethodOptions::uninterpreted_option_size() const {
+  return uninterpreted_option_.size();
+}
+void MethodOptions::clear_uninterpreted_option() {
+  uninterpreted_option_.Clear();
+}
+const ::google::protobuf::UninterpretedOption& MethodOptions::uninterpreted_option(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.uninterpreted_option)
+  return uninterpreted_option_.Get(index);
+}
+::google::protobuf::UninterpretedOption* MethodOptions::mutable_uninterpreted_option(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodOptions.uninterpreted_option)
+  return uninterpreted_option_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption* MethodOptions::add_uninterpreted_option() {
+  // @@protoc_insertion_point(field_add:google.protobuf.MethodOptions.uninterpreted_option)
+  return uninterpreted_option_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+MethodOptions::mutable_uninterpreted_option() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.MethodOptions.uninterpreted_option)
+  return &uninterpreted_option_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+MethodOptions::uninterpreted_option() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.MethodOptions.uninterpreted_option)
+  return uninterpreted_option_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void UninterpretedOption_NamePart::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int UninterpretedOption_NamePart::kNamePartFieldNumber;
 const int UninterpretedOption_NamePart::kIsExtensionFieldNumber;
@@ -11716,39 +12142,27 @@
 
 UninterpretedOption_NamePart::UninterpretedOption_NamePart()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.UninterpretedOption.NamePart)
 }
-UninterpretedOption_NamePart::UninterpretedOption_NamePart(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.UninterpretedOption.NamePart)
+
+void UninterpretedOption_NamePart::InitAsDefaultInstance() {
 }
+
 UninterpretedOption_NamePart::UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_part_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_name_part()) {
-    name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_part(),
-      GetArenaNoVirtual());
-  }
-  is_extension_ = from.is_extension_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption.NamePart)
 }
 
 void UninterpretedOption_NamePart::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   name_part_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   is_extension_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 UninterpretedOption_NamePart::~UninterpretedOption_NamePart() {
@@ -11757,49 +12171,48 @@
 }
 
 void UninterpretedOption_NamePart::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_part_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void UninterpretedOption_NamePart::ArenaDtor(void* object) {
-  UninterpretedOption_NamePart* _this = reinterpret_cast< UninterpretedOption_NamePart* >(object);
-  (void)_this;
-}
-void UninterpretedOption_NamePart::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void UninterpretedOption_NamePart::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* UninterpretedOption_NamePart::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return UninterpretedOption_NamePart_descriptor_;
 }
 
 const UninterpretedOption_NamePart& UninterpretedOption_NamePart::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+UninterpretedOption_NamePart* UninterpretedOption_NamePart::default_instance_ = NULL;
+
 UninterpretedOption_NamePart* UninterpretedOption_NamePart::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<UninterpretedOption_NamePart>(arena);
+  UninterpretedOption_NamePart* n = new UninterpretedOption_NamePart;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void UninterpretedOption_NamePart::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.UninterpretedOption.NamePart)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x00000001u) {
-    GOOGLE_DCHECK(!name_part_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-    name_part_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (_has_bits_[0 / 32] & 3u) {
+    if (has_name_part()) {
+      name_part_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    is_extension_ = false;
   }
-  is_extension_ = false;
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool UninterpretedOption_NamePart::MergePartialFromCodedStream(
@@ -11808,47 +12221,50 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.UninterpretedOption.NamePart)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // required string name_part = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name_part()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->name_part().data(), static_cast<int>(this->name_part().length()),
+            this->name_part().data(), this->name_part().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.UninterpretedOption.NamePart.name_part");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_is_extension;
         break;
       }
 
       // required bool is_extension = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-          set_has_is_extension();
+        if (tag == 16) {
+         parse_is_extension:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &is_extension_)));
+          set_has_is_extension();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -11865,14 +12281,10 @@
 void UninterpretedOption_NamePart::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.UninterpretedOption.NamePart)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // required string name_part = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name_part()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name_part().data(), static_cast<int>(this->name_part().length()),
+      this->name_part().data(), this->name_part().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.UninterpretedOption.NamePart.name_part");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -11880,29 +12292,24 @@
   }
 
   // required bool is_extension = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_is_extension()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->is_extension(), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.UninterpretedOption.NamePart)
 }
 
-::google::protobuf::uint8* UninterpretedOption_NamePart::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* UninterpretedOption_NamePart::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption.NamePart)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = _has_bits_[0];
   // required string name_part = 1;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_name_part()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->name_part().data(), static_cast<int>(this->name_part().length()),
+      this->name_part().data(), this->name_part().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.UninterpretedOption.NamePart.name_part");
     target =
@@ -11911,21 +12318,21 @@
   }
 
   // required bool is_extension = 2;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_is_extension()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->is_extension(), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption.NamePart)
   return target;
 }
 
-size_t UninterpretedOption_NamePart::RequiredFieldsByteSizeFallback() const {
+int UninterpretedOption_NamePart::RequiredFieldsByteSizeFallback() const {
 // @@protoc_insertion_point(required_fields_byte_size_fallback_start:google.protobuf.UninterpretedOption.NamePart)
-  size_t total_size = 0;
+  int total_size = 0;
 
   if (has_name_part()) {
     // required string name_part = 1;
@@ -11941,15 +12348,10 @@
 
   return total_size;
 }
-size_t UninterpretedOption_NamePart::ByteSizeLong() const {
+int UninterpretedOption_NamePart::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UninterpretedOption.NamePart)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
   if (((_has_bits_[0] & 0x00000003) ^ 0x00000003) == 0) {  // All required fields are present.
     // required string name_part = 1;
     total_size += 1 +
@@ -11962,17 +12364,21 @@
   } else {
     total_size += RequiredFieldsByteSizeFallback();
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void UninterpretedOption_NamePart::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.UninterpretedOption.NamePart)
-  GOOGLE_DCHECK_NE(&from, this);
-  const UninterpretedOption_NamePart* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const UninterpretedOption_NamePart* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const UninterpretedOption_NamePart>(
           &from);
   if (source == NULL) {
@@ -11986,20 +12392,18 @@
 
 void UninterpretedOption_NamePart::MergeFrom(const UninterpretedOption_NamePart& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UninterpretedOption.NamePart)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_name_part(from.name_part());
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_name_part()) {
+      set_has_name_part();
+      name_part_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_part_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      is_extension_ = from.is_extension_;
+    if (from.has_is_extension()) {
+      set_is_extension(from.is_extension());
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -12019,47 +12423,33 @@
 
 bool UninterpretedOption_NamePart::IsInitialized() const {
   if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false;
+
   return true;
 }
 
 void UninterpretedOption_NamePart::Swap(UninterpretedOption_NamePart* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    UninterpretedOption_NamePart* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void UninterpretedOption_NamePart::UnsafeArenaSwap(UninterpretedOption_NamePart* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void UninterpretedOption_NamePart::InternalSwap(UninterpretedOption_NamePart* other) {
-  using std::swap;
   name_part_.Swap(&other->name_part_);
-  swap(is_extension_, other->is_extension_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(is_extension_, other->is_extension_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata UninterpretedOption_NamePart::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = UninterpretedOption_NamePart_descriptor_;
+  metadata.reflection = UninterpretedOption_NamePart_reflection_;
+  return metadata;
 }
 
 
-// ===================================================================
+// -------------------------------------------------------------------
 
-void UninterpretedOption::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int UninterpretedOption::kNameFieldNumber;
 const int UninterpretedOption::kIdentifierValueFieldNumber;
@@ -12072,57 +12462,31 @@
 
 UninterpretedOption::UninterpretedOption()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.UninterpretedOption)
 }
-UninterpretedOption::UninterpretedOption(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  name_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.UninterpretedOption)
+
+void UninterpretedOption::InitAsDefaultInstance() {
 }
+
 UninterpretedOption::UninterpretedOption(const UninterpretedOption& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      name_(from.name_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  identifier_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_identifier_value()) {
-    identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.identifier_value(),
-      GetArenaNoVirtual());
-  }
-  string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_string_value()) {
-    string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.string_value(),
-      GetArenaNoVirtual());
-  }
-  aggregate_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_aggregate_value()) {
-    aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.aggregate_value(),
-      GetArenaNoVirtual());
-  }
-  ::memcpy(&positive_int_value_, &from.positive_int_value_,
-    static_cast<size_t>(reinterpret_cast<char*>(&double_value_) -
-    reinterpret_cast<char*>(&positive_int_value_)) + sizeof(double_value_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption)
 }
 
 void UninterpretedOption::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   identifier_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  positive_int_value_ = GOOGLE_ULONGLONG(0);
+  negative_int_value_ = GOOGLE_LONGLONG(0);
+  double_value_ = 0;
   string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   aggregate_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&positive_int_value_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&double_value_) -
-      reinterpret_cast<char*>(&positive_int_value_)) + sizeof(double_value_));
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 UninterpretedOption::~UninterpretedOption() {
@@ -12131,66 +12495,77 @@
 }
 
 void UninterpretedOption::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   identifier_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   string_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   aggregate_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void UninterpretedOption::ArenaDtor(void* object) {
-  UninterpretedOption* _this = reinterpret_cast< UninterpretedOption* >(object);
-  (void)_this;
-}
-void UninterpretedOption::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void UninterpretedOption::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* UninterpretedOption::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return UninterpretedOption_descriptor_;
 }
 
 const UninterpretedOption& UninterpretedOption::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+UninterpretedOption* UninterpretedOption::default_instance_ = NULL;
+
 UninterpretedOption* UninterpretedOption::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<UninterpretedOption>(arena);
+  UninterpretedOption* n = new UninterpretedOption;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void UninterpretedOption::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.UninterpretedOption)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(UninterpretedOption, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<UninterpretedOption*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  if (_has_bits_[0 / 32] & 126u) {
+    ZR_(positive_int_value_, double_value_);
+    if (has_identifier_value()) {
+      identifier_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_string_value()) {
+      string_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_aggregate_value()) {
+      aggregate_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+  }
+
+#undef ZR_HELPER_
+#undef ZR_
 
   name_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 7u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!identifier_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      identifier_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!string_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      string_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000004u) {
-      GOOGLE_DCHECK(!aggregate_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      aggregate_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
   }
-  if (cached_has_bits & 56u) {
-    ::memset(&positive_int_value_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&double_value_) -
-        reinterpret_cast<char*>(&positive_int_value_)) + sizeof(double_value_));
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool UninterpretedOption::MergePartialFromCodedStream(
@@ -12199,114 +12574,127 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.UninterpretedOption)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_name()));
+        if (tag == 18) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_name()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_loop_name;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(26)) goto parse_identifier_value;
         break;
       }
 
       // optional string identifier_value = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
+        if (tag == 26) {
+         parse_identifier_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_identifier_value()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->identifier_value().data(), static_cast<int>(this->identifier_value().length()),
+            this->identifier_value().data(), this->identifier_value().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.UninterpretedOption.identifier_value");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(32)) goto parse_positive_int_value;
         break;
       }
 
       // optional uint64 positive_int_value = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) {
-          set_has_positive_int_value();
+        if (tag == 32) {
+         parse_positive_int_value:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
                  input, &positive_int_value_)));
+          set_has_positive_int_value();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(40)) goto parse_negative_int_value;
         break;
       }
 
       // optional int64 negative_int_value = 5;
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) {
-          set_has_negative_int_value();
+        if (tag == 40) {
+         parse_negative_int_value:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>(
                  input, &negative_int_value_)));
+          set_has_negative_int_value();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(49)) goto parse_double_value;
         break;
       }
 
       // optional double double_value = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(49u /* 49 & 0xFF */)) {
-          set_has_double_value();
+        if (tag == 49) {
+         parse_double_value:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>(
                  input, &double_value_)));
+          set_has_double_value();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(58)) goto parse_string_value;
         break;
       }
 
       // optional bytes string_value = 7;
       case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) {
+        if (tag == 58) {
+         parse_string_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_string_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(66)) goto parse_aggregate_value;
         break;
       }
 
       // optional string aggregate_value = 8;
       case 8: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) {
+        if (tag == 66) {
+         parse_aggregate_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_aggregate_value()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->aggregate_value().data(), static_cast<int>(this->aggregate_value().length()),
+            this->aggregate_value().data(), this->aggregate_value().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.UninterpretedOption.aggregate_value");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -12323,21 +12711,16 @@
 void UninterpretedOption::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.UninterpretedOption)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->name_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->name_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->name(static_cast<int>(i)), output);
+      2, this->name(i), output);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string identifier_value = 3;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_identifier_value()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->identifier_value().data(), static_cast<int>(this->identifier_value().length()),
+      this->identifier_value().data(), this->identifier_value().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.UninterpretedOption.identifier_value");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -12345,30 +12728,30 @@
   }
 
   // optional uint64 positive_int_value = 4;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_positive_int_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->positive_int_value(), output);
   }
 
   // optional int64 negative_int_value = 5;
-  if (cached_has_bits & 0x00000010u) {
+  if (has_negative_int_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteInt64(5, this->negative_int_value(), output);
   }
 
   // optional double double_value = 6;
-  if (cached_has_bits & 0x00000020u) {
+  if (has_double_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteDouble(6, this->double_value(), output);
   }
 
   // optional bytes string_value = 7;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_string_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
       7, this->string_value(), output);
   }
 
   // optional string aggregate_value = 8;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_aggregate_value()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->aggregate_value().data(), static_cast<int>(this->aggregate_value().length()),
+      this->aggregate_value().data(), this->aggregate_value().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.UninterpretedOption.aggregate_value");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -12377,31 +12760,25 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.UninterpretedOption)
 }
 
-::google::protobuf::uint8* UninterpretedOption::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* UninterpretedOption::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->name_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->name_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->name(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        2, this->name(i), target);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string identifier_value = 3;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_identifier_value()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->identifier_value().data(), static_cast<int>(this->identifier_value().length()),
+      this->identifier_value().data(), this->identifier_value().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.UninterpretedOption.identifier_value");
     target =
@@ -12410,31 +12787,31 @@
   }
 
   // optional uint64 positive_int_value = 4;
-  if (cached_has_bits & 0x00000008u) {
+  if (has_positive_int_value()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->positive_int_value(), target);
   }
 
   // optional int64 negative_int_value = 5;
-  if (cached_has_bits & 0x00000010u) {
+  if (has_negative_int_value()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(5, this->negative_int_value(), target);
   }
 
   // optional double double_value = 6;
-  if (cached_has_bits & 0x00000020u) {
+  if (has_double_value()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(6, this->double_value(), target);
   }
 
   // optional bytes string_value = 7;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_string_value()) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
         7, this->string_value(), target);
   }
 
   // optional string aggregate_value = 8;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_aggregate_value()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->aggregate_value().data(), static_cast<int>(this->aggregate_value().length()),
+      this->aggregate_value().data(), this->aggregate_value().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.UninterpretedOption.aggregate_value");
     target =
@@ -12444,33 +12821,17 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption)
   return target;
 }
 
-size_t UninterpretedOption::ByteSizeLong() const {
+int UninterpretedOption::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UninterpretedOption)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->name_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->name(static_cast<int>(i)));
-    }
-  }
-
-  if (_has_bits_[0 / 32] & 63u) {
+  if (_has_bits_[1 / 32] & 126u) {
     // optional string identifier_value = 3;
     if (has_identifier_value()) {
       total_size += 1 +
@@ -12478,20 +12839,6 @@
           this->identifier_value());
     }
 
-    // optional bytes string_value = 7;
-    if (has_string_value()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::BytesSize(
-          this->string_value());
-    }
-
-    // optional string aggregate_value = 8;
-    if (has_aggregate_value()) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::StringSize(
-          this->aggregate_value());
-    }
-
     // optional uint64 positive_int_value = 4;
     if (has_positive_int_value()) {
       total_size += 1 +
@@ -12511,18 +12858,44 @@
       total_size += 1 + 8;
     }
 
+    // optional bytes string_value = 7;
+    if (has_string_value()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::BytesSize(
+          this->string_value());
+    }
+
+    // optional string aggregate_value = 8;
+    if (has_aggregate_value()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->aggregate_value());
+    }
+
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
+  total_size += 1 * this->name_size();
+  for (int i = 0; i < this->name_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->name(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void UninterpretedOption::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.UninterpretedOption)
-  GOOGLE_DCHECK_NE(&from, this);
-  const UninterpretedOption* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const UninterpretedOption* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const UninterpretedOption>(
           &from);
   if (source == NULL) {
@@ -12536,33 +12909,33 @@
 
 void UninterpretedOption::MergeFrom(const UninterpretedOption& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UninterpretedOption)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   name_.MergeFrom(from.name_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 63u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_identifier_value(from.identifier_value());
+  if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) {
+    if (from.has_identifier_value()) {
+      set_has_identifier_value();
+      identifier_value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.identifier_value_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      set_string_value(from.string_value());
+    if (from.has_positive_int_value()) {
+      set_positive_int_value(from.positive_int_value());
     }
-    if (cached_has_bits & 0x00000004u) {
-      set_aggregate_value(from.aggregate_value());
+    if (from.has_negative_int_value()) {
+      set_negative_int_value(from.negative_int_value());
     }
-    if (cached_has_bits & 0x00000008u) {
-      positive_int_value_ = from.positive_int_value_;
+    if (from.has_double_value()) {
+      set_double_value(from.double_value());
     }
-    if (cached_has_bits & 0x00000010u) {
-      negative_int_value_ = from.negative_int_value_;
+    if (from.has_string_value()) {
+      set_has_string_value();
+      string_value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.string_value_);
     }
-    if (cached_has_bits & 0x00000020u) {
-      double_value_ = from.double_value_;
+    if (from.has_aggregate_value()) {
+      set_has_aggregate_value();
+      aggregate_value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.aggregate_value_);
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -12581,53 +12954,389 @@
 }
 
 bool UninterpretedOption::IsInitialized() const {
+
   if (!::google::protobuf::internal::AllAreInitialized(this->name())) return false;
   return true;
 }
 
 void UninterpretedOption::Swap(UninterpretedOption* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    UninterpretedOption* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void UninterpretedOption::UnsafeArenaSwap(UninterpretedOption* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void UninterpretedOption::InternalSwap(UninterpretedOption* other) {
-  using std::swap;
-  name_.InternalSwap(&other->name_);
+  name_.UnsafeArenaSwap(&other->name_);
   identifier_value_.Swap(&other->identifier_value_);
+  std::swap(positive_int_value_, other->positive_int_value_);
+  std::swap(negative_int_value_, other->negative_int_value_);
+  std::swap(double_value_, other->double_value_);
   string_value_.Swap(&other->string_value_);
   aggregate_value_.Swap(&other->aggregate_value_);
-  swap(positive_int_value_, other->positive_int_value_);
-  swap(negative_int_value_, other->negative_int_value_);
-  swap(double_value_, other->double_value_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata UninterpretedOption::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = UninterpretedOption_descriptor_;
+  metadata.reflection = UninterpretedOption_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// UninterpretedOption_NamePart
+
+// required string name_part = 1;
+bool UninterpretedOption_NamePart::has_name_part() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+void UninterpretedOption_NamePart::set_has_name_part() {
+  _has_bits_[0] |= 0x00000001u;
+}
+void UninterpretedOption_NamePart::clear_has_name_part() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+void UninterpretedOption_NamePart::clear_name_part() {
+  name_part_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_name_part();
+}
+ const ::std::string& UninterpretedOption_NamePart::name_part() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.name_part)
+  return name_part_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption_NamePart::set_name_part(const ::std::string& value) {
+  set_has_name_part();
+  name_part_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.name_part)
+}
+ void UninterpretedOption_NamePart::set_name_part(const char* value) {
+  set_has_name_part();
+  name_part_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.NamePart.name_part)
+}
+ void UninterpretedOption_NamePart::set_name_part(const char* value, size_t size) {
+  set_has_name_part();
+  name_part_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.NamePart.name_part)
+}
+ ::std::string* UninterpretedOption_NamePart::mutable_name_part() {
+  set_has_name_part();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.NamePart.name_part)
+  return name_part_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* UninterpretedOption_NamePart::release_name_part() {
+  // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.NamePart.name_part)
+  clear_has_name_part();
+  return name_part_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption_NamePart::set_allocated_name_part(::std::string* name_part) {
+  if (name_part != NULL) {
+    set_has_name_part();
+  } else {
+    clear_has_name_part();
+  }
+  name_part_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name_part);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.NamePart.name_part)
+}
+
+// required bool is_extension = 2;
+bool UninterpretedOption_NamePart::has_is_extension() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void UninterpretedOption_NamePart::set_has_is_extension() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void UninterpretedOption_NamePart::clear_has_is_extension() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void UninterpretedOption_NamePart::clear_is_extension() {
+  is_extension_ = false;
+  clear_has_is_extension();
+}
+ bool UninterpretedOption_NamePart::is_extension() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.is_extension)
+  return is_extension_;
+}
+ void UninterpretedOption_NamePart::set_is_extension(bool value) {
+  set_has_is_extension();
+  is_extension_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.is_extension)
+}
+
+// -------------------------------------------------------------------
+
+// UninterpretedOption
+
+// repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
+int UninterpretedOption::name_size() const {
+  return name_.size();
+}
+void UninterpretedOption::clear_name() {
+  name_.Clear();
+}
+const ::google::protobuf::UninterpretedOption_NamePart& UninterpretedOption::name(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.name)
+  return name_.Get(index);
+}
+::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::mutable_name(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.name)
+  return name_.Mutable(index);
+}
+::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::add_name() {
+  // @@protoc_insertion_point(field_add:google.protobuf.UninterpretedOption.name)
+  return name_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >*
+UninterpretedOption::mutable_name() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.UninterpretedOption.name)
+  return &name_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >&
+UninterpretedOption::name() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.UninterpretedOption.name)
+  return name_;
+}
+
+// optional string identifier_value = 3;
+bool UninterpretedOption::has_identifier_value() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void UninterpretedOption::set_has_identifier_value() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void UninterpretedOption::clear_has_identifier_value() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void UninterpretedOption::clear_identifier_value() {
+  identifier_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_identifier_value();
+}
+ const ::std::string& UninterpretedOption::identifier_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.identifier_value)
+  return identifier_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption::set_identifier_value(const ::std::string& value) {
+  set_has_identifier_value();
+  identifier_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.identifier_value)
+}
+ void UninterpretedOption::set_identifier_value(const char* value) {
+  set_has_identifier_value();
+  identifier_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.identifier_value)
+}
+ void UninterpretedOption::set_identifier_value(const char* value, size_t size) {
+  set_has_identifier_value();
+  identifier_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.identifier_value)
+}
+ ::std::string* UninterpretedOption::mutable_identifier_value() {
+  set_has_identifier_value();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.identifier_value)
+  return identifier_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* UninterpretedOption::release_identifier_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.identifier_value)
+  clear_has_identifier_value();
+  return identifier_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption::set_allocated_identifier_value(::std::string* identifier_value) {
+  if (identifier_value != NULL) {
+    set_has_identifier_value();
+  } else {
+    clear_has_identifier_value();
+  }
+  identifier_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), identifier_value);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.identifier_value)
+}
+
+// optional uint64 positive_int_value = 4;
+bool UninterpretedOption::has_positive_int_value() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void UninterpretedOption::set_has_positive_int_value() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void UninterpretedOption::clear_has_positive_int_value() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void UninterpretedOption::clear_positive_int_value() {
+  positive_int_value_ = GOOGLE_ULONGLONG(0);
+  clear_has_positive_int_value();
+}
+ ::google::protobuf::uint64 UninterpretedOption::positive_int_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.positive_int_value)
+  return positive_int_value_;
+}
+ void UninterpretedOption::set_positive_int_value(::google::protobuf::uint64 value) {
+  set_has_positive_int_value();
+  positive_int_value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.positive_int_value)
+}
+
+// optional int64 negative_int_value = 5;
+bool UninterpretedOption::has_negative_int_value() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void UninterpretedOption::set_has_negative_int_value() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void UninterpretedOption::clear_has_negative_int_value() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void UninterpretedOption::clear_negative_int_value() {
+  negative_int_value_ = GOOGLE_LONGLONG(0);
+  clear_has_negative_int_value();
+}
+ ::google::protobuf::int64 UninterpretedOption::negative_int_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.negative_int_value)
+  return negative_int_value_;
+}
+ void UninterpretedOption::set_negative_int_value(::google::protobuf::int64 value) {
+  set_has_negative_int_value();
+  negative_int_value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.negative_int_value)
+}
+
+// optional double double_value = 6;
+bool UninterpretedOption::has_double_value() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+void UninterpretedOption::set_has_double_value() {
+  _has_bits_[0] |= 0x00000010u;
+}
+void UninterpretedOption::clear_has_double_value() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+void UninterpretedOption::clear_double_value() {
+  double_value_ = 0;
+  clear_has_double_value();
+}
+ double UninterpretedOption::double_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.double_value)
+  return double_value_;
+}
+ void UninterpretedOption::set_double_value(double value) {
+  set_has_double_value();
+  double_value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.double_value)
+}
+
+// optional bytes string_value = 7;
+bool UninterpretedOption::has_string_value() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+void UninterpretedOption::set_has_string_value() {
+  _has_bits_[0] |= 0x00000020u;
+}
+void UninterpretedOption::clear_has_string_value() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+void UninterpretedOption::clear_string_value() {
+  string_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_string_value();
+}
+ const ::std::string& UninterpretedOption::string_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.string_value)
+  return string_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption::set_string_value(const ::std::string& value) {
+  set_has_string_value();
+  string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.string_value)
+}
+ void UninterpretedOption::set_string_value(const char* value) {
+  set_has_string_value();
+  string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.string_value)
+}
+ void UninterpretedOption::set_string_value(const void* value, size_t size) {
+  set_has_string_value();
+  string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.string_value)
+}
+ ::std::string* UninterpretedOption::mutable_string_value() {
+  set_has_string_value();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.string_value)
+  return string_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* UninterpretedOption::release_string_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.string_value)
+  clear_has_string_value();
+  return string_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption::set_allocated_string_value(::std::string* string_value) {
+  if (string_value != NULL) {
+    set_has_string_value();
+  } else {
+    clear_has_string_value();
+  }
+  string_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.string_value)
+}
+
+// optional string aggregate_value = 8;
+bool UninterpretedOption::has_aggregate_value() const {
+  return (_has_bits_[0] & 0x00000040u) != 0;
+}
+void UninterpretedOption::set_has_aggregate_value() {
+  _has_bits_[0] |= 0x00000040u;
+}
+void UninterpretedOption::clear_has_aggregate_value() {
+  _has_bits_[0] &= ~0x00000040u;
+}
+void UninterpretedOption::clear_aggregate_value() {
+  aggregate_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_aggregate_value();
+}
+ const ::std::string& UninterpretedOption::aggregate_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.aggregate_value)
+  return aggregate_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption::set_aggregate_value(const ::std::string& value) {
+  set_has_aggregate_value();
+  aggregate_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.aggregate_value)
+}
+ void UninterpretedOption::set_aggregate_value(const char* value) {
+  set_has_aggregate_value();
+  aggregate_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.aggregate_value)
+}
+ void UninterpretedOption::set_aggregate_value(const char* value, size_t size) {
+  set_has_aggregate_value();
+  aggregate_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.aggregate_value)
+}
+ ::std::string* UninterpretedOption::mutable_aggregate_value() {
+  set_has_aggregate_value();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.aggregate_value)
+  return aggregate_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* UninterpretedOption::release_aggregate_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.aggregate_value)
+  clear_has_aggregate_value();
+  return aggregate_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void UninterpretedOption::set_allocated_aggregate_value(::std::string* aggregate_value) {
+  if (aggregate_value != NULL) {
+    set_has_aggregate_value();
+  } else {
+    clear_has_aggregate_value();
+  }
+  aggregate_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), aggregate_value);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.aggregate_value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void SourceCodeInfo_Location::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int SourceCodeInfo_Location::kPathFieldNumber;
 const int SourceCodeInfo_Location::kSpanFieldNumber;
@@ -12638,49 +13347,27 @@
 
 SourceCodeInfo_Location::SourceCodeInfo_Location()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.SourceCodeInfo.Location)
 }
-SourceCodeInfo_Location::SourceCodeInfo_Location(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  path_(arena),
-  span_(arena),
-  leading_detached_comments_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.SourceCodeInfo.Location)
+
+void SourceCodeInfo_Location::InitAsDefaultInstance() {
 }
+
 SourceCodeInfo_Location::SourceCodeInfo_Location(const SourceCodeInfo_Location& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      path_(from.path_),
-      span_(from.span_),
-      leading_detached_comments_(from.leading_detached_comments_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  leading_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_leading_comments()) {
-    leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.leading_comments(),
-      GetArenaNoVirtual());
-  }
-  trailing_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_trailing_comments()) {
-    trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.trailing_comments(),
-      GetArenaNoVirtual());
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo.Location)
 }
 
 void SourceCodeInfo_Location::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   leading_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   trailing_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 SourceCodeInfo_Location::~SourceCodeInfo_Location() {
@@ -12689,58 +13376,54 @@
 }
 
 void SourceCodeInfo_Location::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   leading_comments_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   trailing_comments_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void SourceCodeInfo_Location::ArenaDtor(void* object) {
-  SourceCodeInfo_Location* _this = reinterpret_cast< SourceCodeInfo_Location* >(object);
-  (void)_this;
-}
-void SourceCodeInfo_Location::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void SourceCodeInfo_Location::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* SourceCodeInfo_Location::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return SourceCodeInfo_Location_descriptor_;
 }
 
 const SourceCodeInfo_Location& SourceCodeInfo_Location::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+SourceCodeInfo_Location* SourceCodeInfo_Location::default_instance_ = NULL;
+
 SourceCodeInfo_Location* SourceCodeInfo_Location::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<SourceCodeInfo_Location>(arena);
+  SourceCodeInfo_Location* n = new SourceCodeInfo_Location;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void SourceCodeInfo_Location::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.SourceCodeInfo.Location)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
+  if (_has_bits_[0 / 32] & 12u) {
+    if (has_leading_comments()) {
+      leading_comments_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+    if (has_trailing_comments()) {
+      trailing_comments_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+  }
   path_.Clear();
   span_.Clear();
   leading_detached_comments_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      GOOGLE_DCHECK(!leading_comments_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      leading_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
-    if (cached_has_bits & 0x00000002u) {
-      GOOGLE_DCHECK(!trailing_comments_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-      trailing_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-    }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
   }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool SourceCodeInfo_Location::MergePartialFromCodedStream(
@@ -12749,104 +13432,107 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.SourceCodeInfo.Location)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated int32 path = 1 [packed = true];
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, this->mutable_path())));
-        } else if (
-            static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
+        } else if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 1, 10u, input, this->mutable_path())));
+                 1, 10, input, this->mutable_path())));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_span;
         break;
       }
 
       // repeated int32 span = 2 [packed = true];
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_span:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, this->mutable_span())));
-        } else if (
-            static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
+        } else if (tag == 16) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 1, 18u, input, this->mutable_span())));
+                 1, 18, input, this->mutable_span())));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_leading_comments;
         break;
       }
 
       // optional string leading_comments = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
+        if (tag == 26) {
+         parse_leading_comments:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_leading_comments()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->leading_comments().data(), static_cast<int>(this->leading_comments().length()),
+            this->leading_comments().data(), this->leading_comments().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.SourceCodeInfo.Location.leading_comments");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(34)) goto parse_trailing_comments;
         break;
       }
 
       // optional string trailing_comments = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
+        if (tag == 34) {
+         parse_trailing_comments:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_trailing_comments()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->trailing_comments().data(), static_cast<int>(this->trailing_comments().length()),
+            this->trailing_comments().data(), this->trailing_comments().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.SourceCodeInfo.Location.trailing_comments");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_leading_detached_comments;
         break;
       }
 
       // repeated string leading_detached_comments = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
+        if (tag == 50) {
+         parse_leading_detached_comments:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->add_leading_detached_comments()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
             this->leading_detached_comments(this->leading_detached_comments_size() - 1).data(),
-            static_cast<int>(this->leading_detached_comments(this->leading_detached_comments_size() - 1).length()),
+            this->leading_detached_comments(this->leading_detached_comments_size() - 1).length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.SourceCodeInfo.Location.leading_detached_comments");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_leading_detached_comments;
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -12863,16 +13549,12 @@
 void SourceCodeInfo_Location::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.SourceCodeInfo.Location)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated int32 path = 1 [packed = true];
   if (this->path_size() > 0) {
     ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
-    output->WriteVarint32(static_cast< ::google::protobuf::uint32>(
-        _path_cached_byte_size_));
+    output->WriteVarint32(_path_cached_byte_size_);
   }
-  for (int i = 0, n = this->path_size(); i < n; i++) {
+  for (int i = 0; i < this->path_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag(
       this->path(i), output);
   }
@@ -12880,19 +13562,17 @@
   // repeated int32 span = 2 [packed = true];
   if (this->span_size() > 0) {
     ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
-    output->WriteVarint32(static_cast< ::google::protobuf::uint32>(
-        _span_cached_byte_size_));
+    output->WriteVarint32(_span_cached_byte_size_);
   }
-  for (int i = 0, n = this->span_size(); i < n; i++) {
+  for (int i = 0; i < this->span_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag(
       this->span(i), output);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string leading_comments = 3;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_leading_comments()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->leading_comments().data(), static_cast<int>(this->leading_comments().length()),
+      this->leading_comments().data(), this->leading_comments().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.SourceCodeInfo.Location.leading_comments");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -12900,9 +13580,9 @@
   }
 
   // optional string trailing_comments = 4;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_trailing_comments()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->trailing_comments().data(), static_cast<int>(this->trailing_comments().length()),
+      this->trailing_comments().data(), this->trailing_comments().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.SourceCodeInfo.Location.trailing_comments");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -12910,9 +13590,9 @@
   }
 
   // repeated string leading_detached_comments = 6;
-  for (int i = 0, n = this->leading_detached_comments_size(); i < n; i++) {
+  for (int i = 0; i < this->leading_detached_comments_size(); i++) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->leading_detached_comments(i).data(), static_cast<int>(this->leading_detached_comments(i).length()),
+      this->leading_detached_comments(i).data(), this->leading_detached_comments(i).length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.SourceCodeInfo.Location.leading_detached_comments");
     ::google::protobuf::internal::WireFormatLite::WriteString(
@@ -12921,18 +13601,14 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.SourceCodeInfo.Location)
 }
 
-::google::protobuf::uint8* SourceCodeInfo_Location::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* SourceCodeInfo_Location::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo.Location)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated int32 path = 1 [packed = true];
   if (this->path_size() > 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(
@@ -12940,10 +13616,11 @@
       ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
       target);
     target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(
-        static_cast< ::google::protobuf::int32>(
-            _path_cached_byte_size_), target);
+      _path_cached_byte_size_, target);
+  }
+  for (int i = 0; i < this->path_size(); i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      WriteInt32NoTagToArray(this->path_, target);
+      WriteInt32NoTagToArray(this->path(i), target);
   }
 
   // repeated int32 span = 2 [packed = true];
@@ -12953,17 +13630,17 @@
       ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
       target);
     target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(
-        static_cast< ::google::protobuf::int32>(
-            _span_cached_byte_size_), target);
+      _span_cached_byte_size_, target);
+  }
+  for (int i = 0; i < this->span_size(); i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      WriteInt32NoTagToArray(this->span_, target);
+      WriteInt32NoTagToArray(this->span(i), target);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string leading_comments = 3;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_leading_comments()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->leading_comments().data(), static_cast<int>(this->leading_comments().length()),
+      this->leading_comments().data(), this->leading_comments().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.SourceCodeInfo.Location.leading_comments");
     target =
@@ -12972,9 +13649,9 @@
   }
 
   // optional string trailing_comments = 4;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_trailing_comments()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->trailing_comments().data(), static_cast<int>(this->trailing_comments().length()),
+      this->trailing_comments().data(), this->trailing_comments().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.SourceCodeInfo.Location.trailing_comments");
     target =
@@ -12983,9 +13660,9 @@
   }
 
   // repeated string leading_detached_comments = 6;
-  for (int i = 0, n = this->leading_detached_comments_size(); i < n; i++) {
+  for (int i = 0; i < this->leading_detached_comments_size(); i++) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->leading_detached_comments(i).data(), static_cast<int>(this->leading_detached_comments(i).length()),
+      this->leading_detached_comments(i).data(), this->leading_detached_comments(i).length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.SourceCodeInfo.Location.leading_detached_comments");
     target = ::google::protobuf::internal::WireFormatLite::
@@ -12994,62 +13671,17 @@
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo.Location)
   return target;
 }
 
-size_t SourceCodeInfo_Location::ByteSizeLong() const {
+int SourceCodeInfo_Location::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceCodeInfo.Location)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated int32 path = 1 [packed = true];
-  {
-    size_t data_size = ::google::protobuf::internal::WireFormatLite::
-      Int32Size(this->path_);
-    if (data_size > 0) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-            static_cast< ::google::protobuf::int32>(data_size));
-    }
-    int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);
-    GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-    _path_cached_byte_size_ = cached_size;
-    GOOGLE_SAFE_CONCURRENT_WRITES_END();
-    total_size += data_size;
-  }
-
-  // repeated int32 span = 2 [packed = true];
-  {
-    size_t data_size = ::google::protobuf::internal::WireFormatLite::
-      Int32Size(this->span_);
-    if (data_size > 0) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-            static_cast< ::google::protobuf::int32>(data_size));
-    }
-    int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);
-    GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-    _span_cached_byte_size_ = cached_size;
-    GOOGLE_SAFE_CONCURRENT_WRITES_END();
-    total_size += data_size;
-  }
-
-  // repeated string leading_detached_comments = 6;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->leading_detached_comments_size());
-  for (int i = 0, n = this->leading_detached_comments_size(); i < n; i++) {
-    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
-      this->leading_detached_comments(i));
-  }
-
-  if (_has_bits_[0 / 32] & 3u) {
+  if (_has_bits_[2 / 32] & 12u) {
     // optional string leading_comments = 3;
     if (has_leading_comments()) {
       total_size += 1 +
@@ -13065,17 +13697,62 @@
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated int32 path = 1 [packed = true];
+  {
+    int data_size = 0;
+    for (int i = 0; i < this->path_size(); i++) {
+      data_size += ::google::protobuf::internal::WireFormatLite::
+        Int32Size(this->path(i));
+    }
+    if (data_size > 0) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);
+    }
+    GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+    _path_cached_byte_size_ = data_size;
+    GOOGLE_SAFE_CONCURRENT_WRITES_END();
+    total_size += data_size;
+  }
+
+  // repeated int32 span = 2 [packed = true];
+  {
+    int data_size = 0;
+    for (int i = 0; i < this->span_size(); i++) {
+      data_size += ::google::protobuf::internal::WireFormatLite::
+        Int32Size(this->span(i));
+    }
+    if (data_size > 0) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);
+    }
+    GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+    _span_cached_byte_size_ = data_size;
+    GOOGLE_SAFE_CONCURRENT_WRITES_END();
+    total_size += data_size;
+  }
+
+  // repeated string leading_detached_comments = 6;
+  total_size += 1 * this->leading_detached_comments_size();
+  for (int i = 0; i < this->leading_detached_comments_size(); i++) {
+    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
+      this->leading_detached_comments(i));
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void SourceCodeInfo_Location::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.SourceCodeInfo.Location)
-  GOOGLE_DCHECK_NE(&from, this);
-  const SourceCodeInfo_Location* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const SourceCodeInfo_Location* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const SourceCodeInfo_Location>(
           &from);
   if (source == NULL) {
@@ -13089,23 +13766,23 @@
 
 void SourceCodeInfo_Location::MergeFrom(const SourceCodeInfo_Location& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceCodeInfo.Location)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   path_.MergeFrom(from.path_);
   span_.MergeFrom(from.span_);
   leading_detached_comments_.MergeFrom(from.leading_detached_comments_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 3u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_leading_comments(from.leading_comments());
+  if (from._has_bits_[2 / 32] & (0xffu << (2 % 32))) {
+    if (from.has_leading_comments()) {
+      set_has_leading_comments();
+      leading_comments_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.leading_comments_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      set_trailing_comments(from.trailing_comments());
+    if (from.has_trailing_comments()) {
+      set_has_trailing_comments();
+      trailing_comments_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.trailing_comments_);
     }
   }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
 }
 
 void SourceCodeInfo_Location::CopyFrom(const ::google::protobuf::Message& from) {
@@ -13123,83 +13800,60 @@
 }
 
 bool SourceCodeInfo_Location::IsInitialized() const {
+
   return true;
 }
 
 void SourceCodeInfo_Location::Swap(SourceCodeInfo_Location* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    SourceCodeInfo_Location* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void SourceCodeInfo_Location::UnsafeArenaSwap(SourceCodeInfo_Location* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void SourceCodeInfo_Location::InternalSwap(SourceCodeInfo_Location* other) {
-  using std::swap;
-  path_.InternalSwap(&other->path_);
-  span_.InternalSwap(&other->span_);
-  leading_detached_comments_.InternalSwap(&other->leading_detached_comments_);
+  path_.UnsafeArenaSwap(&other->path_);
+  span_.UnsafeArenaSwap(&other->span_);
   leading_comments_.Swap(&other->leading_comments_);
   trailing_comments_.Swap(&other->trailing_comments_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  leading_detached_comments_.UnsafeArenaSwap(&other->leading_detached_comments_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata SourceCodeInfo_Location::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = SourceCodeInfo_Location_descriptor_;
+  metadata.reflection = SourceCodeInfo_Location_reflection_;
+  return metadata;
 }
 
 
-// ===================================================================
+// -------------------------------------------------------------------
 
-void SourceCodeInfo::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int SourceCodeInfo::kLocationFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 SourceCodeInfo::SourceCodeInfo()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.SourceCodeInfo)
 }
-SourceCodeInfo::SourceCodeInfo(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  location_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.SourceCodeInfo)
+
+void SourceCodeInfo::InitAsDefaultInstance() {
 }
+
 SourceCodeInfo::SourceCodeInfo(const SourceCodeInfo& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      location_(from.location_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo)
 }
 
 void SourceCodeInfo::SharedCtor() {
   _cached_size_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 SourceCodeInfo::~SourceCodeInfo() {
@@ -13208,43 +13862,42 @@
 }
 
 void SourceCodeInfo::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void SourceCodeInfo::ArenaDtor(void* object) {
-  SourceCodeInfo* _this = reinterpret_cast< SourceCodeInfo* >(object);
-  (void)_this;
-}
-void SourceCodeInfo::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void SourceCodeInfo::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* SourceCodeInfo::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return SourceCodeInfo_descriptor_;
 }
 
 const SourceCodeInfo& SourceCodeInfo::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+SourceCodeInfo* SourceCodeInfo::default_instance_ = NULL;
+
 SourceCodeInfo* SourceCodeInfo::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<SourceCodeInfo>(arena);
+  SourceCodeInfo* n = new SourceCodeInfo;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void SourceCodeInfo::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.SourceCodeInfo)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   location_.Clear();
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool SourceCodeInfo::MergePartialFromCodedStream(
@@ -13253,28 +13906,35 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.SourceCodeInfo)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_location()));
+        if (tag == 10) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_location:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_location()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(10)) goto parse_loop_location;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -13291,77 +13951,64 @@
 void SourceCodeInfo::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.SourceCodeInfo)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->location_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->location_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      1, this->location(static_cast<int>(i)), output);
+      1, this->location(i), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.SourceCodeInfo)
 }
 
-::google::protobuf::uint8* SourceCodeInfo::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* SourceCodeInfo::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->location_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->location_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        1, this->location(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        1, this->location(i), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo)
   return target;
 }
 
-size_t SourceCodeInfo::ByteSizeLong() const {
+int SourceCodeInfo::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceCodeInfo)
-  size_t total_size = 0;
+  int total_size = 0;
+
+  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
+  total_size += 1 * this->location_size();
+  for (int i = 0; i < this->location_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->location(i));
+  }
 
   if (_internal_metadata_.have_unknown_fields()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
+        unknown_fields());
   }
-  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
-  {
-    unsigned int count = static_cast<unsigned int>(this->location_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->location(static_cast<int>(i)));
-    }
-  }
-
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void SourceCodeInfo::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.SourceCodeInfo)
-  GOOGLE_DCHECK_NE(&from, this);
-  const SourceCodeInfo* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const SourceCodeInfo* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const SourceCodeInfo>(
           &from);
   if (source == NULL) {
@@ -13375,12 +14022,11 @@
 
 void SourceCodeInfo::MergeFrom(const SourceCodeInfo& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceCodeInfo)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   location_.MergeFrom(from.location_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
 }
 
 void SourceCodeInfo::CopyFrom(const ::google::protobuf::Message& from) {
@@ -13398,46 +14044,293 @@
 }
 
 bool SourceCodeInfo::IsInitialized() const {
+
   return true;
 }
 
 void SourceCodeInfo::Swap(SourceCodeInfo* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    SourceCodeInfo* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void SourceCodeInfo::UnsafeArenaSwap(SourceCodeInfo* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void SourceCodeInfo::InternalSwap(SourceCodeInfo* other) {
-  using std::swap;
-  location_.InternalSwap(&other->location_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  location_.UnsafeArenaSwap(&other->location_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata SourceCodeInfo::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = SourceCodeInfo_descriptor_;
+  metadata.reflection = SourceCodeInfo_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// SourceCodeInfo_Location
+
+// repeated int32 path = 1 [packed = true];
+int SourceCodeInfo_Location::path_size() const {
+  return path_.size();
+}
+void SourceCodeInfo_Location::clear_path() {
+  path_.Clear();
+}
+ ::google::protobuf::int32 SourceCodeInfo_Location::path(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.path)
+  return path_.Get(index);
+}
+ void SourceCodeInfo_Location::set_path(int index, ::google::protobuf::int32 value) {
+  path_.Set(index, value);
+  // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.path)
+}
+ void SourceCodeInfo_Location::add_path(::google::protobuf::int32 value) {
+  path_.Add(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.path)
+}
+ const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+SourceCodeInfo_Location::path() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.path)
+  return path_;
+}
+ ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+SourceCodeInfo_Location::mutable_path() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.path)
+  return &path_;
+}
+
+// repeated int32 span = 2 [packed = true];
+int SourceCodeInfo_Location::span_size() const {
+  return span_.size();
+}
+void SourceCodeInfo_Location::clear_span() {
+  span_.Clear();
+}
+ ::google::protobuf::int32 SourceCodeInfo_Location::span(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.span)
+  return span_.Get(index);
+}
+ void SourceCodeInfo_Location::set_span(int index, ::google::protobuf::int32 value) {
+  span_.Set(index, value);
+  // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.span)
+}
+ void SourceCodeInfo_Location::add_span(::google::protobuf::int32 value) {
+  span_.Add(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.span)
+}
+ const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+SourceCodeInfo_Location::span() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.span)
+  return span_;
+}
+ ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+SourceCodeInfo_Location::mutable_span() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.span)
+  return &span_;
+}
+
+// optional string leading_comments = 3;
+bool SourceCodeInfo_Location::has_leading_comments() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void SourceCodeInfo_Location::set_has_leading_comments() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void SourceCodeInfo_Location::clear_has_leading_comments() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void SourceCodeInfo_Location::clear_leading_comments() {
+  leading_comments_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_leading_comments();
+}
+ const ::std::string& SourceCodeInfo_Location::leading_comments() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.leading_comments)
+  return leading_comments_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void SourceCodeInfo_Location::set_leading_comments(const ::std::string& value) {
+  set_has_leading_comments();
+  leading_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_comments)
+}
+ void SourceCodeInfo_Location::set_leading_comments(const char* value) {
+  set_has_leading_comments();
+  leading_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_comments)
+}
+ void SourceCodeInfo_Location::set_leading_comments(const char* value, size_t size) {
+  set_has_leading_comments();
+  leading_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.leading_comments)
+}
+ ::std::string* SourceCodeInfo_Location::mutable_leading_comments() {
+  set_has_leading_comments();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.leading_comments)
+  return leading_comments_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* SourceCodeInfo_Location::release_leading_comments() {
+  // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.leading_comments)
+  clear_has_leading_comments();
+  return leading_comments_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void SourceCodeInfo_Location::set_allocated_leading_comments(::std::string* leading_comments) {
+  if (leading_comments != NULL) {
+    set_has_leading_comments();
+  } else {
+    clear_has_leading_comments();
+  }
+  leading_comments_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), leading_comments);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.leading_comments)
+}
+
+// optional string trailing_comments = 4;
+bool SourceCodeInfo_Location::has_trailing_comments() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void SourceCodeInfo_Location::set_has_trailing_comments() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void SourceCodeInfo_Location::clear_has_trailing_comments() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void SourceCodeInfo_Location::clear_trailing_comments() {
+  trailing_comments_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_trailing_comments();
+}
+ const ::std::string& SourceCodeInfo_Location::trailing_comments() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+  return trailing_comments_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void SourceCodeInfo_Location::set_trailing_comments(const ::std::string& value) {
+  set_has_trailing_comments();
+  trailing_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+}
+ void SourceCodeInfo_Location::set_trailing_comments(const char* value) {
+  set_has_trailing_comments();
+  trailing_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+}
+ void SourceCodeInfo_Location::set_trailing_comments(const char* value, size_t size) {
+  set_has_trailing_comments();
+  trailing_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+}
+ ::std::string* SourceCodeInfo_Location::mutable_trailing_comments() {
+  set_has_trailing_comments();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+  return trailing_comments_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* SourceCodeInfo_Location::release_trailing_comments() {
+  // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+  clear_has_trailing_comments();
+  return trailing_comments_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void SourceCodeInfo_Location::set_allocated_trailing_comments(::std::string* trailing_comments) {
+  if (trailing_comments != NULL) {
+    set_has_trailing_comments();
+  } else {
+    clear_has_trailing_comments();
+  }
+  trailing_comments_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), trailing_comments);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.trailing_comments)
+}
+
+// repeated string leading_detached_comments = 6;
+int SourceCodeInfo_Location::leading_detached_comments_size() const {
+  return leading_detached_comments_.size();
+}
+void SourceCodeInfo_Location::clear_leading_detached_comments() {
+  leading_detached_comments_.Clear();
+}
+ const ::std::string& SourceCodeInfo_Location::leading_detached_comments(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+  return leading_detached_comments_.Get(index);
+}
+ ::std::string* SourceCodeInfo_Location::mutable_leading_detached_comments(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+  return leading_detached_comments_.Mutable(index);
+}
+ void SourceCodeInfo_Location::set_leading_detached_comments(int index, const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+  leading_detached_comments_.Mutable(index)->assign(value);
+}
+ void SourceCodeInfo_Location::set_leading_detached_comments(int index, const char* value) {
+  leading_detached_comments_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+}
+ void SourceCodeInfo_Location::set_leading_detached_comments(int index, const char* value, size_t size) {
+  leading_detached_comments_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+}
+ ::std::string* SourceCodeInfo_Location::add_leading_detached_comments() {
+  // @@protoc_insertion_point(field_add_mutable:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+  return leading_detached_comments_.Add();
+}
+ void SourceCodeInfo_Location::add_leading_detached_comments(const ::std::string& value) {
+  leading_detached_comments_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+}
+ void SourceCodeInfo_Location::add_leading_detached_comments(const char* value) {
+  leading_detached_comments_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+}
+ void SourceCodeInfo_Location::add_leading_detached_comments(const char* value, size_t size) {
+  leading_detached_comments_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+}
+ const ::google::protobuf::RepeatedPtrField< ::std::string>&
+SourceCodeInfo_Location::leading_detached_comments() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+  return leading_detached_comments_;
+}
+ ::google::protobuf::RepeatedPtrField< ::std::string>*
+SourceCodeInfo_Location::mutable_leading_detached_comments() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
+  return &leading_detached_comments_;
+}
+
+// -------------------------------------------------------------------
+
+// SourceCodeInfo
+
+// repeated .google.protobuf.SourceCodeInfo.Location location = 1;
+int SourceCodeInfo::location_size() const {
+  return location_.size();
+}
+void SourceCodeInfo::clear_location() {
+  location_.Clear();
+}
+const ::google::protobuf::SourceCodeInfo_Location& SourceCodeInfo::location(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.location)
+  return location_.Get(index);
+}
+::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::mutable_location(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.location)
+  return location_.Mutable(index);
+}
+::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::add_location() {
+  // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.location)
+  return location_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >*
+SourceCodeInfo::mutable_location() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.location)
+  return &location_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >&
+SourceCodeInfo::location() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.location)
+  return location_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void GeneratedCodeInfo_Annotation::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int GeneratedCodeInfo_Annotation::kPathFieldNumber;
 const int GeneratedCodeInfo_Annotation::kSourceFileFieldNumber;
@@ -13447,45 +14340,28 @@
 
 GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.GeneratedCodeInfo.Annotation)
 }
-GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  path_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.GeneratedCodeInfo.Annotation)
+
+void GeneratedCodeInfo_Annotation::InitAsDefaultInstance() {
 }
+
 GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(const GeneratedCodeInfo_Annotation& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      path_(from.path_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  source_file_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.has_source_file()) {
-    source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.source_file(),
-      GetArenaNoVirtual());
-  }
-  ::memcpy(&begin_, &from.begin_,
-    static_cast<size_t>(reinterpret_cast<char*>(&end_) -
-    reinterpret_cast<char*>(&begin_)) + sizeof(end_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo.Annotation)
 }
 
 void GeneratedCodeInfo_Annotation::SharedCtor() {
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
   source_file_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&begin_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&end_) -
-      reinterpret_cast<char*>(&begin_)) + sizeof(end_));
+  begin_ = 0;
+  end_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 GeneratedCodeInfo_Annotation::~GeneratedCodeInfo_Annotation() {
@@ -13494,54 +14370,69 @@
 }
 
 void GeneratedCodeInfo_Annotation::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   source_file_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void GeneratedCodeInfo_Annotation::ArenaDtor(void* object) {
-  GeneratedCodeInfo_Annotation* _this = reinterpret_cast< GeneratedCodeInfo_Annotation* >(object);
-  (void)_this;
-}
-void GeneratedCodeInfo_Annotation::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void GeneratedCodeInfo_Annotation::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* GeneratedCodeInfo_Annotation::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return GeneratedCodeInfo_Annotation_descriptor_;
 }
 
 const GeneratedCodeInfo_Annotation& GeneratedCodeInfo_Annotation::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+GeneratedCodeInfo_Annotation* GeneratedCodeInfo_Annotation::default_instance_ = NULL;
+
 GeneratedCodeInfo_Annotation* GeneratedCodeInfo_Annotation::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<GeneratedCodeInfo_Annotation>(arena);
+  GeneratedCodeInfo_Annotation* n = new GeneratedCodeInfo_Annotation;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void GeneratedCodeInfo_Annotation::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.GeneratedCodeInfo.Annotation)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(GeneratedCodeInfo_Annotation, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<GeneratedCodeInfo_Annotation*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&(first), 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  if (_has_bits_[0 / 32] & 14u) {
+    ZR_(begin_, end_);
+    if (has_source_file()) {
+      source_file_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    }
+  }
+
+#undef ZR_HELPER_
+#undef ZR_
 
   path_.Clear();
-  cached_has_bits = _has_bits_[0];
-  if (cached_has_bits & 0x00000001u) {
-    GOOGLE_DCHECK(!source_file_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()));
-    source_file_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
   }
-  if (cached_has_bits & 6u) {
-    ::memset(&begin_, 0, static_cast<size_t>(
-        reinterpret_cast<char*>(&end_) -
-        reinterpret_cast<char*>(&begin_)) + sizeof(end_));
-  }
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool GeneratedCodeInfo_Annotation::MergePartialFromCodedStream(
@@ -13550,80 +14441,83 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.GeneratedCodeInfo.Annotation)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated int32 path = 1 [packed = true];
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, this->mutable_path())));
-        } else if (
-            static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
+        } else if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
-                 1, 10u, input, this->mutable_path())));
+                 1, 10, input, this->mutable_path())));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_source_file;
         break;
       }
 
       // optional string source_file = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
+        if (tag == 18) {
+         parse_source_file:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_source_file()));
           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-            this->source_file().data(), static_cast<int>(this->source_file().length()),
+            this->source_file().data(), this->source_file().length(),
             ::google::protobuf::internal::WireFormat::PARSE,
             "google.protobuf.GeneratedCodeInfo.Annotation.source_file");
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_begin;
         break;
       }
 
       // optional int32 begin = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-          set_has_begin();
+        if (tag == 24) {
+         parse_begin:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &begin_)));
+          set_has_begin();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(32)) goto parse_end;
         break;
       }
 
       // optional int32 end = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) {
-          set_has_end();
+        if (tag == 32) {
+         parse_end:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &end_)));
+          set_has_end();
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -13640,25 +14534,20 @@
 void GeneratedCodeInfo_Annotation::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.GeneratedCodeInfo.Annotation)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated int32 path = 1 [packed = true];
   if (this->path_size() > 0) {
     ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
-    output->WriteVarint32(static_cast< ::google::protobuf::uint32>(
-        _path_cached_byte_size_));
+    output->WriteVarint32(_path_cached_byte_size_);
   }
-  for (int i = 0, n = this->path_size(); i < n; i++) {
+  for (int i = 0; i < this->path_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag(
       this->path(i), output);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string source_file = 2;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_source_file()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->source_file().data(), static_cast<int>(this->source_file().length()),
+      this->source_file().data(), this->source_file().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.GeneratedCodeInfo.Annotation.source_file");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -13666,29 +14555,25 @@
   }
 
   // optional int32 begin = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_begin()) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->begin(), output);
   }
 
   // optional int32 end = 4;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_end()) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->end(), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.GeneratedCodeInfo.Annotation)
 }
 
-::google::protobuf::uint8* GeneratedCodeInfo_Annotation::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* GeneratedCodeInfo_Annotation::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo.Annotation)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated int32 path = 1 [packed = true];
   if (this->path_size() > 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(
@@ -13696,17 +14581,17 @@
       ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
       target);
     target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(
-        static_cast< ::google::protobuf::int32>(
-            _path_cached_byte_size_), target);
+      _path_cached_byte_size_, target);
+  }
+  for (int i = 0; i < this->path_size(); i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      WriteInt32NoTagToArray(this->path_, target);
+      WriteInt32NoTagToArray(this->path(i), target);
   }
 
-  cached_has_bits = _has_bits_[0];
   // optional string source_file = 2;
-  if (cached_has_bits & 0x00000001u) {
+  if (has_source_file()) {
     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
-      this->source_file().data(), static_cast<int>(this->source_file().length()),
+      this->source_file().data(), this->source_file().length(),
       ::google::protobuf::internal::WireFormat::SERIALIZE,
       "google.protobuf.GeneratedCodeInfo.Annotation.source_file");
     target =
@@ -13715,49 +14600,28 @@
   }
 
   // optional int32 begin = 3;
-  if (cached_has_bits & 0x00000002u) {
+  if (has_begin()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->begin(), target);
   }
 
   // optional int32 end = 4;
-  if (cached_has_bits & 0x00000004u) {
+  if (has_end()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(4, this->end(), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.GeneratedCodeInfo.Annotation)
   return target;
 }
 
-size_t GeneratedCodeInfo_Annotation::ByteSizeLong() const {
+int GeneratedCodeInfo_Annotation::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.GeneratedCodeInfo.Annotation)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if (_internal_metadata_.have_unknown_fields()) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
-  }
-  // repeated int32 path = 1 [packed = true];
-  {
-    size_t data_size = ::google::protobuf::internal::WireFormatLite::
-      Int32Size(this->path_);
-    if (data_size > 0) {
-      total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::Int32Size(
-            static_cast< ::google::protobuf::int32>(data_size));
-    }
-    int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);
-    GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-    _path_cached_byte_size_ = cached_size;
-    GOOGLE_SAFE_CONCURRENT_WRITES_END();
-    total_size += data_size;
-  }
-
-  if (_has_bits_[0 / 32] & 7u) {
+  if (_has_bits_[1 / 32] & 14u) {
     // optional string source_file = 2;
     if (has_source_file()) {
       total_size += 1 +
@@ -13780,17 +14644,38 @@
     }
 
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated int32 path = 1 [packed = true];
+  {
+    int data_size = 0;
+    for (int i = 0; i < this->path_size(); i++) {
+      data_size += ::google::protobuf::internal::WireFormatLite::
+        Int32Size(this->path(i));
+    }
+    if (data_size > 0) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);
+    }
+    GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+    _path_cached_byte_size_ = data_size;
+    GOOGLE_SAFE_CONCURRENT_WRITES_END();
+    total_size += data_size;
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void GeneratedCodeInfo_Annotation::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.GeneratedCodeInfo.Annotation)
-  GOOGLE_DCHECK_NE(&from, this);
-  const GeneratedCodeInfo_Annotation* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const GeneratedCodeInfo_Annotation* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const GeneratedCodeInfo_Annotation>(
           &from);
   if (source == NULL) {
@@ -13804,24 +14689,22 @@
 
 void GeneratedCodeInfo_Annotation::MergeFrom(const GeneratedCodeInfo_Annotation& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.GeneratedCodeInfo.Annotation)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   path_.MergeFrom(from.path_);
-  cached_has_bits = from._has_bits_[0];
-  if (cached_has_bits & 7u) {
-    if (cached_has_bits & 0x00000001u) {
-      set_source_file(from.source_file());
+  if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) {
+    if (from.has_source_file()) {
+      set_has_source_file();
+      source_file_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.source_file_);
     }
-    if (cached_has_bits & 0x00000002u) {
-      begin_ = from.begin_;
+    if (from.has_begin()) {
+      set_begin(from.begin());
     }
-    if (cached_has_bits & 0x00000004u) {
-      end_ = from.end_;
+    if (from.has_end()) {
+      set_end(from.end());
     }
-    _has_bits_[0] |= cached_has_bits;
+  }
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
   }
 }
 
@@ -13840,82 +14723,59 @@
 }
 
 bool GeneratedCodeInfo_Annotation::IsInitialized() const {
+
   return true;
 }
 
 void GeneratedCodeInfo_Annotation::Swap(GeneratedCodeInfo_Annotation* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    GeneratedCodeInfo_Annotation* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void GeneratedCodeInfo_Annotation::UnsafeArenaSwap(GeneratedCodeInfo_Annotation* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void GeneratedCodeInfo_Annotation::InternalSwap(GeneratedCodeInfo_Annotation* other) {
-  using std::swap;
-  path_.InternalSwap(&other->path_);
+  path_.UnsafeArenaSwap(&other->path_);
   source_file_.Swap(&other->source_file_);
-  swap(begin_, other->begin_);
-  swap(end_, other->end_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  std::swap(begin_, other->begin_);
+  std::swap(end_, other->end_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata GeneratedCodeInfo_Annotation::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = GeneratedCodeInfo_Annotation_descriptor_;
+  metadata.reflection = GeneratedCodeInfo_Annotation_reflection_;
+  return metadata;
 }
 
 
-// ===================================================================
+// -------------------------------------------------------------------
 
-void GeneratedCodeInfo::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int GeneratedCodeInfo::kAnnotationFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 GeneratedCodeInfo::GeneratedCodeInfo()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.GeneratedCodeInfo)
 }
-GeneratedCodeInfo::GeneratedCodeInfo(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  annotation_(arena) {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.GeneratedCodeInfo)
+
+void GeneratedCodeInfo::InitAsDefaultInstance() {
 }
+
 GeneratedCodeInfo::GeneratedCodeInfo(const GeneratedCodeInfo& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _has_bits_(from._has_bits_),
-      _cached_size_(0),
-      annotation_(from.annotation_) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo)
 }
 
 void GeneratedCodeInfo::SharedCtor() {
   _cached_size_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
 GeneratedCodeInfo::~GeneratedCodeInfo() {
@@ -13924,43 +14784,42 @@
 }
 
 void GeneratedCodeInfo::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void GeneratedCodeInfo::ArenaDtor(void* object) {
-  GeneratedCodeInfo* _this = reinterpret_cast< GeneratedCodeInfo* >(object);
-  (void)_this;
-}
-void GeneratedCodeInfo::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void GeneratedCodeInfo::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* GeneratedCodeInfo::descriptor() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return GeneratedCodeInfo_descriptor_;
 }
 
 const GeneratedCodeInfo& GeneratedCodeInfo::default_instance() {
-  ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  return *default_instance_;
 }
 
+GeneratedCodeInfo* GeneratedCodeInfo::default_instance_ = NULL;
+
 GeneratedCodeInfo* GeneratedCodeInfo::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<GeneratedCodeInfo>(arena);
+  GeneratedCodeInfo* n = new GeneratedCodeInfo;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void GeneratedCodeInfo::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.GeneratedCodeInfo)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   annotation_.Clear();
-  _has_bits_.Clear();
-  _internal_metadata_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  if (_internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->Clear();
+  }
 }
 
 bool GeneratedCodeInfo::MergePartialFromCodedStream(
@@ -13969,28 +14828,35 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.GeneratedCodeInfo)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_annotation()));
+        if (tag == 10) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_annotation:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_annotation()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(10)) goto parse_loop_annotation;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
         DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+              input, tag, mutable_unknown_fields()));
         break;
       }
     }
@@ -14007,77 +14873,64 @@
 void GeneratedCodeInfo::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.GeneratedCodeInfo)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->annotation_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->annotation_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      1, this->annotation(static_cast<int>(i)), output);
+      1, this->annotation(i), output);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        _internal_metadata_.unknown_fields(), output);
+        unknown_fields(), output);
   }
   // @@protoc_insertion_point(serialize_end:google.protobuf.GeneratedCodeInfo)
 }
 
-::google::protobuf::uint8* GeneratedCodeInfo::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* GeneratedCodeInfo::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->annotation_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->annotation_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        1, this->annotation(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        1, this->annotation(i), target);
   }
 
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields(), target);
+        unknown_fields(), target);
   }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.GeneratedCodeInfo)
   return target;
 }
 
-size_t GeneratedCodeInfo::ByteSizeLong() const {
+int GeneratedCodeInfo::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.GeneratedCodeInfo)
-  size_t total_size = 0;
+  int total_size = 0;
+
+  // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
+  total_size += 1 * this->annotation_size();
+  for (int i = 0; i < this->annotation_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->annotation(i));
+  }
 
   if (_internal_metadata_.have_unknown_fields()) {
     total_size +=
       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        _internal_metadata_.unknown_fields());
+        unknown_fields());
   }
-  // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
-  {
-    unsigned int count = static_cast<unsigned int>(this->annotation_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->annotation(static_cast<int>(i)));
-    }
-  }
-
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void GeneratedCodeInfo::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.GeneratedCodeInfo)
-  GOOGLE_DCHECK_NE(&from, this);
-  const GeneratedCodeInfo* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const GeneratedCodeInfo* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const GeneratedCodeInfo>(
           &from);
   if (source == NULL) {
@@ -14091,12 +14944,11 @@
 
 void GeneratedCodeInfo::MergeFrom(const GeneratedCodeInfo& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.GeneratedCodeInfo)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   annotation_.MergeFrom(from.annotation_);
+  if (from._internal_metadata_.have_unknown_fields()) {
+    mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+  }
 }
 
 void GeneratedCodeInfo::CopyFrom(const ::google::protobuf::Message& from) {
@@ -14114,43 +14966,202 @@
 }
 
 bool GeneratedCodeInfo::IsInitialized() const {
+
   return true;
 }
 
 void GeneratedCodeInfo::Swap(GeneratedCodeInfo* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    GeneratedCodeInfo* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void GeneratedCodeInfo::UnsafeArenaSwap(GeneratedCodeInfo* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void GeneratedCodeInfo::InternalSwap(GeneratedCodeInfo* other) {
-  using std::swap;
-  annotation_.InternalSwap(&other->annotation_);
-  swap(_has_bits_[0], other->_has_bits_[0]);
+  annotation_.UnsafeArenaSwap(&other->annotation_);
+  std::swap(_has_bits_[0], other->_has_bits_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata GeneratedCodeInfo::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = GeneratedCodeInfo_descriptor_;
+  metadata.reflection = GeneratedCodeInfo_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// GeneratedCodeInfo_Annotation
+
+// repeated int32 path = 1 [packed = true];
+int GeneratedCodeInfo_Annotation::path_size() const {
+  return path_.size();
+}
+void GeneratedCodeInfo_Annotation::clear_path() {
+  path_.Clear();
+}
+ ::google::protobuf::int32 GeneratedCodeInfo_Annotation::path(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.path)
+  return path_.Get(index);
+}
+ void GeneratedCodeInfo_Annotation::set_path(int index, ::google::protobuf::int32 value) {
+  path_.Set(index, value);
+  // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.path)
+}
+ void GeneratedCodeInfo_Annotation::add_path(::google::protobuf::int32 value) {
+  path_.Add(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.GeneratedCodeInfo.Annotation.path)
+}
+ const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+GeneratedCodeInfo_Annotation::path() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.GeneratedCodeInfo.Annotation.path)
+  return path_;
+}
+ ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+GeneratedCodeInfo_Annotation::mutable_path() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.GeneratedCodeInfo.Annotation.path)
+  return &path_;
+}
+
+// optional string source_file = 2;
+bool GeneratedCodeInfo_Annotation::has_source_file() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+void GeneratedCodeInfo_Annotation::set_has_source_file() {
+  _has_bits_[0] |= 0x00000002u;
+}
+void GeneratedCodeInfo_Annotation::clear_has_source_file() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+void GeneratedCodeInfo_Annotation::clear_source_file() {
+  source_file_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  clear_has_source_file();
+}
+ const ::std::string& GeneratedCodeInfo_Annotation::source_file() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+  return source_file_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void GeneratedCodeInfo_Annotation::set_source_file(const ::std::string& value) {
+  set_has_source_file();
+  source_file_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+}
+ void GeneratedCodeInfo_Annotation::set_source_file(const char* value) {
+  set_has_source_file();
+  source_file_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+}
+ void GeneratedCodeInfo_Annotation::set_source_file(const char* value, size_t size) {
+  set_has_source_file();
+  source_file_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+}
+ ::std::string* GeneratedCodeInfo_Annotation::mutable_source_file() {
+  set_has_source_file();
+  // @@protoc_insertion_point(field_mutable:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+  return source_file_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* GeneratedCodeInfo_Annotation::release_source_file() {
+  // @@protoc_insertion_point(field_release:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+  clear_has_source_file();
+  return source_file_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void GeneratedCodeInfo_Annotation::set_allocated_source_file(::std::string* source_file) {
+  if (source_file != NULL) {
+    set_has_source_file();
+  } else {
+    clear_has_source_file();
+  }
+  source_file_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), source_file);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
+}
+
+// optional int32 begin = 3;
+bool GeneratedCodeInfo_Annotation::has_begin() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+void GeneratedCodeInfo_Annotation::set_has_begin() {
+  _has_bits_[0] |= 0x00000004u;
+}
+void GeneratedCodeInfo_Annotation::clear_has_begin() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+void GeneratedCodeInfo_Annotation::clear_begin() {
+  begin_ = 0;
+  clear_has_begin();
+}
+ ::google::protobuf::int32 GeneratedCodeInfo_Annotation::begin() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.begin)
+  return begin_;
+}
+ void GeneratedCodeInfo_Annotation::set_begin(::google::protobuf::int32 value) {
+  set_has_begin();
+  begin_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.begin)
+}
+
+// optional int32 end = 4;
+bool GeneratedCodeInfo_Annotation::has_end() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+void GeneratedCodeInfo_Annotation::set_has_end() {
+  _has_bits_[0] |= 0x00000008u;
+}
+void GeneratedCodeInfo_Annotation::clear_has_end() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+void GeneratedCodeInfo_Annotation::clear_end() {
+  end_ = 0;
+  clear_has_end();
+}
+ ::google::protobuf::int32 GeneratedCodeInfo_Annotation::end() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.end)
+  return end_;
+}
+ void GeneratedCodeInfo_Annotation::set_end(::google::protobuf::int32 value) {
+  set_has_end();
+  end_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.end)
+}
+
+// -------------------------------------------------------------------
+
+// GeneratedCodeInfo
+
+// repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
+int GeneratedCodeInfo::annotation_size() const {
+  return annotation_.size();
+}
+void GeneratedCodeInfo::clear_annotation() {
+  annotation_.Clear();
+}
+const ::google::protobuf::GeneratedCodeInfo_Annotation& GeneratedCodeInfo::annotation(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.annotation)
+  return annotation_.Get(index);
+}
+::google::protobuf::GeneratedCodeInfo_Annotation* GeneratedCodeInfo::mutable_annotation(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.GeneratedCodeInfo.annotation)
+  return annotation_.Mutable(index);
+}
+::google::protobuf::GeneratedCodeInfo_Annotation* GeneratedCodeInfo::add_annotation() {
+  // @@protoc_insertion_point(field_add:google.protobuf.GeneratedCodeInfo.annotation)
+  return annotation_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation >*
+GeneratedCodeInfo::mutable_annotation() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.GeneratedCodeInfo.annotation)
+  return &annotation_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation >&
+GeneratedCodeInfo::annotation() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.GeneratedCodeInfo.annotation)
+  return annotation_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h
index 4ed5cac..92a0a3a 100644
--- a/src/google/protobuf/descriptor.pb.h
+++ b/src/google/protobuf/descriptor.pb.h
@@ -8,212 +8,60 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/generated_enum_reflection.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[27];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorSetImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorSet();
-void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ExtensionRangeImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ExtensionRange();
-void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ReservedRangeImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ReservedRange();
-void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsExtensionRangeOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsExtensionRangeOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsOneofDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsOneofDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProto_EnumReservedRange();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumValueDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumValueDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsServiceDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsServiceDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsMethodDescriptorProtoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsMethodDescriptorProto();
-void LIBPROTOBUF_EXPORT InitDefaultsFileOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFileOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsMessageOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsMessageOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsOneofOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsOneofOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumValueOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumValueOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsServiceOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsServiceOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsMethodOptionsImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsMethodOptions();
-void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOption_NamePartImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOption_NamePart();
-void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOptionImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOption();
-void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfo_LocationImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfo_Location();
-void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfo();
-void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfo_AnnotationImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfo_Annotation();
-void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfoImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfo();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsFileDescriptorSet();
-  InitDefaultsFileDescriptorProto();
-  InitDefaultsDescriptorProto_ExtensionRange();
-  InitDefaultsDescriptorProto_ReservedRange();
-  InitDefaultsDescriptorProto();
-  InitDefaultsExtensionRangeOptions();
-  InitDefaultsFieldDescriptorProto();
-  InitDefaultsOneofDescriptorProto();
-  InitDefaultsEnumDescriptorProto_EnumReservedRange();
-  InitDefaultsEnumDescriptorProto();
-  InitDefaultsEnumValueDescriptorProto();
-  InitDefaultsServiceDescriptorProto();
-  InitDefaultsMethodDescriptorProto();
-  InitDefaultsFileOptions();
-  InitDefaultsMessageOptions();
-  InitDefaultsFieldOptions();
-  InitDefaultsOneofOptions();
-  InitDefaultsEnumOptions();
-  InitDefaultsEnumValueOptions();
-  InitDefaultsServiceOptions();
-  InitDefaultsMethodOptions();
-  InitDefaultsUninterpretedOption_NamePart();
-  InitDefaultsUninterpretedOption();
-  InitDefaultsSourceCodeInfo_Location();
-  InitDefaultsSourceCodeInfo();
-  InitDefaultsGeneratedCodeInfo_Annotation();
-  InitDefaultsGeneratedCodeInfo();
-}
-}  // namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
 class DescriptorProto;
-class DescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern DescriptorProtoDefaultTypeInternal _DescriptorProto_default_instance_;
 class DescriptorProto_ExtensionRange;
-class DescriptorProto_ExtensionRangeDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern DescriptorProto_ExtensionRangeDefaultTypeInternal _DescriptorProto_ExtensionRange_default_instance_;
 class DescriptorProto_ReservedRange;
-class DescriptorProto_ReservedRangeDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern DescriptorProto_ReservedRangeDefaultTypeInternal _DescriptorProto_ReservedRange_default_instance_;
 class EnumDescriptorProto;
-class EnumDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumDescriptorProtoDefaultTypeInternal _EnumDescriptorProto_default_instance_;
-class EnumDescriptorProto_EnumReservedRange;
-class EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal _EnumDescriptorProto_EnumReservedRange_default_instance_;
 class EnumOptions;
-class EnumOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumOptionsDefaultTypeInternal _EnumOptions_default_instance_;
 class EnumValueDescriptorProto;
-class EnumValueDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumValueDescriptorProtoDefaultTypeInternal _EnumValueDescriptorProto_default_instance_;
 class EnumValueOptions;
-class EnumValueOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumValueOptionsDefaultTypeInternal _EnumValueOptions_default_instance_;
-class ExtensionRangeOptions;
-class ExtensionRangeOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern ExtensionRangeOptionsDefaultTypeInternal _ExtensionRangeOptions_default_instance_;
 class FieldDescriptorProto;
-class FieldDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FieldDescriptorProtoDefaultTypeInternal _FieldDescriptorProto_default_instance_;
 class FieldOptions;
-class FieldOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FieldOptionsDefaultTypeInternal _FieldOptions_default_instance_;
 class FileDescriptorProto;
-class FileDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FileDescriptorProtoDefaultTypeInternal _FileDescriptorProto_default_instance_;
 class FileDescriptorSet;
-class FileDescriptorSetDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FileDescriptorSetDefaultTypeInternal _FileDescriptorSet_default_instance_;
 class FileOptions;
-class FileOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FileOptionsDefaultTypeInternal _FileOptions_default_instance_;
 class GeneratedCodeInfo;
-class GeneratedCodeInfoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern GeneratedCodeInfoDefaultTypeInternal _GeneratedCodeInfo_default_instance_;
 class GeneratedCodeInfo_Annotation;
-class GeneratedCodeInfo_AnnotationDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern GeneratedCodeInfo_AnnotationDefaultTypeInternal _GeneratedCodeInfo_Annotation_default_instance_;
 class MessageOptions;
-class MessageOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern MessageOptionsDefaultTypeInternal _MessageOptions_default_instance_;
 class MethodDescriptorProto;
-class MethodDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern MethodDescriptorProtoDefaultTypeInternal _MethodDescriptorProto_default_instance_;
 class MethodOptions;
-class MethodOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern MethodOptionsDefaultTypeInternal _MethodOptions_default_instance_;
 class OneofDescriptorProto;
-class OneofDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern OneofDescriptorProtoDefaultTypeInternal _OneofDescriptorProto_default_instance_;
-class OneofOptions;
-class OneofOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern OneofOptionsDefaultTypeInternal _OneofOptions_default_instance_;
 class ServiceDescriptorProto;
-class ServiceDescriptorProtoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern ServiceDescriptorProtoDefaultTypeInternal _ServiceDescriptorProto_default_instance_;
 class ServiceOptions;
-class ServiceOptionsDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern ServiceOptionsDefaultTypeInternal _ServiceOptions_default_instance_;
 class SourceCodeInfo;
-class SourceCodeInfoDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern SourceCodeInfoDefaultTypeInternal _SourceCodeInfo_default_instance_;
 class SourceCodeInfo_Location;
-class SourceCodeInfo_LocationDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern SourceCodeInfo_LocationDefaultTypeInternal _SourceCodeInfo_Location_default_instance_;
 class UninterpretedOption;
-class UninterpretedOptionDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern UninterpretedOptionDefaultTypeInternal _UninterpretedOption_default_instance_;
 class UninterpretedOption_NamePart;
-class UninterpretedOption_NamePartDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern UninterpretedOption_NamePartDefaultTypeInternal _UninterpretedOption_NamePart_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 enum FieldDescriptorProto_Type {
   FieldDescriptorProto_Type_TYPE_DOUBLE = 1,
@@ -330,29 +178,9 @@
   return ::google::protobuf::internal::ParseNamedEnum<FieldOptions_JSType>(
     FieldOptions_JSType_descriptor(), name, value);
 }
-enum MethodOptions_IdempotencyLevel {
-  MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN = 0,
-  MethodOptions_IdempotencyLevel_NO_SIDE_EFFECTS = 1,
-  MethodOptions_IdempotencyLevel_IDEMPOTENT = 2
-};
-LIBPROTOBUF_EXPORT bool MethodOptions_IdempotencyLevel_IsValid(int value);
-const MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel_IdempotencyLevel_MIN = MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN;
-const MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX = MethodOptions_IdempotencyLevel_IDEMPOTENT;
-const int MethodOptions_IdempotencyLevel_IdempotencyLevel_ARRAYSIZE = MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX + 1;
-
-LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* MethodOptions_IdempotencyLevel_descriptor();
-inline const ::std::string& MethodOptions_IdempotencyLevel_Name(MethodOptions_IdempotencyLevel value) {
-  return ::google::protobuf::internal::NameOfEnum(
-    MethodOptions_IdempotencyLevel_descriptor(), value);
-}
-inline bool MethodOptions_IdempotencyLevel_Parse(
-    const ::std::string& name, MethodOptions_IdempotencyLevel* value) {
-  return ::google::protobuf::internal::ParseNamedEnum<MethodOptions_IdempotencyLevel>(
-    MethodOptions_IdempotencyLevel_descriptor(), name, value);
-}
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT FileDescriptorSet : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileDescriptorSet) */ {
+class LIBPROTOBUF_EXPORT FileDescriptorSet : public ::google::protobuf::Message {
  public:
   FileDescriptorSet();
   virtual ~FileDescriptorSet();
@@ -363,81 +191,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FileDescriptorSet(FileDescriptorSet&& from) noexcept
-    : FileDescriptorSet() {
-    *this = ::std::move(from);
-  }
 
-  inline FileDescriptorSet& operator=(FileDescriptorSet&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const FileDescriptorSet& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FileDescriptorSet* internal_default_instance() {
-    return reinterpret_cast<const FileDescriptorSet*>(
-               &_FileDescriptorSet_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
-  void UnsafeArenaSwap(FileDescriptorSet* other);
   void Swap(FileDescriptorSet* other);
-  friend void swap(FileDescriptorSet& a, FileDescriptorSet& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FileDescriptorSet* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FileDescriptorSet* New() const { return New(NULL); }
 
-  FileDescriptorSet* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FileDescriptorSet* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FileDescriptorSet& from);
   void MergeFrom(const FileDescriptorSet& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FileDescriptorSet* other);
-  protected:
-  explicit FileDescriptorSet(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -447,7 +238,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -469,18 +260,19 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > file_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSetImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static FileDescriptorSet* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT FileDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT FileDescriptorProto : public ::google::protobuf::Message {
  public:
   FileDescriptorProto();
   virtual ~FileDescriptorProto();
@@ -491,81 +283,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FileDescriptorProto(FileDescriptorProto&& from) noexcept
-    : FileDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline FileDescriptorProto& operator=(FileDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const FileDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FileDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const FileDescriptorProto*>(
-               &_FileDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    1;
-
-  void UnsafeArenaSwap(FileDescriptorProto* other);
   void Swap(FileDescriptorProto* other);
-  friend void swap(FileDescriptorProto& a, FileDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FileDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FileDescriptorProto* New() const { return New(NULL); }
 
-  FileDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FileDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FileDescriptorProto& from);
   void MergeFrom(const FileDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FileDescriptorProto* other);
-  protected:
-  explicit FileDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -575,12 +330,36 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  bool has_name() const;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
+  // optional string package = 2;
+  bool has_package() const;
+  void clear_package();
+  static const int kPackageFieldNumber = 2;
+  const ::std::string& package() const;
+  void set_package(const ::std::string& value);
+  void set_package(const char* value);
+  void set_package(const char* value, size_t size);
+  ::std::string* mutable_package();
+  ::std::string* release_package();
+  void set_allocated_package(::std::string* package);
+
   // repeated string dependency = 3;
   int dependency_size() const;
   void clear_dependency();
@@ -588,21 +367,39 @@
   const ::std::string& dependency(int index) const;
   ::std::string* mutable_dependency(int index);
   void set_dependency(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_dependency(int index, ::std::string&& value);
-  #endif
   void set_dependency(int index, const char* value);
   void set_dependency(int index, const char* value, size_t size);
   ::std::string* add_dependency();
   void add_dependency(const ::std::string& value);
-  #if LANG_CXX11
-  void add_dependency(::std::string&& value);
-  #endif
   void add_dependency(const char* value);
   void add_dependency(const char* value, size_t size);
   const ::google::protobuf::RepeatedPtrField< ::std::string>& dependency() const;
   ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_dependency();
 
+  // repeated int32 public_dependency = 10;
+  int public_dependency_size() const;
+  void clear_public_dependency();
+  static const int kPublicDependencyFieldNumber = 10;
+  ::google::protobuf::int32 public_dependency(int index) const;
+  void set_public_dependency(int index, ::google::protobuf::int32 value);
+  void add_public_dependency(::google::protobuf::int32 value);
+  const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+      public_dependency() const;
+  ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+      mutable_public_dependency();
+
+  // repeated int32 weak_dependency = 11;
+  int weak_dependency_size() const;
+  void clear_weak_dependency();
+  static const int kWeakDependencyFieldNumber = 11;
+  ::google::protobuf::int32 weak_dependency(int index) const;
+  void set_weak_dependency(int index, ::google::protobuf::int32 value);
+  void add_weak_dependency(::google::protobuf::int32 value);
+  const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
+      weak_dependency() const;
+  ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
+      mutable_weak_dependency();
+
   // repeated .google.protobuf.DescriptorProto message_type = 4;
   int message_type_size() const;
   void clear_message_type();
@@ -651,77 +448,23 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
       extension() const;
 
-  // repeated int32 public_dependency = 10;
-  int public_dependency_size() const;
-  void clear_public_dependency();
-  static const int kPublicDependencyFieldNumber = 10;
-  ::google::protobuf::int32 public_dependency(int index) const;
-  void set_public_dependency(int index, ::google::protobuf::int32 value);
-  void add_public_dependency(::google::protobuf::int32 value);
-  const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
-      public_dependency() const;
-  ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
-      mutable_public_dependency();
+  // optional .google.protobuf.FileOptions options = 8;
+  bool has_options() const;
+  void clear_options();
+  static const int kOptionsFieldNumber = 8;
+  const ::google::protobuf::FileOptions& options() const;
+  ::google::protobuf::FileOptions* mutable_options();
+  ::google::protobuf::FileOptions* release_options();
+  void set_allocated_options(::google::protobuf::FileOptions* options);
 
-  // repeated int32 weak_dependency = 11;
-  int weak_dependency_size() const;
-  void clear_weak_dependency();
-  static const int kWeakDependencyFieldNumber = 11;
-  ::google::protobuf::int32 weak_dependency(int index) const;
-  void set_weak_dependency(int index, ::google::protobuf::int32 value);
-  void add_weak_dependency(::google::protobuf::int32 value);
-  const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
-      weak_dependency() const;
-  ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
-      mutable_weak_dependency();
-
-  // optional string name = 1;
-  bool has_name() const;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // optional string package = 2;
-  bool has_package() const;
-  void clear_package();
-  static const int kPackageFieldNumber = 2;
-  const ::std::string& package() const;
-  void set_package(const ::std::string& value);
-  #if LANG_CXX11
-  void set_package(::std::string&& value);
-  #endif
-  void set_package(const char* value);
-  void set_package(const char* value, size_t size);
-  ::std::string* mutable_package();
-  ::std::string* release_package();
-  void set_allocated_package(::std::string* package);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_package();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_package(
-      ::std::string* package);
+  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+  bool has_source_code_info() const;
+  void clear_source_code_info();
+  static const int kSourceCodeInfoFieldNumber = 9;
+  const ::google::protobuf::SourceCodeInfo& source_code_info() const;
+  ::google::protobuf::SourceCodeInfo* mutable_source_code_info();
+  ::google::protobuf::SourceCodeInfo* release_source_code_info();
+  void set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info);
 
   // optional string syntax = 12;
   bool has_syntax() const;
@@ -729,91 +472,50 @@
   static const int kSyntaxFieldNumber = 12;
   const ::std::string& syntax() const;
   void set_syntax(const ::std::string& value);
-  #if LANG_CXX11
-  void set_syntax(::std::string&& value);
-  #endif
   void set_syntax(const char* value);
   void set_syntax(const char* value, size_t size);
   ::std::string* mutable_syntax();
   ::std::string* release_syntax();
   void set_allocated_syntax(::std::string* syntax);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_syntax();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_syntax(
-      ::std::string* syntax);
-
-  // optional .google.protobuf.FileOptions options = 8;
-  bool has_options() const;
-  void clear_options();
-  static const int kOptionsFieldNumber = 8;
-  private:
-  void _slow_mutable_options();
-  public:
-  const ::google::protobuf::FileOptions& options() const;
-  ::google::protobuf::FileOptions* release_options();
-  ::google::protobuf::FileOptions* mutable_options();
-  void set_allocated_options(::google::protobuf::FileOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::FileOptions* options);
-  ::google::protobuf::FileOptions* unsafe_arena_release_options();
-
-  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
-  bool has_source_code_info() const;
-  void clear_source_code_info();
-  static const int kSourceCodeInfoFieldNumber = 9;
-  private:
-  void _slow_mutable_source_code_info();
-  public:
-  const ::google::protobuf::SourceCodeInfo& source_code_info() const;
-  ::google::protobuf::SourceCodeInfo* release_source_code_info();
-  ::google::protobuf::SourceCodeInfo* mutable_source_code_info();
-  void set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info);
-  void unsafe_arena_set_allocated_source_code_info(
-      ::google::protobuf::SourceCodeInfo* source_code_info);
-  ::google::protobuf::SourceCodeInfo* unsafe_arena_release_source_code_info();
 
   // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_package();
-  void clear_has_package();
-  void set_has_options();
-  void clear_has_options();
-  void set_has_source_code_info();
-  void clear_has_source_code_info();
-  void set_has_syntax();
-  void clear_has_syntax();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_package();
+  inline void clear_has_package();
+  inline void set_has_options();
+  inline void clear_has_options();
+  inline void set_has_source_code_info();
+  inline void clear_has_source_code_info();
+  inline void set_has_syntax();
+  inline void clear_has_syntax();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
+  ::google::protobuf::internal::ArenaStringPtr name_;
+  ::google::protobuf::internal::ArenaStringPtr package_;
   ::google::protobuf::RepeatedPtrField< ::std::string> dependency_;
+  ::google::protobuf::RepeatedField< ::google::protobuf::int32 > public_dependency_;
+  ::google::protobuf::RepeatedField< ::google::protobuf::int32 > weak_dependency_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > message_type_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto > service_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_;
-  ::google::protobuf::RepeatedField< ::google::protobuf::int32 > public_dependency_;
-  ::google::protobuf::RepeatedField< ::google::protobuf::int32 > weak_dependency_;
-  ::google::protobuf::internal::ArenaStringPtr name_;
-  ::google::protobuf::internal::ArenaStringPtr package_;
-  ::google::protobuf::internal::ArenaStringPtr syntax_;
   ::google::protobuf::FileOptions* options_;
   ::google::protobuf::SourceCodeInfo* source_code_info_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProtoImpl();
+  ::google::protobuf::internal::ArenaStringPtr syntax_;
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static FileDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT DescriptorProto_ExtensionRange : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto.ExtensionRange) */ {
+class LIBPROTOBUF_EXPORT DescriptorProto_ExtensionRange : public ::google::protobuf::Message {
  public:
   DescriptorProto_ExtensionRange();
   virtual ~DescriptorProto_ExtensionRange();
@@ -824,81 +526,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  DescriptorProto_ExtensionRange(DescriptorProto_ExtensionRange&& from) noexcept
-    : DescriptorProto_ExtensionRange() {
-    *this = ::std::move(from);
-  }
 
-  inline DescriptorProto_ExtensionRange& operator=(DescriptorProto_ExtensionRange&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const DescriptorProto_ExtensionRange& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const DescriptorProto_ExtensionRange* internal_default_instance() {
-    return reinterpret_cast<const DescriptorProto_ExtensionRange*>(
-               &_DescriptorProto_ExtensionRange_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    2;
-
-  void UnsafeArenaSwap(DescriptorProto_ExtensionRange* other);
   void Swap(DescriptorProto_ExtensionRange* other);
-  friend void swap(DescriptorProto_ExtensionRange& a, DescriptorProto_ExtensionRange& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline DescriptorProto_ExtensionRange* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline DescriptorProto_ExtensionRange* New() const { return New(NULL); }
 
-  DescriptorProto_ExtensionRange* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  DescriptorProto_ExtensionRange* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const DescriptorProto_ExtensionRange& from);
   void MergeFrom(const DescriptorProto_ExtensionRange& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(DescriptorProto_ExtensionRange* other);
-  protected:
-  explicit DescriptorProto_ExtensionRange(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -908,27 +573,12 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // optional .google.protobuf.ExtensionRangeOptions options = 3;
-  bool has_options() const;
-  void clear_options();
-  static const int kOptionsFieldNumber = 3;
-  private:
-  void _slow_mutable_options();
-  public:
-  const ::google::protobuf::ExtensionRangeOptions& options() const;
-  ::google::protobuf::ExtensionRangeOptions* release_options();
-  ::google::protobuf::ExtensionRangeOptions* mutable_options();
-  void set_allocated_options(::google::protobuf::ExtensionRangeOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::ExtensionRangeOptions* options);
-  ::google::protobuf::ExtensionRangeOptions* unsafe_arena_release_options();
-
   // optional int32 start = 1;
   bool has_start() const;
   void clear_start();
@@ -945,28 +595,26 @@
 
   // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange)
  private:
-  void set_has_start();
-  void clear_has_start();
-  void set_has_end();
-  void clear_has_end();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_start();
+  inline void clear_has_start();
+  inline void set_has_end();
+  inline void clear_has_end();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
-  ::google::protobuf::ExtensionRangeOptions* options_;
   ::google::protobuf::int32 start_;
   ::google::protobuf::int32 end_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRangeImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static DescriptorProto_ExtensionRange* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT DescriptorProto_ReservedRange : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto.ReservedRange) */ {
+class LIBPROTOBUF_EXPORT DescriptorProto_ReservedRange : public ::google::protobuf::Message {
  public:
   DescriptorProto_ReservedRange();
   virtual ~DescriptorProto_ReservedRange();
@@ -977,81 +625,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  DescriptorProto_ReservedRange(DescriptorProto_ReservedRange&& from) noexcept
-    : DescriptorProto_ReservedRange() {
-    *this = ::std::move(from);
-  }
 
-  inline DescriptorProto_ReservedRange& operator=(DescriptorProto_ReservedRange&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const DescriptorProto_ReservedRange& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const DescriptorProto_ReservedRange* internal_default_instance() {
-    return reinterpret_cast<const DescriptorProto_ReservedRange*>(
-               &_DescriptorProto_ReservedRange_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    3;
-
-  void UnsafeArenaSwap(DescriptorProto_ReservedRange* other);
   void Swap(DescriptorProto_ReservedRange* other);
-  friend void swap(DescriptorProto_ReservedRange& a, DescriptorProto_ReservedRange& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline DescriptorProto_ReservedRange* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline DescriptorProto_ReservedRange* New() const { return New(NULL); }
 
-  DescriptorProto_ReservedRange* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  DescriptorProto_ReservedRange* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const DescriptorProto_ReservedRange& from);
   void MergeFrom(const DescriptorProto_ReservedRange& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(DescriptorProto_ReservedRange* other);
-  protected:
-  explicit DescriptorProto_ReservedRange(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -1061,7 +672,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -1083,25 +694,26 @@
 
   // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ReservedRange)
  private:
-  void set_has_start();
-  void clear_has_start();
-  void set_has_end();
-  void clear_has_end();
+  inline void set_has_start();
+  inline void clear_has_start();
+  inline void set_has_end();
+  inline void clear_has_end();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::int32 start_;
   ::google::protobuf::int32 end_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRangeImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static DescriptorProto_ReservedRange* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT DescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto) */ {
+class LIBPROTOBUF_EXPORT DescriptorProto : public ::google::protobuf::Message {
  public:
   DescriptorProto();
   virtual ~DescriptorProto();
@@ -1112,81 +724,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  DescriptorProto(DescriptorProto&& from) noexcept
-    : DescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline DescriptorProto& operator=(DescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const DescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const DescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const DescriptorProto*>(
-               &_DescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    4;
-
-  void UnsafeArenaSwap(DescriptorProto* other);
   void Swap(DescriptorProto* other);
-  friend void swap(DescriptorProto& a, DescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline DescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline DescriptorProto* New() const { return New(NULL); }
 
-  DescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  DescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const DescriptorProto& from);
   void MergeFrom(const DescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(DescriptorProto* other);
-  protected:
-  explicit DescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -1196,7 +771,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -1205,6 +780,18 @@
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  bool has_name() const;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
   // repeated .google.protobuf.FieldDescriptorProto field = 2;
   int field_size() const;
   void clear_field();
@@ -1217,6 +804,18 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
       field() const;
 
+  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+  int extension_size() const;
+  void clear_extension();
+  static const int kExtensionFieldNumber = 6;
+  const ::google::protobuf::FieldDescriptorProto& extension(int index) const;
+  ::google::protobuf::FieldDescriptorProto* mutable_extension(int index);
+  ::google::protobuf::FieldDescriptorProto* add_extension();
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*
+      mutable_extension();
+  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
+      extension() const;
+
   // repeated .google.protobuf.DescriptorProto nested_type = 3;
   int nested_type_size() const;
   void clear_nested_type();
@@ -1253,18 +852,6 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >&
       extension_range() const;
 
-  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
-  int extension_size() const;
-  void clear_extension();
-  static const int kExtensionFieldNumber = 6;
-  const ::google::protobuf::FieldDescriptorProto& extension(int index) const;
-  ::google::protobuf::FieldDescriptorProto* mutable_extension(int index);
-  ::google::protobuf::FieldDescriptorProto* add_extension();
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*
-      mutable_extension();
-  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&
-      extension() const;
-
   // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
   int oneof_decl_size() const;
   void clear_oneof_decl();
@@ -1277,6 +864,15 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >&
       oneof_decl() const;
 
+  // optional .google.protobuf.MessageOptions options = 7;
+  bool has_options() const;
+  void clear_options();
+  static const int kOptionsFieldNumber = 7;
+  const ::google::protobuf::MessageOptions& options() const;
+  ::google::protobuf::MessageOptions* mutable_options();
+  ::google::protobuf::MessageOptions* release_options();
+  void set_allocated_options(::google::protobuf::MessageOptions* options);
+
   // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
   int reserved_range_size() const;
   void clear_reserved_range();
@@ -1296,220 +892,45 @@
   const ::std::string& reserved_name(int index) const;
   ::std::string* mutable_reserved_name(int index);
   void set_reserved_name(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_reserved_name(int index, ::std::string&& value);
-  #endif
   void set_reserved_name(int index, const char* value);
   void set_reserved_name(int index, const char* value, size_t size);
   ::std::string* add_reserved_name();
   void add_reserved_name(const ::std::string& value);
-  #if LANG_CXX11
-  void add_reserved_name(::std::string&& value);
-  #endif
   void add_reserved_name(const char* value);
   void add_reserved_name(const char* value, size_t size);
   const ::google::protobuf::RepeatedPtrField< ::std::string>& reserved_name() const;
   ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_reserved_name();
 
-  // optional string name = 1;
-  bool has_name() const;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // optional .google.protobuf.MessageOptions options = 7;
-  bool has_options() const;
-  void clear_options();
-  static const int kOptionsFieldNumber = 7;
-  private:
-  void _slow_mutable_options();
-  public:
-  const ::google::protobuf::MessageOptions& options() const;
-  ::google::protobuf::MessageOptions* release_options();
-  ::google::protobuf::MessageOptions* mutable_options();
-  void set_allocated_options(::google::protobuf::MessageOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::MessageOptions* options);
-  ::google::protobuf::MessageOptions* unsafe_arena_release_options();
-
   // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_options();
+  inline void clear_has_options();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
+  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > field_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > nested_type_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange > extension_range_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto > oneof_decl_;
+  ::google::protobuf::MessageOptions* options_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange > reserved_range_;
   ::google::protobuf::RepeatedPtrField< ::std::string> reserved_name_;
-  ::google::protobuf::internal::ArenaStringPtr name_;
-  ::google::protobuf::MessageOptions* options_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static DescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT ExtensionRangeOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ExtensionRangeOptions) */ {
- public:
-  ExtensionRangeOptions();
-  virtual ~ExtensionRangeOptions();
-
-  ExtensionRangeOptions(const ExtensionRangeOptions& from);
-
-  inline ExtensionRangeOptions& operator=(const ExtensionRangeOptions& from) {
-    CopyFrom(from);
-    return *this;
-  }
-  #if LANG_CXX11
-  ExtensionRangeOptions(ExtensionRangeOptions&& from) noexcept
-    : ExtensionRangeOptions() {
-    *this = ::std::move(from);
-  }
-
-  inline ExtensionRangeOptions& operator=(ExtensionRangeOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields();
-  }
-  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields();
-  }
-
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
-  static const ::google::protobuf::Descriptor* descriptor();
-  static const ExtensionRangeOptions& default_instance();
-
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const ExtensionRangeOptions* internal_default_instance() {
-    return reinterpret_cast<const ExtensionRangeOptions*>(
-               &_ExtensionRangeOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    5;
-
-  void UnsafeArenaSwap(ExtensionRangeOptions* other);
-  void Swap(ExtensionRangeOptions* other);
-  friend void swap(ExtensionRangeOptions& a, ExtensionRangeOptions& b) {
-    a.Swap(&b);
-  }
-
-  // implements Message ----------------------------------------------
-
-  inline ExtensionRangeOptions* New() const PROTOBUF_FINAL { return New(NULL); }
-
-  ExtensionRangeOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void CopyFrom(const ExtensionRangeOptions& from);
-  void MergeFrom(const ExtensionRangeOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
-
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
-  bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
-  void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
-  private:
-  void SharedCtor();
-  void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
-  void InternalSwap(ExtensionRangeOptions* other);
-  protected:
-  explicit ExtensionRangeOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
-  private:
-  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return _internal_metadata_.arena();
-  }
-  inline void* MaybeArenaPtr() const {
-    return _internal_metadata_.raw_arena_ptr();
-  }
-  public:
-
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
-
-  // nested types ----------------------------------------------------
-
-  // accessors -------------------------------------------------------
-
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  int uninterpreted_option_size() const;
-  void clear_uninterpreted_option();
-  static const int kUninterpretedOptionFieldNumber = 999;
-  const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;
-  ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);
-  ::google::protobuf::UninterpretedOption* add_uninterpreted_option();
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
-      mutable_uninterpreted_option();
-  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
-      uninterpreted_option() const;
-
-  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ExtensionRangeOptions)
-  // @@protoc_insertion_point(class_scope:google.protobuf.ExtensionRangeOptions)
- private:
-
-  ::google::protobuf::internal::ExtensionSet _extensions_;
-
-  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
-  mutable int _cached_size_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptionsImpl();
-};
-// -------------------------------------------------------------------
-
-class LIBPROTOBUF_EXPORT FieldDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT FieldDescriptorProto : public ::google::protobuf::Message {
  public:
   FieldDescriptorProto();
   virtual ~FieldDescriptorProto();
@@ -1520,81 +941,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FieldDescriptorProto(FieldDescriptorProto&& from) noexcept
-    : FieldDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline FieldDescriptorProto& operator=(FieldDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const FieldDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FieldDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const FieldDescriptorProto*>(
-               &_FieldDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    6;
-
-  void UnsafeArenaSwap(FieldDescriptorProto* other);
   void Swap(FieldDescriptorProto* other);
-  friend void swap(FieldDescriptorProto& a, FieldDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FieldDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FieldDescriptorProto* New() const { return New(NULL); }
 
-  FieldDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FieldDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FieldDescriptorProto& from);
   void MergeFrom(const FieldDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FieldDescriptorProto* other);
-  protected:
-  explicit FieldDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -1604,7 +988,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -1702,134 +1086,11 @@
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
   ::std::string* release_name();
   void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // optional string extendee = 2;
-  bool has_extendee() const;
-  void clear_extendee();
-  static const int kExtendeeFieldNumber = 2;
-  const ::std::string& extendee() const;
-  void set_extendee(const ::std::string& value);
-  #if LANG_CXX11
-  void set_extendee(::std::string&& value);
-  #endif
-  void set_extendee(const char* value);
-  void set_extendee(const char* value, size_t size);
-  ::std::string* mutable_extendee();
-  ::std::string* release_extendee();
-  void set_allocated_extendee(::std::string* extendee);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_extendee();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_extendee(
-      ::std::string* extendee);
-
-  // optional string type_name = 6;
-  bool has_type_name() const;
-  void clear_type_name();
-  static const int kTypeNameFieldNumber = 6;
-  const ::std::string& type_name() const;
-  void set_type_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_type_name(::std::string&& value);
-  #endif
-  void set_type_name(const char* value);
-  void set_type_name(const char* value, size_t size);
-  ::std::string* mutable_type_name();
-  ::std::string* release_type_name();
-  void set_allocated_type_name(::std::string* type_name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_type_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_type_name(
-      ::std::string* type_name);
-
-  // optional string default_value = 7;
-  bool has_default_value() const;
-  void clear_default_value();
-  static const int kDefaultValueFieldNumber = 7;
-  const ::std::string& default_value() const;
-  void set_default_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_default_value(::std::string&& value);
-  #endif
-  void set_default_value(const char* value);
-  void set_default_value(const char* value, size_t size);
-  ::std::string* mutable_default_value();
-  ::std::string* release_default_value();
-  void set_allocated_default_value(::std::string* default_value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_default_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_default_value(
-      ::std::string* default_value);
-
-  // optional string json_name = 10;
-  bool has_json_name() const;
-  void clear_json_name();
-  static const int kJsonNameFieldNumber = 10;
-  const ::std::string& json_name() const;
-  void set_json_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_json_name(::std::string&& value);
-  #endif
-  void set_json_name(const char* value);
-  void set_json_name(const char* value, size_t size);
-  ::std::string* mutable_json_name();
-  ::std::string* release_json_name();
-  void set_allocated_json_name(::std::string* json_name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_json_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_json_name(
-      ::std::string* json_name);
-
-  // optional .google.protobuf.FieldOptions options = 8;
-  bool has_options() const;
-  void clear_options();
-  static const int kOptionsFieldNumber = 8;
-  private:
-  void _slow_mutable_options();
-  public:
-  const ::google::protobuf::FieldOptions& options() const;
-  ::google::protobuf::FieldOptions* release_options();
-  ::google::protobuf::FieldOptions* mutable_options();
-  void set_allocated_options(::google::protobuf::FieldOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::FieldOptions* options);
-  ::google::protobuf::FieldOptions* unsafe_arena_release_options();
 
   // optional int32 number = 3;
   bool has_number() const;
@@ -1838,13 +1099,6 @@
   ::google::protobuf::int32 number() const;
   void set_number(::google::protobuf::int32 value);
 
-  // optional int32 oneof_index = 9;
-  bool has_oneof_index() const;
-  void clear_oneof_index();
-  static const int kOneofIndexFieldNumber = 9;
-  ::google::protobuf::int32 oneof_index() const;
-  void set_oneof_index(::google::protobuf::int32 value);
-
   // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
   bool has_label() const;
   void clear_label();
@@ -1859,51 +1113,116 @@
   ::google::protobuf::FieldDescriptorProto_Type type() const;
   void set_type(::google::protobuf::FieldDescriptorProto_Type value);
 
+  // optional string type_name = 6;
+  bool has_type_name() const;
+  void clear_type_name();
+  static const int kTypeNameFieldNumber = 6;
+  const ::std::string& type_name() const;
+  void set_type_name(const ::std::string& value);
+  void set_type_name(const char* value);
+  void set_type_name(const char* value, size_t size);
+  ::std::string* mutable_type_name();
+  ::std::string* release_type_name();
+  void set_allocated_type_name(::std::string* type_name);
+
+  // optional string extendee = 2;
+  bool has_extendee() const;
+  void clear_extendee();
+  static const int kExtendeeFieldNumber = 2;
+  const ::std::string& extendee() const;
+  void set_extendee(const ::std::string& value);
+  void set_extendee(const char* value);
+  void set_extendee(const char* value, size_t size);
+  ::std::string* mutable_extendee();
+  ::std::string* release_extendee();
+  void set_allocated_extendee(::std::string* extendee);
+
+  // optional string default_value = 7;
+  bool has_default_value() const;
+  void clear_default_value();
+  static const int kDefaultValueFieldNumber = 7;
+  const ::std::string& default_value() const;
+  void set_default_value(const ::std::string& value);
+  void set_default_value(const char* value);
+  void set_default_value(const char* value, size_t size);
+  ::std::string* mutable_default_value();
+  ::std::string* release_default_value();
+  void set_allocated_default_value(::std::string* default_value);
+
+  // optional int32 oneof_index = 9;
+  bool has_oneof_index() const;
+  void clear_oneof_index();
+  static const int kOneofIndexFieldNumber = 9;
+  ::google::protobuf::int32 oneof_index() const;
+  void set_oneof_index(::google::protobuf::int32 value);
+
+  // optional string json_name = 10;
+  bool has_json_name() const;
+  void clear_json_name();
+  static const int kJsonNameFieldNumber = 10;
+  const ::std::string& json_name() const;
+  void set_json_name(const ::std::string& value);
+  void set_json_name(const char* value);
+  void set_json_name(const char* value, size_t size);
+  ::std::string* mutable_json_name();
+  ::std::string* release_json_name();
+  void set_allocated_json_name(::std::string* json_name);
+
+  // optional .google.protobuf.FieldOptions options = 8;
+  bool has_options() const;
+  void clear_options();
+  static const int kOptionsFieldNumber = 8;
+  const ::google::protobuf::FieldOptions& options() const;
+  ::google::protobuf::FieldOptions* mutable_options();
+  ::google::protobuf::FieldOptions* release_options();
+  void set_allocated_options(::google::protobuf::FieldOptions* options);
+
   // @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_number();
-  void clear_has_number();
-  void set_has_label();
-  void clear_has_label();
-  void set_has_type();
-  void clear_has_type();
-  void set_has_type_name();
-  void clear_has_type_name();
-  void set_has_extendee();
-  void clear_has_extendee();
-  void set_has_default_value();
-  void clear_has_default_value();
-  void set_has_oneof_index();
-  void clear_has_oneof_index();
-  void set_has_json_name();
-  void clear_has_json_name();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_number();
+  inline void clear_has_number();
+  inline void set_has_label();
+  inline void clear_has_label();
+  inline void set_has_type();
+  inline void clear_has_type();
+  inline void set_has_type_name();
+  inline void clear_has_type_name();
+  inline void set_has_extendee();
+  inline void clear_has_extendee();
+  inline void set_has_default_value();
+  inline void clear_has_default_value();
+  inline void set_has_oneof_index();
+  inline void clear_has_oneof_index();
+  inline void set_has_json_name();
+  inline void clear_has_json_name();
+  inline void set_has_options();
+  inline void clear_has_options();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::internal::ArenaStringPtr name_;
-  ::google::protobuf::internal::ArenaStringPtr extendee_;
+  ::google::protobuf::int32 number_;
+  int label_;
   ::google::protobuf::internal::ArenaStringPtr type_name_;
+  ::google::protobuf::internal::ArenaStringPtr extendee_;
+  int type_;
+  ::google::protobuf::int32 oneof_index_;
   ::google::protobuf::internal::ArenaStringPtr default_value_;
   ::google::protobuf::internal::ArenaStringPtr json_name_;
   ::google::protobuf::FieldOptions* options_;
-  ::google::protobuf::int32 number_;
-  ::google::protobuf::int32 oneof_index_;
-  int label_;
-  int type_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static FieldDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT OneofDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.OneofDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT OneofDescriptorProto : public ::google::protobuf::Message {
  public:
   OneofDescriptorProto();
   virtual ~OneofDescriptorProto();
@@ -1914,81 +1233,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  OneofDescriptorProto(OneofDescriptorProto&& from) noexcept
-    : OneofDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline OneofDescriptorProto& operator=(OneofDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const OneofDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const OneofDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const OneofDescriptorProto*>(
-               &_OneofDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    7;
-
-  void UnsafeArenaSwap(OneofDescriptorProto* other);
   void Swap(OneofDescriptorProto* other);
-  friend void swap(OneofDescriptorProto& a, OneofDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline OneofDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline OneofDescriptorProto* New() const { return New(NULL); }
 
-  OneofDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  OneofDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const OneofDescriptorProto& from);
   void MergeFrom(const OneofDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(OneofDescriptorProto* other);
-  protected:
-  explicit OneofDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -1998,7 +1280,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -2010,195 +1292,31 @@
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
   ::std::string* release_name();
   void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // optional .google.protobuf.OneofOptions options = 2;
-  bool has_options() const;
-  void clear_options();
-  static const int kOptionsFieldNumber = 2;
-  private:
-  void _slow_mutable_options();
-  public:
-  const ::google::protobuf::OneofOptions& options() const;
-  ::google::protobuf::OneofOptions* release_options();
-  ::google::protobuf::OneofOptions* mutable_options();
-  void set_allocated_options(::google::protobuf::OneofOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::OneofOptions* options);
-  ::google::protobuf::OneofOptions* unsafe_arena_release_options();
 
   // @@protoc_insertion_point(class_scope:google.protobuf.OneofDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_name();
+  inline void clear_has_name();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::internal::ArenaStringPtr name_;
-  ::google::protobuf::OneofOptions* options_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static OneofDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT EnumDescriptorProto_EnumReservedRange : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumDescriptorProto.EnumReservedRange) */ {
- public:
-  EnumDescriptorProto_EnumReservedRange();
-  virtual ~EnumDescriptorProto_EnumReservedRange();
-
-  EnumDescriptorProto_EnumReservedRange(const EnumDescriptorProto_EnumReservedRange& from);
-
-  inline EnumDescriptorProto_EnumReservedRange& operator=(const EnumDescriptorProto_EnumReservedRange& from) {
-    CopyFrom(from);
-    return *this;
-  }
-  #if LANG_CXX11
-  EnumDescriptorProto_EnumReservedRange(EnumDescriptorProto_EnumReservedRange&& from) noexcept
-    : EnumDescriptorProto_EnumReservedRange() {
-    *this = ::std::move(from);
-  }
-
-  inline EnumDescriptorProto_EnumReservedRange& operator=(EnumDescriptorProto_EnumReservedRange&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields();
-  }
-  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields();
-  }
-
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
-  static const ::google::protobuf::Descriptor* descriptor();
-  static const EnumDescriptorProto_EnumReservedRange& default_instance();
-
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const EnumDescriptorProto_EnumReservedRange* internal_default_instance() {
-    return reinterpret_cast<const EnumDescriptorProto_EnumReservedRange*>(
-               &_EnumDescriptorProto_EnumReservedRange_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    8;
-
-  void UnsafeArenaSwap(EnumDescriptorProto_EnumReservedRange* other);
-  void Swap(EnumDescriptorProto_EnumReservedRange* other);
-  friend void swap(EnumDescriptorProto_EnumReservedRange& a, EnumDescriptorProto_EnumReservedRange& b) {
-    a.Swap(&b);
-  }
-
-  // implements Message ----------------------------------------------
-
-  inline EnumDescriptorProto_EnumReservedRange* New() const PROTOBUF_FINAL { return New(NULL); }
-
-  EnumDescriptorProto_EnumReservedRange* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void CopyFrom(const EnumDescriptorProto_EnumReservedRange& from);
-  void MergeFrom(const EnumDescriptorProto_EnumReservedRange& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
-
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
-  bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
-  void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
-  private:
-  void SharedCtor();
-  void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
-  void InternalSwap(EnumDescriptorProto_EnumReservedRange* other);
-  protected:
-  explicit EnumDescriptorProto_EnumReservedRange(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
-  private:
-  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return _internal_metadata_.arena();
-  }
-  inline void* MaybeArenaPtr() const {
-    return _internal_metadata_.raw_arena_ptr();
-  }
-  public:
-
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
-
-  // nested types ----------------------------------------------------
-
-  // accessors -------------------------------------------------------
-
-  // optional int32 start = 1;
-  bool has_start() const;
-  void clear_start();
-  static const int kStartFieldNumber = 1;
-  ::google::protobuf::int32 start() const;
-  void set_start(::google::protobuf::int32 value);
-
-  // optional int32 end = 2;
-  bool has_end() const;
-  void clear_end();
-  static const int kEndFieldNumber = 2;
-  ::google::protobuf::int32 end() const;
-  void set_end(::google::protobuf::int32 value);
-
-  // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto.EnumReservedRange)
- private:
-  void set_has_start();
-  void clear_has_start();
-  void set_has_end();
-  void clear_has_end();
-
-  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
-  mutable int _cached_size_;
-  ::google::protobuf::int32 start_;
-  ::google::protobuf::int32 end_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl();
-};
-// -------------------------------------------------------------------
-
-class LIBPROTOBUF_EXPORT EnumDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT EnumDescriptorProto : public ::google::protobuf::Message {
  public:
   EnumDescriptorProto();
   virtual ~EnumDescriptorProto();
@@ -2209,81 +1327,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  EnumDescriptorProto(EnumDescriptorProto&& from) noexcept
-    : EnumDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline EnumDescriptorProto& operator=(EnumDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const EnumDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const EnumDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const EnumDescriptorProto*>(
-               &_EnumDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    9;
-
-  void UnsafeArenaSwap(EnumDescriptorProto* other);
   void Swap(EnumDescriptorProto* other);
-  friend void swap(EnumDescriptorProto& a, EnumDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline EnumDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline EnumDescriptorProto* New() const { return New(NULL); }
 
-  EnumDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  EnumDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const EnumDescriptorProto& from);
   void MergeFrom(const EnumDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(EnumDescriptorProto* other);
-  protected:
-  explicit EnumDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -2293,14 +1374,24 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
-  typedef EnumDescriptorProto_EnumReservedRange EnumReservedRange;
-
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  bool has_name() const;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
   // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
   int value_size() const;
   void clear_value();
@@ -2313,103 +1404,38 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >&
       value() const;
 
-  // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-  int reserved_range_size() const;
-  void clear_reserved_range();
-  static const int kReservedRangeFieldNumber = 4;
-  const ::google::protobuf::EnumDescriptorProto_EnumReservedRange& reserved_range(int index) const;
-  ::google::protobuf::EnumDescriptorProto_EnumReservedRange* mutable_reserved_range(int index);
-  ::google::protobuf::EnumDescriptorProto_EnumReservedRange* add_reserved_range();
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >*
-      mutable_reserved_range();
-  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >&
-      reserved_range() const;
-
-  // repeated string reserved_name = 5;
-  int reserved_name_size() const;
-  void clear_reserved_name();
-  static const int kReservedNameFieldNumber = 5;
-  const ::std::string& reserved_name(int index) const;
-  ::std::string* mutable_reserved_name(int index);
-  void set_reserved_name(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_reserved_name(int index, ::std::string&& value);
-  #endif
-  void set_reserved_name(int index, const char* value);
-  void set_reserved_name(int index, const char* value, size_t size);
-  ::std::string* add_reserved_name();
-  void add_reserved_name(const ::std::string& value);
-  #if LANG_CXX11
-  void add_reserved_name(::std::string&& value);
-  #endif
-  void add_reserved_name(const char* value);
-  void add_reserved_name(const char* value, size_t size);
-  const ::google::protobuf::RepeatedPtrField< ::std::string>& reserved_name() const;
-  ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_reserved_name();
-
-  // optional string name = 1;
-  bool has_name() const;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
   // optional .google.protobuf.EnumOptions options = 3;
   bool has_options() const;
   void clear_options();
   static const int kOptionsFieldNumber = 3;
-  private:
-  void _slow_mutable_options();
-  public:
   const ::google::protobuf::EnumOptions& options() const;
-  ::google::protobuf::EnumOptions* release_options();
   ::google::protobuf::EnumOptions* mutable_options();
+  ::google::protobuf::EnumOptions* release_options();
   void set_allocated_options(::google::protobuf::EnumOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::EnumOptions* options);
-  ::google::protobuf::EnumOptions* unsafe_arena_release_options();
 
   // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_options();
+  inline void clear_has_options();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto > value_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange > reserved_range_;
-  ::google::protobuf::RepeatedPtrField< ::std::string> reserved_name_;
   ::google::protobuf::internal::ArenaStringPtr name_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto > value_;
   ::google::protobuf::EnumOptions* options_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static EnumDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT EnumValueDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValueDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT EnumValueDescriptorProto : public ::google::protobuf::Message {
  public:
   EnumValueDescriptorProto();
   virtual ~EnumValueDescriptorProto();
@@ -2420,81 +1446,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  EnumValueDescriptorProto(EnumValueDescriptorProto&& from) noexcept
-    : EnumValueDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline EnumValueDescriptorProto& operator=(EnumValueDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const EnumValueDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const EnumValueDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const EnumValueDescriptorProto*>(
-               &_EnumValueDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    10;
-
-  void UnsafeArenaSwap(EnumValueDescriptorProto* other);
   void Swap(EnumValueDescriptorProto* other);
-  friend void swap(EnumValueDescriptorProto& a, EnumValueDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline EnumValueDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline EnumValueDescriptorProto* New() const { return New(NULL); }
 
-  EnumValueDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  EnumValueDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const EnumValueDescriptorProto& from);
   void MergeFrom(const EnumValueDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(EnumValueDescriptorProto* other);
-  protected:
-  explicit EnumValueDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -2504,7 +1493,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -2516,38 +1505,11 @@
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
   ::std::string* release_name();
   void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // optional .google.protobuf.EnumValueOptions options = 3;
-  bool has_options() const;
-  void clear_options();
-  static const int kOptionsFieldNumber = 3;
-  private:
-  void _slow_mutable_options();
-  public:
-  const ::google::protobuf::EnumValueOptions& options() const;
-  ::google::protobuf::EnumValueOptions* release_options();
-  ::google::protobuf::EnumValueOptions* mutable_options();
-  void set_allocated_options(::google::protobuf::EnumValueOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::EnumValueOptions* options);
-  ::google::protobuf::EnumValueOptions* unsafe_arena_release_options();
 
   // optional int32 number = 2;
   bool has_number() const;
@@ -2556,30 +1518,40 @@
   ::google::protobuf::int32 number() const;
   void set_number(::google::protobuf::int32 value);
 
+  // optional .google.protobuf.EnumValueOptions options = 3;
+  bool has_options() const;
+  void clear_options();
+  static const int kOptionsFieldNumber = 3;
+  const ::google::protobuf::EnumValueOptions& options() const;
+  ::google::protobuf::EnumValueOptions* mutable_options();
+  ::google::protobuf::EnumValueOptions* release_options();
+  void set_allocated_options(::google::protobuf::EnumValueOptions* options);
+
   // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_number();
-  void clear_has_number();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_number();
+  inline void clear_has_number();
+  inline void set_has_options();
+  inline void clear_has_options();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::EnumValueOptions* options_;
   ::google::protobuf::int32 number_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static EnumValueDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT ServiceDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ServiceDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT ServiceDescriptorProto : public ::google::protobuf::Message {
  public:
   ServiceDescriptorProto();
   virtual ~ServiceDescriptorProto();
@@ -2590,81 +1562,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  ServiceDescriptorProto(ServiceDescriptorProto&& from) noexcept
-    : ServiceDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline ServiceDescriptorProto& operator=(ServiceDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const ServiceDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const ServiceDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const ServiceDescriptorProto*>(
-               &_ServiceDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    11;
-
-  void UnsafeArenaSwap(ServiceDescriptorProto* other);
   void Swap(ServiceDescriptorProto* other);
-  friend void swap(ServiceDescriptorProto& a, ServiceDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline ServiceDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline ServiceDescriptorProto* New() const { return New(NULL); }
 
-  ServiceDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  ServiceDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const ServiceDescriptorProto& from);
   void MergeFrom(const ServiceDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(ServiceDescriptorProto* other);
-  protected:
-  explicit ServiceDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -2674,12 +1609,24 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  bool has_name() const;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
   // repeated .google.protobuf.MethodDescriptorProto method = 2;
   int method_size() const;
   void clear_method();
@@ -2692,67 +1639,38 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >&
       method() const;
 
-  // optional string name = 1;
-  bool has_name() const;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
   // optional .google.protobuf.ServiceOptions options = 3;
   bool has_options() const;
   void clear_options();
   static const int kOptionsFieldNumber = 3;
-  private:
-  void _slow_mutable_options();
-  public:
   const ::google::protobuf::ServiceOptions& options() const;
-  ::google::protobuf::ServiceOptions* release_options();
   ::google::protobuf::ServiceOptions* mutable_options();
+  ::google::protobuf::ServiceOptions* release_options();
   void set_allocated_options(::google::protobuf::ServiceOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::ServiceOptions* options);
-  ::google::protobuf::ServiceOptions* unsafe_arena_release_options();
 
   // @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_options();
-  void clear_has_options();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_options();
+  inline void clear_has_options();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto > method_;
   ::google::protobuf::internal::ArenaStringPtr name_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto > method_;
   ::google::protobuf::ServiceOptions* options_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static ServiceDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT MethodDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MethodDescriptorProto) */ {
+class LIBPROTOBUF_EXPORT MethodDescriptorProto : public ::google::protobuf::Message {
  public:
   MethodDescriptorProto();
   virtual ~MethodDescriptorProto();
@@ -2763,81 +1681,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  MethodDescriptorProto(MethodDescriptorProto&& from) noexcept
-    : MethodDescriptorProto() {
-    *this = ::std::move(from);
-  }
 
-  inline MethodDescriptorProto& operator=(MethodDescriptorProto&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const MethodDescriptorProto& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const MethodDescriptorProto* internal_default_instance() {
-    return reinterpret_cast<const MethodDescriptorProto*>(
-               &_MethodDescriptorProto_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    12;
-
-  void UnsafeArenaSwap(MethodDescriptorProto* other);
   void Swap(MethodDescriptorProto* other);
-  friend void swap(MethodDescriptorProto& a, MethodDescriptorProto& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline MethodDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline MethodDescriptorProto* New() const { return New(NULL); }
 
-  MethodDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  MethodDescriptorProto* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const MethodDescriptorProto& from);
   void MergeFrom(const MethodDescriptorProto& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(MethodDescriptorProto* other);
-  protected:
-  explicit MethodDescriptorProto(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -2847,7 +1728,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -2859,23 +1740,11 @@
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
   ::std::string* release_name();
   void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
 
   // optional string input_type = 2;
   bool has_input_type() const;
@@ -2883,23 +1752,11 @@
   static const int kInputTypeFieldNumber = 2;
   const ::std::string& input_type() const;
   void set_input_type(const ::std::string& value);
-  #if LANG_CXX11
-  void set_input_type(::std::string&& value);
-  #endif
   void set_input_type(const char* value);
   void set_input_type(const char* value, size_t size);
   ::std::string* mutable_input_type();
   ::std::string* release_input_type();
   void set_allocated_input_type(::std::string* input_type);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_input_type();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_input_type(
-      ::std::string* input_type);
 
   // optional string output_type = 3;
   bool has_output_type() const;
@@ -2907,38 +1764,20 @@
   static const int kOutputTypeFieldNumber = 3;
   const ::std::string& output_type() const;
   void set_output_type(const ::std::string& value);
-  #if LANG_CXX11
-  void set_output_type(::std::string&& value);
-  #endif
   void set_output_type(const char* value);
   void set_output_type(const char* value, size_t size);
   ::std::string* mutable_output_type();
   ::std::string* release_output_type();
   void set_allocated_output_type(::std::string* output_type);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_output_type();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_output_type(
-      ::std::string* output_type);
 
   // optional .google.protobuf.MethodOptions options = 4;
   bool has_options() const;
   void clear_options();
   static const int kOptionsFieldNumber = 4;
-  private:
-  void _slow_mutable_options();
-  public:
   const ::google::protobuf::MethodOptions& options() const;
-  ::google::protobuf::MethodOptions* release_options();
   ::google::protobuf::MethodOptions* mutable_options();
+  ::google::protobuf::MethodOptions* release_options();
   void set_allocated_options(::google::protobuf::MethodOptions* options);
-  void unsafe_arena_set_allocated_options(
-      ::google::protobuf::MethodOptions* options);
-  ::google::protobuf::MethodOptions* unsafe_arena_release_options();
 
   // optional bool client_streaming = 5 [default = false];
   bool has_client_streaming() const;
@@ -2956,24 +1795,21 @@
 
   // @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto)
  private:
-  void set_has_name();
-  void clear_has_name();
-  void set_has_input_type();
-  void clear_has_input_type();
-  void set_has_output_type();
-  void clear_has_output_type();
-  void set_has_options();
-  void clear_has_options();
-  void set_has_client_streaming();
-  void clear_has_client_streaming();
-  void set_has_server_streaming();
-  void clear_has_server_streaming();
+  inline void set_has_name();
+  inline void clear_has_name();
+  inline void set_has_input_type();
+  inline void clear_has_input_type();
+  inline void set_has_output_type();
+  inline void clear_has_output_type();
+  inline void set_has_options();
+  inline void clear_has_options();
+  inline void set_has_client_streaming();
+  inline void clear_has_client_streaming();
+  inline void set_has_server_streaming();
+  inline void clear_has_server_streaming();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::internal::ArenaStringPtr input_type_;
@@ -2981,12 +1817,16 @@
   ::google::protobuf::MethodOptions* options_;
   bool client_streaming_;
   bool server_streaming_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProtoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static MethodDescriptorProto* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT FileOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileOptions) */ {
+class LIBPROTOBUF_EXPORT FileOptions : public ::google::protobuf::Message {
  public:
   FileOptions();
   virtual ~FileOptions();
@@ -2997,81 +1837,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FileOptions(FileOptions&& from) noexcept
-    : FileOptions() {
-    *this = ::std::move(from);
-  }
 
-  inline FileOptions& operator=(FileOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const FileOptions& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FileOptions* internal_default_instance() {
-    return reinterpret_cast<const FileOptions*>(
-               &_FileOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    13;
-
-  void UnsafeArenaSwap(FileOptions* other);
   void Swap(FileOptions* other);
-  friend void swap(FileOptions& a, FileOptions& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FileOptions* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FileOptions* New() const { return New(NULL); }
 
-  FileOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FileOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FileOptions& from);
   void MergeFrom(const FileOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FileOptions* other);
-  protected:
-  explicit FileOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -3081,7 +1884,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -3115,41 +1918,17 @@
 
   // accessors -------------------------------------------------------
 
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  int uninterpreted_option_size() const;
-  void clear_uninterpreted_option();
-  static const int kUninterpretedOptionFieldNumber = 999;
-  const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;
-  ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);
-  ::google::protobuf::UninterpretedOption* add_uninterpreted_option();
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
-      mutable_uninterpreted_option();
-  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
-      uninterpreted_option() const;
-
   // optional string java_package = 1;
   bool has_java_package() const;
   void clear_java_package();
   static const int kJavaPackageFieldNumber = 1;
   const ::std::string& java_package() const;
   void set_java_package(const ::std::string& value);
-  #if LANG_CXX11
-  void set_java_package(::std::string&& value);
-  #endif
   void set_java_package(const char* value);
   void set_java_package(const char* value, size_t size);
   ::std::string* mutable_java_package();
   ::std::string* release_java_package();
   void set_allocated_java_package(::std::string* java_package);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_java_package();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_java_package(
-      ::std::string* java_package);
 
   // optional string java_outer_classname = 8;
   bool has_java_outer_classname() const;
@@ -3157,174 +1936,11 @@
   static const int kJavaOuterClassnameFieldNumber = 8;
   const ::std::string& java_outer_classname() const;
   void set_java_outer_classname(const ::std::string& value);
-  #if LANG_CXX11
-  void set_java_outer_classname(::std::string&& value);
-  #endif
   void set_java_outer_classname(const char* value);
   void set_java_outer_classname(const char* value, size_t size);
   ::std::string* mutable_java_outer_classname();
   ::std::string* release_java_outer_classname();
   void set_allocated_java_outer_classname(::std::string* java_outer_classname);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_java_outer_classname();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_java_outer_classname(
-      ::std::string* java_outer_classname);
-
-  // optional string go_package = 11;
-  bool has_go_package() const;
-  void clear_go_package();
-  static const int kGoPackageFieldNumber = 11;
-  const ::std::string& go_package() const;
-  void set_go_package(const ::std::string& value);
-  #if LANG_CXX11
-  void set_go_package(::std::string&& value);
-  #endif
-  void set_go_package(const char* value);
-  void set_go_package(const char* value, size_t size);
-  ::std::string* mutable_go_package();
-  ::std::string* release_go_package();
-  void set_allocated_go_package(::std::string* go_package);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_go_package();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_go_package(
-      ::std::string* go_package);
-
-  // optional string objc_class_prefix = 36;
-  bool has_objc_class_prefix() const;
-  void clear_objc_class_prefix();
-  static const int kObjcClassPrefixFieldNumber = 36;
-  const ::std::string& objc_class_prefix() const;
-  void set_objc_class_prefix(const ::std::string& value);
-  #if LANG_CXX11
-  void set_objc_class_prefix(::std::string&& value);
-  #endif
-  void set_objc_class_prefix(const char* value);
-  void set_objc_class_prefix(const char* value, size_t size);
-  ::std::string* mutable_objc_class_prefix();
-  ::std::string* release_objc_class_prefix();
-  void set_allocated_objc_class_prefix(::std::string* objc_class_prefix);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_objc_class_prefix();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_objc_class_prefix(
-      ::std::string* objc_class_prefix);
-
-  // optional string csharp_namespace = 37;
-  bool has_csharp_namespace() const;
-  void clear_csharp_namespace();
-  static const int kCsharpNamespaceFieldNumber = 37;
-  const ::std::string& csharp_namespace() const;
-  void set_csharp_namespace(const ::std::string& value);
-  #if LANG_CXX11
-  void set_csharp_namespace(::std::string&& value);
-  #endif
-  void set_csharp_namespace(const char* value);
-  void set_csharp_namespace(const char* value, size_t size);
-  ::std::string* mutable_csharp_namespace();
-  ::std::string* release_csharp_namespace();
-  void set_allocated_csharp_namespace(::std::string* csharp_namespace);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_csharp_namespace();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_csharp_namespace(
-      ::std::string* csharp_namespace);
-
-  // optional string swift_prefix = 39;
-  bool has_swift_prefix() const;
-  void clear_swift_prefix();
-  static const int kSwiftPrefixFieldNumber = 39;
-  const ::std::string& swift_prefix() const;
-  void set_swift_prefix(const ::std::string& value);
-  #if LANG_CXX11
-  void set_swift_prefix(::std::string&& value);
-  #endif
-  void set_swift_prefix(const char* value);
-  void set_swift_prefix(const char* value, size_t size);
-  ::std::string* mutable_swift_prefix();
-  ::std::string* release_swift_prefix();
-  void set_allocated_swift_prefix(::std::string* swift_prefix);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_swift_prefix();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_swift_prefix(
-      ::std::string* swift_prefix);
-
-  // optional string php_class_prefix = 40;
-  bool has_php_class_prefix() const;
-  void clear_php_class_prefix();
-  static const int kPhpClassPrefixFieldNumber = 40;
-  const ::std::string& php_class_prefix() const;
-  void set_php_class_prefix(const ::std::string& value);
-  #if LANG_CXX11
-  void set_php_class_prefix(::std::string&& value);
-  #endif
-  void set_php_class_prefix(const char* value);
-  void set_php_class_prefix(const char* value, size_t size);
-  ::std::string* mutable_php_class_prefix();
-  ::std::string* release_php_class_prefix();
-  void set_allocated_php_class_prefix(::std::string* php_class_prefix);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_php_class_prefix();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_php_class_prefix(
-      ::std::string* php_class_prefix);
-
-  // optional string php_namespace = 41;
-  bool has_php_namespace() const;
-  void clear_php_namespace();
-  static const int kPhpNamespaceFieldNumber = 41;
-  const ::std::string& php_namespace() const;
-  void set_php_namespace(const ::std::string& value);
-  #if LANG_CXX11
-  void set_php_namespace(::std::string&& value);
-  #endif
-  void set_php_namespace(const char* value);
-  void set_php_namespace(const char* value, size_t size);
-  ::std::string* mutable_php_namespace();
-  ::std::string* release_php_namespace();
-  void set_allocated_php_namespace(::std::string* php_namespace);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_php_namespace();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_php_namespace(
-      ::std::string* php_namespace);
-
-  // optional bool cc_enable_arenas = 31 [default = false];
-  bool has_cc_enable_arenas() const;
-  void clear_cc_enable_arenas();
-  static const int kCcEnableArenasFieldNumber = 31;
-  bool cc_enable_arenas() const;
-  void set_cc_enable_arenas(bool value);
 
   // optional bool java_multiple_files = 10 [default = false];
   bool has_java_multiple_files() const;
@@ -3333,12 +1949,12 @@
   bool java_multiple_files() const;
   void set_java_multiple_files(bool value);
 
-  // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
-  GOOGLE_PROTOBUF_DEPRECATED_ATTR bool has_java_generate_equals_and_hash() const;
-  GOOGLE_PROTOBUF_DEPRECATED_ATTR void clear_java_generate_equals_and_hash();
-  GOOGLE_PROTOBUF_DEPRECATED_ATTR static const int kJavaGenerateEqualsAndHashFieldNumber = 20;
-  GOOGLE_PROTOBUF_DEPRECATED_ATTR bool java_generate_equals_and_hash() const;
-  GOOGLE_PROTOBUF_DEPRECATED_ATTR void set_java_generate_equals_and_hash(bool value);
+  // optional bool java_generate_equals_and_hash = 20 [default = false];
+  bool has_java_generate_equals_and_hash() const;
+  void clear_java_generate_equals_and_hash();
+  static const int kJavaGenerateEqualsAndHashFieldNumber = 20;
+  bool java_generate_equals_and_hash() const;
+  void set_java_generate_equals_and_hash(bool value);
 
   // optional bool java_string_check_utf8 = 27 [default = false];
   bool has_java_string_check_utf8() const;
@@ -3347,6 +1963,25 @@
   bool java_string_check_utf8() const;
   void set_java_string_check_utf8(bool value);
 
+  // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
+  bool has_optimize_for() const;
+  void clear_optimize_for();
+  static const int kOptimizeForFieldNumber = 9;
+  ::google::protobuf::FileOptions_OptimizeMode optimize_for() const;
+  void set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value);
+
+  // optional string go_package = 11;
+  bool has_go_package() const;
+  void clear_go_package();
+  static const int kGoPackageFieldNumber = 11;
+  const ::std::string& go_package() const;
+  void set_go_package(const ::std::string& value);
+  void set_go_package(const char* value);
+  void set_go_package(const char* value, size_t size);
+  ::std::string* mutable_go_package();
+  ::std::string* release_go_package();
+  void set_allocated_go_package(::std::string* go_package);
+
   // optional bool cc_generic_services = 16 [default = false];
   bool has_cc_generic_services() const;
   void clear_cc_generic_services();
@@ -3368,13 +2003,6 @@
   bool py_generic_services() const;
   void set_py_generic_services(bool value);
 
-  // optional bool php_generic_services = 42 [default = false];
-  bool has_php_generic_services() const;
-  void clear_php_generic_services();
-  static const int kPhpGenericServicesFieldNumber = 42;
-  bool php_generic_services() const;
-  void set_php_generic_services(bool value);
-
   // optional bool deprecated = 23 [default = false];
   bool has_deprecated() const;
   void clear_deprecated();
@@ -3382,185 +2010,36 @@
   bool deprecated() const;
   void set_deprecated(bool value);
 
-  // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
-  bool has_optimize_for() const;
-  void clear_optimize_for();
-  static const int kOptimizeForFieldNumber = 9;
-  ::google::protobuf::FileOptions_OptimizeMode optimize_for() const;
-  void set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value);
+  // optional bool cc_enable_arenas = 31 [default = false];
+  bool has_cc_enable_arenas() const;
+  void clear_cc_enable_arenas();
+  static const int kCcEnableArenasFieldNumber = 31;
+  bool cc_enable_arenas() const;
+  void set_cc_enable_arenas(bool value);
 
-  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FileOptions)
-  // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions)
- private:
-  void set_has_java_package();
-  void clear_has_java_package();
-  void set_has_java_outer_classname();
-  void clear_has_java_outer_classname();
-  void set_has_java_multiple_files();
-  void clear_has_java_multiple_files();
-  void set_has_java_generate_equals_and_hash();
-  void clear_has_java_generate_equals_and_hash();
-  void set_has_java_string_check_utf8();
-  void clear_has_java_string_check_utf8();
-  void set_has_optimize_for();
-  void clear_has_optimize_for();
-  void set_has_go_package();
-  void clear_has_go_package();
-  void set_has_cc_generic_services();
-  void clear_has_cc_generic_services();
-  void set_has_java_generic_services();
-  void clear_has_java_generic_services();
-  void set_has_py_generic_services();
-  void clear_has_py_generic_services();
-  void set_has_php_generic_services();
-  void clear_has_php_generic_services();
-  void set_has_deprecated();
-  void clear_has_deprecated();
-  void set_has_cc_enable_arenas();
-  void clear_has_cc_enable_arenas();
-  void set_has_objc_class_prefix();
-  void clear_has_objc_class_prefix();
-  void set_has_csharp_namespace();
-  void clear_has_csharp_namespace();
-  void set_has_swift_prefix();
-  void clear_has_swift_prefix();
-  void set_has_php_class_prefix();
-  void clear_has_php_class_prefix();
-  void set_has_php_namespace();
-  void clear_has_php_namespace();
+  // optional string objc_class_prefix = 36;
+  bool has_objc_class_prefix() const;
+  void clear_objc_class_prefix();
+  static const int kObjcClassPrefixFieldNumber = 36;
+  const ::std::string& objc_class_prefix() const;
+  void set_objc_class_prefix(const ::std::string& value);
+  void set_objc_class_prefix(const char* value);
+  void set_objc_class_prefix(const char* value, size_t size);
+  ::std::string* mutable_objc_class_prefix();
+  ::std::string* release_objc_class_prefix();
+  void set_allocated_objc_class_prefix(::std::string* objc_class_prefix);
 
-  ::google::protobuf::internal::ExtensionSet _extensions_;
-
-  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
-  mutable int _cached_size_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
-  ::google::protobuf::internal::ArenaStringPtr java_package_;
-  ::google::protobuf::internal::ArenaStringPtr java_outer_classname_;
-  ::google::protobuf::internal::ArenaStringPtr go_package_;
-  ::google::protobuf::internal::ArenaStringPtr objc_class_prefix_;
-  ::google::protobuf::internal::ArenaStringPtr csharp_namespace_;
-  ::google::protobuf::internal::ArenaStringPtr swift_prefix_;
-  ::google::protobuf::internal::ArenaStringPtr php_class_prefix_;
-  ::google::protobuf::internal::ArenaStringPtr php_namespace_;
-  bool cc_enable_arenas_;
-  bool java_multiple_files_;
-  bool java_generate_equals_and_hash_;
-  bool java_string_check_utf8_;
-  bool cc_generic_services_;
-  bool java_generic_services_;
-  bool py_generic_services_;
-  bool php_generic_services_;
-  bool deprecated_;
-  int optimize_for_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptionsImpl();
-};
-// -------------------------------------------------------------------
-
-class LIBPROTOBUF_EXPORT MessageOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MessageOptions) */ {
- public:
-  MessageOptions();
-  virtual ~MessageOptions();
-
-  MessageOptions(const MessageOptions& from);
-
-  inline MessageOptions& operator=(const MessageOptions& from) {
-    CopyFrom(from);
-    return *this;
-  }
-  #if LANG_CXX11
-  MessageOptions(MessageOptions&& from) noexcept
-    : MessageOptions() {
-    *this = ::std::move(from);
-  }
-
-  inline MessageOptions& operator=(MessageOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields();
-  }
-  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields();
-  }
-
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
-  static const ::google::protobuf::Descriptor* descriptor();
-  static const MessageOptions& default_instance();
-
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const MessageOptions* internal_default_instance() {
-    return reinterpret_cast<const MessageOptions*>(
-               &_MessageOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    14;
-
-  void UnsafeArenaSwap(MessageOptions* other);
-  void Swap(MessageOptions* other);
-  friend void swap(MessageOptions& a, MessageOptions& b) {
-    a.Swap(&b);
-  }
-
-  // implements Message ----------------------------------------------
-
-  inline MessageOptions* New() const PROTOBUF_FINAL { return New(NULL); }
-
-  MessageOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void CopyFrom(const MessageOptions& from);
-  void MergeFrom(const MessageOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
-
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
-  bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
-  void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
-  private:
-  void SharedCtor();
-  void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
-  void InternalSwap(MessageOptions* other);
-  protected:
-  explicit MessageOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
-  private:
-  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return _internal_metadata_.arena();
-  }
-  inline void* MaybeArenaPtr() const {
-    return _internal_metadata_.raw_arena_ptr();
-  }
-  public:
-
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
-
-  // nested types ----------------------------------------------------
-
-  // accessors -------------------------------------------------------
+  // optional string csharp_namespace = 37;
+  bool has_csharp_namespace() const;
+  void clear_csharp_namespace();
+  static const int kCsharpNamespaceFieldNumber = 37;
+  const ::std::string& csharp_namespace() const;
+  void set_csharp_namespace(const ::std::string& value);
+  void set_csharp_namespace(const char* value);
+  void set_csharp_namespace(const char* value, size_t size);
+  ::std::string* mutable_csharp_namespace();
+  ::std::string* release_csharp_namespace();
+  void set_allocated_csharp_namespace(::std::string* csharp_namespace);
 
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   int uninterpreted_option_size() const;
@@ -3574,6 +2053,131 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
       uninterpreted_option() const;
 
+  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FileOptions)
+  // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions)
+ private:
+  inline void set_has_java_package();
+  inline void clear_has_java_package();
+  inline void set_has_java_outer_classname();
+  inline void clear_has_java_outer_classname();
+  inline void set_has_java_multiple_files();
+  inline void clear_has_java_multiple_files();
+  inline void set_has_java_generate_equals_and_hash();
+  inline void clear_has_java_generate_equals_and_hash();
+  inline void set_has_java_string_check_utf8();
+  inline void clear_has_java_string_check_utf8();
+  inline void set_has_optimize_for();
+  inline void clear_has_optimize_for();
+  inline void set_has_go_package();
+  inline void clear_has_go_package();
+  inline void set_has_cc_generic_services();
+  inline void clear_has_cc_generic_services();
+  inline void set_has_java_generic_services();
+  inline void clear_has_java_generic_services();
+  inline void set_has_py_generic_services();
+  inline void clear_has_py_generic_services();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
+  inline void set_has_cc_enable_arenas();
+  inline void clear_has_cc_enable_arenas();
+  inline void set_has_objc_class_prefix();
+  inline void clear_has_objc_class_prefix();
+  inline void set_has_csharp_namespace();
+  inline void clear_has_csharp_namespace();
+
+  ::google::protobuf::internal::ExtensionSet _extensions_;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::uint32 _has_bits_[1];
+  mutable int _cached_size_;
+  ::google::protobuf::internal::ArenaStringPtr java_package_;
+  ::google::protobuf::internal::ArenaStringPtr java_outer_classname_;
+  bool java_multiple_files_;
+  bool java_generate_equals_and_hash_;
+  bool java_string_check_utf8_;
+  bool cc_generic_services_;
+  int optimize_for_;
+  ::google::protobuf::internal::ArenaStringPtr go_package_;
+  ::google::protobuf::internal::ArenaStringPtr objc_class_prefix_;
+  ::google::protobuf::internal::ArenaStringPtr csharp_namespace_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
+  bool java_generic_services_;
+  bool py_generic_services_;
+  bool deprecated_;
+  bool cc_enable_arenas_;
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static FileOptions* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class LIBPROTOBUF_EXPORT MessageOptions : public ::google::protobuf::Message {
+ public:
+  MessageOptions();
+  virtual ~MessageOptions();
+
+  MessageOptions(const MessageOptions& from);
+
+  inline MessageOptions& operator=(const MessageOptions& from) {
+    CopyFrom(from);
+    return *this;
+  }
+
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _internal_metadata_.unknown_fields();
+  }
+
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return _internal_metadata_.mutable_unknown_fields();
+  }
+
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const MessageOptions& default_instance();
+
+  void Swap(MessageOptions* other);
+
+  // implements Message ----------------------------------------------
+
+  inline MessageOptions* New() const { return New(NULL); }
+
+  MessageOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const MessageOptions& from);
+  void MergeFrom(const MessageOptions& from);
+  void Clear();
+  bool IsInitialized() const;
+
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  void InternalSwap(MessageOptions* other);
+  private:
+  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
+    return _internal_metadata_.arena();
+  }
+  inline void* MaybeArenaPtr() const {
+    return _internal_metadata_.raw_arena_ptr();
+  }
+  public:
+
+  ::google::protobuf::Metadata GetMetadata() const;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
   // optional bool message_set_wire_format = 1 [default = false];
   bool has_message_set_wire_format() const;
   void clear_message_set_wire_format();
@@ -3602,37 +2206,50 @@
   bool map_entry() const;
   void set_map_entry(bool value);
 
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  int uninterpreted_option_size() const;
+  void clear_uninterpreted_option();
+  static const int kUninterpretedOptionFieldNumber = 999;
+  const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;
+  ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);
+  ::google::protobuf::UninterpretedOption* add_uninterpreted_option();
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+      mutable_uninterpreted_option();
+  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+      uninterpreted_option() const;
+
   GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MessageOptions)
   // @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions)
  private:
-  void set_has_message_set_wire_format();
-  void clear_has_message_set_wire_format();
-  void set_has_no_standard_descriptor_accessor();
-  void clear_has_no_standard_descriptor_accessor();
-  void set_has_deprecated();
-  void clear_has_deprecated();
-  void set_has_map_entry();
-  void clear_has_map_entry();
+  inline void set_has_message_set_wire_format();
+  inline void clear_has_message_set_wire_format();
+  inline void set_has_no_standard_descriptor_accessor();
+  inline void clear_has_no_standard_descriptor_accessor();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
+  inline void set_has_map_entry();
+  inline void clear_has_map_entry();
 
   ::google::protobuf::internal::ExtensionSet _extensions_;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
   bool message_set_wire_format_;
   bool no_standard_descriptor_accessor_;
   bool deprecated_;
   bool map_entry_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptionsImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static MessageOptions* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT FieldOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldOptions) */ {
+class LIBPROTOBUF_EXPORT FieldOptions : public ::google::protobuf::Message {
  public:
   FieldOptions();
   virtual ~FieldOptions();
@@ -3643,81 +2260,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FieldOptions(FieldOptions&& from) noexcept
-    : FieldOptions() {
-    *this = ::std::move(from);
-  }
 
-  inline FieldOptions& operator=(FieldOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const FieldOptions& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FieldOptions* internal_default_instance() {
-    return reinterpret_cast<const FieldOptions*>(
-               &_FieldOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    15;
-
-  void UnsafeArenaSwap(FieldOptions* other);
   void Swap(FieldOptions* other);
-  friend void swap(FieldOptions& a, FieldOptions& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FieldOptions* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FieldOptions* New() const { return New(NULL); }
 
-  FieldOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FieldOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FieldOptions& from);
   void MergeFrom(const FieldOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FieldOptions* other);
-  protected:
-  explicit FieldOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -3727,7 +2307,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -3789,18 +2369,6 @@
 
   // accessors -------------------------------------------------------
 
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  int uninterpreted_option_size() const;
-  void clear_uninterpreted_option();
-  static const int kUninterpretedOptionFieldNumber = 999;
-  const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;
-  ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);
-  ::google::protobuf::UninterpretedOption* add_uninterpreted_option();
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
-      mutable_uninterpreted_option();
-  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
-      uninterpreted_option() const;
-
   // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
   bool has_ctype() const;
   void clear_ctype();
@@ -3815,6 +2383,13 @@
   bool packed() const;
   void set_packed(bool value);
 
+  // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
+  bool has_jstype() const;
+  void clear_jstype();
+  static const int kJstypeFieldNumber = 6;
+  ::google::protobuf::FieldOptions_JSType jstype() const;
+  void set_jstype(::google::protobuf::FieldOptions_JSType value);
+
   // optional bool lazy = 5 [default = false];
   bool has_lazy() const;
   void clear_lazy();
@@ -3836,150 +2411,6 @@
   bool weak() const;
   void set_weak(bool value);
 
-  // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
-  bool has_jstype() const;
-  void clear_jstype();
-  static const int kJstypeFieldNumber = 6;
-  ::google::protobuf::FieldOptions_JSType jstype() const;
-  void set_jstype(::google::protobuf::FieldOptions_JSType value);
-
-  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FieldOptions)
-  // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions)
- private:
-  void set_has_ctype();
-  void clear_has_ctype();
-  void set_has_packed();
-  void clear_has_packed();
-  void set_has_jstype();
-  void clear_has_jstype();
-  void set_has_lazy();
-  void clear_has_lazy();
-  void set_has_deprecated();
-  void clear_has_deprecated();
-  void set_has_weak();
-  void clear_has_weak();
-
-  ::google::protobuf::internal::ExtensionSet _extensions_;
-
-  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
-  mutable int _cached_size_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
-  int ctype_;
-  bool packed_;
-  bool lazy_;
-  bool deprecated_;
-  bool weak_;
-  int jstype_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptionsImpl();
-};
-// -------------------------------------------------------------------
-
-class LIBPROTOBUF_EXPORT OneofOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.OneofOptions) */ {
- public:
-  OneofOptions();
-  virtual ~OneofOptions();
-
-  OneofOptions(const OneofOptions& from);
-
-  inline OneofOptions& operator=(const OneofOptions& from) {
-    CopyFrom(from);
-    return *this;
-  }
-  #if LANG_CXX11
-  OneofOptions(OneofOptions&& from) noexcept
-    : OneofOptions() {
-    *this = ::std::move(from);
-  }
-
-  inline OneofOptions& operator=(OneofOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields();
-  }
-  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields();
-  }
-
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
-  static const ::google::protobuf::Descriptor* descriptor();
-  static const OneofOptions& default_instance();
-
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const OneofOptions* internal_default_instance() {
-    return reinterpret_cast<const OneofOptions*>(
-               &_OneofOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    16;
-
-  void UnsafeArenaSwap(OneofOptions* other);
-  void Swap(OneofOptions* other);
-  friend void swap(OneofOptions& a, OneofOptions& b) {
-    a.Swap(&b);
-  }
-
-  // implements Message ----------------------------------------------
-
-  inline OneofOptions* New() const PROTOBUF_FINAL { return New(NULL); }
-
-  OneofOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void CopyFrom(const OneofOptions& from);
-  void MergeFrom(const OneofOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
-
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
-  bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
-  void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
-  private:
-  void SharedCtor();
-  void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
-  void InternalSwap(OneofOptions* other);
-  protected:
-  explicit OneofOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
-  private:
-  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return _internal_metadata_.arena();
-  }
-  inline void* MaybeArenaPtr() const {
-    return _internal_metadata_.raw_arena_ptr();
-  }
-  public:
-
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
-
-  // nested types ----------------------------------------------------
-
-  // accessors -------------------------------------------------------
-
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   int uninterpreted_option_size() const;
   void clear_uninterpreted_option();
@@ -3992,25 +2423,44 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
       uninterpreted_option() const;
 
-  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(OneofOptions)
-  // @@protoc_insertion_point(class_scope:google.protobuf.OneofOptions)
+  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FieldOptions)
+  // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions)
  private:
+  inline void set_has_ctype();
+  inline void clear_has_ctype();
+  inline void set_has_packed();
+  inline void clear_has_packed();
+  inline void set_has_jstype();
+  inline void clear_has_jstype();
+  inline void set_has_lazy();
+  inline void clear_has_lazy();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
+  inline void set_has_weak();
+  inline void clear_has_weak();
 
   ::google::protobuf::internal::ExtensionSet _extensions_;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
+  int ctype_;
+  int jstype_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptionsImpl();
+  bool packed_;
+  bool lazy_;
+  bool deprecated_;
+  bool weak_;
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static FieldOptions* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT EnumOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumOptions) */ {
+class LIBPROTOBUF_EXPORT EnumOptions : public ::google::protobuf::Message {
  public:
   EnumOptions();
   virtual ~EnumOptions();
@@ -4021,81 +2471,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  EnumOptions(EnumOptions&& from) noexcept
-    : EnumOptions() {
-    *this = ::std::move(from);
-  }
 
-  inline EnumOptions& operator=(EnumOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const EnumOptions& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const EnumOptions* internal_default_instance() {
-    return reinterpret_cast<const EnumOptions*>(
-               &_EnumOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    17;
-
-  void UnsafeArenaSwap(EnumOptions* other);
   void Swap(EnumOptions* other);
-  friend void swap(EnumOptions& a, EnumOptions& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline EnumOptions* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline EnumOptions* New() const { return New(NULL); }
 
-  EnumOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  EnumOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const EnumOptions& from);
   void MergeFrom(const EnumOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(EnumOptions* other);
-  protected:
-  explicit EnumOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -4105,24 +2518,12 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-  int uninterpreted_option_size() const;
-  void clear_uninterpreted_option();
-  static const int kUninterpretedOptionFieldNumber = 999;
-  const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;
-  ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);
-  ::google::protobuf::UninterpretedOption* add_uninterpreted_option();
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
-      mutable_uninterpreted_option();
-  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
-      uninterpreted_option() const;
-
   // optional bool allow_alias = 2;
   bool has_allow_alias() const;
   void clear_allow_alias();
@@ -4137,31 +2538,44 @@
   bool deprecated() const;
   void set_deprecated(bool value);
 
+  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+  int uninterpreted_option_size() const;
+  void clear_uninterpreted_option();
+  static const int kUninterpretedOptionFieldNumber = 999;
+  const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;
+  ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);
+  ::google::protobuf::UninterpretedOption* add_uninterpreted_option();
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
+      mutable_uninterpreted_option();
+  const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
+      uninterpreted_option() const;
+
   GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumOptions)
   // @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions)
  private:
-  void set_has_allow_alias();
-  void clear_has_allow_alias();
-  void set_has_deprecated();
-  void clear_has_deprecated();
+  inline void set_has_allow_alias();
+  inline void clear_has_allow_alias();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
 
   ::google::protobuf::internal::ExtensionSet _extensions_;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
   bool allow_alias_;
   bool deprecated_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptionsImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static EnumOptions* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT EnumValueOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValueOptions) */ {
+class LIBPROTOBUF_EXPORT EnumValueOptions : public ::google::protobuf::Message {
  public:
   EnumValueOptions();
   virtual ~EnumValueOptions();
@@ -4172,81 +2586,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  EnumValueOptions(EnumValueOptions&& from) noexcept
-    : EnumValueOptions() {
-    *this = ::std::move(from);
-  }
 
-  inline EnumValueOptions& operator=(EnumValueOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const EnumValueOptions& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const EnumValueOptions* internal_default_instance() {
-    return reinterpret_cast<const EnumValueOptions*>(
-               &_EnumValueOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    18;
-
-  void UnsafeArenaSwap(EnumValueOptions* other);
   void Swap(EnumValueOptions* other);
-  friend void swap(EnumValueOptions& a, EnumValueOptions& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline EnumValueOptions* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline EnumValueOptions* New() const { return New(NULL); }
 
-  EnumValueOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  EnumValueOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const EnumValueOptions& from);
   void MergeFrom(const EnumValueOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(EnumValueOptions* other);
-  protected:
-  explicit EnumValueOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -4256,12 +2633,19 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional bool deprecated = 1 [default = false];
+  bool has_deprecated() const;
+  void clear_deprecated();
+  static const int kDeprecatedFieldNumber = 1;
+  bool deprecated() const;
+  void set_deprecated(bool value);
+
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   int uninterpreted_option_size() const;
   void clear_uninterpreted_option();
@@ -4274,35 +2658,29 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
       uninterpreted_option() const;
 
-  // optional bool deprecated = 1 [default = false];
-  bool has_deprecated() const;
-  void clear_deprecated();
-  static const int kDeprecatedFieldNumber = 1;
-  bool deprecated() const;
-  void set_deprecated(bool value);
-
   GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumValueOptions)
   // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions)
  private:
-  void set_has_deprecated();
-  void clear_has_deprecated();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
 
   ::google::protobuf::internal::ExtensionSet _extensions_;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
   bool deprecated_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptionsImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static EnumValueOptions* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT ServiceOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ServiceOptions) */ {
+class LIBPROTOBUF_EXPORT ServiceOptions : public ::google::protobuf::Message {
  public:
   ServiceOptions();
   virtual ~ServiceOptions();
@@ -4313,81 +2691,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  ServiceOptions(ServiceOptions&& from) noexcept
-    : ServiceOptions() {
-    *this = ::std::move(from);
-  }
 
-  inline ServiceOptions& operator=(ServiceOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const ServiceOptions& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const ServiceOptions* internal_default_instance() {
-    return reinterpret_cast<const ServiceOptions*>(
-               &_ServiceOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    19;
-
-  void UnsafeArenaSwap(ServiceOptions* other);
   void Swap(ServiceOptions* other);
-  friend void swap(ServiceOptions& a, ServiceOptions& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline ServiceOptions* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline ServiceOptions* New() const { return New(NULL); }
 
-  ServiceOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  ServiceOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const ServiceOptions& from);
   void MergeFrom(const ServiceOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(ServiceOptions* other);
-  protected:
-  explicit ServiceOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -4397,12 +2738,19 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional bool deprecated = 33 [default = false];
+  bool has_deprecated() const;
+  void clear_deprecated();
+  static const int kDeprecatedFieldNumber = 33;
+  bool deprecated() const;
+  void set_deprecated(bool value);
+
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   int uninterpreted_option_size() const;
   void clear_uninterpreted_option();
@@ -4415,35 +2763,29 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
       uninterpreted_option() const;
 
-  // optional bool deprecated = 33 [default = false];
-  bool has_deprecated() const;
-  void clear_deprecated();
-  static const int kDeprecatedFieldNumber = 33;
-  bool deprecated() const;
-  void set_deprecated(bool value);
-
   GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ServiceOptions)
   // @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions)
  private:
-  void set_has_deprecated();
-  void clear_has_deprecated();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
 
   ::google::protobuf::internal::ExtensionSet _extensions_;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
   bool deprecated_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptionsImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static ServiceOptions* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT MethodOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MethodOptions) */ {
+class LIBPROTOBUF_EXPORT MethodOptions : public ::google::protobuf::Message {
  public:
   MethodOptions();
   virtual ~MethodOptions();
@@ -4454,81 +2796,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  MethodOptions(MethodOptions&& from) noexcept
-    : MethodOptions() {
-    *this = ::std::move(from);
-  }
 
-  inline MethodOptions& operator=(MethodOptions&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const MethodOptions& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const MethodOptions* internal_default_instance() {
-    return reinterpret_cast<const MethodOptions*>(
-               &_MethodOptions_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    20;
-
-  void UnsafeArenaSwap(MethodOptions* other);
   void Swap(MethodOptions* other);
-  friend void swap(MethodOptions& a, MethodOptions& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline MethodOptions* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline MethodOptions* New() const { return New(NULL); }
 
-  MethodOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  MethodOptions* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const MethodOptions& from);
   void MergeFrom(const MethodOptions& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(MethodOptions* other);
-  protected:
-  explicit MethodOptions(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -4538,40 +2843,19 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
-  typedef MethodOptions_IdempotencyLevel IdempotencyLevel;
-  static const IdempotencyLevel IDEMPOTENCY_UNKNOWN =
-    MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN;
-  static const IdempotencyLevel NO_SIDE_EFFECTS =
-    MethodOptions_IdempotencyLevel_NO_SIDE_EFFECTS;
-  static const IdempotencyLevel IDEMPOTENT =
-    MethodOptions_IdempotencyLevel_IDEMPOTENT;
-  static inline bool IdempotencyLevel_IsValid(int value) {
-    return MethodOptions_IdempotencyLevel_IsValid(value);
-  }
-  static const IdempotencyLevel IdempotencyLevel_MIN =
-    MethodOptions_IdempotencyLevel_IdempotencyLevel_MIN;
-  static const IdempotencyLevel IdempotencyLevel_MAX =
-    MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX;
-  static const int IdempotencyLevel_ARRAYSIZE =
-    MethodOptions_IdempotencyLevel_IdempotencyLevel_ARRAYSIZE;
-  static inline const ::google::protobuf::EnumDescriptor*
-  IdempotencyLevel_descriptor() {
-    return MethodOptions_IdempotencyLevel_descriptor();
-  }
-  static inline const ::std::string& IdempotencyLevel_Name(IdempotencyLevel value) {
-    return MethodOptions_IdempotencyLevel_Name(value);
-  }
-  static inline bool IdempotencyLevel_Parse(const ::std::string& name,
-      IdempotencyLevel* value) {
-    return MethodOptions_IdempotencyLevel_Parse(name, value);
-  }
-
   // accessors -------------------------------------------------------
 
+  // optional bool deprecated = 33 [default = false];
+  bool has_deprecated() const;
+  void clear_deprecated();
+  static const int kDeprecatedFieldNumber = 33;
+  bool deprecated() const;
+  void set_deprecated(bool value);
+
   // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
   int uninterpreted_option_size() const;
   void clear_uninterpreted_option();
@@ -4584,45 +2868,29 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
       uninterpreted_option() const;
 
-  // optional bool deprecated = 33 [default = false];
-  bool has_deprecated() const;
-  void clear_deprecated();
-  static const int kDeprecatedFieldNumber = 33;
-  bool deprecated() const;
-  void set_deprecated(bool value);
-
-  // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
-  bool has_idempotency_level() const;
-  void clear_idempotency_level();
-  static const int kIdempotencyLevelFieldNumber = 34;
-  ::google::protobuf::MethodOptions_IdempotencyLevel idempotency_level() const;
-  void set_idempotency_level(::google::protobuf::MethodOptions_IdempotencyLevel value);
-
   GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MethodOptions)
   // @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions)
  private:
-  void set_has_deprecated();
-  void clear_has_deprecated();
-  void set_has_idempotency_level();
-  void clear_has_idempotency_level();
+  inline void set_has_deprecated();
+  inline void clear_has_deprecated();
 
   ::google::protobuf::internal::ExtensionSet _extensions_;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;
   bool deprecated_;
-  int idempotency_level_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptionsImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static MethodOptions* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT UninterpretedOption_NamePart : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UninterpretedOption.NamePart) */ {
+class LIBPROTOBUF_EXPORT UninterpretedOption_NamePart : public ::google::protobuf::Message {
  public:
   UninterpretedOption_NamePart();
   virtual ~UninterpretedOption_NamePart();
@@ -4633,81 +2901,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  UninterpretedOption_NamePart(UninterpretedOption_NamePart&& from) noexcept
-    : UninterpretedOption_NamePart() {
-    *this = ::std::move(from);
-  }
 
-  inline UninterpretedOption_NamePart& operator=(UninterpretedOption_NamePart&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const UninterpretedOption_NamePart& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const UninterpretedOption_NamePart* internal_default_instance() {
-    return reinterpret_cast<const UninterpretedOption_NamePart*>(
-               &_UninterpretedOption_NamePart_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    21;
-
-  void UnsafeArenaSwap(UninterpretedOption_NamePart* other);
   void Swap(UninterpretedOption_NamePart* other);
-  friend void swap(UninterpretedOption_NamePart& a, UninterpretedOption_NamePart& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline UninterpretedOption_NamePart* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline UninterpretedOption_NamePart* New() const { return New(NULL); }
 
-  UninterpretedOption_NamePart* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  UninterpretedOption_NamePart* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const UninterpretedOption_NamePart& from);
   void MergeFrom(const UninterpretedOption_NamePart& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(UninterpretedOption_NamePart* other);
-  protected:
-  explicit UninterpretedOption_NamePart(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -4717,7 +2948,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -4729,23 +2960,11 @@
   static const int kNamePartFieldNumber = 1;
   const ::std::string& name_part() const;
   void set_name_part(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name_part(::std::string&& value);
-  #endif
   void set_name_part(const char* value);
   void set_name_part(const char* value, size_t size);
   ::std::string* mutable_name_part();
   ::std::string* release_name_part();
   void set_allocated_name_part(::std::string* name_part);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name_part();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name_part(
-      ::std::string* name_part);
 
   // required bool is_extension = 2;
   bool has_is_extension() const;
@@ -4756,28 +2975,29 @@
 
   // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart)
  private:
-  void set_has_name_part();
-  void clear_has_name_part();
-  void set_has_is_extension();
-  void clear_has_is_extension();
+  inline void set_has_name_part();
+  inline void clear_has_name_part();
+  inline void set_has_is_extension();
+  inline void clear_has_is_extension();
 
-  // helper for ByteSizeLong()
-  size_t RequiredFieldsByteSizeFallback() const;
+  // helper for ByteSize()
+  int RequiredFieldsByteSizeFallback() const;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::internal::ArenaStringPtr name_part_;
   bool is_extension_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePartImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static UninterpretedOption_NamePart* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT UninterpretedOption : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UninterpretedOption) */ {
+class LIBPROTOBUF_EXPORT UninterpretedOption : public ::google::protobuf::Message {
  public:
   UninterpretedOption();
   virtual ~UninterpretedOption();
@@ -4788,81 +3008,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  UninterpretedOption(UninterpretedOption&& from) noexcept
-    : UninterpretedOption() {
-    *this = ::std::move(from);
-  }
 
-  inline UninterpretedOption& operator=(UninterpretedOption&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const UninterpretedOption& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const UninterpretedOption* internal_default_instance() {
-    return reinterpret_cast<const UninterpretedOption*>(
-               &_UninterpretedOption_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    22;
-
-  void UnsafeArenaSwap(UninterpretedOption* other);
   void Swap(UninterpretedOption* other);
-  friend void swap(UninterpretedOption& a, UninterpretedOption& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline UninterpretedOption* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline UninterpretedOption* New() const { return New(NULL); }
 
-  UninterpretedOption* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  UninterpretedOption* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const UninterpretedOption& from);
   void MergeFrom(const UninterpretedOption& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(UninterpretedOption* other);
-  protected:
-  explicit UninterpretedOption(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -4872,7 +3055,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -4898,71 +3081,11 @@
   static const int kIdentifierValueFieldNumber = 3;
   const ::std::string& identifier_value() const;
   void set_identifier_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_identifier_value(::std::string&& value);
-  #endif
   void set_identifier_value(const char* value);
   void set_identifier_value(const char* value, size_t size);
   ::std::string* mutable_identifier_value();
   ::std::string* release_identifier_value();
   void set_allocated_identifier_value(::std::string* identifier_value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_identifier_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_identifier_value(
-      ::std::string* identifier_value);
-
-  // optional bytes string_value = 7;
-  bool has_string_value() const;
-  void clear_string_value();
-  static const int kStringValueFieldNumber = 7;
-  const ::std::string& string_value() const;
-  void set_string_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_string_value(::std::string&& value);
-  #endif
-  void set_string_value(const char* value);
-  void set_string_value(const void* value, size_t size);
-  ::std::string* mutable_string_value();
-  ::std::string* release_string_value();
-  void set_allocated_string_value(::std::string* string_value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_string_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_string_value(
-      ::std::string* string_value);
-
-  // optional string aggregate_value = 8;
-  bool has_aggregate_value() const;
-  void clear_aggregate_value();
-  static const int kAggregateValueFieldNumber = 8;
-  const ::std::string& aggregate_value() const;
-  void set_aggregate_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_aggregate_value(::std::string&& value);
-  #endif
-  void set_aggregate_value(const char* value);
-  void set_aggregate_value(const char* value, size_t size);
-  ::std::string* mutable_aggregate_value();
-  ::std::string* release_aggregate_value();
-  void set_allocated_aggregate_value(::std::string* aggregate_value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_aggregate_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_aggregate_value(
-      ::std::string* aggregate_value);
 
   // optional uint64 positive_int_value = 4;
   bool has_positive_int_value() const;
@@ -4985,40 +3108,65 @@
   double double_value() const;
   void set_double_value(double value);
 
+  // optional bytes string_value = 7;
+  bool has_string_value() const;
+  void clear_string_value();
+  static const int kStringValueFieldNumber = 7;
+  const ::std::string& string_value() const;
+  void set_string_value(const ::std::string& value);
+  void set_string_value(const char* value);
+  void set_string_value(const void* value, size_t size);
+  ::std::string* mutable_string_value();
+  ::std::string* release_string_value();
+  void set_allocated_string_value(::std::string* string_value);
+
+  // optional string aggregate_value = 8;
+  bool has_aggregate_value() const;
+  void clear_aggregate_value();
+  static const int kAggregateValueFieldNumber = 8;
+  const ::std::string& aggregate_value() const;
+  void set_aggregate_value(const ::std::string& value);
+  void set_aggregate_value(const char* value);
+  void set_aggregate_value(const char* value, size_t size);
+  ::std::string* mutable_aggregate_value();
+  ::std::string* release_aggregate_value();
+  void set_allocated_aggregate_value(::std::string* aggregate_value);
+
   // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption)
  private:
-  void set_has_identifier_value();
-  void clear_has_identifier_value();
-  void set_has_positive_int_value();
-  void clear_has_positive_int_value();
-  void set_has_negative_int_value();
-  void clear_has_negative_int_value();
-  void set_has_double_value();
-  void clear_has_double_value();
-  void set_has_string_value();
-  void clear_has_string_value();
-  void set_has_aggregate_value();
-  void clear_has_aggregate_value();
+  inline void set_has_identifier_value();
+  inline void clear_has_identifier_value();
+  inline void set_has_positive_int_value();
+  inline void clear_has_positive_int_value();
+  inline void set_has_negative_int_value();
+  inline void clear_has_negative_int_value();
+  inline void set_has_double_value();
+  inline void clear_has_double_value();
+  inline void set_has_string_value();
+  inline void clear_has_string_value();
+  inline void set_has_aggregate_value();
+  inline void clear_has_aggregate_value();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart > name_;
   ::google::protobuf::internal::ArenaStringPtr identifier_value_;
-  ::google::protobuf::internal::ArenaStringPtr string_value_;
-  ::google::protobuf::internal::ArenaStringPtr aggregate_value_;
   ::google::protobuf::uint64 positive_int_value_;
   ::google::protobuf::int64 negative_int_value_;
   double double_value_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOptionImpl();
+  ::google::protobuf::internal::ArenaStringPtr string_value_;
+  ::google::protobuf::internal::ArenaStringPtr aggregate_value_;
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static UninterpretedOption* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT SourceCodeInfo_Location : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceCodeInfo.Location) */ {
+class LIBPROTOBUF_EXPORT SourceCodeInfo_Location : public ::google::protobuf::Message {
  public:
   SourceCodeInfo_Location();
   virtual ~SourceCodeInfo_Location();
@@ -5029,81 +3177,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  SourceCodeInfo_Location(SourceCodeInfo_Location&& from) noexcept
-    : SourceCodeInfo_Location() {
-    *this = ::std::move(from);
-  }
 
-  inline SourceCodeInfo_Location& operator=(SourceCodeInfo_Location&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const SourceCodeInfo_Location& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const SourceCodeInfo_Location* internal_default_instance() {
-    return reinterpret_cast<const SourceCodeInfo_Location*>(
-               &_SourceCodeInfo_Location_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    23;
-
-  void UnsafeArenaSwap(SourceCodeInfo_Location* other);
   void Swap(SourceCodeInfo_Location* other);
-  friend void swap(SourceCodeInfo_Location& a, SourceCodeInfo_Location& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline SourceCodeInfo_Location* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline SourceCodeInfo_Location* New() const { return New(NULL); }
 
-  SourceCodeInfo_Location* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  SourceCodeInfo_Location* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const SourceCodeInfo_Location& from);
   void MergeFrom(const SourceCodeInfo_Location& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(SourceCodeInfo_Location* other);
-  protected:
-  explicit SourceCodeInfo_Location(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -5113,7 +3224,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -5143,51 +3254,17 @@
   ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
       mutable_span();
 
-  // repeated string leading_detached_comments = 6;
-  int leading_detached_comments_size() const;
-  void clear_leading_detached_comments();
-  static const int kLeadingDetachedCommentsFieldNumber = 6;
-  const ::std::string& leading_detached_comments(int index) const;
-  ::std::string* mutable_leading_detached_comments(int index);
-  void set_leading_detached_comments(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_leading_detached_comments(int index, ::std::string&& value);
-  #endif
-  void set_leading_detached_comments(int index, const char* value);
-  void set_leading_detached_comments(int index, const char* value, size_t size);
-  ::std::string* add_leading_detached_comments();
-  void add_leading_detached_comments(const ::std::string& value);
-  #if LANG_CXX11
-  void add_leading_detached_comments(::std::string&& value);
-  #endif
-  void add_leading_detached_comments(const char* value);
-  void add_leading_detached_comments(const char* value, size_t size);
-  const ::google::protobuf::RepeatedPtrField< ::std::string>& leading_detached_comments() const;
-  ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_leading_detached_comments();
-
   // optional string leading_comments = 3;
   bool has_leading_comments() const;
   void clear_leading_comments();
   static const int kLeadingCommentsFieldNumber = 3;
   const ::std::string& leading_comments() const;
   void set_leading_comments(const ::std::string& value);
-  #if LANG_CXX11
-  void set_leading_comments(::std::string&& value);
-  #endif
   void set_leading_comments(const char* value);
   void set_leading_comments(const char* value, size_t size);
   ::std::string* mutable_leading_comments();
   ::std::string* release_leading_comments();
   void set_allocated_leading_comments(::std::string* leading_comments);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_leading_comments();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_leading_comments(
-      ::std::string* leading_comments);
 
   // optional string trailing_comments = 4;
   bool has_trailing_comments() const;
@@ -5195,50 +3272,55 @@
   static const int kTrailingCommentsFieldNumber = 4;
   const ::std::string& trailing_comments() const;
   void set_trailing_comments(const ::std::string& value);
-  #if LANG_CXX11
-  void set_trailing_comments(::std::string&& value);
-  #endif
   void set_trailing_comments(const char* value);
   void set_trailing_comments(const char* value, size_t size);
   ::std::string* mutable_trailing_comments();
   ::std::string* release_trailing_comments();
   void set_allocated_trailing_comments(::std::string* trailing_comments);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_trailing_comments();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_trailing_comments(
-      ::std::string* trailing_comments);
+
+  // repeated string leading_detached_comments = 6;
+  int leading_detached_comments_size() const;
+  void clear_leading_detached_comments();
+  static const int kLeadingDetachedCommentsFieldNumber = 6;
+  const ::std::string& leading_detached_comments(int index) const;
+  ::std::string* mutable_leading_detached_comments(int index);
+  void set_leading_detached_comments(int index, const ::std::string& value);
+  void set_leading_detached_comments(int index, const char* value);
+  void set_leading_detached_comments(int index, const char* value, size_t size);
+  ::std::string* add_leading_detached_comments();
+  void add_leading_detached_comments(const ::std::string& value);
+  void add_leading_detached_comments(const char* value);
+  void add_leading_detached_comments(const char* value, size_t size);
+  const ::google::protobuf::RepeatedPtrField< ::std::string>& leading_detached_comments() const;
+  ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_leading_detached_comments();
 
   // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location)
  private:
-  void set_has_leading_comments();
-  void clear_has_leading_comments();
-  void set_has_trailing_comments();
-  void clear_has_trailing_comments();
+  inline void set_has_leading_comments();
+  inline void clear_has_leading_comments();
+  inline void set_has_trailing_comments();
+  inline void clear_has_trailing_comments();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_;
   mutable int _path_cached_byte_size_;
   ::google::protobuf::RepeatedField< ::google::protobuf::int32 > span_;
   mutable int _span_cached_byte_size_;
-  ::google::protobuf::RepeatedPtrField< ::std::string> leading_detached_comments_;
   ::google::protobuf::internal::ArenaStringPtr leading_comments_;
   ::google::protobuf::internal::ArenaStringPtr trailing_comments_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_LocationImpl();
+  ::google::protobuf::RepeatedPtrField< ::std::string> leading_detached_comments_;
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static SourceCodeInfo_Location* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT SourceCodeInfo : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceCodeInfo) */ {
+class LIBPROTOBUF_EXPORT SourceCodeInfo : public ::google::protobuf::Message {
  public:
   SourceCodeInfo();
   virtual ~SourceCodeInfo();
@@ -5249,81 +3331,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  SourceCodeInfo(SourceCodeInfo&& from) noexcept
-    : SourceCodeInfo() {
-    *this = ::std::move(from);
-  }
 
-  inline SourceCodeInfo& operator=(SourceCodeInfo&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const SourceCodeInfo& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const SourceCodeInfo* internal_default_instance() {
-    return reinterpret_cast<const SourceCodeInfo*>(
-               &_SourceCodeInfo_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    24;
-
-  void UnsafeArenaSwap(SourceCodeInfo* other);
   void Swap(SourceCodeInfo* other);
-  friend void swap(SourceCodeInfo& a, SourceCodeInfo& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline SourceCodeInfo* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline SourceCodeInfo* New() const { return New(NULL); }
 
-  SourceCodeInfo* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  SourceCodeInfo* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const SourceCodeInfo& from);
   void MergeFrom(const SourceCodeInfo& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(SourceCodeInfo* other);
-  protected:
-  explicit SourceCodeInfo(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -5333,7 +3378,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -5357,18 +3402,19 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location > location_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static SourceCodeInfo* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT GeneratedCodeInfo_Annotation : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.GeneratedCodeInfo.Annotation) */ {
+class LIBPROTOBUF_EXPORT GeneratedCodeInfo_Annotation : public ::google::protobuf::Message {
  public:
   GeneratedCodeInfo_Annotation();
   virtual ~GeneratedCodeInfo_Annotation();
@@ -5379,81 +3425,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  GeneratedCodeInfo_Annotation(GeneratedCodeInfo_Annotation&& from) noexcept
-    : GeneratedCodeInfo_Annotation() {
-    *this = ::std::move(from);
-  }
 
-  inline GeneratedCodeInfo_Annotation& operator=(GeneratedCodeInfo_Annotation&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const GeneratedCodeInfo_Annotation& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const GeneratedCodeInfo_Annotation* internal_default_instance() {
-    return reinterpret_cast<const GeneratedCodeInfo_Annotation*>(
-               &_GeneratedCodeInfo_Annotation_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    25;
-
-  void UnsafeArenaSwap(GeneratedCodeInfo_Annotation* other);
   void Swap(GeneratedCodeInfo_Annotation* other);
-  friend void swap(GeneratedCodeInfo_Annotation& a, GeneratedCodeInfo_Annotation& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline GeneratedCodeInfo_Annotation* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline GeneratedCodeInfo_Annotation* New() const { return New(NULL); }
 
-  GeneratedCodeInfo_Annotation* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  GeneratedCodeInfo_Annotation* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const GeneratedCodeInfo_Annotation& from);
   void MergeFrom(const GeneratedCodeInfo_Annotation& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(GeneratedCodeInfo_Annotation* other);
-  protected:
-  explicit GeneratedCodeInfo_Annotation(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -5463,7 +3472,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -5487,23 +3496,11 @@
   static const int kSourceFileFieldNumber = 2;
   const ::std::string& source_file() const;
   void set_source_file(const ::std::string& value);
-  #if LANG_CXX11
-  void set_source_file(::std::string&& value);
-  #endif
   void set_source_file(const char* value);
   void set_source_file(const char* value, size_t size);
   ::std::string* mutable_source_file();
   ::std::string* release_source_file();
   void set_allocated_source_file(::std::string* source_file);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_source_file();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_source_file(
-      ::std::string* source_file);
 
   // optional int32 begin = 3;
   bool has_begin() const;
@@ -5521,30 +3518,31 @@
 
   // @@protoc_insertion_point(class_scope:google.protobuf.GeneratedCodeInfo.Annotation)
  private:
-  void set_has_source_file();
-  void clear_has_source_file();
-  void set_has_begin();
-  void clear_has_begin();
-  void set_has_end();
-  void clear_has_end();
+  inline void set_has_source_file();
+  inline void clear_has_source_file();
+  inline void set_has_begin();
+  inline void clear_has_begin();
+  inline void set_has_end();
+  inline void clear_has_end();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_;
   mutable int _path_cached_byte_size_;
   ::google::protobuf::internal::ArenaStringPtr source_file_;
   ::google::protobuf::int32 begin_;
   ::google::protobuf::int32 end_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_AnnotationImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static GeneratedCodeInfo_Annotation* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT GeneratedCodeInfo : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.GeneratedCodeInfo) */ {
+class LIBPROTOBUF_EXPORT GeneratedCodeInfo : public ::google::protobuf::Message {
  public:
   GeneratedCodeInfo();
   virtual ~GeneratedCodeInfo();
@@ -5555,81 +3553,44 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  GeneratedCodeInfo(GeneratedCodeInfo&& from) noexcept
-    : GeneratedCodeInfo() {
-    *this = ::std::move(from);
-  }
 
-  inline GeneratedCodeInfo& operator=(GeneratedCodeInfo&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     return _internal_metadata_.unknown_fields();
   }
+
   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     return _internal_metadata_.mutable_unknown_fields();
   }
 
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const GeneratedCodeInfo& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const GeneratedCodeInfo* internal_default_instance() {
-    return reinterpret_cast<const GeneratedCodeInfo*>(
-               &_GeneratedCodeInfo_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    26;
-
-  void UnsafeArenaSwap(GeneratedCodeInfo* other);
   void Swap(GeneratedCodeInfo* other);
-  friend void swap(GeneratedCodeInfo& a, GeneratedCodeInfo& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline GeneratedCodeInfo* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline GeneratedCodeInfo* New() const { return New(NULL); }
 
-  GeneratedCodeInfo* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  GeneratedCodeInfo* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const GeneratedCodeInfo& from);
   void MergeFrom(const GeneratedCodeInfo& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(GeneratedCodeInfo* other);
-  protected:
-  explicit GeneratedCodeInfo(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -5639,7 +3600,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -5663,24 +3624,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::internal::HasBits<1> _has_bits_;
+  ::google::protobuf::uint32 _has_bits_[1];
   mutable int _cached_size_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation > annotation_;
-  friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfoImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();
+
+  void InitAsDefaultInstance();
+  static GeneratedCodeInfo* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // FileDescriptorSet
 
 // repeated .google.protobuf.FileDescriptorProto file = 1;
@@ -5728,49 +3687,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void FileDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& FileDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void FileDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileDescriptorProto.name)
-}
-#endif
 inline void FileDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.name)
 }
-inline void FileDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void FileDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.name)
 }
 inline ::std::string* FileDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -5778,29 +3726,9 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.name)
 }
-inline ::std::string* FileDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.name)
-}
 
 // optional string package = 2;
 inline bool FileDescriptorProto::has_package() const {
@@ -5813,49 +3741,38 @@
   _has_bits_[0] &= ~0x00000002u;
 }
 inline void FileDescriptorProto::clear_package() {
-  package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_package();
 }
 inline const ::std::string& FileDescriptorProto::package() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.package)
-  return package_.Get();
+  return package_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileDescriptorProto::set_package(const ::std::string& value) {
   set_has_package();
-  package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.package)
 }
-#if LANG_CXX11
-inline void FileDescriptorProto::set_package(::std::string&& value) {
-  set_has_package();
-  package_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileDescriptorProto.package)
-}
-#endif
 inline void FileDescriptorProto::set_package(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_package();
-  package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.package)
 }
-inline void FileDescriptorProto::set_package(const char* value,
-    size_t size) {
+inline void FileDescriptorProto::set_package(const char* value, size_t size) {
   set_has_package();
-  package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.package)
 }
 inline ::std::string* FileDescriptorProto::mutable_package() {
   set_has_package();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.package)
-  return package_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return package_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileDescriptorProto::release_package() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.package)
   clear_has_package();
-  return package_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return package_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileDescriptorProto::set_allocated_package(::std::string* package) {
   if (package != NULL) {
@@ -5863,29 +3780,9 @@
   } else {
     clear_has_package();
   }
-  package_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), package,
-      GetArenaNoVirtual());
+  package_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), package);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.package)
 }
-inline ::std::string* FileDescriptorProto::unsafe_arena_release_package() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.package)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_package();
-  return package_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileDescriptorProto::unsafe_arena_set_allocated_package(
-    ::std::string* package) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (package != NULL) {
-    set_has_package();
-  } else {
-    clear_has_package();
-  }
-  package_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      package, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.package)
-}
 
 // repeated string dependency = 3;
 inline int FileDescriptorProto::dependency_size() const {
@@ -5906,14 +3803,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency)
   dependency_.Mutable(index)->assign(value);
 }
-#if LANG_CXX11
-inline void FileDescriptorProto::set_dependency(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency)
-  dependency_.Mutable(index)->assign(std::move(value));
-}
-#endif
 inline void FileDescriptorProto::set_dependency(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   dependency_.Mutable(index)->assign(value);
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.dependency)
 }
@@ -5930,14 +3820,7 @@
   dependency_.Add()->assign(value);
   // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency)
 }
-#if LANG_CXX11
-inline void FileDescriptorProto::add_dependency(::std::string&& value) {
-  dependency_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency)
-}
-#endif
 inline void FileDescriptorProto::add_dependency(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   dependency_.Add()->assign(value);
   // @@protoc_insertion_point(field_add_char:google.protobuf.FileDescriptorProto.dependency)
 }
@@ -6138,188 +4021,135 @@
 
 // optional .google.protobuf.FileOptions options = 8;
 inline bool FileDescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00000200u) != 0;
 }
 inline void FileDescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000200u;
 }
 inline void FileDescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000200u;
 }
 inline void FileDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::FileOptions& FileDescriptorProto::options() const {
-  const ::google::protobuf::FileOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::FileOptions*>(
-      &::google::protobuf::_FileOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::FileOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::FileOptions* FileDescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.options)
   clear_has_options();
   ::google::protobuf::FileOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::FileOptions* FileDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::FileOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.options)
-  return options_;
-}
 inline void FileDescriptorProto::set_allocated_options(::google::protobuf::FileOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.options)
 }
 
 // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
 inline bool FileDescriptorProto::has_source_code_info() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000400u) != 0;
 }
 inline void FileDescriptorProto::set_has_source_code_info() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000400u;
 }
 inline void FileDescriptorProto::clear_has_source_code_info() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000400u;
 }
 inline void FileDescriptorProto::clear_source_code_info() {
-  if (source_code_info_ != NULL) source_code_info_->Clear();
+  if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear();
   clear_has_source_code_info();
 }
 inline const ::google::protobuf::SourceCodeInfo& FileDescriptorProto::source_code_info() const {
-  const ::google::protobuf::SourceCodeInfo* p = source_code_info_;
   // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.source_code_info)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::SourceCodeInfo*>(
-      &::google::protobuf::_SourceCodeInfo_default_instance_);
+  return source_code_info_ != NULL ? *source_code_info_ : *default_instance_->source_code_info_;
+}
+inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() {
+  set_has_source_code_info();
+  if (source_code_info_ == NULL) {
+    source_code_info_ = new ::google::protobuf::SourceCodeInfo;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.source_code_info)
+  return source_code_info_;
 }
 inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_code_info() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.source_code_info)
   clear_has_source_code_info();
   ::google::protobuf::SourceCodeInfo* temp = source_code_info_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   source_code_info_ = NULL;
   return temp;
 }
-inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::unsafe_arena_release_source_code_info() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.source_code_info)
-  clear_has_source_code_info();
-  ::google::protobuf::SourceCodeInfo* temp = source_code_info_;
-  source_code_info_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() {
-  set_has_source_code_info();
-  if (source_code_info_ == NULL) {
-    _slow_mutable_source_code_info();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.source_code_info)
-  return source_code_info_;
-}
 inline void FileDescriptorProto::set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete source_code_info_;
-  }
+  delete source_code_info_;
+  source_code_info_ = source_code_info;
   if (source_code_info) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(source_code_info);
-    if (message_arena != submessage_arena) {
-      source_code_info = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, source_code_info, submessage_arena);
-    }
     set_has_source_code_info();
   } else {
     clear_has_source_code_info();
   }
-  source_code_info_ = source_code_info;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.source_code_info)
 }
 
 // optional string syntax = 12;
 inline bool FileDescriptorProto::has_syntax() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000800u) != 0;
 }
 inline void FileDescriptorProto::set_has_syntax() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000800u;
 }
 inline void FileDescriptorProto::clear_has_syntax() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000800u;
 }
 inline void FileDescriptorProto::clear_syntax() {
-  syntax_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  syntax_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_syntax();
 }
 inline const ::std::string& FileDescriptorProto::syntax() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.syntax)
-  return syntax_.Get();
+  return syntax_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileDescriptorProto::set_syntax(const ::std::string& value) {
   set_has_syntax();
-  syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  syntax_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.syntax)
 }
-#if LANG_CXX11
-inline void FileDescriptorProto::set_syntax(::std::string&& value) {
-  set_has_syntax();
-  syntax_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileDescriptorProto.syntax)
-}
-#endif
 inline void FileDescriptorProto::set_syntax(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_syntax();
-  syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  syntax_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.syntax)
 }
-inline void FileDescriptorProto::set_syntax(const char* value,
-    size_t size) {
+inline void FileDescriptorProto::set_syntax(const char* value, size_t size) {
   set_has_syntax();
-  syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  syntax_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.syntax)
 }
 inline ::std::string* FileDescriptorProto::mutable_syntax() {
   set_has_syntax();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.syntax)
-  return syntax_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return syntax_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileDescriptorProto::release_syntax() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.syntax)
   clear_has_syntax();
-  return syntax_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return syntax_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileDescriptorProto::set_allocated_syntax(::std::string* syntax) {
   if (syntax != NULL) {
@@ -6327,29 +4157,9 @@
   } else {
     clear_has_syntax();
   }
-  syntax_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), syntax,
-      GetArenaNoVirtual());
+  syntax_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), syntax);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.syntax)
 }
-inline ::std::string* FileDescriptorProto::unsafe_arena_release_syntax() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.syntax)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_syntax();
-  return syntax_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileDescriptorProto::unsafe_arena_set_allocated_syntax(
-    ::std::string* syntax) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (syntax != NULL) {
-    set_has_syntax();
-  } else {
-    clear_has_syntax();
-  }
-  syntax_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      syntax, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.syntax)
-}
 
 // -------------------------------------------------------------------
 
@@ -6357,13 +4167,13 @@
 
 // optional int32 start = 1;
 inline bool DescriptorProto_ExtensionRange::has_start() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000001u) != 0;
 }
 inline void DescriptorProto_ExtensionRange::set_has_start() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000001u;
 }
 inline void DescriptorProto_ExtensionRange::clear_has_start() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000001u;
 }
 inline void DescriptorProto_ExtensionRange::clear_start() {
   start_ = 0;
@@ -6381,13 +4191,13 @@
 
 // optional int32 end = 2;
 inline bool DescriptorProto_ExtensionRange::has_end() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000002u) != 0;
 }
 inline void DescriptorProto_ExtensionRange::set_has_end() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000002u;
 }
 inline void DescriptorProto_ExtensionRange::clear_has_end() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline void DescriptorProto_ExtensionRange::clear_end() {
   end_ = 0;
@@ -6403,71 +4213,6 @@
   // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.end)
 }
 
-// optional .google.protobuf.ExtensionRangeOptions options = 3;
-inline bool DescriptorProto_ExtensionRange::has_options() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
-}
-inline void DescriptorProto_ExtensionRange::set_has_options() {
-  _has_bits_[0] |= 0x00000001u;
-}
-inline void DescriptorProto_ExtensionRange::clear_has_options() {
-  _has_bits_[0] &= ~0x00000001u;
-}
-inline void DescriptorProto_ExtensionRange::clear_options() {
-  if (options_ != NULL) options_->Clear();
-  clear_has_options();
-}
-inline const ::google::protobuf::ExtensionRangeOptions& DescriptorProto_ExtensionRange::options() const {
-  const ::google::protobuf::ExtensionRangeOptions* p = options_;
-  // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::ExtensionRangeOptions*>(
-      &::google::protobuf::_ExtensionRangeOptions_default_instance_);
-}
-inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::release_options() {
-  // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.ExtensionRange.options)
-  clear_has_options();
-  ::google::protobuf::ExtensionRangeOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.DescriptorProto.ExtensionRange.options)
-  clear_has_options();
-  ::google::protobuf::ExtensionRangeOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.ExtensionRange.options)
-  return options_;
-}
-inline void DescriptorProto_ExtensionRange::set_allocated_options(::google::protobuf::ExtensionRangeOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
-  if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  options_ = options;
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.ExtensionRange.options)
-}
-
 // -------------------------------------------------------------------
 
 // DescriptorProto_ReservedRange
@@ -6535,49 +4280,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void DescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& DescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void DescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.name)
 }
-#if LANG_CXX11
-inline void DescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.DescriptorProto.name)
-}
-#endif
 inline void DescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.name)
 }
-inline void DescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void DescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.DescriptorProto.name)
 }
 inline ::std::string* DescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* DescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void DescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -6585,29 +4319,9 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.name)
 }
-inline ::std::string* DescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.DescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void DescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.DescriptorProto.name)
-}
 
 // repeated .google.protobuf.FieldDescriptorProto field = 2;
 inline int DescriptorProto::field_size() const {
@@ -6791,66 +4505,45 @@
 
 // optional .google.protobuf.MessageOptions options = 7;
 inline bool DescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000080u) != 0;
 }
 inline void DescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000080u;
 }
 inline void DescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000080u;
 }
 inline void DescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::MessageOptions& DescriptorProto::options() const {
-  const ::google::protobuf::MessageOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::MessageOptions*>(
-      &::google::protobuf::_MessageOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::MessageOptions* DescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::MessageOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::MessageOptions* DescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.options)
   clear_has_options();
   ::google::protobuf::MessageOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::MessageOptions* DescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.DescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::MessageOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::MessageOptions* DescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.options)
-  return options_;
-}
 inline void DescriptorProto::set_allocated_options(::google::protobuf::MessageOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.options)
 }
 
@@ -6903,14 +4596,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.reserved_name)
   reserved_name_.Mutable(index)->assign(value);
 }
-#if LANG_CXX11
-inline void DescriptorProto::set_reserved_name(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.reserved_name)
-  reserved_name_.Mutable(index)->assign(std::move(value));
-}
-#endif
 inline void DescriptorProto::set_reserved_name(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   reserved_name_.Mutable(index)->assign(value);
   // @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.reserved_name)
 }
@@ -6927,14 +4613,7 @@
   reserved_name_.Add()->assign(value);
   // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_name)
 }
-#if LANG_CXX11
-inline void DescriptorProto::add_reserved_name(::std::string&& value) {
-  reserved_name_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_name)
-}
-#endif
 inline void DescriptorProto::add_reserved_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   reserved_name_.Add()->assign(value);
   // @@protoc_insertion_point(field_add_char:google.protobuf.DescriptorProto.reserved_name)
 }
@@ -6955,40 +4634,6 @@
 
 // -------------------------------------------------------------------
 
-// ExtensionRangeOptions
-
-// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-inline int ExtensionRangeOptions::uninterpreted_option_size() const {
-  return uninterpreted_option_.size();
-}
-inline void ExtensionRangeOptions::clear_uninterpreted_option() {
-  uninterpreted_option_.Clear();
-}
-inline const ::google::protobuf::UninterpretedOption& ExtensionRangeOptions::uninterpreted_option(int index) const {
-  // @@protoc_insertion_point(field_get:google.protobuf.ExtensionRangeOptions.uninterpreted_option)
-  return uninterpreted_option_.Get(index);
-}
-inline ::google::protobuf::UninterpretedOption* ExtensionRangeOptions::mutable_uninterpreted_option(int index) {
-  // @@protoc_insertion_point(field_mutable:google.protobuf.ExtensionRangeOptions.uninterpreted_option)
-  return uninterpreted_option_.Mutable(index);
-}
-inline ::google::protobuf::UninterpretedOption* ExtensionRangeOptions::add_uninterpreted_option() {
-  // @@protoc_insertion_point(field_add:google.protobuf.ExtensionRangeOptions.uninterpreted_option)
-  return uninterpreted_option_.Add();
-}
-inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
-ExtensionRangeOptions::mutable_uninterpreted_option() {
-  // @@protoc_insertion_point(field_mutable_list:google.protobuf.ExtensionRangeOptions.uninterpreted_option)
-  return &uninterpreted_option_;
-}
-inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
-ExtensionRangeOptions::uninterpreted_option() const {
-  // @@protoc_insertion_point(field_list:google.protobuf.ExtensionRangeOptions.uninterpreted_option)
-  return uninterpreted_option_;
-}
-
-// -------------------------------------------------------------------
-
 // FieldDescriptorProto
 
 // optional string name = 1;
@@ -7002,49 +4647,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void FieldDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& FieldDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void FieldDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.name)
-}
-#endif
 inline void FieldDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.name)
 }
-inline void FieldDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void FieldDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.name)
 }
 inline ::std::string* FieldDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FieldDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -7052,39 +4686,19 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.name)
 }
-inline ::std::string* FieldDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FieldDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.name)
-}
 
 // optional int32 number = 3;
 inline bool FieldDescriptorProto::has_number() const {
-  return (_has_bits_[0] & 0x00000040u) != 0;
+  return (_has_bits_[0] & 0x00000002u) != 0;
 }
 inline void FieldDescriptorProto::set_has_number() {
-  _has_bits_[0] |= 0x00000040u;
+  _has_bits_[0] |= 0x00000002u;
 }
 inline void FieldDescriptorProto::clear_has_number() {
-  _has_bits_[0] &= ~0x00000040u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline void FieldDescriptorProto::clear_number() {
   number_ = 0;
@@ -7102,13 +4716,13 @@
 
 // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
 inline bool FieldDescriptorProto::has_label() const {
-  return (_has_bits_[0] & 0x00000100u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void FieldDescriptorProto::set_has_label() {
-  _has_bits_[0] |= 0x00000100u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void FieldDescriptorProto::clear_has_label() {
-  _has_bits_[0] &= ~0x00000100u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void FieldDescriptorProto::clear_label() {
   label_ = 1;
@@ -7127,13 +4741,13 @@
 
 // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
 inline bool FieldDescriptorProto::has_type() const {
-  return (_has_bits_[0] & 0x00000200u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void FieldDescriptorProto::set_has_type() {
-  _has_bits_[0] |= 0x00000200u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void FieldDescriptorProto::clear_has_type() {
-  _has_bits_[0] &= ~0x00000200u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void FieldDescriptorProto::clear_type() {
   type_ = 1;
@@ -7152,58 +4766,47 @@
 
 // optional string type_name = 6;
 inline bool FieldDescriptorProto::has_type_name() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
 inline void FieldDescriptorProto::set_has_type_name() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000010u;
 }
 inline void FieldDescriptorProto::clear_has_type_name() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 inline void FieldDescriptorProto::clear_type_name() {
-  type_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  type_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_type_name();
 }
 inline const ::std::string& FieldDescriptorProto::type_name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type_name)
-  return type_name_.Get();
+  return type_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_type_name(const ::std::string& value) {
   set_has_type_name();
-  type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  type_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type_name)
 }
-#if LANG_CXX11
-inline void FieldDescriptorProto::set_type_name(::std::string&& value) {
-  set_has_type_name();
-  type_name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.type_name)
-}
-#endif
 inline void FieldDescriptorProto::set_type_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_type_name();
-  type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  type_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.type_name)
 }
-inline void FieldDescriptorProto::set_type_name(const char* value,
-    size_t size) {
+inline void FieldDescriptorProto::set_type_name(const char* value, size_t size) {
   set_has_type_name();
-  type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  type_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.type_name)
 }
 inline ::std::string* FieldDescriptorProto::mutable_type_name() {
   set_has_type_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.type_name)
-  return type_name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return type_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FieldDescriptorProto::release_type_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.type_name)
   clear_has_type_name();
-  return type_name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return type_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_allocated_type_name(::std::string* type_name) {
   if (type_name != NULL) {
@@ -7211,84 +4814,53 @@
   } else {
     clear_has_type_name();
   }
-  type_name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_name,
-      GetArenaNoVirtual());
+  type_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.type_name)
 }
-inline ::std::string* FieldDescriptorProto::unsafe_arena_release_type_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.type_name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_type_name();
-  return type_name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FieldDescriptorProto::unsafe_arena_set_allocated_type_name(
-    ::std::string* type_name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (type_name != NULL) {
-    set_has_type_name();
-  } else {
-    clear_has_type_name();
-  }
-  type_name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      type_name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.type_name)
-}
 
 // optional string extendee = 2;
 inline bool FieldDescriptorProto::has_extendee() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 inline void FieldDescriptorProto::set_has_extendee() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000020u;
 }
 inline void FieldDescriptorProto::clear_has_extendee() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline void FieldDescriptorProto::clear_extendee() {
-  extendee_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  extendee_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_extendee();
 }
 inline const ::std::string& FieldDescriptorProto::extendee() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.extendee)
-  return extendee_.Get();
+  return extendee_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_extendee(const ::std::string& value) {
   set_has_extendee();
-  extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  extendee_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.extendee)
 }
-#if LANG_CXX11
-inline void FieldDescriptorProto::set_extendee(::std::string&& value) {
-  set_has_extendee();
-  extendee_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.extendee)
-}
-#endif
 inline void FieldDescriptorProto::set_extendee(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_extendee();
-  extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  extendee_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.extendee)
 }
-inline void FieldDescriptorProto::set_extendee(const char* value,
-    size_t size) {
+inline void FieldDescriptorProto::set_extendee(const char* value, size_t size) {
   set_has_extendee();
-  extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  extendee_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.extendee)
 }
 inline ::std::string* FieldDescriptorProto::mutable_extendee() {
   set_has_extendee();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.extendee)
-  return extendee_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return extendee_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FieldDescriptorProto::release_extendee() {
   // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.extendee)
   clear_has_extendee();
-  return extendee_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return extendee_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_allocated_extendee(::std::string* extendee) {
   if (extendee != NULL) {
@@ -7296,84 +4868,53 @@
   } else {
     clear_has_extendee();
   }
-  extendee_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), extendee,
-      GetArenaNoVirtual());
+  extendee_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), extendee);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.extendee)
 }
-inline ::std::string* FieldDescriptorProto::unsafe_arena_release_extendee() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.extendee)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_extendee();
-  return extendee_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FieldDescriptorProto::unsafe_arena_set_allocated_extendee(
-    ::std::string* extendee) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (extendee != NULL) {
-    set_has_extendee();
-  } else {
-    clear_has_extendee();
-  }
-  extendee_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      extendee, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.extendee)
-}
 
 // optional string default_value = 7;
 inline bool FieldDescriptorProto::has_default_value() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00000040u) != 0;
 }
 inline void FieldDescriptorProto::set_has_default_value() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000040u;
 }
 inline void FieldDescriptorProto::clear_has_default_value() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000040u;
 }
 inline void FieldDescriptorProto::clear_default_value() {
-  default_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  default_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_default_value();
 }
 inline const ::std::string& FieldDescriptorProto::default_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.default_value)
-  return default_value_.Get();
+  return default_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_default_value(const ::std::string& value) {
   set_has_default_value();
-  default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.default_value)
 }
-#if LANG_CXX11
-inline void FieldDescriptorProto::set_default_value(::std::string&& value) {
-  set_has_default_value();
-  default_value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.default_value)
-}
-#endif
 inline void FieldDescriptorProto::set_default_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_default_value();
-  default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.default_value)
 }
-inline void FieldDescriptorProto::set_default_value(const char* value,
-    size_t size) {
+inline void FieldDescriptorProto::set_default_value(const char* value, size_t size) {
   set_has_default_value();
-  default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.default_value)
 }
 inline ::std::string* FieldDescriptorProto::mutable_default_value() {
   set_has_default_value();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.default_value)
-  return default_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return default_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FieldDescriptorProto::release_default_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.default_value)
   clear_has_default_value();
-  return default_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return default_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_allocated_default_value(::std::string* default_value) {
   if (default_value != NULL) {
@@ -7381,29 +4922,9 @@
   } else {
     clear_has_default_value();
   }
-  default_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value,
-      GetArenaNoVirtual());
+  default_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.default_value)
 }
-inline ::std::string* FieldDescriptorProto::unsafe_arena_release_default_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.default_value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_default_value();
-  return default_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FieldDescriptorProto::unsafe_arena_set_allocated_default_value(
-    ::std::string* default_value) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (default_value != NULL) {
-    set_has_default_value();
-  } else {
-    clear_has_default_value();
-  }
-  default_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      default_value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.default_value)
-}
 
 // optional int32 oneof_index = 9;
 inline bool FieldDescriptorProto::has_oneof_index() const {
@@ -7431,58 +4952,47 @@
 
 // optional string json_name = 10;
 inline bool FieldDescriptorProto::has_json_name() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000100u) != 0;
 }
 inline void FieldDescriptorProto::set_has_json_name() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000100u;
 }
 inline void FieldDescriptorProto::clear_has_json_name() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000100u;
 }
 inline void FieldDescriptorProto::clear_json_name() {
-  json_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  json_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_json_name();
 }
 inline const ::std::string& FieldDescriptorProto::json_name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.json_name)
-  return json_name_.Get();
+  return json_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_json_name(const ::std::string& value) {
   set_has_json_name();
-  json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.json_name)
 }
-#if LANG_CXX11
-inline void FieldDescriptorProto::set_json_name(::std::string&& value) {
-  set_has_json_name();
-  json_name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.json_name)
-}
-#endif
 inline void FieldDescriptorProto::set_json_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_json_name();
-  json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.json_name)
 }
-inline void FieldDescriptorProto::set_json_name(const char* value,
-    size_t size) {
+inline void FieldDescriptorProto::set_json_name(const char* value, size_t size) {
   set_has_json_name();
-  json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.json_name)
 }
 inline ::std::string* FieldDescriptorProto::mutable_json_name() {
   set_has_json_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.json_name)
-  return json_name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return json_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FieldDescriptorProto::release_json_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.json_name)
   clear_has_json_name();
-  return json_name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return json_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FieldDescriptorProto::set_allocated_json_name(::std::string* json_name) {
   if (json_name != NULL) {
@@ -7490,92 +5000,51 @@
   } else {
     clear_has_json_name();
   }
-  json_name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name,
-      GetArenaNoVirtual());
+  json_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.json_name)
 }
-inline ::std::string* FieldDescriptorProto::unsafe_arena_release_json_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.json_name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_json_name();
-  return json_name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FieldDescriptorProto::unsafe_arena_set_allocated_json_name(
-    ::std::string* json_name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (json_name != NULL) {
-    set_has_json_name();
-  } else {
-    clear_has_json_name();
-  }
-  json_name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      json_name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.json_name)
-}
 
 // optional .google.protobuf.FieldOptions options = 8;
 inline bool FieldDescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return (_has_bits_[0] & 0x00000200u) != 0;
 }
 inline void FieldDescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000020u;
+  _has_bits_[0] |= 0x00000200u;
 }
 inline void FieldDescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000020u;
+  _has_bits_[0] &= ~0x00000200u;
 }
 inline void FieldDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::FieldOptions& FieldDescriptorProto::options() const {
-  const ::google::protobuf::FieldOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::FieldOptions*>(
-      &::google::protobuf::_FieldOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::FieldOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.options)
   clear_has_options();
   ::google::protobuf::FieldOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::FieldOptions* FieldDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::FieldOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.options)
-  return options_;
-}
 inline void FieldDescriptorProto::set_allocated_options(::google::protobuf::FieldOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.options)
 }
 
@@ -7594,49 +5063,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void OneofDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& OneofDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.OneofDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void OneofDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.OneofDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void OneofDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.OneofDescriptorProto.name)
-}
-#endif
 inline void OneofDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.OneofDescriptorProto.name)
 }
-inline void OneofDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void OneofDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.OneofDescriptorProto.name)
 }
 inline ::std::string* OneofDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.OneofDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* OneofDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.OneofDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void OneofDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -7644,146 +5102,9 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.OneofDescriptorProto.name)
 }
-inline ::std::string* OneofDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.OneofDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void OneofDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.OneofDescriptorProto.name)
-}
-
-// optional .google.protobuf.OneofOptions options = 2;
-inline bool OneofDescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void OneofDescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void OneofDescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000002u;
-}
-inline void OneofDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
-  clear_has_options();
-}
-inline const ::google::protobuf::OneofOptions& OneofDescriptorProto::options() const {
-  const ::google::protobuf::OneofOptions* p = options_;
-  // @@protoc_insertion_point(field_get:google.protobuf.OneofDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::OneofOptions*>(
-      &::google::protobuf::_OneofOptions_default_instance_);
-}
-inline ::google::protobuf::OneofOptions* OneofDescriptorProto::release_options() {
-  // @@protoc_insertion_point(field_release:google.protobuf.OneofDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::OneofOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::OneofOptions* OneofDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.OneofDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::OneofOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::OneofOptions* OneofDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.OneofDescriptorProto.options)
-  return options_;
-}
-inline void OneofDescriptorProto::set_allocated_options(::google::protobuf::OneofOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
-  if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
-    set_has_options();
-  } else {
-    clear_has_options();
-  }
-  options_ = options;
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.OneofDescriptorProto.options)
-}
-
-// -------------------------------------------------------------------
-
-// EnumDescriptorProto_EnumReservedRange
-
-// optional int32 start = 1;
-inline bool EnumDescriptorProto_EnumReservedRange::has_start() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
-}
-inline void EnumDescriptorProto_EnumReservedRange::set_has_start() {
-  _has_bits_[0] |= 0x00000001u;
-}
-inline void EnumDescriptorProto_EnumReservedRange::clear_has_start() {
-  _has_bits_[0] &= ~0x00000001u;
-}
-inline void EnumDescriptorProto_EnumReservedRange::clear_start() {
-  start_ = 0;
-  clear_has_start();
-}
-inline ::google::protobuf::int32 EnumDescriptorProto_EnumReservedRange::start() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.EnumReservedRange.start)
-  return start_;
-}
-inline void EnumDescriptorProto_EnumReservedRange::set_start(::google::protobuf::int32 value) {
-  set_has_start();
-  start_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.EnumReservedRange.start)
-}
-
-// optional int32 end = 2;
-inline bool EnumDescriptorProto_EnumReservedRange::has_end() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void EnumDescriptorProto_EnumReservedRange::set_has_end() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void EnumDescriptorProto_EnumReservedRange::clear_has_end() {
-  _has_bits_[0] &= ~0x00000002u;
-}
-inline void EnumDescriptorProto_EnumReservedRange::clear_end() {
-  end_ = 0;
-  clear_has_end();
-}
-inline ::google::protobuf::int32 EnumDescriptorProto_EnumReservedRange::end() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.EnumReservedRange.end)
-  return end_;
-}
-inline void EnumDescriptorProto_EnumReservedRange::set_end(::google::protobuf::int32 value) {
-  set_has_end();
-  end_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.EnumReservedRange.end)
-}
 
 // -------------------------------------------------------------------
 
@@ -7800,49 +5121,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void EnumDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& EnumDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void EnumDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void EnumDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.EnumDescriptorProto.name)
-}
-#endif
 inline void EnumDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.EnumDescriptorProto.name)
 }
-inline void EnumDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void EnumDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumDescriptorProto.name)
 }
 inline ::std::string* EnumDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* EnumDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void EnumDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -7850,29 +5160,9 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.name)
 }
-inline ::std::string* EnumDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void EnumDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumDescriptorProto.name)
-}
 
 // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
 inline int EnumDescriptorProto::value_size() const {
@@ -7906,168 +5196,48 @@
 
 // optional .google.protobuf.EnumOptions options = 3;
 inline bool EnumDescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void EnumDescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void EnumDescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void EnumDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::EnumOptions& EnumDescriptorProto::options() const {
-  const ::google::protobuf::EnumOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::EnumOptions*>(
-      &::google::protobuf::_EnumOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::EnumOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.options)
   clear_has_options();
   ::google::protobuf::EnumOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::EnumOptions* EnumDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::EnumOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.options)
-  return options_;
-}
 inline void EnumDescriptorProto::set_allocated_options(::google::protobuf::EnumOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.options)
 }
 
-// repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
-inline int EnumDescriptorProto::reserved_range_size() const {
-  return reserved_range_.size();
-}
-inline void EnumDescriptorProto::clear_reserved_range() {
-  reserved_range_.Clear();
-}
-inline const ::google::protobuf::EnumDescriptorProto_EnumReservedRange& EnumDescriptorProto::reserved_range(int index) const {
-  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.reserved_range)
-  return reserved_range_.Get(index);
-}
-inline ::google::protobuf::EnumDescriptorProto_EnumReservedRange* EnumDescriptorProto::mutable_reserved_range(int index) {
-  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.reserved_range)
-  return reserved_range_.Mutable(index);
-}
-inline ::google::protobuf::EnumDescriptorProto_EnumReservedRange* EnumDescriptorProto::add_reserved_range() {
-  // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_range)
-  return reserved_range_.Add();
-}
-inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >*
-EnumDescriptorProto::mutable_reserved_range() {
-  // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.reserved_range)
-  return &reserved_range_;
-}
-inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >&
-EnumDescriptorProto::reserved_range() const {
-  // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.reserved_range)
-  return reserved_range_;
-}
-
-// repeated string reserved_name = 5;
-inline int EnumDescriptorProto::reserved_name_size() const {
-  return reserved_name_.size();
-}
-inline void EnumDescriptorProto::clear_reserved_name() {
-  reserved_name_.Clear();
-}
-inline const ::std::string& EnumDescriptorProto::reserved_name(int index) const {
-  // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.reserved_name)
-  return reserved_name_.Get(index);
-}
-inline ::std::string* EnumDescriptorProto::mutable_reserved_name(int index) {
-  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.reserved_name)
-  return reserved_name_.Mutable(index);
-}
-inline void EnumDescriptorProto::set_reserved_name(int index, const ::std::string& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.reserved_name)
-  reserved_name_.Mutable(index)->assign(value);
-}
-#if LANG_CXX11
-inline void EnumDescriptorProto::set_reserved_name(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.reserved_name)
-  reserved_name_.Mutable(index)->assign(std::move(value));
-}
-#endif
-inline void EnumDescriptorProto::set_reserved_name(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
-  reserved_name_.Mutable(index)->assign(value);
-  // @@protoc_insertion_point(field_set_char:google.protobuf.EnumDescriptorProto.reserved_name)
-}
-inline void EnumDescriptorProto::set_reserved_name(int index, const char* value, size_t size) {
-  reserved_name_.Mutable(index)->assign(
-    reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumDescriptorProto.reserved_name)
-}
-inline ::std::string* EnumDescriptorProto::add_reserved_name() {
-  // @@protoc_insertion_point(field_add_mutable:google.protobuf.EnumDescriptorProto.reserved_name)
-  return reserved_name_.Add();
-}
-inline void EnumDescriptorProto::add_reserved_name(const ::std::string& value) {
-  reserved_name_.Add()->assign(value);
-  // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_name)
-}
-#if LANG_CXX11
-inline void EnumDescriptorProto::add_reserved_name(::std::string&& value) {
-  reserved_name_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_name)
-}
-#endif
-inline void EnumDescriptorProto::add_reserved_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
-  reserved_name_.Add()->assign(value);
-  // @@protoc_insertion_point(field_add_char:google.protobuf.EnumDescriptorProto.reserved_name)
-}
-inline void EnumDescriptorProto::add_reserved_name(const char* value, size_t size) {
-  reserved_name_.Add()->assign(reinterpret_cast<const char*>(value), size);
-  // @@protoc_insertion_point(field_add_pointer:google.protobuf.EnumDescriptorProto.reserved_name)
-}
-inline const ::google::protobuf::RepeatedPtrField< ::std::string>&
-EnumDescriptorProto::reserved_name() const {
-  // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.reserved_name)
-  return reserved_name_;
-}
-inline ::google::protobuf::RepeatedPtrField< ::std::string>*
-EnumDescriptorProto::mutable_reserved_name() {
-  // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.reserved_name)
-  return &reserved_name_;
-}
-
 // -------------------------------------------------------------------
 
 // EnumValueDescriptorProto
@@ -8083,49 +5253,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void EnumValueDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& EnumValueDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void EnumValueDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void EnumValueDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.EnumValueDescriptorProto.name)
-}
-#endif
 inline void EnumValueDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.EnumValueDescriptorProto.name)
 }
-inline void EnumValueDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void EnumValueDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumValueDescriptorProto.name)
 }
 inline ::std::string* EnumValueDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* EnumValueDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void EnumValueDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -8133,39 +5292,19 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.name)
 }
-inline ::std::string* EnumValueDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumValueDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void EnumValueDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumValueDescriptorProto.name)
-}
 
 // optional int32 number = 2;
 inline bool EnumValueDescriptorProto::has_number() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000002u) != 0;
 }
 inline void EnumValueDescriptorProto::set_has_number() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000002u;
 }
 inline void EnumValueDescriptorProto::clear_has_number() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline void EnumValueDescriptorProto::clear_number() {
   number_ = 0;
@@ -8183,66 +5322,45 @@
 
 // optional .google.protobuf.EnumValueOptions options = 3;
 inline bool EnumValueDescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void EnumValueDescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void EnumValueDescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void EnumValueDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::EnumValueOptions& EnumValueDescriptorProto::options() const {
-  const ::google::protobuf::EnumValueOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::EnumValueOptions*>(
-      &::google::protobuf::_EnumValueOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::EnumValueOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.options)
   clear_has_options();
   ::google::protobuf::EnumValueOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumValueDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::EnumValueOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.options)
-  return options_;
-}
 inline void EnumValueDescriptorProto::set_allocated_options(::google::protobuf::EnumValueOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.options)
 }
 
@@ -8261,49 +5379,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void ServiceDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& ServiceDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void ServiceDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.ServiceDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void ServiceDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.ServiceDescriptorProto.name)
-}
-#endif
 inline void ServiceDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.ServiceDescriptorProto.name)
 }
-inline void ServiceDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void ServiceDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.ServiceDescriptorProto.name)
 }
 inline ::std::string* ServiceDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* ServiceDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void ServiceDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -8311,29 +5418,9 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.name)
 }
-inline ::std::string* ServiceDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.ServiceDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void ServiceDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.ServiceDescriptorProto.name)
-}
 
 // repeated .google.protobuf.MethodDescriptorProto method = 2;
 inline int ServiceDescriptorProto::method_size() const {
@@ -8367,66 +5454,45 @@
 
 // optional .google.protobuf.ServiceOptions options = 3;
 inline bool ServiceDescriptorProto::has_options() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void ServiceDescriptorProto::set_has_options() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void ServiceDescriptorProto::clear_has_options() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void ServiceDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::ServiceOptions& ServiceDescriptorProto::options() const {
-  const ::google::protobuf::ServiceOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::ServiceOptions*>(
-      &::google::protobuf::_ServiceOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::ServiceOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.options)
   clear_has_options();
   ::google::protobuf::ServiceOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.ServiceDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::ServiceOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.options)
-  return options_;
-}
 inline void ServiceDescriptorProto::set_allocated_options(::google::protobuf::ServiceOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.options)
 }
 
@@ -8445,49 +5511,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void MethodDescriptorProto::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name();
 }
 inline const ::std::string& MethodDescriptorProto::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void MethodDescriptorProto::set_name(const ::std::string& value) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.name)
 }
-#if LANG_CXX11
-inline void MethodDescriptorProto::set_name(::std::string&& value) {
-  set_has_name();
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.MethodDescriptorProto.name)
-}
-#endif
 inline void MethodDescriptorProto::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.name)
 }
-inline void MethodDescriptorProto::set_name(const char* value,
-    size_t size) {
+inline void MethodDescriptorProto::set_name(const char* value, size_t size) {
   set_has_name();
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.name)
 }
 inline ::std::string* MethodDescriptorProto::mutable_name() {
   set_has_name();
   // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* MethodDescriptorProto::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.name)
   clear_has_name();
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void MethodDescriptorProto::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -8495,29 +5550,9 @@
   } else {
     clear_has_name();
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.name)
 }
-inline ::std::string* MethodDescriptorProto::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name();
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void MethodDescriptorProto::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    set_has_name();
-  } else {
-    clear_has_name();
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.name)
-}
 
 // optional string input_type = 2;
 inline bool MethodDescriptorProto::has_input_type() const {
@@ -8530,49 +5565,38 @@
   _has_bits_[0] &= ~0x00000002u;
 }
 inline void MethodDescriptorProto::clear_input_type() {
-  input_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  input_type_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_input_type();
 }
 inline const ::std::string& MethodDescriptorProto::input_type() const {
   // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.input_type)
-  return input_type_.Get();
+  return input_type_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void MethodDescriptorProto::set_input_type(const ::std::string& value) {
   set_has_input_type();
-  input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  input_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.input_type)
 }
-#if LANG_CXX11
-inline void MethodDescriptorProto::set_input_type(::std::string&& value) {
-  set_has_input_type();
-  input_type_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.MethodDescriptorProto.input_type)
-}
-#endif
 inline void MethodDescriptorProto::set_input_type(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_input_type();
-  input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  input_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.input_type)
 }
-inline void MethodDescriptorProto::set_input_type(const char* value,
-    size_t size) {
+inline void MethodDescriptorProto::set_input_type(const char* value, size_t size) {
   set_has_input_type();
-  input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  input_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.input_type)
 }
 inline ::std::string* MethodDescriptorProto::mutable_input_type() {
   set_has_input_type();
   // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.input_type)
-  return input_type_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return input_type_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* MethodDescriptorProto::release_input_type() {
   // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.input_type)
   clear_has_input_type();
-  return input_type_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return input_type_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void MethodDescriptorProto::set_allocated_input_type(::std::string* input_type) {
   if (input_type != NULL) {
@@ -8580,29 +5604,9 @@
   } else {
     clear_has_input_type();
   }
-  input_type_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), input_type,
-      GetArenaNoVirtual());
+  input_type_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), input_type);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.input_type)
 }
-inline ::std::string* MethodDescriptorProto::unsafe_arena_release_input_type() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.input_type)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_input_type();
-  return input_type_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void MethodDescriptorProto::unsafe_arena_set_allocated_input_type(
-    ::std::string* input_type) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (input_type != NULL) {
-    set_has_input_type();
-  } else {
-    clear_has_input_type();
-  }
-  input_type_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      input_type, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.input_type)
-}
 
 // optional string output_type = 3;
 inline bool MethodDescriptorProto::has_output_type() const {
@@ -8615,49 +5619,38 @@
   _has_bits_[0] &= ~0x00000004u;
 }
 inline void MethodDescriptorProto::clear_output_type() {
-  output_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  output_type_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_output_type();
 }
 inline const ::std::string& MethodDescriptorProto::output_type() const {
   // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.output_type)
-  return output_type_.Get();
+  return output_type_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void MethodDescriptorProto::set_output_type(const ::std::string& value) {
   set_has_output_type();
-  output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  output_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.output_type)
 }
-#if LANG_CXX11
-inline void MethodDescriptorProto::set_output_type(::std::string&& value) {
-  set_has_output_type();
-  output_type_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.MethodDescriptorProto.output_type)
-}
-#endif
 inline void MethodDescriptorProto::set_output_type(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_output_type();
-  output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  output_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.output_type)
 }
-inline void MethodDescriptorProto::set_output_type(const char* value,
-    size_t size) {
+inline void MethodDescriptorProto::set_output_type(const char* value, size_t size) {
   set_has_output_type();
-  output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  output_type_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.output_type)
 }
 inline ::std::string* MethodDescriptorProto::mutable_output_type() {
   set_has_output_type();
   // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.output_type)
-  return output_type_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return output_type_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* MethodDescriptorProto::release_output_type() {
   // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.output_type)
   clear_has_output_type();
-  return output_type_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return output_type_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void MethodDescriptorProto::set_allocated_output_type(::std::string* output_type) {
   if (output_type != NULL) {
@@ -8665,29 +5658,9 @@
   } else {
     clear_has_output_type();
   }
-  output_type_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), output_type,
-      GetArenaNoVirtual());
+  output_type_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), output_type);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.output_type)
 }
-inline ::std::string* MethodDescriptorProto::unsafe_arena_release_output_type() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.output_type)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_output_type();
-  return output_type_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void MethodDescriptorProto::unsafe_arena_set_allocated_output_type(
-    ::std::string* output_type) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (output_type != NULL) {
-    set_has_output_type();
-  } else {
-    clear_has_output_type();
-  }
-  output_type_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      output_type, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.output_type)
-}
 
 // optional .google.protobuf.MethodOptions options = 4;
 inline bool MethodDescriptorProto::has_options() const {
@@ -8700,57 +5673,36 @@
   _has_bits_[0] &= ~0x00000008u;
 }
 inline void MethodDescriptorProto::clear_options() {
-  if (options_ != NULL) options_->Clear();
+  if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear();
   clear_has_options();
 }
 inline const ::google::protobuf::MethodOptions& MethodDescriptorProto::options() const {
-  const ::google::protobuf::MethodOptions* p = options_;
   // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.options)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::MethodOptions*>(
-      &::google::protobuf::_MethodOptions_default_instance_);
+  return options_ != NULL ? *options_ : *default_instance_->options_;
+}
+inline ::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() {
+  set_has_options();
+  if (options_ == NULL) {
+    options_ = new ::google::protobuf::MethodOptions;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.options)
+  return options_;
 }
 inline ::google::protobuf::MethodOptions* MethodDescriptorProto::release_options() {
   // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.options)
   clear_has_options();
   ::google::protobuf::MethodOptions* temp = options_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   options_ = NULL;
   return temp;
 }
-inline ::google::protobuf::MethodOptions* MethodDescriptorProto::unsafe_arena_release_options() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.options)
-  clear_has_options();
-  ::google::protobuf::MethodOptions* temp = options_;
-  options_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() {
-  set_has_options();
-  if (options_ == NULL) {
-    _slow_mutable_options();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.options)
-  return options_;
-}
 inline void MethodDescriptorProto::set_allocated_options(::google::protobuf::MethodOptions* options) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete options_;
-  }
+  delete options_;
+  options_ = options;
   if (options) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(options);
-    if (message_arena != submessage_arena) {
-      options = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, options, submessage_arena);
-    }
     set_has_options();
   } else {
     clear_has_options();
   }
-  options_ = options;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.options)
 }
 
@@ -8817,49 +5769,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void FileOptions::clear_java_package() {
-  java_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  java_package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_java_package();
 }
 inline const ::std::string& FileOptions::java_package() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_package)
-  return java_package_.Get();
+  return java_package_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_java_package(const ::std::string& value) {
   set_has_java_package();
-  java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  java_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_package)
 }
-#if LANG_CXX11
-inline void FileOptions::set_java_package(::std::string&& value) {
-  set_has_java_package();
-  java_package_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.java_package)
-}
-#endif
 inline void FileOptions::set_java_package(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_java_package();
-  java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  java_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_package)
 }
-inline void FileOptions::set_java_package(const char* value,
-    size_t size) {
+inline void FileOptions::set_java_package(const char* value, size_t size) {
   set_has_java_package();
-  java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  java_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_package)
 }
 inline ::std::string* FileOptions::mutable_java_package() {
   set_has_java_package();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_package)
-  return java_package_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return java_package_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileOptions::release_java_package() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_package)
   clear_has_java_package();
-  return java_package_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return java_package_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_allocated_java_package(::std::string* java_package) {
   if (java_package != NULL) {
@@ -8867,29 +5808,9 @@
   } else {
     clear_has_java_package();
   }
-  java_package_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_package,
-      GetArenaNoVirtual());
+  java_package_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_package);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_package)
 }
-inline ::std::string* FileOptions::unsafe_arena_release_java_package() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.java_package)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_java_package();
-  return java_package_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_java_package(
-    ::std::string* java_package) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (java_package != NULL) {
-    set_has_java_package();
-  } else {
-    clear_has_java_package();
-  }
-  java_package_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      java_package, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.java_package)
-}
 
 // optional string java_outer_classname = 8;
 inline bool FileOptions::has_java_outer_classname() const {
@@ -8902,49 +5823,38 @@
   _has_bits_[0] &= ~0x00000002u;
 }
 inline void FileOptions::clear_java_outer_classname() {
-  java_outer_classname_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  java_outer_classname_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_java_outer_classname();
 }
 inline const ::std::string& FileOptions::java_outer_classname() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_outer_classname)
-  return java_outer_classname_.Get();
+  return java_outer_classname_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_java_outer_classname(const ::std::string& value) {
   set_has_java_outer_classname();
-  java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  java_outer_classname_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_outer_classname)
 }
-#if LANG_CXX11
-inline void FileOptions::set_java_outer_classname(::std::string&& value) {
-  set_has_java_outer_classname();
-  java_outer_classname_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.java_outer_classname)
-}
-#endif
 inline void FileOptions::set_java_outer_classname(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_java_outer_classname();
-  java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  java_outer_classname_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_outer_classname)
 }
-inline void FileOptions::set_java_outer_classname(const char* value,
-    size_t size) {
+inline void FileOptions::set_java_outer_classname(const char* value, size_t size) {
   set_has_java_outer_classname();
-  java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  java_outer_classname_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_outer_classname)
 }
 inline ::std::string* FileOptions::mutable_java_outer_classname() {
   set_has_java_outer_classname();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_outer_classname)
-  return java_outer_classname_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return java_outer_classname_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileOptions::release_java_outer_classname() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_outer_classname)
   clear_has_java_outer_classname();
-  return java_outer_classname_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return java_outer_classname_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_allocated_java_outer_classname(::std::string* java_outer_classname) {
   if (java_outer_classname != NULL) {
@@ -8952,39 +5862,19 @@
   } else {
     clear_has_java_outer_classname();
   }
-  java_outer_classname_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_outer_classname,
-      GetArenaNoVirtual());
+  java_outer_classname_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_outer_classname);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_outer_classname)
 }
-inline ::std::string* FileOptions::unsafe_arena_release_java_outer_classname() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.java_outer_classname)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_java_outer_classname();
-  return java_outer_classname_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_java_outer_classname(
-    ::std::string* java_outer_classname) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (java_outer_classname != NULL) {
-    set_has_java_outer_classname();
-  } else {
-    clear_has_java_outer_classname();
-  }
-  java_outer_classname_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      java_outer_classname, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.java_outer_classname)
-}
 
 // optional bool java_multiple_files = 10 [default = false];
 inline bool FileOptions::has_java_multiple_files() const {
-  return (_has_bits_[0] & 0x00000200u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void FileOptions::set_has_java_multiple_files() {
-  _has_bits_[0] |= 0x00000200u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void FileOptions::clear_has_java_multiple_files() {
-  _has_bits_[0] &= ~0x00000200u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void FileOptions::clear_java_multiple_files() {
   java_multiple_files_ = false;
@@ -9000,15 +5890,15 @@
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_multiple_files)
 }
 
-// optional bool java_generate_equals_and_hash = 20 [deprecated = true];
+// optional bool java_generate_equals_and_hash = 20 [default = false];
 inline bool FileOptions::has_java_generate_equals_and_hash() const {
-  return (_has_bits_[0] & 0x00000400u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void FileOptions::set_has_java_generate_equals_and_hash() {
-  _has_bits_[0] |= 0x00000400u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void FileOptions::clear_has_java_generate_equals_and_hash() {
-  _has_bits_[0] &= ~0x00000400u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void FileOptions::clear_java_generate_equals_and_hash() {
   java_generate_equals_and_hash_ = false;
@@ -9026,13 +5916,13 @@
 
 // optional bool java_string_check_utf8 = 27 [default = false];
 inline bool FileOptions::has_java_string_check_utf8() const {
-  return (_has_bits_[0] & 0x00000800u) != 0;
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
 inline void FileOptions::set_has_java_string_check_utf8() {
-  _has_bits_[0] |= 0x00000800u;
+  _has_bits_[0] |= 0x00000010u;
 }
 inline void FileOptions::clear_has_java_string_check_utf8() {
-  _has_bits_[0] &= ~0x00000800u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 inline void FileOptions::clear_java_string_check_utf8() {
   java_string_check_utf8_ = false;
@@ -9050,13 +5940,13 @@
 
 // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
 inline bool FileOptions::has_optimize_for() const {
-  return (_has_bits_[0] & 0x00020000u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 inline void FileOptions::set_has_optimize_for() {
-  _has_bits_[0] |= 0x00020000u;
+  _has_bits_[0] |= 0x00000020u;
 }
 inline void FileOptions::clear_has_optimize_for() {
-  _has_bits_[0] &= ~0x00020000u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline void FileOptions::clear_optimize_for() {
   optimize_for_ = 1;
@@ -9075,58 +5965,47 @@
 
 // optional string go_package = 11;
 inline bool FileOptions::has_go_package() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000040u) != 0;
 }
 inline void FileOptions::set_has_go_package() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000040u;
 }
 inline void FileOptions::clear_has_go_package() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000040u;
 }
 inline void FileOptions::clear_go_package() {
-  go_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  go_package_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_go_package();
 }
 inline const ::std::string& FileOptions::go_package() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.go_package)
-  return go_package_.Get();
+  return go_package_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_go_package(const ::std::string& value) {
   set_has_go_package();
-  go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  go_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.go_package)
 }
-#if LANG_CXX11
-inline void FileOptions::set_go_package(::std::string&& value) {
-  set_has_go_package();
-  go_package_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.go_package)
-}
-#endif
 inline void FileOptions::set_go_package(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_go_package();
-  go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  go_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.go_package)
 }
-inline void FileOptions::set_go_package(const char* value,
-    size_t size) {
+inline void FileOptions::set_go_package(const char* value, size_t size) {
   set_has_go_package();
-  go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  go_package_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.go_package)
 }
 inline ::std::string* FileOptions::mutable_go_package() {
   set_has_go_package();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.go_package)
-  return go_package_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return go_package_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileOptions::release_go_package() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.go_package)
   clear_has_go_package();
-  return go_package_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return go_package_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_allocated_go_package(::std::string* go_package) {
   if (go_package != NULL) {
@@ -9134,39 +6013,19 @@
   } else {
     clear_has_go_package();
   }
-  go_package_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), go_package,
-      GetArenaNoVirtual());
+  go_package_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), go_package);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.go_package)
 }
-inline ::std::string* FileOptions::unsafe_arena_release_go_package() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.go_package)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_go_package();
-  return go_package_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_go_package(
-    ::std::string* go_package) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (go_package != NULL) {
-    set_has_go_package();
-  } else {
-    clear_has_go_package();
-  }
-  go_package_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      go_package, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.go_package)
-}
 
 // optional bool cc_generic_services = 16 [default = false];
 inline bool FileOptions::has_cc_generic_services() const {
-  return (_has_bits_[0] & 0x00001000u) != 0;
+  return (_has_bits_[0] & 0x00000080u) != 0;
 }
 inline void FileOptions::set_has_cc_generic_services() {
-  _has_bits_[0] |= 0x00001000u;
+  _has_bits_[0] |= 0x00000080u;
 }
 inline void FileOptions::clear_has_cc_generic_services() {
-  _has_bits_[0] &= ~0x00001000u;
+  _has_bits_[0] &= ~0x00000080u;
 }
 inline void FileOptions::clear_cc_generic_services() {
   cc_generic_services_ = false;
@@ -9184,13 +6043,13 @@
 
 // optional bool java_generic_services = 17 [default = false];
 inline bool FileOptions::has_java_generic_services() const {
-  return (_has_bits_[0] & 0x00002000u) != 0;
+  return (_has_bits_[0] & 0x00000100u) != 0;
 }
 inline void FileOptions::set_has_java_generic_services() {
-  _has_bits_[0] |= 0x00002000u;
+  _has_bits_[0] |= 0x00000100u;
 }
 inline void FileOptions::clear_has_java_generic_services() {
-  _has_bits_[0] &= ~0x00002000u;
+  _has_bits_[0] &= ~0x00000100u;
 }
 inline void FileOptions::clear_java_generic_services() {
   java_generic_services_ = false;
@@ -9208,13 +6067,13 @@
 
 // optional bool py_generic_services = 18 [default = false];
 inline bool FileOptions::has_py_generic_services() const {
-  return (_has_bits_[0] & 0x00004000u) != 0;
+  return (_has_bits_[0] & 0x00000200u) != 0;
 }
 inline void FileOptions::set_has_py_generic_services() {
-  _has_bits_[0] |= 0x00004000u;
+  _has_bits_[0] |= 0x00000200u;
 }
 inline void FileOptions::clear_has_py_generic_services() {
-  _has_bits_[0] &= ~0x00004000u;
+  _has_bits_[0] &= ~0x00000200u;
 }
 inline void FileOptions::clear_py_generic_services() {
   py_generic_services_ = false;
@@ -9230,39 +6089,15 @@
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.py_generic_services)
 }
 
-// optional bool php_generic_services = 42 [default = false];
-inline bool FileOptions::has_php_generic_services() const {
-  return (_has_bits_[0] & 0x00008000u) != 0;
-}
-inline void FileOptions::set_has_php_generic_services() {
-  _has_bits_[0] |= 0x00008000u;
-}
-inline void FileOptions::clear_has_php_generic_services() {
-  _has_bits_[0] &= ~0x00008000u;
-}
-inline void FileOptions::clear_php_generic_services() {
-  php_generic_services_ = false;
-  clear_has_php_generic_services();
-}
-inline bool FileOptions::php_generic_services() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.php_generic_services)
-  return php_generic_services_;
-}
-inline void FileOptions::set_php_generic_services(bool value) {
-  set_has_php_generic_services();
-  php_generic_services_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.php_generic_services)
-}
-
 // optional bool deprecated = 23 [default = false];
 inline bool FileOptions::has_deprecated() const {
-  return (_has_bits_[0] & 0x00010000u) != 0;
+  return (_has_bits_[0] & 0x00000400u) != 0;
 }
 inline void FileOptions::set_has_deprecated() {
-  _has_bits_[0] |= 0x00010000u;
+  _has_bits_[0] |= 0x00000400u;
 }
 inline void FileOptions::clear_has_deprecated() {
-  _has_bits_[0] &= ~0x00010000u;
+  _has_bits_[0] &= ~0x00000400u;
 }
 inline void FileOptions::clear_deprecated() {
   deprecated_ = false;
@@ -9280,13 +6115,13 @@
 
 // optional bool cc_enable_arenas = 31 [default = false];
 inline bool FileOptions::has_cc_enable_arenas() const {
-  return (_has_bits_[0] & 0x00000100u) != 0;
+  return (_has_bits_[0] & 0x00000800u) != 0;
 }
 inline void FileOptions::set_has_cc_enable_arenas() {
-  _has_bits_[0] |= 0x00000100u;
+  _has_bits_[0] |= 0x00000800u;
 }
 inline void FileOptions::clear_has_cc_enable_arenas() {
-  _has_bits_[0] &= ~0x00000100u;
+  _has_bits_[0] &= ~0x00000800u;
 }
 inline void FileOptions::clear_cc_enable_arenas() {
   cc_enable_arenas_ = false;
@@ -9304,58 +6139,47 @@
 
 // optional string objc_class_prefix = 36;
 inline bool FileOptions::has_objc_class_prefix() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00001000u) != 0;
 }
 inline void FileOptions::set_has_objc_class_prefix() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00001000u;
 }
 inline void FileOptions::clear_has_objc_class_prefix() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00001000u;
 }
 inline void FileOptions::clear_objc_class_prefix() {
-  objc_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  objc_class_prefix_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_objc_class_prefix();
 }
 inline const ::std::string& FileOptions::objc_class_prefix() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.objc_class_prefix)
-  return objc_class_prefix_.Get();
+  return objc_class_prefix_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_objc_class_prefix(const ::std::string& value) {
   set_has_objc_class_prefix();
-  objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  objc_class_prefix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.objc_class_prefix)
 }
-#if LANG_CXX11
-inline void FileOptions::set_objc_class_prefix(::std::string&& value) {
-  set_has_objc_class_prefix();
-  objc_class_prefix_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.objc_class_prefix)
-}
-#endif
 inline void FileOptions::set_objc_class_prefix(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_objc_class_prefix();
-  objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  objc_class_prefix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.objc_class_prefix)
 }
-inline void FileOptions::set_objc_class_prefix(const char* value,
-    size_t size) {
+inline void FileOptions::set_objc_class_prefix(const char* value, size_t size) {
   set_has_objc_class_prefix();
-  objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  objc_class_prefix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.objc_class_prefix)
 }
 inline ::std::string* FileOptions::mutable_objc_class_prefix() {
   set_has_objc_class_prefix();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.objc_class_prefix)
-  return objc_class_prefix_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return objc_class_prefix_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileOptions::release_objc_class_prefix() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.objc_class_prefix)
   clear_has_objc_class_prefix();
-  return objc_class_prefix_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return objc_class_prefix_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_allocated_objc_class_prefix(::std::string* objc_class_prefix) {
   if (objc_class_prefix != NULL) {
@@ -9363,84 +6187,53 @@
   } else {
     clear_has_objc_class_prefix();
   }
-  objc_class_prefix_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), objc_class_prefix,
-      GetArenaNoVirtual());
+  objc_class_prefix_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), objc_class_prefix);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.objc_class_prefix)
 }
-inline ::std::string* FileOptions::unsafe_arena_release_objc_class_prefix() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.objc_class_prefix)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_objc_class_prefix();
-  return objc_class_prefix_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_objc_class_prefix(
-    ::std::string* objc_class_prefix) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (objc_class_prefix != NULL) {
-    set_has_objc_class_prefix();
-  } else {
-    clear_has_objc_class_prefix();
-  }
-  objc_class_prefix_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      objc_class_prefix, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.objc_class_prefix)
-}
 
 // optional string csharp_namespace = 37;
 inline bool FileOptions::has_csharp_namespace() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00002000u) != 0;
 }
 inline void FileOptions::set_has_csharp_namespace() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00002000u;
 }
 inline void FileOptions::clear_has_csharp_namespace() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00002000u;
 }
 inline void FileOptions::clear_csharp_namespace() {
-  csharp_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  csharp_namespace_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_csharp_namespace();
 }
 inline const ::std::string& FileOptions::csharp_namespace() const {
   // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.csharp_namespace)
-  return csharp_namespace_.Get();
+  return csharp_namespace_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_csharp_namespace(const ::std::string& value) {
   set_has_csharp_namespace();
-  csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  csharp_namespace_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.csharp_namespace)
 }
-#if LANG_CXX11
-inline void FileOptions::set_csharp_namespace(::std::string&& value) {
-  set_has_csharp_namespace();
-  csharp_namespace_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.csharp_namespace)
-}
-#endif
 inline void FileOptions::set_csharp_namespace(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_csharp_namespace();
-  csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  csharp_namespace_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.csharp_namespace)
 }
-inline void FileOptions::set_csharp_namespace(const char* value,
-    size_t size) {
+inline void FileOptions::set_csharp_namespace(const char* value, size_t size) {
   set_has_csharp_namespace();
-  csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  csharp_namespace_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.csharp_namespace)
 }
 inline ::std::string* FileOptions::mutable_csharp_namespace() {
   set_has_csharp_namespace();
   // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.csharp_namespace)
-  return csharp_namespace_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return csharp_namespace_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* FileOptions::release_csharp_namespace() {
   // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.csharp_namespace)
   clear_has_csharp_namespace();
-  return csharp_namespace_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return csharp_namespace_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void FileOptions::set_allocated_csharp_namespace(::std::string* csharp_namespace) {
   if (csharp_namespace != NULL) {
@@ -9448,284 +6241,9 @@
   } else {
     clear_has_csharp_namespace();
   }
-  csharp_namespace_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), csharp_namespace,
-      GetArenaNoVirtual());
+  csharp_namespace_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), csharp_namespace);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.csharp_namespace)
 }
-inline ::std::string* FileOptions::unsafe_arena_release_csharp_namespace() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.csharp_namespace)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_csharp_namespace();
-  return csharp_namespace_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_csharp_namespace(
-    ::std::string* csharp_namespace) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (csharp_namespace != NULL) {
-    set_has_csharp_namespace();
-  } else {
-    clear_has_csharp_namespace();
-  }
-  csharp_namespace_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      csharp_namespace, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.csharp_namespace)
-}
-
-// optional string swift_prefix = 39;
-inline bool FileOptions::has_swift_prefix() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
-}
-inline void FileOptions::set_has_swift_prefix() {
-  _has_bits_[0] |= 0x00000020u;
-}
-inline void FileOptions::clear_has_swift_prefix() {
-  _has_bits_[0] &= ~0x00000020u;
-}
-inline void FileOptions::clear_swift_prefix() {
-  swift_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  clear_has_swift_prefix();
-}
-inline const ::std::string& FileOptions::swift_prefix() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.swift_prefix)
-  return swift_prefix_.Get();
-}
-inline void FileOptions::set_swift_prefix(const ::std::string& value) {
-  set_has_swift_prefix();
-  swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.swift_prefix)
-}
-#if LANG_CXX11
-inline void FileOptions::set_swift_prefix(::std::string&& value) {
-  set_has_swift_prefix();
-  swift_prefix_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.swift_prefix)
-}
-#endif
-inline void FileOptions::set_swift_prefix(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
-  set_has_swift_prefix();
-  swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.swift_prefix)
-}
-inline void FileOptions::set_swift_prefix(const char* value,
-    size_t size) {
-  set_has_swift_prefix();
-  swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.swift_prefix)
-}
-inline ::std::string* FileOptions::mutable_swift_prefix() {
-  set_has_swift_prefix();
-  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.swift_prefix)
-  return swift_prefix_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-}
-inline ::std::string* FileOptions::release_swift_prefix() {
-  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.swift_prefix)
-  clear_has_swift_prefix();
-  return swift_prefix_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-}
-inline void FileOptions::set_allocated_swift_prefix(::std::string* swift_prefix) {
-  if (swift_prefix != NULL) {
-    set_has_swift_prefix();
-  } else {
-    clear_has_swift_prefix();
-  }
-  swift_prefix_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), swift_prefix,
-      GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.swift_prefix)
-}
-inline ::std::string* FileOptions::unsafe_arena_release_swift_prefix() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.swift_prefix)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_swift_prefix();
-  return swift_prefix_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_swift_prefix(
-    ::std::string* swift_prefix) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (swift_prefix != NULL) {
-    set_has_swift_prefix();
-  } else {
-    clear_has_swift_prefix();
-  }
-  swift_prefix_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      swift_prefix, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.swift_prefix)
-}
-
-// optional string php_class_prefix = 40;
-inline bool FileOptions::has_php_class_prefix() const {
-  return (_has_bits_[0] & 0x00000040u) != 0;
-}
-inline void FileOptions::set_has_php_class_prefix() {
-  _has_bits_[0] |= 0x00000040u;
-}
-inline void FileOptions::clear_has_php_class_prefix() {
-  _has_bits_[0] &= ~0x00000040u;
-}
-inline void FileOptions::clear_php_class_prefix() {
-  php_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  clear_has_php_class_prefix();
-}
-inline const ::std::string& FileOptions::php_class_prefix() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.php_class_prefix)
-  return php_class_prefix_.Get();
-}
-inline void FileOptions::set_php_class_prefix(const ::std::string& value) {
-  set_has_php_class_prefix();
-  php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.php_class_prefix)
-}
-#if LANG_CXX11
-inline void FileOptions::set_php_class_prefix(::std::string&& value) {
-  set_has_php_class_prefix();
-  php_class_prefix_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.php_class_prefix)
-}
-#endif
-inline void FileOptions::set_php_class_prefix(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
-  set_has_php_class_prefix();
-  php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.php_class_prefix)
-}
-inline void FileOptions::set_php_class_prefix(const char* value,
-    size_t size) {
-  set_has_php_class_prefix();
-  php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.php_class_prefix)
-}
-inline ::std::string* FileOptions::mutable_php_class_prefix() {
-  set_has_php_class_prefix();
-  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.php_class_prefix)
-  return php_class_prefix_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-}
-inline ::std::string* FileOptions::release_php_class_prefix() {
-  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_class_prefix)
-  clear_has_php_class_prefix();
-  return php_class_prefix_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-}
-inline void FileOptions::set_allocated_php_class_prefix(::std::string* php_class_prefix) {
-  if (php_class_prefix != NULL) {
-    set_has_php_class_prefix();
-  } else {
-    clear_has_php_class_prefix();
-  }
-  php_class_prefix_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), php_class_prefix,
-      GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.php_class_prefix)
-}
-inline ::std::string* FileOptions::unsafe_arena_release_php_class_prefix() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.php_class_prefix)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_php_class_prefix();
-  return php_class_prefix_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_php_class_prefix(
-    ::std::string* php_class_prefix) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (php_class_prefix != NULL) {
-    set_has_php_class_prefix();
-  } else {
-    clear_has_php_class_prefix();
-  }
-  php_class_prefix_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      php_class_prefix, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.php_class_prefix)
-}
-
-// optional string php_namespace = 41;
-inline bool FileOptions::has_php_namespace() const {
-  return (_has_bits_[0] & 0x00000080u) != 0;
-}
-inline void FileOptions::set_has_php_namespace() {
-  _has_bits_[0] |= 0x00000080u;
-}
-inline void FileOptions::clear_has_php_namespace() {
-  _has_bits_[0] &= ~0x00000080u;
-}
-inline void FileOptions::clear_php_namespace() {
-  php_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  clear_has_php_namespace();
-}
-inline const ::std::string& FileOptions::php_namespace() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.php_namespace)
-  return php_namespace_.Get();
-}
-inline void FileOptions::set_php_namespace(const ::std::string& value) {
-  set_has_php_namespace();
-  php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.php_namespace)
-}
-#if LANG_CXX11
-inline void FileOptions::set_php_namespace(::std::string&& value) {
-  set_has_php_namespace();
-  php_namespace_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.php_namespace)
-}
-#endif
-inline void FileOptions::set_php_namespace(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
-  set_has_php_namespace();
-  php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.php_namespace)
-}
-inline void FileOptions::set_php_namespace(const char* value,
-    size_t size) {
-  set_has_php_namespace();
-  php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.php_namespace)
-}
-inline ::std::string* FileOptions::mutable_php_namespace() {
-  set_has_php_namespace();
-  // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.php_namespace)
-  return php_namespace_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-}
-inline ::std::string* FileOptions::release_php_namespace() {
-  // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_namespace)
-  clear_has_php_namespace();
-  return php_namespace_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-}
-inline void FileOptions::set_allocated_php_namespace(::std::string* php_namespace) {
-  if (php_namespace != NULL) {
-    set_has_php_namespace();
-  } else {
-    clear_has_php_namespace();
-  }
-  php_namespace_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), php_namespace,
-      GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.php_namespace)
-}
-inline ::std::string* FileOptions::unsafe_arena_release_php_namespace() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.php_namespace)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_php_namespace();
-  return php_namespace_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void FileOptions::unsafe_arena_set_allocated_php_namespace(
-    ::std::string* php_namespace) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (php_namespace != NULL) {
-    set_has_php_namespace();
-  } else {
-    clear_has_php_namespace();
-  }
-  php_namespace_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      php_namespace, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.php_namespace)
-}
 
 // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
 inline int FileOptions::uninterpreted_option_size() const {
@@ -9942,13 +6460,13 @@
 
 // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
 inline bool FieldOptions::has_jstype() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void FieldOptions::set_has_jstype() {
-  _has_bits_[0] |= 0x00000020u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void FieldOptions::clear_has_jstype() {
-  _has_bits_[0] &= ~0x00000020u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void FieldOptions::clear_jstype() {
   jstype_ = 0;
@@ -9967,13 +6485,13 @@
 
 // optional bool lazy = 5 [default = false];
 inline bool FieldOptions::has_lazy() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void FieldOptions::set_has_lazy() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void FieldOptions::clear_has_lazy() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void FieldOptions::clear_lazy() {
   lazy_ = false;
@@ -9991,13 +6509,13 @@
 
 // optional bool deprecated = 3 [default = false];
 inline bool FieldOptions::has_deprecated() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
 inline void FieldOptions::set_has_deprecated() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000010u;
 }
 inline void FieldOptions::clear_has_deprecated() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 inline void FieldOptions::clear_deprecated() {
   deprecated_ = false;
@@ -10015,13 +6533,13 @@
 
 // optional bool weak = 10 [default = false];
 inline bool FieldOptions::has_weak() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 inline void FieldOptions::set_has_weak() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000020u;
 }
 inline void FieldOptions::clear_has_weak() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline void FieldOptions::clear_weak() {
   weak_ = false;
@@ -10069,40 +6587,6 @@
 
 // -------------------------------------------------------------------
 
-// OneofOptions
-
-// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
-inline int OneofOptions::uninterpreted_option_size() const {
-  return uninterpreted_option_.size();
-}
-inline void OneofOptions::clear_uninterpreted_option() {
-  uninterpreted_option_.Clear();
-}
-inline const ::google::protobuf::UninterpretedOption& OneofOptions::uninterpreted_option(int index) const {
-  // @@protoc_insertion_point(field_get:google.protobuf.OneofOptions.uninterpreted_option)
-  return uninterpreted_option_.Get(index);
-}
-inline ::google::protobuf::UninterpretedOption* OneofOptions::mutable_uninterpreted_option(int index) {
-  // @@protoc_insertion_point(field_mutable:google.protobuf.OneofOptions.uninterpreted_option)
-  return uninterpreted_option_.Mutable(index);
-}
-inline ::google::protobuf::UninterpretedOption* OneofOptions::add_uninterpreted_option() {
-  // @@protoc_insertion_point(field_add:google.protobuf.OneofOptions.uninterpreted_option)
-  return uninterpreted_option_.Add();
-}
-inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*
-OneofOptions::mutable_uninterpreted_option() {
-  // @@protoc_insertion_point(field_mutable_list:google.protobuf.OneofOptions.uninterpreted_option)
-  return &uninterpreted_option_;
-}
-inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&
-OneofOptions::uninterpreted_option() const {
-  // @@protoc_insertion_point(field_list:google.protobuf.OneofOptions.uninterpreted_option)
-  return uninterpreted_option_;
-}
-
-// -------------------------------------------------------------------
-
 // EnumOptions
 
 // optional bool allow_alias = 2;
@@ -10327,31 +6811,6 @@
   // @@protoc_insertion_point(field_set:google.protobuf.MethodOptions.deprecated)
 }
 
-// optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
-inline bool MethodOptions::has_idempotency_level() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void MethodOptions::set_has_idempotency_level() {
-  _has_bits_[0] |= 0x00000002u;
-}
-inline void MethodOptions::clear_has_idempotency_level() {
-  _has_bits_[0] &= ~0x00000002u;
-}
-inline void MethodOptions::clear_idempotency_level() {
-  idempotency_level_ = 0;
-  clear_has_idempotency_level();
-}
-inline ::google::protobuf::MethodOptions_IdempotencyLevel MethodOptions::idempotency_level() const {
-  // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.idempotency_level)
-  return static_cast< ::google::protobuf::MethodOptions_IdempotencyLevel >(idempotency_level_);
-}
-inline void MethodOptions::set_idempotency_level(::google::protobuf::MethodOptions_IdempotencyLevel value) {
-  assert(::google::protobuf::MethodOptions_IdempotencyLevel_IsValid(value));
-  set_has_idempotency_level();
-  idempotency_level_ = value;
-  // @@protoc_insertion_point(field_set:google.protobuf.MethodOptions.idempotency_level)
-}
-
 // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
 inline int MethodOptions::uninterpreted_option_size() const {
   return uninterpreted_option_.size();
@@ -10397,49 +6856,38 @@
   _has_bits_[0] &= ~0x00000001u;
 }
 inline void UninterpretedOption_NamePart::clear_name_part() {
-  name_part_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_part_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_name_part();
 }
 inline const ::std::string& UninterpretedOption_NamePart::name_part() const {
   // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.name_part)
-  return name_part_.Get();
+  return name_part_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption_NamePart::set_name_part(const ::std::string& value) {
   set_has_name_part();
-  name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_part_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.name_part)
 }
-#if LANG_CXX11
-inline void UninterpretedOption_NamePart::set_name_part(::std::string&& value) {
-  set_has_name_part();
-  name_part_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.NamePart.name_part)
-}
-#endif
 inline void UninterpretedOption_NamePart::set_name_part(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_name_part();
-  name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_part_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.NamePart.name_part)
 }
-inline void UninterpretedOption_NamePart::set_name_part(const char* value,
-    size_t size) {
+inline void UninterpretedOption_NamePart::set_name_part(const char* value, size_t size) {
   set_has_name_part();
-  name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_part_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.NamePart.name_part)
 }
 inline ::std::string* UninterpretedOption_NamePart::mutable_name_part() {
   set_has_name_part();
   // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.NamePart.name_part)
-  return name_part_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_part_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* UninterpretedOption_NamePart::release_name_part() {
   // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.NamePart.name_part)
   clear_has_name_part();
-  return name_part_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_part_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption_NamePart::set_allocated_name_part(::std::string* name_part) {
   if (name_part != NULL) {
@@ -10447,29 +6895,9 @@
   } else {
     clear_has_name_part();
   }
-  name_part_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name_part,
-      GetArenaNoVirtual());
+  name_part_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name_part);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.NamePart.name_part)
 }
-inline ::std::string* UninterpretedOption_NamePart::unsafe_arena_release_name_part() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.NamePart.name_part)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_name_part();
-  return name_part_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void UninterpretedOption_NamePart::unsafe_arena_set_allocated_name_part(
-    ::std::string* name_part) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name_part != NULL) {
-    set_has_name_part();
-  } else {
-    clear_has_name_part();
-  }
-  name_part_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name_part, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.NamePart.name_part)
-}
 
 // required bool is_extension = 2;
 inline bool UninterpretedOption_NamePart::has_is_extension() const {
@@ -10531,58 +6959,47 @@
 
 // optional string identifier_value = 3;
 inline bool UninterpretedOption::has_identifier_value() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
+  return (_has_bits_[0] & 0x00000002u) != 0;
 }
 inline void UninterpretedOption::set_has_identifier_value() {
-  _has_bits_[0] |= 0x00000001u;
+  _has_bits_[0] |= 0x00000002u;
 }
 inline void UninterpretedOption::clear_has_identifier_value() {
-  _has_bits_[0] &= ~0x00000001u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline void UninterpretedOption::clear_identifier_value() {
-  identifier_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  identifier_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_identifier_value();
 }
 inline const ::std::string& UninterpretedOption::identifier_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.identifier_value)
-  return identifier_value_.Get();
+  return identifier_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption::set_identifier_value(const ::std::string& value) {
   set_has_identifier_value();
-  identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  identifier_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.identifier_value)
 }
-#if LANG_CXX11
-inline void UninterpretedOption::set_identifier_value(::std::string&& value) {
-  set_has_identifier_value();
-  identifier_value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.identifier_value)
-}
-#endif
 inline void UninterpretedOption::set_identifier_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_identifier_value();
-  identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  identifier_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.identifier_value)
 }
-inline void UninterpretedOption::set_identifier_value(const char* value,
-    size_t size) {
+inline void UninterpretedOption::set_identifier_value(const char* value, size_t size) {
   set_has_identifier_value();
-  identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  identifier_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.identifier_value)
 }
 inline ::std::string* UninterpretedOption::mutable_identifier_value() {
   set_has_identifier_value();
   // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.identifier_value)
-  return identifier_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return identifier_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* UninterpretedOption::release_identifier_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.identifier_value)
   clear_has_identifier_value();
-  return identifier_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return identifier_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption::set_allocated_identifier_value(::std::string* identifier_value) {
   if (identifier_value != NULL) {
@@ -10590,39 +7007,19 @@
   } else {
     clear_has_identifier_value();
   }
-  identifier_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), identifier_value,
-      GetArenaNoVirtual());
+  identifier_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), identifier_value);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.identifier_value)
 }
-inline ::std::string* UninterpretedOption::unsafe_arena_release_identifier_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.identifier_value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_identifier_value();
-  return identifier_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void UninterpretedOption::unsafe_arena_set_allocated_identifier_value(
-    ::std::string* identifier_value) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (identifier_value != NULL) {
-    set_has_identifier_value();
-  } else {
-    clear_has_identifier_value();
-  }
-  identifier_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      identifier_value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.identifier_value)
-}
 
 // optional uint64 positive_int_value = 4;
 inline bool UninterpretedOption::has_positive_int_value() const {
-  return (_has_bits_[0] & 0x00000008u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void UninterpretedOption::set_has_positive_int_value() {
-  _has_bits_[0] |= 0x00000008u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void UninterpretedOption::clear_has_positive_int_value() {
-  _has_bits_[0] &= ~0x00000008u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void UninterpretedOption::clear_positive_int_value() {
   positive_int_value_ = GOOGLE_ULONGLONG(0);
@@ -10640,13 +7037,13 @@
 
 // optional int64 negative_int_value = 5;
 inline bool UninterpretedOption::has_negative_int_value() const {
-  return (_has_bits_[0] & 0x00000010u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void UninterpretedOption::set_has_negative_int_value() {
-  _has_bits_[0] |= 0x00000010u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void UninterpretedOption::clear_has_negative_int_value() {
-  _has_bits_[0] &= ~0x00000010u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void UninterpretedOption::clear_negative_int_value() {
   negative_int_value_ = GOOGLE_LONGLONG(0);
@@ -10664,13 +7061,13 @@
 
 // optional double double_value = 6;
 inline bool UninterpretedOption::has_double_value() const {
-  return (_has_bits_[0] & 0x00000020u) != 0;
+  return (_has_bits_[0] & 0x00000010u) != 0;
 }
 inline void UninterpretedOption::set_has_double_value() {
-  _has_bits_[0] |= 0x00000020u;
+  _has_bits_[0] |= 0x00000010u;
 }
 inline void UninterpretedOption::clear_has_double_value() {
-  _has_bits_[0] &= ~0x00000020u;
+  _has_bits_[0] &= ~0x00000010u;
 }
 inline void UninterpretedOption::clear_double_value() {
   double_value_ = 0;
@@ -10688,58 +7085,47 @@
 
 // optional bytes string_value = 7;
 inline bool UninterpretedOption::has_string_value() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000020u) != 0;
 }
 inline void UninterpretedOption::set_has_string_value() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000020u;
 }
 inline void UninterpretedOption::clear_has_string_value() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000020u;
 }
 inline void UninterpretedOption::clear_string_value() {
-  string_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  string_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_string_value();
 }
 inline const ::std::string& UninterpretedOption::string_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.string_value)
-  return string_value_.Get();
+  return string_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption::set_string_value(const ::std::string& value) {
   set_has_string_value();
-  string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.string_value)
 }
-#if LANG_CXX11
-inline void UninterpretedOption::set_string_value(::std::string&& value) {
-  set_has_string_value();
-  string_value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.string_value)
-}
-#endif
 inline void UninterpretedOption::set_string_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_string_value();
-  string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.string_value)
 }
-inline void UninterpretedOption::set_string_value(const void* value,
-    size_t size) {
+inline void UninterpretedOption::set_string_value(const void* value, size_t size) {
   set_has_string_value();
-  string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.string_value)
 }
 inline ::std::string* UninterpretedOption::mutable_string_value() {
   set_has_string_value();
   // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.string_value)
-  return string_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return string_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* UninterpretedOption::release_string_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.string_value)
   clear_has_string_value();
-  return string_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return string_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption::set_allocated_string_value(::std::string* string_value) {
   if (string_value != NULL) {
@@ -10747,84 +7133,53 @@
   } else {
     clear_has_string_value();
   }
-  string_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value,
-      GetArenaNoVirtual());
+  string_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.string_value)
 }
-inline ::std::string* UninterpretedOption::unsafe_arena_release_string_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.string_value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_string_value();
-  return string_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void UninterpretedOption::unsafe_arena_set_allocated_string_value(
-    ::std::string* string_value) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (string_value != NULL) {
-    set_has_string_value();
-  } else {
-    clear_has_string_value();
-  }
-  string_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      string_value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.string_value)
-}
 
 // optional string aggregate_value = 8;
 inline bool UninterpretedOption::has_aggregate_value() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000040u) != 0;
 }
 inline void UninterpretedOption::set_has_aggregate_value() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000040u;
 }
 inline void UninterpretedOption::clear_has_aggregate_value() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000040u;
 }
 inline void UninterpretedOption::clear_aggregate_value() {
-  aggregate_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  aggregate_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_aggregate_value();
 }
 inline const ::std::string& UninterpretedOption::aggregate_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.aggregate_value)
-  return aggregate_value_.Get();
+  return aggregate_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption::set_aggregate_value(const ::std::string& value) {
   set_has_aggregate_value();
-  aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  aggregate_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.aggregate_value)
 }
-#if LANG_CXX11
-inline void UninterpretedOption::set_aggregate_value(::std::string&& value) {
-  set_has_aggregate_value();
-  aggregate_value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.aggregate_value)
-}
-#endif
 inline void UninterpretedOption::set_aggregate_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_aggregate_value();
-  aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  aggregate_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.aggregate_value)
 }
-inline void UninterpretedOption::set_aggregate_value(const char* value,
-    size_t size) {
+inline void UninterpretedOption::set_aggregate_value(const char* value, size_t size) {
   set_has_aggregate_value();
-  aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  aggregate_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.aggregate_value)
 }
 inline ::std::string* UninterpretedOption::mutable_aggregate_value() {
   set_has_aggregate_value();
   // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.aggregate_value)
-  return aggregate_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return aggregate_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* UninterpretedOption::release_aggregate_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.aggregate_value)
   clear_has_aggregate_value();
-  return aggregate_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return aggregate_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void UninterpretedOption::set_allocated_aggregate_value(::std::string* aggregate_value) {
   if (aggregate_value != NULL) {
@@ -10832,29 +7187,9 @@
   } else {
     clear_has_aggregate_value();
   }
-  aggregate_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), aggregate_value,
-      GetArenaNoVirtual());
+  aggregate_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), aggregate_value);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.aggregate_value)
 }
-inline ::std::string* UninterpretedOption::unsafe_arena_release_aggregate_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.aggregate_value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_aggregate_value();
-  return aggregate_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void UninterpretedOption::unsafe_arena_set_allocated_aggregate_value(
-    ::std::string* aggregate_value) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (aggregate_value != NULL) {
-    set_has_aggregate_value();
-  } else {
-    clear_has_aggregate_value();
-  }
-  aggregate_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      aggregate_value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.aggregate_value)
-}
 
 // -------------------------------------------------------------------
 
@@ -10922,58 +7257,47 @@
 
 // optional string leading_comments = 3;
 inline bool SourceCodeInfo_Location::has_leading_comments() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void SourceCodeInfo_Location::set_has_leading_comments() {
-  _has_bits_[0] |= 0x00000001u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void SourceCodeInfo_Location::clear_has_leading_comments() {
-  _has_bits_[0] &= ~0x00000001u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void SourceCodeInfo_Location::clear_leading_comments() {
-  leading_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  leading_comments_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_leading_comments();
 }
 inline const ::std::string& SourceCodeInfo_Location::leading_comments() const {
   // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.leading_comments)
-  return leading_comments_.Get();
+  return leading_comments_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void SourceCodeInfo_Location::set_leading_comments(const ::std::string& value) {
   set_has_leading_comments();
-  leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  leading_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_comments)
 }
-#if LANG_CXX11
-inline void SourceCodeInfo_Location::set_leading_comments(::std::string&& value) {
-  set_has_leading_comments();
-  leading_comments_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.SourceCodeInfo.Location.leading_comments)
-}
-#endif
 inline void SourceCodeInfo_Location::set_leading_comments(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_leading_comments();
-  leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  leading_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_comments)
 }
-inline void SourceCodeInfo_Location::set_leading_comments(const char* value,
-    size_t size) {
+inline void SourceCodeInfo_Location::set_leading_comments(const char* value, size_t size) {
   set_has_leading_comments();
-  leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  leading_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.leading_comments)
 }
 inline ::std::string* SourceCodeInfo_Location::mutable_leading_comments() {
   set_has_leading_comments();
   // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.leading_comments)
-  return leading_comments_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return leading_comments_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* SourceCodeInfo_Location::release_leading_comments() {
   // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.leading_comments)
   clear_has_leading_comments();
-  return leading_comments_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return leading_comments_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void SourceCodeInfo_Location::set_allocated_leading_comments(::std::string* leading_comments) {
   if (leading_comments != NULL) {
@@ -10981,84 +7305,53 @@
   } else {
     clear_has_leading_comments();
   }
-  leading_comments_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), leading_comments,
-      GetArenaNoVirtual());
+  leading_comments_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), leading_comments);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.leading_comments)
 }
-inline ::std::string* SourceCodeInfo_Location::unsafe_arena_release_leading_comments() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.SourceCodeInfo.Location.leading_comments)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_leading_comments();
-  return leading_comments_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void SourceCodeInfo_Location::unsafe_arena_set_allocated_leading_comments(
-    ::std::string* leading_comments) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (leading_comments != NULL) {
-    set_has_leading_comments();
-  } else {
-    clear_has_leading_comments();
-  }
-  leading_comments_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      leading_comments, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.SourceCodeInfo.Location.leading_comments)
-}
 
 // optional string trailing_comments = 4;
 inline bool SourceCodeInfo_Location::has_trailing_comments() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void SourceCodeInfo_Location::set_has_trailing_comments() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void SourceCodeInfo_Location::clear_has_trailing_comments() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void SourceCodeInfo_Location::clear_trailing_comments() {
-  trailing_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  trailing_comments_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_trailing_comments();
 }
 inline const ::std::string& SourceCodeInfo_Location::trailing_comments() const {
   // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.trailing_comments)
-  return trailing_comments_.Get();
+  return trailing_comments_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void SourceCodeInfo_Location::set_trailing_comments(const ::std::string& value) {
   set_has_trailing_comments();
-  trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  trailing_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.trailing_comments)
 }
-#if LANG_CXX11
-inline void SourceCodeInfo_Location::set_trailing_comments(::std::string&& value) {
-  set_has_trailing_comments();
-  trailing_comments_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.SourceCodeInfo.Location.trailing_comments)
-}
-#endif
 inline void SourceCodeInfo_Location::set_trailing_comments(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_trailing_comments();
-  trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  trailing_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.trailing_comments)
 }
-inline void SourceCodeInfo_Location::set_trailing_comments(const char* value,
-    size_t size) {
+inline void SourceCodeInfo_Location::set_trailing_comments(const char* value, size_t size) {
   set_has_trailing_comments();
-  trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  trailing_comments_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.trailing_comments)
 }
 inline ::std::string* SourceCodeInfo_Location::mutable_trailing_comments() {
   set_has_trailing_comments();
   // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.trailing_comments)
-  return trailing_comments_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return trailing_comments_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* SourceCodeInfo_Location::release_trailing_comments() {
   // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.trailing_comments)
   clear_has_trailing_comments();
-  return trailing_comments_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return trailing_comments_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void SourceCodeInfo_Location::set_allocated_trailing_comments(::std::string* trailing_comments) {
   if (trailing_comments != NULL) {
@@ -11066,29 +7359,9 @@
   } else {
     clear_has_trailing_comments();
   }
-  trailing_comments_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), trailing_comments,
-      GetArenaNoVirtual());
+  trailing_comments_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), trailing_comments);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.trailing_comments)
 }
-inline ::std::string* SourceCodeInfo_Location::unsafe_arena_release_trailing_comments() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.SourceCodeInfo.Location.trailing_comments)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_trailing_comments();
-  return trailing_comments_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void SourceCodeInfo_Location::unsafe_arena_set_allocated_trailing_comments(
-    ::std::string* trailing_comments) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (trailing_comments != NULL) {
-    set_has_trailing_comments();
-  } else {
-    clear_has_trailing_comments();
-  }
-  trailing_comments_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      trailing_comments, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.SourceCodeInfo.Location.trailing_comments)
-}
 
 // repeated string leading_detached_comments = 6;
 inline int SourceCodeInfo_Location::leading_detached_comments_size() const {
@@ -11109,14 +7382,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
   leading_detached_comments_.Mutable(index)->assign(value);
 }
-#if LANG_CXX11
-inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
-  leading_detached_comments_.Mutable(index)->assign(std::move(value));
-}
-#endif
 inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   leading_detached_comments_.Mutable(index)->assign(value);
   // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
 }
@@ -11133,14 +7399,7 @@
   leading_detached_comments_.Add()->assign(value);
   // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
 }
-#if LANG_CXX11
-inline void SourceCodeInfo_Location::add_leading_detached_comments(::std::string&& value) {
-  leading_detached_comments_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
-}
-#endif
 inline void SourceCodeInfo_Location::add_leading_detached_comments(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   leading_detached_comments_.Add()->assign(value);
   // @@protoc_insertion_point(field_add_char:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
 }
@@ -11229,58 +7488,47 @@
 
 // optional string source_file = 2;
 inline bool GeneratedCodeInfo_Annotation::has_source_file() const {
-  return (_has_bits_[0] & 0x00000001u) != 0;
+  return (_has_bits_[0] & 0x00000002u) != 0;
 }
 inline void GeneratedCodeInfo_Annotation::set_has_source_file() {
-  _has_bits_[0] |= 0x00000001u;
+  _has_bits_[0] |= 0x00000002u;
 }
 inline void GeneratedCodeInfo_Annotation::clear_has_source_file() {
-  _has_bits_[0] &= ~0x00000001u;
+  _has_bits_[0] &= ~0x00000002u;
 }
 inline void GeneratedCodeInfo_Annotation::clear_source_file() {
-  source_file_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  source_file_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   clear_has_source_file();
 }
 inline const ::std::string& GeneratedCodeInfo_Annotation::source_file() const {
   // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
-  return source_file_.Get();
+  return source_file_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void GeneratedCodeInfo_Annotation::set_source_file(const ::std::string& value) {
   set_has_source_file();
-  source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  source_file_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
 }
-#if LANG_CXX11
-inline void GeneratedCodeInfo_Annotation::set_source_file(::std::string&& value) {
-  set_has_source_file();
-  source_file_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
-}
-#endif
 inline void GeneratedCodeInfo_Annotation::set_source_file(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   set_has_source_file();
-  source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  source_file_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
 }
-inline void GeneratedCodeInfo_Annotation::set_source_file(const char* value,
-    size_t size) {
+inline void GeneratedCodeInfo_Annotation::set_source_file(const char* value, size_t size) {
   set_has_source_file();
-  source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  source_file_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
 }
 inline ::std::string* GeneratedCodeInfo_Annotation::mutable_source_file() {
   set_has_source_file();
   // @@protoc_insertion_point(field_mutable:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
-  return source_file_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return source_file_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* GeneratedCodeInfo_Annotation::release_source_file() {
   // @@protoc_insertion_point(field_release:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
   clear_has_source_file();
-  return source_file_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return source_file_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void GeneratedCodeInfo_Annotation::set_allocated_source_file(::std::string* source_file) {
   if (source_file != NULL) {
@@ -11288,39 +7536,19 @@
   } else {
     clear_has_source_file();
   }
-  source_file_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), source_file,
-      GetArenaNoVirtual());
+  source_file_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), source_file);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
 }
-inline ::std::string* GeneratedCodeInfo_Annotation::unsafe_arena_release_source_file() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  clear_has_source_file();
-  return source_file_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void GeneratedCodeInfo_Annotation::unsafe_arena_set_allocated_source_file(
-    ::std::string* source_file) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (source_file != NULL) {
-    set_has_source_file();
-  } else {
-    clear_has_source_file();
-  }
-  source_file_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      source_file, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.GeneratedCodeInfo.Annotation.source_file)
-}
 
 // optional int32 begin = 3;
 inline bool GeneratedCodeInfo_Annotation::has_begin() const {
-  return (_has_bits_[0] & 0x00000002u) != 0;
+  return (_has_bits_[0] & 0x00000004u) != 0;
 }
 inline void GeneratedCodeInfo_Annotation::set_has_begin() {
-  _has_bits_[0] |= 0x00000002u;
+  _has_bits_[0] |= 0x00000004u;
 }
 inline void GeneratedCodeInfo_Annotation::clear_has_begin() {
-  _has_bits_[0] &= ~0x00000002u;
+  _has_bits_[0] &= ~0x00000004u;
 }
 inline void GeneratedCodeInfo_Annotation::clear_begin() {
   begin_ = 0;
@@ -11338,13 +7566,13 @@
 
 // optional int32 end = 4;
 inline bool GeneratedCodeInfo_Annotation::has_end() const {
-  return (_has_bits_[0] & 0x00000004u) != 0;
+  return (_has_bits_[0] & 0x00000008u) != 0;
 }
 inline void GeneratedCodeInfo_Annotation::set_has_end() {
-  _has_bits_[0] |= 0x00000004u;
+  _has_bits_[0] |= 0x00000008u;
 }
 inline void GeneratedCodeInfo_Annotation::clear_has_end() {
-  _has_bits_[0] &= ~0x00000004u;
+  _has_bits_[0] &= ~0x00000008u;
 }
 inline void GeneratedCodeInfo_Annotation::clear_end() {
   end_ = 0;
@@ -11394,15 +7622,7 @@
   return annotation_;
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 // -------------------------------------------------------------------
 
 // -------------------------------------------------------------------
@@ -11455,6 +7675,7 @@
 }  // namespace protobuf
 }  // namespace google
 
+#ifndef SWIG
 namespace google {
 namespace protobuf {
 
@@ -11483,14 +7704,10 @@
 inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldOptions_JSType>() {
   return ::google::protobuf::FieldOptions_JSType_descriptor();
 }
-template <> struct is_proto_enum< ::google::protobuf::MethodOptions_IdempotencyLevel> : ::google::protobuf::internal::true_type {};
-template <>
-inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::MethodOptions_IdempotencyLevel>() {
-  return ::google::protobuf::MethodOptions_IdempotencyLevel_descriptor();
-}
 
 }  // namespace protobuf
 }  // namespace google
+#endif  // SWIG
 
 // @@protoc_insertion_point(global_scope)
 
diff --git a/src/google/protobuf/descriptor.proto b/src/google/protobuf/descriptor.proto
index 8697a50..08b1555 100644
--- a/src/google/protobuf/descriptor.proto
+++ b/src/google/protobuf/descriptor.proto
@@ -40,12 +40,11 @@
 syntax = "proto2";
 
 package google.protobuf;
-option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor";
+option go_package = "descriptor";
 option java_package = "com.google.protobuf";
 option java_outer_classname = "DescriptorProtos";
 option csharp_namespace = "Google.Protobuf.Reflection";
 option objc_class_prefix = "GPB";
-option cc_enable_arenas = true;
 
 // descriptor.proto must be optimized for speed because reflection-based
 // algorithms don't work during bootstrapping.
@@ -102,8 +101,6 @@
   message ExtensionRange {
     optional int32 start = 1;
     optional int32 end = 2;
-
-    optional ExtensionRangeOptions options = 3;
   }
   repeated ExtensionRange extension_range = 5;
 
@@ -124,14 +121,6 @@
   repeated string reserved_name = 10;
 }
 
-message ExtensionRangeOptions {
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
-}
-
 // Describes a field within a message.
 message FieldDescriptorProto {
   enum Type {
@@ -150,11 +139,7 @@
     TYPE_FIXED32        = 7;
     TYPE_BOOL           = 8;
     TYPE_STRING         = 9;
-    // Tag-delimited aggregate.
-    // Group type is deprecated and not supported in proto3. However, Proto3
-    // implementations should still be able to parse the group wire format and
-    // treat group fields as unknown fields.
-    TYPE_GROUP          = 10;
+    TYPE_GROUP          = 10;  // Tag-delimited aggregate.
     TYPE_MESSAGE        = 11;  // Length-delimited aggregate.
 
     // New in version 2.
@@ -172,6 +157,7 @@
     LABEL_OPTIONAL      = 1;
     LABEL_REQUIRED      = 2;
     LABEL_REPEATED      = 3;
+    // TODO(sanjay): Should we add LABEL_MAP?
   };
 
   optional string name = 1;
@@ -216,7 +202,6 @@
 // Describes a oneof.
 message OneofDescriptorProto {
   optional string name = 1;
-  optional OneofOptions options = 2;
 }
 
 // Describes an enum type.
@@ -226,26 +211,6 @@
   repeated EnumValueDescriptorProto value = 2;
 
   optional EnumOptions options = 3;
-
-  // Range of reserved numeric values. Reserved values may not be used by
-  // entries in the same enum. Reserved ranges may not overlap.
-  //
-  // Note that this is distinct from DescriptorProto.ReservedRange in that it
-  // is inclusive such that it can appropriately represent the entire int32
-  // domain.
-  message EnumReservedRange {
-    optional int32 start = 1; // Inclusive.
-    optional int32 end = 2;   // Inclusive.
-  }
-
-  // Range of reserved numeric values. Reserved numeric values may not be used
-  // by enum values in the same enum declaration. Reserved ranges may not
-  // overlap.
-  repeated EnumReservedRange reserved_range = 4;
-
-  // Reserved enum value names, which may not be reused. A given name may only
-  // be reserved once.
-  repeated string reserved_name = 5;
 }
 
 // Describes a value within an enum.
@@ -339,8 +304,19 @@
   // top-level extensions defined in the file.
   optional bool java_multiple_files = 10 [default=false];
 
-  // This option does nothing.
-  optional bool java_generate_equals_and_hash = 20 [deprecated=true];
+  // If set true, then the Java code generator will generate equals() and
+  // hashCode() methods for all messages defined in the .proto file.
+  // This increases generated code size, potentially substantially for large
+  // protos, which may harm a memory-constrained application.
+  // - In the full runtime this is a speed optimization, as the
+  // AbstractMessage base class includes reflection-based implementations of
+  // these methods.
+  // - In the lite runtime, setting this option changes the semantics of
+  // equals() and hashCode() to more closely match those of the full runtime;
+  // the generated methods compute their results based on field values rather
+  // than object identity. (Implementations should not assume that hashcodes
+  // will be consistent across runtimes or versions of the protocol compiler.)
+  optional bool java_generate_equals_and_hash = 20 [default=false];
 
   // If set true, then the Java2 code generator will generate code that
   // throws an exception whenever an attempt is made to assign a non-UTF-8
@@ -382,7 +358,6 @@
   optional bool cc_generic_services = 16 [default=false];
   optional bool java_generic_services = 17 [default=false];
   optional bool py_generic_services = 18 [default=false];
-  optional bool php_generic_services = 42 [default=false];
 
   // Is this file deprecated?
   // Depending on the target platform, this can emit Deprecated annotations
@@ -402,27 +377,10 @@
   // Namespace for generated classes; defaults to the package.
   optional string csharp_namespace = 37;
 
-  // By default Swift generators will take the proto package and CamelCase it
-  // replacing '.' with underscore and use that to prefix the types/symbols
-  // defined. When this options is provided, they will use this value instead
-  // to prefix the types/symbols defined.
-  optional string swift_prefix = 39;
-
-  // Sets the php class prefix which is prepended to all php generated classes
-  // from this .proto. Default is empty.
-  optional string php_class_prefix = 40;
-
-  // Use this option to change the namespace of php generated classes. Default
-  // is empty. When this option is empty, the package name will be used for
-  // determining the namespace.
-  optional string php_namespace = 41;
-
-  // The parser stores options it doesn't recognize here.
-  // See the documentation for the "Options" section above.
+  // The parser stores options it doesn't recognize here. See above.
   repeated UninterpretedOption uninterpreted_option = 999;
 
-  // Clients can define custom options in extensions of this message.
-  // See the documentation for the "Options" section above.
+  // Clients can define custom options in extensions of this message. See above.
   extensions 1000 to max;
 
   reserved 38;
@@ -483,9 +441,6 @@
   // parser.
   optional bool map_entry = 7;
 
-  reserved 8;  // javalite_serializable
-  reserved 9;  // javanano_as_lite
-
   // The parser stores options it doesn't recognize here. See above.
   repeated UninterpretedOption uninterpreted_option = 999;
 
@@ -514,17 +469,16 @@
   // false will avoid using packed encoding.
   optional bool packed = 2;
 
+
   // The jstype option determines the JavaScript type used for values of the
   // field.  The option is permitted only for 64 bit integral and fixed types
-  // (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
-  // is represented as JavaScript string, which avoids loss of precision that
-  // can happen when a large value is converted to a floating point JavaScript.
-  // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
-  // use the JavaScript "number" type.  The behavior of the default option
-  // JS_NORMAL is implementation dependent.
-  //
-  // This option is an enum to permit additional types to be added, e.g.
-  // goog.math.Integer.
+  // (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
+  // represented as JavaScript strings.  This avoids loss of precision that can
+  // happen when a large value is converted to a floating point JavaScript
+  // numbers.  Specifying JS_NUMBER for the jstype causes the generated
+  // JavaScript code to use the JavaScript "number" type instead of strings.
+  // This option is an enum to permit additional types to be added,
+  // e.g. goog.math.Integer.
   optional JSType jstype = 6 [default = JS_NORMAL];
   enum JSType {
     // Use the default type.
@@ -556,7 +510,7 @@
   //
   //
   // Note that implementations may choose not to check required fields within
-  // a lazy sub-message.  That is, calling IsInitialized() on the outer message
+  // a lazy sub-message.  That is, calling IsInitialized() on the outher message
   // may return true even if the inner message has missing required fields.
   // This is necessary because otherwise the inner message would have to be
   // parsed in order to perform the check, defeating the purpose of lazy
@@ -582,16 +536,6 @@
 
   // Clients can define custom options in extensions of this message. See above.
   extensions 1000 to max;
-
-  reserved 4;  // removed jtype
-}
-
-message OneofOptions {
-  // The parser stores options it doesn't recognize here. See above.
-  repeated UninterpretedOption uninterpreted_option = 999;
-
-  // Clients can define custom options in extensions of this message. See above.
-  extensions 1000 to max;
 }
 
 message EnumOptions {
@@ -606,8 +550,6 @@
   // is a formalization for deprecating enums.
   optional bool deprecated = 3 [default=false];
 
-  reserved 5;  // javanano_as_lite
-
   // The parser stores options it doesn't recognize here. See above.
   repeated UninterpretedOption uninterpreted_option = 999;
 
@@ -662,17 +604,6 @@
   // this is a formalization for deprecating methods.
   optional bool deprecated = 33 [default=false];
 
-  // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
-  // or neither? HTTP based RPC implementation may choose GET verb for safe
-  // methods, and PUT verb for idempotent methods instead of the default POST.
-  enum IdempotencyLevel {
-    IDEMPOTENCY_UNKNOWN = 0;
-    NO_SIDE_EFFECTS     = 1; // implies idempotent
-    IDEMPOTENT          = 2; // idempotent, but may have side effects
-  }
-  optional IdempotencyLevel idempotency_level =
-      34 [default=IDEMPOTENCY_UNKNOWN];
-
   // The parser stores options it doesn't recognize here. See above.
   repeated UninterpretedOption uninterpreted_option = 999;
 
diff --git a/src/google/protobuf/descriptor_database.cc b/src/google/protobuf/descriptor_database.cc
index ba85ef1..2117c02 100644
--- a/src/google/protobuf/descriptor_database.cc
+++ b/src/google/protobuf/descriptor_database.cc
@@ -39,9 +39,8 @@
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/wire_format_lite_inl.h>
 #include <google/protobuf/stubs/strutil.h>
-
-#include <google/protobuf/stubs/map_util.h>
 #include <google/protobuf/stubs/stl_util.h>
+#include <google/protobuf/stubs/map_util.h>
 
 namespace google {
 namespace protobuf {
@@ -98,12 +97,11 @@
 
   // Try to look up the symbol to make sure a super-symbol doesn't already
   // exist.
-  typename std::map<string, Value>::iterator iter = FindLastLessOrEqual(name);
+  typename map<string, Value>::iterator iter = FindLastLessOrEqual(name);
 
   if (iter == by_symbol_.end()) {
     // Apparently the map is currently empty.  Just insert and be done with it.
-    by_symbol_.insert(
-        typename std::map<string, Value>::value_type(name, value));
+    by_symbol_.insert(typename map<string, Value>::value_type(name, value));
     return true;
   }
 
@@ -130,8 +128,7 @@
 
   // Insert the new symbol using the iterator as a hint, the new entry will
   // appear immediately before the one the iterator is pointing at.
-  by_symbol_.insert(iter,
-                    typename std::map<string, Value>::value_type(name, value));
+  by_symbol_.insert(iter, typename map<string, Value>::value_type(name, value));
 
   return true;
 }
@@ -182,7 +179,7 @@
 template <typename Value>
 Value SimpleDescriptorDatabase::DescriptorIndex<Value>::FindSymbol(
     const string& name) {
-  typename std::map<string, Value>::iterator iter = FindLastLessOrEqual(name);
+  typename map<string, Value>::iterator iter = FindLastLessOrEqual(name);
 
   return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name)) ?
          iter->second : Value();
@@ -199,8 +196,8 @@
 template <typename Value>
 bool SimpleDescriptorDatabase::DescriptorIndex<Value>::FindAllExtensionNumbers(
     const string& containing_type,
-    std::vector<int>* output) {
-  typename std::map<std::pair<string, int>, Value>::const_iterator it =
+    vector<int>* output) {
+  typename map<pair<string, int>, Value>::const_iterator it =
       by_extension_.lower_bound(std::make_pair(containing_type, 0));
   bool success = false;
 
@@ -214,14 +211,13 @@
 }
 
 template <typename Value>
-typename std::map<string, Value>::iterator
+typename map<string, Value>::iterator
 SimpleDescriptorDatabase::DescriptorIndex<Value>::FindLastLessOrEqual(
     const string& name) {
   // Find the last key in the map which sorts less than or equal to the
   // symbol name.  Since upper_bound() returns the *first* key that sorts
   // *greater* than the input, we want the element immediately before that.
-  typename std::map<string, Value>::iterator iter =
-      by_symbol_.upper_bound(name);
+  typename map<string, Value>::iterator iter = by_symbol_.upper_bound(name);
   if (iter != by_symbol_.begin()) --iter;
   return iter;
 }
@@ -231,7 +227,7 @@
     const string& sub_symbol, const string& super_symbol) {
   return sub_symbol == super_symbol ||
          (HasPrefixString(super_symbol, sub_symbol) &&
-          super_symbol[sub_symbol.size()] == '.');
+             super_symbol[sub_symbol.size()] == '.');
 }
 
 template <typename Value>
@@ -288,7 +284,7 @@
 
 bool SimpleDescriptorDatabase::FindAllExtensionNumbers(
     const string& extendee_type,
-    std::vector<int>* output) {
+    vector<int>* output) {
   return index_.FindAllExtensionNumbers(extendee_type, output);
 }
 
@@ -344,7 +340,7 @@
 bool EncodedDescriptorDatabase::FindNameOfFileContainingSymbol(
     const string& symbol_name,
     string* output) {
-  std::pair<const void*, int> encoded_file = index_.FindSymbol(symbol_name);
+  pair<const void*, int> encoded_file = index_.FindSymbol(symbol_name);
   if (encoded_file.first == NULL) return false;
 
   // Optimization:  The name should be the first field in the encoded message.
@@ -356,7 +352,7 @@
       FileDescriptorProto::kNameFieldNumber,
       internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
 
-  if (input.ReadTagNoLastTag() == kNameTag) {
+  if (input.ReadTag() == kNameTag) {
     // Success!
     return internal::WireFormatLite::ReadString(&input, output);
   } else {
@@ -380,12 +376,12 @@
 
 bool EncodedDescriptorDatabase::FindAllExtensionNumbers(
     const string& extendee_type,
-    std::vector<int>* output) {
+    vector<int>* output) {
   return index_.FindAllExtensionNumbers(extendee_type, output);
 }
 
 bool EncodedDescriptorDatabase::MaybeParse(
-    std::pair<const void*, int> encoded_file,
+    pair<const void*, int> encoded_file,
     FileDescriptorProto* output) {
   if (encoded_file.first == NULL) return false;
   return output->ParseFromArray(encoded_file.first, encoded_file.second);
@@ -435,11 +431,11 @@
 
 bool DescriptorPoolDatabase::FindAllExtensionNumbers(
     const string& extendee_type,
-    std::vector<int>* output) {
+    vector<int>* output) {
   const Descriptor* extendee = pool_.FindMessageTypeByName(extendee_type);
   if (extendee == NULL) return false;
 
-  std::vector<const FieldDescriptor*> extensions;
+  vector<const FieldDescriptor*> extensions;
   pool_.FindAllExtensions(extendee, &extensions);
 
   for (int i = 0; i < extensions.size(); ++i) {
@@ -458,7 +454,7 @@
   sources_.push_back(source2);
 }
 MergedDescriptorDatabase::MergedDescriptorDatabase(
-    const std::vector<DescriptorDatabase*>& sources)
+    const vector<DescriptorDatabase*>& sources)
   : sources_(sources) {}
 MergedDescriptorDatabase::~MergedDescriptorDatabase() {}
 
@@ -521,23 +517,23 @@
 
 bool MergedDescriptorDatabase::FindAllExtensionNumbers(
     const string& extendee_type,
-    std::vector<int>* output) {
-  std::set<int> merged_results;
-  std::vector<int> results;
+    vector<int>* output) {
+  set<int> merged_results;
+  vector<int> results;
   bool success = false;
 
   for (int i = 0; i < sources_.size(); i++) {
     if (sources_[i]->FindAllExtensionNumbers(extendee_type, &results)) {
-      std::copy(results.begin(), results.end(),
-                std::insert_iterator<std::set<int> >(merged_results,
-                                                     merged_results.begin()));
+      std::copy(
+          results.begin(), results.end(),
+          insert_iterator<set<int> >(merged_results, merged_results.begin()));
       success = true;
     }
     results.clear();
   }
 
   std::copy(merged_results.begin(), merged_results.end(),
-            std::insert_iterator<std::vector<int> >(*output, output->end()));
+            insert_iterator<vector<int> >(*output, output->end()));
 
   return success;
 }
diff --git a/src/google/protobuf/descriptor_database.h b/src/google/protobuf/descriptor_database.h
index 28f8af7..86002d5 100644
--- a/src/google/protobuf/descriptor_database.h
+++ b/src/google/protobuf/descriptor_database.h
@@ -97,23 +97,11 @@
   // This method has a default implementation that always returns
   // false.
   virtual bool FindAllExtensionNumbers(const string& /* extendee_type */,
-                                       std::vector<int>* /* output */) {
+                                       vector<int>* /* output */) {
     return false;
   }
 
 
-  // Finds the file names and appends them to the output in an
-  // undefined order. This method is best-effort: it's not guaranteed that the
-  // database will find all files. Returns true if the database supports
-  // searching all file names, otherwise returns false and leaves output
-  // unchanged.
-  //
-  // This method has a default implementation that always returns
-  // false.
-  virtual bool FindAllFileNames(std::vector<string>* output) {
-    return false;
-  }
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorDatabase);
 };
@@ -162,7 +150,7 @@
                                    int field_number,
                                    FileDescriptorProto* output);
   bool FindAllExtensionNumbers(const string& extendee_type,
-                               std::vector<int>* output);
+                               vector<int>* output);
 
  private:
   // So that it can use DescriptorIndex.
@@ -187,12 +175,12 @@
     Value FindSymbol(const string& name);
     Value FindExtension(const string& containing_type, int field_number);
     bool FindAllExtensionNumbers(const string& containing_type,
-                                 std::vector<int>* output);
+                                 vector<int>* output);
 
    private:
-    std::map<string, Value> by_name_;
-    std::map<string, Value> by_symbol_;
-    std::map<std::pair<string, int>, Value> by_extension_;
+    map<string, Value> by_name_;
+    map<string, Value> by_symbol_;
+    map<pair<string, int>, Value> by_extension_;
 
     // Invariant:  The by_symbol_ map does not contain any symbols which are
     // prefixes of other symbols in the map.  For example, "foo.bar" is a
@@ -247,7 +235,7 @@
 
     // Find the last entry in the by_symbol_ map whose key is less than or
     // equal to the given name.
-    typename std::map<string, Value>::iterator FindLastLessOrEqual(
+    typename map<string, Value>::iterator FindLastLessOrEqual(
         const string& name);
 
     // True if either the arguments are equal or super_symbol identifies a
@@ -262,7 +250,7 @@
 
 
   DescriptorIndex<const FileDescriptorProto*> index_;
-  std::vector<const FileDescriptorProto*> files_to_delete_;
+  vector<const FileDescriptorProto*> files_to_delete_;
 
   // If file is non-NULL, copy it into *output and return true, otherwise
   // return false.
@@ -307,16 +295,15 @@
                                    int field_number,
                                    FileDescriptorProto* output);
   bool FindAllExtensionNumbers(const string& extendee_type,
-                               std::vector<int>* output);
+                               vector<int>* output);
 
  private:
-  SimpleDescriptorDatabase::DescriptorIndex<std::pair<const void*, int> >
-      index_;
-  std::vector<void*> files_to_delete_;
+  SimpleDescriptorDatabase::DescriptorIndex<pair<const void*, int> > index_;
+  vector<void*> files_to_delete_;
 
   // If encoded_file.first is non-NULL, parse the data into *output and return
   // true, otherwise return false.
-  bool MaybeParse(std::pair<const void*, int> encoded_file,
+  bool MaybeParse(pair<const void*, int> encoded_file,
                   FileDescriptorProto* output);
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EncodedDescriptorDatabase);
@@ -337,7 +324,7 @@
                                    int field_number,
                                    FileDescriptorProto* output);
   bool FindAllExtensionNumbers(const string& extendee_type,
-                               std::vector<int>* output);
+                               vector<int>* output);
 
  private:
   const DescriptorPool& pool_;
@@ -354,8 +341,7 @@
   // Merge more than two databases.  The sources remain property of the caller.
   // The vector may be deleted after the constructor returns but the
   // DescriptorDatabases need to stick around.
-  explicit MergedDescriptorDatabase(
-      const std::vector<DescriptorDatabase*>& sources);
+  explicit MergedDescriptorDatabase(const vector<DescriptorDatabase*>& sources);
   ~MergedDescriptorDatabase();
 
   // implements DescriptorDatabase -----------------------------------
@@ -369,11 +355,11 @@
   // Merges the results of calling all databases. Returns true iff any
   // of the databases returned true.
   bool FindAllExtensionNumbers(const string& extendee_type,
-                               std::vector<int>* output);
+                               vector<int>* output);
 
 
  private:
-  std::vector<DescriptorDatabase*> sources_;
+  vector<DescriptorDatabase*> sources_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MergedDescriptorDatabase);
 };
 
diff --git a/src/google/protobuf/descriptor_database_unittest.cc b/src/google/protobuf/descriptor_database_unittest.cc
index 9d71088..1fc3816 100644
--- a/src/google/protobuf/descriptor_database_unittest.cc
+++ b/src/google/protobuf/descriptor_database_unittest.cc
@@ -44,9 +44,11 @@
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/text_format.h>
+#include <google/protobuf/stubs/strutil.h>
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
@@ -247,10 +249,6 @@
     FileDescriptorProto file;
     EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.qux", &file));
     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));
   }
 
   {
@@ -413,7 +411,7 @@
     "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
 
   {
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_TRUE(database_->FindAllExtensionNumbers("Foo", &numbers));
     ASSERT_EQ(2, numbers.size());
     std::sort(numbers.begin(), numbers.end());
@@ -422,7 +420,7 @@
   }
 
   {
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_TRUE(database_->FindAllExtensionNumbers("corge.Bar", &numbers));
     // Note: won't find extension 56 due to the name not being fully qualified.
     ASSERT_EQ(1, numbers.size());
@@ -431,13 +429,13 @@
 
   {
     // Can't find extensions for non-existent types.
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_FALSE(database_->FindAllExtensionNumbers("NoSuchType", &numbers));
   }
 
   {
     // Can't find extensions for unqualified types.
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_FALSE(database_->FindAllExtensionNumbers("Bar", &numbers));
   }
 }
@@ -711,7 +709,7 @@
 TEST_F(MergedDescriptorDatabaseTest, FindAllExtensionNumbers) {
   {
     // Message only has extension in database1_
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Foo", &numbers));
     ASSERT_EQ(1, numbers.size());
     EXPECT_EQ(3, numbers[0]);
@@ -719,7 +717,7 @@
 
   {
     // Message only has extension in database2_
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Bar", &numbers));
     ASSERT_EQ(1, numbers.size());
     EXPECT_EQ(5, numbers[0]);
@@ -727,7 +725,7 @@
 
   {
     // Merge results from the two databases.
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Baz", &numbers));
     ASSERT_EQ(2, numbers.size());
     std::sort(numbers.begin(), numbers.end());
@@ -736,7 +734,7 @@
   }
 
   {
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_TRUE(reverse_merged_.FindAllExtensionNumbers("Baz", &numbers));
     ASSERT_EQ(2, numbers.size());
     std::sort(numbers.begin(), numbers.end());
@@ -746,7 +744,7 @@
 
   {
     // Can't find extensions for a non-existent message.
-    std::vector<int> numbers;
+    vector<int> numbers;
     EXPECT_FALSE(reverse_merged_.FindAllExtensionNumbers("Blah", &numbers));
   }
 }
diff --git a/src/google/protobuf/descriptor_unittest.cc b/src/google/protobuf/descriptor_unittest.cc
index 6cca0ad..f937b9e 100644
--- a/src/google/protobuf/descriptor_unittest.cc
+++ b/src/google/protobuf/descriptor_unittest.cc
@@ -34,7 +34,6 @@
 //
 // This file makes extensive use of RFC 3092.  :)
 
-#include <limits>
 #include <memory>
 #ifndef _SHARED_PTR_H
 #include <google/protobuf/stubs/shared_ptr.h>
@@ -42,28 +41,24 @@
 #include <vector>
 
 #include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/compiler/parser.h>
 #include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/unittest_custom_options.pb.h>
-#include <google/protobuf/unittest_lazy_dependencies.pb.h>
-#include <google/protobuf/unittest_proto3_arena.pb.h>
-#include <google/protobuf/io/tokenizer.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor_database.h>
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/text_format.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
 
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/stringprintf.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
-
 namespace google {
 namespace protobuf {
 
@@ -159,14 +154,6 @@
   return result;
 }
 
-EnumDescriptorProto::EnumReservedRange* AddReservedRange(
-    EnumDescriptorProto* parent, int start, int end) {
-  EnumDescriptorProto::EnumReservedRange* result = parent->add_reserved_range();
-  result->set_start(start);
-  result->set_end(end);
-  return result;
-}
-
 EnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto,
                                        const string& name, int number) {
   EnumValueDescriptorProto* result = enum_proto->add_value();
@@ -502,65 +489,6 @@
   }
 }
 
-void ExtractDebugString(
-    const FileDescriptor* file, std::set<string>* visited,
-    std::vector<std::pair<string, string> >* debug_strings) {
-  if (!visited->insert(file->name()).second) {
-    return;
-  }
-  for (int i = 0; i < file->dependency_count(); ++i) {
-    ExtractDebugString(file->dependency(i), visited, debug_strings);
-  }
-  debug_strings->push_back(std::make_pair(file->name(), file->DebugString()));
-}
-
-class SimpleErrorCollector : public google::protobuf::io::ErrorCollector {
- public:
-  // implements ErrorCollector ---------------------------------------
-  void AddError(int line, int column, const string& message) {
-    last_error_ = StringPrintf("%d:%d:", line, column) + message;
-  }
-
-  const string& last_error() { return last_error_; }
-
- private:
-  string last_error_;
-};
-// Test that the result of FileDescriptor::DebugString() can be used to create
-// the original descriptors.
-TEST_F(FileDescriptorTest, DebugStringRoundTrip) {
-  std::set<string> visited;
-  std::vector<std::pair<string, string> > debug_strings;
-  ExtractDebugString(protobuf_unittest::TestAllTypes::descriptor()->file(),
-                     &visited, &debug_strings);
-  ExtractDebugString(
-      protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file(),
-      &visited, &debug_strings);
-  ExtractDebugString(proto3_arena_unittest::TestAllTypes::descriptor()->file(),
-                     &visited, &debug_strings);
-  ASSERT_GE(debug_strings.size(), 3);
-
-  DescriptorPool pool;
-  for (int i = 0; i < debug_strings.size(); ++i) {
-    const string& name = debug_strings[i].first;
-    const string& content = debug_strings[i].second;
-    google::protobuf::io::ArrayInputStream input_stream(content.data(), content.size());
-    SimpleErrorCollector error_collector;
-    google::protobuf::io::Tokenizer tokenizer(&input_stream, &error_collector);
-    google::protobuf::compiler::Parser parser;
-    parser.RecordErrorsTo(&error_collector);
-    FileDescriptorProto proto;
-    ASSERT_TRUE(parser.Parse(&tokenizer, &proto))
-        << error_collector.last_error() << "\n"
-        << content;
-    ASSERT_EQ("", error_collector.last_error());
-    proto.set_name(name);
-    const FileDescriptor* descriptor = pool.BuildFile(proto);
-    ASSERT_TRUE(descriptor != NULL) << proto.DebugString();
-    EXPECT_EQ(content, descriptor->DebugString());
-  }
-}
-
 // ===================================================================
 
 // Test simple flat messages and fields.
@@ -846,9 +774,9 @@
 TEST_F(DescriptorTest, FieldJsonName) {
   EXPECT_EQ("fieldName1", message4_->field(0)->json_name());
   EXPECT_EQ("fieldName2", message4_->field(1)->json_name());
-  EXPECT_EQ("FieldName3", message4_->field(2)->json_name());
-  EXPECT_EQ("FieldName4", message4_->field(3)->json_name());
-  EXPECT_EQ("FIELDNAME5", message4_->field(4)->json_name());
+  EXPECT_EQ("fieldName3", message4_->field(2)->json_name());
+  EXPECT_EQ("fieldName4", message4_->field(3)->json_name());
+  EXPECT_EQ("fIELDNAME5", message4_->field(4)->json_name());
   EXPECT_EQ("@type", message4_->field(5)->json_name());
 
   DescriptorProto proto;
@@ -866,20 +794,10 @@
   ASSERT_EQ(6, proto.field_size());
   EXPECT_EQ("fieldName1", proto.field(0).json_name());
   EXPECT_EQ("fieldName2", proto.field(1).json_name());
-  EXPECT_EQ("FieldName3", proto.field(2).json_name());
-  EXPECT_EQ("FieldName4", proto.field(3).json_name());
-  EXPECT_EQ("FIELDNAME5", proto.field(4).json_name());
+  EXPECT_EQ("fieldName3", proto.field(2).json_name());
+  EXPECT_EQ("fieldName4", proto.field(3).json_name());
+  EXPECT_EQ("fIELDNAME5", proto.field(4).json_name());
   EXPECT_EQ("@type", proto.field(5).json_name());
-
-  // Test generated descriptor.
-  const Descriptor* generated = protobuf_unittest::TestJsonName::descriptor();
-  ASSERT_EQ(6, generated->field_count());
-  EXPECT_EQ("fieldName1", generated->field(0)->json_name());
-  EXPECT_EQ("fieldName2", generated->field(1)->json_name());
-  EXPECT_EQ("FieldName3", generated->field(2)->json_name());
-  EXPECT_EQ("FieldName4", generated->field(3)->json_name());
-  EXPECT_EQ("FIELDNAME5", generated->field(4)->json_name());
-  EXPECT_EQ("@type", generated->field(5)->json_name());
 }
 
 TEST_F(DescriptorTest, FieldFile) {
@@ -1934,7 +1852,7 @@
 }
 
 TEST_F(ExtensionDescriptorTest, FindAllExtensions) {
-  std::vector<const FieldDescriptor*> extensions;
+  vector<const FieldDescriptor*> extensions;
   pool_.FindAllExtensions(foo_, &extensions);
   ASSERT_EQ(4, extensions.size());
   EXPECT_EQ(10, extensions[0]->number());
@@ -2057,137 +1975,6 @@
 
 // ===================================================================
 
-// Test reserved enum fields.
-class ReservedEnumDescriptorTest : public testing::Test {
- protected:
-  virtual void SetUp() {
-    // Build descriptors for the following definitions:
-    //
-    //   enum Foo {
-    //     BAR = 1;
-    //     reserved 2, 9 to 11, 15;
-    //     reserved "foo", "bar";
-    //   }
-
-    FileDescriptorProto foo_file;
-    foo_file.set_name("foo.proto");
-
-    EnumDescriptorProto* foo = AddEnum(&foo_file, "Foo");
-    EnumDescriptorProto* edge1 = AddEnum(&foo_file, "Edge1");
-    EnumDescriptorProto* edge2 = AddEnum(&foo_file, "Edge2");
-
-    AddEnumValue(foo, "BAR", 4);
-    AddReservedRange(foo, -5, -3);
-    AddReservedRange(foo, -2, 1);
-    AddReservedRange(foo, 2, 3);
-    AddReservedRange(foo, 9, 12);
-    AddReservedRange(foo, 15, 16);
-
-    foo->add_reserved_name("foo");
-    foo->add_reserved_name("bar");
-
-    // Some additional edge cases that cover most or all of the range of enum
-    // values
-
-    // Note: We use INT_MAX as the maximum reserved range upper bound,
-    // inclusive.
-    AddEnumValue(edge1, "EDGE1", 1);
-    AddReservedRange(edge1, 10, INT_MAX);
-    AddEnumValue(edge2, "EDGE2", 15);
-    AddReservedRange(edge2, INT_MIN, 10);
-
-    // Build the descriptors and get the pointers.
-    foo_file_ = pool_.BuildFile(foo_file);
-    ASSERT_TRUE(foo_file_ != NULL);
-
-    ASSERT_EQ(3, foo_file_->enum_type_count());
-    foo_ = foo_file_->enum_type(0);
-    edge1_ = foo_file_->enum_type(1);
-    edge2_ = foo_file_->enum_type(2);
-  }
-
-  DescriptorPool pool_;
-  const FileDescriptor* foo_file_;
-  const EnumDescriptor* foo_;
-  const EnumDescriptor* edge1_;
-  const EnumDescriptor* edge2_;
-};
-
-TEST_F(ReservedEnumDescriptorTest, ReservedRanges) {
-  ASSERT_EQ(5, foo_->reserved_range_count());
-
-  EXPECT_EQ(-5, foo_->reserved_range(0)->start);
-  EXPECT_EQ(-3, foo_->reserved_range(0)->end);
-
-  EXPECT_EQ(-2, foo_->reserved_range(1)->start);
-  EXPECT_EQ(1, foo_->reserved_range(1)->end);
-
-  EXPECT_EQ(2, foo_->reserved_range(2)->start);
-  EXPECT_EQ(3, foo_->reserved_range(2)->end);
-
-  EXPECT_EQ(9, foo_->reserved_range(3)->start);
-  EXPECT_EQ(12, foo_->reserved_range(3)->end);
-
-  EXPECT_EQ(15, foo_->reserved_range(4)->start);
-  EXPECT_EQ(16, foo_->reserved_range(4)->end);
-
-  ASSERT_EQ(1, edge1_->reserved_range_count());
-  EXPECT_EQ(10, edge1_->reserved_range(0)->start);
-  EXPECT_EQ(INT_MAX, edge1_->reserved_range(0)->end);
-
-  ASSERT_EQ(1, edge2_->reserved_range_count());
-  EXPECT_EQ(INT_MIN, edge2_->reserved_range(0)->start);
-  EXPECT_EQ(10, edge2_->reserved_range(0)->end);
-}
-
-TEST_F(ReservedEnumDescriptorTest, IsReservedNumber) {
-  EXPECT_TRUE(foo_->IsReservedNumber(-5));
-  EXPECT_TRUE(foo_->IsReservedNumber(-4));
-  EXPECT_TRUE(foo_->IsReservedNumber(-3));
-  EXPECT_TRUE(foo_->IsReservedNumber(-2));
-  EXPECT_TRUE(foo_->IsReservedNumber(-1));
-  EXPECT_TRUE(foo_->IsReservedNumber(0));
-  EXPECT_TRUE(foo_->IsReservedNumber(1));
-  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(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(16));
-  EXPECT_FALSE(foo_->IsReservedNumber(17));
-
-  EXPECT_FALSE(edge1_->IsReservedNumber(9));
-  EXPECT_TRUE(edge1_->IsReservedNumber(10));
-  EXPECT_TRUE(edge1_->IsReservedNumber(INT_MAX - 1));
-  EXPECT_TRUE(edge1_->IsReservedNumber(INT_MAX));
-
-  EXPECT_TRUE(edge2_->IsReservedNumber(INT_MIN));
-  EXPECT_TRUE(edge2_->IsReservedNumber(9));
-  EXPECT_TRUE(edge2_->IsReservedNumber(10));
-  EXPECT_FALSE(edge2_->IsReservedNumber(11));
-}
-
-TEST_F(ReservedEnumDescriptorTest, ReservedNames) {
-  ASSERT_EQ(2, foo_->reserved_name_count());
-
-  EXPECT_EQ("foo", foo_->reserved_name(0));
-  EXPECT_EQ("bar", foo_->reserved_name(1));
-}
-
-TEST_F(ReservedEnumDescriptorTest, IsReservedName) {
-  EXPECT_TRUE (foo_->IsReservedName("foo"));
-  EXPECT_TRUE (foo_->IsReservedName("bar"));
-  EXPECT_FALSE(foo_->IsReservedName("baz"));
-}
-
-// ===================================================================
-
 class MiscTest : public testing::Test {
  protected:
   // Function which makes a field descriptor of the given type.
@@ -2829,7 +2616,7 @@
 
   // Verify that no extension options were set, but they were left as
   // uninterpreted_options.
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   file->options().GetReflection()->ListFields(file->options(), &fields);
   ASSERT_EQ(2, fields.size());
   EXPECT_TRUE(file->options().has_optimize_for());
@@ -2918,7 +2705,6 @@
       protobuf_unittest::TestMessageWithCustomOptions::descriptor();
   const FileDescriptor* file = message->file();
   const FieldDescriptor* field = message->FindFieldByName("field1");
-  const OneofDescriptor* oneof = message->FindOneofByName("AnOneof");
   const EnumDescriptor* enm = message->FindEnumTypeByName("AnEnum");
   // TODO(benjy): Support EnumValue options, once the compiler does.
   const ServiceDescriptor* service =
@@ -2933,8 +2719,6 @@
             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,
@@ -3480,85 +3264,6 @@
   EXPECT_EQ(protobuf_unittest::NewOptionType::NEW_VALUE, new_enum_opt.value());
 }
 
-// Test that FileDescriptor::DebugString() formats custom options correctly.
-TEST(CustomOptions, DebugString) {
-  DescriptorPool pool;
-
-  FileDescriptorProto file_proto;
-  MessageOptions::descriptor()->file()->CopyTo(&file_proto);
-  ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
-
-  // Add "foo.proto":
-  //   import "google/protobuf/descriptor.proto";
-  //   package "protobuf_unittest";
-  //   option (protobuf_unittest.cc_option1) = 1;
-  //   option (protobuf_unittest.cc_option2) = 2;
-  //   extend google.protobuf.FieldOptions {
-  //     optional int32 cc_option1 = 7736974;
-  //     optional int32 cc_option2 = 7736975;
-  //   }
-  ASSERT_TRUE(TextFormat::ParseFromString(
-      "name: \"foo.proto\" "
-      "package: \"protobuf_unittest\" "
-      "dependency: \"google/protobuf/descriptor.proto\" "
-      "options { "
-      "  uninterpreted_option { "
-      "    name { "
-      "      name_part: \"protobuf_unittest.cc_option1\" "
-      "      is_extension: true "
-      "    } "
-      "    positive_int_value: 1 "
-      "  } "
-      "  uninterpreted_option { "
-      "    name { "
-      "      name_part: \"protobuf_unittest.cc_option2\" "
-      "      is_extension: true "
-      "    } "
-      "    positive_int_value: 2 "
-      "  } "
-      "} "
-      "extension { "
-      "  name: \"cc_option1\" "
-      "  extendee: \".google.protobuf.FileOptions\" "
-      // This field number is intentionally chosen to be the same as
-      // (.fileopt1) defined in unittest_custom_options.proto (linked
-      // in this test binary). This is to test whether we are messing
-      // generated pool with custom descriptor pools when dealing with
-      // custom options.
-      "  number: 7736974 "
-      "  label: LABEL_OPTIONAL "
-      "  type: TYPE_INT32 "
-      "}"
-      "extension { "
-      "  name: \"cc_option2\" "
-      "  extendee: \".google.protobuf.FileOptions\" "
-      "  number: 7736975 "
-      "  label: LABEL_OPTIONAL "
-      "  type: TYPE_INT32 "
-      "}",
-      &file_proto));
-  const FileDescriptor* descriptor = pool.BuildFile(file_proto);
-  ASSERT_TRUE(descriptor != NULL);
-
-  EXPECT_EQ(2, descriptor->extension_count());
-
-  ASSERT_EQ(
-      "syntax = \"proto2\";\n"
-      "\n"
-      "import \"google/protobuf/descriptor.proto\";\n"
-      "package protobuf_unittest;\n"
-      "\n"
-      "option (.protobuf_unittest.cc_option1) = 1;\n"
-      "option (.protobuf_unittest.cc_option2) = 2;\n"
-      "\n"
-      "extend .google.protobuf.FileOptions {\n"
-      "  optional int32 cc_option1 = 7736974;\n"
-      "  optional int32 cc_option2 = 7736975;\n"
-      "}\n"
-      "\n",
-      descriptor->DebugString());
-}
-
 // ===================================================================
 
 class ValidationErrorTest : public testing::Test {
@@ -3915,138 +3620,6 @@
     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 }"
-    "}",
-
-    "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 }"
-    "}",
-
-    "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 }"
-    "}",
-
-    "foo.proto: Foo: NUMBER: Reserved range 5 to 14"
-    " overlaps with already-defined range 10 to 19.\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 }"
-    "}",
-
-    "foo.proto: Foo: NUMBER: Reserved range -15 to -6"
-    " overlaps with already-defined range -20 to -11.\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 }"
-    "}",
-
-    "foo.proto: Foo: NUMBER: Reserved range -15 to 4"
-    " overlaps with already-defined range -20 to 9.\n");
-}
-
-TEST_F(ValidationErrorTest, EnumReservedRangeStartGreaterThanEnd) {
-  BuildFileWithErrors(
-    "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");
-}
-
-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\""
-    "}",
-
-    "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\""
-    "}",
-
-    "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 }"
-    "}");
-
-  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());
-}
-
 TEST_F(ValidationErrorTest, InvalidDefaults) {
   BuildFileWithErrors(
     "name: \"foo.proto\" "
@@ -5454,7 +5027,7 @@
   BuildFileWithErrors(
       EmbedAggregateValue("aggregate_value: \"1+2\""),
       "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option "
-      "value for \"foo\": Expected identifier, got: 1\n");
+      "value for \"foo\": Expected identifier.\n");
 }
 
 TEST_F(ValidationErrorTest, AggregateValueUnknownFields) {
@@ -5584,7 +5157,7 @@
     "message_type { name: \"Foo\" } ",
     &file_proto));
 
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog log;
@@ -5978,69 +5551,6 @@
       "with an existing enum type.\n");
 }
 
-TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) {
-  BuildFileWithErrors(
-      "syntax: 'proto3'"
-      "name: 'foo.proto' "
-      "enum_type {"
-      "  name: 'FooEnum' "
-      "  value { name: 'FOO_ENUM_BAZ' number: 0 }"
-      "  value { name: 'BAZ' number: 1 }"
-      "}",
-      "foo.proto: BAZ: NAME: When enum name is stripped and label is "
-      "PascalCased (Baz), this value label conflicts with FOO_ENUM_BAZ. This "
-      "will make the proto fail to compile for some languages, such as C#.\n");
-
-  BuildFileWithErrors(
-      "syntax: 'proto3'"
-      "name: 'foo.proto' "
-      "enum_type {"
-      "  name: 'FooEnum' "
-      "  value { name: 'FOOENUM_BAZ' number: 0 }"
-      "  value { name: 'BAZ' number: 1 }"
-      "}",
-      "foo.proto: BAZ: NAME: When enum name is stripped and label is "
-      "PascalCased (Baz), this value label conflicts with FOOENUM_BAZ. This "
-      "will make the proto fail to compile for some languages, such as C#.\n");
-
-  BuildFileWithErrors(
-      "syntax: 'proto3'"
-      "name: 'foo.proto' "
-      "enum_type {"
-      "  name: 'FooEnum' "
-      "  value { name: 'FOO_ENUM_BAR_BAZ' number: 0 }"
-      "  value { name: 'BAR__BAZ' number: 1 }"
-      "}",
-      "foo.proto: BAR__BAZ: NAME: When enum name is stripped and label is "
-      "PascalCased (BarBaz), this value label conflicts with "
-      "FOO_ENUM_BAR_BAZ. This will make the proto fail to compile for some "
-      "languages, such as C#.\n");
-
-  BuildFileWithErrors(
-      "syntax: 'proto3'"
-      "name: 'foo.proto' "
-      "enum_type {"
-      "  name: 'FooEnum' "
-      "  value { name: 'FOO_ENUM__BAR_BAZ' number: 0 }"
-      "  value { name: 'BAR_BAZ' number: 1 }"
-      "}",
-      "foo.proto: BAR_BAZ: NAME: When enum name is stripped and label is "
-      "PascalCased (BarBaz), this value label conflicts with "
-      "FOO_ENUM__BAR_BAZ. This will make the proto fail to compile for some "
-      "languages, such as C#.\n");
-
-  // This isn't an error because the underscore will cause the PascalCase to
-  // differ by case (BarBaz vs. Barbaz).
-  BuildFile(
-      "syntax: 'proto3'"
-      "name: 'foo.proto' "
-      "enum_type {"
-      "  name: 'FooEnum' "
-      "  value { name: 'BAR_BAZ' number: 0 }"
-      "  value { name: 'BARBAZ' number: 1 }"
-      "}");
-}
-
 TEST_F(ValidationErrorTest, MapEntryConflictsWithOneof) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
@@ -6324,7 +5834,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: OTHER: The JSON camcel-case name of field \"Name\" "
       "conflicts with field \"name\". This is not allowed in proto3.\n");
   // Underscores are ignored.
   BuildFileWithErrors(
@@ -6335,11 +5845,10 @@
       "  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: OTHER: The JSON camcel-case name of field \"_a__b_\" "
       "conflicts with field \"ab\". This is not allowed in proto3.\n");
 }
 
-
 // ===================================================================
 // DescriptorDatabase
 
@@ -6575,7 +6084,7 @@
   for (int i = 0; i < 2; ++i) {
     // Repeat the lookup twice, to check that we get consistent
     // results despite the fallback database lookup mutating the pool.
-    std::vector<const FieldDescriptor*> extensions;
+    vector<const FieldDescriptor*> extensions;
     pool.FindAllExtensions(foo, &extensions);
     ASSERT_EQ(1, extensions.size());
     EXPECT_EQ(5, extensions[0]->number());
@@ -6586,7 +6095,7 @@
   ErrorDescriptorDatabase error_database;
   DescriptorPool pool(&error_database);
 
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog log;
@@ -7098,360 +6607,6 @@
 
 // ===================================================================
 
-class LazilyBuildDependenciesTest : public testing::Test {
- public:
-  LazilyBuildDependenciesTest() : pool_(&db_, NULL) {
-    pool_.InternalSetLazilyBuildDependencies();
-  }
-
-  void ParseProtoAndAddToDb(const char* proto) {
-    FileDescriptorProto tmp;
-    ASSERT_TRUE(TextFormat::ParseFromString(proto, &tmp));
-    db_.Add(tmp);
-  }
-
-  void ParseProtoAndAddToDb(const string& proto) {
-    FileDescriptorProto tmp;
-    ASSERT_TRUE(TextFormat::ParseFromString(proto, &tmp));
-    db_.Add(tmp);
-  }
-
-  void AddSimpleMessageProtoFileToDb(const char* file_name,
-                                     const char* message_name) {
-    ParseProtoAndAddToDb("name: '" + string(file_name) +
-                         ".proto' "
-                         "package: \"protobuf_unittest\" "
-                         "message_type { "
-                         "  name:'" +
-                         string(message_name) +
-                         "' "
-                         "  field { name:'a' number:1 "
-                         "  label:LABEL_OPTIONAL "
-                         "  type_name:'int32' } "
-                         "}");
-  }
-
-  void AddSimpleEnumProtoFileToDb(const char* file_name, const char* enum_name,
-                                  const char* enum_value_name) {
-    ParseProtoAndAddToDb("name: '" + string(file_name) +
-                         ".proto' "
-                         "package: 'protobuf_unittest' "
-                         "enum_type { "
-                         "  name:'" +
-                         string(enum_name) +
-                         "' "
-                         "  value { name:'" +
-                         string(enum_value_name) +
-                         "' number:1 } "
-                         "}");
-  }
-
- protected:
-  SimpleDescriptorDatabase db_;
-  DescriptorPool pool_;
-};
-
-TEST_F(LazilyBuildDependenciesTest, Message) {
-  ParseProtoAndAddToDb(
-      "name: 'foo.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'bar.proto' "
-      "message_type { "
-      "  name:'Foo' "
-      "  field { name:'bar' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Bar' } "
-      "}");
-  AddSimpleMessageProtoFileToDb("bar", "Bar");
-
-  // Verify neither has been built yet.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("foo.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto"));
-
-  const FileDescriptor* file = pool_.FindFileByName("foo.proto");
-
-  // Verify only foo gets built when asking for foo.proto
-  EXPECT_TRUE(file != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("foo.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto"));
-
-  // Verify calling FindFieldBy* works when the type of the field was
-  // not built at cross link time. Verify this doesn't build the file
-  // the field's type is defined in, as well.
-  const Descriptor* desc = file->FindMessageTypeByName("Foo");
-  const FieldDescriptor* field = desc->FindFieldByName("bar");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_EQ(field, desc->FindFieldByNumber(1));
-  EXPECT_EQ(field, desc->FindFieldByLowercaseName("bar"));
-  EXPECT_EQ(field, desc->FindFieldByCamelcaseName("bar"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto"));
-
-  // Finally, verify that if we call message_type() on the field, we will
-  // buid the file where the message is defined, and get a valid descriptor
-  EXPECT_TRUE(field->message_type() != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("bar.proto"));
-}
-
-TEST_F(LazilyBuildDependenciesTest, Enum) {
-  ParseProtoAndAddToDb(
-      "name: 'foo.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'enum1.proto' "
-      "dependency: 'enum2.proto' "
-      "message_type { "
-      "  name:'Lazy' "
-      "  field { name:'enum1' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Enum1' } "
-      "  field { name:'enum2' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Enum2' } "
-      "}");
-  AddSimpleEnumProtoFileToDb("enum1", "Enum1", "ENUM1");
-  AddSimpleEnumProtoFileToDb("enum2", "Enum2", "ENUM2");
-
-  const FileDescriptor* file = pool_.FindFileByName("foo.proto");
-
-  // Verify calling enum_type() on a field whose definition is not
-  // yet built will build the file and return a descriptor.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("enum1.proto"));
-  const Descriptor* desc = file->FindMessageTypeByName("Lazy");
-  EXPECT_TRUE(desc != NULL);
-  const FieldDescriptor* field = desc->FindFieldByName("enum1");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_TRUE(field->enum_type() != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("enum1.proto"));
-
-  // Verify calling default_value_enum() on a field whose definition is not
-  // yet built will build the file and return a descriptor to the value.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("enum2.proto"));
-  field = desc->FindFieldByName("enum2");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_TRUE(field->default_value_enum() != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("enum2.proto"));
-}
-
-TEST_F(LazilyBuildDependenciesTest, Type) {
-  ParseProtoAndAddToDb(
-      "name: 'foo.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'message1.proto' "
-      "dependency: 'message2.proto' "
-      "dependency: 'enum1.proto' "
-      "dependency: 'enum2.proto' "
-      "message_type { "
-      "  name:'Lazy' "
-      "  field { name:'message1' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Message1' } "
-      "  field { name:'message2' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Message2' } "
-      "  field { name:'enum1' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Enum1' } "
-      "  field { name:'enum2' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Enum2' } "
-      "}");
-  AddSimpleMessageProtoFileToDb("message1", "Message1");
-  AddSimpleMessageProtoFileToDb("message2", "Message2");
-  AddSimpleEnumProtoFileToDb("enum1", "Enum1", "ENUM1");
-  AddSimpleEnumProtoFileToDb("enum2", "Enum2", "ENUM2");
-
-  const FileDescriptor* file = pool_.FindFileByName("foo.proto");
-
-  // Verify calling type() on a field that is a message type will
-  // build the type defined in another file.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("message1.proto"));
-  const Descriptor* desc = file->FindMessageTypeByName("Lazy");
-  EXPECT_TRUE(desc != NULL);
-  const FieldDescriptor* field = desc->FindFieldByName("message1");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_EQ(field->type(), FieldDescriptor::TYPE_MESSAGE);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("message1.proto"));
-
-  // Verify calling cpp_type() on a field that is a message type will
-  // build the type defined in another file.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("message2.proto"));
-  field = desc->FindFieldByName("message2");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_EQ(field->cpp_type(), FieldDescriptor::CPPTYPE_MESSAGE);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("message2.proto"));
-
-  // Verify calling type() on a field that is an enum type will
-  // build the type defined in another file.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("enum1.proto"));
-  field = desc->FindFieldByName("enum1");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_EQ(field->type(), FieldDescriptor::TYPE_ENUM);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("enum1.proto"));
-
-  // Verify calling cpp_type() on a field that is an enum type will
-  // build the type defined in another file.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("enum2.proto"));
-  field = desc->FindFieldByName("enum2");
-  EXPECT_TRUE(field != NULL);
-  EXPECT_EQ(field->cpp_type(), FieldDescriptor::CPPTYPE_ENUM);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("enum2.proto"));
-}
-
-TEST_F(LazilyBuildDependenciesTest, Extension) {
-  ParseProtoAndAddToDb(
-      "name: 'foo.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'bar.proto' "
-      "dependency: 'baz.proto' "
-      "extension { extendee: '.protobuf_unittest.Bar' name:'bar' number:11"
-      "            label:LABEL_OPTIONAL type_name:'.protobuf_unittest.Baz' }");
-  ParseProtoAndAddToDb(
-      "name: 'bar.proto' "
-      "package: 'protobuf_unittest' "
-      "message_type { "
-      "  name:'Bar' "
-      "  extension_range { start: 10 end: 20 }"
-      "}");
-  AddSimpleMessageProtoFileToDb("baz", "Baz");
-
-  // Verify none have been built yet.
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("foo.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto"));
-
-  const FileDescriptor* file = pool_.FindFileByName("foo.proto");
-
-  // Verify foo.bar gets loaded, and bar.proto gets loaded
-  // to register the extension. baz.proto should not get loaded.
-  EXPECT_TRUE(file != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("foo.proto"));
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("bar.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto"));
-}
-
-TEST_F(LazilyBuildDependenciesTest, Service) {
-  ParseProtoAndAddToDb(
-      "name: 'foo.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'message1.proto' "
-      "dependency: 'message2.proto' "
-      "dependency: 'message3.proto' "
-      "dependency: 'message4.proto' "
-      "service {"
-      "  name: 'LazyService'"
-      "  method { name: 'A' input_type:  '.protobuf_unittest.Message1' "
-      "                     output_type: '.protobuf_unittest.Message2' }"
-      "}");
-  AddSimpleMessageProtoFileToDb("message1", "Message1");
-  AddSimpleMessageProtoFileToDb("message2", "Message2");
-  AddSimpleMessageProtoFileToDb("message3", "Message3");
-  AddSimpleMessageProtoFileToDb("message4", "Message4");
-
-  const FileDescriptor* file = pool_.FindFileByName("foo.proto");
-
-  // Verify calling FindServiceByName or FindMethodByName doesn't build the
-  // files defining the input and output type, and input_type() and
-  // output_type() does indeed build the appropriate files.
-  const ServiceDescriptor* service = file->FindServiceByName("LazyService");
-  EXPECT_TRUE(service != NULL);
-  const MethodDescriptor* method = service->FindMethodByName("A");
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("message1.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("message2.proto"));
-  EXPECT_TRUE(method != NULL);
-  EXPECT_TRUE(method->input_type() != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("message1.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("message2.proto"));
-  EXPECT_TRUE(method->output_type() != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("message2.proto"));
-}
-
-
-TEST_F(LazilyBuildDependenciesTest, GeneratedFile) {
-  // Most testing is done with custom pools with lazy dependencies forced on,
-  // do some sanity checking that lazy imports is on by default for the
-  // generated pool, and do custom options testing with generated to
-  // be able to use the GetExtension ids for the custom options.
-
-  // Verify none of the files are loaded yet.
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies.proto"));
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_custom_option.proto"));
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_enum.proto"));
-
-  // Verify calling autogenerated function to get a descriptor in the base
-  // file will build that file but none of it's imports. This verifies that
-  // lazily_build_dependencies_ is set on the generated pool, and also that
-  // the generated function "descriptor()" doesn't somehow subvert the laziness
-  // by manually loading the dependencies or something.
-  EXPECT_TRUE(protobuf_unittest::lazy_imports::ImportedMessage::descriptor() !=
-              NULL);
-  EXPECT_TRUE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies.proto"));
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_custom_option.proto"));
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_enum.proto"));
-
-  // Verify custom options work when defined in an import that isn't loaded,
-  // and that a non-default value of a custom option doesn't load the file
-  // where that enum is defined.
-  const google::protobuf::MessageOptions& options =
-      protobuf_unittest::lazy_imports::MessageCustomOption::descriptor()
-          ->options();
-  protobuf_unittest::lazy_imports::LazyEnum custom_option_value =
-      options.GetExtension(protobuf_unittest::lazy_imports::lazy_enum_option);
-
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_custom_option.proto"));
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_enum.proto"));
-  EXPECT_EQ(custom_option_value, protobuf_unittest::lazy_imports::LAZY_ENUM_1);
-
-  const google::protobuf::MessageOptions& options2 =
-      protobuf_unittest::lazy_imports::MessageCustomOption2::descriptor()
-          ->options();
-  custom_option_value =
-      options2.GetExtension(protobuf_unittest::lazy_imports::lazy_enum_option);
-
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_custom_option.proto"));
-  EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded(
-      "google/protobuf/unittest_lazy_dependencies_enum.proto"));
-  EXPECT_EQ(custom_option_value, protobuf_unittest::lazy_imports::LAZY_ENUM_0);
-}
-
-TEST_F(LazilyBuildDependenciesTest, Dependency) {
-  ParseProtoAndAddToDb(
-      "name: 'foo.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'bar.proto' "
-      "message_type { "
-      "  name:'Foo' "
-      "  field { name:'bar' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Bar' } "
-      "}");
-  ParseProtoAndAddToDb(
-      "name: 'bar.proto' "
-      "package: 'protobuf_unittest' "
-      "dependency: 'baz.proto' "
-      "message_type { "
-      "  name:'Bar' "
-      "  field { name:'baz' number:1 label:LABEL_OPTIONAL "
-      "type_name:'.protobuf_unittest.Baz' } "
-      "}");
-  AddSimpleMessageProtoFileToDb("baz", "Baz");
-
-  const FileDescriptor* foo_file = pool_.FindFileByName("foo.proto");
-  EXPECT_TRUE(foo_file != NULL);
-  // As expected, requesting foo.proto shouldn't build it's dependencies
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("foo.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto"));
-
-  // Verify calling dependency(N) will build the dependency, but
-  // not that file's dependencies.
-  const FileDescriptor* bar_file = foo_file->dependency(0);
-  EXPECT_TRUE(bar_file != NULL);
-  EXPECT_TRUE(pool_.InternalIsFileLoaded("bar.proto"));
-  EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto"));
-}
-
-// ===================================================================
-
 
 }  // namespace descriptor_unittest
 }  // namespace protobuf
diff --git a/src/google/protobuf/drop_unknown_fields_test.cc b/src/google/protobuf/drop_unknown_fields_test.cc
index f2f2f74..6f16dc5 100644
--- a/src/google/protobuf/drop_unknown_fields_test.cc
+++ b/src/google/protobuf/drop_unknown_fields_test.cc
@@ -35,7 +35,6 @@
 
 #include <google/protobuf/unittest_drop_unknown_fields.pb.h>
 #include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 
 namespace google {
@@ -44,8 +43,7 @@
 
 namespace protobuf {
 
-TEST(DropUnknownFieldsTest, GeneratedMessageDefaultDrop) {
-  ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(false);
+TEST(DropUnknownFieldsTest, GeneratedMessage) {
   FooWithExtraFields foo_with_extra_fields;
   foo_with_extra_fields.set_int32_value(1);
   foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX);
@@ -56,6 +54,8 @@
   EXPECT_EQ(1, foo.int32_value());
   EXPECT_EQ(static_cast<int>(FooWithExtraFields::QUX),
             static_cast<int>(foo.enum_value()));
+  // We don't generate unknown field accessors but the UnknownFieldSet is
+  // still exposed through reflection API.
   EXPECT_TRUE(foo.GetReflection()->GetUnknownFields(foo).empty());
 
   ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo.SerializeAsString()));
@@ -65,29 +65,7 @@
   EXPECT_EQ(0, foo_with_extra_fields.extra_int32_value());
 }
 
-TEST(DropUnknownFieldsTest, GeneratedMessageDefaultPreserve) {
-  ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(true);
-  FooWithExtraFields foo_with_extra_fields;
-  foo_with_extra_fields.set_int32_value(1);
-  foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX);
-  foo_with_extra_fields.set_extra_int32_value(2);
-
-  Foo foo;
-  ASSERT_TRUE(foo.ParseFromString(foo_with_extra_fields.SerializeAsString()));
-  EXPECT_EQ(1, foo.int32_value());
-  EXPECT_EQ(static_cast<int>(FooWithExtraFields::QUX),
-            static_cast<int>(foo.enum_value()));
-  EXPECT_FALSE(foo.GetReflection()->GetUnknownFields(foo).empty());
-
-  ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo.SerializeAsString()));
-  EXPECT_EQ(1, foo_with_extra_fields.int32_value());
-  EXPECT_EQ(FooWithExtraFields::QUX, foo_with_extra_fields.enum_value());
-  // The "extra_int32_value" field should not be lost.
-  EXPECT_EQ(2, foo_with_extra_fields.extra_int32_value());
-}
-
-TEST(DropUnknownFieldsTest, DynamicMessageDefaultDrop) {
-  internal::SetProto3PreserveUnknownsDefault(false);
+TEST(DropUnknownFieldsTest, DynamicMessage) {
   FooWithExtraFields foo_with_extra_fields;
   foo_with_extra_fields.set_int32_value(1);
   foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX);
@@ -106,25 +84,5 @@
   EXPECT_EQ(0, foo_with_extra_fields.extra_int32_value());
 }
 
-TEST(DropUnknownFieldsTest, DynamicMessageDefaultPreserve) {
-  internal::SetProto3PreserveUnknownsDefault(true);
-  FooWithExtraFields foo_with_extra_fields;
-  foo_with_extra_fields.set_int32_value(1);
-  foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX);
-  foo_with_extra_fields.set_extra_int32_value(2);
-
-  google::protobuf::DynamicMessageFactory factory;
-  google::protobuf::scoped_ptr<google::protobuf::Message> foo(
-      factory.GetPrototype(Foo::descriptor())->New());
-  ASSERT_TRUE(foo->ParseFromString(foo_with_extra_fields.SerializeAsString()));
-  EXPECT_FALSE(foo->GetReflection()->GetUnknownFields(*foo).empty());
-
-  ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo->SerializeAsString()));
-  EXPECT_EQ(1, foo_with_extra_fields.int32_value());
-  EXPECT_EQ(FooWithExtraFields::QUX, foo_with_extra_fields.enum_value());
-  // The "extra_int32_value" field should not be lost.
-  EXPECT_EQ(2, foo_with_extra_fields.extra_int32_value());
-}
-
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/duration.pb.cc b/src/google/protobuf/duration.pb.cc
index 0a8aad4..e363934 100644
--- a/src/google/protobuf/duration.pb.cc
+++ b/src/google/protobuf/duration.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/duration.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/duration.pb.h>
 
 #include <algorithm>
@@ -14,114 +15,104 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class DurationDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Duration>
-      _instance;
-} _Duration_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fduration_2eproto {
-void InitDefaultsDurationImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Duration_default_instance_;
-    new (ptr) ::google::protobuf::Duration();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Duration::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* Duration_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Duration_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fduration_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fduration_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/duration.proto");
+  GOOGLE_CHECK(file != NULL);
+  Duration_descriptor_ = file->message_type(0);
+  static const int Duration_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Duration, seconds_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Duration, nanos_),
+  };
+  Duration_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Duration_descriptor_,
+      Duration::default_instance_,
+      Duration_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Duration),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Duration, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Duration, _is_default_instance_));
 }
 
-void InitDefaultsDuration() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDurationImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fduration_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Duration, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Duration, seconds_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Duration, nanos_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::Duration)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Duration_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/duration.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Duration_descriptor_, &Duration::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\036google/protobuf/duration.proto\022\017google"
-      ".protobuf\"*\n\010Duration\022\017\n\007seconds\030\001 \001(\003\022\r"
-      "\n\005nanos\030\002 \001(\005B|\n\023com.google.protobufB\rDu"
-      "rationProtoP\001Z*github.com/golang/protobu"
-      "f/ptypes/duration\370\001\001\242\002\003GPB\252\002\036Google.Prot"
-      "obuf.WellKnownTypesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fduration_2eproto() {
+  delete Duration::default_instance_;
+  delete Duration_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fduration_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 227);
+    "\n\036google/protobuf/duration.proto\022\017google"
+    ".protobuf\"*\n\010Duration\022\017\n\007seconds\030\001 \001(\003\022\r"
+    "\n\005nanos\030\002 \001(\005B|\n\023com.google.protobufB\rDu"
+    "rationProtoP\001Z*github.com/golang/protobu"
+    "f/ptypes/duration\240\001\001\242\002\003GPB\252\002\036Google.Prot"
+    "obuf.WellKnownTypesb\006proto3", 227);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/duration.proto", &protobuf_RegisterTypes);
+  Duration::default_instance_ = new Duration();
+  Duration::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fduration_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fduration_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fduration_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fduration_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fduration_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fduration_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void Duration::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Duration::kSecondsFieldNumber;
 const int Duration::kNanosFieldNumber;
@@ -129,36 +120,27 @@
 
 Duration::Duration()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDuration();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Duration)
 }
-Duration::Duration(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDuration();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Duration)
+
+void Duration::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
 }
+
 Duration::Duration(const Duration& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::memcpy(&seconds_, &from.seconds_,
-    static_cast<size_t>(reinterpret_cast<char*>(&nanos_) -
-    reinterpret_cast<char*>(&seconds_)) + sizeof(nanos_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Duration)
 }
 
 void Duration::SharedCtor() {
-  ::memset(&seconds_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&nanos_) -
-      reinterpret_cast<char*>(&seconds_)) + sizeof(nanos_));
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  seconds_ = GOOGLE_LONGLONG(0);
+  nanos_ = 0;
 }
 
 Duration::~Duration() {
@@ -167,44 +149,58 @@
 }
 
 void Duration::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void Duration::ArenaDtor(void* object) {
-  Duration* _this = reinterpret_cast< Duration* >(object);
-  (void)_this;
-}
-void Duration::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void Duration::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Duration::descriptor() {
-  ::protobuf_google_2fprotobuf_2fduration_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fduration_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Duration_descriptor_;
 }
 
 const Duration& Duration::default_instance() {
-  ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDuration();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fduration_2eproto();
+  return *default_instance_;
 }
 
+Duration* Duration::default_instance_ = NULL;
+
 Duration* Duration::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Duration>(arena);
+  Duration* n = new Duration;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void Duration::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Duration)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(Duration, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<Duration*>(16)->f)
+#endif
 
-  ::memset(&seconds_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&nanos_) -
-      reinterpret_cast<char*>(&seconds_)) + sizeof(nanos_));
-  _internal_metadata_.Clear();
+#define ZR_(first, last) do {\
+  ::memset(&first, 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(seconds_, nanos_);
+
+#undef ZR_HELPER_
+#undef ZR_
+
 }
 
 bool Duration::MergePartialFromCodedStream(
@@ -213,45 +209,47 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Duration)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // int64 seconds = 1;
+      // optional int64 seconds = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>(
                  input, &seconds_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_nanos;
         break;
       }
 
-      // int32 nanos = 2;
+      // optional int32 nanos = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-
+        if (tag == 16) {
+         parse_nanos:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &nanos_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -268,85 +266,64 @@
 void Duration::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Duration)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   if (this->seconds() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->seconds(), output);
   }
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   if (this->nanos() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->nanos(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Duration)
 }
 
-::google::protobuf::uint8* Duration::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Duration::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Duration)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   if (this->seconds() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(1, this->seconds(), target);
   }
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   if (this->nanos() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->nanos(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Duration)
   return target;
 }
 
-size_t Duration::ByteSizeLong() const {
+int Duration::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Duration)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   if (this->seconds() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int64Size(
         this->seconds());
   }
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   if (this->nanos() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int32Size(
         this->nanos());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Duration::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Duration)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Duration* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Duration* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Duration>(
           &from);
   if (source == NULL) {
@@ -360,11 +337,7 @@
 
 void Duration::MergeFrom(const Duration& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Duration)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.seconds() != 0) {
     set_seconds(from.seconds());
   }
@@ -388,43 +361,64 @@
 }
 
 bool Duration::IsInitialized() const {
+
   return true;
 }
 
 void Duration::Swap(Duration* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Duration* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Duration::UnsafeArenaSwap(Duration* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void Duration::InternalSwap(Duration* other) {
-  using std::swap;
-  swap(seconds_, other->seconds_);
-  swap(nanos_, other->nanos_);
+  std::swap(seconds_, other->seconds_);
+  std::swap(nanos_, other->nanos_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Duration::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fduration_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fduration_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Duration_descriptor_;
+  metadata.reflection = Duration_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Duration
+
+// optional int64 seconds = 1;
+void Duration::clear_seconds() {
+  seconds_ = GOOGLE_LONGLONG(0);
+}
+ ::google::protobuf::int64 Duration::seconds() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Duration.seconds)
+  return seconds_;
+}
+ void Duration::set_seconds(::google::protobuf::int64 value) {
+  
+  seconds_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Duration.seconds)
+}
+
+// optional int32 nanos = 2;
+void Duration::clear_nanos() {
+  nanos_ = 0;
+}
+ ::google::protobuf::int32 Duration::nanos() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Duration.nanos)
+  return nanos_;
+}
+ void Duration::set_nanos(::google::protobuf::int32 value) {
+  
+  nanos_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Duration.nanos)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/duration.pb.h b/src/google/protobuf/duration.pb.h
index e13328a..215a52c 100644
--- a/src/google/protobuf/duration.pb.h
+++ b/src/google/protobuf/duration.pb.h
@@ -8,59 +8,40 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fduration_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[1];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsDurationImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsDuration();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsDuration();
-}
-}  // namespace protobuf_google_2fprotobuf_2fduration_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fduration_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fduration_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fduration_2eproto();
+
 class Duration;
-class DurationDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern DurationDefaultTypeInternal _Duration_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT Duration : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Duration) */ {
+class LIBPROTOBUF_EXPORT Duration : public ::google::protobuf::Message {
  public:
   Duration();
   virtual ~Duration();
@@ -71,74 +52,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Duration(Duration&& from) noexcept
-    : Duration() {
-    *this = ::std::move(from);
-  }
 
-  inline Duration& operator=(Duration&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Duration& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Duration* internal_default_instance() {
-    return reinterpret_cast<const Duration*>(
-               &_Duration_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
-  void UnsafeArenaSwap(Duration* other);
   void Swap(Duration* other);
-  friend void swap(Duration& a, Duration& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Duration* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Duration* New() const { return New(NULL); }
 
-  Duration* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Duration* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Duration& from);
   void MergeFrom(const Duration& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Duration* other);
-  protected:
-  explicit Duration(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -148,19 +91,19 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   void clear_seconds();
   static const int kSecondsFieldNumber = 1;
   ::google::protobuf::int64 seconds() const;
   void set_seconds(::google::protobuf::int64 value);
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   void clear_nanos();
   static const int kNanosFieldNumber = 2;
   ::google::protobuf::int32 nanos() const;
@@ -170,27 +113,26 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::int64 seconds_;
   ::google::protobuf::int32 nanos_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fduration_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDurationImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fduration_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fduration_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fduration_2eproto();
+
+  void InitAsDefaultInstance();
+  static Duration* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Duration
 
-// int64 seconds = 1;
+// optional int64 seconds = 1;
 inline void Duration::clear_seconds() {
   seconds_ = GOOGLE_LONGLONG(0);
 }
@@ -204,7 +146,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Duration.seconds)
 }
 
-// int32 nanos = 2;
+// optional int32 nanos = 2;
 inline void Duration::clear_nanos() {
   nanos_ = 0;
 }
@@ -218,9 +160,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Duration.nanos)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/src/google/protobuf/duration.proto b/src/google/protobuf/duration.proto
index 975fce4..96c1796 100644
--- a/src/google/protobuf/duration.proto
+++ b/src/google/protobuf/duration.proto
@@ -33,11 +33,11 @@
 package google.protobuf;
 
 option csharp_namespace = "Google.Protobuf.WellKnownTypes";
-option cc_enable_arenas = true;
 option go_package = "github.com/golang/protobuf/ptypes/duration";
 option java_package = "com.google.protobuf";
 option java_outer_classname = "DurationProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
 
 // A Duration represents a signed, fixed-length span of time represented
@@ -47,8 +47,6 @@
 // two Timestamp values is a Duration and it can be added or subtracted
 // from a Timestamp. Range is approximately +-10,000 years.
 //
-// # Examples
-//
 // Example 1: Compute Duration from two Timestamps in pseudo code.
 //
 //     Timestamp start = ...;
@@ -83,28 +81,11 @@
 //       end.nanos -= 1000000000;
 //     }
 //
-// Example 3: Compute Duration from datetime.timedelta in Python.
-//
-//     td = datetime.timedelta(days=3, minutes=10)
-//     duration = Duration()
-//     duration.FromTimedelta(td)
-//
-// # JSON Mapping
-//
-// In JSON format, the Duration type is encoded as a string rather than an
-// object, where the string ends in the suffix "s" (indicating seconds) and
-// is preceded by the number of seconds, with nanoseconds expressed as
-// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
-// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
-// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
-// microsecond should be expressed in JSON format as "3.000001s".
-//
 //
 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
+  // to +315,576,000,000 inclusive.
   int64 seconds = 1;
 
   // Signed fractions of a second at nanosecond resolution of the span
diff --git a/src/google/protobuf/dynamic_message.cc b/src/google/protobuf/dynamic_message.cc
index cdd4324..9e83bd2 100644
--- a/src/google/protobuf/dynamic_message.cc
+++ b/src/google/protobuf/dynamic_message.cc
@@ -70,6 +70,7 @@
 #endif
 
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/descriptor.h>
@@ -77,23 +78,22 @@
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/map_field.h>
 #include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/map_type_handler.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/repeated_field.h>
+#include <google/protobuf/map_type_handler.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/wire_format.h>
-
+#include <google/protobuf/map_field.h>
 
 namespace google {
 namespace protobuf {
 
-using internal::DynamicMapField;
+using internal::WireFormat;
 using internal::ExtensionSet;
 using internal::GeneratedMessageReflection;
-using internal::InternalMetadataWithArena;
 using internal::MapField;
+using internal::DynamicMapField;
 
 
 using internal::ArenaStringPtr;
@@ -222,8 +222,9 @@
     int size;
     int has_bits_offset;
     int oneof_case_offset;
-    int internal_metadata_offset;
+    int unknown_fields_offset;
     int extensions_offset;
+    int is_default_instance_offset;
 
     // Not owned by the TypeInfo.
     DynamicMessageFactory* factory;  // The factory that created this object.
@@ -232,28 +233,24 @@
 
     // Warning:  The order in which the following pointers are defined is
     //   important (the prototype must be deleted *before* the offsets).
-    google::protobuf::scoped_array<uint32> offsets;
-    google::protobuf::scoped_array<uint32> has_bits_indices;
+    google::protobuf::scoped_array<int> offsets;
     google::protobuf::scoped_ptr<const GeneratedMessageReflection> reflection;
     // Don't use a scoped_ptr to hold the prototype: the destructor for
     // DynamicMessage needs to know whether it is the prototype, and does so by
     // looking back at this field. This would assume details about the
     // implementation of scoped_ptr.
     const DynamicMessage* prototype;
-    int weak_field_map_offset;  // The offset for the weak_field_map;
+    void* default_oneof_instance;
 
-    TypeInfo() : prototype(NULL) {}
+    TypeInfo() : prototype(NULL), default_oneof_instance(NULL) {}
 
     ~TypeInfo() {
       delete prototype;
+      operator delete(default_oneof_instance);
     }
   };
 
   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();
 
   // Called on the prototype after construction to initialize message fields.
@@ -284,8 +281,7 @@
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage);
   DynamicMessage(const TypeInfo* type_info, ::google::protobuf::Arena* arena);
-
-  void SharedCtor(bool lock_factory);
+  void SharedCtor();
 
   inline bool is_prototype() const {
     return type_info_->prototype == this ||
@@ -309,22 +305,17 @@
 DynamicMessage::DynamicMessage(const TypeInfo* type_info)
   : type_info_(type_info),
     cached_byte_size_(0) {
-  SharedCtor(true);
+  SharedCtor();
 }
 
 DynamicMessage::DynamicMessage(const TypeInfo* type_info,
                                ::google::protobuf::Arena* arena)
   : type_info_(type_info),
     cached_byte_size_(0) {
-  SharedCtor(true);
+  SharedCtor();
 }
 
-DynamicMessage::DynamicMessage(const TypeInfo* type_info, bool lock_factory)
-    : type_info_(type_info), cached_byte_size_(0) {
-  SharedCtor(lock_factory);
-}
-
-void DynamicMessage::SharedCtor(bool lock_factory) {
+void DynamicMessage::SharedCtor() {
   // We need to call constructors for various fields manually and set
   // default values where appropriate.  We use placement new to call
   // constructors.  If you haven't heard of placement new, I suggest Googling
@@ -335,18 +326,24 @@
   // constructor.)
 
   const Descriptor* descriptor = type_info_->type;
+
   // Initialize oneof cases.
   for (int i = 0 ; i < descriptor->oneof_decl_count(); ++i) {
-    new (OffsetToPointer(type_info_->oneof_case_offset + sizeof(uint32) * i))
+    new(OffsetToPointer(type_info_->oneof_case_offset + sizeof(uint32) * i))
         uint32(0);
   }
 
-  new (OffsetToPointer(type_info_->internal_metadata_offset))
-      InternalMetadataWithArena;
+  if (type_info_->is_default_instance_offset != -1) {
+    *reinterpret_cast<bool*>(
+        OffsetToPointer(type_info_->is_default_instance_offset)) = false;
+  }
+
+  new(OffsetToPointer(type_info_->unknown_fields_offset)) UnknownFieldSet;
 
   if (type_info_->extensions_offset != -1) {
-    new (OffsetToPointer(type_info_->extensions_offset)) ExtensionSet;
+    new(OffsetToPointer(type_info_->extensions_offset)) ExtensionSet;
   }
+
   for (int i = 0; i < descriptor->field_count(); i++) {
     const FieldDescriptor* field = descriptor->field(i);
     void* field_ptr = OffsetToPointer(type_info_->offsets[i]);
@@ -389,10 +386,10 @@
               if (is_prototype()) {
                 default_value = &field->default_value_string();
               } else {
-                default_value = &(reinterpret_cast<const ArenaStringPtr*>(
-                                      type_info_->prototype->OffsetToPointer(
-                                          type_info_->offsets[i]))
-                                      ->Get());
+                default_value =
+                  &(reinterpret_cast<const ArenaStringPtr*>(
+                    type_info_->prototype->OffsetToPointer(
+                      type_info_->offsets[i]))->Get(NULL));
               }
               ArenaStringPtr* asp = new(field_ptr) ArenaStringPtr();
               asp->UnsafeSetDefault(default_value);
@@ -408,17 +405,8 @@
           new(field_ptr) Message*(NULL);
         } else {
           if (IsMapFieldInApi(field)) {
-            // We need to lock in most cases to avoid data racing. Only not lock
-            // when the constructor is called inside GetPrototype(), in which
-            // case we have already locked the factory.
-            if (lock_factory) {
-              new (field_ptr) DynamicMapField(
-                  type_info_->factory->GetPrototype(field->message_type()));
-            } else {
-              new (field_ptr)
-                  DynamicMapField(type_info_->factory->GetPrototypeNoLock(
-                      field->message_type()));
-            }
+            new (field_ptr) DynamicMapField(
+                type_info_->factory->GetPrototypeNoLock(field->message_type()));
           } else {
             new (field_ptr) RepeatedPtrField<Message>();
           }
@@ -432,9 +420,8 @@
 DynamicMessage::~DynamicMessage() {
   const Descriptor* descriptor = type_info_->type;
 
-  reinterpret_cast<InternalMetadataWithArena*>(
-      OffsetToPointer(type_info_->internal_metadata_offset))
-      ->~InternalMetadataWithArena();
+  reinterpret_cast<UnknownFieldSet*>(
+    OffsetToPointer(type_info_->unknown_fields_offset))->~UnknownFieldSet();
 
   if (type_info_->extensions_offset != -1) {
     reinterpret_cast<ExtensionSet*>(
@@ -465,10 +452,10 @@
             case FieldOptions::STRING: {
               const ::std::string* default_value =
                   &(reinterpret_cast<const ArenaStringPtr*>(
-                        reinterpret_cast<const uint8*>(
-                            type_info_->prototype) +
-                        type_info_->offsets[i])
-                        ->Get());
+                      reinterpret_cast<uint8*>(
+                          type_info_->default_oneof_instance)
+                      + type_info_->offsets[i])
+                    ->Get(NULL));
               reinterpret_cast<ArenaStringPtr*>(field_ptr)->Destroy(
                   default_value, NULL);
               break;
@@ -526,9 +513,8 @@
         case FieldOptions::STRING: {
           const ::std::string* default_value =
               &(reinterpret_cast<const ArenaStringPtr*>(
-                    type_info_->prototype->OffsetToPointer(
-                        type_info_->offsets[i]))
-                    ->Get());
+                  type_info_->prototype->OffsetToPointer(
+                      type_info_->offsets[i]))->Get(NULL));
           reinterpret_cast<ArenaStringPtr*>(field_ptr)->Destroy(
               default_value, NULL);
           break;
@@ -556,6 +542,11 @@
   for (int i = 0; i < descriptor->field_count(); i++) {
     const FieldDescriptor* field = descriptor->field(i);
     void* field_ptr = OffsetToPointer(type_info_->offsets[i]);
+    if (field->containing_oneof()) {
+      field_ptr = reinterpret_cast<uint8*>(
+          type_info_->default_oneof_instance) + type_info_->offsets[i];
+    }
+
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
         !field->is_repeated()) {
       // For fields with message types, we need to cross-link with the
@@ -566,6 +557,14 @@
         factory->GetPrototypeNoLock(field->message_type());
     }
   }
+
+  // Set as the default instance -- this affects field-presence semantics for
+  // proto3.
+  if (type_info_->is_default_instance_offset != -1) {
+    void* is_default_instance_ptr =
+        OffsetToPointer(type_info_->is_default_instance_offset);
+    *reinterpret_cast<bool*>(is_default_instance_ptr) = true;
+  }
 }
 
 Message* DynamicMessage::New() const {
@@ -626,7 +625,7 @@
        iter != prototypes_->map_.end(); ++iter) {
     DeleteDefaultOneofInstance(iter->second->type,
                                iter->second->offsets.get(),
-                               iter->second->prototype);
+                               iter->second->default_oneof_instance);
     delete iter->second;
   }
 }
@@ -665,8 +664,7 @@
   //   or not that field is set.
 
   // Compute size and offsets.
-  uint32* offsets =
-      new uint32[type->field_count() + type->oneof_decl_count()];
+  int* offsets = new int[type->field_count() + type->oneof_decl_count()];
   type_info->offsets.reset(offsets);
 
   // Decide all field offsets by packing in order.
@@ -684,12 +682,15 @@
       DivideRoundingUp(type->field_count(), bitsizeof(uint32));
     size += has_bits_array_size * sizeof(uint32);
     size = AlignOffset(size);
+  }
 
-    uint32* has_bits_indices = new uint32[type->field_count()];
-    for (int i = 0; i < type->field_count(); i++) {
-      has_bits_indices[i] = i;
-    }
-    type_info->has_bits_indices.reset(has_bits_indices);
+  // The is_default_instance member, if any.
+  if (type->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) {
+    type_info->is_default_instance_offset = size;
+    size += sizeof(bool);
+    size = AlignOffset(size);
+  } else {
+    type_info->is_default_instance_offset = -1;
   }
 
   // The oneof_case, if any. It is an array of uint32s.
@@ -710,9 +711,6 @@
   }
 
   // All the fields.
-  //
-  // TODO(b/31226269):  Optimize the order of fields to minimize padding.
-  int num_weak_fields = 0;
   for (int i = 0; i < type->field_count(); i++) {
     // Make sure field is aligned to avoid bus errors.
     // Oneof fields do not use any space.
@@ -731,38 +729,19 @@
     size += kMaxOneofUnionSize;
   }
 
-  // Add the InternalMetadataWithArena to the end.
+  // Add the UnknownFieldSet to the end.
   size = AlignOffset(size);
-  type_info->internal_metadata_offset = size;
-  size += sizeof(InternalMetadataWithArena);
-
-  type_info->weak_field_map_offset = -1;
+  type_info->unknown_fields_offset = size;
+  size += sizeof(UnknownFieldSet);
 
   // Align the final size to make sure no clever allocators think that
   // alignment is not necessary.
+  size = AlignOffset(size);
   type_info->size = size;
 
-
-  // Construct the reflection object.
-
-  if (type->oneof_decl_count() > 0) {
-    // Compute the size of default oneof instance and offsets of default
-    // oneof fields.
-    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);
-        int field_size = OneofFieldSpaceUsed(field);
-        size = AlignTo(size, std::min(kSafeAlignment, field_size));
-        offsets[field->index()] = size;
-        size += field_size;
-      }
-    }
-  }
-  size = AlignOffset(size);
-  // Allocate the prototype + oneof fields.
+  // Allocate the prototype.
   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
@@ -770,32 +749,57 @@
   // 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);
+  DynamicMessage* prototype = new(base) DynamicMessage(type_info);
 
-  // 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 the reflection object.
+  if (type->oneof_decl_count() > 0) {
+    // Compute the size of default oneof instance and offsets of default
+    // oneof fields.
+    int oneof_size = 0;
+    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);
+        int field_size = OneofFieldSpaceUsed(field);
+        oneof_size = AlignTo(oneof_size, std::min(kSafeAlignment, field_size));
+        offsets[field->index()] = oneof_size;
+        oneof_size += field_size;
+      }
+    }
     // Construct default oneof instance.
+    type_info->default_oneof_instance = ::operator new(oneof_size);
     ConstructDefaultOneofInstance(type_info->type,
                                   type_info->offsets.get(),
-                                  prototype);
+                                  type_info->default_oneof_instance);
+    type_info->reflection.reset(
+        new GeneratedMessageReflection(
+            type_info->type,
+            type_info->prototype,
+            type_info->offsets.get(),
+            type_info->has_bits_offset,
+            type_info->unknown_fields_offset,
+            type_info->extensions_offset,
+            type_info->default_oneof_instance,
+            type_info->oneof_case_offset,
+            type_info->pool,
+            this,
+            type_info->size,
+            -1 /* arena_offset */,
+            type_info->is_default_instance_offset));
+  } else {
+    type_info->reflection.reset(
+        new GeneratedMessageReflection(
+            type_info->type,
+            type_info->prototype,
+            type_info->offsets.get(),
+            type_info->has_bits_offset,
+            type_info->unknown_fields_offset,
+            type_info->extensions_offset,
+            type_info->pool,
+            this,
+            type_info->size,
+            -1 /* arena_offset */,
+            type_info->is_default_instance_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));
-
   // Cross link prototypes.
   prototype->CrossLinkPrototypes();
 
@@ -804,13 +808,13 @@
 
 void DynamicMessageFactory::ConstructDefaultOneofInstance(
     const Descriptor* type,
-    const uint32 offsets[],
-    void* default_oneof_or_weak_instance) {
+    const int offsets[],
+    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++) {
       const FieldDescriptor* field = type->oneof_decl(i)->field(j);
       void* field_ptr = reinterpret_cast<uint8*>(
-          default_oneof_or_weak_instance) + offsets[field->index()];
+          default_oneof_instance) + offsets[field->index()];
       switch (field->cpp_type()) {
 #define HANDLE_TYPE(CPPTYPE, TYPE)                                      \
         case FieldDescriptor::CPPTYPE_##CPPTYPE:                        \
@@ -850,8 +854,8 @@
 
 void DynamicMessageFactory::DeleteDefaultOneofInstance(
     const Descriptor* type,
-    const uint32 offsets[],
-    const void* default_oneof_instance) {
+    const int offsets[],
+    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++) {
       const FieldDescriptor* field = type->oneof_decl(i)->field(j);
diff --git a/src/google/protobuf/dynamic_message.h b/src/google/protobuf/dynamic_message.h
index e29b148..f74cd7d 100644
--- a/src/google/protobuf/dynamic_message.h
+++ b/src/google/protobuf/dynamic_message.h
@@ -38,15 +38,12 @@
 #ifndef GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__
 #define GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__
 
-#include <algorithm>
 #include <memory>
 #ifndef _SHARED_PTR_H
 #include <google/protobuf/stubs/shared_ptr.h>
 #endif
-#include <vector>
 
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/mutex.h>
 
@@ -139,97 +136,16 @@
   // Construct default oneof instance for reflection usage if oneof
   // is defined.
   static void ConstructDefaultOneofInstance(const Descriptor* type,
-                                            const uint32 offsets[],
+                                            const int offsets[],
                                             void* default_oneof_instance);
   // Delete default oneof instance. Called by ~DynamicMessageFactory.
   static void DeleteDefaultOneofInstance(const Descriptor* type,
-                                         const uint32 offsets[],
-                                         const void* default_oneof_instance);
+                                         const int offsets[],
+                                         void* default_oneof_instance);
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessageFactory);
 };
 
-// Helper for computing a sorted list of map entries via reflection.
-class LIBPROTOBUF_EXPORT DynamicMapSorter {
- public:
-  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));
-    const RepeatedPtrField<Message>& map_field =
-        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(); ) {
-      result[i++] = *it++;
-    }
-    GOOGLE_DCHECK_EQ(result.size(), i);
-    MapEntryMessageComparator comparator(field->message_type());
-    std::stable_sort(result.begin(), result.end(), comparator);
-    // Complain if the keys aren't in ascending order.
-#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");
-      }
-    }
-#endif
-    return result;
-  }
-
- private:
-  class LIBPROTOBUF_EXPORT MapEntryMessageComparator {
-   public:
-    explicit MapEntryMessageComparator(const Descriptor* descriptor)
-        : field_(descriptor->field(0)) {}
-
-    bool operator()(const Message* a, const Message* b) {
-      const Reflection* reflection = a->GetReflection();
-      switch (field_->cpp_type()) {
-        case FieldDescriptor::CPPTYPE_BOOL: {
-          bool first = reflection->GetBool(*a, field_);
-          bool second = reflection->GetBool(*b, field_);
-          return first < second;
-        }
-        case FieldDescriptor::CPPTYPE_INT32: {
-          int32 first = reflection->GetInt32(*a, field_);
-          int32 second = reflection->GetInt32(*b, field_);
-          return first < second;
-        }
-        case FieldDescriptor::CPPTYPE_INT64: {
-          int64 first = reflection->GetInt64(*a, field_);
-          int64 second = reflection->GetInt64(*b, field_);
-          return first < second;
-        }
-        case FieldDescriptor::CPPTYPE_UINT32: {
-          uint32 first = reflection->GetUInt32(*a, field_);
-          uint32 second = reflection->GetUInt32(*b, field_);
-          return first < second;
-        }
-        case FieldDescriptor::CPPTYPE_UINT64: {
-          uint64 first = reflection->GetUInt64(*a, field_);
-          uint64 second = reflection->GetUInt64(*b, field_);
-          return first < second;
-        }
-        case FieldDescriptor::CPPTYPE_STRING: {
-          string first = reflection->GetString(*a, field_);
-          string second = reflection->GetString(*b, field_);
-          return first < second;
-        }
-        default:
-          GOOGLE_LOG(DFATAL) << "Invalid key for map field.";
-          return true;
-      }
-    }
-
-   private:
-    const FieldDescriptor* field_;
-  };
-};
-
 }  // namespace protobuf
 
 }  // namespace google
diff --git a/src/google/protobuf/dynamic_message_unittest.cc b/src/google/protobuf/dynamic_message_unittest.cc
index fe51d8c..70e437d 100644
--- a/src/google/protobuf/dynamic_message_unittest.cc
+++ b/src/google/protobuf/dynamic_message_unittest.cc
@@ -45,6 +45,8 @@
 #include <google/protobuf/stubs/shared_ptr.h>
 #endif
 
+#include <google/protobuf/stubs/scoped_ptr.h>
+#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor.pb.h>
@@ -53,7 +55,6 @@
 #include <google/protobuf/unittest_no_field_presence.pb.h>
 
 #include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
diff --git a/src/google/protobuf/empty.pb.cc b/src/google/protobuf/empty.pb.cc
index caa019e..dcf8426 100644
--- a/src/google/protobuf/empty.pb.cc
+++ b/src/google/protobuf/empty.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/empty.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/empty.pb.h>
 
 #include <algorithm>
@@ -14,139 +15,132 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class EmptyDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Empty>
-      _instance;
-} _Empty_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fempty_2eproto {
-void InitDefaultsEmptyImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Empty_default_instance_;
-    new (ptr) ::google::protobuf::Empty();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Empty::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* Empty_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Empty_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fempty_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fempty_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/empty.proto");
+  GOOGLE_CHECK(file != NULL);
+  Empty_descriptor_ = file->message_type(0);
+  static const int Empty_offsets_[1] = {
+  };
+  Empty_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Empty_descriptor_,
+      Empty::default_instance_,
+      Empty_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Empty),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Empty, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Empty, _is_default_instance_));
 }
 
-void InitDefaultsEmpty() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEmptyImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fempty_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Empty, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::Empty)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Empty_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/empty.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Empty_descriptor_, &Empty::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\033google/protobuf/empty.proto\022\017google.pr"
-      "otobuf\"\007\n\005EmptyBv\n\023com.google.protobufB\n"
-      "EmptyProtoP\001Z\'github.com/golang/protobuf"
-      "/ptypes/empty\370\001\001\242\002\003GPB\252\002\036Google.Protobuf"
-      ".WellKnownTypesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fempty_2eproto() {
+  delete Empty::default_instance_;
+  delete Empty_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fempty_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 183);
+    "\n\033google/protobuf/empty.proto\022\017google.pr"
+    "otobuf\"\007\n\005EmptyBy\n\023com.google.protobufB\n"
+    "EmptyProtoP\001Z\'github.com/golang/protobuf"
+    "/ptypes/empty\240\001\001\370\001\001\242\002\003GPB\252\002\036Google.Proto"
+    "buf.WellKnownTypesb\006proto3", 186);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/empty.proto", &protobuf_RegisterTypes);
+  Empty::default_instance_ = new Empty();
+  Empty::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fempty_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fempty_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fempty_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fempty_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fempty_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fempty_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void Empty::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 Empty::Empty()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmpty();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Empty)
 }
+
 Empty::Empty(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmpty();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.Empty)
 }
+
+void Empty::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Empty::Empty(const Empty& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Empty)
 }
 
 void Empty::SharedCtor() {
+    _is_default_instance_ = false;
   _cached_size_ = 0;
 }
 
@@ -156,7 +150,12 @@
 }
 
 void Empty::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void Empty::ArenaDtor(void* object) {
@@ -171,26 +170,23 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Empty::descriptor() {
-  ::protobuf_google_2fprotobuf_2fempty_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fempty_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Empty_descriptor_;
 }
 
 const Empty& Empty::default_instance() {
-  ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmpty();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fempty_2eproto();
+  return *default_instance_;
 }
 
+Empty* Empty::default_instance_ = NULL;
+
 Empty* Empty::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<Empty>(arena);
 }
 
 void Empty::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Empty)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  _internal_metadata_.Clear();
 }
 
 bool Empty::MergePartialFromCodedStream(
@@ -199,15 +195,16 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Empty)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
   handle_unusual:
-    if (tag == 0) {
+    if (tag == 0 ||
+        ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+        ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
       goto success;
     }
-    DO_(::google::protobuf::internal::WireFormat::SkipField(
-          input, tag, _internal_metadata_.mutable_unknown_fields()));
+    DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
   }
 success:
   // @@protoc_insertion_point(parse_success:google.protobuf.Empty)
@@ -221,51 +218,30 @@
 void Empty::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Empty)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Empty)
 }
 
-::google::protobuf::uint8* Empty::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Empty::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Empty)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Empty)
   return target;
 }
 
-size_t Empty::ByteSizeLong() const {
+int Empty::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Empty)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Empty::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Empty)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Empty* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Empty* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Empty>(
           &from);
   if (source == NULL) {
@@ -279,11 +255,7 @@
 
 void Empty::MergeFrom(const Empty& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Empty)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
 }
 
 void Empty::CopyFrom(const ::google::protobuf::Message& from) {
@@ -301,6 +273,7 @@
 }
 
 bool Empty::IsInitialized() const {
+
   return true;
 }
 
@@ -309,13 +282,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    Empty* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    Empty temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void Empty::UnsafeArenaSwap(Empty* other) {
@@ -324,18 +294,25 @@
   InternalSwap(other);
 }
 void Empty::InternalSwap(Empty* other) {
-  using std::swap;
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Empty::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fempty_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fempty_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Empty_descriptor_;
+  metadata.reflection = Empty_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Empty
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/empty.pb.h b/src/google/protobuf/empty.pb.h
index 76e0e4c..868009f 100644
--- a/src/google/protobuf/empty.pb.h
+++ b/src/google/protobuf/empty.pb.h
@@ -8,59 +8,40 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fempty_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[1];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsEmptyImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEmpty();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsEmpty();
-}
-}  // namespace protobuf_google_2fprotobuf_2fempty_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fempty_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fempty_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fempty_2eproto();
+
 class Empty;
-class EmptyDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EmptyDefaultTypeInternal _Empty_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT Empty : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Empty) */ {
+class LIBPROTOBUF_EXPORT Empty : public ::google::protobuf::Message {
  public:
   Empty();
   virtual ~Empty();
@@ -71,68 +52,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Empty(Empty&& from) noexcept
-    : Empty() {
-    *this = ::std::move(from);
-  }
 
-  inline Empty& operator=(Empty&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Empty& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Empty* internal_default_instance() {
-    return reinterpret_cast<const Empty*>(
-               &_Empty_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   void UnsafeArenaSwap(Empty* other);
   void Swap(Empty* other);
-  friend void swap(Empty& a, Empty& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Empty* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Empty* New() const { return New(NULL); }
 
-  Empty* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Empty* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Empty& from);
   void MergeFrom(const Empty& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Empty* other);
   protected:
   explicit Empty(::google::protobuf::Arena* arena);
@@ -148,7 +101,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -158,27 +111,27 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fempty_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmptyImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fempty_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fempty_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fempty_2eproto();
+
+  void InitAsDefaultInstance();
+  static Empty* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Empty
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/src/google/protobuf/empty.proto b/src/google/protobuf/empty.proto
index 03cacd2..37f4cd1 100644
--- a/src/google/protobuf/empty.proto
+++ b/src/google/protobuf/empty.proto
@@ -37,6 +37,7 @@
 option java_package = "com.google.protobuf";
 option java_outer_classname = "EmptyProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
 option cc_enable_arenas = true;
 
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc
index cf6b6fb..9afb236 100644
--- a/src/google/protobuf/extension_set.cc
+++ b/src/google/protobuf/extension_set.cc
@@ -76,7 +76,7 @@
 }
 
 // Registry stuff.
-typedef hash_map<std::pair<const MessageLite*, int>,
+typedef hash_map<pair<const MessageLite*, int>,
                  ExtensionInfo> ExtensionRegistry;
 ExtensionRegistry* registry_ = NULL;
 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);
@@ -177,8 +177,7 @@
 // ===================================================================
 // Constructors and basic methods.
 
-ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena)
-    : arena_(arena) {
+ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena) : arena_(arena) {
   if (arena_ != NULL) {
     arena_->OwnDestructor(&extensions_);
   }
@@ -189,7 +188,7 @@
 ExtensionSet::~ExtensionSet() {
   // Deletes all allocated extensions.
   if (arena_ == NULL) {
-    for (ExtensionMap::iterator iter = extensions_.begin();
+    for (map<int, Extension>::iterator iter = extensions_.begin();
          iter != extensions_.end(); ++iter) {
       iter->second.Free();
     }
@@ -202,7 +201,7 @@
 //                                 vector<const FieldDescriptor*>* output) const
 
 bool ExtensionSet::Has(int number) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) return false;
   GOOGLE_DCHECK(!iter->second.is_repeated);
   return !iter->second.is_cleared;
@@ -210,7 +209,7 @@
 
 int ExtensionSet::NumExtensions() const {
   int result = 0;
-  for (ExtensionMap::const_iterator iter = extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     if (!iter->second.is_cleared) {
       ++result;
@@ -220,13 +219,13 @@
 }
 
 int ExtensionSet::ExtensionSize(int number) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
-  if (iter == extensions_.end()) return 0;
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
+  if (iter == extensions_.end()) return false;
   return iter->second.GetSize();
 }
 
 FieldType ExtensionSet::ExtensionType(int number) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) {
     GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (1). ";
     return 0;
@@ -238,7 +237,7 @@
 }
 
 void ExtensionSet::ClearExtension(int number) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) return;
   iter->second.Clear();
 }
@@ -266,7 +265,7 @@
                                                                                \
 LOWERCASE ExtensionSet::Get##CAMELCASE(int number,                             \
                                        LOWERCASE default_value) const {        \
-  ExtensionMap::const_iterator iter = extensions_.find(number);                \
+  map<int, Extension>::const_iterator iter = extensions_.find(number);         \
   if (iter == extensions_.end() || iter->second.is_cleared) {                  \
     return default_value;                                                      \
   } else {                                                                     \
@@ -291,7 +290,7 @@
 }                                                                              \
                                                                                \
 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const {  \
-  ExtensionMap::const_iterator iter = extensions_.find(number);                \
+  map<int, Extension>::const_iterator iter = extensions_.find(number);         \
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \
   return iter->second.repeated_##LOWERCASE##_value->Get(index);                \
@@ -299,7 +298,7 @@
                                                                                \
 void ExtensionSet::SetRepeated##CAMELCASE(                                     \
     int number, int index, LOWERCASE value) {                                  \
-  ExtensionMap::iterator iter = extensions_.find(number);                      \
+  map<int, Extension>::iterator iter = extensions_.find(number);               \
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \
   iter->second.repeated_##LOWERCASE##_value->Set(index, value);                \
@@ -335,7 +334,7 @@
 
 const void* ExtensionSet::GetRawRepeatedField(int number,
                                               const void* default_value) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) {
     return default_value;
   }
@@ -409,7 +408,7 @@
 // Compatible version using old call signature. Does not create extensions when
 // the don't already exist; instead, just GOOGLE_CHECK-fails.
 void* ExtensionSet::MutableRawRepeatedField(int number) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found.";
   // We assume that all the RepeatedField<>* pointers have the same
   // size and alignment within the anonymous union in Extension.
@@ -421,7 +420,7 @@
 // Enums
 
 int ExtensionSet::GetEnum(int number, int default_value) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end() || iter->second.is_cleared) {
     // Not present.  Return the default value.
     return default_value;
@@ -446,14 +445,14 @@
 }
 
 int ExtensionSet::GetRepeatedEnum(int number, int index) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
   return iter->second.repeated_enum_value->Get(index);
 }
 
 void ExtensionSet::SetRepeatedEnum(int number, int index, int value) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
   iter->second.repeated_enum_value->Set(index, value);
@@ -482,7 +481,7 @@
 
 const string& ExtensionSet::GetString(int number,
                                       const string& default_value) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end() || iter->second.is_cleared) {
     // Not present.  Return the default value.
     return default_value;
@@ -508,14 +507,14 @@
 }
 
 const string& ExtensionSet::GetRepeatedString(int number, int index) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
   return iter->second.repeated_string_value->Get(index);
 }
 
 string* ExtensionSet::MutableRepeatedString(int number, int index) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
   return iter->second.repeated_string_value->Mutable(index);
@@ -542,7 +541,7 @@
 
 const MessageLite& ExtensionSet::GetMessage(
     int number, const MessageLite& default_value) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) {
     // Not present.  Return the default value.
     return default_value;
@@ -665,7 +664,7 @@
 
 MessageLite* ExtensionSet::ReleaseMessage(int number,
                                           const MessageLite& prototype) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) {
     // Not present.  Return NULL.
     return NULL;
@@ -694,7 +693,7 @@
 
 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage(
     int number, const MessageLite& prototype) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   if (iter == extensions_.end()) {
     // Not present.  Return NULL.
     return NULL;
@@ -721,14 +720,14 @@
 
 const MessageLite& ExtensionSet::GetRepeatedMessage(
     int number, int index) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
   return iter->second.repeated_message_value->Get(index);
 }
 
 MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
   return iter->second.repeated_message_value->Mutable(index);
@@ -767,7 +766,7 @@
 #undef GOOGLE_DCHECK_TYPE
 
 void ExtensionSet::RemoveLast(int number) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
 
   Extension* extension = &iter->second;
@@ -808,7 +807,7 @@
 }
 
 MessageLite* ExtensionSet::ReleaseLast(int number) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
 
   Extension* extension = &iter->second;
@@ -818,7 +817,7 @@
 }
 
 void ExtensionSet::SwapElements(int number, int index1, int index2) {
-  ExtensionMap::iterator iter = extensions_.find(number);
+  map<int, Extension>::iterator iter = extensions_.find(number);
   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
 
   Extension* extension = &iter->second;
@@ -861,14 +860,14 @@
 // ===================================================================
 
 void ExtensionSet::Clear() {
-  for (ExtensionMap::iterator iter = extensions_.begin();
+  for (map<int, Extension>::iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     iter->second.Clear();
   }
 }
 
 void ExtensionSet::MergeFrom(const ExtensionSet& other) {
-  for (ExtensionMap::const_iterator iter = other.extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = other.extensions_.begin();
        iter != other.extensions_.end(); ++iter) {
     const Extension& other_extension = iter->second;
     InternalExtensionMergeFrom(iter->first, other_extension);
@@ -1032,8 +1031,8 @@
 void ExtensionSet::SwapExtension(ExtensionSet* other,
                                  int number) {
   if (this == other) return;
-  ExtensionMap::iterator this_iter = extensions_.find(number);
-  ExtensionMap::iterator other_iter = other->extensions_.find(number);
+  map<int, Extension>::iterator this_iter = extensions_.find(number);
+  map<int, Extension>::iterator other_iter = other->extensions_.find(number);
 
   if (this_iter == extensions_.end() &&
       other_iter == other->extensions_.end()) {
@@ -1053,7 +1052,7 @@
       // implemented in ExtensionSet's MergeFrom.
       ExtensionSet temp;
       temp.InternalExtensionMergeFrom(number, other_iter->second);
-      ExtensionMap::iterator temp_iter = temp.extensions_.find(number);
+      map<int, Extension>::iterator temp_iter = temp.extensions_.find(number);
       other_iter->second.Clear();
       other->InternalExtensionMergeFrom(number, this_iter->second);
       this_iter->second.Clear();
@@ -1086,7 +1085,7 @@
 bool ExtensionSet::IsInitialized() const {
   // Extensions are never required.  However, we need to check that all
   // embedded messages are initialized.
-  for (ExtensionMap::const_iterator iter = extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     const Extension& extension = iter->second;
     if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {
@@ -1346,7 +1345,7 @@
 void ExtensionSet::SerializeWithCachedSizes(
     int start_field_number, int end_field_number,
     io::CodedOutputStream* output) const {
-  ExtensionMap::const_iterator iter;
+  map<int, Extension>::const_iterator iter;
   for (iter = extensions_.lower_bound(start_field_number);
        iter != extensions_.end() && iter->first < end_field_number;
        ++iter) {
@@ -1354,10 +1353,10 @@
   }
 }
 
-size_t ExtensionSet::ByteSize() const {
-  size_t total_size = 0;
+int ExtensionSet::ByteSize() const {
+  int total_size = 0;
 
-  for (ExtensionMap::const_iterator iter = extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     total_size += iter->second.ByteSize(iter->first);
   }
@@ -1371,7 +1370,7 @@
 bool ExtensionSet::MaybeNewExtension(int number,
                                      const FieldDescriptor* descriptor,
                                      Extension** result) {
-  std::pair<ExtensionMap::iterator, bool> insert_result =
+  pair<map<int, Extension>::iterator, bool> insert_result =
       extensions_.insert(std::make_pair(number, Extension()));
   *result = &insert_result.first->second;
   (*result)->descriptor = descriptor;
@@ -1536,8 +1535,8 @@
   }
 }
 
-size_t ExtensionSet::Extension::ByteSize(int number) const {
-  size_t result = 0;
+int ExtensionSet::Extension::ByteSize(int number) const {
+  int result = 0;
 
   if (is_repeated) {
     if (is_packed) {
@@ -1563,7 +1562,7 @@
 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
         case WireFormatLite::TYPE_##UPPERCASE:                              \
           result += WireFormatLite::k##CAMELCASE##Size *                    \
-                    FromIntSize(repeated_##LOWERCASE##_value->size());      \
+                    repeated_##LOWERCASE##_value->size();                   \
           break
         HANDLE_TYPE( FIXED32,  Fixed32, uint32);
         HANDLE_TYPE( FIXED64,  Fixed64, uint64);
@@ -1582,7 +1581,7 @@
           break;
       }
 
-      cached_size = ToCachedSize(result);
+      cached_size = result;
       if (result > 0) {
         result += io::CodedOutputStream::VarintSize32(result);
         result += io::CodedOutputStream::VarintSize32(
@@ -1590,13 +1589,12 @@
                 WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
       }
     } else {
-      size_t tag_size = WireFormatLite::TagSize(number, real_type(type));
+      int 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());      \
+          result += tag_size * repeated_##LOWERCASE##_value->size();        \
           for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
             result += WireFormatLite::CAMELCASE##Size(                      \
               repeated_##LOWERCASE##_value->Get(i));                        \
@@ -1620,7 +1618,7 @@
 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
         case WireFormatLite::TYPE_##UPPERCASE:                              \
           result += (tag_size + WireFormatLite::k##CAMELCASE##Size) *       \
-                    FromIntSize(repeated_##LOWERCASE##_value->size());      \
+                    repeated_##LOWERCASE##_value->size();                   \
           break
         HANDLE_TYPE( FIXED32,  Fixed32, uint32);
         HANDLE_TYPE( FIXED64,  Fixed64, uint64);
@@ -1653,7 +1651,7 @@
 #undef HANDLE_TYPE
       case WireFormatLite::TYPE_MESSAGE: {
         if (is_lazy) {
-          size_t size = lazymessage_value->ByteSize();
+          int size = lazymessage_value->ByteSize();
           result += io::CodedOutputStream::VarintSize32(size) + size;
         } else {
           result += WireFormatLite::MessageSize(*message_value);
diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h
index 0a5d98f..bca179b 100644
--- a/src/google/protobuf/extension_set.h
+++ b/src/google/protobuf/extension_set.h
@@ -273,8 +273,6 @@
 
   MessageLite* ReleaseMessage(const FieldDescriptor* descriptor,
                               MessageFactory* factory);
-  MessageLite* UnsafeArenaReleaseMessage(const FieldDescriptor* descriptor,
-                                         MessageFactory* factory);
 #undef desc
   ::google::protobuf::Arena* GetArenaNoVirtual() const { return arena_; }
 
@@ -405,29 +403,19 @@
   // serialized extensions.
   //
   // Returns a pointer past the last written byte.
-  uint8* InternalSerializeWithCachedSizesToArray(int start_field_number,
-                                                 int end_field_number,
-                                                 bool deterministic,
-                                                 uint8* target) const;
-
-  // Like above but serializes in MessageSet format.
-  void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const;
-  uint8* InternalSerializeMessageSetWithCachedSizesToArray(bool deterministic,
-                                                           uint8* target) const;
-
-  // For backward-compatibility, versions of two of the above methods that
-  // serialize deterministically iff SetDefaultSerializationDeterministic()
-  // has been called.
   uint8* SerializeWithCachedSizesToArray(int start_field_number,
                                          int end_field_number,
                                          uint8* target) const;
+
+  // Like above but serializes in MessageSet format.
+  void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const;
   uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const;
 
   // Returns the total serialized size of all the extensions.
-  size_t ByteSize() const;
+  int ByteSize() const;
 
   // Like ByteSize() but uses MessageSet format.
-  size_t MessageSetByteSize() const;
+  int MessageSetByteSize() const;
 
   // Returns (an estimate of) the total number of bytes used for storing the
   // extensions in memory, excluding sizeof(*this).  If the ExtensionSet is
@@ -436,13 +424,6 @@
   // be linked in).  It's up to the protocol compiler to avoid calling this on
   // such ExtensionSets (easy enough since lite messages don't implement
   // SpaceUsed()).
-  size_t SpaceUsedExcludingSelfLong() const;
-
-  // This method just calls SpaceUsedExcludingSelfLong() but it can not be
-  // inlined because the definition of SpaceUsedExcludingSelfLong() is not
-  // included in lite runtime and when an inline method refers to it MSVC
-  // will complain about unresolved symbols when building the lite runtime
-  // as .dll.
   int SpaceUsedExcludingSelf() const;
 
  private:
@@ -465,7 +446,7 @@
 
     virtual bool IsInitialized() const = 0;
     virtual int ByteSize() const = 0;
-    virtual size_t SpaceUsedLong() const = 0;
+    virtual int SpaceUsed() const = 0;
 
     virtual void MergeFrom(const LazyMessageExtension& other) = 0;
     virtual void Clear() = 0;
@@ -475,13 +456,6 @@
     virtual void WriteMessage(int number,
                               io::CodedOutputStream* output) const = 0;
     virtual uint8* WriteMessageToArray(int number, uint8* target) const = 0;
-    virtual uint8* InternalWriteMessageToArray(int number, bool,
-                                               uint8* target) const {
-      // TODO(gpike): make this pure virtual. This is a placeholder because we
-      // need to update third_party/upb, for example.
-      return WriteMessageToArray(number, target);
-    }
-
    private:
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension);
   };
@@ -548,25 +522,22 @@
     void SerializeFieldWithCachedSizes(
         int number,
         io::CodedOutputStream* output) const;
-    uint8* InternalSerializeFieldWithCachedSizesToArray(
+    uint8* SerializeFieldWithCachedSizesToArray(
         int number,
-        bool deterministic,
         uint8* target) const;
     void SerializeMessageSetItemWithCachedSizes(
         int number,
         io::CodedOutputStream* output) const;
-    uint8* InternalSerializeMessageSetItemWithCachedSizesToArray(
+    uint8* SerializeMessageSetItemWithCachedSizesToArray(
         int number,
-        bool deterministic,
         uint8* target) const;
-    size_t ByteSize(int number) const;
-    size_t MessageSetItemByteSize(int number) const;
+    int ByteSize(int number) const;
+    int MessageSetItemByteSize(int number) const;
     void Clear();
     int GetSize() const;
     void Free();
-    size_t SpaceUsedExcludingSelfLong() const;
+    int SpaceUsedExcludingSelf() const;
   };
-  typedef std::map<int, Extension> ExtensionMap;
 
 
   // Merges existing Extension from other_extension
@@ -628,7 +599,7 @@
   //   class.
 
   // Defined in extension_set_heavy.cc.
-  static inline size_t RepeatedMessage_SpaceUsedExcludingSelfLong(
+  static inline int RepeatedMessage_SpaceUsedExcludingSelf(
       RepeatedPtrFieldBase* field);
 
   // The Extension struct is small enough to be passed by value, so we use it
@@ -637,7 +608,7 @@
   // only contain a small number of extensions whereas hash_map is optimized
   // for 100 elements or more.  Also, we want AppendToList() to order fields
   // by field number.
-  ExtensionMap extensions_;
+  std::map<int, Extension> extensions_;
   ::google::protobuf::Arena* arena_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet);
 };
@@ -697,10 +668,6 @@
 //                                       ExtensionSet* set);
 //     static inline void Add(int number, ConstType value, ExtensionSet* set);
 //     static inline MutableType Add(int number, ExtensionSet* set);
-//     This is used by the ExtensionIdentifier constructor to register
-//     the extension at dynamic initialization.
-//     template <typename ExtendeeT>
-//     static void Register(int number, FieldType type, bool is_packed);
 //   };
 //
 // Not all of these methods make sense for all field types.  For example, the
@@ -732,11 +699,6 @@
                               ConstType default_value);
   static inline void Set(int number, FieldType field_type,
                          ConstType value, ExtensionSet* set);
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number,
-                                    type, false, is_packed);
-  }
 };
 
 template <typename Type>
@@ -760,11 +722,6 @@
                       bool is_packed, ExtensionSet* set);
 
   static const RepeatedFieldType* GetDefaultRepeatedField();
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number,
-                                    type, true, is_packed);
-  }
 };
 
 LIBPROTOBUF_EXPORT extern ProtobufOnceType repeated_primitive_generic_type_traits_once_init_;
@@ -862,11 +819,6 @@
                                 ExtensionSet* set) {
     return set->MutableString(number, field_type, NULL);
   }
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number,
-                                    type, false, is_packed);
-  }
 };
 
 LIBPROTOBUF_EXPORT extern ProtobufOnceType repeated_string_type_traits_once_init_;
@@ -919,12 +871,6 @@
     return default_repeated_field_;
   }
 
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number,
-                                    type, true, is_packed);
-  }
-
  private:
   static void InitializeDefaultRepeatedFields();
   static void DestroyDefaultRepeatedFields();
@@ -952,11 +898,6 @@
     GOOGLE_DCHECK(IsValid(value));
     set->SetEnum(number, field_type, value, NULL);
   }
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterEnumExtension(&ExtendeeT::default_instance(), number,
-                                        type, false, is_packed, IsValid);
-  }
 };
 
 template <typename Type, bool IsValid(int)>
@@ -1010,11 +951,6 @@
     return reinterpret_cast<const RepeatedField<Type>*>(
         RepeatedPrimitiveTypeTraits<int32>::GetDefaultRepeatedField());
   }
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterEnumExtension(&ExtendeeT::default_instance(), number,
-                                        type, true, is_packed, IsValid);
-  }
 };
 
 // -------------------------------------------------------------------
@@ -1044,28 +980,11 @@
                                   MutableType message, ExtensionSet* set) {
     set->SetAllocatedMessage(number, field_type, NULL, message);
   }
-  static inline void UnsafeArenaSetAllocated(int number, FieldType field_type,
-                                             MutableType message,
-                                             ExtensionSet* set) {
-    set->UnsafeArenaSetAllocatedMessage(number, field_type, NULL, message);
-  }
   static inline MutableType Release(int number, FieldType /* field_type */,
                                     ExtensionSet* set) {
     return static_cast<Type*>(set->ReleaseMessage(
         number, Type::default_instance()));
   }
-  static inline MutableType UnsafeArenaRelease(int number,
-                                               FieldType /* field_type */,
-                                               ExtensionSet* set) {
-    return static_cast<Type*>(set->UnsafeArenaReleaseMessage(
-        number, Type::default_instance()));
-  }
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterMessageExtension(&ExtendeeT::default_instance(),
-                                           number, type, false, is_packed,
-                                           &Type::default_instance());
-  }
 };
 
 // forward declaration
@@ -1111,12 +1030,6 @@
   }
 
   static const RepeatedFieldType* GetDefaultRepeatedField();
-  template <typename ExtendeeT>
-  static void Register(int number, FieldType type, bool is_packed) {
-    ExtensionSet::RegisterMessageExtension(&ExtendeeT::default_instance(),
-                                           number, type, true, is_packed,
-                                           &Type::default_instance());
-  }
 };
 
 LIBPROTOBUF_EXPORT extern ProtobufOnceType repeated_message_generic_type_traits_once_init_;
@@ -1155,7 +1068,7 @@
 // parameter, and thus make an instance of ExtensionIdentifier have no
 // actual contents.  However, if we did that, then using at extension
 // identifier would not necessarily cause the compiler to output any sort
-// of reference to any symbol defined in the extension's .pb.o file.  Some
+// of reference to any simple defined in the extension's .pb.o file.  Some
 // linkers will actually drop object files that are not explicitly referenced,
 // but that would be bad because it would cause this extension to not be
 // registered at static initialization, and therefore using it would crash.
@@ -1168,18 +1081,12 @@
   typedef ExtendeeType Extendee;
 
   ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value)
-      : number_(number), default_value_(default_value) {
-    Register(number);
-  }
+      : number_(number), default_value_(default_value) {}
   inline int number() const { return number_; }
   typename TypeTraits::ConstType default_value() const {
     return default_value_;
   }
 
-  static void Register(int number) {
-    TypeTraits::template Register<ExtendeeType>(number, field_type, is_packed);
-  }
-
  private:
   const int number_;
   typename TypeTraits::ConstType default_value_;
@@ -1271,32 +1178,12 @@
   template <typename _proto_TypeTraits,                                       \
             ::google::protobuf::internal::FieldType _field_type,                        \
             bool _is_packed>                                                  \
-  inline void UnsafeArenaSetAllocatedExtension(                               \
-      const ::google::protobuf::internal::ExtensionIdentifier<                          \
-        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
-      typename _proto_TypeTraits::Singular::MutableType value) {              \
-    _proto_TypeTraits::UnsafeArenaSetAllocated(id.number(), _field_type,      \
-                                               value, &_extensions_);         \
-  }                                                                           \
-  template <typename _proto_TypeTraits,                                       \
-            ::google::protobuf::internal::FieldType _field_type,                        \
-            bool _is_packed>                                                  \
   inline typename _proto_TypeTraits::Singular::MutableType ReleaseExtension(  \
       const ::google::protobuf::internal::ExtensionIdentifier<                          \
         CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) {         \
     return _proto_TypeTraits::Release(id.number(), _field_type,               \
                                       &_extensions_);                         \
   }                                                                           \
-  template <typename _proto_TypeTraits,                                       \
-            ::google::protobuf::internal::FieldType _field_type,                        \
-            bool _is_packed>                                                  \
-  inline typename _proto_TypeTraits::Singular::MutableType                    \
-      UnsafeArenaReleaseExtension(                                            \
-          const ::google::protobuf::internal::ExtensionIdentifier<                      \
-            CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) {     \
-    return _proto_TypeTraits::UnsafeArenaRelease(id.number(), _field_type,    \
-                                                 &_extensions_);              \
-  }                                                                           \
                                                                               \
   /* Repeated accessors */                                                    \
   template <typename _proto_TypeTraits,                                       \
diff --git a/src/google/protobuf/extension_set_heavy.cc b/src/google/protobuf/extension_set_heavy.cc
index fad3134..82e3e09 100644
--- a/src/google/protobuf/extension_set_heavy.cc
+++ b/src/google/protobuf/extension_set_heavy.cc
@@ -35,14 +35,11 @@
 // Contains methods defined in extension_set.h which cannot be part of the
 // lite library because they use descriptors or reflection.
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/extension_set.h>
 #include <google/protobuf/message.h>
 #include <google/protobuf/repeated_field.h>
-#include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/wire_format.h>
 #include <google/protobuf/wire_format_lite_inl.h>
 
@@ -98,7 +95,7 @@
     const Descriptor* containing_type,
     const DescriptorPool* pool,
     std::vector<const FieldDescriptor*>* output) const {
-  for (ExtensionMap::const_iterator iter = extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     bool has = false;
     if (iter->second.is_repeated) {
@@ -147,7 +144,7 @@
 const MessageLite& ExtensionSet::GetMessage(int number,
                                             const Descriptor* message_type,
                                             MessageFactory* factory) const {
-  ExtensionMap::const_iterator iter = extensions_.find(number);
+  map<int, Extension>::const_iterator iter = extensions_.find(number);
   if (iter == extensions_.end() || iter->second.is_cleared) {
     // Not present.  Return the default value.
     return *factory->GetPrototype(message_type);
@@ -190,7 +187,7 @@
 
 MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
                                           MessageFactory* factory) {
-  ExtensionMap::iterator iter = extensions_.find(descriptor->number());
+  map<int, Extension>::iterator iter = extensions_.find(descriptor->number());
   if (iter == extensions_.end()) {
     // Not present.  Return NULL.
     return NULL;
@@ -216,29 +213,6 @@
   }
 }
 
-MessageLite* ExtensionSet::UnsafeArenaReleaseMessage(
-    const FieldDescriptor* descriptor, MessageFactory* factory) {
-  ExtensionMap::iterator iter = extensions_.find(descriptor->number());
-  if (iter == extensions_.end()) {
-    // Not present.  Return NULL.
-    return NULL;
-  } else {
-    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
-    MessageLite* ret = NULL;
-    if (iter->second.is_lazy) {
-      ret = iter->second.lazymessage_value->UnsafeArenaReleaseMessage(
-          *factory->GetPrototype(descriptor->message_type()));
-      if (arena_ == NULL) {
-        delete iter->second.lazymessage_value;
-      }
-    } else {
-      ret = iter->second.message_value;
-    }
-    extensions_.erase(descriptor->number());
-    return ret;
-  }
-}
-
 ExtensionSet::Extension* ExtensionSet::MaybeNewRepeatedExtension(const FieldDescriptor* descriptor) {
   Extension* extension;
   if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) {
@@ -343,35 +317,31 @@
 }
 
 int ExtensionSet::SpaceUsedExcludingSelf() const {
-  return internal::FromIntSize(SpaceUsedExcludingSelfLong());
-}
-
-size_t ExtensionSet::SpaceUsedExcludingSelfLong() const {
-  size_t total_size =
-      extensions_.size() * sizeof(ExtensionMap::value_type);
-  for (ExtensionMap::const_iterator iter = extensions_.begin(),
+  int total_size =
+      extensions_.size() * sizeof(map<int, Extension>::value_type);
+  for (map<int, Extension>::const_iterator iter = extensions_.begin(),
        end = extensions_.end();
        iter != end;
        ++iter) {
-    total_size += iter->second.SpaceUsedExcludingSelfLong();
+    total_size += iter->second.SpaceUsedExcludingSelf();
   }
   return total_size;
 }
 
-inline size_t ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelfLong(
+inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf(
     RepeatedPtrFieldBase* field) {
-  return field->SpaceUsedExcludingSelfLong<GenericTypeHandler<Message> >();
+  return field->SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
 }
 
-size_t ExtensionSet::Extension::SpaceUsedExcludingSelfLong() const {
-  size_t total_size = 0;
+int ExtensionSet::Extension::SpaceUsedExcludingSelf() const {
+  int total_size = 0;
   if (is_repeated) {
     switch (cpp_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-  case FieldDescriptor::CPPTYPE_##UPPERCASE:                                  \
-    total_size += sizeof(*repeated_##LOWERCASE##_value) +                     \
-                  repeated_##LOWERCASE##_value->SpaceUsedExcludingSelfLong(); \
-    break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
+      case FieldDescriptor::CPPTYPE_##UPPERCASE:                   \
+        total_size += sizeof(*repeated_##LOWERCASE##_value) +      \
+            repeated_##LOWERCASE##_value->SpaceUsedExcludingSelf();\
+        break
 
       HANDLE_TYPE(  INT32,   int32);
       HANDLE_TYPE(  INT64,   int64);
@@ -386,25 +356,24 @@
 
       case FieldDescriptor::CPPTYPE_MESSAGE:
         // repeated_message_value is actually a RepeatedPtrField<MessageLite>,
-        // but MessageLite has no SpaceUsedLong(), so we must directly call
-        // RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong() with a different
-        // type handler.
-        total_size +=
-            sizeof(*repeated_message_value) +
-            RepeatedMessage_SpaceUsedExcludingSelfLong(repeated_message_value);
+        // but MessageLite has no SpaceUsed(), so we must directly call
+        // RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type
+        // handler.
+        total_size += sizeof(*repeated_message_value) +
+            RepeatedMessage_SpaceUsedExcludingSelf(repeated_message_value);
         break;
     }
   } else {
     switch (cpp_type(type)) {
       case FieldDescriptor::CPPTYPE_STRING:
         total_size += sizeof(*string_value) +
-                      StringSpaceUsedExcludingSelfLong(*string_value);
+                      StringSpaceUsedExcludingSelf(*string_value);
         break;
       case FieldDescriptor::CPPTYPE_MESSAGE:
         if (is_lazy) {
-          total_size += lazymessage_value->SpaceUsedLong();
+          total_size += lazymessage_value->SpaceUsed();
         } else {
-          total_size += down_cast<Message*>(message_value)->SpaceUsedLong();
+          total_size += down_cast<Message*>(message_value)->SpaceUsed();
         }
         break;
       default:
@@ -417,47 +386,31 @@
 
 // The Serialize*ToArray methods are only needed in the heavy library, as
 // the lite library only generates SerializeWithCachedSizes.
-uint8* ExtensionSet::SerializeWithCachedSizesToArray(int start_field_number,
-                                                     int end_field_number,
-                                                     uint8* target) const {
-  return InternalSerializeWithCachedSizesToArray(
-      start_field_number, end_field_number,
-      google::protobuf::io::CodedOutputStream::IsDefaultSerializationDeterministic(),
-      target);
+uint8* ExtensionSet::SerializeWithCachedSizesToArray(
+    int start_field_number, int end_field_number,
+    uint8* target) const {
+  map<int, Extension>::const_iterator iter;
+  for (iter = extensions_.lower_bound(start_field_number);
+       iter != extensions_.end() && iter->first < end_field_number;
+       ++iter) {
+    target = iter->second.SerializeFieldWithCachedSizesToArray(iter->first,
+                                                               target);
+  }
+  return target;
 }
 
 uint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray(
     uint8* target) const {
-  return InternalSerializeMessageSetWithCachedSizesToArray(
-      google::protobuf::io::CodedOutputStream::IsDefaultSerializationDeterministic(),
-      target);
-}
-
-uint8* ExtensionSet::InternalSerializeWithCachedSizesToArray(
-    int start_field_number, int end_field_number,
-    bool deterministic, uint8* target) const {
-  ExtensionMap::const_iterator iter;
-  for (iter = extensions_.lower_bound(start_field_number);
-       iter != extensions_.end() && iter->first < end_field_number;
-       ++iter) {
-    target = iter->second.InternalSerializeFieldWithCachedSizesToArray(
-        iter->first, deterministic, target);
-  }
-  return target;
-}
-
-uint8* ExtensionSet::InternalSerializeMessageSetWithCachedSizesToArray(
-    bool deterministic, uint8* target) const {
-  ExtensionMap::const_iterator iter;
+  map<int, Extension>::const_iterator iter;
   for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {
-    target = iter->second.InternalSerializeMessageSetItemWithCachedSizesToArray(
-        iter->first, deterministic, target);
+    target = iter->second.SerializeMessageSetItemWithCachedSizesToArray(
+        iter->first, target);
   }
   return target;
 }
 
-uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray(
-    int number, bool deterministic, uint8* target) const {
+uint8* ExtensionSet::Extension::SerializeFieldWithCachedSizesToArray(
+    int number, uint8* target) const {
   if (is_repeated) {
     if (is_packed) {
       if (cached_size == 0) return target;
@@ -491,10 +444,10 @@
         HANDLE_TYPE(    ENUM,     Enum,    enum);
 #undef HANDLE_TYPE
 
-        case FieldDescriptor::TYPE_STRING:
-        case FieldDescriptor::TYPE_BYTES:
-        case FieldDescriptor::TYPE_GROUP:
-        case FieldDescriptor::TYPE_MESSAGE:
+        case WireFormatLite::TYPE_STRING:
+        case WireFormatLite::TYPE_BYTES:
+        case WireFormatLite::TYPE_GROUP:
+        case WireFormatLite::TYPE_MESSAGE:
           GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
           break;
       }
@@ -524,16 +477,6 @@
         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:                             \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            target = WireFormatLite::InternalWrite##CAMELCASE##ToArray(     \
-                      number, repeated_##LOWERCASE##_value->Get(i),         \
-                      deterministic, target);                               \
-          }                                                                 \
-          break
-
         HANDLE_TYPE(   GROUP,    Group, message);
         HANDLE_TYPE( MESSAGE,  Message, message);
 #undef HANDLE_TYPE
@@ -567,11 +510,10 @@
 #undef HANDLE_TYPE
       case FieldDescriptor::TYPE_MESSAGE:
         if (is_lazy) {
-          target = lazymessage_value->InternalWriteMessageToArray(
-              number, deterministic, target);
+          target = lazymessage_value->WriteMessageToArray(number, target);
         } else {
-          target = WireFormatLite::InternalWriteMessageToArray(
-              number, *message_value, deterministic, target);
+          target = WireFormatLite::WriteMessageToArray(
+              number, *message_value, target);
         }
         break;
     }
@@ -579,14 +521,13 @@
   return target;
 }
 
-uint8*
-ExtensionSet::Extension::InternalSerializeMessageSetItemWithCachedSizesToArray(
-    int number, bool deterministic, uint8* target) const {
+uint8* ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizesToArray(
+    int number,
+    uint8* target) const {
   if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
     // Not a valid MessageSet extension, but serialize it the normal way.
     GOOGLE_LOG(WARNING) << "Invalid message set extension.";
-    return InternalSerializeFieldWithCachedSizesToArray(number, deterministic,
-                                                        target);
+    return SerializeFieldWithCachedSizesToArray(number, target);
   }
 
   if (is_cleared) return target;
@@ -599,12 +540,11 @@
       WireFormatLite::kMessageSetTypeIdNumber, number, target);
   // Write message.
   if (is_lazy) {
-    target = lazymessage_value->InternalWriteMessageToArray(
-        WireFormatLite::kMessageSetMessageNumber, deterministic, target);
+    target = lazymessage_value->WriteMessageToArray(
+        WireFormatLite::kMessageSetMessageNumber, target);
   } else {
-    target = WireFormatLite::InternalWriteMessageToArray(
-        WireFormatLite::kMessageSetMessageNumber, *message_value, deterministic,
-        target);
+    target = WireFormatLite::WriteMessageToArray(
+        WireFormatLite::kMessageSetMessageNumber, *message_value, target);
   }
   // End group.
   target = io::CodedOutputStream::WriteTagToArray(
@@ -669,7 +609,7 @@
   string message_data;
 
   while (true) {
-    const uint32 tag = input->ReadTagNoLastTag();
+    const uint32 tag = input->ReadTag();
     if (tag == 0) return false;
 
     switch (tag) {
@@ -762,7 +702,7 @@
   output->WriteTag(WireFormatLite::kMessageSetItemEndTag);
 }
 
-size_t ExtensionSet::Extension::MessageSetItemByteSize(int number) const {
+int ExtensionSet::Extension::MessageSetItemByteSize(int number) const {
   if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
     // Not a valid MessageSet extension, but compute the byte size for it the
     // normal way.
@@ -771,13 +711,13 @@
 
   if (is_cleared) return 0;
 
-  size_t our_size = WireFormatLite::kMessageSetItemTagsSize;
+  int our_size = WireFormatLite::kMessageSetItemTagsSize;
 
   // type_id
   our_size += io::CodedOutputStream::VarintSize32(number);
 
   // message
-  size_t message_size = 0;
+  int message_size = 0;
   if (is_lazy) {
     message_size = lazymessage_value->ByteSize();
   } else {
@@ -792,16 +732,16 @@
 
 void ExtensionSet::SerializeMessageSetWithCachedSizes(
     io::CodedOutputStream* output) const {
-  for (ExtensionMap::const_iterator iter = extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output);
   }
 }
 
-size_t ExtensionSet::MessageSetByteSize() const {
-  size_t total_size = 0;
+int ExtensionSet::MessageSetByteSize() const {
+  int total_size = 0;
 
-  for (ExtensionMap::const_iterator iter = extensions_.begin();
+  for (map<int, Extension>::const_iterator iter = extensions_.begin();
        iter != extensions_.end(); ++iter) {
     total_size += iter->second.MessageSetItemByteSize(iter->first);
   }
diff --git a/src/google/protobuf/extension_set_unittest.cc b/src/google/protobuf/extension_set_unittest.cc
index 3e71b25..f40fcbc 100644
--- a/src/google/protobuf/extension_set_unittest.cc
+++ b/src/google/protobuf/extension_set_unittest.cc
@@ -32,8 +32,6 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-
-#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/extension_set.h>
 #include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/unittest_mset.pb.h>
@@ -48,6 +46,7 @@
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 #include <google/protobuf/stubs/stl_util.h>
@@ -206,74 +205,6 @@
   delete released_extension;
 }
 
-TEST(ExtensionSetTest, ArenaUnsafeArenaSetAllocatedAndRelease) {
-  ::google::protobuf::Arena arena;
-  unittest::TestAllExtensions* message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
-  unittest::ForeignMessage extension;
-  message->UnsafeArenaSetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      &extension);
-  // No copy when set.
-  unittest::ForeignMessage* mutable_extension =
-      message->MutableExtension(unittest::optional_foreign_message_extension);
-  EXPECT_EQ(&extension, mutable_extension);
-  // No copy when unsafe released.
-  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));
-  // 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);
-}
-
-TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) {
-  unittest::TestAllExtensions message;
-  unittest::ForeignMessage* extension = new unittest::ForeignMessage();
-  message.UnsafeArenaSetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      extension);
-  // No copy when set.
-  unittest::ForeignMessage* mutable_extension =
-      message.MutableExtension(unittest::optional_foreign_message_extension);
-  EXPECT_EQ(extension, mutable_extension);
-  // No copy when unsafe released.
-  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));
-  // 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);
-}
-
-TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) {
-  ::google::protobuf::Arena arena;
-  unittest::TestAllExtensions* message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
-  unittest::ForeignMessage* extension = new unittest::ForeignMessage;
-  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));
-}
-
 
 TEST(ExtensionSetTest, CopyFrom) {
   unittest::TestAllExtensions message1, message2;
@@ -332,7 +263,7 @@
   unittest::TestAllExtensions message2;
 
   TestUtil::SetAllExtensions(&message1);
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
 
   // Swap empty fields.
   const Reflection* reflection = message1.GetReflection();
@@ -364,7 +295,7 @@
   TestUtil::SetAllExtensions(&message3);
 
   const Reflection* reflection = message3.GetReflection();
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message3, &fields);
 
   reflection->SwapFields(&message1, &message2, fields);
@@ -381,7 +312,7 @@
   TestUtil::SetAllExtensions(&message2);
 
   const Reflection* reflection = message1.GetReflection();
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message1, &fields);
 
   reflection->SwapFields(&message1, &message2, fields);
@@ -491,7 +422,7 @@
   TestUtil::SetAllExtensions(message2);
 
   const Reflection* reflection = message1->GetReflection();
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(*message1, &fields);
   reflection->SwapFields(message1, message2, fields);
   TestUtil::ExpectAllExtensionsSet(*message1);
@@ -505,7 +436,7 @@
 
   TestUtil::SetAllExtensions(&message1);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   const Reflection* reflection = message1.GetReflection();
   reflection->ListFields(message1, &fields);
   reflection->SwapFields(&message1, &message1, fields);
@@ -797,7 +728,7 @@
     }                                                                          \
     int expected_size = sizeof(cpptype) * (16 -                                \
         kMinRepeatedFieldAllocationSize) + empty_repeated_field_size;          \
-    EXPECT_LE(expected_size, message.SpaceUsed()) << #type;                    \
+    EXPECT_EQ(expected_size, message.SpaceUsed()) << #type;                    \
   } while (0)
 
   TEST_REPEATED_EXTENSIONS_SPACE_USED(int32   , int32 , 101);
diff --git a/src/google/protobuf/field_mask.pb.cc b/src/google/protobuf/field_mask.pb.cc
index c55a697..c49ebce 100644
--- a/src/google/protobuf/field_mask.pb.cc
+++ b/src/google/protobuf/field_mask.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/field_mask.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/field_mask.pb.h>
 
 #include <algorithm>
@@ -14,135 +15,127 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class FieldMaskDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FieldMask>
-      _instance;
-} _FieldMask_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto {
-void InitDefaultsFieldMaskImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_FieldMask_default_instance_;
-    new (ptr) ::google::protobuf::FieldMask();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FieldMask::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* FieldMask_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FieldMask_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2ffield_5fmask_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/field_mask.proto");
+  GOOGLE_CHECK(file != NULL);
+  FieldMask_descriptor_ = file->message_type(0);
+  static const int FieldMask_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldMask, paths_),
+  };
+  FieldMask_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FieldMask_descriptor_,
+      FieldMask::default_instance_,
+      FieldMask_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(FieldMask),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldMask, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldMask, _is_default_instance_));
 }
 
-void InitDefaultsFieldMask() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldMaskImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2ffield_5fmask_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldMask, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldMask, paths_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::FieldMask)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FieldMask_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/field_mask.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FieldMask_descriptor_, &FieldMask::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n google/protobuf/field_mask.proto\022\017goog"
-      "le.protobuf\"\032\n\tFieldMask\022\r\n\005paths\030\001 \003(\tB"
-      "\211\001\n\023com.google.protobufB\016FieldMaskProtoP"
-      "\001Z9google.golang.org/genproto/protobuf/f"
-      "ield_mask;field_mask\242\002\003GPB\252\002\036Google.Prot"
-      "obuf.WellKnownTypesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2ffield_5fmask_2eproto() {
+  delete FieldMask::default_instance_;
+  delete FieldMask_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2ffield_5fmask_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 227);
+    "\n google/protobuf/field_mask.proto\022\017goog"
+    "le.protobuf\"\032\n\tFieldMask\022\r\n\005paths\030\001 \003(\tB"
+    "Q\n\023com.google.protobufB\016FieldMaskProtoP\001"
+    "\240\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTyp"
+    "esb\006proto3", 170);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/field_mask.proto", &protobuf_RegisterTypes);
+  FieldMask::default_instance_ = new FieldMask();
+  FieldMask::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2ffield_5fmask_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2ffield_5fmask_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2ffield_5fmask_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2ffield_5fmask_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void FieldMask::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int FieldMask::kPathsFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 FieldMask::FieldMask()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::InitDefaultsFieldMask();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.FieldMask)
 }
+
+void FieldMask::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 FieldMask::FieldMask(const FieldMask& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      paths_(from.paths_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldMask)
 }
 
 void FieldMask::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
 }
 
@@ -152,6 +145,8 @@
 }
 
 void FieldMask::SharedDtor() {
+  if (this != default_instance_) {
+  }
 }
 
 void FieldMask::SetCachedSize(int size) const {
@@ -160,15 +155,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* FieldMask::descriptor() {
-  ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return FieldMask_descriptor_;
 }
 
 const FieldMask& FieldMask::default_instance() {
-  ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::InitDefaultsFieldMask();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
+  return *default_instance_;
 }
 
+FieldMask* FieldMask::default_instance_ = NULL;
+
 FieldMask* FieldMask::New(::google::protobuf::Arena* arena) const {
   FieldMask* n = new FieldMask;
   if (arena != NULL) {
@@ -179,12 +176,7 @@
 
 void FieldMask::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.FieldMask)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   paths_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool FieldMask::MergePartialFromCodedStream(
@@ -193,34 +185,37 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.FieldMask)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated string paths = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
+         parse_paths:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->add_paths()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
             this->paths(this->paths_size() - 1).data(),
-            static_cast<int>(this->paths(this->paths_size() - 1).length()),
+            this->paths(this->paths_size() - 1).length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.FieldMask.paths"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(10)) goto parse_paths;
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -237,79 +232,57 @@
 void FieldMask::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.FieldMask)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated string paths = 1;
-  for (int i = 0, n = this->paths_size(); i < n; i++) {
+  for (int i = 0; i < this->paths_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->paths(i).data(), static_cast<int>(this->paths(i).length()),
+      this->paths(i).data(), this->paths(i).length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.FieldMask.paths");
     ::google::protobuf::internal::WireFormatLite::WriteString(
       1, this->paths(i), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.FieldMask)
 }
 
-::google::protobuf::uint8* FieldMask::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* FieldMask::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldMask)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated string paths = 1;
-  for (int i = 0, n = this->paths_size(); i < n; i++) {
+  for (int i = 0; i < this->paths_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->paths(i).data(), static_cast<int>(this->paths(i).length()),
+      this->paths(i).data(), this->paths(i).length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.FieldMask.paths");
     target = ::google::protobuf::internal::WireFormatLite::
       WriteStringToArray(1, this->paths(i), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldMask)
   return target;
 }
 
-size_t FieldMask::ByteSizeLong() const {
+int FieldMask::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldMask)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
   // repeated string paths = 1;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->paths_size());
-  for (int i = 0, n = this->paths_size(); i < n; i++) {
+  total_size += 1 * this->paths_size();
+  for (int i = 0; i < this->paths_size(); i++) {
     total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
       this->paths(i));
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void FieldMask::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FieldMask)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FieldMask* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FieldMask* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const FieldMask>(
           &from);
   if (source == NULL) {
@@ -323,11 +296,7 @@
 
 void FieldMask::MergeFrom(const FieldMask& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldMask)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   paths_.MergeFrom(from.paths_);
 }
 
@@ -346,6 +315,7 @@
 }
 
 bool FieldMask::IsInitialized() const {
+
   return true;
 }
 
@@ -354,19 +324,81 @@
   InternalSwap(other);
 }
 void FieldMask::InternalSwap(FieldMask* other) {
-  using std::swap;
-  paths_.InternalSwap(&other->paths_);
+  paths_.UnsafeArenaSwap(&other->paths_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata FieldMask::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FieldMask_descriptor_;
+  metadata.reflection = FieldMask_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FieldMask
+
+// repeated string paths = 1;
+int FieldMask::paths_size() const {
+  return paths_.size();
+}
+void FieldMask::clear_paths() {
+  paths_.Clear();
+}
+ const ::std::string& FieldMask::paths(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FieldMask.paths)
+  return paths_.Get(index);
+}
+ ::std::string* FieldMask::mutable_paths(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.FieldMask.paths)
+  return paths_.Mutable(index);
+}
+ void FieldMask::set_paths(int index, const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.FieldMask.paths)
+  paths_.Mutable(index)->assign(value);
+}
+ void FieldMask::set_paths(int index, const char* value) {
+  paths_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:google.protobuf.FieldMask.paths)
+}
+ void FieldMask::set_paths(int index, const char* value, size_t size) {
+  paths_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldMask.paths)
+}
+ ::std::string* FieldMask::add_paths() {
+  // @@protoc_insertion_point(field_add_mutable:google.protobuf.FieldMask.paths)
+  return paths_.Add();
+}
+ void FieldMask::add_paths(const ::std::string& value) {
+  paths_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.FieldMask.paths)
+}
+ void FieldMask::add_paths(const char* value) {
+  paths_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:google.protobuf.FieldMask.paths)
+}
+ void FieldMask::add_paths(const char* value, size_t size) {
+  paths_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:google.protobuf.FieldMask.paths)
+}
+ const ::google::protobuf::RepeatedPtrField< ::std::string>&
+FieldMask::paths() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.FieldMask.paths)
+  return paths_;
+}
+ ::google::protobuf::RepeatedPtrField< ::std::string>*
+FieldMask::mutable_paths() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.FieldMask.paths)
+  return &paths_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/field_mask.pb.h b/src/google/protobuf/field_mask.pb.h
index d57a449..f5e0b65 100644
--- a/src/google/protobuf/field_mask.pb.h
+++ b/src/google/protobuf/field_mask.pb.h
@@ -8,59 +8,40 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[1];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldMaskImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldMask();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsFieldMask();
-}
-}  // namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2ffield_5fmask_2eproto();
+
 class FieldMask;
-class FieldMaskDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FieldMaskDefaultTypeInternal _FieldMask_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT FieldMask : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldMask) */ {
+class LIBPROTOBUF_EXPORT FieldMask : public ::google::protobuf::Message {
  public:
   FieldMask();
   virtual ~FieldMask();
@@ -71,72 +52,46 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FieldMask(FieldMask&& from) noexcept
-    : FieldMask() {
-    *this = ::std::move(from);
-  }
 
-  inline FieldMask& operator=(FieldMask&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   static const ::google::protobuf::Descriptor* descriptor();
   static const FieldMask& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FieldMask* internal_default_instance() {
-    return reinterpret_cast<const FieldMask*>(
-               &_FieldMask_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   void Swap(FieldMask* other);
-  friend void swap(FieldMask& a, FieldMask& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FieldMask* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FieldMask* New() const { return New(NULL); }
 
-  FieldMask* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FieldMask* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FieldMask& from);
   void MergeFrom(const FieldMask& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FieldMask* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -149,16 +104,10 @@
   const ::std::string& paths(int index) const;
   ::std::string* mutable_paths(int index);
   void set_paths(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_paths(int index, ::std::string&& value);
-  #endif
   void set_paths(int index, const char* value);
   void set_paths(int index, const char* value, size_t size);
   ::std::string* add_paths();
   void add_paths(const ::std::string& value);
-  #if LANG_CXX11
-  void add_paths(::std::string&& value);
-  #endif
   void add_paths(const char* value);
   void add_paths(const char* value, size_t size);
   const ::google::protobuf::RepeatedPtrField< ::std::string>& paths() const;
@@ -168,20 +117,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  bool _is_default_instance_;
   ::google::protobuf::RepeatedPtrField< ::std::string> paths_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::InitDefaultsFieldMaskImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ffield_5fmask_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ffield_5fmask_2eproto();
+
+  void InitAsDefaultInstance();
+  static FieldMask* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // FieldMask
 
 // repeated string paths = 1;
@@ -203,14 +154,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.FieldMask.paths)
   paths_.Mutable(index)->assign(value);
 }
-#if LANG_CXX11
-inline void FieldMask::set_paths(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.FieldMask.paths)
-  paths_.Mutable(index)->assign(std::move(value));
-}
-#endif
 inline void FieldMask::set_paths(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   paths_.Mutable(index)->assign(value);
   // @@protoc_insertion_point(field_set_char:google.protobuf.FieldMask.paths)
 }
@@ -227,14 +171,7 @@
   paths_.Add()->assign(value);
   // @@protoc_insertion_point(field_add:google.protobuf.FieldMask.paths)
 }
-#if LANG_CXX11
-inline void FieldMask::add_paths(::std::string&& value) {
-  paths_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.FieldMask.paths)
-}
-#endif
 inline void FieldMask::add_paths(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   paths_.Add()->assign(value);
   // @@protoc_insertion_point(field_add_char:google.protobuf.FieldMask.paths)
 }
@@ -253,9 +190,7 @@
   return &paths_;
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/src/google/protobuf/field_mask.proto b/src/google/protobuf/field_mask.proto
index eb96ba0..6af6dbe 100644
--- a/src/google/protobuf/field_mask.proto
+++ b/src/google/protobuf/field_mask.proto
@@ -37,7 +37,7 @@
 option java_outer_classname = "FieldMaskProto";
 option java_multiple_files = true;
 option objc_class_prefix = "GPB";
-option go_package = "google.golang.org/genproto/protobuf/field_mask;field_mask";
+option java_generate_equals_and_hash = true;
 
 // `FieldMask` represents a set of symbolic field paths, for example:
 //
@@ -82,7 +82,7 @@
 //     }
 //
 // A repeated field is not allowed except at the last position of a
-// paths string.
+// field mask.
 //
 // If a FieldMask object is not present in a get operation, the
 // operation applies to all fields (as if a FieldMask of all fields
@@ -107,58 +107,6 @@
 // describe the updated values, the API ignores the values of all
 // fields not covered by the mask.
 //
-// If a repeated field is specified for an update operation, the existing
-// repeated values in the target resource will be overwritten by the new values.
-// Note that a repeated field is only allowed in the last position of a `paths`
-// string.
-//
-// If a sub-message is specified in the last position of the field mask for an
-// update operation, then the existing sub-message in the target resource is
-// overwritten. Given the target message:
-//
-//     f {
-//       b {
-//         d : 1
-//         x : 2
-//       }
-//       c : 1
-//     }
-//
-// And an update message:
-//
-//     f {
-//       b {
-//         d : 10
-//       }
-//     }
-//
-// then if the field mask is:
-//
-//  paths: "f.b"
-//
-// then the result will be:
-//
-//     f {
-//       b {
-//         d : 10
-//       }
-//       c : 1
-//     }
-//
-// However, if the update mask was:
-//
-//  paths: "f.b.d"
-//
-// then the result would be:
-//
-//     f {
-//       b {
-//         d : 10
-//         x : 2
-//       }
-//       c : 1
-//     }
-//
 // In order to reset a field's value to the default, the field must
 // be in the mask and set to the default value in the provided resource.
 // Hence, in order to reset all fields of a resource, provide a default
@@ -240,12 +188,6 @@
 //
 // Note that oneof type names ("test_oneof" in this case) cannot be used in
 // paths.
-//
-// ## Field Mask Verification
-//
-// The implementation of the all the API methods, which have any FieldMask type
-// field in the request, should verify the included field paths, and return
-// `INVALID_ARGUMENT` error if any path is duplicated or unmappable.
 message FieldMask {
   // The set of field mask paths.
   repeated string paths = 1;
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc
index f0f207e..2313181 100644
--- a/src/google/protobuf/generated_message_reflection.cc
+++ b/src/google/protobuf/generated_message_reflection.cc
@@ -44,7 +44,6 @@
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/map_field.h>
 #include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format.h>
 
 
 #define GOOGLE_PROTOBUF_HAS_ONEOF
@@ -73,28 +72,18 @@
   return (d == NULL ? GetEmptyString() : d->name());
 }
 
+namespace {
+inline bool SupportsArenas(const Descriptor* descriptor) {
+  return descriptor->file()->options().cc_enable_arenas();
+}
+}  // anonymous namespace
+
 // ===================================================================
 // Helpers for reporting usage errors (e.g. trying to use GetInt32() on
 // a string field).
 
 namespace {
 
-template <class To>
-To* GetPointerAtOffset(Message* message, uint32 offset) {
-  return reinterpret_cast<To*>(reinterpret_cast<char*>(message) + offset);
-}
-
-template <class To>
-const To* GetConstPointerAtOffset(const Message* message, uint32 offset) {
-  return reinterpret_cast<const To*>(reinterpret_cast<const char*>(message) +
-                                     offset);
-}
-
-template <class To>
-const To& GetConstRefAtOffset(const Message& message, uint32 offset) {
-  return *GetConstPointerAtOffset<To>(&message, offset);
-}
-
 void ReportReflectionUsageError(
     const Descriptor* descriptor, const FieldDescriptor* field,
     const char* method, const char* description) {
@@ -184,56 +173,129 @@
 // ===================================================================
 
 GeneratedMessageReflection::GeneratedMessageReflection(
-    const Descriptor* descriptor, const ReflectionSchema& schema,
-    const DescriptorPool* pool, MessageFactory* factory)
-    : descriptor_(descriptor),
-      schema_(schema),
-      descriptor_pool_((pool == NULL) ? DescriptorPool::generated_pool()
-                                      : pool),
-      message_factory_(factory),
-      last_non_weak_field_index_(-1) {
-  last_non_weak_field_index_ = descriptor_->field_count() - 1;
+    const Descriptor* descriptor,
+    const Message* default_instance,
+    const int offsets[],
+    int has_bits_offset,
+    int unknown_fields_offset,
+    int extensions_offset,
+    const DescriptorPool* descriptor_pool,
+    MessageFactory* factory,
+    int object_size,
+    int arena_offset,
+    int is_default_instance_offset)
+  : descriptor_       (descriptor),
+    default_instance_ (default_instance),
+    offsets_          (offsets),
+    has_bits_offset_  (has_bits_offset),
+    unknown_fields_offset_(unknown_fields_offset),
+    extensions_offset_(extensions_offset),
+    arena_offset_     (arena_offset),
+    is_default_instance_offset_(is_default_instance_offset),
+    object_size_      (object_size),
+    descriptor_pool_  ((descriptor_pool == NULL) ?
+                         DescriptorPool::generated_pool() :
+                         descriptor_pool),
+    message_factory_  (factory) {
+}
+
+GeneratedMessageReflection::GeneratedMessageReflection(
+    const Descriptor* descriptor,
+    const Message* default_instance,
+    const int offsets[],
+    int has_bits_offset,
+    int unknown_fields_offset,
+    int extensions_offset,
+    const void* default_oneof_instance,
+    int oneof_case_offset,
+    const DescriptorPool* descriptor_pool,
+    MessageFactory* factory,
+    int object_size,
+    int arena_offset,
+    int is_default_instance_offset)
+  : descriptor_       (descriptor),
+    default_instance_ (default_instance),
+    default_oneof_instance_ (default_oneof_instance),
+    offsets_          (offsets),
+    has_bits_offset_  (has_bits_offset),
+    oneof_case_offset_(oneof_case_offset),
+    unknown_fields_offset_(unknown_fields_offset),
+    extensions_offset_(extensions_offset),
+    arena_offset_     (arena_offset),
+    is_default_instance_offset_(is_default_instance_offset),
+    object_size_      (object_size),
+    descriptor_pool_  ((descriptor_pool == NULL) ?
+                         DescriptorPool::generated_pool() :
+                         descriptor_pool),
+    message_factory_  (factory) {
 }
 
 GeneratedMessageReflection::~GeneratedMessageReflection() {}
 
+namespace {
+UnknownFieldSet* empty_unknown_field_set_ = NULL;
+GOOGLE_PROTOBUF_DECLARE_ONCE(empty_unknown_field_set_once_);
+
+void DeleteEmptyUnknownFieldSet() {
+  delete empty_unknown_field_set_;
+  empty_unknown_field_set_ = NULL;
+}
+
+void InitEmptyUnknownFieldSet() {
+  empty_unknown_field_set_ = new UnknownFieldSet;
+  internal::OnShutdown(&DeleteEmptyUnknownFieldSet);
+}
+
+const UnknownFieldSet& GetEmptyUnknownFieldSet() {
+  ::google::protobuf::GoogleOnceInit(&empty_unknown_field_set_once_, &InitEmptyUnknownFieldSet);
+  return *empty_unknown_field_set_;
+}
+}  // namespace
+
 const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields(
     const Message& message) const {
-  if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
-      !GetProto3PreserveUnknownsDefault()) {
-    // We have to ensure that any mutations made to the return value of
-    // MutableUnknownFields() are not reflected here when Proto3 defaults to
-    // discard unknowns.
-    return *UnknownFieldSet::default_instance();
-  } else {
+  if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) {
+    return GetEmptyUnknownFieldSet();
+  }
+  if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) {
     return GetInternalMetadataWithArena(message).unknown_fields();
   }
+  const void* ptr = reinterpret_cast<const uint8*>(&message) +
+                    unknown_fields_offset_;
+  return *reinterpret_cast<const UnknownFieldSet*>(ptr);
 }
 
 UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields(
     Message* message) const {
-  return MutableInternalMetadataWithArena(message)->mutable_unknown_fields();
+  if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) {
+    return MutableInternalMetadataWithArena(message)->
+        mutable_unknown_fields();
+  }
+  void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_;
+  return reinterpret_cast<UnknownFieldSet*>(ptr);
 }
 
-size_t GeneratedMessageReflection::SpaceUsedLong(const Message& message) const {
+int GeneratedMessageReflection::SpaceUsed(const Message& message) const {
   // object_size_ already includes the in-memory representation of each field
   // in the message, so we only need to account for additional memory used by
   // the fields.
-  size_t total_size = schema_.GetObjectSize();
+  int total_size = object_size_;
 
-  total_size += GetUnknownFields(message).SpaceUsedExcludingSelfLong();
+  total_size += GetUnknownFields(message).SpaceUsedExcludingSelf();
 
-  if (schema_.HasExtensionSet()) {
-    total_size += GetExtensionSet(message).SpaceUsedExcludingSelfLong();
+  if (extensions_offset_ != -1) {
+    total_size += GetExtensionSet(message).SpaceUsedExcludingSelf();
   }
-  for (int i = 0; i <= last_non_weak_field_index_; i++) {
+
+  for (int i = 0; i < descriptor_->field_count(); i++) {
     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();                      \
+                          .SpaceUsedExcludingSelf();                          \
           break
 
         HANDLE_TYPE( INT32,  int32);
@@ -251,21 +313,21 @@
             default:  // TODO(kenton):  Support other string reps.
             case FieldOptions::STRING:
               total_size += GetRaw<RepeatedPtrField<string> >(message, field)
-                                .SpaceUsedExcludingSelfLong();
+                              .SpaceUsedExcludingSelf();
               break;
           }
           break;
 
         case FieldDescriptor::CPPTYPE_MESSAGE:
           if (IsMapFieldInApi(field)) {
-            total_size += GetRaw<MapFieldBase>(message, field)
-                              .SpaceUsedExcludingSelfLong();
+            total_size +=
+                GetRaw<MapFieldBase>(message, field).SpaceUsedExcludingSelf();
           } else {
             // We don't know which subclass of RepeatedPtrFieldBase the type is,
             // so we use RepeatedPtrFieldBase directly.
             total_size +=
                 GetRaw<RepeatedPtrFieldBase>(message, field)
-                    .SpaceUsedExcludingSelfLong<GenericTypeHandler<Message> >();
+                  .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
           }
 
           break;
@@ -294,15 +356,14 @@
               // the prototype. Only count the string if it has been changed
               // from the default value.
               const string* default_ptr =
-                  &DefaultRaw<ArenaStringPtr>(field).Get();
+                  &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
               const string* ptr =
-                  &GetField<ArenaStringPtr>(message, field).Get();
+                  &GetField<ArenaStringPtr>(message, field).Get(default_ptr);
 
               if (ptr != default_ptr) {
                 // string fields are represented by just a pointer, so also
                 // include sizeof(string) as well.
-                total_size +=
-                    sizeof(*ptr) + StringSpaceUsedExcludingSelfLong(*ptr);
+                total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr);
               }
               break;
             }
@@ -311,19 +372,20 @@
         }
 
         case FieldDescriptor::CPPTYPE_MESSAGE:
-          if (schema_.IsDefaultInstance(message)) {
+          if (&message == default_instance_) {
             // For singular fields, the prototype just stores a pointer to the
             // external type's prototype, so there is no extra memory usage.
           } else {
             const Message* sub_message = GetRaw<const Message*>(message, field);
             if (sub_message != NULL) {
-              total_size += sub_message->SpaceUsedLong();
+              total_size += sub_message->SpaceUsed();
             }
           }
           break;
       }
     }
   }
+
   return total_size;
 }
 
@@ -432,9 +494,9 @@
                 string1->Swap(string2);
               } else {
                 const string* default_ptr =
-                    &DefaultRaw<ArenaStringPtr>(field).Get();
-                const string temp = string1->Get();
-                string1->Set(default_ptr, string2->Get(), arena1);
+                    &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
+                const string temp = string1->Get(default_ptr);
+                string1->Set(default_ptr, string2->Get(default_ptr), arena1);
                 string2->Set(default_ptr, temp, arena2);
               }
             }
@@ -595,46 +657,37 @@
     // Slow copy path.
     // Use our arena as temp space, if available.
     Message* temp = message1->New(GetArena(message1));
-    temp->MergeFrom(*message2);
-    message2->CopyFrom(*message1);
-    Swap(message1, temp);
+    temp->MergeFrom(*message1);
+    message1->CopyFrom(*message2);
+    message2->CopyFrom(*temp);
     if (GetArena(message1) == NULL) {
       delete temp;
     }
     return;
   }
 
-  if (schema_.HasHasbits()) {
+  if (has_bits_offset_ != -1) {
     uint32* has_bits1 = MutableHasBits(message1);
     uint32* has_bits2 = MutableHasBits(message2);
-
-    int fields_with_has_bits = 0;
-    for (int i = 0; i < descriptor_->field_count(); i++) {
-      const FieldDescriptor* field = descriptor_->field(i);
-      if (field->is_repeated() || field->containing_oneof()) {
-        continue;
-      }
-      fields_with_has_bits++;
-    }
-
-    int has_bits_size = (fields_with_has_bits + 31) / 32;
+    int has_bits_size = (descriptor_->field_count() + 31) / 32;
 
     for (int i = 0; i < has_bits_size; i++) {
       std::swap(has_bits1[i], has_bits2[i]);
     }
   }
 
-  for (int i = 0; i <= last_non_weak_field_index_; i++) {
+  for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
-    if (field->containing_oneof()) continue;
-    SwapField(message1, message2, field);
+    if (!field->containing_oneof()) {
+      SwapField(message1, message2, field);
+    }
   }
-  const int oneof_decl_count = descriptor_->oneof_decl_count();
-  for (int i = 0; i < oneof_decl_count; i++) {
+
+  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     SwapOneofField(message1, message2, descriptor_->oneof_decl(i));
   }
 
-  if (schema_.HasExtensionSet()) {
+  if (extensions_offset_ != -1) {
     MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
   }
 
@@ -644,7 +697,7 @@
 void GeneratedMessageReflection::SwapFields(
     Message* message1,
     Message* message2,
-    const std::vector<const FieldDescriptor*>& fields) const {
+    const vector<const FieldDescriptor*>& fields) const {
   if (message1 == message2) return;
 
   // TODO(kenton):  Other Reflection methods should probably check this too.
@@ -665,8 +718,7 @@
 
   std::set<int> swapped_oneof;
 
-  const int fields_size = static_cast<int>(fields.size());
-  for (int i = 0; i < fields_size; i++) {
+  for (int i = 0; i < fields.size(); i++) {
     const FieldDescriptor* field = fields[i];
     if (field->is_extension()) {
       MutableExtensionSet(message1)->SwapExtension(
@@ -682,11 +734,8 @@
         swapped_oneof.insert(oneof_index);
         SwapOneofField(message1, message2, field->containing_oneof());
       } else {
-        // Swap has bit for non-repeated fields.  We have already checked for
-        // oneof already.
-        if (!field->is_repeated()) {
-          SwapBit(message1, message2, field);
-        }
+        // Swap has bit.
+        SwapBit(message1, message2, field);
         // Swap field.
         SwapField(message1, message2, field);
       }
@@ -760,6 +809,7 @@
       ClearOneofField(message, field);
       return;
     }
+
     if (HasBit(*message, field)) {
       ClearBit(message, field);
 
@@ -790,9 +840,9 @@
             default:  // TODO(kenton):  Support other string reps.
             case FieldOptions::STRING: {
               const string* default_ptr =
-                  &DefaultRaw<ArenaStringPtr>(field).Get();
-              MutableRaw<ArenaStringPtr>(message, field)->SetAllocated(
-                  default_ptr, NULL, GetArena(message));
+                  &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
+              MutableRaw<ArenaStringPtr>(message, field)->Destroy(default_ptr,
+                  GetArena(message));
               break;
             }
           }
@@ -800,7 +850,7 @@
         }
 
         case FieldDescriptor::CPPTYPE_MESSAGE:
-          if (!schema_.HasHasbits()) {
+          if (has_bits_offset_ == -1) {
             // Proto3 does not have has-bits and we need to set a message field
             // to NULL in order to indicate its un-presence.
             if (GetArena(message) == NULL) {
@@ -976,58 +1026,35 @@
     return left->number() < right->number();
   }
 };
-
-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;
-}
 }  // namespace
 
 void GeneratedMessageReflection::ListFields(
     const Message& message,
-    std::vector<const FieldDescriptor*>* output) const {
+    vector<const FieldDescriptor*>* output) const {
   output->clear();
 
   // Optimization:  The default instance never has any fields set.
-  if (schema_.IsDefaultInstance(message)) return;
+  if (&message == default_instance_) return;
 
-  // Optimization: Avoid calling GetHasBits() and HasOneofField() many times
-  // within the field loop.  We allow this violation of ReflectionSchema
-  // encapsulation because this function takes a noticable about of CPU
-  // fleetwide and properly allowing this optimization through public interfaces
-  // seems more trouble than it is worth.
-  const uint32* const has_bits =
-      schema_.HasHasbits() ? GetHasBits(message) : NULL;
-  const uint32* const has_bits_indices = schema_.has_bit_indices_;
-  const uint32* const oneof_case_array =
-      GetConstPointerAtOffset<uint32>(&message, schema_.oneof_case_offset_);
   output->reserve(descriptor_->field_count());
-  for (int i = 0; i <= last_non_weak_field_index_; i++) {
+  for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
     if (field->is_repeated()) {
       if (FieldSize(message, field) > 0) {
         output->push_back(field);
       }
     } else {
-      const OneofDescriptor* containing_oneof = field->containing_oneof();
-      if (containing_oneof) {
-        // Equivalent to: HasOneofField(message, field)
-        if (oneof_case_array[containing_oneof->index()] == field->number()) {
+      if (field->containing_oneof()) {
+        if (HasOneofField(message, field)) {
           output->push_back(field);
         }
-      } else if (has_bits) {
-        // Equivalent to: HasBit(message, field)
-        if (IsIndexInHasBitSet(has_bits, has_bits_indices[i])) {
-          output->push_back(field);
-        }
-      } else if (HasBit(message, field)) {  // Fall back on proto3-style HasBit.
+      } else if (HasBit(message, field)) {
         output->push_back(field);
       }
     }
   }
-  if (schema_.HasExtensionSet()) {
+
+  if (extensions_offset_ != -1) {
     GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_,
                                           output);
   }
@@ -1121,7 +1148,9 @@
     switch (field->options().ctype()) {
       default:  // TODO(kenton):  Support other string reps.
       case FieldOptions::STRING: {
-        return GetField<ArenaStringPtr>(message, field).Get();
+        const string* default_ptr =
+            &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
+        return GetField<ArenaStringPtr>(message, field).Get(default_ptr);
       }
     }
 
@@ -1141,7 +1170,9 @@
     switch (field->options().ctype()) {
       default:  // TODO(kenton):  Support other string reps.
       case FieldOptions::STRING: {
-        return GetField<ArenaStringPtr>(message, field).Get();
+        const string* default_ptr =
+            &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
+        return GetField<ArenaStringPtr>(message, field).Get(default_ptr);
       }
     }
 
@@ -1162,7 +1193,8 @@
     switch (field->options().ctype()) {
       default:  // TODO(kenton):  Support other string reps.
       case FieldOptions::STRING: {
-        const string* default_ptr = &DefaultRaw<ArenaStringPtr>(field).Get();
+        const string* default_ptr =
+            &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
         if (field->containing_oneof() && !HasOneofField(*message, field)) {
           ClearOneof(message, field->containing_oneof());
           MutableField<ArenaStringPtr>(message, field)->UnsafeSetDefault(
@@ -1432,7 +1464,8 @@
         GetExtensionSet(message).GetMessage(
           field->number(), field->message_type(), factory));
   } else {
-    const Message* result = GetRaw<const Message*>(message, field);
+    const Message* result;
+    result = GetRaw<const Message*>(message, field);
     if (result == NULL) {
       result = DefaultRaw<const Message*>(field);
     }
@@ -1452,7 +1485,6 @@
         MutableExtensionSet(message)->MutableMessage(field, factory));
   } else {
     Message* result;
-
     Message** result_holder = MutableRaw<Message*>(message, field);
 
     if (field->containing_oneof()) {
@@ -1482,7 +1514,7 @@
   USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE);
 
   if (field->is_extension()) {
-    MutableExtensionSet(message)->UnsafeArenaSetAllocatedMessage(
+    MutableExtensionSet(message)->SetAllocatedMessage(
         field->number(), field->type(), field, sub_message);
   } else {
     if (field->containing_oneof()) {
@@ -1547,12 +1579,9 @@
 
   if (field->is_extension()) {
     return static_cast<Message*>(
-        MutableExtensionSet(message)->UnsafeArenaReleaseMessage(field,
-                                                                factory));
+        MutableExtensionSet(message)->ReleaseMessage(field, factory));
   } else {
-    if (!(field->is_repeated() || field->containing_oneof())) {
-      ClearBit(message, field);
-    }
+    ClearBit(message, field);
     if (field->containing_oneof()) {
       if (HasOneofField(*message, field)) {
         *MutableOneofCase(message, field->containing_oneof()) = 0;
@@ -1698,10 +1727,11 @@
   } else {
     // Trigger transform for MapField
     if (IsMapFieldInApi(field)) {
-      return MutableRawNonOneof<MapFieldBase>(message, field)
+      return reinterpret_cast<MapFieldBase*>(reinterpret_cast<uint8*>(message) +
+                                             offsets_[field->index()])
           ->MutableRepeatedField();
     }
-    return MutableRawNonOneof<void>(message, field);
+    return reinterpret_cast<uint8*>(message) + offsets_[field->index()];
   }
 }
 
@@ -1728,9 +1758,11 @@
   } else {
     // Trigger transform for MapField
     if (IsMapFieldInApi(field)) {
-      return &(GetRawNonOneof<MapFieldBase>(message, field).GetRepeatedField());
+      return &(reinterpret_cast<const MapFieldBase*>(
+          reinterpret_cast<const uint8*>(&message) +
+          offsets_[field->index()])->GetRepeatedField());
     }
-    return &GetRawNonOneof<char>(message, field);
+    return reinterpret_cast<const uint8*>(&message) + offsets_[field->index()];
   }
 }
 
@@ -1812,7 +1844,7 @@
 
 const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName(
     const string& name) const {
-  if (!schema_.HasExtensionSet()) return NULL;
+  if (extensions_offset_ == -1) return NULL;
 
   const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name);
   if (result != NULL && result->containing_type() == descriptor_) {
@@ -1824,8 +1856,7 @@
     const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name);
     if (type != NULL) {
       // Look for a matching extension in the foreign type's scope.
-      const int type_extension_count = type->extension_count();
-      for (int i = 0; i < type_extension_count; i++) {
+      for (int i = 0; i < type->extension_count(); i++) {
         const FieldDescriptor* extension = type->extension(i);
         if (extension->containing_type() == descriptor_ &&
             extension->type() == FieldDescriptor::TYPE_MESSAGE &&
@@ -1843,7 +1874,7 @@
 
 const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber(
     int number) const {
-  if (!schema_.HasExtensionSet()) return NULL;
+  if (extensions_offset_ == -1) return NULL;
   return descriptor_pool_->FindExtensionByNumber(descriptor_, number);
 }
 
@@ -1856,180 +1887,204 @@
 
 // These simple template accessors obtain pointers (or references) to
 // the given field.
-
-template <class Type>
-const Type& GeneratedMessageReflection::GetRawNonOneof(
-    const Message& message, const FieldDescriptor* field) const {
-  return GetConstRefAtOffset<Type>(message,
-                                   schema_.GetFieldOffsetNonOneof(field));
-}
-
-template <class Type>
-Type* GeneratedMessageReflection::MutableRawNonOneof(
-    Message* message, const FieldDescriptor* field) const {
-  return GetPointerAtOffset<Type>(message,
-                                  schema_.GetFieldOffsetNonOneof(field));
-}
-
 template <typename Type>
-const Type& GeneratedMessageReflection::GetRaw(
+inline const Type& GeneratedMessageReflection::GetRaw(
     const Message& message, const FieldDescriptor* field) const {
   if (field->containing_oneof() && !HasOneofField(message, field)) {
     return DefaultRaw<Type>(field);
   }
-  return GetConstRefAtOffset<Type>(message, schema_.GetFieldOffset(field));
+  int index = field->containing_oneof() ?
+      descriptor_->field_count() + field->containing_oneof()->index() :
+      field->index();
+  const void* ptr = reinterpret_cast<const uint8*>(&message) +
+      offsets_[index];
+  return *reinterpret_cast<const Type*>(ptr);
 }
 
 template <typename Type>
-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());
-  return &GetConstRefAtOffset<uint32>(message, schema_.HasBitsOffset());
-}
-
-inline uint32* GeneratedMessageReflection::MutableHasBits(
-    Message* message) const {
-  GOOGLE_DCHECK(schema_.HasHasbits());
-  return GetPointerAtOffset<uint32>(message, schema_.HasBitsOffset());
-}
-
-inline uint32 GeneratedMessageReflection::GetOneofCase(
-    const Message& message, const OneofDescriptor* oneof_descriptor) const {
-  return GetConstRefAtOffset<uint32>(
-      message, schema_.GetOneofCaseOffset(oneof_descriptor));
-}
-
-inline uint32* GeneratedMessageReflection::MutableOneofCase(
-    Message* message, const OneofDescriptor* oneof_descriptor) const {
-  return GetPointerAtOffset<uint32>(
-      message, schema_.GetOneofCaseOffset(oneof_descriptor));
-}
-
-inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(
-    const Message& message) const {
-  return GetConstRefAtOffset<ExtensionSet>(message,
-                                           schema_.GetExtensionSetOffset());
-}
-
-inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet(
-    Message* message) const {
-  return GetPointerAtOffset<ExtensionSet>(message,
-                                          schema_.GetExtensionSetOffset());
-}
-
-inline Arena* GeneratedMessageReflection::GetArena(Message* message) const {
-  return GetInternalMetadataWithArena(*message).arena();
-}
-
-inline const InternalMetadataWithArena&
-GeneratedMessageReflection::GetInternalMetadataWithArena(
-    const Message& message) const {
-  return GetConstRefAtOffset<InternalMetadataWithArena>(
-      message, schema_.GetMetadataOffset());
-}
-
-inline InternalMetadataWithArena*
-GeneratedMessageReflection::MutableInternalMetadataWithArena(
-    Message* message) const {
-  return GetPointerAtOffset<InternalMetadataWithArena>(
-      message, schema_.GetMetadataOffset());
+inline Type* GeneratedMessageReflection::MutableRaw(
+    Message* message, const FieldDescriptor* field) const {
+  int index = field->containing_oneof() ?
+      descriptor_->field_count() + field->containing_oneof()->index() :
+      field->index();
+  void* ptr = reinterpret_cast<uint8*>(message) + offsets_[index];
+  return reinterpret_cast<Type*>(ptr);
 }
 
 template <typename Type>
 inline const Type& GeneratedMessageReflection::DefaultRaw(
     const FieldDescriptor* field) const {
-  return *reinterpret_cast<const Type*>(schema_.GetFieldDefault(field));
+  const void* ptr = field->containing_oneof() ?
+      reinterpret_cast<const uint8*>(default_oneof_instance_) +
+      offsets_[field->index()] :
+      reinterpret_cast<const uint8*>(default_instance_) +
+      offsets_[field->index()];
+  return *reinterpret_cast<const Type*>(ptr);
+}
+
+inline const uint32* GeneratedMessageReflection::GetHasBits(
+    const Message& message) const {
+  if (has_bits_offset_ == -1) {  // proto3 with no has-bits.
+    return NULL;
+  }
+  const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_;
+  return reinterpret_cast<const uint32*>(ptr);
+}
+inline uint32* GeneratedMessageReflection::MutableHasBits(
+    Message* message) const {
+  if (has_bits_offset_ == -1) {
+    return NULL;
+  }
+  void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_;
+  return reinterpret_cast<uint32*>(ptr);
+}
+
+inline uint32 GeneratedMessageReflection::GetOneofCase(
+    const Message& message,
+    const OneofDescriptor* oneof_descriptor) const {
+  const void* ptr = reinterpret_cast<const uint8*>(&message)
+      + oneof_case_offset_;
+  return reinterpret_cast<const uint32*>(ptr)[oneof_descriptor->index()];
+}
+
+inline uint32* GeneratedMessageReflection::MutableOneofCase(
+    Message* message,
+    const OneofDescriptor* oneof_descriptor) const {
+  void* ptr = reinterpret_cast<uint8*>(message) + oneof_case_offset_;
+  return &(reinterpret_cast<uint32*>(ptr)[oneof_descriptor->index()]);
+}
+
+inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(
+    const Message& message) const {
+  GOOGLE_DCHECK_NE(extensions_offset_, -1);
+  const void* ptr = reinterpret_cast<const uint8*>(&message) +
+                    extensions_offset_;
+  return *reinterpret_cast<const ExtensionSet*>(ptr);
+}
+inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet(
+    Message* message) const {
+  GOOGLE_DCHECK_NE(extensions_offset_, -1);
+  void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_;
+  return reinterpret_cast<ExtensionSet*>(ptr);
+}
+
+inline Arena* GeneratedMessageReflection::GetArena(Message* message) const {
+  if (arena_offset_ == kNoArenaPointer) {
+    return NULL;
+  }
+
+  if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) {
+    // zero-overhead arena pointer overloading UnknownFields
+    return GetInternalMetadataWithArena(*message).arena();
+  }
+
+  // Baseline case: message class has a dedicated arena pointer.
+  void* ptr = reinterpret_cast<uint8*>(message) + arena_offset_;
+  return *reinterpret_cast<Arena**>(ptr);
+}
+
+inline const InternalMetadataWithArena&
+GeneratedMessageReflection::GetInternalMetadataWithArena(
+    const Message& message) const {
+  const void* ptr = reinterpret_cast<const uint8*>(&message) + arena_offset_;
+  return *reinterpret_cast<const InternalMetadataWithArena*>(ptr);
+}
+
+inline InternalMetadataWithArena*
+GeneratedMessageReflection::MutableInternalMetadataWithArena(
+    Message* message) const {
+  void* ptr = reinterpret_cast<uint8*>(message) + arena_offset_;
+  return reinterpret_cast<InternalMetadataWithArena*>(ptr);
+}
+
+inline bool
+GeneratedMessageReflection::GetIsDefaultInstance(
+    const Message& message) const {
+  if (is_default_instance_offset_ == kHasNoDefaultInstanceField) {
+    return false;
+  }
+  const void* ptr = reinterpret_cast<const uint8*>(&message) +
+      is_default_instance_offset_;
+  return *reinterpret_cast<const bool*>(ptr);
 }
 
 // Simple accessors for manipulating has_bits_.
 inline bool GeneratedMessageReflection::HasBit(
     const Message& message, const FieldDescriptor* field) const {
-  GOOGLE_DCHECK(!field->options().weak());
-  if (schema_.HasHasbits()) {
-    return IsIndexInHasBitSet(GetHasBits(message), schema_.HasBitIndex(field));
-  }
+  if (has_bits_offset_ == -1) {
+    // proto3: no has-bits. All fields present except messages, which are
+    // present only if their message-field pointer is non-NULL.
+    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+      return !GetIsDefaultInstance(message) &&
+          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
+      // field must be a scalar.
 
-  // proto3: no has-bits. All fields present except messages, which are
-  // 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;
-  } else {
-    // Non-message field (and non-oneof, since that was handled in HasField()
-    // before calling us), and singular (again, checked in HasField). So, this
-    // field must be a scalar.
-
-    // Scalar primitive (numeric or string/bytes) fields are present if
-    // their value is non-zero (numeric) or non-empty (string/bytes).  N.B.:
-    // we must use this definition here, rather than the "scalar fields
-    // always present" in the proto3 docs, because MergeFrom() semantics
-    // require presence as "present on wire", and reflection-based merge
-    // (which uses HasField()) needs to be consistent with this.
-    switch (field->cpp_type()) {
-      case FieldDescriptor::CPPTYPE_STRING:
-        switch (field->options().ctype()) {
-          default: {
-            return GetField<ArenaStringPtr>(message, field).Get().size() > 0;
+      // Scalar primitive (numeric or string/bytes) fields are present if
+      // their value is non-zero (numeric) or non-empty (string/bytes).  N.B.:
+      // we must use this definition here, rather than the "scalar fields
+      // always present" in the proto3 docs, because MergeFrom() semantics
+      // require presence as "present on wire", and reflection-based merge
+      // (which uses HasField()) needs to be consistent with this.
+      switch (field->cpp_type()) {
+        case FieldDescriptor::CPPTYPE_STRING:
+          switch (field->options().ctype()) {
+            default: {
+              const string* default_ptr =
+                  &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
+              return GetField<ArenaStringPtr>(message, field).Get(
+                  default_ptr).size() > 0;
+            }
           }
-        }
-        return false;
-      case FieldDescriptor::CPPTYPE_BOOL:
-        return GetRaw<bool>(message, field) != false;
-      case FieldDescriptor::CPPTYPE_INT32:
-        return GetRaw<int32>(message, field) != 0;
-      case FieldDescriptor::CPPTYPE_INT64:
-        return GetRaw<int64>(message, field) != 0;
-      case FieldDescriptor::CPPTYPE_UINT32:
-        return GetRaw<uint32>(message, field) != 0;
-      case FieldDescriptor::CPPTYPE_UINT64:
-        return GetRaw<uint64>(message, field) != 0;
-      case FieldDescriptor::CPPTYPE_FLOAT:
-        return GetRaw<float>(message, field) != 0.0;
-      case FieldDescriptor::CPPTYPE_DOUBLE:
-        return GetRaw<double>(message, field) != 0.0;
-      case FieldDescriptor::CPPTYPE_ENUM:
-        return GetRaw<int>(message, field) != 0;
-      case FieldDescriptor::CPPTYPE_MESSAGE:
-        // handled above; avoid warning
-        break;
+          return false;
+        case FieldDescriptor::CPPTYPE_BOOL:
+          return GetRaw<bool>(message, field) != false;
+        case FieldDescriptor::CPPTYPE_INT32:
+          return GetRaw<int32>(message, field) != 0;
+        case FieldDescriptor::CPPTYPE_INT64:
+          return GetRaw<int64>(message, field) != 0;
+        case FieldDescriptor::CPPTYPE_UINT32:
+          return GetRaw<uint32>(message, field) != 0;
+        case FieldDescriptor::CPPTYPE_UINT64:
+          return GetRaw<uint64>(message, field) != 0;
+        case FieldDescriptor::CPPTYPE_FLOAT:
+          return GetRaw<float>(message, field) != 0.0;
+        case FieldDescriptor::CPPTYPE_DOUBLE:
+          return GetRaw<double>(message, field) != 0.0;
+        case FieldDescriptor::CPPTYPE_ENUM:
+          return GetRaw<int>(message, field) != 0;
+        case FieldDescriptor::CPPTYPE_MESSAGE:
+          // handled above; avoid warning
+          GOOGLE_LOG(FATAL) << "Reached impossible case in HasBit().";
+          break;
+      }
     }
-    GOOGLE_LOG(FATAL) << "Reached impossible case in HasBit().";
-    return false;
   }
+  return GetHasBits(message)[field->index() / 32] &
+    (1 << (field->index() % 32));
 }
 
 inline void GeneratedMessageReflection::SetBit(
     Message* message, const FieldDescriptor* field) const {
-  GOOGLE_DCHECK(!field->options().weak());
-  if (!schema_.HasHasbits()) {
+  if (has_bits_offset_ == -1) {
     return;
   }
-  const uint32 index = schema_.HasBitIndex(field);
-  MutableHasBits(message)[index / 32] |=
-      (static_cast<uint32>(1) << (index % 32));
+  MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32));
 }
 
 inline void GeneratedMessageReflection::ClearBit(
     Message* message, const FieldDescriptor* field) const {
-  GOOGLE_DCHECK(!field->options().weak());
-  if (!schema_.HasHasbits()) {
+  if (has_bits_offset_ == -1) {
     return;
   }
-  const uint32 index = schema_.HasBitIndex(field);
-  MutableHasBits(message)[index / 32] &=
-      ~(static_cast<uint32>(1) << (index % 32));
+  MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));
 }
 
 inline void GeneratedMessageReflection::SwapBit(
     Message* message1, Message* message2, const FieldDescriptor* field) const {
-  GOOGLE_DCHECK(!field->options().weak());
-  if (!schema_.HasHasbits()) {
+  if (has_bits_offset_ == -1) {
     return;
   }
   bool temp_has_bit = HasBit(*message1, field);
@@ -2070,7 +2125,7 @@
 inline void GeneratedMessageReflection::ClearOneof(
     Message* message, const OneofDescriptor* oneof_descriptor) const {
   // TODO(jieluo): Consider to cache the unused object instead of deleting
-  // it. It will be much faster if an application switches a lot from
+  // it. It will be much faster if an aplication switches a lot from
   // a few oneof fields.  Time/space tradeoff
   uint32 oneof_case = GetOneofCase(*message, oneof_descriptor);
   if (oneof_case > 0) {
@@ -2082,7 +2137,7 @@
             default:  // TODO(kenton):  Support other string reps.
             case FieldOptions::STRING: {
               const string* default_ptr =
-                  &DefaultRaw<ArenaStringPtr>(field).Get();
+                  &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
               MutableField<ArenaStringPtr>(message, field)->
                   Destroy(default_ptr, GetArena(message));
               break;
@@ -2194,7 +2249,7 @@
     return MutableExtensionSet(message)->MutableRawRepeatedField(
         field->number(), field->type(), field->is_packed(), field);
   } else {
-    return MutableRawNonOneof<char>(message, field);
+    return reinterpret_cast<uint8*>(message) + offsets_[field->index()];
   }
 }
 
@@ -2206,178 +2261,56 @@
   return MutableRaw<MapFieldBase>(message, field);
 }
 
-namespace {
-
-// Helper function to transform migration schema into reflection schema.
-ReflectionSchema MigrationToReflectionSchema(
-    const Message* const* default_instance, const uint32* offsets,
-    MigrationSchema migration_schema) {
-  ReflectionSchema result;
-  result.default_instance_ = *default_instance;
-  // First 6 offsets are offsets to the special fields. The following offsets
-  // are the proto fields.
-  result.offsets_ = offsets + migration_schema.offsets_index + 5;
-  result.has_bit_indices_ = offsets + migration_schema.has_bit_indices_index;
-  result.has_bits_offset_ = offsets[migration_schema.offsets_index + 0];
-  result.metadata_offset_ = offsets[migration_schema.offsets_index + 1];
-  result.extensions_offset_ = offsets[migration_schema.offsets_index + 2];
-  result.oneof_case_offset_ = offsets[migration_schema.offsets_index + 3];
-  result.object_size_ = migration_schema.object_size;
-  result.weak_field_map_offset_ = offsets[migration_schema.offsets_index + 4];
-  return result;
+GeneratedMessageReflection*
+GeneratedMessageReflection::NewGeneratedMessageReflection(
+    const Descriptor* descriptor,
+    const Message* default_instance,
+    const int offsets[],
+    int has_bits_offset,
+    int unknown_fields_offset,
+    int extensions_offset,
+    const void* default_oneof_instance,
+    int oneof_case_offset,
+    int object_size,
+    int arena_offset,
+    int is_default_instance_offset) {
+  return new GeneratedMessageReflection(descriptor,
+                                        default_instance,
+                                        offsets,
+                                        has_bits_offset,
+                                        unknown_fields_offset,
+                                        extensions_offset,
+                                        default_oneof_instance,
+                                        oneof_case_offset,
+                                        DescriptorPool::generated_pool(),
+                                        MessageFactory::generated_factory(),
+                                        object_size,
+                                        arena_offset,
+                                        is_default_instance_offset);
 }
 
-template<typename Schema>
-class AssignDescriptorsHelper {
- public:
-  AssignDescriptorsHelper(MessageFactory* factory,
-                          Metadata* file_level_metadata,
-                          const EnumDescriptor** file_level_enum_descriptors,
-                          const Schema* schemas,
-                          const Message* const* default_instance_data,
-                          const uint32* offsets)
-      : factory_(factory),
-        file_level_metadata_(file_level_metadata),
-        file_level_enum_descriptors_(file_level_enum_descriptors),
-        schemas_(schemas),
-        default_instance_data_(default_instance_data),
-        offsets_(offsets) {}
-
-  void AssignMessageDescriptor(const Descriptor* descriptor) {
-    for (int i = 0; i < descriptor->nested_type_count(); i++) {
-      AssignMessageDescriptor(descriptor->nested_type(i));
-    }
-
-    file_level_metadata_->descriptor = descriptor;
-
-    file_level_metadata_->reflection = new GeneratedMessageReflection(
-        descriptor,
-        MigrationToReflectionSchema(default_instance_data_, offsets_,
-                                    *schemas_),
-        ::google::protobuf::DescriptorPool::generated_pool(), factory_);
-    for (int i = 0; i < descriptor->enum_type_count(); i++) {
-      AssignEnumDescriptor(descriptor->enum_type(i));
-    }
-    schemas_++;
-    default_instance_data_++;
-    file_level_metadata_++;
-  }
-
-  void AssignEnumDescriptor(const EnumDescriptor* descriptor) {
-    *file_level_enum_descriptors_ = descriptor;
-    file_level_enum_descriptors_++;
-  }
-
-  const Metadata* GetCurrentMetadataPtr() const { return file_level_metadata_; }
-
- private:
-  MessageFactory* factory_;
-  Metadata* file_level_metadata_;
-  const EnumDescriptor** file_level_enum_descriptors_;
-  const Schema* schemas_;
-  const Message* const * default_instance_data_;
-  const uint32* offsets_;
-};
-
-// We have the routines that assign descriptors and build reflection
-// automatically delete the allocated reflection. MetadataOwner owns
-// all the allocated reflection instances.
-struct MetadataOwner {
-  void AddArray(const Metadata* begin, const Metadata* end) {
-    MutexLock lock(&mu_);
-    metadata_arrays_.push_back(std::make_pair(begin, end));
-  }
-
-  static MetadataOwner* Instance() {
-    static MetadataOwner* res = new MetadataOwner;
-    return res;
-  }
-
- private:
-  // Use the constructor to register the shutdown code. Because c++ makes sure
-  // this called only once.
-  MetadataOwner() { OnShutdown(&DeleteMetadata); }
-  ~MetadataOwner() {
-    for (int i = 0; i < metadata_arrays_.size(); i++) {
-      for (const Metadata* m = metadata_arrays_[i].first;
-           m < metadata_arrays_[i].second; m++) {
-        delete m->reflection;
-      }
-    }
-  }
-
-  static void DeleteMetadata() {
-    delete Instance();
-  }
-
-  Mutex mu_;
-  std::vector<std::pair<const Metadata*, const Metadata*> > metadata_arrays_;
-};
-
-}  // namespace
-
-void AssignDescriptors(
-    const string& filename, const MigrationSchema* schemas,
-    const Message* const* default_instances_, const uint32* offsets,
-    MessageFactory* factory,
-    // update the following descriptor arrays.
-    Metadata* file_level_metadata,
-    const EnumDescriptor** file_level_enum_descriptors,
-    const ServiceDescriptor** file_level_service_descriptors) {
-  const ::google::protobuf::FileDescriptor* file =
-      ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(filename);
-  GOOGLE_CHECK(file != NULL);
-
-  if (!factory) factory = MessageFactory::generated_factory();
-
-  AssignDescriptorsHelper<MigrationSchema> helper(factory, file_level_metadata,
-                                 file_level_enum_descriptors, schemas,
-                                 default_instances_, offsets);
-
-  for (int i = 0; i < file->message_type_count(); i++) {
-    helper.AssignMessageDescriptor(file->message_type(i));
-  }
-
-  for (int i = 0; i < file->enum_type_count(); i++) {
-    helper.AssignEnumDescriptor(file->enum_type(i));
-  }
-  if (file->options().cc_generic_services()) {
-    for (int i = 0; i < file->service_count(); i++) {
-      file_level_service_descriptors[i] = file->service(i);
-    }
-  }
-  MetadataOwner::Instance()->AddArray(
-      file_level_metadata, helper.GetCurrentMetadataPtr());
-}
-
-void RegisterAllTypesInternal(const Metadata* file_level_metadata, int size) {
-  for (int i = 0; i < size; i++) {
-    const GeneratedMessageReflection* reflection =
-        static_cast<const GeneratedMessageReflection*>(
-           file_level_metadata[i].reflection);
-    if (reflection) {
-      // It's not a map type
-      ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
-          file_level_metadata[i].descriptor,
-          reflection->schema_.default_instance_);
-    }
-  }
-}
-
-void RegisterAllTypes(const Metadata* file_level_metadata, int size) {
-  RegisterAllTypesInternal(file_level_metadata, size);
-}
-
-void UnknownFieldSetSerializer(const uint8* base, uint32 offset, uint32 tag,
-                               uint32 has_offset,
-                               ::google::protobuf::io::CodedOutputStream* output) {
-  const void* ptr = base + offset;
-  const InternalMetadataWithArena* metadata =
-      static_cast<const InternalMetadataWithArena*>(ptr);
-  if (metadata->have_unknown_fields()) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        metadata->unknown_fields(), output);
-  }
+GeneratedMessageReflection*
+GeneratedMessageReflection::NewGeneratedMessageReflection(
+    const Descriptor* descriptor,
+    const Message* default_instance,
+    const int offsets[],
+    int has_bits_offset,
+    int unknown_fields_offset,
+    int extensions_offset,
+    int object_size,
+    int arena_offset,
+    int is_default_instance_offset) {
+  return new GeneratedMessageReflection(descriptor,
+                                        default_instance,
+                                        offsets,
+                                        has_bits_offset,
+                                        unknown_fields_offset,
+                                        extensions_offset,
+                                        DescriptorPool::generated_pool(),
+                                        MessageFactory::generated_factory(),
+                                        object_size,
+                                        arena_offset,
+                                        is_default_instance_offset);
 }
 
 }  // namespace internal
diff --git a/src/google/protobuf/generated_message_reflection.h b/src/google/protobuf/generated_message_reflection.h
index ae1b176..4f25d4b 100644
--- a/src/google/protobuf/generated_message_reflection.h
+++ b/src/google/protobuf/generated_message_reflection.h
@@ -61,15 +61,7 @@
 class DescriptorPool;
 class MapKey;
 class MapValueRef;
-}  // namespace protobuf
-
-
-namespace protobuf {
-namespace flat {
-class MetadataBuilder;
-}  // namespace flat
-}  // namespace protobuf
-
+}
 
 namespace protobuf {
 namespace internal {
@@ -80,158 +72,6 @@
 
 // Defined in other files.
 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.
-//   default_instance:  The default instance of the message.  This is only
-//                  used to obtain pointers to default instances of embedded
-//                  messages, which GetMessage() will return if the particular
-//                  sub-message has not been initialized yet.  (Thus, all
-//                  embedded message fields *must* have non-NULL pointers
-//                  in the default instance.)
-//   offsets:       An array of ints giving the byte offsets.
-//                  For each oneof or weak field, the offset is relative to the
-//                  default_instance. These can be computed at compile time
-//                  using the
-//                  GOOGLE_PROTOBUF_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET()
-//                  macro. For each none oneof field, the offset is related to
-//                  the start of the message object.  These can be computed at
-//                  compile time using the
-//                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro.
-//                  Besides offsets for all fields, this array also contains
-//                  offsets for oneof unions. The offset of the i-th oneof union
-//                  is offsets[descriptor->field_count() + i].
-//   has_bit_indices:  Mapping from field indexes to their index in the has
-//                  bit array.
-//   has_bits_offset:  Offset in the message of an array of uint32s of size
-//                  descriptor->field_count()/32, rounded up.  This is a
-//                  bitfield where each bit indicates whether or not the
-//                  corresponding field of the message has been initialized.
-//                  The bit for field index i is obtained by the expression:
-//                    has_bits[i / 32] & (1 << (i % 32))
-//   unknown_fields_offset:  Offset in the message of the UnknownFieldSet for
-//                  the message.
-//   extensions_offset:  Offset in the message of the ExtensionSet for the
-//                  message, or -1 if the message type has no extension
-//                  ranges.
-//   oneof_case_offset:  Offset in the message of an array of uint32s of
-//                  size descriptor->oneof_decl_count().  Each uint32
-//                  indicates what field is set for each oneof.
-//   object_size:   The size of a message object of this type, as measured
-//                  by sizeof().
-//   arena_offset:  If a message doesn't have a unknown_field_set that stores
-//                  the arena, it must have a direct pointer to the arena.
-//   weak_field_map_offset: If the message proto has weak fields, this is the
-//                  offset of _weak_field_map_ in the generated proto. Otherwise
-//                  -1.
-struct ReflectionSchema {
- public:
-  // Size of a google::protobuf::Message object of this type.
-  uint32 GetObjectSize() const { return static_cast<uint32>(object_size_); }
-
-  // Offset of a non-oneof field.  Getting a field offset is slightly more
-  // efficient when we know statically that it is not a oneof field.
-  uint32 GetFieldOffsetNonOneof(const FieldDescriptor* field) const {
-    GOOGLE_DCHECK(!field->containing_oneof());
-    return offsets_[field->index()];
-  }
-
-  // Offset of any field.
-  uint32 GetFieldOffset(const FieldDescriptor* field) const {
-    if (field->containing_oneof()) {
-      size_t offset =
-          static_cast<size_t>(field->containing_type()->field_count() +
-          field->containing_oneof()->index());
-      return offsets_[offset];
-    } else {
-      return GetFieldOffsetNonOneof(field);
-    }
-  }
-
-  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));
-  }
-
-  bool HasHasbits() const { return has_bits_offset_ != -1; }
-
-  // Bit index within the bit array of hasbits.  Bit order is low-to-high.
-  uint32 HasBitIndex(const FieldDescriptor* field) const {
-    GOOGLE_DCHECK(HasHasbits());
-    return has_bit_indices_[field->index()];
-  }
-
-  // Byte offset of the hasbits array.
-  uint32 HasBitsOffset() const {
-    GOOGLE_DCHECK(HasHasbits());
-    return static_cast<uint32>(has_bits_offset_);
-  }
-
-  // The offset of the InternalMetadataWithArena member.
-  // For Lite this will actually be an InternalMetadataWithArenaLite.
-  // The schema doesn't contain enough information to distinguish between
-  // these two cases.
-  uint32 GetMetadataOffset() const {
-    return static_cast<uint32>(metadata_offset_);
-  }
-
-  // Whether this message has an ExtensionSet.
-  bool HasExtensionSet() const { return extensions_offset_ != -1; }
-
-  // The offset of the ExtensionSet in this message.
-  uint32 GetExtensionSetOffset() const {
-    GOOGLE_DCHECK(HasExtensionSet());
-    return static_cast<uint32>(extensions_offset_);
-  }
-
-  // The off set of WeakFieldMap when the message contains weak fields.
-  // The default is 0 for now.
-  int GetWeakFieldMapOffset() const { return weak_field_map_offset_; }
-
-  bool IsDefaultInstance(const Message& message) const {
-    return &message == default_instance_;
-  }
-
-  // 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 {
-    return reinterpret_cast<const uint8*>(default_instance_) +
-                     offsets_[field->index()];
-  }
-
-
-  bool HasWeakFields() const { return weak_field_map_offset_ > 0; }
-
-  // These members are intended to be private, but we cannot actually make them
-  // private because this prevents us from using aggregate initialization of
-  // them, ie.
-  //
-  //   ReflectionSchema schema = {a, b, c, d, e, ...};
- // private:
-  const Message* default_instance_;
-  const uint32* offsets_;
-  const uint32* has_bit_indices_;
-  int has_bits_offset_;
-  int metadata_offset_;
-  int extensions_offset_;
-  int oneof_case_offset_;
-  int object_size_;
-  int weak_field_map_offset_;
-};
-
-// Structs that the code generator emits directly to describe a message.
-// These should never used directly except to build a ReflectionSchema
-// object.
-//
-// EXPERIMENTAL: these are changing rapidly, and may completely disappear
-// or merge with ReflectionSchema.
-struct MigrationSchema {
-  int32 offsets_index;
-  int32 has_bit_indices_index;
-  int object_size;
-};
 
 // THIS CLASS IS NOT INTENDED FOR DIRECT USE.  It is intended for use
 // by generated code.  This class is just a big hack that reduces code
@@ -257,29 +97,124 @@
 //    of whatever type the individual field would be.  Strings and
 //    Messages use RepeatedPtrFields while everything else uses
 //    RepeatedFields.
-class LIBPROTOBUF_EXPORT GeneratedMessageReflection PROTOBUF_FINAL : public Reflection {
+class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection {
  public:
   // Constructs a GeneratedMessageReflection.
   // Parameters:
   //   descriptor:    The descriptor for the message type being implemented.
-  //   schema:        The description of the internal guts of the message.
+  //   default_instance:  The default instance of the message.  This is only
+  //                  used to obtain pointers to default instances of embedded
+  //                  messages, which GetMessage() will return if the particular
+  //                  sub-message has not been initialized yet.  (Thus, all
+  //                  embedded message fields *must* have non-NULL pointers
+  //                  in the default instance.)
+  //   offsets:       An array of ints giving the byte offsets, relative to
+  //                  the start of the message object, of each field.  These can
+  //                  be computed at compile time using the
+  //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro, defined
+  //                  below.
+  //   has_bits_offset:  Offset in the message of an array of uint32s of size
+  //                  descriptor->field_count()/32, rounded up.  This is a
+  //                  bitfield where each bit indicates whether or not the
+  //                  corresponding field of the message has been initialized.
+  //                  The bit for field index i is obtained by the expression:
+  //                    has_bits[i / 32] & (1 << (i % 32))
+  //   unknown_fields_offset:  Offset in the message of the UnknownFieldSet for
+  //                  the message.
+  //   extensions_offset:  Offset in the message of the ExtensionSet for the
+  //                  message, or -1 if the message type has no extension
+  //                  ranges.
   //   pool:          DescriptorPool to search for extension definitions.  Only
   //                  used by FindKnownExtensionByName() and
   //                  FindKnownExtensionByNumber().
   //   factory:       MessageFactory to use to construct extension messages.
+  //   object_size:   The size of a message object of this type, as measured
+  //                  by sizeof().
   GeneratedMessageReflection(const Descriptor* descriptor,
-                             const ReflectionSchema& schema,
+                             const Message* default_instance,
+                             const int offsets[],
+                             int has_bits_offset,
+                             int unknown_fields_offset,
+                             int extensions_offset,
                              const DescriptorPool* pool,
-                             MessageFactory* factory);
+                             MessageFactory* factory,
+                             int object_size,
+                             int arena_offset,
+                             int is_default_instance_offset = -1);
 
+  // Similar with the construction above. Call this construction if the
+  // message has oneof definition.
+  // Parameters:
+  //   offsets:       An array of ints giving the byte offsets.
+  //                  For each oneof field, the offset is relative to the
+  //                  default_oneof_instance. These can be computed at compile
+  //                  time using the
+  //                  PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET() macro.
+  //                  For each none oneof field, the offset is related to
+  //                  the start of the message object.  These can be computed
+  //                  at compile time using the
+  //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro.
+  //                  Besides offsets for all fields, this array also contains
+  //                  offsets for oneof unions. The offset of the i-th oneof
+  //                  union is offsets[descriptor->field_count() + i].
+  //   default_oneof_instance: The default instance of the oneofs. It is a
+  //                  struct holding the default value of all oneof fields
+  //                  for this message. It is only used to obtain pointers
+  //                  to default instances of oneof fields, which Get
+  //                  methods will return if the field is not set.
+  //   oneof_case_offset:  Offset in the message of an array of uint32s of
+  //                  size descriptor->oneof_decl_count().  Each uint32
+  //                  indicates what field is set for each oneof.
+  //   other parameters are the same with the construction above.
+  GeneratedMessageReflection(const Descriptor* descriptor,
+                             const Message* default_instance,
+                             const int offsets[],
+                             int has_bits_offset,
+                             int unknown_fields_offset,
+                             int extensions_offset,
+                             const void* default_oneof_instance,
+                             int oneof_case_offset,
+                             const DescriptorPool* pool,
+                             MessageFactory* factory,
+                             int object_size,
+                             int arena_offset,
+                             int is_default_instance_offset = -1);
   ~GeneratedMessageReflection();
 
+  // Shorter-to-call helpers for the above two constructions that work if the
+  // pool and factory are the usual, namely, DescriptorPool::generated_pool()
+  // and MessageFactory::generated_factory().
+
+  static GeneratedMessageReflection* NewGeneratedMessageReflection(
+      const Descriptor* descriptor,
+      const Message* default_instance,
+      const int offsets[],
+      int has_bits_offset,
+      int unknown_fields_offset,
+      int extensions_offset,
+      const void* default_oneof_instance,
+      int oneof_case_offset,
+      int object_size,
+      int arena_offset,
+      int is_default_instance_offset = -1);
+
+  static GeneratedMessageReflection* NewGeneratedMessageReflection(
+      const Descriptor* descriptor,
+      const Message* default_instance,
+      const int offsets[],
+      int has_bits_offset,
+      int unknown_fields_offset,
+      int extensions_offset,
+      int object_size,
+      int arena_offset,
+      int is_default_instance_offset = -1);
+
   // implements Reflection -------------------------------------------
 
   const UnknownFieldSet& GetUnknownFields(const Message& message) const;
   UnknownFieldSet* MutableUnknownFields(Message* message) const;
 
-  size_t SpaceUsedLong(const Message& message) const;
+  int SpaceUsed(const Message& message) const;
 
   bool HasField(const Message& message, const FieldDescriptor* field) const;
   int FieldSize(const Message& message, const FieldDescriptor* field) const;
@@ -291,11 +226,11 @@
   Message* ReleaseLast(Message* message, const FieldDescriptor* field) const;
   void Swap(Message* message1, Message* message2) const;
   void SwapFields(Message* message1, Message* message2,
-                  const std::vector<const FieldDescriptor*>& fields) const;
+                  const vector<const FieldDescriptor*>& fields) const;
   void SwapElements(Message* message, const FieldDescriptor* field,
                     int index1, int index2) const;
   void ListFields(const Message& message,
-                  std::vector<const FieldDescriptor*>* output) const;
+                  vector<const FieldDescriptor*>* output) const;
 
   int32  GetInt32 (const Message& message,
                    const FieldDescriptor* field) const;
@@ -497,33 +432,40 @@
       const Descriptor* message_type) const;
 
  private:
-  friend class google::protobuf::flat::MetadataBuilder;
+  friend class GeneratedMessage;
+
+  // To parse directly into a proto2 generated class, the class GMR_Handlers
+  // needs access to member offsets and hasbits.
   friend class upb::google_opensource::GMR_Handlers;
 
-  const Descriptor* const descriptor_;
-  const ReflectionSchema schema_;
-  const DescriptorPool* const descriptor_pool_;
-  MessageFactory* const message_factory_;
+  const Descriptor* descriptor_;
+  const Message* default_instance_;
+  const void* default_oneof_instance_;
+  const int* offsets_;
 
-  // Last non weak field index. This is an optimization when most weak fields
-  // are at the end of the containing message. If a message proto doesn't
-  // contain weak fields, then this field equals descriptor_->field_count().
-  int last_non_weak_field_index_;
+  int has_bits_offset_;
+  int oneof_case_offset_;
+  int unknown_fields_offset_;
+  int extensions_offset_;
+  int arena_offset_;
+  int is_default_instance_offset_;
+  int object_size_;
 
-  template <class T>
-  const T& GetRawNonOneof(const Message& message,
-                          const FieldDescriptor* field) const;
-  template <class T>
-  T* MutableRawNonOneof(Message* message, const FieldDescriptor* field) const;
+  static const int kHasNoDefaultInstanceField = -1;
+
+  const DescriptorPool* descriptor_pool_;
+  MessageFactory* message_factory_;
 
   template <typename Type>
-  const Type& GetRaw(const Message& message,
+  inline const Type& GetRaw(const Message& message,
                             const FieldDescriptor* field) const;
   template <typename Type>
   inline Type* MutableRaw(Message* message,
                           const FieldDescriptor* field) const;
   template <typename Type>
   inline const Type& DefaultRaw(const FieldDescriptor* field) const;
+  template <typename Type>
+  inline const Type& DefaultOneofRaw(const FieldDescriptor* field) const;
 
   inline const uint32* GetHasBits(const Message& message) const;
   inline uint32* MutableHasBits(Message* message) const;
@@ -536,13 +478,13 @@
   inline const ExtensionSet& GetExtensionSet(const Message& message) const;
   inline ExtensionSet* MutableExtensionSet(Message* message) const;
   inline Arena* GetArena(Message* message) const;
-
-  inline const InternalMetadataWithArena& GetInternalMetadataWithArena(
-      const Message& message) const;
-
-  inline InternalMetadataWithArena*
+  inline const internal::InternalMetadataWithArena&
+      GetInternalMetadataWithArena(const Message& message) const;
+  inline internal::InternalMetadataWithArena*
       MutableInternalMetadataWithArena(Message* message) const;
 
+  inline bool GetIsDefaultInstance(const Message& message) const;
+
   inline bool HasBit(const Message& message,
                      const FieldDescriptor* field) const;
   inline void SetBit(Message* message,
@@ -629,12 +571,43 @@
   internal::MapFieldBase* MapData(
       Message* message, const FieldDescriptor* field) const;
 
-  friend inline  // inline so nobody can call this function.
-      void
-      RegisterAllTypesInternal(const Metadata* file_level_metadata, int size);
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection);
 };
 
+// Returns the offset of the given field within the given aggregate type.
+// This is equivalent to the ANSI C offsetof() macro.  However, according
+// to the C++ standard, offsetof() only works on POD types, and GCC
+// enforces this requirement with a warning.  In practice, this rule is
+// unnecessarily strict; there is probably no compiler or platform on
+// which the offsets of the direct fields of a class are non-constant.
+// Fields inherited from superclasses *can* have non-constant offsets,
+// but that's not what this macro will be used for.
+#if defined(__clang__)
+// For Clang we use __builtin_offsetof() and suppress the warning,
+// to avoid Control Flow Integrity and UBSan vptr sanitizers from
+// crashing while trying to validate the invalid reinterpet_casts.
+#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)    \
+  _Pragma("clang diagnostic push")                            \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"")  \
+  __builtin_offsetof(TYPE, FIELD)                             \
+  _Pragma("clang diagnostic pop")
+#else
+// Note that we calculate relative to the pointer value 16 here since if we
+// just use zero, GCC complains about dereferencing a NULL pointer.  We
+// choose 16 rather than some other number just in case the compiler would
+// be confused by an unaligned pointer.
+#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)    \
+  static_cast<int>(                                           \
+      reinterpret_cast<const char*>(                          \
+          &reinterpret_cast<const TYPE*>(16)->FIELD) -        \
+      reinterpret_cast<const char*>(16))
+#endif
+
+#define PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(ONEOF, FIELD)     \
+  static_cast<int>(                                                   \
+      reinterpret_cast<const char*>(&(ONEOF->FIELD))                  \
+      - reinterpret_cast<const char*>(ONEOF))
+
 // There are some places in proto2 where dynamic_cast would be useful as an
 // optimization.  For example, take Message::MergeFrom(const Message& other).
 // For a given generated message FooMessage, we generate these two methods:
@@ -706,22 +679,6 @@
   return const_cast<T*>(DynamicCastToGenerated<const T>(message_const));
 }
 
-LIBPROTOBUF_EXPORT void AssignDescriptors(
-    const string& filename, const MigrationSchema* schemas,
-    const Message* const* default_instances_, const uint32* offsets,
-    MessageFactory* factory,
-    // update the following descriptor arrays.
-    Metadata* file_level_metadata,
-    const EnumDescriptor** file_level_enum_descriptors,
-    const ServiceDescriptor** file_level_service_descriptors);
-
-LIBPROTOBUF_EXPORT void RegisterAllTypes(const Metadata* file_level_metadata, int size);
-
-// These cannot be in lite so we put them in the reflection.
-LIBPROTOBUF_EXPORT void UnknownFieldSetSerializer(const uint8* base, uint32 offset, uint32 tag,
-                               uint32 has_offset,
-                               ::google::protobuf::io::CodedOutputStream* output);
-
 }  // namespace internal
 }  // namespace protobuf
 
diff --git a/src/google/protobuf/generated_message_reflection_unittest.cc b/src/google/protobuf/generated_message_reflection_unittest.cc
index 242cc4a..85ebdef 100644
--- a/src/google/protobuf/generated_message_reflection_unittest.cc
+++ b/src/google/protobuf/generated_message_reflection_unittest.cc
@@ -48,10 +48,9 @@
 #include <google/protobuf/stubs/shared_ptr.h>
 #endif
 
+#include <google/protobuf/descriptor.h>
 #include <google/protobuf/test_util.h>
 #include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
@@ -223,7 +222,7 @@
   message2.set_optional_string("hello");
   message2.mutable_repeated_int64()->Add(30);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   const Descriptor* descriptor = message1.GetDescriptor();
   fields.push_back(descriptor->FindFieldByName("optional_double"));
   fields.push_back(descriptor->FindFieldByName("repeated_int32"));
@@ -256,7 +255,7 @@
 
   TestUtil::SetAllFields(&message2);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   const Reflection* reflection = message1.GetReflection();
   reflection->ListFields(message2, &fields);
   reflection->SwapFields(&message1, &message2, fields);
@@ -271,7 +270,7 @@
 
   TestUtil::SetAllExtensions(&message1);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   const Reflection* reflection = message1.GetReflection();
   reflection->ListFields(message1, &fields);
   reflection->SwapFields(&message1, &message2, fields);
@@ -307,7 +306,7 @@
   unittest::TestOneof2 message1, message2;
   TestUtil::SetOneof1(&message1);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   const Descriptor* descriptor = message1.GetDescriptor();
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields.push_back(descriptor->field(i));
@@ -520,41 +519,6 @@
       &to_message, TestUtil::ReflectionTester::IS_NULL);
 }
 
-TEST(GeneratedMessageReflectionTest, SetAllocatedMessageOnArenaTest) {
-  unittest::TestAllTypes from_message1;
-  unittest::TestAllTypes from_message2;
-  ::google::protobuf::Arena arena;
-  unittest::TestAllTypes* to_message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestAllTypes>(&arena);
-  TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
-  reflection_tester.SetAllFieldsViaReflection(&from_message1);
-  reflection_tester.SetAllFieldsViaReflection(&from_message2);
-
-  // Before moving fields, we expect the nested messages to be NULL.
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::IS_NULL);
-
-  // After fields are moved we should get non-NULL releases.
-  reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-      &from_message1, to_message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::NOT_NULL);
-
-  // Another move to make sure that we can SetAllocated several times.
-  reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-      &from_message2, to_message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::NOT_NULL);
-
-  // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
-  // releases to be NULL again.
-  reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
-      to_message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::IS_NULL);
-}
-
 TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) {
   unittest::TestAllExtensions from_message1;
   unittest::TestAllExtensions from_message2;
@@ -588,41 +552,6 @@
       &to_message, TestUtil::ReflectionTester::IS_NULL);
 }
 
-TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageOnArenaTest) {
-  ::google::protobuf::Arena arena;
-  unittest::TestAllExtensions* to_message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
-  unittest::TestAllExtensions from_message1;
-  unittest::TestAllExtensions from_message2;
-  TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
-  reflection_tester.SetAllFieldsViaReflection(&from_message1);
-  reflection_tester.SetAllFieldsViaReflection(&from_message2);
-
-  // Before moving fields, we expect the nested messages to be NULL.
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::IS_NULL);
-
-  // After fields are moved we should get non-NULL releases.
-  reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-      &from_message1, to_message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::NOT_NULL);
-
-  // Another move to make sure that we can SetAllocated several times.
-  reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-      &from_message2, to_message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::NOT_NULL);
-
-  // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
-  // releases to be NULL again.
-  reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
-      to_message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      to_message, TestUtil::ReflectionTester::IS_NULL);
-}
-
 TEST(GeneratedMessageReflectionTest, AddRepeatedMessage) {
   unittest::TestAllTypes message;
 
@@ -679,7 +608,7 @@
   TestUtil::SetOneof1(&message);
 
   const Reflection* reflection = message.GetReflection();
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message, &fields);
   EXPECT_EQ(4, fields.size());
 }
@@ -794,59 +723,6 @@
   delete released;
 }
 
-TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageOnArenaTest) {
-  unittest::TestOneof2 from_message1;
-  unittest::TestOneof2 from_message2;
-  ::google::protobuf::Arena arena;
-  unittest::TestOneof2* to_message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestOneof2>(&arena);
-  const Descriptor* descriptor = unittest::TestOneof2::descriptor();
-  const Reflection* reflection = to_message->GetReflection();
-
-  Message* released = reflection->ReleaseMessage(
-      to_message, descriptor->FindFieldByName("foo_lazy_message"));
-  EXPECT_TRUE(released == NULL);
-  released = reflection->ReleaseMessage(
-      to_message, descriptor->FindFieldByName("foo_message"));
-  EXPECT_TRUE(released == NULL);
-
-  TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1);
-  TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
-
-  TestUtil::ReflectionTester::
-      SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-          &from_message1, to_message);
-  const Message& sub_message = reflection->GetMessage(
-      *to_message, descriptor->FindFieldByName("foo_lazy_message"));
-  released = reflection->ReleaseMessage(
-      to_message, descriptor->FindFieldByName("foo_lazy_message"));
-  EXPECT_TRUE(released != NULL);
-  // Since sub_message is arena allocated, releasing it results in copying it
-  // into new heap-allocated memory.
-  EXPECT_NE(&sub_message, released);
-  delete released;
-
-  TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
-
-  reflection->MutableMessage(
-      &from_message2, descriptor->FindFieldByName("foo_message"));
-
-  TestUtil::ReflectionTester::
-      SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-          &from_message2, to_message);
-
-  const Message& sub_message2 = reflection->GetMessage(
-      *to_message, descriptor->FindFieldByName("foo_message"));
-  released = reflection->ReleaseMessage(
-      to_message, descriptor->FindFieldByName("foo_message"));
-  EXPECT_TRUE(released != NULL);
-  // Since sub_message2 is arena allocated, releasing it results in copying it
-  // into new heap-allocated memory.
-  EXPECT_NE(&sub_message2, released);
-  delete released;
-}
-
-
 TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) {
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
@@ -919,73 +795,6 @@
   EXPECT_TRUE(released == NULL);
 }
 
-TEST(GeneratedMessageReflectionTest, ArenaReleaseMessageTest) {
-  ::google::protobuf::Arena arena;
-  unittest::TestAllTypes* message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestAllTypes>(&arena);
-  TestUtil::ReflectionTester reflection_tester(
-      unittest::TestAllTypes::descriptor());
-
-  // When nothing is set, we expect all released messages to be NULL.
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      message, TestUtil::ReflectionTester::IS_NULL);
-
-  // After fields are set we should get non-NULL releases.
-  reflection_tester.SetAllFieldsViaReflection(message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      message, TestUtil::ReflectionTester::NOT_NULL);
-
-  // After Clear() we may or may not get a message from ReleaseMessage().
-  // This is implementation specific.
-  reflection_tester.SetAllFieldsViaReflection(message);
-  message->Clear();
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      message, TestUtil::ReflectionTester::CAN_BE_NULL);
-}
-
-TEST(GeneratedMessageReflectionTest, ArenaReleaseExtensionMessageTest) {
-  ::google::protobuf::Arena arena;
-  unittest::TestAllExtensions* message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
-  TestUtil::ReflectionTester reflection_tester(
-      unittest::TestAllExtensions::descriptor());
-
-  // When nothing is set, we expect all released messages to be NULL.
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      message, TestUtil::ReflectionTester::IS_NULL);
-
-  // After fields are set we should get non-NULL releases.
-  reflection_tester.SetAllFieldsViaReflection(message);
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      message, TestUtil::ReflectionTester::NOT_NULL);
-
-  // After Clear() we may or may not get a message from ReleaseMessage().
-  // This is implementation specific.
-  reflection_tester.SetAllFieldsViaReflection(message);
-  message->Clear();
-  reflection_tester.ExpectMessagesReleasedViaReflection(
-      message, TestUtil::ReflectionTester::CAN_BE_NULL);
-}
-
-TEST(GeneratedMessageReflectionTest, ArenaReleaseOneofMessageTest) {
-  ::google::protobuf::Arena arena;
-  unittest::TestOneof2* message =
-      ::google::protobuf::Arena::CreateMessage<unittest::TestOneof2>(&arena);
-  TestUtil::ReflectionTester::SetOneofViaReflection(message);
-
-  const Descriptor* descriptor = unittest::TestOneof2::descriptor();
-  const Reflection* reflection = message->GetReflection();
-  Message* released = reflection->ReleaseMessage(
-      message, descriptor->FindFieldByName("foo_lazy_message"));
-
-  EXPECT_TRUE(released != NULL);
-  delete released;
-
-  released = reflection->ReleaseMessage(
-      message, descriptor->FindFieldByName("foo_lazy_message"));
-  EXPECT_TRUE(released == NULL);
-}
-
 #ifdef PROTOBUF_HAS_DEATH_TEST
 
 TEST(GeneratedMessageReflectionTest, UsageErrors) {
diff --git a/src/google/protobuf/generated_message_table_driven.cc b/src/google/protobuf/generated_message_table_driven.cc
deleted file mode 100644
index 29af1ef..0000000
--- a/src/google/protobuf/generated_message_table_driven.cc
+++ /dev/null
@@ -1,103 +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.
-
-#include <google/protobuf/generated_message_table_driven.h>
-
-#include <google/protobuf/stubs/type_traits.h>
-
-#include <google/protobuf/generated_message_table_driven_lite.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/metadata.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/wire_format_lite_inl.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-namespace {
-
-UnknownFieldSet* MutableUnknownFields(MessageLite* msg, int64 arena_offset) {
-  return Raw<InternalMetadataWithArena>(msg, arena_offset)
-      ->mutable_unknown_fields();
-}
-
-struct UnknownFieldHandler {
-  static bool Skip(MessageLite* msg, const ParseTable& table,
-                   io::CodedInputStream* input,
-                   int tag) {
-    GOOGLE_DCHECK(table.unknown_field_set);
-
-    return WireFormat::SkipField(input, tag,
-        MutableUnknownFields(msg, table.arena_offset));
-  }
-
-  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);
-  }
-
-  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());
-
-    GOOGLE_DCHECK(prototype != NULL);
-    GOOGLE_DCHECK(table.unknown_field_set);
-    UnknownFieldSet* unknown_fields =
-        MutableUnknownFields(msg, table.arena_offset);
-
-    return extensions->ParseField(tag, input, prototype, unknown_fields);
-  }
-};
-
-}  // namespace
-
-bool MergePartialFromCodedStream(
-    MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) {
-  return MergePartialFromCodedStreamImpl<UnknownFieldHandler,
-                                         InternalMetadataWithArena>(msg, table,
-                                                                    input);
-}
-
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/generated_message_table_driven.h b/src/google/protobuf/generated_message_table_driven.h
deleted file mode 100644
index 6f3fe66..0000000
--- a/src/google/protobuf/generated_message_table_driven.h
+++ /dev/null
@@ -1,219 +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.
-
-#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_H__
-#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_H__
-
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/map_field_lite.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/wire_format_lite_inl.h>
-
-#if LANG_CXX11
-#define PROTOBUF_CONSTEXPR constexpr
-
-// We require C++11 and Clang to use constexpr for variables, as GCC 4.8
-// requires constexpr to be consistent between declarations of variables
-// unnecessarily (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58541).
-// VS 2017 Update 3 also supports this usage of constexpr.
-#if defined(__clang__) || (defined(_MSC_VER) && _MSC_VER >= 1911)
-#define PROTOBUF_CONSTEXPR_VAR constexpr
-#else  // !__clang__
-#define PROTOBUF_CONSTEXPR_VAR
-#endif  // !_clang
-
-#else
-#define PROTOBUF_CONSTEXPR
-#define PROTOBUF_CONSTEXPR_VAR
-#endif
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-// Processing-type masks.
-static PROTOBUF_CONSTEXPR const unsigned char kOneofMask = 0x40;
-static PROTOBUF_CONSTEXPR const unsigned char kRepeatedMask = 0x20;
-// Mask for the raw type: either a WireFormatLite::FieldType or one of the
-// ProcessingTypes below, without the oneof or repeated flag.
-static PROTOBUF_CONSTEXPR const unsigned char kTypeMask = 0x1f;
-
-// Wire type masks.
-static PROTOBUF_CONSTEXPR const unsigned char kNotPackedMask = 0x10;
-static PROTOBUF_CONSTEXPR const unsigned char kInvalidMask = 0x20;
-
-enum ProcessingTypes {
-  TYPE_STRING_CORD = 19,
-  TYPE_STRING_STRING_PIECE = 20,
-  TYPE_BYTES_CORD = 21,
-  TYPE_BYTES_STRING_PIECE = 22,
-  TYPE_MAP = 23,
-};
-
-#if LANG_CXX11
-static_assert(TYPE_MAP < kRepeatedMask, "Invalid enum");
-#endif
-
-// TODO(ckennelly):  Add a static assertion to ensure that these masks do not
-// conflict with wiretypes.
-
-// ParseTableField is kept small to help simplify instructions for computing
-// offsets, as we will always need this information to parse a field.
-// Additional data, needed for some types, is stored in
-// AuxillaryParseTableField.
-struct ParseTableField {
-  uint32 offset;
-  // The presence_index ordinarily represents a has_bit index, but for fields
-  // inside a oneof it represents the index in _oneof_case_.
-  uint32 presence_index;
-  unsigned char normal_wiretype;
-  unsigned char packed_wiretype;
-
-  // processing_type is given by:
-  //   (FieldDescriptor->type() << 1) | FieldDescriptor->is_packed()
-  unsigned char processing_type;
-
-  unsigned char tag_size;
-};
-
-struct ParseTable;
-
-union AuxillaryParseTableField {
-  typedef bool (*EnumValidator)(int);
-
-  // Enums
-  struct enum_aux {
-    EnumValidator validator;
-  };
-  enum_aux enums;
-  // Group, messages
-  struct message_aux {
-    // ExplicitlyInitialized<T> -> T requires a reinterpret_cast, which prevents
-    // the tables from being constructed as a constexpr.  We use void to avoid
-    // the cast.
-    const void* default_message_void;
-    const MessageLite* default_message() const {
-      return static_cast<const MessageLite*>(default_message_void);
-    }
-    const ParseTable* parse_table;
-  };
-  message_aux messages;
-  // Strings
-  struct string_aux {
-    const void* default_ptr;
-    const char* field_name;
-  };
-  string_aux strings;
-
-  struct map_aux {
-    bool (*parse_map)(io::CodedInputStream*, void*);
-  };
-  map_aux maps;
-
-#if LANG_CXX11
-  AuxillaryParseTableField() = default;
-#else
-  AuxillaryParseTableField() { }
-#endif
-  PROTOBUF_CONSTEXPR AuxillaryParseTableField(
-      AuxillaryParseTableField::enum_aux e) : enums(e) {}
-  PROTOBUF_CONSTEXPR AuxillaryParseTableField(
-      AuxillaryParseTableField::message_aux m) : messages(m) {}
-  PROTOBUF_CONSTEXPR AuxillaryParseTableField(
-      AuxillaryParseTableField::string_aux s) : strings(s) {}
-  PROTOBUF_CONSTEXPR AuxillaryParseTableField(
-      AuxillaryParseTableField::map_aux m)
-      : maps(m) {}
-};
-
-struct ParseTable {
-  const ParseTableField* fields;
-  const AuxillaryParseTableField* aux;
-  int max_field_number;
-  // TODO(ckennelly): Do something with this padding.
-
-  // TODO(ckennelly): Vet these for sign extension.
-  int64 has_bits_offset;
-  int64 oneof_case_offset;
-  int64 extension_offset;
-  int64 arena_offset;
-
-  // ExplicitlyInitialized<T> -> T requires a reinterpret_cast, which prevents
-  // the tables from being constructed as a constexpr.  We use void to avoid
-  // the cast.
-  const void* default_instance_void;
-  const MessageLite* default_instance() const {
-    return static_cast<const MessageLite*>(default_instance_void);
-  }
-
-  bool unknown_field_set;
-};
-
-// TODO(jhen): Remove the __NVCC__ check when we get a version of nvcc that
-// supports these checks.
-#if LANG_CXX11 && !defined(__NVCC__)
-static_assert(sizeof(ParseTableField) <= 16, "ParseTableField is too large");
-// The tables must be composed of POD components to ensure link-time
-// initialization.
-static_assert(std::is_pod<ParseTableField>::value, "");
-static_assert(std::is_pod<AuxillaryParseTableField>::value, "");
-static_assert(std::is_pod<AuxillaryParseTableField::enum_aux>::value, "");
-static_assert(std::is_pod<AuxillaryParseTableField::message_aux>::value, "");
-static_assert(std::is_pod<AuxillaryParseTableField::string_aux>::value, "");
-static_assert(std::is_pod<ParseTable>::value, "");
-#endif
-
-// TODO(ckennelly): Consolidate these implementations into a single one, using
-// dynamic dispatch to the appropriate unknown field handler.
-bool MergePartialFromCodedStream(MessageLite* msg, const ParseTable& table,
-                                 io::CodedInputStream* input);
-bool MergePartialFromCodedStreamLite(MessageLite* msg, const ParseTable& table,
-                                 io::CodedInputStream* input);
-
-template <typename Entry>
-bool ParseMap(io::CodedInputStream* input, void* map_field) {
-  typedef typename MapEntryToMapField<Entry>::MapFieldType MapFieldType;
-  typedef google::protobuf::Map<typename Entry::EntryKeyType,
-                      typename Entry::EntryValueType>
-      MapType;
-  typedef typename Entry::template Parser<MapFieldType, MapType> ParserType;
-
-  ParserType parser(static_cast<MapFieldType*>(map_field));
-  return ::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(input,
-                                                                  &parser);
-}
-
-}  // namespace internal
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_H__
diff --git a/src/google/protobuf/generated_message_table_driven_lite.cc b/src/google/protobuf/generated_message_table_driven_lite.cc
deleted file mode 100644
index 90a5050..0000000
--- a/src/google/protobuf/generated_message_table_driven_lite.cc
+++ /dev/null
@@ -1,109 +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.
-
-#include <google/protobuf/generated_message_table_driven_lite.h>
-
-#include <google/protobuf/stubs/type_traits.h>
-
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/wire_format_lite_inl.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-namespace {
-
-string* MutableUnknownFields(MessageLite* msg, int64 arena_offset) {
-  return Raw<InternalMetadataWithArenaLite>(msg, arena_offset)
-      ->mutable_unknown_fields();
-}
-
-struct UnknownFieldHandlerLite {
-  static bool Skip(MessageLite* msg, const ParseTable& table,
-                   io::CodedInputStream* input,
-                   int tag) {
-    GOOGLE_DCHECK(!table.unknown_field_set);
-    ::google::protobuf::io::StringOutputStream unknown_fields_string(
-        MutableUnknownFields(msg, table.arena_offset));
-    ::google::protobuf::io::CodedOutputStream unknown_fields_stream(
-        &unknown_fields_string, false);
-
-    return ::google::protobuf::internal::WireFormatLite::SkipField(
-        input, tag, &unknown_fields_stream);
-  }
-
-  static void Varint(MessageLite* msg, const ParseTable& table,
-                     int tag, int value) {
-    GOOGLE_DCHECK(!table.unknown_field_set);
-
-    ::google::protobuf::io::StringOutputStream unknown_fields_string(
-        MutableUnknownFields(msg, table.arena_offset));
-    ::google::protobuf::io::CodedOutputStream unknown_fields_stream(
-        &unknown_fields_string, false);
-    unknown_fields_stream.WriteVarint32(tag);
-    unknown_fields_stream.WriteVarint32(value);
-  }
-
-  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 MessageLite* prototype = table.default_instance();
-
-    GOOGLE_DCHECK(!table.unknown_field_set);
-    ::google::protobuf::io::StringOutputStream unknown_fields_string(
-        MutableUnknownFields(msg, table.arena_offset));
-    ::google::protobuf::io::CodedOutputStream unknown_fields_stream(
-        &unknown_fields_string, false);
-    return extensions->ParseField(
-        tag, input, prototype, &unknown_fields_stream);
-  }
-};
-
-}  // namespace
-
-bool MergePartialFromCodedStreamLite(
-    MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) {
-  return MergePartialFromCodedStreamImpl<UnknownFieldHandlerLite,
-                                         InternalMetadataWithArenaLite>(
-      msg, table, input);
-}
-
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/generated_message_table_driven_lite.h b/src/google/protobuf/generated_message_table_driven_lite.h
deleted file mode 100644
index 20b4da2..0000000
--- a/src/google/protobuf/generated_message_table_driven_lite.h
+++ /dev/null
@@ -1,823 +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.
-
-#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
-#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
-
-#include <google/protobuf/generated_message_table_driven.h>
-
-#include <google/protobuf/stubs/type_traits.h>
-
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/wire_format_lite_inl.h>
-
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-
-enum StringType {
-  StringType_STRING = 0,
-  StringType_CORD = 1,
-  StringType_STRING_PIECE = 2
-};
-
-// Logically a superset of StringType, consisting of all field types that
-// require special initialization.
-enum ProcessingType {
-  ProcessingType_STRING = 0,
-  ProcessingType_CORD = 1,
-  ProcessingType_STRING_PIECE = 2,
-  ProcessingType_MESSAGE = 3
-};
-
-enum Cardinality {
-  Cardinality_SINGULAR = 0,
-  Cardinality_REPEATED = 1,
-  Cardinality_ONEOF = 3
-};
-
-template <typename Type>
-inline Type* Raw(MessageLite* msg, int64 offset) {
-  return reinterpret_cast<Type*>(reinterpret_cast<uint8*>(msg) + offset);
-}
-
-template <typename Type>
-inline const Type* Raw(const MessageLite* msg, int64 offset) {
-  return reinterpret_cast<const Type*>(reinterpret_cast<const uint8*>(msg) +
-                                       offset);
-}
-
-template <typename InternalMetadata>
-inline Arena* GetArena(MessageLite* msg, int64 arena_offset) {
-  if (GOOGLE_PREDICT_FALSE(arena_offset == -1)) {
-    return NULL;
-  }
-
-  return Raw<InternalMetadata>(msg, arena_offset)->arena();
-}
-
-inline ExtensionSet* GetExtensionSet(MessageLite* msg, int64 extension_offset) {
-  if (extension_offset == -1) {
-    return NULL;
-  }
-
-  return Raw<ExtensionSet>(msg, extension_offset);
-}
-
-template <typename Type>
-inline Type* AddField(MessageLite* msg, int64 offset) {
-#if LANG_CXX11
-  static_assert(has_trivial_copy<Type>::value,
-                "Do not assign");
-#endif
-
-  google::protobuf::RepeatedField<Type>* repeated =
-      Raw<google::protobuf::RepeatedField<Type> >(msg, offset);
-  return repeated->Add();
-}
-
-template <>
-inline string* AddField<string>(MessageLite* msg, int64 offset) {
-  google::protobuf::RepeatedPtrField<string>* repeated =
-      Raw<google::protobuf::RepeatedPtrField<string> >(msg, offset);
-  return repeated->Add();
-}
-
-
-template <typename Type>
-inline void AddField(MessageLite* msg, int64 offset, Type value) {
-#if LANG_CXX11
-  static_assert(has_trivial_copy<Type>::value,
-                "Do not assign");
-#endif
-  *AddField<Type>(msg, offset) = value;
-}
-
-inline void SetBit(uint32* has_bits, uint32 has_bit_index) {
-  GOOGLE_DCHECK(has_bits != NULL);
-
-  uint32 mask = static_cast<uint32>(1u) << (has_bit_index % 32);
-  has_bits[has_bit_index / 32u] |= mask;
-}
-
-template <typename Type>
-inline Type* MutableField(MessageLite* msg, uint32* has_bits,
-                          uint32 has_bit_index, int64 offset) {
-  SetBit(has_bits, has_bit_index);
-  return Raw<Type>(msg, offset);
-}
-
-template <typename Type>
-inline void SetField(MessageLite* msg, uint32* has_bits, uint32 has_bit_index,
-                     int64 offset, Type value) {
-#if LANG_CXX11
-  static_assert(has_trivial_copy<Type>::value,
-                "Do not assign");
-#endif
-  *MutableField<Type>(msg, has_bits, has_bit_index, offset) = value;
-}
-
-template <typename Type>
-inline void SetOneofField(MessageLite* msg, uint32* oneof_case,
-                          uint32 oneof_case_index, int64 offset,
-                          int field_number, Type value) {
-  oneof_case[oneof_case_index] = field_number;
-  *Raw<Type>(msg, offset) = value;
-}
-
-// 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) {
-  switch (field.processing_type & kTypeMask) {
-    case WireFormatLite::TYPE_MESSAGE:
-      if (arena == NULL) {
-        delete *Raw<MessageLite*>(msg, field.offset);
-      }
-      break;
-
-    case WireFormatLite::TYPE_STRING:
-    case WireFormatLite::TYPE_BYTES:
-      Raw<ArenaStringPtr>(msg, field.offset)
-          ->Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
-      break;
-
-    default:
-      // No cleanup needed.
-      break;
-  }
-}
-
-// Clears and reinitializes a oneof field as necessary, in preparation for
-// parsing a new value with type field_type and field number field_number.
-//
-// Note: the oneof_case argument should point directly to the _oneof_case_
-// element corresponding to this particular oneof, not to the beginning of the
-// _oneof_case_ array.
-template <ProcessingType field_type>
-inline void ResetOneofField(const ParseTable& table, int field_number,
-                            Arena* arena, MessageLite* msg, uint32* oneof_case,
-                            int64 offset, const void* default_ptr) {
-  if (*oneof_case == field_number) {
-    // The oneof is already set to the right type, so there is no need to clear
-    // it.
-    return;
-  }
-
-  if (*oneof_case != 0) {
-    ClearOneofField(table.fields[*oneof_case], arena, msg);
-  }
-  *oneof_case = field_number;
-
-  switch (field_type) {
-    case ProcessingType_STRING:
-      Raw<ArenaStringPtr>(msg, offset)
-          ->UnsafeSetDefault(static_cast<const string*>(default_ptr));
-      break;
-    case ProcessingType_MESSAGE:
-      MessageLite** submessage = Raw<MessageLite*>(msg, offset);
-      const MessageLite* prototype =
-          table.aux[field_number].messages.default_message();
-      *submessage = prototype->New(arena);
-      break;
-  }
-}
-
-template <Cardinality cardinality, bool validate, StringType ctype>
-static inline bool HandleString(io::CodedInputStream* input, MessageLite* msg,
-                                Arena* arena, uint32* has_bits,
-                                uint32 has_bit_index, int64 offset,
-                                const void* default_ptr,
-                                const char* field_name) {
-#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-  const char* sdata;
-  size_t size;
-#endif
-
-    string* value;
-    switch (cardinality) {
-      case Cardinality_SINGULAR:
-        // TODO(ckennelly): Is this optimal?
-        value =
-            MutableField<ArenaStringPtr>(msg, has_bits, has_bit_index, offset)
-                ->Mutable(static_cast<const string*>(default_ptr), arena);
-        break;
-      case Cardinality_REPEATED:
-        value = AddField<string>(msg, offset);
-        break;
-      case Cardinality_ONEOF:
-        value = Raw<ArenaStringPtr>(msg, offset)
-                    ->Mutable(static_cast<const string*>(default_ptr), arena);
-        break;
-    }
-    GOOGLE_DCHECK(value != NULL);
-
-    if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadString(input, value))) {
-      return false;
-    }
-
-#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-    sdata = value->data();
-    size = value->size();
-#endif
-
-#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-  if (validate) {
-    WireFormatLite::VerifyUtf8String(sdata, size, WireFormatLite::PARSE,
-                                     field_name);
-  }
-#endif
-
-  return true;
-}
-
-template <typename UnknownFieldHandler, typename InternalMetadata,
-          Cardinality cardinality>
-inline bool HandleEnum(const ParseTable& table, io::CodedInputStream* input,
-                       MessageLite* msg, uint32* presence,
-                       uint32 presence_index, int64 offset, uint32 tag,
-                       int field_number) {
-  int value;
-  if (GOOGLE_PREDICT_FALSE(
-          (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
-              input, &value)))) {
-    return false;
-  }
-
-  AuxillaryParseTableField::EnumValidator validator =
-      table.aux[field_number].enums.validator;
-  if (validator(value)) {
-    switch (cardinality) {
-      case Cardinality_SINGULAR:
-        SetField(msg, presence, presence_index, offset, value);
-        break;
-      case Cardinality_REPEATED:
-        AddField(msg, offset, value);
-        break;
-      case Cardinality_ONEOF:
-        ClearOneofField(table.fields[presence[presence_index]],
-                        GetArena<InternalMetadata>(msg, table.arena_offset),
-                        msg);
-        SetOneofField(msg, presence, presence_index, offset, field_number,
-                      value);
-        break;
-    }
-  } else {
-    UnknownFieldHandler::Varint(msg, table, tag, value);
-  }
-
-  return true;
-}
-
-// RepeatedMessageTypeHandler allows us to operate on RepeatedPtrField fields
-// without instantiating the specific template.
-class RepeatedMessageTypeHandler {
- public:
-  typedef MessageLite Type;
-  static Arena* GetArena(Type* t) { return t->GetArena(); }
-  static void* GetMaybeArenaPointer(Type* t) {
-    return t->GetMaybeArenaPointer();
-  }
-  static inline Type* NewFromPrototype(const Type* prototype,
-                                       Arena* arena = NULL) {
-    return prototype->New(arena);
-  }
-  static void Delete(Type* t, Arena* arena = NULL) {
-    if (arena == NULL) {
-      delete t;
-    }
-  }
-};
-
-inline bool ReadGroup(int field_number, io::CodedInputStream* input,
-                      MessageLite* value) {
-  if (GOOGLE_PREDICT_FALSE(!input->IncrementRecursionDepth())) {
-    return false;
-  }
-
-  if (GOOGLE_PREDICT_FALSE(!value->MergePartialFromCodedStream(input))) {
-    return false;
-  }
-
-  input->DecrementRecursionDepth();
-  // Make sure the last thing read was an end tag for this group.
-  if (GOOGLE_PREDICT_FALSE(!input->LastTagWas(WireFormatLite::MakeTag(
-          field_number, WireFormatLite::WIRETYPE_END_GROUP)))) {
-    return false;
-  }
-
-  return true;
-}
-
-inline bool ReadMessage(io::CodedInputStream* input, MessageLite* value) {
-  int length;
-  if (GOOGLE_PREDICT_FALSE(!input->ReadVarintSizeAsInt(&length))) {
-    return false;
-  }
-
-  std::pair<io::CodedInputStream::Limit, int> p =
-      input->IncrementRecursionDepthAndPushLimit(length);
-  if (GOOGLE_PREDICT_FALSE(p.second < 0 ||
-                    !value->MergePartialFromCodedStream(input))) {
-    return false;
-  }
-
-  // Make sure that parsing stopped when the limit was hit, not at an endgroup
-  // tag.
-  return input->DecrementRecursionDepthAndPopLimit(p.first);
-}
-
-class MergePartialFromCodedStreamHelper {
- public:
-  static MessageLite* Add(RepeatedPtrFieldBase* field,
-                          const MessageLite* prototype) {
-    return field->Add<RepeatedMessageTypeHandler>(
-        const_cast<MessageLite*>(prototype));
-  }
-};
-
-template <typename UnknownFieldHandler, typename InternalMetadata>
-bool MergePartialFromCodedStreamImpl(MessageLite* msg, const ParseTable& table,
-                                     io::CodedInputStream* input) {
-  // We require that has_bits are present, as to avoid having to check for them
-  // for every field.
-  //
-  // TODO(ckennelly):  Make this a compile-time parameter with templates.
-  GOOGLE_DCHECK_GE(table.has_bits_offset, 0);
-  uint32* has_bits = Raw<uint32>(msg, table.has_bits_offset);
-  GOOGLE_DCHECK(has_bits != NULL);
-
-  while (true) {
-    uint32 tag = input->ReadTag();
-
-    const WireFormatLite::WireType wire_type =
-        WireFormatLite::GetTagWireType(tag);
-    const int field_number = WireFormatLite::GetTagFieldNumber(tag);
-
-    if (field_number > table.max_field_number) {
-      // check for possible extensions
-      if (UnknownFieldHandler::ParseExtension(msg, table, input, tag)) {
-        // successfully parsed
-        continue;
-      }
-
-      if (GOOGLE_PREDICT_FALSE(!UnknownFieldHandler::Skip(msg, table, input, tag))) {
-        return false;
-      }
-
-      continue;
-    }
-
-    // We implicitly verify that data points to a valid field as we check the
-    // wire types.  Entries in table.fields[i] that do not correspond to valid
-    // field numbers have their normal_wiretype and packed_wiretype fields set
-    // with the kInvalidMask value.  As wire_type cannot take on that value, we
-    // will never match.
-    const ParseTableField* data = table.fields + field_number;
-
-    // TODO(ckennelly): Avoid sign extension
-    const int64 presence_index = data->presence_index;
-    const int64 offset = data->offset;
-    const unsigned char processing_type = data->processing_type;
-
-    if (data->normal_wiretype == static_cast<unsigned char>(wire_type)) {
-      // TODO(ckennelly): Use a computed goto on GCC/LLVM or otherwise eliminate
-      // the bounds check on processing_type.
-
-      switch (processing_type) {
-#define HANDLE_TYPE(TYPE, CPPTYPE)                                             \
-  case (WireFormatLite::TYPE_##TYPE): {                                        \
-    CPPTYPE value;                                                             \
-    if (GOOGLE_PREDICT_FALSE(                                                         \
-            (!WireFormatLite::ReadPrimitive<                                   \
-                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) {      \
-      return false;                                                            \
-    }                                                                          \
-    SetField(msg, has_bits, presence_index, offset, value);                    \
-    break;                                                                     \
-  }                                                                            \
-  case (WireFormatLite::TYPE_##TYPE) | kRepeatedMask: {                        \
-    google::protobuf::RepeatedField<CPPTYPE>* values =                                   \
-        Raw<google::protobuf::RepeatedField<CPPTYPE> >(msg, offset);                     \
-    if (GOOGLE_PREDICT_FALSE((!WireFormatLite::ReadRepeatedPrimitive<                 \
-                       CPPTYPE, WireFormatLite::TYPE_##TYPE>(                  \
-            data->tag_size, tag, input, values)))) {                           \
-      return false;                                                            \
-    }                                                                          \
-    break;                                                                     \
-  }                                                                            \
-  case (WireFormatLite::TYPE_##TYPE) | kOneofMask: {                           \
-    uint32* oneof_case = Raw<uint32>(msg, table.oneof_case_offset);            \
-    CPPTYPE value;                                                             \
-    if (GOOGLE_PREDICT_FALSE(                                                         \
-            (!WireFormatLite::ReadPrimitive<                                   \
-                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) {      \
-      return false;                                                            \
-    }                                                                          \
-    ClearOneofField(table.fields[oneof_case[presence_index]],                  \
-                    GetArena<InternalMetadata>(msg, table.arena_offset), msg); \
-    SetOneofField(msg, oneof_case, presence_index, offset, field_number,       \
-                  value);                                                      \
-    break;                                                                     \
-  }
-
-        HANDLE_TYPE(INT32, int32)
-        HANDLE_TYPE(INT64, int64)
-        HANDLE_TYPE(SINT32, int32)
-        HANDLE_TYPE(SINT64, int64)
-        HANDLE_TYPE(UINT32, uint32)
-        HANDLE_TYPE(UINT64, uint64)
-
-        HANDLE_TYPE(FIXED32, uint32)
-        HANDLE_TYPE(FIXED64, uint64)
-        HANDLE_TYPE(SFIXED32, int32)
-        HANDLE_TYPE(SFIXED64, int64)
-
-        HANDLE_TYPE(FLOAT, float)
-        HANDLE_TYPE(DOUBLE, double)
-
-        HANDLE_TYPE(BOOL, bool)
-#undef HANDLE_TYPE
-        case WireFormatLite::TYPE_BYTES:
-#ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-        case WireFormatLite::TYPE_STRING:
-#endif
-        {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          const void* default_ptr = table.aux[field_number].strings.default_ptr;
-
-          if (GOOGLE_PREDICT_FALSE((
-                  !HandleString<Cardinality_SINGULAR, false, StringType_STRING>(
-                      input, msg, arena, has_bits, presence_index, offset,
-                      default_ptr, NULL)))) {
-            return false;
-          }
-          break;
-        }
-        case WireFormatLite::TYPE_BYTES | kOneofMask:
-#ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-        case WireFormatLite::TYPE_STRING | kOneofMask:
-#endif
-        {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          uint32* oneof_case = Raw<uint32>(msg, table.oneof_case_offset);
-          const void* default_ptr = table.aux[field_number].strings.default_ptr;
-
-          ResetOneofField<ProcessingType_STRING>(
-              table, field_number, arena, msg, oneof_case + presence_index,
-              offset, default_ptr);
-
-          if (GOOGLE_PREDICT_FALSE(
-                  (!HandleString<Cardinality_ONEOF, false, StringType_STRING>(
-                      input, msg, arena, has_bits, presence_index, offset,
-                      default_ptr, NULL)))) {
-            return false;
-          }
-          break;
-        }
-        case (WireFormatLite::TYPE_BYTES) | kRepeatedMask:
-#ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-        case (WireFormatLite::TYPE_STRING) | kRepeatedMask:
-#endif
-        {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          const void* default_ptr =
-              table.aux[field_number].strings.default_ptr;
-
-          if (GOOGLE_PREDICT_FALSE((
-                  !HandleString<Cardinality_REPEATED, false, StringType_STRING>(
-                      input, msg, arena, has_bits, presence_index, offset,
-                      default_ptr, NULL)))) {
-            return false;
-          }
-          break;
-        }
-#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-        case (WireFormatLite::TYPE_STRING): {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          const void* default_ptr = table.aux[field_number].strings.default_ptr;
-          const char* field_name = table.aux[field_number].strings.field_name;
-
-          if (GOOGLE_PREDICT_FALSE(
-                  (!HandleString<Cardinality_SINGULAR, true, StringType_STRING>(
-                      input, msg, arena, has_bits, presence_index, offset,
-                      default_ptr, field_name)))) {
-            return false;
-          }
-          break;
-        }
-        case (WireFormatLite::TYPE_STRING) | kRepeatedMask: {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          const void* default_ptr = table.aux[field_number].strings.default_ptr;
-          const char* field_name = table.aux[field_number].strings.field_name;
-
-          if (GOOGLE_PREDICT_FALSE(
-                  (!HandleString<Cardinality_REPEATED, true, StringType_STRING>(
-                      input, msg, arena, has_bits, presence_index, offset,
-                      default_ptr, field_name)))) {
-            return false;
-          }
-          break;
-        }
-        case (WireFormatLite::TYPE_STRING) | kOneofMask: {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          uint32* oneof_case = Raw<uint32>(msg, table.oneof_case_offset);
-          const void* default_ptr = table.aux[field_number].strings.default_ptr;
-          const char* field_name = table.aux[field_number].strings.field_name;
-
-          ResetOneofField<ProcessingType_STRING>(
-              table, field_number, arena, msg, oneof_case + presence_index,
-              offset, default_ptr);
-
-          if (GOOGLE_PREDICT_FALSE(
-                  (!HandleString<Cardinality_ONEOF, true, StringType_STRING>(
-                      input, msg, arena, has_bits, presence_index, offset,
-                      default_ptr, field_name)))) {
-            return false;
-          }
-          break;
-        }
-#endif
-        case WireFormatLite::TYPE_ENUM: {
-          if (GOOGLE_PREDICT_FALSE((!HandleEnum<UnknownFieldHandler, InternalMetadata,
-                                         Cardinality_SINGULAR>(
-                  table, input, msg, has_bits, presence_index, offset, tag,
-                  field_number)))) {
-            return false;
-          }
-          break;
-        }
-        case WireFormatLite::TYPE_ENUM | kRepeatedMask: {
-          if (GOOGLE_PREDICT_FALSE((!HandleEnum<UnknownFieldHandler, InternalMetadata,
-                                         Cardinality_REPEATED>(
-                  table, input, msg, has_bits, presence_index, offset, tag,
-                  field_number)))) {
-            return false;
-          }
-          break;
-        }
-        case WireFormatLite::TYPE_ENUM | kOneofMask: {
-          uint32* oneof_case = Raw<uint32>(msg, table.oneof_case_offset);
-          if (GOOGLE_PREDICT_FALSE((!HandleEnum<UnknownFieldHandler, InternalMetadata,
-                                         Cardinality_ONEOF>(
-                  table, input, msg, oneof_case, presence_index, offset, tag,
-                  field_number)))) {
-            return false;
-          }
-          break;
-        }
-        case WireFormatLite::TYPE_GROUP: {
-          MessageLite** submsg_holder =
-              MutableField<MessageLite*>(msg, has_bits, presence_index, offset);
-          MessageLite* submsg = *submsg_holder;
-
-          if (submsg == NULL) {
-            Arena* const arena =
-                GetArena<InternalMetadata>(msg, table.arena_offset);
-            const MessageLite* prototype =
-                table.aux[field_number].messages.default_message();
-            submsg = prototype->New(arena);
-            *submsg_holder = submsg;
-          }
-
-          if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadGroup(
-              field_number, input, submsg))) {
-            return false;
-          }
-
-          break;
-        }
-        case WireFormatLite::TYPE_GROUP | kRepeatedMask: {
-          RepeatedPtrFieldBase* field = Raw<RepeatedPtrFieldBase>(msg, offset);
-          const MessageLite* prototype =
-              table.aux[field_number].messages.default_message();
-          GOOGLE_DCHECK(prototype != NULL);
-
-          MessageLite* submsg =
-              MergePartialFromCodedStreamHelper::Add(field, prototype);
-
-          if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadGroup(
-              field_number, input, submsg))) {
-            return false;
-          }
-
-          break;
-        }
-        case WireFormatLite::TYPE_MESSAGE: {
-          MessageLite** submsg_holder =
-              MutableField<MessageLite*>(msg, has_bits, presence_index, offset);
-          MessageLite* submsg = *submsg_holder;
-
-          if (submsg == NULL) {
-            Arena* const arena =
-                GetArena<InternalMetadata>(msg, table.arena_offset);
-            const MessageLite* prototype =
-                table.aux[field_number].messages.default_message();
-            submsg = prototype->New(arena);
-            *submsg_holder = submsg;
-          }
-
-          if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadMessage(input, submsg))) {
-            return false;
-          }
-
-          break;
-        }
-        // TODO(ckennelly):  Adapt ReadMessageNoVirtualNoRecursionDepth and
-        // manage input->IncrementRecursionDepth() here.
-        case WireFormatLite::TYPE_MESSAGE | kRepeatedMask: {
-          RepeatedPtrFieldBase* field = Raw<RepeatedPtrFieldBase>(msg, offset);
-          const MessageLite* prototype =
-              table.aux[field_number].messages.default_message();
-          GOOGLE_DCHECK(prototype != NULL);
-
-          MessageLite* submsg =
-              MergePartialFromCodedStreamHelper::Add(field, prototype);
-
-          if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadMessage(input, submsg))) {
-            return false;
-          }
-
-          break;
-        }
-        case WireFormatLite::TYPE_MESSAGE | kOneofMask: {
-          Arena* const arena =
-              GetArena<InternalMetadata>(msg, table.arena_offset);
-          uint32* oneof_case = Raw<uint32>(msg, table.oneof_case_offset);
-          MessageLite** submsg_holder = Raw<MessageLite*>(msg, offset);
-          ResetOneofField<ProcessingType_MESSAGE>(
-              table, field_number, arena, msg, oneof_case + presence_index,
-              offset, NULL);
-          MessageLite* submsg = *submsg_holder;
-
-          if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadMessage(input, submsg))) {
-            return false;
-          }
-
-          break;
-        }
-        case TYPE_MAP: {
-          if (GOOGLE_PREDICT_FALSE(!(*table.aux[field_number].maps.parse_map)(
-                  input, Raw<void>(msg, offset)))) {
-            return false;
-          }
-          break;
-        }
-        case 0: {
-          // Done.
-          return true;
-        }
-        default:
-          break;
-      }
-    } else if (data->packed_wiretype == static_cast<unsigned char>(wire_type)) {
-      // Non-packable fields have their packed_wiretype masked with
-      // kNotPackedMask, which is impossible to match here.
-      GOOGLE_DCHECK(processing_type & kRepeatedMask);
-      GOOGLE_DCHECK_NE(processing_type, kRepeatedMask);
-      GOOGLE_DCHECK_EQ(0, processing_type & kOneofMask);
-
-
-
-      // 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)) {
-#define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD)                 \
-  case WireFormatLite::TYPE_##TYPE: {                                     \
-    google::protobuf::RepeatedField<CPPTYPE>* values =                              \
-        Raw<google::protobuf::RepeatedField<CPPTYPE> >(msg, offset);                \
-    if (GOOGLE_PREDICT_FALSE(                                                    \
-            (!WireFormatLite::ReadPackedPrimitive<                        \
-                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, values)))) { \
-      return false;                                                       \
-    }                                                                     \
-    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(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(FLOAT, float, Float)
-        HANDLE_PACKED_TYPE(DOUBLE, double, Double)
-
-        HANDLE_PACKED_TYPE(BOOL, bool, Bool)
-#undef HANDLE_PACKED_TYPE
-        case WireFormatLite::TYPE_ENUM: {
-          // To avoid unnecessarily calling MutableUnknownFields (which mutates
-          // InternalMetadataWithArena) when all inputs in the repeated series
-          // are valid, we implement our own parser rather than call
-          // WireFormat::ReadPackedEnumPreserveUnknowns.
-          uint32 length;
-          if (GOOGLE_PREDICT_FALSE(!input->ReadVarint32(&length))) {
-            return false;
-          }
-
-          AuxillaryParseTableField::EnumValidator validator =
-              table.aux[field_number].enums.validator;
-          google::protobuf::RepeatedField<int>* values =
-              Raw<google::protobuf::RepeatedField<int> >(msg, offset);
-
-          io::CodedInputStream::Limit limit = input->PushLimit(length);
-          while (input->BytesUntilLimit() > 0) {
-            int value;
-            if (GOOGLE_PREDICT_FALSE(
-                    (!google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                        int, WireFormatLite::TYPE_ENUM>(input, &value)))) {
-              return false;
-            }
-
-            if (validator(value)) {
-              values->Add(value);
-            } else {
-              // TODO(ckennelly): Consider caching here.
-              UnknownFieldHandler::Varint(msg, table, tag, value);
-            }
-          }
-          input->PopLimit(limit);
-
-          break;
-        }
-        case WireFormatLite::TYPE_STRING:
-        case WireFormatLite::TYPE_GROUP:
-        case WireFormatLite::TYPE_MESSAGE:
-        case WireFormatLite::TYPE_BYTES:
-          GOOGLE_DCHECK(false);
-          return false;
-        default:
-          break;
-      }
-    } else {
-      if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) {
-        // Must be the end of the message.
-        return true;
-      }
-
-      // check for possible extensions
-      if (UnknownFieldHandler::ParseExtension(msg, table, input, tag)) {
-        // successfully parsed
-        continue;
-      }
-
-      // process unknown field.
-      if (GOOGLE_PREDICT_FALSE(!UnknownFieldHandler::Skip(msg, table, input, tag))) {
-        return false;
-      }
-    }
-  }
-}
-
-}  // namespace internal
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
diff --git a/src/google/protobuf/generated_message_util.cc b/src/google/protobuf/generated_message_util.cc
index 15d8422..7b813f8 100644
--- a/src/google/protobuf/generated_message_util.cc
+++ b/src/google/protobuf/generated_message_util.cc
@@ -35,25 +35,12 @@
 #include <google/protobuf/generated_message_util.h>
 
 #include <limits>
-#include <vector>
 
-#include <google/protobuf/io/coded_stream_inl.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/stubs/port.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/wire_format_lite_inl.h>
 
 namespace google {
-
 namespace protobuf {
 namespace internal {
 
-
 double Infinity() {
   return std::numeric_limits<double>::infinity();
 }
@@ -61,17 +48,19 @@
   return std::numeric_limits<double>::quiet_NaN();
 }
 
-ExplicitlyConstructed< ::std::string> fixed_address_empty_string;
+const ::std::string* empty_string_;
 GOOGLE_PROTOBUF_DECLARE_ONCE(empty_string_once_init_);
 
-void DeleteEmptyString() { fixed_address_empty_string.Destruct(); }
+void DeleteEmptyString() {
+  delete empty_string_;
+}
 
 void InitEmptyString() {
-  fixed_address_empty_string.DefaultConstruct();
+  empty_string_ = new string;
   OnShutdown(&DeleteEmptyString);
 }
 
-size_t StringSpaceUsedExcludingSelfLong(const string& str) {
+int StringSpaceUsedExcludingSelf(const string& str) {
   const void* start = &str;
   const void* end = &str + 1;
   if (start <= str.data() && str.data() < end) {
@@ -84,647 +73,6 @@
 
 
 
-void InitProtobufDefaults() {
-  GetEmptyString();
-}
-
-template <typename T>
-const T& Get(const void* ptr) {
-  return *static_cast<const T*>(ptr);
-}
-
-// PrimitiveTypeHelper is a wrapper around the interface of WireFormatLite.
-// WireFormatLite has a very inconvenient interface with respect to template
-// meta-programming. This class wraps the different named functions into
-// a single Serialize / SerializeToArray interface.
-template <int type>
-struct PrimitiveTypeHelper;
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_BOOL> {
-  typedef bool Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteBoolNoTag(Get<bool>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteBoolNoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_INT32> {
-  typedef int32 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteInt32NoTag(Get<int32>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteInt32NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_SINT32> {
-  typedef int32 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteSInt32NoTag(Get<int32>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteSInt32NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_UINT32> {
-  typedef uint32 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteUInt32NoTag(Get<uint32>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteUInt32NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_INT64> {
-  typedef int64 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteInt64NoTag(Get<int64>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteInt64NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_SINT64> {
-  typedef int64 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteSInt64NoTag(Get<int64>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteSInt64NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_UINT64> {
-  typedef uint64 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteUInt64NoTag(Get<uint64>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteUInt64NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_FIXED32> {
-  typedef uint32 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteFixed32NoTag(Get<uint32>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteFixed32NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_FIXED64> {
-  typedef uint64 Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    WireFormatLite::WriteFixed64NoTag(Get<uint64>(ptr), output);
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    return WireFormatLite::WriteFixed64NoTagToArray(Get<Type>(ptr), buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_ENUM>
-    : PrimitiveTypeHelper<WireFormatLite::TYPE_INT32> {};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_SFIXED32>
-    : PrimitiveTypeHelper<WireFormatLite::TYPE_FIXED32> {
-  typedef int32 Type;
-};
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_SFIXED64>
-    : PrimitiveTypeHelper<WireFormatLite::TYPE_FIXED64> {
-  typedef int64 Type;
-};
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_FLOAT>
-    : PrimitiveTypeHelper<WireFormatLite::TYPE_FIXED32> {
-  typedef float Type;
-};
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_DOUBLE>
-    : PrimitiveTypeHelper<WireFormatLite::TYPE_FIXED64> {
-  typedef double Type;
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_STRING> {
-  typedef string Type;
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    const Type& value = *static_cast<const Type*>(ptr);
-    output->WriteVarint32(value.size());
-    output->WriteRawMaybeAliased(value.data(), value.size());
-  }
-  static uint8* SerializeToArray(const void* ptr, uint8* buffer) {
-    const Type& value = *static_cast<const Type*>(ptr);
-    return io::CodedOutputStream::WriteStringWithSizeToArray(value, buffer);
-  }
-};
-
-template <>
-struct PrimitiveTypeHelper<WireFormatLite::TYPE_BYTES>
-    : PrimitiveTypeHelper<WireFormatLite::TYPE_STRING> {};
-
-
-// We want to serialize to both CodedOutputStream and directly into byte arrays
-// without duplicating the code. In fact we might want extra output channels in
-// the future.
-template <typename O, int type>
-struct OutputHelper;
-
-template <int type, typename O>
-void SerializeTo(const void* ptr, O* output) {
-  OutputHelper<O, type>::Serialize(ptr, output);
-}
-
-template <typename O>
-void WriteTagTo(uint32 tag, O* output) {
-  SerializeTo<WireFormatLite::TYPE_UINT32>(&tag, output);
-}
-
-template <typename O>
-void WriteLengthTo(uint32 length, O* output) {
-  SerializeTo<WireFormatLite::TYPE_UINT32>(&length, output);
-}
-
-// Specialization for coded output stream
-template <int type>
-struct OutputHelper< ::google::protobuf::io::CodedOutputStream, type> {
-  static void Serialize(const void* ptr,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-    PrimitiveTypeHelper<type>::Serialize(ptr, output);
-  }
-};
-
-// Specialization for writing into a plain array
-struct ArrayOutput {
-  uint8* ptr;
-  bool is_deterministic;
-};
-
-template <int type>
-struct OutputHelper<ArrayOutput, type> {
-  static void Serialize(const void* ptr, ArrayOutput* output) {
-    output->ptr = PrimitiveTypeHelper<type>::SerializeToArray(ptr, output->ptr);
-  }
-};
-
-void SerializeMessageNoTable(const MessageLite* msg,
-                             ::google::protobuf::io::CodedOutputStream* output) {
-  msg->SerializeWithCachedSizes(output);
-}
-
-void SerializeMessageNoTable(const MessageLite* msg, ArrayOutput* output) {
-  output->ptr = msg->InternalSerializeWithCachedSizesToArray(
-      output->is_deterministic, output->ptr);
-}
-
-// Helper to branch to fast path if possible
-void SerializeMessageDispatch(const ::google::protobuf::MessageLite& msg,
-                              const FieldMetadata* field_table, int num_fields,
-                              int32 cached_size,
-                              ::google::protobuf::io::CodedOutputStream* output) {
-  const uint8* base = reinterpret_cast<const uint8*>(&msg);
-  // Try the fast path
-  uint8* ptr = output->GetDirectBufferForNBytesAndAdvance(cached_size);
-  if (ptr) {
-    // We use virtual dispatch to enable dedicated generated code for the
-    // fast path.
-    msg.InternalSerializeWithCachedSizesToArray(
-        output->IsSerializationDeterministic(), ptr);
-    return;
-  }
-  SerializeInternal(base, field_table, num_fields, output);
-}
-
-// Helper to branch to fast path if possible
-void SerializeMessageDispatch(const ::google::protobuf::MessageLite& msg,
-                              const FieldMetadata* field_table, int num_fields,
-                              int32 cached_size, ArrayOutput* output) {
-  const uint8* base = reinterpret_cast<const uint8*>(&msg);
-  output->ptr = SerializeInternalToArray(base, field_table, num_fields,
-                                         output->is_deterministic, output->ptr);
-}
-
-// Serializing messages is special as it's not a primitive type and needs an
-// explicit overload for each output type.
-template <typename O>
-void SerializeMessageTo(const MessageLite* msg, const void* table_ptr,
-                        O* output) {
-  const SerializationTable* table =
-      static_cast<const SerializationTable*>(table_ptr);
-  if (!table) {
-    // Proto1
-    WriteLengthTo(msg->GetCachedSize(), output);
-    SerializeMessageNoTable(msg, output);
-    return;
-  }
-  const FieldMetadata* field_table = table->field_table;
-  const uint8* base = reinterpret_cast<const uint8*>(msg);
-  int cached_size = *reinterpret_cast<const int32*>(base + field_table->offset);
-  WriteLengthTo(cached_size, output);
-  int num_fields = table->num_fields - 1;
-  SerializeMessageDispatch(*msg, field_table + 1, num_fields, cached_size,
-                           output);
-}
-
-// Almost the same as above only it doesn't output the length field.
-template <typename O>
-void SerializeGroupTo(const MessageLite* msg, const void* table_ptr,
-                      O* output) {
-  const SerializationTable* table =
-      static_cast<const SerializationTable*>(table_ptr);
-  if (!table) {
-    // Proto1
-    SerializeMessageNoTable(msg, output);
-    return;
-  }
-  const FieldMetadata* field_table = table->field_table;
-  const uint8* base = reinterpret_cast<const uint8*>(msg);
-  int cached_size = *reinterpret_cast<const int32*>(base + field_table->offset);
-  int num_fields = table->num_fields - 1;
-  SerializeMessageDispatch(*msg, field_table + 1, num_fields, cached_size,
-                           output);
-}
-
-template <int type>
-struct SingularFieldHelper {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    WriteTagTo(md.tag, output);
-    SerializeTo<type>(field, output);
-  }
-};
-
-template <>
-struct SingularFieldHelper<WireFormatLite::TYPE_STRING> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    WriteTagTo(md.tag, output);
-    SerializeTo<WireFormatLite::TYPE_STRING>(&Get<ArenaStringPtr>(field).Get(),
-                                             output);
-  }
-};
-
-template <>
-struct SingularFieldHelper<WireFormatLite::TYPE_BYTES>
-    : SingularFieldHelper<WireFormatLite::TYPE_STRING> {};
-
-template <>
-struct SingularFieldHelper<WireFormatLite::TYPE_GROUP> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    WriteTagTo(md.tag, output);
-    SerializeGroupTo(Get<const MessageLite*>(field),
-                     static_cast<const SerializationTable*>(md.ptr), output);
-    WriteTagTo(md.tag + 1, output);
-  }
-};
-
-template <>
-struct SingularFieldHelper<WireFormatLite::TYPE_MESSAGE> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    WriteTagTo(md.tag, output);
-    SerializeMessageTo(Get<const MessageLite*>(field),
-                       static_cast<const SerializationTable*>(md.ptr), output);
-  }
-};
-
-template <int type>
-struct RepeatedFieldHelper {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    typedef typename PrimitiveTypeHelper<type>::Type T;
-    const RepeatedField<T>& array = Get<RepeatedField<T> >(field);
-    for (int i = 0; i < array.size(); i++) {
-      WriteTagTo(md.tag, output);
-      SerializeTo<type>(&array[i], output);
-    }
-  }
-};
-
-// We need to use a helper class to get access to the private members
-class AccessorHelper {
- public:
-  static int Size(const RepeatedPtrFieldBase& x) { return x.size(); }
-  static void const* Get(const RepeatedPtrFieldBase& x, int idx) {
-    return x.raw_data()[idx];
-  }
-};
-
-template <>
-struct RepeatedFieldHelper<WireFormatLite::TYPE_STRING> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    const internal::RepeatedPtrFieldBase& array =
-        Get<internal::RepeatedPtrFieldBase>(field);
-    for (int i = 0; i < AccessorHelper::Size(array); i++) {
-      WriteTagTo(md.tag, output);
-      SerializeTo<WireFormatLite::TYPE_STRING>(AccessorHelper::Get(array, i),
-                                               output);
-    }
-  }
-};
-
-template <>
-struct RepeatedFieldHelper<WireFormatLite::TYPE_BYTES>
-    : RepeatedFieldHelper<WireFormatLite::TYPE_STRING> {};
-
-template <>
-struct RepeatedFieldHelper<WireFormatLite::TYPE_GROUP> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    const internal::RepeatedPtrFieldBase& array =
-        Get<internal::RepeatedPtrFieldBase>(field);
-    for (int i = 0; i < AccessorHelper::Size(array); i++) {
-      WriteTagTo(md.tag, output);
-      SerializeGroupTo(
-          static_cast<const MessageLite*>(AccessorHelper::Get(array, i)),
-          static_cast<const SerializationTable*>(md.ptr), output);
-      WriteTagTo(md.tag + 1, output);
-    }
-  }
-};
-
-template <>
-struct RepeatedFieldHelper<WireFormatLite::TYPE_MESSAGE> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    const internal::RepeatedPtrFieldBase& array =
-        Get<internal::RepeatedPtrFieldBase>(field);
-    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);
-    }
-  }
-};
-
-
-template <int type>
-struct PackedFieldHelper {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    typedef typename PrimitiveTypeHelper<type>::Type T;
-    const RepeatedField<T>& array = Get<RepeatedField<T> >(field);
-    if (array.empty()) return;
-    WriteTagTo(md.tag, output);
-    int cached_size =
-        Get<int>(static_cast<const uint8*>(field) + sizeof(RepeatedField<T>));
-    WriteLengthTo(cached_size, output);
-    for (int i = 0; i < array.size(); i++) {
-      SerializeTo<type>(&array[i], output);
-    }
-  }
-};
-
-template <>
-struct PackedFieldHelper<WireFormatLite::TYPE_STRING> {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    GOOGLE_LOG(FATAL) << "Not implemented field number " << md.tag << " with type "
-               << md.type;
-  }
-};
-
-template <>
-struct PackedFieldHelper<WireFormatLite::TYPE_BYTES>
-    : PackedFieldHelper<WireFormatLite::TYPE_STRING> {};
-template <>
-struct PackedFieldHelper<WireFormatLite::TYPE_GROUP>
-    : PackedFieldHelper<WireFormatLite::TYPE_STRING> {};
-template <>
-struct PackedFieldHelper<WireFormatLite::TYPE_MESSAGE>
-    : PackedFieldHelper<WireFormatLite::TYPE_STRING> {};
-
-template <int type>
-struct OneOfFieldHelper {
-  template <typename O>
-  static void Serialize(const void* field, const FieldMetadata& md, O* output) {
-    SingularFieldHelper<type>::Serialize(field, md, output);
-  }
-};
-
-
-void SerializeNotImplemented(int field) {
-  GOOGLE_LOG(FATAL) << "Not implemented field number " << field;
-}
-
-// When switching to c++11 we should make these constexpr functions
-#define SERIALIZE_TABLE_OP(type, type_class) \
-  ((type - 1) + static_cast<int>(type_class) * FieldMetadata::kNumTypes)
-
-int FieldMetadata::CalculateType(int type,
-                                 FieldMetadata::FieldTypeClass type_class) {
-  return SERIALIZE_TABLE_OP(type, type_class);
-}
-
-template <int type>
-bool IsNull(const void* ptr) {
-  return *static_cast<const typename PrimitiveTypeHelper<type>::Type*>(ptr) ==
-         0;
-}
-
-template <>
-bool IsNull<WireFormatLite::TYPE_STRING>(const void* ptr) {
-  return static_cast<const ArenaStringPtr*>(ptr)->Get().size() == 0;
-}
-
-template <>
-bool IsNull<WireFormatLite::TYPE_BYTES>(const void* ptr) {
-  return static_cast<const ArenaStringPtr*>(ptr)->Get().size() == 0;
-}
-
-template <>
-bool IsNull<WireFormatLite::TYPE_GROUP>(const void* ptr) {
-  return Get<const MessageLite*>(ptr) == NULL;
-}
-
-template <>
-bool IsNull<WireFormatLite::TYPE_MESSAGE>(const void* ptr) {
-  return Get<const MessageLite*>(ptr) == NULL;
-}
-
-
-#define SERIALIZERS_FOR_TYPE(type)                                            \
-  case SERIALIZE_TABLE_OP(type, FieldMetadata::kPresence):                    \
-    if (!IsPresent(base, field_metadata.has_offset)) continue;                \
-    SingularFieldHelper<type>::Serialize(ptr, field_metadata, output);        \
-    break;                                                                    \
-  case SERIALIZE_TABLE_OP(type, FieldMetadata::kNoPresence):                  \
-    if (IsNull<type>(ptr)) continue;                                          \
-    SingularFieldHelper<type>::Serialize(ptr, field_metadata, output);        \
-    break;                                                                    \
-  case SERIALIZE_TABLE_OP(type, FieldMetadata::kRepeated):                    \
-    RepeatedFieldHelper<type>::Serialize(ptr, field_metadata, output);        \
-    break;                                                                    \
-  case SERIALIZE_TABLE_OP(type, FieldMetadata::kPacked):                      \
-    PackedFieldHelper<type>::Serialize(ptr, field_metadata, output);          \
-    break;                                                                    \
-  case SERIALIZE_TABLE_OP(type, FieldMetadata::kOneOf):                       \
-    if (!IsOneofPresent(base, field_metadata.has_offset, field_metadata.tag)) \
-      continue;                                                               \
-    OneOfFieldHelper<type>::Serialize(ptr, field_metadata, output);           \
-    break
-
-void SerializeInternal(const uint8* base,
-                       const FieldMetadata* field_metadata_table,
-                       int32 num_fields,
-                       ::google::protobuf::io::CodedOutputStream* output) {
-  for (int i = 0; i < num_fields; i++) {
-    const FieldMetadata& field_metadata = field_metadata_table[i];
-    const uint8* ptr = base + field_metadata.offset;
-    switch (field_metadata.type) {
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_DOUBLE);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FLOAT);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BOOL);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_STRING);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_GROUP);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_MESSAGE);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BYTES);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_ENUM);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT64);
-
-      // Special cases
-      case FieldMetadata::kSpecial:
-        reinterpret_cast<SpecialSerializer>(
-            const_cast<void*>(field_metadata.ptr))(
-            base, field_metadata.offset, field_metadata.tag,
-            field_metadata.has_offset, output);
-        break;
-      default:
-        // __builtin_unreachable()
-        SerializeNotImplemented(field_metadata.type);
-    }
-  }
-}
-
-uint8* SerializeInternalToArray(const uint8* base,
-                                const FieldMetadata* field_metadata_table,
-                                int32 num_fields, bool is_deterministic,
-                                uint8* buffer) {
-  ArrayOutput array_output = {buffer, is_deterministic};
-  ArrayOutput* output = &array_output;
-  for (int i = 0; i < num_fields; i++) {
-    const FieldMetadata& field_metadata = field_metadata_table[i];
-    const uint8* ptr = base + field_metadata.offset;
-    switch (field_metadata.type) {
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_DOUBLE);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FLOAT);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BOOL);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_STRING);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_GROUP);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_MESSAGE);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BYTES);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_ENUM);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED64);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT32);
-      SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT64);
-      // Special cases
-      case FieldMetadata::kSpecial: {
-        io::ArrayOutputStream array_stream(array_output.ptr, INT_MAX);
-        io::CodedOutputStream output(&array_stream);
-        output.SetSerializationDeterministic(is_deterministic);
-        reinterpret_cast<SpecialSerializer>(
-            const_cast<void*>(field_metadata.ptr))(
-            base, field_metadata.offset, field_metadata.tag,
-            field_metadata.has_offset, &output);
-        array_output.ptr += output.ByteCount();
-      } break;
-      default:
-        // __builtin_unreachable()
-        SerializeNotImplemented(field_metadata.type);
-    }
-  }
-  return array_output.ptr;
-}
-#undef SERIALIZERS_FOR_TYPE
-
-void ExtensionSerializer(const uint8* ptr, uint32 offset, uint32 tag,
-                         uint32 has_offset,
-                         ::google::protobuf::io::CodedOutputStream* output) {
-  reinterpret_cast<const ExtensionSet*>(ptr + offset)
-      ->SerializeWithCachedSizes(tag, has_offset, output);
-}
-
-void UnknownFieldSerializerLite(const uint8* ptr, uint32 offset, uint32 tag,
-                                uint32 has_offset,
-                                ::google::protobuf::io::CodedOutputStream* output) {
-  output->WriteString(
-      reinterpret_cast<const InternalMetadataWithArenaLite*>(ptr + offset)
-          ->unknown_fields());
-}
-
-MessageLite* DuplicateIfNonNullInternal(MessageLite* message, Arena* arena) {
-  if (message) {
-    MessageLite* ret = message->New(arena);
-    ret->CheckTypeAndMergeFrom(*message);
-    return ret;
-  } else {
-    return NULL;
-  }
-}
-
-// Returns a message owned by this Arena.  This may require Own()ing or
-// duplicating the message.
-MessageLite* GetOwnedMessageInternal(Arena* message_arena,
-                                     MessageLite* submessage,
-                                     Arena* submessage_arena) {
-  GOOGLE_DCHECK(submessage->GetArena() == submessage_arena);
-  GOOGLE_DCHECK(message_arena != submessage_arena);
-  if (message_arena != NULL && submessage_arena == NULL) {
-    message_arena->Own(submessage);
-    return submessage;
-  } else {
-    MessageLite* ret = submessage->New(message_arena);
-    ret->CheckTypeAndMergeFrom(*submessage);
-    return ret;
-  }
-}
-
 }  // namespace internal
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h
index 8ebfc13..4475556 100644
--- a/src/google/protobuf/generated_message_util.h
+++ b/src/google/protobuf/generated_message_util.h
@@ -39,24 +39,16 @@
 #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__
 
 #include <assert.h>
-#include <climits>
 #include <string>
-#include <vector>
 
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/once.h>
-#include <google/protobuf/has_bits.h>
-#include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/wire_format_lite.h>
+#include <google/protobuf/stubs/common.h>
 
 namespace google {
 
 namespace protobuf {
 
 class Arena;
-
 namespace io { class CodedInputStream; }
 
 namespace internal {
@@ -71,42 +63,36 @@
 #undef DEPRECATED_PROTOBUF_FIELD
 #define PROTOBUF_DEPRECATED
 
-#define GOOGLE_PROTOBUF_DEPRECATED_ATTR
+#define PROTOBUF_DEPRECATED_ATTR
 
 
-// Returns the offset of the given field within the given aggregate type.
-// This is equivalent to the ANSI C offsetof() macro.  However, according
-// to the C++ standard, offsetof() only works on POD types, and GCC
-// enforces this requirement with a warning.  In practice, this rule is
-// unnecessarily strict; there is probably no compiler or platform on
-// which the offsets of the direct fields of a class are non-constant.
-// Fields inherited from superclasses *can* have non-constant offsets,
-// but that's not what this macro will be used for.
-#if defined(__clang__)
-// For Clang we use __builtin_offsetof() and suppress the warning,
-// to avoid Control Flow Integrity and UBSan vptr sanitizers from
-// crashing while trying to validate the invalid reinterpet_casts.
-#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)  \
-  _Pragma("clang diagnostic push")                                   \
-  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"")         \
-  __builtin_offsetof(TYPE, FIELD)                                    \
-  _Pragma("clang diagnostic pop")
-#else
-// Note that we calculate relative to the pointer value 16 here since if we
-// just use zero, GCC complains about dereferencing a NULL pointer.  We
-// choose 16 rather than some other number just in case the compiler would
-// be confused by an unaligned pointer.
-#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)  \
-  static_cast< ::google::protobuf::uint32>(                           \
-      reinterpret_cast<const char*>(                                 \
-          &reinterpret_cast<const TYPE*>(16)->FIELD) -               \
-      reinterpret_cast<const char*>(16))
-#endif
-
 // Constants for special floating point values.
 LIBPROTOBUF_EXPORT double Infinity();
 LIBPROTOBUF_EXPORT double NaN();
 
+// TODO(jieluo): Change to template. We have tried to use template,
+// but it causes net/rpc/python:rpcutil_test fail (the empty string will
+// init twice). It may related to swig. Change to template after we
+// found the solution.
+
+// Default empty string object. Don't use the pointer directly. Instead, call
+// GetEmptyString() to get the reference.
+LIBPROTOBUF_EXPORT extern const ::std::string* empty_string_;
+LIBPROTOBUF_EXPORT extern ProtobufOnceType empty_string_once_init_;
+LIBPROTOBUF_EXPORT void InitEmptyString();
+
+
+LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyStringAlreadyInited() {
+  assert(empty_string_ != NULL);
+  return *empty_string_;
+}
+LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyString() {
+  ::google::protobuf::GoogleOnceInit(&empty_string_once_init_, &InitEmptyString);
+  return GetEmptyStringAlreadyInited();
+}
+
+LIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str);
+
 
 // True if IsInitialized() is true for all elements of t.  Type is expected
 // to be a RepeatedPtrField<some message type>.  It's useful to have this
@@ -120,198 +106,14 @@
   return true;
 }
 
-LIBPROTOBUF_EXPORT void InitProtobufDefaults();
+class ArenaString;
 
-struct LIBPROTOBUF_EXPORT FieldMetadata {
-  uint32 offset;  // offset of this field in the struct
-  uint32 tag;     // field * 8 + wire_type
-  // byte offset * 8 + bit_offset;
-  // if the high bit is set then this is the byte offset of the oneof_case
-  // for this field.
-  uint32 has_offset;
-  uint32 type;      // the type of this field.
-  const void* ptr;  // auxiliary data
-
-  // From the serializer point of view each fundamental type can occur in
-  // 4 different ways. For simplicity we treat all combinations as a cartesion
-  // product although not all combinations are allowed.
-  enum FieldTypeClass {
-    kPresence,
-    kNoPresence,
-    kRepeated,
-    kPacked,
-    kOneOf,
-    kNumTypeClasses  // must be last enum
-  };
-  // C++ protobuf has 20 fundamental types, were we added Cord and StringPiece
-  // and also distinquish the same types if they have different wire format.
-  enum {
-    kCordType = 19,
-    kStringPieceType = 20,
-    kNumTypes = 20,
-    kSpecial = kNumTypes * kNumTypeClasses,
-  };
-
-  static int CalculateType(int fundamental_type, FieldTypeClass type_class);
-};
-
-inline bool IsPresent(const void* base, uint32 hasbit) {
-  const uint32* has_bits_array = static_cast<const uint32*>(base);
-  return has_bits_array[hasbit / 32] & (1u << (hasbit & 31));
-}
-
-inline bool IsOneofPresent(const void* base, uint32 offset, uint32 tag) {
-  const uint32* oneof =
-      reinterpret_cast<const uint32*>(static_cast<const uint8*>(base) + offset);
-  return *oneof == tag >> 3;
-}
-
-typedef void (*SpecialSerializer)(const uint8* base, uint32 offset, uint32 tag,
-                                  uint32 has_offset,
-                                  ::google::protobuf::io::CodedOutputStream* output);
-
-LIBPROTOBUF_EXPORT void ExtensionSerializer(const uint8* base, uint32 offset, uint32 tag,
-                         uint32 has_offset,
-                         ::google::protobuf::io::CodedOutputStream* output);
-LIBPROTOBUF_EXPORT void UnknownFieldSerializerLite(const uint8* base, uint32 offset, uint32 tag,
-                                uint32 has_offset,
-                                ::google::protobuf::io::CodedOutputStream* output);
-
-struct SerializationTable {
-  int num_fields;
-  const FieldMetadata* field_table;
-};
-
-LIBPROTOBUF_EXPORT void SerializeInternal(const uint8* base, const FieldMetadata* table,
-                       int num_fields, ::google::protobuf::io::CodedOutputStream* output);
-
-inline void TableSerialize(const ::google::protobuf::MessageLite& msg,
-                           const SerializationTable* table,
-                           ::google::protobuf::io::CodedOutputStream* output) {
-  const FieldMetadata* field_table = table->field_table;
-  int num_fields = table->num_fields - 1;
-  const uint8* base = reinterpret_cast<const uint8*>(&msg);
-  // TODO(gerbens) This skips the first test if we could use the fast
-  // array serialization path, we should make this
-  // int cached_size =
-  //    *reinterpret_cast<const int32*>(base + field_table->offset);
-  // SerializeWithCachedSize(msg, field_table + 1, num_fields, cached_size, ...)
-  // But we keep conformance with the old way for now.
-  SerializeInternal(base, field_table + 1, num_fields, output);
-}
-
-uint8* SerializeInternalToArray(const uint8* base, const FieldMetadata* table,
-                                int num_fields, bool is_deterministic,
-                                uint8* buffer);
-
-inline uint8* TableSerializeToArray(const ::google::protobuf::MessageLite& msg,
-                                    const SerializationTable* table,
-                                    bool is_deterministic, uint8* buffer) {
-  const uint8* base = reinterpret_cast<const uint8*>(&msg);
-  const FieldMetadata* field_table = table->field_table + 1;
-  int num_fields = table->num_fields - 1;
-  return SerializeInternalToArray(base, field_table, num_fields,
-                                  is_deterministic, buffer);
-}
-
-template <typename T>
-struct CompareHelper {
-  bool operator()(const T& a, const T& b) { return a < b; }
-};
-
-template <>
-struct CompareHelper<ArenaStringPtr> {
-  bool operator()(const ArenaStringPtr& a, const ArenaStringPtr& b) {
-    return a.Get() < b.Get();
-  }
-};
-
-struct CompareMapKey {
-  template <typename T>
-  bool operator()(const MapEntryHelper<T>& a, const MapEntryHelper<T>& b) {
-    return Compare(a.key_, b.key_);
-  }
-  template <typename T>
-  bool Compare(const T& a, const T& b) {
-    return CompareHelper<T>()(a, b);
-  }
-};
-
-template <typename MapFieldType, const SerializationTable* table>
-void MapFieldSerializer(const uint8* base, uint32 offset, uint32 tag,
-                        uint32 has_offset,
-                        ::google::protobuf::io::CodedOutputStream* output) {
-  typedef MapEntryHelper<typename MapFieldType::EntryTypeTrait> Entry;
-  typedef typename MapFieldType::MapType::const_iterator Iter;
-
-  const MapFieldType& map_field =
-      *reinterpret_cast<const MapFieldType*>(base + offset);
-  const SerializationTable* t =
-      table +
-      has_offset;  // has_offset is overloaded for maps to mean table offset
-  if (!output->IsSerializationDeterministic()) {
-    for (Iter it = map_field.GetMap().begin(); it != map_field.GetMap().end();
-         ++it) {
-      Entry map_entry(*it);
-      output->WriteVarint32(tag);
-      output->WriteVarint32(map_entry._cached_size_);
-      SerializeInternal(reinterpret_cast<const uint8*>(&map_entry),
-                        t->field_table, t->num_fields, output);
-    }
-  } else {
-    std::vector<Entry> v;
-    for (Iter it = map_field.GetMap().begin(); it != map_field.GetMap().end();
-         ++it) {
-      v.push_back(Entry(*it));
-    }
-    std::sort(v.begin(), v.end(), CompareMapKey());
-    for (int i = 0; i < v.size(); i++) {
-      output->WriteVarint32(tag);
-      output->WriteVarint32(v[i]._cached_size_);
-      SerializeInternal(reinterpret_cast<const uint8*>(&v[i]), t->field_table,
-                        t->num_fields, output);
-    }
-  }
-}
-
-LIBPROTOBUF_EXPORT MessageLite* DuplicateIfNonNullInternal(MessageLite* message, Arena* arena);
-LIBPROTOBUF_EXPORT MessageLite* GetOwnedMessageInternal(Arena* message_arena,
-                                     MessageLite* submessage,
-                                     Arena* submessage_arena);
-
-template <typename T>
-T* DuplicateIfNonNull(T* message, Arena* arena) {
-  // The casts must be reinterpret_cast<> because T might be a forward-declared
-  // type that the compiler doesn't know is related to MessageLite.
-  return reinterpret_cast<T*>(DuplicateIfNonNullInternal(
-      reinterpret_cast<MessageLite*>(message), arena));
-}
-
-template <typename T>
-T* GetOwnedMessage(Arena* message_arena, T* submessage,
-                   Arena* submessage_arena) {
-  // The casts must be reinterpret_cast<> because T might be a forward-declared
-  // type that the compiler doesn't know is related to MessageLite.
-  return reinterpret_cast<T*>(GetOwnedMessageInternal(
-      message_arena, reinterpret_cast<MessageLite*>(submessage),
-      submessage_arena));
-}
-
-// Returns a message owned by this Arena.  This may require Own()ing or
-// duplicating the message.
-template <typename T>
-T* GetOwnedMessage(T* message, Arena* arena) {
-  GOOGLE_DCHECK(message);
-  Arena* message_arena = google::protobuf::Arena::GetArena(message);
-  if (message_arena == arena) {
-    return message;
-  } else if (arena != NULL && message_arena == NULL) {
-    arena->Own(message);
-    return message;
-  } else {
-    return DuplicateIfNonNull(message, arena);
-  }
-}
+// Read a length (varint32), followed by a string, from *input.  Return a
+// pointer to a copy of the string that resides in *arena.  Requires both
+// args to be non-NULL.  If something goes wrong while reading the data
+// then NULL is returned (e.g., input does not start with a valid varint).
+ArenaString* ReadArenaString(::google::protobuf::io::CodedInputStream* input,
+                             ::google::protobuf::Arena* arena);
 
 }  // namespace internal
 }  // namespace protobuf
diff --git a/src/google/protobuf/has_bits.h b/src/google/protobuf/has_bits.h
deleted file mode 100644
index e3a0149..0000000
--- a/src/google/protobuf/has_bits.h
+++ /dev/null
@@ -1,105 +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.
-
-#ifndef GOOGLE_PROTOBUF_HAS_BITS_H__
-#define GOOGLE_PROTOBUF_HAS_BITS_H__
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/port.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-template<size_t doublewords>
-class HasBits {
- public:
-  HasBits() GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE { Clear(); }
-
-  void Clear() GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE {
-    memset(has_bits_, 0, sizeof(has_bits_));
-  }
-
-  ::google::protobuf::uint32& operator[](int index) GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE {
-    return has_bits_[index];
-  }
-
-  const ::google::protobuf::uint32& operator[](int index) const
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE {
-    return has_bits_[index];
-  }
-
-  bool operator==(const HasBits<doublewords>& rhs) const {
-    return memcmp(has_bits_, rhs.has_bits_, sizeof(has_bits_)) == 0;
-  }
-
-  bool operator!=(const HasBits<doublewords>& rhs) const {
-    return !(*this == rhs);
-  }
-
-  bool empty() const;
-
- private:
-  ::google::protobuf::uint32 has_bits_[doublewords];
-};
-
-template <>
-inline bool HasBits<1>::empty() const {
-  return !has_bits_[0];
-}
-
-template <>
-inline bool HasBits<2>::empty() const {
-  return !(has_bits_[0] | has_bits_[1]);
-}
-
-template <>
-inline bool HasBits<3>::empty() const {
-  return !(has_bits_[0] | has_bits_[1] | has_bits_[2]);
-}
-
-template <>
-inline bool HasBits<4>::empty() const {
-  return !(has_bits_[0] | has_bits_[1] | has_bits_[2] | has_bits_[3]);
-}
-
-template <size_t doublewords>
-inline bool HasBits<doublewords>::empty() const {
-  for (size_t i = 0; i < doublewords; ++i) {
-    if (has_bits_[i]) return false;
-  }
-  return true;
-}
-
-}  // namespace internal
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_HAS_BITS_H__
diff --git a/src/google/protobuf/implicit_weak_message.cc b/src/google/protobuf/implicit_weak_message.cc
deleted file mode 100644
index 0dd126b..0000000
--- a/src/google/protobuf/implicit_weak_message.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include <google/protobuf/implicit_weak_message.h>
-
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/wire_format_lite.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-::google::protobuf::internal::ExplicitlyConstructed<ImplicitWeakMessage>
-    implicit_weak_message_default_instance;
-
-bool ImplicitWeakMessage::MergePartialFromCodedStream(io::CodedInputStream* input) {
-  io::StringOutputStream string_stream(&data_);
-  io::CodedOutputStream coded_stream(&string_stream, false);
-  return WireFormatLite::SkipMessage(input, &coded_stream);
-}
-
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/implicit_weak_message.h b/src/google/protobuf/implicit_weak_message.h
deleted file mode 100644
index 12cc7db..0000000
--- a/src/google/protobuf/implicit_weak_message.h
+++ /dev/null
@@ -1,89 +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.
-
-#ifndef GOOGLE_PROTOBUF_IMPLICIT_WEAK_MESSAGE_H__
-#define GOOGLE_PROTOBUF_IMPLICIT_WEAK_MESSAGE_H__
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/message_lite.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-class LIBPROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite {
- public:
-  ImplicitWeakMessage() : arena_(NULL) {}
-  explicit ImplicitWeakMessage(Arena* arena) : arena_(arena) {}
-
-  string GetTypeName() const { return ""; }
-
-  MessageLite* New() const { return new ImplicitWeakMessage; }
-  MessageLite* New(Arena* arena) const {
-    return Arena::CreateMessage<ImplicitWeakMessage>(arena);
-  }
-
-  Arena* GetArena() const { return arena_; }
-
-  void Clear() { data_.clear(); }
-
-  bool IsInitialized() const { return true; }
-
-  void CheckTypeAndMergeFrom(const MessageLite& other) {
-    data_.append(static_cast<const ImplicitWeakMessage&>(other).data_);
-  }
-
-  bool MergePartialFromCodedStream(io::CodedInputStream* input);
-
-  size_t ByteSizeLong() const { return data_.size(); }
-
-  void SerializeWithCachedSizes(io::CodedOutputStream* output) const {
-    output->WriteString(data_);
-  }
-
-  int GetCachedSize() const { return data_.size(); }
-
-  typedef void InternalArenaConstructable_;
-
- private:
-  Arena* const arena_;
-  string data_;
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImplicitWeakMessage);
-};
-
-extern ::google::protobuf::internal::ExplicitlyConstructed<ImplicitWeakMessage>
-    implicit_weak_message_default_instance;
-
-}  // namespace internal
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_IMPLICIT_WEAK_MESSAGE_H__
diff --git a/src/google/protobuf/io/coded_stream.cc b/src/google/protobuf/io/coded_stream.cc
index 79cff2c..d8354c1 100644
--- a/src/google/protobuf/io/coded_stream.cc
+++ b/src/google/protobuf/io/coded_stream.cc
@@ -76,6 +76,10 @@
   if (input_ != NULL) {
     BackUpInputToCurrentPosition();
   }
+
+  if (total_bytes_warning_threshold_ == -2) {
+    GOOGLE_LOG(WARNING) << "The total number of bytes read was " << total_bytes_read_;
+  }
 }
 
 // Static.
@@ -119,15 +123,21 @@
   Limit old_limit = current_limit_;
 
   // security: byte_limit is possibly evil, so check for negative values
-  // and overflow. Also check that the new requested limit is before the
-  // previous limit; otherwise we continue to enforce the previous limit.
-  if GOOGLE_PREDICT_TRUE(byte_limit >= 0 &&
-                  byte_limit <= INT_MAX - current_position &&
-                  byte_limit < current_limit_ - current_position) {
+  // and overflow.
+  if (byte_limit >= 0 &&
+      byte_limit <= INT_MAX - current_position) {
     current_limit_ = current_position + byte_limit;
-    RecomputeBufferLimits();
+  } else {
+    // Negative or overflow.
+    current_limit_ = INT_MAX;
   }
 
+  // We need to enforce all limits, not just the new one, so if the previous
+  // limit was before the new requested limit, we continue to enforce the
+  // previous limit.
+  current_limit_ = std::min(current_limit_, old_limit);
+
+  RecomputeBufferLimits();
   return old_limit;
 }
 
@@ -175,12 +185,16 @@
 
 void CodedInputStream::SetTotalBytesLimit(
     int total_bytes_limit, int warning_threshold) {
-  (void) warning_threshold;
-
   // Make sure the limit isn't already past, since this could confuse other
   // code.
   int current_position = CurrentPosition();
   total_bytes_limit_ = std::max(current_position, total_bytes_limit);
+  if (warning_threshold >= 0) {
+    total_bytes_warning_threshold_ = warning_threshold;
+  } else {
+    // warning_threshold is negative
+    total_bytes_warning_threshold_ = -1;
+  }
   RecomputeBufferLimits();
 }
 
@@ -197,7 +211,17 @@
                 "in google/protobuf/io/coded_stream.h.";
 }
 
-bool CodedInputStream::SkipFallback(int count, int original_buffer_size) {
+bool CodedInputStream::Skip(int count) {
+  if (count < 0) return false;  // security: count is often user-supplied
+
+  const int original_buffer_size = BufferSize();
+
+  if (count <= original_buffer_size) {
+    // Just skipping within the current buffer.  Easy.
+    Advance(count);
+    return true;
+  }
+
   if (buffer_size_after_limit_ > 0) {
     // We hit a limit inside this buffer.  Advance to the limit and fail.
     Advance(original_buffer_size);
@@ -315,8 +339,7 @@
 // The first part of the pair is true iff the read was successful.  The second
 // part is buffer + (number of bytes read).  This function is always inlined,
 // so returning a pair is costless.
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-::std::pair<bool, const uint8*> ReadVarint32FromArray(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE ::std::pair<bool, const uint8*> ReadVarint32FromArray(
     uint32 first_byte, const uint8* buffer,
     uint32* value);
 inline ::std::pair<bool, const uint8*> ReadVarint32FromArray(
@@ -353,49 +376,6 @@
   return std::make_pair(true, ptr);
 }
 
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE::std::pair<bool, const uint8*>
-ReadVarint64FromArray(const uint8* buffer, uint64* value);
-inline ::std::pair<bool, const uint8*> ReadVarint64FromArray(
-    const uint8* buffer, uint64* value) {
-  const uint8* ptr = buffer;
-  uint32 b;
-
-  // Splitting into 32-bit pieces gives better performance on 32-bit
-  // processors.
-  uint32 part0 = 0, part1 = 0, part2 = 0;
-
-  b = *(ptr++); part0  = b      ; if (!(b & 0x80)) goto done;
-  part0 -= 0x80;
-  b = *(ptr++); part0 += b <<  7; if (!(b & 0x80)) goto done;
-  part0 -= 0x80 << 7;
-  b = *(ptr++); part0 += b << 14; if (!(b & 0x80)) goto done;
-  part0 -= 0x80 << 14;
-  b = *(ptr++); part0 += b << 21; if (!(b & 0x80)) goto done;
-  part0 -= 0x80 << 21;
-  b = *(ptr++); part1  = b      ; if (!(b & 0x80)) goto done;
-  part1 -= 0x80;
-  b = *(ptr++); part1 += b <<  7; if (!(b & 0x80)) goto done;
-  part1 -= 0x80 << 7;
-  b = *(ptr++); part1 += b << 14; if (!(b & 0x80)) goto done;
-  part1 -= 0x80 << 14;
-  b = *(ptr++); part1 += b << 21; if (!(b & 0x80)) goto done;
-  part1 -= 0x80 << 21;
-  b = *(ptr++); part2  = b      ; if (!(b & 0x80)) goto done;
-  part2 -= 0x80;
-  b = *(ptr++); part2 += b <<  7; if (!(b & 0x80)) goto done;
-  // "part2 -= 0x80 << 7" is irrelevant because (0x80 << 7) << 56 is 0.
-
-  // We have overrun the maximum size of a varint (10 bytes).  Assume
-  // the data is corrupt.
-  return std::make_pair(false, ptr);
-
- done:
-  *value = (static_cast<uint64>(part0)) |
-           (static_cast<uint64>(part1) << 28) |
-           (static_cast<uint64>(part2) << 56);
-  return std::make_pair(true, ptr);
-}
-
 }  // namespace
 
 bool CodedInputStream::ReadVarint32Slow(uint32* value) {
@@ -428,32 +408,6 @@
   }
 }
 
-int CodedInputStream::ReadVarintSizeAsIntSlow() {
-  // Directly invoke ReadVarint64Fallback, since we already tried to optimize
-  // for one-byte varints.
-  std::pair<uint64, bool> p = ReadVarint64Fallback();
-  if (!p.second || p.first > static_cast<uint64>(INT_MAX)) return -1;
-  return p.first;
-}
-
-int CodedInputStream::ReadVarintSizeAsIntFallback() {
-  if (BufferSize() >= kMaxVarintBytes ||
-      // Optimization:  We're also safe if the buffer is non-empty and it ends
-      // with a byte that would terminate a varint.
-      (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) {
-    uint64 temp;
-    ::std::pair<bool, const uint8*> p = ReadVarint64FromArray(buffer_, &temp);
-    if (!p.first || temp > static_cast<uint64>(INT_MAX)) return -1;
-    buffer_ = p.second;
-    return temp;
-  } else {
-    // Really slow case: we will incur the cost of an extra function call here,
-    // but moving this out of line reduces the size of this function, which
-    // improves the common case. In micro benchmarks, this is worth about 10-15%
-    return ReadVarintSizeAsIntSlow();
-  }
-}
-
 uint32 CodedInputStream::ReadTagSlow() {
   if (buffer_ == buffer_end_) {
     // Call refresh.
@@ -526,15 +480,9 @@
   uint32 b;
 
   do {
-    if (count == kMaxVarintBytes) {
-      *value = 0;
-      return false;
-    }
+    if (count == kMaxVarintBytes) return false;
     while (buffer_ == buffer_end_) {
-      if (!Refresh()) {
-        *value = 0;
-        return false;
-      }
+      if (!Refresh()) return false;
     }
     b = *buffer_;
     result |= static_cast<uint64>(b & 0x7F) << (7 * count);
@@ -551,13 +499,47 @@
       // Optimization:  We're also safe if the buffer is non-empty and it ends
       // with a byte that would terminate a varint.
       (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) {
-    uint64 temp;
-    ::std::pair<bool, const uint8*> p = ReadVarint64FromArray(buffer_, &temp);
-    if (!p.first) {
-      return std::make_pair(0, false);
-    }
-    buffer_ = p.second;
-    return std::make_pair(temp, true);
+    // Fast path:  We have enough bytes left in the buffer to guarantee that
+    // this read won't cross the end, so we can skip the checks.
+
+    const uint8* ptr = buffer_;
+    uint32 b;
+
+    // Splitting into 32-bit pieces gives better performance on 32-bit
+    // processors.
+    uint32 part0 = 0, part1 = 0, part2 = 0;
+
+    b = *(ptr++); part0  = b      ; if (!(b & 0x80)) goto done;
+    part0 -= 0x80;
+    b = *(ptr++); part0 += b <<  7; if (!(b & 0x80)) goto done;
+    part0 -= 0x80 << 7;
+    b = *(ptr++); part0 += b << 14; if (!(b & 0x80)) goto done;
+    part0 -= 0x80 << 14;
+    b = *(ptr++); part0 += b << 21; if (!(b & 0x80)) goto done;
+    part0 -= 0x80 << 21;
+    b = *(ptr++); part1  = b      ; if (!(b & 0x80)) goto done;
+    part1 -= 0x80;
+    b = *(ptr++); part1 += b <<  7; if (!(b & 0x80)) goto done;
+    part1 -= 0x80 << 7;
+    b = *(ptr++); part1 += b << 14; if (!(b & 0x80)) goto done;
+    part1 -= 0x80 << 14;
+    b = *(ptr++); part1 += b << 21; if (!(b & 0x80)) goto done;
+    part1 -= 0x80 << 21;
+    b = *(ptr++); part2  = b      ; if (!(b & 0x80)) goto done;
+    part2 -= 0x80;
+    b = *(ptr++); part2 += b <<  7; if (!(b & 0x80)) goto done;
+    // "part2 -= 0x80 << 7" is irrelevant because (0x80 << 7) << 56 is 0.
+
+    // We have overrun the maximum size of a varint (10 bytes).  The data
+    // must be corrupt.
+    return std::make_pair(0, false);
+
+   done:
+    Advance(ptr - buffer_);
+    return std::make_pair((static_cast<uint64>(part0)) |
+                              (static_cast<uint64>(part1) << 28) |
+                              (static_cast<uint64>(part2) << 56),
+                          true);
   } else {
     uint64 temp;
     bool success = ReadVarint64Slow(&temp);
@@ -582,6 +564,20 @@
     return false;
   }
 
+  if (total_bytes_warning_threshold_ >= 0 &&
+      total_bytes_read_ >= total_bytes_warning_threshold_) {
+      GOOGLE_LOG(WARNING) << "Reading dangerously large protocol message.  If the "
+                      "message turns out to be larger than "
+                   << total_bytes_limit_ << " bytes, parsing will be halted "
+                      "for security reasons.  To increase the limit (or to "
+                      "disable these warnings), see "
+                      "CodedInputStream::SetTotalBytesLimit() in "
+                      "google/protobuf/io/coded_stream.h.";
+
+    // Don't warn again for this stream, and print total size at the end.
+    total_bytes_warning_threshold_ = -2;
+  }
+
   const void* void_buffer;
   int buffer_size;
   if (NextNonEmpty(input_, &void_buffer, &buffer_size)) {
@@ -618,16 +614,13 @@
 
 // CodedOutputStream =================================================
 
-google::protobuf::internal::AtomicWord CodedOutputStream::default_serialization_deterministic_ = 0;
-
 CodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output)
   : output_(output),
     buffer_(NULL),
     buffer_size_(0),
     total_bytes_(0),
     had_error_(false),
-    aliasing_enabled_(false),
-    serialization_deterministic_is_overridden_(false) {
+    aliasing_enabled_(false) {
   // Eagerly Refresh() so buffer space is immediately available.
   Refresh();
   // The Refresh() may have failed. If the client doesn't write any data,
@@ -643,8 +636,7 @@
     buffer_size_(0),
     total_bytes_(0),
     had_error_(false),
-    aliasing_enabled_(false),
-    serialization_deterministic_is_overridden_(false) {
+    aliasing_enabled_(false) {
   if (do_eager_refresh) {
     // Eagerly Refresh() so buffer space is immediately available.
     Refresh();
@@ -757,12 +749,104 @@
   WriteRaw(bytes, size);
 }
 
-void CodedOutputStream::WriteVarint64SlowPath(uint64 value) {
-  uint8 bytes[kMaxVarintBytes];
-  uint8* target = &bytes[0];
-  uint8* end = WriteVarint64ToArray(value, target);
-  int size = end - target;
-  WriteRaw(bytes, size);
+inline uint8* CodedOutputStream::WriteVarint64ToArrayInline(
+    uint64 value, uint8* target) {
+  // Splitting into 32-bit pieces gives better performance on 32-bit
+  // processors.
+  uint32 part0 = static_cast<uint32>(value      );
+  uint32 part1 = static_cast<uint32>(value >> 28);
+  uint32 part2 = static_cast<uint32>(value >> 56);
+
+  int size;
+
+  // Here we can't really optimize for small numbers, since the value is
+  // split into three parts.  Cheking for numbers < 128, for instance,
+  // would require three comparisons, since you'd have to make sure part1
+  // and part2 are zero.  However, if the caller is using 64-bit integers,
+  // it is likely that they expect the numbers to often be very large, so
+  // we probably don't want to optimize for small numbers anyway.  Thus,
+  // we end up with a hardcoded binary search tree...
+  if (part2 == 0) {
+    if (part1 == 0) {
+      if (part0 < (1 << 14)) {
+        if (part0 < (1 << 7)) {
+          size = 1; goto size1;
+        } else {
+          size = 2; goto size2;
+        }
+      } else {
+        if (part0 < (1 << 21)) {
+          size = 3; goto size3;
+        } else {
+          size = 4; goto size4;
+        }
+      }
+    } else {
+      if (part1 < (1 << 14)) {
+        if (part1 < (1 << 7)) {
+          size = 5; goto size5;
+        } else {
+          size = 6; goto size6;
+        }
+      } else {
+        if (part1 < (1 << 21)) {
+          size = 7; goto size7;
+        } else {
+          size = 8; goto size8;
+        }
+      }
+    }
+  } else {
+    if (part2 < (1 << 7)) {
+      size = 9; goto size9;
+    } else {
+      size = 10; goto size10;
+    }
+  }
+
+  GOOGLE_LOG(FATAL) << "Can't get here.";
+
+  size10: target[9] = static_cast<uint8>((part2 >>  7) | 0x80);
+  size9 : target[8] = static_cast<uint8>((part2      ) | 0x80);
+  size8 : target[7] = static_cast<uint8>((part1 >> 21) | 0x80);
+  size7 : target[6] = static_cast<uint8>((part1 >> 14) | 0x80);
+  size6 : target[5] = static_cast<uint8>((part1 >>  7) | 0x80);
+  size5 : target[4] = static_cast<uint8>((part1      ) | 0x80);
+  size4 : target[3] = static_cast<uint8>((part0 >> 21) | 0x80);
+  size3 : target[2] = static_cast<uint8>((part0 >> 14) | 0x80);
+  size2 : target[1] = static_cast<uint8>((part0 >>  7) | 0x80);
+  size1 : target[0] = static_cast<uint8>((part0      ) | 0x80);
+
+  target[size-1] &= 0x7F;
+  return target + size;
+}
+
+void CodedOutputStream::WriteVarint64(uint64 value) {
+  if (buffer_size_ >= kMaxVarintBytes) {
+    // Fast path:  We have enough bytes left in the buffer to guarantee that
+    // this write won't cross the end, so we can skip the checks.
+    uint8* target = buffer_;
+
+    uint8* end = WriteVarint64ToArrayInline(value, target);
+    int size = end - target;
+    Advance(size);
+  } else {
+    // Slow path:  This write might cross the end of the buffer, so we
+    // compose the bytes first then use WriteRaw().
+    uint8 bytes[kMaxVarintBytes];
+    int size = 0;
+    while (value > 0x7F) {
+      bytes[size++] = (static_cast<uint8>(value) & 0x7F) | 0x80;
+      value >>= 7;
+    }
+    bytes[size++] = static_cast<uint8>(value) & 0x7F;
+    WriteRaw(bytes, size);
+  }
+}
+
+uint8* CodedOutputStream::WriteVarint64ToArray(
+    uint64 value, uint8* target) {
+  return WriteVarint64ToArrayInline(value, target);
 }
 
 bool CodedOutputStream::Refresh() {
@@ -779,6 +863,48 @@
   }
 }
 
+int CodedOutputStream::VarintSize32Fallback(uint32 value) {
+  if (value < (1 << 7)) {
+    return 1;
+  } else if (value < (1 << 14)) {
+    return 2;
+  } else if (value < (1 << 21)) {
+    return 3;
+  } else if (value < (1 << 28)) {
+    return 4;
+  } else {
+    return 5;
+  }
+}
+
+int CodedOutputStream::VarintSize64(uint64 value) {
+  if (value < (1ull << 35)) {
+    if (value < (1ull << 7)) {
+      return 1;
+    } else if (value < (1ull << 14)) {
+      return 2;
+    } else if (value < (1ull << 21)) {
+      return 3;
+    } else if (value < (1ull << 28)) {
+      return 4;
+    } else {
+      return 5;
+    }
+  } else {
+    if (value < (1ull << 42)) {
+      return 6;
+    } else if (value < (1ull << 49)) {
+      return 7;
+    } else if (value < (1ull << 56)) {
+      return 8;
+    } else if (value < (1ull << 63)) {
+      return 9;
+    } else {
+      return 10;
+    }
+  }
+}
+
 uint8* CodedOutputStream::WriteStringWithSizeToArray(const string& str,
                                                      uint8* target) {
   GOOGLE_DCHECK_LE(str.size(), kuint32max);
diff --git a/src/google/protobuf/io/coded_stream.h b/src/google/protobuf/io/coded_stream.h
index 02d87ea..c81a33a 100644
--- a/src/google/protobuf/io/coded_stream.h
+++ b/src/google/protobuf/io/coded_stream.h
@@ -110,7 +110,6 @@
 #define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
 
 #include <assert.h>
-#include <climits>
 #include <string>
 #include <utility>
 #ifdef _MSC_VER
@@ -131,10 +130,7 @@
     #define PROTOBUF_LITTLE_ENDIAN 1
   #endif
 #endif
-#include <google/protobuf/stubs/atomicops.h>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/port.h>
-#include <google/protobuf/stubs/port.h>
 
 namespace google {
 
@@ -143,8 +139,6 @@
 class DescriptorPool;
 class MessageFactory;
 
-namespace internal { void MapTestForceDeterministic(); }
-
 namespace io {
 
 // Defined in this file.
@@ -185,7 +179,7 @@
 
   // Skips a number of bytes.  Returns false if an underlying read error
   // occurs.
-  inline bool Skip(int count);
+  bool Skip(int count);
 
   // Sets *data to point directly at the unread part of the CodedInputStream's
   // underlying buffer, and *size to the size of that buffer, but does not
@@ -198,23 +192,28 @@
 
   // Like GetDirectBufferPointer, but this method is inlined, and does not
   // attempt to Refresh() if the buffer is currently empty.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  void GetDirectBufferPointerInline(const void** data, int* size);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE void GetDirectBufferPointerInline(const void** data,
+                                                            int* size);
 
   // Read raw bytes, copying them into the given buffer.
   bool ReadRaw(void* buffer, int size);
 
   // Like the above, with inlined optimizations. This should only be used
   // by the protobuf implementation.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  bool InternalReadRawInline(void* buffer, int size);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InternalReadRawInline(void* buffer, int size);
 
   // Like ReadRaw, but reads into a string.
+  //
+  // Implementation Note:  ReadString() grows the string gradually as it
+  // reads in the data, rather than allocating the entire requested size
+  // upfront.  This prevents denial-of-service attacks in which a client
+  // could claim that a string is going to be MAX_INT bytes long in order to
+  // crash the server because it can't allocate this much space at once.
   bool ReadString(string* buffer, int size);
   // Like the above, with inlined optimizations. This should only be used
   // by the protobuf implementation.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  bool InternalReadStringInline(string* buffer, int size);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InternalReadStringInline(string* buffer,
+                                                        int size);
 
 
   // Read a 32-bit little-endian integer.
@@ -238,31 +237,13 @@
   // Read an unsigned integer with Varint encoding.
   bool ReadVarint64(uint64* value);
 
-  // Reads a varint off the wire into an "int". This should be used for reading
-  // sizes off the wire (sizes of strings, submessages, bytes fields, etc).
-  //
-  // The value from the wire is interpreted as unsigned.  If its value exceeds
-  // the representable value of an integer on this platform, instead of
-  // truncating we return false. Truncating (as performed by ReadVarint32()
-  // above) is an acceptable approach for fields representing an integer, but
-  // when we are parsing a size from the wire, truncating the value would result
-  // in us misparsing the payload.
-  bool ReadVarintSizeAsInt(int* value);
-
   // Read a tag.  This calls ReadVarint32() and returns the result, or returns
-  // zero (which is not a valid tag) if ReadVarint32() fails.  Also, ReadTag
-  // (but not ReadTagNoLastTag) updates the last tag value, which can be checked
-  // with LastTagWas().
-  //
+  // zero (which is not a valid tag) if ReadVarint32() fails.  Also, it updates
+  // the last tag value, which can be checked with LastTagWas().
   // Always inline because this is only called in one place per parse loop
   // but it is called for every iteration of said loop, so it should be fast.
   // GCC doesn't want to inline this by default.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE uint32 ReadTag() {
-    return last_tag_ = ReadTagNoLastTag();
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE uint32 ReadTagNoLastTag();
-
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE uint32 ReadTag();
 
   // This usually a faster alternative to ReadTag() when cutoff is a manifest
   // constant.  It does particularly well for cutoff >= 127.  The first part
@@ -272,15 +253,8 @@
   // above cutoff or is 0.  (There's intentional wiggle room when tag is 0,
   // because that can arise in several ways, and for best performance we want
   // to avoid an extra "is tag == 0?" check here.)
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  std::pair<uint32, bool> ReadTagWithCutoff(uint32 cutoff) {
-    std::pair<uint32, bool> result = ReadTagWithCutoffNoLastTag(cutoff);
-    last_tag_ = result.first;
-    return result;
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  std::pair<uint32, bool> ReadTagWithCutoffNoLastTag(uint32 cutoff);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE std::pair<uint32, bool> ReadTagWithCutoff(
+      uint32 cutoff);
 
   // Usually returns true if calling ReadVarint32() now would produce the given
   // value.  Will always return false if ReadVarint32() would not return the
@@ -289,7 +263,7 @@
   // parameter.
   // Always inline because this collapses to a small number of instructions
   // when given a constant parameter, but GCC doesn't want to inline by default.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool ExpectTag(uint32 expected);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool ExpectTag(uint32 expected);
 
   // Like above, except this reads from the specified buffer. The caller is
   // responsible for ensuring that the buffer is large enough to read a varint
@@ -298,8 +272,9 @@
   //
   // Returns a pointer beyond the expected tag if it was found, or NULL if it
   // was not.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static const uint8* ExpectTagFromArray(const uint8* buffer, uint32 expected);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static const uint8* ExpectTagFromArray(
+      const uint8* buffer,
+      uint32 expected);
 
   // Usually returns true if no more bytes can be read.  Always returns false
   // if more bytes can be read.  If ExpectAtEnd() returns true, a subsequent
@@ -307,10 +282,8 @@
   // zero, and ConsumedEntireMessage() will return true.
   bool ExpectAtEnd();
 
-  // If the last call to ReadTag() or ReadTagWithCutoff() returned the given
-  // value, returns true.  Otherwise, returns false.
-  // ReadTagNoLastTag/ReadTagWithCutoffNoLastTag do not preserve the last
-  // returned value.
+  // If the last call to ReadTag() or ReadTagWithCutoff() returned the
+  // given value, returns true.  Otherwise, returns false;
   //
   // This is needed because parsers for some types of embedded messages
   // (with field type TYPE_GROUP) don't actually know that they've reached the
@@ -319,7 +292,6 @@
   // tag to make sure it had the right number, so it calls LastTagWas() on
   // return from the embedded parser to check.
   bool LastTagWas(uint32 expected);
-  void SetLastTag(uint32 tag) { last_tag_ = tag; }
 
   // When parsing message (but NOT a group), this method must be called
   // immediately after MergeFromCodedStream() returns (if it returns true)
@@ -377,10 +349,11 @@
   // maximum message length should be limited to the shortest length that
   // will not harm usability.  The theoretical shortest message that could
   // cause integer overflows is 512MB.  The default limit is 64MB.  Apps
-  // should set shorter limits if possible.  For backwards compatibility all
-  // negative values get squashed to -1, as other negative values might have
-  // special internal meanings.  An error will always be printed to stderr if
-  // the limit is reached.
+  // should set shorter limits if possible.  If warning_threshold is not -1,
+  // a warning will be printed to stderr after warning_threshold bytes are
+  // read.  For backwards compatibility all negative values get squashed to -1,
+  // as other negative values might have special internal meanings.
+  // An error will always be printed to stderr if the limit is reached.
   //
   // This is unrelated to PushLimit()/PopLimit().
   //
@@ -396,9 +369,9 @@
   //   Message::ParseFromString().  In this case, you will need to change
   //   your code to instead construct some sort of ZeroCopyInputStream
   //   (e.g. an ArrayInputStream), construct a CodedInputStream around
-  //   that, then you can adjust the limit. Then call
-  //   Message::ParseFromCodedStream() instead. Yes, it's more work, but
-  //   you're doing something unusual.
+  //   that, then call Message::ParseFromCodedStream() instead.  Then
+  //   you can adjust the limit.  Yes, it's more work, but you're doing
+  //   something unusual.
   void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold);
 
   // The Total Bytes Limit minus the Current Position, or -1 if there
@@ -573,6 +546,12 @@
   // current_limit_.  Set using SetTotalBytesLimit().
   int total_bytes_limit_;
 
+  // If positive/0: Limit for bytes read after which a warning due to size
+  // should be logged.
+  // If -1: Printing of warning disabled. Can be set by client.
+  // If -2: Internal: Limit has been reached, print full size when destructing.
+  int total_bytes_warning_threshold_;
+
   // Current recursion budget, controlled by IncrementRecursionDepth() and
   // similar.  Starts at recursion_limit_ and goes down: if this reaches
   // -1 we are over budget.
@@ -580,17 +559,12 @@
   // Recursion depth limit, set by SetRecursionLimit().
   int recursion_limit_;
 
-  bool disable_strict_correctness_enforcement_;
-
   // See SetExtensionRegistry().
   const DescriptorPool* extension_pool_;
   MessageFactory* extension_factory_;
 
   // Private member functions.
 
-  // Fallback when Skip() goes past the end of the current buffer.
-  bool SkipFallback(int count, int original_buffer_size);
-
   // Advance the buffer by a given number of bytes.
   void Advance(int amount);
 
@@ -620,14 +594,11 @@
   // if it fails and the uint32 it read otherwise.  The latter has a bool
   // indicating success or failure as part of its return type.
   int64 ReadVarint32Fallback(uint32 first_byte_or_zero);
-  int ReadVarintSizeAsIntFallback();
   std::pair<uint64, bool> ReadVarint64Fallback();
   bool ReadVarint32Slow(uint32* value);
   bool ReadVarint64Slow(uint64* value);
-  int ReadVarintSizeAsIntSlow();
   bool ReadLittleEndian32Fallback(uint32* value);
   bool ReadLittleEndian64Fallback(uint64* value);
-
   // Fallback/slow methods for reading tags. These do not update last_tag_,
   // but will set legitimate_message_end_ if we are at the end of the input
   // stream.
@@ -638,7 +609,9 @@
   // Return the size of the buffer.
   int BufferSize() const;
 
-  static const int kDefaultTotalBytesLimit = INT_MAX;
+  static const int kDefaultTotalBytesLimit = 64 << 20;  // 64MB
+
+  static const int kDefaultTotalBytesWarningThreshold = 32 << 20;  // 32MB
 
   static int default_recursion_limit_;  // 100 by default.
 };
@@ -794,21 +767,21 @@
   // but GCC by default doesn't want to inline this.
   void WriteTag(uint32 value);
   // Like WriteTag()  but writing directly to the target array.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static uint8* WriteTagToArray(uint32 value, uint8* target);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static uint8* WriteTagToArray(uint32 value,
+                                                        uint8* target);
 
   // Returns the number of bytes needed to encode the given value as a varint.
-  static size_t VarintSize32(uint32 value);
+  static int VarintSize32(uint32 value);
   // Returns the number of bytes needed to encode the given value as a varint.
-  static size_t VarintSize64(uint64 value);
+  static int VarintSize64(uint64 value);
 
   // If negative, 10 bytes.  Otheriwse, same as VarintSize32().
-  static size_t VarintSize32SignExtended(int32 value);
+  static int VarintSize32SignExtended(int32 value);
 
   // Compile-time equivalent of VarintSize32().
   template <uint32 Value>
   struct StaticVarintSize32 {
-    static const size_t value =
+    static const int value =
         (Value < (1 << 7))
             ? 1
             : (Value < (1 << 14))
@@ -827,48 +800,6 @@
   // created.
   bool HadError() const { return had_error_; }
 
-  // Deterministic serialization, if requested, guarantees that for a given
-  // binary, equal messages will always be serialized to the same bytes. This
-  // implies:
-  //   . repeated serialization of a message will return the same bytes
-  //   . different processes of the same binary (which may be executing on
-  //     different machines) will serialize equal messages to the same bytes.
-  //
-  // Note the deterministic serialization is NOT canonical across languages; it
-  // is also unstable across different builds with schema changes due to unknown
-  // fields. Users who need canonical serialization, e.g., persistent storage in
-  // a canonical form, fingerprinting, etc., should define their own
-  // canonicalization specification and implement the serializer using
-  // reflection APIs rather than relying on this API.
-  //
-  // If determinisitc serialization is requested, the serializer will
-  // sort map entries by keys in lexicographical order or numerical order.
-  // (This is an implementation detail and may subject to change.)
-  //
-  // There are two ways to determine whether serialization should be
-  // deterministic for this CodedOutputStream.  If SetSerializationDeterministic
-  // has not yet been called, then the default comes from the global default,
-  // which is false, until SetDefaultSerializationDeterministic has been called.
-  // Otherwise, SetSerializationDeterministic has been called, and the last
-  // value passed to it is all that matters.
-  void SetSerializationDeterministic(bool value) {
-    serialization_deterministic_is_overridden_ = true;
-    serialization_deterministic_override_ = value;
-  }
-  // See above.  Also, note that users of this CodedOutputStream may need to
-  // call IsSerializationDeterministic() to serialize in the intended way.  This
-  // CodedOutputStream cannot enforce a desire for deterministic serialization
-  // by itself.
-  bool IsSerializationDeterministic() const {
-    return serialization_deterministic_is_overridden_ ?
-        serialization_deterministic_override_ :
-        IsDefaultSerializationDeterministic();
-  }
-
-  static bool IsDefaultSerializationDeterministic() {
-    return google::protobuf::internal::NoBarrier_Load(&default_serialization_deterministic_);
-  }
-
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream);
 
@@ -878,12 +809,6 @@
   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().
-  // See SetSerializationDeterministic() regarding these three fields.
-  bool serialization_deterministic_is_overridden_;
-  bool serialization_deterministic_override_;
-  // Conceptually, default_serialization_deterministic_ is an atomic bool.
-  // TODO(haberman): replace with std::atomic<bool> when we move to C++11.
-  static google::protobuf::internal::AtomicWord default_serialization_deterministic_;
 
   // Advance the buffer by a given number of bytes.
   void Advance(int amount);
@@ -899,19 +824,18 @@
   // If this write might cross the end of the buffer, we compose the bytes first
   // then use WriteRaw().
   void WriteVarint32SlowPath(uint32 value);
-  void WriteVarint64SlowPath(uint64 value);
 
-  // See above.  Other projects may use "friend" to allow them to call this.
-  // After SetDefaultSerializationDeterministic() completes, all protocol
-  // buffer serializations will be deterministic by default.  Thread safe.
-  // However, the meaning of "after" is subtle here: to be safe, each thread
-  // that wants deterministic serialization by default needs to call
-  // SetDefaultSerializationDeterministic() or ensure on its own that another
-  // thread has done so.
-  friend void ::google::protobuf::internal::MapTestForceDeterministic();
-  static void SetDefaultSerializationDeterministic() {
-    google::protobuf::internal::NoBarrier_Store(&default_serialization_deterministic_, 1);
-  }
+  // Always-inlined versions of WriteVarint* functions so that code can be
+  // reused, while still controlling size. For instance, WriteVarint32ToArray()
+  // should not directly call this: since it is inlined itself, doing so
+  // would greatly increase the size of generated code. Instead, it should call
+  // WriteVarint32FallbackToArray.  Meanwhile, WriteVarint32() is already
+  // out-of-line, so it should just invoke this directly to avoid any extra
+  // function call overhead.
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE static uint8* WriteVarint64ToArrayInline(
+      uint64 value, uint8* target);
+
+  static int VarintSize32Fallback(uint32 value);
 };
 
 // inline methods ====================================================
@@ -944,19 +868,6 @@
   return p.second;
 }
 
-inline bool CodedInputStream::ReadVarintSizeAsInt(int* value) {
-  if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) {
-    int v = *buffer_;
-    if (v < 0x80) {
-      *value = v;
-      Advance(1);
-      return true;
-    }
-  }
-  *value = ReadVarintSizeAsIntFallback();
-  return *value >= 0;
-}
-
 // static
 inline const uint8* CodedInputStream::ReadLittleEndian32FromArray(
     const uint8* buffer,
@@ -997,7 +908,8 @@
 inline bool CodedInputStream::ReadLittleEndian32(uint32* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
   if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) {
-    buffer_ = ReadLittleEndian32FromArray(buffer_, value);
+    memcpy(value, buffer_, sizeof(*value));
+    Advance(sizeof(*value));
     return true;
   } else {
     return ReadLittleEndian32Fallback(value);
@@ -1010,7 +922,8 @@
 inline bool CodedInputStream::ReadLittleEndian64(uint64* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
   if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) {
-    buffer_ = ReadLittleEndian64FromArray(buffer_, value);
+    memcpy(value, buffer_, sizeof(*value));
+    Advance(sizeof(*value));
     return true;
   } else {
     return ReadLittleEndian64Fallback(value);
@@ -1020,20 +933,21 @@
 #endif
 }
 
-inline uint32 CodedInputStream::ReadTagNoLastTag() {
+inline uint32 CodedInputStream::ReadTag() {
   uint32 v = 0;
   if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) {
     v = *buffer_;
     if (v < 0x80) {
+      last_tag_ = v;
       Advance(1);
       return v;
     }
   }
-  v = ReadTagFallback(v);
-  return v;
+  last_tag_ = ReadTagFallback(v);
+  return last_tag_;
 }
 
-inline std::pair<uint32, bool> CodedInputStream::ReadTagWithCutoffNoLastTag(
+inline std::pair<uint32, bool> CodedInputStream::ReadTagWithCutoff(
     uint32 cutoff) {
   // In performance-sensitive code we can expect cutoff to be a compile-time
   // constant, and things like "cutoff >= kMax1ByteVarint" to be evaluated at
@@ -1046,7 +960,7 @@
     first_byte_or_zero = buffer_[0];
     if (static_cast<int8>(buffer_[0]) > 0) {
       const uint32 kMax1ByteVarint = 0x7f;
-      uint32 tag = buffer_[0];
+      uint32 tag = last_tag_ = buffer_[0];
       Advance(1);
       return std::make_pair(tag, cutoff >= kMax1ByteVarint || tag <= cutoff);
     }
@@ -1057,7 +971,7 @@
         GOOGLE_PREDICT_TRUE(buffer_ + 1 < buffer_end_) &&
         GOOGLE_PREDICT_TRUE((buffer_[0] & ~buffer_[1]) >= 0x80)) {
       const uint32 kMax2ByteVarint = (0x7f << 7) + 0x7f;
-      uint32 tag = (1u << 7) * buffer_[1] + (buffer_[0] - 0x80);
+      uint32 tag = last_tag_ = (1u << 7) * buffer_[1] + (buffer_[0] - 0x80);
       Advance(2);
       // It might make sense to test for tag == 0 now, but it is so rare that
       // that we don't bother.  A varint-encoded 0 should be one byte unless
@@ -1070,8 +984,8 @@
     }
   }
   // Slow path
-  const uint32 tag = ReadTagFallback(first_byte_or_zero);
-  return std::make_pair(tag, static_cast<uint32>(tag - 1) < cutoff);
+  last_tag_ = ReadTagFallback(first_byte_or_zero);
+  return std::make_pair(last_tag_, static_cast<uint32>(last_tag_ - 1) < cutoff);
 }
 
 inline bool CodedInputStream::LastTagWas(uint32 expected) {
@@ -1166,24 +1080,21 @@
   return target + 1;
 }
 
-inline uint8* CodedOutputStream::WriteVarint64ToArray(uint64 value,
-                                                      uint8* target) {
-  while (value >= 0x80) {
-    *target = static_cast<uint8>(value | 0x80);
-    value >>= 7;
-    ++target;
-  }
-  *target = static_cast<uint8>(value);
-  return target + 1;
-}
-
 inline void CodedOutputStream::WriteVarint32SignExtended(int32 value) {
-  WriteVarint64(static_cast<uint64>(value));
+  if (value < 0) {
+    WriteVarint64(static_cast<uint64>(value));
+  } else {
+    WriteVarint32(static_cast<uint32>(value));
+  }
 }
 
 inline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray(
     int32 value, uint8* target) {
-  return WriteVarint64ToArray(static_cast<uint64>(value), target);
+  if (value < 0) {
+    return WriteVarint64ToArray(static_cast<uint64>(value), target);
+  } else {
+    return WriteVarint32ToArray(static_cast<uint32>(value), target);
+  }
 }
 
 inline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value,
@@ -1232,19 +1143,6 @@
   }
 }
 
-inline void CodedOutputStream::WriteVarint64(uint64 value) {
-  if (buffer_size_ >= 10) {
-    // Fast path:  We have enough bytes left in the buffer to guarantee that
-    // this write won't cross the end, so we can skip the checks.
-    uint8* target = buffer_;
-    uint8* end = WriteVarint64ToArray(value, target);
-    int size = static_cast<int>(end - target);
-    Advance(size);
-  } else {
-    WriteVarint64SlowPath(value);
-  }
-}
-
 inline void CodedOutputStream::WriteTag(uint32 value) {
   WriteVarint32(value);
 }
@@ -1254,27 +1152,15 @@
   return WriteVarint32ToArray(value, target);
 }
 
-inline size_t CodedOutputStream::VarintSize32(uint32 value) {
-  // This computes value == 0 ? 1 : floor(log2(value)) / 7 + 1
-  // Use an explicit multiplication to implement the divide of
-  // a number in the 1..31 range.
-  // Explicit OR 0x1 to avoid calling Bits::Log2FloorNonZero(0), which is
-  // undefined.
-  uint32 log2value = Bits::Log2FloorNonZero(value | 0x1);
-  return static_cast<size_t>((log2value * 9 + 73) / 64);
+inline int CodedOutputStream::VarintSize32(uint32 value) {
+  if (value < (1 << 7)) {
+    return 1;
+  } else  {
+    return VarintSize32Fallback(value);
+  }
 }
 
-inline size_t CodedOutputStream::VarintSize64(uint64 value) {
-  // This computes value == 0 ? 1 : floor(log2(value)) / 7 + 1
-  // Use an explicit multiplication to implement the divide of
-  // a number in the 1..63 range.
-  // Explicit OR 0x1 to avoid calling Bits::Log2FloorNonZero(0), which is
-  // undefined.
-  uint32 log2value = Bits::Log2FloorNonZero64(value | 0x1);
-  return static_cast<size_t>((log2value * 9 + 73) / 64);
-}
-
-inline size_t CodedOutputStream::VarintSize32SignExtended(int32 value) {
+inline int CodedOutputStream::VarintSize32SignExtended(int32 value) {
   if (value < 0) {
     return 10;     // TODO(kenton):  Make this a symbolic constant.
   } else {
@@ -1362,9 +1248,9 @@
     current_limit_(kint32max),
     buffer_size_after_limit_(0),
     total_bytes_limit_(kDefaultTotalBytesLimit),
+    total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),
     recursion_budget_(default_recursion_limit_),
     recursion_limit_(default_recursion_limit_),
-    disable_strict_correctness_enforcement_(true),
     extension_pool_(NULL),
     extension_factory_(NULL) {
   // Eagerly Refresh() so buffer space is immediately available.
@@ -1383,9 +1269,9 @@
     current_limit_(size),
     buffer_size_after_limit_(0),
     total_bytes_limit_(kDefaultTotalBytesLimit),
+    total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),
     recursion_budget_(default_recursion_limit_),
     recursion_limit_(default_recursion_limit_),
-    disable_strict_correctness_enforcement_(true),
     extension_pool_(NULL),
     extension_factory_(NULL) {
   // Note that setting current_limit_ == size is important to prevent some
@@ -1396,25 +1282,11 @@
   return input_ == NULL;
 }
 
-inline bool CodedInputStream::Skip(int count) {
-  if (count < 0) return false;  // security: count is often user-supplied
-
-  const int original_buffer_size = BufferSize();
-
-  if (count <= original_buffer_size) {
-    // Just skipping within the current buffer.  Easy.
-    Advance(count);
-    return true;
-  }
-
-  return SkipFallback(count, original_buffer_size);
-}
-
 }  // namespace io
 }  // namespace protobuf
 
 
-#if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
+#if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
   #pragma runtime_checks("c", restore)
 #endif  // _MSC_VER && !defined(__INTEL_COMPILER)
 
diff --git a/src/google/protobuf/io/coded_stream_unittest.cc b/src/google/protobuf/io/coded_stream_unittest.cc
index 96f91ae..a8108e4 100644
--- a/src/google/protobuf/io/coded_stream_unittest.cc
+++ b/src/google/protobuf/io/coded_stream_unittest.cc
@@ -58,12 +58,10 @@
 #define ULL(x) GOOGLE_ULONGLONG(x)
 
 namespace google {
-
 namespace protobuf {
 namespace io {
 namespace {
 
-
 // ===================================================================
 // Data-Driven Test Infrastructure
 
@@ -136,7 +134,7 @@
   // for further information.
   static void SetupTotalBytesLimitWarningTest(
       int total_bytes_limit, int warning_threshold,
-      std::vector<string>* out_errors, std::vector<string>* out_warnings);
+      vector<string>* out_errors, vector<string>* out_warnings);
 
   // Buffer used during most of the tests. This assumes tests run sequentially.
   static const int kBufferSize = 1024 * 64;
@@ -246,7 +244,7 @@
     int count_;
   } in;
   CodedInputStream input(&in);
-  input.ReadTagNoLastTag();
+  input.ReadTag();
   EXPECT_TRUE(input.ConsumedEntireMessage());
 }
 
@@ -447,21 +445,6 @@
   EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value));
 }
 
-TEST_2D(CodedStreamTest, ReadVarint32Error_LeavesValueInInitializedState,
-        kVarintErrorCases, kBlockSizes) {
-  memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);
-  ArrayInputStream input(buffer_, kVarintErrorCases_case.size,
-                         kBlockSizes_case);
-  CodedInputStream coded_input(&input);
-
-  uint32 value = 0;
-  EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value));
-  // While the specific value following a failure is not critical, we do want to
-  // ensure that it doesn't get set to an uninitialized value. (This check fails
-  // in MSAN mode if value has been set to an uninitialized value.)
-  EXPECT_EQ(value, value);
-}
-
 TEST_2D(CodedStreamTest, ReadVarint64Error, kVarintErrorCases, kBlockSizes) {
   memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);
   ArrayInputStream input(buffer_, kVarintErrorCases_case.size,
@@ -472,21 +455,6 @@
   EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value));
 }
 
-TEST_2D(CodedStreamTest, ReadVarint64Error_LeavesValueInInitializedState,
-        kVarintErrorCases, kBlockSizes) {
-  memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);
-  ArrayInputStream input(buffer_, kVarintErrorCases_case.size,
-                         kBlockSizes_case);
-  CodedInputStream coded_input(&input);
-
-  uint64 value = 0;
-  EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value));
-  // While the specific value following a failure is not critical, we do want to
-  // ensure that it doesn't get set to an uninitialized value. (This check fails
-  // in MSAN mode if value has been set to an uninitialized value.)
-  EXPECT_EQ(value, value);
-}
-
 // -------------------------------------------------------------------
 // VarintSize
 
@@ -526,28 +494,6 @@
     CodedOutputStream::VarintSize64(kVarintSizeCases_case.value));
 }
 
-TEST_F(CodedStreamTest, VarintSize32PowersOfTwo) {
-  int expected = 1;
-  for (int i = 1; i < 32; i++) {
-    if (i % 7 == 0) {
-      expected += 1;
-    }
-    EXPECT_EQ(expected,
-              CodedOutputStream::VarintSize32(static_cast<uint32>(0x1u << i)));
-  }
-}
-
-TEST_F(CodedStreamTest, VarintSize64PowersOfTwo) {
-  int expected = 1;
-  for (int i = 1; i < 64; i++) {
-    if (i % 7 == 0) {
-      expected += 1;
-    }
-    EXPECT_EQ(expected, CodedOutputStream::VarintSize64(
-                            static_cast<uint64>(0x1ull << i)));
-  }
-}
-
 // -------------------------------------------------------------------
 // Fixed-size int tests
 
@@ -1230,7 +1176,7 @@
   EXPECT_TRUE(coded_input.ReadString(&str, 16));
   EXPECT_EQ(0, coded_input.BytesUntilTotalBytesLimit());
 
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog error_log;
@@ -1264,7 +1210,7 @@
 
   // Read a tag.  Should fail, but report being a valid endpoint since it's
   // a regular limit.
-  EXPECT_EQ(0, coded_input.ReadTagNoLastTag());
+  EXPECT_EQ(0, coded_input.ReadTag());
   EXPECT_TRUE(coded_input.ConsumedEntireMessage());
 
   // Pop the limit.
@@ -1272,7 +1218,7 @@
 
   // Read a tag.  Should fail, and report *not* being a valid endpoint, since
   // this time we're hitting the total bytes limit.
-  EXPECT_EQ(0, coded_input.ReadTagNoLastTag());
+  EXPECT_EQ(0, coded_input.ReadTag());
   EXPECT_FALSE(coded_input.ConsumedEntireMessage());
 }
 
@@ -1282,7 +1228,7 @@
 // vectors.
 void CodedStreamTest::SetupTotalBytesLimitWarningTest(
     int total_bytes_limit, int warning_threshold,
-    std::vector<string>* out_errors, std::vector<string>* out_warnings) {
+    vector<string>* out_errors, vector<string>* out_warnings) {
   ArrayInputStream raw_input(buffer_, sizeof(buffer_), 128);
 
   ScopedMemoryLog scoped_log;
@@ -1297,6 +1243,39 @@
   *out_warnings = scoped_log.GetMessages(WARNING);
 }
 
+TEST_F(CodedStreamTest, TotalBytesLimitWarning) {
+  vector<string> errors;
+  vector<string> warnings;
+  SetupTotalBytesLimitWarningTest(10240, 1024, &errors, &warnings);
+
+  EXPECT_EQ(0, errors.size());
+
+  ASSERT_EQ(2, warnings.size());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring,
+    "Reading dangerously large protocol message.  If the message turns out to "
+    "be larger than 10240 bytes, parsing will be halted for security reasons.",
+    warnings[0]);
+  EXPECT_PRED_FORMAT2(testing::IsSubstring,
+    "The total number of bytes read was 2048",
+    warnings[1]);
+}
+
+TEST_F(CodedStreamTest, TotalBytesLimitWarningDisabled) {
+  vector<string> errors;
+  vector<string> warnings;
+
+  // Test with -1
+  SetupTotalBytesLimitWarningTest(10240, -1, &errors, &warnings);
+  EXPECT_EQ(0, errors.size());
+  EXPECT_EQ(0, warnings.size());
+
+  // Test again with -2, expecting the same result
+  SetupTotalBytesLimitWarningTest(10240, -2, &errors, &warnings);
+  EXPECT_EQ(0, errors.size());
+  EXPECT_EQ(0, warnings.size());
+}
+
+
 TEST_F(CodedStreamTest, RecursionLimit) {
   ArrayInputStream input(buffer_, sizeof(buffer_));
   CodedInputStream coded_input(&input);
@@ -1382,7 +1361,7 @@
   // input.BackUp() with the correct number of bytes on destruction.
   ReallyBigInputStream input;
 
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog error_log;
@@ -1397,6 +1376,9 @@
   EXPECT_EQ(0, errors.size());
 }
 
+// ===================================================================
+
+
 }  // namespace
 }  // namespace io
 }  // namespace protobuf
diff --git a/src/google/protobuf/io/gzip_stream.cc b/src/google/protobuf/io/gzip_stream.cc
index a569eff..9c621b6 100644
--- a/src/google/protobuf/io/gzip_stream.cc
+++ b/src/google/protobuf/io/gzip_stream.cc
@@ -168,7 +168,7 @@
 }
 bool GzipInputStream::Skip(int count) {
   const void* data;
-  int size = 0;
+  int size;
   bool ok = Next(&data, &size);
   while (ok && (size < count)) {
     count -= size;
diff --git a/src/google/protobuf/io/printer.cc b/src/google/protobuf/io/printer.cc
index 8493268..7532b09 100644
--- a/src/google/protobuf/io/printer.cc
+++ b/src/google/protobuf/io/printer.cc
@@ -70,8 +70,8 @@
 }
 
 bool Printer::GetSubstitutionRange(const char* varname,
-                                   std::pair<size_t, size_t>* range) {
-  std::map<string, std::pair<size_t, size_t> >::const_iterator iter =
+                                   pair<size_t, size_t>* range) {
+  map<string, pair<size_t, size_t> >::const_iterator iter =
       substitutions_.find(varname);
   if (iter == substitutions_.end()) {
     GOOGLE_LOG(DFATAL) << " Undefined variable in annotation: " << varname;
@@ -87,12 +87,12 @@
 }
 
 void Printer::Annotate(const char* begin_varname, const char* end_varname,
-                       const string& file_path, const std::vector<int>& path) {
+                       const string& file_path, const vector<int>& path) {
   if (annotation_collector_ == NULL) {
     // Can't generate signatures with this Printer.
     return;
   }
-  std::pair<size_t, size_t> begin, end;
+  pair<size_t, size_t> begin, end;
   if (!GetSubstitutionRange(begin_varname, &begin) ||
       !GetSubstitutionRange(end_varname, &end)) {
     return;
@@ -106,12 +106,10 @@
   }
 }
 
-void Printer::Print(const std::map<string, string>& variables,
-                    const char* text) {
+void Printer::Print(const map<string, string>& variables, const char* text) {
   int size = strlen(text);
   int pos = 0;  // The number of bytes we've written so far.
   substitutions_.clear();
-  line_start_variables_.clear();
 
   for (int i = 0; i < size; i++) {
     if (text[i] == '\n') {
@@ -123,7 +121,6 @@
       // Setting this true will cause the next WriteRaw() to insert an indent
       // first.
       at_start_of_line_ = true;
-      line_start_variables_.clear();
 
     } else if (text[i] == variable_delimiter_) {
       // Saw the start of a variable name.
@@ -146,19 +143,15 @@
         WriteRaw(&variable_delimiter_, 1);
       } else {
         // Replace with the variable's value.
-        std::map<string, string>::const_iterator iter = variables.find(varname);
+        map<string, string>::const_iterator iter = variables.find(varname);
         if (iter == variables.end()) {
           GOOGLE_LOG(DFATAL) << " Undefined variable: " << varname;
         } else {
-          if (at_start_of_line_ && iter->second.empty()) {
-            line_start_variables_.push_back(varname);
-          }
+          size_t begin = offset_;
           WriteRaw(iter->second.data(), iter->second.size());
-          std::pair<std::map<string, std::pair<size_t, size_t> >::iterator,
-                    bool>
-              inserted = substitutions_.insert(std::make_pair(
-                  varname,
-                  std::make_pair(offset_ - iter->second.size(), offset_)));
+          pair<map<string, pair<size_t, size_t> >::iterator, bool> inserted =
+              substitutions_.insert(
+                  std::make_pair(varname, std::make_pair(begin, offset_)));
           if (!inserted.second) {
             // This variable was used multiple times.  Make its span have
             // negative length so we can detect it if it gets used in an
@@ -179,13 +172,13 @@
 }
 
 void Printer::Print(const char* text) {
-  static std::map<string, string> empty;
+  static map<string, string> empty;
   Print(empty, text);
 }
 
 void Printer::Print(const char* text,
                     const char* variable, const string& value) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable] = value;
   Print(vars, text);
 }
@@ -193,7 +186,7 @@
 void Printer::Print(const char* text,
                     const char* variable1, const string& value1,
                     const char* variable2, const string& value2) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   Print(vars, text);
@@ -203,7 +196,7 @@
                     const char* variable1, const string& value1,
                     const char* variable2, const string& value2,
                     const char* variable3, const string& value3) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   vars[variable3] = value3;
@@ -215,7 +208,7 @@
                     const char* variable2, const string& value2,
                     const char* variable3, const string& value3,
                     const char* variable4, const string& value4) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   vars[variable3] = value3;
@@ -229,7 +222,7 @@
                     const char* variable3, const string& value3,
                     const char* variable4, const string& value4,
                     const char* variable5, const string& value5) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   vars[variable3] = value3;
@@ -245,7 +238,7 @@
                     const char* variable4, const string& value4,
                     const char* variable5, const string& value5,
                     const char* variable6, const string& value6) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   vars[variable3] = value3;
@@ -263,7 +256,7 @@
                     const char* variable5, const string& value5,
                     const char* variable6, const string& value6,
                     const char* variable7, const string& value7) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   vars[variable3] = value3;
@@ -283,7 +276,7 @@
                     const char* variable6, const string& value6,
                     const char* variable7, const string& value7,
                     const char* variable8, const string& value8) {
-  std::map<string, string> vars;
+  map<string, string> vars;
   vars[variable1] = value1;
   vars[variable2] = value2;
   vars[variable3] = value3;
@@ -324,29 +317,10 @@
   if (at_start_of_line_ && (size > 0) && (data[0] != '\n')) {
     // Insert an indent.
     at_start_of_line_ = false;
-    CopyToBuffer(indent_.data(), indent_.size());
+    WriteRaw(indent_.data(), indent_.size());
     if (failed_) return;
-    // Fix up empty variables (e.g., "{") that should be annotated as
-    // coming after the indent.
-    for (std::vector<string>::iterator i = line_start_variables_.begin();
-         i != line_start_variables_.end(); ++i) {
-      substitutions_[*i].first += indent_.size();
-      substitutions_[*i].second += indent_.size();
-    }
   }
 
-  // If we're going to write any data, clear line_start_variables_, since
-  // we've either updated them in the block above or they no longer refer to
-  // the current line.
-  line_start_variables_.clear();
-
-  CopyToBuffer(data, size);
-}
-
-void Printer::CopyToBuffer(const char* data, int size) {
-  if (failed_) return;
-  if (size == 0) return;
-
   while (size > buffer_size_) {
     // Data exceeds space in the buffer.  Copy what we can and request a
     // new buffer.
diff --git a/src/google/protobuf/io/printer.h b/src/google/protobuf/io/printer.h
index d11745c..2ba8455 100644
--- a/src/google/protobuf/io/printer.h
+++ b/src/google/protobuf/io/printer.h
@@ -55,7 +55,7 @@
   // before end_offset are associated with the SourceCodeInfo-style path.
   virtual void AddAnnotation(size_t begin_offset, size_t end_offset,
                              const string& file_path,
-                             const std::vector<int>& path) = 0;
+                             const vector<int>& path) = 0;
 
   virtual ~AnnotationCollector() {}
 };
@@ -73,8 +73,7 @@
 
   // Override for AnnotationCollector::AddAnnotation.
   virtual void AddAnnotation(size_t begin_offset, size_t end_offset,
-                             const string& file_path,
-                             const std::vector<int>& path) {
+                             const string& file_path, const vector<int>& path) {
     typename AnnotationProto::Annotation* annotation =
         annotation_proto_->add_annotation();
     for (int i = 0; i < path.size(); ++i) {
@@ -157,7 +156,7 @@
 //   vars["function"] = "call";
 //   vars["mark"] = "";
 //   printer.Print(vars, "$function$($foo$,$foo$)$mark$");
-//   printer.Annotate("function", "mark", call_);
+//   printer.Annotate("function", "rmark", call_);
 //
 // This code associates the span covering "call(bar,bar)" in the output with the
 // call_ descriptor.
@@ -196,37 +195,17 @@
       // of building the location path.
       return;
     }
-    std::vector<int> path;
+    vector<int> path;
     descriptor->GetLocationPath(&path);
     Annotate(begin_varname, end_varname, descriptor->file()->name(), path);
   }
 
-  // Link a subsitution variable emitted by the last call to Print to the file
-  // with path file_name.
-  void Annotate(const char* varname, const string& file_name) {
-    Annotate(varname, varname, file_name);
-  }
-
-  // Link the output range defined by the substitution variables as emitted by
-  // the last call to Print to the file with path file_name. The range begins
-  // at begin_varname's value and ends after the last character of the value
-  // substituted for end_varname.
-  void Annotate(const char* begin_varname, const char* end_varname,
-                const string& file_name) {
-    if (annotation_collector_ == NULL) {
-      // Annotations aren't turned on for this Printer.
-      return;
-    }
-    std::vector<int> empty_path;
-    Annotate(begin_varname, end_varname, file_name, empty_path);
-  }
-
   // Print some text after applying variable substitutions.  If a particular
   // variable in the text is not defined, this will crash.  Variables to be
   // substituted are identified by their names surrounded by delimiter
   // characters (as given to the constructor).  The variable bindings are
   // defined by the given map.
-  void Print(const std::map<string, string>& variables, const char* text);
+  void Print(const map<string, string>& variables, const char* text);
 
   // Like the first Print(), except the substitutions are given as parameters.
   void Print(const char* text);
@@ -309,10 +288,7 @@
   // substituted for end_varname. Note that begin_varname and end_varname
   // may refer to the same variable.
   void Annotate(const char* begin_varname, const char* end_varname,
-                const string& file_path, const std::vector<int>& path);
-
-  // Copy size worth of bytes from data to buffer_.
-  void CopyToBuffer(const char* data, int size);
+                const string& file_path, const vector<int>& path);
 
   const char variable_delimiter_;
 
@@ -335,19 +311,13 @@
   // start offset is the beginning of the substitution; the end offset is the
   // last byte of the substitution plus one (such that (end - start) is the
   // length of the substituted string).
-  std::map<string, std::pair<size_t, size_t> > substitutions_;
-
-  // Keeps track of the keys in substitutions_ that need to be updated when
-  // indents are inserted. These are keys that refer to the beginning of the
-  // current line.
-  std::vector<string> line_start_variables_;
+  map<string, pair<size_t, size_t> > substitutions_;
 
   // Returns true and sets range to the substitution range in the output for
   // varname if varname was used once in the last call to Print. If varname
   // was not used, or if it was used multiple times, returns false (and
   // fails a debug assertion).
-  bool GetSubstitutionRange(const char* varname,
-                            std::pair<size_t, size_t>* range);
+  bool GetSubstitutionRange(const char* varname, pair<size_t, size_t>* range);
 
   // If non-null, annotation_collector_ is used to store annotations about
   // generated code.
diff --git a/src/google/protobuf/io/printer_unittest.cc b/src/google/protobuf/io/printer_unittest.cc
index d0a0ebe..95f3afa 100644
--- a/src/google/protobuf/io/printer_unittest.cc
+++ b/src/google/protobuf/io/printer_unittest.cc
@@ -121,7 +121,7 @@
 
     {
       Printer printer(&output, '$');
-      std::map<string, string> vars;
+      map<string, string> vars;
 
       vars["foo"] = "World";
       vars["bar"] = "$foo$";
@@ -187,7 +187,7 @@
 // annotations.
 class MockDescriptor {
  public:
-  MockDescriptor(const string& file, const std::vector<int>& path)
+  MockDescriptor(const string& file, const vector<int>& path)
       : file_(file), path_(path) {}
 
   // The mock file in which this descriptor was defined.
@@ -201,7 +201,7 @@
   void GetLocationPath(std::vector<int>* output) const { *output = path_; }
 
   MockDescriptorFile file_;
-  std::vector<int> path_;
+  vector<int> path_;
 };
 
 TEST(Printer, AnnotateMap) {
@@ -211,13 +211,13 @@
   AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
   {
     Printer printer(&output, '$', &info_collector);
-    std::map<string, string> vars;
+    map<string, string> vars;
     vars["foo"] = "3";
     vars["bar"] = "5";
     printer.Print(vars, "012$foo$4$bar$\n");
-    std::vector<int> path_1;
+    vector<int> path_1;
     path_1.push_back(33);
-    std::vector<int> path_2;
+    vector<int> path_2;
     path_2.push_back(11);
     path_2.push_back(22);
     MockDescriptor descriptor_1("path_1", path_1);
@@ -255,9 +255,9 @@
   {
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
-    std::vector<int> path_1;
+    vector<int> path_1;
     path_1.push_back(33);
-    std::vector<int> path_2;
+    vector<int> path_2;
     path_2.push_back(11);
     path_2.push_back(22);
     MockDescriptor descriptor_1("path_1", path_1);
@@ -295,7 +295,7 @@
   {
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(33);
     MockDescriptor descriptor("path", path);
     printer.Annotate("foo", "bar", &descriptor);
@@ -320,7 +320,7 @@
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$baz$$bam$$bar$\n", "foo", "3", "bar", "5", "baz",
                   "", "bam", "");
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(33);
     MockDescriptor descriptor("path", path);
     printer.Annotate("baz", "bam", &descriptor);
@@ -344,7 +344,7 @@
   {
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$foo$$bar$\n", "foo", "3", "bar", "5");
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(33);
     MockDescriptor descriptor("path", path);
     printer.Annotate("bar", "bar", &descriptor);
@@ -360,83 +360,6 @@
   EXPECT_EQ(7, bar->end());
 }
 
-TEST(Printer, AnnotateIndent) {
-  char buffer[8192];
-  ArrayOutputStream output(buffer, sizeof(buffer));
-  GeneratedCodeInfo info;
-  AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
-  {
-    Printer printer(&output, '$', &info_collector);
-    printer.Print("0\n");
-    printer.Indent();
-    printer.Print("$foo$", "foo", "4");
-    std::vector<int> path;
-    path.push_back(44);
-    MockDescriptor descriptor("path", path);
-    printer.Annotate("foo", &descriptor);
-    printer.Print(",\n");
-    printer.Print("$bar$", "bar", "9");
-    path[0] = 99;
-    MockDescriptor descriptor_two("path", path);
-    printer.Annotate("bar", &descriptor_two);
-    printer.Print("\n${$$D$$}$\n", "{", "", "}", "", "D", "d");
-    path[0] = 1313;
-    MockDescriptor descriptor_three("path", path);
-    printer.Annotate("{", "}", &descriptor_three);
-    printer.Outdent();
-    printer.Print("\n");
-  }
-  buffer[output.ByteCount()] = '\0';
-  EXPECT_STREQ("0\n  4,\n  9\n  d\n\n", buffer);
-  ASSERT_EQ(3, info.annotation_size());
-  const GeneratedCodeInfo::Annotation* foo = &info.annotation(0);
-  ASSERT_EQ(1, foo->path_size());
-  EXPECT_EQ(44, foo->path(0));
-  EXPECT_EQ("path", foo->source_file());
-  EXPECT_EQ(4, foo->begin());
-  EXPECT_EQ(5, foo->end());
-  const GeneratedCodeInfo::Annotation* bar = &info.annotation(1);
-  ASSERT_EQ(1, bar->path_size());
-  EXPECT_EQ(99, bar->path(0));
-  EXPECT_EQ("path", bar->source_file());
-  EXPECT_EQ(9, bar->begin());
-  EXPECT_EQ(10, bar->end());
-  const GeneratedCodeInfo::Annotation* braces = &info.annotation(2);
-  ASSERT_EQ(1, braces->path_size());
-  EXPECT_EQ(1313, braces->path(0));
-  EXPECT_EQ("path", braces->source_file());
-  EXPECT_EQ(13, braces->begin());
-  EXPECT_EQ(14, braces->end());
-}
-
-TEST(Printer, AnnotateIndentNewline) {
-  char buffer[8192];
-  ArrayOutputStream output(buffer, sizeof(buffer));
-  GeneratedCodeInfo info;
-  AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
-  {
-    Printer printer(&output, '$', &info_collector);
-    printer.Indent();
-    printer.Print("$A$$N$$B$C\n", "A", "", "N", "\nz", "B", "");
-    std::vector<int> path;
-    path.push_back(0);
-    MockDescriptor descriptor("path", path);
-    printer.Annotate("A", "B", &descriptor);
-    printer.Outdent();
-    printer.Print("\n");
-  }
-  buffer[output.ByteCount()] = '\0';
-  EXPECT_STREQ("\nz  C\n\n", buffer);
-  ASSERT_EQ(1, info.annotation_size());
-  const GeneratedCodeInfo::Annotation* ab = &info.annotation(0);
-  ASSERT_EQ(1, ab->path_size());
-  EXPECT_EQ(0, ab->path(0));
-  EXPECT_EQ("path", ab->source_file());
-  EXPECT_EQ(0, ab->begin());
-  EXPECT_EQ(4, ab->end());
-}
-
-
 TEST(Printer, Indenting) {
   char buffer[8192];
 
@@ -445,7 +368,7 @@
 
     {
       Printer printer(&output, '$');
-      std::map<string, string> vars;
+      map<string, string> vars;
 
       vars["newline"] = "\n";
 
@@ -509,7 +432,7 @@
   {
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$foo$\n", "foo", "3");
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(33);
     MockDescriptor descriptor("path", path);
     EXPECT_DEBUG_DEATH(printer.Annotate("foo", "foo", &descriptor), "multiple");
@@ -524,7 +447,7 @@
   {
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(33);
     MockDescriptor descriptor("path", path);
     EXPECT_DEBUG_DEATH(printer.Annotate("bar", "foo", &descriptor), "negative");
@@ -539,7 +462,7 @@
   {
     Printer printer(&output, '$', &info_collector);
     printer.Print("012$foo$4$foo$\n", "foo", "3");
-    std::vector<int> path;
+    vector<int> path;
     path.push_back(33);
     MockDescriptor descriptor("path", path);
     EXPECT_DEBUG_DEATH(printer.Annotate("bar", "bar", &descriptor),
diff --git a/src/google/protobuf/io/tokenizer.cc b/src/google/protobuf/io/tokenizer.cc
index 916d160..b3550df 100644
--- a/src/google/protobuf/io/tokenizer.cc
+++ b/src/google/protobuf/io/tokenizer.cc
@@ -665,7 +665,7 @@
 class CommentCollector {
  public:
   CommentCollector(string* prev_trailing_comments,
-                   std::vector<string>* detached_comments,
+                   vector<string>* detached_comments,
                    string* next_leading_comments)
       : prev_trailing_comments_(prev_trailing_comments),
         detached_comments_(detached_comments),
@@ -737,7 +737,7 @@
 
  private:
   string* prev_trailing_comments_;
-  std::vector<string>* detached_comments_;
+  vector<string>* detached_comments_;
   string* next_leading_comments_;
 
   string comment_buffer_;
@@ -757,7 +757,7 @@
 } // namespace
 
 bool Tokenizer::NextWithComments(string* prev_trailing_comments,
-                                 std::vector<string>* detached_comments,
+                                 vector<string>* detached_comments,
                                  string* next_leading_comments) {
   CommentCollector collector(prev_trailing_comments, detached_comments,
                              next_leading_comments);
diff --git a/src/google/protobuf/io/tokenizer.h b/src/google/protobuf/io/tokenizer.h
index e80d564..64ee7d8 100644
--- a/src/google/protobuf/io/tokenizer.h
+++ b/src/google/protobuf/io/tokenizer.h
@@ -191,7 +191,7 @@
   //    * grault. */
   //   optional int32 grault = 6;
   bool NextWithComments(string* prev_trailing_comments,
-                        std::vector<string>* detached_comments,
+                        vector<string>* detached_comments,
                         string* next_leading_comments);
 
   // Parse helpers ---------------------------------------------------
@@ -329,7 +329,7 @@
   // depending on what was read.  This needs to know if the first
   // character was a zero in order to correctly recognize hex and octal
   // numbers.
-  // It also needs to know if the first character was a . to parse floating
+  // It also needs to know if the first characted was a . to parse floating
   // point correctly.
   TokenType ConsumeNumber(bool started_with_zero, bool started_with_dot);
 
diff --git a/src/google/protobuf/io/tokenizer_unittest.cc b/src/google/protobuf/io/tokenizer_unittest.cc
index e55288e..ae0811f 100644
--- a/src/google/protobuf/io/tokenizer_unittest.cc
+++ b/src/google/protobuf/io/tokenizer_unittest.cc
@@ -199,8 +199,8 @@
   Tokenizer::TokenType type;
 };
 
-inline std::ostream& operator<<(std::ostream& out,
-                                const SimpleTokenCase& test_case) {
+inline ostream& operator<<(ostream& out,
+                           const SimpleTokenCase& test_case) {
   return out << CEscape(test_case.input);
 }
 
@@ -333,15 +333,15 @@
                                 // needed.
 };
 
-inline std::ostream& operator<<(std::ostream& out,
-                                const MultiTokenCase& test_case) {
+inline ostream& operator<<(ostream& out,
+                           const MultiTokenCase& test_case) {
   return out << CEscape(test_case.input);
 }
 
 MultiTokenCase kMultiTokenCases[] = {
   // Test empty input.
   { "", {
-    { Tokenizer::TYPE_END       , ""     , 0,  0,  0 },
+    { Tokenizer::TYPE_END       , ""     , 0,  0 },
   }},
 
   // Test all token types at the same time.
@@ -520,8 +520,8 @@
   const char* next_leading_comments;
 };
 
-inline std::ostream& operator<<(std::ostream& out,
-                                const DocCommentCase& test_case) {
+inline ostream& operator<<(ostream& out,
+                           const DocCommentCase& test_case) {
   return out << CEscape(test_case.input);
 }
 
@@ -693,7 +693,7 @@
   EXPECT_EQ("prev", tokenizer2.current().text);
 
   string prev_trailing_comments;
-  std::vector<string> detached_comments;
+  vector<string> detached_comments;
   string next_leading_comments;
   tokenizer.NextWithComments(&prev_trailing_comments, &detached_comments,
                              &next_leading_comments);
@@ -860,7 +860,8 @@
   const char* errors;
 };
 
-inline std::ostream& operator<<(std::ostream& out, const ErrorCase& test_case) {
+inline ostream& operator<<(ostream& out,
+                           const ErrorCase& test_case) {
   return out << CEscape(test_case.input);
 }
 
diff --git a/src/google/protobuf/io/zero_copy_stream.cc b/src/google/protobuf/io/zero_copy_stream.cc
index f81555e..186de00 100644
--- a/src/google/protobuf/io/zero_copy_stream.cc
+++ b/src/google/protobuf/io/zero_copy_stream.cc
@@ -41,6 +41,9 @@
 namespace protobuf {
 namespace io {
 
+ZeroCopyInputStream::~ZeroCopyInputStream() {}
+ZeroCopyOutputStream::~ZeroCopyOutputStream() {}
+
 
 bool ZeroCopyOutputStream::WriteAliasedRaw(const void* /* data */,
                                            int /* size */) {
diff --git a/src/google/protobuf/io/zero_copy_stream.h b/src/google/protobuf/io/zero_copy_stream.h
index 62ace7a..52650fc 100644
--- a/src/google/protobuf/io/zero_copy_stream.h
+++ b/src/google/protobuf/io/zero_copy_stream.h
@@ -123,8 +123,8 @@
 // copying.
 class LIBPROTOBUF_EXPORT ZeroCopyInputStream {
  public:
-  ZeroCopyInputStream() {}
-  virtual ~ZeroCopyInputStream() {}
+  inline ZeroCopyInputStream() {}
+  virtual ~ZeroCopyInputStream();
 
   // Obtains a chunk of data from the stream.
   //
@@ -180,8 +180,8 @@
 // copying.
 class LIBPROTOBUF_EXPORT ZeroCopyOutputStream {
  public:
-  ZeroCopyOutputStream() {}
-  virtual ~ZeroCopyOutputStream() {}
+  inline ZeroCopyOutputStream() {}
+  virtual ~ZeroCopyOutputStream();
 
   // Obtains a buffer into which data can be written.  Any data written
   // into this buffer will eventually (maybe instantly, maybe later on)
diff --git a/src/google/protobuf/io/zero_copy_stream_impl.cc b/src/google/protobuf/io/zero_copy_stream_impl.cc
index dd92113..7ec2b5d 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl.cc
+++ b/src/google/protobuf/io/zero_copy_stream_impl.cc
@@ -32,7 +32,9 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#include <io.h>
+#else
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -41,11 +43,11 @@
 #include <errno.h>
 #include <iostream>
 #include <algorithm>
+
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 
 namespace google {
@@ -56,13 +58,6 @@
 // Win32 lseek is broken:  If invoked on a non-seekable file descriptor, its
 // return value is undefined.  We re-define it to always produce an error.
 #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;
 #endif
 
 namespace {
@@ -86,6 +81,8 @@
     impl_(&copying_input_, block_size) {
 }
 
+FileInputStream::~FileInputStream() {}
+
 bool FileInputStream::Close() {
   return copying_input_.Close();
 }
@@ -273,8 +270,12 @@
 
 // ===================================================================
 
-IstreamInputStream::IstreamInputStream(std::istream* input, int block_size)
-    : copying_input_(input), impl_(&copying_input_, block_size) {}
+IstreamInputStream::IstreamInputStream(istream* input, int block_size)
+  : copying_input_(input),
+    impl_(&copying_input_, block_size) {
+}
+
+IstreamInputStream::~IstreamInputStream() {}
 
 bool IstreamInputStream::Next(const void** data, int* size) {
   return impl_.Next(data, size);
@@ -293,8 +294,9 @@
 }
 
 IstreamInputStream::CopyingIstreamInputStream::CopyingIstreamInputStream(
-    std::istream* input)
-    : input_(input) {}
+    istream* input)
+  : input_(input) {
+}
 
 IstreamInputStream::CopyingIstreamInputStream::~CopyingIstreamInputStream() {}
 
@@ -310,8 +312,10 @@
 
 // ===================================================================
 
-OstreamOutputStream::OstreamOutputStream(std::ostream* output, int block_size)
-    : copying_output_(output), impl_(&copying_output_, block_size) {}
+OstreamOutputStream::OstreamOutputStream(ostream* output, int block_size)
+  : copying_output_(output),
+    impl_(&copying_output_, block_size) {
+}
 
 OstreamOutputStream::~OstreamOutputStream() {
   impl_.Flush();
@@ -330,8 +334,9 @@
 }
 
 OstreamOutputStream::CopyingOstreamOutputStream::CopyingOstreamOutputStream(
-    std::ostream* output)
-    : output_(output) {}
+    ostream* output)
+  : output_(output) {
+}
 
 OstreamOutputStream::CopyingOstreamOutputStream::~CopyingOstreamOutputStream() {
 }
@@ -349,6 +354,9 @@
   : streams_(streams), stream_count_(count), bytes_retired_(0) {
 }
 
+ConcatenatingInputStream::~ConcatenatingInputStream() {
+}
+
 bool ConcatenatingInputStream::Next(const void** data, int* size) {
   while (stream_count_ > 0) {
     if (streams_[0]->Next(data, size)) return true;
diff --git a/src/google/protobuf/io/zero_copy_stream_impl.h b/src/google/protobuf/io/zero_copy_stream_impl.h
index ea978bf..0746fa6 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl.h
+++ b/src/google/protobuf/io/zero_copy_stream_impl.h
@@ -67,6 +67,7 @@
   // should be read and returned with each call to Next().  Otherwise,
   // a reasonable default is used.
   explicit FileInputStream(int file_descriptor, int block_size = -1);
+  ~FileInputStream();
 
   // Flushes any buffers and closes the underlying file.  Returns false if
   // an error occurs during the process; use GetErrno() to examine the error.
@@ -217,7 +218,8 @@
   // If a block_size is given, it specifies the number of bytes that
   // should be read and returned with each call to Next().  Otherwise,
   // a reasonable default is used.
-  explicit IstreamInputStream(std::istream* stream, int block_size = -1);
+  explicit IstreamInputStream(istream* stream, int block_size = -1);
+  ~IstreamInputStream();
 
   // implements ZeroCopyInputStream ----------------------------------
   bool Next(const void** data, int* size);
@@ -228,7 +230,7 @@
  private:
   class LIBPROTOBUF_EXPORT CopyingIstreamInputStream : public CopyingInputStream {
    public:
-    CopyingIstreamInputStream(std::istream* input);
+    CopyingIstreamInputStream(istream* input);
     ~CopyingIstreamInputStream();
 
     // implements CopyingInputStream ---------------------------------
@@ -237,7 +239,7 @@
 
    private:
     // The stream.
-    std::istream* input_;
+    istream* input_;
 
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingIstreamInputStream);
   };
@@ -260,7 +262,7 @@
   // If a block_size is given, it specifies the size of the buffers
   // that should be returned by Next().  Otherwise, a reasonable default
   // is used.
-  explicit OstreamOutputStream(std::ostream* stream, int block_size = -1);
+  explicit OstreamOutputStream(ostream* stream, int block_size = -1);
   ~OstreamOutputStream();
 
   // implements ZeroCopyOutputStream ---------------------------------
@@ -271,7 +273,7 @@
  private:
   class LIBPROTOBUF_EXPORT CopyingOstreamOutputStream : public CopyingOutputStream {
    public:
-    CopyingOstreamOutputStream(std::ostream* output);
+    CopyingOstreamOutputStream(ostream* output);
     ~CopyingOstreamOutputStream();
 
     // implements CopyingOutputStream --------------------------------
@@ -279,7 +281,7 @@
 
    private:
     // The stream.
-    std::ostream* output_;
+    ostream* output_;
 
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOstreamOutputStream);
   };
@@ -304,6 +306,7 @@
   // All streams passed in as well as the array itself must remain valid
   // until the ConcatenatingInputStream is destroyed.
   ConcatenatingInputStream(ZeroCopyInputStream* const streams[], int count);
+  ~ConcatenatingInputStream();
 
   // implements ZeroCopyInputStream ----------------------------------
   bool Next(const void** data, int* size);
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 66ad49b..e6ca88c 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
+++ b/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
@@ -64,6 +64,9 @@
     last_returned_size_(0) {
 }
 
+ArrayInputStream::~ArrayInputStream() {
+}
+
 bool ArrayInputStream::Next(const void** data, int* size) {
   if (position_ < size_) {
     last_returned_size_ = std::min(block_size_, size_ - position_);
@@ -114,6 +117,9 @@
     last_returned_size_(0) {
 }
 
+ArrayOutputStream::~ArrayOutputStream() {
+}
+
 bool ArrayOutputStream::Next(void** data, int* size) {
   if (position_ < size_) {
     last_returned_size_ = std::min(block_size_, size_ - position_);
@@ -147,6 +153,9 @@
   : target_(target) {
 }
 
+StringOutputStream::~StringOutputStream() {
+}
+
 bool StringOutputStream::Next(void** data, int* size) {
   GOOGLE_CHECK(target_ != NULL);
   int old_size = target_->size();
@@ -196,6 +205,32 @@
 
 // ===================================================================
 
+LazyStringOutputStream::LazyStringOutputStream(
+    ResultCallback<string*>* callback)
+    : StringOutputStream(NULL),
+      callback_(GOOGLE_CHECK_NOTNULL(callback)),
+      string_is_set_(false) {
+}
+
+LazyStringOutputStream::~LazyStringOutputStream() {
+}
+
+bool LazyStringOutputStream::Next(void** data, int* size) {
+  if (!string_is_set_) {
+    SetString(callback_->Run());
+    string_is_set_ = true;
+  }
+  return StringOutputStream::Next(data, size);
+}
+
+int64 LazyStringOutputStream::ByteCount() const {
+  return string_is_set_ ? StringOutputStream::ByteCount() : 0;
+}
+
+// ===================================================================
+
+CopyingInputStream::~CopyingInputStream() {}
+
 int CopyingInputStream::Skip(int count) {
   char junk[4096];
   int skipped = 0;
@@ -315,6 +350,8 @@
 
 // ===================================================================
 
+CopyingOutputStream::~CopyingOutputStream() {}
+
 CopyingOutputStreamAdaptor::CopyingOutputStreamAdaptor(
     CopyingOutputStream* copying_stream, int block_size)
   : copying_stream_(copying_stream),
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 ab0fd5a..9d81ccf 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl_lite.h
+++ b/src/google/protobuf/io/zero_copy_stream_impl_lite.h
@@ -53,6 +53,7 @@
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/stubs/callback.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 #include <google/protobuf/stubs/stl_util.h>
 
 
@@ -73,6 +74,7 @@
   // useful for testing; in production you would probably never want to set
   // it.
   ArrayInputStream(const void* data, int size, int block_size = -1);
+  ~ArrayInputStream();
 
   // implements ZeroCopyInputStream ----------------------------------
   bool Next(const void** data, int* size);
@@ -106,6 +108,7 @@
   // useful for testing; in production you would probably never want to set
   // it.
   ArrayOutputStream(void* data, int size, int block_size = -1);
+  ~ArrayOutputStream();
 
   // implements ZeroCopyOutputStream ---------------------------------
   bool Next(void** data, int* size);
@@ -139,6 +142,7 @@
   //   the first call to Next() will return at least n bytes of buffer
   //   space.
   explicit StringOutputStream(string* target);
+  ~StringOutputStream();
 
   // implements ZeroCopyOutputStream ---------------------------------
   bool Next(void** data, int* size);
@@ -156,6 +160,27 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream);
 };
 
+// LazyStringOutputStream is a StringOutputStream with lazy acquisition of
+// the output string from a callback. The string is owned externally, and not
+// deleted in the stream destructor.
+class LIBPROTOBUF_EXPORT LazyStringOutputStream : public StringOutputStream {
+ public:
+  // Callback should be permanent (non-self-deleting). Ownership is transferred
+  // to the LazyStringOutputStream.
+  explicit LazyStringOutputStream(ResultCallback<string*>* callback);
+  ~LazyStringOutputStream();
+
+  // implements ZeroCopyOutputStream, overriding StringOutputStream -----------
+  bool Next(void** data, int* size);
+  int64 ByteCount() const;
+
+ private:
+  const google::protobuf::scoped_ptr<ResultCallback<string*> > callback_;
+  bool string_is_set_;
+
+  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyStringOutputStream);
+};
+
 // Note:  There is no StringInputStream.  Instead, just create an
 // ArrayInputStream as follows:
 //   ArrayInputStream input(str.data(), str.size());
@@ -175,7 +200,7 @@
 // in large blocks.
 class LIBPROTOBUF_EXPORT CopyingInputStream {
  public:
-  virtual ~CopyingInputStream() {}
+  virtual ~CopyingInputStream();
 
   // Reads up to "size" bytes into the given buffer.  Returns the number of
   // bytes read.  Read() waits until at least one byte is available, or
@@ -269,7 +294,7 @@
 // in large blocks.
 class LIBPROTOBUF_EXPORT CopyingOutputStream {
  public:
-  virtual ~CopyingOutputStream() {}
+  virtual ~CopyingOutputStream();
 
   // Writes "size" bytes from the given buffer to the output.  Returns true
   // if successful, false on a write error.
@@ -375,7 +400,7 @@
 #ifdef LANG_CXX11
   return std::make_pair(p, true);
 #else
-  return std::make_pair(p, p != NULL);
+  return make_pair(p, p != NULL);
 #endif
 }
 
diff --git a/src/google/protobuf/io/zero_copy_stream_unittest.cc b/src/google/protobuf/io/zero_copy_stream_unittest.cc
index 91792f1..a9db887 100644
--- a/src/google/protobuf/io/zero_copy_stream_unittest.cc
+++ b/src/google/protobuf/io/zero_copy_stream_unittest.cc
@@ -47,7 +47,9 @@
 //   implementations.
 
 
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#include <io.h>
+#else
 #include <unistd.h>
 #endif
 #include <stdlib.h>
@@ -74,7 +76,6 @@
 #include <google/protobuf/testing/googletest.h>
 #include <google/protobuf/testing/file.h>
 #include <gtest/gtest.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 namespace google {
 namespace protobuf {
@@ -83,12 +84,6 @@
 
 #ifdef _WIN32
 #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;
 #endif
 
 #ifndef O_BINARY
@@ -887,7 +882,7 @@
   for (int i = 0; i < kBlockSizeCount; i++) {
     for (int j = 0; j < kBlockSizeCount; j++) {
       {
-        std::stringstream stream;
+        stringstream stream;
 
         {
           OstreamOutputStream output(&stream, kBlockSizes[i]);
@@ -903,7 +898,7 @@
       }
 
       {
-        std::stringstream stream;
+        stringstream stream;
 
         {
           OstreamOutputStream output(&stream, kBlockSizes[i]);
diff --git a/src/google/protobuf/lite_arena_unittest.cc b/src/google/protobuf/lite_arena_unittest.cc
index dadaffb..f0bee88 100644
--- a/src/google/protobuf/lite_arena_unittest.cc
+++ b/src/google/protobuf/lite_arena_unittest.cc
@@ -37,22 +37,13 @@
 namespace protobuf {
 namespace {
 
-class LiteArenaTest : public testing::Test {
- protected:
-  LiteArenaTest() {
-    ArenaOptions options;
-    options.start_block_size = 128 * 1024;
-    options.max_block_size = 128 * 1024;
-    arena_.reset(new Arena(options));
-    // Trigger the allocation of the first arena block, so that further use of
-    // the arena will not require any heap allocations.
-    google::protobuf::Arena::CreateArray<char>(arena_.get(), 1);
-  }
-
-  google::protobuf::scoped_ptr<Arena> arena_;
-};
-
-TEST_F(LiteArenaTest, MapNoHeapAllocation) {
+TEST(LiteArenaTest, MapNoHeapAllocation) {
+  // Allocate a large initial block to avoid mallocs during hooked test.
+  std::vector<char> arena_block(128 * 1024);
+  google::protobuf::ArenaOptions options;
+  options.initial_block = &arena_block[0];
+  options.initial_block_size = arena_block.size();
+  google::protobuf::Arena arena(options);
   string data;
   data.reserve(128 * 1024);
 
@@ -62,21 +53,22 @@
     // google::protobuf::internal::NoHeapChecker no_heap;
 
     protobuf_unittest::TestArenaMapLite* from =
-        Arena::CreateMessage<protobuf_unittest::TestArenaMapLite>(arena_.get());
+        google::protobuf::Arena::CreateMessage<protobuf_unittest::TestArenaMapLite>(&arena);
     google::protobuf::MapLiteTestUtil::SetArenaMapFields(from);
     from->SerializeToString(&data);
 
     protobuf_unittest::TestArenaMapLite* to =
-        Arena::CreateMessage<protobuf_unittest::TestArenaMapLite>(arena_.get());
+        google::protobuf::Arena::CreateMessage<protobuf_unittest::TestArenaMapLite>(&arena);
     to->ParseFromString(data);
     google::protobuf::MapLiteTestUtil::ExpectArenaMapFieldsSet(*to);
   }
 }
 
-TEST_F(LiteArenaTest, UnknownFieldMemLeak) {
+TEST(LiteArenaTest, UnknownFieldMemLeak) {
+  google::protobuf::Arena arena;
   protobuf_unittest::ForeignMessageArenaLite* message =
       google::protobuf::Arena::CreateMessage<protobuf_unittest::ForeignMessageArenaLite>(
-          arena_.get());
+          &arena);
   string data = "\012\000";
   int original_capacity = data.capacity();
   while (data.capacity() <= original_capacity) {
diff --git a/src/google/protobuf/lite_unittest.cc b/src/google/protobuf/lite_unittest.cc
index d669396..3ca3fba 100644
--- a/src/google/protobuf/lite_unittest.cc
+++ b/src/google/protobuf/lite_unittest.cc
@@ -36,26 +36,24 @@
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/arena_test_util.h>
-#include <google/protobuf/map_lite_test_util.h>
 #include <google/protobuf/map_lite_unittest.pb.h>
+#include <google/protobuf/map_lite_test_util.h>
 #include <google/protobuf/test_util_lite.h>
 #include <google/protobuf/unittest_lite.pb.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 #include <google/protobuf/wire_format_lite.h>
 #include <google/protobuf/wire_format_lite_inl.h>
-#include <gtest/gtest.h>
-
 #include <google/protobuf/stubs/strutil.h>
 
-using std::string;
+using namespace std;
 
 namespace {
 // Helper methods to test parsing merge behavior.
 void ExpectMessageMerged(const google::protobuf::unittest::TestAllTypesLite& message) {
-  EXPECT_EQ(message.optional_int32(), 3);
-  EXPECT_EQ(message.optional_int64(), 2);
-  EXPECT_EQ(message.optional_string(), "hello");
+  GOOGLE_CHECK(message.optional_int32() == 3);
+  GOOGLE_CHECK(message.optional_int64() == 2);
+  GOOGLE_CHECK(message.optional_string() == "hello");
 }
 
 void AssignParsingMergeMessages(
@@ -91,8 +89,14 @@
 
 }  // namespace
 
-TEST(Lite, AllLite1) {
-  string data;
+#define EXPECT_TRUE GOOGLE_CHECK
+#define ASSERT_TRUE GOOGLE_CHECK
+#define EXPECT_FALSE(COND) GOOGLE_CHECK(!(COND))
+#define EXPECT_EQ GOOGLE_CHECK_EQ
+#define ASSERT_EQ GOOGLE_CHECK_EQ
+
+int main(int argc, char* argv[]) {
+  string data, data2, packed_data;
 
   {
     protobuf_unittest::TestAllTypesLite message, message2, message3;
@@ -109,10 +113,7 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectClear(message);
   }
-}
 
-TEST(Lite, AllLite2) {
-  string data;
   {
     protobuf_unittest::TestAllExtensionsLite message, message2, message3;
     google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
@@ -128,10 +129,6 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
   }
-}
-
-TEST(Lite, AllLite3) {
-  string data, packed_data;
 
   {
     protobuf_unittest::TestPackedTypesLite message, message2, message3;
@@ -155,7 +152,7 @@
     google::protobuf::TestUtilLite::SetPackedExtensions(&message);
     message2.CopyFrom(message);
     string packed_extensions_data = message.SerializeAsString();
-    EXPECT_EQ(packed_extensions_data, packed_data);
+    GOOGLE_CHECK(packed_extensions_data == packed_data);
     message3.ParseFromString(packed_extensions_data);
     google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message);
     google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2);
@@ -165,10 +162,6 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
   }
-}
-
-TEST(Lite, AllLite5) {
-  string data;
 
   {
     // Test that if an optional or required message/group field appears multiple
@@ -216,16 +209,11 @@
         google::protobuf::unittest::TestParsingMergeLite::optional_ext));
 
     // Repeated fields should not be merged.
-    EXPECT_EQ(parsing_merge.repeated_all_types_size(), 3);
-    EXPECT_EQ(parsing_merge.repeatedgroup_size(), 3);
-    EXPECT_EQ(parsing_merge.ExtensionSize(
-                  google::protobuf::unittest::TestParsingMergeLite::repeated_ext),
-              3);
+    GOOGLE_CHECK(parsing_merge.repeated_all_types_size() == 3);
+    GOOGLE_CHECK(parsing_merge.repeatedgroup_size() == 3);
+    GOOGLE_CHECK(parsing_merge.ExtensionSize(
+        google::protobuf::unittest::TestParsingMergeLite::repeated_ext) == 3);
   }
-}
-
-TEST(Lite, AllLite6) {
-  string data;
 
   // Test unknown fields support for lite messages.
   {
@@ -243,10 +231,6 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectClear(message);
   }
-}
-
-TEST(Lite, AllLite7) {
-  string data;
 
   {
     protobuf_unittest::TestAllExtensionsLite message, message2;
@@ -263,10 +247,6 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectExtensionsClear(message);
   }
-}
-
-TEST(Lite, AllLite8) {
-  string data;
 
   {
     protobuf_unittest::TestPackedTypesLite message, message2;
@@ -283,10 +263,6 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectPackedClear(message);
   }
-}
-
-TEST(Lite, AllLite9) {
-  string data;
 
   {
     protobuf_unittest::TestPackedExtensionsLite message, message2;
@@ -303,10 +279,6 @@
     message.Clear();
     google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
   }
-}
-
-TEST(Lite, AllLite10) {
-  string data;
 
   {
     // Test Unknown fields swap
@@ -314,15 +286,11 @@
     SetAllTypesInEmptyMessageUnknownFields(&empty_message);
     SetSomeTypesInEmptyMessageUnknownFields(&empty_message2);
     data = empty_message.SerializeAsString();
-    string data2 = empty_message2.SerializeAsString();
+    data2 = empty_message2.SerializeAsString();
     empty_message.Swap(&empty_message2);
-    EXPECT_EQ(data, empty_message2.SerializeAsString());
-    EXPECT_EQ(data2, empty_message.SerializeAsString());
+    GOOGLE_CHECK_EQ(data, empty_message2.SerializeAsString());
+    GOOGLE_CHECK_EQ(data2, empty_message.SerializeAsString());
   }
-}
-
-TEST(Lite, AllLite11) {
-  string data;
 
   {
     // Test unknown fields swap with self
@@ -330,12 +298,8 @@
     SetAllTypesInEmptyMessageUnknownFields(&empty_message);
     data = empty_message.SerializeAsString();
     empty_message.Swap(&empty_message);
-    EXPECT_EQ(data, empty_message.SerializeAsString());
+    GOOGLE_CHECK_EQ(data, empty_message.SerializeAsString());
   }
-}
-
-TEST(Lite, AllLite12) {
-  string data;
 
   {
     // Test MergeFrom with unknown fields
@@ -360,12 +324,8 @@
     // We do not compare the serialized output of a normal message and a lite
     // message because the order of fields do not match. We convert lite message
     // back into normal message, then compare.
-    EXPECT_EQ(message.SerializeAsString(), message2.SerializeAsString());
+    GOOGLE_CHECK_EQ(message.SerializeAsString(), message2.SerializeAsString());
   }
-}
-
-TEST(Lite, AllLite13) {
-  string data;
 
   {
     // Test unknown enum value
@@ -385,26 +345,18 @@
     }
     message.ParseFromString(buffer);
     data = message.SerializeAsString();
-    EXPECT_EQ(data, buffer);
+    GOOGLE_CHECK_EQ(data, buffer);
   }
-}
-
-TEST(Lite, AllLite14) {
-  string data;
 
   {
     // Test Clear with unknown fields
     protobuf_unittest::TestEmptyMessageLite empty_message;
     SetAllTypesInEmptyMessageUnknownFields(&empty_message);
     empty_message.Clear();
-    EXPECT_EQ(0, empty_message.unknown_fields().size());
+    GOOGLE_CHECK_EQ(0, empty_message.unknown_fields().size());
   }
-}
 
-// Tests for map lite =============================================
-
-TEST(Lite, AllLite15) {
-  string data;
+  // Tests for map lite =============================================
 
   {
     // Accessors
@@ -416,10 +368,6 @@
     google::protobuf::MapLiteTestUtil::ModifyMapFields(&message);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsModified(message);
   }
-}
-
-TEST(Lite, AllLite16) {
-  string data;
 
   {
     // SetMapFieldsInitialized
@@ -428,10 +376,6 @@
     google::protobuf::MapLiteTestUtil::SetMapFieldsInitialized(&message);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSetInitialized(message);
   }
-}
-
-TEST(Lite, AllLite17) {
-  string data;
 
   {
     // Clear
@@ -441,10 +385,6 @@
     message.Clear();
     google::protobuf::MapLiteTestUtil::ExpectClear(message);
   }
-}
-
-TEST(Lite, AllLite18) {
-  string data;
 
   {
     // ClearMessageMap
@@ -454,10 +394,6 @@
     google::protobuf::TestUtilLite::ExpectClear(
         (*message.mutable_map_int32_message())[0]);
   }
-}
-
-TEST(Lite, AllLite19) {
-  string data;
 
   {
     // CopyFrom
@@ -471,10 +407,6 @@
     message2.CopyFrom(message2);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
   }
-}
-
-TEST(Lite, AllLite20) {
-  string data;
 
   {
     // CopyFromMessageMap
@@ -489,10 +421,6 @@
     EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
     EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
   }
-}
-
-TEST(Lite, AllLite21) {
-  string data;
 
   {
     // SwapWithEmpty
@@ -506,10 +434,6 @@
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
     google::protobuf::MapLiteTestUtil::ExpectClear(message1);
   }
-}
-
-TEST(Lite, AllLite22) {
-  string data;
 
   {
     // SwapWithSelf
@@ -521,10 +445,6 @@
     message.Swap(&message);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message);
   }
-}
-
-TEST(Lite, AllLite23) {
-  string data;
 
   {
     // SwapWithOther
@@ -538,10 +458,6 @@
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsModified(message1);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
   }
-}
-
-TEST(Lite, AllLite24) {
-  string data;
 
   {
     // CopyConstructor
@@ -551,10 +467,6 @@
     protobuf_unittest::TestMapLite message2(message1);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
   }
-}
-
-TEST(Lite, AllLite25) {
-  string data;
 
   {
     // CopyAssignmentOperator
@@ -569,10 +481,6 @@
     message2.operator=(message2);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
   }
-}
-
-TEST(Lite, AllLite26) {
-  string data;
 
   {
     // NonEmptyMergeFrom
@@ -591,10 +499,6 @@
     message1.MergeFrom(message2);
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message1);
   }
-}
-
-TEST(Lite, AllLite27) {
-  string data;
 
   {
     // MergeFromMessageMap
@@ -609,10 +513,6 @@
     EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
     EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
   }
-}
-
-TEST(Lite, AllLite28) {
-  string data;
 
   {
     // Test the generated SerializeWithCachedSizesToArray()
@@ -627,10 +527,6 @@
     EXPECT_TRUE(message2.ParseFromString(data));
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
   }
-}
-
-TEST(Lite, AllLite29) {
-  string data;
 
   {
     // Test the generated SerializeWithCachedSizes()
@@ -651,12 +547,8 @@
     EXPECT_TRUE(message2.ParseFromString(data));
     google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2);
   }
-}
 
 
-TEST(Lite, AllLite32) {
-  string data;
-
   {
     // Proto2UnknownEnum
     protobuf_unittest::TestEnumMapPlusExtraLite from;
@@ -686,10 +578,6 @@
     EXPECT_EQ(protobuf_unittest::E_PROTO2_MAP_ENUM_EXTRA_LITE,
               from.unknown_map_field().at(0));
   }
-}
-
-TEST(Lite, AllLite33) {
-  string data;
 
   {
     // StandardWireFormat
@@ -700,10 +588,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(1, message.map_int32_int32().at(1));
   }
-}
-
-TEST(Lite, AllLite34) {
-  string data;
 
   {
     // UnorderedWireFormat
@@ -716,10 +600,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(1, message.map_int32_int32().at(2));
   }
-}
-
-TEST(Lite, AllLite35) {
-  string data;
 
   {
     // DuplicatedKeyWireFormat
@@ -732,10 +612,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(1, message.map_int32_int32().at(2));
   }
-}
-
-TEST(Lite, AllLite36) {
-  string data;
 
   {
     // DuplicatedValueWireFormat
@@ -748,10 +624,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(2, message.map_int32_int32().at(1));
   }
-}
-
-TEST(Lite, AllLite37) {
-  string data;
 
   {
     // MissedKeyWireFormat
@@ -764,10 +636,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(1, message.map_int32_int32().at(0));
   }
-}
-
-TEST(Lite, AllLite38) {
-  string data;
 
   {
     // MissedValueWireFormat
@@ -780,10 +648,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(0, message.map_int32_int32().at(1));
   }
-}
-
-TEST(Lite, AllLite39) {
-  string data;
 
   {
     // UnknownFieldWireFormat
@@ -796,10 +660,6 @@
     EXPECT_EQ(1, message.map_int32_int32().size());
     EXPECT_EQ(3, message.map_int32_int32().at(2));
   }
-}
-
-TEST(Lite, AllLite40) {
-  string data;
 
   {
     // CorruptedWireFormat
@@ -810,10 +670,6 @@
 
     EXPECT_FALSE(message.ParseFromString(data));
   }
-}
-
-TEST(Lite, AllLite41) {
-  string data;
 
   {
     // IsInitialized
@@ -829,10 +685,6 @@
     (*map_message.mutable_map_field())[0].set_c(0);
     EXPECT_TRUE(map_message.IsInitialized());
   }
-}
-
-TEST(Lite, AllLite42) {
-  string data;
 
   {
       // Check that adding more values to enum does not corrupt message
@@ -860,146 +712,7 @@
       EXPECT_EQ(v2_message.int_field(), same_v2_message.int_field());
       EXPECT_EQ(v2_message.enum_field(), same_v2_message.enum_field());
   }
-}
-
-// Test that when parsing a oneof, we can successfully clear whatever already
-// happened to be stored in the oneof.
-TEST(Lite, AllLite43) {
-  protobuf_unittest::TestOneofParsingLite message1;
-
-  message1.set_oneof_int32(17);
-  string serialized;
-  EXPECT_TRUE(message1.SerializeToString(&serialized));
-
-  // Submessage
-  {
-    protobuf_unittest::TestOneofParsingLite message2;
-    message2.mutable_oneof_submessage();
-    google::protobuf::io::CodedInputStream input_stream(
-        reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()), serialized.size());
-    EXPECT_TRUE(message2.MergeFromCodedStream(&input_stream));
-    EXPECT_EQ(17, message2.oneof_int32());
-  }
-
-  // String
-  {
-    protobuf_unittest::TestOneofParsingLite message2;
-    message2.set_oneof_string("string");
-    google::protobuf::io::CodedInputStream input_stream(
-        reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()), serialized.size());
-    EXPECT_TRUE(message2.MergeFromCodedStream(&input_stream));
-    EXPECT_EQ(17, message2.oneof_int32());
-  }
-
-  // Bytes
-  {
-    protobuf_unittest::TestOneofParsingLite message2;
-    message2.set_oneof_bytes("bytes");
-    google::protobuf::io::CodedInputStream input_stream(
-        reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()), serialized.size());
-    EXPECT_TRUE(message2.MergeFromCodedStream(&input_stream));
-    EXPECT_EQ(17, message2.oneof_int32());
-  }
-}
-
-// Verify that we can successfully parse fields of various types within oneof
-// fields. We also verify that we can parse the same data twice into the same
-// message.
-TEST(Lite, AllLite44) {
-  // Int32
-  {
-    protobuf_unittest::TestOneofParsingLite original;
-    original.set_oneof_int32(17);
-    string serialized;
-    EXPECT_TRUE(original.SerializeToString(&serialized));
-    protobuf_unittest::TestOneofParsingLite parsed;
-    for (int i = 0; i < 2; ++i) {
-      google::protobuf::io::CodedInputStream input_stream(
-          reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()),
-          serialized.size());
-      EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream));
-      EXPECT_EQ(17, parsed.oneof_int32());
-    }
-  }
-
-  // Submessage
-  {
-    protobuf_unittest::TestOneofParsingLite original;
-    original.mutable_oneof_submessage()->set_optional_int32(5);
-    string serialized;
-    EXPECT_TRUE(original.SerializeToString(&serialized));
-    protobuf_unittest::TestOneofParsingLite parsed;
-    for (int i = 0; i < 2; ++i) {
-      google::protobuf::io::CodedInputStream input_stream(
-          reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()),
-          serialized.size());
-      EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream));
-      EXPECT_EQ(5, parsed.oneof_submessage().optional_int32());
-    }
-  }
-
-  // String
-  {
-    protobuf_unittest::TestOneofParsingLite original;
-    original.set_oneof_string("string");
-    string serialized;
-    EXPECT_TRUE(original.SerializeToString(&serialized));
-    protobuf_unittest::TestOneofParsingLite parsed;
-    for (int i = 0; i < 2; ++i) {
-      google::protobuf::io::CodedInputStream input_stream(
-          reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()),
-          serialized.size());
-      EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream));
-      EXPECT_EQ("string", parsed.oneof_string());
-    }
-  }
-
-  // Bytes
-  {
-    protobuf_unittest::TestOneofParsingLite original;
-    original.set_oneof_bytes("bytes");
-    string serialized;
-    EXPECT_TRUE(original.SerializeToString(&serialized));
-    protobuf_unittest::TestOneofParsingLite parsed;
-    for (int i = 0; i < 2; ++i) {
-      google::protobuf::io::CodedInputStream input_stream(
-          reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()),
-          serialized.size());
-      EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream));
-      EXPECT_EQ("bytes", parsed.oneof_bytes());
-    }
-  }
-
-  // Enum
-  {
-    protobuf_unittest::TestOneofParsingLite original;
-    original.set_oneof_enum(protobuf_unittest::V2_SECOND);
-    string serialized;
-    EXPECT_TRUE(original.SerializeToString(&serialized));
-    protobuf_unittest::TestOneofParsingLite parsed;
-    for (int i = 0; i < 2; ++i) {
-      google::protobuf::io::CodedInputStream input_stream(
-          reinterpret_cast<const ::google::protobuf::uint8*>(serialized.data()),
-          serialized.size());
-      EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream));
-      EXPECT_EQ(protobuf_unittest::V2_SECOND, parsed.oneof_enum());
-    }
-  }
 
   std::cout << "PASS" << std::endl;
-}
-
-TEST(Lite, AllLite45) {
-  // Test unknown fields are not discarded upon parsing.
-  string data = "\20\1";  // varint 1 with field number 2
-
-  protobuf_unittest::ForeignMessageLite a;
-  EXPECT_TRUE(a.ParseFromString(data));
-  google::protobuf::io::CodedInputStream input_stream(
-      reinterpret_cast<const ::google::protobuf::uint8*>(data.data()), data.size());
-  EXPECT_TRUE(a.MergePartialFromCodedStream(&input_stream));
-
-  string serialized = a.SerializeAsString();
-  EXPECT_EQ(serialized.substr(0, 2), data);
-  EXPECT_EQ(serialized.substr(2), data);
+  return 0;
 }
diff --git a/src/google/protobuf/map.h b/src/google/protobuf/map.h
index 7d9cc5c..6f1a71e 100644
--- a/src/google/protobuf/map.h
+++ b/src/google/protobuf/map.h
@@ -28,15 +28,10 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// This file defines the map container and its helpers to support protobuf maps.
-//
-// The Map and MapIterator types are provided by this header file.
-// Please avoid using other types defined here, unless they are public
-// types within Map or MapIterator, such as Map::value_type.
-
 #ifndef GOOGLE_PROTOBUF_MAP_H__
 #define GOOGLE_PROTOBUF_MAP_H__
 
+#include <google/protobuf/stubs/hash.h>
 #include <iterator>
 #include <limits>  // To support Visual Studio 2008
 #include <set>
@@ -46,11 +41,18 @@
 #include <google/protobuf/arena.h>
 #include <google/protobuf/generated_enum_util.h>
 #include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/stubs/hash.h>
+#include <google/protobuf/message.h>
+#include <google/protobuf/descriptor.h>
+#if __cpp_exceptions && LANG_CXX11
+#include <random>
+#endif
 
 namespace google {
 namespace protobuf {
 
+// The Map and MapIterator types are provided by this header file.
+// Please avoid using other types defined here, unless they are public
+// types within Map or MapIterator, such as Map::value_type.
 template <typename Key, typename T>
 class Map;
 
@@ -59,14 +61,16 @@
 template <typename Enum> struct is_proto_enum;
 
 namespace internal {
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType key_wire_type,
-          WireFormatLite::FieldType value_wire_type, int default_enum_value>
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
 class MapFieldLite;
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType key_wire_type,
-          WireFormatLite::FieldType value_wire_type, int default_enum_value>
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
 class MapField;
 
 template <typename Key, typename T>
@@ -77,6 +81,389 @@
 class GeneratedMessageReflection;
 }  // 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());                \
+  }
+
+// MapKey is an union type for representing any possible
+// map key.
+class LIBPROTOBUF_EXPORT MapKey {
+ public:
+  MapKey() : type_(0) {
+  }
+  MapKey(const MapKey& other) : type_(0) {
+    CopyFrom(other);
+  }
+
+  ~MapKey() {
+    if (type_ == FieldDescriptor::CPPTYPE_STRING) {
+      delete val_.string_value_;
+    }
+  }
+
+  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.";
+    }
+    return (FieldDescriptor::CppType)type_;
+  }
+
+  void SetInt64Value(int64 value) {
+    SetType(FieldDescriptor::CPPTYPE_INT64);
+    val_.int64_value_ = value;
+  }
+  void SetUInt64Value(uint64 value) {
+    SetType(FieldDescriptor::CPPTYPE_UINT64);
+    val_.uint64_value_ = value;
+  }
+  void SetInt32Value(int32 value) {
+    SetType(FieldDescriptor::CPPTYPE_INT32);
+    val_.int32_value_ = value;
+  }
+  void SetUInt32Value(uint32 value) {
+    SetType(FieldDescriptor::CPPTYPE_UINT32);
+    val_.uint32_value_ = value;
+  }
+  void SetBoolValue(bool value) {
+    SetType(FieldDescriptor::CPPTYPE_BOOL);
+    val_.bool_value_ = value;
+  }
+  void SetStringValue(const string& val) {
+    SetType(FieldDescriptor::CPPTYPE_STRING);
+    *val_.string_value_ = val;
+  }
+
+  int64 GetInt64Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
+               "MapKey::GetInt64Value");
+    return val_.int64_value_;
+  }
+  uint64 GetUInt64Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
+               "MapKey::GetUInt64Value");
+    return val_.uint64_value_;
+  }
+  int32 GetInt32Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
+               "MapKey::GetInt32Value");
+    return val_.int32_value_;
+  }
+  uint32 GetUInt32Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
+               "MapKey::GetUInt32Value");
+    return val_.uint32_value_;
+  }
+  bool GetBoolValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
+               "MapKey::GetBoolValue");
+    return val_.bool_value_;
+  }
+  const string& GetStringValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
+               "MapKey::GetStringValue");
+    return *val_.string_value_;
+  }
+
+  bool operator<(const MapKey& other) const {
+    if (type_ != other.type_) {
+      // We could define a total order that handles this case, but
+      // there currently no need.  So, for now, fail.
+      GOOGLE_LOG(FATAL) << "Unsupported: type mismatch";
+    }
+    switch (type()) {
+      case FieldDescriptor::CPPTYPE_DOUBLE:
+      case FieldDescriptor::CPPTYPE_FLOAT:
+      case FieldDescriptor::CPPTYPE_ENUM:
+      case FieldDescriptor::CPPTYPE_MESSAGE:
+        GOOGLE_LOG(FATAL) << "Unsupported";
+        return false;
+      case FieldDescriptor::CPPTYPE_STRING:
+        return *val_.string_value_ < *other.val_.string_value_;
+      case FieldDescriptor::CPPTYPE_INT64:
+        return val_.int64_value_ < other.val_.int64_value_;
+      case FieldDescriptor::CPPTYPE_INT32:
+        return val_.int32_value_ < other.val_.int32_value_;
+      case FieldDescriptor::CPPTYPE_UINT64:
+        return val_.uint64_value_ < other.val_.uint64_value_;
+      case FieldDescriptor::CPPTYPE_UINT32:
+        return val_.uint32_value_ < other.val_.uint32_value_;
+      case FieldDescriptor::CPPTYPE_BOOL:
+        return val_.bool_value_ < other.val_.bool_value_;
+    }
+    return false;
+  }
+
+  bool operator==(const MapKey& other) const {
+    if (type_ != other.type_) {
+      // To be consistent with operator<, we don't allow this either.
+      GOOGLE_LOG(FATAL) << "Unsupported: type mismatch";
+    }
+    switch (type()) {
+      case FieldDescriptor::CPPTYPE_DOUBLE:
+      case FieldDescriptor::CPPTYPE_FLOAT:
+      case FieldDescriptor::CPPTYPE_ENUM:
+      case FieldDescriptor::CPPTYPE_MESSAGE:
+        GOOGLE_LOG(FATAL) << "Unsupported";
+        break;
+      case FieldDescriptor::CPPTYPE_STRING:
+        return *val_.string_value_ == *other.val_.string_value_;
+      case FieldDescriptor::CPPTYPE_INT64:
+        return val_.int64_value_ == other.val_.int64_value_;
+      case FieldDescriptor::CPPTYPE_INT32:
+        return val_.int32_value_ == other.val_.int32_value_;
+      case FieldDescriptor::CPPTYPE_UINT64:
+        return val_.uint64_value_ == other.val_.uint64_value_;
+      case FieldDescriptor::CPPTYPE_UINT32:
+        return val_.uint32_value_ == other.val_.uint32_value_;
+      case FieldDescriptor::CPPTYPE_BOOL:
+        return val_.bool_value_ == other.val_.bool_value_;
+    }
+    GOOGLE_LOG(FATAL) << "Can't get here.";
+    return false;
+  }
+
+  void CopyFrom(const MapKey& other) {
+    SetType(other.type());
+    switch (type_) {
+      case FieldDescriptor::CPPTYPE_DOUBLE:
+      case FieldDescriptor::CPPTYPE_FLOAT:
+      case FieldDescriptor::CPPTYPE_ENUM:
+      case FieldDescriptor::CPPTYPE_MESSAGE:
+        GOOGLE_LOG(FATAL) << "Unsupported";
+        break;
+      case FieldDescriptor::CPPTYPE_STRING:
+        *val_.string_value_ = *other.val_.string_value_;
+        break;
+      case FieldDescriptor::CPPTYPE_INT64:
+        val_.int64_value_ = other.val_.int64_value_;
+        break;
+      case FieldDescriptor::CPPTYPE_INT32:
+        val_.int32_value_ = other.val_.int32_value_;
+        break;
+      case FieldDescriptor::CPPTYPE_UINT64:
+        val_.uint64_value_ = other.val_.uint64_value_;
+        break;
+      case FieldDescriptor::CPPTYPE_UINT32:
+        val_.uint32_value_ = other.val_.uint32_value_;
+        break;
+      case FieldDescriptor::CPPTYPE_BOOL:
+        val_.bool_value_ = other.val_.bool_value_;
+        break;
+    }
+  }
+
+ private:
+  template <typename K, typename V>
+  friend class internal::TypeDefinedMapFieldBase;
+  friend class MapIterator;
+  friend class internal::DynamicMapField;
+
+  union KeyValue {
+    KeyValue() {}
+    string* string_value_;
+    int64 int64_value_;
+    int32 int32_value_;
+    uint64 uint64_value_;
+    uint32 uint32_value_;
+    bool bool_value_;
+  } val_;
+
+  void SetType(FieldDescriptor::CppType type) {
+    if (type_ == type) return;
+    if (type_ == FieldDescriptor::CPPTYPE_STRING) {
+      delete val_.string_value_;
+    }
+    type_ = type;
+    if (type_ == FieldDescriptor::CPPTYPE_STRING) {
+      val_.string_value_ = new string;
+    }
+  }
+
+  // type_ is 0 or a valid FieldDescriptor::CppType.
+  int type_;
+};
+
+// MapValueRef points to a map value.
+class LIBPROTOBUF_EXPORT MapValueRef {
+ public:
+  MapValueRef() : data_(NULL), type_(0) {}
+
+  void SetInt64Value(int64 value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
+               "MapValueRef::SetInt64Value");
+    *reinterpret_cast<int64*>(data_) = value;
+  }
+  void SetUInt64Value(uint64 value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
+               "MapValueRef::SetUInt64Value");
+    *reinterpret_cast<uint64*>(data_) = value;
+  }
+  void SetInt32Value(int32 value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
+               "MapValueRef::SetInt32Value");
+    *reinterpret_cast<int32*>(data_) = value;
+  }
+  void SetUInt32Value(uint32 value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
+               "MapValueRef::SetUInt32Value");
+    *reinterpret_cast<uint32*>(data_) = value;
+  }
+  void SetBoolValue(bool value) {
+    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");
+    *reinterpret_cast<int*>(data_) = value;
+  }
+  void SetStringValue(const string& value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
+               "MapValueRef::SetStringValue");
+    *reinterpret_cast<string*>(data_) = value;
+  }
+  void SetFloatValue(float value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT,
+               "MapValueRef::SetFloatValue");
+    *reinterpret_cast<float*>(data_) = value;
+  }
+  void SetDoubleValue(double value) {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE,
+               "MapValueRef::SetDoubleValue");
+    *reinterpret_cast<double*>(data_) = value;
+  }
+
+  int64 GetInt64Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
+               "MapValueRef::GetInt64Value");
+    return *reinterpret_cast<int64*>(data_);
+  }
+  uint64 GetUInt64Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
+               "MapValueRef::GetUInt64Value");
+    return *reinterpret_cast<uint64*>(data_);
+  }
+  int32 GetInt32Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
+               "MapValueRef::GetInt32Value");
+    return *reinterpret_cast<int32*>(data_);
+  }
+  uint32 GetUInt32Value() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
+               "MapValueRef::GetUInt32Value");
+    return *reinterpret_cast<uint32*>(data_);
+  }
+  bool GetBoolValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
+               "MapValueRef::GetBoolValue");
+    return *reinterpret_cast<bool*>(data_);
+  }
+  int GetEnumValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM,
+               "MapValueRef::GetEnumValue");
+    return *reinterpret_cast<int*>(data_);
+  }
+  const string& GetStringValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
+               "MapValueRef::GetStringValue");
+    return *reinterpret_cast<string*>(data_);
+  }
+  float GetFloatValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT,
+               "MapValueRef::GetFloatValue");
+    return *reinterpret_cast<float*>(data_);
+  }
+  double GetDoubleValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE,
+               "MapValueRef::GetDoubleValue");
+    return *reinterpret_cast<double*>(data_);
+  }
+
+  const Message& GetMessageValue() const {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_MESSAGE,
+               "MapValueRef::GetMessageValue");
+    return *reinterpret_cast<Message*>(data_);
+  }
+
+  Message* MutableMessageValue() {
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_MESSAGE,
+               "MapValueRef::MutableMessageValue");
+    return reinterpret_cast<Message*>(data_);
+  }
+
+ private:
+  template <typename K, typename V,
+            internal::WireFormatLite::FieldType key_wire_type,
+            internal::WireFormatLite::FieldType value_wire_type,
+            int default_enum_value>
+  friend class internal::MapField;
+  template <typename K, typename V>
+  friend class internal::TypeDefinedMapFieldBase;
+  friend class MapIterator;
+  friend class internal::GeneratedMessageReflection;
+  friend class internal::DynamicMapField;
+
+  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.";
+    }
+    return (FieldDescriptor::CppType)type_;
+  }
+  void SetValue(const void* val) {
+    data_ = const_cast<void*>(val);
+  }
+  void CopyFrom(const MapValueRef& other) {
+    type_ = other.type_;
+    data_ = other.data_;
+  }
+  // Only used in DynamicMapField
+  void DeleteData() {
+    switch (type_) {
+#define HANDLE_TYPE(CPPTYPE, TYPE)                              \
+      case google::protobuf::FieldDescriptor::CPPTYPE_##CPPTYPE: {        \
+        delete reinterpret_cast<TYPE*>(data_);                  \
+        break;                                                  \
+      }
+      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(STRING, string);
+      HANDLE_TYPE(ENUM, int32);
+      HANDLE_TYPE(MESSAGE, Message);
+#undef HANDLE_TYPE
+    }
+  }
+  // data_ point to a map value. MapValueRef does not
+  // own this value.
+  void* data_;
+  // type_ is 0 or a valid FieldDescriptor::CppType.
+  int type_;
+};
+
+#undef TYPE_CHECK
+
 // This is the class for google::protobuf::Map's internal value_type. Instead of using
 // std::pair as value_type, we use this class which provides us more control of
 // its process of construction and destruction.
@@ -133,38 +520,30 @@
   typedef size_t size_type;
   typedef hash<Key> hasher;
 
-  Map() : arena_(NULL), default_enum_value_(0) { Init(); }
-  explicit Map(Arena* arena) : arena_(arena), default_enum_value_(0) { Init(); }
-
+  Map(bool old_style = true)
+      : arena_(NULL),
+        default_enum_value_(0),
+        old_style_(old_style) {
+    Init();
+  }
+  explicit Map(Arena* arena, bool old_style = true)
+      : arena_(arena),
+        default_enum_value_(0),
+        old_style_(old_style) {
+    Init();
+  }
   Map(const Map& other)
-      : arena_(NULL), default_enum_value_(other.default_enum_value_) {
+      : arena_(NULL),
+        default_enum_value_(other.default_enum_value_),
+        old_style_(other.old_style_) {
     Init();
     insert(other.begin(), other.end());
   }
-
-#if LANG_CXX11
-  Map(Map&& other) noexcept : Map() {
-    if (other.arena_) {
-      *this = other;
-    } else {
-      swap(other);
-    }
-  }
-  Map& operator=(Map&& other) noexcept {
-    if (this != &other) {
-      if (arena_ != other.arena_) {
-        *this = other;
-      } else {
-        swap(other);
-      }
-    }
-    return *this;
-  }
-#endif
-
   template <class InputIt>
-  Map(const InputIt& first, const InputIt& last)
-      : arena_(NULL), default_enum_value_(0) {
+  Map(const InputIt& first, const InputIt& last, bool old_style = true)
+      : arena_(NULL),
+        default_enum_value_(0),
+        old_style_(old_style) {
     Init();
     insert(first, last);
   }
@@ -172,13 +551,22 @@
   ~Map() {
     clear();
     if (arena_ == NULL) {
-      delete elements_;
+      if (old_style_)
+        delete deprecated_elements_;
+      else
+        delete elements_;
     }
   }
 
  private:
   void Init() {
-    elements_ = Arena::Create<InnerMap>(arena_, 0u, hasher(), Allocator(arena_));
+    if (old_style_)
+      deprecated_elements_ = Arena::Create<DeprecatedInnerMap>(
+          arena_, 0, hasher(), equal_to<Key>(),
+          MapAllocator<std::pair<const Key, MapPair<Key, T>*> >(arena_));
+    else
+      elements_ =
+          Arena::Create<InnerMap>(arena_, 0, hasher(), Allocator(arena_));
   }
 
   // re-implement std::allocator to use arena allocator for memory allocation.
@@ -199,13 +587,13 @@
     explicit MapAllocator(Arena* arena) : arena_(arena) {}
     template <typename X>
     MapAllocator(const MapAllocator<X>& allocator)
-        : arena_(allocator.arena()) {}
+        : arena_(allocator.arena_) {}
 
-    pointer allocate(size_type n, const void* /* hint */ = 0) {
+    pointer allocate(size_type n, const_pointer hint = 0) {
       // If arena is not given, malloc needs to be called which doesn't
       // construct element object.
       if (arena_ == NULL) {
-        return static_cast<pointer>(::operator new(n * sizeof(value_type)));
+        return reinterpret_cast<pointer>(malloc(n * sizeof(value_type)));
       } else {
         return reinterpret_cast<pointer>(
             Arena::CreateArray<uint8>(arena_, n * sizeof(value_type)));
@@ -214,17 +602,13 @@
 
     void deallocate(pointer p, size_type n) {
       if (arena_ == NULL) {
-#if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
-        ::operator delete(p, n * sizeof(value_type));
-#else
-        (void)n;
-        ::operator delete(p);
-#endif
+        free(p);
       }
     }
 
 #if __cplusplus >= 201103L && !defined(GOOGLE_PROTOBUF_OS_APPLE) && \
     !defined(GOOGLE_PROTOBUF_OS_NACL) &&                            \
+    !defined(GOOGLE_PROTOBUF_OS_ANDROID) &&                         \
     !defined(GOOGLE_PROTOBUF_OS_EMSCRIPTEN)
     template<class NodeType, class... Args>
     void construct(NodeType* p, Args&&... args) {
@@ -263,19 +647,15 @@
 
     // To support Visual Studio 2008
     size_type max_size() const {
-      // parentheses around (std::...:max) prevents macro warning of max()
-      return (std::numeric_limits<size_type>::max)();
-    }
-
-    // To support gcc-4.4, which does not properly
-    // support templated friend classes
-    Arena* arena() const {
-      return arena_;
+      return std::numeric_limits<size_type>::max();
     }
 
    private:
     typedef void DestructorSkippable_;
     Arena* const arena_;
+
+    template <typename X>
+    friend class MapAllocator;
   };
 
   // InnerMap's key type is Key and its value type is value_type*.  We use a
@@ -288,7 +668,7 @@
 
     const Key& key() const { return k_; }
     Key& key() { return k_; }
-    value_type* value() const { return v_; }
+    value_type* const value() const { return v_; }
     value_type*& value() { return v_; }
 
    private:
@@ -374,13 +754,14 @@
     };
     typedef typename Allocator::template rebind<Key*>::other KeyPtrAllocator;
     typedef std::set<Key*, KeyCompare, KeyPtrAllocator> Tree;
-    typedef typename Tree::iterator TreeIterator;
 
     // iterator and const_iterator are instantiations of iterator_base.
     template <typename KeyValueType>
-    struct iterator_base {
+    class iterator_base {
+     public:
       typedef KeyValueType& reference;
       typedef KeyValueType* pointer;
+      typedef typename Tree::iterator TreeIterator;
 
       // Invariants:
       // node_ is always correct. This is handy because the most common
@@ -389,7 +770,7 @@
       // are updated to be correct also, but those fields can become stale
       // if the underlying map is modified.  When those fields are needed they
       // are rechecked, and updated if necessary.
-      iterator_base() : node_(NULL), m_(NULL), bucket_index_(0) {}
+      iterator_base() : node_(NULL) {}
 
       explicit iterator_base(const InnerMap* m) : m_(m) {
         SearchFrom(m->index_of_first_non_null_);
@@ -400,15 +781,22 @@
       // can convert to const_iterator" is OK but the reverse direction is not.
       template <typename U>
       explicit iterator_base(const iterator_base<U>& it)
-          : node_(it.node_), m_(it.m_), bucket_index_(it.bucket_index_) {}
+          : node_(it.node_),
+            m_(it.m_),
+            bucket_index_(it.bucket_index_),
+            tree_it_(it.tree_it_) {}
 
       iterator_base(Node* n, const InnerMap* m, size_type index)
-          : node_(n), m_(m), bucket_index_(index) {}
+          : node_(n),
+            m_(m),
+            bucket_index_(index) {}
 
       iterator_base(TreeIterator tree_it, const InnerMap* m, size_type index)
-          : node_(NodePtrFromKeyPtr(*tree_it)), m_(m), bucket_index_(index) {
-        // Invariant: iterators that use buckets with trees have an even
-        // bucket_index_.
+          : node_(NodePtrFromKeyPtr(*tree_it)),
+            m_(m),
+            bucket_index_(index),
+            tree_it_(tree_it) {
+        // Invariant: iterators that use tree_it_ have an even bucket_index_.
         GOOGLE_DCHECK_EQ(bucket_index_ % 2, 0);
       }
 
@@ -426,7 +814,8 @@
           } else if (m_->TableEntryIsTree(bucket_index_)) {
             Tree* tree = static_cast<Tree*>(m_->table_[bucket_index_]);
             GOOGLE_DCHECK(!tree->empty());
-            node_ = NodePtrFromKeyPtr(*tree->begin());
+            tree_it_ = tree->begin();
+            node_ = NodePtrFromKeyPtr(*tree_it_);
             break;
           }
         }
@@ -444,17 +833,16 @@
 
       iterator_base& operator++() {
         if (node_->next == NULL) {
-          TreeIterator tree_it;
-          const bool is_list = revalidate_if_necessary(&tree_it);
+          const bool is_list = revalidate_if_necessary();
           if (is_list) {
             SearchFrom(bucket_index_ + 1);
           } else {
             GOOGLE_DCHECK_EQ(bucket_index_ & 1, 0);
             Tree* tree = static_cast<Tree*>(m_->table_[bucket_index_]);
-            if (++tree_it == tree->end()) {
+            if (++tree_it_ == tree->end()) {
               SearchFrom(bucket_index_ + 2);
             } else {
-              node_ = NodePtrFromKeyPtr(*tree_it);
+              node_ = NodePtrFromKeyPtr(*tree_it_);
             }
           }
         } else {
@@ -471,9 +859,8 @@
 
       // Assumes node_ and m_ are correct and non-NULL, but other fields may be
       // stale.  Fix them as needed.  Then return true iff node_ points to a
-      // Node in a list.  If false is returned then *it is modified to be
-      // a valid iterator for node_.
-      bool revalidate_if_necessary(TreeIterator* it) {
+      // Node in a list.
+      bool revalidate_if_necessary() {
         GOOGLE_DCHECK(node_ != NULL && m_ != NULL);
         // Force bucket_index_ to be in range.
         bucket_index_ &= (m_->num_buckets_ - 1);
@@ -494,14 +881,16 @@
         // not.  Revalidate just to be sure.  This case is rare enough that we
         // don't worry about potential optimizations, such as having a custom
         // find-like method that compares Node* instead of const Key&.
-        iterator_base i(m_->find(*KeyPtrFromNodePtr(node_), it));
+        iterator_base i(m_->find(*KeyPtrFromNodePtr(node_)));
         bucket_index_ = i.bucket_index_;
+        tree_it_ = i.tree_it_;
         return m_->TableEntryIsList(bucket_index_);
       }
 
       Node* node_;
       const InnerMap* m_;
       size_type bucket_index_;
+      TreeIterator tree_it_;
     };
 
    public:
@@ -553,7 +942,7 @@
     bool empty() const { return size() == 0; }
 
     iterator find(const Key& k) { return iterator(FindHelper(k).first); }
-    const_iterator find(const Key& k) const { return find(k, NULL); }
+    const_iterator find(const Key& k) const { return FindHelper(k).first; }
 
     // In traditional C++ style, this performs "insert if not present."
     std::pair<iterator, bool> insert(const KeyValuePair& kv) {
@@ -600,8 +989,7 @@
 
     void erase(iterator it) {
       GOOGLE_DCHECK_EQ(it.m_, this);
-      typename Tree::iterator tree_it;
-      const bool is_list = it.revalidate_if_necessary(&tree_it);
+      const bool is_list = it.revalidate_if_necessary();
       size_type b = it.bucket_index_;
       Node* const item = it.node_;
       if (is_list) {
@@ -612,7 +1000,7 @@
       } else {
         GOOGLE_DCHECK(TableEntryIsTree(b));
         Tree* tree = static_cast<Tree*>(table_[b]);
-        tree->erase(*tree_it);
+        tree->erase(it.tree_it_);
         if (tree->empty()) {
           // Force b to be the minimum of b and b ^ 1.  This is important
           // only because we want index_of_first_non_null_ to be correct.
@@ -632,14 +1020,7 @@
     }
 
    private:
-    const_iterator find(const Key& k, TreeIterator* it) const {
-      return FindHelper(k, it).first;
-    }
     std::pair<const_iterator, size_type> FindHelper(const Key& k) const {
-      return FindHelper(k, NULL);
-    }
-    std::pair<const_iterator, size_type> FindHelper(const Key& k,
-                                                    TreeIterator* it) const {
       size_type b = BucketNumber(k);
       if (TableEntryIsNonEmptyList(b)) {
         Node* node = static_cast<Node*>(table_[b]);
@@ -657,7 +1038,6 @@
         Key* key = const_cast<Key*>(&k);
         typename Tree::iterator tree_it = tree->find(key);
         if (tree_it != tree->end()) {
-          if (it != NULL) *it = tree_it;
           return std::make_pair(const_iterator(tree_it, this, b), b);
         }
       }
@@ -694,9 +1074,8 @@
         // index_of_first_non_null_, so we skip the code to update it.
         return InsertUniqueInTree(b, node);
       }
-      // parentheses around (std::min) prevents macro expansion of min(...)
       index_of_first_non_null_ =
-          (std::min)(index_of_first_non_null_, result.bucket_index_);
+          std::min(index_of_first_non_null_, result.bucket_index_);
       return result;
     }
 
@@ -868,7 +1247,7 @@
     // Return whether table_[b] is a linked list that seems awfully long.
     // Requires table_[b] to point to a non-empty linked list.
     bool TableEntryIsTooLong(size_type b) {
-      const size_type kMaxLength = 8;
+      const int kMaxLength = 8;
       size_type count = 0;
       Node* node = static_cast<Node*>(table_[b]);
       do {
@@ -883,7 +1262,14 @@
     size_type BucketNumber(const Key& k) const {
       // We inherit from hasher, so one-arg operator() provides a hash function.
       size_type h = (*const_cast<InnerMap*>(this))(k);
+      // To help prevent people from making assumptions about the hash function,
+      // we use the seed differently depending on NDEBUG.  The default hash
+      // function, the seeding, etc., are all likely to change in the future.
+#ifndef NDEBUG
+      return (h * (seed_ | 1)) & (num_buckets_ - 1);
+#else
       return (h + seed_) & (num_buckets_ - 1);
+#endif
     }
 
     bool IsMatch(const Key& k0, const Key& k1) const {
@@ -893,9 +1279,7 @@
     // Return a power of two no less than max(kMinTableSize, n).
     // Assumes either n < kMinTableSize or n is a power of two.
     size_type TableSize(size_type n) {
-      return n < static_cast<size_type>(kMinTableSize)
-                 ? static_cast<size_type>(kMinTableSize)
-                 : n;
+      return n < kMinTableSize ? kMinTableSize : n;
     }
 
     // Use alloc_ to allocate an array of n objects of type U.
@@ -933,6 +1317,16 @@
 
     // Return a randomish value.
     size_type Seed() const {
+      // random_device can throw, so avoid it unless we are compiling with
+      // exceptions enabled.
+#if __cpp_exceptions && LANG_CXX11
+      try {
+        std::random_device rd;
+        std::knuth_b knuth(rd());
+        std::uniform_int_distribution<size_type> u;
+        return u(knuth);
+      } catch (...) { }
+#endif
       size_type s = static_cast<size_type>(reinterpret_cast<uintptr_t>(this));
 #if defined(__x86_64__) && defined(__GNUC__)
       uint32 hi, lo;
@@ -951,34 +1345,72 @@
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(InnerMap);
   };  // end of class InnerMap
 
+  typedef hash_map<Key, value_type*, hash<Key>, equal_to<Key>,
+                   MapAllocator<std::pair<const Key, MapPair<Key, T>*> > >
+      DeprecatedInnerMap;
+
  public:
   // Iterators
-  class const_iterator {
+  class iterator_base {
+   public:
+    // We support "old style" and "new style" iterators for now. This is
+    // temporary.  Also, for "iterator()" we have an unknown category.
+    // TODO(gpike): get rid of this.
+    enum IteratorStyle { kUnknown, kOld, kNew };
+    explicit iterator_base(IteratorStyle style) : iterator_style_(style) {}
+
+    bool OldStyle() const {
+      GOOGLE_DCHECK_NE(iterator_style_, kUnknown);
+      return iterator_style_ == kOld;
+    }
+    bool UnknownStyle() const {
+      return iterator_style_ == kUnknown;
+    }
+    bool SameStyle(const iterator_base& other) const {
+      return iterator_style_ == other.iterator_style_;
+    }
+
+   private:
+    IteratorStyle iterator_style_;
+  };
+
+  class const_iterator
+      : private iterator_base,
+        public std::iterator<std::forward_iterator_tag, value_type, ptrdiff_t,
+                             const value_type*, const value_type&> {
     typedef typename InnerMap::const_iterator InnerIt;
+    typedef typename DeprecatedInnerMap::const_iterator DeprecatedInnerIt;
 
    public:
-    typedef std::forward_iterator_tag iterator_category;
-    typedef typename Map::value_type value_type;
-    typedef ptrdiff_t difference_type;
-    typedef const value_type* pointer;
-    typedef const value_type& reference;
+    const_iterator() : iterator_base(iterator_base::kUnknown) {}
+    explicit const_iterator(const DeprecatedInnerIt& dit)
+        : iterator_base(iterator_base::kOld), dit_(dit) {}
+    explicit const_iterator(const InnerIt& it)
+        : iterator_base(iterator_base::kNew), it_(it) {}
 
-    const_iterator() {}
-    explicit const_iterator(const InnerIt& it) : it_(it) {}
+    const_iterator(const const_iterator& other)
+        : iterator_base(other), it_(other.it_), dit_(other.dit_) {}
 
     const_reference operator*() const {
-      return *it_->value();
+      return this->OldStyle() ? *dit_->second : *it_->value();
     }
     const_pointer operator->() const { return &(operator*()); }
 
     const_iterator& operator++() {
-      ++it_;
+      if (this->OldStyle())
+        ++dit_;
+      else
+        ++it_;
       return *this;
     }
-    const_iterator operator++(int) { return const_iterator(it_++); }
+    const_iterator operator++(int) {
+      return this->OldStyle() ? const_iterator(dit_++) : const_iterator(it_++);
+    }
 
     friend bool operator==(const const_iterator& a, const const_iterator& b) {
-      return a.it_ == b.it_;
+      if (!a.SameStyle(b)) return false;
+      if (a.UnknownStyle()) return true;
+      return a.OldStyle() ? (a.dit_ == b.dit_) : (a.it_ == b.it_);
     }
     friend bool operator!=(const const_iterator& a, const const_iterator& b) {
       return !(a == b);
@@ -986,37 +1418,48 @@
 
    private:
     InnerIt it_;
+    DeprecatedInnerIt dit_;
   };
 
-  class iterator {
+  class iterator : private iterator_base,
+                   public std::iterator<std::forward_iterator_tag, value_type> {
     typedef typename InnerMap::iterator InnerIt;
+    typedef typename DeprecatedInnerMap::iterator DeprecatedInnerIt;
 
    public:
-    typedef std::forward_iterator_tag iterator_category;
-    typedef typename Map::value_type value_type;
-    typedef ptrdiff_t difference_type;
-    typedef value_type* pointer;
-    typedef value_type& reference;
+    iterator() : iterator_base(iterator_base::kUnknown) {}
+    explicit iterator(const DeprecatedInnerIt& dit)
+        : iterator_base(iterator_base::kOld), dit_(dit) {}
+    explicit iterator(const InnerIt& it)
+        : iterator_base(iterator_base::kNew), it_(it) {}
 
-    iterator() {}
-    explicit iterator(const InnerIt& it) : it_(it) {}
-
-    reference operator*() const { return *it_->value(); }
+    reference operator*() const {
+      return this->OldStyle() ? *dit_->second : *it_->value();
+    }
     pointer operator->() const { return &(operator*()); }
 
     iterator& operator++() {
-      ++it_;
+      if (this->OldStyle())
+        ++dit_;
+      else
+        ++it_;
       return *this;
     }
-    iterator operator++(int) { return iterator(it_++); }
+    iterator operator++(int) {
+      return this->OldStyle() ? iterator(dit_++) : iterator(it_++);
+    }
 
     // Allow implicit conversion to const_iterator.
     operator const_iterator() const {
-      return const_iterator(typename InnerMap::const_iterator(it_));
+      return this->OldStyle() ?
+          const_iterator(typename DeprecatedInnerMap::const_iterator(dit_)) :
+          const_iterator(typename InnerMap::const_iterator(it_));
     }
 
     friend bool operator==(const iterator& a, const iterator& b) {
-      return a.it_ == b.it_;
+      if (!a.SameStyle(b)) return false;
+      if (a.UnknownStyle()) return true;
+      return a.OldStyle() ? a.dit_ == b.dit_ : a.it_ == b.it_;
     }
     friend bool operator!=(const iterator& a, const iterator& b) {
       return !(a == b);
@@ -1026,26 +1469,38 @@
     friend class Map;
 
     InnerIt it_;
+    DeprecatedInnerIt dit_;
   };
 
-  iterator begin() { return iterator(elements_->begin()); }
-  iterator end() { return iterator(elements_->end()); }
+  iterator begin() {
+    return old_style_ ? iterator(deprecated_elements_->begin())
+                      : iterator(elements_->begin());
+  }
+  iterator end() {
+    return old_style_ ? iterator(deprecated_elements_->end())
+                      : iterator(elements_->end());
+  }
   const_iterator begin() const {
-    return const_iterator(iterator(elements_->begin()));
+    return old_style_ ? const_iterator(deprecated_elements_->begin())
+                      : const_iterator(iterator(elements_->begin()));
   }
   const_iterator end() const {
-    return const_iterator(iterator(elements_->end()));
+    return old_style_ ? const_iterator(deprecated_elements_->end())
+                      : const_iterator(iterator(elements_->end()));
   }
   const_iterator cbegin() const { return begin(); }
   const_iterator cend() const { return end(); }
 
   // Capacity
-  size_type size() const { return elements_->size(); }
+  size_type size() const {
+    return old_style_ ? deprecated_elements_->size() : elements_->size();
+  }
   bool empty() const { return size() == 0; }
 
   // Element access
   T& operator[](const key_type& key) {
-    value_type** value =  &(*elements_)[key];
+    value_type** value =
+        old_style_ ? &(*deprecated_elements_)[key] : &(*elements_)[key];
     if (*value == NULL) {
       *value = CreateValueTypeInternal(key);
       internal::MapValueInitializer<google::protobuf::is_proto_enum<T>::value,
@@ -1056,25 +1511,28 @@
   }
   const T& at(const key_type& key) const {
     const_iterator it = find(key);
-    GOOGLE_CHECK(it != end()) << "key not found: " << key;
+    GOOGLE_CHECK(it != end());
     return it->second;
   }
   T& at(const key_type& key) {
     iterator it = find(key);
-    GOOGLE_CHECK(it != end()) << "key not found: " << key;
+    GOOGLE_CHECK(it != end());
     return it->second;
   }
 
   // Lookup
   size_type count(const key_type& key) const {
-    const_iterator it = find(key);
-    GOOGLE_DCHECK(it == end() || key == it->first);
-    return it == end() ? 0 : 1;
+    if (find(key) != end()) assert(key == find(key)->first);
+    return find(key) == end() ? 0 : 1;
   }
   const_iterator find(const key_type& key) const {
-    return const_iterator(iterator(elements_->find(key)));
+    return old_style_ ? const_iterator(deprecated_elements_->find(key))
+        : const_iterator(iterator(elements_->find(key)));
   }
-  iterator find(const key_type& key) { return iterator(elements_->find(key)); }
+  iterator find(const key_type& key) {
+    return old_style_ ? iterator(deprecated_elements_->find(key))
+                      : iterator(elements_->find(key));
+  }
   std::pair<const_iterator, const_iterator> equal_range(
       const key_type& key) const {
     const_iterator it = find(key);
@@ -1097,12 +1555,23 @@
 
   // insert
   std::pair<iterator, bool> insert(const value_type& value) {
-    std::pair<typename InnerMap::iterator, bool> p =
-        elements_->insert(value.first);
-    if (p.second) {
-      p.first->value() = CreateValueTypeInternal(value);
+    if (old_style_) {
+      iterator it = find(value.first);
+      if (it != end()) {
+        return std::pair<iterator, bool>(it, false);
+      } else {
+        return std::pair<iterator, bool>(
+            iterator(deprecated_elements_->insert(std::pair<Key, value_type*>(
+                value.first, CreateValueTypeInternal(value))).first), true);
+      }
+    } else {
+      std::pair<typename InnerMap::iterator, bool> p =
+          elements_->insert(value.first);
+      if (p.second) {
+        p.first->value() = CreateValueTypeInternal(value);
+      }
+      return std::pair<iterator, bool>(iterator(p.first), p.second);
     }
-    return std::pair<iterator, bool>(iterator(p.first), p.second);
   }
   template <class InputIt>
   void insert(InputIt first, InputIt last) {
@@ -1127,7 +1596,10 @@
   iterator erase(iterator pos) {
     if (arena_ == NULL) delete pos.operator->();
     iterator i = pos++;
-    elements_->erase(i.it_);
+    if (old_style_)
+      deprecated_elements_->erase(i.dit_);
+    else
+      elements_->erase(i.it_);
     return pos;
   }
   void erase(iterator first, iterator last) {
@@ -1146,23 +1618,12 @@
     return *this;
   }
 
-  void swap(Map& other) {
-    if (arena_ == other.arena_) {
-      std::swap(default_enum_value_, other.default_enum_value_);
-      std::swap(elements_, other.elements_);
-    } else {
-      // TODO(zuguang): optimize this. The temporary copy can be allocated
-      // in the same arena as the other message, and the "other = copy" can
-      // be replaced with the fast-path swap above.
-      Map copy = *this;
-      *this = other;
-      other = copy;
-    }
-  }
-
   // Access to hasher.  Currently this returns a copy, but it may
   // be modified to return a const reference in the future.
-  hasher hash_function() const { return elements_->hash_function(); }
+  hasher hash_function() const {
+    return old_style_ ? deprecated_elements_->hash_function()
+                      : elements_->hash_function();
+  }
 
  private:
   // Set default enum value only for proto2 map field whose value is enum type.
@@ -1199,12 +1660,19 @@
 
   Arena* arena_;
   int default_enum_value_;
-  InnerMap* elements_;
+  // The following is a tagged union because we support two map styles
+  // for now.
+  // TODO(gpike): get rid of the old style.
+  const bool old_style_;
+  union {
+    InnerMap* elements_;
+    DeprecatedInnerMap* deprecated_elements_;
+  };
 
   friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
-  template <typename Derived, typename K, typename V,
+  template <typename K, typename V,
             internal::WireFormatLite::FieldType key_wire_type,
             internal::WireFormatLite::FieldType value_wire_type,
             int default_enum_value>
@@ -1212,6 +1680,42 @@
 };
 
 }  // namespace protobuf
-
 }  // namespace google
+
+GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START
+template<>
+struct hash<google::protobuf::MapKey> {
+  size_t
+  operator()(const google::protobuf::MapKey& map_key) const {
+    switch (map_key.type()) {
+      case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
+      case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
+      case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
+      case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
+        GOOGLE_LOG(FATAL) << "Unsupported";
+        break;
+      case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
+        return hash<string>()(map_key.GetStringValue());
+      case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
+        return hash< ::google::protobuf::int64>()(map_key.GetInt64Value());
+      case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
+        return hash< ::google::protobuf::int32>()(map_key.GetInt32Value());
+      case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
+        return hash< ::google::protobuf::uint64>()(map_key.GetUInt64Value());
+      case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
+        return hash< ::google::protobuf::uint32>()(map_key.GetUInt32Value());
+      case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
+        return hash<bool>()(map_key.GetBoolValue());
+    }
+    GOOGLE_LOG(FATAL) << "Can't get here.";
+    return 0;
+  }
+  bool
+  operator()(const google::protobuf::MapKey& map_key1,
+             const google::protobuf::MapKey& map_key2) const {
+    return map_key1 < map_key2;
+  }
+};
+GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END
+
 #endif  // GOOGLE_PROTOBUF_MAP_H__
diff --git a/src/google/protobuf/map_entry.h b/src/google/protobuf/map_entry.h
index 801def9..987c4e2 100644
--- a/src/google/protobuf/map_entry.h
+++ b/src/google/protobuf/map_entry.h
@@ -43,9 +43,10 @@
 namespace protobuf {
 class Arena;
 namespace internal {
-template <typename Derived, typename Key, typename Value,
+template <typename Key, typename Value,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
 class MapField;
 }
 }
@@ -53,12 +54,36 @@
 namespace protobuf {
 namespace internal {
 
+// Register all MapEntry default instances so we can delete them in
+// ShutdownProtobufLibrary().
+void LIBPROTOBUF_EXPORT RegisterMapEntryDefaultInstance(
+    MessageLite* default_instance);
+
+// This is the common base class for MapEntry. It is used by MapFieldBase in
+// reflection api, in which the static type of key and value is unknown.
+class LIBPROTOBUF_EXPORT MapEntryBase : public Message {
+ public:
+  ::google::protobuf::Metadata GetMetadata() const {
+    ::google::protobuf::Metadata metadata;
+    metadata.descriptor = descriptor_;
+    metadata.reflection = reflection_;
+    return metadata;
+  }
+
+ protected:
+  MapEntryBase() : descriptor_(NULL), reflection_(NULL) {  }
+  virtual ~MapEntryBase() {}
+
+  const Descriptor* descriptor_;
+  const Reflection* reflection_;
+};
+
 // MapEntry is the returned google::protobuf::Message when calling AddMessage of
 // google::protobuf::Reflection. In order to let it work with generated message
 // reflection, its in-memory type is the same as generated message with the same
 // fields. However, in order to decide the in-memory type of key/value, we need
 // to know both their cpp type in generated api and proto type. In
-// implementation, all in-memory types have related wire format functions to
+// implmentation, all in-memory types have related wire format functions to
 // support except ArenaStringPtr. Therefore, we need to define another type with
 // supporting wire format functions. Since this type is only used as return type
 // of MapEntry accessors, it's named MapEntry accessor type.
@@ -80,57 +105,200 @@
 // while we need to explicitly specify the cpp type if proto type is
 // TYPE_MESSAGE to infer the in-memory type.  Moreover, default_enum_value is
 // used to initialize enum field in proto2.
-template <typename Derived, typename Key, typename Value,
+template <typename Key, typename Value,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-class MapEntry
-    : public MapEntryImpl<Derived, Message, Key, Value, kKeyFieldType,
-                          kValueFieldType, default_enum_value> {
- public:
-  MapEntry() : _internal_metadata_(NULL) {}
-  explicit MapEntry(Arena* arena)
-      : MapEntryImpl<Derived, Message, Key, Value, kKeyFieldType,
-                     kValueFieldType, default_enum_value>(arena),
-        _internal_metadata_(arena) {}
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+class MapEntry : public MapEntryBase {
+  // Provide utilities to parse/serialize key/value.  Provide utilities to
+  // manipulate internal stored type.
+  typedef MapTypeHandler<kKeyFieldType, Key> KeyTypeHandler;
+  typedef MapTypeHandler<kValueFieldType, Value> ValueTypeHandler;
 
-  InternalMetadataWithArena _internal_metadata_;
+  // 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;
+
+  // Abbreviation for MapEntry
+  typedef typename google::protobuf::internal::MapEntry<
+      Key, Value, kKeyFieldType, kValueFieldType, default_enum_value> EntryType;
+
+  // Abbreviation for MapEntryLite
+  typedef typename google::protobuf::internal::MapEntryLite<
+      Key, Value, kKeyFieldType, kValueFieldType, default_enum_value>
+      EntryLiteType;
+
+ public:
+  ~MapEntry() {
+    if (this == default_instance_) {
+      delete reflection_;
+    }
+  }
+
+  // accessors ======================================================
+
+  virtual inline const KeyMapEntryAccessorType& key() const {
+    return entry_lite_.key();
+  }
+  inline KeyMapEntryAccessorType* mutable_key() {
+    return entry_lite_.mutable_key();
+  }
+  virtual inline const ValueMapEntryAccessorType& value() const {
+    return entry_lite_.value();
+  }
+  inline ValueMapEntryAccessorType* mutable_value() {
+    return entry_lite_.mutable_value();
+  }
+
+  // implements Message =============================================
+
+  bool MergePartialFromCodedStream(::google::protobuf::io::CodedInputStream* input) {
+    return entry_lite_.MergePartialFromCodedStream(input);
+  }
+
+  int ByteSize() const {
+    return entry_lite_.ByteSize();
+  }
+
+  void SerializeWithCachedSizes(::google::protobuf::io::CodedOutputStream* output) const {
+    entry_lite_.SerializeWithCachedSizes(output);
+  }
+
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const {
+    return entry_lite_.SerializeWithCachedSizesToArray(output);
+  }
+
+  int GetCachedSize() const {
+    return entry_lite_.GetCachedSize();
+  }
+
+  bool IsInitialized() const {
+    return entry_lite_.IsInitialized();
+  }
+
+  Message* New() const {
+    MapEntry* entry = new MapEntry;
+    entry->descriptor_ = descriptor_;
+    entry->reflection_ = reflection_;
+    entry->set_default_instance(default_instance_);
+    return entry;
+  }
+
+  Message* New(Arena* arena) const {
+    MapEntry* entry = Arena::CreateMessage<MapEntry>(arena);
+    entry->descriptor_ = descriptor_;
+    entry->reflection_ = reflection_;
+    entry->set_default_instance(default_instance_);
+    return entry;
+  }
+
+  int SpaceUsed() const {
+    int size = sizeof(MapEntry);
+    size += entry_lite_.SpaceUsed();
+    return size;
+  }
+
+  void CopyFrom(const ::google::protobuf::Message& from) {
+    Clear();
+    MergeFrom(from);
+  }
+
+  void MergeFrom(const ::google::protobuf::Message& from) {
+    GOOGLE_CHECK_NE(&from, this);
+    const MapEntry* source = dynamic_cast_if_available<const MapEntry*>(&from);
+    if (source == NULL) {
+      ReflectionOps::Merge(from, this);
+    } else {
+      MergeFrom(*source);
+    }
+  }
+
+  void CopyFrom(const MapEntry& from) {
+    Clear();
+    MergeFrom(from);
+  }
+
+  void MergeFrom(const MapEntry& from) {
+    entry_lite_.MergeFrom(from.entry_lite_);
+  }
+
+  void Clear() {
+    entry_lite_.Clear();
+  }
+
+  void InitAsDefaultInstance() {
+    entry_lite_.InitAsDefaultInstance();
+  }
+
+  Arena* GetArena() const {
+    return entry_lite_.GetArena();
+  }
+
+  // Create default MapEntry instance for given descriptor. Descriptor has to be
+  // given when creating default MapEntry instance because different map field
+  // may have the same type and MapEntry class. The given descriptor is needed
+  // to distinguish instances of the same MapEntry class.
+  static MapEntry* CreateDefaultInstance(const Descriptor* descriptor) {
+    MapEntry* entry = new MapEntry;
+    const Reflection* reflection = new GeneratedMessageReflection(
+        descriptor, entry, offsets_,
+        GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MapEntry, entry_lite_._has_bits_),
+        GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MapEntry, _unknown_fields_), -1,
+        DescriptorPool::generated_pool(),
+        ::google::protobuf::MessageFactory::generated_factory(),
+        sizeof(MapEntry),
+        GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MapEntry, _internal_metadata_));
+    entry->descriptor_ = descriptor;
+    entry->reflection_ = reflection;
+    entry->set_default_instance(entry);
+    entry->InitAsDefaultInstance();
+    RegisterMapEntryDefaultInstance(entry);
+    return entry;
+  }
 
  private:
+  MapEntry()
+      : _internal_metadata_(NULL), default_instance_(NULL), entry_lite_() {}
+
+  explicit MapEntry(Arena* arena)
+      : _internal_metadata_(arena),
+        default_instance_(NULL),
+        entry_lite_(arena) {}
+
+  inline Arena* GetArenaNoVirtual() const {
+    return entry_lite_.GetArenaNoVirtual();
+  }
+
+  void set_default_instance(MapEntry* default_instance) {
+    default_instance_ = default_instance;
+    entry_lite_.set_default_instance(&default_instance->entry_lite_);
+  }
+
+  static int offsets_[2];
+  UnknownFieldSet _unknown_fields_;
+  InternalMetadataWithArena _internal_metadata_;
+  MapEntry* default_instance_;
+  EntryLiteType entry_lite_;
+
   friend class ::google::protobuf::Arena;
-  template <typename C, typename K, typename V,
-            WireFormatLite::FieldType k_wire_type, WireFormatLite::FieldType,
-            int default_enum>
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  template <typename K, typename V, WireFormatLite::FieldType k_wire_type,
+            WireFormatLite::FieldType, int default_enum>
   friend class internal::MapField;
   friend class internal::GeneratedMessageReflection;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntry);
 };
 
-// Specialization for the full runtime
-template <typename Derived, typename Key, typename Value,
-          WireFormatLite::FieldType kKeyFieldType,
+template <typename Key, typename Value, WireFormatLite::FieldType kKeyFieldType,
           WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-struct MapEntryHelper<MapEntry<Derived, Key, Value, kKeyFieldType,
-                               kValueFieldType, default_enum_value> >
-    : MapEntryHelper<MapEntryLite<Derived, Key, Value, kKeyFieldType,
-                                  kValueFieldType, default_enum_value> > {
-  explicit MapEntryHelper(const MapPair<Key, Value>& map_pair)
-      : MapEntryHelper<MapEntryLite<Derived, Key, Value, kKeyFieldType,
-                                    kValueFieldType, default_enum_value> >(
-            map_pair) {}
-};
-
-template <typename Derived, typename K, typename V,
-          WireFormatLite::FieldType key, WireFormatLite::FieldType value,
-          int default_enum>
-struct DeconstructMapEntry<MapEntry<Derived, K, V, key, value, default_enum> > {
-  typedef K Key;
-  typedef V Value;
-  static const WireFormatLite::FieldType kKeyFieldType = key;
-  static const WireFormatLite::FieldType kValueFieldType = value;
-  static const int default_enum_value = default_enum;
+int MapEntry<Key, Value, kKeyFieldType, kValueFieldType,
+             default_enum_value>::offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MapEntry, entry_lite_.key_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MapEntry, entry_lite_.value_),
 };
 
 }  // namespace internal
diff --git a/src/google/protobuf/map_entry_lite.h b/src/google/protobuf/map_entry_lite.h
index 7c477c5..7cdf1b9 100644
--- a/src/google/protobuf/map_entry_lite.h
+++ b/src/google/protobuf/map_entry_lite.h
@@ -31,24 +31,22 @@
 #ifndef GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__
 #define GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__
 
-#include <assert.h>
-
-#include <google/protobuf/arena.h>
-#include <google/protobuf/map.h>
 #include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/stubs/port.h>
 #include <google/protobuf/wire_format_lite_inl.h>
 
 namespace google {
 namespace protobuf {
+class Arena;
 namespace internal {
-template <typename Derived, typename Key, typename Value,
+template <typename Key, typename Value,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
 class MapEntry;
-template <typename Derived, typename Key, typename Value,
+template <typename Key, typename Value,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
 class MapFieldLite;
 }  // namespace internal
 }  // namespace protobuf
@@ -56,46 +54,13 @@
 namespace protobuf {
 namespace internal {
 
-// MoveHelper::Move is used to set *dest.  It copies *src, or moves it (in
-// the C++11 sense), or swaps it. *src is left in a sane state for
-// subsequent destruction, but shouldn't be used for anything.
-template <bool is_enum, bool is_message, bool is_stringlike, typename T>
-struct MoveHelper {  // primitives
-  static void Move(T* src, T* dest) { *dest = *src; }
-};
-
-template <bool is_message, bool is_stringlike, typename T>
-struct MoveHelper<true, is_message, is_stringlike, T> {  // enums
-  static void Move(T* src, T* dest) { *dest = *src; }
-  // T is an enum here, so allow conversions to and from int.
-  static void Move(T* src, int* dest) { *dest = static_cast<int>(*src); }
-  static void Move(int* src, T* dest) { *dest = static_cast<T>(*src); }
-};
-
-template <bool is_stringlike, typename T>
-struct MoveHelper<false, true, is_stringlike, T> {  // messages
-  static void Move(T* src, T* dest) { dest->Swap(src); }
-};
-
-template <typename T>
-struct MoveHelper<false, false, true, T> {  // strings and similar
-  static void Move(T* src, T* dest) {
-#if __cplusplus >= 201103L
-    *dest = std::move(*src);
-#else
-    dest->swap(*src);
-#endif
-  }
-};
-
-// MapEntryImpl is used to implement parsing and serialization of map entries.
-// It uses Curious Recursive Template Pattern (CRTP) to provide the type of
-// the eventual code to the template code.
-template <typename Derived, typename Base, typename Key, typename Value,
+// MapEntryLite is used to implement parsing and serialization of map for lite
+// runtime.
+template <typename Key, typename Value,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-class MapEntryImpl : public Base {
- protected:
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+class MapEntryLite : public MessageLite {
   // Provide utilities to parse/serialize key/value.  Provide utilities to
   // manipulate internal stored type.
   typedef MapTypeHandler<kKeyFieldType, Key> KeyTypeHandler;
@@ -121,36 +86,15 @@
       kKeyFieldNumber, KeyTypeHandler::kWireType);
   static const uint8 kValueTag = GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(
       kValueFieldNumber, ValueTypeHandler::kWireType);
-  static const size_t kTagSize = 1;
+  static const int kTagSize = 1;
 
  public:
-  // Work-around for a compiler bug (see repeated_field.h).
-  typedef void MapEntryHasMergeTypeTrait;
-  typedef Derived EntryType;
-  typedef Key EntryKeyType;
-  typedef Value EntryValueType;
-  static const WireFormatLite::FieldType kEntryKeyFieldType = kKeyFieldType;
-  static const WireFormatLite::FieldType kEntryValueFieldType = kValueFieldType;
-  static const int kEntryDefaultEnumValue = default_enum_value;
-
-  MapEntryImpl() : arena_(NULL) {
-    KeyTypeHandler::Initialize(&key_, NULL);
-    ValueTypeHandler::InitializeMaybeByDefaultEnum(&value_, default_enum_value,
-                                                   NULL);
-    _has_bits_[0] = 0;
-  }
-
-  explicit MapEntryImpl(Arena* arena) : arena_(arena) {
-    KeyTypeHandler::Initialize(&key_, arena);
-    ValueTypeHandler::InitializeMaybeByDefaultEnum(&value_, default_enum_value,
-                                                   arena);
-    _has_bits_[0] = 0;
-  }
-
-  ~MapEntryImpl() {
-    if (GetArenaNoVirtual() != NULL) return;
-    KeyTypeHandler::DeleteNoArena(key_);
-    ValueTypeHandler::DeleteNoArena(value_);
+  ~MapEntryLite() {
+    if (this != default_instance_) {
+      if (GetArenaNoVirtual() != NULL) return;
+      KeyTypeHandler::DeleteNoArena(key_);
+      ValueTypeHandler::DeleteNoArena(value_);
+    }
   }
 
   // accessors ======================================================
@@ -159,8 +103,9 @@
     return KeyTypeHandler::GetExternalReference(key_);
   }
   virtual inline const ValueMapEntryAccessorType& value() const {
-    return ValueTypeHandler::DefaultIfNotInitialized(
-        value_, Derived::internal_default_instance()->value_);
+    GOOGLE_CHECK(default_instance_ != NULL);
+    return ValueTypeHandler::DefaultIfNotInitialized(value_,
+                                                    default_instance_->value_);
   }
   inline KeyMapEntryAccessorType* mutable_key() {
     set_has_key();
@@ -173,12 +118,12 @@
 
   // implements MessageLite =========================================
 
-  // MapEntryImpl is for implementation only and this function isn't called
+  // MapEntryLite is for implementation only and this function isn't called
   // anywhere. Just provide a fake implementation here for MessageLite.
   string GetTypeName() const { return ""; }
 
   void CheckTypeAndMergeFrom(const MessageLite& other) {
-    MergeFromInternal(*::google::protobuf::down_cast<const Derived*>(&other));
+    MergeFrom(*::google::protobuf::down_cast<const MapEntryLite*>(&other));
   }
 
   bool MergePartialFromCodedStream(::google::protobuf::io::CodedInputStream* input) {
@@ -193,7 +138,7 @@
       // need to care whether the value is unknown enum;
       // 4) missing key/value: missed key/value will have default value. caller
       // should take this entry as if key/value is set to default value.
-      tag = input->ReadTagNoLastTag();
+      tag = input->ReadTag();
       switch (tag) {
         case kKeyTag:
           if (!KeyTypeHandler::Read(input, mutable_key())) {
@@ -223,12 +168,10 @@
     }
   }
 
-  size_t ByteSizeLong() const {
-    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;
+  int ByteSize() const {
+    int size = 0;
+    size += has_key() ? kTagSize + KeyTypeHandler::ByteSize(key()) : 0;
+    size += has_value() ? kTagSize + ValueTypeHandler::ByteSize(value()) : 0;
     return size;
   }
 
@@ -237,51 +180,46 @@
     ValueTypeHandler::Write(kValueFieldNumber, value(), output);
   }
 
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(bool deterministic,
-                                                   ::google::protobuf::uint8* output) const {
-    output = KeyTypeHandler::InternalWriteToArray(kKeyFieldNumber, key(),
-                                                  deterministic, output);
-    output = ValueTypeHandler::InternalWriteToArray(kValueFieldNumber, value(),
-                                                    deterministic, output);
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const {
+    output = KeyTypeHandler::WriteToArray(kKeyFieldNumber, key(), output);
+    output = ValueTypeHandler::WriteToArray(kValueFieldNumber, value(), output);
     return output;
   }
 
-  // Don't override SerializeWithCachedSizesToArray.  Use MessageLite's.
-
   int GetCachedSize() const {
     int size = 0;
     size += has_key()
-        ? static_cast<int>(kTagSize) + KeyTypeHandler::GetCachedSize(key())
+        ? kTagSize + KeyTypeHandler::GetCachedSize(key())
         : 0;
     size += has_value()
-        ? static_cast<int>(kTagSize) + ValueTypeHandler::GetCachedSize(value())
+        ? kTagSize + ValueTypeHandler::GetCachedSize(
+            value())
         : 0;
     return size;
   }
 
   bool IsInitialized() const { return ValueTypeHandler::IsInitialized(value_); }
 
-  Base* New() const {
-    Derived* entry = new Derived;
+  MessageLite* New() const {
+    MapEntryLite* entry = new MapEntryLite;
+    entry->default_instance_ = default_instance_;
     return entry;
   }
 
-  Base* New(Arena* arena) const {
-    Derived* entry = Arena::CreateMessage<Derived>(arena);
+  MessageLite* New(Arena* arena) const {
+    MapEntryLite* entry = Arena::CreateMessage<MapEntryLite>(arena);
+    entry->default_instance_ = default_instance_;
     return entry;
   }
 
-  size_t SpaceUsedLong() const {
-    size_t size = sizeof(Derived);
-    size += KeyTypeHandler::SpaceUsedInMapEntryLong(key_);
-    size += ValueTypeHandler::SpaceUsedInMapEntryLong(value_);
+  int SpaceUsed() const {
+    int size = sizeof(MapEntryLite);
+    size += KeyTypeHandler::SpaceUsedInMapEntry(key_);
+    size += ValueTypeHandler::SpaceUsedInMapEntry(value_);
     return size;
   }
 
- protected:
-  // We can't declare this function directly here as it would hide the other
-  // overload (const Message&).
-  void MergeFromInternal(const MapEntryImpl& from) {
+  void MergeFrom(const MapEntryLite& from) {
     if (from._has_bits_[0]) {
       if (from.has_key()) {
         KeyTypeHandler::EnsureMutable(&key_, GetArenaNoVirtual());
@@ -296,7 +234,6 @@
     }
   }
 
- public:
   void Clear() {
     KeyTypeHandler::Clear(&key_, GetArenaNoVirtual());
     ValueTypeHandler::ClearMaybeByDefaultEnum(
@@ -305,135 +242,35 @@
     clear_has_value();
   }
 
-  static void InitAsDefaultInstance() {
-    Derived* d = const_cast<Derived*>(Derived::internal_default_instance());
-    KeyTypeHandler::AssignDefaultValue(&d->key_);
-    ValueTypeHandler::AssignDefaultValue(&d->value_);
+  void InitAsDefaultInstance() {
+    KeyTypeHandler::AssignDefaultValue(&key_);
+    ValueTypeHandler::AssignDefaultValue(&value_);
   }
 
   Arena* GetArena() const {
     return GetArenaNoVirtual();
   }
 
-  // Create a MapEntryImpl for given key and value from google::protobuf::Map in
+  // Create a MapEntryLite for given key and value from google::protobuf::Map in
   // serialization. This function is only called when value is enum. Enum is
   // treated differently because its type in MapEntry is int and its type in
   // google::protobuf::Map is enum. We cannot create a reference to int from an enum.
-  static Derived* EnumWrap(const Key& key, const Value value, Arena* arena) {
-    return Arena::CreateMessage<MapEnumEntryWrapper>(arena, key, value);
+  static MapEntryLite* EnumWrap(const Key& key, const Value value,
+                                Arena* arena) {
+    return Arena::CreateMessage<MapEnumEntryWrapper<
+        Key, Value, kKeyFieldType, kValueFieldType, default_enum_value> >(
+        arena, key, value);
   }
 
   // Like above, but for all the other types. This avoids value copy to create
-  // MapEntryImpl from google::protobuf::Map in serialization.
-  static Derived* Wrap(const Key& key, const Value& value, Arena* arena) {
-    return Arena::CreateMessage<MapEntryWrapper>(arena, key, value);
+  // MapEntryLite from google::protobuf::Map in serialization.
+  static MapEntryLite* Wrap(const Key& key, const Value& value, Arena* arena) {
+    return Arena::CreateMessage<MapEntryWrapper<Key, Value, kKeyFieldType,
+                                                kValueFieldType,
+                                                default_enum_value> >(
+        arena, key, value);
   }
 
-  // Parsing using MergePartialFromCodedStream, above, is not as
-  // efficient as it could be.  This helper class provides a speedier way.
-  template <typename MapField, typename Map>
-  class Parser {
-   public:
-    explicit Parser(MapField* mf) : mf_(mf), map_(mf->MutableMap()) {}
-
-    // This does what the typical MergePartialFromCodedStream() is expected to
-    // do, with the additional side-effect that if successful (i.e., if true is
-    // going to be its return value) it inserts the key-value pair into map_.
-    bool MergePartialFromCodedStream(::google::protobuf::io::CodedInputStream* input) {
-      // Look for the expected thing: a key and then a value.  If it fails,
-      // invoke the enclosing class's MergePartialFromCodedStream, or return
-      // false if that would be pointless.
-      if (input->ExpectTag(kKeyTag)) {
-        if (!KeyTypeHandler::Read(input, &key_)) {
-          return false;
-        }
-        // Peek at the next byte to see if it is kValueTag.  If not, bail out.
-        const void* data;
-        int size;
-        input->GetDirectBufferPointerInline(&data, &size);
-        // We could use memcmp here, but we don't bother. The tag is one byte.
-        GOOGLE_COMPILE_ASSERT(kTagSize == 1, tag_size_error);
-        if (size > 0 && *reinterpret_cast<const char*>(data) == kValueTag) {
-          typename Map::size_type size = map_->size();
-          value_ptr_ = &(*map_)[key_];
-          if (GOOGLE_PREDICT_TRUE(size != map_->size())) {
-            // We created a new key-value pair.  Fill in the value.
-            typedef
-                typename MapIf<ValueTypeHandler::kIsEnum, int*, Value*>::type T;
-            input->Skip(kTagSize);  // Skip kValueTag.
-            if (!ValueTypeHandler::Read(input,
-                                        reinterpret_cast<T>(value_ptr_))) {
-              map_->erase(key_);  // Failure! Undo insertion.
-              return false;
-            }
-            if (input->ExpectAtEnd()) return true;
-            return ReadBeyondKeyValuePair(input);
-          }
-        }
-      } else {
-        key_ = Key();
-      }
-
-      entry_.reset(mf_->NewEntry());
-      *entry_->mutable_key() = key_;
-      const bool result = entry_->MergePartialFromCodedStream(input);
-      if (result) UseKeyAndValueFromEntry();
-      if (entry_->GetArena() != NULL) entry_.release();
-      return result;
-    }
-
-    const Key& key() const { return key_; }
-    const Value& value() const { return *value_ptr_; }
-
-   private:
-    void UseKeyAndValueFromEntry() GOOGLE_PROTOBUF_ATTRIBUTE_COLD {
-      // Update key_ in case we need it later (because key() is called).
-      // This is potentially inefficient, especially if the key is
-      // expensive to copy (e.g., a long string), but this is a cold
-      // 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_);
-    }
-
-    // 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(::google::protobuf::io::CodedInputStream* input)
-        GOOGLE_PROTOBUF_ATTRIBUTE_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;
-      entry_.reset(mf_->NewEntry());
-      ValueMover::Move(value_ptr_, entry_->mutable_value());
-      map_->erase(key_);
-      KeyMover::Move(&key_, entry_->mutable_key());
-      const bool result = entry_->MergePartialFromCodedStream(input);
-      if (result) UseKeyAndValueFromEntry();
-      if (entry_->GetArena() != NULL) entry_.release();
-      return result;
-    }
-
-    MapField* const mf_;
-    Map* const map_;
-    Key key_;
-    Value* value_ptr_;
-    // On the fast path entry_ is not used.  And, when entry_ is used, it's set
-    // to mf_->NewEntry(), so in the arena case we must call entry_.release.
-    google::protobuf::scoped_ptr<MapEntryImpl> entry_;
-  };
-
  protected:
   void set_has_key() { _has_bits_[0] |= 0x00000001u; }
   bool has_key() const { return (_has_bits_[0] & 0x00000001u) != 0; }
@@ -453,17 +290,21 @@
   // involves copy of key and value to construct a MapEntry. In order to avoid
   // this copy in constructing a MapEntry, we need the following class which
   // only takes references of given key and value.
-  class MapEntryWrapper : public Derived {
-    typedef Derived BaseClass;
-    typedef typename BaseClass::KeyMapEntryAccessorType KeyMapEntryAccessorType;
-    typedef
-        typename BaseClass::ValueMapEntryAccessorType ValueMapEntryAccessorType;
+  template <typename K, typename V, WireFormatLite::FieldType k_wire_type,
+            WireFormatLite::FieldType v_wire_type, int default_enum>
+  class MapEntryWrapper
+      : public MapEntryLite<K, V, k_wire_type, v_wire_type, default_enum> {
+    typedef MapEntryLite<K, V, k_wire_type, v_wire_type, default_enum> Base;
+    typedef typename Base::KeyMapEntryAccessorType KeyMapEntryAccessorType;
+    typedef typename Base::ValueMapEntryAccessorType ValueMapEntryAccessorType;
 
    public:
-    MapEntryWrapper(Arena* arena, const Key& key, const Value& value)
-        : Derived(arena), key_(key), value_(value) {
-      BaseClass::set_has_key();
-      BaseClass::set_has_value();
+    MapEntryWrapper(Arena* arena, const K& key, const V& value)
+        : MapEntryLite<K, V, k_wire_type, v_wire_type, default_enum>(arena),
+          key_(key),
+          value_(value) {
+      Base::set_has_key();
+      Base::set_has_value();
     }
     inline const KeyMapEntryAccessorType& key() const { return key_; }
     inline const ValueMapEntryAccessorType& value() const { return value_; }
@@ -483,17 +324,21 @@
   // initialize a reference to int with a reference to enum, compiler will
   // generate a temporary int from enum and initialize the reference to int with
   // the temporary.
-  class MapEnumEntryWrapper : public Derived {
-    typedef Derived BaseClass;
-    typedef typename BaseClass::KeyMapEntryAccessorType KeyMapEntryAccessorType;
-    typedef
-        typename BaseClass::ValueMapEntryAccessorType ValueMapEntryAccessorType;
+  template <typename K, typename V, WireFormatLite::FieldType k_wire_type,
+            WireFormatLite::FieldType v_wire_type, int default_enum>
+  class MapEnumEntryWrapper
+      : public MapEntryLite<K, V, k_wire_type, v_wire_type, default_enum> {
+    typedef MapEntryLite<K, V, k_wire_type, v_wire_type, default_enum> Base;
+    typedef typename Base::KeyMapEntryAccessorType KeyMapEntryAccessorType;
+    typedef typename Base::ValueMapEntryAccessorType ValueMapEntryAccessorType;
 
    public:
-    MapEnumEntryWrapper(Arena* arena, const Key& key, const Value& value)
-        : Derived(arena), key_(key), value_(value) {
-      BaseClass::set_has_key();
-      BaseClass::set_has_value();
+    MapEnumEntryWrapper(Arena* arena, const K& key, const V& value)
+        : MapEntryLite<K, V, k_wire_type, v_wire_type, default_enum>(arena),
+          key_(key),
+          value_(value) {
+      Base::set_has_key();
+      Base::set_has_value();
     }
     inline const KeyMapEntryAccessorType& key() const { return key_; }
     inline const ValueMapEntryAccessorType& value() const { return value_; }
@@ -506,158 +351,48 @@
     typedef void DestructorSkippable_;
   };
 
+  MapEntryLite() : default_instance_(NULL), arena_(NULL) {
+    KeyTypeHandler::Initialize(&key_, NULL);
+    ValueTypeHandler::InitializeMaybeByDefaultEnum(
+        &value_, default_enum_value, NULL);
+    _has_bits_[0] = 0;
+  }
+
+  explicit MapEntryLite(Arena* arena)
+      : default_instance_(NULL), arena_(arena) {
+    KeyTypeHandler::Initialize(&key_, arena);
+    ValueTypeHandler::InitializeMaybeByDefaultEnum(
+        &value_, default_enum_value, arena);
+    _has_bits_[0] = 0;
+  }
+
   inline Arena* GetArenaNoVirtual() const {
     return arena_;
   }
 
- public:  // Needed for constructing tables
+  void set_default_instance(MapEntryLite* default_instance) {
+    default_instance_ = default_instance;
+  }
+
+  MapEntryLite* default_instance_;
+
   KeyOnMemory key_;
   ValueOnMemory value_;
   Arena* arena_;
   uint32 _has_bits_[1];
 
- private:
   friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
-  template <typename C, typename K, typename V, WireFormatLite::FieldType,
+  template <typename K, typename V, WireFormatLite::FieldType,
             WireFormatLite::FieldType, int>
   friend class internal::MapEntry;
-  template <typename C, typename K, typename V, WireFormatLite::FieldType,
+  template <typename K, typename V, WireFormatLite::FieldType,
             WireFormatLite::FieldType, int>
   friend class internal::MapFieldLite;
 
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryImpl);
-};
-
-template <typename T, typename Key, typename Value,
-          WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-class MapEntryLite
-    : public MapEntryImpl<T, MessageLite, Key, Value, kKeyFieldType,
-                          kValueFieldType, default_enum_value> {
- public:
-  typedef MapEntryImpl<T, MessageLite, Key, Value, kKeyFieldType,
-                       kValueFieldType, default_enum_value>
-      SuperType;
-  MapEntryLite() {}
-  explicit MapEntryLite(Arena* arena) : SuperType(arena) {}
-  void MergeFrom(const MapEntryLite& other) { MergeFromInternal(other); }
-
- private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryLite);
 };
-// The completely unprincipled and unwieldy use of template parameters in
-// the map code necessitates wrappers to make the code a little bit more
-// manageable.
-template <typename Derived>
-struct DeconstructMapEntry;
-
-template <typename T, typename K, typename V, WireFormatLite::FieldType key,
-          WireFormatLite::FieldType value, int default_enum>
-struct DeconstructMapEntry<MapEntryLite<T, K, V, key, value, default_enum> > {
-  typedef K Key;
-  typedef V Value;
-  static const WireFormatLite::FieldType kKeyFieldType = key;
-  static const WireFormatLite::FieldType kValueFieldType = value;
-  static const int default_enum_value = default_enum;
-};
-
-// Helpers for deterministic serialization =============================
-
-// This struct can be used with any generic sorting algorithm.  If the Key
-// 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 {
-  SortItem() {}
-  explicit SortItem(PtrToKeyValuePair p) : first(p->first), second(p) {}
-
-  Key first;
-  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 CompareByDerefFirst {
-  bool operator()(const T& a, const T& b) const {
-    return a->first < b->first;
-  }
-};
-
-// Helper for table driven serialization
-
-template <WireFormatLite::FieldType FieldType>
-struct FromHelper {
-  template <typename T>
-  static const T& From(const T& x) {
-    return x;
-  }
-};
-
-template <>
-struct FromHelper<WireFormatLite::TYPE_STRING> {
-  static ArenaStringPtr From(const string& x) {
-    ArenaStringPtr res;
-    *res.UnsafeRawStringPointer() = const_cast<string*>(&x);
-    return res;
-  }
-};
-template <>
-struct FromHelper<WireFormatLite::TYPE_BYTES> {
-  static ArenaStringPtr From(const string& x) {
-    ArenaStringPtr res;
-    *res.UnsafeRawStringPointer() = const_cast<string*>(&x);
-    return res;
-  }
-};
-template <>
-struct FromHelper<WireFormatLite::TYPE_MESSAGE> {
-  template <typename T>
-  static T* From(const T& x) {
-    return const_cast<T*>(&x);
-  }
-};
-
-template <typename MapEntryType>
-struct MapEntryHelper;
-
-template <typename T, typename Key, typename Value,
-          WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-struct MapEntryHelper<MapEntryLite<T, Key, Value, kKeyFieldType,
-                                   kValueFieldType, default_enum_value> > {
-  // Provide utilities to parse/serialize key/value.  Provide utilities to
-  // manipulate internal stored type.
-  typedef MapTypeHandler<kKeyFieldType, Key> KeyTypeHandler;
-  typedef MapTypeHandler<kValueFieldType, Value> ValueTypeHandler;
-
-  // Define internal memory layout. Strings and messages are stored as
-  // pointers, while other types are stored as values.
-  typedef typename KeyTypeHandler::TypeOnMemory KeyOnMemory;
-  typedef typename ValueTypeHandler::TypeOnMemory ValueOnMemory;
-
-  explicit MapEntryHelper(const MapPair<Key, Value>& map_pair)
-      : _has_bits_(3),
-        _cached_size_(2 + KeyTypeHandler::GetCachedSize(map_pair.first) +
-                      ValueTypeHandler::GetCachedSize(map_pair.second)),
-        key_(FromHelper<kKeyFieldType>::From(map_pair.first)),
-        value_(FromHelper<kValueFieldType>::From(map_pair.second)) {}
-
-  // Purposely not folowing the style guide naming. These are the names
-  // the proto compiler would generate given the map entry descriptor.
-  // The proto compiler generates the offsets in this struct as if this was
-  // a regular message. This way the table driven code barely notices it's
-  // dealing with a map field.
-  uint32 _has_bits_;     // NOLINT
-  uint32 _cached_size_;  // NOLINT
-  KeyOnMemory key_;      // NOLINT
-  ValueOnMemory value_;  // NOLINT
-};
 
 }  // namespace internal
 }  // namespace protobuf
diff --git a/src/google/protobuf/map_field.cc b/src/google/protobuf/map_field.cc
index 64dcc99..49f9181 100644
--- a/src/google/protobuf/map_field.cc
+++ b/src/google/protobuf/map_field.cc
@@ -37,6 +37,31 @@
 namespace protobuf {
 namespace internal {
 
+ProtobufOnceType map_entry_default_instances_once_;
+Mutex* map_entry_default_instances_mutex_;
+vector<MessageLite*>* map_entry_default_instances_;
+
+void DeleteMapEntryDefaultInstances() {
+  for (int i = 0; i < map_entry_default_instances_->size(); ++i) {
+    delete map_entry_default_instances_->at(i);
+  }
+  delete map_entry_default_instances_mutex_;
+  delete map_entry_default_instances_;
+}
+
+void InitMapEntryDefaultInstances() {
+  map_entry_default_instances_mutex_ = new Mutex();
+  map_entry_default_instances_ = new vector<MessageLite*>();
+  OnShutdown(&DeleteMapEntryDefaultInstances);
+}
+
+void RegisterMapEntryDefaultInstance(MessageLite* default_instance) {
+  ::google::protobuf::GoogleOnceInit(&map_entry_default_instances_once_,
+                 &InitMapEntryDefaultInstances);
+  MutexLock lock(map_entry_default_instances_mutex_);
+  map_entry_default_instances_->push_back(default_instance);
+}
+
 MapFieldBase::~MapFieldBase() {
   if (repeated_field_ != NULL && arena_ == NULL) delete repeated_field_;
 }
@@ -52,26 +77,25 @@
   return repeated_field_;
 }
 
-size_t MapFieldBase::SpaceUsedExcludingSelfLong() const {
+int MapFieldBase::SpaceUsedExcludingSelf() const {
   mutex_.Lock();
-  size_t size = SpaceUsedExcludingSelfNoLock();
+  int size = SpaceUsedExcludingSelfNoLock();
   mutex_.Unlock();
   return size;
 }
 
-size_t MapFieldBase::SpaceUsedExcludingSelfNoLock() const {
+int MapFieldBase::SpaceUsedExcludingSelfNoLock() const {
   if (repeated_field_ != NULL) {
-    return repeated_field_->SpaceUsedExcludingSelfLong();
+    return repeated_field_->SpaceUsedExcludingSelf();
   } else {
     return 0;
   }
 }
 
-bool MapFieldBase::IsMapValid() const {
-  // "Acquire" insures the operation after SyncRepeatedFieldWithMap won't get
-  // executed before state_ is checked.
-  Atomic32 state = google::protobuf::internal::Acquire_Load(&state_);
-  return state != STATE_MODIFIED_REPEATED;
+void MapFieldBase::InitMetadataOnce() const {
+  GOOGLE_CHECK(entry_descriptor_ != NULL);
+  GOOGLE_CHECK(assign_descriptor_callback_ != NULL);
+  (*assign_descriptor_callback_)();
 }
 
 void MapFieldBase::SetMapDirty() { state_ = STATE_MODIFIED_MAP; }
@@ -366,13 +390,6 @@
         GOOGLE_LOG(FATAL) << "Can't get here.";
         break;
     }
-
-    // Remove existing map value with same key.
-    Map<MapKey, MapValueRef>::iterator iter = map->find(map_key);
-    if (iter != map->end()) {
-      iter->second.DeleteData();
-    }
-
     MapValueRef& map_val = (*map)[map_key];
     map_val.SetType(val_des->cpp_type());
     switch (val_des->cpp_type()) {
@@ -404,13 +421,13 @@
   }
 }
 
-size_t DynamicMapField::SpaceUsedExcludingSelfNoLock() const {
-  size_t size = 0;
+int DynamicMapField::SpaceUsedExcludingSelfNoLock() const {
+  int size = 0;
   if (MapFieldBase::repeated_field_ != NULL) {
-    size += MapFieldBase::repeated_field_->SpaceUsedExcludingSelfLong();
+    size += MapFieldBase::repeated_field_->SpaceUsedExcludingSelf();
   }
   size += sizeof(map_);
-  size_t map_size = map_.size();
+  int map_size = map_.size();
   if (map_size) {
     Map<MapKey, MapValueRef>::const_iterator it = map_.begin();
     size += sizeof(it->first) * map_size;
@@ -439,7 +456,7 @@
       case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: {
         while (it != map_.end()) {
           const Message& message = it->second.GetMessageValue();
-          size += message.GetReflection()->SpaceUsedLong(message);
+          size += message.GetReflection()->SpaceUsed(message);
           ++it;
         }
         break;
diff --git a/src/google/protobuf/map_field.h b/src/google/protobuf/map_field.h
index 6c75a6d..4b46f3a 100644
--- a/src/google/protobuf/map_field.h
+++ b/src/google/protobuf/map_field.h
@@ -36,7 +36,6 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
 #include <google/protobuf/map_entry.h>
 #include <google/protobuf/map_field_lite.h>
 #include <google/protobuf/map_type_handler.h>
@@ -55,7 +54,7 @@
 class GeneratedMessageReflection;
 class MapFieldAccessor;
 
-// This class provides access to map field using reflection, which is the same
+// This class provides accesss to map field using reflection, which is the same
 // as those provided for RepeatedPtrField<Message>. It is used for internal
 // reflection implentation only. Users should never use this directly.
 class LIBPROTOBUF_EXPORT MapFieldBase {
@@ -63,10 +62,14 @@
   MapFieldBase()
       : arena_(NULL),
         repeated_field_(NULL),
+        entry_descriptor_(NULL),
+        assign_descriptor_callback_(NULL),
         state_(STATE_MODIFIED_MAP) {}
   explicit MapFieldBase(Arena* arena)
       : arena_(arena),
         repeated_field_(NULL),
+        entry_descriptor_(NULL),
+        assign_descriptor_callback_(NULL),
         state_(STATE_MODIFIED_MAP) {
     // Mutex's destructor needs to be called explicitly to release resources
     // acquired in its constructor.
@@ -86,8 +89,6 @@
   virtual bool ContainsMapKey(const MapKey& map_key) const = 0;
   virtual bool InsertOrLookupMapValue(
       const MapKey& map_key, MapValueRef* val) = 0;
-  // Insures operations after won't get executed before calling this.
-  bool IsMapValid() const;
   virtual bool DeleteMapValue(const MapKey& map_key) = 0;
   virtual bool EqualIterator(const MapIterator& a,
                              const MapIterator& b) const = 0;
@@ -98,15 +99,11 @@
 
   // Returns the number of bytes used by the repeated field, excluding
   // sizeof(*this)
-  size_t SpaceUsedExcludingSelfLong() const;
-
-  int SpaceUsedExcludingSelf() const {
-    return internal::ToIntSize(SpaceUsedExcludingSelfLong());
-  }
+  int SpaceUsedExcludingSelf() const;
 
  protected:
   // Gets the size of space used by map field.
-  virtual size_t SpaceUsedExcludingSelfNoLock() const;
+  virtual int SpaceUsedExcludingSelfNoLock() const;
 
   // Synchronizes the content in Map to RepeatedPtrField if there is any change
   // to Map after last synchronization.
@@ -127,6 +124,9 @@
   // Provides derived class the access to repeated field.
   void* MutableRepeatedPtrField() const;
 
+  // Creates descriptor for only one time.
+  void InitMetadataOnce() const;
+
   enum State {
     STATE_MODIFIED_MAP = 0,       // map has newly added data that has not been
                                   // synchronized to repeated field
@@ -137,6 +137,13 @@
 
   Arena* arena_;
   mutable RepeatedPtrField<Message>* repeated_field_;
+  // MapEntry can only be created from MapField. To create MapEntry, MapField
+  // needs to know its descriptor, because MapEntry is not generated class which
+  // cannot initialize its own descriptor by calling generated
+  // descriptor-assign-function. Thus, we need to register a callback to
+  // initialize MapEntry's descriptor.
+  const Descriptor** entry_descriptor_;
+  void (*assign_descriptor_callback_)();
 
   mutable Mutex mutex_;  // The thread to synchronize map and repeated field
                          // needs to get lock first;
@@ -170,7 +177,6 @@
   // IncreaseIterator() is called by operator++() of MapIterator only.
   // It implements the ++ operator of MapIterator.
   virtual void IncreaseIterator(MapIterator* map_iter) const = 0;
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldBase);
 };
 
 // This class provides common Map Reflection implementations for generated
@@ -200,31 +206,32 @@
   void IncreaseIterator(MapIterator* map_iter) const;
 
   virtual void SetMapIteratorValue(MapIterator* map_iter) const = 0;
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeDefinedMapFieldBase);
 };
 
-// This class provides access to map field using generated api. It is used for
+// This class provides accesss to map field using generated api. It is used for
 // internal generated message implentation only. Users should never use this
 // directly.
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value = 0>
-class MapField : public TypeDefinedMapFieldBase<Key, T> {
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value = 0>
+class MapField : public TypeDefinedMapFieldBase<Key, T>,
+                 public MapFieldLite<Key, T, kKeyFieldType, kValueFieldType,
+                                     default_enum_value> {
   // Provide utilities to parse/serialize key/value.  Provide utilities to
   // manipulate internal stored type.
   typedef MapTypeHandler<kKeyFieldType, Key> KeyTypeHandler;
   typedef MapTypeHandler<kValueFieldType, T> ValueTypeHandler;
 
   // Define message type for internal repeated field.
-  typedef Derived EntryType;
-  typedef MapEntryLite<Derived, Key, T, kKeyFieldType, kValueFieldType,
-                       default_enum_value>
-      EntryLiteType;
+  typedef MapEntry<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>
+      EntryType;
+  typedef MapEntryLite<Key, T, kKeyFieldType, kValueFieldType,
+                       default_enum_value> EntryLiteType;
 
   // Define abbreviation for parent MapFieldLite
-  typedef MapFieldLite<Derived, Key, T, kKeyFieldType, kValueFieldType,
-                       default_enum_value>
-      MapFieldLiteType;
+  typedef MapFieldLite<Key, T, kKeyFieldType, kValueFieldType,
+                       default_enum_value> MapFieldLiteType;
 
   // Enum needs to be handled differently from other types because it has
   // different exposed type in google::protobuf::Map's api and repeated field's api. For
@@ -234,76 +241,58 @@
   typedef typename MapIf<kIsValueEnum, T, const T&>::type CastValueType;
 
  public:
-  typedef typename Derived::SuperType EntryTypeTrait;
-  typedef Map<Key, T> MapType;
-
-  MapField() {}
-  explicit MapField(Arena* arena)
-      : TypeDefinedMapFieldBase<Key, T>(arena), impl_(arena) {}
+  MapField();
+  explicit MapField(Arena* arena);
+  // MapField doesn't own the default_entry, which means default_entry must
+  // outlive the lifetime of MapField.
+  MapField(const Message* default_entry);
+  // For tests only.
+  MapField(Arena* arena, const Message* default_entry);
+  ~MapField();
 
   // Implement MapFieldBase
   bool ContainsMapKey(const MapKey& map_key) const;
   bool InsertOrLookupMapValue(const MapKey& map_key, MapValueRef* val);
   bool DeleteMapValue(const MapKey& map_key);
 
-  const Map<Key, T>& GetMap() const {
-    MapFieldBase::SyncMapWithRepeatedField();
-    return impl_.GetMap();
-  }
-
-  Map<Key, T>* MutableMap() {
-    MapFieldBase::SyncMapWithRepeatedField();
-    Map<Key, T>* result = impl_.MutableMap();
-    MapFieldBase::SetMapDirty();
-    return result;
-  }
+  // Accessors
+  const Map<Key, T>& GetMap() const;
+  Map<Key, T>* MutableMap();
 
   // Convenient methods for generated message implementation.
   int size() const;
   void Clear();
-  void MergeFrom(const MapField& other);
-  void Swap(MapField* other);
+  void MergeFrom(const MapFieldLiteType& other);
+  void Swap(MapFieldLiteType* other);
 
-  // Used in the implementation of parsing. Caller should take the ownership iff
-  // arena_ is NULL.
-  EntryType* NewEntry() const { return impl_.NewEntry(); }
-  // Used in the implementation of serializing enum value type. Caller should
-  // take the ownership iff arena_ is NULL.
-  EntryType* NewEnumEntryWrapper(const Key& key, const T t) const {
-    return impl_.NewEnumEntryWrapper(key, t);
-  }
-  // Used in the implementation of serializing other value types. Caller should
-  // take the ownership iff arena_ is NULL.
-  EntryType* NewEntryWrapper(const Key& key, const T& t) const {
-    return impl_.NewEntryWrapper(key, t);
-  }
+  // Allocates metadata only if this MapField is part of a generated message.
+  void SetEntryDescriptor(const Descriptor** descriptor);
+  void SetAssignDescriptorCallback(void (*callback)());
 
  private:
-  MapFieldLiteType impl_;
-
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
 
+  // MapField needs MapEntry's default instance to create new MapEntry.
+  void InitDefaultEntryOnce() const;
+
+  // Manually set default entry instance. For test only.
+  void SetDefaultEntryOnce(const EntryType* default_entry) const;
+
+  // Convenient methods to get internal google::protobuf::Map
+  const Map<Key, T>& GetInternalMap() const;
+  Map<Key, T>* MutableInternalMap();
+
   // Implements MapFieldBase
   void SyncRepeatedFieldWithMapNoLock() const;
   void SyncMapWithRepeatedFieldNoLock() const;
-  size_t SpaceUsedExcludingSelfNoLock() const;
+  int SpaceUsedExcludingSelfNoLock() const;
 
   void SetMapIteratorValue(MapIterator* map_iter) const;
 
-  friend class ::google::protobuf::Arena;
-  friend class MapFieldStateTest;  // For testing, it needs raw access to impl_
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapField);
-};
+  mutable const EntryType* default_entry_;
 
-template <typename T, typename Key, typename Value,
-          WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-struct MapEntryToMapField<MapEntry<T, Key, Value, kKeyFieldType,
-                                   kValueFieldType, default_enum_value> > {
-  typedef MapField<T, Key, Value, kKeyFieldType, kValueFieldType,
-                   default_enum_value>
-      MapFieldType;
+  friend class ::google::protobuf::Arena;
 };
 
 class LIBPROTOBUF_EXPORT DynamicMapField: public TypeDefinedMapFieldBase<MapKey, MapValueRef> {
@@ -329,401 +318,12 @@
   // Implements MapFieldBase
   void SyncRepeatedFieldWithMapNoLock() const;
   void SyncMapWithRepeatedFieldNoLock() const;
-  size_t SpaceUsedExcludingSelfNoLock() const;
+  int SpaceUsedExcludingSelfNoLock() const;
   void SetMapIteratorValue(MapIterator* map_iter) const;
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMapField);
 };
 
 }  // 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());                \
-  }
-
-// MapKey is an union type for representing any possible
-// map key.
-class LIBPROTOBUF_EXPORT MapKey {
- public:
-  MapKey() : type_(0) {
-  }
-  MapKey(const MapKey& other) : type_(0) {
-    CopyFrom(other);
-  }
-  MapKey& operator=(const MapKey& other) {
-    CopyFrom(other);
-    return *this;
-  }
-
-  ~MapKey() {
-    if (type_ == FieldDescriptor::CPPTYPE_STRING) {
-      delete val_.string_value_;
-    }
-  }
-
-  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.";
-    }
-    return (FieldDescriptor::CppType)type_;
-  }
-
-  void SetInt64Value(int64 value) {
-    SetType(FieldDescriptor::CPPTYPE_INT64);
-    val_.int64_value_ = value;
-  }
-  void SetUInt64Value(uint64 value) {
-    SetType(FieldDescriptor::CPPTYPE_UINT64);
-    val_.uint64_value_ = value;
-  }
-  void SetInt32Value(int32 value) {
-    SetType(FieldDescriptor::CPPTYPE_INT32);
-    val_.int32_value_ = value;
-  }
-  void SetUInt32Value(uint32 value) {
-    SetType(FieldDescriptor::CPPTYPE_UINT32);
-    val_.uint32_value_ = value;
-  }
-  void SetBoolValue(bool value) {
-    SetType(FieldDescriptor::CPPTYPE_BOOL);
-    val_.bool_value_ = value;
-  }
-  void SetStringValue(const string& val) {
-    SetType(FieldDescriptor::CPPTYPE_STRING);
-    *val_.string_value_ = val;
-  }
-
-  int64 GetInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
-               "MapKey::GetInt64Value");
-    return val_.int64_value_;
-  }
-  uint64 GetUInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
-               "MapKey::GetUInt64Value");
-    return val_.uint64_value_;
-  }
-  int32 GetInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
-               "MapKey::GetInt32Value");
-    return val_.int32_value_;
-  }
-  uint32 GetUInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
-               "MapKey::GetUInt32Value");
-    return val_.uint32_value_;
-  }
-  bool GetBoolValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
-               "MapKey::GetBoolValue");
-    return val_.bool_value_;
-  }
-  const string& GetStringValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
-               "MapKey::GetStringValue");
-    return *val_.string_value_;
-  }
-
-  bool operator<(const MapKey& other) const {
-    if (type_ != other.type_) {
-      // We could define a total order that handles this case, but
-      // there currently no need.  So, for now, fail.
-      GOOGLE_LOG(FATAL) << "Unsupported: type mismatch";
-    }
-    switch (type()) {
-      case FieldDescriptor::CPPTYPE_DOUBLE:
-      case FieldDescriptor::CPPTYPE_FLOAT:
-      case FieldDescriptor::CPPTYPE_ENUM:
-      case FieldDescriptor::CPPTYPE_MESSAGE:
-        GOOGLE_LOG(FATAL) << "Unsupported";
-        return false;
-      case FieldDescriptor::CPPTYPE_STRING:
-        return *val_.string_value_ < *other.val_.string_value_;
-      case FieldDescriptor::CPPTYPE_INT64:
-        return val_.int64_value_ < other.val_.int64_value_;
-      case FieldDescriptor::CPPTYPE_INT32:
-        return val_.int32_value_ < other.val_.int32_value_;
-      case FieldDescriptor::CPPTYPE_UINT64:
-        return val_.uint64_value_ < other.val_.uint64_value_;
-      case FieldDescriptor::CPPTYPE_UINT32:
-        return val_.uint32_value_ < other.val_.uint32_value_;
-      case FieldDescriptor::CPPTYPE_BOOL:
-        return val_.bool_value_ < other.val_.bool_value_;
-    }
-    return false;
-  }
-
-  bool operator==(const MapKey& other) const {
-    if (type_ != other.type_) {
-      // To be consistent with operator<, we don't allow this either.
-      GOOGLE_LOG(FATAL) << "Unsupported: type mismatch";
-    }
-    switch (type()) {
-      case FieldDescriptor::CPPTYPE_DOUBLE:
-      case FieldDescriptor::CPPTYPE_FLOAT:
-      case FieldDescriptor::CPPTYPE_ENUM:
-      case FieldDescriptor::CPPTYPE_MESSAGE:
-        GOOGLE_LOG(FATAL) << "Unsupported";
-        break;
-      case FieldDescriptor::CPPTYPE_STRING:
-        return *val_.string_value_ == *other.val_.string_value_;
-      case FieldDescriptor::CPPTYPE_INT64:
-        return val_.int64_value_ == other.val_.int64_value_;
-      case FieldDescriptor::CPPTYPE_INT32:
-        return val_.int32_value_ == other.val_.int32_value_;
-      case FieldDescriptor::CPPTYPE_UINT64:
-        return val_.uint64_value_ == other.val_.uint64_value_;
-      case FieldDescriptor::CPPTYPE_UINT32:
-        return val_.uint32_value_ == other.val_.uint32_value_;
-      case FieldDescriptor::CPPTYPE_BOOL:
-        return val_.bool_value_ == other.val_.bool_value_;
-    }
-    GOOGLE_LOG(FATAL) << "Can't get here.";
-    return false;
-  }
-
-  void CopyFrom(const MapKey& other) {
-    SetType(other.type());
-    switch (type_) {
-      case FieldDescriptor::CPPTYPE_DOUBLE:
-      case FieldDescriptor::CPPTYPE_FLOAT:
-      case FieldDescriptor::CPPTYPE_ENUM:
-      case FieldDescriptor::CPPTYPE_MESSAGE:
-        GOOGLE_LOG(FATAL) << "Unsupported";
-        break;
-      case FieldDescriptor::CPPTYPE_STRING:
-        *val_.string_value_ = *other.val_.string_value_;
-        break;
-      case FieldDescriptor::CPPTYPE_INT64:
-        val_.int64_value_ = other.val_.int64_value_;
-        break;
-      case FieldDescriptor::CPPTYPE_INT32:
-        val_.int32_value_ = other.val_.int32_value_;
-        break;
-      case FieldDescriptor::CPPTYPE_UINT64:
-        val_.uint64_value_ = other.val_.uint64_value_;
-        break;
-      case FieldDescriptor::CPPTYPE_UINT32:
-        val_.uint32_value_ = other.val_.uint32_value_;
-        break;
-      case FieldDescriptor::CPPTYPE_BOOL:
-        val_.bool_value_ = other.val_.bool_value_;
-        break;
-    }
-  }
-
- private:
-  template <typename K, typename V>
-  friend class internal::TypeDefinedMapFieldBase;
-  friend class MapIterator;
-  friend class internal::DynamicMapField;
-
-  union KeyValue {
-    KeyValue() {}
-    string* string_value_;
-    int64 int64_value_;
-    int32 int32_value_;
-    uint64 uint64_value_;
-    uint32 uint32_value_;
-    bool bool_value_;
-  } val_;
-
-  void SetType(FieldDescriptor::CppType type) {
-    if (type_ == type) return;
-    if (type_ == FieldDescriptor::CPPTYPE_STRING) {
-      delete val_.string_value_;
-    }
-    type_ = type;
-    if (type_ == FieldDescriptor::CPPTYPE_STRING) {
-      val_.string_value_ = new string;
-    }
-  }
-
-  // type_ is 0 or a valid FieldDescriptor::CppType.
-  int type_;
-};
-
-// MapValueRef points to a map value.
-class LIBPROTOBUF_EXPORT MapValueRef {
- public:
-  MapValueRef() : data_(NULL), type_(0) {}
-
-  void SetInt64Value(int64 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
-               "MapValueRef::SetInt64Value");
-    *reinterpret_cast<int64*>(data_) = value;
-  }
-  void SetUInt64Value(uint64 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
-               "MapValueRef::SetUInt64Value");
-    *reinterpret_cast<uint64*>(data_) = value;
-  }
-  void SetInt32Value(int32 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
-               "MapValueRef::SetInt32Value");
-    *reinterpret_cast<int32*>(data_) = value;
-  }
-  void SetUInt32Value(uint32 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
-               "MapValueRef::SetUInt32Value");
-    *reinterpret_cast<uint32*>(data_) = value;
-  }
-  void SetBoolValue(bool value) {
-    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");
-    *reinterpret_cast<int*>(data_) = value;
-  }
-  void SetStringValue(const string& value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
-               "MapValueRef::SetStringValue");
-    *reinterpret_cast<string*>(data_) = value;
-  }
-  void SetFloatValue(float value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT,
-               "MapValueRef::SetFloatValue");
-    *reinterpret_cast<float*>(data_) = value;
-  }
-  void SetDoubleValue(double value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE,
-               "MapValueRef::SetDoubleValue");
-    *reinterpret_cast<double*>(data_) = value;
-  }
-
-  int64 GetInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
-               "MapValueRef::GetInt64Value");
-    return *reinterpret_cast<int64*>(data_);
-  }
-  uint64 GetUInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
-               "MapValueRef::GetUInt64Value");
-    return *reinterpret_cast<uint64*>(data_);
-  }
-  int32 GetInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
-               "MapValueRef::GetInt32Value");
-    return *reinterpret_cast<int32*>(data_);
-  }
-  uint32 GetUInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
-               "MapValueRef::GetUInt32Value");
-    return *reinterpret_cast<uint32*>(data_);
-  }
-  bool GetBoolValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
-               "MapValueRef::GetBoolValue");
-    return *reinterpret_cast<bool*>(data_);
-  }
-  int GetEnumValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM,
-               "MapValueRef::GetEnumValue");
-    return *reinterpret_cast<int*>(data_);
-  }
-  const string& GetStringValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
-               "MapValueRef::GetStringValue");
-    return *reinterpret_cast<string*>(data_);
-  }
-  float GetFloatValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT,
-               "MapValueRef::GetFloatValue");
-    return *reinterpret_cast<float*>(data_);
-  }
-  double GetDoubleValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE,
-               "MapValueRef::GetDoubleValue");
-    return *reinterpret_cast<double*>(data_);
-  }
-
-  const Message& GetMessageValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_MESSAGE,
-               "MapValueRef::GetMessageValue");
-    return *reinterpret_cast<Message*>(data_);
-  }
-
-  Message* MutableMessageValue() {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_MESSAGE,
-               "MapValueRef::MutableMessageValue");
-    return reinterpret_cast<Message*>(data_);
-  }
-
- private:
-  template <typename Derived, typename K, typename V,
-            internal::WireFormatLite::FieldType key_wire_type,
-            internal::WireFormatLite::FieldType value_wire_type,
-            int default_enum_value>
-  friend class internal::MapField;
-  template <typename K, typename V>
-  friend class internal::TypeDefinedMapFieldBase;
-  friend class MapIterator;
-  friend class internal::GeneratedMessageReflection;
-  friend class internal::DynamicMapField;
-
-  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.";
-    }
-    return (FieldDescriptor::CppType)type_;
-  }
-  void SetValue(const void* val) {
-    data_ = const_cast<void*>(val);
-  }
-  void CopyFrom(const MapValueRef& other) {
-    type_ = other.type_;
-    data_ = other.data_;
-  }
-  // Only used in DynamicMapField
-  void DeleteData() {
-    switch (type_) {
-#define HANDLE_TYPE(CPPTYPE, TYPE)                              \
-      case google::protobuf::FieldDescriptor::CPPTYPE_##CPPTYPE: {        \
-        delete reinterpret_cast<TYPE*>(data_);                  \
-        break;                                                  \
-      }
-      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(STRING, string);
-      HANDLE_TYPE(ENUM, int32);
-      HANDLE_TYPE(MESSAGE, Message);
-#undef HANDLE_TYPE
-    }
-  }
-  // data_ point to a map value. MapValueRef does not
-  // own this value.
-  void* data_;
-  // type_ is 0 or a valid FieldDescriptor::CppType.
-  int type_;
-  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapValueRef);
-};
-
-#undef TYPE_CHECK
-
 class LIBPROTOBUF_EXPORT MapIterator {
  public:
   MapIterator(Message* message, const FieldDescriptor* field) {
@@ -741,11 +341,6 @@
   ~MapIterator() {
     map_->DeleteIterator(this);
   }
-  MapIterator& operator=(const MapIterator& other) {
-    map_ = other.map_;
-    map_->CopyIterator(this, other);
-    return *this;
-  }
   friend bool operator==(const MapIterator& a, const MapIterator& b) {
     return a.map_->EqualIterator(a, b);
   }
@@ -778,7 +373,7 @@
   template <typename Key, typename T>
   friend class internal::TypeDefinedMapFieldBase;
   friend class internal::DynamicMapField;
-  template <typename Derived, typename Key, typename T,
+  template <typename Key, typename T,
             internal::WireFormatLite::FieldType kKeyFieldType,
             internal::WireFormatLite::FieldType kValueFieldType,
             int default_enum_value>
@@ -797,42 +392,6 @@
 };
 
 }  // namespace protobuf
+
 }  // namespace google
-
-GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START
-template<>
-struct hash<google::protobuf::MapKey> {
-  size_t
-  operator()(const google::protobuf::MapKey& map_key) const {
-    switch (map_key.type()) {
-      case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
-      case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
-      case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
-      case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
-        GOOGLE_LOG(FATAL) << "Unsupported";
-        break;
-      case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
-        return hash<string>()(map_key.GetStringValue());
-      case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
-        return hash< ::google::protobuf::int64>()(map_key.GetInt64Value());
-      case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
-        return hash< ::google::protobuf::int32>()(map_key.GetInt32Value());
-      case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
-        return hash< ::google::protobuf::uint64>()(map_key.GetUInt64Value());
-      case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
-        return hash< ::google::protobuf::uint32>()(map_key.GetUInt32Value());
-      case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
-        return hash<bool>()(map_key.GetBoolValue());
-    }
-    GOOGLE_LOG(FATAL) << "Can't get here.";
-    return 0;
-  }
-  bool
-  operator()(const google::protobuf::MapKey& map_key1,
-             const google::protobuf::MapKey& map_key2) const {
-    return map_key1 < map_key2;
-  }
-};
-GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END
-
 #endif  // GOOGLE_PROTOBUF_MAP_FIELD_H__
diff --git a/src/google/protobuf/map_field_inl.h b/src/google/protobuf/map_field_inl.h
index e317b5e..01c9b89 100644
--- a/src/google/protobuf/map_field_inl.h
+++ b/src/google/protobuf/map_field_inl.h
@@ -162,32 +162,81 @@
 
 // ----------------------------------------------------------------------
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-int MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-             default_enum_value>::size() const {
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField()
+    : default_entry_(NULL) {}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField(
+    Arena* arena)
+    : TypeDefinedMapFieldBase<Key, T>(arena),
+      MapFieldLite<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>(
+          arena),
+      default_entry_(NULL) {}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField(
+    const Message* default_entry)
+    : default_entry_(down_cast<const EntryType*>(default_entry)) {}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+MapField<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>::MapField(
+    Arena* arena, const Message* default_entry)
+    : TypeDefinedMapFieldBase<Key, T>(arena),
+      MapFieldLite<Key, T, kKeyFieldType, kValueFieldType, default_enum_value>(
+          arena),
+      default_entry_(down_cast<const EntryType*>(default_entry)) {}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::~MapField() {}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+int
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::size() const {
   MapFieldBase::SyncMapWithRepeatedField();
-  return static_cast<int>(impl_.GetMap().size());
+  return MapFieldLiteType::GetInternalMap().size();
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::Clear() {
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::Clear() {
   MapFieldBase::SyncMapWithRepeatedField();
-  impl_.MutableMap()->clear();
+  MapFieldLiteType::MutableInternalMap()->clear();
   MapFieldBase::SetMapDirty();
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::SetMapIteratorValue(MapIterator* map_iter)
-    const {
-  const Map<Key, T>& map = impl_.GetMap();
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void MapField<Key, T, kKeyFieldType, kValueFieldType,
+              default_enum_value>::SetMapIteratorValue(
+                  MapIterator* map_iter) const {
+  const Map<Key, T>& map = GetMap();
   typename Map<Key, T>::const_iterator iter =
       TypeDefinedMapFieldBase<Key, T>::InternalGetIterator(map_iter);
   if (iter == map.end()) return;
@@ -195,23 +244,27 @@
   map_iter->value_.SetValue(&iter->second);
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-bool MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::ContainsMapKey(const MapKey& map_key) const {
-  const Map<Key, T>& map = impl_.GetMap();
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+bool MapField<Key, T, kKeyFieldType, kValueFieldType,
+              default_enum_value>::ContainsMapKey(
+                  const MapKey& map_key) const {
+  const Map<Key, T>& map = GetMap();
   const Key& key = UnwrapMapKey<Key>(map_key);
   typename Map<Key, T>::const_iterator iter = map.find(key);
   return iter != map.end();
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-bool MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::InsertOrLookupMapValue(const MapKey& map_key,
-                                                          MapValueRef* val) {
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+bool MapField<Key, T, kKeyFieldType, kValueFieldType,
+              default_enum_value>::InsertOrLookupMapValue(
+                  const MapKey& map_key,
+                  MapValueRef* val) {
   // Always use mutable map because users may change the map value by
   // MapValueRef.
   Map<Key, T>* map = MutableMap();
@@ -227,83 +280,158 @@
   return false;
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-bool MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::DeleteMapValue(const MapKey& map_key) {
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+bool MapField<Key, T, kKeyFieldType, kValueFieldType,
+              default_enum_value>::DeleteMapValue(
+                  const MapKey& map_key) {
   const Key& key = UnwrapMapKey<Key>(map_key);
   return MutableMap()->erase(key);
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::MergeFrom(const MapField& other) {
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+const Map<Key, T>&
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::GetMap() const {
   MapFieldBase::SyncMapWithRepeatedField();
-  other.SyncMapWithRepeatedField();
-  impl_.MergeFrom(other.impl_);
+  return MapFieldLiteType::GetInternalMap();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+Map<Key, T>*
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::MutableMap() {
+  MapFieldBase::SyncMapWithRepeatedField();
+  Map<Key, T>* result = MapFieldLiteType::MutableInternalMap();
+  MapFieldBase::SetMapDirty();
+  return result;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::MergeFrom(
+    const MapFieldLiteType& other) {
+  const MapField& down_other = down_cast<const MapField&>(other);
+  MapFieldBase::SyncMapWithRepeatedField();
+  down_other.SyncMapWithRepeatedField();
+  MapFieldLiteType::MergeFrom(other);
   MapFieldBase::SetMapDirty();
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::Swap(MapField* other) {
-  std::swap(this->MapFieldBase::repeated_field_, other->repeated_field_);
-  impl_.Swap(&other->impl_);
-  std::swap(this->MapFieldBase::state_, other->state_);
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::Swap(
+    MapFieldLiteType* other) {
+  MapField* down_other = down_cast<MapField*>(other);
+  std::swap(MapFieldBase::repeated_field_, down_other->repeated_field_);
+  MapFieldLiteType::Swap(other);
+  std::swap(MapFieldBase::state_, down_other->state_);
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::SyncRepeatedFieldWithMapNoLock() const {
-  if (this->MapFieldBase::repeated_field_ == NULL) {
-    if (this->MapFieldBase::arena_ == NULL) {
-      this->MapFieldBase::repeated_field_ = new RepeatedPtrField<Message>();
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::SetEntryDescriptor(
+    const Descriptor** descriptor) {
+  MapFieldBase::entry_descriptor_ = descriptor;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::SetAssignDescriptorCallback(void (*callback)()) {
+  MapFieldBase::assign_descriptor_callback_ = callback;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+const Map<Key, T>&
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::GetInternalMap() const {
+  return MapFieldLiteType::GetInternalMap();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+Map<Key, T>*
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::MutableInternalMap() {
+  return MapFieldLiteType::MutableInternalMap();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::SyncRepeatedFieldWithMapNoLock() const {
+  if (MapFieldBase::repeated_field_ == NULL) {
+    if (MapFieldBase::arena_ == NULL) {
+      MapFieldBase::repeated_field_ = new RepeatedPtrField<Message>();
     } else {
-      this->MapFieldBase::repeated_field_ =
+      MapFieldBase::repeated_field_ =
           Arena::CreateMessage<RepeatedPtrField<Message> >(
-              this->MapFieldBase::arena_);
+              MapFieldBase::arena_);
     }
   }
-  const Map<Key, T>& map = impl_.GetMap();
+  const Map<Key, T>& map = GetInternalMap();
   RepeatedPtrField<EntryType>* repeated_field =
       reinterpret_cast<RepeatedPtrField<EntryType>*>(
-          this->MapFieldBase::repeated_field_);
+          MapFieldBase::repeated_field_);
 
   repeated_field->Clear();
 
-  // The only way we can get at this point is through reflection and the
-  // only way we can get the reflection object is by having called GetReflection
-  // on the encompassing field. So that type must have existed and hence we
-  // 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) {
+    InitDefaultEntryOnce();
+    GOOGLE_CHECK(default_entry_ != NULL);
     EntryType* new_entry =
-        down_cast<EntryType*>(default_entry->New(this->MapFieldBase::arena_));
+        down_cast<EntryType*>(default_entry_->New(MapFieldBase::arena_));
     repeated_field->AddAllocated(new_entry);
     (*new_entry->mutable_key()) = it->first;
     (*new_entry->mutable_value()) = it->second;
   }
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-              default_enum_value>::SyncMapWithRepeatedFieldNoLock() const {
-  Map<Key, T>* map = const_cast<MapField*>(this)->impl_.MutableMap();
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::SyncMapWithRepeatedFieldNoLock() const {
+  Map<Key, T>* map = const_cast<MapField*>(this)->MutableInternalMap();
   RepeatedPtrField<EntryType>* repeated_field =
       reinterpret_cast<RepeatedPtrField<EntryType>*>(
-          this->MapFieldBase::repeated_field_);
-  GOOGLE_CHECK(this->MapFieldBase::repeated_field_ != NULL);
+          MapFieldBase::repeated_field_);
+  GOOGLE_CHECK(MapFieldBase::repeated_field_ != NULL);
   map->clear();
   for (typename RepeatedPtrField<EntryType>::iterator it =
            repeated_field->begin(); it != repeated_field->end(); ++it) {
@@ -316,24 +444,44 @@
   }
 }
 
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-size_t MapField<Derived, Key, T, kKeyFieldType, kValueFieldType,
-                default_enum_value>::SpaceUsedExcludingSelfNoLock() const {
-  size_t size = 0;
-  if (this->MapFieldBase::repeated_field_ != NULL) {
-    size += this->MapFieldBase::repeated_field_->SpaceUsedExcludingSelfLong();
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+int
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::SpaceUsedExcludingSelfNoLock() const {
+  int size = 0;
+  if (MapFieldBase::repeated_field_ != NULL) {
+    size += MapFieldBase::repeated_field_->SpaceUsedExcludingSelf();
   }
-  Map<Key, T>* map = const_cast<MapField*>(this)->impl_.MutableMap();
+  Map<Key, T>* map = const_cast<MapField*>(this)->MutableInternalMap();
   size += sizeof(*map);
-  for (typename Map<Key, T>::iterator it = map->begin(); it != map->end();
-       ++it) {
-    size += KeyTypeHandler::SpaceUsedInMapLong(it->first);
-    size += ValueTypeHandler::SpaceUsedInMapLong(it->second);
+  for (typename Map<Key, T>::iterator it = map->begin();
+       it != map->end(); ++it) {
+    size += KeyTypeHandler::SpaceUsedInMap(it->first);
+    size += ValueTypeHandler::SpaceUsedInMap(it->second);
   }
   return size;
 }
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType kKeyFieldType,
+          WireFormatLite::FieldType kValueFieldType,
+          int default_enum_value>
+void
+MapField<Key, T, kKeyFieldType, kValueFieldType,
+         default_enum_value>::InitDefaultEntryOnce()
+    const {
+  if (default_entry_ == NULL) {
+    MapFieldBase::InitMetadataOnce();
+    GOOGLE_CHECK(*MapFieldBase::entry_descriptor_ != NULL);
+    default_entry_ = down_cast<const EntryType*>(
+        MessageFactory::generated_factory()->GetPrototype(
+            *MapFieldBase::entry_descriptor_));
+  }
+}
+
 }  // namespace internal
 }  // namespace protobuf
 
diff --git a/src/google/protobuf/map_field_lite.h b/src/google/protobuf/map_field_lite.h
index f648b43..860dae5 100644
--- a/src/google/protobuf/map_field_lite.h
+++ b/src/google/protobuf/map_field_lite.h
@@ -33,81 +33,231 @@
 
 #include <google/protobuf/map.h>
 #include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/wire_format_lite.h>
 
 namespace google {
 namespace protobuf {
 namespace internal {
 
-// This class provides access to map field using generated api. It is used for
+// This class provides accesss to map field using generated api. It is used for
 // internal generated message implentation only. Users should never use this
 // directly.
-template <typename Derived, typename Key, typename T,
+template <typename Key, typename T,
           WireFormatLite::FieldType key_wire_type,
-          WireFormatLite::FieldType value_wire_type, int default_enum_value = 0>
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value = 0>
 class MapFieldLite {
   // Define message type for internal repeated field.
-  typedef Derived EntryType;
+  typedef MapEntryLite<Key, T, key_wire_type, value_wire_type,
+                       default_enum_value> EntryType;
 
  public:
-  typedef Map<Key, T> MapType;
-  typedef EntryType EntryTypeTrait;
-
-  MapFieldLite() : arena_(NULL) { SetDefaultEnumValue(); }
-
-  explicit MapFieldLite(Arena* arena) : arena_(arena), map_(arena) {
-    SetDefaultEnumValue();
-  }
+  MapFieldLite();
+  explicit MapFieldLite(Arena* arena);
+  virtual ~MapFieldLite();
 
   // Accessors
-  const Map<Key, T>& GetMap() const { return map_; }
-  Map<Key, T>* MutableMap() { return &map_; }
+  virtual const Map<Key, T>& GetMap() const;
+  virtual Map<Key, T>* MutableMap();
 
   // Convenient methods for generated message implementation.
-  int size() const { return static_cast<int>(map_.size()); }
-  void Clear() { return map_.clear(); }
-  void MergeFrom(const MapFieldLite& other) {
-    for (typename Map<Key, T>::const_iterator it = other.map_.begin();
-         it != other.map_.end(); ++it) {
-      map_[it->first] = it->second;
-    }
-  }
-  void Swap(MapFieldLite* other) { map_.swap(other->map_); }
+  virtual int size() const;
+  virtual void Clear();
+  virtual void MergeFrom(const MapFieldLite& other);
+  virtual void Swap(MapFieldLite* other);
 
   // Set default enum value only for proto2 map field whose value is enum type.
-  void SetDefaultEnumValue() {
-    MutableMap()->SetDefaultEnumValue(default_enum_value);
-  }
+  void SetDefaultEnumValue();
 
-  // Used in the implementation of parsing. Caller should take the ownership iff
-  // arena_ is NULL.
-  EntryType* NewEntry() const {
-    if (arena_ == NULL) {
-      return new EntryType();
-    } else {
-      return Arena::CreateMessage<EntryType>(arena_);
-    }
-  }
+  // Used in the implementation of parsing. Caller should take the ownership.
+  EntryType* NewEntry() const;
   // Used in the implementation of serializing enum value type. Caller should
-  // take the ownership iff arena_ is NULL.
-  EntryType* NewEnumEntryWrapper(const Key& key, const T t) const {
-    return EntryType::EnumWrap(key, t, arena_);
-  }
+  // take the ownership.
+  EntryType* NewEnumEntryWrapper(const Key& key, const T t) const;
   // Used in the implementation of serializing other value types. Caller should
-  // take the ownership iff arena_ is NULL.
-  EntryType* NewEntryWrapper(const Key& key, const T& t) const {
-    return EntryType::Wrap(key, t, arena_);
-  }
+  // take the ownership.
+  EntryType* NewEntryWrapper(const Key& key, const T& t) const;
+
+ protected:
+  // Convenient methods to get internal google::protobuf::Map
+  virtual const Map<Key, T>& GetInternalMap() const;
+  virtual Map<Key, T>* MutableInternalMap();
 
  private:
   typedef void DestructorSkippable_;
 
   Arena* arena_;
-  Map<Key, T> map_;
+  Map<Key, T>* map_;
 
   friend class ::google::protobuf::Arena;
 };
 
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::MapFieldLite()
+    : arena_(NULL) {
+  map_ = new Map<Key, T>;
+  SetDefaultEnumValue();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::MapFieldLite(Arena* arena)
+  : arena_(arena) {
+  map_ = Arena::CreateMessage<Map<Key, T> >(arena);
+  SetDefaultEnumValue();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::~MapFieldLite() {
+  delete map_;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+const Map<Key, T>&
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::GetMap() const {
+  return *map_;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+Map<Key, T>*
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::MutableMap() {
+  return map_;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+int
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::size() const {
+  return map_->size();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+void
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::Clear() {
+  map_->clear();
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+void
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::MergeFrom(
+    const MapFieldLite& other) {
+  for (typename Map<Key, T>::const_iterator it = other.map_->begin();
+       it != other.map_->end(); ++it) {
+    (*map_)[it->first] = it->second;
+  }
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+void
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::Swap(
+    MapFieldLite* other) {
+  std::swap(map_, other->map_);
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+void
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::SetDefaultEnumValue() {
+  MutableInternalMap()->SetDefaultEnumValue(default_enum_value);
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+const Map<Key, T>&
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::GetInternalMap() const {
+  return *map_;
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+Map<Key, T>*
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::MutableInternalMap() {
+  return map_;
+}
+
+#define EntryType \
+  MapEntryLite<Key, T, key_wire_type, value_wire_type, default_enum_value>
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+EntryType*
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::NewEntry() const {
+  if (arena_ == NULL) {
+    return new EntryType();
+  } else {
+    return Arena::CreateMessage<EntryType>(arena_);
+  }
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+EntryType*
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::NewEnumEntryWrapper(const Key& key,
+                                                      const T t) const {
+  return EntryType::EnumWrap(key, t, arena_);
+}
+
+template <typename Key, typename T,
+          WireFormatLite::FieldType key_wire_type,
+          WireFormatLite::FieldType value_wire_type,
+          int default_enum_value>
+EntryType*
+MapFieldLite<Key, T, key_wire_type, value_wire_type,
+             default_enum_value>::NewEntryWrapper(const Key& key,
+                                                  const T& t) const {
+  return EntryType::Wrap(key, t, arena_);
+}
+
+#undef EntryType
+
 // True if IsInitialized() is true for value field in all elements of t. T is
 // expected to be message.  It's useful to have this helper here to keep the
 // protobuf compiler from ever having to emit loops in IsInitialized() methods.
@@ -121,21 +271,6 @@
   return true;
 }
 
-template <typename MEntry>
-struct MapEntryToMapField : MapEntryToMapField<typename MEntry::SuperType> {};
-
-template <typename T, typename Key, typename Value,
-          WireFormatLite::FieldType kKeyFieldType,
-          WireFormatLite::FieldType kValueFieldType, int default_enum_value>
-struct MapEntryToMapField<MapEntryLite<T, Key, Value, kKeyFieldType,
-                                       kValueFieldType, default_enum_value> > {
-  typedef MapFieldLite<MapEntryLite<T, Key, Value, kKeyFieldType,
-                                    kValueFieldType, default_enum_value>,
-                       Key, Value, kKeyFieldType, kValueFieldType,
-                       default_enum_value>
-      MapFieldType;
-};
-
 }  // namespace internal
 }  // namespace protobuf
 
diff --git a/src/google/protobuf/map_field_test.cc b/src/google/protobuf/map_field_test.cc
index 4e0e751..223d42f 100644
--- a/src/google/protobuf/map_field_test.cc
+++ b/src/google/protobuf/map_field_test.cc
@@ -47,8 +47,8 @@
 #include <google/protobuf/repeated_field.h>
 #include <google/protobuf/wire_format_lite_inl.h>
 #include <gtest/gtest.h>
-namespace google {
 
+namespace google {
 namespace protobuf {
 
 namespace internal {
@@ -101,10 +101,8 @@
 
 class MapFieldBasePrimitiveTest : public ::testing::Test {
  protected:
-  typedef unittest::TestMap_MapInt32Int32Entry_DoNotUse EntryType;
-  typedef MapField<EntryType, int32, int32, WireFormatLite::TYPE_INT32,
-                   WireFormatLite::TYPE_INT32, false>
-      MapFieldType;
+  typedef MapField<int32, int32, WireFormatLite::TYPE_INT32,
+                   WireFormatLite::TYPE_INT32, false> MapFieldType;
 
   MapFieldBasePrimitiveTest() {
     // Get descriptors
@@ -115,7 +113,9 @@
     value_descriptor_ = map_descriptor_->FindFieldByName("value");
 
     // Build map field
-    map_field_.reset(new MapFieldType);
+    default_entry_ =
+        MessageFactory::generated_factory()->GetPrototype(map_descriptor_);
+    map_field_.reset(new MapFieldType(default_entry_));
     map_field_base_ = map_field_.get();
     map_ = map_field_->MutableMap();
     initial_value_map_[0] = 100;
@@ -130,6 +130,7 @@
   const Descriptor* map_descriptor_;
   const FieldDescriptor* key_descriptor_;
   const FieldDescriptor* value_descriptor_;
+  const Message* default_entry_;
   std::map<int32, int32> initial_value_map_;  // copy of initial values inserted
 };
 
@@ -176,7 +177,8 @@
     // repeated fields are allocated from arenas.
     // NoHeapChecker no_heap;
 
-    MapFieldType* map_field = Arena::CreateMessage<MapFieldType>(&arena);
+    MapFieldType* map_field =
+        Arena::CreateMessage<MapFieldType>(&arena, default_entry_);
 
     // Set content in map
     (*map_field->MutableMap())[100] = 101;
@@ -206,13 +208,19 @@
     : public testing::TestWithParam<State> {
  public:
  protected:
-  typedef unittest::TestMap_MapInt32Int32Entry_DoNotUse EntryType;
-  typedef MapField<EntryType, int32, int32, WireFormatLite::TYPE_INT32,
-                   WireFormatLite::TYPE_INT32, false>
-      MapFieldType;
+  typedef MapField<int32, int32, WireFormatLite::TYPE_INT32,
+                   WireFormatLite::TYPE_INT32, false> MapFieldType;
+  typedef MapFieldLite<int32, int32, WireFormatLite::TYPE_INT32,
+                       WireFormatLite::TYPE_INT32, false> MapFieldLiteType;
   MapFieldStateTest() : state_(GetParam()) {
     // Build map field
-    map_field_.reset(new MapFieldType());
+    const Descriptor* map_descriptor =
+        unittest::TestMap::descriptor()
+            ->FindFieldByName("map_int32_int32")
+            ->message_type();
+    default_entry_ =
+        MessageFactory::generated_factory()->GetPrototype(map_descriptor);
+    map_field_.reset(new MapFieldType(default_entry_));
     map_field_base_ = map_field_.get();
 
     Expect(map_field_.get(), MAP_DIRTY, 0, 0, true);
@@ -249,8 +257,8 @@
     MakeMapDirty(map_field);
     MapFieldBase* map_field_base = map_field;
     map_field_base->MutableRepeatedField();
-    // We use MutableMap on impl_ because we don't want to disturb the syncing
-    Map<int32, int32>* map = map_field->impl_.MutableMap();
+    Map<int32, int32>* map = implicit_cast<MapFieldLiteType*>(map_field)
+                                 ->MapFieldLiteType::MutableMap();
     map->clear();
 
     Expect(map_field, REPEATED_DIRTY, 0, 1, false);
@@ -262,8 +270,8 @@
     MapFieldBaseStub* stub =
         reinterpret_cast<MapFieldBaseStub*>(map_field_base);
 
-    // We use MutableMap on impl_ because we don't want to disturb the syncing
-    Map<int32, int32>* map = map_field->impl_.MutableMap();
+    Map<int32, int32>* map = implicit_cast<MapFieldLiteType*>(map_field)
+                                 ->MapFieldLiteType::MutableMap();
     RepeatedPtrField<Message>* repeated_field = stub->InternalRepeatedField();
 
     switch (state) {
@@ -294,6 +302,7 @@
   google::protobuf::scoped_ptr<MapFieldType> map_field_;
   MapFieldBase* map_field_base_;
   State state_;
+  const Message* default_entry_;
 };
 
 INSTANTIATE_TEST_CASE_P(MapFieldStateTestInstance, MapFieldStateTest,
@@ -318,7 +327,7 @@
 }
 
 TEST_P(MapFieldStateTest, MergeFromClean) {
-  MapFieldType other;
+  MapFieldType other(default_entry_);
   AddOneStillClean(&other);
 
   map_field_->MergeFrom(other);
@@ -333,7 +342,7 @@
 }
 
 TEST_P(MapFieldStateTest, MergeFromMapDirty) {
-  MapFieldType other;
+  MapFieldType other(default_entry_);
   MakeMapDirty(&other);
 
   map_field_->MergeFrom(other);
@@ -348,7 +357,7 @@
 }
 
 TEST_P(MapFieldStateTest, MergeFromRepeatedDirty) {
-  MapFieldType other;
+  MapFieldType other(default_entry_);
   MakeRepeatedDirty(&other);
 
   map_field_->MergeFrom(other);
@@ -363,7 +372,7 @@
 }
 
 TEST_P(MapFieldStateTest, SwapClean) {
-  MapFieldType other;
+  MapFieldType other(default_entry_);
   AddOneStillClean(&other);
 
   map_field_->Swap(&other);
@@ -386,7 +395,7 @@
 }
 
 TEST_P(MapFieldStateTest, SwapMapDirty) {
-  MapFieldType other;
+  MapFieldType other(default_entry_);
   MakeMapDirty(&other);
 
   map_field_->Swap(&other);
@@ -409,7 +418,7 @@
 }
 
 TEST_P(MapFieldStateTest, SwapRepeatedDirty) {
-  MapFieldType other;
+  MapFieldType other(default_entry_);
   MakeRepeatedDirty(&other);
 
   map_field_->Swap(&other);
diff --git a/src/google/protobuf/map_lite_unittest.proto b/src/google/protobuf/map_lite_unittest.proto
index 0135fff..0592dd7 100644
--- a/src/google/protobuf/map_lite_unittest.proto
+++ b/src/google/protobuf/map_lite_unittest.proto
@@ -81,7 +81,7 @@
       map_int32_foreign_message_no_arena = 18;
 }
 
-// Test embedded message with required fields
+// Test embeded message with required fields
 message TestRequiredMessageMapLite {
   map<int32, TestRequiredLite> map_field = 1;
 }
diff --git a/src/google/protobuf/map_proto2_unittest.proto b/src/google/protobuf/map_proto2_unittest.proto
index 20d58f9..916cc54 100644
--- a/src/google/protobuf/map_proto2_unittest.proto
+++ b/src/google/protobuf/map_proto2_unittest.proto
@@ -29,7 +29,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 syntax = "proto2";
-option cc_enable_arenas = true;
+
 
 import "google/protobuf/unittest_import.proto";
 
@@ -64,28 +64,3 @@
 message TestImportEnumMap {
   map<int32, protobuf_unittest_import.ImportEnumForMap> import_enum_amp = 1;
 }
-
-message TestIntIntMap {
-  map<int32, int32> m = 1;
-}
-
-// Test all key types: string, plus the non-floating-point scalars.
-message TestMaps {
-  map<int32, TestIntIntMap> m_int32 = 1;
-  map<int64, TestIntIntMap> m_int64 = 2;
-  map<uint32, TestIntIntMap> m_uint32 = 3;
-  map<uint64, TestIntIntMap> m_uint64 = 4;
-  map<sint32, TestIntIntMap> m_sint32 = 5;
-  map<sint64, TestIntIntMap> m_sint64 = 6;
-  map<fixed32, TestIntIntMap> m_fixed32 = 7;
-  map<fixed64, TestIntIntMap> m_fixed64 = 8;
-  map<sfixed32, TestIntIntMap> m_sfixed32 = 9;
-  map<sfixed64, TestIntIntMap> m_sfixed64 = 10;
-  map<bool, TestIntIntMap> m_bool = 11;
-  map<string, TestIntIntMap> m_string = 12;
-}
-
-// Test maps in submessages.
-message TestSubmessageMaps {
-  optional TestMaps m = 1;
-}
diff --git a/src/google/protobuf/map_test.cc b/src/google/protobuf/map_test.cc
index 080c71a..9d4d6c1 100644
--- a/src/google/protobuf/map_test.cc
+++ b/src/google/protobuf/map_test.cc
@@ -50,17 +50,15 @@
 #include <google/protobuf/stubs/casts.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/scoped_ptr.h>
 #include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/arena_test_util.h>
 #include <google/protobuf/map_proto2_unittest.pb.h>
-#include <google/protobuf/map_test_util.h>
 #include <google/protobuf/map_unittest.pb.h>
+#include <google/protobuf/map_test_util.h>
 #include <google/protobuf/test_util.h>
 #include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor_database.h>
@@ -73,10 +71,12 @@
 #include <google/protobuf/text_format.h>
 #include <google/protobuf/wire_format.h>
 #include <google/protobuf/wire_format_lite_inl.h>
-#include <google/protobuf/util/message_differencer.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/tokenizer.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/util/time_util.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/substitute.h>
-#include <gmock/gmock.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
@@ -90,21 +90,19 @@
 namespace protobuf {
 namespace internal {
 
-void MapTestForceDeterministic() {
-  ::google::protobuf::io::CodedOutputStream::SetDefaultSerializationDeterministic();
-}
-
 // Map API Test =====================================================
 
-class MapImplTest : public ::testing::Test {
+// Parameterized tests on whether to use old style maps.
+class MapImplTest : public testing::TestWithParam<bool> {
  protected:
   MapImplTest()
-      : map_ptr_(new Map<int32, int32>()),
+      : map_ptr_(new Map<int32, int32>(GetParam())),
         map_(*map_ptr_),
         const_map_(*map_ptr_) {
     EXPECT_TRUE(map_.empty());
     EXPECT_EQ(0, map_.size());
   }
+  ~MapImplTest() {}
 
   void ExpectSingleElement(int32 key, int32 value) {
     EXPECT_FALSE(map_.empty());
@@ -130,7 +128,7 @@
     EXPECT_EQ(value, map_.at(key));
     Map<int32, int32>::iterator it = map_.find(key);
 
-    // iterator dereferenceable
+    // interator dereferenceable
     EXPECT_EQ(key,   (*it).first);
     EXPECT_EQ(value, (*it).second);
     EXPECT_EQ(key,   it->first);
@@ -158,7 +156,7 @@
     EXPECT_EQ(value, const_map_.at(key));
     Map<int32, int32>::const_iterator const_it = const_map_.find(key);
 
-    // iterator dereferenceable
+    // interator dereferenceable
     EXPECT_EQ(key, (*const_it).first);
     EXPECT_EQ(value, (*const_it).second);
     EXPECT_EQ(key, const_it->first);
@@ -175,7 +173,7 @@
   const Map<int32, int32>& const_map_;
 };
 
-TEST_F(MapImplTest, OperatorBracket) {
+TEST_P(MapImplTest, OperatorBracket) {
   int32 key = 0;
   int32 value1 = 100;
   int32 value2 = 101;
@@ -189,7 +187,7 @@
   ExpectSingleElement(key, value2);
 }
 
-TEST_F(MapImplTest, OperatorBracketNonExist) {
+TEST_P(MapImplTest, OperatorBracketNonExist) {
   int32 key = 0;
   int32 default_value = 0;
 
@@ -197,7 +195,7 @@
   ExpectSingleElement(key, default_value);
 }
 
-TEST_F(MapImplTest, MutableAt) {
+TEST_P(MapImplTest, MutableAt) {
   int32 key = 0;
   int32 value1 = 100;
   int32 value2 = 101;
@@ -211,15 +209,15 @@
 
 #ifdef PROTOBUF_HAS_DEATH_TEST
 
-TEST_F(MapImplTest, MutableAtNonExistDeathTest) {
+TEST_P(MapImplTest, MutableAtNonExistDeathTest) {
   EXPECT_DEATH(map_.at(0), "");
 }
 
-TEST_F(MapImplTest, ImmutableAtNonExistDeathTest) {
+TEST_P(MapImplTest, ImmutableAtNonExistDeathTest) {
   EXPECT_DEATH(const_map_.at(0), "");
 }
 
-TEST_F(MapImplTest, UsageErrors) {
+TEST_P(MapImplTest, UsageErrors) {
   MapKey key;
   key.SetInt64Value(1);
   EXPECT_DEATH(key.GetUInt64Value(),
@@ -236,30 +234,23 @@
 
 #endif  // PROTOBUF_HAS_DEATH_TEST
 
-TEST_F(MapImplTest, MapKeyAssignment) {
-  MapKey from, to;
-  from.SetStringValue("abc");
-  to = from;
-  EXPECT_EQ("abc", to.GetStringValue());
-}
-
-TEST_F(MapImplTest, CountNonExist) {
+TEST_P(MapImplTest, CountNonExist) {
   EXPECT_EQ(0, map_.count(0));
 }
 
-TEST_F(MapImplTest, MutableFindNonExist) {
+TEST_P(MapImplTest, MutableFindNonExist) {
   EXPECT_TRUE(map_.end() == map_.find(0));
 }
 
-TEST_F(MapImplTest, ImmutableFindNonExist) {
+TEST_P(MapImplTest, ImmutableFindNonExist) {
   EXPECT_TRUE(const_map_.end() == const_map_.find(0));
 }
 
-TEST_F(MapImplTest, ConstEnd) {
+TEST_P(MapImplTest, ConstEnd) {
   EXPECT_TRUE(const_map_.end() == const_map_.cend());
 }
 
-TEST_F(MapImplTest, GetReferenceFromIterator) {
+TEST_P(MapImplTest, GetReferenceFromIterator) {
   for (int i = 0; i < 10; i++) {
     map_[i] = i;
   }
@@ -282,7 +273,7 @@
   }
 }
 
-TEST_F(MapImplTest, IteratorBasic) {
+TEST_P(MapImplTest, IteratorBasic) {
   map_[0] = 0;
 
   // Default constructible (per forward iterator requirements).
@@ -306,7 +297,7 @@
 
 template <typename Iterator>
 static int64 median(Iterator i0, Iterator i1) {
-  std::vector<int64> v(i0, i1);
+  vector<int64> v(i0, i1);
   std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end());
   return v[v.size() / 2];
 }
@@ -324,9 +315,10 @@
 // A naive begin() implementation will cause begin() to get slower and slower
 // if one erases elements at the "front" of the hash map, and we'd like to
 // avoid that, as std::unordered_map does.
-TEST_F(MapImplTest, BeginIsFast) {
-  if (true) return;  // TODO(gpike): make this less flaky and re-enable it.
-  Map<int32, int32> map;
+TEST_P(MapImplTest, BeginIsFast) {
+  // Disable this test for both new and old implementations.
+  if (/*GetParam()*/true) return;
+  Map<int32, int32> map(false);  // This test uses new-style maps only.
   const int kTestSize = 250000;
   // Create a random-looking map of size n.  Use non-negative integer keys.
   uint32 frog = 123983;
@@ -341,7 +333,7 @@
     GOOGLE_DCHECK_GE(last_key, 0);
     map[last_key] = last_key ^ 1;
   }
-  std::vector<int64> times;
+  vector<int64> times;
   // We're going to do map.erase(map.begin()) over and over again.  But,
   // just in case one iteration is fast compared to the granularity of
   // our time keeping, we measure kChunkSize iterations per outer-loop iter.
@@ -374,7 +366,7 @@
 // Try to create kTestSize keys that will land in just a few buckets, and
 // time the insertions, to get a rough estimate of whether an O(n^2) worst case
 // was triggered.  This test is a hacky, but probably better than nothing.
-TEST_F(MapImplTest, HashFlood) {
+TEST_P(MapImplTest, HashFlood) {
   const int kTestSize = 1024;  // must be a power of 2
   std::set<int> s;
   for (int i = 0; s.size() < kTestSize; i++) {
@@ -386,7 +378,7 @@
   // 1024 (or 512 or 2048 or ...) entries.  This assumes that map_ uses powers
   // of 2 for table sizes, and that it's sufficient to "flood" with respect to
   // the low bits of the output of map_.hash_function().
-  std::vector<int64> times;
+  vector<int64> times;
   std::set<int>::iterator it = s.begin();
   int count = 0;
   do {
@@ -407,22 +399,6 @@
   EXPECT_LE(x1, x0 * 20);
 }
 
-TEST_F(MapImplTest, CopyIteratorStressTest) {
-  std::vector<Map<int32, int32>::iterator> v;
-  const int kIters = 1e5;
-  for (uint32 i = 0; i < kIters; i++) {
-    int32 key = (3 + i * (5 + i * (-8 + i * (62 + i)))) & 0x77777777;
-    map_[key] = i;
-    v.push_back(map_.find(key));
-  }
-  for (std::vector<Map<int32, int32>::iterator>::const_iterator it = v.begin();
-       it != v.end(); it++) {
-    Map<int32, int32>::iterator i = *it;
-    ASSERT_EQ(i->first, (*it)->first);
-    ASSERT_EQ(i->second, (*it)->second);
-  }
-}
-
 template <typename T, typename U>
 static void TestValidityForAllKeysExcept(int key_to_avoid,
                                          const T& check_map,
@@ -487,11 +463,11 @@
 }
 
 // Create and test an n-element Map, with emphasis on iterator correctness.
-static void StressTestIterators(int n) {
+static void StressTestIterators(int n, bool test_old_style_proto2_maps) {
   GOOGLE_LOG(INFO) << "StressTestIterators " << n;
   GOOGLE_CHECK_GT(n, 0);
   // Create a random-looking map of size n.  Use non-negative integer keys.
-  Map<int, int> m;
+  Map<int, int> m(test_old_style_proto2_maps);
   uint32 frog = 123987 + n;
   int last_key = 0;
   int counter = 0;
@@ -526,10 +502,10 @@
   // Test old iterator vs new iterator, with table modification in between.
   TestOldVersusNewIterator<Map<int, int>::const_iterator>(n % 3, &m);
   TestOldVersusNewIterator<Map<int, int>::iterator>(n % (1 + (n / 40)), &m);
-  // Finally, ensure erase(iterator) doesn't reorder anything, because that is
+  // Finally, ensure erase(iterator) doesn't reorder anything, becuase that is
   // what its documentation says.
   m[last_key] = m[last_key ^ 999] = 0;
-  std::vector<Map<int, int>::iterator> v;
+  vector<Map<int, int>::iterator> v;
   v.reserve(m.size());
   int position_of_last_key = 0;
   for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
@@ -549,7 +525,10 @@
   }
 }
 
-TEST_F(MapImplTest, IteratorInvalidation) {
+TEST_P(MapImplTest, IteratorInvalidation) {
+  // As multiple underlying hash_map implementations do not follow the
+  // validation requirement, the test is disabled for old-style maps.
+  if (GetParam()) return;
   // Create a set of pseudo-random sizes to test.
 #ifndef NDEBUG
   const int kMaxSizeToTest = 100 * 1000;
@@ -558,7 +537,7 @@
 #endif
   std::set<int> s;
   int n = kMaxSizeToTest;
-  unsigned int frog = k1 + n;
+  int frog = k1 + n;
   while (n > 1 && s.size() < 25) {
     s.insert(n);
     n = static_cast<int>(n * 100 / (101.0 + (frog & 63)));
@@ -571,16 +550,19 @@
   s.insert(3);
   // Now, the real work.
   for (std::set<int>::iterator i = s.begin(); i != s.end(); ++i) {
-    StressTestIterators(*i);
+    StressTestIterators(*i, GetParam());
   }
 }
 
 // Test that erase() revalidates iterators.
-TEST_F(MapImplTest, EraseRevalidates) {
+TEST_P(MapImplTest, EraseRevalidates) {
+  // As multiple underlying hash_map implementations do not follow the
+  // validation requirement, the test is disabled for old-style maps.
+  if (GetParam()) return;
   map_[3] = map_[13] = map_[20] = 0;
   const int initial_size = map_.size();
   EXPECT_EQ(3, initial_size);
-  std::vector<Map<int, int>::iterator> v;
+  vector<Map<int, int>::iterator> v;
   for (Map<int, int>::iterator it = map_.begin(); it != map_.end(); ++it) {
     v.push_back(it);
   }
@@ -608,7 +590,7 @@
   return true;
 }
 
-TEST_F(MapImplTest, IteratorConstness) {
+TEST_P(MapImplTest, IteratorConstness) {
   map_[0] = 0;
   EXPECT_TRUE(IsConstHelper(*map_.cbegin()));
   EXPECT_TRUE(IsConstHelper(*const_map_.begin()));
@@ -621,14 +603,14 @@
   return false;
 }
 
-TEST_F(MapImplTest, IteratorCategory) {
+TEST_P(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()));
 }
 
-TEST_F(MapImplTest, InsertSingle) {
+TEST_P(MapImplTest, InsertSingle) {
   int32 key = 0;
   int32 value1 = 100;
   int32 value2 = 101;
@@ -653,7 +635,7 @@
   EXPECT_FALSE(result2.second);
 }
 
-TEST_F(MapImplTest, InsertByIterator) {
+TEST_P(MapImplTest, InsertByIterator) {
   int32 key1 = 0;
   int32 key2 = 1;
   int32 value1a = 100;
@@ -676,7 +658,7 @@
   ExpectElements(map1);
 }
 
-TEST_F(MapImplTest, EraseSingleByKey) {
+TEST_P(MapImplTest, EraseSingleByKey) {
   int32 key = 0;
   int32 value = 100;
 
@@ -694,7 +676,7 @@
   EXPECT_EQ(0, map_.erase(key));
 }
 
-TEST_F(MapImplTest, EraseMutipleByKey) {
+TEST_P(MapImplTest, EraseMutipleByKey) {
   // erase in one specific order to trigger corner cases
   for (int i = 0; i < 5; i++) {
     map_[i] = i;
@@ -721,7 +703,7 @@
   EXPECT_TRUE(map_.end() == map_.find(2));
 }
 
-TEST_F(MapImplTest, EraseSingleByIterator) {
+TEST_P(MapImplTest, EraseSingleByIterator) {
   int32 key = 0;
   int32 value = 100;
 
@@ -736,7 +718,7 @@
   EXPECT_TRUE(map_.begin() == map_.end());
 }
 
-TEST_F(MapImplTest, ValidIteratorAfterErase) {
+TEST_P(MapImplTest, ValidIteratorAfterErase) {
   for (int i = 0; i < 10; i++) {
     map_[i] = i;
   }
@@ -756,7 +738,7 @@
   EXPECT_EQ(5, map_.size());
 }
 
-TEST_F(MapImplTest, EraseByIterator) {
+TEST_P(MapImplTest, EraseByIterator) {
   int32 key1 = 0;
   int32 key2 = 1;
   int32 value1 = 100;
@@ -777,7 +759,7 @@
   EXPECT_TRUE(map_.begin() == map_.end());
 }
 
-TEST_F(MapImplTest, Clear) {
+TEST_P(MapImplTest, Clear) {
   int32 key = 0;
   int32 value = 100;
 
@@ -811,16 +793,16 @@
   EXPECT_EQ(value2, other.at(key2));
 }
 
-TEST_F(MapImplTest, CopyConstructorWithArena) {
+TEST_P(MapImplTest, CopyConstructorWithArena) {
   Arena a;
   CopyConstructorHelper(&a, &map_);
 }
 
-TEST_F(MapImplTest, CopyConstructorWithoutArena) {
+TEST_P(MapImplTest, CopyConstructorWithoutArena) {
   CopyConstructorHelper(NULL, &map_);
 }
 
-TEST_F(MapImplTest, IterConstructor) {
+TEST_P(MapImplTest, IterConstructor) {
   int32 key1 = 0;
   int32 key2 = 1;
   int32 value1 = 100;
@@ -830,14 +812,15 @@
   map[key1] = value1;
   map[key2] = value2;
 
-  Map<int32, int32> new_map(map.begin(), map.end());
+  Map<int32, int32> new_map(map.begin(), map.end(),
+                            GetParam());
 
   EXPECT_EQ(2, new_map.size());
   EXPECT_EQ(value1, new_map.at(key1));
   EXPECT_EQ(value2, new_map.at(key2));
 }
 
-TEST_F(MapImplTest, Assigner) {
+TEST_P(MapImplTest, Assigner) {
   int32 key1 = 0;
   int32 key2 = 1;
   int32 value1 = 100;
@@ -849,7 +832,7 @@
 
   map_.insert(map.begin(), map.end());
 
-  Map<int32, int32> other;
+  Map<int32, int32> other(GetParam());
   int32 key_other = 123;
   int32 value_other = 321;
   other[key_other] = value_other;
@@ -867,9 +850,16 @@
   EXPECT_EQ(2, other.size());
   EXPECT_EQ(value1, other.at(key1));
   EXPECT_EQ(value2, other.at(key2));
+
+  // Try assignment to a map with a different choice of "style."
+  Map<int32, int32> m(!GetParam());
+  m = other;
+  EXPECT_EQ(2, m.size());
+  EXPECT_EQ(value1, m.at(key1));
+  EXPECT_EQ(value2, m.at(key2));
 }
 
-TEST_F(MapImplTest, Rehash) {
+TEST_P(MapImplTest, Rehash) {
   const int test_size = 50;
   std::map<int32, int32> reference_map;
   for (int i = 0; i < test_size; i++) {
@@ -886,7 +876,7 @@
   EXPECT_TRUE(map_.empty());
 }
 
-TEST_F(MapImplTest, EqualRange) {
+TEST_P(MapImplTest, EqualRange) {
   int key = 100, key_missing = 101;
   map_[key] = 100;
 
@@ -910,14 +900,14 @@
   EXPECT_TRUE(const_map_.end() == const_range.second);
 }
 
-TEST_F(MapImplTest, ConvertToStdMap) {
+TEST_P(MapImplTest, ConvertToStdMap) {
   map_[100] = 101;
   std::map<int32, int32> std_map(map_.begin(), map_.end());
   EXPECT_EQ(1, std_map.size());
   EXPECT_EQ(101, std_map[100]);
 }
 
-TEST_F(MapImplTest, ConvertToStdVectorOfPairs) {
+TEST_P(MapImplTest, ConvertToStdVectorOfPairs) {
   map_[100] = 101;
   std::vector<std::pair<int32, int32> > std_vec(map_.begin(), map_.end());
   EXPECT_EQ(1, std_vec.size());
@@ -925,52 +915,7 @@
   EXPECT_EQ(101, std_vec[0].second);
 }
 
-TEST_F(MapImplTest, SwapBasic) {
-  Map<int32, int32> another;
-  map_[9398] = 41999;
-  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)));
-}
-
-TEST_F(MapImplTest, SwapArena) {
-  Arena arena1, arena2;
-  Map<int32, int32> m1(&arena1);
-  Map<int32, int32> m2(&arena2);
-  map_[9398] = 41999;
-  m1[9398] = 41999;
-  m1[8070] = 42056;
-  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)));
-  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)));
-}
-
-TEST_F(MapImplTest, CopyAssignMapIterator) {
-  TestMap message;
-  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");
-  it2 = it1;
-  EXPECT_EQ(it1.GetKey().GetInt32Value(), it2.GetKey().GetInt32Value());
-}
+INSTANTIATE_TEST_CASE_P(BoolSequence, MapImplTest, testing::Bool());
 
 // Map Field Reflection Test ========================================
 
@@ -993,11 +938,6 @@
 class MapFieldReflectionTest : public testing::Test {
  protected:
   typedef FieldDescriptor FD;
-
-  int MapSize(const Reflection* reflection, const FieldDescriptor* field,
-              const Message& message) {
-    return reflection->MapSize(message, field);
-  }
 };
 
 TEST_F(MapFieldReflectionTest, RegularFields) {
@@ -1805,50 +1745,6 @@
   // TODO(teboring): add test for duplicated key
 }
 
-TEST_F(MapFieldReflectionTest, MapSizeWithDuplicatedKey) {
-  // Dynamic Message
-  {
-    DynamicMessageFactory factory;
-    google::protobuf::scoped_ptr<Message> message(
-        factory.GetPrototype(unittest::TestMap::descriptor())->New());
-    const Reflection* reflection = message->GetReflection();
-    const FieldDescriptor* field =
-        unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32");
-
-    Message* entry1 = reflection->AddMessage(message.get(), field);
-    Message* entry2 = reflection->AddMessage(message.get(), field);
-
-    const Reflection* entry_reflection = entry1->GetReflection();
-    const FieldDescriptor* key_field =
-        entry1->GetDescriptor()->FindFieldByName("key");
-    entry_reflection->SetInt32(entry1, key_field, 1);
-    entry_reflection->SetInt32(entry2, key_field, 1);
-
-    EXPECT_EQ(2, reflection->FieldSize(*message, field));
-    EXPECT_EQ(1, MapSize(reflection, field, *message));
-  }
-
-  // Generated Message
-  {
-    unittest::TestMap message;
-    const Reflection* reflection = message.GetReflection();
-    const FieldDescriptor* field =
-        message.GetDescriptor()->FindFieldByName("map_int32_int32");
-
-    Message* entry1 = reflection->AddMessage(&message, field);
-    Message* entry2 = reflection->AddMessage(&message, field);
-
-    const Reflection* entry_reflection = entry1->GetReflection();
-    const FieldDescriptor* key_field =
-        entry1->GetDescriptor()->FindFieldByName("key");
-    entry_reflection->SetInt32(entry1, key_field, 1);
-    entry_reflection->SetInt32(entry2, key_field, 1);
-
-    EXPECT_EQ(2, reflection->FieldSize(message, field));
-    EXPECT_EQ(1, MapSize(reflection, field, message));
-  }
-}
-
 // Generated Message Test ===========================================
 
 TEST(GeneratedMapFieldTest, Accessors) {
@@ -2210,76 +2106,6 @@
   EXPECT_TRUE(message.ParseFromString(data));
   EXPECT_EQ(1, message.map_int32_int32().size());
   EXPECT_EQ(1, message.map_int32_int32().at(2));
-
-  // A similar test, but with a map from int to a message type.
-  // Again, we want to be sure that the "second one wins" when
-  // there are two separate entries with the same key.
-  const int key = 99;
-  unittest::TestRequiredMessageMap map_message;
-  unittest::TestRequired with_dummy4;
-  with_dummy4.set_a(0);
-  with_dummy4.set_b(0);
-  with_dummy4.set_c(0);
-  with_dummy4.set_dummy4(11);
-  (*map_message.mutable_map_field())[key] = with_dummy4;
-  string s = map_message.SerializeAsString();
-  unittest::TestRequired with_dummy5;
-  with_dummy5.set_a(0);
-  with_dummy5.set_b(0);
-  with_dummy5.set_c(0);
-  with_dummy5.set_dummy5(12);
-  (*map_message.mutable_map_field())[key] = with_dummy5;
-  string both = s + map_message.SerializeAsString();
-  // We don't expect a merge now.  The "second one wins."
-  ASSERT_TRUE(map_message.ParseFromString(both));
-  ASSERT_EQ(1, map_message.map_field().size());
-  ASSERT_EQ(1, map_message.map_field().count(key));
-  EXPECT_EQ(0, map_message.map_field().find(key)->second.a());
-  EXPECT_EQ(0, map_message.map_field().find(key)->second.b());
-  EXPECT_EQ(0, map_message.map_field().find(key)->second.c());
-  EXPECT_FALSE(map_message.map_field().find(key)->second.has_dummy4());
-  ASSERT_TRUE(map_message.map_field().find(key)->second.has_dummy5());
-  EXPECT_EQ(12, map_message.map_field().find(key)->second.dummy5());
-}
-
-// Exhaustive combinations of keys, values, and junk in any order.
-// This re-tests some of the things tested above, but if it fails
-// it's more work to determine what went wrong, so it isn't necessarily
-// bad that we have the simpler tests too.
-TEST(GeneratedMapFieldTest, KeysValuesUnknownsWireFormat) {
-  unittest::TestMap message;
-  const int kMaxNumKeysAndValuesAndJunk = 4;
-  const char kKeyTag = 0x08;
-  const char kValueTag = 0x10;
-  const char kJunkTag = 0x20;
-  for (int items = 0; items <= kMaxNumKeysAndValuesAndJunk; items++) {
-    string data = "\x0A";
-    // Encode length of what will follow.
-    data.push_back(items * 2);
-    static const int kBitsOfIPerItem = 4;
-    static const int mask = (1 << kBitsOfIPerItem) - 1;
-    // Each iteration of the following is a test.  It uses i as bit vector
-    // encoding the keys and values to put in the wire format.
-    for (int i = 0; i < (1 << (items * kBitsOfIPerItem)); i++) {
-      string wire_format = data;
-      int expected_key = 0;
-      int expected_value = 0;
-      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);
-        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);
-        if (is_value) expected_value = static_cast<int>(c);
-        ASSERT_TRUE(message.ParseFromString(wire_format));
-        ASSERT_EQ(1, message.map_int32_int32().size());
-        ASSERT_EQ(expected_key, message.map_int32_int32().begin()->first);
-        ASSERT_EQ(expected_value, message.map_int32_int32().begin()->second);
-      }
-    }
-  }
 }
 
 TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat) {
@@ -2363,74 +2189,6 @@
   EXPECT_TRUE(map_message.IsInitialized());
 }
 
-TEST(GeneratedMapFieldTest, MessagesMustMerge) {
-  unittest::TestRequiredMessageMap map_message;
-  unittest::TestRequired with_dummy4;
-  with_dummy4.set_a(97);
-  with_dummy4.set_b(0);
-  with_dummy4.set_c(0);
-  with_dummy4.set_dummy4(98);
-
-  EXPECT_TRUE(with_dummy4.IsInitialized());
-  (*map_message.mutable_map_field())[0] = with_dummy4;
-  EXPECT_TRUE(map_message.IsInitialized());
-  string s = map_message.SerializeAsString();
-
-  // Modify s so that there are two values in the entry for key 0.
-  // The first will have no value for c.  The second will have no value for a.
-  // Those are required fields.  Also, make some other little changes, to
-  // ensure we are merging the two values (because they're messages).
-  ASSERT_EQ(s.size() - 2, s[1]);  // encoding of the length of what follows
-  string encoded_val(s.data() + 4, s.data() + s.size());
-  // In s, change the encoding of c to an encoding of dummy32.
-  s[s.size() - 3] -= 8;
-  // Make encoded_val slightly different from what's in s.
-  encoded_val[encoded_val.size() - 1] += 33;  // Encode c = 33.
-  for (int i = 0; i < encoded_val.size(); i++) {
-    if (encoded_val[i] == 97) {
-      // Encode b = 91 instead of a = 97.  But this won't matter, because
-      // we also encode b = 0 right after this.  The point is to leave out
-      // a required field, and make sure the parser doesn't complain, because
-      // every required field is set after the merge of the two values.
-      encoded_val[i - 1] += 16;
-      encoded_val[i] = 91;
-    } else if (encoded_val[i] == 98) {
-      // Encode dummy5 = 99 instead of dummy4 = 98.
-      encoded_val[i - 1] += 8;  // The tag for dummy5 is 8 more.
-      encoded_val[i]++;
-      break;
-    }
-  }
-
-  s += encoded_val;            // Add the second message.
-  s[1] += encoded_val.size();  // Adjust encoded size.
-
-  // Test key then value then value.
-  int key = 0;
-  ASSERT_TRUE(map_message.ParseFromString(s));
-  ASSERT_EQ(1, map_message.map_field().size());
-  ASSERT_EQ(1, map_message.map_field().count(key));
-  EXPECT_EQ(97, map_message.map_field().find(key)->second.a());
-  EXPECT_EQ(0, map_message.map_field().find(key)->second.b());
-  EXPECT_EQ(33, map_message.map_field().find(key)->second.c());
-  EXPECT_EQ(98, map_message.map_field().find(key)->second.dummy4());
-  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.
-  key = 19;
-  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));
-  EXPECT_EQ(97, map_message.map_field().find(key)->second.a());
-  EXPECT_EQ(0, map_message.map_field().find(key)->second.b());
-  EXPECT_EQ(33, map_message.map_field().find(key)->second.c());
-  EXPECT_EQ(98, map_message.map_field().find(key)->second.dummy4());
-  EXPECT_EQ(99, map_message.map_field().find(key)->second.dummy5());
-}
-
 // Generated Message Reflection Test ================================
 
 TEST(GeneratedMapFieldReflectionTest, SpaceUsed) {
@@ -2491,7 +2249,7 @@
 
   MapTestUtil::SetMapFields(&message2);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   const Reflection* reflection = message1.GetReflection();
   reflection->ListFields(message2, &fields);
   reflection->SwapFields(&message1, &message2, fields);
@@ -2756,69 +2514,6 @@
   ASSERT_TRUE(to->ParseFromString(data));
 }
 
-TEST_F(MapFieldInDynamicMessageTest, MapValueReferernceValidAfterSerialize) {
-  google::protobuf::scoped_ptr<Message> message(map_prototype_->New());
-  MapReflectionTester reflection_tester(map_descriptor_);
-  reflection_tester.SetMapFieldsViaMapReflection(message.get());
-
-  // Get value reference before serialization, so that we know the value is from
-  // map.
-  MapKey map_key;
-  MapValueRef map_val;
-  map_key.SetInt32Value(0);
-  reflection_tester.GetMapValueViaMapReflection(
-      message.get(), "map_int32_foreign_message", map_key, &map_val);
-  Message* submsg = map_val.MutableMessageValue();
-
-  // In previous implementation, calling SerializeToString will cause syncing
-  // from map to repeated field, which will invalidate the submsg we previously
-  // got.
-  string data;
-  message->SerializeToString(&data);
-
-  const Reflection* submsg_reflection = submsg->GetReflection();
-  const Descriptor* submsg_desc = submsg->GetDescriptor();
-  const FieldDescriptor* submsg_field = submsg_desc->FindFieldByName("c");
-  submsg_reflection->SetInt32(submsg, submsg_field, 128);
-
-  message->SerializeToString(&data);
-  TestMap to;
-  to.ParseFromString(data);
-  EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c());
-}
-
-TEST_F(MapFieldInDynamicMessageTest, MapEntryReferernceValidAfterSerialize) {
-  google::protobuf::scoped_ptr<Message> message(map_prototype_->New());
-  MapReflectionTester reflection_tester(map_descriptor_);
-  reflection_tester.SetMapFieldsViaReflection(message.get());
-
-  // Get map entry before serialization, so that we know the it is from
-  // repeated field.
-  Message* map_entry = reflection_tester.GetMapEntryViaReflection(
-      message.get(), "map_int32_foreign_message", 0);
-  const Reflection* map_entry_reflection = map_entry->GetReflection();
-  const Descriptor* map_entry_desc = map_entry->GetDescriptor();
-  const FieldDescriptor* value_field = map_entry_desc->FindFieldByName("value");
-  Message* submsg =
-      map_entry_reflection->MutableMessage(map_entry, value_field);
-
-  // In previous implementation, calling SerializeToString will cause syncing
-  // from repeated field to map, which will invalidate the map_entry we
-  // previously got.
-  string data;
-  message->SerializeToString(&data);
-
-  const Reflection* submsg_reflection = submsg->GetReflection();
-  const Descriptor* submsg_desc = submsg->GetDescriptor();
-  const FieldDescriptor* submsg_field = submsg_desc->FindFieldByName("c");
-  submsg_reflection->SetInt32(submsg, submsg_field, 128);
-
-  message->SerializeToString(&data);
-  TestMap to;
-  to.ParseFromString(data);
-  EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c());
-}
-
 // ReflectionOps Test ===============================================
 
 TEST(ReflectionOpsForMapFieldTest, MapSanityCheck) {
@@ -2881,20 +2576,6 @@
       GetUnknownFields(message).field_count());
 }
 
-TEST(ReflectionOpsForMapFieldTest, IsInitialized) {
-  unittest::TestRequiredMessageMap map_message;
-
-  // Add an uninitialized message.
-  (*map_message.mutable_map_field())[0];
-  EXPECT_FALSE(ReflectionOps::IsInitialized(map_message));
-
-  // Initialize uninitialized message
-  (*map_message.mutable_map_field())[0].set_a(0);
-  (*map_message.mutable_map_field())[0].set_b(0);
-  (*map_message.mutable_map_field())[0].set_c(0);
-  EXPECT_TRUE(ReflectionOps::IsInitialized(map_message));
-}
-
 // Wire Format Test =================================================
 
 TEST(WireFormatForMapFieldTest, ParseMap) {
@@ -2955,33 +2636,6 @@
   EXPECT_TRUE(dynamic_data == generated_data);
 }
 
-TEST(WireFormatForMapFieldTest, SerializeMapDynamicMessage) {
-  DynamicMessageFactory factory;
-  google::protobuf::scoped_ptr<Message> dynamic_message;
-  dynamic_message.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
-  reflection_tester.SetMapFieldsViaReflection(dynamic_message.get());
-  reflection_tester.ExpectMapFieldsSetViaReflection(*dynamic_message);
-
-  unittest::TestMap generated_message;
-  MapTestUtil::SetMapFields(&generated_message);
-  MapTestUtil::ExpectMapFieldsSet(generated_message);
-
-  string generated_data;
-  string dynamic_data;
-
-  // Serialize.
-  generated_message.SerializeToString(&generated_data);
-  dynamic_message->SerializeToString(&dynamic_data);
-
-  // Because map serialization doesn't guarantee order, we just compare
-  // serialized size here. This is enough to tell dynamic message doesn't miss
-  // anything in serialization.
-  EXPECT_TRUE(dynamic_data.size() == generated_data.size());
-}
-
 TEST(WireFormatForMapFieldTest, MapParseHelpers) {
   string data;
 
@@ -3002,7 +2656,7 @@
   {
     // Test ParseFromIstream.
     protobuf_unittest::TestMap message;
-    std::stringstream stream(data);
+    stringstream stream(data);
     EXPECT_TRUE(message.ParseFromIstream(&stream));
     EXPECT_TRUE(stream.eof());
     MapTestUtil::ExpectMapFieldsSet(message);
@@ -3028,133 +2682,6 @@
   }
 }
 
-// Deterministic Serialization Test ==========================================
-
-template <typename T>
-static string DeterministicSerializationWithSerializePartialToCodedStream(
-    const T& t) {
-  const int size = t.ByteSize();
-  string result(size, '\0');
-  io::ArrayOutputStream array_stream(string_as_array(&result), size);
-  io::CodedOutputStream output_stream(&array_stream);
-  output_stream.SetSerializationDeterministic(true);
-  t.SerializePartialToCodedStream(&output_stream);
-  EXPECT_FALSE(output_stream.HadError());
-  EXPECT_EQ(size, output_stream.ByteCount());
-  return result;
-}
-
-template <typename T>
-static string DeterministicSerializationWithSerializeToCodedStream(const T& t) {
-  const int size = t.ByteSize();
-  string result(size, '\0');
-  io::ArrayOutputStream array_stream(string_as_array(&result), size);
-  io::CodedOutputStream output_stream(&array_stream);
-  output_stream.SetSerializationDeterministic(true);
-  t.SerializeToCodedStream(&output_stream);
-  EXPECT_FALSE(output_stream.HadError());
-  EXPECT_EQ(size, output_stream.ByteCount());
-  return result;
-}
-
-template <typename T>
-static string DeterministicSerialization(const T& t) {
-  const int size = t.ByteSize();
-  string result(size, '\0');
-  io::ArrayOutputStream array_stream(string_as_array(&result), size);
-  io::CodedOutputStream output_stream(&array_stream);
-  output_stream.SetSerializationDeterministic(true);
-  t.SerializeWithCachedSizes(&output_stream);
-  EXPECT_FALSE(output_stream.HadError());
-  EXPECT_EQ(size, output_stream.ByteCount());
-  EXPECT_EQ(result, DeterministicSerializationWithSerializeToCodedStream(t));
-  EXPECT_EQ(result,
-            DeterministicSerializationWithSerializePartialToCodedStream(t));
-  return result;
-}
-
-// Helper to test the serialization of the first arg against a golden file.
-static void TestDeterministicSerialization(const protobuf_unittest::TestMaps& t,
-                                           const string& filename) {
-  string expected;
-  GOOGLE_CHECK_OK(File::GetContents(
-      TestSourceDir() + "/google/protobuf/testdata/" + filename,
-      &expected, true));
-  const string actual = DeterministicSerialization(t);
-  EXPECT_EQ(expected, actual);
-  protobuf_unittest::TestMaps u;
-  EXPECT_TRUE(u.ParseFromString(actual));
-  EXPECT_TRUE(google::protobuf::util::MessageDifferencer::Equals(u, t));
-}
-
-// Helper for MapSerializationTest.  Return a 7-bit ASCII string.
-static string ConstructKey(uint64 n) {
-  string s(n % static_cast<uint64>(9), '\0');
-  if (s.empty()) {
-    return StrCat(n);
-  } else {
-    while (n != 0) {
-      s[n % s.size()] = (n >> 10) & 0x7f;
-      n /= 888;
-    }
-    return s;
-  }
-}
-
-TEST(MapSerializationTest, Deterministic) {
-  const int kIters = 25;
-  protobuf_unittest::TestMaps t;
-  protobuf_unittest::TestIntIntMap inner;
-  (*inner.mutable_m())[0] = (*inner.mutable_m())[10] =
-      (*inner.mutable_m())[-200] = 0;
-  uint64 frog = 9;
-  const uint64 multiplier = 0xa29cd16f;
-  for (int i = 0; i < kIters; i++) {
-    const int32 i32 = static_cast<int32>(frog & 0xffffffff);
-    const uint32 u32 = static_cast<uint32>(i32) * 91919;
-    const int64 i64 = static_cast<int64>(frog);
-    const uint64 u64 = frog * static_cast<uint64>(187321);
-    const bool b = i32 > 0;
-    const string s = ConstructKey(frog);
-    (*inner.mutable_m())[i] = i32;
-    (*t.mutable_m_int32())[i32] = (*t.mutable_m_sint32())[i32] =
-        (*t.mutable_m_sfixed32())[i32] = inner;
-    (*t.mutable_m_uint32())[u32] = (*t.mutable_m_fixed32())[u32] = inner;
-    (*t.mutable_m_int64())[i64] = (*t.mutable_m_sint64())[i64] =
-        (*t.mutable_m_sfixed64())[i64] = inner;
-    (*t.mutable_m_uint64())[u64] = (*t.mutable_m_fixed64())[u64] = inner;
-    (*t.mutable_m_bool())[b] = inner;
-    (*t.mutable_m_string())[s] = inner;
-    (*t.mutable_m_string())[s + string(1 << (u32 % static_cast<uint32>(9)),
-                                       b)] = inner;
-    inner.mutable_m()->erase(i);
-    frog = frog * multiplier + i;
-    frog ^= (frog >> 41);
-  }
-  TestDeterministicSerialization(t, "golden_message_maps");
-}
-
-TEST(MapSerializationTest, DeterministicSubmessage) {
-  protobuf_unittest::TestSubmessageMaps p;
-  protobuf_unittest::TestMaps t;
-  const string filename = "golden_message_maps";
-  string golden;
-  GOOGLE_CHECK_OK(File::GetContents(
-      TestSourceDir() + "/google/protobuf/testdata/" + filename,
-      &golden, true));
-  t.ParseFromString(golden);
-  *(p.mutable_m()) = t;
-  std::vector<string> v;
-  // Use multiple attempts to increase the chance of a failure if something is
-  // buggy.  For example, each separate copy of a map might use a different
-  // randomly-chosen hash function.
-  const int kAttempts = 10;
-  for (int i = 0; i < kAttempts; i++) {
-    protobuf_unittest::TestSubmessageMaps q(p);
-    ASSERT_EQ(DeterministicSerialization(q), DeterministicSerialization(p));
-  }
-}
-
 // Text Format Test =================================================
 
 TEST(TextFormatMapTest, SerializeAndParse) {
@@ -3192,18 +2719,6 @@
   EXPECT_EQ(message2.DebugString(), expected_text);
 }
 
-TEST(TextFormatMapTest, ParseCorruptedString) {
-  string serialized_message;
-  GOOGLE_CHECK_OK(File::GetContents(
-      TestSourceDir() +
-          "/google/protobuf/testdata/golden_message_maps",
-      &serialized_message, true));
-  protobuf_unittest::TestMaps message;
-  GOOGLE_CHECK(message.ParseFromString(serialized_message));
-  TestParseCorruptedString<protobuf_unittest::TestMaps, true>(message);
-  TestParseCorruptedString<protobuf_unittest::TestMaps, false>(message);
-}
-
 
 // arena support =================================================
 TEST(ArenaTest, ParsingAndSerializingNoHeapAllocation) {
@@ -3233,7 +2748,7 @@
 }
 
 // Use text format parsing and serializing to test reflection api.
-TEST(ArenaTest, ReflectionInTextFormat) {
+TEST(ArenaTest, RelfectionInTextFormat) {
   Arena arena;
   string data;
 
@@ -3268,59 +2783,6 @@
   ASSERT_FALSE(message == NULL);
 }
 
-TEST(ArenaTest, IsInitialized) {
-  // Allocate a large initial polluted block.
-  std::vector<char> arena_block(128 * 1024);
-  std::fill(arena_block.begin(), arena_block.end(), '\xff');
-
-  ArenaOptions options;
-  options.initial_block = &arena_block[0];
-  options.initial_block_size = arena_block.size();
-  Arena arena(options);
-
-  unittest::TestArenaMap* message =
-      Arena::CreateMessage<unittest::TestArenaMap>(&arena);
-  EXPECT_EQ(0, (*message->mutable_map_int32_int32())[0]);
-}
-
-#if LANG_CXX11
-TEST(MoveTest, MoveConstructorWorks) {
-  Map<int32, TestAllTypes> original_map;
-  original_map[42].mutable_optional_nested_message()->set_bb(42);
-  original_map[43].mutable_optional_nested_message()->set_bb(43);
-  const auto* nested_msg42_ptr = &original_map[42].optional_nested_message();
-  const auto* nested_msg43_ptr = &original_map[43].optional_nested_message();
-
-  Map<int32, TestAllTypes> moved_to_map(std::move(original_map));
-  EXPECT_TRUE(original_map.empty());
-  EXPECT_EQ(2, moved_to_map.size());
-  EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb());
-  EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb());
-  // This test takes advantage of the fact that pointers are swapped, so there
-  // should be pointer stability.
-  EXPECT_EQ(nested_msg42_ptr, &moved_to_map[42].optional_nested_message());
-  EXPECT_EQ(nested_msg43_ptr, &moved_to_map[43].optional_nested_message());
-}
-
-TEST(MoveTest, MoveAssignmentWorks) {
-  Map<int32, TestAllTypes> original_map;
-  original_map[42].mutable_optional_nested_message()->set_bb(42);
-  original_map[43].mutable_optional_nested_message()->set_bb(43);
-  const auto* nested_msg42_ptr = &original_map[42].optional_nested_message();
-  const auto* nested_msg43_ptr = &original_map[43].optional_nested_message();
-
-  Map<int32, TestAllTypes> moved_to_map = std::move(original_map);
-  EXPECT_TRUE(original_map.empty());
-  EXPECT_EQ(2, moved_to_map.size());
-  EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb());
-  EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb());
-  // This test takes advantage of the fact that pointers are swapped, so there
-  // should be pointer stability.
-  EXPECT_EQ(nested_msg42_ptr, &moved_to_map[42].optional_nested_message());
-  EXPECT_EQ(nested_msg43_ptr, &moved_to_map[43].optional_nested_message());
-}
-#endif
-
 }  // namespace internal
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/map_test_util.cc b/src/google/protobuf/map_test_util.cc
index 31ac173..ae09464 100644
--- a/src/google/protobuf/map_test_util.cc
+++ b/src/google/protobuf/map_test_util.cc
@@ -744,34 +744,6 @@
       sub_foreign_message, foreign_c_, 1);
 }
 
-void MapReflectionTester::GetMapValueViaMapReflection(Message* message,
-                                                      const string& field_name,
-                                                      const MapKey& map_key,
-                                                      MapValueRef* map_val) {
-  const Reflection* reflection = message->GetReflection();
-  EXPECT_FALSE(reflection->InsertOrLookupMapValue(message, F(field_name),
-                                                  map_key, map_val));
-}
-
-Message* MapReflectionTester::GetMapEntryViaReflection(Message* message,
-                                                       const string& field_name,
-                                                       int index) {
-  const Reflection* reflection = message->GetReflection();
-  return reflection->MutableRepeatedMessage(message, F(field_name), index);
-}
-
-MapIterator MapReflectionTester::MapBegin(Message* message,
-                                          const string& field_name) {
-  const Reflection* reflection = message->GetReflection();
-  return reflection->MapBegin(message, F(field_name));
-}
-
-MapIterator MapReflectionTester::MapEnd(Message* message,
-                                        const string& field_name) {
-  const Reflection* reflection = message->GetReflection();
-  return reflection->MapEnd(message, F(field_name));
-}
-
 void MapReflectionTester::ClearMapFieldsViaReflection(
     Message* message) {
   const Reflection* reflection = message->GetReflection();
@@ -895,7 +867,7 @@
     Message* message) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> output;
+  vector<const FieldDescriptor*> output;
   reflection->ListFields(*message, &output);
   for (int i = 0; i < output.size(); ++i) {
     const FieldDescriptor* field = output[i];
@@ -908,7 +880,7 @@
     Message* message) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> output;
+  vector<const FieldDescriptor*> output;
   reflection->ListFields(*message, &output);
   for (int i = 0; i < output.size(); ++i) {
     const FieldDescriptor* field = output[i];
@@ -924,7 +896,7 @@
 
 void MapReflectionTester::SwapMapsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
-  std::vector<const FieldDescriptor*> output;
+  vector<const FieldDescriptor*> output;
   reflection->ListFields(*message, &output);
   for (int i = 0; i < output.size(); ++i) {
     const FieldDescriptor* field = output[i];
diff --git a/src/google/protobuf/map_test_util.h b/src/google/protobuf/map_test_util.h
index dd39761..deaf0f4 100644
--- a/src/google/protobuf/map_test_util.h
+++ b/src/google/protobuf/map_test_util.h
@@ -106,13 +106,6 @@
   void ExpectClearViaReflection(const Message& message);
   void ExpectClearViaReflectionIterator(Message* message);
   void ExpectMapEntryClearViaReflection(Message* message);
-  void GetMapValueViaMapReflection(Message* message,
-                                   const string& field_name,
-                                   const MapKey& map_key, MapValueRef* map_val);
-  Message* GetMapEntryViaReflection(Message* message, const string& field_name,
-                                    int index);
-  MapIterator MapBegin(Message* message, const string& field_name);
-  MapIterator MapEnd(Message* message, const string& field_name);
 
  private:
   const FieldDescriptor* F(const string& name);
diff --git a/src/google/protobuf/map_test_util_impl.h b/src/google/protobuf/map_test_util_impl.h
index ad4d1a3..b3ba4e0 100644
--- a/src/google/protobuf/map_test_util_impl.h
+++ b/src/google/protobuf/map_test_util_impl.h
@@ -33,9 +33,14 @@
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
-#include <gtest/gtest.h>
 
 
+#define EXPECT_TRUE GOOGLE_CHECK
+#define ASSERT_TRUE GOOGLE_CHECK
+#define EXPECT_FALSE(COND) GOOGLE_CHECK(!(COND))
+#define EXPECT_EQ GOOGLE_CHECK_EQ
+#define ASSERT_EQ GOOGLE_CHECK_EQ
+
 namespace google {
 namespace protobuf_unittest {}  // forward declaration
 
@@ -260,23 +265,23 @@
 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());
-  ASSERT_EQ(2, message.map_uint32_uint32().size());
-  ASSERT_EQ(2, message.map_uint64_uint64().size());
-  ASSERT_EQ(2, message.map_sint32_sint32().size());
-  ASSERT_EQ(2, message.map_sint64_sint64().size());
-  ASSERT_EQ(2, message.map_fixed32_fixed32().size());
-  ASSERT_EQ(2, message.map_fixed64_fixed64().size());
-  ASSERT_EQ(2, message.map_sfixed32_sfixed32().size());
-  ASSERT_EQ(2, message.map_sfixed64_sfixed64().size());
-  ASSERT_EQ(2, message.map_int32_float().size());
-  ASSERT_EQ(2, message.map_int32_double().size());
-  ASSERT_EQ(2, message.map_bool_bool().size());
-  ASSERT_EQ(2, message.map_string_string().size());
-  ASSERT_EQ(2, message.map_int32_bytes().size());
-  ASSERT_EQ(2, message.map_int32_enum().size());
-  ASSERT_EQ(2, message.map_int32_foreign_message().size());
+  EXPECT_EQ(2, message.map_int32_int32().size());
+  EXPECT_EQ(2, message.map_int64_int64().size());
+  EXPECT_EQ(2, message.map_uint32_uint32().size());
+  EXPECT_EQ(2, message.map_uint64_uint64().size());
+  EXPECT_EQ(2, message.map_sint32_sint32().size());
+  EXPECT_EQ(2, message.map_sint64_sint64().size());
+  EXPECT_EQ(2, message.map_fixed32_fixed32().size());
+  EXPECT_EQ(2, message.map_fixed64_fixed64().size());
+  EXPECT_EQ(2, message.map_sfixed32_sfixed32().size());
+  EXPECT_EQ(2, message.map_sfixed64_sfixed64().size());
+  EXPECT_EQ(2, message.map_int32_float().size());
+  EXPECT_EQ(2, message.map_int32_double().size());
+  EXPECT_EQ(2, message.map_bool_bool().size());
+  EXPECT_EQ(2, message.map_string_string().size());
+  EXPECT_EQ(2, message.map_int32_bytes().size());
+  EXPECT_EQ(2, message.map_int32_enum().size());
+  EXPECT_EQ(2, message.map_int32_foreign_message().size());
 
   EXPECT_EQ(0, message.map_int32_int32().at(0));
   EXPECT_EQ(0, message.map_int64_int64().at(0));
diff --git a/src/google/protobuf/map_type_handler.h b/src/google/protobuf/map_type_handler.h
index 7f7b1e0..f8ad758 100644
--- a/src/google/protobuf/map_type_handler.h
+++ b/src/google/protobuf/map_type_handler.h
@@ -32,6 +32,7 @@
 #define GOOGLE_PROTOBUF_TYPE_HANDLER_H__
 
 #include <google/protobuf/arena.h>
+#include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/wire_format_lite_inl.h>
 
 namespace google {
@@ -72,7 +73,7 @@
 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>
@@ -157,18 +158,15 @@
       MapWireFieldTypeTraits<WireFormatLite::TYPE_MESSAGE, Type>::kIsEnum;
 
   // Functions used in parsing and serialization. ===================
-  static inline size_t ByteSize(const MapEntryAccessorType& value);
+  static inline int ByteSize(const MapEntryAccessorType& value);
   static inline int GetCachedSize(const MapEntryAccessorType& value);
   static inline bool Read(io::CodedInputStream* input,
                           MapEntryAccessorType* value);
   static inline void Write(int field, const MapEntryAccessorType& value,
                            io::CodedOutputStream* output);
-  static inline uint8* InternalWriteToArray(int field,
-                                            const MapEntryAccessorType& value,
-                                            bool deterministic, uint8* target);
   static inline uint8* WriteToArray(int field,
                                     const MapEntryAccessorType& value,
-                                    uint8* target);
+                                    uint8* output);
 
   // Functions to manipulate data on memory. ========================
   static inline const Type& GetExternalReference(const Type* value);
@@ -185,9 +183,9 @@
   static inline Type* EnsureMutable(Type** value, Arena* arena);
   // SpaceUsedInMapEntry: Return bytes used by value in MapEntry, excluding
   // those already calculate in sizeof(MapField).
-  static inline size_t SpaceUsedInMapEntryLong(const Type* value);
+  static inline int SpaceUsedInMapEntry(const Type* value);
   // Return bytes used by value in Map.
-  static inline size_t SpaceUsedInMapLong(const Type& value);
+  static inline int SpaceUsedInMap(const Type& value);
   // Assign default value to given instance.
   static inline void AssignDefaultValue(Type** value);
   // Return default instance if value is not initialized when calling const
@@ -222,14 +220,9 @@
                             MapEntryAccessorType* value);                     \
     static inline void Write(int field, const MapEntryAccessorType& value,    \
                              io::CodedOutputStream* output);                  \
-    static inline uint8* InternalWriteToArray(                                \
-        int field, const MapEntryAccessorType& value, bool deterministic,     \
-        uint8* target);                                                       \
     static inline uint8* WriteToArray(int field,                              \
                                       const MapEntryAccessorType& value,      \
-                                      uint8* target) {                        \
-      return InternalWriteToArray(field, value, false, target);               \
-    }                                                                         \
+                                      uint8* output);                         \
     static inline const MapEntryAccessorType& GetExternalReference(           \
         const TypeOnMemory& value);                                           \
     static inline void DeleteNoArena(const TypeOnMemory& x);                  \
@@ -239,9 +232,9 @@
     static inline void ClearMaybeByDefaultEnum(TypeOnMemory* value,           \
                                                Arena* arena,                  \
                                                int default_enum);             \
-    static inline size_t SpaceUsedInMapEntryLong(const TypeOnMemory& value);  \
-    static inline size_t SpaceUsedInMapLong(const TypeOnMemory& value);       \
-    static inline size_t SpaceUsedInMapLong(const string& value);             \
+    static inline int SpaceUsedInMapEntry(const TypeOnMemory& value);         \
+    static inline int SpaceUsedInMap(const TypeOnMemory& value);              \
+    static inline int SpaceUsedInMap(const string& value);                    \
     static inline void AssignDefaultValue(TypeOnMemory* value);               \
     static inline const MapEntryAccessorType& DefaultIfNotInitialized(        \
         const TypeOnMemory& value, const TypeOnMemory& default_value);        \
@@ -273,7 +266,7 @@
 #undef MAP_HANDLER
 
 template <typename Type>
-inline size_t
+inline int
 MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::ByteSize(
     const MapEntryAccessorType& value) {
   return WireFormatLite::MessageSizeNoVirtual(value);
@@ -283,7 +276,7 @@
   template <typename Type>                                                     \
   inline int MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::ByteSize( \
       const MapEntryAccessorType& value) {                                     \
-    return static_cast<int>(WireFormatLite::DeclaredType##Size(value));        \
+    return WireFormatLite::DeclaredType##Size(value);                          \
   }
 
 GOOGLE_PROTOBUF_BYTE_SIZE(STRING, String)
@@ -301,7 +294,7 @@
 #define FIXED_BYTE_SIZE(FieldType, DeclaredType)                               \
   template <typename Type>                                                     \
   inline int MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::ByteSize( \
-      const MapEntryAccessorType& /* value */) {                               \
+      const MapEntryAccessorType& value) {                                     \
     return WireFormatLite::k##DeclaredType##Size;                              \
   }
 
@@ -319,9 +312,7 @@
 inline int
 MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::GetCachedSize(
     const MapEntryAccessorType& value) {
-  return static_cast<int>(
-      WireFormatLite::LengthDelimitedSize(
-          static_cast<size_t>(value.GetCachedSize())));
+  return WireFormatLite::LengthDelimitedSize(value.GetCachedSize());
 }
 
 #define GET_CACHED_SIZE(FieldType, DeclaredType)                         \
@@ -329,7 +320,7 @@
   inline int                                                             \
   MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::GetCachedSize( \
       const MapEntryAccessorType& value) {                               \
-    return static_cast<int>(WireFormatLite::DeclaredType##Size(value));  \
+    return WireFormatLite::DeclaredType##Size(value);                    \
   }
 
 GET_CACHED_SIZE(STRING, String)
@@ -348,7 +339,7 @@
   template <typename Type>                                               \
   inline int                                                             \
   MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::GetCachedSize( \
-      const MapEntryAccessorType& /* value */) {                         \
+      const MapEntryAccessorType& value) {                               \
     return WireFormatLite::k##DeclaredType##Size;                        \
   }
 
@@ -371,11 +362,9 @@
 
 template <typename Type>
 inline uint8*
-MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::InternalWriteToArray(
-    int field, const MapEntryAccessorType& value, bool deterministic,
-    uint8* target) {
-  return WireFormatLite::InternalWriteMessageToArray(field, value,
-                                                     deterministic, target);
+MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::WriteToArray(
+    int field, const MapEntryAccessorType& value, uint8* output) {
+  return WireFormatLite::WriteMessageToArray(field, value, output);
 }
 
 #define WRITE_METHOD(FieldType, DeclaredType)                                  \
@@ -387,10 +376,9 @@
   }                                                                            \
   template <typename Type>                                                     \
   inline uint8*                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
-                 Type>::InternalWriteToArray(                                  \
-      int field, const MapEntryAccessorType& value, bool, uint8* target) {     \
-    return WireFormatLite::Write##DeclaredType##ToArray(field, value, target); \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::WriteToArray(        \
+      int field, const MapEntryAccessorType& value, uint8* output) {           \
+    return WireFormatLite::Write##DeclaredType##ToArray(field, value, output); \
   }
 
 WRITE_METHOD(STRING  , String)
@@ -466,33 +454,34 @@
 }
 
 template <typename Type>
-inline size_t MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                             Type>::SpaceUsedInMapEntryLong(const Type* value) {
-  return value->SpaceUsedLong();
+inline int
+MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
+                        Type>::SpaceUsedInMapEntry(const Type* value) {
+  return value->SpaceUsed();
 }
 
 template <typename Type>
-size_t MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::SpaceUsedInMapLong(
+int MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::SpaceUsedInMap(
     const Type& value) {
-  return value.SpaceUsedLong();
+  return value.SpaceUsed();
 }
 
 template <typename Type>
 inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::Clear(
-    Type** value, Arena* /* arena */) {
+    Type** value, Arena* arena) {
   if (*value != NULL) (*value)->Clear();
 }
 template <typename Type>
 inline void
 MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
                         Type>::ClearMaybeByDefaultEnum(Type** value,
-                                                       Arena* /* arena */,
-                                                       int /* default_enum_value */) {
+                                                       Arena* arena,
+                                                       int default_enum_value) {
   if (*value != NULL) (*value)->Clear();
 }
 template <typename Type>
 inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::Merge(
-    const Type& from, Type** to, Arena* /* arena */) {
+    const Type& from, Type** to, Arena* arena) {
   (*to)->MergeFrom(from);
 }
 
@@ -505,20 +494,20 @@
 template <typename Type>
 inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
                                     Type>::AssignDefaultValue(Type** value) {
-  *value = const_cast<Type*>(Type::internal_default_instance());
+  *value = const_cast<Type*>(&Type::default_instance());
 }
 
 template <typename Type>
 inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
                                     Type>::Initialize(Type** x,
-                                                      Arena* /* arena */) {
+                                                      Arena* arena) {
   *x = NULL;
 }
 
 template <typename Type>
 inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::
-    InitializeMaybeByDefaultEnum(Type** x, int /* default_enum_value */,
-                                 Arena* /* arena */) {
+    InitializeMaybeByDefaultEnum(Type** x, int default_enum_value,
+                                 Arena* arena) {
   *x = NULL;
 }
 
@@ -554,63 +543,62 @@
                                        Type>::MapEntryAccessorType&            \
   MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
                  Type>::GetExternalReference(const TypeOnMemory& value) {      \
-    return value.Get();                                                        \
+    return value.Get(&::google::protobuf::internal::GetEmptyString());                   \
   }                                                                            \
   template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
-                 Type>::SpaceUsedInMapEntryLong(const TypeOnMemory& value) {   \
-    return sizeof(value);                                                      \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapLong(  \
+  inline int                                                                   \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapEntry( \
       const TypeOnMemory& value) {                                             \
     return sizeof(value);                                                      \
   }                                                                            \
   template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapLong(  \
-      const string& value) {                                                   \
+  inline int MapTypeHandler<WireFormatLite::TYPE_##FieldType,                  \
+                            Type>::SpaceUsedInMap(const TypeOnMemory& value) { \
+    return sizeof(value);                                                      \
+  }                                                                            \
+  template <typename Type>                                                     \
+  inline int MapTypeHandler<WireFormatLite::TYPE_##FieldType,                  \
+                            Type>::SpaceUsedInMap(const string& value) {       \
     return sizeof(value);                                                      \
   }                                                                            \
   template <typename Type>                                                     \
   inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Clear(   \
       TypeOnMemory* value, Arena* arena) {                                     \
-    value->ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),    \
-                        arena);                                                \
+    value->ClearToEmpty(&::google::protobuf::internal::GetEmptyString(), arena);         \
   }                                                                            \
   template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::         \
-      ClearMaybeByDefaultEnum(TypeOnMemory* value, Arena* arena,               \
-                              int /* default_enum */) {                        \
+  inline void                                                                  \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
+                 Type>::ClearMaybeByDefaultEnum(TypeOnMemory* value,           \
+                                                Arena* arena,                  \
+                                                int default_enum) {            \
     Clear(value, arena);                                                       \
   }                                                                            \
   template <typename Type>                                                     \
   inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Merge(   \
       const MapEntryAccessorType& from, TypeOnMemory* to, Arena* arena) {      \
-    to->Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from, arena);  \
+    to->Set(&::google::protobuf::internal::GetEmptyString(), from, arena);               \
   }                                                                            \
   template <typename Type>                                                     \
   void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::DeleteNoArena(  \
       TypeOnMemory& value) {                                                   \
-    value.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());  \
+    value.DestroyNoArena(&::google::protobuf::internal::GetEmptyString());               \
   }                                                                            \
   template <typename Type>                                                     \
   inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::AssignDefaultValue(TypeOnMemory* /* value */) {} \
+                             Type>::AssignDefaultValue(TypeOnMemory* value) {} \
   template <typename Type>                                                     \
   inline void                                                                  \
   MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Initialize(          \
-      TypeOnMemory* value, Arena* /* arena */) {                               \
-    value->UnsafeSetDefault(                                                   \
-        &::google::protobuf::internal::GetEmptyStringAlreadyInited());                   \
+      TypeOnMemory* value, Arena* arena) {                                     \
+    value->UnsafeSetDefault(&::google::protobuf::internal::GetEmptyString());            \
   }                                                                            \
   template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::         \
-      InitializeMaybeByDefaultEnum(TypeOnMemory* value,                        \
-                                   int /* default_enum_value */,               \
-                                   Arena* arena) {                             \
+  inline void                                                                  \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
+                 Type>::InitializeMaybeByDefaultEnum(TypeOnMemory* value,      \
+                                                     int default_enum_value,   \
+                                                     Arena* arena) {           \
     Initialize(value, arena);                                                  \
   }                                                                            \
   template <typename Type>                                                     \
@@ -618,8 +606,7 @@
                                  Type>::MapEntryAccessorType*                  \
   MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::EnsureMutable(       \
       TypeOnMemory* value, Arena* arena) {                                     \
-    return value->Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),  \
-                          arena);                                              \
+    return value->Mutable(&::google::protobuf::internal::GetEmptyString(), arena);       \
   }                                                                            \
   template <typename Type>                                                     \
   inline const typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,       \
@@ -627,12 +614,12 @@
   MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
                  Type>::DefaultIfNotInitialized(const TypeOnMemory& value,     \
                                                 const TypeOnMemory&            \
-                                                    /* default_value */) {     \
-    return value.Get();                                                        \
+                                                    default_value) {           \
+    return value.Get(&::google::protobuf::internal::GetEmptyString());                   \
   }                                                                            \
   template <typename Type>                                                     \
   inline bool MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::IsInitialized(const TypeOnMemory& /* value */) { \
+                             Type>::IsInitialized(const TypeOnMemory& value) { \
     return true;                                                               \
   }
 STRING_OR_BYTES_HANDLER_FUNCTIONS(STRING)
@@ -648,58 +635,59 @@
     return value;                                                              \
   }                                                                            \
   template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
-                 Type>::SpaceUsedInMapEntryLong(const TypeOnMemory& /* value */) {   \
+  inline int                                                                   \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapEntry( \
+      const TypeOnMemory& value) {                                             \
     return 0;                                                                  \
   }                                                                            \
   template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapLong(  \
-      const TypeOnMemory& /* value */) {                                       \
+  inline int MapTypeHandler<WireFormatLite::TYPE_##FieldType,                  \
+                            Type>::SpaceUsedInMap(const TypeOnMemory& value) { \
     return sizeof(Type);                                                       \
   }                                                                            \
   template <typename Type>                                                     \
   inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Clear(   \
-      TypeOnMemory* value, Arena* /* arena */) {                               \
+      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) {                        \
+  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 */) {                                                    \
+      const MapEntryAccessorType& from, TypeOnMemory* to, Arena* arena) {      \
     *to = from;                                                                \
   }                                                                            \
   template <typename Type>                                                     \
   inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::DeleteNoArena(TypeOnMemory& /* x */) {}    \
+                             Type>::DeleteNoArena(TypeOnMemory& x) {}          \
   template <typename Type>                                                     \
   inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::AssignDefaultValue(TypeOnMemory* /* value */) {} \
+                             Type>::AssignDefaultValue(TypeOnMemory* value) {} \
   template <typename Type>                                                     \
   inline void                                                                  \
   MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Initialize(          \
-      TypeOnMemory* value, Arena* /* arena */) {                               \
+      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 */) {                       \
+  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 */) {                               \
+      TypeOnMemory* value, Arena* arena) {                                     \
     return value;                                                              \
   }                                                                            \
   template <typename Type>                                                     \
@@ -708,12 +696,12 @@
   MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
                  Type>::DefaultIfNotInitialized(const TypeOnMemory& value,     \
                                                 const TypeOnMemory&            \
-                                                   /* default_value */) {      \
+                                                    default_value) {           \
     return value;                                                              \
   }                                                                            \
   template <typename Type>                                                     \
   inline bool MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::IsInitialized(const TypeOnMemory& /* value */) { \
+                             Type>::IsInitialized(const TypeOnMemory& value) { \
     return true;                                                               \
   }
 PRIMITIVE_HANDLER_FUNCTIONS(INT64)
diff --git a/src/google/protobuf/map_unittest.proto b/src/google/protobuf/map_unittest.proto
index 836dc10..aea1e8c 100644
--- a/src/google/protobuf/map_unittest.proto
+++ b/src/google/protobuf/map_unittest.proto
@@ -60,7 +60,6 @@
   map<int32   , MapEnum > map_int32_enum        = 16;
   map<int32   , ForeignMessage> map_int32_foreign_message = 17;
   map<string  , ForeignMessage> map_string_foreign_message = 18;
-  map<int32   , TestAllTypes> map_int32_all_types = 19;
 }
 
 message TestMapSubmessage {
@@ -84,7 +83,7 @@
   MAP_ENUM_BAZ = 2;
 }
 
-// Test embedded message with required fields
+// Test embeded message with required fields
 message TestRequiredMessageMap {
   map<int32, TestRequired> map_field = 1;
 }
diff --git a/src/google/protobuf/message.cc b/src/google/protobuf/message.cc
index 42ec033..d62ca79 100644
--- a/src/google/protobuf/message.cc
+++ b/src/google/protobuf/message.cc
@@ -46,9 +46,9 @@
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.pb.h>
+#include <google/protobuf/map_field.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map_field.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
 #include <google/protobuf/stubs/strutil.h>
@@ -62,6 +62,8 @@
 using internal::WireFormat;
 using internal::ReflectionOps;
 
+Message::~Message() {}
+
 void Message::MergeFrom(const Message& from) {
   const Descriptor* descriptor = GetDescriptor();
   GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor)
@@ -96,12 +98,12 @@
   return ReflectionOps::IsInitialized(*this);
 }
 
-void Message::FindInitializationErrors(std::vector<string>* errors) const {
+void Message::FindInitializationErrors(vector<string>* errors) const {
   return ReflectionOps::FindInitializationErrors(*this, "", errors);
 }
 
 string Message::InitializationErrorString() const {
-  std::vector<string> errors;
+  vector<string> errors;
   FindInitializationErrors(&errors);
   return Join(errors, ", ");
 }
@@ -130,12 +132,12 @@
   return ParsePartialFromZeroCopyStream(&input) && input.GetErrno() == 0;
 }
 
-bool Message::ParseFromIstream(std::istream* input) {
+bool Message::ParseFromIstream(istream* input) {
   io::IstreamInputStream zero_copy_input(input);
   return ParseFromZeroCopyStream(&zero_copy_input) && input->eof();
 }
 
-bool Message::ParsePartialFromIstream(std::istream* input) {
+bool Message::ParsePartialFromIstream(istream* input) {
   io::IstreamInputStream zero_copy_input(input);
   return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof();
 }
@@ -143,18 +145,12 @@
 
 void Message::SerializeWithCachedSizes(
     io::CodedOutputStream* output) const {
-  const internal::SerializationTable* table =
-      static_cast<const internal::SerializationTable*>(InternalGetTable());
-  if (table == 0) {
-    WireFormat::SerializeWithCachedSizes(*this, GetCachedSize(), output);
-  } else {
-    internal::TableSerialize(*this, table, output);
-  }
+  WireFormat::SerializeWithCachedSizes(*this, GetCachedSize(), output);
 }
 
-size_t Message::ByteSizeLong() const {
-  size_t size = WireFormat::ByteSize(*this);
-  SetCachedSize(internal::ToCachedSize(size));
+int Message::ByteSize() const {
+  int size = WireFormat::ByteSize(*this);
+  SetCachedSize(size);
   return size;
 }
 
@@ -164,21 +160,21 @@
                 "Must implement one or the other.";
 }
 
-size_t Message::SpaceUsedLong() const {
-  return GetReflection()->SpaceUsedLong(*this);
+int Message::SpaceUsed() const {
+  return GetReflection()->SpaceUsed(*this);
 }
 
 bool Message::SerializeToFileDescriptor(int file_descriptor) const {
   io::FileOutputStream output(file_descriptor);
-  return SerializeToZeroCopyStream(&output) && output.Flush();
+  return SerializeToZeroCopyStream(&output);
 }
 
 bool Message::SerializePartialToFileDescriptor(int file_descriptor) const {
   io::FileOutputStream output(file_descriptor);
-  return SerializePartialToZeroCopyStream(&output) && output.Flush();
+  return SerializePartialToZeroCopyStream(&output);
 }
 
-bool Message::SerializeToOstream(std::ostream* output) const {
+bool Message::SerializeToOstream(ostream* output) const {
   {
     io::OstreamOutputStream zero_copy_output(output);
     if (!SerializeToZeroCopyStream(&zero_copy_output)) return false;
@@ -186,7 +182,7 @@
   return output->good();
 }
 
-bool Message::SerializePartialToOstream(std::ostream* output) const {
+bool Message::SerializePartialToOstream(ostream* output) const {
   io::OstreamOutputStream zero_copy_output(output);
   return SerializePartialToZeroCopyStream(&zero_copy_output);
 }
@@ -197,10 +193,6 @@
 
 Reflection::~Reflection() {}
 
-void Reflection::AddAllocatedMessage(Message* /* message */,
-                                     const FieldDescriptor* /*field */,
-                                     Message* /* new_entry */) const {}
-
 #define HANDLE_TYPE(TYPE, CPPTYPE, CTYPE)                             \
 template<>                                                            \
 const RepeatedField<TYPE>& Reflection::GetRepeatedField<TYPE>(        \
@@ -235,6 +227,38 @@
 }
 
 
+// Default EnumValue API implementations. Real reflection implementations should
+// override these. However, there are several legacy implementations that do
+// not, and cannot easily be changed at the same time as the Reflection API, so
+// we provide these for now.
+// TODO: Remove these once all Reflection implementations are updated.
+int Reflection::GetEnumValue(const Message& message,
+                             const FieldDescriptor* field) const {
+  GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API.";
+  return 0;
+}
+void Reflection::SetEnumValue(Message* message,
+                  const FieldDescriptor* field,
+                  int value) const {
+  GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API.";
+}
+int Reflection::GetRepeatedEnumValue(
+    const Message& message,
+    const FieldDescriptor* field, int index) const {
+  GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API.";
+  return 0;
+}
+void Reflection::SetRepeatedEnumValue(Message* message,
+                                  const FieldDescriptor* field, int index,
+                                  int value) const {
+  GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API.";
+}
+void Reflection::AddEnumValue(Message* message,
+                  const FieldDescriptor* field,
+                  int value) const {
+  GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API.";
+}
+
 MapIterator Reflection::MapBegin(
     Message* message,
     const FieldDescriptor* field) const {
@@ -277,8 +301,8 @@
   hash_map<const char*, RegistrationFunc*,
            hash<const char*>, streq> file_map_;
 
-  Mutex mutex_;
   // Initialized lazily, so requires locking.
+  Mutex mutex_;
   hash_map<const Descriptor*, const Message*> type_map_;
 };
 
@@ -461,27 +485,27 @@
 
 namespace internal {
 template<>
-#if defined(_MSC_VER) && (_MSC_VER >= 1800)
-// Note: force noinline to workaround MSVC compiler bug with /Zc:inline, issue #240
-GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+// Note: force noinline to workaround MSVC 2015 compiler bug, issue #240
+GOOGLE_ATTRIBUTE_NOINLINE
 #endif
 Message* GenericTypeHandler<Message>::NewFromPrototype(
     const Message* prototype, google::protobuf::Arena* arena) {
   return prototype->New(arena);
 }
 template<>
-#if defined(_MSC_VER) && (_MSC_VER >= 1800)
-// Note: force noinline to workaround MSVC compiler bug with /Zc:inline, issue #240
-GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+// Note: force noinline to workaround MSVC 2015 compiler bug, issue #240
+GOOGLE_ATTRIBUTE_NOINLINE
 #endif
 google::protobuf::Arena* GenericTypeHandler<Message>::GetArena(
     Message* value) {
   return value->GetArena();
 }
 template<>
-#if defined(_MSC_VER) && (_MSC_VER >= 1800)
-// Note: force noinline to workaround MSVC compiler bug with /Zc:inline, issue #240
-GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+// Note: force noinline to workaround MSVC 2015 compiler bug, issue #240
+GOOGLE_ATTRIBUTE_NOINLINE
 #endif
 void* GenericTypeHandler<Message>::GetMaybeArenaPointer(
     Message* value) {
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index ab01859..a4d9277 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -154,13 +154,6 @@
 }
 
 
-namespace internal {
-class ReflectionOps;     // reflection_ops.h
-class MapKeySorter;      // wire_format.cc
-class WireFormat;        // wire_format.h
-class MapFieldReflectionTest;  // map_test.cc
-}
-
 template<typename T>
 class RepeatedField;     // repeated_field.h
 
@@ -186,7 +179,7 @@
 class LIBPROTOBUF_EXPORT Message : public MessageLite {
  public:
   inline Message() {}
-  virtual ~Message() {}
+  virtual ~Message();
 
   // Basic Operations ------------------------------------------------
 
@@ -252,10 +245,7 @@
   // using reflection (rather than the generated code implementation for
   // ByteSize()). Like ByteSize(), its CPU time is linear in the number of
   // fields defined for the proto.
-  virtual size_t SpaceUsedLong() const;
-
-  PROTOBUF_RUNTIME_DEPRECATED("Please use SpaceUsedLong() instead")
-  int SpaceUsed() const { return internal::ToIntSize(SpaceUsedLong()); }
+  virtual int SpaceUsed() const;
 
   // Debugging & Testing----------------------------------------------
 
@@ -281,10 +271,10 @@
   bool ParsePartialFromFileDescriptor(int file_descriptor);
   // Parse a protocol buffer from a C++ istream.  If successful, the entire
   // input will be consumed.
-  bool ParseFromIstream(std::istream* input);
+  bool ParseFromIstream(istream* input);
   // Like ParseFromIstream(), but accepts messages that are missing
   // required fields.
-  bool ParsePartialFromIstream(std::istream* input);
+  bool ParsePartialFromIstream(istream* input);
 
   // Serialize the message and write it to the given file descriptor.  All
   // required fields must be set.
@@ -293,9 +283,9 @@
   bool SerializePartialToFileDescriptor(int file_descriptor) const;
   // Serialize the message and write it to the given C++ ostream.  All
   // required fields must be set.
-  bool SerializeToOstream(std::ostream* output) const;
+  bool SerializeToOstream(ostream* output) const;
   // Like SerializeToOstream(), but allows missing required fields.
-  bool SerializePartialToOstream(std::ostream* output) const;
+  bool SerializePartialToOstream(ostream* output) const;
 
 
   // Reflection-based methods ----------------------------------------
@@ -307,7 +297,7 @@
   virtual bool IsInitialized() const;
   virtual void CheckTypeAndMergeFrom(const MessageLite& other);
   virtual bool MergePartialFromCodedStream(io::CodedInputStream* input);
-  virtual size_t ByteSizeLong() const;
+  virtual int ByteSize() const;
   virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const;
 
  private:
@@ -327,19 +317,18 @@
   // Typedef for backwards-compatibility.
   typedef google::protobuf::Reflection Reflection;
 
-  // Get a non-owning pointer to a Descriptor for this message's type.  This
-  // describes what fields the message contains, the types of those fields, etc.
-  // This object remains property of the Message.
+  // Get a Descriptor for this message's type.  This describes what
+  // fields the message contains, the types of those fields, etc.
   const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; }
 
-  // Get a non-owning pointer to the Reflection interface for this Message,
-  // which can be used to read and modify the fields of the Message dynamically
-  // (in other words, without knowing the message type at compile time).  This
-  // object remains property of the Message.
+  // Get the Reflection interface for this Message, which can be used to
+  // read and modify the fields of the Message dynamically (in other words,
+  // without knowing the message type at compile time).  This object remains
+  // property of the Message.
   //
   // This method remains virtual in case a subclass does not implement
   // reflection and wants to override the default behavior.
-  virtual const Reflection* GetReflection() const PROTOBUF_FINAL {
+  virtual const Reflection* GetReflection() const {
     return GetMetadata().reflection;
   }
 
@@ -428,12 +417,7 @@
   virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0;
 
   // Estimate the amount of memory used by the message object.
-  virtual size_t SpaceUsedLong(const Message& message) const = 0;
-
-  PROTOBUF_RUNTIME_DEPRECATED("Please use SpaceUsedLong() instead")
-  int SpaceUsed(const Message& message) const {
-    return internal::ToIntSize(SpaceUsedLong(message));
-  }
+  virtual int SpaceUsed(const Message& message) const = 0;
 
   // Check if the given non-repeated field is set.
   virtual bool HasField(const Message& message,
@@ -497,14 +481,11 @@
                             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).
-  // Singular fields will only be listed if HasField(field) would return true
-  // and repeated fields will only be listed if FieldSize(field) would return
-  // non-zero.  Fields (both normal fields and extension fields) will be listed
-  // ordered by field number.
-  // Use Reflection::GetUnknownFields() or message.unknown_fields() to also get
-  // access to fields/extensions unknown to the parser.
+  // List all fields of the message which are currently set.  This includes
+  // extensions.  Singular fields will only be listed if HasField(field) would
+  // return true and repeated fields will only be listed if FieldSize(field)
+  // would return non-zero.  Fields (both normal fields and extension fields)
+  // will be listed ordered by field number.
   virtual void ListFields(
       const Message& message,
       std::vector<const FieldDescriptor*>* output) const = 0;
@@ -538,7 +519,7 @@
   // 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;
+      const Message& message, const FieldDescriptor* field) const;
 
   // See MutableMessage() for the meaning of the "factory" parameter.
   virtual const Message& GetMessage(const Message& message,
@@ -594,7 +575,7 @@
   // messages with new unknown-enum-value semantics.
   virtual void SetEnumValue(Message* message,
                             const FieldDescriptor* field,
-                            int value) const = 0;
+                            int value) const;
 
   // Get a mutable pointer to a field with a message type.  If a MessageFactory
   // is provided, it will be used to construct instances of the sub-message;
@@ -604,8 +585,8 @@
   // If you have no idea what that meant, then you probably don't need to worry
   // about it (don't provide a MessageFactory).  WARNING:  If the
   // FieldDescriptor is for a compiled-in extension, then
-  // factory->GetPrototype(field->message_type()) MUST return an instance of
-  // the compiled-in class for this type, NOT DynamicMessage.
+  // factory->GetPrototype(field->message_type() MUST return an instance of the
+  // compiled-in class for this type, NOT DynamicMessage.
   virtual Message* MutableMessage(Message* message,
                                   const FieldDescriptor* field,
                                   MessageFactory* factory = NULL) const = 0;
@@ -665,7 +646,7 @@
   // for a message.)
   virtual int GetRepeatedEnumValue(
       const Message& message,
-      const FieldDescriptor* field, int index) const = 0;
+      const FieldDescriptor* field, int index) const;
   virtual const Message& GetRepeatedMessage(
       const Message& message,
       const FieldDescriptor* field, int index) const = 0;
@@ -712,7 +693,7 @@
   // messages with new unknown-enum-value semantics.
   virtual void SetRepeatedEnumValue(Message* message,
                                     const FieldDescriptor* field, int index,
-                                    int value) const = 0;
+                                    int value) const;
   // Get a mutable pointer to an element of a repeated field with a message
   // type.
   virtual Message* MutableRepeatedMessage(
@@ -748,7 +729,7 @@
   // messages with new unknown-enum-value semantics.
   virtual void AddEnumValue(Message* message,
                             const FieldDescriptor* field,
-                            int value) const = 0;
+                            int value) const;
   // See MutableMessage() for comments on the "factory" parameter.
   virtual Message* AddMessage(Message* message,
                               const FieldDescriptor* field,
@@ -758,9 +739,9 @@
   // specifyed by 'field' passing ownership to the message.
   // TODO(tmarek): Make virtual after all subclasses have been
   // updated.
-  virtual void AddAllocatedMessage(Message* message,
-                                   const FieldDescriptor* field,
-                                   Message* new_entry) const;
+  virtual void AddAllocatedMessage(Message* /* message */,
+                                   const FieldDescriptor* /*field */,
+                                   Message* /* new_entry */) const {}
 
 
   // Get a RepeatedFieldRef object that can be used to read the underlying
@@ -867,31 +848,34 @@
   // downgrade to a compatible value or use the UnknownFieldSet if not. For
   // example:
   //
-  //   int new_value = GetValueFromApplicationLogic();
-  //   if (reflection->SupportsUnknownEnumValues()) {
+  // int new_value = GetValueFromApplicationLogic();
+  // if (reflection->SupportsUnknownEnumValues()) {
   //     reflection->SetEnumValue(message, field, new_value);
-  //   } else {
+  // } else {
   //     if (field_descriptor->enum_type()->
-  //             FindValueByNumber(new_value) != NULL) {
-  //       reflection->SetEnumValue(message, field, new_value);
+  //             FindValueByNumver(new_value) != NULL) {
+  //         reflection->SetEnumValue(message, field, new_value);
   //     } else if (emit_unknown_enum_values) {
-  //       reflection->MutableUnknownFields(message)->AddVarint(
-  //           field->number(), new_value);
+  //         reflection->MutableUnknownFields(message)->AddVarint(
+  //             field->number(),
+  //             new_value);
   //     } else {
-  //       // convert value to a compatible/default value.
-  //       new_value = CompatibleDowngrade(new_value);
-  //       reflection->SetEnumValue(message, field, new_value);
+  //         // convert value to a compatible/default value.
+  //         new_value = CompatibleDowngrade(new_value);
+  //         reflection->SetEnumValue(message, field, new_value);
   //     }
-  //   }
+  // }
   virtual bool SupportsUnknownEnumValues() const { return false; }
 
   // Returns the MessageFactory associated with this message.  This can be
   // useful for determining if a message is a generated message or not, for
   // example:
-  //   if (message->GetReflection()->GetMessageFactory() ==
-  //       google::protobuf::MessageFactory::generated_factory()) {
-  //     // This is a generated message.
-  //   }
+  //
+  // if (message->GetReflection()->GetMessageFactory() ==
+  //     google::protobuf::MessageFactory::generated_factory()) {
+  //   // This is a generated message.
+  // }
+  //
   // It can also be used to create more messages of this type, though
   // Message::New() is an easier way to accomplish this.
   virtual MessageFactory* GetMessageFactory() const;
@@ -926,7 +910,7 @@
 
   // Returns a raw pointer to the repeated field
   //
-  // "cpp_type" and "message_type" are deduced from the type parameter T passed
+  // "cpp_type" and "message_type" are decuded from the type parameter T passed
   // to Get(Mutable)RepeatedFieldRef. If T is a generated message type,
   // "message_type" should be set to its descriptor. Otherwise "message_type"
   // should be set to NULL. Implementations of this method should check whether
@@ -949,10 +933,6 @@
   template<typename T, typename Enable>
   friend class MutableRepeatedFieldRef;
   friend class ::google::protobuf::python::MapReflectionFriend;
-  friend class internal::MapFieldReflectionTest;
-  friend class internal::MapKeySorter;
-  friend class internal::WireFormat;
-  friend class internal::ReflectionOps;
 
   // Special version for specialized implementations of string.  We can't call
   // MutableRawRepeatedField directly here because we don't have access to
@@ -967,7 +947,7 @@
   // TODO(jieluo) - make the map APIs pure virtual after updating
   // all the subclasses.
   // Returns true if key is in map. Returns false if key is not in map field.
-  virtual bool ContainsMapKey(const Message& /* message */,
+  virtual bool ContainsMapKey(const Message& /* message*/,
                               const FieldDescriptor* /* field */,
                               const MapKey& /* key */) const {
     return false;
@@ -985,7 +965,7 @@
 
   // Delete and returns true if key is in the map field. Returns false
   // otherwise.
-  virtual bool DeleteMapValue(Message* /* message */,
+  virtual bool DeleteMapValue(Message* /* mesage */,
                               const FieldDescriptor* /* field */,
                               const MapKey& /* key */) const {
     return false;
diff --git a/src/google/protobuf/message_lite.cc b/src/google/protobuf/message_lite.cc
index 123b142..9d7b64f 100644
--- a/src/google/protobuf/message_lite.cc
+++ b/src/google/protobuf/message_lite.cc
@@ -33,11 +33,8 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-#include <climits>
-
-#include <google/protobuf/arena.h>
-#include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/message_lite.h>
+#include <google/protobuf/arena.h>
 #include <google/protobuf/repeated_field.h>
 #include <string>
 #include <google/protobuf/stubs/logging.h>
@@ -49,6 +46,8 @@
 namespace google {
 namespace protobuf {
 
+MessageLite::~MessageLite() {}
+
 string MessageLite::InitializationErrorString() const {
   return "(cannot determine missing fields for lite message)";
 }
@@ -61,9 +60,9 @@
 // protobuf implementation but is more likely caused by concurrent modification
 // of the message.  This function attempts to distinguish between the two and
 // provide a useful error message.
-void ByteSizeConsistencyError(size_t byte_size_before_serialization,
-                              size_t byte_size_after_serialization,
-                              size_t bytes_produced_by_serialization,
+void ByteSizeConsistencyError(int byte_size_before_serialization,
+                              int byte_size_after_serialization,
+                              int bytes_produced_by_serialization,
                               const MessageLite& message) {
   GOOGLE_CHECK_EQ(byte_size_before_serialization, byte_size_after_serialization)
       << message.GetTypeName()
@@ -103,15 +102,15 @@
 // call MergePartialFromCodedStream().  However, when parsing very small
 // messages, every function call introduces significant overhead.  To avoid
 // this without reproducing code, we use these forced-inline helpers.
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineMergeFromCodedStream(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InlineMergeFromCodedStream(
     io::CodedInputStream* input, MessageLite* message);
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParseFromCodedStream(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InlineParseFromCodedStream(
     io::CodedInputStream* input, MessageLite* message);
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParsePartialFromCodedStream(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InlineParsePartialFromCodedStream(
     io::CodedInputStream* input, MessageLite* message);
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParseFromArray(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InlineParseFromArray(
     const void* data, int size, MessageLite* message);
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParsePartialFromArray(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InlineParsePartialFromArray(
     const void* data, int size, MessageLite* message);
 
 inline bool InlineMergeFromCodedStream(io::CodedInputStream* input,
@@ -223,8 +222,14 @@
 // ===================================================================
 
 uint8* MessageLite::SerializeWithCachedSizesToArray(uint8* target) const {
-  return InternalSerializeWithCachedSizesToArray(
-      io::CodedOutputStream::IsDefaultSerializationDeterministic(), target);
+  // We only optimize this when using optimize_for = SPEED.  In other cases
+  // we just use the CodedOutputStream path.
+  int size = GetCachedSize();
+  io::ArrayOutputStream out(target, size);
+  io::CodedOutputStream coded_out(&out);
+  SerializeWithCachedSizes(&coded_out);
+  GOOGLE_CHECK(!coded_out.HadError());
+  return target + size;
 }
 
 bool MessageLite::SerializeToCodedStream(io::CodedOutputStream* output) const {
@@ -234,18 +239,18 @@
 
 bool MessageLite::SerializePartialToCodedStream(
     io::CodedOutputStream* output) const {
-  const size_t size = ByteSizeLong();  // Force size to be cached.
-  if (size > INT_MAX) {
-    GOOGLE_LOG(ERROR) << "Exceeded maximum protobuf size of 2GB: " << size;
+  const int size = ByteSize();  // Force size to be cached.
+  if (size < 0) {
+    // Messages >2G cannot be serialized due to overflow computing ByteSize.
+    GOOGLE_LOG(ERROR) << "Error computing ByteSize (possible overflow?).";
     return false;
   }
 
   uint8* buffer = output->GetDirectBufferForNBytesAndAdvance(size);
   if (buffer != NULL) {
-    uint8* end = InternalSerializeWithCachedSizesToArray(
-        output->IsSerializationDeterministic(), buffer);
+    uint8* end = SerializeWithCachedSizesToArray(buffer);
     if (end - buffer != size) {
-      ByteSizeConsistencyError(size, ByteSizeLong(), end - buffer, *this);
+      ByteSizeConsistencyError(size, ByteSize(), end - buffer, *this);
     }
     return true;
   } else {
@@ -257,7 +262,7 @@
     int final_byte_count = output->ByteCount();
 
     if (final_byte_count - original_byte_count != size) {
-      ByteSizeConsistencyError(size, ByteSizeLong(),
+      ByteSizeConsistencyError(size, ByteSize(),
                                final_byte_count - original_byte_count, *this);
     }
 
@@ -283,10 +288,11 @@
 }
 
 bool MessageLite::AppendPartialToString(string* output) const {
-  size_t old_size = output->size();
-  size_t byte_size = ByteSizeLong();
-  if (byte_size > INT_MAX) {
-    GOOGLE_LOG(ERROR) << "Exceeded maximum protobuf size of 2GB: " << byte_size;
+  int old_size = output->size();
+  int byte_size = ByteSize();
+  if (byte_size < 0) {
+    // Messages >2G cannot be serialized due to overflow computing ByteSize.
+    GOOGLE_LOG(ERROR) << "Error computing ByteSize (possible overflow?).";
     return false;
   }
 
@@ -295,7 +301,7 @@
       reinterpret_cast<uint8*>(io::mutable_string_data(output) + old_size);
   uint8* end = SerializeWithCachedSizesToArray(start);
   if (end - start != byte_size) {
-    ByteSizeConsistencyError(byte_size, ByteSizeLong(), end - start, *this);
+    ByteSizeConsistencyError(byte_size, ByteSize(), end - start, *this);
   }
   return true;
 }
@@ -316,12 +322,12 @@
 }
 
 bool MessageLite::SerializePartialToArray(void* data, int size) const {
-  int byte_size = ByteSizeLong();
+  int byte_size = ByteSize();
   if (size < byte_size) return false;
   uint8* start = reinterpret_cast<uint8*>(data);
   uint8* end = SerializeWithCachedSizesToArray(start);
   if (end - start != byte_size) {
-    ByteSizeConsistencyError(byte_size, ByteSizeLong(), end - start, *this);
+    ByteSizeConsistencyError(byte_size, ByteSize(), end - start, *this);
   }
   return true;
 }
@@ -344,39 +350,6 @@
   return output;
 }
 
-void MessageLite::SerializeWithCachedSizes(
-    io::CodedOutputStream* output) const {
-  GOOGLE_DCHECK(InternalGetTable());
-  internal::TableSerialize(
-      *this,
-      static_cast<const internal::SerializationTable*>(InternalGetTable()),
-      output);
-}
-
-// The table driven code optimizes the case that the CodedOutputStream buffer
-// is large enough to serialize into it directly.
-// If the proto is optimized for speed, this method will be overridden by
-// generated code for maximum speed. If the proto is optimized for size or
-// is lite, then we need to specialize this to avoid infinite recursion.
-uint8* MessageLite::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, uint8* target) const {
-  const internal::SerializationTable* table =
-      static_cast<const internal::SerializationTable*>(InternalGetTable());
-  if (table == NULL) {
-    // We only optimize this when using optimize_for = SPEED.  In other cases
-    // we just use the CodedOutputStream path.
-    int size = GetCachedSize();
-    io::ArrayOutputStream out(target, size);
-    io::CodedOutputStream coded_out(&out);
-    coded_out.SetSerializationDeterministic(deterministic);
-    SerializeWithCachedSizes(&coded_out);
-    GOOGLE_CHECK(!coded_out.HadError());
-    return target + size;
-  } else {
-    return internal::TableSerializeToArray(*this, table, deterministic, target);
-  }
-}
-
 namespace internal {
 template<>
 MessageLite* GenericTypeHandler<MessageLite>::NewFromPrototype(
@@ -393,14 +366,6 @@
                                               string* to) {
   *to = from;
 }
-
-bool proto3_preserve_unknown_ = true;
-
-void SetProto3PreserveUnknownsDefault(bool preserve) {
-  proto3_preserve_unknown_ = preserve;
-}
-
-
 }  // namespace internal
 
 }  // namespace protobuf
diff --git a/src/google/protobuf/message_lite.h b/src/google/protobuf/message_lite.h
index 5cd6bab..4c16f4c 100644
--- a/src/google/protobuf/message_lite.h
+++ b/src/google/protobuf/message_lite.h
@@ -39,114 +39,18 @@
 #ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__
 #define GOOGLE_PROTOBUF_MESSAGE_LITE_H__
 
-#include <climits>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/stubs/port.h>
+
 
 namespace google {
 namespace protobuf {
-class Arena;
+  class Arena;
 namespace io {
-class CodedInputStream;
-class CodedOutputStream;
-class ZeroCopyInputStream;
-class ZeroCopyOutputStream;
+  class CodedInputStream;
+  class CodedOutputStream;
+  class ZeroCopyInputStream;
+  class ZeroCopyOutputStream;
 }
-namespace internal {
-
-class WireFormatLite;
-
-#ifndef SWIG
-// We compute sizes as size_t but cache them as int.  This function converts a
-// computed size to a cached size.  Since we don't proceed with serialization
-// if the total size was > INT_MAX, it is not important what this function
-// returns for inputs > INT_MAX.  However this case should not error or
-// GOOGLE_CHECK-fail, because the full size_t resolution is still returned from
-// ByteSizeLong() and checked against INT_MAX; we can catch the overflow
-// there.
-inline int ToCachedSize(size_t size) { return static_cast<int>(size); }
-
-// We mainly calculate sizes in terms of size_t, but some functions that
-// compute sizes return "int".  These int sizes are expected to always be
-// positive. This function is more efficient than casting an int to size_t
-// directly on 64-bit platforms because it avoids making the compiler emit a
-// sign extending instruction, which we don't want and don't want to pay for.
-inline size_t FromIntSize(int size) {
-  // Convert to unsigned before widening so sign extension is not necessary.
-  return static_cast<unsigned int>(size);
-}
-
-// For cases where a legacy function returns an integer size.  We GOOGLE_DCHECK()
-// that the conversion will fit within an integer; if this is false then we
-// are losing information.
-inline int ToIntSize(size_t size) {
-  GOOGLE_DCHECK_LE(size, static_cast<size_t>(INT_MAX));
-  return static_cast<int>(size);
-}
-
-// This type wraps a variable whose constructor and destructor are explicitly
-// called. It is particularly useful for a global variable, without its
-// constructor and destructor run on start and end of the program lifetime.
-// This circumvents the initial construction order fiasco, while keeping
-// the address of the empty string a compile time constant.
-//
-// Pay special attention to the initialization state of the object.
-// 1. The object is "uninitialized" to begin with.
-// 2. Call DefaultConstruct() only if the object is uninitialized.
-//    After the call, the object becomes "initialized".
-// 3. Call get() and get_mutable() only if the object is initialized.
-// 4. Call Destruct() only if the object is initialized.
-//    After the call, the object becomes uninitialized.
-template <typename T>
-class ExplicitlyConstructed {
- public:
-  void DefaultConstruct() {
-    new (&union_) T();
-  }
-
-  void Destruct() {
-    get_mutable()->~T();
-  }
-
-#if LANG_CXX11
-  constexpr
-#endif
-      const T&
-      get() const {
-    return reinterpret_cast<const T&>(union_);
-  }
-  T* get_mutable() { return reinterpret_cast<T*>(&union_); }
-
- private:
-  // Prefer c++14 aligned_storage, but for compatibility this will do.
-  union AlignedUnion {
-    char space[sizeof(T)];
-    int64 align_to_int64;
-    void* align_to_ptr;
-  } union_;
-};
-
-// Default empty string object. Don't use this directly. Instead, call
-// GetEmptyString() to get the reference.
-extern ExplicitlyConstructed< ::std::string> fixed_address_empty_string;
-LIBPROTOBUF_EXPORT extern ProtobufOnceType empty_string_once_init_;
-LIBPROTOBUF_EXPORT void InitEmptyString();
-
-
-LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyStringAlreadyInited() {
-  return fixed_address_empty_string.get();
-}
-
-LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyString() {
-  ::google::protobuf::GoogleOnceInit(&empty_string_once_init_, &InitEmptyString);
-  return GetEmptyStringAlreadyInited();
-}
-
-LIBPROTOBUF_EXPORT size_t StringSpaceUsedExcludingSelfLong(const string& str);
-#endif  // SWIG
-}  // namespace internal
 
 // Interface to light weight protocol messages.
 //
@@ -174,7 +78,7 @@
 class LIBPROTOBUF_EXPORT MessageLite {
  public:
   inline MessageLite() {}
-  virtual ~MessageLite() {}
+  virtual ~MessageLite();
 
   // Basic Operations ------------------------------------------------
 
@@ -192,19 +96,18 @@
   // Get the arena, if any, associated with this message. Virtual method
   // required for generic operations but most arena-related operations should
   // use the GetArenaNoVirtual() generated-code method. Default implementation
-  // to reduce code size by avoiding the need for per-type implementations
-  // when types do not implement arena support.
+  // to reduce code size by avoiding the need for per-type implementations when
+  // types do not implement arena support.
   virtual ::google::protobuf::Arena* GetArena() const { return NULL; }
 
-  // Get a pointer that may be equal to this message's arena, or may not be.
-  // If the value returned by this method is equal to some arena pointer, then
-  // this message is on that arena; however, if this message is on some arena,
-  // this method may or may not return that arena's pointer. As a tradeoff,
-  // this method may be more efficient than GetArena(). The intent is to allow
-  // underlying representations that use e.g. tagged pointers to sometimes
-  // store the arena pointer directly, and sometimes in a more indirect way,
-  // and allow a fastpath comparison against the arena pointer when it's easy
-  // to obtain.
+  // Get a pointer that may be equal to this message's arena, or may not be. If
+  // the value returned by this method is equal to some arena pointer, then this
+  // message is on that arena; however, if this message is on some arena, this
+  // method may or may not return that arena's pointer. As a tradeoff, this
+  // method may be more efficient than GetArena(). The intent is to allow
+  // underlying representations that use e.g. tagged pointers to sometimes store
+  // the arena pointer directly, and sometimes in a more indirect way, and allow
+  // a fastpath comparison against the arena pointer when it's easy to obtain.
   virtual void* GetMaybeArenaPointer() const { return GetArena(); }
 
   // Clear all fields of the message and set them to their default values.
@@ -222,20 +125,19 @@
   // for full messages.  See message.h.
   virtual string InitializationErrorString() const;
 
-  // If |other| is the exact same class as this, calls MergeFrom(). Otherwise,
+  // If |other| is the exact same class as this, calls MergeFrom().  Otherwise,
   // results are undefined (probably crash).
   virtual void CheckTypeAndMergeFrom(const MessageLite& other) = 0;
 
   // Parsing ---------------------------------------------------------
   // Methods for parsing in protocol buffer format.  Most of these are
-  // just simple wrappers around MergeFromCodedStream().  Clear() will be
-  // called before merging the input.
+  // just simple wrappers around MergeFromCodedStream().  Clear() will be called
+  // before merging the input.
 
-  // Fill the message with a protocol buffer parsed from the given input
-  // stream. Returns false on a read error or if the input is in the wrong
-  // format.  A successful return does not indicate the entire input is
-  // consumed, ensure you call ConsumedEntireMessage() to check that if
-  // applicable.
+  // Fill the message with a protocol buffer parsed from the given input stream.
+  // Returns false on a read error or if the input is in the wrong format.  A
+  // successful return does not indicate the entire input is consumed, ensure
+  // you call ConsumedEntireMessage() to check that if applicable.
   bool ParseFromCodedStream(io::CodedInputStream* input);
   // Like ParseFromCodedStream(), but accepts messages that are missing
   // required fields.
@@ -334,34 +236,22 @@
   bool AppendPartialToString(string* output) const;
 
   // Computes the serialized size of the message.  This recursively calls
-  // ByteSizeLong() on all embedded messages.
+  // ByteSize() on all embedded messages.  If a subclass does not override
+  // this, it MUST override SetCachedSize().
   //
-  // ByteSizeLong() is generally linear in the number of fields defined for the
+  // ByteSize() is generally linear in the number of fields defined for the
   // proto.
-  virtual size_t ByteSizeLong() const = 0;
+  virtual int ByteSize() const = 0;
 
-  // Legacy ByteSize() API.
-  PROTOBUF_RUNTIME_DEPRECATED("Please use ByteSizeLong() instead")
-  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.
+  // Serializes the message without recomputing the size.  The message must
+  // not have changed since the last call to ByteSize(); if it has, the results
+  // are undefined.
   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
-  // at some future time.  Unfortunately the implementation of the "friend"
-  // keyword in GCC is broken at the moment, but we expect it will be fixed.
+      io::CodedOutputStream* output) const = 0;
 
   // Like SerializeWithCachedSizes, but writes directly to *target, returning
   // a pointer to the byte immediately after the last byte written.  "target"
-  // must point at a byte array of at least ByteSize() bytes.  Whether to use
-  // deterministic serialization, e.g., maps in sorted order, is determined by
-  // CodedOutputStream::IsDefaultSerializationDeterministic().
+  // must point at a byte array of at least ByteSize() bytes.
   virtual uint8* SerializeWithCachedSizesToArray(uint8* target) const;
 
   // Returns the result of the last call to ByteSize().  An embedded message's
@@ -377,35 +267,10 @@
   // method.)
   virtual int GetCachedSize() const = 0;
 
-  virtual uint8* InternalSerializeWithCachedSizesToArray(bool deterministic,
-                                                         uint8* target) const;
-
  private:
-  // TODO(gerbens) make this a pure abstract function
-  virtual const void* InternalGetTable() const { return NULL; }
-
-  friend class internal::WireFormatLite;
-  friend class Message;
-
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite);
 };
 
-namespace internal {
-
-extern bool LIBPROTOBUF_EXPORT proto3_preserve_unknown_;
-
-// DO NOT USE: For migration only. Will be removed when Proto3 defaults to
-// preserve unknowns.
-inline bool GetProto3PreserveUnknownsDefault() {
-  return proto3_preserve_unknown_;
-}
-
-// DO NOT USE: For migration only. Will be removed when Proto3 defaults to
-// preserve unknowns.
-void LIBPROTOBUF_EXPORT SetProto3PreserveUnknownsDefault(bool preserve);
-}  // namespace internal
-
-
 }  // namespace protobuf
 
 }  // namespace google
diff --git a/src/google/protobuf/message_unittest.cc b/src/google/protobuf/message_unittest.cc
index a27036e..d668a1a 100644
--- a/src/google/protobuf/message_unittest.cc
+++ b/src/google/protobuf/message_unittest.cc
@@ -37,7 +37,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#include <io.h>
+#else
 #include <unistd.h>
 #endif
 #include <sstream>
@@ -46,10 +48,8 @@
 #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.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/arena.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/generated_message_reflection.h>
 
@@ -58,18 +58,10 @@
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 namespace google {
 namespace protobuf {
 
-#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;
-#endif
-
 #ifndef O_BINARY
 #ifdef _O_BINARY
 #define O_BINARY _O_BINARY
@@ -84,7 +76,7 @@
 
   protobuf_unittest::TestAllTypes message;
   TestUtil::SetAllFields(&message);
-  std::stringstream stream;
+  stringstream stream;
 
   string str1("foo");
   string str2("bar");
@@ -108,7 +100,7 @@
 }
 
 TEST(MessageTest, SerializeToBrokenOstream) {
-  std::ofstream out;
+  ofstream out;
   protobuf_unittest::TestAllTypes message;
   message.set_optional_int32(123);
 
@@ -119,9 +111,8 @@
   string filename = TestSourceDir() +
                     "/google/protobuf/testdata/golden_message";
   int file = open(filename.c_str(), O_RDONLY | O_BINARY);
-  ASSERT_GE(file, 0);
 
-  protobuf_unittest::TestAllTypes message;
+  unittest::TestAllTypes message;
   EXPECT_TRUE(message.ParseFromFileDescriptor(file));
   TestUtil::ExpectAllFieldsSet(message);
 
@@ -133,9 +124,8 @@
       TestSourceDir() +
       "/google/protobuf/testdata/golden_packed_fields_message";
   int file = open(filename.c_str(), O_RDONLY | O_BINARY);
-  ASSERT_GE(file, 0);
 
-  protobuf_unittest::TestPackedTypes message;
+  unittest::TestPackedTypes message;
   EXPECT_TRUE(message.ParseFromFileDescriptor(file));
   TestUtil::ExpectPackedFieldsSet(message);
 
@@ -164,7 +154,7 @@
   {
     // Test ParseFromIstream.
     protobuf_unittest::TestAllTypes message;
-    std::stringstream stream(data);
+    stringstream stream(data);
     EXPECT_TRUE(message.ParseFromIstream(&stream));
     EXPECT_TRUE(stream.eof());
     TestUtil::ExpectAllFieldsSet(message);
@@ -192,7 +182,7 @@
 
 TEST(MessageTest, ParseFailsIfNotInitialized) {
   unittest::TestRequired message;
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog log;
@@ -257,99 +247,43 @@
     "fields: a, b, c");
 }
 
+TEST(MessageTest, CheckOverflow) {
+  unittest::TestAllTypes message;
+  // Create a message with size just over 2GB. This triggers integer overflow
+  // when computing message size.
+  const string data(1024, 'x');
+  Cord one_megabyte;
+  for (int i = 0; i < 1024; i++) {
+    one_megabyte.Append(data);
+  }
+
+  for (int i = 0; i < 2 * 1024 + 1; ++i) {
+    message.add_repeated_cord()->CopyFrom(one_megabyte);
+  }
+
+  Cord serialized;
+  EXPECT_FALSE(message.AppendToCord(&serialized));
+}
+
 #endif  // PROTOBUF_HAS_DEATH_TEST
 
 namespace {
-// An input stream that repeats a string's content for a number of times. It
-// helps us create a really large input without consuming too much memory. Used
-// to test the parsing behavior when the input size exceeds 2G or close to it.
-class RepeatedInputStream : public io::ZeroCopyInputStream {
+
+class NegativeByteSize : public unittest::TestRequired {
  public:
-  RepeatedInputStream(const string& data, size_t count)
-      : data_(data), count_(count), position_(0), total_byte_count_(0) {}
-
-  virtual bool Next(const void** data, int* size) {
-    if (position_ == data_.size()) {
-      if (--count_ == 0) {
-        return false;
-      }
-      position_ = 0;
-    }
-    *data = &data_[position_];
-    *size = static_cast<int>(data_.size() - position_);
-    position_ = data_.size();
-    total_byte_count_ += *size;
-    return true;
-  }
-
-  virtual void BackUp(int count) {
-    position_ -= static_cast<size_t>(count);
-    total_byte_count_ -= count;
-  }
-
-  virtual bool Skip(int count) {
-    while (count > 0) {
-      const void* data;
-      int size;
-      if (!Next(&data, &size)) {
-        break;
-      }
-      if (size >= count) {
-        BackUp(size - count);
-        return true;
-      } else {
-        count -= size;
-      }
-    }
-    return false;
-  }
-
-  virtual int64 ByteCount() const { return total_byte_count_; }
-
- private:
-  string data_;
-  size_t count_;     // The number of strings that haven't been consuemd.
-  size_t position_;  // Position in the string for the next read.
-  int64 total_byte_count_;
+  virtual int ByteSize() const { return -1; }
 };
+
 }  // namespace
 
-TEST(MessageTest, TestParseMessagesCloseTo2G) {
-  // Create a message with a large string field.
-  string value = string(64 * 1024 * 1024, 'x');
-  protobuf_unittest::TestAllTypes message;
-  message.set_optional_string(value);
+TEST(MessageTest, SerializationFailsOnNegativeByteSize) {
+  NegativeByteSize message;
+  string string_output;
+  EXPECT_FALSE(message.AppendPartialToString(&string_output));
 
-  // Repeat this message in the input stream to make the total input size
-  // close to 2G.
-  string data = message.SerializeAsString();
-  size_t count = static_cast<size_t>(kint32max) / data.size();
-  RepeatedInputStream input(data, count);
-
-  // The parsing should succeed.
-  protobuf_unittest::TestAllTypes result;
-  EXPECT_TRUE(result.ParseFromZeroCopyStream(&input));
-
-  // When there are multiple occurences of a singulr field, the last one
-  // should win.
-  EXPECT_EQ(value, result.optional_string());
-}
-
-TEST(MessageTest, TestParseMessagesOver2G) {
-  // Create a message with a large string field.
-  string value = string(64 * 1024 * 1024, 'x');
-  protobuf_unittest::TestAllTypes message;
-  message.set_optional_string(value);
-
-  // Repeat this message in the input stream to make the total input size
-  // larger than 2G.
-  string data = message.SerializeAsString();
-  size_t count = static_cast<size_t>(kint32max) / data.size() + 1;
-  RepeatedInputStream input(data, count);
-
-  // The parsing should fail.
-  protobuf_unittest::TestAllTypes result;
-  EXPECT_FALSE(result.ParseFromZeroCopyStream(&input));
+  io::ArrayOutputStream coded_raw_output(NULL, 100);
+  io::CodedOutputStream coded_output(&coded_raw_output);
+  EXPECT_FALSE(message.SerializePartialToCodedStream(&coded_output));
 }
 
 TEST(MessageTest, BypassInitializationCheckOnSerialize) {
@@ -361,7 +295,7 @@
 
 TEST(MessageTest, FindInitializationErrors) {
   unittest::TestRequired message;
-  std::vector<string> errors;
+  vector<string> errors;
   message.FindInitializationErrors(&errors);
   ASSERT_EQ(3, errors.size());
   EXPECT_EQ("a", errors[0]);
@@ -385,31 +319,6 @@
   EXPECT_FALSE(message.ParseFromArray("\014", 1));
 }
 
-// Regression test for b/23630858
-TEST(MessageTest, MessageIsStillValidAfterParseFails) {
-  unittest::TestAllTypes message;
-
-  // 9 0xFFs for the "optional_uint64" field.
-  string invalid_data = "\x20\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
-
-  EXPECT_FALSE(message.ParseFromString(invalid_data));
-  message.Clear();
-  EXPECT_EQ(0, message.optional_uint64());
-
-  // invalid data for field "optional_string". Length prefix is 1 but no
-  // payload.
-  string invalid_string_data = "\x72\x01";
-  {
-    google::protobuf::Arena arena;
-    unittest::TestAllTypes* arena_message =
-        google::protobuf::Arena::CreateMessage<unittest::TestAllTypes>(&arena);
-    EXPECT_FALSE(arena_message->ParseFromString(invalid_string_data));
-    arena_message->Clear();
-    EXPECT_EQ("", arena_message->optional_string());
-  }
-}
-
-
 namespace {
 
 void ExpectMessageMerged(const unittest::TestAllTypes& message) {
@@ -537,17 +446,6 @@
   ASSERT_EQ(0, dest.repeated_uint64_size());
 }
 
-TEST(MessageTest, IsInitialized) {
-  protobuf_unittest::TestIsInitialized msg;
-  EXPECT_TRUE(msg.IsInitialized());
-  protobuf_unittest::TestIsInitialized::SubMessage* sub_message = msg.mutable_sub_message();
-  EXPECT_TRUE(msg.IsInitialized());
-  protobuf_unittest::TestIsInitialized::SubMessage::SubGroup* sub_group = sub_message->mutable_subgroup();
-  EXPECT_FALSE(msg.IsInitialized());
-  sub_group->set_i(1);
-  EXPECT_TRUE(msg.IsInitialized());
-}
-
 TEST(MessageFactoryTest, GeneratedFactoryLookup) {
   EXPECT_EQ(
     MessageFactory::generated_factory()->GetPrototype(
diff --git a/src/google/protobuf/metadata.h b/src/google/protobuf/metadata.h
index 0a6507c..550e071 100644
--- a/src/google/protobuf/metadata.h
+++ b/src/google/protobuf/metadata.h
@@ -38,39 +38,127 @@
 #ifndef GOOGLE_PROTOBUF_METADATA_H__
 #define GOOGLE_PROTOBUF_METADATA_H__
 
-#include <google/protobuf/metadata_lite.h>
+#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/arena.h>
 #include <google/protobuf/unknown_field_set.h>
 
 namespace google {
 namespace protobuf {
 namespace internal {
 
-class InternalMetadataWithArena
-    : public InternalMetadataWithArenaBase<UnknownFieldSet,
-                                           InternalMetadataWithArena> {
+// This is the representation for messages that support arena allocation. It
+// uses a tagged pointer to either store the Arena pointer, if there are no
+// unknown fields, or a pointer to a block of memory with both the Arena pointer
+// and the UnknownFieldSet, if there are unknown fields. This optimization
+// allows for "zero-overhead" storage of the Arena pointer, relative to the
+// above baseline implementation.
+//
+// The tagged pointer uses the LSB to disambiguate cases, and uses bit 0 == 0 to
+// indicate an arena pointer and bit 0 == 1 to indicate a UFS+Arena-container
+// pointer.
+class LIBPROTOBUF_EXPORT InternalMetadataWithArena {
  public:
-  InternalMetadataWithArena() {}
+  InternalMetadataWithArena() : ptr_(NULL) {}
   explicit InternalMetadataWithArena(Arena* arena)
-      : InternalMetadataWithArenaBase<UnknownFieldSet,
-                                           InternalMetadataWithArena>(arena) {}
+      : ptr_ (arena) {}
 
-  void DoSwap(UnknownFieldSet* other) {
-    mutable_unknown_fields()->Swap(other);
+  ~InternalMetadataWithArena() {
+    if (have_unknown_fields() && arena() == NULL) {
+      delete PtrValue<Container>();
+    }
+    ptr_ = NULL;
   }
 
-  void DoMergeFrom(const UnknownFieldSet& other) {
-    mutable_unknown_fields()->MergeFrom(other);
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE const UnknownFieldSet& unknown_fields() const {
+    if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) {
+      return PtrValue<Container>()->unknown_fields_;
+    } else {
+      return *UnknownFieldSet::default_instance();
+    }
   }
 
-  void DoClear() {
-    mutable_unknown_fields()->Clear();
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE UnknownFieldSet* mutable_unknown_fields() {
+    if (GOOGLE_PREDICT_TRUE(have_unknown_fields())) {
+      return &PtrValue<Container>()->unknown_fields_;
+    } else {
+      return mutable_unknown_fields_slow();
+    }
   }
 
-  static const UnknownFieldSet& default_instance() {
-    return *UnknownFieldSet::default_instance();
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE Arena* arena() const {
+    if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) {
+      return PtrValue<Container>()->arena_;
+    } else {
+      return PtrValue<Arena>();
+    }
+  }
+
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool have_unknown_fields() const {
+    return PtrTag() == kTagContainer;
+  }
+
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Swap(InternalMetadataWithArena* other) {
+    // Semantics here are that we swap only the unknown fields, not the arena
+    // pointer. We cannot simply swap ptr_ with other->ptr_ because we need to
+    // maintain our own arena ptr. Also, our ptr_ and other's ptr_ may be in
+    // different states (direct arena pointer vs. container with UFS) so we
+    // cannot simply swap ptr_ and then restore the arena pointers. We reuse
+    // UFS's swap implementation instead.
+    if (have_unknown_fields() || other->have_unknown_fields()) {
+      mutable_unknown_fields()->Swap(other->mutable_unknown_fields());
+    }
+  }
+
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE void* raw_arena_ptr() const {
+    return ptr_;
+  }
+
+ private:
+  void* ptr_;
+
+  // Tagged pointer implementation.
+  enum {
+    // ptr_ is an Arena*.
+    kTagArena = 0,
+    // ptr_ is a Container*.
+    kTagContainer = 1,
+  };
+  static const intptr_t kPtrTagMask = 1;
+  static const intptr_t kPtrValueMask = ~kPtrTagMask;
+
+  // Accessors for pointer tag and pointer value.
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE int PtrTag() const {
+    return reinterpret_cast<intptr_t>(ptr_) & kPtrTagMask;
+  }
+
+  template<typename T> T* PtrValue() const {
+    return reinterpret_cast<T*>(
+        reinterpret_cast<intptr_t>(ptr_) & kPtrValueMask);
+  }
+
+  // If ptr_'s tag is kTagContainer, it points to an instance of this struct.
+  struct Container {
+    UnknownFieldSet unknown_fields_;
+    Arena* arena_;
+  };
+
+  GOOGLE_ATTRIBUTE_NOINLINE UnknownFieldSet* mutable_unknown_fields_slow() {
+    Arena* my_arena = arena();
+    Container* container = Arena::Create<Container>(my_arena);
+    // 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);
+    container->arena_ = my_arena;
+    return &(container->unknown_fields_);
   }
 };
 
+// Temporary compatibility typedef. Remove once this is released in components
+// and upb CL is submitted.
+typedef InternalMetadataWithArena InternalMetadata;
+
 }  // namespace internal
 }  // namespace protobuf
 
diff --git a/src/google/protobuf/metadata_lite.h b/src/google/protobuf/metadata_lite.h
deleted file mode 100644
index 454d088..0000000
--- a/src/google/protobuf/metadata_lite.h
+++ /dev/null
@@ -1,224 +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.
-
-#ifndef GOOGLE_PROTOBUF_METADATA_LITE_H__
-#define GOOGLE_PROTOBUF_METADATA_LITE_H__
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/stubs/port.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-// This is the representation for messages that support arena allocation. It
-// uses a tagged pointer to either store the Arena pointer, if there are no
-// unknown fields, or a pointer to a block of memory with both the Arena pointer
-// and the UnknownFieldSet, if there are unknown fields. This optimization
-// allows for "zero-overhead" storage of the Arena pointer, relative to the
-// above baseline implementation.
-//
-// The tagged pointer uses the LSB to disambiguate cases, and uses bit 0 == 0 to
-// indicate an arena pointer and bit 0 == 1 to indicate a UFS+Arena-container
-// pointer.
-template <class T, class Derived>
-class InternalMetadataWithArenaBase {
- public:
-  InternalMetadataWithArenaBase() : ptr_(NULL) {}
-  explicit InternalMetadataWithArenaBase(Arena* arena) : ptr_(arena) {}
-
-  ~InternalMetadataWithArenaBase() {
-    if (have_unknown_fields() && arena() == NULL) {
-      delete PtrValue<Container>();
-    }
-    ptr_ = NULL;
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE const T& unknown_fields() const {
-    if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) {
-      return PtrValue<Container>()->unknown_fields;
-    } else {
-      return Derived::default_instance();
-    }
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* mutable_unknown_fields() {
-    if (GOOGLE_PREDICT_TRUE(have_unknown_fields())) {
-      return &PtrValue<Container>()->unknown_fields;
-    } else {
-      return mutable_unknown_fields_slow();
-    }
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE Arena* arena() const {
-    if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) {
-      return PtrValue<Container>()->arena;
-    } else {
-      return PtrValue<Arena>();
-    }
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool have_unknown_fields() const {
-    return PtrTag() == kTagContainer;
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Swap(Derived* other) {
-    // Semantics here are that we swap only the unknown fields, not the arena
-    // pointer. We cannot simply swap ptr_ with other->ptr_ because we need to
-    // maintain our own arena ptr. Also, our ptr_ and other's ptr_ may be in
-    // different states (direct arena pointer vs. container with UFS) so we
-    // cannot simply swap ptr_ and then restore the arena pointers. We reuse
-    // UFS's swap implementation instead.
-    if (have_unknown_fields() || other->have_unknown_fields()) {
-      static_cast<Derived*>(this)->DoSwap(other->mutable_unknown_fields());
-    }
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void MergeFrom(const Derived& other) {
-    if (other.have_unknown_fields()) {
-      static_cast<Derived*>(this)->DoMergeFrom(other.unknown_fields());
-    }
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Clear() {
-    if (have_unknown_fields()) {
-      static_cast<Derived*>(this)->DoClear();
-    }
-  }
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void* raw_arena_ptr() const {
-    return ptr_;
-  }
-
- private:
-  void* ptr_;
-
-  // Tagged pointer implementation.
-  enum {
-    // ptr_ is an Arena*.
-    kTagArena = 0,
-    // ptr_ is a Container*.
-    kTagContainer = 1,
-  };
-  static const intptr_t kPtrTagMask = 1;
-  static const intptr_t kPtrValueMask = ~kPtrTagMask;
-
-  // Accessors for pointer tag and pointer value.
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE int PtrTag() const {
-    return reinterpret_cast<intptr_t>(ptr_) & kPtrTagMask;
-  }
-
-  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.
-  struct Container {
-    T unknown_fields;
-    Arena* arena;
-  };
-
-  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE T* mutable_unknown_fields_slow() {
-    Arena* my_arena = arena();
-    Container* container = Arena::Create<Container>(my_arena);
-    // 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);
-    container->arena = my_arena;
-    return &(container->unknown_fields);
-  }
-};
-
-// We store unknown fields as a string right now, because there is currently no
-// good interface for reading unknown fields into an ArenaString.  We may want
-// to revisit this to allow unknown fields to be parsed onto the Arena.
-class InternalMetadataWithArenaLite
-    : public InternalMetadataWithArenaBase<string,
-                                           InternalMetadataWithArenaLite> {
- public:
-  InternalMetadataWithArenaLite() {}
-
-  explicit InternalMetadataWithArenaLite(Arena* arena)
-      : InternalMetadataWithArenaBase<string,
-                                      InternalMetadataWithArenaLite>(arena) {}
-
-  void DoSwap(string* other) {
-    mutable_unknown_fields()->swap(*other);
-  }
-
-  void DoMergeFrom(const string& other) {
-    mutable_unknown_fields()->append(other);
-  }
-
-  void DoClear() {
-    mutable_unknown_fields()->clear();
-  }
-
-  static const string& default_instance() {
-    return GetEmptyStringAlreadyInited();
-  }
-};
-
-// This helper RAII class is needed to efficiently parse unknown fields. We
-// should only call mutable_unknown_fields if there are actual unknown fields.
-// The obvious thing to just use a stack string and swap it at the end of the
-// parse won't work, because the destructor of StringOutputStream needs to be
-// called before we can modify the string (it check-fails). Using
-// LiteUnknownFieldSetter setter(&_internal_metadata_);
-// StringOutputStream stream(setter.buffer());
-// guarantees that the string is only swapped after stream is destroyed.
-class LIBPROTOBUF_EXPORT LiteUnknownFieldSetter {
- public:
-  explicit LiteUnknownFieldSetter(InternalMetadataWithArenaLite* metadata)
-      : metadata_(metadata) {
-    if (metadata->have_unknown_fields()) {
-      buffer_.swap(*metadata->mutable_unknown_fields());
-    }
-  }
-  ~LiteUnknownFieldSetter() {
-    if (!buffer_.empty()) metadata_->mutable_unknown_fields()->swap(buffer_);
-  }
-  string* buffer() { return &buffer_; }
-
- private:
-  InternalMetadataWithArenaLite* metadata_;
-  string buffer_;
-};
-
-}  // namespace internal
-}  // namespace protobuf
-
-}  // namespace google
-#endif  // GOOGLE_PROTOBUF_METADATA_LITE_H__
diff --git a/src/google/protobuf/proto3_arena_unittest.cc b/src/google/protobuf/proto3_arena_unittest.cc
index 3a0fb80..2838e0f 100644
--- a/src/google/protobuf/proto3_arena_unittest.cc
+++ b/src/google/protobuf/proto3_arena_unittest.cc
@@ -129,8 +129,7 @@
   ExpectAllFieldsSet(*arena_message);
 }
 
-TEST(Proto3ArenaTest, UnknownFieldsDefaultDrop) {
-  ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(false);
+TEST(Proto3ArenaTest, UnknownFields) {
   TestAllTypes original;
   SetAllFields(&original);
 
@@ -151,28 +150,6 @@
       arena_message->GetReflection()->GetUnknownFields(*arena_message).empty());
 }
 
-TEST(Proto3ArenaTest, UnknownFieldsDefaultPreserve) {
-  ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(true);
-  TestAllTypes original;
-  SetAllFields(&original);
-
-  Arena arena;
-  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
-  arena_message->ParseFromString(original.SerializeAsString());
-  ExpectAllFieldsSet(*arena_message);
-
-  // In proto3 we can still get a pointer to the UnknownFieldSet through
-  // reflection API.
-  UnknownFieldSet* unknown_fields =
-      arena_message->GetReflection()->MutableUnknownFields(arena_message);
-  // We can modify this UnknownFieldSet.
-  unknown_fields->AddVarint(1, 2);
-  // And the unknown fields should be changed.
-  ASSERT_NE(original.ByteSize(), arena_message->ByteSize());
-  ASSERT_FALSE(
-      arena_message->GetReflection()->GetUnknownFields(*arena_message).empty());
-}
-
 TEST(Proto3ArenaTest, Swap) {
   Arena arena1;
   Arena arena2;
diff --git a/src/google/protobuf/reflection.h b/src/google/protobuf/reflection.h
index fcb9a43..671aafd 100755
--- a/src/google/protobuf/reflection.h
+++ b/src/google/protobuf/reflection.h
@@ -80,12 +80,6 @@
 
   typedef IteratorType iterator;
   typedef IteratorType const_iterator;
-  typedef T value_type;
-  typedef T& reference;
-  typedef const T& const_reference;
-  typedef int size_type;
-  typedef ptrdiff_t difference_type;
-
   iterator begin() const {
     return iterator(data_, accessor_, true);
   }
@@ -208,18 +202,11 @@
 
   typedef IteratorType iterator;
   typedef IteratorType const_iterator;
-  typedef T value_type;
-  typedef T& reference;
-  typedef const T& const_reference;
-  typedef int size_type;
-  typedef ptrdiff_t difference_type;
-
   iterator begin() const {
     return iterator(data_, accessor_, true, NewMessage());
   }
   iterator end() const {
-    // The end iterator must not be dereferenced, no need for scratch space.
-    return iterator(data_, accessor_, false, NULL);
+    return iterator(data_, accessor_, false, NewMessage());
   }
 
  private:
@@ -369,7 +356,7 @@
   virtual void Swap(Field* data, const RepeatedFieldAccessor* other_mutator,
                     Field* other_data) const = 0;
 
-  // Create an iterator that points at the beginning of the repeated field.
+  // Create an iterator that points at the begining of the repeated field.
   virtual Iterator* BeginIterator(const Field* data) const = 0;
   // Create an iterator that points at the end of the repeated field.
   virtual Iterator* EndIterator(const Field* data) const = 0;
@@ -441,13 +428,13 @@
  public:
   // Constructor for non-message fields.
   RepeatedFieldRefIterator(const void* data,
-                           const RepeatedFieldAccessor* accessor, bool begin)
-      : data_(data),
-        accessor_(accessor),
-        iterator_(begin ? accessor->BeginIterator(data)
-                        : accessor->EndIterator(data)),
-        // The end iterator must not be dereferenced, no need for scratch space.
-        scratch_space_(begin ? new AccessorValueType : NULL) {}
+                           const RepeatedFieldAccessor* accessor,
+                           bool begin)
+      : data_(data), accessor_(accessor),
+        iterator_(begin ? accessor->BeginIterator(data) :
+                          accessor->EndIterator(data)),
+        scratch_space_(new AccessorValueType) {
+  }
   // Constructor for message fields.
   RepeatedFieldRefIterator(const void* data,
                            const RepeatedFieldAccessor* accessor,
@@ -570,8 +557,8 @@
   typedef RepeatedFieldRefIterator<T> iterator;
   typedef RepeatedFieldAccessor AccessorType;
   typedef string AccessorValueType;
-  typedef const string IteratorValueType;
-  typedef const string* IteratorPointerType;
+  typedef string IteratorValueType;
+  typedef string* IteratorPointerType;
   static const FieldDescriptor::CppType cpp_type =
       FieldDescriptor::CPPTYPE_STRING;
   static const Descriptor* GetMessageFieldDescriptor() {
diff --git a/src/google/protobuf/reflection_ops.cc b/src/google/protobuf/reflection_ops.cc
index d1867311..4629dec 100644
--- a/src/google/protobuf/reflection_ops.cc
+++ b/src/google/protobuf/reflection_ops.cc
@@ -38,7 +38,6 @@
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/map_field.h>
 #include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/stubs/strutil.h>
 
@@ -64,7 +63,7 @@
   const Reflection* from_reflection = from.GetReflection();
   const Reflection* to_reflection = to->GetReflection();
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   from_reflection->ListFields(from, &fields);
   for (int i = 0; i < fields.size(); i++) {
     const FieldDescriptor* field = fields[i];
@@ -130,7 +129,7 @@
 void ReflectionOps::Clear(Message* message) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(*message, &fields);
   for (int i = 0; i < fields.size(); i++) {
     reflection->ClearField(message, fields[i]);
@@ -153,33 +152,12 @@
   }
 
   // Check that sub-messages are initialized.
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message, &fields);
   for (int i = 0; i < fields.size(); i++) {
     const FieldDescriptor* field = fields[i];
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
 
-      if (field->is_map()) {
-        const FieldDescriptor* value_field = field->message_type()->field(1);
-        if (value_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-          MapFieldBase* map_field =
-              reflection->MapData(const_cast<Message*>(&message), field);
-          if (map_field->IsMapValid()) {
-            MapIterator iter(const_cast<Message*>(&message), field);
-            MapIterator end(const_cast<Message*>(&message), field);
-            for (map_field->MapBegin(&iter), map_field->MapEnd(&end);
-                 iter != end; ++iter) {
-              if (!iter.GetValueRef().GetMessageValue().IsInitialized()) {
-                return false;
-              }
-            }
-            continue;
-          }
-        } else {
-          continue;
-        }
-      }
-
       if (field->is_repeated()) {
         int size = reflection->FieldSize(message, field);
 
@@ -205,7 +183,7 @@
 
   reflection->MutableUnknownFields(message)->Clear();
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(*message, &fields);
   for (int i = 0; i < fields.size(); i++) {
     const FieldDescriptor* field = fields[i];
@@ -246,7 +224,7 @@
 void ReflectionOps::FindInitializationErrors(
     const Message& message,
     const string& prefix,
-    std::vector<string>* errors) {
+    vector<string>* errors) {
   const Descriptor* descriptor = message.GetDescriptor();
   const Reflection* reflection = message.GetReflection();
 
@@ -260,7 +238,7 @@
   }
 
   // Check sub-messages.
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message, &fields);
   for (int i = 0; i < fields.size(); i++) {
     const FieldDescriptor* field = fields[i];
diff --git a/src/google/protobuf/reflection_ops.h b/src/google/protobuf/reflection_ops.h
index 45d8c65..4775911 100644
--- a/src/google/protobuf/reflection_ops.h
+++ b/src/google/protobuf/reflection_ops.h
@@ -67,7 +67,7 @@
   // the front of each name.
   static void FindInitializationErrors(const Message& message,
                                        const string& prefix,
-                                       std::vector<string>* errors);
+                                       vector<string>* errors);
 
  private:
   // All methods are static.  No need to construct.
diff --git a/src/google/protobuf/reflection_ops_unittest.cc b/src/google/protobuf/reflection_ops_unittest.cc
index 9cedb34..88d6bfb 100644
--- a/src/google/protobuf/reflection_ops_unittest.cc
+++ b/src/google/protobuf/reflection_ops_unittest.cc
@@ -41,7 +41,6 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
-
 #include <google/protobuf/stubs/strutil.h>
 
 namespace google {
@@ -420,7 +419,7 @@
 }
 
 static string FindInitializationErrors(const Message& message) {
-  std::vector<string> errors;
+  vector<string> errors;
   ReflectionOps::FindInitializationErrors(message, "", &errors);
   return Join(errors, ",");
 }
diff --git a/src/google/protobuf/repeated_field.cc b/src/google/protobuf/repeated_field.cc
index 5ca964c..77004f5 100644
--- a/src/google/protobuf/repeated_field.cc
+++ b/src/google/protobuf/repeated_field.cc
@@ -58,16 +58,14 @@
            (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) {
-    rep_ = reinterpret_cast<Rep*>(::operator new(bytes));
+    rep_ = reinterpret_cast<Rep*>(
+        new char[kRepHeaderSize + sizeof(old_rep->elements[0]) * new_size]);
   } else {
     rep_ = reinterpret_cast<Rep*>(
-        ::google::protobuf::Arena::CreateArray<char>(arena, bytes));
+        ::google::protobuf::Arena::CreateArray<char>(arena,
+            kRepHeaderSize + sizeof(old_rep->elements[0]) * new_size));
   }
-#if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
-  const int old_total_size = total_size_;
-#endif
   total_size_ = new_size;
   if (old_rep && old_rep->allocated_size > 0) {
     memcpy(rep_->elements, old_rep->elements,
@@ -77,13 +75,7 @@
     rep_->allocated_size = 0;
   }
   if (arena == NULL) {
-#if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
-    const size_t old_size =
-        old_total_size * sizeof(rep_->elements[0]) + kRepHeaderSize;
-    ::operator delete(static_cast<void*>(old_rep), old_size);
-#else
-    ::operator delete(static_cast<void*>(old_rep));
-#endif
+    delete [] reinterpret_cast<char*>(old_rep);
   }
   return &rep_->elements[current_size_];
 }
diff --git a/src/google/protobuf/repeated_field.h b/src/google/protobuf/repeated_field.h
index 8eb6c79..1961bc4 100644
--- a/src/google/protobuf/repeated_field.h
+++ b/src/google/protobuf/repeated_field.h
@@ -51,20 +51,18 @@
 #include <algorithm>
 #endif
 
-#include <iterator>
-#include <limits>
 #include <string>
+#include <iterator>
 #include <google/protobuf/stubs/casts.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/type_traits.h>
 #include <google/protobuf/arena.h>
+#include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/message_lite.h>
-#include <google/protobuf/stubs/port.h>
 
-
-// Forward-declare these so that we can make them friends.
 namespace google {
+
 namespace upb {
 namespace google_opensource {
 class GMR_Handlers;
@@ -77,8 +75,6 @@
 
 namespace internal {
 
-class MergePartialFromCodedStreamHelper;
-
 static const int kMinRepeatedFieldAllocationSize = 4;
 
 // A utility function for logging that doesn't need any template types.
@@ -108,7 +104,7 @@
 // not ever use a RepeatedField directly; they will use the get-by-index,
 // set-by-index, and add accessors that are generated for all repeated fields.
 template <typename Element>
-class RepeatedField PROTOBUF_FINAL {
+class RepeatedField {
  public:
   RepeatedField();
   explicit RepeatedField(Arena* arena);
@@ -119,24 +115,13 @@
 
   RepeatedField& operator=(const RepeatedField& other);
 
-#if LANG_CXX11
-  RepeatedField(RepeatedField&& other) noexcept;
-  RepeatedField& operator=(RepeatedField&& other) noexcept;
-#endif
-
   bool empty() const;
   int size() const;
 
   const Element& Get(int index) const;
   Element* Mutable(int index);
-
-  const Element& operator[](int index) const { return Get(index); }
-  Element& operator[](int index) { return *Mutable(index); }
-
   void Set(int index, const Element& value);
   void Add(const Element& value);
-  // Appends a new element and return a pointer to it.
-  // The new element is uninitialized if |Element| is a POD type.
   Element* Add();
   // Remove the last element in the array.
   void RemoveLast();
@@ -159,11 +144,7 @@
   void Truncate(int new_size);
 
   void AddAlreadyReserved(const Element& value);
-  // Appends a new element and return a pointer to it.
-  // The new element is uninitialized if |Element| is a POD type.
-  // Should be called only if Capacity() > Size().
   Element* AddAlreadyReserved();
-  Element* AddNAlreadyReserved(int elements);
   int Capacity() const;
 
   // Like STL resize.  Uses value to fill appended elements.
@@ -225,11 +206,7 @@
 
   // Returns the number of bytes used by the repeated field, excluding
   // sizeof(*this)
-  size_t SpaceUsedExcludingSelfLong() const;
-
-  int SpaceUsedExcludingSelf() const {
-    return internal::ToIntSize(SpaceUsedExcludingSelfLong());
-  }
+  int SpaceUsedExcludingSelf() const;
 
   // Removes the element referenced by position.
   //
@@ -251,11 +228,6 @@
     return GetArenaNoVirtual();
   }
 
-  // For internal use only.
-  //
-  // This is public due to it being called by generated code.
-  inline void InternalSwap(RepeatedField* other);
-
  private:
   static const int kInitialSize = 0;
   // A note on the representation here (see also comment below for
@@ -286,7 +258,6 @@
   friend class Arena;
   typedef void InternalArenaConstructable_;
 
-
   // Move the contents of |from| into |to|, possibly clobbering |from| in the
   // process.  For primitive types this is just a memcpy(), but it could be
   // specialized for non-primitive types to, say, swap each element instead.
@@ -295,6 +266,8 @@
   // Copy the elements of |from| into |to|.
   void CopyArray(Element* to, const Element* from, int size);
 
+  inline void InternalSwap(RepeatedField* other);
+
   // Internal helper expected by Arena methods.
   inline Arena* GetArenaNoVirtual() const {
     return (rep_ == NULL) ? NULL : rep_->arena;
@@ -308,21 +281,13 @@
       Element* e = &rep->elements[0];
       Element* limit = &rep->elements[size];
       for (; e < limit; e++) {
-        e->~Element();
+        e->Element::~Element();
       }
       if (rep->arena == NULL) {
-#if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
-        const size_t bytes = size * sizeof(*e) + kRepHeaderSize;
-        ::operator delete(static_cast<void*>(rep), bytes);
-#else
-        ::operator delete(static_cast<void*>(rep));
-#endif
+        delete[] reinterpret_cast<char*>(rep);
       }
     }
   }
-
-  friend class internal::WireFormatLite;
-  const Element* unsafe_data() const;
 };
 
 template<typename Element>
@@ -336,13 +301,12 @@
 
 namespace internal {
 
-// This is a helper template to copy an array of elements efficiently when they
+// This is a helper template to copy an array of elements effeciently when they
 // have a trivial copy constructor, and correctly otherwise. This really
 // shouldn't be necessary, but our compiler doesn't optimize std::copy very
 // effectively.
 template <typename Element,
-          bool HasTrivialCopy =
-              has_trivial_copy<Element>::value>
+          bool HasTrivialCopy = has_trivial_copy<Element>::value>
 struct ElementCopier {
   void operator()(Element* to, const Element* from, int array_size);
 };
@@ -356,8 +320,8 @@
 // exist on the contained type. In particular, we rely on MergeFrom() existing
 // as a general proxy for the fact that a copy will work, and we also provide a
 // specific override for string*.
-template <typename T>
-struct TypeImplementsMergeBehaviorProbeForMergeFrom {
+template<typename T>
+struct TypeImplementsMergeBehavior {
   typedef char HasMerge;
   typedef long HasNoMerge;
 
@@ -376,18 +340,13 @@
       CheckType<U, bool, &U::MergeFrom>*);
   template<typename U> static HasNoMerge Check(...);
 
-  // Resolves to either google::protobuf::internal::true_type or google::protobuf::internal::false_type.
+  // Resovles to either google::protobuf::internal::true_type or google::protobuf::internal::false_type.
   typedef google::protobuf::internal::integral_constant<bool,
                (sizeof(Check<T>(0)) == sizeof(HasMerge))> type;
 };
 
-template <typename T, typename = void>
-struct TypeImplementsMergeBehavior :
-    TypeImplementsMergeBehaviorProbeForMergeFrom<T> {};
-
-
-template <>
-struct TypeImplementsMergeBehavior< ::std::string> {
+template<>
+struct TypeImplementsMergeBehavior< ::std::string > {
   typedef google::protobuf::internal::true_type type;
 };
 
@@ -405,7 +364,7 @@
 //     static void Merge(const Type& from, Type* to);
 //
 //     // Only needs to be implemented if SpaceUsedExcludingSelf() is called.
-//     static int SpaceUsedLong(const Type&);
+//     static int SpaceUsed(const Type&);
 //   };
 class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase {
  protected:
@@ -415,10 +374,10 @@
   friend class GeneratedMessageReflection;
 
   // ExtensionSet stores repeated message extensions as
-  // RepeatedPtrField<MessageLite>, but non-lite ExtensionSets need to implement
-  // SpaceUsedLong(), and thus need to call SpaceUsedExcludingSelfLong()
-  // reinterpreting MessageLite as Message.  ExtensionSet also needs to make use
-  // of AddFromCleared(), which is not part of the public interface.
+  // RepeatedPtrField<MessageLite>, but non-lite ExtensionSets need to
+  // implement SpaceUsed(), and thus need to call SpaceUsedExcludingSelf()
+  // reinterpreting MessageLite as Message.  ExtensionSet also needs to make
+  // use of AddFromCleared(), which is not part of the public interface.
   friend class ExtensionSet;
 
   // The MapFieldBase implementation needs to call protected methods directly,
@@ -426,10 +385,6 @@
   // subclass.
   friend class MapFieldBase;
 
-  // The table-driven MergePartialFromCodedStream implementation needs to
-  // operate on RepeatedPtrField<MessageLite>.
-  friend class MergePartialFromCodedStreamHelper;
-
   // To parse directly into a proto2 generated class, the upb class GMR_Handlers
   // needs to be able to modify a RepeatedPtrFieldBase directly.
   friend class upb::google_opensource::GMR_Handlers;
@@ -453,11 +408,6 @@
   void Delete(int index);
   template <typename TypeHandler>
   typename TypeHandler::Type* Add(typename TypeHandler::Type* prototype = NULL);
-#if LANG_CXX11
-  template <typename TypeHandler>
-  void Add(typename TypeHandler::Type&& value,
-           internal::enable_if<TypeHandler::Moveable>* dummy = NULL);
-#endif
 
   template <typename TypeHandler>
   void RemoveLast();
@@ -483,13 +433,13 @@
   template <typename TypeHandler>
   const typename TypeHandler::Type* const* data() const;
 
-  template <typename TypeHandler> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  void Swap(RepeatedPtrFieldBase* other);
+  template <typename TypeHandler>
+  GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Swap(RepeatedPtrFieldBase* other);
 
   void SwapElements(int index1, int index2);
 
   template <typename TypeHandler>
-  size_t SpaceUsedExcludingSelfLong() const;
+  int SpaceUsedExcludingSelf() const;
 
 
   // Advanced memory management --------------------------------------
@@ -528,15 +478,17 @@
   inline void InternalSwap(RepeatedPtrFieldBase* other);
 
   template <typename TypeHandler>
-  void AddAllocatedInternal(typename TypeHandler::Type* value, google::protobuf::internal::true_type);
+  void AddAllocatedInternal(typename TypeHandler::Type* value,
+                            google::protobuf::internal::true_type);
   template <typename TypeHandler>
-  void AddAllocatedInternal(typename TypeHandler::Type* value, google::protobuf::internal::false_type);
+  void AddAllocatedInternal(typename TypeHandler::Type* value,
+                            google::protobuf::internal::false_type);
 
-  template <typename TypeHandler> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+  template <typename TypeHandler> GOOGLE_ATTRIBUTE_NOINLINE
   void AddAllocatedSlowWithCopy(typename TypeHandler::Type* value,
                                 Arena* value_arena,
                                 Arena* my_arena);
-  template <typename TypeHandler> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+  template <typename TypeHandler> GOOGLE_ATTRIBUTE_NOINLINE
   void AddAllocatedSlowWithoutCopy(typename TypeHandler::Type* value);
 
   template <typename TypeHandler>
@@ -544,7 +496,7 @@
   template <typename TypeHandler>
   typename TypeHandler::Type* ReleaseLastInternal(google::protobuf::internal::false_type);
 
-  template<typename TypeHandler> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
+  template<typename TypeHandler> GOOGLE_ATTRIBUTE_NOINLINE
   void SwapFallback(RepeatedPtrFieldBase* other);
 
   inline Arena* GetArenaNoVirtual() const {
@@ -601,7 +553,6 @@
   // Reserve() and MergeFrom() to reduce code size. |extend_amount| must be > 0.
   void** InternalExtend(int extend_amount);
 
-  friend class AccessorHelper;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase);
 };
 
@@ -609,20 +560,16 @@
 class GenericTypeHandler {
  public:
   typedef GenericType Type;
-#if LANG_CXX11
-  static const bool Moveable = false;
-#endif
-
   static inline GenericType* New(Arena* arena) {
-    return ::google::protobuf::Arena::CreateMaybeMessage<Type>(arena);
+    return ::google::protobuf::Arena::CreateMaybeMessage<Type>(
+        arena, static_cast<GenericType*>(0));
   }
-  static inline GenericType* NewFromPrototype(
+  // We force NewFromPrototype() and Delete() to be non-inline to reduce code
+  // size: else, several other methods get inlined copies of message types'
+  // constructors and destructors.
+  GOOGLE_ATTRIBUTE_NOINLINE static GenericType* NewFromPrototype(
       const GenericType* prototype, ::google::protobuf::Arena* arena = NULL);
-  static inline void Delete(GenericType* value, Arena* arena) {
-    if (arena == NULL) {
-      delete value;
-    }
-  }
+  GOOGLE_ATTRIBUTE_NOINLINE static void Delete(GenericType* value, Arena* arena);
   static inline ::google::protobuf::Arena* GetArena(GenericType* value) {
     return ::google::protobuf::Arena::GetArena<Type>(value);
   }
@@ -631,10 +578,10 @@
   }
 
   static inline void Clear(GenericType* value) { value->Clear(); }
-  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
-  static void Merge(const GenericType& from, GenericType* to);
-  static inline size_t SpaceUsedLong(const GenericType& value) {
-    return value.SpaceUsedLong();
+  GOOGLE_ATTRIBUTE_NOINLINE static void Merge(const GenericType& from,
+                                       GenericType* to);
+  static inline int SpaceUsed(const GenericType& value) {
+    return value.SpaceUsed();
   }
   static inline const Type& default_instance() {
     return Type::default_instance();
@@ -647,14 +594,22 @@
   return New(arena);
 }
 template <typename GenericType>
+void GenericTypeHandler<GenericType>::Delete(GenericType* value, Arena* arena) {
+  if (arena == NULL) {
+    delete value;
+  }
+}
+template <typename GenericType>
 void GenericTypeHandler<GenericType>::Merge(const GenericType& from,
                                             GenericType* to) {
   to->MergeFrom(from);
 }
 
-// NewFromPrototype() and Merge() are not defined inline here, as we will need
-// to do a virtual function dispatch anyways to go from Message* to call
-// New/Merge.
+// NewFromPrototype() and Merge() cannot be defined here; if they're declared
+// inline the compiler will complain about not matching GOOGLE_ATTRIBUTE_NOINLINE
+// above, and if not, compilation will result in multiple definitions.  These
+// are therefore declared as specializations here and defined in
+// message_lite.cc.
 template<>
 MessageLite* GenericTypeHandler<MessageLite>::NewFromPrototype(
     const MessageLite* prototype, google::protobuf::Arena* arena);
@@ -719,23 +674,22 @@
 }
 
 
-class StringTypeHandler {
+// HACK:  If a class is declared as DLL-exported in MSVC, it insists on
+//   generating copies of all its methods -- even inline ones -- to include
+//   in the DLL.  But SpaceUsed() calls StringSpaceUsedExcludingSelf() which
+//   isn't in the lite library, therefore the lite library cannot link if
+//   StringTypeHandler is exported.  So, we factor out StringTypeHandlerBase,
+//   export that, then make StringTypeHandler be a subclass which is NOT
+//   exported.
+// TODO(kenton):  Now that StringSpaceUsedExcludingSelf() is in the lite
+//   library, this can be cleaned up.
+class LIBPROTOBUF_EXPORT StringTypeHandlerBase {
  public:
   typedef string Type;
-#if LANG_CXX11
-  static const bool Moveable =
-      std::is_move_constructible<Type>::value &&
-      std::is_move_assignable<Type>::value;
-#endif
 
   static inline string* New(Arena* arena) {
     return Arena::Create<string>(arena);
   }
-#if LANG_CXX11
-  static inline string* New(Arena* arena, string&& value) {
-    return Arena::Create<string>(arena, std::move(value));
-  }
-#endif
   static inline string* NewFromPrototype(const string*,
                                          ::google::protobuf::Arena* arena) {
     return New(arena);
@@ -756,17 +710,22 @@
   static inline const Type& default_instance() {
     return ::google::protobuf::internal::GetEmptyString();
   }
-  static size_t SpaceUsedLong(const string& value)  {
-    return sizeof(value) + StringSpaceUsedExcludingSelfLong(value);
+};
+
+class StringTypeHandler : public StringTypeHandlerBase {
+ public:
+  static int SpaceUsed(const string& value)  {
+    return static_cast<int>(sizeof(value)) + StringSpaceUsedExcludingSelf(value);
   }
 };
 
+
 }  // namespace internal
 
 // RepeatedPtrField is like RepeatedField, but used for repeated strings or
 // Messages.
 template <typename Element>
-class RepeatedPtrField PROTOBUF_FINAL : public internal::RepeatedPtrFieldBase {
+class RepeatedPtrField : public internal::RepeatedPtrFieldBase {
  public:
   RepeatedPtrField();
   explicit RepeatedPtrField(::google::protobuf::Arena* arena);
@@ -778,23 +737,12 @@
 
   RepeatedPtrField& operator=(const RepeatedPtrField& other);
 
-#if LANG_CXX11
-  RepeatedPtrField(RepeatedPtrField&& other) noexcept;
-  RepeatedPtrField& operator=(RepeatedPtrField&& other) noexcept;
-#endif
-
   bool empty() const;
   int size() const;
 
   const Element& Get(int index) const;
   Element* Mutable(int index);
   Element* Add();
-#if LANG_CXX11
-  void Add(Element&& value);
-#endif
-
-  const Element& operator[](int index) const { return Get(index); }
-  Element& operator[](int index) { return *Mutable(index); }
 
   // Remove the last element in the array.
   // Ownership of the element is retained by the array.
@@ -870,11 +818,10 @@
 
   // Custom STL-like iterator that iterates over and returns the underlying
   // pointers to Element rather than Element itself.
-  typedef internal::RepeatedPtrOverPtrsIterator<Element*, void*>
-      pointer_iterator;
-  typedef internal::RepeatedPtrOverPtrsIterator<const Element* const,
-                                                const void* const>
-      const_pointer_iterator;
+  typedef internal::RepeatedPtrOverPtrsIterator<Element, void*>
+  pointer_iterator;
+  typedef internal::RepeatedPtrOverPtrsIterator<const Element, const void*>
+  const_pointer_iterator;
   pointer_iterator pointer_begin();
   const_pointer_iterator pointer_begin() const;
   pointer_iterator pointer_end();
@@ -882,11 +829,7 @@
 
   // Returns (an estimate of) the number of bytes used by the repeated field,
   // excluding sizeof(*this).
-  size_t SpaceUsedExcludingSelfLong() const;
-
-  int SpaceUsedExcludingSelf() const {
-    return internal::ToIntSize(SpaceUsedExcludingSelfLong());
-  }
+  int SpaceUsedExcludingSelf() const;
 
   // Advanced memory management --------------------------------------
   // When hardcore memory management becomes necessary -- as it sometimes
@@ -918,10 +861,10 @@
   // RepeatedPtrField.
   // It is also useful in legacy code that uses temporary ownership to avoid
   // copies. Example:
-  //   RepeatedPtrField<T> temp_field;
-  //   temp_field.AddAllocated(new T);
-  //   ... // Do something with temp_field
-  //   temp_field.ExtractSubrange(0, temp_field.size(), NULL);
+  // RepeatedPtrField<T> temp_field;
+  // temp_field.AddAllocated(new T);
+  // ... // Do something with temp_field
+  // temp_field.ExtractSubrange(0, temp_field.size(), NULL);
   // If you put temp_field on the arena this fails, because the ownership
   // transfers to the arena at the "AddAllocated" call and is not released
   // anymore causing a double delete. UnsafeArenaAddAllocated prevents this.
@@ -1003,18 +946,17 @@
     return GetArenaNoVirtual();
   }
 
-  // For internal use only.
-  //
-  // This is public due to it being called by generated code.
-  using RepeatedPtrFieldBase::InternalSwap;
-
- private:
-  // Note:  RepeatedPtrField SHOULD NOT be subclassed by users.
+ protected:
+  // Note:  RepeatedPtrField SHOULD NOT be subclassed by users.  We only
+  //   subclass it in one place as a hack for compatibility with proto1.  The
+  //   subclass needs to know about TypeHandler in order to call protected
+  //   methods on RepeatedPtrFieldBase.
   class TypeHandler;
 
   // Internal arena accessor expected by helpers in Arena.
   inline Arena* GetArenaNoVirtual() const;
 
+ private:
   // Implementations for ExtractSubrange(). The copying behavior must be
   // included only if the type supports the necessary operations (e.g.,
   // MergeFrom()), so we must resolve this at compile time. ExtractSubrange()
@@ -1043,13 +985,13 @@
   : current_size_(0),
     total_size_(0),
     rep_(NULL) {
-  // In case arena is NULL, then we do not create rep_, as code has an invariant
-  // `rep_ == NULL then arena == NULL`.
-  if (arena != NULL) {
-    rep_ = reinterpret_cast<Rep*>(
-        ::google::protobuf::Arena::CreateArray<char>(arena, kRepHeaderSize));
-    rep_->arena = arena;
-  }
+ // In case arena is NULL, then we do not create rep_, as code has an invariant
+ // `rep_ == NULL then arena == NULL`.
+ if (arena != NULL) {
+  rep_ = reinterpret_cast<Rep*>(
+      ::google::protobuf::Arena::CreateArray<char>(arena, kRepHeaderSize));
+  rep_->arena = arena;
+ }
 }
 
 template <typename Element>
@@ -1057,12 +999,7 @@
   : current_size_(0),
     total_size_(0),
     rep_(NULL) {
-  if (other.current_size_ != 0) {
-    Reserve(other.current_size_);
-    CopyArray(rep_->elements,
-              other.rep_->elements, other.current_size_);
-    current_size_ = other.current_size_;
-  }
+  CopyFrom(other);
 }
 
 template <typename Element>
@@ -1099,37 +1036,6 @@
   return *this;
 }
 
-#if LANG_CXX11
-
-template <typename Element>
-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.
-  if (other.GetArenaNoVirtual()) {
-    CopyFrom(other);
-  } else {
-    InternalSwap(&other);
-  }
-}
-
-template <typename Element>
-inline RepeatedField<Element>& RepeatedField<Element>::operator=(
-    RepeatedField&& other) noexcept {
-  // We don't just call Swap(&other) here because it would perform 3 copies if
-  // the two fields are on different arenas.
-  if (this != &other) {
-    if (this->GetArenaNoVirtual() != other.GetArenaNoVirtual()) {
-      CopyFrom(other);
-    } else {
-      InternalSwap(&other);
-    }
-  }
-  return *this;
-}
-
-#endif  // LANG_CXX11
-
 template <typename Element>
 inline bool RepeatedField<Element>::empty() const {
   return current_size_ == 0;
@@ -1158,14 +1064,6 @@
 }
 
 template<typename Element>
-inline Element* RepeatedField<Element>::AddNAlreadyReserved(int elements) {
-  GOOGLE_DCHECK_LE(current_size_ + elements, total_size_);
-  Element* ret = &rep_->elements[current_size_];
-  current_size_ += elements;
-  return ret;
-}
-
-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_) {
@@ -1243,7 +1141,7 @@
 
 template <typename Element>
 inline void RepeatedField<Element>::MergeFrom(const RepeatedField& other) {
-  GOOGLE_DCHECK_NE(&other, this);
+  GOOGLE_CHECK_NE(&other, this);
   if (other.current_size_ != 0) {
     Reserve(current_size_ + other.current_size_);
     CopyArray(rep_->elements + current_size_,
@@ -1285,17 +1183,9 @@
   return rep_ ? rep_->elements : NULL;
 }
 
-template <typename Element>
-inline const Element* RepeatedField<Element>::unsafe_data() const {
-  GOOGLE_DCHECK(rep_);
-  return rep_->elements;
-}
 
 template <typename Element>
 inline void RepeatedField<Element>::InternalSwap(RepeatedField* other) {
-  GOOGLE_DCHECK(this != other);
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-
   std::swap(rep_, other->rep_);
   std::swap(current_size_, other->current_size_);
   std::swap(total_size_, other->total_size_);
@@ -1304,7 +1194,7 @@
 template <typename Element>
 void RepeatedField<Element>::Swap(RepeatedField* other) {
   if (this == other) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
+  if (GetArenaNoVirtual() ==  other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
     RepeatedField<Element> temp(other->GetArenaNoVirtual());
@@ -1317,6 +1207,7 @@
 template <typename Element>
 void RepeatedField<Element>::UnsafeArenaSwap(RepeatedField* other) {
   if (this == other) return;
+  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 
@@ -1358,8 +1249,9 @@
 }
 
 template <typename Element>
-inline size_t RepeatedField<Element>::SpaceUsedExcludingSelfLong() const {
-  return rep_ ? (total_size_ * sizeof(Element) + kRepHeaderSize) : 0;
+inline int RepeatedField<Element>::SpaceUsedExcludingSelf() const {
+  return rep_ ?
+      (total_size_ * sizeof(Element) + kRepHeaderSize) : 0;
 }
 
 // Avoid inlining of Reserve(): new, copy, and delete[] lead to a significant
@@ -1371,16 +1263,17 @@
   Arena* arena = GetArenaNoVirtual();
   new_size = std::max(google::protobuf::internal::kMinRepeatedFieldAllocationSize,
                       std::max(total_size_ * 2, new_size));
-  GOOGLE_DCHECK_LE(
-      static_cast<size_t>(new_size),
-      (std::numeric_limits<size_t>::max() - kRepHeaderSize) / sizeof(Element))
+  GOOGLE_CHECK_LE(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);
   if (arena == NULL) {
-    rep_ = static_cast<Rep*>(::operator new(bytes));
+    rep_ = reinterpret_cast<Rep*>(
+        new char[kRepHeaderSize + sizeof(Element) * new_size]);
   } else {
     rep_ = reinterpret_cast<Rep*>(
-            ::google::protobuf::Arena::CreateArray<char>(arena, bytes));
+            ::google::protobuf::Arena::CreateArray<char>(arena,
+                kRepHeaderSize + sizeof(Element) * new_size));
   }
   rep_->arena = arena;
   int old_total_size = total_size_;
@@ -1397,7 +1290,7 @@
   Element* e = &rep_->elements[0];
   Element* limit = &rep_->elements[total_size_];
   for (; e < limit; e++) {
-    new (e) Element;
+    new (e) Element();
   }
   if (current_size_ > 0) {
     MoveArray(rep_->elements, old_rep->elements, current_size_);
@@ -1439,7 +1332,7 @@
 template <typename Element>
 struct ElementCopier<Element, true> {
   void operator()(Element* to, const Element* from, int array_size) {
-    memcpy(to, from, static_cast<size_t>(array_size) * sizeof(Element));
+    memcpy(to, from, array_size * sizeof(Element));
   }
 };
 
@@ -1466,18 +1359,13 @@
 
 template <typename TypeHandler>
 void RepeatedPtrFieldBase::Destroy() {
-  if (rep_ != NULL && arena_ == NULL) {
-    int n = rep_->allocated_size;
-    void* const* elements = rep_->elements;
-    for (int i = 0; i < n; i++) {
-      TypeHandler::Delete(cast<TypeHandler>(elements[i]), NULL);
+  if (rep_ != NULL) {
+    for (int i = 0; i < rep_->allocated_size; i++) {
+      TypeHandler::Delete(cast<TypeHandler>(rep_->elements[i]), arena_);
     }
-#if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
-    const size_t size = total_size_ * sizeof(elements[0]) + kRepHeaderSize;
-    ::operator delete(static_cast<void*>(rep_), size);
-#else
-    ::operator delete(static_cast<void*>(rep_));
-#endif
+    if (arena_ == NULL) {
+      delete [] reinterpret_cast<char*>(rep_);
+    }
   }
   rep_ = NULL;
 }
@@ -1555,25 +1443,6 @@
   return result;
 }
 
-#if LANG_CXX11
-template <typename TypeHandler>
-inline void RepeatedPtrFieldBase::Add(
-    typename TypeHandler::Type&& value,
-    internal::enable_if<TypeHandler::Moveable>*) {
-  if (rep_ != NULL && current_size_ < rep_->allocated_size) {
-    *cast<TypeHandler>(rep_->elements[current_size_++]) = std::move(value);
-    return;
-  }
-  if (!rep_ || rep_->allocated_size == total_size_) {
-    Reserve(total_size_ + 1);
-  }
-  ++rep_->allocated_size;
-  typename TypeHandler::Type* result =
-      TypeHandler::New(arena_, std::move(value));
-  rep_->elements[current_size_++] = result;
-}
-#endif
-
 template <typename TypeHandler>
 inline void RepeatedPtrFieldBase::RemoveLast() {
   GOOGLE_DCHECK_GT(current_size_, 0);
@@ -1690,11 +1559,11 @@
 }
 
 template <typename TypeHandler>
-inline size_t RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong() const {
-  size_t allocated_bytes = static_cast<size_t>(total_size_) * sizeof(void*);
+inline int RepeatedPtrFieldBase::SpaceUsedExcludingSelf() const {
+  int allocated_bytes = total_size_ * sizeof(void*);
   if (rep_ != NULL) {
     for (int i = 0; i < rep_->allocated_size; ++i) {
-      allocated_bytes += TypeHandler::SpaceUsedLong(
+      allocated_bytes += TypeHandler::SpaceUsed(
           *cast<TypeHandler>(rep_->elements[i]));
     }
     allocated_bytes += kRepHeaderSize;
@@ -1733,6 +1602,7 @@
     elems[current_size_] = value;
     current_size_ = current_size_ + 1;
     rep_->allocated_size = rep_->allocated_size + 1;
+    return;
   } else {
     AddAllocatedSlowWithCopy<TypeHandler>(
         value, TypeHandler::GetArena(value), arena);
@@ -1779,6 +1649,7 @@
     elems[current_size_] = value;
     current_size_ = current_size_ + 1;
     ++rep_->allocated_size;
+    return;
   } else {
     UnsafeArenaAddAllocated<TypeHandler>(value);
   }
@@ -1901,6 +1772,7 @@
     : public internal::StringTypeHandler {
 };
 
+
 template <typename Element>
 inline RepeatedPtrField<Element>::RepeatedPtrField()
   : RepeatedPtrFieldBase() {}
@@ -1913,7 +1785,7 @@
 inline RepeatedPtrField<Element>::RepeatedPtrField(
     const RepeatedPtrField& other)
   : RepeatedPtrFieldBase() {
-  MergeFrom(other);
+  CopyFrom(other);
 }
 
 template <typename Element>
@@ -1942,38 +1814,6 @@
   return *this;
 }
 
-#if LANG_CXX11
-
-template <typename Element>
-inline RepeatedPtrField<Element>::RepeatedPtrField(
-    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.
-  if (other.GetArenaNoVirtual()) {
-    CopyFrom(other);
-  } else {
-    InternalSwap(&other);
-  }
-}
-
-template <typename Element>
-inline RepeatedPtrField<Element>& RepeatedPtrField<Element>::operator=(
-    RepeatedPtrField&& other) noexcept {
-  // We don't just call Swap(&other) here because it would perform 3 copies if
-  // the two fields are on different arenas.
-  if (this != &other) {
-    if (this->GetArenaNoVirtual() != other.GetArenaNoVirtual()) {
-      CopyFrom(other);
-    } else {
-      InternalSwap(&other);
-    }
-  }
-  return *this;
-}
-
-#endif  // LANG_CXX11
-
 template <typename Element>
 inline bool RepeatedPtrField<Element>::empty() const {
   return RepeatedPtrFieldBase::empty();
@@ -2000,13 +1840,6 @@
   return RepeatedPtrFieldBase::Add<TypeHandler>();
 }
 
-#if LANG_CXX11
-template <typename Element>
-inline void RepeatedPtrField<Element>::Add(Element&& value) {
-  RepeatedPtrFieldBase::Add<TypeHandler>(std::move(value));
-}
-#endif
-
 template <typename Element>
 inline void RepeatedPtrField<Element>::RemoveLast() {
   RepeatedPtrFieldBase::RemoveLast<TypeHandler>();
@@ -2149,6 +1982,7 @@
 template <typename Element>
 inline void RepeatedPtrField<Element>::UnsafeArenaSwap(
     RepeatedPtrField* other) {
+  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   if (this == other)
       return;
   RepeatedPtrFieldBase::InternalSwap(other);
@@ -2165,8 +1999,8 @@
 }
 
 template <typename Element>
-inline size_t RepeatedPtrField<Element>::SpaceUsedExcludingSelfLong() const {
-  return RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong<TypeHandler>();
+inline int RepeatedPtrField<Element>::SpaceUsedExcludingSelf() const {
+  return RepeatedPtrFieldBase::SpaceUsedExcludingSelf<TypeHandler>();
 }
 
 template <typename Element>
@@ -2258,7 +2092,7 @@
       : it_(other.it_) {
     // Force a compiler error if the other type is not convertible to ours.
     if (false) {
-      implicit_cast<Element*>(static_cast<OtherElement*>(NULL));
+      implicit_cast<Element*, OtherElement*>(0);
     }
   }
 
@@ -2324,17 +2158,18 @@
 // the array.
 // The VoidPtr template parameter holds the type-agnostic pointer value
 // 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>
+// iterator, or "const void *" for a constant iterator.
+template<typename Element, typename VoidPtr>
 class RepeatedPtrOverPtrsIterator
-    : public std::iterator<std::random_access_iterator_tag, Element> {
+    : public std::iterator<std::random_access_iterator_tag, Element*> {
  public:
   typedef RepeatedPtrOverPtrsIterator<Element, VoidPtr> iterator;
-  typedef std::iterator<std::random_access_iterator_tag, Element> superclass;
+  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 remove_const<Element>::type value_type;
+  typedef typename 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.
@@ -2346,7 +2181,7 @@
   explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {}
 
   // dereferenceable
-  reference operator*() const { return *reinterpret_cast<Element*>(it_); }
+  reference operator*() const { return *reinterpret_cast<Element**>(it_); }
   pointer   operator->() const { return &(operator*()); }
 
   // {inc,dec}rementable
@@ -2402,9 +2237,6 @@
 };
 
 void RepeatedPtrFieldBase::InternalSwap(RepeatedPtrFieldBase* other) {
-  GOOGLE_DCHECK(this != other);
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-
   std::swap(rep_, other->rep_);
   std::swap(current_size_, other->current_size_);
   std::swap(total_size_, other->total_size_);
@@ -2451,7 +2283,7 @@
 template <typename Element>
 inline typename RepeatedPtrField<Element>::const_pointer_iterator
 RepeatedPtrField<Element>::pointer_begin() const {
-  return const_pointer_iterator(const_cast<const void* const*>(raw_data()));
+  return const_pointer_iterator(const_cast<const void**>(raw_mutable_data()));
 }
 template <typename Element>
 inline typename RepeatedPtrField<Element>::pointer_iterator
@@ -2462,7 +2294,7 @@
 inline typename RepeatedPtrField<Element>::const_pointer_iterator
 RepeatedPtrField<Element>::pointer_end() const {
   return const_pointer_iterator(
-      const_cast<const void* const*>(raw_data() + size()));
+      const_cast<const void**>(raw_mutable_data() + size()));
 }
 
 
@@ -2519,12 +2351,6 @@
     *field_->Add() = *ptr_to_value;
     return *this;
   }
-#if LANG_CXX11
-  RepeatedPtrFieldBackInsertIterator<T>& operator=(T&& value) {
-    *field_->Add() = std::move(value);
-    return *this;
-  }
-#endif
   RepeatedPtrFieldBackInsertIterator<T>& operator*() {
     return *this;
   }
@@ -2539,7 +2365,7 @@
   RepeatedPtrField<T>* field_;
 };
 
-// A back inserter for RepeatedPtrFields that inserts by transferring ownership
+// A back inserter for RepeatedPtrFields that inserts by transfering ownership
 // of a pointer.
 template<typename T> class AllocatedRepeatedPtrFieldBackInsertIterator
     : public std::iterator<std::output_iterator_tag, T> {
@@ -2636,10 +2462,10 @@
 // UnsafeArenaAddAllocated instead of AddAllocated.
 // This is slightly faster if that matters. It is also useful in legacy code
 // that uses temporary ownership to avoid copies. Example:
-//   RepeatedPtrField<T> temp_field;
-//   temp_field.AddAllocated(new T);
-//   ... // Do something with temp_field
-//   temp_field.ExtractSubrange(0, temp_field.size(), NULL);
+// RepeatedPtrField<T> temp_field;
+// temp_field.AddAllocated(new T);
+// ... // Do something with temp_field
+// temp_field.ExtractSubrange(0, temp_field.size(), NULL);
 // If you put temp_field on the arena this fails, because the ownership
 // transfers to the arena at the "AddAllocated" call and is not released anymore
 // causing a double delete. Using UnsafeArenaAddAllocated prevents this.
diff --git a/src/google/protobuf/repeated_field_reflection.h b/src/google/protobuf/repeated_field_reflection.h
new file mode 100644
index 0000000..44d14d5
--- /dev/null
+++ b/src/google/protobuf/repeated_field_reflection.h
@@ -0,0 +1,337 @@
+// 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.
+
+// This header file is protobuf internal. Users should not include this
+// file directly.
+#ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_REFLECTION_H__
+#define GOOGLE_PROTOBUF_REPEATED_FIELD_REFLECTION_H__
+
+#include <memory>
+#ifndef _SHARED_PTR_H
+#include <google/protobuf/stubs/shared_ptr.h>
+#endif
+
+#include <google/protobuf/generated_enum_reflection.h>
+
+namespace google {
+namespace protobuf {
+namespace internal {
+// Interfaces used to implement reflection RepeatedFieldRef API.
+// Reflection::GetRepeatedAccessor() should return a pointer to an singleton
+// object that implements the below interface.
+//
+// This interface passes/returns values using void pointers. The actual type
+// of the value depends on the field's cpp_type. Following is a mapping from
+// cpp_type to the type that should be used in this interface:
+//
+//   field->cpp_type()      T                Actual type of void*
+//   CPPTYPE_INT32        int32                   int32
+//   CPPTYPE_UINT32       uint32                  uint32
+//   CPPTYPE_INT64        int64                   int64
+//   CPPTYPE_UINT64       uint64                  uint64
+//   CPPTYPE_DOUBLE       double                  double
+//   CPPTYPE_FLOAT        float                   float
+//   CPPTYPE_BOOL         bool                    bool
+//   CPPTYPE_ENUM         generated enum type     int32
+//   CPPTYPE_STRING       string                  string
+//   CPPTYPE_MESSAGE      generated message type  google::protobuf::Message
+//                        or google::protobuf::Message
+//
+// Note that for enums we use int32 in the interface.
+//
+// You can map from T to the actual type using RefTypeTraits:
+//   typedef RefTypeTraits<T>::AccessorValueType ActualType;
+class LIBPROTOBUF_EXPORT RepeatedFieldAccessor {
+ public:
+  // Typedefs for clarity.
+  typedef void Field;
+  typedef void Value;
+  typedef void Iterator;
+
+  virtual ~RepeatedFieldAccessor();
+  virtual bool IsEmpty(const Field* data) const = 0;
+  virtual int Size(const Field* data) const = 0;
+  // Depends on the underlying representation of the repeated field, this
+  // method can return a pointer to the underlying object if such an object
+  // 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 void Clear(Field* data) const = 0;
+  virtual void Set(Field* data, int index, const Value* value) const = 0;
+  virtual void Add(Field* data, const Value* value) const = 0;
+  virtual void RemoveLast(Field* data) const = 0;
+  virtual void SwapElements(Field* data, int index1, int index2) const = 0;
+  virtual void Swap(Field* data, const RepeatedFieldAccessor* other_mutator,
+                    Field* other_data) const = 0;
+
+  // Create an iterator that points at the begining of the repeated field.
+  virtual Iterator* BeginIterator(const Field* data) const = 0;
+  // Create an iterator that points at the end of the repeated field.
+  virtual Iterator* EndIterator(const Field* data) const = 0;
+  // Make a copy of an iterator and return the new copy.
+  virtual Iterator* CopyIterator(const Field* data,
+                                 const Iterator* iterator) const = 0;
+  // Move an iterator to point to the next element.
+  virtual Iterator* AdvanceIterator(const Field* data,
+                                    Iterator* iterator) const = 0;
+  // Compare whether two iterators point to the same element.
+  virtual bool EqualsIterator(const Field* data, const Iterator* a,
+                              const Iterator* b) const = 0;
+  // Delete an iterator created by BeginIterator(), EndIterator() and
+  // CopyIterator().
+  virtual void DeleteIterator(const Field* data, Iterator* iterator) const = 0;
+  // Like Get() but for iterators.
+  virtual const Value* GetIteratorValue(const Field* data,
+                                        const Iterator* iterator,
+                                        Value* scratch_space) const = 0;
+
+  // Templated methods that make using this interface easier for non-message
+  // types.
+  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))));
+  }
+
+  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
+    // raw pointers. Type of the data these raw pointers point to should
+    // be ActualType. Here we have a ValueType object and want a ActualType
+    // pointer. We can't cast a ValueType pointer to an ActualType pointer
+    // directly because their type might be different (for enums ValueType
+    // may be a generated enum type while ActualType is int32). To be safe
+    // we make a copy to get a temporary ActualType object and use it.
+    ActualType tmp = static_cast<ActualType>(value);
+    Set(data, index, static_cast<const Value*>(&tmp));
+  }
+
+  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
+    // raw pointers. Type of the data these raw pointers point to should
+    // be ActualType. Here we have a ValueType object and want a ActualType
+    // pointer. We can't cast a ValueType pointer to an ActualType pointer
+    // directly because their type might be different (for enums ValueType
+    // may be a generated enum type while ActualType is int32). To be safe
+    // we make a copy to get a temporary ActualType object and use it.
+    ActualType tmp = static_cast<ActualType>(value);
+    Add(data, static_cast<const Value*>(&tmp));
+  }
+};
+
+// Implement (Mutable)RepeatedFieldRef::iterator
+template<typename T>
+class RepeatedFieldRefIterator
+    : public std::iterator<std::forward_iterator_tag, T> {
+  typedef typename RefTypeTraits<T>::AccessorValueType AccessorValueType;
+  typedef typename RefTypeTraits<T>::IteratorValueType IteratorValueType;
+  typedef typename RefTypeTraits<T>::IteratorPointerType IteratorPointerType;
+
+ public:
+  // Constructor for non-message fields.
+  RepeatedFieldRefIterator(const void* data,
+                           const RepeatedFieldAccessor* accessor,
+                           bool begin)
+      : data_(data), accessor_(accessor),
+        iterator_(begin ? accessor->BeginIterator(data) :
+                          accessor->EndIterator(data)),
+        scratch_space_(new AccessorValueType) {
+  }
+  // Constructor for message fields.
+  RepeatedFieldRefIterator(const void* data,
+                           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_);
+  }
+  RepeatedFieldRefIterator operator++(int) {
+    RepeatedFieldRefIterator tmp(*this);
+    iterator_ = accessor_->AdvanceIterator(data_, iterator_);
+    return tmp;
+  }
+  RepeatedFieldRefIterator& operator++() {
+    iterator_ = accessor_->AdvanceIterator(data_, iterator_);
+    return *this;
+  }
+  IteratorValueType operator*() const {
+    return static_cast<IteratorValueType>(
+        *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()));
+  }
+  bool operator!=(const RepeatedFieldRefIterator& other) const {
+    assert(data_ == other.data_);
+    assert(accessor_ == other.accessor_);
+    return !accessor_->EqualsIterator(data_, iterator_, other.iterator_);
+  }
+  bool operator==(const RepeatedFieldRefIterator& other) const {
+    return !this->operator!=(other);
+  }
+
+  RepeatedFieldRefIterator(const RepeatedFieldRefIterator& other)
+      : data_(other.data_), accessor_(other.accessor_),
+        iterator_(accessor_->CopyIterator(data_, other.iterator_)) {
+  }
+  RepeatedFieldRefIterator& operator=(const RepeatedFieldRefIterator& other) {
+    if (this != &other) {
+      accessor_->DeleteIterator(data_, iterator_);
+      data_ = other.data_;
+      accessor_ = other.accessor_;
+      iterator_ = accessor_->CopyIterator(data_, other.iterator_);
+    }
+    return *this;
+  }
+
+ protected:
+  const void* data_;
+  const RepeatedFieldAccessor* accessor_;
+  void* iterator_;
+  google::protobuf::scoped_ptr<AccessorValueType> scratch_space_;
+};
+
+// TypeTraits that maps the type parameter T of RepeatedFieldRef or
+// MutableRepeatedFieldRef to corresponding iterator type,
+// RepeatedFieldAccessor type, etc.
+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_PRIMITIVE(INT32, int32)
+DEFINE_PRIMITIVE(UINT32, uint32)
+DEFINE_PRIMITIVE(INT64, int64)
+DEFINE_PRIMITIVE(UINT64, uint64)
+DEFINE_PRIMITIVE(FLOAT, float)
+DEFINE_PRIMITIVE(DOUBLE, double)
+DEFINE_PRIMITIVE(BOOL, bool)
+#undef DEFINE_PRIMITIVE
+
+template<typename T>
+struct RefTypeTraits<
+    T, typename internal::enable_if<PrimitiveTraits<T>::is_primitive>::type> {
+  typedef RepeatedFieldRefIterator<T> iterator;
+  typedef RepeatedFieldAccessor AccessorType;
+  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;
+  }
+};
+
+template<typename T>
+struct RefTypeTraits<
+    T, typename internal::enable_if<is_proto_enum<T>::value>::type> {
+  typedef RepeatedFieldRefIterator<T> iterator;
+  typedef RepeatedFieldAccessor AccessorType;
+  // We use int32 for repeated enums in RepeatedFieldAccessor.
+  typedef int32 AccessorValueType;
+  typedef T IteratorValueType;
+  typedef int32* IteratorPointerType;
+  static const FieldDescriptor::CppType cpp_type =
+      FieldDescriptor::CPPTYPE_ENUM;
+  static const Descriptor* GetMessageFieldDescriptor() {
+    return NULL;
+  }
+};
+
+template<typename T>
+struct RefTypeTraits<
+    T, typename internal::enable_if<internal::is_same<string, T>::value>::type> {
+  typedef RepeatedFieldRefIterator<T> iterator;
+  typedef RepeatedFieldAccessor AccessorType;
+  typedef string AccessorValueType;
+  typedef string IteratorValueType;
+  typedef string* IteratorPointerType;
+  static const FieldDescriptor::CppType cpp_type =
+      FieldDescriptor::CPPTYPE_STRING;
+  static const Descriptor* GetMessageFieldDescriptor() {
+    return NULL;
+  }
+};
+
+template<typename T>
+struct MessageDescriptorGetter {
+  static const Descriptor* get() {
+    return T::default_instance().GetDescriptor();
+  }
+};
+template<>
+struct MessageDescriptorGetter<Message> {
+  static const Descriptor* get() {
+    return NULL;
+  }
+};
+
+template<typename T>
+struct RefTypeTraits<
+    T, typename internal::enable_if<internal::is_base_of<Message, T>::value>::type> {
+  typedef RepeatedFieldRefIterator<T> iterator;
+  typedef RepeatedFieldAccessor AccessorType;
+  typedef Message AccessorValueType;
+  typedef const T& IteratorValueType;
+  typedef const T* IteratorPointerType;
+  static const FieldDescriptor::CppType cpp_type =
+      FieldDescriptor::CPPTYPE_MESSAGE;
+  static const Descriptor* GetMessageFieldDescriptor() {
+    return MessageDescriptorGetter<T>::get();
+  }
+};
+}  // namespace internal
+}  // namespace protobuf
+}  // namespace google
+#endif  // GOOGLE_PROTOBUF_REPEATED_FIELD_REFLECTION_H__
diff --git a/src/google/protobuf/repeated_field_reflection_unittest.cc b/src/google/protobuf/repeated_field_reflection_unittest.cc
index fd46656..fcebe5c 100644
--- a/src/google/protobuf/repeated_field_reflection_unittest.cc
+++ b/src/google/protobuf/repeated_field_reflection_unittest.cc
@@ -189,8 +189,8 @@
   }
 }
 
-template <typename Ref, typename MessageType, typename ValueType>
-void TestRepeatedFieldRefIteratorForPrimitive(
+template<typename Ref, typename MessageType, typename ValueType>
+void TestRepeatedFieldRefIterator(
     const Ref& handle, const MessageType& message,
     ValueType (MessageType::*GetFunc)(int) const) {
   int index = 0;
@@ -202,21 +202,6 @@
   EXPECT_EQ(handle.size(), index);
 }
 
-template <typename MessageType, typename ValueType>
-void TestRepeatedFieldRefIteratorForString(
-    const RepeatedFieldRef<string>& handle, const MessageType& message,
-    ValueType (MessageType::*GetFunc)(int) const) {
-  int index = 0;
-  for (typename RepeatedFieldRef<string>::const_iterator it = handle.begin();
-       it != handle.end(); ++it) {
-    // Test both operator* and operator->
-    EXPECT_EQ((message.*GetFunc)(index), *it);
-    EXPECT_EQ((message.*GetFunc)(index).size(), it->size());
-    ++index;
-  }
-  EXPECT_EQ(handle.size(), index);
-}
-
 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForRegularFields) {
   TestAllTypes message;
   const Reflection* refl = message.GetReflection();
@@ -327,12 +312,12 @@
   }
 
   // Test iterators.
-  TestRepeatedFieldRefIteratorForPrimitive(rf_int32, message,
-                                           &TestAllTypes::repeated_int32);
-  TestRepeatedFieldRefIteratorForPrimitive(rf_double, message,
-                                           &TestAllTypes::repeated_double);
-  TestRepeatedFieldRefIteratorForString(rf_string, message,
-                                        &TestAllTypes::repeated_string);
+  TestRepeatedFieldRefIterator(rf_int32, message,
+                               &TestAllTypes::repeated_int32);
+  TestRepeatedFieldRefIterator(rf_double, message,
+                               &TestAllTypes::repeated_double);
+  TestRepeatedFieldRefIterator(rf_string, message,
+                               &TestAllTypes::repeated_string);
 
   // Test iterators for message fields.
   typedef RepeatedFieldRef<ForeignMessage>::iterator MessageIterator;
@@ -489,10 +474,10 @@
     EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(i));
   }
 
-  TestRepeatedFieldRefIteratorForPrimitive(enum_ref, message,
-                                           &TestAllTypes::repeated_nested_enum);
-  TestRepeatedFieldRefIteratorForPrimitive(int32_ref, message,
-                                           &TestAllTypes::repeated_nested_enum);
+  TestRepeatedFieldRefIterator(enum_ref, message,
+                               &TestAllTypes::repeated_nested_enum);
+  TestRepeatedFieldRefIterator(int32_ref, message,
+                               &TestAllTypes::repeated_nested_enum);
 
   // Test Add()
   mutable_enum_ref.Add(TestAllTypes::FOO);
diff --git a/src/google/protobuf/repeated_field_unittest.cc b/src/google/protobuf/repeated_field_unittest.cc
index 1691971..39b24b3 100644
--- a/src/google/protobuf/repeated_field_unittest.cc
+++ b/src/google/protobuf/repeated_field_unittest.cc
@@ -45,19 +45,17 @@
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/unittest.pb.h>
-#include <gmock/gmock.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/stubs/stl_util.h>
 
 namespace google {
+using protobuf_unittest::TestAllTypes;
+
 namespace protobuf {
 namespace {
 
-using ::protobuf_unittest::TestAllTypes;
-using ::testing::ElementsAre;
-
 // Test operations on a small RepeatedField.
 TEST(RepeatedField, Small) {
   RepeatedField<int> field;
@@ -97,7 +95,7 @@
   EXPECT_EQ(field.size(), 0);
   // Additional bytes are for 'struct Rep' header.
   int expected_usage = 4 * sizeof(int) + sizeof(Arena*);
-  EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
+  EXPECT_EQ(field.SpaceUsedExcludingSelf(), expected_usage);
 }
 
 
@@ -209,7 +207,7 @@
   RepeatedField<int> field;
   field.Reserve(20);
 
-  EXPECT_LE(20, ReservedSpace(&field));
+  EXPECT_EQ(20, ReservedSpace(&field));
 }
 
 TEST(RepeatedField, ReserveLessThanDouble) {
@@ -217,10 +215,9 @@
   // field to grow by double instead.
   RepeatedField<int> field;
   field.Reserve(20);
-  int capacity = field.Capacity();
-  field.Reserve(capacity * 1.5);
+  field.Reserve(30);
 
-  EXPECT_LE(2 * capacity, ReservedSpace(&field));
+  EXPECT_EQ(40, ReservedSpace(&field));
 }
 
 TEST(RepeatedField, ReserveLessThanExisting) {
@@ -232,7 +229,7 @@
   field.Reserve(10);
 
   EXPECT_EQ(previous_ptr, field.data());
-  EXPECT_LE(20, ReservedSpace(&field));
+  EXPECT_EQ(20, ReservedSpace(&field));
 }
 
 TEST(RepeatedField, Resize) {
@@ -269,6 +266,13 @@
   EXPECT_EQ(5, destination.Get(4));
 }
 
+#ifdef PROTOBUF_HAS_DEATH_TEST
+TEST(RepeatedField, MergeFromSelf) {
+  RepeatedField<int> me;
+  me.Add(3);
+  EXPECT_DEATH(me.MergeFrom(me), "");
+}
+#endif  // PROTOBUF_HAS_DEATH_TEST
 
 TEST(RepeatedField, CopyFrom) {
   RepeatedField<int> source, destination;
@@ -339,7 +343,7 @@
 }
 
 TEST(RepeatedField, IteratorConstruct) {
-  std::vector<int> values;
+  vector<int> values;
   values.push_back(1);
   values.push_back(2);
 
@@ -383,142 +387,6 @@
   EXPECT_EQ(8, source.Get(1));
 }
 
-#if LANG_CXX11
-
-TEST(RepeatedField, MoveConstruct) {
-  {
-    RepeatedField<int> source;
-    source.Add(1);
-    source.Add(2);
-    const int* data = source.data();
-    RepeatedField<int> destination = std::move(source);
-    EXPECT_EQ(data, destination.data());
-    EXPECT_THAT(destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_TRUE(source.empty());
-  }
-  {
-    Arena arena;
-    RepeatedField<int>* source =
-        Arena::CreateMessage<RepeatedField<int>>(&arena);
-    source->Add(1);
-    source->Add(2);
-    RepeatedField<int> destination = std::move(*source);
-    EXPECT_EQ(NULL, destination.GetArena());
-    EXPECT_THAT(destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(*source, ElementsAre(1, 2));
-  }
-}
-
-TEST(RepeatedField, MoveAssign) {
-  {
-    RepeatedField<int> source;
-    source.Add(1);
-    source.Add(2);
-    RepeatedField<int> destination;
-    destination.Add(3);
-    const int* source_data = source.data();
-    const int* destination_data = destination.data();
-    destination = std::move(source);
-    EXPECT_EQ(source_data, destination.data());
-    EXPECT_THAT(destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_EQ(destination_data, source.data());
-    EXPECT_THAT(source, ElementsAre(3));
-  }
-  {
-    Arena arena;
-    RepeatedField<int>* source =
-        Arena::CreateMessage<RepeatedField<int>>(&arena);
-    source->Add(1);
-    source->Add(2);
-    RepeatedField<int>* destination =
-        Arena::CreateMessage<RepeatedField<int>>(&arena);
-    destination->Add(3);
-    const int* source_data = source->data();
-    const int* destination_data = destination->data();
-    *destination = std::move(*source);
-    EXPECT_EQ(source_data, destination->data());
-    EXPECT_THAT(*destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_EQ(destination_data, source->data());
-    EXPECT_THAT(*source, ElementsAre(3));
-  }
-  {
-    Arena source_arena;
-    RepeatedField<int>* source =
-        Arena::CreateMessage<RepeatedField<int>>(&source_arena);
-    source->Add(1);
-    source->Add(2);
-    Arena destination_arena;
-    RepeatedField<int>* destination =
-        Arena::CreateMessage<RepeatedField<int>>(&destination_arena);
-    destination->Add(3);
-    *destination = std::move(*source);
-    EXPECT_THAT(*destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(*source, ElementsAre(1, 2));
-  }
-  {
-    Arena arena;
-    RepeatedField<int>* source =
-        Arena::CreateMessage<RepeatedField<int>>(&arena);
-    source->Add(1);
-    source->Add(2);
-    RepeatedField<int> destination;
-    destination.Add(3);
-    destination = std::move(*source);
-    EXPECT_THAT(destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(*source, ElementsAre(1, 2));
-  }
-  {
-    RepeatedField<int> source;
-    source.Add(1);
-    source.Add(2);
-    Arena arena;
-    RepeatedField<int>* destination =
-        Arena::CreateMessage<RepeatedField<int>>(&arena);
-    destination->Add(3);
-    *destination = std::move(source);
-    EXPECT_THAT(*destination, ElementsAre(1, 2));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(source, ElementsAre(1, 2));
-  }
-  {
-    RepeatedField<int> field;
-    // An alias to defeat -Wself-move.
-    RepeatedField<int>& alias = field;
-    field.Add(1);
-    field.Add(2);
-    const int* data = field.data();
-    field = std::move(alias);
-    EXPECT_EQ(data, field.data());
-    EXPECT_THAT(field, ElementsAre(1, 2));
-  }
-  {
-    Arena arena;
-    RepeatedField<int>* field =
-        Arena::CreateMessage<RepeatedField<int>>(&arena);
-    field->Add(1);
-    field->Add(2);
-    const int* data = field->data();
-    *field = std::move(*field);
-    EXPECT_EQ(data, field->data());
-    EXPECT_THAT(*field, ElementsAre(1, 2));
-  }
-}
-
-#endif  // LANG_CXX11
-
 TEST(RepeatedField, MutableDataIsMutable) {
   RepeatedField<int> field;
   field.Add(1);
@@ -529,16 +397,6 @@
   EXPECT_EQ(2, field.Get(0));
 }
 
-TEST(RepeatedField, SubscriptOperators) {
-  RepeatedField<int> field;
-  field.Add(1);
-  EXPECT_EQ(1, field.Get(0));
-  EXPECT_EQ(1, field[0]);
-  EXPECT_EQ(field.Mutable(0), &field[0]);
-  const RepeatedField<int>& const_field = field;
-  EXPECT_EQ(field.data(), &const_field[0]);
-}
-
 TEST(RepeatedField, Truncate) {
   RepeatedField<int> field;
 
@@ -612,11 +470,11 @@
   EXPECT_EQ(32, field.size());
   field.Clear();
   EXPECT_EQ(0, field.size());
-  EXPECT_LE(32, field.Capacity());
+  EXPECT_EQ(32, field.Capacity());
 
   field.Reserve(1024);
   EXPECT_EQ(0, field.size());
-  EXPECT_LE(1024, field.Capacity());
+  EXPECT_EQ(1024, field.Capacity());
   // Finish test -- |field| should destroy the cleared-but-not-yet-destroyed
   // strings.
 }
@@ -771,18 +629,15 @@
   RepeatedPtrField<string> field;
   field.Reserve(20);
 
-  EXPECT_LE(20, ReservedSpace(&field));
+  EXPECT_EQ(20, ReservedSpace(&field));
 }
 
 TEST(RepeatedPtrField, ReserveLessThanDouble) {
   RepeatedPtrField<string> field;
   field.Reserve(20);
+  field.Reserve(30);
 
-  int capacity = field.Capacity();
-  // Grow by 1.5x
-  field.Reserve(capacity + (capacity >> 2));
-
-  EXPECT_LE(2 * capacity, ReservedSpace(&field));
+  EXPECT_EQ(40, ReservedSpace(&field));
 }
 
 TEST(RepeatedPtrField, ReserveLessThanExisting) {
@@ -792,7 +647,7 @@
   field.Reserve(10);
 
   EXPECT_EQ(previous_ptr, field.data());
-  EXPECT_LE(20, ReservedSpace(&field));
+  EXPECT_EQ(20, ReservedSpace(&field));
 }
 
 TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) {
@@ -912,6 +767,13 @@
   EXPECT_EQ("5", destination.Get(4));
 }
 
+#ifdef PROTOBUF_HAS_DEATH_TEST
+TEST(RepeatedPtrField, MergeFromSelf) {
+  RepeatedPtrField<string> me;
+  me.Add()->assign("1");
+  EXPECT_DEATH(me.MergeFrom(me), "");
+}
+#endif  // PROTOBUF_HAS_DEATH_TEST
 
 TEST(RepeatedPtrField, CopyFrom) {
   RepeatedPtrField<string> source, destination;
@@ -982,7 +844,7 @@
 }
 
 TEST(RepeatedPtrField, IteratorConstruct_String) {
-  std::vector<string> values;
+  vector<string> values;
   values.push_back("1");
   values.push_back("2");
 
@@ -999,7 +861,7 @@
 
 TEST(RepeatedPtrField, IteratorConstruct_Proto) {
   typedef TestAllTypes::NestedMessage Nested;
-  std::vector<Nested> values;
+  vector<Nested> values;
   values.push_back(Nested());
   values.back().set_bb(1);
   values.push_back(Nested());
@@ -1045,142 +907,6 @@
   EXPECT_EQ("8", source.Get(1));
 }
 
-#if LANG_CXX11
-
-TEST(RepeatedPtrField, MoveConstruct) {
-  {
-    RepeatedPtrField<string> source;
-    *source.Add() = "1";
-    *source.Add() = "2";
-    const string* const* data = source.data();
-    RepeatedPtrField<string> destination = std::move(source);
-    EXPECT_EQ(data, destination.data());
-    EXPECT_THAT(destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_TRUE(source.empty());
-  }
-  {
-    Arena arena;
-    RepeatedPtrField<string>* source =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&arena);
-    *source->Add() = "1";
-    *source->Add() = "2";
-    RepeatedPtrField<string> destination = std::move(*source);
-    EXPECT_EQ(NULL, destination.GetArena());
-    EXPECT_THAT(destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(*source, ElementsAre("1", "2"));
-  }
-}
-
-TEST(RepeatedPtrField, MoveAssign) {
-  {
-    RepeatedPtrField<string> source;
-    *source.Add() = "1";
-    *source.Add() = "2";
-    RepeatedPtrField<string> destination;
-    *destination.Add() = "3";
-    const string* const* source_data = source.data();
-    const string* const* destination_data = destination.data();
-    destination = std::move(source);
-    EXPECT_EQ(source_data, destination.data());
-    EXPECT_THAT(destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_EQ(destination_data, source.data());
-    EXPECT_THAT(source, ElementsAre("3"));
-  }
-  {
-    Arena arena;
-    RepeatedPtrField<string>* source =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&arena);
-    *source->Add() = "1";
-    *source->Add() = "2";
-    RepeatedPtrField<string>* destination =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&arena);
-    *destination->Add() = "3";
-    const string* const* source_data = source->data();
-    const string* const* destination_data = destination->data();
-    *destination = std::move(*source);
-    EXPECT_EQ(source_data, destination->data());
-    EXPECT_THAT(*destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_EQ(destination_data, source->data());
-    EXPECT_THAT(*source, ElementsAre("3"));
-  }
-  {
-    Arena source_arena;
-    RepeatedPtrField<string>* source =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&source_arena);
-    *source->Add() = "1";
-    *source->Add() = "2";
-    Arena destination_arena;
-    RepeatedPtrField<string>* destination =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&destination_arena);
-    *destination->Add() = "3";
-    *destination = std::move(*source);
-    EXPECT_THAT(*destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(*source, ElementsAre("1", "2"));
-  }
-  {
-    Arena arena;
-    RepeatedPtrField<string>* source =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&arena);
-    *source->Add() = "1";
-    *source->Add() = "2";
-    RepeatedPtrField<string> destination;
-    *destination.Add() = "3";
-    destination = std::move(*source);
-    EXPECT_THAT(destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(*source, ElementsAre("1", "2"));
-  }
-  {
-    RepeatedPtrField<string> source;
-    *source.Add() = "1";
-    *source.Add() = "2";
-    Arena arena;
-    RepeatedPtrField<string>* destination =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&arena);
-    *destination->Add() = "3";
-    *destination = std::move(source);
-    EXPECT_THAT(*destination, ElementsAre("1", "2"));
-    // This property isn't guaranteed but it's useful to have a test that would
-    // catch changes in this area.
-    EXPECT_THAT(source, ElementsAre("1", "2"));
-  }
-  {
-    RepeatedPtrField<string> field;
-    // An alias to defeat -Wself-move.
-    RepeatedPtrField<string>& alias = field;
-    *field.Add() = "1";
-    *field.Add() = "2";
-    const string* const* data = field.data();
-    field = std::move(alias);
-    EXPECT_EQ(data, field.data());
-    EXPECT_THAT(field, ElementsAre("1", "2"));
-  }
-  {
-    Arena arena;
-    RepeatedPtrField<string>* field =
-        Arena::CreateMessage<RepeatedPtrField<string>>(&arena);
-    *field->Add() = "1";
-    *field->Add() = "2";
-    const string* const* data = field->data();
-    *field = std::move(*field);
-    EXPECT_EQ(data, field->data());
-    EXPECT_THAT(*field, ElementsAre("1", "2"));
-  }
-}
-
-#endif  // LANG_CXX11
-
 TEST(RepeatedPtrField, MutableDataIsMutable) {
   RepeatedPtrField<string> field;
   *field.Add() = "1";
@@ -1192,16 +918,6 @@
   EXPECT_EQ("2", field.Get(0));
 }
 
-TEST(RepeatedPtrField, SubscriptOperators) {
-  RepeatedPtrField<string> field;
-  *field.Add() = "1";
-  EXPECT_EQ("1", field.Get(0));
-  EXPECT_EQ("1", field[0]);
-  EXPECT_EQ(field.Mutable(0), &field[0]);
-  const RepeatedPtrField<string>& const_field = field;
-  EXPECT_EQ(*field.data(), &const_field[0]);
-}
-
 TEST(RepeatedPtrField, ExtractSubrange) {
   // Exhaustively test every subrange in arrays of all sizes from 0 through 9
   // with 0 through 3 cleared elements at the end.
@@ -1209,7 +925,7 @@
     for (int num = 0; num <= sz; ++num) {
       for (int start = 0; start < sz - num; ++start) {
         for (int extra = 0; extra < 4; ++extra) {
-          std::vector<string*> subject;
+          vector<string*> subject;
 
           // Create an array with "sz" elements and "extra" cleared elements.
           RepeatedPtrField<string> field;
@@ -1771,7 +1487,7 @@
 
 TEST_F(RepeatedFieldInsertionIteratorsTest,
        AllocatedRepeatedPtrFieldWithStringIntData) {
-  std::vector<Nested*> data;
+  vector<Nested*> data;
   TestAllTypes goldenproto;
   for (int i = 0; i < 10; ++i) {
     Nested* new_data = new Nested;
@@ -1790,7 +1506,7 @@
 
 TEST_F(RepeatedFieldInsertionIteratorsTest,
        AllocatedRepeatedPtrFieldWithString) {
-  std::vector<string*> data;
+  vector<string*> data;
   TestAllTypes goldenproto;
   for (int i = 0; i < 10; ++i) {
     string* new_data = new string;
@@ -1808,7 +1524,7 @@
 
 TEST_F(RepeatedFieldInsertionIteratorsTest,
        UnsafeArenaAllocatedRepeatedPtrFieldWithStringIntData) {
-  std::vector<Nested*> data;
+  vector<Nested*> data;
   TestAllTypes goldenproto;
   for (int i = 0; i < 10; ++i) {
     Nested* new_data = new Nested;
@@ -1827,7 +1543,7 @@
 
 TEST_F(RepeatedFieldInsertionIteratorsTest,
        UnsafeArenaAllocatedRepeatedPtrFieldWithString) {
-  std::vector<string*> data;
+  vector<string*> data;
   TestAllTypes goldenproto;
   for (int i = 0; i < 10; ++i) {
     string* new_data = new string;
@@ -1844,38 +1560,6 @@
   EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
 }
 
-#if LANG_CXX11
-TEST_F(RepeatedFieldInsertionIteratorsTest, MoveStrings) {
-  std::vector<string> src = {"a", "b", "c", "d"};
-  std::vector<string> copy = src;  // copy since move leaves in undefined state
-  TestAllTypes testproto;
-  std::move(copy.begin(), copy.end(),
-            RepeatedFieldBackInserter(testproto.mutable_repeated_string()));
-
-  ASSERT_THAT(testproto.repeated_string(), testing::ElementsAreArray(src));
-}
-
-TEST_F(RepeatedFieldInsertionIteratorsTest, MoveProtos) {
-  auto make_nested = [](int32 x) {
-    Nested ret;
-    ret.set_bb(x);
-    return ret;
-  };
-  std::vector<Nested> src = {make_nested(3), make_nested(5), make_nested(7)};
-  std::vector<Nested> copy = src;  // copy since move leaves in undefined state
-  TestAllTypes testproto;
-  std::move(
-      copy.begin(), copy.end(),
-      RepeatedFieldBackInserter(testproto.mutable_repeated_nested_message()));
-
-  ASSERT_EQ(src.size(), testproto.repeated_nested_message_size());
-  for (int i = 0; i < src.size(); ++i) {
-    EXPECT_EQ(src[i].DebugString(),
-              testproto.repeated_nested_message(i).DebugString());
-  }
-}
-#endif
-
 }  // namespace
 
 }  // namespace protobuf
diff --git a/src/google/protobuf/source_context.pb.cc b/src/google/protobuf/source_context.pb.cc
index 4a290e1..c67cd10 100644
--- a/src/google/protobuf/source_context.pb.cc
+++ b/src/google/protobuf/source_context.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/source_context.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/source_context.pb.h>
 
 #include <algorithm>
@@ -14,141 +15,129 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class SourceContextDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<SourceContext>
-      _instance;
-} _SourceContext_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto {
-void InitDefaultsSourceContextImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_SourceContext_default_instance_;
-    new (ptr) ::google::protobuf::SourceContext();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::SourceContext::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* SourceContext_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  SourceContext_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fsource_5fcontext_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/source_context.proto");
+  GOOGLE_CHECK(file != NULL);
+  SourceContext_descriptor_ = file->message_type(0);
+  static const int SourceContext_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceContext, file_name_),
+  };
+  SourceContext_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      SourceContext_descriptor_,
+      SourceContext::default_instance_,
+      SourceContext_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(SourceContext),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceContext, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceContext, _is_default_instance_));
 }
 
-void InitDefaultsSourceContext() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsSourceContextImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fsource_5fcontext_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceContext, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceContext, file_name_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::SourceContext)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_SourceContext_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/source_context.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      SourceContext_descriptor_, &SourceContext::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n$google/protobuf/source_context.proto\022\017"
-      "google.protobuf\"\"\n\rSourceContext\022\021\n\tfile"
-      "_name\030\001 \001(\tB\225\001\n\023com.google.protobufB\022Sou"
-      "rceContextProtoP\001ZAgoogle.golang.org/gen"
-      "proto/protobuf/source_context;source_con"
-      "text\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTy"
-      "pesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fsource_5fcontext_2eproto() {
+  delete SourceContext::default_instance_;
+  delete SourceContext_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 251);
+    "\n$google/protobuf/source_context.proto\022\017"
+    "google.protobuf\"\"\n\rSourceContext\022\021\n\tfile"
+    "_name\030\001 \001(\tBU\n\023com.google.protobufB\022Sour"
+    "ceContextProtoP\001\240\001\001\242\002\003GPB\252\002\036Google.Proto"
+    "buf.WellKnownTypesb\006proto3", 186);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/source_context.proto", &protobuf_RegisterTypes);
+  SourceContext::default_instance_ = new SourceContext();
+  SourceContext::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fsource_5fcontext_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fsource_5fcontext_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fsource_5fcontext_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fsource_5fcontext_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void SourceContext::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int SourceContext::kFileNameFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 SourceContext::SourceContext()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.SourceContext)
 }
+
+void SourceContext::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 SourceContext::SourceContext(const SourceContext& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  file_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.file_name().size() > 0) {
-    file_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.file_name_);
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceContext)
 }
 
 void SourceContext::SharedCtor() {
-  file_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
+  file_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 
 SourceContext::~SourceContext() {
@@ -158,6 +147,8 @@
 
 void SourceContext::SharedDtor() {
   file_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
 void SourceContext::SetCachedSize(int size) const {
@@ -166,15 +157,17 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* SourceContext::descriptor() {
-  ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return SourceContext_descriptor_;
 }
 
 const SourceContext& SourceContext::default_instance() {
-  ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+  return *default_instance_;
 }
 
+SourceContext* SourceContext::default_instance_ = NULL;
+
 SourceContext* SourceContext::New(::google::protobuf::Arena* arena) const {
   SourceContext* n = new SourceContext;
   if (arena != NULL) {
@@ -185,12 +178,7 @@
 
 void SourceContext::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.SourceContext)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   file_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  _internal_metadata_.Clear();
 }
 
 bool SourceContext::MergePartialFromCodedStream(
@@ -199,33 +187,34 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.SourceContext)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string file_name = 1;
+      // optional string file_name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_file_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->file_name().data(), static_cast<int>(this->file_name().length()),
+            this->file_name().data(), this->file_name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.SourceContext.file_name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -242,37 +231,26 @@
 void SourceContext::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.SourceContext)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string file_name = 1;
+  // optional string file_name = 1;
   if (this->file_name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->file_name().data(), static_cast<int>(this->file_name().length()),
+      this->file_name().data(), this->file_name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.SourceContext.file_name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->file_name(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.SourceContext)
 }
 
-::google::protobuf::uint8* SourceContext::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* SourceContext::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceContext)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string file_name = 1;
+  // optional string file_name = 1;
   if (this->file_name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->file_name().data(), static_cast<int>(this->file_name().length()),
+      this->file_name().data(), this->file_name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.SourceContext.file_name");
     target =
@@ -280,41 +258,31 @@
         1, this->file_name(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceContext)
   return target;
 }
 
-size_t SourceContext::ByteSizeLong() const {
+int SourceContext::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceContext)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // string file_name = 1;
+  // optional string file_name = 1;
   if (this->file_name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->file_name());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void SourceContext::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.SourceContext)
-  GOOGLE_DCHECK_NE(&from, this);
-  const SourceContext* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const SourceContext* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const SourceContext>(
           &from);
   if (source == NULL) {
@@ -328,11 +296,7 @@
 
 void SourceContext::MergeFrom(const SourceContext& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceContext)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.file_name().size() > 0) {
 
     file_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.file_name_);
@@ -354,6 +318,7 @@
 }
 
 bool SourceContext::IsInitialized() const {
+
   return true;
 }
 
@@ -362,19 +327,70 @@
   InternalSwap(other);
 }
 void SourceContext::InternalSwap(SourceContext* other) {
-  using std::swap;
   file_name_.Swap(&other->file_name_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata SourceContext::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = SourceContext_descriptor_;
+  metadata.reflection = SourceContext_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// SourceContext
+
+// optional string file_name = 1;
+void SourceContext::clear_file_name() {
+  file_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& SourceContext::file_name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.SourceContext.file_name)
+  return file_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void SourceContext::set_file_name(const ::std::string& value) {
+  
+  file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.SourceContext.file_name)
+}
+ void SourceContext::set_file_name(const char* value) {
+  
+  file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.SourceContext.file_name)
+}
+ void SourceContext::set_file_name(const char* value, size_t size) {
+  
+  file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceContext.file_name)
+}
+ ::std::string* SourceContext::mutable_file_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.SourceContext.file_name)
+  return file_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* SourceContext::release_file_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.SourceContext.file_name)
+  
+  return file_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void SourceContext::set_allocated_file_name(::std::string* file_name) {
+  if (file_name != NULL) {
+    
+  } else {
+    
+  }
+  file_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), file_name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceContext.file_name)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/source_context.pb.h b/src/google/protobuf/source_context.pb.h
index dfa2444..ccfd365 100644
--- a/src/google/protobuf/source_context.pb.h
+++ b/src/google/protobuf/source_context.pb.h
@@ -8,59 +8,40 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[1];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsSourceContextImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsSourceContext();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsSourceContext();
-}
-}  // namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fsource_5fcontext_2eproto();
+
 class SourceContext;
-class SourceContextDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern SourceContextDefaultTypeInternal _SourceContext_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT SourceContext : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceContext) */ {
+class LIBPROTOBUF_EXPORT SourceContext : public ::google::protobuf::Message {
  public:
   SourceContext();
   virtual ~SourceContext();
@@ -71,85 +52,56 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  SourceContext(SourceContext&& from) noexcept
-    : SourceContext() {
-    *this = ::std::move(from);
-  }
 
-  inline SourceContext& operator=(SourceContext&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
   static const ::google::protobuf::Descriptor* descriptor();
   static const SourceContext& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const SourceContext* internal_default_instance() {
-    return reinterpret_cast<const SourceContext*>(
-               &_SourceContext_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   void Swap(SourceContext* other);
-  friend void swap(SourceContext& a, SourceContext& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline SourceContext* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline SourceContext* New() const { return New(NULL); }
 
-  SourceContext* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  SourceContext* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const SourceContext& from);
   void MergeFrom(const SourceContext& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(SourceContext* other);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
-    return NULL;
+    return _internal_metadata_.arena();
   }
   inline void* MaybeArenaPtr() const {
-    return NULL;
+    return _internal_metadata_.raw_arena_ptr();
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // string file_name = 1;
+  // optional string file_name = 1;
   void clear_file_name();
   static const int kFileNameFieldNumber = 1;
   const ::std::string& file_name() const;
   void set_file_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_file_name(::std::string&& value);
-  #endif
   void set_file_name(const char* value);
   void set_file_name(const char* value, size_t size);
   ::std::string* mutable_file_name();
@@ -160,45 +112,38 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr file_name_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContextImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fsource_5fcontext_2eproto();
+
+  void InitAsDefaultInstance();
+  static SourceContext* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // SourceContext
 
-// string file_name = 1;
+// optional string file_name = 1;
 inline void SourceContext::clear_file_name() {
   file_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& SourceContext::file_name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.SourceContext.file_name)
-  return file_name_.GetNoArena();
+  return file_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void SourceContext::set_file_name(const ::std::string& value) {
   
   file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.SourceContext.file_name)
 }
-#if LANG_CXX11
-inline void SourceContext::set_file_name(::std::string&& value) {
-  
-  file_name_.SetNoArena(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.SourceContext.file_name)
-}
-#endif
 inline void SourceContext::set_file_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.SourceContext.file_name)
@@ -229,9 +174,7 @@
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceContext.file_name)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/src/google/protobuf/source_context.proto b/src/google/protobuf/source_context.proto
index f3b2c96..d76252c 100644
--- a/src/google/protobuf/source_context.proto
+++ b/src/google/protobuf/source_context.proto
@@ -36,13 +36,13 @@
 option java_package = "com.google.protobuf";
 option java_outer_classname = "SourceContextProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
-option go_package = "google.golang.org/genproto/protobuf/source_context;source_context";
 
 // `SourceContext` represents information about the source of a
 // protobuf element, like the file in which it is defined.
 message SourceContext {
   // The path-qualified name of the .proto file that contained the associated
-  // protobuf element.  For example: `"google/protobuf/source_context.proto"`.
+  // protobuf element.  For example: `"google/protobuf/source.proto"`.
   string file_name = 1;
 }
diff --git a/src/google/protobuf/struct.pb.cc b/src/google/protobuf/struct.pb.cc
index fe3ba32..11ccabb 100644
--- a/src/google/protobuf/struct.pb.cc
+++ b/src/google/protobuf/struct.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/struct.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/struct.pb.h>
 
 #include <algorithm>
@@ -14,197 +15,186 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class Struct_FieldsEntry_DoNotUseDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Struct_FieldsEntry_DoNotUse>
-      _instance;
-} _Struct_FieldsEntry_DoNotUse_default_instance_;
-class StructDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Struct>
-      _instance;
-} _Struct_default_instance_;
-class ValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Value>
-      _instance;
+
+namespace {
+
+const ::google::protobuf::Descriptor* Struct_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Struct_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Struct_FieldsEntry_descriptor_ = NULL;
+const ::google::protobuf::Descriptor* Value_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Value_reflection_ = NULL;
+struct ValueOneofInstance {
   int null_value_;
   double number_value_;
   ::google::protobuf::internal::ArenaStringPtr string_value_;
   bool bool_value_;
   const ::google::protobuf::Struct* struct_value_;
   const ::google::protobuf::ListValue* list_value_;
-} _Value_default_instance_;
-class ListValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<ListValue>
-      _instance;
-} _ListValue_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fstruct_2eproto {
-void InitDefaultsListValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
+}* Value_default_oneof_instance_ = NULL;
+const ::google::protobuf::Descriptor* ListValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  ListValue_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* NullValue_descriptor_ = NULL;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Struct_FieldsEntry_DoNotUse_default_instance_;
-    new (ptr) ::google::protobuf::Struct_FieldsEntry_DoNotUse();
-  }
-  {
-    void* ptr = &::google::protobuf::_Struct_default_instance_;
-    new (ptr) ::google::protobuf::Struct();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  {
-    void* ptr = &::google::protobuf::_Value_default_instance_;
-    new (ptr) ::google::protobuf::Value();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  {
-    void* ptr = &::google::protobuf::_ListValue_default_instance_;
-    new (ptr) ::google::protobuf::ListValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Struct_FieldsEntry_DoNotUse::InitAsDefaultInstance();
-  ::google::protobuf::Struct::InitAsDefaultInstance();
-  ::google::protobuf::Value::InitAsDefaultInstance();
-  ::google::protobuf::ListValue::InitAsDefaultInstance();
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fstruct_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/struct.proto");
+  GOOGLE_CHECK(file != NULL);
+  Struct_descriptor_ = file->message_type(0);
+  static const int Struct_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Struct, fields_),
+  };
+  Struct_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Struct_descriptor_,
+      Struct::default_instance_,
+      Struct_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Struct),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Struct, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Struct, _is_default_instance_));
+  Struct_FieldsEntry_descriptor_ = Struct_descriptor_->nested_type(0);
+  Value_descriptor_ = file->message_type(1);
+  static const int Value_offsets_[7] = {
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Value_default_oneof_instance_, null_value_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Value_default_oneof_instance_, number_value_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Value_default_oneof_instance_, string_value_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Value_default_oneof_instance_, bool_value_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Value_default_oneof_instance_, struct_value_),
+    PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(Value_default_oneof_instance_, list_value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Value, kind_),
+  };
+  Value_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Value_descriptor_,
+      Value::default_instance_,
+      Value_offsets_,
+      -1,
+      -1,
+      -1,
+      Value_default_oneof_instance_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Value, _oneof_case_[0]),
+      sizeof(Value),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Value, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Value, _is_default_instance_));
+  ListValue_descriptor_ = file->message_type(2);
+  static const int ListValue_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ListValue, values_),
+  };
+  ListValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      ListValue_descriptor_,
+      ListValue::default_instance_,
+      ListValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(ListValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ListValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ListValue, _is_default_instance_));
+  NullValue_descriptor_ = file->enum_type(0);
 }
 
-void InitDefaultsListValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsListValueImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fstruct_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[4];
-const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, _has_bits_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, key_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, value_),
-  0,
-  1,
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct, fields_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Value, _internal_metadata_),
-  ~0u,  // no _extensions_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Value, _oneof_case_[0]),
-  ~0u,  // no _weak_field_map_
-  offsetof(::google::protobuf::ValueDefaultTypeInternal, null_value_),
-  offsetof(::google::protobuf::ValueDefaultTypeInternal, number_value_),
-  offsetof(::google::protobuf::ValueDefaultTypeInternal, string_value_),
-  offsetof(::google::protobuf::ValueDefaultTypeInternal, bool_value_),
-  offsetof(::google::protobuf::ValueDefaultTypeInternal, struct_value_),
-  offsetof(::google::protobuf::ValueDefaultTypeInternal, list_value_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Value, kind_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ListValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ListValue, values_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, 7, sizeof(::google::protobuf::Struct_FieldsEntry_DoNotUse)},
-  { 9, -1, sizeof(::google::protobuf::Struct)},
-  { 15, -1, sizeof(::google::protobuf::Value)},
-  { 27, -1, sizeof(::google::protobuf::ListValue)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Struct_FieldsEntry_DoNotUse_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Struct_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Value_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_ListValue_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/struct.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, file_level_enum_descriptors, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 4);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Struct_descriptor_, &Struct::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+        Struct_FieldsEntry_descriptor_,
+        ::google::protobuf::internal::MapEntry<
+            ::std::string,
+            ::google::protobuf::Value,
+            ::google::protobuf::internal::WireFormatLite::TYPE_STRING,
+            ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE,
+            0>::CreateDefaultInstance(
+                Struct_FieldsEntry_descriptor_));
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Value_descriptor_, &Value::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      ListValue_descriptor_, &ListValue::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\034google/protobuf/struct.proto\022\017google.p"
-      "rotobuf\"\204\001\n\006Struct\0223\n\006fields\030\001 \003(\0132#.goo"
-      "gle.protobuf.Struct.FieldsEntry\032E\n\013Field"
-      "sEntry\022\013\n\003key\030\001 \001(\t\022%\n\005value\030\002 \001(\0132\026.goo"
-      "gle.protobuf.Value:\0028\001\"\352\001\n\005Value\0220\n\nnull"
-      "_value\030\001 \001(\0162\032.google.protobuf.NullValue"
-      "H\000\022\026\n\014number_value\030\002 \001(\001H\000\022\026\n\014string_val"
-      "ue\030\003 \001(\tH\000\022\024\n\nbool_value\030\004 \001(\010H\000\022/\n\014stru"
-      "ct_value\030\005 \001(\0132\027.google.protobuf.StructH"
-      "\000\0220\n\nlist_value\030\006 \001(\0132\032.google.protobuf."
-      "ListValueH\000B\006\n\004kind\"3\n\tListValue\022&\n\006valu"
-      "es\030\001 \003(\0132\026.google.protobuf.Value*\033\n\tNull"
-      "Value\022\016\n\nNULL_VALUE\020\000B\201\001\n\023com.google.pro"
-      "tobufB\013StructProtoP\001Z1github.com/golang/"
-      "protobuf/ptypes/struct;structpb\370\001\001\242\002\003GPB"
-      "\252\002\036Google.Protobuf.WellKnownTypesb\006proto"
-      "3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto() {
+  delete Struct::default_instance_;
+  delete Struct_reflection_;
+  delete Value::default_instance_;
+  delete Value_default_oneof_instance_;
+  delete Value_reflection_;
+  delete ListValue::default_instance_;
+  delete ListValue_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 641);
+    "\n\034google/protobuf/struct.proto\022\017google.p"
+    "rotobuf\"\204\001\n\006Struct\0223\n\006fields\030\001 \003(\0132#.goo"
+    "gle.protobuf.Struct.FieldsEntry\032E\n\013Field"
+    "sEntry\022\013\n\003key\030\001 \001(\t\022%\n\005value\030\002 \001(\0132\026.goo"
+    "gle.protobuf.Value:\0028\001\"\352\001\n\005Value\0220\n\nnull"
+    "_value\030\001 \001(\0162\032.google.protobuf.NullValue"
+    "H\000\022\026\n\014number_value\030\002 \001(\001H\000\022\026\n\014string_val"
+    "ue\030\003 \001(\tH\000\022\024\n\nbool_value\030\004 \001(\010H\000\022/\n\014stru"
+    "ct_value\030\005 \001(\0132\027.google.protobuf.StructH"
+    "\000\0220\n\nlist_value\030\006 \001(\0132\032.google.protobuf."
+    "ListValueH\000B\006\n\004kind\"3\n\tListValue\022&\n\006valu"
+    "es\030\001 \003(\0132\026.google.protobuf.Value*\033\n\tNull"
+    "Value\022\016\n\nNULL_VALUE\020\000B\201\001\n\023com.google.pro"
+    "tobufB\013StructProtoP\001Z1github.com/golang/"
+    "protobuf/ptypes/struct;structpb\240\001\001\242\002\003GPB"
+    "\252\002\036Google.Protobuf.WellKnownTypesb\006proto"
+    "3", 641);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/struct.proto", &protobuf_RegisterTypes);
+  Struct::default_instance_ = new Struct();
+  Value::default_instance_ = new Value();
+  Value_default_oneof_instance_ = new ValueOneofInstance();
+  ListValue::default_instance_ = new ListValue();
+  Struct::default_instance_->InitAsDefaultInstance();
+  Value::default_instance_->InitAsDefaultInstance();
+  ListValue::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fstruct_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fstruct_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fstruct_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fstruct_2eproto_;
 const ::google::protobuf::EnumDescriptor* NullValue_descriptor() {
-  protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_enum_descriptors[0];
+  protobuf_AssignDescriptorsOnce();
+  return NullValue_descriptor_;
 }
 bool NullValue_IsValid(int value) {
-  switch (value) {
+  switch(value) {
     case 0:
       return true;
     default:
@@ -213,59 +203,47 @@
 }
 
 
-// ===================================================================
+namespace {
 
-Struct_FieldsEntry_DoNotUse::Struct_FieldsEntry_DoNotUse() {}
-Struct_FieldsEntry_DoNotUse::Struct_FieldsEntry_DoNotUse(::google::protobuf::Arena* arena) : SuperType(arena) {}
-void Struct_FieldsEntry_DoNotUse::MergeFrom(const Struct_FieldsEntry_DoNotUse& other) {
-  MergeFromInternal(other);
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
 }
-::google::protobuf::Metadata Struct_FieldsEntry_DoNotUse::GetMetadata() const {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[0];
-}
-void Struct_FieldsEntry_DoNotUse::MergeFrom(
-    const ::google::protobuf::Message& other) {
-  ::google::protobuf::Message::MergeFrom(other);
-}
+
+}  // namespace
 
 
 // ===================================================================
 
-void Struct::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Struct::kFieldsFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 Struct::Struct()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Struct)
 }
-Struct::Struct(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  fields_(arena) {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Struct)
+
+void Struct::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
 }
+
 Struct::Struct(const Struct& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  fields_.MergeFrom(from.fields_);
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Struct)
 }
 
 void Struct::SharedCtor() {
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  fields_.SetAssignDescriptorCallback(
+      protobuf_AssignDescriptorsOnce);
+  fields_.SetEntryDescriptor(
+      &::google::protobuf::Struct_FieldsEntry_descriptor_);
 }
 
 Struct::~Struct() {
@@ -274,42 +252,38 @@
 }
 
 void Struct::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void Struct::ArenaDtor(void* object) {
-  Struct* _this = reinterpret_cast< Struct* >(object);
-  (void)_this;
-}
-void Struct::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void Struct::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Struct::descriptor() {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Struct_descriptor_;
 }
 
 const Struct& Struct::default_instance() {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  return *default_instance_;
 }
 
+Struct* Struct::default_instance_ = NULL;
+
 Struct* Struct::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Struct>(arena);
+  Struct* n = new Struct;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void Struct::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Struct)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   fields_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool Struct::MergePartialFromCodedStream(
@@ -318,40 +292,40 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Struct)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // map<string, .google.protobuf.Value> fields = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          Struct_FieldsEntry_DoNotUse::Parser< ::google::protobuf::internal::MapField<
-              Struct_FieldsEntry_DoNotUse,
-              ::std::string, ::google::protobuf::Value,
-              ::google::protobuf::internal::WireFormatLite::TYPE_STRING,
-              ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE,
-              0 >,
-            ::google::protobuf::Map< ::std::string, ::google::protobuf::Value > > parser(&fields_);
+        if (tag == 10) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_fields:
+          ::google::protobuf::scoped_ptr<Struct_FieldsEntry> entry(fields_.NewEntry());
           DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
-              input, &parser));
+              input, entry.get()));
+          (*mutable_fields())[entry->key()].Swap(entry->mutable_value());
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            parser.key().data(), static_cast<int>(parser.key().length()),
+            entry->key().data(), entry->key().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Struct.FieldsEntry.key"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(10)) goto parse_loop_fields;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -368,185 +342,76 @@
 void Struct::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Struct)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // map<string, .google.protobuf.Value> fields = 1;
-  if (!this->fields().empty()) {
-    typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_pointer
-        ConstPtr;
-    typedef ConstPtr SortItem;
-    typedef ::google::protobuf::internal::CompareByDerefFirst<SortItem> Less;
-    struct Utf8Check {
-      static void Check(ConstPtr p) {
-        ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-          p->first.data(), static_cast<int>(p->first.length()),
-          ::google::protobuf::internal::WireFormatLite::SERIALIZE,
-          "google.protobuf.Struct.FieldsEntry.key");
-      }
-    };
-
-    if (output->IsSerializationDeterministic() &&
-        this->fields().size() > 1) {
-      ::google::protobuf::scoped_array<SortItem> items(
-          new SortItem[this->fields().size()]);
-      typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::size_type size_type;
-      size_type n = 0;
-      for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
-          it = this->fields().begin();
-          it != this->fields().end(); ++it, ++n) {
-        items[static_cast<ptrdiff_t>(n)] = SortItem(&*it);
-      }
-      ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less());
-      ::google::protobuf::scoped_ptr<Struct_FieldsEntry_DoNotUse> entry;
-      for (size_type i = 0; i < n; i++) {
-        entry.reset(fields_.NewEntryWrapper(
-            items[static_cast<ptrdiff_t>(i)]->first, items[static_cast<ptrdiff_t>(i)]->second));
-        ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-            1, *entry, output);
-        if (entry->GetArena() != NULL) {
-          entry.release();
-        }
-        Utf8Check::Check(items[static_cast<ptrdiff_t>(i)]);
-      }
-    } else {
-      ::google::protobuf::scoped_ptr<Struct_FieldsEntry_DoNotUse> entry;
-      for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
-          it = this->fields().begin();
-          it != this->fields().end(); ++it) {
-        entry.reset(fields_.NewEntryWrapper(
-            it->first, it->second));
-        ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-            1, *entry, output);
-        if (entry->GetArena() != NULL) {
-          entry.release();
-        }
-        Utf8Check::Check(&*it);
-      }
+  {
+    ::google::protobuf::scoped_ptr<Struct_FieldsEntry> entry;
+    for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
+        it = this->fields().begin();
+        it != this->fields().end(); ++it) {
+      entry.reset(fields_.NewEntryWrapper(it->first, it->second));
+      ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+          1, *entry, output);
+      ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+        it->first.data(), it->first.length(),
+        ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+        "google.protobuf.Struct.FieldsEntry.key");
     }
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Struct)
 }
 
-::google::protobuf::uint8* Struct::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Struct::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Struct)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // map<string, .google.protobuf.Value> fields = 1;
-  if (!this->fields().empty()) {
-    typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_pointer
-        ConstPtr;
-    typedef ConstPtr SortItem;
-    typedef ::google::protobuf::internal::CompareByDerefFirst<SortItem> Less;
-    struct Utf8Check {
-      static void Check(ConstPtr p) {
-        ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-          p->first.data(), static_cast<int>(p->first.length()),
-          ::google::protobuf::internal::WireFormatLite::SERIALIZE,
-          "google.protobuf.Struct.FieldsEntry.key");
-      }
-    };
-
-    if (deterministic &&
-        this->fields().size() > 1) {
-      ::google::protobuf::scoped_array<SortItem> items(
-          new SortItem[this->fields().size()]);
-      typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::size_type size_type;
-      size_type n = 0;
-      for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
-          it = this->fields().begin();
-          it != this->fields().end(); ++it, ++n) {
-        items[static_cast<ptrdiff_t>(n)] = SortItem(&*it);
-      }
-      ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less());
-      ::google::protobuf::scoped_ptr<Struct_FieldsEntry_DoNotUse> entry;
-      for (size_type i = 0; i < n; i++) {
-        entry.reset(fields_.NewEntryWrapper(
-            items[static_cast<ptrdiff_t>(i)]->first, items[static_cast<ptrdiff_t>(i)]->second));
-        target = ::google::protobuf::internal::WireFormatLite::
-                   InternalWriteMessageNoVirtualToArray(
-                       1, *entry, deterministic, target);
-;
-        if (entry->GetArena() != NULL) {
-          entry.release();
-        }
-        Utf8Check::Check(items[static_cast<ptrdiff_t>(i)]);
-      }
-    } else {
-      ::google::protobuf::scoped_ptr<Struct_FieldsEntry_DoNotUse> entry;
-      for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
-          it = this->fields().begin();
-          it != this->fields().end(); ++it) {
-        entry.reset(fields_.NewEntryWrapper(
-            it->first, it->second));
-        target = ::google::protobuf::internal::WireFormatLite::
-                   InternalWriteMessageNoVirtualToArray(
-                       1, *entry, deterministic, target);
-;
-        if (entry->GetArena() != NULL) {
-          entry.release();
-        }
-        Utf8Check::Check(&*it);
-      }
+  {
+    ::google::protobuf::scoped_ptr<Struct_FieldsEntry> entry;
+    for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
+        it = this->fields().begin();
+        it != this->fields().end(); ++it) {
+      entry.reset(fields_.NewEntryWrapper(it->first, it->second));
+      target = ::google::protobuf::internal::WireFormatLite::
+          WriteMessageNoVirtualToArray(
+              1, *entry, target);
+      ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+        it->first.data(), it->first.length(),
+        ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+        "google.protobuf.Struct.FieldsEntry.key");
     }
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Struct)
   return target;
 }
 
-size_t Struct::ByteSizeLong() const {
+int Struct::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Struct)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
   // map<string, .google.protobuf.Value> fields = 1;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->fields_size());
+  total_size += 1 * this->fields_size();
   {
-    ::google::protobuf::scoped_ptr<Struct_FieldsEntry_DoNotUse> entry;
+    ::google::protobuf::scoped_ptr<Struct_FieldsEntry> entry;
     for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator
         it = this->fields().begin();
         it != this->fields().end(); ++it) {
-      if (entry.get() != NULL && entry->GetArena() != NULL) {
-        entry.release();
-      }
       entry.reset(fields_.NewEntryWrapper(it->first, it->second));
       total_size += ::google::protobuf::internal::WireFormatLite::
           MessageSizeNoVirtual(*entry);
     }
-    if (entry.get() != NULL && entry->GetArena() != NULL) {
-      entry.release();
-    }
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Struct::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Struct)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Struct* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Struct* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Struct>(
           &from);
   if (source == NULL) {
@@ -560,11 +425,7 @@
 
 void Struct::MergeFrom(const Struct& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Struct)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   fields_.MergeFrom(from.fields_);
 }
 
@@ -583,84 +444,53 @@
 }
 
 bool Struct::IsInitialized() const {
+
   return true;
 }
 
 void Struct::Swap(Struct* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Struct* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Struct::UnsafeArenaSwap(Struct* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void Struct::InternalSwap(Struct* other) {
-  using std::swap;
   fields_.Swap(&other->fields_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Struct::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Struct_descriptor_;
+  metadata.reflection = Struct_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Struct
+
+// map<string, .google.protobuf.Value> fields = 1;
+int Struct::fields_size() const {
+  return fields_.size();
+}
+void Struct::clear_fields() {
+  fields_.Clear();
+}
+ const ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >&
+Struct::fields() const {
+  // @@protoc_insertion_point(field_map:google.protobuf.Struct.fields)
+  return fields_.GetMap();
+}
+ ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >*
+Struct::mutable_fields() {
+  // @@protoc_insertion_point(field_mutable_map:google.protobuf.Struct.fields)
+  return fields_.MutableMap();
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void Value::InitAsDefaultInstance() {
-  ::google::protobuf::_Value_default_instance_.null_value_ = 0;
-  ::google::protobuf::_Value_default_instance_.number_value_ = 0;
-  ::google::protobuf::_Value_default_instance_.string_value_.UnsafeSetDefault(
-      &::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::google::protobuf::_Value_default_instance_.bool_value_ = false;
-  ::google::protobuf::_Value_default_instance_.struct_value_ = const_cast< ::google::protobuf::Struct*>(
-      ::google::protobuf::Struct::internal_default_instance());
-  ::google::protobuf::_Value_default_instance_.list_value_ = const_cast< ::google::protobuf::ListValue*>(
-      ::google::protobuf::ListValue::internal_default_instance());
-}
-void Value::set_allocated_struct_value(::google::protobuf::Struct* struct_value) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  clear_kind();
-  if (struct_value) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(struct_value);
-    if (message_arena != submessage_arena) {
-      struct_value = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, struct_value, submessage_arena);
-    }
-    set_has_struct_value();
-    kind_.struct_value_ = struct_value;
-  }
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.struct_value)
-}
-void Value::set_allocated_list_value(::google::protobuf::ListValue* list_value) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  clear_kind();
-  if (list_value) {
-    ::google::protobuf::Arena* submessage_arena =
-      ::google::protobuf::Arena::GetArena(list_value);
-    if (message_arena != submessage_arena) {
-      list_value = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, list_value, submessage_arena);
-    }
-    set_has_list_value();
-    kind_.list_value_ = list_value;
-  }
-  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.list_value)
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Value::kNullValueFieldNumber;
 const int Value::kNumberValueFieldNumber;
@@ -672,61 +502,33 @@
 
 Value::Value()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Value)
 }
-Value::Value(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Value)
+
+void Value::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+  Value_default_oneof_instance_->null_value_ = 0;
+  Value_default_oneof_instance_->number_value_ = 0;
+  Value_default_oneof_instance_->string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  Value_default_oneof_instance_->bool_value_ = false;
+  Value_default_oneof_instance_->struct_value_ = const_cast< ::google::protobuf::Struct*>(&::google::protobuf::Struct::default_instance());
+  Value_default_oneof_instance_->list_value_ = const_cast< ::google::protobuf::ListValue*>(&::google::protobuf::ListValue::default_instance());
 }
+
 Value::Value(const Value& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  clear_has_kind();
-  switch (from.kind_case()) {
-    case kNullValue: {
-      set_null_value(from.null_value());
-      break;
-    }
-    case kNumberValue: {
-      set_number_value(from.number_value());
-      break;
-    }
-    case kStringValue: {
-      set_string_value(from.string_value());
-      break;
-    }
-    case kBoolValue: {
-      set_bool_value(from.bool_value());
-      break;
-    }
-    case kStructValue: {
-      mutable_struct_value()->::google::protobuf::Struct::MergeFrom(from.struct_value());
-      break;
-    }
-    case kListValue: {
-      mutable_list_value()->::google::protobuf::ListValue::MergeFrom(from.list_value());
-      break;
-    }
-    case KIND_NOT_SET: {
-      break;
-    }
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Value)
 }
 
 void Value::SharedCtor() {
-  clear_has_kind();
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
+  clear_has_kind();
 }
 
 Value::~Value() {
@@ -735,40 +537,41 @@
 }
 
 void Value::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   if (has_kind()) {
     clear_kind();
   }
+  if (this != default_instance_) {
+  }
 }
 
-void Value::ArenaDtor(void* object) {
-  Value* _this = reinterpret_cast< Value* >(object);
-  (void)_this;
-}
-void Value::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void Value::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Value::descriptor() {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Value_descriptor_;
 }
 
 const Value& Value::default_instance() {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  return *default_instance_;
 }
 
+Value* Value::default_instance_ = NULL;
+
 Value* Value::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Value>(arena);
+  Value* n = new Value;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void Value::clear_kind() {
 // @@protoc_insertion_point(one_of_clear_start:google.protobuf.Value)
-  switch (kind_case()) {
+  switch(kind_case()) {
     case kNullValue: {
       // No need to clear
       break;
@@ -778,8 +581,7 @@
       break;
     }
     case kStringValue: {
-      kind_.string_value_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-          GetArenaNoVirtual());
+      kind_.string_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
       break;
     }
     case kBoolValue: {
@@ -787,15 +589,11 @@
       break;
     }
     case kStructValue: {
-      if (GetArenaNoVirtual() == NULL) {
-        delete kind_.struct_value_;
-      }
+      delete kind_.struct_value_;
       break;
     }
     case kListValue: {
-      if (GetArenaNoVirtual() == NULL) {
-        delete kind_.list_value_;
-      }
+      delete kind_.list_value_;
       break;
     }
     case KIND_NOT_SET: {
@@ -808,12 +606,7 @@
 
 void Value::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   clear_kind();
-  _internal_metadata_.Clear();
 }
 
 bool Value::MergePartialFromCodedStream(
@@ -822,14 +615,13 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Value)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // .google.protobuf.NullValue null_value = 1;
+      // optional .google.protobuf.NullValue null_value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
+        if (tag == 8) {
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -838,13 +630,14 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(17)) goto parse_number_value;
         break;
       }
 
-      // double number_value = 2;
+      // optional double number_value = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(17u /* 17 & 0xFF */)) {
+        if (tag == 17) {
+         parse_number_value:
           clear_kind();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>(
@@ -853,29 +646,31 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_string_value;
         break;
       }
 
-      // string string_value = 3;
+      // optional string string_value = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
+        if (tag == 26) {
+         parse_string_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_string_value()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->string_value().data(), static_cast<int>(this->string_value().length()),
+            this->string_value().data(), this->string_value().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Value.string_value"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(32)) goto parse_bool_value;
         break;
       }
 
-      // bool bool_value = 4;
+      // optional bool bool_value = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) {
+        if (tag == 32) {
+         parse_bool_value:
           clear_kind();
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
@@ -884,40 +679,44 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(42)) goto parse_struct_value;
         break;
       }
 
-      // .google.protobuf.Struct struct_value = 5;
+      // optional .google.protobuf.Struct struct_value = 5;
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 42) {
+         parse_struct_value:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_struct_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_list_value;
         break;
       }
 
-      // .google.protobuf.ListValue list_value = 6;
+      // optional .google.protobuf.ListValue list_value = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 50) {
+         parse_list_value:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_list_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -934,76 +733,65 @@
 void Value::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // .google.protobuf.NullValue null_value = 1;
+  // optional .google.protobuf.NullValue null_value = 1;
   if (has_null_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       1, this->null_value(), output);
   }
 
-  // double number_value = 2;
+  // optional double number_value = 2;
   if (has_number_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->number_value(), output);
   }
 
-  // string string_value = 3;
+  // optional string string_value = 3;
   if (has_string_value()) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->string_value().data(), static_cast<int>(this->string_value().length()),
+      this->string_value().data(), this->string_value().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Value.string_value");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       3, this->string_value(), output);
   }
 
-  // bool bool_value = 4;
+  // optional bool bool_value = 4;
   if (has_bool_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->bool_value(), output);
   }
 
-  // .google.protobuf.Struct struct_value = 5;
+  // optional .google.protobuf.Struct struct_value = 5;
   if (has_struct_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       5, *kind_.struct_value_, output);
   }
 
-  // .google.protobuf.ListValue list_value = 6;
+  // optional .google.protobuf.ListValue list_value = 6;
   if (has_list_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       6, *kind_.list_value_, output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Value)
 }
 
-::google::protobuf::uint8* Value::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Value::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // .google.protobuf.NullValue null_value = 1;
+  // optional .google.protobuf.NullValue null_value = 1;
   if (has_null_value()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       1, this->null_value(), target);
   }
 
-  // double number_value = 2;
+  // optional double number_value = 2;
   if (has_number_value()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->number_value(), target);
   }
 
-  // string string_value = 3;
+  // optional string string_value = 3;
   if (has_string_value()) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->string_value().data(), static_cast<int>(this->string_value().length()),
+      this->string_value().data(), this->string_value().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Value.string_value");
     target =
@@ -1011,77 +799,68 @@
         3, this->string_value(), target);
   }
 
-  // bool bool_value = 4;
+  // optional bool bool_value = 4;
   if (has_bool_value()) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(4, this->bool_value(), target);
   }
 
-  // .google.protobuf.Struct struct_value = 5;
+  // optional .google.protobuf.Struct struct_value = 5;
   if (has_struct_value()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        5, *kind_.struct_value_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        5, *kind_.struct_value_, target);
   }
 
-  // .google.protobuf.ListValue list_value = 6;
+  // optional .google.protobuf.ListValue list_value = 6;
   if (has_list_value()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        6, *kind_.list_value_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        6, *kind_.list_value_, target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Value)
   return target;
 }
 
-size_t Value::ByteSizeLong() const {
+int Value::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Value)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
   switch (kind_case()) {
-    // .google.protobuf.NullValue null_value = 1;
+    // optional .google.protobuf.NullValue null_value = 1;
     case kNullValue: {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::EnumSize(this->null_value());
       break;
     }
-    // double number_value = 2;
+    // optional double number_value = 2;
     case kNumberValue: {
       total_size += 1 + 8;
       break;
     }
-    // string string_value = 3;
+    // optional string string_value = 3;
     case kStringValue: {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::StringSize(
           this->string_value());
       break;
     }
-    // bool bool_value = 4;
+    // optional bool bool_value = 4;
     case kBoolValue: {
       total_size += 1 + 1;
       break;
     }
-    // .google.protobuf.Struct struct_value = 5;
+    // optional .google.protobuf.Struct struct_value = 5;
     case kStructValue: {
       total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           *kind_.struct_value_);
       break;
     }
-    // .google.protobuf.ListValue list_value = 6;
+    // optional .google.protobuf.ListValue list_value = 6;
     case kListValue: {
       total_size += 1 +
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
+        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           *kind_.list_value_);
       break;
     }
@@ -1089,17 +868,16 @@
       break;
     }
   }
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Value::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Value* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Value* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Value>(
           &from);
   if (source == NULL) {
@@ -1113,11 +891,7 @@
 
 void Value::MergeFrom(const Value& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   switch (from.kind_case()) {
     case kNullValue: {
       set_null_value(from.null_value());
@@ -1164,77 +938,333 @@
 }
 
 bool Value::IsInitialized() const {
+
   return true;
 }
 
 void Value::Swap(Value* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Value* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Value::UnsafeArenaSwap(Value* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void Value::InternalSwap(Value* other) {
-  using std::swap;
-  swap(kind_, other->kind_);
-  swap(_oneof_case_[0], other->_oneof_case_[0]);
+  std::swap(kind_, other->kind_);
+  std::swap(_oneof_case_[0], other->_oneof_case_[0]);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Value::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Value_descriptor_;
+  metadata.reflection = Value_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Value
+
+// optional .google.protobuf.NullValue null_value = 1;
+bool Value::has_null_value() const {
+  return kind_case() == kNullValue;
+}
+void Value::set_has_null_value() {
+  _oneof_case_[0] = kNullValue;
+}
+void Value::clear_null_value() {
+  if (has_null_value()) {
+    kind_.null_value_ = 0;
+    clear_has_kind();
+  }
+}
+ ::google::protobuf::NullValue Value::null_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Value.null_value)
+  if (has_null_value()) {
+    return static_cast< ::google::protobuf::NullValue >(kind_.null_value_);
+  }
+  return static_cast< ::google::protobuf::NullValue >(0);
+}
+ void Value::set_null_value(::google::protobuf::NullValue value) {
+  if (!has_null_value()) {
+    clear_kind();
+    set_has_null_value();
+  }
+  kind_.null_value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Value.null_value)
+}
+
+// optional double number_value = 2;
+bool Value::has_number_value() const {
+  return kind_case() == kNumberValue;
+}
+void Value::set_has_number_value() {
+  _oneof_case_[0] = kNumberValue;
+}
+void Value::clear_number_value() {
+  if (has_number_value()) {
+    kind_.number_value_ = 0;
+    clear_has_kind();
+  }
+}
+ double Value::number_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Value.number_value)
+  if (has_number_value()) {
+    return kind_.number_value_;
+  }
+  return 0;
+}
+ void Value::set_number_value(double value) {
+  if (!has_number_value()) {
+    clear_kind();
+    set_has_number_value();
+  }
+  kind_.number_value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Value.number_value)
+}
+
+// optional string string_value = 3;
+bool Value::has_string_value() const {
+  return kind_case() == kStringValue;
+}
+void Value::set_has_string_value() {
+  _oneof_case_[0] = kStringValue;
+}
+void Value::clear_string_value() {
+  if (has_string_value()) {
+    kind_.string_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    clear_has_kind();
+  }
+}
+ const ::std::string& Value::string_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Value.string_value)
+  if (has_string_value()) {
+    return kind_.string_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
+  return *&::google::protobuf::internal::GetEmptyStringAlreadyInited();
+}
+ void Value::set_string_value(const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value)
+  if (!has_string_value()) {
+    clear_kind();
+    set_has_string_value();
+    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
+  kind_.string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value)
+}
+ void Value::set_string_value(const char* value) {
+  if (!has_string_value()) {
+    clear_kind();
+    set_has_string_value();
+    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
+  kind_.string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Value.string_value)
+}
+ void Value::set_string_value(const char* value, size_t size) {
+  if (!has_string_value()) {
+    clear_kind();
+    set_has_string_value();
+    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
+  kind_.string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
+      reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Value.string_value)
+}
+ ::std::string* Value::mutable_string_value() {
+  if (!has_string_value()) {
+    clear_kind();
+    set_has_string_value();
+    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.string_value)
+  return kind_.string_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Value::release_string_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Value.string_value)
+  if (has_string_value()) {
+    clear_has_kind();
+    return kind_.string_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  } else {
+    return NULL;
+  }
+}
+ void Value::set_allocated_string_value(::std::string* string_value) {
+  if (!has_string_value()) {
+    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  }
+  clear_kind();
+  if (string_value != NULL) {
+    set_has_string_value();
+    kind_.string_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+        string_value);
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.string_value)
+}
+
+// optional bool bool_value = 4;
+bool Value::has_bool_value() const {
+  return kind_case() == kBoolValue;
+}
+void Value::set_has_bool_value() {
+  _oneof_case_[0] = kBoolValue;
+}
+void Value::clear_bool_value() {
+  if (has_bool_value()) {
+    kind_.bool_value_ = false;
+    clear_has_kind();
+  }
+}
+ bool Value::bool_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Value.bool_value)
+  if (has_bool_value()) {
+    return kind_.bool_value_;
+  }
+  return false;
+}
+ void Value::set_bool_value(bool value) {
+  if (!has_bool_value()) {
+    clear_kind();
+    set_has_bool_value();
+  }
+  kind_.bool_value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Value.bool_value)
+}
+
+// optional .google.protobuf.Struct struct_value = 5;
+bool Value::has_struct_value() const {
+  return kind_case() == kStructValue;
+}
+void Value::set_has_struct_value() {
+  _oneof_case_[0] = kStructValue;
+}
+void Value::clear_struct_value() {
+  if (has_struct_value()) {
+    delete kind_.struct_value_;
+    clear_has_kind();
+  }
+}
+ const ::google::protobuf::Struct& Value::struct_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Value.struct_value)
+  return has_struct_value()
+      ? *kind_.struct_value_
+      : ::google::protobuf::Struct::default_instance();
+}
+::google::protobuf::Struct* Value::mutable_struct_value() {
+  if (!has_struct_value()) {
+    clear_kind();
+    set_has_struct_value();
+    kind_.struct_value_ = new ::google::protobuf::Struct;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.struct_value)
+  return kind_.struct_value_;
+}
+::google::protobuf::Struct* Value::release_struct_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Value.struct_value)
+  if (has_struct_value()) {
+    clear_has_kind();
+    ::google::protobuf::Struct* temp = kind_.struct_value_;
+    kind_.struct_value_ = NULL;
+    return temp;
+  } else {
+    return NULL;
+  }
+}
+void Value::set_allocated_struct_value(::google::protobuf::Struct* struct_value) {
+  clear_kind();
+  if (struct_value) {
+    set_has_struct_value();
+    kind_.struct_value_ = struct_value;
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.struct_value)
+}
+
+// optional .google.protobuf.ListValue list_value = 6;
+bool Value::has_list_value() const {
+  return kind_case() == kListValue;
+}
+void Value::set_has_list_value() {
+  _oneof_case_[0] = kListValue;
+}
+void Value::clear_list_value() {
+  if (has_list_value()) {
+    delete kind_.list_value_;
+    clear_has_kind();
+  }
+}
+ const ::google::protobuf::ListValue& Value::list_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Value.list_value)
+  return has_list_value()
+      ? *kind_.list_value_
+      : ::google::protobuf::ListValue::default_instance();
+}
+::google::protobuf::ListValue* Value::mutable_list_value() {
+  if (!has_list_value()) {
+    clear_kind();
+    set_has_list_value();
+    kind_.list_value_ = new ::google::protobuf::ListValue;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.list_value)
+  return kind_.list_value_;
+}
+::google::protobuf::ListValue* Value::release_list_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Value.list_value)
+  if (has_list_value()) {
+    clear_has_kind();
+    ::google::protobuf::ListValue* temp = kind_.list_value_;
+    kind_.list_value_ = NULL;
+    return temp;
+  } else {
+    return NULL;
+  }
+}
+void Value::set_allocated_list_value(::google::protobuf::ListValue* list_value) {
+  clear_kind();
+  if (list_value) {
+    set_has_list_value();
+    kind_.list_value_ = list_value;
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.list_value)
+}
+
+bool Value::has_kind() const {
+  return kind_case() != KIND_NOT_SET;
+}
+void Value::clear_has_kind() {
+  _oneof_case_[0] = KIND_NOT_SET;
+}
+Value::KindCase Value::kind_case() const {
+  return Value::KindCase(_oneof_case_[0]);
+}
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void ListValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int ListValue::kValuesFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 ListValue::ListValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.ListValue)
 }
-ListValue::ListValue(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  values_(arena) {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.ListValue)
+
+void ListValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
 }
+
 ListValue::ListValue(const ListValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      values_(from.values_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.ListValue)
 }
 
 void ListValue::SharedCtor() {
+    _is_default_instance_ = false;
   _cached_size_ = 0;
 }
 
@@ -1244,42 +1274,38 @@
 }
 
 void ListValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (this != default_instance_) {
+  }
 }
 
-void ListValue::ArenaDtor(void* object) {
-  ListValue* _this = reinterpret_cast< ListValue* >(object);
-  (void)_this;
-}
-void ListValue::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void ListValue::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* ListValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return ListValue_descriptor_;
 }
 
 const ListValue& ListValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  return *default_instance_;
 }
 
+ListValue* ListValue::default_instance_ = NULL;
+
 ListValue* ListValue::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<ListValue>(arena);
+  ListValue* n = new ListValue;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void ListValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.ListValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   values_.Clear();
-  _internal_metadata_.Clear();
 }
 
 bool ListValue::MergePartialFromCodedStream(
@@ -1288,28 +1314,34 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.ListValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
       // repeated .google.protobuf.Value values = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_values()));
+        if (tag == 10) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_values:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_values()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(10)) goto parse_loop_values;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1326,77 +1358,51 @@
 void ListValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.ListValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.Value values = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->values_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->values_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      1, this->values(static_cast<int>(i)), output);
+      1, this->values(i), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.ListValue)
 }
 
-::google::protobuf::uint8* ListValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* ListValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ListValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
   // repeated .google.protobuf.Value values = 1;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->values_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->values_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        1, this->values(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        1, this->values(i), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ListValue)
   return target;
 }
 
-size_t ListValue::ByteSizeLong() const {
+int ListValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ListValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
   // repeated .google.protobuf.Value values = 1;
-  {
-    unsigned int count = static_cast<unsigned int>(this->values_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->values(static_cast<int>(i)));
-    }
+  total_size += 1 * this->values_size();
+  for (int i = 0; i < this->values_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->values(i));
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void ListValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ListValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const ListValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const ListValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const ListValue>(
           &from);
   if (source == NULL) {
@@ -1410,11 +1416,7 @@
 
 void ListValue::MergeFrom(const ListValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ListValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   values_.MergeFrom(from.values_);
 }
 
@@ -1433,42 +1435,65 @@
 }
 
 bool ListValue::IsInitialized() const {
+
   return true;
 }
 
 void ListValue::Swap(ListValue* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    ListValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void ListValue::UnsafeArenaSwap(ListValue* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void ListValue::InternalSwap(ListValue* other) {
-  using std::swap;
-  values_.InternalSwap(&other->values_);
+  values_.UnsafeArenaSwap(&other->values_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata ListValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = ListValue_descriptor_;
+  metadata.reflection = ListValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// ListValue
+
+// repeated .google.protobuf.Value values = 1;
+int ListValue::values_size() const {
+  return values_.size();
+}
+void ListValue::clear_values() {
+  values_.Clear();
+}
+const ::google::protobuf::Value& ListValue::values(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.ListValue.values)
+  return values_.Get(index);
+}
+::google::protobuf::Value* ListValue::mutable_values(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.ListValue.values)
+  return values_.Mutable(index);
+}
+::google::protobuf::Value* ListValue::add_values() {
+  // @@protoc_insertion_point(field_add:google.protobuf.ListValue.values)
+  return values_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Value >*
+ListValue::mutable_values() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.ListValue.values)
+  return &values_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value >&
+ListValue::values() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.ListValue.values)
+  return values_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/struct.pb.h b/src/google/protobuf/struct.pb.h
index cdc00dc..6a4764a 100644
--- a/src/google/protobuf/struct.pb.h
+++ b/src/google/protobuf/struct.pb.h
@@ -8,68 +8,41 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
-#include <google/protobuf/map.h>  // IWYU pragma: export
-#include <google/protobuf/map_entry.h>
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
+#include <google/protobuf/map.h>
 #include <google/protobuf/map_field_inl.h>
 #include <google/protobuf/generated_enum_reflection.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fstruct_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[4];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsListValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsListValue();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsListValue();
-}
-}  // namespace protobuf_google_2fprotobuf_2fstruct_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fstruct_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto();
+
 class ListValue;
-class ListValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern ListValueDefaultTypeInternal _ListValue_default_instance_;
 class Struct;
-class StructDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern StructDefaultTypeInternal _Struct_default_instance_;
-class Struct_FieldsEntry_DoNotUse;
-class Struct_FieldsEntry_DoNotUseDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern Struct_FieldsEntry_DoNotUseDefaultTypeInternal _Struct_FieldsEntry_DoNotUse_default_instance_;
 class Value;
-class ValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern ValueDefaultTypeInternal _Value_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 enum NullValue {
   NULL_VALUE = 0,
@@ -93,28 +66,7 @@
 }
 // ===================================================================
 
-class Struct_FieldsEntry_DoNotUse : public ::google::protobuf::internal::MapEntry<Struct_FieldsEntry_DoNotUse, 
-    ::std::string, ::google::protobuf::Value,
-    ::google::protobuf::internal::WireFormatLite::TYPE_STRING,
-    ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE,
-    0 > {
-public:
-  typedef ::google::protobuf::internal::MapEntry<Struct_FieldsEntry_DoNotUse, 
-    ::std::string, ::google::protobuf::Value,
-    ::google::protobuf::internal::WireFormatLite::TYPE_STRING,
-    ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE,
-    0 > SuperType;
-  Struct_FieldsEntry_DoNotUse();
-  Struct_FieldsEntry_DoNotUse(::google::protobuf::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_); }
-  void MergeFrom(const ::google::protobuf::Message& other) PROTOBUF_FINAL;
-  ::google::protobuf::Metadata GetMetadata() const;
-};
-
-// -------------------------------------------------------------------
-
-class LIBPROTOBUF_EXPORT Struct : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Struct) */ {
+class LIBPROTOBUF_EXPORT Struct : public ::google::protobuf::Message {
  public:
   Struct();
   virtual ~Struct();
@@ -125,74 +77,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Struct(Struct&& from) noexcept
-    : Struct() {
-    *this = ::std::move(from);
-  }
 
-  inline Struct& operator=(Struct&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Struct& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Struct* internal_default_instance() {
-    return reinterpret_cast<const Struct*>(
-               &_Struct_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    1;
-
-  void UnsafeArenaSwap(Struct* other);
   void Swap(Struct* other);
-  friend void swap(Struct& a, Struct& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Struct* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Struct* New() const { return New(NULL); }
 
-  Struct* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Struct* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Struct& from);
   void MergeFrom(const Struct& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Struct* other);
-  protected:
-  explicit Struct(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -202,7 +116,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -222,22 +136,29 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
+  typedef ::google::protobuf::internal::MapEntryLite<
+      ::std::string, ::google::protobuf::Value,
+      ::google::protobuf::internal::WireFormatLite::TYPE_STRING,
+      ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE,
+      0 >
+      Struct_FieldsEntry;
   ::google::protobuf::internal::MapField<
-      Struct_FieldsEntry_DoNotUse,
       ::std::string, ::google::protobuf::Value,
       ::google::protobuf::internal::WireFormatLite::TYPE_STRING,
       ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE,
       0 > fields_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fstruct_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fstruct_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto();
+
+  void InitAsDefaultInstance();
+  static Struct* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Value : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Value) */ {
+class LIBPROTOBUF_EXPORT Value : public ::google::protobuf::Message {
  public:
   Value();
   virtual ~Value();
@@ -248,27 +169,7 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Value(Value&& from) noexcept
-    : Value() {
-    *this = ::std::move(from);
-  }
 
-  inline Value& operator=(Value&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Value& default_instance();
 
@@ -282,50 +183,32 @@
     KIND_NOT_SET = 0,
   };
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Value* internal_default_instance() {
-    return reinterpret_cast<const Value*>(
-               &_Value_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    2;
-
-  void UnsafeArenaSwap(Value* other);
   void Swap(Value* other);
-  friend void swap(Value& a, Value& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Value* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Value* New() const { return New(NULL); }
 
-  Value* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Value* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Value& from);
   void MergeFrom(const Value& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Value* other);
-  protected:
-  explicit Value(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -335,13 +218,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // .google.protobuf.NullValue null_value = 1;
+  // optional .google.protobuf.NullValue null_value = 1;
   private:
   bool has_null_value() const;
   public:
@@ -350,7 +233,7 @@
   ::google::protobuf::NullValue null_value() const;
   void set_null_value(::google::protobuf::NullValue value);
 
-  // double number_value = 2;
+  // optional double number_value = 2;
   private:
   bool has_number_value() const;
   public:
@@ -359,7 +242,7 @@
   double number_value() const;
   void set_number_value(double value);
 
-  // string string_value = 3;
+  // optional string string_value = 3;
   private:
   bool has_string_value() const;
   public:
@@ -367,25 +250,13 @@
   static const int kStringValueFieldNumber = 3;
   const ::std::string& string_value() const;
   void set_string_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_string_value(::std::string&& value);
-  #endif
   void set_string_value(const char* value);
   void set_string_value(const char* value, size_t size);
   ::std::string* mutable_string_value();
   ::std::string* release_string_value();
   void set_allocated_string_value(::std::string* string_value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_string_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_string_value(
-      ::std::string* string_value);
 
-  // bool bool_value = 4;
+  // optional bool bool_value = 4;
   private:
   bool has_bool_value() const;
   public:
@@ -394,54 +265,40 @@
   bool bool_value() const;
   void set_bool_value(bool value);
 
-  // .google.protobuf.Struct struct_value = 5;
+  // optional .google.protobuf.Struct struct_value = 5;
   bool has_struct_value() const;
   void clear_struct_value();
   static const int kStructValueFieldNumber = 5;
-  private:
-  void _slow_mutable_struct_value();
-  public:
   const ::google::protobuf::Struct& struct_value() const;
-  ::google::protobuf::Struct* release_struct_value();
   ::google::protobuf::Struct* mutable_struct_value();
+  ::google::protobuf::Struct* release_struct_value();
   void set_allocated_struct_value(::google::protobuf::Struct* struct_value);
-  void unsafe_arena_set_allocated_struct_value(
-      ::google::protobuf::Struct* struct_value);
-  ::google::protobuf::Struct* unsafe_arena_release_struct_value();
 
-  // .google.protobuf.ListValue list_value = 6;
+  // optional .google.protobuf.ListValue list_value = 6;
   bool has_list_value() const;
   void clear_list_value();
   static const int kListValueFieldNumber = 6;
-  private:
-  void _slow_mutable_list_value();
-  public:
   const ::google::protobuf::ListValue& list_value() const;
-  ::google::protobuf::ListValue* release_list_value();
   ::google::protobuf::ListValue* mutable_list_value();
+  ::google::protobuf::ListValue* release_list_value();
   void set_allocated_list_value(::google::protobuf::ListValue* list_value);
-  void unsafe_arena_set_allocated_list_value(
-      ::google::protobuf::ListValue* list_value);
-  ::google::protobuf::ListValue* unsafe_arena_release_list_value();
 
   KindCase kind_case() const;
   // @@protoc_insertion_point(class_scope:google.protobuf.Value)
  private:
-  void set_has_null_value();
-  void set_has_number_value();
-  void set_has_string_value();
-  void set_has_bool_value();
-  void set_has_struct_value();
-  void set_has_list_value();
+  inline void set_has_null_value();
+  inline void set_has_number_value();
+  inline void set_has_string_value();
+  inline void set_has_bool_value();
+  inline void set_has_struct_value();
+  inline void set_has_list_value();
 
   inline bool has_kind() const;
   void clear_kind();
   inline void clear_has_kind();
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   union KindUnion {
     KindUnion() {}
     int null_value_;
@@ -454,12 +311,16 @@
   mutable int _cached_size_;
   ::google::protobuf::uint32 _oneof_case_[1];
 
-  friend struct ::protobuf_google_2fprotobuf_2fstruct_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fstruct_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto();
+
+  void InitAsDefaultInstance();
+  static Value* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT ListValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ListValue) */ {
+class LIBPROTOBUF_EXPORT ListValue : public ::google::protobuf::Message {
  public:
   ListValue();
   virtual ~ListValue();
@@ -470,74 +331,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  ListValue(ListValue&& from) noexcept
-    : ListValue() {
-    *this = ::std::move(from);
-  }
 
-  inline ListValue& operator=(ListValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const ListValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const ListValue* internal_default_instance() {
-    return reinterpret_cast<const ListValue*>(
-               &_ListValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    3;
-
-  void UnsafeArenaSwap(ListValue* other);
   void Swap(ListValue* other);
-  friend void swap(ListValue& a, ListValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline ListValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline ListValue* New() const { return New(NULL); }
 
-  ListValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  ListValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const ListValue& from);
   void MergeFrom(const ListValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(ListValue* other);
-  protected:
-  explicit ListValue(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -547,7 +370,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -569,25 +392,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value > values_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fstruct_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fstruct_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fstruct_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto();
+
+  void InitAsDefaultInstance();
+  static ListValue* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
-// -------------------------------------------------------------------
-
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Struct
 
 // map<string, .google.protobuf.Value> fields = 1;
@@ -612,7 +432,7 @@
 
 // Value
 
-// .google.protobuf.NullValue null_value = 1;
+// optional .google.protobuf.NullValue null_value = 1;
 inline bool Value::has_null_value() const {
   return kind_case() == kNullValue;
 }
@@ -641,7 +461,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Value.null_value)
 }
 
-// double number_value = 2;
+// optional double number_value = 2;
 inline bool Value::has_number_value() const {
   return kind_case() == kNumberValue;
 }
@@ -670,7 +490,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Value.number_value)
 }
 
-// string string_value = 3;
+// optional string string_value = 3;
 inline bool Value::has_string_value() const {
   return kind_case() == kStringValue;
 }
@@ -679,63 +499,45 @@
 }
 inline void Value::clear_string_value() {
   if (has_string_value()) {
-    kind_.string_value_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-        GetArenaNoVirtual());
+    kind_.string_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
     clear_has_kind();
   }
 }
 inline const ::std::string& Value::string_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Value.string_value)
   if (has_string_value()) {
-    return kind_.string_value_.Get();
+    return kind_.string_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
   return *&::google::protobuf::internal::GetEmptyStringAlreadyInited();
 }
 inline void Value::set_string_value(const ::std::string& value) {
-  if (!has_string_value()) {
-    clear_kind();
-    set_has_string_value();
-    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  }
-  kind_.string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value,
-      GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value)
-}
-#if LANG_CXX11
-inline void Value::set_string_value(::std::string&& value) {
   // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value)
   if (!has_string_value()) {
     clear_kind();
     set_has_string_value();
     kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
-  kind_.string_value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Value.string_value)
+  kind_.string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value)
 }
-#endif
 inline void Value::set_string_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   if (!has_string_value()) {
     clear_kind();
     set_has_string_value();
     kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
-  kind_.string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      ::std::string(value), GetArenaNoVirtual());
+  kind_.string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Value.string_value)
 }
-inline void Value::set_string_value(const char* value,
-                             size_t size) {
+inline void Value::set_string_value(const char* value, size_t size) {
   if (!has_string_value()) {
     clear_kind();
     set_has_string_value();
     kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
-  kind_.string_value_.Set(
-      &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size),
-      GetArenaNoVirtual());
+  kind_.string_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
+      reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Value.string_value)
 }
 inline ::std::string* Value::mutable_string_value() {
@@ -744,16 +546,14 @@
     set_has_string_value();
     kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   }
-  return kind_.string_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
   // @@protoc_insertion_point(field_mutable:google.protobuf.Value.string_value)
+  return kind_.string_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Value::release_string_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.Value.string_value)
   if (has_string_value()) {
     clear_has_kind();
-    return kind_.string_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-        GetArenaNoVirtual());
+    return kind_.string_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   } else {
     return NULL;
   }
@@ -765,36 +565,13 @@
   clear_kind();
   if (string_value != NULL) {
     set_has_string_value();
-    kind_.string_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value,
-        GetArenaNoVirtual());
+    kind_.string_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+        string_value);
   }
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.string_value)
 }
-inline ::std::string* Value::unsafe_arena_release_string_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.string_value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (has_string_value()) {
-    clear_has_kind();
-    return kind_.string_value_.UnsafeArenaRelease(
-        &::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  } else {
-    return NULL;
-  }
-}
-inline void Value::unsafe_arena_set_allocated_string_value(::std::string* string_value) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (!has_string_value()) {
-    kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  }
-  clear_kind();
-  if (string_value) {
-    set_has_string_value();
-    kind_.string_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value, GetArenaNoVirtual());
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Value.string_value)
-}
 
-// bool bool_value = 4;
+// optional bool bool_value = 4;
 inline bool Value::has_bool_value() const {
   return kind_case() == kBoolValue;
 }
@@ -823,7 +600,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Value.bool_value)
 }
 
-// .google.protobuf.Struct struct_value = 5;
+// optional .google.protobuf.Struct struct_value = 5;
 inline bool Value::has_struct_value() const {
   return kind_case() == kStructValue;
 }
@@ -832,34 +609,27 @@
 }
 inline void Value::clear_struct_value() {
   if (has_struct_value()) {
-    if (GetArenaNoVirtual() == NULL) {
-      delete kind_.struct_value_;
-    }
+    delete kind_.struct_value_;
     clear_has_kind();
   }
 }
-inline ::google::protobuf::Struct* Value::release_struct_value() {
-  // @@protoc_insertion_point(field_release:google.protobuf.Value.struct_value)
-  if (has_struct_value()) {
-    clear_has_kind();
-      ::google::protobuf::Struct* temp = kind_.struct_value_;
-    if (GetArenaNoVirtual() != NULL) {
-      temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-    }
-    kind_.struct_value_ = NULL;
-    return temp;
-  } else {
-    return NULL;
-  }
-}
-inline const ::google::protobuf::Struct& Value::struct_value() const {
+inline  const ::google::protobuf::Struct& Value::struct_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Value.struct_value)
   return has_struct_value()
       ? *kind_.struct_value_
-      : *reinterpret_cast< ::google::protobuf::Struct*>(&::google::protobuf::_Struct_default_instance_);
+      : ::google::protobuf::Struct::default_instance();
 }
-inline ::google::protobuf::Struct* Value::unsafe_arena_release_struct_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.struct_value)
+inline ::google::protobuf::Struct* Value::mutable_struct_value() {
+  if (!has_struct_value()) {
+    clear_kind();
+    set_has_struct_value();
+    kind_.struct_value_ = new ::google::protobuf::Struct;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.struct_value)
+  return kind_.struct_value_;
+}
+inline ::google::protobuf::Struct* Value::release_struct_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Value.struct_value)
   if (has_struct_value()) {
     clear_has_kind();
     ::google::protobuf::Struct* temp = kind_.struct_value_;
@@ -869,27 +639,16 @@
     return NULL;
   }
 }
-inline void Value::unsafe_arena_set_allocated_struct_value(::google::protobuf::Struct* struct_value) {
+inline void Value::set_allocated_struct_value(::google::protobuf::Struct* struct_value) {
   clear_kind();
   if (struct_value) {
     set_has_struct_value();
     kind_.struct_value_ = struct_value;
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Value.struct_value)
-}
-inline ::google::protobuf::Struct* Value::mutable_struct_value() {
-  if (!has_struct_value()) {
-    clear_kind();
-    set_has_struct_value();
-    kind_.struct_value_ = 
-      ::google::protobuf::Arena::CreateMessage< ::google::protobuf::Struct >(
-      GetArenaNoVirtual());
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.struct_value)
-  return kind_.struct_value_;
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.struct_value)
 }
 
-// .google.protobuf.ListValue list_value = 6;
+// optional .google.protobuf.ListValue list_value = 6;
 inline bool Value::has_list_value() const {
   return kind_case() == kListValue;
 }
@@ -898,34 +657,27 @@
 }
 inline void Value::clear_list_value() {
   if (has_list_value()) {
-    if (GetArenaNoVirtual() == NULL) {
-      delete kind_.list_value_;
-    }
+    delete kind_.list_value_;
     clear_has_kind();
   }
 }
-inline ::google::protobuf::ListValue* Value::release_list_value() {
-  // @@protoc_insertion_point(field_release:google.protobuf.Value.list_value)
-  if (has_list_value()) {
-    clear_has_kind();
-      ::google::protobuf::ListValue* temp = kind_.list_value_;
-    if (GetArenaNoVirtual() != NULL) {
-      temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-    }
-    kind_.list_value_ = NULL;
-    return temp;
-  } else {
-    return NULL;
-  }
-}
-inline const ::google::protobuf::ListValue& Value::list_value() const {
+inline  const ::google::protobuf::ListValue& Value::list_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Value.list_value)
   return has_list_value()
       ? *kind_.list_value_
-      : *reinterpret_cast< ::google::protobuf::ListValue*>(&::google::protobuf::_ListValue_default_instance_);
+      : ::google::protobuf::ListValue::default_instance();
 }
-inline ::google::protobuf::ListValue* Value::unsafe_arena_release_list_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.list_value)
+inline ::google::protobuf::ListValue* Value::mutable_list_value() {
+  if (!has_list_value()) {
+    clear_kind();
+    set_has_list_value();
+    kind_.list_value_ = new ::google::protobuf::ListValue;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.list_value)
+  return kind_.list_value_;
+}
+inline ::google::protobuf::ListValue* Value::release_list_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Value.list_value)
   if (has_list_value()) {
     clear_has_kind();
     ::google::protobuf::ListValue* temp = kind_.list_value_;
@@ -935,24 +687,13 @@
     return NULL;
   }
 }
-inline void Value::unsafe_arena_set_allocated_list_value(::google::protobuf::ListValue* list_value) {
+inline void Value::set_allocated_list_value(::google::protobuf::ListValue* list_value) {
   clear_kind();
   if (list_value) {
     set_has_list_value();
     kind_.list_value_ = list_value;
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Value.list_value)
-}
-inline ::google::protobuf::ListValue* Value::mutable_list_value() {
-  if (!has_list_value()) {
-    clear_kind();
-    set_has_list_value();
-    kind_.list_value_ = 
-      ::google::protobuf::Arena::CreateMessage< ::google::protobuf::ListValue >(
-      GetArenaNoVirtual());
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.Value.list_value)
-  return kind_.list_value_;
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.list_value)
 }
 
 inline bool Value::has_kind() const {
@@ -998,11 +739,7 @@
   return values_;
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
-// -------------------------------------------------------------------
-
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 // -------------------------------------------------------------------
 
 // -------------------------------------------------------------------
@@ -1013,6 +750,7 @@
 }  // namespace protobuf
 }  // namespace google
 
+#ifndef SWIG
 namespace google {
 namespace protobuf {
 
@@ -1024,6 +762,7 @@
 
 }  // namespace protobuf
 }  // namespace google
+#endif  // SWIG
 
 // @@protoc_insertion_point(global_scope)
 
diff --git a/src/google/protobuf/struct.proto b/src/google/protobuf/struct.proto
index 7d7808e..beeba81 100644
--- a/src/google/protobuf/struct.proto
+++ b/src/google/protobuf/struct.proto
@@ -33,11 +33,11 @@
 package google.protobuf;
 
 option csharp_namespace = "Google.Protobuf.WellKnownTypes";
-option cc_enable_arenas = true;
 option go_package = "github.com/golang/protobuf/ptypes/struct;structpb";
 option java_package = "com.google.protobuf";
 option java_outer_classname = "StructProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
 
 
diff --git a/src/google/protobuf/stubs/atomicops.h b/src/google/protobuf/stubs/atomicops.h
index cb4553b..9b3d1e6 100644
--- a/src/google/protobuf/stubs/atomicops.h
+++ b/src/google/protobuf/stubs/atomicops.h
@@ -63,22 +63,28 @@
 namespace protobuf {
 namespace internal {
 
-#ifdef GOOGLE_PROTOBUF_ARCH_32_BIT
-  typedef intptr_t Atomic32;
-  typedef int64 Atomic64;
+#if defined(GOOGLE_PROTOBUF_ARCH_POWER)
+#if defined(_LP64) || defined(__LP64__)
+typedef int32 Atomic32;
+typedef intptr_t Atomic64;
 #else
-  // We need to be able to go between Atomic64 and AtomicWord implicitly.  This
-  // means Atomic64 and AtomicWord should be the same type on 64-bit.
-  #if defined(__ILP32__) || defined(GOOGLE_PROTOBUF_OS_NACL)
-  // NaCl's intptr_t is not actually 64-bits on 64-bit!
-  // http://code.google.com/p/nativeclient/issues/detail?id=1162
-  // sparcv9's pointer type is 32bits
-  typedef intptr_t Atomic32;
-  typedef int64 Atomic64;
-  #else
-  typedef int32 Atomic32;
-  typedef intptr_t Atomic64;
-  #endif
+typedef intptr_t Atomic32;
+typedef int64 Atomic64;
+#endif
+#else
+typedef int32 Atomic32;
+#ifdef GOOGLE_PROTOBUF_ARCH_64_BIT
+// We need to be able to go between Atomic64 and AtomicWord implicitly.  This
+// means Atomic64 and AtomicWord should be the same type on 64-bit.
+#if defined(__ILP32__) || defined(GOOGLE_PROTOBUF_OS_NACL)
+// NaCl's intptr_t is not actually 64-bits on 64-bit!
+// http://code.google.com/p/nativeclient/issues/detail?id=1162
+// sparcv9's pointer type is 32bits
+typedef int64 Atomic64;
+#else
+typedef intptr_t Atomic64;
+#endif
+#endif
 #endif
 
 // Use AtomicWord for a machine-sized pointer.  It will use the Atomic32 or
@@ -117,8 +123,8 @@
 // ensure that no later memory access can be reordered ahead of the operation.
 // "Release" operations ensure that no previous memory access can be reordered
 // after the operation.  "Barrier" operations have both "Acquire" and "Release"
-// semantics.   A MemoryBarrierInternal() has "Barrier" semantics, but does no
-// memory access.
+// semantics.   A MemoryBarrier() has "Barrier" semantics, but does no memory
+// access.
 Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
                                 Atomic32 old_value,
                                 Atomic32 new_value);
@@ -126,10 +132,10 @@
                                 Atomic32 old_value,
                                 Atomic32 new_value);
 
-// This function was renamed from MemoryBarrier to MemoryBarrierInternal
-// because MemoryBarrier is a define in Windows ARM builds and we do not
-// undefine it because we call it from this function.
-void MemoryBarrierInternal();
+#if defined(__MINGW32__) && defined(MemoryBarrier)
+#undef MemoryBarrier
+#endif
+void MemoryBarrier();
 void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value);
 void Acquire_Store(volatile Atomic32* ptr, Atomic32 value);
 void Release_Store(volatile Atomic32* ptr, Atomic32 value);
@@ -174,7 +180,7 @@
 #include <google/protobuf/stubs/atomicops_internals_tsan.h>
 // MSVC.
 #elif defined(_MSC_VER)
-#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64) || defined(GOOGLE_PROTOBUF_ARCH_ARM)
+#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
 #include <google/protobuf/stubs/atomicops_internals_x86_msvc.h>
 #else
 #error GOOGLE_PROTOBUF_ATOMICOPS_ERROR
@@ -188,16 +194,16 @@
 #elif defined(GOOGLE_PROTOBUF_OS_AIX)
 #include <google/protobuf/stubs/atomicops_internals_power.h>
 
+// Apple.
+#elif defined(GOOGLE_PROTOBUF_OS_APPLE)
+#include <google/protobuf/stubs/atomicops_internals_macosx.h>
+
 // GCC.
 #elif defined(__GNUC__)
 #if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
 #include <google/protobuf/stubs/atomicops_internals_x86_gcc.h>
 #elif defined(GOOGLE_PROTOBUF_ARCH_ARM) && defined(__linux__)
-#if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4))
-#include <google/protobuf/stubs/atomicops_internals_generic_gcc.h>
-#else
 #include <google/protobuf/stubs/atomicops_internals_arm_gcc.h>
-#endif
 #elif defined(GOOGLE_PROTOBUF_ARCH_AARCH64)
 #include <google/protobuf/stubs/atomicops_internals_arm64_gcc.h>
 #elif defined(GOOGLE_PROTOBUF_ARCH_ARM_QNX)
@@ -207,10 +213,7 @@
 #elif defined(GOOGLE_PROTOBUF_ARCH_POWER)
 #include <google/protobuf/stubs/atomicops_internals_power.h>
 #elif defined(__native_client__)
-// The static_asserts in the C++11 atomics implementation cause it to fail
-// with certain compilers, e.g. nvcc on macOS. Don't use elsewhere unless
-// the TODO in that file is addressed.
-#include <google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h>
+#include <google/protobuf/stubs/atomicops_internals_pnacl.h>
 #elif defined(GOOGLE_PROTOBUF_ARCH_PPC)
 #include <google/protobuf/stubs/atomicops_internals_ppc_gcc.h>
 #elif (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4))
@@ -230,6 +233,12 @@
 #error GOOGLE_PROTOBUF_ATOMICOPS_ERROR
 #endif
 
+// On some platforms we need additional declarations to make AtomicWord
+// compatible with our other Atomic* types.
+#if defined(GOOGLE_PROTOBUF_OS_APPLE)
+#include <google/protobuf/stubs/atomicops_internals_atomicword_compat.h>
+#endif
+
 #undef GOOGLE_PROTOBUF_ATOMICOPS_ERROR
 
 #endif  // GOOGLE_PROTOBUF_NO_THREAD_SAFETY
diff --git a/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h b/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h
index 9a69d21..0a2d2b8 100644
--- a/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h
@@ -37,7 +37,7 @@
 namespace protobuf {
 namespace internal {
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   __asm__ __volatile__ ("dmb ish" ::: "memory");  // NOLINT
 }
 
@@ -117,9 +117,9 @@
 
 inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
                                         Atomic32 increment) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic32 result = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrierInternal();
+  MemoryBarrier();
 
   return result;
 }
@@ -128,7 +128,7 @@
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
   Atomic32 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrierInternal();
+  MemoryBarrier();
 
   return prev;
 }
@@ -136,7 +136,7 @@
 inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic32 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
 
   return prev;
@@ -148,7 +148,7 @@
 
 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
@@ -178,7 +178,7 @@
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
@@ -253,9 +253,9 @@
 
 inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
                                         Atomic64 increment) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic64 result = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrierInternal();
+  MemoryBarrier();
 
   return result;
 }
@@ -264,7 +264,7 @@
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
   Atomic64 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrierInternal();
+  MemoryBarrier();
 
   return prev;
 }
@@ -272,7 +272,7 @@
 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic64 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
 
   return prev;
@@ -284,7 +284,7 @@
 
 inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
@@ -314,7 +314,7 @@
 }
 
 inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h b/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h
index 6e2de67..90e727b 100644
--- a/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h
@@ -115,17 +115,17 @@
   *ptr = value;
 }
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   pLinuxKernelMemoryBarrier();
 }
 
 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   *ptr = value;
 }
 
@@ -135,12 +135,12 @@
 
 inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
   Atomic32 value = *ptr;
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return value;
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h b/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
index cd97e0c..17dfaa5 100644
--- a/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
+++ b/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
@@ -110,17 +110,17 @@
   *ptr = value;
 }
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   __sync_synchronize();
 }
 
 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   *ptr = value;
 }
 
@@ -130,12 +130,12 @@
 
 inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
   Atomic32 value = *ptr;
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return value;
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h b/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h
new file mode 100644
index 0000000..eb198ff
--- /dev/null
+++ b/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h
@@ -0,0 +1,122 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2012 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.
+
+// This file is an internal atomic implementation, use atomicops.h instead.
+
+#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
+#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
+
+// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32,
+// which in turn means int. On some LP32 platforms, intptr_t is an int, but
+// on others, it's a long. When AtomicWord and Atomic32 are based on different
+// fundamental types, their pointers are incompatible.
+//
+// This file defines function overloads to allow both AtomicWord and Atomic32
+// data to be used with this interface.
+//
+// On LP64 platforms, AtomicWord and Atomic64 are both always long,
+// so this problem doesn't occur.
+
+#if !defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
+
+namespace google {
+namespace protobuf {
+namespace internal {
+
+inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr,
+                                           AtomicWord old_value,
+                                           AtomicWord new_value) {
+  return NoBarrier_CompareAndSwap(
+      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
+}
+
+inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr,
+                                           AtomicWord new_value) {
+  return NoBarrier_AtomicExchange(
+      reinterpret_cast<volatile Atomic32*>(ptr), new_value);
+}
+
+inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr,
+                                            AtomicWord increment) {
+  return NoBarrier_AtomicIncrement(
+      reinterpret_cast<volatile Atomic32*>(ptr), increment);
+}
+
+inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr,
+                                          AtomicWord increment) {
+  return Barrier_AtomicIncrement(
+      reinterpret_cast<volatile Atomic32*>(ptr), increment);
+}
+
+inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr,
+                                         AtomicWord old_value,
+                                         AtomicWord new_value) {
+  return Acquire_CompareAndSwap(
+      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
+}
+
+inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr,
+                                         AtomicWord old_value,
+                                         AtomicWord new_value) {
+  return Release_CompareAndSwap(
+      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
+}
+
+inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) {
+  NoBarrier_Store(reinterpret_cast<volatile Atomic32*>(ptr), value);
+}
+
+inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) {
+  return Acquire_Store(reinterpret_cast<volatile Atomic32*>(ptr), value);
+}
+
+inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) {
+  return Release_Store(reinterpret_cast<volatile Atomic32*>(ptr), value);
+}
+
+inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) {
+  return NoBarrier_Load(reinterpret_cast<volatile const Atomic32*>(ptr));
+}
+
+inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) {
+  return Acquire_Load(reinterpret_cast<volatile const Atomic32*>(ptr));
+}
+
+inline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
+  return Release_Load(reinterpret_cast<volatile const Atomic32*>(ptr));
+}
+
+}   // namespace internal
+}   // namespace protobuf
+}   // namespace google
+
+#endif  // !defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
+
+#endif  // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
diff --git a/src/google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h b/src/google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h
deleted file mode 100644
index 44ef9c9..0000000
--- a/src/google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h
+++ /dev/null
@@ -1,231 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2012 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.
-
-// This file is an internal atomic implementation, use atomicops.h instead.
-
-#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_C11_ATOMIC_H_
-#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_C11_ATOMIC_H_
-
-#include <atomic>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-// This implementation is transitional and maintains the original API for
-// atomicops.h. This requires casting memory locations to the atomic types, and
-// assumes that the API and the C++11 implementation are layout-compatible,
-// which isn't true for all implementations or hardware platforms. The static
-// assertion should detect this issue, were it to fire then this header
-// shouldn't be used.
-//
-// TODO(jfb) If this header manages to stay committed then the API should be
-//           modified, and all call sites updated.
-typedef volatile std::atomic<Atomic32>* AtomicLocation32;
-static_assert(sizeof(*(AtomicLocation32) nullptr) == sizeof(Atomic32),
-              "incompatible 32-bit atomic layout");
-
-inline void MemoryBarrierInternal() {
-#if defined(__GLIBCXX__)
-  // Work around libstdc++ bug 51038 where atomic_thread_fence was declared but
-  // not defined, leading to the linker complaining about undefined references.
-  __atomic_thread_fence(std::memory_order_seq_cst);
-#else
-  std::atomic_thread_fence(std::memory_order_seq_cst);
-#endif
-}
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
-                                         Atomic32 old_value,
-                                         Atomic32 new_value) {
-  ((AtomicLocation32)ptr)
-      ->compare_exchange_strong(old_value,
-                                new_value,
-                                std::memory_order_relaxed,
-                                std::memory_order_relaxed);
-  return old_value;
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
-                                         Atomic32 new_value) {
-  return ((AtomicLocation32)ptr)
-      ->exchange(new_value, std::memory_order_relaxed);
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
-                                          Atomic32 increment) {
-  return increment +
-         ((AtomicLocation32)ptr)
-             ->fetch_add(increment, std::memory_order_relaxed);
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
-                                        Atomic32 increment) {
-  return increment + ((AtomicLocation32)ptr)->fetch_add(increment);
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  ((AtomicLocation32)ptr)
-      ->compare_exchange_strong(old_value,
-                                new_value,
-                                std::memory_order_acquire,
-                                std::memory_order_acquire);
-  return old_value;
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
-                                       Atomic32 old_value,
-                                       Atomic32 new_value) {
-  ((AtomicLocation32)ptr)
-      ->compare_exchange_strong(old_value,
-                                new_value,
-                                std::memory_order_release,
-                                std::memory_order_relaxed);
-  return old_value;
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
-  ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed);
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
-  ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed);
-  MemoryBarrierInternal();
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  ((AtomicLocation32)ptr)->store(value, std::memory_order_release);
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
-  return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed);
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
-  return ((AtomicLocation32)ptr)->load(std::memory_order_acquire);
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
-  return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed);
-}
-
-#if defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
-
-typedef volatile std::atomic<Atomic64>* AtomicLocation64;
-static_assert(sizeof(*(AtomicLocation64) nullptr) == sizeof(Atomic64),
-              "incompatible 64-bit atomic layout");
-
-inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
-                                         Atomic64 old_value,
-                                         Atomic64 new_value) {
-  ((AtomicLocation64)ptr)
-      ->compare_exchange_strong(old_value,
-                                new_value,
-                                std::memory_order_relaxed,
-                                std::memory_order_relaxed);
-  return old_value;
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  return ((AtomicLocation64)ptr)
-      ->exchange(new_value, std::memory_order_relaxed);
-}
-
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  return increment +
-         ((AtomicLocation64)ptr)
-             ->fetch_add(increment, std::memory_order_relaxed);
-}
-
-inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
-                                        Atomic64 increment) {
-  return increment + ((AtomicLocation64)ptr)->fetch_add(increment);
-}
-
-inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  ((AtomicLocation64)ptr)
-      ->compare_exchange_strong(old_value,
-                                new_value,
-                                std::memory_order_acquire,
-                                std::memory_order_acquire);
-  return old_value;
-}
-
-inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
-                                       Atomic64 old_value,
-                                       Atomic64 new_value) {
-  ((AtomicLocation64)ptr)
-      ->compare_exchange_strong(old_value,
-                                new_value,
-                                std::memory_order_release,
-                                std::memory_order_relaxed);
-  return old_value;
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed);
-}
-
-inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
-  ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed);
-  MemoryBarrierInternal();
-}
-
-inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  ((AtomicLocation64)ptr)->store(value, std::memory_order_release);
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed);
-}
-
-inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
-  return ((AtomicLocation64)ptr)->load(std::memory_order_acquire);
-}
-
-inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrierInternal();
-  return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed);
-}
-
-#endif  // defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
-
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
-
-#endif  // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_C11_ATOMIC_H_
diff --git a/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h b/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h
index 0b0b06c..a0116a6 100644
--- a/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h
@@ -38,7 +38,7 @@
 inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
                                          Atomic32 old_value,
                                          Atomic32 new_value) {
-  __atomic_compare_exchange_n(ptr, &old_value, new_value, false,
+  __atomic_compare_exchange_n(ptr, &old_value, new_value, true,
                               __ATOMIC_RELAXED, __ATOMIC_RELAXED);
   return old_value;
 }
@@ -61,7 +61,7 @@
 inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
-  __atomic_compare_exchange_n(ptr, &old_value, new_value, false,
+  __atomic_compare_exchange_n(ptr, &old_value, new_value, true,
                               __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
   return old_value;
 }
@@ -69,7 +69,7 @@
 inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
-  __atomic_compare_exchange_n(ptr, &old_value, new_value, false,
+  __atomic_compare_exchange_n(ptr, &old_value, new_value, true,
                               __ATOMIC_RELEASE, __ATOMIC_ACQUIRE);
   return old_value;
 }
@@ -78,7 +78,7 @@
   __atomic_store_n(ptr, value, __ATOMIC_RELAXED);
 }
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   __sync_synchronize();
 }
 
@@ -115,7 +115,7 @@
 inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
-  __atomic_compare_exchange_n(ptr, &old_value, new_value, false,
+  __atomic_compare_exchange_n(ptr, &old_value, new_value, true,
                               __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
   return old_value;
 }
@@ -123,29 +123,11 @@
 inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
                                          Atomic64 old_value,
                                          Atomic64 new_value) {
-  __atomic_compare_exchange_n(ptr, &old_value, new_value, false,
+  __atomic_compare_exchange_n(ptr, &old_value, new_value, true,
                               __ATOMIC_RELAXED, __ATOMIC_RELAXED);
   return old_value;
 }
 
-inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
-                                          Atomic64 increment) {
-  return __atomic_add_fetch(ptr, increment, __ATOMIC_RELAXED);
-}
-
-inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
-  __atomic_store_n(ptr, value, __ATOMIC_RELAXED);
-}
-
-inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
-                                         Atomic64 new_value) {
-  return __atomic_exchange_n(ptr, new_value, __ATOMIC_RELAXED);
-}
-
-inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
-  return __atomic_load_n(ptr, __ATOMIC_RELAXED);
-}
-
 #endif // defined(__LP64__)
 
 }  // namespace internal
diff --git a/src/google/protobuf/stubs/atomicops_internals_macosx.h b/src/google/protobuf/stubs/atomicops_internals_macosx.h
new file mode 100644
index 0000000..7963324
--- /dev/null
+++ b/src/google/protobuf/stubs/atomicops_internals_macosx.h
@@ -0,0 +1,225 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2012 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.
+
+// This file is an internal atomic implementation, use atomicops.h instead.
+
+#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MACOSX_H_
+#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MACOSX_H_
+
+#include <libkern/OSAtomic.h>
+
+namespace google {
+namespace protobuf {
+namespace internal {
+
+inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
+                                         Atomic32 old_value,
+                                         Atomic32 new_value) {
+  Atomic32 prev_value;
+  do {
+    if (OSAtomicCompareAndSwap32(old_value, new_value,
+                                 const_cast<Atomic32*>(ptr))) {
+      return old_value;
+    }
+    prev_value = *ptr;
+  } while (prev_value == old_value);
+  return prev_value;
+}
+
+inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
+                                         Atomic32 new_value) {
+  Atomic32 old_value;
+  do {
+    old_value = *ptr;
+  } while (!OSAtomicCompareAndSwap32(old_value, new_value,
+                                     const_cast<Atomic32*>(ptr)));
+  return old_value;
+}
+
+inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
+                                          Atomic32 increment) {
+  return OSAtomicAdd32(increment, const_cast<Atomic32*>(ptr));
+}
+
+inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
+                                          Atomic32 increment) {
+  return OSAtomicAdd32Barrier(increment, const_cast<Atomic32*>(ptr));
+}
+
+inline void MemoryBarrier() {
+  OSMemoryBarrier();
+}
+
+inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
+                                       Atomic32 old_value,
+                                       Atomic32 new_value) {
+  Atomic32 prev_value;
+  do {
+    if (OSAtomicCompareAndSwap32Barrier(old_value, new_value,
+                                        const_cast<Atomic32*>(ptr))) {
+      return old_value;
+    }
+    prev_value = *ptr;
+  } while (prev_value == old_value);
+  return prev_value;
+}
+
+inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
+                                       Atomic32 old_value,
+                                       Atomic32 new_value) {
+  return Acquire_CompareAndSwap(ptr, old_value, new_value);
+}
+
+inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
+  *ptr = value;
+}
+
+inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
+  *ptr = value;
+  MemoryBarrier();
+}
+
+inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
+  MemoryBarrier();
+  *ptr = value;
+}
+
+inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
+  return *ptr;
+}
+
+inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
+  Atomic32 value = *ptr;
+  MemoryBarrier();
+  return value;
+}
+
+inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
+  MemoryBarrier();
+  return *ptr;
+}
+
+#ifdef __LP64__
+
+// 64-bit implementation on 64-bit platform
+
+inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
+                                         Atomic64 old_value,
+                                         Atomic64 new_value) {
+  Atomic64 prev_value;
+  do {
+    if (OSAtomicCompareAndSwap64(old_value, new_value,
+                                 reinterpret_cast<volatile int64_t*>(ptr))) {
+      return old_value;
+    }
+    prev_value = *ptr;
+  } while (prev_value == old_value);
+  return prev_value;
+}
+
+inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
+                                         Atomic64 new_value) {
+  Atomic64 old_value;
+  do {
+    old_value = *ptr;
+  } while (!OSAtomicCompareAndSwap64(old_value, new_value,
+                                     reinterpret_cast<volatile int64_t*>(ptr)));
+  return old_value;
+}
+
+inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
+                                          Atomic64 increment) {
+  return OSAtomicAdd64(increment, reinterpret_cast<volatile int64_t*>(ptr));
+}
+
+inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
+                                        Atomic64 increment) {
+  return OSAtomicAdd64Barrier(increment,
+                              reinterpret_cast<volatile int64_t*>(ptr));
+}
+
+inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
+                                       Atomic64 old_value,
+                                       Atomic64 new_value) {
+  Atomic64 prev_value;
+  do {
+    if (OSAtomicCompareAndSwap64Barrier(
+        old_value, new_value, reinterpret_cast<volatile int64_t*>(ptr))) {
+      return old_value;
+    }
+    prev_value = *ptr;
+  } while (prev_value == old_value);
+  return prev_value;
+}
+
+inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
+                                       Atomic64 old_value,
+                                       Atomic64 new_value) {
+  // The lib kern interface does not distinguish between
+  // Acquire and Release memory barriers; they are equivalent.
+  return Acquire_CompareAndSwap(ptr, old_value, new_value);
+}
+
+inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
+  *ptr = value;
+}
+
+inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
+  *ptr = value;
+  MemoryBarrier();
+}
+
+inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
+  MemoryBarrier();
+  *ptr = value;
+}
+
+inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
+  return *ptr;
+}
+
+inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
+  Atomic64 value = *ptr;
+  MemoryBarrier();
+  return value;
+}
+
+inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
+  MemoryBarrier();
+  return *ptr;
+}
+
+#endif  // defined(__LP64__)
+
+}  // namespace internal
+}  // namespace protobuf
+}  // namespace google
+
+#endif  // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MACOSX_H_
diff --git a/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h b/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h
index 6ce6820..f5837c9 100644
--- a/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h
@@ -125,8 +125,8 @@
 // ensure that no later memory access can be reordered ahead of the operation.
 // "Release" operations ensure that no previous memory access can be reordered
 // after the operation.  "Barrier" operations have both "Acquire" and "Release"
-// semantics.   A MemoryBarrierInternal() has "Barrier" semantics, but does no
-// memory access.
+// semantics.   A MemoryBarrier() has "Barrier" semantics, but does no memory
+// access.
 inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
@@ -149,17 +149,17 @@
   *ptr = value;
 }
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   __asm__ __volatile__("sync" : : : "memory");
 }
 
 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   *ptr = value;
 }
 
@@ -169,12 +169,12 @@
 
 inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
   Atomic32 value = *ptr;
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return value;
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
@@ -247,9 +247,9 @@
 
 inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
                                         Atomic64 increment) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic64 res = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return res;
 }
 
@@ -257,20 +257,20 @@
 // ensure that no later memory access can be reordered ahead of the operation.
 // "Release" operations ensure that no previous memory access can be reordered
 // after the operation.  "Barrier" operations have both "Acquire" and "Release"
-// semantics.   A MemoryBarrierInternal() has "Barrier" semantics, but does no
-// memory access.
+// semantics.   A MemoryBarrier() has "Barrier" semantics, but does no memory
+// access.
 inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
   Atomic64 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return res;
 }
 
 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
 }
 
@@ -280,11 +280,11 @@
 
 inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   *ptr = value;
 }
 
@@ -294,12 +294,12 @@
 
 inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
   Atomic64 value = *ptr;
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return value;
 }
 
 inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 #endif
diff --git a/src/google/protobuf/stubs/atomicops_internals_pnacl.h b/src/google/protobuf/stubs/atomicops_internals_pnacl.h
new file mode 100644
index 0000000..3b314fd
--- /dev/null
+++ b/src/google/protobuf/stubs/atomicops_internals_pnacl.h
@@ -0,0 +1,231 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2012 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.
+
+// This file is an internal atomic implementation, use atomicops.h instead.
+
+#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_
+#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_
+
+#include <atomic>
+
+namespace google {
+namespace protobuf {
+namespace internal {
+
+// This implementation is transitional and maintains the original API for
+// atomicops.h. This requires casting memory locations to the atomic types, and
+// assumes that the API and the C++11 implementation are layout-compatible,
+// which isn't true for all implementations or hardware platforms. The static
+// assertion should detect this issue, were it to fire then this header
+// shouldn't be used.
+//
+// TODO(jfb) If this header manages to stay committed then the API should be
+//           modified, and all call sites updated.
+typedef volatile std::atomic<Atomic32>* AtomicLocation32;
+static_assert(sizeof(*(AtomicLocation32) nullptr) == sizeof(Atomic32),
+              "incompatible 32-bit atomic layout");
+
+inline void MemoryBarrier() {
+#if defined(__GLIBCXX__)
+  // Work around libstdc++ bug 51038 where atomic_thread_fence was declared but
+  // not defined, leading to the linker complaining about undefined references.
+  __atomic_thread_fence(std::memory_order_seq_cst);
+#else
+  std::atomic_thread_fence(std::memory_order_seq_cst);
+#endif
+}
+
+inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
+                                         Atomic32 old_value,
+                                         Atomic32 new_value) {
+  ((AtomicLocation32)ptr)
+      ->compare_exchange_strong(old_value,
+                                new_value,
+                                std::memory_order_relaxed,
+                                std::memory_order_relaxed);
+  return old_value;
+}
+
+inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
+                                         Atomic32 new_value) {
+  return ((AtomicLocation32)ptr)
+      ->exchange(new_value, std::memory_order_relaxed);
+}
+
+inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
+                                          Atomic32 increment) {
+  return increment +
+         ((AtomicLocation32)ptr)
+             ->fetch_add(increment, std::memory_order_relaxed);
+}
+
+inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
+                                        Atomic32 increment) {
+  return increment + ((AtomicLocation32)ptr)->fetch_add(increment);
+}
+
+inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
+                                       Atomic32 old_value,
+                                       Atomic32 new_value) {
+  ((AtomicLocation32)ptr)
+      ->compare_exchange_strong(old_value,
+                                new_value,
+                                std::memory_order_acquire,
+                                std::memory_order_acquire);
+  return old_value;
+}
+
+inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
+                                       Atomic32 old_value,
+                                       Atomic32 new_value) {
+  ((AtomicLocation32)ptr)
+      ->compare_exchange_strong(old_value,
+                                new_value,
+                                std::memory_order_release,
+                                std::memory_order_relaxed);
+  return old_value;
+}
+
+inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
+  ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed);
+}
+
+inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
+  ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed);
+  MemoryBarrier();
+}
+
+inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
+  ((AtomicLocation32)ptr)->store(value, std::memory_order_release);
+}
+
+inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
+  return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed);
+}
+
+inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
+  return ((AtomicLocation32)ptr)->load(std::memory_order_acquire);
+}
+
+inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
+  MemoryBarrier();
+  return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed);
+}
+
+#if defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
+
+typedef volatile std::atomic<Atomic64>* AtomicLocation64;
+static_assert(sizeof(*(AtomicLocation64) nullptr) == sizeof(Atomic64),
+              "incompatible 64-bit atomic layout");
+
+inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
+                                         Atomic64 old_value,
+                                         Atomic64 new_value) {
+  ((AtomicLocation64)ptr)
+      ->compare_exchange_strong(old_value,
+                                new_value,
+                                std::memory_order_relaxed,
+                                std::memory_order_relaxed);
+  return old_value;
+}
+
+inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
+                                         Atomic64 new_value) {
+  return ((AtomicLocation64)ptr)
+      ->exchange(new_value, std::memory_order_relaxed);
+}
+
+inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
+                                          Atomic64 increment) {
+  return increment +
+         ((AtomicLocation64)ptr)
+             ->fetch_add(increment, std::memory_order_relaxed);
+}
+
+inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
+                                        Atomic64 increment) {
+  return increment + ((AtomicLocation64)ptr)->fetch_add(increment);
+}
+
+inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
+                                       Atomic64 old_value,
+                                       Atomic64 new_value) {
+  ((AtomicLocation64)ptr)
+      ->compare_exchange_strong(old_value,
+                                new_value,
+                                std::memory_order_acquire,
+                                std::memory_order_acquire);
+  return old_value;
+}
+
+inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
+                                       Atomic64 old_value,
+                                       Atomic64 new_value) {
+  ((AtomicLocation64)ptr)
+      ->compare_exchange_strong(old_value,
+                                new_value,
+                                std::memory_order_release,
+                                std::memory_order_relaxed);
+  return old_value;
+}
+
+inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
+  ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed);
+}
+
+inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
+  ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed);
+  MemoryBarrier();
+}
+
+inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
+  ((AtomicLocation64)ptr)->store(value, std::memory_order_release);
+}
+
+inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
+  return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed);
+}
+
+inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
+  return ((AtomicLocation64)ptr)->load(std::memory_order_acquire);
+}
+
+inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
+  MemoryBarrier();
+  return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed);
+}
+
+#endif  // defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
+
+}  // namespace internal
+}  // namespace protobuf
+}  // namespace google
+
+#endif  // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_
diff --git a/src/google/protobuf/stubs/atomicops_internals_power.h b/src/google/protobuf/stubs/atomicops_internals_power.h
index cad9f1e..b8a42f2 100644
--- a/src/google/protobuf/stubs/atomicops_internals_power.h
+++ b/src/google/protobuf/stubs/atomicops_internals_power.h
@@ -93,7 +93,7 @@
   return result;
 }
 
-inline void MemoryBarrierInternal(void) {
+inline void MemoryBarrier(void) {
   asm volatile (
       "       lwsync                          \n\t"
       "       isync                           \n\t"
diff --git a/src/google/protobuf/stubs/atomicops_internals_ppc_gcc.h b/src/google/protobuf/stubs/atomicops_internals_ppc_gcc.h
index d477dc6..8231a57 100644
--- a/src/google/protobuf/stubs/atomicops_internals_ppc_gcc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_ppc_gcc.h
@@ -97,22 +97,22 @@
 
 inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr,
                                         Atomic32 increment) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic32 res = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return res;
 }
 
 inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr,
                                        Atomic32 old_value, Atomic32 new_value) {
   Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return res;
 }
 
 inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr,
                                        Atomic32 old_value, Atomic32 new_value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
   return res;
 }
@@ -121,15 +121,15 @@
   *ptr = value;
 }
 
-inline void MemoryBarrierInternal() { __asm__ __volatile__("sync" : : : "memory"); }
+inline void MemoryBarrier() { __asm__ __volatile__("sync" : : : "memory"); }
 
 inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   *ptr = value;
 }
 
@@ -137,12 +137,12 @@
 
 inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) {
   Atomic32 value = *ptr;
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return value;
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32 *ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_solaris.h b/src/google/protobuf/stubs/atomicops_internals_solaris.h
index baecb99..d8057ec 100644
--- a/src/google/protobuf/stubs/atomicops_internals_solaris.h
+++ b/src/google/protobuf/stubs/atomicops_internals_solaris.h
@@ -54,16 +54,16 @@
   return (Atomic32)atomic_add_32_nv((volatile uint32_t*)ptr, (uint32_t)increment);
 }
 
-inline void MemoryBarrierInternal(void) {
+inline void MemoryBarrier(void) {
 	membar_producer();
 	membar_consumer();
 }
 
 inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
                                         Atomic32 increment) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic32 ret = NoBarrier_AtomicIncrement(ptr, increment);
-  MemoryBarrierInternal();
+  MemoryBarrier();
 
   return ret;
 }
@@ -72,7 +72,7 @@
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
   Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrierInternal();
+  MemoryBarrier();
 
   return ret;
 }
@@ -80,7 +80,7 @@
 inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
                                        Atomic32 old_value,
                                        Atomic32 new_value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
 }
 
@@ -129,9 +129,9 @@
 }
 
 inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   Atomic64 ret = atomic_add_64_nv((volatile uint64_t*)ptr, increment);
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return ret;
 }
 
@@ -139,14 +139,14 @@
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
   Atomic64 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return ret;
 }
 
 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
                                        Atomic64 old_value,
                                        Atomic64 new_value) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_tsan.h b/src/google/protobuf/stubs/atomicops_internals_tsan.h
index 676380b..0c90354 100644
--- a/src/google/protobuf/stubs/atomicops_internals_tsan.h
+++ b/src/google/protobuf/stubs/atomicops_internals_tsan.h
@@ -206,7 +206,7 @@
   return cmp;
 }
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h b/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h
index e80121f..edccc59 100644
--- a/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h
@@ -119,18 +119,18 @@
 
 // 64-bit implementations of memory barrier can be simpler, because it
 // "mfence" is guaranteed to exist.
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   __asm__ __volatile__("mfence" : : : "memory");
 }
 
 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 #else
 
-inline void MemoryBarrierInternal() {
+inline void MemoryBarrier() {
   if (AtomicOps_Internalx86CPUFeatures.has_sse2) {
     __asm__ __volatile__("mfence" : : : "memory");
   } else {  // mfence is faster but not present on PIII
@@ -168,7 +168,7 @@
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
@@ -225,7 +225,7 @@
 
 inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
   *ptr = value;
-  MemoryBarrierInternal();
+  MemoryBarrier();
 }
 
 inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
@@ -262,7 +262,7 @@
 }
 
 inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
diff --git a/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc b/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
index 74a1bd4..741b164 100644
--- a/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
+++ b/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
@@ -44,10 +44,9 @@
 namespace protobuf {
 namespace internal {
 
-inline void MemoryBarrierInternal() {
-  // On ARM this is a define while on x86/x64 this is
-  // a function declared in WinNT.h
-  MemoryBarrier();
+inline void MemoryBarrier() {
+  // We use MemoryBarrier from WinNT.h
+  ::MemoryBarrier();
 }
 
 Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
diff --git a/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h b/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h
index 34d60d9..e53a641 100644
--- a/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h
+++ b/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h
@@ -82,7 +82,7 @@
 }
 
 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
@@ -125,7 +125,7 @@
 }
 
 inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
-  MemoryBarrierInternal();
+  MemoryBarrier();
   return *ptr;
 }
 
diff --git a/src/google/protobuf/stubs/bytestream.h b/src/google/protobuf/stubs/bytestream.h
index 86510d1..de8e020 100644
--- a/src/google/protobuf/stubs/bytestream.h
+++ b/src/google/protobuf/stubs/bytestream.h
@@ -64,7 +64,7 @@
 namespace strings {
 
 // An abstract interface for an object that consumes a sequence of bytes. This
-// interface offers a way to append data as well as a Flush() function.
+// interface offers 3 different ways to append data, and a Flush() function.
 //
 // Example:
 //
@@ -208,7 +208,7 @@
 };
 
 // Implementation of ByteSink that allocates an internal buffer (a char array)
-// and expands it as needed to accommodate appended data (similar to a string),
+// and expands it as needed to accomodate appended data (similar to a string),
 // and allows the caller to take ownership of the internal buffer via the
 // GetBuffer() method. The buffer returned from GetBuffer() must be deleted by
 // the caller with delete[]. GetBuffer() also sets the internal buffer to be
diff --git a/src/google/protobuf/stubs/callback.h b/src/google/protobuf/stubs/callback.h
index 9ec0497..87271c5 100644
--- a/src/google/protobuf/stubs/callback.h
+++ b/src/google/protobuf/stubs/callback.h
@@ -346,29 +346,6 @@
   typedef const base_type& type;
 };
 
-template<typename R, typename T>
-class MethodResultCallback_0_0 : public ResultCallback<R> {
- public:
-  typedef R (T::*MethodType)();
-  MethodResultCallback_0_0(T* object, MethodType method, bool self_deleting)
-      : object_(object),
-        method_(method),
-        self_deleting_(self_deleting) {}
-  ~MethodResultCallback_0_0() {}
-
-  R Run() {
-    bool needs_delete = self_deleting_;
-    R result = (object_->*method_)();
-    if (needs_delete) delete this;
-    return result;
-  }
-
- private:
-  T* object_;
-  MethodType method_;
-  bool self_deleting_;
-};
-
 template <typename R, typename T, typename P1, typename P2, typename P3,
           typename P4, typename P5, typename A1, typename A2>
 class MethodResultCallback_5_2 : public ResultCallback2<R, A1, A2> {
@@ -404,8 +381,6 @@
   typename remove_reference<P5>::type p5_;
 };
 
-}  // namespace internal
-
 // See Closure.
 inline Closure* NewCallback(void (*function)()) {
   return new internal::FunctionClosure0(function, true);
@@ -543,13 +518,6 @@
       function, false, p1);
 }
 
-// See MethodResultCallback_0_0
-template <typename R, typename T1, typename T2>
-inline ResultCallback<R>* NewPermanentCallback(
-    T1* object, R (T2::*function)()) {
-  return new internal::MethodResultCallback_0_0<R, T1>(object, function, false);
-}
-
 // See MethodResultCallback_5_2
 template <typename R, typename T, typename P1, typename P2, typename P3,
           typename P4, typename P5, typename A1, typename A2>
@@ -565,6 +533,8 @@
                                                     p2, p3, p4, p5);
 }
 
+}  // namespace internal
+
 // A function which does nothing.  Useful for creating no-op callbacks, e.g.:
 //   Closure* nothing = NewCallback(&DoNothing);
 void LIBPROTOBUF_EXPORT DoNothing();
diff --git a/src/google/protobuf/stubs/common.cc b/src/google/protobuf/stubs/common.cc
old mode 100755
new mode 100644
index aa5b36c..3a33b55
--- a/src/google/protobuf/stubs/common.cc
+++ b/src/google/protobuf/stubs/common.cc
@@ -30,7 +30,6 @@
 
 // Author: kenton@google.com (Kenton Varda)
 
-#include <google/protobuf/message_lite.h>  // TODO(gerbens) ideally remove this.
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/once.h>
 #include <google/protobuf/stubs/status.h>
@@ -54,8 +53,10 @@
 #error "No suitable threading library available."
 #endif
 #if defined(__ANDROID__)
+#ifdef GOOGLE_PROTOBUF_MIN_LOG_LEVEL
 #include <android/log.h>
 #endif
+#endif
 
 namespace google {
 namespace protobuf {
@@ -111,17 +112,11 @@
 // ===================================================================
 // emulates google3/base/logging.cc
 
-// If the minimum logging level is not set, we default to logging messages for
-// all levels.
-#ifndef GOOGLE_PROTOBUF_MIN_LOG_LEVEL
-#define GOOGLE_PROTOBUF_MIN_LOG_LEVEL LOGLEVEL_INFO
-#endif
-
 namespace internal {
-
 #if defined(__ANDROID__)
 inline void DefaultLogHandler(LogLevel level, const char* filename, int line,
                               const string& message) {
+#ifdef GOOGLE_PROTOBUF_MIN_LOG_LEVEL
   if (level < GOOGLE_PROTOBUF_MIN_LOG_LEVEL) {
     return;
   }
@@ -152,14 +147,11 @@
     __android_log_write(ANDROID_LOG_FATAL, "libprotobuf-native",
                         "terminating.\n");
   }
+#endif
 }
-
 #else
 void DefaultLogHandler(LogLevel level, const char* filename, int line,
                        const string& message) {
-  if (level < GOOGLE_PROTOBUF_MIN_LOG_LEVEL) {
-    return;
-  }
   static const char* level_names[] = { "INFO", "WARNING", "ERROR", "FATAL" };
 
   // We use fprintf() instead of cerr because we want this to work at static
@@ -419,30 +411,13 @@
 namespace internal {
 
 typedef void OnShutdownFunc();
-struct ShutdownData {
-  ~ShutdownData() {
-    for (int i = 0; i < functions.size(); i++) {
-      functions[i]();
-    }
-    for (int i = 0; i < strings.size(); i++) {
-      strings[i]->~string();
-    }
-    for (int i = 0; i < messages.size(); i++) {
-      messages[i]->~MessageLite();
-    }
-  }
-
-  vector<void (*)()> functions;
-  vector<const std::string*> strings;
-  vector<const MessageLite*> messages;
-  Mutex mutex;
-};
-
-ShutdownData* shutdown_data = NULL;
+vector<void (*)()>* shutdown_functions = NULL;
+Mutex* shutdown_functions_mutex = NULL;
 GOOGLE_PROTOBUF_DECLARE_ONCE(shutdown_functions_init);
 
 void InitShutdownFunctions() {
-  shutdown_data = new ShutdownData;
+  shutdown_functions = new vector<void (*)()>;
+  shutdown_functions_mutex = new Mutex;
 }
 
 inline void InitShutdownFunctionsOnce() {
@@ -451,20 +426,8 @@
 
 void OnShutdown(void (*func)()) {
   InitShutdownFunctionsOnce();
-  MutexLock lock(&shutdown_data->mutex);
-  shutdown_data->functions.push_back(func);
-}
-
-void OnShutdownDestroyString(const std::string* ptr) {
-  InitShutdownFunctionsOnce();
-  MutexLock lock(&shutdown_data->mutex);
-  shutdown_data->strings.push_back(ptr);
-}
-
-void OnShutdownDestroyMessage(const void* ptr) {
-  InitShutdownFunctionsOnce();
-  MutexLock lock(&shutdown_data->mutex);
-  shutdown_data->messages.push_back(static_cast<const MessageLite*>(ptr));
+  MutexLock lock(shutdown_functions_mutex);
+  shutdown_functions->push_back(func);
 }
 
 }  // namespace internal
@@ -477,10 +440,15 @@
   // called.
 
   // Make it safe to call this multiple times.
-  if (internal::shutdown_data == NULL) return;
+  if (internal::shutdown_functions == NULL) return;
 
-  delete internal::shutdown_data;
-  internal::shutdown_data = NULL;
+  for (int i = 0; i < internal::shutdown_functions->size(); i++) {
+    internal::shutdown_functions->at(i)();
+  }
+  delete internal::shutdown_functions;
+  internal::shutdown_functions = NULL;
+  delete internal::shutdown_functions_mutex;
+  internal::shutdown_functions_mutex = NULL;
 }
 
 #if PROTOBUF_USE_EXCEPTIONS
diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h
index d11b810..9c05cac 100644
--- a/src/google/protobuf/stubs/common.h
+++ b/src/google/protobuf/stubs/common.h
@@ -35,12 +35,7 @@
 #ifndef GOOGLE_PROTOBUF_COMMON_H__
 #define GOOGLE_PROTOBUF_COMMON_H__
 
-#include <algorithm>
-#include <iostream>
-#include <map>
-#include <set>
 #include <string>
-#include <vector>
 
 #include <google/protobuf/stubs/port.h>
 #include <google/protobuf/stubs/macros.h>
@@ -101,27 +96,24 @@
 
 // The current version, represented as a single integer to make comparison
 // easier:  major * 10^6 + minor * 10^3 + micro
-#define GOOGLE_PROTOBUF_VERSION 3005001
-
-// A suffix string for alpha, beta or rc releases. Empty for stable releases.
-#define GOOGLE_PROTOBUF_VERSION_SUFFIX ""
+#define GOOGLE_PROTOBUF_VERSION 3000000
 
 // The minimum library version which works with the current version of the
 // headers.
-#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 3005000
+#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 3000000
 
 // The minimum header version which works with the current version of
 // the library.  This constant should only be used by protoc's C++ code
 // generator.
-static const int kMinHeaderVersionForLibrary = 3005000;
+static const int kMinHeaderVersionForLibrary = 3000000;
 
 // The minimum protoc version which works with the current version of the
 // headers.
-#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 3005000
+#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 3000000
 
 // The minimum header version which works with the current version of
 // protoc.  This constant should only be used in VerifyVersion().
-static const int kMinHeaderVersionForProtoc = 3005000;
+static const int kMinHeaderVersionForProtoc = 3000000;
 
 // Verifies that the headers and libraries are compatible.  Use the macro
 // below to call this.
@@ -200,10 +192,6 @@
 
 // Register a function to be called when ShutdownProtocolBuffers() is called.
 LIBPROTOBUF_EXPORT void OnShutdown(void (*func)());
-// Destroy the string (call string destructor)
-LIBPROTOBUF_EXPORT void OnShutdownDestroyString(const std::string* ptr);
-// Destroy (not delete) the message
-LIBPROTOBUF_EXPORT void OnShutdownDestroyMessage(const void* ptr);
 
 }  // namespace internal
 
@@ -229,12 +217,7 @@
 
 // This is at the end of the file instead of the beginning to work around a bug
 // in some versions of MSVC.
-// TODO(acozzette): remove these using statements
-using std::istream;
-using std::ostream;
-using std::pair;
-using std::string;
-using std::vector;
+using namespace std;  // Don't do this at home, kids.
 
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/stubs/common_unittest.cc b/src/google/protobuf/stubs/common_unittest.cc
index f9e2cfd..25bae9b 100644
--- a/src/google/protobuf/stubs/common_unittest.cc
+++ b/src/google/protobuf/stubs/common_unittest.cc
@@ -41,6 +41,8 @@
 
 namespace google {
 namespace protobuf {
+using internal::NewCallback;
+using internal::NewPermanentCallback;
 namespace {
 
 // TODO(kenton):  More tests.
diff --git a/src/google/protobuf/stubs/fastmem.h b/src/google/protobuf/stubs/fastmem.h
index 1f1f6ed..763a6e6 100644
--- a/src/google/protobuf/stubs/fastmem.h
+++ b/src/google/protobuf/stubs/fastmem.h
@@ -111,8 +111,7 @@
     b += sizeof(uint32);
   }
   while (a < a_limit) {
-    int d =
-        static_cast<int>(static_cast<uint32>(*a++) - static_cast<uint32>(*b++));
+    int d = static_cast<uint32>(*a++) - static_cast<uint32>(*b++);
     if (d) return d;
   }
   return 0;
diff --git a/src/google/protobuf/stubs/hash.h b/src/google/protobuf/stubs/hash.h
index 218cd94..4eac7d5 100644
--- a/src/google/protobuf/stubs/hash.h
+++ b/src/google/protobuf/stubs/hash.h
@@ -41,10 +41,15 @@
 #define GOOGLE_PROTOBUF_HAVE_HASH_MAP 1
 #define GOOGLE_PROTOBUF_HAVE_HASH_SET 1
 
+// Android
+#if defined(__ANDROID__)
+# undef GOOGLE_PROTOBUF_HAVE_HASH_MAP
+# undef GOOGLE_PROTOBUF_HAVE_HASH_MAP
+
 // Use C++11 unordered_{map|set} if available.
-#if ((defined(_LIBCPP_STD_VER) && _LIBCPP_STD_VER >= 11) || \
-    (((__cplusplus >= 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X)) && \
-    (__GLIBCXX__ > 20090421)))
+#elif ((_LIBCPP_STD_VER >= 11) || \
+      (((__cplusplus >= 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X)) && \
+      (__GLIBCXX__ > 20090421)))
 # define GOOGLE_PROTOBUF_HAS_CXX11_HASH
 
 // For XCode >= 4.6:  the compiler is clang with libc++.
@@ -92,13 +97,6 @@
 #  define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set
 # endif
 
-// GCC <= 4.1 does not define std::tr1::hash for `long long int` or `long long unsigned int`
-# if __GNUC__ == 4 && defined(__GNUC__MINOR__) && __GNUC__MINOR__ <= 1
-#  undef GOOGLE_PROTOBUF_HAS_TR1
-#  undef GOOGLE_PROTOBUF_HAVE_HASH_MAP
-#  undef GOOGLE_PROTOBUF_HAVE_HASH_SET
-# endif
-
 // Version checks for MSC.
 // Apparently Microsoft decided to move hash_map *back* to the std namespace in
 // MSVC 2010:
@@ -350,7 +348,7 @@
   inline size_t operator()(const char* str) const {
     size_t result = 0;
     for (; *str != '\0'; str++) {
-      result = 5 * result + static_cast<size_t>(*str);
+      result = 5 * result + *str;
     }
     return result;
   }
diff --git a/src/google/protobuf/stubs/int128.cc b/src/google/protobuf/stubs/int128.cc
index a509080..3a36b4b 100644
--- a/src/google/protobuf/stubs/int128.cc
+++ b/src/google/protobuf/stubs/int128.cc
@@ -145,15 +145,15 @@
   std::streamsize div_base_log;
   switch (flags & std::ios::basefield) {
     case std::ios::hex:
-      div = static_cast<uint64>(GOOGLE_ULONGLONG(0x1000000000000000));  // 16^15
+      div = GOOGLE_ULONGLONG(0x1000000000000000);  // 16^15
       div_base_log = 15;
       break;
     case std::ios::oct:
-      div = static_cast<uint64>(GOOGLE_ULONGLONG(01000000000000000000000));  // 8^21
+      div = GOOGLE_ULONGLONG(01000000000000000000000);  // 8^21
       div_base_log = 21;
       break;
     default:  // std::ios::dec
-      div = static_cast<uint64>(GOOGLE_ULONGLONG(10000000000000000000));  // 10^19
+      div = GOOGLE_ULONGLONG(10000000000000000000);  // 10^19
       div_base_log = 19;
       break;
   }
diff --git a/src/google/protobuf/stubs/int128_unittest.cc b/src/google/protobuf/stubs/int128_unittest.cc
index 1ec899a..5d33292 100644
--- a/src/google/protobuf/stubs/int128_unittest.cc
+++ b/src/google/protobuf/stubs/int128_unittest.cc
@@ -370,29 +370,29 @@
   EXPECT_EQ(r, result_r);
 
   // Try the other way around.
-  std::swap(q, b);
+  swap(q, b);
   result_q = a / b;
   result_r = a % b;
   EXPECT_EQ(q, result_q);
   EXPECT_EQ(r, result_r);
   // Restore.
-  std::swap(b, q);
+  swap(b, q);
 
   // Dividend < divisor; result should be q:0 r:<dividend>.
-  std::swap(a, b);
+  swap(a, b);
   result_q = a / b;
   result_r = a % b;
   EXPECT_EQ(0, result_q);
   EXPECT_EQ(a, result_r);
   // Try the other way around.
-  std::swap(a, q);
+  swap(a, q);
   result_q = a / b;
   result_r = a % b;
   EXPECT_EQ(0, result_q);
   EXPECT_EQ(a, result_r);
   // Restore.
-  std::swap(q, a);
-  std::swap(b, a);
+  swap(q, a);
+  swap(b, a);
 
   // Try a large remainder.
   b = a / 2 + 1;
@@ -501,7 +501,7 @@
         {uint128(12345), std::ios::dec | std::ios::left, 6, '_', "12345_"},
   };
   for (size_t i = 0; i < GOOGLE_ARRAYSIZE(cases); ++i) {
-    std::ostringstream os;
+    ostringstream os;
     os.flags(cases[i].flags);
     os.width(cases[i].width);
     os.fill(cases[i].fill);
diff --git a/src/google/protobuf/stubs/io_win32.cc b/src/google/protobuf/stubs/io_win32.cc
deleted file mode 100644
index b59b8e4..0000000
--- a/src/google/protobuf/stubs/io_win32.cc
+++ /dev/null
@@ -1,413 +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.
-
-// Author: laszlocsomor@google.com (Laszlo Csomor)
-//
-// Implementation for long-path-aware open/mkdir/access/etc. on Windows, as well
-// as for the supporting utility functions.
-//
-// These functions convert the input path to an absolute Windows path
-// with "\\?\" prefix, then pass that to _wopen/_wmkdir/_waccess/etc.
-// (declared in <io.h>) respectively. This allows working with files/directories
-// whose paths are longer than MAX_PATH (260 chars).
-//
-// This file is only used on Windows, it's empty on other platforms.
-
-#if defined(_WIN32)
-
-// Comment this out to fall back to using the ANSI versions (open, mkdir, ...)
-// instead of the Unicode ones (_wopen, _wmkdir, ...). Doing so can be useful to
-// debug failing tests if that's caused by the long path support.
-#define SUPPORT_LONGPATHS
-
-#include <ctype.h>
-#include <direct.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <io.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <wctype.h>
-#include <windows.h>
-
-#include <google/protobuf/stubs/io_win32.h>
-#include <google/protobuf/stubs/scoped_ptr.h>
-
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-namespace win32 {
-namespace {
-
-using std::string;
-using std::wstring;
-
-template <typename char_type>
-struct CharTraits {
-  static bool is_alpha(char_type ch);
-};
-
-template <>
-struct CharTraits<char> {
-  static bool is_alpha(char ch) { return isalpha(ch); }
-};
-
-template <>
-struct CharTraits<wchar_t> {
-  static bool is_alpha(wchar_t ch) { return iswalpha(ch); }
-};
-
-template <typename char_type>
-bool null_or_empty(const char_type* s) {
-  return s == NULL || *s == 0;
-}
-
-// Returns true if the path starts with a drive letter, e.g. "c:".
-// Note that this won't check for the "\" after the drive letter, so this also
-// returns true for "c:foo" (which is "c:\${PWD}\foo").
-// This check requires that a path not have a longpath prefix ("\\?\").
-template <typename char_type>
-bool has_drive_letter(const char_type* ch) {
-  return CharTraits<char_type>::is_alpha(ch[0]) && ch[1] == ':';
-}
-
-// Returns true if the path starts with a longpath prefix ("\\?\").
-template <typename char_type>
-bool has_longpath_prefix(const char_type* path) {
-  return path[0] == '\\' && path[1] == '\\' && path[2] == '?' &&
-         path[3] == '\\';
-}
-
-template <typename char_type>
-bool is_separator(char_type c) {
-  return c == '/' || c == '\\';
-}
-
-// Returns true if the path starts with a drive specifier (e.g. "c:\").
-template <typename char_type>
-bool is_path_absolute(const char_type* path) {
-  return has_drive_letter(path) && is_separator(path[2]);
-}
-
-template <typename char_type>
-bool is_drive_relative(const char_type* path) {
-  return has_drive_letter(path) && (path[2] == 0 || !is_separator(path[2]));
-}
-
-wstring join_paths(const wstring& path1, const wstring& path2) {
-  if (path1.empty() || is_path_absolute(path2.c_str()) ||
-      has_longpath_prefix(path2.c_str())) {
-    return path2;
-  }
-  if (path2.empty()) {
-    return path1;
-  }
-
-  if (is_separator(path1[path1.size() - 1])) {
-    return is_separator(path2[0]) ? (path1 + path2.substr(1))
-                                       : (path1 + path2);
-  } else {
-    return is_separator(path2[0]) ? (path1 + path2)
-                                       : (path1 + L'\\' + path2);
-  }
-}
-
-wstring normalize(wstring path) {
-  if (has_longpath_prefix(path.c_str())) {
-    path = path.substr(4);
-  }
-
-  static const wstring dot(L".");
-  static const wstring dotdot(L"..");
-
-  std::vector<wstring> segments;
-  int segment_start = -1;
-  // Find the path segments in `path` (separated by "/").
-  for (int i = 0;; ++i) {
-    if (!is_separator(path[i]) && path[i] != L'\0') {
-      // The current character does not end a segment, so start one unless it's
-      // already started.
-      if (segment_start < 0) {
-        segment_start = i;
-      }
-    } else if (segment_start >= 0 && i > segment_start) {
-      // The current character is "/" or "\0", so this ends a segment.
-      // Add that to `segments` if there's anything to add; handle "." and "..".
-      wstring segment(path, segment_start, i - segment_start);
-      segment_start = -1;
-      if (segment == dotdot) {
-        if (!segments.empty() &&
-            (!has_drive_letter(segments[0].c_str()) || segments.size() > 1)) {
-          segments.pop_back();
-        }
-      } else if (segment != dot && !segment.empty()) {
-        segments.push_back(segment);
-      }
-    }
-    if (path[i] == L'\0') {
-      break;
-    }
-  }
-
-  // Handle the case when `path` is just a drive specifier (or some degenerate
-  // form of it, e.g. "c:\..").
-  if (segments.size() == 1 && segments[0].size() == 2 &&
-      has_drive_letter(segments[0].c_str())) {
-    return segments[0] + L'\\';
-  }
-
-  // Join all segments.
-  bool first = true;
-  std::wstringstream result;
-  for (int i = 0; i < segments.size(); ++i) {
-    if (!first) {
-      result << L'\\';
-    }
-    first = false;
-    result << segments[i];
-  }
-  // Preserve trailing separator if the input contained it.
-  if (!path.empty() && is_separator(path[path.size() - 1])) {
-    result << L'\\';
-  }
-  return result.str();
-}
-
-bool as_windows_path(const char* path, wstring* result) {
-  if (null_or_empty(path)) {
-    result->clear();
-    return true;
-  }
-  wstring wpath;
-  if (!strings::utf8_to_wcs(path, &wpath)) {
-    return false;
-  }
-  if (has_longpath_prefix(wpath.c_str())) {
-    *result = wpath;
-    return true;
-  }
-  if (is_separator(path[0]) || is_drive_relative(path)) {
-    return false;
-  }
-
-
-  if (!is_path_absolute(wpath.c_str())) {
-    int size = ::GetCurrentDirectoryW(0, NULL);
-    if (size == 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-      return false;
-    }
-    scoped_array<WCHAR> wcwd(new WCHAR[size]);
-    ::GetCurrentDirectoryW(size, wcwd.get());
-    wpath = join_paths(wcwd.get(), wpath);
-  }
-  wpath = normalize(wpath);
-  if (!has_longpath_prefix(wpath.c_str())) {
-    // Add the "\\?\" prefix unconditionally. This way we prevent the Win32 API
-    // from processing the path and "helpfully" removing trailing dots from the
-    // path, for example.
-    // See https://github.com/bazelbuild/bazel/issues/2935
-    wpath = wstring(L"\\\\?\\") + wpath;
-  }
-  *result = wpath;
-  return true;
-}
-
-}  // namespace
-
-int open(const char* path, int flags, int mode) {
-#ifdef SUPPORT_LONGPATHS
-  wstring wpath;
-  if (!as_windows_path(path, &wpath)) {
-    errno = ENOENT;
-    return -1;
-  }
-  return ::_wopen(wpath.c_str(), flags, mode);
-#else
-  return ::_open(path, flags, mode);
-#endif
-}
-
-int mkdir(const char* path, int _mode) {
-#ifdef SUPPORT_LONGPATHS
-  wstring wpath;
-  if (!as_windows_path(path, &wpath)) {
-    errno = ENOENT;
-    return -1;
-  }
-  return ::_wmkdir(wpath.c_str());
-#else   // not SUPPORT_LONGPATHS
-  return ::_mkdir(path);
-#endif  // not SUPPORT_LONGPATHS
-}
-
-int access(const char* path, int mode) {
-#ifdef SUPPORT_LONGPATHS
-  wstring wpath;
-  if (!as_windows_path(path, &wpath)) {
-    errno = ENOENT;
-    return -1;
-  }
-  return ::_waccess(wpath.c_str(), mode);
-#else
-  return ::_access(path, mode);
-#endif
-}
-
-int chdir(const char* path) {
-#ifdef SUPPORT_LONGPATHS
-  wstring wpath;
-  if (!as_windows_path(path, &wpath)) {
-    errno = ENOENT;
-    return -1;
-  }
-  return ::_wchdir(wpath.c_str());
-#else
-  return ::_chdir(path);
-#endif
-}
-
-int stat(const char* path, struct _stat* buffer) {
-#ifdef SUPPORT_LONGPATHS
-  wstring wpath;
-  if (!as_windows_path(path, &wpath)) {
-    errno = ENOENT;
-    return -1;
-  }
-  return ::_wstat(wpath.c_str(), buffer);
-#else   // not SUPPORT_LONGPATHS
-  return ::_stat(path, buffer);
-#endif  // not SUPPORT_LONGPATHS
-}
-
-FILE* fopen(const char* path, const char* mode) {
-#ifdef SUPPORT_LONGPATHS
-  if (null_or_empty(path)) {
-    errno = EINVAL;
-    return NULL;
-  }
-  wstring wpath;
-  if (!as_windows_path(path, &wpath)) {
-    errno = ENOENT;
-    return NULL;
-  }
-  wstring wmode;
-  if (!strings::utf8_to_wcs(mode, &wmode)) {
-    errno = EINVAL;
-    return NULL;
-  }
-  return ::_wfopen(wpath.c_str(), wmode.c_str());
-#else
-  return ::fopen(path, mode);
-#endif
-}
-
-int close(int fd) { return ::close(fd); }
-
-int dup(int fd) { return ::_dup(fd); }
-
-int dup2(int fd1, int fd2) { return ::_dup2(fd1, fd2); }
-
-int read(int fd, void* buffer, size_t size) {
-  return ::_read(fd, buffer, size);
-}
-
-int setmode(int fd, int mode) { return ::_setmode(fd, mode); }
-
-int write(int fd, const void* buffer, size_t size) {
-  return ::_write(fd, buffer, size);
-}
-
-wstring testonly_utf8_to_winpath(const char* path) {
-  wstring wpath;
-  return as_windows_path(path, &wpath) ? wpath : wstring();
-}
-
-namespace strings {
-
-bool wcs_to_mbs(const WCHAR* s, string* out, bool outUtf8) {
-  if (null_or_empty(s)) {
-    out->clear();
-    return true;
-  }
-  BOOL usedDefaultChar = FALSE;
-  SetLastError(0);
-  int size = WideCharToMultiByte(
-      outUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, NULL, 0, NULL,
-      outUtf8 ? NULL : &usedDefaultChar);
-  if ((size == 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-      || usedDefaultChar) {
-    return false;
-  }
-  scoped_array<CHAR> astr(new CHAR[size]);
-  WideCharToMultiByte(
-      outUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, astr.get(), size, NULL, NULL);
-  out->assign(astr.get());
-  return true;
-}
-
-bool mbs_to_wcs(const char* s, wstring* out, bool inUtf8) {
-  if (null_or_empty(s)) {
-    out->clear();
-    return true;
-  }
-
-  SetLastError(0);
-  int size =
-      MultiByteToWideChar(inUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, NULL, 0);
-  if (size == 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-    return false;
-  }
-  scoped_array<WCHAR> wstr(new WCHAR[size]);
-  MultiByteToWideChar(
-      inUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, wstr.get(), size + 1);
-  out->assign(wstr.get());
-  return true;
-}
-
-bool utf8_to_wcs(const char* input, wstring* out) {
-  return mbs_to_wcs(input, out, true);
-}
-
-bool wcs_to_utf8(const wchar_t* input, string* out) {
-  return wcs_to_mbs(input, out, true);
-}
-
-}  // namespace strings
-}  // namespace win32
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
-
-#endif  // defined(_WIN32)
diff --git a/src/google/protobuf/stubs/io_win32.h b/src/google/protobuf/stubs/io_win32.h
deleted file mode 100644
index 9e17d25..0000000
--- a/src/google/protobuf/stubs/io_win32.h
+++ /dev/null
@@ -1,115 +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.
-
-// Author: laszlocsomor@google.com (Laszlo Csomor)
-//
-// 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.}.
-// 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__
-
-#if defined(_WIN32)
-
-#include <string>
-#include <google/protobuf/stubs/port.h>
-
-// Compilers on Windows other than MSVC (e.g. Cygwin, MinGW32) define the
-// following functions already, except for mkdir.
-namespace google {
-namespace protobuf {
-namespace internal {
-namespace win32 {
-
-LIBPROTOBUF_EXPORT FILE* fopen(const char* path, const char* mode);
-LIBPROTOBUF_EXPORT int access(const char* path, int mode);
-LIBPROTOBUF_EXPORT int chdir(const char* path);
-LIBPROTOBUF_EXPORT int close(int fd);
-LIBPROTOBUF_EXPORT int dup(int fd);
-LIBPROTOBUF_EXPORT int dup2(int fd1, int fd2);
-LIBPROTOBUF_EXPORT int mkdir(const char* path, int _mode);
-LIBPROTOBUF_EXPORT int open(const char* path, int flags, int mode = 0);
-LIBPROTOBUF_EXPORT int read(int fd, void* buffer, size_t size);
-LIBPROTOBUF_EXPORT int setmode(int fd, int mode);
-LIBPROTOBUF_EXPORT int stat(const char* path, struct _stat* buffer);
-LIBPROTOBUF_EXPORT int write(int fd, const void* buffer, size_t size);
-LIBPROTOBUF_EXPORT std::wstring testonly_utf8_to_winpath(const char* path);
-
-namespace strings {
-
-// Convert from UTF-16 to Active-Code-Page-encoded or to UTF-8-encoded text.
-LIBPROTOBUF_EXPORT bool wcs_to_mbs(
-    const wchar_t* s, std::string* out, bool outUtf8);
-
-// Convert from Active-Code-Page-encoded or UTF-8-encoded text to UTF-16.
-LIBPROTOBUF_EXPORT bool mbs_to_wcs(
-    const char* s, std::wstring* out, bool inUtf8);
-
-// Convert from UTF-8-encoded text to UTF-16.
-LIBPROTOBUF_EXPORT bool utf8_to_wcs(const char* input, std::wstring* out);
-
-// Convert from UTF-16-encoded text to UTF-8.
-LIBPROTOBUF_EXPORT bool wcs_to_utf8(const wchar_t* input, std::string* out);
-
-}  // namespace strings
-
-}  // namespace win32
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
-
-#ifndef W_OK
-#define W_OK 02  // not defined by MSVC for whatever reason
-#endif
-
-#ifndef F_OK
-#define F_OK 00  // not defined by MSVC for whatever reason
-#endif
-
-#ifndef STDIN_FILENO
-#define STDIN_FILENO 0
-#endif
-
-#ifndef STDOUT_FILENO
-#define STDOUT_FILENO 1
-#endif
-
-#endif  // defined(_WIN32)
-
-#endif  // GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__
diff --git a/src/google/protobuf/stubs/io_win32_unittest.cc b/src/google/protobuf/stubs/io_win32_unittest.cc
deleted file mode 100644
index b216aec..0000000
--- a/src/google/protobuf/stubs/io_win32_unittest.cc
+++ /dev/null
@@ -1,453 +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.
-
-// Author: laszlocsomor@google.com (Laszlo Csomor)
-//
-// Unit tests for long-path-aware open/mkdir/access/etc. on Windows, as well as
-// for the supporting utility functions.
-//
-// This file is only used on Windows, it's empty on other platforms.
-
-#if defined(_WIN32)
-
-#define WIN32_LEAN_AND_MEAN
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <wchar.h>
-#include <windows.h>
-
-#include <google/protobuf/stubs/io_win32.h>
-#include <google/protobuf/stubs/scoped_ptr.h>
-#include <gtest/gtest.h>
-
-#include <memory>
-#include <sstream>
-#include <string>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-namespace win32 {
-namespace {
-
-const char kUtf8Text[] = {
-    'h', 'i', ' ',
-    // utf-8: 11010000 10011111, utf-16: 100 0001 1111 = 0x041F
-    0xd0, 0x9f,
-    // utf-8: 11010001 10000000, utf-16: 100 0100 0000 = 0x0440
-    0xd1, 0x80,
-    // utf-8: 11010000 10111000, utf-16: 100 0011 1000 = 0x0438
-    0xd0, 0xb8,
-    // utf-8: 11010000 10110010, utf-16: 100 0011 0010 = 0x0432
-    0xd0, 0xb2,
-    // utf-8: 11010000 10110101, utf-16: 100 0011 0101 = 0x0435
-    0xd0, 0xb5,
-    // utf-8: 11010001 10000010, utf-16: 100 0100 0010 = 0x0442
-    0xd1, 0x82, 0
-};
-
-const wchar_t kUtf16Text[] = {
-  L'h', L'i', L' ',
-  L'\x41f', L'\x440', L'\x438', L'\x432', L'\x435', L'\x442', 0
-};
-
-using std::string;
-using std::wstring;
-
-class IoWin32Test : public ::testing::Test {
- public:
-  void SetUp();
-  void TearDown();
-
- protected:
-  bool CreateAllUnder(wstring path);
-  bool DeleteAllUnder(wstring path);
-
-  WCHAR working_directory[MAX_PATH];
-  string test_tmpdir;
-  wstring wtest_tmpdir;
-};
-
-#define ASSERT_INITIALIZED              \
-  {                                     \
-    EXPECT_FALSE(test_tmpdir.empty());  \
-    EXPECT_FALSE(wtest_tmpdir.empty()); \
-  }
-
-namespace {
-void StripTrailingSlashes(string* str) {
-  int i = str->size() - 1;
-  for (; i >= 0 && ((*str)[i] == '/' || (*str)[i] == '\\'); --i) {}
-  str->resize(i+1);
-}
-
-bool GetEnvVarAsUtf8(const WCHAR* name, string* result) {
-  DWORD size = ::GetEnvironmentVariableW(name, NULL, 0);
-  if (size > 0 && GetLastError() != ERROR_ENVVAR_NOT_FOUND) {
-    scoped_array<WCHAR> wcs(new WCHAR[size]);
-    ::GetEnvironmentVariableW(name, wcs.get(), size);
-    // GetEnvironmentVariableA retrieves an Active-Code-Page-encoded text which
-    // we'd first need to convert to UTF-16 then to UTF-8, because there seems
-    // to be no API function to do that conversion directly.
-    // GetEnvironmentVariableW retrieves an UTF-16-encoded text, which we need
-    // to convert to UTF-8.
-    return strings::wcs_to_utf8(wcs.get(), result);
-  } else {
-    return false;
-  }
-}
-
-bool GetCwdAsUtf8(string* result) {
-  DWORD size = ::GetCurrentDirectoryW(0, NULL);
-  if (size > 0) {
-    scoped_array<WCHAR> wcs(new WCHAR[size]);
-    ::GetCurrentDirectoryW(size, wcs.get());
-    // GetCurrentDirectoryA retrieves an Active-Code-Page-encoded text which
-    // we'd first need to convert to UTF-16 then to UTF-8, because there seems
-    // to be no API function to do that conversion directly.
-    // GetCurrentDirectoryW retrieves an UTF-16-encoded text, which we need
-    // to convert to UTF-8.
-    return strings::wcs_to_utf8(wcs.get(), result);
-  } else {
-    return false;
-  }
-}
-
-}  // namespace
-
-void IoWin32Test::SetUp() {
-  test_tmpdir.clear();
-  wtest_tmpdir.clear();
-  EXPECT_GT(::GetCurrentDirectoryW(MAX_PATH, working_directory), 0);
-
-  string tmp;
-  bool ok = false;
-  if (!ok) {
-    // Bazel sets this environment variable when it runs tests.
-    ok = GetEnvVarAsUtf8(L"TEST_TMPDIR", &tmp);
-  }
-  if (!ok) {
-    // Bazel 0.8.0 sets this environment for every build and test action.
-    ok = GetEnvVarAsUtf8(L"TEMP", &tmp);
-  }
-  if (!ok) {
-    // Bazel 0.8.0 sets this environment for every build and test action.
-    ok = GetEnvVarAsUtf8(L"TMP", &tmp);
-  }
-  if (!ok) {
-    // Fall back to using the current directory.
-    ok = GetCwdAsUtf8(&tmp);
-  }
-  if (!ok || tmp.empty()) {
-    FAIL() << "Cannot find a temp directory.";
-  }
-
-  StripTrailingSlashes(&tmp);
-  std::stringstream result;
-  // Deleting files and directories is asynchronous on Windows, and if TearDown
-  // just deleted the previous temp directory, sometimes we cannot recreate the
-  // same directory.
-  // Use a counter so every test method gets its own temp directory.
-  static unsigned int counter = 0;
-  result << tmp << "\\w32tst" << counter++ << ".tmp";
-  test_tmpdir = result.str();
-  wtest_tmpdir = testonly_utf8_to_winpath(test_tmpdir.c_str());
-  ASSERT_FALSE(wtest_tmpdir.empty());
-  ASSERT_TRUE(DeleteAllUnder(wtest_tmpdir));
-  ASSERT_TRUE(CreateAllUnder(wtest_tmpdir));
-}
-
-void IoWin32Test::TearDown() {
-  if (!wtest_tmpdir.empty()) {
-    DeleteAllUnder(wtest_tmpdir);
-  }
-  ::SetCurrentDirectoryW(working_directory);
-}
-
-bool IoWin32Test::CreateAllUnder(wstring path) {
-  // Prepend UNC prefix if the path doesn't have it already. Don't bother
-  // checking if the path is shorter than MAX_PATH, let's just do it
-  // unconditionally.
-  if (path.find(L"\\\\?\\") != 0) {
-    path = wstring(L"\\\\?\\") + path;
-  }
-  if (::CreateDirectoryW(path.c_str(), NULL) ||
-      GetLastError() == ERROR_ALREADY_EXISTS ||
-      GetLastError() == ERROR_ACCESS_DENIED) {
-    return true;
-  }
-  if (GetLastError() == ERROR_PATH_NOT_FOUND) {
-    size_t pos = path.find_last_of(L'\\');
-    if (pos != wstring::npos) {
-      wstring parent(path, 0, pos);
-      if (CreateAllUnder(parent) && CreateDirectoryW(path.c_str(), NULL)) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-bool IoWin32Test::DeleteAllUnder(wstring path) {
-  static const wstring kDot(L".");
-  static const wstring kDotDot(L"..");
-
-  // Prepend UNC prefix if the path doesn't have it already. Don't bother
-  // checking if the path is shorter than MAX_PATH, let's just do it
-  // unconditionally.
-  if (path.find(L"\\\\?\\") != 0) {
-    path = wstring(L"\\\\?\\") + path;
-  }
-  // Append "\" if necessary.
-  if (path[path.size() - 1] != L'\\') {
-    path.push_back(L'\\');
-  }
-
-  WIN32_FIND_DATAW metadata;
-  HANDLE handle = ::FindFirstFileW((path + L"*").c_str(), &metadata);
-  if (handle == INVALID_HANDLE_VALUE) {
-    return true;  // directory doesn't exist
-  }
-
-  bool result = true;
-  do {
-    wstring childname = metadata.cFileName;
-    if (kDot != childname && kDotDot != childname) {
-      wstring childpath = path + childname;
-      if ((metadata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
-        // If this is not a junction, delete its contents recursively.
-        // Finally delete this directory/junction too.
-        if (((metadata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) == 0 &&
-             !DeleteAllUnder(childpath)) ||
-            !::RemoveDirectoryW(childpath.c_str())) {
-          result = false;
-          break;
-        }
-      } else {
-        if (!::DeleteFileW(childpath.c_str())) {
-          result = false;
-          break;
-        }
-      }
-    }
-  } while (::FindNextFileW(handle, &metadata));
-  ::FindClose(handle);
-  return result;
-}
-
-TEST_F(IoWin32Test, AccessTest) {
-  ASSERT_INITIALIZED;
-
-  string path = test_tmpdir;
-  while (path.size() < MAX_PATH - 30) {
-    path += "\\accesstest";
-    EXPECT_EQ(mkdir(path.c_str(), 0644), 0);
-  }
-  string file = path + "\\file.txt";
-  int fd = open(file.c_str(), O_CREAT | O_WRONLY, 0644);
-  if (fd > 0) {
-    EXPECT_EQ(close(fd), 0);
-  } else {
-    EXPECT_TRUE(false);
-  }
-
-  EXPECT_EQ(access(test_tmpdir.c_str(), F_OK), 0);
-  EXPECT_EQ(access(path.c_str(), F_OK), 0);
-  EXPECT_EQ(access(path.c_str(), W_OK), 0);
-  EXPECT_EQ(access(file.c_str(), F_OK | W_OK), 0);
-  EXPECT_NE(access((file + ".blah").c_str(), F_OK), 0);
-  EXPECT_NE(access((file + ".blah").c_str(), W_OK), 0);
-
-  EXPECT_EQ(access(".", F_OK), 0);
-  EXPECT_EQ(access(".", W_OK), 0);
-  EXPECT_EQ(access((test_tmpdir + "/accesstest").c_str(), F_OK | W_OK), 0);
-  ASSERT_EQ(access((test_tmpdir + "/./normalize_me/.././accesstest").c_str(),
-                   F_OK | W_OK),
-            0);
-  EXPECT_NE(access("io_win32_unittest.AccessTest.nonexistent", F_OK), 0);
-  EXPECT_NE(access("io_win32_unittest.AccessTest.nonexistent", W_OK), 0);
-
-  ASSERT_EQ(access("c:bad", F_OK), -1);
-  ASSERT_EQ(errno, ENOENT);
-  ASSERT_EQ(access("/tmp/bad", F_OK), -1);
-  ASSERT_EQ(errno, ENOENT);
-  ASSERT_EQ(access("\\bad", F_OK), -1);
-  ASSERT_EQ(errno, ENOENT);
-}
-
-TEST_F(IoWin32Test, OpenTest) {
-  ASSERT_INITIALIZED;
-
-  string path = test_tmpdir;
-  while (path.size() < MAX_PATH) {
-    path += "\\opentest";
-    EXPECT_EQ(mkdir(path.c_str(), 0644), 0);
-  }
-  string file = path + "\\file.txt";
-  int fd = open(file.c_str(), O_CREAT | O_WRONLY, 0644);
-  if (fd > 0) {
-    EXPECT_EQ(write(fd, "hello", 5), 5);
-    EXPECT_EQ(close(fd), 0);
-  } else {
-    EXPECT_TRUE(false);
-  }
-
-  ASSERT_EQ(open("c:bad.txt", O_CREAT | O_WRONLY, 0644), -1);
-  ASSERT_EQ(errno, ENOENT);
-  ASSERT_EQ(open("/tmp/bad.txt", O_CREAT | O_WRONLY, 0644), -1);
-  ASSERT_EQ(errno, ENOENT);
-  ASSERT_EQ(open("\\bad.txt", O_CREAT | O_WRONLY, 0644), -1);
-  ASSERT_EQ(errno, ENOENT);
-}
-
-TEST_F(IoWin32Test, MkdirTest) {
-  ASSERT_INITIALIZED;
-
-  string path = test_tmpdir;
-  do {
-    path += "\\mkdirtest";
-    ASSERT_EQ(mkdir(path.c_str(), 0644), 0);
-  } while (path.size() <= MAX_PATH);
-
-  ASSERT_EQ(mkdir("c:bad", 0644), -1);
-  ASSERT_EQ(errno, ENOENT);
-  ASSERT_EQ(mkdir("/tmp/bad", 0644), -1);
-  ASSERT_EQ(errno, ENOENT);
-  ASSERT_EQ(mkdir("\\bad", 0644), -1);
-  ASSERT_EQ(errno, ENOENT);
-}
-
-TEST_F(IoWin32Test, MkdirTestNonAscii) {
-  ASSERT_INITIALIZED;
-
-  // Create a non-ASCII path.
-  // Ensure that we can create the directory using SetCurrentDirectoryW.
-  EXPECT_TRUE(CreateDirectoryW((wtest_tmpdir + L"\\1").c_str(), NULL));
-  EXPECT_TRUE(CreateDirectoryW((wtest_tmpdir + L"\\1\\" + kUtf16Text).c_str(), NULL));
-  // Ensure that we can create a very similarly named directory using mkdir.
-  // We don't attemp to delete and recreate the same directory, because on
-  // Windows, deleting files and directories seems to be asynchronous.
-  EXPECT_EQ(mkdir((test_tmpdir + "\\2").c_str(), 0644), 0);
-  EXPECT_EQ(mkdir((test_tmpdir + "\\2\\" + kUtf8Text).c_str(), 0644), 0);
-}
-
-TEST_F(IoWin32Test, ChdirTest) {
-  string path("C:\\");
-  EXPECT_EQ(access(path.c_str(), F_OK), 0);
-  ASSERT_EQ(chdir(path.c_str()), 0);
-
-  // Do not try to chdir into the test_tmpdir, it may already contain directory
-  // names with trailing dots.
-  // Instead test here with an obviously dot-trailed path. If the win32_chdir
-  // function would not convert the path to absolute and prefix with "\\?\" then
-  // the Win32 API would ignore the trailing dot, but because of the prefixing
-  // there'll be no path processing done, so we'll actually attempt to chdir
-  // into "C:\some\path\foo."
-  path = test_tmpdir + "/foo.";
-  EXPECT_EQ(mkdir(path.c_str(), 644), 0);
-  EXPECT_EQ(access(path.c_str(), F_OK), 0);
-  ASSERT_NE(chdir(path.c_str()), 0);
-}
-
-TEST_F(IoWin32Test, ChdirTestNonAscii) {
-  ASSERT_INITIALIZED;
-
-  // Create a directory with a non-ASCII path and ensure we can cd into it.
-  wstring wNonAscii(wtest_tmpdir + L"\\" + kUtf16Text);
-  string nonAscii;
-  EXPECT_TRUE(strings::wcs_to_utf8(wNonAscii.c_str(), &nonAscii));
-  EXPECT_TRUE(CreateDirectoryW(wNonAscii.c_str(), NULL));
-  WCHAR cwd[MAX_PATH];
-  EXPECT_TRUE(GetCurrentDirectoryW(MAX_PATH, cwd));
-  // Ensure that we can cd into the path using SetCurrentDirectoryW.
-  EXPECT_TRUE(SetCurrentDirectoryW(wNonAscii.c_str()));
-  EXPECT_TRUE(SetCurrentDirectoryW(cwd));
-  // Ensure that we can cd into the path using chdir.
-  ASSERT_EQ(chdir(nonAscii.c_str()), 0);
-  // Ensure that the GetCurrentDirectoryW returns the desired path.
-  EXPECT_TRUE(GetCurrentDirectoryW(MAX_PATH, cwd));
-  ASSERT_EQ(wNonAscii, cwd);
-}
-
-TEST_F(IoWin32Test, AsWindowsPathTest) {
-  DWORD size = GetCurrentDirectoryW(0, NULL);
-  scoped_array<wchar_t> cwd_str(new wchar_t[size]);
-  EXPECT_GT(GetCurrentDirectoryW(size, cwd_str.get()), 0);
-  wstring cwd = wstring(L"\\\\?\\") + cwd_str.get();
-
-  ASSERT_EQ(testonly_utf8_to_winpath("relative_mkdirtest"),
-            cwd + L"\\relative_mkdirtest");
-  ASSERT_EQ(testonly_utf8_to_winpath("preserve//\\trailing///"),
-            cwd + L"\\preserve\\trailing\\");
-  ASSERT_EQ(testonly_utf8_to_winpath("./normalize_me\\/../blah"),
-            cwd + L"\\blah");
-  std::ostringstream relpath;
-  for (wchar_t* p = cwd_str.get(); *p; ++p) {
-    if (*p == '/' || *p == '\\') {
-      relpath << "../";
-    }
-  }
-  relpath << ".\\/../\\./beyond-toplevel";
-  ASSERT_EQ(testonly_utf8_to_winpath(relpath.str().c_str()),
-            wstring(L"\\\\?\\") + cwd_str.get()[0] + L":\\beyond-toplevel");
-
-  // Absolute unix paths lack drive letters, driveless absolute windows paths
-  // do too. Neither can be converted to a drive-specifying absolute Windows
-  // path.
-  ASSERT_EQ(testonly_utf8_to_winpath("/absolute/unix/path"), L"");
-  // Though valid on Windows, we also don't support UNC paths (\\UNC\\blah).
-  ASSERT_EQ(testonly_utf8_to_winpath("\\driveless\\absolute"), L"");
-  // Though valid in cmd.exe, drive-relative paths are not supported.
-  ASSERT_EQ(testonly_utf8_to_winpath("c:foo"), L"");
-  ASSERT_EQ(testonly_utf8_to_winpath("c:/foo"), L"\\\\?\\c:\\foo");
-  ASSERT_EQ(testonly_utf8_to_winpath("\\\\?\\C:\\foo"), L"\\\\?\\C:\\foo");
-}
-
-TEST_F(IoWin32Test, Utf8Utf16ConversionTest) {
-  string mbs;
-  wstring wcs;
-  ASSERT_TRUE(strings::utf8_to_wcs(kUtf8Text, &wcs));
-  ASSERT_TRUE(strings::wcs_to_utf8(kUtf16Text, &mbs));
-  ASSERT_EQ(wcs, kUtf16Text);
-  ASSERT_EQ(mbs, kUtf8Text);
-}
-
-}  // namespace
-}  // namespace win32
-}  // namespace internal
-}  // namespace protobuf
-}  // namespace google
-
-#endif  // defined(_WIN32)
-
diff --git a/src/google/protobuf/stubs/map_util.h b/src/google/protobuf/stubs/map_util.h
index 887f12a..a29ed38 100644
--- a/src/google/protobuf/stubs/map_util.h
+++ b/src/google/protobuf/stubs/map_util.h
@@ -337,8 +337,7 @@
 template <class Collection>
 void InsertOrDie(Collection* const collection,
                  const typename Collection::value_type& value) {
-  GOOGLE_CHECK(InsertIfNotPresent(collection, value))
-      << "duplicate value: " << value;
+  GOOGLE_CHECK(InsertIfNotPresent(collection, value)) << "duplicate value: " << value;
 }
 
 // Same as above except doesn't log the value on error.
diff --git a/src/google/protobuf/stubs/mathlimits.h b/src/google/protobuf/stubs/mathlimits.h
index 2391ac4..d984694 100644
--- a/src/google/protobuf/stubs/mathlimits.h
+++ b/src/google/protobuf/stubs/mathlimits.h
@@ -43,23 +43,12 @@
 #ifndef UTIL_MATH_MATHLIMITS_H__
 #define UTIL_MATH_MATHLIMITS_H__
 
-// Note that for Windows we do something different because it does not support
-// the plain isinf and isnan.
-#if __cplusplus >= 201103L
-// GCC 4.9 has a bug that makes isinf and isnan ambigious when both <math.h>
-// and <cmath> get pulled into the same translation unit. We use the ones in
-// std:: namespace explicitly for C++11
-#include <cmath>
-#define GOOGLE_PROTOBUF_USE_STD_CMATH
-#elif _GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
-// libstdc++ <cmath> header undefines the global macros and put functions in
-// std:: namespace even before C++11. Use the ones in std:: instead too.
-#include <cmath>
-#define GOOGLE_PROTOBUF_USE_STD_CMATH
-#else
+// <math.h> lacks a lot of prototypes. However, this file needs <math.h> to
+// access old-fashioned isinf et al. Even worse more: this file must not
+// include <cmath> because that breaks the definition of isinf with gcc 4.9.
+//
+// TODO(mec): after C++11 everywhere, use <cmath> and std::isinf in this file.
 #include <math.h>
-#endif
-
 #include <string.h>
 
 #include <cfloat>
@@ -231,17 +220,6 @@
 #undef UNSIGNED_MAX_10_EXP
 #undef DECL_INT_LIMIT_FUNCS
 
-// For non-Windows builds we use the std:: versions of isinf and isnan if they
-// are available; see the comment about <cmath> at the top of this file for the
-// details on why we need to do this.
-#ifdef GOOGLE_PROTOBUF_USE_STD_CMATH
-#define ISINF std::isinf
-#define ISNAN std::isnan
-#else
-#define ISINF isinf
-#define ISNAN isnan
-#endif
-
 // ========================================================================= //
 #ifdef WIN32  // Lacks built-in isnan() and isinf()
 #define DECL_FP_LIMIT_FUNCS \
@@ -252,11 +230,11 @@
   static bool IsNegInf(const Type x) { return _fpclass(x) == _FPCLASS_NINF; }
 #else
 #define DECL_FP_LIMIT_FUNCS \
-  static bool IsFinite(const Type x) { return !ISINF(x) && !ISNAN(x); } \
-  static bool IsNaN(const Type x) { return ISNAN(x); } \
-  static bool IsInf(const Type x) { return ISINF(x); } \
-  static bool IsPosInf(const Type x) { return ISINF(x) && x > 0; } \
-  static bool IsNegInf(const Type x) { return ISINF(x) && x < 0; }
+  static bool IsFinite(const Type x) { return !isinf(x)  &&  !isnan(x); } \
+  static bool IsNaN(const Type x) { return isnan(x); } \
+  static bool IsInf(const Type x) { return isinf(x); } \
+  static bool IsPosInf(const Type x) { return isinf(x)  &&  x > 0; } \
+  static bool IsNegInf(const Type x) { return isinf(x)  &&  x < 0; }
 #endif
 
 // We can't put floating-point constant values in the header here because
@@ -291,8 +269,6 @@
 DECL_FP_LIMITS(double, DBL)
 DECL_FP_LIMITS(long double, LDBL)
 
-#undef ISINF
-#undef ISNAN
 #undef DECL_FP_LIMITS
 #undef DECL_FP_LIMIT_FUNCS
 
diff --git a/src/google/protobuf/stubs/mathutil.h b/src/google/protobuf/stubs/mathutil.h
index 8a9f69a..27956a8 100644
--- a/src/google/protobuf/stubs/mathutil.h
+++ b/src/google/protobuf/stubs/mathutil.h
@@ -41,6 +41,27 @@
 namespace protobuf {
 namespace internal {
 template<typename T>
+bool IsNan(T value) {
+  return false;
+}
+template<>
+inline bool IsNan(float value) {
+#ifdef _MSC_VER
+  return _isnan(value);
+#else
+  return isnan(value);
+#endif
+}
+template<>
+inline bool IsNan(double value) {
+#ifdef _MSC_VER
+  return _isnan(value);
+#else
+  return isnan(value);
+#endif
+}
+
+template<typename T>
 bool AlmostEquals(T a, T b) {
   return a == b;
 }
@@ -59,7 +80,7 @@
  public:
   template<typename T>
   static T Sign(T value) {
-    if (value == T(0) || MathLimits<T>::IsNaN(value)) {
+    if (value == T(0) || ::google::protobuf::internal::IsNan<T>(value)) {
       return value;
     }
     return value > T(0) ? 1 : -1;
diff --git a/src/google/protobuf/stubs/mutex.h b/src/google/protobuf/stubs/mutex.h
index 174290f..7ef1cb6 100644
--- a/src/google/protobuf/stubs/mutex.h
+++ b/src/google/protobuf/stubs/mutex.h
@@ -70,6 +70,14 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Mutex);
 };
 
+// Undefine the macros  to workaround the conflicts with Google internal
+// MutexLock implementation.
+// TODO(liujisi): Remove the undef once internal macros are removed.
+#undef MutexLock
+#undef ReaderMutexLock
+#undef WriterMutexLock
+#undef MutexLockMaybe
+
 // MutexLock(mu) acquires mu when constructed and releases it when destroyed.
 class LIBPROTOBUF_EXPORT MutexLock {
  public:
diff --git a/src/google/protobuf/stubs/once_unittest.cc b/src/google/protobuf/stubs/once_unittest.cc
index d5f7779..37def58 100644
--- a/src/google/protobuf/stubs/once_unittest.cc
+++ b/src/google/protobuf/stubs/once_unittest.cc
@@ -43,6 +43,7 @@
 
 namespace google {
 namespace protobuf {
+using internal::NewCallback;
 namespace {
 
 class OnceInitTest : public testing::Test {
@@ -127,11 +128,11 @@
   };
 
   TestThread* RunInitOnceInNewThread() {
-    return new TestThread(NewCallback(this, &OnceInitTest::InitOnce));
+    return new TestThread(internal::NewCallback(this, &OnceInitTest::InitOnce));
   }
   TestThread* RunInitRecursiveOnceInNewThread() {
     return new TestThread(
-        NewCallback(this, &OnceInitTest::InitRecursiveOnce));
+        internal::NewCallback(this, &OnceInitTest::InitRecursiveOnce));
   }
 
   enum State {
diff --git a/src/google/protobuf/stubs/platform_macros.h b/src/google/protobuf/stubs/platform_macros.h
index c3a64dd..4ba4b34 100644
--- a/src/google/protobuf/stubs/platform_macros.h
+++ b/src/google/protobuf/stubs/platform_macros.h
@@ -47,12 +47,9 @@
 #elif defined(__QNX__)
 #define GOOGLE_PROTOBUF_ARCH_ARM_QNX 1
 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1
-#elif defined(_M_ARM) || defined(__ARMEL__)
+#elif defined(__ARMEL__)
 #define GOOGLE_PROTOBUF_ARCH_ARM 1
 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1
-#elif defined(_M_ARM64)
-#define GOOGLE_PROTOBUF_ARCH_ARM 1
-#define GOOGLE_PROTOBUF_ARCH_64_BIT 1
 #elif defined(__aarch64__)
 #define GOOGLE_PROTOBUF_ARCH_AARCH64 1
 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1
@@ -117,11 +114,11 @@
 
 #undef GOOGLE_PROTOBUF_PLATFORM_ERROR
 
-#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE) || defined(__OpenBSD__)
+#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE)
 // Android ndk does not support the __thread keyword very well yet. Here
 // we use pthread_key_create()/pthread_getspecific()/... methods for
 // TLS support on android.
-// iOS and OpenBSD also do not support the __thread keyword.
+// iOS also does not support the __thread keyword.
 #define GOOGLE_PROTOBUF_NO_THREADLOCAL
 #endif
 
diff --git a/src/google/protobuf/stubs/port.h b/src/google/protobuf/stubs/port.h
index 41bd2aa..d7bd7f9 100644
--- a/src/google/protobuf/stubs/port.h
+++ b/src/google/protobuf/stubs/port.h
@@ -44,8 +44,6 @@
 #include <stdint.h>
 #endif
 
-#include <google/protobuf/stubs/platform_macros.h>
-
 #undef PROTOBUF_LITTLE_ENDIAN
 #ifdef _WIN32
   // Assuming windows is always little-endian.
@@ -62,12 +60,8 @@
   #endif
 #else
   #include <sys/param.h>   // __BYTE_ORDER
-  #if defined(__OpenBSD__)
-    #include <endian.h>
-  #endif
   #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \
-         (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN) || \
-         (defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN)) && \
+         (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \
       !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
     #define PROTOBUF_LITTLE_ENDIAN 1
   #endif
@@ -97,31 +91,8 @@
 #include <byteswap.h>  // IWYU pragma: export
 #endif
 
-#define PROTOBUF_RUNTIME_DEPRECATED(message)
-
 // ===================================================================
 // from google3/base/port.h
-
-#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \
-     (defined(_MSC_VER) && _MSC_VER >= 1900))
-// Define this to 1 if the code is compiled in C++11 mode; leave it
-// undefined otherwise.  Do NOT define it to 0 -- that causes
-// '#ifdef LANG_CXX11' to behave differently from '#if LANG_CXX11'.
-#define LANG_CXX11 1
-#endif
-
-#if LANG_CXX11 && !defined(__NVCC__)
-#define PROTOBUF_CXX11 1
-#else
-#define PROTOBUF_CXX11 0
-#endif
-
-#if PROTOBUF_CXX11
-#define PROTOBUF_FINAL final
-#else
-#define PROTOBUF_FINAL
-#endif
-
 namespace google {
 namespace protobuf {
 
@@ -138,15 +109,15 @@
 typedef unsigned __int32 uint32;
 typedef unsigned __int64 uint64;
 #else
-typedef int8_t int8;
-typedef int16_t int16;
-typedef int32_t int32;
-typedef int64_t int64;
+typedef signed char  int8;
+typedef short int16;
+typedef int int32;
+typedef long long int64;
 
-typedef uint8_t uint8;
-typedef uint16_t uint16;
-typedef uint32_t uint32;
-typedef uint64_t uint64;
+typedef unsigned char  uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
 #endif
 
 // long long macros to be used because gcc and vc++ use different suffixes,
@@ -160,10 +131,8 @@
 #define GOOGLE_ULONGLONG(x) x##UI64
 #define GOOGLE_LL_FORMAT "I64"  // As in printf("%I64d", ...)
 #else
-// By long long, we actually mean int64.
 #define GOOGLE_LONGLONG(x) x##LL
 #define GOOGLE_ULONGLONG(x) x##ULL
-// Used to format real long long integers.
 #define GOOGLE_LL_FORMAT "ll"  // As in "%lld". Note that "q" is poor form also.
 #endif
 
@@ -191,8 +160,6 @@
 #endif
 #endif
 
-#define GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE GOOGLE_ATTRIBUTE_ALWAYS_INLINE
-
 #ifndef GOOGLE_ATTRIBUTE_NOINLINE
 #if defined(__GNUC__) && (__GNUC__ > 3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
 // For functions we want to force not inline.
@@ -207,7 +174,14 @@
 #endif
 #endif
 
-#define GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE GOOGLE_ATTRIBUTE_NOINLINE
+#ifndef GOOGLE_ATTRIBUTE_DEPRECATED
+#ifdef __GNUC__
+// If the method/variable/type is used anywhere, produce a warning.
+#define GOOGLE_ATTRIBUTE_DEPRECATED __attribute__((deprecated))
+#else
+#define GOOGLE_ATTRIBUTE_DEPRECATED
+#endif
+#endif
 
 #ifndef GOOGLE_PREDICT_TRUE
 #ifdef __GNUC__
@@ -242,8 +216,6 @@
      __has_cpp_attribute(clang::fallthrough)
 #  define GOOGLE_FALLTHROUGH_INTENDED [[clang::fallthrough]]
 # endif
-#elif defined(__GNUC__) && __GNUC__ > 6
-# define GOOGLE_FALLTHROUGH_INTENDED [[gnu::fallthrough]]
 #endif
 
 #ifndef GOOGLE_FALLTHROUGH_INTENDED
@@ -253,59 +225,9 @@
 #define GOOGLE_GUARDED_BY(x)
 #define GOOGLE_ATTRIBUTE_COLD
 
-#ifdef GOOGLE_PROTOBUF_DONT_USE_UNALIGNED
-# define GOOGLE_PROTOBUF_USE_UNALIGNED 0
-#else
-# if defined(_M_X64) || defined(__x86_64__) || defined(_M_IX86) || defined(__i386__)
-#  define GOOGLE_PROTOBUF_USE_UNALIGNED 1
-# else
-#  define GOOGLE_PROTOBUF_USE_UNALIGNED 0
-# endif
-#endif
-
-#define GOOGLE_PROTOBUF_ATTRIBUTE_COLD GOOGLE_ATTRIBUTE_COLD
-
-#if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) ||\
-    defined(MEMORY_SANITIZER)
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-uint16_t __sanitizer_unaligned_load16(const void *p);
-uint32_t __sanitizer_unaligned_load32(const void *p);
-uint64_t __sanitizer_unaligned_load64(const void *p);
-void __sanitizer_unaligned_store16(void *p, uint16_t v);
-void __sanitizer_unaligned_store32(void *p, uint32_t v);
-void __sanitizer_unaligned_store64(void *p, uint64_t v);
-#ifdef __cplusplus
-}  // extern "C"
-#endif  // __cplusplus
-
-inline uint16 GOOGLE_UNALIGNED_LOAD16(const void *p) {
-  return __sanitizer_unaligned_load16(p);
-}
-
-inline uint32 GOOGLE_UNALIGNED_LOAD32(const void *p) {
-  return __sanitizer_unaligned_load32(p);
-}
-
-inline uint64 GOOGLE_UNALIGNED_LOAD64(const void *p) {
-  return __sanitizer_unaligned_load64(p);
-}
-
-inline void GOOGLE_UNALIGNED_STORE16(void *p, uint16 v) {
-  __sanitizer_unaligned_store16(p, v);
-}
-
-inline void GOOGLE_UNALIGNED_STORE32(void *p, uint32 v) {
-  __sanitizer_unaligned_store32(p, v);
-}
-
-inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) {
-  __sanitizer_unaligned_store64(p, v);
-}
-
-#elif GOOGLE_PROTOBUF_USE_UNALIGNED
+// x86 and x86-64 can perform unaligned loads/stores directly.
+#if defined(_M_X64) || defined(__x86_64__) || \
+    defined(_M_IX86) || defined(__i386__)
 
 #define GOOGLE_UNALIGNED_LOAD16(_p) (*reinterpret_cast<const uint16 *>(_p))
 #define GOOGLE_UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32 *>(_p))
@@ -353,8 +275,10 @@
 #define GOOGLE_THREAD_LOCAL __thread
 #endif
 
-// The following guarantees declaration of the byte swap functions.
+// The following guarantees declaration of the byte swap functions, and
+// defines __BYTE_ORDER for MSVC
 #ifdef _MSC_VER
+#define __BYTE_ORDER __LITTLE_ENDIAN
 #define bswap_16(x) _byteswap_ushort(x)
 #define bswap_32(x) _byteswap_ulong(x)
 #define bswap_64(x) _byteswap_uint64(x)
@@ -393,66 +317,6 @@
 #endif
 
 // ===================================================================
-// from google3/util/bits/bits.h
-
-class Bits {
- public:
-  static uint32 Log2FloorNonZero(uint32 n) {
-#if defined(__GNUC__)
-  return 31 ^ static_cast<uint32>(__builtin_clz(n));
-#elif defined(COMPILER_MSVC) && defined(_M_IX86)
-  _asm {
-    bsr ebx, n
-    mov n, ebx
-  }
-  return n;
-#else
-  return Log2FloorNonZero_Portable(n);
-#endif
-  }
-
-  static uint32 Log2FloorNonZero64(uint64 n) {
-    // arm-nacl-clang runs into an instruction-selection failure when it
-    // encounters __builtin_clzll:
-    // https://bugs.chromium.org/p/nativeclient/issues/detail?id=4395
-    // To work around this, when we build for NaCl we use the portable
-    // implementation instead.
-#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_OS_NACL)
-  return 63 ^ static_cast<uint32>(__builtin_clzll(n));
-#else
-  return Log2FloorNonZero64_Portable(n);
-#endif
-  }
- private:
-  static int Log2FloorNonZero_Portable(uint32 n) {
-    if (n == 0)
-      return -1;
-    int log = 0;
-    uint32 value = n;
-    for (int i = 4; i >= 0; --i) {
-      int shift = (1 << i);
-      uint32 x = value >> shift;
-      if (x != 0) {
-        value = x;
-        log += shift;
-      }
-    }
-    assert(value == 1);
-    return log;
-  }
-
-  static int Log2FloorNonZero64_Portable(uint64 n) {
-    const uint32 topbits = static_cast<uint32>(n >> 32);
-    if (topbits == 0) {
-      // Top bits are zero, so scan in bottom bits
-      return static_cast<int>(Log2FloorNonZero(static_cast<uint32>(n)));
-    } else {
-      return 32 + static_cast<int>(Log2FloorNonZero(topbits));
-    }
-  }
-};
-
-// ===================================================================
 // from google3/util/endian/endian.h
 LIBPROTOBUF_EXPORT uint32 ghtonl(uint32 x);
 
@@ -512,11 +376,6 @@
   }
 };
 
-#ifndef GOOGLE_ATTRIBUTE_SECTION_VARIABLE
-#define GOOGLE_ATTRIBUTE_SECTION_VARIABLE(name)
-#endif
-
-#define GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(name)
 
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/stubs/shared_ptr.h b/src/google/protobuf/stubs/shared_ptr.h
index 7da114e..bca8280 100644
--- a/src/google/protobuf/stubs/shared_ptr.h
+++ b/src/google/protobuf/stubs/shared_ptr.h
@@ -438,8 +438,8 @@
 
  protected:
   enable_shared_from_this() { }
-  enable_shared_from_this(const enable_shared_from_this& other) { }
-  enable_shared_from_this& operator=(const enable_shared_from_this& other) {
+  enable_shared_from_this(const enable_shared_from_this&) { }
+  enable_shared_from_this& operator=(const enable_shared_from_this&) {
     return *this;
   }
   ~enable_shared_from_this() { }
@@ -456,8 +456,7 @@
 template<typename T>
 void shared_ptr<T>::MaybeSetupWeakThis(enable_shared_from_this<T>* ptr) {
   if (ptr) {
-    GOOGLE_CHECK(ptr->weak_this_.expired())
-        << "Object already owned by a shared_ptr";
+    GOOGLE_CHECK(ptr->weak_this_.expired()) << "Object already owned by a shared_ptr";
     ptr->weak_this_ = *this;
   }
 }
diff --git a/src/google/protobuf/stubs/stringpiece.h b/src/google/protobuf/stubs/stringpiece.h
index 563ff75..9167165 100644
--- a/src/google/protobuf/stubs/stringpiece.h
+++ b/src/google/protobuf/stubs/stringpiece.h
@@ -222,6 +222,14 @@
       : ptr_(str.data()), length_(0) {
     length_ = CheckedSsizeTFromSizeT(str.size());
   }
+#if defined(HAS_GLOBAL_STRING)
+  template <class Allocator>
+  StringPiece(  // NOLINT(runtime/explicit)
+      const basic_string<char, std::char_traits<char>, Allocator>& str)
+      : ptr_(str.data()), length_(0) {
+    length_ = CheckedSsizeTFromSizeT(str.size());
+  }
+#endif
 
   StringPiece(const char* offset, stringpiece_ssize_type len)
       : ptr_(offset), length_(len) {
@@ -292,7 +300,7 @@
   int compare(StringPiece x) const {
     const stringpiece_ssize_type min_size =
         length_ < x.length_ ? length_ : x.length_;
-    int r = memcmp(ptr_, x.ptr_, static_cast<size_t>(min_size));
+    int r = memcmp(ptr_, x.ptr_, min_size);
     if (r < 0) return -1;
     if (r > 0) return 1;
     if (length_ < x.length_) return -1;
@@ -310,7 +318,7 @@
   // "as_string()" method defined here for existing code.
   string ToString() const {
     if (ptr_ == NULL) return string();
-    return string(data(), static_cast<size_type>(size()));
+    return string(data(), size());
   }
 
   operator string() const {
@@ -321,14 +329,12 @@
   void AppendToString(string* target) const;
 
   bool starts_with(StringPiece x) const {
-    return (length_ >= x.length_) &&
-           (memcmp(ptr_, x.ptr_, static_cast<size_t>(x.length_)) == 0);
+    return (length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0);
   }
 
   bool ends_with(StringPiece x) const {
     return ((length_ >= x.length_) &&
-            (memcmp(ptr_ + (length_-x.length_), x.ptr_,
-                 static_cast<size_t>(x.length_)) == 0));
+            (memcmp(ptr_ + (length_-x.length_), x.ptr_, x.length_) == 0));
   }
 
   // Checks whether StringPiece starts with x and if so advances the beginning
@@ -400,7 +406,7 @@
   }
 
   return x.data() == y.data() || len <= 0 ||
-      memcmp(x.data(), y.data(), static_cast<size_t>(len)) == 0;
+      memcmp(x.data(), y.data(), len) == 0;
 }
 
 inline bool operator!=(StringPiece x, StringPiece y) {
@@ -410,7 +416,7 @@
 inline bool operator<(StringPiece x, StringPiece y) {
   const stringpiece_ssize_type min_size =
       x.size() < y.size() ? x.size() : y.size();
-  const int r = memcmp(x.data(), y.data(), static_cast<size_t>(min_size));
+  const int r = memcmp(x.data(), y.data(), min_size);
   return (r < 0) || (r == 0 && x.size() < y.size());
 }
 
@@ -460,9 +466,7 @@
     return size_;
   }
 
-  std::string ToString() const {
-    return std::string(data_, static_cast<size_t>(size_));
-  }
+  std::string ToString() const { return std::string(data_, size_); }
  private:
   const char* data_;
   stringpiece_ssize_type size_;
@@ -477,7 +481,7 @@
   size_t operator()(const StringPiece& s) const {
     size_t result = 0;
     for (const char *str = s.data(), *end = str + s.size(); str < end; str++) {  
-      result = 5 * result + static_cast<size_t>(*str);
+      result = 5 * result + *str;
     }
     return result;
   }
diff --git a/src/google/protobuf/stubs/stringpiece_unittest.cc b/src/google/protobuf/stubs/stringpiece_unittest.cc
index a6a8759..a52d81f 100644
--- a/src/google/protobuf/stubs/stringpiece_unittest.cc
+++ b/src/google/protobuf/stubs/stringpiece_unittest.cc
@@ -783,13 +783,11 @@
   EXPECT_EQ(StringPiece::npos, a.rfind('x'));
 }
 
-#ifdef PROTOBUF_HAS_DEATH_TEST
 #ifndef NDEBUG
 TEST(NonNegativeLenTest, NonNegativeLen) {
   EXPECT_DEATH(StringPiece("xyz", -1), "len >= 0");
 }
 #endif  // ndef DEBUG
-#endif  // PROTOBUF_HAS_DEATH_TEST
 
 }  // namespace
 }  // namespace protobuf
diff --git a/src/google/protobuf/stubs/strutil.cc b/src/google/protobuf/stubs/strutil.cc
index 1a4d71c..7ba92e8 100644
--- a/src/google/protobuf/stubs/strutil.cc
+++ b/src/google/protobuf/stubs/strutil.cc
@@ -93,21 +93,6 @@
   }
 }
 
-// ----------------------------------------------------------------------
-// ReplaceCharacters
-//    Replaces any occurrence of the character 'remove' (or the characters
-//    in 'remove') with the character 'replacewith'.
-// ----------------------------------------------------------------------
-void ReplaceCharacters(string *s, const char *remove, char replacewith) {
-  const char *str_start = s->c_str();
-  const char *str = str_start;
-  for (str = strpbrk(str, remove);
-       str != NULL;
-       str = strpbrk(str + 1, remove)) {
-    (*s)[str - str_start] = replacewith;
-  }
-}
-
 void StripWhitespace(string* str) {
   int str_length = str->length();
 
@@ -227,7 +212,7 @@
 void SplitStringUsing(const string& full,
                       const char* delim,
                       vector<string>* result) {
-  std::back_insert_iterator< vector<string> > it(*result);
+  back_insert_iterator< vector<string> > it(*result);
   SplitStringToIteratorUsing(full, delim, it);
 }
 
@@ -265,7 +250,7 @@
 
 void SplitStringAllowEmpty(const string& full, const char* delim,
                            vector<string>* result) {
-  std::back_insert_iterator<vector<string> > it(*result);
+  back_insert_iterator<vector<string> > it(*result);
   SplitStringToIteratorAllowEmpty(full, delim, 0, it);
 }
 
@@ -981,7 +966,7 @@
 };
 
 char* FastUInt32ToBufferLeft(uint32 u, char* buffer) {
-  uint32 digits;
+  int digits;
   const char *ASCII_digits = NULL;
   // The idea of this implementation is to trim the number of divides to as few
   // as possible by using multiplication and subtraction rather than mod (%),
@@ -1262,10 +1247,10 @@
   // this assert.
   GOOGLE_COMPILE_ASSERT(DBL_DIG < 20, DBL_DIG_is_too_big);
 
-  if (value == std::numeric_limits<double>::infinity()) {
+  if (value == numeric_limits<double>::infinity()) {
     strcpy(buffer, "inf");
     return buffer;
-  } else if (value == -std::numeric_limits<double>::infinity()) {
+  } else if (value == -numeric_limits<double>::infinity()) {
     strcpy(buffer, "-inf");
     return buffer;
   } else if (MathLimits<double>::IsNaN(value)) {
@@ -1380,10 +1365,10 @@
   // this assert.
   GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big);
 
-  if (value == std::numeric_limits<double>::infinity()) {
+  if (value == numeric_limits<double>::infinity()) {
     strcpy(buffer, "inf");
     return buffer;
-  } else if (value == -std::numeric_limits<double>::infinity()) {
+  } else if (value == -numeric_limits<double>::infinity()) {
     strcpy(buffer, "-inf");
     return buffer;
   } else if (MathLimits<float>::IsNaN(value)) {
@@ -1401,7 +1386,7 @@
   float parsed_value;
   if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) {
     int snprintf_result =
-      snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG+3, value);
+      snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG+2, value);
 
     // Should never overflow; see above.
     GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);
diff --git a/src/google/protobuf/stubs/strutil.h b/src/google/protobuf/stubs/strutil.h
index df28c94..8bdd611 100644
--- a/src/google/protobuf/stubs/strutil.h
+++ b/src/google/protobuf/stubs/strutil.h
@@ -147,7 +147,7 @@
 }
 
 // ----------------------------------------------------------------------
-// ReplaceCharacters
+// StripString
 //    Replaces any occurrence of the character 'remove' (or the characters
 //    in 'remove') with the character 'replacewith'.
 //    Good for keeping html characters or protocol characters (\t) out
@@ -155,8 +155,6 @@
 // StripWhitespace
 //    Removes whitespaces from both ends of the given string.
 // ----------------------------------------------------------------------
-LIBPROTOBUF_EXPORT void ReplaceCharacters(string* s, const char* remove,
-                                          char replacewith);
 LIBPROTOBUF_EXPORT void StripString(string* s, const char* remove,
                                     char replacewith);
 
diff --git a/src/google/protobuf/stubs/substitute.cc b/src/google/protobuf/stubs/substitute.cc
index 7194a5b..c9d9589 100644
--- a/src/google/protobuf/stubs/substitute.cc
+++ b/src/google/protobuf/stubs/substitute.cc
@@ -113,9 +113,7 @@
   for (int i = 0; format[i] != '\0'; i++) {
     if (format[i] == '$') {
       if (ascii_isdigit(format[i+1])) {
-        unsigned int index = format[i+1] - '0';
-        assert(index < 10);
-        const SubstituteArg* src = args_array[index];
+        const SubstituteArg* src = args_array[format[i+1] - '0'];
         memcpy(target, src->data(), src->size());
         target += src->size();
         ++i;  // Skip next char.
diff --git a/src/google/protobuf/stubs/time.h b/src/google/protobuf/stubs/time.h
index 45607ca..20a6b56 100644
--- a/src/google/protobuf/stubs/time.h
+++ b/src/google/protobuf/stubs/time.h
@@ -66,7 +66,7 @@
 string LIBPROTOBUF_EXPORT FormatTime(int64 seconds, int32 nanos);
 // Parses a time string. This method accepts RFC3339 date/time string with UTC
 // offset. For example, "2015-05-20T13:29:35.120-08:00".
-bool LIBPROTOBUF_EXPORT ParseTime(const string& value, int64* seconds, int32* nanos);
+bool LIBPROTOBUF_EXPORT ParseTime(const string& vaule, int64* seconds, int32* nanos);
 
 }  // namespace internal
 }  // namespace protobuf
diff --git a/src/google/protobuf/stubs/type_traits.h b/src/google/protobuf/stubs/type_traits.h
index 3ab5ea7..0d8127e 100644
--- a/src/google/protobuf/stubs/type_traits.h
+++ b/src/google/protobuf/stubs/type_traits.h
@@ -139,7 +139,7 @@
 template<> struct is_integral<unsigned int> : true_type { };
 template<> struct is_integral<long> : true_type { };
 template<> struct is_integral<unsigned long> : true_type { };
-#if defined(HAVE_LONG_LONG) || defined(_MSC_VER)
+#ifdef HAVE_LONG_LONG
 template<> struct is_integral<long long> : true_type { };
 template<> struct is_integral<unsigned long long> : true_type { };
 #endif
diff --git a/src/google/protobuf/test_messages_proto2.proto b/src/google/protobuf/test_messages_proto2.proto
deleted file mode 100644
index 60dbfc7..0000000
--- a/src/google/protobuf/test_messages_proto2.proto
+++ /dev/null
@@ -1,216 +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.
-//
-// Test schema for proto2 messages.  This test schema is used by:
-//
-// - conformance tests
-//
-
-syntax = "proto2";
-
-package protobuf_test_messages.proto2;
-option java_package = "com.google.protobuf_test_messages.proto2";
-
-// This is the default, but we specify it here explicitly.
-option optimize_for = SPEED;
-
-option cc_enable_arenas = true;
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-//
-// Also, crucially, all messages and enums in this file are eventually
-// submessages of this message.  So for example, a fuzz test of TestAllTypes
-// could trigger bugs that occur in any message type in this file.  We verify
-// this stays true in a unit test.
-message TestAllTypesProto2 {
-  message NestedMessage {
-    optional int32 a = 1;
-    optional TestAllTypesProto2 corecursive = 2;
-  }
-
-  enum NestedEnum {
-    FOO = 0;
-    BAR = 1;
-    BAZ = 2;
-    NEG = -1;  // Intentionally negative.
-  }
-
-  // Singular
-  optional int32 optional_int32    =  1;
-  optional int64 optional_int64    =  2;
-  optional uint32 optional_uint32   =  3;
-  optional uint64 optional_uint64   =  4;
-  optional sint32 optional_sint32   =  5;
-  optional sint64 optional_sint64   =  6;
-  optional fixed32 optional_fixed32  =  7;
-  optional fixed64 optional_fixed64  =  8;
-  optional sfixed32 optional_sfixed32 =  9;
-  optional sfixed64 optional_sfixed64 = 10;
-  optional float optional_float    = 11;
-  optional double optional_double   = 12;
-  optional bool optional_bool     = 13;
-  optional string optional_string   = 14;
-  optional bytes optional_bytes    = 15;
-
-  optional NestedMessage                        optional_nested_message  = 18;
-  optional ForeignMessageProto2                 optional_foreign_message = 19;
-
-  optional NestedEnum                           optional_nested_enum     = 21;
-  optional ForeignEnumProto2                    optional_foreign_enum    = 22;
-
-  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
-  optional string optional_cord = 25 [ctype=CORD];
-
-  optional TestAllTypesProto2 recursive_message = 27;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated NestedMessage       repeated_nested_message  = 48;
-  repeated ForeignMessageProto2      repeated_foreign_message = 49;
-
-  repeated NestedEnum          repeated_nested_enum     = 51;
-  repeated ForeignEnumProto2         repeated_foreign_enum    = 52;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  // Map
-  map <   int32, int32>    map_int32_int32 = 56;
-  map <   int64, int64>    map_int64_int64 = 57;
-  map <  uint32, uint32>   map_uint32_uint32 = 58;
-  map <  uint64, uint64>   map_uint64_uint64 = 59;
-  map <  sint32, sint32>   map_sint32_sint32 = 60;
-  map <  sint64, sint64>   map_sint64_sint64 = 61;
-  map < fixed32, fixed32>  map_fixed32_fixed32 = 62;
-  map < fixed64, fixed64>  map_fixed64_fixed64 = 63;
-  map <sfixed32, sfixed32> map_sfixed32_sfixed32 = 64;
-  map <sfixed64, sfixed64> map_sfixed64_sfixed64 = 65;
-  map <   int32, float>    map_int32_float = 66;
-  map <   int32, double>   map_int32_double = 67;
-  map <    bool, bool>     map_bool_bool = 68;
-  map <  string, string>   map_string_string = 69;
-  map <  string, bytes>    map_string_bytes = 70;
-  map <  string, NestedMessage>  map_string_nested_message = 71;
-  map <  string, ForeignMessageProto2> map_string_foreign_message = 72;
-  map <  string, NestedEnum>     map_string_nested_enum = 73;
-  map <  string, ForeignEnumProto2>    map_string_foreign_enum = 74;
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    NestedMessage oneof_nested_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-    bool oneof_bool = 115;
-    uint64 oneof_uint64 = 116;
-    float oneof_float = 117;
-    double oneof_double = 118;
-    NestedEnum oneof_enum = 119;
-  }
-
-  // extensions
-  extensions 120 to 200;
-
-  // groups
-  optional group Data = 201 {
-    optional int32 group_int32 = 202;
-    optional uint32 group_uint32 = 203;
-  };
-
-  // Test field-name-to-JSON-name convention.
-  // (protobuf says names can be any valid C/C++ identifier.)
-  optional int32 fieldname1 = 401;
-  optional int32 field_name2 = 402;
-  optional int32 _field_name3 = 403;
-  optional int32 field__name4_ = 404;
-  optional int32 field0name5 = 405;
-  optional int32 field_0_name6 = 406;
-  optional int32 fieldName7 = 407;
-  optional int32 FieldName8 = 408;
-  optional int32 field_Name9 = 409;
-  optional int32 Field_Name10 = 410;
-  optional int32 FIELD_NAME11 = 411;
-  optional int32 FIELD_name12 = 412;
-  optional int32 __field_name13 = 413;
-  optional int32 __Field_name14 = 414;
-  optional int32 field__name15 = 415;
-  optional int32 field__Name16 = 416;
-  optional int32 field_name17__ = 417;
-  optional int32 Field_name18__ = 418;
-
-  // message_set test case.
-  message MessageSetCorrect {
-    option message_set_wire_format = true;
-    extensions 4 to max;
-  }
-
-  message MessageSetCorrectExtension1 {
-    extend MessageSetCorrect {
-      optional MessageSetCorrectExtension1 message_set_extension = 1547769;
-    }
-    optional string str = 25;
-  }
-
-  message MessageSetCorrectExtension2 {
-    extend MessageSetCorrect {
-      optional MessageSetCorrectExtension2 message_set_extension = 4135312;
-    }
-    optional int32 i = 9;
-  }
-}
-
-message ForeignMessageProto2 {
-  optional int32 c = 1;
-}
-
-enum ForeignEnumProto2 {
-  FOREIGN_FOO = 0;
-  FOREIGN_BAR = 1;
-  FOREIGN_BAZ = 2;
-}
-
-extend TestAllTypesProto2 {
-  optional int32 extension_int32 = 120;
-}
diff --git a/src/google/protobuf/test_messages_proto3.proto b/src/google/protobuf/test_messages_proto3.proto
deleted file mode 100644
index 4f295aa..0000000
--- a/src/google/protobuf/test_messages_proto3.proto
+++ /dev/null
@@ -1,231 +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.
-//
-// Test schema for proto3 messages.  This test schema is used by:
-//
-// - benchmarks
-// - fuzz tests
-// - conformance tests
-//
-
-syntax = "proto3";
-
-package protobuf_test_messages.proto3;
-option java_package = "com.google.protobuf_test_messages.proto3";
-option objc_class_prefix = "Proto3";
-
-// This is the default, but we specify it here explicitly.
-option optimize_for = SPEED;
-
-import "google/protobuf/any.proto";
-import "google/protobuf/duration.proto";
-import "google/protobuf/field_mask.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/wrappers.proto";
-
-option cc_enable_arenas = true;
-
-// This proto includes every type of field in both singular and repeated
-// forms.
-//
-// Also, crucially, all messages and enums in this file are eventually
-// submessages of this message.  So for example, a fuzz test of TestAllTypes
-// could trigger bugs that occur in any message type in this file.  We verify
-// this stays true in a unit test.
-message TestAllTypesProto3 {
-  message NestedMessage {
-    int32 a = 1;
-    TestAllTypesProto3 corecursive = 2;
-  }
-
-  enum NestedEnum {
-    FOO = 0;
-    BAR = 1;
-    BAZ = 2;
-    NEG = -1;  // Intentionally negative.
-  }
-
-  // Singular
-  int32 optional_int32    =  1;
-  int64 optional_int64    =  2;
-  uint32 optional_uint32   =  3;
-  uint64 optional_uint64   =  4;
-  sint32 optional_sint32   =  5;
-  sint64 optional_sint64   =  6;
-  fixed32 optional_fixed32  =  7;
-  fixed64 optional_fixed64  =  8;
-  sfixed32 optional_sfixed32 =  9;
-  sfixed64 optional_sfixed64 = 10;
-  float optional_float    = 11;
-  double optional_double   = 12;
-  bool optional_bool     = 13;
-  string optional_string   = 14;
-  bytes optional_bytes    = 15;
-
-  NestedMessage                        optional_nested_message  = 18;
-  ForeignMessage                       optional_foreign_message = 19;
-
-  NestedEnum                           optional_nested_enum     = 21;
-  ForeignEnum                          optional_foreign_enum    = 22;
-
-  string optional_string_piece = 24 [ctype=STRING_PIECE];
-  string optional_cord = 25 [ctype=CORD];
-
-  TestAllTypesProto3 recursive_message = 27;
-
-  // Repeated
-  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   string repeated_string   = 44;
-  repeated    bytes repeated_bytes    = 45;
-
-  repeated NestedMessage                        repeated_nested_message  = 48;
-  repeated ForeignMessage                       repeated_foreign_message = 49;
-
-  repeated NestedEnum                           repeated_nested_enum     = 51;
-  repeated ForeignEnum                          repeated_foreign_enum    = 52;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  // Map
-  map <   int32, int32>    map_int32_int32 = 56;
-  map <   int64, int64>    map_int64_int64 = 57;
-  map <  uint32, uint32>   map_uint32_uint32 = 58;
-  map <  uint64, uint64>   map_uint64_uint64 = 59;
-  map <  sint32, sint32>   map_sint32_sint32 = 60;
-  map <  sint64, sint64>   map_sint64_sint64 = 61;
-  map < fixed32, fixed32>  map_fixed32_fixed32 = 62;
-  map < fixed64, fixed64>  map_fixed64_fixed64 = 63;
-  map <sfixed32, sfixed32> map_sfixed32_sfixed32 = 64;
-  map <sfixed64, sfixed64> map_sfixed64_sfixed64 = 65;
-  map <   int32, float>    map_int32_float = 66;
-  map <   int32, double>   map_int32_double = 67;
-  map <    bool, bool>     map_bool_bool = 68;
-  map <  string, string>   map_string_string = 69;
-  map <  string, bytes>    map_string_bytes = 70;
-  map <  string, NestedMessage>  map_string_nested_message = 71;
-  map <  string, ForeignMessage> map_string_foreign_message = 72;
-  map <  string, NestedEnum>     map_string_nested_enum = 73;
-  map <  string, ForeignEnum>    map_string_foreign_enum = 74;
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 111;
-    NestedMessage oneof_nested_message = 112;
-    string oneof_string = 113;
-    bytes oneof_bytes = 114;
-    bool oneof_bool = 115;
-    uint64 oneof_uint64 = 116;
-    float oneof_float = 117;
-    double oneof_double = 118;
-    NestedEnum oneof_enum = 119;
-  }
-
-  // Well-known types
-  google.protobuf.BoolValue optional_bool_wrapper = 201;
-  google.protobuf.Int32Value optional_int32_wrapper = 202;
-  google.protobuf.Int64Value optional_int64_wrapper = 203;
-  google.protobuf.UInt32Value optional_uint32_wrapper = 204;
-  google.protobuf.UInt64Value optional_uint64_wrapper = 205;
-  google.protobuf.FloatValue optional_float_wrapper = 206;
-  google.protobuf.DoubleValue optional_double_wrapper = 207;
-  google.protobuf.StringValue optional_string_wrapper = 208;
-  google.protobuf.BytesValue optional_bytes_wrapper = 209;
-
-  repeated google.protobuf.BoolValue repeated_bool_wrapper = 211;
-  repeated google.protobuf.Int32Value repeated_int32_wrapper = 212;
-  repeated google.protobuf.Int64Value repeated_int64_wrapper = 213;
-  repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214;
-  repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215;
-  repeated google.protobuf.FloatValue repeated_float_wrapper = 216;
-  repeated google.protobuf.DoubleValue repeated_double_wrapper = 217;
-  repeated google.protobuf.StringValue repeated_string_wrapper = 218;
-  repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219;
-
-  google.protobuf.Duration optional_duration = 301;
-  google.protobuf.Timestamp optional_timestamp = 302;
-  google.protobuf.FieldMask optional_field_mask = 303;
-  google.protobuf.Struct optional_struct = 304;
-  google.protobuf.Any optional_any = 305;
-  google.protobuf.Value optional_value = 306;
-
-  repeated google.protobuf.Duration repeated_duration = 311;
-  repeated google.protobuf.Timestamp repeated_timestamp = 312;
-  repeated google.protobuf.FieldMask repeated_fieldmask = 313;
-  repeated google.protobuf.Struct repeated_struct = 324;
-  repeated google.protobuf.Any repeated_any = 315;
-  repeated google.protobuf.Value repeated_value = 316;
-
-  // Test field-name-to-JSON-name convention.
-  // (protobuf says names can be any valid C/C++ identifier.)
-  int32 fieldname1 = 401;
-  int32 field_name2 = 402;
-  int32 _field_name3 = 403;
-  int32 field__name4_ = 404;
-  int32 field0name5 = 405;
-  int32 field_0_name6 = 406;
-  int32 fieldName7 = 407;
-  int32 FieldName8 = 408;
-  int32 field_Name9 = 409;
-  int32 Field_Name10 = 410;
-  int32 FIELD_NAME11 = 411;
-  int32 FIELD_name12 = 412;
-  int32 __field_name13 = 413;
-  int32 __Field_name14 = 414;
-  int32 field__name15 = 415;
-  int32 field__Name16 = 416;
-  int32 field_name17__ = 417;
-  int32 Field_name18__ = 418;
-
-  // Reserved for testing unknown fields
-  reserved 501 to 510;
-}
-
-message ForeignMessage {
-  int32 c = 1;
-}
-
-enum ForeignEnum {
-  FOREIGN_FOO = 0;
-  FOREIGN_BAR = 1;
-  FOREIGN_BAZ = 2;
-}
diff --git a/src/google/protobuf/test_util.cc b/src/google/protobuf/test_util.cc
index 4e02a85..07aa1d7 100644
--- a/src/google/protobuf/test_util.cc
+++ b/src/google/protobuf/test_util.cc
@@ -3230,7 +3230,7 @@
     Message* message) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> output;
+  vector<const FieldDescriptor*> output;
   reflection->ListFields(*message, &output);
   for (int i=0; i<output.size(); ++i) {
     const FieldDescriptor* field = output[i];
@@ -3244,7 +3244,7 @@
     Message* message, bool expect_extensions_notnull) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> output;
+  vector<const FieldDescriptor*> output;
   reflection->ListFields(*message, &output);
   for (int i=0; i<output.size(); ++i) {
     const FieldDescriptor* field = output[i];
@@ -3263,7 +3263,7 @@
 void TestUtil::ReflectionTester::SwapRepeatedsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> output;
+  vector<const FieldDescriptor*> output;
   reflection->ListFields(*message, &output);
   for (int i=0; i<output.size(); ++i) {
     const FieldDescriptor* field = output[i];
@@ -3278,7 +3278,7 @@
     Message* message) {
   const Reflection* reflection = message->GetReflection();
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(*message, &fields);
 
   for (int i = 0; i < fields.size(); ++i) {
@@ -3298,7 +3298,7 @@
   const Reflection* from_reflection = from_message->GetReflection();
   const Reflection* to_reflection = to_message->GetReflection();
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   from_reflection->ListFields(*from_message, &fields);
 
   for (int i = 0; i < fields.size(); ++i) {
@@ -3332,11 +3332,7 @@
         break;
       case NOT_NULL:
         EXPECT_TRUE(released != NULL);
-        if (message->GetArena() == NULL) {
-          // released message must be same as sub_message if source message is
-          // not on arena.
-          EXPECT_EQ(&sub_message, released);
-        }
+        EXPECT_EQ(&sub_message, released);
         break;
       case CAN_BE_NULL:
         break;
diff --git a/src/google/protobuf/test_util_lite.cc b/src/google/protobuf/test_util_lite.cc
index 79c5abe..388c0cb 100644
--- a/src/google/protobuf/test_util_lite.cc
+++ b/src/google/protobuf/test_util_lite.cc
@@ -35,9 +35,14 @@
 #include <google/protobuf/test_util_lite.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
-#include <gtest/gtest.h>
 
 
+#define EXPECT_TRUE GOOGLE_CHECK
+#define ASSERT_TRUE GOOGLE_CHECK
+#define EXPECT_FALSE(COND) GOOGLE_CHECK(!(COND))
+#define EXPECT_EQ GOOGLE_CHECK_EQ
+#define ASSERT_EQ GOOGLE_CHECK_EQ
+
 namespace google {
 namespace protobuf {
 
diff --git a/src/google/protobuf/testdata/golden_message_maps b/src/google/protobuf/testdata/golden_message_maps
deleted file mode 100644
index c70a4d7..0000000
--- a/src/google/protobuf/testdata/golden_message_maps
+++ /dev/null
Binary files differ
diff --git a/src/google/protobuf/testing/file.cc b/src/google/protobuf/testing/file.cc
index 26cb0a6..3d07b12 100644
--- a/src/google/protobuf/testing/file.cc
+++ b/src/google/protobuf/testing/file.cc
@@ -38,31 +38,24 @@
 #ifdef _MSC_VER
 #define WIN32_LEAN_AND_MEAN  // yeah, right
 #include <windows.h>         // Find*File().  :(
-// #include <direct.h>
+#include <io.h>
+#include <direct.h>
 #else
 #include <dirent.h>
 #include <unistd.h>
 #endif
 #include <errno.h>
 
-#include <google/protobuf/stubs/io_win32.h>
-
 namespace google {
 namespace protobuf {
 
 #ifdef _WIN32
+#define mkdir(name, mode) mkdir(name)
 // Windows doesn't have symbolic links.
 #define lstat stat
-// DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
-// them like we do below.
+#ifndef F_OK
+#define F_OK 00  // not defined by MSVC for whatever reason
 #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;
 #endif
 
 bool File::Exists(const string& name) {
@@ -98,7 +91,6 @@
 
   if (fwrite(contents.data(), 1, contents.size(), file) != contents.size()) {
     GOOGLE_LOG(ERROR) << "fwrite(" << name << "): " << strerror(errno);
-    fclose(file);
     return false;
   }
 
@@ -120,9 +112,6 @@
 }
 
 bool File::CreateDir(const string& name, int mode) {
-  if (!name.empty()) {
-    GOOGLE_CHECK_OK(name[name.size() - 1] != '.');
-  }
   return mkdir(name.c_str(), mode) == 0;
 }
 
@@ -151,12 +140,12 @@
 
 #ifdef _MSC_VER
   // This interface is so weird.
-  WIN32_FIND_DATAA find_data;
-  HANDLE find_handle = FindFirstFileA((name + "/*").c_str(), &find_data);
+  WIN32_FIND_DATA find_data;
+  HANDLE find_handle = FindFirstFile((name + "/*").c_str(), &find_data);
   if (find_handle == INVALID_HANDLE_VALUE) {
     // Just delete it, whatever it is.
-    DeleteFileA(name.c_str());
-    RemoveDirectoryA(name.c_str());
+    DeleteFile(name.c_str());
+    RemoveDirectory(name.c_str());
     return;
   }
 
@@ -166,15 +155,15 @@
       string path = name + "/" + entry_name;
       if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
         DeleteRecursively(path, NULL, NULL);
-        RemoveDirectoryA(path.c_str());
+        RemoveDirectory(path.c_str());
       } else {
-        DeleteFileA(path.c_str());
+        DeleteFile(path.c_str());
       }
     }
-  } while(FindNextFileA(find_handle, &find_data));
+  } while(FindNextFile(find_handle, &find_data));
   FindClose(find_handle);
 
-  RemoveDirectoryA(name.c_str());
+  RemoveDirectory(name.c_str());
 #else
   // Use opendir()!  Yay!
   // lstat = Don't follow symbolic links.
diff --git a/src/google/protobuf/testing/googletest.cc b/src/google/protobuf/testing/googletest.cc
index b81d399..2b9cdde 100644
--- a/src/google/protobuf/testing/googletest.cc
+++ b/src/google/protobuf/testing/googletest.cc
@@ -33,14 +33,14 @@
 
 #include <google/protobuf/testing/googletest.h>
 #include <google/protobuf/testing/file.h>
-#include <google/protobuf/stubs/io_win32.h>
 #include <google/protobuf/stubs/strutil.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <errno.h>
 #include <stdlib.h>
 #ifdef _MSC_VER
-// #include <direct.h>
+#include <io.h>
+#include <direct.h>
 #else
 #include <unistd.h>
 #endif
@@ -53,13 +53,7 @@
 namespace protobuf {
 
 #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;
+#define mkdir(name, mode) mkdir(name)
 #endif
 
 #ifndef O_BINARY
@@ -72,9 +66,6 @@
 
 string TestSourceDir() {
 #ifndef GOOGLE_THIRD_PARTY_PROTOBUF
-#ifdef GOOGLE_PROTOBUF_TEST_SOURCE_PATH
-  return GOOGLE_PROTOBUF_TEST_SOURCE_PATH;
-#else
 #ifndef _MSC_VER
   // automake sets the "srcdir" environment variable.
   char* result = getenv("srcdir");
@@ -95,7 +86,6 @@
     prefix += "/..";
   }
   return prefix + "/src";
-#endif  // GOOGLE_PROTOBUF_TEST_SOURCE_PATH
 #else
   return "third_party/protobuf/src";
 #endif  // GOOGLE_THIRD_PARTY_PROTOBUF
@@ -117,32 +107,14 @@
   char b[L_tmpnam + 1];     // HPUX multithread return 0 if s is 0
   string result = tmpnam(b);
 #ifdef _WIN32
-  // Avoid a trailing dot by changing it to an underscore. On Win32 the names of
-  // files and directories can, but should not, end with dot.
-  //
-  // In MS-DOS and FAT16 filesystem the filenames were 8dot3 style so it didn't
-  // make sense to have a name ending in dot without an extension, so the shell
-  // silently ignored trailing dots. To this day the Win32 API still maintains
-  // this behavior and silently ignores trailing dots in path arguments of
-  // functions such as CreateFile{A,W}. Even POSIX API function implementations
-  // seem to wrap the Win32 API functions (e.g. CreateDirectoryA) and behave
-  // this way.
-  // It's possible to avoid this behavior and create files / directories with
-  // trailing dots (using CreateFileW / CreateDirectoryW and prefixing the path
-  // with "\\?\") but these will be degenerate in the sense that you cannot
-  // chdir into such directories (or navigate into them with Windows Explorer)
-  // nor can you open such files with some programs (e.g. Notepad).
-  if (result[result.size() - 1] == '.') {
-    result[result.size() - 1] = '_';
-  }
   // On Win32, tmpnam() returns a file prefixed with '\', but which is supposed
   // to be used in the current working directory.  WTF?
   if (HasPrefixString(result, "\\")) {
     result.erase(0, 1);
   }
-  // The Win32 API accepts forward slashes as a path delimiter as long as the
-  // path doesn't use the "\\?\" prefix.
-  // Let's avoid confusion and use only forward slashes.
+  // The Win32 API accepts forward slashes as a path delimiter even though
+  // backslashes are standard.  Let's avoid confusion and use only forward
+  // slashes.
   result = StringReplace(result, "\\", "/", true);
 #endif  // _WIN32
   return result;
@@ -286,8 +258,6 @@
 struct ForceShutdown {
   ~ForceShutdown() {
     ShutdownProtobufLibrary();
-    // Test to shutdown the library twice, which should succeed.
-    ShutdownProtobufLibrary();
   }
 } force_shutdown;
 
diff --git a/src/google/protobuf/testing/googletest.h b/src/google/protobuf/testing/googletest.h
index 2db3bfe..c0d99e6 100644
--- a/src/google/protobuf/testing/googletest.h
+++ b/src/google/protobuf/testing/googletest.h
@@ -37,10 +37,9 @@
 #include <map>
 #include <vector>
 #include <google/protobuf/stubs/common.h>
-#include <gmock/gmock.h>
+
 // Disable death tests if we use exceptions in CHECK().
-#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) && \
-    !GTEST_OS_WINDOWS
+#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST)
 #define PROTOBUF_HAS_DEATH_TEST
 #endif
 
@@ -86,7 +85,7 @@
   const vector<string>& GetMessages(LogLevel error);
 
  private:
-  std::map<LogLevel, vector<string> > messages_;
+  map<LogLevel, vector<string> > messages_;
   LogHandler* old_handler_;
 
   static void HandleLog(LogLevel level, const char* filename, int line,
diff --git a/src/google/protobuf/testing/zcgunzip.cc b/src/google/protobuf/testing/zcgunzip.cc
index 349ad86..76f8cfe 100644
--- a/src/google/protobuf/testing/zcgunzip.cc
+++ b/src/google/protobuf/testing/zcgunzip.cc
@@ -72,10 +72,7 @@
     }
     if (inlen > 0) {
       int err = write(STDOUT_FILENO, inptr, inlen);
-      if (err != inlen) {
-        fprintf(stderr, "write unexpectedly returned %d.\n", err);
-        return 1;
-      }
+      assert(err == inlen);
     }
   }
 
diff --git a/src/google/protobuf/text_format.cc b/src/google/protobuf/text_format.cc
index eed2a76..c0dfd53 100644
--- a/src/google/protobuf/text_format.cc
+++ b/src/google/protobuf/text_format.cc
@@ -42,21 +42,20 @@
 
 #include <google/protobuf/text_format.h>
 
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/any.h>
-#include <google/protobuf/io/strtod.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/repeated_field.h>
-#include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/wire_format_lite.h>
+#include <google/protobuf/io/strtod.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/unknown_field_set.h>
+#include <google/protobuf/descriptor.pb.h>
+#include <google/protobuf/io/tokenizer.h>
+#include <google/protobuf/any.h>
+#include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/stubs/strutil.h>
-
 #include <google/protobuf/stubs/map_util.h>
 #include <google/protobuf/stubs/stl_util.h>
 
@@ -75,6 +74,18 @@
           (str[1] >= '0' && str[1] < '8'));
 }
 
+inline bool GetAnyFieldDescriptors(const Message& message,
+                                   const FieldDescriptor** type_url_field,
+                                   const FieldDescriptor** value_field) {
+    const Descriptor* descriptor = message.GetDescriptor();
+    *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
 
 string Message::DebugString() const {
@@ -143,7 +154,7 @@
     const FieldDescriptor* field) {
   // Owned by us in the map.
   TextFormat::ParseInfoTree* instance = new TextFormat::ParseInfoTree();
-  std::vector<TextFormat::ParseInfoTree*>* trees = &nested_[field];
+  vector<TextFormat::ParseInfoTree*>* trees = &nested_[field];
   GOOGLE_CHECK(trees);
   trees->push_back(instance);
   return instance;
@@ -166,7 +177,7 @@
   CheckFieldIndex(field, index);
   if (index == -1) { index = 0; }
 
-  const std::vector<TextFormat::ParseLocation>* locations =
+  const vector<TextFormat::ParseLocation>* locations =
       FindOrNull(locations_, field);
   if (locations == NULL || index >= locations->size()) {
     return TextFormat::ParseLocation();
@@ -180,8 +191,7 @@
   CheckFieldIndex(field, index);
   if (index == -1) { index = 0; }
 
-  const std::vector<TextFormat::ParseInfoTree*>* trees =
-      FindOrNull(nested_, field);
+  const vector<TextFormat::ParseInfoTree*>* trees = FindOrNull(nested_, field);
   if (trees == NULL || index >= trees->size()) {
     return NULL;
   }
@@ -224,8 +234,7 @@
              bool allow_unknown_field,
              bool allow_unknown_enum,
              bool allow_field_number,
-             bool allow_relaxed_whitespace,
-             bool allow_partial)
+             bool allow_relaxed_whitespace)
     : error_collector_(error_collector),
       finder_(finder),
       parse_info_tree_(parse_info_tree),
@@ -237,7 +246,6 @@
       allow_unknown_field_(allow_unknown_field),
       allow_unknown_enum_(allow_unknown_enum),
       allow_field_number_(allow_field_number),
-      allow_partial_(allow_partial),
       had_errors_(false) {
     // For backwards-compatibility with proto1, we need to allow the 'f' suffix
     // for floats.
@@ -365,7 +373,7 @@
     const Descriptor* descriptor = message->GetDescriptor();
 
     string field_name;
-    bool reserved_field = false;
+
     const FieldDescriptor* field = NULL;
     int start_line = tokenizer_.current().line;
     int start_column = tokenizer_.current().column;
@@ -383,16 +391,6 @@
       DO(ConsumeAnyValue(full_type_name,
                          message->GetDescriptor()->file()->pool(),
                          &serialized_value));
-      if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) {
-        // Fail if any_type_url_field has already been specified.
-        if ((!any_type_url_field->is_repeated() &&
-             reflection->HasField(*message, any_type_url_field)) ||
-            (!any_value_field->is_repeated() &&
-             reflection->HasField(*message, any_value_field))) {
-          ReportError("Non-repeated Any specified multiple times.");
-          return false;
-        }
-      }
       reflection->SetString(
           message, any_type_url_field,
           string(prefix + full_type_name));
@@ -427,8 +425,6 @@
       if (allow_field_number_ && safe_strto32(field_name, &field_number)) {
         if (descriptor->IsExtensionNumber(field_number)) {
           field = reflection->FindKnownExtensionByNumber(field_number);
-        } else if (descriptor->IsReservedNumber(field_number)) {
-          reserved_field = true;
         } else {
           field = descriptor->FindFieldByNumber(field_number);
         }
@@ -457,13 +453,9 @@
           LowerString(&lower_field_name);
           field = descriptor->FindFieldByLowercaseName(lower_field_name);
         }
-
-        if (field == NULL) {
-          reserved_field = descriptor->IsReservedName(field_name);
-        }
       }
 
-      if (field == NULL && !reserved_field) {
+      if (field == NULL) {
         if (!allow_unknown_field_) {
           ReportError("Message type \"" + descriptor->full_name() +
                       "\" has no field named \"" + field_name + "\".");
@@ -475,10 +467,9 @@
       }
     }
 
-    // Skips unknown or reserved fields.
+    // Skips unknown field.
     if (field == NULL) {
-      GOOGLE_CHECK(allow_unknown_field_ || reserved_field);
-
+      GOOGLE_CHECK(allow_unknown_field_);
       // Try to guess the type of this field.
       // If this field is not a message, there should be a ":" between the
       // field name and the field value and also the field value should not
@@ -515,42 +506,32 @@
     // Perform special handling for embedded message types.
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       // ':' is optional here.
-      bool consumed_semicolon = TryConsume(":");
-      if (consumed_semicolon && field->options().weak() && LookingAtType(io::Tokenizer::TYPE_STRING)) {
-        // we are getting a bytes string for a weak field.
-        string tmp;
-        DO(ConsumeString(&tmp));
-        reflection->MutableMessage(message, field)->ParseFromString(tmp);
-        goto label_skip_parsing;
-      }
+      TryConsume(":");
     } else {
       // ':' is required here.
       DO(Consume(":"));
     }
 
     if (field->is_repeated() && TryConsume("[")) {
-      // Short repeated format, e.g.  "foo: [1, 2, 3]".
-      if (!TryConsume("]")) {
-        // "foo: []" is treated as empty.
-        while (true) {
-          if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-            // Perform special handling for embedded message types.
-            DO(ConsumeFieldMessage(message, reflection, field));
-          } else {
-            DO(ConsumeFieldValue(message, reflection, field));
-          }
-          if (TryConsume("]")) {
-            break;
-          }
-          DO(Consume(","));
+      // Short repeated format, e.g.  "foo: [1, 2, 3]"
+      while (true) {
+        if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+          // Perform special handling for embedded message types.
+          DO(ConsumeFieldMessage(message, reflection, field));
+        } else {
+          DO(ConsumeFieldValue(message, reflection, field));
         }
+        if (TryConsume("]")) {
+          break;
+        }
+        DO(Consume(","));
       }
     } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       DO(ConsumeFieldMessage(message, reflection, field));
     } else {
       DO(ConsumeFieldValue(message, reflection, field));
     }
-label_skip_parsing:
+
     // For historical reasons, fields may optionally be separated by commas or
     // semicolons.
     TryConsume(";") || TryConsume(",");
@@ -737,8 +718,7 @@
           value = SimpleItoa(int_value);        // for error reporting
           enum_value = enum_type->FindValueByNumber(int_value);
         } else {
-          ReportError("Expected integer or identifier, got: " +
-                      tokenizer_.current().text);
+          ReportError("Expected integer or identifier.");
           return false;
         }
 
@@ -776,20 +756,6 @@
       }
       return true;
     }
-    if (TryConsume("[")) {
-      while (true) {
-        if (!LookingAt("{") && !LookingAt("<")) {
-          DO(SkipFieldValue());
-        } else {
-          DO(SkipFieldMessage());
-        }
-        if (TryConsume("]")) {
-          break;
-        }
-        DO(Consume(","));
-      }
-      return true;
-    }
     // Possible field values other than string:
     //   12345        => TYPE_INTEGER
     //   -12345       => TYPE_SYMBOL + TYPE_INTEGER
@@ -865,7 +831,7 @@
       return true;
     }
 
-    ReportError("Expected identifier, got: " + tokenizer_.current().text);
+    ReportError("Expected identifier.");
     return false;
   }
 
@@ -885,7 +851,7 @@
   // Returns false if the token is not of type STRING.
   bool ConsumeString(string* text) {
     if (!LookingAtType(io::Tokenizer::TYPE_STRING)) {
-      ReportError("Expected string, got: " + tokenizer_.current().text);
+      ReportError("Expected string.");
       return false;
     }
 
@@ -903,13 +869,13 @@
   // Returns false if the token is not of type INTEGER.
   bool ConsumeUnsignedInteger(uint64* value, uint64 max_value) {
     if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
-      ReportError("Expected integer, got: " + tokenizer_.current().text);
+      ReportError("Expected integer.");
       return false;
     }
 
     if (!io::Tokenizer::ParseInteger(tokenizer_.current().text,
                                      max_value, value)) {
-      ReportError("Integer out of range (" + tokenizer_.current().text + ")");
+      ReportError("Integer out of range.");
       return false;
     }
 
@@ -936,14 +902,10 @@
 
     DO(ConsumeUnsignedInteger(&unsigned_value, max_value));
 
+    *value = static_cast<int64>(unsigned_value);
+
     if (negative) {
-      if ((static_cast<uint64>(kint64max) + 1) == unsigned_value) {
-        *value = kint64min;
-      } else {
-        *value = -static_cast<int64>(unsigned_value);
-      }
-    } else {
-      *value = static_cast<int64>(unsigned_value);
+      *value = -*value;
     }
 
     return true;
@@ -953,18 +915,18 @@
   // Accepts decimal numbers only, rejects hex or oct numbers.
   bool ConsumeUnsignedDecimalInteger(uint64* value, uint64 max_value) {
     if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
-      ReportError("Expected integer, got: " + tokenizer_.current().text);
+      ReportError("Expected integer.");
       return false;
     }
 
     const string& text = tokenizer_.current().text;
     if (IsHexNumber(text) || IsOctNumber(text)) {
-      ReportError("Expect a decimal number, got: " + text);
+      ReportError("Expect a decimal number.");
       return false;
     }
 
     if (!io::Tokenizer::ParseInteger(text, max_value, value)) {
-      ReportError("Integer out of range (" + text + ")");
+      ReportError("Integer out of range.");
       return false;
     }
 
@@ -1009,11 +971,11 @@
         *value = std::numeric_limits<double>::quiet_NaN();
         tokenizer_.Next();
       } else {
-        ReportError("Expected double, got: " + text);
+        ReportError("Expected double.");
         return false;
       }
     } else {
-      ReportError("Expected double, got: " + tokenizer_.current().text);
+      ReportError("Expected double.");
       return false;
     }
 
@@ -1071,17 +1033,7 @@
     DO(ConsumeMessageDelimiter(&sub_delimiter));
     DO(ConsumeMessage(value.get(), sub_delimiter));
 
-    if (allow_partial_) {
-      value->AppendPartialToString(serialized_value);
-    } else {
-      if (!value->IsInitialized()) {
-        ReportError(
-            "Value of type \"" + full_type_name +
-            "\" stored in google.protobuf.Any has missing required fields");
-        return false;
-      }
-      value->AppendToString(serialized_value);
-    }
+    value->AppendToString(serialized_value);
     return true;
   }
 
@@ -1146,7 +1098,6 @@
   const bool allow_unknown_field_;
   const bool allow_unknown_enum_;
   const bool allow_field_number_;
-  const bool allow_partial_;
   bool had_errors_;
 };
 
@@ -1155,8 +1106,7 @@
 // ===========================================================================
 // Internal class for writing text to the io::ZeroCopyOutputStream. Adapted
 // from the Printer found in //google/protobuf/io/printer.h
-class TextFormat::Printer::TextGenerator
-    : public TextFormat::BaseTextGenerator {
+class TextFormat::Printer::TextGenerator {
  public:
   explicit TextGenerator(io::ZeroCopyOutputStream* output,
                          int initial_indent_level)
@@ -1165,8 +1115,9 @@
       buffer_size_(0),
       at_start_of_line_(true),
       failed_(false),
-      indent_level_(initial_indent_level),
+      indent_(""),
       initial_indent_level_(initial_indent_level) {
+    indent_.resize(initial_indent_level_ * 2, ' ');
   }
 
   ~TextGenerator() {
@@ -1181,45 +1132,50 @@
   // inserted at the beginning of each line of text.  Indent() may be called
   // multiple times to produce deeper indents.
   void Indent() {
-    ++indent_level_;
+    indent_ += "  ";
   }
 
   // Reduces the current indent level by two spaces, or crashes if the indent
   // level is zero.
   void Outdent() {
-    if (indent_level_ == 0 ||
-        indent_level_ < initial_indent_level_) {
+    if (indent_.empty() ||
+        indent_.size() < initial_indent_level_ * 2) {
       GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent().";
       return;
     }
 
-    --indent_level_;
+    indent_.resize(indent_.size() - 2);
+  }
+
+  // Print text to the output stream.
+  void Print(const string& str) {
+    Print(str.data(), str.size());
+  }
+
+  // Print text to the output stream.
+  void Print(const char* text) {
+    Print(text, strlen(text));
   }
 
   // Print text to the output stream.
   void Print(const char* text, size_t size) {
-    if (indent_level_ > 0) {
-      size_t pos = 0;  // The number of bytes we've written so far.
-      for (size_t i = 0; i < size; i++) {
-        if (text[i] == '\n') {
-          // Saw newline.  If there is more text, we may need to insert an
-          // indent here.  So, write what we have so far, including the '\n'.
-          Write(text + pos, i - pos + 1);
-          pos = i + 1;
+    size_t pos = 0;  // The number of bytes we've written so far.
 
-          // Setting this true will cause the next Write() to insert an indent
-          // first.
-          at_start_of_line_ = true;
-        }
-      }
-      // Write the rest.
-      Write(text + pos, size - pos);
-    } else {
-      Write(text, size);
-      if (size > 0 && text[size - 1] == '\n') {
+    for (size_t i = 0; i < size; i++) {
+      if (text[i] == '\n') {
+        // Saw newline.  If there is more text, we may need to insert an indent
+        // here.  So, write what we have so far, including the '\n'.
+        Write(text + pos, i - pos + 1);
+        pos = i + 1;
+
+        // Setting this true will cause the next Write() to insert an indent
+        // first.
         at_start_of_line_ = true;
       }
     }
+
+    // Write the rest.
+    Write(text + pos, size - pos);
   }
 
   // True if any write to the underlying stream failed.  (We don't just
@@ -1237,19 +1193,17 @@
     if (at_start_of_line_) {
       // Insert an indent.
       at_start_of_line_ = false;
-      WriteIndent();
+      Write(indent_.data(), indent_.size());
       if (failed_) return;
     }
 
     while (size > buffer_size_) {
       // Data exceeds space in the buffer.  Copy what we can and request a
       // new buffer.
-      if (buffer_size_ > 0) {
-        memcpy(buffer_, data, buffer_size_);
-        data += buffer_size_;
-        size -= buffer_size_;
-      }
-      void* void_buffer = NULL;
+      memcpy(buffer_, data, buffer_size_);
+      data += buffer_size_;
+      size -= buffer_size_;
+      void* void_buffer;
       failed_ = !output_->Next(&void_buffer, &buffer_size_);
       if (failed_) return;
       buffer_ = reinterpret_cast<char*>(void_buffer);
@@ -1261,35 +1215,13 @@
     buffer_size_ -= size;
   }
 
-  void WriteIndent() {
-    if (indent_level_ == 0) { return; }
-    GOOGLE_DCHECK(!failed_);
-    int size = 2 * indent_level_;
-
-    while (size > buffer_size_) {
-      // Data exceeds space in the buffer. Write what we can and request a new
-      // buffer.
-      memset(buffer_, ' ', buffer_size_);
-      size -= buffer_size_;
-      void* void_buffer;
-      failed_ = !output_->Next(&void_buffer, &buffer_size_);
-      if (failed_) return;
-      buffer_ = reinterpret_cast<char*>(void_buffer);
-    }
-
-    // Buffer is big enough to receive the data; copy it.
-    memset(buffer_, ' ', size);
-    buffer_ += size;
-    buffer_size_ -= size;
-  }
-
   io::ZeroCopyOutputStream* const output_;
   char* buffer_;
   int buffer_size_;
   bool at_start_of_line_;
   bool failed_;
 
-  int indent_level_;
+  string indent_;
   int initial_indent_level_;
 };
 
@@ -1327,7 +1259,7 @@
                     overwrites_policy,
                     allow_case_insensitive_field_, allow_unknown_field_,
                     allow_unknown_enum_, allow_field_number_,
-                    allow_relaxed_whitespace_, allow_partial_);
+                    allow_relaxed_whitespace_);
   return MergeUsingImpl(input, output, &parser);
 }
 
@@ -1337,7 +1269,6 @@
   return Parse(&input_stream, output);
 }
 
-
 bool TextFormat::Parser::Merge(io::ZeroCopyInputStream* input,
                                Message* output) {
   ParserImpl parser(output->GetDescriptor(), input, error_collector_,
@@ -1345,7 +1276,7 @@
                     ParserImpl::ALLOW_SINGULAR_OVERWRITES,
                     allow_case_insensitive_field_, allow_unknown_field_,
                     allow_unknown_enum_, allow_field_number_,
-                    allow_relaxed_whitespace_, allow_partial_);
+                    allow_relaxed_whitespace_);
   return MergeUsingImpl(input, output, &parser);
 }
 
@@ -1355,13 +1286,12 @@
   return Merge(&input_stream, output);
 }
 
-
 bool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* /* input */,
                                         Message* output,
                                         ParserImpl* parser_impl) {
   if (!parser_impl->Parse(output)) return false;
   if (!allow_partial_ && !output->IsInitialized()) {
-    std::vector<string> missing_fields;
+    vector<string> missing_fields;
     output->FindInitializationErrors(&missing_fields);
     parser_impl->ReportError(-1, 0, "Message missing required fields: " +
                                         Join(missing_fields, ", "));
@@ -1380,7 +1310,7 @@
                     ParserImpl::ALLOW_SINGULAR_OVERWRITES,
                     allow_case_insensitive_field_, allow_unknown_field_,
                     allow_unknown_enum_, allow_field_number_,
-                    allow_relaxed_whitespace_, allow_partial_);
+                    allow_relaxed_whitespace_);
   return parser.ParseField(field, output);
 }
 
@@ -1404,277 +1334,92 @@
   return Parser().MergeFromString(input, output);
 }
 
-
 // ===========================================================================
 
-TextFormat::BaseTextGenerator::~BaseTextGenerator() {}
-
-namespace {
-
-// A BaseTextGenerator that writes to a string.
-class StringBaseTextGenerator : public TextFormat::BaseTextGenerator {
- public:
-  void Print(const char* text, size_t size) { output_.append(text, size); }
-
-// Some compilers do not support ref-qualifiers even in C++11 mode.
-// Disable the optimization for now and revisit it later.
-#if 0 // LANG_CXX11
-  string Consume() && { return std::move(output_); }
-#else   // !LANG_CXX11
-  const string& Get() { return output_; }
-#endif  // LANG_CXX11
-
- private:
-  string output_;
-};
-
-}  // namespace
-
-// The default implementation for FieldValuePrinter. We just delegate the
-// implementation to the default FastFieldValuePrinter to avoid duplicating the
-// logic.
+// The default implementation for FieldValuePrinter. The base class just
+// does simple formatting. That way, deriving classes could decide to fallback
+// to that behavior.
 TextFormat::FieldValuePrinter::FieldValuePrinter() {}
 TextFormat::FieldValuePrinter::~FieldValuePrinter() {}
-
-#if 0 // LANG_CXX11
-#define FORWARD_IMPL(fn, ...)            \
-  StringBaseTextGenerator generator;     \
-  delegate_.fn(__VA_ARGS__, &generator); \
-  return std::move(generator).Consume()
-#else  // !LANG_CXX11
-#define FORWARD_IMPL(fn, ...)            \
-  StringBaseTextGenerator generator;     \
-  delegate_.fn(__VA_ARGS__, &generator); \
-  return generator.Get()
-#endif  // LANG_CXX11
-
 string TextFormat::FieldValuePrinter::PrintBool(bool val) const {
-  FORWARD_IMPL(PrintBool, val);
+  return val ? "true" : "false";
 }
 string TextFormat::FieldValuePrinter::PrintInt32(int32 val) const {
-  FORWARD_IMPL(PrintInt32, val);
+  return SimpleItoa(val);
 }
 string TextFormat::FieldValuePrinter::PrintUInt32(uint32 val) const {
-  FORWARD_IMPL(PrintUInt32, val);
+  return SimpleItoa(val);
 }
 string TextFormat::FieldValuePrinter::PrintInt64(int64 val) const {
-  FORWARD_IMPL(PrintInt64, val);
+  return SimpleItoa(val);
 }
 string TextFormat::FieldValuePrinter::PrintUInt64(uint64 val) const {
-  FORWARD_IMPL(PrintUInt64, val);
+  return SimpleItoa(val);
 }
 string TextFormat::FieldValuePrinter::PrintFloat(float val) const {
-  FORWARD_IMPL(PrintFloat, val);
+  return SimpleFtoa(val);
 }
 string TextFormat::FieldValuePrinter::PrintDouble(double val) const {
-  FORWARD_IMPL(PrintDouble, val);
+  return SimpleDtoa(val);
 }
 string TextFormat::FieldValuePrinter::PrintString(const string& val) const {
-  FORWARD_IMPL(PrintString, val);
+  string printed("\"");
+  CEscapeAndAppend(val, &printed);
+  printed.push_back('\"');
+  return printed;
 }
 string TextFormat::FieldValuePrinter::PrintBytes(const string& val) const {
   return PrintString(val);
 }
 string TextFormat::FieldValuePrinter::PrintEnum(int32 val,
                                                 const string& name) const {
-  FORWARD_IMPL(PrintEnum, val, name);
+  return name;
 }
 string TextFormat::FieldValuePrinter::PrintFieldName(
     const Message& message,
     const Reflection* reflection,
     const FieldDescriptor* field) const {
-  FORWARD_IMPL(PrintFieldName, message, reflection, field);
+  if (field->is_extension()) {
+    // We special-case MessageSet elements for compatibility with proto1.
+    if (field->containing_type()->options().message_set_wire_format()
+        && field->type() == FieldDescriptor::TYPE_MESSAGE
+        && field->is_optional()
+        && field->extension_scope() == field->message_type()) {
+      return StrCat("[", field->message_type()->full_name(), "]");
+    } else {
+      return StrCat("[", field->full_name(), "]");
+    }
+  } else if (field->type() == FieldDescriptor::TYPE_GROUP) {
+    // Groups must be serialized with their original capitalization.
+    return field->message_type()->name();
+  } else {
+    return field->name();
+  }
 }
 string TextFormat::FieldValuePrinter::PrintMessageStart(
     const Message& message,
     int field_index,
     int field_count,
     bool single_line_mode) const {
-  FORWARD_IMPL(PrintMessageStart, message, field_index, field_count,
-               single_line_mode);
+  return single_line_mode ? " { " : " {\n";
 }
 string TextFormat::FieldValuePrinter::PrintMessageEnd(
     const Message& message,
     int field_index,
     int field_count,
     bool single_line_mode) const {
-  FORWARD_IMPL(PrintMessageEnd, message, field_index, field_count,
-               single_line_mode);
-}
-#undef FORWARD_IMPL
-
-TextFormat::FastFieldValuePrinter::FastFieldValuePrinter() {}
-TextFormat::FastFieldValuePrinter::~FastFieldValuePrinter() {}
-void TextFormat::FastFieldValuePrinter::PrintBool(
-    bool val, BaseTextGenerator* generator) const {
-  if (val) {
-    generator->PrintLiteral("true");
-  } else {
-    generator->PrintLiteral("false");
-  }
-}
-void TextFormat::FastFieldValuePrinter::PrintInt32(
-    int32 val, BaseTextGenerator* generator) const {
-  generator->PrintString(SimpleItoa(val));
-}
-void TextFormat::FastFieldValuePrinter::PrintUInt32(
-    uint32 val, BaseTextGenerator* generator) const {
-  generator->PrintString(SimpleItoa(val));
-}
-void TextFormat::FastFieldValuePrinter::PrintInt64(
-    int64 val, BaseTextGenerator* generator) const {
-  generator->PrintString(SimpleItoa(val));
-}
-void TextFormat::FastFieldValuePrinter::PrintUInt64(
-    uint64 val, BaseTextGenerator* generator) const {
-  generator->PrintString(SimpleItoa(val));
-}
-void TextFormat::FastFieldValuePrinter::PrintFloat(
-    float val, BaseTextGenerator* generator) const {
-  generator->PrintString(SimpleFtoa(val));
-}
-void TextFormat::FastFieldValuePrinter::PrintDouble(
-    double val, BaseTextGenerator* generator) const {
-  generator->PrintString(SimpleDtoa(val));
-}
-void TextFormat::FastFieldValuePrinter::PrintEnum(
-    int32 val, const string& name, BaseTextGenerator* generator) const {
-  generator->PrintString(name);
-}
-
-void TextFormat::FastFieldValuePrinter::PrintString(
-    const string& val, BaseTextGenerator* generator) const {
-  generator->PrintLiteral("\"");
-  generator->PrintString(CEscape(val));
-  generator->PrintLiteral("\"");
-}
-void TextFormat::FastFieldValuePrinter::PrintBytes(
-    const string& val, BaseTextGenerator* generator) const {
-  PrintString(val, generator);
-}
-void TextFormat::FastFieldValuePrinter::PrintFieldName(
-    const Message& message, const Reflection* reflection,
-    const FieldDescriptor* field, BaseTextGenerator* generator) const {
-  if (field->is_extension()) {
-    generator->PrintLiteral("[");
-    // We special-case MessageSet elements for compatibility with proto1.
-    if (field->containing_type()->options().message_set_wire_format() &&
-        field->type() == FieldDescriptor::TYPE_MESSAGE &&
-        field->is_optional() &&
-        field->extension_scope() == field->message_type()) {
-      generator->PrintString(field->message_type()->full_name());
-    } else {
-      generator->PrintString(field->full_name());
-    }
-    generator->PrintLiteral("]");
-  } else if (field->type() == FieldDescriptor::TYPE_GROUP) {
-    // Groups must be serialized with their original capitalization.
-    generator->PrintString(field->message_type()->name());
-  } else {
-    generator->PrintString(field->name());
-  }
-}
-void TextFormat::FastFieldValuePrinter::PrintMessageStart(
-    const Message& message, int field_index, int field_count,
-    bool single_line_mode, BaseTextGenerator* generator) const {
-  if (single_line_mode) {
-    generator->PrintLiteral(" { ");
-  } else {
-    generator->PrintLiteral(" {\n");
-  }
-}
-void TextFormat::FastFieldValuePrinter::PrintMessageEnd(
-    const Message& message, int field_index, int field_count,
-    bool single_line_mode, BaseTextGenerator* generator) const {
-  if (single_line_mode) {
-    generator->PrintLiteral("} ");
-  } else {
-    generator->PrintLiteral("}\n");
-  }
+  return single_line_mode ? "} " : "}\n";
 }
 
 namespace {
-
-// A legacy compatibility wrapper. Takes ownership of the delegate.
-class FieldValuePrinterWrapper : public TextFormat::FastFieldValuePrinter {
- public:
-  explicit FieldValuePrinterWrapper(
-      const TextFormat::FieldValuePrinter* delegate)
-      : delegate_(delegate) {}
-
-  void SetDelegate(const TextFormat::FieldValuePrinter* delegate) {
-    delegate_.reset(delegate);
-  }
-
-  void PrintBool(bool val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintBool(val));
-  }
-  void PrintInt32(int32 val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintInt32(val));
-  }
-  void PrintUInt32(uint32 val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintUInt32(val));
-  }
-  void PrintInt64(int64 val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintInt64(val));
-  }
-  void PrintUInt64(uint64 val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintUInt64(val));
-  }
-  void PrintFloat(float val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintFloat(val));
-  }
-  void PrintDouble(double val, TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintDouble(val));
-  }
-  void PrintString(const string& val,
-                   TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintString(val));
-  }
-  void PrintBytes(const string& val,
-                  TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintBytes(val));
-  }
-  void PrintEnum(int32 val, const string& name,
-                 TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintEnum(val, name));
-  }
-  void PrintFieldName(const Message& message, const Reflection* reflection,
-                      const FieldDescriptor* field,
-                      TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(
-        delegate_->PrintFieldName(message, reflection, field));
-  }
-  void PrintMessageStart(const Message& message, int field_index,
-                         int field_count, bool single_line_mode,
-                         TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintMessageStart(
-        message, field_index, field_count, single_line_mode));
-  }
-  void PrintMessageEnd(const Message& message, int field_index, int field_count,
-                       bool single_line_mode,
-                       TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintString(delegate_->PrintMessageEnd(
-        message, field_index, field_count, single_line_mode));
-  }
-
- private:
-  google::protobuf::scoped_ptr<const TextFormat::FieldValuePrinter> delegate_;
-};
-
 // Our own specialization: for UTF8 escaped strings.
-class FastFieldValuePrinterUtf8Escaping
-    : public TextFormat::FastFieldValuePrinter {
+class FieldValuePrinterUtf8Escaping : public TextFormat::FieldValuePrinter {
  public:
-  void PrintString(const string& val,
-                   TextFormat::BaseTextGenerator* generator) const {
-    generator->PrintLiteral("\"");
-    generator->PrintString(strings::Utf8SafeCEscape(val));
-    generator->PrintLiteral("\"");
+  virtual string PrintString(const string& val) const {
+    return StrCat("\"", strings::Utf8SafeCEscape(val), "\"");
   }
-  void PrintBytes(const string& val,
-                  TextFormat::BaseTextGenerator* generator) const {
-    return FastFieldValuePrinter::PrintString(val, generator);
+  virtual string PrintBytes(const string& val) const {
+    return TextFormat::FieldValuePrinter::PrintString(val);
   }
 };
 
@@ -1697,39 +1442,19 @@
 }
 
 void TextFormat::Printer::SetUseUtf8StringEscaping(bool as_utf8) {
-  SetDefaultFieldValuePrinter(as_utf8 ? new FastFieldValuePrinterUtf8Escaping()
-                                      : new FastFieldValuePrinter());
+  SetDefaultFieldValuePrinter(as_utf8
+                              ? new FieldValuePrinterUtf8Escaping()
+                              : new FieldValuePrinter());
 }
 
 void TextFormat::Printer::SetDefaultFieldValuePrinter(
     const FieldValuePrinter* printer) {
-  default_field_value_printer_.reset(new FieldValuePrinterWrapper(printer));
-}
-
-void TextFormat::Printer::SetDefaultFieldValuePrinter(
-    const FastFieldValuePrinter* printer) {
   default_field_value_printer_.reset(printer);
 }
 
 bool TextFormat::Printer::RegisterFieldValuePrinter(
     const FieldDescriptor* field,
     const FieldValuePrinter* printer) {
-  if (field == NULL || printer == NULL) {
-    return false;
-  }
-  FieldValuePrinterWrapper* const wrapper =
-      new FieldValuePrinterWrapper(NULL);
-  if (custom_printers_.insert(std::make_pair(field, wrapper)).second) {
-    wrapper->SetDelegate(printer);
-    return true;
-  } else {
-    delete wrapper;
-    return false;
-  }
-}
-
-bool TextFormat::Printer::RegisterFieldValuePrinter(
-    const FieldDescriptor* field, const FastFieldValuePrinter* printer) {
   return field != NULL && printer != NULL &&
          custom_printers_.insert(std::make_pair(field, printer)).second;
 }
@@ -1758,7 +1483,7 @@
                                 io::ZeroCopyOutputStream* output) const {
   TextGenerator generator(output, initial_indent_level_);
 
-  Print(message, &generator);
+  Print(message, generator);
 
   // Output false if the generator failed internally.
   return !generator.failed();
@@ -1769,7 +1494,7 @@
     io::ZeroCopyOutputStream* output) const {
   TextGenerator generator(output, initial_indent_level_);
 
-  PrintUnknownFields(unknown_fields, &generator);
+  PrintUnknownFields(unknown_fields, generator);
 
   // Output false if the generator failed internally.
   return !generator.failed();
@@ -1787,7 +1512,7 @@
 }  // namespace
 
 bool TextFormat::Printer::PrintAny(const Message& message,
-                                   TextGenerator* generator) const {
+                                   TextGenerator& generator) const {
   const FieldDescriptor* type_url_field;
   const FieldDescriptor* value_field;
   if (!internal::GetAnyFieldDescriptors(message, &type_url_field,
@@ -1820,28 +1545,27 @@
     GOOGLE_LOG(WARNING) << type_url << ": failed to parse contents";
     return false;
   }
-  generator->PrintLiteral("[");
-  generator->PrintString(type_url);
-  generator->PrintLiteral("]");
-  const FastFieldValuePrinter* printer = FindWithDefault(
+  generator.Print(StrCat("[", type_url, "]"));
+  const FieldValuePrinter* printer = FindWithDefault(
       custom_printers_, value_field, default_field_value_printer_.get());
-  printer->PrintMessageStart(message, -1, 0, single_line_mode_, generator);
-  generator->Indent();
+  generator.Print(
+      printer->PrintMessageStart(message, -1, 0, single_line_mode_));
+  generator.Indent();
   Print(*value_message, generator);
-  generator->Outdent();
-  printer->PrintMessageEnd(message, -1, 0, single_line_mode_, generator);
+  generator.Outdent();
+  generator.Print(printer->PrintMessageEnd(message, -1, 0, single_line_mode_));
   return true;
 }
 
 void TextFormat::Printer::Print(const Message& message,
-                                TextGenerator* generator) const {
+                                TextGenerator& generator) const {
   const Descriptor* descriptor = message.GetDescriptor();
   const Reflection* reflection = message.GetReflection();
   if (descriptor->full_name() == internal::kAnyFullTypeName && expand_any_ &&
       PrintAny(message, generator)) {
     return;
   }
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   reflection->ListFields(message, &fields);
   if (print_message_fields_in_index_order_) {
     std::sort(fields.begin(), fields.end(), FieldIndexSorter());
@@ -1866,13 +1590,61 @@
   io::StringOutputStream output_stream(output);
   TextGenerator generator(&output_stream, initial_indent_level_);
 
-  PrintFieldValue(message, message.GetReflection(), field, index, &generator);
+  PrintFieldValue(message, message.GetReflection(), field, index, generator);
 }
 
+class MapEntryMessageComparator {
+ public:
+  explicit MapEntryMessageComparator(const Descriptor* descriptor)
+      : field_(descriptor->field(0)) {}
+
+  bool operator()(const Message* a, const Message* b) {
+    const Reflection* reflection = a->GetReflection();
+    switch (field_->cpp_type()) {
+      case FieldDescriptor::CPPTYPE_BOOL: {
+          bool first = reflection->GetBool(*a, field_);
+          bool second = reflection->GetBool(*b, field_);
+          return first < second;
+      }
+      case FieldDescriptor::CPPTYPE_INT32: {
+          int32 first = reflection->GetInt32(*a, field_);
+          int32 second = reflection->GetInt32(*b, field_);
+          return first < second;
+      }
+      case FieldDescriptor::CPPTYPE_INT64: {
+          int64 first = reflection->GetInt64(*a, field_);
+          int64 second = reflection->GetInt64(*b, field_);
+          return first < second;
+      }
+      case FieldDescriptor::CPPTYPE_UINT32: {
+          uint32 first = reflection->GetUInt32(*a, field_);
+          uint32 second = reflection->GetUInt32(*b, field_);
+          return first < second;
+      }
+      case FieldDescriptor::CPPTYPE_UINT64: {
+          uint64 first = reflection->GetUInt64(*a, field_);
+          uint64 second = reflection->GetUInt64(*b, field_);
+          return first < second;
+      }
+      case FieldDescriptor::CPPTYPE_STRING: {
+          string first = reflection->GetString(*a, field_);
+          string second = reflection->GetString(*b, field_);
+          return first < second;
+      }
+      default:
+        GOOGLE_LOG(DFATAL) << "Invalid key for map field.";
+        return true;
+    }
+  }
+
+ private:
+  const FieldDescriptor* field_;
+};
+
 void TextFormat::Printer::PrintField(const Message& message,
                                      const Reflection* reflection,
                                      const FieldDescriptor* field,
-                                     TextGenerator* generator) const {
+                                     TextGenerator& generator) const {
   if (use_short_repeated_primitives_ &&
       field->is_repeated() &&
       field->cpp_type() != FieldDescriptor::CPPTYPE_STRING &&
@@ -1889,10 +1661,19 @@
     count = 1;
   }
 
-  std::vector<const Message*> map_entries;
-  const bool is_map = field->is_map();
-  if (is_map) {
-    map_entries = DynamicMapSorter::Sort(message, count, reflection, field);
+  std::vector<const Message*> sorted_map_field;
+  if (field->is_map()) {
+    const RepeatedPtrField<Message>& map_field =
+        reflection->GetRepeatedPtrField<Message>(message, field);
+    for (RepeatedPtrField<Message>::const_pointer_iterator it =
+             map_field.pointer_begin();
+         it != map_field.pointer_end(); ++it) {
+      sorted_map_field.push_back(*it);
+    }
+
+    MapEntryMessageComparator comparator(field->message_type());
+    std::stable_sort(sorted_map_field.begin(), sorted_map_field.end(),
+                     comparator);
   }
 
   for (int j = 0; j < count; ++j) {
@@ -1901,88 +1682,93 @@
     PrintFieldName(message, reflection, field, generator);
 
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      const FastFieldValuePrinter* printer = FindWithDefault(
+      const FieldValuePrinter* printer = FindWithDefault(
           custom_printers_, field, default_field_value_printer_.get());
       const Message& sub_message =
           field->is_repeated()
-              ? (is_map ? *map_entries[j]
-                        : reflection->GetRepeatedMessage(message, field, j))
+              ? (field->is_map()
+                     ? *sorted_map_field[j]
+                     : reflection->GetRepeatedMessage(message, field, j))
               : reflection->GetMessage(message, field);
-      printer->PrintMessageStart(sub_message, field_index, count,
-                                 single_line_mode_, generator);
-      generator->Indent();
+      generator.Print(
+          printer->PrintMessageStart(
+              sub_message, field_index, count, single_line_mode_));
+      generator.Indent();
       Print(sub_message, generator);
-      generator->Outdent();
-      printer->PrintMessageEnd(sub_message, field_index, count,
-                               single_line_mode_, generator);
+      generator.Outdent();
+      generator.Print(
+          printer->PrintMessageEnd(
+              sub_message, field_index, count, single_line_mode_));
     } else {
-      generator->PrintLiteral(": ");
+      generator.Print(": ");
       // Write the field value.
       PrintFieldValue(message, reflection, field, field_index, generator);
       if (single_line_mode_) {
-        generator->PrintLiteral(" ");
+        generator.Print(" ");
       } else {
-        generator->PrintLiteral("\n");
+        generator.Print("\n");
       }
     }
   }
 }
 
 void TextFormat::Printer::PrintShortRepeatedField(
-    const Message& message, const Reflection* reflection,
-    const FieldDescriptor* field, TextGenerator* generator) const {
+    const Message& message,
+    const Reflection* reflection,
+    const FieldDescriptor* field,
+    TextGenerator& generator) const {
   // Print primitive repeated field in short form.
   PrintFieldName(message, reflection, field, generator);
 
   int size = reflection->FieldSize(message, field);
-  generator->PrintLiteral(": [");
+  generator.Print(": [");
   for (int i = 0; i < size; i++) {
-    if (i > 0) generator->PrintLiteral(", ");
+    if (i > 0) generator.Print(", ");
     PrintFieldValue(message, reflection, field, i, generator);
   }
   if (single_line_mode_) {
-    generator->PrintLiteral("] ");
+    generator.Print("] ");
   } else {
-    generator->PrintLiteral("]\n");
+    generator.Print("]\n");
   }
 }
 
 void TextFormat::Printer::PrintFieldName(const Message& message,
                                          const Reflection* reflection,
                                          const FieldDescriptor* field,
-                                         TextGenerator* generator) const {
+                                         TextGenerator& generator) const {
   // if use_field_number_ is true, prints field number instead
   // of field name.
   if (use_field_number_) {
-    generator->PrintString(SimpleItoa(field->number()));
+    generator.Print(SimpleItoa(field->number()));
     return;
   }
 
-  const FastFieldValuePrinter* printer = FindWithDefault(
+  const FieldValuePrinter* printer = FindWithDefault(
       custom_printers_, field, default_field_value_printer_.get());
-  printer->PrintFieldName(message, reflection, field, generator);
+  generator.Print(printer->PrintFieldName(message, reflection, field));
 }
 
-void TextFormat::Printer::PrintFieldValue(const Message& message,
-                                          const Reflection* reflection,
-                                          const FieldDescriptor* field,
-                                          int index,
-                                          TextGenerator* generator) const {
+void TextFormat::Printer::PrintFieldValue(
+    const Message& message,
+    const Reflection* reflection,
+    const FieldDescriptor* field,
+    int index,
+    TextGenerator& generator) const {
   GOOGLE_DCHECK(field->is_repeated() || (index == -1))
       << "Index must be -1 for non-repeated fields";
 
-  const FastFieldValuePrinter* printer = FindWithDefault(
-      custom_printers_, field, default_field_value_printer_.get());
+  const FieldValuePrinter* printer
+      = FindWithDefault(custom_printers_, field,
+                        default_field_value_printer_.get());
 
   switch (field->cpp_type()) {
-#define OUTPUT_FIELD(CPPTYPE, METHOD)                                \
-  case FieldDescriptor::CPPTYPE_##CPPTYPE:                           \
-    printer->Print##METHOD(                                          \
-        field->is_repeated()                                         \
-            ? reflection->GetRepeated##METHOD(message, field, index) \
-            : reflection->Get##METHOD(message, field),               \
-        generator);                                                  \
-    break
+#define OUTPUT_FIELD(CPPTYPE, METHOD)                                   \
+    case FieldDescriptor::CPPTYPE_##CPPTYPE:                            \
+      generator.Print(printer->Print##METHOD(field->is_repeated()       \
+               ? reflection->GetRepeated##METHOD(message, field, index) \
+               : reflection->Get##METHOD(message, field)));             \
+        break
 
     OUTPUT_FIELD( INT32,  Int32);
     OUTPUT_FIELD( INT64,  Int64);
@@ -2008,10 +1794,10 @@
         value_to_print = &truncated_value;
       }
       if (field->type() == FieldDescriptor::TYPE_STRING) {
-        printer->PrintString(*value_to_print, generator);
+        generator.Print(printer->PrintString(*value_to_print));
       } else {
         GOOGLE_DCHECK_EQ(field->type(), FieldDescriptor::TYPE_BYTES);
-        printer->PrintBytes(*value_to_print, generator);
+        generator.Print(printer->PrintBytes(*value_to_print));
       }
       break;
     }
@@ -2023,7 +1809,7 @@
       const EnumValueDescriptor* enum_desc =
           field->enum_type()->FindValueByNumber(enum_value);
       if (enum_desc != NULL) {
-        printer->PrintEnum(enum_value, enum_desc->name(), generator);
+        generator.Print(printer->PrintEnum(enum_value, enum_desc->name()));
       } else {
         // Ordinarily, enum_desc should not be null, because proto2 has the
         // invariant that set enum field values must be in-range, but with the
@@ -2031,8 +1817,8 @@
         // it is possible for the user to force an unknown integer value.  So we
         // simply use the integer value itself as the enum value name in this
         // case.
-        printer->PrintEnum(enum_value, StringPrintf("%d", enum_value),
-                           generator);
+        generator.Print(printer->PrintEnum(enum_value,
+                                           StringPrintf("%d", enum_value)));
       }
       break;
     }
@@ -2095,93 +1881,90 @@
 }
 
 void TextFormat::Printer::PrintUnknownFields(
-    const UnknownFieldSet& unknown_fields, TextGenerator* generator) const {
+    const UnknownFieldSet& unknown_fields, TextGenerator& generator) const {
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
     string field_number = SimpleItoa(field.number());
 
     switch (field.type()) {
       case UnknownField::TYPE_VARINT:
-        generator->PrintString(field_number);
-        generator->PrintLiteral(": ");
-        generator->PrintString(SimpleItoa(field.varint()));
+        generator.Print(field_number);
+        generator.Print(": ");
+        generator.Print(SimpleItoa(field.varint()));
         if (single_line_mode_) {
-          generator->PrintLiteral(" ");
+          generator.Print(" ");
         } else {
-          generator->PrintLiteral("\n");
+          generator.Print("\n");
         }
         break;
       case UnknownField::TYPE_FIXED32: {
-        generator->PrintString(field_number);
-        generator->PrintLiteral(": 0x");
-        generator->PrintString(
+        generator.Print(field_number);
+        generator.Print(": 0x");
+        generator.Print(
             StrCat(strings::Hex(field.fixed32(), strings::ZERO_PAD_8)));
         if (single_line_mode_) {
-          generator->PrintLiteral(" ");
+          generator.Print(" ");
         } else {
-          generator->PrintLiteral("\n");
+          generator.Print("\n");
         }
         break;
       }
       case UnknownField::TYPE_FIXED64: {
-        generator->PrintString(field_number);
-        generator->PrintLiteral(": 0x");
-        generator->PrintString(
+        generator.Print(field_number);
+        generator.Print(": 0x");
+        generator.Print(
             StrCat(strings::Hex(field.fixed64(), strings::ZERO_PAD_16)));
         if (single_line_mode_) {
-          generator->PrintLiteral(" ");
+          generator.Print(" ");
         } else {
-          generator->PrintLiteral("\n");
+          generator.Print("\n");
         }
         break;
       }
       case UnknownField::TYPE_LENGTH_DELIMITED: {
-        generator->PrintString(field_number);
+        generator.Print(field_number);
         const string& value = field.length_delimited();
         UnknownFieldSet embedded_unknown_fields;
         if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) {
           // This field is parseable as a Message.
           // So it is probably an embedded message.
           if (single_line_mode_) {
-            generator->PrintLiteral(" { ");
+            generator.Print(" { ");
           } else {
-            generator->PrintLiteral(" {\n");
-            generator->Indent();
+            generator.Print(" {\n");
+            generator.Indent();
           }
           PrintUnknownFields(embedded_unknown_fields, generator);
           if (single_line_mode_) {
-            generator->PrintLiteral("} ");
+            generator.Print("} ");
           } else {
-            generator->Outdent();
-            generator->PrintLiteral("}\n");
+            generator.Outdent();
+            generator.Print("}\n");
           }
         } else {
           // This field is not parseable as a Message.
           // So it is probably just a plain string.
-          generator->PrintLiteral(": \"");
-          generator->PrintString(CEscape(value));
-          if (single_line_mode_) {
-            generator->PrintLiteral("\" ");
-          } else {
-            generator->PrintLiteral("\"\n");
-          }
+          string printed(": \"");
+          CEscapeAndAppend(value, &printed);
+          printed.append(single_line_mode_ ? "\" " : "\"\n");
+          generator.Print(printed);
         }
         break;
       }
       case UnknownField::TYPE_GROUP:
-        generator->PrintString(field_number);
+        generator.Print(field_number);
         if (single_line_mode_) {
-          generator->PrintLiteral(" { ");
+          generator.Print(" { ");
         } else {
-          generator->PrintLiteral(" {\n");
-          generator->Indent();
+          generator.Print(" {\n");
+          generator.Indent();
         }
         PrintUnknownFields(field.group(), generator);
         if (single_line_mode_) {
-          generator->PrintLiteral("} ");
+          generator.Print("} ");
         } else {
-          generator->Outdent();
-          generator->PrintLiteral("}\n");
+          generator.Outdent();
+          generator.Print("}\n");
         }
         break;
     }
diff --git a/src/google/protobuf/text_format.h b/src/google/protobuf/text_format.h
index a2670d6..ef3d4a8 100644
--- a/src/google/protobuf/text_format.h
+++ b/src/google/protobuf/text_format.h
@@ -49,7 +49,6 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/message_lite.h>
 
 namespace google {
 namespace protobuf {
@@ -66,22 +65,19 @@
 class LIBPROTOBUF_EXPORT TextFormat {
  public:
   // Outputs a textual representation of the given message to the given
-  // output stream. Returns false if printing fails.
+  // output stream.
   static bool Print(const Message& message, io::ZeroCopyOutputStream* output);
 
   // Print the fields in an UnknownFieldSet.  They are printed by tag number
   // only.  Embedded messages are heuristically identified by attempting to
-  // parse them. Returns false if printing fails.
+  // parse them.
   static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
                                  io::ZeroCopyOutputStream* output);
 
   // Like Print(), but outputs directly to a string.
-  // Note: output will be cleared prior to printing, and will be left empty
-  // even if printing fails. Returns false if printing fails.
   static bool PrintToString(const Message& message, string* output);
 
-  // Like PrintUnknownFields(), but outputs directly to a string. Returns false
-  // if printing fails.
+  // Like PrintUnknownFields(), but outputs directly to a string.
   static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
                                          string* output);
 
@@ -94,58 +90,12 @@
                                       int index,
                                       string* output);
 
-  class LIBPROTOBUF_EXPORT BaseTextGenerator {
-   public:
-    virtual ~BaseTextGenerator();
-    // Print text to the output stream.
-    virtual void Print(const char* text, size_t size) = 0;
-
-    void PrintString(const string& str) { Print(str.data(), str.size()); }
-
-    template <size_t n>
-    void PrintLiteral(const char (&text)[n]) {
-      Print(text, n - 1);  // n includes the terminating zero character.
-    }
-  };
-
-  // The default printer that converts scalar values from fields into their
-  // string representation.
-  // You can derive from this FastFieldValuePrinter if you want to have fields
-  // to be printed in a different way and register it at the Printer.
-  class LIBPROTOBUF_EXPORT FastFieldValuePrinter {
-   public:
-    FastFieldValuePrinter();
-    virtual ~FastFieldValuePrinter();
-    virtual void PrintBool(bool val, BaseTextGenerator* generator) const;
-    virtual void PrintInt32(int32 val, BaseTextGenerator* generator) const;
-    virtual void PrintUInt32(uint32 val, BaseTextGenerator* generator) const;
-    virtual void PrintInt64(int64 val, BaseTextGenerator* generator) const;
-    virtual void PrintUInt64(uint64 val, BaseTextGenerator* generator) const;
-    virtual void PrintFloat(float val, BaseTextGenerator* generator) const;
-    virtual void PrintDouble(double val, BaseTextGenerator* generator) const;
-    virtual void PrintString(const string& val,
-                             BaseTextGenerator* generator) const;
-    virtual void PrintBytes(const string& val,
-                            BaseTextGenerator* generator) const;
-    virtual void PrintEnum(int32 val, const string& name,
-                           BaseTextGenerator* generator) const;
-    virtual void PrintFieldName(const Message& message,
-                                const Reflection* reflection,
-                                const FieldDescriptor* field,
-                                BaseTextGenerator* generator) const;
-    virtual void PrintMessageStart(const Message& message, int field_index,
-                                   int field_count, bool single_line_mode,
-                                   BaseTextGenerator* generator) const;
-    virtual void PrintMessageEnd(const Message& message, int field_index,
-                                 int field_count, bool single_line_mode,
-                                 BaseTextGenerator* generator) const;
-
-   private:
-    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FastFieldValuePrinter);
-  };
-
-  class LIBPROTOBUF_EXPORT PROTOBUF_RUNTIME_DEPRECATED("Please use FastFieldValuePrinter")
-      FieldValuePrinter {
+  // The default printer that converts scalar values from fields into
+  // their string representation.
+  // You can derive from this FieldValuePrinter if you want to have
+  // fields to be printed in a different way and register it at the
+  // Printer.
+  class LIBPROTOBUF_EXPORT FieldValuePrinter {
    public:
     FieldValuePrinter();
     virtual ~FieldValuePrinter();
@@ -172,7 +122,6 @@
                                    bool single_line_mode) const;
 
    private:
-    FastFieldValuePrinter delegate_;
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldValuePrinter);
   };
 
@@ -211,7 +160,7 @@
       single_line_mode_ = single_line_mode;
     }
 
-    bool IsInSingleLineMode() const {
+    bool IsInSingleLineMode() {
       return single_line_mode_;
     }
 
@@ -232,13 +181,12 @@
     // Set true to output UTF-8 instead of ASCII.  The only difference
     // is that bytes >= 0x80 in string fields will not be escaped,
     // because they are assumed to be part of UTF-8 multi-byte
-    // sequences. This will change the default FastFieldValuePrinter.
+    // sequences. This will change the default FieldValuePrinter.
     void SetUseUtf8StringEscaping(bool as_utf8);
 
-    // Set the default (Fast)FieldValuePrinter that is used for all fields that
+    // Set the default FieldValuePrinter that is used for all fields that
     // don't have a field-specific printer registered.
     // Takes ownership of the printer.
-    void SetDefaultFieldValuePrinter(const FastFieldValuePrinter* printer);
     void SetDefaultFieldValuePrinter(const FieldValuePrinter* printer);
 
     // Sets whether we want to hide unknown fields or not.
@@ -283,15 +231,13 @@
       truncate_string_field_longer_than_ = truncate_string_field_longer_than;
     }
 
-    // Register a custom field-specific (Fast)FieldValuePrinter for fields
+    // Register a custom field-specific FieldValuePrinter for fields
     // with a particular FieldDescriptor.
     // Returns "true" if the registration succeeded, or "false", if there is
     // already a printer for that FieldDescriptor.
     // Takes ownership of the printer on successful registration.
     bool RegisterFieldValuePrinter(const FieldDescriptor* field,
                                    const FieldValuePrinter* printer);
-    bool RegisterFieldValuePrinter(const FieldDescriptor* field,
-                                   const FastFieldValuePrinter* printer);
 
    private:
     // Forward declaration of an internal class used to print the text
@@ -300,38 +246,43 @@
 
     // Internal Print method, used for writing to the OutputStream via
     // the TextGenerator class.
-    void Print(const Message& message, TextGenerator* generator) const;
+    void Print(const Message& message,
+               TextGenerator& generator) const;
 
     // Print a single field.
-    void PrintField(const Message& message, const Reflection* reflection,
+    void PrintField(const Message& message,
+                    const Reflection* reflection,
                     const FieldDescriptor* field,
-                    TextGenerator* generator) const;
+                    TextGenerator& generator) const;
 
     // Print a repeated primitive field in short form.
     void PrintShortRepeatedField(const Message& message,
                                  const Reflection* reflection,
                                  const FieldDescriptor* field,
-                                 TextGenerator* generator) const;
+                                 TextGenerator& generator) const;
 
     // Print the name of a field -- i.e. everything that comes before the
     // ':' for a single name/value pair.
-    void PrintFieldName(const Message& message, const Reflection* reflection,
+    void PrintFieldName(const Message& message,
+                        const Reflection* reflection,
                         const FieldDescriptor* field,
-                        TextGenerator* generator) const;
+                        TextGenerator& generator) const;
 
     // Outputs a textual representation of the value of the field supplied on
     // the message supplied or the default value if not set.
-    void PrintFieldValue(const Message& message, const Reflection* reflection,
-                         const FieldDescriptor* field, int index,
-                         TextGenerator* generator) const;
+    void PrintFieldValue(const Message& message,
+                         const Reflection* reflection,
+                         const FieldDescriptor* field,
+                         int index,
+                         TextGenerator& generator) const;
 
     // Print the fields in an UnknownFieldSet.  They are printed by tag number
     // only.  Embedded messages are heuristically identified by attempting to
     // parse them.
     void PrintUnknownFields(const UnknownFieldSet& unknown_fields,
-                            TextGenerator* generator) const;
+                            TextGenerator& generator) const;
 
-    bool PrintAny(const Message& message, TextGenerator* generator) const;
+    bool PrintAny(const Message& message, TextGenerator& generator) const;
 
     int initial_indent_level_;
 
@@ -349,9 +300,9 @@
 
     int64 truncate_string_field_longer_than_;
 
-    google::protobuf::scoped_ptr<const FastFieldValuePrinter> default_field_value_printer_;
-    typedef std::map<const FieldDescriptor*, const FastFieldValuePrinter*>
-        CustomPrinterMap;
+    google::protobuf::scoped_ptr<const FieldValuePrinter> default_field_value_printer_;
+    typedef map<const FieldDescriptor*,
+                const FieldValuePrinter*> CustomPrinterMap;
     CustomPrinterMap custom_printers_;
   };
 
@@ -440,13 +391,11 @@
     ParseInfoTree* CreateNested(const FieldDescriptor* field);
 
     // Defines the map from the index-th field descriptor to its parse location.
-    typedef std::map<const FieldDescriptor*,
-                     std::vector<ParseLocation> > LocationMap;
+    typedef map<const FieldDescriptor*, vector<ParseLocation> > LocationMap;
 
     // Defines the map from the index-th field descriptor to the nested parse
     // info tree.
-    typedef std::map<const FieldDescriptor*,
-                     std::vector<ParseInfoTree*> > NestedMap;
+    typedef map<const FieldDescriptor*, vector<ParseInfoTree*> > NestedMap;
 
     LocationMap locations_;
     NestedMap nested_;
diff --git a/src/google/protobuf/text_format_unittest.cc b/src/google/protobuf/text_format_unittest.cc
index f823bcb..58aa3f8 100644
--- a/src/google/protobuf/text_format_unittest.cc
+++ b/src/google/protobuf/text_format_unittest.cc
@@ -53,7 +53,6 @@
 #include <google/protobuf/unittest_mset_wire_format.pb.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/substitute.h>
 #include <google/protobuf/testing/googletest.h>
@@ -158,21 +157,7 @@
   TextFormat::Printer printer;
   printer.SetUseShortRepeatedPrimitives(true);
   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);
-
-  // 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));
+  printer.PrintToString(proto_, &text);
 
   EXPECT_EQ("optional_int32: 123\n"
             "repeated_int32: [456, 789]\n"
@@ -185,7 +170,7 @@
 
   // Try in single-line mode.
   printer.SetSingleLineMode(true);
-  EXPECT_TRUE(printer.PrintToString(proto_, &text));
+  printer.PrintToString(proto_, &text);
 
   EXPECT_EQ("optional_int32: 123 "
             "repeated_int32: [456, 789] "
@@ -455,29 +440,13 @@
   EXPECT_EQ("optional_int32: value-is(42)\nrepeated_int32: 42\n", text);
 }
 
-TEST_F(TextFormatTest, FieldSpecificCustomPrinterRegisterSameFieldTwice) {
-  protobuf_unittest::TestAllTypes message;
-  TextFormat::Printer printer;
-  const FieldDescriptor* const field =
-      message.GetDescriptor()->FindFieldByName("optional_int32");
-  ASSERT_TRUE(printer.RegisterFieldValuePrinter(
-      field, new CustomInt32FieldValuePrinter()));
-  const TextFormat::FieldValuePrinter* const rejected =
-      new CustomInt32FieldValuePrinter();
-  ASSERT_FALSE(printer.RegisterFieldValuePrinter(field, rejected));
-  delete rejected;
-}
-
 TEST_F(TextFormatTest, ErrorCasesRegisteringFieldValuePrinterShouldFail) {
   protobuf_unittest::TestAllTypes message;
   TextFormat::Printer printer;
   // NULL printer.
   EXPECT_FALSE(printer.RegisterFieldValuePrinter(
       message.GetDescriptor()->FindFieldByName("optional_int32"),
-      static_cast<const TextFormat::FieldValuePrinter*>(NULL)));
-  EXPECT_FALSE(printer.RegisterFieldValuePrinter(
-      message.GetDescriptor()->FindFieldByName("optional_int32"),
-      static_cast<const TextFormat::FastFieldValuePrinter*>(NULL)));
+      NULL));
   // Because registration fails, the ownership of this printer is never taken.
   TextFormat::FieldValuePrinter my_field_printer;
   // NULL field
@@ -690,87 +659,6 @@
   EXPECT_EQ(4, proto_.repeatedgroup(1).a());
 }
 
-TEST_F(TextFormatTest, ParseShortRepeatedWithTrailingComma) {
-  string parse_string = "repeated_int32: [456,]\n";
-  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
-  parse_string = "repeated_nested_enum: [  FOO , ]";
-  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
-  parse_string = "repeated_string: [ \"foo\", ]";
-  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
-  parse_string = "repeated_nested_message: [ { bb: 1 }, ]";
-  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
-  parse_string = "RepeatedGroup [{ a: 3 },]\n";
-}
-
-TEST_F(TextFormatTest, ParseShortRepeatedEmpty) {
-  string parse_string =
-      "repeated_int32: []\n"
-      "repeated_nested_enum: []\n"
-      "repeated_string: []\n"
-      "repeated_nested_message: []\n"
-      "RepeatedGroup []\n";
-
-  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));
-
-  EXPECT_EQ(0, proto_.repeated_int32_size());
-  EXPECT_EQ(0, proto_.repeated_nested_enum_size());
-  EXPECT_EQ(0, proto_.repeated_string_size());
-  EXPECT_EQ(0, proto_.repeated_nested_message_size());
-  EXPECT_EQ(0, proto_.repeatedgroup_size());
-}
-
-TEST_F(TextFormatTest, ParseShortRepeatedConcatenatedWithEmpty) {
-  string parse_string =
-      // Starting with empty [] should have no impact.
-      "repeated_int32: []\n"
-      "repeated_nested_enum: []\n"
-      "repeated_string: []\n"
-      "repeated_nested_message: []\n"
-      "RepeatedGroup []\n"
-      // Mixed short-form and long-form are simply concatenated.
-      "repeated_int32: 1\n"
-      "repeated_int32: [456, 789]\n"
-      "repeated_nested_enum: [  FOO ,BAR, # comment\n"
-      "                         3]\n"
-      // Note that while the printer won't print repeated strings in short-form,
-      // the parser will accept them.
-      "repeated_string: [ \"foo\", 'bar' ]\n"
-      // Repeated message
-      "repeated_nested_message: [ { bb: 1 }, { bb : 2 }]\n"
-      // Repeated group
-      "RepeatedGroup [{ a: 3 },{ a: 4 }]\n"
-      // Adding empty [] should have no impact.
-      "repeated_int32: []\n"
-      "repeated_nested_enum: []\n"
-      "repeated_string: []\n"
-      "repeated_nested_message: []\n"
-      "RepeatedGroup []\n";
-
-  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));
-
-  ASSERT_EQ(3, proto_.repeated_int32_size());
-  EXPECT_EQ(1, proto_.repeated_int32(0));
-  EXPECT_EQ(456, proto_.repeated_int32(1));
-  EXPECT_EQ(789, proto_.repeated_int32(2));
-
-  ASSERT_EQ(3, proto_.repeated_nested_enum_size());
-  EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0));
-  EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1));
-  EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2));
-
-  ASSERT_EQ(2, proto_.repeated_string_size());
-  EXPECT_EQ("foo", proto_.repeated_string(0));
-  EXPECT_EQ("bar", proto_.repeated_string(1));
-
-  ASSERT_EQ(2, proto_.repeated_nested_message_size());
-  EXPECT_EQ(1, proto_.repeated_nested_message(0).bb());
-  EXPECT_EQ(2, proto_.repeated_nested_message(1).bb());
-
-  ASSERT_EQ(2, proto_.repeatedgroup_size());
-  EXPECT_EQ(3, proto_.repeatedgroup(0).a());
-  EXPECT_EQ(4, proto_.repeatedgroup(1).a());
-}
-
 
 TEST_F(TextFormatTest, Comments) {
   // Test that comments are ignored.
@@ -1010,14 +898,10 @@
   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());
-  EXPECT_EQ(message.repeated_double(8),
-            std::numeric_limits<double>::infinity());
-  EXPECT_EQ(message.repeated_double(9),
-            -std::numeric_limits<double>::infinity());
-  EXPECT_EQ(message.repeated_double(10),
-            -std::numeric_limits<double>::infinity());
+  EXPECT_EQ(message.repeated_double(7), numeric_limits<double>::infinity());
+  EXPECT_EQ(message.repeated_double(8), numeric_limits<double>::infinity());
+  EXPECT_EQ(message.repeated_double(9), -numeric_limits<double>::infinity());
+  EXPECT_EQ(message.repeated_double(10), -numeric_limits<double>::infinity());
   EXPECT_TRUE(MathLimits<double>::IsNaN(message.repeated_double(11)));
   EXPECT_TRUE(MathLimits<double>::IsNaN(message.repeated_double(12)));
 
@@ -1312,13 +1196,11 @@
 
 
 TEST_F(TextFormatParserTest, InvalidToken) {
-  ExpectFailure("optional_bool: true\n-5\n", "Expected identifier, got: -",
+  ExpectFailure("optional_bool: true\n-5\n", "Expected identifier.",
                 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.", 1, 20);
+  ExpectFailure("\"some string\"", "Expected identifier.", 1, 1);
 }
 
 TEST_F(TextFormatParserTest, InvalidFieldName) {
@@ -1366,52 +1248,46 @@
 
 TEST_F(TextFormatParserTest, InvalidFieldValues) {
   // 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: !\n", "Expected double, got: !", 1, 18);
+  ExpectFailure("optional_double: \"hello\"\n", "Expected double.", 1, 18);
+  ExpectFailure("optional_double: true\n", "Expected double.", 1, 18);
+  ExpectFailure("optional_double: !\n", "Expected double.", 1, 18);
   ExpectFailure("optional_double {\n  \n}\n", "Expected \":\", found \"{\".",
                 1, 17);
 
   // Invalid values for a signed integer field.
-  ExpectFailure("optional_int32: \"hello\"\n",
-                "Expected integer, got: \"hello\"", 1, 17);
-  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: \"hello\"\n", "Expected integer.", 1, 17);
+  ExpectFailure("optional_int32: true\n", "Expected integer.", 1, 17);
+  ExpectFailure("optional_int32: 4.5\n", "Expected integer.", 1, 17);
+  ExpectFailure("optional_int32: !\n", "Expected integer.", 1, 17);
   ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".",
                 1, 16);
   ExpectFailure("optional_int32: 0x80000000\n",
-                "Integer out of range (0x80000000)", 1, 17);
+                "Integer out of range.", 1, 17);
   ExpectFailure("optional_int64: 0x8000000000000000\n",
-                "Integer out of range (0x8000000000000000)", 1, 17);
+                "Integer out of range.", 1, 17);
   ExpectFailure("optional_int32: -0x80000001\n",
-                "Integer out of range (0x80000001)", 1, 18);
+                "Integer out of range.", 1, 18);
   ExpectFailure("optional_int64: -0x8000000000000001\n",
-                "Integer out of range (0x8000000000000001)", 1, 18);
+                "Integer out of range.", 1, 18);
 
   // 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: 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: \"hello\"\n", "Expected integer.", 1, 18);
+  ExpectFailure("optional_uint64: true\n", "Expected integer.", 1, 18);
+  ExpectFailure("optional_uint64: 4.5\n", "Expected integer.", 1, 18);
+  ExpectFailure("optional_uint64: -5\n", "Expected integer.", 1, 18);
+  ExpectFailure("optional_uint64: !\n", "Expected integer.", 1, 18);
   ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".",
                 1, 17);
   ExpectFailure("optional_uint32: 0x100000000\n",
-                "Integer out of range (0x100000000)", 1, 18);
+                "Integer out of range.", 1, 18);
   ExpectFailure("optional_uint64: 0x10000000000000000\n",
-                "Integer out of range (0x10000000000000000)", 1, 18);
+                "Integer out of range.", 1, 18);
 
   // Invalid values for a boolean field.
-  ExpectFailure("optional_bool: \"hello\"\n",
-                "Expected identifier, got: \"hello\"", 1, 16);
-  ExpectFailure("optional_bool: 5\n", "Integer out of range (5)", 1, 16);
-  ExpectFailure("optional_bool: -7.5\n", "Expected identifier, got: -", 1, 16);
-  ExpectFailure("optional_bool: !\n", "Expected identifier, got: !", 1, 16);
+  ExpectFailure("optional_bool: \"hello\"\n", "Expected identifier.", 1, 16);
+  ExpectFailure("optional_bool: 5\n", "Integer out of range.", 1, 16);
+  ExpectFailure("optional_bool: -7.5\n", "Expected identifier.", 1, 16);
+  ExpectFailure("optional_bool: !\n", "Expected identifier.", 1, 16);
 
   ExpectFailure(
       "optional_bool: meh\n",
@@ -1422,16 +1298,16 @@
                 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: true\n", "Expected string.", 1, 18);
+  ExpectFailure("optional_string: 5\n", "Expected string.", 1, 18);
+  ExpectFailure("optional_string: -7.5\n", "Expected string.", 1, 18);
+  ExpectFailure("optional_string: !\n", "Expected string.", 1, 18);
   ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".",
                 1, 17);
 
   // Invalid values for an enumeration field.
   ExpectFailure("optional_nested_enum: \"hello\"\n",
-                "Expected integer or identifier, got: \"hello\"", 1, 23);
+                "Expected integer or identifier.", 1, 23);
 
   // Valid token, but enum value is not defined.
   ExpectFailure("optional_nested_enum: 5\n",
@@ -1439,10 +1315,9 @@
                 "\"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,
-                24);
+  ExpectFailure("optional_nested_enum: -7.5\n", "Expected integer.", 1, 24);
   ExpectFailure("optional_nested_enum: !\n",
-                "Expected integer or identifier, got: !", 1, 23);
+                "Expected integer or identifier.", 1, 23);
 
   ExpectFailure(
       "optional_nested_enum: grah\n",
@@ -1465,7 +1340,7 @@
 
   // Unending message.
   ExpectFailure("optional_nested_message {\n \nbb: 118\n",
-                "Expected identifier, got: ",
+                "Expected identifier.",
                 4, 1);
 }
 
@@ -1521,7 +1396,7 @@
 }
 
 TEST_F(TextFormatParserTest, PrintErrorsToStderr) {
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog log;
@@ -1538,7 +1413,7 @@
 }
 
 TEST_F(TextFormatParserTest, FailsOnTokenizationError) {
-  std::vector<string> errors;
+  vector<string> errors;
 
   {
     ScopedMemoryLog log;
@@ -1597,7 +1472,7 @@
     protobuf_unittest::TestMessageSetExtension2::message_set_extension).str());
 
   // Ensure that these are the only entries present.
-  std::vector<const FieldDescriptor*> descriptors;
+  vector<const FieldDescriptor*> descriptors;
   proto.message_set().GetReflection()->ListFields(
     proto.message_set(), &descriptors);
   EXPECT_EQ(2, descriptors.size());
diff --git a/src/google/protobuf/timestamp.pb.cc b/src/google/protobuf/timestamp.pb.cc
index 36e3bb3..7cdf509 100644
--- a/src/google/protobuf/timestamp.pb.cc
+++ b/src/google/protobuf/timestamp.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/timestamp.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/timestamp.pb.h>
 
 #include <algorithm>
@@ -14,114 +15,104 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class TimestampDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Timestamp>
-      _instance;
-} _Timestamp_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto {
-void InitDefaultsTimestampImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Timestamp_default_instance_;
-    new (ptr) ::google::protobuf::Timestamp();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Timestamp::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* Timestamp_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Timestamp_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2ftimestamp_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2ftimestamp_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/timestamp.proto");
+  GOOGLE_CHECK(file != NULL);
+  Timestamp_descriptor_ = file->message_type(0);
+  static const int Timestamp_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Timestamp, seconds_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Timestamp, nanos_),
+  };
+  Timestamp_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Timestamp_descriptor_,
+      Timestamp::default_instance_,
+      Timestamp_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Timestamp),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Timestamp, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Timestamp, _is_default_instance_));
 }
 
-void InitDefaultsTimestamp() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsTimestampImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2ftimestamp_2eproto);
 }
 
-::google::protobuf::Metadata file_level_metadata[1];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Timestamp, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Timestamp, seconds_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Timestamp, nanos_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::Timestamp)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Timestamp_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/timestamp.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Timestamp_descriptor_, &Timestamp::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\037google/protobuf/timestamp.proto\022\017googl"
-      "e.protobuf\"+\n\tTimestamp\022\017\n\007seconds\030\001 \001(\003"
-      "\022\r\n\005nanos\030\002 \001(\005B~\n\023com.google.protobufB\016"
-      "TimestampProtoP\001Z+github.com/golang/prot"
-      "obuf/ptypes/timestamp\370\001\001\242\002\003GPB\252\002\036Google."
-      "Protobuf.WellKnownTypesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2ftimestamp_2eproto() {
+  delete Timestamp::default_instance_;
+  delete Timestamp_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2ftimestamp_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 231);
+    "\n\037google/protobuf/timestamp.proto\022\017googl"
+    "e.protobuf\"+\n\tTimestamp\022\017\n\007seconds\030\001 \001(\003"
+    "\022\r\n\005nanos\030\002 \001(\005B\201\001\n\023com.google.protobufB"
+    "\016TimestampProtoP\001Z+github.com/golang/pro"
+    "tobuf/ptypes/timestamp\240\001\001\370\001\001\242\002\003GPB\252\002\036Goo"
+    "gle.Protobuf.WellKnownTypesb\006proto3", 235);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/timestamp.proto", &protobuf_RegisterTypes);
+  Timestamp::default_instance_ = new Timestamp();
+  Timestamp::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2ftimestamp_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2ftimestamp_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2ftimestamp_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2ftimestamp_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2ftimestamp_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void Timestamp::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Timestamp::kSecondsFieldNumber;
 const int Timestamp::kNanosFieldNumber;
@@ -129,36 +120,35 @@
 
 Timestamp::Timestamp()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Timestamp)
 }
+
 Timestamp::Timestamp(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.Timestamp)
 }
+
+void Timestamp::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Timestamp::Timestamp(const Timestamp& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::memcpy(&seconds_, &from.seconds_,
-    static_cast<size_t>(reinterpret_cast<char*>(&nanos_) -
-    reinterpret_cast<char*>(&seconds_)) + sizeof(nanos_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Timestamp)
 }
 
 void Timestamp::SharedCtor() {
-  ::memset(&seconds_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&nanos_) -
-      reinterpret_cast<char*>(&seconds_)) + sizeof(nanos_));
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  seconds_ = GOOGLE_LONGLONG(0);
+  nanos_ = 0;
 }
 
 Timestamp::~Timestamp() {
@@ -167,7 +157,12 @@
 }
 
 void Timestamp::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void Timestamp::ArenaDtor(void* object) {
@@ -182,29 +177,44 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Timestamp::descriptor() {
-  ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Timestamp_descriptor_;
 }
 
 const Timestamp& Timestamp::default_instance() {
-  ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ftimestamp_2eproto();
+  return *default_instance_;
 }
 
+Timestamp* Timestamp::default_instance_ = NULL;
+
 Timestamp* Timestamp::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<Timestamp>(arena);
 }
 
 void Timestamp::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Timestamp)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(Timestamp, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<Timestamp*>(16)->f)
+#endif
 
-  ::memset(&seconds_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&nanos_) -
-      reinterpret_cast<char*>(&seconds_)) + sizeof(nanos_));
-  _internal_metadata_.Clear();
+#define ZR_(first, last) do {\
+  ::memset(&first, 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(seconds_, nanos_);
+
+#undef ZR_HELPER_
+#undef ZR_
+
 }
 
 bool Timestamp::MergePartialFromCodedStream(
@@ -213,45 +223,47 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Timestamp)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // int64 seconds = 1;
+      // optional int64 seconds = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>(
                  input, &seconds_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_nanos;
         break;
       }
 
-      // int32 nanos = 2;
+      // optional int32 nanos = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-
+        if (tag == 16) {
+         parse_nanos:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &nanos_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -268,85 +280,64 @@
 void Timestamp::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Timestamp)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   if (this->seconds() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->seconds(), output);
   }
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   if (this->nanos() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->nanos(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Timestamp)
 }
 
-::google::protobuf::uint8* Timestamp::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Timestamp::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Timestamp)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   if (this->seconds() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(1, this->seconds(), target);
   }
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   if (this->nanos() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->nanos(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Timestamp)
   return target;
 }
 
-size_t Timestamp::ByteSizeLong() const {
+int Timestamp::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Timestamp)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   if (this->seconds() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int64Size(
         this->seconds());
   }
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   if (this->nanos() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int32Size(
         this->nanos());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Timestamp::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Timestamp)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Timestamp* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Timestamp* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Timestamp>(
           &from);
   if (source == NULL) {
@@ -360,11 +351,7 @@
 
 void Timestamp::MergeFrom(const Timestamp& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Timestamp)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.seconds() != 0) {
     set_seconds(from.seconds());
   }
@@ -388,6 +375,7 @@
 }
 
 bool Timestamp::IsInitialized() const {
+
   return true;
 }
 
@@ -396,13 +384,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    Timestamp* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    Timestamp temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void Timestamp::UnsafeArenaSwap(Timestamp* other) {
@@ -411,20 +396,55 @@
   InternalSwap(other);
 }
 void Timestamp::InternalSwap(Timestamp* other) {
-  using std::swap;
-  swap(seconds_, other->seconds_);
-  swap(nanos_, other->nanos_);
+  std::swap(seconds_, other->seconds_);
+  std::swap(nanos_, other->nanos_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Timestamp::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ftimestamp_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Timestamp_descriptor_;
+  metadata.reflection = Timestamp_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Timestamp
+
+// optional int64 seconds = 1;
+void Timestamp::clear_seconds() {
+  seconds_ = GOOGLE_LONGLONG(0);
+}
+ ::google::protobuf::int64 Timestamp::seconds() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Timestamp.seconds)
+  return seconds_;
+}
+ void Timestamp::set_seconds(::google::protobuf::int64 value) {
+  
+  seconds_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Timestamp.seconds)
+}
+
+// optional int32 nanos = 2;
+void Timestamp::clear_nanos() {
+  nanos_ = 0;
+}
+ ::google::protobuf::int32 Timestamp::nanos() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Timestamp.nanos)
+  return nanos_;
+}
+ void Timestamp::set_nanos(::google::protobuf::int32 value) {
+  
+  nanos_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Timestamp.nanos)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/timestamp.pb.h b/src/google/protobuf/timestamp.pb.h
index 6c7136e..7bf6259 100644
--- a/src/google/protobuf/timestamp.pb.h
+++ b/src/google/protobuf/timestamp.pb.h
@@ -8,59 +8,40 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[1];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsTimestampImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsTimestamp();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsTimestamp();
-}
-}  // namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftimestamp_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2ftimestamp_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2ftimestamp_2eproto();
+
 class Timestamp;
-class TimestampDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern TimestampDefaultTypeInternal _Timestamp_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT Timestamp : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Timestamp) */ {
+class LIBPROTOBUF_EXPORT Timestamp : public ::google::protobuf::Message {
  public:
   Timestamp();
   virtual ~Timestamp();
@@ -71,68 +52,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Timestamp(Timestamp&& from) noexcept
-    : Timestamp() {
-    *this = ::std::move(from);
-  }
 
-  inline Timestamp& operator=(Timestamp&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Timestamp& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Timestamp* internal_default_instance() {
-    return reinterpret_cast<const Timestamp*>(
-               &_Timestamp_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   void UnsafeArenaSwap(Timestamp* other);
   void Swap(Timestamp* other);
-  friend void swap(Timestamp& a, Timestamp& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Timestamp* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Timestamp* New() const { return New(NULL); }
 
-  Timestamp* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Timestamp* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Timestamp& from);
   void MergeFrom(const Timestamp& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Timestamp* other);
   protected:
   explicit Timestamp(::google::protobuf::Arena* arena);
@@ -148,19 +101,19 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // int64 seconds = 1;
+  // optional int64 seconds = 1;
   void clear_seconds();
   static const int kSecondsFieldNumber = 1;
   ::google::protobuf::int64 seconds() const;
   void set_seconds(::google::protobuf::int64 value);
 
-  // int32 nanos = 2;
+  // optional int32 nanos = 2;
   void clear_nanos();
   static const int kNanosFieldNumber = 2;
   ::google::protobuf::int32 nanos() const;
@@ -170,27 +123,29 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::int64 seconds_;
   ::google::protobuf::int32 nanos_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestampImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftimestamp_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ftimestamp_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ftimestamp_2eproto();
+
+  void InitAsDefaultInstance();
+  static Timestamp* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Timestamp
 
-// int64 seconds = 1;
+// optional int64 seconds = 1;
 inline void Timestamp::clear_seconds() {
   seconds_ = GOOGLE_LONGLONG(0);
 }
@@ -204,7 +159,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Timestamp.seconds)
 }
 
-// int32 nanos = 2;
+// optional int32 nanos = 2;
 inline void Timestamp::clear_nanos() {
   nanos_ = 0;
 }
@@ -218,9 +173,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Timestamp.nanos)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/src/google/protobuf/timestamp.proto b/src/google/protobuf/timestamp.proto
index 06750ab..7992a85 100644
--- a/src/google/protobuf/timestamp.proto
+++ b/src/google/protobuf/timestamp.proto
@@ -38,6 +38,7 @@
 option java_package = "com.google.protobuf";
 option java_outer_classname = "TimestampProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
 
 // A Timestamp represents a point in time independent of any time zone
@@ -52,8 +53,6 @@
 // and from  RFC 3339 date strings.
 // See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
 //
-// # Examples
-//
 // Example 1: Compute Timestamp from POSIX `time()`.
 //
 //     Timestamp timestamp;
@@ -91,37 +90,16 @@
 //
 // Example 5: Compute Timestamp from current time in Python.
 //
-//     timestamp = Timestamp()
-//     timestamp.GetCurrentTime()
-//
-// # JSON Mapping
-//
-// In JSON format, the Timestamp type is encoded as a string in the
-// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
-// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
-// where {year} is always expressed using four digits while {month}, {day},
-// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
-// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
-// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
-// is required, though only UTC (as indicated by "Z") is presently supported.
-//
-// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
-// 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]
-// 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()`](
-// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--)
-// to obtain a formatter capable of generating timestamps in this format.
+//     now = time.time()
+//     seconds = int(now)
+//     nanos = int((now - seconds) * 10**9)
+//     timestamp = Timestamp(seconds=seconds, nanos=nanos)
 //
 //
 message Timestamp {
 
   // Represents seconds of UTC time since Unix epoch
-  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+  // 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
   // 9999-12-31T23:59:59Z inclusive.
   int64 seconds = 1;
 
diff --git a/src/google/protobuf/type.pb.cc b/src/google/protobuf/type.pb.cc
index 92f6589..759cab2 100644
--- a/src/google/protobuf/type.pb.cc
+++ b/src/google/protobuf/type.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/type.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/type.pb.h>
 
 #include <algorithm>
@@ -14,317 +15,946 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class TypeDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Type>
-      _instance;
-} _Type_default_instance_;
-class FieldDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Field>
-      _instance;
-} _Field_default_instance_;
-class EnumDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Enum>
-      _instance;
-} _Enum_default_instance_;
-class EnumValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<EnumValue>
-      _instance;
-} _EnumValue_default_instance_;
-class OptionDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Option>
-      _instance;
-} _Option_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2ftype_2eproto {
-void InitDefaultsTypeImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsField();
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext();
-  {
-    void* ptr = &::google::protobuf::_Type_default_instance_;
-    new (ptr) ::google::protobuf::Type();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Type::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* Type_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Type_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Field_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Field_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* Field_Kind_descriptor_ = NULL;
+const ::google::protobuf::EnumDescriptor* Field_Cardinality_descriptor_ = NULL;
+const ::google::protobuf::Descriptor* Enum_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Enum_reflection_ = NULL;
+const ::google::protobuf::Descriptor* EnumValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  EnumValue_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Option_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Option_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* Syntax_descriptor_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/type.proto");
+  GOOGLE_CHECK(file != NULL);
+  Type_descriptor_ = file->message_type(0);
+  static const int Type_offsets_[6] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, fields_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, oneofs_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, source_context_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, syntax_),
+  };
+  Type_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Type_descriptor_,
+      Type::default_instance_,
+      Type_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Type),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Type, _is_default_instance_));
+  Field_descriptor_ = file->message_type(1);
+  static const int Field_offsets_[10] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, kind_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, cardinality_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, number_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, type_url_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, oneof_index_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, packed_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, json_name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, default_value_),
+  };
+  Field_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Field_descriptor_,
+      Field::default_instance_,
+      Field_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Field),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Field, _is_default_instance_));
+  Field_Kind_descriptor_ = Field_descriptor_->enum_type(0);
+  Field_Cardinality_descriptor_ = Field_descriptor_->enum_type(1);
+  Enum_descriptor_ = file->message_type(2);
+  static const int Enum_offsets_[5] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, enumvalue_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, options_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, source_context_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, syntax_),
+  };
+  Enum_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Enum_descriptor_,
+      Enum::default_instance_,
+      Enum_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Enum),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Enum, _is_default_instance_));
+  EnumValue_descriptor_ = file->message_type(3);
+  static const int EnumValue_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValue, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValue, number_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValue, options_),
+  };
+  EnumValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      EnumValue_descriptor_,
+      EnumValue::default_instance_,
+      EnumValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(EnumValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValue, _is_default_instance_));
+  Option_descriptor_ = file->message_type(4);
+  static const int Option_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Option, name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Option, value_),
+  };
+  Option_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Option_descriptor_,
+      Option::default_instance_,
+      Option_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Option),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Option, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Option, _is_default_instance_));
+  Syntax_descriptor_ = file->enum_type(0);
 }
 
-void InitDefaultsType() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsTypeImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto);
 }
 
-void InitDefaultsFieldImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  {
-    void* ptr = &::google::protobuf::_Field_default_instance_;
-    new (ptr) ::google::protobuf::Field();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Field::InitAsDefaultInstance();
-}
-
-void InitDefaultsField() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldImpl);
-}
-
-void InitDefaultsEnumImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnumValue();
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext();
-  {
-    void* ptr = &::google::protobuf::_Enum_default_instance_;
-    new (ptr) ::google::protobuf::Enum();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Enum::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnum() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumImpl);
-}
-
-void InitDefaultsEnumValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  {
-    void* ptr = &::google::protobuf::_EnumValue_default_instance_;
-    new (ptr) ::google::protobuf::EnumValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::EnumValue::InitAsDefaultInstance();
-}
-
-void InitDefaultsEnumValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumValueImpl);
-}
-
-void InitDefaultsOptionImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAny();
-  {
-    void* ptr = &::google::protobuf::_Option_default_instance_;
-    new (ptr) ::google::protobuf::Option();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Option::InitAsDefaultInstance();
-}
-
-void InitDefaultsOption() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsOptionImpl);
-}
-
-::google::protobuf::Metadata file_level_metadata[5];
-const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors[3];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, fields_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, oneofs_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, source_context_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Type, syntax_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, kind_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, cardinality_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, number_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, type_url_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, oneof_index_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, packed_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, json_name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Field, default_value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Enum, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Enum, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Enum, enumvalue_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Enum, options_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Enum, source_context_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Enum, syntax_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValue, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValue, number_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValue, options_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Option, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Option, name_),
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Option, value_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::Type)},
-  { 11, -1, sizeof(::google::protobuf::Field)},
-  { 26, -1, sizeof(::google::protobuf::Enum)},
-  { 36, -1, sizeof(::google::protobuf::EnumValue)},
-  { 44, -1, sizeof(::google::protobuf::Option)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Type_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Field_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Enum_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_EnumValue_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Option_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/type.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, file_level_enum_descriptors, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 5);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Type_descriptor_, &Type::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Field_descriptor_, &Field::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Enum_descriptor_, &Enum::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      EnumValue_descriptor_, &EnumValue::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Option_descriptor_, &Option::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\032google/protobuf/type.proto\022\017google.pro"
-      "tobuf\032\031google/protobuf/any.proto\032$google"
-      "/protobuf/source_context.proto\"\327\001\n\004Type\022"
-      "\014\n\004name\030\001 \001(\t\022&\n\006fields\030\002 \003(\0132\026.google.p"
-      "rotobuf.Field\022\016\n\006oneofs\030\003 \003(\t\022(\n\007options"
-      "\030\004 \003(\0132\027.google.protobuf.Option\0226\n\016sourc"
-      "e_context\030\005 \001(\0132\036.google.protobuf.Source"
-      "Context\022\'\n\006syntax\030\006 \001(\0162\027.google.protobu"
-      "f.Syntax\"\325\005\n\005Field\022)\n\004kind\030\001 \001(\0162\033.googl"
-      "e.protobuf.Field.Kind\0227\n\013cardinality\030\002 \001"
-      "(\0162\".google.protobuf.Field.Cardinality\022\016"
-      "\n\006number\030\003 \001(\005\022\014\n\004name\030\004 \001(\t\022\020\n\010type_url"
-      "\030\006 \001(\t\022\023\n\013oneof_index\030\007 \001(\005\022\016\n\006packed\030\010 "
-      "\001(\010\022(\n\007options\030\t \003(\0132\027.google.protobuf.O"
-      "ption\022\021\n\tjson_name\030\n \001(\t\022\025\n\rdefault_valu"
-      "e\030\013 \001(\t\"\310\002\n\004Kind\022\020\n\014TYPE_UNKNOWN\020\000\022\017\n\013TY"
-      "PE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT6"
-      "4\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014"
-      "TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE"
-      "_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n"
-      "\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TY"
-      "PE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXE"
-      "D32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020"
-      "\021\022\017\n\013TYPE_SINT64\020\022\"t\n\013Cardinality\022\027\n\023CAR"
-      "DINALITY_UNKNOWN\020\000\022\030\n\024CARDINALITY_OPTION"
-      "AL\020\001\022\030\n\024CARDINALITY_REQUIRED\020\002\022\030\n\024CARDIN"
-      "ALITY_REPEATED\020\003\"\316\001\n\004Enum\022\014\n\004name\030\001 \001(\t\022"
-      "-\n\tenumvalue\030\002 \003(\0132\032.google.protobuf.Enu"
-      "mValue\022(\n\007options\030\003 \003(\0132\027.google.protobu"
-      "f.Option\0226\n\016source_context\030\004 \001(\0132\036.googl"
-      "e.protobuf.SourceContext\022\'\n\006syntax\030\005 \001(\016"
-      "2\027.google.protobuf.Syntax\"S\n\tEnumValue\022\014"
-      "\n\004name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\022(\n\007options\030"
-      "\003 \003(\0132\027.google.protobuf.Option\";\n\006Option"
-      "\022\014\n\004name\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p"
-      "rotobuf.Any*.\n\006Syntax\022\021\n\rSYNTAX_PROTO2\020\000"
-      "\022\021\n\rSYNTAX_PROTO3\020\001B}\n\023com.google.protob"
-      "ufB\tTypeProtoP\001Z/google.golang.org/genpr"
-      "oto/protobuf/ptype;ptype\370\001\001\242\002\003GPB\252\002\036Goog"
-      "le.Protobuf.WellKnownTypesb\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto() {
+  delete Type::default_instance_;
+  delete Type_reflection_;
+  delete Field::default_instance_;
+  delete Field_reflection_;
+  delete Enum::default_instance_;
+  delete Enum_reflection_;
+  delete EnumValue::default_instance_;
+  delete EnumValue_reflection_;
+  delete Option::default_instance_;
+  delete Option_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fany_2eproto();
+  ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fsource_5fcontext_2eproto();
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 1594);
+    "\n\032google/protobuf/type.proto\022\017google.pro"
+    "tobuf\032\031google/protobuf/any.proto\032$google"
+    "/protobuf/source_context.proto\"\327\001\n\004Type\022"
+    "\014\n\004name\030\001 \001(\t\022&\n\006fields\030\002 \003(\0132\026.google.p"
+    "rotobuf.Field\022\016\n\006oneofs\030\003 \003(\t\022(\n\007options"
+    "\030\004 \003(\0132\027.google.protobuf.Option\0226\n\016sourc"
+    "e_context\030\005 \001(\0132\036.google.protobuf.Source"
+    "Context\022\'\n\006syntax\030\006 \001(\0162\027.google.protobu"
+    "f.Syntax\"\325\005\n\005Field\022)\n\004kind\030\001 \001(\0162\033.googl"
+    "e.protobuf.Field.Kind\0227\n\013cardinality\030\002 \001"
+    "(\0162\".google.protobuf.Field.Cardinality\022\016"
+    "\n\006number\030\003 \001(\005\022\014\n\004name\030\004 \001(\t\022\020\n\010type_url"
+    "\030\006 \001(\t\022\023\n\013oneof_index\030\007 \001(\005\022\016\n\006packed\030\010 "
+    "\001(\010\022(\n\007options\030\t \003(\0132\027.google.protobuf.O"
+    "ption\022\021\n\tjson_name\030\n \001(\t\022\025\n\rdefault_valu"
+    "e\030\013 \001(\t\"\310\002\n\004Kind\022\020\n\014TYPE_UNKNOWN\020\000\022\017\n\013TY"
+    "PE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT6"
+    "4\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014"
+    "TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE"
+    "_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n"
+    "\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TY"
+    "PE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXE"
+    "D32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020"
+    "\021\022\017\n\013TYPE_SINT64\020\022\"t\n\013Cardinality\022\027\n\023CAR"
+    "DINALITY_UNKNOWN\020\000\022\030\n\024CARDINALITY_OPTION"
+    "AL\020\001\022\030\n\024CARDINALITY_REQUIRED\020\002\022\030\n\024CARDIN"
+    "ALITY_REPEATED\020\003\"\316\001\n\004Enum\022\014\n\004name\030\001 \001(\t\022"
+    "-\n\tenumvalue\030\002 \003(\0132\032.google.protobuf.Enu"
+    "mValue\022(\n\007options\030\003 \003(\0132\027.google.protobu"
+    "f.Option\0226\n\016source_context\030\004 \001(\0132\036.googl"
+    "e.protobuf.SourceContext\022\'\n\006syntax\030\005 \001(\016"
+    "2\027.google.protobuf.Syntax\"S\n\tEnumValue\022\014"
+    "\n\004name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\022(\n\007options\030"
+    "\003 \003(\0132\027.google.protobuf.Option\";\n\006Option"
+    "\022\014\n\004name\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p"
+    "rotobuf.Any*.\n\006Syntax\022\021\n\rSYNTAX_PROTO2\020\000"
+    "\022\021\n\rSYNTAX_PROTO3\020\001BL\n\023com.google.protob"
+    "ufB\tTypeProtoP\001\240\001\001\242\002\003GPB\252\002\036Google.Protob"
+    "uf.WellKnownTypesb\006proto3", 1545);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/type.proto", &protobuf_RegisterTypes);
-  ::protobuf_google_2fprotobuf_2fany_2eproto::AddDescriptors();
-  ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::AddDescriptors();
+  Type::default_instance_ = new Type();
+  Field::default_instance_ = new Field();
+  Enum::default_instance_ = new Enum();
+  EnumValue::default_instance_ = new EnumValue();
+  Option::default_instance_ = new Option();
+  Type::default_instance_->InitAsDefaultInstance();
+  Field::default_instance_->InitAsDefaultInstance();
+  Enum::default_instance_->InitAsDefaultInstance();
+  EnumValue::default_instance_->InitAsDefaultInstance();
+  Option::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2ftype_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2ftype_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2ftype_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2ftype_2eproto_;
+const ::google::protobuf::EnumDescriptor* Syntax_descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return Syntax_descriptor_;
+}
+bool Syntax_IsValid(int value) {
+  switch(value) {
+    case 0:
+    case 1:
+      return true;
+    default:
+      return false;
+  }
+}
+
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
+
+// ===================================================================
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int Type::kNameFieldNumber;
+const int Type::kFieldsFieldNumber;
+const int Type::kOneofsFieldNumber;
+const int Type::kOptionsFieldNumber;
+const int Type::kSourceContextFieldNumber;
+const int Type::kSyntaxFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+Type::Type()
+  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:google.protobuf.Type)
+}
+
+void Type::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+  source_context_ = const_cast< ::google::protobuf::SourceContext*>(&::google::protobuf::SourceContext::default_instance());
+}
+
+Type::Type(const Type& from)
+  : ::google::protobuf::Message(),
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
+  // @@protoc_insertion_point(copy_constructor:google.protobuf.Type)
+}
+
+void Type::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
+  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  source_context_ = NULL;
+  syntax_ = 0;
+}
+
+Type::~Type() {
+  // @@protoc_insertion_point(destructor:google.protobuf.Type)
+  SharedDtor();
+}
+
+void Type::SharedDtor() {
+  name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+    delete source_context_;
+  }
+}
+
+void Type::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* Type::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return Type_descriptor_;
+}
+
+const Type& Type::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  return *default_instance_;
+}
+
+Type* Type::default_instance_ = NULL;
+
+Type* Type::New(::google::protobuf::Arena* arena) const {
+  Type* n = new Type;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
+}
+
+void Type::Clear() {
+// @@protoc_insertion_point(message_clear_start:google.protobuf.Type)
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
+  syntax_ = 0;
+  fields_.Clear();
+  oneofs_.Clear();
+  options_.Clear();
+}
+
+bool Type::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:google.protobuf.Type)
+  for (;;) {
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // optional string name = 1;
+      case 1: {
+        if (tag == 10) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_name()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->name().data(), this->name().length(),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "google.protobuf.Type.name"));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(18)) goto parse_fields;
+        break;
+      }
+
+      // repeated .google.protobuf.Field fields = 2;
+      case 2: {
+        if (tag == 18) {
+         parse_fields:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_fields:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_fields()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(18)) goto parse_loop_fields;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(26)) goto parse_oneofs;
+        break;
+      }
+
+      // repeated string oneofs = 3;
+      case 3: {
+        if (tag == 26) {
+         parse_oneofs:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->add_oneofs()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->oneofs(this->oneofs_size() - 1).data(),
+            this->oneofs(this->oneofs_size() - 1).length(),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "google.protobuf.Type.oneofs"));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(26)) goto parse_oneofs;
+        if (input->ExpectTag(34)) goto parse_options;
+        break;
+      }
+
+      // repeated .google.protobuf.Option options = 4;
+      case 4: {
+        if (tag == 34) {
+         parse_options:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_options()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(34)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(42)) goto parse_source_context;
+        break;
+      }
+
+      // optional .google.protobuf.SourceContext source_context = 5;
+      case 5: {
+        if (tag == 42) {
+         parse_source_context:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+               input, mutable_source_context()));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectTag(48)) goto parse_syntax;
+        break;
+      }
+
+      // optional .google.protobuf.Syntax syntax = 6;
+      case 6: {
+        if (tag == 48) {
+         parse_syntax:
+          int value;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_syntax(static_cast< ::google::protobuf::Syntax >(value));
+        } else {
+          goto handle_unusual;
+        }
+        if (input->ExpectAtEnd()) goto success;
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:google.protobuf.Type)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:google.protobuf.Type)
+  return false;
+#undef DO_
+}
+
+void Type::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:google.protobuf.Type)
+  // optional string name = 1;
+  if (this->name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->name().data(), this->name().length(),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "google.protobuf.Type.name");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      1, this->name(), output);
+  }
+
+  // repeated .google.protobuf.Field fields = 2;
+  for (unsigned int i = 0, n = this->fields_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      2, this->fields(i), output);
+  }
+
+  // repeated string oneofs = 3;
+  for (int i = 0; i < this->oneofs_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->oneofs(i).data(), this->oneofs(i).length(),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "google.protobuf.Type.oneofs");
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      3, this->oneofs(i), output);
+  }
+
+  // repeated .google.protobuf.Option options = 4;
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      4, this->options(i), output);
+  }
+
+  // optional .google.protobuf.SourceContext source_context = 5;
+  if (this->has_source_context()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      5, *this->source_context_, output);
+  }
+
+  // optional .google.protobuf.Syntax syntax = 6;
+  if (this->syntax() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      6, this->syntax(), output);
+  }
+
+  // @@protoc_insertion_point(serialize_end:google.protobuf.Type)
+}
+
+::google::protobuf::uint8* Type::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Type)
+  // optional string name = 1;
+  if (this->name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->name().data(), this->name().length(),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "google.protobuf.Type.name");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->name(), target);
+  }
+
+  // repeated .google.protobuf.Field fields = 2;
+  for (unsigned int i = 0, n = this->fields_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        2, this->fields(i), target);
+  }
+
+  // repeated string oneofs = 3;
+  for (int i = 0; i < this->oneofs_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->oneofs(i).data(), this->oneofs(i).length(),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "google.protobuf.Type.oneofs");
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteStringToArray(3, this->oneofs(i), target);
+  }
+
+  // repeated .google.protobuf.Option options = 4;
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        4, this->options(i), target);
+  }
+
+  // optional .google.protobuf.SourceContext source_context = 5;
+  if (this->has_source_context()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        5, *this->source_context_, target);
+  }
+
+  // optional .google.protobuf.Syntax syntax = 6;
+  if (this->syntax() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      6, this->syntax(), target);
+  }
+
+  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Type)
+  return target;
+}
+
+int Type::ByteSize() const {
+// @@protoc_insertion_point(message_byte_size_start:google.protobuf.Type)
+  int total_size = 0;
+
+  // optional string name = 1;
+  if (this->name().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->name());
+  }
+
+  // optional .google.protobuf.SourceContext source_context = 5;
+  if (this->has_source_context()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        *this->source_context_);
+  }
+
+  // optional .google.protobuf.Syntax syntax = 6;
+  if (this->syntax() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax());
+  }
+
+  // repeated .google.protobuf.Field fields = 2;
+  total_size += 1 * this->fields_size();
+  for (int i = 0; i < this->fields_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->fields(i));
+  }
+
+  // repeated string oneofs = 3;
+  total_size += 1 * this->oneofs_size();
+  for (int i = 0; i < this->oneofs_size(); i++) {
+    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
+      this->oneofs(i));
+  }
+
+  // repeated .google.protobuf.Option options = 4;
+  total_size += 1 * this->options_size();
+  for (int i = 0; i < this->options_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->options(i));
+  }
+
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void Type::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Type)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Type* source = 
+      ::google::protobuf::internal::DynamicCastToGenerated<const Type>(
+          &from);
+  if (source == NULL) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Type)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Type)
+    MergeFrom(*source);
+  }
+}
+
+void Type::MergeFrom(const Type& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Type)
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  fields_.MergeFrom(from.fields_);
+  oneofs_.MergeFrom(from.oneofs_);
+  options_.MergeFrom(from.options_);
+  if (from.name().size() > 0) {
+
+    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
+  }
+  if (from.has_source_context()) {
+    mutable_source_context()->::google::protobuf::SourceContext::MergeFrom(from.source_context());
+  }
+  if (from.syntax() != 0) {
+    set_syntax(from.syntax());
+  }
+}
+
+void Type::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Type)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void Type::CopyFrom(const Type& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Type)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool Type::IsInitialized() const {
+
+  return true;
+}
+
+void Type::Swap(Type* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void Type::InternalSwap(Type* other) {
+  name_.Swap(&other->name_);
+  fields_.UnsafeArenaSwap(&other->fields_);
+  oneofs_.UnsafeArenaSwap(&other->oneofs_);
+  options_.UnsafeArenaSwap(&other->options_);
+  std::swap(source_context_, other->source_context_);
+  std::swap(syntax_, other->syntax_);
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  std::swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata Type::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Type_descriptor_;
+  metadata.reflection = Type_reflection_;
+  return metadata;
+}
+
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Type
+
+// optional string name = 1;
+void Type::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Type::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Type.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Type::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Type.name)
+}
+ void Type::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Type.name)
+}
+ void Type::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Type.name)
+}
+ ::std::string* Type::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Type::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Type.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Type::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    
+  } else {
+    
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Type.name)
+}
+
+// repeated .google.protobuf.Field fields = 2;
+int Type::fields_size() const {
+  return fields_.size();
+}
+void Type::clear_fields() {
+  fields_.Clear();
+}
+const ::google::protobuf::Field& Type::fields(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Type.fields)
+  return fields_.Get(index);
+}
+::google::protobuf::Field* Type::mutable_fields(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.fields)
+  return fields_.Mutable(index);
+}
+::google::protobuf::Field* Type::add_fields() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Type.fields)
+  return fields_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Field >*
+Type::mutable_fields() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Type.fields)
+  return &fields_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Field >&
+Type::fields() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Type.fields)
+  return fields_;
+}
+
+// repeated string oneofs = 3;
+int Type::oneofs_size() const {
+  return oneofs_.size();
+}
+void Type::clear_oneofs() {
+  oneofs_.Clear();
+}
+ const ::std::string& Type::oneofs(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Type.oneofs)
+  return oneofs_.Get(index);
+}
+ ::std::string* Type::mutable_oneofs(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.oneofs)
+  return oneofs_.Mutable(index);
+}
+ void Type::set_oneofs(int index, const ::std::string& value) {
+  // @@protoc_insertion_point(field_set:google.protobuf.Type.oneofs)
+  oneofs_.Mutable(index)->assign(value);
+}
+ void Type::set_oneofs(int index, const char* value) {
+  oneofs_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Type.oneofs)
+}
+ void Type::set_oneofs(int index, const char* value, size_t size) {
+  oneofs_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Type.oneofs)
+}
+ ::std::string* Type::add_oneofs() {
+  // @@protoc_insertion_point(field_add_mutable:google.protobuf.Type.oneofs)
+  return oneofs_.Add();
+}
+ void Type::add_oneofs(const ::std::string& value) {
+  oneofs_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:google.protobuf.Type.oneofs)
+}
+ void Type::add_oneofs(const char* value) {
+  oneofs_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:google.protobuf.Type.oneofs)
+}
+ void Type::add_oneofs(const char* value, size_t size) {
+  oneofs_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:google.protobuf.Type.oneofs)
+}
+ const ::google::protobuf::RepeatedPtrField< ::std::string>&
+Type::oneofs() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Type.oneofs)
+  return oneofs_;
+}
+ ::google::protobuf::RepeatedPtrField< ::std::string>*
+Type::mutable_oneofs() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Type.oneofs)
+  return &oneofs_;
+}
+
+// repeated .google.protobuf.Option options = 4;
+int Type::options_size() const {
+  return options_.size();
+}
+void Type::clear_options() {
+  options_.Clear();
+}
+const ::google::protobuf::Option& Type::options(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Type.options)
+  return options_.Get(index);
+}
+::google::protobuf::Option* Type::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.options)
+  return options_.Mutable(index);
+}
+::google::protobuf::Option* Type::add_options() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Type.options)
+  return options_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >*
+Type::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Type.options)
+  return &options_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
+Type::options() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Type.options)
+  return options_;
+}
+
+// optional .google.protobuf.SourceContext source_context = 5;
+bool Type::has_source_context() const {
+  return !_is_default_instance_ && source_context_ != NULL;
+}
+void Type::clear_source_context() {
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
+}
+const ::google::protobuf::SourceContext& Type::source_context() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Type.source_context)
+  return source_context_ != NULL ? *source_context_ : *default_instance_->source_context_;
+}
+::google::protobuf::SourceContext* Type::mutable_source_context() {
+  
+  if (source_context_ == NULL) {
+    source_context_ = new ::google::protobuf::SourceContext;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.source_context)
+  return source_context_;
+}
+::google::protobuf::SourceContext* Type::release_source_context() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Type.source_context)
+  
+  ::google::protobuf::SourceContext* temp = source_context_;
+  source_context_ = NULL;
+  return temp;
+}
+void Type::set_allocated_source_context(::google::protobuf::SourceContext* source_context) {
+  delete source_context_;
+  source_context_ = source_context;
+  if (source_context) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Type.source_context)
+}
+
+// optional .google.protobuf.Syntax syntax = 6;
+void Type::clear_syntax() {
+  syntax_ = 0;
+}
+ ::google::protobuf::Syntax Type::syntax() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Type.syntax)
+  return static_cast< ::google::protobuf::Syntax >(syntax_);
+}
+ void Type::set_syntax(::google::protobuf::Syntax value) {
+  
+  syntax_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Type.syntax)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 const ::google::protobuf::EnumDescriptor* Field_Kind_descriptor() {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2ftype_2eproto::file_level_enum_descriptors[0];
+  protobuf_AssignDescriptorsOnce();
+  return Field_Kind_descriptor_;
 }
 bool Field_Kind_IsValid(int value) {
-  switch (value) {
+  switch(value) {
     case 0:
     case 1:
     case 2:
@@ -375,11 +1005,11 @@
 const int Field::Kind_ARRAYSIZE;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 const ::google::protobuf::EnumDescriptor* Field_Cardinality_descriptor() {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2ftype_2eproto::file_level_enum_descriptors[1];
+  protobuf_AssignDescriptorsOnce();
+  return Field_Cardinality_descriptor_;
 }
 bool Field_Cardinality_IsValid(int value) {
-  switch (value) {
+  switch(value) {
     case 0:
     case 1:
     case 2:
@@ -399,559 +1029,6 @@
 const Field_Cardinality Field::Cardinality_MAX;
 const int Field::Cardinality_ARRAYSIZE;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-const ::google::protobuf::EnumDescriptor* Syntax_descriptor() {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return protobuf_google_2fprotobuf_2ftype_2eproto::file_level_enum_descriptors[2];
-}
-bool Syntax_IsValid(int value) {
-  switch (value) {
-    case 0:
-    case 1:
-      return true;
-    default:
-      return false;
-  }
-}
-
-
-// ===================================================================
-
-void Type::InitAsDefaultInstance() {
-  ::google::protobuf::_Type_default_instance_._instance.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>(
-      ::google::protobuf::SourceContext::internal_default_instance());
-}
-void Type::_slow_mutable_source_context() {
-  source_context_ = ::google::protobuf::Arena::Create< ::google::protobuf::SourceContext >(
-      GetArenaNoVirtual());
-}
-void Type::unsafe_arena_set_allocated_source_context(
-    ::google::protobuf::SourceContext* source_context) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete source_context_;
-  }
-  source_context_ = source_context;
-  if (source_context) {
-    
-  } else {
-    
-  }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Type.source_context)
-}
-void Type::clear_source_context() {
-  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) {
-    delete source_context_;
-  }
-  source_context_ = NULL;
-}
-#if !defined(_MSC_VER) || _MSC_VER >= 1900
-const int Type::kNameFieldNumber;
-const int Type::kFieldsFieldNumber;
-const int Type::kOneofsFieldNumber;
-const int Type::kOptionsFieldNumber;
-const int Type::kSourceContextFieldNumber;
-const int Type::kSyntaxFieldNumber;
-#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-
-Type::Type()
-  : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsType();
-  }
-  SharedCtor();
-  // @@protoc_insertion_point(constructor:google.protobuf.Type)
-}
-Type::Type(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  fields_(arena),
-  oneofs_(arena),
-  options_(arena) {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsType();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Type)
-}
-Type::Type(const Type& from)
-  : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      fields_(from.fields_),
-      oneofs_(from.oneofs_),
-      options_(from.options_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_source_context()) {
-    source_context_ = new ::google::protobuf::SourceContext(*from.source_context_);
-  } else {
-    source_context_ = NULL;
-  }
-  syntax_ = from.syntax_;
-  // @@protoc_insertion_point(copy_constructor:google.protobuf.Type)
-}
-
-void Type::SharedCtor() {
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&source_context_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&syntax_) -
-      reinterpret_cast<char*>(&source_context_)) + sizeof(syntax_));
-  _cached_size_ = 0;
-}
-
-Type::~Type() {
-  // @@protoc_insertion_point(destructor:google.protobuf.Type)
-  SharedDtor();
-}
-
-void Type::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-  name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete source_context_;
-}
-
-void Type::ArenaDtor(void* object) {
-  Type* _this = reinterpret_cast< Type* >(object);
-  (void)_this;
-}
-void Type::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
-void Type::SetCachedSize(int size) const {
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const ::google::protobuf::Descriptor* Type::descriptor() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
-}
-
-const Type& Type::default_instance() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsType();
-  return *internal_default_instance();
-}
-
-Type* Type::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Type>(arena);
-}
-
-void Type::Clear() {
-// @@protoc_insertion_point(message_clear_start:google.protobuf.Type)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  fields_.Clear();
-  oneofs_.Clear();
-  options_.Clear();
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) {
-    delete source_context_;
-  }
-  source_context_ = NULL;
-  syntax_ = 0;
-  _internal_metadata_.Clear();
-}
-
-bool Type::MergePartialFromCodedStream(
-    ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
-  ::google::protobuf::uint32 tag;
-  // @@protoc_insertion_point(parse_start:google.protobuf.Type)
-  for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
-    tag = p.first;
-    if (!p.second) goto handle_unusual;
-    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
-      case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->mutable_name()));
-          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
-            ::google::protobuf::internal::WireFormatLite::PARSE,
-            "google.protobuf.Type.name"));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.Field fields = 2;
-      case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_fields()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated string oneofs = 3;
-      case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
-                input, this->add_oneofs()));
-          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->oneofs(this->oneofs_size() - 1).data(),
-            static_cast<int>(this->oneofs(this->oneofs_size() - 1).length()),
-            ::google::protobuf::internal::WireFormatLite::PARSE,
-            "google.protobuf.Type.oneofs"));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // repeated .google.protobuf.Option options = 4;
-      case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // .google.protobuf.SourceContext source_context = 5;
-      case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
-               input, mutable_source_context()));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      // .google.protobuf.Syntax syntax = 6;
-      case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(48u /* 48 & 0xFF */)) {
-          int value;
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
-                 input, &value)));
-          set_syntax(static_cast< ::google::protobuf::Syntax >(value));
-        } else {
-          goto handle_unusual;
-        }
-        break;
-      }
-
-      default: {
-      handle_unusual:
-        if (tag == 0) {
-          goto success;
-        }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
-        break;
-      }
-    }
-  }
-success:
-  // @@protoc_insertion_point(parse_success:google.protobuf.Type)
-  return true;
-failure:
-  // @@protoc_insertion_point(parse_failure:google.protobuf.Type)
-  return false;
-#undef DO_
-}
-
-void Type::SerializeWithCachedSizes(
-    ::google::protobuf::io::CodedOutputStream* output) const {
-  // @@protoc_insertion_point(serialize_start:google.protobuf.Type)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
-  if (this->name().size() > 0) {
-    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
-      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
-      "google.protobuf.Type.name");
-    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
-      1, this->name(), output);
-  }
-
-  // repeated .google.protobuf.Field fields = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->fields_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->fields(static_cast<int>(i)), output);
-  }
-
-  // repeated string oneofs = 3;
-  for (int i = 0, n = this->oneofs_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->oneofs(i).data(), static_cast<int>(this->oneofs(i).length()),
-      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
-      "google.protobuf.Type.oneofs");
-    ::google::protobuf::internal::WireFormatLite::WriteString(
-      3, this->oneofs(i), output);
-  }
-
-  // repeated .google.protobuf.Option options = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      4, this->options(static_cast<int>(i)), output);
-  }
-
-  // .google.protobuf.SourceContext source_context = 5;
-  if (this->has_source_context()) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      5, *this->source_context_, output);
-  }
-
-  // .google.protobuf.Syntax syntax = 6;
-  if (this->syntax() != 0) {
-    ::google::protobuf::internal::WireFormatLite::WriteEnum(
-      6, this->syntax(), output);
-  }
-
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
-  // @@protoc_insertion_point(serialize_end:google.protobuf.Type)
-}
-
-::google::protobuf::uint8* Type::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
-  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Type)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
-  if (this->name().size() > 0) {
-    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
-      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
-      "google.protobuf.Type.name");
-    target =
-      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
-        1, this->name(), target);
-  }
-
-  // repeated .google.protobuf.Field fields = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->fields_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->fields(static_cast<int>(i)), deterministic, target);
-  }
-
-  // repeated string oneofs = 3;
-  for (int i = 0, n = this->oneofs_size(); i < n; i++) {
-    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->oneofs(i).data(), static_cast<int>(this->oneofs(i).length()),
-      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
-      "google.protobuf.Type.oneofs");
-    target = ::google::protobuf::internal::WireFormatLite::
-      WriteStringToArray(3, this->oneofs(i), target);
-  }
-
-  // repeated .google.protobuf.Option options = 4;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        4, this->options(static_cast<int>(i)), deterministic, target);
-  }
-
-  // .google.protobuf.SourceContext source_context = 5;
-  if (this->has_source_context()) {
-    target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        5, *this->source_context_, deterministic, target);
-  }
-
-  // .google.protobuf.Syntax syntax = 6;
-  if (this->syntax() != 0) {
-    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
-      6, this->syntax(), target);
-  }
-
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
-  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Type)
-  return target;
-}
-
-size_t Type::ByteSizeLong() const {
-// @@protoc_insertion_point(message_byte_size_start:google.protobuf.Type)
-  size_t total_size = 0;
-
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // repeated .google.protobuf.Field fields = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->fields_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->fields(static_cast<int>(i)));
-    }
-  }
-
-  // repeated string oneofs = 3;
-  total_size += 1 *
-      ::google::protobuf::internal::FromIntSize(this->oneofs_size());
-  for (int i = 0, n = this->oneofs_size(); i < n; i++) {
-    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
-      this->oneofs(i));
-  }
-
-  // repeated .google.protobuf.Option options = 4;
-  {
-    unsigned int count = static_cast<unsigned int>(this->options_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->options(static_cast<int>(i)));
-    }
-  }
-
-  // string name = 1;
-  if (this->name().size() > 0) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::StringSize(
-        this->name());
-  }
-
-  // .google.protobuf.SourceContext source_context = 5;
-  if (this->has_source_context()) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::MessageSize(
-        *this->source_context_);
-  }
-
-  // .google.protobuf.Syntax syntax = 6;
-  if (this->syntax() != 0) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax());
-  }
-
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
-  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
-  GOOGLE_SAFE_CONCURRENT_WRITES_END();
-  return total_size;
-}
-
-void Type::MergeFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Type)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Type* source =
-      ::google::protobuf::internal::DynamicCastToGenerated<const Type>(
-          &from);
-  if (source == NULL) {
-  // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Type)
-    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
-  } else {
-  // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Type)
-    MergeFrom(*source);
-  }
-}
-
-void Type::MergeFrom(const Type& from) {
-// @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Type)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  fields_.MergeFrom(from.fields_);
-  oneofs_.MergeFrom(from.oneofs_);
-  options_.MergeFrom(from.options_);
-  if (from.name().size() > 0) {
-    set_name(from.name());
-  }
-  if (from.has_source_context()) {
-    mutable_source_context()->::google::protobuf::SourceContext::MergeFrom(from.source_context());
-  }
-  if (from.syntax() != 0) {
-    set_syntax(from.syntax());
-  }
-}
-
-void Type::CopyFrom(const ::google::protobuf::Message& from) {
-// @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Type)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-void Type::CopyFrom(const Type& from) {
-// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Type)
-  if (&from == this) return;
-  Clear();
-  MergeFrom(from);
-}
-
-bool Type::IsInitialized() const {
-  return true;
-}
-
-void Type::Swap(Type* other) {
-  if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Type* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Type::UnsafeArenaSwap(Type* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
-  InternalSwap(other);
-}
-void Type::InternalSwap(Type* other) {
-  using std::swap;
-  fields_.InternalSwap(&other->fields_);
-  oneofs_.InternalSwap(&other->oneofs_);
-  options_.InternalSwap(&other->options_);
-  name_.Swap(&other->name_);
-  swap(source_context_, other->source_context_);
-  swap(syntax_, other->syntax_);
-  _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
-}
-
-::google::protobuf::Metadata Type::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages];
-}
-
-
-// ===================================================================
-
-void Field::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Field::kKindFieldNumber;
 const int Field::kCardinalityFieldNumber;
@@ -967,62 +1044,35 @@
 
 Field::Field()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsField();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Field)
 }
-Field::Field(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  options_(arena) {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsField();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Field)
+
+void Field::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
 }
+
 Field::Field(const Field& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      options_(from.options_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.type_url().size() > 0) {
-    type_url_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_url(),
-      GetArenaNoVirtual());
-  }
-  json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.json_name().size() > 0) {
-    json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.json_name(),
-      GetArenaNoVirtual());
-  }
-  default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.default_value().size() > 0) {
-    default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.default_value(),
-      GetArenaNoVirtual());
-  }
-  ::memcpy(&kind_, &from.kind_,
-    static_cast<size_t>(reinterpret_cast<char*>(&packed_) -
-    reinterpret_cast<char*>(&kind_)) + sizeof(packed_));
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Field)
 }
 
 void Field::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
+  kind_ = 0;
+  cardinality_ = 0;
+  number_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  oneof_index_ = 0;
+  packed_ = false;
   json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&kind_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&packed_) -
-      reinterpret_cast<char*>(&kind_)) + sizeof(packed_));
-  _cached_size_ = 0;
 }
 
 Field::~Field() {
@@ -1031,53 +1081,69 @@
 }
 
 void Field::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   json_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   default_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void Field::ArenaDtor(void* object) {
-  Field* _this = reinterpret_cast< Field* >(object);
-  (void)_this;
-}
-void Field::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void Field::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Field::descriptor() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Field_descriptor_;
 }
 
 const Field& Field::default_instance() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsField();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  return *default_instance_;
 }
 
+Field* Field::default_instance_ = NULL;
+
 Field* Field::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Field>(arena);
+  Field* n = new Field;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void Field::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Field)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
+#if defined(__clang__)
+#define ZR_HELPER_(f) \
+  _Pragma("clang diagnostic push") \
+  _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \
+  __builtin_offsetof(Field, f) \
+  _Pragma("clang diagnostic pop")
+#else
+#define ZR_HELPER_(f) reinterpret_cast<char*>(\
+  &reinterpret_cast<Field*>(16)->f)
+#endif
+
+#define ZR_(first, last) do {\
+  ::memset(&first, 0,\
+           ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\
+} while (0)
+
+  ZR_(kind_, cardinality_);
+  ZR_(number_, oneof_index_);
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  packed_ = false;
+  json_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  default_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+
+#undef ZR_HELPER_
+#undef ZR_
 
   options_.Clear();
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  type_url_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  json_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  default_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  ::memset(&kind_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&packed_) -
-      reinterpret_cast<char*>(&kind_)) + sizeof(packed_));
-  _internal_metadata_.Clear();
 }
 
 bool Field::MergePartialFromCodedStream(
@@ -1086,14 +1152,13 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Field)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // .google.protobuf.Field.Kind kind = 1;
+      // optional .google.protobuf.Field.Kind kind = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
+        if (tag == 8) {
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -1102,13 +1167,14 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_cardinality;
         break;
       }
 
-      // .google.protobuf.Field.Cardinality cardinality = 2;
+      // optional .google.protobuf.Field.Cardinality cardinality = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
+        if (tag == 16) {
+         parse_cardinality:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -1117,133 +1183,148 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(24)) goto parse_number;
         break;
       }
 
-      // int32 number = 3;
+      // optional int32 number = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) {
-
+        if (tag == 24) {
+         parse_number:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &number_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(34)) goto parse_name;
         break;
       }
 
-      // string name = 4;
+      // optional string name = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
+        if (tag == 34) {
+         parse_name:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Field.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(50)) goto parse_type_url;
         break;
       }
 
-      // string type_url = 6;
+      // optional string type_url = 6;
       case 6: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) {
+        if (tag == 50) {
+         parse_type_url:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_type_url()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->type_url().data(), static_cast<int>(this->type_url().length()),
+            this->type_url().data(), this->type_url().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Field.type_url"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(56)) goto parse_oneof_index;
         break;
       }
 
-      // int32 oneof_index = 7;
+      // optional int32 oneof_index = 7;
       case 7: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) {
-
+        if (tag == 56) {
+         parse_oneof_index:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &oneof_index_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(64)) goto parse_packed;
         break;
       }
 
-      // bool packed = 8;
+      // optional bool packed = 8;
       case 8: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(64u /* 64 & 0xFF */)) {
-
+        if (tag == 64) {
+         parse_packed:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &packed_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(74)) goto parse_options;
         break;
       }
 
       // repeated .google.protobuf.Option options = 9;
       case 9: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(74u /* 74 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options()));
+        if (tag == 74) {
+         parse_options:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(74)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(82)) goto parse_json_name;
         break;
       }
 
-      // string json_name = 10;
+      // optional string json_name = 10;
       case 10: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) {
+        if (tag == 82) {
+         parse_json_name:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_json_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->json_name().data(), static_cast<int>(this->json_name().length()),
+            this->json_name().data(), this->json_name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Field.json_name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(90)) goto parse_default_value;
         break;
       }
 
-      // string default_value = 11;
+      // optional string default_value = 11;
       case 11: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(90u /* 90 & 0xFF */)) {
+        if (tag == 90) {
+         parse_default_value:
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_default_value()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->default_value().data(), static_cast<int>(this->default_value().length()),
+            this->default_value().data(), this->default_value().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Field.default_value"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1260,118 +1341,106 @@
 void Field::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Field)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // .google.protobuf.Field.Kind kind = 1;
+  // optional .google.protobuf.Field.Kind kind = 1;
   if (this->kind() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       1, this->kind(), output);
   }
 
-  // .google.protobuf.Field.Cardinality cardinality = 2;
+  // optional .google.protobuf.Field.Cardinality cardinality = 2;
   if (this->cardinality() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       2, this->cardinality(), output);
   }
 
-  // int32 number = 3;
+  // optional int32 number = 3;
   if (this->number() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->number(), output);
   }
 
-  // string name = 4;
+  // optional string name = 4;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       4, this->name(), output);
   }
 
-  // string type_url = 6;
+  // optional string type_url = 6;
   if (this->type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->type_url().data(), static_cast<int>(this->type_url().length()),
+      this->type_url().data(), this->type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.type_url");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       6, this->type_url(), output);
   }
 
-  // int32 oneof_index = 7;
+  // optional int32 oneof_index = 7;
   if (this->oneof_index() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(7, this->oneof_index(), output);
   }
 
-  // bool packed = 8;
+  // optional bool packed = 8;
   if (this->packed() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(8, this->packed(), output);
   }
 
   // repeated .google.protobuf.Option options = 9;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      9, this->options(static_cast<int>(i)), output);
+      9, this->options(i), output);
   }
 
-  // string json_name = 10;
+  // optional string json_name = 10;
   if (this->json_name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->json_name().data(), static_cast<int>(this->json_name().length()),
+      this->json_name().data(), this->json_name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.json_name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       10, this->json_name(), output);
   }
 
-  // string default_value = 11;
+  // optional string default_value = 11;
   if (this->default_value().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->default_value().data(), static_cast<int>(this->default_value().length()),
+      this->default_value().data(), this->default_value().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.default_value");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       11, this->default_value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Field)
 }
 
-::google::protobuf::uint8* Field::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Field::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Field)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // .google.protobuf.Field.Kind kind = 1;
+  // optional .google.protobuf.Field.Kind kind = 1;
   if (this->kind() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       1, this->kind(), target);
   }
 
-  // .google.protobuf.Field.Cardinality cardinality = 2;
+  // optional .google.protobuf.Field.Cardinality cardinality = 2;
   if (this->cardinality() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       2, this->cardinality(), target);
   }
 
-  // int32 number = 3;
+  // optional int32 number = 3;
   if (this->number() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->number(), target);
   }
 
-  // string name = 4;
+  // optional string name = 4;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.name");
     target =
@@ -1379,10 +1448,10 @@
         4, this->name(), target);
   }
 
-  // string type_url = 6;
+  // optional string type_url = 6;
   if (this->type_url().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->type_url().data(), static_cast<int>(this->type_url().length()),
+      this->type_url().data(), this->type_url().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.type_url");
     target =
@@ -1390,28 +1459,27 @@
         6, this->type_url(), target);
   }
 
-  // int32 oneof_index = 7;
+  // optional int32 oneof_index = 7;
   if (this->oneof_index() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(7, this->oneof_index(), target);
   }
 
-  // bool packed = 8;
+  // optional bool packed = 8;
   if (this->packed() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(8, this->packed(), target);
   }
 
   // repeated .google.protobuf.Option options = 9;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        9, this->options(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        9, this->options(i), target);
   }
 
-  // string json_name = 10;
+  // optional string json_name = 10;
   if (this->json_name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->json_name().data(), static_cast<int>(this->json_name().length()),
+      this->json_name().data(), this->json_name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.json_name");
     target =
@@ -1419,10 +1487,10 @@
         10, this->json_name(), target);
   }
 
-  // string default_value = 11;
+  // optional string default_value = 11;
   if (this->default_value().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->default_value().data(), static_cast<int>(this->default_value().length()),
+      this->default_value().data(), this->default_value().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Field.default_value");
     target =
@@ -1430,104 +1498,91 @@
         11, this->default_value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Field)
   return target;
 }
 
-size_t Field::ByteSizeLong() const {
+int Field::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Field)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // repeated .google.protobuf.Option options = 9;
-  {
-    unsigned int count = static_cast<unsigned int>(this->options_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->options(static_cast<int>(i)));
-    }
-  }
-
-  // string name = 4;
-  if (this->name().size() > 0) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::StringSize(
-        this->name());
-  }
-
-  // string type_url = 6;
-  if (this->type_url().size() > 0) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::StringSize(
-        this->type_url());
-  }
-
-  // string json_name = 10;
-  if (this->json_name().size() > 0) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::StringSize(
-        this->json_name());
-  }
-
-  // string default_value = 11;
-  if (this->default_value().size() > 0) {
-    total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::StringSize(
-        this->default_value());
-  }
-
-  // .google.protobuf.Field.Kind kind = 1;
+  // optional .google.protobuf.Field.Kind kind = 1;
   if (this->kind() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->kind());
   }
 
-  // .google.protobuf.Field.Cardinality cardinality = 2;
+  // optional .google.protobuf.Field.Cardinality cardinality = 2;
   if (this->cardinality() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->cardinality());
   }
 
-  // int32 number = 3;
+  // optional int32 number = 3;
   if (this->number() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int32Size(
         this->number());
   }
 
-  // int32 oneof_index = 7;
+  // optional string name = 4;
+  if (this->name().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->name());
+  }
+
+  // optional string type_url = 6;
+  if (this->type_url().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->type_url());
+  }
+
+  // optional int32 oneof_index = 7;
   if (this->oneof_index() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int32Size(
         this->oneof_index());
   }
 
-  // bool packed = 8;
+  // optional bool packed = 8;
   if (this->packed() != 0) {
     total_size += 1 + 1;
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // optional string json_name = 10;
+  if (this->json_name().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->json_name());
+  }
+
+  // optional string default_value = 11;
+  if (this->default_value().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->default_value());
+  }
+
+  // repeated .google.protobuf.Option options = 9;
+  total_size += 1 * this->options_size();
+  for (int i = 0; i < this->options_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->options(i));
+  }
+
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Field::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Field)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Field* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Field* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Field>(
           &from);
   if (source == NULL) {
@@ -1541,24 +1596,8 @@
 
 void Field::MergeFrom(const Field& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Field)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   options_.MergeFrom(from.options_);
-  if (from.name().size() > 0) {
-    set_name(from.name());
-  }
-  if (from.type_url().size() > 0) {
-    set_type_url(from.type_url());
-  }
-  if (from.json_name().size() > 0) {
-    set_json_name(from.json_name());
-  }
-  if (from.default_value().size() > 0) {
-    set_default_value(from.default_value());
-  }
   if (from.kind() != 0) {
     set_kind(from.kind());
   }
@@ -1568,12 +1607,28 @@
   if (from.number() != 0) {
     set_number(from.number());
   }
+  if (from.name().size() > 0) {
+
+    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
+  }
+  if (from.type_url().size() > 0) {
+
+    type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_url_);
+  }
   if (from.oneof_index() != 0) {
     set_oneof_index(from.oneof_index());
   }
   if (from.packed() != 0) {
     set_packed(from.packed());
   }
+  if (from.json_name().size() > 0) {
+
+    json_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.json_name_);
+  }
+  if (from.default_value().size() > 0) {
+
+    default_value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.default_value_);
+  }
 }
 
 void Field::CopyFrom(const ::google::protobuf::Message& from) {
@@ -1591,79 +1646,320 @@
 }
 
 bool Field::IsInitialized() const {
+
   return true;
 }
 
 void Field::Swap(Field* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Field* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Field::UnsafeArenaSwap(Field* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void Field::InternalSwap(Field* other) {
-  using std::swap;
-  options_.InternalSwap(&other->options_);
+  std::swap(kind_, other->kind_);
+  std::swap(cardinality_, other->cardinality_);
+  std::swap(number_, other->number_);
   name_.Swap(&other->name_);
   type_url_.Swap(&other->type_url_);
+  std::swap(oneof_index_, other->oneof_index_);
+  std::swap(packed_, other->packed_);
+  options_.UnsafeArenaSwap(&other->options_);
   json_name_.Swap(&other->json_name_);
   default_value_.Swap(&other->default_value_);
-  swap(kind_, other->kind_);
-  swap(cardinality_, other->cardinality_);
-  swap(number_, other->number_);
-  swap(oneof_index_, other->oneof_index_);
-  swap(packed_, other->packed_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Field::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Field_descriptor_;
+  metadata.reflection = Field_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Field
 
-// ===================================================================
+// optional .google.protobuf.Field.Kind kind = 1;
+void Field::clear_kind() {
+  kind_ = 0;
+}
+ ::google::protobuf::Field_Kind Field::kind() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.kind)
+  return static_cast< ::google::protobuf::Field_Kind >(kind_);
+}
+ void Field::set_kind(::google::protobuf::Field_Kind value) {
+  
+  kind_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.kind)
+}
 
-void Enum::InitAsDefaultInstance() {
-  ::google::protobuf::_Enum_default_instance_._instance.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>(
-      ::google::protobuf::SourceContext::internal_default_instance());
+// optional .google.protobuf.Field.Cardinality cardinality = 2;
+void Field::clear_cardinality() {
+  cardinality_ = 0;
 }
-void Enum::_slow_mutable_source_context() {
-  source_context_ = ::google::protobuf::Arena::Create< ::google::protobuf::SourceContext >(
-      GetArenaNoVirtual());
+ ::google::protobuf::Field_Cardinality Field::cardinality() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.cardinality)
+  return static_cast< ::google::protobuf::Field_Cardinality >(cardinality_);
 }
-void Enum::unsafe_arena_set_allocated_source_context(
-    ::google::protobuf::SourceContext* source_context) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete source_context_;
-  }
-  source_context_ = source_context;
-  if (source_context) {
+ void Field::set_cardinality(::google::protobuf::Field_Cardinality value) {
+  
+  cardinality_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.cardinality)
+}
+
+// optional int32 number = 3;
+void Field::clear_number() {
+  number_ = 0;
+}
+ ::google::protobuf::int32 Field::number() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.number)
+  return number_;
+}
+ void Field::set_number(::google::protobuf::int32 value) {
+  
+  number_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.number)
+}
+
+// optional string name = 4;
+void Field::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Field::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.name)
+}
+ void Field::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Field.name)
+}
+ void Field::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.name)
+}
+ ::std::string* Field::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Field.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Field::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Field.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
     
   } else {
     
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Enum.source_context)
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.name)
 }
-void Enum::clear_source_context() {
-  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) {
-    delete source_context_;
+
+// optional string type_url = 6;
+void Field::clear_type_url() {
+  type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Field::type_url() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.type_url)
+  return type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_type_url(const ::std::string& value) {
+  
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.type_url)
+}
+ void Field::set_type_url(const char* value) {
+  
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Field.type_url)
+}
+ void Field::set_type_url(const char* value, size_t size) {
+  
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.type_url)
+}
+ ::std::string* Field::mutable_type_url() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Field.type_url)
+  return type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Field::release_type_url() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Field.type_url)
+  
+  return type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_allocated_type_url(::std::string* type_url) {
+  if (type_url != NULL) {
+    
+  } else {
+    
   }
-  source_context_ = NULL;
+  type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_url);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.type_url)
 }
+
+// optional int32 oneof_index = 7;
+void Field::clear_oneof_index() {
+  oneof_index_ = 0;
+}
+ ::google::protobuf::int32 Field::oneof_index() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.oneof_index)
+  return oneof_index_;
+}
+ void Field::set_oneof_index(::google::protobuf::int32 value) {
+  
+  oneof_index_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.oneof_index)
+}
+
+// optional bool packed = 8;
+void Field::clear_packed() {
+  packed_ = false;
+}
+ bool Field::packed() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.packed)
+  return packed_;
+}
+ void Field::set_packed(bool value) {
+  
+  packed_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.packed)
+}
+
+// repeated .google.protobuf.Option options = 9;
+int Field::options_size() const {
+  return options_.size();
+}
+void Field::clear_options() {
+  options_.Clear();
+}
+const ::google::protobuf::Option& Field::options(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.options)
+  return options_.Get(index);
+}
+::google::protobuf::Option* Field::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Field.options)
+  return options_.Mutable(index);
+}
+::google::protobuf::Option* Field::add_options() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Field.options)
+  return options_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >*
+Field::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Field.options)
+  return &options_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
+Field::options() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Field.options)
+  return options_;
+}
+
+// optional string json_name = 10;
+void Field::clear_json_name() {
+  json_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Field::json_name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.json_name)
+  return json_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_json_name(const ::std::string& value) {
+  
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.json_name)
+}
+ void Field::set_json_name(const char* value) {
+  
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Field.json_name)
+}
+ void Field::set_json_name(const char* value, size_t size) {
+  
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.json_name)
+}
+ ::std::string* Field::mutable_json_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Field.json_name)
+  return json_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Field::release_json_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Field.json_name)
+  
+  return json_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_allocated_json_name(::std::string* json_name) {
+  if (json_name != NULL) {
+    
+  } else {
+    
+  }
+  json_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.json_name)
+}
+
+// optional string default_value = 11;
+void Field::clear_default_value() {
+  default_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Field::default_value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Field.default_value)
+  return default_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_default_value(const ::std::string& value) {
+  
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Field.default_value)
+}
+ void Field::set_default_value(const char* value) {
+  
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Field.default_value)
+}
+ void Field::set_default_value(const char* value, size_t size) {
+  
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.default_value)
+}
+ ::std::string* Field::mutable_default_value() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Field.default_value)
+  return default_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Field::release_default_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Field.default_value)
+  
+  return default_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Field::set_allocated_default_value(::std::string* default_value) {
+  if (default_value != NULL) {
+    
+  } else {
+    
+  }
+  default_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.default_value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Enum::kNameFieldNumber;
 const int Enum::kEnumvalueFieldNumber;
@@ -1674,49 +1970,30 @@
 
 Enum::Enum()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnum();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Enum)
 }
-Enum::Enum(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  enumvalue_(arena),
-  options_(arena) {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnum();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Enum)
+
+void Enum::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+  source_context_ = const_cast< ::google::protobuf::SourceContext*>(&::google::protobuf::SourceContext::default_instance());
 }
+
 Enum::Enum(const Enum& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      enumvalue_(from.enumvalue_),
-      options_(from.options_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_source_context()) {
-    source_context_ = new ::google::protobuf::SourceContext(*from.source_context_);
-  } else {
-    source_context_ = NULL;
-  }
-  syntax_ = from.syntax_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Enum)
 }
 
 void Enum::SharedCtor() {
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  ::memset(&source_context_, 0, static_cast<size_t>(
-      reinterpret_cast<char*>(&syntax_) -
-      reinterpret_cast<char*>(&source_context_)) + sizeof(syntax_));
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
+  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  source_context_ = NULL;
+  syntax_ = 0;
 }
 
 Enum::~Enum() {
@@ -1725,51 +2002,45 @@
 }
 
 void Enum::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete source_context_;
+  if (this != default_instance_) {
+    delete source_context_;
+  }
 }
 
-void Enum::ArenaDtor(void* object) {
-  Enum* _this = reinterpret_cast< Enum* >(object);
-  (void)_this;
-}
-void Enum::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void Enum::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Enum::descriptor() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Enum_descriptor_;
 }
 
 const Enum& Enum::default_instance() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnum();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  return *default_instance_;
 }
 
+Enum* Enum::default_instance_ = NULL;
+
 Enum* Enum::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Enum>(arena);
+  Enum* n = new Enum;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void Enum::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Enum)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  enumvalue_.Clear();
-  options_.Clear();
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) {
-    delete source_context_;
-  }
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
   source_context_ = NULL;
   syntax_ = 0;
-  _internal_metadata_.Clear();
+  enumvalue_.Clear();
+  options_.Clear();
 }
 
 bool Enum::MergePartialFromCodedStream(
@@ -1778,64 +2049,76 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Enum)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
+      // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Enum.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_enumvalue;
         break;
       }
 
       // repeated .google.protobuf.EnumValue enumvalue = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_enumvalue()));
+        if (tag == 18) {
+         parse_enumvalue:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_enumvalue:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_enumvalue()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_loop_enumvalue;
+        if (input->ExpectTag(26)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
         break;
       }
 
       // repeated .google.protobuf.Option options = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options()));
+        if (tag == 26) {
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectTag(34)) goto parse_source_context;
         break;
       }
 
-      // .google.protobuf.SourceContext source_context = 4;
+      // optional .google.protobuf.SourceContext source_context = 4;
       case 4: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 34) {
+         parse_source_context:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_source_context()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(40)) goto parse_syntax;
         break;
       }
 
-      // .google.protobuf.Syntax syntax = 5;
+      // optional .google.protobuf.Syntax syntax = 5;
       case 5: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) {
+        if (tag == 40) {
+         parse_syntax:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
@@ -1844,16 +2127,18 @@
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1870,13 +2155,10 @@
 void Enum::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Enum)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Enum.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
@@ -1884,49 +2166,39 @@
   }
 
   // repeated .google.protobuf.EnumValue enumvalue = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->enumvalue_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->enumvalue_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      2, this->enumvalue(static_cast<int>(i)), output);
+      2, this->enumvalue(i), output);
   }
 
   // repeated .google.protobuf.Option options = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      3, this->options(static_cast<int>(i)), output);
+      3, this->options(i), output);
   }
 
-  // .google.protobuf.SourceContext source_context = 4;
+  // optional .google.protobuf.SourceContext source_context = 4;
   if (this->has_source_context()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       4, *this->source_context_, output);
   }
 
-  // .google.protobuf.Syntax syntax = 5;
+  // optional .google.protobuf.Syntax syntax = 5;
   if (this->syntax() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteEnum(
       5, this->syntax(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Enum)
 }
 
-::google::protobuf::uint8* Enum::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Enum::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Enum)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Enum.name");
     target =
@@ -1935,104 +2207,86 @@
   }
 
   // repeated .google.protobuf.EnumValue enumvalue = 2;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->enumvalue_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->enumvalue_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, this->enumvalue(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        2, this->enumvalue(i), target);
   }
 
   // repeated .google.protobuf.Option options = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, this->options(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        3, this->options(i), target);
   }
 
-  // .google.protobuf.SourceContext source_context = 4;
+  // optional .google.protobuf.SourceContext source_context = 4;
   if (this->has_source_context()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        4, *this->source_context_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        4, *this->source_context_, target);
   }
 
-  // .google.protobuf.Syntax syntax = 5;
+  // optional .google.protobuf.Syntax syntax = 5;
   if (this->syntax() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
       5, this->syntax(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Enum)
   return target;
 }
 
-size_t Enum::ByteSizeLong() const {
+int Enum::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Enum)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // repeated .google.protobuf.EnumValue enumvalue = 2;
-  {
-    unsigned int count = static_cast<unsigned int>(this->enumvalue_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->enumvalue(static_cast<int>(i)));
-    }
-  }
-
-  // repeated .google.protobuf.Option options = 3;
-  {
-    unsigned int count = static_cast<unsigned int>(this->options_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->options(static_cast<int>(i)));
-    }
-  }
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->name());
   }
 
-  // .google.protobuf.SourceContext source_context = 4;
+  // optional .google.protobuf.SourceContext source_context = 4;
   if (this->has_source_context()) {
     total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::MessageSize(
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
         *this->source_context_);
   }
 
-  // .google.protobuf.Syntax syntax = 5;
+  // optional .google.protobuf.Syntax syntax = 5;
   if (this->syntax() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.EnumValue enumvalue = 2;
+  total_size += 1 * this->enumvalue_size();
+  for (int i = 0; i < this->enumvalue_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->enumvalue(i));
+  }
+
+  // repeated .google.protobuf.Option options = 3;
+  total_size += 1 * this->options_size();
+  for (int i = 0; i < this->options_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->options(i));
+  }
+
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Enum::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Enum)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Enum* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Enum* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Enum>(
           &from);
   if (source == NULL) {
@@ -2046,15 +2300,12 @@
 
 void Enum::MergeFrom(const Enum& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Enum)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   enumvalue_.MergeFrom(from.enumvalue_);
   options_.MergeFrom(from.options_);
   if (from.name().size() > 0) {
-    set_name(from.name());
+
+    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
   }
   if (from.has_source_context()) {
     mutable_source_context()->::google::protobuf::SourceContext::MergeFrom(from.source_context());
@@ -2079,49 +2330,195 @@
 }
 
 bool Enum::IsInitialized() const {
+
   return true;
 }
 
 void Enum::Swap(Enum* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Enum* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Enum::UnsafeArenaSwap(Enum* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void Enum::InternalSwap(Enum* other) {
-  using std::swap;
-  enumvalue_.InternalSwap(&other->enumvalue_);
-  options_.InternalSwap(&other->options_);
   name_.Swap(&other->name_);
-  swap(source_context_, other->source_context_);
-  swap(syntax_, other->syntax_);
+  enumvalue_.UnsafeArenaSwap(&other->enumvalue_);
+  options_.UnsafeArenaSwap(&other->options_);
+  std::swap(source_context_, other->source_context_);
+  std::swap(syntax_, other->syntax_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Enum::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Enum_descriptor_;
+  metadata.reflection = Enum_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Enum
+
+// optional string name = 1;
+void Enum::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Enum::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Enum.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Enum::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Enum.name)
+}
+ void Enum::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Enum.name)
+}
+ void Enum::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Enum.name)
+}
+ ::std::string* Enum::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Enum::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Enum.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Enum::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    
+  } else {
+    
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Enum.name)
+}
+
+// repeated .google.protobuf.EnumValue enumvalue = 2;
+int Enum::enumvalue_size() const {
+  return enumvalue_.size();
+}
+void Enum::clear_enumvalue() {
+  enumvalue_.Clear();
+}
+const ::google::protobuf::EnumValue& Enum::enumvalue(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Enum.enumvalue)
+  return enumvalue_.Get(index);
+}
+::google::protobuf::EnumValue* Enum::mutable_enumvalue(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.enumvalue)
+  return enumvalue_.Mutable(index);
+}
+::google::protobuf::EnumValue* Enum::add_enumvalue() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Enum.enumvalue)
+  return enumvalue_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValue >*
+Enum::mutable_enumvalue() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Enum.enumvalue)
+  return &enumvalue_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValue >&
+Enum::enumvalue() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Enum.enumvalue)
+  return enumvalue_;
+}
+
+// repeated .google.protobuf.Option options = 3;
+int Enum::options_size() const {
+  return options_.size();
+}
+void Enum::clear_options() {
+  options_.Clear();
+}
+const ::google::protobuf::Option& Enum::options(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Enum.options)
+  return options_.Get(index);
+}
+::google::protobuf::Option* Enum::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.options)
+  return options_.Mutable(index);
+}
+::google::protobuf::Option* Enum::add_options() {
+  // @@protoc_insertion_point(field_add:google.protobuf.Enum.options)
+  return options_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >*
+Enum::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.Enum.options)
+  return &options_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
+Enum::options() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.Enum.options)
+  return options_;
+}
+
+// optional .google.protobuf.SourceContext source_context = 4;
+bool Enum::has_source_context() const {
+  return !_is_default_instance_ && source_context_ != NULL;
+}
+void Enum::clear_source_context() {
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
+}
+const ::google::protobuf::SourceContext& Enum::source_context() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Enum.source_context)
+  return source_context_ != NULL ? *source_context_ : *default_instance_->source_context_;
+}
+::google::protobuf::SourceContext* Enum::mutable_source_context() {
+  
+  if (source_context_ == NULL) {
+    source_context_ = new ::google::protobuf::SourceContext;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.source_context)
+  return source_context_;
+}
+::google::protobuf::SourceContext* Enum::release_source_context() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Enum.source_context)
+  
+  ::google::protobuf::SourceContext* temp = source_context_;
+  source_context_ = NULL;
+  return temp;
+}
+void Enum::set_allocated_source_context(::google::protobuf::SourceContext* source_context) {
+  delete source_context_;
+  source_context_ = source_context;
+  if (source_context) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Enum.source_context)
+}
+
+// optional .google.protobuf.Syntax syntax = 5;
+void Enum::clear_syntax() {
+  syntax_ = 0;
+}
+ ::google::protobuf::Syntax Enum::syntax() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Enum.syntax)
+  return static_cast< ::google::protobuf::Syntax >(syntax_);
+}
+ void Enum::set_syntax(::google::protobuf::Syntax value) {
+  
+  syntax_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Enum.syntax)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void EnumValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int EnumValue::kNameFieldNumber;
 const int EnumValue::kNumberFieldNumber;
@@ -2130,40 +2527,28 @@
 
 EnumValue::EnumValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnumValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.EnumValue)
 }
-EnumValue::EnumValue(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena),
-  options_(arena) {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnumValue();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValue)
+
+void EnumValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
 }
+
 EnumValue::EnumValue(const EnumValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      options_(from.options_),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  number_ = from.number_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValue)
 }
 
 void EnumValue::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   number_ = 0;
-  _cached_size_ = 0;
 }
 
 EnumValue::~EnumValue() {
@@ -2172,45 +2557,41 @@
 }
 
 void EnumValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != default_instance_) {
+  }
 }
 
-void EnumValue::ArenaDtor(void* object) {
-  EnumValue* _this = reinterpret_cast< EnumValue* >(object);
-  (void)_this;
-}
-void EnumValue::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void EnumValue::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* EnumValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return EnumValue_descriptor_;
 }
 
 const EnumValue& EnumValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnumValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  return *default_instance_;
 }
 
+EnumValue* EnumValue::default_instance_ = NULL;
+
 EnumValue* EnumValue::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<EnumValue>(arena);
+  EnumValue* n = new EnumValue;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void EnumValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  options_.Clear();
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   number_ = 0;
-  _internal_metadata_.Clear();
+  options_.Clear();
 }
 
 bool EnumValue::MergePartialFromCodedStream(
@@ -2219,58 +2600,66 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.EnumValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
+      // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.EnumValue.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(16)) goto parse_number;
         break;
       }
 
-      // int32 number = 2;
+      // optional int32 number = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) {
-
+        if (tag == 16) {
+         parse_number:
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &number_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_options;
         break;
       }
 
       // repeated .google.protobuf.Option options = 3;
       case 3: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options()));
+        if (tag == 26) {
+         parse_options:
+          DO_(input->IncrementRecursionDepth());
+         parse_loop_options:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
+                input, add_options()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(26)) goto parse_loop_options;
+        input->UnsafeDecrementRecursionDepth();
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -2287,49 +2676,37 @@
 void EnumValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.EnumValue.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->name(), output);
   }
 
-  // int32 number = 2;
+  // optional int32 number = 2;
   if (this->number() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->number(), output);
   }
 
   // repeated .google.protobuf.Option options = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
-      3, this->options(static_cast<int>(i)), output);
+      3, this->options(i), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValue)
 }
 
-::google::protobuf::uint8* EnumValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* EnumValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.EnumValue.name");
     target =
@@ -2337,72 +2714,58 @@
         1, this->name(), target);
   }
 
-  // int32 number = 2;
+  // optional int32 number = 2;
   if (this->number() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->number(), target);
   }
 
   // repeated .google.protobuf.Option options = 3;
-  for (unsigned int i = 0,
-      n = static_cast<unsigned int>(this->options_size()); i < n; i++) {
+  for (unsigned int i = 0, n = this->options_size(); i < n; i++) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        3, this->options(static_cast<int>(i)), deterministic, target);
+      WriteMessageNoVirtualToArray(
+        3, this->options(i), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValue)
   return target;
 }
 
-size_t EnumValue::ByteSizeLong() const {
+int EnumValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // repeated .google.protobuf.Option options = 3;
-  {
-    unsigned int count = static_cast<unsigned int>(this->options_size());
-    total_size += 1UL * count;
-    for (unsigned int i = 0; i < count; i++) {
-      total_size +=
-        ::google::protobuf::internal::WireFormatLite::MessageSize(
-          this->options(static_cast<int>(i)));
-    }
-  }
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->name());
   }
 
-  // int32 number = 2;
+  // optional int32 number = 2;
   if (this->number() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int32Size(
         this->number());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  // repeated .google.protobuf.Option options = 3;
+  total_size += 1 * this->options_size();
+  for (int i = 0; i < this->options_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->options(i));
+  }
+
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void EnumValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const EnumValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const EnumValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const EnumValue>(
           &from);
   if (source == NULL) {
@@ -2416,14 +2779,11 @@
 
 void EnumValue::MergeFrom(const EnumValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   options_.MergeFrom(from.options_);
   if (from.name().size() > 0) {
-    set_name(from.name());
+
+    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
   }
   if (from.number() != 0) {
     set_number(from.number());
@@ -2445,72 +2805,125 @@
 }
 
 bool EnumValue::IsInitialized() const {
+
   return true;
 }
 
 void EnumValue::Swap(EnumValue* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    EnumValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void EnumValue::UnsafeArenaSwap(EnumValue* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void EnumValue::InternalSwap(EnumValue* other) {
-  using std::swap;
-  options_.InternalSwap(&other->options_);
   name_.Swap(&other->name_);
-  swap(number_, other->number_);
+  std::swap(number_, other->number_);
+  options_.UnsafeArenaSwap(&other->options_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata EnumValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = EnumValue_descriptor_;
+  metadata.reflection = EnumValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// EnumValue
 
-// ===================================================================
-
-void Option::InitAsDefaultInstance() {
-  ::google::protobuf::_Option_default_instance_._instance.get_mutable()->value_ = const_cast< ::google::protobuf::Any*>(
-      ::google::protobuf::Any::internal_default_instance());
+// optional string name = 1;
+void EnumValue::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
-void Option::_slow_mutable_value() {
-  value_ = ::google::protobuf::Arena::Create< ::google::protobuf::Any >(
-      GetArenaNoVirtual());
+ const ::std::string& EnumValue::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValue.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
-void Option::unsafe_arena_set_allocated_value(
-    ::google::protobuf::Any* value) {
-  if (GetArenaNoVirtual() == NULL) {
-    delete value_;
-  }
-  value_ = value;
-  if (value) {
+ void EnumValue::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumValue.name)
+}
+ void EnumValue::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.EnumValue.name)
+}
+ void EnumValue::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumValue.name)
+}
+ ::std::string* EnumValue::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValue.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* EnumValue::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.EnumValue.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void EnumValue::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
     
   } else {
     
   }
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Option.value)
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValue.name)
 }
-void Option::clear_value() {
-  if (GetArenaNoVirtual() == NULL && value_ != NULL) {
-    delete value_;
-  }
-  value_ = NULL;
+
+// optional int32 number = 2;
+void EnumValue::clear_number() {
+  number_ = 0;
 }
+ ::google::protobuf::int32 EnumValue::number() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValue.number)
+  return number_;
+}
+ void EnumValue::set_number(::google::protobuf::int32 value) {
+  
+  number_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.EnumValue.number)
+}
+
+// repeated .google.protobuf.Option options = 3;
+int EnumValue::options_size() const {
+  return options_.size();
+}
+void EnumValue::clear_options() {
+  options_.Clear();
+}
+const ::google::protobuf::Option& EnumValue::options(int index) const {
+  // @@protoc_insertion_point(field_get:google.protobuf.EnumValue.options)
+  return options_.Get(index);
+}
+::google::protobuf::Option* EnumValue::mutable_options(int index) {
+  // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValue.options)
+  return options_.Mutable(index);
+}
+::google::protobuf::Option* EnumValue::add_options() {
+  // @@protoc_insertion_point(field_add:google.protobuf.EnumValue.options)
+  return options_.Add();
+}
+::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >*
+EnumValue::mutable_options() {
+  // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumValue.options)
+  return &options_;
+}
+const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
+EnumValue::options() const {
+  // @@protoc_insertion_point(field_list:google.protobuf.EnumValue.options)
+  return options_;
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
+
+// ===================================================================
+
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Option::kNameFieldNumber;
 const int Option::kValueFieldNumber;
@@ -2518,42 +2931,29 @@
 
 Option::Option()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Option)
 }
-Option::Option(::google::protobuf::Arena* arena)
-  : ::google::protobuf::Message(),
-  _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  SharedCtor();
-  RegisterArenaDtor(arena);
-  // @@protoc_insertion_point(arena_constructor:google.protobuf.Option)
+
+void Option::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+  value_ = const_cast< ::google::protobuf::Any*>(&::google::protobuf::Any::default_instance());
 }
+
 Option::Option(const Option& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.name().size() > 0) {
-    name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(),
-      GetArenaNoVirtual());
-  }
-  if (from.has_value()) {
-    value_ = new ::google::protobuf::Any(*from.value_);
-  } else {
-    value_ = NULL;
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Option)
 }
 
 void Option::SharedCtor() {
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
+  _cached_size_ = 0;
   name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   value_ = NULL;
-  _cached_size_ = 0;
 }
 
 Option::~Option() {
@@ -2562,48 +2962,42 @@
 }
 
 void Option::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (this != internal_default_instance()) delete value_;
+  if (this != default_instance_) {
+    delete value_;
+  }
 }
 
-void Option::ArenaDtor(void* object) {
-  Option* _this = reinterpret_cast< Option* >(object);
-  (void)_this;
-}
-void Option::RegisterArenaDtor(::google::protobuf::Arena* arena) {
-}
 void Option::SetCachedSize(int size) const {
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
   _cached_size_ = size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Option::descriptor() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Option_descriptor_;
 }
 
 const Option& Option::default_instance() {
-  ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  return *default_instance_;
 }
 
+Option* Option::default_instance_ = NULL;
+
 Option* Option::New(::google::protobuf::Arena* arena) const {
-  return ::google::protobuf::Arena::CreateMessage<Option>(arena);
+  Option* n = new Option;
+  if (arena != NULL) {
+    arena->Own(n);
+  }
+  return n;
 }
 
 void Option::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Option)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  if (GetArenaNoVirtual() == NULL && value_ != NULL) {
-    delete value_;
-  }
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == NULL && value_ != NULL) delete value_;
   value_ = NULL;
-  _internal_metadata_.Clear();
 }
 
 bool Option::MergePartialFromCodedStream(
@@ -2612,45 +3006,47 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Option)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string name = 1;
+      // optional string name = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_name()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->name().data(), static_cast<int>(this->name().length()),
+            this->name().data(), this->name().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.Option.name"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectTag(18)) goto parse_value;
         break;
       }
 
-      // .google.protobuf.Any value = 2;
+      // optional .google.protobuf.Any value = 2;
       case 2: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) {
-          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+        if (tag == 18) {
+         parse_value:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
                input, mutable_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -2667,43 +3063,32 @@
 void Option::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Option)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Option.name");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->name(), output);
   }
 
-  // .google.protobuf.Any value = 2;
+  // optional .google.protobuf.Any value = 2;
   if (this->has_value()) {
     ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
       2, *this->value_, output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Option)
 }
 
-::google::protobuf::uint8* Option::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Option::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Option)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->name().data(), static_cast<int>(this->name().length()),
+      this->name().data(), this->name().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.Option.name");
     target =
@@ -2711,55 +3096,45 @@
         1, this->name(), target);
   }
 
-  // .google.protobuf.Any value = 2;
+  // optional .google.protobuf.Any value = 2;
   if (this->has_value()) {
     target = ::google::protobuf::internal::WireFormatLite::
-      InternalWriteMessageToArray(
-        2, *this->value_, deterministic, target);
+      WriteMessageNoVirtualToArray(
+        2, *this->value_, target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Option)
   return target;
 }
 
-size_t Option::ByteSizeLong() const {
+int Option::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Option)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // string name = 1;
+  // optional string name = 1;
   if (this->name().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->name());
   }
 
-  // .google.protobuf.Any value = 2;
+  // optional .google.protobuf.Any value = 2;
   if (this->has_value()) {
     total_size += 1 +
-      ::google::protobuf::internal::WireFormatLite::MessageSize(
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
         *this->value_);
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Option::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Option)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Option* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Option* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Option>(
           &from);
   if (source == NULL) {
@@ -2773,13 +3148,10 @@
 
 void Option::MergeFrom(const Option& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Option)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.name().size() > 0) {
-    set_name(from.name());
+
+    name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_);
   }
   if (from.has_value()) {
     mutable_value()->::google::protobuf::Any::MergeFrom(from.value());
@@ -2801,43 +3173,118 @@
 }
 
 bool Option::IsInitialized() const {
+
   return true;
 }
 
 void Option::Swap(Option* other) {
   if (other == this) return;
-  if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
-    InternalSwap(other);
-  } else {
-    Option* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
-  }
-}
-void Option::UnsafeArenaSwap(Option* other) {
-  if (other == this) return;
-  GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
   InternalSwap(other);
 }
 void Option::InternalSwap(Option* other) {
-  using std::swap;
   name_.Swap(&other->name_);
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Option::GetMetadata() const {
-  protobuf_google_2fprotobuf_2ftype_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2ftype_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Option_descriptor_;
+  metadata.reflection = Option_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Option
+
+// optional string name = 1;
+void Option::clear_name() {
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ const ::std::string& Option::name() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Option.name)
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Option::set_name(const ::std::string& value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:google.protobuf.Option.name)
+}
+ void Option::set_name(const char* value) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:google.protobuf.Option.name)
+}
+ void Option::set_name(const char* value, size_t size) {
+  
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.Option.name)
+}
+ ::std::string* Option::mutable_name() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Option.name)
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ ::std::string* Option::release_name() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Option.name)
+  
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void Option::set_allocated_name(::std::string* name) {
+  if (name != NULL) {
+    
+  } else {
+    
+  }
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Option.name)
+}
+
+// optional .google.protobuf.Any value = 2;
+bool Option::has_value() const {
+  return !_is_default_instance_ && value_ != NULL;
+}
+void Option::clear_value() {
+  if (GetArenaNoVirtual() == NULL && value_ != NULL) delete value_;
+  value_ = NULL;
+}
+const ::google::protobuf::Any& Option::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Option.value)
+  return value_ != NULL ? *value_ : *default_instance_->value_;
+}
+::google::protobuf::Any* Option::mutable_value() {
+  
+  if (value_ == NULL) {
+    value_ = new ::google::protobuf::Any;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Option.value)
+  return value_;
+}
+::google::protobuf::Any* Option::release_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.Option.value)
+  
+  ::google::protobuf::Any* temp = value_;
+  value_ = NULL;
+  return temp;
+}
+void Option::set_allocated_value(::google::protobuf::Any* value) {
+  delete value_;
+  value_ = value;
+  if (value) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.Option.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/type.pb.h b/src/google/protobuf/type.pb.h
index 8ee74a1..4255fa8 100644
--- a/src/google/protobuf/type.pb.h
+++ b/src/google/protobuf/type.pb.h
@@ -8,82 +8,43 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/generated_enum_reflection.h>
 #include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/any.pb.h>
 #include <google/protobuf/source_context.pb.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2ftype_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[5];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsTypeImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsType();
-void LIBPROTOBUF_EXPORT InitDefaultsFieldImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsField();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnum();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsEnumValue();
-void LIBPROTOBUF_EXPORT InitDefaultsOptionImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsOption();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsType();
-  InitDefaultsField();
-  InitDefaultsEnum();
-  InitDefaultsEnumValue();
-  InitDefaultsOption();
-}
-}  // namespace protobuf_google_2fprotobuf_2ftype_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto();
+
 class Enum;
-class EnumDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumDefaultTypeInternal _Enum_default_instance_;
 class EnumValue;
-class EnumValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern EnumValueDefaultTypeInternal _EnumValue_default_instance_;
 class Field;
-class FieldDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FieldDefaultTypeInternal _Field_default_instance_;
 class Option;
-class OptionDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern OptionDefaultTypeInternal _Option_default_instance_;
 class Type;
-class TypeDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern TypeDefaultTypeInternal _Type_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 enum Field_Kind {
   Field_Kind_TYPE_UNKNOWN = 0,
@@ -169,7 +130,7 @@
 }
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT Type : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Type) */ {
+class LIBPROTOBUF_EXPORT Type : public ::google::protobuf::Message {
  public:
   Type();
   virtual ~Type();
@@ -180,74 +141,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Type(Type&& from) noexcept
-    : Type() {
-    *this = ::std::move(from);
-  }
 
-  inline Type& operator=(Type&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Type& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Type* internal_default_instance() {
-    return reinterpret_cast<const Type*>(
-               &_Type_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
-  void UnsafeArenaSwap(Type* other);
   void Swap(Type* other);
-  friend void swap(Type& a, Type& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Type* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Type* New() const { return New(NULL); }
 
-  Type* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Type* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Type& from);
   void MergeFrom(const Type& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Type* other);
-  protected:
-  explicit Type(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -257,12 +180,23 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
   // repeated .google.protobuf.Field fields = 2;
   int fields_size() const;
   void clear_fields();
@@ -282,16 +216,10 @@
   const ::std::string& oneofs(int index) const;
   ::std::string* mutable_oneofs(int index);
   void set_oneofs(int index, const ::std::string& value);
-  #if LANG_CXX11
-  void set_oneofs(int index, ::std::string&& value);
-  #endif
   void set_oneofs(int index, const char* value);
   void set_oneofs(int index, const char* value, size_t size);
   ::std::string* add_oneofs();
   void add_oneofs(const ::std::string& value);
-  #if LANG_CXX11
-  void add_oneofs(::std::string&& value);
-  #endif
   void add_oneofs(const char* value);
   void add_oneofs(const char* value, size_t size);
   const ::google::protobuf::RepeatedPtrField< ::std::string>& oneofs() const;
@@ -309,45 +237,16 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
       options() const;
 
-  // string name = 1;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // .google.protobuf.SourceContext source_context = 5;
+  // optional .google.protobuf.SourceContext source_context = 5;
   bool has_source_context() const;
   void clear_source_context();
   static const int kSourceContextFieldNumber = 5;
-  private:
-  void _slow_mutable_source_context();
-  public:
   const ::google::protobuf::SourceContext& source_context() const;
-  ::google::protobuf::SourceContext* release_source_context();
   ::google::protobuf::SourceContext* mutable_source_context();
+  ::google::protobuf::SourceContext* release_source_context();
   void set_allocated_source_context(::google::protobuf::SourceContext* source_context);
-  void unsafe_arena_set_allocated_source_context(
-      ::google::protobuf::SourceContext* source_context);
-  ::google::protobuf::SourceContext* unsafe_arena_release_source_context();
 
-  // .google.protobuf.Syntax syntax = 6;
+  // optional .google.protobuf.Syntax syntax = 6;
   void clear_syntax();
   static const int kSyntaxFieldNumber = 6;
   ::google::protobuf::Syntax syntax() const;
@@ -357,22 +256,24 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
+  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::Field > fields_;
   ::google::protobuf::RepeatedPtrField< ::std::string> oneofs_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
-  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::SourceContext* source_context_;
   int syntax_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ftype_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsTypeImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto();
+
+  void InitAsDefaultInstance();
+  static Type* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Field : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Field) */ {
+class LIBPROTOBUF_EXPORT Field : public ::google::protobuf::Message {
  public:
   Field();
   virtual ~Field();
@@ -383,74 +284,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Field(Field&& from) noexcept
-    : Field() {
-    *this = ::std::move(from);
-  }
 
-  inline Field& operator=(Field&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Field& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Field* internal_default_instance() {
-    return reinterpret_cast<const Field*>(
-               &_Field_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    1;
-
-  void UnsafeArenaSwap(Field* other);
   void Swap(Field* other);
-  friend void swap(Field& a, Field& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Field* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Field* New() const { return New(NULL); }
 
-  Field* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Field* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Field& from);
   void MergeFrom(const Field& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Field* other);
-  protected:
-  explicit Field(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -460,7 +323,7 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
@@ -556,6 +419,58 @@
 
   // accessors -------------------------------------------------------
 
+  // optional .google.protobuf.Field.Kind kind = 1;
+  void clear_kind();
+  static const int kKindFieldNumber = 1;
+  ::google::protobuf::Field_Kind kind() const;
+  void set_kind(::google::protobuf::Field_Kind value);
+
+  // optional .google.protobuf.Field.Cardinality cardinality = 2;
+  void clear_cardinality();
+  static const int kCardinalityFieldNumber = 2;
+  ::google::protobuf::Field_Cardinality cardinality() const;
+  void set_cardinality(::google::protobuf::Field_Cardinality value);
+
+  // optional int32 number = 3;
+  void clear_number();
+  static const int kNumberFieldNumber = 3;
+  ::google::protobuf::int32 number() const;
+  void set_number(::google::protobuf::int32 value);
+
+  // optional string name = 4;
+  void clear_name();
+  static const int kNameFieldNumber = 4;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
+  // optional string type_url = 6;
+  void clear_type_url();
+  static const int kTypeUrlFieldNumber = 6;
+  const ::std::string& type_url() const;
+  void set_type_url(const ::std::string& value);
+  void set_type_url(const char* value);
+  void set_type_url(const char* value, size_t size);
+  ::std::string* mutable_type_url();
+  ::std::string* release_type_url();
+  void set_allocated_type_url(::std::string* type_url);
+
+  // optional int32 oneof_index = 7;
+  void clear_oneof_index();
+  static const int kOneofIndexFieldNumber = 7;
+  ::google::protobuf::int32 oneof_index() const;
+  void set_oneof_index(::google::protobuf::int32 value);
+
+  // optional bool packed = 8;
+  void clear_packed();
+  static const int kPackedFieldNumber = 8;
+  bool packed() const;
+  void set_packed(bool value);
+
   // repeated .google.protobuf.Option options = 9;
   int options_size() const;
   void clear_options();
@@ -568,152 +483,54 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
       options() const;
 
-  // string name = 4;
-  void clear_name();
-  static const int kNameFieldNumber = 4;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // string type_url = 6;
-  void clear_type_url();
-  static const int kTypeUrlFieldNumber = 6;
-  const ::std::string& type_url() const;
-  void set_type_url(const ::std::string& value);
-  #if LANG_CXX11
-  void set_type_url(::std::string&& value);
-  #endif
-  void set_type_url(const char* value);
-  void set_type_url(const char* value, size_t size);
-  ::std::string* mutable_type_url();
-  ::std::string* release_type_url();
-  void set_allocated_type_url(::std::string* type_url);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_type_url();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_type_url(
-      ::std::string* type_url);
-
-  // string json_name = 10;
+  // optional string json_name = 10;
   void clear_json_name();
   static const int kJsonNameFieldNumber = 10;
   const ::std::string& json_name() const;
   void set_json_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_json_name(::std::string&& value);
-  #endif
   void set_json_name(const char* value);
   void set_json_name(const char* value, size_t size);
   ::std::string* mutable_json_name();
   ::std::string* release_json_name();
   void set_allocated_json_name(::std::string* json_name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_json_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_json_name(
-      ::std::string* json_name);
 
-  // string default_value = 11;
+  // optional string default_value = 11;
   void clear_default_value();
   static const int kDefaultValueFieldNumber = 11;
   const ::std::string& default_value() const;
   void set_default_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_default_value(::std::string&& value);
-  #endif
   void set_default_value(const char* value);
   void set_default_value(const char* value, size_t size);
   ::std::string* mutable_default_value();
   ::std::string* release_default_value();
   void set_allocated_default_value(::std::string* default_value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_default_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_default_value(
-      ::std::string* default_value);
-
-  // .google.protobuf.Field.Kind kind = 1;
-  void clear_kind();
-  static const int kKindFieldNumber = 1;
-  ::google::protobuf::Field_Kind kind() const;
-  void set_kind(::google::protobuf::Field_Kind value);
-
-  // .google.protobuf.Field.Cardinality cardinality = 2;
-  void clear_cardinality();
-  static const int kCardinalityFieldNumber = 2;
-  ::google::protobuf::Field_Cardinality cardinality() const;
-  void set_cardinality(::google::protobuf::Field_Cardinality value);
-
-  // int32 number = 3;
-  void clear_number();
-  static const int kNumberFieldNumber = 3;
-  ::google::protobuf::int32 number() const;
-  void set_number(::google::protobuf::int32 value);
-
-  // int32 oneof_index = 7;
-  void clear_oneof_index();
-  static const int kOneofIndexFieldNumber = 7;
-  ::google::protobuf::int32 oneof_index() const;
-  void set_oneof_index(::google::protobuf::int32 value);
-
-  // bool packed = 8;
-  void clear_packed();
-  static const int kPackedFieldNumber = 8;
-  bool packed() const;
-  void set_packed(bool value);
 
   // @@protoc_insertion_point(class_scope:google.protobuf.Field)
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
-  ::google::protobuf::internal::ArenaStringPtr name_;
-  ::google::protobuf::internal::ArenaStringPtr type_url_;
-  ::google::protobuf::internal::ArenaStringPtr json_name_;
-  ::google::protobuf::internal::ArenaStringPtr default_value_;
+  bool _is_default_instance_;
   int kind_;
   int cardinality_;
+  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::int32 number_;
   ::google::protobuf::int32 oneof_index_;
+  ::google::protobuf::internal::ArenaStringPtr type_url_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
+  ::google::protobuf::internal::ArenaStringPtr json_name_;
+  ::google::protobuf::internal::ArenaStringPtr default_value_;
   bool packed_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ftype_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsFieldImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto();
+
+  void InitAsDefaultInstance();
+  static Field* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Enum : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Enum) */ {
+class LIBPROTOBUF_EXPORT Enum : public ::google::protobuf::Message {
  public:
   Enum();
   virtual ~Enum();
@@ -724,74 +541,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Enum(Enum&& from) noexcept
-    : Enum() {
-    *this = ::std::move(from);
-  }
 
-  inline Enum& operator=(Enum&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Enum& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Enum* internal_default_instance() {
-    return reinterpret_cast<const Enum*>(
-               &_Enum_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    2;
-
-  void UnsafeArenaSwap(Enum* other);
   void Swap(Enum* other);
-  friend void swap(Enum& a, Enum& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Enum* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Enum* New() const { return New(NULL); }
 
-  Enum* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Enum* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Enum& from);
   void MergeFrom(const Enum& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Enum* other);
-  protected:
-  explicit Enum(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -801,12 +580,23 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
   // repeated .google.protobuf.EnumValue enumvalue = 2;
   int enumvalue_size() const;
   void clear_enumvalue();
@@ -831,45 +621,16 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
       options() const;
 
-  // string name = 1;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // .google.protobuf.SourceContext source_context = 4;
+  // optional .google.protobuf.SourceContext source_context = 4;
   bool has_source_context() const;
   void clear_source_context();
   static const int kSourceContextFieldNumber = 4;
-  private:
-  void _slow_mutable_source_context();
-  public:
   const ::google::protobuf::SourceContext& source_context() const;
-  ::google::protobuf::SourceContext* release_source_context();
   ::google::protobuf::SourceContext* mutable_source_context();
+  ::google::protobuf::SourceContext* release_source_context();
   void set_allocated_source_context(::google::protobuf::SourceContext* source_context);
-  void unsafe_arena_set_allocated_source_context(
-      ::google::protobuf::SourceContext* source_context);
-  ::google::protobuf::SourceContext* unsafe_arena_release_source_context();
 
-  // .google.protobuf.Syntax syntax = 5;
+  // optional .google.protobuf.Syntax syntax = 5;
   void clear_syntax();
   static const int kSyntaxFieldNumber = 5;
   ::google::protobuf::Syntax syntax() const;
@@ -879,21 +640,23 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
+  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValue > enumvalue_;
   ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
-  ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::SourceContext* source_context_;
   int syntax_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ftype_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnumImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto();
+
+  void InitAsDefaultInstance();
+  static Enum* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT EnumValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValue) */ {
+class LIBPROTOBUF_EXPORT EnumValue : public ::google::protobuf::Message {
  public:
   EnumValue();
   virtual ~EnumValue();
@@ -904,74 +667,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  EnumValue(EnumValue&& from) noexcept
-    : EnumValue() {
-    *this = ::std::move(from);
-  }
 
-  inline EnumValue& operator=(EnumValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const EnumValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const EnumValue* internal_default_instance() {
-    return reinterpret_cast<const EnumValue*>(
-               &_EnumValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    3;
-
-  void UnsafeArenaSwap(EnumValue* other);
   void Swap(EnumValue* other);
-  friend void swap(EnumValue& a, EnumValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline EnumValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline EnumValue* New() const { return New(NULL); }
 
-  EnumValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  EnumValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const EnumValue& from);
   void MergeFrom(const EnumValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(EnumValue* other);
-  protected:
-  explicit EnumValue(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -981,12 +706,29 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
+  // optional string name = 1;
+  void clear_name();
+  static const int kNameFieldNumber = 1;
+  const ::std::string& name() const;
+  void set_name(const ::std::string& value);
+  void set_name(const char* value);
+  void set_name(const char* value, size_t size);
+  ::std::string* mutable_name();
+  ::std::string* release_name();
+  void set_allocated_name(::std::string* name);
+
+  // optional int32 number = 2;
+  void clear_number();
+  static const int kNumberFieldNumber = 2;
+  ::google::protobuf::int32 number() const;
+  void set_number(::google::protobuf::int32 value);
+
   // repeated .google.protobuf.Option options = 3;
   int options_size() const;
   void clear_options();
@@ -999,52 +741,25 @@
   const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >&
       options() const;
 
-  // string name = 1;
-  void clear_name();
-  static const int kNameFieldNumber = 1;
-  const ::std::string& name() const;
-  void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
-  void set_name(const char* value);
-  void set_name(const char* value, size_t size);
-  ::std::string* mutable_name();
-  ::std::string* release_name();
-  void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
-
-  // int32 number = 2;
-  void clear_number();
-  static const int kNumberFieldNumber = 2;
-  ::google::protobuf::int32 number() const;
-  void set_number(::google::protobuf::int32 value);
-
   // @@protoc_insertion_point(class_scope:google.protobuf.EnumValue)
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
-  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr name_;
+  ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_;
   ::google::protobuf::int32 number_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ftype_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsEnumValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto();
+
+  void InitAsDefaultInstance();
+  static EnumValue* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Option : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Option) */ {
+class LIBPROTOBUF_EXPORT Option : public ::google::protobuf::Message {
  public:
   Option();
   virtual ~Option();
@@ -1055,74 +770,36 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Option(Option&& from) noexcept
-    : Option() {
-    *this = ::std::move(from);
-  }
 
-  inline Option& operator=(Option&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
-    return MaybeArenaPtr();
-  }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Option& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Option* internal_default_instance() {
-    return reinterpret_cast<const Option*>(
-               &_Option_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    4;
-
-  void UnsafeArenaSwap(Option* other);
   void Swap(Option* other);
-  friend void swap(Option& a, Option& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Option* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Option* New() const { return New(NULL); }
 
-  Option* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Option* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Option& from);
   void MergeFrom(const Option& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Option* other);
-  protected:
-  explicit Option(::google::protobuf::Arena* arena);
-  private:
-  static void ArenaDtor(void* object);
-  inline void RegisterArenaDtor(::google::protobuf::Arena* arena);
   private:
   inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
     return _internal_metadata_.arena();
@@ -1132,118 +809,88 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // string name = 1;
+  // optional string name = 1;
   void clear_name();
   static const int kNameFieldNumber = 1;
   const ::std::string& name() const;
   void set_name(const ::std::string& value);
-  #if LANG_CXX11
-  void set_name(::std::string&& value);
-  #endif
   void set_name(const char* value);
   void set_name(const char* value, size_t size);
   ::std::string* mutable_name();
   ::std::string* release_name();
   void set_allocated_name(::std::string* name);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  ::std::string* unsafe_arena_release_name();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
-  void unsafe_arena_set_allocated_name(
-      ::std::string* name);
 
-  // .google.protobuf.Any value = 2;
+  // optional .google.protobuf.Any value = 2;
   bool has_value() const;
   void clear_value();
   static const int kValueFieldNumber = 2;
-  private:
-  void _slow_mutable_value();
-  public:
   const ::google::protobuf::Any& value() const;
-  ::google::protobuf::Any* release_value();
   ::google::protobuf::Any* mutable_value();
+  ::google::protobuf::Any* release_value();
   void set_allocated_value(::google::protobuf::Any* value);
-  void unsafe_arena_set_allocated_value(
-      ::google::protobuf::Any* value);
-  ::google::protobuf::Any* unsafe_arena_release_value();
 
   // @@protoc_insertion_point(class_scope:google.protobuf.Option)
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
-  typedef void InternalArenaConstructable_;
-  typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr name_;
   ::google::protobuf::Any* value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2ftype_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOptionImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2ftype_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto();
+
+  void InitAsDefaultInstance();
+  static Option* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // Type
 
-// string name = 1;
+// optional string name = 1;
 inline void Type::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Type::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Type.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Type::set_name(const ::std::string& value) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Type.name)
 }
-#if LANG_CXX11
-inline void Type::set_name(::std::string&& value) {
-  
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Type.name)
-}
-#endif
 inline void Type::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Type.name)
 }
-inline void Type::set_name(const char* value,
-    size_t size) {
+inline void Type::set_name(const char* value, size_t size) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Type.name)
 }
 inline ::std::string* Type::mutable_name() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Type.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Type::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.Type.name)
   
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Type::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -1251,29 +898,9 @@
   } else {
     
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Type.name)
 }
-inline ::std::string* Type::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Type.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Type::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    
-  } else {
-    
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Type.name)
-}
 
 // repeated .google.protobuf.Field fields = 2;
 inline int Type::fields_size() const {
@@ -1324,14 +951,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Type.oneofs)
   oneofs_.Mutable(index)->assign(value);
 }
-#if LANG_CXX11
-inline void Type::set_oneofs(int index, ::std::string&& value) {
-  // @@protoc_insertion_point(field_set:google.protobuf.Type.oneofs)
-  oneofs_.Mutable(index)->assign(std::move(value));
-}
-#endif
 inline void Type::set_oneofs(int index, const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   oneofs_.Mutable(index)->assign(value);
   // @@protoc_insertion_point(field_set_char:google.protobuf.Type.oneofs)
 }
@@ -1348,14 +968,7 @@
   oneofs_.Add()->assign(value);
   // @@protoc_insertion_point(field_add:google.protobuf.Type.oneofs)
 }
-#if LANG_CXX11
-inline void Type::add_oneofs(::std::string&& value) {
-  oneofs_.Add(std::move(value));
-  // @@protoc_insertion_point(field_add:google.protobuf.Type.oneofs)
-}
-#endif
 inline void Type::add_oneofs(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   oneofs_.Add()->assign(value);
   // @@protoc_insertion_point(field_add_char:google.protobuf.Type.oneofs)
 }
@@ -1404,61 +1017,45 @@
   return options_;
 }
 
-// .google.protobuf.SourceContext source_context = 5;
+// optional .google.protobuf.SourceContext source_context = 5;
 inline bool Type::has_source_context() const {
-  return this != internal_default_instance() && source_context_ != NULL;
+  return !_is_default_instance_ && source_context_ != NULL;
+}
+inline void Type::clear_source_context() {
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
 }
 inline const ::google::protobuf::SourceContext& Type::source_context() const {
-  const ::google::protobuf::SourceContext* p = source_context_;
   // @@protoc_insertion_point(field_get:google.protobuf.Type.source_context)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::SourceContext*>(
-      &::google::protobuf::_SourceContext_default_instance_);
+  return source_context_ != NULL ? *source_context_ : *default_instance_->source_context_;
+}
+inline ::google::protobuf::SourceContext* Type::mutable_source_context() {
+  
+  if (source_context_ == NULL) {
+    source_context_ = new ::google::protobuf::SourceContext;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.source_context)
+  return source_context_;
 }
 inline ::google::protobuf::SourceContext* Type::release_source_context() {
   // @@protoc_insertion_point(field_release:google.protobuf.Type.source_context)
   
   ::google::protobuf::SourceContext* temp = source_context_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   source_context_ = NULL;
   return temp;
 }
-inline ::google::protobuf::SourceContext* Type::unsafe_arena_release_source_context() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Type.source_context)
-  
-  ::google::protobuf::SourceContext* temp = source_context_;
-  source_context_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::SourceContext* Type::mutable_source_context() {
-  
-  if (source_context_ == NULL) {
-    _slow_mutable_source_context();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.Type.source_context)
-  return source_context_;
-}
 inline void Type::set_allocated_source_context(::google::protobuf::SourceContext* source_context) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete reinterpret_cast< ::google::protobuf::MessageLite*>(source_context_);
-  }
+  delete source_context_;
+  source_context_ = source_context;
   if (source_context) {
-    ::google::protobuf::Arena* submessage_arena = NULL;
-    if (message_arena != submessage_arena) {
-      source_context = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, source_context, submessage_arena);
-    }
     
   } else {
     
   }
-  source_context_ = source_context;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Type.source_context)
 }
 
-// .google.protobuf.Syntax syntax = 6;
+// optional .google.protobuf.Syntax syntax = 6;
 inline void Type::clear_syntax() {
   syntax_ = 0;
 }
@@ -1476,7 +1073,7 @@
 
 // Field
 
-// .google.protobuf.Field.Kind kind = 1;
+// optional .google.protobuf.Field.Kind kind = 1;
 inline void Field::clear_kind() {
   kind_ = 0;
 }
@@ -1490,7 +1087,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Field.kind)
 }
 
-// .google.protobuf.Field.Cardinality cardinality = 2;
+// optional .google.protobuf.Field.Cardinality cardinality = 2;
 inline void Field::clear_cardinality() {
   cardinality_ = 0;
 }
@@ -1504,7 +1101,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Field.cardinality)
 }
 
-// int32 number = 3;
+// optional int32 number = 3;
 inline void Field::clear_number() {
   number_ = 0;
 }
@@ -1518,50 +1115,39 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Field.number)
 }
 
-// string name = 4;
+// optional string name = 4;
 inline void Field::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Field::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Field.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_name(const ::std::string& value) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Field.name)
 }
-#if LANG_CXX11
-inline void Field::set_name(::std::string&& value) {
-  
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Field.name)
-}
-#endif
 inline void Field::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Field.name)
 }
-inline void Field::set_name(const char* value,
-    size_t size) {
+inline void Field::set_name(const char* value, size_t size) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.name)
 }
 inline ::std::string* Field::mutable_name() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Field.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Field::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.Field.name)
   
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -1569,74 +1155,43 @@
   } else {
     
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.name)
 }
-inline ::std::string* Field::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Field.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Field::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    
-  } else {
-    
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Field.name)
-}
 
-// string type_url = 6;
+// optional string type_url = 6;
 inline void Field::clear_type_url() {
-  type_url_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Field::type_url() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Field.type_url)
-  return type_url_.Get();
+  return type_url_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_type_url(const ::std::string& value) {
   
-  type_url_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Field.type_url)
 }
-#if LANG_CXX11
-inline void Field::set_type_url(::std::string&& value) {
-  
-  type_url_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Field.type_url)
-}
-#endif
 inline void Field::set_type_url(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  type_url_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Field.type_url)
 }
-inline void Field::set_type_url(const char* value,
-    size_t size) {
+inline void Field::set_type_url(const char* value, size_t size) {
   
-  type_url_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.type_url)
 }
 inline ::std::string* Field::mutable_type_url() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Field.type_url)
-  return type_url_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Field::release_type_url() {
   // @@protoc_insertion_point(field_release:google.protobuf.Field.type_url)
   
-  return type_url_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_allocated_type_url(::std::string* type_url) {
   if (type_url != NULL) {
@@ -1644,31 +1199,11 @@
   } else {
     
   }
-  type_url_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_url,
-      GetArenaNoVirtual());
+  type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_url);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.type_url)
 }
-inline ::std::string* Field::unsafe_arena_release_type_url() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Field.type_url)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return type_url_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Field::unsafe_arena_set_allocated_type_url(
-    ::std::string* type_url) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (type_url != NULL) {
-    
-  } else {
-    
-  }
-  type_url_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      type_url, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Field.type_url)
-}
 
-// int32 oneof_index = 7;
+// optional int32 oneof_index = 7;
 inline void Field::clear_oneof_index() {
   oneof_index_ = 0;
 }
@@ -1682,7 +1217,7 @@
   // @@protoc_insertion_point(field_set:google.protobuf.Field.oneof_index)
 }
 
-// bool packed = 8;
+// optional bool packed = 8;
 inline void Field::clear_packed() {
   packed_ = false;
 }
@@ -1726,50 +1261,39 @@
   return options_;
 }
 
-// string json_name = 10;
+// optional string json_name = 10;
 inline void Field::clear_json_name() {
-  json_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  json_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Field::json_name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Field.json_name)
-  return json_name_.Get();
+  return json_name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_json_name(const ::std::string& value) {
   
-  json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Field.json_name)
 }
-#if LANG_CXX11
-inline void Field::set_json_name(::std::string&& value) {
-  
-  json_name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Field.json_name)
-}
-#endif
 inline void Field::set_json_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Field.json_name)
 }
-inline void Field::set_json_name(const char* value,
-    size_t size) {
+inline void Field::set_json_name(const char* value, size_t size) {
   
-  json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  json_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.json_name)
 }
 inline ::std::string* Field::mutable_json_name() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Field.json_name)
-  return json_name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return json_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Field::release_json_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.Field.json_name)
   
-  return json_name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return json_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_allocated_json_name(::std::string* json_name) {
   if (json_name != NULL) {
@@ -1777,74 +1301,43 @@
   } else {
     
   }
-  json_name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name,
-      GetArenaNoVirtual());
+  json_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.json_name)
 }
-inline ::std::string* Field::unsafe_arena_release_json_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Field.json_name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return json_name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Field::unsafe_arena_set_allocated_json_name(
-    ::std::string* json_name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (json_name != NULL) {
-    
-  } else {
-    
-  }
-  json_name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      json_name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Field.json_name)
-}
 
-// string default_value = 11;
+// optional string default_value = 11;
 inline void Field::clear_default_value() {
-  default_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  default_value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Field::default_value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Field.default_value)
-  return default_value_.Get();
+  return default_value_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_default_value(const ::std::string& value) {
   
-  default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Field.default_value)
 }
-#if LANG_CXX11
-inline void Field::set_default_value(::std::string&& value) {
-  
-  default_value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Field.default_value)
-}
-#endif
 inline void Field::set_default_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Field.default_value)
 }
-inline void Field::set_default_value(const char* value,
-    size_t size) {
+inline void Field::set_default_value(const char* value, size_t size) {
   
-  default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  default_value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Field.default_value)
 }
 inline ::std::string* Field::mutable_default_value() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Field.default_value)
-  return default_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return default_value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Field::release_default_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.Field.default_value)
   
-  return default_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return default_value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Field::set_allocated_default_value(::std::string* default_value) {
   if (default_value != NULL) {
@@ -1852,78 +1345,47 @@
   } else {
     
   }
-  default_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value,
-      GetArenaNoVirtual());
+  default_value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Field.default_value)
 }
-inline ::std::string* Field::unsafe_arena_release_default_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Field.default_value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return default_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Field::unsafe_arena_set_allocated_default_value(
-    ::std::string* default_value) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (default_value != NULL) {
-    
-  } else {
-    
-  }
-  default_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      default_value, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Field.default_value)
-}
 
 // -------------------------------------------------------------------
 
 // Enum
 
-// string name = 1;
+// optional string name = 1;
 inline void Enum::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Enum::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Enum.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Enum::set_name(const ::std::string& value) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Enum.name)
 }
-#if LANG_CXX11
-inline void Enum::set_name(::std::string&& value) {
-  
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Enum.name)
-}
-#endif
 inline void Enum::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Enum.name)
 }
-inline void Enum::set_name(const char* value,
-    size_t size) {
+inline void Enum::set_name(const char* value, size_t size) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Enum.name)
 }
 inline ::std::string* Enum::mutable_name() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Enum::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.Enum.name)
   
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Enum::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -1931,29 +1393,9 @@
   } else {
     
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Enum.name)
 }
-inline ::std::string* Enum::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Enum.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Enum::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    
-  } else {
-    
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Enum.name)
-}
 
 // repeated .google.protobuf.EnumValue enumvalue = 2;
 inline int Enum::enumvalue_size() const {
@@ -2015,61 +1457,45 @@
   return options_;
 }
 
-// .google.protobuf.SourceContext source_context = 4;
+// optional .google.protobuf.SourceContext source_context = 4;
 inline bool Enum::has_source_context() const {
-  return this != internal_default_instance() && source_context_ != NULL;
+  return !_is_default_instance_ && source_context_ != NULL;
+}
+inline void Enum::clear_source_context() {
+  if (GetArenaNoVirtual() == NULL && source_context_ != NULL) delete source_context_;
+  source_context_ = NULL;
 }
 inline const ::google::protobuf::SourceContext& Enum::source_context() const {
-  const ::google::protobuf::SourceContext* p = source_context_;
   // @@protoc_insertion_point(field_get:google.protobuf.Enum.source_context)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::SourceContext*>(
-      &::google::protobuf::_SourceContext_default_instance_);
+  return source_context_ != NULL ? *source_context_ : *default_instance_->source_context_;
+}
+inline ::google::protobuf::SourceContext* Enum::mutable_source_context() {
+  
+  if (source_context_ == NULL) {
+    source_context_ = new ::google::protobuf::SourceContext;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.source_context)
+  return source_context_;
 }
 inline ::google::protobuf::SourceContext* Enum::release_source_context() {
   // @@protoc_insertion_point(field_release:google.protobuf.Enum.source_context)
   
   ::google::protobuf::SourceContext* temp = source_context_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   source_context_ = NULL;
   return temp;
 }
-inline ::google::protobuf::SourceContext* Enum::unsafe_arena_release_source_context() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Enum.source_context)
-  
-  ::google::protobuf::SourceContext* temp = source_context_;
-  source_context_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::SourceContext* Enum::mutable_source_context() {
-  
-  if (source_context_ == NULL) {
-    _slow_mutable_source_context();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.Enum.source_context)
-  return source_context_;
-}
 inline void Enum::set_allocated_source_context(::google::protobuf::SourceContext* source_context) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete reinterpret_cast< ::google::protobuf::MessageLite*>(source_context_);
-  }
+  delete source_context_;
+  source_context_ = source_context;
   if (source_context) {
-    ::google::protobuf::Arena* submessage_arena = NULL;
-    if (message_arena != submessage_arena) {
-      source_context = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, source_context, submessage_arena);
-    }
     
   } else {
     
   }
-  source_context_ = source_context;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Enum.source_context)
 }
 
-// .google.protobuf.Syntax syntax = 5;
+// optional .google.protobuf.Syntax syntax = 5;
 inline void Enum::clear_syntax() {
   syntax_ = 0;
 }
@@ -2087,50 +1513,39 @@
 
 // EnumValue
 
-// string name = 1;
+// optional string name = 1;
 inline void EnumValue::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& EnumValue::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.EnumValue.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void EnumValue::set_name(const ::std::string& value) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.EnumValue.name)
 }
-#if LANG_CXX11
-inline void EnumValue::set_name(::std::string&& value) {
-  
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.EnumValue.name)
-}
-#endif
 inline void EnumValue::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.EnumValue.name)
 }
-inline void EnumValue::set_name(const char* value,
-    size_t size) {
+inline void EnumValue::set_name(const char* value, size_t size) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumValue.name)
 }
 inline ::std::string* EnumValue::mutable_name() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValue.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* EnumValue::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.EnumValue.name)
   
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void EnumValue::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -2138,31 +1553,11 @@
   } else {
     
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValue.name)
 }
-inline ::std::string* EnumValue::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumValue.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void EnumValue::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    
-  } else {
-    
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumValue.name)
-}
 
-// int32 number = 2;
+// optional int32 number = 2;
 inline void EnumValue::clear_number() {
   number_ = 0;
 }
@@ -2210,50 +1605,39 @@
 
 // Option
 
-// string name = 1;
+// optional string name = 1;
 inline void Option::clear_name() {
-  name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline const ::std::string& Option::name() const {
   // @@protoc_insertion_point(field_get:google.protobuf.Option.name)
-  return name_.Get();
+  return name_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Option::set_name(const ::std::string& value) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
   // @@protoc_insertion_point(field_set:google.protobuf.Option.name)
 }
-#if LANG_CXX11
-inline void Option::set_name(::std::string&& value) {
-  
-  name_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Option.name)
-}
-#endif
 inline void Option::set_name(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
-              GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
   // @@protoc_insertion_point(field_set_char:google.protobuf.Option.name)
 }
-inline void Option::set_name(const char* value,
-    size_t size) {
+inline void Option::set_name(const char* value, size_t size) {
   
-  name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
-      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
   // @@protoc_insertion_point(field_set_pointer:google.protobuf.Option.name)
 }
 inline ::std::string* Option::mutable_name() {
   
   // @@protoc_insertion_point(field_mutable:google.protobuf.Option.name)
-  return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline ::std::string* Option::release_name() {
   // @@protoc_insertion_point(field_release:google.protobuf.Option.name)
   
-  return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void Option::set_allocated_name(::std::string* name) {
   if (name != NULL) {
@@ -2261,87 +1645,49 @@
   } else {
     
   }
-  name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name,
-      GetArenaNoVirtual());
+  name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name);
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Option.name)
 }
-inline ::std::string* Option::unsafe_arena_release_name() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Option.name)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
-inline void Option::unsafe_arena_set_allocated_name(
-    ::std::string* name) {
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  if (name != NULL) {
-    
-  } else {
-    
-  }
-  name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      name, GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Option.name)
-}
 
-// .google.protobuf.Any value = 2;
+// optional .google.protobuf.Any value = 2;
 inline bool Option::has_value() const {
-  return this != internal_default_instance() && value_ != NULL;
+  return !_is_default_instance_ && value_ != NULL;
+}
+inline void Option::clear_value() {
+  if (GetArenaNoVirtual() == NULL && value_ != NULL) delete value_;
+  value_ = NULL;
 }
 inline const ::google::protobuf::Any& Option::value() const {
-  const ::google::protobuf::Any* p = value_;
   // @@protoc_insertion_point(field_get:google.protobuf.Option.value)
-  return p != NULL ? *p : *reinterpret_cast<const ::google::protobuf::Any*>(
-      &::google::protobuf::_Any_default_instance_);
+  return value_ != NULL ? *value_ : *default_instance_->value_;
+}
+inline ::google::protobuf::Any* Option::mutable_value() {
+  
+  if (value_ == NULL) {
+    value_ = new ::google::protobuf::Any;
+  }
+  // @@protoc_insertion_point(field_mutable:google.protobuf.Option.value)
+  return value_;
 }
 inline ::google::protobuf::Any* Option::release_value() {
   // @@protoc_insertion_point(field_release:google.protobuf.Option.value)
   
   ::google::protobuf::Any* temp = value_;
-  if (GetArenaNoVirtual() != NULL) {
-    temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);
-  }
   value_ = NULL;
   return temp;
 }
-inline ::google::protobuf::Any* Option::unsafe_arena_release_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Option.value)
-  
-  ::google::protobuf::Any* temp = value_;
-  value_ = NULL;
-  return temp;
-}
-inline ::google::protobuf::Any* Option::mutable_value() {
-  
-  if (value_ == NULL) {
-    _slow_mutable_value();
-  }
-  // @@protoc_insertion_point(field_mutable:google.protobuf.Option.value)
-  return value_;
-}
 inline void Option::set_allocated_value(::google::protobuf::Any* value) {
-  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
-  if (message_arena == NULL) {
-    delete reinterpret_cast< ::google::protobuf::MessageLite*>(value_);
-  }
+  delete value_;
+  value_ = value;
   if (value) {
-    ::google::protobuf::Arena* submessage_arena = NULL;
-    if (message_arena != submessage_arena) {
-      value = ::google::protobuf::internal::GetOwnedMessage(
-          message_arena, value, submessage_arena);
-    }
     
   } else {
     
   }
-  value_ = value;
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.Option.value)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 // -------------------------------------------------------------------
 
 // -------------------------------------------------------------------
@@ -2356,6 +1702,7 @@
 }  // namespace protobuf
 }  // namespace google
 
+#ifndef SWIG
 namespace google {
 namespace protobuf {
 
@@ -2377,6 +1724,7 @@
 
 }  // namespace protobuf
 }  // namespace google
+#endif  // SWIG
 
 // @@protoc_insertion_point(global_scope)
 
diff --git a/src/google/protobuf/type.proto b/src/google/protobuf/type.proto
index 624c15e..1c9cf53 100644
--- a/src/google/protobuf/type.proto
+++ b/src/google/protobuf/type.proto
@@ -36,12 +36,11 @@
 import "google/protobuf/source_context.proto";
 
 option csharp_namespace = "Google.Protobuf.WellKnownTypes";
-option cc_enable_arenas = true;
 option java_package = "com.google.protobuf";
 option java_outer_classname = "TypeProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
-option go_package = "google.golang.org/genproto/protobuf/ptype;ptype";
 
 // A protocol buffer message type.
 message Type {
@@ -166,15 +165,9 @@
 // A protocol buffer option, which can be attached to a message, field,
 // enumeration, etc.
 message Option {
-  // The option's name. For protobuf built-in options (options defined in
-  // descriptor.proto), this is the short name. For example, `"map_entry"`.
-  // For custom options, it should be the fully-qualified name. For example,
-  // `"google.api.http"`.
+  // The option's name. For example, `"java_package"`.
   string name = 1;
-  // The option's value packed in an Any message. If the value is a primitive,
-  // the corresponding wrapper type defined in google/protobuf/wrappers.proto
-  // should be used. If the value is an enum, it should be stored as an int32
-  // value using the google.protobuf.Int32Value type.
+  // The option's value. For example, `"com.google.protobuf"`.
   Any value = 2;
 }
 
diff --git a/src/google/protobuf/unittest.proto b/src/google/protobuf/unittest.proto
index 45a0eda..da56ae0 100644
--- a/src/google/protobuf/unittest.proto
+++ b/src/google/protobuf/unittest.proto
@@ -191,15 +191,10 @@
   optional int32 deprecated_int32 = 1 [deprecated=true];
 }
 
-message TestDeprecatedMessage {
-  option deprecated = true;
-}
-
 // Define these after TestAllTypes to make sure the compiler can handle
 // that.
 message ForeignMessage {
   optional int32 c = 1;
-  optional int32 d = 2;
 }
 
 enum ForeignEnum {
@@ -397,12 +392,6 @@
   optional int32 dummy = 3;
 }
 
-message TestRequiredMessage {
-  optional TestRequired optional_message = 1;
-  repeated TestRequired repeated_message = 2;
-  required TestRequired required_message = 3;
-}
-
 // Test that we can use NestedMessage from outside TestAllTypes.
 message TestForeignNested {
   optional TestAllTypes.NestedMessage foreign_nested = 1;
@@ -439,14 +428,7 @@
 
 // Test that mutual recursion works.
 message TestMutualRecursionA {
-  message SubMessage {
-    optional TestMutualRecursionB b = 1;
-  }
   optional TestMutualRecursionB bb = 1;
-  optional group SubGroup = 2 {
-    optional SubMessage sub_message = 3;  // Needed because of bug in javatest
-    optional TestAllTypes not_in_this_scc = 4;
-  }
 }
 
 message TestMutualRecursionB {
@@ -454,15 +436,6 @@
   optional int32 optional_int32 = 2;
 }
 
-message TestIsInitialized {
-  message SubMessage {
-    optional group SubGroup = 1 {
-      required int32 i = 2;
-    }
-  }
-  optional SubMessage sub_message = 1;
-}
-
 // Test that groups have disjoint field numbers from their siblings and
 // parents.  This is NOT possible in proto1; only google.protobuf.  When attempting
 // to compile with proto1, this will emit an error; so we only include it
@@ -904,42 +877,3 @@
 message BarRequest  {}
 message BarResponse {}
 
-message TestJsonName {
-  optional int32 field_name1 = 1;
-  optional int32 fieldName2 = 2;
-  optional int32 FieldName3 = 3;
-  optional int32 _field_name4 = 4;
-  optional int32 FIELD_NAME5 = 5;
-  optional int32 field_name6 = 6 [json_name = "@type"];
-}
-
-message TestHugeFieldNumbers {
-  optional int32 optional_int32 = 536870000;
-  optional int32 fixed_32 = 536870001;
-  repeated int32 repeated_int32 = 536870002 [packed = false];
-  repeated int32 packed_int32 = 536870003 [packed = true];
-
-  optional ForeignEnum optional_enum = 536870004;
-  optional string optional_string = 536870005;
-  optional bytes optional_bytes = 536870006;
-  optional ForeignMessage optional_message = 536870007;
-
-  optional group OptionalGroup = 536870008 {
-    optional int32 group_a = 536870009;
-  }
-
-  map<string, string> string_string_map = 536870010;
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 536870011;
-    TestAllTypes oneof_test_all_types = 536870012;
-    string oneof_string = 536870013;
-    bytes oneof_bytes = 536870014;
-  }
-
-  extensions  536860000 to 536869999;
-}
-
-extend TestHugeFieldNumbers {
-  optional TestAllTypes test_all_types = 536860000;
-}
diff --git a/src/google/protobuf/unittest_custom_options.proto b/src/google/protobuf/unittest_custom_options.proto
index 218447e..4cc0e36 100644
--- a/src/google/protobuf/unittest_custom_options.proto
+++ b/src/google/protobuf/unittest_custom_options.proto
@@ -69,10 +69,6 @@
   optional int32 field_opt2 = 7753913 [default=42];
 }
 
-extend google.protobuf.OneofOptions {
-  optional int32 oneof_opt1 = 7740111;
-}
-
 extend google.protobuf.EnumOptions {
   optional sfixed32 enum_opt1 = 7753576;
 }
@@ -104,11 +100,6 @@
   optional string field1 = 1 [ctype=CORD,
                               (field_opt1)=8765432109];
 
-  oneof AnOneof {
-    option (oneof_opt1) = -99;
-    int32 oneof_field = 2;
-  }
-
   enum AnEnum {
     option (enum_opt1) = -789;
 
diff --git a/src/google/protobuf/unittest_lazy_dependencies.proto b/src/google/protobuf/unittest_lazy_dependencies.proto
deleted file mode 100644
index 2f5efd2..0000000
--- a/src/google/protobuf/unittest_lazy_dependencies.proto
+++ /dev/null
@@ -1,75 +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.
-
-// Author: trafacz@google.com (Todd Rafacz)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-syntax = "proto2";
-
-import "google/protobuf/unittest_lazy_dependencies_custom_option.proto";
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;   // auto-added
-option java_generic_services = true; // auto-added
-option py_generic_services = true;   // auto-added
-option cc_enable_arenas = true;
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest.lazy_imports;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestLazyImportsProto";
-
-// The following are used to test that the proto file
-// with the definition of the following field types is
-// not built when this proto file is built. Then test
-// that calling message_type() etc will build the correct
-// descriptor lazily and return it.
-
-message ImportedMessage {
-  optional LazyMessage lazy_message = 1;
-}
-
-message MessageCustomOption {
-}
-
-message MessageCustomOption2 {
-  option (lazy_enum_option) = LAZY_ENUM_0;
-}
diff --git a/src/google/protobuf/unittest_lazy_dependencies_custom_option.proto b/src/google/protobuf/unittest_lazy_dependencies_custom_option.proto
deleted file mode 100644
index 2243825..0000000
--- a/src/google/protobuf/unittest_lazy_dependencies_custom_option.proto
+++ /dev/null
@@ -1,67 +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.
-
-// Author: trafacz@google.com (Todd Rafacz)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-syntax = "proto2";
-
-import "google/protobuf/unittest_lazy_dependencies_enum.proto";
-import "google/protobuf/descriptor.proto";
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;   // auto-added
-option java_generic_services = true; // auto-added
-option py_generic_services = true;   // auto-added
-option cc_enable_arenas = true;
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest.lazy_imports;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestLazyImportsCustomOptionProto";
-
-message LazyMessage {
-  optional int32 a = 1;
-}
-
-extend google.protobuf.MessageOptions {
-  optional LazyEnum lazy_enum_option = 138596335 [default = LAZY_ENUM_1];
-}
diff --git a/src/google/protobuf/unittest_lazy_dependencies_enum.proto b/src/google/protobuf/unittest_lazy_dependencies_enum.proto
deleted file mode 100644
index 9be64d8..0000000
--- a/src/google/protobuf/unittest_lazy_dependencies_enum.proto
+++ /dev/null
@@ -1,61 +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.
-
-// Author: trafacz@google.com (Todd Rafacz)
-//  Based on original Protocol Buffers design by
-//  Sanjay Ghemawat, Jeff Dean, and others.
-//
-// A proto file we will use for unit testing.
-
-syntax = "proto2";
-
-// Some generic_services option(s) added automatically.
-// See:  http://go/proto2-generic-services-default
-option cc_generic_services = true;   // auto-added
-option java_generic_services = true; // auto-added
-option py_generic_services = true;   // auto-added
-option cc_enable_arenas = true;
-
-// We don't put this in a package within proto2 because we need to make sure
-// that the generated code doesn't depend on being in the proto2 namespace.
-// In test_util.h we do "using namespace unittest = protobuf_unittest".
-package protobuf_unittest.lazy_imports;
-
-// Protos optimized for SPEED use a strict superset of the generated code
-// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
-// tests for speed unless explicitly testing code size optimization.
-option optimize_for = SPEED;
-
-option java_outer_classname = "UnittestLazyImportsEnumProto";
-
-enum LazyEnum {
-  LAZY_ENUM_0 = 0;
-  LAZY_ENUM_1 = 1;
-}
diff --git a/src/google/protobuf/unittest_lite.proto b/src/google/protobuf/unittest_lite.proto
index 9a15bda..878ec7c 100644
--- a/src/google/protobuf/unittest_lite.proto
+++ b/src/google/protobuf/unittest_lite.proto
@@ -163,9 +163,6 @@
     bytes oneof_bytes = 114;
     NestedMessage oneof_lazy_nested_message = 115 [lazy = true];
   }
-
-  // Tests toString for non-repeated fields with a list suffix
-  optional int32 deceptively_named_list = 116;
 }
 
 message ForeignMessageLite {
@@ -408,49 +405,3 @@
     required int32 int_field = 1;
     optional V2EnumLite enum_field = 2 [ default = V2_FIRST ];
 }
-
-message TestHugeFieldNumbersLite {
-  optional int32 optional_int32 = 536870000;
-  optional int32 fixed_32 = 536870001;
-  repeated int32 repeated_int32 = 536870002 [packed = false];
-  repeated int32 packed_int32 = 536870003 [packed = true];
-
-  optional ForeignEnumLite optional_enum = 536870004;
-  optional string optional_string = 536870005;
-  optional bytes optional_bytes = 536870006;
-  optional ForeignMessageLite optional_message = 536870007;
-
-  optional group OptionalGroup = 536870008 {
-    optional int32 group_a = 536870009;
-  }
-
-  map<string, string> string_string_map = 536870010;
-
-  oneof oneof_field {
-    uint32 oneof_uint32 = 536870011;
-    TestAllTypesLite oneof_test_all_types = 536870012;
-    string oneof_string = 536870013;
-    bytes oneof_bytes = 536870014;
-  }
-
-  extensions  536860000 to 536869999;
-}
-
-extend TestHugeFieldNumbersLite {
-  optional TestAllTypesLite test_all_types_lite = 536860000;
-}
-
-message TestOneofParsingLite {
-  oneof oneof_field {
-    int32 oneof_int32 = 1;
-    TestAllTypesLite oneof_submessage = 2;
-    string oneof_string = 3;
-    bytes oneof_bytes = 4 [default = "default bytes"];
-    string oneof_string_cord = 5 [ctype = CORD, default = "default Cord"];
-    bytes oneof_bytes_cord = 6 [ctype = CORD];
-    string oneof_string_string_piece = 7 [ctype = STRING_PIECE];
-    bytes oneof_bytes_string_piece = 8
-        [ctype = STRING_PIECE, default = "default StringPiece"];
-    V2EnumLite oneof_enum = 9;
-  }
-}
diff --git a/src/google/protobuf/unittest_proto3.proto b/src/google/protobuf/unittest_proto3.proto
index 84815d4..f59d217 100644
--- a/src/google/protobuf/unittest_proto3.proto
+++ b/src/google/protobuf/unittest_proto3.proto
@@ -28,13 +28,35 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file we will use for unit testing.
+
 syntax = "proto3";
 
+// Some generic_services option(s) added automatically.
+// See:  http://go/proto2-generic-services-default
+option cc_generic_services = true;     // auto-added
+option java_generic_services = true;   // auto-added
+option py_generic_services = true;     // auto-added
+option cc_enable_arenas = true;
+option csharp_namespace = "Google.Protobuf.TestProtos";
+
+import "google/protobuf/unittest_import_proto3.proto";
+
+// We don't put this in a package within proto2 because we need to make sure
+// that the generated code doesn't depend on being in the proto2 namespace.
+// In test_util.h we do "using namespace unittest = protobuf_unittest".
+package protobuf_unittest;
+
+// Protos optimized for SPEED use a strict superset of the generated code
+// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
+// tests for speed unless explicitly testing code size optimization.
 option optimize_for = SPEED;
 
-import "google/protobuf/unittest_import.proto";
-
-package proto3_unittest;
+option java_outer_classname = "UnittestProto";
 
 // This proto includes every type of field in both singular and repeated
 // forms.
@@ -47,7 +69,7 @@
   }
 
   enum NestedEnum {
-    ZERO = 0;
+    NESTED_ENUM_UNSPECIFIED = 0;
     FOO = 1;
     BAR = 2;
     BAZ = 3;
@@ -55,49 +77,33 @@
   }
 
   // Singular
-     int32 optional_int32    =  1;
-     int64 optional_int64    =  2;
-    uint32 optional_uint32   =  3;
-    uint64 optional_uint64   =  4;
-    sint32 optional_sint32   =  5;
-    sint64 optional_sint64   =  6;
-   fixed32 optional_fixed32  =  7;
-   fixed64 optional_fixed64  =  8;
-  sfixed32 optional_sfixed32 =  9;
-  sfixed64 optional_sfixed64 = 10;
-     float optional_float    = 11;
-    double optional_double   = 12;
-      bool optional_bool     = 13;
-    string optional_string   = 14;
-     bytes optional_bytes    = 15;
+  int32 single_int32 = 1;
+  int64 single_int64 = 2;
+  uint32 single_uint32 = 3;
+  uint64 single_uint64 = 4;
+  sint32 single_sint32 = 5;
+  sint64 single_sint64 = 6;
+  fixed32 single_fixed32 = 7;
+  fixed64 single_fixed64 = 8;
+  sfixed32 single_sfixed32 = 9;
+  sfixed64 single_sfixed64 = 10;
+  float single_float = 11;
+  double single_double = 12;
+  bool single_bool = 13;
+  string single_string = 14;
+  bytes single_bytes = 15;
 
-  // Groups are not allowed in proto3.
-  // optional group OptionalGroup = 16 {
-  //   optional int32 a = 17;
-  // }
+  NestedMessage single_nested_message = 18;
+  ForeignMessage single_foreign_message = 19;
+  protobuf_unittest_import.ImportMessage single_import_message = 20;
 
-  NestedMessage                        optional_nested_message  = 18;
-  ForeignMessage                       optional_foreign_message = 19;
-  protobuf_unittest_import.ImportMessage optional_import_message  = 20;
-
-  NestedEnum                           optional_nested_enum     = 21;
-  ForeignEnum                          optional_foreign_enum    = 22;
-
-  // Omitted (compared to unittest.proto) because proto2 enums are not allowed
-  // inside proto2 messages.
-  //
-  // optional protobuf_unittest_import.ImportEnum    optional_import_enum  = 23;
-
-  string optional_string_piece = 24 [ctype=STRING_PIECE];
-  string optional_cord = 25 [ctype=CORD];
+  NestedEnum single_nested_enum = 21;
+  ForeignEnum single_foreign_enum = 22;
+  protobuf_unittest_import.ImportEnum single_import_enum = 23;
 
   // Defined in unittest_import_public.proto
   protobuf_unittest_import.PublicImportMessage
-      optional_public_import_message = 26;
-
-  NestedMessage optional_lazy_message = 27 [lazy=true];
-  protobuf_unittest_import.ImportMessage optional_lazy_import_message = 115
-      [lazy = true];
+      single_public_import_message = 26;
 
   // Repeated
   repeated    int32 repeated_int32    = 31;
@@ -116,28 +122,18 @@
   repeated   string repeated_string   = 44;
   repeated    bytes repeated_bytes    = 45;
 
-  // Groups are not allowed in proto3.
-  // repeated group RepeatedGroup = 46 {
-  //   optional int32 a = 47;
-  // }
-
   repeated NestedMessage                        repeated_nested_message  = 48;
   repeated ForeignMessage                       repeated_foreign_message = 49;
   repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
 
   repeated NestedEnum                           repeated_nested_enum     = 51;
   repeated ForeignEnum                          repeated_foreign_enum    = 52;
+  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
+  // Defined in unittest_import_public.proto
+  repeated protobuf_unittest_import.PublicImportMessage
+      repeated_public_import_message = 54;
 
-  // Omitted (compared to unittest.proto) because proto2 enums are not allowed
-  // inside proto2 messages.
-  //
-  // repeated protobuf_unittest_import.ImportEnum    repeated_import_enum  = 53;
-
-  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
-  repeated string repeated_cord = 55 [ctype=CORD];
-
-  repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
-
+  // For oneof test
   oneof oneof_field {
     uint32 oneof_uint32 = 111;
     NestedMessage oneof_nested_message = 112;
@@ -146,6 +142,173 @@
   }
 }
 
+// This proto includes a recusively nested message.
+message NestedTestAllTypes {
+  NestedTestAllTypes child = 1;
+  TestAllTypes payload = 2;
+  repeated NestedTestAllTypes repeated_child = 3;
+}
+
+message TestDeprecatedFields {
+  int32 deprecated_int32 = 1 [deprecated=true];
+}
+
+// Define these after TestAllTypes to make sure the compiler can handle
+// that.
+message ForeignMessage {
+  int32 c = 1;
+}
+
+enum ForeignEnum {
+  FOREIGN_UNSPECIFIED = 0;
+  FOREIGN_FOO = 4;
+  FOREIGN_BAR = 5;
+  FOREIGN_BAZ = 6;
+}
+
+message TestReservedFields {
+  reserved 2, 15, 9 to 11;
+  reserved "bar", "baz";
+}
+
+
+// Test that we can use NestedMessage from outside TestAllTypes.
+message TestForeignNested {
+  TestAllTypes.NestedMessage foreign_nested = 1;
+}
+
+// Test that really large tag numbers don't break anything.
+message TestReallyLargeTagNumber {
+  // The largest possible tag number is 2^28 - 1, since the wire format uses
+  // three bits to communicate wire type.
+  int32 a = 1;
+  int32 bb = 268435455;
+}
+
+message TestRecursiveMessage {
+  TestRecursiveMessage a = 1;
+  int32 i = 2;
+}
+
+// Test that mutual recursion works.
+message TestMutualRecursionA {
+  TestMutualRecursionB bb = 1;
+}
+
+message TestMutualRecursionB {
+  TestMutualRecursionA a = 1;
+  int32 optional_int32 = 2;
+}
+
+
+// Test an enum that has multiple values with the same number.
+enum TestEnumWithDupValue {
+  TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
+  option allow_alias = true;
+
+  FOO1 = 1;
+  BAR1 = 2;
+  BAZ = 3;
+  FOO2 = 1;
+  BAR2 = 2;
+}
+
+// Test an enum with large, unordered values.
+enum TestSparseEnum {
+  TEST_SPARSE_ENUM_UNSPECIFIED = 0;
+  SPARSE_A = 123;
+  SPARSE_B = 62374;
+  SPARSE_C = 12589234;
+  SPARSE_D = -15;
+  SPARSE_E = -53452;
+  // In proto3, value 0 must be the first one specified
+  // SPARSE_F = 0;
+  SPARSE_G = 2;
+}
+
+// Test message with CamelCase field names.  This violates Protocol Buffer
+// standard style.
+message TestCamelCaseFieldNames {
+  int32 PrimitiveField = 1;
+  string StringField = 2;
+  ForeignEnum EnumField = 3;
+  ForeignMessage MessageField = 4;
+
+  repeated int32 RepeatedPrimitiveField = 7;
+  repeated string RepeatedStringField = 8;
+  repeated ForeignEnum RepeatedEnumField = 9;
+  repeated ForeignMessage RepeatedMessageField = 10;
+}
+
+
+// We list fields out of order, to ensure that we're using field number and not
+// field index to determine serialization order.
+message TestFieldOrderings {
+  string my_string = 11;
+  int64 my_int = 1;
+  float my_float = 101;
+  message NestedMessage {
+    int64 oo = 2;
+    // The field name "b" fails to compile in proto1 because it conflicts with
+    // a local variable named "b" in one of the generated methods.  Doh.
+    // This file needs to compile in proto1 to test backwards-compatibility.
+    int32 bb = 1;
+  }
+
+  NestedMessage single_nested_message  = 200;
+}
+
+message SparseEnumMessage {
+  TestSparseEnum sparse_enum = 1;
+}
+
+// Test String and Bytes: string is for valid UTF-8 strings
+message OneString {
+  string data = 1;
+}
+
+message MoreString {
+  repeated string data = 1;
+}
+
+message OneBytes {
+  bytes data = 1;
+}
+
+message MoreBytes {
+  bytes data = 1;
+}
+
+// Test int32, uint32, int64, uint64, and bool are all compatible
+message Int32Message {
+  int32 data = 1;
+}
+
+message Uint32Message {
+  uint32 data = 1;
+}
+
+message Int64Message {
+  int64 data = 1;
+}
+
+message Uint64Message {
+  uint64 data = 1;
+}
+
+message BoolMessage {
+  bool data = 1;
+}
+
+// Test oneofs.
+message TestOneof {
+  oneof foo {
+    int32 foo_int = 1;
+    string foo_string = 2;
+    TestAllTypes foo_message = 3;
+  }
+}
+
 // Test messages for packed fields
 
 message TestPackedTypes {
@@ -165,44 +328,61 @@
   repeated ForeignEnum packed_enum  = 103 [packed = true];
 }
 
-// Explicitly set packed to false
+// A message with the same fields as TestPackedTypes, but without packing. Used
+// to test packed <-> unpacked wire compatibility.
 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];
+  repeated    int32 unpacked_int32    =  90 [packed = false];
+  repeated    int64 unpacked_int64    =  91 [packed = false];
+  repeated   uint32 unpacked_uint32   =  92 [packed = false];
+  repeated   uint64 unpacked_uint64   =  93 [packed = false];
+  repeated   sint32 unpacked_sint32   =  94 [packed = false];
+  repeated   sint64 unpacked_sint64   =  95 [packed = false];
+  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
+  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
+  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
+  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
+  repeated    float unpacked_float    = 100 [packed = false];
+  repeated   double unpacked_double   = 101 [packed = false];
+  repeated     bool unpacked_bool     = 102 [packed = false];
+  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
 }
 
-// This proto includes a recusively nested message.
-message NestedTestAllTypes {
-  NestedTestAllTypes child = 1;
-  TestAllTypes payload = 2;
+message TestRepeatedScalarDifferentTagSizes {
+  // Parsing repeated fixed size values used to fail. This message needs to be
+  // used in order to get a tag of the right size; all of the repeated fields
+  // in TestAllTypes didn't trigger the check.
+  repeated fixed32 repeated_fixed32 = 12;
+  // Check for a varint type, just for good measure.
+  repeated int32   repeated_int32   = 13;
+
+  // These have two-byte tags.
+  repeated fixed64 repeated_fixed64 = 2046;
+  repeated int64   repeated_int64   = 2047;
+
+  // Three byte tags.
+  repeated float   repeated_float   = 262142;
+  repeated uint64  repeated_uint64  = 262143;
 }
 
-// Define these after TestAllTypes to make sure the compiler can handle
-// that.
-message ForeignMessage {
-  int32 c = 1;
+message TestCommentInjectionMessage {
+  // */ <- This should not close the generated doc comment
+  string a = 1;
 }
 
-enum ForeignEnum {
-  FOREIGN_ZERO = 0;
-  FOREIGN_FOO = 4;
-  FOREIGN_BAR = 5;
-  FOREIGN_BAZ = 6;
+
+// Test that RPC services work.
+message FooRequest  {}
+message FooResponse {}
+
+message FooClientMessage {}
+message FooServerMessage{}
+
+service TestService {
+  rpc Foo(FooRequest) returns (FooResponse);
+  rpc Bar(BarRequest) returns (BarResponse);
 }
 
-// TestEmptyMessage is used to test behavior of unknown fields.
-message TestEmptyMessage {
-}
+
+message BarRequest  {}
+message BarResponse {}
 
diff --git a/src/google/protobuf/unittest_proto3_arena.proto b/src/google/protobuf/unittest_proto3_arena.proto
index ea88ec9..b835a6b 100644
--- a/src/google/protobuf/unittest_proto3_arena.proto
+++ b/src/google/protobuf/unittest_proto3_arena.proto
@@ -96,8 +96,6 @@
       optional_public_import_message = 26;
 
   NestedMessage optional_lazy_message = 27 [lazy=true];
-  protobuf_unittest_import.ImportMessage optional_lazy_import_message = 115
-      [lazy = true];
 
   // Repeated
   repeated    int32 repeated_int32    = 31;
@@ -187,7 +185,6 @@
 message NestedTestAllTypes {
   NestedTestAllTypes child = 1;
   TestAllTypes payload = 2;
-  repeated NestedTestAllTypes repeated_child = 3;
 }
 
 // Define these after TestAllTypes to make sure the compiler can handle
@@ -206,3 +203,4 @@
 // TestEmptyMessage is used to test behavior of unknown fields.
 message TestEmptyMessage {
 }
+
diff --git a/src/google/protobuf/unknown_field_set.cc b/src/google/protobuf/unknown_field_set.cc
index 0ada85e..d4e383d 100644
--- a/src/google/protobuf/unknown_field_set.cc
+++ b/src/google/protobuf/unknown_field_set.cc
@@ -39,7 +39,6 @@
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/metadata.h>
 #include <google/protobuf/wire_format.h>
 #include <google/protobuf/stubs/stl_util.h>
 
@@ -70,20 +69,34 @@
   return default_unknown_field_set_instance_;
 }
 
-void UnknownFieldSet::ClearFallback() {
-  GOOGLE_DCHECK(fields_ != NULL && fields_->size() > 0);
-  int n = fields_->size();
-  do {
-    (*fields_)[--n].Delete();
-  } while (n > 0);
+UnknownFieldSet::UnknownFieldSet()
+    : fields_(NULL) {}
+
+UnknownFieldSet::~UnknownFieldSet() {
+  Clear();
   delete fields_;
-  fields_ = NULL;
+}
+
+void UnknownFieldSet::ClearFallback() {
+  if (fields_ != NULL) {
+    for (int i = 0; i < fields_->size(); i++) {
+      (*fields_)[i].Delete();
+    }
+    delete fields_;
+    fields_ = NULL;
+  }
+}
+
+void UnknownFieldSet::ClearAndFreeMemory() {
+  if (fields_ != NULL) {
+    Clear();
+  }
 }
 
 void UnknownFieldSet::InternalMergeFrom(const UnknownFieldSet& other) {
   int other_field_count = other.field_count();
   if (other_field_count > 0) {
-    fields_ = new std::vector<UnknownField>();
+    fields_ = new vector<UnknownField>();
     for (int i = 0; i < other_field_count; i++) {
       fields_->push_back((*other.fields_)[i]);
       fields_->back().DeepCopy((*other.fields_)[i]);
@@ -94,7 +107,7 @@
 void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) {
   int other_field_count = other.field_count();
   if (other_field_count > 0) {
-    if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+    if (fields_ == NULL) fields_ = new vector<UnknownField>();
     for (int i = 0; i < other_field_count; i++) {
       fields_->push_back((*other.fields_)[i]);
       fields_->back().DeepCopy((*other.fields_)[i]);
@@ -107,7 +120,7 @@
 void UnknownFieldSet::MergeFromAndDestroy(UnknownFieldSet* other) {
   int other_field_count = other->field_count();
   if (other_field_count > 0) {
-    if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+    if (fields_ == NULL) fields_ = new vector<UnknownField>();
     for (int i = 0; i < other_field_count; i++) {
       fields_->push_back((*other->fields_)[i]);
       (*other->fields_)[i].Reset();
@@ -117,27 +130,21 @@
   other->fields_ = NULL;
 }
 
-void UnknownFieldSet::MergeToInternalMetdata(
-    const UnknownFieldSet& other,
-    internal::InternalMetadataWithArena* metadata) {
-  metadata->mutable_unknown_fields()->MergeFrom(other);
-}
-
-size_t UnknownFieldSet::SpaceUsedExcludingSelfLong() const {
+int UnknownFieldSet::SpaceUsedExcludingSelf() const {
   if (fields_ == NULL) return 0;
 
-  size_t total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size();
+  int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size();
 
   for (int i = 0; i < fields_->size(); i++) {
     const UnknownField& field = (*fields_)[i];
     switch (field.type()) {
       case UnknownField::TYPE_LENGTH_DELIMITED:
-        total_size += sizeof(*field.data_.length_delimited_.string_value_) +
-                      internal::StringSpaceUsedExcludingSelfLong(
-                          *field.data_.length_delimited_.string_value_);
+        total_size += sizeof(*field.length_delimited_.string_value_) +
+                      internal::StringSpaceUsedExcludingSelf(
+                          *field.length_delimited_.string_value_);
         break;
       case UnknownField::TYPE_GROUP:
-        total_size += field.data_.group_->SpaceUsedLong();
+        total_size += field.group_->SpaceUsed();
         break;
       default:
         break;
@@ -146,7 +153,7 @@
   return total_size;
 }
 
-size_t UnknownFieldSet::SpaceUsedLong() const {
+int UnknownFieldSet::SpaceUsed() const {
   return sizeof(*this) + SpaceUsedExcludingSelf();
 }
 
@@ -154,8 +161,8 @@
   UnknownField field;
   field.number_ = number;
   field.SetType(UnknownField::TYPE_VARINT);
-  field.data_.varint_ = value;
-  if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+  field.varint_ = value;
+  if (fields_ == NULL) fields_ = new vector<UnknownField>();
   fields_->push_back(field);
 }
 
@@ -163,8 +170,8 @@
   UnknownField field;
   field.number_ = number;
   field.SetType(UnknownField::TYPE_FIXED32);
-  field.data_.fixed32_ = value;
-  if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+  field.fixed32_ = value;
+  if (fields_ == NULL) fields_ = new vector<UnknownField>();
   fields_->push_back(field);
 }
 
@@ -172,8 +179,8 @@
   UnknownField field;
   field.number_ = number;
   field.SetType(UnknownField::TYPE_FIXED64);
-  field.data_.fixed64_ = value;
-  if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+  field.fixed64_ = value;
+  if (fields_ == NULL) fields_ = new vector<UnknownField>();
   fields_->push_back(field);
 }
 
@@ -181,10 +188,10 @@
   UnknownField field;
   field.number_ = number;
   field.SetType(UnknownField::TYPE_LENGTH_DELIMITED);
-  field.data_.length_delimited_.string_value_ = new string;
-  if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+  field.length_delimited_.string_value_ = new string;
+  if (fields_ == NULL) fields_ = new vector<UnknownField>();
   fields_->push_back(field);
-  return field.data_.length_delimited_.string_value_;
+  return field.length_delimited_.string_value_;
 }
 
 
@@ -192,14 +199,14 @@
   UnknownField field;
   field.number_ = number;
   field.SetType(UnknownField::TYPE_GROUP);
-  field.data_.group_ = new UnknownFieldSet;
-  if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+  field.group_ = new UnknownFieldSet;
+  if (fields_ == NULL) fields_ = new vector<UnknownField>();
   fields_->push_back(field);
-  return field.data_.group_;
+  return field.group_;
 }
 
 void UnknownFieldSet::AddField(const UnknownField& field) {
-  if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
+  if (fields_ == NULL) fields_ = new vector<UnknownField>();
   fields_->push_back(field);
   fields_->back().DeepCopy(field);
 }
@@ -276,10 +283,10 @@
 void UnknownField::Delete() {
   switch (type()) {
     case UnknownField::TYPE_LENGTH_DELIMITED:
-      delete data_.length_delimited_.string_value_;
+      delete length_delimited_.string_value_;
       break;
     case UnknownField::TYPE_GROUP:
-      delete data_.group_;
+      delete group_;
       break;
     default:
       break;
@@ -291,10 +298,10 @@
 void UnknownField::Reset() {
   switch (type()) {
     case UnknownField::TYPE_LENGTH_DELIMITED:
-      data_.length_delimited_.string_value_ = NULL;
+      length_delimited_.string_value_ = NULL;
       break;
     case UnknownField::TYPE_GROUP: {
-      data_.group_ = NULL;
+      group_ = NULL;
       break;
     }
     default:
@@ -305,13 +312,13 @@
 void UnknownField::DeepCopy(const UnknownField& other) {
   switch (type()) {
     case UnknownField::TYPE_LENGTH_DELIMITED:
-      data_.length_delimited_.string_value_ = new string(
-          *data_.length_delimited_.string_value_);
+      length_delimited_.string_value_ = new string(
+          *length_delimited_.string_value_);
       break;
     case UnknownField::TYPE_GROUP: {
       UnknownFieldSet* group = new UnknownFieldSet();
-      group->InternalMergeFrom(*data_.group_);
-      data_.group_ = group;
+      group->InternalMergeFrom(*group_);
+      group_ = group;
       break;
     }
     default:
@@ -323,14 +330,14 @@
 void UnknownField::SerializeLengthDelimitedNoTag(
     io::CodedOutputStream* output) const {
   GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type());
-  const string& data = *data_.length_delimited_.string_value_;
+  const string& data = *length_delimited_.string_value_;
   output->WriteVarint32(data.size());
   output->WriteRawMaybeAliased(data.data(), data.size());
 }
 
 uint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const {
   GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type());
-  const string& data = *data_.length_delimited_.string_value_;
+  const string& data = *length_delimited_.string_value_;
   target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);
   target = io::CodedOutputStream::WriteStringToArray(data, target);
   return target;
diff --git a/src/google/protobuf/unknown_field_set.h b/src/google/protobuf/unknown_field_set.h
index 619855e..612a942 100644
--- a/src/google/protobuf/unknown_field_set.h
+++ b/src/google/protobuf/unknown_field_set.h
@@ -43,7 +43,6 @@
 #include <vector>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/message_lite.h>
 
 namespace google {
 namespace protobuf {
@@ -53,7 +52,6 @@
     class ZeroCopyInputStream;      // zero_copy_stream.h
   }
   namespace internal {
-    class InternalMetadataWithArena;  // metadata.h
     class WireFormat;               // wire_format.h
     class MessageSetFieldSkipperUsingCord;
                                     // extension_set_heavy.cc
@@ -94,31 +92,16 @@
   // Similar to above, but this function will destroy the contents of other.
   void MergeFromAndDestroy(UnknownFieldSet* other);
 
-  // Merge the contents an UnknownFieldSet with the UnknownFieldSet in
-  // *metadata, if there is one.  If *metadata doesn't have an UnknownFieldSet
-  // then add one to it and make it be a copy of the first arg.
-  static void MergeToInternalMetdata(
-      const UnknownFieldSet& other,
-      internal::InternalMetadataWithArena* metadata);
-
   // Swaps the contents of some other UnknownFieldSet with this one.
   inline void Swap(UnknownFieldSet* x);
 
   // Computes (an estimate of) the total number of bytes currently used for
   // storing the unknown fields in memory. Does NOT include
   // sizeof(*this) in the calculation.
-  size_t SpaceUsedExcludingSelfLong() const;
-
-  int SpaceUsedExcludingSelf() const {
-    return internal::ToIntSize(SpaceUsedExcludingSelfLong());
-  }
+  int SpaceUsedExcludingSelf() const;
 
   // Version of SpaceUsed() including sizeof(*this).
-  size_t SpaceUsedLong() const;
-
-  int SpaceUsed() const {
-    return internal::ToIntSize(SpaceUsedLong());
-  }
+  int SpaceUsed() const;
 
   // Returns the number of fields present in the UnknownFieldSet.
   inline int field_count() const;
@@ -192,7 +175,7 @@
     TYPE_GROUP
   };
 
-  // The field's field number, as seen on the wire.
+  // The field's tag number, as seen on the wire.
   inline int number() const;
 
   // The field type.
@@ -221,8 +204,10 @@
   void SerializeLengthDelimitedNoTag(io::CodedOutputStream* output) const;
   uint8* SerializeLengthDelimitedNoTagToArray(uint8* target) const;
 
-  inline size_t GetLengthDelimitedSize() const;
+  inline int GetLengthDelimitedSize() const;
 
+ private:
+  friend class UnknownFieldSet;
 
   // If this UnknownField contains a pointer, delete it.
   void Delete();
@@ -250,20 +235,14 @@
     uint64 fixed64_;
     mutable union LengthDelimited length_delimited_;
     UnknownFieldSet* group_;
-  } data_;
+  };
 };
 
 // ===================================================================
 // inline implementations
 
-inline UnknownFieldSet::UnknownFieldSet() : fields_(NULL) {}
-
-inline UnknownFieldSet::~UnknownFieldSet() { Clear(); }
-
-inline void UnknownFieldSet::ClearAndFreeMemory() { Clear(); }
-
 inline void UnknownFieldSet::Clear() {
-  if (fields_ != NULL) {
+  if (fields_) {
     ClearFallback();
   }
 }
@@ -282,10 +261,10 @@
 }
 inline const UnknownField& UnknownFieldSet::field(int index) const {
   GOOGLE_DCHECK(fields_ != NULL);
-  return (*fields_)[static_cast<size_t>(index)];
+  return (*fields_)[index];
 }
 inline UnknownField* UnknownFieldSet::mutable_field(int index) {
-  return &(*fields_)[static_cast<size_t>(index)];
+  return &(*fields_)[index];
 }
 
 inline void UnknownFieldSet::AddLengthDelimited(
@@ -294,62 +273,60 @@
 }
 
 
-
-
-inline int UnknownField::number() const { return static_cast<int>(number_); }
+inline int UnknownField::number() const { return number_; }
 inline UnknownField::Type UnknownField::type() const {
   return static_cast<Type>(type_);
 }
 
 inline uint64 UnknownField::varint() const {
   assert(type() == TYPE_VARINT);
-  return data_.varint_;
+  return varint_;
 }
 inline uint32 UnknownField::fixed32() const {
   assert(type() == TYPE_FIXED32);
-  return data_.fixed32_;
+  return fixed32_;
 }
 inline uint64 UnknownField::fixed64() const {
   assert(type() == TYPE_FIXED64);
-  return data_.fixed64_;
+  return fixed64_;
 }
 inline const string& UnknownField::length_delimited() const {
   assert(type() == TYPE_LENGTH_DELIMITED);
-  return *data_.length_delimited_.string_value_;
+  return *length_delimited_.string_value_;
 }
 inline const UnknownFieldSet& UnknownField::group() const {
   assert(type() == TYPE_GROUP);
-  return *data_.group_;
+  return *group_;
 }
 
 inline void UnknownField::set_varint(uint64 value) {
   assert(type() == TYPE_VARINT);
-  data_.varint_ = value;
+  varint_ = value;
 }
 inline void UnknownField::set_fixed32(uint32 value) {
   assert(type() == TYPE_FIXED32);
-  data_.fixed32_ = value;
+  fixed32_ = value;
 }
 inline void UnknownField::set_fixed64(uint64 value) {
   assert(type() == TYPE_FIXED64);
-  data_.fixed64_ = value;
+  fixed64_ = value;
 }
 inline void UnknownField::set_length_delimited(const string& value) {
   assert(type() == TYPE_LENGTH_DELIMITED);
-  data_.length_delimited_.string_value_->assign(value);
+  length_delimited_.string_value_->assign(value);
 }
 inline string* UnknownField::mutable_length_delimited() {
   assert(type() == TYPE_LENGTH_DELIMITED);
-  return data_.length_delimited_.string_value_;
+  return length_delimited_.string_value_;
 }
 inline UnknownFieldSet* UnknownField::mutable_group() {
   assert(type() == TYPE_GROUP);
-  return data_.group_;
+  return group_;
 }
 
-inline size_t UnknownField::GetLengthDelimitedSize() const {
+inline int UnknownField::GetLengthDelimitedSize() const {
   GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type());
-  return data_.length_delimited_.string_value_->size();
+  return static_cast<int>(length_delimited_.string_value_->size());
 }
 
 inline void UnknownField::SetType(Type type) {
diff --git a/src/google/protobuf/unknown_field_set_unittest.cc b/src/google/protobuf/unknown_field_set_unittest.cc
index e55bb01..5de7263 100644
--- a/src/google/protobuf/unknown_field_set_unittest.cc
+++ b/src/google/protobuf/unknown_field_set_unittest.cc
@@ -488,7 +488,7 @@
 TEST_F(UnknownFieldSetTest, SpaceUsedExcludingSelf) {
   UnknownFieldSet empty;
   empty.AddVarint(1, 0);
-  EXPECT_EQ(sizeof(std::vector<UnknownField>) + sizeof(UnknownField),
+  EXPECT_EQ(sizeof(vector<UnknownField>) + sizeof(UnknownField),
             empty.SpaceUsedExcludingSelf());
 }
 
@@ -559,9 +559,8 @@
   }
 }
 
-void CheckDeleteByNumber(const std::vector<int>& field_numbers,
-                         int deleted_number,
-                         const std::vector<int>& expected_field_nubmers) {
+void CheckDeleteByNumber(const vector<int>& field_numbers, int deleted_number,
+                        const vector<int>& expected_field_nubmers) {
   UnknownFieldSet unknown_fields;
   for (int i = 0; i < field_numbers.size(); ++i) {
     unknown_fields.AddFixed32(field_numbers[i], i);
@@ -574,9 +573,9 @@
   }
 }
 
-#define MAKE_VECTOR(x) std::vector<int>(x, x + GOOGLE_ARRAYSIZE(x))
+#define MAKE_VECTOR(x) vector<int>(x, x + GOOGLE_ARRAYSIZE(x))
 TEST_F(UnknownFieldSetTest, DeleteByNumber) {
-  CheckDeleteByNumber(std::vector<int>(), 1, std::vector<int>());
+  CheckDeleteByNumber(vector<int>(), 1, vector<int>());
   static const int kTestFieldNumbers1[] = {1, 2, 3};
   static const int kFieldNumberToDelete1 = 1;
   static const int kExpectedFieldNumbers1[] = {2, 3};
diff --git a/src/google/protobuf/util/delimited_message_util.cc b/src/google/protobuf/util/delimited_message_util.cc
deleted file mode 100644
index 1637878..0000000
--- a/src/google/protobuf/util/delimited_message_util.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Adapted from the patch of kenton@google.com (Kenton Varda)
-// See https://github.com/google/protobuf/pull/710 for details.
-
-#include <google/protobuf/util/delimited_message_util.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-
-bool SerializeDelimitedToFileDescriptor(const MessageLite& message, int file_descriptor) {
-  io::FileOutputStream output(file_descriptor);
-  return SerializeDelimitedToZeroCopyStream(message, &output);
-}
-
-bool SerializeDelimitedToOstream(const MessageLite& message, ostream* output) {
-  {
-    io::OstreamOutputStream zero_copy_output(output);
-    if (!SerializeDelimitedToZeroCopyStream(message, &zero_copy_output)) return false;
-  }
-  return output->good();
-}
-
-bool ParseDelimitedFromZeroCopyStream(MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof) {
-  google::protobuf::io::CodedInputStream coded_input(input);
-  return ParseDelimitedFromCodedStream(message, &coded_input, clean_eof);
-}
-
-bool ParseDelimitedFromCodedStream(MessageLite* message, io::CodedInputStream* input, bool* clean_eof) {
-  if (clean_eof != NULL) *clean_eof = false;
-  int start = input->CurrentPosition();
-
-  // Read the size.
-  uint32 size;
-  if (!input->ReadVarint32(&size)) {
-    if (clean_eof != NULL) *clean_eof = input->CurrentPosition() == start;
-    return false;
-  }
-
-  // Tell the stream not to read beyond that size.
-  google::protobuf::io::CodedInputStream::Limit limit = input->PushLimit(size);
-
-  // Parse the message.
-  if (!message->MergeFromCodedStream(input)) return false;
-  if (!input->ConsumedEntireMessage()) return false;
-
-  // Release the limit.
-  input->PopLimit(limit);
-
-  return true;
-}
-
-bool SerializeDelimitedToZeroCopyStream(const MessageLite& message, io::ZeroCopyOutputStream* output) {
-  google::protobuf::io::CodedOutputStream coded_output(output);
-  return SerializeDelimitedToCodedStream(message, &coded_output);
-}
-
-bool SerializeDelimitedToCodedStream(const MessageLite& message, io::CodedOutputStream* output) {
-  // Write the size.
-  int size = message.ByteSize();
-  output->WriteVarint32(size);
-
-  // Write the content.
-  uint8* buffer = output->GetDirectBufferForNBytesAndAdvance(size);
-  if (buffer != NULL) {
-    // Optimization: The message fits in one buffer, so use the faster
-    // direct-to-array serialization path.
-    message.SerializeWithCachedSizesToArray(buffer);
-  } else {
-    // Slightly-slower path when the message is multiple buffers.
-    message.SerializeWithCachedSizes(output);
-    if (output->HadError()) return false;
-  }
-
-  return true;
-}
-
-}  // namespace util
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/util/delimited_message_util.h b/src/google/protobuf/util/delimited_message_util.h
deleted file mode 100644
index 302d478..0000000
--- a/src/google/protobuf/util/delimited_message_util.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Adapted from the patch of kenton@google.com (Kenton Varda)
-// See https://github.com/google/protobuf/pull/710 for details.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_DELIMITED_MESSAGE_UTIL_H__
-#define GOOGLE_PROTOBUF_UTIL_DELIMITED_MESSAGE_UTIL_H__
-
-#include <ostream>
-
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-
-// Write a single size-delimited message from the given stream. Delimited
-// format allows a single file or stream to contain multiple messages,
-// whereas normally writing multiple non-delimited messages to the same
-// stream would cause them to be merged. A delimited message is a varint
-// encoding the message size followed by a message of exactly that size.
-//
-// Note that if you want to *read* a delimited message from a file descriptor
-// or istream, you will need to construct an io::FileInputStream or
-// io::OstreamInputStream (implementations of io::ZeroCopyStream) and use the
-// utility function ParseDelimitedFromZeroCopyStream(). You must then
-// continue to use the same ZeroCopyInputStream to read all further data from
-// the stream until EOF. This is because these ZeroCopyInputStream
-// implementations are buffered: they read a big chunk of data at a time,
-// then parse it. As a result, they may read past the end of the delimited
-// message. There is no way for them to push the extra data back into the
-// underlying source, so instead you must keep using the same stream object.
-bool LIBPROTOBUF_EXPORT SerializeDelimitedToFileDescriptor(const MessageLite& message, int file_descriptor);
-
-bool LIBPROTOBUF_EXPORT SerializeDelimitedToOstream(const MessageLite& message, ostream* output);
-
-// Read a single size-delimited message from the given stream. Delimited
-// format allows a single file or stream to contain multiple messages,
-// whereas normally parsing consumes the entire input. A delimited message
-// is a varint encoding the message size followed by a message of exactly
-// that size.
-//
-// If |clean_eof| is not NULL, then it will be set to indicate whether the
-// stream ended cleanly. That is, if the stream ends without this method
-// having read any data at all from it, then *clean_eof will be set true,
-// otherwise it will be set false. Note that these methods return false
-// on EOF, but they also return false on other errors, so |clean_eof| is
-// needed to distinguish a clean end from errors.
-bool LIBPROTOBUF_EXPORT ParseDelimitedFromZeroCopyStream(MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof);
-
-bool LIBPROTOBUF_EXPORT ParseDelimitedFromCodedStream(MessageLite* message, io::CodedInputStream* input, bool* clean_eof);
-
-// Write a single size-delimited message from the given stream. Delimited
-// format allows a single file or stream to contain multiple messages,
-// whereas normally writing multiple non-delimited messages to the same
-// stream would cause them to be merged. A delimited message is a varint
-// encoding the message size followed by a message of exactly that size.
-bool LIBPROTOBUF_EXPORT SerializeDelimitedToZeroCopyStream(const MessageLite& message, io::ZeroCopyOutputStream* output);
-
-bool LIBPROTOBUF_EXPORT SerializeDelimitedToCodedStream(const MessageLite& message, io::CodedOutputStream* output);
-
-}  // namespace util
-}  // namespace protobuf
-}  // namespace google
-
-#endif  // GOOGLE_PROTOBUF_UTIL_DELIMITED_MESSAGE_UTIL_H__
diff --git a/src/google/protobuf/util/delimited_message_util_test.cc b/src/google/protobuf/util/delimited_message_util_test.cc
deleted file mode 100644
index 157a841..0000000
--- a/src/google/protobuf/util/delimited_message_util_test.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Adapted from the patch of kenton@google.com (Kenton Varda)
-// See https://github.com/google/protobuf/pull/710 for details.
-
-#include <google/protobuf/util/delimited_message_util.h>
-
-#include <sstream>
-
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-
-TEST(DelimitedMessageUtilTest, DelimitedMessages) {
-  std::stringstream stream;
-
-  {
-    protobuf_unittest::TestAllTypes message1;
-    TestUtil::SetAllFields(&message1);
-    EXPECT_TRUE(SerializeDelimitedToOstream(message1, &stream));
-
-    protobuf_unittest::TestPackedTypes message2;
-    TestUtil::SetPackedFields(&message2);
-    EXPECT_TRUE(SerializeDelimitedToOstream(message2, &stream));
-  }
-
-  {
-    bool clean_eof;
-    io::IstreamInputStream zstream(&stream);
-
-    protobuf_unittest::TestAllTypes message1;
-    clean_eof = true;
-    EXPECT_TRUE(ParseDelimitedFromZeroCopyStream(&message1,
-        &zstream, &clean_eof));
-    EXPECT_FALSE(clean_eof);
-    TestUtil::ExpectAllFieldsSet(message1);
-
-    protobuf_unittest::TestPackedTypes message2;
-    clean_eof = true;
-    EXPECT_TRUE(ParseDelimitedFromZeroCopyStream(&message2,
-        &zstream, &clean_eof));
-    EXPECT_FALSE(clean_eof);
-    TestUtil::ExpectPackedFieldsSet(message2);
-
-    clean_eof = false;
-    EXPECT_FALSE(ParseDelimitedFromZeroCopyStream(&message2,
-        &zstream, &clean_eof));
-    EXPECT_TRUE(clean_eof);
-  }
-}
-
-}  // namespace util
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/util/field_comparator.cc b/src/google/protobuf/util/field_comparator.cc
index a1a56ee..60b8b8a 100644
--- a/src/google/protobuf/util/field_comparator.cc
+++ b/src/google/protobuf/util/field_comparator.cc
@@ -189,7 +189,7 @@
       return MathUtil::AlmostEquals(value_1, value_2);
     } else {
       // Use user-provided fraction and margin. Since they are stored as
-      // doubles, we explicitly cast them to types of values provided. This
+      // doubles, we explicitely cast them to types of values provided. This
       // is very likely to fail if provided values are not numeric.
       return MathUtil::WithinFractionOrMargin(
           value_1, value_2, static_cast<T>(tolerance->fraction),
diff --git a/src/google/protobuf/util/field_comparator.h b/src/google/protobuf/util/field_comparator.h
index 26a7ba4..1b4d65b 100644
--- a/src/google/protobuf/util/field_comparator.h
+++ b/src/google/protobuf/util/field_comparator.h
@@ -28,7 +28,7 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Defines classes for field comparison.
+// Author: ksroka@google.com (Krzysztof Sroka)
 
 #ifndef GOOGLE_PROTOBUF_UTIL_FIELD_COMPARATOR_H__
 #define GOOGLE_PROTOBUF_UTIL_FIELD_COMPARATOR_H__
@@ -167,7 +167,7 @@
   };
 
   // Defines the map to store the tolerances for floating point comparison.
-  typedef std::map<const FieldDescriptor*, Tolerance> ToleranceMap;
+  typedef map<const FieldDescriptor*, Tolerance> ToleranceMap;
 
   // The following methods get executed when CompareFields is called for the
   // basic types (instead of submessages). They return true on success. One
@@ -237,7 +237,7 @@
 
   // True iff default_tolerance_ has been explicitly set.
   //
-  // If false, then the default tolerance for floats and doubles is that which
+  // If false, then the default tolerance for flaots and doubles is that which
   // is used by MathUtil::AlmostEquals().
   bool has_default_tolerance_;
 
diff --git a/src/google/protobuf/util/field_comparator_test.cc b/src/google/protobuf/util/field_comparator_test.cc
index 249b8d5..6fd631d 100644
--- a/src/google/protobuf/util/field_comparator_test.cc
+++ b/src/google/protobuf/util/field_comparator_test.cc
@@ -365,10 +365,10 @@
 
   // +inf should be equal even though they are not technically within margin or
   // fraction.
-  message_1_.set_optional_float(std::numeric_limits<float>::infinity());
-  message_2_.set_optional_float(std::numeric_limits<float>::infinity());
-  message_1_.set_optional_double(std::numeric_limits<double>::infinity());
-  message_2_.set_optional_double(std::numeric_limits<double>::infinity());
+  message_1_.set_optional_float(numeric_limits<float>::infinity());
+  message_2_.set_optional_float(numeric_limits<float>::infinity());
+  message_1_.set_optional_double(numeric_limits<double>::infinity());
+  message_2_.set_optional_double(numeric_limits<double>::infinity());
   comparator_.SetFractionAndMargin(field_float, 0.0, 0.0);
   comparator_.SetFractionAndMargin(field_double, 0.0, 0.0);
   EXPECT_EQ(FieldComparator::SAME,
@@ -380,10 +380,10 @@
 
   // -inf should be equal even though they are not technically within margin or
   // fraction.
-  message_1_.set_optional_float(-std::numeric_limits<float>::infinity());
-  message_2_.set_optional_float(-std::numeric_limits<float>::infinity());
-  message_1_.set_optional_double(-std::numeric_limits<double>::infinity());
-  message_2_.set_optional_double(-std::numeric_limits<double>::infinity());
+  message_1_.set_optional_float(-numeric_limits<float>::infinity());
+  message_2_.set_optional_float(-numeric_limits<float>::infinity());
+  message_1_.set_optional_double(-numeric_limits<double>::infinity());
+  message_2_.set_optional_double(-numeric_limits<double>::infinity());
   comparator_.SetFractionAndMargin(field_float, 0.0, 0.0);
   comparator_.SetFractionAndMargin(field_double, 0.0, 0.0);
   EXPECT_EQ(FieldComparator::SAME,
diff --git a/src/google/protobuf/util/field_mask_util.cc b/src/google/protobuf/util/field_mask_util.cc
index 8a41349..547c9fb 100644
--- a/src/google/protobuf/util/field_mask_util.cc
+++ b/src/google/protobuf/util/field_mask_util.cc
@@ -45,7 +45,7 @@
 
 void FieldMaskUtil::FromString(StringPiece str, FieldMask* out) {
   out->Clear();
-  std::vector<string> paths = Split(str, ",");
+  vector<string> paths = Split(str, ",");
   for (int i = 0; i < paths.size(); ++i) {
     if (paths[i].empty()) continue;
     out->add_paths(paths[i]);
@@ -116,7 +116,7 @@
 
 bool FieldMaskUtil::FromJsonString(StringPiece str, FieldMask* out) {
   out->Clear();
-  std::vector<string> paths = Split(str, ",");
+  vector<string> paths = Split(str, ",");
   for (int i = 0; i < paths.size(); ++i) {
     if (paths[i].empty()) continue;
     string snakecase_path;
@@ -128,13 +128,9 @@
   return true;
 }
 
-bool FieldMaskUtil::GetFieldDescriptors(
-    const Descriptor* descriptor, StringPiece path,
-    std::vector<const FieldDescriptor*>* field_descriptors) {
-  if (field_descriptors != NULL) {
-    field_descriptors->clear();
-  }
-  std::vector<string> parts = Split(path, ".");
+bool FieldMaskUtil::InternalIsValidPath(const Descriptor* descriptor,
+                                        StringPiece path) {
+  vector<string> parts = Split(path, ".");
   for (int i = 0; i < parts.size(); ++i) {
     const string& field_name = parts[i];
     if (descriptor == NULL) {
@@ -144,9 +140,6 @@
     if (field == NULL) {
       return false;
     }
-    if (field_descriptors != NULL) {
-      field_descriptors->push_back(field);
-    }
     if (!field->is_repeated() &&
         field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       descriptor = field->message_type();
@@ -192,13 +185,6 @@
   // children removed because the path matches all the node's children.
   void AddPath(const string& path);
 
-  // Remove a path from the tree.
-  // If the path is a sub-path of an existing field path in the tree, it means
-  // we need remove the existing fied path and add all sub-paths except
-  // specified path. If the path matches an existing node in the tree, this node
-  // will be moved.
-  void RemovePath(const string& path, const Descriptor* descriptor);
-
   // Calculate the intersection part of a field path with this tree and add
   // the intersection field path into out.
   void IntersectPath(const string& path, FieldMaskTree* out);
@@ -214,27 +200,6 @@
     MergeMessage(&root_, source, options, destination);
   }
 
-  // Add required field path of the message to this tree based on current tree
-  // structure. If a message is present in the tree, add the path of its
-  // required field to the tree. This is to make sure that after trimming a
-  // message with required fields are set, check IsInitialized() will not fail.
-  void AddRequiredFieldPath(const Descriptor* descriptor) {
-    // Do nothing if the tree is empty.
-    if (root_.children.empty()) {
-      return;
-    }
-    AddRequiredFieldPath(&root_, descriptor);
-  }
-
-  // Trims all fields not specified by this tree from the given message.
-  void TrimMessage(Message* message) {
-    // Do nothing if the tree is empty.
-    if (root_.children.empty()) {
-      return;
-    }
-    TrimMessage(&root_, message);
-  }
-
  private:
   struct Node {
     Node() {}
@@ -242,14 +207,14 @@
     ~Node() { ClearChildren(); }
 
     void ClearChildren() {
-      for (std::map<string, Node*>::iterator it = children.begin();
+      for (map<string, Node*>::iterator it = children.begin();
            it != children.end(); ++it) {
         delete it->second;
       }
       children.clear();
     }
 
-    std::map<string, Node*> children;
+    map<string, Node*> children;
 
    private:
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Node);
@@ -268,15 +233,6 @@
                     const FieldMaskUtil::MergeOptions& options,
                     Message* destination);
 
-  // Add required field path of the message to this tree based on current tree
-  // structure. If a message is present in the tree, add the path of its
-  // required field to the tree. This is to make sure that after trimming a
-  // message with required fields are set, check IsInitialized() will not fail.
-  void AddRequiredFieldPath(Node* node, const Descriptor* descriptor);
-
-  // Trims all fields not specified by this sub-tree from the given message.
-  void TrimMessage(const Node* node, Message* message);
-
   Node root_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldMaskTree);
@@ -306,7 +262,7 @@
     out->add_paths(prefix);
     return;
   }
-  for (std::map<string, Node*>::const_iterator it = node->children.begin();
+  for (map<string, Node*>::const_iterator it = node->children.begin();
        it != node->children.end(); ++it) {
     string current_path = prefix.empty() ? it->first : prefix + "." + it->first;
     MergeToFieldMask(current_path, it->second, out);
@@ -314,7 +270,7 @@
 }
 
 void FieldMaskTree::AddPath(const string& path) {
-  std::vector<string> parts = Split(path, ".");
+  vector<string> parts = Split(path, ".");
   if (parts.empty()) {
     return;
   }
@@ -340,61 +296,8 @@
   }
 }
 
-void FieldMaskTree::RemovePath(const string& path,
-                               const Descriptor* descriptor) {
-  std::vector<string> parts = Split(path, ".");
-  if (parts.empty()) {
-    return;
-  }
-  std::vector<Node*> nodes(parts.size());
-  Node* node = &root_;
-  const Descriptor* current_descriptor = descriptor;
-  Node* new_branch_node = NULL;
-  for (int i = 0; i < parts.size(); ++i) {
-    nodes[i] = node;
-    const FieldDescriptor* field_descriptor =
-        current_descriptor->FindFieldByName(parts[i]);
-    if (field_descriptor == NULL ||
-        (field_descriptor->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE &&
-         i != parts.size() - 1)) {
-      // Invalid path.
-      if (new_branch_node != NULL) {
-        // If add any new nodes, cleanup.
-        new_branch_node->ClearChildren();
-      }
-      return;
-    }
-
-    if (node->children.empty()) {
-      if (new_branch_node == NULL) {
-        new_branch_node = node;
-      }
-      for (int i = 0; i < current_descriptor->field_count(); ++i) {
-        node->children[current_descriptor->field(i)->name()] = new Node();
-      }
-    }
-    if (ContainsKey(node->children, parts[i])) {
-      node = node->children[parts[i]];
-      if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-        current_descriptor = field_descriptor->message_type();
-      }
-    } else {
-      // Path does not exist.
-      return;
-    }
-  }
-  // Remove path.
-  for (int i = parts.size() - 1; i >= 0; i--) {
-    delete nodes[i]->children[parts[i]];
-    nodes[i]->children.erase(parts[i]);
-    if (!nodes[i]->children.empty()) {
-      break;
-    }
-  }
-}
-
 void FieldMaskTree::IntersectPath(const string& path, FieldMaskTree* out) {
-  std::vector<string> parts = Split(path, ".");
+  vector<string> parts = Split(path, ".");
   if (parts.empty()) {
     return;
   }
@@ -424,7 +327,7 @@
   if (node->children.empty()) {
     out->AddPath(prefix);
   }
-  for (std::map<string, Node*>::const_iterator it = node->children.begin();
+  for (map<string, Node*>::const_iterator it = node->children.begin();
        it != node->children.end(); ++it) {
     string current_path = prefix.empty() ? it->first : prefix + "." + it->first;
     MergeLeafNodesToTree(current_path, it->second, out);
@@ -438,7 +341,7 @@
   const Reflection* source_reflection = source.GetReflection();
   const Reflection* destination_reflection = destination->GetReflection();
   const Descriptor* descriptor = source.GetDescriptor();
-  for (std::map<string, Node*>::const_iterator it = node->children.begin();
+  for (map<string, Node*>::const_iterator it = node->children.begin();
        it != node->children.end(); ++it) {
     const string& field_name = it->first;
     const Node* child = it->second;
@@ -464,15 +367,11 @@
     }
     if (!field->is_repeated()) {
       switch (field->cpp_type()) {
-#define COPY_VALUE(TYPE, Name)                                              \
-  case FieldDescriptor::CPPTYPE_##TYPE: {                                   \
-    if (source_reflection->HasField(source, field)) {                       \
-      destination_reflection->Set##Name(                                    \
-          destination, field, source_reflection->Get##Name(source, field)); \
-    } else {                                                                \
-      destination_reflection->ClearField(destination, field);               \
-    }                                                                       \
-    break;                                                                  \
+#define COPY_VALUE(TYPE, Name)                                            \
+  case FieldDescriptor::CPPTYPE_##TYPE: {                                 \
+    destination_reflection->Set##Name(                                    \
+        destination, field, source_reflection->Get##Name(source, field)); \
+    break;                                                                \
   }
         COPY_VALUE(BOOL, Bool)
         COPY_VALUE(INT32, Int32)
@@ -534,63 +433,6 @@
   }
 }
 
-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);
-    if (field->is_required()) {
-      const string& node_name = field->name();
-      Node*& child = node->children[node_name];
-      if (child == NULL) {
-        // Add required field path to the tree
-        child = new Node();
-      } else if (child->children.empty()){
-        // If the required field is in the tree and does not have any children,
-        // do nothing.
-        continue;
-      }
-      // Add required field in the children to the tree if the field is message.
-      if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-        AddRequiredFieldPath(child, field->message_type());
-      }
-    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      std::map<string, Node*>::const_iterator it =
-          node->children.find(field->name());
-      if (it != node->children.end()) {
-        // Add required fields in the children to the
-        // tree if the field is a message and present in the tree.
-        Node* child = it->second;
-        if (!child->children.empty()) {
-          AddRequiredFieldPath(child, field->message_type());
-        }
-      }
-    }
-  }
-}
-
-void FieldMaskTree::TrimMessage(const Node* node, Message* message) {
-  GOOGLE_DCHECK(!node->children.empty());
-  const Reflection* reflection = message->GetReflection();
-  const Descriptor* descriptor = message->GetDescriptor();
-  const int32 field_count = descriptor->field_count();
-  for (int index = 0; index < field_count; ++index) {
-    const FieldDescriptor* field = descriptor->field(index);
-    std::map<string, Node*>::const_iterator it =
-        node->children.find(field->name());
-    if (it == node->children.end()) {
-      reflection->ClearField(message, field);
-    } else {
-      if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-        Node* child = it->second;
-        if (!child->children.empty() && reflection->HasField(*message, field)) {
-          TrimMessage(child, reflection->MutableMessage(message, field));
-        }
-      }
-    }
-  }
-}
-
 }  // namespace
 
 void FieldMaskUtil::ToCanonicalForm(const FieldMask& mask, FieldMask* out) {
@@ -620,22 +462,6 @@
   intersection.MergeToFieldMask(out);
 }
 
-void FieldMaskUtil::InternalSubtract(const Descriptor* descriptor,
-                                     const FieldMask& mask1,
-                                     const FieldMask& mask2, FieldMask* out) {
-  if (mask1.paths().empty()) {
-    out->Clear();
-    return;
-  }
-  FieldMaskTree tree;
-  tree.MergeFromFieldMask(mask1);
-  for (int i = 0; i < mask2.paths_size(); ++i) {
-    tree.RemovePath(mask2.paths(i), descriptor);
-  }
-  out->Clear();
-  tree.MergeToFieldMask(out);
-}
-
 bool FieldMaskUtil::IsPathInFieldMask(StringPiece path, const FieldMask& mask) {
   for (int i = 0; i < mask.paths_size(); ++i) {
     const string& mask_path = mask.paths(i);
@@ -663,28 +489,6 @@
   tree.MergeMessage(source, options, destination);
 }
 
-void FieldMaskUtil::TrimMessage(const FieldMask& mask, Message* destination) {
-  // Build a FieldMaskTree and walk through the tree to merge all specified
-  // fields.
-  FieldMaskTree tree;
-  tree.MergeFromFieldMask(mask);
-  tree.TrimMessage(GOOGLE_CHECK_NOTNULL(destination));
-}
-
-void FieldMaskUtil::TrimMessage(const FieldMask& mask, Message* destination,
-                                const TrimOptions& options) {
-  // Build a FieldMaskTree and walk through the tree to merge all specified
-  // fields.
-  FieldMaskTree tree;
-  tree.MergeFromFieldMask(mask);
-  // If keep_required_fields is true, implicitely add required fields of
-  // a message present in the tree to prevent from trimming.
-  if (options.keep_required_fields()) {
-    tree.AddRequiredFieldPath(GOOGLE_CHECK_NOTNULL(destination->GetDescriptor()));
-  }
-  tree.TrimMessage(GOOGLE_CHECK_NOTNULL(destination));
-}
-
 }  // namespace util
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/util/field_mask_util.h b/src/google/protobuf/util/field_mask_util.h
index 01642c6..644161b 100644
--- a/src/google/protobuf/util/field_mask_util.h
+++ b/src/google/protobuf/util/field_mask_util.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Defines utilities for the FieldMask well known type.
-
 #ifndef GOOGLE_PROTOBUF_UTIL_FIELD_MASK_UTIL_H__
 #define GOOGLE_PROTOBUF_UTIL_FIELD_MASK_UTIL_H__
 
@@ -59,26 +57,17 @@
   static bool ToJsonString(const FieldMask& mask, string* out);
   static bool FromJsonString(StringPiece str, FieldMask* out);
 
-  // Get the descriptors of the fields which the given path from the message
-  // descriptor traverses, if field_descriptors is not null.
-  // Return false if the path is not valid, and the content of field_descriptors
-  // is unspecified.
-  static bool GetFieldDescriptors(
-      const Descriptor* descriptor, StringPiece path,
-      std::vector<const FieldDescriptor*>* field_descriptors);
-
   // Checks whether the given path is valid for type T.
   template <typename T>
   static bool IsValidPath(StringPiece path) {
-    return GetFieldDescriptors(T::descriptor(), path, NULL);
+    return InternalIsValidPath(T::descriptor(), path);
   }
 
   // Checks whether the given FieldMask is valid for type T.
   template <typename T>
   static bool IsValidFieldMask(const FieldMask& mask) {
     for (int i = 0; i < mask.paths_size(); ++i) {
-      if (!GetFieldDescriptors(T::descriptor(), mask.paths(i), NULL))
-        return false;
+      if (!InternalIsValidPath(T::descriptor(), mask.paths(i))) return false;
     }
     return true;
   }
@@ -113,35 +102,15 @@
   static void Intersect(const FieldMask& mask1, const FieldMask& mask2,
                         FieldMask* out);
 
-  // Subtracts mask2 from mask1 base of type T.
-  template <typename T>
-  static void Subtract(const FieldMask& mask1, const FieldMask& mask2,
-                       FieldMask* out) {
-    InternalSubtract(T::descriptor(), mask1, mask2, 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.
   static bool IsPathInFieldMask(StringPiece path, const FieldMask& mask);
 
   class MergeOptions;
-  // Merges fields specified in a FieldMask into another message. See the
-  // comments in MergeOptions regarding compatibility with
-  // google/protobuf/field_mask.proto
+  // Merges fields specified in a FieldMask into another message.
   static void MergeMessageTo(const Message& source, const FieldMask& mask,
                              const MergeOptions& options, Message* destination);
 
-  class TrimOptions;
-  // Removes from 'message' any field that is not represented in the given
-  // FieldMask. If the FieldMask is empty, does nothing.
-  static void TrimMessage(const FieldMask& mask, Message* message);
-
-  // Removes from 'message' any field that is not represented in the given
-  // FieldMask with customized TrimOptions.
-  // If the FieldMask is empty, does nothing.
-  static void TrimMessage(const FieldMask& mask, Message* message,
-                          const TrimOptions& options);
-
  private:
   friend class SnakeCaseCamelCaseTest;
   // Converts a field name from snake_case to camelCase:
@@ -172,18 +141,13 @@
   // successfully.
   static bool CamelCaseToSnakeCase(StringPiece input, string* output);
 
+  static bool InternalIsValidPath(const Descriptor* descriptor,
+                                  StringPiece path);
+
   static void InternalGetFieldMaskForAllFields(const Descriptor* descriptor,
                                                FieldMask* out);
-
-  static void InternalSubtract(const Descriptor* descriptor,
-                               const FieldMask& mask1, const FieldMask& mask2,
-                               FieldMask* out);
 };
 
-// Note that for compatibility with the defined behaviour for FieldMask in
-// google/protobuf/field_mask.proto, set replace_message_fields and
-// replace_repeated_fields to 'true'. The default options are not compatible
-// with google/protobuf/field_mask.proto.
 class LIBPROTOBUF_EXPORT FieldMaskUtil::MergeOptions {
  public:
   MergeOptions()
@@ -212,23 +176,6 @@
   bool replace_repeated_fields_;
 };
 
-class LIBPROTOBUF_EXPORT FieldMaskUtil::TrimOptions {
- public:
-  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;
-  }
-  bool keep_required_fields() const { return keep_required_fields_; }
-
- private:
-  bool keep_required_fields_;
-};
-
 }  // namespace util
 }  // namespace protobuf
 
diff --git a/src/google/protobuf/util/field_mask_util_test.cc b/src/google/protobuf/util/field_mask_util_test.cc
index 7939f73..9b7fb62 100644
--- a/src/google/protobuf/util/field_mask_util_test.cc
+++ b/src/google/protobuf/util/field_mask_util_test.cc
@@ -114,8 +114,6 @@
 }
 
 using protobuf_unittest::TestAllTypes;
-using protobuf_unittest::TestRequired;
-using protobuf_unittest::TestRequiredMessage;
 using protobuf_unittest::NestedTestAllTypes;
 using google::protobuf::FieldMask;
 
@@ -161,27 +159,6 @@
   EXPECT_EQ("baz_quz", mask.paths(1));
 }
 
-TEST(FieldMaskUtilTest, GetFieldDescriptors) {
-  std::vector<const FieldDescriptor*> field_descriptors;
-  EXPECT_TRUE(FieldMaskUtil::GetFieldDescriptors(
-      TestAllTypes::descriptor(), "optional_int32", &field_descriptors));
-  EXPECT_EQ(1, field_descriptors.size());
-  EXPECT_EQ("optional_int32", field_descriptors[0]->name());
-  EXPECT_FALSE(FieldMaskUtil::GetFieldDescriptors(
-      TestAllTypes::descriptor(), "optional_nonexist", NULL));
-  EXPECT_TRUE(FieldMaskUtil::GetFieldDescriptors(TestAllTypes::descriptor(),
-                                                 "optional_nested_message.bb",
-                                                 &field_descriptors));
-  EXPECT_EQ(2, field_descriptors.size());
-  EXPECT_EQ("optional_nested_message", field_descriptors[0]->name());
-  EXPECT_EQ("bb", field_descriptors[1]->name());
-  EXPECT_FALSE(FieldMaskUtil::GetFieldDescriptors(
-      TestAllTypes::descriptor(), "optional_nested_message.nonexist", NULL));
-  // FieldMask cannot be used to specify sub-fields of a repeated message.
-  EXPECT_FALSE(FieldMaskUtil::GetFieldDescriptors(
-      TestAllTypes::descriptor(), "repeated_nested_message.bb", NULL));
-}
-
 TEST(FieldMaskUtilTest, TestIsVaildPath) {
   EXPECT_TRUE(FieldMaskUtil::IsValidPath<TestAllTypes>("optional_int32"));
   EXPECT_FALSE(FieldMaskUtil::IsValidPath<TestAllTypes>("optional_nonexist"));
@@ -348,46 +325,6 @@
   EXPECT_EQ("foo.bar.baz", FieldMaskUtil::ToString(out));
 }
 
-TEST(FieldMaskUtilTest, TestSubtract) {
-  FieldMask mask1, mask2, out;
-  // Normal case.
-  FieldMaskUtil::FromString(
-      "optional_int32,optional_uint64,optional_nested_message,optional_foreign_"
-      "message,repeated_int32,repeated_foreign_message,repeated_nested_message."
-      "bb",
-      &mask1);
-
-  FieldMaskUtil::FromString(
-      "optional_int32,optional_nested_message.bb,optional_foreign_message.c,"
-      "repeated_int32,repeated_nested_message.bb,repeated_foreign_message.f,"
-      "repeated_foreign_message.d,repeated_nested_message.bb,repeated_uint32",
-      &mask2);
-
-  FieldMaskUtil::Subtract<TestAllTypes>(mask1, mask2, &out);
-  EXPECT_EQ(
-      "optional_foreign_message.d,optional_uint64,repeated_foreign_message.c",
-      FieldMaskUtil::ToString(out));
-
-  // mask1 is empty.
-  FieldMaskUtil::FromString("", &mask1);
-  FieldMaskUtil::Subtract<TestAllTypes>(mask1, mask2, &out);
-  EXPECT_EQ("", FieldMaskUtil::ToString(out));
-
-  // mask1 is "optional_nested_message" and mask2 is
-  // "optional_nested_message.nonexist_field".
-  FieldMaskUtil::FromString("optional_nested_message", &mask1);
-  FieldMaskUtil::FromString("optional_nested_message.nonexist_field", &mask2);
-  FieldMaskUtil::Subtract<TestAllTypes>(mask1, mask2, &out);
-  EXPECT_EQ("optional_nested_message", FieldMaskUtil::ToString(out));
-
-  // mask1 is "optional_nested_message" and mask2 is
-  // "optional_nested_message".
-  FieldMaskUtil::FromString("optional_nested_message", &mask1);
-  FieldMaskUtil::FromString("optional_nested_message", &mask2);
-  FieldMaskUtil::Subtract<TestAllTypes>(mask1, mask2, &out);
-  EXPECT_EQ("", FieldMaskUtil::ToString(out));
-}
-
 TEST(FieldMaskUtilTest, TestIspathInFieldMask) {
   FieldMask mask;
   FieldMaskUtil::FromString("foo.bar", &mask);
@@ -412,10 +349,6 @@
     dst.Clear();                                             \
     FieldMaskUtil::MergeMessageTo(src, mask, options, &dst); \
     EXPECT_EQ(tmp.DebugString(), dst.DebugString());         \
-    src.clear_##field_name();                                \
-    tmp.clear_##field_name();                                \
-    FieldMaskUtil::MergeMessageTo(src, mask, options, &dst); \
-    EXPECT_EQ(tmp.DebugString(), dst.DebugString());         \
   }
   TEST_MERGE_ONE_PRIMITIVE_FIELD(optional_int32)
   TEST_MERGE_ONE_PRIMITIVE_FIELD(optional_int64)
@@ -551,195 +484,6 @@
   EXPECT_EQ(1234, nested_dst.payload().repeated_int32(0));
 }
 
-TEST(FieldMaskUtilTest, TrimMessage) {
-#define TEST_TRIM_ONE_PRIMITIVE_FIELD(field_name)    \
-  {                                                  \
-    TestAllTypes msg;                                \
-    TestUtil::SetAllFields(&msg);                    \
-    TestAllTypes tmp;                                \
-    tmp.set_##field_name(msg.field_name());          \
-    FieldMask mask;                                  \
-    mask.add_paths(#field_name);                     \
-    FieldMaskUtil::TrimMessage(mask, &msg);          \
-    EXPECT_EQ(tmp.DebugString(), msg.DebugString()); \
-  }
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_int32)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_int64)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_uint32)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_uint64)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_sint32)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_sint64)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_fixed32)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_fixed64)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_sfixed32)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_sfixed64)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_float)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_double)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_bool)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_string)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_bytes)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_nested_enum)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_foreign_enum)
-  TEST_TRIM_ONE_PRIMITIVE_FIELD(optional_import_enum)
-#undef TEST_TRIM_ONE_PRIMITIVE_FIELD
-
-#define TEST_TRIM_ONE_FIELD(field_name)              \
-  {                                                  \
-    TestAllTypes msg;                                \
-    TestUtil::SetAllFields(&msg);                    \
-    TestAllTypes tmp;                                \
-    *tmp.mutable_##field_name() = msg.field_name();  \
-    FieldMask mask;                                  \
-    mask.add_paths(#field_name);                     \
-    FieldMaskUtil::TrimMessage(mask, &msg);          \
-    EXPECT_EQ(tmp.DebugString(), msg.DebugString()); \
-  }
-  TEST_TRIM_ONE_FIELD(optional_nested_message)
-  TEST_TRIM_ONE_FIELD(optional_foreign_message)
-  TEST_TRIM_ONE_FIELD(optional_import_message)
-
-  TEST_TRIM_ONE_FIELD(repeated_int32)
-  TEST_TRIM_ONE_FIELD(repeated_int64)
-  TEST_TRIM_ONE_FIELD(repeated_uint32)
-  TEST_TRIM_ONE_FIELD(repeated_uint64)
-  TEST_TRIM_ONE_FIELD(repeated_sint32)
-  TEST_TRIM_ONE_FIELD(repeated_sint64)
-  TEST_TRIM_ONE_FIELD(repeated_fixed32)
-  TEST_TRIM_ONE_FIELD(repeated_fixed64)
-  TEST_TRIM_ONE_FIELD(repeated_sfixed32)
-  TEST_TRIM_ONE_FIELD(repeated_sfixed64)
-  TEST_TRIM_ONE_FIELD(repeated_float)
-  TEST_TRIM_ONE_FIELD(repeated_double)
-  TEST_TRIM_ONE_FIELD(repeated_bool)
-  TEST_TRIM_ONE_FIELD(repeated_string)
-  TEST_TRIM_ONE_FIELD(repeated_bytes)
-  TEST_TRIM_ONE_FIELD(repeated_nested_message)
-  TEST_TRIM_ONE_FIELD(repeated_foreign_message)
-  TEST_TRIM_ONE_FIELD(repeated_import_message)
-  TEST_TRIM_ONE_FIELD(repeated_nested_enum)
-  TEST_TRIM_ONE_FIELD(repeated_foreign_enum)
-  TEST_TRIM_ONE_FIELD(repeated_import_enum)
-#undef TEST_TRIM_ONE_FIELD
-
-  // Test trim nested fields.
-  NestedTestAllTypes nested_msg;
-  nested_msg.mutable_child()->mutable_payload()->set_optional_int32(1234);
-  nested_msg.mutable_child()
-      ->mutable_child()
-      ->mutable_payload()
-      ->set_optional_int32(5678);
-  NestedTestAllTypes trimmed_msg(nested_msg);
-  FieldMask mask;
-  FieldMaskUtil::FromString("child.payload", &mask);
-  FieldMaskUtil::TrimMessage(mask, &trimmed_msg);
-  EXPECT_EQ(1234, trimmed_msg.child().payload().optional_int32());
-  EXPECT_EQ(0, trimmed_msg.child().child().payload().optional_int32());
-
-  trimmed_msg = nested_msg;
-  FieldMaskUtil::FromString("child.child.payload", &mask);
-  FieldMaskUtil::TrimMessage(mask, &trimmed_msg);
-  EXPECT_EQ(0, trimmed_msg.child().payload().optional_int32());
-  EXPECT_EQ(5678, trimmed_msg.child().child().payload().optional_int32());
-
-  trimmed_msg = nested_msg;
-  FieldMaskUtil::FromString("child", &mask);
-  FieldMaskUtil::TrimMessage(mask, &trimmed_msg);
-  EXPECT_EQ(1234, trimmed_msg.child().payload().optional_int32());
-  EXPECT_EQ(5678, trimmed_msg.child().child().payload().optional_int32());
-
-  trimmed_msg = nested_msg;
-  FieldMaskUtil::FromString("child.child", &mask);
-  FieldMaskUtil::TrimMessage(mask, &trimmed_msg);
-  EXPECT_EQ(0, trimmed_msg.child().payload().optional_int32());
-  EXPECT_EQ(5678, trimmed_msg.child().child().payload().optional_int32());
-
-  // Verify than an empty FieldMask trims nothing
-  TestAllTypes all_types_msg;
-  TestUtil::SetAllFields(&all_types_msg);
-  TestAllTypes trimmed_all_types(all_types_msg);
-  FieldMask empty_mask;
-  FieldMaskUtil::TrimMessage(empty_mask, &trimmed_all_types);
-  EXPECT_EQ(trimmed_all_types.DebugString(), all_types_msg.DebugString());
-
-  // Test trim required fields with keep_required_fields is set true.
-  FieldMaskUtil::TrimOptions options;
-  TestRequired required_msg_1;
-  required_msg_1.set_a(1234);
-  required_msg_1.set_b(3456);
-  required_msg_1.set_c(5678);
-  TestRequired trimmed_required_msg_1(required_msg_1);
-  FieldMaskUtil::FromString("dummy2", &mask);
-  options.set_keep_required_fields(true);
-  FieldMaskUtil::TrimMessage(mask, &trimmed_required_msg_1, options);
-  EXPECT_EQ(trimmed_required_msg_1.DebugString(), required_msg_1.DebugString());
-
-  // Test trim required fields with keep_required_fields is set false.
-  required_msg_1.clear_a();
-  required_msg_1.clear_b();
-  required_msg_1.clear_c();
-  options.set_keep_required_fields(false);
-  FieldMaskUtil::TrimMessage(mask, &trimmed_required_msg_1, options);
-  EXPECT_EQ(trimmed_required_msg_1.DebugString(), required_msg_1.DebugString());
-
-  // Test trim required message with keep_required_fields is set true.
-  TestRequiredMessage required_msg_2;
-  required_msg_2.mutable_optional_message()->set_a(1234);
-  required_msg_2.mutable_optional_message()->set_b(3456);
-  required_msg_2.mutable_optional_message()->set_c(5678);
-  required_msg_2.mutable_required_message()->set_a(1234);
-  required_msg_2.mutable_required_message()->set_b(3456);
-  required_msg_2.mutable_required_message()->set_c(5678);
-  required_msg_2.mutable_required_message()->set_dummy2(7890);
-  TestRequired* repeated_msg = required_msg_2.add_repeated_message();
-  repeated_msg->set_a(1234);
-  repeated_msg->set_b(3456);
-  repeated_msg->set_c(5678);
-  TestRequiredMessage trimmed_required_msg_2(required_msg_2);
-  FieldMaskUtil::FromString("optional_message.dummy2", &mask);
-  options.set_keep_required_fields(true);
-  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());
-
-  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());
-
-  // Test trim required message with keep_required_fields is set false.
-  FieldMaskUtil::FromString("required_message.dummy2", &mask);
-  required_msg_2.mutable_required_message()->clear_a();
-  required_msg_2.mutable_required_message()->clear_b();
-  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());
-
-  // Verify that trimming an empty message has no effect. In particular, fields
-  // mentioned in the field mask should not be created or changed.
-  TestAllTypes empty_msg;
-  FieldMaskUtil::FromString(
-      "optional_int32,optional_bytes,optional_nested_message.bb", &mask);
-  FieldMaskUtil::TrimMessage(mask, &empty_msg);
-  EXPECT_FALSE(empty_msg.has_optional_int32());
-  EXPECT_FALSE(empty_msg.has_optional_bytes());
-  EXPECT_FALSE(empty_msg.has_optional_nested_message());
-
-  // Verify trimming of oneof fields. This should work as expected even if
-  // multiple elements of the same oneof are included in the FieldMask.
-  TestAllTypes oneof_msg;
-  oneof_msg.set_oneof_uint32(11);
-  FieldMaskUtil::FromString("oneof_uint32,oneof_nested_message.bb", &mask);
-  FieldMaskUtil::TrimMessage(mask, &oneof_msg);
-  EXPECT_EQ(11, oneof_msg.oneof_uint32());
-}
-
 
 }  // namespace
 }  // namespace util
diff --git a/src/google/protobuf/util/internal/constants.h b/src/google/protobuf/util/internal/constants.h
index a018a09..e556888 100644
--- a/src/google/protobuf/util/internal/constants.h
+++ b/src/google/protobuf/util/internal/constants.h
@@ -50,16 +50,16 @@
 const char kRfc3339TimeFormatNoPadding[] = "%Y-%m-%dT%H:%M:%S";
 
 // Minimun seconds allowed in a google.protobuf.Timestamp value.
-const int64 kTimestampMinSeconds = -62135596800LL;
+const int64 kTimestampMinSeconds = -62135596800;
 
 // Maximum seconds allowed in a google.protobuf.Timestamp value.
-const int64 kTimestampMaxSeconds = 253402300799LL;
+const int64 kTimestampMaxSeconds = 253402300799;
 
 // Minimum seconds allowed in a google.protobuf.Duration value.
-const int64 kDurationMinSeconds = -315576000000LL;
+const int64 kDurationMinSeconds = -315576000000;
 
 // Maximum seconds allowed in a google.protobuf.Duration value.
-const int64 kDurationMaxSeconds = 315576000000LL;
+const int64 kDurationMaxSeconds = 315576000000;
 
 // Nano seconds in a second.
 const int32 kNanosPerSecond = 1000000000;
diff --git a/src/google/protobuf/util/internal/datapiece.cc b/src/google/protobuf/util/internal/datapiece.cc
index 213c2c4..72c0aca 100644
--- a/src/google/protobuf/util/internal/datapiece.cc
+++ b/src/google/protobuf/util/internal/datapiece.cc
@@ -94,24 +94,19 @@
 }
 
 // For conversion between double and float only.
-StatusOr<double> FloatToDouble(float before) {
-  // Casting float to double should just work as double has more precision
-  // than float.
-  return static_cast<double>(before);
-}
+template <typename To, typename From>
+StatusOr<To> FloatingPointConvertAndCheck(From before) {
+  if (MathLimits<From>::IsNaN(before)) {
+    return std::numeric_limits<To>::quiet_NaN();
+  }
 
-StatusOr<float> DoubleToFloat(double before) {
-  if (MathLimits<double>::IsNaN(before)) {
-    return std::numeric_limits<float>::quiet_NaN();
-  } else if (!MathLimits<double>::IsFinite(before)) {
-    // Converting a double +inf/-inf to float should just work.
-    return static_cast<float>(before);
-  } else if (before > std::numeric_limits<float>::max() ||
-             before < -std::numeric_limits<float>::max()) {
-    // Double value outside of the range of float.
-    return InvalidArgument(DoubleAsString(before));
+  To after = static_cast<To>(before);
+  if (MathUtil::AlmostEquals<To>(after, before)) {
+    return after;
   } else {
-    return static_cast<float>(before);
+    return InvalidArgument(::google::protobuf::internal::is_same<From, double>::value
+                               ? DoubleAsString(before)
+                               : FloatAsString(before));
   }
 }
 
@@ -167,27 +162,20 @@
 
 StatusOr<double> DataPiece::ToDouble() const {
   if (type_ == TYPE_FLOAT) {
-    return FloatToDouble(float_);
+    return FloatingPointConvertAndCheck<double, float>(float_);
   }
   if (type_ == TYPE_STRING) {
     if (str_ == "Infinity") return std::numeric_limits<double>::infinity();
     if (str_ == "-Infinity") return -std::numeric_limits<double>::infinity();
     if (str_ == "NaN") return std::numeric_limits<double>::quiet_NaN();
-    StatusOr<double> value = StringToNumber<double>(safe_strtod);
-    if (value.ok() && !MathLimits<double>::IsFinite(value.ValueOrDie())) {
-      // safe_strtod converts out-of-range values to +inf/-inf, but we want
-      // to report them as errors.
-      return InvalidArgument(StrCat("\"", str_, "\""));
-    } else {
-      return value;
-    }
+    return StringToNumber<double>(safe_strtod);
   }
   return GenericConvert<double>();
 }
 
 StatusOr<float> DataPiece::ToFloat() const {
   if (type_ == TYPE_DOUBLE) {
-    return DoubleToFloat(double_);
+    return FloatingPointConvertAndCheck<float, double>(double_);
   }
   if (type_ == TYPE_STRING) {
     if (str_ == "Infinity") return std::numeric_limits<float>::infinity();
@@ -271,8 +259,7 @@
   }
 }
 
-StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type,
-                                bool use_lower_camel_for_enums) const {
+StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type) const {
   if (type_ == TYPE_NULL) return google::protobuf::NULL_VALUE;
 
   if (type_ == TYPE_STRING) {
@@ -281,34 +268,20 @@
     const google::protobuf::EnumValue* value =
         FindEnumValueByNameOrNull(enum_type, enum_name);
     if (value != NULL) return value->number();
-
-    // Check if int version of enum is sent as string.
-    StatusOr<int32> int_value = ToInt32();
-    if (int_value.ok()) {
-      if (const google::protobuf::EnumValue* enum_value =
-              FindEnumValueByNumberOrNull(enum_type, int_value.ValueOrDie())) {
-        return enum_value->number();
-      }
-    }
-
     // Next try a normalized name.
     for (string::iterator it = enum_name.begin(); it != enum_name.end(); ++it) {
       *it = *it == '-' ? '_' : ascii_toupper(*it);
     }
     value = FindEnumValueByNameOrNull(enum_type, enum_name);
     if (value != NULL) return value->number();
-
-    // If use_lower_camel_for_enums is true try with enum name without
-    // underscore. This will also accept camel case names as the enum_name has
-    // been normalized before.
-    if (use_lower_camel_for_enums) {
-      value = FindEnumValueByNameWithoutUnderscoreOrNull(enum_type, enum_name);
-      if (value != NULL) return value->number();
-    }
   } else {
-    // We don't need to check whether the value is actually declared in the
-    // enum because we preserve unknown enum values as well.
-    return ToInt32();
+    StatusOr<int32> value = ToInt32();
+    if (value.ok()) {
+      if (const google::protobuf::EnumValue* enum_value =
+              FindEnumValueByNumberOrNull(enum_type, value.ValueOrDie())) {
+        return enum_value->number();
+      }
+    }
   }
   return InvalidArgument(
       ValueAsStringOrDefault("Cannot find enum with given value."));
@@ -356,8 +329,9 @@
       // WebSafeBase64Escape does no padding by default.
       WebSafeBase64Escape(*dest, &encoded);
       // Remove trailing padding '=' characters before comparison.
-      StringPiece src_no_padding = StringPiece(src).substr(
-          0, src.ends_with("=") ? src.find_last_not_of('=') + 1 : src.length());
+      StringPiece src_no_padding(src, 0, src.ends_with("=")
+                                             ? src.find_last_not_of('=') + 1
+                                             : src.length());
       return encoded == src_no_padding;
     }
     return true;
@@ -369,8 +343,9 @@
       Base64Escape(
           reinterpret_cast<const unsigned char*>(dest->data()), dest->length(),
           &encoded, false);
-      StringPiece src_no_padding = StringPiece(src).substr(
-          0, src.ends_with("=") ? src.find_last_not_of('=') + 1 : src.length());
+      StringPiece src_no_padding(src, 0, src.ends_with("=")
+                                             ? src.find_last_not_of('=') + 1
+                                             : src.length());
       return encoded == src_no_padding;
     }
     return true;
@@ -379,27 +354,6 @@
   return false;
 }
 
-void DataPiece::InternalCopy(const DataPiece& other) {
-  type_ = other.type_;
-  use_strict_base64_decoding_ = other.use_strict_base64_decoding_;
-  switch (type_) {
-    case TYPE_INT32:
-    case TYPE_INT64:
-    case TYPE_UINT32:
-    case TYPE_UINT64:
-    case TYPE_DOUBLE:
-    case TYPE_FLOAT:
-    case TYPE_BOOL:
-    case TYPE_ENUM:
-    case TYPE_NULL:
-    case TYPE_BYTES:
-    case TYPE_STRING: {
-      str_ = other.str_;
-      break;
-    }
-  }
-}
-
 }  // namespace converter
 }  // namespace util
 }  // namespace protobuf
diff --git a/src/google/protobuf/util/internal/datapiece.h b/src/google/protobuf/util/internal/datapiece.h
index 83516d0..8b2e35d 100644
--- a/src/google/protobuf/util/internal/datapiece.h
+++ b/src/google/protobuf/util/internal/datapiece.h
@@ -76,22 +76,13 @@
   };
 
   // Constructors and Destructor
-  explicit DataPiece(const int32 value)
-      : type_(TYPE_INT32), i32_(value), use_strict_base64_decoding_(false) {}
-  explicit DataPiece(const int64 value)
-      : type_(TYPE_INT64), i64_(value), use_strict_base64_decoding_(false) {}
-  explicit DataPiece(const uint32 value)
-      : type_(TYPE_UINT32), u32_(value), use_strict_base64_decoding_(false) {}
-  explicit DataPiece(const uint64 value)
-      : type_(TYPE_UINT64), u64_(value), use_strict_base64_decoding_(false) {}
-  explicit DataPiece(const double value)
-      : type_(TYPE_DOUBLE),
-        double_(value),
-        use_strict_base64_decoding_(false) {}
-  explicit DataPiece(const float value)
-      : type_(TYPE_FLOAT), float_(value), use_strict_base64_decoding_(false) {}
-  explicit DataPiece(const bool value)
-      : type_(TYPE_BOOL), bool_(value), use_strict_base64_decoding_(false) {}
+  explicit DataPiece(const int32 value) : type_(TYPE_INT32), i32_(value) {}
+  explicit DataPiece(const int64 value) : type_(TYPE_INT64), i64_(value) {}
+  explicit DataPiece(const uint32 value) : type_(TYPE_UINT32), u32_(value) {}
+  explicit DataPiece(const uint64 value) : type_(TYPE_UINT64), u64_(value) {}
+  explicit DataPiece(const double value) : type_(TYPE_DOUBLE), double_(value) {}
+  explicit DataPiece(const float value) : type_(TYPE_FLOAT), float_(value) {}
+  explicit DataPiece(const bool value) : type_(TYPE_BOOL), bool_(value) {}
   DataPiece(StringPiece value, bool use_strict_base64_decoding)
       : type_(TYPE_STRING),
         str_(StringPiecePod::CreateFromStringPiece(value)),
@@ -101,11 +92,10 @@
       : type_(TYPE_BYTES),
         str_(StringPiecePod::CreateFromStringPiece(value)),
         use_strict_base64_decoding_(use_strict_base64_decoding) {}
-
-  DataPiece(const DataPiece& r) : type_(r.type_) { InternalCopy(r); }
-
+  DataPiece(const DataPiece& r) : type_(r.type_), str_(r.str_) {}
   DataPiece& operator=(const DataPiece& x) {
-    InternalCopy(x);
+    type_ = x.type_;
+    str_ = x.str_;
     return *this;
   }
 
@@ -117,8 +107,6 @@
   // Accessors
   Type type() const { return type_; }
 
-  bool use_strict_base64_decoding() { return use_strict_base64_decoding_; }
-
   StringPiece str() const {
     GOOGLE_LOG_IF(DFATAL, type_ != TYPE_STRING) << "Not a string type.";
     return str_;
@@ -159,20 +147,16 @@
   // string, first attempts conversion by name, trying names as follows:
   //   1) the directly provided string value.
   //   2) the value upper-cased and replacing '-' by '_'
-  //   3) if use_lower_camel_for_enums is true it also attempts by comparing
-  //   enum name without underscore with the value upper cased above.
   // If the value is not a string, attempts to convert to a 32-bit integer.
   // If none of these succeeds, returns a conversion error status.
-  util::StatusOr<int> ToEnum(const google::protobuf::Enum* enum_type,
-                               bool use_lower_camel_for_enums) const;
+  util::StatusOr<int> ToEnum(const google::protobuf::Enum* enum_type) const;
 
  private:
   // Disallow implicit constructor.
   DataPiece();
 
   // Helper to create NULL or ENUM types.
-  DataPiece(Type type, int32 val)
-      : type_(type), i32_(val), use_strict_base64_decoding_(false) {}
+  DataPiece(Type type, int32 val) : type_(type), i32_(val) {}
 
   // For numeric conversion between
   //     int32, int64, uint32, uint64, double, float and bool
@@ -187,9 +171,6 @@
   // Decodes a base64 string. Returns true on success.
   bool DecodeBase64(StringPiece src, string* dest) const;
 
-  // Helper function to initialize this DataPiece with 'other'.
-  void InternalCopy(const DataPiece& other);
-
   // Data type for this piece of data.
   Type type_;
 
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter.cc b/src/google/protobuf/util/internal/default_value_objectwriter.cc
index 95b3a17..21d7a2e 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter.cc
+++ b/src/google/protobuf/util/internal/default_value_objectwriter.cc
@@ -64,8 +64,6 @@
       type_(type),
       current_(NULL),
       root_(NULL),
-      suppress_empty_list_(false),
-      preserve_proto_field_names_(false),
       field_scrub_callback_(NULL),
       ow_(ow) {}
 
@@ -166,10 +164,7 @@
   if (current_ == NULL) {
     ow_->RenderBytes(name, value);
   } else {
-    // Since StringPiece is essentially a pointer, takes a copy of "value" to
-    // avoid ownership issues.
-    string_values_.push_back(new string(value.ToString()));
-    RenderDataPiece(name, DataPiece(*string_values_.back(), false, true));
+    RenderDataPiece(name, DataPiece(value, false, true));
   }
   return this;
 }
@@ -189,28 +184,12 @@
   field_scrub_callback_.reset(field_scrub_callback.release());
 }
 
-DefaultValueObjectWriter::Node* DefaultValueObjectWriter::CreateNewNode(
-    const string& name, const google::protobuf::Type* type, NodeKind kind,
-    const DataPiece& data, bool is_placeholder, const std::vector<string>& path,
-    bool suppress_empty_list, FieldScrubCallBack* field_scrub_callback) {
-  return new Node(name, type, kind, data, is_placeholder, path,
-                  suppress_empty_list, field_scrub_callback);
-}
-
-DefaultValueObjectWriter::Node* DefaultValueObjectWriter::CreateNewNode(
-    const string& name, const google::protobuf::Type* type, NodeKind kind,
-    const DataPiece& data, bool is_placeholder, const std::vector<string>& path,
-    bool suppress_empty_list, bool preserve_proto_field_names,
-    FieldScrubCallBack* field_scrub_callback) {
-  return new Node(name, type, kind, data, is_placeholder, path,
-                  suppress_empty_list, preserve_proto_field_names,
-                  field_scrub_callback);
-}
-
-DefaultValueObjectWriter::Node::Node(
-    const string& name, const google::protobuf::Type* type, NodeKind kind,
-    const DataPiece& data, bool is_placeholder, const std::vector<string>& path,
-    bool suppress_empty_list, FieldScrubCallBack* field_scrub_callback)
+DefaultValueObjectWriter::Node::Node(const string& name,
+                                     const google::protobuf::Type* type,
+                                     NodeKind kind, const DataPiece& data,
+                                     bool is_placeholder,
+                                     const vector<string>& path,
+                                     FieldScrubCallBack* field_scrub_callback)
     : name_(name),
       type_(type),
       kind_(kind),
@@ -218,24 +197,6 @@
       data_(data),
       is_placeholder_(is_placeholder),
       path_(path),
-      suppress_empty_list_(suppress_empty_list),
-      preserve_proto_field_names_(false),
-      field_scrub_callback_(field_scrub_callback) {}
-
-DefaultValueObjectWriter::Node::Node(
-    const string& name, const google::protobuf::Type* type, NodeKind kind,
-    const DataPiece& data, bool is_placeholder, const std::vector<string>& path,
-    bool suppress_empty_list, bool preserve_proto_field_names,
-    FieldScrubCallBack* field_scrub_callback)
-    : name_(name),
-      type_(type),
-      kind_(kind),
-      is_any_(false),
-      data_(data),
-      is_placeholder_(is_placeholder),
-      path_(path),
-      suppress_empty_list_(suppress_empty_list),
-      preserve_proto_field_names_(preserve_proto_field_names),
       field_scrub_callback_(field_scrub_callback) {}
 
 DefaultValueObjectWriter::Node* DefaultValueObjectWriter::Node::FindChild(
@@ -269,9 +230,6 @@
   // Write out lists. If we didn't have any list in response, write out empty
   // list.
   if (kind_ == LIST) {
-    // Suppress empty lists if requested.
-    if (suppress_empty_list_ && is_placeholder_) return;
-
     ow->StartList(name_);
     WriteChildren(ow);
     ow->EndList();
@@ -346,7 +304,7 @@
 
     // This code is checking if the field to be added to the tree should be
     // scrubbed or not by calling the field_scrub_callback_ callback function.
-    std::vector<string> path;
+    vector<string> path;
     if (!path_.empty()) {
       path.insert(path.begin(), path_.begin(), path_.end());
     }
@@ -399,19 +357,16 @@
     }
 
     // If oneof_index() != 0, the child field is part of a "oneof", which means
-    // the child field is optional and we shouldn't populate its default
-    // primitive value.
-    if (field.oneof_index() != 0 && kind == PRIMITIVE) continue;
+    // the child field is optional and we shouldn't populate its default value.
+    if (field.oneof_index() != 0) continue;
 
     // If the child field is of primitive type, sets its data to the default
     // value of its type.
     google::protobuf::scoped_ptr<Node> child(new Node(
-        preserve_proto_field_names_ ? field.name() : field.json_name(),
-        field_type, kind,
+        field.json_name(), field_type, kind,
         kind == PRIMITIVE ? CreateDefaultDataPieceForField(field, typeinfo)
                           : DataPiece::NullData(),
-        true, path, suppress_empty_list_, preserve_proto_field_names_,
-        field_scrub_callback_));
+        true, path, field_scrub_callback_));
     new_children.push_back(child.release());
   }
   // Adds all leftover nodes in children_ to the beginning of new_child.
@@ -505,11 +460,9 @@
 DefaultValueObjectWriter* DefaultValueObjectWriter::StartObject(
     StringPiece name) {
   if (current_ == NULL) {
-    std::vector<string> path;
-    root_.reset(CreateNewNode(string(name), &type_, OBJECT,
-                              DataPiece::NullData(), false, path,
-                              suppress_empty_list_, preserve_proto_field_names_,
-                              field_scrub_callback_.get()));
+    vector<string> path;
+    root_.reset(new Node(name.ToString(), &type_, OBJECT, DataPiece::NullData(),
+                         false, path, field_scrub_callback_.get()));
     root_->PopulateChildren(typeinfo_);
     current_ = root_.get();
     return this;
@@ -519,15 +472,13 @@
   if (current_->kind() == LIST || current_->kind() == MAP || child == NULL) {
     // If current_ is a list or a map node, we should create a new child and use
     // the type of current_ as the type of the new child.
-    google::protobuf::scoped_ptr<Node> node(
-        CreateNewNode(string(name),
-                      ((current_->kind() == LIST || current_->kind() == MAP)
-                           ? current_->type()
-                           : NULL),
-                      OBJECT, DataPiece::NullData(), false,
-                      child == NULL ? current_->path() : child->path(),
-                      suppress_empty_list_, preserve_proto_field_names_,
-                      field_scrub_callback_.get()));
+    google::protobuf::scoped_ptr<Node> node(new Node(
+        name.ToString(), ((current_->kind() == LIST || current_->kind() == MAP)
+                              ? current_->type()
+                              : NULL),
+        OBJECT, DataPiece::NullData(), false,
+        child == NULL ? current_->path() : child->path(),
+        field_scrub_callback_.get()));
     child = node.get();
     current_->AddChild(node.release());
   }
@@ -556,11 +507,9 @@
 DefaultValueObjectWriter* DefaultValueObjectWriter::StartList(
     StringPiece name) {
   if (current_ == NULL) {
-    std::vector<string> path;
-    root_.reset(CreateNewNode(string(name), &type_, LIST, DataPiece::NullData(),
-                              false, path, suppress_empty_list_,
-                              preserve_proto_field_names_,
-                              field_scrub_callback_.get()));
+    vector<string> path;
+    root_.reset(new Node(name.ToString(), &type_, LIST, DataPiece::NullData(),
+                         false, path, field_scrub_callback_.get()));
     current_ = root_.get();
     return this;
   }
@@ -568,10 +517,9 @@
   Node* child = current_->FindChild(name);
   if (child == NULL || child->kind() != LIST) {
     google::protobuf::scoped_ptr<Node> node(
-        CreateNewNode(string(name), NULL, LIST, DataPiece::NullData(), false,
-                      child == NULL ? current_->path() : child->path(),
-                      suppress_empty_list_, preserve_proto_field_names_,
-                      field_scrub_callback_.get()));
+        new Node(name.ToString(), NULL, LIST, DataPiece::NullData(), false,
+                 child == NULL ? current_->path() : child->path(),
+                 field_scrub_callback_.get()));
     child = node.get();
     current_->AddChild(node.release());
   }
@@ -601,43 +549,39 @@
 void DefaultValueObjectWriter::RenderDataPiece(StringPiece name,
                                                const DataPiece& data) {
   MaybePopulateChildrenOfAny(current_);
+  util::StatusOr<string> data_string = data.ToString();
   if (current_->type() != NULL && current_->type()->name() == kAnyType &&
-      name == "@type") {
-    util::StatusOr<string> data_string = data.ToString();
-    if (data_string.ok()) {
-      const string& string_value = data_string.ValueOrDie();
-      // If the type of current_ is "Any" and its "@type" field is being set
-      // here, sets the type of current_ to be the type specified by the
-      // "@type".
-      util::StatusOr<const google::protobuf::Type*> found_type =
-          typeinfo_->ResolveTypeUrl(string_value);
-      if (!found_type.ok()) {
-        GOOGLE_LOG(WARNING) << "Failed to resolve type '" << string_value << "'.";
-      } else {
-        current_->set_type(found_type.ValueOrDie());
-      }
-      current_->set_is_any(true);
-      // If the "@type" field is placed after other fields, we should populate
-      // other children of primitive type now. Otherwise, we should wait until
-      // the first value field is rendered before we populate the children,
-      // because the "value" field of a Any message could be omitted.
-      if (current_->number_of_children() > 1 && current_->type() != NULL) {
-        current_->PopulateChildren(typeinfo_);
-      }
+      name == "@type" && data_string.ok()) {
+    const string& string_value = data_string.ValueOrDie();
+    // If the type of current_ is "Any" and its "@type" field is being set here,
+    // sets the type of current_ to be the type specified by the "@type".
+    util::StatusOr<const google::protobuf::Type*> found_type =
+        typeinfo_->ResolveTypeUrl(string_value);
+    if (!found_type.ok()) {
+      GOOGLE_LOG(WARNING) << "Failed to resolve type '" << string_value << "'.";
+    } else {
+      current_->set_type(found_type.ValueOrDie());
+    }
+    current_->set_is_any(true);
+    // If the "@type" field is placed after other fields, we should populate
+    // other children of primitive type now. Otherwise, we should wait until the
+    // first value field is rendered before we populate the children, because
+    // the "value" field of a Any message could be omitted.
+    if (current_->number_of_children() > 1 && current_->type() != NULL) {
+      current_->PopulateChildren(typeinfo_);
     }
   }
   Node* child = current_->FindChild(name);
   if (child == NULL || child->kind() != PRIMITIVE) {
     // No children are found, creates a new child.
     google::protobuf::scoped_ptr<Node> node(
-        CreateNewNode(string(name), NULL, PRIMITIVE, data, false,
-                      child == NULL ? current_->path() : child->path(),
-                      suppress_empty_list_, preserve_proto_field_names_,
-                      field_scrub_callback_.get()));
+        new Node(name.ToString(), NULL, PRIMITIVE, data, false,
+                 child == NULL ? current_->path() : child->path(),
+                 field_scrub_callback_.get()));
+    child = node.get();
     current_->AddChild(node.release());
   } else {
     child->set_data(data);
-    child->set_is_placeholder(false);
   }
 }
 
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter.h b/src/google/protobuf/util/internal/default_value_objectwriter.h
index 09c6d23..1d85bed 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter.h
+++ b/src/google/protobuf/util/internal/default_value_objectwriter.h
@@ -122,16 +122,7 @@
   // field_scrub_callback pointer is also transferred to this class
   void RegisterFieldScrubCallBack(FieldScrubCallBackPtr field_scrub_callback);
 
-  // If set to true, empty lists are suppressed from output when default values
-  // are written.
-  void set_suppress_empty_list(bool value) { suppress_empty_list_ = value; }
-
-  // If set to true, original proto field names are used
-  void set_preserve_proto_field_names(bool value) {
-    preserve_proto_field_names_ = value;
-  }
-
- protected:
+ private:
   enum NodeKind {
     PRIMITIVE = 0,
     OBJECT = 1,
@@ -144,13 +135,7 @@
   class LIBPROTOBUF_EXPORT Node {
    public:
     Node(const string& name, const google::protobuf::Type* type, NodeKind kind,
-         const DataPiece& data, bool is_placeholder,
-         const std::vector<string>& path, bool suppress_empty_list,
-         FieldScrubCallBack* field_scrub_callback);
-    Node(const string& name, const google::protobuf::Type* type, NodeKind kind,
-         const DataPiece& data, bool is_placeholder,
-         const std::vector<string>& path, bool suppress_empty_list,
-         bool preserve_proto_field_names,
+         const DataPiece& data, bool is_placeholder, const vector<string>& path,
          FieldScrubCallBack* field_scrub_callback);
     virtual ~Node() {
       for (int i = 0; i < children_.size(); ++i) {
@@ -167,17 +152,17 @@
     // Populates children of this Node based on its type. If there are already
     // children created, they will be merged to the result. Caller should pass
     // in TypeInfo for looking up types of the children.
-    virtual void PopulateChildren(const TypeInfo* typeinfo);
+    void PopulateChildren(const TypeInfo* typeinfo);
 
     // If this node is a leaf (has data), writes the current node to the
     // ObjectWriter; if not, then recursively writes the children to the
     // ObjectWriter.
-    virtual void WriteTo(ObjectWriter* ow);
+    void WriteTo(ObjectWriter* ow);
 
     // Accessors
     const string& name() const { return name_; }
 
-    const std::vector<string>& path() const { return path_; }
+    const vector<string>& path() const { return path_; }
 
     const google::protobuf::Type* type() const { return type_; }
 
@@ -197,7 +182,7 @@
       is_placeholder_ = is_placeholder;
     }
 
-   protected:
+   private:
     // Returns the Value Type of a map given the Type of the map entry and a
     // TypeInfo instance.
     const google::protobuf::Type* GetMapValueType(
@@ -227,46 +212,13 @@
     // Path of the field of this node
     std::vector<string> path_;
 
-    // Whether to suppress empty list output.
-    bool suppress_empty_list_;
-
-    // Whether to preserve original proto field names
-    bool preserve_proto_field_names_;
-
     // Pointer to function for determining whether a field needs to be scrubbed
     // or not. This callback is owned by the creator of this node.
     FieldScrubCallBack* field_scrub_callback_;
 
-   private:
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Node);
   };
 
-  // Creates a new Node and returns it. Caller owns memory of returned object.
-  virtual Node* CreateNewNode(const string& name,
-                              const google::protobuf::Type* type, NodeKind kind,
-                              const DataPiece& data, bool is_placeholder,
-                              const std::vector<string>& path,
-                              bool suppress_empty_list,
-                              FieldScrubCallBack* field_scrub_callback);
-
-  // Creates a new Node and returns it. Caller owns memory of returned object.
-  virtual Node* CreateNewNode(const string& name,
-                              const google::protobuf::Type* type, NodeKind kind,
-                              const DataPiece& data, bool is_placeholder,
-                              const std::vector<string>& path,
-                              bool suppress_empty_list,
-                              bool preserve_proto_field_names,
-                              FieldScrubCallBack* field_scrub_callback);
-
-  // Creates a DataPiece containing the default value of the type of the field.
-  static DataPiece CreateDefaultDataPieceForField(
-      const google::protobuf::Field& field, const TypeInfo* typeinfo);
-
- protected:
-  // Returns a pointer to current Node in tree.
-  Node* current() { return current_; }
-
- private:
   // Populates children of "node" if it is an "any" Node and its real type has
   // been given.
   void MaybePopulateChildrenOfAny(Node* node);
@@ -275,6 +227,10 @@
   // NULL.
   void WriteRoot();
 
+  // Creates a DataPiece containing the default value of the type of the field.
+  static DataPiece CreateDefaultDataPieceForField(
+      const google::protobuf::Field& field, const TypeInfo* typeinfo);
+
   // Adds or replaces the data_ of a primitive child node.
   void RenderDataPiece(StringPiece name, const DataPiece& data);
 
@@ -292,7 +248,7 @@
   // google::protobuf::Type of the root message type.
   const google::protobuf::Type& type_;
   // Holds copies of strings passed to RenderString.
-  std::vector<string*> string_values_;
+  vector<string*> string_values_;
 
   // The current Node. Owned by its parents.
   Node* current_;
@@ -301,12 +257,6 @@
   // The stack to hold the path of Nodes from current_ to root_;
   std::stack<Node*> stack_;
 
-  // Whether to suppress output of empty lists.
-  bool suppress_empty_list_;
-
-  // Whether to preserve original proto field names
-  bool preserve_proto_field_names_;
-
   // Unique Pointer to function for determining whether a field needs to be
   // scrubbed or not.
   FieldScrubCallBackPtr field_scrub_callback_;
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter_test.cc b/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
index e1dd697..8254c0f 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
@@ -149,39 +149,6 @@
 }
 
 
-class DefaultValueObjectWriterSuppressListTest
-    : public BaseDefaultValueObjectWriterTest {
- protected:
-  DefaultValueObjectWriterSuppressListTest()
-      : BaseDefaultValueObjectWriterTest(DefaultValueTest::descriptor()) {
-    testing_->set_suppress_empty_list(true);
-  }
-  ~DefaultValueObjectWriterSuppressListTest() {}
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
-                        DefaultValueObjectWriterSuppressListTest,
-                        ::testing::Values(
-                            testing::USE_TYPE_RESOLVER));
-
-TEST_P(DefaultValueObjectWriterSuppressListTest, Empty) {
-  // Set expectation. Emtpy lists should be suppressed.
-  expects_.StartObject("")
-      ->RenderDouble("doubleValue", 0.0)
-      ->RenderFloat("floatValue", 0.0)
-      ->RenderInt64("int64Value", 0)
-      ->RenderUint64("uint64Value", 0)
-      ->RenderInt32("int32Value", 0)
-      ->RenderUint32("uint32Value", 0)
-      ->RenderBool("boolValue", false)
-      ->RenderString("stringValue", "")
-      ->RenderBytes("bytesValue", "")
-      ->RenderString("enumValue", "ENUM_FIRST")
-      ->EndObject();
-
-  // Actual testing
-  testing_->StartObject("")->EndObject();
-}
 }  // namespace testing
 }  // namespace converter
 }  // namespace util
diff --git a/src/google/protobuf/util/internal/error_listener.h b/src/google/protobuf/util/internal/error_listener.h
index 1dc814a..3f06393 100644
--- a/src/google/protobuf/util/internal/error_listener.h
+++ b/src/google/protobuf/util/internal/error_listener.h
@@ -57,7 +57,7 @@
 
   // Reports an invalid name at the given location.
   virtual void InvalidName(const LocationTrackerInterface& loc,
-                           StringPiece invalid_name, StringPiece message) = 0;
+                           StringPiece unknown_name, StringPiece message) = 0;
 
   // Reports an invalid value for a field.
   virtual void InvalidValue(const LocationTrackerInterface& loc,
@@ -82,7 +82,7 @@
   virtual ~NoopErrorListener() {}
 
   virtual void InvalidName(const LocationTrackerInterface& loc,
-                           StringPiece invalid_name, StringPiece message) {}
+                           StringPiece unknown_name, StringPiece message) {}
 
   virtual void InvalidValue(const LocationTrackerInterface& loc,
                             StringPiece type_name, StringPiece value) {}
diff --git a/src/google/protobuf/util/internal/field_mask_utility.cc b/src/google/protobuf/util/internal/field_mask_utility.cc
index 38835f6..f0e8fc8 100644
--- a/src/google/protobuf/util/internal/field_mask_utility.cc
+++ b/src/google/protobuf/util/internal/field_mask_utility.cc
@@ -44,6 +44,11 @@
   return path_sink->Run(arg);
 }
 
+util::Status CreatePublicError(util::error::Code code,
+                                 const string& message) {
+  return util::Status(code, message);
+}
+
 // Appends a FieldMask path segment to a prefix.
 string AppendPathSegmentToPrefix(StringPiece prefix, StringPiece segment) {
   if (prefix.empty()) {
@@ -107,7 +112,7 @@
 
 util::Status DecodeCompactFieldMaskPaths(StringPiece paths,
                                            PathSinkCallback path_sink) {
-  std::stack<string> prefix;
+  stack<string> prefix;
   int length = paths.length();
   int previous_position = 0;
   bool in_map_key = false;
@@ -211,7 +216,7 @@
                           StrCat("Invalid FieldMask '", paths,
                                  "'. Cannot find matching ')' for all '('."));
   }
-  return util::Status();
+  return util::Status::OK;
 }
 
 }  // namespace converter
diff --git a/src/google/protobuf/util/internal/json_escaping.cc b/src/google/protobuf/util/internal/json_escaping.cc
index 06b9a7f..24bd554 100644
--- a/src/google/protobuf/util/internal/json_escaping.cc
+++ b/src/google/protobuf/util/internal/json_escaping.cc
@@ -84,6 +84,30 @@
   "\\u009c", "\\u009d", "\\u009e", "\\u009f"
 };
 
+// Determines if the given char value is a unicode high-surrogate code unit.
+// Such values do not represent characters by themselves, but are used in the
+// representation of supplementary characters in the utf-16 encoding.
+inline bool IsHighSurrogate(uint16 c) {
+  // Optimized form of:
+  // return c >= kMinHighSurrogate && c <= kMaxHighSurrogate;
+  // (Reduced from 3 ALU instructions to 2 ALU instructions)
+  return (c & ~(JsonEscaping::kMaxHighSurrogate -
+                JsonEscaping::kMinHighSurrogate))
+      == JsonEscaping::kMinHighSurrogate;
+}
+
+// Determines if the given char value is a unicode low-surrogate code unit.
+// Such values do not represent characters by themselves, but are used in the
+// representation of supplementary characters in the utf-16 encoding.
+inline bool IsLowSurrogate(uint16 c) {
+  // Optimized form of:
+  // return c >= kMinLowSurrogate && c <= kMaxLowSurrogate;
+  // (Reduced from 3 ALU instructions to 2 ALU instructions)
+  return (c & ~(JsonEscaping::kMaxLowSurrogate -
+                JsonEscaping::kMinLowSurrogate))
+      == JsonEscaping::kMinLowSurrogate;
+}
+
 // Determines if the given char value is a unicode surrogate code unit (either
 // high-surrogate or low-surrogate).
 inline bool IsSurrogate(uint32 c) {
@@ -93,12 +117,36 @@
   return (c & 0xfffff800) == JsonEscaping::kMinHighSurrogate;
 }
 
+// Returns true if the given unicode code point cp is
+// in the supplementary character range.
+inline bool IsSupplementalCodePoint(uint32 cp) {
+  // Optimized form of:
+  // return kMinSupplementaryCodePoint <= cp && cp <= kMaxCodePoint;
+  // (Reduced from 3 ALU instructions to 2 ALU instructions)
+  return (cp & ~(JsonEscaping::kMinSupplementaryCodePoint - 1))
+      < JsonEscaping::kMaxCodePoint;
+}
+
 // Returns true if the given unicode code point cp is a valid
 // unicode code point (i.e. in the range 0 <= cp <= kMaxCodePoint).
 inline bool IsValidCodePoint(uint32 cp) {
   return cp <= JsonEscaping::kMaxCodePoint;
 }
 
+// Converts the specified surrogate pair to its supplementary code point value.
+// It is the callers' responsibility to validate the specified surrogate pair.
+inline uint32 ToCodePoint(uint16 high, uint16 low) {
+  // Optimized form of:
+  // return ((high - kMinHighSurrogate) << 10)
+  //     + (low - kMinLowSurrogate)
+  //     + kMinSupplementaryCodePoint;
+  // (Reduced from 5 ALU instructions to 3 ALU instructions)
+  return (high << 10) + low +
+      (JsonEscaping::kMinSupplementaryCodePoint
+       - (static_cast<unsigned>(JsonEscaping::kMinHighSurrogate) << 10)
+       - JsonEscaping::kMinLowSurrogate);
+}
+
 // 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) {
@@ -207,7 +255,7 @@
   buffer[3] = kHex[cp & 0x0f];
   cp >>= 4;
   buffer[2] = kHex[cp & 0x0f];
-  return StringPiece(buffer, 6);
+  return StringPiece(buffer, 0, 6);
 }
 
 // Stores the 32-bit unicode code point as its hexadecimal digits in buffer
@@ -288,19 +336,19 @@
     cp >>= 6;
     if (cp <= 0x1f) {
       buffer[4] = cp | 0xc0;
-      sp = StringPiece(buffer + 4, 2);
+      sp.set(buffer + 4, 2);
       return sp;
     }
     buffer[4] = (cp & 0x3f) | 0x80;
     cp >>= 6;
     if (cp <= 0x0f) {
       buffer[3] = cp | 0xe0;
-      sp = StringPiece(buffer + 3, 3);
+      sp.set(buffer + 3, 3);
       return sp;
     }
     buffer[3] = (cp & 0x3f) | 0x80;
     buffer[2] = ((cp >> 6) & 0x07) | 0xf0;
-    sp = StringPiece(buffer + 2, 4);
+    sp.set(buffer + 2, 4);
   }
   return sp;
 }
diff --git a/src/google/protobuf/util/internal/json_escaping.h b/src/google/protobuf/util/internal/json_escaping.h
index 9b8b2af..e3e329f 100644
--- a/src/google/protobuf/util/internal/json_escaping.h
+++ b/src/google/protobuf/util/internal/json_escaping.h
@@ -86,6 +86,6 @@
 }  // namespace converter
 }  // namespace util
 }  // namespace protobuf
-}  // namespace google
 
 #endif  // NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_
+}  // namespace google
diff --git a/src/google/protobuf/util/internal/json_objectwriter.cc b/src/google/protobuf/util/internal/json_objectwriter.cc
index 6e4edd8..b84210c 100644
--- a/src/google/protobuf/util/internal/json_objectwriter.cc
+++ b/src/google/protobuf/util/internal/json_objectwriter.cc
@@ -147,7 +147,7 @@
   string base64;
 
   if (use_websafe_base64_for_bytes_)
-    WebSafeBase64EscapeWithPadding(value.ToString(), &base64);
+    WebSafeBase64Escape(value.ToString(), &base64);
   else
     Base64Escape(value, &base64);
 
@@ -164,32 +164,19 @@
   return RenderSimple(name, "null");
 }
 
-JsonObjectWriter* JsonObjectWriter::RenderNullAsEmpty(StringPiece name) {
-  return RenderSimple(name, "");
-}
-
 void JsonObjectWriter::WritePrefix(StringPiece name) {
   bool not_first = !element()->is_first();
   if (not_first) WriteChar(',');
   if (not_first || !element()->is_root()) NewLine();
-  bool empty_key_ok = GetAndResetEmptyKeyOk();
-  if (!name.empty() || empty_key_ok) {
+  if (!name.empty()) {
     WriteChar('"');
-    if (!name.empty()) {
-      ArrayByteSource source(name);
-      JsonEscaping::Escape(&source, &sink_);
-    }
+    ArrayByteSource source(name);
+    JsonEscaping::Escape(&source, &sink_);
     stream_->WriteString("\":");
     if (!indent_string_.empty()) WriteChar(' ');
   }
 }
 
-bool JsonObjectWriter::GetAndResetEmptyKeyOk() {
-  bool retval = empty_name_ok_for_next_key_;
-  empty_name_ok_for_next_key_ = false;
-  return retval;
-}
-
 }  // namespace converter
 }  // namespace util
 }  // namespace protobuf
diff --git a/src/google/protobuf/util/internal/json_objectwriter.h b/src/google/protobuf/util/internal/json_objectwriter.h
index 31edc29..cb7e2fb 100644
--- a/src/google/protobuf/util/internal/json_objectwriter.h
+++ b/src/google/protobuf/util/internal/json_objectwriter.h
@@ -93,8 +93,7 @@
         stream_(out),
         sink_(out),
         indent_string_(indent_string.ToString()),
-        use_websafe_base64_for_bytes_(false),
-        empty_name_ok_for_next_key_(false) {}
+        use_websafe_base64_for_bytes_(false) {}
   virtual ~JsonObjectWriter();
 
   // ObjectWriter methods.
@@ -112,19 +111,11 @@
   virtual JsonObjectWriter* RenderString(StringPiece name, StringPiece value);
   virtual JsonObjectWriter* RenderBytes(StringPiece name, StringPiece value);
   virtual JsonObjectWriter* RenderNull(StringPiece name);
-  virtual JsonObjectWriter* RenderNullAsEmpty(StringPiece name);
 
   void set_use_websafe_base64_for_bytes(bool value) {
     use_websafe_base64_for_bytes_ = value;
   }
 
-  // Whether empty strings should be rendered for the next JSON key. This
-  // setting is only valid until the next key is rendered, after which it gets
-  // reset to false.
-  virtual void empty_name_ok_for_next_key() {
-    empty_name_ok_for_next_key_ = true;
-  }
-
  protected:
   class LIBPROTOBUF_EXPORT Element : public BaseElement {
    public:
@@ -204,10 +195,6 @@
   // Writes an individual character to the output.
   void WriteChar(const char c) { stream_->WriteRaw(&c, sizeof(c)); }
 
-  // Returns the current value of empty_name_ok_for_next_key_ and resets it to
-  // false.
-  bool GetAndResetEmptyKeyOk();
-
   google::protobuf::scoped_ptr<Element> element_;
   google::protobuf::io::CodedOutputStream* stream_;
   ByteSinkWrapper sink_;
@@ -217,11 +204,6 @@
   // to regular base64 encoding.
   bool use_websafe_base64_for_bytes_;
 
-  // Whether empty strings should be rendered for the next JSON key. This
-  // setting is only valid until the next key is rendered, after which it gets
-  // reset to false.
-  bool empty_name_ok_for_next_key_;
-
   GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonObjectWriter);
 };
 
diff --git a/src/google/protobuf/util/internal/json_objectwriter_test.cc b/src/google/protobuf/util/internal/json_objectwriter_test.cc
index bbd9d78..b87b06a 100644
--- a/src/google/protobuf/util/internal/json_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/json_objectwriter_test.cc
@@ -299,11 +299,11 @@
   ow_ = new JsonObjectWriter("", out_stream_);
   ow_->set_use_websafe_base64_for_bytes(true);
   ow_->StartObject("")
-      ->RenderBytes("bytes", "\x03\xef\xc0\x10")
+      ->RenderBytes("bytes", "\x03\xef\xc0")
       ->EndObject();
 
   // Test that we get websafe base64 encoding when explicitly asked.
-  EXPECT_EQ("{\"bytes\":\"A-_AEA==\"}",
+  EXPECT_EQ("{\"bytes\":\"A-_A\"}",
             output_.substr(0, out_stream_->ByteCount()));
 }
 
diff --git a/src/google/protobuf/util/internal/json_stream_parser.cc b/src/google/protobuf/util/internal/json_stream_parser.cc
index 2ada358..39be7b0 100644
--- a/src/google/protobuf/util/internal/json_stream_parser.cc
+++ b/src/google/protobuf/util/internal/json_stream_parser.cc
@@ -45,8 +45,6 @@
 #include <google/protobuf/util/internal/object_writer.h>
 #include <google/protobuf/util/internal/json_escaping.h>
 #include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/mathlimits.h>
-
 
 namespace google {
 namespace protobuf {
@@ -56,7 +54,6 @@
 // this file.
 using util::Status;
 namespace error {
-using util::error::CANCELLED;
 using util::error::INTERNAL;
 using util::error::INVALID_ARGUMENT;
 }  // namespace error
@@ -110,9 +107,7 @@
       parsed_storage_(),
       string_open_(0),
       chunk_storage_(),
-      coerce_to_utf8_(false),
-      allow_empty_null_(false),
-      loose_float_number_conversion_(false) {
+      coerce_to_utf8_(false) {
   // Initialize the stack with a single value to be parsed.
   stack_.push(VALUE);
 }
@@ -130,7 +125,7 @@
     // Don't point chunk to leftover_ because leftover_ will be updated in
     // ParseChunk(chunk).
     chunk_storage_.swap(leftover_);
-    StrAppend(&chunk_storage_, json);
+    json.AppendToString(&chunk_storage_);
     chunk = StringPiece(chunk_storage_);
   }
 
@@ -141,11 +136,11 @@
 
     // Any leftover characters are stashed in leftover_ for later parsing when
     // there is more data available.
-    StrAppend(&leftover_, chunk.substr(n));
+    chunk.substr(n).AppendToString(&leftover_);
     return status;
   } else {
-    leftover_.assign(chunk.data(), chunk.size());
-    return util::Status();
+    chunk.CopyToString(&leftover_);
+    return util::Status::OK;
   }
 }
 
@@ -153,7 +148,7 @@
   // If we do not expect anything and there is nothing left to parse we're all
   // done.
   if (stack_.empty() && leftover_.empty()) {
-    return util::Status();
+    return util::Status::OK;
   }
 
   // Storage for UTF8-coerced string.
@@ -184,7 +179,7 @@
 
 util::Status JsonStreamParser::ParseChunk(StringPiece chunk) {
   // Do not do any work if the chunk is empty.
-  if (chunk.empty()) return util::Status();
+  if (chunk.empty()) return util::Status::OK;
 
   p_ = json_ = chunk;
 
@@ -206,7 +201,7 @@
     // unparsed data left, we save it for later parse.
     leftover_ = p_.ToString();
   }
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::RunParser() {
@@ -247,20 +242,20 @@
     }
     if (!result.ok()) {
       // If we were cancelled, save our state and try again later.
-      if (!finishing_ && result == util::Status(error::CANCELLED, "")) {
+      if (!finishing_ && result == util::Status::CANCELLED) {
         stack_.push(type);
         // If we have a key we still need to render, make sure to save off the
         // contents in our own storage.
         if (!key_.empty() && key_storage_.empty()) {
-          StrAppend(&key_storage_, key_);
+          key_.AppendToString(&key_storage_);
           key_ = StringPiece(key_storage_);
         }
-        result = util::Status();
+        result = util::Status::OK;
       }
       return result;
     }
   }
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ParseValue(TokenType type) {
@@ -282,16 +277,12 @@
     case UNKNOWN:
       return ReportUnknown("Expected a value.");
     default: {
-      if (allow_empty_null_ && IsEmptyNullAllowed(type)) {
-        return ParseEmptyNull();
-      }
-
       // Special case for having been cut off while parsing, wait for more data.
       // This handles things like 'fals' being at the end of the string, we
       // don't know if the next char would be e, completing it, or something
       // else, making it invalid.
       if (!finishing_ && p_.length() < false_len) {
-        return util::Status(error::CANCELLED, "");
+        return util::Status::CANCELLED;
       }
       return ReportFailure("Unexpected token.");
     }
@@ -302,8 +293,8 @@
   util::Status result = ParseStringHelper();
   if (result.ok()) {
     ow_->RenderString(key_, parsed_);
-    key_ = StringPiece();
-    parsed_ = StringPiece();
+    key_.clear();
+    parsed_.clear();
     parsed_storage_.clear();
   }
   return result;
@@ -324,12 +315,13 @@
       // We're about to handle an escape, copy all bytes from last to data.
       if (last < data) {
         parsed_storage_.append(last, data - last);
+        last = data;
       }
       // If we ran out of string after the \, cancel or report an error
       // depending on if we expect more data later.
       if (p_.length() == 1) {
         if (!finishing_) {
-          return util::Status(error::CANCELLED, "");
+          return util::Status::CANCELLED;
         }
         return ReportFailure("Closing quote expected in string.");
       }
@@ -379,6 +371,7 @@
       } else {
         if (last < data) {
           parsed_storage_.append(last, data - last);
+          last = data;
         }
         parsed_ = StringPiece(parsed_storage_);
       }
@@ -386,7 +379,7 @@
       // start fresh.
       string_open_ = 0;
       Advance();
-      return util::Status();
+      return util::Status::OK;
     }
     // Normal character, just advance past it.
     Advance();
@@ -397,7 +390,7 @@
   }
   // If we didn't find the closing quote but we expect more data, cancel for now
   if (!finishing_) {
-    return util::Status(error::CANCELLED, "");
+    return util::Status::CANCELLED;
   }
   // End of string reached without a closing quote, report an error.
   string_open_ = 0;
@@ -414,7 +407,7 @@
 util::Status JsonStreamParser::ParseUnicodeEscape() {
   if (p_.length() < kUnicodeEscapedLength) {
     if (!finishing_) {
-      return util::Status(error::CANCELLED, "");
+      return util::Status::CANCELLED;
     }
     return ReportFailure("Illegal hex string.");
   }
@@ -431,7 +424,7 @@
       code <= JsonEscaping::kMaxHighSurrogate) {
     if (p_.length() < 2 * kUnicodeEscapedLength) {
       if (!finishing_) {
-        return util::Status(error::CANCELLED, "");
+        return util::Status::CANCELLED;
       }
       if (!coerce_to_utf8_) {
         return ReportFailure("Missing low surrogate.");
@@ -468,7 +461,7 @@
   // Advance past the [final] code unit escape.
   p_.remove_prefix(kUnicodeEscapedLength);
   parsed_storage_.append(buf, len);
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ParseNumber() {
@@ -478,17 +471,17 @@
     switch (number.type) {
       case NumberResult::DOUBLE:
         ow_->RenderDouble(key_, number.double_val);
-        key_ = StringPiece();
+        key_.clear();
         break;
 
       case NumberResult::INT:
         ow_->RenderInt64(key_, number.int_val);
-        key_ = StringPiece();
+        key_.clear();
         break;
 
       case NumberResult::UINT:
         ow_->RenderUint64(key_, number.uint_val);
-        key_ = StringPiece();
+        key_.clear();
         break;
 
       default:
@@ -498,19 +491,6 @@
   return result;
 }
 
-util::Status JsonStreamParser::ParseDoubleHelper(
-    const string& number, NumberResult* result) {
-  if (!safe_strtod(number, &result->double_val)) {
-    return ReportFailure("Unable to parse number.");
-  }
-  if (!loose_float_number_conversion_ &&
-      !MathLimits<double>::IsFinite(result->double_val)) {
-    return ReportFailure("Number exceeds the range of double.");
-  }
-  result->type = NumberResult::DOUBLE;
-  return util::Status();
-}
-
 util::Status JsonStreamParser::ParseNumberHelper(NumberResult* result) {
   const char* data = p_.data();
   int length = p_.length();
@@ -538,7 +518,7 @@
   // If the entire input is a valid number, and we may have more content in the
   // future, we abort for now and resume when we know more.
   if (index == length && !finishing_) {
-    return util::Status(error::CANCELLED, "");
+    return util::Status::CANCELLED;
   }
 
   // Create a string containing just the number, so we can use safe_strtoX
@@ -546,11 +526,12 @@
 
   // Floating point number, parse as a double.
   if (floating) {
-    util::Status status = ParseDoubleHelper(number, result);
-    if (status.ok()) {
-      p_.remove_prefix(index);
+    if (!safe_strtod(number, &result->double_val)) {
+      return ReportFailure("Unable to parse number.");
     }
-    return status;
+    result->type = NumberResult::DOUBLE;
+    p_.remove_prefix(index);
+    return util::Status::OK;
   }
 
   // Positive non-floating point number, parse as a uint64.
@@ -559,18 +540,12 @@
     if (number.length() >= 2 && number[0] == '0') {
       return ReportFailure("Octal/hex numbers are not valid JSON values.");
     }
-    if (safe_strtou64(number, &result->uint_val)) {
-      result->type = NumberResult::UINT;
-      p_.remove_prefix(index);
-      return util::Status();
-    } else {
-      // If the value is too large, parse it as double.
-      util::Status status = ParseDoubleHelper(number, result);
-      if (status.ok()) {
-        p_.remove_prefix(index);
-      }
-      return status;
+    if (!safe_strtou64(number, &result->uint_val)) {
+      return ReportFailure("Unable to parse number.");
     }
+    result->type = NumberResult::UINT;
+    p_.remove_prefix(index);
+    return util::Status::OK;
   }
 
   // Octal/Hex numbers are not valid JSON values.
@@ -578,27 +553,21 @@
     return ReportFailure("Octal/hex numbers are not valid JSON values.");
   }
   // Negative non-floating point number, parse as an int64.
-  if (safe_strto64(number, &result->int_val)) {
-    result->type = NumberResult::INT;
-    p_.remove_prefix(index);
-    return util::Status();
-  } else {
-    // If the value is too large, parse it as double.
-    util::Status status = ParseDoubleHelper(number, result);
-    if (status.ok()) {
-      p_.remove_prefix(index);
-    }
-    return status;
+  if (!safe_strto64(number, &result->int_val)) {
+    return ReportFailure("Unable to parse number.");
   }
+  result->type = NumberResult::INT;
+  p_.remove_prefix(index);
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::HandleBeginObject() {
   GOOGLE_DCHECK_EQ('{', *p_.data());
   Advance();
   ow_->StartObject(key_);
-  key_ = StringPiece();
+  key_.clear();
   stack_.push(ENTRY);
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ParseObjectMid(TokenType type) {
@@ -610,13 +579,13 @@
   if (type == END_OBJECT) {
     Advance();
     ow_->EndObject();
-    return util::Status();
+    return util::Status::OK;
   }
   // Found a comma, advance past it and get ready for an entry.
   if (type == VALUE_SEPARATOR) {
     Advance();
     stack_.push(ENTRY);
-    return util::Status();
+    return util::Status::OK;
   }
   // Illegal token after key:value pair.
   return ReportFailure("Expected , or } after key:value pair.");
@@ -631,7 +600,7 @@
   if (type == END_OBJECT) {
     ow_->EndObject();
     Advance();
-    return util::Status();
+    return util::Status::OK;
   }
 
   util::Status result;
@@ -646,7 +615,7 @@
       } else {
         key_ = parsed_;
       }
-      parsed_ = StringPiece();
+      parsed_.clear();
     }
   } else if (type == BEGIN_KEY) {
     // Key is a bare key (back compat), create a StringPiece pointing to it.
@@ -670,7 +639,7 @@
   if (type == ENTRY_SEPARATOR) {
     Advance();
     stack_.push(VALUE);
-    return util::Status();
+    return util::Status::OK;
   }
   return ReportFailure("Expected : between key:value pair.");
 }
@@ -679,9 +648,9 @@
   GOOGLE_DCHECK_EQ('[', *p_.data());
   Advance();
   ow_->StartList(key_);
-  key_ = StringPiece();
+  key_.clear();
   stack_.push(ARRAY_VALUE);
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ParseArrayValue(TokenType type) {
@@ -692,15 +661,14 @@
   if (type == END_ARRAY) {
     ow_->EndList();
     Advance();
-    return util::Status();
+    return util::Status::OK;
   }
 
   // The ParseValue call may push something onto the stack so we need to make
-  // sure an ARRAY_MID is after it, so we push it on now. Also, the parsing of
-  // empty-null array value is relying on this ARRAY_MID token.
+  // sure an ARRAY_MID is after it, so we push it on now.
   stack_.push(ARRAY_MID);
   util::Status result = ParseValue(type);
-  if (result == util::Status(error::CANCELLED, "")) {
+  if (result == util::Status::CANCELLED) {
     // If we were cancelled, pop back off the ARRAY_MID so we don't try to
     // push it on again when we try over.
     stack_.pop();
@@ -716,14 +684,14 @@
   if (type == END_ARRAY) {
     ow_->EndList();
     Advance();
-    return util::Status();
+    return util::Status::OK;
   }
 
   // Found a comma, advance past it and expect an array value next.
   if (type == VALUE_SEPARATOR) {
     Advance();
     stack_.push(ARRAY_VALUE);
-    return util::Status();
+    return util::Status::OK;
   }
   // Illegal token after array value.
   return ReportFailure("Expected , or ] after array value.");
@@ -731,35 +699,23 @@
 
 util::Status JsonStreamParser::ParseTrue() {
   ow_->RenderBool(key_, true);
-  key_ = StringPiece();
+  key_.clear();
   p_.remove_prefix(true_len);
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ParseFalse() {
   ow_->RenderBool(key_, false);
-  key_ = StringPiece();
+  key_.clear();
   p_.remove_prefix(false_len);
-  return util::Status();
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ParseNull() {
   ow_->RenderNull(key_);
-  key_ = StringPiece();
+  key_.clear();
   p_.remove_prefix(null_len);
-  return util::Status();
-}
-
-util::Status JsonStreamParser::ParseEmptyNull() {
-  ow_->RenderNull(key_);
-  key_ = StringPiece();
-  return util::Status();
-}
-
-bool JsonStreamParser::IsEmptyNullAllowed(TokenType type) {
-  if (stack_.empty()) return false;
-  return (stack_.top() == ARRAY_MID && type == VALUE_SEPARATOR) ||
-         stack_.top() == OBJ_MID;
+  return util::Status::OK;
 }
 
 util::Status JsonStreamParser::ReportFailure(StringPiece message) {
@@ -779,7 +735,7 @@
 util::Status JsonStreamParser::ReportUnknown(StringPiece message) {
   // If we aren't finishing the parse, cancel parsing and try later.
   if (!finishing_) {
-    return util::Status(error::CANCELLED, "");
+    return util::Status::CANCELLED;
   }
   if (p_.empty()) {
     return ReportFailure(StrCat("Unexpected end of string. ", message));
@@ -809,11 +765,11 @@
   // we can't know if the key was complete or not.
   if (!finishing_ && p_.empty()) {
     p_ = original;
-    return util::Status(error::CANCELLED, "");
+    return util::Status::CANCELLED;
   }
   // Since we aren't using the key storage, clear it out.
   key_storage_.clear();
-  return util::Status();
+  return util::Status::OK;
 }
 
 JsonStreamParser::TokenType JsonStreamParser::GetNextTokenType() {
diff --git a/src/google/protobuf/util/internal/json_stream_parser.h b/src/google/protobuf/util/internal/json_stream_parser.h
index 31933b6..0278c28 100644
--- a/src/google/protobuf/util/internal/json_stream_parser.h
+++ b/src/google/protobuf/util/internal/json_stream_parser.h
@@ -154,9 +154,6 @@
   // component.
   util::Status ParseNumberHelper(NumberResult* result);
 
-  // Parse a number as double into a NumberResult.
-  util::Status ParseDoubleHelper(const string& number, NumberResult* result);
-
   // Handles a { during parsing of a value.
   util::Status HandleBeginObject();
 
@@ -182,10 +179,6 @@
   util::Status ParseTrue();
   util::Status ParseFalse();
   util::Status ParseNull();
-  util::Status ParseEmptyNull();
-
-  // Whether an empty-null is allowed in the current state.
-  bool IsEmptyNullAllowed(TokenType type);
 
   // Report a failure as a util::Status.
   util::Status ReportFailure(StringPiece message);
@@ -254,13 +247,6 @@
   // Whether to allow non UTF-8 encoded input and replace invalid code points.
   bool coerce_to_utf8_;
 
-  // Whether allows empty string represented null array value or object entry
-  // value.
-  bool allow_empty_null_;
-
-  // Whether allows out-of-range floating point numbers or reject them.
-  bool loose_float_number_conversion_;
-
   GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonStreamParser);
 };
 
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 a11e9be..059ea6d 100644
--- a/src/google/protobuf/util/internal/json_stream_parser_test.cc
+++ b/src/google/protobuf/util/internal/json_stream_parser_test.cc
@@ -81,16 +81,12 @@
 // For each test we split the input string on every possible character to ensure
 // the parser is able to handle arbitrarily split input for all cases. We also
 // do a final test of the entire test case one character at a time.
-//
-// It is verified that expected calls to the mocked objects are in sequence.
 class JsonStreamParserTest : public ::testing::Test {
  protected:
   JsonStreamParserTest() : mock_(), ow_(&mock_) {}
   virtual ~JsonStreamParserTest() {}
 
-  util::Status RunTest(StringPiece json, int split, bool coerce_utf8 = false,
-                       bool allow_empty_null = false,
-                       bool loose_float_number_conversion = false) {
+  util::Status RunTest(StringPiece json, int split, bool coerce_utf8 = false) {
     JsonStreamParser parser(&mock_);
 
     // Special case for split == length, test parsing one character at a time.
@@ -120,11 +116,8 @@
     return result;
   }
 
-  void DoTest(StringPiece json, int split, bool coerce_utf8 = false,
-              bool allow_empty_null = false,
-              bool loose_float_number_conversion = false) {
-    util::Status result = RunTest(json, split, coerce_utf8, allow_empty_null,
-                                  loose_float_number_conversion);
+  void DoTest(StringPiece json, int split, bool coerce_utf8 = false) {
+    util::Status result = RunTest(json, split, coerce_utf8);
     if (!result.ok()) {
       GOOGLE_LOG(WARNING) << result;
     }
@@ -132,21 +125,14 @@
   }
 
   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);
+                   bool coerce_utf8 = false) {
+    util::Status result = RunTest(json, split, coerce_utf8);
     EXPECT_EQ(util::error::INVALID_ARGUMENT, result.error_code());
     StringPiece error_message(result.error_message());
     EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
   }
 
 
-#ifndef _MSC_VER
-  // TODO(xiaofeng): We have to disable InSequence check for MSVC because it
-  // causes stack overflow due to its use of a linked list that is desctructed
-  // recursively.
-  ::testing::InSequence in_sequence_;
-#endif  // !_MSC_VER
   MockObjectWriter mock_;
   ExpectingObjectWriter ow_;
 };
@@ -322,27 +308,18 @@
   }
 }
 
-// - array containing primitive values (true, false, null, num, string)
-TEST_F(JsonStreamParserTest, ArrayPrimitiveValues) {
-  StringPiece str = "[true, false, null, 'one', \"two\"]";
+// - array containing array, object, values (true, false, null, num, string)
+TEST_F(JsonStreamParserTest, ArrayValues) {
+  StringPiece str =
+      "[true, false, null, 'a string', \"another string\", [22, -127, 45.3, "
+      "-1056.4, 11779497823553162765], {'key': true}]";
   for (int i = 0; i <= str.length(); ++i) {
     ow_.StartList("")
         ->RenderBool("", true)
         ->RenderBool("", false)
         ->RenderNull("")
-        ->RenderString("", "one")
-        ->RenderString("", "two")
-        ->EndList();
-    DoTest(str, i);
-  }
-}
-
-// - array containing array, object
-TEST_F(JsonStreamParserTest, ArrayComplexValues) {
-  StringPiece str =
-      "[[22, -127, 45.3, -1056.4, 11779497823553162765], {'key': true}]";
-  for (int i = 0; i <= str.length(); ++i) {
-    ow_.StartList("")
+        ->RenderString("", "a string")
+        ->RenderString("", "another string")
         ->StartList("")
         ->RenderUint64("", 22)
         ->RenderInt64("", -127)
@@ -358,7 +335,6 @@
   }
 }
 
-
 // - object containing array, object, value (true, false, null, num, string)
 TEST_F(JsonStreamParserTest, ObjectValues) {
   StringPiece str =
@@ -694,35 +670,34 @@
   }
 }
 
-TEST_F(JsonStreamParserTest, PositiveNumberTooBigIsDouble) {
-  StringPiece str = "18446744073709551616";  // 2^64
+// numbers too large
+TEST_F(JsonStreamParserTest, PositiveNumberTooBig) {
+  StringPiece str = "[18446744073709551616]";  // 2^64
   for (int i = 0; i <= str.length(); ++i) {
-    ow_.RenderDouble("", 18446744073709552000.0);
-    DoTest(str, i);
+    ow_.StartList("");
+    DoErrorTest(str, i, "Unable to parse number.");
   }
 }
 
-TEST_F(JsonStreamParserTest, NegativeNumberTooBigIsDouble) {
-  StringPiece str = "-18446744073709551616";
+TEST_F(JsonStreamParserTest, NegativeNumberTooBig) {
+  StringPiece str = "[-18446744073709551616]";
   for (int i = 0; i <= str.length(); ++i) {
-    ow_.RenderDouble("", -18446744073709551616.0);
-    DoTest(str, i);
+    ow_.StartList("");
+    DoErrorTest(str, i, "Unable to parse number.");
   }
 }
 
+/*
+TODO(sven): Fail parsing when parsing a double that is too large.
+
 TEST_F(JsonStreamParserTest, DoubleTooBig) {
-  StringPiece str = "[1.89769e+308]";
+  StringPiece str = "[184464073709551232321616.45]";
   for (int i = 0; i <= str.length(); ++i) {
     ow_.StartList("");
-    DoErrorTest(str, i, "Number exceeds the range of double.");
-  }
-  str = "[-1.89769e+308]";
-  for (int i = 0; i <= str.length(); ++i) {
-    ow_.StartList("");
-    DoErrorTest(str, i, "Number exceeds the range of double.");
+    DoErrorTest(str, i, "Unable to parse number");
   }
 }
-
+*/
 
 // invalid bare backslash.
 TEST_F(JsonStreamParserTest, UnfinishedEscape) {
diff --git a/src/google/protobuf/util/internal/object_writer.h b/src/google/protobuf/util/internal/object_writer.h
index b6fbd19..9f07363 100644
--- a/src/google/protobuf/util/internal/object_writer.h
+++ b/src/google/protobuf/util/internal/object_writer.h
@@ -101,7 +101,6 @@
   // Renders a Null value.
   virtual ObjectWriter* RenderNull(StringPiece name) = 0;
 
-
   // Renders a DataPiece object to a ObjectWriter.
   static void RenderDataPieceTo(const DataPiece& data, StringPiece name,
                                 ObjectWriter* ow);
@@ -119,13 +118,6 @@
     return use_strict_base64_decoding_;
   }
 
-  // Whether empty strings should be rendered for the next name for Start/Render
-  // calls. This setting is only valid until the next key is rendered, after
-  // which it gets reset.
-  // It is up to the derived classes to interpret this and render accordingly.
-  // Default implementation ignores this setting.
-  virtual void empty_name_ok_for_next_key() {}
-
  protected:
   ObjectWriter() : use_strict_base64_decoding_(true) {}
 
diff --git a/src/google/protobuf/util/internal/proto_writer.cc b/src/google/protobuf/util/internal/proto_writer.cc
index 8bebf2a..36b7941 100644
--- a/src/google/protobuf/util/internal/proto_writer.cc
+++ b/src/google/protobuf/util/internal/proto_writer.cc
@@ -64,8 +64,6 @@
       typeinfo_(TypeInfo::NewTypeInfo(type_resolver)),
       own_typeinfo_(true),
       done_(false),
-      ignore_unknown_fields_(false),
-      use_lower_camel_for_enums_(false),
       element_(NULL),
       size_insert_(),
       output_(output),
@@ -83,8 +81,6 @@
       typeinfo_(typeinfo),
       own_typeinfo_(false),
       done_(false),
-      ignore_unknown_fields_(false),
-      use_lower_camel_for_enums_(false),
       element_(NULL),
       size_insert_(),
       output_(output),
@@ -266,9 +262,8 @@
 // Writes an ENUM field, including tag, to the stream.
 inline Status WriteEnum(int field_number, const DataPiece& data,
                         const google::protobuf::Enum* enum_type,
-                        CodedOutputStream* stream,
-                        bool use_lower_camel_for_enums) {
-  StatusOr<int> e = data.ToEnum(enum_type, use_lower_camel_for_enums);
+                        CodedOutputStream* stream) {
+  StatusOr<int> e = data.ToEnum(enum_type);
   if (e.ok()) {
     WireFormatLite::WriteEnum(field_number, e.ValueOrDie(), stream);
   }
@@ -298,16 +293,10 @@
       ow_(enclosing),
       parent_field_(NULL),
       typeinfo_(typeinfo),
-      proto3_(type.syntax() == google::protobuf::SYNTAX_PROTO3),
       type_(type),
+      required_fields_(GetRequiredFields(type)),
       size_index_(-1),
-      array_index_(-1),
-      // oneof_indices_ values are 1-indexed (0 means not present).
-      oneof_indices_(type.oneofs_size() + 1) {
-  if (!proto3_) {
-    required_fields_ = GetRequiredFields(type_);
-  }
-}
+      array_index_(-1) {}
 
 ProtoWriter::ProtoElement::ProtoElement(ProtoWriter::ProtoElement* parent,
                                         const google::protobuf::Field* field,
@@ -317,28 +306,22 @@
       ow_(this->parent()->ow_),
       parent_field_(field),
       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),
-      array_index_(is_list ? 0 : -1),
-      // oneof_indices_ values are 1-indexed (0 means not present).
-      oneof_indices_(type_.oneofs_size() + 1) {
+      array_index_(is_list ? 0 : -1) {
   if (!is_list) {
     if (ow_->IsRepeated(*field)) {
       // Update array_index_ if it is an explicit list.
       if (this->parent()->array_index_ >= 0) this->parent()->array_index_++;
-    } else if (!proto3_) {
-      // For required fields tracking.
+    } else {
       this->parent()->RegisterField(field);
     }
 
     if (field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) {
-      if (!proto3_) {
-        required_fields_ = GetRequiredFields(type_);
-      }
+      required_fields_ = GetRequiredFields(type_);
       int start_pos = ow_->stream_->ByteCount();
       // length of serialized message is the final buffer position minus
       // starting buffer position, plus length adjustments for size fields
@@ -351,14 +334,12 @@
 }
 
 ProtoWriter::ProtoElement* ProtoWriter::ProtoElement::pop() {
-  if (!proto3_) {
-    // Calls the registered error listener for any required field(s) not yet
-    // seen.
-    for (std::set<const google::protobuf::Field*>::iterator it =
-             required_fields_.begin();
-         it != required_fields_.end(); ++it) {
-      ow_->MissingField((*it)->name());
-    }
+  // Calls the registered error listener for any required field(s) not yet
+  // seen.
+  for (set<const google::protobuf::Field*>::iterator it =
+           required_fields_.begin();
+       it != required_fields_.end(); ++it) {
+    ow_->MissingField((*it)->name());
   }
   // Computes the total number of proto bytes used by a message, also adjusts
   // the size of all parent messages by the length of this size field.
@@ -418,11 +399,11 @@
 }
 
 bool ProtoWriter::ProtoElement::IsOneofIndexTaken(int32 index) {
-  return oneof_indices_[index];
+  return ContainsKey(oneof_indices_, index);
 }
 
 void ProtoWriter::ProtoElement::TakeOneofIndex(int32 index) {
-  oneof_indices_[index] = true;
+  InsertIfNotPresent(&oneof_indices_, index);
 }
 
 void ProtoWriter::InvalidName(StringPiece unknown_name, StringPiece message) {
@@ -580,19 +561,10 @@
 
   // Pushing a ProtoElement and then pop it off at the end for 2 purposes:
   // error location reporting and required field accounting.
-  //
-  // For proto3, since there is no required field tracking, we only need to push
-  // ProtoElement for error cases.
-  if (!element_->proto3()) {
-    element_.reset(new ProtoElement(element_.release(), &field, type, false));
-  }
+  element_.reset(new ProtoElement(element_.release(), &field, type, false));
 
   if (field.kind() == google::protobuf::Field_Kind_TYPE_UNKNOWN ||
       field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) {
-    // Push a ProtoElement for location reporting purposes.
-    if (element_->proto3()) {
-      element_.reset(new ProtoElement(element_.release(), &field, type, false));
-    }
     InvalidValue(field.type_url().empty()
                      ? google::protobuf::Field_Kind_Name(field.kind())
                      : field.type_url(),
@@ -665,7 +637,7 @@
     case google::protobuf::Field_Kind_TYPE_ENUM: {
       status = WriteEnum(field.number(), data,
                          typeinfo_->GetEnumByTypeUrl(field.type_url()),
-                         stream_.get(), use_lower_camel_for_enums_);
+                         stream_.get());
       break;
     }
     default:  // TYPE_GROUP or TYPE_MESSAGE
@@ -673,18 +645,11 @@
   }
 
   if (!status.ok()) {
-    // Push a ProtoElement for location reporting purposes.
-    if (element_->proto3()) {
-      element_.reset(new ProtoElement(element_.release(), &field, type, false));
-    }
     InvalidValue(google::protobuf::Field_Kind_Name(field.kind()),
                  status.error_message());
-    element_.reset(element()->pop());
-    return this;
   }
 
-  if (!element_->proto3()) element_.reset(element()->pop());
-
+  element_.reset(element()->pop());
   return this;
 }
 
@@ -727,9 +692,7 @@
   }
   const google::protobuf::Field* field =
       typeinfo_->FindField(&e->type(), unnormalized_name);
-  if (field == NULL && !ignore_unknown_fields_) {
-    InvalidName(unnormalized_name, "Cannot find field.");
-  }
+  if (field == NULL) InvalidName(unnormalized_name, "Cannot find field.");
   return field;
 }
 
diff --git a/src/google/protobuf/util/internal/proto_writer.h b/src/google/protobuf/util/internal/proto_writer.h
index 0db8485..957565e 100644
--- a/src/google/protobuf/util/internal/proto_writer.h
+++ b/src/google/protobuf/util/internal/proto_writer.h
@@ -32,8 +32,8 @@
 #define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__
 
 #include <deque>
+#include <google/protobuf/stubs/hash.h>
 #include <string>
-#include <vector>
 
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/io/coded_stream.h>
@@ -45,7 +45,6 @@
 #include <google/protobuf/util/internal/structured_objectwriter.h>
 #include <google/protobuf/util/type_resolver.h>
 #include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/hash.h>
 
 namespace google {
 namespace protobuf {
@@ -81,32 +80,32 @@
   virtual ~ProtoWriter();
 
   // ObjectWriter methods.
-  ProtoWriter* StartObject(StringPiece name);
-  ProtoWriter* EndObject();
-  ProtoWriter* StartList(StringPiece name);
-  ProtoWriter* EndList();
-  ProtoWriter* RenderBool(StringPiece name, bool value) {
+  virtual ProtoWriter* StartObject(StringPiece name);
+  virtual ProtoWriter* EndObject();
+  virtual ProtoWriter* StartList(StringPiece name);
+  virtual ProtoWriter* EndList();
+  virtual ProtoWriter* RenderBool(StringPiece name, bool value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderInt32(StringPiece name, int32 value) {
+  virtual ProtoWriter* RenderInt32(StringPiece name, int32 value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderUint32(StringPiece name, uint32 value) {
+  virtual ProtoWriter* RenderUint32(StringPiece name, uint32 value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderInt64(StringPiece name, int64 value) {
+  virtual ProtoWriter* RenderInt64(StringPiece name, int64 value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderUint64(StringPiece name, uint64 value) {
+  virtual ProtoWriter* RenderUint64(StringPiece name, uint64 value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderDouble(StringPiece name, double value) {
+  virtual ProtoWriter* RenderDouble(StringPiece name, double value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderFloat(StringPiece name, float value) {
+  virtual ProtoWriter* RenderFloat(StringPiece name, float value) {
     return RenderDataPiece(name, DataPiece(value));
   }
-  ProtoWriter* RenderString(StringPiece name, StringPiece value) {
+  virtual ProtoWriter* RenderString(StringPiece name, StringPiece value) {
     return RenderDataPiece(name,
                            DataPiece(value, use_strict_base64_decoding()));
   }
@@ -114,11 +113,10 @@
     return RenderDataPiece(
         name, DataPiece(value, false, use_strict_base64_decoding()));
   }
-  ProtoWriter* RenderNull(StringPiece name) {
+  virtual ProtoWriter* RenderNull(StringPiece name) {
     return RenderDataPiece(name, DataPiece::NullData());
   }
 
-
   // Renders a DataPiece 'value' into a field whose wire type is determined
   // from the given field 'name'.
   virtual ProtoWriter* RenderDataPiece(StringPiece name,
@@ -144,14 +142,6 @@
 
   const TypeInfo* typeinfo() { return typeinfo_; }
 
-  void set_ignore_unknown_fields(bool ignore_unknown_fields) {
-    ignore_unknown_fields_ = ignore_unknown_fields;
-  }
-
-  void set_use_lower_camel_for_enums(bool use_lower_camel_for_enums) {
-    use_lower_camel_for_enums_ = use_lower_camel_for_enums;
-  }
-
  protected:
   class LIBPROTOBUF_EXPORT ProtoElement : public BaseElement, public LocationTrackerInterface {
    public:
@@ -189,15 +179,13 @@
       return static_cast<ProtoElement*>(BaseElement::parent());
     }
 
-    // Returns true if the index is already taken by a preceding oneof input.
+    // Returns true if the index is already taken by a preceeding oneof input.
     bool IsOneofIndexTaken(int32 index);
 
     // Marks the oneof 'index' as taken. Future inputs to this oneof will
     // generate an error.
     void TakeOneofIndex(int32 index);
 
-    bool proto3() { return proto3_; }
-
    private:
     // Used for access to variables of the enclosing instance of
     // ProtoWriter.
@@ -210,9 +198,6 @@
     // TypeInfo to lookup types.
     const TypeInfo* typeinfo_;
 
-    // Whether the type_ is proto3 or not.
-    bool proto3_;
-
     // Additional variables if this element is a message:
     // (Root element is always a message).
     // type_             : the type of this element.
@@ -228,7 +213,7 @@
 
     // Set of oneof indices already seen for the type_. Used to validate
     // incoming messages so no more than one oneof is set.
-    std::vector<bool> oneof_indices_;
+    hash_set<int32> oneof_indices_;
 
     GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoElement);
   };
@@ -242,7 +227,7 @@
   ProtoWriter(const TypeInfo* typeinfo, const google::protobuf::Type& type,
               strings::ByteSink* output, ErrorListener* listener);
 
-  ProtoElement* element() { return element_.get(); }
+  virtual ProtoElement* element() { return element_.get(); }
 
   // Helper methods for calling ErrorListener. See error_listener.h.
   void InvalidName(StringPiece unknown_name, StringPiece message);
@@ -255,8 +240,7 @@
 
   // Lookup the field in the current element. Looks in the base descriptor
   // and in any extension. This will report an error if the field cannot be
-  // found when ignore_unknown_names_ is false or if multiple matching
-  // extensions are found.
+  // found or if multiple matching extensions are found.
   const google::protobuf::Field* Lookup(StringPiece name);
 
   // Lookup the field type in the type descriptor. Returns NULL if the type
@@ -309,13 +293,6 @@
   // Indicates whether we finished writing root message completely.
   bool done_;
 
-  // If true, don't report unknown field names to the listener.
-  bool ignore_unknown_fields_;
-
-  // If true, check if enum name in camel case or without underscore matches the
-  // field name.
-  bool use_lower_camel_for_enums_;
-
   // Variable for internal state processing:
   // element_    : the current element.
   // size_insert_: sizes of nested messages.
diff --git a/src/google/protobuf/util/internal/protostream_objectsource.cc b/src/google/protobuf/util/internal/protostream_objectsource.cc
index 02360a1..1f3781a 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource.cc
+++ b/src/google/protobuf/util/internal/protostream_objectsource.cc
@@ -85,7 +85,7 @@
     const google::protobuf::Enum& tech_enum, int number);
 
 // Utility function to format nanos.
-const string FormatNanos(uint32 nanos, bool with_trailing_zeros);
+const string FormatNanos(uint32 nanos);
 
 StatusOr<string> MapKeyDefaultValueAsString(
     const google::protobuf::Field& field) {
@@ -120,13 +120,8 @@
       own_typeinfo_(true),
       type_(type),
       use_lower_camel_for_enums_(false),
-      use_ints_for_enums_(false),
-      preserve_proto_field_names_(false),
       recursion_depth_(0),
-      max_recursion_depth_(kDefaultMaxRecursionDepth),
-      render_unknown_fields_(false),
-      render_unknown_enum_values_(true),
-      add_trailing_zeros_for_timestamp_and_duration_(false) {
+      max_recursion_depth_(kDefaultMaxRecursionDepth) {
   GOOGLE_LOG_IF(DFATAL, stream == NULL) << "Input stream is NULL.";
 }
 
@@ -138,13 +133,8 @@
       own_typeinfo_(false),
       type_(type),
       use_lower_camel_for_enums_(false),
-      use_ints_for_enums_(false),
-      preserve_proto_field_names_(false),
       recursion_depth_(0),
-      max_recursion_depth_(kDefaultMaxRecursionDepth),
-      render_unknown_fields_(false),
-      render_unknown_enum_values_(true),
-      add_trailing_zeros_for_timestamp_and_duration_(false) {
+      max_recursion_depth_(kDefaultMaxRecursionDepth) {
   GOOGLE_LOG_IF(DFATAL, stream == NULL) << "Input stream is NULL.";
 }
 
@@ -194,7 +184,6 @@
   string field_name;
   // last_tag set to dummy value that is different from tag.
   uint32 tag = stream_->ReadTag(), last_tag = tag + 1;
-  google::protobuf::UnknownFieldSet unknown_fields;
 
   if (include_start_and_end) {
     ow->StartObject(name);
@@ -204,18 +193,13 @@
       last_tag = tag;
       field = FindAndVerifyField(type, tag);
       if (field != NULL) {
-        if (preserve_proto_field_names_) {
-          field_name = field->name();
-        } else {
-          field_name = field->json_name();
-        }
+        field_name = field->json_name();
       }
     }
     if (field == NULL) {
       // If we didn't find a field, skip this unknown tag.
       // TODO(wpoon): Check return boolean value.
-      WireFormat::SkipField(stream_, tag,
-                            render_unknown_fields_ ? &unknown_fields : NULL);
+      WireFormat::SkipField(stream_, tag, NULL);
       tag = stream_->ReadTag();
       continue;
     }
@@ -237,12 +221,10 @@
       tag = stream_->ReadTag();
     }
   }
-
-
   if (include_start_and_end) {
     ow->EndObject();
   }
-  return util::Status();
+  return Status::OK;
 }
 
 StatusOr<uint32> ProtoStreamObjectSource::RenderList(
@@ -300,8 +282,6 @@
             return Status(util::error::INTERNAL, "Invalid map entry.");
           }
           ASSIGN_OR_RETURN(map_key, MapKeyDefaultValueAsString(*key_field));
-          // Key is empty, force it to render as empty (for string values).
-          ow->empty_name_ok_for_next_key();
         }
         RETURN_IF_ERROR(RenderField(field, map_key, ow));
       } else {
@@ -324,13 +304,13 @@
     RETURN_IF_ERROR(RenderField(field, StringPiece(), ow));
   }
   stream_->PopLimit(old_limit);
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderTimestamp(
     const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
     StringPiece field_name, ObjectWriter* ow) {
-  std::pair<int64, int32> p = os->ReadSecondsAndNanos(type);
+  pair<int64, int32> p = os->ReadSecondsAndNanos(type);
   int64 seconds = p.first;
   int32 nanos = p.second;
   if (seconds > kTimestampMaxSeconds || seconds < kTimestampMinSeconds) {
@@ -348,13 +328,13 @@
   ow->RenderString(field_name,
                    ::google::protobuf::internal::FormatTime(seconds, nanos));
 
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderDuration(
     const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
     StringPiece field_name, ObjectWriter* ow) {
-  std::pair<int64, int32> p = os->ReadSecondsAndNanos(type);
+  pair<int64, int32> p = os->ReadSecondsAndNanos(type);
   int64 seconds = p.first;
   int32 nanos = p.second;
   if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds) {
@@ -384,12 +364,10 @@
     sign = "-";
     nanos = -nanos;
   }
-  string formatted_duration = StringPrintf(
-      "%s%lld%ss", sign.c_str(), seconds,
-      FormatNanos(nanos, os->add_trailing_zeros_for_timestamp_and_duration_)
-          .c_str());
+  string formatted_duration = StringPrintf("%s%lld%ss", sign.c_str(), seconds,
+                                           FormatNanos(nanos).c_str());
   ow->RenderString(field_name, formatted_duration);
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderDouble(const ProtoStreamObjectSource* os,
@@ -403,7 +381,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderDouble(field_name, bit_cast<double>(buffer64));
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderFloat(const ProtoStreamObjectSource* os,
@@ -417,7 +395,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderFloat(field_name, bit_cast<float>(buffer32));
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderInt64(const ProtoStreamObjectSource* os,
@@ -431,7 +409,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderInt64(field_name, bit_cast<int64>(buffer64));
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderUInt64(const ProtoStreamObjectSource* os,
@@ -445,7 +423,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderUint64(field_name, bit_cast<uint64>(buffer64));
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderInt32(const ProtoStreamObjectSource* os,
@@ -459,7 +437,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderInt32(field_name, bit_cast<int32>(buffer32));
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderUInt32(const ProtoStreamObjectSource* os,
@@ -473,7 +451,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderUint32(field_name, bit_cast<uint32>(buffer32));
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderBool(const ProtoStreamObjectSource* os,
@@ -488,7 +466,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderBool(field_name, buffer64 != 0);
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderString(const ProtoStreamObjectSource* os,
@@ -504,7 +482,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderString(field_name, str);
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderBytes(const ProtoStreamObjectSource* os,
@@ -520,7 +498,7 @@
     os->stream_->ReadTag();
   }
   ow->RenderBytes(field_name, str);
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderStruct(const ProtoStreamObjectSource* os,
@@ -539,7 +517,7 @@
     }
   }
   ow->EndObject();
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderStructValue(
@@ -555,7 +533,7 @@
     }
     RETURN_IF_ERROR(os->RenderField(field, field_name, ow));
   }
-  return util::Status();
+  return Status::OK;
 }
 
 // TODO(skarvaje): Avoid code duplication of for loops and SkipField logic.
@@ -568,7 +546,7 @@
   if (tag == 0) {
     ow->StartList(field_name);
     ow->EndList();
-    return util::Status();
+    return Status::OK;
   }
 
   while (tag != 0) {
@@ -580,7 +558,7 @@
     }
     ASSIGN_OR_RETURN(tag, os->RenderList(field, field_name, tag, ow));
   }
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderAny(const ProtoStreamObjectSource* os,
@@ -622,7 +600,7 @@
       ow->RenderString("@type", type_url);
     }
     ow->EndObject();
-    return util::Status();
+    return util::Status::OK;
   }
 
   // If there is a value but no type, we cannot render it, so report an error.
@@ -687,7 +665,7 @@
     combined.append(ConvertFieldMaskPath(str, &ToCamelCase));
   }
   ow->RenderString(field_name, combined);
-  return util::Status();
+  return Status::OK;
 }
 
 
@@ -783,7 +761,7 @@
     // Render all other non-message types.
     return RenderNonMessageField(field, field_name, ow);
   }
-  return util::Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectSource::RenderNonMessageField(
@@ -873,24 +851,18 @@
       // up.
       const google::protobuf::Enum* en =
           typeinfo_->GetEnumByTypeUrl(field->type_url());
-      // Lookup the name of the enum, and render that. Unknown enum values
-      // are printed as integers.
+      // Lookup the name of the enum, and render that. Skips unknown enums.
       if (en != NULL) {
         const google::protobuf::EnumValue* enum_value =
             FindEnumValueByNumber(*en, buffer32);
         if (enum_value != NULL) {
-          if (use_ints_for_enums_) {
-            ow->RenderInt32(field_name, buffer32);
-          } else if (use_lower_camel_for_enums_) {
+          if (use_lower_camel_for_enums_)
             ow->RenderString(field_name, ToCamelCase(enum_value->name()));
-          } else {
+          else
             ow->RenderString(field_name, enum_value->name());
-          }
-        } else if (render_unknown_enum_values_) {
-          ow->RenderInt32(field_name, buffer32);
         }
-      } else if (render_unknown_enum_values_) {
-        ow->RenderInt32(field_name, buffer32);
+      } else {
+        GOOGLE_LOG(INFO) << "Unknown enum skipped: " << field->type_url();
       }
       break;
     }
@@ -909,7 +881,7 @@
     default:
       break;
   }
-  return util::Status();
+  return Status::OK;
 }
 
 // TODO(skarvaje): Fix this to avoid code duplication.
@@ -1037,8 +1009,12 @@
     const google::protobuf::Field& field) const {
   const google::protobuf::Type* field_type =
       typeinfo_->GetTypeByTypeUrl(field.type_url());
+
+  // TODO(xiaofeng): Unify option names.
   return field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE &&
-         google::protobuf::util::converter::IsMap(field, *field_type);
+         (GetBoolOptionOrDefault(field_type->options(),
+                                 "google.protobuf.MessageOptions.map_entry", false) ||
+          GetBoolOptionOrDefault(field_type->options(), "map_entry", false));
 }
 
 std::pair<int64, int32> ProtoStreamObjectSource::ReadSecondsAndNanos(
@@ -1078,7 +1054,7 @@
         StrCat("Message too deep. Max recursion depth reached for type '",
                type_name, "', field '", field_name, "'"));
   }
-  return util::Status();
+  return Status::OK;
 }
 
 namespace {
@@ -1116,11 +1092,7 @@
 
 // TODO(skarvaje): Look into optimizing this by not doing computation on
 // double.
-const string FormatNanos(uint32 nanos, bool with_trailing_zeros) {
-  if (nanos == 0) {
-    return with_trailing_zeros ? ".000" : "";
-  }
-
+const string FormatNanos(uint32 nanos) {
   const char* format =
       (nanos % 1000 != 0) ? "%.9f" : (nanos % 1000000 != 0) ? "%.6f" : "%.3f";
   string formatted =
diff --git a/src/google/protobuf/util/internal/protostream_objectsource.h b/src/google/protobuf/util/internal/protostream_objectsource.h
index b56efdf..d7d4347 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource.h
+++ b/src/google/protobuf/util/internal/protostream_objectsource.h
@@ -110,15 +110,6 @@
     use_lower_camel_for_enums_ = value;
   }
 
-  // Sets whether to always output enums as ints, by default this is off, and
-  // enums are rendered as strings.
-  void set_use_ints_for_enums(bool value) { use_ints_for_enums_ = value; }
-
-  // Sets whether to use original proto field names
-  void set_preserve_proto_field_names(bool value) {
-    preserve_proto_field_names_ = value;
-  }
-
   // Sets the max recursion depth of proto message to be deserialized. Proto
   // messages over this depth will fail to be deserialized.
   // Default value is 64.
@@ -126,7 +117,6 @@
     max_recursion_depth_ = max_depth;
   }
 
-
  protected:
   // Writes a proto2 Message to the ObjectWriter. When the given end_tag is
   // found this method will complete, allowing it to be used for parsing both
@@ -138,28 +128,6 @@
                                       bool include_start_and_end,
                                       ObjectWriter* ow) const;
 
-  // Renders a repeating field (packed or unpacked).  Returns the next tag after
-  // reading all sequential repeating elements. The caller should use this tag
-  // before reading more tags from the stream.
-  virtual util::StatusOr<uint32> RenderList(
-      const google::protobuf::Field* field, StringPiece name, uint32 list_tag,
-      ObjectWriter* ow) const;
-
-  // Looks up a field and verify its consistency with wire type in tag.
-  const google::protobuf::Field* FindAndVerifyField(
-      const google::protobuf::Type& type, uint32 tag) const;
-
-  // Renders a field value to the ObjectWriter.
-  util::Status RenderField(const google::protobuf::Field* field,
-                             StringPiece field_name, ObjectWriter* ow) const;
-
-  // Reads field value according to Field spec in 'field' and returns the read
-  // value as string. This only works for primitive datatypes (no message
-  // types).
-  const string ReadFieldValueAsString(
-      const google::protobuf::Field& field) const;
-
-
  private:
   ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream,
                           const TypeInfo* typeinfo,
@@ -169,9 +137,19 @@
                                          const google::protobuf::Type&,
                                          StringPiece, ObjectWriter*);
 
+  // Looks up a field and verify its consistency with wire type in tag.
+  const google::protobuf::Field* FindAndVerifyField(
+      const google::protobuf::Type& type, uint32 tag) const;
+
   // TODO(skarvaje): Mark these methods as non-const as they modify internal
   // state (stream_).
   //
+  // Renders a repeating field (packed or unpacked).
+  // Returns the next tag after reading all sequential repeating elements. The
+  // caller should use this tag before reading more tags from the stream.
+  util::StatusOr<uint32> RenderList(const google::protobuf::Field* field,
+                                      StringPiece name, uint32 list_tag,
+                                      ObjectWriter* ow) const;
   // 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.
@@ -255,6 +233,10 @@
   static void DeleteRendererMap();
   static TypeRenderer* FindTypeRenderer(const string& type_url);
 
+  // Renders a field value to the ObjectWriter.
+  util::Status RenderField(const google::protobuf::Field* field,
+                             StringPiece field_name, ObjectWriter* ow) const;
+
   // Same as above but renders all non-message field types. Callers don't call
   // this function directly. They just use RenderField.
   util::Status RenderNonMessageField(const google::protobuf::Field* field,
@@ -262,6 +244,12 @@
                                        ObjectWriter* ow) const;
 
 
+  // Reads field value according to Field spec in 'field' and returns the read
+  // value as string. This only works for primitive datatypes (no message
+  // types).
+  const string ReadFieldValueAsString(
+      const google::protobuf::Field& field) const;
+
   // Utility function to detect proto maps. The 'field' MUST be repeated.
   bool IsMap(const google::protobuf::Field& field) const;
 
@@ -282,7 +270,6 @@
   // Type information for all the types used in the descriptor. Used to find
   // google::protobuf::Type of nested messages/enums.
   const TypeInfo* typeinfo_;
-
   // Whether this class owns the typeinfo_ object. If true the typeinfo_ object
   // should be deleted in the destructor.
   bool own_typeinfo_;
@@ -294,27 +281,12 @@
   // Whether to render enums using lowerCamelCase. Defaults to false.
   bool use_lower_camel_for_enums_;
 
-  // Whether to render enums as ints always. Defaults to false.
-  bool use_ints_for_enums_;
-
-  // Whether to preserve proto field names
-  bool preserve_proto_field_names_;
-
   // Tracks current recursion depth.
   mutable int recursion_depth_;
 
   // Maximum allowed recursion depth.
   int max_recursion_depth_;
 
-  // Whether to render unknown fields.
-  bool render_unknown_fields_;
-
-  // Whether to render unknown enum values.
-  bool render_unknown_enum_values_;
-
-  // Whether to add trailing zeros for timestamp and duration.
-  bool add_trailing_zeros_for_timestamp_and_duration_;
-
   GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource);
 };
 
diff --git a/src/google/protobuf/util/internal/protostream_objectsource_test.cc b/src/google/protobuf/util/internal/protostream_objectsource_test.cc
index 36bb1ba..3f6fdf9 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource_test.cc
+++ b/src/google/protobuf/util/internal/protostream_objectsource_test.cc
@@ -42,16 +42,15 @@
 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/util/internal/expecting_objectwriter.h>
-#include <google/protobuf/util/internal/testdata/anys.pb.h>
 #include <google/protobuf/util/internal/testdata/books.pb.h>
 #include <google/protobuf/util/internal/testdata/field_mask.pb.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/internal/testdata/proto3.pb.h>
-#include <google/protobuf/util/internal/testdata/struct.pb.h>
-#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
 #include <google/protobuf/util/internal/type_info_test_helper.h>
 #include <google/protobuf/util/internal/constants.h>
 #include <google/protobuf/stubs/strutil.h>
+#include <google/protobuf/util/internal/testdata/anys.pb.h>
+#include <google/protobuf/util/internal/testdata/maps.pb.h>
+#include <google/protobuf/util/internal/testdata/struct.pb.h>
+#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
 #include <gtest/gtest.h>
 
 
@@ -67,24 +66,24 @@
 using google::protobuf::io::ArrayInputStream;
 using google::protobuf::io::CodedInputStream;
 using util::Status;
-using google::protobuf::testing::AnyM;
-using google::protobuf::testing::AnyOut;
 using google::protobuf::testing::Author;
 using google::protobuf::testing::BadAuthor;
 using google::protobuf::testing::BadNestedBook;
 using google::protobuf::testing::Book;
-using google::protobuf::testing::Book_Label;
 using google::protobuf::testing::Cyclic;
-using google::protobuf::testing::FieldMaskTest;
-using google::protobuf::testing::MapOut;
-using google::protobuf::testing::MapOutWireFormat;
+using google::protobuf::testing::Book_Label;
 using google::protobuf::testing::NestedBook;
-using google::protobuf::testing::NestedFieldMask;
 using google::protobuf::testing::PackedPrimitive;
 using google::protobuf::testing::Primitive;
-using google::protobuf::testing::Proto3Message;
-using google::protobuf::testing::StructType;
-using google::protobuf::testing::TimestampDuration;
+using google::protobuf::testing::more_author;
+using google::protobuf::testing::maps::MapOut;
+using google::protobuf::testing::maps::MapOutWireFormat;
+using google::protobuf::testing::timestampduration::TimestampDuration;
+using google::protobuf::testing::anys::AnyOut;
+using google::protobuf::testing::anys::AnyM;
+using google::protobuf::testing::FieldMaskTest;
+using google::protobuf::testing::NestedFieldMask;
+using google::protobuf::testing::structs::StructType;
 using ::testing::_;
 
 
@@ -101,22 +100,19 @@
       : helper_(GetParam()),
         mock_(),
         ow_(&mock_),
-        use_lower_camel_for_enums_(false),
-        use_ints_for_enums_(false),
-        add_trailing_zeros_(false),
-        render_unknown_enum_values_(true) {
-    helper_.ResetTypeInfo(Book::descriptor(), Proto3Message::descriptor());
+        use_lower_camel_for_enums_(false) {
+    helper_.ResetTypeInfo(Book::descriptor());
   }
 
   virtual ~ProtostreamObjectSourceTest() {}
 
   void DoTest(const Message& msg, const Descriptor* descriptor) {
     Status status = ExecuteTest(msg, descriptor);
-    EXPECT_EQ(util::Status(), status);
+    EXPECT_EQ(Status::OK, status);
   }
 
   Status ExecuteTest(const Message& msg, const Descriptor* descriptor) {
-    std::ostringstream oss;
+    ostringstream oss;
     msg.SerializePartialToOstream(&oss);
     string proto = oss.str();
     ArrayInputStream arr_stream(proto.data(), proto.size());
@@ -125,7 +121,6 @@
     google::protobuf::scoped_ptr<ProtoStreamObjectSource> os(
         helper_.NewProtoSource(&in_stream, GetTypeUrl(descriptor)));
     if (use_lower_camel_for_enums_) os->set_use_lower_camel_for_enums(true);
-    if (use_ints_for_enums_) os->set_use_ints_for_enums(true);
     os->set_max_recursion_depth(64);
     return os->WriteTo(&mock_);
   }
@@ -273,22 +268,11 @@
 
   void UseLowerCamelForEnums() { use_lower_camel_for_enums_ = true; }
 
-  void UseIntsForEnums() { use_ints_for_enums_ = true; }
-
-  void AddTrailingZeros() { add_trailing_zeros_ = true; }
-
-  void SetRenderUnknownEnumValues(bool value) {
-    render_unknown_enum_values_ = value;
-  }
-
   testing::TypeInfoTestHelper helper_;
 
   ::testing::NiceMock<MockObjectWriter> mock_;
   ExpectingObjectWriter ow_;
   bool use_lower_camel_for_enums_;
-  bool use_ints_for_enums_;
-  bool add_trailing_zeros_;
-  bool render_unknown_enum_values_;
 };
 
 INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
@@ -509,40 +493,6 @@
   DoTest(book, Book::descriptor());
 }
 
-TEST_P(ProtostreamObjectSourceTest, UseIntsForEnumsTest) {
-  Book book;
-  book.set_type(Book::ACTION_AND_ADVENTURE);
-
-  UseIntsForEnums();
-
-  ow_.StartObject("")->RenderInt32("type", 3)->EndObject();
-  DoTest(book, Book::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest,
-       UnknownEnumAreDroppedWhenRenderUnknownEnumValuesIsUnset) {
-  Proto3Message message;
-  message.set_enum_value(static_cast<Proto3Message::NestedEnum>(1234));
-
-  SetRenderUnknownEnumValues(false);
-
-  // Unknown enum values are not output.
-  ow_.StartObject("")->EndObject();
-  DoTest(message, Proto3Message::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest,
-       UnknownEnumAreOutputWhenRenderUnknownEnumValuesIsSet) {
-  Proto3Message message;
-  message.set_enum_value(static_cast<Proto3Message::NestedEnum>(1234));
-
-  SetRenderUnknownEnumValues(true);
-
-  // Unknown enum values are output.
-  ow_.StartObject("")->RenderInt32("enumValue", 1234)->EndObject();
-  DoTest(message, Proto3Message::descriptor());
-}
-
 TEST_P(ProtostreamObjectSourceTest, CyclicMessageDepthTest) {
   Cyclic cyclic;
   cyclic.set_m_int(123);
@@ -729,7 +679,7 @@
 // This is the example expected output.
 // {
 //   "any": {
-//     "@type": "type.googleapis.com/google.protobuf.testing.AnyM"
+//     "@type": "type.googleapis.com/google.protobuf.testing.anys.AnyM"
 //     "foo": "foovalue"
 //   }
 // }
@@ -744,7 +694,7 @@
   ow_.StartObject("")
       ->StartObject("any")
       ->RenderString("@type",
-                     "type.googleapis.com/google.protobuf.testing.AnyM")
+                     "type.googleapis.com/google.protobuf.testing.anys.AnyM")
       ->RenderString("foo", "foovalue")
       ->EndObject()
       ->EndObject();
@@ -758,7 +708,8 @@
   any->set_type_url("type.googleapis.com/google.protobuf.Any");
 
   ::google::protobuf::Any nested_any;
-  nested_any.set_type_url("type.googleapis.com/google.protobuf.testing.AnyM");
+  nested_any.set_type_url(
+      "type.googleapis.com/google.protobuf.testing.anys.AnyM");
 
   AnyM m;
   m.set_foo("foovalue");
@@ -771,7 +722,7 @@
       ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
       ->StartObject("value")
       ->RenderString("@type",
-                     "type.googleapis.com/google.protobuf.testing.AnyM")
+                     "type.googleapis.com/google.protobuf.testing.anys.AnyM")
       ->RenderString("foo", "foovalue")
       ->EndObject()
       ->EndObject()
@@ -790,7 +741,7 @@
 
   ::google::protobuf::Any second_nested_any;
   second_nested_any.set_type_url(
-      "type.googleapis.com/google.protobuf.testing.AnyM");
+      "type.googleapis.com/google.protobuf.testing.anys.AnyM");
 
   AnyM m;
   m.set_foo("foovalue");
@@ -805,7 +756,7 @@
       ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
       ->StartObject("value")
       ->RenderString("@type",
-                     "type.googleapis.com/google.protobuf.testing.AnyM")
+                     "type.googleapis.com/google.protobuf.testing.anys.AnyM")
       ->RenderString("foo", "foovalue")
       ->EndObject()
       ->EndObject()
@@ -1050,20 +1001,6 @@
   EXPECT_EQ(util::error::INTERNAL, status.error_code());
 }
 
-TEST_P(ProtostreamObjectSourceTimestampTest, TimestampDurationDefaultValue) {
-  TimestampDuration out;
-  out.mutable_ts()->set_seconds(0);
-  out.mutable_dur()->set_seconds(0);
-
-  ow_.StartObject("")
-      ->RenderString("ts", "1970-01-01T00:00:00Z")
-      ->RenderString("dur", "0s")
-      ->EndObject();
-
-  DoTest(out, TimestampDuration::descriptor());
-}
-
-
 }  // namespace converter
 }  // namespace util
 }  // namespace protobuf
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter.cc b/src/google/protobuf/util/internal/protostream_objectwriter.cc
index 97f9681..97a7909 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter.cc
+++ b/src/google/protobuf/util/internal/protostream_objectwriter.cc
@@ -63,10 +63,7 @@
     : ProtoWriter(type_resolver, type, output, listener),
       master_type_(type),
       current_(NULL),
-      options_(options) {
-  set_ignore_unknown_fields(options_.ignore_unknown_fields);
-  set_use_lower_camel_for_enums(options_.use_lower_camel_for_enums);
-}
+      options_(options) {}
 
 ProtoStreamObjectWriter::ProtoStreamObjectWriter(
     const TypeInfo* typeinfo, const google::protobuf::Type& type,
@@ -173,7 +170,7 @@
     *nanos = i_nanos * conversion;
   }
 
-  return Status();
+  return Status::OK;
 }
 
 }  // namespace
@@ -193,11 +190,17 @@
 void ProtoStreamObjectWriter::AnyWriter::StartObject(StringPiece name) {
   ++depth_;
   // If an object writer is absent, that means we have not called StartAny()
-  // before reaching here, which happens when we have data before the "@type"
-  // field.
+  // before reaching here. This is an invalid state. StartAny() gets called
+  // whenever we see an "@type" being rendered (see AnyWriter::RenderDataPiece).
   if (ow_ == NULL) {
-    // Save data before the "@type" field for later replay.
-    uninterpreted_events_.push_back(Event(Event::START_OBJECT, name));
+    // Make sure we are not already in an invalid state. This avoids making
+    // multiple unnecessary InvalidValue calls.
+    if (!invalid_) {
+      parent_->InvalidValue("Any",
+                            StrCat("Missing or invalid @type for any field in ",
+                                   parent_->master_type_.name()));
+      invalid_ = true;
+    }
   } else if (is_well_known_type_ && depth_ == 1) {
     // For well-known types, the only other field besides "@type" should be a
     // "value" field.
@@ -217,15 +220,10 @@
 
 bool ProtoStreamObjectWriter::AnyWriter::EndObject() {
   --depth_;
-  if (ow_ == NULL) {
-    if (depth_ >= 0) {
-      // Save data before the "@type" field for later replay.
-      uninterpreted_events_.push_back(Event(Event::END_OBJECT));
-    }
-  } else if (depth_ >= 0 || !is_well_known_type_) {
-    // As long as depth_ >= 0, we know we haven't reached the end of Any.
-    // Propagate these EndObject() calls to the contained ow_. For regular
-    // message types, we propagate the end of Any as well.
+  // As long as depth_ >= 0, we know we haven't reached the end of Any.
+  // Propagate these EndObject() calls to the contained ow_. For regular
+  // message types, we propagate the end of Any as well.
+  if (ow_ != NULL && (depth_ >= 0 || !is_well_known_type_)) {
     ow_->EndObject();
   }
   // A negative depth_ implies that we have reached the end of Any
@@ -239,9 +237,14 @@
 
 void ProtoStreamObjectWriter::AnyWriter::StartList(StringPiece name) {
   ++depth_;
+  // We expect ow_ to be present as this call only makes sense inside an Any.
   if (ow_ == NULL) {
-    // Save data before the "@type" field for later replay.
-    uninterpreted_events_.push_back(Event(Event::START_LIST, name));
+    if (!invalid_) {
+      parent_->InvalidValue("Any",
+                            StrCat("Missing or invalid @type for any field in ",
+                                   parent_->master_type_.name()));
+      invalid_ = true;
+    }
   } else if (is_well_known_type_ && depth_ == 1) {
     if (name != "value" && !invalid_) {
       parent_->InvalidValue("Any",
@@ -260,10 +263,8 @@
     GOOGLE_LOG(DFATAL) << "Mismatched EndList found, should not be possible";
     depth_ = 0;
   }
-  if (ow_ == NULL) {
-    // Save data before the "@type" field for later replay.
-    uninterpreted_events_.push_back(Event(Event::END_LIST));
-  } else {
+  // We don't write an error on the close, only on the open
+  if (ow_ != NULL) {
     ow_->EndList();
   }
 }
@@ -275,8 +276,12 @@
   if (depth_ == 0 && ow_ == NULL && name == "@type") {
     StartAny(value);
   } else if (ow_ == NULL) {
-    // Save data before the "@type" field.
-    uninterpreted_events_.push_back(Event(name, value));
+    if (!invalid_) {
+      parent_->InvalidValue("Any",
+                            StrCat("Missing or invalid @type for any field in ",
+                                   parent_->master_type_.name()));
+      invalid_ = true;
+    }
   } else if (depth_ == 0 && is_well_known_type_) {
     if (name != "value" && !invalid_) {
       parent_->InvalidValue("Any",
@@ -286,7 +291,7 @@
     if (well_known_type_render_ == NULL) {
       // Only Any and Struct don't have a special type render but both of
       // them expect a JSON object (i.e., a StartObject() call).
-      if (value.type() != DataPiece::TYPE_NULL && !invalid_) {
+      if (!invalid_) {
         parent_->InvalidValue("Any", "Expect a JSON object.");
         invalid_ = true;
       }
@@ -351,29 +356,13 @@
   if (!is_well_known_type_) {
     ow_->StartObject("");
   }
-
-  // Now we know the proto type and can interpret all data fields we gathered
-  // before the "@type" field.
-  for (int i = 0; i < uninterpreted_events_.size(); ++i) {
-    uninterpreted_events_[i].Replay(this);
-  }
 }
 
 void ProtoStreamObjectWriter::AnyWriter::WriteAny() {
   if (ow_ == NULL) {
-    if (uninterpreted_events_.empty()) {
-      // We never got any content, so just return immediately, which is
-      // equivalent to writing an empty Any.
-      return;
-    } else {
-      // There are uninterpreted data, but we never got a "@type" field.
-      if (!invalid_) {
-        parent_->InvalidValue("Any", StrCat("Missing @type for any field in ",
-                                            parent_->master_type_.name()));
-        invalid_ = true;
-      }
-      return;
-    }
+    // If we had no object writer, we never got any content, so just return
+    // immediately, which is equivalent to writing an empty Any.
+    return;
   }
   // Render the type_url and value fields directly to the stream.
   // type_url has tag 1 and value has tag 2.
@@ -383,41 +372,6 @@
   }
 }
 
-void ProtoStreamObjectWriter::AnyWriter::Event::Replay(
-    AnyWriter* writer) const {
-  switch (type_) {
-    case START_OBJECT:
-      writer->StartObject(name_);
-      break;
-    case END_OBJECT:
-      writer->EndObject();
-      break;
-    case START_LIST:
-      writer->StartList(name_);
-      break;
-    case END_LIST:
-      writer->EndList();
-      break;
-    case RENDER_DATA_PIECE:
-      writer->RenderDataPiece(name_, value_);
-      break;
-  }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::Event::DeepCopy() {
-  // DataPiece only contains a string reference. To make sure the referenced
-  // string value stays valid, we make a copy of the string value and update
-  // DataPiece to reference our own copy.
-  if (value_.type() == DataPiece::TYPE_STRING) {
-    StrAppend(&value_storage_, value_.str());
-    value_ = DataPiece(value_storage_, value_.use_strict_base64_decoding());
-  } else if (value_.type() == DataPiece::TYPE_BYTES) {
-    value_storage_ = value_.ToBytes().ValueOrDie();
-    value_ =
-        DataPiece(value_storage_, true, value_.use_strict_base64_decoding());
-  }
-}
-
 ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter* enclosing,
                                     ItemType item_type, bool is_placeholder,
                                     bool is_list)
@@ -430,9 +384,6 @@
   if (item_type_ == ANY) {
     any_.reset(new AnyWriter(ow_));
   }
-  if (item_type == MAP) {
-    map_keys_.reset(new hash_set<string>);
-  }
 }
 
 ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter::Item* parent,
@@ -447,14 +398,11 @@
   if (item_type == ANY) {
     any_.reset(new AnyWriter(ow_));
   }
-  if (item_type == MAP) {
-    map_keys_.reset(new hash_set<string>);
-  }
 }
 
 bool ProtoStreamObjectWriter::Item::InsertMapKeyIfNotPresent(
     StringPiece map_key) {
-  return InsertIfNotPresent(map_keys_.get(), map_key.ToString());
+  return InsertIfNotPresent(&map_keys_, map_key.ToString());
 }
 
 ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartObject(
@@ -862,7 +810,7 @@
           ow->ProtoWriter::RenderDataPiece(
               "string_value",
               DataPiece(SimpleItoa(int_value.ValueOrDie()), true));
-          return Status();
+          return Status::OK;
         }
       }
       struct_field_name = "number_value";
@@ -877,22 +825,13 @@
           ow->ProtoWriter::RenderDataPiece(
               "string_value",
               DataPiece(SimpleItoa(int_value.ValueOrDie()), true));
-          return Status();
+          return Status::OK;
         }
       }
       struct_field_name = "number_value";
       break;
     }
     case DataPiece::TYPE_DOUBLE: {
-      if (ow->options_.struct_integers_as_strings) {
-        StatusOr<double> double_value = data.ToDouble();
-        if (double_value.ok()) {
-          ow->ProtoWriter::RenderDataPiece(
-              "string_value",
-              DataPiece(SimpleDtoa(double_value.ValueOrDie()), true));
-          return Status();
-        }
-      }
       struct_field_name = "number_value";
       break;
     }
@@ -915,12 +854,11 @@
     }
   }
   ow->ProtoWriter::RenderDataPiece(struct_field_name, data);
-  return Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectWriter::RenderTimestamp(ProtoStreamObjectWriter* ow,
                                                 const DataPiece& data) {
-  if (data.type() == DataPiece::TYPE_NULL) return Status();
   if (data.type() != DataPiece::TYPE_STRING) {
     return Status(INVALID_ARGUMENT,
                   StrCat("Invalid data type for timestamp, value is ",
@@ -939,19 +877,18 @@
 
   ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds));
   ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos));
-  return Status();
+  return Status::OK;
 }
 
 static inline util::Status RenderOneFieldPath(ProtoStreamObjectWriter* ow,
                                                 StringPiece path) {
   ow->ProtoWriter::RenderDataPiece(
       "paths", DataPiece(ConvertFieldMaskPath(path, &ToSnakeCase), true));
-  return Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectWriter::RenderFieldMask(ProtoStreamObjectWriter* ow,
                                                 const DataPiece& data) {
-  if (data.type() == DataPiece::TYPE_NULL) return Status();
   if (data.type() != DataPiece::TYPE_STRING) {
     return Status(INVALID_ARGUMENT,
                   StrCat("Invalid data type for field mask, value is ",
@@ -962,13 +899,12 @@
 // conversions as much as possible. Because ToSnakeCase sometimes returns the
 // wrong value.
   google::protobuf::scoped_ptr<ResultCallback1<util::Status, StringPiece> > callback(
-      ::google::protobuf::NewPermanentCallback(&RenderOneFieldPath, ow));
+      ::google::protobuf::internal::NewPermanentCallback(&RenderOneFieldPath, ow));
   return DecodeCompactFieldMaskPaths(data.str(), callback.get());
 }
 
 Status ProtoStreamObjectWriter::RenderDuration(ProtoStreamObjectWriter* ow,
                                                const DataPiece& data) {
-  if (data.type() == DataPiece::TYPE_NULL) return Status();
   if (data.type() != DataPiece::TYPE_STRING) {
     return Status(INVALID_ARGUMENT,
                   StrCat("Invalid data type for duration, value is ",
@@ -1013,14 +949,13 @@
 
   ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds));
   ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos));
-  return Status();
+  return Status::OK;
 }
 
 Status ProtoStreamObjectWriter::RenderWrapperType(ProtoStreamObjectWriter* ow,
                                                   const DataPiece& data) {
-  if (data.type() == DataPiece::TYPE_NULL) return Status();
   ow->ProtoWriter::RenderDataPiece("value", data);
-  return Status();
+  return Status::OK;
 }
 
 ProtoStreamObjectWriter* ProtoStreamObjectWriter::RenderDataPiece(
@@ -1065,7 +1000,6 @@
                                  DataPiece(name, use_strict_base64_decoding()));
     field = Lookup("value");
     if (field == NULL) {
-      Pop();
       GOOGLE_LOG(DFATAL) << "Map does not have a value field.";
       return this;
     }
@@ -1106,18 +1040,13 @@
   // Check if the field is of special type. Render it accordingly if so.
   const TypeRenderer* type_renderer = FindTypeRenderer(field->type_url());
   if (type_renderer != NULL) {
-    // Pass through null value only for google.protobuf.Value. For other
-    // types we ignore null value just like for regular field types.
-    if (data.type() != DataPiece::TYPE_NULL ||
-        field->type_url() == kStructValueTypeUrl) {
-      Push(name, Item::MESSAGE, false, false);
-      status = (*type_renderer)(this, data);
-      if (!status.ok()) {
-        InvalidValue(field->type_url(),
-                     StrCat("Field '", name, "', ", status.error_message()));
-      }
-      Pop();
+    Push(name, Item::MESSAGE, false, false);
+    status = (*type_renderer)(this, data);
+    if (!status.ok()) {
+      InvalidValue(field->type_url(),
+                   StrCat("Field '", name, "', ", status.error_message()));
     }
+    Pop();
     return this;
   }
 
@@ -1247,7 +1176,10 @@
   const google::protobuf::Type* field_type =
       typeinfo()->GetTypeByTypeUrl(field.type_url());
 
-  return google::protobuf::util::converter::IsMap(field, *field_type);
+  // TODO(xiaofeng): Unify option names.
+  return GetBoolOptionOrDefault(field_type->options(),
+                                "google.protobuf.MessageOptions.map_entry", false) ||
+         GetBoolOptionOrDefault(field_type->options(), "map_entry", false);
 }
 
 bool ProtoStreamObjectWriter::IsAny(const google::protobuf::Field& field) {
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter.h b/src/google/protobuf/util/internal/protostream_objectwriter.h
index ab53491..e1162d4 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter.h
+++ b/src/google/protobuf/util/internal/protostream_objectwriter.h
@@ -76,28 +76,14 @@
  public:
   // Options that control ProtoStreamObjectWriter class's behavior.
   struct Options {
-    // Treats numeric inputs in google.protobuf.Struct as strings. Normally,
-    // numeric values are returned in double field "number_value" of
+    // Treats integer inputs in google.protobuf.Struct as strings. Normally,
+    // integer values are returned in double field "number_value" of
     // google.protobuf.Struct. However, this can cause precision loss for
-    // int64/uint64/double inputs. This option is provided for cases that want
-    // to preserve number precision.
-    //
-    // TODO(skarvaje): Rename to struct_numbers_as_strings as it covers double
-    // as well.
+    // int64/uint64 inputs. This option is provided for cases that want to
+    // preserve integer precision.
     bool struct_integers_as_strings;
 
-    // Not treat unknown fields as an error. If there is an unknown fields,
-    // just ignore it and continue to process the rest.
-    bool ignore_unknown_fields;
-
-    // If true, check if enum name in camel case or without underscore matches
-    // the field name.
-    bool use_lower_camel_for_enums;
-
-    Options()
-        : struct_integers_as_strings(false),
-          ignore_unknown_fields(false),
-          use_lower_camel_for_enums(false) {}
+    Options() : struct_integers_as_strings(false) {}
 
     // Default instance of Options with all options set to defaults.
     static const Options& Defaults() {
@@ -154,57 +140,6 @@
     void RenderDataPiece(StringPiece name, const DataPiece& value);
 
    private:
-    // Before the "@type" field is encountered, we store all incoming data
-    // into this Event struct and replay them after we get the "@type" field.
-    class LIBPROTOBUF_EXPORT Event {
-     public:
-      enum Type {
-        START_OBJECT = 0,
-        END_OBJECT = 1,
-        START_LIST = 2,
-        END_LIST = 3,
-        RENDER_DATA_PIECE = 4,
-      };
-
-      // Constructor for END_OBJECT and END_LIST events.
-      explicit Event(Type type) : type_(type), value_(DataPiece::NullData()) {}
-
-      // Constructor for START_OBJECT and START_LIST events.
-      explicit Event(Type type, StringPiece name)
-          : type_(type),
-            name_(name.ToString()),
-            value_(DataPiece::NullData()) {}
-
-      // Constructor for RENDER_DATA_PIECE events.
-      explicit Event(StringPiece name, const DataPiece& value)
-          : type_(RENDER_DATA_PIECE), name_(name.ToString()), value_(value) {
-        DeepCopy();
-      }
-
-      Event(const Event& other)
-          : type_(other.type_), name_(other.name_), value_(other.value_) {
-        DeepCopy();
-      }
-
-      Event& operator=(const Event& other) {
-        type_ = other.type_;
-        name_ = other.name_;
-        value_ = other.value_;
-        DeepCopy();
-        return *this;
-      }
-
-      void Replay(AnyWriter* writer) const;
-
-     private:
-      void DeepCopy();
-
-      Type type_;
-      string name_;
-      DataPiece value_;
-      string value_storage_;
-    };
-
     // Handles starting up the any once we have a type.
     void StartAny(const DataPiece& value);
 
@@ -240,9 +175,6 @@
     // }
     bool is_well_known_type_;
     TypeRenderer* well_known_type_render_;
-
-    // Store data before the "@type" field.
-    std::vector<Event> uninterpreted_events_;
   };
 
   // Represents an item in a stack of items used to keep state between
@@ -299,7 +231,7 @@
 
     // Set of map keys already seen for the type_. Used to validate incoming
     // messages so no map key appears more than once.
-    google::protobuf::scoped_ptr<hash_set<string> > map_keys_;
+    hash_set<string> map_keys_;
 
     // Conveys whether this Item is a placeholder or not. Placeholder items are
     // pushed to stack to account for special types.
@@ -317,19 +249,19 @@
                           strings::ByteSink* output, ErrorListener* listener);
 
   // Returns true if the field is a map.
-  inline bool IsMap(const google::protobuf::Field& field);
+  bool IsMap(const google::protobuf::Field& field);
 
   // Returns true if the field is an any.
-  inline bool IsAny(const google::protobuf::Field& field);
+  bool IsAny(const google::protobuf::Field& field);
 
   // Returns true if the field is google.protobuf.Struct.
-  inline bool IsStruct(const google::protobuf::Field& field);
+  bool IsStruct(const google::protobuf::Field& field);
 
   // Returns true if the field is google.protobuf.Value.
-  inline bool IsStructValue(const google::protobuf::Field& field);
+  bool IsStructValue(const google::protobuf::Field& field);
 
   // Returns true if the field is google.protobuf.ListValue.
-  inline bool IsStructListValue(const google::protobuf::Field& field);
+  bool IsStructListValue(const google::protobuf::Field& field);
 
   // Renders google.protobuf.Value in struct.proto. It picks the right oneof
   // type based on value's type.
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter_test.cc b/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
index 87d35b0..9a0dcde 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
@@ -41,20 +41,18 @@
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/message.h>
 #include <google/protobuf/util/internal/mock_error_listener.h>
-#include <google/protobuf/util/internal/testdata/anys.pb.h>
 #include <google/protobuf/util/internal/testdata/books.pb.h>
 #include <google/protobuf/util/internal/testdata/field_mask.pb.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/internal/testdata/oneofs.pb.h>
-#include <google/protobuf/util/internal/testdata/proto3.pb.h>
-#include <google/protobuf/util/internal/testdata/struct.pb.h>
-#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
-#include <google/protobuf/util/internal/testdata/wrappers.pb.h>
 #include <google/protobuf/util/internal/type_info_test_helper.h>
 #include <google/protobuf/util/internal/constants.h>
 #include <google/protobuf/util/message_differencer.h>
 #include <google/protobuf/stubs/bytestream.h>
 #include <google/protobuf/stubs/strutil.h>
+#include <google/protobuf/util/internal/testdata/anys.pb.h>
+#include <google/protobuf/util/internal/testdata/maps.pb.h>
+#include <google/protobuf/util/internal/testdata/oneofs.pb.h>
+#include <google/protobuf/util/internal/testdata/struct.pb.h>
+#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
 #include <gtest/gtest.h>
 
 
@@ -63,30 +61,27 @@
 namespace util {
 namespace converter {
 
-using google::protobuf::testing::AnyM;
-using google::protobuf::testing::AnyOut;
 using google::protobuf::testing::Author;
 using google::protobuf::testing::Book;
-using google::protobuf::testing::FieldMaskTest;
-using google::protobuf::testing::Int32Wrapper;
-using google::protobuf::testing::MapIn;
+using google::protobuf::testing::Book_Data;
 using google::protobuf::testing::Primitive;
-using google::protobuf::testing::Proto3Message;
 using google::protobuf::testing::Publisher;
-using google::protobuf::testing::StructType;
-using google::protobuf::testing::TestJsonName1;
-using google::protobuf::testing::TestJsonName2;
-using google::protobuf::testing::TimestampDuration;
-using google::protobuf::testing::ValueWrapper;
-using google::protobuf::testing::oneofs::OneOfsRequest;
 using google::protobuf::Descriptor;
 using google::protobuf::DescriptorPool;
 using google::protobuf::DynamicMessageFactory;
 using google::protobuf::FileDescriptorProto;
 using google::protobuf::Message;
+using google::protobuf::io::ArrayInputStream;
 using strings::GrowingArrayByteSink;
 using ::testing::_;
 using ::testing::Args;
+using google::protobuf::testing::anys::AnyM;
+using google::protobuf::testing::anys::AnyOut;
+using google::protobuf::testing::oneofs::OneOfsRequest;
+using google::protobuf::testing::FieldMaskTest;
+using google::protobuf::testing::maps::MapIn;
+using google::protobuf::testing::structs::StructType;
+using google::protobuf::testing::timestampduration::TimestampDuration;
 
 
 namespace {
@@ -115,13 +110,13 @@
         listener_(),
         output_(new GrowingArrayByteSink(1000)),
         ow_() {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(descriptor);
     ResetTypeInfo(descriptors);
   }
 
   explicit BaseProtoStreamObjectWriterTest(
-      std::vector<const Descriptor*> descriptors)
+      vector<const Descriptor*> descriptors)
       : helper_(GetParam()),
         listener_(),
         output_(new GrowingArrayByteSink(1000)),
@@ -129,7 +124,7 @@
     ResetTypeInfo(descriptors);
   }
 
-  void ResetTypeInfo(std::vector<const Descriptor*> descriptors) {
+  void ResetTypeInfo(vector<const Descriptor*> descriptors) {
     GOOGLE_CHECK(!descriptors.empty()) << "Must have at least one descriptor!";
     helper_.ResetTypeInfo(descriptors);
     ow_.reset(helper_.NewProtoWriter(GetTypeUrl(descriptors[0]), output_.get(),
@@ -137,7 +132,7 @@
   }
 
   void ResetTypeInfo(const Descriptor* descriptor) {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(descriptor);
     ResetTypeInfo(descriptors);
   }
@@ -188,10 +183,6 @@
   ProtoStreamObjectWriterTest()
       : BaseProtoStreamObjectWriterTest(Book::descriptor()) {}
 
-  void ResetProtoWriter() {
-    ResetTypeInfo(Book::descriptor());
-  }
-
   virtual ~ProtoStreamObjectWriterTest() {}
 };
 
@@ -273,100 +264,6 @@
   CheckOutput(book);
 }
 
-// Test that two messages can have different fields mapped to the same JSON
-// name. See: https://github.com/google/protobuf/issues/1415
-TEST_P(ProtoStreamObjectWriterTest, ConflictingJsonName) {
-  ResetTypeInfo(TestJsonName1::descriptor());
-  TestJsonName1 message1;
-  message1.set_one_value(12345);
-  ow_->StartObject("")->RenderInt32("value", 12345)->EndObject();
-  CheckOutput(message1);
-
-  ResetTypeInfo(TestJsonName2::descriptor());
-  TestJsonName2 message2;
-  message2.set_another_value(12345);
-  ow_->StartObject("")->RenderInt32("value", 12345)->EndObject();
-  CheckOutput(message2);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IntEnumValuesAreAccepted) {
-  Book book;
-  book.set_title("Some Book");
-  book.set_type(google::protobuf::testing::Book_Type_KIDS);
-  Author* robert = book.mutable_author();
-  robert->set_name("robert");
-
-  ow_->StartObject("")
-      ->RenderString("title", "Some Book")
-      ->RenderString("type", "2")
-      ->StartObject("author")
-      ->RenderString("name", "robert")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, EnumValuesWithoutUnderscoreAreAccepted) {
-  Book book;
-  book.set_title("Some Book");
-  book.set_type(google::protobuf::testing::Book_Type_ACTION_AND_ADVENTURE);
-  Author* robert = book.mutable_author();
-  robert->set_name("robert");
-
-  options_.use_lower_camel_for_enums = true;
-  ResetProtoWriter();
-
-  ow_->StartObject("")
-      ->RenderString("title", "Some Book")
-      ->RenderString("type", "ACTIONANDADVENTURE")
-      ->StartObject("author")
-      ->RenderString("name", "robert")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, EnumValuesInCamelCaseAreAccepted) {
-  Book book;
-  book.set_title("Some Book");
-  book.set_type(google::protobuf::testing::Book_Type_ACTION_AND_ADVENTURE);
-  Author* robert = book.mutable_author();
-  robert->set_name("robert");
-
-  options_.use_lower_camel_for_enums = true;
-  ResetProtoWriter();
-
-  ow_->StartObject("")
-      ->RenderString("title", "Some Book")
-      ->RenderString("type", "actionAndAdventure")
-      ->StartObject("author")
-      ->RenderString("name", "robert")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest,
-       EnumValuesInCamelCaseWithNameNotUppercaseAreAccepted) {
-  Book book;
-  book.set_title("Some Book");
-  book.set_type(google::protobuf::testing::Book_Type_arts_and_photography);
-  Author* robert = book.mutable_author();
-  robert->set_name("robert");
-
-  options_.use_lower_camel_for_enums = true;
-  ResetProtoWriter();
-
-  ow_->StartObject("")
-      ->RenderString("title", "Some Book")
-      ->RenderString("type", "artsAndPhotography")
-      ->StartObject("author")
-      ->RenderString("name", "robert")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(book);
-}
-
 TEST_P(ProtoStreamObjectWriterTest, PrimitiveFromStringConversion) {
   Primitive full;
   full.set_fix32(101);
@@ -812,132 +709,6 @@
   CheckOutput(expected);
 }
 
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownFieldAtRoot) {
-  Book empty;
-
-  options_.ignore_unknown_fields = true;
-  ResetProtoWriter();
-
-  EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
-  ow_->StartObject("")->RenderString("unknown", "Nope!")->EndObject();
-  CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownFieldAtAuthorFriend) {
-  Book expected;
-  Author* paul = expected.mutable_author();
-  paul->set_name("Paul");
-  Author* mark = paul->add_friend_();
-  mark->set_name("Mark");
-  Author* john = paul->add_friend_();
-  john->set_name("John");
-  Author* luke = paul->add_friend_();
-  luke->set_name("Luke");
-
-  options_.ignore_unknown_fields = true;
-  ResetProtoWriter();
-
-  EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("author")
-      ->RenderString("name", "Paul")
-      ->StartList("friend")
-      ->StartObject("")
-      ->RenderString("name", "Mark")
-      ->EndObject()
-      ->StartObject("")
-      ->RenderString("name", "John")
-      ->RenderString("address", "Patmos")
-      ->EndObject()
-      ->StartObject("")
-      ->RenderString("name", "Luke")
-      ->EndObject()
-      ->EndList()
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownObjectAtRoot) {
-  Book empty;
-
-  options_.ignore_unknown_fields = true;
-  ResetProtoWriter();
-
-  EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
-                                     StringPiece("Cannot find field.")))
-      .Times(0);
-  ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject();
-  CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownObjectAtAuthor) {
-  Book expected;
-  Author* author = expected.mutable_author();
-  author->set_name("William");
-  author->add_pseudonym("Bill");
-
-  options_.ignore_unknown_fields = true;
-  ResetProtoWriter();
-
-  EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("author")
-      ->RenderString("name", "William")
-      ->StartObject("wife")
-      ->RenderString("name", "Hilary")
-      ->EndObject()
-      ->RenderString("pseudonym", "Bill")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownListAtRoot) {
-  Book empty;
-
-  options_.ignore_unknown_fields = true;
-  ResetProtoWriter();
-
-  EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
-  ow_->StartObject("")->StartList("unknown")->EndList()->EndObject();
-  CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownListAtPublisher) {
-  Book expected;
-  expected.set_title("Brainwashing");
-  Publisher* publisher = expected.mutable_publisher();
-  publisher->set_name("propaganda");
-
-  options_.ignore_unknown_fields = true;
-  ResetProtoWriter();
-
-  EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("publisher")
-      ->RenderString("name", "propaganda")
-      ->StartList("alliance")
-      ->EndList()
-      ->EndObject()
-      ->RenderString("title", "Brainwashing")
-      ->EndObject();
-  CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, AcceptUnknownEnumValue) {
-  ResetTypeInfo(Proto3Message::descriptor());
-
-  Proto3Message expected;
-  expected.set_enum_value(static_cast<Proto3Message::NestedEnum>(12345));
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->RenderInt32("enumValue", 12345)
-      ->EndObject();
-  CheckOutput(expected);
-}
-
 TEST_P(ProtoStreamObjectWriterTest, MissingRequiredField) {
   Book expected;
   expected.set_title("My Title");
@@ -1096,7 +867,7 @@
     : public BaseProtoStreamObjectWriterTest {
  protected:
   ProtoStreamObjectWriterTimestampDurationTest() {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(TimestampDuration::descriptor());
     descriptors.push_back(google::protobuf::Timestamp::descriptor());
     descriptors.push_back(google::protobuf::Duration::descriptor());
@@ -1450,9 +1221,9 @@
       InvalidValue(
           _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
           StringPiece(
-              "Field 'ts', Invalid data type for timestamp, value is 1")))
+              "Field 'ts', Invalid data type for timestamp, value is null")))
       .With(Args<0>(HasObjectLocation("ts")));
-  ow_->StartObject("")->RenderInt32("ts", 1)->EndObject();
+  ow_->StartObject("")->RenderNull("ts")->EndObject();
   CheckOutput(timestamp);
 }
 
@@ -1464,22 +1235,8 @@
       InvalidValue(
           _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
           StringPiece(
-              "Field 'dur', Invalid data type for duration, value is 1")))
+              "Field 'dur', Invalid data type for duration, value is null")))
       .With(Args<0>(HasObjectLocation("dur")));
-  ow_->StartObject("")->RenderInt32("dur", 1)->EndObject();
-  CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, TimestampAcceptsNull) {
-  TimestampDuration timestamp;
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")->RenderNull("ts")->EndObject();
-  CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, DurationAcceptsNull) {
-  TimestampDuration duration;
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
   ow_->StartObject("")->RenderNull("dur")->EndObject();
   CheckOutput(duration);
 }
@@ -1491,7 +1248,7 @@
 
   // Resets ProtoWriter with current set of options and other state.
   void ResetProtoWriter() {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(StructType::descriptor());
     descriptors.push_back(google::protobuf::Struct::descriptor());
     ResetTypeInfo(descriptors);
@@ -1541,28 +1298,6 @@
   CheckOutput(struct_type);
 }
 
-TEST_P(ProtoStreamObjectWriterStructTest, StructAcceptsNull) {
-  StructType struct_type;
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-
-  ow_->StartObject("")->RenderNull("object")->EndObject();
-  CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, StructValuePreservesNull) {
-  StructType struct_type;
-  (*struct_type.mutable_object()->mutable_fields())["key"].set_null_value(
-      google::protobuf::NULL_VALUE);
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-
-  ow_->StartObject("")
-      ->StartObject("object")
-      ->RenderNull("key")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(struct_type);
-}
-
 TEST_P(ProtoStreamObjectWriterStructTest, SimpleRepeatedStructMapKeyTest) {
   EXPECT_CALL(
       listener_,
@@ -1611,7 +1346,7 @@
 TEST_P(ProtoStreamObjectWriterStructTest, OptionStructIntAsStringsTest) {
   StructType struct_type;
   google::protobuf::Struct* s = struct_type.mutable_object();
-  s->mutable_fields()->operator[]("k1").set_string_value("123");
+  s->mutable_fields()->operator[]("k1").set_number_value(123);
   s->mutable_fields()->operator[]("k2").set_bool_value(true);
   s->mutable_fields()->operator[]("k3").set_string_value("-222222222");
   s->mutable_fields()->operator[]("k4").set_string_value("33333333");
@@ -1630,15 +1365,6 @@
   CheckOutput(struct_type);
 }
 
-TEST_P(ProtoStreamObjectWriterStructTest, ValuePreservesNull) {
-  ValueWrapper value;
-  value.mutable_value()->set_null_value(google::protobuf::NULL_VALUE);
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")->RenderNull("value")->EndObject();
-  CheckOutput(value);
-}
-
 class ProtoStreamObjectWriterMapTest : public BaseProtoStreamObjectWriterTest {
  protected:
   ProtoStreamObjectWriterMapTest()
@@ -1682,16 +1408,13 @@
 class ProtoStreamObjectWriterAnyTest : public BaseProtoStreamObjectWriterTest {
  protected:
   ProtoStreamObjectWriterAnyTest() {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(AnyOut::descriptor());
-    descriptors.push_back(Book::descriptor());
-    descriptors.push_back(google::protobuf::Any::descriptor());
     descriptors.push_back(google::protobuf::DoubleValue::descriptor());
-    descriptors.push_back(google::protobuf::FieldMask::descriptor());
-    descriptors.push_back(google::protobuf::Int32Value::descriptor());
-    descriptors.push_back(google::protobuf::Struct::descriptor());
     descriptors.push_back(google::protobuf::Timestamp::descriptor());
+    descriptors.push_back(google::protobuf::Any::descriptor());
     descriptors.push_back(google::protobuf::Value::descriptor());
+    descriptors.push_back(google::protobuf::Struct::descriptor());
     ResetTypeInfo(descriptors);
   }
 };
@@ -1724,7 +1447,8 @@
   any->set_type_url("type.googleapis.com/google.protobuf.Any");
 
   ::google::protobuf::Any nested_any;
-  nested_any.set_type_url("type.googleapis.com/google.protobuf.testing.AnyM");
+  nested_any.set_type_url(
+      "type.googleapis.com/google.protobuf.testing.anys.AnyM");
 
   AnyM m;
   m.set_foo("foovalue");
@@ -1737,12 +1461,11 @@
       ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
       ->StartObject("value")
       ->RenderString("@type",
-                     "type.googleapis.com/google.protobuf.testing.AnyM")
+                     "type.googleapis.com/google.protobuf.testing.anys.AnyM")
       ->RenderString("foo", "foovalue")
       ->EndObject()
       ->EndObject()
       ->EndObject();
-  CheckOutput(out, 107);
 }
 
 TEST_P(ProtoStreamObjectWriterAnyTest, DoubleRecursiveAny) {
@@ -1755,7 +1478,7 @@
 
   ::google::protobuf::Any second_nested_any;
   second_nested_any.set_type_url(
-      "type.googleapis.com/google.protobuf.testing.AnyM");
+      "type.googleapis.com/google.protobuf.testing.anys.AnyM");
 
   AnyM m;
   m.set_foo("foovalue");
@@ -1771,110 +1494,18 @@
       ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
       ->StartObject("value")
       ->RenderString("@type",
-                     "type.googleapis.com/google.protobuf.testing.AnyM")
+                     "type.googleapis.com/google.protobuf.testing.anys.AnyM")
       ->RenderString("foo", "foovalue")
       ->EndObject()
       ->EndObject()
       ->EndObject()
       ->EndObject();
-  CheckOutput(out, 151);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEnd) {
-  Book book;
-  book.set_title("C++");
-  book.set_length(1234);
-  book.set_content("Hello World!");
-
-  ::google::protobuf::Any any;
-  any.PackFrom(book);
-
-  ::google::protobuf::Any outer_any;
-  outer_any.PackFrom(any);
-
-  AnyOut out;
-  out.mutable_any()->PackFrom(outer_any);
-
-  // Put the @type field at the end of each Any message. Parsers should
-  // be able to accept that.
-  ow_->StartObject("")
-      ->StartObject("any")
-      ->StartObject("value")
-      ->StartObject("value")
-      ->RenderString("title", "C++")
-      ->RenderInt32("length", 1234)
-      ->RenderBytes("content", "Hello World!")
-      ->RenderString("@type",
-                     "type.googleapis.com/google.protobuf.testing.Book")
-      ->EndObject()
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
-      ->EndObject()
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(out);
-}
-
-// Same as TypeUrlAtEnd, but use temporary string values to make sure we don't
-// mistakenly store StringPiece objects pointing to invalid memory.
-TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEndWithTemporaryStrings) {
-  Book book;
-  book.set_title("C++");
-  book.set_length(1234);
-  book.set_content("Hello World!");
-
-  ::google::protobuf::Any any;
-  any.PackFrom(book);
-
-  ::google::protobuf::Any outer_any;
-  outer_any.PackFrom(any);
-
-  AnyOut out;
-  out.mutable_any()->PackFrom(outer_any);
-
-  string name, value;
-  // Put the @type field at the end of each Any message. Parsers should
-  // be able to accept that.
-  ow_->StartObject("")->StartObject("any");
-  {
-    ow_->StartObject("value");
-    {
-      ow_->StartObject("value");
-      {
-        name = "title";
-        value = "C++";
-        ow_->RenderString(name, value);
-        name = "length";
-        ow_->RenderInt32(name, 1234);
-        name = "content";
-        value = "Hello World!";
-        ow_->RenderBytes(name, value);
-        name = "@type";
-        value = "type.googleapis.com/google.protobuf.testing.Book";
-        ow_->RenderString(name, value);
-      }
-      ow_->EndObject();
-
-      name = "@type";
-      value = "type.googleapis.com/google.protobuf.Any";
-      ow_->RenderString(name, value);
-    }
-    ow_->EndObject();
-
-    name = "@type";
-    value = "type.googleapis.com/google.protobuf.Any";
-    ow_->RenderString(name, value);
-  }
-  ow_->EndObject()->EndObject();
-  CheckOutput(out);
 }
 
 TEST_P(ProtoStreamObjectWriterAnyTest, EmptyAnyFromEmptyObject) {
   AnyOut out;
   out.mutable_any();
 
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-
   ow_->StartObject("")->StartObject("any")->EndObject()->EndObject();
 
   CheckOutput(out, 2);
@@ -1883,10 +1514,11 @@
 TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails1) {
   AnyOut any;
 
-  EXPECT_CALL(listener_,
-              InvalidValue(_, StringPiece("Any"),
-                           StringPiece("Missing @type for any field in "
-                                       "google.protobuf.testing.AnyOut")));
+  EXPECT_CALL(
+      listener_,
+      InvalidValue(_, StringPiece("Any"),
+                   StringPiece("Missing or invalid @type for any field in "
+                               "google.protobuf.testing.anys.AnyOut")));
 
   ow_->StartObject("")
       ->StartObject("any")
@@ -1900,10 +1532,11 @@
 TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails2) {
   AnyOut any;
 
-  EXPECT_CALL(listener_,
-              InvalidValue(_, StringPiece("Any"),
-                           StringPiece("Missing @type for any field in "
-                                       "google.protobuf.testing.AnyOut")));
+  EXPECT_CALL(
+      listener_,
+      InvalidValue(_, StringPiece("Any"),
+                   StringPiece("Missing or invalid @type for any field in "
+                               "google.protobuf.testing.anys.AnyOut")));
 
   ow_->StartObject("")
       ->StartObject("any")
@@ -1917,10 +1550,11 @@
 TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails3) {
   AnyOut any;
 
-  EXPECT_CALL(listener_,
-              InvalidValue(_, StringPiece("Any"),
-                           StringPiece("Missing @type for any field in "
-                                       "google.protobuf.testing.AnyOut")));
+  EXPECT_CALL(
+      listener_,
+      InvalidValue(_, StringPiece("Any"),
+                   StringPiece("Missing or invalid @type for any field in "
+                               "google.protobuf.testing.anys.AnyOut")));
 
   ow_->StartObject("")
       ->StartObject("any")
@@ -1965,21 +1599,9 @@
   CheckOutput(any);
 }
 
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyIncorrectInputTypeFails) {
+TEST_P(ProtoStreamObjectWriterAnyTest, AnyNullInputFails) {
   AnyOut any;
 
-  EXPECT_CALL(
-      listener_,
-      InvalidValue(_, StringPiece("type.googleapis.com/google.protobuf.Any"),
-                   StringPiece("1")));
-  ow_->StartObject("")->RenderInt32("any", 1)->EndObject();
-  CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyAcceptsNull) {
-  AnyOut any;
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
   ow_->StartObject("")->RenderNull("any")->EndObject();
   CheckOutput(any);
 }
@@ -2217,116 +1839,11 @@
   CheckOutput(any);
 }
 
-// {
-//   "any": {
-//     "@type": "type.googleapis.com/google.protobuf.Any",
-//     "value": null
-//   }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyInAnyAcceptsNull) {
-  AnyOut out;
-  google::protobuf::Any empty;
-  out.mutable_any()->PackFrom(empty);
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("any")
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
-      ->RenderNull("value")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(out);
-}
-
-// {
-//   "any": {
-//     "@type": "type.googleapis.com/google.protobuf.Timestamp",
-//     "value": null
-//   }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, TimestampInAnyAcceptsNull) {
-  AnyOut out;
-  google::protobuf::Timestamp empty;
-  out.mutable_any()->PackFrom(empty);
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("any")
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.Timestamp")
-      ->RenderNull("value")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(out);
-}
-
-// {
-//   "any": {
-//     "@type": "type.googleapis.com/google.protobuf.Duration",
-//     "value": null
-//   }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, DurationInAnyAcceptsNull) {
-  AnyOut out;
-  google::protobuf::Duration empty;
-  out.mutable_any()->PackFrom(empty);
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("any")
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.Duration")
-      ->RenderNull("value")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(out);
-}
-
-// {
-//   "any": {
-//     "@type": "type.googleapis.com/google.protobuf.FieldMask",
-//     "value": null
-//   }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, FieldMaskInAnyAcceptsNull) {
-  AnyOut out;
-  google::protobuf::FieldMask empty;
-  out.mutable_any()->PackFrom(empty);
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("any")
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.FieldMask")
-      ->RenderNull("value")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(out);
-}
-
-// {
-//   "any": {
-//     "@type": "type.googleapis.com/google.protobuf.Int32Value",
-//     "value": null
-//   }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, WrapperInAnyAcceptsNull) {
-  AnyOut out;
-  google::protobuf::Int32Value empty;
-  out.mutable_any()->PackFrom(empty);
-
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->StartObject("any")
-      ->RenderString("@type", "type.googleapis.com/google.protobuf.Int32Value")
-      ->RenderNull("value")
-      ->EndObject()
-      ->EndObject();
-  CheckOutput(out);
-}
-
 class ProtoStreamObjectWriterFieldMaskTest
     : public BaseProtoStreamObjectWriterTest {
  protected:
   ProtoStreamObjectWriterFieldMaskTest() {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(FieldMaskTest::descriptor());
     descriptors.push_back(google::protobuf::FieldMask::descriptor());
     ResetTypeInfo(descriptors);
@@ -2567,41 +2084,11 @@
   CheckOutput(expected);
 }
 
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, FieldMaskAcceptsNull) {
-  FieldMaskTest expected;
-  EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")->RenderNull("single_mask")->EndObject();
-  CheckOutput(expected);
-}
-
-class ProtoStreamObjectWriterWrappersTest
-    : public BaseProtoStreamObjectWriterTest {
- protected:
-  ProtoStreamObjectWriterWrappersTest() {
-    std::vector<const Descriptor*> descriptors;
-    descriptors.push_back(Int32Wrapper::descriptor());
-    descriptors.push_back(google::protobuf::Int32Value::descriptor());
-    ResetTypeInfo(descriptors);
-  }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
-                        ProtoStreamObjectWriterWrappersTest,
-                        ::testing::Values(
-                            testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterWrappersTest, WrapperAcceptsNull) {
-  Int32Wrapper wrapper;
-  EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
-  ow_->StartObject("")->RenderNull("int32")->EndObject();
-  CheckOutput(wrapper);
-}
-
 class ProtoStreamObjectWriterOneOfsTest
     : public BaseProtoStreamObjectWriterTest {
  protected:
   ProtoStreamObjectWriterOneOfsTest() {
-    std::vector<const Descriptor*> descriptors;
+    vector<const Descriptor*> descriptors;
     descriptors.push_back(OneOfsRequest::descriptor());
     descriptors.push_back(google::protobuf::Struct::descriptor());
     ResetTypeInfo(descriptors);
@@ -2764,6 +2251,7 @@
                            StringPiece("oneof field 'data' is already set. "
                                        "Cannot set 'intData'")));
 
+  using google::protobuf::testing::oneofs::OneOfsRequest;
   // JSON:
   // { "anyData":
   //    { "@type":
diff --git a/src/google/protobuf/util/internal/testdata/anys.proto b/src/google/protobuf/util/internal/testdata/anys.proto
index a9ebca3..18c59cb 100644
--- a/src/google/protobuf/util/internal/testdata/anys.proto
+++ b/src/google/protobuf/util/internal/testdata/anys.proto
@@ -28,75 +28,16 @@
 // (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 to test Proto3 Any serialization.
 syntax = "proto3";
 
-package google.protobuf.testing;
+package google.protobuf.testing.anys;
+option java_package = "com.google.protobuf.testing.anys";
 
 import "google/protobuf/any.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/duration.proto";
-import "google/protobuf/wrappers.proto";
-
-// Top-level test cases proto used by MarshallingTest. See description
-// at the top of the class MarshallingTest for details on how to write
-// test cases.
-message AnyTestCases {
-  AnyWrapper empty_any = 1;
-  AnyWrapper type_only_any = 2;
-  AnyWrapper wrapper_any = 3;
-  AnyWrapper any_with_timestamp_value = 4;
-  AnyWrapper any_with_duration_value = 5;
-  AnyWrapper any_with_struct_value = 6;
-  AnyWrapper recursive_any = 7;
-  AnyWrapper any_with_message_value = 8;
-  AnyWrapper any_with_nested_message = 9;
-  AnyWrapper any_with_message_with_wrapper_type = 10;
-  AnyWrapper any_with_message_with_timestamp = 11;
-  AnyWrapper any_with_message_containing_map = 12;
-  AnyWrapper any_with_message_containing_struct = 13;
-  AnyWrapper any_with_message_containing_repeated_message = 14;
-  AnyWrapper recursive_any_with_type_field_at_end = 15;
-
-  google.protobuf.Any top_level_any = 50;
-  google.protobuf.Any top_level_any_with_type_field_at_end = 51;
-}
-
-message AnyWrapper {
-  google.protobuf.Any any = 1;
-}
-
-// Hack to make sure the types we put into the any are included in the types.
-// Real solution is to add these types to the service config.
-message Imports {
-  google.protobuf.DoubleValue dbl = 1;
-  google.protobuf.Struct struct = 2;
-  google.protobuf.Timestamp timestamp = 3;
-  google.protobuf.Duration duration = 4;
-  google.protobuf.Int32Value i32 = 5;
-  Data data = 100;
-}
-
-message Data {
-  int32 attr = 1;
-  string str = 2;
-  repeated string msgs = 3;
-  Data nested_data = 4;
-  google.protobuf.Int32Value int_wrapper = 5;
-  google.protobuf.Timestamp time = 6;
-  map<string, string> map_data = 7;
-  google.protobuf.Struct struct_data = 8;
-  repeated Data repeated_data = 9;
-}
-
-service AnyTestService {
-  rpc Call(AnyTestCases) returns (AnyTestCases);
-  rpc Call1(Imports) returns (Imports);
-}
 
 message AnyIn {
   string something = 1;
-  google.protobuf.Any any = 2;
 }
 
 message AnyOut {
@@ -106,3 +47,7 @@
 message AnyM {
   string foo = 1;
 }
+
+service TestService {
+  rpc Call(AnyIn) returns (AnyOut);
+}
diff --git a/src/google/protobuf/util/internal/testdata/books.proto b/src/google/protobuf/util/internal/testdata/books.proto
index 869271f..1cbbba4 100644
--- a/src/google/protobuf/util/internal/testdata/books.proto
+++ b/src/google/protobuf/util/internal/testdata/books.proto
@@ -31,10 +31,6 @@
 // Author: sven@google.com (Sven Mawson)
 //
 // Sample protos for testing.
-
-// Some of the older enums don't use CAPITALS_WITH_UNDERSCORES for testing.
-// LINT: LEGACY_NAMES
-
 syntax = "proto2";
 
 package google.protobuf.testing;
@@ -64,7 +60,6 @@
     FICTION = 1;
     KIDS = 2;
     ACTION_AND_ADVENTURE = 3;
-    arts_and_photography = 4;
   }
   optional Type type = 11;
 
@@ -190,12 +185,3 @@
   repeated Author m_author = 5;
   optional Cyclic m_cyclic = 4;
 }
-
-// Test that two messages can have different fields mapped to the same JSON
-// name. See: https://github.com/google/protobuf/issues/1415
-message TestJsonName1 {
-  optional int32 one_value = 1 [json_name = "value"];
-}
-message TestJsonName2 {
-  optional int32 another_value = 1 [json_name = "value"];
-}
diff --git a/src/google/protobuf/util/internal/testdata/maps.proto b/src/google/protobuf/util/internal/testdata/maps.proto
index 0f381b3..6475ecd 100644
--- a/src/google/protobuf/util/internal/testdata/maps.proto
+++ b/src/google/protobuf/util/internal/testdata/maps.proto
@@ -28,76 +28,11 @@
 // (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 to test proto3 maps.
 syntax = "proto3";
 
-package google.protobuf.testing;
-
-// Top-level test cases proto used by MarshallingTest. See description
-// at the top of the class MarshallingTest for details on how to write
-// test cases.
-message MapsTestCases {
-  EmptyMap empty_map = 1;
-  StringtoInt string_to_int = 2;
-  IntToString int_to_string = 3;
-  Mixed1 mixed1 = 4;
-  Mixed2 mixed2 = 5;
-  MapOfObjects map_of_objects = 6;
-
-  // Empty key tests
-  StringtoInt empty_key_string_to_int1 = 7;
-  StringtoInt empty_key_string_to_int2 = 8;
-  StringtoInt empty_key_string_to_int3 = 9;
-  BoolToString empty_key_bool_to_string = 10;
-  IntToString empty_key_int_to_string = 11;
-  Mixed1 empty_key_mixed = 12;
-  MapOfObjects empty_key_map_objects = 13;
-}
-
-message EmptyMap {
-  map<int32, int32> map = 1;
-}
-
-message StringtoInt {
-  map<string, int32> map = 1;
-}
-
-message IntToString {
-  map<int32, string> map = 1;
-}
-
-message BoolToString {
-  map<bool, string> map = 1;
-}
-
-message Mixed1 {
-  string msg = 1;
-  map<string, float> map = 2;
-}
-
-message Mixed2 {
-  enum E {
-    E0 = 0;
-    E1 = 1;
-    E2 = 2;
-    E3 = 3;
-  }
-  map<int32, bool> map = 1;
-  E ee = 2;
-}
-
-message MapOfObjects {
-  message M {
-    string inner_text = 1;
-  }
-  map<string, M> map = 1;
-}
-
-message DummyRequest {
-}
-
-service MapsTestService {
-  rpc Call(DummyRequest) returns (MapsTestCases);
-}
+package google.protobuf.testing.maps;
+option java_package = "com.google.protobuf.testing.maps";
 
 message MapIn {
   string other = 1;
@@ -144,3 +79,8 @@
 message MapM {
   string foo = 1;
 }
+
+service TestService {
+  rpc Call1(MapIn) returns (MapOut);
+  rpc Call2(MapIn) returns (MapOut);
+}
diff --git a/src/google/protobuf/util/internal/testdata/oneofs.proto b/src/google/protobuf/util/internal/testdata/oneofs.proto
index c37da08..5bc9fa0 100644
--- a/src/google/protobuf/util/internal/testdata/oneofs.proto
+++ b/src/google/protobuf/util/internal/testdata/oneofs.proto
@@ -28,7 +28,7 @@
 // (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 to test proto3 oneofs.
+// Proto to test oneofs.
 syntax = "proto3";
 
 import "google/protobuf/any.proto";
@@ -36,6 +36,7 @@
 import "google/protobuf/timestamp.proto";
 
 package google.protobuf.testing.oneofs;
+option java_package = "com.google.protobuf.testing.oneofs";
 
 message OneOfsRequest {
   string value = 1;
@@ -44,34 +45,24 @@
     int32 int_data = 3;
     // Simple message
     Data message_data = 4;
-    MoreData more_data = 5;
     // Well known types
-    google.protobuf.Struct struct_data = 6;
-    google.protobuf.Value value_data = 7;
-    google.protobuf.ListValue list_value_data = 8;
-    google.protobuf.Timestamp ts_data = 9;
+    google.protobuf.Struct struct_data = 5;
+    google.protobuf.Value value_data = 6;
+    google.protobuf.ListValue list_value_data = 7;
+    google.protobuf.Timestamp ts_data = 8;
   }
   google.protobuf.Any any_data = 19;
 }
 
-message RequestWithSimpleOneof {
-  string value = 1;
-  oneof data {
-    string str_data = 2;
-    int32 int_data = 3;
-    Data message_data = 4;
-    MoreData more_data = 5;
-  }
-}
-
 message Data {
   int32 data_value = 1;
 }
 
-message MoreData {
-  string str_value = 1;
-}
-
 message Response {
   string value = 1;
 }
+
+service TestService {
+  // Test call.
+  rpc Call(OneOfsRequest) returns (Response);
+}
diff --git a/src/google/protobuf/util/internal/testdata/proto3.proto b/src/google/protobuf/util/internal/testdata/proto3.proto
deleted file mode 100644
index c013cee..0000000
--- a/src/google/protobuf/util/internal/testdata/proto3.proto
+++ /dev/null
@@ -1,42 +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.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-message Proto3Message {
-  enum NestedEnum {
-    FOO = 0;
-    BAR = 1;
-    BAZ = 2;
-  }
-  NestedEnum enum_value = 1;
-}
diff --git a/src/google/protobuf/util/internal/testdata/struct.proto b/src/google/protobuf/util/internal/testdata/struct.proto
index 7b1cc1b..c15aba0 100644
--- a/src/google/protobuf/util/internal/testdata/struct.proto
+++ b/src/google/protobuf/util/internal/testdata/struct.proto
@@ -28,90 +28,18 @@
 // (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 to test proto3 struct.
 syntax = "proto3";
 
-package google.protobuf.testing;
+package google.protobuf.testing.structs;
+option java_package = "com.google.protobuf.testing.structs";
 
 import "google/protobuf/struct.proto";
 
-message StructTestCases {
-  StructWrapper empty_value = 1;
-  StructWrapper empty_value2 = 2;
-  StructWrapper null_value = 3;
-  StructWrapper simple_struct = 4;
-  StructWrapper longer_struct = 5;
-  StructWrapper struct_with_nested_struct = 6;
-  StructWrapper struct_with_nested_list = 7;
-  StructWrapper struct_with_list_of_nulls = 8;
-  StructWrapper struct_with_list_of_lists = 9;
-  StructWrapper struct_with_list_of_structs = 10;
-  StructWrapper struct_with_empty_list = 11;
-  StructWrapper struct_with_list_with_empty_struct = 12;
-  google.protobuf.Struct top_level_struct = 13;
-  google.protobuf.Struct top_level_struct_with_empty_list = 14;
-  google.protobuf.Struct top_level_struct_with_list_with_empty_struct = 15;
-  ValueWrapper value_wrapper_simple = 16;
-  ValueWrapper value_wrapper_with_struct = 17;
-  ValueWrapper value_wrapper_with_list = 18;
-  ValueWrapper value_wrapper_with_empty_list = 19;
-  ValueWrapper value_wrapper_with_list_with_empty_struct = 20;
-  ListValueWrapper list_value_wrapper = 21;
-  ListValueWrapper list_value_wrapper_with_empty_list = 22;
-  ListValueWrapper list_value_wrapper_with_list_with_empty_struct = 23;
-  google.protobuf.Value top_level_value_simple = 24;
-  google.protobuf.Value top_level_value_with_struct = 25;
-  google.protobuf.Value top_level_value_with_list = 26;
-  google.protobuf.Value top_level_value_with_empty_list = 27;
-  google.protobuf.Value top_level_value_with_list_with_empty_struct = 28;
-  google.protobuf.ListValue top_level_listvalue = 29;
-  google.protobuf.ListValue top_level_empty_listvalue = 30;
-  google.protobuf.ListValue top_level_listvalue_with_empty_struct = 31;
-  RepeatedValueWrapper repeated_value = 32;
-  RepeatedValueWrapper repeated_value_nested_list = 33;
-  RepeatedValueWrapper repeated_value_nested_list2 = 34;
-  RepeatedValueWrapper repeated_value_nested_list3 = 35;
-  RepeatedListValueWrapper repeated_listvalue = 36;
-  MapOfStruct map_of_struct = 37;
-  MapOfStruct map_of_struct_value = 38;
-  MapOfStruct map_of_listvalue = 39;
-}
-
-message StructWrapper {
-  google.protobuf.Struct struct = 1;
-}
-
-message ValueWrapper {
-  google.protobuf.Value value = 1;
-}
-
-message RepeatedValueWrapper {
-  repeated google.protobuf.Value values = 1;
-}
-
-message ListValueWrapper {
-  google.protobuf.ListValue shopping_list = 1;
-}
-
-message RepeatedListValueWrapper {
-  repeated google.protobuf.ListValue dimensions = 1;
-}
-
-message MapOfStruct {
-  map<string, google.protobuf.Struct> struct_map = 1;
-  map<string, google.protobuf.Value> value_map = 2;
-  map<string, google.protobuf.ListValue> listvalue_map = 3;
-}
-
-// Hack to test return types with Struct as top-level message. Struct typers
-// cannot be directly used in API requests. Hence using Dummy as request type.
-message Dummy {
-  string text = 1;
-}
-
-service StructTestService {
-  rpc Call(Dummy) returns (StructTestCases);
-}
-
 message StructType {
   google.protobuf.Struct object = 1;
 }
+
+service TestService {
+  rpc Call(StructType) returns (StructType);
+}
diff --git a/src/google/protobuf/util/internal/testdata/timestamp_duration.proto b/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
index b74484c..56351f1 100644
--- a/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
+++ b/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
@@ -28,53 +28,20 @@
 // (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 to test proto3 Timestamp and Duration.
 syntax = "proto3";
 
-package google.protobuf.testing;
+package google.protobuf.testing.timestampduration;
+option java_package = "com.google.protobuf.testing.timestampduration";
 
 import "google/protobuf/timestamp.proto";
 import "google/protobuf/duration.proto";
 
-message TimestampDurationTestCases {
-  // Timestamp tests
-  TimeStampType epoch = 1;
-  TimeStampType epoch2 = 2;
-  TimeStampType mintime = 3;
-  TimeStampType maxtime = 4;
-  TimeStampType timeval1 = 5;
-  TimeStampType timeval2 = 6;
-  TimeStampType timeval3 = 7;
-  TimeStampType timeval4 = 8;
-  TimeStampType timeval5 = 9;
-  TimeStampType timeval6 = 10;
-  TimeStampType timeval7 = 11;
-  google.protobuf.Timestamp timeval8 = 12;
-
-  // Duration tests
-  DurationType zero_duration = 101;
-  DurationType min_duration = 102;
-  DurationType max_duration = 103;
-  DurationType duration1 = 104;
-  DurationType duration2 = 105;
-  DurationType duration3 = 106;
-  DurationType duration4 = 107;
-  google.protobuf.Duration duration5 = 108;
-}
-
-message TimeStampType {
-  google.protobuf.Timestamp timestamp = 1;
-}
-
-message DurationType {
-  google.protobuf.Duration duration = 1;
-}
-
-service TimestampDurationTestService {
-  rpc Call(TimestampDurationTestCases) returns (TimestampDurationTestCases);
-}
-
 message TimestampDuration {
   google.protobuf.Timestamp ts = 1;
   google.protobuf.Duration dur = 2;
-  repeated google.protobuf.Timestamp rep_ts = 3;
+}
+
+service TestService {
+  rpc Call(TimestampDuration) returns (TimestampDuration);
 }
diff --git a/src/google/protobuf/util/internal/type_info.cc b/src/google/protobuf/util/internal/type_info.cc
index 85d0d5c..00a8ee7 100644
--- a/src/google/protobuf/util/internal/type_info.cc
+++ b/src/google/protobuf/util/internal/type_info.cc
@@ -60,8 +60,7 @@
 
   virtual util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
       StringPiece type_url) const {
-    std::map<StringPiece, StatusOrType>::iterator it =
-        cached_types_.find(type_url);
+    map<StringPiece, StatusOrType>::iterator it = cached_types_.find(type_url);
     if (it != cached_types_.end()) {
       return it->second;
     }
@@ -86,8 +85,7 @@
 
   virtual const google::protobuf::Enum* GetEnumByTypeUrl(
       StringPiece type_url) const {
-    std::map<StringPiece, StatusOrEnum>::iterator it =
-        cached_enums_.find(type_url);
+    map<StringPiece, StatusOrEnum>::iterator it = cached_enums_.find(type_url);
     if (it != cached_enums_.end()) {
       return it->second.ok() ? it->second.ValueOrDie() : NULL;
     }
@@ -107,14 +105,12 @@
 
   virtual const google::protobuf::Field* FindField(
       const google::protobuf::Type* type, StringPiece camel_case_name) const {
-    std::map<const google::protobuf::Type*, CamelCaseNameTable>::const_iterator
-        it = indexed_types_.find(type);
-    const CamelCaseNameTable& camel_case_name_table =
-        (it == indexed_types_.end())
-            ? PopulateNameLookupTable(type, &indexed_types_[type])
-            : it->second;
+    if (indexed_types_.find(type) == indexed_types_.end()) {
+      PopulateNameLookupTable(type);
+      indexed_types_.insert(type);
+    }
     StringPiece name =
-        FindWithDefault(camel_case_name_table, camel_case_name, StringPiece());
+        FindWithDefault(camel_case_name_table_, camel_case_name, StringPiece());
     if (name.empty()) {
       // Didn't find a mapping. Use whatever provided.
       name = camel_case_name;
@@ -125,11 +121,10 @@
  private:
   typedef util::StatusOr<const google::protobuf::Type*> StatusOrType;
   typedef util::StatusOr<const google::protobuf::Enum*> StatusOrEnum;
-  typedef std::map<StringPiece, StringPiece> CamelCaseNameTable;
 
   template <typename T>
-  static void DeleteCachedTypes(std::map<StringPiece, T>* cached_types) {
-    for (typename std::map<StringPiece, T>::iterator it = cached_types->begin();
+  static void DeleteCachedTypes(map<StringPiece, T>* cached_types) {
+    for (typename map<StringPiece, T>::iterator it = cached_types->begin();
          it != cached_types->end(); ++it) {
       if (it->second.ok()) {
         delete it->second.ValueOrDie();
@@ -137,35 +132,32 @@
     }
   }
 
-  const CamelCaseNameTable& PopulateNameLookupTable(
-      const google::protobuf::Type* type,
-      CamelCaseNameTable* camel_case_name_table) const {
+  void PopulateNameLookupTable(const google::protobuf::Type* type) const {
     for (int i = 0; i < type->fields_size(); ++i) {
       const google::protobuf::Field& field = type->fields(i);
       StringPiece name = field.name();
       StringPiece camel_case_name = field.json_name();
-      const StringPiece* existing =
-          InsertOrReturnExisting(camel_case_name_table, camel_case_name, name);
+      const StringPiece* existing = InsertOrReturnExisting(
+          &camel_case_name_table_, camel_case_name, name);
       if (existing && *existing != name) {
         GOOGLE_LOG(WARNING) << "Field '" << name << "' and '" << *existing
                      << "' map to the same camel case name '" << camel_case_name
                      << "'.";
       }
     }
-    return *camel_case_name_table;
   }
 
   TypeResolver* type_resolver_;
 
   // Stores string values that will be referenced by StringPieces in
-  // cached_types_, cached_enums_.
-  mutable std::set<string> string_storage_;
+  // cached_types_, cached_enums_ and camel_case_name_table_.
+  mutable set<string> string_storage_;
 
-  mutable std::map<StringPiece, StatusOrType> cached_types_;
-  mutable std::map<StringPiece, StatusOrEnum> cached_enums_;
+  mutable map<StringPiece, StatusOrType> cached_types_;
+  mutable map<StringPiece, StatusOrEnum> cached_enums_;
 
-  mutable std::map<const google::protobuf::Type*, CamelCaseNameTable>
-      indexed_types_;
+  mutable set<const google::protobuf::Type*> indexed_types_;
+  mutable map<StringPiece, StringPiece> camel_case_name_table_;
 };
 }  // namespace
 
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 737ba9e..49e18ed 100644
--- a/src/google/protobuf/util/internal/type_info_test_helper.cc
+++ b/src/google/protobuf/util/internal/type_info_test_helper.cc
@@ -55,7 +55,7 @@
 
 
 void TypeInfoTestHelper::ResetTypeInfo(
-    const std::vector<const Descriptor*>& descriptors) {
+    const vector<const Descriptor*>& descriptors) {
   switch (type_) {
     case USE_TYPE_RESOLVER: {
       const DescriptorPool* pool = descriptors[0]->file()->pool();
@@ -73,14 +73,14 @@
 }
 
 void TypeInfoTestHelper::ResetTypeInfo(const Descriptor* descriptor) {
-  std::vector<const Descriptor*> descriptors;
+  vector<const Descriptor*> descriptors;
   descriptors.push_back(descriptor);
   ResetTypeInfo(descriptors);
 }
 
 void TypeInfoTestHelper::ResetTypeInfo(const Descriptor* descriptor1,
                                        const Descriptor* descriptor2) {
-  std::vector<const Descriptor*> descriptors;
+  vector<const Descriptor*> descriptors;
   descriptors.push_back(descriptor1);
   descriptors.push_back(descriptor2);
   ResetTypeInfo(descriptors);
diff --git a/src/google/protobuf/util/internal/type_info_test_helper.h b/src/google/protobuf/util/internal/type_info_test_helper.h
index 1a19671..1a27984 100644
--- a/src/google/protobuf/util/internal/type_info_test_helper.h
+++ b/src/google/protobuf/util/internal/type_info_test_helper.h
@@ -64,7 +64,7 @@
   explicit TypeInfoTestHelper(TypeInfoSource type) : type_(type) {}
 
   // Creates a TypeInfo object for the given set of descriptors.
-  void ResetTypeInfo(const std::vector<const Descriptor*>& descriptors);
+  void ResetTypeInfo(const vector<const Descriptor*>& descriptors);
 
   // Convinent overloads.
   void ResetTypeInfo(const Descriptor* descriptor);
diff --git a/src/google/protobuf/util/internal/utility.cc b/src/google/protobuf/util/internal/utility.cc
index 11780ee..d58de0d 100644
--- a/src/google/protobuf/util/internal/utility.cc
+++ b/src/google/protobuf/util/internal/utility.cc
@@ -30,8 +30,6 @@
 
 #include <google/protobuf/util/internal/utility.h>
 
-#include <algorithm>
-
 #include <google/protobuf/stubs/callback.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
@@ -48,6 +46,16 @@
 namespace util {
 namespace converter {
 
+namespace {
+const StringPiece SkipWhiteSpace(StringPiece str) {
+  StringPiece::size_type i;
+  for (i = 0; i < str.size() && ascii_isspace(str[i]); ++i) {
+  }
+  GOOGLE_DCHECK(i == str.size() || !ascii_isspace(str[i]));
+  return StringPiece(str, i);
+}
+}  // namespace
+
 bool GetBoolOptionOrDefault(
     const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
     const string& option_name, bool default_value) {
@@ -120,15 +128,8 @@
 }
 
 const StringPiece GetTypeWithoutUrl(StringPiece type_url) {
-  if (type_url.size() > kTypeUrlSize && type_url[kTypeUrlSize] == '/') {
-    return type_url.substr(kTypeUrlSize + 1);
-  } else {
-    size_t idx = type_url.rfind('/');
-    if (idx != type_url.npos) {
-      type_url.remove_prefix(idx + 1);
-    }
-    return type_url;
-  }
+  size_t idx = type_url.rfind('/');
+  return type_url.substr(idx + 1);
 }
 
 const string GetFullTypeWithUrl(StringPiece simple_type) {
@@ -173,19 +174,6 @@
   return NULL;
 }
 
-const google::protobuf::Field* FindFieldInTypeByNumberOrNull(
-    const google::protobuf::Type* type, int32 number) {
-  if (type != NULL) {
-    for (int i = 0; i < type->fields_size(); ++i) {
-      const google::protobuf::Field& field = type->fields(i);
-      if (field.number() == number) {
-        return &field;
-      }
-    }
-  }
-  return NULL;
-}
-
 const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
     const google::protobuf::Enum* enum_type, StringPiece enum_name) {
   if (enum_type != NULL) {
@@ -212,32 +200,6 @@
   return NULL;
 }
 
-const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
-    const google::protobuf::Enum* enum_type, StringPiece enum_name) {
-  if (enum_type != NULL) {
-    for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
-      const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
-      string enum_name_without_underscore = enum_value.name();
-
-      // Remove underscore from the name.
-      enum_name_without_underscore.erase(
-          std::remove(enum_name_without_underscore.begin(),
-                      enum_name_without_underscore.end(), '_'),
-          enum_name_without_underscore.end());
-      // Make the name uppercase.
-      for (string::iterator it = enum_name_without_underscore.begin();
-           it != enum_name_without_underscore.end(); ++it) {
-        *it = ascii_toupper(*it);
-      }
-
-      if (enum_name_without_underscore == enum_name) {
-        return &enum_value;
-      }
-    }
-  }
-  return NULL;
-}
-
 string ToCamelCase(const StringPiece input) {
   bool capitalize_next = false;
   bool was_cap = true;
@@ -317,7 +279,7 @@
   return result;
 }
 
-std::set<string>* well_known_types_ = NULL;
+set<string>* well_known_types_ = NULL;
 GOOGLE_PROTOBUF_DECLARE_ONCE(well_known_types_init_);
 const char* well_known_types_name_array_[] = {
     "google.protobuf.Timestamp",   "google.protobuf.Duration",
@@ -330,7 +292,7 @@
 void DeleteWellKnownTypes() { delete well_known_types_; }
 
 void InitWellKnownTypes() {
-  well_known_types_ = new std::set<string>;
+  well_known_types_ = new set<string>;
   for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) {
     well_known_types_->insert(well_known_types_name_array_[i]);
   }
@@ -349,25 +311,15 @@
 
 bool IsMap(const google::protobuf::Field& field,
            const google::protobuf::Type& type) {
-  return field.cardinality() ==
-             google::protobuf::Field_Cardinality_CARDINALITY_REPEATED &&
-         (GetBoolOptionOrDefault(type.options(), "map_entry", false) ||
+  return (field.cardinality() ==
+              google::protobuf::Field_Cardinality_CARDINALITY_REPEATED &&
           GetBoolOptionOrDefault(type.options(),
-                                 "google.protobuf.MessageOptions.map_entry", false) ||
-          GetBoolOptionOrDefault(type.options(),
-                                 "google.protobuf.MessageOptions.map_entry",
-                                 false));
+                                 "google.protobuf.MessageOptions.map_entry", false));
 }
 
 bool IsMessageSetWireFormat(const google::protobuf::Type& type) {
-  return GetBoolOptionOrDefault(type.options(), "message_set_wire_format",
-                                false) ||
-         GetBoolOptionOrDefault(type.options(),
-                                "google.protobuf.MessageOptions.message_set_wire_format",
-                                false) ||
-         GetBoolOptionOrDefault(
-             type.options(),
-             "google.protobuf.MessageOptions.message_set_wire_format", false);
+  return GetBoolOptionOrDefault(
+      type.options(), "google.protobuf.MessageOptions.message_set_wire_format", false);
 }
 
 string DoubleAsString(double value) {
diff --git a/src/google/protobuf/util/internal/utility.h b/src/google/protobuf/util/internal/utility.h
index 667e660..33df8ed 100644
--- a/src/google/protobuf/util/internal/utility.h
+++ b/src/google/protobuf/util/internal/utility.h
@@ -64,10 +64,6 @@
 namespace protobuf {
 namespace util {
 namespace converter {
-
-// Size of "type.googleapis.com"
-static const int64 kTypeUrlSize = 19;
-
 // Finds the tech option identified by option_name. Parses the boolean value and
 // returns it.
 // When the option with the given name is not found, default_value is returned.
@@ -136,10 +132,6 @@
 const google::protobuf::Field* FindJsonFieldInTypeOrNull(
     const google::protobuf::Type* type, StringPiece json_name);
 
-// Similar to FindFieldInTypeOrNull, but this looks up fields by number.
-const google::protobuf::Field* FindFieldInTypeByNumberOrNull(
-    const google::protobuf::Type* type, int32 number);
-
 // Finds and returns the EnumValue identified by enum_name in the passed tech
 // Enum object. Returns NULL if none found.
 const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
@@ -150,13 +142,6 @@
 const google::protobuf::EnumValue* FindEnumValueByNumberOrNull(
     const google::protobuf::Enum* enum_type, int32 value);
 
-// Finds and returns the EnumValue identified by enum_name without underscore in
-// the passed tech Enum object. Returns NULL if none found.
-// For Ex. if enum_name is ACTIONANDADVENTURE it can get accepted if
-// EnumValue's name is action_and_adventure or ACTION_AND_ADVENTURE.
-const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
-    const google::protobuf::Enum* enum_type, StringPiece enum_name);
-
 // Converts input to camel-case and returns it.
 LIBPROTOBUF_EXPORT string ToCamelCase(const StringPiece input);
 
diff --git a/src/google/protobuf/util/json_format_proto3.proto b/src/google/protobuf/util/json_format_proto3.proto
index 8a0441c..a1e24c1 100644
--- a/src/google/protobuf/util/json_format_proto3.proto
+++ b/src/google/protobuf/util/json_format_proto3.proto
@@ -32,8 +32,6 @@
 
 package proto3;
 
-option java_package = "com.google.protobuf.util";
-option java_outer_classname = "JsonFormatProto3";
 
 import "google/protobuf/duration.proto";
 import "google/protobuf/timestamp.proto";
@@ -41,7 +39,6 @@
 import "google/protobuf/struct.proto";
 import "google/protobuf/any.proto";
 import "google/protobuf/field_mask.proto";
-import "google/protobuf/unittest.proto";
 
 enum EnumType {
   FOO = 0;
@@ -177,7 +174,3 @@
 message TestCustomJsonName {
   int32 value = 1 [json_name = "@value"];
 }
-
-message TestExtensions {
-  .protobuf_unittest.TestAllExtensions extensions = 1;
-}
diff --git a/src/google/protobuf/util/json_util.cc b/src/google/protobuf/util/json_util.cc
index ce3569c..2659320 100644
--- a/src/google/protobuf/util/json_util.cc
+++ b/src/google/protobuf/util/json_util.cc
@@ -49,28 +49,23 @@
 namespace util {
 
 namespace internal {
-ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() {
-  stream_->BackUp(buffer_size_);
-}
-
 void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
-  while (true) {
-    if (len <= buffer_size_) {
-      memcpy(buffer_, bytes, len);
-      buffer_ = static_cast<char*>(buffer_) + len;
-      buffer_size_ -= len;
-      return;
-    }
-    if (buffer_size_ > 0) {
-      memcpy(buffer_, bytes, buffer_size_);
-      bytes += buffer_size_;
-      len -= buffer_size_;
-    }
-    if (!stream_->Next(&buffer_, &buffer_size_)) {
+  while (len > 0) {
+    void* buffer;
+    int length;
+    if (!stream_->Next(&buffer, &length)) {
       // There isn't a way for ByteSink to report errors.
-      buffer_size_ = 0;
       return;
     }
+    if (len < length) {
+      memcpy(buffer, bytes, len);
+      stream_->BackUp(length - len);
+      break;
+    } else {
+      memcpy(buffer, bytes, length);
+      bytes += length;
+      len -= length;
+    }
   }
 }
 }  // namespace internal
@@ -79,22 +74,17 @@
                                   const string& type_url,
                                   io::ZeroCopyInputStream* binary_input,
                                   io::ZeroCopyOutputStream* json_output,
-                                  const JsonPrintOptions& options) {
+                                  const JsonOptions& options) {
   io::CodedInputStream in_stream(binary_input);
   google::protobuf::Type type;
   RETURN_IF_ERROR(resolver->ResolveMessageType(type_url, &type));
   converter::ProtoStreamObjectSource proto_source(&in_stream, resolver, type);
-  proto_source.set_use_ints_for_enums(options.always_print_enums_as_ints);
-  proto_source.set_preserve_proto_field_names(
-      options.preserve_proto_field_names);
   io::CodedOutputStream out_stream(json_output);
   converter::JsonObjectWriter json_writer(options.add_whitespace ? " " : "",
                                           &out_stream);
   if (options.always_print_primitive_fields) {
     converter::DefaultValueObjectWriter default_value_writer(
         resolver, type, &json_writer);
-    default_value_writer.set_preserve_proto_field_names(
-        options.preserve_proto_field_names);
     return proto_source.WriteTo(&default_value_writer);
   } else {
     return proto_source.WriteTo(&json_writer);
@@ -105,7 +95,7 @@
                                   const string& type_url,
                                   const string& binary_input,
                                   string* json_output,
-                                  const JsonPrintOptions& options) {
+                                  const JsonOptions& options) {
   io::ArrayInputStream input_stream(binary_input.data(), binary_input.size());
   io::StringOutputStream output_stream(json_output);
   return BinaryToJsonStream(resolver, type_url, &input_stream, &output_stream,
@@ -115,7 +105,7 @@
 namespace {
 class StatusErrorListener : public converter::ErrorListener {
  public:
-  StatusErrorListener() {}
+  StatusErrorListener() : status_(util::Status::OK) {}
   virtual ~StatusErrorListener() {}
 
   util::Status GetStatus() { return status_; }
@@ -151,17 +141,13 @@
 util::Status JsonToBinaryStream(TypeResolver* resolver,
                                   const string& type_url,
                                   io::ZeroCopyInputStream* json_input,
-                                  io::ZeroCopyOutputStream* binary_output,
-                                  const JsonParseOptions& options) {
+                                  io::ZeroCopyOutputStream* binary_output) {
   google::protobuf::Type type;
   RETURN_IF_ERROR(resolver->ResolveMessageType(type_url, &type));
   internal::ZeroCopyStreamByteSink sink(binary_output);
   StatusErrorListener listener;
-  converter::ProtoStreamObjectWriter::Options proto_writer_options;
-  proto_writer_options.ignore_unknown_fields = options.ignore_unknown_fields;
   converter::ProtoStreamObjectWriter proto_writer(resolver, type, &sink,
-                                                  &listener,
-                                                  proto_writer_options);
+                                                  &listener);
 
   converter::JsonStreamParser parser(&proto_writer);
   const void* buffer;
@@ -179,72 +165,10 @@
 util::Status JsonToBinaryString(TypeResolver* resolver,
                                   const string& type_url,
                                   const string& json_input,
-                                  string* binary_output,
-                                  const JsonParseOptions& options) {
+                                  string* binary_output) {
   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);
-}
-
-namespace {
-const char* kTypeUrlPrefix = "type.googleapis.com";
-TypeResolver* generated_type_resolver_ = NULL;
-GOOGLE_PROTOBUF_DECLARE_ONCE(generated_type_resolver_init_);
-
-string GetTypeUrl(const Message& message) {
-  return string(kTypeUrlPrefix) + "/" + message.GetDescriptor()->full_name();
-}
-
-void DeleteGeneratedTypeResolver() { delete generated_type_resolver_; }
-
-void InitGeneratedTypeResolver() {
-  generated_type_resolver_ = NewTypeResolverForDescriptorPool(
-      kTypeUrlPrefix, DescriptorPool::generated_pool());
-  ::google::protobuf::internal::OnShutdown(&DeleteGeneratedTypeResolver);
-}
-
-TypeResolver* GetGeneratedTypeResolver() {
-  ::google::protobuf::GoogleOnceInit(&generated_type_resolver_init_, &InitGeneratedTypeResolver);
-  return generated_type_resolver_;
-}
-}  // namespace
-
-util::Status MessageToJsonString(const Message& message, string* output,
-                                   const JsonOptions& options) {
-  const DescriptorPool* pool = message.GetDescriptor()->file()->pool();
-  TypeResolver* resolver =
-      pool == DescriptorPool::generated_pool()
-          ? GetGeneratedTypeResolver()
-          : NewTypeResolverForDescriptorPool(kTypeUrlPrefix, pool);
-  util::Status result =
-      BinaryToJsonString(resolver, GetTypeUrl(message),
-                         message.SerializeAsString(), output, options);
-  if (pool != DescriptorPool::generated_pool()) {
-    delete resolver;
-  }
-  return result;
-}
-
-util::Status JsonStringToMessage(const string& input, Message* message,
-                                   const JsonParseOptions& options) {
-  const DescriptorPool* pool = message->GetDescriptor()->file()->pool();
-  TypeResolver* resolver =
-      pool == DescriptorPool::generated_pool()
-          ? GetGeneratedTypeResolver()
-          : NewTypeResolverForDescriptorPool(kTypeUrlPrefix, pool);
-  string binary;
-  util::Status result = JsonToBinaryString(
-      resolver, GetTypeUrl(*message), input, &binary, options);
-  if (result.ok() && !message->ParseFromString(binary)) {
-    result =
-        util::Status(util::error::INVALID_ARGUMENT,
-                       "JSON transcoder produced invalid protobuf output.");
-  }
-  if (pool != DescriptorPool::generated_pool()) {
-    delete resolver;
-  }
-  return result;
+  return JsonToBinaryStream(resolver, type_url, &input_stream, &output_stream);
 }
 
 }  // namespace util
diff --git a/src/google/protobuf/util/json_util.h b/src/google/protobuf/util/json_util.h
index dee3ddb..1718bfb 100644
--- a/src/google/protobuf/util/json_util.h
+++ b/src/google/protobuf/util/json_util.h
@@ -33,7 +33,6 @@
 #ifndef GOOGLE_PROTOBUF_UTIL_JSON_UTIL_H__
 #define GOOGLE_PROTOBUF_UTIL_JSON_UTIL_H__
 
-#include <google/protobuf/message.h>
 #include <google/protobuf/util/type_resolver.h>
 #include <google/protobuf/stubs/bytestream.h>
 
@@ -45,14 +44,7 @@
 }  // namespace io
 namespace util {
 
-struct JsonParseOptions {
-  // Whether to ignore unknown JSON fields during parsing
-  bool ignore_unknown_fields;
-
-  JsonParseOptions() : ignore_unknown_fields(false) {}
-};
-
-struct JsonPrintOptions {
+struct JsonOptions {
   // Whether to add spaces, line breaks and indentation to make the JSON output
   // easy to read.
   bool add_whitespace;
@@ -61,65 +53,31 @@
   // set to 0 will be omitted. Set this flag to true will override the default
   // behavior and print primitive fields regardless of their values.
   bool always_print_primitive_fields;
-  // Whether to always print enums as ints. By default they are rendered as
-  // strings.
-  bool always_print_enums_as_ints;
-  // Whether to preserve proto field names
-  bool preserve_proto_field_names;
 
-  JsonPrintOptions()
-      : add_whitespace(false),
-        always_print_primitive_fields(false),
-        always_print_enums_as_ints(false),
-        preserve_proto_field_names(false) {}
+  JsonOptions() : add_whitespace(false),
+                  always_print_primitive_fields(false) {
+  }
 };
 
-// DEPRECATED. Use JsonPrintOptions instead.
-typedef JsonPrintOptions JsonOptions;
-
-// Converts from protobuf message to JSON. This is a simple wrapper of
-// BinaryToJsonString(). It will use the DescriptorPool of the passed-in
-// message to resolve Any types.
-LIBPROTOBUF_EXPORT util::Status MessageToJsonString(const Message& message,
-                                   string* output,
-                                   const JsonOptions& options);
-
-inline util::Status MessageToJsonString(const Message& message,
-                                          string* output) {
-  return MessageToJsonString(message, output, JsonOptions());
-}
-
-// Converts from JSON to protobuf message. This is a simple wrapper of
-// JsonStringToBinary(). It will use the DescriptorPool of the passed-in
-// message to resolve Any types.
-LIBPROTOBUF_EXPORT util::Status JsonStringToMessage(const string& input,
-                                   Message* message,
-                                   const JsonParseOptions& options);
-
-inline util::Status JsonStringToMessage(const string& input,
-                                          Message* message) {
-  return JsonStringToMessage(input, message, JsonParseOptions());
-}
-
 // Converts protobuf binary data to JSON.
 // The conversion will fail if:
 //   1. TypeResolver fails to resolve a type.
 //   2. input is not valid protobuf wire format, or conflicts with the type
 //      information returned by TypeResolver.
 // Note that unknown fields will be discarded silently.
-LIBPROTOBUF_EXPORT util::Status BinaryToJsonStream(
+util::Status BinaryToJsonStream(
     TypeResolver* resolver,
     const string& type_url,
     io::ZeroCopyInputStream* binary_input,
     io::ZeroCopyOutputStream* json_output,
-    const JsonPrintOptions& options);
+    const JsonOptions& options);
 
 inline util::Status BinaryToJsonStream(
     TypeResolver* resolver, const string& type_url,
     io::ZeroCopyInputStream* binary_input,
     io::ZeroCopyOutputStream* json_output) {
   return BinaryToJsonStream(resolver, type_url, binary_input, json_output,
-                            JsonPrintOptions());
+                            JsonOptions());
 }
 
 LIBPROTOBUF_EXPORT util::Status BinaryToJsonString(
@@ -127,14 +85,14 @@
     const string& type_url,
     const string& binary_input,
     string* json_output,
-    const JsonPrintOptions& options);
+    const JsonOptions& options);
 
 inline util::Status BinaryToJsonString(TypeResolver* resolver,
                                          const string& type_url,
                                          const string& binary_input,
                                          string* json_output) {
   return BinaryToJsonString(resolver, type_url, binary_input, json_output,
-                            JsonPrintOptions());
+                            JsonOptions());
 }
 
 // Converts JSON data to protobuf binary format.
@@ -142,52 +100,30 @@
 //   1. TypeResolver fails to resolve a type.
 //   2. input is not valid JSON format, or conflicts with the type
 //      information returned by TypeResolver.
-LIBPROTOBUF_EXPORT util::Status JsonToBinaryStream(
+//   3. input has unknown fields.
+util::Status JsonToBinaryStream(
     TypeResolver* resolver,
     const string& type_url,
     io::ZeroCopyInputStream* json_input,
-    io::ZeroCopyOutputStream* binary_output,
-    const JsonParseOptions& options);
-
-inline util::Status JsonToBinaryStream(
-    TypeResolver* resolver,
-    const string& type_url,
-    io::ZeroCopyInputStream* json_input,
-    io::ZeroCopyOutputStream* binary_output) {
-  return JsonToBinaryStream(resolver, type_url, json_input, binary_output,
-                            JsonParseOptions());
-}
+    io::ZeroCopyOutputStream* binary_output);
 
 LIBPROTOBUF_EXPORT util::Status JsonToBinaryString(
     TypeResolver* resolver,
     const string& type_url,
     const string& json_input,
-    string* binary_output,
-    const JsonParseOptions& options);
-
-inline util::Status JsonToBinaryString(
-    TypeResolver* resolver,
-    const string& type_url,
-    const string& json_input,
-    string* binary_output) {
-  return JsonToBinaryString(resolver, type_url, json_input, binary_output,
-                            JsonParseOptions());
-}
+    string* binary_output);
 
 namespace internal {
 // Internal helper class. Put in the header so we can write unit-tests for it.
 class LIBPROTOBUF_EXPORT ZeroCopyStreamByteSink : public strings::ByteSink {
  public:
   explicit ZeroCopyStreamByteSink(io::ZeroCopyOutputStream* stream)
-      : stream_(stream), buffer_(NULL), buffer_size_(0) {}
-  ~ZeroCopyStreamByteSink();
+      : stream_(stream) {}
 
   virtual void Append(const char* bytes, size_t len);
 
  private:
   io::ZeroCopyOutputStream* stream_;
-  void* buffer_;
-  int buffer_size_;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyStreamByteSink);
 };
diff --git a/src/google/protobuf/util/json_util_test.cc b/src/google/protobuf/util/json_util_test.cc
index 25c7e96..a4d3cc9 100644
--- a/src/google/protobuf/util/json_util_test.cc
+++ b/src/google/protobuf/util/json_util_test.cc
@@ -34,9 +34,6 @@
 #include <string>
 
 #include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
 #include <google/protobuf/util/json_format_proto3.pb.h>
 #include <google/protobuf/util/type_resolver.h>
 #include <google/protobuf/util/type_resolver_util.h>
@@ -51,34 +48,41 @@
 using proto3::BAR;
 using proto3::TestMessage;
 using proto3::TestMap;
-using proto3::TestOneof;
-using google::protobuf::testing::MapIn;
 
 static const char kTypeUrlPrefix[] = "type.googleapis.com";
 
+static string GetTypeUrl(const Descriptor* message) {
+  return string(kTypeUrlPrefix) + "/" + message->full_name();
+}
+
 // As functions defined in json_util.h are just thin wrappers around the
 // JSON conversion code in //net/proto2/util/converter, in this test we
 // only cover some very basic cases to make sure the wrappers have forwarded
 // parameters to the underlying implementation correctly. More detailed
 // tests are contained in the //net/proto2/util/converter directory.
-class JsonUtilTest : public ::testing::Test {
+class JsonUtilTest : public testing::Test {
  protected:
   JsonUtilTest() {
+    resolver_.reset(NewTypeResolverForDescriptorPool(
+        kTypeUrlPrefix, DescriptorPool::generated_pool()));
   }
 
-  string ToJson(const Message& message, const JsonPrintOptions& options) {
+  string ToJson(const Message& message, const JsonOptions& options) {
     string result;
-    GOOGLE_CHECK_OK(MessageToJsonString(message, &result, options));
+    GOOGLE_CHECK_OK(BinaryToJsonString(resolver_.get(),
+                                GetTypeUrl(message.GetDescriptor()),
+                                message.SerializeAsString(), &result, options));
     return result;
   }
 
-  bool FromJson(const string& json, Message* message,
-                const JsonParseOptions& options) {
-    return JsonStringToMessage(json, message, options).ok();
-  }
-
   bool FromJson(const string& json, Message* message) {
-    return FromJson(json, message, JsonParseOptions());
+    string binary;
+    if (!JsonToBinaryString(resolver_.get(),
+                            GetTypeUrl(message->GetDescriptor()), json, &binary)
+             .ok()) {
+      return false;
+    }
+    return message->ParseFromString(binary);
   }
 
   google::protobuf::scoped_ptr<TypeResolver> resolver_;
@@ -88,7 +92,7 @@
   TestMessage m;
   m.mutable_message_value();
 
-  JsonPrintOptions options;
+  JsonOptions options;
   EXPECT_EQ("{\"messageValue\":{}}", ToJson(m, options));
   options.add_whitespace = true;
   EXPECT_EQ(
@@ -100,7 +104,7 @@
 
 TEST_F(JsonUtilTest, TestDefaultValues) {
   TestMessage m;
-  JsonPrintOptions options;
+  JsonOptions options;
   EXPECT_EQ("{}", ToJson(m, options));
   options.always_print_primitive_fields = true;
   EXPECT_EQ(
@@ -127,93 +131,6 @@
       "\"repeatedMessageValue\":[]"
       "}",
       ToJson(m, options));
-
-  options.always_print_primitive_fields = true;
-  m.set_string_value("i am a test string value");
-  m.set_bytes_value("i am a test bytes value");
-  EXPECT_EQ(
-      "{\"boolValue\":false,"
-      "\"int32Value\":0,"
-      "\"int64Value\":\"0\","
-      "\"uint32Value\":0,"
-      "\"uint64Value\":\"0\","
-      "\"floatValue\":0,"
-      "\"doubleValue\":0,"
-      "\"stringValue\":\"i am a test string value\","
-      "\"bytesValue\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
-      "\"enumValue\":\"FOO\","
-      "\"repeatedBoolValue\":[],"
-      "\"repeatedInt32Value\":[],"
-      "\"repeatedInt64Value\":[],"
-      "\"repeatedUint32Value\":[],"
-      "\"repeatedUint64Value\":[],"
-      "\"repeatedFloatValue\":[],"
-      "\"repeatedDoubleValue\":[],"
-      "\"repeatedStringValue\":[],"
-      "\"repeatedBytesValue\":[],"
-      "\"repeatedEnumValue\":[],"
-      "\"repeatedMessageValue\":[]"
-      "}",
-      ToJson(m, options));
-
-  options.preserve_proto_field_names = true;
-  m.set_string_value("i am a test string value");
-  m.set_bytes_value("i am a test bytes value");
-  EXPECT_EQ(
-      "{\"bool_value\":false,"
-      "\"int32_value\":0,"
-      "\"int64_value\":\"0\","
-      "\"uint32_value\":0,"
-      "\"uint64_value\":\"0\","
-      "\"float_value\":0,"
-      "\"double_value\":0,"
-      "\"string_value\":\"i am a test string value\","
-      "\"bytes_value\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
-      "\"enum_value\":\"FOO\","
-      "\"repeated_bool_value\":[],"
-      "\"repeated_int32_value\":[],"
-      "\"repeated_int64_value\":[],"
-      "\"repeated_uint32_value\":[],"
-      "\"repeated_uint64_value\":[],"
-      "\"repeated_float_value\":[],"
-      "\"repeated_double_value\":[],"
-      "\"repeated_string_value\":[],"
-      "\"repeated_bytes_value\":[],"
-      "\"repeated_enum_value\":[],"
-      "\"repeated_message_value\":[]"
-      "}",
-      ToJson(m, options));
-}
-
-TEST_F(JsonUtilTest, TestPreserveProtoFieldNames) {
-  TestMessage m;
-  m.mutable_message_value();
-
-  JsonPrintOptions options;
-  options.preserve_proto_field_names = true;
-  EXPECT_EQ("{\"message_value\":{}}", ToJson(m, options));
-}
-
-TEST_F(JsonUtilTest, TestAlwaysPrintEnumsAsInts) {
-  TestMessage orig;
-  orig.set_enum_value(proto3::BAR);
-  orig.add_repeated_enum_value(proto3::FOO);
-  orig.add_repeated_enum_value(proto3::BAR);
-
-  JsonPrintOptions print_options;
-  print_options.always_print_enums_as_ints = true;
-
-  string expected_json = "{\"enumValue\":1,\"repeatedEnumValue\":[0,1]}";
-  EXPECT_EQ(expected_json, ToJson(orig, print_options));
-
-  TestMessage parsed;
-  JsonParseOptions parse_options;
-  ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
-
-  EXPECT_EQ(proto3::BAR, parsed.enum_value());
-  EXPECT_EQ(2, parsed.repeated_enum_value_size());
-  EXPECT_EQ(proto3::FOO, parsed.repeated_enum_value(0));
-  EXPECT_EQ(proto3::BAR, parsed.repeated_enum_value(1));
 }
 
 TEST_F(JsonUtilTest, ParseMessage) {
@@ -230,9 +147,8 @@
       "    {\"value\": 40}, {\"value\": 96}\n"
       "  ]\n"
       "}\n";
-  JsonParseOptions options;
   TestMessage m;
-  ASSERT_TRUE(FromJson(input, &m, options));
+  ASSERT_TRUE(FromJson(input, &m));
   EXPECT_EQ(1024, m.int32_value());
   ASSERT_EQ(2, m.repeated_int32_value_size());
   EXPECT_EQ(1, m.repeated_int32_value(0));
@@ -246,97 +162,27 @@
 TEST_F(JsonUtilTest, ParseMap) {
   TestMap message;
   (*message.mutable_string_map())["hello"] = 1234;
-  JsonPrintOptions print_options;
-  JsonParseOptions parse_options;
-  EXPECT_EQ("{\"stringMap\":{\"hello\":1234}}", ToJson(message, print_options));
+  JsonOptions options;
+  EXPECT_EQ("{\"stringMap\":{\"hello\":1234}}", ToJson(message, options));
   TestMap other;
-  ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
+  ASSERT_TRUE(FromJson(ToJson(message, options), &other));
   EXPECT_EQ(message.DebugString(), other.DebugString());
 }
 
-TEST_F(JsonUtilTest, ParsePrimitiveMapIn) {
-  MapIn message;
-  JsonPrintOptions print_options;
-  print_options.always_print_primitive_fields = true;
-  JsonParseOptions parse_options;
-  EXPECT_EQ("{\"other\":\"\",\"things\":[],\"mapInput\":{}}",
-            ToJson(message, print_options));
-  MapIn other;
-  ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
-  EXPECT_EQ(message.DebugString(), other.DebugString());
-}
-
-TEST_F(JsonUtilTest, PrintPrimitiveOneof) {
-  TestOneof message;
-  JsonPrintOptions options;
-  options.always_print_primitive_fields = true;
-  message.mutable_oneof_message_value();
-  EXPECT_EQ("{\"oneofMessageValue\":{\"value\":0}}", ToJson(message, options));
-
-  message.set_oneof_int32_value(1);
-  EXPECT_EQ("{\"oneofInt32Value\":1}", ToJson(message, options));
-}
-
-TEST_F(JsonUtilTest, TestParseIgnoreUnknownFields) {
-  TestMessage m;
-  JsonParseOptions options;
-  options.ignore_unknown_fields = true;
-  EXPECT_TRUE(FromJson("{\"unknownName\":0}", &m, options));
-}
-
 TEST_F(JsonUtilTest, TestParseErrors) {
   TestMessage m;
-  JsonParseOptions options;
-  // Parsing should fail if the field name can not be recognized.
-  EXPECT_FALSE(FromJson("{\"unknownName\":0}", &m, options));
-  // Parsing should fail if the value is invalid.
-  EXPECT_FALSE(FromJson("{\"int32Value\":2147483648}", &m, options));
-}
-
-TEST_F(JsonUtilTest, TestDynamicMessage) {
-  // Some random message but good enough to test the wrapper functions.
-  string input =
-      "{\n"
-      "  \"int32Value\": 1024,\n"
-      "  \"repeatedInt32Value\": [1, 2],\n"
-      "  \"messageValue\": {\n"
-      "    \"value\": 2048\n"
-      "  },\n"
-      "  \"repeatedMessageValue\": [\n"
-      "    {\"value\": 40}, {\"value\": 96}\n"
-      "  ]\n"
-      "}\n";
-
-  // Create a new DescriptorPool with the same protos as the generated one.
-  DescriptorPoolDatabase database(*DescriptorPool::generated_pool());
-  DescriptorPool pool(&database);
-  // A dynamic version of the test proto.
-  DynamicMessageFactory factory;
-  google::protobuf::scoped_ptr<Message> message(factory.GetPrototype(
-      pool.FindMessageTypeByName("proto3.TestMessage"))->New());
-  EXPECT_TRUE(FromJson(input, message.get()));
-
-  // Convert to generated message for easy inspection.
-  TestMessage generated;
-  EXPECT_TRUE(generated.ParseFromString(message->SerializeAsString()));
-  EXPECT_EQ(1024, generated.int32_value());
-  ASSERT_EQ(2, generated.repeated_int32_value_size());
-  EXPECT_EQ(1, generated.repeated_int32_value(0));
-  EXPECT_EQ(2, generated.repeated_int32_value(1));
-  EXPECT_EQ(2048, generated.message_value().value());
-  ASSERT_EQ(2, generated.repeated_message_value_size());
-  EXPECT_EQ(40, generated.repeated_message_value(0).value());
-  EXPECT_EQ(96, generated.repeated_message_value(1).value());
-
   JsonOptions options;
-  EXPECT_EQ(ToJson(generated, options), ToJson(*message, options));
+  // Parsing should fail if the field name can not be recognized.
+  EXPECT_FALSE(FromJson("{\"unknownName\":0}", &m));
+  // Parsing should fail if the value is invalid.
+  EXPECT_FALSE(FromJson("{\"int32Value\":2147483648}", &m));
 }
 
-typedef std::pair<char*, int> Segment;
+typedef pair<char*, int> Segment;
 // A ZeroCopyOutputStream that writes to multiple buffers.
 class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
  public:
-  explicit SegmentedZeroCopyOutputStream(std::list<Segment> segments)
+  explicit SegmentedZeroCopyOutputStream(list<Segment> segments)
       : segments_(segments), last_segment_(static_cast<char*>(NULL), 0), byte_count_(0) {}
 
   virtual bool Next(void** buffer, int* length) {
@@ -362,7 +208,7 @@
   virtual int64 ByteCount() const { return byte_count_; }
 
  private:
-  std::list<Segment> segments_;
+  list<Segment> segments_;
   Segment last_segment_;
   int64 byte_count_;
 };
@@ -380,7 +226,7 @@
   for (int split_pattern = 0; split_pattern < (1 << (kOutputBufferLength - 1));
        split_pattern += kSkippedPatternCount) {
     // Split the buffer into small segments according to the split_pattern.
-    std::list<Segment> segments;
+    list<Segment> segments;
     int segment_start = 0;
     for (int i = 0; i < kOutputBufferLength - 1; ++i) {
       if (split_pattern & (1 << i)) {
diff --git a/src/google/protobuf/util/message_differencer.cc b/src/google/protobuf/util/message_differencer.cc
index e964e04..fe8119b 100644
--- a/src/google/protobuf/util/message_differencer.cc
+++ b/src/google/protobuf/util/message_differencer.cc
@@ -53,7 +53,6 @@
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/text_format.h>
 #include <google/protobuf/util/field_comparator.h>
@@ -74,7 +73,7 @@
  public:
   MultipleFieldsMapKeyComparator(
       MessageDifferencer* message_differencer,
-      const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths)
+      const vector<vector<const FieldDescriptor*> >& key_field_paths)
         : message_differencer_(message_differencer),
           key_field_paths_(key_field_paths) {
     GOOGLE_CHECK(!key_field_paths_.empty());
@@ -86,14 +85,14 @@
       MessageDifferencer* message_differencer,
       const FieldDescriptor* key)
         : message_differencer_(message_differencer) {
-    std::vector<const FieldDescriptor*> key_field_path;
+    vector<const FieldDescriptor*> key_field_path;
     key_field_path.push_back(key);
     key_field_paths_.push_back(key_field_path);
   }
   virtual bool IsMatch(
       const Message& message1,
       const Message& message2,
-      const std::vector<SpecificField>& parent_fields) const {
+      const vector<SpecificField>& parent_fields) const {
     for (int i = 0; i < key_field_paths_.size(); ++i) {
       if (!IsMatchInternal(message1, message2, parent_fields,
                            key_field_paths_[i], 0)) {
@@ -106,11 +105,11 @@
   bool IsMatchInternal(
       const Message& message1,
       const Message& message2,
-      const std::vector<SpecificField>& parent_fields,
-      const std::vector<const FieldDescriptor*>& key_field_path,
+      const vector<SpecificField>& parent_fields,
+      const vector<const FieldDescriptor*>& key_field_path,
       int path_index) const {
     const FieldDescriptor* field = key_field_path[path_index];
-    std::vector<SpecificField> current_parent_fields(parent_fields);
+    vector<SpecificField> current_parent_fields(parent_fields);
     if (path_index == key_field_path.size() - 1) {
       if (field->is_repeated()) {
         if (!message_differencer_->CompareRepeatedField(
@@ -147,36 +146,10 @@
     }
   }
   MessageDifferencer* message_differencer_;
-  std::vector<std::vector<const FieldDescriptor*> > key_field_paths_;
+  vector<vector<const FieldDescriptor*> > key_field_paths_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MultipleFieldsMapKeyComparator);
 };
 
-MessageDifferencer::MapEntryKeyComparator::MapEntryKeyComparator(
-    MessageDifferencer* message_differencer)
-    : message_differencer_(message_differencer) {}
-
-bool MessageDifferencer::MapEntryKeyComparator::IsMatch(
-    const Message& message1, const Message& message2,
-    const std::vector<SpecificField>& parent_fields) const {
-  // Map entry has its key in the field with tag 1.  See the comment for
-  // map_entry in MessageOptions.
-  const FieldDescriptor* key = message1.GetDescriptor()->FindFieldByNumber(1);
-  // If key is not present in message1 and we're doing partial comparison or if
-  // map key is explicitly ignored treat the field as set instead,
-  const bool treat_as_set =
-      (message_differencer_->scope() == PARTIAL &&
-       !message1.GetReflection()->HasField(message1, key)) ||
-      message_differencer_->IsIgnored(message1, message2, key, parent_fields);
-
-  std::vector<SpecificField> current_parent_fields(parent_fields);
-  if (treat_as_set) {
-    return message_differencer_->Compare(message1, message2,
-                                         &current_parent_fields);
-  }
-  return message_differencer_->CompareFieldValueUsingParentFields(
-      message1, message2, key, -1, -1, &current_parent_fields);
-}
-
 bool MessageDifferencer::Equals(const Message& message1,
                                 const Message& message2) {
   MessageDifferencer differencer;
@@ -218,10 +191,8 @@
       message_field_comparison_(EQUAL),
       scope_(FULL),
       repeated_field_comparison_(AS_LIST),
-      map_entry_key_comparator_(this),
       report_matches_(false),
-      report_moves_(true),
-      output_string_(NULL) {}
+      output_string_(NULL) { }
 
 MessageDifferencer::~MessageDifferencer() {
   for (int i = 0; i < owned_key_comparators_.size(); ++i) {
@@ -312,10 +283,10 @@
 
 void MessageDifferencer::TreatAsMapWithMultipleFieldsAsKey(
     const FieldDescriptor* field,
-    const std::vector<const FieldDescriptor*>& key_fields) {
-  std::vector<std::vector<const FieldDescriptor*> > key_field_paths;
+    const vector<const FieldDescriptor*>& key_fields) {
+  vector<vector<const FieldDescriptor*> > key_field_paths;
   for (int i = 0; i < key_fields.size(); ++i) {
-    std::vector<const FieldDescriptor*> key_field_path;
+    vector<const FieldDescriptor*> key_field_path;
     key_field_path.push_back(key_fields[i]);
     key_field_paths.push_back(key_field_path);
   }
@@ -324,15 +295,14 @@
 
 void MessageDifferencer::TreatAsMapWithMultipleFieldPathsAsKey(
     const FieldDescriptor* field,
-    const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths) {
+    const vector<vector<const FieldDescriptor*> >& key_field_paths) {
   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();
   for (int i = 0; i < key_field_paths.size(); ++i) {
-    const std::vector<const FieldDescriptor*>& key_field_path =
-        key_field_paths[i];
+    const vector<const FieldDescriptor*>& key_field_path = key_field_paths[i];
     for (int j = 0; j < key_field_path.size(); ++j) {
       const FieldDescriptor* parent_field =
           j == 0 ? field : key_field_path[j - 1];
@@ -420,7 +390,7 @@
 
 bool MessageDifferencer::Compare(const Message& message1,
                                  const Message& message2) {
-  std::vector<SpecificField> parent_fields;
+  vector<SpecificField> parent_fields;
 
   bool result = false;
 
@@ -441,20 +411,20 @@
 bool MessageDifferencer::CompareWithFields(
     const Message& message1,
     const Message& message2,
-    const std::vector<const FieldDescriptor*>& message1_fields_arg,
-    const std::vector<const FieldDescriptor*>& message2_fields_arg) {
+    const vector<const FieldDescriptor*>& message1_fields_arg,
+    const vector<const FieldDescriptor*>& message2_fields_arg) {
   if (message1.GetDescriptor() != message2.GetDescriptor()) {
     GOOGLE_LOG(DFATAL) << "Comparison between two messages with different "
                 << "descriptors.";
     return false;
   }
 
-  std::vector<SpecificField> parent_fields;
+  vector<SpecificField> parent_fields;
 
   bool result = false;
 
-  std::vector<const FieldDescriptor*> message1_fields(message1_fields_arg);
-  std::vector<const FieldDescriptor*> message2_fields(message2_fields_arg);
+  vector<const FieldDescriptor*> message1_fields(message1_fields_arg);
+  vector<const FieldDescriptor*> message2_fields(message2_fields_arg);
 
   std::sort(message1_fields.begin(), message1_fields.end(), FieldBefore);
   std::sort(message2_fields.begin(), message2_fields.end(), FieldBefore);
@@ -481,7 +451,7 @@
 bool MessageDifferencer::Compare(
     const Message& message1,
     const Message& message2,
-    std::vector<SpecificField>* parent_fields) {
+    vector<SpecificField>* parent_fields) {
   const Descriptor* descriptor1 = message1.GetDescriptor();
   const Descriptor* descriptor2 = message2.GetDescriptor();
   if (descriptor1 != descriptor2) {
@@ -496,10 +466,6 @@
     google::protobuf::scoped_ptr<Message> data1;
     google::protobuf::scoped_ptr<Message> data2;
     if (UnpackAny(message1, &data1) && UnpackAny(message2, &data2)) {
-      // Avoid DFATAL for different descriptors in google.protobuf.Any payloads.
-      if (data1->GetDescriptor() != data2->GetDescriptor()) {
-        return false;
-      }
       return Compare(*data1, *data2, parent_fields);
     }
   }
@@ -507,28 +473,11 @@
   const Reflection* reflection2 = message2.GetReflection();
 
   // Retrieve all the set fields, including extensions.
-  std::vector<const FieldDescriptor*> message1_fields;
-  message1_fields.reserve(1 + message1.GetDescriptor()->field_count());
+  vector<const FieldDescriptor*> message1_fields;
+  vector<const FieldDescriptor*> message2_fields;
 
-  std::vector<const FieldDescriptor*> message2_fields;
-  message2_fields.reserve(1 + message2.GetDescriptor()->field_count());
-
-  if (descriptor1->options().map_entry()) {
-    if (scope_ == PARTIAL) {
-      reflection1->ListFields(message1, &message1_fields);
-    } else {
-      // Map entry fields are always considered present.
-      for (int i = 0; i < descriptor1->field_count(); i++) {
-        message1_fields.push_back(descriptor1->field(i));
-      }
-    }
-    for (int i = 0; i < descriptor1->field_count(); i++) {
-      message2_fields.push_back(descriptor1->field(i));
-    }
-  } else {
-    reflection1->ListFields(message1, &message1_fields);
-    reflection2->ListFields(message2, &message2_fields);
-  }
+  reflection1->ListFields(message1, &message1_fields);
+  reflection2->ListFields(message2, &message2_fields);
 
   // Add sentinel values to deal with the
   // case where the number of the fields in
@@ -562,15 +511,15 @@
 bool MessageDifferencer::CompareRequestedFieldsUsingSettings(
     const Message& message1,
     const Message& message2,
-    const std::vector<const FieldDescriptor*>& message1_fields,
-    const std::vector<const FieldDescriptor*>& message2_fields,
-    std::vector<SpecificField>* parent_fields) {
+    const vector<const FieldDescriptor*>& message1_fields,
+    const vector<const FieldDescriptor*>& message2_fields,
+    vector<SpecificField>* parent_fields) {
   if (scope_ == FULL) {
     if (message_field_comparison_ == EQUIVALENT) {
       // We need to merge the field lists of both messages (i.e.
       // we are merely checking for a difference in field values,
       // rather than the addition or deletion of fields).
-      std::vector<const FieldDescriptor*> fields_union;
+      vector<const FieldDescriptor*> fields_union;
       CombineFields(message1_fields, FULL, message2_fields, FULL,
                     &fields_union);
       return CompareWithFieldsInternal(message1, message2, fields_union,
@@ -592,7 +541,7 @@
       // but only the intersection for message2.  This way, any fields
       // only present in message2 will be ignored, but any fields only
       // present in message1 will be marked as a difference.
-      std::vector<const FieldDescriptor*> fields_intersection;
+      vector<const FieldDescriptor*> fields_intersection;
       CombineFields(message1_fields, PARTIAL, message2_fields, PARTIAL,
                     &fields_intersection);
       return CompareWithFieldsInternal(message1, message2, message1_fields,
@@ -602,11 +551,11 @@
 }
 
 void MessageDifferencer::CombineFields(
-    const std::vector<const FieldDescriptor*>& fields1,
+    const vector<const FieldDescriptor*>& fields1,
     Scope fields1_scope,
-    const std::vector<const FieldDescriptor*>& fields2,
+    const vector<const FieldDescriptor*>& fields2,
     Scope fields2_scope,
-    std::vector<const FieldDescriptor*>* combined_fields) {
+    vector<const FieldDescriptor*>* combined_fields) {
 
   int index1 = 0;
   int index2 = 0;
@@ -636,9 +585,9 @@
 bool MessageDifferencer::CompareWithFieldsInternal(
     const Message& message1,
     const Message& message2,
-    const std::vector<const FieldDescriptor*>& message1_fields,
-    const std::vector<const FieldDescriptor*>& message2_fields,
-    std::vector<SpecificField>* parent_fields) {
+    const vector<const FieldDescriptor*>& message1_fields,
+    const vector<const FieldDescriptor*>& message2_fields,
+    vector<SpecificField>* parent_fields) {
   bool isDifferent = false;
   int field_index1 = 0;
   int field_index2 = 0;
@@ -674,7 +623,6 @@
       }
 
       if (reporter_ != NULL) {
-        assert(field1 != NULL);
         int count = field1->is_repeated() ?
             reflection1->FieldSize(message1, field1) : 1;
 
@@ -755,7 +703,6 @@
     }
 
     bool fieldDifferent = false;
-    assert(field1 != NULL);
     if (field1->is_repeated()) {
       fieldDifferent = !CompareRepeatedField(message1, message2, field1,
                                              parent_fields);
@@ -794,12 +741,13 @@
   return !isDifferent;
 }
 
-bool MessageDifferencer::IsMatch(
-    const FieldDescriptor* repeated_field,
-    const MapKeyComparator* key_comparator, const Message* message1,
-    const Message* message2, const std::vector<SpecificField>& parent_fields,
-    int index1, int index2) {
-  std::vector<SpecificField> current_parent_fields(parent_fields);
+bool MessageDifferencer::IsMatch(const FieldDescriptor* repeated_field,
+                                 const MapKeyComparator* key_comparator,
+                                 const Message* message1,
+                                 const Message* message2,
+                                 const vector<SpecificField>& parent_fields,
+                                 int index1, int index2) {
+  vector<SpecificField> current_parent_fields(parent_fields);
   if (repeated_field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
     return CompareFieldValueUsingParentFields(
         *message1, *message2, repeated_field, index1, index2,
@@ -826,8 +774,6 @@
         reflection2->GetRepeatedMessage(*message2, repeated_field, index2);
     SpecificField specific_field;
     specific_field.field = repeated_field;
-    specific_field.index = index1;
-    specific_field.new_index = index2;
     current_parent_fields.push_back(specific_field);
     match = key_comparator->IsMatch(m1, m2, current_parent_fields);
   }
@@ -841,7 +787,7 @@
     const Message& message1,
     const Message& message2,
     const FieldDescriptor* repeated_field,
-    std::vector<SpecificField>* parent_fields) {
+    vector<SpecificField>* parent_fields) {
   // the input FieldDescriptor is guaranteed to be repeated field.
   const Reflection* reflection1 = message1.GetReflection();
   const Reflection* reflection2 = message2.GetReflection();
@@ -862,8 +808,8 @@
 
   // These two list are used for store the index of the correspondent
   // element in peer repeated field.
-  std::vector<int> match_list1;
-  std::vector<int> match_list2;
+  vector<int> match_list1;
+  vector<int> match_list2;
 
   // Try to match indices of the repeated fields. Return false if match fails
   // and there's no detailed report needed.
@@ -898,8 +844,7 @@
       parent_fields->pop_back();
       fieldDifferent = true;
     } else if (reporter_ != NULL &&
-               specific_field.index != specific_field.new_index &&
-               !specific_field.field->is_map() && report_moves_) {
+               specific_field.index != specific_field.new_index) {
       parent_fields->push_back(specific_field);
       reporter_->ReportMoved(message1, message2, *parent_fields);
       parent_fields->pop_back();
@@ -927,7 +872,6 @@
 
   for (int i = 0; i < count1; ++i) {
     if (match_list1[i] != -1) continue;
-    assert(reporter_ != NULL);
     specific_field.index = i;
     parent_fields->push_back(specific_field);
     reporter_->ReportDeleted(message1, message2, *parent_fields);
@@ -949,7 +893,7 @@
 bool MessageDifferencer::CompareFieldValueUsingParentFields(
     const Message& message1, const Message& message2,
     const FieldDescriptor* field, int index1, int index2,
-    std::vector<SpecificField>* parent_fields) {
+    vector<SpecificField>* parent_fields) {
   FieldContext field_context(parent_fields);
   FieldComparator::ComparisonResult result = GetFieldComparisonResult(
       message1, message2, field, index1, index2, &field_context);
@@ -988,10 +932,8 @@
 }
 
 bool MessageDifferencer::CheckPathChanged(
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   for (int i = 0; i < field_path.size(); ++i) {
-    // Don't check indexes for map entries -- maps are unordered.
-    if (field_path[i].field != NULL && field_path[i].field->is_map()) continue;
     if (field_path[i].index != field_path[i].new_index) return true;
   }
   return false;
@@ -999,6 +941,7 @@
 
 bool MessageDifferencer::IsTreatedAsSet(const FieldDescriptor* field) {
   if (!field->is_repeated()) return false;
+  if (field->is_map()) return true;
   if (repeated_field_comparison_ == AS_SET)
     return list_fields_.find(field) == list_fields_.end();
   return (set_fields_.find(field) != set_fields_.end());
@@ -1013,7 +956,7 @@
     const Message& message1,
     const Message& message2,
     const FieldDescriptor* field,
-    const std::vector<SpecificField>& parent_fields) {
+    const vector<SpecificField>& parent_fields) {
   if (ignored_fields_.find(field) != ignored_fields_.end()) {
     return true;
   }
@@ -1028,8 +971,7 @@
 
 bool MessageDifferencer::IsUnknownFieldIgnored(
     const Message& message1, const Message& message2,
-    const SpecificField& field,
-    const std::vector<SpecificField>& parent_fields) {
+    const SpecificField& field, const vector<SpecificField>& parent_fields) {
   for (int i = 0; i < ignore_criteria_.size(); ++i) {
     if (ignore_criteria_[i]->IsUnknownFieldIgnored(message1, message2, field,
                                                    parent_fields)) {
@@ -1039,25 +981,19 @@
   return false;
 }
 
-const MessageDifferencer::MapKeyComparator*
-MessageDifferencer ::GetMapKeyComparator(const FieldDescriptor* field) const {
+const MessageDifferencer::MapKeyComparator* MessageDifferencer
+    ::GetMapKeyComparator(const FieldDescriptor* field) {
   if (!field->is_repeated()) return NULL;
-  FieldKeyComparatorMap::const_iterator it =
-      map_field_key_comparator_.find(field);
-  if (it != map_field_key_comparator_.end()) {
-    return it->second;
-  }
-  if (field->is_map()) {
-    // field cannot already be treated as list or set since TreatAsList() and
-    // TreatAsSet() call GetMapKeyComparator() and fail if it returns non-NULL.
-    return &map_entry_key_comparator_;
+  if (map_field_key_comparator_.find(field) !=
+      map_field_key_comparator_.end()) {
+    return map_field_key_comparator_[field];
   }
   return NULL;
 }
 
 namespace {
 
-typedef std::pair<int, const UnknownField*> IndexUnknownFieldPair;
+typedef pair<int, const UnknownField*> IndexUnknownFieldPair;
 
 struct UnknownFieldOrdering {
   inline bool operator()(const IndexUnknownFieldPair& a,
@@ -1108,7 +1044,7 @@
     const Message& message1, const Message& message2,
     const google::protobuf::UnknownFieldSet& unknown_field_set1,
     const google::protobuf::UnknownFieldSet& unknown_field_set2,
-    std::vector<SpecificField>* parent_field) {
+    vector<SpecificField>* parent_field) {
   // Ignore unknown fields in EQUIVALENT mode.
   if (message_field_comparison_ == EQUIVALENT) return true;
 
@@ -1124,8 +1060,8 @@
   // two sets -- that is, differing values for the same tag.  We use
   // IndexUnknownFieldPairs to keep track of the field's original index for
   // reporting purposes.
-  std::vector<IndexUnknownFieldPair> fields1;  // unknown_field_set1, sorted
-  std::vector<IndexUnknownFieldPair> fields2;  // unknown_field_set2, sorted
+  vector<IndexUnknownFieldPair> fields1;  // unknown_field_set1, sorted
+  vector<IndexUnknownFieldPair> fields2;  // unknown_field_set2, sorted
   fields1.reserve(unknown_field_set1.field_count());
   fields2.reserve(unknown_field_set2.field_count());
 
@@ -1328,7 +1264,7 @@
   // the x-th node on the right side is matched to y-th node on the left side.
   // match_list1[i] == -1 means the node is not matched. Same with match_list2.
   MaximumMatcher(int count1, int count2, NodeMatchCallback* callback,
-                 std::vector<int>* match_list1, std::vector<int>* match_list2);
+                 vector<int>* match_list1, vector<int>* match_list2);
   // Find a maximum match and return the number of matched node pairs.
   // 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.
@@ -1340,21 +1276,21 @@
   // Find an argumenting path starting from the node v on the left side. If a
   // path can be found, update match_list2_ to reflect the path and return
   // true.
-  bool FindArgumentPathDFS(int v, std::vector<bool>* visited);
+  bool FindArgumentPathDFS(int v, vector<bool>* visited);
 
   int count1_;
   int count2_;
   google::protobuf::scoped_ptr<NodeMatchCallback> match_callback_;
-  std::map<std::pair<int, int>, bool> cached_match_results_;
-  std::vector<int>* match_list1_;
-  std::vector<int>* match_list2_;
+  map<pair<int, int>, bool> cached_match_results_;
+  vector<int>* match_list1_;
+  vector<int>* match_list2_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MaximumMatcher);
 };
 
 MaximumMatcher::MaximumMatcher(int count1, int count2,
                                NodeMatchCallback* callback,
-                               std::vector<int>* match_list1,
-                               std::vector<int>* match_list2)
+                               vector<int>* match_list1,
+                               vector<int>* match_list2)
     : count1_(count1), count2_(count2), match_callback_(callback),
       match_list1_(match_list1), match_list2_(match_list2) {
   match_list1_->assign(count1, -1);
@@ -1364,7 +1300,7 @@
 int MaximumMatcher::FindMaximumMatch(bool early_return) {
   int result = 0;
   for (int i = 0; i < count1_; ++i) {
-    std::vector<bool> visited(count1_);
+    vector<bool> visited(count1_);
     if (FindArgumentPathDFS(i, &visited)) {
       ++result;
     } else if (early_return) {
@@ -1382,9 +1318,8 @@
 }
 
 bool MaximumMatcher::Match(int left, int right) {
-  std::pair<int, int> p(left, right);
-  std::map<std::pair<int, int>, bool>::iterator it =
-      cached_match_results_.find(p);
+  pair<int, int> p(left, right);
+  map<pair<int, int>, bool>::iterator it = cached_match_results_.find(p);
   if (it != cached_match_results_.end()) {
     return it->second;
   }
@@ -1392,7 +1327,7 @@
   return cached_match_results_[p];
 }
 
-bool MaximumMatcher::FindArgumentPathDFS(int v, std::vector<bool>* visited) {
+bool MaximumMatcher::FindArgumentPathDFS(int v, vector<bool>* visited) {
   (*visited)[v] = true;
   // We try to match those un-matched nodes on the right side first. This is
   // the step that the navie greedy matching algorithm uses. In the best cases
@@ -1428,9 +1363,9 @@
     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) {
+    const vector<SpecificField>& parent_fields,
+    vector<int>* match_list1,
+    vector<int>* match_list2) {
   const int count1 =
       message1.GetReflection()->FieldSize(message1, repeated_field);
   const int count2 =
@@ -1440,16 +1375,19 @@
   match_list1->assign(count1, -1);
   match_list2->assign(count2, -1);
 
+  SpecificField specific_field;
+  specific_field.field = repeated_field;
+
   bool success = true;
   // Find potential match if this is a special repeated field.
   if (key_comparator != NULL || IsTreatedAsSet(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
+      // doesn't neccessarily 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(
+          ::google::protobuf::internal::NewPermanentCallback(
               this, &MessageDifferencer::IsMatch,
               repeated_field, key_comparator,
               &message1, &message2, parent_fields);
@@ -1466,15 +1404,20 @@
         // Indicates any matched elements for this repeated field.
         bool match = false;
 
+        specific_field.index = i;
+        specific_field.new_index = i;
+
         for (int j = 0; j < count2; j++) {
           if (match_list2->at(j) != -1) continue;
+          specific_field.index = i;
+          specific_field.new_index = j;
 
           match = IsMatch(repeated_field, key_comparator,
                           &message1, &message2, parent_fields, i, j);
 
           if (match) {
-            match_list1->at(i) = j;
-            match_list2->at(j) = i;
+            match_list1->at(specific_field.index) = specific_field.new_index;
+            match_list2->at(specific_field.new_index) = specific_field.index;
             break;
           }
         }
@@ -1537,7 +1480,7 @@
 }
 
 void MessageDifferencer::StreamReporter::PrintPath(
-    const std::vector<SpecificField>& field_path, bool left_side) {
+    const vector<SpecificField>& field_path, bool left_side) {
   for (int i = 0; i < field_path.size(); ++i) {
     if (i > 0) {
       printer_->Print(".");
@@ -1552,10 +1495,6 @@
       } else {
         printer_->PrintRaw(specific_field.field->name());
       }
-      if (specific_field.field->is_map()) {
-        // Don't print index in a map field; they are semantically unordered.
-        continue;
-      }
     } else {
       printer_->PrintRaw(SimpleItoa(specific_field.unknown_field_number));
     }
@@ -1568,15 +1507,9 @@
   }
 }
 
-void MessageDifferencer::StreamReporter::PrintPath(
-    const std::vector<SpecificField>& field_path, bool left_side,
-    const Message& message) {
-  PrintPath(field_path, left_side);
-}
-
 void MessageDifferencer::
 StreamReporter::PrintValue(const Message& message,
-                           const std::vector<SpecificField>& field_path,
+                           const vector<SpecificField>& field_path,
                            bool left_side) {
   const SpecificField& specific_field = field_path.back();
   const FieldDescriptor* field = specific_field.field;
@@ -1649,9 +1582,9 @@
 void MessageDifferencer::StreamReporter::ReportAdded(
     const Message& message1,
     const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   printer_->Print("added: ");
-  PrintPath(field_path, false, message2);
+  PrintPath(field_path, false);
   printer_->Print(": ");
   PrintValue(message2, field_path, false);
   printer_->Print("\n");  // Print for newlines.
@@ -1660,9 +1593,9 @@
 void MessageDifferencer::StreamReporter::ReportDeleted(
     const Message& message1,
     const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   printer_->Print("deleted: ");
-  PrintPath(field_path, true, message1);
+  PrintPath(field_path, true);
   printer_->Print(": ");
   PrintValue(message1, field_path, true);
   printer_->Print("\n");  // Print for newlines
@@ -1671,7 +1604,7 @@
 void MessageDifferencer::StreamReporter::ReportModified(
     const Message& message1,
     const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   if (!report_modified_aggregates_ && field_path.back().field == NULL) {
     if (field_path.back().unknown_field_type == UnknownField::TYPE_GROUP) {
       // Any changes to the subfields have already been printed.
@@ -1686,10 +1619,10 @@
   }
 
   printer_->Print("modified: ");
-  PrintPath(field_path, true, message1);
+  PrintPath(field_path, true);
   if (CheckPathChanged(field_path)) {
     printer_->Print(" -> ");
-    PrintPath(field_path, false, message2);
+    PrintPath(field_path, false);
   }
   printer_->Print(": ");
   PrintValue(message1, field_path, true);
@@ -1701,11 +1634,11 @@
 void MessageDifferencer::StreamReporter::ReportMoved(
     const Message& message1,
     const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   printer_->Print("moved: ");
-  PrintPath(field_path, true, message1);
+  PrintPath(field_path, true);
   printer_->Print(" -> ");
-  PrintPath(field_path, false, message2);
+  PrintPath(field_path, false);
   printer_->Print(" : ");
   PrintValue(message1, field_path, true);
   printer_->Print("\n");  // Print for newlines.
@@ -1714,12 +1647,12 @@
 void MessageDifferencer::StreamReporter::ReportMatched(
     const Message& message1,
     const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   printer_->Print("matched: ");
-  PrintPath(field_path, true, message1);
+  PrintPath(field_path, true);
   if (CheckPathChanged(field_path)) {
     printer_->Print(" -> ");
-    PrintPath(field_path, false, message2);
+    PrintPath(field_path, false);
   }
   printer_->Print(" : ");
   PrintValue(message1, field_path, true);
@@ -1729,24 +1662,24 @@
 void MessageDifferencer::StreamReporter::ReportIgnored(
     const Message& message1,
     const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   printer_->Print("ignored: ");
-  PrintPath(field_path, true, message1);
+  PrintPath(field_path, true);
   if (CheckPathChanged(field_path)) {
     printer_->Print(" -> ");
-    PrintPath(field_path, false, message2);
+    PrintPath(field_path, false);
   }
   printer_->Print("\n");  // Print for newlines.
 }
 
 void MessageDifferencer::StreamReporter::ReportUnknownFieldIgnored(
     const Message& message1, const Message& message2,
-    const std::vector<SpecificField>& field_path) {
+    const vector<SpecificField>& field_path) {
   printer_->Print("ignored: ");
-  PrintPath(field_path, true, message1);
+  PrintPath(field_path, true);
   if (CheckPathChanged(field_path)) {
     printer_->Print(" -> ");
-    PrintPath(field_path, false, message2);
+    PrintPath(field_path, false);
   }
   printer_->Print("\n");  // Print for newlines.
 }
diff --git a/src/google/protobuf/util/message_differencer.h b/src/google/protobuf/util/message_differencer.h
index b7d4de0..3ea74e6 100644
--- a/src/google/protobuf/util/message_differencer.h
+++ b/src/google/protobuf/util/message_differencer.h
@@ -221,19 +221,19 @@
     // 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;
+        const vector<SpecificField>& field_path) = 0;
 
     // Reports that a field has been deleted from Message1.
     virtual void ReportDeleted(
         const Message& message1,
         const Message& message2,
-        const std::vector<SpecificField>& field_path) = 0;
+        const 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 std::vector<SpecificField>& field_path) = 0;
+        const vector<SpecificField>& field_path) = 0;
 
     // Reports that a repeated field has been moved to another location.  This
     // only applies when using TreatAsSet or TreatAsMap()  -- see below. Also
@@ -241,18 +241,18 @@
     // 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 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 vector<SpecificField>& field_path) { }
 
     // Reports that two fields would have been compared, but the
     // comparison has been skipped because the field was marked as
@@ -274,16 +274,16 @@
     // 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 vector<SpecificField>& field_path) { }
 
-    // Report that an unknown field is ignored. (see comment above).
+    // Report that an unkown field is ignored. (see comment above).
     // Note this is a different function since the last SpecificField in field
     // path has a null field.  This could break existing Reporter.
     virtual void ReportUnknownFieldIgnored(
-        const Message& /* message1 */, const Message& /* message2 */,
-        const std::vector<SpecificField>& /* field_path */) {}
+        const Message& message1, const Message& message2,
+        const vector<SpecificField>& field_path) {}
 
    private:
     GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reporter);
@@ -296,10 +296,9 @@
     MapKeyComparator();
     virtual ~MapKeyComparator();
 
-    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 vector<SpecificField>& parent_fields) const {
       GOOGLE_CHECK(false) << "IsMatch() is not implemented.";
       return false;
     }
@@ -321,18 +320,18 @@
 
     // Returns true if the field should be ignored.
     virtual bool IsIgnored(
-        const Message& /* message1 */,
-        const Message& /* message2 */,
-        const FieldDescriptor* /* field */,
-        const std::vector<SpecificField>& /* parent_fields */) = 0;
+        const Message& message1,
+        const Message& message2,
+        const FieldDescriptor* field,
+        const vector<SpecificField>& parent_fields) = 0;
 
     // Returns true if the unknown field should be ignored.
     // Note: This will be called for unknown fields as well in which case
     //       field.field will be null.
     virtual bool IsUnknownFieldIgnored(
-        const Message& /* message1 */, const Message& /* message2 */,
-        const SpecificField& /* field */,
-        const std::vector<SpecificField>& /* parent_fields */) {
+        const Message& message1, const Message& message2,
+        const SpecificField& field,
+        const vector<SpecificField>& parent_fields) {
       return false;
     }
   };
@@ -441,7 +440,7 @@
   // size of each element.
   void TreatAsMapWithMultipleFieldsAsKey(
       const FieldDescriptor* field,
-      const std::vector<const FieldDescriptor*>& key_fields);
+      const vector<const FieldDescriptor*>& key_fields);
   // Same as TreatAsMapWithMultipleFieldsAsKey, except that each of the field
   // do not necessarily need to be a direct subfield. Each element in
   // key_field_paths indicate a path from the message being compared, listing
@@ -457,7 +456,7 @@
   //       !key_field_path[i]->is_repeated()
   void TreatAsMapWithMultipleFieldPathsAsKey(
       const FieldDescriptor* field,
-      const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths);
+      const vector<vector<const FieldDescriptor*> >& key_field_paths);
 
   // Uses a custom MapKeyComparator to determine if two elements have the same
   // key when comparing a repeated field as a map.
@@ -518,13 +517,6 @@
     report_matches_ = report_matches;
   }
 
-  // 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;
-  }
-
   // Sets the scope of the comparison (as defined in the Scope enumeration
   // above) that is used by this differencer when determining which fields to
   // compare between the messages.
@@ -557,10 +549,9 @@
 
   // Same as above, except comparing only the list of fields specified by the
   // two vectors of FieldDescriptors.
-  bool CompareWithFields(
-      const Message& message1, const Message& message2,
-      const std::vector<const FieldDescriptor*>& message1_fields,
-      const std::vector<const FieldDescriptor*>& message2_fields);
+  bool CompareWithFields(const Message& message1, const Message& message2,
+                         const vector<const FieldDescriptor*>& message1_fields,
+                         const vector<const FieldDescriptor*>& message2_fields);
 
   // Automatically creates a reporter that will output the differences
   // found (if any) to the specified output string pointer. Note that this
@@ -579,12 +570,6 @@
   // any differences found in human-readable form to the supplied
   // ZeroCopyOutputStream or Printer. If a printer is used, the delimiter
   // *must* be '$'.
-  //
-  // WARNING: this reporter does not necessarily flush its output until it is
-  // destroyed. As a result, it is not safe to assume the output is valid or
-  // complete until after you destroy the reporter. For example, if you use a
-  // StreamReporter to write to a StringOutputStream, the target string may
-  // contain uninitialized data until the reporter is destroyed.
   class LIBPROTOBUF_EXPORT StreamReporter : public Reporter {
    public:
     explicit StreamReporter(io::ZeroCopyOutputStream* output);
@@ -600,40 +585,35 @@
 
     // The following are implementations of the methods described above.
     virtual void ReportAdded(const Message& message1, const Message& message2,
-                             const std::vector<SpecificField>& field_path);
+                             const vector<SpecificField>& field_path);
 
     virtual void ReportDeleted(const Message& message1,
                                const Message& message2,
-                               const std::vector<SpecificField>& field_path);
+                               const vector<SpecificField>& field_path);
 
     virtual void ReportModified(const Message& message1,
                                 const Message& message2,
-                                const std::vector<SpecificField>& field_path);
+                                const vector<SpecificField>& field_path);
 
     virtual void ReportMoved(const Message& message1,
                              const Message& message2,
-                             const std::vector<SpecificField>& field_path);
+                             const vector<SpecificField>& field_path);
 
     virtual void ReportMatched(const Message& message1,
                                const Message& message2,
-                               const std::vector<SpecificField>& field_path);
+                               const vector<SpecificField>& field_path);
 
     virtual void ReportIgnored(const Message& message1,
                                const Message& message2,
-                               const std::vector<SpecificField>& field_path);
+                               const vector<SpecificField>& field_path);
 
     virtual void ReportUnknownFieldIgnored(
         const Message& message1, const Message& message2,
-        const std::vector<SpecificField>& field_path);
+        const vector<SpecificField>& field_path);
 
    protected:
-    // Prints the specified path of fields to the buffer.  message is used to
-    // print map keys.
-    virtual void PrintPath(const std::vector<SpecificField>& field_path,
-                           bool left_side, const Message& message);
-
     // Prints the specified path of fields to the buffer.
-    virtual void PrintPath(const std::vector<SpecificField>& field_path,
+    virtual void PrintPath(const vector<SpecificField>& field_path,
                            bool left_side);
 
     // Prints the value of fields to the buffer.  left_side is true if the
@@ -642,7 +622,7 @@
     // unknown_field_index1 or unknown_field_index2 when an unknown field
     // is encountered in field_path.
     virtual void PrintValue(const Message& message,
-                            const std::vector<SpecificField>& field_path,
+                            const vector<SpecificField>& field_path,
                             bool left_side);
 
     // Prints the specified path of unknown fields to the buffer.
@@ -665,18 +645,6 @@
   // relies on some private methods of MessageDifferencer. That's why this
   // class is declared as a nested class of MessageDifferencer.
   class MultipleFieldsMapKeyComparator;
-
-  // A MapKeyComparator for use with map_entries.
-  class LIBPROTOBUF_EXPORT MapEntryKeyComparator : public MapKeyComparator {
-   public:
-    explicit MapEntryKeyComparator(MessageDifferencer* message_differencer);
-    virtual bool IsMatch(const Message& message1, const Message& message2,
-                         const std::vector<SpecificField>& parent_fields) const;
-
-   private:
-    MessageDifferencer* message_differencer_;
-  };
-
   // Returns true if field1's number() is less than field2's.
   static bool FieldBefore(const FieldDescriptor* field1,
                           const FieldDescriptor* field2);
@@ -685,11 +653,11 @@
   // All fields present in both lists will always be included in the combined
   // list.  Fields only present in one of the lists will only appear in the
   // combined list if the corresponding fields_scope option is set to FULL.
-  void CombineFields(const std::vector<const FieldDescriptor*>& fields1,
+  void CombineFields(const vector<const FieldDescriptor*>& fields1,
                      Scope fields1_scope,
-                     const std::vector<const FieldDescriptor*>& fields2,
+                     const vector<const FieldDescriptor*>& fields2,
                      Scope fields2_scope,
-                     std::vector<const FieldDescriptor*>* combined_fields);
+                     vector<const FieldDescriptor*>* combined_fields);
 
   // Internal version of the Compare method which performs the actual
   // comparison. The parent_fields vector is a vector containing field
@@ -697,34 +665,34 @@
   // (i.e. if the current message is an embedded message, the parent_fields
   // vector will contain the field that has this embedded message).
   bool Compare(const Message& message1, const Message& message2,
-               std::vector<SpecificField>* parent_fields);
+               vector<SpecificField>* parent_fields);
 
   // Compares all the unknown fields in two messages.
   bool CompareUnknownFields(const Message& message1, const Message& message2,
                             const google::protobuf::UnknownFieldSet&,
                             const google::protobuf::UnknownFieldSet&,
-                            std::vector<SpecificField>* parent_fields);
+                            vector<SpecificField>* parent_fields);
 
   // Compares the specified messages for the requested field lists. The field
   // lists are modified depending on comparison settings, and then passed to
   // CompareWithFieldsInternal.
   bool CompareRequestedFieldsUsingSettings(
       const Message& message1, const Message& message2,
-      const std::vector<const FieldDescriptor*>& message1_fields,
-      const std::vector<const FieldDescriptor*>& message2_fields,
-      std::vector<SpecificField>* parent_fields);
+      const vector<const FieldDescriptor*>& message1_fields,
+      const vector<const FieldDescriptor*>& message2_fields,
+      vector<SpecificField>* parent_fields);
 
   // Compares the specified messages with the specified field lists.
   bool CompareWithFieldsInternal(
       const Message& message1, const Message& message2,
-      const std::vector<const FieldDescriptor*>& message1_fields,
-      const std::vector<const FieldDescriptor*>& message2_fields,
-      std::vector<SpecificField>* parent_fields);
+      const vector<const FieldDescriptor*>& message1_fields,
+      const vector<const FieldDescriptor*>& message2_fields,
+      vector<SpecificField>* parent_fields);
 
   // Compares the repeated fields, and report the error.
   bool CompareRepeatedField(const Message& message1, const Message& message2,
                             const FieldDescriptor* field,
-                            std::vector<SpecificField>* parent_fields);
+                            vector<SpecificField>* parent_fields);
 
   // Shorthand for CompareFieldValueUsingParentFields with NULL parent_fields.
   bool CompareFieldValue(const Message& message1,
@@ -742,13 +710,12 @@
   // list of parent messages if it needs to recursively compare the given field.
   // 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,
-      std::vector<SpecificField>* parent_fields);
+  bool CompareFieldValueUsingParentFields(const Message& message1,
+                                          const Message& message2,
+                                          const FieldDescriptor* field,
+                                          int index1,
+                                          int index2,
+                                          vector<SpecificField>* parent_fields);
 
   // Compares the specified field on the two messages, returning comparison
   // result, as returned by appropriate FieldComparator.
@@ -763,7 +730,7 @@
   bool IsMatch(const FieldDescriptor* repeated_field,
                const MapKeyComparator* key_comparator,
                const Message* message1, const Message* message2,
-               const std::vector<SpecificField>& parent_fields,
+               const vector<SpecificField>& parent_fields,
                int index1, int index2);
 
   // Returns true when this repeated field has been configured to be treated
@@ -781,18 +748,17 @@
       const Message& message1,
       const Message& message2,
       const FieldDescriptor* field,
-      const std::vector<SpecificField>& parent_fields);
+      const vector<SpecificField>& parent_fields);
 
   // Returns true if this unknown field is to be ignored when this
   // MessageDifferencer compares messages.
   bool IsUnknownFieldIgnored(const Message& message1, const Message& message2,
                              const SpecificField& field,
-                             const std::vector<SpecificField>& parent_fields);
+                             const vector<SpecificField>& parent_fields);
 
-  // Returns MapKeyComparator* when this field has been configured to be treated
-  // as a map or its is_map() return true.  If not, returns NULL.
-  const MapKeyComparator* GetMapKeyComparator(
-      const FieldDescriptor* field) const;
+  // Returns MapKeyComparator* when this field has been configured to
+  // be treated as a map.  If not, returns NULL.
+  const MapKeyComparator* GetMapKeyComparator(const FieldDescriptor* field);
 
   // Attempts to match indices of a repeated field, so that the contained values
   // match. Clears output vectors and sets their values to indices of paired
@@ -801,29 +767,28 @@
   // This method returns false if the match failed. However, it doesn't mean
   // 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 FieldDescriptor* repeated_field,
-      const std::vector<SpecificField>& parent_fields,
-      std::vector<int>* match_list1,
-      std::vector<int>* match_list2);
+  bool MatchRepeatedFieldIndices(const Message& message1,
+                                 const Message& message2,
+                                 const FieldDescriptor* repeated_field,
+                                 const vector<SpecificField>& parent_fields,
+                                 vector<int>* match_list1,
+                                 vector<int>* match_list2);
 
   // If "any" is of type google.protobuf.Any, extract its payload using
   // DynamicMessageFactory and store in "data".
   bool UnpackAny(const Message& any, google::protobuf::scoped_ptr<Message>* data);
 
   // Checks if index is equal to new_index in all the specific fields.
-  static bool CheckPathChanged(const std::vector<SpecificField>& parent_fields);
+  static bool CheckPathChanged(const vector<SpecificField>& parent_fields);
 
   // Defines a map between field descriptors and their MapKeyComparators.
   // Used for repeated fields when they are configured as TreatAsMap.
-  typedef std::map<const FieldDescriptor*,
+  typedef map<const FieldDescriptor*,
               const MapKeyComparator*> FieldKeyComparatorMap;
 
   // Defines a set to store field descriptors.  Used for repeated fields when
   // they are configured as TreatAsSet.
-  typedef std::set<const FieldDescriptor*> FieldSet;
+  typedef set<const FieldDescriptor*> FieldSet;
 
   Reporter* reporter_;
   DefaultFieldComparator default_field_comparator_;
@@ -840,15 +805,14 @@
   // When TreatAsMap or TreatAsMapWithMultipleFieldsAsKey is called, we don't
   // store the supplied FieldDescriptors directly. Instead, a new
   // MapKeyComparator is created for comparison purpose.
-  std::vector<MapKeyComparator*> owned_key_comparators_;
+  vector<MapKeyComparator*> owned_key_comparators_;
   FieldKeyComparatorMap map_field_key_comparator_;
-  MapEntryKeyComparator map_entry_key_comparator_;
-  std::vector<IgnoreCriteria*> ignore_criteria_;
+  vector<IgnoreCriteria*> ignore_criteria_;
 
   FieldSet ignored_fields_;
 
+  bool compare_unknown_fields_;
   bool report_matches_;
-  bool report_moves_;
 
   string* output_string_;
 
@@ -861,15 +825,15 @@
 class LIBPROTOBUF_EXPORT FieldContext {
  public:
   explicit FieldContext(
-      std::vector<MessageDifferencer::SpecificField>* parent_fields)
+      vector<MessageDifferencer::SpecificField>* parent_fields)
       : parent_fields_(parent_fields) {}
 
-  std::vector<MessageDifferencer::SpecificField>* parent_fields() const {
+  vector<MessageDifferencer::SpecificField>* parent_fields() const {
     return parent_fields_;
   }
 
  private:
-  std::vector<MessageDifferencer::SpecificField>* parent_fields_;
+  vector<MessageDifferencer::SpecificField>* parent_fields_;
 };
 
 }
diff --git a/src/google/protobuf/util/message_differencer_unittest.cc b/src/google/protobuf/util/message_differencer_unittest.cc
index 75cffd9..a867c88 100755
--- a/src/google/protobuf/util/message_differencer_unittest.cc
+++ b/src/google/protobuf/util/message_differencer_unittest.cc
@@ -38,7 +38,6 @@
 #include <string>
 #include <vector>
 
-#include <google/protobuf/stubs/strutil.h>
 
 #include <google/protobuf/util/field_comparator.h>
 #include <google/protobuf/util/message_differencer.h>
@@ -55,6 +54,7 @@
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
@@ -66,7 +66,7 @@
 
 const FieldDescriptor* GetFieldDescriptor(
     const Message& message, const string& field_name) {
-  std::vector<string> field_path =
+  vector<string> field_path =
       Split(field_name, ".", true);
   const Descriptor* descriptor = message.GetDescriptor();
   const FieldDescriptor* field = NULL;
@@ -790,8 +790,8 @@
   TestUtil::SetAllFields(&msg1);
   TestUtil::SetAllFields(&msg2);
 
-  std::vector<const FieldDescriptor*> fields1;
-  std::vector<const FieldDescriptor*> fields2;
+  vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields2;
   msg1.GetReflection()->ListFields(msg1, &fields1);
   msg2.GetReflection()->ListFields(msg2, &fields2);
 
@@ -805,8 +805,8 @@
 
   TestUtil::SetAllFields(&msg1);
 
-  std::vector<const FieldDescriptor*> fields1;
-  std::vector<const FieldDescriptor*> fields2;
+  vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields2;
   msg1.GetReflection()->ListFields(msg1, &fields1);
   msg2.GetReflection()->ListFields(msg2, &fields2);
 
@@ -820,7 +820,7 @@
 
   TestUtil::SetAllFields(&msg1);
 
-  std::vector<const FieldDescriptor*> empty_fields;
+  vector<const FieldDescriptor*> empty_fields;
 
   util::MessageDifferencer differencer;
   EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2,
@@ -835,7 +835,7 @@
   unittest::TestAllTypes msg1;
   TestUtil::SetAllFields(&msg1);
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   msg1.GetReflection()->ListFields(msg1, &fields);
 
   util::MessageDifferencer differencer;
@@ -843,7 +843,7 @@
 
   {
     // Compare with a subset of fields.
-    std::vector<const FieldDescriptor*> compare_fields;
+    vector<const FieldDescriptor*> compare_fields;
     for (int i = 0; i < fields.size(); ++i) {
       if (i % 2 == 0) {
         compare_fields.push_back(fields[i]);
@@ -856,8 +856,8 @@
     // Specify a different set of fields to compare, even though we're using the
     // same message. This should fail, since we are explicitly saying that the
     // set of fields are different.
-    std::vector<const FieldDescriptor*> compare_fields1;
-    std::vector<const FieldDescriptor*> compare_fields2;
+    vector<const FieldDescriptor*> compare_fields1;
+    vector<const FieldDescriptor*> compare_fields2;
     for (int i = 0; i < fields.size(); ++i) {
       if (i % 2 == 0) {
         compare_fields1.push_back(fields[i]);
@@ -880,8 +880,8 @@
   TestUtil::SetAllFields(&msg1);
   TestUtil::SetAllFields(&msg2);
 
-  std::vector<const FieldDescriptor*> fields1;
-  std::vector<const FieldDescriptor*> fields2;
+  vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields2;
   msg1.GetReflection()->ListFields(msg1, &fields1);
   msg2.GetReflection()->ListFields(msg2, &fields2);
 
@@ -899,10 +899,10 @@
   TestUtil::SetAllFields(&msg1);
   TestUtil::SetAllFields(&msg2);
 
-  std::vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields1;
   msg1.GetReflection()->ListFields(msg1, &fields1);
 
-  std::vector<const FieldDescriptor*> compare_fields;
+  vector<const FieldDescriptor*> compare_fields;
   // Only compare the field descriptors with even indices.
   for (int i = 0; i < fields1.size(); ++i) {
     if (i % 2 == 0) {
@@ -925,11 +925,11 @@
   TestUtil::SetAllFields(&msg1);
   TestUtil::SetAllFields(&msg2);
 
-  std::vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields1;
   const Reflection* reflection = msg1.GetReflection();
   reflection->ListFields(msg1, &fields1);
 
-  std::vector<const FieldDescriptor*> compare_fields;
+  vector<const FieldDescriptor*> compare_fields;
   // Only compare the field descriptors with even indices.
   for (int i = 0; i < fields1.size(); ++i) {
     if (i % 2 == 0) {
@@ -954,10 +954,10 @@
   TestUtil::SetAllFields(&msg2);
   TestUtil::ModifyRepeatedFields(&msg2);
 
-  std::vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields1;
   msg1.GetReflection()->ListFields(msg1, &fields1);
 
-  std::vector<const FieldDescriptor*> compare_fields;
+  vector<const FieldDescriptor*> compare_fields;
   // Only compare the repeated field descriptors.
   for (int i = 0; i < fields1.size(); ++i) {
     if (fields1[i]->is_repeated()) {
@@ -977,8 +977,8 @@
   TestUtil::SetAllFields(&msg1);
   TestUtil::SetAllFields(&msg2);
 
-  std::vector<const FieldDescriptor*> fields1;
-  std::vector<const FieldDescriptor*> fields2;
+  vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields2;
   msg1.GetReflection()->ListFields(msg1, &fields1);
   msg2.GetReflection()->ListFields(msg2, &fields2);
 
@@ -1011,8 +1011,8 @@
   // actually doing something.
   msg2.set_optional_uint64(23);
 
-  std::vector<const FieldDescriptor*> fields1;
-  std::vector<const FieldDescriptor*> fields2;
+  vector<const FieldDescriptor*> fields1;
+  vector<const FieldDescriptor*> fields2;
   fields1.push_back(optional_int32_desc);
   fields1.push_back(default_int64_desc);
 
@@ -1286,7 +1286,7 @@
   util::MessageDifferencer differencer;
   differencer.TreatAsSet(GetFieldDescriptor(msg1, "item.ra"));
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  std::vector<const FieldDescriptor*> key_fields;
+  vector<const FieldDescriptor*> key_fields;
   key_fields.push_back(GetFieldDescriptor(msg1, "item.a"));
   key_fields.push_back(GetFieldDescriptor(msg1, "item.ra"));
   differencer.TreatAsMapWithMultipleFieldsAsKey(
@@ -1363,11 +1363,11 @@
   util::MessageDifferencer differencer;
   differencer.TreatAsSet(GetFieldDescriptor(msg1, "item.m.rc"));
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  std::vector<std::vector<const FieldDescriptor*> > key_field_paths;
-  std::vector<const FieldDescriptor*> key_field_path1;
+  vector<vector<const FieldDescriptor*> > key_field_paths;
+  vector<const FieldDescriptor*> key_field_path1;
   key_field_path1.push_back(GetFieldDescriptor(msg1, "item.m"));
   key_field_path1.push_back(GetFieldDescriptor(msg1, "item.m.a"));
-  std::vector<const FieldDescriptor*> key_field_path2;
+  vector<const FieldDescriptor*> key_field_path2;
   key_field_path2.push_back(GetFieldDescriptor(msg1, "item.m"));
   key_field_path2.push_back(GetFieldDescriptor(msg1, "item.m.rc"));
   key_field_paths.push_back(key_field_path1);
@@ -1413,7 +1413,7 @@
   item->set_b("world");
   // Compare
   util::MessageDifferencer differencer;
-  std::vector<const FieldDescriptor*> key_fields;
+  vector<const FieldDescriptor*> key_fields;
   key_fields.push_back(GetFieldDescriptor(msg1, "item.a"));
   key_fields.push_back(GetFieldDescriptor(msg1, "item.ra"));
   differencer.TreatAsMapWithMultipleFieldsAsKey(
@@ -1457,8 +1457,7 @@
   virtual bool IsIgnored(
       const Message& message1, const Message& message2,
       const FieldDescriptor* field,
-      const std::vector<util::MessageDifferencer::SpecificField>&
-          parent_fields) {
+      const vector<util::MessageDifferencer::SpecificField>& parent_fields) {
     string name = "";
     for (int i = 0; i < parent_fields.size(); ++i) {
       name += parent_fields[i].field->name() + ".";
@@ -1503,7 +1502,7 @@
   typedef util::MessageDifferencer::SpecificField SpecificField;
   virtual bool IsMatch(
       const Message &message1, const Message &message2,
-      const std::vector<SpecificField>& parent_fields) const {
+      const vector<SpecificField>& parent_fields) const {
     const Reflection* reflection1 = message1.GetReflection();
     const Reflection* reflection2 = message2.GetReflection();
     // FieldDescriptor for item.ra
@@ -1558,43 +1557,6 @@
   EXPECT_EQ("ignored: item[0].ra\n", output);
 }
 
-// Compares fields by their index offset by one, so index 0 matches with 1, etc.
-class OffsetByOneMapKeyComparator
-    : 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 {
-    return parent_fields.back().index + 1 == parent_fields.back().new_index;
-  }
-};
-
-TEST(MessageDifferencerTest, RepeatedFieldMapTest_CustomIndexMapKeyComparator) {
-  protobuf_unittest::TestDiffMessage msg1;
-  protobuf_unittest::TestDiffMessage msg2;
-  // Treat "item" as Map, using custom key comparator to determine if two
-  // elements have the same key.
-  protobuf_unittest::TestDiffMessage::Item* item = msg1.add_item();
-  item->set_b("one");
-  item = msg2.add_item();
-  item->set_b("zero");
-  item = msg2.add_item();
-  item->set_b("one");
-  util::MessageDifferencer differencer;
-  OffsetByOneMapKeyComparator key_comparator;
-  differencer.TreatAsMapUsingKeyComparator(GetFieldDescriptor(msg1, "item"),
-                                           &key_comparator);
-  string output;
-  differencer.ReportDifferencesToString(&output);
-  // With the offset by one comparator msg1.item[0] should be compared to
-  // msg2.item[1] and thus be moved, msg2.item[0] should be marked as added.
-  EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ(
-      "moved: item[0] -> item[1] : { b: \"one\" }\n"
-      "added: item[0]: { b: \"zero\" }\n",
-      output);
-}
-
 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Subset) {
   protobuf_unittest::TestDiffMessage msg1;
   protobuf_unittest::TestDiffMessage msg2;
@@ -1901,7 +1863,7 @@
   const FieldDescriptor* c = GetFieldDescriptor(msg1, "c");
   const FieldDescriptor* rc = GetFieldDescriptor(msg1, "rc");
 
-  std::vector<const FieldDescriptor*> fields;
+  vector<const FieldDescriptor*> fields;
   fields.push_back(c);
   fields.push_back(rc);
 
@@ -1937,12 +1899,12 @@
     }
   }
 
-  std::vector<google::protobuf::util::MessageDifferencer::SpecificField> parent_fields() {
+  vector<google::protobuf::util::MessageDifferencer::SpecificField> parent_fields() {
     return parent_fields_;
   }
 
  private:
-  std::vector<google::protobuf::util::MessageDifferencer::SpecificField> parent_fields_;
+  vector<google::protobuf::util::MessageDifferencer::SpecificField> parent_fields_;
 };
 
 // Tests if MessageDifferencer sends the parent fields in the FieldContext
@@ -2079,9 +2041,6 @@
   unittest::TestEmptyMessage empty1_;
   unittest::TestEmptyMessage empty2_;
 
-  unittest::TestMap map_proto1_;
-  unittest::TestMap map_proto2_;
-
   UnknownFieldSet* unknown1_;
   UnknownFieldSet* unknown2_;
 
@@ -2390,7 +2349,7 @@
 }
 
 TEST_F(ComparisonTest, RepeatedSetOptionTest_Unknown) {
-  // Currently, as_set option doesn't have affects on unknown field.
+  // Currently, as_set option doens't have affects on unknown field.
   // If needed, this feature will be added by request.
   repeated_field_as_set();
   unknown1_->AddGroup(245)->AddFixed32(248, 1);
@@ -2842,133 +2801,6 @@
   EXPECT_TRUE(util::MessageDifferencer::Equivalent(message1, message2));
 }
 
-TEST_F(ComparisonTest, MapTest) {
-  Map<string, string>& map1 = *map_proto1_.mutable_map_string_string();
-  map1["key1"] = "1";
-  map1["key2"] = "2";
-  map1["key3"] = "3";
-  Map<string, string>& map2 = *map_proto2_.mutable_map_string_string();
-  map2["key3"] = "0";
-  map2["key2"] = "2";
-  map2["key1"] = "1";
-
-  EXPECT_EQ("modified: map_string_string.value: \"3\" -> \"0\"\n",
-            Run(map_proto1_, map_proto2_));
-}
-
-TEST_F(ComparisonTest, MapIgnoreKeyTest) {
-  Map<string, string>& map1 = *map_proto1_.mutable_map_string_string();
-  map1["key1"] = "1";
-  map1["key2"] = "2";
-  map1["key3"] = "3";
-  Map<string, string>& map2 = *map_proto2_.mutable_map_string_string();
-  map2["key4"] = "2";
-  map2["key5"] = "3";
-  map2["key6"] = "1";
-
-  util::MessageDifferencer differencer;
-  differencer.IgnoreField(
-      GetFieldDescriptor(map_proto1_, "map_string_string.key"));
-  EXPECT_TRUE(differencer.Compare(map_proto1_, map_proto2_));
-}
-
-TEST_F(ComparisonTest, MapRoundTripSyncTest) {
-  google::protobuf::TextFormat::Parser parser;
-  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));
-
-  // During copy, data is synced from repeated field to map.
-  unittest::TestMap map_reflection2 = map_reflection1;
-
-  // During comparison, data is synced from map to repeated field.
-  EXPECT_TRUE(
-      util::MessageDifferencer::Equals(map_reflection1, map_reflection2));
-}
-
-TEST_F(ComparisonTest, MapEntryPartialTest) {
-  google::protobuf::TextFormat::Parser parser;
-  unittest::TestMap map1;
-  unittest::TestMap map2;
-
-  string output;
-  util::MessageDifferencer differencer;
-  differencer.set_scope(util::MessageDifferencer::PARTIAL);
-  differencer.ReportDifferencesToString(&output);
-
-  ASSERT_TRUE(parser.ParseFromString(
-      "map_int32_foreign_message { key: 1 value { c: 1 } }", &map1));
-  ASSERT_TRUE(parser.ParseFromString(
-      "map_int32_foreign_message { key: 1 value { c: 2 }}", &map2));
-  EXPECT_FALSE(differencer.Compare(map1, map2));
-  EXPECT_EQ("modified: map_int32_foreign_message.value.c: 1 -> 2\n", output);
-
-  ASSERT_TRUE(
-      parser.ParseFromString("map_int32_foreign_message { key: 1 }", &map1));
-  EXPECT_TRUE(differencer.Compare(map1, map2));
-}
-
-TEST_F(ComparisonTest, MapEntryPartialEmptyKeyTest) {
-  google::protobuf::TextFormat::Parser parser;
-  unittest::TestMap map1;
-  unittest::TestMap map2;
-  ASSERT_TRUE(parser.ParseFromString("map_int32_foreign_message {}", &map1));
-  ASSERT_TRUE(
-      parser.ParseFromString("map_int32_foreign_message { key: 1 }", &map2));
-
-  util::MessageDifferencer differencer;
-  differencer.set_scope(util::MessageDifferencer::PARTIAL);
-  EXPECT_TRUE(differencer.Compare(map1, map2));
-}
-
-// Considers strings keys as equal if they have equal lengths.
-class LengthMapKeyComparator
-    : 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 {
-    const Reflection* reflection1 = message1.GetReflection();
-    const Reflection* reflection2 = message2.GetReflection();
-    const FieldDescriptor* key_field =
-        message1.GetDescriptor()->FindFieldByName("key");
-    return reflection1->GetString(message1, key_field).size() ==
-           reflection2->GetString(message2, key_field).size();
-  }
-};
-
-TEST_F(ComparisonTest, MapEntryCustomMapKeyComparator) {
-  google::protobuf::TextFormat::Parser parser;
-  protobuf_unittest::TestMap msg1;
-  protobuf_unittest::TestMap msg2;
-
-  ASSERT_TRUE(parser.ParseFromString(
-      "map_string_foreign_message { key: 'key1' value { c: 1 }}", &msg1));
-  ASSERT_TRUE(parser.ParseFromString(
-      "map_string_foreign_message { key: 'key2' value { c: 1 }}", &msg2));
-
-  util::MessageDifferencer differencer;
-  LengthMapKeyComparator key_comparator;
-  differencer.TreatAsMapUsingKeyComparator(
-      GetFieldDescriptor(msg1, "map_string_foreign_message"), &key_comparator);
-  string output;
-  differencer.ReportDifferencesToString(&output);
-  // Though the above two messages have different keys for their map entries,
-  // they are considered the same by key_comparator because their lengths are
-  // equal.  However, in value comparison, all fields of the message are taken
-  // into consideration, so they are reported as different.
-  EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("modified: map_string_foreign_message.key: \"key1\" -> \"key2\"\n",
-            output);
-  differencer.IgnoreField(
-      GetFieldDescriptor(msg1, "map_string_foreign_message.key"));
-  output.clear();
-  EXPECT_TRUE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("ignored: map_string_foreign_message.key\n", output);
-}
-
 class MatchingTest : public testing::Test {
  public:
   typedef util::MessageDifferencer MessageDifferencer;
@@ -3313,24 +3145,6 @@
   EXPECT_TRUE(message_differencer.Compare(m1, m2));
 }
 
-TEST(Anytest, TreatAsSet_DifferentType) {
-  protobuf_unittest::TestField value1;
-  value1.set_a(20);
-  value1.set_b(30);
-  protobuf_unittest::TestDiffMessage value2;
-  value2.add_rv(40);
-
-  protobuf_unittest::TestAny m1, m2;
-  m1.add_repeated_any_value()->PackFrom(value1);
-  m1.add_repeated_any_value()->PackFrom(value2);
-  m2.add_repeated_any_value()->PackFrom(value2);
-  m2.add_repeated_any_value()->PackFrom(value1);
-
-  util::MessageDifferencer message_differencer;
-  message_differencer.TreatAsSet(GetFieldDescriptor(m1, "repeated_any_value"));
-  EXPECT_TRUE(message_differencer.Compare(m1, m2));
-}
-
 
 }  // namespace
 }  // namespace protobuf
diff --git a/src/google/protobuf/util/package_info.h b/src/google/protobuf/util/package_info.h
deleted file mode 100644
index e37e6dc..0000000
--- a/src/google/protobuf/util/package_info.h
+++ /dev/null
@@ -1,46 +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.
-
-// This file exists solely to document the google::protobuf::util namespace.
-// It is not compiled into anything, but it may be read by an automated
-// documentation generator.
-
-namespace google {
-
-namespace protobuf {
-
-// Utility classes.
-//
-// This package contains various utilities for message comprasion, JSON
-// conversion, well known types, etc.
-namespace util {}
-
-}  // namespace protobuf
-}  // namespace google
diff --git a/src/google/protobuf/util/time_util.cc b/src/google/protobuf/util/time_util.cc
index 46a6f5a..c782d69 100644
--- a/src/google/protobuf/util/time_util.cc
+++ b/src/google/protobuf/util/time_util.cc
@@ -49,9 +49,11 @@
 static const int kMicrosPerSecond = 1000000;
 static const int kMillisPerSecond = 1000;
 static const int kNanosPerMillisecond = 1000000;
+static const int kMicrosPerMillisecond = 1000;
 static const int kNanosPerMicrosecond = 1000;
 static const int kSecondsPerMinute = 60;  // Note that we ignore leap seconds.
 static const int kSecondsPerHour = 3600;
+static const char kTimestampFormat[] = "%E4Y-%m-%dT%H:%M:%S";
 
 template <typename T>
 T CreateNormalized(int64 seconds, int64 nanos);
@@ -140,15 +142,6 @@
 }
 }  // namespace
 
-// Actually define these static const integers. Required by C++ standard (but
-// some compilers don't like it).
-#ifndef _MSC_VER
-const int64 TimeUtil::kTimestampMinSeconds;
-const int64 TimeUtil::kTimestampMaxSeconds;
-const int64 TimeUtil::kDurationMaxSeconds;
-const int64 TimeUtil::kDurationMinSeconds;
-#endif  // !_MSC_VER
-
 string TimeUtil::ToString(const Timestamp& timestamp) {
   return FormatTime(timestamp.seconds(), timestamp.nanos());
 }
@@ -181,7 +174,7 @@
     seconds = -seconds;
     nanos = -nanos;
   }
-  result += SimpleItoa(seconds);
+  result += StringPrintf("%" GOOGLE_LL_FORMAT "d", seconds);
   if (nanos != 0) {
     result += "." + FormatNanos(nanos);
   }
@@ -374,6 +367,19 @@
 using google::protobuf::util::kNanosPerSecond;
 using google::protobuf::util::CreateNormalized;
 
+// Convert a Timestamp to uint128.
+void ToUint128(const Timestamp& value, uint128* result, bool* negative) {
+  if (value.seconds() < 0) {
+    *negative = true;
+    *result = static_cast<uint64>(-value.seconds());
+    *result = *result * kNanosPerSecond - static_cast<uint32>(value.nanos());
+  } else {
+    *negative = false;
+    *result = static_cast<uint64>(value.seconds());
+    *result = *result * kNanosPerSecond + static_cast<uint32>(value.nanos());
+  }
+}
+
 // Convert a Duration to uint128.
 void ToUint128(const Duration& value, uint128* result, bool* negative) {
   if (value.seconds() < 0 || value.nanos() < 0) {
@@ -387,6 +393,21 @@
   }
 }
 
+void ToTimestamp(const uint128& value, bool negative, Timestamp* timestamp) {
+  int64 seconds = static_cast<int64>(Uint128Low64(value / kNanosPerSecond));
+  int32 nanos = static_cast<int32>(Uint128Low64(value % kNanosPerSecond));
+  if (negative) {
+    seconds = -seconds;
+    nanos = -nanos;
+    if (nanos < 0) {
+      nanos += kNanosPerSecond;
+      seconds -= 1;
+    }
+  }
+  timestamp->set_seconds(seconds);
+  timestamp->set_nanos(nanos);
+}
+
 void ToDuration(const uint128& value, bool negative, Duration* duration) {
   int64 seconds = static_cast<int64>(Uint128Low64(value / kNanosPerSecond));
   int32 nanos = static_cast<int32>(Uint128Low64(value % kNanosPerSecond));
diff --git a/src/google/protobuf/util/time_util.h b/src/google/protobuf/util/time_util.h
index b884693..1bac089 100644
--- a/src/google/protobuf/util/time_util.h
+++ b/src/google/protobuf/util/time_util.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Defines utilities for the Timestamp and Duration well known types.
-
 #ifndef GOOGLE_PROTOBUF_UTIL_TIME_UTIL_H__
 #define GOOGLE_PROTOBUF_UTIL_TIME_UTIL_H__
 
@@ -49,7 +47,6 @@
 namespace protobuf {
 namespace util {
 
-// Utility functions for Timestamp and Duration.
 class LIBPROTOBUF_EXPORT TimeUtil {
   typedef google::protobuf::Timestamp Timestamp;
   typedef google::protobuf::Duration Duration;
@@ -237,7 +234,7 @@
   return result %= d2;
 }
 
-inline std::ostream& operator<<(std::ostream& out, const Duration& d) {
+inline ostream& operator<<(ostream& out, const Duration& d) {
   out << google::protobuf::util::TimeUtil::ToString(d);
   return out;
 }
@@ -284,7 +281,7 @@
 }
 LIBPROTOBUF_EXPORT Duration operator-(const Timestamp& t1, const Timestamp& t2);
 
-inline std::ostream& operator<<(std::ostream& out, const Timestamp& t) {
+inline ostream& operator<<(ostream& out, const Timestamp& t) {
   out << google::protobuf::util::TimeUtil::ToString(t);
   return out;
 }
diff --git a/src/google/protobuf/util/type_resolver.h b/src/google/protobuf/util/type_resolver.h
index 959f3c7..77d4416 100644
--- a/src/google/protobuf/util/type_resolver.h
+++ b/src/google/protobuf/util/type_resolver.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Defines a TypeResolver for the Any message.
-
 #ifndef GOOGLE_PROTOBUF_UTIL_TYPE_RESOLVER_H__
 #define GOOGLE_PROTOBUF_UTIL_TYPE_RESOLVER_H__
 
diff --git a/src/google/protobuf/util/type_resolver_util.cc b/src/google/protobuf/util/type_resolver_util.cc
index febaa41..9639390 100644
--- a/src/google/protobuf/util/type_resolver_util.cc
+++ b/src/google/protobuf/util/type_resolver_util.cc
@@ -54,6 +54,17 @@
 using util::error::INVALID_ARGUMENT;
 using util::error::NOT_FOUND;
 
+bool SplitTypeUrl(const string& type_url, string* url_prefix,
+                  string* message_name) {
+  size_t pos = type_url.find_last_of("/");
+  if (pos == string::npos) {
+    return false;
+  }
+  *url_prefix = type_url.substr(0, pos);
+  *message_name = type_url.substr(pos + 1);
+  return true;
+}
+
 class DescriptorPoolTypeResolver : public TypeResolver {
  public:
   DescriptorPoolTypeResolver(const string& url_prefix,
@@ -61,27 +72,38 @@
       : url_prefix_(url_prefix), pool_(pool) {}
 
   Status ResolveMessageType(const string& type_url, Type* type) {
-    string type_name;
-    Status status = ParseTypeUrl(type_url, &type_name);
-    if (!status.ok()) {
-      return status;
+    string url_prefix, message_name;
+    if (!SplitTypeUrl(type_url, &url_prefix, &message_name) ||
+        url_prefix != url_prefix_) {
+      return Status(INVALID_ARGUMENT,
+                    StrCat("Invalid type URL, type URLs must be of the form '",
+                           url_prefix_, "/<typename>', got: ", type_url));
     }
-
-    const Descriptor* descriptor = pool_->FindMessageTypeByName(type_name);
+    if (url_prefix != url_prefix_) {
+      return Status(INVALID_ARGUMENT,
+                    "Cannot resolve types from URL: " + url_prefix);
+    }
+    const Descriptor* descriptor = pool_->FindMessageTypeByName(message_name);
     if (descriptor == NULL) {
-      return Status(NOT_FOUND, "Invalid type URL, unknown type: " + type_name);
+      return Status(NOT_FOUND,
+                    "Invalid type URL, unknown type: " + message_name);
     }
     ConvertDescriptor(descriptor, type);
     return Status();
   }
 
   Status ResolveEnumType(const string& type_url, Enum* enum_type) {
-    string type_name;
-    Status status = ParseTypeUrl(type_url, &type_name);
-    if (!status.ok()) {
-      return status;
+    string url_prefix, type_name;
+    if (!SplitTypeUrl(type_url, &url_prefix, &type_name) ||
+        url_prefix != url_prefix_) {
+      return Status(INVALID_ARGUMENT,
+                    StrCat("Invalid type URL, type URLs must be of the form '",
+                           url_prefix_, "/<typename>', got: ", type_url));
     }
-
+    if (url_prefix != url_prefix_) {
+      return Status(INVALID_ARGUMENT,
+                    "Cannot resolve types from URL: " + url_prefix);
+    }
     const EnumDescriptor* descriptor = pool_->FindEnumTypeByName(type_name);
     if (descriptor == NULL) {
       return Status(NOT_FOUND, "Invalid type URL, unknown type: " + type_name);
@@ -181,16 +203,6 @@
     return url_prefix_ + "/" + descriptor->full_name();
   }
 
-  Status ParseTypeUrl(const string& type_url, string* type_name) {
-    if (type_url.substr(0, url_prefix_.size() + 1) != url_prefix_ + "/") {
-      return Status(INVALID_ARGUMENT,
-                    StrCat("Invalid type URL, type URLs must be of the form '",
-                           url_prefix_, "/<typename>', got: ", type_url));
-    }
-    *type_name = type_url.substr(url_prefix_.size() + 1);
-    return Status();
-  }
-
   string DefaultValueAsString(const FieldDescriptor* descriptor) {
     switch (descriptor->cpp_type()) {
       case FieldDescriptor::CPPTYPE_INT32:
diff --git a/src/google/protobuf/util/type_resolver_util.h b/src/google/protobuf/util/type_resolver_util.h
index c17366f..c0ef3c1 100644
--- a/src/google/protobuf/util/type_resolver_util.h
+++ b/src/google/protobuf/util/type_resolver_util.h
@@ -28,8 +28,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// Defines utilities for the TypeResolver.
-
 #ifndef GOOGLE_PROTOBUF_UTIL_TYPE_RESOLVER_UTIL_H__
 #define GOOGLE_PROTOBUF_UTIL_TYPE_RESOLVER_UTIL_H__
 
diff --git a/src/google/protobuf/wire_format.cc b/src/google/protobuf/wire_format.cc
index 01704c9..5ee4e25 100644
--- a/src/google/protobuf/wire_format.cc
+++ b/src/google/protobuf/wire_format.cc
@@ -42,8 +42,6 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/stringprintf.h>
 #include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/map_field.h>
 #include <google/protobuf/wire_format_lite_inl.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/io/coded_stream.h>
@@ -54,17 +52,9 @@
 
 
 namespace google {
-const size_t kMapEntryTagByteSize = 2;
-
 namespace protobuf {
 namespace internal {
 
-// Forward declare static functions
-static size_t MapKeyDataOnlyByteSize(const FieldDescriptor* field,
-                                     const MapKey& value);
-static size_t MapValueRefDataOnlyByteSize(const FieldDescriptor* field,
-                                          const MapValueRef& value);
-
 // ===================================================================
 
 bool UnknownFieldSetFieldSkipper::SkipField(
@@ -84,8 +74,6 @@
 bool WireFormat::SkipField(io::CodedInputStream* input, uint32 tag,
                            UnknownFieldSet* unknown_fields) {
   int number = WireFormatLite::GetTagFieldNumber(tag);
-  // Field number 0 is illegal.
-  if (number == 0) return false;
 
   switch (WireFormatLite::GetTagWireType(tag)) {
     case WireFormatLite::WIRETYPE_VARINT: {
@@ -319,9 +307,9 @@
   return target;
 }
 
-size_t WireFormat::ComputeUnknownFieldsSize(
+int WireFormat::ComputeUnknownFieldsSize(
     const UnknownFieldSet& unknown_fields) {
-  size_t size = 0;
+  int size = 0;
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
 
@@ -367,9 +355,9 @@
   return size;
 }
 
-size_t WireFormat::ComputeUnknownMessageSetItemsSize(
+int WireFormat::ComputeUnknownMessageSetItemsSize(
     const UnknownFieldSet& unknown_fields) {
-  size_t size = 0;
+  int size = 0;
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
 
@@ -804,17 +792,8 @@
   const Reflection* message_reflection = message.GetReflection();
   int expected_endpoint = output->ByteCount() + size;
 
-  std::vector<const FieldDescriptor*> fields;
-
-  // Fields of map entry should always be serialized.
-  if (descriptor->options().map_entry()) {
-    for (int i = 0; i < descriptor->field_count(); i++) {
-      fields.push_back(descriptor->field(i));
-    }
-  } else {
-    message_reflection->ListFields(message, &fields);
-  }
-
+  vector<const FieldDescriptor*> fields;
+  message_reflection->ListFields(message, &fields);
   for (int i = 0; i < fields.size(); i++) {
     SerializeFieldWithCachedSizes(fields[i], message, output);
   }
@@ -833,129 +812,6 @@
        "during serialization?";
 }
 
-static void SerializeMapKeyWithCachedSizes(const FieldDescriptor* field,
-                                           const MapKey& value,
-                                           io::CodedOutputStream* output) {
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_DOUBLE:
-    case FieldDescriptor::TYPE_FLOAT:
-    case FieldDescriptor::TYPE_GROUP:
-    case FieldDescriptor::TYPE_MESSAGE:
-    case FieldDescriptor::TYPE_BYTES:
-    case FieldDescriptor::TYPE_ENUM:
-      GOOGLE_LOG(FATAL) << "Unsupported";
-      break;
-#define CASE_TYPE(FieldType, CamelFieldType, CamelCppType)                     \
-  case FieldDescriptor::TYPE_##FieldType:                                      \
-    WireFormatLite::Write##CamelFieldType(1, value.Get##CamelCppType##Value(), \
-                                          output);                             \
-    break;
-      CASE_TYPE(INT64, Int64, Int64)
-      CASE_TYPE(UINT64, UInt64, UInt64)
-      CASE_TYPE(INT32, Int32, Int32)
-      CASE_TYPE(FIXED64, Fixed64, UInt64)
-      CASE_TYPE(FIXED32, Fixed32, UInt32)
-      CASE_TYPE(BOOL, Bool, Bool)
-      CASE_TYPE(UINT32, UInt32, UInt32)
-      CASE_TYPE(SFIXED32, SFixed32, Int32)
-      CASE_TYPE(SFIXED64, SFixed64, Int64)
-      CASE_TYPE(SINT32, SInt32, Int32)
-      CASE_TYPE(SINT64, SInt64, Int64)
-      CASE_TYPE(STRING, String, String)
-#undef CASE_TYPE
-  }
-}
-
-static void SerializeMapValueRefWithCachedSizes(const FieldDescriptor* field,
-                                                const MapValueRef& value,
-                                                io::CodedOutputStream* output) {
-  switch (field->type()) {
-#define CASE_TYPE(FieldType, CamelFieldType, CamelCppType)                     \
-  case FieldDescriptor::TYPE_##FieldType:                                      \
-    WireFormatLite::Write##CamelFieldType(2, value.Get##CamelCppType##Value(), \
-                                          output);                             \
-    break;
-    CASE_TYPE(INT64, Int64, Int64)
-    CASE_TYPE(UINT64, UInt64, UInt64)
-    CASE_TYPE(INT32, Int32, Int32)
-    CASE_TYPE(FIXED64, Fixed64, UInt64)
-    CASE_TYPE(FIXED32, Fixed32, UInt32)
-    CASE_TYPE(BOOL, Bool, Bool)
-    CASE_TYPE(UINT32, UInt32, UInt32)
-    CASE_TYPE(SFIXED32, SFixed32, Int32)
-    CASE_TYPE(SFIXED64, SFixed64, Int64)
-    CASE_TYPE(SINT32, SInt32, Int32)
-    CASE_TYPE(SINT64, SInt64, Int64)
-    CASE_TYPE(ENUM, Enum, Enum)
-    CASE_TYPE(DOUBLE, Double, Double)
-    CASE_TYPE(FLOAT, Float, Float)
-    CASE_TYPE(STRING, String, String)
-    CASE_TYPE(BYTES, Bytes, String)
-    CASE_TYPE(MESSAGE, Message, Message)
-    CASE_TYPE(GROUP, Group, Message)
-#undef CASE_TYPE
-  }
-}
-
-class MapKeySorter {
- public:
-  static std::vector<MapKey> SortKey(const Message& message,
-                                     const Reflection* reflection,
-                                     const FieldDescriptor* field) {
-    std::vector<MapKey> sorted_key_list;
-    for (MapIterator it =
-             reflection->MapBegin(const_cast<Message*>(&message), field);
-         it != reflection->MapEnd(const_cast<Message*>(&message), field);
-         ++it) {
-      sorted_key_list.push_back(it.GetKey());
-    }
-    MapKeyComparator comparator;
-    std::sort(sorted_key_list.begin(), sorted_key_list.end(), comparator);
-    return sorted_key_list;
-  }
-
- private:
-  class MapKeyComparator {
-   public:
-    bool operator()(const MapKey& a, const MapKey& b) const {
-      GOOGLE_DCHECK(a.type() == b.type());
-      switch (a.type()) {
-#define CASE_TYPE(CppType, CamelCppType)                                \
-  case FieldDescriptor::CPPTYPE_##CppType: {                            \
-    return a.Get##CamelCppType##Value() < b.Get##CamelCppType##Value(); \
-  }
-        CASE_TYPE(STRING, String)
-        CASE_TYPE(INT64, Int64)
-        CASE_TYPE(INT32, Int32)
-        CASE_TYPE(UINT64, UInt64)
-        CASE_TYPE(UINT32, UInt32)
-        CASE_TYPE(BOOL, Bool)
-#undef CASE_TYPE
-
-        default:
-          GOOGLE_LOG(DFATAL) << "Invalid key for map field.";
-          return true;
-      }
-    }
-  };
-};
-
-static void SerializeMapEntry(const FieldDescriptor* field, const MapKey& key,
-                              const MapValueRef& value,
-                              io::CodedOutputStream* output) {
-  const FieldDescriptor* key_field = field->message_type()->field(0);
-  const FieldDescriptor* value_field = field->message_type()->field(1);
-
-  WireFormatLite::WriteTag(field->number(),
-                           WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
-  size_t size = kMapEntryTagByteSize;
-  size += MapKeyDataOnlyByteSize(key_field, key);
-  size += MapValueRefDataOnlyByteSize(value_field, value);
-  output->WriteVarint32(size);
-  SerializeMapKeyWithCachedSizes(key_field, key, output);
-  SerializeMapValueRefWithCachedSizes(value_field, value, output);
-}
-
 void WireFormat::SerializeFieldWithCachedSizes(
     const FieldDescriptor* field,
     const Message& message,
@@ -970,71 +826,19 @@
     return;
   }
 
-  // For map fields, we can use either repeated field reflection or map
-  // reflection.  Our choice has some subtle effects.  If we use repeated field
-  // reflection here, then the repeated field representation becomes
-  // authoritative for this field: any existing references that came from map
-  // reflection remain valid for reading, but mutations to them are lost and
-  // will be overwritten next time we call map reflection!
-  //
-  // So far this mainly affects Python, which keeps long-term references to map
-  // values around, and always uses map reflection.  See: b/35918691
-  //
-  // Here we choose to use map reflection API as long as the internal
-  // map is valid. In this way, the serialization doesn't change map field's
-  // internal state and existing references that came from map reflection remain
-  // valid for both reading and writing.
-  if (field->is_map()) {
-    MapFieldBase* map_field =
-        message_reflection->MapData(const_cast<Message*>(&message), field);
-    if (map_field->IsMapValid()) {
-      if (output->IsSerializationDeterministic()) {
-        std::vector<MapKey> sorted_key_list =
-            MapKeySorter::SortKey(message, message_reflection, field);
-        for (std::vector<MapKey>::iterator it = sorted_key_list.begin();
-             it != sorted_key_list.end(); ++it) {
-          MapValueRef map_value;
-          message_reflection->InsertOrLookupMapValue(
-              const_cast<Message*>(&message), field, *it, &map_value);
-          SerializeMapEntry(field, *it, map_value, output);
-        }
-      } else {
-        for (MapIterator it = message_reflection->MapBegin(
-                 const_cast<Message*>(&message), field);
-             it !=
-             message_reflection->MapEnd(const_cast<Message*>(&message), field);
-             ++it) {
-          SerializeMapEntry(field, it.GetKey(), it.GetValueRef(), output);
-        }
-      }
-
-      return;
-    }
-  }
-
   int count = 0;
 
   if (field->is_repeated()) {
     count = message_reflection->FieldSize(message, field);
-  } else if (field->containing_type()->options().map_entry()) {
-    // Map entry fields always need to be serialized.
-    count = 1;
   } else if (message_reflection->HasField(message, field)) {
     count = 1;
   }
 
-  // map_entries is for maps that'll be deterministically serialized.
-  std::vector<const Message*> map_entries;
-  if (count > 1 && field->is_map() && output->IsSerializationDeterministic()) {
-    map_entries =
-        DynamicMapSorter::Sort(message, count, message_reflection, field);
-  }
-
   const bool is_packed = field->is_packed();
   if (is_packed && count > 0) {
     WireFormatLite::WriteTag(field->number(),
         WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
-    const size_t data_size = FieldDataOnlyByteSize(field, message);
+    const int data_size = FieldDataOnlyByteSize(field, message);
     output->WriteVarint32(data_size);
   }
 
@@ -1073,17 +877,15 @@
       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);                                                      \
+#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                       \
+      case FieldDescriptor::TYPE_##TYPE:                                     \
+        WireFormatLite::Write##TYPE_METHOD(                                  \
+              field->number(),                                               \
+              field->is_repeated() ?                                         \
+                message_reflection->GetRepeated##CPPTYPE_METHOD(             \
+                  message, field, j) :                                       \
+                message_reflection->Get##CPPTYPE_METHOD(message, field),     \
+              output);                                                       \
         break;
 
       HANDLE_TYPE(GROUP  , Group  , Message)
@@ -1162,23 +964,14 @@
 
 // ===================================================================
 
-size_t WireFormat::ByteSize(const Message& message) {
+int WireFormat::ByteSize(const Message& message) {
   const Descriptor* descriptor = message.GetDescriptor();
   const Reflection* message_reflection = message.GetReflection();
 
-  size_t our_size = 0;
+  int our_size = 0;
 
-  std::vector<const FieldDescriptor*> fields;
-
-  // Fields of map entry should always be serialized.
-  if (descriptor->options().map_entry()) {
-    for (int i = 0; i < descriptor->field_count(); i++) {
-      fields.push_back(descriptor->field(i));
-    }
-  } else {
-    message_reflection->ListFields(message, &fields);
-  }
-
+  vector<const FieldDescriptor*> fields;
+  message_reflection->ListFields(message, &fields);
   for (int i = 0; i < fields.size(); i++) {
     our_size += FieldByteSize(fields[i], message);
   }
@@ -1194,7 +987,7 @@
   return our_size;
 }
 
-size_t WireFormat::FieldByteSize(
+int WireFormat::FieldByteSize(
     const FieldDescriptor* field,
     const Message& message) {
   const Reflection* message_reflection = message.GetReflection();
@@ -1206,18 +999,15 @@
     return MessageSetItemByteSize(field, message);
   }
 
-  size_t count = 0;
+  int count = 0;
   if (field->is_repeated()) {
-    count = FromIntSize(message_reflection->FieldSize(message, field));
-  } else if (field->containing_type()->options().map_entry()) {
-    // Map entry fields always need to be serialized.
-    count = 1;
+    count = message_reflection->FieldSize(message, field);
   } else if (message_reflection->HasField(message, field)) {
     count = 1;
   }
 
-  const size_t data_size = FieldDataOnlyByteSize(field, message);
-  size_t our_size = data_size;
+  const int data_size = FieldDataOnlyByteSize(field, message);
+  int our_size = data_size;
   if (field->is_packed()) {
     if (data_size > 0) {
       // Packed fields get serialized like a string, not their native type.
@@ -1232,124 +1022,19 @@
   return our_size;
 }
 
-static size_t MapKeyDataOnlyByteSize(const FieldDescriptor* field,
-                                     const MapKey& value) {
-  GOOGLE_DCHECK_EQ(FieldDescriptor::TypeToCppType(field->type()), value.type());
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_DOUBLE:
-    case FieldDescriptor::TYPE_FLOAT:
-    case FieldDescriptor::TYPE_GROUP:
-    case FieldDescriptor::TYPE_MESSAGE:
-    case FieldDescriptor::TYPE_BYTES:
-    case FieldDescriptor::TYPE_ENUM:
-      GOOGLE_LOG(FATAL) << "Unsupported";
-      return 0;
-#define CASE_TYPE(FieldType, CamelFieldType, CamelCppType) \
-  case FieldDescriptor::TYPE_##FieldType:                  \
-    return WireFormatLite::CamelFieldType##Size(           \
-        value.Get##CamelCppType##Value());
-
-#define FIXED_CASE_TYPE(FieldType, CamelFieldType) \
-  case FieldDescriptor::TYPE_##FieldType:          \
-    return WireFormatLite::k##CamelFieldType##Size;
-
-      CASE_TYPE(INT32, Int32, Int32);
-      CASE_TYPE(INT64, Int64, Int64);
-      CASE_TYPE(UINT32, UInt32, UInt32);
-      CASE_TYPE(UINT64, UInt64, UInt64);
-      CASE_TYPE(SINT32, SInt32, Int32);
-      CASE_TYPE(SINT64, SInt64, Int64);
-      CASE_TYPE(STRING, String, String);
-      FIXED_CASE_TYPE(FIXED32, Fixed32);
-      FIXED_CASE_TYPE(FIXED64, Fixed64);
-      FIXED_CASE_TYPE(SFIXED32, SFixed32);
-      FIXED_CASE_TYPE(SFIXED64, SFixed64);
-      FIXED_CASE_TYPE(BOOL, Bool);
-
-#undef CASE_TYPE
-#undef FIXED_CASE_TYPE
-  }
-  GOOGLE_LOG(FATAL) << "Cannot get here";
-  return 0;
-}
-
-static size_t MapValueRefDataOnlyByteSize(const FieldDescriptor* field,
-                                          const MapValueRef& value) {
-  switch (field->type()) {
-    case FieldDescriptor::TYPE_GROUP:
-      GOOGLE_LOG(FATAL) << "Unsupported";
-      return 0;
-#define CASE_TYPE(FieldType, CamelFieldType, CamelCppType) \
-  case FieldDescriptor::TYPE_##FieldType:                  \
-    return WireFormatLite::CamelFieldType##Size(           \
-        value.Get##CamelCppType##Value());
-
-#define FIXED_CASE_TYPE(FieldType, CamelFieldType) \
-  case FieldDescriptor::TYPE_##FieldType:          \
-    return WireFormatLite::k##CamelFieldType##Size;
-
-      CASE_TYPE(INT32, Int32, Int32);
-      CASE_TYPE(INT64, Int64, Int64);
-      CASE_TYPE(UINT32, UInt32, UInt32);
-      CASE_TYPE(UINT64, UInt64, UInt64);
-      CASE_TYPE(SINT32, SInt32, Int32);
-      CASE_TYPE(SINT64, SInt64, Int64);
-      CASE_TYPE(STRING, String, String);
-      CASE_TYPE(BYTES, Bytes, String);
-      CASE_TYPE(ENUM, Enum, Enum);
-      CASE_TYPE(MESSAGE, Message, Message);
-      FIXED_CASE_TYPE(FIXED32, Fixed32);
-      FIXED_CASE_TYPE(FIXED64, Fixed64);
-      FIXED_CASE_TYPE(SFIXED32, SFixed32);
-      FIXED_CASE_TYPE(SFIXED64, SFixed64);
-      FIXED_CASE_TYPE(DOUBLE, Double);
-      FIXED_CASE_TYPE(FLOAT, Float);
-      FIXED_CASE_TYPE(BOOL, Bool);
-
-#undef CASE_TYPE
-#undef FIXED_CASE_TYPE
-  }
-  GOOGLE_LOG(FATAL) << "Cannot get here";
-  return 0;
-}
-
-size_t WireFormat::FieldDataOnlyByteSize(
+int WireFormat::FieldDataOnlyByteSize(
     const FieldDescriptor* field,
     const Message& message) {
   const Reflection* message_reflection = message.GetReflection();
 
-  size_t data_size = 0;
-
-  if (field->is_map()) {
-    MapFieldBase* map_field =
-        message_reflection->MapData(const_cast<Message*>(&message), field);
-    if (map_field->IsMapValid()) {
-      MapIterator iter(const_cast<Message*>(&message), field);
-      MapIterator end(const_cast<Message*>(&message), field);
-      const FieldDescriptor* key_field = field->message_type()->field(0);
-      const FieldDescriptor* value_field = field->message_type()->field(1);
-      for (map_field->MapBegin(&iter), map_field->MapEnd(&end); iter != end;
-           ++iter) {
-        size_t size = kMapEntryTagByteSize;
-        size += MapKeyDataOnlyByteSize(key_field, iter.GetKey());
-        size += MapValueRefDataOnlyByteSize(value_field, iter.GetValueRef());
-        data_size += WireFormatLite::LengthDelimitedSize(size);
-      }
-      return data_size;
-    }
-  }
-
-  size_t count = 0;
+  int count = 0;
   if (field->is_repeated()) {
-    count =
-        internal::FromIntSize(message_reflection->FieldSize(message, field));
-  } else if (field->containing_type()->options().map_entry()) {
-    // Map entry fields always need to be serialized.
-    count = 1;
+    count = message_reflection->FieldSize(message, field);
   } else if (message_reflection->HasField(message, field)) {
     count = 1;
   }
 
+  int data_size = 0;
   switch (field->type()) {
 #define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                     \
     case FieldDescriptor::TYPE_##TYPE:                                     \
@@ -1423,19 +1108,19 @@
   return data_size;
 }
 
-size_t WireFormat::MessageSetItemByteSize(
+int WireFormat::MessageSetItemByteSize(
     const FieldDescriptor* field,
     const Message& message) {
   const Reflection* message_reflection = message.GetReflection();
 
-  size_t our_size = WireFormatLite::kMessageSetItemTagsSize;
+  int our_size = WireFormatLite::kMessageSetItemTagsSize;
 
   // type_id
   our_size += io::CodedOutputStream::VarintSize32(field->number());
 
   // message
   const Message& sub_message = message_reflection->GetMessage(message, field);
-  size_t message_size = sub_message.ByteSizeLong();
+  int message_size = sub_message.ByteSize();
 
   our_size += io::CodedOutputStream::VarintSize32(message_size);
   our_size += message_size;
diff --git a/src/google/protobuf/wire_format.h b/src/google/protobuf/wire_format.h
index d602d21..5b41aad 100644
--- a/src/google/protobuf/wire_format.h
+++ b/src/google/protobuf/wire_format.h
@@ -41,10 +41,16 @@
 
 #include <string>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/message.h>
 #include <google/protobuf/wire_format_lite.h>
 
+// Do UTF-8 validation on string type in Debug build only
+#ifndef NDEBUG
+#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
+#endif
+
 namespace google {
 namespace protobuf {
   namespace io {
@@ -79,7 +85,7 @@
 
   // Compute the byte size of a tag.  For groups, this includes both the start
   // and end tags.
-  static inline size_t TagSize(int field_number, FieldDescriptor::Type type);
+  static inline int TagSize(int field_number, FieldDescriptor::Type type);
 
   // These procedures can be used to implement the methods of Message which
   // handle parsing and serialization of the protocol buffer wire format
@@ -116,7 +122,7 @@
   // will have their ByteSize() methods called, so their sizes will be cached.
   // Therefore, calling this method is sufficient to allow you to call
   // WireFormat::SerializeWithCachedSizes() on the same object.
-  static size_t ByteSize(const Message& message);
+  static int ByteSize(const Message& message);
 
   // -----------------------------------------------------------------
   // Helpers for dealing with unknown fields
@@ -167,11 +173,11 @@
       uint8* target);
 
   // Compute the size of the UnknownFieldSet on the wire.
-  static size_t ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields);
+  static int ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields);
 
   // Same thing except for messages that have the message_set_wire_format
   // option.
-  static size_t ComputeUnknownMessageSetItemsSize(
+  static int ComputeUnknownMessageSetItemsSize(
       const UnknownFieldSet& unknown_fields);
 
 
@@ -199,7 +205,7 @@
   // Compute size of a single field.  If the field is a message type, this
   // will call ByteSize() for the embedded message, insuring that it caches
   // its size.
-  static size_t FieldByteSize(
+  static int FieldByteSize(
       const FieldDescriptor* field,        // Cannot be NULL
       const Message& message);
 
@@ -212,7 +218,7 @@
       const FieldDescriptor* field,
       const Message& message,
       io::CodedOutputStream* output);
-  static size_t MessageSetItemByteSize(
+  static int MessageSetItemByteSize(
       const FieldDescriptor* field,
       const Message& message);
 
@@ -220,7 +226,7 @@
   // only includes the size of the raw data, and not the size of the total
   // length, but for other length-delimited types, the size of the length is
   // included.
-  static size_t FieldDataOnlyByteSize(
+  static int FieldDataOnlyByteSize(
       const FieldDescriptor* field,        // Cannot be NULL
       const Message& message);
 
@@ -295,8 +301,7 @@
   return WireFormatLite::MakeTag(field->number(), WireTypeForField(field));
 }
 
-inline size_t WireFormat::TagSize(int field_number,
-                                  FieldDescriptor::Type type) {
+inline int WireFormat::TagSize(int field_number, FieldDescriptor::Type type) {
   // Some compilers don't like enum -> enum casts, so we implicit_cast to
   // int first.
   return WireFormatLite::TagSize(field_number,
@@ -310,7 +315,7 @@
   WireFormatLite::VerifyUtf8String(
       data, size, static_cast<WireFormatLite::Operation>(op), NULL);
 #else
-  // Avoid the compiler warning about unused variables.
+  // Avoid the compiler warning about unsued variables.
   (void)data; (void)size; (void)op;
 #endif
 }
diff --git a/src/google/protobuf/wire_format_lite.cc b/src/google/protobuf/wire_format_lite.cc
index cd343b7..f251707 100644
--- a/src/google/protobuf/wire_format_lite.cc
+++ b/src/google/protobuf/wire_format_lite.cc
@@ -34,9 +34,6 @@
 
 #include <google/protobuf/wire_format_lite_inl.h>
 
-#ifdef __SSE_4_1__
-#include <immintrin.h>
-#endif
 #include <stack>
 #include <string>
 #include <vector>
@@ -64,7 +61,7 @@
 #endif
 
 // IBM xlC requires prefixing constants with WireFormatLite::
-const size_t WireFormatLite::kMessageSetItemTagsSize =
+const int WireFormatLite::kMessageSetItemTagsSize =
   io::CodedOutputStream::StaticVarintSize32<
       WireFormatLite::kMessageSetItemStartTag>::value +
   io::CodedOutputStream::StaticVarintSize32<
@@ -123,8 +120,6 @@
 
 bool WireFormatLite::SkipField(
     io::CodedInputStream* input, uint32 tag) {
-  // Field number 0 is illegal.
-  if (WireFormatLite::GetTagFieldNumber(tag) == 0) return false;
   switch (WireFormatLite::GetTagWireType(tag)) {
     case WireFormatLite::WIRETYPE_VARINT: {
       uint64 value;
@@ -170,8 +165,6 @@
 
 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)) {
     case WireFormatLite::WIRETYPE_VARINT: {
       uint64 value;
@@ -344,94 +337,6 @@
   return true;
 }
 
-#if !defined(PROTOBUF_LITTLE_ENDIAN)
-
-namespace {
-void EncodeFixedSizeValue(float v, uint8* dest) {
-  WireFormatLite::WriteFloatNoTagToArray(v, dest);
-}
-
-void EncodeFixedSizeValue(double v, uint8* dest) {
-  WireFormatLite::WriteDoubleNoTagToArray(v, dest);
-}
-
-void EncodeFixedSizeValue(uint32 v, uint8* dest) {
-  WireFormatLite::WriteFixed32NoTagToArray(v, dest);
-}
-
-void EncodeFixedSizeValue(uint64 v, uint8* dest) {
-  WireFormatLite::WriteFixed64NoTagToArray(v, dest);
-}
-
-void EncodeFixedSizeValue(int32 v, uint8* dest) {
-  WireFormatLite::WriteSFixed32NoTagToArray(v, dest);
-}
-
-void EncodeFixedSizeValue(int64 v, uint8* dest) {
-  WireFormatLite::WriteSFixed64NoTagToArray(v, dest);
-}
-
-void EncodeFixedSizeValue(bool v, uint8* dest) {
-  WireFormatLite::WriteBoolNoTagToArray(v, dest);
-}
-}  // anonymous namespace
-
-#endif  // !defined(PROTOBUF_LITTLE_ENDIAN)
-
-template <typename CType>
-static void WriteArray(const CType* a, int n, io::CodedOutputStream* output) {
-#if defined(PROTOBUF_LITTLE_ENDIAN)
-  output->WriteRaw(reinterpret_cast<const char*>(a), n * sizeof(a[0]));
-#else
-  const int kAtATime = 128;
-  uint8 buf[sizeof(CType) * kAtATime];
-  for (int i = 0; i < n; i += kAtATime) {
-    int to_do = std::min(kAtATime, n - i);
-    uint8* ptr = buf;
-    for (int j = 0; j < to_do; j++) {
-      EncodeFixedSizeValue(a[i+j], ptr);
-      ptr += sizeof(a[0]);
-    }
-    output->WriteRaw(buf, to_do * sizeof(a[0]));
-  }
-#endif
-}
-
-void WireFormatLite::WriteFloatArray(const float* a, int n,
-                                     io::CodedOutputStream* output) {
-  WriteArray<float>(a, n, output);
-}
-
-void WireFormatLite::WriteDoubleArray(const double* a, int n,
-                                     io::CodedOutputStream* output) {
-  WriteArray<double>(a, n, output);
-}
-
-void WireFormatLite::WriteFixed32Array(const uint32* a, int n,
-                                     io::CodedOutputStream* output) {
-  WriteArray<uint32>(a, n, output);
-}
-
-void WireFormatLite::WriteFixed64Array(const uint64* a, int n,
-                                       io::CodedOutputStream* output) {
-  WriteArray<uint64>(a, n, output);
-}
-
-void WireFormatLite::WriteSFixed32Array(const int32* a, int n,
-                                       io::CodedOutputStream* output) {
-  WriteArray<int32>(a, n, output);
-}
-
-void WireFormatLite::WriteSFixed64Array(const int64* a, int n,
-                                       io::CodedOutputStream* output) {
-  WriteArray<int64>(a, n, output);
-}
-
-void WireFormatLite::WriteBoolArray(const bool* a, int n,
-                                    io::CodedOutputStream* output) {
-  WriteArray<bool>(a, n, output);
-}
-
 void WireFormatLite::WriteInt32(int field_number, int32 value,
                                 io::CodedOutputStream* output) {
   WriteTag(field_number, WIRETYPE_VARINT, output);
@@ -561,8 +466,7 @@
   const int size = value.GetCachedSize();
   uint8* target = output->GetDirectBufferForNBytesAndAdvance(size);
   if (target != NULL) {
-    uint8* end = value.InternalSerializeWithCachedSizesToArray(
-        output->IsSerializationDeterministic(), target);
+    uint8* end = value.SerializeWithCachedSizesToArray(target);
     GOOGLE_DCHECK_EQ(end - target, size);
   } else {
     value.SerializeWithCachedSizes(output);
@@ -578,15 +482,14 @@
   output->WriteVarint32(size);
   uint8* target = output->GetDirectBufferForNBytesAndAdvance(size);
   if (target != NULL) {
-    uint8* end = value.InternalSerializeWithCachedSizesToArray(
-        output->IsSerializationDeterministic(), target);
+    uint8* end = value.SerializeWithCachedSizesToArray(target);
     GOOGLE_DCHECK_EQ(end - target, size);
   } else {
     value.SerializeWithCachedSizes(output);
   }
 }
 
-GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static bool ReadBytesToString(
+GOOGLE_ATTRIBUTE_ALWAYS_INLINE static bool ReadBytesToString(
     io::CodedInputStream* input, string* value);
 inline static bool ReadBytesToString(io::CodedInputStream* input,
                                      string* value) {
@@ -635,152 +538,6 @@
   return true;
 }
 
-#ifdef __SSE_4_1__
-template<typename T, bool ZigZag, bool SignExtended>
-static size_t VarintSize(
-    const T* data, const int n,
-    const internal::enable_if<sizeof(T) == 4>::type* = NULL) {
-#if __cplusplus >= 201103L
-  // is_unsigned<T> => !ZigZag
-  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");
-#endif
-
-  union vus32 {
-    uint32  u[4];
-    int32   s[4];
-    __m128i v;
-  };
-
-  static const vus32 ones = {{1, 1, 1, 1}};
-
-  // CodedOutputStream::VarintSize32SignExtended returns 10 for negative
-  // numbers.  We can apply the UInt32Size algorithm, and simultaneously logical
-  // shift the MSB into the LSB to determine if it is negative.
-  static const vus32 fives = {{5, 5, 5, 5}};
-
-  // sum is the vectorized-output of calling CodedOutputStream::VarintSize32 on
-  // the processed elements.
-  //
-  // msb_sum is the count of set most-significant bits.  When computing the
-  // vectorized CodedOutputStream::VarintSize32SignExtended, negative values
-  // have the most significant bit set.  VarintSize32SignExtended returns 10 and
-  // VarintSize32 returns 5.  msb_sum allows us to compute:
-  //   VarintSize32SignExtended = msb_sum * 5 + VarintSize32
-  vus32 sum, v, msb_sum;
-  sum.v = _mm_setzero_si128();
-  msb_sum.v = _mm_setzero_si128();
-
-  int rounded = n & ~(3);
-  int i;
-  for (i = 0; i < rounded; i += 4) {
-    v.v = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&data[i]));
-
-    if (ZigZag) {
-      // Note:  the right-shift must be arithmetic
-      v.v = _mm_xor_si128(_mm_slli_epi32(v.v, 1), _mm_srai_epi32(v.v, 31));
-    }
-
-    sum.v = _mm_add_epi32(sum.v, ones.v);
-    if (SignExtended) {
-      msb_sum.v = _mm_add_epi32(msb_sum.v, _mm_srli_epi32(v.v, 31));
-    }
-
-    v.v = _mm_srli_epi32(v.v, 7);
-
-    for (int j = 0; j < 4; j++) {
-      __m128i min = _mm_min_epi32(v.v, ones.v);
-
-      sum.v = _mm_add_epi32(sum.v, min);
-      v.v   = _mm_srli_epi32(v.v, 7);
-    }
-  }
-
-  if (SignExtended) {
-    vus32 extensions;
-    extensions.v = _mm_mullo_epi32(msb_sum.v, fives.v);
-
-    sum.v = _mm_add_epi32(sum.v, extensions.v);
-  }
-
-  // TODO(ckennelly): Can we avoid the sign conversion?
-  size_t out = _mm_cvtsi128_si32(
-      _mm_hadd_epi32(_mm_hadd_epi32(sum.v, ones.v), ones.v));
-
-  // Finish tail.
-  for (; i < n; i++) {
-    if (ZigZag) {
-      out += WireFormatLite::SInt32Size(data[i]);
-    } else if (SignExtended) {
-      out += WireFormatLite::Int32Size(data[i]);
-    } else {
-      out += WireFormatLite::UInt32Size(data[i]);
-    }
-  }
-
-  return out;
-}
-
-size_t WireFormatLite::Int32Size(const RepeatedField<int32>& value) {
-  return VarintSize<int32, false, true>(value.data(), value.size());
-}
-
-size_t WireFormatLite::UInt32Size(const RepeatedField<uint32>& value) {
-  return VarintSize<uint32, false, false>(value.data(), value.size());
-}
-
-size_t WireFormatLite::SInt32Size(const RepeatedField<int32>& value) {
-  return VarintSize<int32, true, true>(value.data(), value.size());
-}
-
-size_t WireFormatLite::EnumSize(const RepeatedField<int>& value) {
-  // On ILP64, sizeof(int) == 8, which would require a different template.
-  return VarintSize<int, false, true>(value.data(), value.size());
-}
-
-#else  // !__SSE_4_1__
-size_t WireFormatLite::Int32Size(const RepeatedField<int32>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += Int32Size(value.Get(i));
-  }
-  return out;
-}
-
-size_t WireFormatLite::UInt32Size(const RepeatedField<uint32>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += UInt32Size(value.Get(i));
-  }
-  return out;
-}
-
-size_t WireFormatLite::SInt32Size(const RepeatedField<int32>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += SInt32Size(value.Get(i));
-  }
-  return out;
-}
-
-size_t WireFormatLite::EnumSize(const RepeatedField<int>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += EnumSize(value.Get(i));
-  }
-  return out;
-}
-#endif
-
 }  // namespace internal
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/wire_format_lite.h b/src/google/protobuf/wire_format_lite.h
index cf614c0..55fc7ec 100644
--- a/src/google/protobuf/wire_format_lite.h
+++ b/src/google/protobuf/wire_format_lite.h
@@ -41,27 +41,9 @@
 #define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__
 
 #include <string>
-
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/message_lite.h>
-#include <google/protobuf/stubs/port.h>
-#include <google/protobuf/repeated_field.h>
-
-// Do UTF-8 validation on string type in Debug build only
-#ifndef NDEBUG
-#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
-#endif
-
-// Avoid conflict with iOS where <ConditionalMacros.h> #defines TYPE_BOOL.
-//
-// If some one needs the macro TYPE_BOOL in a file that includes this header, it's
-// possible to bring it back using push/pop_macro as follows.
-//
-// #pragma push_macro("TYPE_BOOL")
-// #include this header and/or all headers that need the macro to be undefined.
-// #pragma pop_macro("TYPE_BOOL")
-#undef TYPE_BOOL
+#include <google/protobuf/io/coded_stream.h>  // for CodedOutputStream::Varint32Size
 
 namespace google {
 
@@ -151,7 +133,7 @@
   // Helper method to get the CppType for a particular Type.
   static CppType FieldTypeToCppType(FieldType type);
 
-  // Given a FieldDescriptor::Type return its WireType
+  // Given a FieldSescriptor::Type return its WireType
   static inline WireFormatLite::WireType WireTypeForFieldType(
       WireFormatLite::FieldType type) {
     return kWireTypeForFieldType[type];
@@ -173,8 +155,7 @@
 
   // Compute the byte size of a tag.  For groups, this includes both the start
   // and end tags.
-  static inline size_t TagSize(int field_number,
-                               WireFormatLite::FieldType type);
+  static inline int TagSize(int field_number, WireFormatLite::FieldType type);
 
   // Skips a field value with the given tag.  The input should start
   // positioned immediately after the tag.  Skipped values are simply discarded,
@@ -204,7 +185,7 @@
 // type-safe, though, so prefer it if possible.
 #define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE)                  \
   static_cast<uint32>(                                                   \
-    (static_cast<uint32>(FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \
+    ((FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \
       | (TYPE))
 
   // These are the tags for the old MessageSet format, which was defined as:
@@ -231,7 +212,7 @@
                                 WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
 
   // Byte size of all tags of a MessageSet::Item combined.
-  static const size_t kMessageSetItemTagsSize;
+  static const int kMessageSetItemTagsSize;
 
   // Helper functions for converting between floats/doubles and IEEE-754
   // uint32s/uint64s so that they can be written.  (Assumes your platform
@@ -257,15 +238,11 @@
   // of these methods are defined in wire_format_lite_inl.h; you must #include
   // that file to use these.
 
-#ifdef NDEBUG
-#define INL GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-#else
-// Avoid excessive inlining in non-optimized builds. Without other optimizations
-// the inlining is not going to provide benefits anyway and the huge resulting
-// functions, especially in the proto-generated serialization functions, produce
-// stack frames so large that many tests run into stack overflows (b/32192897).
-#define INL
-#endif
+// Avoid ugly line wrapping
+#define input  io::CodedInputStream*  input_arg
+#define output io::CodedOutputStream* output_arg
+#define field_number int field_number_arg
+#define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE
 
   // Read fields, not including tags.  The assumption is that you already
   // read the tag to determine what field to read.
@@ -273,22 +250,24 @@
   // For primitive fields, we just use a templatized routine parameterized by
   // the represented type and the FieldType. These are specialized with the
   // appropriate definition for each declared type.
-  template <typename CType, enum FieldType DeclaredType>
-  INL static bool ReadPrimitive(io::CodedInputStream* input, CType* value);
+  template <typename CType, enum FieldType DeclaredType> INL
+  static bool ReadPrimitive(input, CType* value);
 
   // Reads repeated primitive values, with optimizations for repeats.
   // tag_size and tag should both be compile-time constants provided by the
   // protocol compiler.
-  template <typename CType, enum FieldType DeclaredType>
-  INL static bool ReadRepeatedPrimitive(int tag_size, uint32 tag,
-                                        io::CodedInputStream* input,
-                                        RepeatedField<CType>* value);
+  template <typename CType, enum FieldType DeclaredType> INL
+  static bool ReadRepeatedPrimitive(int tag_size,
+                                    uint32 tag,
+                                    input,
+                                    RepeatedField<CType>* value);
 
   // Identical to ReadRepeatedPrimitive, except will not inline the
   // implementation.
   template <typename CType, enum FieldType DeclaredType>
-  static bool ReadRepeatedPrimitiveNoInline(int tag_size, uint32 tag,
-                                            io::CodedInputStream* input,
+  static bool ReadRepeatedPrimitiveNoInline(int tag_size,
+                                            uint32 tag,
+                                            input,
                                             RepeatedField<CType>* value);
 
   // Reads a primitive value directly from the provided buffer. It returns a
@@ -302,39 +281,40 @@
   // Reads a primitive packed field.
   //
   // This is only implemented for packable types.
-  template <typename CType, enum FieldType DeclaredType>
-  INL static bool ReadPackedPrimitive(io::CodedInputStream* input,
-                                      RepeatedField<CType>* value);
+  template <typename CType, enum FieldType DeclaredType> INL
+  static bool ReadPackedPrimitive(input, RepeatedField<CType>* value);
 
   // Identical to ReadPackedPrimitive, except will not inline the
   // implementation.
   template <typename CType, enum FieldType DeclaredType>
-  static bool ReadPackedPrimitiveNoInline(io::CodedInputStream* input,
-                                          RepeatedField<CType>* value);
+  static bool ReadPackedPrimitiveNoInline(input, RepeatedField<CType>* value);
 
   // Read a packed enum field. If the is_valid function is not NULL, values for
   // which is_valid(value) returns false are silently dropped.
-  static bool ReadPackedEnumNoInline(io::CodedInputStream* input,
+  static bool ReadPackedEnumNoInline(input,
                                      bool (*is_valid)(int),
                                      RepeatedField<int>* values);
 
   // Read a packed enum field. If the is_valid function is not NULL, values for
   // which is_valid(value) returns false are appended to unknown_fields_stream.
   static bool ReadPackedEnumPreserveUnknowns(
-      io::CodedInputStream* input, int field_number, bool (*is_valid)(int),
-      io::CodedOutputStream* unknown_fields_stream, RepeatedField<int>* values);
+      input,
+      field_number,
+      bool (*is_valid)(int),
+      io::CodedOutputStream* unknown_fields_stream,
+      RepeatedField<int>* values);
 
   // Read a string.  ReadString(..., string* value) requires an existing string.
-  static inline bool ReadString(io::CodedInputStream* input, string* value);
+  static inline bool ReadString(input, string* value);
   // ReadString(..., string** p) is internal-only, and should only be called
   // from generated code. It starts by setting *p to "new string"
   // if *p == &GetEmptyStringAlreadyInited().  It then invokes
-  // ReadString(io::CodedInputStream* input, *p).  This is useful for reducing
-  // code size.
-  static inline bool ReadString(io::CodedInputStream* input, string** p);
+  // ReadString(input, *p).  This is useful for reducing code size.
+  static inline bool ReadString(input, string** p);
   // Analogous to ReadString().
-  static bool ReadBytes(io::CodedInputStream* input, string* value);
-  static bool ReadBytes(io::CodedInputStream* input, string** p);
+  static bool ReadBytes(input, string* value);
+  static bool ReadBytes(input, string** p);
+
 
   enum Operation {
     PARSE = 0,
@@ -346,375 +326,202 @@
                                Operation op,
                                const char* field_name);
 
-  static inline bool ReadGroup(int field_number, io::CodedInputStream* input,
-                               MessageLite* value);
-  static inline bool ReadMessage(io::CodedInputStream* input,
-                                 MessageLite* value);
+  static inline bool ReadGroup  (field_number, input, MessageLite* value);
+  static inline bool ReadMessage(input, MessageLite* value);
 
   // Like above, but de-virtualize the call to MergePartialFromCodedStream().
   // The pointer must point at an instance of MessageType, *not* a subclass (or
   // the subclass must not override MergePartialFromCodedStream()).
-  template <typename MessageType>
-  static inline bool ReadGroupNoVirtual(int field_number,
-                                        io::CodedInputStream* input,
+  template<typename MessageType>
+  static inline bool ReadGroupNoVirtual(field_number, input,
                                         MessageType* value);
   template<typename MessageType>
-  static inline bool ReadMessageNoVirtual(io::CodedInputStream* input,
-                                          MessageType* value);
+  static inline bool ReadMessageNoVirtual(input, MessageType* value);
 
   // The same, but do not modify input's recursion depth.  This is useful
   // when reading a bunch of groups or messages in a loop, because then the
   // recursion depth can be incremented before the loop and decremented after.
   template<typename MessageType>
-  static inline bool ReadGroupNoVirtualNoRecursionDepth(
-      int field_number, io::CodedInputStream* input, MessageType* value);
+  static inline bool ReadGroupNoVirtualNoRecursionDepth(field_number, input,
+                                                        MessageType* value);
 
   template<typename MessageType>
-  static inline bool ReadMessageNoVirtualNoRecursionDepth(
-      io::CodedInputStream* input, MessageType* value);
+  static inline bool ReadMessageNoVirtualNoRecursionDepth(input,
+                                                          MessageType* value);
 
   // Write a tag.  The Write*() functions typically include the tag, so
   // normally there's no need to call this unless using the Write*NoTag()
   // variants.
-  INL static void WriteTag(int field_number, WireType type,
-                           io::CodedOutputStream* output);
+  INL static void WriteTag(field_number, WireType type, output);
 
   // Write fields, without tags.
-  INL static void WriteInt32NoTag(int32 value, io::CodedOutputStream* output);
-  INL static void WriteInt64NoTag(int64 value, io::CodedOutputStream* output);
-  INL static void WriteUInt32NoTag(uint32 value, io::CodedOutputStream* output);
-  INL static void WriteUInt64NoTag(uint64 value, io::CodedOutputStream* output);
-  INL static void WriteSInt32NoTag(int32 value, io::CodedOutputStream* output);
-  INL static void WriteSInt64NoTag(int64 value, io::CodedOutputStream* output);
-  INL static void WriteFixed32NoTag(uint32 value,
-                                    io::CodedOutputStream* output);
-  INL static void WriteFixed64NoTag(uint64 value,
-                                    io::CodedOutputStream* output);
-  INL static void WriteSFixed32NoTag(int32 value,
-                                     io::CodedOutputStream* output);
-  INL static void WriteSFixed64NoTag(int64 value,
-                                     io::CodedOutputStream* output);
-  INL static void WriteFloatNoTag(float value, io::CodedOutputStream* output);
-  INL static void WriteDoubleNoTag(double value, io::CodedOutputStream* output);
-  INL static void WriteBoolNoTag(bool value, io::CodedOutputStream* output);
-  INL static void WriteEnumNoTag(int value, io::CodedOutputStream* output);
-
-  // Write array of primitive fields, without tags
-  static void WriteFloatArray(const float* a, int n,
-                              io::CodedOutputStream* output);
-  static void WriteDoubleArray(const double* a, int n,
-                               io::CodedOutputStream* output);
-  static void WriteFixed32Array(const uint32* a, int n,
-                                io::CodedOutputStream* output);
-  static void WriteFixed64Array(const uint64* a, int n,
-                                io::CodedOutputStream* output);
-  static void WriteSFixed32Array(const int32* a, int n,
-                                 io::CodedOutputStream* output);
-  static void WriteSFixed64Array(const int64* a, int n,
-                                 io::CodedOutputStream* output);
-  static void WriteBoolArray(const bool* a, int n,
-                             io::CodedOutputStream* output);
+  INL static void WriteInt32NoTag   (int32 value, output);
+  INL static void WriteInt64NoTag   (int64 value, output);
+  INL static void WriteUInt32NoTag  (uint32 value, output);
+  INL static void WriteUInt64NoTag  (uint64 value, output);
+  INL static void WriteSInt32NoTag  (int32 value, output);
+  INL static void WriteSInt64NoTag  (int64 value, output);
+  INL static void WriteFixed32NoTag (uint32 value, output);
+  INL static void WriteFixed64NoTag (uint64 value, output);
+  INL static void WriteSFixed32NoTag(int32 value, output);
+  INL static void WriteSFixed64NoTag(int64 value, output);
+  INL static void WriteFloatNoTag   (float value, output);
+  INL static void WriteDoubleNoTag  (double value, output);
+  INL static void WriteBoolNoTag    (bool value, output);
+  INL static void WriteEnumNoTag    (int value, output);
 
   // Write fields, including tags.
-  static void WriteInt32(int field_number, int32 value,
-                         io::CodedOutputStream* output);
-  static void WriteInt64(int field_number, int64 value,
-                         io::CodedOutputStream* output);
-  static void WriteUInt32(int field_number, uint32 value,
-                          io::CodedOutputStream* output);
-  static void WriteUInt64(int field_number, uint64 value,
-                          io::CodedOutputStream* output);
-  static void WriteSInt32(int field_number, int32 value,
-                          io::CodedOutputStream* output);
-  static void WriteSInt64(int field_number, int64 value,
-                          io::CodedOutputStream* output);
-  static void WriteFixed32(int field_number, uint32 value,
-                           io::CodedOutputStream* output);
-  static void WriteFixed64(int field_number, uint64 value,
-                           io::CodedOutputStream* output);
-  static void WriteSFixed32(int field_number, int32 value,
-                            io::CodedOutputStream* output);
-  static void WriteSFixed64(int field_number, int64 value,
-                            io::CodedOutputStream* output);
-  static void WriteFloat(int field_number, float value,
-                         io::CodedOutputStream* output);
-  static void WriteDouble(int field_number, double value,
-                          io::CodedOutputStream* output);
-  static void WriteBool(int field_number, bool value,
-                        io::CodedOutputStream* output);
-  static void WriteEnum(int field_number, int value,
-                        io::CodedOutputStream* output);
+  static void WriteInt32   (field_number,  int32 value, output);
+  static void WriteInt64   (field_number,  int64 value, output);
+  static void WriteUInt32  (field_number, uint32 value, output);
+  static void WriteUInt64  (field_number, uint64 value, output);
+  static void WriteSInt32  (field_number,  int32 value, output);
+  static void WriteSInt64  (field_number,  int64 value, output);
+  static void WriteFixed32 (field_number, uint32 value, output);
+  static void WriteFixed64 (field_number, uint64 value, output);
+  static void WriteSFixed32(field_number,  int32 value, output);
+  static void WriteSFixed64(field_number,  int64 value, output);
+  static void WriteFloat   (field_number,  float value, output);
+  static void WriteDouble  (field_number, double value, output);
+  static void WriteBool    (field_number,   bool value, output);
+  static void WriteEnum    (field_number,    int value, output);
 
-  static void WriteString(int field_number, const string& value,
-                          io::CodedOutputStream* output);
-  static void WriteBytes(int field_number, const string& value,
-                         io::CodedOutputStream* output);
-  static void WriteStringMaybeAliased(int field_number, const string& value,
-                                      io::CodedOutputStream* output);
-  static void WriteBytesMaybeAliased(int field_number, const string& value,
-                                     io::CodedOutputStream* output);
+  static void WriteString(field_number, const string& value, output);
+  static void WriteBytes (field_number, const string& value, output);
+  static void WriteStringMaybeAliased(
+      field_number, const string& value, output);
+  static void WriteBytesMaybeAliased(
+      field_number, const string& value, output);
 
-  static void WriteGroup(int field_number, const MessageLite& value,
-                         io::CodedOutputStream* output);
-  static void WriteMessage(int field_number, const MessageLite& value,
-                           io::CodedOutputStream* output);
+  static void WriteGroup(
+    field_number, const MessageLite& value, output);
+  static void WriteMessage(
+    field_number, const MessageLite& value, output);
   // Like above, but these will check if the output stream has enough
   // space to write directly to a flat array.
-  static void WriteGroupMaybeToArray(int field_number, const MessageLite& value,
-                                     io::CodedOutputStream* output);
-  static void WriteMessageMaybeToArray(int field_number,
-                                       const MessageLite& value,
-                                       io::CodedOutputStream* output);
+  static void WriteGroupMaybeToArray(
+    field_number, const MessageLite& value, output);
+  static void WriteMessageMaybeToArray(
+    field_number, const MessageLite& value, output);
 
   // Like above, but de-virtualize the call to SerializeWithCachedSizes().  The
   // pointer must point at an instance of MessageType, *not* a subclass (or
   // the subclass must not override SerializeWithCachedSizes()).
-  template <typename MessageType>
-  static inline void WriteGroupNoVirtual(int field_number,
-                                         const MessageType& value,
-                                         io::CodedOutputStream* output);
-  template <typename MessageType>
-  static inline void WriteMessageNoVirtual(int field_number,
-                                           const MessageType& value,
-                                           io::CodedOutputStream* output);
+  template<typename MessageType>
+  static inline void WriteGroupNoVirtual(
+    field_number, const MessageType& value, output);
+  template<typename MessageType>
+  static inline void WriteMessageNoVirtual(
+    field_number, const MessageType& value, output);
+
+#undef output
+#define output uint8* target
 
   // Like above, but use only *ToArray methods of CodedOutputStream.
-  INL static uint8* WriteTagToArray(int field_number, WireType type,
-                                    uint8* target);
+  INL static uint8* WriteTagToArray(field_number, WireType type, output);
 
   // Write fields, without tags.
-  INL static uint8* WriteInt32NoTagToArray(int32 value, uint8* target);
-  INL static uint8* WriteInt64NoTagToArray(int64 value, uint8* target);
-  INL static uint8* WriteUInt32NoTagToArray(uint32 value, uint8* target);
-  INL static uint8* WriteUInt64NoTagToArray(uint64 value, uint8* target);
-  INL static uint8* WriteSInt32NoTagToArray(int32 value, uint8* target);
-  INL static uint8* WriteSInt64NoTagToArray(int64 value, uint8* target);
-  INL static uint8* WriteFixed32NoTagToArray(uint32 value, uint8* target);
-  INL static uint8* WriteFixed64NoTagToArray(uint64 value, uint8* target);
-  INL static uint8* WriteSFixed32NoTagToArray(int32 value, uint8* target);
-  INL static uint8* WriteSFixed64NoTagToArray(int64 value, uint8* target);
-  INL static uint8* WriteFloatNoTagToArray(float value, uint8* target);
-  INL static uint8* WriteDoubleNoTagToArray(double value, uint8* target);
-  INL static uint8* WriteBoolNoTagToArray(bool value, uint8* target);
-  INL static uint8* WriteEnumNoTagToArray(int value, uint8* target);
-
-  // Write fields, without tags.  These require that value.size() > 0.
-  template<typename T>
-  INL static uint8* WritePrimitiveNoTagToArray(
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(T, uint8*), uint8* target);
-  template<typename T>
-  INL static uint8* WriteFixedNoTagToArray(
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(T, uint8*), uint8* target);
-
-  INL static uint8* WriteInt32NoTagToArray(
-      const RepeatedField< int32>& value, uint8* output);
-  INL static uint8* WriteInt64NoTagToArray(
-      const RepeatedField< int64>& value, uint8* output);
-  INL static uint8* WriteUInt32NoTagToArray(
-      const RepeatedField<uint32>& value, uint8* output);
-  INL static uint8* WriteUInt64NoTagToArray(
-      const RepeatedField<uint64>& value, uint8* output);
-  INL static uint8* WriteSInt32NoTagToArray(
-      const RepeatedField< int32>& value, uint8* output);
-  INL static uint8* WriteSInt64NoTagToArray(
-      const RepeatedField< int64>& value, uint8* output);
-  INL static uint8* WriteFixed32NoTagToArray(
-      const RepeatedField<uint32>& value, uint8* output);
-  INL static uint8* WriteFixed64NoTagToArray(
-      const RepeatedField<uint64>& value, uint8* output);
-  INL static uint8* WriteSFixed32NoTagToArray(
-      const RepeatedField< int32>& value, uint8* output);
-  INL static uint8* WriteSFixed64NoTagToArray(
-      const RepeatedField< int64>& value, uint8* output);
-  INL static uint8* WriteFloatNoTagToArray(
-      const RepeatedField< float>& value, uint8* output);
-  INL static uint8* WriteDoubleNoTagToArray(
-      const RepeatedField<double>& value, uint8* output);
-  INL static uint8* WriteBoolNoTagToArray(
-      const RepeatedField<  bool>& value, uint8* output);
-  INL static uint8* WriteEnumNoTagToArray(
-      const RepeatedField<   int>& value, uint8* output);
+  INL static uint8* WriteInt32NoTagToArray   (int32 value, output);
+  INL static uint8* WriteInt64NoTagToArray   (int64 value, output);
+  INL static uint8* WriteUInt32NoTagToArray  (uint32 value, output);
+  INL static uint8* WriteUInt64NoTagToArray  (uint64 value, output);
+  INL static uint8* WriteSInt32NoTagToArray  (int32 value, output);
+  INL static uint8* WriteSInt64NoTagToArray  (int64 value, output);
+  INL static uint8* WriteFixed32NoTagToArray (uint32 value, output);
+  INL static uint8* WriteFixed64NoTagToArray (uint64 value, output);
+  INL static uint8* WriteSFixed32NoTagToArray(int32 value, output);
+  INL static uint8* WriteSFixed64NoTagToArray(int64 value, output);
+  INL static uint8* WriteFloatNoTagToArray   (float value, output);
+  INL static uint8* WriteDoubleNoTagToArray  (double value, output);
+  INL static uint8* WriteBoolNoTagToArray    (bool value, output);
+  INL static uint8* WriteEnumNoTagToArray    (int value, output);
 
   // Write fields, including tags.
-  INL static uint8* WriteInt32ToArray(int field_number, int32 value,
-                                      uint8* target);
-  INL static uint8* WriteInt64ToArray(int field_number, int64 value,
-                                      uint8* target);
-  INL static uint8* WriteUInt32ToArray(int field_number, uint32 value,
-                                       uint8* target);
-  INL static uint8* WriteUInt64ToArray(int field_number, uint64 value,
-                                       uint8* target);
-  INL static uint8* WriteSInt32ToArray(int field_number, int32 value,
-                                       uint8* target);
-  INL static uint8* WriteSInt64ToArray(int field_number, int64 value,
-                                       uint8* target);
-  INL static uint8* WriteFixed32ToArray(int field_number, uint32 value,
-                                        uint8* target);
-  INL static uint8* WriteFixed64ToArray(int field_number, uint64 value,
-                                        uint8* target);
-  INL static uint8* WriteSFixed32ToArray(int field_number, int32 value,
-                                         uint8* target);
-  INL static uint8* WriteSFixed64ToArray(int field_number, int64 value,
-                                         uint8* target);
-  INL static uint8* WriteFloatToArray(int field_number, float value,
-                                      uint8* target);
-  INL static uint8* WriteDoubleToArray(int field_number, double value,
-                                       uint8* target);
-  INL static uint8* WriteBoolToArray(int field_number, bool value,
-                                     uint8* target);
-  INL static uint8* WriteEnumToArray(int field_number, int value,
-                                     uint8* target);
+  INL static uint8* WriteInt32ToArray(field_number, int32 value, output);
+  INL static uint8* WriteInt64ToArray(field_number, int64 value, output);
+  INL static uint8* WriteUInt32ToArray(field_number, uint32 value, output);
+  INL static uint8* WriteUInt64ToArray(field_number, uint64 value, output);
+  INL static uint8* WriteSInt32ToArray(field_number, int32 value, output);
+  INL static uint8* WriteSInt64ToArray(field_number, int64 value, output);
+  INL static uint8* WriteFixed32ToArray(field_number, uint32 value, output);
+  INL static uint8* WriteFixed64ToArray(field_number, uint64 value, output);
+  INL static uint8* WriteSFixed32ToArray(field_number, int32 value, output);
+  INL static uint8* WriteSFixed64ToArray(field_number, int64 value, output);
+  INL static uint8* WriteFloatToArray(field_number, float value, output);
+  INL static uint8* WriteDoubleToArray(field_number, double value, output);
+  INL static uint8* WriteBoolToArray(field_number, bool value, output);
+  INL static uint8* WriteEnumToArray(field_number, int value, output);
 
-  template<typename T>
-  INL static uint8* WritePrimitiveToArray(
-      int field_number,
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(int, T, uint8*), uint8* target);
+  INL static uint8* WriteStringToArray(
+    field_number, const string& value, output);
+  INL static uint8* WriteBytesToArray(
+    field_number, const string& value, output);
 
-  INL static uint8* WriteInt32ToArray(
-      int field_number, const RepeatedField< int32>& value, uint8* output);
-  INL static uint8* WriteInt64ToArray(
-      int field_number, const RepeatedField< int64>& value, uint8* output);
-  INL static uint8* WriteUInt32ToArray(
-      int field_number, const RepeatedField<uint32>& value, uint8* output);
-  INL static uint8* WriteUInt64ToArray(
-      int field_number, const RepeatedField<uint64>& value, uint8* output);
-  INL static uint8* WriteSInt32ToArray(
-      int field_number, const RepeatedField< int32>& value, uint8* output);
-  INL static uint8* WriteSInt64ToArray(
-      int field_number, const RepeatedField< int64>& value, uint8* output);
-  INL static uint8* WriteFixed32ToArray(
-      int field_number, const RepeatedField<uint32>& value, uint8* output);
-  INL static uint8* WriteFixed64ToArray(
-      int field_number, const RepeatedField<uint64>& value, uint8* output);
-  INL static uint8* WriteSFixed32ToArray(
-      int field_number, const RepeatedField< int32>& value, uint8* output);
-  INL static uint8* WriteSFixed64ToArray(
-      int field_number, const RepeatedField< int64>& value, uint8* output);
-  INL static uint8* WriteFloatToArray(
-      int field_number, const RepeatedField< float>& value, uint8* output);
-  INL static uint8* WriteDoubleToArray(
-      int field_number, const RepeatedField<double>& value, uint8* output);
-  INL static uint8* WriteBoolToArray(
-      int field_number, const RepeatedField<  bool>& value, uint8* output);
-  INL static uint8* WriteEnumToArray(
-      int field_number, const RepeatedField<   int>& value, uint8* output);
-
-  INL static uint8* WriteStringToArray(int field_number, const string& value,
-                                       uint8* target);
-  INL static uint8* WriteBytesToArray(int field_number, const string& value,
-                                      uint8* target);
-
-  // Whether to serialize deterministically (e.g., map keys are
-  // sorted) is a property of a CodedOutputStream, and in the process
-  // of serialization, the "ToArray" variants may be invoked.  But they don't
-  // have a CodedOutputStream available, so they get an additional parameter
-  // telling them whether to serialize deterministically.
-  INL static uint8* InternalWriteGroupToArray(int field_number,
-                                              const MessageLite& value,
-                                              bool deterministic,
-                                              uint8* target);
-  INL static uint8* InternalWriteMessageToArray(int field_number,
-                                                const MessageLite& value,
-                                                bool deterministic,
-                                                uint8* target);
+  INL static uint8* WriteGroupToArray(
+      field_number, const MessageLite& value, output);
+  INL static uint8* WriteMessageToArray(
+      field_number, const MessageLite& value, output);
 
   // Like above, but de-virtualize the call to SerializeWithCachedSizes().  The
   // pointer must point at an instance of MessageType, *not* a subclass (or
   // the subclass must not override SerializeWithCachedSizes()).
-  template <typename MessageType>
-  INL static uint8* InternalWriteGroupNoVirtualToArray(int field_number,
-                                                       const MessageType& value,
-                                                       bool deterministic,
-                                                       uint8* target);
-  template <typename MessageType>
-  INL static uint8* InternalWriteMessageNoVirtualToArray(
-      int field_number, const MessageType& value, bool deterministic,
-      uint8* target);
+  template<typename MessageType>
+  INL static uint8* WriteGroupNoVirtualToArray(
+    field_number, const MessageType& value, output);
+  template<typename MessageType>
+  INL static uint8* WriteMessageNoVirtualToArray(
+    field_number, const MessageType& value, output);
 
-  // For backward-compatibility, the last four methods also have versions
-  // that are non-deterministic always.
-  INL static uint8* WriteGroupToArray(int field_number,
-                                      const MessageLite& value, uint8* target) {
-    return InternalWriteGroupToArray(field_number, value, false, target);
-  }
-  INL static uint8* WriteMessageToArray(int field_number,
-                                        const MessageLite& value,
-                                        uint8* target) {
-    return InternalWriteMessageToArray(field_number, value, false, target);
-  }
-  template <typename MessageType>
-  INL static uint8* WriteGroupNoVirtualToArray(int field_number,
-                                               const MessageType& value,
-                                               uint8* target) {
-    return InternalWriteGroupNoVirtualToArray(field_number, value, false,
-                                              target);
-  }
-  template <typename MessageType>
-  INL static uint8* WriteMessageNoVirtualToArray(int field_number,
-                                                 const MessageType& value,
-                                                 uint8* target) {
-    return InternalWriteMessageNoVirtualToArray(field_number, value, false,
-                                                target);
-  }
-
+#undef output
+#undef input
 #undef INL
 
+#undef field_number
+
   // Compute the byte size of a field.  The XxSize() functions do NOT include
   // the tag, so you must also call TagSize().  (This is because, for repeated
   // fields, you should only call TagSize() once and multiply it by the element
   // count, but you may have to call XxSize() for each individual element.)
-  static inline size_t Int32Size   ( int32 value);
-  static inline size_t Int64Size   ( int64 value);
-  static inline size_t UInt32Size  (uint32 value);
-  static inline size_t UInt64Size  (uint64 value);
-  static inline size_t SInt32Size  ( int32 value);
-  static inline size_t SInt64Size  ( int64 value);
-  static inline size_t EnumSize    (   int value);
-
-  static        size_t Int32Size (const RepeatedField< int32>& value);
-  static inline size_t Int64Size (const RepeatedField< int64>& value);
-  static        size_t UInt32Size(const RepeatedField<uint32>& value);
-  static inline size_t UInt64Size(const RepeatedField<uint64>& value);
-  static        size_t SInt32Size(const RepeatedField< int32>& value);
-  static inline size_t SInt64Size(const RepeatedField< int64>& value);
-  static        size_t EnumSize  (const RepeatedField<   int>& value);
+  static inline int Int32Size   ( int32 value);
+  static inline int Int64Size   ( int64 value);
+  static inline int UInt32Size  (uint32 value);
+  static inline int UInt64Size  (uint64 value);
+  static inline int SInt32Size  ( int32 value);
+  static inline int SInt64Size  ( int64 value);
+  static inline int EnumSize    (   int value);
 
   // These types always have the same size.
-  static const size_t kFixed32Size  = 4;
-  static const size_t kFixed64Size  = 8;
-  static const size_t kSFixed32Size = 4;
-  static const size_t kSFixed64Size = 8;
-  static const size_t kFloatSize    = 4;
-  static const size_t kDoubleSize   = 8;
-  static const size_t kBoolSize     = 1;
+  static const int kFixed32Size  = 4;
+  static const int kFixed64Size  = 8;
+  static const int kSFixed32Size = 4;
+  static const int kSFixed64Size = 8;
+  static const int kFloatSize    = 4;
+  static const int kDoubleSize   = 8;
+  static const int kBoolSize     = 1;
 
-  static inline size_t StringSize(const string& value);
-  static inline size_t BytesSize (const string& value);
+  static inline int StringSize(const string& value);
+  static inline int BytesSize (const string& value);
 
-  static inline size_t GroupSize  (const MessageLite& value);
-  static inline size_t MessageSize(const MessageLite& value);
+  static inline int GroupSize  (const MessageLite& value);
+  static inline int MessageSize(const MessageLite& value);
 
   // Like above, but de-virtualize the call to ByteSize().  The
   // pointer must point at an instance of MessageType, *not* a subclass (or
   // the subclass must not override ByteSize()).
   template<typename MessageType>
-  static inline size_t GroupSizeNoVirtual  (const MessageType& value);
+  static inline int GroupSizeNoVirtual  (const MessageType& value);
   template<typename MessageType>
-  static inline size_t MessageSizeNoVirtual(const MessageType& value);
+  static inline int MessageSizeNoVirtual(const MessageType& value);
 
   // Given the length of data, calculate the byte size of the data on the
   // wire if we encode the data as a length delimited field.
-  static inline size_t LengthDelimitedSize(size_t length);
+  static inline int LengthDelimitedSize(int length);
 
  private:
   // A helper method for the repeated primitive reader. This method has
   // optimizations for primitive types that have fixed size on the wire, and
   // can be read using potentially faster paths.
-  template <typename CType, enum FieldType DeclaredType>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
+  template <typename CType, enum FieldType DeclaredType> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
   static bool ReadRepeatedFixedSizePrimitive(
       int tag_size,
       uint32 tag,
@@ -722,10 +529,9 @@
       RepeatedField<CType>* value);
 
   // Like ReadRepeatedFixedSizePrimitive but for packed primitive fields.
-  template <typename CType, enum FieldType DeclaredType>
-  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
-  static bool ReadPackedFixedSizePrimitive(
-      google::protobuf::io::CodedInputStream* input, RepeatedField<CType>* value);
+  template <typename CType, enum FieldType DeclaredType> GOOGLE_ATTRIBUTE_ALWAYS_INLINE
+  static bool ReadPackedFixedSizePrimitive(google::protobuf::io::CodedInputStream* input,
+                                           RepeatedField<CType>* value);
 
   static const CppType kFieldTypeToCppTypeMap[];
   static const WireFormatLite::WireType kWireTypeForFieldType[];
@@ -792,10 +598,10 @@
   return static_cast<int>(tag >> kTagTypeBits);
 }
 
-inline size_t WireFormatLite::TagSize(int field_number,
-                                      WireFormatLite::FieldType type) {
-  size_t result = io::CodedOutputStream::VarintSize32(
-    static_cast<uint32>(field_number << kTagTypeBits));
+inline int WireFormatLite::TagSize(int field_number,
+                                   WireFormatLite::FieldType type) {
+  int result = io::CodedOutputStream::VarintSize32(
+    field_number << kTagTypeBits);
   if (type == TYPE_GROUP) {
     // Groups have both a start and an end tag.
     return result * 2;
@@ -854,24 +660,20 @@
 
 inline uint32 WireFormatLite::ZigZagEncode32(int32 n) {
   // Note:  the right-shift must be arithmetic
-  // Note:  left shift must be unsigned because of overflow
-  return (static_cast<uint32>(n) << 1) ^ static_cast<uint32>(n >> 31);
+  return (static_cast<uint32>(n) << 1) ^ (n >> 31);
 }
 
 inline int32 WireFormatLite::ZigZagDecode32(uint32 n) {
-  // Note:  Using unsigned types prevent undefined behavior
-  return static_cast<int32>((n >> 1) ^ -(n & 1));
+  return (n >> 1) ^ -static_cast<int32>(n & 1);
 }
 
 inline uint64 WireFormatLite::ZigZagEncode64(int64 n) {
   // Note:  the right-shift must be arithmetic
-  // Note:  left shift must be unsigned because of overflow
-  return (static_cast<uint64>(n) << 1) ^ static_cast<uint64>(n >> 63);
+  return (static_cast<uint64>(n) << 1) ^ (n >> 63);
 }
 
 inline int64 WireFormatLite::ZigZagDecode64(uint64 n) {
-  // Note:  Using unsigned types prevent undefined behavior
-  return static_cast<int64>((n >> 1) ^ -(n & 1));
+  return (n >> 1) ^ -static_cast<int64>(n & 1);
 }
 
 // String is for UTF-8 text only, but, even so, ReadString() can simply
diff --git a/src/google/protobuf/wire_format_lite_inl.h b/src/google/protobuf/wire_format_lite_inl.h
index b264bd7..7bce21c 100644
--- a/src/google/protobuf/wire_format_lite_inl.h
+++ b/src/google/protobuf/wire_format_lite_inl.h
@@ -36,7 +36,11 @@
 #ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
 #define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
 
+#ifdef _MSC_VER
+// This is required for min/max on VS2013 only.
 #include <algorithm>
+#endif
+
 #include <string>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
@@ -247,7 +251,7 @@
     uint32 tag,
     io::CodedInputStream* input,
     RepeatedField<CType>* values) {
-  GOOGLE_DCHECK_EQ(UInt32Size(tag), static_cast<size_t>(tag_size));
+  GOOGLE_DCHECK_EQ(UInt32Size(tag), tag_size);
   CType value;
   if (!ReadPrimitive<CType, DeclaredType>(input, &value))
     return false;
@@ -268,11 +272,10 @@
   if (size > 0) {
     const uint8* buffer = reinterpret_cast<const uint8*>(void_pointer);
     // The number of bytes each type occupies on the wire.
-    const int per_value_size = tag_size + static_cast<int>(sizeof(value));
+    const int per_value_size = tag_size + sizeof(value);
 
-    // parentheses around (std::min) prevents macro expansion of min(...)
     int elements_available =
-        (std::min)(values->Capacity() - values->size(), size / per_value_size);
+        std::min(values->Capacity() - values->size(), size / per_value_size);
     int num_read = 0;
     while (num_read < elements_available &&
            (buffer = io::CodedInputStream::ExpectTagFromArray(
@@ -326,8 +329,8 @@
 template <typename CType, enum WireFormatLite::FieldType DeclaredType>
 inline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input,
                                                 RepeatedField<CType>* values) {
-  int length;
-  if (!input->ReadVarintSizeAsInt(&length)) return false;
+  uint32 length;
+  if (!input->ReadVarint32(&length)) return false;
   io::CodedInputStream::Limit limit = input->PushLimit(length);
   while (input->BytesUntilLimit() > 0) {
     CType value;
@@ -341,11 +344,11 @@
 template <typename CType, enum WireFormatLite::FieldType DeclaredType>
 inline bool WireFormatLite::ReadPackedFixedSizePrimitive(
     io::CodedInputStream* input, RepeatedField<CType>* values) {
-  int length;
-  if (!input->ReadVarintSizeAsInt(&length)) return false;
-  const int old_entries = values->size();
-  const int new_entries = length / static_cast<int>(sizeof(CType));
-  const int new_bytes = new_entries * static_cast<int>(sizeof(CType));
+  uint32 length;
+  if (!input->ReadVarint32(&length)) return false;
+  const uint32 old_entries = values->size();
+  const uint32 new_entries = length / sizeof(CType);
+  const uint32 new_bytes = new_entries * sizeof(CType);
   if (new_bytes != length) return false;
   // We would *like* to pre-allocate the buffer to write into (for
   // speed), but *must* avoid performing a very large allocation due
@@ -363,9 +366,8 @@
   if (bytes_limit == -1) {
     bytes_limit = input->BytesUntilLimit();
   } else {
-    // parentheses around (std::min) prevents macro expansion of min(...)
     bytes_limit =
-        (std::min)(bytes_limit, static_cast<int64>(input->BytesUntilLimit()));
+        std::min(bytes_limit, static_cast<int64>(input->BytesUntilLimit()));
   }
   if (bytes_limit >= new_bytes) {
     // Fast-path that pre-allocates *values to the final size.
@@ -380,7 +382,7 @@
 #else
     values->Reserve(old_entries + new_entries);
     CType value;
-    for (int i = 0; i < new_entries; ++i) {
+    for (uint32 i = 0; i < new_entries; ++i) {
       if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
       values->AddAlreadyReserved(value);
     }
@@ -390,7 +392,7 @@
     // safely allocate.  We read as much as we can into *values
     // without pre-allocating "length" bytes.
     CType value;
-    for (int i = 0; i < new_entries; ++i) {
+    for (uint32 i = 0; i < new_entries; ++i) {
       if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
       values->Add(value);
     }
@@ -426,6 +428,7 @@
 }
 
 
+
 inline bool WireFormatLite::ReadGroup(int field_number,
                                       io::CodedInputStream* input,
                                       MessageLite* value) {
@@ -440,14 +443,14 @@
 }
 inline bool WireFormatLite::ReadMessage(io::CodedInputStream* input,
                                         MessageLite* value) {
-  int length;
-  if (!input->ReadVarintSizeAsInt(&length)) return false;
+  uint32 length;
+  if (!input->ReadVarint32(&length)) return false;
   std::pair<io::CodedInputStream::Limit, int> p =
       input->IncrementRecursionDepthAndPushLimit(length);
   if (p.second < 0 || !value->MergePartialFromCodedStream(input)) return false;
   // Make sure that parsing stopped when the limit was hit, not at an endgroup
   // tag.
- return input->DecrementRecursionDepthAndPopLimit(p.first);
+  return input->DecrementRecursionDepthAndPopLimit(p.first);
 }
 
 // We name the template parameter something long and extremely unlikely to occur
@@ -486,8 +489,8 @@
 template<typename MessageType_WorkAroundCppLookupDefect>
 inline bool WireFormatLite::ReadMessageNoVirtual(
     io::CodedInputStream* input, MessageType_WorkAroundCppLookupDefect* value) {
-  int length;
-  if (!input->ReadVarintSizeAsInt(&length)) return false;
+  uint32 length;
+  if (!input->ReadVarint32(&length)) return false;
   std::pair<io::CodedInputStream::Limit, int> p =
       input->IncrementRecursionDepthAndPushLimit(length);
   if (p.second < 0 || !value->
@@ -497,7 +500,6 @@
   // tag.
   return input->DecrementRecursionDepthAndPopLimit(p.first);
 }
-
 template<typename MessageType_WorkAroundCppLookupDefect>
 inline bool WireFormatLite::ReadMessageNoVirtualNoRecursionDepth(
     io::CodedInputStream* input, MessageType_WorkAroundCppLookupDefect* value) {
@@ -667,98 +669,6 @@
   return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
 }
 
-template<typename T>
-inline uint8* WireFormatLite::WritePrimitiveNoTagToArray(
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(T, uint8*), uint8* target) {
-  const int n = value.size();
-  GOOGLE_DCHECK_GT(n, 0);
-
-  const T* ii = value.unsafe_data();
-  int i = 0;
-  do {
-    target = Writer(ii[i], target);
-  } while (++i < n);
-
-  return target;
-}
-
-template<typename T>
-inline uint8* WireFormatLite::WriteFixedNoTagToArray(
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(T, uint8*), uint8* target) {
-#if defined(PROTOBUF_LITTLE_ENDIAN)
-  (void) Writer;
-
-  const int n = value.size();
-  GOOGLE_DCHECK_GT(n, 0);
-
-  const T* ii = value.unsafe_data();
-  const int bytes = n * static_cast<int>(sizeof(ii[0]));
-  memcpy(target, ii, static_cast<size_t>(bytes));
-  return target + bytes;
-#else
-  return WritePrimitiveNoTagToArray(value, Writer, target);
-#endif
-}
-
-inline uint8* WireFormatLite::WriteInt32NoTagToArray(
-    const RepeatedField< int32>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteInt32NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteInt64NoTagToArray(
-    const RepeatedField< int64>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteInt64NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteUInt32NoTagToArray(
-    const RepeatedField<uint32>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteUInt32NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteUInt64NoTagToArray(
-    const RepeatedField<uint64>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteUInt64NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteSInt32NoTagToArray(
-    const RepeatedField< int32>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteSInt32NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteSInt64NoTagToArray(
-    const RepeatedField< int64>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteSInt64NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteFixed32NoTagToArray(
-    const RepeatedField<uint32>& value, uint8* target) {
-  return WriteFixedNoTagToArray(value, WriteFixed32NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteFixed64NoTagToArray(
-    const RepeatedField<uint64>& value, uint8* target) {
-  return WriteFixedNoTagToArray(value, WriteFixed64NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteSFixed32NoTagToArray(
-    const RepeatedField< int32>& value, uint8* target) {
-  return WriteFixedNoTagToArray(value, WriteSFixed32NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteSFixed64NoTagToArray(
-    const RepeatedField< int64>& value, uint8* target) {
-  return WriteFixedNoTagToArray(value, WriteSFixed64NoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteFloatNoTagToArray(
-    const RepeatedField< float>& value, uint8* target) {
-  return WriteFixedNoTagToArray(value, WriteFloatNoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteDoubleNoTagToArray(
-    const RepeatedField<double>& value, uint8* target) {
-  return WriteFixedNoTagToArray(value, WriteDoubleNoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteBoolNoTagToArray(
-    const RepeatedField<  bool>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteBoolNoTagToArray, target);
-}
-inline uint8* WireFormatLite::WriteEnumNoTagToArray(
-    const RepeatedField<   int>& value, uint8* target) {
-  return WritePrimitiveNoTagToArray(value, WriteEnumNoTagToArray, target);
-}
-
 inline uint8* WireFormatLite::WriteInt32ToArray(int field_number,
                                                 int32 value,
                                                 uint8* target) {
@@ -844,85 +754,6 @@
   return WriteEnumNoTagToArray(value, target);
 }
 
-template<typename T>
-inline uint8* WireFormatLite::WritePrimitiveToArray(
-    int field_number,
-    const RepeatedField<T>& value,
-    uint8* (*Writer)(int, T, uint8*), uint8* target) {
-  const int n = value.size();
-  if (n == 0) {
-    return target;
-  }
-
-  const T* ii = value.unsafe_data();
-  int i = 0;
-  do {
-    target = Writer(field_number, ii[i], target);
-  } while (++i < n);
-
-  return target;
-}
-
-inline uint8* WireFormatLite::WriteInt32ToArray(
-    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) {
-  return WritePrimitiveToArray(field_number, value, WriteInt64ToArray, target);
-}
-inline uint8* WireFormatLite::WriteUInt32ToArray(
-    int field_number, const RepeatedField<uint32>& value, uint8* target) {
-  return WritePrimitiveToArray(field_number, value, WriteUInt32ToArray, target);
-}
-inline uint8* WireFormatLite::WriteUInt64ToArray(
-    int field_number, const RepeatedField<uint64>& value, uint8* target) {
-  return WritePrimitiveToArray(field_number, value, WriteUInt64ToArray, target);
-}
-inline uint8* WireFormatLite::WriteSInt32ToArray(
-    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) {
-  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);
-}
-inline uint8* WireFormatLite::WriteFixed64ToArray(
-    int field_number, const RepeatedField<uint64>& value, uint8* 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);
-}
-inline uint8* WireFormatLite::WriteSFixed64ToArray(
-    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) {
-  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) {
-  return WritePrimitiveToArray(field_number, value, WriteBoolToArray, 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,
                                                  const string& value,
                                                  uint8* target) {
@@ -941,133 +772,103 @@
 }
 
 
-inline uint8* WireFormatLite::InternalWriteGroupToArray(
-    int field_number, const MessageLite& value, bool deterministic,
-    uint8* target) {
+inline uint8* WireFormatLite::WriteGroupToArray(int field_number,
+                                                const MessageLite& value,
+                                                uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
-  target = value.InternalSerializeWithCachedSizesToArray(deterministic, target);
+  target = value.SerializeWithCachedSizesToArray(target);
   return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
 }
-inline uint8* WireFormatLite::InternalWriteMessageToArray(
-    int field_number, const MessageLite& value, bool deterministic,
-    uint8* target) {
+inline uint8* WireFormatLite::WriteMessageToArray(int field_number,
+                                                  const MessageLite& value,
+                                                  uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
   target = io::CodedOutputStream::WriteVarint32ToArray(
-    static_cast<uint32>(value.GetCachedSize()), target);
-  return value.InternalSerializeWithCachedSizesToArray(deterministic, target);
+    value.GetCachedSize(), target);
+  return value.SerializeWithCachedSizesToArray(target);
 }
 
 // See comment on ReadGroupNoVirtual to understand the need for this template
 // parameter name.
 template<typename MessageType_WorkAroundCppLookupDefect>
-inline uint8* WireFormatLite::InternalWriteGroupNoVirtualToArray(
+inline uint8* WireFormatLite::WriteGroupNoVirtualToArray(
     int field_number, const MessageType_WorkAroundCppLookupDefect& value,
-    bool deterministic, uint8* target) {
+    uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
-  target = value.MessageType_WorkAroundCppLookupDefect::
-      InternalSerializeWithCachedSizesToArray(deterministic, target);
+  target = value.MessageType_WorkAroundCppLookupDefect
+      ::SerializeWithCachedSizesToArray(target);
   return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
 }
 template<typename MessageType_WorkAroundCppLookupDefect>
-inline uint8* WireFormatLite::InternalWriteMessageNoVirtualToArray(
+inline uint8* WireFormatLite::WriteMessageNoVirtualToArray(
     int field_number, const MessageType_WorkAroundCppLookupDefect& value,
-    bool deterministic, uint8* target) {
+    uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
   target = io::CodedOutputStream::WriteVarint32ToArray(
-        static_cast<uint32>(
-            value.MessageType_WorkAroundCppLookupDefect::GetCachedSize()),
-        target);
-  return value.MessageType_WorkAroundCppLookupDefect::
-      InternalSerializeWithCachedSizesToArray(deterministic, target);
+    value.MessageType_WorkAroundCppLookupDefect::GetCachedSize(), target);
+  return value.MessageType_WorkAroundCppLookupDefect
+      ::SerializeWithCachedSizesToArray(target);
 }
 
 // ===================================================================
 
-inline size_t WireFormatLite::Int32Size(int32 value) {
+inline int WireFormatLite::Int32Size(int32 value) {
   return io::CodedOutputStream::VarintSize32SignExtended(value);
 }
-inline size_t WireFormatLite::Int64Size(int64 value) {
+inline int WireFormatLite::Int64Size(int64 value) {
   return io::CodedOutputStream::VarintSize64(static_cast<uint64>(value));
 }
-inline size_t WireFormatLite::UInt32Size(uint32 value) {
+inline int WireFormatLite::UInt32Size(uint32 value) {
   return io::CodedOutputStream::VarintSize32(value);
 }
-inline size_t WireFormatLite::UInt64Size(uint64 value) {
+inline int WireFormatLite::UInt64Size(uint64 value) {
   return io::CodedOutputStream::VarintSize64(value);
 }
-inline size_t WireFormatLite::SInt32Size(int32 value) {
+inline int WireFormatLite::SInt32Size(int32 value) {
   return io::CodedOutputStream::VarintSize32(ZigZagEncode32(value));
 }
-inline size_t WireFormatLite::SInt64Size(int64 value) {
+inline int WireFormatLite::SInt64Size(int64 value) {
   return io::CodedOutputStream::VarintSize64(ZigZagEncode64(value));
 }
-inline size_t WireFormatLite::EnumSize(int value) {
+inline int WireFormatLite::EnumSize(int value) {
   return io::CodedOutputStream::VarintSize32SignExtended(value);
 }
 
-inline size_t WireFormatLite::StringSize(const string& value) {
-  return LengthDelimitedSize(value.size());
+inline int WireFormatLite::StringSize(const string& value) {
+  return static_cast<int>(
+      io::CodedOutputStream::VarintSize32(static_cast<uint32>(value.size())) +
+      value.size());
 }
-inline size_t WireFormatLite::BytesSize(const string& value) {
-  return LengthDelimitedSize(value.size());
+inline int WireFormatLite::BytesSize(const string& value) {
+  return static_cast<int>(
+      io::CodedOutputStream::VarintSize32(static_cast<uint32>(value.size())) +
+      value.size());
 }
 
 
-inline size_t WireFormatLite::GroupSize(const MessageLite& value) {
-  return value.ByteSizeLong();
+inline int WireFormatLite::GroupSize(const MessageLite& value) {
+  return value.ByteSize();
 }
-inline size_t WireFormatLite::MessageSize(const MessageLite& value) {
-  return LengthDelimitedSize(value.ByteSizeLong());
+inline int WireFormatLite::MessageSize(const MessageLite& value) {
+  return LengthDelimitedSize(value.ByteSize());
 }
 
 // See comment on ReadGroupNoVirtual to understand the need for this template
 // parameter name.
 template<typename MessageType_WorkAroundCppLookupDefect>
-inline size_t WireFormatLite::GroupSizeNoVirtual(
+inline int WireFormatLite::GroupSizeNoVirtual(
     const MessageType_WorkAroundCppLookupDefect& value) {
-  return value.MessageType_WorkAroundCppLookupDefect::ByteSizeLong();
+  return value.MessageType_WorkAroundCppLookupDefect::ByteSize();
 }
 template<typename MessageType_WorkAroundCppLookupDefect>
-inline size_t WireFormatLite::MessageSizeNoVirtual(
+inline int WireFormatLite::MessageSizeNoVirtual(
     const MessageType_WorkAroundCppLookupDefect& value) {
   return LengthDelimitedSize(
-      value.MessageType_WorkAroundCppLookupDefect::ByteSizeLong());
+      value.MessageType_WorkAroundCppLookupDefect::ByteSize());
 }
 
-inline size_t WireFormatLite::LengthDelimitedSize(size_t length) {
-  // The static_cast here prevents an error in certain compiler configurations
-  // 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));
-}
-
-size_t WireFormatLite::Int64Size (const RepeatedField< int64>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += Int64Size(value.Get(i));
-  }
-  return out;
-}
-
-size_t WireFormatLite::UInt64Size(const RepeatedField<uint64>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += UInt64Size(value.Get(i));
-  }
-  return out;
-}
-
-size_t WireFormatLite::SInt64Size(const RepeatedField< int64>& value) {
-  size_t out = 0;
-  const int n = value.size();
-  for (int i = 0; i < n; i++) {
-    out += SInt64Size(value.Get(i));
-  }
-  return out;
+inline int WireFormatLite::LengthDelimitedSize(int length) {
+  return io::CodedOutputStream::VarintSize32(length) + length;
 }
 
 }  // namespace internal
diff --git a/src/google/protobuf/wire_format_unittest.cc b/src/google/protobuf/wire_format_unittest.cc
index cafe9a4..4e4add6 100644
--- a/src/google/protobuf/wire_format_unittest.cc
+++ b/src/google/protobuf/wire_format_unittest.cc
@@ -1029,29 +1029,6 @@
   EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\017", 1)));
 }
 
-TEST_F(WireFormatInvalidInputTest, InvalidMessageWithExtraZero) {
-  string data;
-  {
-    // Serialize a valid proto
-    unittest::TestAllTypes message;
-    message.set_optional_int32(1);
-    message.SerializeToString(&data);
-    data.push_back(0);  // Append invalid zero tag
-  }
-
-  // Control case.
-  {
-    io::ArrayInputStream ais(data.data(), data.size());
-    io::CodedInputStream is(&ais);
-    unittest::TestAllTypes message;
-    // It should fail but currently passes.
-    EXPECT_TRUE(message.MergePartialFromCodedStream(&is));
-    // Parsing from the string should fail.
-    EXPECT_FALSE(message.ParseFromString(data));
-  }
-}
-
-
 TEST_F(WireFormatInvalidInputTest, InvalidGroup) {
   unittest::TestAllTypes message;
 
@@ -1161,7 +1138,7 @@
 TEST_F(Utf8ValidationTest, WriteInvalidUTF8String) {
   string wire_buffer;
   protobuf_unittest::OneString input;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
@@ -1185,7 +1162,7 @@
   protobuf_unittest::OneString input;
   WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
   protobuf_unittest::OneString output;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     ReadMessage(wire_buffer, &output);
@@ -1208,7 +1185,7 @@
 TEST_F(Utf8ValidationTest, WriteValidUTF8String) {
   string wire_buffer;
   protobuf_unittest::OneString input;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     WriteMessage(kValidUTF8String, &input, &wire_buffer);
@@ -1222,7 +1199,7 @@
   protobuf_unittest::OneString input;
   WriteMessage(kValidUTF8String, &input, &wire_buffer);
   protobuf_unittest::OneString output;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     ReadMessage(wire_buffer, &output);
@@ -1236,7 +1213,7 @@
 TEST_F(Utf8ValidationTest, WriteArbitraryBytes) {
   string wire_buffer;
   protobuf_unittest::OneBytes input;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
@@ -1250,7 +1227,7 @@
   protobuf_unittest::OneBytes input;
   WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
   protobuf_unittest::OneBytes output;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     ReadMessage(wire_buffer, &output);
@@ -1268,7 +1245,7 @@
   string wire_buffer = input.SerializeAsString();
 
   protobuf_unittest::MoreString output;
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     ReadMessage(wire_buffer, &output);
@@ -1287,7 +1264,7 @@
 TEST_F(Utf8ValidationTest, OldVerifyUTF8String) {
   string data(kInvalidUTF8String);
 
-  std::vector<string> errors;
+  vector<string> errors;
   {
     ScopedMemoryLog log;
     WireFormat::VerifyUTF8String(data.data(), data.size(),
@@ -1306,136 +1283,6 @@
 }
 
 
-TEST(RepeatedVarint, Int32) {
-  RepeatedField<int32> v;
-
-  // Insert -2^n, 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(-(1 << n));
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar Int32Size.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::Int32Size(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::Int32Size(v));
-}
-
-TEST(RepeatedVarint, Int64) {
-  RepeatedField<int64> v;
-
-  // Insert -2^n, 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(-(1 << n));
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar Int64Size.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::Int64Size(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::Int64Size(v));
-}
-
-TEST(RepeatedVarint, SInt32) {
-  RepeatedField<int32> v;
-
-  // Insert -2^n, 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(-(1 << n));
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar SInt32Size.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::SInt32Size(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::SInt32Size(v));
-}
-
-TEST(RepeatedVarint, SInt64) {
-  RepeatedField<int64> v;
-
-  // Insert -2^n, 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(-(1 << n));
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar SInt64Size.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::SInt64Size(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::SInt64Size(v));
-}
-
-TEST(RepeatedVarint, UInt32) {
-  RepeatedField<uint32> v;
-
-  // Insert 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar UInt32Size.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::UInt32Size(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::UInt32Size(v));
-}
-
-TEST(RepeatedVarint, UInt64) {
-  RepeatedField<uint64> v;
-
-  // Insert 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar UInt64Size.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::UInt64Size(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::UInt64Size(v));
-}
-
-TEST(RepeatedVarint, Enum) {
-  RepeatedField<int> v;
-
-  // Insert 2^n and 2^n-1.
-  for (int n = 0; n < 10; n++) {
-    v.Add(1 << n);
-    v.Add((1 << n) - 1);
-  }
-
-  // Check consistency with the scalar EnumSize.
-  size_t expected = 0;
-  for (int i = 0; i < v.size(); i++) {
-    expected += WireFormatLite::EnumSize(v[i]);
-  }
-
-  EXPECT_EQ(expected, WireFormatLite::EnumSize(v));
-}
-
 }  // namespace
 }  // namespace internal
 }  // namespace protobuf
diff --git a/src/google/protobuf/wrappers.pb.cc b/src/google/protobuf/wrappers.pb.cc
index 00e0125..6080142 100644
--- a/src/google/protobuf/wrappers.pb.cc
+++ b/src/google/protobuf/wrappers.pb.cc
@@ -1,6 +1,7 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: google/protobuf/wrappers.proto
 
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
 #include <google/protobuf/wrappers.pb.h>
 
 #include <algorithm>
@@ -14,423 +15,335 @@
 #include <google/protobuf/generated_message_reflection.h>
 #include <google/protobuf/reflection_ops.h>
 #include <google/protobuf/wire_format.h>
-// This is a temporary google only hack
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-#include "third_party/protobuf/version.h"
-#endif
 // @@protoc_insertion_point(includes)
+
 namespace google {
 namespace protobuf {
-class DoubleValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<DoubleValue>
-      _instance;
-} _DoubleValue_default_instance_;
-class FloatValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<FloatValue>
-      _instance;
-} _FloatValue_default_instance_;
-class Int64ValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Int64Value>
-      _instance;
-} _Int64Value_default_instance_;
-class UInt64ValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<UInt64Value>
-      _instance;
-} _UInt64Value_default_instance_;
-class Int32ValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<Int32Value>
-      _instance;
-} _Int32Value_default_instance_;
-class UInt32ValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<UInt32Value>
-      _instance;
-} _UInt32Value_default_instance_;
-class BoolValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<BoolValue>
-      _instance;
-} _BoolValue_default_instance_;
-class StringValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<StringValue>
-      _instance;
-} _StringValue_default_instance_;
-class BytesValueDefaultTypeInternal {
- public:
-  ::google::protobuf::internal::ExplicitlyConstructed<BytesValue>
-      _instance;
-} _BytesValue_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace protobuf_google_2fprotobuf_2fwrappers_2eproto {
-void InitDefaultsDoubleValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
 
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_DoubleValue_default_instance_;
-    new (ptr) ::google::protobuf::DoubleValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::DoubleValue::InitAsDefaultInstance();
+namespace {
+
+const ::google::protobuf::Descriptor* DoubleValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  DoubleValue_reflection_ = NULL;
+const ::google::protobuf::Descriptor* FloatValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  FloatValue_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Int64Value_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Int64Value_reflection_ = NULL;
+const ::google::protobuf::Descriptor* UInt64Value_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  UInt64Value_reflection_ = NULL;
+const ::google::protobuf::Descriptor* Int32Value_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  Int32Value_reflection_ = NULL;
+const ::google::protobuf::Descriptor* UInt32Value_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  UInt32Value_reflection_ = NULL;
+const ::google::protobuf::Descriptor* BoolValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  BoolValue_reflection_ = NULL;
+const ::google::protobuf::Descriptor* StringValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  StringValue_reflection_ = NULL;
+const ::google::protobuf::Descriptor* BytesValue_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  BytesValue_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto() {
+  protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "google/protobuf/wrappers.proto");
+  GOOGLE_CHECK(file != NULL);
+  DoubleValue_descriptor_ = file->message_type(0);
+  static const int DoubleValue_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DoubleValue, value_),
+  };
+  DoubleValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      DoubleValue_descriptor_,
+      DoubleValue::default_instance_,
+      DoubleValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(DoubleValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DoubleValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DoubleValue, _is_default_instance_));
+  FloatValue_descriptor_ = file->message_type(1);
+  static const int FloatValue_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FloatValue, value_),
+  };
+  FloatValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      FloatValue_descriptor_,
+      FloatValue::default_instance_,
+      FloatValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(FloatValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FloatValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FloatValue, _is_default_instance_));
+  Int64Value_descriptor_ = file->message_type(2);
+  static const int Int64Value_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Int64Value, value_),
+  };
+  Int64Value_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Int64Value_descriptor_,
+      Int64Value::default_instance_,
+      Int64Value_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Int64Value),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Int64Value, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Int64Value, _is_default_instance_));
+  UInt64Value_descriptor_ = file->message_type(3);
+  static const int UInt64Value_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UInt64Value, value_),
+  };
+  UInt64Value_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      UInt64Value_descriptor_,
+      UInt64Value::default_instance_,
+      UInt64Value_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(UInt64Value),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UInt64Value, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UInt64Value, _is_default_instance_));
+  Int32Value_descriptor_ = file->message_type(4);
+  static const int Int32Value_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Int32Value, value_),
+  };
+  Int32Value_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      Int32Value_descriptor_,
+      Int32Value::default_instance_,
+      Int32Value_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(Int32Value),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Int32Value, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Int32Value, _is_default_instance_));
+  UInt32Value_descriptor_ = file->message_type(5);
+  static const int UInt32Value_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UInt32Value, value_),
+  };
+  UInt32Value_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      UInt32Value_descriptor_,
+      UInt32Value::default_instance_,
+      UInt32Value_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(UInt32Value),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UInt32Value, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UInt32Value, _is_default_instance_));
+  BoolValue_descriptor_ = file->message_type(6);
+  static const int BoolValue_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BoolValue, value_),
+  };
+  BoolValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      BoolValue_descriptor_,
+      BoolValue::default_instance_,
+      BoolValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(BoolValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BoolValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BoolValue, _is_default_instance_));
+  StringValue_descriptor_ = file->message_type(7);
+  static const int StringValue_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StringValue, value_),
+  };
+  StringValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      StringValue_descriptor_,
+      StringValue::default_instance_,
+      StringValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(StringValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StringValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StringValue, _is_default_instance_));
+  BytesValue_descriptor_ = file->message_type(8);
+  static const int BytesValue_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BytesValue, value_),
+  };
+  BytesValue_reflection_ =
+    ::google::protobuf::internal::GeneratedMessageReflection::NewGeneratedMessageReflection(
+      BytesValue_descriptor_,
+      BytesValue::default_instance_,
+      BytesValue_offsets_,
+      -1,
+      -1,
+      -1,
+      sizeof(BytesValue),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BytesValue, _internal_metadata_),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BytesValue, _is_default_instance_));
 }
 
-void InitDefaultsDoubleValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDoubleValueImpl);
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto);
 }
 
-void InitDefaultsFloatValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_FloatValue_default_instance_;
-    new (ptr) ::google::protobuf::FloatValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::FloatValue::InitAsDefaultInstance();
-}
-
-void InitDefaultsFloatValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFloatValueImpl);
-}
-
-void InitDefaultsInt64ValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Int64Value_default_instance_;
-    new (ptr) ::google::protobuf::Int64Value();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Int64Value::InitAsDefaultInstance();
-}
-
-void InitDefaultsInt64Value() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsInt64ValueImpl);
-}
-
-void InitDefaultsUInt64ValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_UInt64Value_default_instance_;
-    new (ptr) ::google::protobuf::UInt64Value();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::UInt64Value::InitAsDefaultInstance();
-}
-
-void InitDefaultsUInt64Value() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUInt64ValueImpl);
-}
-
-void InitDefaultsInt32ValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_Int32Value_default_instance_;
-    new (ptr) ::google::protobuf::Int32Value();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::Int32Value::InitAsDefaultInstance();
-}
-
-void InitDefaultsInt32Value() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsInt32ValueImpl);
-}
-
-void InitDefaultsUInt32ValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_UInt32Value_default_instance_;
-    new (ptr) ::google::protobuf::UInt32Value();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::UInt32Value::InitAsDefaultInstance();
-}
-
-void InitDefaultsUInt32Value() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUInt32ValueImpl);
-}
-
-void InitDefaultsBoolValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_BoolValue_default_instance_;
-    new (ptr) ::google::protobuf::BoolValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::BoolValue::InitAsDefaultInstance();
-}
-
-void InitDefaultsBoolValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsBoolValueImpl);
-}
-
-void InitDefaultsStringValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_StringValue_default_instance_;
-    new (ptr) ::google::protobuf::StringValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::StringValue::InitAsDefaultInstance();
-}
-
-void InitDefaultsStringValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsStringValueImpl);
-}
-
-void InitDefaultsBytesValueImpl() {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-
-#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
-#else
-  ::google::protobuf::internal::InitProtobufDefaults();
-#endif  // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
-  {
-    void* ptr = &::google::protobuf::_BytesValue_default_instance_;
-    new (ptr) ::google::protobuf::BytesValue();
-    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
-  }
-  ::google::protobuf::BytesValue::InitAsDefaultInstance();
-}
-
-void InitDefaultsBytesValue() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsBytesValueImpl);
-}
-
-::google::protobuf::Metadata file_level_metadata[9];
-
-const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DoubleValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DoubleValue, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FloatValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FloatValue, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Int64Value, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Int64Value, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UInt64Value, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UInt64Value, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Int32Value, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Int32Value, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UInt32Value, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UInt32Value, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::BoolValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::BoolValue, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::StringValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::StringValue, value_),
-  ~0u,  // no _has_bits_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::BytesValue, _internal_metadata_),
-  ~0u,  // no _extensions_
-  ~0u,  // no _oneof_case_
-  ~0u,  // no _weak_field_map_
-  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::BytesValue, value_),
-};
-static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-  { 0, -1, sizeof(::google::protobuf::DoubleValue)},
-  { 6, -1, sizeof(::google::protobuf::FloatValue)},
-  { 12, -1, sizeof(::google::protobuf::Int64Value)},
-  { 18, -1, sizeof(::google::protobuf::UInt64Value)},
-  { 24, -1, sizeof(::google::protobuf::Int32Value)},
-  { 30, -1, sizeof(::google::protobuf::UInt32Value)},
-  { 36, -1, sizeof(::google::protobuf::BoolValue)},
-  { 42, -1, sizeof(::google::protobuf::StringValue)},
-  { 48, -1, sizeof(::google::protobuf::BytesValue)},
-};
-
-static ::google::protobuf::Message const * const file_default_instances[] = {
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_DoubleValue_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_FloatValue_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Int64Value_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_UInt64Value_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_Int32Value_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_UInt32Value_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_BoolValue_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_StringValue_default_instance_),
-  reinterpret_cast<const ::google::protobuf::Message*>(&::google::protobuf::_BytesValue_default_instance_),
-};
-
-void protobuf_AssignDescriptors() {
-  AddDescriptors();
-  ::google::protobuf::MessageFactory* factory = NULL;
-  AssignDescriptors(
-      "google/protobuf/wrappers.proto", schemas, file_default_instances, TableStruct::offsets, factory,
-      file_level_metadata, NULL, NULL);
-}
-
-void protobuf_AssignDescriptorsOnce() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
-}
-
-void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
 void protobuf_RegisterTypes(const ::std::string&) {
   protobuf_AssignDescriptorsOnce();
-  ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 9);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      DoubleValue_descriptor_, &DoubleValue::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      FloatValue_descriptor_, &FloatValue::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Int64Value_descriptor_, &Int64Value::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      UInt64Value_descriptor_, &UInt64Value::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      Int32Value_descriptor_, &Int32Value::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      UInt32Value_descriptor_, &UInt32Value::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      BoolValue_descriptor_, &BoolValue::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      StringValue_descriptor_, &StringValue::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+      BytesValue_descriptor_, &BytesValue::default_instance());
 }
 
-void AddDescriptorsImpl() {
-  InitDefaults();
-  static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
-      "\n\036google/protobuf/wrappers.proto\022\017google"
-      ".protobuf\"\034\n\013DoubleValue\022\r\n\005value\030\001 \001(\001\""
-      "\033\n\nFloatValue\022\r\n\005value\030\001 \001(\002\"\033\n\nInt64Val"
-      "ue\022\r\n\005value\030\001 \001(\003\"\034\n\013UInt64Value\022\r\n\005valu"
-      "e\030\001 \001(\004\"\033\n\nInt32Value\022\r\n\005value\030\001 \001(\005\"\034\n\013"
-      "UInt32Value\022\r\n\005value\030\001 \001(\r\"\032\n\tBoolValue\022"
-      "\r\n\005value\030\001 \001(\010\"\034\n\013StringValue\022\r\n\005value\030\001"
-      " \001(\t\"\033\n\nBytesValue\022\r\n\005value\030\001 \001(\014B|\n\023com"
-      ".google.protobufB\rWrappersProtoP\001Z*githu"
-      "b.com/golang/protobuf/ptypes/wrappers\370\001\001"
-      "\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypesb"
-      "\006proto3"
-  };
+}  // namespace
+
+void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto() {
+  delete DoubleValue::default_instance_;
+  delete DoubleValue_reflection_;
+  delete FloatValue::default_instance_;
+  delete FloatValue_reflection_;
+  delete Int64Value::default_instance_;
+  delete Int64Value_reflection_;
+  delete UInt64Value::default_instance_;
+  delete UInt64Value_reflection_;
+  delete Int32Value::default_instance_;
+  delete Int32Value_reflection_;
+  delete UInt32Value::default_instance_;
+  delete UInt32Value_reflection_;
+  delete BoolValue::default_instance_;
+  delete BoolValue_reflection_;
+  delete StringValue::default_instance_;
+  delete StringValue_reflection_;
+  delete BytesValue::default_instance_;
+  delete BytesValue_reflection_;
+}
+
+void protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 447);
+    "\n\036google/protobuf/wrappers.proto\022\017google"
+    ".protobuf\"\034\n\013DoubleValue\022\r\n\005value\030\001 \001(\001\""
+    "\033\n\nFloatValue\022\r\n\005value\030\001 \001(\002\"\033\n\nInt64Val"
+    "ue\022\r\n\005value\030\001 \001(\003\"\034\n\013UInt64Value\022\r\n\005valu"
+    "e\030\001 \001(\004\"\033\n\nInt32Value\022\r\n\005value\030\001 \001(\005\"\034\n\013"
+    "UInt32Value\022\r\n\005value\030\001 \001(\r\"\032\n\tBoolValue\022"
+    "\r\n\005value\030\001 \001(\010\"\034\n\013StringValue\022\r\n\005value\030\001"
+    " \001(\t\"\033\n\nBytesValue\022\r\n\005value\030\001 \001(\014B\177\n\023com"
+    ".google.protobufB\rWrappersProtoP\001Z*githu"
+    "b.com/golang/protobuf/ptypes/wrappers\240\001\001"
+    "\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTyp"
+    "esb\006proto3", 450);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "google/protobuf/wrappers.proto", &protobuf_RegisterTypes);
+  DoubleValue::default_instance_ = new DoubleValue();
+  FloatValue::default_instance_ = new FloatValue();
+  Int64Value::default_instance_ = new Int64Value();
+  UInt64Value::default_instance_ = new UInt64Value();
+  Int32Value::default_instance_ = new Int32Value();
+  UInt32Value::default_instance_ = new UInt32Value();
+  BoolValue::default_instance_ = new BoolValue();
+  StringValue::default_instance_ = new StringValue();
+  BytesValue::default_instance_ = new BytesValue();
+  DoubleValue::default_instance_->InitAsDefaultInstance();
+  FloatValue::default_instance_->InitAsDefaultInstance();
+  Int64Value::default_instance_->InitAsDefaultInstance();
+  UInt64Value::default_instance_->InitAsDefaultInstance();
+  Int32Value::default_instance_->InitAsDefaultInstance();
+  UInt32Value::default_instance_->InitAsDefaultInstance();
+  BoolValue::default_instance_->InitAsDefaultInstance();
+  StringValue::default_instance_->InitAsDefaultInstance();
+  BytesValue::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto);
 }
 
-void AddDescriptors() {
-  static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
-  ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
-}
-// Force AddDescriptors() to be called at dynamic initialization time.
-struct StaticDescriptorInitializer {
-  StaticDescriptorInitializer() {
-    AddDescriptors();
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_google_2fprotobuf_2fwrappers_2eproto {
+  StaticDescriptorInitializer_google_2fprotobuf_2fwrappers_2eproto() {
+    protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
   }
-} static_descriptor_initializer;
-}  // namespace protobuf_google_2fprotobuf_2fwrappers_2eproto
-namespace google {
-namespace protobuf {
+} static_descriptor_initializer_google_2fprotobuf_2fwrappers_2eproto_;
+
+namespace {
+
+static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;
+static void MergeFromFail(int line) {
+  GOOGLE_CHECK(false) << __FILE__ << ":" << line;
+}
+
+}  // namespace
+
 
 // ===================================================================
 
-void DoubleValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int DoubleValue::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 DoubleValue::DoubleValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsDoubleValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.DoubleValue)
 }
+
 DoubleValue::DoubleValue(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsDoubleValue();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.DoubleValue)
 }
+
+void DoubleValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 DoubleValue::DoubleValue(const DoubleValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.DoubleValue)
 }
 
 void DoubleValue::SharedCtor() {
-  value_ = 0;
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = 0;
 }
 
 DoubleValue::~DoubleValue() {
@@ -439,7 +352,12 @@
 }
 
 void DoubleValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void DoubleValue::ArenaDtor(void* object) {
@@ -454,27 +372,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* DoubleValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return DoubleValue_descriptor_;
 }
 
 const DoubleValue& DoubleValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsDoubleValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+DoubleValue* DoubleValue::default_instance_ = NULL;
+
 DoubleValue* DoubleValue::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<DoubleValue>(arena);
 }
 
 void DoubleValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.DoubleValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = 0;
-  _internal_metadata_.Clear();
 }
 
 bool DoubleValue::MergePartialFromCodedStream(
@@ -483,31 +398,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.DoubleValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // double value = 1;
+      // optional double value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(9u /* 9 & 0xFF */)) {
-
+        if (tag == 9) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -524,66 +440,45 @@
 void DoubleValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.DoubleValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // double value = 1;
+  // optional double value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteDouble(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.DoubleValue)
 }
 
-::google::protobuf::uint8* DoubleValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* DoubleValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DoubleValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // double value = 1;
+  // optional double value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DoubleValue)
   return target;
 }
 
-size_t DoubleValue::ByteSizeLong() const {
+int DoubleValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DoubleValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // double value = 1;
+  // optional double value = 1;
   if (this->value() != 0) {
     total_size += 1 + 8;
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void DoubleValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DoubleValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const DoubleValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const DoubleValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const DoubleValue>(
           &from);
   if (source == NULL) {
@@ -597,11 +492,7 @@
 
 void DoubleValue::MergeFrom(const DoubleValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DoubleValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -622,6 +513,7 @@
 }
 
 bool DoubleValue::IsInitialized() const {
+
   return true;
 }
 
@@ -630,13 +522,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    DoubleValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    DoubleValue temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void DoubleValue::UnsafeArenaSwap(DoubleValue* other) {
@@ -645,54 +534,74 @@
   InternalSwap(other);
 }
 void DoubleValue::InternalSwap(DoubleValue* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata DoubleValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = DoubleValue_descriptor_;
+  metadata.reflection = DoubleValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// DoubleValue
+
+// optional double value = 1;
+void DoubleValue::clear_value() {
+  value_ = 0;
+}
+ double DoubleValue::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.DoubleValue.value)
+  return value_;
+}
+ void DoubleValue::set_value(double value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.DoubleValue.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void FloatValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int FloatValue::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 FloatValue::FloatValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsFloatValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.FloatValue)
 }
+
 FloatValue::FloatValue(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsFloatValue();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.FloatValue)
 }
+
+void FloatValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 FloatValue::FloatValue(const FloatValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.FloatValue)
 }
 
 void FloatValue::SharedCtor() {
-  value_ = 0;
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = 0;
 }
 
 FloatValue::~FloatValue() {
@@ -701,7 +610,12 @@
 }
 
 void FloatValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void FloatValue::ArenaDtor(void* object) {
@@ -716,27 +630,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* FloatValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return FloatValue_descriptor_;
 }
 
 const FloatValue& FloatValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsFloatValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+FloatValue* FloatValue::default_instance_ = NULL;
+
 FloatValue* FloatValue::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<FloatValue>(arena);
 }
 
 void FloatValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.FloatValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = 0;
-  _internal_metadata_.Clear();
 }
 
 bool FloatValue::MergePartialFromCodedStream(
@@ -745,31 +656,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.FloatValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // float value = 1;
+      // optional float value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(13u /* 13 & 0xFF */)) {
-
+        if (tag == 13) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -786,66 +698,45 @@
 void FloatValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.FloatValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // float value = 1;
+  // optional float value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteFloat(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.FloatValue)
 }
 
-::google::protobuf::uint8* FloatValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* FloatValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FloatValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // float value = 1;
+  // optional float value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteFloatToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FloatValue)
   return target;
 }
 
-size_t FloatValue::ByteSizeLong() const {
+int FloatValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FloatValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // float value = 1;
+  // optional float value = 1;
   if (this->value() != 0) {
     total_size += 1 + 4;
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void FloatValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FloatValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const FloatValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const FloatValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const FloatValue>(
           &from);
   if (source == NULL) {
@@ -859,11 +750,7 @@
 
 void FloatValue::MergeFrom(const FloatValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FloatValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -884,6 +771,7 @@
 }
 
 bool FloatValue::IsInitialized() const {
+
   return true;
 }
 
@@ -892,13 +780,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    FloatValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    FloatValue temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void FloatValue::UnsafeArenaSwap(FloatValue* other) {
@@ -907,54 +792,74 @@
   InternalSwap(other);
 }
 void FloatValue::InternalSwap(FloatValue* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata FloatValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = FloatValue_descriptor_;
+  metadata.reflection = FloatValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// FloatValue
+
+// optional float value = 1;
+void FloatValue::clear_value() {
+  value_ = 0;
+}
+ float FloatValue::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.FloatValue.value)
+  return value_;
+}
+ void FloatValue::set_value(float value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.FloatValue.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void Int64Value::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Int64Value::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 Int64Value::Int64Value()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt64Value();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Int64Value)
 }
+
 Int64Value::Int64Value(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt64Value();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.Int64Value)
 }
+
+void Int64Value::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Int64Value::Int64Value(const Int64Value& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Int64Value)
 }
 
 void Int64Value::SharedCtor() {
-  value_ = GOOGLE_LONGLONG(0);
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = GOOGLE_LONGLONG(0);
 }
 
 Int64Value::~Int64Value() {
@@ -963,7 +868,12 @@
 }
 
 void Int64Value::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void Int64Value::ArenaDtor(void* object) {
@@ -978,27 +888,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Int64Value::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Int64Value_descriptor_;
 }
 
 const Int64Value& Int64Value::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt64Value();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+Int64Value* Int64Value::default_instance_ = NULL;
+
 Int64Value* Int64Value::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<Int64Value>(arena);
 }
 
 void Int64Value::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Int64Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = GOOGLE_LONGLONG(0);
-  _internal_metadata_.Clear();
 }
 
 bool Int64Value::MergePartialFromCodedStream(
@@ -1007,31 +914,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Int64Value)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // int64 value = 1;
+      // optional int64 value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1048,68 +956,47 @@
 void Int64Value::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Int64Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int64 value = 1;
+  // optional int64 value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Int64Value)
 }
 
-::google::protobuf::uint8* Int64Value::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Int64Value::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Int64Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int64 value = 1;
+  // optional int64 value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Int64Value)
   return target;
 }
 
-size_t Int64Value::ByteSizeLong() const {
+int Int64Value::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Int64Value)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // int64 value = 1;
+  // optional int64 value = 1;
   if (this->value() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int64Size(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Int64Value::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Int64Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Int64Value* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Int64Value* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Int64Value>(
           &from);
   if (source == NULL) {
@@ -1123,11 +1010,7 @@
 
 void Int64Value::MergeFrom(const Int64Value& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Int64Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -1148,6 +1031,7 @@
 }
 
 bool Int64Value::IsInitialized() const {
+
   return true;
 }
 
@@ -1156,13 +1040,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    Int64Value* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    Int64Value temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void Int64Value::UnsafeArenaSwap(Int64Value* other) {
@@ -1171,54 +1052,74 @@
   InternalSwap(other);
 }
 void Int64Value::InternalSwap(Int64Value* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Int64Value::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Int64Value_descriptor_;
+  metadata.reflection = Int64Value_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Int64Value
+
+// optional int64 value = 1;
+void Int64Value::clear_value() {
+  value_ = GOOGLE_LONGLONG(0);
+}
+ ::google::protobuf::int64 Int64Value::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Int64Value.value)
+  return value_;
+}
+ void Int64Value::set_value(::google::protobuf::int64 value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Int64Value.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void UInt64Value::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int UInt64Value::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 UInt64Value::UInt64Value()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt64Value();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.UInt64Value)
 }
+
 UInt64Value::UInt64Value(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt64Value();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.UInt64Value)
 }
+
+void UInt64Value::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 UInt64Value::UInt64Value(const UInt64Value& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.UInt64Value)
 }
 
 void UInt64Value::SharedCtor() {
-  value_ = GOOGLE_ULONGLONG(0);
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = GOOGLE_ULONGLONG(0);
 }
 
 UInt64Value::~UInt64Value() {
@@ -1227,7 +1128,12 @@
 }
 
 void UInt64Value::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void UInt64Value::ArenaDtor(void* object) {
@@ -1242,27 +1148,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* UInt64Value::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return UInt64Value_descriptor_;
 }
 
 const UInt64Value& UInt64Value::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt64Value();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+UInt64Value* UInt64Value::default_instance_ = NULL;
+
 UInt64Value* UInt64Value::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<UInt64Value>(arena);
 }
 
 void UInt64Value::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.UInt64Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = GOOGLE_ULONGLONG(0);
-  _internal_metadata_.Clear();
 }
 
 bool UInt64Value::MergePartialFromCodedStream(
@@ -1271,31 +1174,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.UInt64Value)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // uint64 value = 1;
+      // optional uint64 value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1312,68 +1216,47 @@
 void UInt64Value::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.UInt64Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // uint64 value = 1;
+  // optional uint64 value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.UInt64Value)
 }
 
-::google::protobuf::uint8* UInt64Value::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* UInt64Value::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UInt64Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // uint64 value = 1;
+  // optional uint64 value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UInt64Value)
   return target;
 }
 
-size_t UInt64Value::ByteSizeLong() const {
+int UInt64Value::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UInt64Value)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // uint64 value = 1;
+  // optional uint64 value = 1;
   if (this->value() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt64Size(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void UInt64Value::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.UInt64Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  const UInt64Value* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const UInt64Value* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const UInt64Value>(
           &from);
   if (source == NULL) {
@@ -1387,11 +1270,7 @@
 
 void UInt64Value::MergeFrom(const UInt64Value& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UInt64Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -1412,6 +1291,7 @@
 }
 
 bool UInt64Value::IsInitialized() const {
+
   return true;
 }
 
@@ -1420,13 +1300,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    UInt64Value* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    UInt64Value temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void UInt64Value::UnsafeArenaSwap(UInt64Value* other) {
@@ -1435,54 +1312,74 @@
   InternalSwap(other);
 }
 void UInt64Value::InternalSwap(UInt64Value* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata UInt64Value::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = UInt64Value_descriptor_;
+  metadata.reflection = UInt64Value_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// UInt64Value
+
+// optional uint64 value = 1;
+void UInt64Value::clear_value() {
+  value_ = GOOGLE_ULONGLONG(0);
+}
+ ::google::protobuf::uint64 UInt64Value::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UInt64Value.value)
+  return value_;
+}
+ void UInt64Value::set_value(::google::protobuf::uint64 value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.UInt64Value.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void Int32Value::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int Int32Value::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 Int32Value::Int32Value()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt32Value();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.Int32Value)
 }
+
 Int32Value::Int32Value(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt32Value();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.Int32Value)
 }
+
+void Int32Value::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 Int32Value::Int32Value(const Int32Value& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.Int32Value)
 }
 
 void Int32Value::SharedCtor() {
-  value_ = 0;
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = 0;
 }
 
 Int32Value::~Int32Value() {
@@ -1491,7 +1388,12 @@
 }
 
 void Int32Value::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void Int32Value::ArenaDtor(void* object) {
@@ -1506,27 +1408,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* Int32Value::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return Int32Value_descriptor_;
 }
 
 const Int32Value& Int32Value::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt32Value();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+Int32Value* Int32Value::default_instance_ = NULL;
+
 Int32Value* Int32Value::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<Int32Value>(arena);
 }
 
 void Int32Value::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.Int32Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = 0;
-  _internal_metadata_.Clear();
 }
 
 bool Int32Value::MergePartialFromCodedStream(
@@ -1535,31 +1434,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.Int32Value)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // int32 value = 1;
+      // optional int32 value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1576,68 +1476,47 @@
 void Int32Value::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.Int32Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int32 value = 1;
+  // optional int32 value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.Int32Value)
 }
 
-::google::protobuf::uint8* Int32Value::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* Int32Value::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Int32Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // int32 value = 1;
+  // optional int32 value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Int32Value)
   return target;
 }
 
-size_t Int32Value::ByteSizeLong() const {
+int Int32Value::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Int32Value)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // int32 value = 1;
+  // optional int32 value = 1;
   if (this->value() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::Int32Size(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void Int32Value::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Int32Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  const Int32Value* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const Int32Value* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const Int32Value>(
           &from);
   if (source == NULL) {
@@ -1651,11 +1530,7 @@
 
 void Int32Value::MergeFrom(const Int32Value& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Int32Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -1676,6 +1551,7 @@
 }
 
 bool Int32Value::IsInitialized() const {
+
   return true;
 }
 
@@ -1684,13 +1560,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    Int32Value* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    Int32Value temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void Int32Value::UnsafeArenaSwap(Int32Value* other) {
@@ -1699,54 +1572,74 @@
   InternalSwap(other);
 }
 void Int32Value::InternalSwap(Int32Value* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata Int32Value::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = Int32Value_descriptor_;
+  metadata.reflection = Int32Value_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// Int32Value
+
+// optional int32 value = 1;
+void Int32Value::clear_value() {
+  value_ = 0;
+}
+ ::google::protobuf::int32 Int32Value::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.Int32Value.value)
+  return value_;
+}
+ void Int32Value::set_value(::google::protobuf::int32 value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.Int32Value.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void UInt32Value::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int UInt32Value::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 UInt32Value::UInt32Value()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt32Value();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.UInt32Value)
 }
+
 UInt32Value::UInt32Value(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt32Value();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.UInt32Value)
 }
+
+void UInt32Value::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 UInt32Value::UInt32Value(const UInt32Value& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.UInt32Value)
 }
 
 void UInt32Value::SharedCtor() {
-  value_ = 0u;
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = 0u;
 }
 
 UInt32Value::~UInt32Value() {
@@ -1755,7 +1648,12 @@
 }
 
 void UInt32Value::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void UInt32Value::ArenaDtor(void* object) {
@@ -1770,27 +1668,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* UInt32Value::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return UInt32Value_descriptor_;
 }
 
 const UInt32Value& UInt32Value::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt32Value();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+UInt32Value* UInt32Value::default_instance_ = NULL;
+
 UInt32Value* UInt32Value::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<UInt32Value>(arena);
 }
 
 void UInt32Value::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.UInt32Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = 0u;
-  _internal_metadata_.Clear();
 }
 
 bool UInt32Value::MergePartialFromCodedStream(
@@ -1799,31 +1694,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.UInt32Value)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // uint32 value = 1;
+      // optional uint32 value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -1840,68 +1736,47 @@
 void UInt32Value::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.UInt32Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // uint32 value = 1;
+  // optional uint32 value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteUInt32(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.UInt32Value)
 }
 
-::google::protobuf::uint8* UInt32Value::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* UInt32Value::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UInt32Value)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // uint32 value = 1;
+  // optional uint32 value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UInt32Value)
   return target;
 }
 
-size_t UInt32Value::ByteSizeLong() const {
+int UInt32Value::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UInt32Value)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // uint32 value = 1;
+  // optional uint32 value = 1;
   if (this->value() != 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::UInt32Size(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void UInt32Value::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.UInt32Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  const UInt32Value* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const UInt32Value* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const UInt32Value>(
           &from);
   if (source == NULL) {
@@ -1915,11 +1790,7 @@
 
 void UInt32Value::MergeFrom(const UInt32Value& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UInt32Value)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -1940,6 +1811,7 @@
 }
 
 bool UInt32Value::IsInitialized() const {
+
   return true;
 }
 
@@ -1948,13 +1820,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    UInt32Value* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    UInt32Value temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void UInt32Value::UnsafeArenaSwap(UInt32Value* other) {
@@ -1963,54 +1832,74 @@
   InternalSwap(other);
 }
 void UInt32Value::InternalSwap(UInt32Value* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata UInt32Value::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = UInt32Value_descriptor_;
+  metadata.reflection = UInt32Value_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// UInt32Value
+
+// optional uint32 value = 1;
+void UInt32Value::clear_value() {
+  value_ = 0u;
+}
+ ::google::protobuf::uint32 UInt32Value::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.UInt32Value.value)
+  return value_;
+}
+ void UInt32Value::set_value(::google::protobuf::uint32 value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.UInt32Value.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void BoolValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int BoolValue::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 BoolValue::BoolValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBoolValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.BoolValue)
 }
+
 BoolValue::BoolValue(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBoolValue();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.BoolValue)
 }
+
+void BoolValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 BoolValue::BoolValue(const BoolValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_ = from.value_;
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.BoolValue)
 }
 
 void BoolValue::SharedCtor() {
-  value_ = false;
+    _is_default_instance_ = false;
   _cached_size_ = 0;
+  value_ = false;
 }
 
 BoolValue::~BoolValue() {
@@ -2019,7 +1908,12 @@
 }
 
 void BoolValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  if (this != default_instance_) {
+  }
 }
 
 void BoolValue::ArenaDtor(void* object) {
@@ -2034,27 +1928,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* BoolValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return BoolValue_descriptor_;
 }
 
 const BoolValue& BoolValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBoolValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+BoolValue* BoolValue::default_instance_ = NULL;
+
 BoolValue* BoolValue::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<BoolValue>(arena);
 }
 
 void BoolValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.BoolValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_ = false;
-  _internal_metadata_.Clear();
 }
 
 bool BoolValue::MergePartialFromCodedStream(
@@ -2063,31 +1954,32 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.BoolValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // bool value = 1;
+      // optional bool value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) {
-
+        if (tag == 8) {
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
                    bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
                  input, &value_)));
+
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -2104,66 +1996,45 @@
 void BoolValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.BoolValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // bool value = 1;
+  // optional bool value = 1;
   if (this->value() != 0) {
     ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.BoolValue)
 }
 
-::google::protobuf::uint8* BoolValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* BoolValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.BoolValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // bool value = 1;
+  // optional bool value = 1;
   if (this->value() != 0) {
     target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.BoolValue)
   return target;
 }
 
-size_t BoolValue::ByteSizeLong() const {
+int BoolValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.BoolValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // bool value = 1;
+  // optional bool value = 1;
   if (this->value() != 0) {
     total_size += 1 + 1;
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void BoolValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.BoolValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const BoolValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const BoolValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const BoolValue>(
           &from);
   if (source == NULL) {
@@ -2177,11 +2048,7 @@
 
 void BoolValue::MergeFrom(const BoolValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.BoolValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value() != 0) {
     set_value(from.value());
   }
@@ -2202,6 +2069,7 @@
 }
 
 bool BoolValue::IsInitialized() const {
+
   return true;
 }
 
@@ -2210,13 +2078,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    BoolValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    BoolValue temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void BoolValue::UnsafeArenaSwap(BoolValue* other) {
@@ -2225,58 +2090,75 @@
   InternalSwap(other);
 }
 void BoolValue::InternalSwap(BoolValue* other) {
-  using std::swap;
-  swap(value_, other->value_);
+  std::swap(value_, other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata BoolValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = BoolValue_descriptor_;
+  metadata.reflection = BoolValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// BoolValue
+
+// optional bool value = 1;
+void BoolValue::clear_value() {
+  value_ = false;
+}
+ bool BoolValue::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.BoolValue.value)
+  return value_;
+}
+ void BoolValue::set_value(bool value) {
+  
+  value_ = value;
+  // @@protoc_insertion_point(field_set:google.protobuf.BoolValue.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void StringValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int StringValue::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 StringValue::StringValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsStringValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.StringValue)
 }
+
 StringValue::StringValue(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsStringValue();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.StringValue)
 }
+
+void StringValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 StringValue::StringValue(const StringValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.value().size() > 0) {
-    value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.value(),
-      GetArenaNoVirtual());
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.StringValue)
 }
 
 void StringValue::SharedCtor() {
-  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
+  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 
 StringValue::~StringValue() {
@@ -2285,8 +2167,13 @@
 }
 
 void StringValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-  value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  value_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (this != default_instance_) {
+  }
 }
 
 void StringValue::ArenaDtor(void* object) {
@@ -2301,27 +2188,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* StringValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return StringValue_descriptor_;
 }
 
 const StringValue& StringValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsStringValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+StringValue* StringValue::default_instance_ = NULL;
+
 StringValue* StringValue::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<StringValue>(arena);
 }
 
 void StringValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.StringValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  _internal_metadata_.Clear();
 }
 
 bool StringValue::MergePartialFromCodedStream(
@@ -2330,33 +2214,34 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.StringValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // string value = 1;
+      // optional string value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
                 input, this->mutable_value()));
           DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-            this->value().data(), static_cast<int>(this->value().length()),
+            this->value().data(), this->value().length(),
             ::google::protobuf::internal::WireFormatLite::PARSE,
             "google.protobuf.StringValue.value"));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -2373,37 +2258,26 @@
 void StringValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.StringValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string value = 1;
+  // optional string value = 1;
   if (this->value().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->value().data(), static_cast<int>(this->value().length()),
+      this->value().data(), this->value().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.StringValue.value");
     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
       1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.StringValue)
 }
 
-::google::protobuf::uint8* StringValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* StringValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.StringValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // string value = 1;
+  // optional string value = 1;
   if (this->value().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
-      this->value().data(), static_cast<int>(this->value().length()),
+      this->value().data(), this->value().length(),
       ::google::protobuf::internal::WireFormatLite::SERIALIZE,
       "google.protobuf.StringValue.value");
     target =
@@ -2411,41 +2285,31 @@
         1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.StringValue)
   return target;
 }
 
-size_t StringValue::ByteSizeLong() const {
+int StringValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.StringValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // string value = 1;
+  // optional string value = 1;
   if (this->value().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::StringSize(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void StringValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.StringValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const StringValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const StringValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const StringValue>(
           &from);
   if (source == NULL) {
@@ -2459,11 +2323,7 @@
 
 void StringValue::MergeFrom(const StringValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.StringValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value().size() > 0) {
     set_value(from.value());
   }
@@ -2484,6 +2344,7 @@
 }
 
 bool StringValue::IsInitialized() const {
+
   return true;
 }
 
@@ -2492,13 +2353,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    StringValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    StringValue temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void StringValue::UnsafeArenaSwap(StringValue* other) {
@@ -2507,58 +2365,127 @@
   InternalSwap(other);
 }
 void StringValue::InternalSwap(StringValue* other) {
-  using std::swap;
   value_.Swap(&other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata StringValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = StringValue_descriptor_;
+  metadata.reflection = StringValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// StringValue
+
+// optional string value = 1;
+void StringValue::clear_value() {
+  value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+}
+ const ::std::string& StringValue::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.StringValue.value)
+  return value_.Get(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void StringValue::set_value(const ::std::string& value) {
+  
+  value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set:google.protobuf.StringValue.value)
+}
+ void StringValue::set_value(const char* value) {
+  
+  value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
+              GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set_char:google.protobuf.StringValue.value)
+}
+ void StringValue::set_value(const char* value,
+    size_t size) {
+  
+  value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
+      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.StringValue.value)
+}
+ ::std::string* StringValue::mutable_value() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.StringValue.value)
+  return value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+}
+ ::std::string* StringValue::release_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.StringValue.value)
+  
+  return value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+}
+ ::std::string* StringValue::unsafe_arena_release_value() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.StringValue.value)
+  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
+  
+  return value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      GetArenaNoVirtual());
+}
+ void StringValue::set_allocated_value(::std::string* value) {
+  if (value != NULL) {
+    
+  } else {
+    
+  }
+  value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value,
+      GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.StringValue.value)
+}
+ void StringValue::unsafe_arena_set_allocated_value(
+    ::std::string* value) {
+  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
+  if (value != NULL) {
+    
+  } else {
+    
+  }
+  value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      value, GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.StringValue.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // ===================================================================
 
-void BytesValue::InitAsDefaultInstance() {
-}
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int BytesValue::kValueFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 BytesValue::BytesValue()
   : ::google::protobuf::Message(), _internal_metadata_(NULL) {
-  if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
-    ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBytesValue();
-  }
   SharedCtor();
   // @@protoc_insertion_point(constructor:google.protobuf.BytesValue)
 }
+
 BytesValue::BytesValue(::google::protobuf::Arena* arena)
   : ::google::protobuf::Message(),
   _internal_metadata_(arena) {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBytesValue();
   SharedCtor();
   RegisterArenaDtor(arena);
   // @@protoc_insertion_point(arena_constructor:google.protobuf.BytesValue)
 }
+
+void BytesValue::InitAsDefaultInstance() {
+  _is_default_instance_ = true;
+}
+
 BytesValue::BytesValue(const BytesValue& from)
   : ::google::protobuf::Message(),
-      _internal_metadata_(NULL),
-      _cached_size_(0) {
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  if (from.value().size() > 0) {
-    value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.value(),
-      GetArenaNoVirtual());
-  }
+    _internal_metadata_(NULL) {
+  SharedCtor();
+  MergeFrom(from);
   // @@protoc_insertion_point(copy_constructor:google.protobuf.BytesValue)
 }
 
 void BytesValue::SharedCtor() {
-  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+    _is_default_instance_ = false;
+  ::google::protobuf::internal::GetEmptyString();
   _cached_size_ = 0;
+  value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 
 BytesValue::~BytesValue() {
@@ -2567,8 +2494,13 @@
 }
 
 void BytesValue::SharedDtor() {
-  GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);
-  value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() != NULL) {
+    return;
+  }
+
+  value_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+  if (this != default_instance_) {
+  }
 }
 
 void BytesValue::ArenaDtor(void* object) {
@@ -2583,27 +2515,24 @@
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
 }
 const ::google::protobuf::Descriptor* BytesValue::descriptor() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+  protobuf_AssignDescriptorsOnce();
+  return BytesValue_descriptor_;
 }
 
 const BytesValue& BytesValue::default_instance() {
-  ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBytesValue();
-  return *internal_default_instance();
+  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  return *default_instance_;
 }
 
+BytesValue* BytesValue::default_instance_ = NULL;
+
 BytesValue* BytesValue::New(::google::protobuf::Arena* arena) const {
   return ::google::protobuf::Arena::CreateMessage<BytesValue>(arena);
 }
 
 void BytesValue::Clear() {
 // @@protoc_insertion_point(message_clear_start:google.protobuf.BytesValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  // Prevent compiler warnings about cached_has_bits being unused
-  (void) cached_has_bits;
-
   value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
-  _internal_metadata_.Clear();
 }
 
 bool BytesValue::MergePartialFromCodedStream(
@@ -2612,29 +2541,30 @@
   ::google::protobuf::uint32 tag;
   // @@protoc_insertion_point(parse_start:google.protobuf.BytesValue)
   for (;;) {
-    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
     tag = p.first;
     if (!p.second) goto handle_unusual;
     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
-      // bytes value = 1;
+      // optional bytes value = 1;
       case 1: {
-        if (static_cast< ::google::protobuf::uint8>(tag) ==
-            static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) {
+        if (tag == 10) {
           DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
                 input, this->mutable_value()));
         } else {
           goto handle_unusual;
         }
+        if (input->ExpectAtEnd()) goto success;
         break;
       }
 
       default: {
       handle_unusual:
-        if (tag == 0) {
+        if (tag == 0 ||
+            ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
           goto success;
         }
-        DO_(::google::protobuf::internal::WireFormat::SkipField(
-              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
         break;
       }
     }
@@ -2651,71 +2581,50 @@
 void BytesValue::SerializeWithCachedSizes(
     ::google::protobuf::io::CodedOutputStream* output) const {
   // @@protoc_insertion_point(serialize_start:google.protobuf.BytesValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // bytes value = 1;
+  // optional bytes value = 1;
   if (this->value().size() > 0) {
     ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(
       1, this->value(), output);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), output);
-  }
   // @@protoc_insertion_point(serialize_end:google.protobuf.BytesValue)
 }
 
-::google::protobuf::uint8* BytesValue::InternalSerializeWithCachedSizesToArray(
-    bool deterministic, ::google::protobuf::uint8* target) const {
-  (void)deterministic; // Unused
+::google::protobuf::uint8* BytesValue::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
   // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.BytesValue)
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
-  // bytes value = 1;
+  // optional bytes value = 1;
   if (this->value().size() > 0) {
     target =
       ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(
         1, this->value(), target);
   }
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()), target);
-  }
   // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.BytesValue)
   return target;
 }
 
-size_t BytesValue::ByteSizeLong() const {
+int BytesValue::ByteSize() const {
 // @@protoc_insertion_point(message_byte_size_start:google.protobuf.BytesValue)
-  size_t total_size = 0;
+  int total_size = 0;
 
-  if ((_internal_metadata_.have_unknown_fields() &&  ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
-    total_size +=
-      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
-        (::google::protobuf::internal::GetProto3PreserveUnknownsDefault()   ? _internal_metadata_.unknown_fields()   : _internal_metadata_.default_instance()));
-  }
-  // bytes value = 1;
+  // optional bytes value = 1;
   if (this->value().size() > 0) {
     total_size += 1 +
       ::google::protobuf::internal::WireFormatLite::BytesSize(
         this->value());
   }
 
-  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
-  _cached_size_ = cached_size;
+  _cached_size_ = total_size;
   GOOGLE_SAFE_CONCURRENT_WRITES_END();
   return total_size;
 }
 
 void BytesValue::MergeFrom(const ::google::protobuf::Message& from) {
 // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.BytesValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  const BytesValue* source =
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
+  const BytesValue* source = 
       ::google::protobuf::internal::DynamicCastToGenerated<const BytesValue>(
           &from);
   if (source == NULL) {
@@ -2729,11 +2638,7 @@
 
 void BytesValue::MergeFrom(const BytesValue& from) {
 // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.BytesValue)
-  GOOGLE_DCHECK_NE(&from, this);
-  _internal_metadata_.MergeFrom(from._internal_metadata_);
-  ::google::protobuf::uint32 cached_has_bits = 0;
-  (void) cached_has_bits;
-
+  if (GOOGLE_PREDICT_FALSE(&from == this)) MergeFromFail(__LINE__);
   if (from.value().size() > 0) {
     set_value(from.value());
   }
@@ -2754,6 +2659,7 @@
 }
 
 bool BytesValue::IsInitialized() const {
+
   return true;
 }
 
@@ -2762,13 +2668,10 @@
   if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
     InternalSwap(other);
   } else {
-    BytesValue* temp = New(GetArenaNoVirtual());
-    temp->MergeFrom(*other);
-    other->CopyFrom(*this);
-    InternalSwap(temp);
-    if (GetArenaNoVirtual() == NULL) {
-      delete temp;
-    }
+    BytesValue temp;
+    temp.MergeFrom(*this);
+    CopyFrom(*other);
+    other->CopyFrom(temp);
   }
 }
 void BytesValue::UnsafeArenaSwap(BytesValue* other) {
@@ -2777,19 +2680,92 @@
   InternalSwap(other);
 }
 void BytesValue::InternalSwap(BytesValue* other) {
-  using std::swap;
   value_.Swap(&other->value_);
   _internal_metadata_.Swap(&other->_internal_metadata_);
-  swap(_cached_size_, other->_cached_size_);
+  std::swap(_cached_size_, other->_cached_size_);
 }
 
 ::google::protobuf::Metadata BytesValue::GetMetadata() const {
-  protobuf_google_2fprotobuf_2fwrappers_2eproto::protobuf_AssignDescriptorsOnce();
-  return ::protobuf_google_2fprotobuf_2fwrappers_2eproto::file_level_metadata[kIndexInFileMessages];
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = BytesValue_descriptor_;
+  metadata.reflection = BytesValue_reflection_;
+  return metadata;
 }
 
+#if PROTOBUF_INLINE_NOT_IN_HEADERS
+// BytesValue
+
+// optional bytes value = 1;
+void BytesValue::clear_value() {
+  value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+}
+ const ::std::string& BytesValue::value() const {
+  // @@protoc_insertion_point(field_get:google.protobuf.BytesValue.value)
+  return value_.Get(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+ void BytesValue::set_value(const ::std::string& value) {
+  
+  value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set:google.protobuf.BytesValue.value)
+}
+ void BytesValue::set_value(const char* value) {
+  
+  value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
+              GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set_char:google.protobuf.BytesValue.value)
+}
+ void BytesValue::set_value(const void* value,
+    size_t size) {
+  
+  value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(
+      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set_pointer:google.protobuf.BytesValue.value)
+}
+ ::std::string* BytesValue::mutable_value() {
+  
+  // @@protoc_insertion_point(field_mutable:google.protobuf.BytesValue.value)
+  return value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+}
+ ::std::string* BytesValue::release_value() {
+  // @@protoc_insertion_point(field_release:google.protobuf.BytesValue.value)
+  
+  return value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
+}
+ ::std::string* BytesValue::unsafe_arena_release_value() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.BytesValue.value)
+  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
+  
+  return value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      GetArenaNoVirtual());
+}
+ void BytesValue::set_allocated_value(::std::string* value) {
+  if (value != NULL) {
+    
+  } else {
+    
+  }
+  value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value,
+      GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_set_allocated:google.protobuf.BytesValue.value)
+}
+ void BytesValue::unsafe_arena_set_allocated_value(
+    ::std::string* value) {
+  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
+  if (value != NULL) {
+    
+  } else {
+    
+  }
+  value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      value, GetArenaNoVirtual());
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.BytesValue.value)
+}
+
+#endif  // PROTOBUF_INLINE_NOT_IN_HEADERS
 
 // @@protoc_insertion_point(namespace_scope)
+
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/wrappers.pb.h b/src/google/protobuf/wrappers.pb.h
index a2f10c8..1078477 100644
--- a/src/google/protobuf/wrappers.pb.h
+++ b/src/google/protobuf/wrappers.pb.h
@@ -8,107 +8,48 @@
 
 #include <google/protobuf/stubs/common.h>
 
-#if GOOGLE_PROTOBUF_VERSION < 3005000
+#if GOOGLE_PROTOBUF_VERSION < 3000000
 #error This file was generated by a newer version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please update
 #error your headers.
 #endif
-#if 3005001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
 #error This file was generated by an older version of protoc which is
 #error incompatible with your Protocol Buffer headers.  Please
 #error regenerate this file with a newer version of protoc.
 #endif
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/arena.h>
 #include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_table_driven.h>
 #include <google/protobuf/generated_message_util.h>
 #include <google/protobuf/metadata.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
-#include <google/protobuf/extension_set.h>  // IWYU pragma: export
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
 #include <google/protobuf/unknown_field_set.h>
 // @@protoc_insertion_point(includes)
 
-namespace protobuf_google_2fprotobuf_2fwrappers_2eproto {
-// Internal implementation detail -- do not use these members.
-struct LIBPROTOBUF_EXPORT TableStruct {
-  static const ::google::protobuf::internal::ParseTableField entries[];
-  static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
-  static const ::google::protobuf::internal::ParseTable schema[9];
-  static const ::google::protobuf::internal::FieldMetadata field_metadata[];
-  static const ::google::protobuf::internal::SerializationTable serialization_table[];
-  static const ::google::protobuf::uint32 offsets[];
-};
-void LIBPROTOBUF_EXPORT AddDescriptors();
-void LIBPROTOBUF_EXPORT InitDefaultsDoubleValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsDoubleValue();
-void LIBPROTOBUF_EXPORT InitDefaultsFloatValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsFloatValue();
-void LIBPROTOBUF_EXPORT InitDefaultsInt64ValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsInt64Value();
-void LIBPROTOBUF_EXPORT InitDefaultsUInt64ValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsUInt64Value();
-void LIBPROTOBUF_EXPORT InitDefaultsInt32ValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsInt32Value();
-void LIBPROTOBUF_EXPORT InitDefaultsUInt32ValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsUInt32Value();
-void LIBPROTOBUF_EXPORT InitDefaultsBoolValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsBoolValue();
-void LIBPROTOBUF_EXPORT InitDefaultsStringValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsStringValue();
-void LIBPROTOBUF_EXPORT InitDefaultsBytesValueImpl();
-void LIBPROTOBUF_EXPORT InitDefaultsBytesValue();
-inline void LIBPROTOBUF_EXPORT InitDefaults() {
-  InitDefaultsDoubleValue();
-  InitDefaultsFloatValue();
-  InitDefaultsInt64Value();
-  InitDefaultsUInt64Value();
-  InitDefaultsInt32Value();
-  InitDefaultsUInt32Value();
-  InitDefaultsBoolValue();
-  InitDefaultsStringValue();
-  InitDefaultsBytesValue();
-}
-}  // namespace protobuf_google_2fprotobuf_2fwrappers_2eproto
 namespace google {
 namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
 class BoolValue;
-class BoolValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern BoolValueDefaultTypeInternal _BoolValue_default_instance_;
 class BytesValue;
-class BytesValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern BytesValueDefaultTypeInternal _BytesValue_default_instance_;
 class DoubleValue;
-class DoubleValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern DoubleValueDefaultTypeInternal _DoubleValue_default_instance_;
 class FloatValue;
-class FloatValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern FloatValueDefaultTypeInternal _FloatValue_default_instance_;
 class Int32Value;
-class Int32ValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern Int32ValueDefaultTypeInternal _Int32Value_default_instance_;
 class Int64Value;
-class Int64ValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern Int64ValueDefaultTypeInternal _Int64Value_default_instance_;
 class StringValue;
-class StringValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern StringValueDefaultTypeInternal _StringValue_default_instance_;
 class UInt32Value;
-class UInt32ValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern UInt32ValueDefaultTypeInternal _UInt32Value_default_instance_;
 class UInt64Value;
-class UInt64ValueDefaultTypeInternal;
-LIBPROTOBUF_EXPORT extern UInt64ValueDefaultTypeInternal _UInt64Value_default_instance_;
-}  // namespace protobuf
-}  // namespace google
-namespace google {
-namespace protobuf {
 
 // ===================================================================
 
-class LIBPROTOBUF_EXPORT DoubleValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DoubleValue) */ {
+class LIBPROTOBUF_EXPORT DoubleValue : public ::google::protobuf::Message {
  public:
   DoubleValue();
   virtual ~DoubleValue();
@@ -119,68 +60,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  DoubleValue(DoubleValue&& from) noexcept
-    : DoubleValue() {
-    *this = ::std::move(from);
-  }
 
-  inline DoubleValue& operator=(DoubleValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const DoubleValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const DoubleValue* internal_default_instance() {
-    return reinterpret_cast<const DoubleValue*>(
-               &_DoubleValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    0;
-
   void UnsafeArenaSwap(DoubleValue* other);
   void Swap(DoubleValue* other);
-  friend void swap(DoubleValue& a, DoubleValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline DoubleValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline DoubleValue* New() const { return New(NULL); }
 
-  DoubleValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  DoubleValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const DoubleValue& from);
   void MergeFrom(const DoubleValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(DoubleValue* other);
   protected:
   explicit DoubleValue(::google::protobuf::Arena* arena);
@@ -196,13 +109,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // double value = 1;
+  // optional double value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   double value() const;
@@ -212,17 +125,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   double value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsDoubleValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static DoubleValue* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT FloatValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FloatValue) */ {
+class LIBPROTOBUF_EXPORT FloatValue : public ::google::protobuf::Message {
  public:
   FloatValue();
   virtual ~FloatValue();
@@ -233,68 +151,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  FloatValue(FloatValue&& from) noexcept
-    : FloatValue() {
-    *this = ::std::move(from);
-  }
 
-  inline FloatValue& operator=(FloatValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const FloatValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const FloatValue* internal_default_instance() {
-    return reinterpret_cast<const FloatValue*>(
-               &_FloatValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    1;
-
   void UnsafeArenaSwap(FloatValue* other);
   void Swap(FloatValue* other);
-  friend void swap(FloatValue& a, FloatValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline FloatValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline FloatValue* New() const { return New(NULL); }
 
-  FloatValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  FloatValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const FloatValue& from);
   void MergeFrom(const FloatValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(FloatValue* other);
   protected:
   explicit FloatValue(::google::protobuf::Arena* arena);
@@ -310,13 +200,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // float value = 1;
+  // optional float value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   float value() const;
@@ -326,17 +216,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   float value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsFloatValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static FloatValue* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Int64Value : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Int64Value) */ {
+class LIBPROTOBUF_EXPORT Int64Value : public ::google::protobuf::Message {
  public:
   Int64Value();
   virtual ~Int64Value();
@@ -347,68 +242,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Int64Value(Int64Value&& from) noexcept
-    : Int64Value() {
-    *this = ::std::move(from);
-  }
 
-  inline Int64Value& operator=(Int64Value&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Int64Value& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Int64Value* internal_default_instance() {
-    return reinterpret_cast<const Int64Value*>(
-               &_Int64Value_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    2;
-
   void UnsafeArenaSwap(Int64Value* other);
   void Swap(Int64Value* other);
-  friend void swap(Int64Value& a, Int64Value& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Int64Value* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Int64Value* New() const { return New(NULL); }
 
-  Int64Value* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Int64Value* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Int64Value& from);
   void MergeFrom(const Int64Value& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Int64Value* other);
   protected:
   explicit Int64Value(::google::protobuf::Arena* arena);
@@ -424,13 +291,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // int64 value = 1;
+  // optional int64 value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   ::google::protobuf::int64 value() const;
@@ -440,17 +307,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::int64 value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt64ValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static Int64Value* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT UInt64Value : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UInt64Value) */ {
+class LIBPROTOBUF_EXPORT UInt64Value : public ::google::protobuf::Message {
  public:
   UInt64Value();
   virtual ~UInt64Value();
@@ -461,68 +333,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  UInt64Value(UInt64Value&& from) noexcept
-    : UInt64Value() {
-    *this = ::std::move(from);
-  }
 
-  inline UInt64Value& operator=(UInt64Value&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const UInt64Value& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const UInt64Value* internal_default_instance() {
-    return reinterpret_cast<const UInt64Value*>(
-               &_UInt64Value_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    3;
-
   void UnsafeArenaSwap(UInt64Value* other);
   void Swap(UInt64Value* other);
-  friend void swap(UInt64Value& a, UInt64Value& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline UInt64Value* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline UInt64Value* New() const { return New(NULL); }
 
-  UInt64Value* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  UInt64Value* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const UInt64Value& from);
   void MergeFrom(const UInt64Value& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(UInt64Value* other);
   protected:
   explicit UInt64Value(::google::protobuf::Arena* arena);
@@ -538,13 +382,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // uint64 value = 1;
+  // optional uint64 value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   ::google::protobuf::uint64 value() const;
@@ -554,17 +398,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::uint64 value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt64ValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static UInt64Value* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT Int32Value : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Int32Value) */ {
+class LIBPROTOBUF_EXPORT Int32Value : public ::google::protobuf::Message {
  public:
   Int32Value();
   virtual ~Int32Value();
@@ -575,68 +424,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  Int32Value(Int32Value&& from) noexcept
-    : Int32Value() {
-    *this = ::std::move(from);
-  }
 
-  inline Int32Value& operator=(Int32Value&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const Int32Value& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const Int32Value* internal_default_instance() {
-    return reinterpret_cast<const Int32Value*>(
-               &_Int32Value_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    4;
-
   void UnsafeArenaSwap(Int32Value* other);
   void Swap(Int32Value* other);
-  friend void swap(Int32Value& a, Int32Value& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline Int32Value* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline Int32Value* New() const { return New(NULL); }
 
-  Int32Value* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  Int32Value* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const Int32Value& from);
   void MergeFrom(const Int32Value& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(Int32Value* other);
   protected:
   explicit Int32Value(::google::protobuf::Arena* arena);
@@ -652,13 +473,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // int32 value = 1;
+  // optional int32 value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   ::google::protobuf::int32 value() const;
@@ -668,17 +489,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::int32 value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsInt32ValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static Int32Value* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT UInt32Value : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UInt32Value) */ {
+class LIBPROTOBUF_EXPORT UInt32Value : public ::google::protobuf::Message {
  public:
   UInt32Value();
   virtual ~UInt32Value();
@@ -689,68 +515,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  UInt32Value(UInt32Value&& from) noexcept
-    : UInt32Value() {
-    *this = ::std::move(from);
-  }
 
-  inline UInt32Value& operator=(UInt32Value&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const UInt32Value& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const UInt32Value* internal_default_instance() {
-    return reinterpret_cast<const UInt32Value*>(
-               &_UInt32Value_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    5;
-
   void UnsafeArenaSwap(UInt32Value* other);
   void Swap(UInt32Value* other);
-  friend void swap(UInt32Value& a, UInt32Value& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline UInt32Value* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline UInt32Value* New() const { return New(NULL); }
 
-  UInt32Value* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  UInt32Value* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const UInt32Value& from);
   void MergeFrom(const UInt32Value& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(UInt32Value* other);
   protected:
   explicit UInt32Value(::google::protobuf::Arena* arena);
@@ -766,13 +564,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // uint32 value = 1;
+  // optional uint32 value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   ::google::protobuf::uint32 value() const;
@@ -782,17 +580,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::uint32 value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsUInt32ValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static UInt32Value* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT BoolValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.BoolValue) */ {
+class LIBPROTOBUF_EXPORT BoolValue : public ::google::protobuf::Message {
  public:
   BoolValue();
   virtual ~BoolValue();
@@ -803,68 +606,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  BoolValue(BoolValue&& from) noexcept
-    : BoolValue() {
-    *this = ::std::move(from);
-  }
 
-  inline BoolValue& operator=(BoolValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const BoolValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const BoolValue* internal_default_instance() {
-    return reinterpret_cast<const BoolValue*>(
-               &_BoolValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    6;
-
   void UnsafeArenaSwap(BoolValue* other);
   void Swap(BoolValue* other);
-  friend void swap(BoolValue& a, BoolValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline BoolValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline BoolValue* New() const { return New(NULL); }
 
-  BoolValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  BoolValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const BoolValue& from);
   void MergeFrom(const BoolValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(BoolValue* other);
   protected:
   explicit BoolValue(::google::protobuf::Arena* arena);
@@ -880,13 +655,13 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // bool value = 1;
+  // optional bool value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   bool value() const;
@@ -896,17 +671,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   bool value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBoolValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static BoolValue* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT StringValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.StringValue) */ {
+class LIBPROTOBUF_EXPORT StringValue : public ::google::protobuf::Message {
  public:
   StringValue();
   virtual ~StringValue();
@@ -917,68 +697,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  StringValue(StringValue&& from) noexcept
-    : StringValue() {
-    *this = ::std::move(from);
-  }
 
-  inline StringValue& operator=(StringValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const StringValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const StringValue* internal_default_instance() {
-    return reinterpret_cast<const StringValue*>(
-               &_StringValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    7;
-
   void UnsafeArenaSwap(StringValue* other);
   void Swap(StringValue* other);
-  friend void swap(StringValue& a, StringValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline StringValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline StringValue* New() const { return New(NULL); }
 
-  StringValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  StringValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const StringValue& from);
   void MergeFrom(const StringValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(StringValue* other);
   protected:
   explicit StringValue(::google::protobuf::Arena* arena);
@@ -994,32 +746,23 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // string value = 1;
+  // optional string value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   const ::std::string& value() const;
   void set_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_value(::std::string&& value);
-  #endif
   void set_value(const char* value);
   void set_value(const char* value, size_t size);
   ::std::string* mutable_value();
   ::std::string* release_value();
   void set_allocated_value(::std::string* value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
   ::std::string* unsafe_arena_release_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
   void unsafe_arena_set_allocated_value(
       ::std::string* value);
 
@@ -1027,17 +770,22 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsStringValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static StringValue* default_instance_;
 };
 // -------------------------------------------------------------------
 
-class LIBPROTOBUF_EXPORT BytesValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.BytesValue) */ {
+class LIBPROTOBUF_EXPORT BytesValue : public ::google::protobuf::Message {
  public:
   BytesValue();
   virtual ~BytesValue();
@@ -1048,68 +796,40 @@
     CopyFrom(from);
     return *this;
   }
-  #if LANG_CXX11
-  BytesValue(BytesValue&& from) noexcept
-    : BytesValue() {
-    *this = ::std::move(from);
-  }
 
-  inline BytesValue& operator=(BytesValue&& from) noexcept {
-    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
-      if (this != &from) InternalSwap(&from);
-    } else {
-      CopyFrom(from);
-    }
-    return *this;
-  }
-  #endif
-  inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {
-    return GetArenaNoVirtual();
-  }
-  inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {
+  inline ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); }
+  inline void* GetMaybeArenaPointer() const {
     return MaybeArenaPtr();
   }
   static const ::google::protobuf::Descriptor* descriptor();
   static const BytesValue& default_instance();
 
-  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
-  static inline const BytesValue* internal_default_instance() {
-    return reinterpret_cast<const BytesValue*>(
-               &_BytesValue_default_instance_);
-  }
-  static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
-    8;
-
   void UnsafeArenaSwap(BytesValue* other);
   void Swap(BytesValue* other);
-  friend void swap(BytesValue& a, BytesValue& b) {
-    a.Swap(&b);
-  }
 
   // implements Message ----------------------------------------------
 
-  inline BytesValue* New() const PROTOBUF_FINAL { return New(NULL); }
+  inline BytesValue* New() const { return New(NULL); }
 
-  BytesValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
-  void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
-  void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+  BytesValue* New(::google::protobuf::Arena* arena) const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
   void CopyFrom(const BytesValue& from);
   void MergeFrom(const BytesValue& from);
-  void Clear() PROTOBUF_FINAL;
-  bool IsInitialized() const PROTOBUF_FINAL;
+  void Clear();
+  bool IsInitialized() const;
 
-  size_t ByteSizeLong() const PROTOBUF_FINAL;
+  int ByteSize() const;
   bool MergePartialFromCodedStream(
-      ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+      ::google::protobuf::io::CodedInputStream* input);
   void SerializeWithCachedSizes(
-      ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
-  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
-      bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
-  int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
   private:
   void SharedCtor();
   void SharedDtor();
-  void SetCachedSize(int size) const PROTOBUF_FINAL;
+  void SetCachedSize(int size) const;
   void InternalSwap(BytesValue* other);
   protected:
   explicit BytesValue(::google::protobuf::Arena* arena);
@@ -1125,32 +845,23 @@
   }
   public:
 
-  ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+  ::google::protobuf::Metadata GetMetadata() const;
 
   // nested types ----------------------------------------------------
 
   // accessors -------------------------------------------------------
 
-  // bytes value = 1;
+  // optional bytes value = 1;
   void clear_value();
   static const int kValueFieldNumber = 1;
   const ::std::string& value() const;
   void set_value(const ::std::string& value);
-  #if LANG_CXX11
-  void set_value(::std::string&& value);
-  #endif
   void set_value(const char* value);
   void set_value(const void* value, size_t size);
   ::std::string* mutable_value();
   ::std::string* release_value();
   void set_allocated_value(::std::string* value);
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
   ::std::string* unsafe_arena_release_value();
-  PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for"
-  "    string fields are deprecated and will be removed in a"
-  "    future release.")
   void unsafe_arena_set_allocated_value(
       ::std::string* value);
 
@@ -1158,26 +869,28 @@
  private:
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
-  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
+  friend class ::google::protobuf::Arena;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
+  bool _is_default_instance_;
   ::google::protobuf::internal::ArenaStringPtr value_;
   mutable int _cached_size_;
-  friend struct ::protobuf_google_2fprotobuf_2fwrappers_2eproto::TableStruct;
-  friend void ::protobuf_google_2fprotobuf_2fwrappers_2eproto::InitDefaultsBytesValueImpl();
+  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_AssignDesc_google_2fprotobuf_2fwrappers_2eproto();
+  friend void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto();
+
+  void InitAsDefaultInstance();
+  static BytesValue* default_instance_;
 };
 // ===================================================================
 
 
 // ===================================================================
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#endif  // __GNUC__
+#if !PROTOBUF_INLINE_NOT_IN_HEADERS
 // DoubleValue
 
-// double value = 1;
+// optional double value = 1;
 inline void DoubleValue::clear_value() {
   value_ = 0;
 }
@@ -1195,7 +908,7 @@
 
 // FloatValue
 
-// float value = 1;
+// optional float value = 1;
 inline void FloatValue::clear_value() {
   value_ = 0;
 }
@@ -1213,7 +926,7 @@
 
 // Int64Value
 
-// int64 value = 1;
+// optional int64 value = 1;
 inline void Int64Value::clear_value() {
   value_ = GOOGLE_LONGLONG(0);
 }
@@ -1231,7 +944,7 @@
 
 // UInt64Value
 
-// uint64 value = 1;
+// optional uint64 value = 1;
 inline void UInt64Value::clear_value() {
   value_ = GOOGLE_ULONGLONG(0);
 }
@@ -1249,7 +962,7 @@
 
 // Int32Value
 
-// int32 value = 1;
+// optional int32 value = 1;
 inline void Int32Value::clear_value() {
   value_ = 0;
 }
@@ -1267,7 +980,7 @@
 
 // UInt32Value
 
-// uint32 value = 1;
+// optional uint32 value = 1;
 inline void UInt32Value::clear_value() {
   value_ = 0u;
 }
@@ -1285,7 +998,7 @@
 
 // BoolValue
 
-// bool value = 1;
+// optional bool value = 1;
 inline void BoolValue::clear_value() {
   value_ = false;
 }
@@ -1303,29 +1016,20 @@
 
 // StringValue
 
-// string value = 1;
+// optional string value = 1;
 inline void StringValue::clear_value() {
   value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
 }
 inline const ::std::string& StringValue::value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.StringValue.value)
-  return value_.Get();
+  return value_.Get(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void StringValue::set_value(const ::std::string& value) {
   
   value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
   // @@protoc_insertion_point(field_set:google.protobuf.StringValue.value)
 }
-#if LANG_CXX11
-inline void StringValue::set_value(::std::string&& value) {
-  
-  value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.StringValue.value)
-}
-#endif
 inline void StringValue::set_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
               GetArenaNoVirtual());
@@ -1348,6 +1052,13 @@
   
   return value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
 }
+inline ::std::string* StringValue::unsafe_arena_release_value() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.StringValue.value)
+  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
+  
+  return value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      GetArenaNoVirtual());
+}
 inline void StringValue::set_allocated_value(::std::string* value) {
   if (value != NULL) {
     
@@ -1358,13 +1069,6 @@
       GetArenaNoVirtual());
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.StringValue.value)
 }
-inline ::std::string* StringValue::unsafe_arena_release_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.StringValue.value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
 inline void StringValue::unsafe_arena_set_allocated_value(
     ::std::string* value) {
   GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
@@ -1382,29 +1086,20 @@
 
 // BytesValue
 
-// bytes value = 1;
+// optional bytes value = 1;
 inline void BytesValue::clear_value() {
   value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
 }
 inline const ::std::string& BytesValue::value() const {
   // @@protoc_insertion_point(field_get:google.protobuf.BytesValue.value)
-  return value_.Get();
+  return value_.Get(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
 }
 inline void BytesValue::set_value(const ::std::string& value) {
   
   value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual());
   // @@protoc_insertion_point(field_set:google.protobuf.BytesValue.value)
 }
-#if LANG_CXX11
-inline void BytesValue::set_value(::std::string&& value) {
-  
-  value_.Set(
-    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual());
-  // @@protoc_insertion_point(field_set_rvalue:google.protobuf.BytesValue.value)
-}
-#endif
 inline void BytesValue::set_value(const char* value) {
-  GOOGLE_DCHECK(value != NULL);
   
   value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
               GetArenaNoVirtual());
@@ -1427,6 +1122,13 @@
   
   return value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual());
 }
+inline ::std::string* BytesValue::unsafe_arena_release_value() {
+  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.BytesValue.value)
+  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
+  
+  return value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      GetArenaNoVirtual());
+}
 inline void BytesValue::set_allocated_value(::std::string* value) {
   if (value != NULL) {
     
@@ -1437,13 +1139,6 @@
       GetArenaNoVirtual());
   // @@protoc_insertion_point(field_set_allocated:google.protobuf.BytesValue.value)
 }
-inline ::std::string* BytesValue::unsafe_arena_release_value() {
-  // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.BytesValue.value)
-  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
-  
-  return value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
-      GetArenaNoVirtual());
-}
 inline void BytesValue::unsafe_arena_set_allocated_value(
     ::std::string* value) {
   GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);
@@ -1457,9 +1152,7 @@
   // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.BytesValue.value)
 }
 
-#ifdef __GNUC__
-  #pragma GCC diagnostic pop
-#endif  // __GNUC__
+#endif  // !PROTOBUF_INLINE_NOT_IN_HEADERS
 // -------------------------------------------------------------------
 
 // -------------------------------------------------------------------
diff --git a/src/google/protobuf/wrappers.proto b/src/google/protobuf/wrappers.proto
index 0194763..4828ad9 100644
--- a/src/google/protobuf/wrappers.proto
+++ b/src/google/protobuf/wrappers.proto
@@ -43,6 +43,7 @@
 option java_package = "com.google.protobuf";
 option java_outer_classname = "WrappersProto";
 option java_multiple_files = true;
+option java_generate_equals_and_hash = true;
 option objc_class_prefix = "GPB";
 
 // Wrapper message for `double`.
diff --git a/src/libprotobuf-lite.map b/src/libprotobuf-lite.map
deleted file mode 100644
index 3915546..0000000
--- a/src/libprotobuf-lite.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  global:
-    extern "C++" {
-      *google*;
-    };
-
-  local:
-    *;
-};
diff --git a/src/libprotobuf.map b/src/libprotobuf.map
deleted file mode 100644
index 3915546..0000000
--- a/src/libprotobuf.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  global:
-    extern "C++" {
-      *google*;
-    };
-
-  local:
-    *;
-};
diff --git a/src/libprotoc.map b/src/libprotoc.map
deleted file mode 100644
index 3915546..0000000
--- a/src/libprotoc.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  global:
-    extern "C++" {
-      *google*;
-    };
-
-  local:
-    *;
-};
diff --git a/tests.sh b/tests.sh
index 6303f10..6a9439a 100755
--- a/tests.sh
+++ b/tests.sh
@@ -28,8 +28,7 @@
   fi
 
   ./autogen.sh
-  ./configure CXXFLAGS="-fPIC"  # -fPIC is needed for python cpp test.
-                                # See python/setup.py for more details
+  ./configure
   make -j2
 }
 
@@ -38,51 +37,13 @@
   make check -j2
   cd conformance && make test_cpp && cd ..
 
-  # The benchmark code depends on cmake, so test if it is installed before
-  # trying to do the build.
-  # NOTE: The travis macOS images say they have cmake, but the xcode8.1 image
-  # appears to be missing it: https://github.com/travis-ci/travis-ci/issues/6996
-  if [[ $(type cmake 2>/dev/null) ]]; then
-    # Verify benchmarking code can build successfully.
-    git submodule init
-    git submodule update
-    cd third_party/benchmark && cmake -DCMAKE_BUILD_TYPE=Release && make && cd ../..
-    cd benchmarks && make && ./generate-datasets && cd ..
-  else
-    echo ""
-    echo "WARNING: Skipping validation of the bench marking code, cmake isn't installed."
-    echo ""
-  fi
+  # Verify benchmarking code can build successfully.
+  cd benchmarks && make && ./generate-datasets && cd ..
 }
 
 build_cpp_distcheck() {
   ./autogen.sh
   ./configure
-  make dist
-
-  # List all files that should be included in the distribution package.
-  git ls-files | grep "^\(java\|python\|objectivec\|csharp\|js\|ruby\|php\|cmake\|examples\|src/google/protobuf/.*\.proto\)" |\
-    grep -v ".gitignore" | grep -v "java/compatibility_tests" |\
-    grep -v "python/compatibility_tests" | grep -v "csharp/compatibility_tests" > dist.lst
-  # Unzip the dist tar file.
-  DIST=`ls *.tar.gz`
-  tar -xf $DIST
-  cd ${DIST//.tar.gz}
-  # Check if every file exists in the dist tar file.
-  FILES_MISSING=""
-  for FILE in $(<../dist.lst); do
-    if ! file $FILE &>/dev/null; then
-      echo "$FILE is not found!"
-      FILES_MISSING="$FILE $FILES_MISSING"
-    fi
-  done
-  cd ..
-  if [ ! -z "$FILES_MISSING" ]; then
-    echo "Missing files in EXTRA_DIST: $FILES_MISSING"
-    exit 1
-  fi
-
-  # Do the regular dist-check for C++.
   make distcheck -j2
 }
 
@@ -93,22 +54,20 @@
   internal_build_cpp
   NUGET=/usr/local/bin/nuget.exe
 
-  # Perform "dotnet new" once to get the setup preprocessing out of the
-  # way. That spews a lot of output (including backspaces) into logs
-  # otherwise, and can cause problems. It doesn't matter if this step
-  # is performed multiple times; it's cheap after the first time anyway.
-  # (It also doesn't matter if it's unnecessary, which it will be on some
-  # systems. It's necessary on Jenkins in order to avoid unprintable
-  # characters appearing in the JUnit output.)
-  mkdir dotnettmp
-  (cd dotnettmp; dotnet new > /dev/null)
-  rm -rf dotnettmp
+  if [ "$TRAVIS" == "true" ]; then
+    # Install latest version of Mono
+    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
+    echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
+    echo "deb http://download.mono-project.com/repo/debian wheezy-libtiff-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list
+    sudo apt-get update -qq
+    sudo apt-get install -qq mono-devel referenceassemblies-pcl nunit
+    wget www.nuget.org/NuGet.exe -O nuget.exe
+    NUGET=../../nuget.exe
+  fi
 
+  (cd csharp/src; mono $NUGET restore)
   csharp/buildall.sh
   cd conformance && make test_csharp && cd ..
-
-  # Run csharp compatibility test between 3.0.0 and the current version.
-  csharp/compatibility_tests/v3.0.0/test.sh 3.0.0
 }
 
 build_golang() {
@@ -118,26 +77,27 @@
   export PATH="`pwd`/src:$PATH"
 
   # Install Go and the Go protobuf compiler plugin.
-  on_travis sudo apt-get update -qq
-  on_travis sudo apt-get install -qq golang
-
+  sudo apt-get update -qq
+  sudo apt-get install -qq golang
   export GOPATH="$HOME/gocode"
   mkdir -p "$GOPATH/src/github.com/google"
-  rm -f "$GOPATH/src/github.com/google/protobuf"
   ln -s "`pwd`" "$GOPATH/src/github.com/google/protobuf"
   export PATH="$GOPATH/bin:$PATH"
   go get github.com/golang/protobuf/protoc-gen-go
 
-  cd examples && PROTO_PATH="-I../src -I." make gotest && cd ..
+  cd examples && make gotest && cd ..
 }
 
 use_java() {
   version=$1
   case "$version" in
+    jdk6)
+      on_travis sudo apt-get install openjdk-6-jdk
+      export PATH=/usr/lib/jvm/java-6-openjdk-amd64/bin:$PATH
+      ;;
     jdk7)
       on_travis sudo apt-get install openjdk-7-jdk
       export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
       ;;
     oracle7)
       if [ "$TRAVIS" == "true" ]; then
@@ -148,7 +108,6 @@
         yes | sudo apt-get install oracle-java7-installer
       fi;
       export PATH=/usr/lib/jvm/java-7-oracle/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
       ;;
   esac
 
@@ -159,7 +118,6 @@
 
   which java
   java -version
-  $MVN -version
 }
 
 # --batch-mode supresses download progress output that spams the logs.
@@ -192,6 +150,10 @@
   cd javanano && $MVN test && cd ..
 }
 
+build_java_jdk6() {
+  use_java jdk6
+  build_java jdk6
+}
 build_java_jdk7() {
   use_java jdk7
   build_java_with_conformance_tests
@@ -200,15 +162,11 @@
   use_java oracle7
   build_java oracle7
 }
-build_java_compatibility() {
-  use_java jdk7
-  internal_build_cpp
-  # Use the unit-tests extraced from 2.5.0 to test the compatibilty between
-  # 3.0.0-beta-4 and the current version.
-  cd java/compatibility_tests/v2.5.0
-  ./test.sh 3.0.0-beta-4
-}
 
+build_javanano_jdk6() {
+  use_java jdk6
+  build_javanano
+}
 build_javanano_jdk7() {
   use_java jdk7
   build_javanano
@@ -233,43 +191,65 @@
     sudo apt-get install -y python-software-properties # for apt-add-repository
     sudo apt-add-repository -y ppa:fkrull/deadsnakes
     sudo apt-get update -qq
+    sudo apt-get install -y python2.6 python2.6-dev
     sudo apt-get install -y python3.3 python3.3-dev
     sudo apt-get install -y python3.4 python3.4-dev
-    sudo apt-get install -y python3.5 python3.5-dev
-    sudo apt-get install -y python3.6 python3.6-dev
   fi
 }
 
-build_objectivec_ios() {
+internal_objectivec_common () {
+  # Make sure xctool is up to date. Adapted from
+  #  http://docs.travis-ci.com/user/osx-ci-environment/
+  # We don't use a before_install because we test multiple OSes.
+  brew update
+  brew outdated xctool || brew upgrade xctool
   # Reused the build script that takes care of configuring and ensuring things
-  # are up to date.  The OS X test runs the objc conformance test, so skip it
-  # here.
-  # Note: travis has xctool installed, and we've looked at using it in the past
-  # but it has ended up proving unreliable (bugs), an they are removing build
-  # support in favor of xcbuild (or just xcodebuild).
+  # are up to date. Xcode and conformance tests will be directly invoked.
   objectivec/DevTools/full_mac_build.sh \
-      --core-only --skip-xcode-osx --skip-objc-conformance "$@"
+      --core-only --skip-xcode --skip-objc-conformance
 }
 
-build_objectivec_ios_debug() {
-  build_objectivec_ios --skip-xcode-release
+internal_xctool_debug_and_release() {
+  # Always use -reporter plain to avoid escape codes in output (makes travis
+  # logs easier to read).
+  xctool -reporter plain -configuration Debug "$@"
+  xctool -reporter plain -configuration Release "$@"
 }
 
-build_objectivec_ios_release() {
-  build_objectivec_ios --skip-xcode-debug
+build_objectivec_ios() {
+  internal_objectivec_common
+  # https://github.com/facebook/xctool/issues/509 - unlike xcodebuild, xctool
+  # doesn't support >1 destination, so we have to build first and then run the
+  # tests one destination at a time.
+  internal_xctool_debug_and_release \
+    -project objectivec/ProtocolBuffers_iOS.xcodeproj \
+    -scheme ProtocolBuffers \
+    -sdk iphonesimulator \
+    build-tests
+  IOS_DESTINATIONS=(
+    "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
+    "platform=iOS Simulator,name=iPhone 6,OS=9.2" # 64bit
+    "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
+    "platform=iOS Simulator,name=iPad Air,OS=9.2" # 64bit
+  )
+  for i in "${IOS_DESTINATIONS[@]}" ; do
+    internal_xctool_debug_and_release \
+      -project objectivec/ProtocolBuffers_iOS.xcodeproj \
+      -scheme ProtocolBuffers \
+      -sdk iphonesimulator \
+      -destination "${i}" \
+      run-tests
+  done
 }
 
 build_objectivec_osx() {
-  # Reused the build script that takes care of configuring and ensuring things
-  # are up to date.
-  objectivec/DevTools/full_mac_build.sh \
-      --core-only --skip-xcode-ios
-}
-
-build_objectivec_cocoapods_integration() {
-  # Update pod to the latest version.
-  gem install cocoapods --no-ri --no-rdoc
-  objectivec/Tests/CocoaPods/run_tests.sh
+  internal_objectivec_common
+  internal_xctool_debug_and_release \
+    -project objectivec/ProtocolBuffers_OSX.xcodeproj \
+    -scheme ProtocolBuffers \
+    -destination "platform=OS X,arch=x86_64" \
+    test
+  cd conformance && make test_objc && cd ..
 }
 
 build_python() {
@@ -278,7 +258,7 @@
   cd python
   # Only test Python 2.6/3.x on Linux
   if [ $(uname -s) == "Linux" ]; then
-    envlist=py\{27,33,34,35,36\}-python
+    envlist=py\{26,27,33,34\}-python
   else
     envlist=py27-python
   fi
@@ -292,9 +272,10 @@
   export LD_LIBRARY_PATH=../src/.libs # for Linux
   export DYLD_LIBRARY_PATH=../src/.libs # for OS X
   cd python
-  # Only test Python 3.x on Linux
+  # Only test Python 2.6/3.x on Linux
   if [ $(uname -s) == "Linux" ]; then
-    envlist=py\{27,33,34,35,36\}-cpp
+    # py26 is currently disabled due to json_format
+    envlist=py\{27,33,34\}-cpp
   else
     envlist=py27-cpp
   fi
@@ -302,16 +283,14 @@
   cd ..
 }
 
-build_python_compatibility() {
-  internal_build_cpp
-  # Use the unit-tests extraced from 2.5.0 to test the compatibilty.
-  cd python/compatibility_tests/v2.5.0
-  # Test between 2.5.0 and the current version.
-  ./test.sh 2.5.0
-  # Test between 3.0.0-beta-1 and the current version.
-  ./test.sh 3.0.0-beta-1
+build_ruby19() {
+  internal_build_cpp  # For conformance tests.
+  cd ruby && bash travis-test.sh ruby-1.9 && cd ..
 }
-
+build_ruby20() {
+  internal_build_cpp  # For conformance tests.
+  cd ruby && bash travis-test.sh ruby-2.0 && cd ..
+}
 build_ruby21() {
   internal_build_cpp  # For conformance tests.
   cd ruby && bash travis-test.sh ruby-2.1 && cd ..
@@ -322,293 +301,12 @@
 }
 build_jruby() {
   internal_build_cpp  # For conformance tests.
-  # TODO(xiaofeng): Upgrade to jruby-9.x. There are some broken jests to be
-  # fixed.
-  cd ruby && bash travis-test.sh jruby-1.7 && cd ..
-}
-build_ruby_all() {
-  build_ruby21
-  build_ruby22
-  # TODO(teboring): Disable jruby test temperarily for it randomly fails.
-  # https://grpc-testing.appspot.com/job/protobuf_pull_request/735/consoleFull.
-  # build_jruby
+  cd ruby && bash travis-test.sh jruby && cd ..
 }
 
 build_javascript() {
   internal_build_cpp
   cd js && npm install && npm test && cd ..
-  cd conformance && make test_nodejs && cd ..
-}
-
-generate_php_test_proto() {
-  internal_build_cpp
-  pushd php/tests
-  # Generate test file
-  rm -rf generated
-  mkdir generated
-  ../../src/protoc --php_out=generated         \
-    proto/test.proto                           \
-    proto/test_include.proto                   \
-    proto/test_no_namespace.proto              \
-    proto/test_prefix.proto                    \
-    proto/test_php_namespace.proto             \
-    proto/test_empty_php_namespace.proto       \
-    proto/test_reserved_enum_lower.proto       \
-    proto/test_reserved_enum_upper.proto       \
-    proto/test_reserved_enum_value_lower.proto \
-    proto/test_reserved_enum_value_upper.proto \
-    proto/test_reserved_message_lower.proto    \
-    proto/test_reserved_message_upper.proto    \
-    proto/test_service.proto                   \
-    proto/test_service_namespace.proto         \
-    proto/test_descriptors.proto
-  pushd ../../src
-  ./protoc --php_out=../php/tests/generated -I../php/tests -I. \
-    ../php/tests/proto/test_import_descriptor_proto.proto
-  popd
-  popd
-}
-
-use_php() {
-  VERSION=$1
-  PHP=`which php`
-  PHP_CONFIG=`which php-config`
-  PHPIZE=`which phpize`
-  ln -sfn "/usr/local/php-${VERSION}/bin/php" $PHP
-  ln -sfn "/usr/local/php-${VERSION}/bin/php-config" $PHP_CONFIG
-  ln -sfn "/usr/local/php-${VERSION}/bin/phpize" $PHPIZE
-  generate_php_test_proto
-}
-
-use_php_zts() {
-  VERSION=$1
-  PHP=`which php`
-  PHP_CONFIG=`which php-config`
-  PHPIZE=`which phpize`
-  ln -sfn "/usr/local/php-${VERSION}-zts/bin/php" $PHP
-  ln -sfn "/usr/local/php-${VERSION}-zts/bin/php-config" $PHP_CONFIG
-  ln -sfn "/usr/local/php-${VERSION}-zts/bin/phpize" $PHPIZE
-  generate_php_test_proto
-}
-
-use_php_bc() {
-  VERSION=$1
-  PHP=`which php`
-  PHP_CONFIG=`which php-config`
-  PHPIZE=`which phpize`
-  ln -sfn "/usr/local/php-${VERSION}-bc/bin/php" $PHP
-  ln -sfn "/usr/local/php-${VERSION}-bc/bin/php-config" $PHP_CONFIG
-  ln -sfn "/usr/local/php-${VERSION}-bc/bin/phpize" $PHPIZE
-  generate_php_test_proto
-}
-
-build_php5.5() {
-  use_php 5.5
-
-  pushd php
-  rm -rf vendor
-  cp -r /usr/local/vendor-5.5 vendor
-  wget https://phar.phpunit.de/phpunit-4.8.0.phar -O /usr/bin/phpunit
-  phpunit
-  popd
-  pushd conformance
-  make test_php
-  popd
-}
-
-build_php5.5_c() {
-  use_php 5.5
-  wget https://phar.phpunit.de/phpunit-4.8.0.phar -O /usr/bin/phpunit
-  pushd php/tests
-  /bin/bash ./test.sh 5.5
-  popd
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_c
-  # popd
-}
-
-build_php5.5_zts_c() {
-  use_php_zts 5.5
-  wget https://phar.phpunit.de/phpunit-4.8.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 5.5-zts && cd ../..
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_zts_c
-  # popd
-}
-
-build_php5.6() {
-  use_php 5.6
-  pushd php
-  rm -rf vendor
-  cp -r /usr/local/vendor-5.6 vendor
-  wget https://phar.phpunit.de/phpunit-5.7.0.phar -O /usr/bin/phpunit
-  phpunit
-  popd
-  pushd conformance
-  make test_php
-  popd
-}
-
-build_php5.6_c() {
-  use_php 5.6
-  wget https://phar.phpunit.de/phpunit-5.7.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 5.6 && cd ../..
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_c
-  # popd
-}
-
-build_php5.6_zts_c() {
-  use_php_zts 5.6
-  wget https://phar.phpunit.de/phpunit-5.7.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 5.6-zts && cd ../..
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_zts_c
-  # popd
-}
-
-build_php5.6_mac() {
-  generate_php_test_proto
-  # Install PHP
-  curl -s https://php-osx.liip.ch/install.sh | bash -s 5.6
-  PHP_FOLDER=`find /usr/local -type d -name "php5-5.6*"`  # The folder name may change upon time
-  export PATH="$PHP_FOLDER/bin:$PATH"
-
-  # Install phpunit
-  curl https://phar.phpunit.de/phpunit-5.6.10.phar -L -o phpunit.phar
-  chmod +x phpunit.phar
-  sudo mv phpunit.phar /usr/local/bin/phpunit
-
-  # Install valgrind
-  echo "#! /bin/bash" > valgrind
-  chmod ug+x valgrind
-  sudo mv valgrind /usr/local/bin/valgrind
-
-  # Test
-  cd php/tests && /bin/bash ./test.sh && cd ../..
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_c
-  # popd
-}
-
-build_php7.0() {
-  use_php 7.0
-  pushd php
-  rm -rf vendor
-  cp -r /usr/local/vendor-7.0 vendor
-  wget https://phar.phpunit.de/phpunit-5.6.0.phar -O /usr/bin/phpunit
-  phpunit
-  popd
-  pushd conformance
-  make test_php
-  popd
-}
-
-build_php7.0_c() {
-  use_php 7.0
-  wget https://phar.phpunit.de/phpunit-5.6.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 7.0 && cd ../..
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_c
-  # popd
-}
-
-build_php7.0_zts_c() {
-  use_php_zts 7.0
-  wget https://phar.phpunit.de/phpunit-5.6.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 7.0-zts && cd ../..
-  # TODO(teboring): Add it back.
-  # pushd conformance
-  # make test_php_zts_c
-  # popd
-}
-
-build_php7.0_mac() {
-  generate_php_test_proto
-  # Install PHP
-  curl -s https://php-osx.liip.ch/install.sh | bash -s 7.0
-  PHP_FOLDER=`find /usr/local -type d -name "php7-7.0*"`  # The folder name may change upon time
-  export PATH="$PHP_FOLDER/bin:$PATH"
-
-  # Install phpunit
-  curl https://phar.phpunit.de/phpunit-5.6.0.phar -L -o phpunit.phar
-  chmod +x phpunit.phar
-  sudo mv phpunit.phar /usr/local/bin/phpunit
-
-  # Install valgrind
-  echo "#! /bin/bash" > valgrind
-  chmod ug+x valgrind
-  sudo mv valgrind /usr/local/bin/valgrind
-
-  # Test
-  cd php/tests && /bin/bash ./test.sh && cd ../..
-  # TODO(teboring): Add it back
-  # pushd conformance
-  # make test_php_c
-  # popd
-}
-
-build_php_compatibility() {
-  internal_build_cpp
-  php/tests/compatibility_test.sh
-}
-
-build_php7.1() {
-  use_php 7.1
-  pushd php
-  rm -rf vendor
-  cp -r /usr/local/vendor-7.1 vendor
-  wget https://phar.phpunit.de/phpunit-5.6.0.phar -O /usr/bin/phpunit
-  phpunit
-  popd
-  pushd conformance
-  # TODO(teboring): Add it back
-  # make test_php
-  popd
-}
-
-build_php7.1_c() {
-  use_php 7.1
-  wget https://phar.phpunit.de/phpunit-5.6.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 7.1 && cd ../..
-  pushd conformance
-  # make test_php_c
-  popd
-}
-
-build_php7.1_zts_c() {
-  use_php_zts 7.1
-  wget https://phar.phpunit.de/phpunit-5.6.0.phar -O /usr/bin/phpunit
-  cd php/tests && /bin/bash ./test.sh 7.1-zts && cd ../..
-  pushd conformance
-  # make test_php_c
-  popd
-}
-
-build_php_all_32() {
-  build_php5.5
-  build_php5.6
-  build_php7.0
-  build_php7.1
-  build_php5.5_c
-  build_php5.6_c
-  build_php7.0_c
-  build_php7.1_c
-  build_php5.5_zts_c
-  build_php5.6_zts_c
-  build_php7.0_zts_c
-  build_php7.1_zts_c
-}
-
-build_php_all() {
-  build_php_all_32
-  build_php_compatibility
 }
 
 # Note: travis currently does not support testing more than one language so the
@@ -624,35 +322,22 @@
 if [ "$#" -ne 1 ]; then
   echo "
 Usage: $0 { cpp |
-            cpp_distcheck |
             csharp |
+            java_jdk6 |
             java_jdk7 |
             java_oracle7 |
-            java_compatibility |
+            javanano_jdk6 |
             javanano_jdk7 |
             javanano_oracle7 |
             objectivec_ios |
-            objectivec_ios_debug |
-            objectivec_ios_release |
             objectivec_osx |
-            objectivec_cocoapods_integration |
             python |
             python_cpp |
-            python_compatibility |
+            ruby19 |
+            ruby20 |
             ruby21 |
             ruby22 |
-            jruby |
-            ruby_all |
-            php5.5   |
-            php5.5_c |
-            php5.6   |
-            php5.6_c |
-            php7.0   |
-            php7.0_c |
-            php_compatibility |
-            php7.1   |
-            php7.1_c |
-            php_all)
+            jruby }
 "
   exit 1
 fi
diff --git a/third_party/benchmark b/third_party/benchmark
deleted file mode 160000
index 360e66c..0000000
--- a/third_party/benchmark
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 360e66c1c4777c99402cf8cd535aa510fee16573
diff --git a/update_file_lists.sh b/update_file_lists.sh
index 9c0fbdc..d76a161 100755
--- a/update_file_lists.sh
+++ b/update_file_lists.sh
@@ -135,7 +135,7 @@
 done | sort | uniq | sed "s/^/mkdir include\\\\/" >> $EXTRACT_INCLUDES_BAT
 for HEADER in $PUBLIC_HEADERS; do
   WINPATH=$(echo $HEADER | sed 's;/;\\;g')
-  echo "copy \"\${PROTOBUF_SOURCE_WIN32_PATH}\\..\\src\\$WINPATH\" include\\$WINPATH" >> $EXTRACT_INCLUDES_BAT
+  echo "copy \${PROTOBUF_SOURCE_WIN32_PATH}\\..\\src\\$WINPATH include\\$WINPATH" >> $EXTRACT_INCLUDES_BAT
 done
 
 ################################################################################